Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
TriangleCodecIndexed8BitPackSOA4Flags.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
8
10
24{
25public:
27 {
28 public:
31 };
32
34 static constexpr int TriangleHeaderSize = sizeof(TriangleHeader);
35
37 static constexpr bool ChangesOffsetOnPack = false;
38
41 {
44 };
45
48 {
52 };
53
56 {
60 };
61
64 {
67 };
68
69 static_assert(sizeof(VertexData) == 8, "Compiler added padding");
70
73 {
76 };
77
78 static_assert(sizeof(TriangleBlock) == 16, "Compiler added padding");
79
82 {
83 const VertexData * GetVertexData() const { return reinterpret_cast<const VertexData *>(reinterpret_cast<const uint8 *>(this) + mOffsetToVertices); }
84 const TriangleBlock * GetTriangleBlock() const { return reinterpret_cast<const TriangleBlock *>(reinterpret_cast<const uint8 *>(this) + sizeof(TriangleBlockHeader)); }
85
87 };
88
89 static_assert(sizeof(TriangleBlockHeader) == 4, "Compiler added padding");
90
93 {
94 public:
96 explicit EncodingContext(const VertexList &inVertices) :
97 mVertexMap(inVertices.size(), 0xffffffff) // Fill vertex map with 'not found'
98 {
99 // Reserve for worst case to avoid allocating in the inner loop
100 mVertices.reserve(inVertices.size());
101 }
102
105 {
106 // Worst case each triangle is alone in a block, none of the vertices are shared and we need to add 3 bytes to align the vertices
107 return inTriangleCount * (sizeof(TriangleBlockHeader) + sizeof(TriangleBlock) + 3 * sizeof(VertexData)) + 3;
108 }
109
112 uint Pack(const IndexedTriangleList &inTriangles, ByteBuffer &ioBuffer, const char *&outError)
113 {
114 // Determine position of triangles start
115 uint offset = (uint)ioBuffer.size();
116
117 // Update stats
118 uint tri_count = (uint)inTriangles.size();
119 mNumTriangles += tri_count;
120
121 // Allocate triangle block header
123
124 // Compute first vertex that this batch will use (ensuring there's enough room if none of the vertices are shared)
125 uint start_vertex = Clamp((int)mVertices.size() - 256 + (int)tri_count * 3, 0, (int)mVertices.size());
126
127 // Store the start vertex offset, this will later be patched to give the delta offset relative to the triangle block
128 mOffsetsToPatch.push_back(uint((uint8 *)&header->mOffsetToVertices - &ioBuffer[0]));
129 header->mOffsetToVertices = start_vertex * sizeof(VertexData);
130
131 // Pack vertices
132 uint padded_triangle_count = AlignUp(tri_count, 4);
133 for (uint t = 0; t < padded_triangle_count; t += 4)
134 {
135 TriangleBlock *block = ioBuffer.Allocate<TriangleBlock>();
136 for (uint vertex_nr = 0; vertex_nr < 3; ++vertex_nr)
137 for (uint block_tri_idx = 0; block_tri_idx < 4; ++block_tri_idx)
138 {
139 // Fetch vertex index. Create degenerate triangles for padding triangles.
140 bool triangle_available = t + block_tri_idx < tri_count;
141 uint32 src_vertex_index = triangle_available? inTriangles[t + block_tri_idx].mIdx[vertex_nr] : inTriangles[tri_count - 1].mIdx[0];
142
143 // Check if we've seen this vertex before and if it is in the range that we can encode
144 uint32 &vertex_index = mVertexMap[src_vertex_index];
145 if (vertex_index == 0xffffffff || vertex_index < start_vertex)
146 {
147 // Add vertex
148 vertex_index = (uint32)mVertices.size();
149 mVertices.push_back(src_vertex_index);
150 }
151
152 // Store vertex index
153 uint32 vertex_offset = vertex_index - start_vertex;
154 if (vertex_offset > 0xff)
155 {
156 outError = "TriangleCodecIndexed8BitPackSOA4Flags: Offset doesn't fit in 8 bit";
157 return uint(-1);
158 }
159 block->mIndices[vertex_nr][block_tri_idx] = (uint8)vertex_offset;
160
161 // Store flags
162 uint32 flags = triangle_available? inTriangles[t + block_tri_idx].mMaterialIndex : 0;
163 if (flags > 0xff)
164 {
165 outError = "TriangleCodecIndexed8BitPackSOA4Flags: Material index doesn't fit in 8 bit";
166 return uint(-1);
167 }
168 block->mFlags[block_tri_idx] = (uint8)flags;
169 }
170 }
171
172 return offset;
173 }
174
176 void Finalize(const VertexList &inVertices, TriangleHeader *ioHeader, ByteBuffer &ioBuffer) const
177 {
178 // Check if anything to do
179 if (mVertices.empty())
180 return;
181
182 // Align buffer to 4 bytes
183 uint vertices_idx = (uint)ioBuffer.Align(4);
184
185 // Patch the offsets
186 for (uint o : mOffsetsToPatch)
187 *ioBuffer.Get<uint32>(o) += vertices_idx - o;
188
189 // Calculate bounding box
190 AABox bounds;
191 for (uint32 v : mVertices)
192 bounds.Encapsulate(Vec3(inVertices[v]));
193
194 // Compress vertices
195 VertexData *vertices = ioBuffer.Allocate<VertexData>(mVertices.size());
196 Vec3 compress_scale = Vec3::sReplicate(COMPONENT_MASK) / Vec3::sMax(bounds.GetSize(), Vec3::sReplicate(1.0e-20f));
197 for (uint32 v : mVertices)
198 {
199 UVec4 c = ((Vec3(inVertices[v]) - bounds.mMin) * compress_scale + Vec3::sReplicate(0.5f)).ToInt();
203 vertices->mVertexXY = c.GetX() + (c.GetY() << COMPONENT_Y1);
204 vertices->mVertexZY = c.GetZ() + ((c.GetY() >> COMPONENT_Y1_BITS) << COMPONENT_Y2);
205 ++vertices;
206 }
207
208 // Store decompression information
209 bounds.mMin.StoreFloat3(&ioHeader->mOffset);
210 (bounds.GetSize() / Vec3::sReplicate(COMPONENT_MASK)).StoreFloat3(&ioHeader->mScale);
211 }
212
213 private:
214 using VertexMap = Array<uint32>;
215
216 uint mNumTriangles = 0;
217 Array<uint32> mVertices;
218 VertexMap mVertexMap;
219 Array<uint> mOffsetsToPatch;
220 };
221
224 {
225 private:
227 JPH_INLINE void Unpack(const VertexData *inVertices, UVec4Arg inIndex, Vec4 &outX, Vec4 &outY, Vec4 &outZ) const
228 {
229 // Get compressed data
230 UVec4 c1 = UVec4::sGatherInt4<8>(&inVertices->mVertexXY, inIndex);
231 UVec4 c2 = UVec4::sGatherInt4<8>(&inVertices->mVertexZY, inIndex);
232
233 // Unpack the x y and z component
237
238 // Convert to float
239 outX = Vec4::sFusedMultiplyAdd(xc.ToFloat(), mScaleX, mOffsetX);
240 outY = Vec4::sFusedMultiplyAdd(yc.ToFloat(), mScaleY, mOffsetY);
241 outZ = Vec4::sFusedMultiplyAdd(zc.ToFloat(), mScaleZ, mOffsetZ);
242 }
243
244 public:
245 JPH_INLINE explicit DecodingContext(const TriangleHeader *inHeader) :
246 mOffsetX(Vec4::sReplicate(inHeader->mOffset.x)),
247 mOffsetY(Vec4::sReplicate(inHeader->mOffset.y)),
248 mOffsetZ(Vec4::sReplicate(inHeader->mOffset.z)),
249 mScaleX(Vec4::sReplicate(inHeader->mScale.x)),
250 mScaleY(Vec4::sReplicate(inHeader->mScale.y)),
251 mScaleZ(Vec4::sReplicate(inHeader->mScale.z))
252 {
253 }
254
256 JPH_INLINE void Unpack(const void *inTriangleStart, uint32 inNumTriangles, Vec3 *outTriangles) const
257 {
258 JPH_ASSERT(inNumTriangles > 0);
259 const TriangleBlockHeader *header = reinterpret_cast<const TriangleBlockHeader *>(inTriangleStart);
260 const VertexData *vertices = header->GetVertexData();
261 const TriangleBlock *t = header->GetTriangleBlock();
262 const TriangleBlock *end = t + ((inNumTriangles + 3) >> 2);
263
264 int triangles_left = inNumTriangles;
265
266 do
267 {
268 // Get the indices for the three vertices (reads 4 bytes extra, but these are the flags so that's ok)
269 UVec4 indices = UVec4::sLoadInt4(reinterpret_cast<const uint32 *>(&t->mIndices[0]));
270 UVec4 iv1 = indices.Expand4Byte0();
271 UVec4 iv2 = indices.Expand4Byte4();
272 UVec4 iv3 = indices.Expand4Byte8();
273
274 // Decompress the triangle data
275 Vec4 v1x, v1y, v1z, v2x, v2y, v2z, v3x, v3y, v3z;
276 Unpack(vertices, iv1, v1x, v1y, v1z);
277 Unpack(vertices, iv2, v2x, v2y, v2z);
278 Unpack(vertices, iv3, v3x, v3y, v3z);
279
280 // Transpose it so we get normal vectors
281 Mat44 v1 = Mat44(v1x, v1y, v1z, Vec4::sZero()).Transposed();
282 Mat44 v2 = Mat44(v2x, v2y, v2z, Vec4::sZero()).Transposed();
283 Mat44 v3 = Mat44(v3x, v3y, v3z, Vec4::sZero()).Transposed();
284
285 // Store triangle data
286 for (int i = 0; i < 4 && triangles_left > 0; ++i, --triangles_left)
287 {
288 *outTriangles++ = v1.GetColumn3(i);
289 *outTriangles++ = v2.GetColumn3(i);
290 *outTriangles++ = v3.GetColumn3(i);
291 }
292
293 ++t;
294 }
295 while (t < end);
296 }
297
299 JPH_INLINE float TestRay(Vec3Arg inRayOrigin, Vec3Arg inRayDirection, const void *inTriangleStart, uint32 inNumTriangles, float inClosest, uint32 &outClosestTriangleIndex) const
300 {
301 JPH_ASSERT(inNumTriangles > 0);
302 const TriangleBlockHeader *header = reinterpret_cast<const TriangleBlockHeader *>(inTriangleStart);
303 const VertexData *vertices = header->GetVertexData();
304 const TriangleBlock *t = header->GetTriangleBlock();
305 const TriangleBlock *end = t + ((inNumTriangles + 3) >> 2);
306
307 Vec4 closest = Vec4::sReplicate(inClosest);
308 UVec4 closest_triangle_idx = UVec4::sZero();
309
310 UVec4 start_triangle_idx = UVec4::sZero();
311 do
312 {
313 // Get the indices for the three vertices (reads 4 bytes extra, but these are the flags so that's ok)
314 UVec4 indices = UVec4::sLoadInt4(reinterpret_cast<const uint32 *>(&t->mIndices[0]));
315 UVec4 iv1 = indices.Expand4Byte0();
316 UVec4 iv2 = indices.Expand4Byte4();
317 UVec4 iv3 = indices.Expand4Byte8();
318
319 // Decompress the triangle data
320 Vec4 v1x, v1y, v1z, v2x, v2y, v2z, v3x, v3y, v3z;
321 Unpack(vertices, iv1, v1x, v1y, v1z);
322 Unpack(vertices, iv2, v2x, v2y, v2z);
323 Unpack(vertices, iv3, v3x, v3y, v3z);
324
325 // Perform ray vs triangle test
326 Vec4 distance = RayTriangle4(inRayOrigin, inRayDirection, v1x, v1y, v1z, v2x, v2y, v2z, v3x, v3y, v3z);
327
328 // Update closest with the smaller values
329 UVec4 smaller = Vec4::sLess(distance, closest);
330 closest = Vec4::sSelect(closest, distance, smaller);
331
332 // Update triangle index with the smallest values
333 UVec4 triangle_idx = start_triangle_idx + UVec4(0, 1, 2, 3);
334 closest_triangle_idx = UVec4::sSelect(closest_triangle_idx, triangle_idx, smaller);
335
336 // Next block
337 ++t;
338 start_triangle_idx += UVec4::sReplicate(4);
339 }
340 while (t < end);
341
342 // Get the smallest component
343 Vec4::sSort4(closest, closest_triangle_idx);
344 outClosestTriangleIndex = closest_triangle_idx.GetX();
345 return closest.GetX();
346 }
347
349 inline void GetTriangle(const void *inTriangleStart, uint32 inTriangleIdx, Vec3 &outV1, Vec3 &outV2, Vec3 &outV3) const
350 {
351 const TriangleBlockHeader *header = reinterpret_cast<const TriangleBlockHeader *>(inTriangleStart);
352 const VertexData *vertices = header->GetVertexData();
353 const TriangleBlock *block = header->GetTriangleBlock() + (inTriangleIdx >> 2);
354 uint32 block_triangle_idx = inTriangleIdx & 0b11;
355
356 // Get the 3 vertices
357 const VertexData &v1 = vertices[block->mIndices[0][block_triangle_idx]];
358 const VertexData &v2 = vertices[block->mIndices[1][block_triangle_idx]];
359 const VertexData &v3 = vertices[block->mIndices[2][block_triangle_idx]];
360
361 // Pack the vertices
362 UVec4 c1(v1.mVertexXY, v2.mVertexXY, v3.mVertexXY, 0);
363 UVec4 c2(v1.mVertexZY, v2.mVertexZY, v3.mVertexZY, 0);
364
365 // Unpack the x y and z component
369
370 // Convert to float
371 Vec4 vx = Vec4::sFusedMultiplyAdd(xc.ToFloat(), mScaleX, mOffsetX);
372 Vec4 vy = Vec4::sFusedMultiplyAdd(yc.ToFloat(), mScaleY, mOffsetY);
373 Vec4 vz = Vec4::sFusedMultiplyAdd(zc.ToFloat(), mScaleZ, mOffsetZ);
374
375 // Transpose it so we get normal vectors
376 Mat44 trans = Mat44(vx, vy, vz, Vec4::sZero()).Transposed();
377 outV1 = trans.GetAxisX();
378 outV2 = trans.GetAxisY();
379 outV3 = trans.GetAxisZ();
380 }
381
383 JPH_INLINE static void sGetFlags(const void *inTriangleStart, uint32 inNumTriangles, uint8 *outTriangleFlags)
384 {
385 JPH_ASSERT(inNumTriangles > 0);
386 const TriangleBlockHeader *header = reinterpret_cast<const TriangleBlockHeader *>(inTriangleStart);
387 const TriangleBlock *t = header->GetTriangleBlock();
388 const TriangleBlock *end = t + ((inNumTriangles + 3) >> 2);
389
390 int triangles_left = inNumTriangles;
391 do
392 {
393 for (int i = 0; i < 4 && triangles_left > 0; ++i, --triangles_left)
394 *outTriangleFlags++ = t->mFlags[i];
395
396 ++t;
397 }
398 while (t < end);
399 }
400
402 JPH_INLINE static uint8 sGetFlags(const void *inTriangleStart, int inTriangleIndex)
403 {
404 const TriangleBlockHeader *header = reinterpret_cast<const TriangleBlockHeader *>(inTriangleStart);
405 const TriangleBlock *first_block = header->GetTriangleBlock();
406 return first_block[inTriangleIndex >> 2].mFlags[inTriangleIndex & 0b11];
407 }
408
410 JPH_INLINE void Unpack(const void *inTriangleStart, uint32 inNumTriangles, Vec3 *outTriangles, uint8 *outTriangleFlags) const
411 {
412 Unpack(inTriangleStart, inNumTriangles, outTriangles);
413 sGetFlags(inTriangleStart, inNumTriangles, outTriangleFlags);
414 }
415
416 private:
417 Vec4 mOffsetX;
418 Vec4 mOffsetY;
419 Vec4 mOffsetZ;
420 Vec4 mScaleX;
421 Vec4 mScaleY;
422 Vec4 mScaleZ;
423 };
424};
425
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
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:234
Array< Float3 > VertexList
Definition: Float3.h:42
Array< IndexedTriangle > IndexedTriangleList
Definition: IndexedTriangle.h:105
#define JPH_ASSERT(...)
Definition: IssueReporting.h:33
constexpr T Clamp(T inV, T inMin, T inMax)
Clamp a value between two values.
Definition: Math.h:45
T AlignUp(T inV, uint64 inAlignment)
Align inV up to the next inAlignment bytes.
Definition: Math.h:80
JPH_INLINE Vec4 RayTriangle4(Vec3Arg inOrigin, Vec3Arg inDirection, Vec4Arg inV0X, Vec4Arg inV0Y, Vec4Arg inV0Z, Vec4Arg inV1X, Vec4Arg inV1Y, Vec4Arg inV1Z, Vec4Arg inV2X, Vec4Arg inV2Y, Vec4Arg inV2Z)
Intersect ray with 4 triangles in SOA format, returns 4 vector of closest points or FLT_MAX if no hit...
Definition: RayTriangle.h:76
std::vector< T, STLAllocator< T > > Array
Definition: STLAllocator.h:81
Axis aligned box.
Definition: AABox.h:16
void Encapsulate(Vec3Arg inPos)
Encapsulate point in bounding box.
Definition: AABox.h:53
Simple byte buffer, aligned to a cache line.
Definition: ByteBuffer.h:16
Type * Allocate(size_t inSize=1)
Allocate block of data of inSize elements and return the pointer.
Definition: ByteBuffer.h:33
size_t Align(size_t inSize)
Align the size to a multiple of inSize, returns the length after alignment.
Definition: ByteBuffer.h:19
const Type * Get(size_t inPosition) const
Get object at inPosition (an offset in bytes)
Definition: ByteBuffer.h:61
Class that holds 3 floats. Used as a storage class. Convert to Vec3 for calculations.
Definition: Float3.h:13
Holds a 4x4 matrix of floats, but supports also operations on the 3x3 upper left part of the matrix.
Definition: Mat44.h:13
JPH_INLINE Vec3 GetAxisY() const
Definition: Mat44.h:144
JPH_INLINE Vec3 GetAxisZ() const
Definition: Mat44.h:146
JPH_INLINE Mat44 Transposed() const
Transpose matrix.
Definition: Mat44.inl:458
JPH_INLINE Vec3 GetColumn3(uint inCol) const
Definition: Mat44.h:154
JPH_INLINE Vec3 GetAxisX() const
Access to the columns.
Definition: Mat44.h:142
This class is used to decode and decompress triangle data packed by the EncodingContext.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:224
void GetTriangle(const void *inTriangleStart, uint32 inTriangleIdx, Vec3 &outV1, Vec3 &outV2, Vec3 &outV3) const
Decode a single triangle.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:349
static JPH_INLINE uint8 sGetFlags(const void *inTriangleStart, int inTriangleIndex)
Get flags for a particular triangle.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:402
static JPH_INLINE void sGetFlags(const void *inTriangleStart, uint32 inNumTriangles, uint8 *outTriangleFlags)
Get flags for entire triangle block.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:383
JPH_INLINE void Unpack(const void *inTriangleStart, uint32 inNumTriangles, Vec3 *outTriangles, uint8 *outTriangleFlags) const
Unpacks triangles and flags, convencience function.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:410
JPH_INLINE void Unpack(const void *inTriangleStart, uint32 inNumTriangles, Vec3 *outTriangles) const
Unpacks triangles in the format t1v1,t1v2,t1v3, t2v1,t2v2,t2v3, ...
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:256
JPH_INLINE float TestRay(Vec3Arg inRayOrigin, Vec3Arg inRayDirection, const void *inTriangleStart, uint32 inNumTriangles, float inClosest, uint32 &outClosestTriangleIndex) const
Tests a ray against the packed triangles.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:299
JPH_INLINE DecodingContext(const TriangleHeader *inHeader)
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:245
This class is used to encode and compress triangle data into a byte buffer.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:93
EncodingContext(const VertexList &inVertices)
Construct the encoding context.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:96
uint Pack(const IndexedTriangleList &inTriangles, ByteBuffer &ioBuffer, const char *&outError)
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:112
uint GetPessimisticMemoryEstimate(uint inTriangleCount) const
Get an upper bound on the amount of bytes needed to store inTriangleCount triangles.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:104
void Finalize(const VertexList &inVertices, TriangleHeader *ioHeader, ByteBuffer &ioBuffer) const
After all triangles have been packed, this finalizes the header and triangle buffer.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:176
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:27
Float3 mOffset
Offset of all vertices.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:29
Float3 mScale
Scale of all vertices, vertex_position = mOffset + mScale * compressed_vertex_position.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:30
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:24
static constexpr bool ChangesOffsetOnPack
If this codec could return a different offset than the current buffer size when calling Pack()
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:37
static constexpr int TriangleHeaderSize
Size of the header (an empty struct is always > 0 bytes so this needs a separate variable)
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:34
EComponentData
Amount of bits per component.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:41
@ COMPONENT_BITS
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:42
@ COMPONENT_MASK
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:43
EVertexXY
Packed X and Y coordinate.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:48
@ COMPONENT_X
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:49
@ COMPONENT_Y1
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:50
@ COMPONENT_Y1_BITS
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:51
EVertexZY
Packed Z and Y coordinate.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:56
@ COMPONENT_Z
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:57
@ COMPONENT_Y2_BITS
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:59
@ COMPONENT_Y2
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:58
Definition: UVec4.h:12
JPH_INLINE uint32 GetZ() const
Definition: UVec4.h:103
JPH_INLINE uint32 GetY() const
Definition: UVec4.h:102
JPH_INLINE UVec4 LogicalShiftRight() const
Shift all components by Count bits to the right (filling with zeros from the right)
static JPH_INLINE UVec4 sReplicate(uint32 inV)
Replicate int inV across all components.
Definition: UVec4.inl:56
JPH_INLINE UVec4 Expand4Byte4() const
Takes byte 4 .. 7 and expands them to X, Y, Z and W.
Definition: UVec4.inl:502
JPH_INLINE UVec4 Expand4Byte0() const
Takes byte 0 .. 3 and expands them to X, Y, Z and W.
Definition: UVec4.inl:487
static JPH_INLINE UVec4 sAnd(UVec4Arg inV1, UVec4Arg inV2)
Logical and (component wise)
Definition: UVec4.inl:194
static JPH_INLINE UVec4 sOr(UVec4Arg inV1, UVec4Arg inV2)
Logical or (component wise)
Definition: UVec4.inl:166
JPH_INLINE uint32 GetX() const
Get individual components.
Definition: UVec4.h:101
JPH_INLINE UVec4 Expand4Byte8() const
Takes byte 8 .. 11 and expands them to X, Y, Z and W.
Definition: UVec4.inl:517
static JPH_INLINE UVec4 sLoadInt4(const uint32 *inV)
Load 4 ints from memory.
Definition: UVec4.inl:78
static JPH_INLINE UVec4 sZero()
Vector with all zeros.
Definition: UVec4.inl:45
static JPH_INLINE UVec4 sSelect(UVec4Arg inV1, UVec4Arg inV2, UVec4Arg inControl)
Component wise select, returns inV1 when highest bit of inControl = 0 and inV2 when highest bit of in...
Definition: UVec4.inl:152
JPH_INLINE Vec4 ToFloat() const
Convert each component from an int to a float.
Definition: UVec4.inl:321
Definition: Vec3.h:16
static JPH_INLINE Vec3 sMax(Vec3Arg inV1, Vec3Arg inV2)
Return the maximum of each of the components.
Definition: Vec3.inl:159
static JPH_INLINE Vec3 sReplicate(float inV)
Replicate inV across all components.
Definition: Vec3.inl:118
Definition: Vec4.h:14
static JPH_INLINE void sSort4(Vec4 &ioValue, UVec4 &ioIndex)
Definition: Vec4.inl:301
static JPH_INLINE UVec4 sLess(Vec4Arg inV1, Vec4Arg inV2)
Less than (component wise)
Definition: Vec4.inl:180
static JPH_INLINE Vec4 sFusedMultiplyAdd(Vec4Arg inMul1, Vec4Arg inMul2, Vec4Arg inAdd)
Calculates inMul1 * inMul2 + inAdd.
Definition: Vec4.inl:236
static JPH_INLINE Vec4 sSelect(Vec4Arg inV1, Vec4Arg inV2, UVec4Arg inControl)
Component wise select, returns inV1 when highest bit of inControl = 0 and inV2 when highest bit of in...
Definition: Vec4.inl:254
JPH_INLINE float GetX() const
Get individual components.
Definition: Vec4.h:112
static JPH_INLINE Vec4 sZero()
Vector with all zeros.
Definition: Vec4.inl:63
static JPH_INLINE Vec4 sReplicate(float inV)
Replicate inV across all components.
Definition: Vec4.inl:74
A triangle header, will be followed by one or more TriangleBlocks.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:82
const VertexData * GetVertexData() const
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:83
uint32 mOffsetToVertices
Offset from current block to start of vertices in bytes.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:86
const TriangleBlock * GetTriangleBlock() const
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:84
A block of 4 triangles.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:73
uint8 mFlags[4]
Triangle flags (could contain material and active edges)
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:75
uint8 mIndices[3][4]
8 bit indices to triangle vertices for 4 triangles in the form mIndices[vertex][triangle] where verte...
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:74
A single packed vertex.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:64
uint32 mVertexXY
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:65
uint32 mVertexZY
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:66