Commit b23954eb authored by nadro's avatar nadro

- Fixed issue with simplified IVideoDriver::setRenderTarget method.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@5074 dfc29bdd-3216-0410-991c-e03cc46cb475
parent a0e403fc
......@@ -543,7 +543,7 @@ namespace video
\param clearStencilBuffer Clears the stencil buffer of the rendertarget.
\param clearColor The clear color for the render target.
\return True if sucessful and false if not. */
virtual bool setRenderTarget(IRenderTarget* target, core::array<u32> activeTextureID, bool clearBackBuffer,
virtual bool setRenderTarget(IRenderTarget* target, const core::array<u32>& activeTextureID, bool clearBackBuffer,
bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor = video::SColor(255,0,0,0)) = 0;
//! Set a render target.
......
......@@ -33,7 +33,7 @@ public:
//! Constructs an array and allocates an initial chunk of memory.
/** \param start_count Amount of elements to pre-allocate. */
array(u32 start_count) : data(0), allocated(0), used(0),
explicit array(u32 start_count) : data(0), allocated(0), used(0),
strategy(ALLOC_STRATEGY_DOUBLE),
free_when_destroyed(true), is_sorted(true)
{
......
......@@ -764,7 +764,7 @@ void CD3D9Driver::setTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag,
//! set a render target
bool CD3D9Driver::setRenderTarget(IRenderTarget* target, core::array<u32> activeTextureID, bool clearBackBuffer,
bool CD3D9Driver::setRenderTarget(IRenderTarget* target, const core::array<u32>& activeTextureID, bool clearBackBuffer,
bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor)
{
if (target && target->getDriverType() != EDT_DIRECT3D9)
......
......@@ -63,7 +63,7 @@ namespace video
virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_;
//! set a render target
virtual bool setRenderTarget(IRenderTarget* target, core::array<u32> activeTextureID, bool clearBackBuffer,
virtual bool setRenderTarget(IRenderTarget* target, const core::array<u32>& activeTextureID, bool clearBackBuffer,
bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor) _IRR_OVERRIDE_;
//! sets a viewport
......
......@@ -83,7 +83,7 @@ IImageWriter* createImageWriterPPM();
//! constructor
CNullDriver::CNullDriver(io::IFileSystem* io, const core::dimension2d<u32>& screenSize)
: TextureRenderTarget(0), CurrentRenderTarget(0), CurrentRenderTargetSize(0, 0), FileSystem(io), MeshManipulator(0),
: SharedRenderTarget(0), CurrentRenderTarget(0), CurrentRenderTargetSize(0, 0), FileSystem(io), MeshManipulator(0),
ViewPort(0, 0, 0, 0), ScreenSize(screenSize), PrimitivesDrawn(0), MinVertexCountForVBO(500),
TextureCreationFlags(0), OverrideMaterial2DEnabled(false), AllowZWriteOnTransparent(false)
{
......@@ -213,9 +213,6 @@ CNullDriver::~CNullDriver()
if (MeshManipulator)
MeshManipulator->drop();
if (TextureRenderTarget)
TextureRenderTarget->drop();
removeAllRenderTargets();
deleteAllTextures();
......@@ -296,10 +293,19 @@ void CNullDriver::deleteAllTextures()
// last set material member. Could be optimized to reduce state changes.
setMaterial(SMaterial());
// reset render targets.
for (u32 i=0; i<RenderTargets.size(); ++i)
RenderTargets[i]->setTexture(0, 0);
// remove textures.
for (u32 i=0; i<Textures.size(); ++i)
Textures[i].Surface->drop();
Textures.clear();
SharedDepthTextures.clear();
}
......@@ -621,7 +627,7 @@ ITexture* CNullDriver::createDeviceDependentTexture(IImage* surface, const io::p
//! set a render target
bool CNullDriver::setRenderTarget(IRenderTarget* target, core::array<u32> activeTextureID, bool clearBackBuffer,
bool CNullDriver::setRenderTarget(IRenderTarget* target, const core::array<u32>& activeTextureID, bool clearBackBuffer,
bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor)
{
return false;
......@@ -631,19 +637,37 @@ bool CNullDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuffer
{
if (texture)
{
if (!TextureRenderTarget)
// create render target if require.
if (!SharedRenderTarget)
SharedRenderTarget = addRenderTarget();
ITexture* depthTexture = 0;
// try to find available depth texture with require size.
for (u32 i = 0; i < SharedDepthTextures.size(); ++i)
{
// (there's no createRenderTarget)
TextureRenderTarget = addRenderTarget();
TextureRenderTarget->grab();
removeRenderTarget(TextureRenderTarget);
if (SharedDepthTextures[i]->getSize() == texture->getSize())
{
depthTexture = SharedDepthTextures[i];
break;
}
}
return setRenderTarget(TextureRenderTarget, 0, clearBackBuffer, clearZBuffer, clearZBuffer, color);
// create depth texture if require.
if (!depthTexture)
{
depthTexture = addRenderTargetTexture(texture->getSize(), "IRR_DEPTH_STENCIL", video::ECF_D24S8);
SharedDepthTextures.push_back(depthTexture);
}
SharedRenderTarget->setTexture(texture, depthTexture);
return IVideoDriver::setRenderTarget(SharedRenderTarget, 0, clearBackBuffer, clearZBuffer, clearZBuffer, color);
}
else
{
return setRenderTarget(NULL, 0, clearBackBuffer, clearZBuffer, clearZBuffer, color);
return IVideoDriver::setRenderTarget(NULL, 0, clearBackBuffer, clearZBuffer, false, color);
}
}
......@@ -1807,6 +1831,8 @@ void CNullDriver::removeAllRenderTargets()
RenderTargets[i]->drop();
RenderTargets.clear();
SharedRenderTarget = 0;
}
......
......@@ -101,7 +101,7 @@ namespace video
virtual ITexture* addTexture(const core::dimension2d<u32>& size, const io::path& name, ECOLOR_FORMAT format = ECF_A8R8G8B8) _IRR_OVERRIDE_;
//! set a render target
virtual bool setRenderTarget(IRenderTarget* target, core::array<u32> activeTextureID, bool clearBackBuffer,
virtual bool setRenderTarget(IRenderTarget* target, const core::array<u32>& activeTextureID, bool clearBackBuffer,
bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor) _IRR_OVERRIDE_;
//! set a render target
......@@ -809,7 +809,10 @@ namespace video
core::array<SOccQuery> OcclusionQueries;
core::array<IRenderTarget*> RenderTargets;
IRenderTarget* TextureRenderTarget; // A default rendertarget for rendering to single textures.
// Shared objects used with simplified IVideoDriver::setRenderTarget method with ITexture* param.
IRenderTarget* SharedRenderTarget;
core::array<ITexture*> SharedDepthTextures;
IRenderTarget* CurrentRenderTarget;
core::dimension2d<u32> CurrentRenderTargetSize;
......
......@@ -4223,7 +4223,7 @@ u32 COpenGLDriver::getMaximalPrimitiveCount() const
//! set a render target
bool COpenGLDriver::setRenderTarget(IRenderTarget* target, core::array<u32> activeTextureID, bool clearBackBuffer,
bool COpenGLDriver::setRenderTarget(IRenderTarget* target, const core::array<u32>& activeTextureID, bool clearBackBuffer,
bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor)
{
if (target && target->getDriverType() != EDT_OPENGL)
......
......@@ -360,7 +360,7 @@ namespace video
const io::path& name, const ECOLOR_FORMAT format = ECF_UNKNOWN) _IRR_OVERRIDE_;
//! set a render target
virtual bool setRenderTarget(IRenderTarget* target, core::array<u32> activeTextureID, bool clearBackBuffer,
virtual bool setRenderTarget(IRenderTarget* target, const core::array<u32>& activeTextureID, bool clearBackBuffer,
bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor) _IRR_OVERRIDE_;
//! Clear the color, depth and/or stencil buffers.
......
......@@ -260,7 +260,7 @@ ITexture* CSoftwareDriver::createDeviceDependentTexture(IImage* surface, const i
//! set a render target
bool CSoftwareDriver::setRenderTarget(IRenderTarget* target, core::array<u32> activeTextureID, bool clearBackBuffer,
bool CSoftwareDriver::setRenderTarget(IRenderTarget* target, const core::array<u32>& activeTextureID, bool clearBackBuffer,
bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor)
{
if (target && target->getDriverType() != EDT_SOFTWARE)
......
......@@ -37,7 +37,7 @@ namespace video
virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_;
//! set a render target
virtual bool setRenderTarget(IRenderTarget* target, core::array<u32> activeTextureID, bool clearBackBuffer,
virtual bool setRenderTarget(IRenderTarget* target, const core::array<u32>& activeTextureID, bool clearBackBuffer,
bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor) _IRR_OVERRIDE_;
//! sets a viewport
......
......@@ -418,7 +418,7 @@ bool CBurningVideoDriver::endScene()
//! set a render target
bool CBurningVideoDriver::setRenderTarget(IRenderTarget* target, core::array<u32> activeTextureID, bool clearBackBuffer,
bool CBurningVideoDriver::setRenderTarget(IRenderTarget* target, const core::array<u32>& activeTextureID, bool clearBackBuffer,
bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor)
{
if (target && target->getDriverType() != EDT_BURNINGSVIDEO)
......
......@@ -40,7 +40,7 @@ namespace video
virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_;
//! set a render target
virtual bool setRenderTarget(IRenderTarget* target, core::array<u32> activeTextureID, bool clearBackBuffer,
virtual bool setRenderTarget(IRenderTarget* target, const core::array<u32>& activeTextureID, bool clearBackBuffer,
bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor) _IRR_OVERRIDE_;
//! sets a viewport
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment