[Bf-blender-cvs] [a561a457dc7] functions: initial Get Position on Surface node

Jacques Lucke noreply at git.blender.org
Sat Nov 30 16:40:16 CET 2019


Commit: a561a457dc7401dce9a8fd3e0176362726d5d2f3
Author: Jacques Lucke
Date:   Sat Nov 30 13:30:34 2019 +0100
Branches: functions
https://developer.blender.org/rBa561a457dc7401dce9a8fd3e0176362726d5d2f3

initial Get Position on Surface node

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

M	release/scripts/startup/nodes/function_nodes/object_mesh.py
M	source/blender/blenkernel/BKE_surface_location.h
M	source/blender/functions/FN_multi_function_common_contexts.h
M	source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
M	source/blender/functions/intern/multi_functions/mixed.cc
M	source/blender/functions/intern/multi_functions/mixed.h
M	source/blender/simulations/bparticles/node_frontend.cpp
M	source/blender/simulations/bparticles/particle_function.cpp
M	source/blender/simulations/bparticles/particle_function.hpp
M	source/blender/simulations/bparticles/particle_function_builder.cpp
M	source/blender/simulations/bparticles/particle_function_builder.hpp

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

diff --git a/release/scripts/startup/nodes/function_nodes/object_mesh.py b/release/scripts/startup/nodes/function_nodes/object_mesh.py
index 367260a7f3c..c4400022b04 100644
--- a/release/scripts/startup/nodes/function_nodes/object_mesh.py
+++ b/release/scripts/startup/nodes/function_nodes/object_mesh.py
@@ -27,3 +27,12 @@ class ClosestLocationOnObjectNode(bpy.types.Node, FunctionNode):
         builder.fixed_input("object", "Object", "Object")
         builder.fixed_input("position", "Position", "Vector")
         builder.fixed_output("closest_point", "Closest Location", "Surface Location")
+
+
+class GetPositionOnSurfaceNode(bpy.types.Node, FunctionNode):
+    bl_idname = "fn_GetPositionOnSurfaceNode"
+    bl_label = "Get Position on Surface"
+
+    def declaration(self, builder):
+        builder.fixed_input("location", "Location", "Surface Location")
+        builder.fixed_output("position", "Position", "Vector")
\ No newline at end of file
diff --git a/source/blender/blenkernel/BKE_surface_location.h b/source/blender/blenkernel/BKE_surface_location.h
index a56087af078..53d69fdf79f 100644
--- a/source/blender/blenkernel/BKE_surface_location.h
+++ b/source/blender/blenkernel/BKE_surface_location.h
@@ -18,28 +18,50 @@ using BLI::float3;
  *
  * For now, only points on triangle meshes are supported, support for curves could be added too.
  */
-struct SurfaceLocation {
+class SurfaceLocation {
+ private:
   /**
    * Identifies the surface that is being referenced. This is usually a hash of the name of an
    * object. The location is invalid, if this id is negative.
    */
-  int32_t surface_id;
+  int32_t m_surface_id;
 
   /* Index of the triangle that contains the referenced location. */
-  uint32_t triangle_index;
+  uint32_t m_triangle_index;
 
   /* Barycentric coordinates of the referenced location inside the triangle. */
-  float3 bary_coords;
+  float3 m_bary_coords;
 
-  SurfaceLocation() : surface_id(-1)
+ public:
+  SurfaceLocation() : m_surface_id(-1)
   {
   }
 
   SurfaceLocation(int32_t surface_id, uint32_t triangle_index, float3 bary_coords)
-      : surface_id(surface_id), triangle_index(triangle_index), bary_coords(bary_coords)
+      : m_surface_id(surface_id), m_triangle_index(triangle_index), m_bary_coords(bary_coords)
   {
   }
 
+  int32_t surface_id() const
+  {
+    return m_surface_id;
+  }
+
+  uint32_t triangle_index() const
+  {
+    return m_triangle_index;
+  }
+
+  float3 bary_coords() const
+  {
+    return m_bary_coords;
+  }
+
+  bool is_valid() const
+  {
+    return m_surface_id >= 0;
+  }
+
   static int32_t ComputeObjectSurfaceID(const Object *ob)
   {
     BLI_assert(ob != nullptr);
diff --git a/source/blender/functions/FN_multi_function_common_contexts.h b/source/blender/functions/FN_multi_function_common_contexts.h
index 8d41e9c888e..963d43b849f 100644
--- a/source/blender/functions/FN_multi_function_common_contexts.h
+++ b/source/blender/functions/FN_multi_function_common_contexts.h
@@ -40,6 +40,22 @@ class ParticleAttributesContext : public MFElementContext {
   }
 };
 
+class PersistentSurfacesLookupContext : public MFElementContext {
+ private:
+  Map<int32_t, Object *> m_object_by_id;
+
+ public:
+  PersistentSurfacesLookupContext(Map<int32_t, Object *> object_by_id)
+      : m_object_by_id(object_by_id)
+  {
+  }
+
+  Object *lookup(int32_t id) const
+  {
+    return m_object_by_id.lookup_default(id, nullptr);
+  }
+};
+
 class ExternalDataCacheContext : public MFElementContext {
  private:
   mutable Map<Object *, BVHTreeFromMesh *> m_bvh_trees;
diff --git a/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc b/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
index 741fbb3ec82..2ff7be8787a 100644
--- a/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
+++ b/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
@@ -60,6 +60,11 @@ static void INSERT_object_mesh_info(VNodeMFNetworkBuilder &builder)
   builder.set_constructed_matching_fn<MF_ObjectVertexPositions>();
 }
 
+static void INSERT_get_position_on_surface(VNodeMFNetworkBuilder &builder)
+{
+  builder.set_constructed_matching_fn<MF_GetPositionOnSurface>();
+}
+
 static void INSERT_switch(VNodeMFNetworkBuilder &builder)
 {
   MFDataType type = builder.data_type_from_property("data_type");
@@ -157,69 +162,60 @@ static void build_variadic_math_fn(VNodeMFNetworkBuilder &builder,
 
 static void INSERT_add_floats(VNodeMFNetworkBuilder &builder)
 {
-  build_variadic_math_fn(
-      builder, +[](float a, float b) -> float { return a + b; }, 0.0f);
+  build_variadic_math_fn(builder, +[](float a, float b) -> float { return a + b; }, 0.0f);
 }
 
 static void INSERT_multiply_floats(VNodeMFNetworkBuilder &builder)
 {
-  build_variadic_math_fn(
-      builder, +[](float a, float b) -> float { return a * b; }, 1.0f);
+  build_variadic_math_fn(builder, +[](float a, float b) -> float { return a * b; }, 1.0f);
 }
 
 static void INSERT_minimum_floats(VNodeMFNetworkBuilder &builder)
 {
-  build_variadic_math_fn(
-      builder, +[](float a, float b) -> float { return std::min(a, b); }, 0.0f);
+  build_variadic_math_fn(builder, +[](float a, float b) -> float { return std::min(a, b); }, 0.0f);
 }
 
 static void INSERT_maximum_floats(VNodeMFNetworkBuilder &builder)
 {
-  build_variadic_math_fn(
-      builder, +[](float a, float b) -> float { return std::max(a, b); }, 0.0f);
+  build_variadic_math_fn(builder, +[](float a, float b) -> float { return std::max(a, b); }, 0.0f);
 }
 
 static void INSERT_subtract_floats(VNodeMFNetworkBuilder &builder)
 {
-  build_math_fn(
-      builder, +[](float a, float b) -> float { return a - b; });
+  build_math_fn(builder, +[](float a, float b) -> float { return a - b; });
 }
 
 static void INSERT_divide_floats(VNodeMFNetworkBuilder &builder)
 {
-  build_math_fn(
-      builder, +[](float a, float b) -> float { return (b != 0.0f) ? a / b : 0.0f; });
+  build_math_fn(builder, +[](float a, float b) -> float { return (b != 0.0f) ? a / b : 0.0f; });
 }
 
 static void INSERT_power_floats(VNodeMFNetworkBuilder &builder)
 {
-  build_math_fn(
-      builder,
-      +[](float a, float b) -> float { return (a >= 0.0f) ? (float)std::pow(a, b) : 0.0f; });
+  build_math_fn(builder, +[](float a, float b) -> float {
+    return (a >= 0.0f) ? (float)std::pow(a, b) : 0.0f;
+  });
 }
 
 static void INSERT_sqrt_float(VNodeMFNetworkBuilder &builder)
 {
-  build_math_fn(
-      builder, +[](float a) -> float { return (a >= 0.0f) ? (float)std::sqrt(a) : 0.0f; });
+  build_math_fn(builder,
+                +[](float a) -> float { return (a >= 0.0f) ? (float)std::sqrt(a) : 0.0f; });
 }
 
 static void INSERT_abs_float(VNodeMFNetworkBuilder &builder)
 {
-  build_math_fn(
-      builder, +[](float a) -> float { return std::abs(a); });
+  build_math_fn(builder, +[](float a) -> float { return std::abs(a); });
 }
 
 static void INSERT_sine_float(VNodeMFNetworkBuilder &builder)
 {
-  build_math_fn(
-      builder, +[](float a) -> float { return std::sin(a); });
+  build_math_fn(builder, +[](float a) -> float { return std::sin(a); });
 }
 
 static void INSERT_cosine_float(VNodeMFNetworkBuilder &builder)
 {
-  build_math_fn(
-      builder, +[](float a) -> float { return std::cos(a); });
+  build_math_fn(builder, +[](float a) -> float { return std::cos(a); });
 }
 
 static void INSERT_add_vectors(VNodeMFNetworkBuilder &builder)
@@ -234,8 +230,7 @@ static void INSERT_multiply_vectors(VNodeMFNetworkBuilder &builder)
 
 static void INSERT_subtract_vectors(VNodeMFNetworkBuilder &builder)
 {
-  build_math_fn(
-      builder, +[](float3 a, float3 b) -> float3 { return a - b; });
+  build_math_fn(builder, +[](float3 a, float3 b) -> float3 { return a - b; });
 }
 
 static void INSERT_divide_vectors(VNodeMFNetworkBuilder &builder)
@@ -250,8 +245,7 @@ static void INSERT_vector_cross_product(VNodeMFNetworkBuilder &builder)
 
 static void INSERT_reflect_vector(VNodeMFNetworkBuilder &builder)
 {
-  build_math_fn(
-      builder, +[](float3 a, float3 b) { return a.reflected(b.normalized()); });
+  build_math_fn(builder, +[](float3 a, float3 b) { return a.reflected(b.normalized()); });
 }
 
 static void INSERT_project_vector(VNodeMFNetworkBuilder &builder)
@@ -271,26 +265,22 @@ static void INSERT_vector_distance(VNodeMFNetworkBuilder &builder)
 
 static void INSERT_boolean_and(VNodeMFNetworkBuilder &builder)
 {
-  build_variadic_math_fn(
-      builder, +[](bool a, bool b) { return a && b; }, true);
+  build_variadic_math_fn(builder, +[](bool a, bool b) { return a && b; }, true);
 }
 
 static void INSERT_boolean_or(VNodeMFNetworkBuilder &builder)
 {
-  build_variadic_math_fn(
-      builder, +[](bool a, bool b) { return a || b; }, false);
+  build_variadic_math_fn(builder, +[](bool a, bool b) { return a || b; }, false);
 }
 
 static void INSERT_boolean_not(VNodeMFNetworkBuilder &builder)
 {
-  build_math_fn(
-      builder, +[](bool a) -> bool { return !a; });
+  build_math_fn(builder, +[](bool a) -> bool { return !a; });
 }
 
 static void INSERT_compare(VNodeMFNetworkBuilder &builder)
 {
-  build_math_fn(
-      builder, +[](float a, float b) -> bool { return a < b; });
+  build_math_fn(builder, +[](float a, float b) -> bool { return a < b; });
 }
 
 static void INSERT_perlin_noise(VNodeMFNetworkBuilder &builder)
@@ -362,6 +352,7 @@ void add_inlined_tree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
   mappings.xnode_inserters.add_new("fn_GetListElementNode", INSERT_get_list_element);
   mappings.xnode_inserters.add_new("fn_ObjectTransformsNode", INSERT_object_location);
   mappings.xnode_inserters.add_new("fn_ObjectMeshNode", INSERT_object_mesh_info);
+  mappings.xnode_inserters.add_new("fn_GetPositionOnSurfaceNode", INSERT_get_position_on_surface);
   mappings.xnode_inserters.add_new("fn_TextLengthNode", INSERT_text_length);
   mappings.xnode_inserters.add_new("fn_VertexInfoNode", INSERT_vertex_info);
   mappings.xnode_inserters.add_new("fn_FloatRangeNode", INSERT_float_range);
diff --git a/source/blender/functions/intern/multi_functions/mixed.cc b/source/blender/functions/intern/multi_functions/mixed.cc
index 21a064f4f03..b2d4

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list