[Bf-blender-cvs] [4ae4d125cd2] functions: simple point emitter node for testing

Jacques Lucke noreply at git.blender.org
Thu Jul 4 16:45:55 CEST 2019


Commit: 4ae4d125cd272ebbb2c89f7ed9f5d535432e64ef
Author: Jacques Lucke
Date:   Thu Jul 4 11:30:49 2019 +0200
Branches: functions
https://developer.blender.org/rB4ae4d125cd272ebbb2c89f7ed9f5d535432e64ef

simple point emitter node for testing

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

A	release/scripts/startup/nodes/bparticle_nodes/point_emitter.py
M	source/blender/simulations/bparticles/c_wrapper.cpp
M	source/blender/simulations/bparticles/emitters.cpp
M	source/blender/simulations/bparticles/emitters.hpp

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

diff --git a/release/scripts/startup/nodes/bparticle_nodes/point_emitter.py b/release/scripts/startup/nodes/bparticle_nodes/point_emitter.py
new file mode 100644
index 00000000000..48ab26faa8b
--- /dev/null
+++ b/release/scripts/startup/nodes/bparticle_nodes/point_emitter.py
@@ -0,0 +1,20 @@
+import bpy
+from bpy.props import *
+from .. base import BParticlesNode
+from .. socket_builder import SocketBuilder
+
+class PointEmitterNode(bpy.types.Node, BParticlesNode):
+    bl_idname = "bp_PointEmitterNode"
+    bl_label = "Point Emitter"
+
+    position: FloatVectorProperty(
+        name="Value",
+        size=3,
+        default=(0.0, 0.0, 0.0),
+    )
+
+    def declaration(self, builder : SocketBuilder):
+        builder.emitter_output("emitter", "Emitter")
+
+    def draw(self, layout):
+        layout.column().prop(self, "position", text="Position")
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 29914a446e8..390b680791a 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -295,10 +295,35 @@ static void INSERT_EMITTER_mesh_surface(bNode *emitter_node,
   }
 }
 
+static void INSERT_EMITTER_point(bNode *emitter_node,
+                                 IndexedBParticlesTree &bparticles_tree,
+                                 SmallVector<Emitter *> &r_emitters)
+{
+  BLI_assert(STREQ(emitter_node->idname, "bp_PointEmitterNode"));
+  bNodeSocket *emitter_output = (bNodeSocket *)emitter_node->outputs.first;
+
+  for (SocketWithNode linked : bparticles_tree.base().linked(emitter_output)) {
+    if (!bparticles_tree.is_particle_type_node(linked.node)) {
+      continue;
+    }
+
+    bNode *type_node = linked.node;
+
+    float3 position;
+    PointerRNA rna;
+    RNA_pointer_create(bparticles_tree.btree_id(), &RNA_Node, emitter_node, &rna);
+    RNA_float_get_array(&rna, "position", position);
+
+    Emitter *emitter = EMITTER_point(type_node->name, position);
+    r_emitters.append(emitter);
+  }
+}
+
 static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree)
 {
   SmallMap<std::string, EmitterInserter> emitter_inserters;
   emitter_inserters.add_new("bp_MeshEmitterNode", INSERT_EMITTER_mesh_surface);
+  emitter_inserters.add_new("bp_PointEmitterNode", INSERT_EMITTER_point);
 
   ModifierStepDescription *step_description = new ModifierStepDescription();
 
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 311f4d12d27..d1c202faddc 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -13,16 +13,18 @@ namespace BParticles {
 
 class PointEmitter : public Emitter {
  private:
+  std::string m_particle_type_name;
   float3 m_point;
 
  public:
-  PointEmitter(float3 point) : m_point(point)
+  PointEmitter(StringRef particle_type_name, float3 point)
+      : m_particle_type_name(particle_type_name.to_std_string()), m_point(point)
   {
   }
 
   void emit(EmitterInterface &interface) override
   {
-    auto &target = interface.request(0, 1);
+    auto &target = interface.request(m_particle_type_name, 1);
     target.set_float3("Position", {m_point});
     target.set_float3("Velocity", {float3{-1, -1, 0}});
     target.set_birth_moment(1.0f);
@@ -102,59 +104,9 @@ class SurfaceEmitter : public Emitter {
   }
 };
 
-class PathEmitter : public Emitter {
- private:
-  Path &m_path;
-  float4x4 m_transform;
-
- public:
-  PathEmitter(Path &path, float4x4 transform) : m_path(path), m_transform(transform)
-  {
-  }
-
-  void emit(EmitterInterface &interface) override
-  {
-    SmallVector<float3> positions;
-    for (uint i = 0; i < m_path.len - 1; i++) {
-      float3 pos1 = m_path.data[i].vec;
-      float3 pos2 = m_path.data[i + 1].vec;
-
-      for (uint j = 0; j < 10; j++) {
-        float factor = (float)j / 100.0f;
-        float3 pos = pos1 * (1.0f - factor) + pos2 * factor;
-        pos = m_transform.transform_position(pos);
-        positions.append(pos);
-      }
-    }
-
-    auto &target = interface.request(0, positions.size());
-    target.set_float3("Position", positions);
-    target.set_float3("Velocity", SmallVector<float3>(positions.size()));
-    target.set_birth_moment(1.0f);
-  }
-};
-
-class EmitAtStartEmitter : public Emitter {
-  void emit(EmitterInterface &interface) override
-  {
-    if (!interface.is_first_step()) {
-      return;
-    }
-
-    SmallVector<float3> positions;
-    for (uint i = 0; i < 1000000; i++) {
-      positions.append(float3(i / 1000.0f, 0, 0));
-    }
-
-    auto &target = interface.request(0, positions.size());
-    target.set_float3("Position", positions);
-    target.set_birth_moment(0.0f);
-  }
-};
-
-Emitter *EMITTER_point(float3 point)
+Emitter *EMITTER_point(StringRef particle_type_name, float3 point)
 {
-  return new PointEmitter(point);
+  return new PointEmitter(particle_type_name, point);
 }
 
 Emitter *EMITTER_mesh_surface(StringRef particle_type_name,
@@ -167,15 +119,4 @@ Emitter *EMITTER_mesh_surface(StringRef particle_type_name,
       particle_type_name, mesh, transform_start, transform_end, normal_velocity);
 }
 
-Emitter *EMITTER_path(Path *path, float4x4 transform)
-{
-  BLI_assert(path);
-  return new PathEmitter(*path, transform);
-}
-
-Emitter *EMITTER_emit_at_start()
-{
-  return new EmitAtStartEmitter();
-}
-
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index 157a8826f63..6c933ce0530 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -9,13 +9,12 @@ namespace BParticles {
 
 using BLI::float4x4;
 
-Emitter *EMITTER_point(float3 point);
+Emitter *EMITTER_point(StringRef particle_type_name, float3 point);
+
 Emitter *EMITTER_mesh_surface(StringRef particle_type_name,
                               struct Mesh *mesh,
                               const float4x4 &transform_start,
                               const float4x4 &transform_end,
                               float normal_velocity);
-Emitter *EMITTER_path(struct Path *path, float4x4 transform);
-Emitter *EMITTER_emit_at_start();
 
 }  // namespace BParticles



More information about the Bf-blender-cvs mailing list