version 2.8
arrays.c
1 #include "zgl.h"
2 #include <stdio.h>
3 
4 #define VERTEX_ARRAY 0x0001
5 #define COLOR_ARRAY 0x0002
6 #define NORMAL_ARRAY 0x0004
7 #define TEXCOORD_ARRAY 0x0008
8 
9 void
10 glopArrayElement(GLContext *c, GLParam *param)
11 {
12  int i;
13  int states = c->client_states;
14  int idx = param[1].i;
15 
16  if (states & COLOR_ARRAY) {
17  GLParam p[5];
18  int size = c->color_array_size;
19  i = idx * (size + c->color_array_stride);
20  p[1].f = c->color_array[i];
21  p[2].f = c->color_array[i+1];
22  p[3].f = c->color_array[i+2];
23  p[4].f = size > 3 ? c->color_array[i+3] : 1.0f;
24  glopColor(c, p);
25  }
26  if (states & NORMAL_ARRAY) {
27  i = idx * (3 + c->normal_array_stride);
28  c->current_normal.X = c->normal_array[i];
29  c->current_normal.Y = c->normal_array[i+1];
30  c->current_normal.Z = c->normal_array[i+2];
31  c->current_normal.Z = 0.0f;
32  }
33  if (states & TEXCOORD_ARRAY) {
34  int size = c->texcoord_array_size;
35  i = idx * (size + c->texcoord_array_stride);
36  c->current_tex_coord.X = c->texcoord_array[i];
37  c->current_tex_coord.Y = c->texcoord_array[i+1];
38  c->current_tex_coord.Z = size > 2 ? c->texcoord_array[i+2] : 0.0f;
39  c->current_tex_coord.W = size > 3 ? c->texcoord_array[i+3] : 1.0f;
40  }
41  if (states & VERTEX_ARRAY) {
42  GLParam p[5];
43  int size = c->vertex_array_size;
44  i = idx * (size + c->vertex_array_stride);
45  p[1].f = c->vertex_array[i];
46  p[2].f = c->vertex_array[i+1];
47  p[3].f = size > 2 ? c->vertex_array[i+2] : 0.0f;
48  p[4].f = size > 3 ? c->vertex_array[i+3] : 1.0f;
49  glopVertex(c, p);
50  }
51 }
52 
53 void
54 glArrayElement(GLint i)
55 {
56  GLParam p[2];
57  p[0].op = OP_ArrayElement;
58  p[1].i = i;
59  gl_add_op(p);
60 }
61 
62 
63 void
64 glopEnableClientState(GLContext *c, GLParam *p)
65 {
66  c->client_states |= p[1].i;
67 }
68 
69 void
70 glEnableClientState(GLenum array)
71 {
72  GLParam p[2];
73  p[0].op = OP_EnableClientState;
74 
75  switch(array) {
76  case GL_VERTEX_ARRAY:
77  p[1].i = VERTEX_ARRAY;
78  break;
79  case GL_NORMAL_ARRAY:
80  p[1].i = NORMAL_ARRAY;
81  break;
82  case GL_COLOR_ARRAY:
83  p[1].i = COLOR_ARRAY;
84  break;
85  case GL_TEXTURE_COORD_ARRAY:
86  p[1].i = TEXCOORD_ARRAY;
87  break;
88  default:
89  gl_assert(0);
90  break;
91  }
92  gl_add_op(p);
93 }
94 
95 void
96 glopDisableClientState(GLContext *c, GLParam *p)
97 {
98  c->client_states &= p[1].i;
99 }
100 
101 void
102 glDisableClientState(GLenum array)
103 {
104  GLParam p[2];
105  p[0].op = OP_DisableClientState;
106 
107  switch(array) {
108  case GL_VERTEX_ARRAY:
109  p[1].i = ~VERTEX_ARRAY;
110  break;
111  case GL_NORMAL_ARRAY:
112  p[1].i = ~NORMAL_ARRAY;
113  break;
114  case GL_COLOR_ARRAY:
115  p[1].i = ~COLOR_ARRAY;
116  break;
117  case GL_TEXTURE_COORD_ARRAY:
118  p[1].i = ~TEXCOORD_ARRAY;
119  break;
120  default:
121  gl_assert(0);
122  break;
123  }
124  gl_add_op(p);
125 }
126 
127 void
128 glopVertexPointer(GLContext *c, GLParam *p)
129 {
130  c->vertex_array_size = p[1].i;
131  c->vertex_array_stride = p[2].i;
132  c->vertex_array = p[3].p;
133 }
134 
135 void
136 glVertexPointer(GLint size, GLenum type, GLsizei stride,
137  const GLvoid *pointer)
138 {
139  GLParam p[4];
140  gl_assert(type == GL_FLOAT);
141  p[0].op = OP_VertexPointer;
142  p[1].i = size;
143  p[2].i = stride;
144  p[3].p = (void*)pointer;
145  gl_add_op(p);
146 }
147 
148 void
149 glopColorPointer(GLContext *c, GLParam *p)
150 {
151  c->color_array_size = p[1].i;
152  c->color_array_stride = p[2].i;
153  c->color_array = p[3].p;
154 }
155 
156 void
157 glColorPointer(GLint size, GLenum type, GLsizei stride,
158  const GLvoid *pointer)
159 {
160  GLParam p[4];
161  gl_assert(type == GL_FLOAT);
162  p[0].op = OP_ColorPointer;
163  p[1].i = size;
164  p[2].i = stride;
165  p[3].p = (void*)pointer;
166  gl_add_op(p);
167 }
168 
169 void
170 glopNormalPointer(GLContext *c, GLParam *p)
171 {
172  c->normal_array_stride = p[1].i;
173  c->normal_array = p[2].p;
174 }
175 
176 void
177 glNormalPointer(GLenum type, GLsizei stride,
178  const GLvoid *pointer)
179 {
180  GLParam p[3];
181  gl_assert(type == GL_FLOAT);
182  p[0].op = OP_NormalPointer;
183  p[1].i = stride;
184  p[2].p = (void*)pointer;
185  gl_add_op(p);
186 }
187 
188 void
189 glopTexCoordPointer(GLContext *c, GLParam *p)
190 {
191  c->texcoord_array_size = p[1].i;
192  c->texcoord_array_stride = p[2].i;
193  c->texcoord_array = p[3].p;
194 }
195 
196 void
197 glTexCoordPointer(GLint size, GLenum type, GLsizei stride,
198  const GLvoid *pointer)
199 {
200  GLParam p[4];
201  gl_assert(type == GL_FLOAT);
202  p[0].op = OP_TexCoordPointer;
203  p[1].i = size;
204  p[2].i = stride;
205  p[3].p = (void*)pointer;
206  gl_add_op(p);
207 }