56 std::shared_ptr<GpuSync::PointCollectionNode>
collection;
77 void initialize(
const std::vector<PointVertex>& vertices);
83 void initialize_collections(
84 const std::vector<std::vector<PointVertex>>& collections);
92 const std::vector<PointVertex>& vertices,
93 float mass_multiplier = 1.0F);
95 void process(
float dt)
override;
97 [[nodiscard]] std::span<const uint8_t> get_vertex_data_for_collection(uint32_t idx)
const override;
98 [[nodiscard]] std::span<const uint8_t> get_vertex_data()
const override;
100 [[nodiscard]]
size_t get_vertex_count()
const override;
101 [[nodiscard]]
bool is_vertex_data_dirty()
const override;
102 void mark_vertex_data_clean()
override;
108 [[nodiscard]] std::vector<PointVertex> extract_vertices()
const;
110 void set_parameter(std::string_view param,
double value)
override;
111 [[nodiscard]] std::optional<double> query_state(std::string_view query)
const override;
112 [[nodiscard]] std::string_view
get_type_name()
const override {
return "Physics"; }
113 [[nodiscard]]
size_t get_point_count()
const override;
119 void set_gravity(
const glm::vec3& gravity) { m_gravity = gravity; }
144 void set_bounds(
const glm::vec3&
min,
const glm::vec3&
max);
186 [[nodiscard]] std::optional<double> get_particle_velocity(
size_t global_index)
const;
198 [[nodiscard]]
float get_drag()
const {
return m_drag; }
218 void set_attraction_point(
const glm::vec3& point);
229 void apply_global_impulse(
const glm::vec3& impulse);
234 void apply_impulse(
size_t index,
const glm::vec3& impulse);
249 void clear_force_fields();
271 void apply_one_to_one(
272 std::string_view param,
273 const std::shared_ptr<NodeNetwork>& source)
override;
278 void* get_data_at(
size_t global_index)
override;
287 glm::vec3 m_gravity { 0.0F, -9.81F, 0.0F };
288 float m_drag { 0.01F };
289 float m_interaction_radius { 1.0F };
290 float m_spring_stiffness { 0.5F };
291 float m_point_size { 5.0F };
292 float m_turbulence_strength { 0.0F };
295 bool m_spatial_interactions_enabled {};
296 float m_repulsion_strength { 0.5F };
298 glm::vec3 m_attraction_point { 0.0F };
299 bool m_has_attraction_point {
false };
300 float m_attraction_strength { 1.0F };
302 static std::optional<PhysicsParameter> string_to_parameter(std::string_view param);
305 void apply_spatial_interactions();
306 void apply_attraction_forces();
307 void apply_turbulence();
308 void integrate(
float dt);
309 void handle_boundary_conditions();
310 void sync_to_point_collection();
312 void apply_per_particle_force(
313 std::string_view param,
314 const std::shared_ptr<NodeNetwork>& source);
316 void apply_per_particle_mass(
317 const std::shared_ptr<NodeNetwork>& source);