56 std::shared_ptr<GpuSync::PointCollectionNode>
collection;
79 void initialize(
const std::vector<PointVertex>& vertices);
85 void initialize_collections(
86 const std::vector<std::vector<PointVertex>>& collections);
94 const std::vector<PointVertex>& vertices,
95 float mass_multiplier = 1.0F);
97 void process(
float dt)
override;
99 [[nodiscard]] std::span<const uint8_t> get_vertex_data_for_collection(uint32_t idx)
const override;
100 [[nodiscard]] std::span<const uint8_t> get_vertex_data()
const override;
102 [[nodiscard]]
size_t get_vertex_count()
const override;
103 [[nodiscard]]
bool is_vertex_data_dirty()
const override;
104 void mark_vertex_data_clean()
override;
110 [[nodiscard]] std::vector<PointVertex> extract_vertices()
const;
112 void set_parameter(std::string_view param,
double value)
override;
113 [[nodiscard]] std::optional<double> query_state(std::string_view query)
const override;
114 [[nodiscard]] std::string_view
get_type_name()
const override {
return "Physics"; }
115 [[nodiscard]]
size_t get_point_count()
const override;
121 void set_gravity(
const glm::vec3& gravity) { m_gravity = gravity; }
146 void set_bounds(
const glm::vec3& min,
const glm::vec3& max);
188 [[nodiscard]] std::optional<double> get_particle_velocity(
size_t global_index)
const;
200 [[nodiscard]]
float get_drag()
const {
return m_drag; }
220 void set_attraction_point(
const glm::vec3& point);
231 void apply_global_impulse(
const glm::vec3& impulse);
236 void apply_impulse(
size_t index,
const glm::vec3& impulse);
251 void clear_force_fields();
280 void apply_one_to_one(
281 std::string_view param,
282 const std::shared_ptr<NodeNetwork>& source)
override;
298 void* get_data_at(
size_t global_index)
override;
307 glm::vec3 m_gravity { 0.0F, -9.81F, 0.0F };
308 float m_drag { 0.01F };
309 float m_interaction_radius { 1.0F };
310 float m_spring_stiffness { 0.5F };
311 float m_point_size { 5.0F };
312 float m_turbulence_strength { 0.0F };
315 bool m_spatial_interactions_enabled {};
316 float m_repulsion_strength { 0.5F };
318 glm::vec3 m_attraction_point { 0.0F };
319 bool m_has_attraction_point {
false };
320 float m_attraction_strength { 1.0F };
321 float m_internal_dt { 0.016F };
323 static std::optional<PhysicsParameter> string_to_parameter(std::string_view param);
326 void apply_spatial_interactions();
327 void apply_attraction_forces();
328 void apply_turbulence();
329 void integrate(
float dt);
330 void handle_boundary_conditions();
331 void sync_to_point_collection();
333 void apply_per_particle_force(
334 std::string_view param,
335 const std::shared_ptr<NodeNetwork>& source);
337 void apply_per_particle_mass(
338 const std::shared_ptr<NodeNetwork>& source);
340 mutable std::atomic<uint32_t> m_access_token { 0 };
341 std::atomic<bool> m_shutdown {
false };