[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