Merge pull request #6090 from WalasPrime/raytrace_force
Added force_raycast_update GDScript method for RayCast[2D]
This commit is contained in:
commit
afd86ee240
|
@ -31871,6 +31871,8 @@
|
||||||
RayCast can ignore some objects by adding them to the exception list via [code]add_exception[/code], setting proper filtering with layers, or by filtering object types with type masks.
|
RayCast can ignore some objects by adding them to the exception list via [code]add_exception[/code], setting proper filtering with layers, or by filtering object types with type masks.
|
||||||
|
|
||||||
Only enabled raycasts will be able to query the space and report collisions!
|
Only enabled raycasts will be able to query the space and report collisions!
|
||||||
|
|
||||||
|
RayCast calculates intersection every fixed frame (see [Node]), and the result is cached so it can be used later until the next frame. If multiple queries are required between fixed frames (or during the same frame) use [method force_raycast_update] after adjusting the raycast.
|
||||||
</description>
|
</description>
|
||||||
<methods>
|
<methods>
|
||||||
<method name="add_exception">
|
<method name="add_exception">
|
||||||
|
@ -31891,6 +31893,11 @@
|
||||||
Removes all collision exception for this ray.
|
Removes all collision exception for this ray.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="force_raycast_update">
|
||||||
|
<description>
|
||||||
|
Updates the collision information in case if this object's properties changed during the current frame (for example position, rotation or the cast_point). Note, [code]set_enabled[/code] is not required for this to work.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="get_cast_to" qualifiers="const">
|
<method name="get_cast_to" qualifiers="const">
|
||||||
<return type="Vector3">
|
<return type="Vector3">
|
||||||
</return>
|
</return>
|
||||||
|
@ -32009,6 +32016,8 @@
|
||||||
RayCast2D can ignore some objects by adding them to the exception list via [code]add_exception[/code], setting proper filtering with layers, or by filtering object types with type masks.
|
RayCast2D can ignore some objects by adding them to the exception list via [code]add_exception[/code], setting proper filtering with layers, or by filtering object types with type masks.
|
||||||
|
|
||||||
Only enabled raycasts will be able to query the space and report collisions!
|
Only enabled raycasts will be able to query the space and report collisions!
|
||||||
|
|
||||||
|
RayCast2D calculates intersection every fixed frame (see [Node]), and the result is cached so it can be used later until the next frame. If multiple queries are required between fixed frames (or during the same frame) use [method force_raycast_update] after adjusting the raycast.
|
||||||
</description>
|
</description>
|
||||||
<methods>
|
<methods>
|
||||||
<method name="add_exception">
|
<method name="add_exception">
|
||||||
|
@ -32029,6 +32038,11 @@
|
||||||
Removes all collision exception for this ray.
|
Removes all collision exception for this ray.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="force_raycast_update">
|
||||||
|
<description>
|
||||||
|
Updates the collision information in case if this object's properties changed during the current frame (for example position, rotation or the cast_point). Note, [code]set_enabled[/code] is not required for this to work.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="get_cast_to" qualifiers="const">
|
<method name="get_cast_to" qualifiers="const">
|
||||||
<return type="Vector2">
|
<return type="Vector2">
|
||||||
</return>
|
</return>
|
||||||
|
|
|
@ -187,39 +187,44 @@ void RayCast2D::_notification(int p_what) {
|
||||||
if (!enabled)
|
if (!enabled)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
_update_raycast_state();
|
||||||
|
|
||||||
Ref<World2D> w2d = get_world_2d();
|
|
||||||
ERR_BREAK( w2d.is_null() );
|
|
||||||
|
|
||||||
Physics2DDirectSpaceState *dss = Physics2DServer::get_singleton()->space_get_direct_state(w2d->get_space());
|
|
||||||
ERR_BREAK( !dss );
|
|
||||||
|
|
||||||
Matrix32 gt = get_global_transform();
|
|
||||||
|
|
||||||
Vector2 to = cast_to;
|
|
||||||
if (to==Vector2())
|
|
||||||
to=Vector2(0,0.01);
|
|
||||||
|
|
||||||
Physics2DDirectSpaceState::RayResult rr;
|
|
||||||
|
|
||||||
if (dss->intersect_ray(gt.get_origin(),gt.xform(to),rr,exclude,layer_mask,type_mask)) {
|
|
||||||
|
|
||||||
collided=true;
|
|
||||||
against=rr.collider_id;
|
|
||||||
collision_point=rr.position;
|
|
||||||
collision_normal=rr.normal;
|
|
||||||
against_shape=rr.shape;
|
|
||||||
} else {
|
|
||||||
collided=false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RayCast2D::_update_raycast_state() {
|
||||||
|
Ref<World2D> w2d = get_world_2d();
|
||||||
|
ERR_FAIL_COND( w2d.is_null() );
|
||||||
|
|
||||||
|
Physics2DDirectSpaceState *dss = Physics2DServer::get_singleton()->space_get_direct_state(w2d->get_space());
|
||||||
|
ERR_FAIL_COND( !dss );
|
||||||
|
|
||||||
|
Matrix32 gt = get_global_transform();
|
||||||
|
|
||||||
|
Vector2 to = cast_to;
|
||||||
|
if (to==Vector2())
|
||||||
|
to=Vector2(0,0.01);
|
||||||
|
|
||||||
|
Physics2DDirectSpaceState::RayResult rr;
|
||||||
|
|
||||||
|
if (dss->intersect_ray(gt.get_origin(),gt.xform(to),rr,exclude,layer_mask,type_mask)) {
|
||||||
|
|
||||||
|
collided=true;
|
||||||
|
against=rr.collider_id;
|
||||||
|
collision_point=rr.position;
|
||||||
|
collision_normal=rr.normal;
|
||||||
|
against_shape=rr.shape;
|
||||||
|
} else {
|
||||||
|
collided=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RayCast2D::force_raycast_update() {
|
||||||
|
_update_raycast_state();
|
||||||
|
}
|
||||||
|
|
||||||
void RayCast2D::add_exception_rid(const RID& p_rid) {
|
void RayCast2D::add_exception_rid(const RID& p_rid) {
|
||||||
|
|
||||||
exclude.insert(p_rid);
|
exclude.insert(p_rid);
|
||||||
|
@ -265,6 +270,7 @@ void RayCast2D::_bind_methods() {
|
||||||
ObjectTypeDB::bind_method(_MD("get_cast_to"),&RayCast2D::get_cast_to);
|
ObjectTypeDB::bind_method(_MD("get_cast_to"),&RayCast2D::get_cast_to);
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("is_colliding"),&RayCast2D::is_colliding);
|
ObjectTypeDB::bind_method(_MD("is_colliding"),&RayCast2D::is_colliding);
|
||||||
|
ObjectTypeDB::bind_method(_MD("force_raycast_update"),&RayCast2D::force_raycast_update);
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("get_collider"),&RayCast2D::get_collider);
|
ObjectTypeDB::bind_method(_MD("get_collider"),&RayCast2D::get_collider);
|
||||||
ObjectTypeDB::bind_method(_MD("get_collider_shape"),&RayCast2D::get_collider_shape);
|
ObjectTypeDB::bind_method(_MD("get_collider_shape"),&RayCast2D::get_collider_shape);
|
||||||
|
|
|
@ -52,6 +52,7 @@ class RayCast2D : public Node2D {
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
|
void _update_raycast_state();
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -70,6 +71,8 @@ public:
|
||||||
void set_exclude_parent_body(bool p_exclude_parent_body);
|
void set_exclude_parent_body(bool p_exclude_parent_body);
|
||||||
bool get_exclude_parent_body() const;
|
bool get_exclude_parent_body() const;
|
||||||
|
|
||||||
|
void force_raycast_update();
|
||||||
|
|
||||||
bool is_colliding() const;
|
bool is_colliding() const;
|
||||||
Object *get_collider() const;
|
Object *get_collider() const;
|
||||||
int get_collider_shape() const;
|
int get_collider_shape() const;
|
||||||
|
|
|
@ -134,39 +134,44 @@ void RayCast::_notification(int p_what) {
|
||||||
if (!enabled)
|
if (!enabled)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
_update_raycast_state();
|
||||||
|
|
||||||
Ref<World> w3d = get_world();
|
|
||||||
ERR_BREAK( w3d.is_null() );
|
|
||||||
|
|
||||||
PhysicsDirectSpaceState *dss = PhysicsServer::get_singleton()->space_get_direct_state(w3d->get_space());
|
|
||||||
ERR_BREAK( !dss );
|
|
||||||
|
|
||||||
Transform gt = get_global_transform();
|
|
||||||
|
|
||||||
Vector3 to = cast_to;
|
|
||||||
if (to==Vector3())
|
|
||||||
to=Vector3(0,0.01,0);
|
|
||||||
|
|
||||||
PhysicsDirectSpaceState::RayResult rr;
|
|
||||||
|
|
||||||
if (dss->intersect_ray(gt.get_origin(),gt.xform(to),rr,exclude, layer_mask, type_mask)) {
|
|
||||||
|
|
||||||
collided=true;
|
|
||||||
against=rr.collider_id;
|
|
||||||
collision_point=rr.position;
|
|
||||||
collision_normal=rr.normal;
|
|
||||||
against_shape=rr.shape;
|
|
||||||
} else {
|
|
||||||
collided=false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RayCast::_update_raycast_state(){
|
||||||
|
Ref<World> w3d = get_world();
|
||||||
|
ERR_FAIL_COND( w3d.is_null() );
|
||||||
|
|
||||||
|
PhysicsDirectSpaceState *dss = PhysicsServer::get_singleton()->space_get_direct_state(w3d->get_space());
|
||||||
|
ERR_FAIL_COND( !dss );
|
||||||
|
|
||||||
|
Transform gt = get_global_transform();
|
||||||
|
|
||||||
|
Vector3 to = cast_to;
|
||||||
|
if (to==Vector3())
|
||||||
|
to=Vector3(0,0.01,0);
|
||||||
|
|
||||||
|
PhysicsDirectSpaceState::RayResult rr;
|
||||||
|
|
||||||
|
if (dss->intersect_ray(gt.get_origin(),gt.xform(to),rr,exclude, layer_mask, type_mask)) {
|
||||||
|
|
||||||
|
collided=true;
|
||||||
|
against=rr.collider_id;
|
||||||
|
collision_point=rr.position;
|
||||||
|
collision_normal=rr.normal;
|
||||||
|
against_shape=rr.shape;
|
||||||
|
} else {
|
||||||
|
collided=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RayCast::force_raycast_update() {
|
||||||
|
_update_raycast_state();
|
||||||
|
}
|
||||||
|
|
||||||
void RayCast::add_exception_rid(const RID& p_rid) {
|
void RayCast::add_exception_rid(const RID& p_rid) {
|
||||||
|
|
||||||
exclude.insert(p_rid);
|
exclude.insert(p_rid);
|
||||||
|
@ -212,6 +217,7 @@ void RayCast::_bind_methods() {
|
||||||
ObjectTypeDB::bind_method(_MD("get_cast_to"),&RayCast::get_cast_to);
|
ObjectTypeDB::bind_method(_MD("get_cast_to"),&RayCast::get_cast_to);
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("is_colliding"),&RayCast::is_colliding);
|
ObjectTypeDB::bind_method(_MD("is_colliding"),&RayCast::is_colliding);
|
||||||
|
ObjectTypeDB::bind_method(_MD("force_raycast_update"),&RayCast::force_raycast_update);
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("get_collider"),&RayCast::get_collider);
|
ObjectTypeDB::bind_method(_MD("get_collider"),&RayCast::get_collider);
|
||||||
ObjectTypeDB::bind_method(_MD("get_collider_shape"),&RayCast::get_collider_shape);
|
ObjectTypeDB::bind_method(_MD("get_collider_shape"),&RayCast::get_collider_shape);
|
||||||
|
|
|
@ -53,6 +53,7 @@ class RayCast : public Spatial {
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
|
void _update_raycast_state();
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -68,6 +69,7 @@ public:
|
||||||
void set_type_mask(uint32_t p_mask);
|
void set_type_mask(uint32_t p_mask);
|
||||||
uint32_t get_type_mask() const;
|
uint32_t get_type_mask() const;
|
||||||
|
|
||||||
|
void force_raycast_update();
|
||||||
bool is_colliding() const;
|
bool is_colliding() const;
|
||||||
Object *get_collider() const;
|
Object *get_collider() const;
|
||||||
int get_collider_shape() const;
|
int get_collider_shape() const;
|
||||||
|
|
Loading…
Reference in New Issue