/* Copyright (c) 2001, Stanford University
* All rights reserved.
*
* See the file LICENSE.txt for information on redistributing this software.
*/
#ifndef CR_STATE_ATTRIB_H
#define CR_STATE_ATTRIB_H
#include "state/cr_limits.h"
#include "state/cr_statetypes.h"
#include <iprt/cdefs.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
CRbitvalue dirty[CR_MAX_BITARRAY];
} CRAttribBits;
typedef struct {
GLcolorf accumClearValue;
} CRAccumBufferStack;
typedef struct {
GLboolean blend;
GLboolean alphaTest;
GLboolean logicOp;
GLboolean indexLogicOp;
GLboolean dither;
GLenum alphaTestFunc;
GLfloat alphaTestRef;
GLenum blendSrcRGB;
GLenum blendDstRGB;
GLenum blendSrcA;
GLenum blendDstA;
GLcolorf blendColor;
GLenum blendEquation;
GLenum logicOpMode;
GLenum drawBuffer;
GLint indexWriteMask;
GLcolorb colorWriteMask;
GLcolorf colorClearValue;
GLfloat indexClearValue;
} CRColorBufferStack;
typedef struct {
GLboolean rasterValid;
GLfloat attrib[CR_MAX_VERTEX_ATTRIBS][4];
GLfloat rasterAttrib[CR_MAX_VERTEX_ATTRIBS][4];
GLboolean edgeFlag;
GLfloat colorIndex;
} CRCurrentStack;
typedef struct {
GLboolean depthTest;
GLboolean depthMask;
GLenum depthFunc;
GLdefault depthClearValue;
} CRDepthBufferStack;
typedef struct {
GLboolean alphaTest;
GLboolean autoNormal;
GLboolean blend;
GLboolean *clip;
GLboolean colorMaterial;
GLboolean cullFace;
GLboolean depthTest;
GLboolean dither;
GLboolean fog;
GLboolean *light;
GLboolean lighting;
GLboolean lineSmooth;
GLboolean lineStipple;
GLboolean logicOp;
GLboolean indexLogicOp;
GLboolean map1[GLEVAL_TOT];
GLboolean map2[GLEVAL_TOT];
GLboolean normalize;
GLboolean pointSmooth;
#ifdef CR_ARB_point_sprite
GLboolean pointSprite;
GLboolean coordReplacement[CR_MAX_TEXTURE_UNITS];
#endif
GLboolean polygonOffsetLine;
GLboolean polygonOffsetFill;
GLboolean polygonOffsetPoint;
GLboolean polygonSmooth;
GLboolean polygonStipple;
#ifdef CR_OPENGL_VERSION_1_2
GLboolean rescaleNormals;
#endif
GLboolean scissorTest;
GLboolean stencilTest;
GLboolean texture1D[CR_MAX_TEXTURE_UNITS];
GLboolean texture2D[CR_MAX_TEXTURE_UNITS];
GLboolean texture3D[CR_MAX_TEXTURE_UNITS];
#ifdef CR_ARB_texture_cube_map
GLboolean textureCubeMap[CR_MAX_TEXTURE_UNITS];
#endif
#ifdef CR_NV_texture_rectangle
GLboolean textureRect[CR_MAX_TEXTURE_UNITS];
#endif
GLboolean textureGenS[CR_MAX_TEXTURE_UNITS];
GLboolean textureGenT[CR_MAX_TEXTURE_UNITS];
GLboolean textureGenR[CR_MAX_TEXTURE_UNITS];
GLboolean textureGenQ[CR_MAX_TEXTURE_UNITS];
} CREnableStack;
typedef struct {
GLboolean enable1D[GLEVAL_TOT];
GLboolean enable2D[GLEVAL_TOT];
GLboolean autoNormal;
CREvaluator1D eval1D[GLEVAL_TOT];
CREvaluator2D eval2D[GLEVAL_TOT];
GLint un1D;
GLfloat u11D, u21D;
GLint un2D;
GLint vn2D;
GLfloat u12D, u22D;
GLfloat v12D, v22D;
} CREvalStack;
typedef struct {
GLboolean lighting;
GLboolean colorMaterial;
GLenum shadeModel;
GLenum colorMaterialMode;
GLenum colorMaterialFace;
GLcolorf ambient[2];
GLcolorf diffuse[2];
GLcolorf specular[2];
GLcolorf emission[2];
GLfloat shininess[2];
GLint indexes[2][3];
GLcolorf lightModelAmbient;
GLboolean lightModelLocalViewer;
GLboolean lightModelTwoSide;
#if defined(CR_EXT_separate_specular_color) || defined(CR_OPENGL_VERSION_1_2)
GLenum lightModelColorControlEXT;
#endif
CRLight *light;
} CRLightingStack;
typedef struct {
GLcolorf color;
GLint index;
GLfloat density;
GLfloat start;
GLfloat end;
GLint mode;
GLboolean enable;
} CRFogStack;
typedef struct {
GLenum perspectiveCorrection;
GLenum pointSmooth;
GLenum lineSmooth;
GLenum polygonSmooth;
GLenum fog;
#ifdef CR_EXT_clip_volume_hint
GLenum clipVolumeClipping;
#endif
#ifdef CR_ARB_texture_compression
GLenum textureCompression;
#endif
#ifdef CR_SGIS_generate_mipmap
GLenum generateMipmap;
#endif
} CRHintStack;
typedef struct {
GLboolean lineSmooth;
GLboolean lineStipple;
GLfloat width;
GLushort pattern;
GLint repeat;
} CRLineStack;
typedef struct {
GLuint base;
} CRListStack;
typedef struct {
GLboolean mapColor;
GLboolean mapStencil;
GLint indexShift;
GLint indexOffset;
GLcolorf scale;
GLfloat depthScale;
GLcolorf bias;
GLfloat depthBias;
GLfloat xZoom;
GLfloat yZoom;
GLenum readBuffer;
} CRPixelModeStack;
typedef struct {
GLboolean pointSmooth;
GLfloat pointSize;
#if CR_ARB_point_sprite
GLboolean pointSprite;
GLboolean coordReplacement[CR_MAX_TEXTURE_UNITS];
#endif
} CRPointStack;
typedef struct {
GLboolean polygonSmooth;
GLboolean polygonOffsetFill;
GLboolean polygonOffsetLine;
GLboolean polygonOffsetPoint;
GLboolean polygonStipple;
GLboolean cullFace;
GLfloat offsetFactor;
GLfloat offsetUnits;
GLenum cullFaceMode;
GLenum frontFace;
GLenum frontMode;
GLenum backMode;
} CRPolygonStack;
typedef struct {
GLint pattern[32];
} CRPolygonStippleStack;
typedef struct {
GLboolean scissorTest;
GLint scissorX;
GLint scissorY;
GLsizei scissorW;
GLsizei scissorH;
} CRScissorStack;
typedef struct {
GLboolean stencilTest;
GLenum func;
GLint mask;
GLint ref;
GLenum fail;
GLenum passDepthFail;
GLenum passDepthPass;
GLint clearValue;
GLint writeMask;
} CRStencilBufferStack_v_33;
typedef struct {
/* true if stencil test is enabled */
GLboolean stencilTest;
/* true if GL_EXT_stencil_two_side is enabled (glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT)) */
GLboolean stencilTwoSideEXT;
/* GL_FRONT or GL_BACK */
GLenum activeStencilFace;
GLint clearValue;
GLint writeMask;
CRStencilBufferState buffers[CRSTATE_STENCIL_BUFFER_COUNT];
} CRStencilBufferStack;
typedef struct {
#if 111
GLuint curTextureUnit;
CRTextureUnit unit[CR_MAX_TEXTURE_UNITS];
#else
GLboolean enabled1D[CR_MAX_TEXTURE_UNITS];
GLboolean enabled2D[CR_MAX_TEXTURE_UNITS];
GLboolean enabled3D[CR_MAX_TEXTURE_UNITS];
# ifdef CR_ARB_texture_cube_map
GLboolean enabledCubeMap[CR_MAX_TEXTURE_UNITS];
# endif
CRTextureObj *current1D[CR_MAX_TEXTURE_UNITS];
CRTextureObj *current2D[CR_MAX_TEXTURE_UNITS];
CRTextureObj *current3D[CR_MAX_TEXTURE_UNITS];
# ifdef CR_ARB_texture_cube_map
CRTextureObj *currentCubeMap[CR_MAX_TEXTURE_UNITS];
# endif
GLcolorf borderColor[4]; /* 4 = 1D, 2D, 3D and cube map textures */
GLenum minFilter[4];
GLenum magFilter[4];
GLenum wrapS[4];
GLenum wrapT[4];
# ifdef CR_OPENGL_VERSION_1_2
GLenum wrapR[4];
GLfloat priority[4];
GLfloat minLod[4];
GLfloat maxLod[4];
GLint baseLevel[4];
GLint maxLevel[4];
# endif
GLuint curTextureUnit;
GLenum envMode[CR_MAX_TEXTURE_UNITS];
GLcolorf envColor[CR_MAX_TEXTURE_UNITS];
GLtexcoordb textureGen[CR_MAX_TEXTURE_UNITS];
GLvectorf objSCoeff[CR_MAX_TEXTURE_UNITS];
GLvectorf objTCoeff[CR_MAX_TEXTURE_UNITS];
GLvectorf objRCoeff[CR_MAX_TEXTURE_UNITS];
GLvectorf objQCoeff[CR_MAX_TEXTURE_UNITS];
GLvectorf eyeSCoeff[CR_MAX_TEXTURE_UNITS];
GLvectorf eyeTCoeff[CR_MAX_TEXTURE_UNITS];
GLvectorf eyeRCoeff[CR_MAX_TEXTURE_UNITS];
GLvectorf eyeQCoeff[CR_MAX_TEXTURE_UNITS];
GLtexcoorde gen[CR_MAX_TEXTURE_UNITS];
#endif
} CRTextureStack;
typedef struct {
GLenum matrixMode;
GLvectord *clipPlane;
GLboolean *clip;
GLboolean normalize;
#ifdef CR_OPENGL_VERSION_1_2
GLboolean rescaleNormals;
#endif
} CRTransformStack;
typedef struct {
GLint viewportX;
GLint viewportY;
GLint viewportW;
GLint viewportH;
GLclampd nearClip;
GLclampd farClip;
} CRViewportStack;
typedef struct {
GLint attribStackDepth;
CRbitvalue pushMaskStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint accumBufferStackDepth;
CRAccumBufferStack accumBufferStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint colorBufferStackDepth;
CRColorBufferStack colorBufferStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint currentStackDepth;
CRCurrentStack currentStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint depthBufferStackDepth;
CRDepthBufferStack depthBufferStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint enableStackDepth;
CREnableStack enableStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint evalStackDepth;
CREvalStack evalStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint fogStackDepth;
CRFogStack fogStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint hintStackDepth;
CRHintStack hintStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint lightingStackDepth;
CRLightingStack lightingStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint lineStackDepth;
CRLineStack lineStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint listStackDepth;
CRListStack listStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint pixelModeStackDepth;
CRPixelModeStack pixelModeStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint pointStackDepth;
CRPointStack pointStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint polygonStackDepth;
CRPolygonStack polygonStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint polygonStippleStackDepth;
CRPolygonStippleStack polygonStippleStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint scissorStackDepth;
CRScissorStack scissorStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint stencilBufferStackDepth;
CRStencilBufferStack stencilBufferStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint textureStackDepth;
CRTextureStack textureStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint transformStackDepth;
CRTransformStack transformStack[CR_MAX_ATTRIB_STACK_DEPTH];
GLint viewportStackDepth;
CRViewportStack viewportStack[CR_MAX_ATTRIB_STACK_DEPTH];
} CRAttribState;
DECLEXPORT(void) crStateAttribInit(CRAttribState *a);
/* No diff! */
DECLEXPORT(void) crStateAttribSwitch(CRAttribBits *bb, CRbitvalue *bitID,
CRContext *fromCtx, CRContext *toCtx);
#ifdef __cplusplus
}
#endif
#endif /* CR_STATE_ATTRIB_H */