22 float restitution = material_defaults::k_restitution;
23 float static_friction = material_defaults::k_static_friction;
24 float dynamic_friction = material_defaults::k_dynamic_friction;
26 float spin_friction = material_defaults::k_spin_friction;
30 uint32_t slot = std::numeric_limits<uint32_t>::max();
31 uint32_t generation = 0;
32 auto operator<=>(
const ShapeID&)
const =
default;
35enum class FeatureType : uint8_t {
53inline constexpr uint64_t contact_feature_payload_mask = 0x00ff'ffff'ffff'ffffULL;
56constexpr auto makeContactFeature(FeatureType type, uint64_t payload = 0) ->
ContactFeatureID {
57 return ContactFeatureID {(
static_cast<uint64_t
>(type) << 56) | (payload & contact_feature_payload_mask)};
62 if (parameter <= 0.0f) {
63 return makeContactFeature(FeatureType::capsule_cap_a);
65 if (parameter >= 1.0f) {
66 return makeContactFeature(FeatureType::capsule_cap_b);
68 return makeContactFeature(FeatureType::capsule_side);
73 return makeContactFeature(FeatureType::box_face,
static_cast<uint64_t
>(axis) | (
static_cast<uint64_t
>(positive) << 2));
77constexpr auto boxEdgeFeature(
int direction_axis, uint8_t positive_mask) ->
ContactFeatureID {
78 return makeContactFeature(
79 FeatureType::box_edge,
static_cast<uint64_t
>(direction_axis) | (
static_cast<uint64_t
>(positive_mask & 0x7u) << 2)
85 return makeContactFeature(FeatureType::box_vertex, positive_mask & 0x7u);
89constexpr auto boxClipFeature(
int reference_axis,
bool reference_positive,
int side_axis,
bool side_positive)
91 uint64_t payload =
static_cast<uint64_t
>(reference_axis);
92 payload |=
static_cast<uint64_t
>(reference_positive) << 2;
93 payload |=
static_cast<uint64_t
>(side_axis) << 3;
94 payload |=
static_cast<uint64_t
>(side_positive) << 5;
95 return makeContactFeature(FeatureType::box_clip, payload);
99constexpr auto voxelFeature(FeatureType type, uint32_t brick_slot, uint16_t local_index, uint8_t normal_index)
101 uint64_t payload =
static_cast<uint64_t
>(local_index) & 0x1FFu;
102 payload |= (
static_cast<uint64_t
>(normal_index) & 0x1Fu) << 9;
103 payload |= (
static_cast<uint64_t
>(brick_slot) & 0xFFFF'FFFFu) << 14;
104 return makeContactFeature(type, payload);
109 uint16_t local_index = 0;
110 uint8_t normal_index = 0;
115 const uint64_t payload =
id.value & contact_feature_payload_mask;
117 .slot =
static_cast<uint32_t
>((payload >> 14) & 0xFFFF'FFFFu),
118 .local_index =
static_cast<uint16_t
>(payload & 0x1FFu),
119 .normal_index =
static_cast<uint8_t
>((payload >> 9) & 0x1Fu),
123enum class ShapeType : uint8_t {
131 glm::vec3 local_center = {};
136 glm::vec3 local_center = {};
137 glm::quat local_rotation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f);
138 glm::vec3 size = {1.0f, 1.0f, 1.0f};
142 glm::vec3 local_center = {};
143 glm::quat local_rotation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f);
149 uint32_t slot = std::numeric_limits<uint32_t>::max();
150 uint32_t generation = 0;
151 auto operator<=>(
const VoxelDataID&)
const =
default;
156 glm::vec3 local_center = {};
157 glm::quat local_rotation = {1.0f, 0.0f, 0.0f, 0.0f};
158 AABB local_bounds = {};
163 ShapeType type = ShapeType::sphere;
175 auto getLocalCenter()
const -> glm::vec3 {
177 case ShapeType::sphere:
return sphere.local_center;
178 case ShapeType::box:
return box.local_center;
179 case ShapeType::capsule:
return capsule.local_center;
180 case ShapeType::voxel:
return voxel.local_center;
182 return glm::vec3(0.0f);
186 auto getLocalRotation()
const -> glm::quat {
188 case ShapeType::sphere:
return {1.0f, 0.0f, 0.0f, 0.0f};
189 case ShapeType::box:
return box.local_rotation;
190 case ShapeType::capsule:
return capsule.local_rotation;
191 case ShapeType::voxel:
return voxel.local_rotation;
193 return {1.0f, 0.0f, 0.0f, 0.0f};
199 uint32_t generation = 1;
200 uint32_t revision = 1;
201 bool occupied =
false;
204inline constexpr ContactFeatureID sphere_surface_feature = makeContactFeature(FeatureType::sphere_surface);
Axis-aligned bounds node.
Body identifiers, creation data, and copied runtime state.
The values a material has when nothing sets them.
constexpr float k_rolling_friction
A ball rolling on a hard floor loses a few percent of its speed per metre.
Definition material_defaults.hpp:22