1//************************************ bs::framework - Copyright 2018 Marko Pintera **************************************//
2//*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********//
3#pragma once
4
5#include "BsCorePrerequisites.h"
6#include "Math/BsVector3.h"
7#include "Math/BsVector2.h"
8
9namespace bs
10{
11 /** @addtogroup Physics
12 * @{
13 */
14
15 /** Information about a single contact point during physics collision. */
16 struct BS_SCRIPT_EXPORT(m:Physics,pl:true) ContactPoint
17 {
18 Vector3 position; /**< Contact point in world space. */
19 Vector3 normal; /**< Normal pointing from the second shape to the first shape. */
20 /** Impulse applied to the objects to keep them from penetrating. Divide by simulation step to get the force. */
21 float impulse;
22 float separation; /**< Determines how far are the objects. Negative value denotes penetration. */
23 };
24
25 /** Information about a collision between two physics objects. */
26 struct CollisionDataRaw
27 {
28 Collider* colliders[2]; /**< Colliders involved in the collision. */
29
30 // Note: Not too happy this is heap allocated, use static allocator?
31 Vector<ContactPoint> contactPoints; /**< Information about all the contact points for the hit. */
32 };
33
34 /** Information about a collision between two physics objects. */
35 struct BS_SCRIPT_EXPORT(m:Physics,pl:true) CollisionData
36 {
37 /** Components of the colliders that have collided. */
38 HCollider collider[2];
39
40 // Note: Not too happy this is heap allocated, use static allocator?
41 Vector<ContactPoint> contactPoints; /**< Information about all the contact points for the hit. */
42 };
43
44 /** Determines what parent, if any, owns a physics object. */
45 enum class PhysicsOwnerType
46 {
47 None, /** No parent, object is used directly. */
48 Component, /** Object is used by a C++ Component. */
49 Script /** Object is used by the scripting system. */
50 };
51
52 /** Contains information about a parent for a physics object. */
53 struct PhysicsObjectOwner
54 {
55 PhysicsOwnerType type = PhysicsOwnerType::None; /**< Type of owner. */
56 void* ownerData = nullptr; /**< Data managed by the owner. */
57 };
58
59 /** Determines which collision events will be reported by physics objects. */
60 enum class BS_SCRIPT_EXPORT(m:Physics) CollisionReportMode
61 {
62 None, /**< No collision events will be triggered. */
63 Report, /**< Collision events will be triggered when object enters and/or leaves collision. */
64 /**
65 * Collision events will be triggered when object enters and/or leaves collision, but also every frame the object
66 * remains in collision.
67 */
68 ReportPersistent,
69 };
70
71 /** Hit information from a physics query. */
72 struct BS_SCRIPT_EXPORT(m:Physics,pl:true) PhysicsQueryHit
73 {
74 Vector3 point; /**< Position of the hit in world space. */
75 Vector3 normal; /**< Normal to the surface that was hit. */
76 Vector2 uv; /**< Barycentric coordinates of the triangle that was hit (only applicable when triangle meshes are hit). */
77 float distance = 0.0f; /**< Distance from the query origin to the hit position. */
78 UINT32 triangleIdx = 0; /**< Index of the triangle that was hit (only applicable when triangle meshes are hit). */
79
80 /**
81 * Unmapped index of the triangle that was hit (only applicable when triangle meshes are hit).
82 * It represents an index into the original MeshData used to create the PhysicsMesh associated with @p collider.
83 * In contrast, @p triangleIdx is only a valid index for the MeshData directly obtained from #collider which can
84 * differ from the original MeshData due to the internal implementation.
85 */
86 UINT32 unmappedTriangleIdx = 0;
87
88 /**
89 * Component of the collider that was hit. This may be null if the hit collider has no owner component, in which
90 * case refer to #colliderRaw.
91 */
92 HCollider collider;
93
94 BS_SCRIPT_EXPORT(ex:true)
95 Collider* colliderRaw = nullptr; /**< Collider that was hit. */
96 };
97
98 /** @} */
99}