[Bf-blender-cvs] [b0104641510] functions: simple point emitter

Jacques Lucke noreply at git.blender.org
Mon Jun 17 15:52:41 CEST 2019


Commit: b01046415103b2d8195607ddda8fd6e77d09bacf
Author: Jacques Lucke
Date:   Mon Jun 17 10:59:04 2019 +0200
Branches: functions
https://developer.blender.org/rBb01046415103b2d8195607ddda8fd6e77d09bacf

simple point emitter

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

M	source/blender/simulations/CMakeLists.txt
M	source/blender/simulations/bparticles/c_wrapper.cpp
M	source/blender/simulations/bparticles/core.hpp
A	source/blender/simulations/bparticles/emitter.cpp
A	source/blender/simulations/bparticles/emitter.hpp
M	source/blender/simulations/bparticles/particles_container.hpp

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

diff --git a/source/blender/simulations/CMakeLists.txt b/source/blender/simulations/CMakeLists.txt
index d7e5e1b1d26..5dd72a125fc 100644
--- a/source/blender/simulations/CMakeLists.txt
+++ b/source/blender/simulations/CMakeLists.txt
@@ -21,6 +21,8 @@ set(SRC
   bparticles/particles_container.cpp
   bparticles/playground_solver.hpp
   bparticles/playground_solver.cpp
+  bparticles/emitter.hpp
+  bparticles/emitter.cpp
   bparticles/c_wrapper.cpp
 )
 
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index c15974b55c6..2efbb585040 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -2,6 +2,7 @@
 #include "core.hpp"
 #include "particles_container.hpp"
 #include "playground_solver.hpp"
+#include "emitter.hpp"
 #include "BLI_noise.h"
 
 #define WRAPPERS(T1, T2) \
@@ -77,7 +78,7 @@ class TestEmitter : public BParticles::Emitter {
     builder.inits_float3_attribute("Velocity");
   }
 
-  void emit(std::function<EmitterBuffers &()> request_buffers) override
+  void emit(BParticles::RequestEmitterBufferCB request_buffers) override
   {
     EmitterBuffers &dst = request_buffers();
     BLI_assert(dst.size() > 0);
@@ -95,8 +96,10 @@ class TestEmitter : public BParticles::Emitter {
 
 BParticlesDescription BParticles_playground_description(float control1, float control2)
 {
+  auto emitter = BParticles::new_point_emitter({4, 4, 4});
+
   Description *description = new Description(
-      {new TestForce(control1), new TurbulenceForce(control2)}, {new TestEmitter()});
+      {new TestForce(control1), new TurbulenceForce(control2)}, {emitter.release()});
   return wrap(description);
 }
 void BParticles_description_free(BParticlesDescription description_c)
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index d923140d19a..057090a2d9b 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -159,12 +159,14 @@ class EmitterInfoBuilder {
   }
 };
 
+using RequestEmitterBufferCB = std::function<EmitterBuffers &()>;
+
 class Emitter {
  public:
   virtual ~Emitter();
 
   virtual void info(EmitterInfoBuilder &info) const = 0;
-  virtual void emit(std::function<EmitterBuffers &()> request_buffers) = 0;
+  virtual void emit(RequestEmitterBufferCB request_buffers) = 0;
 };
 
 class Description {
diff --git a/source/blender/simulations/bparticles/emitter.cpp b/source/blender/simulations/bparticles/emitter.cpp
new file mode 100644
index 00000000000..b9eef730d53
--- /dev/null
+++ b/source/blender/simulations/bparticles/emitter.cpp
@@ -0,0 +1,40 @@
+#include "emitter.hpp"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+namespace BParticles {
+
+class PointEmitter : public Emitter {
+ private:
+  float3 m_point;
+
+ public:
+  PointEmitter(float3 point) : m_point(point)
+  {
+  }
+
+  void info(EmitterInfoBuilder &builder) const override
+  {
+    builder.inits_float3_attribute("Position");
+    builder.inits_float3_attribute("Velocity");
+  }
+
+  void emit(RequestEmitterBufferCB request_buffers) override
+  {
+    auto &buffer = request_buffers();
+    auto positions = buffer.buffers().get_float3("Position");
+    auto velocities = buffer.buffers().get_float3("Velocity");
+
+    positions[0] = m_point;
+    velocities[0] = float3{-1, -1, 0};
+    buffer.set_initialized(1);
+  }
+};
+
+std::unique_ptr<Emitter> new_point_emitter(float3 point)
+{
+  Emitter *emitter = new PointEmitter(point);
+  return std::unique_ptr<Emitter>(emitter);
+}
+
+}  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/emitter.hpp b/source/blender/simulations/bparticles/emitter.hpp
new file mode 100644
index 00000000000..8496c905192
--- /dev/null
+++ b/source/blender/simulations/bparticles/emitter.hpp
@@ -0,0 +1,8 @@
+#pragma once
+
+#include "core.hpp"
+
+namespace BParticles {
+
+std::unique_ptr<Emitter> new_point_emitter(float3 point);
+}
diff --git a/source/blender/simulations/bparticles/particles_container.hpp b/source/blender/simulations/bparticles/particles_container.hpp
index 2f9e0668e84..bfddbecad00 100644
--- a/source/blender/simulations/bparticles/particles_container.hpp
+++ b/source/blender/simulations/bparticles/particles_container.hpp
@@ -257,6 +257,9 @@ inline void ParticlesBlock::move(uint old_index, uint new_index)
   for (float3 *buffer : m_vec3_buffers) {
     buffer[new_index] = buffer[old_index];
   }
+  for (uint8_t *buffer : m_byte_buffers) {
+    buffer[new_index] = buffer[old_index];
+  }
 }
 
 /* Particles Block Slice



More information about the Bf-blender-cvs mailing list