Merge pull request #54577 from nekomatata/intersect-point-3d-3.x
This commit is contained in:
commit
ee46679ca3
4 changed files with 60 additions and 2 deletions
|
@ -58,7 +58,8 @@
|
|||
[code]metadata[/code]: The intersecting shape's metadata. This metadata is different from [method Object.get_meta], and is set with [method Physics2DServer.shape_set_data].
|
||||
[code]rid[/code]: The intersecting object's [RID].
|
||||
[code]shape[/code]: The shape index of the colliding shape.
|
||||
Additionally, the method can take an [code]exclude[/code] array of objects or [RID]s that are to be excluded from collisions, a [code]collision_mask[/code] bitmask representing the physics layers to check in, or booleans to determine if the ray should collide with [PhysicsBody]s or [Area]s, respectively.
|
||||
The number of intersections can be limited with the [code]max_results[/code] parameter, to reduce the processing time.
|
||||
Additionally, the method can take an [code]exclude[/code] array of objects or [RID]s that are to be excluded from collisions, a [code]collision_mask[/code] bitmask representing the physics layers to check in, or booleans to determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, respectively.
|
||||
[b]Note:[/b] [ConcavePolygonShape2D]s and [CollisionPolygon2D]s in [code]Segments[/code] build mode are not solid shapes. Therefore, they will not be detected.
|
||||
</description>
|
||||
</method>
|
||||
|
@ -72,6 +73,15 @@
|
|||
<argument index="5" name="collide_with_bodies" type="bool" default="true" />
|
||||
<argument index="6" name="collide_with_areas" type="bool" default="false" />
|
||||
<description>
|
||||
Checks whether a point is inside any solid shape, in a specific canvas layer given by [code]canvas_instance_id[/code]. The shapes the point is inside of are returned in an array containing dictionaries with the following fields:
|
||||
[code]collider[/code]: The colliding object.
|
||||
[code]collider_id[/code]: The colliding object's ID.
|
||||
[code]metadata[/code]: The intersecting shape's metadata. This metadata is different from [method Object.get_meta], and is set with [method Physics2DServer.shape_set_data].
|
||||
[code]rid[/code]: The intersecting object's [RID].
|
||||
[code]shape[/code]: The shape index of the colliding shape.
|
||||
The number of intersections can be limited with the [code]max_results[/code] parameter, to reduce the processing time.
|
||||
Additionally, the method can take an [code]exclude[/code] array of objects or [RID]s that are to be excluded from collisions, a [code]collision_mask[/code] bitmask representing the physics layers to check in, or booleans to determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, respectively.
|
||||
[b]Note:[/b] [ConcavePolygonShape2D]s and [CollisionPolygon2D]s in [code]Segments[/code] build mode are not solid shapes. Therefore, they will not be detected.
|
||||
</description>
|
||||
</method>
|
||||
<method name="intersect_ray">
|
||||
|
@ -92,7 +102,7 @@
|
|||
[code]rid[/code]: The intersecting object's [RID].
|
||||
[code]shape[/code]: The shape index of the colliding shape.
|
||||
If the ray did not intersect anything, then an empty dictionary is returned instead.
|
||||
Additionally, the method can take an [code]exclude[/code] array of objects or [RID]s that are to be excluded from collisions, a [code]collision_mask[/code] bitmask representing the physics layers to check in, or booleans to determine if the ray should collide with [PhysicsBody]s or [Area]s, respectively.
|
||||
Additionally, the method can take an [code]exclude[/code] array of objects or [RID]s that are to be excluded from collisions, a [code]collision_mask[/code] bitmask representing the physics layers to check in, or booleans to determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, respectively.
|
||||
</description>
|
||||
</method>
|
||||
<method name="intersect_shape">
|
||||
|
|
|
@ -43,6 +43,24 @@
|
|||
If the shape did not intersect anything, then an empty dictionary is returned instead.
|
||||
</description>
|
||||
</method>
|
||||
<method name="intersect_point">
|
||||
<return type="Array" />
|
||||
<argument index="0" name="point" type="Vector3" />
|
||||
<argument index="1" name="max_results" type="int" default="32" />
|
||||
<argument index="2" name="exclude" type="Array" default="[ ]" />
|
||||
<argument index="3" name="collision_layer" type="int" default="2147483647" />
|
||||
<argument index="4" name="collide_with_bodies" type="bool" default="true" />
|
||||
<argument index="5" name="collide_with_areas" type="bool" default="false" />
|
||||
<description>
|
||||
Checks whether a point is inside any solid shape. The shapes the point is inside of are returned in an array containing dictionaries with the following fields:
|
||||
[code]collider[/code]: The colliding object.
|
||||
[code]collider_id[/code]: The colliding object's ID.
|
||||
[code]rid[/code]: The intersecting object's [RID].
|
||||
[code]shape[/code]: The shape index of the colliding shape.
|
||||
The number of intersections can be limited with the [code]max_results[/code] parameter, to reduce the processing time.
|
||||
Additionally, the method can take an [code]exclude[/code] array of objects or [RID]s that are to be excluded from collisions, a [code]collision_mask[/code] bitmask representing the physics layers to check in, or booleans to determine if the ray should collide with [PhysicsBody]s or [Area]s, respectively.
|
||||
</description>
|
||||
</method>
|
||||
<method name="intersect_ray">
|
||||
<return type="Dictionary" />
|
||||
<argument index="0" name="from" type="Vector3" />
|
||||
|
|
|
@ -273,6 +273,34 @@ Dictionary PhysicsDirectSpaceState::_intersect_ray(const Vector3 &p_from, const
|
|||
return d;
|
||||
}
|
||||
|
||||
Array PhysicsDirectSpaceState::_intersect_point(const Vector3 &p_point, int p_max_results, const Vector<RID> &p_exclude, uint32_t p_layers, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
Set<RID> exclude;
|
||||
for (int i = 0; i < p_exclude.size(); i++) {
|
||||
exclude.insert(p_exclude[i]);
|
||||
}
|
||||
|
||||
Vector<ShapeResult> ret;
|
||||
ret.resize(p_max_results);
|
||||
|
||||
int rc = intersect_point(p_point, ret.ptrw(), ret.size(), exclude, p_layers, p_collide_with_bodies, p_collide_with_areas);
|
||||
|
||||
if (rc == 0) {
|
||||
return Array();
|
||||
}
|
||||
|
||||
Array r;
|
||||
r.resize(rc);
|
||||
for (int i = 0; i < rc; i++) {
|
||||
Dictionary d;
|
||||
d["rid"] = ret[i].rid;
|
||||
d["collider_id"] = ret[i].collider_id;
|
||||
d["collider"] = ret[i].collider;
|
||||
d["shape"] = ret[i].shape;
|
||||
r[i] = d;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
Array PhysicsDirectSpaceState::_intersect_shape(const Ref<PhysicsShapeQueryParameters> &p_shape_query, int p_max_results) {
|
||||
ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
|
||||
|
||||
|
@ -349,6 +377,7 @@ PhysicsDirectSpaceState::PhysicsDirectSpaceState() {
|
|||
}
|
||||
|
||||
void PhysicsDirectSpaceState::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("intersect_point", "point", "max_results", "exclude", "collision_layer", "collide_with_bodies", "collide_with_areas"), &PhysicsDirectSpaceState::_intersect_point, DEFVAL(32), DEFVAL(Array()), DEFVAL(0x7FFFFFFF), DEFVAL(true), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("intersect_ray", "from", "to", "exclude", "collision_mask", "collide_with_bodies", "collide_with_areas"), &PhysicsDirectSpaceState::_intersect_ray, DEFVAL(Array()), DEFVAL(0x7FFFFFFF), DEFVAL(true), DEFVAL(false));
|
||||
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);
|
||||
|
|
|
@ -143,6 +143,7 @@ class PhysicsDirectSpaceState : public Object {
|
|||
|
||||
private:
|
||||
Dictionary _intersect_ray(const Vector3 &p_from, const Vector3 &p_to, const Vector<RID> &p_exclude = Vector<RID>(), uint32_t p_collision_mask = 0, bool p_collide_with_bodies = true, bool p_collide_with_areas = false);
|
||||
Array _intersect_point(const Vector3 &p_point, int p_max_results = 32, const Vector<RID> &p_exclude = Vector<RID>(), uint32_t p_layers = 0, bool p_collide_with_bodies = true, bool p_collide_with_areas = false);
|
||||
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);
|
||||
|
|
Loading…
Reference in a new issue