X-Git-Url: https://ecere.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ecere%2Fsrc%2Fgfx%2Fdrivers%2FOpenGLDisplayDriver.ec;h=289d9817f3f0510d0dba905199251f5dc22b47dd;hb=8d4a267a681da78408bf758106ca32be3a021dd7;hp=74e82c15880ae92699d34275a4bffc2f6bdaacf1;hpb=61998ed3e6068854d49320bcbaafed32947463c4;p=sdk diff --git a/ecere/src/gfx/drivers/OpenGLDisplayDriver.ec b/ecere/src/gfx/drivers/OpenGLDisplayDriver.ec index 74e82c1..289d981 100644 --- a/ecere/src/gfx/drivers/OpenGLDisplayDriver.ec +++ b/ecere/src/gfx/drivers/OpenGLDisplayDriver.ec @@ -379,6 +379,7 @@ class OGLDisplay : struct bool depthWrite; int x, y; uint vao; + int maxTMU; #if defined(__WIN32__) HDC hdc; @@ -525,26 +526,6 @@ static HGLRC winCreateContext(HDC hdc, int * contextVersion, bool * isCompatible } #endif -#if ENABLE_GL_FFP -static int maxTMU = 0; - -static void disableRemainingTMUs(int lastTMU) -{ - int t; - for(t = lastTMU; t < maxTMU; t++) - { - glActiveTexture(GL_TEXTURE0 + t); - glClientActiveTexture(GL_TEXTURE0 + t); - glDisable(GL_TEXTURE_2D); - glDisable(GL_TEXTURE_CUBE_MAP); - GLDisableClientState(TEXCOORDS); - } - glActiveTexture(GL_TEXTURE0); - glClientActiveTexture(GL_TEXTURE0); - maxTMU = lastTMU; -} -#endif - class OpenGLDisplayDriver : DisplayDriver { class_property(name) = "OpenGL"; @@ -724,7 +705,7 @@ class OpenGLDisplayDriver : DisplayDriver vao = glBindVertexArray != null && !oglDisplay.compat; #endif #if ENABLE_GL_FBO - shaders = glBindFramebuffer != null; + frameBuffer = glBindFramebuffer != null; #endif vertexBuffer = glBindBuffer != null; // mapBuffer = glMapBuffer != null; @@ -1145,7 +1126,9 @@ class OpenGLDisplayDriver : DisplayDriver glDisableVertexAttribArray(GLBufferContents::vertex); glDisableVertexAttribArray(GLBufferContents::tangent1); glDisableVertexAttribArray(GLBufferContents::tangent2); +#if ENABLE_GL_VAO glBindVertexArray(0); +#endif glUseProgram(0); } #endif @@ -2705,7 +2688,7 @@ class OpenGLDisplayDriver : DisplayDriver void WriteText(Display display, Surface surface, int x, int y, const char * text, int len, int prevGlyph, int * rPrevGlyph) { - if(len && text[0]) + if(len && text[0] && surface.font) { OGLSurface oglSurface = surface.driverData; OGLSystem oglSystem = display.displaySystem.driverData; @@ -2813,6 +2796,24 @@ class OpenGLDisplayDriver : DisplayDriver } } } +#if ENABLE_GL_FFP + void ::disableRemainingTMUs(Display display, int lastTMU) + { + OGLDisplay oglDisplay = display.driverData; + int t; + for(t = lastTMU; t < oglDisplay.maxTMU; t++) + { + glActiveTexture(GL_TEXTURE0 + t); + glClientActiveTexture(GL_TEXTURE0 + t); + glDisable(GL_TEXTURE_2D); + glDisable(GL_TEXTURE_CUBE_MAP); + GLDisableClientState(TEXCOORDS); + } + glActiveTexture(GL_TEXTURE0); + glClientActiveTexture(GL_TEXTURE0); + oglDisplay.maxTMU = lastTMU; + } +#endif #if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA) void SetRenderState(Display display, RenderState state, uint value) @@ -3181,15 +3182,18 @@ class OpenGLDisplayDriver : DisplayDriver #endif // *** Restore 2D MODELVIEW Matrix *** + GLMatrixMode(MatrixMode::modelView); + GLPopMatrix(); + + // *** Restore 2D TEXTURE Matrix *** + GLMatrixMode(MatrixMode::texture); GLPopMatrix(); // *** Restore 2D PROJECTION Matrix *** GLMatrixMode(MatrixMode::projection); GLPopMatrix(); - // *** Restore 2D TEXTURE Matrix *** - GLMatrixMode(MatrixMode::texture); - GLPopMatrix(); + // NOTE: We expect the 2D projection matrix to be the active one for GetSurface to call glOrtho() #if ENABLE_GL_SHADERS if(glCaps_shaders) @@ -3199,8 +3203,9 @@ class OpenGLDisplayDriver : DisplayDriver #if ENABLE_GL_FFP if(!glCaps_shaders) { - disableRemainingTMUs(1); + disableRemainingTMUs(display, 0); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glDisable(GL_TEXTURE_CUBE_MAP); #if _GLES glDisable(GL_TEXTURE_GEN_STR); @@ -3432,11 +3437,8 @@ class OpenGLDisplayDriver : DisplayDriver #if ENABLE_GL_FFP if(!glCaps_shaders) { - if(tmu > 1) - { - oglMesh.texCoords.use(texCoord, 2, GL_FLOAT, 0, oglMesh.texCoords.buffer ? null : mesh.texCoords); - GLEnableClientState(TEXCOORDS); - } + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + /* // This did not have the desired effect with a GL_ALPHA texture glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); @@ -3448,6 +3450,7 @@ class OpenGLDisplayDriver : DisplayDriver glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); + */ if(flags.cubeMap) { @@ -3470,6 +3473,8 @@ class OpenGLDisplayDriver : DisplayDriver glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); #endif + + GLDisableClientState(TEXCOORDS); } else { @@ -3480,6 +3485,10 @@ class OpenGLDisplayDriver : DisplayDriver glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); #endif + + if(tmu > 1) + oglMesh.texCoords.use(texCoord, 2, GL_FLOAT, 0, oglMesh.texCoords.buffer ? null : mesh.texCoords); + GLEnableClientState(TEXCOORDS); } glClientActiveTexture(GL_TEXTURE0); } @@ -3590,21 +3599,13 @@ class OpenGLDisplayDriver : DisplayDriver GLMatrixMode(MatrixMode::texture); { - double * s = display.display3D.camera.inverseTranspose.array; - Quaternion q = display.display3D.camera.cOrientation; - Matrix mat; - Euler e = q; - //e.yaw *= -1; - q = e; - mat.RotationQuaternion(q); - mat.Scale(2,-2,-2); - s = mat.array; - + double * s = display.display3D.camera.viewMatrix.array; + double k = 2.0; Matrix m { { - s[0],s[1],s[2],0, - s[4],s[5],s[6],0, - s[8],s[9],s[10],0, + k*s[0],-k*s[4],-k*s[8], 0, + k*s[1],-k*s[5],-k*s[9], 0, + k*s[2],-k*s[6],-k*s[10],0, 0,0,0,1 } }; GLLoadMatrixd(m.array); @@ -3679,7 +3680,7 @@ class OpenGLDisplayDriver : DisplayDriver #if ENABLE_GL_FFP if(!glCaps_shaders) { - disableRemainingTMUs(tmu); + disableRemainingTMUs(display, tmu); if(mesh.flags.colors) { @@ -3723,40 +3724,42 @@ class OpenGLDisplayDriver : DisplayDriver if(oglMesh) { OGLSystem oglSystem = displaySystem.driverData; + GLCapabilities caps = glCaps; SETCAPS(oglSystem.capabilities); + if(!mesh.flags.vertices) { - oglMesh.vertices.free(glCaps_vertexBuffer); + oglMesh.vertices.free(); delete mesh.vertices; } if(!mesh.flags.normals) { - oglMesh.normals.free(glCaps_vertexBuffer); + oglMesh.normals.free(); delete mesh.normals; } if(!mesh.flags.tangents) { - oglMesh.tangents.free(glCaps_vertexBuffer); + oglMesh.tangents.free(); delete mesh.tangents; } if(!mesh.flags.lightVectors) { - oglMesh.lightVectors.free(glCaps_vertexBuffer); + oglMesh.lightVectors.free(); delete mesh.lightVectors; } if(!mesh.flags.texCoords1) { - oglMesh.texCoords.free(glCaps_vertexBuffer); + oglMesh.texCoords.free(); delete mesh.texCoords; } if(!mesh.flags.texCoords2) { - oglMesh.texCoords2.free(glCaps_vertexBuffer); + oglMesh.texCoords2.free(); // delete mesh.texCoords2; } if(!mesh.flags.colors) { - oglMesh.colors.free(glCaps_vertexBuffer); + oglMesh.colors.free(); delete mesh.colors; } if(!mesh.flags) @@ -3764,6 +3767,7 @@ class OpenGLDisplayDriver : DisplayDriver delete oglMesh; mesh.data = null; } + SETCAPS(caps); } } @@ -3863,7 +3867,9 @@ class OpenGLDisplayDriver : DisplayDriver void UnlockMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags) { OGLSystem oglSystem = displaySystem.driverData; + GLCapabilities caps = glCaps; SETCAPS(oglSystem.capabilities); + if(glCaps_vertexBuffer) { OGLMesh oglMesh = mesh.data; @@ -3890,6 +3896,7 @@ class OpenGLDisplayDriver : DisplayDriver if(flags.lightVectors) oglMesh.lightVectors.allocate(mesh.nVertices * sizeof(ColorRGB), mesh.lightVectors, staticDraw); } + SETCAPS(caps); } bool LockMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags) @@ -3902,13 +3909,16 @@ class OpenGLDisplayDriver : DisplayDriver void FreeIndices(DisplaySystem displaySystem, OGLIndices oglIndices) { OGLSystem oglSystem = displaySystem.driverData; + GLCapabilities caps = glCaps; SETCAPS(oglSystem.capabilities); + if(oglIndices) { - oglIndices.buffer.free(glCaps_vertexBuffer); + oglIndices.buffer.free(); delete oglIndices.indices; delete oglIndices; } + SETCAPS(caps); } void * AllocateIndices(DisplaySystem displaySystem, int nIndices, bool indices32bit) @@ -3925,7 +3935,9 @@ class OpenGLDisplayDriver : DisplayDriver void UnlockIndices(DisplaySystem displaySystem, OGLIndices oglIndices, bool indices32bit, int nIndices) { OGLSystem oglSystem = displaySystem.driverData; + GLCapabilities caps = glCaps; SETCAPS(oglSystem.capabilities); + if(glCaps_vertexBuffer) { if(!glCaps_intAndDouble && indices32bit) @@ -3956,6 +3968,7 @@ class OpenGLDisplayDriver : DisplayDriver nIndices * (indices32bit ? sizeof(uint32) : sizeof(uint16)), oglIndices.indices, staticDraw); } + SETCAPS(caps); } uint16 * LockIndices(DisplaySystem displaySystem, OGLIndices oglIndices)