diff options
author | Juan Linietsky <reduzio@gmail.com> | 2018-08-21 14:26:19 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-21 14:26:19 -0300 |
commit | 44d75e3b6d2565e13e4f49d21d5e00dfcc99afd9 (patch) | |
tree | 98406e16cd768b67769d714f1cca94a9396ef82f /scene | |
parent | e20864c3408ff270b97ea44e806209221323788a (diff) | |
parent | c153489e25752efcc433f5d04d2c7fca9f3e97d5 (diff) |
Merge pull request #21266 from AndreaCatania/master
Added area / body collision exception in raycast
Diffstat (limited to 'scene')
-rw-r--r-- | scene/3d/ray_cast.cpp | 32 | ||||
-rw-r--r-- | scene/3d/ray_cast.h | 8 |
2 files changed, 39 insertions, 1 deletions
diff --git a/scene/3d/ray_cast.cpp b/scene/3d/ray_cast.cpp index 7f83e2c3ea..e1897c0187 100644 --- a/scene/3d/ray_cast.cpp +++ b/scene/3d/ray_cast.cpp @@ -49,6 +49,26 @@ Vector3 RayCast::get_cast_to() const { return cast_to; } +void RayCast::set_collide_with_bodies(bool p_enable) { + + collide_with_bodies = p_enable; +} + +bool RayCast::get_collide_with_bodies() const { + + return collide_with_bodies; +} + +void RayCast::set_collide_with_areas(bool p_enable) { + + collide_with_areas = p_enable; +} + +bool RayCast::get_collide_with_areas() const { + + return collide_with_areas; +} + void RayCast::set_collision_mask(uint32_t p_mask) { collision_mask = p_mask; @@ -208,7 +228,7 @@ void RayCast::_update_raycast_state() { PhysicsDirectSpaceState::RayResult rr; - if (dss->intersect_ray(gt.get_origin(), gt.xform(to), rr, exclude, collision_mask)) { + if (dss->intersect_ray(gt.get_origin(), gt.xform(to), rr, exclude, collision_mask, collide_with_bodies, collide_with_areas)) { collided = true; against = rr.collider_id; @@ -267,6 +287,12 @@ void RayCast::_bind_methods() { ClassDB::bind_method(D_METHOD("set_cast_to", "local_point"), &RayCast::set_cast_to); ClassDB::bind_method(D_METHOD("get_cast_to"), &RayCast::get_cast_to); + ClassDB::bind_method(D_METHOD("set_collide_with_bodies", "enable"), &RayCast::set_collide_with_bodies); + ClassDB::bind_method(D_METHOD("get_collide_with_bodies"), &RayCast::get_collide_with_bodies); + + ClassDB::bind_method(D_METHOD("set_collide_with_areas", "enable"), &RayCast::set_collide_with_areas); + ClassDB::bind_method(D_METHOD("get_collide_with_areas"), &RayCast::get_collide_with_areas); + ClassDB::bind_method(D_METHOD("is_colliding"), &RayCast::is_colliding); ClassDB::bind_method(D_METHOD("force_raycast_update"), &RayCast::force_raycast_update); @@ -295,6 +321,8 @@ void RayCast::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enabled"), "set_enabled", "is_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "exclude_parent"), "set_exclude_parent_body", "get_exclude_parent_body"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "cast_to"), "set_cast_to", "get_cast_to"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_bodies"), "set_collide_with_bodies", "get_collide_with_bodies"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_areas"), "set_collide_with_areas", "get_collide_with_areas"); ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask"); } @@ -368,6 +396,8 @@ RayCast::RayCast() { against_shape = 0; collision_mask = 1; cast_to = Vector3(0, -1, 0); + collide_with_bodies = true; + collide_with_areas = false; debug_shape = NULL; exclude_parent_body = true; } diff --git a/scene/3d/ray_cast.h b/scene/3d/ray_cast.h index 20cea80700..417cb884cc 100644 --- a/scene/3d/ray_cast.h +++ b/scene/3d/ray_cast.h @@ -45,6 +45,8 @@ class RayCast : public Spatial { Vector3 collision_normal; Vector3 cast_to; + bool collide_with_bodies; + bool collide_with_areas; Set<RID> exclude; @@ -70,6 +72,12 @@ public: void set_cast_to(const Vector3 &p_point); Vector3 get_cast_to() const; + void set_collide_with_bodies(bool p_enable); + bool get_collide_with_bodies() const; + + void set_collide_with_areas(bool p_enable); + bool get_collide_with_areas() const; + void set_collision_mask(uint32_t p_mask); uint32_t get_collision_mask() const; |