diff --git a/doc/classes/ReflectionProbe.xml b/doc/classes/ReflectionProbe.xml
index 8bf8534334f6..c31c525fb22b 100644
--- a/doc/classes/ReflectionProbe.xml
+++ b/doc/classes/ReflectionProbe.xml
@@ -10,6 +10,15 @@
$DOCS_URL/tutorials/3d/reflection_probes.html
+
+
+
+
+ Queues an update of the ReflectionProbe cubemap and ambient lighting. The update will not be visible immediately; it typically takes 6 frames for the update to be visible (since 1 cubemap face is rendered per frame). [method queue_update] should be called [i]after[/i] modifying nearby objects to ensure the reflection remains up-to-date.
+ [b]Note:[/b] [method queue_update] only has an effect when [member update_mode] is [constant UPDATE_ONCE].
+
+
+
@@ -24,7 +33,7 @@
Sets the cull mask which determines what objects are drawn by this probe. Every [VisualInstance3D] with a layer included in this cull mask will be rendered by the probe. It is best to only include large objects which are likely to take up a lot of space in the reflection in order to save on rendering cost.
- If [code]true[/code], computes shadows in the reflection probe. This makes the reflection probe slower to render; you may want to disable this if using the [constant UPDATE_ALWAYS] [member update_mode].
+ If [code]true[/code], computes shadows in the reflection probe. This makes the reflection probe slower to render; you may want to disable this if using the [constant UPDATE_ALWAYS_FULL] [member update_mode].
The size of the reflection probe. The larger the extents, the more space covered by the probe, which will lower the perceived resolution. It is best to keep the extents only as large as you need them.
@@ -44,15 +53,18 @@
Sets the origin offset to be used when this reflection probe is in box project mode.
- Sets how frequently the probe is updated. Can be [constant UPDATE_ONCE] or [constant UPDATE_ALWAYS].
+ Sets how frequently the probe is updated. Can be [constant UPDATE_ONCE] or [constant UPDATE_ALWAYS_FULL].
- Update the probe once on the next frame. The corresponding radiance map will be generated over the following six frames. This is slower to update than [constant UPDATE_ALWAYS] but can result in higher quality reflections.
+ Update the probe once on the next frame. The corresponding radiance map will be generated over the following six frames. This is slower to update than [constant UPDATE_ALWAYS_FULL] but can result in higher quality reflections thanks to better roughness filtering.
-
- Update the probe every frame. This is needed when you want to capture dynamic objects. However, it results in an increased render time. Use [constant UPDATE_ONCE] whenever possible.
+
+ Always update the probe in an incremental manner. The corresponding radiance map will be generated over the following six frames. This is slower to update than [constant UPDATE_ALWAYS_FULL], but it can result in higher quality reflections thanks to better roughness filtering. If the real-time aspect is not needed, use [constant UPDATE_ONCE] for better performance instead.
+
+
+ Update the probe every frame. This is the best-looking option for fast-moving dynamic objects. However, it results in a significantly increased render time. Use [constant UPDATE_ONCE] or [constant UPDATE_ALWAYS_INCREMENTAL] whenever possible.
diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml
index 0700650a915d..91ad2d54fde1 100644
--- a/doc/classes/RenderingServer.xml
+++ b/doc/classes/RenderingServer.xml
@@ -3764,10 +3764,13 @@
- Reflection probe will update reflections once and then stop.
+ Reflection probe will update reflections once and then stop. This is the fastest update mode in terms of performance.
-
- Reflection probe will update each frame. This mode is necessary to capture moving objects.
+
+ Reflection probe will update incrementally over 6 frames, even when there are no changes made to the ReflectionProbe itself. This mode provides the best result when capturing slow-moving dynamic objects.
+
+
+ Reflection probe will update each frame. This mode provides the best result when capturing fast-moving dynamic objects.
diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp
index f19b4a0ce213..2bc39eefedae 100644
--- a/drivers/gles3/rasterizer_storage_gles3.cpp
+++ b/drivers/gles3/rasterizer_storage_gles3.cpp
@@ -2283,13 +2283,6 @@ void RasterizerStorageGLES3::mesh_instance_check_for_update(RID p_mesh_instance)
void RasterizerStorageGLES3::update_mesh_instances() {
}
-void RasterizerStorageGLES3::reflection_probe_set_lod_threshold(RID p_probe, float p_ratio) {
-}
-
-float RasterizerStorageGLES3::reflection_probe_get_lod_threshold(RID p_probe) const {
- return 0.0;
-}
-
void RasterizerStorageGLES3::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface) {
}
@@ -2612,6 +2605,12 @@ void RasterizerStorageGLES3::reflection_probe_set_cull_mask(RID p_probe, uint32_
void RasterizerStorageGLES3::reflection_probe_set_resolution(RID p_probe, int p_resolution) {
}
+void RasterizerStorageGLES3::reflection_probe_set_lod_threshold(RID p_probe, float p_ratio) {
+}
+
+void RasterizerStorageGLES3::reflection_probe_queue_update(RID p_probe) {
+}
+
AABB RasterizerStorageGLES3::reflection_probe_get_aabb(RID p_probe) const {
return AABB();
}
@@ -2640,6 +2639,10 @@ bool RasterizerStorageGLES3::reflection_probe_renders_shadows(RID p_probe) const
return false;
}
+float RasterizerStorageGLES3::reflection_probe_get_lod_threshold(RID p_probe) const {
+ return 0.0;
+}
+
void RasterizerStorageGLES3::base_update_dependency(RID p_base, DependencyTracker *p_instance) {
}
diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h
index 3f9f208964dc..a60beb026d1c 100644
--- a/drivers/gles3/rasterizer_storage_gles3.h
+++ b/drivers/gles3/rasterizer_storage_gles3.h
@@ -809,8 +809,6 @@ class RasterizerStorageGLES3 : public RendererStorage {
void mesh_instance_set_blend_shape_weight(RID p_mesh_instance, int p_shape, float p_weight) override;
void mesh_instance_check_for_update(RID p_mesh_instance) override;
void update_mesh_instances() override;
- void reflection_probe_set_lod_threshold(RID p_probe, float p_ratio) override;
- float reflection_probe_get_lod_threshold(RID p_probe) const override;
void mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface) override;
@@ -933,6 +931,9 @@ class RasterizerStorageGLES3 : public RendererStorage {
void reflection_probe_set_enable_shadows(RID p_probe, bool p_enable) override;
void reflection_probe_set_cull_mask(RID p_probe, uint32_t p_layers) override;
void reflection_probe_set_resolution(RID p_probe, int p_resolution) override;
+ void reflection_probe_set_lod_threshold(RID p_probe, float p_ratio) override;
+
+ void reflection_probe_queue_update(RID p_probe) override;
AABB reflection_probe_get_aabb(RID p_probe) const override;
RS::ReflectionProbeUpdateMode reflection_probe_get_update_mode(RID p_probe) const override;
@@ -941,6 +942,7 @@ class RasterizerStorageGLES3 : public RendererStorage {
Vector3 reflection_probe_get_origin_offset(RID p_probe) const override;
float reflection_probe_get_origin_max_distance(RID p_probe) const override;
bool reflection_probe_renders_shadows(RID p_probe) const override;
+ float reflection_probe_get_lod_threshold(RID p_probe) const override;
void base_update_dependency(RID p_base, DependencyTracker *p_instance) override;
void skeleton_update_dependency(RID p_base, DependencyTracker *p_instance) override;
diff --git a/scene/3d/reflection_probe.cpp b/scene/3d/reflection_probe.cpp
index f7f19596a747..04a052817dfe 100644
--- a/scene/3d/reflection_probe.cpp
+++ b/scene/3d/reflection_probe.cpp
@@ -171,6 +171,15 @@ ReflectionProbe::UpdateMode ReflectionProbe::get_update_mode() const {
return update_mode;
}
+void ReflectionProbe::queue_update() {
+ // Queuing an update only makes sense when the update mode is set to Once.
+ if (update_mode != UPDATE_ONCE) {
+ return;
+ }
+
+ RS::get_singleton()->reflection_probe_queue_update(probe);
+}
+
AABB ReflectionProbe::get_aabb() const {
AABB aabb;
aabb.position = -origin_offset;
@@ -231,7 +240,9 @@ void ReflectionProbe::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_update_mode", "mode"), &ReflectionProbe::set_update_mode);
ClassDB::bind_method(D_METHOD("get_update_mode"), &ReflectionProbe::get_update_mode);
- ADD_PROPERTY(PropertyInfo(Variant::INT, "update_mode", PROPERTY_HINT_ENUM, "Once (Fast),Always (Slow)"), "set_update_mode", "get_update_mode");
+ ClassDB::bind_method(D_METHOD("queue_update"), &ReflectionProbe::queue_update);
+
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "update_mode", PROPERTY_HINT_ENUM, "Once (Fast),Always Incremental (Average),Always Full (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, "max_distance", PROPERTY_HINT_RANGE, "0,16384,0.1,or_greater,exp"), "set_max_distance", "get_max_distance");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "extents"), "set_extents", "get_extents");
@@ -248,7 +259,8 @@ void ReflectionProbe::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ambient_color_energy", PROPERTY_HINT_RANGE, "0,16,0.01"), "set_ambient_color_energy", "get_ambient_color_energy");
BIND_ENUM_CONSTANT(UPDATE_ONCE);
- BIND_ENUM_CONSTANT(UPDATE_ALWAYS);
+ BIND_ENUM_CONSTANT(UPDATE_ALWAYS_INCREMENTAL);
+ BIND_ENUM_CONSTANT(UPDATE_ALWAYS_FULL);
BIND_ENUM_CONSTANT(AMBIENT_DISABLED);
BIND_ENUM_CONSTANT(AMBIENT_ENVIRONMENT);
diff --git a/scene/3d/reflection_probe.h b/scene/3d/reflection_probe.h
index d1b9b12f6514..6adba4513f2a 100644
--- a/scene/3d/reflection_probe.h
+++ b/scene/3d/reflection_probe.h
@@ -39,7 +39,8 @@ class ReflectionProbe : public VisualInstance3D {
public:
enum UpdateMode {
UPDATE_ONCE,
- UPDATE_ALWAYS,
+ UPDATE_ALWAYS_INCREMENTAL,
+ UPDATE_ALWAYS_FULL,
};
enum AmbientMode {
@@ -112,6 +113,8 @@ class ReflectionProbe : public VisualInstance3D {
void set_update_mode(UpdateMode p_mode);
UpdateMode get_update_mode() const;
+ void queue_update();
+
virtual AABB get_aabb() const override;
virtual Vector get_faces(uint32_t p_usage_flags) const override;
diff --git a/servers/rendering/rasterizer_dummy.h b/servers/rendering/rasterizer_dummy.h
index 3451ea2d393c..293ee5eb3b98 100644
--- a/servers/rendering/rasterizer_dummy.h
+++ b/servers/rendering/rasterizer_dummy.h
@@ -327,8 +327,6 @@ class RasterizerStorageDummy : public RendererStorage {
void mesh_instance_set_blend_shape_weight(RID p_mesh_instance, int p_shape, float p_weight) override {}
void mesh_instance_check_for_update(RID p_mesh_instance) override {}
void update_mesh_instances() override {}
- void reflection_probe_set_lod_threshold(RID p_probe, float p_ratio) override {}
- float reflection_probe_get_lod_threshold(RID p_probe) const override { return 0.0; }
void mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface) override {}
@@ -451,6 +449,9 @@ class RasterizerStorageDummy : public RendererStorage {
void reflection_probe_set_enable_shadows(RID p_probe, bool p_enable) override {}
void reflection_probe_set_cull_mask(RID p_probe, uint32_t p_layers) override {}
void reflection_probe_set_resolution(RID p_probe, int p_resolution) override {}
+ void reflection_probe_set_lod_threshold(RID p_probe, float p_ratio) override {}
+
+ void reflection_probe_queue_update(RID p_probe) override {}
AABB reflection_probe_get_aabb(RID p_probe) const override { return AABB(); }
RS::ReflectionProbeUpdateMode reflection_probe_get_update_mode(RID p_probe) const override { return RenderingServer::REFLECTION_PROBE_UPDATE_ONCE; }
@@ -459,6 +460,7 @@ class RasterizerStorageDummy : public RendererStorage {
Vector3 reflection_probe_get_origin_offset(RID p_probe) const override { return Vector3(); }
float reflection_probe_get_origin_max_distance(RID p_probe) const override { return 0.0; }
bool reflection_probe_renders_shadows(RID p_probe) const override { return false; }
+ float reflection_probe_get_lod_threshold(RID p_probe) const override { return 0.0; }
void base_update_dependency(RID p_base, DependencyTracker *p_instance) override {}
void skeleton_update_dependency(RID p_base, DependencyTracker *p_instance) override {}
diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp
index 7c35b01b5007..411b52da0987 100644
--- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp
+++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp
@@ -632,7 +632,7 @@ bool RendererSceneRenderRD::reflection_probe_instance_needs_redraw(RID p_instanc
return true;
}
- if (storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS) {
+ if (storage->reflection_probe_get_update_mode(rpi->probe) != RS::REFLECTION_PROBE_UPDATE_ONCE) {
return true;
}
@@ -656,12 +656,12 @@ bool RendererSceneRenderRD::reflection_probe_instance_begin_render(RID p_instanc
RD::get_singleton()->draw_command_begin_label("Reflection probe render");
- if (storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS && atlas->reflection.is_valid() && atlas->size != 256) {
- WARN_PRINT("ReflectionProbes set to UPDATE_ALWAYS must have an atlas size of 256. Please update the atlas size in the ProjectSettings.");
+ if (storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS_FULL && atlas->reflection.is_valid() && atlas->size != 256) {
+ WARN_PRINT("ReflectionProbes set to UPDATE_ALWAYS_FULL must have an atlas size of 256. Please update the atlas size in the ProjectSettings.");
reflection_atlas_set_size(p_reflection_atlas, 256, atlas->count);
}
- if (storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS && atlas->reflection.is_valid() && atlas->reflections[0].data.layers[0].mipmaps.size() != 8) {
+ if (storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS_FULL && atlas->reflection.is_valid() && atlas->reflections[0].data.layers[0].mipmaps.size() != 8) {
// Invalidate reflection atlas, need to regenerate
RD::get_singleton()->free(atlas->reflection);
atlas->reflection = RID();
@@ -678,7 +678,7 @@ bool RendererSceneRenderRD::reflection_probe_instance_begin_render(RID p_instanc
if (atlas->reflection.is_null()) {
int mipmaps = MIN(sky.roughness_layers, Image::get_image_required_mipmaps(atlas->size, atlas->size, Image::FORMAT_RGBAH) + 1);
- mipmaps = storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS ? 8 : mipmaps; // always use 8 mipmaps with real time filtering
+ mipmaps = storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS_FULL ? 8 : mipmaps; // always use 8 mipmaps with real time filtering
{
//reflection atlas was unused, create:
RD::TextureFormat tf;
@@ -702,7 +702,7 @@ bool RendererSceneRenderRD::reflection_probe_instance_begin_render(RID p_instanc
}
atlas->reflections.resize(atlas->count);
for (int i = 0; i < atlas->count; i++) {
- atlas->reflections.write[i].data.update_reflection_data(storage, atlas->size, mipmaps, false, atlas->reflection, i * 6, storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS, sky.roughness_layers, _render_buffers_get_color_format());
+ atlas->reflections.write[i].data.update_reflection_data(storage, atlas->size, mipmaps, false, atlas->reflection, i * 6, storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS_FULL, sky.roughness_layers, _render_buffers_get_color_format());
for (int j = 0; j < 6; j++) {
atlas->reflections.write[i].fbs[j] = reflection_probe_create_framebuffer(atlas->reflections.write[i].data.layers[0].mipmaps[0].views[j], atlas->depth_buffer);
}
@@ -770,7 +770,7 @@ bool RendererSceneRenderRD::reflection_probe_instance_postprocess_step(RID p_ins
return false;
}
- if (storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS) {
+ if (storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS_FULL) {
// Using real time reflections, all roughness is done in one step
atlas->reflections.write[rpi->atlas_index].data.create_reflection_fast_filter(storage, false);
rpi->rendering = false;
diff --git a/servers/rendering/renderer_rd/renderer_storage_rd.cpp b/servers/rendering/renderer_rd/renderer_storage_rd.cpp
index 321d86ffda08..55a521eca3f1 100644
--- a/servers/rendering/renderer_rd/renderer_storage_rd.cpp
+++ b/servers/rendering/renderer_rd/renderer_storage_rd.cpp
@@ -6886,6 +6886,13 @@ void RendererStorageRD::reflection_probe_set_lod_threshold(RID p_probe, float p_
reflection_probe->dependency.changed_notify(DEPENDENCY_CHANGED_REFLECTION_PROBE);
}
+void RendererStorageRD::reflection_probe_queue_update(RID p_probe) {
+ ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe);
+ ERR_FAIL_COND(!reflection_probe);
+
+ reflection_probe->dependency.changed_notify(DEPENDENCY_CHANGED_REFLECTION_PROBE);
+}
+
AABB RendererStorageRD::reflection_probe_get_aabb(RID p_probe) const {
const ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe);
ERR_FAIL_COND_V(!reflection_probe, AABB());
@@ -6899,7 +6906,7 @@ AABB RendererStorageRD::reflection_probe_get_aabb(RID p_probe) const {
RS::ReflectionProbeUpdateMode RendererStorageRD::reflection_probe_get_update_mode(RID p_probe) const {
const ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe);
- ERR_FAIL_COND_V(!reflection_probe, RS::REFLECTION_PROBE_UPDATE_ALWAYS);
+ ERR_FAIL_COND_V(!reflection_probe, RS::REFLECTION_PROBE_UPDATE_ALWAYS_FULL);
return reflection_probe->update_mode;
}
diff --git a/servers/rendering/renderer_rd/renderer_storage_rd.h b/servers/rendering/renderer_rd/renderer_storage_rd.h
index 9a64480c3e15..f8d984b8b09c 100644
--- a/servers/rendering/renderer_rd/renderer_storage_rd.h
+++ b/servers/rendering/renderer_rd/renderer_storage_rd.h
@@ -1957,6 +1957,8 @@ class RendererStorageRD : public RendererStorage {
void reflection_probe_set_resolution(RID p_probe, int p_resolution);
void reflection_probe_set_lod_threshold(RID p_probe, float p_ratio);
+ void reflection_probe_queue_update(RID p_probe);
+
AABB reflection_probe_get_aabb(RID p_probe) const;
RS::ReflectionProbeUpdateMode reflection_probe_get_update_mode(RID p_probe) const;
uint32_t reflection_probe_get_cull_mask(RID p_probe) const;
diff --git a/servers/rendering/renderer_scene_cull.cpp b/servers/rendering/renderer_scene_cull.cpp
index 5b834db1786b..269343a1dc5b 100644
--- a/servers/rendering/renderer_scene_cull.cpp
+++ b/servers/rendering/renderer_scene_cull.cpp
@@ -3350,7 +3350,8 @@ void RendererSceneCull::render_probes() {
RID base = ref_probe->self()->owner->base;
switch (RSG::storage->reflection_probe_get_update_mode(base)) {
- case RS::REFLECTION_PROBE_UPDATE_ONCE: {
+ case RS::REFLECTION_PROBE_UPDATE_ONCE:
+ case RS::REFLECTION_PROBE_UPDATE_ALWAYS_INCREMENTAL: {
if (busy) { //already rendering something
break;
}
@@ -3364,7 +3365,7 @@ void RendererSceneCull::render_probes() {
busy = true; //do not render another one of this kind
} break;
- case RS::REFLECTION_PROBE_UPDATE_ALWAYS: {
+ case RS::REFLECTION_PROBE_UPDATE_ALWAYS_FULL: {
int step = 0;
bool done = false;
while (!done) {
diff --git a/servers/rendering/renderer_storage.h b/servers/rendering/renderer_storage.h
index 8926bf24aa68..02deca0f33a6 100644
--- a/servers/rendering/renderer_storage.h
+++ b/servers/rendering/renderer_storage.h
@@ -368,6 +368,8 @@ class RendererStorage {
virtual void reflection_probe_set_cull_mask(RID p_probe, uint32_t p_layers) = 0;
virtual void reflection_probe_set_lod_threshold(RID p_probe, float p_ratio) = 0;
+ virtual void reflection_probe_queue_update(RID p_probe) = 0;
+
virtual AABB reflection_probe_get_aabb(RID p_probe) const = 0;
virtual RS::ReflectionProbeUpdateMode reflection_probe_get_update_mode(RID p_probe) const = 0;
virtual uint32_t reflection_probe_get_cull_mask(RID p_probe) const = 0;
diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h
index b50631bb216c..676d066b3e5b 100644
--- a/servers/rendering/rendering_server_default.h
+++ b/servers/rendering/rendering_server_default.h
@@ -376,6 +376,8 @@ class RenderingServerDefault : public RenderingServer {
FUNC2(reflection_probe_set_resolution, RID, int)
FUNC2(reflection_probe_set_lod_threshold, RID, float)
+ FUNC1(reflection_probe_queue_update, RID)
+
/* DECAL API */
FUNCRIDSPLIT(decal)
diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp
index 23d3bf030f7d..43616e24e3f6 100644
--- a/servers/rendering_server.cpp
+++ b/servers/rendering_server.cpp
@@ -1966,7 +1966,8 @@ void RenderingServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("reflection_probe_set_lod_threshold", "probe", "pixels"), &RenderingServer::reflection_probe_set_lod_threshold);
BIND_ENUM_CONSTANT(REFLECTION_PROBE_UPDATE_ONCE);
- BIND_ENUM_CONSTANT(REFLECTION_PROBE_UPDATE_ALWAYS);
+ BIND_ENUM_CONSTANT(REFLECTION_PROBE_UPDATE_ALWAYS_INCREMENTAL);
+ BIND_ENUM_CONSTANT(REFLECTION_PROBE_UPDATE_ALWAYS_FULL);
BIND_ENUM_CONSTANT(REFLECTION_PROBE_AMBIENT_DISABLED);
BIND_ENUM_CONSTANT(REFLECTION_PROBE_AMBIENT_ENVIRONMENT);
diff --git a/servers/rendering_server.h b/servers/rendering_server.h
index 230132651fba..2fd90b8829ac 100644
--- a/servers/rendering_server.h
+++ b/servers/rendering_server.h
@@ -505,7 +505,8 @@ class RenderingServer : public Object {
enum ReflectionProbeUpdateMode {
REFLECTION_PROBE_UPDATE_ONCE,
- REFLECTION_PROBE_UPDATE_ALWAYS,
+ REFLECTION_PROBE_UPDATE_ALWAYS_INCREMENTAL,
+ REFLECTION_PROBE_UPDATE_ALWAYS_FULL,
};
virtual void reflection_probe_set_update_mode(RID p_probe, ReflectionProbeUpdateMode p_mode) = 0;
@@ -530,6 +531,8 @@ class RenderingServer : public Object {
virtual void reflection_probe_set_resolution(RID p_probe, int p_resolution) = 0;
virtual void reflection_probe_set_lod_threshold(RID p_probe, float p_pixels) = 0;
+ virtual void reflection_probe_queue_update(RID p_probe) = 0;
+
/* DECAL API */
enum DecalTexture {