2014-02-09 22:10:30 -03:00
/*************************************************************************/
/* area_2d.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 14:16:55 +02:00
/* https://godotengine.org */
2014-02-09 22:10:30 -03:00
/*************************************************************************/
2022-01-03 21:27:34 +01:00
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
2014-02-09 22:10:30 -03:00
/* */
/* 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
2014-02-09 22:10:30 -03:00
# include "area_2d.h"
2020-02-21 23:26:13 +01:00
2014-02-09 22:10:30 -03:00
# include "scene/scene_string_names.h"
2017-06-18 21:07:32 -03:00
# include "servers/audio_server.h"
2021-11-04 18:12:00 -07:00
void Area2D : : set_gravity_space_override_mode ( SpaceOverride p_mode ) {
gravity_space_override = p_mode ;
PhysicsServer2D : : get_singleton ( ) - > area_set_param ( get_rid ( ) , PhysicsServer2D : : AREA_PARAM_GRAVITY_OVERRIDE_MODE , p_mode ) ;
2014-02-09 22:10:30 -03:00
}
2020-05-14 14:29:06 +02:00
2021-11-04 18:12:00 -07:00
Area2D : : SpaceOverride Area2D : : get_gravity_space_override_mode ( ) const {
return gravity_space_override ;
2014-02-09 22:10:30 -03:00
}
2017-03-05 16:44:50 +01:00
void Area2D : : set_gravity_is_point ( bool p_enabled ) {
gravity_is_point = p_enabled ;
2020-03-27 15:21:27 -03:00
PhysicsServer2D : : get_singleton ( ) - > area_set_param ( get_rid ( ) , PhysicsServer2D : : AREA_PARAM_GRAVITY_IS_POINT , p_enabled ) ;
2014-02-09 22:10:30 -03:00
}
2020-05-14 14:29:06 +02:00
2017-03-05 16:44:50 +01:00
bool Area2D : : is_gravity_a_point ( ) const {
2014-02-09 22:10:30 -03:00
return gravity_is_point ;
}
2021-11-04 18:12:00 -07:00
void Area2D : : set_gravity_point_distance_scale ( real_t p_scale ) {
2017-03-05 16:44:50 +01:00
gravity_distance_scale = p_scale ;
2020-03-27 15:21:27 -03:00
PhysicsServer2D : : get_singleton ( ) - > area_set_param ( get_rid ( ) , PhysicsServer2D : : AREA_PARAM_GRAVITY_DISTANCE_SCALE , p_scale ) ;
2015-04-29 16:06:25 +00:00
}
2021-11-04 18:12:00 -07:00
real_t Area2D : : get_gravity_point_distance_scale ( ) const {
2015-04-29 16:06:25 +00:00
return gravity_distance_scale ;
}
2021-11-04 18:12:00 -07:00
void Area2D : : set_gravity_point_center ( const Vector2 & p_center ) {
gravity_vec = p_center ;
PhysicsServer2D : : get_singleton ( ) - > area_set_param ( get_rid ( ) , PhysicsServer2D : : AREA_PARAM_GRAVITY_VECTOR , p_center ) ;
2014-02-09 22:10:30 -03:00
}
2020-05-14 14:29:06 +02:00
2021-11-04 18:12:00 -07:00
const Vector2 & Area2D : : get_gravity_point_center ( ) const {
return gravity_vec ;
}
void Area2D : : set_gravity_direction ( const Vector2 & p_direction ) {
gravity_vec = p_direction ;
PhysicsServer2D : : get_singleton ( ) - > area_set_param ( get_rid ( ) , PhysicsServer2D : : AREA_PARAM_GRAVITY_VECTOR , p_direction ) ;
}
const Vector2 & Area2D : : get_gravity_direction ( ) const {
2014-02-09 22:10:30 -03:00
return gravity_vec ;
}
2017-03-05 16:44:50 +01:00
void Area2D : : set_gravity ( real_t p_gravity ) {
gravity = p_gravity ;
2020-03-27 15:21:27 -03:00
PhysicsServer2D : : get_singleton ( ) - > area_set_param ( get_rid ( ) , PhysicsServer2D : : AREA_PARAM_GRAVITY , p_gravity ) ;
2014-02-09 22:10:30 -03:00
}
2020-05-14 14:29:06 +02:00
2017-03-05 16:44:50 +01:00
real_t Area2D : : get_gravity ( ) const {
2014-02-09 22:10:30 -03:00
return gravity ;
}
2021-11-04 18:12:00 -07:00
void Area2D : : set_linear_damp_space_override_mode ( SpaceOverride p_mode ) {
linear_damp_space_override = p_mode ;
PhysicsServer2D : : get_singleton ( ) - > area_set_param ( get_rid ( ) , PhysicsServer2D : : AREA_PARAM_LINEAR_DAMP_OVERRIDE_MODE , p_mode ) ;
}
Area2D : : SpaceOverride Area2D : : get_linear_damp_space_override_mode ( ) const {
return linear_damp_space_override ;
}
void Area2D : : set_angular_damp_space_override_mode ( SpaceOverride p_mode ) {
angular_damp_space_override = p_mode ;
PhysicsServer2D : : get_singleton ( ) - > area_set_param ( get_rid ( ) , PhysicsServer2D : : AREA_PARAM_ANGULAR_DAMP_OVERRIDE_MODE , p_mode ) ;
}
Area2D : : SpaceOverride Area2D : : get_angular_damp_space_override_mode ( ) const {
return angular_damp_space_override ;
}
2017-03-05 16:44:50 +01:00
void Area2D : : set_linear_damp ( real_t p_linear_damp ) {
linear_damp = p_linear_damp ;
2020-03-27 15:21:27 -03:00
PhysicsServer2D : : get_singleton ( ) - > area_set_param ( get_rid ( ) , PhysicsServer2D : : AREA_PARAM_LINEAR_DAMP , p_linear_damp ) ;
2014-02-09 22:10:30 -03:00
}
2020-05-14 14:29:06 +02:00
2017-03-05 16:44:50 +01:00
real_t Area2D : : get_linear_damp ( ) const {
2015-01-05 18:37:12 -03:00
return linear_damp ;
}
2017-03-05 16:44:50 +01:00
void Area2D : : set_angular_damp ( real_t p_angular_damp ) {
angular_damp = p_angular_damp ;
2020-03-27 15:21:27 -03:00
PhysicsServer2D : : get_singleton ( ) - > area_set_param ( get_rid ( ) , PhysicsServer2D : : AREA_PARAM_ANGULAR_DAMP , p_angular_damp ) ;
2015-01-05 18:37:12 -03:00
}
2017-03-05 16:44:50 +01:00
real_t Area2D : : get_angular_damp ( ) const {
2015-01-05 18:37:12 -03:00
return angular_damp ;
2014-02-09 22:10:30 -03:00
}
2017-03-05 16:44:50 +01:00
void Area2D : : set_priority ( real_t p_priority ) {
priority = p_priority ;
2020-03-27 15:21:27 -03:00
PhysicsServer2D : : get_singleton ( ) - > area_set_param ( get_rid ( ) , PhysicsServer2D : : AREA_PARAM_PRIORITY , p_priority ) ;
2014-02-09 22:10:30 -03:00
}
2020-05-14 14:29:06 +02:00
2017-03-05 16:44:50 +01:00
real_t Area2D : : get_priority ( ) const {
2014-02-09 22:10:30 -03:00
return priority ;
}
2014-11-05 21:20:42 -03:00
void Area2D : : _body_enter_tree ( ObjectID p_id ) {
2014-02-09 22:10:30 -03:00
Object * obj = ObjectDB : : get_instance ( p_id ) ;
2017-08-24 22:58:51 +02:00
Node * node = Object : : cast_to < Node > ( obj ) ;
2014-02-09 22:10:30 -03:00
ERR_FAIL_COND ( ! node ) ;
2022-05-13 15:04:37 +02:00
HashMap < ObjectID , BodyState > : : Iterator E = body_map . find ( p_id ) ;
2014-02-09 22:10:30 -03:00
ERR_FAIL_COND ( ! E ) ;
2022-05-13 15:04:37 +02:00
ERR_FAIL_COND ( E - > value . in_tree ) ;
2014-02-09 22:10:30 -03:00
2022-05-13 15:04:37 +02:00
E - > value . in_tree = true ;
2017-03-05 16:44:50 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > body_entered , node ) ;
2022-05-13 15:04:37 +02:00
for ( int i = 0 ; i < E - > value . shapes . size ( ) ; i + + ) {
emit_signal ( SceneStringNames : : get_singleton ( ) - > body_shape_entered , E - > value . rid , node , E - > value . shapes [ i ] . body_shape , E - > value . shapes [ i ] . area_shape ) ;
2014-02-09 22:10:30 -03:00
}
}
2014-11-05 21:20:42 -03:00
void Area2D : : _body_exit_tree ( ObjectID p_id ) {
2014-02-09 22:10:30 -03:00
Object * obj = ObjectDB : : get_instance ( p_id ) ;
2017-08-24 22:58:51 +02:00
Node * node = Object : : cast_to < Node > ( obj ) ;
2014-02-09 22:10:30 -03:00
ERR_FAIL_COND ( ! node ) ;
2022-05-13 15:04:37 +02:00
HashMap < ObjectID , BodyState > : : Iterator E = body_map . find ( p_id ) ;
2014-02-09 22:10:30 -03:00
ERR_FAIL_COND ( ! E ) ;
2022-05-13 15:04:37 +02:00
ERR_FAIL_COND ( ! E - > value . in_tree ) ;
E - > value . in_tree = false ;
2017-03-05 16:44:50 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > body_exited , node ) ;
2022-05-13 15:04:37 +02:00
for ( int i = 0 ; i < E - > value . shapes . size ( ) ; i + + ) {
emit_signal ( SceneStringNames : : get_singleton ( ) - > body_shape_exited , E - > value . rid , node , E - > value . shapes [ i ] . body_shape , E - > value . shapes [ i ] . area_shape ) ;
2014-02-09 22:10:30 -03:00
}
}
2020-02-12 14:24:06 -03:00
void Area2D : : _body_inout ( int p_status , const RID & p_body , ObjectID p_instance , int p_body_shape , int p_area_shape ) {
2020-03-27 15:21:27 -03:00
bool body_in = p_status = = PhysicsServer2D : : AREA_BODY_ADDED ;
2017-03-05 16:44:50 +01:00
ObjectID objid = p_instance ;
2014-02-09 22:10:30 -03:00
Object * obj = ObjectDB : : get_instance ( objid ) ;
2017-08-24 22:58:51 +02:00
Node * node = Object : : cast_to < Node > ( obj ) ;
2014-02-09 22:10:30 -03:00
2022-05-13 15:04:37 +02:00
HashMap < ObjectID , BodyState > : : Iterator E = body_map . find ( objid ) ;
2014-02-09 22:10:30 -03:00
2018-11-28 18:40:58 -03:00
if ( ! body_in & & ! E ) {
return ; //does not exist because it was likely removed from the tree
}
2014-02-09 22:10:30 -03:00
2017-03-05 16:44:50 +01:00
locked = true ;
2014-12-07 02:04:20 -03:00
2014-02-09 22:10:30 -03:00
if ( body_in ) {
if ( ! E ) {
2017-03-05 16:44:50 +01:00
E = body_map . insert ( objid , BodyState ( ) ) ;
2022-05-13 15:04:37 +02:00
E - > value . rid = p_body ;
E - > value . rc = 0 ;
E - > value . in_tree = node & & node - > is_inside_tree ( ) ;
2014-02-09 22:10:30 -03:00
if ( node ) {
2022-07-28 22:56:41 +02:00
node - > connect ( SceneStringNames : : get_singleton ( ) - > tree_entered , callable_mp ( this , & Area2D : : _body_enter_tree ) . bind ( objid ) ) ;
node - > connect ( SceneStringNames : : get_singleton ( ) - > tree_exiting , callable_mp ( this , & Area2D : : _body_exit_tree ) . bind ( objid ) ) ;
2022-05-13 15:04:37 +02:00
if ( E - > value . in_tree ) {
2017-03-05 16:44:50 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > body_entered , node ) ;
2014-02-09 22:10:30 -03:00
}
}
}
2022-05-13 15:04:37 +02:00
E - > value . rc + + ;
2020-05-14 16:41:43 +02:00
if ( node ) {
2022-05-13 15:04:37 +02:00
E - > value . shapes . insert ( ShapePair ( p_body_shape , p_area_shape ) ) ;
2020-05-14 16:41:43 +02:00
}
2014-02-09 22:10:30 -03:00
2022-05-13 15:04:37 +02:00
if ( ! node | | E - > value . in_tree ) {
2020-10-12 16:25:32 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > body_shape_entered , p_body , node , p_body_shape , p_area_shape ) ;
2014-02-09 22:10:30 -03:00
}
} else {
2022-05-13 15:04:37 +02:00
E - > value . rc - - ;
2014-02-09 22:10:30 -03:00
2020-05-14 16:41:43 +02:00
if ( node ) {
2022-05-13 15:04:37 +02:00
E - > value . shapes . erase ( ShapePair ( p_body_shape , p_area_shape ) ) ;
2020-05-14 16:41:43 +02:00
}
2014-02-09 22:10:30 -03:00
2022-05-13 15:04:37 +02:00
bool in_tree = E - > value . in_tree ;
if ( E - > value . rc = = 0 ) {
body_map . remove ( E ) ;
2014-02-09 22:10:30 -03:00
if ( node ) {
2020-02-21 23:26:13 +01:00
node - > disconnect ( SceneStringNames : : get_singleton ( ) - > tree_entered , callable_mp ( this , & Area2D : : _body_enter_tree ) ) ;
node - > disconnect ( SceneStringNames : : get_singleton ( ) - > tree_exiting , callable_mp ( this , & Area2D : : _body_exit_tree ) ) ;
2020-10-02 16:41:55 +01:00
if ( in_tree ) {
2017-03-05 16:44:50 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > body_exited , obj ) ;
2020-05-14 16:41:43 +02:00
}
2014-02-09 22:10:30 -03:00
}
}
2020-10-02 16:41:55 +01:00
if ( ! node | | in_tree ) {
2020-10-12 16:25:32 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > body_shape_exited , p_body , obj , p_body_shape , p_area_shape ) ;
2014-02-09 22:10:30 -03:00
}
}
2017-03-05 16:44:50 +01:00
locked = false ;
2014-02-09 22:10:30 -03:00
}
2015-03-17 00:45:25 -03:00
void Area2D : : _area_enter_tree ( ObjectID p_id ) {
Object * obj = ObjectDB : : get_instance ( p_id ) ;
2017-08-24 22:58:51 +02:00
Node * node = Object : : cast_to < Node > ( obj ) ;
2015-03-17 00:45:25 -03:00
ERR_FAIL_COND ( ! node ) ;
2022-05-13 15:04:37 +02:00
HashMap < ObjectID , AreaState > : : Iterator E = area_map . find ( p_id ) ;
2015-03-17 00:45:25 -03:00
ERR_FAIL_COND ( ! E ) ;
2022-05-13 15:04:37 +02:00
ERR_FAIL_COND ( E - > value . in_tree ) ;
2015-03-17 00:45:25 -03:00
2022-05-13 15:04:37 +02:00
E - > value . in_tree = true ;
2017-03-05 16:44:50 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > area_entered , node ) ;
2022-05-13 15:04:37 +02:00
for ( int i = 0 ; i < E - > value . shapes . size ( ) ; i + + ) {
emit_signal ( SceneStringNames : : get_singleton ( ) - > area_shape_entered , E - > value . rid , node , E - > value . shapes [ i ] . area_shape , E - > value . shapes [ i ] . self_shape ) ;
2015-03-17 00:45:25 -03:00
}
}
void Area2D : : _area_exit_tree ( ObjectID p_id ) {
Object * obj = ObjectDB : : get_instance ( p_id ) ;
2017-08-24 22:58:51 +02:00
Node * node = Object : : cast_to < Node > ( obj ) ;
2015-03-17 00:45:25 -03:00
ERR_FAIL_COND ( ! node ) ;
2022-05-13 15:04:37 +02:00
HashMap < ObjectID , AreaState > : : Iterator E = area_map . find ( p_id ) ;
2015-03-17 00:45:25 -03:00
ERR_FAIL_COND ( ! E ) ;
2022-05-13 15:04:37 +02:00
ERR_FAIL_COND ( ! E - > value . in_tree ) ;
E - > value . in_tree = false ;
2017-03-05 16:44:50 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > area_exited , node ) ;
2022-05-13 15:04:37 +02:00
for ( int i = 0 ; i < E - > value . shapes . size ( ) ; i + + ) {
emit_signal ( SceneStringNames : : get_singleton ( ) - > area_shape_exited , E - > value . rid , node , E - > value . shapes [ i ] . area_shape , E - > value . shapes [ i ] . self_shape ) ;
2015-03-17 00:45:25 -03:00
}
}
2020-02-12 14:24:06 -03:00
void Area2D : : _area_inout ( int p_status , const RID & p_area , ObjectID p_instance , int p_area_shape , int p_self_shape ) {
2020-03-27 15:21:27 -03:00
bool area_in = p_status = = PhysicsServer2D : : AREA_BODY_ADDED ;
2017-03-05 16:44:50 +01:00
ObjectID objid = p_instance ;
2015-03-17 00:45:25 -03:00
Object * obj = ObjectDB : : get_instance ( objid ) ;
2017-08-24 22:58:51 +02:00
Node * node = Object : : cast_to < Node > ( obj ) ;
2015-03-17 00:45:25 -03:00
2022-05-13 15:04:37 +02:00
HashMap < ObjectID , AreaState > : : Iterator E = area_map . find ( objid ) ;
2015-03-17 00:45:25 -03:00
2019-04-14 19:31:51 -07:00
if ( ! area_in & & ! E ) {
return ; //likely removed from the tree
}
2017-03-05 16:44:50 +01:00
locked = true ;
2015-03-17 00:45:25 -03:00
if ( area_in ) {
if ( ! E ) {
2017-03-05 16:44:50 +01:00
E = area_map . insert ( objid , AreaState ( ) ) ;
2022-05-13 15:04:37 +02:00
E - > value . rid = p_area ;
E - > value . rc = 0 ;
E - > value . in_tree = node & & node - > is_inside_tree ( ) ;
2015-03-17 00:45:25 -03:00
if ( node ) {
2022-07-28 22:56:41 +02:00
node - > connect ( SceneStringNames : : get_singleton ( ) - > tree_entered , callable_mp ( this , & Area2D : : _area_enter_tree ) . bind ( objid ) ) ;
node - > connect ( SceneStringNames : : get_singleton ( ) - > tree_exiting , callable_mp ( this , & Area2D : : _area_exit_tree ) . bind ( objid ) ) ;
2022-05-13 15:04:37 +02:00
if ( E - > value . in_tree ) {
2017-03-05 16:44:50 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > area_entered , node ) ;
2015-03-17 00:45:25 -03:00
}
}
}
2022-05-13 15:04:37 +02:00
E - > value . rc + + ;
2020-05-14 16:41:43 +02:00
if ( node ) {
2022-05-13 15:04:37 +02:00
E - > value . shapes . insert ( AreaShapePair ( p_area_shape , p_self_shape ) ) ;
2020-05-14 16:41:43 +02:00
}
2015-03-17 00:45:25 -03:00
2022-05-13 15:04:37 +02:00
if ( ! node | | E - > value . in_tree ) {
2020-10-12 16:25:32 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > area_shape_entered , p_area , node , p_area_shape , p_self_shape ) ;
2015-03-17 00:45:25 -03:00
}
} else {
2022-05-13 15:04:37 +02:00
E - > value . rc - - ;
2015-03-17 00:45:25 -03:00
2020-05-14 16:41:43 +02:00
if ( node ) {
2022-05-13 15:04:37 +02:00
E - > value . shapes . erase ( AreaShapePair ( p_area_shape , p_self_shape ) ) ;
2020-05-14 16:41:43 +02:00
}
2015-03-17 00:45:25 -03:00
2022-05-13 15:04:37 +02:00
bool in_tree = E - > value . in_tree ;
if ( E - > value . rc = = 0 ) {
area_map . remove ( E ) ;
2015-03-17 00:45:25 -03:00
if ( node ) {
2020-02-21 23:26:13 +01:00
node - > disconnect ( SceneStringNames : : get_singleton ( ) - > tree_entered , callable_mp ( this , & Area2D : : _area_enter_tree ) ) ;
node - > disconnect ( SceneStringNames : : get_singleton ( ) - > tree_exiting , callable_mp ( this , & Area2D : : _area_exit_tree ) ) ;
2020-10-02 16:41:55 +01:00
if ( in_tree ) {
2017-03-05 16:44:50 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > area_exited , obj ) ;
2020-05-14 16:41:43 +02:00
}
2015-03-17 00:45:25 -03:00
}
}
2020-10-02 16:41:55 +01:00
if ( ! node | | in_tree ) {
2020-10-12 16:25:32 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > area_shape_exited , p_area , obj , p_area_shape , p_self_shape ) ;
2015-03-17 00:45:25 -03:00
}
}
2017-03-05 16:44:50 +01:00
locked = false ;
2015-03-17 00:45:25 -03:00
}
2014-02-09 22:10:30 -03:00
void Area2D : : _clear_monitoring ( ) {
2019-08-08 22:11:48 +02:00
ERR_FAIL_COND_MSG ( locked , " This function can't be used during the in/out signal. " ) ;
2014-02-09 22:10:30 -03:00
2015-03-17 00:45:25 -03:00
{
2022-05-13 15:04:37 +02:00
HashMap < ObjectID , BodyState > bmcopy = body_map ;
2015-03-17 00:45:25 -03:00
body_map . clear ( ) ;
//disconnect all monitored stuff
2014-02-09 22:10:30 -03:00
2021-08-09 14:13:42 -06:00
for ( const KeyValue < ObjectID , BodyState > & E : bmcopy ) {
Object * obj = ObjectDB : : get_instance ( E . key ) ;
2017-08-24 22:58:51 +02:00
Node * node = Object : : cast_to < Node > ( obj ) ;
2017-07-10 16:20:56 +02:00
2020-05-14 16:41:43 +02:00
if ( ! node ) { //node may have been deleted in previous frame or at other legitimate point
2017-07-10 16:20:56 +02:00
continue ;
2020-05-14 16:41:43 +02:00
}
2017-01-25 20:52:44 +01:00
2020-02-21 23:26:13 +01:00
node - > disconnect ( SceneStringNames : : get_singleton ( ) - > tree_entered , callable_mp ( this , & Area2D : : _body_enter_tree ) ) ;
node - > disconnect ( SceneStringNames : : get_singleton ( ) - > tree_exiting , callable_mp ( this , & Area2D : : _body_exit_tree ) ) ;
2017-01-25 20:52:44 +01:00
2021-08-09 14:13:42 -06:00
if ( ! E . value . in_tree ) {
2015-03-17 00:45:25 -03:00
continue ;
2020-05-14 16:41:43 +02:00
}
2014-02-09 22:10:30 -03:00
2021-08-09 14:13:42 -06:00
for ( int i = 0 ; i < E . value . shapes . size ( ) ; i + + ) {
emit_signal ( SceneStringNames : : get_singleton ( ) - > body_shape_exited , E . value . rid , node , E . value . shapes [ i ] . body_shape , E . value . shapes [ i ] . area_shape ) ;
2015-03-17 00:45:25 -03:00
}
2017-03-05 16:44:50 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > body_exited , obj ) ;
2014-02-09 22:10:30 -03:00
}
2015-03-17 00:45:25 -03:00
}
{
2022-05-13 15:04:37 +02:00
HashMap < ObjectID , AreaState > bmcopy = area_map ;
2015-03-17 00:45:25 -03:00
area_map . clear ( ) ;
//disconnect all monitored stuff
2021-08-09 14:13:42 -06:00
for ( const KeyValue < ObjectID , AreaState > & E : bmcopy ) {
Object * obj = ObjectDB : : get_instance ( E . key ) ;
2017-08-24 22:58:51 +02:00
Node * node = Object : : cast_to < Node > ( obj ) ;
2015-12-31 11:15:49 -03:00
2020-05-14 16:41:43 +02:00
if ( ! node ) { //node may have been deleted in previous frame or at other legitimate point
2015-12-31 11:15:49 -03:00
continue ;
2020-05-14 16:41:43 +02:00
}
2015-12-31 11:15:49 -03:00
2020-02-21 23:26:13 +01:00
node - > disconnect ( SceneStringNames : : get_singleton ( ) - > tree_entered , callable_mp ( this , & Area2D : : _area_enter_tree ) ) ;
node - > disconnect ( SceneStringNames : : get_singleton ( ) - > tree_exiting , callable_mp ( this , & Area2D : : _area_exit_tree ) ) ;
2017-01-25 20:52:44 +01:00
2021-08-09 14:13:42 -06:00
if ( ! E . value . in_tree ) {
2015-03-17 00:45:25 -03:00
continue ;
2020-05-14 16:41:43 +02:00
}
2015-03-17 00:45:25 -03:00
2021-08-09 14:13:42 -06:00
for ( int i = 0 ; i < E . value . shapes . size ( ) ; i + + ) {
emit_signal ( SceneStringNames : : get_singleton ( ) - > area_shape_exited , E . value . rid , node , E . value . shapes [ i ] . area_shape , E . value . shapes [ i ] . self_shape ) ;
2015-03-17 00:45:25 -03:00
}
2017-03-05 16:44:50 +01:00
emit_signal ( SceneStringNames : : get_singleton ( ) - > area_exited , obj ) ;
2015-03-17 00:45:25 -03:00
}
2014-02-09 22:10:30 -03:00
}
}
void Area2D : : _notification ( int p_what ) {
2017-03-05 16:44:50 +01:00
switch ( p_what ) {
2014-11-05 21:20:42 -03:00
case NOTIFICATION_EXIT_TREE : {
2014-02-09 22:10:30 -03:00
_clear_monitoring ( ) ;
} break ;
}
}
2017-01-13 20:03:51 -03:00
void Area2D : : set_monitoring ( bool p_enable ) {
2020-05-14 16:41:43 +02:00
if ( p_enable = = monitoring ) {
2014-02-09 22:10:30 -03:00
return ;
2020-05-14 16:41:43 +02:00
}
2019-08-08 22:11:48 +02:00
ERR_FAIL_COND_MSG ( locked , " Function blocked during in/out signal. Use set_deferred( \" monitoring \" , true/false). " ) ;
2014-02-09 22:10:30 -03:00
2017-03-05 16:44:50 +01:00
monitoring = p_enable ;
2014-02-09 22:10:30 -03:00
if ( monitoring ) {
2021-10-31 15:45:58 -06:00
PhysicsServer2D : : get_singleton ( ) - > area_set_monitor_callback ( get_rid ( ) , callable_mp ( this , & Area2D : : _body_inout ) ) ;
PhysicsServer2D : : get_singleton ( ) - > area_set_area_monitor_callback ( get_rid ( ) , callable_mp ( this , & Area2D : : _area_inout ) ) ;
2014-02-09 22:10:30 -03:00
} else {
2021-10-31 15:45:58 -06:00
PhysicsServer2D : : get_singleton ( ) - > area_set_monitor_callback ( get_rid ( ) , Callable ( ) ) ;
PhysicsServer2D : : get_singleton ( ) - > area_set_area_monitor_callback ( get_rid ( ) , Callable ( ) ) ;
2014-02-09 22:10:30 -03:00
_clear_monitoring ( ) ;
}
}
2017-01-13 20:03:51 -03:00
bool Area2D : : is_monitoring ( ) const {
2014-02-09 22:10:30 -03:00
return monitoring ;
}
2015-03-17 00:45:25 -03:00
void Area2D : : set_monitorable ( bool p_enable ) {
2020-03-27 15:21:27 -03:00
ERR_FAIL_COND_MSG ( locked | | ( is_inside_tree ( ) & & PhysicsServer2D : : get_singleton ( ) - > is_flushing_queries ( ) ) , " Function blocked during in/out signal. Use set_deferred( \" monitorable \" , true/false). " ) ;
2015-03-17 00:45:25 -03:00
2020-05-14 16:41:43 +02:00
if ( p_enable = = monitorable ) {
2015-03-17 00:45:25 -03:00
return ;
2020-05-14 16:41:43 +02:00
}
2015-03-17 00:45:25 -03:00
2017-03-05 16:44:50 +01:00
monitorable = p_enable ;
2015-03-17 00:45:25 -03:00
2020-03-27 15:21:27 -03:00
PhysicsServer2D : : get_singleton ( ) - > area_set_monitorable ( get_rid ( ) , monitorable ) ;
2015-03-17 00:45:25 -03:00
}
bool Area2D : : is_monitorable ( ) const {
return monitorable ;
}
2020-04-21 12:16:45 -03:00
TypedArray < Node2D > Area2D : : get_overlapping_bodies ( ) const {
2019-09-25 10:28:50 +02:00
ERR_FAIL_COND_V_MSG ( ! monitoring , Array ( ) , " Can't find overlapping bodies when monitoring is off. " ) ;
2020-04-21 12:16:45 -03:00
TypedArray < Node2D > ret ;
2014-11-13 00:53:12 -03:00
ret . resize ( body_map . size ( ) ) ;
2017-03-05 16:44:50 +01:00
int idx = 0 ;
2021-08-09 14:13:42 -06:00
for ( const KeyValue < ObjectID , BodyState > & E : body_map ) {
Object * obj = ObjectDB : : get_instance ( E . key ) ;
2014-11-13 00:53:12 -03:00
if ( ! obj ) {
2017-03-05 16:44:50 +01:00
ret . resize ( ret . size ( ) - 1 ) ; //ops
2014-11-13 00:53:12 -03:00
} else {
2017-03-05 16:44:50 +01:00
ret [ idx + + ] = obj ;
2014-11-13 00:53:12 -03:00
}
}
return ret ;
}
2020-04-21 12:16:45 -03:00
TypedArray < Area2D > Area2D : : get_overlapping_areas ( ) const {
2019-09-25 10:28:50 +02:00
ERR_FAIL_COND_V_MSG ( ! monitoring , Array ( ) , " Can't find overlapping bodies when monitoring is off. " ) ;
2020-04-21 12:16:45 -03:00
TypedArray < Area2D > ret ;
2015-03-17 00:45:25 -03:00
ret . resize ( area_map . size ( ) ) ;
2017-03-05 16:44:50 +01:00
int idx = 0 ;
2021-08-09 14:13:42 -06:00
for ( const KeyValue < ObjectID , AreaState > & E : area_map ) {
Object * obj = ObjectDB : : get_instance ( E . key ) ;
2015-03-17 00:45:25 -03:00
if ( ! obj ) {
2017-03-05 16:44:50 +01:00
ret . resize ( ret . size ( ) - 1 ) ; //ops
2015-03-17 00:45:25 -03:00
} else {
2017-03-05 16:44:50 +01:00
ret [ idx + + ] = obj ;
2015-03-17 00:45:25 -03:00
}
}
return ret ;
}
2014-02-09 22:10:30 -03:00
2017-03-05 16:44:50 +01:00
bool Area2D : : overlaps_area ( Node * p_area ) const {
ERR_FAIL_NULL_V ( p_area , false ) ;
2022-05-13 15:04:37 +02:00
HashMap < ObjectID , AreaState > : : ConstIterator E = area_map . find ( p_area - > get_instance_id ( ) ) ;
2020-05-14 16:41:43 +02:00
if ( ! E ) {
2015-03-17 09:25:35 -03:00
return false ;
2020-05-14 16:41:43 +02:00
}
2022-05-13 15:04:37 +02:00
return E - > value . in_tree ;
2015-03-17 09:25:35 -03:00
}
2017-03-05 16:44:50 +01:00
bool Area2D : : overlaps_body ( Node * p_body ) const {
ERR_FAIL_NULL_V ( p_body , false ) ;
2022-05-13 15:04:37 +02:00
HashMap < ObjectID , BodyState > : : ConstIterator E = body_map . find ( p_body - > get_instance_id ( ) ) ;
2020-05-14 16:41:43 +02:00
if ( ! E ) {
2015-03-17 09:25:35 -03:00
return false ;
2020-05-14 16:41:43 +02:00
}
2022-05-13 15:04:37 +02:00
return E - > value . in_tree ;
2015-03-17 09:25:35 -03:00
}
2017-06-18 21:07:32 -03:00
void Area2D : : set_audio_bus_override ( bool p_override ) {
audio_bus_override = p_override ;
}
bool Area2D : : is_overriding_audio_bus ( ) const {
return audio_bus_override ;
}
2017-09-22 13:29:33 -03:00
void Area2D : : set_audio_bus_name ( const StringName & p_audio_bus ) {
2017-06-18 21:07:32 -03:00
audio_bus = p_audio_bus ;
}
2017-09-22 13:29:33 -03:00
StringName Area2D : : get_audio_bus_name ( ) const {
2017-06-18 21:07:32 -03:00
for ( int i = 0 ; i < AudioServer : : get_singleton ( ) - > get_bus_count ( ) ; i + + ) {
if ( AudioServer : : get_singleton ( ) - > get_bus_name ( i ) = = audio_bus ) {
return audio_bus ;
}
}
return " Master " ;
}
2022-08-12 23:57:11 +03:00
void Area2D : : _validate_property ( PropertyInfo & p_property ) const {
if ( p_property . name = = " audio_bus_name " ) {
2017-06-18 21:07:32 -03:00
String options ;
for ( int i = 0 ; i < AudioServer : : get_singleton ( ) - > get_bus_count ( ) ; i + + ) {
2020-05-14 16:41:43 +02:00
if ( i > 0 ) {
2017-06-18 21:07:32 -03:00
options + = " , " ;
2020-05-14 16:41:43 +02:00
}
2017-06-18 21:07:32 -03:00
String name = AudioServer : : get_singleton ( ) - > get_bus_name ( i ) ;
options + = name ;
}
2022-08-12 23:57:11 +03:00
p_property . hint_string = options ;
} else if ( p_property . name . begins_with ( " gravity " ) & & p_property . name ! = " gravity_space_override " ) {
2021-11-04 18:12:00 -07:00
if ( gravity_space_override = = SPACE_OVERRIDE_DISABLED ) {
2022-08-12 23:57:11 +03:00
p_property . usage = PROPERTY_USAGE_NO_EDITOR ;
2021-11-04 18:12:00 -07:00
} else {
if ( gravity_is_point ) {
2022-08-12 23:57:11 +03:00
if ( p_property . name = = " gravity_direction " ) {
p_property . usage = PROPERTY_USAGE_NO_EDITOR ;
2021-11-04 18:12:00 -07:00
}
} else {
2022-08-12 23:57:11 +03:00
if ( p_property . name . begins_with ( " gravity_point_ " ) ) {
p_property . usage = PROPERTY_USAGE_NO_EDITOR ;
2021-11-04 18:12:00 -07:00
}
}
}
2022-08-12 23:57:11 +03:00
} else if ( p_property . name . begins_with ( " linear_damp " ) & & p_property . name ! = " linear_damp_space_override " ) {
2021-11-04 18:12:00 -07:00
if ( linear_damp_space_override = = SPACE_OVERRIDE_DISABLED ) {
2022-08-12 23:57:11 +03:00
p_property . usage = PROPERTY_USAGE_NO_EDITOR ;
2021-11-04 18:12:00 -07:00
}
2022-08-12 23:57:11 +03:00
} else if ( p_property . name . begins_with ( " angular_damp " ) & & p_property . name ! = " angular_damp_space_override " ) {
2021-11-04 18:12:00 -07:00
if ( angular_damp_space_override = = SPACE_OVERRIDE_DISABLED ) {
2022-08-12 23:57:11 +03:00
p_property . usage = PROPERTY_USAGE_NO_EDITOR ;
2021-11-04 18:12:00 -07:00
}
2017-06-18 21:07:32 -03:00
}
}
2014-02-09 22:10:30 -03:00
void Area2D : : _bind_methods ( ) {
2021-11-04 18:12:00 -07:00
ClassDB : : bind_method ( D_METHOD ( " set_gravity_space_override_mode " , " space_override_mode " ) , & Area2D : : set_gravity_space_override_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " get_gravity_space_override_mode " ) , & Area2D : : get_gravity_space_override_mode ) ;
2015-04-29 16:06:25 +00:00
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_gravity_is_point " , " enable " ) , & Area2D : : set_gravity_is_point ) ;
ClassDB : : bind_method ( D_METHOD ( " is_gravity_a_point " ) , & Area2D : : is_gravity_a_point ) ;
2014-02-09 22:10:30 -03:00
2021-11-04 18:12:00 -07:00
ClassDB : : bind_method ( D_METHOD ( " set_gravity_point_distance_scale " , " distance_scale " ) , & Area2D : : set_gravity_point_distance_scale ) ;
ClassDB : : bind_method ( D_METHOD ( " get_gravity_point_distance_scale " ) , & Area2D : : get_gravity_point_distance_scale ) ;
ClassDB : : bind_method ( D_METHOD ( " set_gravity_point_center " , " center " ) , & Area2D : : set_gravity_point_center ) ;
ClassDB : : bind_method ( D_METHOD ( " get_gravity_point_center " ) , & Area2D : : get_gravity_point_center ) ;
2014-02-09 22:10:30 -03:00
2021-11-04 18:12:00 -07:00
ClassDB : : bind_method ( D_METHOD ( " set_gravity_direction " , " direction " ) , & Area2D : : set_gravity_direction ) ;
ClassDB : : bind_method ( D_METHOD ( " get_gravity_direction " ) , & Area2D : : get_gravity_direction ) ;
2015-01-05 18:37:12 -03:00
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_gravity " , " gravity " ) , & Area2D : : set_gravity ) ;
ClassDB : : bind_method ( D_METHOD ( " get_gravity " ) , & Area2D : : get_gravity ) ;
2014-02-09 22:10:30 -03:00
2021-11-04 18:12:00 -07:00
ClassDB : : bind_method ( D_METHOD ( " set_linear_damp_space_override_mode " , " space_override_mode " ) , & Area2D : : set_linear_damp_space_override_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " get_linear_damp_space_override_mode " ) , & Area2D : : get_linear_damp_space_override_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " set_angular_damp_space_override_mode " , " space_override_mode " ) , & Area2D : : set_angular_damp_space_override_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " get_angular_damp_space_override_mode " ) , & Area2D : : get_angular_damp_space_override_mode ) ;
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_linear_damp " , " linear_damp " ) , & Area2D : : set_linear_damp ) ;
ClassDB : : bind_method ( D_METHOD ( " get_linear_damp " ) , & Area2D : : get_linear_damp ) ;
2014-02-09 22:10:30 -03:00
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_angular_damp " , " angular_damp " ) , & Area2D : : set_angular_damp ) ;
ClassDB : : bind_method ( D_METHOD ( " get_angular_damp " ) , & Area2D : : get_angular_damp ) ;
2015-05-03 16:47:21 -03:00
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_priority " , " priority " ) , & Area2D : : set_priority ) ;
ClassDB : : bind_method ( D_METHOD ( " get_priority " ) , & Area2D : : get_priority ) ;
2015-05-03 16:47:21 -03:00
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_monitoring " , " enable " ) , & Area2D : : set_monitoring ) ;
ClassDB : : bind_method ( D_METHOD ( " is_monitoring " ) , & Area2D : : is_monitoring ) ;
2014-11-13 00:53:12 -03:00
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_monitorable " , " enable " ) , & Area2D : : set_monitorable ) ;
ClassDB : : bind_method ( D_METHOD ( " is_monitorable " ) , & Area2D : : is_monitorable ) ;
2015-03-17 09:25:35 -03:00
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " get_overlapping_bodies " ) , & Area2D : : get_overlapping_bodies ) ;
ClassDB : : bind_method ( D_METHOD ( " get_overlapping_areas " ) , & Area2D : : get_overlapping_areas ) ;
2015-03-17 00:45:25 -03:00
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " overlaps_body " , " body " ) , & Area2D : : overlaps_body ) ;
ClassDB : : bind_method ( D_METHOD ( " overlaps_area " , " area " ) , & Area2D : : overlaps_area ) ;
2015-03-17 00:45:25 -03:00
2017-09-22 13:29:33 -03:00
ClassDB : : bind_method ( D_METHOD ( " set_audio_bus_name " , " name " ) , & Area2D : : set_audio_bus_name ) ;
ClassDB : : bind_method ( D_METHOD ( " get_audio_bus_name " ) , & Area2D : : get_audio_bus_name ) ;
2017-06-18 21:07:32 -03:00
ClassDB : : bind_method ( D_METHOD ( " set_audio_bus_override " , " enable " ) , & Area2D : : set_audio_bus_override ) ;
ClassDB : : bind_method ( D_METHOD ( " is_overriding_audio_bus " ) , & Area2D : : is_overriding_audio_bus ) ;
2021-09-25 08:44:18 -04:00
ADD_SIGNAL ( MethodInfo ( " body_shape_entered " , PropertyInfo ( Variant : : RID , " body_rid " ) , PropertyInfo ( Variant : : OBJECT , " body " , PROPERTY_HINT_RESOURCE_TYPE , " Node2D " ) , PropertyInfo ( Variant : : INT , " body_shape_index " ) , PropertyInfo ( Variant : : INT , " local_shape_index " ) ) ) ;
ADD_SIGNAL ( MethodInfo ( " body_shape_exited " , PropertyInfo ( Variant : : RID , " body_rid " ) , PropertyInfo ( Variant : : OBJECT , " body " , PROPERTY_HINT_RESOURCE_TYPE , " Node2D " ) , PropertyInfo ( Variant : : INT , " body_shape_index " ) , PropertyInfo ( Variant : : INT , " local_shape_index " ) ) ) ;
2021-02-23 23:51:20 -05:00
ADD_SIGNAL ( MethodInfo ( " body_entered " , PropertyInfo ( Variant : : OBJECT , " body " , PROPERTY_HINT_RESOURCE_TYPE , " Node2D " ) ) ) ;
ADD_SIGNAL ( MethodInfo ( " body_exited " , PropertyInfo ( Variant : : OBJECT , " body " , PROPERTY_HINT_RESOURCE_TYPE , " Node2D " ) ) ) ;
2014-02-09 22:10:30 -03:00
2021-09-25 08:44:18 -04:00
ADD_SIGNAL ( MethodInfo ( " area_shape_entered " , PropertyInfo ( Variant : : RID , " area_rid " ) , PropertyInfo ( Variant : : OBJECT , " area " , PROPERTY_HINT_RESOURCE_TYPE , " Area2D " ) , PropertyInfo ( Variant : : INT , " area_shape_index " ) , PropertyInfo ( Variant : : INT , " local_shape_index " ) ) ) ;
ADD_SIGNAL ( MethodInfo ( " area_shape_exited " , PropertyInfo ( Variant : : RID , " area_rid " ) , PropertyInfo ( Variant : : OBJECT , " area " , PROPERTY_HINT_RESOURCE_TYPE , " Area2D " ) , PropertyInfo ( Variant : : INT , " area_shape_index " ) , PropertyInfo ( Variant : : INT , " local_shape_index " ) ) ) ;
2017-03-05 16:44:50 +01:00
ADD_SIGNAL ( MethodInfo ( " area_entered " , PropertyInfo ( Variant : : OBJECT , " area " , PROPERTY_HINT_RESOURCE_TYPE , " Area2D " ) ) ) ;
ADD_SIGNAL ( MethodInfo ( " area_exited " , PropertyInfo ( Variant : : OBJECT , " area " , PROPERTY_HINT_RESOURCE_TYPE , " Area2D " ) ) ) ;
2014-02-09 22:10:30 -03:00
2021-04-17 18:18:17 -06:00
ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL , " monitoring " ) , " set_monitoring " , " is_monitoring " ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL , " monitorable " ) , " set_monitorable " , " is_monitorable " ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : INT , " priority " , PROPERTY_HINT_RANGE , " 0,128,1 " ) , " set_priority " , " get_priority " ) ;
2021-11-04 18:12:00 -07:00
ADD_GROUP ( " Gravity " , " gravity_ " ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : INT , " gravity_space_override " , PROPERTY_HINT_ENUM , " Disabled,Combine,Combine-Replace,Replace,Replace-Combine " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , " set_gravity_space_override_mode " , " get_gravity_space_override_mode " ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL , " gravity_point " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , " set_gravity_is_point " , " is_gravity_a_point " ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : FLOAT , " gravity_point_distance_scale " , PROPERTY_HINT_RANGE , " 0,1024,0.001,or_greater,exp " ) , " set_gravity_point_distance_scale " , " get_gravity_point_distance_scale " ) ;
2022-05-20 00:24:41 -05:00
ADD_PROPERTY ( PropertyInfo ( Variant : : VECTOR2 , " gravity_point_center " , PROPERTY_HINT_NONE , " suffix:px " ) , " set_gravity_point_center " , " get_gravity_point_center " ) ;
2021-11-04 18:12:00 -07:00
ADD_PROPERTY ( PropertyInfo ( Variant : : VECTOR2 , " gravity_direction " ) , " set_gravity_direction " , " get_gravity_direction " ) ;
2021-12-02 18:09:19 -06:00
ADD_PROPERTY ( PropertyInfo ( Variant : : FLOAT , " gravity " , PROPERTY_HINT_RANGE , U " -4096,4096,0.001,or_lesser,or_greater,suffix:px/s \u00B2 " ) , " set_gravity " , " get_gravity " ) ;
2021-11-04 18:12:00 -07:00
ADD_GROUP ( " Linear Damp " , " linear_damp_ " ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : INT , " linear_damp_space_override " , PROPERTY_HINT_ENUM , " Disabled,Combine,Combine-Replace,Replace,Replace-Combine " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , " set_linear_damp_space_override_mode " , " get_linear_damp_space_override_mode " ) ;
2020-02-24 15:20:53 -03:00
ADD_PROPERTY ( PropertyInfo ( Variant : : FLOAT , " linear_damp " , PROPERTY_HINT_RANGE , " 0,100,0.001,or_greater " ) , " set_linear_damp " , " get_linear_damp " ) ;
2021-11-04 18:12:00 -07:00
ADD_GROUP ( " Angular Damp " , " angular_damp_ " ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : INT , " angular_damp_space_override " , PROPERTY_HINT_ENUM , " Disabled,Combine,Combine-Replace,Replace,Replace-Combine " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , " set_angular_damp_space_override_mode " , " get_angular_damp_space_override_mode " ) ;
2020-02-24 15:20:53 -03:00
ADD_PROPERTY ( PropertyInfo ( Variant : : FLOAT , " angular_damp " , PROPERTY_HINT_RANGE , " 0,100,0.001,or_greater " ) , " set_angular_damp " , " get_angular_damp " ) ;
2021-04-17 18:18:17 -06:00
2017-06-18 21:07:32 -03:00
ADD_GROUP ( " Audio Bus " , " audio_bus_ " ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL , " audio_bus_override " ) , " set_audio_bus_override " , " is_overriding_audio_bus " ) ;
2020-02-20 18:58:05 -03:00
ADD_PROPERTY ( PropertyInfo ( Variant : : STRING_NAME , " audio_bus_name " , PROPERTY_HINT_ENUM , " " ) , " set_audio_bus_name " , " get_audio_bus_name " ) ;
2017-09-11 22:33:44 -05:00
BIND_ENUM_CONSTANT ( SPACE_OVERRIDE_DISABLED ) ;
BIND_ENUM_CONSTANT ( SPACE_OVERRIDE_COMBINE ) ;
BIND_ENUM_CONSTANT ( SPACE_OVERRIDE_COMBINE_REPLACE ) ;
BIND_ENUM_CONSTANT ( SPACE_OVERRIDE_REPLACE ) ;
BIND_ENUM_CONSTANT ( SPACE_OVERRIDE_REPLACE_COMBINE ) ;
2014-02-09 22:10:30 -03:00
}
2017-12-06 21:36:34 +01:00
Area2D : : Area2D ( ) :
2020-03-27 15:21:27 -03:00
CollisionObject2D ( PhysicsServer2D : : get_singleton ( ) - > area_create ( ) , true ) {
2020-02-16 12:09:53 +01:00
set_gravity ( 980 ) ;
2021-11-04 18:12:00 -07:00
set_gravity_direction ( Vector2 ( 0 , 1 ) ) ;
2017-01-13 20:03:51 -03:00
set_monitoring ( true ) ;
2015-03-17 00:45:25 -03:00
set_monitorable ( true ) ;
2014-02-09 22:10:30 -03:00
}
Area2D : : ~ Area2D ( ) {
}