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 "Resources/BsResource.h"
7
8namespace bs
9{
10 /** @addtogroup Physics
11 * @{
12 */
13
14 class FPhysicsMesh;
15
16 /**
17 * Represents a physics mesh that can be used with a MeshCollider. Physics mesh can be a generic triangle mesh
18 * or a convex mesh. Convex meshes are limited to 255 faces.
19 */
20 class BS_CORE_EXPORT BS_SCRIPT_EXPORT(m:Physics) PhysicsMesh : public Resource
21 {
22 public:
23 PhysicsMesh(const SPtr<MeshData>& meshData, PhysicsMeshType type);
24 virtual ~PhysicsMesh() = default;
25
26 /** Returns the type of the physics mesh. */
27 BS_SCRIPT_EXPORT(n:Type,pr:getter)
28 PhysicsMeshType getType() const;
29
30 /** Returns the mesh's indices and vertices. */
31 SPtr<MeshData> getMeshData() const;
32
33 /**
34 * Creates a new physics mesh.
35 *
36 * @param[in] meshData Index and vertices of the mesh data.
37 * @param[in] type Type of the mesh. If convex the provided mesh geometry will be converted into a convex
38 * mesh (that might not be the same as the provided mesh data).
39 */
40 static HPhysicsMesh create(const SPtr<MeshData>& meshData, PhysicsMeshType type = PhysicsMeshType::Convex);
41
42 /** @name Internal
43 * @{
44 */
45
46 /** Returns the internal implementation of the physics mesh. */
47 virtual FPhysicsMesh* _getInternal() { return mInternal.get(); }
48
49 /**
50 * @copydoc create()
51 *
52 * For internal use. Requires manual initialization after creation.
53 */
54 static SPtr<PhysicsMesh> _createPtr(const SPtr<MeshData>& meshData, PhysicsMeshType type);
55
56 /** @} */
57
58 protected:
59 /** @copydoc Resource::initialize() */
60 void initialize() override;
61
62 SPtr<FPhysicsMesh> mInternal;
63 SPtr<MeshData> mInitMeshData; // Transient, only used during initalization
64 PhysicsMeshType mType; // Transient, only used during initalization
65
66 /************************************************************************/
67 /* SERIALIZATION */
68 /************************************************************************/
69 public:
70 friend class PhysicsMeshRTTI;
71 static RTTITypeBase* getRTTIStatic();
72 RTTITypeBase* getRTTI() const override;
73 };
74
75 /** @} */
76 /** @addtogroup Physics-Internal
77 * @{
78 */
79
80 /** Foundation that contains a specific implementation of a PhysicsMesh. */
81 class BS_CORE_EXPORT FPhysicsMesh : public IReflectable
82 {
83 public:
84 FPhysicsMesh(const SPtr<MeshData>& meshData, PhysicsMeshType type);
85 virtual ~FPhysicsMesh();
86
87 /** Returns the mesh's indices and vertices. */
88 virtual SPtr<MeshData> getMeshData() const = 0;
89
90 protected:
91 friend class PhysicsMesh;
92
93 PhysicsMeshType mType;
94
95 /************************************************************************/
96 /* SERIALIZATION */
97 /************************************************************************/
98 public:
99 friend class FPhysicsMeshRTTI;
100 static RTTITypeBase* getRTTIStatic();
101 RTTITypeBase* getRTTI() const override;
102 };
103
104 /** @} */
105}