6 #include "arraystate.h"
7 #include "bufferstate.h"
9 #include "programstate.h"
10 #include "texturestate.h"
21 union { float x, r, s; };
22 union { float y, g, t; };
23 union { float z, b, p; };
24 union { float w, a, q; };
30 Tracks OpenGL state based on the command stream. This class is essentially a
31 (partial) OpenGL implementation in itself.
36 typedef std::map<unsigned, TextureState> TextureMap;
37 typedef std::map<unsigned, BufferState> BufferMap;
38 typedef std::map<unsigned, ShaderState> ShaderMap;
39 typedef std::map<unsigned, ProgramState> ProgramMap;
44 std::vector<Vector4> texcoord;
47 unsigned client_active_tex;
49 std::vector<TexUnitState> texunits;
51 BufferState *array_buffer;
52 BufferState *element_buffer;
53 BufferState *uniform_buffer;
54 std::vector<BufferBindingState> uniform_bind_points;
55 ArrayState vertex_array;
56 ArrayState normal_array;
57 ArrayState color_array;
58 std::vector<ArrayState> texcoord_arrays;
59 std::vector<ArrayState> attrib_arrays;
67 int decode(const char *, unsigned);
70 static void glGetIntegerv(void *, GLenum, int *);
73 unsigned get_max_texture_units() const { return texunits.size(); }
74 unsigned get_max_vertex_attribs() const { return attrib_arrays.size(); }
75 unsigned get_max_uniform_buffer_bindings() const { return uniform_bind_points.size(); }
78 bool &get_boolean_state(GLenum);
79 static void glEnableClientState(void *, GLenum);
80 static void glDisableClientState(void *, GLenum);
82 static void glColor3f(void *, float, float, float);
83 static void glColor4f(void *, float, float, float, float);
84 static void glNormal3f(void *, float, float, float);
85 static void glTexCoord1f(void *, float);
86 static void glTexCoord2f(void *, float, float);
87 static void glTexCoord3f(void *, float, float, float);
88 static void glTexCoord4f(void *, float, float, float, float);
89 static void glMultiTexCoord4f(void *, unsigned, float, float, float, float);
92 const Vector4 &get_color() const { return color; }
93 const Vector4 &get_texcoord(unsigned i) const { return texcoord[i]; }
94 const Vector3 &get_normal() const { return normal; }
97 static void glVertexPointer(void *, int, GLenum, int, const void *);
98 static void glNormalPointer(void *, GLenum, int, const void *);
99 static void glColorPointer(void *, int, GLenum, int, const void *);
100 static void glClientActiveTexture(void *, unsigned);
101 static void glTexCoordPointer(void *, int, GLenum, int, const void *);
102 static void glEnableVertexAttribArray(void *, unsigned);
103 static void glDisableVertexAttribArray(void *, unsigned);
104 static void glVertexAttribPointer(void *, unsigned, int, GLenum, unsigned char, int, const void *);
107 const ArrayState &get_array(GLenum) const;
108 const ArrayState &get_texture_coord_array(unsigned) const;
109 const ArrayState &get_attrib_array(unsigned) const;
112 static void glDrawElements(void *, GLenum, int, GLenum, const void *);
113 static void glDrawRangeElements(void *, GLenum, unsigned, unsigned, int, GLenum, const void *);
115 void set_current_buffer(GLenum, unsigned);
116 BufferState *get_buffer_object(unsigned);
117 BufferState *get_current_buffer(GLenum);
118 BufferBindingState *get_buffer_binding(GLenum, unsigned);
120 static void glBindBuffer(void *, GLenum, unsigned);
121 static void glBindBufferBase(void *, GLenum, unsigned, unsigned);
122 static void glBindBufferRange(void *, GLenum, unsigned, unsigned, int, int);
123 static void glBufferData(void *, GLenum, int, const void *, GLenum);
124 static void glBufferSubData(void *, GLenum, int, int, const void *);
125 static void glDeleteBuffers(void *, int, const unsigned *);
128 const BufferMap &get_buffers() const { return buffers; }
129 const BufferState &get_buffer(unsigned) const;
130 const BufferState *get_current_buffer(GLenum) const;
131 const BufferBindingState &get_buffer_binding(GLenum, unsigned) const;
134 void set_current_texture(GLenum, unsigned);
135 TextureState *get_current_texture(GLenum);
137 static void glActiveTexture(void *, unsigned);
138 static void glBindTexture(void *, GLenum, unsigned);
139 static void glTexImage2D(void *, GLenum, int, int, int, int, int, GLenum, GLenum, const void *);
140 static void glTexParameteri(void *, GLenum, GLenum, int);
141 static void glTexParameteriv(void *, GLenum, GLenum, const int *);
142 static void glDeleteTextures(void *, int, const unsigned *);
145 const TextureMap &get_textures() const { return textures; }
146 const TextureState &get_texture(unsigned) const;
147 const TexUnitState &get_texture_unit(unsigned i) const { return texunits[i]; }
150 ShaderState *get_shader(unsigned, bool);
151 void delete_shader(unsigned);
152 ProgramState *get_program(unsigned, bool);
153 void delete_program(unsigned);
155 static void glCreateShader(void *, unsigned, GLenum);
156 static void glShaderSource(void *, unsigned, int, const char **, const int *);
157 static void glCompileShader(void *, unsigned);
158 static void glGetShaderiv(void *, unsigned, GLenum, int *);
159 static void glGetShaderInfoLog(void *, unsigned, int, int *, char *);
160 static void glDeleteShader(void *, unsigned);
161 static void glCreateProgram(void *, unsigned);
162 static void glAttachShader(void *, unsigned, unsigned);
163 static void glLinkProgram(void *, unsigned);
164 static void glGetProgramiv(void *, unsigned, GLenum, int *);
165 static void glGetProgramInfoLog(void *, unsigned, int, int *, char *);
166 static void glDeleteProgram(void *, unsigned);
167 static void glDeleteObjectARB(void *, unsigned);
168 static void glGetObjectParameterivARB(void *, unsigned, GLenum, int *);
169 static void glGetInfoLogARB(void *, unsigned, int, int *, char *);
172 const ShaderMap &get_shaders() const { return shaders; }
173 const ShaderState &get_shader(unsigned) const;
174 const ProgramMap &get_programs() const { return programs; }
175 const ProgramState &get_program(unsigned) const;