Path: blob/master/servers/extensions/physics_server_2d_extension.h
10277 views
/**************************************************************************/1/* physics_server_2d_extension.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "core/extension/ext_wrappers.gen.inc"33#include "core/object/gdvirtual.gen.inc"34#include "core/variant/native_ptr.h"35#include "core/variant/typed_array.h"36#include "servers/physics_server_2d.h"3738class PhysicsDirectBodyState2DExtension : public PhysicsDirectBodyState2D {39GDCLASS(PhysicsDirectBodyState2DExtension, PhysicsDirectBodyState2D);4041protected:42static void _bind_methods();4344public:45// The warning is valid, but unavoidable. If the function is not overridden it will error anyway.4647EXBIND0RC(Vector2, get_total_gravity)48EXBIND0RC(real_t, get_total_angular_damp)49EXBIND0RC(real_t, get_total_linear_damp)5051EXBIND0RC(Vector2, get_center_of_mass)52EXBIND0RC(Vector2, get_center_of_mass_local)53EXBIND0RC(real_t, get_inverse_mass)54EXBIND0RC(real_t, get_inverse_inertia)5556EXBIND1(set_linear_velocity, const Vector2 &)57EXBIND0RC(Vector2, get_linear_velocity)5859EXBIND1(set_angular_velocity, real_t)60EXBIND0RC(real_t, get_angular_velocity)6162EXBIND1(set_transform, const Transform2D &)63EXBIND0RC(Transform2D, get_transform)6465EXBIND1RC(Vector2, get_velocity_at_local_position, const Vector2 &)6667EXBIND1(apply_central_impulse, const Vector2 &)68EXBIND1(apply_torque_impulse, real_t)69EXBIND2(apply_impulse, const Vector2 &, const Vector2 &)7071EXBIND1(apply_central_force, const Vector2 &)72EXBIND2(apply_force, const Vector2 &, const Vector2 &)73EXBIND1(apply_torque, real_t)7475EXBIND1(add_constant_central_force, const Vector2 &)76EXBIND2(add_constant_force, const Vector2 &, const Vector2 &)77EXBIND1(add_constant_torque, real_t)7879EXBIND1(set_constant_force, const Vector2 &)80EXBIND0RC(Vector2, get_constant_force)8182EXBIND1(set_constant_torque, real_t)83EXBIND0RC(real_t, get_constant_torque)8485EXBIND1(set_sleep_state, bool)86EXBIND0RC(bool, is_sleeping)8788EXBIND1(set_collision_layer, uint32_t);89EXBIND0RC(uint32_t, get_collision_layer);9091EXBIND1(set_collision_mask, uint32_t);92EXBIND0RC(uint32_t, get_collision_mask);9394EXBIND0RC(int, get_contact_count)9596EXBIND1RC(Vector2, get_contact_local_position, int)97EXBIND1RC(Vector2, get_contact_local_normal, int)98EXBIND1RC(Vector2, get_contact_local_velocity_at_position, int)99EXBIND1RC(int, get_contact_local_shape, int)100EXBIND1RC(RID, get_contact_collider, int)101EXBIND1RC(Vector2, get_contact_collider_position, int)102EXBIND1RC(ObjectID, get_contact_collider_id, int)103EXBIND1RC(Object *, get_contact_collider_object, int)104EXBIND1RC(int, get_contact_collider_shape, int)105EXBIND1RC(Vector2, get_contact_collider_velocity_at_position, int)106EXBIND1RC(Vector2, get_contact_impulse, int)107108EXBIND0RC(real_t, get_step)109EXBIND0(integrate_forces)110111EXBIND0R(PhysicsDirectSpaceState2D *, get_space_state)112113PhysicsDirectBodyState2DExtension();114};115116typedef PhysicsDirectSpaceState2D::RayResult PhysicsServer2DExtensionRayResult;117typedef PhysicsDirectSpaceState2D::ShapeResult PhysicsServer2DExtensionShapeResult;118typedef PhysicsDirectSpaceState2D::ShapeRestInfo PhysicsServer2DExtensionShapeRestInfo;119120GDVIRTUAL_NATIVE_PTR(PhysicsServer2DExtensionRayResult)121GDVIRTUAL_NATIVE_PTR(PhysicsServer2DExtensionShapeResult)122GDVIRTUAL_NATIVE_PTR(PhysicsServer2DExtensionShapeRestInfo)123124class PhysicsDirectSpaceState2DExtension : public PhysicsDirectSpaceState2D {125GDCLASS(PhysicsDirectSpaceState2DExtension, PhysicsDirectSpaceState2D);126127thread_local static const HashSet<RID> *exclude;128129protected:130static void _bind_methods();131bool is_body_excluded_from_query(const RID &p_body) const;132133GDVIRTUAL7R_REQUIRED(bool, _intersect_ray, const Vector2 &, const Vector2 &, uint32_t, bool, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionRayResult>)134GDVIRTUAL7R_REQUIRED(int, _intersect_point, const Vector2 &, ObjectID, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionShapeResult>, int)135GDVIRTUAL9R_REQUIRED(int, _intersect_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionShapeResult>, int)136GDVIRTUAL9R_REQUIRED(bool, _cast_motion, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<real_t>, GDExtensionPtr<real_t>)137GDVIRTUAL10R_REQUIRED(bool, _collide_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<Vector2>, int, GDExtensionPtr<int>)138GDVIRTUAL8R_REQUIRED(bool, _rest_info, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionShapeRestInfo>)139140public:141virtual bool intersect_ray(const RayParameters &p_parameters, RayResult &r_result) override {142exclude = &p_parameters.exclude;143bool ret = false;144GDVIRTUAL_CALL(_intersect_ray, p_parameters.from, p_parameters.to, p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas, p_parameters.hit_from_inside, &r_result, ret);145exclude = nullptr;146return ret;147}148virtual int intersect_point(const PointParameters &p_parameters, ShapeResult *r_results, int p_result_max) override {149exclude = &p_parameters.exclude;150int ret = false;151GDVIRTUAL_CALL(_intersect_point, p_parameters.position, p_parameters.canvas_instance_id, p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas, r_results, p_result_max, ret);152exclude = nullptr;153return ret;154}155virtual int intersect_shape(const ShapeParameters &p_parameters, ShapeResult *r_results, int p_result_max) override {156exclude = &p_parameters.exclude;157int ret = 0;158GDVIRTUAL_CALL(_intersect_shape, p_parameters.shape_rid, p_parameters.transform, p_parameters.motion, p_parameters.margin, p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas, r_results, p_result_max, ret);159exclude = nullptr;160return ret;161}162virtual bool cast_motion(const ShapeParameters &p_parameters, real_t &p_closest_safe, real_t &p_closest_unsafe) override {163exclude = &p_parameters.exclude;164bool ret = false;165GDVIRTUAL_CALL(_cast_motion, p_parameters.shape_rid, p_parameters.transform, p_parameters.motion, p_parameters.margin, p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas, &p_closest_safe, &p_closest_unsafe, ret);166exclude = nullptr;167return ret;168}169virtual bool collide_shape(const ShapeParameters &p_parameters, Vector2 *r_results, int p_result_max, int &r_result_count) override {170exclude = &p_parameters.exclude;171bool ret = false;172GDVIRTUAL_CALL(_collide_shape, p_parameters.shape_rid, p_parameters.transform, p_parameters.motion, p_parameters.margin, p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas, r_results, p_result_max, &r_result_count, ret);173exclude = nullptr;174return ret;175}176virtual bool rest_info(const ShapeParameters &p_parameters, ShapeRestInfo *r_info) override {177exclude = &p_parameters.exclude;178bool ret = false;179GDVIRTUAL_CALL(_rest_info, p_parameters.shape_rid, p_parameters.transform, p_parameters.motion, p_parameters.margin, p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas, r_info, ret);180exclude = nullptr;181return ret;182}183184PhysicsDirectSpaceState2DExtension();185};186187typedef PhysicsServer2D::MotionResult PhysicsServer2DExtensionMotionResult;188189GDVIRTUAL_NATIVE_PTR(PhysicsServer2DExtensionMotionResult)190191class PhysicsServer2DExtension : public PhysicsServer2D {192GDCLASS(PhysicsServer2DExtension, PhysicsServer2D);193194protected:195static void _bind_methods();196197GDVIRTUAL9R_REQUIRED(bool, _shape_collide, RID, const Transform2D &, const Vector2 &, RID, const Transform2D &, const Vector2 &, GDExtensionPtr<Vector2>, int, GDExtensionPtr<int>)198199GDVIRTUAL8R_REQUIRED(bool, _body_collide_shape, RID, int, RID, const Transform2D &, const Vector2 &, GDExtensionPtr<Vector2>, int, GDExtensionPtr<int>)200201public:202// The warning is valid, but unavoidable. If the function is not overridden it will error anyway.203204/* SHAPE API */205206EXBIND0R(RID, world_boundary_shape_create)207EXBIND0R(RID, separation_ray_shape_create)208EXBIND0R(RID, segment_shape_create)209EXBIND0R(RID, circle_shape_create)210EXBIND0R(RID, rectangle_shape_create)211EXBIND0R(RID, capsule_shape_create)212EXBIND0R(RID, convex_polygon_shape_create)213EXBIND0R(RID, concave_polygon_shape_create)214215EXBIND2(shape_set_data, RID, const Variant &)216EXBIND2(shape_set_custom_solver_bias, RID, real_t)217218EXBIND1RC(ShapeType, shape_get_type, RID)219EXBIND1RC(Variant, shape_get_data, RID)220EXBIND1RC(real_t, shape_get_custom_solver_bias, RID)221222virtual 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 {223bool ret = false;224GDVIRTUAL_CALL(_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, ret);225return ret;226}227228/* SPACE API */229230EXBIND0R(RID, space_create)231EXBIND2(space_set_active, RID, bool)232EXBIND1RC(bool, space_is_active, RID)233234EXBIND3(space_set_param, RID, SpaceParameter, real_t)235EXBIND2RC(real_t, space_get_param, RID, SpaceParameter)236237EXBIND1R(PhysicsDirectSpaceState2D *, space_get_direct_state, RID)238239EXBIND2(space_set_debug_contacts, RID, int)240EXBIND1RC(Vector<Vector2>, space_get_contacts, RID)241EXBIND1RC(int, space_get_contact_count, RID)242243/* AREA API */244245//EXBIND0RID(area);246EXBIND0R(RID, area_create)247248EXBIND2(area_set_space, RID, RID)249EXBIND1RC(RID, area_get_space, RID)250251EXBIND4(area_add_shape, RID, RID, const Transform2D &, bool)252EXBIND3(area_set_shape, RID, int, RID)253EXBIND3(area_set_shape_transform, RID, int, const Transform2D &)254EXBIND3(area_set_shape_disabled, RID, int, bool)255256EXBIND1RC(int, area_get_shape_count, RID)257EXBIND2RC(RID, area_get_shape, RID, int)258EXBIND2RC(Transform2D, area_get_shape_transform, RID, int)259260EXBIND2(area_remove_shape, RID, int)261EXBIND1(area_clear_shapes, RID)262263EXBIND2(area_attach_object_instance_id, RID, ObjectID)264EXBIND1RC(ObjectID, area_get_object_instance_id, RID)265266EXBIND2(area_attach_canvas_instance_id, RID, ObjectID)267EXBIND1RC(ObjectID, area_get_canvas_instance_id, RID)268269EXBIND3(area_set_param, RID, AreaParameter, const Variant &)270EXBIND2(area_set_transform, RID, const Transform2D &)271272EXBIND2RC(Variant, area_get_param, RID, AreaParameter)273EXBIND1RC(Transform2D, area_get_transform, RID)274275EXBIND2(area_set_collision_layer, RID, uint32_t)276EXBIND1RC(uint32_t, area_get_collision_layer, RID)277278EXBIND2(area_set_collision_mask, RID, uint32_t)279EXBIND1RC(uint32_t, area_get_collision_mask, RID)280281EXBIND2(area_set_monitorable, RID, bool)282EXBIND2(area_set_pickable, RID, bool)283284EXBIND2(area_set_monitor_callback, RID, const Callable &)285EXBIND2(area_set_area_monitor_callback, RID, const Callable &)286287/* BODY API */288289//EXBIND2RID(body,BodyMode,bool);290EXBIND0R(RID, body_create)291292EXBIND2(body_set_space, RID, RID)293EXBIND1RC(RID, body_get_space, RID)294295EXBIND2(body_set_mode, RID, BodyMode)296EXBIND1RC(BodyMode, body_get_mode, RID)297298EXBIND4(body_add_shape, RID, RID, const Transform2D &, bool)299EXBIND3(body_set_shape, RID, int, RID)300EXBIND3(body_set_shape_transform, RID, int, const Transform2D &)301302EXBIND1RC(int, body_get_shape_count, RID)303EXBIND2RC(RID, body_get_shape, RID, int)304EXBIND2RC(Transform2D, body_get_shape_transform, RID, int)305306EXBIND3(body_set_shape_disabled, RID, int, bool)307EXBIND4(body_set_shape_as_one_way_collision, RID, int, bool, real_t)308309EXBIND2(body_remove_shape, RID, int)310EXBIND1(body_clear_shapes, RID)311312EXBIND2(body_attach_object_instance_id, RID, ObjectID)313EXBIND1RC(ObjectID, body_get_object_instance_id, RID)314315EXBIND2(body_attach_canvas_instance_id, RID, ObjectID)316EXBIND1RC(ObjectID, body_get_canvas_instance_id, RID)317318EXBIND2(body_set_continuous_collision_detection_mode, RID, CCDMode)319EXBIND1RC(CCDMode, body_get_continuous_collision_detection_mode, RID)320321EXBIND2(body_set_collision_layer, RID, uint32_t)322EXBIND1RC(uint32_t, body_get_collision_layer, RID)323324EXBIND2(body_set_collision_mask, RID, uint32_t)325EXBIND1RC(uint32_t, body_get_collision_mask, RID)326327EXBIND2(body_set_collision_priority, RID, real_t)328EXBIND1RC(real_t, body_get_collision_priority, RID)329330EXBIND3(body_set_param, RID, BodyParameter, const Variant &)331EXBIND2RC(Variant, body_get_param, RID, BodyParameter)332333EXBIND1(body_reset_mass_properties, RID)334335EXBIND3(body_set_state, RID, BodyState, const Variant &)336EXBIND2RC(Variant, body_get_state, RID, BodyState)337338EXBIND2(body_apply_central_impulse, RID, const Vector2 &)339EXBIND2(body_apply_torque_impulse, RID, real_t)340EXBIND3(body_apply_impulse, RID, const Vector2 &, const Vector2 &)341342EXBIND2(body_apply_central_force, RID, const Vector2 &)343EXBIND3(body_apply_force, RID, const Vector2 &, const Vector2 &)344EXBIND2(body_apply_torque, RID, real_t)345346EXBIND2(body_add_constant_central_force, RID, const Vector2 &)347EXBIND3(body_add_constant_force, RID, const Vector2 &, const Vector2 &)348EXBIND2(body_add_constant_torque, RID, real_t)349350EXBIND2(body_set_constant_force, RID, const Vector2 &)351EXBIND1RC(Vector2, body_get_constant_force, RID)352353EXBIND2(body_set_constant_torque, RID, real_t)354EXBIND1RC(real_t, body_get_constant_torque, RID)355356EXBIND2(body_set_axis_velocity, RID, const Vector2 &)357358EXBIND2(body_add_collision_exception, RID, RID)359EXBIND2(body_remove_collision_exception, RID, RID)360GDVIRTUAL1RC_REQUIRED(TypedArray<RID>, _body_get_collision_exceptions, RID)361362void body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions) override {363TypedArray<RID> ret;364GDVIRTUAL_CALL(_body_get_collision_exceptions, p_body, ret);365for (int i = 0; i < ret.size(); i++) {366p_exceptions->push_back(ret[i]);367}368}369370EXBIND2(body_set_max_contacts_reported, RID, int)371EXBIND1RC(int, body_get_max_contacts_reported, RID)372373EXBIND2(body_set_contacts_reported_depth_threshold, RID, real_t)374EXBIND1RC(real_t, body_get_contacts_reported_depth_threshold, RID)375376EXBIND2(body_set_omit_force_integration, RID, bool)377EXBIND1RC(bool, body_is_omitting_force_integration, RID)378379EXBIND2(body_set_state_sync_callback, RID, const Callable &)380EXBIND3(body_set_force_integration_callback, RID, const Callable &, const Variant &)381382virtual 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 {383bool ret = false;384GDVIRTUAL_CALL(_body_collide_shape, p_body, p_body_shape, p_shape, p_shape_xform, p_motion, r_results, p_result_max, &r_result_count, ret);385return ret;386}387388EXBIND2(body_set_pickable, RID, bool)389390EXBIND1R(PhysicsDirectBodyState2D *, body_get_direct_state, RID)391392GDVIRTUAL7RC_REQUIRED(bool, _body_test_motion, RID, const Transform2D &, const Vector2 &, real_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionMotionResult>)393394thread_local static const HashSet<RID> *exclude_bodies;395thread_local static const HashSet<ObjectID> *exclude_objects;396397bool body_test_motion_is_excluding_body(RID p_body) const;398bool body_test_motion_is_excluding_object(ObjectID p_object) const;399400bool body_test_motion(RID p_body, const MotionParameters &p_parameters, MotionResult *r_result = nullptr) override {401bool ret = false;402exclude_bodies = &p_parameters.exclude_bodies;403exclude_objects = &p_parameters.exclude_objects;404GDVIRTUAL_CALL(_body_test_motion, p_body, p_parameters.from, p_parameters.motion, p_parameters.margin, p_parameters.collide_separation_ray, p_parameters.recovery_as_collision, r_result, ret);405exclude_bodies = nullptr;406exclude_objects = nullptr;407return ret;408}409410/* JOINT API */411412EXBIND0R(RID, joint_create)413EXBIND1(joint_clear, RID)414415EXBIND3(joint_set_param, RID, JointParam, real_t)416EXBIND2RC(real_t, joint_get_param, RID, JointParam)417418EXBIND2(joint_disable_collisions_between_bodies, RID, bool)419EXBIND1RC(bool, joint_is_disabled_collisions_between_bodies, RID)420421EXBIND4(joint_make_pin, RID, const Vector2 &, RID, RID)422EXBIND6(joint_make_groove, RID, const Vector2 &, const Vector2 &, const Vector2 &, RID, RID)423EXBIND5(joint_make_damped_spring, RID, const Vector2 &, const Vector2 &, RID, RID)424425EXBIND3(pin_joint_set_flag, RID, PinJointFlag, bool)426EXBIND2RC(bool, pin_joint_get_flag, RID, PinJointFlag)427428EXBIND3(pin_joint_set_param, RID, PinJointParam, real_t)429EXBIND2RC(real_t, pin_joint_get_param, RID, PinJointParam)430431EXBIND3(damped_spring_joint_set_param, RID, DampedSpringParam, real_t)432EXBIND2RC(real_t, damped_spring_joint_get_param, RID, DampedSpringParam)433434EXBIND1RC(JointType, joint_get_type, RID)435436/* MISC */437438GDVIRTUAL1_REQUIRED(_free_rid, RID)439virtual void free(RID p_rid) override {440GDVIRTUAL_CALL(_free_rid, p_rid);441}442443EXBIND1(set_active, bool)444445EXBIND0(init)446EXBIND1(step, real_t)447EXBIND0(sync)448EXBIND0(flush_queries)449EXBIND0(end_sync)450EXBIND0(finish)451452EXBIND0RC(bool, is_flushing_queries)453EXBIND1R(int, get_process_info, ProcessInfo)454455PhysicsServer2DExtension();456~PhysicsServer2DExtension();457};458459460