Commit d493514c authored by nadro's avatar nadro

- Improved client states handling.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4413 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 42c92aa5
...@@ -1466,12 +1466,13 @@ void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCoun ...@@ -1466,12 +1466,13 @@ void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCoun
if (MultiTextureExtension) if (MultiTextureExtension)
extGlClientActiveTexture(GL_TEXTURE0_ARB); extGlClientActiveTexture(GL_TEXTURE0_ARB);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
if ((pType!=scene::EPT_POINTS) && (pType!=scene::EPT_POINT_SPRITES)) if ((pType!=scene::EPT_POINTS) && (pType!=scene::EPT_POINT_SPRITES))
{
BridgeCalls->setClientState(true, true, true);
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
if ((pType!=scene::EPT_POINTS) && (pType!=scene::EPT_POINT_SPRITES)) }
glEnableClientState(GL_NORMAL_ARRAY); else
BridgeCalls->setClientState(true, false, true);
//due to missing defines in OSX headers, we have to be more specific with this check //due to missing defines in OSX headers, we have to be more specific with this check
//#if defined(GL_ARB_vertex_array_bgra) || defined(GL_EXT_vertex_array_bgra) //#if defined(GL_ARB_vertex_array_bgra) || defined(GL_EXT_vertex_array_bgra)
...@@ -1608,9 +1609,8 @@ void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCoun ...@@ -1608,9 +1609,8 @@ void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCoun
} }
extGlClientActiveTexture(GL_TEXTURE0_ARB); extGlClientActiveTexture(GL_TEXTURE0_ARB);
} }
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY); if ((pType!=scene::EPT_POINTS) && (pType!=scene::EPT_POINT_SPRITES))
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY);
} }
...@@ -1797,10 +1797,13 @@ void COpenGLDriver::draw2DVertexPrimitiveList(const void* vertices, u32 vertexCo ...@@ -1797,10 +1797,13 @@ void COpenGLDriver::draw2DVertexPrimitiveList(const void* vertices, u32 vertexCo
if (MultiTextureExtension) if (MultiTextureExtension)
extGlClientActiveTexture(GL_TEXTURE0_ARB); extGlClientActiveTexture(GL_TEXTURE0_ARB);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
if ((pType!=scene::EPT_POINTS) && (pType!=scene::EPT_POINT_SPRITES)) if ((pType!=scene::EPT_POINTS) && (pType!=scene::EPT_POINT_SPRITES))
{
BridgeCalls->setClientState(true, false, true);
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}
else
BridgeCalls->setClientState(true, false, true);
//due to missing defines in OSX headers, we have to be more specific with this check //due to missing defines in OSX headers, we have to be more specific with this check
//#if defined(GL_ARB_vertex_array_bgra) || defined(GL_EXT_vertex_array_bgra) //#if defined(GL_ARB_vertex_array_bgra) || defined(GL_EXT_vertex_array_bgra)
...@@ -1909,8 +1912,8 @@ void COpenGLDriver::draw2DVertexPrimitiveList(const void* vertices, u32 vertexCo ...@@ -1909,8 +1912,8 @@ void COpenGLDriver::draw2DVertexPrimitiveList(const void* vertices, u32 vertexCo
} }
extGlClientActiveTexture(GL_TEXTURE0_ARB); extGlClientActiveTexture(GL_TEXTURE0_ARB);
} }
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY); if ((pType!=scene::EPT_POINTS) && (pType!=scene::EPT_POINT_SPRITES))
glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY);
} }
...@@ -3676,7 +3679,7 @@ void COpenGLDriver::drawStencilShadowVolume(const core::array<core::vector3df>& ...@@ -3676,7 +3679,7 @@ void COpenGLDriver::drawStencilShadowVolume(const core::array<core::vector3df>&
glEnable(GL_STENCIL_TEST); glEnable(GL_STENCIL_TEST);
} }
glEnableClientState(GL_VERTEX_ARRAY); BridgeCalls->setClientState(true, false, false);
glVertexPointer(3,GL_FLOAT,sizeof(core::vector3df),triangles.const_pointer()); glVertexPointer(3,GL_FLOAT,sizeof(core::vector3df),triangles.const_pointer());
glStencilMask(~0); glStencilMask(~0);
glStencilFunc(GL_ALWAYS, 0, ~0); glStencilFunc(GL_ALWAYS, 0, ~0);
...@@ -3777,7 +3780,6 @@ void COpenGLDriver::drawStencilShadowVolume(const core::array<core::vector3df>& ...@@ -3777,7 +3780,6 @@ void COpenGLDriver::drawStencilShadowVolume(const core::array<core::vector3df>&
#endif #endif
glDisable(GL_POLYGON_OFFSET_FILL); glDisable(GL_POLYGON_OFFSET_FILL);
glDisableClientState(GL_VERTEX_ARRAY); //not stored on stack
glPopAttrib(); glPopAttrib();
} }
...@@ -4823,6 +4825,7 @@ const CGcontext& COpenGLDriver::getCgContext() ...@@ -4823,6 +4825,7 @@ const CGcontext& COpenGLDriver::getCgContext()
#endif #endif
COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver), COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver),
ClientStateVertex(0), ClientStateNormal(0), ClientStateColor(0),
DepthMask(false), DepthFunc(0), DepthTest(false), MatrixMode(GL_MODELVIEW), DepthMask(false), DepthFunc(0), DepthTest(false), MatrixMode(GL_MODELVIEW),
ActiveTexture(GL_TEXTURE0_ARB) ActiveTexture(GL_TEXTURE0_ARB)
{ {
...@@ -4832,6 +4835,10 @@ COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver), ...@@ -4832,6 +4835,10 @@ COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver),
TextureFixedPipeline[i] = true; TextureFixedPipeline[i] = true;
} }
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDepthMask(GL_FALSE); glDepthMask(GL_FALSE);
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
...@@ -4840,6 +4847,39 @@ COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver), ...@@ -4840,6 +4847,39 @@ COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver),
Driver->extGlActiveTexture(GL_TEXTURE0_ARB); Driver->extGlActiveTexture(GL_TEXTURE0_ARB);
} }
void COpenGLCallBridge::setClientState(bool vertex, bool normal, bool color)
{
if(ClientStateVertex != vertex)
{
if(vertex)
glEnableClientState(GL_VERTEX_ARRAY);
else
glDisableClientState(GL_VERTEX_ARRAY);
ClientStateVertex = vertex;
}
if(ClientStateNormal != normal)
{
if(normal)
glEnableClientState(GL_NORMAL_ARRAY);
else
glDisableClientState(GL_NORMAL_ARRAY);
ClientStateNormal = normal;
}
if(ClientStateColor != color)
{
if(color)
glEnableClientState(GL_COLOR_ARRAY);
else
glDisableClientState(GL_COLOR_ARRAY);
ClientStateColor = color;
}
}
void COpenGLCallBridge::setDepthMask(bool enabled) void COpenGLCallBridge::setDepthMask(bool enabled)
{ {
if(DepthMask != enabled) if(DepthMask != enabled)
......
...@@ -625,6 +625,10 @@ namespace video ...@@ -625,6 +625,10 @@ namespace video
public: public:
COpenGLCallBridge(COpenGLDriver* driver); COpenGLCallBridge(COpenGLDriver* driver);
// Client State calls.
void setClientState(bool vertex, bool normal, bool color);
// Depth calls. // Depth calls.
void setDepthMask(bool enabled); void setDepthMask(bool enabled);
...@@ -644,6 +648,10 @@ namespace video ...@@ -644,6 +648,10 @@ namespace video
private: private:
COpenGLDriver* Driver; COpenGLDriver* Driver;
bool ClientStateVertex;
bool ClientStateNormal;
bool ClientStateColor;
bool DepthMask; bool DepthMask;
GLenum DepthFunc; GLenum DepthFunc;
bool DepthTest; bool DepthTest;
......
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