DEADSOFTWARE

Add some functions to nanogl.h interface
[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 glColor4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
1181 currentVertexAttrib.red = red;
1182 currentVertexAttrib.green = green;
1183 currentVertexAttrib.blue = blue;
1184 currentVertexAttrib.alpha = alpha;
1187 void glColor3ub( GLubyte red, GLubyte green, GLubyte blue)
1189 currentVertexAttrib.red = red;
1190 currentVertexAttrib.green = green;
1191 currentVertexAttrib.blue = blue;
1192 currentVertexAttrib.alpha = 255;
1195 void glNormal3fv( const GLfloat *v )
1197 FlushOnStateChange();
1198 glEsImpl->glNormal3f(v[0],v[1],v[2]);
1201 void glCopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border )
1203 FlushOnStateChange();
1204 glEsImpl->glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
1207 void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1209 glTexImage2D(GL_TEXTURE_2D, level, internalformat, width, 1, border, format, type, pixels);
1212 void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1214 glTexImage2D(GL_TEXTURE_2D, level, internalformat, width, height, border, format, type, pixels);
1217 void glTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels )
1219 glTexSubImage2D(target,level,xoffset,0,width,1,format,type,pixels);
1222 void glTexSubImage3D( GLenum target, GLint level,
1223 GLint xoffset, GLint yoffset,
1224 GLint zoffset, GLsizei width,
1225 GLsizei height, GLsizei depth,
1226 GLenum format,
1227 GLenum type, const GLvoid *pixels)
1229 glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
1234 GLboolean glIsTexture(GLuint texture)
1236 FlushOnStateChange();
1237 return glEsImpl->glIsTexture(texture);
1241 void glTexGeni( GLenum coord, GLenum pname, GLint param )
1243 //for mirrors? not needed for original hl?
1246 void glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
1248 //for mirrors? not needed for original hl?
1251 //-- --//
1253 void glHint (GLenum target, GLenum mode)
1255 FlushOnStateChange();
1256 glEsImpl->glHint(target, mode);
1259 void glBlendFunc (GLenum sfactor, GLenum dfactor)
1261 if ((nanoglState.sfactor == sfactor) && (nanoglState.dfactor == dfactor))
1263 return;
1265 nanoglState.sfactor = sfactor;
1266 nanoglState.dfactor = dfactor;
1267 FlushOnStateChange();
1268 glEsImpl->glBlendFunc(sfactor, dfactor);
1271 void glPopMatrix (void)
1273 FlushOnStateChange();
1274 glEsImpl->glPopMatrix();
1277 void glShadeModel (GLenum mode)
1279 if (nanoglState.shademodel == mode)
1281 return;
1283 nanoglState.shademodel = mode;
1284 FlushOnStateChange();
1285 glEsImpl->glShadeModel(mode);
1288 void glPushMatrix (void)
1290 FlushOnStateChange();
1291 glEsImpl->glPushMatrix();
1294 void glTexEnvf (GLenum target, GLenum pname, GLfloat param)
1296 if (target == GL_TEXTURE_ENV)
1298 if (pname == GL_TEXTURE_ENV_MODE)
1300 if (param == activetmuState->texture_env_mode.value)
1302 return;
1303 }
1304 else
1306 FlushOnStateChange();
1307 glEsImpl->glTexEnvf(target, pname, param);
1308 activetmuState->texture_env_mode.value = param;
1309 return;
1313 FlushOnStateChange();
1314 glEsImpl->glTexEnvf(target, pname, param);
1317 void glVertex3fv( const GLfloat *v )
1319 GLfloat* vert = (GLfloat*)ptrVertexAttribArray++;
1320 memcpy(vert, v, 3*sizeof(GLfloat));
1321 #if defined(__MULTITEXTURE_SUPPORT__)
1322 memcpy(vert+3, &currentVertexAttrib.red, 5*sizeof(GLfloat));
1323 #else
1324 memcpy(vert+4, &currentVertexAttrib.red, 3*sizeof(GLfloat));
1325 #endif
1329 void glDepthMask (GLboolean flag)
1331 if (nanoglState.depthmask == flag)
1333 return;
1335 nanoglState.depthmask = flag;
1336 FlushOnStateChange();
1337 glEsImpl->glDepthMask(flag);
1340 void glBindTexture (GLenum target, GLuint texture)
1342 if (activetmuState->boundtexture.value == texture)
1344 return;
1346 FlushOnStateChange();
1347 activetmuState->boundtexture.value = texture;
1348 glEsImpl->glBindTexture(target, texture);
1352 void glGetIntegerv (GLenum pname, GLint *params)
1354 FlushOnStateChange();
1355 glEsImpl->glGetIntegerv(pname, params);
1358 GLubyte nano_extensions_string[4096];
1359 const GLubyte* glGetString (GLenum name)
1362 if (name == GL_EXTENSIONS)
1364 #if defined(__MULTITEXTURE_SUPPORT__)
1365 sprintf((char*)nano_extensions_string,"%s %s",glEsImpl->glGetString(name),"GL_ARB_multitexture EXT_texture_env_add");
1366 #else
1367 sprintf((char*)nano_extensions_string,"%s %s",glEsImpl->glGetString(name),"EXT_texture_env_add");
1368 #endif
1369 return nano_extensions_string;
1371 return glEsImpl->glGetString(name);
1374 void glAlphaFunc (GLenum func, GLclampf ref)
1376 FlushOnStateChange();
1377 glEsImpl->glAlphaFunc(func,ref);
1380 void glFlush (void)
1382 FlushOnStateChange();
1383 glEsImpl->glFlush();
1386 void glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
1388 if (format == GL_DEPTH_COMPONENT)
1390 // OpenglEs 1.1 does not support reading depth buffer without an extension
1391 memset(pixels, 0xff,4);
1392 return;
1394 FlushOnStateChange();
1395 glEsImpl->glReadPixels(x,y,width,height,format,type,pixels);
1398 void glReadBuffer( GLenum /*mode*/ )
1403 void glLoadMatrixf (const GLfloat *m)
1405 FlushOnStateChange();
1406 glEsImpl->glLoadMatrixf(m);
1409 void glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
1411 FlushOnStateChange();
1412 glEsImpl->glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
1415 void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1417 FlushOnStateChange();
1418 glEsImpl->glClearColor(red,green,blue,alpha);
1421 GLenum glGetError (void)
1423 //FlushOnStateChange();
1424 return GL_NO_ERROR;//glEsImpl->glGetError();
1427 void glActiveTexture (GLenum texture)
1429 if (activetmu == texture)
1431 return;
1433 if (delayedttmuchange)
1435 delayedttmuchange = GL_FALSE;
1437 else
1439 delayedttmuchange = GL_TRUE;
1440 delayedtmutarget = texture;
1442 if (texture == GL_TEXTURE0)
1444 activetmuState = &tmuState0;
1446 else
1448 activetmuState = &tmuState1;
1450 activetmu = texture;
1453 void glClientActiveTexture (GLenum texture)
1455 clientactivetmu = texture;
1458 void glPolygonMode( GLenum face, GLenum mode )
1462 void glDeleteTextures( GLsizei n, const GLuint *textures )
1464 FlushOnStateChange();
1465 glEsImpl->glDeleteTextures(n,textures);
1468 void glClearDepth( GLclampf depth )
1470 FlushOnStateChange();
1471 glEsImpl->glClearDepthf( depth );
1474 void glClipPlane( GLenum plane, const GLdouble *equation )
1476 FlushOnStateChange();
1477 float array[4];
1478 array[0] = (GLfloat)(equation[0]);
1479 array[1] = (GLfloat)(equation[1]);
1480 array[2] = (GLfloat)(equation[2]);
1481 array[3] = (GLfloat)(equation[3]);
1482 glEsImpl->glClipPlanef( plane, array );
1485 void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )
1487 FlushOnStateChange();
1488 glEsImpl->glScissor( x, y, width,height);
1491 void glPointSize( GLfloat size )
1493 FlushOnStateChange();
1494 glEsImpl->glPointSize( size );
1497 void glArrayElement(GLint i) {}
1498 void glLineWidth(GLfloat width) {}
1499 void glCallList( GLuint list ) {}
1500 void glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ) {}
1501 void glStencilFunc( GLenum func, GLint ref, GLuint mask ) {}
1502 void glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ) {}
1504 struct ptrstate vertex_array;
1505 struct ptrstate color_array;
1506 struct ptrstate texture_coord_array;
1508 void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices )
1510 // ensure that all primitives specified between glBegin/glEnd pairs
1511 // are rendered first, and that we have correct tmu in use..
1512 FlushOnStateChange();
1513 // setup correct vertex/color/texcoord pointers
1514 if (arraysValid ||
1515 tmuState0.vertex_array.changed ||
1516 tmuState0.color_array.changed ||
1517 tmuState0.texture_coord_array.changed)
1519 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
1521 if (arraysValid || tmuState0.vertex_array.changed)
1523 if (tmuState0.vertex_array.enabled)
1525 glEsImpl->glEnableClientState(GL_VERTEX_ARRAY);
1527 else
1529 glEsImpl->glDisableClientState(GL_VERTEX_ARRAY);
1531 glEsImpl->glVertexPointer(tmuState0.vertex_array.size,
1532 tmuState0.vertex_array.type,
1533 tmuState0.vertex_array.stride,
1534 tmuState0.vertex_array.ptr);
1535 tmuState0.vertex_array.changed = GL_FALSE;
1537 if (arraysValid || tmuState0.color_array.changed)
1539 if (tmuState0.color_array.enabled)
1541 glEsImpl->glEnableClientState(GL_COLOR_ARRAY);
1543 else
1545 glEsImpl->glDisableClientState(GL_COLOR_ARRAY);
1547 glEsImpl->glColorPointer(tmuState0.color_array.size,
1548 tmuState0.color_array.type,
1549 tmuState0.color_array.stride,
1550 tmuState0.color_array.ptr);
1551 tmuState0.color_array.changed = GL_FALSE;
1553 if (arraysValid || tmuState0.texture_coord_array.changed)
1555 tmuState0.texture_coord_array.changed = GL_FALSE;
1556 if (tmuState0.texture_coord_array.enabled)
1558 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1560 else
1562 glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1564 glEsImpl->glTexCoordPointer(tmuState0.texture_coord_array.size,
1565 tmuState0.texture_coord_array.type,
1566 tmuState0.texture_coord_array.stride,
1567 tmuState0.texture_coord_array.ptr);
1570 if (arraysValid || tmuState1.texture_coord_array.changed)
1572 tmuState1.texture_coord_array.changed = GL_FALSE;
1573 glEsImpl->glClientActiveTexture(GL_TEXTURE1);
1574 if (tmuState1.texture_coord_array.enabled)
1576 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1578 else
1580 glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1582 glEsImpl->glTexCoordPointer(tmuState1.texture_coord_array.size,
1583 tmuState1.texture_coord_array.type,
1584 tmuState1.texture_coord_array.stride,
1585 tmuState1.texture_coord_array.ptr);
1588 arraysValid = GL_FALSE;
1589 glEsImpl->glDrawElements(mode, count, type, indices);
1592 void glEnableClientState(GLenum array)
1594 struct nanotmuState* clientstate = NULL;
1595 if (clientactivetmu == GL_TEXTURE0)
1597 clientstate = &tmuState0;
1599 else if (clientactivetmu == GL_TEXTURE1)
1601 clientstate = &tmuState1;
1603 else
1605 return;
1607 switch (array)
1609 case GL_VERTEX_ARRAY:
1610 if (clientstate->vertex_array.enabled)
1612 return;
1614 clientstate->vertex_array.enabled = GL_TRUE;
1615 clientstate->vertex_array.changed = GL_TRUE;
1616 break;
1617 case GL_COLOR_ARRAY:
1618 if (clientstate->color_array.enabled)
1620 return;
1622 clientstate->color_array.enabled = GL_TRUE;
1623 clientstate->color_array.changed = GL_TRUE;
1625 break;
1626 case GL_TEXTURE_COORD_ARRAY:
1627 if (clientstate->texture_coord_array.enabled)
1629 return;
1631 clientstate->texture_coord_array.enabled = GL_TRUE;
1632 clientstate->texture_coord_array.changed = GL_TRUE;
1633 break;
1634 default:
1635 break;
1638 void glDisableClientState(GLenum array)
1640 struct nanotmuState* clientstate = NULL;
1641 if (clientactivetmu == GL_TEXTURE0)
1643 clientstate = &tmuState0;
1645 else if (clientactivetmu == GL_TEXTURE1)
1647 clientstate = &tmuState1;
1649 else
1651 return;
1653 switch (array)
1655 case GL_VERTEX_ARRAY:
1656 if (!clientstate->vertex_array.enabled)
1658 return;
1660 clientstate->vertex_array.enabled = GL_FALSE;
1661 clientstate->vertex_array.changed = GL_TRUE;
1662 break;
1663 case GL_COLOR_ARRAY:
1664 if (!clientstate->color_array.enabled)
1666 return;
1668 clientstate->color_array.enabled = GL_FALSE;
1669 clientstate->color_array.changed = GL_TRUE;
1671 break;
1672 case GL_TEXTURE_COORD_ARRAY:
1673 if (!clientstate->texture_coord_array.enabled)
1675 return;
1677 clientstate->texture_coord_array.enabled = GL_FALSE;
1678 clientstate->texture_coord_array.changed = GL_TRUE;
1679 break;
1680 default:
1681 break;
1684 void glVertexPointer( GLint size, GLenum type,GLsizei stride, const GLvoid *pointer )
1686 if (tmuState0.vertex_array.size == size &&
1687 tmuState0.vertex_array.stride == stride &&
1688 tmuState0.vertex_array.type == type &&
1689 tmuState0.vertex_array.ptr == pointer)
1691 return;
1693 tmuState0.vertex_array.size = size;
1694 tmuState0.vertex_array.stride = stride;
1695 tmuState0.vertex_array.type = type;
1696 tmuState0.vertex_array.ptr = (GLvoid*)pointer;
1697 tmuState0.vertex_array.changed = GL_TRUE;
1699 void glTexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
1701 struct nanotmuState* clientstate = NULL;
1702 if (clientactivetmu == GL_TEXTURE0)
1704 clientstate = &tmuState0;
1706 else if (clientactivetmu == GL_TEXTURE1)
1708 clientstate = &tmuState1;
1710 if (clientstate->texture_coord_array.size == size &&
1711 clientstate->texture_coord_array.stride == stride &&
1712 clientstate->texture_coord_array.type == type &&
1713 clientstate->texture_coord_array.ptr == pointer)
1715 return;
1717 clientstate->texture_coord_array.size = size;
1718 clientstate->texture_coord_array.stride = stride;
1719 clientstate->texture_coord_array.type = type;
1720 clientstate->texture_coord_array.ptr = (GLvoid*)pointer;
1721 clientstate->texture_coord_array.changed = GL_TRUE;
1723 void glColorPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
1725 if (tmuState0.color_array.size == size &&
1726 tmuState0.color_array.stride == stride &&
1727 tmuState0.color_array.type == type &&
1728 tmuState0.color_array.ptr == pointer)
1730 return;
1732 tmuState0.color_array.size = size;
1733 tmuState0.color_array.stride = stride;
1734 tmuState0.color_array.type = type;
1735 tmuState0.color_array.ptr = (GLvoid*)pointer;
1736 tmuState0.color_array.changed = GL_TRUE;
1738 void glPolygonOffset( GLfloat factor, GLfloat units )
1740 FlushOnStateChange();
1741 glEsImpl->glPolygonOffset(factor, units);
1743 void glStencilMask( GLuint mask ) {}
1744 void glClearStencil( GLint s ) {}
1746 #if defined(__MULTITEXTURE_SUPPORT__)
1748 extern "C" void glMultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t );
1750 void glMultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t )
1752 if (target == GL_TEXTURE0)
1754 glTexCoord2f(s,t);
1756 else
1758 currentVertexAttrib.s_multi = s;
1759 currentVertexAttrib.t_multi = t;
1762 #endif
1764 /* Vladimir */
1765 void glDrawArrays( GLenum mode, int first, int count)
1767 FlushOnStateChange();
1768 glEsImpl->glDrawArrays(mode, first , count);
1770 void glMultMatrixf (const GLfloat *m)
1772 FlushOnStateChange();
1773 glEsImpl->glMultMatrixf(m);
1776 void glPixelStorei (GLenum pname, GLint param)
1778 FlushOnStateChange();
1779 glEsImpl->glPixelStorei(pname, param);
1783 void glFogf (GLenum pname, GLfloat param)
1785 FlushOnStateChange();
1786 glEsImpl->glFogf(pname, param);
1789 void glFogfv (GLenum pname, const GLfloat *params)
1791 FlushOnStateChange();
1792 glEsImpl->glFogfv(pname, params);
1795 void glGetTexParameteriv (GLenum target, GLenum pname, GLint *params)
1797 FlushOnStateChange();
1798 glEsImpl->glGetTexParameteriv(target, pname, params);
1802 // This gives: called unimplemented OpenGL ES API (Android)
1803 void glTexParameteri (GLenum target, GLenum pname, GLint param)
1805 if (pname == GL_TEXTURE_BORDER_COLOR) {
1806 return; // not supported by opengl es
1808 if ( (pname == GL_TEXTURE_WRAP_S ||
1809 pname == GL_TEXTURE_WRAP_T) &&
1810 param == GL_CLAMP) {
1811 param = 0x812F;
1814 FlushOnStateChange();
1815 glEsImpl->glTexParameteri(target, pname, param);
1818 void glTexParameterx (GLenum target, GLenum pname, GLfixed param)
1820 if (pname == GL_TEXTURE_BORDER_COLOR) {
1821 return; // not supported by opengl es
1823 if ( (pname == GL_TEXTURE_WRAP_S ||
1824 pname == GL_TEXTURE_WRAP_T) &&
1825 param == GL_CLAMP) {
1826 param = 0x812F;
1828 FlushOnStateChange();
1829 glEsImpl->glTexParameterx(target, pname, param);
1832 void glGenTextures (GLsizei n, GLuint *textures)
1834 FlushOnStateChange();
1835 glEsImpl->glGenTextures(n, textures);
1838 void glFrontFace (GLenum mode)
1840 FlushOnStateChange();
1841 glEsImpl->glFrontFace(mode);
1846 // End Vladimir