Merge pull request #13159 from AndreaCatania/ray
Removed type_mask and fixed some variable name
This commit is contained in:
commit
2ea5ac17e8
17 changed files with 123 additions and 247 deletions
|
@ -53,7 +53,7 @@
|
|||
BulletPhysicsDirectSpaceState::BulletPhysicsDirectSpaceState(SpaceBullet *p_space)
|
||||
: PhysicsDirectSpaceState(), space(p_space) {}
|
||||
|
||||
int BulletPhysicsDirectSpaceState::intersect_point(const Vector3 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_layer, uint32_t p_object_type_mask) {
|
||||
int BulletPhysicsDirectSpaceState::intersect_point(const Vector3 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
|
||||
if (p_result_max <= 0)
|
||||
return 0;
|
||||
|
@ -68,15 +68,15 @@ int BulletPhysicsDirectSpaceState::intersect_point(const Vector3 &p_point, Shape
|
|||
|
||||
// Setup query
|
||||
GodotAllContactResultCallback btResult(&collision_object_point, r_results, p_result_max, &p_exclude);
|
||||
btResult.m_collisionFilterGroup = p_collision_layer;
|
||||
btResult.m_collisionFilterMask = p_object_type_mask;
|
||||
btResult.m_collisionFilterGroup = 0;
|
||||
btResult.m_collisionFilterMask = p_collision_mask;
|
||||
space->dynamicsWorld->contactTest(&collision_object_point, btResult);
|
||||
|
||||
// The results is already populated by GodotAllConvexResultCallback
|
||||
return btResult.m_count;
|
||||
}
|
||||
|
||||
bool BulletPhysicsDirectSpaceState::intersect_ray(const Vector3 &p_from, const Vector3 &p_to, RayResult &r_result, const Set<RID> &p_exclude, uint32_t p_collision_layer, uint32_t p_object_type_mask, bool p_pick_ray) {
|
||||
bool BulletPhysicsDirectSpaceState::intersect_ray(const Vector3 &p_from, const Vector3 &p_to, RayResult &r_result, const Set<RID> &p_exclude, uint32_t p_collision_mask, bool p_pick_ray) {
|
||||
|
||||
btVector3 btVec_from;
|
||||
btVector3 btVec_to;
|
||||
|
@ -86,8 +86,8 @@ bool BulletPhysicsDirectSpaceState::intersect_ray(const Vector3 &p_from, const V
|
|||
|
||||
// setup query
|
||||
GodotClosestRayResultCallback btResult(btVec_from, btVec_to, &p_exclude);
|
||||
btResult.m_collisionFilterGroup = p_collision_layer;
|
||||
btResult.m_collisionFilterMask = p_object_type_mask;
|
||||
btResult.m_collisionFilterGroup = 0;
|
||||
btResult.m_collisionFilterMask = p_collision_mask;
|
||||
btResult.m_pickRay = p_pick_ray;
|
||||
|
||||
space->dynamicsWorld->rayTest(btVec_from, btVec_to, btResult);
|
||||
|
@ -109,7 +109,7 @@ bool BulletPhysicsDirectSpaceState::intersect_ray(const Vector3 &p_from, const V
|
|||
}
|
||||
}
|
||||
|
||||
int BulletPhysicsDirectSpaceState::intersect_shape(const RID &p_shape, const Transform &p_xform, float p_margin, ShapeResult *p_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_layer, uint32_t p_object_type_mask) {
|
||||
int BulletPhysicsDirectSpaceState::intersect_shape(const RID &p_shape, const Transform &p_xform, float p_margin, ShapeResult *p_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
if (p_result_max <= 0)
|
||||
return 0;
|
||||
|
||||
|
@ -135,8 +135,8 @@ int BulletPhysicsDirectSpaceState::intersect_shape(const RID &p_shape, const Tra
|
|||
collision_object.setWorldTransform(bt_xform);
|
||||
|
||||
GodotAllContactResultCallback btQuery(&collision_object, p_results, p_result_max, &p_exclude);
|
||||
btQuery.m_collisionFilterGroup = p_collision_layer;
|
||||
btQuery.m_collisionFilterMask = p_object_type_mask;
|
||||
btQuery.m_collisionFilterGroup = 0;
|
||||
btQuery.m_collisionFilterMask = p_collision_mask;
|
||||
btQuery.m_closestDistanceThreshold = p_margin;
|
||||
space->dynamicsWorld->contactTest(&collision_object, btQuery);
|
||||
|
||||
|
@ -145,7 +145,7 @@ int BulletPhysicsDirectSpaceState::intersect_shape(const RID &p_shape, const Tra
|
|||
return btQuery.m_count;
|
||||
}
|
||||
|
||||
bool BulletPhysicsDirectSpaceState::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, uint32_t p_collision_layer, uint32_t p_object_type_mask, ShapeRestInfo *r_info) {
|
||||
bool BulletPhysicsDirectSpaceState::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, uint32_t p_collision_mask, ShapeRestInfo *r_info) {
|
||||
ShapeBullet *shape = space->get_physics_server()->get_shape_owner()->get(p_shape);
|
||||
|
||||
btCollisionShape *btShape = shape->create_bt_shape();
|
||||
|
@ -170,8 +170,8 @@ bool BulletPhysicsDirectSpaceState::cast_motion(const RID &p_shape, const Transf
|
|||
bt_xform_to.getOrigin() += bt_motion;
|
||||
|
||||
GodotClosestConvexResultCallback btResult(bt_xform_from.getOrigin(), bt_xform_to.getOrigin(), &p_exclude);
|
||||
btResult.m_collisionFilterGroup = p_collision_layer;
|
||||
btResult.m_collisionFilterMask = p_object_type_mask;
|
||||
btResult.m_collisionFilterGroup = 0;
|
||||
btResult.m_collisionFilterMask = p_collision_mask;
|
||||
|
||||
space->dynamicsWorld->convexSweepTest(bt_convex_shape, bt_xform_from, bt_xform_to, btResult, 0.002);
|
||||
|
||||
|
@ -195,7 +195,7 @@ bool BulletPhysicsDirectSpaceState::cast_motion(const RID &p_shape, const Transf
|
|||
}
|
||||
|
||||
/// Returns the list of contacts pairs in this order: Local contact, other body contact
|
||||
bool BulletPhysicsDirectSpaceState::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, uint32_t p_collision_layer, uint32_t p_object_type_mask) {
|
||||
bool BulletPhysicsDirectSpaceState::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, uint32_t p_collision_mask) {
|
||||
if (p_result_max <= 0)
|
||||
return 0;
|
||||
|
||||
|
@ -221,8 +221,8 @@ bool BulletPhysicsDirectSpaceState::collide_shape(RID p_shape, const Transform &
|
|||
collision_object.setWorldTransform(bt_xform);
|
||||
|
||||
GodotContactPairContactResultCallback btQuery(&collision_object, r_results, p_result_max, &p_exclude);
|
||||
btQuery.m_collisionFilterGroup = p_collision_layer;
|
||||
btQuery.m_collisionFilterMask = p_object_type_mask;
|
||||
btQuery.m_collisionFilterGroup = 0;
|
||||
btQuery.m_collisionFilterMask = p_collision_mask;
|
||||
btQuery.m_closestDistanceThreshold = p_margin;
|
||||
space->dynamicsWorld->contactTest(&collision_object, btQuery);
|
||||
|
||||
|
@ -232,7 +232,7 @@ bool BulletPhysicsDirectSpaceState::collide_shape(RID p_shape, const Transform &
|
|||
return btQuery.m_count;
|
||||
}
|
||||
|
||||
bool BulletPhysicsDirectSpaceState::rest_info(RID p_shape, const Transform &p_shape_xform, float p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude, uint32_t p_collision_layer, uint32_t p_object_type_mask) {
|
||||
bool BulletPhysicsDirectSpaceState::rest_info(RID p_shape, const Transform &p_shape_xform, float p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
|
||||
ShapeBullet *shape = space->get_physics_server()->get_shape_owner()->get(p_shape);
|
||||
|
||||
|
@ -256,8 +256,8 @@ bool BulletPhysicsDirectSpaceState::rest_info(RID p_shape, const Transform &p_sh
|
|||
collision_object.setWorldTransform(bt_xform);
|
||||
|
||||
GodotRestInfoContactResultCallback btQuery(&collision_object, r_info, &p_exclude);
|
||||
btQuery.m_collisionFilterGroup = p_collision_layer;
|
||||
btQuery.m_collisionFilterMask = p_object_type_mask;
|
||||
btQuery.m_collisionFilterGroup = 0;
|
||||
btQuery.m_collisionFilterMask = p_collision_mask;
|
||||
btQuery.m_closestDistanceThreshold = p_margin;
|
||||
space->dynamicsWorld->contactTest(&collision_object, btQuery);
|
||||
|
||||
|
|
|
@ -69,13 +69,13 @@ private:
|
|||
public:
|
||||
BulletPhysicsDirectSpaceState(SpaceBullet *p_space);
|
||||
|
||||
virtual int intersect_point(const Vector3 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
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_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, bool p_pick_ray = false);
|
||||
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_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
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_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, ShapeRestInfo *r_info = NULL);
|
||||
virtual int intersect_point(const Vector3 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF);
|
||||
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_collision_mask = 0xFFFFFFFF, bool p_pick_ray = false);
|
||||
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_collision_mask = 0xFFFFFFFF);
|
||||
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_collision_mask = 0xFFFFFFFF, ShapeRestInfo *r_info = NULL);
|
||||
/// Returns the list of contacts pairs in this order: Local contact, other body contact
|
||||
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_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
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_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
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_collision_mask = 0xFFFFFFFF);
|
||||
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_collision_mask = 0xFFFFFFFF);
|
||||
virtual Vector3 get_closest_point_to_object_volume(RID p_object, const Vector3 p_point) const;
|
||||
};
|
||||
|
||||
|
|
|
@ -134,7 +134,7 @@ void AudioStreamPlayer2D::_notification(int p_what) {
|
|||
|
||||
Physics2DDirectSpaceState::ShapeResult sr[MAX_INTERSECT_AREAS];
|
||||
|
||||
int areas = space_state->intersect_point(global_pos, sr, MAX_INTERSECT_AREAS, Set<RID>(), area_mask, Physics2DDirectSpaceState::TYPE_MASK_AREA);
|
||||
int areas = space_state->intersect_point(global_pos, sr, MAX_INTERSECT_AREAS, Set<RID>(), area_mask);
|
||||
|
||||
for (int i = 0; i < areas; i++) {
|
||||
|
||||
|
|
|
@ -56,11 +56,6 @@ uint32_t RayCast2D::get_collision_mask() const {
|
|||
return collision_mask;
|
||||
}
|
||||
|
||||
void RayCast2D::set_type_mask(uint32_t p_mask) {
|
||||
|
||||
type_mask = p_mask;
|
||||
}
|
||||
|
||||
void RayCast2D::set_collision_mask_bit(int p_bit, bool p_value) {
|
||||
|
||||
uint32_t mask = get_collision_mask();
|
||||
|
@ -76,11 +71,6 @@ bool RayCast2D::get_collision_mask_bit(int p_bit) const {
|
|||
return get_collision_mask() & (1 << p_bit);
|
||||
}
|
||||
|
||||
uint32_t RayCast2D::get_type_mask() const {
|
||||
|
||||
return type_mask;
|
||||
}
|
||||
|
||||
bool RayCast2D::is_colliding() const {
|
||||
|
||||
return collided;
|
||||
|
@ -218,7 +208,7 @@ void RayCast2D::_update_raycast_state() {
|
|||
|
||||
Physics2DDirectSpaceState::RayResult rr;
|
||||
|
||||
if (dss->intersect_ray(gt.get_origin(), gt.xform(to), rr, exclude, collision_mask, type_mask)) {
|
||||
if (dss->intersect_ray(gt.get_origin(), gt.xform(to), rr, exclude, collision_mask)) {
|
||||
|
||||
collided = true;
|
||||
against = rr.collider_id;
|
||||
|
@ -297,9 +287,6 @@ void RayCast2D::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_collision_mask_bit", "bit", "value"), &RayCast2D::set_collision_mask_bit);
|
||||
ClassDB::bind_method(D_METHOD("get_collision_mask_bit", "bit"), &RayCast2D::get_collision_mask_bit);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_type_mask", "mask"), &RayCast2D::set_type_mask);
|
||||
ClassDB::bind_method(D_METHOD("get_type_mask"), &RayCast2D::get_type_mask);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_exclude_parent_body", "mask"), &RayCast2D::set_exclude_parent_body);
|
||||
ClassDB::bind_method(D_METHOD("get_exclude_parent_body"), &RayCast2D::get_exclude_parent_body);
|
||||
|
||||
|
@ -307,7 +294,6 @@ void RayCast2D::_bind_methods() {
|
|||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "exclude_parent"), "set_exclude_parent_body", "get_exclude_parent_body");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "cast_to"), "set_cast_to", "get_cast_to");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_2D_PHYSICS), "set_collision_mask", "get_collision_mask");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "type_mask", PROPERTY_HINT_FLAGS, "Static,Kinematic,Rigid,Character,Area"), "set_type_mask", "get_type_mask");
|
||||
}
|
||||
|
||||
RayCast2D::RayCast2D() {
|
||||
|
@ -317,7 +303,6 @@ RayCast2D::RayCast2D() {
|
|||
collided = false;
|
||||
against_shape = 0;
|
||||
collision_mask = 1;
|
||||
type_mask = Physics2DDirectSpaceState::TYPE_MASK_COLLISION;
|
||||
cast_to = Vector2(0, 50);
|
||||
exclude_parent_body = true;
|
||||
}
|
||||
|
|
|
@ -44,7 +44,6 @@ class RayCast2D : public Node2D {
|
|||
Vector2 collision_normal;
|
||||
Set<RID> exclude;
|
||||
uint32_t collision_mask;
|
||||
uint32_t type_mask;
|
||||
bool exclude_parent_body;
|
||||
|
||||
Vector2 cast_to;
|
||||
|
@ -67,9 +66,6 @@ public:
|
|||
void set_collision_mask_bit(int p_bit, bool p_value);
|
||||
bool get_collision_mask_bit(int p_bit) const;
|
||||
|
||||
void set_type_mask(uint32_t p_mask);
|
||||
uint32_t get_type_mask() const;
|
||||
|
||||
void set_exclude_parent_body(bool p_exclude_parent_body);
|
||||
bool get_exclude_parent_body() const;
|
||||
|
||||
|
|
|
@ -242,7 +242,7 @@ void AudioStreamPlayer3D::_notification(int p_what) {
|
|||
|
||||
PhysicsDirectSpaceState::ShapeResult sr[MAX_INTERSECT_AREAS];
|
||||
|
||||
int areas = space_state->intersect_point(global_pos, sr, MAX_INTERSECT_AREAS, Set<RID>(), area_mask, PhysicsDirectSpaceState::TYPE_MASK_AREA);
|
||||
int areas = space_state->intersect_point(global_pos, sr, MAX_INTERSECT_AREAS, Set<RID>(), area_mask);
|
||||
Area *area = NULL;
|
||||
|
||||
for (int i = 0; i < areas; i++) {
|
||||
|
|
|
@ -58,11 +58,6 @@ uint32_t RayCast::get_collision_mask() const {
|
|||
return collision_mask;
|
||||
}
|
||||
|
||||
void RayCast::set_type_mask(uint32_t p_mask) {
|
||||
|
||||
type_mask = p_mask;
|
||||
}
|
||||
|
||||
void RayCast::set_collision_mask_bit(int p_bit, bool p_value) {
|
||||
|
||||
uint32_t mask = get_collision_mask();
|
||||
|
@ -78,11 +73,6 @@ bool RayCast::get_collision_mask_bit(int p_bit) const {
|
|||
return get_collision_mask() & (1 << p_bit);
|
||||
}
|
||||
|
||||
uint32_t RayCast::get_type_mask() const {
|
||||
|
||||
return type_mask;
|
||||
}
|
||||
|
||||
bool RayCast::is_colliding() const {
|
||||
|
||||
return collided;
|
||||
|
@ -187,7 +177,7 @@ void RayCast::_update_raycast_state() {
|
|||
|
||||
PhysicsDirectSpaceState::RayResult rr;
|
||||
|
||||
if (dss->intersect_ray(gt.get_origin(), gt.xform(to), rr, exclude, collision_mask, type_mask)) {
|
||||
if (dss->intersect_ray(gt.get_origin(), gt.xform(to), rr, exclude, collision_mask)) {
|
||||
|
||||
collided = true;
|
||||
against = rr.collider_id;
|
||||
|
@ -266,13 +256,9 @@ void RayCast::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_collision_mask_bit", "bit", "value"), &RayCast::set_collision_mask_bit);
|
||||
ClassDB::bind_method(D_METHOD("get_collision_mask_bit", "bit"), &RayCast::get_collision_mask_bit);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_type_mask", "mask"), &RayCast::set_type_mask);
|
||||
ClassDB::bind_method(D_METHOD("get_type_mask"), &RayCast::get_type_mask);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enabled"), "set_enabled", "is_enabled");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "cast_to"), "set_cast_to", "get_cast_to");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "type_mask", PROPERTY_HINT_FLAGS, "Static,Kinematic,Rigid,Character,Area"), "set_type_mask", "get_type_mask");
|
||||
}
|
||||
|
||||
void RayCast::_create_debug_shape() {
|
||||
|
@ -344,7 +330,6 @@ RayCast::RayCast() {
|
|||
collided = false;
|
||||
against_shape = 0;
|
||||
collision_mask = 1;
|
||||
type_mask = PhysicsDirectSpaceState::TYPE_MASK_COLLISION;
|
||||
cast_to = Vector3(0, -1, 0);
|
||||
debug_shape = NULL;
|
||||
}
|
||||
|
|
|
@ -48,7 +48,6 @@ class RayCast : public Spatial {
|
|||
Set<RID> exclude;
|
||||
|
||||
uint32_t collision_mask;
|
||||
uint32_t type_mask;
|
||||
|
||||
Node *debug_shape;
|
||||
Ref<Material> debug_material;
|
||||
|
@ -75,9 +74,6 @@ public:
|
|||
void set_collision_mask_bit(int p_bit, bool p_value);
|
||||
bool get_collision_mask_bit(int p_bit) const;
|
||||
|
||||
void set_type_mask(uint32_t p_mask);
|
||||
uint32_t get_type_mask() const;
|
||||
|
||||
void force_raycast_update();
|
||||
bool is_colliding() const;
|
||||
Object *get_collider() const;
|
||||
|
|
|
@ -539,7 +539,7 @@ void Viewport::_notification(int p_what) {
|
|||
|
||||
Vector2 point = get_canvas_transform().affine_inverse().xform(pos);
|
||||
Physics2DDirectSpaceState::ShapeResult res[64];
|
||||
int rc = ss2d->intersect_point(point, res, 64, Set<RID>(), 0xFFFFFFFF, 0xFFFFFFFF, true);
|
||||
int rc = ss2d->intersect_point(point, res, 64, Set<RID>(), 0xFFFFFFFF, true);
|
||||
for (int i = 0; i < rc; i++) {
|
||||
|
||||
if (res[i].collider_id && res[i].collider) {
|
||||
|
@ -622,7 +622,7 @@ void Viewport::_notification(int p_what) {
|
|||
PhysicsDirectSpaceState *space = PhysicsServer::get_singleton()->space_get_direct_state(find_world()->get_space());
|
||||
if (space) {
|
||||
|
||||
bool col = space->intersect_ray(from, from + dir * 10000, result, Set<RID>(), 0xFFFFFFFF, 0xFFFFFFFF, true);
|
||||
bool col = space->intersect_ray(from, from + dir * 10000, result, Set<RID>(), 0xFFFFFFFF, true);
|
||||
ObjectID new_collider = 0;
|
||||
if (col) {
|
||||
|
||||
|
@ -658,7 +658,7 @@ void Viewport::_notification(int p_what) {
|
|||
PhysicsDirectSpaceState *space = PhysicsServer::get_singleton()->space_get_direct_state(find_world()->get_space());
|
||||
if (space) {
|
||||
|
||||
bool col = space->intersect_ray(from, from + dir * 10000, result, Set<RID>(), 0xFFFFFFFF, 0xFFFFFFFF, true);
|
||||
bool col = space->intersect_ray(from, from + dir * 10000, result, Set<RID>(), 0xFFFFFFFF, true);
|
||||
ObjectID new_collider = 0;
|
||||
if (col) {
|
||||
CollisionObject *co = Object::cast_to<CollisionObject>(result.collider);
|
||||
|
|
|
@ -33,20 +33,12 @@
|
|||
#include "physics_server_sw.h"
|
||||
#include "project_settings.h"
|
||||
|
||||
_FORCE_INLINE_ static bool _match_object_type_query(CollisionObjectSW *p_object, uint32_t p_collision_mask, uint32_t p_type_mask) {
|
||||
_FORCE_INLINE_ static bool _can_collide_with(CollisionObjectSW *p_object, uint32_t p_collision_mask) {
|
||||
|
||||
if ((p_object->get_collision_layer() & p_collision_mask) == 0)
|
||||
return false;
|
||||
|
||||
if (p_object->get_type() == CollisionObjectSW::TYPE_AREA)
|
||||
return p_type_mask & PhysicsDirectSpaceState::TYPE_MASK_AREA;
|
||||
|
||||
BodySW *body = static_cast<BodySW *>(p_object);
|
||||
|
||||
return (1 << body->get_mode()) & p_type_mask;
|
||||
return p_object->get_collision_layer() & p_collision_mask;
|
||||
}
|
||||
|
||||
int PhysicsDirectSpaceStateSW::intersect_point(const Vector3 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask, uint32_t p_object_type_mask) {
|
||||
int PhysicsDirectSpaceStateSW::intersect_point(const Vector3 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
|
||||
ERR_FAIL_COND_V(space->locked, false);
|
||||
int amount = space->broadphase->cull_point(p_point, space->intersection_query_results, SpaceSW::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
|
@ -59,7 +51,7 @@ int PhysicsDirectSpaceStateSW::intersect_point(const Vector3 &p_point, ShapeResu
|
|||
if (cc >= p_result_max)
|
||||
break;
|
||||
|
||||
if (!_match_object_type_query(space->intersection_query_results[i], p_collision_mask, p_object_type_mask))
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask))
|
||||
continue;
|
||||
|
||||
//area can't be picked by ray (default)
|
||||
|
@ -90,7 +82,7 @@ int PhysicsDirectSpaceStateSW::intersect_point(const Vector3 &p_point, ShapeResu
|
|||
return cc;
|
||||
}
|
||||
|
||||
bool PhysicsDirectSpaceStateSW::intersect_ray(const Vector3 &p_from, const Vector3 &p_to, RayResult &r_result, const Set<RID> &p_exclude, uint32_t p_collision_mask, uint32_t p_object_type_mask, bool p_pick_ray) {
|
||||
bool PhysicsDirectSpaceStateSW::intersect_ray(const Vector3 &p_from, const Vector3 &p_to, RayResult &r_result, const Set<RID> &p_exclude, uint32_t p_collision_mask, bool p_pick_ray) {
|
||||
|
||||
ERR_FAIL_COND_V(space->locked, false);
|
||||
|
||||
|
@ -112,7 +104,7 @@ bool PhysicsDirectSpaceStateSW::intersect_ray(const Vector3 &p_from, const Vecto
|
|||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
|
||||
if (!_match_object_type_query(space->intersection_query_results[i], p_collision_mask, p_object_type_mask))
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask))
|
||||
continue;
|
||||
|
||||
if (p_pick_ray && !(static_cast<CollisionObjectSW *>(space->intersection_query_results[i])->is_ray_pickable()))
|
||||
|
@ -168,7 +160,7 @@ bool PhysicsDirectSpaceStateSW::intersect_ray(const Vector3 &p_from, const Vecto
|
|||
return true;
|
||||
}
|
||||
|
||||
int PhysicsDirectSpaceStateSW::intersect_shape(const RID &p_shape, const Transform &p_xform, real_t p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask, uint32_t p_object_type_mask) {
|
||||
int PhysicsDirectSpaceStateSW::intersect_shape(const RID &p_shape, const Transform &p_xform, real_t p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
|
||||
if (p_result_max <= 0)
|
||||
return 0;
|
||||
|
@ -189,7 +181,7 @@ int PhysicsDirectSpaceStateSW::intersect_shape(const RID &p_shape, const Transfo
|
|||
if (cc >= p_result_max)
|
||||
break;
|
||||
|
||||
if (!_match_object_type_query(space->intersection_query_results[i], p_collision_mask, p_object_type_mask))
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask))
|
||||
continue;
|
||||
|
||||
//area can't be picked by ray (default)
|
||||
|
@ -219,7 +211,7 @@ int PhysicsDirectSpaceStateSW::intersect_shape(const RID &p_shape, const Transfo
|
|||
return cc;
|
||||
}
|
||||
|
||||
bool PhysicsDirectSpaceStateSW::cast_motion(const RID &p_shape, const Transform &p_xform, const Vector3 &p_motion, real_t p_margin, real_t &p_closest_safe, real_t &p_closest_unsafe, const Set<RID> &p_exclude, uint32_t p_collision_mask, uint32_t p_object_type_mask, ShapeRestInfo *r_info) {
|
||||
bool PhysicsDirectSpaceStateSW::cast_motion(const RID &p_shape, const Transform &p_xform, const Vector3 &p_motion, real_t p_margin, real_t &p_closest_safe, real_t &p_closest_unsafe, const Set<RID> &p_exclude, uint32_t p_collision_mask, ShapeRestInfo *r_info) {
|
||||
|
||||
ShapeSW *shape = static_cast<PhysicsServerSW *>(PhysicsServer::get_singleton())->shape_owner.get(p_shape);
|
||||
ERR_FAIL_COND_V(!shape, false);
|
||||
|
@ -249,7 +241,7 @@ bool PhysicsDirectSpaceStateSW::cast_motion(const RID &p_shape, const Transform
|
|||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
|
||||
if (!_match_object_type_query(space->intersection_query_results[i], p_collision_mask, p_object_type_mask))
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask))
|
||||
continue;
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self()))
|
||||
|
@ -333,7 +325,7 @@ bool PhysicsDirectSpaceStateSW::cast_motion(const RID &p_shape, const Transform
|
|||
return true;
|
||||
}
|
||||
|
||||
bool PhysicsDirectSpaceStateSW::collide_shape(RID p_shape, const Transform &p_shape_xform, real_t p_margin, Vector3 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude, uint32_t p_collision_mask, uint32_t p_object_type_mask) {
|
||||
bool PhysicsDirectSpaceStateSW::collide_shape(RID p_shape, const Transform &p_shape_xform, real_t p_margin, Vector3 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
|
||||
if (p_result_max <= 0)
|
||||
return 0;
|
||||
|
@ -363,7 +355,7 @@ bool PhysicsDirectSpaceStateSW::collide_shape(RID p_shape, const Transform &p_sh
|
|||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
|
||||
if (!_match_object_type_query(space->intersection_query_results[i], p_collision_mask, p_object_type_mask))
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask))
|
||||
continue;
|
||||
|
||||
const CollisionObjectSW *col_obj = space->intersection_query_results[i];
|
||||
|
@ -412,7 +404,7 @@ static void _rest_cbk_result(const Vector3 &p_point_A, const Vector3 &p_point_B,
|
|||
rd->best_object = rd->object;
|
||||
rd->best_shape = rd->shape;
|
||||
}
|
||||
bool PhysicsDirectSpaceStateSW::rest_info(RID p_shape, const Transform &p_shape_xform, real_t p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude, uint32_t p_collision_mask, uint32_t p_object_type_mask) {
|
||||
bool PhysicsDirectSpaceStateSW::rest_info(RID p_shape, const Transform &p_shape_xform, real_t p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
|
||||
ShapeSW *shape = static_cast<PhysicsServerSW *>(PhysicsServer::get_singleton())->shape_owner.get(p_shape);
|
||||
ERR_FAIL_COND_V(!shape, 0);
|
||||
|
@ -429,7 +421,7 @@ bool PhysicsDirectSpaceStateSW::rest_info(RID p_shape, const Transform &p_shape_
|
|||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
|
||||
if (!_match_object_type_query(space->intersection_query_results[i], p_collision_mask, p_object_type_mask))
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask))
|
||||
continue;
|
||||
|
||||
const CollisionObjectSW *col_obj = space->intersection_query_results[i];
|
||||
|
|
|
@ -47,12 +47,12 @@ class PhysicsDirectSpaceStateSW : public PhysicsDirectSpaceState {
|
|||
public:
|
||||
SpaceSW *space;
|
||||
|
||||
virtual int intersect_point(const Vector3 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
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_collision_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, bool p_pick_ray = false);
|
||||
virtual int intersect_shape(const RID &p_shape, const Transform &p_xform, real_t p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
virtual bool cast_motion(const RID &p_shape, const Transform &p_xform, const Vector3 &p_motion, real_t p_margin, real_t &p_closest_safe, real_t &p_closest_unsafe, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, ShapeRestInfo *r_info = NULL);
|
||||
virtual bool collide_shape(RID p_shape, const Transform &p_shape_xform, real_t p_margin, Vector3 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
virtual bool rest_info(RID p_shape, const Transform &p_shape_xform, real_t p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
virtual int intersect_point(const Vector3 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF);
|
||||
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_collision_mask = 0xFFFFFFFF, bool p_pick_ray = false);
|
||||
virtual int intersect_shape(const RID &p_shape, const Transform &p_xform, real_t p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF);
|
||||
virtual bool cast_motion(const RID &p_shape, const Transform &p_xform, const Vector3 &p_motion, real_t p_margin, real_t &p_closest_safe, real_t &p_closest_unsafe, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, ShapeRestInfo *r_info = NULL);
|
||||
virtual bool collide_shape(RID p_shape, const Transform &p_shape_xform, real_t p_margin, Vector3 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF);
|
||||
virtual bool rest_info(RID p_shape, const Transform &p_shape_xform, real_t p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF);
|
||||
virtual Vector3 get_closest_point_to_object_volume(RID p_object, const Vector3 p_point) const;
|
||||
|
||||
PhysicsDirectSpaceStateSW();
|
||||
|
|
|
@ -32,20 +32,12 @@
|
|||
#include "collision_solver_2d_sw.h"
|
||||
#include "pair.h"
|
||||
#include "physics_2d_server_sw.h"
|
||||
_FORCE_INLINE_ static bool _match_object_type_query(CollisionObject2DSW *p_object, uint32_t p_collision_mask, uint32_t p_type_mask) {
|
||||
_FORCE_INLINE_ static bool _can_collide_with(CollisionObject2DSW *p_object, uint32_t p_collision_mask) {
|
||||
|
||||
if ((p_object->get_collision_layer() & p_collision_mask) == 0)
|
||||
return false;
|
||||
|
||||
if (p_object->get_type() == CollisionObject2DSW::TYPE_AREA)
|
||||
return p_type_mask & Physics2DDirectSpaceState::TYPE_MASK_AREA;
|
||||
|
||||
Body2DSW *body = static_cast<Body2DSW *>(p_object);
|
||||
|
||||
return (1 << body->get_mode()) & p_type_mask;
|
||||
return p_object->get_collision_layer() & p_collision_mask;
|
||||
}
|
||||
|
||||
int Physics2DDirectSpaceStateSW::intersect_point(const Vector2 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask, uint32_t p_object_type_mask, bool p_pick_point) {
|
||||
int Physics2DDirectSpaceStateSW::intersect_point(const Vector2 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask, bool p_pick_point) {
|
||||
|
||||
if (p_result_max <= 0)
|
||||
return 0;
|
||||
|
@ -60,7 +52,7 @@ int Physics2DDirectSpaceStateSW::intersect_point(const Vector2 &p_point, ShapeRe
|
|||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
|
||||
if (!_match_object_type_query(space->intersection_query_results[i], p_collision_mask, p_object_type_mask))
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask))
|
||||
continue;
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self()))
|
||||
|
@ -96,7 +88,7 @@ int Physics2DDirectSpaceStateSW::intersect_point(const Vector2 &p_point, ShapeRe
|
|||
return cc;
|
||||
}
|
||||
|
||||
bool Physics2DDirectSpaceStateSW::intersect_ray(const Vector2 &p_from, const Vector2 &p_to, RayResult &r_result, const Set<RID> &p_exclude, uint32_t p_collision_mask, uint32_t p_object_type_mask) {
|
||||
bool Physics2DDirectSpaceStateSW::intersect_ray(const Vector2 &p_from, const Vector2 &p_to, RayResult &r_result, const Set<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
|
||||
ERR_FAIL_COND_V(space->locked, false);
|
||||
|
||||
|
@ -118,7 +110,7 @@ bool Physics2DDirectSpaceStateSW::intersect_ray(const Vector2 &p_from, const Vec
|
|||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
|
||||
if (!_match_object_type_query(space->intersection_query_results[i], p_collision_mask, p_object_type_mask))
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask))
|
||||
continue;
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self()))
|
||||
|
@ -176,7 +168,7 @@ bool Physics2DDirectSpaceStateSW::intersect_ray(const Vector2 &p_from, const Vec
|
|||
return true;
|
||||
}
|
||||
|
||||
int Physics2DDirectSpaceStateSW::intersect_shape(const RID &p_shape, const Transform2D &p_xform, const Vector2 &p_motion, real_t p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask, uint32_t p_object_type_mask) {
|
||||
int Physics2DDirectSpaceStateSW::intersect_shape(const RID &p_shape, const Transform2D &p_xform, const Vector2 &p_motion, real_t p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
|
||||
if (p_result_max <= 0)
|
||||
return 0;
|
||||
|
@ -193,7 +185,7 @@ int Physics2DDirectSpaceStateSW::intersect_shape(const RID &p_shape, const Trans
|
|||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
|
||||
if (!_match_object_type_query(space->intersection_query_results[i], p_collision_mask, p_object_type_mask))
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask))
|
||||
continue;
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self()))
|
||||
|
@ -218,7 +210,7 @@ int Physics2DDirectSpaceStateSW::intersect_shape(const RID &p_shape, const Trans
|
|||
return cc;
|
||||
}
|
||||
|
||||
bool Physics2DDirectSpaceStateSW::cast_motion(const RID &p_shape, const Transform2D &p_xform, const Vector2 &p_motion, real_t p_margin, real_t &p_closest_safe, real_t &p_closest_unsafe, const Set<RID> &p_exclude, uint32_t p_collision_mask, uint32_t p_object_type_mask) {
|
||||
bool Physics2DDirectSpaceStateSW::cast_motion(const RID &p_shape, const Transform2D &p_xform, const Vector2 &p_motion, real_t p_margin, real_t &p_closest_safe, real_t &p_closest_unsafe, const Set<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
|
||||
Shape2DSW *shape = Physics2DServerSW::singletonsw->shape_owner.get(p_shape);
|
||||
ERR_FAIL_COND_V(!shape, false);
|
||||
|
@ -239,7 +231,7 @@ bool Physics2DDirectSpaceStateSW::cast_motion(const RID &p_shape, const Transfor
|
|||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
|
||||
if (!_match_object_type_query(space->intersection_query_results[i], p_collision_mask, p_object_type_mask))
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask))
|
||||
continue;
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self()))
|
||||
|
@ -302,7 +294,7 @@ bool Physics2DDirectSpaceStateSW::cast_motion(const RID &p_shape, const Transfor
|
|||
return true;
|
||||
}
|
||||
|
||||
bool Physics2DDirectSpaceStateSW::collide_shape(RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, real_t p_margin, Vector2 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude, uint32_t p_collision_mask, uint32_t p_object_type_mask) {
|
||||
bool Physics2DDirectSpaceStateSW::collide_shape(RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, real_t p_margin, Vector2 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
|
||||
if (p_result_max <= 0)
|
||||
return 0;
|
||||
|
@ -333,7 +325,7 @@ bool Physics2DDirectSpaceStateSW::collide_shape(RID p_shape, const Transform2D &
|
|||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
|
||||
if (!_match_object_type_query(space->intersection_query_results[i], p_collision_mask, p_object_type_mask))
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask))
|
||||
continue;
|
||||
|
||||
const CollisionObject2DSW *col_obj = space->intersection_query_results[i];
|
||||
|
@ -391,7 +383,7 @@ static void _rest_cbk_result(const Vector2 &p_point_A, const Vector2 &p_point_B,
|
|||
rd->best_shape = rd->shape;
|
||||
}
|
||||
|
||||
bool Physics2DDirectSpaceStateSW::rest_info(RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, real_t p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude, uint32_t p_collision_mask, uint32_t p_object_type_mask) {
|
||||
bool Physics2DDirectSpaceStateSW::rest_info(RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, real_t p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
|
||||
Shape2DSW *shape = Physics2DServerSW::singletonsw->shape_owner.get(p_shape);
|
||||
ERR_FAIL_COND_V(!shape, 0);
|
||||
|
@ -409,7 +401,7 @@ bool Physics2DDirectSpaceStateSW::rest_info(RID p_shape, const Transform2D &p_sh
|
|||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
|
||||
if (!_match_object_type_query(space->intersection_query_results[i], p_collision_mask, p_object_type_mask))
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask))
|
||||
continue;
|
||||
|
||||
const CollisionObject2DSW *col_obj = space->intersection_query_results[i];
|
||||
|
|
|
@ -47,12 +47,12 @@ class Physics2DDirectSpaceStateSW : public Physics2DDirectSpaceState {
|
|||
public:
|
||||
Space2DSW *space;
|
||||
|
||||
virtual int intersect_point(const Vector2 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, bool p_pick_point = false);
|
||||
virtual bool intersect_ray(const Vector2 &p_from, const Vector2 &p_to, RayResult &r_result, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
virtual int intersect_shape(const RID &p_shape, const Transform2D &p_xform, const Vector2 &p_motion, real_t p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
virtual bool cast_motion(const RID &p_shape, const Transform2D &p_xform, const Vector2 &p_motion, real_t p_margin, real_t &p_closest_safe, real_t &p_closest_unsafe, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
virtual bool collide_shape(RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, real_t p_margin, Vector2 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
virtual bool rest_info(RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, real_t p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
virtual int intersect_point(const Vector2 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF, bool p_pick_point = false);
|
||||
virtual bool intersect_ray(const Vector2 &p_from, const Vector2 &p_to, RayResult &r_result, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF);
|
||||
virtual int intersect_shape(const RID &p_shape, const Transform2D &p_xform, const Vector2 &p_motion, real_t p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF);
|
||||
virtual bool cast_motion(const RID &p_shape, const Transform2D &p_xform, const Vector2 &p_motion, real_t p_margin, real_t &p_closest_safe, real_t &p_closest_unsafe, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF);
|
||||
virtual bool collide_shape(RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, real_t p_margin, Vector2 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF);
|
||||
virtual bool rest_info(RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, real_t p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF);
|
||||
|
||||
Physics2DDirectSpaceStateSW();
|
||||
};
|
||||
|
|
|
@ -156,23 +156,15 @@ float Physics2DShapeQueryParameters::get_margin() const {
|
|||
return margin;
|
||||
}
|
||||
|
||||
void Physics2DShapeQueryParameters::set_collision_layer(int p_collision_layer) {
|
||||
void Physics2DShapeQueryParameters::set_collision_mask(int p_collision_layer) {
|
||||
|
||||
collision_layer = p_collision_layer;
|
||||
collision_mask = p_collision_layer;
|
||||
}
|
||||
int Physics2DShapeQueryParameters::get_collision_layer() const {
|
||||
int Physics2DShapeQueryParameters::get_collision_mask() const {
|
||||
|
||||
return collision_layer;
|
||||
return collision_mask;
|
||||
}
|
||||
|
||||
void Physics2DShapeQueryParameters::set_object_type_mask(int p_object_type_mask) {
|
||||
|
||||
object_type_mask = p_object_type_mask;
|
||||
}
|
||||
int Physics2DShapeQueryParameters::get_object_type_mask() const {
|
||||
|
||||
return object_type_mask;
|
||||
}
|
||||
void Physics2DShapeQueryParameters::set_exclude(const Vector<RID> &p_exclude) {
|
||||
|
||||
exclude.clear();
|
||||
|
@ -206,11 +198,8 @@ void Physics2DShapeQueryParameters::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_margin", "margin"), &Physics2DShapeQueryParameters::set_margin);
|
||||
ClassDB::bind_method(D_METHOD("get_margin"), &Physics2DShapeQueryParameters::get_margin);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collision_layer", "collision_layer"), &Physics2DShapeQueryParameters::set_collision_layer);
|
||||
ClassDB::bind_method(D_METHOD("get_collision_layer"), &Physics2DShapeQueryParameters::get_collision_layer);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_object_type_mask", "object_type_mask"), &Physics2DShapeQueryParameters::set_object_type_mask);
|
||||
ClassDB::bind_method(D_METHOD("get_object_type_mask"), &Physics2DShapeQueryParameters::get_object_type_mask);
|
||||
ClassDB::bind_method(D_METHOD("set_collision_layer", "collision_layer"), &Physics2DShapeQueryParameters::set_collision_mask);
|
||||
ClassDB::bind_method(D_METHOD("get_collision_layer"), &Physics2DShapeQueryParameters::get_collision_mask);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_exclude", "exclude"), &Physics2DShapeQueryParameters::set_exclude);
|
||||
ClassDB::bind_method(D_METHOD("get_exclude"), &Physics2DShapeQueryParameters::get_exclude);
|
||||
|
@ -219,18 +208,17 @@ void Physics2DShapeQueryParameters::_bind_methods() {
|
|||
Physics2DShapeQueryParameters::Physics2DShapeQueryParameters() {
|
||||
|
||||
margin = 0;
|
||||
collision_layer = 0x7FFFFFFF;
|
||||
object_type_mask = Physics2DDirectSpaceState::TYPE_MASK_COLLISION;
|
||||
collision_mask = 0x7FFFFFFF;
|
||||
}
|
||||
|
||||
Dictionary Physics2DDirectSpaceState::_intersect_ray(const Vector2 &p_from, const Vector2 &p_to, const Vector<RID> &p_exclude, uint32_t p_layers, uint32_t p_object_type_mask) {
|
||||
Dictionary Physics2DDirectSpaceState::_intersect_ray(const Vector2 &p_from, const Vector2 &p_to, const Vector<RID> &p_exclude, uint32_t p_layers) {
|
||||
|
||||
RayResult inters;
|
||||
Set<RID> exclude;
|
||||
for (int i = 0; i < p_exclude.size(); i++)
|
||||
exclude.insert(p_exclude[i]);
|
||||
|
||||
bool res = intersect_ray(p_from, p_to, inters, exclude, p_layers, p_object_type_mask);
|
||||
bool res = intersect_ray(p_from, p_to, inters, exclude, p_layers);
|
||||
|
||||
if (!res)
|
||||
return Dictionary();
|
||||
|
@ -251,7 +239,7 @@ Array Physics2DDirectSpaceState::_intersect_shape(const Ref<Physics2DShapeQueryP
|
|||
|
||||
Vector<ShapeResult> sr;
|
||||
sr.resize(p_max_results);
|
||||
int rc = intersect_shape(p_shape_query->shape, p_shape_query->transform, p_shape_query->motion, p_shape_query->margin, sr.ptr(), sr.size(), p_shape_query->exclude, p_shape_query->collision_layer, p_shape_query->object_type_mask);
|
||||
int rc = intersect_shape(p_shape_query->shape, p_shape_query->transform, p_shape_query->motion, p_shape_query->margin, sr.ptr(), sr.size(), p_shape_query->exclude, p_shape_query->collision_mask);
|
||||
Array ret;
|
||||
ret.resize(rc);
|
||||
for (int i = 0; i < rc; i++) {
|
||||
|
@ -271,7 +259,7 @@ Array Physics2DDirectSpaceState::_intersect_shape(const Ref<Physics2DShapeQueryP
|
|||
Array Physics2DDirectSpaceState::_cast_motion(const Ref<Physics2DShapeQueryParameters> &p_shape_query) {
|
||||
|
||||
float closest_safe, closest_unsafe;
|
||||
bool res = cast_motion(p_shape_query->shape, p_shape_query->transform, p_shape_query->motion, p_shape_query->margin, closest_safe, closest_unsafe, p_shape_query->exclude, p_shape_query->collision_layer, p_shape_query->object_type_mask);
|
||||
bool res = cast_motion(p_shape_query->shape, p_shape_query->transform, p_shape_query->motion, p_shape_query->margin, closest_safe, closest_unsafe, p_shape_query->exclude, p_shape_query->collision_mask);
|
||||
if (!res)
|
||||
return Array();
|
||||
Array ret;
|
||||
|
@ -281,7 +269,7 @@ Array Physics2DDirectSpaceState::_cast_motion(const Ref<Physics2DShapeQueryParam
|
|||
return ret;
|
||||
}
|
||||
|
||||
Array Physics2DDirectSpaceState::_intersect_point(const Vector2 &p_point, int p_max_results, const Vector<RID> &p_exclude, uint32_t p_layers, uint32_t p_object_type_mask) {
|
||||
Array Physics2DDirectSpaceState::_intersect_point(const Vector2 &p_point, int p_max_results, const Vector<RID> &p_exclude, uint32_t p_layers) {
|
||||
|
||||
Set<RID> exclude;
|
||||
for (int i = 0; i < p_exclude.size(); i++)
|
||||
|
@ -290,7 +278,7 @@ Array Physics2DDirectSpaceState::_intersect_point(const Vector2 &p_point, int p_
|
|||
Vector<ShapeResult> ret;
|
||||
ret.resize(p_max_results);
|
||||
|
||||
int rc = intersect_point(p_point, ret.ptr(), ret.size(), exclude, p_layers, p_object_type_mask);
|
||||
int rc = intersect_point(p_point, ret.ptr(), ret.size(), exclude, p_layers);
|
||||
if (rc == 0)
|
||||
return Array();
|
||||
|
||||
|
@ -314,7 +302,7 @@ Array Physics2DDirectSpaceState::_collide_shape(const Ref<Physics2DShapeQueryPar
|
|||
Vector<Vector2> ret;
|
||||
ret.resize(p_max_results * 2);
|
||||
int rc = 0;
|
||||
bool res = collide_shape(p_shape_query->shape, p_shape_query->transform, p_shape_query->motion, p_shape_query->margin, ret.ptr(), p_max_results, rc, p_shape_query->exclude, p_shape_query->collision_layer, p_shape_query->object_type_mask);
|
||||
bool res = collide_shape(p_shape_query->shape, p_shape_query->transform, p_shape_query->motion, p_shape_query->margin, ret.ptr(), p_max_results, rc, p_shape_query->exclude, p_shape_query->collision_mask);
|
||||
if (!res)
|
||||
return Array();
|
||||
Array r;
|
||||
|
@ -327,7 +315,7 @@ Dictionary Physics2DDirectSpaceState::_get_rest_info(const Ref<Physics2DShapeQue
|
|||
|
||||
ShapeRestInfo sri;
|
||||
|
||||
bool res = rest_info(p_shape_query->shape, p_shape_query->transform, p_shape_query->motion, p_shape_query->margin, &sri, p_shape_query->exclude, p_shape_query->collision_layer, p_shape_query->object_type_mask);
|
||||
bool res = rest_info(p_shape_query->shape, p_shape_query->transform, p_shape_query->motion, p_shape_query->margin, &sri, p_shape_query->exclude, p_shape_query->collision_mask);
|
||||
Dictionary r;
|
||||
if (!res)
|
||||
return r;
|
||||
|
@ -348,20 +336,13 @@ Physics2DDirectSpaceState::Physics2DDirectSpaceState() {
|
|||
|
||||
void Physics2DDirectSpaceState::_bind_methods() {
|
||||
|
||||
ClassDB::bind_method(D_METHOD("intersect_point", "point", "max_results", "exclude", "collision_layer", "type_mask"), &Physics2DDirectSpaceState::_intersect_point, DEFVAL(32), DEFVAL(Array()), DEFVAL(0x7FFFFFFF), DEFVAL(TYPE_MASK_COLLISION));
|
||||
ClassDB::bind_method(D_METHOD("intersect_ray", "from", "to", "exclude", "collision_layer", "type_mask"), &Physics2DDirectSpaceState::_intersect_ray, DEFVAL(Array()), DEFVAL(0x7FFFFFFF), DEFVAL(TYPE_MASK_COLLISION));
|
||||
ClassDB::bind_method(D_METHOD("intersect_point", "point", "max_results", "exclude", "collision_layer"), &Physics2DDirectSpaceState::_intersect_point, DEFVAL(32), DEFVAL(Array()), DEFVAL(0x7FFFFFFF));
|
||||
ClassDB::bind_method(D_METHOD("intersect_ray", "from", "to", "exclude", "collision_layer"), &Physics2DDirectSpaceState::_intersect_ray, DEFVAL(Array()), DEFVAL(0x7FFFFFFF));
|
||||
ClassDB::bind_method(D_METHOD("intersect_shape", "shape", "max_results"), &Physics2DDirectSpaceState::_intersect_shape, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("cast_motion", "shape"), &Physics2DDirectSpaceState::_cast_motion);
|
||||
ClassDB::bind_method(D_METHOD("collide_shape", "shape", "max_results"), &Physics2DDirectSpaceState::_collide_shape, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("get_rest_info", "shape"), &Physics2DDirectSpaceState::_get_rest_info);
|
||||
//ClassDB::bind_method(D_METHOD("cast_motion","shape","xform","motion","exclude","umask"),&Physics2DDirectSpaceState::_intersect_shape,DEFVAL(Array()),DEFVAL(0));
|
||||
|
||||
BIND_ENUM_CONSTANT(TYPE_MASK_STATIC_BODY);
|
||||
BIND_ENUM_CONSTANT(TYPE_MASK_KINEMATIC_BODY);
|
||||
BIND_ENUM_CONSTANT(TYPE_MASK_RIGID_BODY);
|
||||
BIND_ENUM_CONSTANT(TYPE_MASK_CHARACTER_BODY);
|
||||
BIND_ENUM_CONSTANT(TYPE_MASK_COLLISION);
|
||||
BIND_ENUM_CONSTANT(TYPE_MASK_AREA);
|
||||
}
|
||||
|
||||
int Physics2DShapeQueryResult::get_result_count() const {
|
||||
|
|
|
@ -97,8 +97,7 @@ class Physics2DShapeQueryParameters : public Reference {
|
|||
Vector2 motion;
|
||||
float margin;
|
||||
Set<RID> exclude;
|
||||
uint32_t collision_layer;
|
||||
uint32_t object_type_mask;
|
||||
uint32_t collision_mask;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
@ -117,11 +116,8 @@ public:
|
|||
void set_margin(float p_margin);
|
||||
float get_margin() const;
|
||||
|
||||
void set_collision_layer(int p_collision_layer);
|
||||
int get_collision_layer() const;
|
||||
|
||||
void set_object_type_mask(int p_object_type_mask);
|
||||
int get_object_type_mask() const;
|
||||
void set_collision_mask(int p_collision_mask);
|
||||
int get_collision_mask() const;
|
||||
|
||||
void set_exclude(const Vector<RID> &p_exclude);
|
||||
Vector<RID> get_exclude() const;
|
||||
|
@ -133,9 +129,9 @@ class Physics2DDirectSpaceState : public Object {
|
|||
|
||||
GDCLASS(Physics2DDirectSpaceState, Object);
|
||||
|
||||
Dictionary _intersect_ray(const Vector2 &p_from, const Vector2 &p_to, const Vector<RID> &p_exclude = Vector<RID>(), uint32_t p_layers = 0, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
Dictionary _intersect_ray(const Vector2 &p_from, const Vector2 &p_to, const Vector<RID> &p_exclude = Vector<RID>(), uint32_t p_layers = 0);
|
||||
|
||||
Array _intersect_point(const Vector2 &p_point, int p_max_results = 32, const Vector<RID> &p_exclude = Vector<RID>(), uint32_t p_layers = 0, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
|
||||
Array _intersect_point(const Vector2 &p_point, int p_max_results = 32, const Vector<RID> &p_exclude = Vector<RID>(), uint32_t p_layers = 0);
|
||||
Array _intersect_shape(const Ref<Physics2DShapeQueryParameters> &p_shape_query, int p_max_results = 32);
|
||||
Array _cast_motion(const Ref<Physics2DShapeQueryParameters> &p_shape_query);
|
||||
Array _collide_shape(const Ref<Physics2DShapeQueryParameters> &p_shape_query, int p_max_results = 32);
|
||||
|
@ -145,16 +141,6 @@ protected:
|
|||
static void _bind_methods();
|
||||
|
||||
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
|
||||
|
||||
};
|
||||
|
||||
struct RayResult {
|
||||
|
||||
Vector2 position;
|
||||
|
@ -166,7 +152,7 @@ public:
|
|||
Variant metadata;
|
||||
};
|
||||
|
||||
virtual bool intersect_ray(const Vector2 &p_from, const Vector2 &p_to, RayResult &r_result, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
|
||||
virtual bool intersect_ray(const Vector2 &p_from, const Vector2 &p_to, RayResult &r_result, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF) = 0;
|
||||
|
||||
struct ShapeResult {
|
||||
|
||||
|
@ -177,13 +163,13 @@ public:
|
|||
Variant metadata;
|
||||
};
|
||||
|
||||
virtual int intersect_point(const Vector2 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, bool p_pick_point = false) = 0;
|
||||
virtual int intersect_point(const Vector2 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF, bool p_pick_point = false) = 0;
|
||||
|
||||
virtual int intersect_shape(const RID &p_shape, const Transform2D &p_xform, const Vector2 &p_motion, float p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
|
||||
virtual int intersect_shape(const RID &p_shape, const Transform2D &p_xform, const Vector2 &p_motion, float p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF) = 0;
|
||||
|
||||
virtual bool cast_motion(const RID &p_shape, const Transform2D &p_xform, const Vector2 &p_motion, float p_margin, float &p_closest_safe, float &p_closest_unsafe, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
|
||||
virtual bool cast_motion(const RID &p_shape, const Transform2D &p_xform, const Vector2 &p_motion, float p_margin, float &p_closest_safe, float &p_closest_unsafe, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF) = 0;
|
||||
|
||||
virtual bool collide_shape(RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, float p_margin, Vector2 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
|
||||
virtual bool collide_shape(RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, float p_margin, Vector2 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF) = 0;
|
||||
|
||||
struct ShapeRestInfo {
|
||||
|
||||
|
@ -196,13 +182,11 @@ public:
|
|||
Variant metadata;
|
||||
};
|
||||
|
||||
virtual bool rest_info(RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, float p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
|
||||
virtual bool rest_info(RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, float p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF) = 0;
|
||||
|
||||
Physics2DDirectSpaceState();
|
||||
};
|
||||
|
||||
VARIANT_ENUM_CAST(Physics2DDirectSpaceState::ObjectTypeMask);
|
||||
|
||||
class Physics2DShapeQueryResult : public Reference {
|
||||
|
||||
GDCLASS(Physics2DShapeQueryResult, Reference);
|
||||
|
|
|
@ -153,23 +153,15 @@ float PhysicsShapeQueryParameters::get_margin() const {
|
|||
return margin;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters::set_collision_layer(int p_collision_layer) {
|
||||
void PhysicsShapeQueryParameters::set_collision_mask(int p_collision_mask) {
|
||||
|
||||
collision_layer = p_collision_layer;
|
||||
collision_mask = p_collision_mask;
|
||||
}
|
||||
int PhysicsShapeQueryParameters::get_collision_layer() const {
|
||||
int PhysicsShapeQueryParameters::get_collision_mask() const {
|
||||
|
||||
return collision_layer;
|
||||
return collision_mask;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters::set_object_type_mask(int p_object_type_mask) {
|
||||
|
||||
object_type_mask = p_object_type_mask;
|
||||
}
|
||||
int PhysicsShapeQueryParameters::get_object_type_mask() const {
|
||||
|
||||
return object_type_mask;
|
||||
}
|
||||
void PhysicsShapeQueryParameters::set_exclude(const Vector<RID> &p_exclude) {
|
||||
|
||||
exclude.clear();
|
||||
|
@ -200,11 +192,8 @@ void PhysicsShapeQueryParameters::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_margin", "margin"), &PhysicsShapeQueryParameters::set_margin);
|
||||
ClassDB::bind_method(D_METHOD("get_margin"), &PhysicsShapeQueryParameters::get_margin);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collision_layer", "collision_layer"), &PhysicsShapeQueryParameters::set_collision_layer);
|
||||
ClassDB::bind_method(D_METHOD("get_collision_layer"), &PhysicsShapeQueryParameters::get_collision_layer);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_object_type_mask", "object_type_mask"), &PhysicsShapeQueryParameters::set_object_type_mask);
|
||||
ClassDB::bind_method(D_METHOD("get_object_type_mask"), &PhysicsShapeQueryParameters::get_object_type_mask);
|
||||
ClassDB::bind_method(D_METHOD("set_collision_mask", "collision_mask"), &PhysicsShapeQueryParameters::set_collision_mask);
|
||||
ClassDB::bind_method(D_METHOD("get_collision_mask"), &PhysicsShapeQueryParameters::get_collision_mask);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_exclude", "exclude"), &PhysicsShapeQueryParameters::set_exclude);
|
||||
ClassDB::bind_method(D_METHOD("get_exclude"), &PhysicsShapeQueryParameters::get_exclude);
|
||||
|
@ -213,8 +202,7 @@ void PhysicsShapeQueryParameters::_bind_methods() {
|
|||
PhysicsShapeQueryParameters::PhysicsShapeQueryParameters() {
|
||||
|
||||
margin = 0;
|
||||
collision_layer = 0x7FFFFFFF;
|
||||
object_type_mask = PhysicsDirectSpaceState::TYPE_MASK_COLLISION;
|
||||
collision_mask = 0x7FFFFFFF;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
|
@ -249,14 +237,14 @@ Variant PhysicsDirectSpaceState::_intersect_shape(const RID& p_shape, const Tran
|
|||
}
|
||||
*/
|
||||
|
||||
Dictionary PhysicsDirectSpaceState::_intersect_ray(const Vector3 &p_from, const Vector3 &p_to, const Vector<RID> &p_exclude, uint32_t p_layers, uint32_t p_object_type_mask) {
|
||||
Dictionary PhysicsDirectSpaceState::_intersect_ray(const Vector3 &p_from, const Vector3 &p_to, const Vector<RID> &p_exclude, uint32_t p_collision_mask) {
|
||||
|
||||
RayResult inters;
|
||||
Set<RID> exclude;
|
||||
for (int i = 0; i < p_exclude.size(); i++)
|
||||
exclude.insert(p_exclude[i]);
|
||||
|
||||
bool res = intersect_ray(p_from, p_to, inters, exclude, p_layers, p_object_type_mask);
|
||||
bool res = intersect_ray(p_from, p_to, inters, exclude, p_collision_mask);
|
||||
|
||||
if (!res)
|
||||
return Dictionary();
|
||||
|
@ -276,7 +264,7 @@ Array PhysicsDirectSpaceState::_intersect_shape(const Ref<PhysicsShapeQueryParam
|
|||
|
||||
Vector<ShapeResult> sr;
|
||||
sr.resize(p_max_results);
|
||||
int rc = intersect_shape(p_shape_query->shape, p_shape_query->transform, p_shape_query->margin, sr.ptr(), sr.size(), p_shape_query->exclude, p_shape_query->collision_layer, p_shape_query->object_type_mask);
|
||||
int rc = intersect_shape(p_shape_query->shape, p_shape_query->transform, p_shape_query->margin, sr.ptr(), sr.size(), p_shape_query->exclude, p_shape_query->collision_mask);
|
||||
Array ret;
|
||||
ret.resize(rc);
|
||||
for (int i = 0; i < rc; i++) {
|
||||
|
@ -295,7 +283,7 @@ Array PhysicsDirectSpaceState::_intersect_shape(const Ref<PhysicsShapeQueryParam
|
|||
Array PhysicsDirectSpaceState::_cast_motion(const Ref<PhysicsShapeQueryParameters> &p_shape_query, const Vector3 &p_motion) {
|
||||
|
||||
float closest_safe, closest_unsafe;
|
||||
bool res = cast_motion(p_shape_query->shape, p_shape_query->transform, p_motion, p_shape_query->margin, closest_safe, closest_unsafe, p_shape_query->exclude, p_shape_query->collision_layer, p_shape_query->object_type_mask);
|
||||
bool res = cast_motion(p_shape_query->shape, p_shape_query->transform, p_motion, p_shape_query->margin, closest_safe, closest_unsafe, p_shape_query->exclude, p_shape_query->collision_mask);
|
||||
if (!res)
|
||||
return Array();
|
||||
Array ret;
|
||||
|
@ -309,7 +297,7 @@ Array PhysicsDirectSpaceState::_collide_shape(const Ref<PhysicsShapeQueryParamet
|
|||
Vector<Vector3> ret;
|
||||
ret.resize(p_max_results * 2);
|
||||
int rc = 0;
|
||||
bool res = collide_shape(p_shape_query->shape, p_shape_query->transform, p_shape_query->margin, ret.ptr(), p_max_results, rc, p_shape_query->exclude, p_shape_query->collision_layer, p_shape_query->object_type_mask);
|
||||
bool res = collide_shape(p_shape_query->shape, p_shape_query->transform, p_shape_query->margin, ret.ptr(), p_max_results, rc, p_shape_query->exclude, p_shape_query->collision_mask);
|
||||
if (!res)
|
||||
return Array();
|
||||
Array r;
|
||||
|
@ -322,7 +310,7 @@ Dictionary PhysicsDirectSpaceState::_get_rest_info(const Ref<PhysicsShapeQueryPa
|
|||
|
||||
ShapeRestInfo sri;
|
||||
|
||||
bool res = rest_info(p_shape_query->shape, p_shape_query->transform, p_shape_query->margin, &sri, p_shape_query->exclude, p_shape_query->collision_layer, p_shape_query->object_type_mask);
|
||||
bool res = rest_info(p_shape_query->shape, p_shape_query->transform, p_shape_query->margin, &sri, p_shape_query->exclude, p_shape_query->collision_mask);
|
||||
Dictionary r;
|
||||
if (!res)
|
||||
return r;
|
||||
|
@ -345,18 +333,11 @@ void PhysicsDirectSpaceState::_bind_methods() {
|
|||
//ClassDB::bind_method(D_METHOD("intersect_ray","from","to","exclude","umask"),&PhysicsDirectSpaceState::_intersect_ray,DEFVAL(Array()),DEFVAL(0));
|
||||
//ClassDB::bind_method(D_METHOD("intersect_shape","shape","xform","result_max","exclude","umask"),&PhysicsDirectSpaceState::_intersect_shape,DEFVAL(Array()),DEFVAL(0));
|
||||
|
||||
ClassDB::bind_method(D_METHOD("intersect_ray", "from", "to", "exclude", "collision_layer", "type_mask"), &PhysicsDirectSpaceState::_intersect_ray, DEFVAL(Array()), DEFVAL(0x7FFFFFFF), DEFVAL(TYPE_MASK_COLLISION));
|
||||
ClassDB::bind_method(D_METHOD("intersect_ray", "from", "to", "exclude", "collision_layer"), &PhysicsDirectSpaceState::_intersect_ray, DEFVAL(Array()), DEFVAL(0x7FFFFFFF));
|
||||
ClassDB::bind_method(D_METHOD("intersect_shape", "shape", "max_results"), &PhysicsDirectSpaceState::_intersect_shape, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("cast_motion", "shape", "motion"), &PhysicsDirectSpaceState::_cast_motion);
|
||||
ClassDB::bind_method(D_METHOD("collide_shape", "shape", "max_results"), &PhysicsDirectSpaceState::_collide_shape, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("get_rest_info", "shape"), &PhysicsDirectSpaceState::_get_rest_info);
|
||||
|
||||
BIND_ENUM_CONSTANT(TYPE_MASK_STATIC_BODY);
|
||||
BIND_ENUM_CONSTANT(TYPE_MASK_KINEMATIC_BODY);
|
||||
BIND_ENUM_CONSTANT(TYPE_MASK_RIGID_BODY);
|
||||
BIND_ENUM_CONSTANT(TYPE_MASK_CHARACTER_BODY);
|
||||
BIND_ENUM_CONSTANT(TYPE_MASK_COLLISION);
|
||||
BIND_ENUM_CONSTANT(TYPE_MASK_AREA);
|
||||
}
|
||||
|
||||
int PhysicsShapeQueryResult::get_result_count() const {
|
||||
|
|
|
@ -101,8 +101,7 @@ class PhysicsShapeQueryParameters : public Reference {
|
|||
Transform transform;
|
||||
float margin;
|
||||
Set<RID> exclude;
|
||||
uint32_t collision_layer;
|
||||
uint32_t object_type_mask;
|
||||
uint32_t collision_mask;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
@ -118,11 +117,8 @@ public:
|
|||
void set_margin(float p_margin);
|
||||
float get_margin() const;
|
||||
|
||||
void set_collision_layer(int p_collision_layer);
|
||||
int get_collision_layer() const;
|
||||
|
||||
void set_object_type_mask(int p_object_type_mask);
|
||||
int get_object_type_mask() const;
|
||||
void set_collision_mask(int p_collision_layer);
|
||||
int get_collision_mask() const;
|
||||
|
||||
void set_exclude(const Vector<RID> &p_exclude);
|
||||
Vector<RID> get_exclude() const;
|
||||
|
@ -134,18 +130,8 @@ class PhysicsDirectSpaceState : public Object {
|
|||
|
||||
GDCLASS(PhysicsDirectSpaceState, Object);
|
||||
|
||||
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);
|
||||
Dictionary _intersect_ray(const Vector3 &p_from, const Vector3 &p_to, const Vector<RID> &p_exclude = Vector<RID>(), uint32_t p_collision_mask = 0);
|
||||
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);
|
||||
|
@ -163,7 +149,7 @@ public:
|
|||
int shape;
|
||||
};
|
||||
|
||||
virtual int intersect_point(const Vector3 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
|
||||
virtual int intersect_point(const Vector3 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = 0xFFFFFFFF) = 0;
|
||||
|
||||
struct RayResult {
|
||||
|
||||
|
@ -175,9 +161,9 @@ 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_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, bool p_pick_ray = false) = 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_collision_mask = 0xFFFFFFFF, bool p_pick_ray = false) = 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_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 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_collision_mask = 0xFFFFFFFF) = 0;
|
||||
|
||||
struct ShapeRestInfo {
|
||||
|
||||
|
@ -189,19 +175,17 @@ public:
|
|||
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_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, ShapeRestInfo *r_info = NULL) = 0;
|
||||
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_collision_mask = 0xFFFFFFFF, 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_collision_layer = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 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_collision_mask = 0xFFFFFFFF) = 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_collision_layer = 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_collision_mask = 0xFFFFFFFF) = 0;
|
||||
|
||||
virtual Vector3 get_closest_point_to_object_volume(RID p_object, const Vector3 p_point) const = 0;
|
||||
|
||||
PhysicsDirectSpaceState();
|
||||
};
|
||||
|
||||
VARIANT_ENUM_CAST(PhysicsDirectSpaceState::ObjectTypeMask);
|
||||
|
||||
class PhysicsShapeQueryResult : public Reference {
|
||||
|
||||
GDCLASS(PhysicsShapeQueryResult, Reference);
|
||||
|
|
Loading…
Reference in a new issue