DEADSOFTWARE

Fix typo in nanoGL_GetProcAddress, return 1 in nanoGL_Init() if wrapper already initi...
[nanogl.git] / nanoWrap.cpp
1 /*
2 Copyright (C) 2007-2009 Olli Hinkka
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 See the GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20 /*
21 #include <e32def.h>
22 #include <e32std.h>
23 */
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
29 #include "gl.h"
30 #include "glesinterface.h"
31 #include "nanogl.h"
33 #define GL_TEXTURE0_ARB 0x84C0
34 #define GL_TEXTURE1_ARB 0x84C1
36 struct nanoState
37 {
38 GLboolean alpha_test;
39 GLboolean blend;
40 GLboolean clip_planei;
41 GLboolean color_logic_op;
42 GLboolean color_material;
43 GLboolean cull_face;
44 GLboolean depth_test;
45 GLboolean dither;
46 GLboolean fog;
47 GLboolean lighti;
48 GLboolean lighting;
49 GLboolean line_smooth;
50 GLboolean matrix_palette_oes;
51 GLboolean multisample;
52 GLboolean normalize;
53 GLboolean point_smooth;
54 GLboolean point_sprite_oes;
55 GLboolean polygon_offset_fill;
56 GLboolean rescale_normal;
57 GLboolean sample_alpha_to_coverage;
58 GLboolean sample_alpha_to_one;
59 GLboolean sample_coverage;
60 GLboolean scissor_test;
61 GLboolean stencil_test;
62 GLboolean depthmask;
63 GLclampf depth_range_near;
64 GLclampf depth_range_far;
65 GLenum depth_func;
66 GLenum cullface;
67 GLenum shademodel;
68 GLenum sfactor;
69 GLenum dfactor;
70 GLenum matrixmode;
71 };
73 static struct nanoState nanoglState;
75 static struct nanoState nanoglInitState =
76 {
77 GL_FALSE,
78 GL_FALSE,
79 GL_FALSE,
80 GL_FALSE,
81 GL_FALSE,
82 GL_FALSE,
83 GL_FALSE,
84 GL_TRUE,
85 GL_FALSE,
86 GL_FALSE,
87 GL_FALSE,
88 GL_FALSE,
89 GL_FALSE,
90 GL_TRUE,
91 GL_FALSE,
92 GL_FALSE,
93 GL_FALSE,
94 GL_FALSE,
95 GL_FALSE,
96 GL_FALSE,
97 GL_FALSE,
98 GL_FALSE,
99 GL_FALSE,
100 GL_FALSE,
101 GL_TRUE,
102 0.0f,
103 1.0f,
104 GL_LESS,
105 GL_BACK,
106 GL_SMOOTH,
107 GL_ONE,
108 GL_ZERO,
109 GL_MODELVIEW,
110 };
112 struct booleanstate
114 GLboolean value;
115 GLboolean changed;
116 };
118 struct floatstate
120 GLfloat value;
121 GLboolean changed;
122 };
124 struct uintstate
126 GLuint value;
127 GLboolean changed;
128 };
130 struct ptrstate
132 GLint size;
133 GLenum type;
134 GLsizei stride;
135 GLvoid* ptr;
136 GLboolean changed;
137 GLboolean enabled;
138 };
141 struct nanotmuState
143 struct booleanstate texture_2d;
144 struct floatstate texture_env_mode;
145 struct uintstate boundtexture;
146 struct ptrstate vertex_array;
147 struct ptrstate color_array;
148 struct ptrstate texture_coord_array;
149 };
151 static struct nanotmuState tmuState0;
152 static struct nanotmuState tmuState1;
154 static struct nanotmuState tmuInitState =
156 {GL_FALSE, GL_FALSE},
157 {GL_MODULATE,GL_FALSE},
158 {0x7fffffff,GL_FALSE},
159 {4,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE},
160 {4,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE},
161 {4,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE},
162 };
164 static struct nanotmuState* activetmuState = &tmuState0;
166 extern "C++" GlESInterface* glEsImpl;
168 static GLenum wrapperPrimitiveMode = GL_QUADS;
169 GLboolean useTexCoordArray = GL_FALSE;
170 static GLenum activetmu = GL_TEXTURE0;
171 static GLenum clientactivetmu = GL_TEXTURE0;
173 #if defined(__MULTITEXTURE_SUPPORT__)
174 GLboolean useMultiTexCoordArray = GL_FALSE;
175 #endif
178 #if !defined (__WINS__)
179 //#define __FORCEINLINE __forceinline
180 #define __FORCEINLINE inline
181 #else
182 #define __FORCEINLINE
183 #endif
185 static GLboolean delayedttmuchange = GL_FALSE;
186 static GLenum delayedtmutarget = GL_TEXTURE0;
188 struct VertexAttrib
190 float x;
191 float y;
192 float z;
193 #if !defined(__MULTITEXTURE_SUPPORT__)
194 float padding;
195 #endif
196 unsigned char red;
197 unsigned char green;
198 unsigned char blue;
199 unsigned char alpha;
201 float s;
202 float t;
203 #if defined(__MULTITEXTURE_SUPPORT__)
204 float s_multi;
205 float t_multi;
206 #endif
207 };
209 static VertexAttrib vertexattribs[40000];
211 static GLushort indexArray[30000];
213 static GLuint vertexCount = 0;
214 static GLuint indexCount = 0;
215 static GLuint vertexMark = 0;
216 static int indexbase = 0;
218 static VertexAttrib* ptrVertexAttribArray = NULL;
219 static VertexAttrib* ptrVertexAttribArrayMark = NULL;
221 static VertexAttrib currentVertexAttrib;
222 #if defined(__MULTITEXTURE_SUPPORT__)
223 static VertexAttrib currentVertexAttribInit = {0.0f,0.0f,0.0f,
224 255,255,255,255,
225 0.0f,0.0f,
226 0.0f,0.0f
227 };
228 #else
229 static VertexAttrib currentVertexAttribInit = {0.0f,0.0f,0.0f,0.0f,
230 255,255,255,255,
231 0.0f,0.0f,
232 };
233 #endif
234 static GLushort* ptrIndexArray = NULL;
236 static GLboolean arraysValid = GL_FALSE;
238 void InitGLStructs()
240 ptrVertexAttribArray = vertexattribs;
241 ptrVertexAttribArrayMark = ptrVertexAttribArray;
242 ptrIndexArray = indexArray;
244 memcpy(&nanoglState, &nanoglInitState, sizeof(struct nanoState));
245 memcpy(&tmuState0,&tmuInitState,sizeof(struct nanotmuState));
246 memcpy(&tmuState1,&tmuInitState,sizeof(struct nanotmuState));
247 memcpy(&currentVertexAttrib,&currentVertexAttribInit,sizeof(struct VertexAttrib));
249 activetmuState = &tmuState0;
250 wrapperPrimitiveMode = GL_QUADS;
251 useTexCoordArray = GL_FALSE;
252 activetmu = GL_TEXTURE0;
253 clientactivetmu = GL_TEXTURE0;
254 delayedttmuchange = GL_FALSE;
255 delayedtmutarget = GL_TEXTURE0;
256 vertexCount = 0;
257 indexCount = 0;
258 vertexMark = 0;
259 indexbase = 0;
260 arraysValid = GL_FALSE;
263 void ResetNanoState()
266 if (tmuState0.color_array.enabled)
268 glEsImpl->glEnableClientState(GL_COLOR_ARRAY);
270 else
272 glEsImpl->glDisableClientState(GL_COLOR_ARRAY);
275 if (tmuState0.vertex_array.enabled)
277 glEsImpl->glEnableClientState(GL_VERTEX_ARRAY);
279 else
281 glEsImpl->glDisableClientState(GL_VERTEX_ARRAY);
284 if (tmuState0.texture_coord_array.enabled)
286 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
288 else
290 glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
292 glEsImpl->glVertexPointer(tmuState0.vertex_array.size,
293 tmuState0.vertex_array.type,
294 tmuState0.vertex_array.stride,
295 tmuState0.vertex_array.ptr);
297 glEsImpl->glTexCoordPointer(tmuState0.texture_coord_array.size,
298 tmuState0.texture_coord_array.type,
299 tmuState0.texture_coord_array.stride,
300 tmuState0.texture_coord_array.ptr);
302 glEsImpl->glColorPointer(tmuState0.color_array.size,
303 tmuState0.color_array.type,
304 tmuState0.color_array.stride,
305 tmuState0.color_array.ptr);
307 glEsImpl->glMatrixMode(nanoglState.matrixmode);
311 glEsImpl->glColor4f (currentVertexAttrib.red, currentVertexAttrib.green, currentVertexAttrib.blue, currentVertexAttrib.alpha);
313 glEsImpl->glBlendFunc(nanoglState.sfactor, nanoglState.dfactor);
315 //glEsImpl->glBindTexture(GL_TEXTURE_2D, stackTextureState);
317 glEsImpl->glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, activetmuState->texture_env_mode.value);
319 arraysValid = GL_FALSE;
322 void FlushOnStateChange()
324 if (delayedttmuchange)
326 delayedttmuchange = GL_FALSE;
327 glEsImpl->glActiveTexture(delayedtmutarget);
330 if (!vertexCount)
331 return;
333 if (!arraysValid)
335 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
336 glEsImpl->glVertexPointer(3, GL_FLOAT, sizeof(VertexAttrib), &vertexattribs[0].x);
337 glEsImpl->glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(VertexAttrib), &vertexattribs[0].red);
338 glEsImpl->glTexCoordPointer(2, GL_FLOAT, sizeof(VertexAttrib), &vertexattribs[0].s);
339 glEsImpl->glEnableClientState(GL_VERTEX_ARRAY);
340 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
341 glEsImpl->glEnableClientState(GL_COLOR_ARRAY);
342 #if defined(__MULTITEXTURE_SUPPORT__)
343 glEsImpl->glClientActiveTexture(GL_TEXTURE1);
344 glEsImpl->glTexCoordPointer(2, GL_FLOAT, sizeof(VertexAttrib), &vertexattribs[0].s_multi);
345 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
346 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
347 #endif
348 arraysValid = GL_TRUE;
351 glEsImpl->glDrawElements( GL_TRIANGLES,vertexCount,GL_UNSIGNED_SHORT, indexArray );
354 #if defined(__MULTITEXTURE_SUPPORT__)
355 useMultiTexCoordArray = GL_FALSE;
356 #endif
357 vertexCount = 0;
358 indexCount = 0;
359 ptrVertexAttribArray = vertexattribs;
360 ptrVertexAttribArrayMark = ptrVertexAttribArray;
361 ptrIndexArray = indexArray;
362 useTexCoordArray = GL_FALSE;
364 void nanoGL_Flush()
366 FlushOnStateChange();
368 void nanoGL_Reset()
370 ResetNanoState();
372 void glBegin(GLenum mode)
374 wrapperPrimitiveMode = mode;
375 vertexMark = vertexCount;
376 ptrVertexAttribArrayMark = ptrVertexAttribArray;
377 indexbase = indexCount;
380 void glEnd(void)
382 vertexCount+=((unsigned char*)ptrVertexAttribArray-(unsigned char*)ptrVertexAttribArrayMark)/sizeof(VertexAttrib);
383 if (vertexCount < 3)
385 return;
387 switch (wrapperPrimitiveMode)
389 case GL_QUADS:
391 *ptrIndexArray++ = indexCount;
392 *ptrIndexArray++ = indexCount+1;
393 *ptrIndexArray++ = indexCount+2;
394 *ptrIndexArray++ = indexCount;
395 *ptrIndexArray++ = indexCount+2;
396 *ptrIndexArray++ = indexCount+3;
397 indexCount+=4;
398 vertexCount+=2;
400 break;
401 case GL_TRIANGLES:
403 int vcount = (vertexCount-vertexMark)/3;
404 for (int count = 0; count < vcount; count++)
406 *ptrIndexArray++ = indexCount;
407 *ptrIndexArray++ = indexCount+1;
408 *ptrIndexArray++ = indexCount+2;
409 indexCount+=3;
412 break;
413 case GL_TRIANGLE_STRIP:
415 *ptrIndexArray++ = indexCount;
416 *ptrIndexArray++ = indexCount+1;
417 *ptrIndexArray++ = indexCount+2;
418 indexCount+=3;
419 int vcount = ((vertexCount-vertexMark)-3);
420 if (vcount && ((long)ptrIndexArray & 0x02))
422 *ptrIndexArray++ = indexCount-1; // 2
423 *ptrIndexArray++ = indexCount-2; // 1
424 *ptrIndexArray++ = indexCount; // 3
425 indexCount++;
426 vcount-=1;
427 int odd = vcount&1;
428 vcount/=2;
429 unsigned int* longptr = (unsigned int*) ptrIndexArray;
431 for (int count = 0; count < vcount; count++)
433 *(longptr++) = (indexCount-2) | ((indexCount-1)<<16);
434 *(longptr++) = (indexCount) | ((indexCount)<<16);
435 *(longptr++) = (indexCount-1) | ((indexCount+1)<<16);
436 indexCount+=2;
438 ptrIndexArray = (unsigned short*)(longptr);
439 if (odd)
441 *ptrIndexArray++ = indexCount-2; // 2
442 *ptrIndexArray++ = indexCount-1; // 1
443 *ptrIndexArray++ = indexCount; // 3
444 indexCount++;
447 else
449 //already aligned
450 int odd = vcount&1;
451 vcount/=2;
452 unsigned int* longptr = (unsigned int*) ptrIndexArray;
454 for (int count = 0; count < vcount; count++)
455 {
456 *(longptr++) = (indexCount-1) | ((indexCount-2)<<16);
457 *(longptr++) = (indexCount) | ((indexCount-1)<<16);
458 *(longptr++) = (indexCount) | ((indexCount+1)<<16);
459 indexCount+=2;
462 ptrIndexArray = (unsigned short*)(longptr);
463 if (odd)
466 *ptrIndexArray++ = indexCount-1; // 2
467 *ptrIndexArray++ = indexCount-2; // 1
468 *ptrIndexArray++ = indexCount; // 3
469 indexCount++;
471 }
472 vertexCount+=(vertexCount-vertexMark-3)*2;
474 break;
475 case GL_POLYGON:
476 case GL_TRIANGLE_FAN:
478 *ptrIndexArray++ = indexCount++;
479 *ptrIndexArray++ = indexCount++;
480 *ptrIndexArray++ = indexCount++;
481 int vcount = ((vertexCount-vertexMark)-3);
482 for (int count = 0; count < vcount; count++)
484 *ptrIndexArray++ = indexbase;
485 *ptrIndexArray++ = indexCount-1;
486 *ptrIndexArray++ = indexCount++;
487 vertexCount+=2;
489 }
490 break;
492 default:
493 break;
497 void glEnable (GLenum cap)
499 GLboolean statechanged = GL_FALSE;
500 switch(cap)
502 case GL_ALPHA_TEST:
504 if (!nanoglState.alpha_test)
506 nanoglState.alpha_test = GL_TRUE;
507 statechanged = GL_TRUE;
509 break;
511 case GL_BLEND:
513 if (!nanoglState.blend)
515 nanoglState.blend = GL_TRUE;
516 statechanged = GL_TRUE;
518 break;
520 //case GL_CLIP_PLANEi
521 case GL_COLOR_LOGIC_OP:
523 if (!nanoglState.color_logic_op)
525 nanoglState.color_logic_op = GL_TRUE;
526 statechanged = GL_TRUE;
528 break;
530 case GL_COLOR_MATERIAL:
532 if (!nanoglState.color_material)
534 nanoglState.color_material = GL_TRUE;
535 statechanged = GL_TRUE;
537 break;
539 case GL_CULL_FACE:
541 if (!nanoglState.cull_face)
543 nanoglState.cull_face = GL_TRUE;
544 statechanged = GL_TRUE;
546 break;
548 case GL_DEPTH_TEST:
550 if (!nanoglState.depth_test)
552 nanoglState.depth_test = GL_TRUE;
553 statechanged = GL_TRUE;
555 break;
557 case GL_DITHER:
559 if (!nanoglState.dither)
561 nanoglState.dither = GL_TRUE;
562 statechanged = GL_TRUE;
564 break;
566 case GL_FOG:
567 //case GL_LIGHTi
569 if (!nanoglState.fog)
571 nanoglState.fog = GL_TRUE;
572 statechanged = GL_TRUE;
574 break;
576 case GL_LIGHTING:
578 if (!nanoglState.lighting)
580 nanoglState.lighting = GL_TRUE;
581 statechanged = GL_TRUE;
583 break;
585 case GL_LINE_SMOOTH:
587 if (!nanoglState.line_smooth)
589 nanoglState.line_smooth = GL_TRUE;
590 statechanged = GL_TRUE;
592 break;
594 /* case GL_MATRIX_PALETTE_OES:
596 if (!nanoglState.matrix_palette_oes)
598 nanoglState.matrix_palette_oes = GL_TRUE;
599 statechanged = GL_TRUE;
601 break;
602 }*/
603 case GL_MULTISAMPLE:
605 if (!nanoglState.multisample)
607 nanoglState.multisample = GL_TRUE;
608 statechanged = GL_TRUE;
610 break;
612 case GL_NORMALIZE:
614 if (!nanoglState.normalize)
616 nanoglState.normalize = GL_TRUE;
617 statechanged = GL_TRUE;
619 break;
621 /* case GL_POINT_SPRITE_OES:
623 if (!nanoglState.point_sprite_oes)
625 nanoglState.point_sprite_oes = GL_TRUE;
626 statechanged = GL_TRUE;
628 break;
629 }*/
630 case GL_POLYGON_OFFSET_FILL:
632 if (!nanoglState.polygon_offset_fill)
634 nanoglState.polygon_offset_fill = GL_TRUE;
635 statechanged = GL_TRUE;
637 break;
639 case GL_RESCALE_NORMAL:
641 if (!nanoglState.rescale_normal)
643 nanoglState.rescale_normal = GL_TRUE;
644 statechanged = GL_TRUE;
646 break;
648 case GL_SAMPLE_ALPHA_TO_COVERAGE:
650 if (!nanoglState.sample_alpha_to_coverage)
652 nanoglState.sample_alpha_to_coverage = GL_TRUE;
653 statechanged = GL_TRUE;
655 break;
657 case GL_SAMPLE_ALPHA_TO_ONE:
659 if (!nanoglState.sample_alpha_to_one)
661 nanoglState.sample_alpha_to_one = GL_TRUE;
662 statechanged = GL_TRUE;
664 break;
666 case GL_SAMPLE_COVERAGE:
668 if (!nanoglState.sample_coverage)
670 nanoglState.sample_coverage = GL_TRUE;
671 statechanged = GL_TRUE;
673 break;
675 case GL_SCISSOR_TEST:
677 if (!nanoglState.scissor_test)
679 nanoglState.scissor_test = GL_TRUE;
680 statechanged = GL_TRUE;
682 break;
684 case GL_STENCIL_TEST:
686 return;
687 /* if (!nanoglState.stencil_test)
689 nanoglState.stencil_test = GL_TRUE;
690 statechanged = GL_TRUE;
691 }*/
692 break;
694 case GL_TEXTURE_2D:
696 if (!activetmuState->texture_2d.value)
698 FlushOnStateChange();
699 glEsImpl->glEnable(cap);
700 activetmuState->texture_2d.value = GL_TRUE;
701 return;
703 break;
705 default:
706 break;
709 if (statechanged)
711 FlushOnStateChange();
712 glEsImpl->glEnable(cap);
713 }
716 void glDisable (GLenum cap)
718 GLboolean statechanged = GL_FALSE;
719 switch(cap)
721 case GL_ALPHA_TEST:
723 if (nanoglState.alpha_test)
725 nanoglState.alpha_test = GL_FALSE;
726 statechanged = GL_TRUE;
728 break;
730 case GL_BLEND:
732 if (nanoglState.blend)
734 nanoglState.blend = GL_FALSE;
735 statechanged = GL_TRUE;
737 break;
739 //case GL_CLIP_PLANEi
740 case GL_COLOR_LOGIC_OP:
742 if (nanoglState.color_logic_op)
744 nanoglState.color_logic_op = GL_FALSE;
745 statechanged = GL_TRUE;
747 break;
749 case GL_COLOR_MATERIAL:
751 if (nanoglState.color_material)
753 nanoglState.color_material = GL_FALSE;
754 statechanged = GL_TRUE;
756 break;
758 case GL_CULL_FACE:
760 if (nanoglState.cull_face)
762 nanoglState.cull_face = GL_FALSE;
763 statechanged = GL_TRUE;
765 break;
767 case GL_DEPTH_TEST:
769 if (nanoglState.depth_test)
771 nanoglState.depth_test = GL_FALSE;
772 statechanged = GL_TRUE;
774 break;
776 case GL_DITHER:
778 if (nanoglState.dither)
780 nanoglState.dither = GL_FALSE;
781 statechanged = GL_TRUE;
783 break;
785 case GL_FOG:
786 //case GL_LIGHTi
788 if (nanoglState.fog)
790 nanoglState.fog = GL_FALSE;
791 statechanged = GL_TRUE;
793 break;
795 case GL_LIGHTING:
797 if (nanoglState.lighting)
799 nanoglState.lighting = GL_FALSE;
800 statechanged = GL_TRUE;
802 break;
804 case GL_LINE_SMOOTH:
806 if (nanoglState.line_smooth)
808 nanoglState.line_smooth = GL_FALSE;
809 statechanged = GL_TRUE;
811 break;
813 /* case GL_MATRIX_PALETTE_OES:
815 if (nanoglState.matrix_palette_oes)
817 nanoglState.matrix_palette_oes = GL_FALSE;
818 statechanged = GL_TRUE;
820 break;
821 }*/
822 case GL_MULTISAMPLE:
824 if (nanoglState.multisample)
826 nanoglState.multisample = GL_FALSE;
827 statechanged = GL_TRUE;
829 break;
831 case GL_NORMALIZE:
833 if (nanoglState.normalize)
835 nanoglState.normalize = GL_FALSE;
836 statechanged = GL_TRUE;
838 break;
840 /* case GL_POINT_SPRITE_OES:
842 if (nanoglState.point_sprite_oes)
844 nanoglState.point_sprite_oes = GL_FALSE;
845 statechanged = GL_TRUE;
847 break;
848 }*/
849 case GL_POLYGON_OFFSET_FILL:
851 if (nanoglState.polygon_offset_fill)
853 nanoglState.polygon_offset_fill = GL_FALSE;
854 statechanged = GL_TRUE;
856 break;
858 case GL_RESCALE_NORMAL:
860 if (nanoglState.rescale_normal)
862 nanoglState.rescale_normal = GL_FALSE;
863 statechanged = GL_TRUE;
865 break;
867 case GL_SAMPLE_ALPHA_TO_COVERAGE:
869 if (nanoglState.sample_alpha_to_coverage)
871 nanoglState.sample_alpha_to_coverage = GL_FALSE;
872 statechanged = GL_TRUE;
874 break;
876 case GL_SAMPLE_ALPHA_TO_ONE:
878 if (nanoglState.sample_alpha_to_one)
880 nanoglState.sample_alpha_to_one = GL_FALSE;
881 statechanged = GL_TRUE;
883 break;
885 case GL_SAMPLE_COVERAGE:
887 if (nanoglState.sample_coverage)
889 nanoglState.sample_coverage = GL_FALSE;
890 statechanged = GL_TRUE;
892 break;
894 case GL_SCISSOR_TEST:
896 if (nanoglState.scissor_test)
898 nanoglState.scissor_test = GL_FALSE;
899 statechanged = GL_TRUE;
901 break;
903 case GL_STENCIL_TEST:
905 return;
906 /* if (nanoglState.stencil_test)
908 nanoglState.stencil_test = GL_FALSE;
909 statechanged = GL_TRUE;
910 }*/
911 break;
913 case GL_TEXTURE_2D:
915 if (activetmuState->texture_2d.value)
917 FlushOnStateChange();
918 glEsImpl->glDisable(cap);
919 activetmuState->texture_2d.value = GL_FALSE;
920 return;
924 break;
926 default:
927 break;
930 if (statechanged)
932 FlushOnStateChange();
933 glEsImpl->glDisable(cap);
934 }
937 void glVertex2f(GLfloat x, GLfloat y)
939 glVertex3f(x,y,0.0f);
943 __FORCEINLINE unsigned int ClampTo255(float value)
945 unsigned int retval = (unsigned int)(value);
946 if (retval > 255)
948 retval = 255;
950 return retval;
953 void glColor3f( GLfloat red, GLfloat green, GLfloat blue)
955 currentVertexAttrib.red = (unsigned char)ClampTo255(red*255.0f);
956 currentVertexAttrib.green = (unsigned char)ClampTo255(green*255.0f);
957 currentVertexAttrib.blue = (unsigned char)ClampTo255(blue*255.0f);
958 currentVertexAttrib.alpha = 255;
962 void glTexCoord2fv( const GLfloat *v )
964 memcpy(&currentVertexAttrib.s, v, 2*sizeof(float));
968 void glTexCoord2f(GLfloat s, GLfloat t)
970 currentVertexAttrib.s = s;
971 currentVertexAttrib.t = t;
974 void glViewport (GLint x, GLint y, GLsizei width, GLsizei height)
976 FlushOnStateChange();
977 glEsImpl->glViewport(x,y,width,height);
980 void glLoadIdentity (void)
982 FlushOnStateChange();
983 glEsImpl->glLoadIdentity();
986 void glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
988 currentVertexAttrib.red = (unsigned char)ClampTo255(red*255.0f);
989 currentVertexAttrib.green = (unsigned char)ClampTo255(green*255.0f);
990 currentVertexAttrib.blue = (unsigned char)ClampTo255(blue*255.0f);
991 currentVertexAttrib.alpha = (unsigned char)ClampTo255(alpha*255.0f);
994 void glOrtho (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
996 FlushOnStateChange();
997 glEsImpl->glOrthof(left,right,bottom,top, zNear,zFar);
1000 void glMatrixMode (GLenum mode)
1002 if (nanoglState.matrixmode == mode)
1004 return;
1006 nanoglState.matrixmode = mode;
1007 FlushOnStateChange();
1008 glEsImpl->glMatrixMode(mode);
1011 void glTexParameterf (GLenum target, GLenum pname, GLfloat param)
1013 if (pname == GL_TEXTURE_BORDER_COLOR)
1015 return; // not supported by opengl es
1017 if ( (pname == GL_TEXTURE_WRAP_S ||
1018 pname == GL_TEXTURE_WRAP_T) &&
1019 param == GL_CLAMP)
1021 param = 0x812F;
1024 FlushOnStateChange();
1025 glEsImpl->glTexParameterf(target, pname,param);
1028 void glTexParameterfv( GLenum target, GLenum pname, const GLfloat *params)
1030 glTexParameterf(target, pname, params[0]);
1033 void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1035 FlushOnStateChange();
1036 internalformat = format;
1037 glEsImpl->glTexImage2D(target, level, internalformat, width, height,border,format,type,pixels);
1040 void glDrawBuffer(GLenum /*mode*/)
1044 void glTranslatef (GLfloat x, GLfloat y, GLfloat z)
1046 FlushOnStateChange();
1047 glEsImpl->glTranslatef(x,y,z);
1050 void glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
1052 FlushOnStateChange();
1053 glEsImpl->glRotatef(angle, x, y, z);
1056 void glScalef (GLfloat x, GLfloat y, GLfloat z)
1058 FlushOnStateChange();
1059 glEsImpl->glScalef(x,y,z);
1062 void glDepthRange(GLclampf zNear, GLclampf zFar)
1064 if ((nanoglState.depth_range_near == zNear) &&(nanoglState.depth_range_far == zFar))
1066 return;
1068 else
1070 nanoglState.depth_range_near = zNear;
1071 nanoglState.depth_range_far = zFar;
1073 FlushOnStateChange();
1074 glEsImpl->glDepthRangef(zNear, zFar);
1077 void glDepthFunc (GLenum func)
1079 if (nanoglState.depth_func == func)
1081 return;
1083 else
1085 nanoglState.depth_func = func;
1087 FlushOnStateChange();
1088 glEsImpl->glDepthFunc(func);
1091 void glFinish (void)
1093 FlushOnStateChange();
1094 glEsImpl->glFinish();
1097 void glGetFloatv (GLenum pname, GLfloat *params)
1099 FlushOnStateChange();
1100 glEsImpl->glGetFloatv(pname, params);
1103 void glCullFace (GLenum mode)
1105 if (nanoglState.cullface == mode)
1107 return;
1109 else
1111 nanoglState.cullface = mode;
1113 FlushOnStateChange();
1114 glEsImpl->glCullFace(mode);
1117 void glFrustum (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
1119 FlushOnStateChange();
1120 glEsImpl->glFrustumf(left,right,bottom,top,zNear,zFar);
1123 void glClear (GLbitfield mask)
1125 FlushOnStateChange();
1126 glEsImpl->glClear(mask);
1130 void glVertex3f( GLfloat x, GLfloat y, GLfloat z )
1132 GLfloat* vert = (GLfloat*)ptrVertexAttribArray++;
1133 *vert++ = x;
1134 *vert++ = y;
1135 *vert++ = z;
1136 #if defined(__MULTITEXTURE_SUPPORT__)
1137 memcpy(vert, &currentVertexAttrib.red, 5*sizeof(GLfloat));
1138 #else
1139 memcpy(vert+1, &currentVertexAttrib.red, 3*sizeof(GLfloat));
1140 #endif
1144 void glColor4fv( const GLfloat *v )
1146 currentVertexAttrib.red = (unsigned char)ClampTo255(v[0]*255.0f);
1147 currentVertexAttrib.green = (unsigned char)ClampTo255(v[1]*255.0f);
1148 currentVertexAttrib.blue = (unsigned char)ClampTo255(v[2]*255.0f);
1149 currentVertexAttrib.alpha = (unsigned char)ClampTo255(v[3]*255.0f);
1152 void glColor3ubv( const GLubyte* v)
1154 currentVertexAttrib.red = v[0];
1155 currentVertexAttrib.green = v[1];
1156 currentVertexAttrib.blue = v[2];
1157 currentVertexAttrib.alpha = 255;
1160 void glColor4ubv( const GLubyte *v )
1161 {
1162 //*((unsigned int*)(&currentVertexAttrib.red)) = *((unsigned int*)(v));
1163 currentVertexAttrib.red = v[0];
1164 currentVertexAttrib.green = v[1];
1165 currentVertexAttrib.blue = v[2];
1166 currentVertexAttrib.alpha = v[3];
1169 void glColor3fv( const GLfloat *v )
1171 currentVertexAttrib.red = (unsigned char)ClampTo255(v[0]*255.0f);
1172 currentVertexAttrib.green = (unsigned char)ClampTo255(v[1]*255.0f);
1173 currentVertexAttrib.blue = (unsigned char)ClampTo255(v[2]*255.0f);
1174 currentVertexAttrib.alpha = 255;
1177 //-- nicknekit: xash3d funcs --
1179 void glGetDoublev( GLenum pname, GLdouble *params)
1181 glGetFloatv( pname, (GLfloat *)params );
1184 void glIndexPointer( GLenum type, GLsizei stride, const GLvoid *pointer ) { }
1185 void glTexCoord1f( GLfloat s )
1187 glTexCoord2f( s, 0 );
1190 void glTexCoord3f( GLfloat s, GLfloat t, GLfloat r )
1192 glTexCoord2f( s, t );
1195 void glTexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q)
1197 glTexCoord2f( s, t );
1200 void glTexGenf( GLenum coord, GLenum pname, GLfloat param )
1205 void glRasterPos2f( GLfloat x, GLfloat y ) { }
1207 void glPushAttrib( GLbitfield mask ) { }
1209 void glPopAttrib( ) { }
1211 void glLoadMatrixd( GLdouble *m )
1213 glLoadMatrixf( (GLfloat *)m);
1216 void glMultMatrixd( GLdouble *m )
1218 glMultMatrixf( (GLfloat *)m );
1221 void glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z )
1223 glRotatef( angle, x, y, z );
1226 void glScaled( GLdouble x, GLdouble y, GLdouble z)
1228 glScalef( x, y, z );
1231 void glTranslated( GLdouble x, GLdouble y, GLdouble z )
1233 glTranslatef( x, y, z);
1236 void glDrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels ) { }
1238 GLboolean glIsList( GLuint list ) { }
1240 void glPixelStoref( GLenum pname, GLfloat param )
1242 glPixelStorei( pname, param );
1245 void glCopyTexImage1D( GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border )
1247 glCopyTexImage2D( target, level, internalFormat, x, y, width, 0, border );
1250 void glCopyTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width )
1252 glCopyTexSubImage2D( target, level, xoffset, 0, x, y, width, 0 );
1255 void glPolygonStipple( const GLubyte *mask ) { }
1257 void glGetClipPlane( GLenum plane, const GLdouble *equation ) { }
1259 void glFogi( GLenum pname, GLint param )
1261 glFogf( pname, param );
1264 void glColor4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
1266 currentVertexAttrib.red = red;
1267 currentVertexAttrib.green = green;
1268 currentVertexAttrib.blue = blue;
1269 currentVertexAttrib.alpha = alpha;
1272 void glColor3ub( GLubyte red, GLubyte green, GLubyte blue)
1274 currentVertexAttrib.red = red;
1275 currentVertexAttrib.green = green;
1276 currentVertexAttrib.blue = blue;
1277 currentVertexAttrib.alpha = 255;
1280 void glNormal3fv( const GLfloat *v )
1282 FlushOnStateChange();
1283 glEsImpl->glNormal3f(v[0],v[1],v[2]);
1286 void glCopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border )
1288 FlushOnStateChange();
1289 glEsImpl->glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
1292 void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1294 glTexImage2D(GL_TEXTURE_2D, level, internalformat, width, 1, border, format, type, pixels);
1297 void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1299 glTexImage2D(GL_TEXTURE_2D, level, internalformat, width, height, border, format, type, pixels);
1302 void glTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels )
1304 glTexSubImage2D(target,level,xoffset,0,width,1,format,type,pixels);
1307 void glTexSubImage3D( GLenum target, GLint level,
1308 GLint xoffset, GLint yoffset,
1309 GLint zoffset, GLsizei width,
1310 GLsizei height, GLsizei depth,
1311 GLenum format,
1312 GLenum type, const GLvoid *pixels)
1314 glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
1319 GLboolean glIsTexture(GLuint texture)
1321 FlushOnStateChange();
1322 return glEsImpl->glIsTexture(texture);
1326 void glTexGeni( GLenum coord, GLenum pname, GLint param )
1328 //for mirrors? not needed for original hl?
1331 void glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
1333 //for mirrors? not needed for original hl?
1336 void glTexEnvi( GLenum target, GLenum pname, GLint param )
1338 FlushOnStateChange();
1339 glEsImpl->glTexEnvi( target, pname, param );
1342 void glTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
1344 for( ; params; params++ )
1346 glTexEnvf( target, pname, *params );
1350 void glCopyTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height )
1352 FlushOnStateChange();
1353 glEsImpl->glCopyTexSubImage2D( target, level, xoffset, yoffset, x, y, width, height );
1356 void glGetTexEnviv( GLenum target, GLenum pname, GLint *params )
1358 FlushOnStateChange();
1359 glEsImpl->glGetTexEnviv( target, pname, params );
1362 void glNormal3f( GLfloat nx, GLfloat ny, GLfloat nz )
1364 FlushOnStateChange();
1365 glEsImpl->glNormal3f( nx, ny, nz );
1368 void glGetBooleanv( GLenum pname, GLboolean *params )
1370 FlushOnStateChange();
1371 glEsImpl->glGetBooleanv( pname, params );
1374 void glNormalPointer( GLenum type, GLsizei stride, const GLvoid *pointer )
1376 FlushOnStateChange();
1377 glEsImpl->glNormalPointer( type, stride, pointer );
1380 void glIsEnabled( GLenum cap )
1382 FlushOnStateChange();
1383 glEsImpl->glIsEnabled( cap );
1386 //-- --//
1388 void glHint (GLenum target, GLenum mode)
1390 FlushOnStateChange();
1391 glEsImpl->glHint(target, mode);
1394 void glBlendFunc (GLenum sfactor, GLenum dfactor)
1396 if ((nanoglState.sfactor == sfactor) && (nanoglState.dfactor == dfactor))
1398 return;
1400 nanoglState.sfactor = sfactor;
1401 nanoglState.dfactor = dfactor;
1402 FlushOnStateChange();
1403 glEsImpl->glBlendFunc(sfactor, dfactor);
1406 void glPopMatrix (void)
1408 FlushOnStateChange();
1409 glEsImpl->glPopMatrix();
1412 void glShadeModel (GLenum mode)
1414 if (nanoglState.shademodel == mode)
1416 return;
1418 nanoglState.shademodel = mode;
1419 FlushOnStateChange();
1420 glEsImpl->glShadeModel(mode);
1423 void glPushMatrix (void)
1425 FlushOnStateChange();
1426 glEsImpl->glPushMatrix();
1429 void glTexEnvf (GLenum target, GLenum pname, GLfloat param)
1431 if (target == GL_TEXTURE_ENV)
1433 if (pname == GL_TEXTURE_ENV_MODE)
1435 if (param == activetmuState->texture_env_mode.value)
1437 return;
1438 }
1439 else
1441 FlushOnStateChange();
1442 glEsImpl->glTexEnvf(target, pname, param);
1443 activetmuState->texture_env_mode.value = param;
1444 return;
1448 FlushOnStateChange();
1449 glEsImpl->glTexEnvf(target, pname, param);
1452 void glVertex3fv( const GLfloat *v )
1454 GLfloat* vert = (GLfloat*)ptrVertexAttribArray++;
1455 memcpy(vert, v, 3*sizeof(GLfloat));
1456 #if defined(__MULTITEXTURE_SUPPORT__)
1457 memcpy(vert+3, &currentVertexAttrib.red, 5*sizeof(GLfloat));
1458 #else
1459 memcpy(vert+4, &currentVertexAttrib.red, 3*sizeof(GLfloat));
1460 #endif
1464 void glDepthMask (GLboolean flag)
1466 if (nanoglState.depthmask == flag)
1468 return;
1470 nanoglState.depthmask = flag;
1471 FlushOnStateChange();
1472 glEsImpl->glDepthMask(flag);
1475 void glBindTexture (GLenum target, GLuint texture)
1477 if (activetmuState->boundtexture.value == texture)
1479 return;
1481 FlushOnStateChange();
1482 activetmuState->boundtexture.value = texture;
1483 glEsImpl->glBindTexture(target, texture);
1487 void glGetIntegerv (GLenum pname, GLint *params)
1489 FlushOnStateChange();
1490 glEsImpl->glGetIntegerv(pname, params);
1493 GLubyte nano_extensions_string[4096];
1494 const GLubyte* glGetString (GLenum name)
1497 if (name == GL_EXTENSIONS)
1499 #if defined(__MULTITEXTURE_SUPPORT__)
1500 sprintf((char*)nano_extensions_string,"%s %s",glEsImpl->glGetString(name),"GL_ARB_multitexture EXT_texture_env_add");
1501 #else
1502 sprintf((char*)nano_extensions_string,"%s %s",glEsImpl->glGetString(name),"EXT_texture_env_add");
1503 #endif
1504 return nano_extensions_string;
1506 return glEsImpl->glGetString(name);
1509 void glAlphaFunc (GLenum func, GLclampf ref)
1511 FlushOnStateChange();
1512 glEsImpl->glAlphaFunc(func,ref);
1515 void glFlush (void)
1517 FlushOnStateChange();
1518 glEsImpl->glFlush();
1521 void glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
1523 if (format == GL_DEPTH_COMPONENT)
1525 // OpenglEs 1.1 does not support reading depth buffer without an extension
1526 memset(pixels, 0xff,4);
1527 return;
1529 FlushOnStateChange();
1530 glEsImpl->glReadPixels(x,y,width,height,format,type,pixels);
1533 void glReadBuffer( GLenum /*mode*/ )
1538 void glLoadMatrixf (const GLfloat *m)
1540 FlushOnStateChange();
1541 glEsImpl->glLoadMatrixf(m);
1544 void glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
1546 FlushOnStateChange();
1547 glEsImpl->glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
1550 void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1552 FlushOnStateChange();
1553 glEsImpl->glClearColor(red,green,blue,alpha);
1556 GLenum glGetError (void)
1558 //FlushOnStateChange();
1559 return GL_NO_ERROR;//glEsImpl->glGetError();
1562 void glActiveTexture (GLenum texture)
1564 if (activetmu == texture)
1566 return;
1568 if (delayedttmuchange)
1570 delayedttmuchange = GL_FALSE;
1572 else
1574 delayedttmuchange = GL_TRUE;
1575 delayedtmutarget = texture;
1577 if (texture == GL_TEXTURE0)
1579 activetmuState = &tmuState0;
1581 else
1583 activetmuState = &tmuState1;
1585 activetmu = texture;
1588 void glClientActiveTexture (GLenum texture)
1590 clientactivetmu = texture;
1593 void glPolygonMode( GLenum face, GLenum mode )
1597 void glDeleteTextures( GLsizei n, const GLuint *textures )
1599 FlushOnStateChange();
1600 glEsImpl->glDeleteTextures(n,textures);
1603 void glClearDepth( GLclampf depth )
1605 FlushOnStateChange();
1606 glEsImpl->glClearDepthf( depth );
1609 void glClipPlane( GLenum plane, const GLdouble *equation )
1611 FlushOnStateChange();
1612 float array[4];
1613 array[0] = (GLfloat)(equation[0]);
1614 array[1] = (GLfloat)(equation[1]);
1615 array[2] = (GLfloat)(equation[2]);
1616 array[3] = (GLfloat)(equation[3]);
1617 glEsImpl->glClipPlanef( plane, array );
1620 void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )
1622 FlushOnStateChange();
1623 glEsImpl->glScissor( x, y, width,height);
1626 void glPointSize( GLfloat size )
1628 FlushOnStateChange();
1629 glEsImpl->glPointSize( size );
1632 void glArrayElement(GLint i) {}
1633 void glLineWidth(GLfloat width) {}
1634 void glCallList( GLuint list ) {}
1635 void glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ) {}
1636 void glStencilFunc( GLenum func, GLint ref, GLuint mask ) {}
1637 void glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ) {}
1639 struct ptrstate vertex_array;
1640 struct ptrstate color_array;
1641 struct ptrstate texture_coord_array;
1643 void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices )
1645 // ensure that all primitives specified between glBegin/glEnd pairs
1646 // are rendered first, and that we have correct tmu in use..
1647 FlushOnStateChange();
1648 // setup correct vertex/color/texcoord pointers
1649 if (arraysValid ||
1650 tmuState0.vertex_array.changed ||
1651 tmuState0.color_array.changed ||
1652 tmuState0.texture_coord_array.changed)
1654 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
1656 if (arraysValid || tmuState0.vertex_array.changed)
1658 if (tmuState0.vertex_array.enabled)
1660 glEsImpl->glEnableClientState(GL_VERTEX_ARRAY);
1662 else
1664 glEsImpl->glDisableClientState(GL_VERTEX_ARRAY);
1666 glEsImpl->glVertexPointer(tmuState0.vertex_array.size,
1667 tmuState0.vertex_array.type,
1668 tmuState0.vertex_array.stride,
1669 tmuState0.vertex_array.ptr);
1670 tmuState0.vertex_array.changed = GL_FALSE;
1672 if (arraysValid || tmuState0.color_array.changed)
1674 if (tmuState0.color_array.enabled)
1676 glEsImpl->glEnableClientState(GL_COLOR_ARRAY);
1678 else
1680 glEsImpl->glDisableClientState(GL_COLOR_ARRAY);
1682 glEsImpl->glColorPointer(tmuState0.color_array.size,
1683 tmuState0.color_array.type,
1684 tmuState0.color_array.stride,
1685 tmuState0.color_array.ptr);
1686 tmuState0.color_array.changed = GL_FALSE;
1688 if (arraysValid || tmuState0.texture_coord_array.changed)
1690 tmuState0.texture_coord_array.changed = GL_FALSE;
1691 if (tmuState0.texture_coord_array.enabled)
1693 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1695 else
1697 glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1699 glEsImpl->glTexCoordPointer(tmuState0.texture_coord_array.size,
1700 tmuState0.texture_coord_array.type,
1701 tmuState0.texture_coord_array.stride,
1702 tmuState0.texture_coord_array.ptr);
1705 if (arraysValid || tmuState1.texture_coord_array.changed)
1707 tmuState1.texture_coord_array.changed = GL_FALSE;
1708 glEsImpl->glClientActiveTexture(GL_TEXTURE1);
1709 if (tmuState1.texture_coord_array.enabled)
1711 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1713 else
1715 glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1717 glEsImpl->glTexCoordPointer(tmuState1.texture_coord_array.size,
1718 tmuState1.texture_coord_array.type,
1719 tmuState1.texture_coord_array.stride,
1720 tmuState1.texture_coord_array.ptr);
1723 arraysValid = GL_FALSE;
1724 glEsImpl->glDrawElements(mode, count, type, indices);
1727 void glEnableClientState(GLenum array)
1729 struct nanotmuState* clientstate = NULL;
1730 if (clientactivetmu == GL_TEXTURE0)
1732 clientstate = &tmuState0;
1734 else if (clientactivetmu == GL_TEXTURE1)
1736 clientstate = &tmuState1;
1738 else
1740 return;
1742 switch (array)
1744 case GL_VERTEX_ARRAY:
1745 if (clientstate->vertex_array.enabled)
1747 return;
1749 clientstate->vertex_array.enabled = GL_TRUE;
1750 clientstate->vertex_array.changed = GL_TRUE;
1751 break;
1752 case GL_COLOR_ARRAY:
1753 if (clientstate->color_array.enabled)
1755 return;
1757 clientstate->color_array.enabled = GL_TRUE;
1758 clientstate->color_array.changed = GL_TRUE;
1760 break;
1761 case GL_TEXTURE_COORD_ARRAY:
1762 if (clientstate->texture_coord_array.enabled)
1764 return;
1766 clientstate->texture_coord_array.enabled = GL_TRUE;
1767 clientstate->texture_coord_array.changed = GL_TRUE;
1768 break;
1769 default:
1770 break;
1773 void glDisableClientState(GLenum array)
1775 struct nanotmuState* clientstate = NULL;
1776 if (clientactivetmu == GL_TEXTURE0)
1778 clientstate = &tmuState0;
1780 else if (clientactivetmu == GL_TEXTURE1)
1782 clientstate = &tmuState1;
1784 else
1786 return;
1788 switch (array)
1790 case GL_VERTEX_ARRAY:
1791 if (!clientstate->vertex_array.enabled)
1793 return;
1795 clientstate->vertex_array.enabled = GL_FALSE;
1796 clientstate->vertex_array.changed = GL_TRUE;
1797 break;
1798 case GL_COLOR_ARRAY:
1799 if (!clientstate->color_array.enabled)
1801 return;
1803 clientstate->color_array.enabled = GL_FALSE;
1804 clientstate->color_array.changed = GL_TRUE;
1806 break;
1807 case GL_TEXTURE_COORD_ARRAY:
1808 if (!clientstate->texture_coord_array.enabled)
1810 return;
1812 clientstate->texture_coord_array.enabled = GL_FALSE;
1813 clientstate->texture_coord_array.changed = GL_TRUE;
1814 break;
1815 default:
1816 break;
1819 void glVertexPointer( GLint size, GLenum type,GLsizei stride, const GLvoid *pointer )
1821 if (tmuState0.vertex_array.size == size &&
1822 tmuState0.vertex_array.stride == stride &&
1823 tmuState0.vertex_array.type == type &&
1824 tmuState0.vertex_array.ptr == pointer)
1826 return;
1828 tmuState0.vertex_array.size = size;
1829 tmuState0.vertex_array.stride = stride;
1830 tmuState0.vertex_array.type = type;
1831 tmuState0.vertex_array.ptr = (GLvoid*)pointer;
1832 tmuState0.vertex_array.changed = GL_TRUE;
1834 void glTexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
1836 struct nanotmuState* clientstate = NULL;
1837 if (clientactivetmu == GL_TEXTURE0)
1839 clientstate = &tmuState0;
1841 else if (clientactivetmu == GL_TEXTURE1)
1843 clientstate = &tmuState1;
1845 if (clientstate->texture_coord_array.size == size &&
1846 clientstate->texture_coord_array.stride == stride &&
1847 clientstate->texture_coord_array.type == type &&
1848 clientstate->texture_coord_array.ptr == pointer)
1850 return;
1852 clientstate->texture_coord_array.size = size;
1853 clientstate->texture_coord_array.stride = stride;
1854 clientstate->texture_coord_array.type = type;
1855 clientstate->texture_coord_array.ptr = (GLvoid*)pointer;
1856 clientstate->texture_coord_array.changed = GL_TRUE;
1858 void glColorPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
1860 if (tmuState0.color_array.size == size &&
1861 tmuState0.color_array.stride == stride &&
1862 tmuState0.color_array.type == type &&
1863 tmuState0.color_array.ptr == pointer)
1865 return;
1867 tmuState0.color_array.size = size;
1868 tmuState0.color_array.stride = stride;
1869 tmuState0.color_array.type = type;
1870 tmuState0.color_array.ptr = (GLvoid*)pointer;
1871 tmuState0.color_array.changed = GL_TRUE;
1873 void glPolygonOffset( GLfloat factor, GLfloat units )
1875 FlushOnStateChange();
1876 glEsImpl->glPolygonOffset(factor, units);
1878 void glStencilMask( GLuint mask ) {}
1879 void glClearStencil( GLint s ) {}
1881 #if defined(__MULTITEXTURE_SUPPORT__)
1883 extern "C" void glMultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t );
1885 void glMultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t )
1887 if (target == GL_TEXTURE0)
1889 glTexCoord2f(s,t);
1891 else
1893 currentVertexAttrib.s_multi = s;
1894 currentVertexAttrib.t_multi = t;
1897 #endif
1899 /* Vladimir */
1900 void glDrawArrays( GLenum mode, int first, int count)
1902 FlushOnStateChange();
1903 glEsImpl->glDrawArrays(mode, first , count);
1905 void glMultMatrixf (const GLfloat *m)
1907 FlushOnStateChange();
1908 glEsImpl->glMultMatrixf(m);
1911 void glPixelStorei (GLenum pname, GLint param)
1913 FlushOnStateChange();
1914 glEsImpl->glPixelStorei(pname, param);
1918 void glFogf (GLenum pname, GLfloat param)
1920 FlushOnStateChange();
1921 glEsImpl->glFogf(pname, param);
1924 void glFogfv (GLenum pname, const GLfloat *params)
1926 FlushOnStateChange();
1927 glEsImpl->glFogfv(pname, params);
1930 void glGetTexParameteriv (GLenum target, GLenum pname, GLint *params)
1932 FlushOnStateChange();
1933 glEsImpl->glGetTexParameteriv(target, pname, params);
1937 // This gives: called unimplemented OpenGL ES API (Android)
1938 void glTexParameteri (GLenum target, GLenum pname, GLint param)
1940 if (pname == GL_TEXTURE_BORDER_COLOR) {
1941 return; // not supported by opengl es
1943 if ( (pname == GL_TEXTURE_WRAP_S ||
1944 pname == GL_TEXTURE_WRAP_T) &&
1945 param == GL_CLAMP) {
1946 param = 0x812F;
1949 FlushOnStateChange();
1950 glEsImpl->glTexParameteri(target, pname, param);
1953 void glTexParameterx (GLenum target, GLenum pname, GLfixed param)
1955 if (pname == GL_TEXTURE_BORDER_COLOR) {
1956 return; // not supported by opengl es
1958 if ( (pname == GL_TEXTURE_WRAP_S ||
1959 pname == GL_TEXTURE_WRAP_T) &&
1960 param == GL_CLAMP) {
1961 param = 0x812F;
1963 FlushOnStateChange();
1964 glEsImpl->glTexParameterx(target, pname, param);
1967 void glGenTextures (GLsizei n, GLuint *textures)
1969 FlushOnStateChange();
1970 glEsImpl->glGenTextures(n, textures);
1973 void glFrontFace (GLenum mode)
1975 FlushOnStateChange();
1976 glEsImpl->glFrontFace(mode);
1981 // End Vladimir