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,10 +1609,9 @@ void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCoun ...@@ -1608,10 +1609,9 @@ 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,9 +1912,9 @@ void COpenGLDriver::draw2DVertexPrimitiveList(const void* vertices, u32 vertexCo ...@@ -1909,9 +1912,9 @@ 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)
{ {
...@@ -4831,6 +4834,10 @@ COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver), ...@@ -4831,6 +4834,10 @@ COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver),
Texture[i] = 0; Texture[i] = 0;
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);
...@@ -4839,6 +4846,39 @@ COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver), ...@@ -4839,6 +4846,39 @@ COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver),
if(Driver->MultiTextureExtension) if(Driver->MultiTextureExtension)
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)
{ {
......
...@@ -624,6 +624,10 @@ namespace video ...@@ -624,6 +624,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.
...@@ -643,6 +647,10 @@ namespace video ...@@ -643,6 +647,10 @@ namespace video
private: private:
COpenGLDriver* Driver; COpenGLDriver* Driver;
bool ClientStateVertex;
bool ClientStateNormal;
bool ClientStateColor;
bool DepthMask; bool DepthMask;
GLenum DepthFunc; GLenum DepthFunc;
......
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