diff options
| -rw-r--r-- | doc/classes/DirectionalLight3D.xml | 4 | ||||
| -rw-r--r-- | scene/3d/light_3d.cpp | 34 | ||||
| -rw-r--r-- | scene/3d/light_3d.h | 1 | 
3 files changed, 24 insertions, 15 deletions
diff --git a/doc/classes/DirectionalLight3D.xml b/doc/classes/DirectionalLight3D.xml index f2a6e5b6f8..128c960138 100644 --- a/doc/classes/DirectionalLight3D.xml +++ b/doc/classes/DirectionalLight3D.xml @@ -11,10 +11,10 @@  	</tutorials>  	<members>  		<member name="directional_shadow_blend_splits" type="bool" setter="set_blend_splits" getter="is_blend_splits_enabled" default="false"> -			If [code]true[/code], shadow detail is sacrificed in exchange for smoother transitions between splits. This is ignored when [member directional_shadow_mode] is [code]SHADOW_ORTHOGONAL[/code]. +			If [code]true[/code], shadow detail is sacrificed in exchange for smoother transitions between splits. Enabling shadow blend splitting also has a moderate performance cost. This is ignored when [member directional_shadow_mode] is [code]SHADOW_ORTHOGONAL[/code].  		</member>  		<member name="directional_shadow_fade_start" type="float" setter="set_param" getter="get_param" default="0.8"> -			Proportion of [member directional_shadow_max_distance] at which point the shadow starts to fade. At [member directional_shadow_max_distance] the shadow will disappear. +			Proportion of [member directional_shadow_max_distance] at which point the shadow starts to fade. At [member directional_shadow_max_distance], the shadow will disappear. The default value is a balance between smooth fading and distant shadow visibility. If the camera moves fast and the [member directional_shadow_max_distance] is low, consider lowering [member directional_shadow_fade_start] below [code]0.8[/code] to make shadow transitions less noticeable. On the other hand, if you tuned [member directional_shadow_max_distance] to cover the entire scene, you can set [member directional_shadow_fade_start] to [code]1.0[/code] to prevent the shadow from fading in the distance (it will suddenly cut off instead).  		</member>  		<member name="directional_shadow_max_distance" type="float" setter="set_param" getter="get_param" default="100.0">  			The maximum distance for shadow splits. diff --git a/scene/3d/light_3d.cpp b/scene/3d/light_3d.cpp index c787ba5087..c4b58cefaf 100644 --- a/scene/3d/light_3d.cpp +++ b/scene/3d/light_3d.cpp @@ -200,19 +200,8 @@ void Light3D::_validate_property(PropertyInfo &property) const {  		property.usage = PROPERTY_USAGE_NOEDITOR;  	} -	if (get_light_type() == RS::LIGHT_DIRECTIONAL && property.name == "light_size") { -		property.usage = PROPERTY_USAGE_NONE; -	} - -	if (get_light_type() == RS::LIGHT_DIRECTIONAL && property.name == "light_specular") { -		property.usage = PROPERTY_USAGE_NONE; -	} - -	if (get_light_type() == RS::LIGHT_DIRECTIONAL && property.name == "light_projector") { -		property.usage = PROPERTY_USAGE_NONE; -	} -  	if (get_light_type() != RS::LIGHT_DIRECTIONAL && property.name == "light_angular_distance") { +		// Angular distance is only used in DirectionalLight3D.  		property.usage = PROPERTY_USAGE_NONE;  	}  } @@ -361,6 +350,7 @@ Light3D::~Light3D() {  void DirectionalLight3D::set_shadow_mode(ShadowMode p_mode) {  	shadow_mode = p_mode;  	RS::get_singleton()->light_directional_set_shadow_mode(light, RS::LightDirectionalShadowMode(p_mode)); +	notify_property_list_changed();  }  DirectionalLight3D::ShadowMode DirectionalLight3D::get_shadow_mode() const { @@ -370,6 +360,7 @@ DirectionalLight3D::ShadowMode DirectionalLight3D::get_shadow_mode() const {  void DirectionalLight3D::set_blend_splits(bool p_enable) {  	blend_splits = p_enable;  	RS::get_singleton()->light_directional_set_blend_splits(light, p_enable); +	notify_property_list_changed();  }  bool DirectionalLight3D::is_blend_splits_enabled() const { @@ -385,6 +376,23 @@ bool DirectionalLight3D::is_sky_only() const {  	return sky_only;  } +void DirectionalLight3D::_validate_property(PropertyInfo &property) const { +	if (shadow_mode == SHADOW_ORTHOGONAL && (property.name == "directional_shadow_split_1" || property.name == "directional_shadow_blend_splits")) { +		// Split 2 and split blending are only used with PSSM 2 Splits and PSSM 4 Splits shadow mode. +		property.usage = PROPERTY_USAGE_NOEDITOR; +	} + +	if ((shadow_mode == SHADOW_ORTHOGONAL || shadow_mode == SHADOW_PARALLEL_2_SPLITS) && (property.name == "directional_shadow_split_2" || property.name == "directional_shadow_split_3")) { +		// Splits 3 and 4 are only used with PSSM 4 Splits shadow mode. +		property.usage = PROPERTY_USAGE_NOEDITOR; +	} + +	if (property.name == "light_size" || property.name == "light_projector" || property.name == "light_specular") { +		// Not implemented in DirectionalLight3D (`light_size` is replaced by `light_angular_distance`). +		property.usage = PROPERTY_USAGE_NONE; +	} +} +  void DirectionalLight3D::_bind_methods() {  	ClassDB::bind_method(D_METHOD("set_shadow_mode", "mode"), &DirectionalLight3D::set_shadow_mode);  	ClassDB::bind_method(D_METHOD("get_shadow_mode"), &DirectionalLight3D::get_shadow_mode); @@ -400,8 +408,8 @@ void DirectionalLight3D::_bind_methods() {  	ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_split_1", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_param", "get_param", PARAM_SHADOW_SPLIT_1_OFFSET);  	ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_split_2", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_param", "get_param", PARAM_SHADOW_SPLIT_2_OFFSET);  	ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_split_3", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_param", "get_param", PARAM_SHADOW_SPLIT_3_OFFSET); -	ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_fade_start", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param", "get_param", PARAM_SHADOW_FADE_START);  	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "directional_shadow_blend_splits"), "set_blend_splits", "is_blend_splits_enabled"); +	ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_fade_start", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param", "get_param", PARAM_SHADOW_FADE_START);  	ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_max_distance", PROPERTY_HINT_RANGE, "0,8192,0.1,or_greater,exp"), "set_param", "get_param", PARAM_SHADOW_MAX_DISTANCE);  	ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_pancake_size", PROPERTY_HINT_RANGE, "0,1024,0.1,or_greater,exp"), "set_param", "get_param", PARAM_SHADOW_PANCAKE_SIZE); diff --git a/scene/3d/light_3d.h b/scene/3d/light_3d.h index f788c323f7..a9f5ce27b4 100644 --- a/scene/3d/light_3d.h +++ b/scene/3d/light_3d.h @@ -152,6 +152,7 @@ private:  protected:  	static void _bind_methods(); +	virtual void _validate_property(PropertyInfo &property) const override;  public:  	void set_shadow_mode(ShadowMode p_mode);  |