30 glm::vec3 position {0.0f};
32 glm::vec4 rotation {0.0f, 0.0f, 0.0f, 1.0f};
33 glm::vec3 velocity {0.0f};
34 uint32_t albedo_roughness = 0;
38 glm::vec3 angular_velocity {0.0f};
40 uint32_t rest_steps = 0;
41 std::array<uint32_t, 3> pad {};
45 glm::vec3 position {0.0f};
47 glm::vec4 rotation {0.0f, 0.0f, 0.0f, 1.0f};
48 glm::vec3 velocity {0.0f};
49 uint32_t albedo_roughness = 0;
50 glm::vec3 angular_velocity {0.0f};
55 glm::mat4 world_to_voxel {1.0f};
56 glm::vec4 bounds {0.0f};
57 uint32_t record_index = 0;
58 std::array<uint32_t, 3> pad {};
62 static_assert(
sizeof(
GpuParticle) == 48,
"GpuParticle is mirrored by debris.slang");
63 static_assert(
sizeof(
GpuMotion) == 32,
"GpuMotion is mirrored by debris.slang");
64 static_assert(
sizeof(
GpuSpawn) == 64,
"GpuSpawn is mirrored by debris.slang");
65 static_assert(
sizeof(
GpuVolume) == 96,
"GpuVolume is mirrored by debris.slang");
67 static constexpr uint32_t k_max_spawns_per_step = 4096;
68 static constexpr uint32_t k_max_volumes = 512;
69 static constexpr uint32_t k_voxels_per_particle = 8;
71 explicit DebrisSimulation(uint32_t capacity);
72 ~DebrisSimulation()
override;
74 DebrisSimulation(
const DebrisSimulation&) =
delete;
75 auto operator=(
const DebrisSimulation&) -> DebrisSimulation& =
delete;
76 DebrisSimulation(DebrisSimulation&&) =
delete;
77 auto operator=(DebrisSimulation&&) -> DebrisSimulation& =
delete;
80 static auto get() -> DebrisSimulation*;
81 void spawn(std::span<const DebrisSpawn> spawns);
82 void step(uint32_t steps,
double fixed_delta, std::shared_ptr<const renderer::VoxelCollisionWorld> world);
83 void setDisplayAlpha(
float alpha,
double fixed_delta);
87 auto capacity() const -> uint32_t {
92 auto visible() const ->
bool;
95 auto extrapolation(uint64_t step) const ->
float;
98 auto frameDelta() const ->
float;
101 auto particlesId() const -> BufferId {
106 auto drawListId() const -> BufferId {
111 auto drawArgsId() const -> BufferId {
117 glm::vec3 gravity {0.0f};
119 float lifetime = 0.0f;
120 float restitution = 0.0f;
121 float friction = 0.0f;
122 float voxel_size = 0.0f;
123 uint32_t capacity = 0;
124 uint32_t spawn_count = 0;
125 uint32_t volume_count = 0;
126 uint32_t substeps = 1;
128 std::array<uint32_t, 3> pad {};
131 static_assert(
sizeof(Params) == 64,
"Params is mirrored by debris.slang");
133 static constexpr uint64_t k_step_history = 16;
135 uint32_t m_capacity = 0;
136 uint32_t m_cursor = 0;
138 BufferId m_particles = 0;
139 BufferId m_motion = 0;
140 BufferId m_draw_list = 0;
141 BufferId m_draw_args = 0;
142 BufferId m_spawns = 0;
143 BufferId m_volumes = 0;
145 std::deque<GpuSpawn> m_pending;
146 bool m_clear_pending =
false;
148 std::shared_ptr<const renderer::VoxelCollisionWorld> m_world;
150 mutable std::mutex m_time_mutex;
151 double m_sim_time = 0.0;
152 double m_display_time = 0.0;
153 double m_frame_delta = 0.0;
154 std::array<double, k_step_history> m_step_times {};
155 bool m_visible =
false;
Definition debris_simulation.hpp:29