[Bf-blender-cvs] [831d5665b02] functions: apply forces to particles again
Jacques Lucke
noreply at git.blender.org
Thu Jun 20 15:51:13 CEST 2019
Commit: 831d5665b028b7bd72c80ccb9b3b3fd2de869d18
Author: Jacques Lucke
Date: Thu Jun 20 12:36:23 2019 +0200
Branches: functions
https://developer.blender.org/rB831d5665b028b7bd72c80ccb9b3b3fd2de869d18
apply forces to particles again
===================================================================
M source/blender/simulations/bparticles/core.hpp
M source/blender/simulations/bparticles/simulate.cpp
===================================================================
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index 3107149e78b..09ec3e20e5e 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -128,6 +128,7 @@ class Emitter {
};
class ParticleInfluences {
+ public:
virtual ArrayRef<Force *> forces() = 0;
virtual ArrayRef<Event *> events() = 0;
virtual ArrayRef<Action *> action_per_event() = 0;
diff --git a/source/blender/simulations/bparticles/simulate.cpp b/source/blender/simulations/bparticles/simulate.cpp
index 19f64e450a1..ae48fd917e6 100644
--- a/source/blender/simulations/bparticles/simulate.cpp
+++ b/source/blender/simulations/bparticles/simulate.cpp
@@ -17,19 +17,71 @@ static ArrayRef<uint> static_number_range_ref()
return static_number_range_vector();
}
+/* Evaluate Forces
+ ***********************************************/
+
+static void compute_combined_forces_on_particles(AttributeArrays attributes,
+ ArrayRef<uint> particle_indices,
+ ArrayRef<Force *> forces,
+ ArrayRef<float3> r_force_vectors)
+{
+ BLI_assert(particle_indices.size() == r_force_vectors.size());
+ r_force_vectors.fill({0, 0, 0});
+ for (Force *force : forces) {
+ force->add_force(attributes, particle_indices, r_force_vectors);
+ }
+}
+
/* Step individual particles.
**********************************************/
+static void compute_ideal_attribute_offsets(AttributeArrays attributes,
+ ArrayRef<uint> particle_indices,
+ ArrayRef<float> durations,
+ ParticleInfluences &influences,
+ ArrayRef<float3> r_position_offsets,
+ ArrayRef<float3> r_velocity_offsets)
+{
+ BLI_assert(particle_indices.size() == durations.size());
+ BLI_assert(particle_indices.size() == r_position_offsets.size());
+ BLI_assert(particle_indices.size() == r_velocity_offsets.size());
+
+ SmallVector<float3> combined_force{particle_indices.size()};
+ compute_combined_forces_on_particles(
+ attributes, particle_indices, influences.forces(), combined_force);
+
+ auto velocities = attributes.get_float3("Velocity");
+
+ for (uint i = 0; i < particle_indices.size(); i++) {
+ uint pindex = particle_indices[i];
+
+ float mass = 1.0f;
+ float duration = durations[i];
+
+ r_velocity_offsets[i] = duration * combined_force[i] / mass;
+ r_position_offsets[i] = duration * (velocities[pindex] + r_velocity_offsets[i] * 0.5f);
+ }
+}
+
static void step_individual_particles(AttributeArrays attributes,
ArrayRef<uint> particle_indices,
ArrayRef<float> durations,
- ParticleInfluences &UNUSED(influences))
+ ParticleInfluences &influences)
{
+ SmallVector<float3> position_offsets{particle_indices.size()};
+ SmallVector<float3> velocity_offsets{particle_indices.size()};
+
+ compute_ideal_attribute_offsets(
+ attributes, particle_indices, durations, influences, position_offsets, velocity_offsets);
+
auto positions = attributes.get_float3("Position");
+ auto velocities = attributes.get_float3("Velocity");
for (uint i = 0; i < particle_indices.size(); i++) {
uint pindex = particle_indices[i];
- positions[pindex].x += durations[i] * 2.0f;
+
+ positions[pindex] += position_offsets[i];
+ velocities[pindex] += velocity_offsets[i];
}
}
More information about the Bf-blender-cvs
mailing list