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 [[nodiscard]] std::vector<std::pair<std::string, Kakshya::DataVariant>>
412 extract_vertex_attributes()
const override;
418 [[nodiscard]] std::vector<glm::vec3> extract_vertex_velocities()
const override;
428 [[nodiscard]] std::optional<Portal::Graphics::PrimitiveTopology> declared_topology()
const override;
435 std::vector<DrawRun> topology_runs()
const override;
446 void apply_one_to_one(
447 std::string_view param,
448 const std::shared_ptr<NodeNetwork>& source)
override;
464 void* get_data_at(
size_t global_index)
override;
473 glm::vec3 m_gravity { 0.0F, -9.81F, 0.0F };
474 float m_drag { 0.01F };
475 float m_interaction_radius { 1.0F };
476 float m_spring_stiffness { 0.5F };
477 float m_point_size { 5.0F };
478 float m_turbulence_strength { 0.0F };
481 bool m_spatial_interactions_enabled {};
482 float m_repulsion_strength { 0.5F };
484 glm::vec3 m_attraction_point { 0.0F };
485 bool m_has_attraction_point {
false };
486 float m_attraction_strength { 1.0F };
487 float m_internal_dt { 0.016F };
490 float m_bond_stiffness { 2.0F };
491 float m_bond_rest_length { 0.0F };
492 bool m_bonds_enabled {
true };
496 static std::optional<PhysicsParameter> string_to_parameter(std::string_view param);
499 void apply_spatial_interactions();
500 void apply_attraction_forces();
501 void apply_turbulence();
502 void apply_bond_forces();
503 void integrate(
float dt);
504 void handle_boundary_conditions();
505 void sync_to_point_collection();
517 [[nodiscard]] std::optional<GroupIndex> resolve_global_index(
size_t global_index)
const;
519 void apply_per_particle_force(
520 std::string_view param,
521 const std::shared_ptr<NodeNetwork>& source);
523 void apply_per_particle_mass(
524 const std::shared_ptr<NodeNetwork>& source);
526 mutable std::atomic<uint32_t> m_access_token { 0 };
527 std::atomic<bool> m_shutdown {
false };