Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
HeightFieldShape.h
Go to the documentation of this file.
1// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
9#ifdef JPH_DEBUG_RENDERER
11#endif // JPH_DEBUG_RENDERER
12
14
15class ConvexShape;
17
20{
22 constexpr float cNoCollisionValue = FLT_MAX;
23
25 constexpr int cStackSize = 128;
26
28 constexpr uint cNumBitsXY = 14;
29 constexpr uint cMaskBitsXY = (1 << cNumBitsXY) - 1;
30 constexpr uint cLevelShift = 2 * cNumBitsXY;
31
33 constexpr uint16 cNoCollisionValue16 = 0xffff;
34 constexpr uint16 cMaxHeightValue16 = 0xfffe;
35};
36
39{
40public:
42
43
45
52 HeightFieldShapeSettings(const float *inSamples, Vec3Arg inOffset, Vec3Arg inScale, uint32 inSampleCount, const uint8 *inMaterialIndices = nullptr, const PhysicsMaterialList &inMaterialList = PhysicsMaterialList());
53
54 // See: ShapeSettings
55 virtual ShapeResult Create() const override;
56
61 void DetermineMinAndMaxSample(float &outMinValue, float &outMaxValue, float &outQuantizationScale) const;
62
66 uint32 CalculateBitsPerSampleForError(float inMaxError) const;
67
70 Vec3 mOffset = Vec3::sZero();
71 Vec3 mScale = Vec3::sReplicate(1.0f);
73
78
83
86
89};
90
92class HeightFieldShape final : public Shape
93{
94public:
96
99 HeightFieldShape(const HeightFieldShapeSettings &inSettings, ShapeResult &outResult);
100
101 // See Shape::MustBeStatic
102 virtual bool MustBeStatic() const override { return true; }
103
104 // See Shape::GetLocalBounds
105 virtual AABox GetLocalBounds() const override;
106
107 // See Shape::GetSubShapeIDBitsRecursive
108 virtual uint GetSubShapeIDBitsRecursive() const override { return GetSubShapeIDBits(); }
109
110 // See Shape::GetInnerRadius
111 virtual float GetInnerRadius() const override { return 0.0f; }
112
113 // See Shape::GetMassProperties
114 virtual MassProperties GetMassProperties() const override;
115
116 // See Shape::GetMaterial
117 virtual const PhysicsMaterial * GetMaterial(const SubShapeID &inSubShapeID) const override;
118
120 const PhysicsMaterial * GetMaterial(uint inX, uint inY) const;
121
122 // See Shape::GetSurfaceNormal
123 virtual Vec3 GetSurfaceNormal(const SubShapeID &inSubShapeID, Vec3Arg inLocalSurfacePosition) const override;
124
125 // See Shape::GetSupportingFace
126 virtual void GetSupportingFace(const SubShapeID &inSubShapeID, Vec3Arg inDirection, Vec3Arg inScale, Mat44Arg inCenterOfMassTransform, SupportingFace &outVertices) const override;
127
128 // See Shape::GetSubmergedVolume
129 virtual void GetSubmergedVolume(Mat44Arg inCenterOfMassTransform, Vec3Arg inScale, const Plane &inSurface, float &outTotalVolume, float &outSubmergedVolume, Vec3 &outCenterOfBuoyancy JPH_IF_DEBUG_RENDERER(, RVec3Arg inBaseOffset)) const override { JPH_ASSERT(false, "Not supported"); }
130
131#ifdef JPH_DEBUG_RENDERER
132 // See Shape::Draw
133 virtual void Draw(DebugRenderer *inRenderer, RMat44Arg inCenterOfMassTransform, Vec3Arg inScale, ColorArg inColor, bool inUseMaterialColors, bool inDrawWireframe) const override;
134#endif // JPH_DEBUG_RENDERER
135
136 // See Shape::CastRay
137 virtual bool CastRay(const RayCast &inRay, const SubShapeIDCreator &inSubShapeIDCreator, RayCastResult &ioHit) const override;
138 virtual void CastRay(const RayCast &inRay, const RayCastSettings &inRayCastSettings, const SubShapeIDCreator &inSubShapeIDCreator, CastRayCollector &ioCollector, const ShapeFilter &inShapeFilter = { }) const override;
139
140 // See: Shape::CollidePoint
141 virtual void CollidePoint(Vec3Arg inPoint, const SubShapeIDCreator &inSubShapeIDCreator, CollidePointCollector &ioCollector, const ShapeFilter &inShapeFilter = { }) const override;
142
143 // See Shape::GetTrianglesStart
144 virtual void GetTrianglesStart(GetTrianglesContext &ioContext, const AABox &inBox, Vec3Arg inPositionCOM, QuatArg inRotation, Vec3Arg inScale) const override;
145
146 // See Shape::GetTrianglesNext
147 virtual int GetTrianglesNext(GetTrianglesContext &ioContext, int inMaxTrianglesRequested, Float3 *outTriangleVertices, const PhysicsMaterial **outMaterials = nullptr) const override;
148
151 Vec3 GetPosition(uint inX, uint inY) const;
152
154 bool IsNoCollision(uint inX, uint inY) const;
155
158 bool ProjectOntoSurface(Vec3Arg inLocalPosition, Vec3 &outSurfacePosition, SubShapeID &outSubShapeID) const;
159
160 // See Shape
161 virtual void SaveBinaryState(StreamOut &inStream) const override;
162 virtual void SaveMaterialState(PhysicsMaterialList &outMaterials) const override;
163 virtual void RestoreMaterialState(const PhysicsMaterialRefC *inMaterials, uint inNumMaterials) override;
164
165 // See Shape::GetStats
166 virtual Stats GetStats() const override;
167
168 // See Shape::GetVolume
169 virtual float GetVolume() const override { return 0; }
170
171#ifdef JPH_DEBUG_RENDERER
172 // Settings
174#endif // JPH_DEBUG_RENDERER
175
176 // Register shape functions with the registry
177 static void sRegister();
178
179protected:
180 // See: Shape::RestoreBinaryState
181 virtual void RestoreBinaryState(StreamIn &inStream) override;
182
183private:
184 class DecodingContext;
185 struct HSGetTrianglesContext;
186
188 void CacheValues();
189
191 void CalculateActiveEdges();
192
194 void StoreMaterialIndices(const Array<uint8> &inMaterialIndices);
195
197 inline uint GetNumBlocks() const { return mSampleCount / mBlockSize; }
198
200 static inline uint sGetMaxLevel(uint inNumBlocks) { return CountTrailingZeros(inNumBlocks); }
201
203 static inline void sGetRangeBlockOffsetAndStride(uint inNumBlocks, uint inMaxLevel, uint &outRangeBlockOffset, uint &outRangeBlockStride);
204
206 inline void GetBlockOffsetAndScale(uint inBlockX, uint inBlockY, uint inRangeBlockOffset, uint inRangeBlockStride, float &outBlockOffset, float &outBlockScale) const;
207
209 inline uint8 GetHeightSample(uint inX, uint inY) const;
210
212 inline Vec3 GetPosition(uint inX, uint inY, float inBlockOffset, float inBlockScale, bool &outNoCollision) const;
213
215 uint GetSubShapeIDBits() const;
216
218 inline SubShapeID EncodeSubShapeID(const SubShapeIDCreator &inCreator, uint inX, uint inY, uint inTriangle) const;
219 inline void DecodeSubShapeID(const SubShapeID &inSubShapeID, uint &outX, uint &outY, uint &outTriangle) const;
220
222 inline uint8 GetEdgeFlags(uint inX, uint inY, uint inTriangle) const;
223
224 // Helper functions called by CollisionDispatch
225 static void sCollideConvexVsHeightField(const Shape *inShape1, const Shape *inShape2, Vec3Arg inScale1, Vec3Arg inScale2, Mat44Arg inCenterOfMassTransform1, Mat44Arg inCenterOfMassTransform2, const SubShapeIDCreator &inSubShapeIDCreator1, const SubShapeIDCreator &inSubShapeIDCreator2, const CollideShapeSettings &inCollideShapeSettings, CollideShapeCollector &ioCollector, const ShapeFilter &inShapeFilter);
226 static void sCollideSphereVsHeightField(const Shape *inShape1, const Shape *inShape2, Vec3Arg inScale1, Vec3Arg inScale2, Mat44Arg inCenterOfMassTransform1, Mat44Arg inCenterOfMassTransform2, const SubShapeIDCreator &inSubShapeIDCreator1, const SubShapeIDCreator &inSubShapeIDCreator2, const CollideShapeSettings &inCollideShapeSettings, CollideShapeCollector &ioCollector, const ShapeFilter &inShapeFilter);
227 static void sCastConvexVsHeightField(const ShapeCast &inShapeCast, const ShapeCastSettings &inShapeCastSettings, const Shape *inShape, Vec3Arg inScale, const ShapeFilter &inShapeFilter, Mat44Arg inCenterOfMassTransform2, const SubShapeIDCreator &inSubShapeIDCreator1, const SubShapeIDCreator &inSubShapeIDCreator2, CastShapeCollector &ioCollector);
228 static void sCastSphereVsHeightField(const ShapeCast &inShapeCast, const ShapeCastSettings &inShapeCastSettings, const Shape *inShape, Vec3Arg inScale, const ShapeFilter &inShapeFilter, Mat44Arg inCenterOfMassTransform2, const SubShapeIDCreator &inSubShapeIDCreator1, const SubShapeIDCreator &inSubShapeIDCreator2, CastShapeCollector &ioCollector);
229
231 template <class Visitor>
232 JPH_INLINE void WalkHeightField(Visitor &ioVisitor) const;
233
235 struct alignas(16) RangeBlock
236 {
237 uint16 mMin[4];
238 uint16 mMax[4];
239 };
240
242 static const uint sGridOffsets[];
243
248
250 uint32 mSampleCount = 0;
251 uint32 mBlockSize = 2;
253 uint8 mSampleMask = 0xff;
256 Array<RangeBlock> mRangeBlocks;
258 Array<uint8> mActiveEdges;
259
263 uint32 mNumBitsPerMaterialIndex = 0;
264
265#ifdef JPH_DEBUG_RENDERER
267 mutable Array<DebugRenderer::GeometryRef> mGeometry;
268 mutable bool mCachedUseMaterialColors = false;
269#endif // JPH_DEBUG_RENDERER
270};
271
uint32_t uint32
Definition: Core.h:312
unsigned int uint
Definition: Core.h:309
#define JPH_NAMESPACE_END
Definition: Core.h:240
uint8_t uint8
Definition: Core.h:310
uint16_t uint16
Definition: Core.h:311
#define JPH_IF_DEBUG_RENDERER(...)
Definition: Core.h:378
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:234
#define JPH_ASSERT(...)
Definition: IssueReporting.h:33
uint CountTrailingZeros(uint32 inValue)
Compute number of trailing zero bits (how many low bits are zero)
Definition: Math.h:95
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition: Memory.h:29
Array< RefConst< PhysicsMaterial > > PhysicsMaterialList
Definition: PhysicsMaterial.h:50
std::vector< T, STLAllocator< T > > Array
Definition: STLAllocator.h:81
#define JPH_DECLARE_SERIALIZABLE_VIRTUAL(class_name)
Definition: SerializableObject.h:100
EShapeSubType
This enumerates all shape types, each shape can return its type through Shape::GetSubType.
Definition: Shape.h:71
EShapeType
Shapes are categorized in groups, each shape can return which group it belongs to through its Shape::...
Definition: Shape.h:55
@ HeightField
Used by HeightFieldShape.
Axis aligned box.
Definition: AABox.h:16
Settings to be passed with a collision query.
Definition: CollideShape.h:94
Virtual interface that allows collecting multiple collision results.
Definition: CollisionCollector.h:45
Class that holds an RGBA color with 8-bits per component.
Definition: Color.h:16
Base class for all convex shapes. Defines a virtual interface.
Definition: ConvexShape.h:36
Simple triangle renderer for debugging purposes.
Definition: DebugRenderer.h:25
Class that holds 3 floats. Used as a storage class. Convert to Vec3 for calculations.
Definition: Float3.h:13
Definition: HeightFieldShape.cpp:1058
A height field shape. Cannot be used as a dynamic object.
Definition: HeightFieldShape.h:93
virtual float GetInnerRadius() const override
Definition: HeightFieldShape.h:111
JPH_OVERRIDE_NEW_DELETE HeightFieldShape()
Constructor.
Definition: HeightFieldShape.h:98
static bool sDrawTriangleOutlines
Definition: HeightFieldShape.h:173
virtual uint GetSubShapeIDBitsRecursive() const override
Get the max number of sub shape ID bits that are needed to be able to address any leaf shape in this ...
Definition: HeightFieldShape.h:108
virtual void GetSubmergedVolume(Mat44Arg inCenterOfMassTransform, Vec3Arg inScale, const Plane &inSurface, float &outTotalVolume, float &outSubmergedVolume, Vec3 &outCenterOfBuoyancy JPH_IF_DEBUG_RENDERER(, RVec3Arg inBaseOffset)) const override
Definition: HeightFieldShape.h:129
virtual bool MustBeStatic() const override
Check if this shape can only be used to create a static body or if it can also be dynamic/kinematic.
Definition: HeightFieldShape.h:102
virtual float GetVolume() const override
Definition: HeightFieldShape.h:169
Class that constructs a HeightFieldShape.
Definition: HeightFieldShape.h:39
void DetermineMinAndMaxSample(float &outMinValue, float &outMaxValue, float &outQuantizationScale) const
Definition: HeightFieldShape.cpp:105
Vec3 mOffset
Definition: HeightFieldShape.h:70
Array< float > mHeightSamples
Definition: HeightFieldShape.h:84
uint32 mBitsPerSample
Definition: HeightFieldShape.h:82
uint32 mSampleCount
Definition: HeightFieldShape.h:72
uint32 mBlockSize
Definition: HeightFieldShape.h:77
virtual ShapeResult Create() const override
Create a shape according to the settings specified by this object.
Definition: HeightFieldShape.cpp:98
Vec3 mScale
Definition: HeightFieldShape.h:71
Array< uint8 > mMaterialIndices
Definition: HeightFieldShape.h:85
PhysicsMaterialList mMaterials
The materials of square at (x, y) is: mMaterials[mMaterialIndices[x + y * (mSampleCount - 1)]].
Definition: HeightFieldShape.h:88
uint32 CalculateBitsPerSampleForError(float inMaxError) const
Definition: HeightFieldShape.cpp:124
Describes the mass and inertia properties of a body. Used during body construction only.
Definition: MassProperties.h:16
Holds a 4x4 matrix of floats, but supports also operations on the 3x3 upper left part of the matrix.
Definition: Mat44.h:13
Definition: PhysicsMaterial.h:23
An infinite plane described by the formula X . Normal + Constant = 0.
Definition: Plane.h:11
Definition: Quat.h:33
Specialization of cast result against a shape.
Definition: CastResult.h:27
Settings to be passed with a ray cast.
Definition: RayCast.h:64
Settings to be passed with a shape cast.
Definition: ShapeCast.h:92
Filter class.
Definition: ShapeFilter.h:17
Base class for all shapes (collision volume of a body). Defines a virtual interface for collision det...
Definition: Shape.h:170
Definition: Shape.h:135
Result< Ref< Shape > > ShapeResult
Definition: Shape.h:139
Simple binary input stream.
Definition: StreamIn.h:11
Simple binary output stream.
Definition: StreamOut.h:11
Definition: SubShapeID.h:108
A sub shape id contains a path to an element (usually a triangle or other primitive type) of a compou...
Definition: SubShapeID.h:23
Definition: Vec3.h:16
static JPH_INLINE Vec3 sZero()
Vector with all zeros.
Definition: Vec3.inl:107
static JPH_INLINE Vec3 sReplicate(float inV)
Replicate inV across all components.
Definition: Vec3.inl:118
Constants for HeightFieldShape, this was moved out of the HeightFieldShape because of a linker bug.
Definition: HeightFieldShape.h:20
constexpr uint cNumBitsXY
A position in the hierarchical grid is defined by a level (which grid), x and y position....
Definition: HeightFieldShape.h:28
constexpr uint cMaskBitsXY
Definition: HeightFieldShape.h:29
constexpr int cStackSize
Stack size to use during WalkHeightField.
Definition: HeightFieldShape.h:25
constexpr uint16 cMaxHeightValue16
This is the maximum allowed height value.
Definition: HeightFieldShape.h:34
constexpr float cNoCollisionValue
Value used to create gaps in the height field.
Definition: HeightFieldShape.h:22
constexpr uint16 cNoCollisionValue16
When height samples are converted to 16 bit:
Definition: HeightFieldShape.h:33
constexpr uint cLevelShift
Definition: HeightFieldShape.h:30
Definition: HeightFieldShape.cpp:1674
Definition: RayCast.h:41
Definition: ShapeCast.h:69