Commit fbde0c7f authored by hybrid's avatar hybrid

Fix mrt disabling, also avoid duplicated enabling for all rtts. Both affects only OpenGL

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3485 dfc29bdd-3216-0410-991c-e03cc46cb475
parent e2fddfe5
......@@ -222,6 +222,15 @@ namespace video
TargetType(target), ColorMask(colorMask),
BlendFuncSrc(blendFuncSrc), BlendFuncDst(blendFuncDst),
BlendEnable(blendEnable) {}
bool operator!=(const IRenderTarget& other) const
{
return ((RenderTexture != other.RenderTexture) ||
(TargetType != other.TargetType) ||
(ColorMask != other.ColorMask) ||
(BlendFuncSrc != other.BlendFuncSrc) ||
(BlendFuncDst != other.BlendFuncDst) ||
(BlendEnable != other.BlendEnable));
}
ITexture* RenderTexture;
E_RENDER_TARGET TargetType:8;
E_COLOR_PLANE ColorMask:8;
......
......@@ -3764,7 +3764,12 @@ bool COpenGLDriver::setRenderTarget(video::E_RENDER_TARGET target, bool clearTar
if (ERT_RENDER_TEXTURE == target)
{
os::Printer::log("Fatal Error: For render textures call setRenderTarget with the actual texture as first parameter.", ELL_ERROR);
os::Printer::log("For render textures call setRenderTarget with the actual texture as first parameter.", ELL_ERROR);
return false;
}
if (ERT_MULTI_RENDER_TEXTURES == target)
{
os::Printer::log("For multiple render textures call setRenderTarget with the texture array as first parameter.", ELL_ERROR);
return false;
}
......@@ -3814,8 +3819,23 @@ bool COpenGLDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuff
return false;
}
// check if we should set the previous RT back
if (CurrentTarget==ERT_MULTI_RENDER_TEXTURES)
{
for (u32 i=0; i<MRTargets.size(); ++i)
{
if (MRTargets[i].TargetType==ERT_RENDER_TEXTURE)
{
for (; i<MRTargets.size(); ++i)
if (MRTargets[i].TargetType==ERT_RENDER_TEXTURE)
extGlFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, 0, 0);
}
}
MRTargets.clear();
}
// check if we should set the previous RT back
if (RenderTargetTexture != texture)
{
setActiveTexture(0, 0);
ResetRenderStates=true;
if (RenderTargetTexture!=0)
......@@ -3840,8 +3860,9 @@ bool COpenGLDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuff
CurrentTarget=ERT_FRAME_BUFFER;
glDrawBuffer(Doublebuffer?GL_BACK_LEFT:GL_FRONT_LEFT);
}
}
clearBuffers(clearBackBuffer, clearZBuffer, false, color);
return true;
}
......@@ -3850,8 +3871,21 @@ bool COpenGLDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuff
bool COpenGLDriver::setRenderTarget(const core::array<video::IRenderTarget>& targets,
bool clearBackBuffer, bool clearZBuffer, SColor color)
{
// if simply disabling the MRT via array call
if (targets.size()==0)
return setRenderTarget(0, clearBackBuffer, clearZBuffer, color);
// if disabling old MRT, but enabling new one as well
if ((MRTargets.size()!=0) && (targets != MRTargets))
setRenderTarget(0, clearBackBuffer, clearZBuffer, color);
// if no change, simply clear buffers
else if (targets == MRTargets)
{
clearBuffers(clearBackBuffer, clearZBuffer, false, color);
return true;
}
// copy to storage for correct disabling
MRTargets=targets;
u32 maxMultipleRTTs = core::min_(static_cast<u32>(MaxMultipleRenderTargets), targets.size());
......@@ -3914,7 +3948,7 @@ bool COpenGLDriver::setRenderTarget(const core::array<video::IRenderTarget>& tar
if (targets[i].TargetType==ERT_RENDER_TEXTURE)
{
setRenderTarget(targets[i].RenderTexture, false, false, 0x0);
break;
break; // bind only first RTT
}
}
// init other main buffer, if necessary
......@@ -3951,6 +3985,7 @@ bool COpenGLDriver::setRenderTarget(const core::array<video::IRenderTarget>& tar
#ifdef GL_EXT_framebuffer_object
// attach texture to FrameBuffer Object on Color [i]
attachment = GL_COLOR_ATTACHMENT0_EXT+i;
if (targets[i].RenderTexture != RenderTargetTexture)
extGlFramebufferTexture2D(GL_FRAMEBUFFER_EXT, attachment, GL_TEXTURE_2D, static_cast<COpenGLTexture*>(targets[i].RenderTexture)->getOpenGLTextureName(), 0);
#endif
MRTs[i]=attachment;
......
......@@ -449,6 +449,7 @@ namespace video
SMaterial Material, LastMaterial;
COpenGLTexture* RenderTargetTexture;
core::array<video::IRenderTarget> MRTargets;
const ITexture* CurrentTexture[MATERIAL_MAX_TEXTURES];
core::array<ITexture*> DepthTextures;
struct SUserClipPlane
......
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