Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions drivers/gles2/rasterizer_gles2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4208,8 +4208,8 @@ void RasterizerGLES2::begin_frame() {
shadow_filter=ShadowFilterTechnique(int(Globals::get_singleton()->get("rasterizer/shadow_filter")));
#endif

canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_PCF5,shadow_filter==SHADOW_FILTER_PCF5);
canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_PCF13,shadow_filter==SHADOW_FILTER_PCF13);
canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_PCF_MEDIUM,shadow_filter==SHADOW_FILTER_PCF_MEDIUM);
canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_PCF_HIGH,shadow_filter==SHADOW_FILTER_PCF_HIGH);
canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_ESM,shadow_filter==SHADOW_FILTER_ESM);

window_size = Size2( OS::get_singleton()->get_video_mode().width, OS::get_singleton()->get_video_mode().height );
Expand Down Expand Up @@ -5166,8 +5166,8 @@ bool RasterizerGLES2::_setup_material(const Geometry *p_geometry,const Material

//all goes to false by default
material_shader.set_conditional(MaterialShaderGLES2::USE_SHADOW_PASS,shadow!=NULL);
material_shader.set_conditional(MaterialShaderGLES2::USE_SHADOW_PCF,shadow_filter==SHADOW_FILTER_PCF5 || shadow_filter==SHADOW_FILTER_PCF13);
material_shader.set_conditional(MaterialShaderGLES2::USE_SHADOW_PCF_HQ,shadow_filter==SHADOW_FILTER_PCF13);
material_shader.set_conditional(MaterialShaderGLES2::USE_SHADOW_PCF,shadow_filter==SHADOW_FILTER_PCF_MEDIUM || shadow_filter==SHADOW_FILTER_PCF_HIGH);
material_shader.set_conditional(MaterialShaderGLES2::USE_SHADOW_PCF_HQ,shadow_filter==SHADOW_FILTER_PCF_HIGH);
material_shader.set_conditional(MaterialShaderGLES2::USE_SHADOW_ESM,shadow_filter==SHADOW_FILTER_ESM);
material_shader.set_conditional(MaterialShaderGLES2::USE_LIGHTMAP_ON_UV2,p_material->flags[VS::MATERIAL_FLAG_LIGHTMAP_ON_UV2]);
material_shader.set_conditional(MaterialShaderGLES2::USE_COLOR_ATTRIB_SRGB_TO_LINEAR,p_material->flags[VS::MATERIAL_FLAG_COLOR_ARRAY_SRGB] && current_env && current_env->fx_enabled[VS::ENV_FX_SRGB]);
Expand Down Expand Up @@ -5429,6 +5429,7 @@ void RasterizerGLES2::_setup_light(uint16_t p_light) {
material_shader.set_uniform(MaterialShaderGLES2::SHADOW_MATRIX,li->shadow_projection[0]);
material_shader.set_uniform(MaterialShaderGLES2::SHADOW_TEXEL_SIZE,Vector2(1.0,1.0)/li->near_shadow_buffer->size);
material_shader.set_uniform(MaterialShaderGLES2::SHADOW_TEXTURE,max_texture_units-1);
material_shader.set_uniform(MaterialShaderGLES2::SHADOW_FILTER_RADIUS,float(li->base->vars[VS::LIGHT_PARAM_SHADOW_FILTER_RADIUS]));
if (shadow_filter==SHADOW_FILTER_ESM)
material_shader.set_uniform(MaterialShaderGLES2::ESM_MULTIPLIER,float(li->base->vars[VS::LIGHT_PARAM_SHADOW_ESM_MULTIPLIER]));

Expand Down Expand Up @@ -9744,6 +9745,7 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list,int p_z,const

canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_TEXTURE,max_texture_units-3);
canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_MATRIX,light->shadow_matrix_cache);
canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_FILTER_RADIUS,light->shadow_filter_radius);
canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_ESM_MULTIPLIER,light->shadow_esm_mult);
canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_SHADOW_COLOR,light->shadow_color);

Expand Down Expand Up @@ -11451,8 +11453,8 @@ RasterizerGLES2::RasterizerGLES2(bool p_compress_arrays,bool p_keep_ram_copy,boo
p_default_fragment_lighting=false;
fragment_lighting=GLOBAL_DEF("rasterizer/use_fragment_lighting",true);
read_depth_supported=true; //todo check for extension
shadow_filter=ShadowFilterTechnique((int)(GLOBAL_DEF("rasterizer/shadow_filter",SHADOW_FILTER_PCF5)));
Globals::get_singleton()->set_custom_property_info("rasterizer/shadow_filter",PropertyInfo(Variant::INT,"rasterizer/shadow_filter",PROPERTY_HINT_ENUM,"None,PCF5,PCF13,ESM"));
shadow_filter=ShadowFilterTechnique((int)(GLOBAL_DEF("rasterizer/shadow_filter",SHADOW_FILTER_PCF_MEDIUM)));
Globals::get_singleton()->set_custom_property_info("rasterizer/shadow_filter",PropertyInfo(Variant::INT,"rasterizer/shadow_filter",PROPERTY_HINT_ENUM,"Low,Medium,High,ESM"));
use_fp16_fb=bool(GLOBAL_DEF("rasterizer/fp16_framebuffer",true));
use_shadow_mapping=true;
use_fast_texture_filter=!bool(GLOBAL_DEF("rasterizer/trilinear_mipmap_filter",true));
Expand Down
1 change: 1 addition & 0 deletions drivers/gles2/rasterizer_gles2.h
Original file line number Diff line number Diff line change
Expand Up @@ -653,6 +653,7 @@ class RasterizerGLES2 : public Rasterizer {
vars[VS::LIGHT_PARAM_SHADOW_DARKENING]=0.0;
vars[VS::LIGHT_PARAM_SHADOW_Z_OFFSET]=0.2;
vars[VS::LIGHT_PARAM_SHADOW_Z_SLOPE_SCALE]=1.4;
vars[VS::LIGHT_PARAM_SHADOW_FILTER_RADIUS]=5.0;
vars[VS::LIGHT_PARAM_SHADOW_ESM_MULTIPLIER]=60.0;
vars[VS::LIGHT_PARAM_SHADOW_BLUR_PASSES]=1;
colors[VS::LIGHT_COLOR_DIFFUSE]=Color(1,1,1);
Expand Down
86 changes: 63 additions & 23 deletions drivers/gles2/shaders/canvas.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,30 @@ uniform vec2 texpixel_size;

FRAGMENT_SHADER_GLOBALS

uniform float shadow_filter_radius;

uniform vec2 kern[16] = vec2[]
(
vec2(0.151205, 0.340969),
vec2(0.349872, -0.70755),
vec2(0.946959, 0.663325),
vec2(0.849958, -0.760292),
vec2(-0.792296, 0.463846),
vec2(0.45069, 0.832586),
vec2(-0.637487, -0.522192),
vec2(0.0185288, -0.162319),
vec2(0.622725, -0.289341),
vec2(-0.265502, 0.0830657),
vec2(-0.604604, 0.99042),
vec2(-0.228469, -0.911768),
vec2(-0.486144, -0.481575),
vec2(-0.0477502, 0.603215),
vec2(0.727942, 0.152266),
vec2(-0.890052, -0.0117375)
);

#define KERNWIDTH 4


void main() {

Expand Down Expand Up @@ -328,34 +352,45 @@ LIGHT_SHADER_CODE

#endif

#ifdef SHADOW_PCF_MEDIUM

for (int iy = 0; iy < 2; iy++)
{
int y = int(mod(gl_FragCoord.y + iy, KERNWIDTH));

for (int ix = 0; ix < 2; ix++)
{
int x = int(mod(gl_FragCoord.x + ix, KERNWIDTH));

#ifdef SHADOW_PCF5
vec2 sample = kern[y * KERNWIDTH + x];
vec2 offset = ((sample - 1.0) * 0.5 + vec2(ix, iy)) * shadowpixel_size * shadow_filter_radius;

shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*2.0,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*2.0,sh))<sz?0.0:1.0;
shadow_attenuation/=5.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture, vec2(su, sh) + offset) < sz ? 0.0 : 1.0;
}
}

shadow_attenuation *= 0.25;

#endif

#ifdef SHADOW_PCF13
#ifdef SHADOW_PCF_HIGH

for (int iy = 0; iy < 3; iy++)
{
int y = int(mod(gl_FragCoord.y + iy, KERNWIDTH));

shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*2.0,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*3.0,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*4.0,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*5.0,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*6.0,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*2.0,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*3.0,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*4.0,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*5.0,sh))<sz?0.0:1.0;
shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*6.0,sh))<sz?0.0:1.0;
shadow_attenuation/=13.0;
for (int ix = 0; ix < 3; ix++)
{
int x = int(mod(gl_FragCoord.x + ix, KERNWIDTH));

vec2 sample = kern[y * KERNWIDTH + x];
vec2 offset = (sample + (vec2(ix, iy) - 1.0) * 2.0) * 0.333333 * shadowpixel_size * shadow_filter_radius;

shadow_attenuation += SHADOW_DEPTH(shadow_texture, vec2(su, sh) + offset) < sz ? 0.0 : 1.0;
}
}

shadow_attenuation *= 0.111111;

#endif

Expand All @@ -374,9 +409,14 @@ LIGHT_SHADER_CODE

#endif

#if !defined(SHADOW_PCF5) && !defined(SHADOW_PCF13) && !defined(SHADOW_ESM)
#if !defined(SHADOW_PCF_MEDIUM) && !defined(SHADOW_PCF_HIGH) && !defined(SHADOW_ESM)

int x = int(mod(gl_FragCoord.x, KERNWIDTH));
int y = int(mod(gl_FragCoord.y, KERNWIDTH));

vec2 offset = kern[y * KERNWIDTH + x] * shadowpixel_size * shadow_filter_radius;

shadow_attenuation = SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size,sh))<sz?0.0:1.0;
shadow_attenuation = SHADOW_DEPTH(shadow_texture, vec2(su, sh) + offset) < sz ? 0.0 : 1.0;

#endif

Expand Down
93 changes: 70 additions & 23 deletions drivers/gles2/shaders/material.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -626,6 +626,29 @@ uniform vec3 ambient_color;

FRAGMENT_SHADER_GLOBALS

uniform float shadow_filter_radius;

uniform vec2 kern[16] = vec2[]
(
vec2(0.151205, 0.340969),
vec2(0.349872, -0.70755),
vec2(0.946959, 0.663325),
vec2(0.849958, -0.760292),
vec2(-0.792296, 0.463846),
vec2(0.45069, 0.832586),
vec2(-0.637487, -0.522192),
vec2(0.0185288, -0.162319),
vec2(0.622725, -0.289341),
vec2(-0.265502, 0.0830657),
vec2(-0.604604, 0.99042),
vec2(-0.228469, -0.911768),
vec2(-0.486144, -0.481575),
vec2(-0.0477502, 0.603215),
vec2(0.727942, 0.152266),
vec2(-0.890052, -0.0117375)
);

#define KERNWIDTH 4


#ifdef LIGHT_USE_SHADOW
Expand Down Expand Up @@ -661,34 +684,50 @@ uniform float shadow_darkening;
#ifdef USE_SHADOW_PCF_HQ


float SAMPLE_SHADOW_TEX( highp vec2 coord, highp float refdepth) {
float SAMPLE_SHADOW_TEX(highp vec2 coord, highp float refdepth)
{
float shadow = 0;

for (int iy = 0; iy < 3; iy++)
{
int y = int(mod(gl_FragCoord.y + iy, KERNWIDTH));

for (int ix = 0; ix < 3; ix++)
{
int x = int(mod(gl_FragCoord.x + ix, KERNWIDTH));

vec2 sample = kern[y * KERNWIDTH + x];
vec2 offset = (sample + (vec2(ix, iy) - 1.0) * 2.0) * 0.333333 * shadow_texel_size * shadow_filter_radius;

float avg=(SHADOW_DEPTH(shadow_texture,coord) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(shadow_texel_size.x,0.0)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(-shadow_texel_size.x,0.0)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(0.0,shadow_texel_size.y)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(0.0,-shadow_texel_size.y)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(shadow_texel_size.x,shadow_texel_size.y)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(-shadow_texel_size.x,shadow_texel_size.y)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(shadow_texel_size.x,-shadow_texel_size.y)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(-shadow_texel_size.x,-shadow_texel_size.y)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(shadow_texel_size.x*2.0,0.0)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(-shadow_texel_size.x*2.0,0.0)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(0.0,shadow_texel_size.y*2.0)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(0.0,-shadow_texel_size.y*2.0)) < refdepth ? 0.0 : 1.0);
return avg*(1.0/13.0);
shadow += SHADOW_DEPTH(shadow_texture, coord + offset) < refdepth ? 0.0 : 1.0;
}
}

return shadow * 0.111111;
}

#else

float SAMPLE_SHADOW_TEX( highp vec2 coord, highp float refdepth) {
float SAMPLE_SHADOW_TEX(highp vec2 coord, highp float refdepth)
{
float shadow = 0;

float avg=(SHADOW_DEPTH(shadow_texture,coord) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(shadow_texel_size.x,0.0)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(-shadow_texel_size.x,0.0)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(0.0,shadow_texel_size.y)) < refdepth ? 0.0 : 1.0);
avg+=(SHADOW_DEPTH(shadow_texture,coord+vec2(0.0,-shadow_texel_size.y)) < refdepth ? 0.0 : 1.0);
return avg*0.2;
for (int iy = 0; iy < 2; iy++)
{
int y = int(mod(gl_FragCoord.y + iy, KERNWIDTH));

for (int ix = 0; ix < 2; ix++)
{
int x = int(mod(gl_FragCoord.x + ix, KERNWIDTH));

vec2 sample = kern[y * KERNWIDTH + x];
vec2 offset = ((sample - 1.0) * 0.5 + vec2(ix, iy)) * shadow_texel_size * shadow_filter_radius;

shadow += SHADOW_DEPTH(shadow_texture, coord + offset) < refdepth ? 0.0 : 1.0;
}
}

return shadow * 0.25;
}

#endif
Expand Down Expand Up @@ -767,7 +806,15 @@ float SAMPLE_SHADOW_TEX(vec2 p_uv,float p_depth) {

#if !defined(USE_SHADOW_PCF) && !defined(USE_SHADOW_ESM)

#define SAMPLE_SHADOW_TEX(m_coord,m_depth) (SHADOW_DEPTH(shadow_texture,m_coord) < m_depth ? 0.0 : 1.0)
float SAMPLE_SHADOW_TEX(highp vec2 coord, highp float refdepth)
{
int x = int(mod(gl_FragCoord.x, KERNWIDTH));
int y = int(mod(gl_FragCoord.y, KERNWIDTH));

vec2 offset = kern[y * KERNWIDTH + x] * shadow_texel_size * shadow_filter_radius;

return SHADOW_DEPTH(shadow_texture, coord + offset) < refdepth ? 0.0 : 1.0;
}

#endif

Expand Down
16 changes: 16 additions & 0 deletions scene/2d/light_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,17 @@ int Light2D::get_shadow_buffer_size() const {
return shadow_buffer_size;
}

void Light2D::set_shadow_filter_radius( float p_filter_radius) {

shadow_filter_radius=p_filter_radius;
VS::get_singleton()->canvas_light_set_shadow_filter_radius(canvas_light,p_filter_radius);
}

float Light2D::get_shadow_filter_radius() const{

return shadow_filter_radius;
}

void Light2D::set_shadow_esm_multiplier( float p_multiplier) {

shadow_esm_multiplier=p_multiplier;
Expand Down Expand Up @@ -405,6 +416,9 @@ void Light2D::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_shadow_buffer_size","size"),&Light2D::set_shadow_buffer_size);
ObjectTypeDB::bind_method(_MD("get_shadow_buffer_size"),&Light2D::get_shadow_buffer_size);

ObjectTypeDB::bind_method(_MD("set_shadow_filter_radius","filter_radius"),&Light2D::set_shadow_filter_radius);
ObjectTypeDB::bind_method(_MD("get_shadow_filter_radius"),&Light2D::get_shadow_filter_radius);

ObjectTypeDB::bind_method(_MD("set_shadow_esm_multiplier","multiplier"),&Light2D::set_shadow_esm_multiplier);
ObjectTypeDB::bind_method(_MD("get_shadow_esm_multiplier"),&Light2D::get_shadow_esm_multiplier);

Expand All @@ -429,6 +443,7 @@ void Light2D::_bind_methods() {
ADD_PROPERTY( PropertyInfo(Variant::BOOL,"shadow/enabled"),_SCS("set_shadow_enabled"),_SCS("is_shadow_enabled"));
ADD_PROPERTY( PropertyInfo(Variant::COLOR,"shadow/color"),_SCS("set_shadow_color"),_SCS("get_shadow_color"));
ADD_PROPERTY( PropertyInfo(Variant::INT,"shadow/buffer_size",PROPERTY_HINT_RANGE,"32,16384,1"),_SCS("set_shadow_buffer_size"),_SCS("get_shadow_buffer_size"));
ADD_PROPERTY( PropertyInfo(Variant::INT,"shadow/filter_radius",PROPERTY_HINT_RANGE,"1,4096,0.1"),_SCS("set_shadow_filter_radius"),_SCS("get_shadow_filter_radius"));
ADD_PROPERTY( PropertyInfo(Variant::REAL,"shadow/esm_multiplier",PROPERTY_HINT_RANGE,"1,4096,0.1"),_SCS("set_shadow_esm_multiplier"),_SCS("get_shadow_esm_multiplier"));
ADD_PROPERTY( PropertyInfo(Variant::INT,"shadow/item_mask",PROPERTY_HINT_ALL_FLAGS),_SCS("set_item_shadow_mask"),_SCS("get_item_shadow_mask"));

Expand Down Expand Up @@ -457,6 +472,7 @@ Light2D::Light2D() {
item_shadow_mask=1;
mode=MODE_ADD;
shadow_buffer_size=2048;
shadow_filter_radius=5.0;
shadow_esm_multiplier=80;
energy=1.0;
shadow_color=Color(0,0,0,0);
Expand Down
4 changes: 4 additions & 0 deletions scene/2d/light_2d.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ class Light2D : public Node2D {
int item_mask;
int item_shadow_mask;
int shadow_buffer_size;
float shadow_filter_radius;
float shadow_esm_multiplier;
Mode mode;
Ref<Texture> texture;
Expand Down Expand Up @@ -127,6 +128,9 @@ class Light2D : public Node2D {
void set_shadow_buffer_size( int p_size );
int get_shadow_buffer_size() const;

void set_shadow_filter_radius( float p_filter_radius);
float get_shadow_filter_radius() const;

void set_shadow_esm_multiplier( float p_multiplier);
float get_shadow_esm_multiplier() const;

Expand Down
4 changes: 4 additions & 0 deletions scene/3d/light.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ static const char* _light_param_names[VS::LIGHT_PARAM_MAX]={
"shadow/darkening",
"shadow/z_offset",
"shadow/z_slope_scale",
"shadow/filter_radius",
"shadow/esm_multiplier",
"shadow/blur_passes"
};
Expand Down Expand Up @@ -530,6 +531,7 @@ void Light::_bind_methods() {
ADD_PROPERTYI( PropertyInfo( Variant::REAL, "shadow/darkening", PROPERTY_HINT_RANGE, "0,1,0.01"), _SCS("set_parameter"), _SCS("get_parameter"), PARAM_SHADOW_DARKENING );
ADD_PROPERTYI( PropertyInfo( Variant::REAL, "shadow/z_offset", PROPERTY_HINT_RANGE, "0,128,0.001"), _SCS("set_parameter"), _SCS("get_parameter"), PARAM_SHADOW_Z_OFFSET);
ADD_PROPERTYI( PropertyInfo( Variant::REAL, "shadow/z_slope_scale", PROPERTY_HINT_RANGE, "0,128,0.001"), _SCS("set_parameter"), _SCS("get_parameter"), PARAM_SHADOW_Z_SLOPE_SCALE);
ADD_PROPERTYI( PropertyInfo( Variant::REAL, "shadow/filter_radius", PROPERTY_HINT_RANGE, "0,128,0.001"), _SCS("set_parameter"), _SCS("get_parameter"), PARAM_SHADOW_FILTER_RADIUS);
ADD_PROPERTYI( PropertyInfo( Variant::REAL, "shadow/esm_multiplier", PROPERTY_HINT_RANGE, "1.0,512.0,0.1"), _SCS("set_parameter"), _SCS("get_parameter"), PARAM_SHADOW_ESM_MULTIPLIER);
ADD_PROPERTYI( PropertyInfo( Variant::INT, "shadow/blur_passes", PROPERTY_HINT_RANGE, "0,4,1"), _SCS("set_parameter"), _SCS("get_parameter"), PARAM_SHADOW_BLUR_PASSES);
ADD_PROPERTY( PropertyInfo( Variant::OBJECT, "projector",PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_projector"), _SCS("get_projector"));
Expand All @@ -543,6 +545,7 @@ void Light::_bind_methods() {
BIND_CONSTANT( PARAM_SPOT_ATTENUATION );
BIND_CONSTANT( PARAM_SHADOW_DARKENING );
BIND_CONSTANT( PARAM_SHADOW_Z_OFFSET );
BIND_CONSTANT( PARAM_SHADOW_FILTER_RADIUS );


BIND_CONSTANT( COLOR_DIFFUSE );
Expand Down Expand Up @@ -570,6 +573,7 @@ Light::Light(VisualServer::LightType p_type) {
set_parameter(PARAM_SHADOW_DARKENING,0.0);
set_parameter(PARAM_SHADOW_Z_OFFSET,0.05);
set_parameter(PARAM_SHADOW_Z_SLOPE_SCALE,0);
set_parameter(PARAM_SHADOW_FILTER_RADIUS,5.0);
set_parameter(PARAM_SHADOW_ESM_MULTIPLIER,60);
set_parameter(PARAM_SHADOW_BLUR_PASSES,1);

Expand Down
1 change: 1 addition & 0 deletions scene/3d/light.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ class Light : public VisualInstance {
PARAM_SHADOW_DARKENING=VisualServer::LIGHT_PARAM_SHADOW_DARKENING,
PARAM_SHADOW_Z_OFFSET=VisualServer::LIGHT_PARAM_SHADOW_Z_OFFSET,
PARAM_SHADOW_Z_SLOPE_SCALE=VisualServer::LIGHT_PARAM_SHADOW_Z_SLOPE_SCALE,
PARAM_SHADOW_FILTER_RADIUS=VisualServer::LIGHT_PARAM_SHADOW_FILTER_RADIUS,
PARAM_SHADOW_ESM_MULTIPLIER=VisualServer::LIGHT_PARAM_SHADOW_ESM_MULTIPLIER,
PARAM_SHADOW_BLUR_PASSES=VisualServer::LIGHT_PARAM_SHADOW_BLUR_PASSES,
PARAM_MAX=VisualServer::LIGHT_PARAM_MAX
Expand Down
Loading