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; }
152 void set_bounds(
const glm::vec3& min,
const glm::vec3& max);
194 [[nodiscard]] std::optional<double> get_particle_velocity(
size_t global_index)
const;
206 [[nodiscard]]
float get_drag()
const {
return m_drag; }
226 void set_attraction_point(
const glm::vec3& point);
237 void apply_global_impulse(
const glm::vec3& impulse);
242 void apply_impulse(
size_t index,
const glm::vec3& impulse);
257 void clear_force_fields();
279 void sync_bonds_from_claims(std::span<const uint32_t> claimed_by);
308 [[nodiscard]]
size_t bond_count()
const;
321 void enable_bonds(
bool enable);
339 [[nodiscard]]
float get_accreted_mass(
size_t global_index)
const;
351 [[nodiscard]] std::span<const float> get_accreted_mass_span();
361 [[nodiscard]]
float get_total_mass()
const;
400 [[nodiscard]] std::vector<uint32_t> build_cluster_ids()
const override;
411 void apply_one_to_one(
412 std::string_view param,
413 const std::shared_ptr<NodeNetwork>& source)
override;
429 void* get_data_at(
size_t global_index)
override;
438 glm::vec3 m_gravity { 0.0F, -9.81F, 0.0F };
439 float m_drag { 0.01F };
440 float m_interaction_radius { 1.0F };
441 float m_spring_stiffness { 0.5F };
442 float m_point_size { 5.0F };
443 float m_turbulence_strength { 0.0F };
446 bool m_spatial_interactions_enabled {};
447 float m_repulsion_strength { 0.5F };
449 glm::vec3 m_attraction_point { 0.0F };
450 bool m_has_attraction_point {
false };
451 float m_attraction_strength { 1.0F };
452 float m_internal_dt { 0.016F };
455 float m_bond_stiffness { 2.0F };
456 float m_bond_rest_length { 0.0F };
457 bool m_bonds_enabled {
true };
461 static std::optional<PhysicsParameter> string_to_parameter(std::string_view param);
464 void apply_spatial_interactions();
465 void apply_attraction_forces();
466 void apply_turbulence();
467 void apply_bond_forces();
468 void integrate(
float dt);
469 void handle_boundary_conditions();
470 void sync_to_point_collection();
482 [[nodiscard]] std::optional<GroupIndex> resolve_global_index(
size_t global_index)
const;
484 void apply_per_particle_force(
485 std::string_view param,
486 const std::shared_ptr<NodeNetwork>& source);
488 void apply_per_particle_mass(
489 const std::shared_ptr<NodeNetwork>& source);
491 mutable std::atomic<uint32_t> m_access_token { 0 };
492 std::atomic<bool> m_shutdown {
false };