[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 ¶ms, 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 ¶ms, 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 ¶ms, MFContext &context) const override;
};
+class MF_ContextCurrentFrame final : public MultiFunction {
+ public:
+ MF_ContextCurrentFrame();
+ void call(const MFMask &mask, MFParams ¶ms, 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 *)¤t_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