Skip to content
Closed
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
22 changes: 17 additions & 5 deletions doc/classes/ReflectionProbe.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@
<tutorials>
<link title="Reflection probes">$DOCS_URL/tutorials/3d/reflection_probes.html</link>
</tutorials>
<methods>
<method name="queue_update">
<return type="void" />
<description>
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].
</description>
</method>
</methods>
<members>
<member name="ambient_color" type="Color" setter="set_ambient_color" getter="get_ambient_color" default="Color(0, 0, 0, 1)">
</member>
Expand All @@ -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.
</member>
<member name="enable_shadows" type="bool" setter="set_enable_shadows" getter="are_shadows_enabled" default="false">
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].
</member>
<member name="extents" type="Vector3" setter="set_extents" getter="get_extents" default="Vector3(10, 10, 10)">
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.
Expand All @@ -44,15 +53,18 @@
Sets the origin offset to be used when this reflection probe is in box project mode.
</member>
<member name="update_mode" type="int" setter="set_update_mode" getter="get_update_mode" enum="ReflectionProbe.UpdateMode" default="0">
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].
</member>
</members>
<constants>
<constant name="UPDATE_ONCE" value="0" enum="UpdateMode">
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.
</constant>
<constant name="UPDATE_ALWAYS" value="1" enum="UpdateMode">
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.
<constant name="UPDATE_ALWAYS_INCREMENTAL" value="1" enum="UpdateMode">
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.
</constant>
<constant name="UPDATE_ALWAYS_FULL" value="2" enum="UpdateMode">
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.
</constant>
<constant name="AMBIENT_DISABLED" value="0" enum="AmbientMode">
</constant>
Expand Down
9 changes: 6 additions & 3 deletions doc/classes/RenderingServer.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3764,10 +3764,13 @@
<constant name="SHADOW_QUALITY_MAX" value="6" enum="ShadowQuality">
</constant>
<constant name="REFLECTION_PROBE_UPDATE_ONCE" value="0" enum="ReflectionProbeUpdateMode">
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.
</constant>
<constant name="REFLECTION_PROBE_UPDATE_ALWAYS" value="1" enum="ReflectionProbeUpdateMode">
Reflection probe will update each frame. This mode is necessary to capture moving objects.
<constant name="REFLECTION_PROBE_UPDATE_ALWAYS_INCREMENTAL" value="1" enum="ReflectionProbeUpdateMode">
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.
</constant>
<constant name="REFLECTION_PROBE_UPDATE_ALWAYS_FULL" value="2" enum="ReflectionProbeUpdateMode">
Reflection probe will update each frame. This mode provides the best result when capturing fast-moving dynamic objects.
</constant>
<constant name="REFLECTION_PROBE_AMBIENT_DISABLED" value="0" enum="ReflectionProbeAmbientMode">
</constant>
Expand Down
17 changes: 10 additions & 7 deletions drivers/gles3/rasterizer_storage_gles3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
}

Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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) {
}

Expand Down
6 changes: 4 additions & 2 deletions drivers/gles3/rasterizer_storage_gles3.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down
16 changes: 14 additions & 2 deletions scene/3d/reflection_probe.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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");
Expand All @@ -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);
Expand Down
5 changes: 4 additions & 1 deletion scene/3d/reflection_probe.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ class ReflectionProbe : public VisualInstance3D {
public:
enum UpdateMode {
UPDATE_ONCE,
UPDATE_ALWAYS,
UPDATE_ALWAYS_INCREMENTAL,
UPDATE_ALWAYS_FULL,
};

enum AmbientMode {
Expand Down Expand Up @@ -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<Face3> get_faces(uint32_t p_usage_flags) const override;

Expand Down
6 changes: 4 additions & 2 deletions servers/rendering/rasterizer_dummy.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {}

Expand Down Expand Up @@ -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; }
Expand All @@ -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 {}
Expand Down
14 changes: 7 additions & 7 deletions servers/rendering/renderer_rd/renderer_scene_render_rd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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();
Expand All @@ -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;
Expand All @@ -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);
}
Expand Down Expand Up @@ -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;
Expand Down
9 changes: 8 additions & 1 deletion servers/rendering/renderer_rd/renderer_storage_rd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand All @@ -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;
}
Expand Down
2 changes: 2 additions & 0 deletions servers/rendering/renderer_rd/renderer_storage_rd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
5 changes: 3 additions & 2 deletions servers/rendering/renderer_scene_cull.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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) {
Expand Down
2 changes: 2 additions & 0 deletions servers/rendering/renderer_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions servers/rendering/rendering_server_default.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion servers/rendering_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Loading