Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
MortonCode.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
12{
13public:
16 static uint32 sExpandBits(float inV)
17 {
18 JPH_ASSERT(inV >= 0.0f && inV <= 1.0f);
19 uint32 v = uint32(inV * 1023.0f + 0.5f);
20 JPH_ASSERT(v < 1024);
21 v = (v * 0x00010001u) & 0xFF0000FFu;
22 v = (v * 0x00000101u) & 0x0F00F00Fu;
23 v = (v * 0x00000011u) & 0xC30C30C3u;
24 v = (v * 0x00000005u) & 0x49249249u;
25 return v;
26 }
27
29 static uint32 sGetMortonCode(Vec3Arg inVector, const AABox &inVectorBounds)
30 {
31 // Convert to 10 bit fixed point
32 Vec3 scaled = (inVector - inVectorBounds.mMin) / inVectorBounds.GetSize();
33 uint x = sExpandBits(scaled.GetX());
34 uint y = sExpandBits(scaled.GetY());
35 uint z = sExpandBits(scaled.GetZ());
36 return (x << 2) + (y << 1) + z;
37 }
38};
39
unsigned int uint
Definition: Core.h:452
#define JPH_NAMESPACE_END
Definition: Core.h:378
std::uint32_t uint32
Definition: Core.h:455
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:372
#define JPH_ASSERT(...)
Definition: IssueReporting.h:33
Axis aligned box.
Definition: AABox.h:16
Vec3 GetSize() const
Get size of bounding box.
Definition: AABox.h:117
Vec3 mMin
Bounding box min and max.
Definition: AABox.h:300
Definition: MortonCode.h:12
static uint32 sExpandBits(float inV)
Definition: MortonCode.h:16
static uint32 sGetMortonCode(Vec3Arg inVector, const AABox &inVectorBounds)
Calculate the morton code for inVector, given that all vectors lie in inVectorBounds.
Definition: MortonCode.h:29
Definition: Vec3.h:17
JPH_INLINE float GetX() const
Get individual components.
Definition: Vec3.h:124
JPH_INLINE float GetY() const
Definition: Vec3.h:125
JPH_INLINE float GetZ() const
Definition: Vec3.h:126