diff options
-rw-r--r-- | data/Makefile.am | 2 | ||||
-rw-r--r-- | data/shaders/fill-light.frag | 49 | ||||
-rw-r--r-- | data/shaders/fill-light.vert | 2 | ||||
-rw-r--r-- | data/shaders/lighting.frag | 49 | ||||
-rw-r--r-- | data/textures/placeholder.png | bin | 0 -> 209 bytes | |||
-rw-r--r-- | src/render.c | 26 |
6 files changed, 53 insertions, 75 deletions
diff --git a/data/Makefile.am b/data/Makefile.am index b818d11..beca98a 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -9,7 +9,7 @@ shaders_DATA = shaders/lighting.vert shaders/lighting.frag shaders/swirlytron.ve texturesdir = $(datadir)/thrust3d/textures textures_DATA = textures/floor1.png textures/tiledwall.png textures/radioactive.png textures/fuel.png \ - textures/font.png textures/concrete.png textures/tiledwall-normals.png + textures/font.png textures/concrete.png textures/tiledwall-normals.png textures/placeholder.png roomsdir = $(datadir)/thrust3d/rooms rooms_DATA = rooms/00-00-00 rooms/00-00-01 rooms/00-00-02 rooms/00-00-03 rooms/00-00-04 rooms/00-01-04 rooms/00-02-04 diff --git a/data/shaders/fill-light.frag b/data/shaders/fill-light.frag index b9aba4c..6a7044e 100644 --- a/data/shaders/fill-light.frag +++ b/data/shaders/fill-light.frag @@ -1,7 +1,7 @@ /* - * lighting.frag + * fill-light.frag * - * Lighting calculations + * Simplified lighting calculations for the lander craft * * (c) 2007-2008 Thomas White <taw27@cam.ac.uk> * @@ -18,8 +18,6 @@ uniform sampler2D texture; uniform sampler2D normalmap; uniform bool has_normals; -uniform bool texture_enabled; -uniform bool texture_emits; uniform float alpha; varying vec3 col_ambi_diff; @@ -27,26 +25,26 @@ varying vec3 col_emit; void main() { - vec3 ambi; - vec3 emit; - vec3 diff = vec3(0.0, 0.0, 0.0); - vec3 spec = vec3(0.0, 0.0, 0.0); - vec3 norm = normal; + vec3 ambi, emit, diff, spec; + vec3 norm; float diff_fac, spec_fac; vec3 L, E, R; + vec3 tex; + + tex = texture2D(texture, gl_TexCoord[0].st).rgb; if ( has_normals ) { norm += (texture2D(normalmap, gl_TexCoord[0].st).rgb - vec3(0.5, 0.5, 0.5)) / 2.0; } - norm = normalize(norm); + norm = normalize(normal); /* Ambient */ ambi = col_ambi_diff * gl_LightModel.ambient.rgb; /* Emission */ emit = col_emit; - + /* Light 2: Fill-in for lander craft */ L = normalize(gl_LightSource[2].position.xyz - pos); E = normalize(-pos); @@ -54,31 +52,14 @@ void main() { diff_fac = max(0.0, dot(normalize(light2vc).xyz, norm)); spec_fac = max(0.0, dot(R, E)); spec_fac = pow(spec_fac, 80.0); - - diff += col_ambi_diff * gl_LightSource[2].diffuse.rgb * diff_fac; - spec += gl_LightSource[2].specular.rgb * spec_fac; - - if ( texture_enabled ) { - vec3 tex = texture2D(texture, gl_TexCoord[0].st).rgb; - - if ( texture_emits ) { - gl_FragColor = vec4(tex.r, tex.g, tex.b, alpha); - } else { - gl_FragColor = vec4(min(tex.r * (ambi.r + diff.r) + spec.r, 1.0), - min(tex.g * (ambi.g + diff.g) + spec.g, 1.0), - min(tex.b * (ambi.b + diff.b) + spec.b, 1.0), - alpha); - } + diff = col_ambi_diff * gl_LightSource[2].diffuse.rgb * diff_fac; + spec = gl_LightSource[2].specular.rgb * spec_fac; - } else { - - gl_FragColor = vec4(min(emit.r + ambi.r + diff.r + spec.r, 1.0), - min(emit.g + ambi.g + diff.g + spec.g, 1.0), - min(emit.b + ambi.b + diff.b + spec.b, 1.0), - alpha); - - } + gl_FragColor = vec4(min(tex.r * (ambi.r + diff.r) + spec.r, 1.0), + min(tex.g * (ambi.g + diff.g) + spec.g, 1.0), + min(tex.b * (ambi.b + diff.b) + spec.b, 1.0), + alpha); } diff --git a/data/shaders/fill-light.vert b/data/shaders/fill-light.vert index 38dcfc9..bdcb844 100644 --- a/data/shaders/fill-light.vert +++ b/data/shaders/fill-light.vert @@ -1,7 +1,7 @@ /* * fill-light.vert * - * Lighting calculations for the lander craft + * Simplified lighting calculations for the lander craft * * (c) 2007-2008 Thomas White <taw27@cam.ac.uk> * diff --git a/data/shaders/lighting.frag b/data/shaders/lighting.frag index 39f39fc..632f870 100644 --- a/data/shaders/lighting.frag +++ b/data/shaders/lighting.frag @@ -13,17 +13,13 @@ varying vec3 pos; varying vec3 normal; varying vec3 light0vc; -varying vec3 light0half; varying vec3 light1vc; varying vec3 light2vc; -varying vec3 light2hvc; uniform sampler2D texture; uniform sampler2D normalmap; uniform bool has_normals; -uniform bool fill_light_enabled; -uniform bool texture_enabled; uniform bool texture_emits; uniform float alpha; @@ -32,21 +28,28 @@ varying vec3 col_emit; void main() { - vec3 ambi; - vec3 emit; - vec3 diff = vec3(0.0, 0.0, 0.0); - vec3 spec = vec3(0.0, 0.0, 0.0); - vec3 norm = normal; + vec3 ambi, emit, diff, spec; + vec3 norm; float falloff, spot; float diff_fac, spec_fac; vec3 L, E, R; + vec3 tex; + tex = texture2D(texture, gl_TexCoord[0].st).rgb; + if ( texture_emits ) { + gl_FragColor = vec4(tex.r, tex.g, tex.b, alpha); + return; /* Bail out early in this case */ + } + + diff = vec3(0.0, 0.0, 0.0); + spec = vec3(0.0, 0.0, 0.0); + + norm = normalize(normal); if ( has_normals ) { + /* Same texture coordinates as for the diffuse map */ norm += (texture2D(normalmap, gl_TexCoord[0].st).rgb - vec3(0.5, 0.5, 0.5)) / 2.0; } - norm = normalize(norm); - /* Ambient */ ambi = col_ambi_diff * gl_LightModel.ambient.rgb; @@ -70,33 +73,15 @@ void main() { spec_fac = pow(spec_fac, 80.0); diff += col_ambi_diff * gl_LightSource[0].diffuse.rgb * spot * falloff * diff_fac; - spec += vec3(1.0, 1.0, 1.0) * gl_LightSource[0].specular.rgb * spot * falloff * spec_fac; /* Light 1: Diffuse background glow */ diff += col_ambi_diff * gl_LightSource[1].diffuse.rgb * max(0.0, dot(vec3(light1vc), norm)); - if ( texture_enabled ) { - - vec3 tex = texture2D(texture, gl_TexCoord[0].st).rgb; - - if ( texture_emits ) { - gl_FragColor = vec4(tex.r, tex.g, tex.b, alpha); - } else { - gl_FragColor = vec4(min(tex.r * (ambi.r + diff.r) + spec.r, 1.0), - min(tex.g * (ambi.g + diff.g) + spec.g, 1.0), - min(tex.b * (ambi.b + diff.b) + spec.b, 1.0), - alpha); - } - - } else { - - gl_FragColor = vec4(min(emit.r + ambi.r + diff.r + spec.r, 1.0), - min(emit.g + ambi.g + diff.g + spec.g, 1.0), - min(emit.b + ambi.b + diff.b + spec.b, 1.0), + gl_FragColor = vec4(min(tex.r * (ambi.r + diff.r) + spec.r, 1.0), + min(tex.g * (ambi.g + diff.g) + spec.g, 1.0), + min(tex.b * (ambi.b + diff.b) + spec.b, 1.0), alpha); - } - } diff --git a/data/textures/placeholder.png b/data/textures/placeholder.png Binary files differnew file mode 100644 index 0000000..5eda9f1 --- /dev/null +++ b/data/textures/placeholder.png diff --git a/src/render.c b/src/render.c index 26d1dcc..84de330 100644 --- a/src/render.c +++ b/src/render.c @@ -185,6 +185,7 @@ RenderContext *render_setup(int width, int height, int disable_vbos, int disable /* Load misc texture bits */ texture_load(r, "radioactive"); texture_load(r, "fuel"); + texture_load(r, "placeholder"); render_text_setup(r); @@ -209,6 +210,20 @@ static GLenum render_gltype(PrimitiveType type) { } +static void render_placeholder_texture(RenderContext *r) { + + Texture *texture; + + texture = texture_lookup(r, "placeholder"); + if ( texture != NULL ) { + glBindTexture(GL_TEXTURE_2D, texture->texname); + glEnable(GL_TEXTURE_2D); + } else { + fprintf(stderr, "Couldn't find placeholder texture!\n"); + } + +} + static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderContext *r, int *nvert, GLfloat alpha) { int j; @@ -271,9 +286,8 @@ static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderC glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); shaderutils_setuni(r->lighting_program, "texture_emits", 1); } else { - if ( r->shaders ) { - shaderutils_setuni(r->lighting_program, "texture_enabled", 0); - } /* else don't enable texturing */ + if ( r->shaders ) render_placeholder_texture(r); + /* else don't glEnable() texturing */ } } else if ( p->texture != NULL ) { Texture *texture; @@ -282,7 +296,6 @@ static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderC glBindTexture(GL_TEXTURE_2D, texture->texname); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - if ( r->shaders ) shaderutils_setuni(r->lighting_program, "texture_enabled", 1); if ( r->shaders && texture->has_normals ) { glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texture->normalmap); @@ -290,10 +303,10 @@ static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderC glActiveTexture(GL_TEXTURE0); } } else { - if ( r->shaders ) shaderutils_setuni(r->lighting_program, "texture_enabled", 0); + if ( r->shaders ) render_placeholder_texture(r); } } else { - if ( r->shaders ) shaderutils_setuni(r->lighting_program, "texture_enabled", 0); + if ( r->shaders ) render_placeholder_texture(r); } if ( r->vbos ) { glBindBuffer(GL_ARRAY_BUFFER, p->vertices_buffer); @@ -623,7 +636,6 @@ void render_draw(Game *game, Uint32 t) { shaderutils_setuni(game->render->lighting_program, "texture", 0); /* GL_TEXTURE0 */ shaderutils_setuni(game->render->lighting_program, "normalmap", 1); /* GL_TEXTURE1 */ shaderutils_setuni(game->render->lighting_program, "texture_only", 0); - shaderutils_setuni(game->render->lighting_program, "texture_enabled", 1); shaderutils_setuni(game->render->lighting_program, "has_normals", 0); } render_setup_lighting(game); |