ecere: Initial Emscripten support
[sdk] / ecere / src / gfx / drivers / gl3 / shading.ec
index aaf64f8..969d30e 100644 (file)
@@ -1,5 +1,6 @@
 import "Display"
 import "matrixStack"
+import "glab"
 
 #ifndef _GLES
 #define SHADERS
@@ -7,11 +8,13 @@ import "matrixStack"
 
 #if defined(SHADERS)
 
-#if defined(__ANDROID__) || defined(__EMSCRIPTEN__) || defined(__ODROID__)
+#if defined(__ANDROID__) || defined(__ODROID__)
    #include <GLES/gl.h>
 
    #define GL_INT    0x1404
    #define GL_DOUBLE 0x140A
+#elif defined(__EMSCRIPTEN__)
+   #include <GLES2/gl2.h>
 #else
 #  if defined(SHADERS)
 #     include "gl_core_3_3.h"
@@ -69,12 +72,12 @@ void shader_color(float r, float g, float b, float a)
 
 void shader_lighting(bool on)
 {
-   glUniform1ui(uLightingOn, on);
+   glUniform1i(uLightingOn, on);
 }
 
 void shader_fog(bool on)
 {
-   glUniform1ui(uFogOn, on);
+   glUniform1i(uFogOn, on);
 }
 
 void shader_fogDensity(float density)
@@ -89,13 +92,13 @@ void shader_fogColor(float r, float g, float b)
 
 void shader_texturing(bool on)
 {
-   glUniform1ui(uTexturingOn, on);
+   glUniform1i(uTexturingOn, on);
 }
 
 public void shader_setMaterial(Material material, bool perVertexColor)
 {
-   glUniform1ui(uPerVertexColor, perVertexColor);
-   glUniform1ui(uMatTwoSided, !material.flags.singleSideLight);
+   glUniform1i(uPerVertexColor, perVertexColor);
+   glUniform1i(uMatTwoSided, !material.flags.singleSideLight);
    glUniform3f(uMatDiffuse, material.diffuse.r, material.diffuse.g, material.diffuse.b);
    glUniform3f(uMatAmbient, material.ambient.r, material.ambient.g, material.ambient.b);
    glUniform3f(uMatSpecular, material.specular.r, material.specular.g, material.specular.b);
@@ -235,155 +238,165 @@ void shader_setLight(Display display, uint id, Light light)
       glUniform1i(uLightsOn[id], 0);
 }
 
-void loadShaders(const String vertexShaderFile, const String fragmentShaderFile)
+bool loadShaders(const String vertexShaderFile, const String fragmentShaderFile)
 {
-   static char compileLog[65536];
-   #define BUFFER_SIZE  4096
-   int bufferLen = BUFFER_SIZE;
-   char * buffer = new byte[BUFFER_SIZE];
-   int vsLen = 0, fsLen = 0;
-   char * vsSource = null;
-   char * psSource = null;
+   bool result = false;
    File vf = FileOpen(vertexShaderFile, read);
    File ff = FileOpen(fragmentShaderFile, read);
-
-   if(vf)
+   // printf("loading shaders %s and %s (%p and %p)\n", vertexShaderFile, fragmentShaderFile, vf, ff);
+   if(vf && ff)
    {
-      while(!vf.eof)
+      static char compileLog[65536];
+      #define BUFFER_SIZE  4096
+      int bufferLen = BUFFER_SIZE;
+      char * buffer = new byte[BUFFER_SIZE];
+      int vsLen = 0, fsLen = 0;
+      char * vsSource = null;
+      char * psSource = null;
+      if(vf)
       {
-         int count = vf.Read(buffer + vsLen, 1, BUFFER_SIZE);
-         vsLen += count;
-         if(count == BUFFER_SIZE && bufferLen < vsLen + BUFFER_SIZE)
+         while(!vf.eof)
          {
-            bufferLen = vsLen + BUFFER_SIZE;
-            buffer = renew buffer byte[bufferLen];
+            int count = vf.Read(buffer + vsLen, 1, BUFFER_SIZE);
+            vsLen += count;
+            if(count == BUFFER_SIZE && bufferLen < vsLen + BUFFER_SIZE)
+            {
+               bufferLen = vsLen + BUFFER_SIZE;
+               buffer = renew buffer byte[bufferLen];
+            }
          }
+         vsSource = new byte[vsLen+1];
+         memcpy(vsSource, buffer, vsLen);
+         vsSource[vsLen] = 0;
+         delete vf;
       }
-      vsSource = new byte[vsLen+1];
-      memcpy(vsSource, buffer, vsLen);
-      vsSource[vsLen] = 0;
-      delete vf;
-   }
-   if(ff)
-   {
-      while(!ff.eof)
+      if(ff)
       {
-         int count = ff.Read(buffer + fsLen, 1, BUFFER_SIZE);
-         fsLen += count;
-         if(count == BUFFER_SIZE && bufferLen < fsLen + BUFFER_SIZE)
+         while(!ff.eof)
          {
-            bufferLen = fsLen + BUFFER_SIZE;
-            buffer = renew buffer byte[bufferLen];
+            int count = ff.Read(buffer + fsLen, 1, BUFFER_SIZE);
+            fsLen += count;
+            if(count == BUFFER_SIZE && bufferLen < fsLen + BUFFER_SIZE)
+            {
+               bufferLen = fsLen + BUFFER_SIZE;
+               buffer = renew buffer byte[bufferLen];
+            }
          }
+         psSource = new byte[fsLen+1];
+         memcpy(psSource, buffer, fsLen);
+         psSource[fsLen] = 0;
+         delete ff;
       }
-      psSource = new byte[fsLen+1];
-      memcpy(psSource, buffer, fsLen);
-      psSource[fsLen] = 0;
-      delete ff;
-   }
-   delete buffer;
+      delete buffer;
 
-   printf("We've got OpenGL Version %s\n\n", (char *)glGetString(GL_VERSION));
-   printf("We've got Shading Language Version %s\n\n", (char *)glGetString(GL_SHADING_LANGUAGE_VERSION));
+      printf("We've got OpenGL Version %s\n\n", (char *)glGetString(GL_VERSION));
+      printf("We've got Shading Language Version %s\n\n", (char *)glGetString(GL_SHADING_LANGUAGE_VERSION));
 
-   {
-      int program = glCreateProgram();
-      int vShader = glCreateShader(GL_VERTEX_SHADER);
-      int fShader = glCreateShader(GL_FRAGMENT_SHADER);
-      const char * vptr[1] = { vsSource };
-      const char * fptr[1] = { psSource };
-      int i;
-
-      glShaderSource(vShader, 1, vptr, &vsLen);
-      glShaderSource(fShader, 1, fptr, &fsLen);
-      delete vsSource;
-      delete psSource;
-
-      glCompileShader(vShader);
-      glGetShaderInfoLog(vShader, sizeof(compileLog), null, compileLog);
-      puts("Vertex Shader Compile Log:");
-      puts("--------------------------");
-      puts(compileLog[0] ? compileLog : "Success.");
-
-      glCompileShader(fShader);
-      glGetShaderInfoLog(fShader, sizeof(compileLog), null, compileLog);
-      puts("");
-      puts("");
-      puts("Fragment Shader Compile Log:");
-      puts("--------------------------");
-      puts(compileLog[0] ? compileLog : "Success.");
-
-      glAttachShader(program, vShader);
-      glAttachShader(program, fShader);
-
-      glBindAttribLocation(program, GLBufferContents::vertex, "vertex");
-      glBindAttribLocation(program, GLBufferContents::texCoord, "texCoord");
-      glBindAttribLocation(program, GLBufferContents::color, "color");
-      glBindAttribLocation(program, GLBufferContents::normal, "normal");
-      glBindFragDataLocation(program, 0, "fragColor");
-
-      glLinkProgram(program);
-      glValidateProgram(program);
-
-      glGetProgramInfoLog(program, sizeof(compileLog), null, compileLog);
-      puts("");
-      puts("");
-      puts("Shader Program Log:");
-      puts("--------------------------");
-      puts(compileLog[0] ? compileLog : "Success.");
-
-      uPrjMatrix     = glGetUniformLocation(program, "projection_matrix");
-      uMVMatrix      = glGetUniformLocation(program, "modelview_matrix");
-      uTextureMatrix = glGetUniformLocation(program, "texture_matrix");
-      uColor         = glGetUniformLocation(program, "current_color");
-      uTexturingOn   = glGetUniformLocation(program, "texturingOn");
-      uLightingOn    = glGetUniformLocation(program, "lightingOn");
-      uFogOn         = glGetUniformLocation(program, "fogOn");
-      uFogDensity    = glGetUniformLocation(program, "fogDensity");
-      uFogColor      = glGetUniformLocation(program, "fogColor");
-      uGlobalAmbient = glGetUniformLocation(program, "globalAmbient");
-      uPerVertexColor  = glGetUniformLocation(program, "perVertexColor");
-      uMatDiffuse       = glGetUniformLocation(program, "matDiffuse");
-      uMatAmbient       = glGetUniformLocation(program, "matAmbient");
-      uMatSpecular      = glGetUniformLocation(program, "matSpecular");
-      uMatEmissive      = glGetUniformLocation(program, "matEmissive");
-      uMatPower         = glGetUniformLocation(program, "matPower");
-      uMatOpacity       = glGetUniformLocation(program, "matOpacity");
-      uMatTwoSided      = glGetUniformLocation(program, "matTwoSided");
-
-      for(i = 0; i < 8; i++)
       {
-         char name[100];
+         int program = glCreateProgram();
+         int vShader = glCreateShader(GL_VERTEX_SHADER);
+         int fShader = glCreateShader(GL_FRAGMENT_SHADER);
+         const char * vptr[1] = { vsSource };
+         const char * fptr[1] = { psSource };
+         int i;
+
+         glShaderSource(vShader, 1, vptr, &vsLen);
+         glShaderSource(fShader, 1, fptr, &fsLen);
+         delete vsSource;
+         delete psSource;
+
+         glCompileShader(vShader);
+         glGetShaderInfoLog(vShader, sizeof(compileLog), null, compileLog);
+         puts("Vertex Shader Compile Log:");
+         puts("--------------------------");
+         puts(compileLog[0] ? compileLog : "Success.");
+
+         glCompileShader(fShader);
+         glGetShaderInfoLog(fShader, sizeof(compileLog), null, compileLog);
+         puts("");
+         puts("");
+         puts("Fragment Shader Compile Log:");
+         puts("--------------------------");
+         puts(compileLog[0] ? compileLog : "Success.");
+
+         glAttachShader(program, vShader);
+         glAttachShader(program, fShader);
+
+         glBindAttribLocation(program, GLBufferContents::vertex, "vertex");
+         glBindAttribLocation(program, GLBufferContents::texCoord, "texCoord");
+         glBindAttribLocation(program, GLBufferContents::color, "color");
+         glBindAttribLocation(program, GLBufferContents::normal, "normal");
+         // glBindFragDataLocation(program, 0, "fragColor");
+
+         glLinkProgram(program);
+         glValidateProgram(program);
+
+         glGetProgramInfoLog(program, sizeof(compileLog), null, compileLog);
+         puts("");
+         puts("");
+         puts("Shader Program Log:");
+         puts("--------------------------");
+         puts(compileLog[0] ? compileLog : "Success.");
+
+         uPrjMatrix     = glGetUniformLocation(program, "projection_matrix");
+         uMVMatrix      = glGetUniformLocation(program, "modelview_matrix");
+         uTextureMatrix = glGetUniformLocation(program, "texture_matrix");
+         uColor         = glGetUniformLocation(program, "current_color");
+         uTexturingOn   = glGetUniformLocation(program, "texturingOn");
+         uLightingOn    = glGetUniformLocation(program, "lightingOn");
+         uFogOn         = glGetUniformLocation(program, "fogOn");
+         uFogDensity    = glGetUniformLocation(program, "fogDensity");
+         uFogColor      = glGetUniformLocation(program, "fogColor");
+         uGlobalAmbient = glGetUniformLocation(program, "globalAmbient");
+         uPerVertexColor  = glGetUniformLocation(program, "perVertexColor");
+         uMatDiffuse       = glGetUniformLocation(program, "matDiffuse");
+         uMatAmbient       = glGetUniformLocation(program, "matAmbient");
+         uMatSpecular      = glGetUniformLocation(program, "matSpecular");
+         uMatEmissive      = glGetUniformLocation(program, "matEmissive");
+         uMatPower         = glGetUniformLocation(program, "matPower");
+         uMatOpacity       = glGetUniformLocation(program, "matOpacity");
+         uMatTwoSided      = glGetUniformLocation(program, "matTwoSided");
+
+         for(i = 0; i < 8; i++)
+         {
+            char name[100];
 
-         sprintf(name, "lightsOn[%d]", i);
-         uLightsOn [i] = glGetUniformLocation(program, name);
+            sprintf(name, "lightsOn[%d]", i);
+            uLightsOn [i] = glGetUniformLocation(program, name);
 
-         sprintf(name, "lightsPos[%d]", i);
-         uLightsPos[i] = glGetUniformLocation(program, name);
+            sprintf(name, "lightsPos[%d]", i);
+            uLightsPos[i] = glGetUniformLocation(program, name);
 
-         sprintf(name, "lightsDiffuse[%d]", i);
-         uLightsDiffuse[i] = glGetUniformLocation(program, name);
+            sprintf(name, "lightsDiffuse[%d]", i);
+            uLightsDiffuse[i] = glGetUniformLocation(program, name);
 
-         sprintf(name, "lightsAmbient[%d]", i);
-         uLightsAmbient[i] = glGetUniformLocation(program, name);
+            sprintf(name, "lightsAmbient[%d]", i);
+            uLightsAmbient[i] = glGetUniformLocation(program, name);
 
-         sprintf(name, "lightsSpecular[%d]", i);
-         uLightsSpecular[i] = glGetUniformLocation(program, name);
-      }
+            sprintf(name, "lightsSpecular[%d]", i);
+            uLightsSpecular[i] = glGetUniformLocation(program, name);
+         }
+
+         shadingProgram = program;
 
-      shadingProgram = program;
+         glUseProgram(shadingProgram);
 
-      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);
 
-      // Initialize uniforms to defaults
-      glmsMatrixMode(texture);
-      glmsLoadIdentity();
-      glmsMatrixMode(projection);
-      glmsLoadIdentity();
-      glmsMatrixMode(modelView);
-      glmsLoadIdentity();
-      shader_color(1.0, 1.0, 1.0, 1.0);
+         result = true;
+      }
    }
+   delete vf;
+   delete ff;
+
+   return result;
 }
 
 #endif