DEADSOFTWARE

Implement some wrappers for xashxt
[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 struct ptrstate normal_array;
151 };
153 static struct nanotmuState tmuState0;
154 static struct nanotmuState tmuState1;
156 static struct nanotmuState tmuInitState =
158 {GL_FALSE, GL_FALSE},
159 {GL_MODULATE,GL_FALSE},
160 {0x7fffffff,GL_FALSE},
161 {4,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE},
162 {4,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE},
163 {4,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE},
164 {0,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE},
165 };
167 static struct nanotmuState* activetmuState = &tmuState0;
169 extern "C++" GlESInterface* glEsImpl;
171 static GLenum wrapperPrimitiveMode = GL_QUADS;
172 GLboolean useTexCoordArray = GL_FALSE;
173 static GLenum activetmu = GL_TEXTURE0;
174 static GLenum clientactivetmu = GL_TEXTURE0;
176 #if defined(__MULTITEXTURE_SUPPORT__)
177 GLboolean useMultiTexCoordArray = GL_FALSE;
178 #endif
181 #if !defined (__WINS__)
182 //#define __FORCEINLINE __forceinline
183 #define __FORCEINLINE inline
184 #else
185 #define __FORCEINLINE
186 #endif
188 static GLboolean delayedttmuchange = GL_FALSE;
189 static GLenum delayedtmutarget = GL_TEXTURE0;
191 struct VertexAttrib
193 float x;
194 float y;
195 float z;
196 #if !defined(__MULTITEXTURE_SUPPORT__)
197 float padding;
198 #endif
199 unsigned char red;
200 unsigned char green;
201 unsigned char blue;
202 unsigned char alpha;
204 float s;
205 float t;
206 #if defined(__MULTITEXTURE_SUPPORT__)
207 float s_multi;
208 float t_multi;
209 #endif
210 };
212 static VertexAttrib vertexattribs[40000];
214 static GLushort indexArray[30000];
216 static GLuint vertexCount = 0;
217 static GLuint indexCount = 0;
218 static GLuint vertexMark = 0;
219 static int indexbase = 0;
221 static VertexAttrib* ptrVertexAttribArray = NULL;
222 static VertexAttrib* ptrVertexAttribArrayMark = NULL;
224 static VertexAttrib currentVertexAttrib;
225 #if defined(__MULTITEXTURE_SUPPORT__)
226 static VertexAttrib currentVertexAttribInit = {0.0f,0.0f,0.0f,
227 255,255,255,255,
228 0.0f,0.0f,
229 0.0f,0.0f
230 };
231 #else
232 static VertexAttrib currentVertexAttribInit = {0.0f,0.0f,0.0f,0.0f,
233 255,255,255,255,
234 0.0f,0.0f,
235 };
236 #endif
237 static GLushort* ptrIndexArray = NULL;
239 static GLboolean arraysValid = GL_FALSE;
241 void InitGLStructs()
243 ptrVertexAttribArray = vertexattribs;
244 ptrVertexAttribArrayMark = ptrVertexAttribArray;
245 ptrIndexArray = indexArray;
247 memcpy(&nanoglState, &nanoglInitState, sizeof(struct nanoState));
248 memcpy(&tmuState0,&tmuInitState,sizeof(struct nanotmuState));
249 memcpy(&tmuState1,&tmuInitState,sizeof(struct nanotmuState));
250 memcpy(&currentVertexAttrib,&currentVertexAttribInit,sizeof(struct VertexAttrib));
252 activetmuState = &tmuState0;
253 wrapperPrimitiveMode = GL_QUADS;
254 useTexCoordArray = GL_FALSE;
255 activetmu = GL_TEXTURE0;
256 clientactivetmu = GL_TEXTURE0;
257 delayedttmuchange = GL_FALSE;
258 delayedtmutarget = GL_TEXTURE0;
259 vertexCount = 0;
260 indexCount = 0;
261 vertexMark = 0;
262 indexbase = 0;
263 arraysValid = GL_FALSE;
266 void ResetNanoState()
269 if (tmuState0.color_array.enabled)
271 glEsImpl->glEnableClientState(GL_COLOR_ARRAY);
273 else
275 glEsImpl->glDisableClientState(GL_COLOR_ARRAY);
278 if (tmuState0.vertex_array.enabled)
280 glEsImpl->glEnableClientState(GL_VERTEX_ARRAY);
282 else
284 glEsImpl->glDisableClientState(GL_VERTEX_ARRAY);
287 if (tmuState0.texture_coord_array.enabled)
289 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
291 else
293 glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
296 if (tmuState0.normal_array.enabled)
298 glEsImpl->glEnableClientState(GL_NORMAL_ARRAY);
300 else
302 glEsImpl->glDisableClientState(GL_NORMAL_ARRAY);
304 glEsImpl->glVertexPointer(tmuState0.vertex_array.size,
305 tmuState0.vertex_array.type,
306 tmuState0.vertex_array.stride,
307 tmuState0.vertex_array.ptr);
309 glEsImpl->glTexCoordPointer(tmuState0.texture_coord_array.size,
310 tmuState0.texture_coord_array.type,
311 tmuState0.texture_coord_array.stride,
312 tmuState0.texture_coord_array.ptr);
314 glEsImpl->glColorPointer(tmuState0.color_array.size,
315 tmuState0.color_array.type,
316 tmuState0.color_array.stride,
317 tmuState0.color_array.ptr);
319 glEsImpl->glNormalPointer(
320 tmuState0.normal_array.type,
321 tmuState0.normal_array.stride,
322 tmuState0.normal_array.ptr);
324 glEsImpl->glMatrixMode(nanoglState.matrixmode);
328 glEsImpl->glColor4f (currentVertexAttrib.red, currentVertexAttrib.green, currentVertexAttrib.blue, currentVertexAttrib.alpha);
330 glEsImpl->glBlendFunc(nanoglState.sfactor, nanoglState.dfactor);
332 //glEsImpl->glBindTexture(GL_TEXTURE_2D, stackTextureState);
334 glEsImpl->glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, activetmuState->texture_env_mode.value);
336 arraysValid = GL_FALSE;
339 void FlushOnStateChange()
341 if (delayedttmuchange)
343 delayedttmuchange = GL_FALSE;
344 #ifndef USE_CORE_PROFILE
345 glEsImpl->glActiveTexture(delayedtmutarget);
346 #endif
349 if (!vertexCount)
350 return;
352 if (!arraysValid)
354 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
355 glEsImpl->glVertexPointer(3, GL_FLOAT, sizeof(VertexAttrib), &vertexattribs[0].x);
356 glEsImpl->glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(VertexAttrib), &vertexattribs[0].red);
357 glEsImpl->glTexCoordPointer(2, GL_FLOAT, sizeof(VertexAttrib), &vertexattribs[0].s);
358 glEsImpl->glEnableClientState(GL_VERTEX_ARRAY);
359 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
360 glEsImpl->glEnableClientState(GL_COLOR_ARRAY);
361 #if defined(__MULTITEXTURE_SUPPORT__)
362 glEsImpl->glClientActiveTexture(GL_TEXTURE1);
363 glEsImpl->glTexCoordPointer(2, GL_FLOAT, sizeof(VertexAttrib), &vertexattribs[0].s_multi);
364 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
365 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
366 #endif
367 arraysValid = GL_TRUE;
370 glEsImpl->glDrawElements( GL_TRIANGLES,vertexCount,GL_UNSIGNED_SHORT, indexArray );
373 #if defined(__MULTITEXTURE_SUPPORT__)
374 useMultiTexCoordArray = GL_FALSE;
375 #endif
376 vertexCount = 0;
377 indexCount = 0;
378 ptrVertexAttribArray = vertexattribs;
379 ptrVertexAttribArrayMark = ptrVertexAttribArray;
380 ptrIndexArray = indexArray;
381 useTexCoordArray = GL_FALSE;
383 void nanoGL_Flush()
385 FlushOnStateChange();
387 void nanoGL_Reset()
389 ResetNanoState();
391 void glBegin(GLenum mode)
393 wrapperPrimitiveMode = mode;
394 vertexMark = vertexCount;
395 ptrVertexAttribArrayMark = ptrVertexAttribArray;
396 indexbase = indexCount;
399 void glEnd(void)
401 vertexCount+=((unsigned char*)ptrVertexAttribArray-(unsigned char*)ptrVertexAttribArrayMark)/sizeof(VertexAttrib);
402 if (vertexCount < 3)
404 return;
406 switch (wrapperPrimitiveMode)
408 case GL_QUADS:
410 *ptrIndexArray++ = indexCount;
411 *ptrIndexArray++ = indexCount+1;
412 *ptrIndexArray++ = indexCount+2;
413 *ptrIndexArray++ = indexCount;
414 *ptrIndexArray++ = indexCount+2;
415 *ptrIndexArray++ = indexCount+3;
416 indexCount+=4;
417 vertexCount+=2;
419 break;
420 case GL_TRIANGLES:
422 int vcount = (vertexCount-vertexMark)/3;
423 for (int count = 0; count < vcount; count++)
425 *ptrIndexArray++ = indexCount;
426 *ptrIndexArray++ = indexCount+1;
427 *ptrIndexArray++ = indexCount+2;
428 indexCount+=3;
431 break;
432 case GL_TRIANGLE_STRIP:
434 *ptrIndexArray++ = indexCount;
435 *ptrIndexArray++ = indexCount+1;
436 *ptrIndexArray++ = indexCount+2;
437 indexCount+=3;
438 int vcount = ((vertexCount-vertexMark)-3);
439 if (vcount && ((long)ptrIndexArray & 0x02))
441 *ptrIndexArray++ = indexCount-1; // 2
442 *ptrIndexArray++ = indexCount-2; // 1
443 *ptrIndexArray++ = indexCount; // 3
444 indexCount++;
445 vcount-=1;
446 int odd = vcount&1;
447 vcount/=2;
448 unsigned int* longptr = (unsigned int*) ptrIndexArray;
450 for (int count = 0; count < vcount; count++)
452 *(longptr++) = (indexCount-2) | ((indexCount-1)<<16);
453 *(longptr++) = (indexCount) | ((indexCount)<<16);
454 *(longptr++) = (indexCount-1) | ((indexCount+1)<<16);
455 indexCount+=2;
457 ptrIndexArray = (unsigned short*)(longptr);
458 if (odd)
460 *ptrIndexArray++ = indexCount-2; // 2
461 *ptrIndexArray++ = indexCount-1; // 1
462 *ptrIndexArray++ = indexCount; // 3
463 indexCount++;
466 else
468 //already aligned
469 int odd = vcount&1;
470 vcount/=2;
471 unsigned int* longptr = (unsigned int*) ptrIndexArray;
473 for (int count = 0; count < vcount; count++)
474 {
475 *(longptr++) = (indexCount-1) | ((indexCount-2)<<16);
476 *(longptr++) = (indexCount) | ((indexCount-1)<<16);
477 *(longptr++) = (indexCount) | ((indexCount+1)<<16);
478 indexCount+=2;
481 ptrIndexArray = (unsigned short*)(longptr);
482 if (odd)
485 *ptrIndexArray++ = indexCount-1; // 2
486 *ptrIndexArray++ = indexCount-2; // 1
487 *ptrIndexArray++ = indexCount; // 3
488 indexCount++;
490 }
491 vertexCount+=(vertexCount-vertexMark-3)*2;
493 break;
494 case GL_POLYGON:
495 case GL_TRIANGLE_FAN:
497 *ptrIndexArray++ = indexCount++;
498 *ptrIndexArray++ = indexCount++;
499 *ptrIndexArray++ = indexCount++;
500 int vcount = ((vertexCount-vertexMark)-3);
501 for (int count = 0; count < vcount; count++)
503 *ptrIndexArray++ = indexbase;
504 *ptrIndexArray++ = indexCount-1;
505 *ptrIndexArray++ = indexCount++;
506 vertexCount+=2;
508 }
509 break;
511 default:
512 break;
516 void glEnable (GLenum cap)
518 GLboolean statechanged = GL_FALSE;
519 switch(cap)
521 case GL_ALPHA_TEST:
523 if (!nanoglState.alpha_test)
525 nanoglState.alpha_test = GL_TRUE;
526 statechanged = GL_TRUE;
528 break;
530 case GL_BLEND:
532 if (!nanoglState.blend)
534 nanoglState.blend = GL_TRUE;
535 statechanged = GL_TRUE;
537 break;
539 //case GL_CLIP_PLANEi
540 case GL_COLOR_LOGIC_OP:
542 if (!nanoglState.color_logic_op)
544 nanoglState.color_logic_op = GL_TRUE;
545 statechanged = GL_TRUE;
547 break;
549 case GL_COLOR_MATERIAL:
551 if (!nanoglState.color_material)
553 nanoglState.color_material = GL_TRUE;
554 statechanged = GL_TRUE;
556 break;
558 case GL_CULL_FACE:
560 if (!nanoglState.cull_face)
562 nanoglState.cull_face = GL_TRUE;
563 statechanged = GL_TRUE;
565 break;
567 case GL_DEPTH_TEST:
569 if (!nanoglState.depth_test)
571 nanoglState.depth_test = GL_TRUE;
572 statechanged = GL_TRUE;
574 break;
576 case GL_DITHER:
578 if (!nanoglState.dither)
580 nanoglState.dither = GL_TRUE;
581 statechanged = GL_TRUE;
583 break;
585 case GL_FOG:
586 //case GL_LIGHTi
588 if (!nanoglState.fog)
590 nanoglState.fog = GL_TRUE;
591 statechanged = GL_TRUE;
593 break;
595 case GL_LIGHTING:
597 if (!nanoglState.lighting)
599 nanoglState.lighting = GL_TRUE;
600 statechanged = GL_TRUE;
602 break;
604 case GL_LINE_SMOOTH:
606 if (!nanoglState.line_smooth)
608 nanoglState.line_smooth = GL_TRUE;
609 statechanged = GL_TRUE;
611 break;
613 /* case GL_MATRIX_PALETTE_OES:
615 if (!nanoglState.matrix_palette_oes)
617 nanoglState.matrix_palette_oes = GL_TRUE;
618 statechanged = GL_TRUE;
620 break;
621 }*/
622 case GL_MULTISAMPLE:
624 if (!nanoglState.multisample)
626 nanoglState.multisample = GL_TRUE;
627 statechanged = GL_TRUE;
629 break;
631 case GL_NORMALIZE:
633 if (!nanoglState.normalize)
635 nanoglState.normalize = GL_TRUE;
636 statechanged = GL_TRUE;
638 break;
640 /* case GL_POINT_SPRITE_OES:
642 if (!nanoglState.point_sprite_oes)
644 nanoglState.point_sprite_oes = GL_TRUE;
645 statechanged = GL_TRUE;
647 break;
648 }*/
649 case GL_POLYGON_OFFSET_FILL:
651 if (!nanoglState.polygon_offset_fill)
653 nanoglState.polygon_offset_fill = GL_TRUE;
654 statechanged = GL_TRUE;
656 break;
658 case GL_RESCALE_NORMAL:
660 if (!nanoglState.rescale_normal)
662 nanoglState.rescale_normal = GL_TRUE;
663 statechanged = GL_TRUE;
665 break;
667 case GL_SAMPLE_ALPHA_TO_COVERAGE:
669 if (!nanoglState.sample_alpha_to_coverage)
671 nanoglState.sample_alpha_to_coverage = GL_TRUE;
672 statechanged = GL_TRUE;
674 break;
676 case GL_SAMPLE_ALPHA_TO_ONE:
678 if (!nanoglState.sample_alpha_to_one)
680 nanoglState.sample_alpha_to_one = GL_TRUE;
681 statechanged = GL_TRUE;
683 break;
685 case GL_SAMPLE_COVERAGE:
687 if (!nanoglState.sample_coverage)
689 nanoglState.sample_coverage = GL_TRUE;
690 statechanged = GL_TRUE;
692 break;
694 case GL_SCISSOR_TEST:
696 if (!nanoglState.scissor_test)
698 nanoglState.scissor_test = GL_TRUE;
699 statechanged = GL_TRUE;
701 break;
703 case GL_STENCIL_TEST:
705 return;
706 /* if (!nanoglState.stencil_test)
708 nanoglState.stencil_test = GL_TRUE;
709 statechanged = GL_TRUE;
710 }*/
711 break;
713 case GL_TEXTURE_2D:
715 if (!activetmuState->texture_2d.value)
717 FlushOnStateChange();
718 glEsImpl->glEnable(cap);
719 activetmuState->texture_2d.value = GL_TRUE;
720 return;
722 break;
724 default:
725 break;
728 if (statechanged)
730 FlushOnStateChange();
731 glEsImpl->glEnable(cap);
732 }
735 void glDisable (GLenum cap)
737 GLboolean statechanged = GL_FALSE;
738 switch(cap)
740 case GL_ALPHA_TEST:
742 if (nanoglState.alpha_test)
744 nanoglState.alpha_test = GL_FALSE;
745 statechanged = GL_TRUE;
747 break;
749 case GL_BLEND:
751 if (nanoglState.blend)
753 nanoglState.blend = GL_FALSE;
754 statechanged = GL_TRUE;
756 break;
758 //case GL_CLIP_PLANEi
759 case GL_COLOR_LOGIC_OP:
761 if (nanoglState.color_logic_op)
763 nanoglState.color_logic_op = GL_FALSE;
764 statechanged = GL_TRUE;
766 break;
768 case GL_COLOR_MATERIAL:
770 if (nanoglState.color_material)
772 nanoglState.color_material = GL_FALSE;
773 statechanged = GL_TRUE;
775 break;
777 case GL_CULL_FACE:
779 if (nanoglState.cull_face)
781 nanoglState.cull_face = GL_FALSE;
782 statechanged = GL_TRUE;
784 break;
786 case GL_DEPTH_TEST:
788 if (nanoglState.depth_test)
790 nanoglState.depth_test = GL_FALSE;
791 statechanged = GL_TRUE;
793 break;
795 case GL_DITHER:
797 if (nanoglState.dither)
799 nanoglState.dither = GL_FALSE;
800 statechanged = GL_TRUE;
802 break;
804 case GL_FOG:
805 //case GL_LIGHTi
807 if (nanoglState.fog)
809 nanoglState.fog = GL_FALSE;
810 statechanged = GL_TRUE;
812 break;
814 case GL_LIGHTING:
816 if (nanoglState.lighting)
818 nanoglState.lighting = GL_FALSE;
819 statechanged = GL_TRUE;
821 break;
823 case GL_LINE_SMOOTH:
825 if (nanoglState.line_smooth)
827 nanoglState.line_smooth = GL_FALSE;
828 statechanged = GL_TRUE;
830 break;
832 /* case GL_MATRIX_PALETTE_OES:
834 if (nanoglState.matrix_palette_oes)
836 nanoglState.matrix_palette_oes = GL_FALSE;
837 statechanged = GL_TRUE;
839 break;
840 }*/
841 case GL_MULTISAMPLE:
843 if (nanoglState.multisample)
845 nanoglState.multisample = GL_FALSE;
846 statechanged = GL_TRUE;
848 break;
850 case GL_NORMALIZE:
852 if (nanoglState.normalize)
854 nanoglState.normalize = GL_FALSE;
855 statechanged = GL_TRUE;
857 break;
859 /* case GL_POINT_SPRITE_OES:
861 if (nanoglState.point_sprite_oes)
863 nanoglState.point_sprite_oes = GL_FALSE;
864 statechanged = GL_TRUE;
866 break;
867 }*/
868 case GL_POLYGON_OFFSET_FILL:
870 if (nanoglState.polygon_offset_fill)
872 nanoglState.polygon_offset_fill = GL_FALSE;
873 statechanged = GL_TRUE;
875 break;
877 case GL_RESCALE_NORMAL:
879 if (nanoglState.rescale_normal)
881 nanoglState.rescale_normal = GL_FALSE;
882 statechanged = GL_TRUE;
884 break;
886 case GL_SAMPLE_ALPHA_TO_COVERAGE:
888 if (nanoglState.sample_alpha_to_coverage)
890 nanoglState.sample_alpha_to_coverage = GL_FALSE;
891 statechanged = GL_TRUE;
893 break;
895 case GL_SAMPLE_ALPHA_TO_ONE:
897 if (nanoglState.sample_alpha_to_one)
899 nanoglState.sample_alpha_to_one = GL_FALSE;
900 statechanged = GL_TRUE;
902 break;
904 case GL_SAMPLE_COVERAGE:
906 if (nanoglState.sample_coverage)
908 nanoglState.sample_coverage = GL_FALSE;
909 statechanged = GL_TRUE;
911 break;
913 case GL_SCISSOR_TEST:
915 if (nanoglState.scissor_test)
917 nanoglState.scissor_test = GL_FALSE;
918 statechanged = GL_TRUE;
920 break;
922 case GL_STENCIL_TEST:
924 return;
925 /* if (nanoglState.stencil_test)
927 nanoglState.stencil_test = GL_FALSE;
928 statechanged = GL_TRUE;
929 }*/
930 break;
932 case GL_TEXTURE_2D:
934 if (activetmuState->texture_2d.value)
936 FlushOnStateChange();
937 glEsImpl->glDisable(cap);
938 activetmuState->texture_2d.value = GL_FALSE;
939 return;
943 break;
945 default:
946 break;
949 if (statechanged)
951 FlushOnStateChange();
952 glEsImpl->glDisable(cap);
953 }
956 void glVertex2f(GLfloat x, GLfloat y)
958 glVertex3f(x,y,0.0f);
962 __FORCEINLINE unsigned int ClampTo255(float value)
964 unsigned int retval = (unsigned int)(value);
965 if (retval > 255)
967 retval = 255;
969 return retval;
972 void glColor3f( GLfloat red, GLfloat green, GLfloat blue)
974 currentVertexAttrib.red = (unsigned char)ClampTo255(red*255.0f);
975 currentVertexAttrib.green = (unsigned char)ClampTo255(green*255.0f);
976 currentVertexAttrib.blue = (unsigned char)ClampTo255(blue*255.0f);
977 currentVertexAttrib.alpha = 255;
981 void glTexCoord2fv( const GLfloat *v )
983 memcpy(&currentVertexAttrib.s, v, 2*sizeof(float));
987 void glTexCoord2f(GLfloat s, GLfloat t)
989 currentVertexAttrib.s = s;
990 currentVertexAttrib.t = t;
993 void glViewport (GLint x, GLint y, GLsizei width, GLsizei height)
995 FlushOnStateChange();
996 glEsImpl->glViewport(x,y,width,height);
999 void glLoadIdentity (void)
1001 FlushOnStateChange();
1002 glEsImpl->glLoadIdentity();
1005 void glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
1007 currentVertexAttrib.red = (unsigned char)ClampTo255(red*255.0f);
1008 currentVertexAttrib.green = (unsigned char)ClampTo255(green*255.0f);
1009 currentVertexAttrib.blue = (unsigned char)ClampTo255(blue*255.0f);
1010 currentVertexAttrib.alpha = (unsigned char)ClampTo255(alpha*255.0f);
1013 void glOrtho (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
1015 FlushOnStateChange();
1016 #ifdef USE_CORE_PROFILE
1017 glEsImpl->glOrtho(left,right,bottom,top, zNear,zFar);
1018 #else
1019 glEsImpl->glOrthof(left,right,bottom,top, zNear,zFar);
1020 #endif
1023 void glMatrixMode (GLenum mode)
1025 if (nanoglState.matrixmode == mode)
1027 return;
1029 nanoglState.matrixmode = mode;
1030 FlushOnStateChange();
1031 glEsImpl->glMatrixMode(mode);
1034 void glTexParameterf (GLenum target, GLenum pname, GLfloat param)
1036 if (pname == GL_TEXTURE_BORDER_COLOR)
1038 return; // not supported by opengl es
1040 if ( (pname == GL_TEXTURE_WRAP_S ||
1041 pname == GL_TEXTURE_WRAP_T) &&
1042 param == GL_CLAMP)
1044 param = 0x812F;
1047 FlushOnStateChange();
1048 glEsImpl->glTexParameterf(target, pname,param);
1051 void glTexParameterfv( GLenum target, GLenum pname, const GLfloat *params)
1053 glTexParameterf(target, pname, params[0]);
1056 void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1058 FlushOnStateChange();
1059 internalformat = format;
1060 glEsImpl->glTexImage2D(target, level, internalformat, width, height,border,format,type,pixels);
1063 void glDrawBuffer(GLenum /*mode*/)
1067 void glTranslatef (GLfloat x, GLfloat y, GLfloat z)
1069 FlushOnStateChange();
1070 glEsImpl->glTranslatef(x,y,z);
1073 void glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
1075 FlushOnStateChange();
1076 glEsImpl->glRotatef(angle, x, y, z);
1079 void glScalef (GLfloat x, GLfloat y, GLfloat z)
1081 FlushOnStateChange();
1082 glEsImpl->glScalef(x,y,z);
1085 void glDepthRange(GLclampf zNear, GLclampf zFar)
1087 if ((nanoglState.depth_range_near == zNear) &&(nanoglState.depth_range_far == zFar))
1089 return;
1091 else
1093 nanoglState.depth_range_near = zNear;
1094 nanoglState.depth_range_far = zFar;
1096 FlushOnStateChange();
1097 #ifdef USE_CORE_PROFILE
1098 glEsImpl->glDepthRange(zNear, zFar);
1099 #else
1100 glEsImpl->glDepthRangef(zNear, zFar);
1101 #endif
1104 void glDepthFunc (GLenum func)
1106 if (nanoglState.depth_func == func)
1108 return;
1110 else
1112 nanoglState.depth_func = func;
1114 FlushOnStateChange();
1115 glEsImpl->glDepthFunc(func);
1118 void glFinish (void)
1120 FlushOnStateChange();
1121 glEsImpl->glFinish();
1124 void glGetFloatv (GLenum pname, GLfloat *params)
1126 FlushOnStateChange();
1127 glEsImpl->glGetFloatv(pname, params);
1130 void glCullFace (GLenum mode)
1132 if (nanoglState.cullface == mode)
1134 return;
1136 else
1138 nanoglState.cullface = mode;
1140 FlushOnStateChange();
1141 glEsImpl->glCullFace(mode);
1144 void glFrustum (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
1146 FlushOnStateChange();
1147 glEsImpl->glFrustumf(left,right,bottom,top,zNear,zFar);
1150 void glClear (GLbitfield mask)
1152 FlushOnStateChange();
1153 glEsImpl->glClear(mask);
1157 void glVertex3f( GLfloat x, GLfloat y, GLfloat z )
1159 GLfloat* vert = (GLfloat*)ptrVertexAttribArray++;
1160 *vert++ = x;
1161 *vert++ = y;
1162 *vert++ = z;
1163 #if defined(__MULTITEXTURE_SUPPORT__)
1164 memcpy(vert, &currentVertexAttrib.red, 5*sizeof(GLfloat));
1165 #else
1166 memcpy(vert+1, &currentVertexAttrib.red, 3*sizeof(GLfloat));
1167 #endif
1171 void glColor4fv( const GLfloat *v )
1173 currentVertexAttrib.red = (unsigned char)ClampTo255(v[0]*255.0f);
1174 currentVertexAttrib.green = (unsigned char)ClampTo255(v[1]*255.0f);
1175 currentVertexAttrib.blue = (unsigned char)ClampTo255(v[2]*255.0f);
1176 currentVertexAttrib.alpha = (unsigned char)ClampTo255(v[3]*255.0f);
1179 void glColor3ubv( const GLubyte* v)
1181 currentVertexAttrib.red = v[0];
1182 currentVertexAttrib.green = v[1];
1183 currentVertexAttrib.blue = v[2];
1184 currentVertexAttrib.alpha = 255;
1187 void glColor4ubv( const GLubyte *v )
1188 {
1189 //*((unsigned int*)(&currentVertexAttrib.red)) = *((unsigned int*)(v));
1190 currentVertexAttrib.red = v[0];
1191 currentVertexAttrib.green = v[1];
1192 currentVertexAttrib.blue = v[2];
1193 currentVertexAttrib.alpha = v[3];
1196 void glColor3fv( const GLfloat *v )
1198 currentVertexAttrib.red = (unsigned char)ClampTo255(v[0]*255.0f);
1199 currentVertexAttrib.green = (unsigned char)ClampTo255(v[1]*255.0f);
1200 currentVertexAttrib.blue = (unsigned char)ClampTo255(v[2]*255.0f);
1201 currentVertexAttrib.alpha = 255;
1204 //-- nicknekit: xash3d funcs --
1206 void glColor4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
1208 currentVertexAttrib.red = red;
1209 currentVertexAttrib.green = green;
1210 currentVertexAttrib.blue = blue;
1211 currentVertexAttrib.alpha = alpha;
1214 void glColor3ub( GLubyte red, GLubyte green, GLubyte blue)
1216 currentVertexAttrib.red = red;
1217 currentVertexAttrib.green = green;
1218 currentVertexAttrib.blue = blue;
1219 currentVertexAttrib.alpha = 255;
1222 void glNormal3fv( const GLfloat *v )
1224 FlushOnStateChange();
1225 glEsImpl->glNormal3f(v[0],v[1],v[2]);
1228 void glCopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border )
1230 FlushOnStateChange();
1231 glEsImpl->glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
1234 void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1236 glTexImage2D(GL_TEXTURE_2D, level, internalformat, width, 1, border, format, type, pixels);
1239 void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
1241 glTexImage2D(GL_TEXTURE_2D, level, internalformat, width, height, border, format, type, pixels);
1244 void glTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels )
1246 glTexSubImage2D(target,level,xoffset,0,width,1,format,type,pixels);
1249 void glTexSubImage3D( GLenum target, GLint level,
1250 GLint xoffset, GLint yoffset,
1251 GLint zoffset, GLsizei width,
1252 GLsizei height, GLsizei depth,
1253 GLenum format,
1254 GLenum type, const GLvoid *pixels)
1256 glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
1261 GLboolean glIsTexture(GLuint texture)
1263 FlushOnStateChange();
1264 return glEsImpl->glIsTexture(texture);
1268 void glTexGeni( GLenum coord, GLenum pname, GLint param )
1270 //for mirrors? not needed for original hl?
1273 void glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
1275 //for mirrors? not needed for original hl?
1278 //-- --//
1280 void glHint (GLenum target, GLenum mode)
1282 FlushOnStateChange();
1283 glEsImpl->glHint(target, mode);
1286 void glBlendFunc (GLenum sfactor, GLenum dfactor)
1288 if ((nanoglState.sfactor == sfactor) && (nanoglState.dfactor == dfactor))
1290 return;
1292 nanoglState.sfactor = sfactor;
1293 nanoglState.dfactor = dfactor;
1294 FlushOnStateChange();
1295 glEsImpl->glBlendFunc(sfactor, dfactor);
1298 void glPopMatrix (void)
1300 FlushOnStateChange();
1301 glEsImpl->glPopMatrix();
1304 void glShadeModel (GLenum mode)
1306 if (nanoglState.shademodel == mode)
1308 return;
1310 nanoglState.shademodel = mode;
1311 FlushOnStateChange();
1312 glEsImpl->glShadeModel(mode);
1315 void glPushMatrix (void)
1317 FlushOnStateChange();
1318 glEsImpl->glPushMatrix();
1321 void glTexEnvf (GLenum target, GLenum pname, GLfloat param)
1323 if (target == GL_TEXTURE_ENV)
1325 if (pname == GL_TEXTURE_ENV_MODE)
1327 if (param == activetmuState->texture_env_mode.value)
1329 return;
1330 }
1331 else
1333 FlushOnStateChange();
1334 glEsImpl->glTexEnvf(target, pname, param);
1335 activetmuState->texture_env_mode.value = param;
1336 return;
1340 FlushOnStateChange();
1341 glEsImpl->glTexEnvf(target, pname, param);
1344 void glVertex3fv( const GLfloat *v )
1346 GLfloat* vert = (GLfloat*)ptrVertexAttribArray++;
1347 memcpy(vert, v, 3*sizeof(GLfloat));
1348 #if defined(__MULTITEXTURE_SUPPORT__)
1349 memcpy(vert+3, &currentVertexAttrib.red, 5*sizeof(GLfloat));
1350 #else
1351 memcpy(vert+4, &currentVertexAttrib.red, 3*sizeof(GLfloat));
1352 #endif
1356 void glDepthMask (GLboolean flag)
1358 if (nanoglState.depthmask == flag)
1360 return;
1362 nanoglState.depthmask = flag;
1363 FlushOnStateChange();
1364 glEsImpl->glDepthMask(flag);
1367 void glBindTexture (GLenum target, GLuint texture)
1369 if (activetmuState->boundtexture.value == texture)
1371 return;
1373 FlushOnStateChange();
1374 activetmuState->boundtexture.value = texture;
1375 glEsImpl->glBindTexture(target, texture);
1379 void glGetIntegerv (GLenum pname, GLint *params)
1381 FlushOnStateChange();
1382 glEsImpl->glGetIntegerv(pname, params);
1385 GLubyte nano_extensions_string[4096];
1386 const GLubyte* glGetString (GLenum name)
1389 if (name == GL_EXTENSIONS)
1391 #if defined(__MULTITEXTURE_SUPPORT__)
1392 sprintf((char*)nano_extensions_string,"%s %s",glEsImpl->glGetString(name),"GL_ARB_multitexture EXT_texture_env_add");
1393 #else
1394 sprintf((char*)nano_extensions_string,"%s %s",glEsImpl->glGetString(name),"EXT_texture_env_add");
1395 #endif
1396 return nano_extensions_string;
1398 return glEsImpl->glGetString(name);
1401 void glAlphaFunc (GLenum func, GLclampf ref)
1403 FlushOnStateChange();
1404 glEsImpl->glAlphaFunc(func,ref);
1407 void glFlush (void)
1409 FlushOnStateChange();
1410 glEsImpl->glFlush();
1413 void glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
1415 if (format == GL_DEPTH_COMPONENT)
1417 // OpenglEs 1.1 does not support reading depth buffer without an extension
1418 memset(pixels, 0xff,4);
1419 return;
1421 FlushOnStateChange();
1422 glEsImpl->glReadPixels(x,y,width,height,format,type,pixels);
1425 void glReadBuffer( GLenum /*mode*/ )
1430 void glLoadMatrixf (const GLfloat *m)
1432 FlushOnStateChange();
1433 glEsImpl->glLoadMatrixf(m);
1436 void glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
1438 FlushOnStateChange();
1439 glEsImpl->glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
1442 void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1444 FlushOnStateChange();
1445 glEsImpl->glClearColor(red,green,blue,alpha);
1448 GLenum glGetError (void)
1450 //FlushOnStateChange();
1451 return GL_NO_ERROR;//glEsImpl->glGetError();
1454 void glActiveTexture (GLenum texture)
1456 if (activetmu == texture)
1458 return;
1460 if (delayedttmuchange)
1462 delayedttmuchange = GL_FALSE;
1464 else
1466 delayedttmuchange = GL_TRUE;
1467 delayedtmutarget = texture;
1469 if (texture == GL_TEXTURE0)
1471 activetmuState = &tmuState0;
1473 else
1475 activetmuState = &tmuState1;
1477 activetmu = texture;
1480 void glClientActiveTexture (GLenum texture)
1482 clientactivetmu = texture;
1485 void glPolygonMode( GLenum face, GLenum mode )
1489 void glDeleteTextures( GLsizei n, const GLuint *textures )
1491 FlushOnStateChange();
1492 glEsImpl->glDeleteTextures(n,textures);
1495 void glClearDepth( GLclampf depth )
1497 FlushOnStateChange();
1498 glEsImpl->glClearDepthf( depth );
1501 void glClipPlane( GLenum plane, const GLdouble *equation )
1503 FlushOnStateChange();
1504 float array[4];
1505 array[0] = (GLfloat)(equation[0]);
1506 array[1] = (GLfloat)(equation[1]);
1507 array[2] = (GLfloat)(equation[2]);
1508 array[3] = (GLfloat)(equation[3]);
1509 glEsImpl->glClipPlanef( plane, array );
1512 void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )
1514 FlushOnStateChange();
1515 glEsImpl->glScissor( x, y, width,height);
1518 void glPointSize( GLfloat size )
1520 FlushOnStateChange();
1521 glEsImpl->glPointSize( size );
1524 void glArrayElement(GLint i) {}
1525 void glLineWidth(GLfloat width) {}
1526 void glCallList( GLuint list ) {}
1527 void glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ) {}
1528 void glStencilFunc( GLenum func, GLint ref, GLuint mask ) {}
1529 void glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ) {}
1531 struct ptrstate vertex_array;
1532 struct ptrstate color_array;
1533 struct ptrstate texture_coord_array;
1535 void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices )
1537 // ensure that all primitives specified between glBegin/glEnd pairs
1538 // are rendered first, and that we have correct tmu in use..
1539 FlushOnStateChange();
1540 // setup correct vertex/color/texcoord pointers
1541 if (arraysValid ||
1542 tmuState0.vertex_array.changed ||
1543 tmuState0.color_array.changed ||
1544 tmuState0.texture_coord_array.changed || tmuState0.normal_array.changed)
1546 glEsImpl->glClientActiveTexture(GL_TEXTURE0);
1548 if (arraysValid || tmuState0.vertex_array.changed)
1550 if (tmuState0.vertex_array.enabled)
1552 glEsImpl->glEnableClientState(GL_VERTEX_ARRAY);
1554 else
1556 glEsImpl->glDisableClientState(GL_VERTEX_ARRAY);
1558 glEsImpl->glVertexPointer(tmuState0.vertex_array.size,
1559 tmuState0.vertex_array.type,
1560 tmuState0.vertex_array.stride,
1561 tmuState0.vertex_array.ptr);
1562 tmuState0.vertex_array.changed = GL_FALSE;
1564 if (arraysValid || tmuState0.color_array.changed)
1566 if (tmuState0.color_array.enabled)
1568 glEsImpl->glEnableClientState(GL_COLOR_ARRAY);
1570 else
1572 glEsImpl->glDisableClientState(GL_COLOR_ARRAY);
1574 glEsImpl->glColorPointer(tmuState0.color_array.size,
1575 tmuState0.color_array.type,
1576 tmuState0.color_array.stride,
1577 tmuState0.color_array.ptr);
1578 tmuState0.color_array.changed = GL_FALSE;
1580 if (arraysValid || tmuState0.normal_array.changed)
1582 if (tmuState0.normal_array.enabled)
1584 glEsImpl->glEnableClientState(GL_NORMAL_ARRAY);
1586 else
1588 glEsImpl->glDisableClientState(GL_NORMAL_ARRAY);
1590 glEsImpl->glColorPointer(tmuState0.normal_array.size,
1591 tmuState0.normal_array.type,
1592 tmuState0.normal_array.stride,
1593 tmuState0.normal_array.ptr);
1594 tmuState0.normal_array.changed = GL_FALSE;
1596 if (arraysValid || tmuState0.texture_coord_array.changed)
1598 tmuState0.texture_coord_array.changed = GL_FALSE;
1599 if (tmuState0.texture_coord_array.enabled)
1601 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1603 else
1605 glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1607 glEsImpl->glTexCoordPointer(tmuState0.texture_coord_array.size,
1608 tmuState0.texture_coord_array.type,
1609 tmuState0.texture_coord_array.stride,
1610 tmuState0.texture_coord_array.ptr);
1613 if (arraysValid || tmuState1.texture_coord_array.changed)
1615 tmuState1.texture_coord_array.changed = GL_FALSE;
1616 glEsImpl->glClientActiveTexture(GL_TEXTURE1);
1617 if (tmuState1.texture_coord_array.enabled)
1619 glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1621 else
1623 glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1625 glEsImpl->glTexCoordPointer(tmuState1.texture_coord_array.size,
1626 tmuState1.texture_coord_array.type,
1627 tmuState1.texture_coord_array.stride,
1628 tmuState1.texture_coord_array.ptr);
1631 arraysValid = GL_FALSE;
1632 glEsImpl->glDrawElements(mode, count, type, indices);
1635 void glEnableClientState(GLenum array)
1637 struct nanotmuState* clientstate = NULL;
1638 if (clientactivetmu == GL_TEXTURE0)
1640 clientstate = &tmuState0;
1642 else if (clientactivetmu == GL_TEXTURE1)
1644 clientstate = &tmuState1;
1646 else
1648 return;
1650 switch (array)
1652 case GL_VERTEX_ARRAY:
1653 if (clientstate->vertex_array.enabled)
1655 return;
1657 clientstate->vertex_array.enabled = GL_TRUE;
1658 clientstate->vertex_array.changed = GL_TRUE;
1659 break;
1660 case GL_COLOR_ARRAY:
1661 if (clientstate->color_array.enabled)
1663 return;
1665 clientstate->color_array.enabled = GL_TRUE;
1666 clientstate->color_array.changed = GL_TRUE;
1668 break;
1669 case GL_NORMAL_ARRAY:
1670 if (clientstate->normal_array.enabled)
1672 return;
1674 clientstate->normal_array.enabled = GL_TRUE;
1675 clientstate->normal_array.changed = GL_TRUE;
1677 break;
1678 case GL_TEXTURE_COORD_ARRAY:
1679 if (clientstate->texture_coord_array.enabled)
1681 return;
1683 clientstate->texture_coord_array.enabled = GL_TRUE;
1684 clientstate->texture_coord_array.changed = GL_TRUE;
1685 break;
1686 default:
1687 break;
1690 void glDisableClientState(GLenum array)
1692 struct nanotmuState* clientstate = NULL;
1693 if (clientactivetmu == GL_TEXTURE0)
1695 clientstate = &tmuState0;
1697 else if (clientactivetmu == GL_TEXTURE1)
1699 clientstate = &tmuState1;
1701 else
1703 return;
1705 switch (array)
1707 case GL_VERTEX_ARRAY:
1708 if (!clientstate->vertex_array.enabled)
1710 return;
1712 clientstate->vertex_array.enabled = GL_FALSE;
1713 clientstate->vertex_array.changed = GL_TRUE;
1714 break;
1715 case GL_COLOR_ARRAY:
1716 if (!clientstate->color_array.enabled)
1718 return;
1720 clientstate->color_array.enabled = GL_FALSE;
1721 clientstate->color_array.changed = GL_TRUE;
1723 break;
1724 case GL_NORMAL_ARRAY:
1725 if (!clientstate->normal_array.enabled)
1727 return;
1729 clientstate->normal_array.enabled = GL_FALSE;
1730 clientstate->normal_array.changed = GL_TRUE;
1732 break;
1733 case GL_TEXTURE_COORD_ARRAY:
1734 if (!clientstate->texture_coord_array.enabled)
1736 return;
1738 clientstate->texture_coord_array.enabled = GL_FALSE;
1739 clientstate->texture_coord_array.changed = GL_TRUE;
1740 break;
1741 default:
1742 break;
1745 void glVertexPointer( GLint size, GLenum type,GLsizei stride, const GLvoid *pointer )
1747 if (tmuState0.vertex_array.size == size &&
1748 tmuState0.vertex_array.stride == stride &&
1749 tmuState0.vertex_array.type == type &&
1750 tmuState0.vertex_array.ptr == pointer)
1752 return;
1754 tmuState0.vertex_array.size = size;
1755 tmuState0.vertex_array.stride = stride;
1756 tmuState0.vertex_array.type = type;
1757 tmuState0.vertex_array.ptr = (GLvoid*)pointer;
1758 tmuState0.vertex_array.changed = GL_TRUE;
1760 void glTexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
1762 struct nanotmuState* clientstate = NULL;
1763 if (clientactivetmu == GL_TEXTURE0)
1765 clientstate = &tmuState0;
1767 else if (clientactivetmu == GL_TEXTURE1)
1769 clientstate = &tmuState1;
1771 if (clientstate->texture_coord_array.size == size &&
1772 clientstate->texture_coord_array.stride == stride &&
1773 clientstate->texture_coord_array.type == type &&
1774 clientstate->texture_coord_array.ptr == pointer)
1776 return;
1778 clientstate->texture_coord_array.size = size;
1779 clientstate->texture_coord_array.stride = stride;
1780 clientstate->texture_coord_array.type = type;
1781 clientstate->texture_coord_array.ptr = (GLvoid*)pointer;
1782 clientstate->texture_coord_array.changed = GL_TRUE;
1784 void glColorPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
1786 if (tmuState0.color_array.size == size &&
1787 tmuState0.color_array.stride == stride &&
1788 tmuState0.color_array.type == type &&
1789 tmuState0.color_array.ptr == pointer)
1791 return;
1793 tmuState0.color_array.size = size;
1794 tmuState0.color_array.stride = stride;
1795 tmuState0.color_array.type = type;
1796 tmuState0.color_array.ptr = (GLvoid*)pointer;
1797 tmuState0.color_array.changed = GL_TRUE;
1800 void glNormalPointer( GLenum type, GLsizei stride, const GLvoid *pointer )
1802 int size = 0;
1803 if (tmuState0.normal_array.size == size &&
1804 tmuState0.normal_array.stride == stride &&
1805 tmuState0.normal_array.type == type &&
1806 tmuState0.normal_array.ptr == pointer)
1808 return;
1810 tmuState0.normal_array.size = size;
1811 tmuState0.normal_array.stride = stride;
1812 tmuState0.normal_array.type = type;
1813 tmuState0.normal_array.ptr = (GLvoid*)pointer;
1814 tmuState0.normal_array.changed = GL_TRUE;
1816 void glPolygonOffset( GLfloat factor, GLfloat units )
1818 FlushOnStateChange();
1819 glEsImpl->glPolygonOffset(factor, units);
1821 void glStencilMask( GLuint mask ) {}
1822 void glClearStencil( GLint s ) {}
1824 #if defined(__MULTITEXTURE_SUPPORT__)
1826 extern "C" void glMultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t );
1828 void glMultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t )
1830 if (target == GL_TEXTURE0)
1832 glTexCoord2f(s,t);
1834 else
1836 currentVertexAttrib.s_multi = s;
1837 currentVertexAttrib.t_multi = t;
1840 #endif
1842 /* Vladimir */
1843 void glDrawArrays( GLenum mode, int first, int count)
1845 FlushOnStateChange();
1846 glEsImpl->glDrawArrays(mode, first , count);
1848 void glMultMatrixf (const GLfloat *m)
1850 FlushOnStateChange();
1851 glEsImpl->glMultMatrixf(m);
1854 void glPixelStorei (GLenum pname, GLint param)
1856 FlushOnStateChange();
1857 glEsImpl->glPixelStorei(pname, param);
1861 void glFogf (GLenum pname, GLfloat param)
1863 FlushOnStateChange();
1864 glEsImpl->glFogf(pname, param);
1867 void glFogfv (GLenum pname, const GLfloat *params)
1869 FlushOnStateChange();
1870 glEsImpl->glFogfv(pname, params);
1873 void glGetTexParameteriv (GLenum target, GLenum pname, GLint *params)
1875 FlushOnStateChange();
1876 glEsImpl->glGetTexParameteriv(target, pname, params);
1880 // This gives: called unimplemented OpenGL ES API (Android)
1881 void glTexParameteri (GLenum target, GLenum pname, GLint param)
1883 if (pname == GL_TEXTURE_BORDER_COLOR) {
1884 return; // not supported by opengl es
1886 if ( (pname == GL_TEXTURE_WRAP_S ||
1887 pname == GL_TEXTURE_WRAP_T) &&
1888 param == GL_CLAMP) {
1889 param = 0x812F;
1892 FlushOnStateChange();
1893 glEsImpl->glTexParameteri(target, pname, param);
1896 void glTexParameterx (GLenum target, GLenum pname, GLfixed param)
1898 if (pname == GL_TEXTURE_BORDER_COLOR) {
1899 return; // not supported by opengl es
1901 if ( (pname == GL_TEXTURE_WRAP_S ||
1902 pname == GL_TEXTURE_WRAP_T) &&
1903 param == GL_CLAMP) {
1904 param = 0x812F;
1906 FlushOnStateChange();
1907 glEsImpl->glTexParameterx(target, pname, param);
1910 void glGenTextures (GLsizei n, GLuint *textures)
1912 FlushOnStateChange();
1913 glEsImpl->glGenTextures(n, textures);
1916 void glFrontFace (GLenum mode)
1918 FlushOnStateChange();
1919 glEsImpl->glFrontFace(mode);
1921 // End Vladimir
1923 void glTexEnvi (GLenum target, GLenum pname, GLint param)
1925 if (target == GL_TEXTURE_ENV)
1927 if (pname == GL_TEXTURE_ENV_MODE)
1929 if (param == activetmuState->texture_env_mode.value)
1931 return;
1933 else
1935 FlushOnStateChange();
1936 glEsImpl->glTexEnvi(target, pname, param);
1937 activetmuState->texture_env_mode.value = param;
1938 return;
1942 FlushOnStateChange();
1943 glEsImpl->glTexEnvi(target, pname, param);
1946 void pglMultiTexCoord3f(GLenum, GLfloat, GLfloat, GLfloat)
1951 void pglMultiTexCoord2f(GLenum, GLfloat, GLfloat)
1956 /*void glNormalPointer(GLenum type, GLsizei stride, const void *ptr)
1958 glEsImpl->glNormalPointer( type, stride, ptr );
1959 }*/
1961 void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1963 FlushOnStateChange();
1964 glEsImpl->glCopyTexSubImage2D( target, level, xoffset, yoffset, x, y, width, height );
1967 void glGenFramebuffers (GLsizei n, GLuint* framebuffers)
1969 FlushOnStateChange();
1970 glEsImpl->glGenFramebuffers( n, framebuffers );
1974 void glGenRenderbuffers( GLsizei n, GLuint* renderbuffers )
1976 FlushOnStateChange();
1977 glEsImpl->glGenFramebuffers( n, renderbuffers );
1980 void glBindRenderbuffer(GLenum target, GLuint renderbuffer)
1982 FlushOnStateChange();
1983 glEsImpl->glBindRenderbuffer( target, renderbuffer );
1986 void glBindFramebuffer(GLenum target, GLuint framebuffer)\
1988 FlushOnStateChange();
1989 glEsImpl->glBindFramebuffer( target, framebuffer );
1992 void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1994 FlushOnStateChange();
1995 glEsImpl->glFramebufferRenderbuffer( target, attachment, renderbuffertarget, renderbuffer );
1998 void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
2000 FlushOnStateChange();
2001 glEsImpl->glDeleteFramebuffers(n, framebuffers);
2004 void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
2006 FlushOnStateChange();
2007 glEsImpl->glDeleteRenderbuffers( n, renderbuffers );
2009 void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2011 FlushOnStateChange();
2012 glEsImpl->glFramebufferTexture2D(target, attachment,textarget,texture,level);
2015 void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
2017 FlushOnStateChange();
2018 glEsImpl->glRenderbufferStorage(target, internalformat, width, height );