#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
+}
+
// Non OpenGL ES friendly stuff
{
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
// 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);
// 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);
+#endif
glDepthFunc(GL_LESS);
glClearDepth(1.0);
glDisable(GL_MULTISAMPLE_ARB);
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);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-#ifndef __ANDROID__
+#if !defined(__ANDROID__) && !defined(SHADERS)
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.outline.size)
{
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(EM_MODE) && !defined(SHADERS)
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(EM_MODE) && !defined(SHADERS)
//Logf("SetLight\n");
if(light != null)
// ...
glEnable(GL_DEPTH_TEST);
-//#if !defined(EM_MODE)
+
+#if !defined(EM_MODE) && !defined(SHADERS)
glEnable(GL_LIGHTING);
glShadeModel(GL_SMOOTH);
-//#endif
+#endif
glDepthMask((byte)bool::true);
oglDisplay.depthWrite = true;
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
+ GLSetupTexturing(false);
+#if !defined(EM_MODE) && !defined(SHADERS)
glDisable(GL_LIGHTING);
glDisable(GL_FOG);
- glDisable(GL_TEXTURE_2D);
-//#if !defined(EM_MODE)
glShadeModel(GL_FLAT);
-//#endif
+#endif
glEnable(GL_BLEND);
glDisable(GL_MULTISAMPLE_ARB);
// 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(EM_MODE) || defined(SHADERS)
+ 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;
// Uniforms
int uPrjMatrix;
int uMVMatrix;
+int uTextureMatrix;
int uColor;
+int uTexturingOn;
void shader_LoadMatrixf(MatrixMode mode, float * m)
{
- if(mode == projection)
+ if(mode == texture)
+ glUniformMatrix4fv(uTextureMatrix, 1, GL_FALSE, m);
+ else if(mode == projection)
glUniformMatrix4fv(uPrjMatrix, 1, GL_FALSE, m);
else
glUniformMatrix4fv(uMVMatrix, 1, GL_FALSE, m);
glUniform4f(uColor, r, g, b, a);
}
+void shader_texturing(bool on)
+{
+ glUniform1ui(uTexturingOn, on);
+}
+
void loadShaders(const String vertexShaderFile, const String fragmentShaderFile)
{
static char compileLog[65536];
puts("--------------------------");
puts(compileLog[0] ? compileLog : "Success.");
- uPrjMatrix = glGetUniformLocation(program, "projection_matrix");
- uMVMatrix = glGetUniformLocation(program, "modelview_matrix");
- uColor = glGetUniformLocation(program, "current_color");
+ uPrjMatrix = glGetUniformLocation(program, "projection_matrix");
+ uMVMatrix = glGetUniformLocation(program, "modelview_matrix");
+ uTextureMatrix = glGetUniformLocation(program, "texture_matrix");
+ uColor = glGetUniformLocation(program, "current_color");
+ uTexturingOn = glGetUniformLocation(program, "texturingOn");
shadingProgram = program;
glUseProgram(shadingProgram);
+
+ // Initialize uniforms to defaults
+ glmsMatrixMode(texture);
+ glmsLoadIdentity();
+ glmsMatrixMode(projection);
+ glmsLoadIdentity();
+ glmsMatrixMode(modelView);
+ glmsLoadIdentity();
+ shader_color(1.0, 1.0, 1.0, 1.0);
}
}