[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