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
38 constexpr uint32 cMaxBitsPerSample = 16;
39};
40
43{
45
46public:
49
56 HeightFieldShapeSettings(const float *inSamples, Vec3Arg inOffset, Vec3Arg inScale, uint32 inSampleCount, const uint8 *inMaterialIndices = nullptr, const PhysicsMaterialList &inMaterialList = PhysicsMaterialList());
57
58 // See: ShapeSettings
59 virtual ShapeResult Create() const override;
60
65 void DetermineMinAndMaxSample(float &outMinValue, float &outMaxValue, float &outQuantizationScale) const;
66
70 uint32 CalculateBitsPerSampleForError(float inMaxError) const;
71
77
79 float mMinHeightValue = cLargeFloat;
80
82 float mMaxHeightValue = -cLargeFloat;
83
87
92
97
100
103
106
110 float mActiveEdgeCosThresholdAngle = 0.996195f; // cos(5 degrees)
111};
112
119{
120public:
122
125 HeightFieldShape(const HeightFieldShapeSettings &inSettings, ShapeResult &outResult);
126 virtual ~HeightFieldShape() override;
127
129 Ref<HeightFieldShape> Clone() const;
130
131 // See Shape::MustBeStatic
132 virtual bool MustBeStatic() const override { return true; }
133
135 inline uint GetSampleCount() const { return mSampleCount; }
136
138 inline uint GetBlockSize() const { return mBlockSize; }
139
140 // See Shape::GetLocalBounds
141 virtual AABox GetLocalBounds() const override;
142
143 // See Shape::GetSubShapeIDBitsRecursive
144 virtual uint GetSubShapeIDBitsRecursive() const override { return GetSubShapeIDBits(); }
145
146 // See Shape::GetInnerRadius
147 virtual float GetInnerRadius() const override { return 0.0f; }
148
149 // See Shape::GetMassProperties
150 virtual MassProperties GetMassProperties() const override;
151
152 // See Shape::GetMaterial
153 virtual const PhysicsMaterial * GetMaterial(const SubShapeID &inSubShapeID) const override;
154
156 const PhysicsMaterial * GetMaterial(uint inX, uint inY) const;
157
158 // See Shape::GetSurfaceNormal
159 virtual Vec3 GetSurfaceNormal(const SubShapeID &inSubShapeID, Vec3Arg inLocalSurfacePosition) const override;
160
161 // See Shape::GetSupportingFace
162 virtual void GetSupportingFace(const SubShapeID &inSubShapeID, Vec3Arg inDirection, Vec3Arg inScale, Mat44Arg inCenterOfMassTransform, SupportingFace &outVertices) const override;
163
164 // See Shape::GetSubmergedVolume
165 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"); }
166
167#ifdef JPH_DEBUG_RENDERER
168 // See Shape::Draw
169 virtual void Draw(DebugRenderer *inRenderer, RMat44Arg inCenterOfMassTransform, Vec3Arg inScale, ColorArg inColor, bool inUseMaterialColors, bool inDrawWireframe) const override;
170#endif // JPH_DEBUG_RENDERER
171
172 // See Shape::CastRay
173 virtual bool CastRay(const RayCast &inRay, const SubShapeIDCreator &inSubShapeIDCreator, RayCastResult &ioHit) const override;
174 virtual void CastRay(const RayCast &inRay, const RayCastSettings &inRayCastSettings, const SubShapeIDCreator &inSubShapeIDCreator, CastRayCollector &ioCollector, const ShapeFilter &inShapeFilter = { }) const override;
175
176 // See: Shape::CollidePoint
177 virtual void CollidePoint(Vec3Arg inPoint, const SubShapeIDCreator &inSubShapeIDCreator, CollidePointCollector &ioCollector, const ShapeFilter &inShapeFilter = { }) const override;
178
179 // See: Shape::CollideSoftBodyVertices
180 virtual void CollideSoftBodyVertices(Mat44Arg inCenterOfMassTransform, Vec3Arg inScale, const CollideSoftBodyVertexIterator &inVertices, uint inNumVertices, int inCollidingShapeIndex) const override;
181
182 // See Shape::GetTrianglesStart
183 virtual void GetTrianglesStart(GetTrianglesContext &ioContext, const AABox &inBox, Vec3Arg inPositionCOM, QuatArg inRotation, Vec3Arg inScale) const override;
184
185 // See Shape::GetTrianglesNext
186 virtual int GetTrianglesNext(GetTrianglesContext &ioContext, int inMaxTrianglesRequested, Float3 *outTriangleVertices, const PhysicsMaterial **outMaterials = nullptr) const override;
187
190 Vec3 GetPosition(uint inX, uint inY) const;
191
193 bool IsNoCollision(uint inX, uint inY) const;
194
197 bool ProjectOntoSurface(Vec3Arg inLocalPosition, Vec3 &outSurfacePosition, SubShapeID &outSubShapeID) const;
198
204 void GetSubShapeCoordinates(const SubShapeID &inSubShapeID, uint &outX, uint &outY, uint &outTriangleIndex) const;
205
207 float GetMinHeightValue() const { return mOffset.GetY(); }
208 float GetMaxHeightValue() const { return mOffset.GetY() + mScale.GetY() * HeightFieldShapeConstants::cMaxHeightValue16; }
209
218 void GetHeights(uint inX, uint inY, uint inSizeX, uint inSizeY, float *outHeights, intptr_t inHeightsStride) const;
219
231 void SetHeights(uint inX, uint inY, uint inSizeX, uint inSizeY, const float *inHeights, intptr_t inHeightsStride, TempAllocator &inAllocator, float inActiveEdgeCosThresholdAngle = 0.996195f);
232
234 const PhysicsMaterialList & GetMaterialList() const { return mMaterials; }
235
243 void GetMaterials(uint inX, uint inY, uint inSizeX, uint inSizeY, uint8 *outMaterials, intptr_t inMaterialsStride) const;
244
256 bool SetMaterials(uint inX, uint inY, uint inSizeX, uint inSizeY, const uint8 *inMaterials, intptr_t inMaterialsStride, const PhysicsMaterialList *inMaterialList, TempAllocator &inAllocator);
257
258 // See Shape
259 virtual void SaveBinaryState(StreamOut &inStream) const override;
260 virtual void SaveMaterialState(PhysicsMaterialList &outMaterials) const override;
261 virtual void RestoreMaterialState(const PhysicsMaterialRefC *inMaterials, uint inNumMaterials) override;
262
263 // See Shape::GetStats
264 virtual Stats GetStats() const override;
265
266 // See Shape::GetVolume
267 virtual float GetVolume() const override { return 0; }
268
269#ifdef JPH_DEBUG_RENDERER
270 // Settings
272#endif // JPH_DEBUG_RENDERER
273
274 // Register shape functions with the registry
275 static void sRegister();
276
277protected:
278 // See: Shape::RestoreBinaryState
279 virtual void RestoreBinaryState(StreamIn &inStream) override;
280
281private:
282 class DecodingContext;
283 struct HSGetTrianglesContext;
284
286 void CacheValues();
287
289 void AllocateBuffers();
290
292 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);
293
295 void CalculateActiveEdges(const HeightFieldShapeSettings &inSettings);
296
298 void StoreMaterialIndices(const HeightFieldShapeSettings &inSettings);
299
301 inline uint GetNumBlocks() const { return mSampleCount / mBlockSize; }
302
304 static inline uint sGetMaxLevel(uint inNumBlocks) { return 32 - CountLeadingZeros(inNumBlocks - 1); }
305
307 static inline void sGetRangeBlockOffsetAndStride(uint inNumBlocks, uint inMaxLevel, uint &outRangeBlockOffset, uint &outRangeBlockStride);
308
310 inline void GetBlockOffsetAndScale(uint inBlockX, uint inBlockY, uint inRangeBlockOffset, uint inRangeBlockStride, float &outBlockOffset, float &outBlockScale) const;
311
313 inline uint16 GetHeightSample(uint inX, uint inY) const;
314
316 inline Vec3 GetPosition(uint inX, uint inY, float inBlockOffset, float inBlockScale, bool &outNoCollision) const;
317
319 uint GetSubShapeIDBits() const;
320
322 inline SubShapeID EncodeSubShapeID(const SubShapeIDCreator &inCreator, uint inX, uint inY, uint inTriangle) const;
323 inline void DecodeSubShapeID(const SubShapeID &inSubShapeID, uint &outX, uint &outY, uint &outTriangle) const;
324
326 inline uint8 GetEdgeFlags(uint inX, uint inY, uint inTriangle) const;
327
328 // Helper functions called by CollisionDispatch
329 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);
330 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);
331 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);
332 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);
333
336 template <class Visitor>
337 void WalkHeightField(Visitor &ioVisitor) const;
338
340 struct alignas(16) RangeBlock
341 {
342 uint16 mMin[4];
343 uint16 mMax[4];
344 };
345
347 inline void GetRangeBlock(uint inBlockX, uint inBlockY, uint inRangeBlockOffset, uint inRangeBlockStride, RangeBlock *&outBlock, uint &outIndexInBlock);
348
350 static const uint sGridOffsets[];
351
354 Vec3 mOffset = Vec3::sZero();
355 Vec3 mScale = Vec3::sOne();
356
358 uint32 mSampleCount = 0;
359 uint32 mBlockSize = 2;
360 uint32 mHeightSamplesSize = 0;
361 uint32 mRangeBlocksSize = 0;
362 uint32 mActiveEdgesSize = 0;
363 uint8 mBitsPerSample = 8;
364 uint16 mSampleMask = 0xff;
367 RangeBlock * mRangeBlocks = nullptr;
368 uint8 * mHeightSamples = nullptr;
369 uint8 * mActiveEdges = nullptr;
370
372 PhysicsMaterialList mMaterials;
373 Array<uint8> mMaterialIndices;
374 uint32 mNumBitsPerMaterialIndex = 0;
375
376#ifdef JPH_DEBUG_RENDERER
378 mutable Array<DebugRenderer::GeometryRef> mGeometry;
379 mutable bool mCachedUseMaterialColors = false;
380#endif // JPH_DEBUG_RENDERER
381};
382
Color ColorArg
Type to use for passing arguments to a function.
Definition Color.h:12
std::uint8_t uint8
Definition Core.h:547
#define JPH_EXPORT
Definition Core.h:286
unsigned int uint
Definition Core.h:546
#define JPH_NAMESPACE_END
Definition Core.h:469
std::uint32_t uint32
Definition Core.h:549
#define JPH_IF_DEBUG_RENDERER(...)
Definition Core.h:637
#define JPH_NAMESPACE_BEGIN
Definition Core.h:463
std::uint16_t uint16
Definition Core.h:548
#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:181
const Quat QuatArg
Definition MathTypes.h:28
const Vec3 Vec3Arg
Definition MathTypes.h:19
const Mat44 & Mat44Arg
Definition MathTypes.h:29
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:50
Array< RefConst< PhysicsMaterial > > PhysicsMaterialList
Definition PhysicsMaterial.h:55
Vec3Arg RVec3Arg
Definition Real.h:30
Mat44Arg RMat44Arg
Definition Real.h:32
@ Array
Used in attribute declaration, indicates that this is an array of objects.
Definition SerializableAttribute.h:23
#define JPH_DECLARE_SERIALIZABLE_VIRTUAL(linkage, class_name)
Definition SerializableObject.h:109
CollisionCollector< RayCastResult, CollisionCollectorTraitsCastRay > CastRayCollector
Definition Shape.h:43
CollisionCollector< ShapeCastResult, CollisionCollectorTraitsCastShape > CastShapeCollector
Definition Shape.h:44
EShapeSubType
This enumerates all shape types, each shape can return its type through Shape::GetSubType.
Definition Shape.h:76
EShapeType
Shapes are categorized in groups, each shape can return which group it belongs to through its Shape::...
Definition Shape.h:56
@ HeightField
Used by HeightFieldShape.
Definition Shape.h:61
Array< PhysicsMaterialRefC > PhysicsMaterialList
Definition Shape.h:52
RefConst< PhysicsMaterial > PhysicsMaterialRefC
Definition Shape.h:51
CollisionCollector< CollidePointResult, CollisionCollectorTraitsCollidePoint > CollidePointCollector
Definition Shape.h:45
CollisionCollector< CollideShapeResult, CollisionCollectorTraitsCollideShape > CollideShapeCollector
Definition Shape.h:46
Axis aligned box.
Definition AABox.h:16
Definition Array.h:36
Settings to be passed with a collision query.
Definition CollideShape.h:94
Base class for all convex shapes. Defines a virtual interface.
Definition ConvexShape.h:36
Definition DebugRenderer.h:47
Definition HeightFieldShape.cpp:1746
Definition HeightFieldShape.h:119
const PhysicsMaterialList & GetMaterialList() const
Get the current list of materials, the indices returned by GetMaterials() will index into this list.
Definition HeightFieldShape.h:234
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:135
virtual float GetInnerRadius() const override
Definition HeightFieldShape.h:147
float GetMaxHeightValue() const
Definition HeightFieldShape.h:208
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:207
virtual void RestoreBinaryState(StreamIn &inStream) override
This function should not be called directly, it is used by sRestoreFromBinaryState.
Definition HeightFieldShape.cpp:2685
JPH_OVERRIDE_NEW_DELETE HeightFieldShape()
Constructor.
Definition HeightFieldShape.h:124
static bool sDrawTriangleOutlines
Definition HeightFieldShape.h:271
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:144
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:165
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:132
uint GetBlockSize() const
Get the size of a block.
Definition HeightFieldShape.h:138
virtual float GetVolume() const override
Definition HeightFieldShape.h:267
static void sRegister()
Definition HeightFieldShape.cpp:2736
Class that constructs a HeightFieldShape.
Definition HeightFieldShape.h:43
uint32 mMaterialsCapacity
Definition HeightFieldShape.h:86
HeightFieldShapeSettings()=default
Default constructor for deserialization.
void DetermineMinAndMaxSample(float &outMinValue, float &outMaxValue, float &outQuantizationScale) const
Definition HeightFieldShape.cpp:110
float mMinHeightValue
Artificial minimal value of mHeightSamples, used for compression and can be used to update the terrai...
Definition HeightFieldShape.h:79
Vec3 mOffset
Definition HeightFieldShape.h:74
Array< float > mHeightSamples
An array of mSampleCount^2 height samples. Samples are stored in row major order, so the sample at (x...
Definition HeightFieldShape.h:99
uint32 mBitsPerSample
Definition HeightFieldShape.h:96
uint32 mSampleCount
Definition HeightFieldShape.h:76
float mMaxHeightValue
Artificial maximum value of mHeightSamples, used for compression and can be used to update the terrai...
Definition HeightFieldShape.h:82
uint32 mBlockSize
Definition HeightFieldShape.h:91
Vec3 mScale
Definition HeightFieldShape.h:75
float mActiveEdgeCosThresholdAngle
Definition HeightFieldShape.h:110
Array< uint8 > mMaterialIndices
An array of (mSampleCount - 1)^2 material indices.
Definition HeightFieldShape.h:102
PhysicsMaterialList mMaterials
The materials of square at (x, y) is: mMaterials[mMaterialIndices[x + y * (mSampleCount - 1)]].
Definition HeightFieldShape.h:105
uint32 CalculateBitsPerSampleForError(float inMaxError) const
Definition HeightFieldShape.cpp:129
Describes the mass and inertia properties of a body. Used during body construction only.
Definition MassProperties.h:16
Definition PhysicsMaterial.h:23
An infinite plane described by the formula X . Normal + Constant = 0.
Definition Plane.h:11
Specialization of cast result against a shape.
Definition CastResult.h:30
Settings to be passed with a ray cast.
Definition RayCast.h:70
Definition Reference.h:110
Filter class.
Definition ShapeFilter.h:17
Shape(EShapeType inType, EShapeSubType inSubType)
Constructor.
Definition Shape.h:192
Definition Shape.h:146
virtual ShapeResult Create() const =0
Create a shape according to the settings specified by this object.
Result< Ref< Shape > > ShapeResult
Definition Shape.h:150
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 sOne()
Vector with all ones.
Definition Vec3.inl:157
static JPH_INLINE Vec3 sZero()
Vector with all zeros.
Definition Vec3.inl:125
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 uint32 cMaxBitsPerSample
Maximum value for HeightFieldShapeSettings::mBitsPerSample.
Definition HeightFieldShape.h:38
constexpr uint cLevelShift
Definition HeightFieldShape.h:31
Definition HeightFieldShape.cpp:2428
Definition RayCast.h:47