irrlicht/source/Irrlicht/COpenGLCacheHandler.cpp

132 lines
2.8 KiB
C++

// Copyright (C) 2015 Patryk Nadrowski
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in Irrlicht.h
#include "COpenGLCacheHandler.h"
#ifdef _IRR_COMPILE_WITH_OPENGL_
#include "COpenGLDriver.h"
namespace irr
{
namespace video
{
/* COpenGLCacheHandler */
COpenGLCacheHandler::COpenGLCacheHandler(COpenGLDriver* driver) :
COpenGLCoreCacheHandler<COpenGLDriver, COpenGLTexture>(driver), AlphaMode(GL_ALWAYS), AlphaRef(0.f), AlphaTest(false),
MatrixMode(GL_MODELVIEW), ClientActiveTexture(GL_TEXTURE0), ClientStateVertex(false),
ClientStateNormal(false), ClientStateColor(false), ClientStateTexCoord0(false)
{
// Initial OpenGL values from specification.
glAlphaFunc(AlphaMode, AlphaRef);
glDisable(GL_ALPHA_TEST);
glMatrixMode(MatrixMode);
Driver->irrGlClientActiveTexture(ClientActiveTexture);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
COpenGLCacheHandler::~COpenGLCacheHandler()
{
}
void COpenGLCacheHandler::setAlphaFunc(GLenum mode, GLclampf ref)
{
if (AlphaMode != mode || AlphaRef != ref)
{
glAlphaFunc(mode, ref);
AlphaMode = mode;
AlphaRef = ref;
}
}
void COpenGLCacheHandler::setAlphaTest(bool enable)
{
if (AlphaTest != enable)
{
if (enable)
glEnable(GL_ALPHA_TEST);
else
glDisable(GL_ALPHA_TEST);
AlphaTest = enable;
}
}
void COpenGLCacheHandler::setClientState(bool vertex, bool normal, bool color, bool texCoord0)
{
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;
}
if (ClientStateTexCoord0 != texCoord0)
{
setClientActiveTexture(GL_TEXTURE0_ARB);
if (texCoord0)
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
else
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
ClientStateTexCoord0 = texCoord0;
}
}
void COpenGLCacheHandler::setMatrixMode(GLenum mode)
{
if (MatrixMode != mode)
{
glMatrixMode(mode);
MatrixMode = mode;
}
}
void COpenGLCacheHandler::setClientActiveTexture(GLenum texture)
{
if (ClientActiveTexture != texture)
{
Driver->irrGlClientActiveTexture(texture);
ClientActiveTexture = texture;
}
}
} // end namespace
} // end namespace
#endif // _IRR_COMPILE_WITH_OPENGL_