From c1d19ad258139c73e7aa81cf6e1fbd99e1bfe38b Mon Sep 17 00:00:00 2001 From: Saracen Date: Sun, 8 Nov 2015 03:21:06 +0000 Subject: New shader feature: change the colour of shadows on a per-material basis. Conflicts: drivers/gles2/shader_compiler_gles2.cpp --- drivers/gles2/rasterizer_gles2.cpp | 3 +++ drivers/gles2/shader_compiler_gles2.cpp | 6 ++++++ drivers/gles2/shaders/material.glsl | 8 ++++++++ 3 files changed, 17 insertions(+) (limited to 'drivers') diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index d84ee5a758..891fe49afa 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -4637,6 +4637,9 @@ void RasterizerGLES2::_update_shader( Shader* p_shader) const { if (light_flags.uses_light) { enablers.push_back("#define USE_LIGHT_SHADER_CODE\n"); } + if (light_flags.uses_shadow_color) { + enablers.push_back("#define USE_LIGHT_SHADOW_COLOR\n"); + } if (light_flags.uses_time || fragment_flags.uses_time || vertex_flags.uses_time) { enablers.push_back("#define USE_TIME\n"); uses_time=true; diff --git a/drivers/gles2/shader_compiler_gles2.cpp b/drivers/gles2/shader_compiler_gles2.cpp index d57512c936..7501223fcc 100644 --- a/drivers/gles2/shader_compiler_gles2.cpp +++ b/drivers/gles2/shader_compiler_gles2.cpp @@ -218,6 +218,10 @@ String ShaderCompilerGLES2::dump_node_code(SL::Node *p_node,int p_level,bool p_a uses_light=true; } + if (vnode->name==vname_shadow) { + uses_shadow_color=true; + } + } if (type==ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX) { @@ -838,6 +842,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() { ////////////// + mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["TIME"]="time"; mode_replace_table[2]["NORMAL"]="normal"; //mode_replace_table[2]["POSITION"]="IN_POSITION"; mode_replace_table[2]["LIGHT_DIR"]="light_dir"; @@ -849,6 +854,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() { mode_replace_table[2]["SPECULAR_EXP"]="specular_exp"; mode_replace_table[2]["SHADE_PARAM"]="shade_param"; mode_replace_table[2]["LIGHT"]="light"; + mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["SHADOW"]="shadow_color"; mode_replace_table[2]["POINT_COORD"]="gl_PointCoord"; mode_replace_table[2]["TIME"]="time"; diff --git a/drivers/gles2/shaders/material.glsl b/drivers/gles2/shaders/material.glsl index 38fb03ab5c..ccd80bf2f0 100644 --- a/drivers/gles2/shaders/material.glsl +++ b/drivers/gles2/shaders/material.glsl @@ -1175,6 +1175,10 @@ FRAGMENT_SHADER_CODE vec3 mdiffuse = diffuse.rgb; vec3 light; +#if defined(USE_LIGHT_SHADOW_COLOR) + vec3 shadow_color=vec3(0.0,0.0,0.0); +#endif + #if defined(USE_LIGHT_SHADER_CODE) //light is written by the light shader { @@ -1195,6 +1199,10 @@ LIGHT_SHADER_CODE #endif diffuse.rgb = const_light_mult * ambient_light *diffuse.rgb + light * attenuation * shadow_attenuation; +#if defined(USE_LIGHT_SHADOW_COLOR) + diffuse.rgb += light * shadow_color * attenuation * (1.0 - shadow_attenuation); +#endif + #ifdef USE_FOG diffuse.rgb = mix(diffuse.rgb,fog_interp.rgb,fog_interp.a); -- cgit v1.2.3