mirror of
https://github.com/godotengine/godot.git
synced 2026-01-03 18:11:19 +03:00
Implement Physical Light Units as an optional setting.
This allows light sources to be specified in physical light units in addition to the regular energy multiplier. In order to avoid loss of precision at high values, brightness values are premultiplied by an exposure normalization value. In support of Physical Light Units this PR also renames CameraEffects to CameraAttributes.
This commit is contained in:
@@ -42,9 +42,9 @@ void WorldEnvironment::_notification(int p_what) {
|
||||
_update_current_environment();
|
||||
}
|
||||
|
||||
if (camera_effects.is_valid()) {
|
||||
add_to_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
|
||||
_update_current_camera_effects();
|
||||
if (camera_attributes.is_valid()) {
|
||||
add_to_group("_world_camera_attributes_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
|
||||
_update_current_camera_attributes();
|
||||
}
|
||||
} break;
|
||||
|
||||
@@ -55,9 +55,9 @@ void WorldEnvironment::_notification(int p_what) {
|
||||
_update_current_environment();
|
||||
}
|
||||
|
||||
if (camera_effects.is_valid()) {
|
||||
remove_from_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
|
||||
_update_current_camera_effects();
|
||||
if (camera_attributes.is_valid()) {
|
||||
remove_from_group("_world_camera_attributes_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
|
||||
_update_current_camera_attributes();
|
||||
}
|
||||
} break;
|
||||
}
|
||||
@@ -74,15 +74,15 @@ void WorldEnvironment::_update_current_environment() {
|
||||
get_tree()->call_group_flags(SceneTree::GROUP_CALL_DEFERRED, "_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()), "update_configuration_warnings");
|
||||
}
|
||||
|
||||
void WorldEnvironment::_update_current_camera_effects() {
|
||||
WorldEnvironment *first = Object::cast_to<WorldEnvironment>(get_tree()->get_first_node_in_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())));
|
||||
void WorldEnvironment::_update_current_camera_attributes() {
|
||||
WorldEnvironment *first = Object::cast_to<WorldEnvironment>(get_tree()->get_first_node_in_group("_world_camera_attributes_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())));
|
||||
if (first) {
|
||||
get_viewport()->find_world_3d()->set_camera_effects(first->camera_effects);
|
||||
get_viewport()->find_world_3d()->set_camera_attributes(first->camera_attributes);
|
||||
} else {
|
||||
get_viewport()->find_world_3d()->set_camera_effects(Ref<CameraEffects>());
|
||||
get_viewport()->find_world_3d()->set_camera_attributes(Ref<CameraAttributes>());
|
||||
}
|
||||
|
||||
get_tree()->call_group_flags(SceneTree::GROUP_CALL_DEFERRED, "_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()), "update_configuration_warnings");
|
||||
get_tree()->call_group_flags(SceneTree::GROUP_CALL_DEFERRED, "_world_camera_attributes_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()), "update_configuration_warnings");
|
||||
}
|
||||
|
||||
void WorldEnvironment::set_environment(const Ref<Environment> &p_environment) {
|
||||
@@ -110,36 +110,36 @@ Ref<Environment> WorldEnvironment::get_environment() const {
|
||||
return environment;
|
||||
}
|
||||
|
||||
void WorldEnvironment::set_camera_effects(const Ref<CameraEffects> &p_camera_effects) {
|
||||
if (camera_effects == p_camera_effects) {
|
||||
void WorldEnvironment::set_camera_attributes(const Ref<CameraAttributes> &p_camera_attributes) {
|
||||
if (camera_attributes == p_camera_attributes) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_inside_tree() && camera_effects.is_valid() && get_viewport()->find_world_3d()->get_camera_effects() == camera_effects) {
|
||||
remove_from_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
|
||||
if (is_inside_tree() && camera_attributes.is_valid() && get_viewport()->find_world_3d()->get_camera_attributes() == camera_attributes) {
|
||||
remove_from_group("_world_camera_attributes_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
|
||||
}
|
||||
|
||||
camera_effects = p_camera_effects;
|
||||
if (is_inside_tree() && camera_effects.is_valid()) {
|
||||
add_to_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
|
||||
camera_attributes = p_camera_attributes;
|
||||
if (is_inside_tree() && camera_attributes.is_valid()) {
|
||||
add_to_group("_world_camera_attributes_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
|
||||
}
|
||||
|
||||
if (is_inside_tree()) {
|
||||
_update_current_camera_effects();
|
||||
_update_current_camera_attributes();
|
||||
} else {
|
||||
update_configuration_warnings();
|
||||
}
|
||||
}
|
||||
|
||||
Ref<CameraEffects> WorldEnvironment::get_camera_effects() const {
|
||||
return camera_effects;
|
||||
Ref<CameraAttributes> WorldEnvironment::get_camera_attributes() const {
|
||||
return camera_attributes;
|
||||
}
|
||||
|
||||
TypedArray<String> WorldEnvironment::get_configuration_warnings() const {
|
||||
TypedArray<String> warnings = Node::get_configuration_warnings();
|
||||
|
||||
if (!environment.is_valid() && !camera_effects.is_valid()) {
|
||||
warnings.push_back(RTR("To have any visible effect, WorldEnvironment requires its \"Environment\" property to contain an Environment, its \"Camera Effects\" property to contain a CameraEffects resource, or both."));
|
||||
if (!environment.is_valid() && !camera_attributes.is_valid()) {
|
||||
warnings.push_back(RTR("To have any visible effect, WorldEnvironment requires its \"Environment\" property to contain an Environment, its \"Camera Attributes\" property to contain a CameraAttributes resource, or both."));
|
||||
}
|
||||
|
||||
if (!is_inside_tree()) {
|
||||
@@ -150,7 +150,7 @@ TypedArray<String> WorldEnvironment::get_configuration_warnings() const {
|
||||
warnings.push_back(("Only the first Environment has an effect in a scene (or set of instantiated scenes)."));
|
||||
}
|
||||
|
||||
if (camera_effects.is_valid() && get_viewport()->find_world_3d()->get_camera_effects() != camera_effects) {
|
||||
if (camera_attributes.is_valid() && get_viewport()->find_world_3d()->get_camera_attributes() != camera_attributes) {
|
||||
warnings.push_back(RTR("Only one WorldEnvironment is allowed per scene (or set of instantiated scenes)."));
|
||||
}
|
||||
|
||||
@@ -162,9 +162,9 @@ void WorldEnvironment::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("get_environment"), &WorldEnvironment::get_environment);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "environment", PROPERTY_HINT_RESOURCE_TYPE, "Environment"), "set_environment", "get_environment");
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_camera_effects", "env"), &WorldEnvironment::set_camera_effects);
|
||||
ClassDB::bind_method(D_METHOD("get_camera_effects"), &WorldEnvironment::get_camera_effects);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "camera_effects", PROPERTY_HINT_RESOURCE_TYPE, "CameraEffects"), "set_camera_effects", "get_camera_effects");
|
||||
ClassDB::bind_method(D_METHOD("set_camera_attributes", "camera_attributes"), &WorldEnvironment::set_camera_attributes);
|
||||
ClassDB::bind_method(D_METHOD("get_camera_attributes"), &WorldEnvironment::get_camera_attributes);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "camera_attributes", PROPERTY_HINT_RESOURCE_TYPE, "CameraAttributesPractical,CameraAttributesPhysical"), "set_camera_attributes", "get_camera_attributes");
|
||||
}
|
||||
|
||||
WorldEnvironment::WorldEnvironment() {
|
||||
|
||||
Reference in New Issue
Block a user