- Merged rev 5222-5223 from trunk.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@5224 dfc29bdd-3216-0410-991c-e03cc46cb475
master
nadro 2015-12-17 19:48:24 +00:00
parent 0200408475
commit bf3273cb5f
22 changed files with 69 additions and 51 deletions

View File

@ -175,7 +175,7 @@ int main()
// draw scene into render target
// set render target texture
driver->setRenderTarget(renderTarget, video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0,0,0,255));
driver->setRenderTargetEx(renderTarget, video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0,0,0,255));
// make cube invisible and set fixed camera as active camera
test->setVisible(false);
@ -186,7 +186,7 @@ int main()
// set back old render target
// The buffer might have been distorted, so clear it
driver->setRenderTarget((video::IRenderTarget*)0, 0, video::SColor(0));
driver->setRenderTargetEx(0, 0, video::SColor(0));
// make the cube visible and set the user controlled camera as active one
test->setVisible(true);

View File

@ -25,6 +25,18 @@ namespace video
{
}
//! Returns an array of previously set textures.
const core::array<ITexture*>& getTexture() const
{
return Texture;
}
//! Returns a of previously set depth / depth-stencil texture.
ITexture* getDepthStencil() const
{
return DepthStencil;
}
//! Set multiple textures.
/** Set multiple textures for the render target.
\param texture Array of texture objects. These textures are used for a color outputs.

View File

@ -576,14 +576,15 @@ namespace video
geometry with a render target as texture on it when you are rendering
the scene into this render target at the same time. It is usually only
possible to render into a texture between the
IVideoDriver::beginScene() and endScene() method calls.
IVideoDriver::beginScene() and endScene() method calls. If you need the
best performance use this method instead of setRenderTarget.
\param target Render target object.
\param clearFlag A combination of the E_CLEAR_BUFFER_FLAG bit-flags.
\param clearColor The clear color for the color buffer.
\param clearDepth The clear value for the depth buffer.
\param clearStencil The clear value for the stencil buffer.
\return True if sucessful and false if not. */
virtual bool setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
f32 clearDepth = 1.f, u8 clearStencil = 0) = 0;
//! Sets a new render target.

View File

@ -764,7 +764,7 @@ void CD3D9Driver::setTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag,
CNullDriver::setTextureCreationFlag(flag, enabled);
}
bool CD3D9Driver::setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
bool CD3D9Driver::setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
{
if (target && target->getDriverType() != EDT_DIRECT3D9)
{

View File

@ -58,7 +58,7 @@ namespace video
//! sets a material
virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_;
virtual bool setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
f32 clearDepth = 1.f, u8 clearStencil = 0) _IRR_OVERRIDE_;
//! sets a viewport

View File

@ -682,7 +682,7 @@ ITexture* CNullDriver::createDeviceDependentTextureCubemap(const io::path& name,
return new SDummyTexture(name, ETT_CUBEMAP);
}
bool CNullDriver::setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
bool CNullDriver::setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
{
return false;
}
@ -717,11 +717,11 @@ bool CNullDriver::setRenderTarget(ITexture* texture, u16 clearFlag, SColor clear
SharedRenderTarget->setTexture(texture, depthTexture);
return setRenderTarget(SharedRenderTarget, clearFlag, clearColor, clearDepth, clearStencil);
return setRenderTargetEx(SharedRenderTarget, clearFlag, clearColor, clearDepth, clearStencil);
}
else
{
return setRenderTarget((IRenderTarget*)0, clearFlag, clearColor, clearDepth, clearStencil);
return setRenderTargetEx(0, clearFlag, clearColor, clearDepth, clearStencil);
}
}

View File

@ -102,7 +102,7 @@ namespace video
virtual ITexture* addTextureCubemap(const io::path& name, IImage* imagePosX, IImage* imageNegX, IImage* imagePosY,
IImage* imageNegY, IImage* imagePosZ, IImage* imageNegZ) _IRR_OVERRIDE_;
virtual bool setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
f32 clearDepth = 1.f, u8 clearStencil = 0) _IRR_OVERRIDE_;
virtual bool setRenderTarget(ITexture* texture, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),

View File

@ -2382,7 +2382,7 @@ COGLES2Driver::~COGLES2Driver()
return 65535;
}
bool COGLES2Driver::setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
bool COGLES2Driver::setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
{
if (target && target->getDriverType() != EDT_OGLES2)
{

View File

@ -268,7 +268,7 @@ namespace video
virtual ITexture* addRenderTargetTexture(const core::dimension2d<u32>& size,
const io::path& name, const ECOLOR_FORMAT format = ECF_UNKNOWN) _IRR_OVERRIDE_;
virtual bool setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255, 0, 0, 0),
virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255, 0, 0, 0),
f32 clearDepth = 1.f, u8 clearStencil = 0) _IRR_OVERRIDE_;
virtual void clearBuffers(u16 flag, SColor color = SColor(255, 0, 0, 0), f32 depth = 1.f, u8 stencil = 0) _IRR_OVERRIDE_;

View File

@ -2698,7 +2698,7 @@ ITexture* COGLES1Driver::addRenderTargetTexture(const core::dimension2d<u32>& si
destSize = destSize.getOptimalSize((size == size.getOptimalSize()), false, false);
}
COGLES1Texture* renderTargetTexture = new COGLES1Texture(name, size, format, this);
COGLES1Texture* renderTargetTexture = new COGLES1Texture(name, destSize, format, this);
addTexture(renderTargetTexture);
renderTargetTexture->drop();
@ -2715,7 +2715,7 @@ u32 COGLES1Driver::getMaximalPrimitiveCount() const
return 65535;
}
bool COGLES1Driver::setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
bool COGLES1Driver::setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
{
if (target && target->getDriverType() != EDT_OGLES1)
{

View File

@ -255,7 +255,7 @@ namespace video
virtual ITexture* addRenderTargetTexture(const core::dimension2d<u32>& size,
const io::path& name, const ECOLOR_FORMAT format = ECF_UNKNOWN) _IRR_OVERRIDE_;
virtual bool setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255, 0, 0, 0),
virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255, 0, 0, 0),
f32 clearDepth = 1.f, u8 clearStencil = 0) _IRR_OVERRIDE_;
virtual void clearBuffers(u16 flag, SColor color = SColor(255, 0, 0, 0), f32 depth = 1.f, u8 stencil = 0) _IRR_OVERRIDE_;

View File

@ -3650,11 +3650,7 @@ ITexture* COpenGLDriver::addRenderTargetTexture(const core::dimension2d<u32>& si
bool generateMipLevels = getTextureCreationFlag(ETCF_CREATE_MIP_MAPS);
setTextureCreationFlag(ETCF_CREATE_MIP_MAPS, false);
bool supportForFBO = false;
#if defined(GL_VERSION_3_0) || defined(GL_ARB_framebuffer_object) || defined(GL_EXT_framebuffer_object)
supportForFBO = FeatureAvailable[IRR_EXT_framebuffer_object] || FeatureAvailable[IRR_ARB_framebuffer_object];
#endif
bool supportForFBO = (Feature.ColorAttachment > 0);
core::dimension2du destSize(size);
@ -3664,7 +3660,7 @@ ITexture* COpenGLDriver::addRenderTargetTexture(const core::dimension2d<u32>& si
destSize = destSize.getOptimalSize((size == size.getOptimalSize()), false, false);
}
COpenGLTexture* renderTargetTexture = new COpenGLTexture(name, size, format, this);
COpenGLTexture* renderTargetTexture = new COpenGLTexture(name, destSize, format, this);
addTexture(renderTargetTexture);
renderTargetTexture->drop();
@ -3683,7 +3679,7 @@ u32 COpenGLDriver::getMaximalPrimitiveCount() const
return 0x7fffffff;
}
bool COpenGLDriver::setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
bool COpenGLDriver::setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
{
if (target && target->getDriverType() != EDT_OPENGL)
{
@ -4096,14 +4092,23 @@ void COpenGLDriver::getColorFormatParameters(ECOLOR_FORMAT format, GLint& intern
case ECF_D16:
internalFormat = GL_DEPTH_COMPONENT16;
pixelFormat = GL_DEPTH_COMPONENT;
pixelType = GL_UNSIGNED_BYTE;
pixelType = GL_UNSIGNED_SHORT;
break;
case ECF_D32:
internalFormat = GL_DEPTH_COMPONENT32;
pixelFormat = GL_DEPTH_COMPONENT;
pixelType = GL_UNSIGNED_BYTE;
pixelType = GL_UNSIGNED_INT;
break;
case ECF_D24S8:
#ifdef GL_VERSION_3_0
if (Version >= 300)
{
internalFormat = GL_DEPTH_STENCIL;
pixelFormat = GL_DEPTH_STENCIL;
pixelType = GL_UNSIGNED_INT_24_8;
}
else
#endif
#ifdef GL_EXT_packed_depth_stencil
if (queryOpenGLFeature(COpenGLExtensionHandler::IRR_EXT_packed_depth_stencil))
{

View File

@ -336,7 +336,7 @@ namespace video
virtual ITexture* addRenderTargetTexture(const core::dimension2d<u32>& size,
const io::path& name, const ECOLOR_FORMAT format = ECF_UNKNOWN) _IRR_OVERRIDE_;
virtual bool setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
f32 clearDepth = 1.f, u8 clearStencil = 0) _IRR_OVERRIDE_;
virtual void clearBuffers(u16 flag, SColor color = SColor(255,0,0,0), f32 depth = 1.f, u8 stencil = 0) _IRR_OVERRIDE_;

View File

@ -252,7 +252,7 @@ ITexture* CSoftwareDriver::createDeviceDependentTexture(const io::path& name, II
return texture;
}
bool CSoftwareDriver::setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
bool CSoftwareDriver::setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
{
if (target && target->getDriverType() != EDT_SOFTWARE)
{

View File

@ -36,7 +36,7 @@ namespace video
//! sets a material
virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_;
virtual bool setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
f32 clearDepth = 1.f, u8 clearStencil = 0) _IRR_OVERRIDE_;
//! sets a viewport

View File

@ -409,7 +409,7 @@ bool CBurningVideoDriver::endScene()
return Presenter->present(BackBuffer, WindowId, SceneSourceRect);
}
bool CBurningVideoDriver::setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
bool CBurningVideoDriver::setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil)
{
if (target && target->getDriverType() != EDT_BURNINGSVIDEO)
{

View File

@ -39,7 +39,7 @@ namespace video
//! sets a material
virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_;
virtual bool setRenderTarget(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
f32 clearDepth = 1.f, u8 clearStencil = 0) _IRR_OVERRIDE_;
//! sets a viewport

View File

@ -41,9 +41,9 @@ bool testWithRenderTarget(video::E_DRIVER_TYPE driverType)
//draw the 256x256 water image on the rendertarget:
driver->setRenderTarget(renderTarget,video::ECBF_COLOR|video::ECBF_DEPTH,video::SColor(255,0,0,255));//Rendertarget background is blue
driver->setRenderTargetEx(renderTarget,video::ECBF_COLOR|video::ECBF_DEPTH,video::SColor(255,0,0,255));//Rendertarget background is blue
driver->draw2DImage(tex, core::position2d<s32>(0,0), core::recti(0,0,32,32));
driver->setRenderTarget((video::IRenderTarget*)0, 0);
driver->setRenderTargetEx(0, 0);
//draw the rendertarget on screen:
//this should normally draw a 64x64 image containing a 32x32 image in the top left corner
@ -165,9 +165,9 @@ bool testExactPlacement(video::E_DRIVER_TYPE driverType)
video::ITexture* tex=driver->getTexture("../media/fireball.bmp");
driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,40,40,255));//Backbuffer background is blue
driver->setRenderTarget(renderTarget, 0, video::ECBF_COLOR | video::ECBF_DEPTH);
driver->setRenderTargetEx(renderTarget, 0, video::ECBF_COLOR | video::ECBF_DEPTH);
driver->draw2DImage(tex, core::recti(0,0,32,32), core::recti(0,0,64,64));
driver->setRenderTarget((video::IRenderTarget*)0, 0, 0);
driver->setRenderTargetEx(0, 0, 0);
driver->endScene();
video::IImage* img = driver->createImage(renderTargetTex, core::vector2di(), renderTargetTex->getSize());

View File

@ -64,9 +64,9 @@ static bool testWithDriver(video::E_DRIVER_TYPE driverType)
driver->beginScene(video::ECBF_COLOR, video::SColor(255, 0, 0, 0));
// render
driver->setRenderTarget(renderTarget, video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,0,0,0));
driver->setRenderTargetEx(renderTarget, video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,0,0,0));
device->getSceneManager()->drawAll();
driver->setRenderTarget((video::IRenderTarget*)0, 0, video::SColor(255, 0, 0, 0));
driver->setRenderTargetEx(0, 0, video::SColor(255, 0, 0, 0));
// draw debug rt
driver->draw2DImage(renderTargetTex[0], core::position2d<s32>(0,0));
@ -80,9 +80,9 @@ static bool testWithDriver(video::E_DRIVER_TYPE driverType)
driver->beginScene(video::ECBF_COLOR, video::SColor(255, 0, 0, 0));
// render
device->getSceneManager()->getActiveCamera()->setPosition(core::vector3df(0,0,-15));
driver->setRenderTarget(renderTarget, video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,0,0,0));
driver->setRenderTargetEx(renderTarget, video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,0,0,0));
device->getSceneManager()->drawAll();
driver->setRenderTarget((video::IRenderTarget*)0, 0, video::SColor(255,0,0,0));
driver->setRenderTargetEx(0, 0, video::SColor(255,0,0,0));
// draw debug rt
driver->draw2DImage(renderTargetTex[0], core::position2d<s32>(0,0));

View File

@ -190,9 +190,9 @@ bool rttAndZBuffer(video::E_DRIVER_TYPE driverType)
{
vd->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255, 0, 0, 0));
vd->setRenderTarget(renderTarget, 0, video::ECBF_COLOR | video::ECBF_DEPTH);
vd->setRenderTargetEx(renderTarget, 0, video::ECBF_COLOR | video::ECBF_DEPTH);
sm->drawAll();
vd->setRenderTarget((video::IRenderTarget*)0, 0, 0);
vd->setRenderTargetEx(0, 0, 0);
vd->setTransform(video::ETS_WORLD, core::IdentityMatrix);
vd->setTransform(video::ETS_VIEW, core::IdentityMatrix);
vd->setTransform(video::ETS_PROJECTION, core::IdentityMatrix);
@ -242,10 +242,10 @@ bool rttAndText(video::E_DRIVER_TYPE driverType)
stabilizeScreenBackground(driver);
driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,255, 255, 255));
driver->setRenderTarget(renderTarget, video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,255,0,255));
driver->setRenderTargetEx(renderTarget, video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,255,0,255));
driver->draw2DImage(driver->getTexture("../media/fireball.bmp"), core::recti(0, 0, renderTargetTex->getSize().Width, renderTargetTex->getSize().Height), core::recti(0, 0, 64, 64));
guienv->getBuiltInFont()->draw(L"OMGGG =!", core::rect<s32>(120, 100, 256, 256), video::SColor(255, 0, 0, 255));
driver->setRenderTarget((video::IRenderTarget*)0, 0, 0);
driver->setRenderTargetEx(0, 0, 0);
driver->endScene();
scene::ISceneManager* smgr = device->getSceneManager();
@ -286,7 +286,7 @@ static void Render(IrrlichtDevice* device, video::IRenderTarget* rt, core::vecto
core::vector3df& pos2, scene::IAnimatedMesh* sphereMesh, core::vector3df& pos3, core::vector3df& pos4)
{
video::IVideoDriver* driver = device->getVideoDriver();
driver->setRenderTarget(rt, 0, video::ECBF_COLOR | video::ECBF_DEPTH);
driver->setRenderTargetEx(rt, 0, video::ECBF_COLOR | video::ECBF_DEPTH);
device->getSceneManager()->drawAll();
video::SMaterial mat;
@ -398,7 +398,7 @@ bool rttAndAntiAliasing(video::E_DRIVER_TYPE driverType)
Render(device, renderTarget3, pos1, pos2, sphereMesh, pos3, pos4);
Render(device, renderTarget4, pos1, pos2, sphereMesh, pos3, pos4);
device->getVideoDriver()->setRenderTarget((video::IRenderTarget*)0, 0, 0);
device->getVideoDriver()->setRenderTargetEx(0, 0, 0);
device->getVideoDriver()->draw2DImage(renderTargetTex1, core::position2di(0, 0));
device->getVideoDriver()->draw2DImage(renderTargetTex2, core::position2di(80, 0));
device->getVideoDriver()->draw2DImage(renderTargetTex3, core::position2di(0, 60));

View File

@ -280,8 +280,8 @@ static float fuzzyCompareImages(irr::video::IImage * image1,
return 0.f;
}
u8 * image1Data = (u8*)image1->lock();
u8 * image2Data = (u8*)image2->lock();
u8 * image1Data = (u8*)image1->getData();
u8 * image2Data = (u8*)image2->getData();
const u32 pixels = (image1->getPitch() * image1->getDimension().Height) / 4;
u32 mismatchedColours = 0;
@ -304,9 +304,6 @@ static float fuzzyCompareImages(irr::video::IImage * image1,
mismatchedColours += abs(r1 - r2) + abs(g1 - g2) + abs(b1 - b2);
}
image1->unlock();
image2->unlock();
const u32 totalColours = pixels * 255*3;
return 100.f * (totalColours - mismatchedColours) / totalColours;
}
@ -358,7 +355,7 @@ void stabilizeScreenBackground(irr::video::IVideoDriver * driver,
screenshot = fixedScreenshot;
}
u8 * image1Data = (u8*)screenshot->lock();
u8 * image1Data = (u8*)screenshot->getData();
const u32 pixels = (screenshot->getPitch() * screenshot->getDimension().Height) / 4;
bool status = true;

View File

@ -53,7 +53,8 @@ bool renderMipLevels(video::E_DRIVER_TYPE driverType)
}
}
video::ITexture* tex = driver->addTexture("miptest", image, mipdata);
image->setMipMapsData(mipdata, false, true);
video::ITexture* tex = driver->addTexture("miptest", image);
if (!tex)
// is probably an error in the mipdata handling
return false;
@ -131,7 +132,9 @@ bool lockAllMipLevels(video::E_DRIVER_TYPE driverType)
}
}
video::ITexture* tex = driver->addTexture("miptest", image, mipdata);
image->setMipMapsData(mipdata, false, true);
video::ITexture* tex = driver->addTexture("miptest", image);
if (!tex)
// is probably an error in the mipdata handling
return false;