DEADSOFTWARE

Windows and core profile support
[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 #ifndef USE_CORE_PROFILE
328 glEsImpl->glActiveTexture(delayedtmutarget);
329 #endif
332 if (!vertexCount)
333 return;
335 if (!arraysValid)
337 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
338 glEsImpl->glVertexPointer(3, GL_FLOAT, sizeof(VertexAttrib), &vertexattribs[0].x);
339 glEsImpl->glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(VertexAttrib), &vertexattribs[0].red);
340 glEsImpl->glTexCoordPointer(2, GL_FLOAT, sizeof(VertexAttrib), &vertexattribs[0].s);
341 glEsImpl->glEnableClientState(GL_VERTEX_ARRAY);
342 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
343 glEsImpl->glEnableClientState(GL_COLOR_ARRAY);
344 #if defined(__MULTITEXTURE_SUPPORT__)
345 glEsImpl->glClientActiveTexture(GL_TEXTURE1);
346 glEsImpl->glTexCoordPointer(2, GL_FLOAT, sizeof(VertexAttrib), &vertexattribs[0].s_multi);
347 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
348 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
349 #endif
350 arraysValid = GL_TRUE;
353 glEsImpl->glDrawElements( GL_TRIANGLES,vertexCount,GL_UNSIGNED_SHORT, indexArray );
356 #if defined(__MULTITEXTURE_SUPPORT__)
357 useMultiTexCoordArray = GL_FALSE;
358 #endif
359 vertexCount = 0;
360 indexCount = 0;
361 ptrVertexAttribArray = vertexattribs;
362 ptrVertexAttribArrayMark = ptrVertexAttribArray;
363 ptrIndexArray = indexArray;
364 useTexCoordArray = GL_FALSE;
366 void nanoGL_Flush()
368 FlushOnStateChange();
370 void nanoGL_Reset()
372 ResetNanoState();
374 void glBegin(GLenum mode)
376 wrapperPrimitiveMode = mode;
377 vertexMark = vertexCount;
378 ptrVertexAttribArrayMark = ptrVertexAttribArray;
379 indexbase = indexCount;
382 void glEnd(void)
384 vertexCount+=((unsigned char*)ptrVertexAttribArray-(unsigned char*)ptrVertexAttribArrayMark)/sizeof(VertexAttrib);
385 if (vertexCount < 3)
387 return;
389 switch (wrapperPrimitiveMode)
391 case GL_QUADS:
393 *ptrIndexArray++ = indexCount;
394 *ptrIndexArray++ = indexCount+1;
395 *ptrIndexArray++ = indexCount+2;
396 *ptrIndexArray++ = indexCount;
397 *ptrIndexArray++ = indexCount+2;
398 *ptrIndexArray++ = indexCount+3;
399 indexCount+=4;
400 vertexCount+=2;
402 break;
403 case GL_TRIANGLES:
405 int vcount = (vertexCount-vertexMark)/3;
406 for (int count = 0; count < vcount; count++)
408 *ptrIndexArray++ = indexCount;
409 *ptrIndexArray++ = indexCount+1;
410 *ptrIndexArray++ = indexCount+2;
411 indexCount+=3;
414 break;
415 case GL_TRIANGLE_STRIP:
417 *ptrIndexArray++ = indexCount;
418 *ptrIndexArray++ = indexCount+1;
419 *ptrIndexArray++ = indexCount+2;
420 indexCount+=3;
421 int vcount = ((vertexCount-vertexMark)-3);
422 if (vcount && ((long)ptrIndexArray & 0x02))
424 *ptrIndexArray++ = indexCount-1; // 2
425 *ptrIndexArray++ = indexCount-2; // 1
426 *ptrIndexArray++ = indexCount; // 3
427 indexCount++;
428 vcount-=1;
429 int odd = vcount&1;
430 vcount/=2;
431 unsigned int* longptr = (unsigned int*) ptrIndexArray;
433 for (int count = 0; count < vcount; count++)
435 *(longptr++) = (indexCount-2) | ((indexCount-1)<<16);
436 *(longptr++) = (indexCount) | ((indexCount)<<16);
437 *(longptr++) = (indexCount-1) | ((indexCount+1)<<16);
438 indexCount+=2;
440 ptrIndexArray = (unsigned short*)(longptr);
441 if (odd)
443 *ptrIndexArray++ = indexCount-2; // 2
444 *ptrIndexArray++ = indexCount-1; // 1
445 *ptrIndexArray++ = indexCount; // 3
446 indexCount++;
449 else
451 //already aligned
452 int odd = vcount&1;
453 vcount/=2;
454 unsigned int* longptr = (unsigned int*) ptrIndexArray;
456 for (int count = 0; count < vcount; count++)
457 {
458 *(longptr++) = (indexCount-1) | ((indexCount-2)<<16);
459 *(longptr++) = (indexCount) | ((indexCount-1)<<16);
460 *(longptr++) = (indexCount) | ((indexCount+1)<<16);
461 indexCount+=2;
464 ptrIndexArray = (unsigned short*)(longptr);
465 if (odd)
468 *ptrIndexArray++ = indexCount-1; // 2
469 *ptrIndexArray++ = indexCount-2; // 1
470 *ptrIndexArray++ = indexCount; // 3
471 indexCount++;
473 }
474 vertexCount+=(vertexCount-vertexMark-3)*2;
476 break;
477 case GL_POLYGON:
478 case GL_TRIANGLE_FAN:
480 *ptrIndexArray++ = indexCount++;
481 *ptrIndexArray++ = indexCount++;
482 *ptrIndexArray++ = indexCount++;
483 int vcount = ((vertexCount-vertexMark)-3);
484 for (int count = 0; count < vcount; count++)
486 *ptrIndexArray++ = indexbase;
487 *ptrIndexArray++ = indexCount-1;
488 *ptrIndexArray++ = indexCount++;
489 vertexCount+=2;
491 }
492 break;
494 default:
495 break;
499 void glEnable (GLenum cap)
501 GLboolean statechanged = GL_FALSE;
502 switch(cap)
504 case GL_ALPHA_TEST:
506 if (!nanoglState.alpha_test)
508 nanoglState.alpha_test = GL_TRUE;
509 statechanged = GL_TRUE;
511 break;
513 case GL_BLEND:
515 if (!nanoglState.blend)
517 nanoglState.blend = GL_TRUE;
518 statechanged = GL_TRUE;
520 break;
522 //case GL_CLIP_PLANEi
523 case GL_COLOR_LOGIC_OP:
525 if (!nanoglState.color_logic_op)
527 nanoglState.color_logic_op = GL_TRUE;
528 statechanged = GL_TRUE;
530 break;
532 case GL_COLOR_MATERIAL:
534 if (!nanoglState.color_material)
536 nanoglState.color_material = GL_TRUE;
537 statechanged = GL_TRUE;
539 break;
541 case GL_CULL_FACE:
543 if (!nanoglState.cull_face)
545 nanoglState.cull_face = GL_TRUE;
546 statechanged = GL_TRUE;
548 break;
550 case GL_DEPTH_TEST:
552 if (!nanoglState.depth_test)
554 nanoglState.depth_test = GL_TRUE;
555 statechanged = GL_TRUE;
557 break;
559 case GL_DITHER:
561 if (!nanoglState.dither)
563 nanoglState.dither = GL_TRUE;
564 statechanged = GL_TRUE;
566 break;
568 case GL_FOG:
569 //case GL_LIGHTi
571 if (!nanoglState.fog)
573 nanoglState.fog = GL_TRUE;
574 statechanged = GL_TRUE;
576 break;
578 case GL_LIGHTING:
580 if (!nanoglState.lighting)
582 nanoglState.lighting = GL_TRUE;
583 statechanged = GL_TRUE;
585 break;
587 case GL_LINE_SMOOTH:
589 if (!nanoglState.line_smooth)
591 nanoglState.line_smooth = GL_TRUE;
592 statechanged = GL_TRUE;
594 break;
596 /* case GL_MATRIX_PALETTE_OES:
598 if (!nanoglState.matrix_palette_oes)
600 nanoglState.matrix_palette_oes = GL_TRUE;
601 statechanged = GL_TRUE;
603 break;
604 }*/
605 case GL_MULTISAMPLE:
607 if (!nanoglState.multisample)
609 nanoglState.multisample = GL_TRUE;
610 statechanged = GL_TRUE;
612 break;
614 case GL_NORMALIZE:
616 if (!nanoglState.normalize)
618 nanoglState.normalize = GL_TRUE;
619 statechanged = GL_TRUE;
621 break;
623 /* case GL_POINT_SPRITE_OES:
625 if (!nanoglState.point_sprite_oes)
627 nanoglState.point_sprite_oes = GL_TRUE;
628 statechanged = GL_TRUE;
630 break;
631 }*/
632 case GL_POLYGON_OFFSET_FILL:
634 if (!nanoglState.polygon_offset_fill)
636 nanoglState.polygon_offset_fill = GL_TRUE;
637 statechanged = GL_TRUE;
639 break;
641 case GL_RESCALE_NORMAL:
643 if (!nanoglState.rescale_normal)
645 nanoglState.rescale_normal = GL_TRUE;
646 statechanged = GL_TRUE;
648 break;
650 case GL_SAMPLE_ALPHA_TO_COVERAGE:
652 if (!nanoglState.sample_alpha_to_coverage)
654 nanoglState.sample_alpha_to_coverage = GL_TRUE;
655 statechanged = GL_TRUE;
657 break;
659 case GL_SAMPLE_ALPHA_TO_ONE:
661 if (!nanoglState.sample_alpha_to_one)
663 nanoglState.sample_alpha_to_one = GL_TRUE;
664 statechanged = GL_TRUE;
666 break;
668 case GL_SAMPLE_COVERAGE:
670 if (!nanoglState.sample_coverage)
672 nanoglState.sample_coverage = GL_TRUE;
673 statechanged = GL_TRUE;
675 break;
677 case GL_SCISSOR_TEST:
679 if (!nanoglState.scissor_test)
681 nanoglState.scissor_test = GL_TRUE;
682 statechanged = GL_TRUE;
684 break;
686 case GL_STENCIL_TEST:
688 return;
689 /* if (!nanoglState.stencil_test)
691 nanoglState.stencil_test = GL_TRUE;
692 statechanged = GL_TRUE;
693 }*/
694 break;
696 case GL_TEXTURE_2D:
698 if (!activetmuState->texture_2d.value)
700 FlushOnStateChange();
701 glEsImpl->glEnable(cap);
702 activetmuState->texture_2d.value = GL_TRUE;
703 return;
705 break;
707 default:
708 break;
711 if (statechanged)
713 FlushOnStateChange();
714 glEsImpl->glEnable(cap);
715 }
718 void glDisable (GLenum cap)
720 GLboolean statechanged = GL_FALSE;
721 switch(cap)
723 case GL_ALPHA_TEST:
725 if (nanoglState.alpha_test)
727 nanoglState.alpha_test = GL_FALSE;
728 statechanged = GL_TRUE;
730 break;
732 case GL_BLEND:
734 if (nanoglState.blend)
736 nanoglState.blend = GL_FALSE;
737 statechanged = GL_TRUE;
739 break;
741 //case GL_CLIP_PLANEi
742 case GL_COLOR_LOGIC_OP:
744 if (nanoglState.color_logic_op)
746 nanoglState.color_logic_op = GL_FALSE;
747 statechanged = GL_TRUE;
749 break;
751 case GL_COLOR_MATERIAL:
753 if (nanoglState.color_material)
755 nanoglState.color_material = GL_FALSE;
756 statechanged = GL_TRUE;
758 break;
760 case GL_CULL_FACE:
762 if (nanoglState.cull_face)
764 nanoglState.cull_face = GL_FALSE;
765 statechanged = GL_TRUE;
767 break;
769 case GL_DEPTH_TEST:
771 if (nanoglState.depth_test)
773 nanoglState.depth_test = GL_FALSE;
774 statechanged = GL_TRUE;
776 break;
778 case GL_DITHER:
780 if (nanoglState.dither)
782 nanoglState.dither = GL_FALSE;
783 statechanged = GL_TRUE;
785 break;
787 case GL_FOG:
788 //case GL_LIGHTi
790 if (nanoglState.fog)
792 nanoglState.fog = GL_FALSE;
793 statechanged = GL_TRUE;
795 break;
797 case GL_LIGHTING:
799 if (nanoglState.lighting)
801 nanoglState.lighting = GL_FALSE;
802 statechanged = GL_TRUE;
804 break;
806 case GL_LINE_SMOOTH:
808 if (nanoglState.line_smooth)
810 nanoglState.line_smooth = GL_FALSE;
811 statechanged = GL_TRUE;
813 break;
815 /* case GL_MATRIX_PALETTE_OES:
817 if (nanoglState.matrix_palette_oes)
819 nanoglState.matrix_palette_oes = GL_FALSE;
820 statechanged = GL_TRUE;
822 break;
823 }*/
824 case GL_MULTISAMPLE:
826 if (nanoglState.multisample)
828 nanoglState.multisample = GL_FALSE;
829 statechanged = GL_TRUE;
831 break;
833 case GL_NORMALIZE:
835 if (nanoglState.normalize)
837 nanoglState.normalize = GL_FALSE;
838 statechanged = GL_TRUE;
840 break;
842 /* case GL_POINT_SPRITE_OES:
844 if (nanoglState.point_sprite_oes)
846 nanoglState.point_sprite_oes = GL_FALSE;
847 statechanged = GL_TRUE;
849 break;
850 }*/
851 case GL_POLYGON_OFFSET_FILL:
853 if (nanoglState.polygon_offset_fill)
855 nanoglState.polygon_offset_fill = GL_FALSE;
856 statechanged = GL_TRUE;
858 break;
860 case GL_RESCALE_NORMAL:
862 if (nanoglState.rescale_normal)
864 nanoglState.rescale_normal = GL_FALSE;
865 statechanged = GL_TRUE;
867 break;
869 case GL_SAMPLE_ALPHA_TO_COVERAGE:
871 if (nanoglState.sample_alpha_to_coverage)
873 nanoglState.sample_alpha_to_coverage = GL_FALSE;
874 statechanged = GL_TRUE;
876 break;
878 case GL_SAMPLE_ALPHA_TO_ONE:
880 if (nanoglState.sample_alpha_to_one)
882 nanoglState.sample_alpha_to_one = GL_FALSE;
883 statechanged = GL_TRUE;
885 break;
887 case GL_SAMPLE_COVERAGE:
889 if (nanoglState.sample_coverage)
891 nanoglState.sample_coverage = GL_FALSE;
892 statechanged = GL_TRUE;
894 break;
896 case GL_SCISSOR_TEST:
898 if (nanoglState.scissor_test)
900 nanoglState.scissor_test = GL_FALSE;
901 statechanged = GL_TRUE;
903 break;
905 case GL_STENCIL_TEST:
907 return;
908 /* if (nanoglState.stencil_test)
910 nanoglState.stencil_test = GL_FALSE;
911 statechanged = GL_TRUE;
912 }*/
913 break;
915 case GL_TEXTURE_2D:
917 if (activetmuState->texture_2d.value)
919 FlushOnStateChange();
920 glEsImpl->glDisable(cap);
921 activetmuState->texture_2d.value = GL_FALSE;
922 return;
926 break;
928 default:
929 break;
932 if (statechanged)
934 FlushOnStateChange();
935 glEsImpl->glDisable(cap);
936 }
939 void glVertex2f(GLfloat x, GLfloat y)
941 glVertex3f(x,y,0.0f);
945 __FORCEINLINE unsigned int ClampTo255(float value)
947 unsigned int retval = (unsigned int)(value);
948 if (retval > 255)
950 retval = 255;
952 return retval;
955 void glColor3f( GLfloat red, GLfloat green, GLfloat blue)
957 currentVertexAttrib.red = (unsigned char)ClampTo255(red*255.0f);
958 currentVertexAttrib.green = (unsigned char)ClampTo255(green*255.0f);
959 currentVertexAttrib.blue = (unsigned char)ClampTo255(blue*255.0f);
960 currentVertexAttrib.alpha = 255;
964 void glTexCoord2fv( const GLfloat *v )
966 memcpy(&currentVertexAttrib.s, v, 2*sizeof(float));
970 void glTexCoord2f(GLfloat s, GLfloat t)
972 currentVertexAttrib.s = s;
973 currentVertexAttrib.t = t;
976 void glViewport (GLint x, GLint y, GLsizei width, GLsizei height)
978 FlushOnStateChange();
979 glEsImpl->glViewport(x,y,width,height);
982 void glLoadIdentity (void)
984 FlushOnStateChange();
985 glEsImpl->glLoadIdentity();
988 void glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
990 currentVertexAttrib.red = (unsigned char)ClampTo255(red*255.0f);
991 currentVertexAttrib.green = (unsigned char)ClampTo255(green*255.0f);
992 currentVertexAttrib.blue = (unsigned char)ClampTo255(blue*255.0f);
993 currentVertexAttrib.alpha = (unsigned char)ClampTo255(alpha*255.0f);
996 void glOrtho (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
998 FlushOnStateChange();
999 #ifdef USE_CORE_PROFILE
1000 glEsImpl->glOrtho(left,right,bottom,top, zNear,zFar);
1001 #else
1002 glEsImpl->glOrthof(left,right,bottom,top, zNear,zFar);
1003 #endif
1006 void glMatrixMode (GLenum mode)
1008 if (nanoglState.matrixmode == mode)
1010 return;
1012 nanoglState.matrixmode = mode;
1013 FlushOnStateChange();
1014 glEsImpl->glMatrixMode(mode);
1017 void glTexParameterf (GLenum target, GLenum pname, GLfloat param)
1019 if (pname == GL_TEXTURE_BORDER_COLOR)
1021 return; // not supported by opengl es
1023 if ( (pname == GL_TEXTURE_WRAP_S ||
1024 pname == GL_TEXTURE_WRAP_T) &&
1025 param == GL_CLAMP)
1027 param = 0x812F;
1030 FlushOnStateChange();
1031 glEsImpl->glTexParameterf(target, pname,param);
1034 void glTexParameterfv( GLenum target, GLenum pname, const GLfloat *params)
1036 glTexParameterf(target, pname, params[0]);
1039 void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1041 FlushOnStateChange();
1042 internalformat = format;
1043 glEsImpl->glTexImage2D(target, level, internalformat, width, height,border,format,type,pixels);
1046 void glDrawBuffer(GLenum /*mode*/)
1050 void glTranslatef (GLfloat x, GLfloat y, GLfloat z)
1052 FlushOnStateChange();
1053 glEsImpl->glTranslatef(x,y,z);
1056 void glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
1058 FlushOnStateChange();
1059 glEsImpl->glRotatef(angle, x, y, z);
1062 void glScalef (GLfloat x, GLfloat y, GLfloat z)
1064 FlushOnStateChange();
1065 glEsImpl->glScalef(x,y,z);
1068 void glDepthRange(GLclampf zNear, GLclampf zFar)
1070 if ((nanoglState.depth_range_near == zNear) &&(nanoglState.depth_range_far == zFar))
1072 return;
1074 else
1076 nanoglState.depth_range_near = zNear;
1077 nanoglState.depth_range_far = zFar;
1079 FlushOnStateChange();
1080 #ifdef USE_CORE_PROFILE
1081 glEsImpl->glDepthRange(zNear, zFar);
1082 #else
1083 glEsImpl->glDepthRangef(zNear, zFar);
1084 #endif
1087 void glDepthFunc (GLenum func)
1089 if (nanoglState.depth_func == func)
1091 return;
1093 else
1095 nanoglState.depth_func = func;
1097 FlushOnStateChange();
1098 glEsImpl->glDepthFunc(func);
1101 void glFinish (void)
1103 FlushOnStateChange();
1104 glEsImpl->glFinish();
1107 void glGetFloatv (GLenum pname, GLfloat *params)
1109 FlushOnStateChange();
1110 glEsImpl->glGetFloatv(pname, params);
1113 void glCullFace (GLenum mode)
1115 if (nanoglState.cullface == mode)
1117 return;
1119 else
1121 nanoglState.cullface = mode;
1123 FlushOnStateChange();
1124 glEsImpl->glCullFace(mode);
1127 void glFrustum (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
1129 FlushOnStateChange();
1130 glEsImpl->glFrustumf(left,right,bottom,top,zNear,zFar);
1133 void glClear (GLbitfield mask)
1135 FlushOnStateChange();
1136 glEsImpl->glClear(mask);
1140 void glVertex3f( GLfloat x, GLfloat y, GLfloat z )
1142 GLfloat* vert = (GLfloat*)ptrVertexAttribArray++;
1143 *vert++ = x;
1144 *vert++ = y;
1145 *vert++ = z;
1146 #if defined(__MULTITEXTURE_SUPPORT__)
1147 memcpy(vert, &currentVertexAttrib.red, 5*sizeof(GLfloat));
1148 #else
1149 memcpy(vert+1, &currentVertexAttrib.red, 3*sizeof(GLfloat));
1150 #endif
1154 void glColor4fv( const GLfloat *v )
1156 currentVertexAttrib.red = (unsigned char)ClampTo255(v[0]*255.0f);
1157 currentVertexAttrib.green = (unsigned char)ClampTo255(v[1]*255.0f);
1158 currentVertexAttrib.blue = (unsigned char)ClampTo255(v[2]*255.0f);
1159 currentVertexAttrib.alpha = (unsigned char)ClampTo255(v[3]*255.0f);
1162 void glColor3ubv( const GLubyte* v)
1164 currentVertexAttrib.red = v[0];
1165 currentVertexAttrib.green = v[1];
1166 currentVertexAttrib.blue = v[2];
1167 currentVertexAttrib.alpha = 255;
1170 void glColor4ubv( const GLubyte *v )
1171 {
1172 //*((unsigned int*)(&currentVertexAttrib.red)) = *((unsigned int*)(v));
1173 currentVertexAttrib.red = v[0];
1174 currentVertexAttrib.green = v[1];
1175 currentVertexAttrib.blue = v[2];
1176 currentVertexAttrib.alpha = v[3];
1179 void glColor3fv( const GLfloat *v )
1181 currentVertexAttrib.red = (unsigned char)ClampTo255(v[0]*255.0f);
1182 currentVertexAttrib.green = (unsigned char)ClampTo255(v[1]*255.0f);
1183 currentVertexAttrib.blue = (unsigned char)ClampTo255(v[2]*255.0f);
1184 currentVertexAttrib.alpha = 255;
1187 //-- nicknekit: xash3d funcs --
1189 void glColor4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
1191 currentVertexAttrib.red = red;
1192 currentVertexAttrib.green = green;
1193 currentVertexAttrib.blue = blue;
1194 currentVertexAttrib.alpha = alpha;
1197 void glColor3ub( GLubyte red, GLubyte green, GLubyte blue)
1199 currentVertexAttrib.red = red;
1200 currentVertexAttrib.green = green;
1201 currentVertexAttrib.blue = blue;
1202 currentVertexAttrib.alpha = 255;
1205 void glNormal3fv( const GLfloat *v )
1207 FlushOnStateChange();
1208 glEsImpl->glNormal3f(v[0],v[1],v[2]);
1211 void glCopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border )
1213 FlushOnStateChange();
1214 glEsImpl->glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
1217 void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1219 glTexImage2D(GL_TEXTURE_2D, level, internalformat, width, 1, border, format, type, pixels);
1222 void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1224 glTexImage2D(GL_TEXTURE_2D, level, internalformat, width, height, border, format, type, pixels);
1227 void glTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels )
1229 glTexSubImage2D(target,level,xoffset,0,width,1,format,type,pixels);
1232 void glTexSubImage3D( GLenum target, GLint level,
1233 GLint xoffset, GLint yoffset,
1234 GLint zoffset, GLsizei width,
1235 GLsizei height, GLsizei depth,
1236 GLenum format,
1237 GLenum type, const GLvoid *pixels)
1239 glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
1244 GLboolean glIsTexture(GLuint texture)
1246 FlushOnStateChange();
1247 return glEsImpl->glIsTexture(texture);
1251 void glTexGeni( GLenum coord, GLenum pname, GLint param )
1253 //for mirrors? not needed for original hl?
1256 void glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
1258 //for mirrors? not needed for original hl?
1261 //-- --//
1263 void glHint (GLenum target, GLenum mode)
1265 FlushOnStateChange();
1266 glEsImpl->glHint(target, mode);
1269 void glBlendFunc (GLenum sfactor, GLenum dfactor)
1271 if ((nanoglState.sfactor == sfactor) && (nanoglState.dfactor == dfactor))
1273 return;
1275 nanoglState.sfactor = sfactor;
1276 nanoglState.dfactor = dfactor;
1277 FlushOnStateChange();
1278 glEsImpl->glBlendFunc(sfactor, dfactor);
1281 void glPopMatrix (void)
1283 FlushOnStateChange();
1284 glEsImpl->glPopMatrix();
1287 void glShadeModel (GLenum mode)
1289 if (nanoglState.shademodel == mode)
1291 return;
1293 nanoglState.shademodel = mode;
1294 FlushOnStateChange();
1295 glEsImpl->glShadeModel(mode);
1298 void glPushMatrix (void)
1300 FlushOnStateChange();
1301 glEsImpl->glPushMatrix();
1304 void glTexEnvf (GLenum target, GLenum pname, GLfloat param)
1306 if (target == GL_TEXTURE_ENV)
1308 if (pname == GL_TEXTURE_ENV_MODE)
1310 if (param == activetmuState->texture_env_mode.value)
1312 return;
1313 }
1314 else
1316 FlushOnStateChange();
1317 glEsImpl->glTexEnvf(target, pname, param);
1318 activetmuState->texture_env_mode.value = param;
1319 return;
1323 FlushOnStateChange();
1324 glEsImpl->glTexEnvf(target, pname, param);
1327 void glVertex3fv( const GLfloat *v )
1329 GLfloat* vert = (GLfloat*)ptrVertexAttribArray++;
1330 memcpy(vert, v, 3*sizeof(GLfloat));
1331 #if defined(__MULTITEXTURE_SUPPORT__)
1332 memcpy(vert+3, &currentVertexAttrib.red, 5*sizeof(GLfloat));
1333 #else
1334 memcpy(vert+4, &currentVertexAttrib.red, 3*sizeof(GLfloat));
1335 #endif
1339 void glDepthMask (GLboolean flag)
1341 if (nanoglState.depthmask == flag)
1343 return;
1345 nanoglState.depthmask = flag;
1346 FlushOnStateChange();
1347 glEsImpl->glDepthMask(flag);
1350 void glBindTexture (GLenum target, GLuint texture)
1352 if (activetmuState->boundtexture.value == texture)
1354 return;
1356 FlushOnStateChange();
1357 activetmuState->boundtexture.value = texture;
1358 glEsImpl->glBindTexture(target, texture);
1362 void glGetIntegerv (GLenum pname, GLint *params)
1364 FlushOnStateChange();
1365 glEsImpl->glGetIntegerv(pname, params);
1368 GLubyte nano_extensions_string[4096];
1369 const GLubyte* glGetString (GLenum name)
1372 if (name == GL_EXTENSIONS)
1374 #if defined(__MULTITEXTURE_SUPPORT__)
1375 sprintf((char*)nano_extensions_string,"%s %s",glEsImpl->glGetString(name),"GL_ARB_multitexture EXT_texture_env_add");
1376 #else
1377 sprintf((char*)nano_extensions_string,"%s %s",glEsImpl->glGetString(name),"EXT_texture_env_add");
1378 #endif
1379 return nano_extensions_string;
1381 return glEsImpl->glGetString(name);
1384 void glAlphaFunc (GLenum func, GLclampf ref)
1386 FlushOnStateChange();
1387 glEsImpl->glAlphaFunc(func,ref);
1390 void glFlush (void)
1392 FlushOnStateChange();
1393 glEsImpl->glFlush();
1396 void glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
1398 if (format == GL_DEPTH_COMPONENT)
1400 // OpenglEs 1.1 does not support reading depth buffer without an extension
1401 memset(pixels, 0xff,4);
1402 return;
1404 FlushOnStateChange();
1405 glEsImpl->glReadPixels(x,y,width,height,format,type,pixels);
1408 void glReadBuffer( GLenum /*mode*/ )
1413 void glLoadMatrixf (const GLfloat *m)
1415 FlushOnStateChange();
1416 glEsImpl->glLoadMatrixf(m);
1419 void glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
1421 FlushOnStateChange();
1422 glEsImpl->glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
1425 void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1427 FlushOnStateChange();
1428 glEsImpl->glClearColor(red,green,blue,alpha);
1431 GLenum glGetError (void)
1433 //FlushOnStateChange();
1434 return GL_NO_ERROR;//glEsImpl->glGetError();
1437 void glActiveTexture (GLenum texture)
1439 if (activetmu == texture)
1441 return;
1443 if (delayedttmuchange)
1445 delayedttmuchange = GL_FALSE;
1447 else
1449 delayedttmuchange = GL_TRUE;
1450 delayedtmutarget = texture;
1452 if (texture == GL_TEXTURE0)
1454 activetmuState = &tmuState0;
1456 else
1458 activetmuState = &tmuState1;
1460 activetmu = texture;
1463 void glClientActiveTexture (GLenum texture)
1465 clientactivetmu = texture;
1468 void glPolygonMode( GLenum face, GLenum mode )
1472 void glDeleteTextures( GLsizei n, const GLuint *textures )
1474 FlushOnStateChange();
1475 glEsImpl->glDeleteTextures(n,textures);
1478 void glClearDepth( GLclampf depth )
1480 FlushOnStateChange();
1481 glEsImpl->glClearDepthf( depth );
1484 void glClipPlane( GLenum plane, const GLdouble *equation )
1486 FlushOnStateChange();
1487 float array[4];
1488 array[0] = (GLfloat)(equation[0]);
1489 array[1] = (GLfloat)(equation[1]);
1490 array[2] = (GLfloat)(equation[2]);
1491 array[3] = (GLfloat)(equation[3]);
1492 glEsImpl->glClipPlanef( plane, array );
1495 void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )
1497 FlushOnStateChange();
1498 glEsImpl->glScissor( x, y, width,height);
1501 void glPointSize( GLfloat size )
1503 FlushOnStateChange();
1504 glEsImpl->glPointSize( size );
1507 void glArrayElement(GLint i) {}
1508 void glLineWidth(GLfloat width) {}
1509 void glCallList( GLuint list ) {}
1510 void glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ) {}
1511 void glStencilFunc( GLenum func, GLint ref, GLuint mask ) {}
1512 void glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ) {}
1514 struct ptrstate vertex_array;
1515 struct ptrstate color_array;
1516 struct ptrstate texture_coord_array;
1518 void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices )
1520 // ensure that all primitives specified between glBegin/glEnd pairs
1521 // are rendered first, and that we have correct tmu in use..
1522 FlushOnStateChange();
1523 // setup correct vertex/color/texcoord pointers
1524 if (arraysValid ||
1525 tmuState0.vertex_array.changed ||
1526 tmuState0.color_array.changed ||
1527 tmuState0.texture_coord_array.changed)
1529 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
1531 if (arraysValid || tmuState0.vertex_array.changed)
1533 if (tmuState0.vertex_array.enabled)
1535 glEsImpl->glEnableClientState(GL_VERTEX_ARRAY);
1537 else
1539 glEsImpl->glDisableClientState(GL_VERTEX_ARRAY);
1541 glEsImpl->glVertexPointer(tmuState0.vertex_array.size,
1542 tmuState0.vertex_array.type,
1543 tmuState0.vertex_array.stride,
1544 tmuState0.vertex_array.ptr);
1545 tmuState0.vertex_array.changed = GL_FALSE;
1547 if (arraysValid || tmuState0.color_array.changed)
1549 if (tmuState0.color_array.enabled)
1551 glEsImpl->glEnableClientState(GL_COLOR_ARRAY);
1553 else
1555 glEsImpl->glDisableClientState(GL_COLOR_ARRAY);
1557 glEsImpl->glColorPointer(tmuState0.color_array.size,
1558 tmuState0.color_array.type,
1559 tmuState0.color_array.stride,
1560 tmuState0.color_array.ptr);
1561 tmuState0.color_array.changed = GL_FALSE;
1563 if (arraysValid || tmuState0.texture_coord_array.changed)
1565 tmuState0.texture_coord_array.changed = GL_FALSE;
1566 if (tmuState0.texture_coord_array.enabled)
1568 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1570 else
1572 glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1574 glEsImpl->glTexCoordPointer(tmuState0.texture_coord_array.size,
1575 tmuState0.texture_coord_array.type,
1576 tmuState0.texture_coord_array.stride,
1577 tmuState0.texture_coord_array.ptr);
1580 if (arraysValid || tmuState1.texture_coord_array.changed)
1582 tmuState1.texture_coord_array.changed = GL_FALSE;
1583 glEsImpl->glClientActiveTexture(GL_TEXTURE1);
1584 if (tmuState1.texture_coord_array.enabled)
1586 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1588 else
1590 glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1592 glEsImpl->glTexCoordPointer(tmuState1.texture_coord_array.size,
1593 tmuState1.texture_coord_array.type,
1594 tmuState1.texture_coord_array.stride,
1595 tmuState1.texture_coord_array.ptr);
1598 arraysValid = GL_FALSE;
1599 glEsImpl->glDrawElements(mode, count, type, indices);
1602 void glEnableClientState(GLenum array)
1604 struct nanotmuState* clientstate = NULL;
1605 if (clientactivetmu == GL_TEXTURE0)
1607 clientstate = &tmuState0;
1609 else if (clientactivetmu == GL_TEXTURE1)
1611 clientstate = &tmuState1;
1613 else
1615 return;
1617 switch (array)
1619 case GL_VERTEX_ARRAY:
1620 if (clientstate->vertex_array.enabled)
1622 return;
1624 clientstate->vertex_array.enabled = GL_TRUE;
1625 clientstate->vertex_array.changed = GL_TRUE;
1626 break;
1627 case GL_COLOR_ARRAY:
1628 if (clientstate->color_array.enabled)
1630 return;
1632 clientstate->color_array.enabled = GL_TRUE;
1633 clientstate->color_array.changed = GL_TRUE;
1635 break;
1636 case GL_TEXTURE_COORD_ARRAY:
1637 if (clientstate->texture_coord_array.enabled)
1639 return;
1641 clientstate->texture_coord_array.enabled = GL_TRUE;
1642 clientstate->texture_coord_array.changed = GL_TRUE;
1643 break;
1644 default:
1645 break;
1648 void glDisableClientState(GLenum array)
1650 struct nanotmuState* clientstate = NULL;
1651 if (clientactivetmu == GL_TEXTURE0)
1653 clientstate = &tmuState0;
1655 else if (clientactivetmu == GL_TEXTURE1)
1657 clientstate = &tmuState1;
1659 else
1661 return;
1663 switch (array)
1665 case GL_VERTEX_ARRAY:
1666 if (!clientstate->vertex_array.enabled)
1668 return;
1670 clientstate->vertex_array.enabled = GL_FALSE;
1671 clientstate->vertex_array.changed = GL_TRUE;
1672 break;
1673 case GL_COLOR_ARRAY:
1674 if (!clientstate->color_array.enabled)
1676 return;
1678 clientstate->color_array.enabled = GL_FALSE;
1679 clientstate->color_array.changed = GL_TRUE;
1681 break;
1682 case GL_TEXTURE_COORD_ARRAY:
1683 if (!clientstate->texture_coord_array.enabled)
1685 return;
1687 clientstate->texture_coord_array.enabled = GL_FALSE;
1688 clientstate->texture_coord_array.changed = GL_TRUE;
1689 break;
1690 default:
1691 break;
1694 void glVertexPointer( GLint size, GLenum type,GLsizei stride, const GLvoid *pointer )
1696 if (tmuState0.vertex_array.size == size &&
1697 tmuState0.vertex_array.stride == stride &&
1698 tmuState0.vertex_array.type == type &&
1699 tmuState0.vertex_array.ptr == pointer)
1701 return;
1703 tmuState0.vertex_array.size = size;
1704 tmuState0.vertex_array.stride = stride;
1705 tmuState0.vertex_array.type = type;
1706 tmuState0.vertex_array.ptr = (GLvoid*)pointer;
1707 tmuState0.vertex_array.changed = GL_TRUE;
1709 void glTexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
1711 struct nanotmuState* clientstate = NULL;
1712 if (clientactivetmu == GL_TEXTURE0)
1714 clientstate = &tmuState0;
1716 else if (clientactivetmu == GL_TEXTURE1)
1718 clientstate = &tmuState1;
1720 if (clientstate->texture_coord_array.size == size &&
1721 clientstate->texture_coord_array.stride == stride &&
1722 clientstate->texture_coord_array.type == type &&
1723 clientstate->texture_coord_array.ptr == pointer)
1725 return;
1727 clientstate->texture_coord_array.size = size;
1728 clientstate->texture_coord_array.stride = stride;
1729 clientstate->texture_coord_array.type = type;
1730 clientstate->texture_coord_array.ptr = (GLvoid*)pointer;
1731 clientstate->texture_coord_array.changed = GL_TRUE;
1733 void glColorPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
1735 if (tmuState0.color_array.size == size &&
1736 tmuState0.color_array.stride == stride &&
1737 tmuState0.color_array.type == type &&
1738 tmuState0.color_array.ptr == pointer)
1740 return;
1742 tmuState0.color_array.size = size;
1743 tmuState0.color_array.stride = stride;
1744 tmuState0.color_array.type = type;
1745 tmuState0.color_array.ptr = (GLvoid*)pointer;
1746 tmuState0.color_array.changed = GL_TRUE;
1748 void glPolygonOffset( GLfloat factor, GLfloat units )
1750 FlushOnStateChange();
1751 glEsImpl->glPolygonOffset(factor, units);
1753 void glStencilMask( GLuint mask ) {}
1754 void glClearStencil( GLint s ) {}
1756 #if defined(__MULTITEXTURE_SUPPORT__)
1758 extern "C" void glMultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t );
1760 void glMultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t )
1762 if (target == GL_TEXTURE0)
1764 glTexCoord2f(s,t);
1766 else
1768 currentVertexAttrib.s_multi = s;
1769 currentVertexAttrib.t_multi = t;
1772 #endif
1774 /* Vladimir */
1775 void glDrawArrays( GLenum mode, int first, int count)
1777 FlushOnStateChange();
1778 glEsImpl->glDrawArrays(mode, first , count);
1780 void glMultMatrixf (const GLfloat *m)
1782 FlushOnStateChange();
1783 glEsImpl->glMultMatrixf(m);
1786 void glPixelStorei (GLenum pname, GLint param)
1788 FlushOnStateChange();
1789 glEsImpl->glPixelStorei(pname, param);
1793 void glFogf (GLenum pname, GLfloat param)
1795 FlushOnStateChange();
1796 glEsImpl->glFogf(pname, param);
1799 void glFogfv (GLenum pname, const GLfloat *params)
1801 FlushOnStateChange();
1802 glEsImpl->glFogfv(pname, params);
1805 void glGetTexParameteriv (GLenum target, GLenum pname, GLint *params)
1807 FlushOnStateChange();
1808 glEsImpl->glGetTexParameteriv(target, pname, params);
1812 // This gives: called unimplemented OpenGL ES API (Android)
1813 void glTexParameteri (GLenum target, GLenum pname, GLint param)
1815 if (pname == GL_TEXTURE_BORDER_COLOR) {
1816 return; // not supported by opengl es
1818 if ( (pname == GL_TEXTURE_WRAP_S ||
1819 pname == GL_TEXTURE_WRAP_T) &&
1820 param == GL_CLAMP) {
1821 param = 0x812F;
1824 FlushOnStateChange();
1825 glEsImpl->glTexParameteri(target, pname, param);
1828 void glTexParameterx (GLenum target, GLenum pname, GLfixed param)
1830 if (pname == GL_TEXTURE_BORDER_COLOR) {
1831 return; // not supported by opengl es
1833 if ( (pname == GL_TEXTURE_WRAP_S ||
1834 pname == GL_TEXTURE_WRAP_T) &&
1835 param == GL_CLAMP) {
1836 param = 0x812F;
1838 FlushOnStateChange();
1839 glEsImpl->glTexParameterx(target, pname, param);
1842 void glGenTextures (GLsizei n, GLuint *textures)
1844 FlushOnStateChange();
1845 glEsImpl->glGenTextures(n, textures);
1848 void glFrontFace (GLenum mode)
1850 FlushOnStateChange();
1851 glEsImpl->glFrontFace(mode);
1856 // End Vladimir