1 // We were using PBUFFER for alpha compositing on Linux before, but it does not seem to work, nor be required anymore.
4 namespace gfx::drivers;
7 #if defined(__unix__) || defined(__APPLE__)
9 #if !defined(__MINGW32__)
10 #define GL_GLEXT_PROTOTYPES
13 #define pointer _pointer
17 //#include <GL/miniglx.h>
21 #if !defined(__ANDROID__)
23 #define property _property
27 #define Window X11Window
28 #define Cursor X11Cursor
30 #define Display X11Display
32 #define KeyCode X11KeyCode
33 #define Picture X11Picture
37 #include <X11/Xutil.h>
39 #include <X11/extensions/XShm.h>
42 #include <X11/extensions/Xrender.h>
43 #include <X11/extensions/shape.h>
63 #if defined(__APPLE__)
64 #include <OpenGl/gl.h>
67 #if defined(__WIN32__) || defined(__unix__) || defined(__APPLE__)
69 #if defined(__WIN32__)
70 #define WIN32_LEAN_AND_MEAN
72 #define _WIN32_WINNT 0x0502
78 #if defined(__ANDROID__)
94 #if defined(__unix__) || defined(__APPLE__)
102 static double nearPlane = 1;
104 public double glesGetNearPlane()
109 public void glesSetNearPlane(double value)
114 #define glLoadMatrix glLoadMatrixd
115 #define glMultMatrix glMultMatrixd
116 #define glGetMatrix glGetDoublev
117 #define glTranslate glTranslated
118 #define glScale glScaled
121 #define glVertex3v glVertex3dv
122 #define glNormal3v glNormal3dv
126 //#ifdef VERTEX_FORMAT_DOUBLE
128 #define glLoadMatrix glLoadMatrixd
129 #define glMultMatrix glMultMatrixd
130 #define glGetMatrix glGetDoublev
131 #define glVertex3v glVertex3dv
132 #define glNormal3v glNormal3dv
133 #define glTranslate glTranslated
134 #define glScale glScaled
135 //#define GL_VERTEX_FORMAT GL_DOUBLE
139 #define glLoadMatrix glLoadMatrixf
140 #define glMultMatrix glMultMatrixf
141 #define glGetMatrix glGetFloatv
142 #define glVertex3v glVertex3fv
143 #define glNormal3v glNormal3fv
144 #define glTranslate glTranslatef
145 #define glScale glScalef
146 //#define GL_VERTEX_FORMAT GL_FLOAT
151 #define GL_ARRAY_BUFFER_ARB 0x8892
152 #define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
153 #define GL_STATIC_DRAW_ARB 0x88E4
154 #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8
155 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA
157 #define GL_MULTISAMPLE_ARB 0x809D
159 #if defined(__WIN32__)
161 #define WGL_SAMPLE_BUFFERS_ARB 0x2041
162 #define WGL_SAMPLES_ARB 0x2042
164 #define WGL_WGLEXT_VERSION 1
165 #define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001
166 #define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002
167 #define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004
168 #define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008
169 #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
170 #define WGL_DRAW_TO_WINDOW_ARB 0x2001
171 #define WGL_DRAW_TO_BITMAP_ARB 0x2002
172 #define WGL_ACCELERATION_ARB 0x2003
173 #define WGL_NEED_PALETTE_ARB 0x2004
174 #define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
175 #define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
176 #define WGL_SWAP_METHOD_ARB 0x2007
177 #define WGL_NUMBER_OVERLAYS_ARB 0x2008
178 #define WGL_NUMBER_UNDERLAYS_ARB 0x2009
179 #define WGL_TRANSPARENT_ARB 0x200A
180 #define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
181 #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
182 #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
183 #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
184 #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
185 #define WGL_SHARE_DEPTH_ARB 0x200C
186 #define WGL_SHARE_STENCIL_ARB 0x200D
187 #define WGL_SHARE_ACCUM_ARB 0x200E
188 #define WGL_SUPPORT_GDI_ARB 0x200F
189 #define WGL_SUPPORT_OPENGL_ARB 0x2010
190 #define WGL_DOUBLE_BUFFER_ARB 0x2011
191 #define WGL_STEREO_ARB 0x2012
192 #define WGL_PIXEL_TYPE_ARB 0x2013
193 #define WGL_COLOR_BITS_ARB 0x2014
194 #define WGL_RED_BITS_ARB 0x2015
195 #define WGL_RED_SHIFT_ARB 0x2016
196 #define WGL_GREEN_BITS_ARB 0x2017
197 #define WGL_GREEN_SHIFT_ARB 0x2018
198 #define WGL_BLUE_BITS_ARB 0x2019
199 #define WGL_BLUE_SHIFT_ARB 0x201A
200 #define WGL_ALPHA_BITS_ARB 0x201B
201 #define WGL_ALPHA_SHIFT_ARB 0x201C
202 #define WGL_ACCUM_BITS_ARB 0x201D
203 #define WGL_ACCUM_RED_BITS_ARB 0x201E
204 #define WGL_ACCUM_GREEN_BITS_ARB 0x201F
205 #define WGL_ACCUM_BLUE_BITS_ARB 0x2020
206 #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
207 #define WGL_DEPTH_BITS_ARB 0x2022
208 #define WGL_STENCIL_BITS_ARB 0x2023
209 #define WGL_AUX_BUFFERS_ARB 0x2024
210 #define WGL_NO_ACCELERATION_ARB 0x2025
211 #define WGL_GENERIC_ACCELERATION_ARB 0x2026
212 #define WGL_FULL_ACCELERATION_ARB 0x2027
213 #define WGL_SWAP_EXCHANGE_ARB 0x2028
214 #define WGL_SWAP_COPY_ARB 0x2029
215 #define WGL_SWAP_UNDEFINED_ARB 0x202A
216 #define WGL_TYPE_RGBA_ARB 0x202B
217 #define WGL_TYPE_COLORINDEX_ARB 0x202C
218 #define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043
219 #define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054
220 #define WGL_DRAW_TO_PBUFFER_ARB 0x202D
221 #define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
222 #define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
223 #define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
224 #define WGL_PBUFFER_LARGEST_ARB 0x2033
225 #define WGL_PBUFFER_WIDTH_ARB 0x2034
226 #define WGL_PBUFFER_HEIGHT_ARB 0x2035
227 #define WGL_PBUFFER_LOST_ARB 0x2036
228 #define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043
229 #define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000
230 #define WGL_DRAW_TO_WINDOW_EXT 0x2001
231 #define WGL_DRAW_TO_BITMAP_EXT 0x2002
232 #define WGL_ACCELERATION_EXT 0x2003
233 #define WGL_NEED_PALETTE_EXT 0x2004
234 #define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005
235 #define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006
236 #define WGL_SWAP_METHOD_EXT 0x2007
237 #define WGL_NUMBER_OVERLAYS_EXT 0x2008
238 #define WGL_NUMBER_UNDERLAYS_EXT 0x2009
239 #define WGL_TRANSPARENT_EXT 0x200A
240 #define WGL_TRANSPARENT_VALUE_EXT 0x200B
241 #define WGL_SHARE_DEPTH_EXT 0x200C
242 #define WGL_SHARE_STENCIL_EXT 0x200D
243 #define WGL_SHARE_ACCUM_EXT 0x200E
244 #define WGL_SUPPORT_GDI_EXT 0x200F
245 #define WGL_SUPPORT_OPENGL_EXT 0x2010
246 #define WGL_DOUBLE_BUFFER_EXT 0x2011
247 #define WGL_STEREO_EXT 0x2012
248 #define WGL_PIXEL_TYPE_EXT 0x2013
249 #define WGL_COLOR_BITS_EXT 0x2014
250 #define WGL_RED_BITS_EXT 0x2015
251 #define WGL_RED_SHIFT_EXT 0x2016
252 #define WGL_GREEN_BITS_EXT 0x2017
253 #define WGL_GREEN_SHIFT_EXT 0x2018
254 #define WGL_BLUE_BITS_EXT 0x2019
255 #define WGL_BLUE_SHIFT_EXT 0x201A
256 #define WGL_ALPHA_BITS_EXT 0x201B
257 #define WGL_ALPHA_SHIFT_EXT 0x201C
258 #define WGL_ACCUM_BITS_EXT 0x201D
259 #define WGL_ACCUM_RED_BITS_EXT 0x201E
260 #define WGL_ACCUM_GREEN_BITS_EXT 0x201F
261 #define WGL_ACCUM_BLUE_BITS_EXT 0x2020
262 #define WGL_ACCUM_ALPHA_BITS_EXT 0x2021
263 #define WGL_DEPTH_BITS_EXT 0x2022
264 #define WGL_STENCIL_BITS_EXT 0x2023
265 #define WGL_AUX_BUFFERS_EXT 0x2024
266 #define WGL_NO_ACCELERATION_EXT 0x2025
267 #define WGL_GENERIC_ACCELERATION_EXT 0x2026
268 #define WGL_FULL_ACCELERATION_EXT 0x2027
269 #define WGL_SWAP_EXCHANGE_EXT 0x2028
270 #define WGL_SWAP_COPY_EXT 0x2029
271 #define WGL_SWAP_UNDEFINED_EXT 0x202A
272 #define WGL_TYPE_RGBA_EXT 0x202B
273 #define WGL_TYPE_COLORINDEX_EXT 0x202C
274 #define WGL_DRAW_TO_PBUFFER_EXT 0x202D
275 #define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E
276 #define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F
277 #define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030
278 #define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031
279 #define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032
280 #define WGL_PBUFFER_LARGEST_EXT 0x2033
281 #define WGL_PBUFFER_WIDTH_EXT 0x2034
282 #define WGL_PBUFFER_HEIGHT_EXT 0x2035
283 #define WGL_DEPTH_FLOAT_EXT 0x2040
284 #define WGL_SAMPLE_BUFFERS_3DFX 0x2060
285 #define WGL_SAMPLES_3DFX 0x2061
286 #define WGL_SAMPLE_BUFFERS_EXT 0x2041
287 #define WGL_SAMPLES_EXT 0x2042
288 #define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044
289 #define WGL_GENLOCK_SOURCE_EXTENAL_SYNC_I3D 0x2045
290 #define WGL_GENLOCK_SOURCE_EXTENAL_FIELD_I3D 0x2046
291 #define WGL_GENLOCK_SOURCE_EXTENAL_TTL_I3D 0x2047
292 #define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048
293 #define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049
294 #define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A
295 #define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B
296 #define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C
297 #define WGL_GAMMA_TABLE_SIZE_I3D 0x204E
298 #define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F
299 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050
300 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051
301 #define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052
302 #define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053
303 #define WGL_ARB_buffer_region 1
304 #define WGL_ARB_extensions_string 1
305 #define WGL_ARB_pixel_format 1
306 #define WGL_ARB_make_current_read 1
307 #define WGL_ARB_pbuffer 1
308 #define WGL_EXT_display_color_table 1
309 #define WGL_EXT_extensions_string 1
310 #define WGL_EXT_make_current_read 1
311 #define WGL_EXT_pbuffer 1
312 #define WGL_EXT_pixel_format 1
313 #define WGL_EXT_swap_control 1
314 #define WGL_WGL_EXT_depth_float 1
315 #define WGL_WGL_3DFX_multisample 1
316 #define WGL_WGL_EXT_multisample 1
317 #define WGL_NV_allocate_memory 1
320 typedef void (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum target);
321 typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);
322 typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum target);
323 typedef void (APIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count);
324 typedef void (APIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void);
328 typedef int (APIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
329 typedef int (APIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
330 typedef int (APIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);
331 typedef int (APIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, int size, const GLvoid *data, GLenum usage);
333 typedef int (APIENTRY * PFNWGLCHOOSEPIXELFORMATARBPROC) ();
334 typedef void * (APIENTRY * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
335 typedef HDC (APIENTRY * PFNWGLGETPBUFFERDCARBPROC) (void * hPbuffer);
336 typedef int (APIENTRY * PFNWGLRELEASEPBUFFERDCARBPROC) (void * hPbuffer, HDC hDC);
337 typedef BOOL (APIENTRY * PFNWGLDESTROYPBUFFERARBPROC) (void * hPbuffer);
338 typedef BOOL (APIENTRY * PFNWGLQUERYPBUFFERARBPROC) (void * hPbuffer, int iAttribute, int *piValue);
339 typedef const char * (APIENTRY * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
340 typedef BOOL (APIENTRY * PFNWGLBINDTEXIMAGEARBPROC) (void * hPbuffer, int iBuffer);
341 typedef BOOL (APIENTRY * PFNWGLRELEASETEXIMAGEARBPROC) (void * hPbuffer, int iBuffer);
343 static PFNGLMAPBUFFERARBPROC glMapBufferARB = null;
344 static PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB = null;
345 static PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = null;
346 static PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB = null;
347 static PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB = null;
348 static PFNGLLOCKARRAYSEXTPROC glLockArraysEXT = null;
349 static PFNGLUNLOCKARRAYSEXTPROC glUnlockArraysEXT = null;
350 static PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate = null;
352 static PFNGLGENBUFFERSARBPROC glGenBuffersARB = null;
353 static PFNGLBINDBUFFERARBPROC glBindBufferARB = null;
354 static PFNGLBUFFERDATAARBPROC glBufferDataARB = null;
355 static PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB = null;
356 static PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB = null;
357 static PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = null;
358 static PFNWGLCREATEPBUFFERARBPROC wglCreatePbufferARB = null;
359 static PFNWGLGETPBUFFERDCARBPROC wglGetPbufferDCARB = null;
360 static PFNWGLQUERYPBUFFERARBPROC wglQueryPbufferARB = null;
361 static PFNWGLDESTROYPBUFFERARBPROC wglDestroyPbufferARB = null;
362 static PFNWGLRELEASEPBUFFERDCARBPROC wglReleasePbufferDCARB = null;
363 static PFNWGLBINDTEXIMAGEARBPROC wglBindTexImageARB = null;
364 static PFNWGLRELEASETEXIMAGEARBPROC wglReleaseTexImageARB = null;
366 #define glBufferData glBufferDataARB
368 #ifdef WGL_WGLEXT_PROTOTYPES
369 extern BOOL WINAPI wglSwapIntervalEXT (int);
370 extern int WINAPI wglGetSwapIntervalEXT (void);
371 #endif /* WGL_WGLEXT_PROTOTYPES */
372 typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
373 typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);
375 static PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL;
379 // Our own matrix stack
380 static Matrix matrixStack[3][32];
381 static int matrixIndex[3];
382 static int curStack = 0;
386 // OpenGL ES Porting Kit
387 #if defined(__ANDROID__)
388 #define glBindFramebuffer glBindFramebufferOES
389 #define glBindRenderbuffer glBindRenderbufferOES
390 #define GL_FRAMEBUFFER GL_FRAMEBUFFER_OES
391 #define GL_RENDERBUFFER GL_RENDERBUFFER_OES
392 #define glFramebufferTexture2D glFramebufferTexture2DOES
393 #define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_OES
394 #define glGenFramebuffers glGenFramebuffersOES
395 #define glGenRenderbuffers glGenRenderbuffersOES
396 #define glDeleteFramebuffers glDeleteFramebuffersOES
397 #define glDeleteRenderbuffers glDeleteRenderbuffersOES
399 #define GL_POLYGON_STIPPLE 0xFFFF
400 #define GL_LINE_STIPPLE 0xFFFF
401 #define GL_LINE 0xFFFF
402 #define GL_FILL 0xFFFF
403 #define GL_ALL_ATTRIB_BITS 0xFFFF
404 #define GL_LIGHT_MODEL_LOCAL_VIEWER 0xFFFF
405 #define GL_INT 0x1404
406 #define GL_UNSIGNED_INT 0x1405
407 #define GL_DOUBLE 0x140A
413 #define glDrawElementsi(type, count, start) glDrawElements(type, count, GL_UNSIGNED_SHORT, start)
415 #define glBufferDatai glesBufferDatai
416 #define glBufferDatad glesBufferDatad
417 #define glVertexPointeri glesVertexPointeri
418 #define glVertexPointerd glesVertexPointerd
420 #define glRecti glesRecti
421 #define glBegin glesBegin
422 #define glTexCoord2i glesTexCoord2i
423 #define glVertex2i glesVertex2i
424 #define glTexCoord2d glesTexCoord2d
425 #define glVertex2d glesVertex2d
426 #define glTexCoord2f glesTexCoord2f
427 #define glVertex2f glesVertex2f
428 #define glEnd glesEnd
429 #define glColor3f glesColor3f
430 #define glColor4ub glesColor4ub
431 #define glColor4fv glesColor4fv
432 #define glLineStipple glesLineStipple
433 #define glNormal3fv glesNormal3fv
434 #define glNormal3f glesNormal3f
435 #define glTexCoord2fv glesTexCoord2fv
436 #define glColorMaterial glesColorMaterial
438 #define glLoadMatrixd glesLoadMatrixd
439 #define glMultMatrixd glesMultMatrixd
440 #define glFrustum glesFrustum
441 #define glOrtho glesOrtho
442 #define glScaled glesScaled
443 #define glTranslated glesTranslated
444 #define glRotated glesRotated
445 #define glVertex3d glesVertex3d
446 #define glVertex3dv glesVertex3dv
447 #define glVertex3f glesVertex3f
448 #define glVertex3fv glesVertex3fv
449 #define glLightModeli glesLightModeli
451 #if defined(__ANDROID__)
453 #define GL_QUAD_STRIP 0
454 //#define GL_DOUBLE 0
455 //#define GL_UNSIGNED_INT 0
458 //#define GL_LINE_STIPPLE 0
459 #define GL_BGRA_EXT 0
460 #define GL_UNPACK_ROW_LENGTH 0
461 #define GL_UNPACK_SKIP_PIXELS 0
462 #define GL_UNPACK_SKIP_ROWS 0
464 #define GL_PACK_ROW_LENGTH 0
465 #define GL_PACK_SKIP_ROWS 0
466 #define GL_PACK_SKIP_PIXELS 0
471 #define glVertexPointerd(nc, s, p, nv) glVertexPointer(nc, GL_DOUBLE, s, p)
472 #define glDrawElementsi(type, count, start) glDrawElements(type, count, GL_UNSIGNED_INT, start)
476 #if defined(__ANDROID__)
477 static EGLDisplay eglDisplay;
478 static EGLSurface eglSurface;
479 static EGLContext eglContext;
480 static int eglWidth, eglHeight;
482 static bool egl_init_display(ANativeWindow* window)
484 const EGLint attribs[] =
486 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
490 EGL_DEPTH_SIZE, 16, //24,
491 /*EGL_SAMPLE_BUFFERS, 1,
492 EGL_SAMPLES, 0, //2,*/
501 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
502 eglInitialize(display, 0, 0);
503 eglChooseConfig(display, attribs, &config, 1, &numConfigs);
504 eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
506 surface = eglCreateWindowSurface(display, config, window, null);
507 context = eglCreateContext(display, config, null, null);
509 if(!eglMakeCurrent(display, surface, surface, context))
512 eglQuerySurface(display, surface, EGL_WIDTH, &w);
513 eglQuerySurface(display, surface, EGL_HEIGHT, &h);
515 eglDisplay = display;
516 eglContext = context;
517 eglSurface = surface;
521 glEnableClientState(GL_VERTEX_ARRAY);
523 // Initialize GL state.
524 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
525 glEnable(GL_CULL_FACE);
526 glShadeModel(GL_SMOOTH);
527 glDisable(GL_DEPTH_TEST);
529 glDisable(GL_CULL_FACE);
530 glDisable(GL_DEPTH_TEST);
532 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
535 matrixStack[0][0].Identity();
536 matrixStack[1][0].Identity();
537 matrixStack[2][0].Identity();
539 glesMatrixMode(GL_MODELVIEW);
540 glScaled(1.0, 1.0, -1.0);
541 glesMatrixMode(GL_PROJECTION);
542 glShadeModel(GL_FLAT);
544 glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
545 glFogi(GL_FOG_MODE, GL_EXP);
546 glFogf(GL_FOG_DENSITY, 0);
547 glEnable(GL_NORMALIZE);
548 glDepthFunc(GL_LESS);
550 glDisable(GL_MULTISAMPLE_ARB);
554 glOrtho(0,w,h,0,0.0,1.0);
556 currentVertexBuffer = 0;
560 static void egl_term_display()
564 glDeleteTextures(1, &stippleTexture);
567 if(eglDisplay != EGL_NO_DISPLAY)
569 eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
570 if(eglContext != EGL_NO_CONTEXT)
571 eglDestroyContext(eglDisplay, eglContext);
572 if(eglSurface != EGL_NO_SURFACE)
573 eglDestroySurface(eglDisplay, eglSurface);
574 eglTerminate(eglDisplay);
576 eglDisplay = EGL_NO_DISPLAY;
577 eglContext = EGL_NO_CONTEXT;
578 eglSurface = EGL_NO_SURFACE;
583 // OpenGL Immediate Mode Porting Kit
584 static int beginCount;
585 static int vertexCount;
586 static int normalCount;
587 static float *vertexPointer;
588 static float *normalPointer;
589 static GLenum beginMode = -1;
590 static uint beginBufferSize, normalBufferSize;
591 static int numVertexCoords = 2;
592 static bool vertexColorValues = false;
593 static int vertexStride = 4;
594 static int vertexOffset = 2;
596 public void glesRecti(int a, int b, int c, int d)
606 public void glesBegin(GLenum mode)
611 vertexColorValues = false;
618 normalBufferSize = beginBufferSize = 1024; // default number of vertices
619 vertexPointer = new float[beginBufferSize * vertexStride];
620 normalPointer = new float[normalBufferSize * 3];
624 public void glesTexCoord2f(float x, float y)
626 int count = vertexCount;
628 if(vertexCount + numVertexCoords > beginBufferSize)
630 beginBufferSize = beginBufferSize + beginBufferSize/2;
631 vertexPointer = renew vertexPointer float[beginBufferSize * vertexStride];
634 vertexPointer[count*vertexStride ] = x;
635 vertexPointer[count*vertexStride+1] = y;
638 if(beginMode == GL_QUADS && ((beginCount % 4) == 3))
640 vertexPointer[count*vertexStride ] = vertexPointer[(count-4)*vertexStride];
641 vertexPointer[count*vertexStride+1] = vertexPointer[(count-4)*vertexStride+1];
643 vertexPointer[count*vertexStride ] = vertexPointer[(count-3)*vertexStride];
644 vertexPointer[count*vertexStride+1] = vertexPointer[(count-3)*vertexStride+1];
648 public void glesTexCoord2i(int x, int y) { glesTexCoord2f((float)x, (float)y); }
649 public void glesTexCoord2d(double x, double y) { glesTexCoord2f((float)x, (float)y); }
650 public void glesTexCoord2fv(float * a) { glesTexCoord2f(a[0], a[1]); }
652 public void glesVertex2f(float x, float y)
655 vertexStride = vertexOffset + numVertexCoords;
657 if(vertexCount + 4 > beginBufferSize)
659 beginBufferSize = beginBufferSize + beginBufferSize/2;
660 vertexPointer = renew vertexPointer float[beginBufferSize * vertexStride];
663 vertexPointer[vertexCount*vertexStride+vertexOffset] = x;
664 vertexPointer[vertexCount*vertexStride+vertexOffset + 1] = y;
667 if(beginMode == GL_QUADS && ((beginCount % 4) == 3))
669 vertexPointer[vertexCount*vertexStride+vertexOffset] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset];
670 vertexPointer[vertexCount*vertexStride+vertexOffset + 1] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset + 1];
672 vertexPointer[vertexCount*vertexStride+vertexOffset] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset];
673 vertexPointer[vertexCount*vertexStride+vertexOffset + 1] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset + 1];
678 public void glesVertex2i(int x, int y) { glesVertex2f((float)x, (float)y); }
679 public void glesVertex2d(double x, double y) { glesVertex2f((float)x, (float)y); }
681 public void glesEnd(void)
683 int mode = beginMode;
684 if(mode == GL_QUADS) mode = GL_TRIANGLES;
685 else if(mode == GL_POLYGON) mode = GL_TRIANGLE_FAN;
688 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
689 glTexCoordPointer(2, GL_FLOAT, vertexStride * sizeof(float), vertexPointer);
690 if(vertexColorValues)
692 glEnableClientState(GL_COLOR_ARRAY);
693 glColorPointer(4, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + 2);
695 glVertexPointer (numVertexCoords, GL_FLOAT, (vertexStride)*sizeof(float),vertexPointer+vertexOffset);
696 if(normalCount && normalCount == vertexCount)
698 glEnableClientState(GL_NORMAL_ARRAY);
699 glNormalPointer (GL_FLOAT, 3*sizeof(float),normalPointer);
702 glDrawArrays(mode, 0, vertexCount);
704 glDisableClientState(GL_NORMAL_ARRAY);
705 if(vertexColorValues)
706 glDisableClientState(GL_COLOR_ARRAY);
707 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
709 vertexColorValues = false;
715 static float *floatVPBuffer = null;
716 static short *shortVPBuffer = null;
717 static unsigned int shortVPSize = 0, floatVPSize = 0;
720 //static float *floatVPBuffer = null; // For floats we reuse floatVPBuffer
721 static unsigned short *shortBDBuffer = null;
722 static unsigned int shortBDSize = 0/*, floatVPSize = 0*/;
724 public void glesVertexPointeri(int numCoords, int stride, int *pointer, int numVertices)
729 if(numVertices*numCoords > shortVPSize)
731 shortVPSize = numVertices*numCoords;
732 shortVPBuffer = renew shortVPBuffer short[shortVPSize];
734 for(i = 0; i < numVertices*numCoords; i++)
735 shortVPBuffer[i] = (short)pointer[i];
736 glVertexPointer(numCoords, GL_SHORT, stride, shortVPBuffer);
739 glVertexPointer(numCoords, GL_SHORT, stride, 0);
742 public void glesVertexPointerd(int numCoords, int stride, double *pointer, int numVertices)
747 if(numVertices*numCoords > floatVPSize)
749 floatVPSize = numVertices*numCoords;
750 floatVPBuffer = renew floatVPBuffer float[floatVPSize];
752 for(i = 0; i < numVertices*numCoords; i++)
753 floatVPBuffer[i] = (float)pointer[i];
754 glVertexPointer(numCoords, GL_FLOAT, stride, floatVPBuffer);
757 glVertexPointer(numCoords, GL_FLOAT, stride, 0);
760 public void glesTexReuseIntVP(int numCoords)
762 glTexCoordPointer(numCoords, GL_SHORT, 0, floatVPBuffer);
765 public void glesTexReuseDoubleVP(int numCoords)
767 glTexCoordPointer(numCoords, GL_FLOAT, 0, floatVPBuffer);
770 public void glesColor4f(float r, float g, float b, float a)
772 if(beginMode != (GLenum)-1)
774 int count = vertexCount;
776 vertexColorValues = true;
778 vertexStride = vertexOffset + numVertexCoords;
780 if(vertexCount + vertexStride > beginBufferSize)
782 beginBufferSize = beginBufferSize + beginBufferSize/2;
783 vertexPointer = renew vertexPointer float[beginBufferSize * vertexStride];
786 vertexPointer[count*vertexStride + 2] = r;
787 vertexPointer[count*vertexStride + 3] = g;
788 vertexPointer[count*vertexStride + 4] = b;
789 vertexPointer[count*vertexStride + 5] = a;
792 if(beginMode == GL_QUADS && ((beginCount % 4) == 3))
794 vertexPointer[count*vertexStride + 2] = vertexPointer[(count-4) * vertexStride + 2];
795 vertexPointer[count*vertexStride + 3] = vertexPointer[(count-4) * vertexStride + 3];
796 vertexPointer[count*vertexStride + 4] = vertexPointer[(count-4) * vertexStride + 4];
797 vertexPointer[count*vertexStride + 5] = vertexPointer[(count-4) * vertexStride + 5];
799 vertexPointer[count*vertexStride + 2] = vertexPointer[(count-3) * vertexStride + 2];
800 vertexPointer[count*vertexStride + 3] = vertexPointer[(count-3) * vertexStride + 3];
801 vertexPointer[count*vertexStride + 4] = vertexPointer[(count-3) * vertexStride + 4];
802 vertexPointer[count*vertexStride + 5] = vertexPointer[(count-3) * vertexStride + 5];
807 glColor4f(r, g, b, a);
810 public void glesColor3f( float r, float g, float b )
812 glesColor4f(r, g, b, 1.0f);
815 public void glesColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
817 glesColor4f(r/255.0f, g/255.0f, b/255.0f, a/255.0f);
820 public void glesColor4fv(float * a)
822 glesColor4f(a[0], a[1], a[2], a[3]);
825 public void glesBufferDatad(int target, int size, void * data, int usage)
827 int numElems = size/sizeof(double);
828 double * dblPtr = (double *)data;
830 if (numElems > floatVPSize)
832 floatVPSize = numElems;
833 floatVPBuffer = renew floatVPBuffer float[floatVPSize];
835 for (i=0; i< numElems; i++)
836 floatVPBuffer[i] = (float)dblPtr[i];
838 glBufferData(target, numElems*sizeof(float), floatVPBuffer, usage);
841 public void glesBufferDatai(int target, int size, void * data, int usage)
843 int numElems = size/sizeof(unsigned int);
844 unsigned int * pointer = (unsigned int *)data;
846 if (numElems > shortBDSize)
848 shortBDSize = numElems;
849 shortBDBuffer = renew shortBDBuffer uint16[shortBDSize];
851 for (i=0; i< numElems; i++)
852 shortBDBuffer[i] = (unsigned short)pointer[i];
854 glBufferData(target, numElems*sizeof(unsigned short), shortBDBuffer, usage);
857 // *** Our Custom Matrix Stack ***
859 static void LoadCurMatrix()
861 double * i = matrixStack[curStack][matrixIndex[curStack]].array;
864 (float)i[0],(float)i[1],(float)i[2],(float)i[3],
865 (float)i[4],(float)i[5],(float)i[6],(float)i[7],
866 (float)i[8],(float)i[9],(float)i[10],(float)i[11],
867 (float)i[12],(float)i[13],(float)i[14],(float)i[15]
872 public void glesLoadIdentity()
874 matrixStack[curStack][matrixIndex[curStack]].Identity();
878 public void glesPushMatrix()
880 if(matrixIndex[curStack] + 1 < sizeof(matrixStack[0]) / sizeof(Matrix))
882 matrixIndex[curStack]++;
883 memcpy(matrixStack[curStack][matrixIndex[curStack]].array, matrixStack[curStack][matrixIndex[curStack]-1].array, sizeof(Matrix));
887 public void glesPopMatrix()
889 if(matrixIndex[curStack] > 0)
891 matrixIndex[curStack]--;
896 public void glesLoadMatrixd(double * i)
898 memcpy(matrixStack[curStack][matrixIndex[curStack]].array, i, sizeof(Matrix));
902 public void glesOrtho( double l, double r, double b, double t, double n, double f )
906 (2 / (r - l)), 0, 0, 0,
907 0, (2 / (t - b)), 0, 0,
908 0, 0, (-2 / (f - n)), 0,
909 (-(r + l) / (r - l)), (-(t + b) / (t - b)), (-(f + n) / (f - n)), 1
912 res.Multiply(m, matrixStack[curStack][matrixIndex[curStack]]);
913 matrixStack[curStack][matrixIndex[curStack]] = res;
917 public void glesFrustum( double l, double r, double b, double t, double n, double f )
927 double A = ((r + l) / (r - l));
928 double B = ((t + b) / (t - b));
929 double C = (-(f + n) / (f - n));
930 double D = (-2*f*n/(f-n));
933 (2.0*n / (r - l)), 0, 0, 0,
934 0, (2.0*n / (t - b)), 0, 0,
939 res.Multiply(m, matrixStack[curStack][matrixIndex[curStack]]);
940 matrixStack[curStack][matrixIndex[curStack]] = res;
945 public void glesRotated( double a, double b, double c, double d )
950 q.RotationAxis({(float)b,(float)c,(float)-d}, a );
951 m.RotationQuaternion(q);
952 r.Multiply(m, matrixStack[curStack][matrixIndex[curStack]]);
953 matrixStack[curStack][matrixIndex[curStack]] = r;
956 public void glesScaled( double a, double b, double c )
962 r.Multiply(m, matrixStack[curStack][matrixIndex[curStack]]);
963 matrixStack[curStack][matrixIndex[curStack]] = r;
967 public void glesTranslated( double a, double b, double c )
973 r.Multiply(m, matrixStack[curStack][matrixIndex[curStack]]);
974 matrixStack[curStack][matrixIndex[curStack]] = r;
978 public void glesMultMatrixd( double * i )
981 r.Multiply((Matrix *)i, matrixStack[curStack][matrixIndex[curStack]]);
982 matrixStack[curStack][matrixIndex[curStack]] = r;
986 public void glesMatrixMode(int mode)
988 curStack = (mode == GL_MODELVIEW) ? 0 : (mode == GL_PROJECTION) ? 1 : 2;
994 #define glPushMatrix glesPushMatrix
995 #define glPopMatrix glesPopMatrix
996 #define glLoadIdentity glesLoadIdentity
997 #define glMatrixMode glesMatrixMode
1001 /* Using the built-in matrix stack
1002 void glesLoadMatrixd( double * i )
1006 (float)i[0],(float)i[1],(float)i[2],(float)i[3],
1007 (float)i[4],(float)i[5],(float)i[6],(float)i[7],
1008 (float)i[8],(float)i[9],(float)i[10],(float)i[11],
1009 (float)i[12],(float)i[13],(float)i[14],(float)i[15]
1014 void glesOrtho( double l, double r, double b, double t, double n, double f )
1016 float matrix[4][4] =
1018 { (float)(2 / (r - l)), 0, 0, 0 },
1019 { 0, (float)(2 / (t - b)), 0, 0 },
1020 { 0, 0, (float)(-2 / (f - n)), 0 },
1021 { (float)(-(r + l) / (r - l)), (float)(-(t + b) / (t - b)), (float)(-(f + n) / (f - n)), 1 }
1023 glMultMatrixf((float *)matrix);
1026 void glesFrustum( double l, double r, double b, double t, double n, double f )
1028 float A = (float)((r + l) / (r - l));
1029 float B = (float)((t + b) / (t - b));
1030 float C = (float)(-(f + n) / (f - n));
1031 float D = (float)(-2*f*n/(f-n));
1032 float matrix[4][4] =
1034 { (float)(2*n / (r - l)), 0, 0, 0 },
1035 { 0, (float)(2*n / (t - b)), 0, 0 },
1039 glMultMatrixf((float *)matrix);
1042 void glesRotated( double a, double b, double c, double d ) { glRotatef((float)a, (float)b, (float)c, (float)d); }
1043 void glesScaled( double a, double b, double c ) { glScalef((float)a, (float)b, (float)c); }
1044 void glesTranslated( double a, double b, double c ) { glTranslatef((float)a, (float)b, (float)c); }
1046 void glesMultMatrixd( double * i )
1050 (float)i[0], (float)i[1], (float)i[2], (float)i[3],
1051 (float)i[4], (float)i[5], (float)i[6], (float)i[7],
1052 (float)i[8], (float)i[9], (float)i[10], (float)i[11],
1053 (float)i[12], (float)i[13], (float)i[14], (float)i[15]
1059 // Need to do these...
1060 public void glesVertex3f( float x, float y, float z )
1062 numVertexCoords = 3;
1063 vertexStride = vertexOffset + numVertexCoords;
1065 if(vertexCount + vertexStride > beginBufferSize)
1067 beginBufferSize = beginBufferSize + beginBufferSize/2;
1068 vertexPointer = renew vertexPointer float[beginBufferSize * vertexStride];
1071 vertexPointer[vertexCount*vertexStride+vertexOffset] = x;
1072 vertexPointer[vertexCount*vertexStride+vertexOffset+1] = y;
1073 vertexPointer[vertexCount*vertexStride+vertexOffset+2] = z;
1076 if(beginMode == GL_QUADS && ((beginCount % 4) == 3))
1078 vertexPointer[vertexCount*vertexStride+vertexOffset] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset];
1079 vertexPointer[vertexCount*vertexStride+vertexOffset+1] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset+1];
1080 vertexPointer[vertexCount*vertexStride+vertexOffset+2] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset+2];
1082 vertexPointer[vertexCount*vertexStride+vertexOffset] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset];
1083 vertexPointer[vertexCount*vertexStride+vertexOffset+1] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset+1];
1084 vertexPointer[vertexCount*vertexStride+vertexOffset+2] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset+2];
1090 public void glesVertex3d( double x, double y, double z ) { glesVertex3f((float)x, (float)y, (float)z); }
1091 public void glesVertex3fv( float* coords ) { glesVertex3f(coords[0], coords[1], coords[2]); }
1092 public void glesVertex3dv( double* coords ) { glesVertex3f((float)coords[0], (float)coords[1], (float)coords[2]); }
1094 public void glesNormal3f(float x, float y, float z)
1096 normalCount = vertexCount;
1097 if(vertexCount + 4 > normalBufferSize)
1099 normalBufferSize = normalBufferSize + normalBufferSize/2;
1100 normalPointer = renew normalPointer float[normalBufferSize * 2];
1103 normalPointer[normalCount*3+0] = x;
1104 normalPointer[normalCount*3+1] = y;
1105 normalPointer[normalCount*3+2] = z;
1108 if(beginMode == GL_QUADS && ((beginCount % 4) == 3))
1110 normalPointer[normalCount*3+0] = normalPointer[(normalCount-4)*3+0];
1111 normalPointer[normalCount*3+1] = normalPointer[(normalCount-4)*3+1];
1112 normalPointer[normalCount*3+2] = normalPointer[(normalCount-4)*3+2];
1114 normalPointer[normalCount*3+0] = normalPointer[(normalCount-3)*3+0];
1115 normalPointer[normalCount*3+1] = normalPointer[(normalCount-3)*3+1];
1116 normalPointer[normalCount*3+2] = normalPointer[(normalCount-3)*3+2];
1120 public void glesNormal3fd(double x, double y, double z) { glesNormal3f((float)x, (float)y, (float)z); }
1121 public void glesNormal3fv(float * coords) { glesNormal3f(coords[0], coords[1], coords[2]); }
1123 public void glesColorMaterial(int a, int b)
1125 PrintLn("glColorMaterial stub");
1128 public void glesTerminate()
1130 delete vertexPointer;
1131 delete normalPointer;
1132 beginBufferSize = 0;
1134 delete floatVPBuffer;
1137 delete shortVPBuffer;
1140 delete shortBDBuffer;
1144 static GLuint stippleTexture;
1146 static bool stippleEnabled;
1149 public void glesLineStipple( int i, unsigned short j )
1153 for(x = 0; x < 16; x++)
1155 bool v = (j & (1 << x)) != 0;
1156 texture[x] = v ? 0xFFFFFFFF : 0;
1159 glGenTextures(1, &stippleTexture);
1160 glBindTexture(GL_TEXTURE_2D, stippleTexture);
1161 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
1162 glEnable(GL_TEXTURE_2D);
1163 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1164 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1165 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
1166 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1167 glMatrixMode(GL_TEXTURE);
1169 //glTranslated(1.0/backAttrib->texW/2.0f, 1.0/backAttrib->texH/2.0f, 0.0f);
1170 glScaled(i/16.0, 1, 1.0f);
1171 glTranslated(0.5, 0.5, 0);
1172 glMatrixMode(GL_PROJECTION);
1175 public void glesLightModeli( unsigned int pname, int param )
1177 if(pname == GL_LIGHT_MODEL_TWO_SIDE)
1178 glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, param);
1182 void glClearDepth( double depth ) { glClearDepthf((float)depth); }
1183 void glFogi( unsigned int pname, int param ) { }
1184 void glPolygonMode( unsigned int i, unsigned int j ) { }
1187 // *** Picking won't be supported for now ***
1188 void glPushName( unsigned int i ) { }
1189 void glLoadName( unsigned int i ) { }
1190 void glPopName() { }
1192 // Probably replace by regular glBlendFunc ...
1193 void glBlendFuncSeparate(int a, int b, int c, int d)
1198 // For direct pixel blitting...
1199 void glRasterPos2d(double a, double b) { }
1200 void glPixelZoom(float a, float b) { }
1201 void glDrawPixels(int a, int b, int c, int d, void * e) { }
1205 #if !defined(__APPLE__) && !defined(__WIN32__)
1206 void (APIENTRY * glBindBufferARB) (GLenum target, GLuint buffer);
1207 void (APIENTRY * glGenBuffersARB) (GLsizei n, GLuint *buffers);
1208 void (APIENTRY * glDeleteBuffersARB) (GLsizei n, const GLuint *buffers);
1209 void (APIENTRY * glBufferDataARB) (GLenum target, int size, const GLvoid *data, GLenum usage);
1212 static int currentVertexBuffer;
1214 bool GLSelectVBO(uint vbo)
1216 if(currentVertexBuffer != vbo)
1218 GLBindBuffer(GL_ARRAY_BUFFER, vbo);
1219 currentVertexBuffer = vbo;
1225 void GLGenBuffers(int count, uint * buffer)
1228 glGenBuffers(count, buffer);
1230 #if defined(__WIN32__)
1233 glGenBuffersARB(count, buffer);
1237 void GLDeleteBuffers(int count, GLuint * buffer)
1240 glDeleteBuffers(count, buffer);
1242 #if defined(__WIN32__)
1243 if(glDeleteBuffersARB)
1245 glDeleteBuffersARB(count, buffer);
1249 void GLBindBuffer(int target, uint buffer)
1252 glBindBuffer(target, buffer);
1254 #if defined(__WIN32__)
1257 glBindBufferARB(target, buffer);
1259 currentVertexBuffer = buffer;
1262 public void GLVertexPointer(int numCoords, int glType, int stride, void *ptr, int numVertices)
1265 if(glType == GL_DOUBLE)
1266 glesVertexPointerd(numCoords, stride, ptr, numVertices);
1267 else if(glType == GL_INT)
1268 glesVertexPointeri(numCoords, stride, ptr, numVertices);
1271 glVertexPointer(numCoords, glType, stride, ptr);
1274 public void GLBufferData(int type, GLenum target, int size, const GLvoid *data, GLenum usage)
1277 if(type == GL_DOUBLE)
1278 glesBufferDatad(target, size, (void *)data, usage);
1279 else if(type == GL_UNSIGNED_INT)
1280 glesBufferDatai(target, size, (void *)data, usage);
1285 glBufferData(target, size, data, usage);
1288 #if defined(__WIN32__)
1291 glBufferDataARB(target, size, data, usage);
1295 #if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
1296 static int primitiveTypes[RenderPrimitiveType] =
1298 GL_POINTS, GL_LINES, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS, GL_QUAD_STRIP, GL_LINE_STRIP
1303 // Non OpenGL ES friendly stuff
1307 //#undef GL_UNSIGNED_INT
1312 #undef GL_QUAD_STRIP
1313 #undef GL_POLYGON_STIPPLE
1314 #undef GL_LINE_STIPPLE
1317 #undef GL_ALL_ATTRIB_BITS
1318 #undef GL_LIGHT_MODEL_LOCAL_VIEWER
1322 static int displayWidth, displayHeight;
1324 #define GL_CLAMP_TO_EDGE 0x812F
1326 static bool vboAvailable;
1328 static bool useSingleGLContext = false;
1329 class OGLDisplay : struct
1331 #if defined(__WIN32__)
1341 int imageBuffers[2];
1342 byte * pboMemory1, * pboMemory2;
1344 #elif !defined(__ANDROID__)
1345 GLXContext glContext;
1348 XShmSegmentInfo shminfo;
1350 XShmSegmentInfo shminfoShape;
1351 XImage * shapeImage;
1355 X11Picture windowPicture;
1356 X11Picture pixmapPicture;
1358 X11Picture shapePicture;
1361 ColorAlpha * flippingBuffer;
1362 int flipBufH, flipBufW;
1367 class OGLSystem : struct
1372 #if defined(__WIN32__)
1373 PIXELFORMATDESCRIPTOR pfd;
1378 #elif !defined(__ANDROID__)
1379 XVisualInfo * visualInfo;
1380 GLXContext glContext;
1381 GLXDrawable glxDrawable;
1385 class OGLSurface : struct
1392 float foreground[4], background[4], bitmapMult[4];
1395 class OGLMesh : struct
1404 class OGLIndices : struct
1414 class OpenGLDisplayDriver : DisplayDriver
1416 class_property(name) = "OpenGL";
1418 bool LockSystem(DisplaySystem displaySystem)
1420 #if !defined(__ANDROID__)
1421 OGLSystem oglSystem = displaySystem.driverData;
1422 if(useSingleGLContext) return true;
1423 #if defined(__WIN32__)
1424 wglMakeCurrent(oglSystem.hdc, oglSystem.glrc);
1425 #elif defined(__unix__) || defined(__APPLE__)
1426 //if(previous) return true;
1427 // printf("Making SYSTEM current\n");
1428 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)oglSystem.glxDrawable, oglSystem.glContext);
1429 //previous = oglSystem.glContext;
1435 void UnlockSystem(DisplaySystem displaySystem)
1437 if(useSingleGLContext) return;
1438 #if defined(__WIN32__)
1439 wglMakeCurrent(null, null);
1440 #elif defined(__unix__) || defined(__APPLE__)
1441 // printf("Making NULL current\n");
1442 #if defined(__ANDROID__)
1444 glXMakeCurrent(xGlobalDisplay, None, null);
1450 bool Lock(Display display)
1452 #if !defined(__ANDROID__)
1453 OGLDisplay oglDisplay = display.driverData;
1454 if(useSingleGLContext) return true;
1455 #if defined(__WIN32__)
1456 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
1457 #elif defined(__unix__) || defined(__APPLE__)
1458 // if(previous) glXMakeCurrent(xGlobalDisplay, None, null);
1459 // printf(" Making DISPLAY current\n");
1460 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
1466 void Unlock(Display display)
1468 if(useSingleGLContext) return;
1469 //printf(" Making NULL current\n");
1470 //glXMakeCurrent(xGlobalDisplay, None, null);
1472 LockSystem(display.displaySystem);
1475 void DestroyDisplay(Display display)
1477 OGLDisplay oglDisplay = display.driverData;
1481 #if defined(__WIN32__)
1482 wglMakeCurrent( null, null );
1485 wglDeleteContext(oglDisplay.glrc);
1487 if(oglDisplay.hdc && oglDisplay.pBuffer)
1488 wglReleasePbufferDCARB(oglDisplay.pBuffer, oglDisplay.hdc);
1490 if(oglDisplay.pBuffer)
1491 wglDestroyPbufferARB(oglDisplay.pBuffer);
1494 ReleaseDC(display.window, oglDisplay.hdc);
1496 if(oglDisplay.memDC) DeleteDC(oglDisplay.memDC);
1497 if(oglDisplay.memBitmap) DeleteObject(oglDisplay.memBitmap);
1499 #elif defined(__unix__) || defined(__APPLE__)
1500 #if defined(__ANDROID__)
1502 if(oglDisplay.shapePixmap)
1503 XFreePixmap(xGlobalDisplay, oglDisplay.shapePixmap);
1504 if(oglDisplay.pixmap)
1505 XFreePixmap(xGlobalDisplay, oglDisplay.pixmap);
1506 if(oglDisplay.image)
1508 if(oglDisplay.shminfoShape.shmid != -1)
1510 XShmDetach(xGlobalDisplay, &oglDisplay.shminfo);
1511 if(oglDisplay.shminfo.shmaddr != (void *)-1)
1512 shmdt(oglDisplay.shminfo.shmaddr);
1513 shmctl(oglDisplay.shminfo.shmid, IPC_RMID, 0);
1516 if(oglDisplay.shapeImage)
1518 if(oglDisplay.shminfoShape.shmid != -1)
1520 XShmDetach(xGlobalDisplay, &oglDisplay.shminfoShape);
1521 if(oglDisplay.shminfoShape.shmaddr != (void *)-1)
1522 shmdt(oglDisplay.shminfoShape.shmaddr);
1523 shmctl(oglDisplay.shminfoShape.shmid, IPC_RMID, 0);
1525 XDestroyImage(oglDisplay.shapeImage);
1526 oglDisplay.shapeImage = None;
1529 glXMakeCurrent(xGlobalDisplay, None, null);
1531 if(oglDisplay.glContext)
1532 glXDestroyContext(xGlobalDisplay, oglDisplay.glContext);
1535 delete oglDisplay.flippingBuffer;
1537 display.driverData = null;
1541 void ::CheckExtensions(OGLSystem oglSystem)
1543 const char * extensions = (const char *)glGetString(GL_EXTENSIONS);
1545 oglSystem.pow2textures = strstr(extensions, "GL_ARB_texture_non_power_of_two") ? false : true;
1546 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &oglSystem.maxTextureSize);
1549 bool CreateDisplaySystem(DisplaySystem displaySystem)
1551 bool result = false;
1552 OGLSystem oglSystem = displaySystem.driverData = OGLSystem { };
1555 oglSystem.hwnd = CreateWindow("static", null, 0,0,0,0,0,null,null,null,null);
1557 oglSystem.hdc = GetDC(oglSystem.hwnd);
1561 oglSystem.pfd.nSize = (short)sizeof(oglSystem.pfd);
1562 oglSystem.pfd.nVersion = 1;
1563 oglSystem.pfd.dwFlags = PFD_DRAW_TO_WINDOW /*PFD_DRAW_TO_BITMAP*/ | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
1564 oglSystem.pfd.iPixelType = PFD_TYPE_RGBA;
1565 oglSystem.pfd.cColorBits = 24;
1566 oglSystem.pfd.cAlphaBits = 8;
1567 oglSystem.pfd.cDepthBits = 24;
1568 oglSystem.pfd.iLayerType = PFD_MAIN_PLANE;
1570 oglSystem.format = ChoosePixelFormat(oglSystem.hdc, &oglSystem.pfd);
1571 DescribePixelFormat(oglSystem.hdc, oglSystem.format, sizeof(oglSystem.pfd), &oglSystem.pfd);
1573 if(oglSystem.pfd.cColorBits > 8)
1575 SetPixelFormat(oglSystem.hdc, oglSystem.format, &oglSystem.pfd);
1576 oglSystem.glrc = wglCreateContext(oglSystem.hdc);
1579 wglMakeCurrent(oglSystem.hdc, oglSystem.glrc);
1581 // Get Pointers To The GL Functions
1582 glActiveTextureARB = (void *) wglGetProcAddress("glActiveTextureARB");
1583 glMultiTexCoord2fARB = (void *) wglGetProcAddress("glMultiTexCoord2fARB");
1584 glClientActiveTextureARB = (void *) wglGetProcAddress("glClientActiveTextureARB");
1585 glLockArraysEXT = (void *) wglGetProcAddress("glLockArraysEXT" );
1586 glUnlockArraysEXT = (void *) wglGetProcAddress("glUnlockArraysEXT");
1587 glGenBuffersARB = (void *) wglGetProcAddress("glGenBuffersARB");
1588 glBindBufferARB = (void *) wglGetProcAddress("glBindBufferARB");
1589 glBufferDataARB = (void *) wglGetProcAddress("glBufferDataARB");
1590 glMapBufferARB = (void *) wglGetProcAddress("glMapBufferARB");
1591 glUnmapBufferARB = (void *) wglGetProcAddress("glUnmapBufferARB");
1592 glDeleteBuffersARB = (void *) wglGetProcAddress("glDeleteBuffersARB");
1593 glBlendFuncSeparate = (void *) wglGetProcAddress("glBlendFuncSeparate");
1595 wglChoosePixelFormatARB = (void *) wglGetProcAddress("wglChoosePixelFormatARB");
1596 wglGetExtensionsStringARB = (void *)wglGetProcAddress("wglGetExtensionsStringARB");
1597 wglCreatePbufferARB = (void *)wglGetProcAddress("wglCreatePbufferARB");
1598 wglGetPbufferDCARB = (void *)wglGetProcAddress("wglGetPbufferDCARB");
1599 wglQueryPbufferARB = (void *)wglGetProcAddress("wglQueryPbufferARB");
1600 wglDestroyPbufferARB = (void *)wglGetProcAddress("wglDestroyPbufferARB");
1601 wglReleasePbufferDCARB = (void *)wglGetProcAddress("wglReleasePbufferDCARB");
1602 wglBindTexImageARB = (void *)wglGetProcAddress("wglBindTexImageARB");
1603 wglReleaseTexImageARB = (void *)wglGetProcAddress("wglReleaseTexImageARB");
1605 wglSwapIntervalEXT = (void *)wglGetProcAddress("wglSwapIntervalEXT");
1607 vboAvailable = glBindBufferARB != null;
1609 // eSystem_LoggingMode(LOG_MSGBOX, null);
1611 if(wglChoosePixelFormatARB)
1616 float fAttributes[] = {0,0};
1619 WGL_DRAW_TO_WINDOW_ARB,GL_TRUE,
1620 WGL_SUPPORT_OPENGL_ARB,GL_TRUE,
1621 WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB,
1622 WGL_COLOR_BITS_ARB,24,
1623 WGL_ALPHA_BITS_ARB,8,
1624 WGL_DEPTH_BITS_ARB,16,
1625 WGL_STENCIL_BITS_ARB,0,
1626 WGL_DOUBLE_BUFFER_ARB,GL_TRUE,
1627 WGL_SAMPLE_BUFFERS_ARB,GL_TRUE,
1628 WGL_SAMPLES_ARB, 4, // Check For 4x Multisampling
1632 //Log("Found wglChoosePixelFormatARB\n");
1634 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1635 if(!valid || !numFormats)
1637 //Log("Can't find 4x multi sampling\n");
1638 iAttributes[19] = 2;
1639 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1640 if(!valid || !numFormats)
1642 // Log("Can't find 2x multi sampling\n");
1643 iAttributes[16] = 0;
1644 iAttributes[17] = 0;
1645 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1648 if(valid && numFormats)
1650 oglSystem.format = pixelFormat;
1651 wglMakeCurrent(null, null);
1652 wglDeleteContext(oglSystem.glrc);
1654 // *** DescribePixelFormat does not support WGL pixel formats! ***
1655 //DescribePixelFormat(oglSystem.hdc, oglSystem.format, sizeof(oglSystem.pfd), &oglSystem.pfd);
1656 SetPixelFormat(oglSystem.hdc, oglSystem.format, &oglSystem.pfd);
1657 //Log("Successfully set pixel format\n");
1659 oglSystem.glrc = wglCreateContext(oglSystem.hdc);
1660 wglMakeCurrent(oglSystem.hdc, oglSystem.glrc);
1664 eSystem_Logf("Can't find wglChoosePixelFormatARB\n");*/
1668 CheckExtensions(oglSystem);
1670 wglMakeCurrent(null, null);
1672 //eSystem_DumpErrors(true);
1676 #elif defined(__unix__) || defined(__APPLE__)
1677 vboAvailable = true;
1678 #if defined(__ANDROID__)
1679 egl_init_display(guiApp.desktop.windowHandle);
1680 CheckExtensions(oglSystem);
1684 X11Window root = RootWindow( xGlobalDisplay, DefaultScreen( xGlobalDisplay ) );
1685 XSetWindowAttributes attr;
1690 #ifndef ECERE_MINIGLX
1691 GLX_USE_GL, GLX_DEPTH_SIZE, 1,
1694 GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1,
1698 oglSystem.visualInfo = glXChooseVisual( xGlobalDisplay, DefaultScreen( xGlobalDisplay ), attrList );
1699 attr.background_pixel = 0;
1700 attr.border_pixel = 0;
1701 attr.colormap = XCreateColormap( xGlobalDisplay, root, oglSystem.visualInfo->visual, AllocNone);
1702 attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
1703 mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
1705 oglSystem.glxDrawable = XCreateWindow( xGlobalDisplay, root, 0, 0, 1, 1, 0, oglSystem.visualInfo->depth, InputOutput,
1706 oglSystem.visualInfo->visual, mask, &attr );
1708 if(oglSystem.visualInfo)
1710 oglSystem.glContext = glXCreateContext(xGlobalDisplay, oglSystem.visualInfo, null, True);
1711 if(oglSystem.glContext)
1713 glXMakeCurrent(xGlobalDisplay, oglSystem.glxDrawable, oglSystem.glContext);
1715 CheckExtensions(oglSystem);
1716 glXMakeCurrent(xGlobalDisplay, None, null);
1723 displaySystem.flags.alpha = true;
1724 displaySystem.flags.flipping = true;
1725 displaySystem.pixelFormat = pixelFormat888;
1729 void DestroyDisplaySystem(DisplaySystem displaySystem)
1731 OGLSystem oglSystem = displaySystem.driverData;
1733 #if defined(__WIN32__)
1734 wglMakeCurrent( null, null );
1737 wglDeleteContext(oglSystem.glrc);
1740 ReleaseDC(oglSystem.hwnd, oglSystem.hdc);
1741 DestroyWindow(oglSystem.hwnd);
1743 #elif defined(__unix__) || defined(__APPLE__)
1744 #if defined(__ANDROID__)
1747 if(oglSystem.visualInfo)
1749 #ifdef ECERE_MINIGLX
1750 __miniglx_XFree(oglSystem.visualInfo);
1752 XFree(oglSystem.visualInfo);
1756 if(oglSystem.glxDrawable)
1758 XDestroyWindow(xGlobalDisplay, oglSystem.glxDrawable);
1759 oglSystem.glxDrawable = 0;
1766 bool CreateDisplay(Display display)
1768 bool result = false;
1769 OGLDisplay oglDisplay = display.driverData;
1770 #if !defined(__ANDROID__)
1771 OGLSystem oglSystem = display.displaySystem.driverData;
1774 oglDisplay = display.driverData = OGLDisplay { };
1775 //printf("Inside CreateDisplay\n");
1777 #if defined(__WIN32__) || defined(USEPBUFFER)
1778 if(!display.alphaBlend)
1781 #if defined(__WIN32__)
1782 oglDisplay.hdc = GetDC(display.window);
1783 SetPixelFormat(oglDisplay.hdc, oglSystem.format, &oglSystem.pfd);
1784 if((oglDisplay.glrc = wglCreateContext(oglDisplay.hdc)))
1786 wglShareLists(oglSystem.glrc, oglDisplay.glrc);
1787 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
1791 ReleaseDC(display.window, oglDisplay.hdc);
1792 #elif defined(__unix__) || defined(__APPLE__)
1793 #if defined(__ANDROID__)
1795 XVisualInfo * visualInfo = ((XWindowData)display.windowDriverData).visual;
1797 #if defined(__APPLE__)
1798 XVisualInfo template = { 0 };
1799 XWindowAttributes winAttr;
1801 XGetWindowAttributes(xGlobalDisplay, (X11Window)display.window, &winAttr);
1802 template.visualid = XVisualIDFromVisual(winAttr.visual);
1803 visualInfo = XGetVisualInfo(xGlobalDisplay, VisualIDMask, &template, &n);
1805 printf("XGetVisualInfo visual ID = %d\n", template.visualid);
1806 printf("visualInfo visual ID = %d\n", visualInfo->visualid);
1807 printf("oglSystem.visualInfo visual ID = %d\n", oglSystem.visualInfo->visualid);
1808 printf("((XWindowData)display.windowDriverData).visual visual ID = %d\n", ((XWindowData)display.windowDriverData).visual->visualid);
1810 // visualInfo = oglSystem.visualInfo;
1815 //printf("visualInfo is not null\n");
1816 // printf("Creating Display Context, sharing with %x!\n", oglSystem.glContext);
1817 oglDisplay.glContext = glXCreateContext(xGlobalDisplay, visualInfo, oglSystem.glContext, True);
1818 //XFree(visualInfo);
1821 // oglDisplay.glContext = glXCreateContext(xGlobalDisplay, oglSystem.visualInfo, oglSystem.glContext, True);
1822 if(oglDisplay.glContext)
1824 //printf("CreateDisplay Got a Context\n");
1825 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
1831 #if defined(__WIN32__) || defined(USEPBUFFER)
1837 #if defined(__WIN32__)
1838 if(glBlendFuncSeparate)
1839 glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1841 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1843 #if !defined(__OLDX__)
1844 glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1846 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1851 glMatrixMode(GL_MODELVIEW);
1852 glScaled(1.0, 1.0, -1.0);
1853 // glTranslatef(0.375f, 0.375f, 0.0f);
1854 // glTranslatef(-0.625f, -0.625f, 0.0f);
1855 glMatrixMode(GL_PROJECTION);
1856 glShadeModel(GL_FLAT);
1858 // glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, true);
1859 glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
1860 glFogi(GL_FOG_MODE, GL_EXP);
1861 glFogf(GL_FOG_DENSITY, 0);
1862 glEnable(GL_NORMALIZE);
1863 glDepthFunc(GL_LESS);
1865 glDisable(GL_MULTISAMPLE_ARB);
1867 #if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
1868 display.ambient = Color { 50,50,50 };
1871 if(!useSingleGLContext)
1873 #if defined(__WIN32__)
1874 wglMakeCurrent(null, null);
1875 #elif defined(__unix__) || defined(__APPLE__)
1876 #if defined(__ANDROID__)
1879 glXMakeCurrent(xGlobalDisplay, None, null);
1887 bool DisplaySize(Display display, int width, int height)
1889 OGLDisplay oglDisplay = display.driverData;
1891 bool result = false;
1893 //printf("Inside DisplaySize\n");
1894 #if defined(__WIN32__) || defined(USEPBUFFER)
1895 OGLSystem oglSystem = display.displaySystem.driverData;
1896 if(display.alphaBlend)
1898 #if defined(__WIN32__)
1899 const int attributes[]=
1901 /*WGL_TEXTURE_FORMAT_ARB, WGL_TEXTURE_RGBA_ARB,
1902 WGL_TEXTURE_TARGET_ARB, WGL_TEXTURE_2D_ARB, */0
1904 int pixelFormat = 0;
1905 if(wglChoosePixelFormatARB)
1909 float fAttributes[] = {0,0};
1912 //WGL_DRAW_TO_BITMAP_ARB, GL_TRUE,
1913 WGL_DRAW_TO_PBUFFER_ARB,GL_TRUE,
1914 WGL_SUPPORT_OPENGL_ARB,GL_TRUE,
1915 WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB,
1916 WGL_COLOR_BITS_ARB,24,
1917 WGL_ALPHA_BITS_ARB,8,
1918 WGL_DEPTH_BITS_ARB,16,
1919 WGL_STENCIL_BITS_ARB,0,
1920 WGL_DOUBLE_BUFFER_ARB,GL_FALSE,
1921 WGL_SAMPLE_BUFFERS_ARB,GL_TRUE,
1922 WGL_SAMPLES_ARB, 4, // Check For 4x Multisampling
1926 //Log("Found wglChoosePixelFormatARB\n");
1928 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1929 if(!valid || !numFormats)
1931 //Log("Can't find 4x multi sampling\n");
1932 iAttributes[19] = 2;
1933 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1934 if(!valid || !numFormats)
1936 // Log("Can't find 2x multi sampling\n");
1937 iAttributes[16] = 0;
1938 iAttributes[17] = 0;
1939 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1940 if(!valid || !numFormats)
1944 WGL_DRAW_TO_PBUFFER_ARB,GL_TRUE,
1945 //WGL_DRAW_TO_BITMAP_ARB,GL_TRUE,
1946 WGL_SUPPORT_OPENGL_ARB,GL_TRUE,
1947 WGL_COLOR_BITS_ARB,24,
1948 WGL_ALPHA_BITS_ARB,8,
1949 WGL_DEPTH_BITS_ARB,16,
1952 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1956 if(valid && numFormats)
1958 wglMakeCurrent(null, null);
1962 wglMakeCurrent( null, null );
1963 wglMakeCurrent( oglDisplay.hdc, oglDisplay.glrc );
1964 if(oglDisplay.hdc && oglDisplay.pBuffer)
1965 wglReleasePbufferDCARB(oglDisplay.pBuffer, oglDisplay.hdc);
1967 wglDestroyPbufferARB(oglDisplay.pBuffer);
1969 if(!useSingleGLContext)
1970 wglMakeCurrent( null, null );
1973 wglDeleteContext(oglDisplay.glrc);
1975 oglDisplay.pBuffer = wglCreatePbufferARB(oglSystem.hdc, pixelFormat, width, height, attributes);
1976 oglDisplay.hdc = wglGetPbufferDCARB(oglDisplay.pBuffer);
1977 if((oglDisplay.glrc = wglCreateContext(oglDisplay.hdc)))
1980 HDC hdc = GetDC(display.window);
1982 wglShareLists(oglSystem.glrc, oglDisplay.glrc);
1983 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
1985 //wglQueryPbufferARB(pBuffer, WGL_PBUFFER_WIDTH_ARB, &width);
1986 //wglQueryPbufferARB(pBuffer, WGL_PBUFFER_HEIGHT_ARB, &height);
1988 // glDeleteBuffersARB(2, oglDisplay.imageBuffers);
1990 if((info = (BITMAPINFO *)new0 byte[sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256]))
1994 if(oglDisplay.memDC) DeleteDC(oglDisplay.memDC);
1995 oglDisplay.memDC = CreateCompatibleDC(hdc);
1996 SetMapMode(oglDisplay.memDC, MM_TEXT);
1997 info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
1998 info->bmiHeader.biPlanes = 1;
1999 info->bmiHeader.biCompression = BI_RGB;
2000 info->bmiHeader.biBitCount = 32; //(uint16)GetDeviceCaps(hdc, BITSPIXEL);
2001 info->bmiHeader.biWidth = width;
2002 info->bmiHeader.biHeight = height;
2003 newBitmap = CreateDIBSection(hdc, info, DIB_RGB_COLORS, &oglDisplay.picture, null, 0);
2006 SelectObject(oglDisplay.memDC, newBitmap);
2007 if(oglDisplay.memBitmap) DeleteObject(oglDisplay.memBitmap);
2010 PIXELFORMATDESCRIPTOR pfd = { 0 };
2011 pfd.nSize = (short)sizeof(pfd);
2013 pfd.dwFlags = PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL;
2014 pfd.iPixelType = PFD_TYPE_RGBA;
2015 pfd.cColorBits = 32;
2016 //pfd.cAlphaBits = 8;
2017 pfd.cDepthBits = 24;
2018 pfd.iLayerType = PFD_MAIN_PLANE;
2020 oglDisplay.hdc = oglDisplay.memDC;
2022 pixelFormat = ChoosePixelFormat(oglSystem.hdc, &pfd);
2023 DescribePixelFormat(oglDisplay.hdc, pixelFormat, sizeof(pfd), &pfd);
2024 SetPixelFormat(oglDisplay.hdc, pixelFormat, &pfd);
2026 oglDisplay.glrc = wglCreateContext(oglDisplay.hdc);
2027 wglShareLists(oglSystem.glrc, oglDisplay.glrc);
2028 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
2033 const int imageSize = width * height * 4;
2035 glGenBuffersARB(2, oglDisplay.imageBuffers);
2037 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[0]);
2038 glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, imageSize, null, GL_STREAM_READ);
2039 // glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[1]);
2040 // glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, imageSize / 2, null, GL_STREAM_READ);
2043 oglDisplay.memBitmap = newBitmap;
2044 oglDisplay.stride = width;
2050 ReleaseDC(display.window, hdc);
2052 #elif defined(__unix__) || defined(__APPLE__)
2053 #if defined(__ANDROID__)
2058 GLX_DOUBLEBUFFER, True,
2064 GLX_STENCIL_SIZE, 1,
2065 //GLX_DEPTH_SIZE, 24,
2066 GLX_RENDER_TYPE, GLX_RGBA_BIT,
2067 GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT | GLX_WINDOW_BIT,
2073 GLX_PBUFFER_WIDTH, width,
2074 GLX_PBUFFER_HEIGHT, height,
2075 GLX_LARGEST_PBUFFER, False,
2079 // choose a pixel format that meets our minimum requirements
2082 GLXFBConfig *config = glXChooseFBConfig(xGlobalDisplay, DefaultScreen(xGlobalDisplay), attrib, &count);
2085 if(oglDisplay.pixmap)
2087 XFreePixmap(xGlobalDisplay, oglDisplay.pixmap);
2088 oglDisplay.pixmap = None;
2090 if(oglDisplay.shapePixmap)
2092 XFreePixmap(xGlobalDisplay, oglDisplay.shapePixmap);
2093 oglDisplay.shapePixmap = None;
2096 // Free Shared Memory Pixmap
2097 if(oglDisplay.image)
2099 if(oglDisplay.shminfoShape.shmid != -1)
2101 XShmDetach(xGlobalDisplay, &oglDisplay.shminfo);
2102 if(oglDisplay.shminfo.shmaddr != (void *)-1)
2103 shmdt(oglDisplay.shminfo.shmaddr);
2104 shmctl(oglDisplay.shminfo.shmid, IPC_RMID, 0);
2106 XDestroyImage(oglDisplay.image);
2107 oglDisplay.image = None;
2109 if(oglDisplay.shapeImage)
2111 if(oglDisplay.shminfoShape.shmid != -1)
2113 XShmDetach(xGlobalDisplay, &oglDisplay.shminfoShape);
2114 if(oglDisplay.shminfoShape.shmaddr != (void *)-1)
2115 shmdt(oglDisplay.shminfoShape.shmaddr);
2116 shmctl(oglDisplay.shminfoShape.shmid, IPC_RMID, 0);
2118 XDestroyImage(oglDisplay.shapeImage);
2119 oglDisplay.shapeImage = None;
2122 if(oglDisplay.windowPicture)
2123 XRenderFreePicture(xGlobalDisplay, oglDisplay.windowPicture);
2124 if(oglDisplay.pixmapPicture)
2125 XRenderFreePicture(xGlobalDisplay, oglDisplay.pixmapPicture);
2127 if(oglDisplay.pixmap)
2128 XFreePixmap(xGlobalDisplay, oglDisplay.pixmap);
2130 if(oglDisplay.glContext)
2131 glXDestroyContext(xGlobalDisplay, oglDisplay.glContext);
2132 if(oglDisplay.pBuffer)
2133 glXDestroyPbuffer(xGlobalDisplay, oglDisplay.pBuffer);
2135 oglDisplay.pBuffer = glXCreatePbuffer(xGlobalDisplay, config[0], PBattrib);
2136 if(oglDisplay.pBuffer)
2138 oglDisplay.glContext = glXCreateNewContext(xGlobalDisplay, config[0], GLX_RGBA_TYPE, oglSystem.glContext, True);
2139 if(oglDisplay.glContext)
2141 glXMakeCurrent(xGlobalDisplay, None, null);
2142 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
2144 // Initialize Shared Memory Pixmap
2145 oglDisplay.image = XShmCreateImage(xGlobalDisplay, DefaultVisual(xGlobalDisplay, DefaultScreen(xGlobalDisplay)), 32,
2146 ZPixmap, null, &oglDisplay.shminfo, width, height);
2147 if(oglDisplay.image)
2149 oglDisplay.shminfo.shmid = shmget(IPC_PRIVATE,
2150 oglDisplay.image->bytes_per_line * oglDisplay.image->height, IPC_CREAT|0777);
2151 if(oglDisplay.shminfo.shmid != -1)
2153 oglDisplay.shminfo.shmaddr = shmat(oglDisplay.shminfo.shmid, 0, 0);
2154 if(oglDisplay.shminfo.shmaddr != (void *)-1)
2156 oglDisplay.shminfo.readOnly = False;
2157 if(XShmAttach(xGlobalDisplay, &oglDisplay.shminfo))
2159 oglDisplay.pixmap = XShmCreatePixmap(xGlobalDisplay, (X11Window)display.window, oglDisplay.shminfo.shmaddr,
2160 &oglDisplay.shminfo, width, height, 32);
2162 // Initialize Shared Memory Shape Pixmap
2163 oglDisplay.shapeImage = XShmCreateImage(xGlobalDisplay, DefaultVisual(xGlobalDisplay, DefaultScreen(xGlobalDisplay)), 1,
2164 ZPixmap, null, &oglDisplay.shminfoShape, width, height);
2165 if(oglDisplay.shapeImage)
2167 oglDisplay.shminfoShape.shmid = shmget(IPC_PRIVATE,
2168 oglDisplay.shapeImage->bytes_per_line * oglDisplay.shapeImage->height, IPC_CREAT|0777);
2169 if(oglDisplay.shminfoShape.shmid != -1)
2171 oglDisplay.shminfoShape.shmaddr = shmat(oglDisplay.shminfoShape.shmid, 0, 0);
2172 if(oglDisplay.shminfoShape.shmaddr != (void *)-1)
2174 oglDisplay.shminfoShape.readOnly = False;
2175 if(XShmAttach(xGlobalDisplay, &oglDisplay.shminfoShape))
2177 oglDisplay.shapePixmap = XShmCreatePixmap(xGlobalDisplay, (X11Window)display.window, oglDisplay.shminfoShape.shmaddr,
2178 &oglDisplay.shminfoShape, width, height, 1);
2179 //oglDisplay.shapePixmap = XCreatePixmap(xGlobalDisplay, (X11Window)display.window, width, height, 1);
2182 XRenderPictureAttributes attributes = { 0 };
2183 XRenderPictFormat * format = XRenderFindStandardFormat(xGlobalDisplay, /*PictStandardRGB24*/ PictStandardARGB32);
2184 #if !defined(__APPLE__) && !defined(__OLDX__)
2185 attributes.repeat = RepeatNormal;
2187 attributes.repeat = 1;
2189 oglDisplay.pixmapPicture = XRenderCreatePicture(xGlobalDisplay, oglDisplay.pixmap, format, CPRepeat, &attributes);
2190 oglDisplay.windowPicture = XRenderCreatePicture(xGlobalDisplay, (X11Window)display.window, format, 0, &attributes);
2191 oglDisplay.shapePicture = XRenderCreatePicture(xGlobalDisplay, oglDisplay.shapePixmap,
2192 XRenderFindStandardFormat(xGlobalDisplay, PictStandardA1), 0, &attributes);
2195 oglDisplay.picture = oglDisplay.shminfo.shmaddr;
2196 oglDisplay.stride = oglDisplay.image->bytes_per_line / 4;
2213 CreateDisplay(display);
2214 #if defined(__WIN32__)
2215 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
2216 #elif defined(__unix__) || defined(__APPLE__)
2217 #if defined(__ANDROID__)
2221 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
2228 if(!result && display.alphaBlend)
2230 printf("Alpha blending windows not supported on this display\n");
2237 glViewport(0,0,width,height);
2239 glOrtho(0,width,height,0,0.0,1.0);
2240 displayWidth = display.width = width;
2241 displayHeight = display.height = height;
2243 if(!oglDisplay.flippingBuffer || oglDisplay.flipBufW < width || oglDisplay.flipBufH < height)
2245 oglDisplay.flipBufW = width;
2246 oglDisplay.flipBufH = height;
2250 oglDisplay.flippingBuffer = renew oglDisplay.flippingBuffer ColorAlpha [width * height];
2253 if(oglDisplay.flippingBuffer || !width || !height)
2259 void DisplayPosition(Display display, int x, int y)
2261 OGLDisplay oglDisplay = display.driverData;
2267 void SetPalette(Display display, ColorAlpha * palette, bool colorMatch)
2271 void RestorePalette(Display display)
2275 void StartUpdate(Display display)
2279 void EndUpdate(Display display)
2283 void Scroll(Display display, Box scroll, int x, int y, Extent dirty)
2287 void Update(Display display, Box updateBox)
2289 #if defined(__WIN32__) || defined(USEPBUFFER)
2290 OGLDisplay oglDisplay = display.driverData;
2292 //Logf("DisplayScreen\n");
2296 #if defined(__WIN32__) || defined(USEPBUFFER)
2297 if(display.alphaBlend)
2299 glPixelStorei(GL_PACK_ALIGNMENT, 4);
2300 glPixelStorei(GL_PACK_ROW_LENGTH, oglDisplay.stride);
2301 glPixelStorei(GL_PACK_SKIP_ROWS, 0);
2302 glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
2303 glReadPixels(0,0,display.width,display.height,GL_BGRA_EXT,GL_UNSIGNED_BYTE, oglDisplay.picture);
2306 #if defined(__WIN32__)
2308 POINT point = { oglDisplay.x, oglDisplay.y};
2309 POINT srcPoint = { 0, 0 };
2310 BLENDFUNCTION blend = { 0 };
2312 size.cx = display.width;
2313 size.cy = display.height;
2314 blend.BlendOp = AC_SRC_OVER;
2315 blend.BlendFlags = 0;
2316 blend.SourceConstantAlpha = 255;
2317 blend.AlphaFormat = AC_SRC_ALPHA;
2320 // Process partial images. Mapping the buffer waits for
2321 // outstanding DMA transfers into the buffer to finish.
2322 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[0]);
2323 oglDisplay.pboMemory1 = (byte *)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY);
2325 // glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[1]);
2326 // oglDisplay.pboMemory2 = (byte *)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB,GL_READ_ONLY);
2329 memcpy(oglDisplay.picture, oglDisplay.pboMemory1, display.width * display.height * 4);
2330 //memcpy(oglDisplay.picture + display.width * display.height * 4 / 2, oglDisplay.pboMemory2, display.width * display.height * 4/ 2);
2333 UpdateLayeredWindow(display.window, hdc, &point, &size, oglDisplay.memDC, &srcPoint, 0, &blend, ULW_ALPHA);
2336 // Unmap the image buffers
2337 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[0]);
2338 glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
2340 // glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[1]);
2341 // glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
2343 // Bind two different buffer objects and start the glReadPixels
2344 // asynchronously. Each call will return directly after
2345 // starting the DMA transfer.
2346 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[0]);
2347 glReadPixels(0, 0, display.width, display.height, GL_BGRA, GL_UNSIGNED_BYTE, 0);
2349 // glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[1]);
2350 // glReadPixels(0, display.height/2, display.width, display.height/2, GL_BGRA, GL_UNSIGNED_BYTE, 0);
2354 #elif defined(__unix__) || defined(__APPLE__)
2355 #if defined(__ANDROID__)
2357 XTransform transform =
2360 { (int)(1.0f * (1<<16)), (int)(0.0f * (1<<16)), (int)(0 * (1 << 16)) },
2361 { (int)(0.0f), (int)(-1.0f * (1<<16)), (int)(0 * (1<<16)) },
2362 { (int)(0.0f * (1<<16)), (int)(0.0f * (1<<16)), (int)(1.0f * (1<<16)) }
2365 XRenderSetPictureTransform(xGlobalDisplay, oglDisplay.pixmapPicture, &transform);
2366 XRenderComposite(xGlobalDisplay, PictOpSrc, oglDisplay.pixmapPicture, None, oglDisplay.shapePicture, 0, 0, 0, 0, 0, 0, display.width, display.height);
2367 XRenderComposite(xGlobalDisplay, PictOpSrc, oglDisplay.pixmapPicture, None, oglDisplay.windowPicture, 0, 0, 0, 0, 0, 0, display.width, display.height);
2368 #if !defined(__APPLE__) && !defined(__OLDX__)
2369 XShapeCombineMask(xGlobalDisplay, (X11Window)display.window, ShapeInput, 0, 0, oglDisplay.shapePixmap, ShapeSet);
2371 XShapeCombineMask(xGlobalDisplay, display.window, 2, 0, 0, oglDisplay.shapePixmap, ShapeSet);
2373 XFlush(xGlobalDisplay);
2381 #if defined(__WIN32__)
2382 //wglSwapLayerBuffers(oglDisplay.hdc,WGL_SWAP_MAIN_PLANE);
2383 SwapBuffers(oglDisplay.hdc);
2384 #elif defined(__unix__) || defined(__APPLE__)
2385 #if defined(__ANDROID__)
2386 eglSwapBuffers(eglDisplay, eglSurface);
2388 glXSwapBuffers(xGlobalDisplay, (GLXDrawable)display.window);
2392 //Logf("Out of DisplayScreen\n");
2395 void FreeBitmap(DisplaySystem displaySystem, Bitmap bitmap)
2397 if(bitmap.driverData)
2399 GLuint tex = (GLuint)(uintptr)bitmap.driverData;
2400 glDeleteTextures(1, &tex);
2401 bitmap.driverData = 0;
2403 bitmap.driver = ((subclass(DisplayDriver))class(LFBDisplayDriver));
2406 bool AllocateBitmap(DisplaySystem displaySystem, Bitmap bitmap, int width, int height, int stride, PixelFormat format, bool allocatePalette)
2408 OGLSystem oglSystem = displaySystem.driverData;
2409 bool result = false;
2411 GLuint glBitmap = 0;
2413 uint w = width, h = height;
2414 if(oglSystem.pow2textures)
2419 w = Min(w, oglSystem.maxTextureSize);
2420 h = Min(h, oglSystem.maxTextureSize);
2422 glGenTextures(1, &glBitmap);
2423 glBindTexture(GL_TEXTURE_2D, glBitmap);
2425 glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
2427 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2428 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2430 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2431 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2433 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
2435 mipMap.Allocate(null, w, h, w, pixelFormatRGBA, false);
2437 // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
2438 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
2442 bitmap.driverData = (void *)(uintptr)glBitmap;
2443 bitmap.driver = displaySystem.driver;
2451 bool MakeDDBitmap(DisplaySystem displaySystem, Bitmap bitmap, bool mipMaps)
2453 bool result = false;
2454 OGLSystem oglSystem = displaySystem.driverData;
2456 // Pre process the bitmap... First make it 32 bit
2457 if(/*bitmap.pixelFormat == pixelFormatRGBA || */bitmap.Convert(null, pixelFormat888, null))
2460 uint w = bitmap.width, h = bitmap.height;
2461 GLuint glBitmap = 0;
2462 if(oglSystem.pow2textures)
2467 w = Min(w, oglSystem.maxTextureSize);
2468 h = Min(h, oglSystem.maxTextureSize);
2472 while(w * 2 < h) w *= 2;
2473 while(h * 2 < w) h *= 2;
2476 // Switch ARGB to RGBA
2477 //if(bitmap.format != pixelFormatRGBA)
2479 for(c=0; c<bitmap.size; c++)
2481 // ((ColorRGBA *)bitmap.picture)[c] = ((ColorAlpha *)bitmap.picture)[c];
2483 ColorAlpha color = ((ColorAlpha *)bitmap.picture)[c];
2484 ((ColorRGBA *)bitmap.picture)[c] = ColorRGBA { color.color.r, color.color.g, color.color.b, color.a };
2487 bitmap.pixelFormat = pixelFormat888;
2490 glGenTextures(1, &glBitmap);
2493 //int error = glGetError();
2497 glBindTexture(GL_TEXTURE_2D, glBitmap);
2498 glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
2500 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mipMaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
2501 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2503 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2505 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
2506 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
2508 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2509 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2511 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
2515 for(level = 0; result && (w >= 1 || h >= 1); level++, w >>= 1, h >>= 1)
2520 if(bitmap.width != w || bitmap.height != h)
2522 mipMap = Bitmap { };
2523 if(mipMap.Allocate(null, w, h, w, bitmap.pixelFormat, false))
2525 Surface mipSurface = mipMap.GetSurface(0,0,null);
2526 mipSurface.Filter(bitmap, 0,0,0,0, w, h, bitmap.width, bitmap.height);
2543 // glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
2544 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
2545 //printf("Calling glTexImage2D\n");
2546 //glGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_WIDTH, &width);
2547 //printf("width = %d (Should be %d, %d)\n", width, w, h);
2548 if((error = glGetError()))
2550 //Logf("OpenGL Bitmap MakeDD error: %d...\n", error);
2551 //printf("OpenGL Bitmap MakeDD error: %d...\n", error);
2555 if(mipMap != bitmap)
2560 if(!bitmap.keepData)
2561 bitmap.driver.FreeBitmap(bitmap.displaySystem, bitmap);
2562 bitmap.driverData = (void *)(uintptr)glBitmap;
2563 bitmap.driver = displaySystem.driver;
2566 FreeBitmap(displaySystem, bitmap);
2567 else if(oglSystem.loadingFont)
2569 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2570 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2571 oglSystem.loadingFont = false;
2577 void ReleaseSurface(Display display, Surface surface)
2579 glDisable(GL_SCISSOR_TEST);
2580 delete surface.driverData;
2581 surface.driverData = null;
2584 bool GetBitmapSurface(DisplaySystem displaySystem, Surface surface, Bitmap bitmap, int x, int y, Box clip)
2589 bool GetSurface(Display display, Surface surface, int x,int y, Box clip)
2591 bool result = false;
2592 OGLSurface oglSurface = surface.driverData = OGLSurface { };
2594 //Logf("GetSurface\n");
2598 if(displayWidth != display.width || displayHeight != display.height)
2600 displayWidth = display.width;
2601 displayHeight = display.height;
2603 glViewport(0,0,display.width,display.height);
2605 glOrtho(0,display.width,display.height,0,0.0,1.0);
2608 surface.offset.x = x;
2609 surface.offset.y = y;
2610 surface.unclippedBox = surface.box = clip;
2611 oglSurface.bitmapMult[0] = 1;
2612 oglSurface.bitmapMult[1] = 1;
2613 oglSurface.bitmapMult[2] = 1;
2614 oglSurface.bitmapMult[3] = 1;
2616 glEnable(GL_SCISSOR_TEST);
2619 (display.height) -(y+clip.bottom)-1,
2620 clip.right-clip.left+1,
2621 clip.bottom-clip.top+1);
2627 void Clip(Display display, Surface surface, Box clip)
2636 box.Clip(surface.unclippedBox);
2640 box = surface.box = surface.unclippedBox;
2641 box.left += surface.offset.x;
2642 box.top += surface.offset.y;
2643 box.right+= surface.offset.x;
2644 box.bottom += surface.offset.y;
2647 box.left,display.height - box.bottom - 1,
2648 box.right-box.left+1, box.bottom-box.top+1);
2651 bool GrabScreen(Display display, Bitmap bitmap, int x, int y, unsigned int w, unsigned int h)
2653 bool result = false;
2654 OGLDisplay oglDisplay = display.driverData;
2655 ColorAlpha * flippingBuffer = oglDisplay.flippingBuffer;
2657 if(oglDisplay.flippingBuffer)
2659 if(bitmap.pixelFormat != pixelFormat888 || bitmap.width < w || bitmap.height < h)
2662 bitmap.Allocate(null, w,h,w, pixelFormat888, false);
2668 glPixelStorei(GL_PACK_ALIGNMENT, 4);
2669 glPixelStorei(GL_PACK_ROW_LENGTH, bitmap.stride);
2670 glPixelStorei(GL_PACK_SKIP_ROWS, 0);
2671 glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
2672 glReadPixels(x,display.height-h-y,w,h,GL_BGRA_EXT,GL_UNSIGNED_BYTE, flippingBuffer);
2675 for(row = 0; row<h; row++)
2676 CopyBytesBy4(((ColorAlpha *)bitmap.picture) + row * w, ((ColorAlpha *)flippingBuffer) + (h-row-1) * w, w);
2683 void SetForeground(Display display, Surface surface, ColorAlpha color)
2685 OGLSurface oglSurface = surface.driverData;
2687 //Logf("SetForeground\n");
2689 oglSurface.foreground[0] = color.color.r/255.0f;
2690 oglSurface.foreground[1] = color.color.g/255.0f;
2691 oglSurface.foreground[2] = color.color.b/255.0f;
2692 //oglSurface.foreground[3] = 1.0f;
2693 oglSurface.foreground[3] = color.a/255.0f;
2695 //if(!oglSurface.foreground[3])printf("bug");
2698 void SetBackground(Display display, Surface surface, ColorAlpha color)
2700 OGLSurface oglSurface = surface.driverData;
2702 //Logf("SetBackground\n");
2704 oglSurface.background[0] = color.color.r/255.0f;
2705 oglSurface.background[1] = color.color.g/255.0f;
2706 oglSurface.background[2] = color.color.b/255.0f;
2707 //oglSurface.background[3] = 1.0;
2708 oglSurface.background[3] = color.a/255.0f;
2711 void SetBlitTint(Display display, Surface surface, ColorAlpha color)
2713 OGLSurface oglSurface = surface.driverData;
2715 oglSurface.bitmapMult[0] = color.color.r/255.0f;
2716 oglSurface.bitmapMult[1] = color.color.g/255.0f;
2717 oglSurface.bitmapMult[2] = color.color.b/255.0f;
2718 oglSurface.bitmapMult[3] = color.a/255.0f;
2721 ColorAlpha GetPixel(Display display, Surface surface,int x,int y)
2726 void PutPixel(Display display, Surface surface,int x,int y)
2728 OGLSurface oglSurface = surface.driverData;
2730 //Logf("PutPixel\n");
2732 glColor4fv(oglSurface.foreground);
2734 // glVertex2i(x+surface.offset.x, y+surface.offset.y);
2735 glVertex2f(x+surface.offset.x + 0.5f, y+surface.offset.y + 0.5f);
2740 void DrawLine(Display display, Surface surface, int _x1, int _y1, int _x2, int _y2)
2742 OGLSurface oglSurface = surface.driverData;
2743 float x1 = _x1, x2 = _x2, y1 = _y1, y2 = _y2;
2758 x1 += surface.offset.x;
2759 y1 += surface.offset.y;
2760 x2 += surface.offset.x;
2761 y2 += surface.offset.y;
2765 glColor4fv(oglSurface.foreground);
2770 glTexCoord2f(0.5f, 0);
2771 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2772 glTexCoord2f(Max(x2-x1, y2-y1) + 0.5f, 0);
2773 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2782 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2783 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2789 void Rectangle(Display display, Surface surface,int x1,int y1,int x2,int y2)
2791 OGLSurface oglSurface = surface.driverData;
2792 x1 += surface.offset.x;
2793 y1 += surface.offset.y;
2794 x2 += surface.offset.x;
2795 y2 += surface.offset.y;
2797 //Logf("Rectangle\n");
2799 glColor4fv(oglSurface.foreground);
2805 glTexCoord2f(0.5f, 0);
2806 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2807 glTexCoord2f(y2-y1 + 0.5f, 0);
2808 glVertex2f(x1 + 0.5f, y2 + 0.5f);
2810 glTexCoord2f(0.5f, 0);
2811 glVertex2f(x1 + 0.5f, y2 + 0.5f);
2812 glTexCoord2f(x2 - x1 + 0.5f, 0);
2813 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2815 glTexCoord2f(0.5f, 0);
2816 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2817 glTexCoord2f(y1 - y2 + 0.5f, 0);
2818 glVertex2f(x2 + 0.5f, y1 + 0.5f);
2820 glTexCoord2f(0.5f, 0);
2821 glVertex2f(x2 + 0.5f, y1 + 0.5f);
2822 glTexCoord2f(x1 - x2 + 0.5f, 0);
2823 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2828 glBegin(GL_LINE_LOOP);
2835 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2836 glVertex2f(x1 + 0.5f, y2 + 0.5f);
2837 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2838 glVertex2f(x2 + 0.5f, y1 + 0.5f);
2843 void Area(Display display, Surface surface,int x1,int y1,int x2,int y2)
2845 OGLSurface oglSurface = surface.driverData;
2848 glColor4fv(oglSurface.background);
2849 glRecti(x1+surface.offset.x, y1+surface.offset.y,
2850 x2+surface.offset.x + 1, y2+surface.offset.y + 1);
2853 glRectf(x1+surface.offset.x, y1+surface.offset.y,
2854 x2+surface.offset.x + 1, y2+surface.offset.y + 1);
2858 void Clear(Display display, Surface surface, ClearType type)
2860 OGLDisplay oglDisplay = display.driverData;
2861 OGLSurface oglSurface = surface.driverData;
2864 if(type != depthBuffer)
2865 glClearColor(oglSurface.background[0], oglSurface.background[1], oglSurface.background[2], oglSurface.background[3]);
2866 if(type != colorBuffer && !oglDisplay.depthWrite)
2868 glDepthMask((byte)bool::true);
2870 glClear(((type != depthBuffer) ? GL_COLOR_BUFFER_BIT : 0) |
2871 ((type != colorBuffer) ? GL_DEPTH_BUFFER_BIT : 0));
2872 if(type != colorBuffer && !oglDisplay.depthWrite)
2874 glDepthMask((byte)bool::false);
2878 bool ConvertBitmap(DisplaySystem displaySystem, Bitmap bitmap, PixelFormat format, ColorAlpha * palette)
2883 void Blit(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h)
2885 OGLSurface oglSurface = surface.driverData;
2887 #if !defined(__OLDX__)
2888 // WHY DO WE HAVE GL_ONE HERE ?
2889 /*if(glBlendFuncSeparate && !oglSurface.writingText)
2890 glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);*/
2893 if(!oglSurface.writingText)
2895 // glTranslatef(-0.375f, -0.375f, 0.0f);
2896 glEnable(GL_TEXTURE_2D);
2897 glColor4fv(oglSurface.bitmapMult);
2899 else if(oglSurface.xOffset)
2900 glTranslated(oglSurface.xOffset / 64.0/*-0.375*/, 0.0, 0.0);
2902 glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)bitmap.driverData);
2907 glTexCoord2f((float)sx/ bitmap.width, (float)(sy-h)/ bitmap.height);
2908 glVertex2i(dx+surface.offset.x, dy+surface.offset.y);
2909 glTexCoord2f((float)(sx+w) / bitmap.width, (float)(sy-h)/ bitmap.height);
2910 glVertex2i(dx+w+surface.offset.x, dy+surface.offset.y);
2911 glTexCoord2f((float)(sx+w)/ bitmap.width, (float)sy/ bitmap.height);
2912 glVertex2i(dx+w+surface.offset.x, dy-h+surface.offset.y);
2913 glTexCoord2f((float)sx / bitmap.width, (float)sy/ bitmap.height);
2914 glVertex2i(dx+surface.offset.x, dy-h+surface.offset.y);
2919 glTexCoord2f((float)sx / bitmap.width, (float)sy/ bitmap.height);
2920 glVertex2i(dx+surface.offset.x, dy+surface.offset.y);
2921 glTexCoord2f((float)(sx+w)/ bitmap.width, (float)sy/ bitmap.height);
2922 glVertex2i(dx+w+surface.offset.x, dy+surface.offset.y);
2923 glTexCoord2f((float)(sx+w) / bitmap.width, (float)(sy+h)/ bitmap.height);
2924 glVertex2i(dx+w+surface.offset.x, dy+h+surface.offset.y);
2925 glTexCoord2f((float)sx/ bitmap.width, (float)(sy+h)/ bitmap.height);
2926 glVertex2i(dx+surface.offset.x, dy+h+surface.offset.y);
2929 glTexCoord2f((float)sx / bitmap.width, (float)sy/ bitmap.height);
2930 glVertex2f((float)dx+surface.offset.x, (float)dy+surface.offset.y);
2931 glTexCoord2f((float)(sx+w)/ bitmap.width, (float)sy/ bitmap.height);
2932 glVertex2f((float)dx+w+surface.offset.x, (float)dy+surface.offset.y);
2933 glTexCoord2f((float)(sx+w) / bitmap.width, (float)(sy+h)/ bitmap.height);
2934 glVertex2f((float)dx+w+surface.offset.x, (float)dy+h+surface.offset.y);
2935 glTexCoord2f((float)sx/ bitmap.width, (float)(sy+h)/ bitmap.height);
2936 glVertex2f((float)dx+surface.offset.x, (float)dy+h+surface.offset.y);
2940 if(!oglSurface.writingText)
2942 glDisable(GL_TEXTURE_2D);
2944 //glTranslate(0.375, 0.375, 0.0);
2946 else if(oglSurface.xOffset)
2947 glTranslated(-oglSurface.xOffset / 64.0/*+0.375*/, 0.0, 0.0);
2949 #if !defined(__OLDX__)
2950 /*if(glBlendFuncSeparate && !oglSurface.writingText)
2951 glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);*/
2955 void Stretch(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
2957 OGLSurface oglSurface = surface.driverData;
2959 //glTranslate(-0.375, -0.375, 0.0);
2961 //Logf("Stretch\n");
2963 #if !defined(__OLDX__)
2964 /*if(glBlendFuncSeparate)
2965 glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);*/
2968 glEnable(GL_TEXTURE_2D);
2969 glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)bitmap.driverData);
2971 glColor4fv(oglSurface.bitmapMult);
2977 glTexCoord2f((float)(sx)/ bitmap.width, (float)(sy+sh)/ bitmap.height);
2978 glVertex2i(dx+surface.offset.x, dy+surface.offset.y);
2980 glTexCoord2f((float)(sx+sw) / bitmap.width, (float)(sy+sh)/ bitmap.height);
2981 glVertex2i(dx+w+surface.offset.x, dy+surface.offset.y);
2983 glTexCoord2f((float)(sx+sw)/ bitmap.width, (float)(sy)/ bitmap.height);
2984 glVertex2i(dx+w+surface.offset.x, dy-h+surface.offset.y);
2986 glTexCoord2f((float)(sx) / bitmap.width, (float)(sy)/ bitmap.height);
2987 glVertex2i(dx+surface.offset.x, dy-h+surface.offset.y);
2991 glTexCoord2f((float)(sx) / bitmap.width, (float)(sy)/ bitmap.height);
2992 glVertex2i(dx+surface.offset.x, dy+surface.offset.y);
2994 glTexCoord2f((float)(sx+sw)/ bitmap.width, (float)(sy)/ bitmap.height);
2995 glVertex2i(dx+w+surface.offset.x, dy+surface.offset.y);
2997 glTexCoord2f((float)(sx+sw) / bitmap.width, (float)(sy+sh)/ bitmap.height);
2998 glVertex2i(dx+w+surface.offset.x, dy+h+surface.offset.y);
3000 glTexCoord2f((float)(sx)/ bitmap.width, (float)(sy+sh)/ bitmap.height);
3001 glVertex2i(dx+surface.offset.x, dy+h+surface.offset.y);
3006 glDisable(GL_TEXTURE_2D);
3008 //glTranslate(0.375, 0.375, 0.0);
3009 #if !defined(__OLDX__)
3010 /*if(glBlendFuncSeparate)
3011 glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);*/
3016 void Filter(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
3018 Stretch(display, surface, bitmap, dx, dy, sx, sy, w, h, sw, sh);
3021 void StretchDI(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
3023 float s2dw,s2dh,d2sw,d2sh;
3024 //bool flipX = false, flipY = false;
3026 //Logf("StretchDI\n");
3028 if(Sgn(w) != Sgn(sw))
3034 if(Sgn(h) != Sgn(sh))
3046 //Clip against the edges of the source
3049 dx+=(int)((0-sx) * s2dw);
3050 w-=(int)((0-sx) * s2dw);
3056 dy+=(int)((0-sy) * s2dh);
3057 h-=(int)((0-sy) * s2dh);
3062 if(sx+sw>bitmap.width-1)
3064 w-=(int)((sx+sw-(bitmap.width-1)-1)*s2dw);
3065 sw-=sx+sw-(bitmap.width-1)-1;
3067 if(sy+sh>(bitmap.height-1))
3069 h-=(int)((sy+sh-(bitmap.height-1)-1)*s2dh);
3070 sh-=sy+sh-(bitmap.height-1)-1;
3072 //Clip against the edges of the surfaceination
3073 if(dx<surface.box.left)
3076 sx+=(int)((surface.box.left-dx)*d2sw);
3077 sw-=(int)((surface.box.left-dx)*d2sw);
3078 w-=surface.box.left-dx;
3079 dx=surface.box.left;
3081 if(dy<surface.box.top)
3083 sy+=(int)((surface.box.top-dy)*d2sh);
3084 sh-=(int)((surface.box.top-dy)*d2sh);
3085 h-=surface.box.top-dy;
3088 if(dx+w>surface.box.right)
3090 //if(flip) sx+=(int)((dx+w-surface.box.right-1)*d2sw);
3091 sw-=(int)((dx+w-surface.box.right-1)*d2sw);
3092 w-=dx+w-surface.box.right-1;
3094 if(dy+h>surface.box.bottom)
3096 sh-=(int)((dy+h-surface.box.bottom-1)*d2sh);
3097 h-=dy+h-surface.box.bottom-1;
3099 if((w<=0)||(h<=0)||(sw<=0)||(sh<=0)) return;
3101 dx += surface.offset.x;
3102 dy += surface.offset.y;
3104 if(bitmap.pixelFormat == pixelFormat888 && !bitmap.paletteShades)
3106 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
3107 glPixelStorei(GL_UNPACK_ROW_LENGTH, bitmap.stride);
3108 glPixelStorei(GL_UNPACK_SKIP_PIXELS, sx);
3109 glPixelStorei(GL_UNPACK_SKIP_ROWS, sy);
3110 glRasterPos2d(dx,dy);
3111 //glPixelZoom(flipX ? -s2dw : s2dw, flipY ? s2dh : -s2dh);
3112 glPixelZoom(s2dw, -s2dh);
3113 glDrawPixels(sw,sh,GL_BGRA_EXT,GL_UNSIGNED_BYTE, bitmap.picture);
3114 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
3115 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
3116 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
3117 glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
3121 void BlitDI(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h)
3125 //Clip against the edges of the source
3138 if(sx+w>bitmap.width-1)
3139 w-=sx+w-(bitmap.width-1)-1;
3140 if(sy+h>bitmap.height-1)
3141 h-=sy+h-(bitmap.height-1)-1;
3142 //Clip against the edges of the surfaceination
3143 if(dx<surface.box.left)
3146 sx+=surface.box.left-dx;
3147 w-=surface.box.left-dx;
3148 dx=surface.box.left;
3150 if(dy<surface.box.top)
3152 sy+=surface.box.top-dy;
3153 h-=surface.box.top-dy;
3156 if(dx+w>surface.box.right)
3158 //if(flip) sx+=dx+w-surface.box.right-1;
3159 w-=dx+w-surface.box.right-1;
3161 if(dy+h>surface.box.bottom)
3162 h-=dy+h-surface.box.bottom-1;
3166 dx += surface.offset.x;
3167 dy += surface.offset.y;
3169 if(bitmap.pixelFormat == pixelFormat888 && !bitmap.paletteShades)
3171 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
3172 glPixelStorei(GL_UNPACK_ROW_LENGTH, bitmap.stride);
3173 glPixelStorei(GL_UNPACK_SKIP_PIXELS, sx);
3174 glPixelStorei(GL_UNPACK_SKIP_ROWS, sy);
3175 glRasterPos2d(dx,dy);
3177 glDrawPixels(w,h,GL_BGRA_EXT,GL_UNSIGNED_BYTE, bitmap.picture);
3178 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
3179 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
3180 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
3181 glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
3185 void FilterDI(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
3187 StretchDI(display, surface, bitmap, dx, dy, sx, sy, w, h, sw, sh);
3190 void UnloadFont(DisplaySystem displaySystem, Font font)
3192 ((subclass(DisplayDriver))class(LFBDisplayDriver)).UnloadFont(displaySystem, font);
3195 Font LoadFont(DisplaySystem displaySystem, const char * faceName, float size, FontFlags flags)
3198 OGLSystem oglSystem = displaySystem.driverData;
3199 oglSystem.loadingFont = true;
3200 font = ((subclass(DisplayDriver))class(LFBDisplayDriver)).LoadFont(displaySystem, faceName, size, flags);
3204 void FontExtent(DisplaySystem displaySystem, Font font, const char * text, int len, int * width, int * height)
3206 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(displaySystem, font, text, len, width, height);
3209 void WriteText(Display display, Surface surface, int x, int y, const char * text, int len)
3211 OGLSurface oglSurface = surface.driverData;
3212 OGLSystem oglSystem = display.displaySystem.driverData;
3213 oglSystem.loadingFont = true;
3215 //glTranslated(-0.375, -0.375, 0.0);
3219 if(surface.textOpacity)
3222 FontExtent(display.displaySystem, surface.font, text, len, &w, &h);
3223 display.displaySystem.driver.Area(display, surface,x,y,x+w-1,y+h-1);
3226 oglSurface.writingText = true;
3228 glEnable(GL_TEXTURE_2D);
3229 glColor4fv(oglSurface.foreground);
3231 ((subclass(DisplayDriver))class(LFBDisplayDriver)).WriteText(display, surface, x, y, text, len);
3232 oglSurface.writingText = false;
3233 oglSystem.loadingFont = false;
3235 glDisable(GL_TEXTURE_2D);
3237 //glTranslated(0.375, 0.375, 0.0);
3240 void TextFont(Display display, Surface surface, Font font)
3242 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextFont(display, surface, font);
3245 void TextOpacity(Display display, Surface surface, bool opaque)
3247 OGLSurface oglSurface = surface.driverData;
3248 oglSurface.opaqueText = opaque;
3251 void TextExtent(Display display, Surface surface, const char * text, int len, int * width, int * height)
3253 OGLSurface oglSurface = surface.driverData;
3254 OGLSystem oglSystem = display.displaySystem.driverData;
3255 oglSystem.loadingFont = true;
3256 FontExtent(display.displaySystem, oglSurface.font, text, len, width, height);
3257 oglSystem.loadingFont = false;
3260 void DrawingChar(Display display, Surface surface, char character)
3265 void LineStipple(Display display, Surface surface, uint32 stipple)
3267 //Logf("Stipple\n");
3272 stippleEnabled = true;
3273 glesLineStipple(1, (uint16)stipple);
3275 glLineStipple(1, (uint16)stipple);
3276 glEnable(GL_LINE_STIPPLE);
3282 stippleEnabled = false;
3283 glMatrixMode(GL_TEXTURE);
3285 glMatrixMode(GL_PROJECTION);
3286 glDisable(GL_TEXTURE_2D);
3288 glDisable(GL_LINE_STIPPLE);
3292 #if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
3293 void SetRenderState(Display display, RenderState state, uint value)
3295 OGLDisplay oglDisplay = display.driverData;
3296 //Logf("RenderState\n");
3302 glEnable(GL_MULTISAMPLE_ARB);
3304 glDisable(GL_MULTISAMPLE_ARB);
3308 glPolygonMode(GL_FRONT_AND_BACK, ((FillModeValue)value == solid) ? GL_FILL : GL_LINE);
3312 if(value) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);
3315 if(value) glDepthMask((byte)bool::true); else glDepthMask((byte)bool::false);
3316 oglDisplay.depthWrite = (bool)value;
3320 float color[4] = { ((Color)value).r/255.0f, ((Color)value).g/255.0f, ((Color)value).b/255.0f, 1.0f };
3321 glFogfv(GL_FOG_COLOR, (float *)&color);
3325 glFogf(GL_FOG_DENSITY, (float)(RenderStateFloat { ui = value }.f * nearPlane));
3328 if(value) glEnable(GL_BLEND); else glDisable(GL_BLEND);
3332 float ambient[4] = { ((Color)value).r/255.0f, ((Color)value).g/255.0f, ((Color)value).b/255.0f, 1.0f };
3333 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
3338 if(value) glColorMask(1,1,1,1); else glColorMask(1,1,1,0);
3343 #if defined(__WIN32__)
3344 wglSwapIntervalEXT(value ? 1 : 0);
3351 void SetLight(Display display, int id, Light light)
3353 //Logf("SetLight\n");
3357 Object lightObject = light.lightObject;
3358 float position[4] = { 0, 0, 0, 0 };
3359 float color[4] = { 0, 0, 0, 1 };
3361 glEnable(GL_LIGHT0 + id);
3363 glLightfv(GL_LIGHT0 + id, GL_DIFFUSE, (float *)&light.diffuse);
3364 glLightfv(GL_LIGHT0 + id, GL_AMBIENT, (float *)&light.ambient);
3365 glLightfv(GL_LIGHT0 + id, GL_SPECULAR,(float *)&light.specular);
3368 if(!light.multiplier) light.multiplier = 1.0f;
3370 color[0] = light.diffuse.r * light.multiplier;
3371 color[1] = light.diffuse.g * light.multiplier;
3372 color[2] = light.diffuse.b * light.multiplier;
3373 glLightfv(GL_LIGHT0 + id, GL_DIFFUSE, color);
3375 color[0] = light.ambient.r * light.multiplier;
3376 color[1] = light.ambient.g * light.multiplier;
3377 color[2] = light.ambient.b * light.multiplier;
3378 glLightfv(GL_LIGHT0 + id, GL_AMBIENT, color);
3379 color[0] = light.specular.r * light.multiplier;
3380 color[1] = light.specular.g * light.multiplier;
3381 color[2] = light.specular.b * light.multiplier;
3382 glLightfv(GL_LIGHT0 + id, GL_SPECULAR,color);
3386 Vector3D positionVector;
3387 if(light.flags.spot)
3389 if(lightObject.flags.root || !lightObject.parent)
3391 positionVector = lightObject.transform.position;
3392 positionVector.Subtract(positionVector, display.display3D.camera.cPosition);
3396 positionVector.MultMatrix(lightObject.transform.position, lightObject.parent.matrix);
3397 if(display.display3D.camera)
3398 positionVector.Subtract(positionVector, display.display3D.camera.cPosition);
3404 if(!light.direction.x && !light.direction.y && !light.direction.z)
3406 Vector3Df vector { 0,0,-1 };
3408 mat.RotationQuaternion(light.orientation);
3409 positionVector.MultMatrixf(vector, mat);
3413 positionVector = light.direction;
3418 position[0] = (float)positionVector.x;
3419 position[1] = (float)positionVector.y;
3420 position[2] = (float)positionVector.z;
3422 glLightfv(GL_LIGHT0 + id, GL_POSITION, position);
3425 // Display Light Position
3426 glDisable(GL_LIGHTING);
3427 glDisable(GL_DEPTH_TEST);
3431 glVertex3fv(position);
3433 glEnable(GL_DEPTH_TEST);
3434 glEnable(GL_LIGHTING);
3438 if(lightObject.flags.root || !lightObject.parent)
3440 positionVector = light.target.transform.position;
3441 positionVector.Subtract(positionVector, display.camera.cPosition);
3445 positionVector.MultMatrix(light.target.transform.position,
3446 lightObject.light.target.parent.matrix);
3447 positionVector.Subtract(positionVector, display.camera.cPosition);
3450 position[0] = positionVector.x;
3451 position[1] = positionVector.y;
3452 position[2] = positionVector.z;
3454 glDisable(GL_LIGHTING);
3455 glDisable(GL_DEPTH_TEST);
3459 glVertex3fv(position);
3461 glEnable(GL_DEPTH_TEST);
3462 glEnable(GL_LIGHTING);
3465 if(light.flags.attenuation)
3467 glLightf(GL_LIGHT0 + id, GL_CONSTANT_ATTENUATION, light.Kc);
3468 glLightf(GL_LIGHT0 + id, GL_LINEAR_ATTENUATION, light.Kl);
3469 glLightf(GL_LIGHT0 + id, GL_QUADRATIC_ATTENUATION, light.Kq);
3472 if(light.flags.spot)
3475 #define MAXLIGHT 0.9
3476 float direction[4] = { (float)light.direction.x, (float)light.direction.y, (float)light.direction.z, 1 };
3477 // Figure out exponent out of the hot spot
3478 exponent = (float)(log(MAXLIGHT) / log(cos((light.hotSpot / 2))));
3480 glLightfv(GL_LIGHT0 + id, GL_SPOT_DIRECTION, direction);
3481 glLightf(GL_LIGHT0 + id, GL_SPOT_CUTOFF, (float)(light.fallOff / 2));
3482 glLightf(GL_LIGHT0 + id, GL_SPOT_EXPONENT, exponent);
3488 Vector3Df vector { 0,0,-1 };
3489 Vector3Df direction;
3492 mat.RotationQuaternion(light.orientation);
3493 direction.MultMatrix(vector, mat);
3495 position[0] = direction.x;
3496 position[1] = direction.y;
3497 position[2] = direction.z;
3499 glLightfv(GL_LIGHT0 + id, GL_POSITION, position);
3503 glDisable(GL_LIGHT0 + id);
3506 void SetCamera(Display display, Surface surface, Camera camera)
3508 OGLDisplay oglDisplay = display.driverData;
3509 //Logf("SetCamera\n");
3513 int left = surface.box.left + surface.offset.x;
3514 int top = surface.box.top + surface.offset.y;
3515 int right = surface.box.right + surface.offset.x;
3516 int bottom = surface.box.bottom + surface.offset.y;
3517 float origX = surface.offset.x + camera.origin.x;
3518 float origY = surface.offset.y + camera.origin.y;
3520 int y = display.height - bottom - 1;
3521 int w = right - left + 1;
3522 int h = bottom - top + 1;
3525 glViewport(x, y, w, h);
3527 // *** Projection Matrix ***
3528 if(!display.display3D.camera)
3531 glMatrixMode(GL_PROJECTION);
3532 if(display.display3D.collectingHits)
3534 float pickX = display.display3D.pickX + surface.offset.x;
3535 float pickY = display.height - (display.display3D.pickY + surface.offset.y) - 1;
3539 w / display.display3D.pickWidth, 0, 0, 0,
3540 0, h / display.display3D.pickHeight, 0, 0,
3542 (w + 2.0f * (x - pickX)) / display.display3D.pickWidth,
3543 (h + 2.0f * (y - pickY)) / display.display3D.pickHeight, 0, 1
3546 glLoadMatrixd(pickMatrix.array);
3551 (left - origX) * camera.zMin / camera.focalX,
3552 (right - origX) * camera.zMin / camera.focalX,
3553 (bottom - origY) * camera.zMin / camera.focalY,
3554 (top - origY) * camera.zMin / camera.focalY,
3555 camera.zMin, camera.zMax);
3557 glDisable(GL_BLEND);
3559 // *** Z Inverted Identity Matrix ***
3560 glMatrixMode(GL_MODELVIEW);
3561 if(!display.display3D.camera)
3566 glScaled(1.0/nearPlane, 1.0/nearPlane, -1.0/nearPlane);
3568 // *** View Matrix ***
3569 glMultMatrixd(camera.viewMatrix.array);
3574 glEnable(GL_DEPTH_TEST);
3575 glEnable(GL_LIGHTING);
3576 glShadeModel(GL_SMOOTH);
3577 glDepthMask((byte)bool::true);
3578 oglDisplay.depthWrite = true;
3580 glEnable(GL_MULTISAMPLE_ARB);
3582 else if(display.display3D.camera)
3584 oglDisplay.depthWrite = false;
3585 glViewport(0,0,display.width,display.height);
3587 glDisable(GL_CULL_FACE);
3588 glDisable(GL_DEPTH_TEST);
3589 glDisable(GL_LIGHTING);
3591 glDisable(GL_TEXTURE_2D);
3592 glShadeModel(GL_FLAT);
3594 glDisable(GL_MULTISAMPLE_ARB);
3596 // *** Restore 2D MODELVIEW Matrix ***
3599 // *** Restore 2D PROJECTION Matrix ***
3600 glMatrixMode(GL_PROJECTION);
3604 GLBindBuffer(GL_ARRAY_BUFFER_ARB, 0);
3607 void ApplyMaterial(Display display, Material material, Mesh mesh)
3609 //Logf("ApplyMaterial\n");
3612 if(material.flags.doubleSided)
3614 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, !material.flags.singleSideLight);
3615 glDisable(GL_CULL_FACE);
3619 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, bool::false);
3620 glEnable(GL_CULL_FACE);
3624 if(material.flags.noFog)
3630 if(material.baseMap && (mesh.texCoords || mesh.flags.texCoords1))
3632 Bitmap map = material.baseMap;
3633 glEnable(GL_TEXTURE_2D);
3634 glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)map.driverData);
3636 glMatrixMode(GL_TEXTURE);
3638 if(material.uScale && material.vScale)
3639 glScalef(material.uScale, material.vScale, 1);
3640 glMatrixMode(GL_MODELVIEW);
3642 if(material.flags.tile)
3644 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
3645 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
3649 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3650 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3654 glDisable(GL_TEXTURE_2D);
3656 if(mesh.flags.colors)
3658 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
3659 glEnable(GL_COLOR_MATERIAL);
3663 glDisable(GL_COLOR_MATERIAL);
3665 float color[4] = { material.diffuse.r, material.diffuse.g, material.diffuse.b, material.opacity };
3666 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, color);
3669 float color[4] = { material.ambient.r, material.ambient.g, material.ambient.b, 0 };
3670 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, color);
3674 float color[4] = { material.specular.r, material.specular.g, material.specular.b, 0 };
3675 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, color);
3678 float color[4] = { material.emissive.r, material.emissive.g, material.emissive.b, 0 };
3679 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, color);
3682 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &material.power);
3685 void FreeMesh(DisplaySystem displaySystem, Mesh mesh)
3687 OGLMesh oglMesh = mesh.data;
3690 if(!mesh.flags.vertices)
3692 if(oglMesh.vertices)
3694 GLDeleteBuffers(1, &oglMesh.vertices);
3695 oglMesh.vertices = 0;
3697 delete mesh.vertices;
3699 if(!mesh.flags.normals)
3703 GLDeleteBuffers(1, &oglMesh.normals);
3704 oglMesh.normals = 0;
3706 delete mesh.normals;
3708 if(!mesh.flags.texCoords1)
3710 if(oglMesh.texCoords)
3712 GLDeleteBuffers(1, &oglMesh.texCoords);
3713 oglMesh.texCoords = 0;
3715 delete mesh.texCoords;
3717 if(!mesh.flags.texCoords2)
3719 if(oglMesh.texCoords2)
3721 GLDeleteBuffers(1, &oglMesh.texCoords2);
3722 oglMesh.texCoords2 = 0;
3725 delete mesh.texCoords2;
3728 if(!mesh.flags.colors)
3732 GLDeleteBuffers(1, &oglMesh.colors);
3744 bool AllocateMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags, int nVertices)
3746 bool result = false;
3749 mesh.data = OGLMesh { };
3752 if(mesh.nVertices == nVertices)
3754 // Same number of vertices, adding features (Leaves the other features pointers alone)
3755 if(mesh.flags != flags)
3757 if(!mesh.flags.vertices && flags.vertices)
3759 if(flags.doubleVertices)
3761 mesh.vertices = (Vector3Df *)new Vector3D[nVertices];
3764 mesh.vertices = new Vector3Df[nVertices];
3766 if(!mesh.flags.normals && flags.normals)
3768 if(flags.doubleNormals)
3770 mesh.normals = (Vector3Df *)new Vector3D[nVertices];
3773 mesh.normals = new Vector3Df[nVertices];
3775 if(!mesh.flags.texCoords1 && flags.texCoords1)
3777 mesh.texCoords = new Pointf[nVertices];
3779 if(!mesh.flags.colors && flags.colors)
3781 mesh.colors = new ColorRGBAf[nVertices];
3787 // New number of vertices, reallocate all current and new features
3788 flags |= mesh.flags;
3791 if(flags.doubleVertices)
3793 mesh.vertices = (Vector3Df *)renew mesh.vertices Vector3D[nVertices];
3796 mesh.vertices = renew mesh.vertices Vector3Df[nVertices];
3800 if(flags.doubleNormals)
3802 mesh.normals = (Vector3Df *)renew mesh.normals Vector3D[nVertices];
3805 mesh.normals = renew mesh.normals Vector3Df[nVertices];
3807 if(flags.texCoords1)
3809 mesh.texCoords = renew mesh.texCoords Pointf[nVertices];
3813 mesh.colors = renew mesh.colors ColorRGBAf[nVertices];
3821 void UnlockMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags)
3823 OGLMesh oglMesh = mesh.data;
3824 if(!flags) flags = mesh.flags;
3830 if(!oglMesh.vertices)
3831 GLGenBuffers(1, &oglMesh.vertices);
3832 GLBindBuffer(GL_ARRAY_BUFFER_ARB, oglMesh.vertices);
3833 GLBufferData( mesh.flags.doubleVertices ? GL_DOUBLE : GL_FLOAT, GL_ARRAY_BUFFER_ARB, mesh.nVertices * (mesh.flags.doubleVertices ? sizeof(Vector3D) : sizeof(Vector3Df)), mesh.vertices, GL_STATIC_DRAW_ARB );
3838 if(!oglMesh.normals)
3839 GLGenBuffers(1, &oglMesh.normals);
3840 GLBindBuffer(GL_ARRAY_BUFFER_ARB, oglMesh.normals);
3841 GLBufferData( mesh.flags.doubleNormals ? GL_DOUBLE : GL_FLOAT, GL_ARRAY_BUFFER_ARB, mesh.nVertices * (mesh.flags.doubleNormals ? sizeof(Vector3D) : sizeof(Vector3Df)), mesh.normals, GL_STATIC_DRAW_ARB );
3844 if(flags.texCoords1)
3846 if(!oglMesh.texCoords)
3847 GLGenBuffers(1, &oglMesh.texCoords);
3848 GLBindBuffer(GL_ARRAY_BUFFER_ARB, oglMesh.texCoords);
3849 GLBufferData( GL_FLOAT, GL_ARRAY_BUFFER_ARB, mesh.nVertices * sizeof(Pointf), mesh.texCoords, GL_STATIC_DRAW_ARB );
3855 GLGenBuffers( 1, &oglMesh.colors);
3856 GLBindBuffer( GL_ARRAY_BUFFER_ARB, oglMesh.colors);
3857 GLBufferData( GL_FLOAT, GL_ARRAY_BUFFER_ARB, mesh.nVertices * sizeof(ColorRGBAf), mesh.colors, GL_STATIC_DRAW_ARB );
3860 GLBindBuffer( GL_ARRAY_BUFFER_ARB, 0);
3864 bool LockMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags)
3871 void FreeIndices(DisplaySystem displaySystem, OGLIndices oglIndices)
3875 if(oglIndices.buffer)
3876 GLDeleteBuffers(1, &oglIndices.buffer);
3877 delete oglIndices.indices;
3882 void * AllocateIndices(DisplaySystem displaySystem, int nIndices, bool indices32bit)
3884 OGLIndices oglIndices = OGLIndices { };
3887 oglIndices.indices = (void *)(indices32bit ? new uint32[nIndices] : new uint16[nIndices]);
3888 GLGenBuffers( 1, &oglIndices.buffer);
3889 oglIndices.nIndices = nIndices;
3894 void UnlockIndices(DisplaySystem displaySystem, OGLIndices oglIndices, bool indices32bit, int nIndices)
3898 GLBindBuffer( GL_ELEMENT_ARRAY_BUFFER_ARB, oglIndices.buffer);
3899 GLBufferData( indices32bit ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT, GL_ELEMENT_ARRAY_BUFFER_ARB, nIndices * (indices32bit ? sizeof(uint32) : sizeof(uint16)),
3900 oglIndices.indices, GL_STATIC_DRAW_ARB);
3901 GLBindBuffer( GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
3905 uint16 * LockIndices(DisplaySystem displaySystem, OGLIndices oglIndices)
3908 return oglIndices.indices;
3911 void SelectMesh(Display display, Mesh mesh)
3913 //Logf("SelectMesh\n");
3915 #if !defined( __ANDROID__) && !defined(__APPLE__)
3917 #if defined(__WIN32__)
3918 if(glUnlockArraysEXT)
3920 if(!vboAvailable && display.display3D.mesh)
3921 glUnlockArraysEXT();
3926 OGLMesh oglMesh = mesh.data;
3928 // *** Vertex Stream ***
3929 glEnableClientState(GL_VERTEX_ARRAY);
3930 if(!display.display3D.collectingHits && oglMesh)
3932 GLBindBuffer(GL_ARRAY_BUFFER_ARB, oglMesh.vertices );
3933 if(mesh.flags.doubleVertices)
3934 glVertexPointerd(3, 0, oglMesh.vertices ? null : (double *)mesh.vertices, mesh.nVertices);
3936 glVertexPointer(3, GL_FLOAT, 0, oglMesh.vertices ? null : mesh.vertices);
3938 // *** Normals Stream ***
3939 if(mesh.normals || mesh.flags.normals)
3941 glEnableClientState(GL_NORMAL_ARRAY);
3942 GLBindBuffer(GL_ARRAY_BUFFER_ARB, oglMesh.normals);
3943 glNormalPointer(/*mesh.flags.doubleNormals ? GL_DOUBLE : */GL_FLOAT, 0, oglMesh.normals ? null : mesh.normals);
3946 glDisableClientState(GL_NORMAL_ARRAY);
3948 // *** Texture Coordinates Stream ***
3949 if(mesh.texCoords || mesh.flags.texCoords1)
3951 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
3952 GLBindBuffer( GL_ARRAY_BUFFER_ARB, oglMesh.texCoords);
3953 glTexCoordPointer(2, GL_FLOAT, 0, oglMesh.texCoords ? null : mesh.texCoords);
3956 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
3958 // *** Color Stream ***
3959 if(mesh.colors || mesh.flags.colors)
3961 glEnableClientState(GL_COLOR_ARRAY);
3962 GLBindBuffer( GL_ARRAY_BUFFER_ARB, oglMesh.colors);
3963 glColorPointer(4, GL_FLOAT, 0, oglMesh.colors ? null : mesh.colors);
3966 glDisableClientState(GL_COLOR_ARRAY);
3970 GLBindBuffer( GL_ARRAY_BUFFER_ARB, 0);
3971 if(mesh.flags.doubleVertices)
3972 glVertexPointerd(3, 0, (double *)mesh.vertices, mesh.nVertices);
3974 glVertexPointer(3, GL_FLOAT, 0, mesh.vertices);
3975 if((mesh.normals || mesh.flags.normals) && !display.display3D.collectingHits)
3977 glEnableClientState(GL_NORMAL_ARRAY);
3978 glNormalPointer(/*mesh.flags.doubleNormals ? GL_DOUBLE : */GL_FLOAT, 0, mesh.normals);
3981 glDisableClientState(GL_NORMAL_ARRAY);
3982 if((mesh.texCoords || mesh.flags.texCoords1) && !display.display3D.collectingHits)
3984 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
3985 glTexCoordPointer(2, GL_FLOAT, 0, mesh.texCoords);
3988 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
3989 if((mesh.colors || mesh.flags.colors) && !display.display3D.collectingHits)
3991 glEnableClientState(GL_COLOR_ARRAY);
3992 glColorPointer(4, GL_FLOAT, 0, mesh.colors);
3995 glDisableClientState(GL_COLOR_ARRAY);
3998 #if !defined(__ANDROID__) && !defined(__APPLE__)
4000 #if defined(__WIN32__)
4004 glLockArraysEXT(0, mesh.nVertices);
4009 GLBindBuffer(GL_ARRAY_BUFFER_ARB, 0);
4012 void DrawPrimitives(Display display, PrimitiveSingle * primitive, Mesh mesh)
4014 //Logf("DrawPrimitives\n");
4016 if(primitive->type.vertexRange)
4017 glDrawArrays(primitiveTypes[primitive->type.primitiveType], primitive->first, primitive->nVertices);
4020 // *** Hoping the data won't be uploaded at all (Won't really work if another group of the mesh is using the mesh ) ***
4021 // HACK TO SPEED THINGS UP...
4023 /*GLBindBuffer(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
4024 if(primitive->nIndices < (mesh.nVertices >> 2) && !primitive->type.indices32bit)
4027 glBegin(primitiveTypes[primitive->type.primitiveType]);
4030 OGLIndices oglIndices = primitive->data;
4031 MeshFeatures flags = mesh.flags;
4032 for(c = 0; c<primitive->nIndices; c++)
4034 uint16 index = ((uint16 *) oglIndices.indices)[c];
4035 if(flags.normals) glNormal3fv((float *)&mesh.normals[index]);
4036 if(flags.texCoords1) glTexCoord2fv((float *)&mesh.texCoords[index]);
4037 if(flags.colors) glColor4fv((float *)&mesh.colors[index]);
4038 glVertex3fv((float *)&mesh.vertices[index]);
4046 OGLIndices oglIndices = primitive->data;
4048 if(!display.display3D.collectingHits && vboAvailable && oglIndices)
4050 GLBindBuffer(GL_ELEMENT_ARRAY_BUFFER_ARB, oglIndices.buffer);
4051 if(primitive->type.indices32bit)
4052 glDrawElementsi(primitiveTypes[primitive->type.primitiveType], primitive->nIndices, 0);
4054 glDrawElements(primitiveTypes[primitive->type.primitiveType], primitive->nIndices, GL_UNSIGNED_SHORT, 0);
4055 GLBindBuffer(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
4059 if(primitive->type.indices32bit)
4060 glDrawElementsi(primitiveTypes[primitive->type.primitiveType], primitive->nIndices,
4061 oglIndices ? oglIndices.indices : primitive->indices);
4063 glDrawElements(primitiveTypes[primitive->type.primitiveType], primitive->nIndices,
4064 GL_UNSIGNED_SHORT, oglIndices ? oglIndices.indices : primitive->indices);
4070 void PushMatrix(Display display)
4075 void PopMatrix(Display display, bool setMatrix)
4080 void SetTransform(Display display, Matrix transMatrix, bool viewSpace, bool useCamera)
4082 Matrix matrix = transMatrix;
4083 Camera camera = useCamera ? display.display3D.camera : null;
4088 glScaled(1.0/nearPlane, 1.0/nearPlane, -1.0/nearPlane);
4093 matrix.m[3][0] - camera.cPosition.x,
4094 matrix.m[3][1] - camera.cPosition.y,
4095 matrix.m[3][2] - camera.cPosition.z);
4107 glMultMatrixd(matrix.array);
4112 public void UseSingleGLContext(bool useSingle)
4114 useSingleGLContext = useSingle;
4117 default dllexport void *
4118 #if defined(__WIN32__)
4119 __attribute__((stdcall))
4121 IS_GLGetContext(DisplaySystem displaySystem)
4125 #if defined(__WIN32__)
4126 OGLSystem system = displaySystem.driverData;
4128 #elif !defined(__ANDROID__)
4129 OGLSystem system = displaySystem.driverData;
4130 return system.glContext;