mirror of
https://gitlab.com/shinovon/re3-symbian.git
synced 2026-05-22 17:47:20 +03:00
Completely remove dynamic lights
This commit is contained in:
parent
2b8a26d4d7
commit
d2fbcccd01
10 changed files with 9 additions and 264 deletions
|
|
@ -5,8 +5,7 @@ do_nothing :
|
|||
|
||||
MAKMAKE: do_nothing
|
||||
|
||||
BLD:
|
||||
$(MAKE) -C ../vendor/librw/src/gl/shaders/ -f Makefile all
|
||||
BLD: do_nothing
|
||||
|
||||
CLEAN:
|
||||
rm ../vendor/librw/src/gl/shaders/*.inc
|
||||
|
|
@ -15,7 +14,8 @@ LIB: do_nothing
|
|||
|
||||
CLEANLIB: do_nothing
|
||||
|
||||
RESOURCE: do_nothing
|
||||
RESOURCE:
|
||||
$(MAKE) -C ../vendor/librw/src/gl/shaders/ -f Makefile all
|
||||
|
||||
FREEZE: do_nothing
|
||||
|
||||
|
|
|
|||
72
vendor/librw/src/gl/gl3device.cpp
vendored
72
vendor/librw/src/gl/gl3device.cpp
vendored
|
|
@ -50,21 +50,10 @@ struct UniformScene
|
|||
float32 view[16];
|
||||
};
|
||||
|
||||
#define MAX_LIGHTS 4
|
||||
|
||||
struct UniformObject
|
||||
{
|
||||
RawMatrix world;
|
||||
RGBAf ambLight;
|
||||
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 *shaderDecl120 =
|
||||
|
|
@ -127,10 +116,6 @@ int32 u_view;
|
|||
// Object
|
||||
int32 u_world;
|
||||
int32 u_ambLight;
|
||||
int32 u_lightParams;
|
||||
int32 u_lightPosition;
|
||||
int32 u_lightDirection;
|
||||
int32 u_lightColor;
|
||||
#endif
|
||||
|
||||
int32 u_matColor;
|
||||
|
|
@ -1013,60 +998,7 @@ setLights(WorldLights *lightData)
|
|||
if(lightData->numAmbients)
|
||||
bits |= VSLIGHT_AMBIENT;
|
||||
|
||||
n = 0;
|
||||
for(i = 0; i < lightData->numDirectionals && i < 8; i++){
|
||||
l = lightData->directionals[i];
|
||||
uniformObject.lightParams[n].type = 1.0f;
|
||||
uniformObject.lightColor[n] = l->color;
|
||||
memcpy(&uniformObject.lightDirection[n], &l->getFrame()->getLTM()->at, sizeof(V3d));
|
||||
bits |= VSLIGHT_DIRECT;
|
||||
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:
|
||||
uniformObject.lightParams[n].type = 2.0f;
|
||||
uniformObject.lightParams[n].radius = l->radius;
|
||||
uniformObject.lightColor[n] = l->color;
|
||||
memcpy(&uniformObject.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:
|
||||
uniformObject.lightParams[n].type = 3.0f;
|
||||
uniformObject.lightParams[n].minusCosAngle = l->minusCosAngle;
|
||||
uniformObject.lightParams[n].radius = l->radius;
|
||||
uniformObject.lightColor[n] = l->color;
|
||||
memcpy(&uniformObject.lightPosition[n], &l->getFrame()->getLTM()->pos, sizeof(V3d));
|
||||
memcpy(&uniformObject.lightDirection[n], &l->getFrame()->getLTM()->at, sizeof(V3d));
|
||||
// lower bound of falloff
|
||||
if(l->getType() == Light::SOFTSPOT)
|
||||
uniformObject.lightParams[n].hardSpot = 0.0f;
|
||||
else
|
||||
uniformObject.lightParams[n].hardSpot = 1.0f;
|
||||
bits |= VSLIGHT_SPOT;
|
||||
n++;
|
||||
if(n >= MAX_LIGHTS)
|
||||
goto out;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uniformObject.lightParams[n].type = 0.0f;
|
||||
|
||||
setUniform(u_ambLight, &uniformObject.ambLight);
|
||||
setUniform(u_lightParams, uniformObject.lightParams);
|
||||
setUniform(u_lightPosition, uniformObject.lightPosition);
|
||||
setUniform(u_lightDirection, uniformObject.lightDirection);
|
||||
setUniform(u_lightColor, uniformObject.lightColor);
|
||||
out:
|
||||
objectDirty = 1;
|
||||
return bits;
|
||||
|
|
@ -1895,10 +1827,6 @@ initOpenGL(void)
|
|||
u_view = registerUniform("u_view", UNIFORM_MAT4);
|
||||
u_world = registerUniform("u_world", UNIFORM_MAT4);
|
||||
u_ambLight = registerUniform("u_ambLight", UNIFORM_VEC4);
|
||||
u_lightParams = registerUniform("u_lightParams", UNIFORM_VEC4, MAX_LIGHTS);
|
||||
u_lightPosition = registerUniform("u_lightPosition", UNIFORM_VEC4, MAX_LIGHTS);
|
||||
u_lightDirection = registerUniform("u_lightDirection", UNIFORM_VEC4, MAX_LIGHTS);
|
||||
u_lightColor = registerUniform("u_lightColor", UNIFORM_VEC4, MAX_LIGHTS);
|
||||
lastShaderUploaded = nil;
|
||||
#else
|
||||
registerBlock("Scene");
|
||||
|
|
|
|||
33
vendor/librw/src/gl/gl3render.cpp
vendored
33
vendor/librw/src/gl/gl3render.cpp
vendored
|
|
@ -19,8 +19,6 @@
|
|||
namespace rw {
|
||||
namespace gl3 {
|
||||
|
||||
#define MAX_LIGHTS
|
||||
|
||||
extern "C" int draw;
|
||||
extern "C" int render;
|
||||
|
||||
|
|
@ -28,7 +26,6 @@ void
|
|||
drawInst_simple(InstanceDataHeader *header, InstanceData *inst)
|
||||
{
|
||||
draw++;
|
||||
flushCache();
|
||||
glDrawElements(header->primType, inst->numIndex,
|
||||
GL_UNSIGNED_SHORT, ((uint8*) header->indexBuffer) + inst->offset);
|
||||
}
|
||||
|
|
@ -113,20 +110,9 @@ int32
|
|||
lightingCB(Atomic *atomic)
|
||||
{
|
||||
WorldLights lightData;
|
||||
Light *directionals[8];
|
||||
Light *locals[8];
|
||||
lightData.directionals = directionals;
|
||||
lightData.numDirectionals = 0; // 8;
|
||||
lightData.locals = locals;
|
||||
lightData.numLocals = 0; // 8;
|
||||
|
||||
if(atomic->geometry->flags & rw::Geometry::LIGHT){
|
||||
((World*)engine->currentWorld)->enumerateLights(atomic, &lightData);
|
||||
if((atomic->geometry->flags & rw::Geometry::NORMALS) == 0){
|
||||
// Get rid of lights that need normals when we don't have any
|
||||
lightData.numDirectionals = 0;
|
||||
lightData.numLocals = 0;
|
||||
}
|
||||
return setLights(&lightData);
|
||||
}else{
|
||||
memset(&lightData, 0, sizeof(lightData));
|
||||
|
|
@ -142,13 +128,18 @@ defaultRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
|||
|
||||
uint32 flags = atomic->geometry->flags;
|
||||
setWorldMatrix(atomic->getFrame()->getLTM());
|
||||
int32 vsBits = lightingCB(atomic);
|
||||
lightingCB(atomic);
|
||||
|
||||
setupVertexInput(header);
|
||||
|
||||
InstanceData *inst = header->inst;
|
||||
int32 n = header->numMeshes;
|
||||
|
||||
if(getAlphaTest())
|
||||
defaultShader->use();
|
||||
else
|
||||
defaultShader_noAT->use();
|
||||
|
||||
while(n--){
|
||||
m = inst->material;
|
||||
|
||||
|
|
@ -158,18 +149,6 @@ defaultRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
|||
|
||||
rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF);
|
||||
|
||||
// if((vsBits & VSLIGHT_MASK) == 0){
|
||||
if(getAlphaTest())
|
||||
defaultShader->use();
|
||||
else
|
||||
defaultShader_noAT->use();
|
||||
// }else{
|
||||
// if(getAlphaTest())
|
||||
// defaultShader_fullLight->use();
|
||||
// else
|
||||
// defaultShader_fullLight_noAT->use();
|
||||
// }
|
||||
|
||||
drawInst(header, inst);
|
||||
inst++;
|
||||
}
|
||||
|
|
|
|||
1
vendor/librw/src/gl/shaders/default.vert
vendored
1
vendor/librw/src/gl/shaders/default.vert
vendored
|
|
@ -14,7 +14,6 @@ main(void)
|
|||
|
||||
v_color = in_color;
|
||||
v_color.rgb += u_ambLight.rgb*surfAmbient;
|
||||
v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;
|
||||
v_color = clamp(v_color, 0.0, 1.0);
|
||||
v_color *= u_matColor;
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ const char *default_vert_src =
|
|||
|
||||
" v_color = in_color;\n"
|
||||
" v_color.rgb += u_ambLight.rgb*surfAmbient;\n"
|
||||
" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;\n"
|
||||
" v_color = clamp(v_color, 0.0, 1.0);\n"
|
||||
" v_color *= u_matColor;\n"
|
||||
|
||||
|
|
|
|||
65
vendor/librw/src/gl/shaders/header.vert
vendored
65
vendor/librw/src/gl/shaders/header.vert
vendored
|
|
@ -49,26 +49,8 @@ uniform mat4 u_proj;
|
|||
uniform mat4 u_view;
|
||||
#endif
|
||||
|
||||
#define MAX_LIGHTS 4
|
||||
|
||||
#ifdef USE_UBOS
|
||||
layout(std140) uniform Object
|
||||
{
|
||||
mat4 u_world;
|
||||
vec4 u_ambLight;
|
||||
vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot
|
||||
vec4 u_lightPosition[MAX_LIGHTS];
|
||||
vec4 u_lightDirection[MAX_LIGHTS];
|
||||
vec4 u_lightColor[MAX_LIGHTS];
|
||||
};
|
||||
#else
|
||||
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];
|
||||
#endif
|
||||
|
||||
uniform vec4 u_matColor;
|
||||
uniform vec4 u_surfProps; // amb, spec, diff, extra
|
||||
|
|
@ -77,53 +59,6 @@ uniform vec4 u_surfProps; // amb, spec, diff, extra
|
|||
#define surfSpecular (u_surfProps.y)
|
||||
#define surfDiffuse (u_surfProps.z)
|
||||
|
||||
vec3 DoDynamicLight(vec3 V, vec3 N)
|
||||
{
|
||||
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;
|
||||
#ifdef DIRECTIONALS
|
||||
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
|
||||
#endif
|
||||
#ifdef POINTLIGHTS
|
||||
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
|
||||
#endif
|
||||
#ifdef SPOTLIGHTS
|
||||
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;
|
||||
}else
|
||||
#endif
|
||||
;
|
||||
}
|
||||
*/
|
||||
return color;
|
||||
}
|
||||
|
||||
float DoFog(float w)
|
||||
{
|
||||
return clamp((w - u_fogEnd)*u_fogRange, u_fogDisable, 1.0);
|
||||
|
|
|
|||
65
vendor/librw/src/gl/shaders/header_vs.inc
vendored
65
vendor/librw/src/gl/shaders/header_vs.inc
vendored
|
|
@ -50,26 +50,8 @@ const char *header_vert_src =
|
|||
"uniform mat4 u_view;\n"
|
||||
"#endif\n"
|
||||
|
||||
"#define MAX_LIGHTS 4\n"
|
||||
|
||||
"#ifdef USE_UBOS\n"
|
||||
"layout(std140) uniform Object\n"
|
||||
"{\n"
|
||||
" mat4 u_world;\n"
|
||||
" vec4 u_ambLight;\n"
|
||||
" vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot\n"
|
||||
" vec4 u_lightPosition[MAX_LIGHTS];\n"
|
||||
" vec4 u_lightDirection[MAX_LIGHTS];\n"
|
||||
" vec4 u_lightColor[MAX_LIGHTS];\n"
|
||||
"};\n"
|
||||
"#else\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"
|
||||
"#endif\n"
|
||||
|
||||
"uniform vec4 u_matColor;\n"
|
||||
"uniform vec4 u_surfProps; // amb, spec, diff, extra\n"
|
||||
|
|
@ -78,53 +60,6 @@ const char *header_vert_src =
|
|||
"#define surfSpecular (u_surfProps.y)\n"
|
||||
"#define surfDiffuse (u_surfProps.z)\n"
|
||||
|
||||
"vec3 DoDynamicLight(vec3 V, vec3 N)\n"
|
||||
"{\n"
|
||||
" vec3 color = vec3(0.0, 0.0, 0.0);\n"
|
||||
"/*\n"
|
||||
" for(int i = 0; i < MAX_LIGHTS; i++){\n"
|
||||
" if(u_lightParams[i].x == 0.0)\n"
|
||||
" break;\n"
|
||||
"#ifdef DIRECTIONALS\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"
|
||||
" }else\n"
|
||||
"#endif\n"
|
||||
"#ifdef POINTLIGHTS\n"
|
||||
" 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\n"
|
||||
"#endif\n"
|
||||
"#ifdef SPOTLIGHTS\n"
|
||||
" 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"
|
||||
" }else\n"
|
||||
"#endif\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"
|
||||
|
|
|
|||
1
vendor/librw/src/gl/shaders/matfx_env.vert
vendored
1
vendor/librw/src/gl/shaders/matfx_env.vert
vendored
|
|
@ -21,7 +21,6 @@ main(void)
|
|||
|
||||
v_color = in_color;
|
||||
v_color.rgb += u_ambLight.rgb*surfAmbient;
|
||||
v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;
|
||||
v_color = clamp(v_color, 0.0, 1.0);
|
||||
v_envColor = max(v_color, u_colorClamp) * u_envColor;
|
||||
v_color *= u_matColor;
|
||||
|
|
|
|||
1
vendor/librw/src/gl/shaders/matfx_gl.inc
vendored
1
vendor/librw/src/gl/shaders/matfx_gl.inc
vendored
|
|
@ -22,7 +22,6 @@ const char *matfx_env_vert_src =
|
|||
|
||||
" v_color = in_color;\n"
|
||||
" v_color.rgb += u_ambLight.rgb*surfAmbient;\n"
|
||||
" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;\n"
|
||||
" v_color = clamp(v_color, 0.0, 1.0);\n"
|
||||
" v_envColor = max(v_color, u_colorClamp) * u_envColor;\n"
|
||||
" v_color *= u_matColor;\n"
|
||||
|
|
|
|||
28
vendor/librw/src/world.cpp
vendored
28
vendor/librw/src/world.cpp
vendored
|
|
@ -144,9 +144,6 @@ World::enumerateLights(Atomic *atomic, WorldLights *lightData)
|
|||
{
|
||||
int32 maxDirectionals, maxLocals;
|
||||
|
||||
maxDirectionals = lightData->numDirectionals;
|
||||
maxLocals = lightData->numLocals;
|
||||
|
||||
lightData->numDirectionals = 0;
|
||||
lightData->numLocals = 0;
|
||||
lightData->numAmbients = 0;
|
||||
|
|
@ -166,33 +163,8 @@ World::enumerateLights(Atomic *atomic, WorldLights *lightData)
|
|||
lightData->ambient.green += l->color.green;
|
||||
lightData->ambient.blue += l->color.blue;
|
||||
lightData->numAmbients++;
|
||||
}else if(normals && l->getType() == Light::DIRECTIONAL){
|
||||
if(lightData->numDirectionals < maxDirectionals)
|
||||
lightData->directionals[lightData->numDirectionals++] = l;
|
||||
}
|
||||
}
|
||||
|
||||
if(atomic->world != this)
|
||||
return;
|
||||
|
||||
if(!normals)
|
||||
return;
|
||||
|
||||
Sphere *atomsphere = atomic->getWorldBoundingSphere();
|
||||
// TODO: for this we would use an atomic's world sectors, but we don't have those yet
|
||||
FORLIST(lnk, this->localLights){
|
||||
if(lightData->numLocals >= maxLocals)
|
||||
return;
|
||||
|
||||
Light *l = Light::fromWorld(lnk);
|
||||
if((l->getFlags() & Light::LIGHTATOMICS) == 0)
|
||||
continue;
|
||||
|
||||
// check if spheres are intersecting
|
||||
V3d dist = sub(l->getFrame()->getLTM()->pos, atomsphere->center);
|
||||
if(length(dist) < atomsphere->radius + l->radius)
|
||||
lightData->locals[lightData->numLocals++] = l;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue