Skip to content

Commit eb076e7

Browse files
added queue_update function
1 parent c0c1c68 commit eb076e7

File tree

13 files changed

+44
-1
lines changed

13 files changed

+44
-1
lines changed

doc/classes/ReflectionProbe.xml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@
1313
<tutorials>
1414
<link title="Reflection probes">$DOCS_URL/tutorials/3d/global_illumination/reflection_probes.html</link>
1515
</tutorials>
16+
<methods>
17+
<method name="queue_update">
18+
<return type="void" />
19+
<description>
20+
Queues an update for the reflection probe.
21+
</description>
22+
</method>
23+
</methods>
1624
<members>
1725
<member name="ambient_color" type="Color" setter="set_ambient_color" getter="get_ambient_color" default="Color(0, 0, 0, 1)">
1826
The custom ambient color to use within the [ReflectionProbe]'s box defined by its [member size]. Only effective if [member ambient_mode] is [constant AMBIENT_COLOR].
@@ -67,7 +75,7 @@
6775
</members>
6876
<constants>
6977
<constant name="UPDATE_ONCE" value="0" enum="UpdateMode">
70-
Update the probe once on the next frame (recommended for most objects). The corresponding radiance map will be generated over the following six frames. This takes more time to update than [constant UPDATE_ALWAYS], but it has a lower performance cost and can result in higher-quality reflections. The ReflectionProbe is updated when its transform changes, but not when nearby geometry changes. You can force a [ReflectionProbe] update by moving the [ReflectionProbe] slightly in any direction.
78+
Update the probe once on the next frame (recommended for most objects). The corresponding radiance map will be generated over the following six frames. This takes more time to update than [constant UPDATE_ALWAYS], but it has a lower performance cost and can result in higher-quality reflections. The ReflectionProbe is updated when its transform changes, but not when nearby geometry changes. You can force a [ReflectionProbe] update by calling [method queue_update] on it.
7179
</constant>
7280
<constant name="UPDATE_ALWAYS" value="1" enum="UpdateMode">
7381
Update the probe every frame. This provides better results for fast-moving dynamic objects (such as cars). However, it has a significant performance cost. Due to the cost, it's recommended to only use one ReflectionProbe with [constant UPDATE_ALWAYS] at most per scene. For all other use cases, use [constant UPDATE_ONCE].

doc/classes/RenderingServer.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3270,6 +3270,13 @@
32703270
[b]Note:[/b] The equivalent node is [ReflectionProbe].
32713271
</description>
32723272
</method>
3273+
<method name="reflection_probe_queue_update">
3274+
<return type="void" />
3275+
<param index="0" name="probe" type="RID" />
3276+
<description>
3277+
Queues the given reflection probe for an update. Equivalent to [method ReflectionProbe.queue_update]
3278+
</description>
3279+
</method>
32733280
<method name="reflection_probe_set_ambient_color">
32743281
<return type="void" />
32753282
<param index="0" name="probe" type="RID" />

drivers/gles3/storage/light_storage.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,13 @@ void LightStorage::reflection_probe_set_cull_mask(RID p_probe, uint32_t p_layers
560560
reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
561561
}
562562

563+
void LightStorage::reflection_probe_queue_update(RID p_probe) {
564+
ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe);
565+
ERR_FAIL_NULL(reflection_probe);
566+
567+
reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
568+
}
569+
563570
void LightStorage::reflection_probe_set_reflection_mask(RID p_probe, uint32_t p_layers) {
564571
ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe);
565572
ERR_FAIL_NULL(reflection_probe);

drivers/gles3/storage/light_storage.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,7 @@ class LightStorage : public RendererLightStorage {
637637
virtual void reflection_probe_initialize(RID p_rid) override;
638638
virtual void reflection_probe_free(RID p_rid) override;
639639

640+
virtual void reflection_probe_queue_update(RID p_probe) override;
640641
virtual void reflection_probe_set_update_mode(RID p_probe, RS::ReflectionProbeUpdateMode p_mode) override;
641642
virtual void reflection_probe_set_intensity(RID p_probe, float p_intensity) override;
642643
virtual void reflection_probe_set_blend_distance(RID p_probe, float p_blend_distance) override;

scene/3d/reflection_probe.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,10 @@ AABB ReflectionProbe::get_aabb() const {
200200
return aabb;
201201
}
202202

203+
void ReflectionProbe::queue_update() const {
204+
RS::get_singleton()->reflection_probe_queue_update(probe);
205+
}
206+
203207
void ReflectionProbe::_validate_property(PropertyInfo &p_property) const {
204208
if (!Engine::get_singleton()->is_editor_hint()) {
205209
return;
@@ -256,6 +260,7 @@ void ReflectionProbe::_bind_methods() {
256260

257261
ClassDB::bind_method(D_METHOD("set_update_mode", "mode"), &ReflectionProbe::set_update_mode);
258262
ClassDB::bind_method(D_METHOD("get_update_mode"), &ReflectionProbe::get_update_mode);
263+
ClassDB::bind_method(D_METHOD("queue_update"), &ReflectionProbe::queue_update);
259264

260265
ADD_PROPERTY(PropertyInfo(Variant::INT, "update_mode", PROPERTY_HINT_ENUM, "Once (Fast),Always (Slow)"), "set_update_mode", "get_update_mode");
261266
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "intensity", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_intensity", "get_intensity");

scene/3d/reflection_probe.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ class ReflectionProbe : public VisualInstance3D {
125125

126126
virtual AABB get_aabb() const override;
127127

128+
void queue_update() const;
129+
128130
ReflectionProbe();
129131
~ReflectionProbe();
130132
};

servers/rendering/dummy/storage/light_storage.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ class LightStorage : public RendererLightStorage {
121121
virtual void reflection_probe_initialize(RID p_rid) override {}
122122
virtual void reflection_probe_free(RID p_rid) override {}
123123

124+
virtual void reflection_probe_queue_update(RID p_probe) override {}
124125
virtual void reflection_probe_set_update_mode(RID p_probe, RS::ReflectionProbeUpdateMode p_mode) override {}
125126
virtual void reflection_probe_set_intensity(RID p_probe, float p_intensity) override {}
126127
virtual void reflection_probe_set_blend_distance(RID p_probe, float p_blend_distance) override {}

servers/rendering/renderer_rd/storage_rd/light_storage.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,6 +1065,13 @@ void LightStorage::reflection_probe_free(RID p_rid) {
10651065
reflection_probe_owner.free(p_rid);
10661066
}
10671067

1068+
void LightStorage::reflection_probe_queue_update(RID p_probe) {
1069+
ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe);
1070+
ERR_FAIL_NULL(reflection_probe);
1071+
1072+
reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
1073+
}
1074+
10681075
void LightStorage::reflection_probe_set_update_mode(RID p_probe, RS::ReflectionProbeUpdateMode p_mode) {
10691076
ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe);
10701077
ERR_FAIL_NULL(reflection_probe);

servers/rendering/renderer_rd/storage_rd/light_storage.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,7 @@ class LightStorage : public RendererLightStorage {
835835
virtual void reflection_probe_initialize(RID p_reflection_probe) override;
836836
virtual void reflection_probe_free(RID p_rid) override;
837837

838+
virtual void reflection_probe_queue_update(RID p_probe) override;
838839
virtual void reflection_probe_set_update_mode(RID p_probe, RS::ReflectionProbeUpdateMode p_mode) override;
839840
virtual void reflection_probe_set_intensity(RID p_probe, float p_intensity) override;
840841
virtual void reflection_probe_set_blend_distance(RID p_probe, float p_blend_distance) override;

servers/rendering/rendering_server.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2651,6 +2651,7 @@ void RenderingServer::_bind_methods() {
26512651

26522652
/* REFLECTION PROBE */
26532653

2654+
ClassDB::bind_method(D_METHOD("reflection_probe_queue_update", "probe"), &RenderingServer::reflection_probe_queue_update);
26542655
ClassDB::bind_method(D_METHOD("reflection_probe_create"), &RenderingServer::reflection_probe_create);
26552656
ClassDB::bind_method(D_METHOD("reflection_probe_set_update_mode", "probe", "mode"), &RenderingServer::reflection_probe_set_update_mode);
26562657
ClassDB::bind_method(D_METHOD("reflection_probe_set_intensity", "probe", "intensity"), &RenderingServer::reflection_probe_set_intensity);

0 commit comments

Comments
 (0)