]> git.tdb.fi Git - gldbg.git/blob - source/glstate.h
Track vertex array state
[gldbg.git] / source / glstate.h
1 /* $Id$
2
3 This file is part of gldbg
4 Copyright © 2009-2010  Mikko Rasa, Mikkosoft Productions
5 Distributed under the GPL
6 */
7
8 #ifndef GLSTATE_H_
9 #define GLSTATE_H_
10
11 #include <map>
12 #include <vector>
13 #include "arraystate.h"
14 #include "bufferstate.h"
15 #include "gldecoder.h"
16 #include "texturestate.h"
17
18 struct Vector3
19 {
20         float x, y, z;
21
22         Vector3();
23 };
24
25 struct Vector4
26 {
27         union { float x, r, s; };
28         union { float y, g, t; };
29         union { float z, b, p; };
30         union { float w, a, q; };
31
32         Vector4();
33 };
34
35 /**
36 Tracks OpenGL state based on the command stream.  This class is essentially a
37 (partial) OpenGL implementation in itself.
38
39 XXX Should determine the number of texture units the target implementation
40 actually supports.
41 */
42 class GlState
43 {
44 public:
45         typedef std::map<unsigned, TextureState> TextureMap;
46         typedef std::map<unsigned, BufferState> BufferMap;
47
48 private:
49         GlDecoder *decoder;
50         Vector4 color;
51         Vector4 texcoord[8];
52         Vector3 normal;
53         unsigned active_tex;
54         unsigned client_active_tex;
55         TextureMap textures;
56         TexUnitState texunits[8];
57         BufferMap buffers;
58         BufferState *array_buffer;
59         BufferState *element_buffer;
60         ArrayState vertex_array;
61         ArrayState normal_array;
62         ArrayState color_array;
63         ArrayState texcoord_arrays[8];
64         std::map<unsigned, ArrayState> attrib_arrays;
65
66 public:
67         GlState();
68         ~GlState();
69
70         int decode(const char *, unsigned);
71         const Vector4 &get_color() const { return color; }
72         const Vector4 &get_texcoord(unsigned i) const { return texcoord[i]; }
73         const Vector3 &get_normal() const { return normal; }
74         const TextureMap &get_textures() const { return textures; }
75         const TextureState &get_texture(unsigned) const;
76         const TexUnitState &get_texture_unit(unsigned i) const { return texunits[i]; }
77         const BufferMap &get_buffers() const { return buffers; }
78         const BufferState &get_buffer(unsigned) const;
79         const BufferState *get_current_buffer(GLenum) const;
80         const ArrayState &get_array(GLenum) const;
81         const ArrayState &get_texture_coord_array(unsigned) const;
82         const ArrayState &get_attrib_array(unsigned) const;
83 private:
84         bool &get_boolean_state(GLenum);
85         TextureState *get_current_texture(GLenum);
86         BufferState *get_current_buffer(GLenum);
87         void set_current_texture(GLenum, unsigned);
88         void set_current_buffer(GLenum, unsigned);
89
90         static void glEnableClientState(void *, GLenum);
91         static void glDisableClientState(void *, GLenum);
92         static void glEnableVertexAttribArray(void *, unsigned);
93         static void glDisableVertexAttribArray(void *, unsigned);
94
95         static void glColor3f(void *, float, float, float);
96         static void glColor4f(void *, float, float, float, float);
97         static void glNormal3f(void *, float, float, float);
98         static void glTexCoord1f(void *, float);
99         static void glTexCoord2f(void *, float, float);
100         static void glTexCoord3f(void *, float, float, float);
101         static void glTexCoord4f(void *, float, float, float, float);
102         static void glMultiTexCoord4f(void *, unsigned, float, float, float, float);
103
104         static void glActiveTexture(void *, unsigned);
105         static void glBindTexture(void *, GLenum, unsigned);
106         static void glTexImage2D(void *, GLenum, int, int, int, int, int, GLenum, GLenum, const void *);
107         static void glTexParameteri(void *, GLenum, GLenum, int);
108         static void glTexParameteriv(void *, GLenum, GLenum, const int *);
109         static void glDeleteTextures(void *, int, const unsigned *);
110
111         static void glVertexPointer(void *, int, GLenum, int, const void *);
112         static void glNormalPointer(void *, GLenum, int, const void *);
113         static void glColorPointer(void *, int, GLenum, int, const void *);
114         static void glClientActiveTexture(void *, unsigned);
115         static void glTexCoordPointer(void *, int, GLenum, int, const void *);
116         static void glVertexAttribPointer(void *, unsigned, int, GLenum, int, int, const void *);
117
118         static void glBindBuffer(void *, GLenum, unsigned);
119         static void glBufferData(void *, GLenum, int, const void *, GLenum);
120         static void glBufferSubData(void *, GLenum, int, int, const void *);
121         static void glDeleteBuffers(void *, int, const unsigned *);
122 };
123
124 #endif