Path: blob/master/servers/physics_2d/physics_server_2d_extension.h
21446 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.h"33#include "core/object/gdvirtual.gen.h"34#include "core/variant/native_ptr.h"35#include "core/variant/typed_array.h"36#include "servers/physics_2d/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(RequiredResult<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>)200201#ifndef DISABLE_DEPRECATED202GDVIRTUAL4_COMPAT(_body_set_shape_as_one_way_collision_bind_compat_104736, _body_set_shape_as_one_way_collision, RID, int, bool, real_t)203#endif204205public:206// The warning is valid, but unavoidable. If the function is not overridden it will error anyway.207208/* SHAPE API */209210EXBIND0R(RID, world_boundary_shape_create)211EXBIND0R(RID, separation_ray_shape_create)212EXBIND0R(RID, segment_shape_create)213EXBIND0R(RID, circle_shape_create)214EXBIND0R(RID, rectangle_shape_create)215EXBIND0R(RID, capsule_shape_create)216EXBIND0R(RID, convex_polygon_shape_create)217EXBIND0R(RID, concave_polygon_shape_create)218219EXBIND2(shape_set_data, RID, const Variant &)220EXBIND2(shape_set_custom_solver_bias, RID, real_t)221222EXBIND1RC(ShapeType, shape_get_type, RID)223EXBIND1RC(Variant, shape_get_data, RID)224EXBIND1RC(real_t, shape_get_custom_solver_bias, RID)225226virtual 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 {227bool ret = false;228GDVIRTUAL_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);229return ret;230}231232/* SPACE API */233234EXBIND0R(RID, space_create)235EXBIND2(space_set_active, RID, bool)236EXBIND1RC(bool, space_is_active, RID)237238EXBIND3(space_set_param, RID, SpaceParameter, real_t)239EXBIND2RC(real_t, space_get_param, RID, SpaceParameter)240241EXBIND1R(PhysicsDirectSpaceState2D *, space_get_direct_state, RID)242243EXBIND2(space_set_debug_contacts, RID, int)244EXBIND1RC(Vector<Vector2>, space_get_contacts, RID)245EXBIND1RC(int, space_get_contact_count, RID)246247/* AREA API */248249//EXBIND0RID(area);250EXBIND0R(RID, area_create)251252EXBIND2(area_set_space, RID, RID)253EXBIND1RC(RID, area_get_space, RID)254255EXBIND4(area_add_shape, RID, RID, const Transform2D &, bool)256EXBIND3(area_set_shape, RID, int, RID)257EXBIND3(area_set_shape_transform, RID, int, const Transform2D &)258EXBIND3(area_set_shape_disabled, RID, int, bool)259260EXBIND1RC(int, area_get_shape_count, RID)261EXBIND2RC(RID, area_get_shape, RID, int)262EXBIND2RC(Transform2D, area_get_shape_transform, RID, int)263264EXBIND2(area_remove_shape, RID, int)265EXBIND1(area_clear_shapes, RID)266267EXBIND2(area_attach_object_instance_id, RID, ObjectID)268EXBIND1RC(ObjectID, area_get_object_instance_id, RID)269270EXBIND2(area_attach_canvas_instance_id, RID, ObjectID)271EXBIND1RC(ObjectID, area_get_canvas_instance_id, RID)272273EXBIND3(area_set_param, RID, AreaParameter, const Variant &)274EXBIND2(area_set_transform, RID, const Transform2D &)275276EXBIND2RC(Variant, area_get_param, RID, AreaParameter)277EXBIND1RC(Transform2D, area_get_transform, RID)278279EXBIND2(area_set_collision_layer, RID, uint32_t)280EXBIND1RC(uint32_t, area_get_collision_layer, RID)281282EXBIND2(area_set_collision_mask, RID, uint32_t)283EXBIND1RC(uint32_t, area_get_collision_mask, RID)284285EXBIND2(area_set_monitorable, RID, bool)286EXBIND2(area_set_pickable, RID, bool)287288EXBIND2(area_set_monitor_callback, RID, const Callable &)289EXBIND2(area_set_area_monitor_callback, RID, const Callable &)290291/* BODY API */292293//EXBIND2RID(body,BodyMode,bool);294EXBIND0R(RID, body_create)295296EXBIND2(body_set_space, RID, RID)297EXBIND1RC(RID, body_get_space, RID)298299EXBIND2(body_set_mode, RID, BodyMode)300EXBIND1RC(BodyMode, body_get_mode, RID)301302EXBIND4(body_add_shape, RID, RID, const Transform2D &, bool)303EXBIND3(body_set_shape, RID, int, RID)304EXBIND3(body_set_shape_transform, RID, int, const Transform2D &)305306EXBIND1RC(int, body_get_shape_count, RID)307EXBIND2RC(RID, body_get_shape, RID, int)308EXBIND2RC(Transform2D, body_get_shape_transform, RID, int)309310EXBIND3(body_set_shape_disabled, RID, int, bool)311EXBIND5(body_set_shape_as_one_way_collision, RID, int, bool, real_t, const Vector2 &)312313EXBIND2(body_remove_shape, RID, int)314EXBIND1(body_clear_shapes, RID)315316EXBIND2(body_attach_object_instance_id, RID, ObjectID)317EXBIND1RC(ObjectID, body_get_object_instance_id, RID)318319EXBIND2(body_attach_canvas_instance_id, RID, ObjectID)320EXBIND1RC(ObjectID, body_get_canvas_instance_id, RID)321322EXBIND2(body_set_continuous_collision_detection_mode, RID, CCDMode)323EXBIND1RC(CCDMode, body_get_continuous_collision_detection_mode, RID)324325EXBIND2(body_set_collision_layer, RID, uint32_t)326EXBIND1RC(uint32_t, body_get_collision_layer, RID)327328EXBIND2(body_set_collision_mask, RID, uint32_t)329EXBIND1RC(uint32_t, body_get_collision_mask, RID)330331EXBIND2(body_set_collision_priority, RID, real_t)332EXBIND1RC(real_t, body_get_collision_priority, RID)333334EXBIND3(body_set_param, RID, BodyParameter, const Variant &)335EXBIND2RC(Variant, body_get_param, RID, BodyParameter)336337EXBIND1(body_reset_mass_properties, RID)338339EXBIND3(body_set_state, RID, BodyState, const Variant &)340EXBIND2RC(Variant, body_get_state, RID, BodyState)341342EXBIND2(body_apply_central_impulse, RID, const Vector2 &)343EXBIND2(body_apply_torque_impulse, RID, real_t)344EXBIND3(body_apply_impulse, RID, const Vector2 &, const Vector2 &)345346EXBIND2(body_apply_central_force, RID, const Vector2 &)347EXBIND3(body_apply_force, RID, const Vector2 &, const Vector2 &)348EXBIND2(body_apply_torque, RID, real_t)349350EXBIND2(body_add_constant_central_force, RID, const Vector2 &)351EXBIND3(body_add_constant_force, RID, const Vector2 &, const Vector2 &)352EXBIND2(body_add_constant_torque, RID, real_t)353354EXBIND2(body_set_constant_force, RID, const Vector2 &)355EXBIND1RC(Vector2, body_get_constant_force, RID)356357EXBIND2(body_set_constant_torque, RID, real_t)358EXBIND1RC(real_t, body_get_constant_torque, RID)359360EXBIND2(body_set_axis_velocity, RID, const Vector2 &)361362EXBIND2(body_add_collision_exception, RID, RID)363EXBIND2(body_remove_collision_exception, RID, RID)364GDVIRTUAL1RC_REQUIRED(TypedArray<RID>, _body_get_collision_exceptions, RID)365366void body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions) override {367TypedArray<RID> ret;368GDVIRTUAL_CALL(_body_get_collision_exceptions, p_body, ret);369for (int i = 0; i < ret.size(); i++) {370p_exceptions->push_back(ret[i]);371}372}373374EXBIND2(body_set_max_contacts_reported, RID, int)375EXBIND1RC(int, body_get_max_contacts_reported, RID)376377EXBIND2(body_set_contacts_reported_depth_threshold, RID, real_t)378EXBIND1RC(real_t, body_get_contacts_reported_depth_threshold, RID)379380EXBIND2(body_set_omit_force_integration, RID, bool)381EXBIND1RC(bool, body_is_omitting_force_integration, RID)382383EXBIND2(body_set_state_sync_callback, RID, const Callable &)384EXBIND3(body_set_force_integration_callback, RID, const Callable &, const Variant &)385386virtual 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 {387bool ret = false;388GDVIRTUAL_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);389return ret;390}391392EXBIND2(body_set_pickable, RID, bool)393394EXBIND1R(PhysicsDirectBodyState2D *, body_get_direct_state, RID)395396GDVIRTUAL7RC_REQUIRED(bool, _body_test_motion, RID, const Transform2D &, const Vector2 &, real_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionMotionResult>)397398thread_local static const HashSet<RID> *exclude_bodies;399thread_local static const HashSet<ObjectID> *exclude_objects;400401bool body_test_motion_is_excluding_body(RID p_body) const;402bool body_test_motion_is_excluding_object(ObjectID p_object) const;403404bool body_test_motion(RID p_body, const MotionParameters &p_parameters, MotionResult *r_result = nullptr) override {405bool ret = false;406exclude_bodies = &p_parameters.exclude_bodies;407exclude_objects = &p_parameters.exclude_objects;408GDVIRTUAL_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);409exclude_bodies = nullptr;410exclude_objects = nullptr;411return ret;412}413414/* JOINT API */415416EXBIND0R(RID, joint_create)417EXBIND1(joint_clear, RID)418419EXBIND3(joint_set_param, RID, JointParam, real_t)420EXBIND2RC(real_t, joint_get_param, RID, JointParam)421422EXBIND2(joint_disable_collisions_between_bodies, RID, bool)423EXBIND1RC(bool, joint_is_disabled_collisions_between_bodies, RID)424425EXBIND4(joint_make_pin, RID, const Vector2 &, RID, RID)426EXBIND6(joint_make_groove, RID, const Vector2 &, const Vector2 &, const Vector2 &, RID, RID)427EXBIND5(joint_make_damped_spring, RID, const Vector2 &, const Vector2 &, RID, RID)428429EXBIND3(pin_joint_set_flag, RID, PinJointFlag, bool)430EXBIND2RC(bool, pin_joint_get_flag, RID, PinJointFlag)431432EXBIND3(pin_joint_set_param, RID, PinJointParam, real_t)433EXBIND2RC(real_t, pin_joint_get_param, RID, PinJointParam)434435EXBIND3(damped_spring_joint_set_param, RID, DampedSpringParam, real_t)436EXBIND2RC(real_t, damped_spring_joint_get_param, RID, DampedSpringParam)437438EXBIND1RC(JointType, joint_get_type, RID)439440/* MISC */441442GDVIRTUAL1_REQUIRED(_free_rid, RID)443virtual void free_rid(RID p_rid) override {444GDVIRTUAL_CALL(_free_rid, p_rid);445}446447EXBIND1(set_active, bool)448449EXBIND0(init)450EXBIND1(step, real_t)451EXBIND0(sync)452EXBIND0(flush_queries)453EXBIND0(end_sync)454EXBIND0(finish)455456EXBIND0RC(bool, is_flushing_queries)457EXBIND1R(int, get_process_info, ProcessInfo)458459PhysicsServer2DExtension();460~PhysicsServer2DExtension();461};462463464