[Bf-blender-cvs] [d979cd2690d] functions: use Surface Info node instead of Collision Info

Jacques Lucke noreply at git.blender.org
Wed Sep 4 19:43:32 CEST 2019


Commit: d979cd2690d1790ec8e622ea0a26db41b25b6e17
Author: Jacques Lucke
Date:   Wed Sep 4 14:23:00 2019 +0200
Branches: functions
https://developer.blender.org/rBd979cd2690d1790ec8e622ea0a26db41b25b6e17

use Surface Info node instead of Collision Info

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

M	release/scripts/startup/nodes/bparticle_nodes/particle_inputs.py
M	source/blender/simulations/bparticles/action_contexts.hpp
M	source/blender/simulations/bparticles/emitters.cpp
M	source/blender/simulations/bparticles/particle_function_builder.cpp
M	source/blender/simulations/bparticles/particle_function_input_providers.cpp
M	source/blender/simulations/bparticles/particle_function_input_providers.hpp

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

diff --git a/release/scripts/startup/nodes/bparticle_nodes/particle_inputs.py b/release/scripts/startup/nodes/bparticle_nodes/particle_inputs.py
index f403d3166bd..8042524c0d1 100644
--- a/release/scripts/startup/nodes/bparticle_nodes/particle_inputs.py
+++ b/release/scripts/startup/nodes/bparticle_nodes/particle_inputs.py
@@ -16,12 +16,13 @@ class ParticleInfoNode(bpy.types.Node, BParticlesNode):
         builder.fixed_output("age", "Age", "Float")
 
 
-class CollisionInfoNode(bpy.types.Node, BParticlesNode):
-    bl_idname = "bp_CollisionInfoNode"
-    bl_label = "Collision Info"
+class SurfaceInfoNode(bpy.types.Node, BParticlesNode):
+    bl_idname = "bp_SurfaceInfoNode"
+    bl_label = "Surface Info"
 
     def declaration(self, builder: NodeBuilder):
         builder.fixed_output("normal", "Normal", "Vector")
+        builder.fixed_output("velocity", "Velocity", "Vector")
 
 
 class SurfaceImageNode(bpy.types.Node, BParticlesNode):
diff --git a/source/blender/simulations/bparticles/action_contexts.hpp b/source/blender/simulations/bparticles/action_contexts.hpp
index d0d60153d77..aad23a431c9 100644
--- a/source/blender/simulations/bparticles/action_contexts.hpp
+++ b/source/blender/simulations/bparticles/action_contexts.hpp
@@ -18,7 +18,7 @@ class MeshSurfaceContext : public ActionContext {
   ArrayRef<float3> m_local_normals;
   ArrayRef<float3> m_world_normals;
   ArrayRef<uint> m_looptri_indices;
-  ArrayRef<float3> m_surface_velocities;
+  ArrayRef<float3> m_world_surface_velocities;
 
  public:
   MeshSurfaceContext(Object *object,
@@ -27,14 +27,14 @@ class MeshSurfaceContext : public ActionContext {
                      ArrayRef<float3> local_normals,
                      ArrayRef<float3> world_normals,
                      ArrayRef<uint> looptri_indices,
-                     ArrayRef<float3> surface_velocities)
+                     ArrayRef<float3> world_surface_velocities)
       : m_object(object),
         m_world_transforms(world_transforms),
         m_local_positions(local_positions),
         m_local_normals(local_normals),
         m_world_normals(world_normals),
         m_looptri_indices(looptri_indices),
-        m_surface_velocities(surface_velocities)
+        m_world_surface_velocities(world_surface_velocities)
   {
   }
 
@@ -63,7 +63,7 @@ class MeshSurfaceContext : public ActionContext {
 
     m_world_transforms = ArrayRef<float4x4>(world_transforms_buffer, size);
     m_world_normals = ArrayRef<float3>(world_normals_buffer, size);
-    m_surface_velocities = ArrayRef<float3>(surface_velocities_buffer, size);
+    m_world_surface_velocities = ArrayRef<float3>(surface_velocities_buffer, size);
 
     m_buffers_to_free.extend(
         {world_transforms_buffer, world_normals_buffer, surface_velocities_buffer});
@@ -109,9 +109,9 @@ class MeshSurfaceContext : public ActionContext {
     return m_looptri_indices;
   }
 
-  ArrayRef<float3> surface_velicities() const
+  ArrayRef<float3> world_surface_velicities() const
   {
-    return m_surface_velocities;
+    return m_world_surface_velocities;
   }
 };
 
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 5a06461b8f3..49702438bdd 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -303,7 +303,8 @@ void SurfaceEmitter::emit(EmitterInterface &interface)
   for (uint i = 0; i < particles_to_emit; i++) {
     float3 position_before_birth = transforms_before_birth[i].transform_position(
         local_positions[i]);
-    surface_velocities[i] = (positions_at_birth[i] - position_before_birth) / epsilon;
+    surface_velocities[i] = (positions_at_birth[i] - position_before_birth) / epsilon /
+                            interface.time_span().duration();
   }
 
   TemporaryArray<float3> world_normals(particles_to_emit);
diff --git a/source/blender/simulations/bparticles/particle_function_builder.cpp b/source/blender/simulations/bparticles/particle_function_builder.cpp
index eeae31356b5..85fe8c004ee 100644
--- a/source/blender/simulations/bparticles/particle_function_builder.cpp
+++ b/source/blender/simulations/bparticles/particle_function_builder.cpp
@@ -83,10 +83,19 @@ static ParticleFunctionInputProvider *INPUT_particle_info(VTreeDataGraph &vtree_
   }
 }
 
-static ParticleFunctionInputProvider *INPUT_collision_info(
-    VTreeDataGraph &UNUSED(vtree_data_graph), VirtualSocket *UNUSED(vsocket))
+static ParticleFunctionInputProvider *INPUT_surface_info(VTreeDataGraph &UNUSED(vtree_data_graph),
+                                                         VirtualSocket *vsocket)
 {
-  return new CollisionNormalInputProvider();
+  if (STREQ(vsocket->name(), "Normal")) {
+    return new SurfaceNormalInputProvider();
+  }
+  else if (STREQ(vsocket->name(), "Velocity")) {
+    return new SurfaceVelocityInputProvider();
+  }
+  else {
+    BLI_assert(false);
+    return nullptr;
+  }
 }
 
 static ParticleFunctionInputProvider *INPUT_surface_image(VTreeDataGraph &UNUSED(vtree_data_graph),
@@ -111,7 +120,7 @@ BLI_LAZY_INIT_STATIC(StringMap<BuildInputProvider>, get_input_providers_map)
 {
   StringMap<BuildInputProvider> map;
   map.add_new("bp_ParticleInfoNode", INPUT_particle_info);
-  map.add_new("bp_CollisionInfoNode", INPUT_collision_info);
+  map.add_new("bp_SurfaceInfoNode", INPUT_surface_info);
   map.add_new("bp_SurfaceImageNode", INPUT_surface_image);
   map.add_new("bp_SurfaceWeightNode", INPUT_surface_weight);
   return map;
diff --git a/source/blender/simulations/bparticles/particle_function_input_providers.cpp b/source/blender/simulations/bparticles/particle_function_input_providers.cpp
index be9a0a56b74..9e95b13b5f0 100644
--- a/source/blender/simulations/bparticles/particle_function_input_providers.cpp
+++ b/source/blender/simulations/bparticles/particle_function_input_providers.cpp
@@ -30,7 +30,7 @@ Optional<ParticleFunctionInputArray> AttributeInputProvider::get(InputProviderIn
   }
 }
 
-Optional<ParticleFunctionInputArray> CollisionNormalInputProvider::get(
+Optional<ParticleFunctionInputArray> SurfaceNormalInputProvider::get(
     InputProviderInterface &interface)
 {
   ActionContext *action_context = interface.action_context();
@@ -42,6 +42,18 @@ Optional<ParticleFunctionInputArray> CollisionNormalInputProvider::get(
   return ParticleFunctionInputArray(surface_info->world_normals(), false);
 }
 
+Optional<ParticleFunctionInputArray> SurfaceVelocityInputProvider::get(
+    InputProviderInterface &interface)
+{
+  ActionContext *action_context = interface.action_context();
+  auto *surface_info = dynamic_cast<MeshSurfaceContext *>(action_context);
+  if (surface_info == nullptr) {
+    return {};
+  }
+
+  return ParticleFunctionInputArray(surface_info->world_surface_velicities(), false);
+}
+
 Optional<ParticleFunctionInputArray> AgeInputProvider::get(InputProviderInterface &interface)
 {
   auto birth_times = interface.attributes().get<float>("Birth Time");
diff --git a/source/blender/simulations/bparticles/particle_function_input_providers.hpp b/source/blender/simulations/bparticles/particle_function_input_providers.hpp
index 7c301d085d7..f8f1dff775b 100644
--- a/source/blender/simulations/bparticles/particle_function_input_providers.hpp
+++ b/source/blender/simulations/bparticles/particle_function_input_providers.hpp
@@ -20,7 +20,11 @@ class AttributeInputProvider : public ParticleFunctionInputProvider {
   Optional<ParticleFunctionInputArray> get(InputProviderInterface &interface) override;
 };
 
-class CollisionNormalInputProvider : public ParticleFunctionInputProvider {
+class SurfaceNormalInputProvider : public ParticleFunctionInputProvider {
+  Optional<ParticleFunctionInputArray> get(InputProviderInterface &interface) override;
+};
+
+class SurfaceVelocityInputProvider : public ParticleFunctionInputProvider {
   Optional<ParticleFunctionInputArray> get(InputProviderInterface &interface) override;
 };



More information about the Bf-blender-cvs mailing list