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
116 // See Shape::MustBeStatic
117 virtual bool MustBeStatic() const override { return true; }
118
120 inline uint GetSampleCount() const { return mSampleCount; }
121
123 inline uint GetBlockSize() const { return mBlockSize; }
124
125 // See Shape::GetLocalBounds
126 virtual AABox GetLocalBounds() const override;
127
128 // See Shape::GetSubShapeIDBitsRecursive
129 virtual uint GetSubShapeIDBitsRecursive() const override { return GetSubShapeIDBits(); }
130
131 // See Shape::GetInnerRadius
132 virtual float GetInnerRadius() const override { return 0.0f; }
133
134 // See Shape::GetMassProperties
135 virtual MassProperties GetMassProperties() const override;
136
137 // See Shape::GetMaterial
138 virtual const PhysicsMaterial * GetMaterial(const SubShapeID &inSubShapeID) const override;
139
141 const PhysicsMaterial * GetMaterial(uint inX, uint inY) const;
142
143 // See Shape::GetSurfaceNormal
144 virtual Vec3 GetSurfaceNormal(const SubShapeID &inSubShapeID, Vec3Arg inLocalSurfacePosition) const override;
145
146 // See Shape::GetSupportingFace
147 virtual void GetSupportingFace(const SubShapeID &inSubShapeID, Vec3Arg inDirection, Vec3Arg inScale, Mat44Arg inCenterOfMassTransform, SupportingFace &outVertices) const override;
148
149 // See Shape::GetSubmergedVolume
150 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"); }
151
152#ifdef JPH_DEBUG_RENDERER
153 // See Shape::Draw
154 virtual void Draw(DebugRenderer *inRenderer, RMat44Arg inCenterOfMassTransform, Vec3Arg inScale, ColorArg inColor, bool inUseMaterialColors, bool inDrawWireframe) const override;
155#endif // JPH_DEBUG_RENDERER
156
157 // See Shape::CastRay
158 virtual bool CastRay(const RayCast &inRay, const SubShapeIDCreator &inSubShapeIDCreator, RayCastResult &ioHit) const override;
159 virtual void CastRay(const RayCast &inRay, const RayCastSettings &inRayCastSettings, const SubShapeIDCreator &inSubShapeIDCreator, CastRayCollector &ioCollector, const ShapeFilter &inShapeFilter = { }) const override;
160
161 // See: Shape::CollidePoint
162 virtual void CollidePoint(Vec3Arg inPoint, const SubShapeIDCreator &inSubShapeIDCreator, CollidePointCollector &ioCollector, const ShapeFilter &inShapeFilter = { }) const override;
163
164 // See: Shape::CollideSoftBodyVertices
165 virtual void CollideSoftBodyVertices(Mat44Arg inCenterOfMassTransform, Vec3Arg inScale, SoftBodyVertex *ioVertices, uint inNumVertices, float inDeltaTime, Vec3Arg inDisplacementDueToGravity, int inCollidingShapeIndex) const override;
166
167 // See Shape::GetTrianglesStart
168 virtual void GetTrianglesStart(GetTrianglesContext &ioContext, const AABox &inBox, Vec3Arg inPositionCOM, QuatArg inRotation, Vec3Arg inScale) const override;
169
170 // See Shape::GetTrianglesNext
171 virtual int GetTrianglesNext(GetTrianglesContext &ioContext, int inMaxTrianglesRequested, Float3 *outTriangleVertices, const PhysicsMaterial **outMaterials = nullptr) const override;
172
175 Vec3 GetPosition(uint inX, uint inY) const;
176
178 bool IsNoCollision(uint inX, uint inY) const;
179
182 bool ProjectOntoSurface(Vec3Arg inLocalPosition, Vec3 &outSurfacePosition, SubShapeID &outSubShapeID) const;
183
192 void GetHeights(uint inX, uint inY, uint inSizeX, uint inSizeY, float *outHeights, uint inHeightsStride) const;
193
204 void SetHeights(uint inX, uint inY, uint inSizeX, uint inSizeY, const float *inHeights, uint inHeightsStride, TempAllocator &inAllocator, float inActiveEdgeCosThresholdAngle = 0.996195f);
205
207 const PhysicsMaterialList & GetMaterialList() const { return mMaterials; }
208
216 void GetMaterials(uint inX, uint inY, uint inSizeX, uint inSizeY, uint8 *outMaterials, uint inMaterialsStride) const;
217
228 bool SetMaterials(uint inX, uint inY, uint inSizeX, uint inSizeY, const uint8 *inMaterials, uint inMaterialsStride, const PhysicsMaterialList *inMaterialList, TempAllocator &inAllocator);
229
230 // See Shape
231 virtual void SaveBinaryState(StreamOut &inStream) const override;
232 virtual void SaveMaterialState(PhysicsMaterialList &outMaterials) const override;
233 virtual void RestoreMaterialState(const PhysicsMaterialRefC *inMaterials, uint inNumMaterials) override;
234
235 // See Shape::GetStats
236 virtual Stats GetStats() const override;
237
238 // See Shape::GetVolume
239 virtual float GetVolume() const override { return 0; }
240
241#ifdef JPH_DEBUG_RENDERER
242 // Settings
244#endif // JPH_DEBUG_RENDERER
245
246 // Register shape functions with the registry
247 static void sRegister();
248
249protected:
250 // See: Shape::RestoreBinaryState
251 virtual void RestoreBinaryState(StreamIn &inStream) override;
252
253private:
254 class DecodingContext;
255 struct HSGetTrianglesContext;
256
258 void CacheValues();
259
261 void CalculateActiveEdges(uint inX, uint inY, uint inSizeX, uint inSizeY, const float *inHeights, uint inHeightsStartX, uint inHeightsStartY, uint inHeightsStride, float inHeightsScale, float inActiveEdgeCosThresholdAngle, TempAllocator &inAllocator);
262
264 void CalculateActiveEdges(const HeightFieldShapeSettings &inSettings);
265
267 void StoreMaterialIndices(const HeightFieldShapeSettings &inSettings);
268
270 inline uint GetNumBlocks() const { return mSampleCount / mBlockSize; }
271
273 static inline uint sGetMaxLevel(uint inNumBlocks) { return 32 - CountLeadingZeros(inNumBlocks - 1); }
274
276 static inline void sGetRangeBlockOffsetAndStride(uint inNumBlocks, uint inMaxLevel, uint &outRangeBlockOffset, uint &outRangeBlockStride);
277
279 inline void GetBlockOffsetAndScale(uint inBlockX, uint inBlockY, uint inRangeBlockOffset, uint inRangeBlockStride, float &outBlockOffset, float &outBlockScale) const;
280
282 inline uint8 GetHeightSample(uint inX, uint inY) const;
283
285 inline Vec3 GetPosition(uint inX, uint inY, float inBlockOffset, float inBlockScale, bool &outNoCollision) const;
286
288 uint GetSubShapeIDBits() const;
289
291 inline SubShapeID EncodeSubShapeID(const SubShapeIDCreator &inCreator, uint inX, uint inY, uint inTriangle) const;
292 inline void DecodeSubShapeID(const SubShapeID &inSubShapeID, uint &outX, uint &outY, uint &outTriangle) const;
293
295 inline uint8 GetEdgeFlags(uint inX, uint inY, uint inTriangle) const;
296
297 // Helper functions called by CollisionDispatch
298 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);
299 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);
300 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);
301 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);
302
305 template <class Visitor>
306 void WalkHeightField(Visitor &ioVisitor) const;
307
309 struct alignas(16) RangeBlock
310 {
311 uint16 mMin[4];
312 uint16 mMax[4];
313 };
314
316 inline void GetRangeBlock(uint inBlockX, uint inBlockY, uint inRangeBlockOffset, uint inRangeBlockStride, RangeBlock *&outBlock, uint &outIndexInBlock);
317
319 static const uint sGridOffsets[];
320
323 Vec3 mOffset = Vec3::sZero();
324 Vec3 mScale = Vec3::sReplicate(1.0f);
325
327 uint32 mSampleCount = 0;
328 uint32 mBlockSize = 2;
329 uint8 mBitsPerSample = 8;
330 uint8 mSampleMask = 0xff;
333 Array<RangeBlock> mRangeBlocks;
334 Array<uint8> mHeightSamples;
335 Array<uint8> mActiveEdges;
336
338 PhysicsMaterialList mMaterials;
339 Array<uint8> mMaterialIndices;
340 uint32 mNumBitsPerMaterialIndex = 0;
341
342#ifdef JPH_DEBUG_RENDERER
344 mutable Array<DebugRenderer::GeometryRef> mGeometry;
345 mutable bool mCachedUseMaterialColors = false;
346#endif // JPH_DEBUG_RENDERER
347};
348
std::uint8_t uint8
Definition: Core.h:440
#define JPH_EXPORT
Definition: Core.h:227
unsigned int uint
Definition: Core.h:439
#define JPH_NAMESPACE_END
Definition: Core.h:367
std::uint32_t uint32
Definition: Core.h:442
#define JPH_IF_DEBUG_RENDERER(...)
Definition: Core.h:510
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:361
std::uint16_t uint16
Definition: Core.h:441
#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:29
Array< RefConst< PhysicsMaterial > > PhysicsMaterialList
Definition: PhysicsMaterial.h:50
std::vector< T, STLAllocator< T > > Array
Definition: STLAllocator.h:81
#define JPH_DECLARE_SERIALIZABLE_VIRTUAL(linkage, class_name)
Definition: SerializableObject.h:100
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:1642
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:207
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:120
virtual float GetInnerRadius() const override
Definition: HeightFieldShape.h:132
JPH_OVERRIDE_NEW_DELETE HeightFieldShape()
Constructor.
Definition: HeightFieldShape.h:113
static bool sDrawTriangleOutlines
Definition: HeightFieldShape.h:243
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: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
Definition: HeightFieldShape.h:150
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:117
uint GetBlockSize() const
Get the size of a block.
Definition: HeightFieldShape.h:123
virtual float GetVolume() const override
Definition: HeightFieldShape.h:239
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: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: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:2312
Definition: RayCast.h:47
Definition: ShapeCast.h:69