55 std::shared_ptr<GpuSync::PointCollectionNode>
collection;
76 void initialize(
const std::vector<PointVertex>& vertices);
82 void initialize_collections(
83 const std::vector<std::vector<PointVertex>>& collections);
91 const std::vector<PointVertex>& vertices,
92 float mass_multiplier = 1.0F);
94 void process(
float dt)
override;
96 [[nodiscard]] std::span<const uint8_t> get_vertex_data_for_collection(uint32_t idx)
const override;
97 [[nodiscard]] std::span<const uint8_t> get_vertex_data()
const override;
99 [[nodiscard]]
size_t get_vertex_count()
const override;
100 [[nodiscard]]
bool is_vertex_data_dirty()
const override;
101 void mark_vertex_data_clean()
override;
107 [[nodiscard]] std::vector<PointVertex> extract_vertices()
const;
109 void set_parameter(std::string_view param,
double value)
override;
110 [[nodiscard]] std::optional<double> query_state(std::string_view query)
const override;
111 [[nodiscard]] std::string_view
get_type_name()
const override {
return "Physics"; }
112 [[nodiscard]]
size_t get_point_count()
const override;
118 void set_gravity(
const glm::vec3& gravity) { m_gravity = gravity; }
143 void set_bounds(
const glm::vec3& min,
const glm::vec3& max);
179 [[nodiscard]] std::optional<double> get_particle_velocity(
size_t global_index)
const;
191 [[nodiscard]]
float get_drag()
const {
return m_drag; }
211 void set_attraction_point(
const glm::vec3& point);
222 void apply_global_impulse(
const glm::vec3& impulse);
227 void apply_impulse(
size_t index,
const glm::vec3& impulse);
244 void apply_one_to_one(
245 std::string_view param,
246 const std::shared_ptr<NodeNetwork>& source)
override;
251 void* get_data_at(
size_t global_index)
override;
259 glm::vec3 m_gravity { 0.0F, -9.81F, 0.0F };
260 float m_drag { 0.01F };
261 float m_interaction_radius { 1.0F };
262 float m_spring_stiffness { 0.5F };
263 float m_point_size { 5.0F };
264 float m_turbulence_strength { 0.0F };
267 bool m_spatial_interactions_enabled {};
268 float m_repulsion_strength { 0.5F };
270 glm::vec3 m_attraction_point { 0.0F };
271 bool m_has_attraction_point {
false };
272 float m_attraction_strength { 1.0F };
274 static std::optional<PhysicsParameter> string_to_parameter(std::string_view param);
277 void apply_spatial_interactions();
278 void apply_attraction_forces();
279 void apply_turbulence();
280 void integrate(
float dt);
281 void handle_boundary_conditions();
282 void sync_to_point_collection();
284 void apply_per_particle_force(
285 std::string_view param,
286 const std::shared_ptr<NodeNetwork>& source);
288 void apply_per_particle_mass(
289 const std::shared_ptr<NodeNetwork>& source);