2023-01-05 13:25:55 +01:00
/**************************************************************************/
/* physics_server_2d_wrap_mt.h */
/**************************************************************************/
/* 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
2021-10-18 21:24:30 +02:00
# ifndef PHYSICS_SERVER_2D_WRAP_MT_H
# define PHYSICS_SERVER_2D_WRAP_MT_H
2015-05-26 06:05:08 +02:00
2020-11-07 23:33:38 +01:00
# include "core/config/project_settings.h"
2024-04-04 10:18:08 +02:00
# include "core/object/worker_thread_pool.h"
2018-09-11 18:13:45 +02:00
# include "core/os/thread.h"
2020-11-07 23:33:38 +01:00
# include "core/templates/command_queue_mt.h"
2021-02-10 19:22:13 +01:00
# include "core/templates/safe_refcount.h"
2020-03-27 19:21:27 +01:00
# include "servers/physics_server_2d.h"
2015-05-26 06:05:08 +02:00
# ifdef DEBUG_SYNC
2017-03-05 16:44:50 +01:00
# define SYNC_DEBUG print_line("sync on: " + String(__FUNCTION__));
2015-05-26 06:05:08 +02:00
# else
# define SYNC_DEBUG
# endif
2024-04-04 10:18:08 +02:00
# ifdef DEBUG_ENABLED
# define MAIN_THREAD_SYNC_WARN WARN_PRINT("Call to " + String(__FUNCTION__) + " causing PhysicsServer2D synchronizations on every frame. This significantly affects performance.");
# endif
2020-03-27 19:21:27 +01:00
class PhysicsServer2DWrapMT : public PhysicsServer2D {
2024-04-04 10:18:08 +02:00
mutable PhysicsServer2D * physics_server_2d = nullptr ;
2015-05-26 06:05:08 +02:00
mutable CommandQueueMT command_queue ;
void thread_loop ( ) ;
2024-04-04 10:18:08 +02:00
Thread : : ID server_thread = Thread : : UNASSIGNED_ID ;
WorkerThreadPool : : TaskID server_task_id = WorkerThreadPool : : INVALID_TASK_ID ;
bool exit = false ;
Semaphore step_sem ;
2021-09-14 11:01:49 +02:00
bool create_thread = false ;
2015-05-26 06:05:08 +02:00
2017-02-14 00:25:05 +01:00
void thread_step ( real_t p_delta ) ;
2015-05-26 06:05:08 +02:00
void thread_exit ( ) ;
public :
2020-03-27 19:21:27 +01:00
# define ServerName PhysicsServer2D
# define ServerNameWrapMT PhysicsServer2DWrapMT
2022-04-27 05:52:53 +02:00
# define server_name physics_server_2d
2021-02-09 17:19:03 +01:00
# define WRITE_ACTION
2015-05-26 06:05:08 +02:00
# include "servers/server_wrap_mt_common.h"
//FUNC1RID(shape,ShapeType); todo fix
2021-09-14 19:52:35 +02:00
FUNCRID ( world_boundary_shape )
2021-08-19 20:21:56 +02:00
FUNCRID ( separation_ray_shape )
2017-11-10 03:34:01 +01:00
FUNCRID ( segment_shape )
FUNCRID ( circle_shape )
FUNCRID ( rectangle_shape )
FUNCRID ( capsule_shape )
FUNCRID ( convex_polygon_shape )
FUNCRID ( concave_polygon_shape )
2017-03-05 16:44:50 +01:00
FUNC2 ( shape_set_data , RID , const Variant & ) ;
FUNC2 ( shape_set_custom_solver_bias , RID , real_t ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC1RC ( ShapeType , shape_get_type , RID ) ;
FUNC1RC ( Variant , shape_get_data , RID ) ;
FUNC1RC ( real_t , shape_get_custom_solver_bias , RID ) ;
2015-05-26 06:05:08 +02:00
//these work well, but should be used from the main thread only
2021-02-09 17:19:03 +01:00
bool shape_collide ( RID p_shape_A , const Transform2D & p_xform_A , const Vector2 & p_motion_A , RID p_shape_B , const Transform2D & p_xform_B , const Vector2 & p_motion_B , Vector2 * r_results , int p_result_max , int & r_result_count ) override {
2024-04-04 10:18:08 +02:00
ERR_FAIL_COND_V ( ! Thread : : is_main_thread ( ) , false ) ;
2022-04-27 05:52:53 +02:00
return physics_server_2d - > shape_collide ( p_shape_A , p_xform_A , p_motion_A , p_shape_B , p_xform_B , p_motion_B , r_results , p_result_max , r_result_count ) ;
2015-05-26 06:05:08 +02:00
}
/* SPACE API */
2017-11-10 03:34:01 +01:00
FUNCRID ( space ) ;
2017-03-05 16:44:50 +01:00
FUNC2 ( space_set_active , RID , bool ) ;
FUNC1RC ( bool , space_is_active , RID ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC3 ( space_set_param , RID , SpaceParameter , real_t ) ;
FUNC2RC ( real_t , space_get_param , RID , SpaceParameter ) ;
2015-05-26 06:05:08 +02:00
2017-09-29 17:33:30 +02:00
// this function only works on physics process, errors and returns null otherwise
2021-02-09 17:19:03 +01:00
PhysicsDirectSpaceState2D * space_get_direct_state ( RID p_space ) override {
2024-04-04 10:18:08 +02:00
ERR_FAIL_COND_V ( ! Thread : : is_main_thread ( ) , nullptr ) ;
2022-04-27 05:52:53 +02:00
return physics_server_2d - > space_get_direct_state ( p_space ) ;
2015-05-26 06:05:08 +02:00
}
2017-03-05 16:44:50 +01:00
FUNC2 ( space_set_debug_contacts , RID , int ) ;
2021-02-09 17:19:03 +01:00
virtual Vector < Vector2 > space_get_contacts ( RID p_space ) const override {
2024-04-04 10:18:08 +02:00
ERR_FAIL_COND_V ( ! Thread : : is_main_thread ( ) , Vector < Vector2 > ( ) ) ;
2022-04-27 05:52:53 +02:00
return physics_server_2d - > space_get_contacts ( p_space ) ;
2015-09-20 18:03:46 +02:00
}
2021-02-09 17:19:03 +01:00
virtual int space_get_contact_count ( RID p_space ) const override {
2024-04-04 10:18:08 +02:00
ERR_FAIL_COND_V ( ! Thread : : is_main_thread ( ) , 0 ) ;
2022-04-27 05:52:53 +02:00
return physics_server_2d - > space_get_contact_count ( p_space ) ;
2015-09-20 18:03:46 +02:00
}
2015-05-26 06:05:08 +02:00
/* AREA API */
//FUNC0RID(area);
2017-11-10 03:34:01 +01:00
FUNCRID ( area ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC2 ( area_set_space , RID , RID ) ;
FUNC1RC ( RID , area_get_space , RID ) ;
2015-05-26 06:05:08 +02:00
2019-03-24 10:38:31 +01:00
FUNC4 ( area_add_shape , RID , RID , const Transform2D & , bool ) ;
2017-03-05 16:44:50 +01:00
FUNC3 ( area_set_shape , RID , int , RID ) ;
FUNC3 ( area_set_shape_transform , RID , int , const Transform2D & ) ;
2017-06-24 04:30:43 +02:00
FUNC3 ( area_set_shape_disabled , RID , int , bool ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC1RC ( int , area_get_shape_count , RID ) ;
FUNC2RC ( RID , area_get_shape , RID , int ) ;
FUNC2RC ( Transform2D , area_get_shape_transform , RID , int ) ;
FUNC2 ( area_remove_shape , RID , int ) ;
FUNC1 ( area_clear_shapes , RID ) ;
2015-05-26 06:05:08 +02:00
2017-08-07 12:17:31 +02:00
FUNC2 ( area_attach_object_instance_id , RID , ObjectID ) ;
FUNC1RC ( ObjectID , area_get_object_instance_id , RID ) ;
2015-05-26 06:05:08 +02:00
2018-08-25 00:03:26 +02:00
FUNC2 ( area_attach_canvas_instance_id , RID , ObjectID ) ;
FUNC1RC ( ObjectID , area_get_canvas_instance_id , RID ) ;
2017-03-05 16:44:50 +01:00
FUNC3 ( area_set_param , RID , AreaParameter , const Variant & ) ;
FUNC2 ( area_set_transform , RID , const Transform2D & ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC2RC ( Variant , area_get_param , RID , AreaParameter ) ;
FUNC1RC ( Transform2D , area_get_transform , RID ) ;
2015-05-26 06:05:08 +02:00
2017-06-13 17:45:01 +02:00
FUNC2 ( area_set_collision_layer , RID , uint32_t ) ;
2022-09-23 08:06:29 +02:00
FUNC1RC ( uint32_t , area_get_collision_layer , RID ) ;
FUNC2 ( area_set_collision_mask , RID , uint32_t ) ;
FUNC1RC ( uint32_t , area_get_collision_mask , RID ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC2 ( area_set_monitorable , RID , bool ) ;
FUNC2 ( area_set_pickable , RID , bool ) ;
2015-05-26 06:05:08 +02:00
2021-10-31 22:45:58 +01:00
FUNC2 ( area_set_monitor_callback , RID , const Callable & ) ;
FUNC2 ( area_set_area_monitor_callback , RID , const Callable & ) ;
2015-05-26 06:05:08 +02:00
/* BODY API */
//FUNC2RID(body,BodyMode,bool);
2017-11-10 03:34:01 +01:00
FUNCRID ( body )
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC2 ( body_set_space , RID , RID ) ;
FUNC1RC ( RID , body_get_space , RID ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC2 ( body_set_mode , RID , BodyMode ) ;
FUNC1RC ( BodyMode , body_get_mode , RID ) ;
2015-05-26 06:05:08 +02:00
2019-03-24 10:38:31 +01:00
FUNC4 ( body_add_shape , RID , RID , const Transform2D & , bool ) ;
2017-03-05 16:44:50 +01:00
FUNC3 ( body_set_shape , RID , int , RID ) ;
FUNC3 ( body_set_shape_transform , RID , int , const Transform2D & ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC1RC ( int , body_get_shape_count , RID ) ;
FUNC2RC ( Transform2D , body_get_shape_transform , RID , int ) ;
FUNC2RC ( RID , body_get_shape , RID , int ) ;
2015-05-26 06:05:08 +02:00
2017-06-24 04:30:43 +02:00
FUNC3 ( body_set_shape_disabled , RID , int , bool ) ;
2021-01-28 07:34:26 +01:00
FUNC4 ( body_set_shape_as_one_way_collision , RID , int , bool , real_t ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC2 ( body_remove_shape , RID , int ) ;
FUNC1 ( body_clear_shapes , RID ) ;
2015-05-26 06:05:08 +02:00
2020-02-12 18:24:06 +01:00
FUNC2 ( body_attach_object_instance_id , RID , ObjectID ) ;
FUNC1RC ( ObjectID , body_get_object_instance_id , RID ) ;
2015-05-26 06:05:08 +02:00
2020-02-12 18:24:06 +01:00
FUNC2 ( body_attach_canvas_instance_id , RID , ObjectID ) ;
FUNC1RC ( ObjectID , body_get_canvas_instance_id , RID ) ;
2018-08-25 00:03:26 +02:00
2017-03-05 16:44:50 +01:00
FUNC2 ( body_set_continuous_collision_detection_mode , RID , CCDMode ) ;
FUNC1RC ( CCDMode , body_get_continuous_collision_detection_mode , RID ) ;
2015-05-26 06:05:08 +02:00
2017-06-13 17:45:01 +02:00
FUNC2 ( body_set_collision_layer , RID , uint32_t ) ;
FUNC1RC ( uint32_t , body_get_collision_layer , RID ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC2 ( body_set_collision_mask , RID , uint32_t ) ;
FUNC1RC ( uint32_t , body_get_collision_mask , RID ) ;
2015-05-26 06:05:08 +02:00
2022-08-10 18:45:36 +02:00
FUNC2 ( body_set_collision_priority , RID , real_t ) ;
FUNC1RC ( real_t , body_get_collision_priority , RID ) ;
2021-06-11 02:37:19 +02:00
FUNC3 ( body_set_param , RID , BodyParameter , const Variant & ) ;
FUNC2RC ( Variant , body_get_param , RID , BodyParameter ) ;
FUNC1 ( body_reset_mass_properties , RID ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC3 ( body_set_state , RID , BodyState , const Variant & ) ;
FUNC2RC ( Variant , body_get_state , RID , BodyState ) ;
2015-05-26 06:05:08 +02:00
2018-07-24 09:49:12 +02:00
FUNC2 ( body_apply_central_impulse , RID , const Vector2 & ) ;
FUNC2 ( body_apply_torque_impulse , RID , real_t ) ;
2017-03-05 16:44:50 +01:00
FUNC3 ( body_apply_impulse , RID , const Vector2 & , const Vector2 & ) ;
2021-12-08 02:09:54 +01:00
FUNC2 ( body_apply_central_force , RID , const Vector2 & ) ;
FUNC3 ( body_apply_force , RID , const Vector2 & , const Vector2 & ) ;
FUNC2 ( body_apply_torque , RID , real_t ) ;
FUNC2 ( body_add_constant_central_force , RID , const Vector2 & ) ;
FUNC3 ( body_add_constant_force , RID , const Vector2 & , const Vector2 & ) ;
FUNC2 ( body_add_constant_torque , RID , real_t ) ;
FUNC2 ( body_set_constant_force , RID , const Vector2 & ) ;
FUNC1RC ( Vector2 , body_get_constant_force , RID ) ;
FUNC2 ( body_set_constant_torque , RID , real_t ) ;
FUNC1RC ( real_t , body_get_constant_torque , RID ) ;
2017-03-05 16:44:50 +01:00
FUNC2 ( body_set_axis_velocity , RID , const Vector2 & ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC2 ( body_add_collision_exception , RID , RID ) ;
FUNC2 ( body_remove_collision_exception , RID , RID ) ;
FUNC2S ( body_get_collision_exceptions , RID , List < RID > * ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC2 ( body_set_max_contacts_reported , RID , int ) ;
FUNC1RC ( int , body_get_max_contacts_reported , RID ) ;
2015-05-26 06:05:08 +02:00
2017-07-08 17:12:18 +02:00
FUNC2 ( body_set_contacts_reported_depth_threshold , RID , real_t ) ;
FUNC1RC ( real_t , body_get_contacts_reported_depth_threshold , RID ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC2 ( body_set_omit_force_integration , RID , bool ) ;
FUNC1RC ( bool , body_is_omitting_force_integration , RID ) ;
2015-05-26 06:05:08 +02:00
2022-09-15 14:15:39 +02:00
FUNC2 ( body_set_state_sync_callback , RID , const Callable & ) ;
2021-03-30 08:22:23 +02:00
FUNC3 ( body_set_force_integration_callback , RID , const Callable & , const Variant & ) ;
2015-05-26 06:05:08 +02:00
2021-02-09 17:19:03 +01:00
bool body_collide_shape ( RID p_body , int p_body_shape , RID p_shape , const Transform2D & p_shape_xform , const Vector2 & p_motion , Vector2 * r_results , int p_result_max , int & r_result_count ) override {
2022-04-27 05:52:53 +02:00
return physics_server_2d - > body_collide_shape ( p_body , p_body_shape , p_shape , p_shape_xform , p_motion , r_results , p_result_max , r_result_count ) ;
2015-05-26 06:05:08 +02:00
}
2017-03-05 16:44:50 +01:00
FUNC2 ( body_set_pickable , RID , bool ) ;
2015-05-26 06:05:08 +02:00
2021-09-30 20:28:57 +02:00
bool body_test_motion ( RID p_body , const MotionParameters & p_parameters , MotionResult * r_result = nullptr ) override {
2024-04-04 10:18:08 +02:00
ERR_FAIL_COND_V ( ! Thread : : is_main_thread ( ) , false ) ;
2022-04-27 05:52:53 +02:00
return physics_server_2d - > body_test_motion ( p_body , p_parameters , r_result ) ;
2015-05-26 06:05:08 +02:00
}
2017-09-29 17:33:30 +02:00
// this function only works on physics process, errors and returns null otherwise
2021-02-09 17:19:03 +01:00
PhysicsDirectBodyState2D * body_get_direct_state ( RID p_body ) override {
2024-04-04 10:18:08 +02:00
ERR_FAIL_COND_V ( ! Thread : : is_main_thread ( ) , nullptr ) ;
2022-04-27 05:52:53 +02:00
return physics_server_2d - > body_get_direct_state ( p_body ) ;
2017-09-29 17:33:30 +02:00
}
2015-05-26 06:05:08 +02:00
/* JOINT API */
2021-02-09 17:19:03 +01:00
FUNCRID ( joint )
FUNC1 ( joint_clear , RID )
2017-03-05 16:44:50 +01:00
FUNC3 ( joint_set_param , RID , JointParam , real_t ) ;
FUNC2RC ( real_t , joint_get_param , RID , JointParam ) ;
2015-05-26 06:05:08 +02:00
2018-02-05 18:20:26 +01:00
FUNC2 ( joint_disable_collisions_between_bodies , RID , const bool ) ;
FUNC1RC ( bool , joint_is_disabled_collisions_between_bodies , RID ) ;
2015-05-26 06:05:08 +02:00
///FUNC3RID(pin_joint,const Vector2&,RID,RID);
///FUNC5RID(groove_joint,const Vector2&,const Vector2&,const Vector2&,RID,RID);
///FUNC4RID(damped_spring_joint,const Vector2&,const Vector2&,RID,RID);
2017-11-10 03:34:01 +01:00
//TODO need to convert this to FUNCRID, but it's a hassle..
2021-02-09 17:19:03 +01:00
FUNC4 ( joint_make_pin , RID , const Vector2 & , RID , RID ) ;
FUNC6 ( joint_make_groove , RID , const Vector2 & , const Vector2 & , const Vector2 & , RID , RID ) ;
FUNC5 ( joint_make_damped_spring , RID , const Vector2 & , const Vector2 & , RID , RID ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC3 ( pin_joint_set_param , RID , PinJointParam , real_t ) ;
FUNC2RC ( real_t , pin_joint_get_param , RID , PinJointParam ) ;
2015-10-10 22:28:05 +02:00
2023-09-13 13:45:24 +02:00
FUNC3 ( pin_joint_set_flag , RID , PinJointFlag , bool ) ;
FUNC2RC ( bool , pin_joint_get_flag , RID , PinJointFlag ) ;
2020-06-04 18:53:29 +02:00
FUNC3 ( damped_spring_joint_set_param , RID , DampedSpringParam , real_t ) ;
FUNC2RC ( real_t , damped_spring_joint_get_param , RID , DampedSpringParam ) ;
2015-05-26 06:05:08 +02:00
2017-03-05 16:44:50 +01:00
FUNC1RC ( JointType , joint_get_type , RID ) ;
2015-05-26 06:05:08 +02:00
/* MISC */
2017-03-05 16:44:50 +01:00
FUNC1 ( free , RID ) ;
FUNC1 ( set_active , bool ) ;
2015-05-26 06:05:08 +02:00
2021-02-09 17:19:03 +01:00
virtual void init ( ) override ;
virtual void step ( real_t p_step ) override ;
virtual void sync ( ) override ;
virtual void end_sync ( ) override ;
virtual void flush_queries ( ) override ;
virtual void finish ( ) override ;
2015-05-26 06:05:08 +02:00
2021-02-09 17:19:03 +01:00
virtual bool is_flushing_queries ( ) const override {
2022-04-27 05:52:53 +02:00
return physics_server_2d - > is_flushing_queries ( ) ;
2018-11-16 12:49:26 +01:00
}
2021-02-09 17:19:03 +01:00
int get_process_info ( ProcessInfo p_info ) override {
2022-04-27 05:52:53 +02:00
return physics_server_2d - > get_process_info ( p_info ) ;
2015-05-26 06:05:08 +02:00
}
2020-03-27 19:21:27 +01:00
PhysicsServer2DWrapMT ( PhysicsServer2D * p_contained , bool p_create_thread ) ;
~ PhysicsServer2DWrapMT ( ) ;
2015-05-26 06:05:08 +02:00
# undef ServerNameWrapMT
# undef ServerName
# undef server_name
2021-02-09 17:19:03 +01:00
# undef WRITE_ACTION
2015-05-26 06:05:08 +02:00
} ;
# ifdef DEBUG_SYNC
# undef DEBUG_SYNC
# endif
# undef SYNC_DEBUG
2024-04-04 10:18:08 +02:00
# ifdef DEBUG_ENABLED
# undef MAIN_THREAD_SYNC_WARN
# endif
2021-10-18 21:24:30 +02:00
# endif // PHYSICS_SERVER_2D_WRAP_MT_H