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;
17class TempAllocator;
18
21{
23 constexpr float cNoCollisionValue = FLT_MAX;
24
26 constexpr int cStackSize = 128;
27
29 constexpr uint cNumBitsXY = 14;
30 constexpr uint cMaskBitsXY = (1 << cNumBitsXY) - 1;
31 constexpr uint cLevelShift = 2 * cNumBitsXY;
32
34 constexpr uint16 cNoCollisionValue16 = 0xffff;
35 constexpr uint16 cMaxHeightValue16 = 0xfffe;
36};
37
40{
41public:
43
44
46
53 HeightFieldShapeSettings(const float *inSamples, Vec3Arg inOffset, Vec3Arg inScale, uint32 inSampleCount, const uint8 *inMaterialIndices = nullptr, const PhysicsMaterialList &inMaterialList = PhysicsMaterialList());
54
55 // See: ShapeSettings
56 virtual ShapeResult Create() const override;
57
62 void DetermineMinAndMaxSample(float &outMinValue, float &outMaxValue, float &outQuantizationScale) const;
63
67 uint32 CalculateBitsPerSampleForError(float inMaxError) const;
68
71 Vec3 mOffset = Vec3::sZero();
72 Vec3 mScale = Vec3::sReplicate(1.0f);
73 uint32 mSampleCount = 0;
74
76 float mMinHeightValue = FLT_MAX;
77
79 float mMaxHeightValue = -FLT_MAX;
80
84 uint32 mBlockSize = 2;
85
89 uint32 mBitsPerSample = 8;
90
92 Array<float> mHeightSamples;
93
95 Array<uint8> mMaterialIndices;
96
99
103 float mActiveEdgeCosThresholdAngle = 0.996195f; // cos(5 degrees)
104};
105
108{
109public:
111
114 HeightFieldShape(const HeightFieldShapeSettings &inSettings, ShapeResult &outResult);
115 virtual ~HeightFieldShape() override;
116
117 // See Shape::MustBeStatic
118 virtual bool MustBeStatic() const override { return true; }
119
121 inline uint GetSampleCount() const { return mSampleCount; }
122
124 inline uint GetBlockSize() const { return mBlockSize; }
125
126 // See Shape::GetLocalBounds
127 virtual AABox GetLocalBounds() const override;
128
129 // See Shape::GetSubShapeIDBitsRecursive
130 virtual uint GetSubShapeIDBitsRecursive() const override { return GetSubShapeIDBits(); }
131
132 // See Shape::GetInnerRadius
133 virtual float GetInnerRadius() const override { return 0.0f; }
134
135 // See Shape::GetMassProperties
136 virtual MassProperties GetMassProperties() const override;
137
138 // See Shape::GetMaterial
139 virtual const PhysicsMaterial * GetMaterial(const SubShapeID &inSubShapeID) const override;
140
142 const PhysicsMaterial * GetMaterial(uint inX, uint inY) const;
143
144 // See Shape::GetSurfaceNormal
145 virtual Vec3 GetSurfaceNormal(const SubShapeID &inSubShapeID, Vec3Arg inLocalSurfacePosition) const override;
146
147 // See Shape::GetSupportingFace
148 virtual void GetSupportingFace(const SubShapeID &inSubShapeID, Vec3Arg inDirection, Vec3Arg inScale, Mat44Arg inCenterOfMassTransform, SupportingFace &outVertices) const override;
149
150 // See Shape::GetSubmergedVolume
151 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"); }
152
153#ifdef JPH_DEBUG_RENDERER
154 // See Shape::Draw
155 virtual void Draw(DebugRenderer *inRenderer, RMat44Arg inCenterOfMassTransform, Vec3Arg inScale, ColorArg inColor, bool inUseMaterialColors, bool inDrawWireframe) const override;
156#endif // JPH_DEBUG_RENDERER
157
158 // See Shape::CastRay
159 virtual bool CastRay(const RayCast &inRay, const SubShapeIDCreator &inSubShapeIDCreator, RayCastResult &ioHit) const override;
160 virtual void CastRay(const RayCast &inRay, const RayCastSettings &inRayCastSettings, const SubShapeIDCreator &inSubShapeIDCreator, CastRayCollector &ioCollector, const ShapeFilter &inShapeFilter = { }) const override;
161
162 // See: Shape::CollidePoint
163 virtual void CollidePoint(Vec3Arg inPoint, const SubShapeIDCreator &inSubShapeIDCreator, CollidePointCollector &ioCollector, const ShapeFilter &inShapeFilter = { }) const override;
164
165 // See: Shape::CollideSoftBodyVertices
166 virtual void CollideSoftBodyVertices(Mat44Arg inCenterOfMassTransform, Vec3Arg inScale, SoftBodyVertex *ioVertices, uint inNumVertices, float inDeltaTime, Vec3Arg inDisplacementDueToGravity, int inCollidingShapeIndex) const override;
167
168 // See Shape::GetTrianglesStart
169 virtual void GetTrianglesStart(GetTrianglesContext &ioContext, const AABox &inBox, Vec3Arg inPositionCOM, QuatArg inRotation, Vec3Arg inScale) const override;
170
171 // See Shape::GetTrianglesNext
172 virtual int GetTrianglesNext(GetTrianglesContext &ioContext, int inMaxTrianglesRequested, Float3 *outTriangleVertices, const PhysicsMaterial **outMaterials = nullptr) const override;
173
176 Vec3 GetPosition(uint inX, uint inY) const;
177
179 bool IsNoCollision(uint inX, uint inY) const;
180
183 bool ProjectOntoSurface(Vec3Arg inLocalPosition, Vec3 &outSurfacePosition, SubShapeID &outSubShapeID) const;
184
186 float GetMinHeightValue() const { return mOffset.GetY(); }
187 float GetMaxHeightValue() const { return mOffset.GetY() + mScale.GetY() * HeightFieldShapeConstants::cMaxHeightValue16; }
188
197 void GetHeights(uint inX, uint inY, uint inSizeX, uint inSizeY, float *outHeights, intptr_t inHeightsStride) const;
198
209 void SetHeights(uint inX, uint inY, uint inSizeX, uint inSizeY, const float *inHeights, intptr_t inHeightsStride, TempAllocator &inAllocator, float inActiveEdgeCosThresholdAngle = 0.996195f);
210
212 const PhysicsMaterialList & GetMaterialList() const { return mMaterials; }
213
221 void GetMaterials(uint inX, uint inY, uint inSizeX, uint inSizeY, uint8 *outMaterials, intptr_t inMaterialsStride) const;
222
233 bool SetMaterials(uint inX, uint inY, uint inSizeX, uint inSizeY, const uint8 *inMaterials, intptr_t inMaterialsStride, const PhysicsMaterialList *inMaterialList, TempAllocator &inAllocator);
234
235 // See Shape
236 virtual void SaveBinaryState(StreamOut &inStream) const override;
237 virtual void SaveMaterialState(PhysicsMaterialList &outMaterials) const override;
238 virtual void RestoreMaterialState(const PhysicsMaterialRefC *inMaterials, uint inNumMaterials) override;
239
240 // See Shape::GetStats
241 virtual Stats GetStats() const override;
242
243 // See Shape::GetVolume
244 virtual float GetVolume() const override { return 0; }
245
246#ifdef JPH_DEBUG_RENDERER
247 // Settings
249#endif // JPH_DEBUG_RENDERER
250
251 // Register shape functions with the registry
252 static void sRegister();
253
254protected:
255 // See: Shape::RestoreBinaryState
256 virtual void RestoreBinaryState(StreamIn &inStream) override;
257
258private:
259 class DecodingContext;
260 struct HSGetTrianglesContext;
261
263 void CacheValues();
264
266 void AllocateBuffers();
267
269 void CalculateActiveEdges(uint inX, uint inY, uint inSizeX, uint inSizeY, const float *inHeights, uint inHeightsStartX, uint inHeightsStartY, intptr_t inHeightsStride, float inHeightsScale, float inActiveEdgeCosThresholdAngle, TempAllocator &inAllocator);
270
272 void CalculateActiveEdges(const HeightFieldShapeSettings &inSettings);
273
275 void StoreMaterialIndices(const HeightFieldShapeSettings &inSettings);
276
278 inline uint GetNumBlocks() const { return mSampleCount / mBlockSize; }
279
281 static inline uint sGetMaxLevel(uint inNumBlocks) { return 32 - CountLeadingZeros(inNumBlocks - 1); }
282
284 static inline void sGetRangeBlockOffsetAndStride(uint inNumBlocks, uint inMaxLevel, uint &outRangeBlockOffset, uint &outRangeBlockStride);
285
287 inline void GetBlockOffsetAndScale(uint inBlockX, uint inBlockY, uint inRangeBlockOffset, uint inRangeBlockStride, float &outBlockOffset, float &outBlockScale) const;
288
290 inline uint8 GetHeightSample(uint inX, uint inY) const;
291
293 inline Vec3 GetPosition(uint inX, uint inY, float inBlockOffset, float inBlockScale, bool &outNoCollision) const;
294
296 uint GetSubShapeIDBits() const;
297
299 inline SubShapeID EncodeSubShapeID(const SubShapeIDCreator &inCreator, uint inX, uint inY, uint inTriangle) const;
300 inline void DecodeSubShapeID(const SubShapeID &inSubShapeID, uint &outX, uint &outY, uint &outTriangle) const;
301
303 inline uint8 GetEdgeFlags(uint inX, uint inY, uint inTriangle) const;
304
305 // Helper functions called by CollisionDispatch
306 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);
307 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);
308 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);
309 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);
310
313 template <class Visitor>
314 void WalkHeightField(Visitor &ioVisitor) const;
315
317 struct alignas(16) RangeBlock
318 {
319 uint16 mMin[4];
320 uint16 mMax[4];
321 };
322
324 inline void GetRangeBlock(uint inBlockX, uint inBlockY, uint inRangeBlockOffset, uint inRangeBlockStride, RangeBlock *&outBlock, uint &outIndexInBlock);
325
327 static const uint sGridOffsets[];
328
331 Vec3 mOffset = Vec3::sZero();
332 Vec3 mScale = Vec3::sReplicate(1.0f);
333
335 uint32 mSampleCount = 0;
336 uint32 mBlockSize = 2;
337 uint32 mHeightSamplesSize = 0;
338 uint32 mRangeBlocksSize = 0;
339 uint32 mActiveEdgesSize = 0;
340 uint8 mBitsPerSample = 8;
341 uint8 mSampleMask = 0xff;
344 RangeBlock * mRangeBlocks = nullptr;
345 uint8 * mHeightSamples = nullptr;
346 uint8 * mActiveEdges = nullptr;
347
349 PhysicsMaterialList mMaterials;
350 Array<uint8> mMaterialIndices;
351 uint32 mNumBitsPerMaterialIndex = 0;
352
353#ifdef JPH_DEBUG_RENDERER
355 mutable Array<DebugRenderer::GeometryRef> mGeometry;
356 mutable bool mCachedUseMaterialColors = false;
357#endif // JPH_DEBUG_RENDERER
358};
359
std::uint8_t uint8
Definition Core.h:449
#define JPH_EXPORT
Definition Core.h:236
unsigned int uint
Definition Core.h:448
#define JPH_NAMESPACE_END
Definition Core.h:377
std::uint32_t uint32
Definition Core.h:451
#define JPH_IF_DEBUG_RENDERER(...)
Definition Core.h:532
#define JPH_NAMESPACE_BEGIN
Definition Core.h:371
std::uint16_t uint16
Definition Core.h:450
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
uint CountLeadingZeros(uint32 inValue)
Compute the number of leading zero bits (how many high bits are zero)
Definition Math.h:129
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:31
#define JPH_DECLARE_SERIALIZABLE_VIRTUAL(linkage, class_name)
Definition SerializableObject.h:109
EShapeSubType
This enumerates all shape types, each shape can return its type through Shape::GetSubType.
Definition Shape.h:74
EShapeType
Shapes are categorized in groups, each shape can return which group it belongs to through its Shape::...
Definition Shape.h:57
@ 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
Definition DebugRenderer.h:47
Class that holds 3 floats. Used as a storage class. Convert to Vec3 for calculations.
Definition Float3.h:13
Definition HeightFieldShape.cpp:1668
A height field shape. Cannot be used as a dynamic object.
Definition HeightFieldShape.h:108
const PhysicsMaterialList & GetMaterialList() const
Get the current list of materials, the indices returned by GetMaterials() will index into this list.
Definition HeightFieldShape.h:212
uint GetSampleCount() const
Get the size of the height field. Note that this will always be rounded up to the nearest multiple of...
Definition HeightFieldShape.h:121
virtual float GetInnerRadius() const override
Definition HeightFieldShape.h:133
float GetMaxHeightValue() const
Definition HeightFieldShape.h:187
float GetMinHeightValue() const
Get the range of height values that this height field can encode. Can be used to determine the allowe...
Definition HeightFieldShape.h:186
JPH_OVERRIDE_NEW_DELETE HeightFieldShape()
Constructor.
Definition HeightFieldShape.h:113
static bool sDrawTriangleOutlines
Definition HeightFieldShape.h:248
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:130
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:151
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:118
uint GetBlockSize() const
Get the size of a block.
Definition HeightFieldShape.h:124
virtual float GetVolume() const override
Definition HeightFieldShape.h:244
Class that constructs a HeightFieldShape.
Definition HeightFieldShape.h:40
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:30
Settings to be passed with a ray cast.
Definition RayCast.h:70
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:178
Definition Shape.h:139
Definition SoftBodyVertex.h:16
Simple binary input stream.
Definition StreamIn.h:13
Simple binary output stream.
Definition StreamOut.h:13
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 TempAllocator.h:16
Definition Vec3.h:17
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:21
constexpr uint cNumBitsXY
A position in the hierarchical grid is defined by a level (which grid), x and y position....
Definition HeightFieldShape.h:29
constexpr uint cMaskBitsXY
Definition HeightFieldShape.h:30
constexpr int cStackSize
Stack size to use during WalkHeightField.
Definition HeightFieldShape.h:26
constexpr uint16 cMaxHeightValue16
This is the maximum allowed height value.
Definition HeightFieldShape.h:35
constexpr float cNoCollisionValue
Value used to create gaps in the height field.
Definition HeightFieldShape.h:23
constexpr uint16 cNoCollisionValue16
When height samples are converted to 16 bit:
Definition HeightFieldShape.h:34
constexpr uint cLevelShift
Definition HeightFieldShape.h:31
Definition HeightFieldShape.cpp:2339
Definition RayCast.h:47
Definition ShapeCast.h:69