diff options
Diffstat (limited to 'servers/physics_server.h')
-rw-r--r-- | servers/physics_server.h | 264 |
1 files changed, 254 insertions, 10 deletions
diff --git a/servers/physics_server.h b/servers/physics_server.h index 955caffe5b..25a89775a8 100644 --- a/servers/physics_server.h +++ b/servers/physics_server.h @@ -30,7 +30,7 @@ #define PHYSICS_SERVER_H #include "object.h" -#include "reference.h" +#include "resource.h" class PhysicsDirectSpaceState; @@ -87,13 +87,70 @@ public: class PhysicsShapeQueryResult; +class PhysicsShapeQueryParameters : public Reference { + + OBJ_TYPE(PhysicsShapeQueryParameters, Reference); +friend class PhysicsDirectSpaceState; + RID shape; + Transform transform; + float margin; + Set<RID> exclude; + uint32_t layer_mask; + uint32_t object_type_mask; +protected: + static void _bind_methods(); +public: + + + void set_shape(const RES& p_shape); + void set_shape_rid(const RID& p_shape); + RID get_shape_rid() const; + + void set_transform(const Transform& p_transform); + Transform get_transform() const; + + void set_margin(float p_margin); + float get_margin() const; + + void set_layer_mask(int p_layer_mask); + int get_layer_mask() const; + + void set_object_type_mask(int p_object_type_mask); + int get_object_type_mask() const; + + void set_exclude(const Vector<RID>& p_exclude); + Vector<RID> get_exclude() const; + + PhysicsShapeQueryParameters(); + +}; + + class PhysicsDirectSpaceState : public Object { OBJ_TYPE( PhysicsDirectSpaceState, Object ); - Variant _intersect_ray(const Vector3& p_from, const Vector3& p_to,const Vector<RID>& p_exclude=Vector<RID>(),uint32_t p_user_mask=0); - Variant _intersect_shape(const RID& p_shape, const Transform& p_xform,int p_result_max=64,const Vector<RID>& p_exclude=Vector<RID>(),uint32_t p_user_mask=0); +// Variant _intersect_ray(const Vector3& p_from, const Vector3& p_to,const Vector<RID>& p_exclude=Vector<RID>(),uint32_t p_user_mask=0); +// Variant _intersect_shape(const RID& p_shape, const Transform& p_xform,int p_result_max=64,const Vector<RID>& p_exclude=Vector<RID>(),uint32_t p_user_mask=0); +public: + + enum ObjectTypeMask { + TYPE_MASK_STATIC_BODY=1<<0, + TYPE_MASK_KINEMATIC_BODY=1<<1, + TYPE_MASK_RIGID_BODY=1<<2, + TYPE_MASK_CHARACTER_BODY=1<<3, + TYPE_MASK_AREA=1<<4, + TYPE_MASK_COLLISION=TYPE_MASK_STATIC_BODY|TYPE_MASK_CHARACTER_BODY|TYPE_MASK_KINEMATIC_BODY|TYPE_MASK_RIGID_BODY + }; + + +private: + Dictionary _intersect_ray(const Vector3& p_from, const Vector3& p_to,const Vector<RID>& p_exclude=Vector<RID>(),uint32_t p_layers=0,uint32_t p_object_type_mask=TYPE_MASK_COLLISION); + Array _intersect_shape(const Ref<PhysicsShapeQueryParameters> &p_shape_query,int p_max_results=32); + Array _cast_motion(const Ref<PhysicsShapeQueryParameters> &p_shape_query,const Vector3& p_motion); + Array _collide_shape(const Ref<PhysicsShapeQueryParameters> &p_shape_query,int p_max_results=32); + Dictionary _get_rest_info(const Ref<PhysicsShapeQueryParameters> &p_shape_query); protected: @@ -101,6 +158,7 @@ protected: public: + struct RayResult { Vector3 position; @@ -111,7 +169,7 @@ public: int shape; }; - virtual bool intersect_ray(const Vector3& p_from, const Vector3& p_to,RayResult &r_result,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_user_mask=0)=0; + virtual bool intersect_ray(const Vector3& p_from, const Vector3& p_to,RayResult &r_result,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0; struct ShapeResult { @@ -122,7 +180,25 @@ public: }; - virtual int intersect_shape(const RID& p_shape, const Transform& p_xform,ShapeResult *r_results,int p_result_max,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_user_mask=0)=0; + virtual int intersect_shape(const RID& p_shape, const Transform& p_xform,float p_margin,ShapeResult *r_results,int p_result_max,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0; + + struct ShapeRestInfo { + + Vector3 point; + Vector3 normal; + RID rid; + ObjectID collider_id; + int shape; + Vector3 linear_velocity; //velocity at contact point + + }; + + virtual bool cast_motion(const RID& p_shape, const Transform& p_xform,const Vector3& p_motion,float p_margin,float &p_closest_safe,float &p_closest_unsafe, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION,ShapeRestInfo *r_info=NULL)=0; + + virtual bool collide_shape(RID p_shape, const Transform& p_shape_xform,float p_margin,Vector3 *r_results,int p_result_max,int &r_result_count, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0; + + virtual bool rest_info(RID p_shape, const Transform& p_shape_xform,float p_margin,ShapeRestInfo *r_info, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0; + PhysicsDirectSpaceState(); }; @@ -156,6 +232,7 @@ class PhysicsServer : public Object { static PhysicsServer * singleton; + protected: static void _bind_methods(); @@ -263,6 +340,9 @@ public: virtual void area_set_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method)=0; + virtual void area_set_ray_pickable(RID p_area,bool p_enable)=0; + virtual bool area_is_ray_pickable(RID p_area) const=0; + /* BODY API */ //missing ccd? @@ -303,6 +383,9 @@ public: virtual void body_set_enable_continuous_collision_detection(RID p_body,bool p_enable)=0; virtual bool body_is_continuous_collision_detection_enabled(RID p_body) const=0; + virtual void body_set_layer_mask(RID p_body, uint32_t p_mask)=0; + virtual uint32_t body_get_layer_mask(RID p_body, uint32_t p_mask) const=0; + virtual void body_set_user_flags(RID p_body, uint32_t p_flags)=0; virtual uint32_t body_get_user_flags(RID p_body, uint32_t p_flags) const=0; @@ -317,8 +400,6 @@ public: virtual void body_set_param(RID p_body, BodyParameter p_param, float p_value)=0; virtual float body_get_param(RID p_body, BodyParameter p_param) const=0; - //advanced simulation - virtual void body_static_simulate_motion(RID p_body,const Transform& p_new_transform)=0; //state enum BodyState { @@ -370,6 +451,154 @@ public: virtual void body_set_force_integration_callback(RID p_body,Object *p_receiver,const StringName& p_method,const Variant& p_udata=Variant())=0; /* JOINT API */ + + enum JointType { + + JOINT_PIN, + JOINT_HINGE, + JOINT_SLIDER, + JOINT_CONE_TWIST, + JOINT_6DOF + + }; + + virtual JointType joint_get_type(RID p_joint) const=0; + + + + virtual RID joint_create_pin(RID p_body_A,const Vector3& p_local_A,RID p_body_B,const Vector3& p_local_B)=0; + + enum PinJointParam { + PIN_JOINT_BIAS, + PIN_JOINT_DAMPING, + PIN_JOINT_IMPULSE_CLAMP + }; + + virtual void pin_joint_set_param(RID p_joint,PinJointParam p_param, float p_value)=0; + virtual float pin_joint_get_param(RID p_joint,PinJointParam p_param) const=0; + + virtual void pin_joint_set_local_A(RID p_joint, const Vector3& p_A)=0; + virtual Vector3 pin_joint_get_local_A(RID p_joint) const=0; + + virtual void pin_joint_set_local_B(RID p_joint, const Vector3& p_B)=0; + virtual Vector3 pin_joint_get_local_B(RID p_joint) const=0; + + enum HingeJointParam { + + HINGE_JOINT_BIAS, + HINGE_JOINT_LIMIT_UPPER, + HINGE_JOINT_LIMIT_LOWER, + HINGE_JOINT_LIMIT_BIAS, + HINGE_JOINT_LIMIT_SOFTNESS, + HINGE_JOINT_LIMIT_RELAXATION, + HINGE_JOINT_MOTOR_TARGET_VELOCITY, + HINGE_JOINT_MOTOR_MAX_IMPULSE, + HINGE_JOINT_MAX + }; + + enum HingeJointFlag { + HINGE_JOINT_FLAG_USE_LIMIT, + HINGE_JOINT_FLAG_ENABLE_MOTOR, + HINGE_JOINT_FLAG_MAX + }; + + virtual RID joint_create_hinge(RID p_body_A,const Transform& p_hinge_A,RID p_body_B,const Transform& p_hinge_B)=0; + virtual RID joint_create_hinge_simple(RID p_body_A,const Vector3& p_pivot_A,const Vector3& p_axis_A,RID p_body_B,const Vector3& p_pivot_B,const Vector3& p_axis_B)=0; + + + virtual void hinge_joint_set_param(RID p_joint,HingeJointParam p_param, float p_value)=0; + virtual float hinge_joint_get_param(RID p_joint,HingeJointParam p_param) const=0; + + virtual void hinge_joint_set_flag(RID p_joint,HingeJointFlag p_flag, bool p_value)=0; + virtual bool hinge_joint_get_flag(RID p_joint,HingeJointFlag p_flag) const=0; + + enum SliderJointParam { + SLIDER_JOINT_LINEAR_LIMIT_UPPER, + SLIDER_JOINT_LINEAR_LIMIT_LOWER, + SLIDER_JOINT_LINEAR_LIMIT_SOFTNESS, + SLIDER_JOINT_LINEAR_LIMIT_RESTITUTION, + SLIDER_JOINT_LINEAR_LIMIT_DAMPING, + SLIDER_JOINT_LINEAR_MOTION_SOFTNESS, + SLIDER_JOINT_LINEAR_MOTION_RESTITUTION, + SLIDER_JOINT_LINEAR_MOTION_DAMPING, + SLIDER_JOINT_LINEAR_ORTHOGONAL_SOFTNESS, + SLIDER_JOINT_LINEAR_ORTHOGONAL_RESTITUTION, + SLIDER_JOINT_LINEAR_ORTHOGONAL_DAMPING, + + SLIDER_JOINT_ANGULAR_LIMIT_UPPER, + SLIDER_JOINT_ANGULAR_LIMIT_LOWER, + SLIDER_JOINT_ANGULAR_LIMIT_SOFTNESS, + SLIDER_JOINT_ANGULAR_LIMIT_RESTITUTION, + SLIDER_JOINT_ANGULAR_LIMIT_DAMPING, + SLIDER_JOINT_ANGULAR_MOTION_SOFTNESS, + SLIDER_JOINT_ANGULAR_MOTION_RESTITUTION, + SLIDER_JOINT_ANGULAR_MOTION_DAMPING, + SLIDER_JOINT_ANGULAR_ORTHOGONAL_SOFTNESS, + SLIDER_JOINT_ANGULAR_ORTHOGONAL_RESTITUTION, + SLIDER_JOINT_ANGULAR_ORTHOGONAL_DAMPING, + SLIDER_JOINT_MAX + + + }; + + virtual RID joint_create_slider(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B)=0; //reference frame is A + + virtual void slider_joint_set_param(RID p_joint,SliderJointParam p_param, float p_value)=0; + virtual float slider_joint_get_param(RID p_joint,SliderJointParam p_param) const=0; + + enum ConeTwistJointParam { + CONE_TWIST_JOINT_SWING_SPAN, + CONE_TWIST_JOINT_TWIST_SPAN, + CONE_TWIST_JOINT_BIAS, + CONE_TWIST_JOINT_SOFTNESS, + CONE_TWIST_JOINT_RELAXATION, + CONE_TWIST_MAX + }; + + + virtual RID joint_create_cone_twist(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B)=0; //reference frame is A + + virtual void cone_twist_joint_set_param(RID p_joint,ConeTwistJointParam p_param, float p_value)=0; + virtual float cone_twist_joint_get_param(RID p_joint,ConeTwistJointParam p_param) const=0; + + + enum G6DOFJointAxisParam { + G6DOF_JOINT_LINEAR_LOWER_LIMIT, + G6DOF_JOINT_LINEAR_UPPER_LIMIT, + G6DOF_JOINT_LINEAR_LIMIT_SOFTNESS, + G6DOF_JOINT_LINEAR_RESTITUTION, + G6DOF_JOINT_LINEAR_DAMPING, + G6DOF_JOINT_ANGULAR_LOWER_LIMIT, + G6DOF_JOINT_ANGULAR_UPPER_LIMIT, + G6DOF_JOINT_ANGULAR_LIMIT_SOFTNESS, + G6DOF_JOINT_ANGULAR_DAMPING, + G6DOF_JOINT_ANGULAR_RESTITUTION, + G6DOF_JOINT_ANGULAR_FORCE_LIMIT, + G6DOF_JOINT_ANGULAR_ERP, + G6DOF_JOINT_ANGULAR_MOTOR_TARGET_VELOCITY, + G6DOF_JOINT_ANGULAR_MOTOR_FORCE_LIMIT, + G6DOF_JOINT_MAX + }; + + enum G6DOFJointAxisFlag { + + G6DOF_JOINT_FLAG_ENABLE_LINEAR_LIMIT, + G6DOF_JOINT_FLAG_ENABLE_ANGULAR_LIMIT, + G6DOF_JOINT_FLAG_ENABLE_MOTOR, + G6DOF_JOINT_FLAG_MAX + }; + + + + virtual RID joint_create_generic_6dof(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B)=0; //reference frame is A + + virtual void generic_6dof_joint_set_param(RID p_joint,Vector3::Axis,G6DOFJointAxisParam p_param, float p_value)=0; + virtual float generic_6dof_joint_get_param(RID p_joint,Vector3::Axis,G6DOFJointAxisParam p_param)=0; + + virtual void generic_6dof_joint_set_flag(RID p_joint,Vector3::Axis,G6DOFJointAxisFlag p_flag, bool p_enable)=0; + virtual bool generic_6dof_joint_get_flag(RID p_joint,Vector3::Axis,G6DOFJointAxisFlag p_flag)=0; + + #if 0 enum JointType { @@ -420,6 +649,15 @@ public: virtual void flush_queries()=0; virtual void finish()=0; + enum ProcessInfo { + + INFO_ACTIVE_OBJECTS, + INFO_COLLISION_PAIRS, + INFO_ISLAND_COUNT + }; + + virtual int get_process_info(ProcessInfo p_info)=0; + PhysicsServer(); ~PhysicsServer(); }; @@ -432,10 +670,16 @@ VARIANT_ENUM_CAST( PhysicsServer::BodyMode ); VARIANT_ENUM_CAST( PhysicsServer::BodyParameter ); VARIANT_ENUM_CAST( PhysicsServer::BodyState ); VARIANT_ENUM_CAST( PhysicsServer::BodyAxisLock ); -//VARIANT_ENUM_CAST( PhysicsServer::JointParam ); -//VARIANT_ENUM_CAST( PhysicsServer::JointType ); -//VARIANT_ENUM_CAST( PhysicsServer::DampedStringParam ); +VARIANT_ENUM_CAST( PhysicsServer::PinJointParam ); +VARIANT_ENUM_CAST( PhysicsServer::JointType ); +VARIANT_ENUM_CAST( PhysicsServer::HingeJointParam ); +VARIANT_ENUM_CAST( PhysicsServer::HingeJointFlag ); +VARIANT_ENUM_CAST( PhysicsServer::SliderJointParam ); +VARIANT_ENUM_CAST( PhysicsServer::ConeTwistJointParam ); +VARIANT_ENUM_CAST( PhysicsServer::G6DOFJointAxisParam ); +VARIANT_ENUM_CAST( PhysicsServer::G6DOFJointAxisFlag); //VARIANT_ENUM_CAST( PhysicsServer::ObjectType ); VARIANT_ENUM_CAST( PhysicsServer::AreaBodyStatus ); +VARIANT_ENUM_CAST( PhysicsServer::ProcessInfo ); #endif |