mirror of
https://github.com/godotengine/godot.git
synced 2024-11-29 07:32:20 +00:00
Merge pull request #54573 from nekomatata/query-parameters
This commit is contained in:
commit
13aaa73124
@ -13,7 +13,7 @@
|
||||
<methods>
|
||||
<method name="cast_motion">
|
||||
<return type="Array" />
|
||||
<argument index="0" name="shape" type="PhysicsShapeQueryParameters2D" />
|
||||
<argument index="0" name="parameters" type="PhysicsShapeQueryParameters2D" />
|
||||
<description>
|
||||
Checks how far a [Shape2D] can move without colliding. All the parameters for the query, including the shape and the motion, are supplied through a [PhysicsShapeQueryParameters2D] object.
|
||||
Returns an array with the safe and unsafe proportions (between 0 and 1) of the motion. The safe proportion is the maximum fraction of the motion that can be made without a collision. The unsafe proportion is the minimum fraction of the distance that must be moved for a collision. If no collision is detected a result of [code][1.0, 1.0][/code] will be returned.
|
||||
@ -22,7 +22,7 @@
|
||||
</method>
|
||||
<method name="collide_shape">
|
||||
<return type="Array" />
|
||||
<argument index="0" name="shape" type="PhysicsShapeQueryParameters2D" />
|
||||
<argument index="0" name="parameters" type="PhysicsShapeQueryParameters2D" />
|
||||
<argument index="1" name="max_results" type="int" default="32" />
|
||||
<description>
|
||||
Checks the intersections of a shape, given through a [PhysicsShapeQueryParameters2D] object, against the space. The resulting array contains a list of points where the shape intersects another. Like with [method intersect_shape], the number of returned results can be limited to save processing time.
|
||||
@ -31,7 +31,7 @@
|
||||
</method>
|
||||
<method name="get_rest_info">
|
||||
<return type="Dictionary" />
|
||||
<argument index="0" name="shape" type="PhysicsShapeQueryParameters2D" />
|
||||
<argument index="0" name="parameters" type="PhysicsShapeQueryParameters2D" />
|
||||
<description>
|
||||
Checks the intersections of a shape, given through a [PhysicsShapeQueryParameters2D] object, against the space. If it collides with more than one shape, the nearest one is selected. If the shape did not intersect anything, then an empty dictionary is returned instead.
|
||||
[b]Note:[/b] This method does not take into account the [code]motion[/code] property of the object. The returned object is a dictionary containing the following fields:
|
||||
@ -45,51 +45,23 @@
|
||||
</method>
|
||||
<method name="intersect_point">
|
||||
<return type="Array" />
|
||||
<argument index="0" name="point" type="Vector2" />
|
||||
<argument index="0" name="parameters" type="PhysicsPointQueryParameters2D" />
|
||||
<argument index="1" name="max_results" type="int" default="32" />
|
||||
<argument index="2" name="exclude" type="Array" default="[]" />
|
||||
<argument index="3" name="collision_mask" type="int" default="4294967295" />
|
||||
<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:
|
||||
Checks whether a point is inside any solid shape. Position and other parameters are defined through [PhysicsPointQueryParameters2D]. 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.
|
||||
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 detect (all layers by default), 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_point_on_canvas">
|
||||
<return type="Array" />
|
||||
<argument index="0" name="point" type="Vector2" />
|
||||
<argument index="1" name="canvas_instance_id" type="int" />
|
||||
<argument index="2" name="max_results" type="int" default="32" />
|
||||
<argument index="3" name="exclude" type="Array" default="[]" />
|
||||
<argument index="4" name="collision_mask" type="int" default="4294967295" />
|
||||
<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]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 detect (all layers by default), or booleans to determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, respectively.
|
||||
The number of intersections can be limited with the [code]max_results[/code] parameter, to reduce the processing time.
|
||||
[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">
|
||||
<return type="Dictionary" />
|
||||
<argument index="0" name="from" type="Vector2" />
|
||||
<argument index="1" name="to" type="Vector2" />
|
||||
<argument index="2" name="exclude" type="Array" default="[]" />
|
||||
<argument index="3" name="collision_mask" type="int" default="4294967295" />
|
||||
<argument index="4" name="collide_with_bodies" type="bool" default="true" />
|
||||
<argument index="5" name="collide_with_areas" type="bool" default="false" />
|
||||
<argument index="0" name="parameters" type="PhysicsRayQueryParameters2D" />
|
||||
<description>
|
||||
Intersects a ray in a given space. The returned object is a dictionary with the following fields:
|
||||
Intersects a ray in a given space. Ray position and other parameters are defined through [PhysicsRayQueryParameters2D]. The returned object is a dictionary with the following fields:
|
||||
[code]collider[/code]: The colliding object.
|
||||
[code]collider_id[/code]: The colliding object's ID.
|
||||
[code]normal[/code]: The object's surface normal at the intersection point.
|
||||
@ -97,16 +69,14 @@
|
||||
[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 detect (all layers by default), or booleans to determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, respectively.
|
||||
</description>
|
||||
</method>
|
||||
<method name="intersect_shape">
|
||||
<return type="Array" />
|
||||
<argument index="0" name="shape" type="PhysicsShapeQueryParameters2D" />
|
||||
<argument index="0" name="parameters" type="PhysicsShapeQueryParameters2D" />
|
||||
<argument index="1" name="max_results" type="int" default="32" />
|
||||
<description>
|
||||
Checks the intersections of a shape, given through a [PhysicsShapeQueryParameters2D] object, against the space.
|
||||
[b]Note:[/b] This method does not take into account the [code]motion[/code] property of the object. The intersected shapes are returned in an array containing dictionaries with the following fields:
|
||||
Checks the intersections of a shape, given through a [PhysicsShapeQueryParameters2D] object, against the space. The intersected shapes 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].
|
||||
|
@ -13,8 +13,7 @@
|
||||
<methods>
|
||||
<method name="cast_motion">
|
||||
<return type="Array" />
|
||||
<argument index="0" name="shape" type="PhysicsShapeQueryParameters3D" />
|
||||
<argument index="1" name="motion" type="Vector3" />
|
||||
<argument index="0" name="parameters" type="PhysicsShapeQueryParameters3D" />
|
||||
<description>
|
||||
Checks how far a [Shape3D] can move without colliding. All the parameters for the query, including the shape, are supplied through a [PhysicsShapeQueryParameters3D] object.
|
||||
Returns an array with the safe and unsafe proportions (between 0 and 1) of the motion. The safe proportion is the maximum fraction of the motion that can be made without a collision. The unsafe proportion is the minimum fraction of the distance that must be moved for a collision. If no collision is detected a result of [code][1.0, 1.0][/code] will be returned.
|
||||
@ -23,16 +22,17 @@
|
||||
</method>
|
||||
<method name="collide_shape">
|
||||
<return type="Array" />
|
||||
<argument index="0" name="shape" type="PhysicsShapeQueryParameters3D" />
|
||||
<argument index="0" name="parameters" type="PhysicsShapeQueryParameters3D" />
|
||||
<argument index="1" name="max_results" type="int" default="32" />
|
||||
<description>
|
||||
Checks the intersections of a shape, given through a [PhysicsShapeQueryParameters3D] object, against the space. The resulting array contains a list of points where the shape intersects another. Like with [method intersect_shape], the number of returned results can be limited to save processing time.
|
||||
Returned points are a list of pairs of contact points. For each pair the first one is in the shape passed in [PhysicsShapeQueryParameters3D] object, second one is in the collided shape from the physics space.
|
||||
[b]Note:[/b] This method does not take into account the [code]motion[/code] property of the object.
|
||||
</description>
|
||||
</method>
|
||||
<method name="get_rest_info">
|
||||
<return type="Dictionary" />
|
||||
<argument index="0" name="shape" type="PhysicsShapeQueryParameters3D" />
|
||||
<argument index="0" name="parameters" type="PhysicsShapeQueryParameters3D" />
|
||||
<description>
|
||||
Checks the intersections of a shape, given through a [PhysicsShapeQueryParameters3D] object, against the space. If it collides with more than one shape, the nearest one is selected. The returned object is a dictionary containing the following fields:
|
||||
[code]collider_id[/code]: The colliding object's ID.
|
||||
@ -42,18 +42,27 @@
|
||||
[code]rid[/code]: The intersecting object's [RID].
|
||||
[code]shape[/code]: The shape index of the colliding shape.
|
||||
If the shape did not intersect anything, then an empty dictionary is returned instead.
|
||||
[b]Note:[/b] This method does not take into account the [code]motion[/code] property of the object.
|
||||
</description>
|
||||
</method>
|
||||
<method name="intersect_point">
|
||||
<return type="Array" />
|
||||
<argument index="0" name="parameters" type="PhysicsPointQueryParameters3D" />
|
||||
<argument index="1" name="max_results" type="int" default="32" />
|
||||
<description>
|
||||
Checks whether a point is inside any solid shape. Position and other parameters are defined through [PhysicsPointQueryParameters3D]. 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.
|
||||
</description>
|
||||
</method>
|
||||
<method name="intersect_ray">
|
||||
<return type="Dictionary" />
|
||||
<argument index="0" name="from" type="Vector3" />
|
||||
<argument index="1" name="to" type="Vector3" />
|
||||
<argument index="2" name="exclude" type="Array" default="[]" />
|
||||
<argument index="3" name="collision_mask" type="int" default="4294967295" />
|
||||
<argument index="4" name="collide_with_bodies" type="bool" default="true" />
|
||||
<argument index="5" name="collide_with_areas" type="bool" default="false" />
|
||||
<argument index="0" name="parameters" type="PhysicsRayQueryParameters3D" />
|
||||
<description>
|
||||
Intersects a ray in a given space. The returned object is a dictionary with the following fields:
|
||||
Intersects a ray in a given space. Ray position and other parameters are defined through [PhysicsRayQueryParameters3D]. The returned object is a dictionary with the following fields:
|
||||
[code]collider[/code]: The colliding object.
|
||||
[code]collider_id[/code]: The colliding object's ID.
|
||||
[code]normal[/code]: The object's surface normal at the intersection point.
|
||||
@ -61,12 +70,11 @@
|
||||
[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 detect (all layers by default), or booleans to determine if the ray should collide with [PhysicsBody3D]s or [Area3D]s, respectively.
|
||||
</description>
|
||||
</method>
|
||||
<method name="intersect_shape">
|
||||
<return type="Array" />
|
||||
<argument index="0" name="shape" type="PhysicsShapeQueryParameters3D" />
|
||||
<argument index="0" name="parameters" type="PhysicsShapeQueryParameters3D" />
|
||||
<argument index="1" name="max_results" type="int" default="32" />
|
||||
<description>
|
||||
Checks the intersections of a shape, given through a [PhysicsShapeQueryParameters3D] object, against the space. The intersected shapes are returned in an array containing dictionaries with the following fields:
|
||||
@ -75,6 +83,7 @@
|
||||
[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.
|
||||
[b]Note:[/b] This method does not take into account the [code]motion[/code] property of the object.
|
||||
</description>
|
||||
</method>
|
||||
</methods>
|
||||
|
31
doc/classes/PhysicsPointQueryParameters2D.xml
Normal file
31
doc/classes/PhysicsPointQueryParameters2D.xml
Normal file
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<class name="PhysicsPointQueryParameters2D" inherits="RefCounted" version="4.0">
|
||||
<brief_description>
|
||||
Parameters to be sent to a 2D point physics query.
|
||||
</brief_description>
|
||||
<description>
|
||||
This class contains the position and other parameters to be used for [method PhysicsDirectSpaceState2D.intersect_point].
|
||||
</description>
|
||||
<tutorials>
|
||||
</tutorials>
|
||||
<members>
|
||||
<member name="canvas_instance_id" type="int" setter="set_canvas_instance_id" getter="get_canvas_instance_id" default="0">
|
||||
If different from [code]0[/code], restricts the query to a specific canvas layer specified by its instance id. See [method Object.get_instance_id].
|
||||
</member>
|
||||
<member name="collide_with_areas" type="bool" setter="set_collide_with_areas" getter="is_collide_with_areas_enabled" default="false">
|
||||
If [code]true[/code], the query will take [Area2D]s into account.
|
||||
</member>
|
||||
<member name="collide_with_bodies" type="bool" setter="set_collide_with_bodies" getter="is_collide_with_bodies_enabled" default="true">
|
||||
If [code]true[/code], the query will take [PhysicsBody2D]s into account.
|
||||
</member>
|
||||
<member name="collision_mask" type="int" setter="set_collision_mask" getter="get_collision_mask" default="4294967295">
|
||||
The physics layers the query will detect (as a bitmask). By default, all collision layers are detected. See [url=https://docs.godotengine.org/en/latest/tutorials/physics/physics_introduction.html#collision-layers-and-masks]Collision layers and masks[/url] in the documentation for more information.
|
||||
</member>
|
||||
<member name="exclude" type="Array" setter="set_exclude" getter="get_exclude" default="[]">
|
||||
The list of objects or object [RID]s that will be excluded from collisions.
|
||||
</member>
|
||||
<member name="position" type="Vector2" setter="set_position" getter="get_position" default="Vector2(0, 0)">
|
||||
The position being queried for, in global coordinates.
|
||||
</member>
|
||||
</members>
|
||||
</class>
|
28
doc/classes/PhysicsPointQueryParameters3D.xml
Normal file
28
doc/classes/PhysicsPointQueryParameters3D.xml
Normal file
@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<class name="PhysicsPointQueryParameters3D" inherits="RefCounted" version="4.0">
|
||||
<brief_description>
|
||||
Parameters to be sent to a 3D point physics query.
|
||||
</brief_description>
|
||||
<description>
|
||||
This class contains the position and other parameters to be used for [method PhysicsDirectSpaceState3D.intersect_point].
|
||||
</description>
|
||||
<tutorials>
|
||||
</tutorials>
|
||||
<members>
|
||||
<member name="collide_with_areas" type="bool" setter="set_collide_with_areas" getter="is_collide_with_areas_enabled" default="false">
|
||||
If [code]true[/code], the query will take [Area3D]s into account.
|
||||
</member>
|
||||
<member name="collide_with_bodies" type="bool" setter="set_collide_with_bodies" getter="is_collide_with_bodies_enabled" default="true">
|
||||
If [code]true[/code], the query will take [PhysicsBody3D]s into account.
|
||||
</member>
|
||||
<member name="collision_mask" type="int" setter="set_collision_mask" getter="get_collision_mask" default="4294967295">
|
||||
The physics layers the query will detect (as a bitmask). By default, all collision layers are detected. See [url=https://docs.godotengine.org/en/latest/tutorials/physics/physics_introduction.html#collision-layers-and-masks]Collision layers and masks[/url] in the documentation for more information.
|
||||
</member>
|
||||
<member name="exclude" type="Array" setter="set_exclude" getter="get_exclude" default="[]">
|
||||
The list of objects or object [RID]s that will be excluded from collisions.
|
||||
</member>
|
||||
<member name="position" type="Vector3" setter="set_position" getter="get_position" default="Vector3(0, 0, 0)">
|
||||
The position being queried for, in global coordinates.
|
||||
</member>
|
||||
</members>
|
||||
</class>
|
31
doc/classes/PhysicsRayQueryParameters2D.xml
Normal file
31
doc/classes/PhysicsRayQueryParameters2D.xml
Normal file
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<class name="PhysicsRayQueryParameters2D" inherits="RefCounted" version="4.0">
|
||||
<brief_description>
|
||||
Parameters to be sent to a 2D ray physics query.
|
||||
</brief_description>
|
||||
<description>
|
||||
This class contains the ray position and other parameters to be used for [method PhysicsDirectSpaceState2D.intersect_ray].
|
||||
</description>
|
||||
<tutorials>
|
||||
</tutorials>
|
||||
<members>
|
||||
<member name="collide_with_areas" type="bool" setter="set_collide_with_areas" getter="is_collide_with_areas_enabled" default="false">
|
||||
If [code]true[/code], the query will take [Area2D]s into account.
|
||||
</member>
|
||||
<member name="collide_with_bodies" type="bool" setter="set_collide_with_bodies" getter="is_collide_with_bodies_enabled" default="true">
|
||||
If [code]true[/code], the query will take [PhysicsBody2D]s into account.
|
||||
</member>
|
||||
<member name="collision_mask" type="int" setter="set_collision_mask" getter="get_collision_mask" default="4294967295">
|
||||
The physics layers the query will detect (as a bitmask). By default, all collision layers are detected. See [url=https://docs.godotengine.org/en/latest/tutorials/physics/physics_introduction.html#collision-layers-and-masks]Collision layers and masks[/url] in the documentation for more information.
|
||||
</member>
|
||||
<member name="exclude" type="Array" setter="set_exclude" getter="get_exclude" default="[]">
|
||||
The list of objects or object [RID]s that will be excluded from collisions.
|
||||
</member>
|
||||
<member name="from" type="Vector2" setter="set_from" getter="get_from" default="Vector2(0, 0)">
|
||||
The starting point of the ray being queried for, in global coordinates.
|
||||
</member>
|
||||
<member name="to" type="Vector2" setter="set_to" getter="get_to" default="Vector2(0, 0)">
|
||||
The ending point of the ray being queried for, in global coordinates.
|
||||
</member>
|
||||
</members>
|
||||
</class>
|
31
doc/classes/PhysicsRayQueryParameters3D.xml
Normal file
31
doc/classes/PhysicsRayQueryParameters3D.xml
Normal file
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<class name="PhysicsRayQueryParameters3D" inherits="RefCounted" version="4.0">
|
||||
<brief_description>
|
||||
Parameters to be sent to a 3D ray physics query.
|
||||
</brief_description>
|
||||
<description>
|
||||
This class contains the ray position and other parameters to be used for [method PhysicsDirectSpaceState3D.intersect_ray].
|
||||
</description>
|
||||
<tutorials>
|
||||
</tutorials>
|
||||
<members>
|
||||
<member name="collide_with_areas" type="bool" setter="set_collide_with_areas" getter="is_collide_with_areas_enabled" default="false">
|
||||
If [code]true[/code], the query will take [Area3D]s into account.
|
||||
</member>
|
||||
<member name="collide_with_bodies" type="bool" setter="set_collide_with_bodies" getter="is_collide_with_bodies_enabled" default="true">
|
||||
If [code]true[/code], the query will take [PhysicsBody3D]s into account.
|
||||
</member>
|
||||
<member name="collision_mask" type="int" setter="set_collision_mask" getter="get_collision_mask" default="4294967295">
|
||||
The physics layers the query will detect (as a bitmask). By default, all collision layers are detected. See [url=https://docs.godotengine.org/en/latest/tutorials/physics/physics_introduction.html#collision-layers-and-masks]Collision layers and masks[/url] in the documentation for more information.
|
||||
</member>
|
||||
<member name="exclude" type="Array" setter="set_exclude" getter="get_exclude" default="[]">
|
||||
The list of objects or object [RID]s that will be excluded from collisions.
|
||||
</member>
|
||||
<member name="from" type="Vector3" setter="set_from" getter="get_from" default="Vector3(0, 0, 0)">
|
||||
The starting point of the ray being queried for, in global coordinates.
|
||||
</member>
|
||||
<member name="to" type="Vector3" setter="set_to" getter="get_to" default="Vector3(0, 0, 0)">
|
||||
The ending point of the ray being queried for, in global coordinates.
|
||||
</member>
|
||||
</members>
|
||||
</class>
|
@ -4,7 +4,7 @@
|
||||
Parameters to be sent to a 2D shape physics query.
|
||||
</brief_description>
|
||||
<description>
|
||||
This class contains the shape and other parameters for 2D intersection/collision queries.
|
||||
This class contains the shape and other parameters for [PhysicsDirectSpaceState2D] intersection/collision queries.
|
||||
</description>
|
||||
<tutorials>
|
||||
</tutorials>
|
||||
|
@ -4,7 +4,7 @@
|
||||
Parameters to be sent to a 3D shape physics query.
|
||||
</brief_description>
|
||||
<description>
|
||||
This class contains the shape and other parameters for 3D intersection/collision queries.
|
||||
This class contains the shape and other parameters for [PhysicsDirectSpaceState3D] intersection/collision queries.
|
||||
</description>
|
||||
<tutorials>
|
||||
</tutorials>
|
||||
@ -24,6 +24,9 @@
|
||||
<member name="margin" type="float" setter="set_margin" getter="get_margin" default="0.0">
|
||||
The collision margin for the shape.
|
||||
</member>
|
||||
<member name="motion" type="Vector3" setter="set_motion" getter="get_motion" default="Vector3(0, 0, 0)">
|
||||
The motion of the shape being queried for.
|
||||
</member>
|
||||
<member name="shape" type="Resource" setter="set_shape" getter="get_shape">
|
||||
The [Shape3D] that will be used for collision/intersection queries. This stores the actual reference which avoids the shape to be released while being used for queries, so always prefer using this over [member shape_rid].
|
||||
</member>
|
||||
|
@ -3936,9 +3936,13 @@ Vector3 Node3DEditorViewport::_get_instance_position(const Point2 &p_pos) const
|
||||
Vector3 point = world_pos + world_ray * MAX_DISTANCE;
|
||||
|
||||
PhysicsDirectSpaceState3D *ss = get_tree()->get_root()->get_world_3d()->get_direct_space_state();
|
||||
PhysicsDirectSpaceState3D::RayResult result;
|
||||
|
||||
if (ss->intersect_ray(world_pos, world_pos + world_ray * MAX_DISTANCE, result)) {
|
||||
PhysicsDirectSpaceState3D::RayParameters ray_params;
|
||||
ray_params.from = world_pos;
|
||||
ray_params.to = world_pos + world_ray * MAX_DISTANCE;
|
||||
|
||||
PhysicsDirectSpaceState3D::RayResult result;
|
||||
if (ss->intersect_ray(ray_params, result)) {
|
||||
point = result.position;
|
||||
}
|
||||
|
||||
@ -6566,7 +6570,12 @@ void Node3DEditor::snap_selected_nodes_to_floor() {
|
||||
Vector3 to = from - Vector3(0.0, max_snap_height, 0.0);
|
||||
Set<RID> excluded = _get_physics_bodies_rid(sp);
|
||||
|
||||
if (ss->intersect_ray(from, to, result, excluded)) {
|
||||
PhysicsDirectSpaceState3D::RayParameters ray_params;
|
||||
ray_params.from = from;
|
||||
ray_params.to = to;
|
||||
ray_params.exclude = excluded;
|
||||
|
||||
if (ss->intersect_ray(ray_params, result)) {
|
||||
snapped_to_floor = true;
|
||||
}
|
||||
}
|
||||
@ -6583,7 +6592,12 @@ void Node3DEditor::snap_selected_nodes_to_floor() {
|
||||
Vector3 to = from - Vector3(0.0, max_snap_height, 0.0);
|
||||
Set<RID> excluded = _get_physics_bodies_rid(sp);
|
||||
|
||||
if (ss->intersect_ray(from, to, result, excluded)) {
|
||||
PhysicsDirectSpaceState3D::RayParameters ray_params;
|
||||
ray_params.from = from;
|
||||
ray_params.to = to;
|
||||
ray_params.exclude = excluded;
|
||||
|
||||
if (ss->intersect_ray(ray_params, result)) {
|
||||
Vector3 position_offset = d["position_offset"];
|
||||
Transform3D new_transform = sp->get_global_transform();
|
||||
|
||||
|
@ -112,7 +112,13 @@ StringName AudioStreamPlayer2D::_get_actual_bus() {
|
||||
PhysicsDirectSpaceState2D *space_state = PhysicsServer2D::get_singleton()->space_get_direct_state(world_2d->get_space());
|
||||
PhysicsDirectSpaceState2D::ShapeResult sr[MAX_INTERSECT_AREAS];
|
||||
|
||||
int areas = space_state->intersect_point(global_pos, sr, MAX_INTERSECT_AREAS, Set<RID>(), area_mask, false, true);
|
||||
PhysicsDirectSpaceState2D::PointParameters point_params;
|
||||
point_params.position = global_pos;
|
||||
point_params.collision_mask = area_mask;
|
||||
point_params.collide_with_bodies = false;
|
||||
point_params.collide_with_areas = true;
|
||||
|
||||
int areas = space_state->intersect_point(point_params, sr, MAX_INTERSECT_AREAS);
|
||||
|
||||
for (int i = 0; i < areas; i++) {
|
||||
Area2D *area2d = Object::cast_to<Area2D>(sr[i].collider);
|
||||
|
@ -192,7 +192,16 @@ void RayCast2D::_update_raycast_state() {
|
||||
|
||||
PhysicsDirectSpaceState2D::RayResult rr;
|
||||
bool prev_collision_state = collided;
|
||||
if (dss->intersect_ray(gt.get_origin(), gt.xform(to), rr, exclude, collision_mask, collide_with_bodies, collide_with_areas)) {
|
||||
|
||||
PhysicsDirectSpaceState2D::RayParameters ray_params;
|
||||
ray_params.from = gt.get_origin();
|
||||
ray_params.to = gt.xform(to);
|
||||
ray_params.exclude = exclude;
|
||||
ray_params.collision_mask = collision_mask;
|
||||
ray_params.collide_with_bodies = collide_with_bodies;
|
||||
ray_params.collide_with_areas = collide_with_areas;
|
||||
|
||||
if (dss->intersect_ray(ray_params, rr)) {
|
||||
collided = true;
|
||||
against = rr.collider_id;
|
||||
collision_point = rr.position;
|
||||
|
@ -327,7 +327,13 @@ Area3D *AudioStreamPlayer3D::_get_overriding_area() {
|
||||
|
||||
PhysicsDirectSpaceState3D::ShapeResult sr[MAX_INTERSECT_AREAS];
|
||||
|
||||
int areas = space_state->intersect_point(global_pos, sr, MAX_INTERSECT_AREAS, Set<RID>(), area_mask, false, true);
|
||||
PhysicsDirectSpaceState3D::PointParameters point_params;
|
||||
point_params.position = global_pos;
|
||||
point_params.collision_mask = area_mask;
|
||||
point_params.collide_with_bodies = false;
|
||||
point_params.collide_with_areas = true;
|
||||
|
||||
int areas = space_state->intersect_point(point_params, sr, MAX_INTERSECT_AREAS);
|
||||
|
||||
for (int i = 0; i < areas; i++) {
|
||||
if (!sr[i].collider) {
|
||||
|
@ -212,9 +212,16 @@ void RayCast3D::_update_raycast_state() {
|
||||
to = Vector3(0, 0.01, 0);
|
||||
}
|
||||
|
||||
PhysicsDirectSpaceState3D::RayResult rr;
|
||||
PhysicsDirectSpaceState3D::RayParameters ray_params;
|
||||
ray_params.from = gt.get_origin();
|
||||
ray_params.to = gt.xform(to);
|
||||
ray_params.exclude = exclude;
|
||||
ray_params.collision_mask = collision_mask;
|
||||
ray_params.collide_with_bodies = collide_with_bodies;
|
||||
ray_params.collide_with_areas = collide_with_areas;
|
||||
|
||||
if (dss->intersect_ray(gt.get_origin(), gt.xform(to), rr, exclude, collision_mask, collide_with_bodies, collide_with_areas)) {
|
||||
PhysicsDirectSpaceState3D::RayResult rr;
|
||||
if (dss->intersect_ray(ray_params, rr)) {
|
||||
collided = true;
|
||||
against = rr.collider_id;
|
||||
collision_point = rr.position;
|
||||
|
@ -149,10 +149,24 @@ void SpringArm3D::process_spring() {
|
||||
//use camera rotation, but spring arm position
|
||||
Transform3D base_transform = camera->get_global_transform();
|
||||
base_transform.origin = get_global_transform().origin;
|
||||
get_world_3d()->get_direct_space_state()->cast_motion(camera->get_pyramid_shape_rid(), base_transform, motion, 0, motion_delta, motion_delta_unsafe, excluded_objects, mask);
|
||||
|
||||
PhysicsDirectSpaceState3D::ShapeParameters shape_params;
|
||||
shape_params.shape_rid = camera->get_pyramid_shape_rid();
|
||||
shape_params.transform = base_transform;
|
||||
shape_params.motion = motion;
|
||||
shape_params.exclude = excluded_objects;
|
||||
shape_params.collision_mask = mask;
|
||||
|
||||
get_world_3d()->get_direct_space_state()->cast_motion(shape_params, motion_delta, motion_delta_unsafe);
|
||||
} else {
|
||||
PhysicsDirectSpaceState3D::RayParameters ray_params;
|
||||
ray_params.from = get_global_transform().origin;
|
||||
ray_params.to = get_global_transform().origin + motion;
|
||||
ray_params.exclude = excluded_objects;
|
||||
ray_params.collision_mask = mask;
|
||||
|
||||
PhysicsDirectSpaceState3D::RayResult r;
|
||||
bool intersected = get_world_3d()->get_direct_space_state()->intersect_ray(get_global_transform().origin, get_global_transform().origin + motion, r, excluded_objects, mask);
|
||||
bool intersected = get_world_3d()->get_direct_space_state()->intersect_ray(ray_params, r);
|
||||
if (intersected) {
|
||||
real_t dist = get_global_transform().origin.distance_to(r.position);
|
||||
dist -= margin;
|
||||
@ -160,7 +174,14 @@ void SpringArm3D::process_spring() {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
get_world_3d()->get_direct_space_state()->cast_motion(shape->get_rid(), get_global_transform(), motion, 0, motion_delta, motion_delta_unsafe, excluded_objects, mask);
|
||||
PhysicsDirectSpaceState3D::ShapeParameters shape_params;
|
||||
shape_params.shape_rid = shape->get_rid();
|
||||
shape_params.transform = get_global_transform();
|
||||
shape_params.motion = motion;
|
||||
shape_params.exclude = excluded_objects;
|
||||
shape_params.collision_mask = mask;
|
||||
|
||||
get_world_3d()->get_direct_space_state()->cast_motion(shape_params, motion_delta, motion_delta_unsafe);
|
||||
}
|
||||
|
||||
current_spring_length = spring_length * motion_delta;
|
||||
|
@ -407,7 +407,13 @@ real_t VehicleBody3D::_ray_cast(int p_idx, PhysicsDirectBodyState3D *s) {
|
||||
|
||||
PhysicsDirectSpaceState3D *ss = s->get_space_state();
|
||||
|
||||
bool col = ss->intersect_ray(source, target, rr, exclude, get_collision_mask());
|
||||
PhysicsDirectSpaceState3D::RayParameters ray_params;
|
||||
ray_params.from = source;
|
||||
ray_params.to = target;
|
||||
ray_params.exclude = exclude;
|
||||
ray_params.collision_mask = get_collision_mask();
|
||||
|
||||
bool col = ss->intersect_ray(ray_params, rr);
|
||||
|
||||
wheel.m_raycastInfo.m_groundObject = nullptr;
|
||||
|
||||
|
@ -638,7 +638,13 @@ void Viewport::_process_picking() {
|
||||
|
||||
Vector2 point = canvas_transform.affine_inverse().xform(pos);
|
||||
|
||||
int rc = ss2d->intersect_point_on_canvas(point, canvas_layer_id, res, 64, Set<RID>(), 0xFFFFFFFF, true, true, true);
|
||||
PhysicsDirectSpaceState2D::PointParameters point_params;
|
||||
point_params.position = point;
|
||||
point_params.canvas_instance_id = canvas_layer_id;
|
||||
point_params.collide_with_areas = true;
|
||||
point_params.pick_point = true;
|
||||
|
||||
int rc = ss2d->intersect_point(point_params, res, 64);
|
||||
for (int i = 0; i < rc; i++) {
|
||||
if (res[i].collider_id.is_valid() && res[i].collider) {
|
||||
CollisionObject2D *co = Object::cast_to<CollisionObject2D>(res[i].collider);
|
||||
@ -719,7 +725,13 @@ void Viewport::_process_picking() {
|
||||
|
||||
PhysicsDirectSpaceState3D *space = PhysicsServer3D::get_singleton()->space_get_direct_state(find_world_3d()->get_space());
|
||||
if (space) {
|
||||
bool col = space->intersect_ray(from, from + dir * far, result, Set<RID>(), 0xFFFFFFFF, true, true, true);
|
||||
PhysicsDirectSpaceState3D::RayParameters ray_params;
|
||||
ray_params.from = from;
|
||||
ray_params.to = from + dir * far;
|
||||
ray_params.collide_with_areas = true;
|
||||
ray_params.pick_ray = true;
|
||||
|
||||
bool col = space->intersect_ray(ray_params, result);
|
||||
ObjectID new_collider;
|
||||
if (col) {
|
||||
CollisionObject3D *co = Object::cast_to<CollisionObject3D>(result.collider);
|
||||
|
@ -194,9 +194,13 @@ void SkeletonModification2DJiggle::_execute_jiggle_joint(int p_joint_idx, Node2D
|
||||
PhysicsDirectSpaceState2D *space_state = PhysicsServer2D::get_singleton()->space_get_direct_state(world_2d->get_space());
|
||||
PhysicsDirectSpaceState2D::RayResult ray_result;
|
||||
|
||||
PhysicsDirectSpaceState2D::RayParameters ray_params;
|
||||
ray_params.from = operation_bone_trans.get_origin();
|
||||
ray_params.to = jiggle_data_chain[p_joint_idx].dynamic_position;
|
||||
ray_params.collision_mask = collision_mask;
|
||||
|
||||
// Add exception support?
|
||||
bool ray_hit = space_state->intersect_ray(operation_bone_trans.get_origin(), jiggle_data_chain[p_joint_idx].dynamic_position,
|
||||
ray_result, Set<RID>(), collision_mask);
|
||||
bool ray_hit = space_state->intersect_ray(ray_params, ray_result);
|
||||
|
||||
if (ray_hit) {
|
||||
jiggle_data_chain.write[p_joint_idx].dynamic_position = jiggle_data_chain[p_joint_idx].last_noncollision_position;
|
||||
|
@ -206,8 +206,12 @@ void SkeletonModification3DJiggle::_execute_jiggle_joint(int p_joint_idx, Node3D
|
||||
Transform3D new_bone_trans_world = stack->skeleton->global_pose_to_world_transform(new_bone_trans);
|
||||
Transform3D dynamic_position_world = stack->skeleton->global_pose_to_world_transform(Transform3D(Basis(), jiggle_data_chain[p_joint_idx].dynamic_position));
|
||||
|
||||
bool ray_hit = space_state->intersect_ray(new_bone_trans_world.origin, dynamic_position_world.get_origin(),
|
||||
ray_result, Set<RID>(), collision_mask);
|
||||
PhysicsDirectSpaceState3D::RayParameters ray_params;
|
||||
ray_params.from = new_bone_trans_world.origin;
|
||||
ray_params.to = dynamic_position_world.get_origin();
|
||||
ray_params.collision_mask = collision_mask;
|
||||
|
||||
bool ray_hit = space_state->intersect_ray(ray_params, ray_result);
|
||||
|
||||
if (ray_hit) {
|
||||
jiggle_data_chain[p_joint_idx].dynamic_position = jiggle_data_chain[p_joint_idx].last_noncollision_position;
|
||||
|
@ -54,13 +54,13 @@ _FORCE_INLINE_ static bool _can_collide_with(GodotCollisionObject2D *p_object, u
|
||||
return true;
|
||||
}
|
||||
|
||||
int GodotPhysicsDirectSpaceState2D::_intersect_point_impl(const Vector2 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask, bool p_collide_with_bodies, bool p_collide_with_areas, bool p_pick_point, bool p_filter_by_canvas, ObjectID p_canvas_instance_id) {
|
||||
int GodotPhysicsDirectSpaceState2D::intersect_point(const PointParameters &p_parameters, ShapeResult *r_results, int p_result_max) {
|
||||
if (p_result_max <= 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Rect2 aabb;
|
||||
aabb.position = p_point - Vector2(0.00001, 0.00001);
|
||||
aabb.position = p_parameters.position - Vector2(0.00001, 0.00001);
|
||||
aabb.size = Vector2(0.00002, 0.00002);
|
||||
|
||||
int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, GodotSpace2D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
@ -68,21 +68,21 @@ int GodotPhysicsDirectSpaceState2D::_intersect_point_impl(const Vector2 &p_point
|
||||
int cc = 0;
|
||||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask, p_collide_with_bodies, p_collide_with_areas)) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
if (p_parameters.exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const GodotCollisionObject2D *col_obj = space->intersection_query_results[i];
|
||||
|
||||
if (p_pick_point && !col_obj->is_pickable()) {
|
||||
if (p_parameters.pick_point && !col_obj->is_pickable()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (p_filter_by_canvas && col_obj->get_canvas_instance_id() != p_canvas_instance_id) {
|
||||
if (p_parameters.canvas_instance_id.is_valid() && col_obj->get_canvas_instance_id() != p_parameters.canvas_instance_id) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -90,7 +90,7 @@ int GodotPhysicsDirectSpaceState2D::_intersect_point_impl(const Vector2 &p_point
|
||||
|
||||
GodotShape2D *shape = col_obj->get_shape(shape_idx);
|
||||
|
||||
Vector2 local_point = (col_obj->get_transform() * col_obj->get_shape_transform(shape_idx)).affine_inverse().xform(p_point);
|
||||
Vector2 local_point = (col_obj->get_transform() * col_obj->get_shape_transform(shape_idx)).affine_inverse().xform(p_parameters.position);
|
||||
|
||||
if (!shape->contains_point(local_point)) {
|
||||
continue;
|
||||
@ -113,21 +113,13 @@ int GodotPhysicsDirectSpaceState2D::_intersect_point_impl(const Vector2 &p_point
|
||||
return cc;
|
||||
}
|
||||
|
||||
int GodotPhysicsDirectSpaceState2D::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_collide_with_bodies, bool p_collide_with_areas, bool p_pick_point) {
|
||||
return _intersect_point_impl(p_point, r_results, p_result_max, p_exclude, p_collision_mask, p_collide_with_bodies, p_collide_with_areas, p_pick_point);
|
||||
}
|
||||
|
||||
int GodotPhysicsDirectSpaceState2D::intersect_point_on_canvas(const Vector2 &p_point, ObjectID p_canvas_instance_id, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask, bool p_collide_with_bodies, bool p_collide_with_areas, bool p_pick_point) {
|
||||
return _intersect_point_impl(p_point, r_results, p_result_max, p_exclude, p_collision_mask, p_collide_with_bodies, p_collide_with_areas, p_pick_point, true, p_canvas_instance_id);
|
||||
}
|
||||
|
||||
bool GodotPhysicsDirectSpaceState2D::intersect_ray(const Vector2 &p_from, const Vector2 &p_to, RayResult &r_result, const Set<RID> &p_exclude, uint32_t p_collision_mask, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
bool GodotPhysicsDirectSpaceState2D::intersect_ray(const RayParameters &p_parameters, RayResult &r_result) {
|
||||
ERR_FAIL_COND_V(space->locked, false);
|
||||
|
||||
Vector2 begin, end;
|
||||
Vector2 normal;
|
||||
begin = p_from;
|
||||
end = p_to;
|
||||
begin = p_parameters.from;
|
||||
end = p_parameters.to;
|
||||
normal = (end - begin).normalized();
|
||||
|
||||
int amount = space->broadphase->cull_segment(begin, end, space->intersection_query_results, GodotSpace2D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
@ -141,11 +133,11 @@ bool GodotPhysicsDirectSpaceState2D::intersect_ray(const Vector2 &p_from, const
|
||||
real_t min_d = 1e10;
|
||||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask, p_collide_with_bodies, p_collide_with_areas)) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
if (p_parameters.exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -157,12 +149,6 @@ bool GodotPhysicsDirectSpaceState2D::intersect_ray(const Vector2 &p_from, const
|
||||
Vector2 local_from = inv_xform.xform(begin);
|
||||
Vector2 local_to = inv_xform.xform(end);
|
||||
|
||||
/*local_from = col_obj->get_inv_transform().xform(begin);
|
||||
local_from = col_obj->get_shape_inv_transform(shape_idx).xform(local_from);
|
||||
|
||||
local_to = col_obj->get_inv_transform().xform(end);
|
||||
local_to = col_obj->get_shape_inv_transform(shape_idx).xform(local_to);*/
|
||||
|
||||
const GodotShape2D *shape = col_obj->get_shape(shape_idx);
|
||||
|
||||
Vector2 shape_point, shape_normal;
|
||||
@ -200,16 +186,17 @@ bool GodotPhysicsDirectSpaceState2D::intersect_ray(const Vector2 &p_from, const
|
||||
return true;
|
||||
}
|
||||
|
||||
int GodotPhysicsDirectSpaceState2D::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, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
int GodotPhysicsDirectSpaceState2D::intersect_shape(const ShapeParameters &p_parameters, ShapeResult *r_results, int p_result_max) {
|
||||
if (p_result_max <= 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
GodotShape2D *shape = GodotPhysicsServer2D::godot_singleton->shape_owner.get_or_null(p_shape);
|
||||
GodotShape2D *shape = GodotPhysicsServer2D::godot_singleton->shape_owner.get_or_null(p_parameters.shape_rid);
|
||||
ERR_FAIL_COND_V(!shape, 0);
|
||||
|
||||
Rect2 aabb = p_xform.xform(shape->get_aabb());
|
||||
aabb = aabb.grow(p_margin);
|
||||
Rect2 aabb = p_parameters.transform.xform(shape->get_aabb());
|
||||
aabb = aabb.merge(Rect2(aabb.position + p_parameters.motion, aabb.size)); //motion
|
||||
aabb = aabb.grow(p_parameters.margin);
|
||||
|
||||
int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, GodotSpace2D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
|
||||
@ -220,18 +207,18 @@ int GodotPhysicsDirectSpaceState2D::intersect_shape(const RID &p_shape, const Tr
|
||||
break;
|
||||
}
|
||||
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask, p_collide_with_bodies, p_collide_with_areas)) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
if (p_parameters.exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const GodotCollisionObject2D *col_obj = space->intersection_query_results[i];
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (!GodotCollisionSolver2D::solve(shape, p_xform, p_motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), nullptr, nullptr, nullptr, p_margin)) {
|
||||
if (!GodotCollisionSolver2D::solve(shape, p_parameters.transform, p_parameters.motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), nullptr, nullptr, nullptr, p_parameters.margin)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -248,13 +235,13 @@ int GodotPhysicsDirectSpaceState2D::intersect_shape(const RID &p_shape, const Tr
|
||||
return cc;
|
||||
}
|
||||
|
||||
bool GodotPhysicsDirectSpaceState2D::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, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
GodotShape2D *shape = GodotPhysicsServer2D::godot_singleton->shape_owner.get_or_null(p_shape);
|
||||
bool GodotPhysicsDirectSpaceState2D::cast_motion(const ShapeParameters &p_parameters, real_t &p_closest_safe, real_t &p_closest_unsafe) {
|
||||
GodotShape2D *shape = GodotPhysicsServer2D::godot_singleton->shape_owner.get_or_null(p_parameters.shape_rid);
|
||||
ERR_FAIL_COND_V(!shape, false);
|
||||
|
||||
Rect2 aabb = p_xform.xform(shape->get_aabb());
|
||||
aabb = aabb.merge(Rect2(aabb.position + p_motion, aabb.size)); //motion
|
||||
aabb = aabb.grow(p_margin);
|
||||
Rect2 aabb = p_parameters.transform.xform(shape->get_aabb());
|
||||
aabb = aabb.merge(Rect2(aabb.position + p_parameters.motion, aabb.size)); //motion
|
||||
aabb = aabb.grow(p_parameters.margin);
|
||||
|
||||
int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, GodotSpace2D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
|
||||
@ -262,11 +249,11 @@ bool GodotPhysicsDirectSpaceState2D::cast_motion(const RID &p_shape, const Trans
|
||||
real_t best_unsafe = 1;
|
||||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask, p_collide_with_bodies, p_collide_with_areas)) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
if (p_parameters.exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
continue; //ignore excluded
|
||||
}
|
||||
|
||||
@ -275,16 +262,16 @@ bool GodotPhysicsDirectSpaceState2D::cast_motion(const RID &p_shape, const Trans
|
||||
|
||||
Transform2D col_obj_xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx);
|
||||
//test initial overlap, does it collide if going all the way?
|
||||
if (!GodotCollisionSolver2D::solve(shape, p_xform, p_motion, col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), nullptr, nullptr, nullptr, p_margin)) {
|
||||
if (!GodotCollisionSolver2D::solve(shape, p_parameters.transform, p_parameters.motion, col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), nullptr, nullptr, nullptr, p_parameters.margin)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//test initial overlap, ignore objects it's inside of.
|
||||
if (GodotCollisionSolver2D::solve(shape, p_xform, Vector2(), col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), nullptr, nullptr, nullptr, p_margin)) {
|
||||
if (GodotCollisionSolver2D::solve(shape, p_parameters.transform, Vector2(), col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), nullptr, nullptr, nullptr, p_parameters.margin)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Vector2 mnormal = p_motion.normalized();
|
||||
Vector2 mnormal = p_parameters.motion.normalized();
|
||||
|
||||
//just do kinematic solving
|
||||
real_t low = 0.0;
|
||||
@ -294,7 +281,7 @@ bool GodotPhysicsDirectSpaceState2D::cast_motion(const RID &p_shape, const Trans
|
||||
real_t fraction = low + (hi - low) * fraction_coeff;
|
||||
|
||||
Vector2 sep = mnormal; //important optimization for this to work fast enough
|
||||
bool collided = GodotCollisionSolver2D::solve(shape, p_xform, p_motion * fraction, col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), nullptr, nullptr, &sep, p_margin);
|
||||
bool collided = GodotCollisionSolver2D::solve(shape, p_parameters.transform, p_parameters.motion * fraction, col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), nullptr, nullptr, &sep, p_parameters.margin);
|
||||
|
||||
if (collided) {
|
||||
hi = fraction;
|
||||
@ -331,17 +318,17 @@ bool GodotPhysicsDirectSpaceState2D::cast_motion(const RID &p_shape, const Trans
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GodotPhysicsDirectSpaceState2D::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, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
bool GodotPhysicsDirectSpaceState2D::collide_shape(const ShapeParameters &p_parameters, Vector2 *r_results, int p_result_max, int &r_result_count) {
|
||||
if (p_result_max <= 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
GodotShape2D *shape = GodotPhysicsServer2D::godot_singleton->shape_owner.get_or_null(p_shape);
|
||||
GodotShape2D *shape = GodotPhysicsServer2D::godot_singleton->shape_owner.get_or_null(p_parameters.shape_rid);
|
||||
ERR_FAIL_COND_V(!shape, 0);
|
||||
|
||||
Rect2 aabb = p_shape_xform.xform(shape->get_aabb());
|
||||
aabb = aabb.merge(Rect2(aabb.position + p_motion, aabb.size)); //motion
|
||||
aabb = aabb.grow(p_margin);
|
||||
Rect2 aabb = p_parameters.transform.xform(shape->get_aabb());
|
||||
aabb = aabb.merge(Rect2(aabb.position + p_parameters.motion, aabb.size)); //motion
|
||||
aabb = aabb.grow(p_parameters.margin);
|
||||
|
||||
int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, GodotSpace2D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
|
||||
@ -358,13 +345,13 @@ bool GodotPhysicsDirectSpaceState2D::collide_shape(RID p_shape, const Transform2
|
||||
GodotPhysicsServer2D::CollCbkData *cbkptr = &cbk;
|
||||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask, p_collide_with_bodies, p_collide_with_areas)) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const GodotCollisionObject2D *col_obj = space->intersection_query_results[i];
|
||||
|
||||
if (p_exclude.has(col_obj->get_self())) {
|
||||
if (p_parameters.exclude.has(col_obj->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -373,7 +360,7 @@ bool GodotPhysicsDirectSpaceState2D::collide_shape(RID p_shape, const Transform2
|
||||
cbk.valid_dir = Vector2();
|
||||
cbk.valid_depth = 0;
|
||||
|
||||
if (GodotCollisionSolver2D::solve(shape, p_shape_xform, p_motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), cbkres, cbkptr, nullptr, p_margin)) {
|
||||
if (GodotCollisionSolver2D::solve(shape, p_parameters.transform, p_parameters.motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), cbkres, cbkptr, nullptr, p_parameters.margin)) {
|
||||
collided = cbk.amount > 0;
|
||||
}
|
||||
}
|
||||
@ -432,15 +419,15 @@ static void _rest_cbk_result(const Vector2 &p_point_A, const Vector2 &p_point_B,
|
||||
rd->best_local_shape = rd->local_shape;
|
||||
}
|
||||
|
||||
bool GodotPhysicsDirectSpaceState2D::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, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
GodotShape2D *shape = GodotPhysicsServer2D::godot_singleton->shape_owner.get_or_null(p_shape);
|
||||
bool GodotPhysicsDirectSpaceState2D::rest_info(const ShapeParameters &p_parameters, ShapeRestInfo *r_info) {
|
||||
GodotShape2D *shape = GodotPhysicsServer2D::godot_singleton->shape_owner.get_or_null(p_parameters.shape_rid);
|
||||
ERR_FAIL_COND_V(!shape, 0);
|
||||
|
||||
real_t min_contact_depth = p_margin * TEST_MOTION_MIN_CONTACT_DEPTH_FACTOR;
|
||||
real_t min_contact_depth = p_parameters.margin * TEST_MOTION_MIN_CONTACT_DEPTH_FACTOR;
|
||||
|
||||
Rect2 aabb = p_shape_xform.xform(shape->get_aabb());
|
||||
aabb = aabb.merge(Rect2(aabb.position + p_motion, aabb.size)); //motion
|
||||
aabb = aabb.grow(p_margin);
|
||||
Rect2 aabb = p_parameters.transform.xform(shape->get_aabb());
|
||||
aabb = aabb.merge(Rect2(aabb.position + p_parameters.motion, aabb.size)); //motion
|
||||
aabb = aabb.grow(p_parameters.margin);
|
||||
|
||||
int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, GodotSpace2D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
|
||||
@ -451,13 +438,13 @@ bool GodotPhysicsDirectSpaceState2D::rest_info(RID p_shape, const Transform2D &p
|
||||
rcd.min_allowed_depth = min_contact_depth;
|
||||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask, p_collide_with_bodies, p_collide_with_areas)) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const GodotCollisionObject2D *col_obj = space->intersection_query_results[i];
|
||||
|
||||
if (p_exclude.has(col_obj->get_self())) {
|
||||
if (p_parameters.exclude.has(col_obj->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -467,7 +454,7 @@ bool GodotPhysicsDirectSpaceState2D::rest_info(RID p_shape, const Transform2D &p
|
||||
rcd.object = col_obj;
|
||||
rcd.shape = shape_idx;
|
||||
rcd.local_shape = 0;
|
||||
bool sc = GodotCollisionSolver2D::solve(shape, p_shape_xform, p_motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), _rest_cbk_result, &rcd, nullptr, p_margin);
|
||||
bool sc = GodotCollisionSolver2D::solve(shape, p_parameters.transform, p_parameters.motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), _rest_cbk_result, &rcd, nullptr, p_parameters.margin);
|
||||
if (!sc) {
|
||||
continue;
|
||||
}
|
||||
|
@ -45,18 +45,15 @@
|
||||
class GodotPhysicsDirectSpaceState2D : public PhysicsDirectSpaceState2D {
|
||||
GDCLASS(GodotPhysicsDirectSpaceState2D, PhysicsDirectSpaceState2D);
|
||||
|
||||
int _intersect_point_impl(const Vector2 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask, bool p_collide_with_bodies, bool p_collide_with_areas, bool p_pick_point, bool p_filter_by_canvas = false, ObjectID p_canvas_instance_id = ObjectID());
|
||||
|
||||
public:
|
||||
GodotSpace2D *space = nullptr;
|
||||
|
||||
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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false, bool p_pick_point = false) override;
|
||||
virtual int intersect_point_on_canvas(const Vector2 &p_point, ObjectID p_canvas_instance_id, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false, bool p_pick_point = false) override;
|
||||
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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) override;
|
||||
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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) override;
|
||||
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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) override;
|
||||
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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) override;
|
||||
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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) override;
|
||||
virtual int intersect_point(const PointParameters &p_parameters, ShapeResult *r_results, int p_result_max) override;
|
||||
virtual bool intersect_ray(const RayParameters &p_parameters, RayResult &r_result) override;
|
||||
virtual int intersect_shape(const ShapeParameters &p_parameters, ShapeResult *r_results, int p_result_max) override;
|
||||
virtual bool cast_motion(const ShapeParameters &p_parameters, real_t &p_closest_safe, real_t &p_closest_unsafe) override;
|
||||
virtual bool collide_shape(const ShapeParameters &p_parameters, Vector2 *r_results, int p_result_max, int &r_result_count) override;
|
||||
virtual bool rest_info(const ShapeParameters &p_parameters, ShapeRestInfo *r_info) override;
|
||||
|
||||
GodotPhysicsDirectSpaceState2D() {}
|
||||
};
|
||||
|
@ -57,9 +57,9 @@ _FORCE_INLINE_ static bool _can_collide_with(GodotCollisionObject3D *p_object, u
|
||||
return true;
|
||||
}
|
||||
|
||||
int GodotPhysicsDirectSpaceState3D::intersect_point(const Vector3 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
int GodotPhysicsDirectSpaceState3D::intersect_point(const PointParameters &p_parameters, ShapeResult *r_results, int p_result_max) {
|
||||
ERR_FAIL_COND_V(space->locked, false);
|
||||
int amount = space->broadphase->cull_point(p_point, space->intersection_query_results, GodotSpace3D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
int amount = space->broadphase->cull_point(p_parameters.position, space->intersection_query_results, GodotSpace3D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
int cc = 0;
|
||||
|
||||
//Transform3D ai = p_xform.affine_inverse();
|
||||
@ -69,13 +69,13 @@ int GodotPhysicsDirectSpaceState3D::intersect_point(const Vector3 &p_point, Shap
|
||||
break;
|
||||
}
|
||||
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask, p_collide_with_bodies, p_collide_with_areas)) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//area can't be picked by ray (default)
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
if (p_parameters.exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -85,7 +85,7 @@ int GodotPhysicsDirectSpaceState3D::intersect_point(const Vector3 &p_point, Shap
|
||||
Transform3D inv_xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx);
|
||||
inv_xform.affine_invert();
|
||||
|
||||
if (!col_obj->get_shape(shape_idx)->intersect_point(inv_xform.xform(p_point))) {
|
||||
if (!col_obj->get_shape(shape_idx)->intersect_point(inv_xform.xform(p_parameters.position))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -104,13 +104,13 @@ int GodotPhysicsDirectSpaceState3D::intersect_point(const Vector3 &p_point, Shap
|
||||
return cc;
|
||||
}
|
||||
|
||||
bool GodotPhysicsDirectSpaceState3D::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_collide_with_bodies, bool p_collide_with_areas, bool p_pick_ray) {
|
||||
bool GodotPhysicsDirectSpaceState3D::intersect_ray(const RayParameters &p_parameters, RayResult &r_result) {
|
||||
ERR_FAIL_COND_V(space->locked, false);
|
||||
|
||||
Vector3 begin, end;
|
||||
Vector3 normal;
|
||||
begin = p_from;
|
||||
end = p_to;
|
||||
begin = p_parameters.from;
|
||||
end = p_parameters.to;
|
||||
normal = (end - begin).normalized();
|
||||
|
||||
int amount = space->broadphase->cull_segment(begin, end, space->intersection_query_results, GodotSpace3D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
@ -124,15 +124,15 @@ bool GodotPhysicsDirectSpaceState3D::intersect_ray(const Vector3 &p_from, const
|
||||
real_t min_d = 1e10;
|
||||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask, p_collide_with_bodies, p_collide_with_areas)) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (p_pick_ray && !(space->intersection_query_results[i]->is_ray_pickable())) {
|
||||
if (p_parameters.pick_ray && !(space->intersection_query_results[i]->is_ray_pickable())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
if (p_parameters.exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -183,15 +183,15 @@ bool GodotPhysicsDirectSpaceState3D::intersect_ray(const Vector3 &p_from, const
|
||||
return true;
|
||||
}
|
||||
|
||||
int GodotPhysicsDirectSpaceState3D::intersect_shape(const RID &p_shape, const Transform3D &p_xform, real_t p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
int GodotPhysicsDirectSpaceState3D::intersect_shape(const ShapeParameters &p_parameters, ShapeResult *r_results, int p_result_max) {
|
||||
if (p_result_max <= 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
GodotShape3D *shape = GodotPhysicsServer3D::godot_singleton->shape_owner.get_or_null(p_shape);
|
||||
GodotShape3D *shape = GodotPhysicsServer3D::godot_singleton->shape_owner.get_or_null(p_parameters.shape_rid);
|
||||
ERR_FAIL_COND_V(!shape, 0);
|
||||
|
||||
AABB aabb = p_xform.xform(shape->get_aabb());
|
||||
AABB aabb = p_parameters.transform.xform(shape->get_aabb());
|
||||
|
||||
int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, GodotSpace3D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
|
||||
@ -204,20 +204,20 @@ int GodotPhysicsDirectSpaceState3D::intersect_shape(const RID &p_shape, const Tr
|
||||
break;
|
||||
}
|
||||
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask, p_collide_with_bodies, p_collide_with_areas)) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//area can't be picked by ray (default)
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
if (p_parameters.exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const GodotCollisionObject3D *col_obj = space->intersection_query_results[i];
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (!GodotCollisionSolver3D::solve_static(shape, p_xform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), nullptr, nullptr, nullptr, p_margin, 0)) {
|
||||
if (!GodotCollisionSolver3D::solve_static(shape, p_parameters.transform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), nullptr, nullptr, nullptr, p_parameters.margin, 0)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -238,36 +238,36 @@ int GodotPhysicsDirectSpaceState3D::intersect_shape(const RID &p_shape, const Tr
|
||||
return cc;
|
||||
}
|
||||
|
||||
bool GodotPhysicsDirectSpaceState3D::cast_motion(const RID &p_shape, const Transform3D &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, bool p_collide_with_bodies, bool p_collide_with_areas, ShapeRestInfo *r_info) {
|
||||
GodotShape3D *shape = GodotPhysicsServer3D::godot_singleton->shape_owner.get_or_null(p_shape);
|
||||
bool GodotPhysicsDirectSpaceState3D::cast_motion(const ShapeParameters &p_parameters, real_t &p_closest_safe, real_t &p_closest_unsafe, ShapeRestInfo *r_info) {
|
||||
GodotShape3D *shape = GodotPhysicsServer3D::godot_singleton->shape_owner.get_or_null(p_parameters.shape_rid);
|
||||
ERR_FAIL_COND_V(!shape, false);
|
||||
|
||||
AABB aabb = p_xform.xform(shape->get_aabb());
|
||||
aabb = aabb.merge(AABB(aabb.position + p_motion, aabb.size)); //motion
|
||||
aabb = aabb.grow(p_margin);
|
||||
AABB aabb = p_parameters.transform.xform(shape->get_aabb());
|
||||
aabb = aabb.merge(AABB(aabb.position + p_parameters.motion, aabb.size)); //motion
|
||||
aabb = aabb.grow(p_parameters.margin);
|
||||
|
||||
int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, GodotSpace3D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
|
||||
real_t best_safe = 1;
|
||||
real_t best_unsafe = 1;
|
||||
|
||||
Transform3D xform_inv = p_xform.affine_inverse();
|
||||
Transform3D xform_inv = p_parameters.transform.affine_inverse();
|
||||
GodotMotionShape3D mshape;
|
||||
mshape.shape = shape;
|
||||
mshape.motion = xform_inv.basis.xform(p_motion);
|
||||
mshape.motion = xform_inv.basis.xform(p_parameters.motion);
|
||||
|
||||
bool best_first = true;
|
||||
|
||||
Vector3 motion_normal = p_motion.normalized();
|
||||
Vector3 motion_normal = p_parameters.motion.normalized();
|
||||
|
||||
Vector3 closest_A, closest_B;
|
||||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask, p_collide_with_bodies, p_collide_with_areas)) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (p_exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
if (p_parameters.exclude.has(space->intersection_query_results[i]->get_self())) {
|
||||
continue; //ignore excluded
|
||||
}
|
||||
|
||||
@ -279,14 +279,14 @@ bool GodotPhysicsDirectSpaceState3D::cast_motion(const RID &p_shape, const Trans
|
||||
|
||||
Transform3D col_obj_xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx);
|
||||
//test initial overlap, does it collide if going all the way?
|
||||
if (GodotCollisionSolver3D::solve_distance(&mshape, p_xform, col_obj->get_shape(shape_idx), col_obj_xform, point_A, point_B, aabb, &sep_axis)) {
|
||||
if (GodotCollisionSolver3D::solve_distance(&mshape, p_parameters.transform, col_obj->get_shape(shape_idx), col_obj_xform, point_A, point_B, aabb, &sep_axis)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//test initial overlap, ignore objects it's inside of.
|
||||
sep_axis = motion_normal;
|
||||
|
||||
if (!GodotCollisionSolver3D::solve_distance(shape, p_xform, col_obj->get_shape(shape_idx), col_obj_xform, point_A, point_B, aabb, &sep_axis)) {
|
||||
if (!GodotCollisionSolver3D::solve_distance(shape, p_parameters.transform, col_obj->get_shape(shape_idx), col_obj_xform, point_A, point_B, aabb, &sep_axis)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -297,11 +297,11 @@ bool GodotPhysicsDirectSpaceState3D::cast_motion(const RID &p_shape, const Trans
|
||||
for (int j = 0; j < 8; j++) { //steps should be customizable..
|
||||
real_t fraction = low + (hi - low) * fraction_coeff;
|
||||
|
||||
mshape.motion = xform_inv.basis.xform(p_motion * fraction);
|
||||
mshape.motion = xform_inv.basis.xform(p_parameters.motion * fraction);
|
||||
|
||||
Vector3 lA, lB;
|
||||
Vector3 sep = motion_normal; //important optimization for this to work fast enough
|
||||
bool collided = !GodotCollisionSolver3D::solve_distance(&mshape, p_xform, col_obj->get_shape(shape_idx), col_obj_xform, lA, lB, aabb, &sep);
|
||||
bool collided = !GodotCollisionSolver3D::solve_distance(&mshape, p_parameters.transform, col_obj->get_shape(shape_idx), col_obj_xform, lA, lB, aabb, &sep);
|
||||
|
||||
if (collided) {
|
||||
hi = fraction;
|
||||
@ -357,16 +357,16 @@ bool GodotPhysicsDirectSpaceState3D::cast_motion(const RID &p_shape, const Trans
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GodotPhysicsDirectSpaceState3D::collide_shape(RID p_shape, const Transform3D &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, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
bool GodotPhysicsDirectSpaceState3D::collide_shape(const ShapeParameters &p_parameters, Vector3 *r_results, int p_result_max, int &r_result_count) {
|
||||
if (p_result_max <= 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
GodotShape3D *shape = GodotPhysicsServer3D::godot_singleton->shape_owner.get_or_null(p_shape);
|
||||
GodotShape3D *shape = GodotPhysicsServer3D::godot_singleton->shape_owner.get_or_null(p_parameters.shape_rid);
|
||||
ERR_FAIL_COND_V(!shape, 0);
|
||||
|
||||
AABB aabb = p_shape_xform.xform(shape->get_aabb());
|
||||
aabb = aabb.grow(p_margin);
|
||||
AABB aabb = p_parameters.transform.xform(shape->get_aabb());
|
||||
aabb = aabb.grow(p_parameters.margin);
|
||||
|
||||
int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, GodotSpace3D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
|
||||
@ -382,19 +382,19 @@ bool GodotPhysicsDirectSpaceState3D::collide_shape(RID p_shape, const Transform3
|
||||
GodotPhysicsServer3D::CollCbkData *cbkptr = &cbk;
|
||||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask, p_collide_with_bodies, p_collide_with_areas)) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const GodotCollisionObject3D *col_obj = space->intersection_query_results[i];
|
||||
|
||||
if (p_exclude.has(col_obj->get_self())) {
|
||||
if (p_parameters.exclude.has(col_obj->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (GodotCollisionSolver3D::solve_static(shape, p_shape_xform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), cbkres, cbkptr, nullptr, p_margin)) {
|
||||
if (GodotCollisionSolver3D::solve_static(shape, p_parameters.transform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), cbkres, cbkptr, nullptr, p_parameters.margin)) {
|
||||
collided = true;
|
||||
}
|
||||
}
|
||||
@ -487,14 +487,14 @@ static void _rest_cbk_result(const Vector3 &p_point_A, int p_index_A, const Vect
|
||||
rd->best_result.local_shape = rd->local_shape;
|
||||
}
|
||||
|
||||
bool GodotPhysicsDirectSpaceState3D::rest_info(RID p_shape, const Transform3D &p_shape_xform, real_t p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude, uint32_t p_collision_mask, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
GodotShape3D *shape = GodotPhysicsServer3D::godot_singleton->shape_owner.get_or_null(p_shape);
|
||||
bool GodotPhysicsDirectSpaceState3D::rest_info(const ShapeParameters &p_parameters, ShapeRestInfo *r_info) {
|
||||
GodotShape3D *shape = GodotPhysicsServer3D::godot_singleton->shape_owner.get_or_null(p_parameters.shape_rid);
|
||||
ERR_FAIL_COND_V(!shape, 0);
|
||||
|
||||
real_t min_contact_depth = p_margin * TEST_MOTION_MIN_CONTACT_DEPTH_FACTOR;
|
||||
real_t min_contact_depth = p_parameters.margin * TEST_MOTION_MIN_CONTACT_DEPTH_FACTOR;
|
||||
|
||||
AABB aabb = p_shape_xform.xform(shape->get_aabb());
|
||||
aabb = aabb.grow(p_margin);
|
||||
AABB aabb = p_parameters.transform.xform(shape->get_aabb());
|
||||
aabb = aabb.grow(p_parameters.margin);
|
||||
|
||||
int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, GodotSpace3D::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
|
||||
|
||||
@ -502,13 +502,13 @@ bool GodotPhysicsDirectSpaceState3D::rest_info(RID p_shape, const Transform3D &p
|
||||
rcd.min_allowed_depth = min_contact_depth;
|
||||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_collision_mask, p_collide_with_bodies, p_collide_with_areas)) {
|
||||
if (!_can_collide_with(space->intersection_query_results[i], p_parameters.collision_mask, p_parameters.collide_with_bodies, p_parameters.collide_with_areas)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const GodotCollisionObject3D *col_obj = space->intersection_query_results[i];
|
||||
|
||||
if (p_exclude.has(col_obj->get_self())) {
|
||||
if (p_parameters.exclude.has(col_obj->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -516,7 +516,7 @@ bool GodotPhysicsDirectSpaceState3D::rest_info(RID p_shape, const Transform3D &p
|
||||
|
||||
rcd.object = col_obj;
|
||||
rcd.shape = shape_idx;
|
||||
bool sc = GodotCollisionSolver3D::solve_static(shape, p_shape_xform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), _rest_cbk_result, &rcd, nullptr, p_margin);
|
||||
bool sc = GodotCollisionSolver3D::solve_static(shape, p_parameters.transform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), _rest_cbk_result, &rcd, nullptr, p_parameters.margin);
|
||||
if (!sc) {
|
||||
continue;
|
||||
}
|
||||
|
@ -49,12 +49,12 @@ class GodotPhysicsDirectSpaceState3D : public PhysicsDirectSpaceState3D {
|
||||
public:
|
||||
GodotSpace3D *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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) override;
|
||||
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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false, bool p_pick_ray = false) override;
|
||||
virtual int intersect_shape(const RID &p_shape, const Transform3D &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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) override;
|
||||
virtual bool cast_motion(const RID &p_shape, const Transform3D &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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false, ShapeRestInfo *r_info = nullptr) override;
|
||||
virtual bool collide_shape(RID p_shape, const Transform3D &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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) override;
|
||||
virtual bool rest_info(RID p_shape, const Transform3D &p_shape_xform, real_t p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) override;
|
||||
virtual int intersect_point(const PointParameters &p_parameters, ShapeResult *r_results, int p_result_max) override;
|
||||
virtual bool intersect_ray(const RayParameters &p_parameters, RayResult &r_result) override;
|
||||
virtual int intersect_shape(const ShapeParameters &p_parameters, ShapeResult *r_results, int p_result_max) override;
|
||||
virtual bool cast_motion(const ShapeParameters &p_parameters, real_t &p_closest_safe, real_t &p_closest_unsafe, ShapeRestInfo *r_info = nullptr) override;
|
||||
virtual bool collide_shape(const ShapeParameters &p_parameters, Vector3 *r_results, int p_result_max, int &r_result_count) override;
|
||||
virtual bool rest_info(const ShapeParameters &p_parameters, ShapeRestInfo *r_info) override;
|
||||
virtual Vector3 get_closest_point_to_object_volume(RID p_object, const Vector3 p_point) const override;
|
||||
|
||||
GodotPhysicsDirectSpaceState3D();
|
||||
|
@ -134,95 +134,132 @@ PhysicsDirectBodyState2D::PhysicsDirectBodyState2D() {}
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
|
||||
void PhysicsShapeQueryParameters2D::set_shape(const RES &p_shape_ref) {
|
||||
ERR_FAIL_COND(p_shape_ref.is_null());
|
||||
shape_ref = p_shape_ref;
|
||||
shape = p_shape_ref->get_rid();
|
||||
}
|
||||
|
||||
RES PhysicsShapeQueryParameters2D::get_shape() const {
|
||||
return shape_ref;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters2D::set_shape_rid(const RID &p_shape) {
|
||||
if (shape != p_shape) {
|
||||
shape_ref = RES();
|
||||
shape = p_shape;
|
||||
}
|
||||
}
|
||||
|
||||
RID PhysicsShapeQueryParameters2D::get_shape_rid() const {
|
||||
return shape;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters2D::set_transform(const Transform2D &p_transform) {
|
||||
transform = p_transform;
|
||||
}
|
||||
|
||||
Transform2D PhysicsShapeQueryParameters2D::get_transform() const {
|
||||
return transform;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters2D::set_motion(const Vector2 &p_motion) {
|
||||
motion = p_motion;
|
||||
}
|
||||
|
||||
Vector2 PhysicsShapeQueryParameters2D::get_motion() const {
|
||||
return motion;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters2D::set_margin(real_t p_margin) {
|
||||
margin = p_margin;
|
||||
}
|
||||
|
||||
real_t PhysicsShapeQueryParameters2D::get_margin() const {
|
||||
return margin;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters2D::set_collision_mask(uint32_t p_collision_mask) {
|
||||
collision_mask = p_collision_mask;
|
||||
}
|
||||
|
||||
uint32_t PhysicsShapeQueryParameters2D::get_collision_mask() const {
|
||||
return collision_mask;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters2D::set_exclude(const Vector<RID> &p_exclude) {
|
||||
exclude.clear();
|
||||
void PhysicsRayQueryParameters2D::set_exclude(const Vector<RID> &p_exclude) {
|
||||
parameters.exclude.clear();
|
||||
for (int i = 0; i < p_exclude.size(); i++) {
|
||||
exclude.insert(p_exclude[i]);
|
||||
parameters.exclude.insert(p_exclude[i]);
|
||||
}
|
||||
}
|
||||
|
||||
Vector<RID> PhysicsShapeQueryParameters2D::get_exclude() const {
|
||||
Vector<RID> PhysicsRayQueryParameters2D::get_exclude() const {
|
||||
Vector<RID> ret;
|
||||
ret.resize(exclude.size());
|
||||
ret.resize(parameters.exclude.size());
|
||||
int idx = 0;
|
||||
for (Set<RID>::Element *E = exclude.front(); E; E = E->next()) {
|
||||
for (Set<RID>::Element *E = parameters.exclude.front(); E; E = E->next()) {
|
||||
ret.write[idx++] = E->get();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters2D::set_collide_with_bodies(bool p_enable) {
|
||||
collide_with_bodies = p_enable;
|
||||
void PhysicsRayQueryParameters2D::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("set_from", "from"), &PhysicsRayQueryParameters2D::set_from);
|
||||
ClassDB::bind_method(D_METHOD("get_from"), &PhysicsRayQueryParameters2D::get_from);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_to", "to"), &PhysicsRayQueryParameters2D::set_to);
|
||||
ClassDB::bind_method(D_METHOD("get_to"), &PhysicsRayQueryParameters2D::get_to);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collision_mask", "collision_mask"), &PhysicsRayQueryParameters2D::set_collision_mask);
|
||||
ClassDB::bind_method(D_METHOD("get_collision_mask"), &PhysicsRayQueryParameters2D::get_collision_mask);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_exclude", "exclude"), &PhysicsRayQueryParameters2D::set_exclude);
|
||||
ClassDB::bind_method(D_METHOD("get_exclude"), &PhysicsRayQueryParameters2D::get_exclude);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collide_with_bodies", "enable"), &PhysicsRayQueryParameters2D::set_collide_with_bodies);
|
||||
ClassDB::bind_method(D_METHOD("is_collide_with_bodies_enabled"), &PhysicsRayQueryParameters2D::is_collide_with_bodies_enabled);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collide_with_areas", "enable"), &PhysicsRayQueryParameters2D::set_collide_with_areas);
|
||||
ClassDB::bind_method(D_METHOD("is_collide_with_areas_enabled"), &PhysicsRayQueryParameters2D::is_collide_with_areas_enabled);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "from"), "set_from", "get_from");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "to"), "set_to", "get_to");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_2D_PHYSICS), "set_collision_mask", "get_collision_mask");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude", PROPERTY_HINT_ARRAY_TYPE, "RID"), "set_exclude", "get_exclude");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_bodies"), "set_collide_with_bodies", "is_collide_with_bodies_enabled");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_areas"), "set_collide_with_areas", "is_collide_with_areas_enabled");
|
||||
}
|
||||
|
||||
bool PhysicsShapeQueryParameters2D::is_collide_with_bodies_enabled() const {
|
||||
return collide_with_bodies;
|
||||
///////////////////////////////////////////////////////
|
||||
|
||||
void PhysicsPointQueryParameters2D::set_exclude(const Vector<RID> &p_exclude) {
|
||||
parameters.exclude.clear();
|
||||
for (int i = 0; i < p_exclude.size(); i++) {
|
||||
parameters.exclude.insert(p_exclude[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters2D::set_collide_with_areas(bool p_enable) {
|
||||
collide_with_areas = p_enable;
|
||||
Vector<RID> PhysicsPointQueryParameters2D::get_exclude() const {
|
||||
Vector<RID> ret;
|
||||
ret.resize(parameters.exclude.size());
|
||||
int idx = 0;
|
||||
for (Set<RID>::Element *E = parameters.exclude.front(); E; E = E->next()) {
|
||||
ret.write[idx++] = E->get();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool PhysicsShapeQueryParameters2D::is_collide_with_areas_enabled() const {
|
||||
return collide_with_areas;
|
||||
void PhysicsPointQueryParameters2D::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("set_position", "position"), &PhysicsPointQueryParameters2D::set_position);
|
||||
ClassDB::bind_method(D_METHOD("get_position"), &PhysicsPointQueryParameters2D::get_position);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_canvas_instance_id", "canvas_instance_id"), &PhysicsPointQueryParameters2D::set_canvas_instance_id);
|
||||
ClassDB::bind_method(D_METHOD("get_canvas_instance_id"), &PhysicsPointQueryParameters2D::get_canvas_instance_id);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collision_mask", "collision_mask"), &PhysicsPointQueryParameters2D::set_collision_mask);
|
||||
ClassDB::bind_method(D_METHOD("get_collision_mask"), &PhysicsPointQueryParameters2D::get_collision_mask);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_exclude", "exclude"), &PhysicsPointQueryParameters2D::set_exclude);
|
||||
ClassDB::bind_method(D_METHOD("get_exclude"), &PhysicsPointQueryParameters2D::get_exclude);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collide_with_bodies", "enable"), &PhysicsPointQueryParameters2D::set_collide_with_bodies);
|
||||
ClassDB::bind_method(D_METHOD("is_collide_with_bodies_enabled"), &PhysicsPointQueryParameters2D::is_collide_with_bodies_enabled);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collide_with_areas", "enable"), &PhysicsPointQueryParameters2D::set_collide_with_areas);
|
||||
ClassDB::bind_method(D_METHOD("is_collide_with_areas_enabled"), &PhysicsPointQueryParameters2D::is_collide_with_areas_enabled);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "position"), "set_position", "get_position");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "canvas_instance_id", PROPERTY_HINT_OBJECT_ID), "set_canvas_instance_id", "get_canvas_instance_id");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_2D_PHYSICS), "set_collision_mask", "get_collision_mask");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude", PROPERTY_HINT_ARRAY_TYPE, "RID"), "set_exclude", "get_exclude");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_bodies"), "set_collide_with_bodies", "is_collide_with_bodies_enabled");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_areas"), "set_collide_with_areas", "is_collide_with_areas_enabled");
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
|
||||
void PhysicsShapeQueryParameters2D::set_shape(const RES &p_shape_ref) {
|
||||
ERR_FAIL_COND(p_shape_ref.is_null());
|
||||
shape_ref = p_shape_ref;
|
||||
parameters.shape_rid = p_shape_ref->get_rid();
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters2D::set_shape_rid(const RID &p_shape) {
|
||||
if (parameters.shape_rid != p_shape) {
|
||||
shape_ref = RES();
|
||||
parameters.shape_rid = p_shape;
|
||||
}
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters2D::set_exclude(const Vector<RID> &p_exclude) {
|
||||
parameters.exclude.clear();
|
||||
for (int i = 0; i < p_exclude.size(); i++) {
|
||||
parameters.exclude.insert(p_exclude[i]);
|
||||
}
|
||||
}
|
||||
|
||||
Vector<RID> PhysicsShapeQueryParameters2D::get_exclude() const {
|
||||
Vector<RID> ret;
|
||||
ret.resize(parameters.exclude.size());
|
||||
int idx = 0;
|
||||
for (Set<RID>::Element *E = parameters.exclude.front(); E; E = E->next()) {
|
||||
ret.write[idx++] = E->get();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters2D::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("set_shape", "shape"), &PhysicsShapeQueryParameters2D::set_shape);
|
||||
ClassDB::bind_method(D_METHOD("get_shape"), &PhysicsShapeQueryParameters2D::get_shape);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_shape_rid", "shape"), &PhysicsShapeQueryParameters2D::set_shape_rid);
|
||||
ClassDB::bind_method(D_METHOD("get_shape_rid"), &PhysicsShapeQueryParameters2D::get_shape_rid);
|
||||
|
||||
@ -248,7 +285,7 @@ void PhysicsShapeQueryParameters2D::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("is_collide_with_areas_enabled"), &PhysicsShapeQueryParameters2D::is_collide_with_areas_enabled);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_2D_PHYSICS), "set_collision_mask", "get_collision_mask");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude", PROPERTY_HINT_NONE, itos(Variant::RID) + ":"), "set_exclude", "get_exclude");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude", PROPERTY_HINT_ARRAY_TYPE, "RID"), "set_exclude", "get_exclude");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "margin", PROPERTY_HINT_RANGE, "0,100,0.01"), "set_margin", "get_margin");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "motion"), "set_motion", "get_motion");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shape", PROPERTY_HINT_RESOURCE_TYPE, "Shape2D"), "set_shape", "get_shape");
|
||||
@ -258,80 +295,34 @@ void PhysicsShapeQueryParameters2D::_bind_methods() {
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_areas"), "set_collide_with_areas", "is_collide_with_areas_enabled");
|
||||
}
|
||||
|
||||
Dictionary PhysicsDirectSpaceState2D::_intersect_ray(const Vector2 &p_from, const Vector2 &p_to, const Vector<RID> &p_exclude, uint32_t p_layers, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
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_collide_with_bodies, p_collide_with_areas);
|
||||
Dictionary PhysicsDirectSpaceState2D::_intersect_ray(const Ref<PhysicsRayQueryParameters2D> &p_ray_query) {
|
||||
ERR_FAIL_COND_V(!p_ray_query.is_valid(), Dictionary());
|
||||
|
||||
RayResult result;
|
||||
bool res = intersect_ray(p_ray_query->get_parameters(), result);
|
||||
|
||||
if (!res) {
|
||||
return Dictionary();
|
||||
}
|
||||
|
||||
Dictionary d;
|
||||
d["position"] = inters.position;
|
||||
d["normal"] = inters.normal;
|
||||
d["collider_id"] = inters.collider_id;
|
||||
d["collider"] = inters.collider;
|
||||
d["shape"] = inters.shape;
|
||||
d["rid"] = inters.rid;
|
||||
d["position"] = result.position;
|
||||
d["normal"] = result.normal;
|
||||
d["collider_id"] = result.collider_id;
|
||||
d["collider"] = result.collider;
|
||||
d["shape"] = result.shape;
|
||||
d["rid"] = result.rid;
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
Array PhysicsDirectSpaceState2D::_intersect_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results) {
|
||||
ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
|
||||
|
||||
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.ptrw(), sr.size(), p_shape_query->exclude, p_shape_query->collision_mask, p_shape_query->collide_with_bodies, p_shape_query->collide_with_areas);
|
||||
Array ret;
|
||||
ret.resize(rc);
|
||||
for (int i = 0; i < rc; i++) {
|
||||
Dictionary d;
|
||||
d["rid"] = sr[i].rid;
|
||||
d["collider_id"] = sr[i].collider_id;
|
||||
d["collider"] = sr[i].collider;
|
||||
d["shape"] = sr[i].shape;
|
||||
ret[i] = d;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
Array PhysicsDirectSpaceState2D::_cast_motion(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query) {
|
||||
ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
|
||||
|
||||
real_t 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_mask, p_shape_query->collide_with_bodies, p_shape_query->collide_with_areas);
|
||||
if (!res) {
|
||||
return Array();
|
||||
}
|
||||
Array ret;
|
||||
ret.resize(2);
|
||||
ret[0] = closest_safe;
|
||||
ret[1] = closest_unsafe;
|
||||
return ret;
|
||||
}
|
||||
|
||||
Array PhysicsDirectSpaceState2D::_intersect_point_impl(const Vector2 &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, bool p_filter_by_canvas, ObjectID p_canvas_instance_id) {
|
||||
Set<RID> exclude;
|
||||
for (int i = 0; i < p_exclude.size(); i++) {
|
||||
exclude.insert(p_exclude[i]);
|
||||
}
|
||||
|
||||
Array PhysicsDirectSpaceState2D::_intersect_point(const Ref<PhysicsPointQueryParameters2D> &p_point_query, int p_max_results) {
|
||||
Vector<ShapeResult> ret;
|
||||
ret.resize(p_max_results);
|
||||
|
||||
int rc;
|
||||
if (p_filter_by_canvas) {
|
||||
rc = intersect_point(p_point, ret.ptrw(), ret.size(), exclude, p_layers, p_collide_with_bodies, p_collide_with_areas);
|
||||
} else {
|
||||
rc = intersect_point_on_canvas(p_point, p_canvas_instance_id, ret.ptrw(), ret.size(), exclude, p_layers, p_collide_with_bodies, p_collide_with_areas);
|
||||
}
|
||||
int rc = intersect_point(p_point_query->get_parameters(), ret.ptrw(), ret.size());
|
||||
|
||||
if (rc == 0) {
|
||||
return Array();
|
||||
@ -350,12 +341,39 @@ Array PhysicsDirectSpaceState2D::_intersect_point_impl(const Vector2 &p_point, i
|
||||
return r;
|
||||
}
|
||||
|
||||
Array PhysicsDirectSpaceState2D::_intersect_point(const Vector2 &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) {
|
||||
return _intersect_point_impl(p_point, p_max_results, p_exclude, p_layers, p_collide_with_bodies, p_collide_with_areas);
|
||||
Array PhysicsDirectSpaceState2D::_intersect_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results) {
|
||||
ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
|
||||
|
||||
Vector<ShapeResult> sr;
|
||||
sr.resize(p_max_results);
|
||||
int rc = intersect_shape(p_shape_query->get_parameters(), sr.ptrw(), sr.size());
|
||||
Array ret;
|
||||
ret.resize(rc);
|
||||
for (int i = 0; i < rc; i++) {
|
||||
Dictionary d;
|
||||
d["rid"] = sr[i].rid;
|
||||
d["collider_id"] = sr[i].collider_id;
|
||||
d["collider"] = sr[i].collider;
|
||||
d["shape"] = sr[i].shape;
|
||||
ret[i] = d;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
Array PhysicsDirectSpaceState2D::_intersect_point_on_canvas(const Vector2 &p_point, ObjectID p_canvas_intance_id, int p_max_results, const Vector<RID> &p_exclude, uint32_t p_layers, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
return _intersect_point_impl(p_point, p_max_results, p_exclude, p_layers, p_collide_with_bodies, p_collide_with_areas, true, p_canvas_intance_id);
|
||||
Array PhysicsDirectSpaceState2D::_cast_motion(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query) {
|
||||
ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
|
||||
|
||||
real_t closest_safe, closest_unsafe;
|
||||
bool res = cast_motion(p_shape_query->get_parameters(), closest_safe, closest_unsafe);
|
||||
if (!res) {
|
||||
return Array();
|
||||
}
|
||||
Array ret;
|
||||
ret.resize(2);
|
||||
ret[0] = closest_safe;
|
||||
ret[1] = closest_unsafe;
|
||||
return ret;
|
||||
}
|
||||
|
||||
Array PhysicsDirectSpaceState2D::_collide_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results) {
|
||||
@ -364,7 +382,7 @@ Array PhysicsDirectSpaceState2D::_collide_shape(const Ref<PhysicsShapeQueryParam
|
||||
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.ptrw(), p_max_results, rc, p_shape_query->exclude, p_shape_query->collision_mask, p_shape_query->collide_with_bodies, p_shape_query->collide_with_areas);
|
||||
bool res = collide_shape(p_shape_query->get_parameters(), ret.ptrw(), p_max_results, rc);
|
||||
if (!res) {
|
||||
return Array();
|
||||
}
|
||||
@ -381,7 +399,7 @@ Dictionary PhysicsDirectSpaceState2D::_get_rest_info(const Ref<PhysicsShapeQuery
|
||||
|
||||
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_mask, p_shape_query->collide_with_bodies, p_shape_query->collide_with_areas);
|
||||
bool res = rest_info(p_shape_query->get_parameters(), &sri);
|
||||
Dictionary r;
|
||||
if (!res) {
|
||||
return r;
|
||||
@ -401,13 +419,12 @@ PhysicsDirectSpaceState2D::PhysicsDirectSpaceState2D() {
|
||||
}
|
||||
|
||||
void PhysicsDirectSpaceState2D::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("intersect_point", "point", "max_results", "exclude", "collision_mask", "collide_with_bodies", "collide_with_areas"), &PhysicsDirectSpaceState2D::_intersect_point, DEFVAL(32), DEFVAL(Array()), DEFVAL(UINT32_MAX), DEFVAL(true), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("intersect_point_on_canvas", "point", "canvas_instance_id", "max_results", "exclude", "collision_mask", "collide_with_bodies", "collide_with_areas"), &PhysicsDirectSpaceState2D::_intersect_point_on_canvas, DEFVAL(32), DEFVAL(Array()), DEFVAL(UINT32_MAX), DEFVAL(true), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("intersect_ray", "from", "to", "exclude", "collision_mask", "collide_with_bodies", "collide_with_areas"), &PhysicsDirectSpaceState2D::_intersect_ray, DEFVAL(Array()), DEFVAL(UINT32_MAX), DEFVAL(true), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("intersect_shape", "shape", "max_results"), &PhysicsDirectSpaceState2D::_intersect_shape, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("cast_motion", "shape"), &PhysicsDirectSpaceState2D::_cast_motion);
|
||||
ClassDB::bind_method(D_METHOD("collide_shape", "shape", "max_results"), &PhysicsDirectSpaceState2D::_collide_shape, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("get_rest_info", "shape"), &PhysicsDirectSpaceState2D::_get_rest_info);
|
||||
ClassDB::bind_method(D_METHOD("intersect_point", "parameters", "max_results"), &PhysicsDirectSpaceState2D::_intersect_point, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("intersect_ray", "parameters"), &PhysicsDirectSpaceState2D::_intersect_ray);
|
||||
ClassDB::bind_method(D_METHOD("intersect_shape", "parameters", "max_results"), &PhysicsDirectSpaceState2D::_intersect_shape, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("cast_motion", "parameters"), &PhysicsDirectSpaceState2D::_cast_motion);
|
||||
ClassDB::bind_method(D_METHOD("collide_shape", "parameters", "max_results"), &PhysicsDirectSpaceState2D::_collide_shape, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("get_rest_info", "parameters"), &PhysicsDirectSpaceState2D::_get_rest_info);
|
||||
}
|
||||
|
||||
///////////////////////////////
|
||||
@ -473,7 +490,7 @@ void PhysicsTestMotionParameters2D::_bind_methods() {
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "motion"), "set_motion", "get_motion");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "margin"), "set_margin", "get_margin");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_separation_ray"), "set_collide_separation_ray_enabled", "is_collide_separation_ray_enabled");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude_bodies"), "set_exclude_bodies", "get_exclude_bodies");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude_bodies", PROPERTY_HINT_ARRAY_TYPE, "RID"), "set_exclude_bodies", "get_exclude_bodies");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude_objects"), "set_exclude_objects", "get_exclude_objects");
|
||||
}
|
||||
|
||||
|
@ -94,60 +94,15 @@ public:
|
||||
PhysicsDirectBodyState2D();
|
||||
};
|
||||
|
||||
//used for script
|
||||
class PhysicsShapeQueryParameters2D : public RefCounted {
|
||||
GDCLASS(PhysicsShapeQueryParameters2D, RefCounted);
|
||||
friend class PhysicsDirectSpaceState2D;
|
||||
|
||||
RES shape_ref;
|
||||
RID shape;
|
||||
Transform2D transform;
|
||||
Vector2 motion;
|
||||
real_t margin = 0.0;
|
||||
Set<RID> exclude;
|
||||
uint32_t collision_mask = UINT32_MAX;
|
||||
|
||||
bool collide_with_bodies = true;
|
||||
bool collide_with_areas = false;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
void set_shape(const RES &p_shape_ref);
|
||||
RES get_shape() const;
|
||||
void set_shape_rid(const RID &p_shape);
|
||||
RID get_shape_rid() const;
|
||||
|
||||
void set_transform(const Transform2D &p_transform);
|
||||
Transform2D get_transform() const;
|
||||
|
||||
void set_motion(const Vector2 &p_motion);
|
||||
Vector2 get_motion() const;
|
||||
|
||||
void set_margin(real_t p_margin);
|
||||
real_t get_margin() const;
|
||||
|
||||
void set_collision_mask(uint32_t p_mask);
|
||||
uint32_t get_collision_mask() const;
|
||||
|
||||
void set_collide_with_bodies(bool p_enable);
|
||||
bool is_collide_with_bodies_enabled() const;
|
||||
|
||||
void set_collide_with_areas(bool p_enable);
|
||||
bool is_collide_with_areas_enabled() const;
|
||||
|
||||
void set_exclude(const Vector<RID> &p_exclude);
|
||||
Vector<RID> get_exclude() const;
|
||||
};
|
||||
class PhysicsRayQueryParameters2D;
|
||||
class PhysicsPointQueryParameters2D;
|
||||
class PhysicsShapeQueryParameters2D;
|
||||
|
||||
class PhysicsDirectSpaceState2D : public Object {
|
||||
GDCLASS(PhysicsDirectSpaceState2D, Object);
|
||||
|
||||
Dictionary _intersect_ray(const Vector2 &p_from, const Vector2 &p_to, 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_point(const Vector2 &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_point_on_canvas(const Vector2 &p_point, ObjectID p_canvas_intance_id, 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_point_impl(const Vector2 &p_point, int p_max_results, const Vector<RID> &p_exclud, uint32_t p_layers, bool p_collide_with_bodies, bool p_collide_with_areas, bool p_filter_by_canvas = false, ObjectID p_canvas_instance_id = ObjectID());
|
||||
Dictionary _intersect_ray(const Ref<PhysicsRayQueryParameters2D> &p_ray_query);
|
||||
Array _intersect_point(const Ref<PhysicsPointQueryParameters2D> &p_point_query, int p_max_results = 32);
|
||||
Array _intersect_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results = 32);
|
||||
Array _cast_motion(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query);
|
||||
Array _collide_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results = 32);
|
||||
@ -157,6 +112,16 @@ protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
struct RayParameters {
|
||||
Vector2 from;
|
||||
Vector2 to;
|
||||
Set<RID> exclude;
|
||||
uint32_t collision_mask = UINT32_MAX;
|
||||
|
||||
bool collide_with_bodies = true;
|
||||
bool collide_with_areas = false;
|
||||
};
|
||||
|
||||
struct RayResult {
|
||||
Vector2 position;
|
||||
Vector2 normal;
|
||||
@ -166,7 +131,7 @@ public:
|
||||
int shape = 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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) = 0;
|
||||
virtual bool intersect_ray(const RayParameters &p_parameters, RayResult &r_result) = 0;
|
||||
|
||||
struct ShapeResult {
|
||||
RID rid;
|
||||
@ -175,14 +140,31 @@ public:
|
||||
int shape = 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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false, bool p_pick_point = false) = 0;
|
||||
virtual int intersect_point_on_canvas(const Vector2 &p_point, ObjectID p_canvas_instance_id, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_layer = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false, bool p_pick_point = false) = 0;
|
||||
struct PointParameters {
|
||||
Vector2 position;
|
||||
ObjectID canvas_instance_id;
|
||||
Set<RID> exclude;
|
||||
uint32_t collision_mask = UINT32_MAX;
|
||||
|
||||
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_layer = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) = 0;
|
||||
bool collide_with_bodies = true;
|
||||
bool collide_with_areas = false;
|
||||
|
||||
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_layer = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) = 0;
|
||||
bool pick_point = false;
|
||||
};
|
||||
|
||||
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_layer = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) = 0;
|
||||
virtual int intersect_point(const PointParameters &p_parameters, ShapeResult *r_results, int p_result_max) = 0;
|
||||
|
||||
struct ShapeParameters {
|
||||
RID shape_rid;
|
||||
Transform2D transform;
|
||||
Vector2 motion;
|
||||
real_t margin = 0.0;
|
||||
Set<RID> exclude;
|
||||
uint32_t collision_mask = UINT32_MAX;
|
||||
|
||||
bool collide_with_bodies = true;
|
||||
bool collide_with_areas = false;
|
||||
};
|
||||
|
||||
struct ShapeRestInfo {
|
||||
Vector2 point;
|
||||
@ -190,10 +172,13 @@ public:
|
||||
RID rid;
|
||||
ObjectID collider_id;
|
||||
int shape = 0;
|
||||
Vector2 linear_velocity; //velocity at contact point
|
||||
Vector2 linear_velocity; // Velocity at contact point.
|
||||
};
|
||||
|
||||
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_layer = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) = 0;
|
||||
virtual int intersect_shape(const ShapeParameters &p_parameters, ShapeResult *r_results, int p_result_max) = 0;
|
||||
virtual bool cast_motion(const ShapeParameters &p_parameters, real_t &p_closest_safe, real_t &p_closest_unsafe) = 0;
|
||||
virtual bool collide_shape(const ShapeParameters &p_parameters, Vector2 *r_results, int p_result_max, int &r_result_count) = 0;
|
||||
virtual bool rest_info(const ShapeParameters &p_parameters, ShapeRestInfo *r_info) = 0;
|
||||
|
||||
PhysicsDirectSpaceState2D();
|
||||
};
|
||||
@ -592,6 +577,107 @@ public:
|
||||
~PhysicsServer2D();
|
||||
};
|
||||
|
||||
class PhysicsRayQueryParameters2D : public RefCounted {
|
||||
GDCLASS(PhysicsRayQueryParameters2D, RefCounted);
|
||||
|
||||
PhysicsDirectSpaceState2D::RayParameters parameters;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
const PhysicsDirectSpaceState2D::RayParameters &get_parameters() const { return parameters; }
|
||||
|
||||
void set_from(const Vector2 &p_from) { parameters.from = p_from; }
|
||||
const Vector2 &get_from() const { return parameters.from; }
|
||||
|
||||
void set_to(const Vector2 &p_to) { parameters.to = p_to; }
|
||||
const Vector2 &get_to() const { return parameters.to; }
|
||||
|
||||
void set_collision_mask(uint32_t p_mask) { parameters.collision_mask = p_mask; }
|
||||
uint32_t get_collision_mask() const { return parameters.collision_mask; }
|
||||
|
||||
void set_collide_with_bodies(bool p_enable) { parameters.collide_with_bodies = p_enable; }
|
||||
bool is_collide_with_bodies_enabled() const { return parameters.collide_with_bodies; }
|
||||
|
||||
void set_collide_with_areas(bool p_enable) { parameters.collide_with_areas = p_enable; }
|
||||
bool is_collide_with_areas_enabled() const { return parameters.collide_with_areas; }
|
||||
|
||||
void set_exclude(const Vector<RID> &p_exclude);
|
||||
Vector<RID> get_exclude() const;
|
||||
};
|
||||
|
||||
class PhysicsPointQueryParameters2D : public RefCounted {
|
||||
GDCLASS(PhysicsPointQueryParameters2D, RefCounted);
|
||||
|
||||
PhysicsDirectSpaceState2D::PointParameters parameters;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
const PhysicsDirectSpaceState2D::PointParameters &get_parameters() const { return parameters; }
|
||||
|
||||
void set_position(const Vector2 &p_position) { parameters.position = p_position; }
|
||||
const Vector2 &get_position() const { return parameters.position; }
|
||||
|
||||
void set_canvas_instance_id(ObjectID p_canvas_instance_id) { parameters.canvas_instance_id = p_canvas_instance_id; }
|
||||
ObjectID get_canvas_instance_id() const { return parameters.canvas_instance_id; }
|
||||
|
||||
void set_collision_mask(uint32_t p_mask) { parameters.collision_mask = p_mask; }
|
||||
uint32_t get_collision_mask() const { return parameters.collision_mask; }
|
||||
|
||||
void set_collide_with_bodies(bool p_enable) { parameters.collide_with_bodies = p_enable; }
|
||||
bool is_collide_with_bodies_enabled() const { return parameters.collide_with_bodies; }
|
||||
|
||||
void set_collide_with_areas(bool p_enable) { parameters.collide_with_areas = p_enable; }
|
||||
bool is_collide_with_areas_enabled() const { return parameters.collide_with_areas; }
|
||||
|
||||
void set_exclude(const Vector<RID> &p_exclude);
|
||||
Vector<RID> get_exclude() const;
|
||||
};
|
||||
|
||||
class PhysicsShapeQueryParameters2D : public RefCounted {
|
||||
GDCLASS(PhysicsShapeQueryParameters2D, RefCounted);
|
||||
|
||||
PhysicsDirectSpaceState2D::ShapeParameters parameters;
|
||||
|
||||
RES shape_ref;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
const PhysicsDirectSpaceState2D::ShapeParameters &get_parameters() const { return parameters; }
|
||||
|
||||
void set_shape(const RES &p_shape_ref);
|
||||
RES get_shape() const { return shape_ref; }
|
||||
|
||||
void set_shape_rid(const RID &p_shape);
|
||||
RID get_shape_rid() const { return parameters.shape_rid; }
|
||||
|
||||
void set_transform(const Transform2D &p_transform) { parameters.transform = p_transform; }
|
||||
const Transform2D &get_transform() const { return parameters.transform; }
|
||||
|
||||
void set_motion(const Vector2 &p_motion) { parameters.motion = p_motion; }
|
||||
const Vector2 &get_motion() const { return parameters.motion; }
|
||||
|
||||
void set_margin(real_t p_margin) { parameters.margin = p_margin; }
|
||||
real_t get_margin() const { return parameters.margin; }
|
||||
|
||||
void set_collision_mask(uint32_t p_mask) { parameters.collision_mask = p_mask; }
|
||||
uint32_t get_collision_mask() const { return parameters.collision_mask; }
|
||||
|
||||
void set_collide_with_bodies(bool p_enable) { parameters.collide_with_bodies = p_enable; }
|
||||
bool is_collide_with_bodies_enabled() const { return parameters.collide_with_bodies; }
|
||||
|
||||
void set_collide_with_areas(bool p_enable) { parameters.collide_with_areas = p_enable; }
|
||||
bool is_collide_with_areas_enabled() const { return parameters.collide_with_areas; }
|
||||
|
||||
void set_exclude(const Vector<RID> &p_exclude);
|
||||
Vector<RID> get_exclude() const;
|
||||
};
|
||||
|
||||
class PhysicsTestMotionParameters2D : public RefCounted {
|
||||
GDCLASS(PhysicsTestMotionParameters2D, RefCounted);
|
||||
|
||||
|
@ -137,93 +137,137 @@ PhysicsDirectBodyState3D::PhysicsDirectBodyState3D() {}
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
|
||||
void PhysicsShapeQueryParameters3D::set_shape(const RES &p_shape_ref) {
|
||||
ERR_FAIL_COND(p_shape_ref.is_null());
|
||||
shape_ref = p_shape_ref;
|
||||
shape = p_shape_ref->get_rid();
|
||||
}
|
||||
|
||||
RES PhysicsShapeQueryParameters3D::get_shape() const {
|
||||
return shape_ref;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters3D::set_shape_rid(const RID &p_shape) {
|
||||
if (shape != p_shape) {
|
||||
shape_ref = RES();
|
||||
shape = p_shape;
|
||||
}
|
||||
}
|
||||
|
||||
RID PhysicsShapeQueryParameters3D::get_shape_rid() const {
|
||||
return shape;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters3D::set_transform(const Transform3D &p_transform) {
|
||||
transform = p_transform;
|
||||
}
|
||||
|
||||
Transform3D PhysicsShapeQueryParameters3D::get_transform() const {
|
||||
return transform;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters3D::set_margin(real_t p_margin) {
|
||||
margin = p_margin;
|
||||
}
|
||||
|
||||
real_t PhysicsShapeQueryParameters3D::get_margin() const {
|
||||
return margin;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters3D::set_collision_mask(uint32_t p_collision_mask) {
|
||||
collision_mask = p_collision_mask;
|
||||
}
|
||||
|
||||
uint32_t PhysicsShapeQueryParameters3D::get_collision_mask() const {
|
||||
return collision_mask;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters3D::set_exclude(const Vector<RID> &p_exclude) {
|
||||
exclude.clear();
|
||||
void PhysicsRayQueryParameters3D::set_exclude(const Vector<RID> &p_exclude) {
|
||||
parameters.exclude.clear();
|
||||
for (int i = 0; i < p_exclude.size(); i++) {
|
||||
exclude.insert(p_exclude[i]);
|
||||
parameters.exclude.insert(p_exclude[i]);
|
||||
}
|
||||
}
|
||||
|
||||
Vector<RID> PhysicsShapeQueryParameters3D::get_exclude() const {
|
||||
Vector<RID> PhysicsRayQueryParameters3D::get_exclude() const {
|
||||
Vector<RID> ret;
|
||||
ret.resize(exclude.size());
|
||||
ret.resize(parameters.exclude.size());
|
||||
int idx = 0;
|
||||
for (Set<RID>::Element *E = exclude.front(); E; E = E->next()) {
|
||||
for (Set<RID>::Element *E = parameters.exclude.front(); E; E = E->next()) {
|
||||
ret.write[idx++] = E->get();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters3D::set_collide_with_bodies(bool p_enable) {
|
||||
collide_with_bodies = p_enable;
|
||||
void PhysicsRayQueryParameters3D::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("set_from", "from"), &PhysicsRayQueryParameters3D::set_from);
|
||||
ClassDB::bind_method(D_METHOD("get_from"), &PhysicsRayQueryParameters3D::get_from);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_to", "to"), &PhysicsRayQueryParameters3D::set_to);
|
||||
ClassDB::bind_method(D_METHOD("get_to"), &PhysicsRayQueryParameters3D::get_to);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collision_mask", "collision_mask"), &PhysicsRayQueryParameters3D::set_collision_mask);
|
||||
ClassDB::bind_method(D_METHOD("get_collision_mask"), &PhysicsRayQueryParameters3D::get_collision_mask);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_exclude", "exclude"), &PhysicsRayQueryParameters3D::set_exclude);
|
||||
ClassDB::bind_method(D_METHOD("get_exclude"), &PhysicsRayQueryParameters3D::get_exclude);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collide_with_bodies", "enable"), &PhysicsRayQueryParameters3D::set_collide_with_bodies);
|
||||
ClassDB::bind_method(D_METHOD("is_collide_with_bodies_enabled"), &PhysicsRayQueryParameters3D::is_collide_with_bodies_enabled);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collide_with_areas", "enable"), &PhysicsRayQueryParameters3D::set_collide_with_areas);
|
||||
ClassDB::bind_method(D_METHOD("is_collide_with_areas_enabled"), &PhysicsRayQueryParameters3D::is_collide_with_areas_enabled);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "from"), "set_from", "get_from");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "to"), "set_to", "get_to");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude", PROPERTY_HINT_ARRAY_TYPE, "RID"), "set_exclude", "get_exclude");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_bodies"), "set_collide_with_bodies", "is_collide_with_bodies_enabled");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_areas"), "set_collide_with_areas", "is_collide_with_areas_enabled");
|
||||
}
|
||||
|
||||
bool PhysicsShapeQueryParameters3D::is_collide_with_bodies_enabled() const {
|
||||
return collide_with_bodies;
|
||||
///////////////////////////////////////////////////////
|
||||
|
||||
void PhysicsPointQueryParameters3D::set_exclude(const Vector<RID> &p_exclude) {
|
||||
parameters.exclude.clear();
|
||||
for (int i = 0; i < p_exclude.size(); i++) {
|
||||
parameters.exclude.insert(p_exclude[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters3D::set_collide_with_areas(bool p_enable) {
|
||||
collide_with_areas = p_enable;
|
||||
Vector<RID> PhysicsPointQueryParameters3D::get_exclude() const {
|
||||
Vector<RID> ret;
|
||||
ret.resize(parameters.exclude.size());
|
||||
int idx = 0;
|
||||
for (Set<RID>::Element *E = parameters.exclude.front(); E; E = E->next()) {
|
||||
ret.write[idx++] = E->get();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool PhysicsShapeQueryParameters3D::is_collide_with_areas_enabled() const {
|
||||
return collide_with_areas;
|
||||
void PhysicsPointQueryParameters3D::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("set_position", "position"), &PhysicsPointQueryParameters3D::set_position);
|
||||
ClassDB::bind_method(D_METHOD("get_position"), &PhysicsPointQueryParameters3D::get_position);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collision_mask", "collision_mask"), &PhysicsPointQueryParameters3D::set_collision_mask);
|
||||
ClassDB::bind_method(D_METHOD("get_collision_mask"), &PhysicsPointQueryParameters3D::get_collision_mask);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_exclude", "exclude"), &PhysicsPointQueryParameters3D::set_exclude);
|
||||
ClassDB::bind_method(D_METHOD("get_exclude"), &PhysicsPointQueryParameters3D::get_exclude);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collide_with_bodies", "enable"), &PhysicsPointQueryParameters3D::set_collide_with_bodies);
|
||||
ClassDB::bind_method(D_METHOD("is_collide_with_bodies_enabled"), &PhysicsPointQueryParameters3D::is_collide_with_bodies_enabled);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_collide_with_areas", "enable"), &PhysicsPointQueryParameters3D::set_collide_with_areas);
|
||||
ClassDB::bind_method(D_METHOD("is_collide_with_areas_enabled"), &PhysicsPointQueryParameters3D::is_collide_with_areas_enabled);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "position"), "set_position", "get_position");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude", PROPERTY_HINT_ARRAY_TYPE, "RID"), "set_exclude", "get_exclude");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_bodies"), "set_collide_with_bodies", "is_collide_with_bodies_enabled");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_areas"), "set_collide_with_areas", "is_collide_with_areas_enabled");
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
|
||||
void PhysicsShapeQueryParameters3D::set_shape(const RES &p_shape_ref) {
|
||||
ERR_FAIL_COND(p_shape_ref.is_null());
|
||||
shape_ref = p_shape_ref;
|
||||
parameters.shape_rid = p_shape_ref->get_rid();
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters3D::set_shape_rid(const RID &p_shape) {
|
||||
if (parameters.shape_rid != p_shape) {
|
||||
shape_ref = RES();
|
||||
parameters.shape_rid = p_shape;
|
||||
}
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters3D::set_exclude(const Vector<RID> &p_exclude) {
|
||||
parameters.exclude.clear();
|
||||
for (int i = 0; i < p_exclude.size(); i++) {
|
||||
parameters.exclude.insert(p_exclude[i]);
|
||||
}
|
||||
}
|
||||
|
||||
Vector<RID> PhysicsShapeQueryParameters3D::get_exclude() const {
|
||||
Vector<RID> ret;
|
||||
ret.resize(parameters.exclude.size());
|
||||
int idx = 0;
|
||||
for (Set<RID>::Element *E = parameters.exclude.front(); E; E = E->next()) {
|
||||
ret.write[idx++] = E->get();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void PhysicsShapeQueryParameters3D::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("set_shape", "shape"), &PhysicsShapeQueryParameters3D::set_shape);
|
||||
ClassDB::bind_method(D_METHOD("get_shape"), &PhysicsShapeQueryParameters3D::get_shape);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_shape_rid", "shape"), &PhysicsShapeQueryParameters3D::set_shape_rid);
|
||||
ClassDB::bind_method(D_METHOD("get_shape_rid"), &PhysicsShapeQueryParameters3D::get_shape_rid);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_transform", "transform"), &PhysicsShapeQueryParameters3D::set_transform);
|
||||
ClassDB::bind_method(D_METHOD("get_transform"), &PhysicsShapeQueryParameters3D::get_transform);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_motion", "motion"), &PhysicsShapeQueryParameters3D::set_motion);
|
||||
ClassDB::bind_method(D_METHOD("get_motion"), &PhysicsShapeQueryParameters3D::get_motion);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_margin", "margin"), &PhysicsShapeQueryParameters3D::set_margin);
|
||||
ClassDB::bind_method(D_METHOD("get_margin"), &PhysicsShapeQueryParameters3D::get_margin);
|
||||
|
||||
@ -240,8 +284,9 @@ void PhysicsShapeQueryParameters3D::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("is_collide_with_areas_enabled"), &PhysicsShapeQueryParameters3D::is_collide_with_areas_enabled);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude", PROPERTY_HINT_NONE, itos(Variant::RID) + ":"), "set_exclude", "get_exclude");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude", PROPERTY_HINT_ARRAY_TYPE, "RID"), "set_exclude", "get_exclude");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "margin", PROPERTY_HINT_RANGE, "0,100,0.01"), "set_margin", "get_margin");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "motion"), "set_motion", "get_motion");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shape", PROPERTY_HINT_RESOURCE_TYPE, "Shape3D"), "set_shape", "get_shape");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::RID, "shape_rid"), "set_shape_rid", "get_shape_rid");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM3D, "transform"), "set_transform", "get_transform");
|
||||
@ -251,36 +296,56 @@ void PhysicsShapeQueryParameters3D::_bind_methods() {
|
||||
|
||||
/////////////////////////////////////
|
||||
|
||||
Dictionary PhysicsDirectSpaceState3D::_intersect_ray(const Vector3 &p_from, const Vector3 &p_to, const Vector<RID> &p_exclude, uint32_t p_collision_mask, bool p_collide_with_bodies, bool p_collide_with_areas) {
|
||||
RayResult inters;
|
||||
Set<RID> exclude;
|
||||
for (int i = 0; i < p_exclude.size(); i++) {
|
||||
exclude.insert(p_exclude[i]);
|
||||
}
|
||||
Dictionary PhysicsDirectSpaceState3D::_intersect_ray(const Ref<PhysicsRayQueryParameters3D> &p_ray_query) {
|
||||
ERR_FAIL_COND_V(!p_ray_query.is_valid(), Dictionary());
|
||||
|
||||
bool res = intersect_ray(p_from, p_to, inters, exclude, p_collision_mask, p_collide_with_bodies, p_collide_with_areas);
|
||||
RayResult result;
|
||||
bool res = intersect_ray(p_ray_query->get_parameters(), result);
|
||||
|
||||
if (!res) {
|
||||
return Dictionary();
|
||||
}
|
||||
|
||||
Dictionary d;
|
||||
d["position"] = inters.position;
|
||||
d["normal"] = inters.normal;
|
||||
d["collider_id"] = inters.collider_id;
|
||||
d["collider"] = inters.collider;
|
||||
d["shape"] = inters.shape;
|
||||
d["rid"] = inters.rid;
|
||||
d["position"] = result.position;
|
||||
d["normal"] = result.normal;
|
||||
d["collider_id"] = result.collider_id;
|
||||
d["collider"] = result.collider;
|
||||
d["shape"] = result.shape;
|
||||
d["rid"] = result.rid;
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
Array PhysicsDirectSpaceState3D::_intersect_point(const Ref<PhysicsPointQueryParameters3D> &p_point_query, int p_max_results) {
|
||||
Vector<ShapeResult> ret;
|
||||
ret.resize(p_max_results);
|
||||
|
||||
int rc = intersect_point(p_point_query->get_parameters(), ret.ptrw(), ret.size());
|
||||
|
||||
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 PhysicsDirectSpaceState3D::_intersect_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results) {
|
||||
ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
|
||||
|
||||
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.ptrw(), sr.size(), p_shape_query->exclude, p_shape_query->collision_mask, p_shape_query->collide_with_bodies, p_shape_query->collide_with_areas);
|
||||
int rc = intersect_shape(p_shape_query->get_parameters(), sr.ptrw(), sr.size());
|
||||
Array ret;
|
||||
ret.resize(rc);
|
||||
for (int i = 0; i < rc; i++) {
|
||||
@ -295,11 +360,11 @@ Array PhysicsDirectSpaceState3D::_intersect_shape(const Ref<PhysicsShapeQueryPar
|
||||
return ret;
|
||||
}
|
||||
|
||||
Array PhysicsDirectSpaceState3D::_cast_motion(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, const Vector3 &p_motion) {
|
||||
Array PhysicsDirectSpaceState3D::_cast_motion(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query) {
|
||||
ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
|
||||
|
||||
real_t closest_safe = 1.0f, closest_unsafe = 1.0f;
|
||||
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, p_shape_query->collide_with_bodies, p_shape_query->collide_with_areas);
|
||||
bool res = cast_motion(p_shape_query->get_parameters(), closest_safe, closest_unsafe);
|
||||
if (!res) {
|
||||
return Array();
|
||||
}
|
||||
@ -316,7 +381,7 @@ Array PhysicsDirectSpaceState3D::_collide_shape(const Ref<PhysicsShapeQueryParam
|
||||
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.ptrw(), p_max_results, rc, p_shape_query->exclude, p_shape_query->collision_mask, p_shape_query->collide_with_bodies, p_shape_query->collide_with_areas);
|
||||
bool res = collide_shape(p_shape_query->get_parameters(), ret.ptrw(), p_max_results, rc);
|
||||
if (!res) {
|
||||
return Array();
|
||||
}
|
||||
@ -333,7 +398,7 @@ Dictionary PhysicsDirectSpaceState3D::_get_rest_info(const Ref<PhysicsShapeQuery
|
||||
|
||||
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_mask, p_shape_query->collide_with_bodies, p_shape_query->collide_with_areas);
|
||||
bool res = rest_info(p_shape_query->get_parameters(), &sri);
|
||||
Dictionary r;
|
||||
if (!res) {
|
||||
return r;
|
||||
@ -353,11 +418,12 @@ PhysicsDirectSpaceState3D::PhysicsDirectSpaceState3D() {
|
||||
}
|
||||
|
||||
void PhysicsDirectSpaceState3D::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("intersect_ray", "from", "to", "exclude", "collision_mask", "collide_with_bodies", "collide_with_areas"), &PhysicsDirectSpaceState3D::_intersect_ray, DEFVAL(Array()), DEFVAL(UINT32_MAX), DEFVAL(true), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("intersect_shape", "shape", "max_results"), &PhysicsDirectSpaceState3D::_intersect_shape, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("cast_motion", "shape", "motion"), &PhysicsDirectSpaceState3D::_cast_motion);
|
||||
ClassDB::bind_method(D_METHOD("collide_shape", "shape", "max_results"), &PhysicsDirectSpaceState3D::_collide_shape, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("get_rest_info", "shape"), &PhysicsDirectSpaceState3D::_get_rest_info);
|
||||
ClassDB::bind_method(D_METHOD("intersect_point", "parameters", "max_results"), &PhysicsDirectSpaceState3D::_intersect_point, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("intersect_ray", "parameters"), &PhysicsDirectSpaceState3D::_intersect_ray);
|
||||
ClassDB::bind_method(D_METHOD("intersect_shape", "parameters", "max_results"), &PhysicsDirectSpaceState3D::_intersect_shape, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("cast_motion", "parameters"), &PhysicsDirectSpaceState3D::_cast_motion);
|
||||
ClassDB::bind_method(D_METHOD("collide_shape", "parameters", "max_results"), &PhysicsDirectSpaceState3D::_collide_shape, DEFVAL(32));
|
||||
ClassDB::bind_method(D_METHOD("get_rest_info", "parameters"), &PhysicsDirectSpaceState3D::_get_rest_info);
|
||||
}
|
||||
|
||||
///////////////////////////////
|
||||
@ -427,7 +493,7 @@ void PhysicsTestMotionParameters3D::_bind_methods() {
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "margin"), "set_margin", "get_margin");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "max_collisions"), "set_max_collisions", "get_max_collisions");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_separation_ray"), "set_collide_separation_ray_enabled", "is_collide_separation_ray_enabled");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude_bodies"), "set_exclude_bodies", "get_exclude_bodies");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude_bodies", PROPERTY_HINT_ARRAY_TYPE, "RID"), "set_exclude_bodies", "get_exclude_bodies");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "exclude_objects"), "set_exclude_objects", "get_exclude_objects");
|
||||
}
|
||||
|
||||
|
@ -96,55 +96,18 @@ public:
|
||||
PhysicsDirectBodyState3D();
|
||||
};
|
||||
|
||||
class PhysicsShapeQueryParameters3D : public RefCounted {
|
||||
GDCLASS(PhysicsShapeQueryParameters3D, RefCounted);
|
||||
friend class PhysicsDirectSpaceState3D;
|
||||
|
||||
RES shape_ref;
|
||||
RID shape;
|
||||
Transform3D transform;
|
||||
real_t margin = 0.0;
|
||||
Set<RID> exclude;
|
||||
uint32_t collision_mask = UINT32_MAX;
|
||||
|
||||
bool collide_with_bodies = true;
|
||||
bool collide_with_areas = false;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
void set_shape(const RES &p_shape_ref);
|
||||
RES get_shape() const;
|
||||
void set_shape_rid(const RID &p_shape);
|
||||
RID get_shape_rid() const;
|
||||
|
||||
void set_transform(const Transform3D &p_transform);
|
||||
Transform3D get_transform() const;
|
||||
|
||||
void set_margin(real_t p_margin);
|
||||
real_t get_margin() const;
|
||||
|
||||
void set_collision_mask(uint32_t p_collision_mask);
|
||||
uint32_t get_collision_mask() const;
|
||||
|
||||
void set_exclude(const Vector<RID> &p_exclude);
|
||||
Vector<RID> get_exclude() const;
|
||||
|
||||
void set_collide_with_bodies(bool p_enable);
|
||||
bool is_collide_with_bodies_enabled() const;
|
||||
|
||||
void set_collide_with_areas(bool p_enable);
|
||||
bool is_collide_with_areas_enabled() const;
|
||||
};
|
||||
class PhysicsRayQueryParameters3D;
|
||||
class PhysicsPointQueryParameters3D;
|
||||
class PhysicsShapeQueryParameters3D;
|
||||
|
||||
class PhysicsDirectSpaceState3D : public Object {
|
||||
GDCLASS(PhysicsDirectSpaceState3D, 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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false);
|
||||
Dictionary _intersect_ray(const Ref<PhysicsRayQueryParameters3D> &p_ray_query);
|
||||
Array _intersect_point(const Ref<PhysicsPointQueryParameters3D> &p_point_query, int p_max_results = 32);
|
||||
Array _intersect_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results = 32);
|
||||
Array _cast_motion(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, const Vector3 &p_motion);
|
||||
Array _cast_motion(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query);
|
||||
Array _collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results = 32);
|
||||
Dictionary _get_rest_info(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query);
|
||||
|
||||
@ -152,14 +115,17 @@ protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
struct ShapeResult {
|
||||
RID rid;
|
||||
ObjectID collider_id;
|
||||
Object *collider = nullptr;
|
||||
int shape = 0;
|
||||
};
|
||||
struct RayParameters {
|
||||
Vector3 from;
|
||||
Vector3 to;
|
||||
Set<RID> exclude;
|
||||
uint32_t collision_mask = UINT32_MAX;
|
||||
|
||||
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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) = 0;
|
||||
bool collide_with_bodies = true;
|
||||
bool collide_with_areas = false;
|
||||
|
||||
bool pick_ray = false;
|
||||
};
|
||||
|
||||
struct RayResult {
|
||||
Vector3 position;
|
||||
@ -170,9 +136,37 @@ public:
|
||||
int shape = 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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false, bool p_pick_ray = false) = 0;
|
||||
virtual bool intersect_ray(const RayParameters &p_parameters, RayResult &r_result) = 0;
|
||||
|
||||
virtual int intersect_shape(const RID &p_shape, const Transform3D &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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) = 0;
|
||||
struct ShapeResult {
|
||||
RID rid;
|
||||
ObjectID collider_id;
|
||||
Object *collider = nullptr;
|
||||
int shape = 0;
|
||||
};
|
||||
|
||||
struct PointParameters {
|
||||
Vector3 position;
|
||||
Set<RID> exclude;
|
||||
uint32_t collision_mask = UINT32_MAX;
|
||||
|
||||
bool collide_with_bodies = true;
|
||||
bool collide_with_areas = false;
|
||||
};
|
||||
|
||||
virtual int intersect_point(const PointParameters &p_parameters, ShapeResult *r_results, int p_result_max) = 0;
|
||||
|
||||
struct ShapeParameters {
|
||||
RID shape_rid;
|
||||
Transform3D transform;
|
||||
Vector3 motion;
|
||||
real_t margin = 0.0;
|
||||
Set<RID> exclude;
|
||||
uint32_t collision_mask = UINT32_MAX;
|
||||
|
||||
bool collide_with_bodies = true;
|
||||
bool collide_with_areas = false;
|
||||
};
|
||||
|
||||
struct ShapeRestInfo {
|
||||
Vector3 point;
|
||||
@ -180,14 +174,13 @@ public:
|
||||
RID rid;
|
||||
ObjectID collider_id;
|
||||
int shape = 0;
|
||||
Vector3 linear_velocity; //velocity at contact point
|
||||
Vector3 linear_velocity; // Velocity at contact point.
|
||||
};
|
||||
|
||||
virtual bool cast_motion(const RID &p_shape, const Transform3D &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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false, ShapeRestInfo *r_info = nullptr) = 0;
|
||||
|
||||
virtual bool collide_shape(RID p_shape, const Transform3D &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 = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) = 0;
|
||||
|
||||
virtual bool rest_info(RID p_shape, const Transform3D &p_shape_xform, real_t p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_collision_mask = UINT32_MAX, bool p_collide_with_bodies = true, bool p_collide_with_areas = false) = 0;
|
||||
virtual int intersect_shape(const ShapeParameters &p_parameters, ShapeResult *r_results, int p_result_max) = 0;
|
||||
virtual bool cast_motion(const ShapeParameters &p_parameters, real_t &p_closest_safe, real_t &p_closest_unsafe, ShapeRestInfo *r_info = nullptr) = 0;
|
||||
virtual bool collide_shape(const ShapeParameters &p_parameters, Vector3 *r_results, int p_result_max, int &r_result_count) = 0;
|
||||
virtual bool rest_info(const ShapeParameters &p_parameters, ShapeRestInfo *r_info) = 0;
|
||||
|
||||
virtual Vector3 get_closest_point_to_object_volume(RID p_object, const Vector3 p_point) const = 0;
|
||||
|
||||
@ -785,6 +778,104 @@ public:
|
||||
~PhysicsServer3D();
|
||||
};
|
||||
|
||||
class PhysicsRayQueryParameters3D : public RefCounted {
|
||||
GDCLASS(PhysicsRayQueryParameters3D, RefCounted);
|
||||
|
||||
PhysicsDirectSpaceState3D::RayParameters parameters;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
const PhysicsDirectSpaceState3D::RayParameters &get_parameters() const { return parameters; }
|
||||
|
||||
void set_from(const Vector3 &p_from) { parameters.from = p_from; }
|
||||
const Vector3 &get_from() const { return parameters.from; }
|
||||
|
||||
void set_to(const Vector3 &p_to) { parameters.to = p_to; }
|
||||
const Vector3 &get_to() const { return parameters.to; }
|
||||
|
||||
void set_collision_mask(uint32_t p_mask) { parameters.collision_mask = p_mask; }
|
||||
uint32_t get_collision_mask() const { return parameters.collision_mask; }
|
||||
|
||||
void set_collide_with_bodies(bool p_enable) { parameters.collide_with_bodies = p_enable; }
|
||||
bool is_collide_with_bodies_enabled() const { return parameters.collide_with_bodies; }
|
||||
|
||||
void set_collide_with_areas(bool p_enable) { parameters.collide_with_areas = p_enable; }
|
||||
bool is_collide_with_areas_enabled() const { return parameters.collide_with_areas; }
|
||||
|
||||
void set_exclude(const Vector<RID> &p_exclude);
|
||||
Vector<RID> get_exclude() const;
|
||||
};
|
||||
|
||||
class PhysicsPointQueryParameters3D : public RefCounted {
|
||||
GDCLASS(PhysicsPointQueryParameters3D, RefCounted);
|
||||
|
||||
PhysicsDirectSpaceState3D::PointParameters parameters;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
const PhysicsDirectSpaceState3D::PointParameters &get_parameters() const { return parameters; }
|
||||
|
||||
void set_position(const Vector3 &p_position) { parameters.position = p_position; }
|
||||
const Vector3 &get_position() const { return parameters.position; }
|
||||
|
||||
void set_collision_mask(uint32_t p_mask) { parameters.collision_mask = p_mask; }
|
||||
uint32_t get_collision_mask() const { return parameters.collision_mask; }
|
||||
|
||||
void set_collide_with_bodies(bool p_enable) { parameters.collide_with_bodies = p_enable; }
|
||||
bool is_collide_with_bodies_enabled() const { return parameters.collide_with_bodies; }
|
||||
|
||||
void set_collide_with_areas(bool p_enable) { parameters.collide_with_areas = p_enable; }
|
||||
bool is_collide_with_areas_enabled() const { return parameters.collide_with_areas; }
|
||||
|
||||
void set_exclude(const Vector<RID> &p_exclude);
|
||||
Vector<RID> get_exclude() const;
|
||||
};
|
||||
|
||||
class PhysicsShapeQueryParameters3D : public RefCounted {
|
||||
GDCLASS(PhysicsShapeQueryParameters3D, RefCounted);
|
||||
|
||||
PhysicsDirectSpaceState3D::ShapeParameters parameters;
|
||||
|
||||
RES shape_ref;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
const PhysicsDirectSpaceState3D::ShapeParameters &get_parameters() const { return parameters; }
|
||||
|
||||
void set_shape(const RES &p_shape_ref);
|
||||
RES get_shape() const { return shape_ref; }
|
||||
|
||||
void set_shape_rid(const RID &p_shape);
|
||||
RID get_shape_rid() const { return parameters.shape_rid; }
|
||||
|
||||
void set_transform(const Transform3D &p_transform) { parameters.transform = p_transform; }
|
||||
const Transform3D &get_transform() const { return parameters.transform; }
|
||||
|
||||
void set_motion(const Vector3 &p_motion) { parameters.motion = p_motion; }
|
||||
const Vector3 &get_motion() const { return parameters.motion; }
|
||||
|
||||
void set_margin(real_t p_margin) { parameters.margin = p_margin; }
|
||||
real_t get_margin() const { return parameters.margin; }
|
||||
|
||||
void set_collision_mask(uint32_t p_mask) { parameters.collision_mask = p_mask; }
|
||||
uint32_t get_collision_mask() const { return parameters.collision_mask; }
|
||||
|
||||
void set_collide_with_bodies(bool p_enable) { parameters.collide_with_bodies = p_enable; }
|
||||
bool is_collide_with_bodies_enabled() const { return parameters.collide_with_bodies; }
|
||||
|
||||
void set_collide_with_areas(bool p_enable) { parameters.collide_with_areas = p_enable; }
|
||||
bool is_collide_with_areas_enabled() const { return parameters.collide_with_areas; }
|
||||
|
||||
void set_exclude(const Vector<RID> &p_exclude);
|
||||
Vector<RID> get_exclude() const;
|
||||
};
|
||||
|
||||
class PhysicsTestMotionParameters3D : public RefCounted {
|
||||
GDCLASS(PhysicsTestMotionParameters3D, RefCounted);
|
||||
|
||||
|
@ -209,13 +209,17 @@ void register_server_types() {
|
||||
|
||||
GDREGISTER_VIRTUAL_CLASS(PhysicsDirectBodyState2D);
|
||||
GDREGISTER_VIRTUAL_CLASS(PhysicsDirectSpaceState2D);
|
||||
GDREGISTER_CLASS(PhysicsRayQueryParameters2D);
|
||||
GDREGISTER_CLASS(PhysicsPointQueryParameters2D);
|
||||
GDREGISTER_CLASS(PhysicsShapeQueryParameters2D);
|
||||
GDREGISTER_CLASS(PhysicsTestMotionParameters2D);
|
||||
GDREGISTER_CLASS(PhysicsTestMotionResult2D);
|
||||
GDREGISTER_CLASS(PhysicsShapeQueryParameters2D);
|
||||
|
||||
GDREGISTER_CLASS(PhysicsShapeQueryParameters3D);
|
||||
GDREGISTER_VIRTUAL_CLASS(PhysicsDirectBodyState3D);
|
||||
GDREGISTER_VIRTUAL_CLASS(PhysicsDirectSpaceState3D);
|
||||
GDREGISTER_CLASS(PhysicsRayQueryParameters3D);
|
||||
GDREGISTER_CLASS(PhysicsPointQueryParameters3D);
|
||||
GDREGISTER_CLASS(PhysicsShapeQueryParameters3D);
|
||||
GDREGISTER_CLASS(PhysicsTestMotionParameters3D);
|
||||
GDREGISTER_CLASS(PhysicsTestMotionResult3D);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user