From c73e1f0d22a3cd12f756492e1cc0a03d74e171fa Mon Sep 17 00:00:00 2001 From: bitsawer Date: Mon, 28 Aug 2023 13:19:07 +0300 Subject: [PATCH] Fix VoxelGI CameraAttributes exposure normalization handling --- scene/3d/voxel_gi.cpp | 24 +++++++++++++++++------- scene/3d/voxel_gi.h | 2 ++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/scene/3d/voxel_gi.cpp b/scene/3d/voxel_gi.cpp index faeacec63a8d..43906b258653 100644 --- a/scene/3d/voxel_gi.cpp +++ b/scene/3d/voxel_gi.cpp @@ -270,6 +270,7 @@ VoxelGIData::~VoxelGIData() { void VoxelGI::set_probe_data(const Ref &p_data) { if (p_data.is_valid()) { RS::get_singleton()->instance_set_base(get_instance(), p_data->get_rid()); + RS::get_singleton()->voxel_gi_set_baked_exposure_normalization(p_data->get_rid(), _get_camera_exposure_normalization()); } else { RS::get_singleton()->instance_set_base(get_instance(), RID()); } @@ -303,6 +304,10 @@ Vector3 VoxelGI::get_size() const { void VoxelGI::set_camera_attributes(const Ref &p_camera_attributes) { camera_attributes = p_camera_attributes; + + if (probe_data.is_valid()) { + RS::get_singleton()->voxel_gi_set_baked_exposure_normalization(probe_data->get_rid(), _get_camera_exposure_normalization()); + } } Ref VoxelGI::get_camera_attributes() const { @@ -398,13 +403,7 @@ void VoxelGI::bake(Node *p_from_node, bool p_create_visual_debug) { p_from_node = p_from_node ? p_from_node : get_parent(); ERR_FAIL_NULL(p_from_node); - float exposure_normalization = 1.0; - if (camera_attributes.is_valid()) { - exposure_normalization = camera_attributes->get_exposure_multiplier(); - if (GLOBAL_GET("rendering/lights_and_shadows/use_physical_light_units")) { - exposure_normalization = camera_attributes->calculate_exposure_normalization(); - } - } + float exposure_normalization = _get_camera_exposure_normalization(); Voxelizer baker; @@ -485,6 +484,17 @@ void VoxelGI::_debug_bake() { bake(nullptr, true); } +float VoxelGI::_get_camera_exposure_normalization() { + float exposure_normalization = 1.0; + if (camera_attributes.is_valid()) { + exposure_normalization = camera_attributes->get_exposure_multiplier(); + if (GLOBAL_GET("rendering/lights_and_shadows/use_physical_light_units")) { + exposure_normalization = camera_attributes->calculate_exposure_normalization(); + } + } + return exposure_normalization; +} + AABB VoxelGI::get_aabb() const { return AABB(-size / 2, size); } diff --git a/scene/3d/voxel_gi.h b/scene/3d/voxel_gi.h index d276186dd1bd..7d7787f72129 100644 --- a/scene/3d/voxel_gi.h +++ b/scene/3d/voxel_gi.h @@ -131,6 +131,8 @@ class VoxelGI : public VisualInstance3D { void _find_meshes(Node *p_at_node, List &plot_meshes); void _debug_bake(); + float _get_camera_exposure_normalization(); + protected: static void _bind_methods(); #ifndef DISABLE_DEPRECATED