[Bf-blender-cvs] [a38b89ecb51] functions: initial emitter info class

Jacques Lucke noreply at git.blender.org
Sun Jun 9 13:52:36 CEST 2019


Commit: a38b89ecb513e01849bbc9f07a878657a52b4e75
Author: Jacques Lucke
Date:   Sun Jun 9 11:58:00 2019 +0200
Branches: functions
https://developer.blender.org/rBa38b89ecb513e01849bbc9f07a878657a52b4e75

initial emitter info class

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

M	source/blender/blenlib/BLI_array_ref.hpp
M	source/blender/blenlib/BLI_small_set.hpp
M	source/blender/simulations/bparticles/c_wrapper.cpp
M	source/blender/simulations/bparticles/core.hpp
M	source/blender/simulations/bparticles/playground_solver.cpp
M	tests/gtests/blenlib/BLI_small_set_test.cc

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

diff --git a/source/blender/blenlib/BLI_array_ref.hpp b/source/blender/blenlib/BLI_array_ref.hpp
index a114e945e32..317eff3164c 100644
--- a/source/blender/blenlib/BLI_array_ref.hpp
+++ b/source/blender/blenlib/BLI_array_ref.hpp
@@ -38,10 +38,6 @@ template<typename T> class ArrayRef {
   {
   }
 
-  ArrayRef(const SmallVector<T> &vector) : ArrayRef(vector.begin(), vector.size())
-  {
-  }
-
   ArrayRef(const std::initializer_list<T> &list) : ArrayRef((T *)list.begin(), list.size())
   {
   }
diff --git a/source/blender/blenlib/BLI_small_set.hpp b/source/blender/blenlib/BLI_small_set.hpp
index 82b3a4e2cd4..02942a2b029 100644
--- a/source/blender/blenlib/BLI_small_set.hpp
+++ b/source/blender/blenlib/BLI_small_set.hpp
@@ -22,9 +22,7 @@ template<typename T, uint N = 4> class SmallSet {
 
   SmallSet(ArrayRef<T> values)
   {
-    for (const T &value : values) {
-      this->add(value);
-    }
+    this->add_multiple(values);
   }
 
   SmallSet(const SmallVector<T> &values) : SmallSet(ArrayRef<T>(values))
@@ -63,6 +61,13 @@ template<typename T, uint N = 4> class SmallSet {
     return newly_inserted;
   }
 
+  void add_multiple(ArrayRef<T> values)
+  {
+    for (T &value : values) {
+      this->add(value);
+    }
+  }
+
   T pop()
   {
     BLI_assert(this->size() > 0);
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 10426396ba4..4dd3a403e15 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -16,6 +16,7 @@
 using BParticles::AttributeType;
 using BParticles::Description;
 using BParticles::EmitterDestination;
+using BParticles::EmitterInfoBuilder;
 using BParticles::NamedBuffers;
 using BParticles::ParticlesBlock;
 using BParticles::Solver;
@@ -50,25 +51,11 @@ class TestForce : public BParticles::Force {
 };
 
 class TestEmitter : public BParticles::Emitter {
- private:
-  SmallVector<std::string> m_used_float_attributes;
-  SmallVector<std::string> m_used_vec3_attributes;
-
  public:
-  TestEmitter()
-  {
-    m_used_float_attributes = {};
-    m_used_vec3_attributes = {"Position", "Velocity"};
-  }
-
-  ArrayRef<std::string> used_float_attributes() override
-  {
-    return m_used_float_attributes;
-  }
-
-  ArrayRef<std::string> used_vec3_attributes() override
+  void info(EmitterInfoBuilder &builder) const override
   {
-    return m_used_vec3_attributes;
+    builder.inits_vec3_attribute("Position");
+    builder.inits_vec3_attribute("Velocity");
   }
 
   void emit(std::function<EmitterDestination &()> request_destination) override
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index 5349f805e1d..b395740c6a0 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -4,6 +4,7 @@
 #include <functional>
 
 #include "BLI_array_ref.hpp"
+#include "BLI_small_set_vector.hpp"
 #include "BLI_math.hpp"
 #include "BLI_utildefines.h"
 #include "BLI_string_ref.hpp"
@@ -13,8 +14,12 @@ class Description;
 class Solver;
 class WrappedState;
 class StateBase;
+class Emitter;
+class EmitterInfo;
+class EmitterInfoBuilder;
 
 using BLI::ArrayRef;
+using BLI::SmallSetVector;
 using BLI::SmallVector;
 using BLI::StringRef;
 using BLI::Vec3;
@@ -76,12 +81,80 @@ class EmitterDestination {
   }
 };
 
+class EmitterInfo {
+ private:
+  EmitterInfo()
+  {
+  }
+
+  Emitter *m_emitter;
+  SmallSetVector<std::string> m_used_float_attributes;
+  SmallSetVector<std::string> m_used_vec3_attributes;
+
+  friend EmitterInfoBuilder;
+
+ public:
+  Emitter &emitter()
+  {
+    return *m_emitter;
+  }
+
+  ArrayRef<std::string> used_float_attributes()
+  {
+    return m_used_float_attributes.values();
+  }
+
+  ArrayRef<std::string> used_vec3_attributes()
+  {
+    return m_used_vec3_attributes.values();
+  }
+
+  bool uses_float_attribute(StringRef name)
+  {
+    return m_used_float_attributes.contains(name.to_std_string());
+  }
+
+  bool uses_vec3_attribute(StringRef name)
+  {
+    return m_used_vec3_attributes.contains(name.to_std_string());
+  }
+};
+
+class EmitterInfoBuilder {
+ private:
+  Emitter *m_emitter;
+  SmallSetVector<std::string> m_used_float_attributes;
+  SmallSetVector<std::string> m_used_vec3_attributes;
+
+ public:
+  EmitterInfoBuilder(Emitter *emitter) : m_emitter(emitter)
+  {
+  }
+
+  void inits_float_attribute(StringRef name)
+  {
+    m_used_float_attributes.add(name.to_std_string());
+  }
+  void inits_vec3_attribute(StringRef name)
+  {
+    m_used_vec3_attributes.add(name.to_std_string());
+  }
+
+  EmitterInfo build()
+  {
+    EmitterInfo info;
+    info.m_emitter = m_emitter;
+    info.m_used_float_attributes = m_used_float_attributes;
+    info.m_used_vec3_attributes = m_used_vec3_attributes;
+    return info;
+  }
+};
+
 class Emitter {
  public:
   virtual ~Emitter();
 
-  virtual ArrayRef<std::string> used_float_attributes() = 0;
-  virtual ArrayRef<std::string> used_vec3_attributes() = 0;
+  virtual void info(EmitterInfoBuilder &info) const = 0;
   virtual void emit(std::function<EmitterDestination &()> request_destination) = 0;
 };
 
diff --git a/source/blender/simulations/bparticles/playground_solver.cpp b/source/blender/simulations/bparticles/playground_solver.cpp
index a124d403ed8..366f85bbdb8 100644
--- a/source/blender/simulations/bparticles/playground_solver.cpp
+++ b/source/blender/simulations/bparticles/playground_solver.cpp
@@ -18,10 +18,16 @@ class SimpleSolver : public Solver {
   };
 
   Description &m_description;
+  SmallVector<EmitterInfo> m_emitter_infos;
 
  public:
   SimpleSolver(Description &description) : m_description(description)
   {
+    for (Emitter *emitter : m_description.emitters()) {
+      EmitterInfoBuilder builder{emitter};
+      emitter->info(builder);
+      m_emitter_infos.append(builder.build());
+    }
   }
 
   StateBase *init() override
@@ -29,13 +35,9 @@ class SimpleSolver : public Solver {
     SmallSetVector<std::string> float_attributes = {"Birth Time"};
     SmallSetVector<std::string> vec3_attributes;
 
-    for (Emitter *emitter : m_description.emitters()) {
-      for (auto &name : emitter->used_float_attributes()) {
-        float_attributes.add(name);
-      }
-      for (auto &name : emitter->used_vec3_attributes()) {
-        vec3_attributes.add(name);
-      }
+    for (EmitterInfo &emitter : m_emitter_infos) {
+      float_attributes.add_multiple(emitter.used_float_attributes());
+      vec3_attributes.add_multiple(emitter.used_vec3_attributes());
     }
 
     MyState *state = new MyState();
@@ -87,12 +89,12 @@ class SimpleSolver : public Solver {
 
   void emit_new_particles(MyState &state)
   {
-    for (Emitter *emitter : m_description.emitters()) {
-      this->emit_from_emitter(state, *emitter);
+    for (EmitterInfo &emitter : m_emitter_infos) {
+      this->emit_from_emitter(state, emitter);
     }
   }
 
-  void emit_from_emitter(MyState &state, Emitter &emitter)
+  void emit_from_emitter(MyState &state, EmitterInfo &emitter)
   {
     SmallVector<ParticlesBlockSlice> block_slices;
     SmallVector<EmitterDestination> destinations;
@@ -103,7 +105,7 @@ class SimpleSolver : public Solver {
       return destinations.last();
     };
 
-    emitter.emit(request_destination);
+    emitter.emitter().emit(request_destination);
 
     for (uint i = 0; i < destinations.size(); i++) {
       ParticlesBlockSlice &slice = block_slices[i];
@@ -111,14 +113,14 @@ class SimpleSolver : public Solver {
       ParticlesBlock *block = slice.block();
 
       for (auto &name : state.particles->float_attribute_names()) {
-        if (!emitter.used_float_attributes().contains(name)) {
+        if (!emitter.uses_float_attribute(name)) {
           slice.float_buffer(name)
               .take_front(dst.emitted_amount())
               .fill(state.seconds_since_start);
         }
       }
       for (auto &name : state.particles->vec3_attribute_names()) {
-        if (!emitter.used_vec3_attributes().contains(name)) {
+        if (!emitter.uses_vec3_attribute(name)) {
           slice.vec3_buffer(name).take_front(dst.emitted_amount()).fill(Vec3{0, 0, 0});
         }
       }
diff --git a/tests/gtests/blenlib/BLI_small_set_test.cc b/tests/gtests/blenlib/BLI_small_set_test.cc
index 2d97780c3d9..4118907dde2 100644
--- a/tests/gtests/blenlib/BLI_small_set_test.cc
+++ b/tests/gtests/blenlib/BLI_small_set_test.cc
@@ -138,3 +138,15 @@ TEST(small_set, Disjoint)
   EXPECT_FALSE(IntSet::Intersects(a, b));
   EXPECT_TRUE(IntSet::Disjoint(a, b));
 }
+
+TEST(small_set, AddMultiple)
+{
+  IntSet a;
+  a.add_multiple({5, 7});
+  EXPECT_TRUE(a.contains(5));
+  EXPECT_TRUE(a.contains(7));
+  EXPECT_FALSE(a.contains(4));
+  a.add_multiple({2, 4});
+  EXPECT_TRUE(a.contains(4));
+  EXPECT_TRUE(a.contains(2));
+}



More information about the Bf-blender-cvs mailing list