#define GL_BGRA_EXT 0x80E1
#if !defined(__ANDROID__) && !defined(__EMSCRIPTEN__) && !defined(__ODROID__)
-# if 0 //defined(SHADERS)
+# if defined(SHADERS)
# include "gl_core_3_3.h"
# else
# include "gl_compat_4_4.h"
glGenTextures(1, &stippleTexture);
glBindTexture(GL_TEXTURE_2D, stippleTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
- glEnable(GL_TEXTURE_2D);
+
+ // TOOD: Special shading code for stippling?
+ GLSetupTexturing(true);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
public void glesLightModeli( unsigned int pname, int param )
{
-#if !defined(EM_MODE)
+#if !defined(EM_MODE) && !defined(SHADERS)
if(pname == GL_LIGHT_MODEL_TWO_SIDE)
glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, param);
#endif
};
#endif
+public void GLSetupTexturing(bool enable)
+{
+#ifdef SHADERS
+ shader_texturing(enable);
+#else
+ (enable ? glEnable : glDisable)(GL_TEXTURE_2D);
+#endif
+}
+
+public void GLSetupLighting(bool enable)
+{
+#if defined(SHADERS)
+ shader_lighting(enable);
+#elif !defined(EM_MODE)
+ (enable ? glEnable : glDisable)(GL_LIGHTING);
+#endif
+}
// Non OpenGL ES friendly stuff
{
glXMakeCurrent(xGlobalDisplay, oglSystem.glxDrawable, oglSystem.glContext);
// Setup Extensions
- CheckExtensions(oglSystem);
+ // CheckExtensions(oglSystem);
glXMakeCurrent(xGlobalDisplay, None, null);
result = true;
}
delete oglSystem;
}
+ static bool ::initialDisplaySetup(Display display)
+ {
+ bool result = true;
+ #ifdef SHADERS
+ loadShaders("<:ecere>shaders/fixed.vertex", "<:ecere>shaders/fixed.frag");
+ #endif
+ glEnableClientState(GL_VERTEX_ARRAY);
+
+ GLABBindBuffer(GL_ARRAY_BUFFER, 0);
+ GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+#if defined(__WIN32__)
+ if(glBlendFuncSeparate)
+ glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ else
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+#else
+ glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+#endif
+ glEnable(GL_BLEND);
+
+ glMatrixMode(MatrixMode::modelView);
+ glLoadIdentity(); // For setting up GLES stack
+ glScaled(1.0, 1.0, -1.0);
+ // glTranslatef(0.375f, 0.375f, 0.0f);
+ // glTranslatef(-0.625f, -0.625f, 0.0f);
+ glMatrixMode(MatrixMode::projection);
+#if !defined(EM_MODE) && !defined(SHADERS)
+ glShadeModel(GL_FLAT);
+
+ // #define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
+
+ // glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
+
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
+ glFogi(GL_FOG_MODE, GL_EXP);
+ glFogf(GL_FOG_DENSITY, 0);
+ glEnable(GL_NORMALIZE);
+#endif
+ glDepthFunc(GL_LESS);
+ glClearDepth(1.0);
+ glDisable(GL_MULTISAMPLE_ARB);
+#if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
+ display.ambient = Color { 50,50,50 };
+#endif
+ return result;
+ }
+
bool CreateDisplay(Display display)
{
bool result = false;
{
wglShareLists(oglSystem.glrc, oglDisplay.glrc);
wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
-
- // Had to recreate the context here ? (Alpha blending visual)
-
- ogl_LoadFunctions();
- CheckExtensions(oglSystem);
- vboAvailable = glBindBuffer != null;
-
- setupDebugging();
- #ifdef SHADERS
- loadShaders("<:ecere>shaders/fixed.vertex", "<:ecere>shaders/fixed.frag");
- #endif
- glEnableClientState(GL_VERTEX_ARRAY);
-
result = true;
}
else
}
#if defined(__WIN32__) || defined(USEPBUFFER)
else
+ {
result = true;
+ wglMakeCurrent(oglSystem.hdc, oglSystem.glrc);
+ }
#endif
if(result)
{
CheckExtensions(oglSystem);
vboAvailable = glBindBuffer != null;
setupDebugging();
- #ifdef SHADERS
- loadShaders("<:ecere>shaders/fixed.vertex", "<:ecere>shaders/fixed.frag");
- #endif
- glEnableClientState(GL_VERTEX_ARRAY);
-
- GLABBindBuffer(GL_ARRAY_BUFFER, 0);
- GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-
-#if defined(__WIN32__)
- if(glBlendFuncSeparate)
- glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
- else
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-#else
- glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
-#endif
- glEnable(GL_BLEND);
-
- glMatrixMode(MatrixMode::modelView);
- glLoadIdentity(); // For setting up GLES stack
- glScaled(1.0, 1.0, -1.0);
- // glTranslatef(0.375f, 0.375f, 0.0f);
- // glTranslatef(-0.625f, -0.625f, 0.0f);
- glMatrixMode(MatrixMode::projection);
- glShadeModel(GL_FLAT);
-
- // glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, true);
-#if !defined(EM_MODE)
- glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
-#endif
- glFogi(GL_FOG_MODE, GL_EXP);
- glFogf(GL_FOG_DENSITY, 0);
- glEnable(GL_NORMALIZE);
- glDepthFunc(GL_LESS);
- glClearDepth(1.0);
- glDisable(GL_MULTISAMPLE_ARB);
+ initialDisplaySetup(display);
}
-#if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
- display.ambient = Color { 50,50,50 };
-#endif
if(!useSingleGLContext)
{
else
#endif
result = true;
+
+ if(display.alphaBlend && result)
+ initialDisplaySetup(display);
+
if(!result && display.alphaBlend)
{
printf("Alpha blending windows not supported on this display\n");
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+#if !defined(SHADERS)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+#endif
mipMap.Allocate(null, w, h, w, pixelFormatRGBA, false);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0 );
#endif
+#if !defined(SHADERS)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+#endif
result = true;
if(!oglSurface.writingText)
{
// glTranslatef(-0.375f, -0.375f, 0.0f);
- glEnable(GL_TEXTURE_2D);
+ GLSetupTexturing(true);
glColor4fv(oglSurface.bitmapMult);
}
else if(oglSurface.xOffset)
if(!oglSurface.writingText)
{
- glDisable(GL_TEXTURE_2D);
+ GLSetupTexturing(false);
//glTranslate(0.375, 0.375, 0.0);
}
//glTranslate(-0.375, -0.375, 0.0);
- glEnable(GL_TEXTURE_2D);
+ GLSetupTexturing(true);
glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)bitmap.driverData);
glColor4fv(oglSurface.bitmapMult);
glEnd();
- glDisable(GL_TEXTURE_2D);
+ GLSetupTexturing(false);
//glTranslate(0.375, 0.375, 0.0);
}
glPixelStorei(GL_UNPACK_ROW_LENGTH, bitmap.stride);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, sx);
glPixelStorei(GL_UNPACK_SKIP_ROWS, sy);
+#if !defined(SHADERS)
glRasterPos2d(dx,dy);
//glPixelZoom(flipX ? -s2dw : s2dw, flipY ? s2dh : -s2dh);
glPixelZoom(s2dw, -s2dh);
glDrawPixels(sw,sh,GL_BGRA_EXT,GL_UNSIGNED_BYTE, bitmap.picture);
+#endif
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
glPixelStorei(GL_UNPACK_ROW_LENGTH, bitmap.stride);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, sx);
glPixelStorei(GL_UNPACK_SKIP_ROWS, sy);
+#if !defined(SHADERS)
glRasterPos2d(dx,dy);
glPixelZoom(1,-1);
glDrawPixels(w,h,GL_BGRA_EXT,GL_UNSIGNED_BYTE, bitmap.picture);
+#endif
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
oglSurface.writingText = true;
- glEnable(GL_TEXTURE_2D);
+ GLSetupTexturing(true);
+
if(surface.font.outlineSize)
{
ColorAlpha outlineColor = surface.outlineColor;
oglSurface.writingText = false;
oglSystem.loadingFont = false;
- glDisable(GL_TEXTURE_2D);
+ GLSetupTexturing(false);
//glTranslated(0.375, 0.375, 0.0);
}
}
else
{
-#if defined(ES1_1) || defined(EM_MODE)
+#if defined(ES1_1) || defined(EM_MODE) || defined(SHADERS)
stippleEnabled = false;
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMatrixMode(MatrixMode::projection);
- glDisable(GL_TEXTURE_2D);
+ GLSetupTexturing(false); // TODO: Special shading code for stipple?
#else
glDisable(GL_LINE_STIPPLE);
#endif
break;
case fogColor:
{
+#if !defined(SHADERS)
float color[4] = { ((Color)value).r/255.0f, ((Color)value).g/255.0f, ((Color)value).b/255.0f, 1.0f };
glFogfv(GL_FOG_COLOR, (float *)&color);
+#endif
break;
}
case fogDensity:
+#if !defined(SHADERS)
glFogf(GL_FOG_DENSITY, (float)(RenderStateFloat { ui = value }.f * nearPlane));
+#endif
break;
case blend:
if(value) glEnable(GL_BLEND); else glDisable(GL_BLEND);
break;
case ambient:
{
-#if !defined(EM_MODE)
+#if defined(SHADERS)
+ shader_setGlobalAmbient(((Color)value).r / 255.0f, ((Color)value).g / 255.0f, ((Color)value).b / 255.0f, 1.0f);
+#elif !defined(EM_MODE)
float ambient[4] = { ((Color)value).r/255.0f, ((Color)value).g/255.0f, ((Color)value).b/255.0f, 1.0f };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
#endif
void SetLight(Display display, int id, Light light)
{
-#if !defined(EM_MODE)
+#if defined(SHADERS)
+ shader_setLight(display, id, light);
+#elif !defined(EM_MODE)
//Logf("SetLight\n");
if(light != null)
}
else
{
-
Vector3Df vector { 0,0,-1 };
Vector3Df direction;
Matrix mat;
// ...
glEnable(GL_DEPTH_TEST);
-#if !defined(EM_MODE)
- glEnable(GL_LIGHTING);
+
+ GLSetupLighting(true);
+#if !defined(EM_MODE) && !defined(SHADERS)
glShadeModel(GL_SMOOTH);
#endif
glDepthMask((byte)bool::true);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
- glDisable(GL_LIGHTING);
+
+ GLSetupTexturing(false);
+ GLSetupLighting(false);
+#if !defined(SHADERS) && !defined(EM_MODE)
glDisable(GL_FOG);
- glDisable(GL_TEXTURE_2D);
-#if !defined(EM_MODE)
glShadeModel(GL_FLAT);
#endif
glEnable(GL_BLEND);
// Basic Properties
if(material.flags.doubleSided)
{
-#if !defined(EM_MODE)
+#if !defined(EM_MODE) && !defined(SHADERS)
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, !material.flags.singleSideLight);
#endif
glDisable(GL_CULL_FACE);
}
else
{
-#if !defined(EM_MODE)
+#if !defined(EM_MODE) && !defined(SHADERS)
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, bool::false);
#endif
glEnable(GL_CULL_FACE);
}
+#if !defined(SHADERS)
// Fog
if(material.flags.noFog)
glDisable(GL_FOG);
else
glEnable(GL_FOG);
+#endif
// Maps
if(material.baseMap && (mesh.texCoords || mesh.flags.texCoords1))
{
Bitmap map = material.baseMap;
- glEnable(GL_TEXTURE_2D);
+ GLSetupTexturing(true);
glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)map.driverData);
glMatrixMode(GL_TEXTURE);
}
}
else
- glDisable(GL_TEXTURE_2D);
+ GLSetupTexturing(false);
-#ifdef EM_MODE
- glColor4f(material.diffuse.r, material.diffuse.g, material.diffuse.b, material.opacity);
+#if defined(SHADERS)
+ shader_setMaterial(material, mesh.flags.colors);
+#elif defined(EM_MODE)
+ glimtkColor4f(material.diffuse.r, material.diffuse.g, material.diffuse.b, material.opacity);
#else
if(mesh.flags.colors)
{
if(primitive->nIndices < (mesh.nVertices >> 2) && !primitive->type.indices32bit)
{
int c;
- glBegin(primitiveTypes[primitive->type.primitiveType]);
+ glBegin((GLIMTKMode)primitiveTypes[primitive->type.primitiveType]);
if(primitive->data)
{
OGLIndices oglIndices = primitive->data;