2023-01-05 13:25:55 +01:00
/**************************************************************************/
/* world_environment.cpp */
/**************************************************************************/
/* 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 00:50:27 +01:00
2019-02-12 17:18:13 +01:00
# include "world_environment.h"
2020-07-01 14:18:13 +02:00
2021-08-13 01:05:59 +02:00
# include "scene/3d/node_3d.h"
2020-03-04 02:51:12 +01:00
# include "scene/main/window.h"
2014-02-10 02:10:30 +01:00
void WorldEnvironment : : _notification ( int p_what ) {
2022-02-15 18:06:48 +01: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 05:50:48 +02:00
2022-08-01 01:20:24 +02: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-15 18:06:48 +01:00
}
} break ;
2020-01-13 19:37:24 +01:00
2022-02-15 18:06:48 +01: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-13 19:37:24 +01:00
2022-08-01 01:20:24 +02: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-15 18:06:48 +01:00
}
} break ;
2014-02-10 02:10:30 +01:00
}
}
2021-02-22 14:54:12 +01: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 11:00:51 +02:00
get_viewport ( ) - > find_world_3d ( ) - > set_environment ( Ref < Environment > ( ) ) ;
2021-02-22 14:54:12 +01:00
}
2021-08-12 23:40:13 +02: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 14:54:12 +01:00
}
2022-08-01 01:20:24 +02: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 14:54:12 +01:00
if ( first ) {
2022-08-01 01:20:24 +02:00
get_viewport ( ) - > find_world_3d ( ) - > set_camera_attributes ( first - > camera_attributes ) ;
2021-02-22 14:54:12 +01:00
} else {
2022-08-01 01:20:24 +02:00
get_viewport ( ) - > find_world_3d ( ) - > set_camera_attributes ( Ref < CameraAttributes > ( ) ) ;
2021-02-22 14:54:12 +01:00
}
2022-08-01 01:20:24 +02: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 14:54:12 +01: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 11:00:51 +02:00
remove_from_group ( " _world_environment_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) ) ;
2014-09-22 05:50:48 +02:00
}
2017-03-05 16:44:50 +01:00
environment = p_environment ;
2021-02-22 14:54:12 +01:00
2017-06-24 13:58:27 +02:00
if ( is_inside_tree ( ) & & environment . is_valid ( ) ) {
2020-04-18 11:00:51 +02:00
add_to_group ( " _world_environment_ " + itos ( get_viewport ( ) - > find_world_3d ( ) - > get_scenario ( ) . get_id ( ) ) ) ;
2014-02-10 02:10:30 +01:00
}
2016-05-17 23:27:15 +02:00
2021-02-22 14:54:12 +01:00
if ( is_inside_tree ( ) ) {
_update_current_environment ( ) ;
} else {
2020-10-29 11:01:28 +01:00
update_configuration_warnings ( ) ;
2021-02-22 14:54:12 +01:00
}
2014-02-10 02:10:30 +01:00
}
Ref < Environment > WorldEnvironment : : get_environment ( ) const {
return environment ;
}
2022-08-01 01:20:24 +02:00
void WorldEnvironment : : set_camera_attributes ( const Ref < CameraAttributes > & p_camera_attributes ) {
if ( camera_attributes = = p_camera_attributes ) {
2021-02-22 14:54:12 +01:00
return ;
}
2022-08-01 01:20:24 +02: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-13 19:37:24 +01:00
}
2022-08-01 01:20:24 +02: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-13 19:37:24 +01:00
}
2021-02-22 14:54:12 +01:00
if ( is_inside_tree ( ) ) {
2022-08-01 01:20:24 +02:00
_update_current_camera_attributes ( ) ;
2021-02-22 14:54:12 +01:00
} else {
2020-10-29 11:01:28 +01:00
update_configuration_warnings ( ) ;
2021-02-22 14:54:12 +01:00
}
2020-01-13 19:37:24 +01:00
}
2022-08-01 01:20:24 +02:00
Ref < CameraAttributes > WorldEnvironment : : get_camera_attributes ( ) const {
return camera_attributes ;
2020-01-13 19:37:24 +01:00
}
2023-07-05 15:41:44 +02:00
Array WorldEnvironment : : get_configuration_warnings ( ) const {
Array warnings = Node : : get_configuration_warnings ( ) ;
2020-05-14 22:59:27 +02:00
2022-08-01 01:20:24 +02: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 11:15:15 +01:00
}
2020-05-14 16:41:43 +02:00
if ( ! is_inside_tree ( ) ) {
2020-10-29 11:01:28 +01:00
return warnings ;
2020-05-14 16:41:43 +02:00
}
2016-05-17 23:27:15 +02:00
2021-02-22 14:54:12 +01:00
if ( environment . is_valid ( ) & & get_viewport ( ) - > find_world_3d ( ) - > get_environment ( ) ! = environment ) {
2020-10-29 11:01:28 +01:00
warnings . push_back ( ( " Only the first Environment has an effect in a scene (or set of instantiated scenes). " ) ) ;
2021-02-22 14:54:12 +01:00
}
2016-05-17 23:27:15 +02:00
2022-08-01 01:20:24 +02:00
if ( camera_attributes . is_valid ( ) & & get_viewport ( ) - > find_world_3d ( ) - > get_camera_attributes ( ) ! = camera_attributes ) {
2022-03-28 15:24:14 +02:00
warnings . push_back ( RTR ( " Only one WorldEnvironment is allowed per scene (or set of instantiated scenes). " ) ) ;
2016-05-17 23:27:15 +02:00
}
2020-10-29 11:01:28 +01:00
return warnings ;
2016-05-17 23:27:15 +02:00
}
2014-02-10 02:10:30 +01:00
void WorldEnvironment : : _bind_methods ( ) {
2017-08-09 13:19:41 +02:00
ClassDB : : bind_method ( D_METHOD ( " set_environment " , " env " ) , & WorldEnvironment : : set_environment ) ;
ClassDB : : bind_method ( D_METHOD ( " get_environment " ) , & WorldEnvironment : : get_environment ) ;
2017-03-05 16:44:50 +01:00
ADD_PROPERTY ( PropertyInfo ( Variant : : OBJECT , " environment " , PROPERTY_HINT_RESOURCE_TYPE , " Environment " ) , " set_environment " , " get_environment " ) ;
2020-01-13 19:37:24 +01:00
2022-08-01 01:20:24 +02: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 " ) ;
2014-02-10 02:10:30 +01:00
}
WorldEnvironment : : WorldEnvironment ( ) {
}