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
54
55 // See: ShapeSettings
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
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
151
152#ifdef JPH_DEBUG_RENDERER
153 // See Shape::Draw
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
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
205
207 const PhysicsMaterialList & GetMaterialList() const { return mMaterials; }
208
217
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
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
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
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
AllocateFunction Allocate
Definition Memory.cpp:59
#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