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 ...@@ -543,7 +543,7 @@ namespace video
\param clearStencilBuffer Clears the stencil buffer of the rendertarget. \param clearStencilBuffer Clears the stencil buffer of the rendertarget.
\param clearColor The clear color for the render target. \param clearColor The clear color for the render target.
\return True if sucessful and false if not. */ \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; bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor = video::SColor(255,0,0,0)) = 0;
//! Set a render target. //! Set a render target.
......
...@@ -33,7 +33,7 @@ public: ...@@ -33,7 +33,7 @@ public:
//! Constructs an array and allocates an initial chunk of memory. //! Constructs an array and allocates an initial chunk of memory.
/** \param start_count Amount of elements to pre-allocate. */ /** \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), strategy(ALLOC_STRATEGY_DOUBLE),
free_when_destroyed(true), is_sorted(true) free_when_destroyed(true), is_sorted(true)
{ {
......
...@@ -764,7 +764,7 @@ void CD3D9Driver::setTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag, ...@@ -764,7 +764,7 @@ void CD3D9Driver::setTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag,
//! set a render target //! 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) bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor)
{ {
if (target && target->getDriverType() != EDT_DIRECT3D9) if (target && target->getDriverType() != EDT_DIRECT3D9)
......
...@@ -63,7 +63,7 @@ namespace video ...@@ -63,7 +63,7 @@ namespace video
virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_; virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_;
//! set a render target //! 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_; bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor) _IRR_OVERRIDE_;
//! sets a viewport //! sets a viewport
......
...@@ -83,7 +83,7 @@ IImageWriter* createImageWriterPPM(); ...@@ -83,7 +83,7 @@ IImageWriter* createImageWriterPPM();
//! constructor //! constructor
CNullDriver::CNullDriver(io::IFileSystem* io, const core::dimension2d<u32>& screenSize) 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), ViewPort(0, 0, 0, 0), ScreenSize(screenSize), PrimitivesDrawn(0), MinVertexCountForVBO(500),
TextureCreationFlags(0), OverrideMaterial2DEnabled(false), AllowZWriteOnTransparent(false) TextureCreationFlags(0), OverrideMaterial2DEnabled(false), AllowZWriteOnTransparent(false)
{ {
...@@ -213,9 +213,6 @@ CNullDriver::~CNullDriver() ...@@ -213,9 +213,6 @@ CNullDriver::~CNullDriver()
if (MeshManipulator) if (MeshManipulator)
MeshManipulator->drop(); MeshManipulator->drop();
if (TextureRenderTarget)
TextureRenderTarget->drop();
removeAllRenderTargets(); removeAllRenderTargets();
deleteAllTextures(); deleteAllTextures();
...@@ -296,10 +293,19 @@ void CNullDriver::deleteAllTextures() ...@@ -296,10 +293,19 @@ void CNullDriver::deleteAllTextures()
// last set material member. Could be optimized to reduce state changes. // last set material member. Could be optimized to reduce state changes.
setMaterial(SMaterial()); 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) for (u32 i=0; i<Textures.size(); ++i)
Textures[i].Surface->drop(); Textures[i].Surface->drop();
Textures.clear(); Textures.clear();
SharedDepthTextures.clear();
} }
...@@ -621,7 +627,7 @@ ITexture* CNullDriver::createDeviceDependentTexture(IImage* surface, const io::p ...@@ -621,7 +627,7 @@ ITexture* CNullDriver::createDeviceDependentTexture(IImage* surface, const io::p
//! set a render target //! 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) bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor)
{ {
return false; return false;
...@@ -631,19 +637,37 @@ bool CNullDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuffer ...@@ -631,19 +637,37 @@ bool CNullDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuffer
{ {
if (texture) 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)
{
if (SharedDepthTextures[i]->getSize() == texture->getSize())
{ {
// (there's no createRenderTarget) depthTexture = SharedDepthTextures[i];
TextureRenderTarget = addRenderTarget();
TextureRenderTarget->grab(); break;
removeRenderTarget(TextureRenderTarget); }
}
// create depth texture if require.
if (!depthTexture)
{
depthTexture = addRenderTargetTexture(texture->getSize(), "IRR_DEPTH_STENCIL", video::ECF_D24S8);
SharedDepthTextures.push_back(depthTexture);
} }
return setRenderTarget(TextureRenderTarget, 0, clearBackBuffer, clearZBuffer, clearZBuffer, color); SharedRenderTarget->setTexture(texture, depthTexture);
return IVideoDriver::setRenderTarget(SharedRenderTarget, 0, clearBackBuffer, clearZBuffer, clearZBuffer, color);
} }
else 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() ...@@ -1807,6 +1831,8 @@ void CNullDriver::removeAllRenderTargets()
RenderTargets[i]->drop(); RenderTargets[i]->drop();
RenderTargets.clear(); RenderTargets.clear();
SharedRenderTarget = 0;
} }
......
...@@ -101,7 +101,7 @@ namespace video ...@@ -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_; virtual ITexture* addTexture(const core::dimension2d<u32>& size, const io::path& name, ECOLOR_FORMAT format = ECF_A8R8G8B8) _IRR_OVERRIDE_;
//! set a render target //! 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_; bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor) _IRR_OVERRIDE_;
//! set a render target //! set a render target
...@@ -809,7 +809,10 @@ namespace video ...@@ -809,7 +809,10 @@ namespace video
core::array<SOccQuery> OcclusionQueries; core::array<SOccQuery> OcclusionQueries;
core::array<IRenderTarget*> RenderTargets; 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; IRenderTarget* CurrentRenderTarget;
core::dimension2d<u32> CurrentRenderTargetSize; core::dimension2d<u32> CurrentRenderTargetSize;
......
...@@ -4223,7 +4223,7 @@ u32 COpenGLDriver::getMaximalPrimitiveCount() const ...@@ -4223,7 +4223,7 @@ u32 COpenGLDriver::getMaximalPrimitiveCount() const
//! set a render target //! 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) bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor)
{ {
if (target && target->getDriverType() != EDT_OPENGL) if (target && target->getDriverType() != EDT_OPENGL)
......
...@@ -360,7 +360,7 @@ namespace video ...@@ -360,7 +360,7 @@ namespace video
const io::path& name, const ECOLOR_FORMAT format = ECF_UNKNOWN) _IRR_OVERRIDE_; const io::path& name, const ECOLOR_FORMAT format = ECF_UNKNOWN) _IRR_OVERRIDE_;
//! set a render target //! 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_; bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor) _IRR_OVERRIDE_;
//! Clear the color, depth and/or stencil buffers. //! Clear the color, depth and/or stencil buffers.
......
...@@ -260,7 +260,7 @@ ITexture* CSoftwareDriver::createDeviceDependentTexture(IImage* surface, const i ...@@ -260,7 +260,7 @@ ITexture* CSoftwareDriver::createDeviceDependentTexture(IImage* surface, const i
//! set a render target //! 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) bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor)
{ {
if (target && target->getDriverType() != EDT_SOFTWARE) if (target && target->getDriverType() != EDT_SOFTWARE)
......
...@@ -37,7 +37,7 @@ namespace video ...@@ -37,7 +37,7 @@ namespace video
virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_; virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_;
//! set a render target //! 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_; bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor) _IRR_OVERRIDE_;
//! sets a viewport //! sets a viewport
......
...@@ -418,7 +418,7 @@ bool CBurningVideoDriver::endScene() ...@@ -418,7 +418,7 @@ bool CBurningVideoDriver::endScene()
//! set a render target //! 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) bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor)
{ {
if (target && target->getDriverType() != EDT_BURNINGSVIDEO) if (target && target->getDriverType() != EDT_BURNINGSVIDEO)
......
...@@ -40,7 +40,7 @@ namespace video ...@@ -40,7 +40,7 @@ namespace video
virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_; virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_;
//! set a render target //! 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_; bool clearDepthBuffer, bool clearStencilBuffer, SColor clearColor) _IRR_OVERRIDE_;
//! sets a viewport //! 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