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);
848 PrintLn("max texture size: ", oglSystem.maxTextureSize);
852 bool CreateDisplaySystem(DisplaySystem displaySystem)
855 OGLSystem oglSystem = displaySystem.driverData = OGLSystem { };
858 PrintLn("OpenGL driver's CreateDisplaySystem()");
862 oglSystem.hwnd = CreateWindow("static", null, 0,0,0,0,0,null,null,null,null);
864 oglSystem.hdc = GetDC(oglSystem.hwnd);
868 oglSystem.pfd.nSize = (short)sizeof(oglSystem.pfd);
869 oglSystem.pfd.nVersion = 1;
870 oglSystem.pfd.dwFlags = PFD_DRAW_TO_WINDOW /*PFD_DRAW_TO_BITMAP*/ | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
871 oglSystem.pfd.iPixelType = PFD_TYPE_RGBA;
872 oglSystem.pfd.cColorBits = 24;
873 oglSystem.pfd.cAlphaBits = 8;
874 oglSystem.pfd.cDepthBits = 24;
875 oglSystem.pfd.iLayerType = PFD_MAIN_PLANE;
877 oglSystem.format = ChoosePixelFormat(oglSystem.hdc, &oglSystem.pfd);
878 DescribePixelFormat(oglSystem.hdc, oglSystem.format, sizeof(oglSystem.pfd), &oglSystem.pfd);
880 if(oglSystem.pfd.cColorBits > 8)
882 SetPixelFormat(oglSystem.hdc, oglSystem.format, &oglSystem.pfd);
883 oglSystem.glrc = wglCreateContext(oglSystem.hdc);
886 wglMakeCurrent(oglSystem.hdc, oglSystem.glrc);
888 wglChoosePixelFormatARB = (void *) wglGetProcAddress("wglChoosePixelFormatARB");
889 wglGetExtensionsStringARB = (void *)wglGetProcAddress("wglGetExtensionsStringARB");
890 wglCreatePbufferARB = (void *)wglGetProcAddress("wglCreatePbufferARB");
891 wglGetPbufferDCARB = (void *)wglGetProcAddress("wglGetPbufferDCARB");
892 wglQueryPbufferARB = (void *)wglGetProcAddress("wglQueryPbufferARB");
893 wglDestroyPbufferARB = (void *)wglGetProcAddress("wglDestroyPbufferARB");
894 wglReleasePbufferDCARB = (void *)wglGetProcAddress("wglReleasePbufferDCARB");
895 wglBindTexImageARB = (void *)wglGetProcAddress("wglBindTexImageARB");
896 wglReleaseTexImageARB = (void *)wglGetProcAddress("wglReleaseTexImageARB");
897 wglSwapIntervalEXT = (void *)wglGetProcAddress("wglSwapIntervalEXT");
898 wglCreateContextAttribsARB = (void *)wglGetProcAddress("wglCreateContextAttribsARB");
900 glLockArraysEXT = (void *) wglGetProcAddress("glLockArraysEXT" );
901 glUnlockArraysEXT = (void *) wglGetProcAddress("glUnlockArraysEXT");
903 // eSystem_LoggingMode(LOG_MSGBOX, null);
905 if(wglChoosePixelFormatARB)
910 float fAttributes[] = {0,0};
913 WGL_DRAW_TO_WINDOW_ARB,GL_TRUE,
914 WGL_SUPPORT_OPENGL_ARB,GL_TRUE,
915 WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB,
916 WGL_COLOR_BITS_ARB,24,
917 WGL_ALPHA_BITS_ARB,8,
918 WGL_DEPTH_BITS_ARB,16,
919 WGL_STENCIL_BITS_ARB,0,
920 WGL_DOUBLE_BUFFER_ARB,GL_TRUE,
921 WGL_SAMPLE_BUFFERS_ARB,GL_TRUE,
922 WGL_SAMPLES_ARB, 4, // Check For 4x Multisampling
926 //Log("Found wglChoosePixelFormatARB\n");
928 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
929 if(!valid || !numFormats)
931 //Log("Can't find 4x multi sampling\n");
933 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
934 if(!valid || !numFormats)
936 // Log("Can't find 2x multi sampling\n");
939 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
942 if(valid && numFormats)
944 oglSystem.format = pixelFormat;
945 wglMakeCurrent(null, null);
946 wglDeleteContext(oglSystem.glrc);
948 // *** DescribePixelFormat does not support WGL pixel formats! ***
949 //DescribePixelFormat(oglSystem.hdc, oglSystem.format, sizeof(oglSystem.pfd), &oglSystem.pfd);
950 SetPixelFormat(oglSystem.hdc, oglSystem.format, &oglSystem.pfd);
951 //Log("Successfully set pixel format\n");
954 PrintLn("winCreateContext()");
956 oglSystem.glrc = winCreateContext(oglSystem.hdc);
958 PrintLn("wglMakeCurrent()");
960 wglMakeCurrent(oglSystem.hdc, oglSystem.glrc);
964 eSystem_Logf("Can't find wglChoosePixelFormatARB\n");*/
968 wglMakeCurrent(null, null);
970 //eSystem_DumpErrors(true);
974 #elif defined(__unix__) || defined(__APPLE__)
976 #if defined(__ANDROID__) || defined(__ODROID__)
977 #if defined(__ANDROID__)
978 egl_init_display(guiApp.desktop.windowHandle);
979 #elif defined(__ODROID__)
980 egl_init_display((uint)displaySystem.window);
981 CheckExtensions(oglSystem);
984 // TODO: Clean this up? Needed here?
985 glEnableClientState(GL_VERTEX_ARRAY);
987 // Initialize GL state.
988 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
989 glEnable(GL_CULL_FACE);
990 glShadeModel(GL_SMOOTH);
991 glDisable(GL_DEPTH_TEST);
993 glDisable(GL_CULL_FACE);
994 glDisable(GL_DEPTH_TEST);
996 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
999 matrixStack[0][0].Identity();
1000 matrixStack[1][0].Identity();
1001 matrixStack[2][0].Identity();
1003 glmsMatrixMode(GL_MODELVIEW);
1004 glScaled(1.0, 1.0, -1.0);
1005 glmsMatrixMode(GL_PROJECTION);
1006 glShadeModel(GL_FLAT);
1008 glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
1009 glFogi(GL_FOG_MODE, GL_EXP);
1010 glFogf(GL_FOG_DENSITY, 0);
1011 glEnable(GL_NORMALIZE);
1012 glDepthFunc(GL_LESS);
1014 glDisable(GL_MULTISAMPLE_ARB);
1016 glViewport(0,0,eglWidth,eglHeight);
1018 glOrtho(0,eglWidth,eglHeight,0,0.0,1.0);
1020 glabCurArrayBuffer = 0;
1021 glabCurElementBuffer = 0;
1024 #elif defined(__EMSCRIPTEN__)
1026 EmscriptenWebGLContextAttributes attribs = { 0 };
1028 attribs.antialias = 1;
1035 EM_BOOL premultipliedAlpha;
1036 EM_BOOL preserveDrawingBuffer;
1037 EM_BOOL preferLowPowerToHighPerformance;
1038 EM_BOOL failIfMajorPerformanceCaveat;
1041 EM_BOOL enableExtensionsByDefault;
1044 emscripten_webgl_init_context_attributes(&attribs);
1045 oglSystem.pow2textures = true;
1046 oglSystem.maxTextureSize = 16384;
1047 oglSystem.glc = emscripten_webgl_create_context("canvas", &attribs);
1048 if(emscripten_webgl_make_context_current(oglSystem.glc) == EMSCRIPTEN_RESULT_SUCCESS)
1051 /*glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1052 glEnable(GL_BLEND);*/
1056 X11Window root = RootWindow( xGlobalDisplay, DefaultScreen( xGlobalDisplay ) );
1057 XSetWindowAttributes attr;
1062 #ifndef ECERE_MINIGLX
1063 GLX_USE_GL, GLX_DEPTH_SIZE, 1,
1066 GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1,
1070 oglSystem.visualInfo = glXChooseVisual( xGlobalDisplay, DefaultScreen( xGlobalDisplay ), attrList );
1071 attr.background_pixel = 0;
1072 attr.border_pixel = 0;
1073 attr.colormap = XCreateColormap( xGlobalDisplay, root, oglSystem.visualInfo->visual, AllocNone);
1074 attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
1075 mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
1077 oglSystem.glxDrawable = XCreateWindow( xGlobalDisplay, root, 0, 0, 1, 1, 0, oglSystem.visualInfo->depth, InputOutput,
1078 oglSystem.visualInfo->visual, mask, &attr );
1080 if(oglSystem.visualInfo)
1082 oglSystem.glContext = glXCreateContext(xGlobalDisplay, oglSystem.visualInfo, null, True);
1083 if(oglSystem.glContext)
1085 glXMakeCurrent(xGlobalDisplay, oglSystem.glxDrawable, oglSystem.glContext);
1087 // CheckExtensions(oglSystem);
1088 glXMakeCurrent(xGlobalDisplay, None, null);
1095 displaySystem.flags.alpha = true;
1096 displaySystem.flags.flipping = true;
1097 displaySystem.pixelFormat = pixelFormat888;
1101 void DestroyDisplaySystem(DisplaySystem displaySystem)
1103 OGLSystem oglSystem = displaySystem.driverData;
1106 glDeleteTextures(1, &stippleTexture);
1112 #if defined(__WIN32__)
1113 wglMakeCurrent( null, null );
1116 wglDeleteContext(oglSystem.glrc);
1119 ReleaseDC(oglSystem.hwnd, oglSystem.hdc);
1120 DestroyWindow(oglSystem.hwnd);
1122 #elif defined(__unix__) || defined(__APPLE__)
1123 #if defined(__ANDROID__) || defined(__ODROID__)
1125 #elif defined(__EMSCRIPTEN__)
1126 emscripten_webgl_destroy_context(oglSystem.glc);
1128 if(oglSystem.visualInfo)
1130 #ifdef ECERE_MINIGLX
1131 __miniglx_XFree(oglSystem.visualInfo);
1133 XFree(oglSystem.visualInfo);
1137 if(oglSystem.glxDrawable)
1139 XDestroyWindow(xGlobalDisplay, oglSystem.glxDrawable);
1140 oglSystem.glxDrawable = 0;
1147 static bool ::initialDisplaySetup(Display display)
1151 loadShaders("<:ecere>shaders/fixed.vertex", "<:ecere>shaders/fixed.frag");
1153 glEnableClientState(GL_VERTEX_ARRAY);
1155 GLABBindBuffer(GL_ARRAY_BUFFER, 0);
1156 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
1158 #if defined(__WIN32__)
1159 if(glBlendFuncSeparate)
1160 glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1162 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1164 glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1168 glMatrixMode(MatrixMode::modelView);
1169 glLoadIdentity(); // For setting up GLES stack
1170 glScaled(1.0, 1.0, -1.0);
1171 // glTranslatef(0.375f, 0.375f, 0.0f);
1172 // glTranslatef(-0.625f, -0.625f, 0.0f);
1173 glMatrixMode(MatrixMode::projection);
1174 #if !defined(EM_MODE) && !defined(SHADERS)
1175 glShadeModel(GL_FLAT);
1177 // #define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
1179 // glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
1181 glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
1182 glFogi(GL_FOG_MODE, GL_EXP);
1183 glFogf(GL_FOG_DENSITY, 0);
1184 glEnable(GL_NORMALIZE);
1186 glDepthFunc(GL_LESS);
1188 glDisable(GL_MULTISAMPLE_ARB);
1189 #if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
1190 display.ambient = Color { 50,50,50 };
1195 bool CreateDisplay(Display display)
1197 bool result = false;
1198 OGLDisplay oglDisplay = display.driverData;
1199 #if !defined(__ANDROID__) && !defined(__ODROID__)
1200 OGLSystem oglSystem = display.displaySystem.driverData;
1204 oglDisplay = display.driverData = OGLDisplay { };
1205 //printf("Inside CreateDisplay\n");
1207 #if defined(__WIN32__) || defined(USEPBUFFER)
1208 if(!display.alphaBlend)
1211 #if defined(__WIN32__)
1212 oglDisplay.hdc = GetDC(display.window);
1213 SetPixelFormat(oglDisplay.hdc, oglSystem.format, &oglSystem.pfd);
1214 if((oglDisplay.glrc = winCreateContext(oglDisplay.hdc)))
1216 wglShareLists(oglSystem.glrc, oglDisplay.glrc);
1217 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
1221 ReleaseDC(display.window, oglDisplay.hdc);
1222 #elif defined(__unix__) || defined(__APPLE__)
1223 # if defined(__ANDROID__) || defined(__EMSCRIPTEN__) || defined(__ODROID__)
1226 XVisualInfo * visualInfo = ((XWindowData)display.windowDriverData).visual;
1228 #if defined(__APPLE__)
1229 XVisualInfo template = { 0 };
1230 XWindowAttributes winAttr;
1232 XGetWindowAttributes(xGlobalDisplay, (X11Window)display.window, &winAttr);
1233 template.visualid = XVisualIDFromVisual(winAttr.visual);
1234 visualInfo = XGetVisualInfo(xGlobalDisplay, VisualIDMask, &template, &n);
1236 printf("XGetVisualInfo visual ID = %d\n", template.visualid);
1237 printf("visualInfo visual ID = %d\n", visualInfo->visualid);
1238 printf("oglSystem.visualInfo visual ID = %d\n", oglSystem.visualInfo->visualid);
1239 printf("((XWindowData)display.windowDriverData).visual visual ID = %d\n", ((XWindowData)display.windowDriverData).visual->visualid);
1241 // visualInfo = oglSystem.visualInfo;
1246 //printf("visualInfo is not null\n");
1247 // printf("Creating Display Context, sharing with %x!\n", oglSystem.glContext);
1248 oglDisplay.glContext = glXCreateContext(xGlobalDisplay, visualInfo, oglSystem.glContext, True);
1249 //XFree(visualInfo);
1252 // oglDisplay.glContext = glXCreateContext(xGlobalDisplay, oglSystem.visualInfo, oglSystem.glContext, True);
1253 if(oglDisplay.glContext)
1255 //printf("CreateDisplay Got a Context\n");
1256 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
1262 #if defined(__WIN32__) || defined(USEPBUFFER)
1266 wglMakeCurrent(oglSystem.hdc, oglSystem.glrc);
1271 #if !defined(__ANDROID__) && !defined(__EMSCRIPTEN__) && !defined(__ODROID__)
1274 PrintLn("Calling ogl_LoadFunctions() in CreateDisplay()");
1276 if(ogl_LoadFunctions() == ogl_LOAD_FAILED)
1277 PrintLn("ogl_LoadFunctions() failed!");
1280 PrintLn("CheckExtensions()");
1282 CheckExtensions(oglSystem);
1283 vboAvailable = glBindBuffer != null;
1286 PrintLn("vboAvailable is: ", vboAvailable);
1295 #if defined(__EMSCRIPTEN__)
1296 emscripten_webgl_make_context_current(oglSystem.glc);
1299 initialDisplaySetup(display);
1302 if(!useSingleGLContext)
1304 #if defined(__WIN32__)
1305 wglMakeCurrent(null, null);
1306 #elif defined(__unix__) || defined(__APPLE__)
1307 #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
1310 glXMakeCurrent(xGlobalDisplay, None, null);
1316 #if defined(__ANDROID__) || defined(__EMSCRIPTEN__) || defined(__ODROID__)
1324 bool DisplaySize(Display display, int width, int height)
1326 OGLDisplay oglDisplay = display.driverData;
1328 bool result = false;
1330 //printf("Inside DisplaySize\n");
1331 #if defined(__WIN32__) || defined(USEPBUFFER)
1332 OGLSystem oglSystem = display.displaySystem.driverData;
1333 if(display.alphaBlend)
1335 #if defined(__WIN32__)
1336 const int attributes[]=
1338 /*WGL_TEXTURE_FORMAT_ARB, WGL_TEXTURE_RGBA_ARB,
1339 WGL_TEXTURE_TARGET_ARB, WGL_TEXTURE_2D_ARB, */0
1341 int pixelFormat = 0;
1342 if(wglChoosePixelFormatARB)
1346 float fAttributes[] = {0,0};
1349 //WGL_DRAW_TO_BITMAP_ARB, GL_TRUE,
1350 WGL_DRAW_TO_PBUFFER_ARB,GL_TRUE,
1351 WGL_SUPPORT_OPENGL_ARB,GL_TRUE,
1352 WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB,
1353 WGL_COLOR_BITS_ARB,24,
1354 WGL_ALPHA_BITS_ARB,8,
1355 WGL_DEPTH_BITS_ARB,16,
1356 WGL_STENCIL_BITS_ARB,0,
1357 WGL_DOUBLE_BUFFER_ARB,GL_FALSE,
1358 WGL_SAMPLE_BUFFERS_ARB,GL_TRUE,
1359 WGL_SAMPLES_ARB, 4, // Check For 4x Multisampling
1363 //Log("Found wglChoosePixelFormatARB\n");
1365 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1366 if(!valid || !numFormats)
1368 //Log("Can't find 4x multi sampling\n");
1369 iAttributes[19] = 2;
1370 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1371 if(!valid || !numFormats)
1373 // Log("Can't find 2x multi sampling\n");
1374 iAttributes[16] = 0;
1375 iAttributes[17] = 0;
1376 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1377 if(!valid || !numFormats)
1381 WGL_DRAW_TO_PBUFFER_ARB,GL_TRUE,
1382 //WGL_DRAW_TO_BITMAP_ARB,GL_TRUE,
1383 WGL_SUPPORT_OPENGL_ARB,GL_TRUE,
1384 WGL_COLOR_BITS_ARB,24,
1385 WGL_ALPHA_BITS_ARB,8,
1386 WGL_DEPTH_BITS_ARB,16,
1389 valid = wglChoosePixelFormatARB(oglSystem.hdc,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
1393 if(valid && numFormats)
1395 wglMakeCurrent(null, null);
1399 wglMakeCurrent( null, null );
1400 wglMakeCurrent( oglDisplay.hdc, oglDisplay.glrc );
1401 if(oglDisplay.hdc && oglDisplay.pBuffer)
1402 wglReleasePbufferDCARB(oglDisplay.pBuffer, oglDisplay.hdc);
1404 wglDestroyPbufferARB(oglDisplay.pBuffer);
1406 if(!useSingleGLContext)
1407 wglMakeCurrent( null, null );
1410 wglDeleteContext(oglDisplay.glrc);
1412 oglDisplay.pBuffer = wglCreatePbufferARB(oglSystem.hdc, pixelFormat, width, height, attributes);
1413 oglDisplay.hdc = wglGetPbufferDCARB(oglDisplay.pBuffer);
1414 if((oglDisplay.glrc = winCreateContext(oglDisplay.hdc)))
1417 HDC hdc = GetDC(display.window);
1419 wglShareLists(oglSystem.glrc, oglDisplay.glrc);
1420 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
1422 //wglQueryPbufferARB(pBuffer, WGL_PBUFFER_WIDTH_ARB, &width);
1423 //wglQueryPbufferARB(pBuffer, WGL_PBUFFER_HEIGHT_ARB, &height);
1425 // glDeleteBuffersARB(2, oglDisplay.imageBuffers);
1427 if((info = (BITMAPINFO *)new0 byte[sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256]))
1431 if(oglDisplay.memDC) DeleteDC(oglDisplay.memDC);
1432 oglDisplay.memDC = CreateCompatibleDC(hdc);
1433 SetMapMode(oglDisplay.memDC, MM_TEXT);
1434 info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
1435 info->bmiHeader.biPlanes = 1;
1436 info->bmiHeader.biCompression = BI_RGB;
1437 info->bmiHeader.biBitCount = 32; //(uint16)GetDeviceCaps(hdc, BITSPIXEL);
1438 info->bmiHeader.biWidth = width;
1439 info->bmiHeader.biHeight = height;
1440 newBitmap = CreateDIBSection(hdc, info, DIB_RGB_COLORS, &oglDisplay.picture, null, 0);
1443 SelectObject(oglDisplay.memDC, newBitmap);
1444 if(oglDisplay.memBitmap) DeleteObject(oglDisplay.memBitmap);
1447 PIXELFORMATDESCRIPTOR pfd = { 0 };
1448 pfd.nSize = (short)sizeof(pfd);
1450 pfd.dwFlags = PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL;
1451 pfd.iPixelType = PFD_TYPE_RGBA;
1452 pfd.cColorBits = 32;
1453 //pfd.cAlphaBits = 8;
1454 pfd.cDepthBits = 24;
1455 pfd.iLayerType = PFD_MAIN_PLANE;
1457 oglDisplay.hdc = oglDisplay.memDC;
1459 pixelFormat = ChoosePixelFormat(oglSystem.hdc, &pfd);
1460 DescribePixelFormat(oglDisplay.hdc, pixelFormat, sizeof(pfd), &pfd);
1461 SetPixelFormat(oglDisplay.hdc, pixelFormat, &pfd);
1463 oglDisplay.glrc = wglCreateContext(oglDisplay.hdc);
1464 wglShareLists(oglSystem.glrc, oglDisplay.glrc);
1465 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
1470 const int imageSize = width * height * 4;
1472 glGenBuffersARB(2, oglDisplay.imageBuffers);
1474 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[0]);
1475 glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, imageSize, null, GL_STREAM_READ);
1476 // glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[1]);
1477 // glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, imageSize / 2, null, GL_STREAM_READ);
1480 oglDisplay.memBitmap = newBitmap;
1481 oglDisplay.stride = width;
1487 ReleaseDC(display.window, hdc);
1489 #elif defined(__unix__) || defined(__APPLE__)
1490 #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
1495 GLX_DOUBLEBUFFER, True,
1501 GLX_STENCIL_SIZE, 1,
1502 //GLX_DEPTH_SIZE, 24,
1503 GLX_RENDER_TYPE, GLX_RGBA_BIT,
1504 GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT | GLX_WINDOW_BIT,
1510 GLX_PBUFFER_WIDTH, width,
1511 GLX_PBUFFER_HEIGHT, height,
1512 GLX_LARGEST_PBUFFER, False,
1516 // choose a pixel format that meets our minimum requirements
1519 GLXFBConfig *config = glXChooseFBConfig(xGlobalDisplay, DefaultScreen(xGlobalDisplay), attrib, &count);
1522 if(oglDisplay.pixmap)
1524 XFreePixmap(xGlobalDisplay, oglDisplay.pixmap);
1525 oglDisplay.pixmap = None;
1527 if(oglDisplay.shapePixmap)
1529 XFreePixmap(xGlobalDisplay, oglDisplay.shapePixmap);
1530 oglDisplay.shapePixmap = None;
1533 // Free Shared Memory Pixmap
1534 if(oglDisplay.image)
1536 if(oglDisplay.shminfoShape.shmid != -1)
1538 XShmDetach(xGlobalDisplay, &oglDisplay.shminfo);
1539 if(oglDisplay.shminfo.shmaddr != (void *)-1)
1540 shmdt(oglDisplay.shminfo.shmaddr);
1541 shmctl(oglDisplay.shminfo.shmid, IPC_RMID, 0);
1543 XDestroyImage(oglDisplay.image);
1544 oglDisplay.image = None;
1546 if(oglDisplay.shapeImage)
1548 if(oglDisplay.shminfoShape.shmid != -1)
1550 XShmDetach(xGlobalDisplay, &oglDisplay.shminfoShape);
1551 if(oglDisplay.shminfoShape.shmaddr != (void *)-1)
1552 shmdt(oglDisplay.shminfoShape.shmaddr);
1553 shmctl(oglDisplay.shminfoShape.shmid, IPC_RMID, 0);
1555 XDestroyImage(oglDisplay.shapeImage);
1556 oglDisplay.shapeImage = None;
1559 if(oglDisplay.windowPicture)
1560 XRenderFreePicture(xGlobalDisplay, oglDisplay.windowPicture);
1561 if(oglDisplay.pixmapPicture)
1562 XRenderFreePicture(xGlobalDisplay, oglDisplay.pixmapPicture);
1564 if(oglDisplay.pixmap)
1565 XFreePixmap(xGlobalDisplay, oglDisplay.pixmap);
1567 if(oglDisplay.glContext)
1568 glXDestroyContext(xGlobalDisplay, oglDisplay.glContext);
1569 if(oglDisplay.pBuffer)
1570 glXDestroyPbuffer(xGlobalDisplay, oglDisplay.pBuffer);
1572 oglDisplay.pBuffer = glXCreatePbuffer(xGlobalDisplay, config[0], PBattrib);
1573 if(oglDisplay.pBuffer)
1575 oglDisplay.glContext = glXCreateNewContext(xGlobalDisplay, config[0], GLX_RGBA_TYPE, oglSystem.glContext, True);
1576 if(oglDisplay.glContext)
1578 glXMakeCurrent(xGlobalDisplay, None, null);
1579 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
1581 // Initialize Shared Memory Pixmap
1582 oglDisplay.image = XShmCreateImage(xGlobalDisplay, DefaultVisual(xGlobalDisplay, DefaultScreen(xGlobalDisplay)), 32,
1583 ZPixmap, null, &oglDisplay.shminfo, width, height);
1584 if(oglDisplay.image)
1586 oglDisplay.shminfo.shmid = shmget(IPC_PRIVATE,
1587 oglDisplay.image->bytes_per_line * oglDisplay.image->height, IPC_CREAT|0777);
1588 if(oglDisplay.shminfo.shmid != -1)
1590 oglDisplay.shminfo.shmaddr = shmat(oglDisplay.shminfo.shmid, 0, 0);
1591 if(oglDisplay.shminfo.shmaddr != (void *)-1)
1593 oglDisplay.shminfo.readOnly = False;
1594 if(XShmAttach(xGlobalDisplay, &oglDisplay.shminfo))
1596 oglDisplay.pixmap = XShmCreatePixmap(xGlobalDisplay, (X11Window)display.window, oglDisplay.shminfo.shmaddr,
1597 &oglDisplay.shminfo, width, height, 32);
1599 // Initialize Shared Memory Shape Pixmap
1600 oglDisplay.shapeImage = XShmCreateImage(xGlobalDisplay, DefaultVisual(xGlobalDisplay, DefaultScreen(xGlobalDisplay)), 1,
1601 ZPixmap, null, &oglDisplay.shminfoShape, width, height);
1602 if(oglDisplay.shapeImage)
1604 oglDisplay.shminfoShape.shmid = shmget(IPC_PRIVATE,
1605 oglDisplay.shapeImage->bytes_per_line * oglDisplay.shapeImage->height, IPC_CREAT|0777);
1606 if(oglDisplay.shminfoShape.shmid != -1)
1608 oglDisplay.shminfoShape.shmaddr = shmat(oglDisplay.shminfoShape.shmid, 0, 0);
1609 if(oglDisplay.shminfoShape.shmaddr != (void *)-1)
1611 oglDisplay.shminfoShape.readOnly = False;
1612 if(XShmAttach(xGlobalDisplay, &oglDisplay.shminfoShape))
1614 oglDisplay.shapePixmap = XShmCreatePixmap(xGlobalDisplay, (X11Window)display.window, oglDisplay.shminfoShape.shmaddr,
1615 &oglDisplay.shminfoShape, width, height, 1);
1616 //oglDisplay.shapePixmap = XCreatePixmap(xGlobalDisplay, (X11Window)display.window, width, height, 1);
1619 XRenderPictureAttributes attributes = { 0 };
1620 XRenderPictFormat * format = XRenderFindStandardFormat(xGlobalDisplay, /*PictStandardRGB24*/ PictStandardARGB32);
1621 #if !defined(__APPLE__)
1622 attributes.repeat = RepeatNormal;
1624 attributes.repeat = 1;
1626 oglDisplay.pixmapPicture = XRenderCreatePicture(xGlobalDisplay, oglDisplay.pixmap, format, CPRepeat, &attributes);
1627 oglDisplay.windowPicture = XRenderCreatePicture(xGlobalDisplay, (X11Window)display.window, format, 0, &attributes);
1628 oglDisplay.shapePicture = XRenderCreatePicture(xGlobalDisplay, oglDisplay.shapePixmap,
1629 XRenderFindStandardFormat(xGlobalDisplay, PictStandardA1), 0, &attributes);
1632 oglDisplay.picture = oglDisplay.shminfo.shmaddr;
1633 oglDisplay.stride = oglDisplay.image->bytes_per_line / 4;
1650 CreateDisplay(display);
1651 #if defined(__WIN32__)
1652 wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
1653 #elif defined(__unix__) || defined(__APPLE__)
1654 #if defined(__ANDROID__) || defined(__ODROID__)
1657 #elif defined(__EMSCRIPTEN__)
1658 emscripten_webgl_make_context_current(oglSystem.glc);
1660 glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
1668 if(display.alphaBlend && result)
1669 initialDisplaySetup(display);
1671 if(!result && display.alphaBlend)
1673 printf("Alpha blending windows not supported on this display\n");
1680 glViewport(0,0,width,height);
1681 glMatrixMode(MatrixMode::projection);
1683 glOrtho(0,width,height,0,0.0,1.0);
1684 displayWidth = display.width = width;
1685 displayHeight = display.height = height;
1687 if(!oglDisplay.flippingBuffer || oglDisplay.flipBufW < width || oglDisplay.flipBufH < height)
1689 oglDisplay.flipBufW = width;
1690 oglDisplay.flipBufH = height;
1691 #if defined(ES1_1) || defined(ES2)
1694 oglDisplay.flippingBuffer = renew oglDisplay.flippingBuffer ColorAlpha [width * height];
1697 if(oglDisplay.flippingBuffer || !width || !height)
1703 void DisplayPosition(Display display, int x, int y)
1705 OGLDisplay oglDisplay = display.driverData;
1711 void SetPalette(Display display, ColorAlpha * palette, bool colorMatch)
1715 void RestorePalette(Display display)
1719 void StartUpdate(Display display)
1723 void EndUpdate(Display display)
1727 void Scroll(Display display, Box scroll, int x, int y, Extent dirty)
1731 void Update(Display display, Box updateBox)
1733 #if defined(__WIN32__) || defined(USEPBUFFER)
1734 OGLDisplay oglDisplay = display.driverData;
1736 //Logf("DisplayScreen\n");
1738 #if !defined(__ANDROID__)
1743 #if defined(__WIN32__) || defined(USEPBUFFER)
1744 if(display.alphaBlend)
1746 glPixelStorei(GL_PACK_ALIGNMENT, 4);
1747 glPixelStorei(GL_PACK_ROW_LENGTH, oglDisplay.stride);
1748 glPixelStorei(GL_PACK_SKIP_ROWS, 0);
1749 glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
1750 glReadPixels(0,0,display.width,display.height,GL_BGRA_EXT,GL_UNSIGNED_BYTE, oglDisplay.picture);
1753 #if defined(__WIN32__)
1755 POINT point = { oglDisplay.x, oglDisplay.y};
1756 POINT srcPoint = { 0, 0 };
1757 BLENDFUNCTION blend = { 0 };
1759 size.cx = display.width;
1760 size.cy = display.height;
1761 blend.BlendOp = AC_SRC_OVER;
1762 blend.BlendFlags = 0;
1763 blend.SourceConstantAlpha = 255;
1764 blend.AlphaFormat = AC_SRC_ALPHA;
1767 // Process partial images. Mapping the buffer waits for
1768 // outstanding DMA transfers into the buffer to finish.
1769 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[0]);
1770 oglDisplay.pboMemory1 = (byte *)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY);
1772 // glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[1]);
1773 // oglDisplay.pboMemory2 = (byte *)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB,GL_READ_ONLY);
1776 memcpy(oglDisplay.picture, oglDisplay.pboMemory1, display.width * display.height * 4);
1777 //memcpy(oglDisplay.picture + display.width * display.height * 4 / 2, oglDisplay.pboMemory2, display.width * display.height * 4/ 2);
1780 UpdateLayeredWindow(display.window, hdc, &point, &size, oglDisplay.memDC, &srcPoint, 0, &blend, ULW_ALPHA);
1783 // Unmap the image buffers
1784 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[0]);
1785 glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
1787 // glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[1]);
1788 // glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
1790 // Bind two different buffer objects and start the glReadPixels
1791 // asynchronously. Each call will return directly after
1792 // starting the DMA transfer.
1793 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[0]);
1794 glReadPixels(0, 0, display.width, display.height, GL_BGRA, GL_UNSIGNED_BYTE, 0);
1796 // glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, oglDisplay.imageBuffers[1]);
1797 // glReadPixels(0, display.height/2, display.width, display.height/2, GL_BGRA, GL_UNSIGNED_BYTE, 0);
1801 #elif defined(__unix__) || defined(__APPLE__)
1802 #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
1804 XTransform transform =
1807 { (int)(1.0f * (1<<16)), (int)(0.0f * (1<<16)), (int)(0 * (1 << 16)) },
1808 { (int)(0.0f), (int)(-1.0f * (1<<16)), (int)(0 * (1<<16)) },
1809 { (int)(0.0f * (1<<16)), (int)(0.0f * (1<<16)), (int)(1.0f * (1<<16)) }
1812 XRenderSetPictureTransform(xGlobalDisplay, oglDisplay.pixmapPicture, &transform);
1813 XRenderComposite(xGlobalDisplay, PictOpSrc, oglDisplay.pixmapPicture, None, oglDisplay.shapePicture, 0, 0, 0, 0, 0, 0, display.width, display.height);
1814 XRenderComposite(xGlobalDisplay, PictOpSrc, oglDisplay.pixmapPicture, None, oglDisplay.windowPicture, 0, 0, 0, 0, 0, 0, display.width, display.height);
1815 #if !defined(__APPLE__)
1816 XShapeCombineMask(xGlobalDisplay, (X11Window)display.window, ShapeInput, 0, 0, oglDisplay.shapePixmap, ShapeSet);
1818 XShapeCombineMask(xGlobalDisplay, display.window, 2, 0, 0, oglDisplay.shapePixmap, ShapeSet);
1820 XFlush(xGlobalDisplay);
1828 #if defined(__WIN32__)
1829 //wglSwapLayerBuffers(oglDisplay.hdc,WGL_SWAP_MAIN_PLANE);
1830 SwapBuffers(oglDisplay.hdc);
1831 //ecere::sys::Sleep(0.1);
1832 #elif defined(__unix__) || defined(__APPLE__)
1833 #if defined(__ANDROID__) || defined(__ODROID__)
1835 #elif defined(__EMSCRIPTEN__)
1837 glXSwapBuffers(xGlobalDisplay, (GLXDrawable)display.window);
1841 //Logf("Out of DisplayScreen\n");
1844 void FreeBitmap(DisplaySystem displaySystem, Bitmap bitmap)
1846 if(bitmap.driverData)
1848 GLuint tex = (GLuint)(uintptr)bitmap.driverData;
1849 glDeleteTextures(1, &tex);
1850 bitmap.driverData = 0;
1852 bitmap.driver = ((subclass(DisplayDriver))class(LFBDisplayDriver));
1855 bool AllocateBitmap(DisplaySystem displaySystem, Bitmap bitmap, int width, int height, int stride, PixelFormat format, bool allocatePalette)
1857 OGLSystem oglSystem = displaySystem.driverData;
1858 bool result = false;
1860 GLuint glBitmap = 0;
1862 uint w = width, h = height;
1863 if(oglSystem.pow2textures)
1868 w = Min(w, oglSystem.maxTextureSize);
1869 h = Min(h, oglSystem.maxTextureSize);
1871 glGenTextures(1, &glBitmap);
1872 glBindTexture(GL_TEXTURE_2D, glBitmap);
1874 glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
1876 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1877 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1879 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1880 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1882 #if !defined(SHADERS)
1883 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
1886 mipMap.Allocate(null, w, h, w, pixelFormatRGBA, false);
1888 // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
1889 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
1893 bitmap.driverData = (void *)(uintptr)glBitmap;
1894 bitmap.driver = displaySystem.driver;
1902 bool MakeDDBitmap(DisplaySystem displaySystem, Bitmap bitmap, bool mipMaps)
1904 bool result = false;
1905 OGLSystem oglSystem = displaySystem.driverData;
1906 Bitmap convBitmap = bitmap;
1910 convBitmap.Copy(bitmap);
1913 // Pre process the bitmap... First make it 32 bit
1914 if(/*bitmap.pixelFormat == pixelFormatRGBA || */convBitmap.Convert(null, pixelFormat888, null))
1917 uint w = bitmap.width, h = bitmap.height;
1918 GLuint glBitmap = 0;
1919 if(oglSystem.pow2textures)
1924 w = Min(w, oglSystem.maxTextureSize);
1925 h = Min(h, oglSystem.maxTextureSize);
1929 while(w * 2 < h) w *= 2;
1930 while(h * 2 < w) h *= 2;
1933 // Switch ARGB to RGBA
1934 //if(bitmap.format != pixelFormatRGBA)
1936 for(c=0; c<bitmap.size; c++)
1938 // ((ColorRGBA *)bitmap.picture)[c] = ((ColorAlpha *)bitmap.picture)[c];
1940 ColorAlpha color = ((ColorAlpha *)convBitmap.picture)[c];
1941 ((ColorRGBA *)convBitmap.picture)[c] = ColorRGBA { color.color.r, color.color.g, color.color.b, color.a };
1944 // convBitmap.pixelFormat = pixelFormat888;
1947 glGenTextures(1, &glBitmap);
1950 //int error = glGetError();
1954 glBindTexture(GL_TEXTURE_2D, glBitmap);
1955 glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
1957 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mipMaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
1958 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1960 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1962 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
1963 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
1965 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1966 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1967 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
1968 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0 );
1971 #if !defined(SHADERS)
1972 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
1977 for(level = 0; result && (w >= 1 || h >= 1); level++, w >>= 1, h >>= 1)
1982 if(bitmap.width != w || bitmap.height != h)
1984 mipMap = Bitmap { };
1985 if(mipMap.Allocate(null, w, h, w, convBitmap.pixelFormat, false))
1987 Surface mipSurface = mipMap.GetSurface(0,0,null);
1988 mipSurface.Filter(convBitmap, 0,0,0,0, w, h, convBitmap.width, convBitmap.height);
1998 mipMap = convBitmap;
2005 // glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
2006 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
2007 //printf("Calling glTexImage2D\n");
2008 //glGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_WIDTH, &width);
2009 //printf("width = %d (Should be %d, %d)\n", width, w, h);
2010 if((error = glGetError()))
2012 //Logf("OpenGL Bitmap MakeDD error: %d...\n", error);
2013 //printf("OpenGL Bitmap MakeDD error: %d...\n", error);
2017 if(mipMap != convBitmap)
2022 convBitmap.driver.FreeBitmap(convBitmap.displaySystem, convBitmap);
2023 bitmap.driverData = (void *)(uintptr)glBitmap;
2024 bitmap.driver = displaySystem.driver;
2029 FreeBitmap(displaySystem, bitmap);
2030 else if(oglSystem.loadingFont)
2032 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2033 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2034 oglSystem.loadingFont = false;
2040 void ReleaseSurface(Display display, Surface surface)
2042 glDisable(GL_SCISSOR_TEST);
2043 delete surface.driverData;
2044 surface.driverData = null;
2047 bool GetBitmapSurface(DisplaySystem displaySystem, Surface surface, Bitmap bitmap, int x, int y, Box clip)
2052 bool GetSurface(Display display, Surface surface, int x,int y, Box clip)
2054 bool result = false;
2055 OGLSurface oglSurface = surface.driverData = OGLSurface { };
2057 //Logf("GetSurface\n");
2061 if(displayWidth != display.width || displayHeight != display.height)
2063 displayWidth = display.width;
2064 displayHeight = display.height;
2066 glViewport(0,0,display.width,display.height);
2068 glOrtho(0,display.width,display.height,0,0.0,1.0);
2071 surface.offset.x = x;
2072 surface.offset.y = y;
2073 surface.unclippedBox = surface.box = clip;
2074 oglSurface.bitmapMult[0] = 1;
2075 oglSurface.bitmapMult[1] = 1;
2076 oglSurface.bitmapMult[2] = 1;
2077 oglSurface.bitmapMult[3] = 1;
2079 glEnable(GL_SCISSOR_TEST);
2082 (display.height) -(y+clip.bottom)-1,
2083 clip.right-clip.left+1,
2084 clip.bottom-clip.top+1);
2090 void Clip(Display display, Surface surface, Box clip)
2099 box.Clip(surface.unclippedBox);
2103 box = surface.box = surface.unclippedBox;
2104 box.left += surface.offset.x;
2105 box.top += surface.offset.y;
2106 box.right+= surface.offset.x;
2107 box.bottom += surface.offset.y;
2110 box.left,display.height - box.bottom - 1,
2111 box.right-box.left+1, box.bottom-box.top+1);
2114 bool GrabScreen(Display display, Bitmap bitmap, int x, int y, unsigned int w, unsigned int h)
2116 bool result = false;
2117 OGLDisplay oglDisplay = display.driverData;
2118 ColorAlpha * flippingBuffer = oglDisplay.flippingBuffer;
2120 if(oglDisplay.flippingBuffer)
2122 if(bitmap.pixelFormat != pixelFormat888 || bitmap.width < w || bitmap.height < h)
2125 bitmap.Allocate(null, w,h,w, pixelFormat888, false);
2131 glPixelStorei(GL_PACK_ALIGNMENT, 4);
2132 glPixelStorei(GL_PACK_ROW_LENGTH, bitmap.stride);
2133 glPixelStorei(GL_PACK_SKIP_ROWS, 0);
2134 glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
2135 glReadPixels(x,display.height-h-y,w,h,GL_BGRA_EXT,GL_UNSIGNED_BYTE, flippingBuffer);
2138 for(row = 0; row<h; row++)
2139 CopyBytesBy4(((ColorAlpha *)bitmap.picture) + row * w, ((ColorAlpha *)flippingBuffer) + (h-row-1) * w, w);
2146 void SetForeground(Display display, Surface surface, ColorAlpha color)
2148 OGLSurface oglSurface = surface.driverData;
2150 //Logf("SetForeground\n");
2152 oglSurface.foreground[0] = color.color.r/255.0f;
2153 oglSurface.foreground[1] = color.color.g/255.0f;
2154 oglSurface.foreground[2] = color.color.b/255.0f;
2155 //oglSurface.foreground[3] = 1.0f;
2156 oglSurface.foreground[3] = color.a/255.0f;
2158 //if(!oglSurface.foreground[3])printf("bug");
2161 void SetBackground(Display display, Surface surface, ColorAlpha color)
2163 OGLSurface oglSurface = surface.driverData;
2165 //Logf("SetBackground\n");
2167 oglSurface.background[0] = color.color.r/255.0f;
2168 oglSurface.background[1] = color.color.g/255.0f;
2169 oglSurface.background[2] = color.color.b/255.0f;
2170 //oglSurface.background[3] = 1.0;
2171 oglSurface.background[3] = color.a/255.0f;
2174 void SetBlitTint(Display display, Surface surface, ColorAlpha color)
2176 OGLSurface oglSurface = surface.driverData;
2178 oglSurface.bitmapMult[0] = color.color.r/255.0f;
2179 oglSurface.bitmapMult[1] = color.color.g/255.0f;
2180 oglSurface.bitmapMult[2] = color.color.b/255.0f;
2181 oglSurface.bitmapMult[3] = color.a/255.0f;
2184 ColorAlpha GetPixel(Display display, Surface surface,int x,int y)
2189 void PutPixel(Display display, Surface surface,int x,int y)
2191 OGLSurface oglSurface = surface.driverData;
2193 //Logf("PutPixel\n");
2195 glColor4fv(oglSurface.foreground);
2197 // glVertex2i(x+surface.offset.x, y+surface.offset.y);
2198 glVertex2f(x+surface.offset.x + 0.5f, y+surface.offset.y + 0.5f);
2203 void DrawLine(Display display, Surface surface, int _x1, int _y1, int _x2, int _y2)
2205 OGLSurface oglSurface = surface.driverData;
2206 float x1 = _x1, x2 = _x2, y1 = _y1, y2 = _y2;
2221 x1 += surface.offset.x;
2222 y1 += surface.offset.y;
2223 x2 += surface.offset.x;
2224 y2 += surface.offset.y;
2228 glColor4fv(oglSurface.foreground);
2230 #if defined(ES1_1) || defined(ES2) || defined(SHADERS)
2233 glTexCoord2f(0.5f, 0);
2234 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2235 glTexCoord2f(Max(x2-x1, y2-y1) + 0.5f, 0);
2236 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2245 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2246 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2252 void Rectangle(Display display, Surface surface,int x1,int y1,int x2,int y2)
2254 OGLSurface oglSurface = surface.driverData;
2255 x1 += surface.offset.x;
2256 y1 += surface.offset.y;
2257 x2 += surface.offset.x;
2258 y2 += surface.offset.y;
2260 //Logf("Rectangle\n");
2262 glColor4fv(oglSurface.foreground);
2263 #if defined(ES1_1) || defined(ES2) || defined(SHADERS)
2268 glTexCoord2f(0.5f, 0);
2269 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2270 glTexCoord2f(y2-y1 + 0.5f, 0);
2271 glVertex2f(x1 + 0.5f, y2 + 0.5f);
2273 glTexCoord2f(0.5f, 0);
2274 glVertex2f(x1 + 0.5f, y2 + 0.5f);
2275 glTexCoord2f(x2 - x1 + 0.5f, 0);
2276 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2278 glTexCoord2f(0.5f, 0);
2279 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2280 glTexCoord2f(y1 - y2 + 0.5f, 0);
2281 glVertex2f(x2 + 0.5f, y1 + 0.5f);
2283 glTexCoord2f(0.5f, 0);
2284 glVertex2f(x2 + 0.5f, y1 + 0.5f);
2285 glTexCoord2f(x1 - x2 + 0.5f, 0);
2286 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2291 glBegin(GL_LINE_LOOP);
2298 glVertex2f(x1 + 0.5f, y1 + 0.5f);
2299 glVertex2f(x1 + 0.5f, y2 + 0.5f);
2300 glVertex2f(x2 + 0.5f, y2 + 0.5f);
2301 glVertex2f(x2 + 0.5f, y1 + 0.5f);
2306 void Area(Display display, Surface surface,int x1,int y1,int x2,int y2)
2308 OGLSurface oglSurface = surface.driverData;
2311 glColor4fv(oglSurface.background);
2313 glRecti(x1+surface.offset.x, y1+surface.offset.y,
2314 x2+surface.offset.x + 1, y2+surface.offset.y + 1);
2316 glRectf(x1+surface.offset.x, y1+surface.offset.y,
2317 x2+surface.offset.x + 1, y2+surface.offset.y + 1);
2321 void Clear(Display display, Surface surface, ClearType type)
2323 OGLDisplay oglDisplay = display.driverData;
2324 OGLSurface oglSurface = surface.driverData;
2327 if(type != depthBuffer)
2328 glClearColor(oglSurface.background[0], oglSurface.background[1], oglSurface.background[2], oglSurface.background[3]);
2329 if(type != colorBuffer && !oglDisplay.depthWrite)
2331 glDepthMask((byte)bool::true);
2333 glClear(((type != depthBuffer) ? GL_COLOR_BUFFER_BIT : 0) |
2334 ((type != colorBuffer) ? GL_DEPTH_BUFFER_BIT : 0));
2335 if(type != colorBuffer && !oglDisplay.depthWrite)
2337 glDepthMask((byte)bool::false);
2341 bool ConvertBitmap(DisplaySystem displaySystem, Bitmap bitmap, PixelFormat format, ColorAlpha * palette)
2346 void Blit(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h)
2348 OGLSurface oglSurface = surface.driverData;
2350 if(!oglSurface.writingText)
2352 // glTranslatef(-0.375f, -0.375f, 0.0f);
2353 GLSetupTexturing(true);
2354 glColor4fv(oglSurface.bitmapMult);
2356 else if(oglSurface.xOffset)
2357 glTranslated(oglSurface.xOffset / 64.0/*-0.375*/, 0.0, 0.0);
2359 glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)bitmap.driverData);
2360 glBegin(GLIMTKMode::quads);
2364 glTexCoord2f((float)sx/ bitmap.width, (float)(sy-h)/ bitmap.height);
2365 glVertex2i(dx+surface.offset.x, dy+surface.offset.y);
2366 glTexCoord2f((float)(sx+w) / bitmap.width, (float)(sy-h)/ bitmap.height);
2367 glVertex2i(dx+w+surface.offset.x, dy+surface.offset.y);
2368 glTexCoord2f((float)(sx+w)/ bitmap.width, (float)sy/ bitmap.height);
2369 glVertex2i(dx+w+surface.offset.x, dy-h+surface.offset.y);
2370 glTexCoord2f((float)sx / bitmap.width, (float)sy/ bitmap.height);
2371 glVertex2i(dx+surface.offset.x, dy-h+surface.offset.y);
2376 glTexCoord2f((float)sx / bitmap.width, (float)sy/ bitmap.height);
2377 glVertex2i(dx+surface.offset.x, dy+surface.offset.y);
2378 glTexCoord2f((float)(sx+w)/ bitmap.width, (float)sy/ bitmap.height);
2379 glVertex2i(dx+w+surface.offset.x, dy+surface.offset.y);
2380 glTexCoord2f((float)(sx+w) / bitmap.width, (float)(sy+h)/ bitmap.height);
2381 glVertex2i(dx+w+surface.offset.x, dy+h+surface.offset.y);
2382 glTexCoord2f((float)sx/ bitmap.width, (float)(sy+h)/ bitmap.height);
2383 glVertex2i(dx+surface.offset.x, dy+h+surface.offset.y);
2386 glTexCoord2f((float)sx / bitmap.width, (float)sy/ bitmap.height);
2387 glVertex2f((float)dx+surface.offset.x, (float)dy+surface.offset.y);
2388 glTexCoord2f((float)(sx+w)/ bitmap.width, (float)sy/ bitmap.height);
2389 glVertex2f((float)dx+w+surface.offset.x, (float)dy+surface.offset.y);
2390 glTexCoord2f((float)(sx+w) / bitmap.width, (float)(sy+h)/ bitmap.height);
2391 glVertex2f((float)dx+w+surface.offset.x, (float)dy+h+surface.offset.y);
2392 glTexCoord2f((float)sx/ bitmap.width, (float)(sy+h)/ bitmap.height);
2393 glVertex2f((float)dx+surface.offset.x, (float)dy+h+surface.offset.y);
2397 if(!oglSurface.writingText)
2399 GLSetupTexturing(false);
2401 //glTranslate(0.375, 0.375, 0.0);
2403 else if(oglSurface.xOffset)
2404 glTranslated(-oglSurface.xOffset / 64.0/*+0.375*/, 0.0, 0.0);
2407 void Stretch(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
2409 OGLSurface oglSurface = surface.driverData;
2411 //glTranslate(-0.375, -0.375, 0.0);
2413 GLSetupTexturing(true);
2414 glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)bitmap.driverData);
2416 glColor4fv(oglSurface.bitmapMult);
2418 glBegin(GLIMTKMode::quads);
2422 glTexCoord2f((float)(sx)/ bitmap.width, (float)(sy+sh)/ bitmap.height);
2423 glVertex2i(dx+surface.offset.x, dy+surface.offset.y);
2425 glTexCoord2f((float)(sx+sw) / bitmap.width, (float)(sy+sh)/ bitmap.height);
2426 glVertex2i(dx+w+surface.offset.x, dy+surface.offset.y);
2428 glTexCoord2f((float)(sx+sw)/ bitmap.width, (float)(sy)/ bitmap.height);
2429 glVertex2i(dx+w+surface.offset.x, dy-h+surface.offset.y);
2431 glTexCoord2f((float)(sx) / bitmap.width, (float)(sy)/ bitmap.height);
2432 glVertex2i(dx+surface.offset.x, dy-h+surface.offset.y);
2436 glTexCoord2f((float)(sx) / bitmap.width, (float)(sy)/ bitmap.height);
2437 glVertex2i(dx+surface.offset.x, dy+surface.offset.y);
2439 glTexCoord2f((float)(sx+sw)/ bitmap.width, (float)(sy)/ bitmap.height);
2440 glVertex2i(dx+w+surface.offset.x, dy+surface.offset.y);
2442 glTexCoord2f((float)(sx+sw) / bitmap.width, (float)(sy+sh)/ bitmap.height);
2443 glVertex2i(dx+w+surface.offset.x, dy+h+surface.offset.y);
2445 glTexCoord2f((float)(sx)/ bitmap.width, (float)(sy+sh)/ bitmap.height);
2446 glVertex2i(dx+surface.offset.x, dy+h+surface.offset.y);
2451 GLSetupTexturing(false);
2453 //glTranslate(0.375, 0.375, 0.0);
2456 void Filter(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
2458 Stretch(display, surface, bitmap, dx, dy, sx, sy, w, h, sw, sh);
2461 void StretchDI(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
2463 float s2dw,s2dh,d2sw,d2sh;
2464 //bool flipX = false, flipY = false;
2466 //Logf("StretchDI\n");
2468 if(Sgn(w) != Sgn(sw))
2474 if(Sgn(h) != Sgn(sh))
2486 //Clip against the edges of the source
2489 dx+=(int)((0-sx) * s2dw);
2490 w-=(int)((0-sx) * s2dw);
2496 dy+=(int)((0-sy) * s2dh);
2497 h-=(int)((0-sy) * s2dh);
2502 if(sx+sw>bitmap.width-1)
2504 w-=(int)((sx+sw-(bitmap.width-1)-1)*s2dw);
2505 sw-=sx+sw-(bitmap.width-1)-1;
2507 if(sy+sh>(bitmap.height-1))
2509 h-=(int)((sy+sh-(bitmap.height-1)-1)*s2dh);
2510 sh-=sy+sh-(bitmap.height-1)-1;
2512 //Clip against the edges of the surfaceination
2513 if(dx<surface.box.left)
2516 sx+=(int)((surface.box.left-dx)*d2sw);
2517 sw-=(int)((surface.box.left-dx)*d2sw);
2518 w-=surface.box.left-dx;
2519 dx=surface.box.left;
2521 if(dy<surface.box.top)
2523 sy+=(int)((surface.box.top-dy)*d2sh);
2524 sh-=(int)((surface.box.top-dy)*d2sh);
2525 h-=surface.box.top-dy;
2528 if(dx+w>surface.box.right)
2530 //if(flip) sx+=(int)((dx+w-surface.box.right-1)*d2sw);
2531 sw-=(int)((dx+w-surface.box.right-1)*d2sw);
2532 w-=dx+w-surface.box.right-1;
2534 if(dy+h>surface.box.bottom)
2536 sh-=(int)((dy+h-surface.box.bottom-1)*d2sh);
2537 h-=dy+h-surface.box.bottom-1;
2539 if((w<=0)||(h<=0)||(sw<=0)||(sh<=0)) return;
2541 dx += surface.offset.x;
2542 dy += surface.offset.y;
2544 if(bitmap.pixelFormat == pixelFormat888 && !bitmap.paletteShades)
2546 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
2547 glPixelStorei(GL_UNPACK_ROW_LENGTH, bitmap.stride);
2548 glPixelStorei(GL_UNPACK_SKIP_PIXELS, sx);
2549 glPixelStorei(GL_UNPACK_SKIP_ROWS, sy);
2550 #if !defined(SHADERS)
2551 glRasterPos2d(dx,dy);
2552 //glPixelZoom(flipX ? -s2dw : s2dw, flipY ? s2dh : -s2dh);
2553 glPixelZoom(s2dw, -s2dh);
2554 glDrawPixels(sw,sh,GL_BGRA_EXT,GL_UNSIGNED_BYTE, bitmap.picture);
2556 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
2557 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
2558 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
2559 glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
2563 void BlitDI(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h)
2567 //Clip against the edges of the source
2580 if(sx+w>bitmap.width-1)
2581 w-=sx+w-(bitmap.width-1)-1;
2582 if(sy+h>bitmap.height-1)
2583 h-=sy+h-(bitmap.height-1)-1;
2584 //Clip against the edges of the surfaceination
2585 if(dx<surface.box.left)
2588 sx+=surface.box.left-dx;
2589 w-=surface.box.left-dx;
2590 dx=surface.box.left;
2592 if(dy<surface.box.top)
2594 sy+=surface.box.top-dy;
2595 h-=surface.box.top-dy;
2598 if(dx+w>surface.box.right)
2600 //if(flip) sx+=dx+w-surface.box.right-1;
2601 w-=dx+w-surface.box.right-1;
2603 if(dy+h>surface.box.bottom)
2604 h-=dy+h-surface.box.bottom-1;
2608 dx += surface.offset.x;
2609 dy += surface.offset.y;
2611 if(bitmap.pixelFormat == pixelFormat888 && !bitmap.paletteShades)
2613 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
2614 glPixelStorei(GL_UNPACK_ROW_LENGTH, bitmap.stride);
2615 glPixelStorei(GL_UNPACK_SKIP_PIXELS, sx);
2616 glPixelStorei(GL_UNPACK_SKIP_ROWS, sy);
2617 #if !defined(SHADERS)
2618 glRasterPos2d(dx,dy);
2620 glDrawPixels(w,h,GL_BGRA_EXT,GL_UNSIGNED_BYTE, bitmap.picture);
2622 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
2623 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
2624 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
2625 glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
2629 void FilterDI(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
2631 StretchDI(display, surface, bitmap, dx, dy, sx, sy, w, h, sw, sh);
2634 void UnloadFont(DisplaySystem displaySystem, Font font)
2636 ((subclass(DisplayDriver))class(LFBDisplayDriver)).UnloadFont(displaySystem, font);
2639 Font LoadFont(DisplaySystem displaySystem, const char * faceName, float size, FontFlags flags, float outlineSize, float outlineFade)
2642 OGLSystem oglSystem = displaySystem.driverData;
2643 oglSystem.loadingFont = true;
2644 font = ((subclass(DisplayDriver))class(LFBDisplayDriver)).LoadFont(displaySystem, faceName, size, flags, outlineSize, outlineFade);
2648 void FontExtent(DisplaySystem displaySystem, Font font, const char * text, int len, int * width, int * height, int prevGlyph, int * rPrevGlyph, int * adv)
2650 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(displaySystem, font, text, len, width, height, prevGlyph, rPrevGlyph, adv);
2653 void WriteText(Display display, Surface surface, int x, int y, const char * text, int len, int prevGlyph, int * rPrevGlyph)
2655 OGLSurface oglSurface = surface.driverData;
2656 OGLSystem oglSystem = display.displaySystem.driverData;
2657 oglSystem.loadingFont = true;
2659 //glTranslated(-0.375, -0.375, 0.0);
2663 if(surface.textOpacity)
2666 FontExtent(display.displaySystem, surface.font, text, len, &w, &h, 0, null, &adv);
2668 display.displaySystem.driver.Area(display, surface,x,y,x+w-1,y+h-1);
2671 oglSurface.writingText = true;
2673 GLSetupTexturing(true);
2675 if(surface.font.outlineSize)
2677 ColorAlpha outlineColor = surface.outlineColor;
2678 glColor4ub(outlineColor.color.r, outlineColor.color.g, outlineColor.color.b, outlineColor.a);
2679 oglSurface.writingOutline = true;
2680 ((subclass(DisplayDriver))class(LFBDisplayDriver)).WriteText(display, surface, x, y, text, len, prevGlyph, rPrevGlyph);
2681 oglSurface.writingOutline = false;
2683 glColor4fv(oglSurface.foreground);
2685 ((subclass(DisplayDriver))class(LFBDisplayDriver)).WriteText(display, surface, x, y, text, len, prevGlyph, rPrevGlyph);
2686 oglSurface.writingText = false;
2687 oglSystem.loadingFont = false;
2689 GLSetupTexturing(false);
2691 //glTranslated(0.375, 0.375, 0.0);
2694 void TextFont(Display display, Surface surface, Font font)
2696 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextFont(display, surface, font);
2699 void TextOpacity(Display display, Surface surface, bool opaque)
2701 OGLSurface oglSurface = surface.driverData;
2702 oglSurface.opaqueText = opaque;
2705 void TextExtent(Display display, Surface surface, const char * text, int len, int * width, int * height, int prevGlyph, int * rPrevGlyph, int * adv)
2707 OGLSurface oglSurface = surface.driverData;
2708 OGLSystem oglSystem = display.displaySystem.driverData;
2709 oglSystem.loadingFont = true;
2710 FontExtent(display.displaySystem, oglSurface.font, text, len, width, height, prevGlyph, rPrevGlyph, adv);
2711 oglSystem.loadingFont = false;
2714 void DrawingChar(Display display, Surface surface, char character)
2719 void LineStipple(Display display, Surface surface, uint32 stipple)
2721 //Logf("Stipple\n");
2725 #if defined(ES1_1) || defined(ES2) || defined(SHADERS)
2726 stippleEnabled = true;
2727 glesLineStipple(1, (uint16)stipple);
2729 glLineStipple(1, (uint16)stipple);
2730 glEnable(GL_LINE_STIPPLE);
2735 #if defined(ES1_1) || defined(ES2) || defined(SHADERS)
2736 stippleEnabled = false;
2737 glMatrixMode(GL_TEXTURE);
2739 glMatrixMode(MatrixMode::projection);
2740 GLSetupTexturing(false); // TODO: Special shading code for stipple?
2742 glDisable(GL_LINE_STIPPLE);
2747 #if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
2748 void SetRenderState(Display display, RenderState state, uint value)
2750 OGLDisplay oglDisplay = display.driverData;
2751 //Logf("RenderState\n");
2756 #ifndef __EMSCRIPTEN__
2758 glEnable(GL_MULTISAMPLE_ARB);
2760 glDisable(GL_MULTISAMPLE_ARB);
2764 #if !defined(ES1_1) && !defined(ES2)
2765 glPolygonMode(GL_FRONT_AND_BACK, ((FillModeValue)value == solid) ? GL_FILL : GL_LINE);
2769 if(value) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);
2772 if(value) glDepthMask((byte)bool::true); else glDepthMask((byte)bool::false);
2773 oglDisplay.depthWrite = (bool)value;
2777 float color[4] = { ((Color)value).r/255.0f, ((Color)value).g/255.0f, ((Color)value).b/255.0f, 1.0f };
2778 #if defined(SHADERS)
2779 shader_fogColor(color[0], color[1], color[2]);
2781 glFogfv(GL_FOG_COLOR, (float *)&color);
2786 #if defined(SHADERS)
2787 shader_fogDensity((float)(RenderStateFloat { ui = value }.f * nearPlane));
2789 glFogf(GL_FOG_DENSITY, (float)(RenderStateFloat { ui = value }.f * nearPlane));
2793 //#if !defined(__EMSCRIPTEN__)
2794 if(value) glEnable(GL_BLEND); else glDisable(GL_BLEND);
2799 #if defined(SHADERS)
2800 shader_setGlobalAmbient(((Color)value).r / 255.0f, ((Color)value).g / 255.0f, ((Color)value).b / 255.0f, 1.0f);
2802 float ambient[4] = { ((Color)value).r/255.0f, ((Color)value).g/255.0f, ((Color)value).b/255.0f, 1.0f };
2803 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
2809 if(value) glColorMask(1,1,1,1); else glColorMask(1,1,1,0);
2814 #if defined(__WIN32__)
2815 if(wglSwapIntervalEXT)
2816 wglSwapIntervalEXT(value ? 1 : 0);
2823 void SetLight(Display display, int id, Light light)
2825 #if defined(SHADERS)
2826 shader_setLight(display, id, light);
2828 //Logf("SetLight\n");
2832 Object lightObject = light.lightObject;
2833 float position[4] = { 0, 0, 0, 0 };
2834 float color[4] = { 0, 0, 0, 1 };
2836 glEnable(GL_LIGHT0 + id);
2838 glLightfv(GL_LIGHT0 + id, GL_DIFFUSE, (float *)&light.diffuse);
2839 glLightfv(GL_LIGHT0 + id, GL_AMBIENT, (float *)&light.ambient);
2840 glLightfv(GL_LIGHT0 + id, GL_SPECULAR,(float *)&light.specular);
2843 if(!light.multiplier) light.multiplier = 1.0f;
2845 color[0] = light.diffuse.r * light.multiplier;
2846 color[1] = light.diffuse.g * light.multiplier;
2847 color[2] = light.diffuse.b * light.multiplier;
2848 glLightfv(GL_LIGHT0 + id, GL_DIFFUSE, color);
2850 color[0] = light.ambient.r * light.multiplier;
2851 color[1] = light.ambient.g * light.multiplier;
2852 color[2] = light.ambient.b * light.multiplier;
2853 glLightfv(GL_LIGHT0 + id, GL_AMBIENT, color);
2854 color[0] = light.specular.r * light.multiplier;
2855 color[1] = light.specular.g * light.multiplier;
2856 color[2] = light.specular.b * light.multiplier;
2857 glLightfv(GL_LIGHT0 + id, GL_SPECULAR,color);
2861 Vector3D positionVector;
2862 if(light.flags.spot)
2864 if(lightObject.flags.root || !lightObject.parent)
2866 positionVector = lightObject.transform.position;
2867 positionVector.Subtract(positionVector, display.display3D.camera.cPosition);
2871 positionVector.MultMatrix(lightObject.transform.position, lightObject.parent.matrix);
2872 if(display.display3D.camera)
2873 positionVector.Subtract(positionVector, display.display3D.camera.cPosition);
2879 if(!light.direction.x && !light.direction.y && !light.direction.z)
2881 Vector3Df vector { 0,0,-1 };
2883 mat.RotationQuaternion(light.orientation);
2884 positionVector.MultMatrixf(vector, mat);
2888 positionVector = light.direction;
2893 position[0] = (float)positionVector.x;
2894 position[1] = (float)positionVector.y;
2895 position[2] = (float)positionVector.z;
2897 glLightfv(GL_LIGHT0 + id, GL_POSITION, position);
2900 // Display Light Position
2901 glDisable(GL_LIGHTING);
2902 glDisable(GL_DEPTH_TEST);
2906 glVertex3fv(position);
2908 glEnable(GL_DEPTH_TEST);
2909 glEnable(GL_LIGHTING);
2913 if(lightObject.flags.root || !lightObject.parent)
2915 positionVector = light.target.transform.position;
2916 positionVector.Subtract(positionVector, display.camera.cPosition);
2920 positionVector.MultMatrix(light.target.transform.position,
2921 lightObject.light.target.parent.matrix);
2922 positionVector.Subtract(positionVector, display.camera.cPosition);
2925 position[0] = positionVector.x;
2926 position[1] = positionVector.y;
2927 position[2] = positionVector.z;
2929 glDisable(GL_LIGHTING);
2930 glDisable(GL_DEPTH_TEST);
2934 glVertex3fv(position);
2936 glEnable(GL_DEPTH_TEST);
2937 glEnable(GL_LIGHTING);
2940 if(light.flags.attenuation)
2942 glLightf(GL_LIGHT0 + id, GL_CONSTANT_ATTENUATION, light.Kc);
2943 glLightf(GL_LIGHT0 + id, GL_LINEAR_ATTENUATION, light.Kl);
2944 glLightf(GL_LIGHT0 + id, GL_QUADRATIC_ATTENUATION, light.Kq);
2947 if(light.flags.spot)
2950 #define MAXLIGHT 0.9
2951 float direction[4] = { (float)light.direction.x, (float)light.direction.y, (float)light.direction.z, 1 };
2952 // Figure out exponent out of the hot spot
2953 exponent = (float)(log(MAXLIGHT) / log(cos((light.hotSpot / 2))));
2955 glLightfv(GL_LIGHT0 + id, GL_SPOT_DIRECTION, direction);
2956 glLightf(GL_LIGHT0 + id, GL_SPOT_CUTOFF, (float)(light.fallOff / 2));
2957 glLightf(GL_LIGHT0 + id, GL_SPOT_EXPONENT, exponent);
2962 Vector3Df vector { 0,0,-1 };
2963 Vector3Df direction;
2966 mat.RotationQuaternion(light.orientation);
2967 direction.MultMatrix(vector, mat);
2969 position[0] = direction.x;
2970 position[1] = direction.y;
2971 position[2] = direction.z;
2973 glLightfv(GL_LIGHT0 + id, GL_POSITION, position);
2977 glDisable(GL_LIGHT0 + id);
2981 void SetCamera(Display display, Surface surface, Camera camera)
2983 OGLDisplay oglDisplay = display.driverData;
2984 //Logf("SetCamera\n");
2986 if(surface && camera)
2988 int left = surface.box.left + surface.offset.x;
2989 int top = surface.box.top + surface.offset.y;
2990 int right = surface.box.right + surface.offset.x;
2991 int bottom = surface.box.bottom + surface.offset.y;
2992 float origX = surface.offset.x + camera.origin.x;
2993 float origY = surface.offset.y + camera.origin.y;
2995 int y = display.height - bottom - 1;
2996 int w = right - left + 1;
2997 int h = bottom - top + 1;
3000 glViewport(x, y, w, h);
3002 // *** Projection Matrix ***
3003 glMatrixMode(MatrixMode::projection);
3004 if(!display.display3D.camera)
3007 if(display.display3D.collectingHits)
3009 float pickX = display.display3D.pickX + surface.offset.x;
3010 float pickY = display.height - (display.display3D.pickY + surface.offset.y) - 1;
3014 w / display.display3D.pickWidth, 0, 0, 0,
3015 0, h / display.display3D.pickHeight, 0, 0,
3017 (w + 2.0f * (x - pickX)) / display.display3D.pickWidth,
3018 (h + 2.0f * (y - pickY)) / display.display3D.pickHeight, 0, 1
3021 glLoadMatrixd(pickMatrix.array);
3026 (left - origX) * camera.zMin / camera.focalX,
3027 (right - origX) * camera.zMin / camera.focalX,
3028 (bottom - origY) * camera.zMin / camera.focalY,
3029 (top - origY) * camera.zMin / camera.focalY,
3030 camera.zMin, camera.zMax);
3032 glDisable(GL_BLEND);
3034 // *** Z Inverted Identity Matrix ***
3035 glMatrixMode(MatrixMode::modelView);
3036 if(!display.display3D.camera)
3041 glScaled(1.0/nearPlane, 1.0/nearPlane, -1.0/nearPlane);
3043 // *** View Matrix ***
3044 glMultMatrixd(camera.viewMatrix.array);
3049 glEnable(GL_DEPTH_TEST);
3051 GLSetupLighting(true);
3052 #if !defined(SHADERS)
3053 glShadeModel(GL_SMOOTH);
3055 glDepthMask((byte)bool::true);
3056 oglDisplay.depthWrite = true;
3058 #ifndef __EMSCRIPTEN__
3059 glEnable(GL_MULTISAMPLE_ARB);
3062 else if(surface && display.display3D.camera)
3065 oglDisplay.depthWrite = false;
3066 glViewport(0,0,display.width,display.height);
3068 glDisable(GL_CULL_FACE);
3069 glDisable(GL_DEPTH_TEST);
3072 GLSetupTexturing(false);
3073 GLSetupLighting(false);
3076 glDisableClientState(GL_COLOR_ARRAY);
3078 #if defined(SHADERS)
3079 shader_setPerVertexColor(false);
3081 glShadeModel(GL_FLAT);
3084 #if !defined(__EMSCRIPTEN__)
3085 glDisable(GL_MULTISAMPLE_ARB);
3088 // *** Restore 2D MODELVIEW Matrix ***
3091 // *** Restore 2D PROJECTION Matrix ***
3092 glMatrixMode(MatrixMode::projection);
3098 void ApplyMaterial(Display display, Material material, Mesh mesh)
3100 //Logf("ApplyMaterial\n");
3103 if(material.flags.doubleSided)
3105 #if !defined(SHADERS)
3106 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, !material.flags.singleSideLight);
3108 glDisable(GL_CULL_FACE);
3112 #if !defined(SHADERS)
3113 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, bool::false);
3115 glEnable(GL_CULL_FACE);
3119 GLSetupFog(!material.flags.noFog);
3122 if(material.baseMap && (mesh.texCoords || mesh.flags.texCoords1))
3124 Bitmap map = material.baseMap;
3125 GLSetupTexturing(true);
3126 glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)map.driverData);
3128 glMatrixMode(GL_TEXTURE);
3130 if(material.uScale && material.vScale)
3131 glScalef(material.uScale, material.vScale, 1);
3132 glMatrixMode(MatrixMode::modelView);
3134 if(material.flags.tile)
3136 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
3137 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
3141 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3142 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3146 GLSetupTexturing(false);
3148 #if defined(SHADERS)
3149 shader_setMaterial(material, mesh.flags.colors);
3151 if(mesh.flags.colors)
3153 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
3154 glEnable(GL_COLOR_MATERIAL);
3158 glDisable(GL_COLOR_MATERIAL);
3160 float color[4] = { material.diffuse.r, material.diffuse.g, material.diffuse.b, material.opacity };
3161 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, color);
3164 float color[4] = { material.ambient.r, material.ambient.g, material.ambient.b, 0 };
3165 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, color);
3169 float color[4] = { material.specular.r, material.specular.g, material.specular.b, 0 };
3170 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, color);
3173 float color[4] = { material.emissive.r, material.emissive.g, material.emissive.b, 0 };
3174 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, color);
3177 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &material.power);
3181 void FreeMesh(DisplaySystem displaySystem, Mesh mesh)
3183 OGLMesh oglMesh = mesh.data;
3186 if(!mesh.flags.vertices)
3188 oglMesh.vertices.free();
3189 delete mesh.vertices;
3191 if(!mesh.flags.normals)
3193 oglMesh.normals.free();
3194 delete mesh.normals;
3196 if(!mesh.flags.texCoords1)
3198 oglMesh.texCoords.free();
3199 delete mesh.texCoords;
3201 if(!mesh.flags.texCoords2)
3203 oglMesh.texCoords2.free();
3204 // delete mesh.texCoords2;
3206 if(!mesh.flags.colors)
3208 oglMesh.colors.free();
3219 bool AllocateMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags, int nVertices)
3221 bool result = false;
3224 mesh.data = OGLMesh { };
3227 if(mesh.nVertices == nVertices)
3229 // Same number of vertices, adding features (Leaves the other features pointers alone)
3230 if(mesh.flags != flags)
3232 if(!mesh.flags.vertices && flags.vertices)
3234 if(flags.doubleVertices)
3236 mesh.vertices = (Vector3Df *)new Vector3D[nVertices];
3239 mesh.vertices = new Vector3Df[nVertices];
3241 if(!mesh.flags.normals && flags.normals)
3243 if(flags.doubleNormals)
3245 mesh.normals = (Vector3Df *)new Vector3D[nVertices];
3248 mesh.normals = new Vector3Df[nVertices];
3250 if(!mesh.flags.texCoords1 && flags.texCoords1)
3252 mesh.texCoords = new Pointf[nVertices];
3254 if(!mesh.flags.colors && flags.colors)
3256 mesh.colors = new ColorRGBAf[nVertices];
3262 // New number of vertices, reallocate all current and new features
3263 flags |= mesh.flags;
3266 if(flags.doubleVertices)
3268 mesh.vertices = (Vector3Df *)renew mesh.vertices Vector3D[nVertices];
3271 mesh.vertices = renew mesh.vertices Vector3Df[nVertices];
3275 if(flags.doubleNormals)
3277 mesh.normals = (Vector3Df *)renew mesh.normals Vector3D[nVertices];
3280 mesh.normals = renew mesh.normals Vector3Df[nVertices];
3282 if(flags.texCoords1)
3284 mesh.texCoords = renew mesh.texCoords Pointf[nVertices];
3288 mesh.colors = renew mesh.colors ColorRGBAf[nVertices];
3296 void UnlockMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags)
3298 OGLMesh oglMesh = mesh.data;
3299 if(!flags) flags = mesh.flags;
3304 oglMesh.vertices.upload(
3305 mesh.nVertices * (mesh.flags.doubleVertices ? sizeof(Vector3D) : sizeof(Vector3Df)), mesh.vertices); //, GL_STATIC_DRAW_ARB );
3308 oglMesh.normals.upload(
3309 mesh.nVertices * (mesh.flags.doubleNormals ? sizeof(Vector3D) : sizeof(Vector3Df)), mesh.normals); //, GL_STATIC_DRAW_ARB );
3311 if(flags.texCoords1)
3312 oglMesh.texCoords.upload(
3313 mesh.nVertices * sizeof(Pointf), mesh.texCoords); //, GL_STATIC_DRAW_ARB );
3316 oglMesh.colors.upload(
3317 mesh.nVertices * sizeof(ColorRGBAf), mesh.colors); //, GL_STATIC_DRAW_ARB );
3321 bool LockMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags)
3328 void FreeIndices(DisplaySystem displaySystem, OGLIndices oglIndices)
3332 oglIndices.buffer.free();
3333 delete oglIndices.indices;
3338 void * AllocateIndices(DisplaySystem displaySystem, int nIndices, bool indices32bit)
3340 OGLIndices oglIndices = OGLIndices { };
3343 oglIndices.indices = (void *)(indices32bit ? new uint32[nIndices] : new uint16[nIndices]);
3344 oglIndices.nIndices = nIndices;
3349 void UnlockIndices(DisplaySystem displaySystem, OGLIndices oglIndices, bool indices32bit, int nIndices)
3353 #if defined(ES1_1) || defined(ES2)
3356 if(!oglIndices.buffer.buffer)
3357 glGenBuffers(1, &oglIndices.buffer.buffer);
3358 if(glabCurElementBuffer != oglIndices.buffer.buffer)
3359 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oglIndices.buffer.buffer);
3360 glimtkBufferDatai(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32) * nIndices, oglIndices.indices, GL_STATIC_DRAW_ARB);
3364 oglIndices.buffer.upload(
3365 nIndices * (indices32bit ? sizeof(uint32) : sizeof(uint16)),
3366 oglIndices.indices); //GL_STATIC_DRAW_ARB);
3370 uint16 * LockIndices(DisplaySystem displaySystem, OGLIndices oglIndices)
3373 return oglIndices.indices;
3376 void SelectMesh(Display display, Mesh mesh)
3378 //Logf("SelectMesh\n");
3380 #if !defined( __ANDROID__) && !defined(__APPLE__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
3382 #if defined(__WIN32__)
3383 if(glUnlockArraysEXT)
3385 if(!vboAvailable && display.display3D.mesh)
3386 glUnlockArraysEXT();
3391 OGLMesh oglMesh = mesh.data;
3393 // *** Vertex Stream ***
3394 glEnableClientState(GL_VERTEX_ARRAY);
3395 if(!display.display3D.collectingHits && oglMesh)
3397 oglMesh.vertices.use(vertex, 3, (mesh.flags.doubleVertices ? GL_DOUBLE : GL_FLOAT), 0, oglMesh.vertices.buffer ? null : (double *)mesh.vertices);
3399 // *** Normals Stream ***
3400 if(mesh.normals || mesh.flags.normals)
3402 glEnableClientState(GL_NORMAL_ARRAY);
3403 oglMesh.normals.use(normal, 3, GL_FLOAT, 0, oglMesh.normals.buffer ? null : mesh.normals);
3406 glDisableClientState(GL_NORMAL_ARRAY);
3408 // *** Texture Coordinates Stream ***
3409 if(mesh.texCoords || mesh.flags.texCoords1)
3411 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
3412 oglMesh.texCoords.use(texCoord, 2, GL_FLOAT, 0, oglMesh.texCoords.buffer ? null : mesh.texCoords);
3415 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
3417 // *** Color Stream ***
3418 if(mesh.colors || mesh.flags.colors)
3420 glEnableClientState(GL_COLOR_ARRAY);
3421 oglMesh.colors.use(color, 4, GL_FLOAT, 0, oglMesh.colors.buffer ? null : mesh.colors);
3424 glDisableClientState(GL_COLOR_ARRAY);
3428 noAB.use(vertex, 3, (mesh.flags.doubleVertices ? GL_DOUBLE : GL_FLOAT), 0, (double *)mesh.vertices);
3429 if((mesh.normals || mesh.flags.normals) && !display.display3D.collectingHits)
3431 glEnableClientState(GL_NORMAL_ARRAY);
3432 noAB.use(normal, 3, GL_FLOAT, 0, mesh.normals);
3435 glDisableClientState(GL_NORMAL_ARRAY);
3436 if((mesh.texCoords || mesh.flags.texCoords1) && !display.display3D.collectingHits)
3438 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
3439 noAB.use(texCoord, 2, GL_FLOAT, 0, mesh.texCoords);
3442 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
3443 if((mesh.colors || mesh.flags.colors) && !display.display3D.collectingHits)
3445 glEnableClientState(GL_COLOR_ARRAY);
3446 noAB.use(color, 4, GL_FLOAT, 0, mesh.colors);
3449 glDisableClientState(GL_COLOR_ARRAY);
3452 #if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
3454 #if defined(__WIN32__)
3458 glLockArraysEXT(0, mesh.nVertices);
3464 void DrawPrimitives(Display display, PrimitiveSingle * primitive, Mesh mesh)
3466 //Logf("DrawPrimitives\n");
3468 if(primitive->type.vertexRange)
3469 glDrawArrays(primitiveTypes[primitive->type.primitiveType], primitive->first, primitive->nVertices);
3472 // *** Hoping the data won't be uploaded at all (Won't really work if another group of the mesh is using the mesh ) ***
3473 // HACK TO SPEED THINGS UP...
3475 /*GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
3476 if(primitive->nIndices < (mesh.nVertices >> 2) && !primitive->type.indices32bit)
3479 glBegin((GLIMTKMode)primitiveTypes[primitive->type.primitiveType]);
3482 OGLIndices oglIndices = primitive->data;
3483 MeshFeatures flags = mesh.flags;
3484 for(c = 0; c<primitive->nIndices; c++)
3486 uint16 index = ((uint16 *) oglIndices.indices)[c];
3487 if(flags.normals) glNormal3fv((float *)&mesh.normals[index]);
3488 if(flags.texCoords1) glTexCoord2fv((float *)&mesh.texCoords[index]);
3489 if(flags.colors) glColor4fv((float *)&mesh.colors[index]);
3490 glVertex3fv((float *)&mesh.vertices[index]);
3499 OGLIndices oglIndices = primitive->data;
3500 GLEAB eab = ((!display.display3D.collectingHits && oglIndices && vboAvailable) ? oglIndices.buffer : noEAB);
3501 #if defined(ES1_1) || defined(ES2)
3502 if(!vboAvailable && primitive->type.indices32bit)
3504 uint16 * temp = new uint16[primitive->nIndices];
3505 uint32 * src = (uint32 *)(oglIndices ? oglIndices.indices : primitive->indices);
3507 for(i = 0; i < primitive->nIndices; i++)
3508 temp[i] = (uint16)src[i];
3509 eab.draw(primitiveTypes[primitive->type.primitiveType], primitive->nIndices, GL_UNSIGNED_SHORT, temp);
3514 eab.draw(primitiveTypes[primitive->type.primitiveType], primitive->nIndices,
3515 primitive->type.indices32bit ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT,
3516 eab.buffer ? 0 : (oglIndices ? oglIndices.indices : primitive->indices));
3517 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
3522 void PushMatrix(Display display)
3527 void PopMatrix(Display display, bool setMatrix)
3532 void SetTransform(Display display, Matrix transMatrix, bool viewSpace, bool useCamera)
3534 Matrix matrix = transMatrix;
3535 Camera camera = useCamera ? display.display3D.camera : null;
3540 glScaled(1.0/nearPlane, 1.0/nearPlane, -1.0/nearPlane);
3545 matrix.m[3][0] - camera.cPosition.x,
3546 matrix.m[3][1] - camera.cPosition.y,
3547 matrix.m[3][2] - camera.cPosition.z);
3559 glMultMatrixd(matrix.array);
3564 public void UseSingleGLContext(bool useSingle)
3566 useSingleGLContext = useSingle;
3569 default dllexport void *
3570 #if defined(__WIN32__)
3571 __attribute__((stdcall))
3573 IS_GLGetContext(DisplaySystem displaySystem)
3577 #if defined(__WIN32__)
3578 OGLSystem system = displaySystem.driverData;
3580 #elif defined(__ANDROID__) || defined(__ODROID__)
3582 #elif defined(__EMSCRIPTEN__)
3583 OGLSystem system = displaySystem.driverData;
3584 return (void *)system.glc;
3586 OGLSystem system = displaySystem.driverData;
3587 return system.glContext;