Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion doc/classes/ReflectionProbe.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@
<tutorials>
<link title="Reflection probes">$DOCS_URL/tutorials/3d/global_illumination/reflection_probes.html</link>
</tutorials>
<methods>
<method name="queue_update">
<return type="void" />
<description>
Queues an update for the reflection probe.
</description>
</method>
</methods>
<members>
<member name="ambient_color" type="Color" setter="set_ambient_color" getter="get_ambient_color" default="Color(0, 0, 0, 1)">
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].
Expand Down Expand Up @@ -67,7 +75,7 @@
</members>
<constants>
<constant name="UPDATE_ONCE" value="0" enum="UpdateMode">
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.
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.
</constant>
<constant name="UPDATE_ALWAYS" value="1" enum="UpdateMode">
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].
Expand Down
7 changes: 7 additions & 0 deletions doc/classes/RenderingServer.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3270,6 +3270,13 @@
[b]Note:[/b] The equivalent node is [ReflectionProbe].
</description>
</method>
<method name="reflection_probe_queue_update">
<return type="void" />
<param index="0" name="probe" type="RID" />
<description>
Queues the given reflection probe for an update. Equivalent to [method ReflectionProbe.queue_update].
</description>
</method>
<method name="reflection_probe_set_ambient_color">
<return type="void" />
<param index="0" name="probe" type="RID" />
Expand Down
7 changes: 7 additions & 0 deletions drivers/gles3/storage/light_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,13 @@ void LightStorage::reflection_probe_free(RID p_rid) {
reflection_probe_owner.free(p_rid);
}

void LightStorage::reflection_probe_queue_update(RID p_probe) {
ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe);
ERR_FAIL_NULL(reflection_probe);

reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
}

void LightStorage::reflection_probe_set_update_mode(RID p_probe, RS::ReflectionProbeUpdateMode p_mode) {
ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe);
ERR_FAIL_NULL(reflection_probe);
Expand Down
1 change: 1 addition & 0 deletions drivers/gles3/storage/light_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -637,6 +637,7 @@ class LightStorage : public RendererLightStorage {
virtual void reflection_probe_initialize(RID p_rid) override;
virtual void reflection_probe_free(RID p_rid) override;

virtual void reflection_probe_queue_update(RID p_probe) override;
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;
Expand Down
5 changes: 5 additions & 0 deletions scene/3d/reflection_probe.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,10 @@ AABB ReflectionProbe::get_aabb() const {
return aabb;
}

void ReflectionProbe::queue_update() {
RS::get_singleton()->reflection_probe_queue_update(probe);
}

void ReflectionProbe::_validate_property(PropertyInfo &p_property) const {
if (!Engine::get_singleton()->is_editor_hint()) {
return;
Expand Down Expand Up @@ -256,6 +260,7 @@ 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);
ClassDB::bind_method(D_METHOD("queue_update"), &ReflectionProbe::queue_update);

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");
Expand Down
2 changes: 2 additions & 0 deletions scene/3d/reflection_probe.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ class ReflectionProbe : public VisualInstance3D {

virtual AABB get_aabb() const override;

void queue_update();

ReflectionProbe();
~ReflectionProbe();
};
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/dummy/storage/light_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ class LightStorage : public RendererLightStorage {
virtual void reflection_probe_initialize(RID p_rid) override {}
virtual void reflection_probe_free(RID p_rid) override {}

virtual void reflection_probe_queue_update(RID p_probe) override {}
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 {}
Expand Down
7 changes: 7 additions & 0 deletions servers/rendering/renderer_rd/storage_rd/light_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1065,6 +1065,13 @@ void LightStorage::reflection_probe_free(RID p_rid) {
reflection_probe_owner.free(p_rid);
}

void LightStorage::reflection_probe_queue_update(RID p_probe) {
ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe);
ERR_FAIL_NULL(reflection_probe);

reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
}

void LightStorage::reflection_probe_set_update_mode(RID p_probe, RS::ReflectionProbeUpdateMode p_mode) {
ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_probe);
ERR_FAIL_NULL(reflection_probe);
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/renderer_rd/storage_rd/light_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -835,6 +835,7 @@ class LightStorage : public RendererLightStorage {
virtual void reflection_probe_initialize(RID p_reflection_probe) override;
virtual void reflection_probe_free(RID p_rid) override;

virtual void reflection_probe_queue_update(RID p_probe) override;
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;
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/rendering_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2655,6 +2655,7 @@ void RenderingServer::_bind_methods() {
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_queue_update", "probe"), &RenderingServer::reflection_probe_queue_update);
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);
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/rendering_server.h
Original file line number Diff line number Diff line change
Expand Up @@ -655,6 +655,7 @@ class RenderingServer : public Object {
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;
virtual void reflection_probe_queue_update(RID p_probe) = 0;

enum ReflectionProbeAmbientMode {
REFLECTION_PROBE_AMBIENT_DISABLED,
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/rendering_server_default.h
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,7 @@ class RenderingServerDefault : public RenderingServer {

FUNCRIDSPLIT(reflection_probe)

FUNC1(reflection_probe_queue_update, RID)
FUNC2(reflection_probe_set_update_mode, RID, ReflectionProbeUpdateMode)
FUNC2(reflection_probe_set_intensity, RID, float)
FUNC2(reflection_probe_set_blend_distance, RID, float)
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/storage/light_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ class RendererLightStorage {
virtual void reflection_probe_initialize(RID p_rid) = 0;
virtual void reflection_probe_free(RID p_rid) = 0;

virtual void reflection_probe_queue_update(RID p_probe) = 0;
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;
Expand Down