From 57634dc46df65ee0b45cff06814d3b48243ed687 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 14 May 2020 00:07:34 +0200 Subject: [PATCH] lights for gles2 --- src/gl/gl2_shaders/default.vert | 24 +------- src/gl/gl2_shaders/default_vs_gl2.inc | 24 +------- src/gl/gl2_shaders/header.vert | 89 ++++++++++++--------------- src/gl/gl2_shaders/header_vs.inc | 89 ++++++++++++--------------- src/gl/gl2_shaders/im2d.vert | 5 -- src/gl/gl2_shaders/im2d_gl2.inc | 5 -- src/gl/gl2_shaders/matfx_env.vert | 24 +------- src/gl/gl2_shaders/matfx_gl2.inc | 24 +------- src/gl/gl2_shaders/skin.vert | 28 ++------- src/gl/gl2_shaders/skin_gl2.inc | 28 ++------- src/gl/gl3device.cpp | 88 +++++++++++++++++++++++++- src/gl/gl3shader.cpp | 7 ++- src/gl/rwgl3shader.h | 2 +- 13 files changed, 185 insertions(+), 252 deletions(-) diff --git a/src/gl/gl2_shaders/default.vert b/src/gl/gl2_shaders/default.vert index 8e89354..1abdc82 100644 --- a/src/gl/gl2_shaders/default.vert +++ b/src/gl/gl2_shaders/default.vert @@ -18,29 +18,7 @@ main(void) v_color = in_color; v_color.rgb += u_ambLight.rgb*surfAmbient; - -#ifdef DIRECTIONALS - for(int i = 0; i < MAX_LIGHTS; i++){ - if(u_directLights[i].enabled == 0.0) - break; - v_color.rgb += DoDirLight(u_directLights[i], N)*surfDiffuse; - } -#endif -#ifdef POINTLIGHTS - for(int i = 0; i < MAX_LIGHTS; i++){ - if(u_pointLights[i].enabled == 0.0) - break; - v_color.rgb += DoPointLight(u_pointLights[i], V.xyz, N)*surfDiffuse; - } -#endif -#ifdef SPOTLIGHTS - for(int i = 0; i < MAX_LIGHTS; i++){ - if(u_spotLights[i].enabled == 0.0) - break; - v_color.rgb += DoSpotLight(u_spotLights[i], V.xyz, N)*surfDiffuse; - } -#endif - + v_color.rgb += DoDynamicLight(V.xyz, N)*surfDiffuse; v_color = clamp(v_color, 0.0f, 1.0); v_color *= u_matColor; diff --git a/src/gl/gl2_shaders/default_vs_gl2.inc b/src/gl/gl2_shaders/default_vs_gl2.inc index e82f83f..d208f8d 100644 --- a/src/gl/gl2_shaders/default_vs_gl2.inc +++ b/src/gl/gl2_shaders/default_vs_gl2.inc @@ -19,29 +19,7 @@ const char *default_vert_src = " v_color = in_color;\n" " v_color.rgb += u_ambLight.rgb*surfAmbient;\n" - -"#ifdef DIRECTIONALS\n" -" for(int i = 0; i < MAX_LIGHTS; i++){\n" -" if(u_directLights[i].enabled == 0.0)\n" -" break;\n" -" v_color.rgb += DoDirLight(u_directLights[i], N)*surfDiffuse;\n" -" }\n" -"#endif\n" -"#ifdef POINTLIGHTS\n" -" for(int i = 0; i < MAX_LIGHTS; i++){\n" -" if(u_pointLights[i].enabled == 0.0)\n" -" break;\n" -" v_color.rgb += DoPointLight(u_pointLights[i], V.xyz, N)*surfDiffuse;\n" -" }\n" -"#endif\n" -"#ifdef SPOTLIGHTS\n" -" for(int i = 0; i < MAX_LIGHTS; i++){\n" -" if(u_spotLights[i].enabled == 0.0)\n" -" break;\n" -" v_color.rgb += DoSpotLight(u_spotLights[i], V.xyz, N)*surfDiffuse;\n" -" }\n" -"#endif\n" - +" v_color.rgb += DoDynamicLight(V.xyz, N)*surfDiffuse;\n" " v_color = clamp(v_color, 0.0f, 1.0);\n" " v_color *= u_matColor;\n" diff --git a/src/gl/gl2_shaders/header.vert b/src/gl/gl2_shaders/header.vert index c06233d..5312467 100644 --- a/src/gl/gl2_shaders/header.vert +++ b/src/gl/gl2_shaders/header.vert @@ -10,22 +10,14 @@ uniform mat4 u_proj; uniform mat4 u_view; #define MAX_LIGHTS 8 -struct Light { - float enabled; - float radius; - float minusCosAngle; - float hardSpot; - vec4 position; - vec4 direction; - vec4 color; -}; // Object -uniform mat4 u_world; -uniform vec4 u_ambLight; -uniform Light u_directLights[MAX_LIGHTS]; -uniform Light u_pointLights[MAX_LIGHTS]; -uniform Light u_spotLights[MAX_LIGHTS]; +uniform mat4 u_world; +uniform vec4 u_ambLight; +uniform vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot +uniform vec4 u_lightPosition[MAX_LIGHTS]; +uniform vec4 u_lightDirection[MAX_LIGHTS]; +uniform vec4 u_lightColor[MAX_LIGHTS]; uniform vec4 u_matColor; uniform vec4 u_surfProps; // amb, spec, diff, extra @@ -34,44 +26,45 @@ uniform vec4 u_surfProps; // amb, spec, diff, extra #define surfSpecular (u_surfProps.y) #define surfDiffuse (u_surfProps.z) -vec3 DoDirLight(Light L, vec3 N) +vec3 DoDynamicLight(vec3 V, vec3 N) { - float l = max(0.0, dot(N, -L.direction.xyz)); - return l*L.color.rgb; -} - -vec3 DoPointLight(Light L, vec3 V, vec3 N) -{ - // As on PS2 - vec3 dir = V - L.position.xyz; - float dist = length(dir); - float atten = max(0.0, (1.0 - dist/L.radius)); - float l = max(0.0, dot(N, -normalize(dir))); - return l*L.color.rgb*atten; -} - -vec3 DoSpotLight(Light L, vec3 V, vec3 N) -{ - // As on PS2 - vec3 dir = V - L.position.xyz; - float dist = length(dir); - float atten = max(0.0, (1.0 - dist/L.radius)); - dir /= dist; - float l = max(0.0, dot(N, -dir)); - float pcos = dot(dir, L.direction.xyz); // cos to point - float ccos = -L.minusCosAngle; - float falloff = (pcos-ccos)/(1.0-ccos); - if(falloff < 0.0) // outside of cone - l = 0.0; - l *= max(falloff, L.hardSpot); - return l*L.color.xyz*atten; + vec3 color = vec3(0.0, 0.0, 0.0); + for(int i = 0; i < MAX_LIGHTS; i++){ + if(u_lightParams[i].x == 0.0) + break; + if(u_lightParams[i].x == 1.0){ + // direct + float l = max(0.0, dot(N, -u_lightDirection[i].xyz)); + color += l*u_lightColor[i].rgb; +/* + }else if(u_lightParams[i].x == 2.0){ + // point + vec3 dir = V - u_lightPosition[i].xyz; + float dist = length(dir); + float atten = max(0.0, (1.0 - dist/u_lightParams[i].y)); + float l = max(0.0, dot(N, -normalize(dir))); + color += l*u_lightColor[i].rgb*atten; + }else if(u_lightParams[i].x == 3.0){ + // spot + vec3 dir = V - u_lightPosition[i].xyz; + float dist = length(dir); + float atten = max(0.0, (1.0 - dist/u_lightParams[i].y)); + dir /= dist; + float l = max(0.0, dot(N, -dir)); + float pcos = dot(dir, u_lightDirection[i].xyz); // cos to point + float ccos = -u_lightParams[i].z; + float falloff = (pcos-ccos)/(1.0-ccos); + if(falloff < 0.0) // outside of cone + l = 0.0; + l *= max(falloff, u_lightParams[i].w); + return l*u_lightColor[i].rgb*atten; +*/ + } + } + return color; } float DoFog(float w) { return clamp((w - u_fogEnd)*u_fogRange, u_fogDisable, 1.0); } - -#define DIRECTIONALS -//#define POINTLIGHTS -//#define SPOTLIGHTS diff --git a/src/gl/gl2_shaders/header_vs.inc b/src/gl/gl2_shaders/header_vs.inc index d4f6c97..5d99cc6 100644 --- a/src/gl/gl2_shaders/header_vs.inc +++ b/src/gl/gl2_shaders/header_vs.inc @@ -11,22 +11,14 @@ const char *header_vert_src = "uniform mat4 u_view;\n" "#define MAX_LIGHTS 8\n" -"struct Light {\n" -" float enabled;\n" -" float radius;\n" -" float minusCosAngle;\n" -" float hardSpot;\n" -" vec4 position;\n" -" vec4 direction;\n" -" vec4 color;\n" -"};\n" "// Object\n" -"uniform mat4 u_world;\n" -"uniform vec4 u_ambLight;\n" -"uniform Light u_directLights[MAX_LIGHTS];\n" -"uniform Light u_pointLights[MAX_LIGHTS];\n" -"uniform Light u_spotLights[MAX_LIGHTS];\n" +"uniform mat4 u_world;\n" +"uniform vec4 u_ambLight;\n" +"uniform vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot\n" +"uniform vec4 u_lightPosition[MAX_LIGHTS];\n" +"uniform vec4 u_lightDirection[MAX_LIGHTS];\n" +"uniform vec4 u_lightColor[MAX_LIGHTS];\n" "uniform vec4 u_matColor;\n" "uniform vec4 u_surfProps; // amb, spec, diff, extra\n" @@ -35,45 +27,46 @@ const char *header_vert_src = "#define surfSpecular (u_surfProps.y)\n" "#define surfDiffuse (u_surfProps.z)\n" -"vec3 DoDirLight(Light L, vec3 N)\n" +"vec3 DoDynamicLight(vec3 V, vec3 N)\n" "{\n" -" float l = max(0.0, dot(N, -L.direction.xyz));\n" -" return l*L.color.rgb;\n" -"}\n" - -"vec3 DoPointLight(Light L, vec3 V, vec3 N)\n" -"{\n" -" // As on PS2\n" -" vec3 dir = V - L.position.xyz;\n" -" float dist = length(dir);\n" -" float atten = max(0.0, (1.0 - dist/L.radius));\n" -" float l = max(0.0, dot(N, -normalize(dir)));\n" -" return l*L.color.rgb*atten;\n" -"}\n" - -"vec3 DoSpotLight(Light L, vec3 V, vec3 N)\n" -"{\n" -" // As on PS2\n" -" vec3 dir = V - L.position.xyz;\n" -" float dist = length(dir);\n" -" float atten = max(0.0, (1.0 - dist/L.radius));\n" -" dir /= dist;\n" -" float l = max(0.0, dot(N, -dir));\n" -" float pcos = dot(dir, L.direction.xyz); // cos to point\n" -" float ccos = -L.minusCosAngle;\n" -" float falloff = (pcos-ccos)/(1.0-ccos);\n" -" if(falloff < 0.0) // outside of cone\n" -" l = 0.0;\n" -" l *= max(falloff, L.hardSpot);\n" -" return l*L.color.xyz*atten;\n" +" vec3 color = vec3(0.0, 0.0, 0.0);\n" +" for(int i = 0; i < MAX_LIGHTS; i++){\n" +" if(u_lightParams[i].x == 0.0)\n" +" break;\n" +" if(u_lightParams[i].x == 1.0){\n" +" // direct\n" +" float l = max(0.0, dot(N, -u_lightDirection[i].xyz));\n" +" color += l*u_lightColor[i].rgb;\n" +"/*\n" +" }else if(u_lightParams[i].x == 2.0){\n" +" // point\n" +" vec3 dir = V - u_lightPosition[i].xyz;\n" +" float dist = length(dir);\n" +" float atten = max(0.0, (1.0 - dist/u_lightParams[i].y));\n" +" float l = max(0.0, dot(N, -normalize(dir)));\n" +" color += l*u_lightColor[i].rgb*atten;\n" +" }else if(u_lightParams[i].x == 3.0){\n" +" // spot\n" +" vec3 dir = V - u_lightPosition[i].xyz;\n" +" float dist = length(dir);\n" +" float atten = max(0.0, (1.0 - dist/u_lightParams[i].y));\n" +" dir /= dist;\n" +" float l = max(0.0, dot(N, -dir));\n" +" float pcos = dot(dir, u_lightDirection[i].xyz); // cos to point\n" +" float ccos = -u_lightParams[i].z;\n" +" float falloff = (pcos-ccos)/(1.0-ccos);\n" +" if(falloff < 0.0) // outside of cone\n" +" l = 0.0;\n" +" l *= max(falloff, u_lightParams[i].w);\n" +" return l*u_lightColor[i].rgb*atten;\n" +"*/\n" +" }\n" +" }\n" +" return color;\n" "}\n" "float DoFog(float w)\n" "{\n" " return clamp((w - u_fogEnd)*u_fogRange, u_fogDisable, 1.0);\n" "}\n" - -"#define DIRECTIONALS\n" -"//#define POINTLIGHTS\n" -"//#define SPOTLIGHTS\n" ; diff --git a/src/gl/gl2_shaders/im2d.vert b/src/gl/gl2_shaders/im2d.vert index d745fc6..1947785 100644 --- a/src/gl/gl2_shaders/im2d.vert +++ b/src/gl/gl2_shaders/im2d.vert @@ -16,10 +16,5 @@ main(void) v_fog = DoFog(gl_Position.z); gl_Position.xyz *= gl_Position.w; v_color = in_color; -//v_color.r = 0.0; -//v_color.g = 0.0; -//v_color.b = 0.0; -//v_color.a = 1.0; -//v_fog = 1.0; v_tex0 = in_tex0; } diff --git a/src/gl/gl2_shaders/im2d_gl2.inc b/src/gl/gl2_shaders/im2d_gl2.inc index 2120765..6e8798b 100644 --- a/src/gl/gl2_shaders/im2d_gl2.inc +++ b/src/gl/gl2_shaders/im2d_gl2.inc @@ -17,11 +17,6 @@ const char *im2d_vert_src = " v_fog = DoFog(gl_Position.z);\n" " gl_Position.xyz *= gl_Position.w;\n" " v_color = in_color;\n" -"//v_color.r = 0.0;\n" -"//v_color.g = 0.0;\n" -"//v_color.b = 0.0;\n" -"//v_color.a = 1.0;\n" -"//v_fog = 1.0;\n" " v_tex0 = in_tex0;\n" "}\n" ; diff --git a/src/gl/gl2_shaders/matfx_env.vert b/src/gl/gl2_shaders/matfx_env.vert index 02e7c8a..5cd14f3 100644 --- a/src/gl/gl2_shaders/matfx_env.vert +++ b/src/gl/gl2_shaders/matfx_env.vert @@ -22,29 +22,7 @@ main(void) v_color = in_color; v_color.rgb += u_ambLight.rgb*surfAmbient; - -#ifdef DIRECTIONALS - for(int i = 0; i < MAX_LIGHTS; i++){ - if(u_directLights[i].enabled == 0.0) - break; - v_color.rgb += DoDirLight(u_directLights[i], N)*surfDiffuse; - } -#endif -#ifdef POINTLIGHTS - for(int i = 0; i < MAX_LIGHTS; i++){ - if(u_pointLights[i].enabled == 0.0) - break; - v_color.rgb += DoPointLight(u_pointLights[i], V.xyz, N)*surfDiffuse; - } -#endif -#ifdef SPOTLIGHTS - for(int i = 0; i < MAX_LIGHTS; i++){ - if(u_spotLights[i].enabled == 0.0) - break; - v_color.rgb += DoSpotLight(u_spotLights[i], V.xyz, N)*surfDiffuse; - } -#endif - + v_color.rgb += DoDynamicLight(V.xyz, N)*surfDiffuse; v_color = clamp(v_color, 0.0f, 1.0); v_color *= u_matColor; diff --git a/src/gl/gl2_shaders/matfx_gl2.inc b/src/gl/gl2_shaders/matfx_gl2.inc index 96d8ca3..8915392 100644 --- a/src/gl/gl2_shaders/matfx_gl2.inc +++ b/src/gl/gl2_shaders/matfx_gl2.inc @@ -23,29 +23,7 @@ const char *matfx_env_vert_src = " v_color = in_color;\n" " v_color.rgb += u_ambLight.rgb*surfAmbient;\n" - -"#ifdef DIRECTIONALS\n" -" for(int i = 0; i < MAX_LIGHTS; i++){\n" -" if(u_directLights[i].enabled == 0.0)\n" -" break;\n" -" v_color.rgb += DoDirLight(u_directLights[i], N)*surfDiffuse;\n" -" }\n" -"#endif\n" -"#ifdef POINTLIGHTS\n" -" for(int i = 0; i < MAX_LIGHTS; i++){\n" -" if(u_pointLights[i].enabled == 0.0)\n" -" break;\n" -" v_color.rgb += DoPointLight(u_pointLights[i], V.xyz, N)*surfDiffuse;\n" -" }\n" -"#endif\n" -"#ifdef SPOTLIGHTS\n" -" for(int i = 0; i < MAX_LIGHTS; i++){\n" -" if(u_spotLights[i].enabled == 0.0)\n" -" break;\n" -" v_color.rgb += DoSpotLight(u_spotLights[i], V.xyz, N)*surfDiffuse;\n" -" }\n" -"#endif\n" - +" v_color.rgb += DoDynamicLight(V.xyz, N)*surfDiffuse;\n" " v_color = clamp(v_color, 0.0f, 1.0);\n" " v_color *= u_matColor;\n" diff --git a/src/gl/gl2_shaders/skin.vert b/src/gl/gl2_shaders/skin.vert index 3bd160f..fddd6a9 100644 --- a/src/gl/gl2_shaders/skin.vert +++ b/src/gl/gl2_shaders/skin.vert @@ -25,33 +25,13 @@ main(void) gl_Position = u_proj * u_view * V; vec3 N = mat3(u_world) * SkinNormal; + v_tex0 = in_tex0; + v_color = in_color; v_color.rgb += u_ambLight.rgb*surfAmbient; - -#ifdef DIRECTIONALS - for(int i = 0; i < MAX_LIGHTS; i++){ - if(u_directLights[i].enabled == 0.0) - break; - v_color.rgb += DoDirLight(u_directLights[i], N)*surfDiffuse; - } -#endif -#ifdef POINTLIGHTS - for(int i = 0; i < MAX_LIGHTS; i++){ - if(u_pointLights[i].enabled == 0.0) - break; - v_color.rgb += DoPointLight(u_pointLights[i], V.xyz, N)*surfDiffuse; - } -#endif -#ifdef SPOTLIGHTS - for(int i = 0; i < MAX_LIGHTS; i++){ - if(u_spotLights[i].enabled == 0.0) - break; - v_color.rgb += DoSpotLight(u_spotLights[i], V.xyz, N)*surfDiffuse; - } -#endif + v_color.rgb += DoDynamicLight(V.xyz, N)*surfDiffuse; + v_color = clamp(v_color, 0.0f, 1.0); v_color *= u_matColor; - v_tex0 = in_tex0; - v_fog = DoFog(gl_Position.z); } diff --git a/src/gl/gl2_shaders/skin_gl2.inc b/src/gl/gl2_shaders/skin_gl2.inc index 46c894e..61036d6 100644 --- a/src/gl/gl2_shaders/skin_gl2.inc +++ b/src/gl/gl2_shaders/skin_gl2.inc @@ -26,34 +26,14 @@ const char *skin_vert_src = " gl_Position = u_proj * u_view * V;\n" " vec3 N = mat3(u_world) * SkinNormal;\n" +" v_tex0 = in_tex0;\n" + " v_color = in_color;\n" " v_color.rgb += u_ambLight.rgb*surfAmbient;\n" - -"#ifdef DIRECTIONALS\n" -" for(int i = 0; i < MAX_LIGHTS; i++){\n" -" if(u_directLights[i].enabled == 0.0)\n" -" break;\n" -" v_color.rgb += DoDirLight(u_directLights[i], N)*surfDiffuse;\n" -" }\n" -"#endif\n" -"#ifdef POINTLIGHTS\n" -" for(int i = 0; i < MAX_LIGHTS; i++){\n" -" if(u_pointLights[i].enabled == 0.0)\n" -" break;\n" -" v_color.rgb += DoPointLight(u_pointLights[i], V.xyz, N)*surfDiffuse;\n" -" }\n" -"#endif\n" -"#ifdef SPOTLIGHTS\n" -" for(int i = 0; i < MAX_LIGHTS; i++){\n" -" if(u_spotLights[i].enabled == 0.0)\n" -" break;\n" -" v_color.rgb += DoSpotLight(u_spotLights[i], V.xyz, N)*surfDiffuse;\n" -" }\n" -"#endif\n" +" v_color.rgb += DoDynamicLight(V.xyz, N)*surfDiffuse;\n" +" v_color = clamp(v_color, 0.0f, 1.0);\n" " v_color *= u_matColor;\n" -" v_tex0 = in_tex0;\n" - " v_fog = DoFog(gl_Position.z);\n" "}\n" ; diff --git a/src/gl/gl3device.cpp b/src/gl/gl3device.cpp index eac149c..228c5a7 100644 --- a/src/gl/gl3device.cpp +++ b/src/gl/gl3device.cpp @@ -97,6 +97,16 @@ struct UniformObject UniformLight spotLights[MAX_LIGHTS]; }; +struct { + float type; + float radius; + float minusCosAngle; + float hardSpot; +} lightParams[MAX_LIGHTS]; +V4d lightPosition[MAX_LIGHTS]; +V4d lightDirection[MAX_LIGHTS]; +RGBAf lightColor[MAX_LIGHTS]; + const char *shaderDecl330 = "#version 330\n"; const char *shaderDecl100es = "#version 100\n"\ @@ -140,7 +150,10 @@ int32 u_view; // Object int32 u_world; int32 u_ambLight; -// TODO: lights! +int32 u_lightParams; +int32 u_lightPosition; +int32 u_lightDirection; +int32 u_lightColor; #endif int32 u_matColor; @@ -681,6 +694,7 @@ setWorldMatrix(Matrix *mat) int32 setLights(WorldLights *lightData) { +#ifndef RW_GLES2 int i, np, ns; Light *l; int32 bits; @@ -735,9 +749,70 @@ setLights(WorldLights *lightData) break; } } +#else + int i, n; + Light *l; + int32 bits; + uniformObject.ambLight = lightData->ambient; + + bits = 0; + + if(lightData->numAmbients) + bits |= VSLIGHT_AMBIENT; + + n = 0; + for(i = 0; i < lightData->numDirectionals && i < 8; i++){ + l = lightData->directionals[i]; + lightParams[n].type = 1.0f; + lightColor[n] = l->color; + memcpy(&lightDirection[n], &l->getFrame()->getLTM()->at, sizeof(V3d)); + bits |= VSLIGHT_POINT; + n++; + if(n >= MAX_LIGHTS) + goto out; + } + + for(i = 0; i < lightData->numLocals; i++){ + Light *l = lightData->locals[i]; + + switch(l->getType()){ + case Light::POINT: + lightParams[n].type = 2.0f; + lightParams[n].radius = l->radius; + lightColor[n] = l->color; + memcpy(&lightPosition[n], &l->getFrame()->getLTM()->pos, sizeof(V3d)); + bits |= VSLIGHT_POINT; + n++; + if(n >= MAX_LIGHTS) + goto out; + break; + case Light::SPOT: + case Light::SOFTSPOT: + lightParams[n].type = 3.0f; + lightParams[n].minusCosAngle = l->minusCosAngle; + lightParams[n].radius = l->radius; + lightColor[n] = l->color; + memcpy(&lightPosition[n], &l->getFrame()->getLTM()->pos, sizeof(V3d)); + memcpy(&lightDirection[n], &l->getFrame()->getLTM()->at, sizeof(V3d)); + // lower bound of falloff + if(l->getType() == Light::SOFTSPOT) + lightParams[n].hardSpot = 0.0f; + else + lightParams[n].hardSpot = 1.0f; + bits |= VSLIGHT_SPOT; + n++; + if(n >= MAX_LIGHTS) + goto out; + break; + } + } + + lightParams[n].type = 0.0f; +out: +#endif objectDirty = 1; - return 0; + return bits; } void @@ -773,7 +848,10 @@ flushCache(void) if(objectDirty){ glUniformMatrix4fv(U(u_world), 1, 0, (float*)&uniformObject.world); glUniform4fv(U(u_ambLight), 1, (float*)&uniformObject.ambLight); - // TODO: lights somehow + glUniform4fv(U(u_lightParams), MAX_LIGHTS, (float*)lightParams); + glUniform4fv(U(u_lightPosition), MAX_LIGHTS, (float*)lightPosition); + glUniform4fv(U(u_lightDirection), MAX_LIGHTS, (float*)lightDirection); + glUniform4fv(U(u_lightColor), MAX_LIGHTS, (float*)lightColor); objectDirty = 0; } @@ -1216,6 +1294,10 @@ initOpenGL(void) u_view = registerUniform("u_view"); u_world = registerUniform("u_world"); u_ambLight = registerUniform("u_ambLight"); + u_lightParams = registerUniform("u_lightParams"); + u_lightPosition = registerUniform("u_lightPosition"); + u_lightDirection = registerUniform("u_lightDirection"); + u_lightColor = registerUniform("u_lightColor"); lastShaderUploaded = nil; #else registerBlock("Scene"); diff --git a/src/gl/gl3shader.cpp b/src/gl/gl3shader.cpp index 7057cc4..a2b3b5c 100644 --- a/src/gl/gl3shader.cpp +++ b/src/gl/gl3shader.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "../rwbase.h" #include "../rwerror.h" @@ -31,8 +32,10 @@ registerUniform(const char *name) i = findUniform(name); if(i >= 0) return i; // TODO: print error - if(uniformRegistry.numUniforms+1 >= MAX_UNIFORMS) + if(uniformRegistry.numUniforms+1 >= MAX_UNIFORMS){ + assert(0 && "no space for uniform"); return -1; + } uniformRegistry.uniformNames[uniformRegistry.numUniforms] = strdup(name); return uniformRegistry.numUniforms++; } @@ -199,7 +202,7 @@ Shader::create(const char **vsrc, const char **fsrc) printf("\n"); #endif -#ifdef xxxRW_GLES2 +#ifdef RW_GLES2 int numAttribs; glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &numAttribs); for(i = 0; i < numAttribs; i++){ diff --git a/src/gl/rwgl3shader.h b/src/gl/rwgl3shader.h index 72f736f..f9bb632 100644 --- a/src/gl/rwgl3shader.h +++ b/src/gl/rwgl3shader.h @@ -5,7 +5,7 @@ namespace gl3 { // TODO: make this dynamic enum { - MAX_UNIFORMS = 20, + MAX_UNIFORMS = 40, MAX_BLOCKS = 20 };