summaryrefslogtreecommitdiff
path: root/servers/physics_server.h
diff options
context:
space:
mode:
Diffstat (limited to 'servers/physics_server.h')
-rw-r--r--servers/physics_server.h264
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