Commit: cfafdde927788607057acfec8d2ebe5e29a68575
Author: Jacques Lucke
Date:   Sun Mar 10 18:10:53 2019 +0100
Branches: functions
https://developer.blender.org/rBcfafdde927788607057acfec8d2ebe5e29a68575

use function to generate a list of floats

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

M       source/blender/blenlib/BLI_shared.hpp
M       source/blender/functions/FN-C.h
M       source/blender/functions/c_wrapper.cpp
M       
source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
M       source/blender/functions/types/lists.hpp
M       source/blender/modifiers/intern/MOD_displace.c
M       source/blender/modifiers/intern/MOD_functiondeform.c
M       source/blender/modifiers/intern/MOD_functionpoints.c

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

diff --git a/source/blender/blenlib/BLI_shared.hpp 
b/source/blender/blenlib/BLI_shared.hpp
index 029494aa385..8317536a3ba 100644
--- a/source/blender/blenlib/BLI_shared.hpp
+++ b/source/blender/blenlib/BLI_shared.hpp
@@ -129,6 +129,13 @@ namespace BLI {
                        return m_object;
                }
 
+               T *move_ptr()
+               {
+                       T *value = m_object;
+                       m_object = nullptr;
+                       return value;
+               }
+
                T *operator->() const
                {
                        return this->ptr();
diff --git a/source/blender/functions/FN-C.h b/source/blender/functions/FN-C.h
index 2eb950eec03..c8d7a3a2805 100644
--- a/source/blender/functions/FN-C.h
+++ b/source/blender/functions/FN-C.h
@@ -11,12 +11,10 @@ extern "C" {
 
 void FN_initialize(void);
 
+/************** Core *************/
+
 typedef struct OpaqueFnFunction *FnFunction;
 typedef struct OpaqueFnType *FnType;
-typedef struct OpaqueFnTuple *FnTuple;
-typedef struct OpaqueFnTupleCallBody *FnTupleCallBody;
-
-/************** Core *************/
 
 void FN_function_free(FnFunction fn);
 
@@ -31,6 +29,8 @@ void FN_function_print(FnFunction fn);
 
 /************** Types *************/
 
+typedef struct OpaqueFnFloatList *FnFloatList;
+
 const char *FN_type_name(FnType type);
 void FN_type_free(FnType type);
 
@@ -44,9 +44,16 @@ FnType FN_type_borrow_int32(void);
 FnType FN_type_borrow_fvec3(void);
 FnType FN_type_borrow_float_list(void);
 
+uint FN_list_size_float(FnFloatList list);
+float *FN_list_data_float(FnFloatList list);
+void FN_list_free_float(FnFloatList list);
+
 
 /*************** Tuple Call ****************/
 
+typedef struct OpaqueFnTuple *FnTuple;
+typedef struct OpaqueFnTupleCallBody *FnTupleCallBody;
+
 FnTupleCallBody FN_tuple_call_get(FnFunction fn);
 void FN_tuple_call_invoke(FnTupleCallBody body, FnTuple fn_in, FnTuple fn_out);
 FnTuple FN_tuple_for_input(FnTupleCallBody body);
@@ -56,10 +63,11 @@ void FN_tuple_free(FnTuple tuple);
 
 void FN_tuple_set_float(FnTuple tuple, uint index, float value);
 void FN_tuple_set_int32(FnTuple tuple, uint index, int32_t value);
-void FN_tuple_set_float_vector_3(FnTuple tuple, uint index, float vector[3]);
+void FN_tuple_set_fvec3(FnTuple tuple, uint index, float vector[3]);
 float FN_tuple_get_float(FnTuple tuple, uint index);
 int32_t FN_tuple_get_int32(FnTuple tuple, uint index);
-void FN_tuple_get_float_vector_3(FnTuple tuple, uint index, float dst[3]);
+void FN_tuple_get_fvec3(FnTuple tuple, uint index, float dst[3]);
+FnFloatList FN_tuple_relocate_out_float_list(FnTuple tuple, uint index);
 
 uint fn_tuple_stack_prepare_size(FnTupleCallBody body);
 void fn_tuple_prepare_stack(
@@ -87,6 +95,7 @@ void fn_tuple_destruct(FnTuple tuple);
        FN_tuple_free(fn_in); \
        FN_tuple_free(fn_out);
 
+
 /*************** Dependencies ****************/
 
 struct DepsNodeHandle;
diff --git a/source/blender/functions/c_wrapper.cpp 
b/source/blender/functions/c_wrapper.cpp
index ba37dfd9481..1e2cf523c32 100644
--- a/source/blender/functions/c_wrapper.cpp
+++ b/source/blender/functions/c_wrapper.cpp
@@ -20,6 +20,7 @@ WRAPPERS(Function *, FnFunction);
 WRAPPERS(Type *, FnType);
 WRAPPERS(Tuple *, FnTuple);
 WRAPPERS(TupleCallBody *, FnTupleCallBody);
+WRAPPERS(List<float> *, FnFloatList);
 
 static void playground()
 {
@@ -196,16 +197,22 @@ int32_t FN_tuple_get_int32(FnTuple tuple, uint index)
 
 using Types::Vector;
 
-void FN_tuple_set_float_vector_3(FnTuple tuple, uint index, float value[3])
+void FN_tuple_set_fvec3(FnTuple tuple, uint index, float value[3])
 {
        unwrap(tuple)->set<Vector>(index, *(Vector *)value);
 }
 
-void FN_tuple_get_float_vector_3(FnTuple tuple, uint index, float dst[3])
+void FN_tuple_get_fvec3(FnTuple tuple, uint index, float dst[3])
 {
        *(Vector *)dst = unwrap(tuple)->get<Vector>(index);
 }
 
+FnFloatList FN_tuple_relocate_out_float_list(FnTuple tuple, uint index)
+{
+       auto list = unwrap(tuple)->relocate_out<SharedFloatList>(index);
+       return wrap(list.move_ptr());
+}
+
 const char *FN_type_name(FnType type)
 {
        return unwrap(type)->name().c_str();
@@ -234,6 +241,23 @@ SIMPLE_TYPE_GETTER(int32);
 SIMPLE_TYPE_GETTER(fvec3);
 SIMPLE_TYPE_GETTER(float_list);
 
+
+uint FN_list_size_float(FnFloatList list)
+{
+       return unwrap(list)->size();
+}
+
+float *FN_list_data_float(FnFloatList list)
+{
+       return unwrap(list)->data_ptr();
+}
+
+void FN_list_free_float(FnFloatList list)
+{
+       unwrap(list)->remove_user();
+}
+
+
 FnFunction FN_tree_to_function(bNodeTree *btree)
 {
        TIMEIT("Tree to function");
diff --git 
a/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp 
b/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
index 45f289ae3a7..3937312261e 100644
--- a/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
@@ -16,6 +16,7 @@ namespace FN { namespace DataFlowNodes {
                }
 
                FunctionGraph fgraph = fgraph_.value();
+               // fgraph.graph()->to_dot__clipboard();
 
                auto fn = SharedFunction::New(btree->id.name, 
fgraph.signature());
                fgraph_add_DependenciesBody(fn, fgraph);
diff --git a/source/blender/functions/types/lists.hpp 
b/source/blender/functions/types/lists.hpp
index dee4610ab01..ab419a2f21b 100644
--- a/source/blender/functions/types/lists.hpp
+++ b/source/blender/functions/types/lists.hpp
@@ -15,11 +15,23 @@ namespace FN { namespace Types {
        private:
                SmallVector<T> m_data;
 
-               ~List() {}
+               static constexpr bool DEBUG_ALLOCATIONS = true;
+
+               ~List()
+               {
+                       if (DEBUG_ALLOCATIONS) {
+                               std::cout << "List Freed" << std::endl;
+                       }
+               }
 
        public:
                List()
-                       : BLI::SharedImmutable() {}
+                       : BLI::SharedImmutable()
+               {
+                       if (DEBUG_ALLOCATIONS) {
+                               std::cout << "List Allocated" << std::endl;
+                       }
+               }
 
                void append(T value)
                {
@@ -37,6 +49,11 @@ namespace FN { namespace Types {
                        return new_list;
                }
 
+               T *data_ptr() const
+               {
+                       return m_data.begin();
+               }
+
                uint size() const
                {
                        return m_data.size();
diff --git a/source/blender/modifiers/intern/MOD_displace.c 
b/source/blender/modifiers/intern/MOD_displace.c
index f472f5c8d85..8be69fe787d 100644
--- a/source/blender/modifiers/intern/MOD_displace.c
+++ b/source/blender/modifiers/intern/MOD_displace.c
@@ -227,7 +227,7 @@ static void displaceModifier_do_task(
 
                FN_TUPLE_CALL_PREPARE_STACK(body, fn_in, fn_out);
 
-               FN_tuple_set_float_vector_3(fn_in, 0, vertexCos[iter]);
+               FN_tuple_set_fvec3(fn_in, 0, vertexCos[iter]);
                FN_tuple_set_int32(fn_in, 1, iter);
 
                FN_tuple_call_invoke(body, fn_in, fn_out);
diff --git a/source/blender/modifiers/intern/MOD_functiondeform.c 
b/source/blender/modifiers/intern/MOD_functiondeform.c
index db43d712408..550e3602b2e 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform.c
+++ b/source/blender/modifiers/intern/MOD_functiondeform.c
@@ -87,13 +87,13 @@ static void do_deformation(
        int seed = fdmd->control2 * 234132;
 
        for (int i = 0; i < numVerts; i++) {
-               FN_tuple_set_float_vector_3(fn_in, 0, vertexCos[i]);
+               FN_tuple_set_fvec3(fn_in, 0, vertexCos[i]);
                FN_tuple_set_int32(fn_in, 1, seed + i);
                FN_tuple_set_float(fn_in, 2, fdmd->control1);
 
                FN_tuple_call_invoke(body, fn_in, fn_out);
 
-               FN_tuple_get_float_vector_3(fn_out, 0, vertexCos[i]);
+               FN_tuple_get_fvec3(fn_out, 0, vertexCos[i]);
        }
 
        clock_t end = clock();
diff --git a/source/blender/modifiers/intern/MOD_functionpoints.c 
b/source/blender/modifiers/intern/MOD_functionpoints.c
index b049c06ad53..0c3db37d1c7 100644
--- a/source/blender/modifiers/intern/MOD_functionpoints.c
+++ b/source/blender/modifiers/intern/MOD_functionpoints.c
@@ -58,11 +58,9 @@ static FnFunction 
get_current_function(FunctionPointsModifierData *fpmd)
 
        FnType float_ty = FN_type_borrow_float();
        FnType int32_ty = FN_type_borrow_int32();
-       FnType fvec3_ty = FN_type_borrow_fvec3();
-
     FnType float_list_ty = FN_type_borrow_float_list();
 
-       FnType inputs[] = { int32_ty, NULL };
+       FnType inputs[] = { float_ty, int32_ty, NULL };
        FnType outputs[] = { float_list_ty, NULL };
 
        return FN_function_get_with_signature(tree, inputs, outputs);
@@ -70,18 +68,43 @@ static FnFunction 
get_current_function(FunctionPointsModifierData *fpmd)
 
 static Mesh *build_point_mesh(FunctionPointsModifierData *fpmd)
 {
-       Mesh *mesh = BKE_mesh_new_nomain(2, 0, 0, 0, 0);
-       float vec1[] = {4, 6, 3};
-       float vec2[] = {1, 2, 3};
-       copy_v3_v3(mesh->mvert + 0, vec1);
-       copy_v3_v3(mesh->mvert + 1, vec2);
+       FnFunction fn = get_current_function(fpmd);
+       if (fn == NULL) {
+               modifier_setError(&fpmd->modifier, "Invalid function");
+               return BKE_mesh_new_nomain(0, 0, 0, 0, 0);
+       }
+
+       FnTupleCallBody body = FN_tuple_call_get(fn);
+
+       FN_TUPLE_CALL_PREPARE_STACK(body, fn_in, fn_out);
+
+       FN_tuple_set_float(fn_in, 0, fpmd->control1);
+       FN_tuple_set_int32(fn_in, 1, fpmd->control2);
+       FN_tuple_call_invoke(body, fn_in, fn_out);
+       FnFloatList list = FN_tuple_relocate_out_float_list(fn_out, 0);
+
+       FN_TUPLE_CALL_DESTRUCT_STACK(body, fn_in, fn_out);
+
+
+       FN_function_free(fn);
+
+       uint amount = FN_list_size_float(list);
+       float *ptr = FN_list_data_float(list);
+
+       Mesh *mesh = BKE_mesh_new_nomain(amount, 0, 0, 0, 0);
+       for (uint i = 0; i < amount; i++) {
+               float vec[3] = {0, 0, ptr[i]};
+               copy_v3_v3(mesh->mvert[i].co, vec);
+       }
+       FN_list_free_float(list);
+
        return mesh;
 }
 
 static Mesh *applyModifier(
         ModifierData *md,
-        const struct ModifierEvalContext *ctx,
-        struct Mesh *mesh)
+        const struct ModifierEvalContext *UNUSED(ctx),
+        struct Mesh *UNUSED(mesh))
 {
        return build_point_mesh((FunctionPointsModifierData *)md);
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to