2014-02-10 09:10:30 +08:00
/**************************************************************************/
2019-02-13 00:18:13 +08:00
/* world_environment.cpp */
2014-02-10 09:10:30 +08:00
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
2018-01-05 07:50:27 +08:00
2019-02-13 00:18:13 +08:00
# include "world_environment.h"
2020-07-01 20:18:13 +08:00
2021-08-13 07:05:59 +08:00
# include "scene/3d/node_3d.h"
2020-03-04 09:51:12 +08:00
# include "scene/main/window.h"
2014-02-10 09:10:30 +08:00
void WorldEnvironment : : _notification ( int p_what ) {
2022-02-16 01:06:48 +08:00
switch ( p_what ) {
case Node3D : : NOTIFICATION_ENTER_WORLD :
case Node3D : : NOTIFICATION_ENTER_TREE : {
if ( environment . is_valid ( ) ) {
add_to_group ( " _world_environment_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) ) ;
_update_current_environment ( ) ;
}
2014-09-22 11:50:48 +08:00
2022-08-01 07:20:24 +08:00
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 ( ) ;
2022-02-16 01:06:48 +08:00
}
2023-08-03 20:10:03 +08:00
if ( compositor . is_valid ( ) ) {
add_to_group ( " _world_compositor_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) ) ;
_update_current_compositor ( ) ;
}
2022-02-16 01:06:48 +08:00
} break ;
2020-01-14 02:37:24 +08:00
2022-02-16 01:06:48 +08:00
case Node3D : : NOTIFICATION_EXIT_WORLD :
case Node3D : : NOTIFICATION_EXIT_TREE : {
if ( environment . is_valid ( ) ) {
remove_from_group ( " _world_environment_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) ) ;
_update_current_environment ( ) ;
}
2020-01-14 02:37:24 +08:00
2022-08-01 07:20:24 +08:00
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 ( ) ;
2022-02-16 01:06:48 +08:00
}
2023-08-03 20:10:03 +08:00
if ( compositor . is_valid ( ) ) {
remove_from_group ( " _world_compositor_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) ) ;
_update_current_compositor ( ) ;
}
2022-02-16 01:06:48 +08:00
} break ;
2014-02-10 09:10:30 +08:00
}
}
2021-02-22 21:54:12 +08:00
void WorldEnvironment : : _update_current_environment ( ) {
WorldEnvironment * first = Object : : cast_to < WorldEnvironment > ( get_tree ( ) - > get_first_node_in_group ( " _world_environment_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) ) ) ;
if ( first ) {
get_viewport ( ) - > find_world_3d ( ) - > set_environment ( first - > environment ) ;
} else {
2020-04-18 17:00:51 +08:00
get_viewport ( ) - > find_world_3d ( ) - > set_environment ( Ref < Environment > ( ) ) ;
2021-02-22 21:54:12 +08:00
}
2021-08-13 05:40:13 +08:00
get_tree ( ) - > call_group_flags ( SceneTree : : GROUP_CALL_DEFERRED , " _world_environment_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) , " update_configuration_warnings " ) ;
2021-02-22 21:54:12 +08:00
}
2022-08-01 07:20:24 +08:00
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 ( ) ) ) ) ;
2021-02-22 21:54:12 +08:00
if ( first ) {
2022-08-01 07:20:24 +08:00
get_viewport ( ) - > find_world_3d ( ) - > set_camera_attributes ( first - > camera_attributes ) ;
2021-02-22 21:54:12 +08:00
} else {
2022-08-01 07:20:24 +08:00
get_viewport ( ) - > find_world_3d ( ) - > set_camera_attributes ( Ref < CameraAttributes > ( ) ) ;
2021-02-22 21:54:12 +08:00
}
2022-08-01 07:20:24 +08:00
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 " ) ;
2021-02-22 21:54:12 +08:00
}
2023-08-03 20:10:03 +08:00
void WorldEnvironment : : _update_current_compositor ( ) {
WorldEnvironment * first = Object : : cast_to < WorldEnvironment > ( get_tree ( ) - > get_first_node_in_group ( " _world_compositor_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) ) ) ;
if ( first ) {
get_viewport ( ) - > find_world_3d ( ) - > set_compositor ( first - > compositor ) ;
} else {
get_viewport ( ) - > find_world_3d ( ) - > set_compositor ( Ref < Compositor > ( ) ) ;
}
get_tree ( ) - > call_group_flags ( SceneTree : : GROUP_CALL_DEFERRED , " _world_compositor_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) , " update_configuration_warnings " ) ;
}
2021-02-22 21:54:12 +08:00
void WorldEnvironment : : set_environment ( const Ref < Environment > & p_environment ) {
if ( environment = = p_environment ) {
return ;
}
if ( is_inside_tree ( ) & & environment . is_valid ( ) ) {
2020-04-18 17:00:51 +08:00
remove_from_group ( " _world_environment_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) ) ;
2014-09-22 11:50:48 +08:00
}
2014-02-10 09:10:30 +08:00
environment = p_environment ;
2021-02-22 21:54:12 +08:00
2017-06-24 19:58:27 +08:00
if ( is_inside_tree ( ) & & environment . is_valid ( ) ) {
2020-04-18 17:00:51 +08:00
add_to_group ( " _world_environment_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) ) ;
2014-02-10 09:10:30 +08:00
}
2016-05-18 05:27:15 +08:00
2021-02-22 21:54:12 +08:00
if ( is_inside_tree ( ) ) {
_update_current_environment ( ) ;
} else {
2020-10-29 18:01:28 +08:00
update_configuration_warnings ( ) ;
2021-02-22 21:54:12 +08:00
}
2014-02-10 09:10:30 +08:00
}
Ref < Environment > WorldEnvironment : : get_environment ( ) const {
return environment ;
}
2022-08-01 07:20:24 +08:00
void WorldEnvironment : : set_camera_attributes ( const Ref < CameraAttributes > & p_camera_attributes ) {
if ( camera_attributes = = p_camera_attributes ) {
2021-02-22 21:54:12 +08:00
return ;
}
2022-08-01 07:20:24 +08:00
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 ( ) ) ) ;
2020-01-14 02:37:24 +08:00
}
2022-08-01 07:20:24 +08:00
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 ( ) ) ) ;
2020-01-14 02:37:24 +08:00
}
2021-02-22 21:54:12 +08:00
if ( is_inside_tree ( ) ) {
2022-08-01 07:20:24 +08:00
_update_current_camera_attributes ( ) ;
2021-02-22 21:54:12 +08:00
} else {
2020-10-29 18:01:28 +08:00
update_configuration_warnings ( ) ;
2021-02-22 21:54:12 +08:00
}
2020-01-14 02:37:24 +08:00
}
2022-08-01 07:20:24 +08:00
Ref < CameraAttributes > WorldEnvironment : : get_camera_attributes ( ) const {
return camera_attributes ;
2020-01-14 02:37:24 +08:00
}
2023-08-03 20:10:03 +08:00
void WorldEnvironment : : set_compositor ( const Ref < Compositor > & p_compositor ) {
if ( compositor = = p_compositor ) {
return ;
}
if ( is_inside_tree ( ) & & compositor . is_valid ( ) ) {
remove_from_group ( " _world_compositor_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) ) ;
}
compositor = p_compositor ;
if ( is_inside_tree ( ) & & compositor . is_valid ( ) ) {
add_to_group ( " _world_compositor_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) ) ;
}
if ( is_inside_tree ( ) ) {
_update_current_compositor ( ) ;
} else {
update_configuration_warnings ( ) ;
}
}
Ref < Compositor > WorldEnvironment : : get_compositor ( ) const {
return compositor ;
}
2024-02-18 02:03:21 +08:00
PackedStringArray WorldEnvironment : : get_configuration_warnings ( ) const {
PackedStringArray warnings = Node : : get_configuration_warnings ( ) ;
2020-05-15 04:59:27 +08:00
2022-08-01 07:20:24 +08:00
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. " ) ) ;
2018-03-16 18:15:15 +08:00
}
2020-05-14 22:41:43 +08:00
if ( ! is_inside_tree ( ) ) {
2020-10-29 18:01:28 +08:00
return warnings ;
2020-05-14 22:41:43 +08:00
}
2016-05-18 05:27:15 +08:00
2021-02-22 21:54:12 +08:00
if ( environment . is_valid ( ) & & get_viewport ( ) - > find_world_3d ( ) - > get_environment ( ) ! = environment ) {
2020-10-29 18:01:28 +08:00
warnings . push_back ( ( " Only the first Environment has an effect in a scene (or set of instantiated scenes). " ) ) ;
2021-02-22 21:54:12 +08:00
}
2016-05-18 05:27:15 +08:00
2022-08-01 07:20:24 +08:00
if ( camera_attributes . is_valid ( ) & & get_viewport ( ) - > find_world_3d ( ) - > get_camera_attributes ( ) ! = camera_attributes ) {
2022-03-28 21:24:14 +08:00
warnings . push_back ( RTR ( " Only one WorldEnvironment is allowed per scene (or set of instantiated scenes). " ) ) ;
2016-05-18 05:27:15 +08:00
}
2023-08-03 20:10:03 +08:00
if ( compositor . is_valid ( ) & & get_viewport ( ) - > find_world_3d ( ) - > get_compositor ( ) ! = compositor ) {
warnings . push_back ( ( " Only the first Compositor has an effect in a scene (or set of instantiated scenes). " ) ) ;
}
2020-10-29 18:01:28 +08:00
return warnings ;
2016-05-18 05:27:15 +08:00
}
2014-02-10 09:10:30 +08:00
void WorldEnvironment : : _bind_methods ( ) {
2017-08-09 19:19:41 +08:00
ClassDB : : bind_method ( D_METHOD ( " set_environment " , " env " ) , & WorldEnvironment : : set_environment ) ;
ClassDB : : bind_method ( D_METHOD ( " get_environment " ) , & WorldEnvironment : : get_environment ) ;
2017-02-12 08:11:37 +08:00
ADD_PROPERTY ( PropertyInfo ( Variant : : OBJECT , " environment " , PROPERTY_HINT_RESOURCE_TYPE , " Environment " ) , " set_environment " , " get_environment " ) ;
2020-01-14 02:37:24 +08:00
2022-08-01 07:20:24 +08:00
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 " ) ;
2023-08-03 20:10:03 +08:00
ClassDB : : bind_method ( D_METHOD ( " set_compositor " , " compositor " ) , & WorldEnvironment : : set_compositor ) ;
ClassDB : : bind_method ( D_METHOD ( " get_compositor " ) , & WorldEnvironment : : get_compositor ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : OBJECT , " compositor " , PROPERTY_HINT_RESOURCE_TYPE , " Compositor " ) , " set_compositor " , " get_compositor " ) ;
2014-02-10 09:10:30 +08:00
}
WorldEnvironment : : WorldEnvironment ( ) {
}