[Bf-blender-cvs] [e0554f7f312] functions-experimental-refactor: access time from node tree

Jacques Lucke noreply at git.blender.org
Tue Nov 5 15:54:57 CET 2019


Commit: e0554f7f312805d0db221c5b4f6fe1a09d5ad31d
Author: Jacques Lucke
Date:   Tue Nov 5 11:48:29 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rBe0554f7f312805d0db221c5b4f6fe1a09d5ad31d

access time from node tree

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

A	release/scripts/startup/nodes/function_nodes/time.py
M	source/blender/blenlib/BLI_array_ref.h
M	source/blender/functions2/FN_multi_function_common_context_ids.h
M	source/blender/functions2/FN_multi_function_context.h
M	source/blender/functions2/intern/multi_functions/mixed.cc
M	source/blender/functions2/intern/multi_functions/mixed.h
M	source/blender/functions2/intern/vtree_multi_function_network/mappings_nodes.cc
M	source/blender/modifiers/intern/MOD_functiondeform.c
M	source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
M	source/blender/modifiers/intern/MOD_functionpoints.c
M	source/blender/modifiers/intern/MOD_functionpoints_cxx.cc

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

diff --git a/release/scripts/startup/nodes/function_nodes/time.py b/release/scripts/startup/nodes/function_nodes/time.py
new file mode 100644
index 00000000000..596d0c4d7c9
--- /dev/null
+++ b/release/scripts/startup/nodes/function_nodes/time.py
@@ -0,0 +1,10 @@
+import bpy
+from .. node_builder import NodeBuilder
+from .. base import FunctionNode
+
+class TimeInfoNode(bpy.types.Node, FunctionNode):
+    bl_idname = "fn_TimeInfoNode"
+    bl_label = "Time Info"
+
+    def declaration(self, builder: NodeBuilder):
+        builder.fixed_output("frame", "Frame", "Float")
diff --git a/source/blender/blenlib/BLI_array_ref.h b/source/blender/blenlib/BLI_array_ref.h
index 741d27c0fe9..b5ca2032474 100644
--- a/source/blender/blenlib/BLI_array_ref.h
+++ b/source/blender/blenlib/BLI_array_ref.h
@@ -279,14 +279,20 @@ template<typename T> class ArrayRef {
   }
 
   uint first_index(const T &search_value) const
+  {
+    int index = this->first_index_try(search_value);
+    BLI_assert(index >= 0);
+    return (uint)index;
+  }
+
+  int first_index_try(const T &search_value) const
   {
     for (uint i = 0; i < m_size; i++) {
       if (m_start[i] == search_value) {
         return i;
       }
     }
-    BLI_assert(false);
-    return 0;
+    return -1;
   }
 
   /**
diff --git a/source/blender/functions2/FN_multi_function_common_context_ids.h b/source/blender/functions2/FN_multi_function_common_context_ids.h
index c98659d0815..05ede273586 100644
--- a/source/blender/functions2/FN_multi_function_common_context_ids.h
+++ b/source/blender/functions2/FN_multi_function_common_context_ids.h
@@ -16,6 +16,7 @@ namespace FN {
 namespace ContextIDs {
 
 DEFINE_UNIQUE_CONTEXT_ID(vertex_locations);
+DEFINE_UNIQUE_CONTEXT_ID(current_frame);
 
 }  // namespace ContextIDs
 }  // namespace FN
diff --git a/source/blender/functions2/FN_multi_function_context.h b/source/blender/functions2/FN_multi_function_context.h
index 700ec58bc9c..1084f8f29f6 100644
--- a/source/blender/functions2/FN_multi_function_context.h
+++ b/source/blender/functions2/FN_multi_function_context.h
@@ -38,7 +38,7 @@ class MFContext : BLI::NonCopyable, BLI::NonMovable {
 
   Optional<ElementContext> try_find_context(const void *context_type_id) const
   {
-    int index = m_context_ids.first_index(context_type_id);
+    int index = m_context_ids.first_index_try(context_type_id);
     if (index >= 0) {
       return ElementContext{m_context_data[index], m_context_indices[index]};
     }
@@ -67,6 +67,14 @@ class MFContextBuilder {
     m_context_indices.append(indices);
   }
 
+  void add(const void *id, const void *data)
+  {
+    static uint dummy_index = 0;
+    m_context_ids.append(id);
+    m_context_data.append(data);
+    m_context_indices.append(VirtualListRef<uint>::FromSingle(&dummy_index, INT_MAX));
+  }
+
   MFContext &build()
   {
     m_context.~MFContext();
diff --git a/source/blender/functions2/intern/multi_functions/mixed.cc b/source/blender/functions2/intern/multi_functions/mixed.cc
index f9032fdebf8..75e149a9b62 100644
--- a/source/blender/functions2/intern/multi_functions/mixed.cc
+++ b/source/blender/functions2/intern/multi_functions/mixed.cc
@@ -352,12 +352,27 @@ void MF_ContextVertexPosition::call(const MFMask &mask, MFParams &params, MFCont
   else {
     positions.fill_indices(mask.indices(), {0, 0, 0});
   }
+}
 
-  // ArrayRef<float3> context_positions = context.vertex_positions;
+MF_ContextCurrentFrame::MF_ContextCurrentFrame()
+{
+  MFSignatureBuilder signature("Current Frame");
+  signature.single_output<float>("Frame");
+  this->set_signature(signature);
+}
 
-  // for (uint i : mask.indices()) {
-  //   positions[i] = context_positions[i];
-  // }
+void MF_ContextCurrentFrame::call(const MFMask &mask, MFParams &params, MFContext &context) const
+{
+  MutableArrayRef<float> frames = params.single_output<float>(0, "Frame");
+  auto context_data = context.try_find_context(ContextIDs::current_frame);
+
+  if (context_data.has_value()) {
+    float current_frame = *(float *)context_data.value().data;
+    frames.fill_indices(mask.indices(), current_frame);
+  }
+  else {
+    frames.fill_indices(mask.indices(), 0.0f);
+  }
 }
 
 }  // namespace FN
diff --git a/source/blender/functions2/intern/multi_functions/mixed.h b/source/blender/functions2/intern/multi_functions/mixed.h
index d6d3d0c5af6..d618ef3b34c 100644
--- a/source/blender/functions2/intern/multi_functions/mixed.h
+++ b/source/blender/functions2/intern/multi_functions/mixed.h
@@ -118,4 +118,10 @@ class MF_ContextVertexPosition final : public MultiFunction {
   void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
+class MF_ContextCurrentFrame final : public MultiFunction {
+ public:
+  MF_ContextCurrentFrame();
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
+};
+
 }  // namespace FN
diff --git a/source/blender/functions2/intern/vtree_multi_function_network/mappings_nodes.cc b/source/blender/functions2/intern/vtree_multi_function_network/mappings_nodes.cc
index 0aa2bcc5351..ebd5f31331d 100644
--- a/source/blender/functions2/intern/vtree_multi_function_network/mappings_nodes.cc
+++ b/source/blender/functions2/intern/vtree_multi_function_network/mappings_nodes.cc
@@ -143,6 +143,12 @@ static void INSERT_float_range(VTreeMFNetworkBuilder &builder, const VNode &vnod
   builder.add_function(fn, {0, 1, 2}, {3}, vnode);
 }
 
+static void INSERT_time_info(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+  const MultiFunction &fn = builder.allocate_function<FN::MF_ContextCurrentFrame>();
+  builder.add_function(fn, {}, {0}, vnode);
+}
+
 void add_vtree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
 {
   mappings.vnode_inserters.add_new("fn_FloatMathNode", INSERT_float_math);
@@ -156,6 +162,7 @@ void add_vtree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
   mappings.vnode_inserters.add_new("fn_TextLengthNode", INSERT_text_length);
   mappings.vnode_inserters.add_new("fn_VertexInfoNode", INSERT_vertex_info);
   mappings.vnode_inserters.add_new("fn_FloatRangeNode", INSERT_float_range);
+  mappings.vnode_inserters.add_new("fn_TimeInfoNode", INSERT_time_info);
 }
 
 };  // namespace FN
diff --git a/source/blender/modifiers/intern/MOD_functiondeform.c b/source/blender/modifiers/intern/MOD_functiondeform.c
index 3ee0a96ed2c..d969b7f47f6 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform.c
+++ b/source/blender/modifiers/intern/MOD_functiondeform.c
@@ -51,25 +51,28 @@
 #include "DEG_depsgraph_query.h"
 #include "time.h"
 
-void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[3], int numVerts);
+void MOD_functiondeform_do(FunctionDeformModifierData *fdmd,
+                           float (*vertexCos)[3],
+                           int numVerts,
+                           const ModifierEvalContext *ctx);
 
 static void deformVerts(ModifierData *md,
-                        const ModifierEvalContext *UNUSED(ctx),
+                        const ModifierEvalContext *ctx,
                         Mesh *UNUSED(mesh),
                         float (*vertexCos)[3],
                         int numVerts)
 {
-  MOD_functiondeform_do((FunctionDeformModifierData *)md, vertexCos, numVerts);
+  MOD_functiondeform_do((FunctionDeformModifierData *)md, vertexCos, numVerts, ctx);
 }
 
 static void deformVertsEM(ModifierData *md,
-                          const ModifierEvalContext *UNUSED(ctx),
+                          const ModifierEvalContext *ctx,
                           struct BMEditMesh *UNUSED(em),
                           Mesh *UNUSED(mesh),
                           float (*vertexCos)[3],
                           int numVerts)
 {
-  MOD_functiondeform_do((FunctionDeformModifierData *)md, vertexCos, numVerts);
+  MOD_functiondeform_do((FunctionDeformModifierData *)md, vertexCos, numVerts, ctx);
 }
 
 static void initData(ModifierData *md)
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index e848e53d948..64e0e502559 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -6,6 +6,8 @@
 
 #include "BLI_math_cxx.h"
 
+#include "BKE_modifier.h"
+
 #include "DEG_depsgraph_query.h"
 
 using BKE::VirtualNodeTree;
@@ -22,10 +24,16 @@ using FN::MFOutputSocket;
 using FN::MFParamsBuilder;
 
 extern "C" {
-void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[3], int numVerts);
+void MOD_functiondeform_do(FunctionDeformModifierData *fdmd,
+                           float (*vertexCos)[3],
+                           int numVerts,
+                           const ModifierEvalContext *ctx);
 }
 
-void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[3], int numVerts)
+void MOD_functiondeform_do(FunctionDeformModifierData *fdmd,
+                           float (*vertexCos)[3],
+                           int numVerts,
+                           const ModifierEvalContext *ctx)
 {
   if (fdmd->function_tree == nullptr) {
     return;
@@ -50,11 +58,14 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
 
   ArrayRef<float3> input_vertex_locations = ArrayRef<float3>((float3 *)vertexCos, numVerts);
 
+  float current_time = DEG_get_ctime(ctx->depsgraph);
+
   MFContextBuilder context_builder;
   context_builder.add(
       FN::ContextIDs::vertex_locations,
       (void *)&input_vertex_locations,
       BLI::VirtualListRef<uint>::FromFullArray(IndexRange(numVerts).as_array_ref()));
+  context_builder.add(FN::ContextIDs::current_frame, (void *)&current_time);
 
   function->call(IndexRange(numVerts).as_array_ref(), params.build(), context_builder.build());
 
diff --git a/source/blender/modifiers/intern/MOD_functionpoints.c b/source/blender/modifiers/intern/MOD_functionpoints.c
index 1de9acc60f6..aea034c137a 100644
--- a/source/blender/modifiers/intern/MOD_functionpoints.c
+++ b/source/blender/modifiers/intern/MOD_functionpoints.c
@@ -51,13 +51,14 @@
 #include "DEG_depsgraph_query.h"
 #include "time.h"
 
-Mesh *MOD_functionpoints_do(FunctionPointsModifierData *fpmd);
+M

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list