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