70 std::shared_ptr<GpuSync::PointNode>
point;
72 glm::vec3 velocity { 0.0F };
73 glm::vec3 acceleration { 0.0F };
74 glm::vec3 force { 0.0F };
117 size_t num_particles,
118 const glm::vec3& bounds_min = glm::vec3(-10.0F),
119 const glm::vec3& bounds_max = glm::vec3(10.0F),
120 InitializationMode init_mode = InitializationMode::RANDOM_VOLUME);
126 void process_batch(
unsigned int num_samples)
override;
130 return m_particles.size();
134 void reset()
override;
136 [[nodiscard]] std::unordered_map<std::string, std::string>
137 get_metadata()
const override;
139 [[nodiscard]] std::optional<double> get_node_output(
size_t index)
const override;
146 const std::string& param_name,
147 const std::shared_ptr<Node>& source,
148 MappingMode mode = MappingMode::BROADCAST)
override;
151 const std::string& param_name,
152 const std::shared_ptr<NodeNetwork>& source_network)
override;
154 void unmap_parameter(
const std::string& param_name)
override;
173 return m_particles.at(index);
181 return m_particles.at(index);
191 void set_gravity(
const glm::vec3& gravity) { m_gravity = gravity; }
201 void set_drag(
float drag) { m_drag = glm::clamp(drag, 0.0F, 1.0F); }
206 [[nodiscard]]
float get_drag()
const {
return m_drag; }
227 m_interaction_radius = radius;
228 m_neighbor_map_dirty =
true;
236 m_spring_stiffness = stiffness;
244 m_repulsion_strength = strength;
252 m_attraction_point = point;
253 m_has_attraction_point =
true;
261 m_has_attraction_point =
false;
276 void apply_global_impulse(
const glm::vec3& impulse);
281 void apply_impulse(
size_t index,
const glm::vec3& impulse);
286 void reinitialize_positions(InitializationMode mode);
291 void reset_velocities();
301 glm::vec3 m_gravity { 0.0F, -9.8F, 0.0F };
302 float m_drag = 0.01F;
303 float m_timestep = 0.016F;
306 glm::vec3 m_bounds_min { -10.0F };
307 glm::vec3 m_bounds_max { 10.0F };
311 float m_interaction_radius = 2.0F;
312 float m_spring_stiffness = 0.1F;
313 float m_repulsion_strength = 0.5F;
316 glm::vec3 m_attraction_point { 0.0F };
317 bool m_has_attraction_point =
false;
318 float m_attraction_strength = 1.0F;
325 bool m_neighbor_map_dirty =
true;
339 void apply_gravity();
349 void apply_interaction_forces();
354 void apply_attraction_force();
359 void integrate(
float dt);
364 void handle_bounds();
369 void update_point_nodes();
378 void rebuild_spatial_neighbors();
383 [[nodiscard]] std::vector<size_t> get_neighbors(
size_t index)
const;
397 [[nodiscard]] glm::vec3 random_position_volume()
const;
402 [[nodiscard]] glm::vec3 random_position_surface()
const;
407 [[nodiscard]] glm::vec3 random_position_sphere(
float radius)
const;
412 [[nodiscard]] glm::vec3 random_position_sphere_surface(
float radius)
const;
421 void update_mapped_parameters();
426 void apply_broadcast_parameter(
const std::string& param,
double value);
431 void apply_one_to_one_parameter(
432 const std::string& param,
433 const std::shared_ptr<NodeNetwork>& source);
void set_repulsion_strength(float strength)
Set repulsion strength (for SPATIAL topology)
void disable_attraction_point()
Disable attraction point.
const std::vector< ParticleNode > & get_particles() const
Get all particles (read-only for NetworkGeometryBuffer)
ParticleNode & get_particle_mut(size_t index)
Get mutable particle (for custom manipulation)
void set_interaction_radius(float radius)
Set interaction radius (for SPATIAL topology)
glm::vec3 get_gravity() const
Get current gravity.
std::unordered_map< size_t, std::vector< size_t > > m_neighbor_map
void set_drag(float drag)
Set drag coefficient (0.0 = no drag, 1.0 = full drag)
void set_bounds_mode(BoundsMode mode)
Set bounds behavior.
InitializationMode
Particle spawn distribution.
size_t get_node_count() const override
Get the number of nodes in the network.
void set_timestep(float dt)
Set time step for physics integration.
const ParticleNode & get_particle(size_t index) const
Get specific particle.
void set_spring_stiffness(float stiffness)
Set spring stiffness (for SPATIAL/GRID topologies)
void set_bounds(const glm::vec3 &min, const glm::vec3 &max)
Set spatial bounds.
BoundsMode
How particles behave at spatial bounds.
InitializationMode m_init_mode
void set_gravity(const glm::vec3 &gravity)
Set global gravity vector.
std::vector< ParticleNode > m_particles
void set_attraction_point(const glm::vec3 &point)
Set attraction point (particles pulled toward this point)
Network of particles with physics simulation.
std::shared_ptr< GpuSync::PointNode > point
Actual GeometryWriterNode.
Single particle with physics state.