[Bf-blender-cvs] [de5971b1dfb] functions: initial positional event abstraction

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


Commit: de5971b1dfbfba443273ac57c5ccb69ca1104145
Author: Jacques Lucke
Date:   Tue Jun 18 14:21:35 2019 +0200
Branches: functions
https://developer.blender.org/rBde5971b1dfbfba443273ac57c5ccb69ca1104145

initial positional event abstraction

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

M	source/blender/simulations/bparticles/core.cpp
M	source/blender/simulations/bparticles/core.hpp
M	source/blender/simulations/bparticles/playground_solver.cpp

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

diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp
index 44c01dd7499..9acd6cae267 100644
--- a/source/blender/simulations/bparticles/core.cpp
+++ b/source/blender/simulations/bparticles/core.cpp
@@ -32,6 +32,10 @@ Action::~Action()
 {
 }
 
+PositionalEvent::~PositionalEvent()
+{
+}
+
 void adapt_state(Solver *new_solver, WrappedState *wrapped_state)
 {
   wrapped_state->m_solver = new_solver;
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index e889ca72b6e..93188538978 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -41,6 +41,16 @@ class Action {
   virtual void execute(AttributeArrays &attributes, ArrayRef<uint> indices_to_influence) = 0;
 };
 
+class PositionalEvent {
+ public:
+  virtual ~PositionalEvent();
+
+  virtual void filter(AttributeArrays attributes,
+                      ArrayRef<float3> next_movement,
+                      SmallVector<uint> &r_filtered_indices,
+                      SmallVector<float> &r_time_factors) = 0;
+};
+
 class EmitterInfo {
  private:
   EmitterInfo()
diff --git a/source/blender/simulations/bparticles/playground_solver.cpp b/source/blender/simulations/bparticles/playground_solver.cpp
index 598badcd9f0..1405b89084d 100644
--- a/source/blender/simulations/bparticles/playground_solver.cpp
+++ b/source/blender/simulations/bparticles/playground_solver.cpp
@@ -18,6 +18,24 @@ class MoveUpAction : public BParticles::Action {
   }
 };
 
+class HitPlaneEvent : public PositionalEvent {
+ public:
+  virtual void filter(AttributeArrays attributes,
+                      ArrayRef<float3> next_movement,
+                      SmallVector<uint> &r_filtered_indices,
+                      SmallVector<float> &r_time_factors) override
+  {
+    auto positions = attributes.get_float3("Position");
+    for (uint i = 0; i < attributes.size(); i++) {
+      if (positions[i].y < 2.0f && positions[i].y + next_movement[i].y >= 2.0f) {
+        float time_factor = (2.0f - positions[i].y) / next_movement[i].y;
+        r_filtered_indices.append(i);
+        r_time_factors.append(time_factor);
+      }
+    }
+  }
+};
+
 class SimpleSolver : public Solver {
 
   struct MyState : StateBase {
@@ -125,16 +143,13 @@ class SimpleSolver : public Solver {
     auto positions = attributes.get_float3("Position");
     auto velocities = attributes.get_float3("Velocity");
 
-    SmallVector<uint> indices;
-    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);
-      }
-    }
+    HitPlaneEvent event;
+    SmallVector<uint> triggered_indices;
+    SmallVector<float> triggered_time_factors;
+    event.filter(attributes, position_offsets, triggered_indices, triggered_time_factors);
 
     MoveUpAction action;
-    action.execute(attributes, indices);
+    action.execute(attributes, triggered_indices);
 
     auto birth_times = attributes.get_float("Birth Time");
     auto kill_states = attributes.get_byte("Kill State");



More information about the Bf-blender-cvs mailing list