DEADSOFTWARE

Make NanoGL compiling statically. Again.
[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"
32 #define GL_TEXTURE0_ARB 0x84C0
33 #define GL_TEXTURE1_ARB 0x84C1
35 struct nanoState
36 {
37 GLboolean alpha_test;
38 GLboolean blend;
39 GLboolean clip_planei;
40 GLboolean color_logic_op;
41 GLboolean color_material;
42 GLboolean cull_face;
43 GLboolean depth_test;
44 GLboolean dither;
45 GLboolean fog;
46 GLboolean lighti;
47 GLboolean lighting;
48 GLboolean line_smooth;
49 GLboolean matrix_palette_oes;
50 GLboolean multisample;
51 GLboolean normalize;
52 GLboolean point_smooth;
53 GLboolean point_sprite_oes;
54 GLboolean polygon_offset_fill;
55 GLboolean rescale_normal;
56 GLboolean sample_alpha_to_coverage;
57 GLboolean sample_alpha_to_one;
58 GLboolean sample_coverage;
59 GLboolean scissor_test;
60 GLboolean stencil_test;
61 GLboolean depthmask;
62 GLclampf depth_range_near;
63 GLclampf depth_range_far;
64 GLenum depth_func;
65 GLenum cullface;
66 GLenum shademodel;
67 GLenum sfactor;
68 GLenum dfactor;
69 GLenum matrixmode;
70 };
72 static struct nanoState nanoglState;
74 static struct nanoState nanoglInitState =
75 {
76 GL_FALSE,
77 GL_FALSE,
78 GL_FALSE,
79 GL_FALSE,
80 GL_FALSE,
81 GL_FALSE,
82 GL_FALSE,
83 GL_TRUE,
84 GL_FALSE,
85 GL_FALSE,
86 GL_FALSE,
87 GL_FALSE,
88 GL_FALSE,
89 GL_TRUE,
90 GL_FALSE,
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_TRUE,
101 0.0f,
102 1.0f,
103 GL_LESS,
104 GL_BACK,
105 GL_SMOOTH,
106 GL_ONE,
107 GL_ZERO,
108 GL_MODELVIEW,
109 };
111 struct booleanstate
113 GLboolean value;
114 GLboolean changed;
115 };
117 struct floatstate
119 GLfloat value;
120 GLboolean changed;
121 };
123 struct uintstate
125 GLuint value;
126 GLboolean changed;
127 };
129 struct ptrstate
131 GLint size;
132 GLenum type;
133 GLsizei stride;
134 GLvoid* ptr;
135 GLboolean changed;
136 GLboolean enabled;
137 };
140 struct nanotmuState
142 struct booleanstate texture_2d;
143 struct floatstate texture_env_mode;
144 struct uintstate boundtexture;
145 struct ptrstate vertex_array;
146 struct ptrstate color_array;
147 struct ptrstate texture_coord_array;
148 };
150 static struct nanotmuState tmuState0;
151 static struct nanotmuState tmuState1;
153 static struct nanotmuState tmuInitState =
155 {GL_FALSE, GL_FALSE},
156 {GL_MODULATE,GL_FALSE},
157 {0x7fffffff,GL_FALSE},
158 {4,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE},
159 {4,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE},
160 {4,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE},
161 };
163 static struct nanotmuState* activetmuState = &tmuState0;
165 extern "C++" GlESInterface* glEsImpl;
167 static GLenum wrapperPrimitiveMode = GL_QUADS;
168 GLboolean useTexCoordArray = GL_FALSE;
169 static GLenum activetmu = GL_TEXTURE0;
170 static GLenum clientactivetmu = GL_TEXTURE0;
172 #if defined(__MULTITEXTURE_SUPPORT__)
173 GLboolean useMultiTexCoordArray = GL_FALSE;
174 #endif
177 #if !defined (__WINS__)
178 //#define __FORCEINLINE __forceinline
179 #define __FORCEINLINE inline
180 #else
181 #define __FORCEINLINE
182 #endif
184 static GLboolean delayedttmuchange = GL_FALSE;
185 static GLenum delayedtmutarget = GL_TEXTURE0;
187 struct VertexAttrib
189 float x;
190 float y;
191 float z;
192 #if !defined(__MULTITEXTURE_SUPPORT__)
193 float padding;
194 #endif
195 unsigned char red;
196 unsigned char green;
197 unsigned char blue;
198 unsigned char alpha;
200 float s;
201 float t;
202 #if defined(__MULTITEXTURE_SUPPORT__)
203 float s_multi;
204 float t_multi;
205 #endif
206 };
208 static VertexAttrib vertexattribs[8000];
210 static GLushort indexArray[30000];
212 static GLuint vertexCount = 0;
213 static GLuint indexCount = 0;
214 static GLuint vertexMark = 0;
215 static int indexbase = 0;
217 static VertexAttrib* ptrVertexAttribArray = NULL;
218 static VertexAttrib* ptrVertexAttribArrayMark = NULL;
220 static VertexAttrib currentVertexAttrib;
221 #if defined(__MULTITEXTURE_SUPPORT__)
222 static VertexAttrib currentVertexAttribInit = {0.0f,0.0f,0.0f,
223 255,255,255,255,
224 0.0f,0.0f,
225 0.0f,0.0f
226 };
227 #else
228 static VertexAttrib currentVertexAttribInit = {0.0f,0.0f,0.0f,0.0f,
229 255,255,255,255,
230 0.0f,0.0f,
231 };
232 #endif
233 static GLushort* ptrIndexArray = NULL;
235 static GLboolean arraysValid = GL_FALSE;
237 void InitGLStructs()
239 ptrVertexAttribArray = vertexattribs;
240 ptrVertexAttribArrayMark = ptrVertexAttribArray;
241 ptrIndexArray = indexArray;
243 memcpy(&nanoglState, &nanoglInitState, sizeof(struct nanoState));
244 memcpy(&tmuState0,&tmuInitState,sizeof(struct nanotmuState));
245 memcpy(&tmuState1,&tmuInitState,sizeof(struct nanotmuState));
246 memcpy(&currentVertexAttrib,&currentVertexAttribInit,sizeof(struct VertexAttrib));
248 activetmuState = &tmuState0;
249 wrapperPrimitiveMode = GL_QUADS;
250 useTexCoordArray = GL_FALSE;
251 activetmu = GL_TEXTURE0;
252 clientactivetmu = GL_TEXTURE0;
253 delayedttmuchange = GL_FALSE;
254 delayedtmutarget = GL_TEXTURE0;
255 vertexCount = 0;
256 indexCount = 0;
257 vertexMark = 0;
258 indexbase = 0;
259 arraysValid = GL_FALSE;
263 void FlushOnStateChange()
265 if (delayedttmuchange)
267 delayedttmuchange = GL_FALSE;
268 glEsImpl->glActiveTexture(delayedtmutarget);
271 if (!vertexCount)
272 return;
274 if (!arraysValid)
276 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
277 glEsImpl->glVertexPointer(3, GL_FLOAT, sizeof(VertexAttrib), &vertexattribs[0].x);
278 glEsImpl->glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(VertexAttrib), &vertexattribs[0].red);
279 glEsImpl->glTexCoordPointer(2, GL_FLOAT, sizeof(VertexAttrib), &vertexattribs[0].s);
280 glEsImpl->glEnableClientState(GL_VERTEX_ARRAY);
281 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
282 glEsImpl->glEnableClientState(GL_COLOR_ARRAY);
283 #if defined(__MULTITEXTURE_SUPPORT__)
284 glEsImpl->glClientActiveTexture(GL_TEXTURE1);
285 glEsImpl->glTexCoordPointer(2, GL_FLOAT, sizeof(VertexAttrib), &vertexattribs[0].s_multi);
286 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
287 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
288 #endif
289 arraysValid = GL_TRUE;
292 glEsImpl->glDrawElements( GL_TRIANGLES,vertexCount,GL_UNSIGNED_SHORT, indexArray );
295 #if defined(__MULTITEXTURE_SUPPORT__)
296 useMultiTexCoordArray = GL_FALSE;
297 #endif
298 vertexCount = 0;
299 indexCount = 0;
300 ptrVertexAttribArray = vertexattribs;
301 ptrVertexAttribArrayMark = ptrVertexAttribArray;
302 ptrIndexArray = indexArray;
303 useTexCoordArray = GL_FALSE;
306 void glBegin(GLenum mode)
308 wrapperPrimitiveMode = mode;
309 vertexMark = vertexCount;
310 ptrVertexAttribArrayMark = ptrVertexAttribArray;
311 indexbase = indexCount;
314 void glEnd(void)
316 vertexCount+=((unsigned char*)ptrVertexAttribArray-(unsigned char*)ptrVertexAttribArrayMark)/sizeof(VertexAttrib);
317 if (vertexCount < 3)
319 return;
321 switch (wrapperPrimitiveMode)
323 case GL_QUADS:
325 *ptrIndexArray++ = indexCount;
326 *ptrIndexArray++ = indexCount+1;
327 *ptrIndexArray++ = indexCount+2;
328 *ptrIndexArray++ = indexCount;
329 *ptrIndexArray++ = indexCount+2;
330 *ptrIndexArray++ = indexCount+3;
331 indexCount+=4;
332 vertexCount+=2;
334 break;
335 case GL_TRIANGLES:
337 int vcount = (vertexCount-vertexMark)/3;
338 for (int count = 0; count < vcount; count++)
340 *ptrIndexArray++ = indexCount;
341 *ptrIndexArray++ = indexCount+1;
342 *ptrIndexArray++ = indexCount+2;
343 indexCount+=3;
346 break;
347 case GL_TRIANGLE_STRIP:
349 *ptrIndexArray++ = indexCount;
350 *ptrIndexArray++ = indexCount+1;
351 *ptrIndexArray++ = indexCount+2;
352 indexCount+=3;
353 int vcount = ((vertexCount-vertexMark)-3);
354 if (vcount && ((long)ptrIndexArray & 0x02))
356 *ptrIndexArray++ = indexCount-1; // 2
357 *ptrIndexArray++ = indexCount-2; // 1
358 *ptrIndexArray++ = indexCount; // 3
359 indexCount++;
360 vcount-=1;
361 int odd = vcount&1;
362 vcount/=2;
363 unsigned int* longptr = (unsigned int*) ptrIndexArray;
365 for (int count = 0; count < vcount; count++)
367 *(longptr++) = (indexCount-2) | ((indexCount-1)<<16);
368 *(longptr++) = (indexCount) | ((indexCount)<<16);
369 *(longptr++) = (indexCount-1) | ((indexCount+1)<<16);
370 indexCount+=2;
372 ptrIndexArray = (unsigned short*)(longptr);
373 if (odd)
375 *ptrIndexArray++ = indexCount-2; // 2
376 *ptrIndexArray++ = indexCount-1; // 1
377 *ptrIndexArray++ = indexCount; // 3
378 indexCount++;
381 else
383 //already aligned
384 int odd = vcount&1;
385 vcount/=2;
386 unsigned int* longptr = (unsigned int*) ptrIndexArray;
388 for (int count = 0; count < vcount; count++)
389 {
390 *(longptr++) = (indexCount-1) | ((indexCount-2)<<16);
391 *(longptr++) = (indexCount) | ((indexCount-1)<<16);
392 *(longptr++) = (indexCount) | ((indexCount+1)<<16);
393 indexCount+=2;
396 ptrIndexArray = (unsigned short*)(longptr);
397 if (odd)
400 *ptrIndexArray++ = indexCount-1; // 2
401 *ptrIndexArray++ = indexCount-2; // 1
402 *ptrIndexArray++ = indexCount; // 3
403 indexCount++;
405 }
406 vertexCount+=(vertexCount-vertexMark-3)*2;
408 break;
409 case GL_POLYGON:
410 case GL_TRIANGLE_FAN:
412 *ptrIndexArray++ = indexCount++;
413 *ptrIndexArray++ = indexCount++;
414 *ptrIndexArray++ = indexCount++;
415 int vcount = ((vertexCount-vertexMark)-3);
416 for (int count = 0; count < vcount; count++)
418 *ptrIndexArray++ = indexbase;
419 *ptrIndexArray++ = indexCount-1;
420 *ptrIndexArray++ = indexCount++;
421 vertexCount+=2;
423 }
424 break;
426 default:
427 break;
431 void glEnable (GLenum cap)
433 GLboolean statechanged = GL_FALSE;
434 switch(cap)
436 case GL_ALPHA_TEST:
438 if (!nanoglState.alpha_test)
440 nanoglState.alpha_test = GL_TRUE;
441 statechanged = GL_TRUE;
443 break;
445 case GL_BLEND:
447 if (!nanoglState.blend)
449 nanoglState.blend = GL_TRUE;
450 statechanged = GL_TRUE;
452 break;
454 //case GL_CLIP_PLANEi
455 case GL_COLOR_LOGIC_OP:
457 if (!nanoglState.color_logic_op)
459 nanoglState.color_logic_op = GL_TRUE;
460 statechanged = GL_TRUE;
462 break;
464 case GL_COLOR_MATERIAL:
466 if (!nanoglState.color_material)
468 nanoglState.color_material = GL_TRUE;
469 statechanged = GL_TRUE;
471 break;
473 case GL_CULL_FACE:
475 if (!nanoglState.cull_face)
477 nanoglState.cull_face = GL_TRUE;
478 statechanged = GL_TRUE;
480 break;
482 case GL_DEPTH_TEST:
484 if (!nanoglState.depth_test)
486 nanoglState.depth_test = GL_TRUE;
487 statechanged = GL_TRUE;
489 break;
491 case GL_DITHER:
493 if (!nanoglState.dither)
495 nanoglState.dither = GL_TRUE;
496 statechanged = GL_TRUE;
498 break;
500 case GL_FOG:
501 //case GL_LIGHTi
503 if (!nanoglState.fog)
505 nanoglState.fog = GL_TRUE;
506 statechanged = GL_TRUE;
508 break;
510 case GL_LIGHTING:
512 if (!nanoglState.lighting)
514 nanoglState.lighting = GL_TRUE;
515 statechanged = GL_TRUE;
517 break;
519 case GL_LINE_SMOOTH:
521 if (!nanoglState.line_smooth)
523 nanoglState.line_smooth = GL_TRUE;
524 statechanged = GL_TRUE;
526 break;
528 /* case GL_MATRIX_PALETTE_OES:
530 if (!nanoglState.matrix_palette_oes)
532 nanoglState.matrix_palette_oes = GL_TRUE;
533 statechanged = GL_TRUE;
535 break;
536 }*/
537 case GL_MULTISAMPLE:
539 if (!nanoglState.multisample)
541 nanoglState.multisample = GL_TRUE;
542 statechanged = GL_TRUE;
544 break;
546 case GL_NORMALIZE:
548 if (!nanoglState.normalize)
550 nanoglState.normalize = GL_TRUE;
551 statechanged = GL_TRUE;
553 break;
555 /* case GL_POINT_SPRITE_OES:
557 if (!nanoglState.point_sprite_oes)
559 nanoglState.point_sprite_oes = GL_TRUE;
560 statechanged = GL_TRUE;
562 break;
563 }*/
564 case GL_POLYGON_OFFSET_FILL:
566 if (!nanoglState.polygon_offset_fill)
568 nanoglState.polygon_offset_fill = GL_TRUE;
569 statechanged = GL_TRUE;
571 break;
573 case GL_RESCALE_NORMAL:
575 if (!nanoglState.rescale_normal)
577 nanoglState.rescale_normal = GL_TRUE;
578 statechanged = GL_TRUE;
580 break;
582 case GL_SAMPLE_ALPHA_TO_COVERAGE:
584 if (!nanoglState.sample_alpha_to_coverage)
586 nanoglState.sample_alpha_to_coverage = GL_TRUE;
587 statechanged = GL_TRUE;
589 break;
591 case GL_SAMPLE_ALPHA_TO_ONE:
593 if (!nanoglState.sample_alpha_to_one)
595 nanoglState.sample_alpha_to_one = GL_TRUE;
596 statechanged = GL_TRUE;
598 break;
600 case GL_SAMPLE_COVERAGE:
602 if (!nanoglState.sample_coverage)
604 nanoglState.sample_coverage = GL_TRUE;
605 statechanged = GL_TRUE;
607 break;
609 case GL_SCISSOR_TEST:
611 if (!nanoglState.scissor_test)
613 nanoglState.scissor_test = GL_TRUE;
614 statechanged = GL_TRUE;
616 break;
618 case GL_STENCIL_TEST:
620 return;
621 /* if (!nanoglState.stencil_test)
623 nanoglState.stencil_test = GL_TRUE;
624 statechanged = GL_TRUE;
625 }*/
626 break;
628 case GL_TEXTURE_2D:
630 if (!activetmuState->texture_2d.value)
632 FlushOnStateChange();
633 glEsImpl->glEnable(cap);
634 activetmuState->texture_2d.value = GL_TRUE;
635 return;
637 break;
639 default:
640 break;
643 if (statechanged)
645 FlushOnStateChange();
646 glEsImpl->glEnable(cap);
647 }
650 void glDisable (GLenum cap)
652 GLboolean statechanged = GL_FALSE;
653 switch(cap)
655 case GL_ALPHA_TEST:
657 if (nanoglState.alpha_test)
659 nanoglState.alpha_test = GL_FALSE;
660 statechanged = GL_TRUE;
662 break;
664 case GL_BLEND:
666 if (nanoglState.blend)
668 nanoglState.blend = GL_FALSE;
669 statechanged = GL_TRUE;
671 break;
673 //case GL_CLIP_PLANEi
674 case GL_COLOR_LOGIC_OP:
676 if (nanoglState.color_logic_op)
678 nanoglState.color_logic_op = GL_FALSE;
679 statechanged = GL_TRUE;
681 break;
683 case GL_COLOR_MATERIAL:
685 if (nanoglState.color_material)
687 nanoglState.color_material = GL_FALSE;
688 statechanged = GL_TRUE;
690 break;
692 case GL_CULL_FACE:
694 if (nanoglState.cull_face)
696 nanoglState.cull_face = GL_FALSE;
697 statechanged = GL_TRUE;
699 break;
701 case GL_DEPTH_TEST:
703 if (nanoglState.depth_test)
705 nanoglState.depth_test = GL_FALSE;
706 statechanged = GL_TRUE;
708 break;
710 case GL_DITHER:
712 if (nanoglState.dither)
714 nanoglState.dither = GL_FALSE;
715 statechanged = GL_TRUE;
717 break;
719 case GL_FOG:
720 //case GL_LIGHTi
722 if (nanoglState.fog)
724 nanoglState.fog = GL_FALSE;
725 statechanged = GL_TRUE;
727 break;
729 case GL_LIGHTING:
731 if (nanoglState.lighting)
733 nanoglState.lighting = GL_FALSE;
734 statechanged = GL_TRUE;
736 break;
738 case GL_LINE_SMOOTH:
740 if (nanoglState.line_smooth)
742 nanoglState.line_smooth = GL_FALSE;
743 statechanged = GL_TRUE;
745 break;
747 /* case GL_MATRIX_PALETTE_OES:
749 if (nanoglState.matrix_palette_oes)
751 nanoglState.matrix_palette_oes = GL_FALSE;
752 statechanged = GL_TRUE;
754 break;
755 }*/
756 case GL_MULTISAMPLE:
758 if (nanoglState.multisample)
760 nanoglState.multisample = GL_FALSE;
761 statechanged = GL_TRUE;
763 break;
765 case GL_NORMALIZE:
767 if (nanoglState.normalize)
769 nanoglState.normalize = GL_FALSE;
770 statechanged = GL_TRUE;
772 break;
774 /* case GL_POINT_SPRITE_OES:
776 if (nanoglState.point_sprite_oes)
778 nanoglState.point_sprite_oes = GL_FALSE;
779 statechanged = GL_TRUE;
781 break;
782 }*/
783 case GL_POLYGON_OFFSET_FILL:
785 if (nanoglState.polygon_offset_fill)
787 nanoglState.polygon_offset_fill = GL_FALSE;
788 statechanged = GL_TRUE;
790 break;
792 case GL_RESCALE_NORMAL:
794 if (nanoglState.rescale_normal)
796 nanoglState.rescale_normal = GL_FALSE;
797 statechanged = GL_TRUE;
799 break;
801 case GL_SAMPLE_ALPHA_TO_COVERAGE:
803 if (nanoglState.sample_alpha_to_coverage)
805 nanoglState.sample_alpha_to_coverage = GL_FALSE;
806 statechanged = GL_TRUE;
808 break;
810 case GL_SAMPLE_ALPHA_TO_ONE:
812 if (nanoglState.sample_alpha_to_one)
814 nanoglState.sample_alpha_to_one = GL_FALSE;
815 statechanged = GL_TRUE;
817 break;
819 case GL_SAMPLE_COVERAGE:
821 if (nanoglState.sample_coverage)
823 nanoglState.sample_coverage = GL_FALSE;
824 statechanged = GL_TRUE;
826 break;
828 case GL_SCISSOR_TEST:
830 if (nanoglState.scissor_test)
832 nanoglState.scissor_test = GL_FALSE;
833 statechanged = GL_TRUE;
835 break;
837 case GL_STENCIL_TEST:
839 return;
840 /* if (nanoglState.stencil_test)
842 nanoglState.stencil_test = GL_FALSE;
843 statechanged = GL_TRUE;
844 }*/
845 break;
847 case GL_TEXTURE_2D:
849 if (activetmuState->texture_2d.value)
851 FlushOnStateChange();
852 glEsImpl->glDisable(cap);
853 activetmuState->texture_2d.value = GL_FALSE;
854 return;
858 break;
860 default:
861 break;
864 if (statechanged)
866 FlushOnStateChange();
867 glEsImpl->glDisable(cap);
868 }
871 void glVertex2f(GLfloat x, GLfloat y)
873 glVertex3f(x,y,0.0f);
877 __FORCEINLINE unsigned int ClampTo255(float value)
879 unsigned int retval = (unsigned int)(value);
880 if (retval > 255)
882 retval = 255;
884 return retval;
887 void glColor3f( GLfloat red, GLfloat green, GLfloat blue)
889 currentVertexAttrib.red = (unsigned char)ClampTo255(red*255.0f);
890 currentVertexAttrib.green = (unsigned char)ClampTo255(green*255.0f);
891 currentVertexAttrib.blue = (unsigned char)ClampTo255(blue*255.0f);
892 currentVertexAttrib.alpha = 255;
896 void glTexCoord2fv( const GLfloat *v )
898 memcpy(&currentVertexAttrib.s, v, 2*sizeof(float));
902 void glTexCoord2f(GLfloat s, GLfloat t)
904 currentVertexAttrib.s = s;
905 currentVertexAttrib.t = t;
908 void glViewport (GLint x, GLint y, GLsizei width, GLsizei height)
910 FlushOnStateChange();
911 glEsImpl->glViewport(x,y,width,height);
914 void glLoadIdentity (void)
916 FlushOnStateChange();
917 glEsImpl->glLoadIdentity();
920 void glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
922 currentVertexAttrib.red = (unsigned char)ClampTo255(red*255.0f);
923 currentVertexAttrib.green = (unsigned char)ClampTo255(green*255.0f);
924 currentVertexAttrib.blue = (unsigned char)ClampTo255(blue*255.0f);
925 currentVertexAttrib.alpha = (unsigned char)ClampTo255(alpha*255.0f);
928 void glOrtho (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
930 FlushOnStateChange();
931 glEsImpl->glOrthof(left,right,bottom,top, zNear,zFar);
934 void glMatrixMode (GLenum mode)
936 if (nanoglState.matrixmode == mode)
938 return;
940 nanoglState.matrixmode = mode;
941 FlushOnStateChange();
942 glEsImpl->glMatrixMode(mode);
945 void glTexParameterf (GLenum target, GLenum pname, GLfloat param)
947 if (pname == GL_TEXTURE_BORDER_COLOR)
949 return; // not supported by opengl es
951 if ( (pname == GL_TEXTURE_WRAP_S ||
952 pname == GL_TEXTURE_WRAP_T) &&
953 param == GL_CLAMP)
955 param = 0x812F;
958 FlushOnStateChange();
959 glEsImpl->glTexParameterf(target, pname,param);
962 void glTexParameterfv( GLenum target, GLenum pname, const GLfloat *params)
964 glTexParameterf(target, pname, params[0]);
967 void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
969 FlushOnStateChange();
970 internalformat = format;
971 glEsImpl->glTexImage2D(target, level, internalformat, width, height,border,format,type,pixels);
974 void glDrawBuffer(GLenum /*mode*/)
978 void glTranslatef (GLfloat x, GLfloat y, GLfloat z)
980 FlushOnStateChange();
981 glEsImpl->glTranslatef(x,y,z);
984 void glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
986 FlushOnStateChange();
987 glEsImpl->glRotatef(angle, x, y, z);
990 void glScalef (GLfloat x, GLfloat y, GLfloat z)
992 FlushOnStateChange();
993 glEsImpl->glScalef(x,y,z);
996 void glDepthRange(GLclampf zNear, GLclampf zFar)
998 if ((nanoglState.depth_range_near == zNear) &&(nanoglState.depth_range_far == zFar))
1000 return;
1002 else
1004 nanoglState.depth_range_near = zNear;
1005 nanoglState.depth_range_far = zFar;
1007 FlushOnStateChange();
1008 glEsImpl->glDepthRangef(zNear, zFar);
1011 void glDepthFunc (GLenum func)
1013 if (nanoglState.depth_func == func)
1015 return;
1017 else
1019 nanoglState.depth_func = func;
1021 FlushOnStateChange();
1022 glEsImpl->glDepthFunc(func);
1025 void glFinish (void)
1027 FlushOnStateChange();
1028 glEsImpl->glFinish();
1031 void glGetFloatv (GLenum pname, GLfloat *params)
1033 FlushOnStateChange();
1034 glEsImpl->glGetFloatv(pname, params);
1037 void glCullFace (GLenum mode)
1039 if (nanoglState.cullface == mode)
1041 return;
1043 else
1045 nanoglState.cullface = mode;
1047 FlushOnStateChange();
1048 glEsImpl->glCullFace(mode);
1051 void glFrustum (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
1053 FlushOnStateChange();
1054 glEsImpl->glFrustumf(left,right,bottom,top,zNear,zFar);
1057 void glClear (GLbitfield mask)
1059 FlushOnStateChange();
1060 glEsImpl->glClear(mask);
1064 void glVertex3f( GLfloat x, GLfloat y, GLfloat z )
1066 GLfloat* vert = (GLfloat*)ptrVertexAttribArray++;
1067 *vert++ = x;
1068 *vert++ = y;
1069 *vert++ = z;
1070 #if defined(__MULTITEXTURE_SUPPORT__)
1071 memcpy(vert, &currentVertexAttrib.red, 5*sizeof(GLfloat));
1072 #else
1073 memcpy(vert+1, &currentVertexAttrib.red, 3*sizeof(GLfloat));
1074 #endif
1078 void glColor4fv( const GLfloat *v )
1080 currentVertexAttrib.red = (unsigned char)ClampTo255(v[0]*255.0f);
1081 currentVertexAttrib.green = (unsigned char)ClampTo255(v[1]*255.0f);
1082 currentVertexAttrib.blue = (unsigned char)ClampTo255(v[2]*255.0f);
1083 currentVertexAttrib.alpha = (unsigned char)ClampTo255(v[3]*255.0f);
1086 void glColor3ubv( const GLubyte* v)
1088 currentVertexAttrib.red = v[0];
1089 currentVertexAttrib.green = v[1];
1090 currentVertexAttrib.blue = v[2];
1091 currentVertexAttrib.alpha = 255;
1094 void glColor4ubv( const GLubyte *v )
1095 {
1096 //*((unsigned int*)(&currentVertexAttrib.red)) = *((unsigned int*)(v));
1097 currentVertexAttrib.red = v[0];
1098 currentVertexAttrib.green = v[1];
1099 currentVertexAttrib.blue = v[2];
1100 currentVertexAttrib.alpha = v[3];
1103 void glColor3fv( const GLfloat *v )
1105 currentVertexAttrib.red = (unsigned char)ClampTo255(v[0]*255.0f);
1106 currentVertexAttrib.green = (unsigned char)ClampTo255(v[1]*255.0f);
1107 currentVertexAttrib.blue = (unsigned char)ClampTo255(v[2]*255.0f);
1108 currentVertexAttrib.alpha = 255;
1111 //-- nicknekit: xash3d funcs --
1113 void glColor4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
1115 currentVertexAttrib.red = red;
1116 currentVertexAttrib.green = green;
1117 currentVertexAttrib.blue = blue;
1118 currentVertexAttrib.alpha = alpha;
1121 void glColor3ub( GLubyte red, GLubyte green, GLubyte blue)
1123 currentVertexAttrib.red = red;
1124 currentVertexAttrib.green = green;
1125 currentVertexAttrib.blue = blue;
1126 currentVertexAttrib.alpha = 255;
1129 void glNormal3fv( const GLfloat *v )
1131 FlushOnStateChange();
1132 glEsImpl->glNormal3f(v[0],v[1],v[2]);
1135 void glCopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border )
1137 FlushOnStateChange();
1138 glEsImpl->glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
1141 void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1143 glTexImage2D(GL_TEXTURE_2D, level, internalformat, width, 1, border, format, type, pixels);
1146 void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1148 glTexImage2D(GL_TEXTURE_2D, level, internalformat, width, height, border, format, type, pixels);
1151 void glTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels )
1153 glTexSubImage2D(target,level,xoffset,0,width,1,format,type,pixels);
1156 void glTexSubImage3D( GLenum target, GLint level,
1157 GLint xoffset, GLint yoffset,
1158 GLint zoffset, GLsizei width,
1159 GLsizei height, GLsizei depth,
1160 GLenum format,
1161 GLenum type, const GLvoid *pixels)
1163 glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
1168 GLboolean glIsTexture(GLuint texture)
1170 FlushOnStateChange();
1171 return glEsImpl->glIsTexture(texture);
1175 void glTexGeni( GLenum coord, GLenum pname, GLint param )
1177 //for mirrors? not needed for original hl?
1180 void glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
1182 //for mirrors? not needed for original hl?
1185 //-- --//
1187 void glHint (GLenum target, GLenum mode)
1189 FlushOnStateChange();
1190 glEsImpl->glHint(target, mode);
1193 void glBlendFunc (GLenum sfactor, GLenum dfactor)
1195 if ((nanoglState.sfactor == sfactor) && (nanoglState.dfactor == dfactor))
1197 return;
1199 nanoglState.sfactor = sfactor;
1200 nanoglState.dfactor = dfactor;
1201 FlushOnStateChange();
1202 glEsImpl->glBlendFunc(sfactor, dfactor);
1205 void glPopMatrix (void)
1207 FlushOnStateChange();
1208 glEsImpl->glPopMatrix();
1211 void glShadeModel (GLenum mode)
1213 if (nanoglState.shademodel == mode)
1215 return;
1217 nanoglState.shademodel = mode;
1218 FlushOnStateChange();
1219 glEsImpl->glShadeModel(mode);
1222 void glPushMatrix (void)
1224 FlushOnStateChange();
1225 glEsImpl->glPushMatrix();
1228 void glTexEnvf (GLenum target, GLenum pname, GLfloat param)
1230 if (target == GL_TEXTURE_ENV)
1232 if (pname == GL_TEXTURE_ENV_MODE)
1234 if (param == activetmuState->texture_env_mode.value)
1236 return;
1237 }
1238 else
1240 FlushOnStateChange();
1241 glEsImpl->glTexEnvf(target, pname, param);
1242 activetmuState->texture_env_mode.value = param;
1243 return;
1247 FlushOnStateChange();
1248 glEsImpl->glTexEnvf(target, pname, param);
1251 void glVertex3fv( const GLfloat *v )
1253 GLfloat* vert = (GLfloat*)ptrVertexAttribArray++;
1254 memcpy(vert, v, 3*sizeof(GLfloat));
1255 #if defined(__MULTITEXTURE_SUPPORT__)
1256 memcpy(vert+3, &currentVertexAttrib.red, 5*sizeof(GLfloat));
1257 #else
1258 memcpy(vert+4, &currentVertexAttrib.red, 3*sizeof(GLfloat));
1259 #endif
1263 void glDepthMask (GLboolean flag)
1265 if (nanoglState.depthmask == flag)
1267 return;
1269 nanoglState.depthmask = flag;
1270 FlushOnStateChange();
1271 glEsImpl->glDepthMask(flag);
1274 void glBindTexture (GLenum target, GLuint texture)
1276 if (activetmuState->boundtexture.value == texture)
1278 return;
1280 FlushOnStateChange();
1281 activetmuState->boundtexture.value = texture;
1282 glEsImpl->glBindTexture(target, texture);
1286 void glGetIntegerv (GLenum pname, GLint *params)
1288 FlushOnStateChange();
1289 glEsImpl->glGetIntegerv(pname, params);
1292 GLubyte nano_extensions_string[4096];
1293 const GLubyte* glGetString (GLenum name)
1296 if (name == GL_EXTENSIONS)
1298 #if defined(__MULTITEXTURE_SUPPORT__)
1299 sprintf((char*)nano_extensions_string,"%s %s",glEsImpl->glGetString(name),"GL_ARB_multitexture EXT_texture_env_add");
1300 #else
1301 sprintf((char*)nano_extensions_string,"%s %s",glEsImpl->glGetString(name),"EXT_texture_env_add");
1302 #endif
1303 return nano_extensions_string;
1305 return glEsImpl->glGetString(name);
1308 void glAlphaFunc (GLenum func, GLclampf ref)
1310 FlushOnStateChange();
1311 glEsImpl->glAlphaFunc(func,ref);
1314 void glFlush (void)
1316 FlushOnStateChange();
1317 glEsImpl->glFlush();
1320 void glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
1322 if (format == GL_DEPTH_COMPONENT)
1324 // OpenglEs 1.1 does not support reading depth buffer without an extension
1325 memset(pixels, 0xff,4);
1326 return;
1328 FlushOnStateChange();
1329 glEsImpl->glReadPixels(x,y,width,height,format,type,pixels);
1332 void glReadBuffer( GLenum /*mode*/ )
1337 void glLoadMatrixf (const GLfloat *m)
1339 FlushOnStateChange();
1340 glEsImpl->glLoadMatrixf(m);
1343 void glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
1345 FlushOnStateChange();
1346 glEsImpl->glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
1349 void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1351 FlushOnStateChange();
1352 glEsImpl->glClearColor(red,green,blue,alpha);
1355 GLenum glGetError (void)
1357 FlushOnStateChange();
1358 return GL_NO_ERROR;//glEsImpl->glGetError();
1361 void glActiveTexture (GLenum texture)
1363 if (activetmu == texture)
1365 return;
1367 if (delayedttmuchange)
1369 delayedttmuchange = GL_FALSE;
1371 else
1373 delayedttmuchange = GL_TRUE;
1374 delayedtmutarget = texture;
1376 if (texture == GL_TEXTURE0)
1378 activetmuState = &tmuState0;
1380 else
1382 activetmuState = &tmuState1;
1384 activetmu = texture;
1387 void glClientActiveTexture (GLenum texture)
1389 clientactivetmu = texture;
1392 void glPolygonMode( GLenum face, GLenum mode )
1396 void glDeleteTextures( GLsizei n, const GLuint *textures )
1398 FlushOnStateChange();
1399 glEsImpl->glDeleteTextures(n,textures);
1402 void glClearDepth( GLclampf depth )
1404 FlushOnStateChange();
1405 glEsImpl->glClearDepthf( depth );
1408 void glClipPlane( GLenum plane, const GLdouble *equation )
1410 FlushOnStateChange();
1411 float array[4];
1412 array[0] = (GLfloat)(equation[0]);
1413 array[1] = (GLfloat)(equation[1]);
1414 array[2] = (GLfloat)(equation[2]);
1415 array[3] = (GLfloat)(equation[3]);
1416 glEsImpl->glClipPlanef( plane, array );
1419 void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )
1421 FlushOnStateChange();
1422 glEsImpl->glScissor( x, y, width,height);
1425 void glPointSize( GLfloat size )
1427 FlushOnStateChange();
1428 glEsImpl->glPointSize( size );
1431 void glArrayElement(GLint i) {}
1432 void glLineWidth(GLfloat width) {}
1433 void glCallList( GLuint list ) {}
1434 void glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ) {}
1435 void glStencilFunc( GLenum func, GLint ref, GLuint mask ) {}
1436 void glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ) {}
1438 struct ptrstate vertex_array;
1439 struct ptrstate color_array;
1440 struct ptrstate texture_coord_array;
1442 void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices )
1444 // ensure that all primitives specified between glBegin/glEnd pairs
1445 // are rendered first, and that we have correct tmu in use..
1446 FlushOnStateChange();
1447 // setup correct vertex/color/texcoord pointers
1448 if (arraysValid ||
1449 tmuState0.vertex_array.changed ||
1450 tmuState0.color_array.changed ||
1451 tmuState0.texture_coord_array.changed)
1453 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
1455 if (arraysValid || tmuState0.vertex_array.changed)
1457 if (tmuState0.vertex_array.enabled)
1459 glEsImpl->glEnableClientState(GL_VERTEX_ARRAY);
1461 else
1463 glEsImpl->glDisableClientState(GL_VERTEX_ARRAY);
1465 glEsImpl->glVertexPointer(tmuState0.vertex_array.size,
1466 tmuState0.vertex_array.type,
1467 tmuState0.vertex_array.stride,
1468 tmuState0.vertex_array.ptr);
1469 tmuState0.vertex_array.changed = GL_FALSE;
1471 if (arraysValid || tmuState0.color_array.changed)
1473 if (tmuState0.color_array.enabled)
1475 glEsImpl->glEnableClientState(GL_COLOR_ARRAY);
1477 else
1479 glEsImpl->glDisableClientState(GL_COLOR_ARRAY);
1481 glEsImpl->glColorPointer(tmuState0.color_array.size,
1482 tmuState0.color_array.type,
1483 tmuState0.color_array.stride,
1484 tmuState0.color_array.ptr);
1485 tmuState0.color_array.changed = GL_FALSE;
1487 if (arraysValid || tmuState0.texture_coord_array.changed)
1489 tmuState0.texture_coord_array.changed = GL_FALSE;
1490 if (tmuState0.texture_coord_array.enabled)
1492 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1494 else
1496 glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1498 glEsImpl->glTexCoordPointer(tmuState0.texture_coord_array.size,
1499 tmuState0.texture_coord_array.type,
1500 tmuState0.texture_coord_array.stride,
1501 tmuState0.texture_coord_array.ptr);
1504 if (arraysValid || tmuState1.texture_coord_array.changed)
1506 tmuState1.texture_coord_array.changed = GL_FALSE;
1507 glEsImpl->glClientActiveTexture(GL_TEXTURE1);
1508 if (tmuState1.texture_coord_array.enabled)
1510 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1512 else
1514 glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1516 glEsImpl->glTexCoordPointer(tmuState1.texture_coord_array.size,
1517 tmuState1.texture_coord_array.type,
1518 tmuState1.texture_coord_array.stride,
1519 tmuState1.texture_coord_array.ptr);
1522 arraysValid = GL_FALSE;
1523 glEsImpl->glDrawElements(mode, count, type, indices);
1526 void glEnableClientState(GLenum array)
1528 struct nanotmuState* clientstate = NULL;
1529 if (clientactivetmu == GL_TEXTURE0)
1531 clientstate = &tmuState0;
1533 else if (clientactivetmu == GL_TEXTURE1)
1535 clientstate = &tmuState1;
1537 else
1539 return;
1541 switch (array)
1543 case GL_VERTEX_ARRAY:
1544 if (clientstate->vertex_array.enabled)
1546 return;
1548 clientstate->vertex_array.enabled = GL_TRUE;
1549 clientstate->vertex_array.changed = GL_TRUE;
1550 break;
1551 case GL_COLOR_ARRAY:
1552 if (clientstate->color_array.enabled)
1554 return;
1556 clientstate->color_array.enabled = GL_TRUE;
1557 clientstate->color_array.changed = GL_TRUE;
1559 break;
1560 case GL_TEXTURE_COORD_ARRAY:
1561 if (clientstate->texture_coord_array.enabled)
1563 return;
1565 clientstate->texture_coord_array.enabled = GL_TRUE;
1566 clientstate->texture_coord_array.changed = GL_TRUE;
1567 break;
1568 default:
1569 break;
1572 void glDisableClientState(GLenum array)
1574 struct nanotmuState* clientstate = NULL;
1575 if (clientactivetmu == GL_TEXTURE0)
1577 clientstate = &tmuState0;
1579 else if (clientactivetmu == GL_TEXTURE1)
1581 clientstate = &tmuState1;
1583 else
1585 return;
1587 switch (array)
1589 case GL_VERTEX_ARRAY:
1590 if (!clientstate->vertex_array.enabled)
1592 return;
1594 clientstate->vertex_array.enabled = GL_FALSE;
1595 clientstate->vertex_array.changed = GL_TRUE;
1596 break;
1597 case GL_COLOR_ARRAY:
1598 if (!clientstate->color_array.enabled)
1600 return;
1602 clientstate->color_array.enabled = GL_FALSE;
1603 clientstate->color_array.changed = GL_TRUE;
1605 break;
1606 case GL_TEXTURE_COORD_ARRAY:
1607 if (!clientstate->texture_coord_array.enabled)
1609 return;
1611 clientstate->texture_coord_array.enabled = GL_FALSE;
1612 clientstate->texture_coord_array.changed = GL_TRUE;
1613 break;
1614 default:
1615 break;
1618 void glVertexPointer( GLint size, GLenum type,GLsizei stride, const GLvoid *pointer )
1620 if (tmuState0.vertex_array.size == size &&
1621 tmuState0.vertex_array.stride == stride &&
1622 tmuState0.vertex_array.type == type &&
1623 tmuState0.vertex_array.ptr == pointer)
1625 return;
1627 tmuState0.vertex_array.size = size;
1628 tmuState0.vertex_array.stride = stride;
1629 tmuState0.vertex_array.type = type;
1630 tmuState0.vertex_array.ptr = (GLvoid*)pointer;
1631 tmuState0.vertex_array.changed = GL_TRUE;
1633 void glTexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
1635 struct nanotmuState* clientstate = NULL;
1636 if (clientactivetmu == GL_TEXTURE0)
1638 clientstate = &tmuState0;
1640 else if (clientactivetmu == GL_TEXTURE1)
1642 clientstate = &tmuState1;
1644 if (clientstate->texture_coord_array.size == size &&
1645 clientstate->texture_coord_array.stride == stride &&
1646 clientstate->texture_coord_array.type == type &&
1647 clientstate->texture_coord_array.ptr == pointer)
1649 return;
1651 clientstate->texture_coord_array.size = size;
1652 clientstate->texture_coord_array.stride = stride;
1653 clientstate->texture_coord_array.type = type;
1654 clientstate->texture_coord_array.ptr = (GLvoid*)pointer;
1655 clientstate->texture_coord_array.changed = GL_TRUE;
1657 void glColorPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
1659 if (tmuState0.color_array.size == size &&
1660 tmuState0.color_array.stride == stride &&
1661 tmuState0.color_array.type == type &&
1662 tmuState0.color_array.ptr == pointer)
1664 return;
1666 tmuState0.color_array.size = size;
1667 tmuState0.color_array.stride = stride;
1668 tmuState0.color_array.type = type;
1669 tmuState0.color_array.ptr = (GLvoid*)pointer;
1670 tmuState0.color_array.changed = GL_TRUE;
1672 void glPolygonOffset( GLfloat factor, GLfloat units )
1674 FlushOnStateChange();
1675 glEsImpl->glPolygonOffset(factor, units);
1677 void glStencilMask( GLuint mask ) {}
1678 void glClearStencil( GLint s ) {}
1680 #if defined(__MULTITEXTURE_SUPPORT__)
1682 extern "C" void glMultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t );
1684 void glMultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t )
1686 if (target == GL_TEXTURE0)
1688 glTexCoord2f(s,t);
1690 else
1692 currentVertexAttrib.s_multi = s;
1693 currentVertexAttrib.t_multi = t;
1696 #endif
1698 /* Vladimir */
1699 void glDrawArrays( GLenum mode, int first, int count)
1701 FlushOnStateChange();
1702 glEsImpl->glDrawArrays(mode, first , count);
1704 void glMultMatrixf (const GLfloat *m)
1706 FlushOnStateChange();
1707 glEsImpl->glMultMatrixf(m);
1710 void glPixelStorei (GLenum pname, GLint param)
1712 FlushOnStateChange();
1713 glEsImpl->glPixelStorei(pname, param);
1717 void glFogf (GLenum pname, GLfloat param)
1719 FlushOnStateChange();
1720 glEsImpl->glFogf(pname, param);
1723 void glFogfv (GLenum pname, const GLfloat *params)
1725 FlushOnStateChange();
1726 glEsImpl->glFogfv(pname, params);
1729 void glGetTexParameteriv (GLenum target, GLenum pname, GLint *params)
1731 FlushOnStateChange();
1732 glEsImpl->glGetTexParameteriv(target, pname, params);
1736 // This gives: called unimplemented OpenGL ES API (Android)
1737 void glTexParameteri (GLenum target, GLenum pname, GLint param)
1739 if (pname == GL_TEXTURE_BORDER_COLOR) {
1740 return; // not supported by opengl es
1742 if ( (pname == GL_TEXTURE_WRAP_S ||
1743 pname == GL_TEXTURE_WRAP_T) &&
1744 param == GL_CLAMP) {
1745 param = 0x812F;
1748 FlushOnStateChange();
1749 glEsImpl->glTexParameteri(target, pname, param);
1752 void glTexParameterx (GLenum target, GLenum pname, GLfixed param)
1754 if (pname == GL_TEXTURE_BORDER_COLOR) {
1755 return; // not supported by opengl es
1757 if ( (pname == GL_TEXTURE_WRAP_S ||
1758 pname == GL_TEXTURE_WRAP_T) &&
1759 param == GL_CLAMP) {
1760 param = 0x812F;
1762 FlushOnStateChange();
1763 glEsImpl->glTexParameterx(target, pname, param);
1766 void glGenTextures (GLsizei n, GLuint *textures)
1768 FlushOnStateChange();
1769 glEsImpl->glGenTextures(n, textures);
1772 void glFrontFace (GLenum mode)
1774 FlushOnStateChange();
1775 glEsImpl->glFrontFace(mode);
1780 // End Vladimir