3 namespace gfx::drivers;
11 #if !defined(__ANDROID__) && !defined(__EMSCRIPTEN__) && !defined(__ODROID__)
13 # include "gl_core_3_3.h"
15 # include "gl_compat_4_4.h"
19 #if defined(__ANDROID__) || defined(__ODROID__)
28 #define GL_BGRA_EXT 0x80E1
32 #undef glEnableClientState
33 #undef glDisableClientState
34 #undef GL_VERTEX_ARRAY
35 #undef GL_NORMAL_ARRAY
36 #undef GL_TEXTURE_COORD_ARRAY
39 #define glEnableClientState glEnableVertexAttribArray
40 #define glDisableClientState glDisableVertexAttribArray
41 #define GL_VERTEX_ARRAY GLBufferContents::vertex
42 #define GL_NORMAL_ARRAY GLBufferContents::normal
43 #define GL_TEXTURE_COORD_ARRAY GLBufferContents::texCoord
44 #define GL_COLOR_ARRAY GLBufferContents::color
48 // We were using PBUFFER for alpha compositing on Linux before, but it does not seem to work, nor be required anymore.
50 #if defined(__unix__) || defined(__APPLE__)
52 #if !defined(__MINGW32__)
53 #define GL_GLEXT_PROTOTYPES
56 #define pointer _pointer
59 #if !defined(__ANDROID__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
61 #define property _property
65 #define Window X11Window
66 #define Cursor X11Cursor
68 #define Display X11Display
70 #define KeyCode X11KeyCode
71 #define Picture X11Picture
75 #include <X11/Xutil.h>
77 #include <X11/extensions/XShm.h>
80 #include <X11/extensions/Xrender.h>
81 #include <X11/extensions/shape.h>
99 #if defined(__APPLE__)
100 #include <OpenGl/gl.h>
103 #if defined(__WIN32__) || defined(__unix__) || defined(__APPLE__)
105 #if defined(__WIN32__)
106 //#define WIN32_LEAN_AND_MEAN
108 #define _WIN32_WINNT 0x0502
109 #define String Sting_
114 #if defined(__ANDROID__) || defined(__ODROID__)
115 #if defined(__ODROID__) && !defined(ES1_1)
120 #define property _property
123 #define Window X11Window
124 #define Cursor X11Cursor
126 #define Display X11Display
128 #define KeyCode X11KeyCode
129 #define Picture X11Picture
147 #elif defined(__EMSCRIPTEN__)
151 #define property _property
155 //#include <GLES/gl.h>
156 #include <GLES2/gl2.h>
158 #include <emscripten/emscripten.h>
159 #include <emscripten/html5.h>
172 #if defined(__unix__) || defined(__APPLE__)
174 #if !defined(__ANDROID__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
180 #define glLoadMatrix glLoadMatrixd
181 #define glMultMatrix glMultMatrixd
182 #define glGetMatrix glGetDoublev
183 #define glTranslate glTranslated
184 #define glScale glScaled
187 #define glVertex3v glVertex3dv
188 #define glNormal3v glNormal3dv
192 //#ifdef VERTEX_FORMAT_DOUBLE
194 #define glLoadMatrix glLoadMatrixd
195 #define glMultMatrix glMultMatrixd
196 #define glGetMatrix glGetDoublev
197 #define glVertex3v glVertex3dv
198 #define glNormal3v glNormal3dv
199 #define glTranslate glTranslated
200 #define glScale glScaled
201 //#define GL_VERTEX_FORMAT GL_DOUBLE
205 #define glLoadMatrix glLoadMatrixf
206 #define glMultMatrix glMultMatrixf
207 #define glGetMatrix glGetFloatv
208 #define glVertex3v glVertex3fv
209 #define glNormal3v glNormal3fv
210 #define glTranslate glTranslatef
211 #define glScale glScalef
212 //#define GL_VERTEX_FORMAT GL_FLOAT
217 #define GL_ARRAY_BUFFER_ARB 0x8892
218 #define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
219 #define GL_STATIC_DRAW_ARB 0x88E4
220 #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8
221 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA
223 #define GL_MULTISAMPLE_ARB 0x809D
225 #if defined(__WIN32__)
228 typedef void (APIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count);
229 typedef void (APIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void);
231 static PFNGLLOCKARRAYSEXTPROC glLockArraysEXT = null;
232 static PFNGLUNLOCKARRAYSEXTPROC glUnlockArraysEXT = null;
234 static PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB = null;
235 static PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = null;
236 static PFNWGLCREATEPBUFFERARBPROC wglCreatePbufferARB = null;
237 static PFNWGLGETPBUFFERDCARBPROC wglGetPbufferDCARB = null;
238 static PFNWGLQUERYPBUFFERARBPROC wglQueryPbufferARB = null;
239 static PFNWGLDESTROYPBUFFERARBPROC wglDestroyPbufferARB = null;
240 static PFNWGLRELEASEPBUFFERDCARBPROC wglReleasePbufferDCARB = null;
241 static PFNWGLBINDTEXIMAGEARBPROC wglBindTexImageARB = null;
242 static PFNWGLRELEASETEXIMAGEARBPROC wglReleaseTexImageARB = null;
243 static PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = null;
244 static PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = null;
248 #if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
250 GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count);
251 GLAPI void APIENTRY glUnlockArraysEXT (void);
255 #if defined(__ANDROID__) || defined(__ODROID__)
256 #define GL_FRAMEBUFFER GL_FRAMEBUFFER_OES
257 #define GL_RENDERBUFFER GL_RENDERBUFFER_OES
258 #define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_OES
259 #define GL_BGRA_EXT 0
262 #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
264 #define GL_POLYGON_STIPPLE 0xFFFF
265 #define GL_LINE_STIPPLE 0xFFFF
266 #define GL_LINE 0xFFFF
267 #define GL_FILL 0xFFFF
268 #define GL_ALL_ATTRIB_BITS 0xFFFF
269 #define GL_LIGHT_MODEL_LOCAL_VIEWER 0xFFFF
275 #define GL_QUAD_STRIP 0
276 //#define GL_DOUBLE 0
277 //#define GL_UNSIGNED_INT 0
280 //#define GL_LINE_STIPPLE 0
281 #define GL_UNPACK_ROW_LENGTH 0
282 #define GL_UNPACK_SKIP_PIXELS 0
283 #define GL_UNPACK_SKIP_ROWS 0
285 #define GL_PACK_ROW_LENGTH 0
286 #define GL_PACK_SKIP_ROWS 0
287 #define GL_PACK_SKIP_PIXELS 0
293 #if defined(__ANDROID__) || defined(__ODROID__)
294 #define glBindFramebuffer glBindFramebufferOES
295 #define glBindRenderbuffer glBindRenderbufferOES
296 #define glFramebufferTexture2D glFramebufferTexture2DOES
297 #define glGenFramebuffers glGenFramebuffersOES
298 #define glGenRenderbuffers glGenRenderbuffersOES
299 #define glDeleteFramebuffers glDeleteFramebuffersOES
300 #define glDeleteRenderbuffers glDeleteRenderbuffersOES
303 #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
304 #define GL_INT 0x1404
305 #define GL_UNSIGNED_INT 0x1405
306 #define GL_DOUBLE 0x140A
310 #if defined(ES1_1) || defined(ES2) || defined(SHADERS)
341 #undef glLoadIdentity
346 #undef glColorMaterial
349 #define glRecti glimtkRecti
350 #define glBegin glimtkBegin
351 #define glTexCoord2i glimtkTexCoord2i
352 #define glVertex2i glimtkVertex2i
353 #define glTexCoord2d glimtkTexCoord2d
354 #define glVertex2d glimtkVertex2d
355 #define glTexCoord2f glimtkTexCoord2f
356 #define glVertex2f glimtkVertex2f
357 #define glEnd glimtkEnd
358 #define glColor3f glimtkColor3f
359 #define glColor4ub glimtkColor4ub
360 #define glColor4fv glimtkColor4fv
361 #define glNormal3fv glimtkNormal3fv
362 #define glNormal3f glimtkNormal3f
363 #define glTexCoord2fv glimtkTexCoord2fv
364 #define glVertex3d glimtkVertex3d
365 #define glVertex3dv glimtkVertex3dv
366 #define glVertex3f glimtkVertex3f
367 #define glVertex3fv glimtkVertex3fv
369 #define glLoadMatrixd glmsLoadMatrixd
370 #define glMultMatrixd glmsMultMatrixd
371 #define glFrustum glmsFrustum
372 #define glOrtho glmsOrtho
373 #define glScaled glmsScaled
374 #define glScalef glmsScaled
375 #define glTranslated glmsTranslated
376 #define glRotated glmsRotated
377 #define glMatrixMode glmsMatrixMode
378 #define glLoadIdentity glmsLoadIdentity
379 #define glPushMatrix glmsPushMatrix
380 #define glPopMatrix glmsPopMatrix
382 #define glLineStipple glesLineStipple
383 #define glColorMaterial glesColorMaterial
384 #define glLightModeli glesLightModeli
388 public void glesColorMaterial(int a, int b)
390 PrintLn("glColorMaterial stub");
393 static GLuint stippleTexture;
394 #if defined(ES1_1) || defined(ES2) || defined(SHADERS)
395 static bool stippleEnabled;
398 public void glesLineStipple( int i, unsigned short j )
402 for(x = 0; x < 16; x++)
404 bool v = (j & (1 << x)) != 0;
405 texture[x] = v ? 0xFFFFFFFF : 0;
408 glGenTextures(1, &stippleTexture);
409 glBindTexture(GL_TEXTURE_2D, stippleTexture);
410 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
412 // TOOD: Special shading code for stippling?
413 GLSetupTexturing(true);
414 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
415 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
416 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
417 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
418 glMatrixMode(GL_TEXTURE);
420 //glTranslated(1.0/backAttrib->texW/2.0f, 1.0/backAttrib->texH/2.0f, 0.0f);
421 glScaled(i/16.0, 1, 1.0f);
422 glTranslated(0.5, 0.5, 0);
423 glMatrixMode(MatrixMode::projection);
426 public void glesLightModeli( unsigned int pname, int param )
428 #if !defined(SHADERS)
429 if(pname == GL_LIGHT_MODEL_TWO_SIDE)
430 glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, param);
434 #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
435 void glClearDepth( double depth ) { glClearDepthf((float)depth); }
438 #if defined(__ANDROID__) || defined(__ODROID__)
439 void glFogi( unsigned int pname, int param ) { }
440 void glPolygonMode( unsigned int i, unsigned int j ) { }
443 // *** Picking won't be supported for now ***
444 void glPushName( unsigned int i ) { }
445 void glLoadName( unsigned int i ) { }
448 // Probably replace by regular glBlendFunc ...
449 void glBlendFuncSeparate(int a, int b, int c, int d)
454 // For direct pixel blitting...
455 void glRasterPos2d(double a, double b) { }
456 void glPixelZoom(float a, float b) { }
457 void glDrawPixels(int a, int b, int c, int d, void * e) { }
461 #if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
462 static int primitiveTypes[RenderPrimitiveType] =
464 GL_POINTS, GL_LINES, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN,
465 #if defined(SHADERS) || defined(ES1_1) || defined(ES2)
466 GL_TRIANGLE_FAN, // NOTE: This will only work for single quads
470 GLIMTKMode::quadStrip,
475 public void GLSetupTexturing(bool enable)
478 shader_texturing(enable);
480 (enable ? glEnable : glDisable)(GL_TEXTURE_2D);
484 public void GLSetupFog(bool enable)
489 (enable ? glEnable : glDisable)(GL_FOG);
493 public void GLSetupLighting(bool enable)
496 shader_lighting(enable);
498 (enable ? glEnable : glDisable)(GL_LIGHTING);
502 // Non OpenGL ES friendly stuff
504 #if defined(ES1_1) || defined(ES2)
506 //#undef GL_UNSIGNED_INT
512 #undef GL_POLYGON_STIPPLE
513 #undef GL_LINE_STIPPLE
516 #undef GL_ALL_ATTRIB_BITS
517 #undef GL_LIGHT_MODEL_LOCAL_VIEWER
521 static int displayWidth, displayHeight;
523 #define GL_CLAMP_TO_EDGE 0x812F
525 static bool vboAvailable;
527 static bool useSingleGLContext = false;
528 class OGLDisplay : struct
530 #if defined(__WIN32__)
541 byte * pboMemory1, * pboMemory2;
543 #elif !defined(__ANDROID__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
544 GLXContext glContext;
547 XShmSegmentInfo shminfo;
549 XShmSegmentInfo shminfoShape;
554 X11Picture windowPicture;
555 X11Picture pixmapPicture;
557 X11Picture shapePicture;
560 ColorAlpha * flippingBuffer;
561 int flipBufH, flipBufW;
567 static void APIENTRY openglCallbackFunction(GLenum source,
572 const GLchar* message,
573 const void* userParam)
575 PrintLn("---------------------opengl-callback-start------------");
576 PrintLn("message: ", message);
580 case GL_DEBUG_TYPE_ERROR: PrintLn("ERROR"); break;
581 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: PrintLn("DEPRECATED_BEHAVIOR"); break;
582 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: PrintLn("UNDEFINED_BEHAVIOR"); break;
583 case GL_DEBUG_TYPE_PORTABILITY: PrintLn("PORTABILITY"); break;
584 case GL_DEBUG_TYPE_PERFORMANCE: PrintLn("PERFORMANCE"); break;
585 case GL_DEBUG_TYPE_OTHER: PrintLn("OTHER"); break;
592 case GL_DEBUG_SEVERITY_LOW: PrintLn("LOW"); break;
593 case GL_DEBUG_SEVERITY_MEDIUM: PrintLn("MEDIUM"); break;
594 case GL_DEBUG_SEVERITY_HIGH: PrintLn("HIGH"); break;
596 PrintLn("---------------------opengl-callback-end--------------");
600 class OGLSystem : struct
605 #if defined(__WIN32__)
606 PIXELFORMATDESCRIPTOR pfd;
611 #elif defined(__EMSCRIPTEN__)
612 EMSCRIPTEN_WEBGL_CONTEXT_HANDLE glc;
613 #elif !defined(__ANDROID__) && !defined(__ODROID__)
614 XVisualInfo * visualInfo;
615 GLXContext glContext;
616 GLXDrawable glxDrawable;
620 class OGLSurface : struct
628 float foreground[4], background[4], bitmapMult[4];
631 class OGLMesh : struct
640 class OGLIndices : struct
650 #if !defined(__ANDROID__) && !defined(__EMSCRIPTEN__) && !defined(__ODROID__)
652 static void setupDebugging()
654 if(glDebugMessageCallback)
656 GLuint unusedIds = 0;
658 glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
660 glDebugMessageCallback(openglCallbackFunction, null);
661 glDebugMessageControl(GL_DONT_CARE,
673 #if defined(__WIN32__)
674 static HGLRC winCreateContext(HDC hdc)
678 if(wglCreateContextAttribsARB)
682 WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
683 WGL_CONTEXT_MINOR_VERSION_ARB, 4,
684 WGL_CONTEXT_FLAGS_ARB, /*WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB | */WGL_CONTEXT_DEBUG_BIT_ARB,
685 WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB /*WGL_CONTEXT_CORE_PROFILE_BIT_ARB*/,
688 result = wglCreateContextAttribsARB(hdc, null, attribs);
694 result = wglCreateContextAttribsARB(hdc, null, attribs);
699 result = wglCreateContext(hdc);
704 class OpenGLDisplayDriver : DisplayDriver
706 class_property(name) = "OpenGL";
708 bool LockSystem(DisplaySystem displaySystem)
710 #if defined(__EMSCRIPTEN__)
711 OGLSystem oglSystem = displaySystem.driverData;
712 emscripten_webgl_make_context_current(oglSystem.glc);
713 #elif !defined(__ANDROID__) && !defined(__ODROID__)
714 OGLSystem oglSystem = displaySystem.driverData;
715 if(useSingleGLContext) return true;
716 #if defined(__WIN32__)
717 wglMakeCurrent(oglSystem.hdc, oglSystem.glrc);
718 #elif defined(__unix__) || defined(__APPLE__)
719 //if(previous) return true;
720 // printf("Making SYSTEM current\n");
721 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)oglSystem.glxDrawable, oglSystem.glContext);
722 //previous = oglSystem.glContext;
725 GLABBindBuffer(GL_ARRAY_BUFFER, 0);
726 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
730 void UnlockSystem(DisplaySystem displaySystem)
732 if(useSingleGLContext) return;
733 #if defined(__WIN32__)
734 wglMakeCurrent(null, null);
735 #elif defined(__unix__) || defined(__APPLE__)
736 // printf("Making NULL current\n");
737 #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
739 glXMakeCurrent(xGlobalDisplay, None, null);
745 bool Lock(Display display)
747 #if !defined(__ANDROID__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
748 OGLDisplay oglDisplay = display.driverData;
749 if(useSingleGLContext) return true;
750 #if defined(__WIN32__)
751 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
752 #elif defined(__unix__) || defined(__APPLE__)
753 // if(previous) glXMakeCurrent(xGlobalDisplay, None, null);
754 // printf(" Making DISPLAY current\n");
755 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
758 GLABBindBuffer(GL_ARRAY_BUFFER, 0);
759 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
763 void Unlock(Display display)
765 if(useSingleGLContext) return;
766 //printf(" Making NULL current\n");
767 //glXMakeCurrent(xGlobalDisplay, None, null);
769 LockSystem(display.displaySystem);
772 void DestroyDisplay(Display display)
774 OGLDisplay oglDisplay = display.driverData;
778 #if defined(__WIN32__)
779 wglMakeCurrent( null, null );
782 wglDeleteContext(oglDisplay.glrc);
784 if(oglDisplay.hdc && oglDisplay.pBuffer)
785 wglReleasePbufferDCARB(oglDisplay.pBuffer, oglDisplay.hdc);
787 if(oglDisplay.pBuffer)
788 wglDestroyPbufferARB(oglDisplay.pBuffer);
791 ReleaseDC(display.window, oglDisplay.hdc);
793 if(oglDisplay.memDC) DeleteDC(oglDisplay.memDC);
794 if(oglDisplay.memBitmap) DeleteObject(oglDisplay.memBitmap);
796 #elif defined(__unix__) || defined(__APPLE__)
797 #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
799 if(oglDisplay.shapePixmap)
800 XFreePixmap(xGlobalDisplay, oglDisplay.shapePixmap);
801 if(oglDisplay.pixmap)
802 XFreePixmap(xGlobalDisplay, oglDisplay.pixmap);
805 if(oglDisplay.shminfoShape.shmid != -1)
807 XShmDetach(xGlobalDisplay, &oglDisplay.shminfo);
808 if(oglDisplay.shminfo.shmaddr != (void *)-1)
809 shmdt(oglDisplay.shminfo.shmaddr);
810 shmctl(oglDisplay.shminfo.shmid, IPC_RMID, 0);
813 if(oglDisplay.shapeImage)
815 if(oglDisplay.shminfoShape.shmid != -1)
817 XShmDetach(xGlobalDisplay, &oglDisplay.shminfoShape);
818 if(oglDisplay.shminfoShape.shmaddr != (void *)-1)
819 shmdt(oglDisplay.shminfoShape.shmaddr);
820 shmctl(oglDisplay.shminfoShape.shmid, IPC_RMID, 0);
822 XDestroyImage(oglDisplay.shapeImage);
823 oglDisplay.shapeImage = None;
826 glXMakeCurrent(xGlobalDisplay, None, null);
828 if(oglDisplay.glContext)
829 glXDestroyContext(xGlobalDisplay, oglDisplay.glContext);
832 delete oglDisplay.flippingBuffer;
834 display.driverData = null;
838 void ::CheckExtensions(OGLSystem oglSystem)
840 const char * extensions = (const char *)glGetString(GL_EXTENSIONS);
842 printf("extensions: %s\n", extensions);
845 oglSystem.pow2textures = (extensions && strstr(extensions, "GL_ARB_texture_non_power_of_two")) ? false : true;
846 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &oglSystem.maxTextureSize);
849 bool CreateDisplaySystem(DisplaySystem displaySystem)
852 OGLSystem oglSystem = displaySystem.driverData = OGLSystem { };
855 PrintLn("OpenGL driver's CreateDisplaySystem()");
859 oglSystem.hwnd = CreateWindow("static", null, 0,0,0,0,0,null,null,null,null);
861 oglSystem.hdc = GetDC(oglSystem.hwnd);
865 oglSystem.pfd.nSize = (short)sizeof(oglSystem.pfd);
866 oglSystem.pfd.nVersion = 1;
867 oglSystem.pfd.dwFlags = PFD_DRAW_TO_WINDOW /*PFD_DRAW_TO_BITMAP*/ | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
868 oglSystem.pfd.iPixelType = PFD_TYPE_RGBA;
869 oglSystem.pfd.cColorBits = 24;
870 oglSystem.pfd.cAlphaBits = 8;
871 oglSystem.pfd.cDepthBits = 24;
872 oglSystem.pfd.iLayerType = PFD_MAIN_PLANE;
874 oglSystem.format = ChoosePixelFormat(oglSystem.hdc, &oglSystem.pfd);
875 DescribePixelFormat(oglSystem.hdc, oglSystem.format, sizeof(oglSystem.pfd), &oglSystem.pfd);
877 if(oglSystem.pfd.cColorBits > 8)
879 SetPixelFormat(oglSystem.hdc, oglSystem.format, &oglSystem.pfd);
880 oglSystem.glrc = wglCreateContext(oglSystem.hdc);
883 wglMakeCurrent(oglSystem.hdc, oglSystem.glrc);
885 wglChoosePixelFormatARB = (void *) wglGetProcAddress("wglChoosePixelFormatARB");
886 wglGetExtensionsStringARB = (void *)wglGetProcAddress("wglGetExtensionsStringARB");
887 wglCreatePbufferARB = (void *)wglGetProcAddress("wglCreatePbufferARB");
888 wglGetPbufferDCARB = (void *)wglGetProcAddress("wglGetPbufferDCARB");
889 wglQueryPbufferARB = (void *)wglGetProcAddress("wglQueryPbufferARB");
890 wglDestroyPbufferARB = (void *)wglGetProcAddress("wglDestroyPbufferARB");
891 wglReleasePbufferDCARB = (void *)wglGetProcAddress("wglReleasePbufferDCARB");
892 wglBindTexImageARB = (void *)wglGetProcAddress("wglBindTexImageARB");
893 wglReleaseTexImageARB = (void *)wglGetProcAddress("wglReleaseTexImageARB");
894 wglSwapIntervalEXT = (void *)wglGetProcAddress("wglSwapIntervalEXT");
895 wglCreateContextAttribsARB = (void *)wglGetProcAddress("wglCreateContextAttribsARB");
897 glLockArraysEXT = (void *) wglGetProcAddress("glLockArraysEXT" );
898 glUnlockArraysEXT = (void *) wglGetProcAddress("glUnlockArraysEXT");
900 // eSystem_LoggingMode(LOG_MSGBOX, null);
902 if(wglChoosePixelFormatARB)
907 float fAttributes[] = {0,0};
910 WGL_DRAW_TO_WINDOW_ARB,GL_TRUE,
911 WGL_SUPPORT_OPENGL_ARB,GL_TRUE,
912 WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB,
913 WGL_COLOR_BITS_ARB,24,
914 WGL_ALPHA_BITS_ARB,8,
915 WGL_DEPTH_BITS_ARB,16,
916 WGL_STENCIL_BITS_ARB,0,
917 WGL_DOUBLE_BUFFER_ARB,GL_TRUE,
918 WGL_SAMPLE_BUFFERS_ARB,GL_TRUE,
919 WGL_SAMPLES_ARB, 4, // Check For 4x Multisampling
923 //Log("Found wglChoosePixelFormatARB\n");
925 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
926 if(!valid || !numFormats)
928 //Log("Can't find 4x multi sampling\n");
930 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
931 if(!valid || !numFormats)
933 // Log("Can't find 2x multi sampling\n");
936 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
939 if(valid && numFormats)
941 oglSystem.format = pixelFormat;
942 wglMakeCurrent(null, null);
943 wglDeleteContext(oglSystem.glrc);
945 // *** DescribePixelFormat does not support WGL pixel formats! ***
946 //DescribePixelFormat(oglSystem.hdc, oglSystem.format, sizeof(oglSystem.pfd), &oglSystem.pfd);
947 SetPixelFormat(oglSystem.hdc, oglSystem.format, &oglSystem.pfd);
948 //Log("Successfully set pixel format\n");
951 PrintLn("winCreateContext()");
953 oglSystem.glrc = winCreateContext(oglSystem.hdc);
955 PrintLn("wglMakeCurrent()");
957 wglMakeCurrent(oglSystem.hdc, oglSystem.glrc);
961 eSystem_Logf("Can't find wglChoosePixelFormatARB\n");*/
965 wglMakeCurrent(null, null);
967 //eSystem_DumpErrors(true);
971 #elif defined(__unix__) || defined(__APPLE__)
973 #if defined(__ANDROID__) || defined(__ODROID__)
974 #if defined(__ANDROID__)
975 egl_init_display(guiApp.desktop.windowHandle);
976 #elif defined(__ODROID__)
977 egl_init_display((uint)displaySystem.window);
978 CheckExtensions(oglSystem);
981 // TODO: Clean this up? Needed here?
982 glEnableClientState(GL_VERTEX_ARRAY);
984 // Initialize GL state.
985 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
986 glEnable(GL_CULL_FACE);
987 glShadeModel(GL_SMOOTH);
988 glDisable(GL_DEPTH_TEST);
990 glDisable(GL_CULL_FACE);
991 glDisable(GL_DEPTH_TEST);
993 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
996 matrixStack[0][0].Identity();
997 matrixStack[1][0].Identity();
998 matrixStack[2][0].Identity();
1000 glmsMatrixMode(GL_MODELVIEW);
1001 glScaled(1.0, 1.0, -1.0);
1002 glmsMatrixMode(GL_PROJECTION);
1003 glShadeModel(GL_FLAT);
1005 glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
1006 glFogi(GL_FOG_MODE, GL_EXP);
1007 glFogf(GL_FOG_DENSITY, 0);
1008 glEnable(GL_NORMALIZE);
1009 glDepthFunc(GL_LESS);
1011 glDisable(GL_MULTISAMPLE_ARB);
1013 glViewport(0,0,eglWidth,eglHeight);
1015 glOrtho(0,eglWidth,eglHeight,0,0.0,1.0);
1017 glabCurArrayBuffer = 0;
1018 glabCurElementBuffer = 0;
1021 #elif defined(__EMSCRIPTEN__)
1023 EmscriptenWebGLContextAttributes attribs = { 0 };
1025 attribs.antialias = 1;
1032 EM_BOOL premultipliedAlpha;
1033 EM_BOOL preserveDrawingBuffer;
1034 EM_BOOL preferLowPowerToHighPerformance;
1035 EM_BOOL failIfMajorPerformanceCaveat;
1038 EM_BOOL enableExtensionsByDefault;
1041 emscripten_webgl_init_context_attributes(&attribs);
1042 oglSystem.pow2textures = true;
1043 oglSystem.maxTextureSize = 16384;
1044 oglSystem.glc = emscripten_webgl_create_context("canvas", &attribs);
1045 if(emscripten_webgl_make_context_current(oglSystem.glc) == EMSCRIPTEN_RESULT_SUCCESS)
1048 /*glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1049 glEnable(GL_BLEND);*/
1053 X11Window root = RootWindow( xGlobalDisplay, DefaultScreen( xGlobalDisplay ) );
1054 XSetWindowAttributes attr;
1059 #ifndef ECERE_MINIGLX
1060 GLX_USE_GL, GLX_DEPTH_SIZE, 1,
1063 GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1,
1067 oglSystem.visualInfo = glXChooseVisual( xGlobalDisplay, DefaultScreen( xGlobalDisplay ), attrList );
1068 attr.background_pixel = 0;
1069 attr.border_pixel = 0;
1070 attr.colormap = XCreateColormap( xGlobalDisplay, root, oglSystem.visualInfo->visual, AllocNone);
1071 attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
1072 mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
1074 oglSystem.glxDrawable = XCreateWindow( xGlobalDisplay, root, 0, 0, 1, 1, 0, oglSystem.visualInfo->depth, InputOutput,
1075 oglSystem.visualInfo->visual, mask, &attr );
1077 if(oglSystem.visualInfo)
1079 oglSystem.glContext = glXCreateContext(xGlobalDisplay, oglSystem.visualInfo, null, True);
1080 if(oglSystem.glContext)
1082 glXMakeCurrent(xGlobalDisplay, oglSystem.glxDrawable, oglSystem.glContext);
1084 // CheckExtensions(oglSystem);
1085 glXMakeCurrent(xGlobalDisplay, None, null);
1092 displaySystem.flags.alpha = true;
1093 displaySystem.flags.flipping = true;
1094 displaySystem.pixelFormat = pixelFormat888;
1098 void DestroyDisplaySystem(DisplaySystem displaySystem)
1100 OGLSystem oglSystem = displaySystem.driverData;
1103 glDeleteTextures(1, &stippleTexture);
1109 #if defined(__WIN32__)
1110 wglMakeCurrent( null, null );
1113 wglDeleteContext(oglSystem.glrc);
1116 ReleaseDC(oglSystem.hwnd, oglSystem.hdc);
1117 DestroyWindow(oglSystem.hwnd);
1119 #elif defined(__unix__) || defined(__APPLE__)
1120 #if defined(__ANDROID__) || defined(__ODROID__)
1122 #elif defined(__EMSCRIPTEN__)
1123 emscripten_webgl_destroy_context(oglSystem.glc);
1125 if(oglSystem.visualInfo)
1127 #ifdef ECERE_MINIGLX
1128 __miniglx_XFree(oglSystem.visualInfo);
1130 XFree(oglSystem.visualInfo);
1134 if(oglSystem.glxDrawable)
1136 XDestroyWindow(xGlobalDisplay, oglSystem.glxDrawable);
1137 oglSystem.glxDrawable = 0;
1144 static bool ::initialDisplaySetup(Display display)
1148 loadShaders("<:ecere>shaders/fixed.vertex", "<:ecere>shaders/fixed.frag");
1150 glEnableClientState(GL_VERTEX_ARRAY);
1152 GLABBindBuffer(GL_ARRAY_BUFFER, 0);
1153 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
1155 #if defined(__WIN32__)
1156 if(glBlendFuncSeparate)
1157 glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1159 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1161 glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1165 glMatrixMode(MatrixMode::modelView);
1166 glLoadIdentity(); // For setting up GLES stack
1167 glScaled(1.0, 1.0, -1.0);
1168 // glTranslatef(0.375f, 0.375f, 0.0f);
1169 // glTranslatef(-0.625f, -0.625f, 0.0f);
1170 glMatrixMode(MatrixMode::projection);
1171 #if !defined(EM_MODE) && !defined(SHADERS)
1172 glShadeModel(GL_FLAT);
1174 // #define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
1176 // glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
1178 glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
1179 glFogi(GL_FOG_MODE, GL_EXP);
1180 glFogf(GL_FOG_DENSITY, 0);
1181 glEnable(GL_NORMALIZE);
1183 glDepthFunc(GL_LESS);
1185 glDisable(GL_MULTISAMPLE_ARB);
1186 #if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
1187 display.ambient = Color { 50,50,50 };
1192 bool CreateDisplay(Display display)
1194 bool result = false;
1195 OGLDisplay oglDisplay = display.driverData;
1196 #if !defined(__ANDROID__) && !defined(__ODROID__)
1197 OGLSystem oglSystem = display.displaySystem.driverData;
1201 oglDisplay = display.driverData = OGLDisplay { };
1202 //printf("Inside CreateDisplay\n");
1204 #if defined(__WIN32__) || defined(USEPBUFFER)
1205 if(!display.alphaBlend)
1208 #if defined(__WIN32__)
1209 oglDisplay.hdc = GetDC(display.window);
1210 SetPixelFormat(oglDisplay.hdc, oglSystem.format, &oglSystem.pfd);
1211 if((oglDisplay.glrc = winCreateContext(oglDisplay.hdc)))
1213 wglShareLists(oglSystem.glrc, oglDisplay.glrc);
1214 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
1218 ReleaseDC(display.window, oglDisplay.hdc);
1219 #elif defined(__unix__) || defined(__APPLE__)
1220 # if defined(__ANDROID__) || defined(__EMSCRIPTEN__) || defined(__ODROID__)
1223 XVisualInfo * visualInfo = ((XWindowData)display.windowDriverData).visual;
1225 #if defined(__APPLE__)
1226 XVisualInfo template = { 0 };
1227 XWindowAttributes winAttr;
1229 XGetWindowAttributes(xGlobalDisplay, (X11Window)display.window, &winAttr);
1230 template.visualid = XVisualIDFromVisual(winAttr.visual);
1231 visualInfo = XGetVisualInfo(xGlobalDisplay, VisualIDMask, &template, &n);
1233 printf("XGetVisualInfo visual ID = %d\n", template.visualid);
1234 printf("visualInfo visual ID = %d\n", visualInfo->visualid);
1235 printf("oglSystem.visualInfo visual ID = %d\n", oglSystem.visualInfo->visualid);
1236 printf("((XWindowData)display.windowDriverData).visual visual ID = %d\n", ((XWindowData)display.windowDriverData).visual->visualid);
1238 // visualInfo = oglSystem.visualInfo;
1243 //printf("visualInfo is not null\n");
1244 // printf("Creating Display Context, sharing with %x!\n", oglSystem.glContext);
1245 oglDisplay.glContext = glXCreateContext(xGlobalDisplay, visualInfo, oglSystem.glContext, True);
1246 //XFree(visualInfo);
1249 // oglDisplay.glContext = glXCreateContext(xGlobalDisplay, oglSystem.visualInfo, oglSystem.glContext, True);
1250 if(oglDisplay.glContext)
1252 //printf("CreateDisplay Got a Context\n");
1253 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
1259 #if defined(__WIN32__) || defined(USEPBUFFER)
1263 wglMakeCurrent(oglSystem.hdc, oglSystem.glrc);
1268 #if !defined(__ANDROID__) && !defined(__EMSCRIPTEN__) && !defined(__ODROID__)
1271 PrintLn("Calling ogl_LoadFunctions() in CreateDisplay()");
1273 if(ogl_LoadFunctions() == ogl_LOAD_FAILED)
1274 PrintLn("ogl_LoadFunctions() failed!");
1277 PrintLn("CheckExtensions()");
1279 CheckExtensions(oglSystem);
1280 vboAvailable = glBindBuffer != null;
1283 PrintLn("vboAvailable is: ", vboAvailable);
1292 #if defined(__EMSCRIPTEN__)
1293 emscripten_webgl_make_context_current(oglSystem.glc);
1296 initialDisplaySetup(display);
1299 if(!useSingleGLContext)
1301 #if defined(__WIN32__)
1302 wglMakeCurrent(null, null);
1303 #elif defined(__unix__) || defined(__APPLE__)
1304 #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
1307 glXMakeCurrent(xGlobalDisplay, None, null);
1313 #if defined(__ANDROID__) || defined(__EMSCRIPTEN__) || defined(__ODROID__)
1321 bool DisplaySize(Display display, int width, int height)
1323 OGLDisplay oglDisplay = display.driverData;
1325 bool result = false;
1327 //printf("Inside DisplaySize\n");
1328 #if defined(__WIN32__) || defined(USEPBUFFER)
1329 OGLSystem oglSystem = display.displaySystem.driverData;
1330 if(display.alphaBlend)
1332 #if defined(__WIN32__)
1333 const int attributes[]=
1335 /*WGL_TEXTURE_FORMAT_ARB, WGL_TEXTURE_RGBA_ARB,
1336 WGL_TEXTURE_TARGET_ARB, WGL_TEXTURE_2D_ARB, */0
1338 int pixelFormat = 0;
1339 if(wglChoosePixelFormatARB)
1343 float fAttributes[] = {0,0};
1346 //WGL_DRAW_TO_BITMAP_ARB, GL_TRUE,
1347 WGL_DRAW_TO_PBUFFER_ARB,GL_TRUE,
1348 WGL_SUPPORT_OPENGL_ARB,GL_TRUE,
1349 WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB,
1350 WGL_COLOR_BITS_ARB,24,
1351 WGL_ALPHA_BITS_ARB,8,
1352 WGL_DEPTH_BITS_ARB,16,
1353 WGL_STENCIL_BITS_ARB,0,
1354 WGL_DOUBLE_BUFFER_ARB,GL_FALSE,
1355 WGL_SAMPLE_BUFFERS_ARB,GL_TRUE,
1356 WGL_SAMPLES_ARB, 4, // Check For 4x Multisampling
1360 //Log("Found wglChoosePixelFormatARB\n");
1362 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1363 if(!valid || !numFormats)
1365 //Log("Can't find 4x multi sampling\n");
1366 iAttributes[19] = 2;
1367 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1368 if(!valid || !numFormats)
1370 // Log("Can't find 2x multi sampling\n");
1371 iAttributes[16] = 0;
1372 iAttributes[17] = 0;
1373 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1374 if(!valid || !numFormats)
1378 WGL_DRAW_TO_PBUFFER_ARB,GL_TRUE,
1379 //WGL_DRAW_TO_BITMAP_ARB,GL_TRUE,
1380 WGL_SUPPORT_OPENGL_ARB,GL_TRUE,
1381 WGL_COLOR_BITS_ARB,24,
1382 WGL_ALPHA_BITS_ARB,8,
1383 WGL_DEPTH_BITS_ARB,16,
1386 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1390 if(valid && numFormats)
1392 wglMakeCurrent(null, null);
1396 wglMakeCurrent( null, null );
1397 wglMakeCurrent( oglDisplay.hdc, oglDisplay.glrc );
1398 if(oglDisplay.hdc && oglDisplay.pBuffer)
1399 wglReleasePbufferDCARB(oglDisplay.pBuffer, oglDisplay.hdc);
1401 wglDestroyPbufferARB(oglDisplay.pBuffer);
1403 if(!useSingleGLContext)
1404 wglMakeCurrent( null, null );
1407 wglDeleteContext(oglDisplay.glrc);
1409 oglDisplay.pBuffer = wglCreatePbufferARB(oglSystem.hdc, pixelFormat, width, height, attributes);
1410 oglDisplay.hdc = wglGetPbufferDCARB(oglDisplay.pBuffer);
1411 if((oglDisplay.glrc = winCreateContext(oglDisplay.hdc)))
1414 HDC hdc = GetDC(display.window);
1416 wglShareLists(oglSystem.glrc, oglDisplay.glrc);
1417 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
1419 //wglQueryPbufferARB(pBuffer, WGL_PBUFFER_WIDTH_ARB, &width);
1420 //wglQueryPbufferARB(pBuffer, WGL_PBUFFER_HEIGHT_ARB, &height);
1422 // glDeleteBuffersARB(2, oglDisplay.imageBuffers);
1424 if((info = (BITMAPINFO *)new0 byte[sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256]))
1428 if(oglDisplay.memDC) DeleteDC(oglDisplay.memDC);
1429 oglDisplay.memDC = CreateCompatibleDC(hdc);
1430 SetMapMode(oglDisplay.memDC, MM_TEXT);
1431 info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
1432 info->bmiHeader.biPlanes = 1;
1433 info->bmiHeader.biCompression = BI_RGB;
1434 info->bmiHeader.biBitCount = 32; //(uint16)GetDeviceCaps(hdc, BITSPIXEL);
1435 info->bmiHeader.biWidth = width;
1436 info->bmiHeader.biHeight = height;
1437 newBitmap = CreateDIBSection(hdc, info, DIB_RGB_COLORS, &oglDisplay.picture, null, 0);
1440 SelectObject(oglDisplay.memDC, newBitmap);
1441 if(oglDisplay.memBitmap) DeleteObject(oglDisplay.memBitmap);
1444 PIXELFORMATDESCRIPTOR pfd = { 0 };
1445 pfd.nSize = (short)sizeof(pfd);
1447 pfd.dwFlags = PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL;
1448 pfd.iPixelType = PFD_TYPE_RGBA;
1449 pfd.cColorBits = 32;
1450 //pfd.cAlphaBits = 8;
1451 pfd.cDepthBits = 24;
1452 pfd.iLayerType = PFD_MAIN_PLANE;
1454 oglDisplay.hdc = oglDisplay.memDC;
1456 pixelFormat = ChoosePixelFormat(oglSystem.hdc, &pfd);
1457 DescribePixelFormat(oglDisplay.hdc, pixelFormat, sizeof(pfd), &pfd);
1458 SetPixelFormat(oglDisplay.hdc, pixelFormat, &pfd);
1460 oglDisplay.glrc = wglCreateContext(oglDisplay.hdc);
1461 wglShareLists(oglSystem.glrc, oglDisplay.glrc);
1462 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
1467 const int imageSize = width * height * 4;
1469 glGenBuffersARB(2, oglDisplay.imageBuffers);
1471 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[0]);
1472 glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, imageSize, null, GL_STREAM_READ);
1473 // glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[1]);
1474 // glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, imageSize / 2, null, GL_STREAM_READ);
1477 oglDisplay.memBitmap = newBitmap;
1478 oglDisplay.stride = width;
1484 ReleaseDC(display.window, hdc);
1486 #elif defined(__unix__) || defined(__APPLE__)
1487 #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
1492 GLX_DOUBLEBUFFER, True,
1498 GLX_STENCIL_SIZE, 1,
1499 //GLX_DEPTH_SIZE, 24,
1500 GLX_RENDER_TYPE, GLX_RGBA_BIT,
1501 GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT | GLX_WINDOW_BIT,
1507 GLX_PBUFFER_WIDTH, width,
1508 GLX_PBUFFER_HEIGHT, height,
1509 GLX_LARGEST_PBUFFER, False,
1513 // choose a pixel format that meets our minimum requirements
1516 GLXFBConfig *config = glXChooseFBConfig(xGlobalDisplay, DefaultScreen(xGlobalDisplay), attrib, &count);
1519 if(oglDisplay.pixmap)
1521 XFreePixmap(xGlobalDisplay, oglDisplay.pixmap);
1522 oglDisplay.pixmap = None;
1524 if(oglDisplay.shapePixmap)
1526 XFreePixmap(xGlobalDisplay, oglDisplay.shapePixmap);
1527 oglDisplay.shapePixmap = None;
1530 // Free Shared Memory Pixmap
1531 if(oglDisplay.image)
1533 if(oglDisplay.shminfoShape.shmid != -1)
1535 XShmDetach(xGlobalDisplay, &oglDisplay.shminfo);
1536 if(oglDisplay.shminfo.shmaddr != (void *)-1)
1537 shmdt(oglDisplay.shminfo.shmaddr);
1538 shmctl(oglDisplay.shminfo.shmid, IPC_RMID, 0);
1540 XDestroyImage(oglDisplay.image);
1541 oglDisplay.image = None;
1543 if(oglDisplay.shapeImage)
1545 if(oglDisplay.shminfoShape.shmid != -1)
1547 XShmDetach(xGlobalDisplay, &oglDisplay.shminfoShape);
1548 if(oglDisplay.shminfoShape.shmaddr != (void *)-1)
1549 shmdt(oglDisplay.shminfoShape.shmaddr);
1550 shmctl(oglDisplay.shminfoShape.shmid, IPC_RMID, 0);
1552 XDestroyImage(oglDisplay.shapeImage);
1553 oglDisplay.shapeImage = None;
1556 if(oglDisplay.windowPicture)
1557 XRenderFreePicture(xGlobalDisplay, oglDisplay.windowPicture);
1558 if(oglDisplay.pixmapPicture)
1559 XRenderFreePicture(xGlobalDisplay, oglDisplay.pixmapPicture);
1561 if(oglDisplay.pixmap)
1562 XFreePixmap(xGlobalDisplay, oglDisplay.pixmap);
1564 if(oglDisplay.glContext)
1565 glXDestroyContext(xGlobalDisplay, oglDisplay.glContext);
1566 if(oglDisplay.pBuffer)
1567 glXDestroyPbuffer(xGlobalDisplay, oglDisplay.pBuffer);
1569 oglDisplay.pBuffer = glXCreatePbuffer(xGlobalDisplay, config[0], PBattrib);
1570 if(oglDisplay.pBuffer)
1572 oglDisplay.glContext = glXCreateNewContext(xGlobalDisplay, config[0], GLX_RGBA_TYPE, oglSystem.glContext, True);
1573 if(oglDisplay.glContext)
1575 glXMakeCurrent(xGlobalDisplay, None, null);
1576 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
1578 // Initialize Shared Memory Pixmap
1579 oglDisplay.image = XShmCreateImage(xGlobalDisplay, DefaultVisual(xGlobalDisplay, DefaultScreen(xGlobalDisplay)), 32,
1580 ZPixmap, null, &oglDisplay.shminfo, width, height);
1581 if(oglDisplay.image)
1583 oglDisplay.shminfo.shmid = shmget(IPC_PRIVATE,
1584 oglDisplay.image->bytes_per_line * oglDisplay.image->height, IPC_CREAT|0777);
1585 if(oglDisplay.shminfo.shmid != -1)
1587 oglDisplay.shminfo.shmaddr = shmat(oglDisplay.shminfo.shmid, 0, 0);
1588 if(oglDisplay.shminfo.shmaddr != (void *)-1)
1590 oglDisplay.shminfo.readOnly = False;
1591 if(XShmAttach(xGlobalDisplay, &oglDisplay.shminfo))
1593 oglDisplay.pixmap = XShmCreatePixmap(xGlobalDisplay, (X11Window)display.window, oglDisplay.shminfo.shmaddr,
1594 &oglDisplay.shminfo, width, height, 32);
1596 // Initialize Shared Memory Shape Pixmap
1597 oglDisplay.shapeImage = XShmCreateImage(xGlobalDisplay, DefaultVisual(xGlobalDisplay, DefaultScreen(xGlobalDisplay)), 1,
1598 ZPixmap, null, &oglDisplay.shminfoShape, width, height);
1599 if(oglDisplay.shapeImage)
1601 oglDisplay.shminfoShape.shmid = shmget(IPC_PRIVATE,
1602 oglDisplay.shapeImage->bytes_per_line * oglDisplay.shapeImage->height, IPC_CREAT|0777);
1603 if(oglDisplay.shminfoShape.shmid != -1)
1605 oglDisplay.shminfoShape.shmaddr = shmat(oglDisplay.shminfoShape.shmid, 0, 0);
1606 if(oglDisplay.shminfoShape.shmaddr != (void *)-1)
1608 oglDisplay.shminfoShape.readOnly = False;
1609 if(XShmAttach(xGlobalDisplay, &oglDisplay.shminfoShape))
1611 oglDisplay.shapePixmap = XShmCreatePixmap(xGlobalDisplay, (X11Window)display.window, oglDisplay.shminfoShape.shmaddr,
1612 &oglDisplay.shminfoShape, width, height, 1);
1613 //oglDisplay.shapePixmap = XCreatePixmap(xGlobalDisplay, (X11Window)display.window, width, height, 1);
1616 XRenderPictureAttributes attributes = { 0 };
1617 XRenderPictFormat * format = XRenderFindStandardFormat(xGlobalDisplay, /*PictStandardRGB24*/ PictStandardARGB32);
1618 #if !defined(__APPLE__)
1619 attributes.repeat = RepeatNormal;
1621 attributes.repeat = 1;
1623 oglDisplay.pixmapPicture = XRenderCreatePicture(xGlobalDisplay, oglDisplay.pixmap, format, CPRepeat, &attributes);
1624 oglDisplay.windowPicture = XRenderCreatePicture(xGlobalDisplay, (X11Window)display.window, format, 0, &attributes);
1625 oglDisplay.shapePicture = XRenderCreatePicture(xGlobalDisplay, oglDisplay.shapePixmap,
1626 XRenderFindStandardFormat(xGlobalDisplay, PictStandardA1), 0, &attributes);
1629 oglDisplay.picture = oglDisplay.shminfo.shmaddr;
1630 oglDisplay.stride = oglDisplay.image->bytes_per_line / 4;
1647 CreateDisplay(display);
1648 #if defined(__WIN32__)
1649 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
1650 #elif defined(__unix__) || defined(__APPLE__)
1651 #if defined(__ANDROID__) || defined(__ODROID__)
1654 #elif defined(__EMSCRIPTEN__)
1655 emscripten_webgl_make_context_current(oglSystem.glc);
1657 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
1665 if(display.alphaBlend && result)
1666 initialDisplaySetup(display);
1668 if(!result && display.alphaBlend)
1670 printf("Alpha blending windows not supported on this display\n");
1677 glViewport(0,0,width,height);
1678 glMatrixMode(MatrixMode::projection);
1680 glOrtho(0,width,height,0,0.0,1.0);
1681 displayWidth = display.width = width;
1682 displayHeight = display.height = height;
1684 if(!oglDisplay.flippingBuffer || oglDisplay.flipBufW < width || oglDisplay.flipBufH < height)
1686 oglDisplay.flipBufW = width;
1687 oglDisplay.flipBufH = height;
1688 #if defined(ES1_1) || defined(ES2)
1691 oglDisplay.flippingBuffer = renew oglDisplay.flippingBuffer ColorAlpha [width * height];
1694 if(oglDisplay.flippingBuffer || !width || !height)
1700 void DisplayPosition(Display display, int x, int y)
1702 OGLDisplay oglDisplay = display.driverData;
1708 void SetPalette(Display display, ColorAlpha * palette, bool colorMatch)
1712 void RestorePalette(Display display)
1716 void StartUpdate(Display display)
1720 void EndUpdate(Display display)
1724 void Scroll(Display display, Box scroll, int x, int y, Extent dirty)
1728 void Update(Display display, Box updateBox)
1730 #if defined(__WIN32__) || defined(USEPBUFFER)
1731 OGLDisplay oglDisplay = display.driverData;
1733 //Logf("DisplayScreen\n");
1735 #if !defined(__ANDROID__)
1740 #if defined(__WIN32__) || defined(USEPBUFFER)
1741 if(display.alphaBlend)
1743 glPixelStorei(GL_PACK_ALIGNMENT, 4);
1744 glPixelStorei(GL_PACK_ROW_LENGTH, oglDisplay.stride);
1745 glPixelStorei(GL_PACK_SKIP_ROWS, 0);
1746 glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
1747 glReadPixels(0,0,display.width,display.height,GL_BGRA_EXT,GL_UNSIGNED_BYTE, oglDisplay.picture);
1750 #if defined(__WIN32__)
1752 POINT point = { oglDisplay.x, oglDisplay.y};
1753 POINT srcPoint = { 0, 0 };
1754 BLENDFUNCTION blend = { 0 };
1756 size.cx = display.width;
1757 size.cy = display.height;
1758 blend.BlendOp = AC_SRC_OVER;
1759 blend.BlendFlags = 0;
1760 blend.SourceConstantAlpha = 255;
1761 blend.AlphaFormat = AC_SRC_ALPHA;
1764 // Process partial images. Mapping the buffer waits for
1765 // outstanding DMA transfers into the buffer to finish.
1766 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[0]);
1767 oglDisplay.pboMemory1 = (byte *)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY);
1769 // glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[1]);
1770 // oglDisplay.pboMemory2 = (byte *)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB,GL_READ_ONLY);
1773 memcpy(oglDisplay.picture, oglDisplay.pboMemory1, display.width * display.height * 4);
1774 //memcpy(oglDisplay.picture + display.width * display.height * 4 / 2, oglDisplay.pboMemory2, display.width * display.height * 4/ 2);
1777 UpdateLayeredWindow(display.window, hdc, &point, &size, oglDisplay.memDC, &srcPoint, 0, &blend, ULW_ALPHA);
1780 // Unmap the image buffers
1781 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[0]);
1782 glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
1784 // glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[1]);
1785 // glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
1787 // Bind two different buffer objects and start the glReadPixels
1788 // asynchronously. Each call will return directly after
1789 // starting the DMA transfer.
1790 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[0]);
1791 glReadPixels(0, 0, display.width, display.height, GL_BGRA, GL_UNSIGNED_BYTE, 0);
1793 // glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[1]);
1794 // glReadPixels(0, display.height/2, display.width, display.height/2, GL_BGRA, GL_UNSIGNED_BYTE, 0);
1798 #elif defined(__unix__) || defined(__APPLE__)
1799 #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
1801 XTransform transform =
1804 { (int)(1.0f * (1<<16)), (int)(0.0f * (1<<16)), (int)(0 * (1 << 16)) },
1805 { (int)(0.0f), (int)(-1.0f * (1<<16)), (int)(0 * (1<<16)) },
1806 { (int)(0.0f * (1<<16)), (int)(0.0f * (1<<16)), (int)(1.0f * (1<<16)) }
1809 XRenderSetPictureTransform(xGlobalDisplay, oglDisplay.pixmapPicture, &transform);
1810 XRenderComposite(xGlobalDisplay, PictOpSrc, oglDisplay.pixmapPicture, None, oglDisplay.shapePicture, 0, 0, 0, 0, 0, 0, display.width, display.height);
1811 XRenderComposite(xGlobalDisplay, PictOpSrc, oglDisplay.pixmapPicture, None, oglDisplay.windowPicture, 0, 0, 0, 0, 0, 0, display.width, display.height);
1812 #if !defined(__APPLE__)
1813 XShapeCombineMask(xGlobalDisplay, (X11Window)display.window, ShapeInput, 0, 0, oglDisplay.shapePixmap, ShapeSet);
1815 XShapeCombineMask(xGlobalDisplay, display.window, 2, 0, 0, oglDisplay.shapePixmap, ShapeSet);
1817 XFlush(xGlobalDisplay);
1825 #if defined(__WIN32__)
1826 //wglSwapLayerBuffers(oglDisplay.hdc,WGL_SWAP_MAIN_PLANE);
1827 SwapBuffers(oglDisplay.hdc);
1828 //ecere::sys::Sleep(0.1);
1829 #elif defined(__unix__) || defined(__APPLE__)
1830 #if defined(__ANDROID__) || defined(__ODROID__)
1832 #elif defined(__EMSCRIPTEN__)
1834 glXSwapBuffers(xGlobalDisplay, (GLXDrawable)display.window);
1838 //Logf("Out of DisplayScreen\n");
1841 void FreeBitmap(DisplaySystem displaySystem, Bitmap bitmap)
1843 if(bitmap.driverData)
1845 GLuint tex = (GLuint)(uintptr)bitmap.driverData;
1846 glDeleteTextures(1, &tex);
1847 bitmap.driverData = 0;
1849 bitmap.driver = ((subclass(DisplayDriver))class(LFBDisplayDriver));
1852 bool AllocateBitmap(DisplaySystem displaySystem, Bitmap bitmap, int width, int height, int stride, PixelFormat format, bool allocatePalette)
1854 OGLSystem oglSystem = displaySystem.driverData;
1855 bool result = false;
1857 GLuint glBitmap = 0;
1859 uint w = width, h = height;
1860 if(oglSystem.pow2textures)
1865 w = Min(w, oglSystem.maxTextureSize);
1866 h = Min(h, oglSystem.maxTextureSize);
1868 glGenTextures(1, &glBitmap);
1869 glBindTexture(GL_TEXTURE_2D, glBitmap);
1871 glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
1873 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1874 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1876 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1877 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1879 #if !defined(SHADERS)
1880 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
1883 mipMap.Allocate(null, w, h, w, pixelFormatRGBA, false);
1885 // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
1886 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
1890 bitmap.driverData = (void *)(uintptr)glBitmap;
1891 bitmap.driver = displaySystem.driver;
1899 bool MakeDDBitmap(DisplaySystem displaySystem, Bitmap bitmap, bool mipMaps)
1901 bool result = false;
1902 OGLSystem oglSystem = displaySystem.driverData;
1903 Bitmap convBitmap = bitmap;
1907 convBitmap.Copy(bitmap);
1910 // Pre process the bitmap... First make it 32 bit
1911 if(/*bitmap.pixelFormat == pixelFormatRGBA || */convBitmap.Convert(null, pixelFormat888, null))
1914 uint w = bitmap.width, h = bitmap.height;
1915 GLuint glBitmap = 0;
1916 if(oglSystem.pow2textures)
1921 w = Min(w, oglSystem.maxTextureSize);
1922 h = Min(h, oglSystem.maxTextureSize);
1926 while(w * 2 < h) w *= 2;
1927 while(h * 2 < w) h *= 2;
1930 // Switch ARGB to RGBA
1931 //if(bitmap.format != pixelFormatRGBA)
1933 for(c=0; c<bitmap.size; c++)
1935 // ((ColorRGBA *)bitmap.picture)[c] = ((ColorAlpha *)bitmap.picture)[c];
1937 ColorAlpha color = ((ColorAlpha *)convBitmap.picture)[c];
1938 ((ColorRGBA *)convBitmap.picture)[c] = ColorRGBA { color.color.r, color.color.g, color.color.b, color.a };
1941 // convBitmap.pixelFormat = pixelFormat888;
1944 glGenTextures(1, &glBitmap);
1947 //int error = glGetError();
1951 glBindTexture(GL_TEXTURE_2D, glBitmap);
1952 glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
1954 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mipMaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
1955 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1957 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1959 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
1960 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
1962 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1963 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1964 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
1965 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0 );
1968 #if !defined(SHADERS)
1969 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
1974 for(level = 0; result && (w >= 1 || h >= 1); level++, w >>= 1, h >>= 1)
1979 if(bitmap.width != w || bitmap.height != h)
1981 mipMap = Bitmap { };
1982 if(mipMap.Allocate(null, w, h, w, convBitmap.pixelFormat, false))
1984 Surface mipSurface = mipMap.GetSurface(0,0,null);
1985 mipSurface.Filter(convBitmap, 0,0,0,0, w, h, convBitmap.width, convBitmap.height);
1995 mipMap = convBitmap;
2002 // glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
2003 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
2004 //printf("Calling glTexImage2D\n");
2005 //glGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_WIDTH, &width);
2006 //printf("width = %d (Should be %d, %d)\n", width, w, h);
2007 if((error = glGetError()))
2009 //Logf("OpenGL Bitmap MakeDD error: %d...\n", error);
2010 //printf("OpenGL Bitmap MakeDD error: %d...\n", error);
2014 if(mipMap != convBitmap)
2019 convBitmap.driver.FreeBitmap(convBitmap.displaySystem, convBitmap);
2020 bitmap.driverData = (void *)(uintptr)glBitmap;
2021 bitmap.driver = displaySystem.driver;
2026 FreeBitmap(displaySystem, bitmap);
2027 else if(oglSystem.loadingFont)
2029 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2030 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2031 oglSystem.loadingFont = false;
2037 void ReleaseSurface(Display display, Surface surface)
2039 glDisable(GL_SCISSOR_TEST);
2040 delete surface.driverData;
2041 surface.driverData = null;
2044 bool GetBitmapSurface(DisplaySystem displaySystem, Surface surface, Bitmap bitmap, int x, int y, Box clip)
2049 bool GetSurface(Display display, Surface surface, int x,int y, Box clip)
2051 bool result = false;
2052 OGLSurface oglSurface = surface.driverData = OGLSurface { };
2054 //Logf("GetSurface\n");
2058 if(displayWidth != display.width || displayHeight != display.height)
2060 displayWidth = display.width;
2061 displayHeight = display.height;
2063 glViewport(0,0,display.width,display.height);
2065 glOrtho(0,display.width,display.height,0,0.0,1.0);
2068 surface.offset.x = x;
2069 surface.offset.y = y;
2070 surface.unclippedBox = surface.box = clip;
2071 oglSurface.bitmapMult[0] = 1;
2072 oglSurface.bitmapMult[1] = 1;
2073 oglSurface.bitmapMult[2] = 1;
2074 oglSurface.bitmapMult[3] = 1;
2076 glEnable(GL_SCISSOR_TEST);
2079 (display.height) -(y+clip.bottom)-1,
2080 clip.right-clip.left+1,
2081 clip.bottom-clip.top+1);
2087 void Clip(Display display, Surface surface, Box clip)
2096 box.Clip(surface.unclippedBox);
2100 box = surface.box = surface.unclippedBox;
2101 box.left += surface.offset.x;
2102 box.top += surface.offset.y;
2103 box.right+= surface.offset.x;
2104 box.bottom += surface.offset.y;
2107 box.left,display.height - box.bottom - 1,
2108 box.right-box.left+1, box.bottom-box.top+1);
2111 bool GrabScreen(Display display, Bitmap bitmap, int x, int y, unsigned int w, unsigned int h)
2113 bool result = false;
2114 OGLDisplay oglDisplay = display.driverData;
2115 ColorAlpha * flippingBuffer = oglDisplay.flippingBuffer;
2117 if(oglDisplay.flippingBuffer)
2119 if(bitmap.pixelFormat != pixelFormat888 || bitmap.width < w || bitmap.height < h)
2122 bitmap.Allocate(null, w,h,w, pixelFormat888, false);
2128 glPixelStorei(GL_PACK_ALIGNMENT, 4);
2129 glPixelStorei(GL_PACK_ROW_LENGTH, bitmap.stride);
2130 glPixelStorei(GL_PACK_SKIP_ROWS, 0);
2131 glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
2132 glReadPixels(x,display.height-h-y,w,h,GL_BGRA_EXT,GL_UNSIGNED_BYTE, flippingBuffer);
2135 for(row = 0; row<h; row++)
2136 CopyBytesBy4(((ColorAlpha *)bitmap.picture) + row * w, ((ColorAlpha *)flippingBuffer) + (h-row-1) * w, w);
2143 void SetForeground(Display display, Surface surface, ColorAlpha color)
2145 OGLSurface oglSurface = surface.driverData;
2147 //Logf("SetForeground\n");
2149 oglSurface.foreground[0] = color.color.r/255.0f;
2150 oglSurface.foreground[1] = color.color.g/255.0f;
2151 oglSurface.foreground[2] = color.color.b/255.0f;
2152 //oglSurface.foreground[3] = 1.0f;
2153 oglSurface.foreground[3] = color.a/255.0f;
2155 //if(!oglSurface.foreground[3])printf("bug");
2158 void SetBackground(Display display, Surface surface, ColorAlpha color)
2160 OGLSurface oglSurface = surface.driverData;
2162 //Logf("SetBackground\n");
2164 oglSurface.background[0] = color.color.r/255.0f;
2165 oglSurface.background[1] = color.color.g/255.0f;
2166 oglSurface.background[2] = color.color.b/255.0f;
2167 //oglSurface.background[3] = 1.0;
2168 oglSurface.background[3] = color.a/255.0f;
2171 void SetBlitTint(Display display, Surface surface, ColorAlpha color)
2173 OGLSurface oglSurface = surface.driverData;
2175 oglSurface.bitmapMult[0] = color.color.r/255.0f;
2176 oglSurface.bitmapMult[1] = color.color.g/255.0f;
2177 oglSurface.bitmapMult[2] = color.color.b/255.0f;
2178 oglSurface.bitmapMult[3] = color.a/255.0f;
2181 ColorAlpha GetPixel(Display display, Surface surface,int x,int y)
2186 void PutPixel(Display display, Surface surface,int x,int y)
2188 OGLSurface oglSurface = surface.driverData;
2190 //Logf("PutPixel\n");
2192 glColor4fv(oglSurface.foreground);
2194 // glVertex2i(x+surface.offset.x, y+surface.offset.y);
2195 glVertex2f(x+surface.offset.x + 0.5f, y+surface.offset.y + 0.5f);
2200 void DrawLine(Display display, Surface surface, int _x1, int _y1, int _x2, int _y2)
2202 OGLSurface oglSurface = surface.driverData;
2203 float x1 = _x1, x2 = _x2, y1 = _y1, y2 = _y2;
2218 x1 += surface.offset.x;
2219 y1 += surface.offset.y;
2220 x2 += surface.offset.x;
2221 y2 += surface.offset.y;
2225 glColor4fv(oglSurface.foreground);
2227 #if defined(ES1_1) || defined(ES2) || defined(SHADERS)
2230 glTexCoord2f(0.5f, 0);
2231 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2232 glTexCoord2f(Max(x2-x1, y2-y1) + 0.5f, 0);
2233 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2242 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2243 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2249 void Rectangle(Display display, Surface surface,int x1,int y1,int x2,int y2)
2251 OGLSurface oglSurface = surface.driverData;
2252 x1 += surface.offset.x;
2253 y1 += surface.offset.y;
2254 x2 += surface.offset.x;
2255 y2 += surface.offset.y;
2257 //Logf("Rectangle\n");
2259 glColor4fv(oglSurface.foreground);
2260 #if defined(ES1_1) || defined(ES2) || defined(SHADERS)
2265 glTexCoord2f(0.5f, 0);
2266 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2267 glTexCoord2f(y2-y1 + 0.5f, 0);
2268 glVertex2f(x1 + 0.5f, y2 + 0.5f);
2270 glTexCoord2f(0.5f, 0);
2271 glVertex2f(x1 + 0.5f, y2 + 0.5f);
2272 glTexCoord2f(x2 - x1 + 0.5f, 0);
2273 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2275 glTexCoord2f(0.5f, 0);
2276 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2277 glTexCoord2f(y1 - y2 + 0.5f, 0);
2278 glVertex2f(x2 + 0.5f, y1 + 0.5f);
2280 glTexCoord2f(0.5f, 0);
2281 glVertex2f(x2 + 0.5f, y1 + 0.5f);
2282 glTexCoord2f(x1 - x2 + 0.5f, 0);
2283 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2288 glBegin(GL_LINE_LOOP);
2295 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2296 glVertex2f(x1 + 0.5f, y2 + 0.5f);
2297 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2298 glVertex2f(x2 + 0.5f, y1 + 0.5f);
2303 void Area(Display display, Surface surface,int x1,int y1,int x2,int y2)
2305 OGLSurface oglSurface = surface.driverData;
2308 glColor4fv(oglSurface.background);
2310 glRecti(x1+surface.offset.x, y1+surface.offset.y,
2311 x2+surface.offset.x + 1, y2+surface.offset.y + 1);
2313 glRectf(x1+surface.offset.x, y1+surface.offset.y,
2314 x2+surface.offset.x + 1, y2+surface.offset.y + 1);
2318 void Clear(Display display, Surface surface, ClearType type)
2320 OGLDisplay oglDisplay = display.driverData;
2321 OGLSurface oglSurface = surface.driverData;
2324 if(type != depthBuffer)
2325 glClearColor(oglSurface.background[0], oglSurface.background[1], oglSurface.background[2], oglSurface.background[3]);
2326 if(type != colorBuffer && !oglDisplay.depthWrite)
2328 glDepthMask((byte)bool::true);
2330 glClear(((type != depthBuffer) ? GL_COLOR_BUFFER_BIT : 0) |
2331 ((type != colorBuffer) ? GL_DEPTH_BUFFER_BIT : 0));
2332 if(type != colorBuffer && !oglDisplay.depthWrite)
2334 glDepthMask((byte)bool::false);
2338 bool ConvertBitmap(DisplaySystem displaySystem, Bitmap bitmap, PixelFormat format, ColorAlpha * palette)
2343 void Blit(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h)
2345 OGLSurface oglSurface = surface.driverData;
2347 if(!oglSurface.writingText)
2349 // glTranslatef(-0.375f, -0.375f, 0.0f);
2350 GLSetupTexturing(true);
2351 glColor4fv(oglSurface.bitmapMult);
2353 else if(oglSurface.xOffset)
2354 glTranslated(oglSurface.xOffset / 64.0/*-0.375*/, 0.0, 0.0);
2356 glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)bitmap.driverData);
2357 glBegin(GLIMTKMode::quads);
2361 glTexCoord2f((float)sx/ bitmap.width, (float)(sy-h)/ bitmap.height);
2362 glVertex2i(dx+surface.offset.x, dy+surface.offset.y);
2363 glTexCoord2f((float)(sx+w) / bitmap.width, (float)(sy-h)/ bitmap.height);
2364 glVertex2i(dx+w+surface.offset.x, dy+surface.offset.y);
2365 glTexCoord2f((float)(sx+w)/ bitmap.width, (float)sy/ bitmap.height);
2366 glVertex2i(dx+w+surface.offset.x, dy-h+surface.offset.y);
2367 glTexCoord2f((float)sx / bitmap.width, (float)sy/ bitmap.height);
2368 glVertex2i(dx+surface.offset.x, dy-h+surface.offset.y);
2373 glTexCoord2f((float)sx / bitmap.width, (float)sy/ bitmap.height);
2374 glVertex2i(dx+surface.offset.x, dy+surface.offset.y);
2375 glTexCoord2f((float)(sx+w)/ bitmap.width, (float)sy/ bitmap.height);
2376 glVertex2i(dx+w+surface.offset.x, dy+surface.offset.y);
2377 glTexCoord2f((float)(sx+w) / bitmap.width, (float)(sy+h)/ bitmap.height);
2378 glVertex2i(dx+w+surface.offset.x, dy+h+surface.offset.y);
2379 glTexCoord2f((float)sx/ bitmap.width, (float)(sy+h)/ bitmap.height);
2380 glVertex2i(dx+surface.offset.x, dy+h+surface.offset.y);
2383 glTexCoord2f((float)sx / bitmap.width, (float)sy/ bitmap.height);
2384 glVertex2f((float)dx+surface.offset.x, (float)dy+surface.offset.y);
2385 glTexCoord2f((float)(sx+w)/ bitmap.width, (float)sy/ bitmap.height);
2386 glVertex2f((float)dx+w+surface.offset.x, (float)dy+surface.offset.y);
2387 glTexCoord2f((float)(sx+w) / bitmap.width, (float)(sy+h)/ bitmap.height);
2388 glVertex2f((float)dx+w+surface.offset.x, (float)dy+h+surface.offset.y);
2389 glTexCoord2f((float)sx/ bitmap.width, (float)(sy+h)/ bitmap.height);
2390 glVertex2f((float)dx+surface.offset.x, (float)dy+h+surface.offset.y);
2394 if(!oglSurface.writingText)
2396 GLSetupTexturing(false);
2398 //glTranslate(0.375, 0.375, 0.0);
2400 else if(oglSurface.xOffset)
2401 glTranslated(-oglSurface.xOffset / 64.0/*+0.375*/, 0.0, 0.0);
2404 void Stretch(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
2406 OGLSurface oglSurface = surface.driverData;
2408 //glTranslate(-0.375, -0.375, 0.0);
2410 GLSetupTexturing(true);
2411 glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)bitmap.driverData);
2413 glColor4fv(oglSurface.bitmapMult);
2415 glBegin(GLIMTKMode::quads);
2419 glTexCoord2f((float)(sx)/ bitmap.width, (float)(sy+sh)/ bitmap.height);
2420 glVertex2i(dx+surface.offset.x, dy+surface.offset.y);
2422 glTexCoord2f((float)(sx+sw) / bitmap.width, (float)(sy+sh)/ bitmap.height);
2423 glVertex2i(dx+w+surface.offset.x, dy+surface.offset.y);
2425 glTexCoord2f((float)(sx+sw)/ bitmap.width, (float)(sy)/ bitmap.height);
2426 glVertex2i(dx+w+surface.offset.x, dy-h+surface.offset.y);
2428 glTexCoord2f((float)(sx) / bitmap.width, (float)(sy)/ bitmap.height);
2429 glVertex2i(dx+surface.offset.x, dy-h+surface.offset.y);
2433 glTexCoord2f((float)(sx) / bitmap.width, (float)(sy)/ bitmap.height);
2434 glVertex2i(dx+surface.offset.x, dy+surface.offset.y);
2436 glTexCoord2f((float)(sx+sw)/ bitmap.width, (float)(sy)/ bitmap.height);
2437 glVertex2i(dx+w+surface.offset.x, dy+surface.offset.y);
2439 glTexCoord2f((float)(sx+sw) / bitmap.width, (float)(sy+sh)/ bitmap.height);
2440 glVertex2i(dx+w+surface.offset.x, dy+h+surface.offset.y);
2442 glTexCoord2f((float)(sx)/ bitmap.width, (float)(sy+sh)/ bitmap.height);
2443 glVertex2i(dx+surface.offset.x, dy+h+surface.offset.y);
2448 GLSetupTexturing(false);
2450 //glTranslate(0.375, 0.375, 0.0);
2453 void Filter(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
2455 Stretch(display, surface, bitmap, dx, dy, sx, sy, w, h, sw, sh);
2458 void StretchDI(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
2460 float s2dw,s2dh,d2sw,d2sh;
2461 //bool flipX = false, flipY = false;
2463 //Logf("StretchDI\n");
2465 if(Sgn(w) != Sgn(sw))
2471 if(Sgn(h) != Sgn(sh))
2483 //Clip against the edges of the source
2486 dx+=(int)((0-sx) * s2dw);
2487 w-=(int)((0-sx) * s2dw);
2493 dy+=(int)((0-sy) * s2dh);
2494 h-=(int)((0-sy) * s2dh);
2499 if(sx+sw>bitmap.width-1)
2501 w-=(int)((sx+sw-(bitmap.width-1)-1)*s2dw);
2502 sw-=sx+sw-(bitmap.width-1)-1;
2504 if(sy+sh>(bitmap.height-1))
2506 h-=(int)((sy+sh-(bitmap.height-1)-1)*s2dh);
2507 sh-=sy+sh-(bitmap.height-1)-1;
2509 //Clip against the edges of the surfaceination
2510 if(dx<surface.box.left)
2513 sx+=(int)((surface.box.left-dx)*d2sw);
2514 sw-=(int)((surface.box.left-dx)*d2sw);
2515 w-=surface.box.left-dx;
2516 dx=surface.box.left;
2518 if(dy<surface.box.top)
2520 sy+=(int)((surface.box.top-dy)*d2sh);
2521 sh-=(int)((surface.box.top-dy)*d2sh);
2522 h-=surface.box.top-dy;
2525 if(dx+w>surface.box.right)
2527 //if(flip) sx+=(int)((dx+w-surface.box.right-1)*d2sw);
2528 sw-=(int)((dx+w-surface.box.right-1)*d2sw);
2529 w-=dx+w-surface.box.right-1;
2531 if(dy+h>surface.box.bottom)
2533 sh-=(int)((dy+h-surface.box.bottom-1)*d2sh);
2534 h-=dy+h-surface.box.bottom-1;
2536 if((w<=0)||(h<=0)||(sw<=0)||(sh<=0)) return;
2538 dx += surface.offset.x;
2539 dy += surface.offset.y;
2541 if(bitmap.pixelFormat == pixelFormat888 && !bitmap.paletteShades)
2543 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
2544 glPixelStorei(GL_UNPACK_ROW_LENGTH, bitmap.stride);
2545 glPixelStorei(GL_UNPACK_SKIP_PIXELS, sx);
2546 glPixelStorei(GL_UNPACK_SKIP_ROWS, sy);
2547 #if !defined(SHADERS)
2548 glRasterPos2d(dx,dy);
2549 //glPixelZoom(flipX ? -s2dw : s2dw, flipY ? s2dh : -s2dh);
2550 glPixelZoom(s2dw, -s2dh);
2551 glDrawPixels(sw,sh,GL_BGRA_EXT,GL_UNSIGNED_BYTE, bitmap.picture);
2553 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
2554 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
2555 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
2556 glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
2560 void BlitDI(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h)
2564 //Clip against the edges of the source
2577 if(sx+w>bitmap.width-1)
2578 w-=sx+w-(bitmap.width-1)-1;
2579 if(sy+h>bitmap.height-1)
2580 h-=sy+h-(bitmap.height-1)-1;
2581 //Clip against the edges of the surfaceination
2582 if(dx<surface.box.left)
2585 sx+=surface.box.left-dx;
2586 w-=surface.box.left-dx;
2587 dx=surface.box.left;
2589 if(dy<surface.box.top)
2591 sy+=surface.box.top-dy;
2592 h-=surface.box.top-dy;
2595 if(dx+w>surface.box.right)
2597 //if(flip) sx+=dx+w-surface.box.right-1;
2598 w-=dx+w-surface.box.right-1;
2600 if(dy+h>surface.box.bottom)
2601 h-=dy+h-surface.box.bottom-1;
2605 dx += surface.offset.x;
2606 dy += surface.offset.y;
2608 if(bitmap.pixelFormat == pixelFormat888 && !bitmap.paletteShades)
2610 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
2611 glPixelStorei(GL_UNPACK_ROW_LENGTH, bitmap.stride);
2612 glPixelStorei(GL_UNPACK_SKIP_PIXELS, sx);
2613 glPixelStorei(GL_UNPACK_SKIP_ROWS, sy);
2614 #if !defined(SHADERS)
2615 glRasterPos2d(dx,dy);
2617 glDrawPixels(w,h,GL_BGRA_EXT,GL_UNSIGNED_BYTE, bitmap.picture);
2619 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
2620 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
2621 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
2622 glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
2626 void FilterDI(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
2628 StretchDI(display, surface, bitmap, dx, dy, sx, sy, w, h, sw, sh);
2631 void UnloadFont(DisplaySystem displaySystem, Font font)
2633 ((subclass(DisplayDriver))class(LFBDisplayDriver)).UnloadFont(displaySystem, font);
2636 Font LoadFont(DisplaySystem displaySystem, const char * faceName, float size, FontFlags flags, float outlineSize, float outlineFade)
2639 OGLSystem oglSystem = displaySystem.driverData;
2640 oglSystem.loadingFont = true;
2641 font = ((subclass(DisplayDriver))class(LFBDisplayDriver)).LoadFont(displaySystem, faceName, size, flags, outlineSize, outlineFade);
2645 void FontExtent(DisplaySystem displaySystem, Font font, const char * text, int len, int * width, int * height, int prevGlyph, int * rPrevGlyph, int * adv)
2647 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(displaySystem, font, text, len, width, height, prevGlyph, rPrevGlyph, adv);
2650 void WriteText(Display display, Surface surface, int x, int y, const char * text, int len, int prevGlyph, int * rPrevGlyph)
2652 OGLSurface oglSurface = surface.driverData;
2653 OGLSystem oglSystem = display.displaySystem.driverData;
2654 oglSystem.loadingFont = true;
2656 //glTranslated(-0.375, -0.375, 0.0);
2660 if(surface.textOpacity)
2663 FontExtent(display.displaySystem, surface.font, text, len, &w, &h, 0, null, &adv);
2665 display.displaySystem.driver.Area(display, surface,x,y,x+w-1,y+h-1);
2668 oglSurface.writingText = true;
2670 GLSetupTexturing(true);
2672 if(surface.font.outlineSize)
2674 ColorAlpha outlineColor = surface.outlineColor;
2675 glColor4ub(outlineColor.color.r, outlineColor.color.g, outlineColor.color.b, outlineColor.a);
2676 oglSurface.writingOutline = true;
2677 ((subclass(DisplayDriver))class(LFBDisplayDriver)).WriteText(display, surface, x, y, text, len, prevGlyph, rPrevGlyph);
2678 oglSurface.writingOutline = false;
2680 glColor4fv(oglSurface.foreground);
2682 ((subclass(DisplayDriver))class(LFBDisplayDriver)).WriteText(display, surface, x, y, text, len, prevGlyph, rPrevGlyph);
2683 oglSurface.writingText = false;
2684 oglSystem.loadingFont = false;
2686 GLSetupTexturing(false);
2688 //glTranslated(0.375, 0.375, 0.0);
2691 void TextFont(Display display, Surface surface, Font font)
2693 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextFont(display, surface, font);
2696 void TextOpacity(Display display, Surface surface, bool opaque)
2698 OGLSurface oglSurface = surface.driverData;
2699 oglSurface.opaqueText = opaque;
2702 void TextExtent(Display display, Surface surface, const char * text, int len, int * width, int * height, int prevGlyph, int * rPrevGlyph, int * adv)
2704 OGLSurface oglSurface = surface.driverData;
2705 OGLSystem oglSystem = display.displaySystem.driverData;
2706 oglSystem.loadingFont = true;
2707 FontExtent(display.displaySystem, oglSurface.font, text, len, width, height, prevGlyph, rPrevGlyph, adv);
2708 oglSystem.loadingFont = false;
2711 void DrawingChar(Display display, Surface surface, char character)
2716 void LineStipple(Display display, Surface surface, uint32 stipple)
2718 //Logf("Stipple\n");
2722 #if defined(ES1_1) || defined(ES2) || defined(SHADERS)
2723 stippleEnabled = true;
2724 glesLineStipple(1, (uint16)stipple);
2726 glLineStipple(1, (uint16)stipple);
2727 glEnable(GL_LINE_STIPPLE);
2732 #if defined(ES1_1) || defined(ES2) || defined(SHADERS)
2733 stippleEnabled = false;
2734 glMatrixMode(GL_TEXTURE);
2736 glMatrixMode(MatrixMode::projection);
2737 GLSetupTexturing(false); // TODO: Special shading code for stipple?
2739 glDisable(GL_LINE_STIPPLE);
2744 #if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
2745 void SetRenderState(Display display, RenderState state, uint value)
2747 OGLDisplay oglDisplay = display.driverData;
2748 //Logf("RenderState\n");
2753 #ifndef __EMSCRIPTEN__
2755 glEnable(GL_MULTISAMPLE_ARB);
2757 glDisable(GL_MULTISAMPLE_ARB);
2761 #if !defined(ES1_1) && !defined(ES2)
2762 glPolygonMode(GL_FRONT_AND_BACK, ((FillModeValue)value == solid) ? GL_FILL : GL_LINE);
2766 if(value) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);
2769 if(value) glDepthMask((byte)bool::true); else glDepthMask((byte)bool::false);
2770 oglDisplay.depthWrite = (bool)value;
2774 float color[4] = { ((Color)value).r/255.0f, ((Color)value).g/255.0f, ((Color)value).b/255.0f, 1.0f };
2775 #if defined(SHADERS)
2776 shader_fogColor(color[0], color[1], color[2]);
2778 glFogfv(GL_FOG_COLOR, (float *)&color);
2783 #if defined(SHADERS)
2784 shader_fogDensity((float)(RenderStateFloat { ui = value }.f * nearPlane));
2786 glFogf(GL_FOG_DENSITY, (float)(RenderStateFloat { ui = value }.f * nearPlane));
2790 //#if !defined(__EMSCRIPTEN__)
2791 if(value) glEnable(GL_BLEND); else glDisable(GL_BLEND);
2796 #if defined(SHADERS)
2797 shader_setGlobalAmbient(((Color)value).r / 255.0f, ((Color)value).g / 255.0f, ((Color)value).b / 255.0f, 1.0f);
2799 float ambient[4] = { ((Color)value).r/255.0f, ((Color)value).g/255.0f, ((Color)value).b/255.0f, 1.0f };
2800 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
2806 if(value) glColorMask(1,1,1,1); else glColorMask(1,1,1,0);
2811 #if defined(__WIN32__)
2812 wglSwapIntervalEXT(value ? 1 : 0);
2819 void SetLight(Display display, int id, Light light)
2821 #if defined(SHADERS)
2822 shader_setLight(display, id, light);
2824 //Logf("SetLight\n");
2828 Object lightObject = light.lightObject;
2829 float position[4] = { 0, 0, 0, 0 };
2830 float color[4] = { 0, 0, 0, 1 };
2832 glEnable(GL_LIGHT0 + id);
2834 glLightfv(GL_LIGHT0 + id, GL_DIFFUSE, (float *)&light.diffuse);
2835 glLightfv(GL_LIGHT0 + id, GL_AMBIENT, (float *)&light.ambient);
2836 glLightfv(GL_LIGHT0 + id, GL_SPECULAR,(float *)&light.specular);
2839 if(!light.multiplier) light.multiplier = 1.0f;
2841 color[0] = light.diffuse.r * light.multiplier;
2842 color[1] = light.diffuse.g * light.multiplier;
2843 color[2] = light.diffuse.b * light.multiplier;
2844 glLightfv(GL_LIGHT0 + id, GL_DIFFUSE, color);
2846 color[0] = light.ambient.r * light.multiplier;
2847 color[1] = light.ambient.g * light.multiplier;
2848 color[2] = light.ambient.b * light.multiplier;
2849 glLightfv(GL_LIGHT0 + id, GL_AMBIENT, color);
2850 color[0] = light.specular.r * light.multiplier;
2851 color[1] = light.specular.g * light.multiplier;
2852 color[2] = light.specular.b * light.multiplier;
2853 glLightfv(GL_LIGHT0 + id, GL_SPECULAR,color);
2857 Vector3D positionVector;
2858 if(light.flags.spot)
2860 if(lightObject.flags.root || !lightObject.parent)
2862 positionVector = lightObject.transform.position;
2863 positionVector.Subtract(positionVector, display.display3D.camera.cPosition);
2867 positionVector.MultMatrix(lightObject.transform.position, lightObject.parent.matrix);
2868 if(display.display3D.camera)
2869 positionVector.Subtract(positionVector, display.display3D.camera.cPosition);
2875 if(!light.direction.x && !light.direction.y && !light.direction.z)
2877 Vector3Df vector { 0,0,-1 };
2879 mat.RotationQuaternion(light.orientation);
2880 positionVector.MultMatrixf(vector, mat);
2884 positionVector = light.direction;
2889 position[0] = (float)positionVector.x;
2890 position[1] = (float)positionVector.y;
2891 position[2] = (float)positionVector.z;
2893 glLightfv(GL_LIGHT0 + id, GL_POSITION, position);
2896 // Display Light Position
2897 glDisable(GL_LIGHTING);
2898 glDisable(GL_DEPTH_TEST);
2902 glVertex3fv(position);
2904 glEnable(GL_DEPTH_TEST);
2905 glEnable(GL_LIGHTING);
2909 if(lightObject.flags.root || !lightObject.parent)
2911 positionVector = light.target.transform.position;
2912 positionVector.Subtract(positionVector, display.camera.cPosition);
2916 positionVector.MultMatrix(light.target.transform.position,
2917 lightObject.light.target.parent.matrix);
2918 positionVector.Subtract(positionVector, display.camera.cPosition);
2921 position[0] = positionVector.x;
2922 position[1] = positionVector.y;
2923 position[2] = positionVector.z;
2925 glDisable(GL_LIGHTING);
2926 glDisable(GL_DEPTH_TEST);
2930 glVertex3fv(position);
2932 glEnable(GL_DEPTH_TEST);
2933 glEnable(GL_LIGHTING);
2936 if(light.flags.attenuation)
2938 glLightf(GL_LIGHT0 + id, GL_CONSTANT_ATTENUATION, light.Kc);
2939 glLightf(GL_LIGHT0 + id, GL_LINEAR_ATTENUATION, light.Kl);
2940 glLightf(GL_LIGHT0 + id, GL_QUADRATIC_ATTENUATION, light.Kq);
2943 if(light.flags.spot)
2946 #define MAXLIGHT 0.9
2947 float direction[4] = { (float)light.direction.x, (float)light.direction.y, (float)light.direction.z, 1 };
2948 // Figure out exponent out of the hot spot
2949 exponent = (float)(log(MAXLIGHT) / log(cos((light.hotSpot / 2))));
2951 glLightfv(GL_LIGHT0 + id, GL_SPOT_DIRECTION, direction);
2952 glLightf(GL_LIGHT0 + id, GL_SPOT_CUTOFF, (float)(light.fallOff / 2));
2953 glLightf(GL_LIGHT0 + id, GL_SPOT_EXPONENT, exponent);
2958 Vector3Df vector { 0,0,-1 };
2959 Vector3Df direction;
2962 mat.RotationQuaternion(light.orientation);
2963 direction.MultMatrix(vector, mat);
2965 position[0] = direction.x;
2966 position[1] = direction.y;
2967 position[2] = direction.z;
2969 glLightfv(GL_LIGHT0 + id, GL_POSITION, position);
2973 glDisable(GL_LIGHT0 + id);
2977 void SetCamera(Display display, Surface surface, Camera camera)
2979 OGLDisplay oglDisplay = display.driverData;
2980 //Logf("SetCamera\n");
2982 if(surface && camera)
2984 int left = surface.box.left + surface.offset.x;
2985 int top = surface.box.top + surface.offset.y;
2986 int right = surface.box.right + surface.offset.x;
2987 int bottom = surface.box.bottom + surface.offset.y;
2988 float origX = surface.offset.x + camera.origin.x;
2989 float origY = surface.offset.y + camera.origin.y;
2991 int y = display.height - bottom - 1;
2992 int w = right - left + 1;
2993 int h = bottom - top + 1;
2996 glViewport(x, y, w, h);
2998 // *** Projection Matrix ***
2999 glMatrixMode(MatrixMode::projection);
3000 if(!display.display3D.camera)
3003 if(display.display3D.collectingHits)
3005 float pickX = display.display3D.pickX + surface.offset.x;
3006 float pickY = display.height - (display.display3D.pickY + surface.offset.y) - 1;
3010 w / display.display3D.pickWidth, 0, 0, 0,
3011 0, h / display.display3D.pickHeight, 0, 0,
3013 (w + 2.0f * (x - pickX)) / display.display3D.pickWidth,
3014 (h + 2.0f * (y - pickY)) / display.display3D.pickHeight, 0, 1
3017 glLoadMatrixd(pickMatrix.array);
3022 (left - origX) * camera.zMin / camera.focalX,
3023 (right - origX) * camera.zMin / camera.focalX,
3024 (bottom - origY) * camera.zMin / camera.focalY,
3025 (top - origY) * camera.zMin / camera.focalY,
3026 camera.zMin, camera.zMax);
3028 glDisable(GL_BLEND);
3030 // *** Z Inverted Identity Matrix ***
3031 glMatrixMode(MatrixMode::modelView);
3032 if(!display.display3D.camera)
3037 glScaled(1.0/nearPlane, 1.0/nearPlane, -1.0/nearPlane);
3039 // *** View Matrix ***
3040 glMultMatrixd(camera.viewMatrix.array);
3045 glEnable(GL_DEPTH_TEST);
3047 GLSetupLighting(true);
3048 #if !defined(SHADERS)
3049 glShadeModel(GL_SMOOTH);
3051 glDepthMask((byte)bool::true);
3052 oglDisplay.depthWrite = true;
3054 #ifndef __EMSCRIPTEN__
3055 glEnable(GL_MULTISAMPLE_ARB);
3058 else if(surface && display.display3D.camera)
3061 oglDisplay.depthWrite = false;
3062 glViewport(0,0,display.width,display.height);
3064 glDisable(GL_CULL_FACE);
3065 glDisable(GL_DEPTH_TEST);
3068 GLSetupTexturing(false);
3069 GLSetupLighting(false);
3072 glDisableClientState(GL_COLOR_ARRAY);
3074 #if defined(SHADERS)
3075 shader_setPerVertexColor(false);
3077 glShadeModel(GL_FLAT);
3080 #if !defined(__EMSCRIPTEN__)
3081 glDisable(GL_MULTISAMPLE_ARB);
3084 // *** Restore 2D MODELVIEW Matrix ***
3087 // *** Restore 2D PROJECTION Matrix ***
3088 glMatrixMode(MatrixMode::projection);
3094 void ApplyMaterial(Display display, Material material, Mesh mesh)
3096 //Logf("ApplyMaterial\n");
3099 if(material.flags.doubleSided)
3101 #if !defined(SHADERS)
3102 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, !material.flags.singleSideLight);
3104 glDisable(GL_CULL_FACE);
3108 #if !defined(SHADERS)
3109 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, bool::false);
3111 glEnable(GL_CULL_FACE);
3115 GLSetupFog(!material.flags.noFog);
3118 if(material.baseMap && (mesh.texCoords || mesh.flags.texCoords1))
3120 Bitmap map = material.baseMap;
3121 GLSetupTexturing(true);
3122 glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)map.driverData);
3124 glMatrixMode(GL_TEXTURE);
3126 if(material.uScale && material.vScale)
3127 glScalef(material.uScale, material.vScale, 1);
3128 glMatrixMode(MatrixMode::modelView);
3130 if(material.flags.tile)
3132 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
3133 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
3137 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3138 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3142 GLSetupTexturing(false);
3144 #if defined(SHADERS)
3145 shader_setMaterial(material, mesh.flags.colors);
3147 if(mesh.flags.colors)
3149 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
3150 glEnable(GL_COLOR_MATERIAL);
3154 glDisable(GL_COLOR_MATERIAL);
3156 float color[4] = { material.diffuse.r, material.diffuse.g, material.diffuse.b, material.opacity };
3157 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, color);
3160 float color[4] = { material.ambient.r, material.ambient.g, material.ambient.b, 0 };
3161 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, color);
3165 float color[4] = { material.specular.r, material.specular.g, material.specular.b, 0 };
3166 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, color);
3169 float color[4] = { material.emissive.r, material.emissive.g, material.emissive.b, 0 };
3170 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, color);
3173 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &material.power);
3177 void FreeMesh(DisplaySystem displaySystem, Mesh mesh)
3179 OGLMesh oglMesh = mesh.data;
3182 if(!mesh.flags.vertices)
3184 oglMesh.vertices.free();
3185 delete mesh.vertices;
3187 if(!mesh.flags.normals)
3189 oglMesh.normals.free();
3190 delete mesh.normals;
3192 if(!mesh.flags.texCoords1)
3194 oglMesh.texCoords.free();
3195 delete mesh.texCoords;
3197 if(!mesh.flags.texCoords2)
3199 oglMesh.texCoords2.free();
3200 // delete mesh.texCoords2;
3202 if(!mesh.flags.colors)
3204 oglMesh.colors.free();
3215 bool AllocateMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags, int nVertices)
3217 bool result = false;
3220 mesh.data = OGLMesh { };
3223 if(mesh.nVertices == nVertices)
3225 // Same number of vertices, adding features (Leaves the other features pointers alone)
3226 if(mesh.flags != flags)
3228 if(!mesh.flags.vertices && flags.vertices)
3230 if(flags.doubleVertices)
3232 mesh.vertices = (Vector3Df *)new Vector3D[nVertices];
3235 mesh.vertices = new Vector3Df[nVertices];
3237 if(!mesh.flags.normals && flags.normals)
3239 if(flags.doubleNormals)
3241 mesh.normals = (Vector3Df *)new Vector3D[nVertices];
3244 mesh.normals = new Vector3Df[nVertices];
3246 if(!mesh.flags.texCoords1 && flags.texCoords1)
3248 mesh.texCoords = new Pointf[nVertices];
3250 if(!mesh.flags.colors && flags.colors)
3252 mesh.colors = new ColorRGBAf[nVertices];
3258 // New number of vertices, reallocate all current and new features
3259 flags |= mesh.flags;
3262 if(flags.doubleVertices)
3264 mesh.vertices = (Vector3Df *)renew mesh.vertices Vector3D[nVertices];
3267 mesh.vertices = renew mesh.vertices Vector3Df[nVertices];
3271 if(flags.doubleNormals)
3273 mesh.normals = (Vector3Df *)renew mesh.normals Vector3D[nVertices];
3276 mesh.normals = renew mesh.normals Vector3Df[nVertices];
3278 if(flags.texCoords1)
3280 mesh.texCoords = renew mesh.texCoords Pointf[nVertices];
3284 mesh.colors = renew mesh.colors ColorRGBAf[nVertices];
3292 void UnlockMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags)
3294 OGLMesh oglMesh = mesh.data;
3295 if(!flags) flags = mesh.flags;
3300 oglMesh.vertices.upload(
3301 mesh.nVertices * (mesh.flags.doubleVertices ? sizeof(Vector3D) : sizeof(Vector3Df)), mesh.vertices); //, GL_STATIC_DRAW_ARB );
3304 oglMesh.normals.upload(
3305 mesh.nVertices * (mesh.flags.doubleNormals ? sizeof(Vector3D) : sizeof(Vector3Df)), mesh.normals); //, GL_STATIC_DRAW_ARB );
3307 if(flags.texCoords1)
3308 oglMesh.texCoords.upload(
3309 mesh.nVertices * sizeof(Pointf), mesh.texCoords); //, GL_STATIC_DRAW_ARB );
3312 oglMesh.colors.upload(
3313 mesh.nVertices * sizeof(ColorRGBAf), mesh.colors); //, GL_STATIC_DRAW_ARB );
3317 bool LockMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags)
3324 void FreeIndices(DisplaySystem displaySystem, OGLIndices oglIndices)
3328 oglIndices.buffer.free();
3329 delete oglIndices.indices;
3334 void * AllocateIndices(DisplaySystem displaySystem, int nIndices, bool indices32bit)
3336 OGLIndices oglIndices = OGLIndices { };
3339 oglIndices.indices = (void *)(indices32bit ? new uint32[nIndices] : new uint16[nIndices]);
3340 oglIndices.nIndices = nIndices;
3345 void UnlockIndices(DisplaySystem displaySystem, OGLIndices oglIndices, bool indices32bit, int nIndices)
3349 #if defined(ES1_1) || defined(ES2)
3352 if(!oglIndices.buffer.buffer)
3353 glGenBuffers(1, &oglIndices.buffer.buffer);
3354 if(glabCurElementBuffer != oglIndices.buffer.buffer)
3355 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oglIndices.buffer.buffer);
3356 glimtkBufferDatai(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32) * nIndices, oglIndices.indices, GL_STATIC_DRAW_ARB);
3360 oglIndices.buffer.upload(
3361 nIndices * (indices32bit ? sizeof(uint32) : sizeof(uint16)),
3362 oglIndices.indices); //GL_STATIC_DRAW_ARB);
3366 uint16 * LockIndices(DisplaySystem displaySystem, OGLIndices oglIndices)
3369 return oglIndices.indices;
3372 void SelectMesh(Display display, Mesh mesh)
3374 //Logf("SelectMesh\n");
3376 #if !defined( __ANDROID__) && !defined(__APPLE__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
3378 #if defined(__WIN32__)
3379 if(glUnlockArraysEXT)
3381 if(!vboAvailable && display.display3D.mesh)
3382 glUnlockArraysEXT();
3387 OGLMesh oglMesh = mesh.data;
3389 // *** Vertex Stream ***
3390 glEnableClientState(GL_VERTEX_ARRAY);
3391 if(!display.display3D.collectingHits && oglMesh)
3393 oglMesh.vertices.use(vertex, 3, (mesh.flags.doubleVertices ? GL_DOUBLE : GL_FLOAT), 0, oglMesh.vertices.buffer ? null : (double *)mesh.vertices);
3395 // *** Normals Stream ***
3396 if(mesh.normals || mesh.flags.normals)
3398 glEnableClientState(GL_NORMAL_ARRAY);
3399 oglMesh.normals.use(normal, 3, GL_FLOAT, 0, oglMesh.normals.buffer ? null : mesh.normals);
3402 glDisableClientState(GL_NORMAL_ARRAY);
3404 // *** Texture Coordinates Stream ***
3405 if(mesh.texCoords || mesh.flags.texCoords1)
3407 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
3408 oglMesh.texCoords.use(texCoord, 2, GL_FLOAT, 0, oglMesh.texCoords.buffer ? null : mesh.texCoords);
3411 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
3413 // *** Color Stream ***
3414 if(mesh.colors || mesh.flags.colors)
3416 glEnableClientState(GL_COLOR_ARRAY);
3417 oglMesh.colors.use(color, 4, GL_FLOAT, 0, oglMesh.colors.buffer ? null : mesh.colors);
3420 glDisableClientState(GL_COLOR_ARRAY);
3424 noAB.use(vertex, 3, (mesh.flags.doubleVertices ? GL_DOUBLE : GL_FLOAT), 0, (double *)mesh.vertices);
3425 if((mesh.normals || mesh.flags.normals) && !display.display3D.collectingHits)
3427 glEnableClientState(GL_NORMAL_ARRAY);
3428 noAB.use(normal, 3, GL_FLOAT, 0, mesh.normals);
3431 glDisableClientState(GL_NORMAL_ARRAY);
3432 if((mesh.texCoords || mesh.flags.texCoords1) && !display.display3D.collectingHits)
3434 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
3435 noAB.use(texCoord, 2, GL_FLOAT, 0, mesh.texCoords);
3438 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
3439 if((mesh.colors || mesh.flags.colors) && !display.display3D.collectingHits)
3441 glEnableClientState(GL_COLOR_ARRAY);
3442 noAB.use(color, 4, GL_FLOAT, 0, mesh.colors);
3445 glDisableClientState(GL_COLOR_ARRAY);
3448 #if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
3450 #if defined(__WIN32__)
3454 glLockArraysEXT(0, mesh.nVertices);
3460 void DrawPrimitives(Display display, PrimitiveSingle * primitive, Mesh mesh)
3462 //Logf("DrawPrimitives\n");
3464 if(primitive->type.vertexRange)
3465 glDrawArrays(primitiveTypes[primitive->type.primitiveType], primitive->first, primitive->nVertices);
3468 // *** Hoping the data won't be uploaded at all (Won't really work if another group of the mesh is using the mesh ) ***
3469 // HACK TO SPEED THINGS UP...
3471 /*GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
3472 if(primitive->nIndices < (mesh.nVertices >> 2) && !primitive->type.indices32bit)
3475 glBegin((GLIMTKMode)primitiveTypes[primitive->type.primitiveType]);
3478 OGLIndices oglIndices = primitive->data;
3479 MeshFeatures flags = mesh.flags;
3480 for(c = 0; c<primitive->nIndices; c++)
3482 uint16 index = ((uint16 *) oglIndices.indices)[c];
3483 if(flags.normals) glNormal3fv((float *)&mesh.normals[index]);
3484 if(flags.texCoords1) glTexCoord2fv((float *)&mesh.texCoords[index]);
3485 if(flags.colors) glColor4fv((float *)&mesh.colors[index]);
3486 glVertex3fv((float *)&mesh.vertices[index]);
3495 OGLIndices oglIndices = primitive->data;
3496 GLEAB eab = ((!display.display3D.collectingHits && oglIndices) ? oglIndices.buffer : noEAB);
3498 eab.draw(primitiveTypes[primitive->type.primitiveType], primitive->nIndices,
3499 primitive->type.indices32bit ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT,
3500 eab.buffer ? 0 : (oglIndices ? oglIndices.indices : primitive->indices));
3501 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
3506 void PushMatrix(Display display)
3511 void PopMatrix(Display display, bool setMatrix)
3516 void SetTransform(Display display, Matrix transMatrix, bool viewSpace, bool useCamera)
3518 Matrix matrix = transMatrix;
3519 Camera camera = useCamera ? display.display3D.camera : null;
3524 glScaled(1.0/nearPlane, 1.0/nearPlane, -1.0/nearPlane);
3529 matrix.m[3][0] - camera.cPosition.x,
3530 matrix.m[3][1] - camera.cPosition.y,
3531 matrix.m[3][2] - camera.cPosition.z);
3543 glMultMatrixd(matrix.array);
3548 public void UseSingleGLContext(bool useSingle)
3550 useSingleGLContext = useSingle;
3553 default dllexport void *
3554 #if defined(__WIN32__)
3555 __attribute__((stdcall))
3557 IS_GLGetContext(DisplaySystem displaySystem)
3561 #if defined(__WIN32__)
3562 OGLSystem system = displaySystem.driverData;
3564 #elif defined(__ANDROID__) || defined(__ODROID__)
3566 #elif defined(__EMSCRIPTEN__)
3567 OGLSystem system = displaySystem.driverData;
3568 return (void *)system.glc;
3570 OGLSystem system = displaySystem.driverData;
3571 return system.glContext;