Implement distance fade and transparency
The built-in ALPHA in spatial shaders comes pre-set with a per-instance
transparency value. Multiply by it if you want to keep it.
The transparency value of any given GeometryInstance3D is affected by:
- Its new "transparency" property.
- Its own visiblity range when the new "visibility_range_fade_mode"
property is set to "Self".
- Its parent visibility range when the parent's fade mode is
set to "Dependencies".
The "Self" mode will fade-out the instance when reaching the visibility
range limits, while the "Dependencies" mode will fade-in its
dependencies.
Per-instance transparency is only implemented in the forward clustered
renderer, support for mobile should be added in the future.
Co-authored-by: reduz <reduzio@gmail.com>
This commit is contained in:
parent
88d9914519
commit
c571e4a7f4
21 changed files with 371 additions and 92 deletions
|
|
@ -152,9 +152,18 @@ Ref<Material> GeometryInstance3D::get_material_override() const {
|
|||
return material_override;
|
||||
}
|
||||
|
||||
void GeometryInstance3D::set_transparecy(float p_transparency) {
|
||||
transparency = CLAMP(p_transparency, 0.0f, 1.0f);
|
||||
RS::get_singleton()->instance_geometry_set_transparency(get_instance(), transparency);
|
||||
}
|
||||
|
||||
float GeometryInstance3D::get_transparency() const {
|
||||
return transparency;
|
||||
}
|
||||
|
||||
void GeometryInstance3D::set_visibility_range_begin(float p_dist) {
|
||||
visibility_range_begin = p_dist;
|
||||
RS::get_singleton()->instance_geometry_set_visibility_range(get_instance(), visibility_range_begin, visibility_range_end, visibility_range_begin_margin, visibility_range_end_margin);
|
||||
RS::get_singleton()->instance_geometry_set_visibility_range(get_instance(), visibility_range_begin, visibility_range_end, visibility_range_begin_margin, visibility_range_end_margin, (RS::VisibilityRangeFadeMode)visibility_range_fade_mode);
|
||||
update_configuration_warnings();
|
||||
}
|
||||
|
||||
|
|
@ -164,7 +173,7 @@ float GeometryInstance3D::get_visibility_range_begin() const {
|
|||
|
||||
void GeometryInstance3D::set_visibility_range_end(float p_dist) {
|
||||
visibility_range_end = p_dist;
|
||||
RS::get_singleton()->instance_geometry_set_visibility_range(get_instance(), visibility_range_begin, visibility_range_end, visibility_range_begin_margin, visibility_range_end_margin);
|
||||
RS::get_singleton()->instance_geometry_set_visibility_range(get_instance(), visibility_range_begin, visibility_range_end, visibility_range_begin_margin, visibility_range_end_margin, (RS::VisibilityRangeFadeMode)visibility_range_fade_mode);
|
||||
update_configuration_warnings();
|
||||
}
|
||||
|
||||
|
|
@ -174,7 +183,7 @@ float GeometryInstance3D::get_visibility_range_end() const {
|
|||
|
||||
void GeometryInstance3D::set_visibility_range_begin_margin(float p_dist) {
|
||||
visibility_range_begin_margin = p_dist;
|
||||
RS::get_singleton()->instance_geometry_set_visibility_range(get_instance(), visibility_range_begin, visibility_range_end, visibility_range_begin_margin, visibility_range_end_margin);
|
||||
RS::get_singleton()->instance_geometry_set_visibility_range(get_instance(), visibility_range_begin, visibility_range_end, visibility_range_begin_margin, visibility_range_end_margin, (RS::VisibilityRangeFadeMode)visibility_range_fade_mode);
|
||||
}
|
||||
|
||||
float GeometryInstance3D::get_visibility_range_begin_margin() const {
|
||||
|
|
@ -183,13 +192,22 @@ float GeometryInstance3D::get_visibility_range_begin_margin() const {
|
|||
|
||||
void GeometryInstance3D::set_visibility_range_end_margin(float p_dist) {
|
||||
visibility_range_end_margin = p_dist;
|
||||
RS::get_singleton()->instance_geometry_set_visibility_range(get_instance(), visibility_range_begin, visibility_range_end, visibility_range_begin_margin, visibility_range_end_margin);
|
||||
RS::get_singleton()->instance_geometry_set_visibility_range(get_instance(), visibility_range_begin, visibility_range_end, visibility_range_begin_margin, visibility_range_end_margin, (RS::VisibilityRangeFadeMode)visibility_range_fade_mode);
|
||||
}
|
||||
|
||||
float GeometryInstance3D::get_visibility_range_end_margin() const {
|
||||
return visibility_range_end_margin;
|
||||
}
|
||||
|
||||
void GeometryInstance3D::set_visibility_range_fade_mode(VisibilityRangeFadeMode p_mode) {
|
||||
visibility_range_fade_mode = p_mode;
|
||||
RS::get_singleton()->instance_geometry_set_visibility_range(get_instance(), visibility_range_begin, visibility_range_end, visibility_range_begin_margin, visibility_range_end_margin, (RS::VisibilityRangeFadeMode)visibility_range_fade_mode);
|
||||
}
|
||||
|
||||
GeometryInstance3D::VisibilityRangeFadeMode GeometryInstance3D::get_visibility_range_fade_mode() const {
|
||||
return visibility_range_fade_mode;
|
||||
}
|
||||
|
||||
void GeometryInstance3D::_notification(int p_what) {
|
||||
}
|
||||
|
||||
|
|
@ -375,6 +393,9 @@ void GeometryInstance3D::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_lod_bias", "bias"), &GeometryInstance3D::set_lod_bias);
|
||||
ClassDB::bind_method(D_METHOD("get_lod_bias"), &GeometryInstance3D::get_lod_bias);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_transparency", "transparency"), &GeometryInstance3D::set_transparecy);
|
||||
ClassDB::bind_method(D_METHOD("get_transparency"), &GeometryInstance3D::get_transparency);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_visibility_range_end_margin", "distance"), &GeometryInstance3D::set_visibility_range_end_margin);
|
||||
ClassDB::bind_method(D_METHOD("get_visibility_range_end_margin"), &GeometryInstance3D::get_visibility_range_end_margin);
|
||||
|
||||
|
|
@ -387,6 +408,9 @@ void GeometryInstance3D::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_visibility_range_begin", "distance"), &GeometryInstance3D::set_visibility_range_begin);
|
||||
ClassDB::bind_method(D_METHOD("get_visibility_range_begin"), &GeometryInstance3D::get_visibility_range_begin);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_visibility_range_fade_mode", "mode"), &GeometryInstance3D::set_visibility_range_fade_mode);
|
||||
ClassDB::bind_method(D_METHOD("get_visibility_range_fade_mode"), &GeometryInstance3D::get_visibility_range_fade_mode);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_shader_instance_uniform", "uniform", "value"), &GeometryInstance3D::set_shader_instance_uniform);
|
||||
ClassDB::bind_method(D_METHOD("get_shader_instance_uniform", "uniform"), &GeometryInstance3D::get_shader_instance_uniform);
|
||||
|
||||
|
|
@ -408,6 +432,7 @@ void GeometryInstance3D::_bind_methods() {
|
|||
|
||||
ADD_GROUP("Geometry", "");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material_override", PROPERTY_HINT_RESOURCE_TYPE, "BaseMaterial3D,ShaderMaterial", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_DEFERRED_SET_RESOURCE), "set_material_override", "get_material_override");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "transparency", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_transparency", "get_transparency");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "cast_shadow", PROPERTY_HINT_ENUM, "Off,On,Double-Sided,Shadows Only"), "set_cast_shadows_setting", "get_cast_shadows_setting");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "extra_cull_margin", PROPERTY_HINT_RANGE, "0,16384,0.01"), "set_extra_cull_margin", "get_extra_cull_margin");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "lod_bias", PROPERTY_HINT_RANGE, "0.001,128,0.001"), "set_lod_bias", "get_lod_bias");
|
||||
|
|
@ -421,7 +446,7 @@ void GeometryInstance3D::_bind_methods() {
|
|||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "visibility_range_begin_margin", PROPERTY_HINT_RANGE, "0.0,4096.0,0.01"), "set_visibility_range_begin_margin", "get_visibility_range_begin_margin");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "visibility_range_end", PROPERTY_HINT_RANGE, "0.0,4096.0,0.01"), "set_visibility_range_end", "get_visibility_range_end");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "visibility_range_end_margin", PROPERTY_HINT_RANGE, "0.0,4096.0,0.01"), "set_visibility_range_end_margin", "get_visibility_range_end_margin");
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "visibility_range_fade_mode", PROPERTY_HINT_ENUM, "Disabled,Self,Dependencies"), "set_visibility_range_fade_mode", "get_visibility_range_fade_mode");
|
||||
//ADD_SIGNAL( MethodInfo("visibility_changed"));
|
||||
|
||||
BIND_ENUM_CONSTANT(SHADOW_CASTING_SETTING_OFF);
|
||||
|
|
@ -438,6 +463,10 @@ void GeometryInstance3D::_bind_methods() {
|
|||
BIND_ENUM_CONSTANT(LIGHTMAP_SCALE_4X);
|
||||
BIND_ENUM_CONSTANT(LIGHTMAP_SCALE_8X);
|
||||
BIND_ENUM_CONSTANT(LIGHTMAP_SCALE_MAX);
|
||||
|
||||
BIND_ENUM_CONSTANT(VISIBILITY_RANGE_FADE_DISABLED);
|
||||
BIND_ENUM_CONSTANT(VISIBILITY_RANGE_FADE_SELF);
|
||||
BIND_ENUM_CONSTANT(VISIBILITY_RANGE_FADE_DEPENDENCIES);
|
||||
}
|
||||
|
||||
GeometryInstance3D::GeometryInstance3D() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue