[Bf-blender-cvs] [d600fb3a459] functions: more explicit particle integration step

Jacques Lucke noreply at git.blender.org
Tue Jun 18 14:31:56 CEST 2019


Commit: d600fb3a4598641e3bae17b8033e87560f2f60f3
Author: Jacques Lucke
Date:   Tue Jun 18 14:02:32 2019 +0200
Branches: functions
https://developer.blender.org/rBd600fb3a4598641e3bae17b8033e87560f2f60f3

more explicit particle integration step

===================================================================

M	source/blender/blenlib/BLI_math.hpp
M	source/blender/simulations/bparticles/playground_solver.cpp

===================================================================

diff --git a/source/blender/blenlib/BLI_math.hpp b/source/blender/blenlib/BLI_math.hpp
index b54aaf4dfa9..7cbd353c4c2 100644
--- a/source/blender/blenlib/BLI_math.hpp
+++ b/source/blender/blenlib/BLI_math.hpp
@@ -42,6 +42,11 @@ struct float3 {
     return {a.x * b, a.y * b, a.z * b};
   }
 
+  friend float3 operator*(float a, float3 b)
+  {
+    return b * a;
+  }
+
   friend float3 operator/(float3 a, float b)
   {
     BLI_assert(b != 0);
diff --git a/source/blender/simulations/bparticles/playground_solver.cpp b/source/blender/simulations/bparticles/playground_solver.cpp
index 74925c801dc..598badcd9f0 100644
--- a/source/blender/simulations/bparticles/playground_solver.cpp
+++ b/source/blender/simulations/bparticles/playground_solver.cpp
@@ -13,7 +13,7 @@ class MoveUpAction : public BParticles::Action {
     auto positions = buffers.get_float3(buffers.info().attribute_index("Position"));
 
     for (uint i : indices_to_influence) {
-      positions[i].z += 2.0f;
+      positions[i].y += 5.0f;
     }
   }
 };
@@ -112,56 +112,72 @@ class SimpleSolver : public Solver {
     data->solver->step_slice(data->state, attributes, data->elapsed_seconds);
   }
 
-  BLI_NOINLINE void step_slice(MyState &state, AttributeArrays buffers, float elapsed_seconds)
+  BLI_NOINLINE void step_slice(MyState &state, AttributeArrays attributes, float elapsed_seconds)
   {
-    auto positions = buffers.get_float3("Position");
-    auto velocities = buffers.get_float3("Velocity");
+    SmallVector<float> time_diffs(attributes.size());
+    time_diffs.fill(elapsed_seconds);
 
-    SmallVector<float3> combined_force(buffers.size());
-    this->compute_combined_force(buffers, combined_force);
+    SmallVector<float3> position_offsets(attributes.size());
+    SmallVector<float3> velocity_offsets(attributes.size());
 
-    SmallVector<float3> new_positions(buffers.size());
-    SmallVector<float3> new_velocities(buffers.size());
+    this->integrate_particles(attributes, time_diffs, position_offsets, velocity_offsets);
 
-    float mass = 1.0f;
-    for (uint i = 0; i < buffers.size(); i++) {
-      new_positions[i] = positions[i] + velocities[i] * elapsed_seconds;
-      new_velocities[i] = velocities[i] + combined_force[i] / mass * elapsed_seconds;
-    }
+    auto positions = attributes.get_float3("Position");
+    auto velocities = attributes.get_float3("Velocity");
 
     SmallVector<uint> indices;
-
-    for (uint i = 0; i < buffers.size(); i++) {
-      if (positions[i].y <= 2 && new_positions[i].y > 2) {
-        new_positions[i] = (positions[i] + new_positions[i]) * 0.5f;
-        new_velocities[i] = (velocities[i] + new_velocities[i]) * 0.5f;
+    for (uint i = 0; i < attributes.size(); i++) {
+      float y_offset = position_offsets[i].y;
+      if (positions[i].y < 2 && positions[i].y + y_offset >= 2.0f) {
         indices.append(i);
       }
     }
 
-    positions.copy_from(new_positions);
-    velocities.copy_from(new_velocities);
-
     MoveUpAction action;
-    action.execute(buffers, indices);
+    action.execute(attributes, indices);
 
-    auto birth_times = buffers.get_float("Birth Time");
-    auto kill_states = buffers.get_byte("Kill State");
+    auto birth_times = attributes.get_float("Birth Time");
+    auto kill_states = attributes.get_byte("Kill State");
 
-    for (uint i = 0; i < buffers.size(); i++) {
+    for (uint i = 0; i < attributes.size(); i++) {
       float age = state.seconds_since_start - birth_times[i];
       if (age > 5) {
         kill_states[i] = 1;
       }
     }
+
+    for (uint i = 0; i < attributes.size(); i++) {
+      positions[i] += position_offsets[i];
+      velocities[i] += velocity_offsets[i];
+    }
+  }
+
+  BLI_NOINLINE void integrate_particles(AttributeArrays attributes,
+                                        ArrayRef<float> time_diffs,
+                                        ArrayRef<float3> r_position_offsets,
+                                        ArrayRef<float3> r_velocity_offsets)
+  {
+    BLI_assert(attributes.size() == time_diffs.size());
+
+    SmallVector<float3> combined_force(attributes.size());
+    this->compute_combined_force(attributes, combined_force);
+
+    auto velocities = attributes.get_float3("Velocity");
+
+    for (uint i = 0; i < attributes.size(); i++) {
+      float mass = 1.0f;
+      float time_diff = time_diffs[i];
+      r_velocity_offsets[i] = time_diff * combined_force[i] / mass;
+      r_position_offsets[i] = time_diff * (velocities[i] + r_velocity_offsets[i] * 0.5f);
+    }
   }
 
-  BLI_NOINLINE void compute_combined_force(AttributeArrays slice, ArrayRef<float3> dst)
+  BLI_NOINLINE void compute_combined_force(AttributeArrays attributes, ArrayRef<float3> dst)
   {
-    BLI_assert(slice.size() == dst.size());
+    BLI_assert(attributes.size() == dst.size());
     dst.fill({0, 0, 0});
     for (Force *force : m_description.forces()) {
-      force->add_force(slice, dst);
+      force->add_force(attributes, dst);
     }
   }



More information about the Bf-blender-cvs mailing list