[Bf-blender-cvs] [7b674cc6849] functions: pass emitter object and rate into mesh emitter node

Jacques Lucke noreply at git.blender.org
Tue Jul 9 18:01:53 CEST 2019


Commit: 7b674cc6849b8e6e92ae6e9371f6815f8e17990c
Author: Jacques Lucke
Date:   Tue Jul 9 16:56:19 2019 +0200
Branches: functions
https://developer.blender.org/rB7b674cc6849b8e6e92ae6e9371f6815f8e17990c

pass emitter object and rate into mesh emitter node

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

M	release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py
M	source/blender/simulations/bparticles/emitters.cpp
M	source/blender/simulations/bparticles/emitters.hpp
M	source/blender/simulations/bparticles/inserters.cpp

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

diff --git a/release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py b/release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py
index 374e38f1771..61dc51d82f5 100644
--- a/release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py
+++ b/release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py
@@ -7,13 +7,7 @@ class MeshEmitterNode(bpy.types.Node, BParticlesNode):
     bl_idname = "bp_MeshEmitterNode"
     bl_label = "Mesh Emitter"
 
-    object: PointerProperty(
-        name="Object",
-        type=bpy.types.Object,
-    )
-
     def declaration(self, builder : SocketBuilder):
+        builder.fixed_input("object", "Object", "Object")
+        builder.fixed_input("rate", "Rate", "Float", default=10)
         builder.emitter_output("emitter", "Emitter")
-
-    def draw(self, layout):
-        layout.prop(self, "object", text="")
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 7e71632cbef..212bb403e59 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -3,6 +3,7 @@
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_curve_types.h"
+#include "DNA_object_types.h"
 
 #include "BKE_curve.h"
 #include "BKE_mesh_runtime.h"
@@ -34,38 +35,57 @@ class PointEmitter : public Emitter {
 class SurfaceEmitter : public Emitter {
  private:
   std::string m_particle_type_name;
-  Mesh *m_mesh;
-  float4x4 m_transform_start;
-  float4x4 m_transform_end;
-  float m_normal_velocity;
+  SharedFunction m_compute_inputs_fn;
+  TupleCallBody *m_compute_inputs_body;
 
  public:
-  SurfaceEmitter(StringRef particle_type_name,
-                 Mesh *mesh,
-                 float4x4 transform_start,
-                 float4x4 transform_end,
-                 float normal_velocity)
+  SurfaceEmitter(StringRef particle_type_name, SharedFunction &compute_inputs)
       : m_particle_type_name(particle_type_name.to_std_string()),
-        m_mesh(mesh),
-        m_transform_start(transform_start),
-        m_transform_end(transform_end),
-        m_normal_velocity(normal_velocity)
+        m_compute_inputs_fn(compute_inputs)
   {
+    m_compute_inputs_body = m_compute_inputs_fn->body<TupleCallBody>();
   }
 
   void emit(EmitterInterface &interface) override
   {
-    MLoop *loops = m_mesh->mloop;
-    MVert *verts = m_mesh->mvert;
-    const MLoopTri *triangles = BKE_mesh_runtime_looptri_ensure(m_mesh);
-    int triangle_amount = BKE_mesh_runtime_looptri_len(m_mesh);
+    FN_TUPLE_CALL_ALLOC_TUPLES(m_compute_inputs_body, fn_in, fn_out);
+
+    FN::ExecutionStack stack;
+    FN::ExecutionContext execution_context(stack);
+
+    m_compute_inputs_body->call(fn_in, fn_out, execution_context);
+    Object *object = fn_out.get<Object *>(0);
+    float rate = fn_out.get<float>(1);
+    float particles_to_emit_f = rate * interface.time_span().duration();
+    float fraction = particles_to_emit_f - std::floor(particles_to_emit_f);
+    if ((rand() % 1000) / 1000.0f < fraction) {
+      particles_to_emit_f = std::floor(particles_to_emit_f) + 1;
+    }
+    uint particles_to_emit = particles_to_emit_f;
+
+    if (object == nullptr) {
+      return;
+    }
+    if (object->type != OB_MESH) {
+      return;
+    }
+
+    Mesh *mesh = (Mesh *)object->data;
+    float4x4 transform_start = object->obmat;
+    float4x4 transform_end = object->obmat;
+    float normal_factor = 1.0f;
+
+    MLoop *loops = mesh->mloop;
+    MVert *verts = mesh->mvert;
+    const MLoopTri *triangles = BKE_mesh_runtime_looptri_ensure(mesh);
+    int triangle_amount = BKE_mesh_runtime_looptri_len(mesh);
 
     SmallVector<float3> positions;
     SmallVector<float3> velocities;
     SmallVector<float> birth_moments;
 
-    for (int i = 0; i < triangle_amount; i++) {
-      MLoopTri triangle = triangles[i];
+    for (uint i = 0; i < particles_to_emit; i++) {
+      MLoopTri triangle = triangles[rand() % triangle_amount];
       float birth_moment = (rand() % 1000) / 1000.0f;
 
       float3 v1 = verts[loops[triangle.tri[0]].v].co;
@@ -79,9 +99,9 @@ class SurfaceEmitter : public Emitter {
       float epsilon = 0.01f;
       /* TODO: interpolate decomposed matrices */
       float4x4 transform_at_birth = float4x4::interpolate(
-          m_transform_start, m_transform_end, birth_moment);
+          transform_start, transform_end, birth_moment);
       float4x4 transform_before_birth = float4x4::interpolate(
-          m_transform_start, m_transform_end, birth_moment - epsilon);
+          transform_start, transform_end, birth_moment - epsilon);
 
       float3 point_at_birth = transform_at_birth.transform_position(pos);
       float3 point_before_birth = transform_before_birth.transform_position(pos);
@@ -90,7 +110,7 @@ class SurfaceEmitter : public Emitter {
       float3 emitter_velocity = (point_at_birth - point_before_birth) / epsilon;
 
       positions.append(point_at_birth);
-      velocities.append(normal_velocity * m_normal_velocity + emitter_velocity * 0.3f);
+      velocities.append(normal_velocity * normal_factor + emitter_velocity * 0.3f);
       birth_moments.append(birth_moment);
     }
 
@@ -120,14 +140,9 @@ Emitter *EMITTER_point(StringRef particle_type_name, float3 point)
   return new PointEmitter(particle_type_name, point);
 }
 
-Emitter *EMITTER_mesh_surface(StringRef particle_type_name,
-                              Mesh *mesh,
-                              const float4x4 &transform_start,
-                              const float4x4 &transform_end,
-                              float normal_velocity)
+Emitter *EMITTER_mesh_surface(StringRef particle_type_name, SharedFunction &compute_inputs_fn)
 {
-  return new SurfaceEmitter(
-      particle_type_name, mesh, transform_start, transform_end, normal_velocity);
+  return new SurfaceEmitter(particle_type_name, compute_inputs_fn);
 }
 
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index 6c933ce0530..4f8aa9a34ce 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "core.hpp"
+#include "FN_tuple_call.hpp"
 
 struct Mesh;
 struct Path;
@@ -8,13 +9,11 @@ struct Path;
 namespace BParticles {
 
 using BLI::float4x4;
+using FN::SharedFunction;
+using FN::TupleCallBody;
 
 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_mesh_surface(StringRef particle_type_name, SharedFunction &compute_inputs_fn);
 
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index aaf0135995d..c3080490ddd 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -213,21 +213,14 @@ static void INSERT_EMITTER_mesh_surface(ProcessNodeInterface &interface)
       continue;
     }
 
-    bNode *type_node = linked.node;
-
-    PointerRNA rna = interface.node_rna();
-
-    Object *object = (Object *)RNA_pointer_get(&rna, "object").id.data;
-    if (object == nullptr) {
-      continue;
-    }
-
-    float4x4 last_transformation = interface.world_state().update(interface.bnode()->name,
-                                                                  object->obmat);
-    float4x4 current_transformation = object->obmat;
+    bSocketList inputs = interface.inputs();
+    SharedFunction fn = create_function(interface.indexed_tree(),
+                                        interface.data_graph(),
+                                        {inputs.get(0), inputs.get(1)},
+                                        interface.bnode()->name);
 
-    Emitter *emitter = EMITTER_mesh_surface(
-        type_node->name, (Mesh *)object->data, last_transformation, current_transformation, 1.0f);
+    bNode *type_node = linked.node;
+    Emitter *emitter = EMITTER_mesh_surface(type_node->name, fn);
     interface.step_description().m_emitters.append(emitter);
   }
 }



More information about the Bf-blender-cvs mailing list