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 "Physics/BsPhysicsCommon.h"
7#include "Math/BsVector3.h"
8#include "Math/BsQuaternion.h"
9
10namespace bs
11{
12 /** @addtogroup Physics-Internal
13 * @{
14 */
15
16 /** Provides common functionality used by all Collider types. */
17 class BS_CORE_EXPORT FCollider
18 {
19 public:
20 virtual ~FCollider() = default;
21
22 /** Returns the position of the collider. */
23 virtual Vector3 getPosition() const = 0;
24
25 /** Returns the rotation of the collider. */
26 virtual Quaternion getRotation() const = 0;
27
28 /** Sets the position and rotation of the collider. */
29 virtual void setTransform(const Vector3& pos, const Quaternion& rotation) = 0;
30
31 /**
32 * Enables/disables a collider as a trigger. A trigger will not be used for collisions (objects will pass
33 * through it), but collision events will still be reported.
34 */
35 virtual void setIsTrigger(bool value) = 0;
36
37 /** @copydoc setIsTrigger() */
38 virtual bool getIsTrigger() const = 0;
39
40 /**
41 * Determines whether the collider is a part of a rigidbody (non-static), or is on its own (static). You should
42 * change this whenever you are attaching or detaching a collider from a rigidbody.
43 */
44 virtual void setIsStatic(bool value) = 0;
45
46 /** @copydoc setIsStatic() */
47 virtual bool getIsStatic() const = 0;
48
49 /**
50 * Determines the mass of the collider. Only relevant if the collider is part of a rigidbody. Ultimately this will
51 * determine the total mass, center of mass and inertia tensors of the parent rigidbody (if they're being calculated
52 * automatically).
53 */
54 virtual void setMass(float mass) { mMass = mass; }
55
56 /** @copydoc setMass() */
57 virtual float getMass() const { return mMass; }
58
59 /**
60 * Determines the physical material of the collider. The material determines how objects hitting the collider
61 * behave.
62 */
63 virtual void setMaterial(const HPhysicsMaterial& material);
64
65 /** @copydoc setMaterial() */
66 virtual HPhysicsMaterial getMaterial() const { return mMaterial; }
67
68 /**
69 * Determines how far apart do two shapes need to be away from each other before the physics runtime starts
70 * generating repelling impulse for them. This distance will be the sum of contact offsets of the two interacting
71 * objects. If objects are moving fast you can increase this value to start generating the impulse earlier and
72 * potentially prevent the objects from interpenetrating. This value is in meters. Must be positive and greater
73 * than rest offset.
74 *
75 * Also see setRestOffset().
76 */
77 virtual void setContactOffset(float value) = 0;
78
79 /** @copydoc setContactOffset() */
80 virtual float getContactOffset() const = 0;
81
82 /**
83 * Determines at what distance should two objects resting on one another come to an equilibrium. The value used in
84 * the runtime will be the sum of rest offsets for both interacting objects. This value is in meters. Cannot be
85 * larger than contact offset.
86 *
87 * Also see setContactOffset().
88 */
89 virtual void setRestOffset(float value) = 0;
90
91 /** @copydoc setRestOffset() */
92 virtual float getRestOffset() const = 0;
93
94 /** Determines the layer of the collider. Layer controls with which objects will the collider collide. */
95 virtual void setLayer(UINT64 layer) = 0;
96
97 /** @copydoc setLayer() */
98 virtual UINT64 getLayer() const = 0;
99
100 /** Determines which (if any) collision events are reported. */
101 virtual void setCollisionReportMode(CollisionReportMode mode) = 0;
102
103 /** @copydoc setCollisionReportMode() */
104 virtual CollisionReportMode getCollisionReportMode() const = 0;
105
106 /** Enables continous collision detect for this collider. Only valid if the collider is a part of a rigidbody. */
107 virtual void _setCCD(bool enabled) = 0;
108 protected:
109 float mMass = 1.0f;
110
111 HPhysicsMaterial mMaterial;
112 };
113
114 /** @} */
115}