Commit 5fbcafde authored by nadro's avatar nadro

- Removed unnecessary OpenGL calls. Thanks to Hendu for prepare patches.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4397 dfc29bdd-3216-0410-991c-e03cc46cb475
parent ab6df40c
...@@ -36,8 +36,8 @@ COpenGLDriver::COpenGLDriver(const irr::SIrrlichtCreationParameters& params, ...@@ -36,8 +36,8 @@ COpenGLDriver::COpenGLDriver(const irr::SIrrlichtCreationParameters& params,
: CNullDriver(io, params.WindowSize), COpenGLExtensionHandler(), : CNullDriver(io, params.WindowSize), COpenGLExtensionHandler(),
CurrentRenderMode(ERM_NONE), ResetRenderStates(true), Transformation3DChanged(true), CurrentRenderMode(ERM_NONE), ResetRenderStates(true), Transformation3DChanged(true),
AntiAlias(params.AntiAlias), RenderTargetTexture(0), AntiAlias(params.AntiAlias), RenderTargetTexture(0),
CurrentRendertargetSize(0,0), ColorFormat(ECF_R8G8B8), CurrentRendertargetSize(0,0), CurrentMatrixMode(GL_MODELVIEW), ColorFormat(ECF_R8G8B8),
CurrentTarget(ERT_FRAME_BUFFER), Params(params), CurrentTarget(ERT_FRAME_BUFFER), Params(params), DepthMask(true),
HDc(0), Window(static_cast<HWND>(params.WindowId)), Win32Device(device), HDc(0), Window(static_cast<HWND>(params.WindowId)), Win32Device(device),
DeviceType(EIDT_WIN32) DeviceType(EIDT_WIN32)
{ {
...@@ -472,8 +472,8 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, ...@@ -472,8 +472,8 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params,
: CNullDriver(io, params.WindowSize), COpenGLExtensionHandler(), : CNullDriver(io, params.WindowSize), COpenGLExtensionHandler(),
CurrentRenderMode(ERM_NONE), ResetRenderStates(true), Transformation3DChanged(true), CurrentRenderMode(ERM_NONE), ResetRenderStates(true), Transformation3DChanged(true),
AntiAlias(params.AntiAlias), RenderTargetTexture(0), AntiAlias(params.AntiAlias), RenderTargetTexture(0),
CurrentRendertargetSize(0,0), ColorFormat(ECF_R8G8B8), CurrentRendertargetSize(0,0), CurrentMatrixMode(GL_MODELVIEW), ColorFormat(ECF_R8G8B8),
CurrentTarget(ERT_FRAME_BUFFER), Params(params), CurrentTarget(ERT_FRAME_BUFFER), Params(params), DepthMask(true),
OSXDevice(device), DeviceType(EIDT_OSX) OSXDevice(device), DeviceType(EIDT_OSX)
{ {
#ifdef _DEBUG #ifdef _DEBUG
...@@ -499,8 +499,8 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, ...@@ -499,8 +499,8 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params,
: CNullDriver(io, params.WindowSize), COpenGLExtensionHandler(), : CNullDriver(io, params.WindowSize), COpenGLExtensionHandler(),
CurrentRenderMode(ERM_NONE), ResetRenderStates(true), CurrentRenderMode(ERM_NONE), ResetRenderStates(true),
Transformation3DChanged(true), AntiAlias(params.AntiAlias), Transformation3DChanged(true), AntiAlias(params.AntiAlias),
RenderTargetTexture(0), CurrentRendertargetSize(0,0), ColorFormat(ECF_R8G8B8), RenderTargetTexture(0), CurrentRendertargetSize(0,0), CurrentMatrixMode(GL_MODELVIEW),
CurrentTarget(ERT_FRAME_BUFFER), Params(params), ColorFormat(ECF_R8G8B8), CurrentTarget(ERT_FRAME_BUFFER), Params(params), DepthMask(true),
X11Device(device), DeviceType(EIDT_X11) X11Device(device), DeviceType(EIDT_X11)
{ {
#ifdef _DEBUG #ifdef _DEBUG
...@@ -592,8 +592,8 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, ...@@ -592,8 +592,8 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params,
: CNullDriver(io, params.WindowSize), COpenGLExtensionHandler(), : CNullDriver(io, params.WindowSize), COpenGLExtensionHandler(),
CurrentRenderMode(ERM_NONE), ResetRenderStates(true), CurrentRenderMode(ERM_NONE), ResetRenderStates(true),
Transformation3DChanged(true), AntiAlias(params.AntiAlias), Transformation3DChanged(true), AntiAlias(params.AntiAlias),
RenderTargetTexture(0), CurrentRendertargetSize(0,0), ColorFormat(ECF_R8G8B8), RenderTargetTexture(0), CurrentRendertargetSize(0,0), CurrentMatrixMode(GL_MODELVIEW),
CurrentTarget(ERT_FRAME_BUFFER), Params(params), ColorFormat(ECF_R8G8B8), CurrentTarget(ERT_FRAME_BUFFER), Params(params), DepthMask(true),
SDLDevice(device), DeviceType(EIDT_SDL) SDLDevice(device), DeviceType(EIDT_SDL)
{ {
#ifdef _DEBUG #ifdef _DEBUG
...@@ -876,9 +876,12 @@ void COpenGLDriver::clearBuffers(bool backBuffer, bool zBuffer, bool stencilBuff ...@@ -876,9 +876,12 @@ void COpenGLDriver::clearBuffers(bool backBuffer, bool zBuffer, bool stencilBuff
if (zBuffer) if (zBuffer)
{ {
glDepthMask(GL_TRUE); if (!DepthMask)
glDepthMask(GL_TRUE);
LastMaterial.ZWriteEnable=true; LastMaterial.ZWriteEnable=true;
mask |= GL_DEPTH_BUFFER_BIT; DepthMask = true;
mask |= GL_DEPTH_BUFFER_BIT;
} }
if (stencilBuffer) if (stencilBuffer)
...@@ -945,7 +948,7 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri ...@@ -945,7 +948,7 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri
case ETS_WORLD: case ETS_WORLD:
{ {
// OpenGL only has a model matrix, view and world is not existent. so lets fake these two. // OpenGL only has a model matrix, view and world is not existent. so lets fake these two.
glMatrixMode(GL_MODELVIEW); setMatrixMode(GL_MODELVIEW);
// first load the viewing transformation for user clip planes // first load the viewing transformation for user clip planes
glLoadMatrixf((Matrices[ETS_VIEW]).pointer()); glLoadMatrixf((Matrices[ETS_VIEW]).pointer());
...@@ -961,7 +964,7 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri ...@@ -961,7 +964,7 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri
break; break;
case ETS_PROJECTION: case ETS_PROJECTION:
{ {
glMatrixMode(GL_PROJECTION); setMatrixMode(GL_PROJECTION);
glLoadMatrixf(mat.pointer()); glLoadMatrixf(mat.pointer());
} }
break; break;
...@@ -978,7 +981,7 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri ...@@ -978,7 +981,7 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri
if (MultiTextureExtension) if (MultiTextureExtension)
extGlActiveTexture(GL_TEXTURE0_ARB + i); extGlActiveTexture(GL_TEXTURE0_ARB + i);
glMatrixMode(GL_TEXTURE); setMatrixMode(GL_TEXTURE);
if (!isRTT && mat.isIdentity() ) if (!isRTT && mat.isIdentity() )
glLoadIdentity(); glLoadIdentity();
else else
...@@ -2569,10 +2572,10 @@ void COpenGLDriver::setRenderStates3DMode() ...@@ -2569,10 +2572,10 @@ void COpenGLDriver::setRenderStates3DMode()
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// switch back the matrices // switch back the matrices
glMatrixMode(GL_MODELVIEW); setMatrixMode(GL_MODELVIEW);
glLoadMatrixf((Matrices[ETS_VIEW] * Matrices[ETS_WORLD]).pointer()); glLoadMatrixf((Matrices[ETS_VIEW] * Matrices[ETS_WORLD]).pointer());
glMatrixMode(GL_PROJECTION); setMatrixMode(GL_PROJECTION);
glLoadMatrixf(Matrices[ETS_PROJECTION].pointer()); glLoadMatrixf(Matrices[ETS_PROJECTION].pointer());
ResetRenderStates = true; ResetRenderStates = true;
...@@ -2938,10 +2941,20 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater ...@@ -2938,10 +2941,20 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
{ {
if (material.ZWriteEnable && (AllowZWriteOnTransparent || !material.isTransparent())) if (material.ZWriteEnable && (AllowZWriteOnTransparent || !material.isTransparent()))
{ {
glDepthMask(GL_TRUE); if (!DepthMask)
{
glDepthMask(GL_TRUE);
DepthMask = true;
}
} }
else else
glDepthMask(GL_FALSE); {
if (DepthMask)
{
glDepthMask(GL_FALSE);
DepthMask = false;
}
}
} }
// back face culling // back face culling
...@@ -3210,7 +3223,7 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh ...@@ -3210,7 +3223,7 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh
} }
if (Transformation3DChanged) if (Transformation3DChanged)
{ {
glMatrixMode(GL_PROJECTION); setMatrixMode(GL_PROJECTION);
const core::dimension2d<u32>& renderTargetSize = getCurrentRenderTargetSize(); const core::dimension2d<u32>& renderTargetSize = getCurrentRenderTargetSize();
core::matrix4 m(core::matrix4::EM4CONST_NOTHING); core::matrix4 m(core::matrix4::EM4CONST_NOTHING);
...@@ -3218,7 +3231,7 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh ...@@ -3218,7 +3231,7 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh
m.setTranslation(core::vector3df(-1,1,0)); m.setTranslation(core::vector3df(-1,1,0));
glLoadMatrixf(m.pointer()); glLoadMatrixf(m.pointer());
glMatrixMode(GL_MODELVIEW); setMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
glTranslatef(0.375f, 0.375f, 0.0f); glTranslatef(0.375f, 0.375f, 0.0f);
...@@ -3586,6 +3599,7 @@ void COpenGLDriver::drawStencilShadowVolume(const core::array<core::vector3df>& ...@@ -3586,6 +3599,7 @@ void COpenGLDriver::drawStencilShadowVolume(const core::array<core::vector3df>&
glDisable(GL_FOG); glDisable(GL_FOG);
glDepthFunc(GL_LESS); glDepthFunc(GL_LESS);
glDepthMask(GL_FALSE); // no depth buffer writing glDepthMask(GL_FALSE); // no depth buffer writing
DepthMask = false;
if (debugDataVisible & scene::EDS_MESH_WIRE_OVERLAY) if (debugDataVisible & scene::EDS_MESH_WIRE_OVERLAY)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
if (!(debugDataVisible & (scene::EDS_SKELETON|scene::EDS_MESH_WIRE_OVERLAY))) if (!(debugDataVisible & (scene::EDS_SKELETON|scene::EDS_MESH_WIRE_OVERLAY)))
...@@ -3716,6 +3730,7 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef ...@@ -3716,6 +3730,7 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glDisable(GL_FOG); glDisable(GL_FOG);
glDepthMask(GL_FALSE); glDepthMask(GL_FALSE);
DepthMask = false;
glShadeModel(GL_FLAT); glShadeModel(GL_FLAT);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
...@@ -3728,10 +3743,10 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef ...@@ -3728,10 +3743,10 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
// draw a shadow rectangle covering the entire screen using stencil buffer // draw a shadow rectangle covering the entire screen using stencil buffer
glMatrixMode(GL_MODELVIEW); setMatrixMode(GL_MODELVIEW);
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
glMatrixMode(GL_PROJECTION); setMatrixMode(GL_PROJECTION);
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
...@@ -3755,7 +3770,7 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef ...@@ -3755,7 +3770,7 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef
// restore settings // restore settings
glPopMatrix(); glPopMatrix();
glMatrixMode(GL_MODELVIEW); setMatrixMode(GL_MODELVIEW);
glPopMatrix(); glPopMatrix();
glPopAttrib(); glPopAttrib();
} }
...@@ -4728,6 +4743,14 @@ GLenum COpenGLDriver::getZBufferBits() const ...@@ -4728,6 +4743,14 @@ GLenum COpenGLDriver::getZBufferBits() const
return bits; return bits;
} }
void COpenGLDriver::setMatrixMode(GLenum mode)
{
if (CurrentMatrixMode != mode) {
glMatrixMode(mode);
CurrentMatrixMode = mode;
}
}
#ifdef _IRR_COMPILE_WITH_CG_ #ifdef _IRR_COMPILE_WITH_CG_
const CGcontext& COpenGLDriver::getCgContext() const CGcontext& COpenGLDriver::getCgContext()
{ {
......
...@@ -458,6 +458,9 @@ namespace video ...@@ -458,6 +458,9 @@ namespace video
void renderArray(const void* indexList, u32 primitiveCount, void renderArray(const void* indexList, u32 primitiveCount,
scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType); scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType);
//! Set the gl matrix mode, if not set already
void setMatrixMode(GLenum mode);
core::stringw Name; core::stringw Name;
core::matrix4 Matrices[ETS_COUNT]; core::matrix4 Matrices[ETS_COUNT];
core::array<u8> ColorBuffer; core::array<u8> ColorBuffer;
...@@ -558,6 +561,8 @@ namespace video ...@@ -558,6 +561,8 @@ namespace video
core::matrix4 TextureFlipMatrix; core::matrix4 TextureFlipMatrix;
GLenum CurrentMatrixMode;
//! Color buffer format //! Color buffer format
ECOLOR_FORMAT ColorFormat; ECOLOR_FORMAT ColorFormat;
...@@ -566,6 +571,8 @@ namespace video ...@@ -566,6 +571,8 @@ namespace video
SIrrlichtCreationParameters Params; SIrrlichtCreationParameters Params;
bool DepthMask;
//! All the lights that have been requested; a hardware limited //! All the lights that have been requested; a hardware limited
//! number of them will be used at once. //! number of them will be used at once.
struct RequestedLight struct RequestedLight
......
...@@ -209,7 +209,7 @@ void COpenGLSLMaterialRenderer::OnSetMaterial(const video::SMaterial& material, ...@@ -209,7 +209,7 @@ void COpenGLSLMaterialRenderer::OnSetMaterial(const video::SMaterial& material,
Driver->extGlUseProgramObject(Program); Driver->extGlUseProgramObject(Program);
if (BaseMaterial) if (BaseMaterial)
BaseMaterial->OnSetMaterial(material, material, true, this); BaseMaterial->OnSetMaterial(material, lastMaterial, resetAllRenderstates, services);
} }
//let callback know used material //let callback know used material
......
...@@ -159,7 +159,7 @@ void COpenGLShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& materi ...@@ -159,7 +159,7 @@ void COpenGLShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& materi
} }
if (BaseMaterial) if (BaseMaterial)
BaseMaterial->OnSetMaterial(material, material, true, services); BaseMaterial->OnSetMaterial(material, lastMaterial, resetAllRenderstates, services);
} }
//let callback know used material //let callback know used material
......
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