diff --git a/doc/classes/ReflectionProbe.xml b/doc/classes/ReflectionProbe.xml index 367942682e1..0af58ad08dc 100644 --- a/doc/classes/ReflectionProbe.xml +++ b/doc/classes/ReflectionProbe.xml @@ -23,6 +23,9 @@ The ambient color to use within the [ReflectionProbe]'s box defined by its [member size]. The ambient color will smoothly blend with other [ReflectionProbe]s and the rest of the scene (outside the [ReflectionProbe]'s box defined by its [member size]). + + Defines the distance in meters over which a probe blends into the scene. + If [code]true[/code], enables box projection. This makes reflections look more correct in rectangle-shaped rooms by offsetting the reflection center depending on the camera's location. [b]Note:[/b] To better fit rectangle-shaped rooms that are not aligned to the grid, you can rotate the [ReflectionProbe] node. diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index c245ac77af2..6593d69a20f 100644 --- a/doc/classes/RenderingServer.xml +++ b/doc/classes/RenderingServer.xml @@ -3163,6 +3163,14 @@ If [code]true[/code], reflections will ignore sky contribution. Equivalent to [member ReflectionProbe.interior]. + + + + + + Sets the distance in meters over which a probe blends into the scene. + + diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 907e57823b5..857ab89c326 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -3477,6 +3477,7 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params, material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::REFPROBE1_AMBIENT_MODE, int(probe->ambient_mode), shader->version, instance_variant, spec_constants); material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::REFPROBE1_AMBIENT_COLOR, probe->ambient_color * probe->ambient_color_energy, shader->version, instance_variant, spec_constants); material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::REFPROBE1_LOCAL_MATRIX, inst->reflection_probes_local_transform_cache[0], shader->version, instance_variant, spec_constants); + material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::REFPROBE1_BLEND_DISTANCE, probe->blend_distance, shader->version, instance_variant, spec_constants); glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 8); glBindTexture(GL_TEXTURE_CUBE_MAP, light_storage->reflection_probe_instance_get_texture(inst->reflection_probe_rid_cache[0])); @@ -3495,6 +3496,7 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params, material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::REFPROBE2_AMBIENT_MODE, int(probe->ambient_mode), shader->version, instance_variant, spec_constants); material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::REFPROBE2_AMBIENT_COLOR, probe->ambient_color * probe->ambient_color_energy, shader->version, instance_variant, spec_constants); material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::REFPROBE2_LOCAL_MATRIX, inst->reflection_probes_local_transform_cache[1], shader->version, instance_variant, spec_constants); + material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::REFPROBE2_BLEND_DISTANCE, probe->blend_distance, shader->version, instance_variant, spec_constants); glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 9); glBindTexture(GL_TEXTURE_CUBE_MAP, light_storage->reflection_probe_instance_get_texture(inst->reflection_probe_rid_cache[1])); diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl index f8b495b7fb3..2e74df850fb 100644 --- a/drivers/gles3/shaders/scene.glsl +++ b/drivers/gles3/shaders/scene.glsl @@ -885,6 +885,7 @@ uniform vec3 refprobe1_box_offset; uniform highp mat4 refprobe1_local_matrix; uniform bool refprobe1_exterior; uniform float refprobe1_intensity; +uniform float refprobe1_blend_distance; uniform int refprobe1_ambient_mode; uniform vec4 refprobe1_ambient_color; @@ -898,6 +899,7 @@ uniform vec3 refprobe2_box_offset; uniform highp mat4 refprobe2_local_matrix; uniform bool refprobe2_exterior; uniform float refprobe2_intensity; +uniform float refprobe2_blend_distance; uniform int refprobe2_ambient_mode; uniform vec4 refprobe2_ambient_color; @@ -1606,7 +1608,7 @@ void reflection_process(samplerCube reflection_map, vec3 normal, vec3 vertex, mat4 local_matrix, bool use_box_project, vec3 box_extents, vec3 box_offset, - bool exterior, float intensity, int ref_ambient_mode, vec4 ref_ambient_color, + bool exterior, float intensity, float blend_distance, int ref_ambient_mode, vec4 ref_ambient_color, float roughness, vec3 ambient, vec3 skybox, inout highp vec4 reflection_accum, inout highp vec4 ambient_accum) { vec4 reflection; @@ -1618,10 +1620,20 @@ void reflection_process(samplerCube reflection_map, } vec3 inner_pos = abs(local_pos / box_extents); - float blend = max(inner_pos.x, max(inner_pos.y, inner_pos.z)); - blend = mix(length(inner_pos), blend, blend); - blend *= blend; + vec3 blend_axes = vec3(0.0, 0.0, 0.0); + float blend = 0.0; + if (blend_distance != 0) { + for (int i = 0; i < 3; i++) { + float axis_blend_distance = min(blend_distance, box_extents[i]); + blend_axes[i] = (inner_pos[i] * box_extents[i]) - box_extents[i] + axis_blend_distance; + blend_axes[i] = blend_axes[i] / axis_blend_distance; + blend_axes[i] = clamp(blend_axes[i], 0.0, 1.0); + } + blend = pow((1.0 - blend_axes.x) * (1.0 - blend_axes.y) * (1.0 - blend_axes.z), 2); + blend = 1 - blend; + } blend = max(0.0, 1.0 - blend); + blend = clamp(blend, 0.0, 1.0); //reflect and make local vec3 ref_normal = normalize(reflect(vertex, normal)); @@ -1980,14 +1992,14 @@ void main() { reflection_process(refprobe1_texture, normal, vertex_interp, refprobe1_local_matrix, refprobe1_use_box_project, refprobe1_box_extents, refprobe1_box_offset, - refprobe1_exterior, refprobe1_intensity, refprobe1_ambient_mode, refprobe1_ambient_color, + refprobe1_exterior, refprobe1_intensity, refprobe1_blend_distance, refprobe1_ambient_mode, refprobe1_ambient_color, roughness, ambient_light, specular_light, reflection_accum, ambient_accum); #ifdef SECOND_REFLECTION_PROBE reflection_process(refprobe2_texture, normal, vertex_interp, refprobe2_local_matrix, refprobe2_use_box_project, refprobe2_box_extents, refprobe2_box_offset, - refprobe2_exterior, refprobe2_intensity, refprobe2_ambient_mode, refprobe2_ambient_color, + refprobe2_exterior, refprobe2_intensity, refprobe2_blend_distance, refprobe2_ambient_mode, refprobe2_ambient_color, roughness, ambient_light, specular_light, reflection_accum, ambient_accum); #endif // SECOND_REFLECTION_PROBE diff --git a/drivers/gles3/storage/light_storage.cpp b/drivers/gles3/storage/light_storage.cpp index 4ec37fe4ab2..9c1efcee7ba 100644 --- a/drivers/gles3/storage/light_storage.cpp +++ b/drivers/gles3/storage/light_storage.cpp @@ -471,6 +471,13 @@ void LightStorage::reflection_probe_set_intensity(RID p_probe, float p_intensity reflection_probe->intensity = p_intensity; } +void LightStorage::reflection_probe_set_blend_distance(RID p_probe, float p_blend_distance) { + ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe); + ERR_FAIL_NULL(reflection_probe); + + reflection_probe->blend_distance = p_blend_distance; +} + void LightStorage::reflection_probe_set_ambient_mode(RID p_probe, RS::ReflectionProbeAmbientMode p_mode) { ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe); ERR_FAIL_NULL(reflection_probe); diff --git a/drivers/gles3/storage/light_storage.h b/drivers/gles3/storage/light_storage.h index 0bf410fac60..27d8b5afbfa 100644 --- a/drivers/gles3/storage/light_storage.h +++ b/drivers/gles3/storage/light_storage.h @@ -118,6 +118,7 @@ struct ReflectionProbe { RS::ReflectionProbeUpdateMode update_mode = RS::REFLECTION_PROBE_UPDATE_ONCE; int resolution = 256; float intensity = 1.0; + float blend_distance = 1.0; RS::ReflectionProbeAmbientMode ambient_mode = RS::REFLECTION_PROBE_AMBIENT_ENVIRONMENT; Color ambient_color; float ambient_color_energy = 1.0; @@ -642,6 +643,7 @@ public: virtual void reflection_probe_set_update_mode(RID p_probe, RS::ReflectionProbeUpdateMode p_mode) override; virtual void reflection_probe_set_intensity(RID p_probe, float p_intensity) override; + virtual void reflection_probe_set_blend_distance(RID p_probe, float p_blend_distance) override; virtual void reflection_probe_set_ambient_mode(RID p_probe, RS::ReflectionProbeAmbientMode p_mode) override; virtual void reflection_probe_set_ambient_color(RID p_probe, const Color &p_color) override; virtual void reflection_probe_set_ambient_energy(RID p_probe, float p_energy) override; diff --git a/editor/plugins/gizmos/reflection_probe_gizmo_plugin.cpp b/editor/plugins/gizmos/reflection_probe_gizmo_plugin.cpp index d74c434410d..6a0a7592f79 100644 --- a/editor/plugins/gizmos/reflection_probe_gizmo_plugin.cpp +++ b/editor/plugins/gizmos/reflection_probe_gizmo_plugin.cpp @@ -165,6 +165,32 @@ void ReflectionProbeGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { aabb.position = -size / 2; aabb.size = size; + AABB blend_aabb; + for (int i = 0; i < 3; i++) { + blend_aabb.position[i] = aabb.position[i] + probe->get_blend_distance(); + blend_aabb.size[i] = aabb.size[i] - probe->get_blend_distance() * 2.0; + if (blend_aabb.size[i] < blend_aabb.position[i]) { + blend_aabb.position[i] = aabb.position[i] + aabb.size[i] / 2.0; + blend_aabb.size[i] = 0.0; + } + } + + if (probe->get_blend_distance() != 0.0) { + for (int i = 0; i < 12; i++) { + Vector3 a; + Vector3 b; + blend_aabb.get_edge(i, a, b); + lines.push_back(a); + lines.push_back(b); + } + + for (int i = 0; i < 8; i++) { + Vector3 ep = aabb.get_endpoint(i); + internal_lines.push_back(blend_aabb.get_endpoint(i)); + internal_lines.push_back(ep); + } + } + Vector handles = helper->box_get_handles(probe->get_size()); if (probe->get_origin_offset() != Vector3(0.0, 0.0, 0.0)) { diff --git a/scene/3d/reflection_probe.cpp b/scene/3d/reflection_probe.cpp index c5654d0d771..a2c7bf428da 100644 --- a/scene/3d/reflection_probe.cpp +++ b/scene/3d/reflection_probe.cpp @@ -39,6 +39,16 @@ float ReflectionProbe::get_intensity() const { return intensity; } +void ReflectionProbe::set_blend_distance(float p_blend_distance) { + blend_distance = p_blend_distance; + RS::get_singleton()->reflection_probe_set_blend_distance(probe, p_blend_distance); + update_gizmos(); +} + +float ReflectionProbe::get_blend_distance() const { + return blend_distance; +} + void ReflectionProbe::set_ambient_mode(AmbientMode p_mode) { ambient_mode = p_mode; RS::get_singleton()->reflection_probe_set_ambient_mode(probe, RS::ReflectionProbeAmbientMode(p_mode)); @@ -202,6 +212,9 @@ void ReflectionProbe::_bind_methods() { ClassDB::bind_method(D_METHOD("set_intensity", "intensity"), &ReflectionProbe::set_intensity); ClassDB::bind_method(D_METHOD("get_intensity"), &ReflectionProbe::get_intensity); + ClassDB::bind_method(D_METHOD("set_blend_distance", "blend_distance"), &ReflectionProbe::set_blend_distance); + ClassDB::bind_method(D_METHOD("get_blend_distance"), &ReflectionProbe::get_blend_distance); + ClassDB::bind_method(D_METHOD("set_ambient_mode", "ambient"), &ReflectionProbe::set_ambient_mode); ClassDB::bind_method(D_METHOD("get_ambient_mode"), &ReflectionProbe::get_ambient_mode); @@ -243,6 +256,7 @@ void ReflectionProbe::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "update_mode", PROPERTY_HINT_ENUM, "Once (Fast),Always (Slow)"), "set_update_mode", "get_update_mode"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "intensity", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_intensity", "get_intensity"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "blend_distance", PROPERTY_HINT_RANGE, "0,8,0.01,or_greater,suffix:m"), "set_blend_distance", "get_blend_distance"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max_distance", PROPERTY_HINT_RANGE, "0,16384,0.1,or_greater,exp,suffix:m"), "set_max_distance", "get_max_distance"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "size", PROPERTY_HINT_NONE, "suffix:m"), "set_size", "get_size"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "origin_offset", PROPERTY_HINT_NONE, "suffix:m"), "set_origin_offset", "get_origin_offset"); diff --git a/scene/3d/reflection_probe.h b/scene/3d/reflection_probe.h index 72212942289..3c3a38d7a60 100644 --- a/scene/3d/reflection_probe.h +++ b/scene/3d/reflection_probe.h @@ -51,6 +51,7 @@ public: private: RID probe; float intensity = 1.0; + float blend_distance = 1.0; float max_distance = 0.0; Vector3 size = Vector3(20, 20, 20); Vector3 origin_offset = Vector3(0, 0, 0); @@ -78,6 +79,9 @@ public: void set_intensity(float p_intensity); float get_intensity() const; + void set_blend_distance(float p_blend_distance); + float get_blend_distance() const; + void set_ambient_mode(AmbientMode p_mode); AmbientMode get_ambient_mode() const; diff --git a/servers/rendering/dummy/storage/light_storage.h b/servers/rendering/dummy/storage/light_storage.h index 44cdffaedcc..bb7ffae0d9e 100644 --- a/servers/rendering/dummy/storage/light_storage.h +++ b/servers/rendering/dummy/storage/light_storage.h @@ -124,6 +124,7 @@ public: virtual void reflection_probe_set_update_mode(RID p_probe, RS::ReflectionProbeUpdateMode p_mode) override {} virtual void reflection_probe_set_intensity(RID p_probe, float p_intensity) override {} + virtual void reflection_probe_set_blend_distance(RID p_probe, float p_blend_distance) override {} virtual void reflection_probe_set_ambient_mode(RID p_probe, RS::ReflectionProbeAmbientMode p_mode) override {} virtual void reflection_probe_set_ambient_color(RID p_probe, const Color &p_color) override {} virtual void reflection_probe_set_ambient_energy(RID p_probe, float p_energy) override {} diff --git a/servers/rendering/renderer_rd/shaders/light_data_inc.glsl b/servers/rendering/renderer_rd/shaders/light_data_inc.glsl index 7488a3f2c73..6f0ca2176d7 100644 --- a/servers/rendering/renderer_rd/shaders/light_data_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/light_data_inc.glsl @@ -41,10 +41,14 @@ struct ReflectionData { uint mask; mediump vec3 ambient; // ambient color mediump float intensity; + mediump float blend_distance; bool exterior; bool box_project; uint ambient_mode; float exposure_normalization; + float pad0; + float pad1; + float pad2; //0-8 is intensity,8-9 is ambient, mode highp mat4 local_matrix; // up to here for spot and omni, rest is for directional // notes: for ambientblend, use distance to edge to blend between already existing global environment diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl index 40804948b98..9904ef8eab0 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl @@ -876,11 +876,20 @@ void reflection_process(uint ref_index, vec3 vertex, vec3 ref_vec, vec3 normal, } vec3 inner_pos = abs(local_pos / box_extents); - float blend = max(inner_pos.x, max(inner_pos.y, inner_pos.z)); - //make blend more rounded - blend = mix(length(inner_pos), blend, blend); - blend *= blend; + vec3 blend_axes = vec3(0.0, 0.0, 0.0); + float blend = 0.0; + if (reflections.data[ref_index].blend_distance != 0) { + for (int i = 0; i < 3; i++) { + float axis_blend_distance = min(reflections.data[ref_index].blend_distance, box_extents[i]); + blend_axes[i] = (inner_pos[i] * box_extents[i]) - box_extents[i] + axis_blend_distance; + blend_axes[i] = blend_axes[i] / axis_blend_distance; + blend_axes[i] = clamp(blend_axes[i], 0.0, 1.0); + } + blend = pow((1.0 - blend_axes.x) * (1.0 - blend_axes.y) * (1.0 - blend_axes.z), 2); + blend = 1 - blend; + } blend = max(0.0, 1.0 - blend); + blend = clamp(blend, 0.0, 1.0); if (reflections.data[ref_index].intensity > 0.0) { // compute reflection diff --git a/servers/rendering/renderer_rd/storage_rd/light_storage.cpp b/servers/rendering/renderer_rd/storage_rd/light_storage.cpp index 5c1283c7624..abf673a1fa5 100644 --- a/servers/rendering/renderer_rd/storage_rd/light_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/light_storage.cpp @@ -1073,6 +1073,13 @@ void LightStorage::reflection_probe_set_intensity(RID p_probe, float p_intensity reflection_probe->intensity = p_intensity; } +void LightStorage::reflection_probe_set_blend_distance(RID p_probe, float p_blend_distance) { + ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe); + ERR_FAIL_NULL(reflection_probe); + + reflection_probe->blend_distance = p_blend_distance; +} + void LightStorage::reflection_probe_set_ambient_mode(RID p_probe, RS::ReflectionProbeAmbientMode p_mode) { ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe); ERR_FAIL_NULL(reflection_probe); @@ -1273,6 +1280,13 @@ float LightStorage::reflection_probe_get_intensity(RID p_probe) const { return reflection_probe->intensity; } +float LightStorage::reflection_probe_get_blend_distance(RID p_probe) const { + const ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe); + ERR_FAIL_NULL_V(reflection_probe, 0); + + return reflection_probe->blend_distance; +} + bool LightStorage::reflection_probe_is_interior(RID p_probe) const { const ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe); ERR_FAIL_NULL_V(reflection_probe, false); @@ -1762,6 +1776,7 @@ void LightStorage::update_reflection_probe_buffer(RenderDataRD *p_render_data, c reflection_ubo.mask = probe->reflection_mask; reflection_ubo.intensity = probe->intensity; + reflection_ubo.blend_distance = probe->blend_distance; reflection_ubo.ambient_mode = probe->ambient_mode; reflection_ubo.exterior = !probe->interior; diff --git a/servers/rendering/renderer_rd/storage_rd/light_storage.h b/servers/rendering/renderer_rd/storage_rd/light_storage.h index ccba9e4aa5b..b71c1d36fdd 100644 --- a/servers/rendering/renderer_rd/storage_rd/light_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/light_storage.h @@ -223,6 +223,7 @@ private: RS::ReflectionProbeUpdateMode update_mode = RS::REFLECTION_PROBE_UPDATE_ONCE; int resolution = 256; float intensity = 1.0; + float blend_distance = 1.0; RS::ReflectionProbeAmbientMode ambient_mode = RS::REFLECTION_PROBE_AMBIENT_ENVIRONMENT; Color ambient_color; float ambient_color_energy = 1.0; @@ -303,10 +304,14 @@ private: uint32_t mask; float ambient[3]; // ambient color, float intensity; + float blend_distance; uint32_t exterior; uint32_t box_project; uint32_t ambient_mode; float exposure_normalization; + uint32_t pad0; + uint32_t pad1; + uint32_t pad2; float local_matrix[16]; // up to here for spot and omni, rest is for directional }; @@ -833,6 +838,7 @@ public: virtual void reflection_probe_set_update_mode(RID p_probe, RS::ReflectionProbeUpdateMode p_mode) override; virtual void reflection_probe_set_intensity(RID p_probe, float p_intensity) override; + virtual void reflection_probe_set_blend_distance(RID p_probe, float p_blend_distance) override; virtual void reflection_probe_set_ambient_mode(RID p_probe, RS::ReflectionProbeAmbientMode p_mode) override; virtual void reflection_probe_set_ambient_color(RID p_probe, const Color &p_color) override; virtual void reflection_probe_set_ambient_energy(RID p_probe, float p_energy) override; @@ -863,6 +869,7 @@ public: virtual bool reflection_probe_renders_shadows(RID p_probe) const override; float reflection_probe_get_intensity(RID p_probe) const; + float reflection_probe_get_blend_distance(RID p_probe) const; bool reflection_probe_is_interior(RID p_probe) const; bool reflection_probe_is_box_projection(RID p_probe) const; RS::ReflectionProbeAmbientMode reflection_probe_get_ambient_mode(RID p_probe) const; diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h index 2d53d6e08e6..b3c6d14272d 100644 --- a/servers/rendering/rendering_server_default.h +++ b/servers/rendering/rendering_server_default.h @@ -460,6 +460,7 @@ public: FUNC2(reflection_probe_set_update_mode, RID, ReflectionProbeUpdateMode) FUNC2(reflection_probe_set_intensity, RID, float) + FUNC2(reflection_probe_set_blend_distance, RID, float) FUNC2(reflection_probe_set_ambient_color, RID, const Color &) FUNC2(reflection_probe_set_ambient_energy, RID, float) FUNC2(reflection_probe_set_ambient_mode, RID, ReflectionProbeAmbientMode) diff --git a/servers/rendering/storage/light_storage.h b/servers/rendering/storage/light_storage.h index 7d6cfd94944..aa9bf58e235 100644 --- a/servers/rendering/storage/light_storage.h +++ b/servers/rendering/storage/light_storage.h @@ -111,6 +111,7 @@ public: virtual void reflection_probe_set_update_mode(RID p_probe, RS::ReflectionProbeUpdateMode p_mode) = 0; virtual void reflection_probe_set_resolution(RID p_probe, int p_resolution) = 0; virtual void reflection_probe_set_intensity(RID p_probe, float p_intensity) = 0; + virtual void reflection_probe_set_blend_distance(RID p_probe, float p_blend_distance) = 0; virtual void reflection_probe_set_ambient_mode(RID p_probe, RS::ReflectionProbeAmbientMode p_mode) = 0; virtual void reflection_probe_set_ambient_color(RID p_probe, const Color &p_color) = 0; virtual void reflection_probe_set_ambient_energy(RID p_probe, float p_energy) = 0; diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index 16e05c73d3c..9d3acdd42bc 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -2571,6 +2571,7 @@ void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("reflection_probe_create"), &RenderingServer::reflection_probe_create); ClassDB::bind_method(D_METHOD("reflection_probe_set_update_mode", "probe", "mode"), &RenderingServer::reflection_probe_set_update_mode); ClassDB::bind_method(D_METHOD("reflection_probe_set_intensity", "probe", "intensity"), &RenderingServer::reflection_probe_set_intensity); + ClassDB::bind_method(D_METHOD("reflection_probe_set_blend_distance", "probe", "blend_distance"), &RenderingServer::reflection_probe_set_blend_distance); ClassDB::bind_method(D_METHOD("reflection_probe_set_ambient_mode", "probe", "mode"), &RenderingServer::reflection_probe_set_ambient_mode); ClassDB::bind_method(D_METHOD("reflection_probe_set_ambient_color", "probe", "color"), &RenderingServer::reflection_probe_set_ambient_color); ClassDB::bind_method(D_METHOD("reflection_probe_set_ambient_energy", "probe", "energy"), &RenderingServer::reflection_probe_set_ambient_energy); diff --git a/servers/rendering_server.h b/servers/rendering_server.h index 49990d72cdc..8f7aad68693 100644 --- a/servers/rendering_server.h +++ b/servers/rendering_server.h @@ -622,6 +622,7 @@ public: virtual void reflection_probe_set_update_mode(RID p_probe, ReflectionProbeUpdateMode p_mode) = 0; virtual void reflection_probe_set_intensity(RID p_probe, float p_intensity) = 0; + virtual void reflection_probe_set_blend_distance(RID p_probe, float p_blend_distance) = 0; enum ReflectionProbeAmbientMode { REFLECTION_PROBE_AMBIENT_DISABLED,