[Bf-blender-cvs] [9f1165c] object_nodes: New opaque type 'DUPLIS' for storing a dupli list.
Lukas Tönne
noreply at git.blender.org
Wed Dec 23 12:47:36 CET 2015
Commit: 9f1165c8aa5a83be6b0651838a513f56be38566a
Author: Lukas Tönne
Date: Tue Dec 22 13:30:17 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB9f1165c8aa5a83be6b0651838a513f56be38566a
New opaque type 'DUPLIS' for storing a dupli list.
This works just like the MESH type, but wraps a ListBase instead of
a DerivedMesh. Using this type the duplis can be generated internally
and returned as a result.
All such data types should be handled in a generalized way eventually.
===================================================================
M source/blender/blenvm/BVM_types.h
M source/blender/blenvm/bvm/bvm_eval.cc
M source/blender/blenvm/bvm/bvm_eval_common.h
M source/blender/blenvm/bvm/bvm_opcode.h
M source/blender/blenvm/compile/bvm_codegen.cc
M source/blender/blenvm/compile/bvm_nodegraph.cc
M source/blender/blenvm/util/bvm_util_typedesc.h
M source/blender/makesrna/intern/rna_blenvm.c
===================================================================
diff --git a/source/blender/blenvm/BVM_types.h b/source/blender/blenvm/BVM_types.h
index 1291c71..cdafc5a 100644
--- a/source/blender/blenvm/BVM_types.h
+++ b/source/blender/blenvm/BVM_types.h
@@ -45,6 +45,7 @@ typedef enum BVMType {
BVM_STRING,
BVM_POINTER,
BVM_MESH,
+ BVM_DUPLIS,
} BVMType;
typedef enum BVMBufferType {
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index da7d2a9..2c31475 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -140,6 +140,15 @@ static void eval_op_value_mesh(float *stack, StackIndex offset)
stack_store_mesh(stack, offset, CDDM_new(0, 0, 0, 0, 0));
}
+/* Note: dupli data is not explicitly stored on the stack,
+ * this function always creates simply an empty dupli list.
+ */
+static void eval_op_value_duplis(float *stack, StackIndex offset)
+{
+ static ListBase lb = {0};
+ stack_store_duplis(stack, offset, &lb);
+}
+
static void eval_op_float_to_int(float *stack, StackIndex offset_from, StackIndex offset_to)
{
float f = stack_load_float(stack, offset_from);
@@ -198,6 +207,20 @@ static void eval_op_release_mesh_ptr(float *stack, StackIndex offset)
stack_store_mesh_ptr(stack, offset, p);
}
+static void eval_op_init_duplis_ptr(float *stack, StackIndex offset, int use_count)
+{
+ duplis_ptr p(NULL);
+ p.set_use_count(use_count);
+ stack_store_duplis_ptr(stack, offset, p);
+}
+
+static void eval_op_release_duplis_ptr(float *stack, StackIndex offset)
+{
+ duplis_ptr p = stack_load_duplis_ptr(stack, offset);
+ p.decrement_use_count();
+ stack_store_duplis_ptr(stack, offset, p);
+}
+
static void eval_op_mix_rgb(float *stack, int mode, StackIndex offset_col_a, StackIndex offset_col_b, StackIndex offset_fac, StackIndex offset_r)
{
float4 a = stack_load_float4(stack, offset_col_a);
@@ -340,6 +363,11 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const Function *
eval_op_value_mesh(stack, offset);
break;
}
+ case OP_VALUE_DUPLIS: {
+ StackIndex offset = fn->read_stack_index(&instr);
+ eval_op_value_duplis(stack, offset);
+ break;
+ }
case OP_FLOAT_TO_INT: {
StackIndex offset_from = fn->read_stack_index(&instr);
StackIndex offset_to = fn->read_stack_index(&instr);
@@ -394,6 +422,17 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const Function *
eval_op_release_mesh_ptr(stack, offset);
break;
}
+ case OP_INIT_DUPLIS_PTR: {
+ StackIndex offset = fn->read_stack_index(&instr);
+ int use_count = fn->read_int(&instr);
+ eval_op_init_duplis_ptr(stack, offset, use_count);
+ break;
+ }
+ case OP_RELEASE_DUPLIS_PTR: {
+ StackIndex offset = fn->read_stack_index(&instr);
+ eval_op_release_duplis_ptr(stack, offset);
+ break;
+ }
case OP_ADD_FLOAT: {
StackIndex offset_a = fn->read_stack_index(&instr);
StackIndex offset_b = fn->read_stack_index(&instr);
diff --git a/source/blender/blenvm/bvm/bvm_eval_common.h b/source/blender/blenvm/bvm/bvm_eval_common.h
index 03d6c63..c0ea48f 100644
--- a/source/blender/blenvm/bvm/bvm_eval_common.h
+++ b/source/blender/blenvm/bvm/bvm_eval_common.h
@@ -69,6 +69,11 @@ inline static matrix44 stack_load_matrix44(float *stack, StackIndex offset)
return *(matrix44 *)(&stack[offset]);
}
+inline static const char *stack_load_string(float *stack, StackIndex offset)
+{
+ return *(const char **)(&stack[offset]);
+}
+
inline static PointerRNA stack_load_pointer(float *stack, StackIndex offset)
{
return *(PointerRNA *)(&stack[offset]);
@@ -84,11 +89,18 @@ inline static DerivedMesh *stack_load_mesh(float *stack, StackIndex offset)
return ((mesh_ptr *)(&stack[offset]))->get();
}
-inline static const char *stack_load_string(float *stack, StackIndex offset)
+inline static duplis_ptr stack_load_duplis_ptr(float *stack, StackIndex offset)
{
- return *(const char **)(&stack[offset]);
+ return *(duplis_ptr *)(&stack[offset]);
}
+inline static ListBase *stack_load_duplis(float *stack, StackIndex offset)
+{
+ return ((duplis_ptr *)(&stack[offset]))->get();
+}
+
+/* ------------------------------------------------------------------------- */
+
inline static void stack_store_float(float *stack, StackIndex offset, float f)
{
*(float *)(&stack[offset]) = f;
@@ -114,6 +126,11 @@ inline static void stack_store_matrix44(float *stack, StackIndex offset, matrix4
*(matrix44 *)(&stack[offset]) = m;
}
+inline static void stack_store_string(float *stack, StackIndex offset, const char *s)
+{
+ *(const char **)(&stack[offset]) = s;
+}
+
inline static void stack_store_pointer(float *stack, StackIndex offset, PointerRNA p)
{
*(PointerRNA *)(&stack[offset]) = p;
@@ -129,9 +146,14 @@ inline static void stack_store_mesh(float *stack, StackIndex offset, DerivedMesh
((mesh_ptr *)(&stack[offset]))->set(dm);
}
-inline static void stack_store_string(float *stack, StackIndex offset, const char *s)
+inline static void stack_store_duplis_ptr(float *stack, StackIndex offset, duplis_ptr p)
{
- *(const char **)(&stack[offset]) = s;
+ *(duplis_ptr *)(&stack[offset]) = p;
+}
+
+inline static void stack_store_duplis(float *stack, StackIndex offset, ListBase *lb)
+{
+ ((duplis_ptr *)(&stack[offset]))->set(lb);
}
} /* namespace bvm */
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h b/source/blender/blenvm/bvm/bvm_opcode.h
index 33042ea..fc65540 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -44,6 +44,7 @@ enum OpCode {
OP_VALUE_STRING,
OP_VALUE_POINTER,
OP_VALUE_MESH,
+ OP_VALUE_DUPLIS,
OP_FLOAT_TO_INT,
OP_INT_TO_FLOAT,
@@ -62,6 +63,8 @@ enum OpCode {
OP_INIT_MESH_PTR,
OP_RELEASE_MESH_PTR,
+ OP_INIT_DUPLIS_PTR,
+ OP_RELEASE_DUPLIS_PTR,
OP_ADD_FLOAT,
OP_SUB_FLOAT,
diff --git a/source/blender/blenvm/compile/bvm_codegen.cc b/source/blender/blenvm/compile/bvm_codegen.cc
index 1855370..7c18b0e 100644
--- a/source/blender/blenvm/compile/bvm_codegen.cc
+++ b/source/blender/blenvm/compile/bvm_codegen.cc
@@ -349,6 +349,10 @@ void BVMCompiler::push_constant(const Value *value) const
/* MESH type can not be stored as a constant */
break;
}
+ case BVM_DUPLIS: {
+ /* DUPLIS type can not be stored as a constant */
+ break;
+ }
}
}
@@ -420,6 +424,11 @@ void BVMCompiler::codegen_value(const Value *value, StackIndex offset) const
push_stack_index(offset);
break;
}
+ case BVM_DUPLIS: {
+ push_opcode(OP_VALUE_DUPLIS);
+ push_stack_index(offset);
+ break;
+ }
}
}
@@ -437,6 +446,8 @@ static OpCode ptr_init_opcode(const TypeDesc &typedesc)
case BVM_MESH:
return OP_INIT_MESH_PTR;
+ case BVM_DUPLIS:
+ return OP_INIT_DUPLIS_PTR;
}
return OP_NOOP;
}
@@ -455,6 +466,8 @@ static OpCode ptr_release_opcode(const TypeDesc &typedesc)
case BVM_MESH:
return OP_RELEASE_MESH_PTR;
+ case BVM_DUPLIS:
+ return OP_RELEASE_DUPLIS_PTR;
}
return OP_NOOP;
}
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index ae0b9ca..3df64f2 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -605,6 +605,7 @@ SocketPair NodeGraph::add_proxy(const TypeDesc &typedesc, Value *default_value)
case BVM_STRING: node = add_node("PASS_STRING"); break;
case BVM_POINTER: node = add_node("PASS_POINTER"); break;
case BVM_MESH: node = add_node("PASS_MESH"); break;
+ case BVM_DUPLIS: node = add_node("PASS_DUPLIS"); break;
}
break;
case BVM_BUFFER_ARRAY:
@@ -617,6 +618,7 @@ SocketPair NodeGraph::add_proxy(const TypeDesc &typedesc, Value *default_value)
case BVM_STRING: node = add_node("PASS_STRING_ARRAY"); break;
case BVM_POINTER: node = add_node("PASS_POINTER_ARRAY"); break;
case BVM_MESH: node = add_node("PASS_MESH_ARRAY"); break;
+ case BVM_DUPLIS: node = add_node("PASS_DUPLIS_ARRAY"); break;
}
break;
}
@@ -637,6 +639,7 @@ SocketPair NodeGraph::add_value_node(Value *value)
case BVM_STRING: node = add_node("VALUE_STRING"); break;
case BVM_POINTER: node = add_node("VALUE_POINTER"); break;
case BVM_MESH: node = add_node("VALUE_MESH"); break;
+ case BVM_DUPLIS: node = add_node("VALUE_DUPLIS"); break;
}
if (node)
node->set_input_value("value", value);
@@ -655,6 +658,7 @@ SocketPair NodeGraph::add_argument_node(const TypeDesc &typedesc)
case BVM_STRING: node = add_node("ARG_STRING"); break;
case BVM_POINTER: node = add_node("ARG_POINTER"); break;
case BVM_MESH: node = add_node("ARG_MESH"); break;
+ case BVM_DUPLIS: node = add_node("ARG_DUPLIS"); break;
}
return SocketPair(node, "value");
}
@@ -794,6 +798,7 @@ OpCode get_opcode_from_node_type(const string &node)
NODETYPE(VALUE_STRING);
NODETYPE(VALUE_POINTER);
NODETYPE(VALUE_MESH);
+ NODETYPE(VALUE_DUPLIS);
NODETYPE(FLOAT_TO_INT);
NODETYPE(INT_TO_FLOAT);
@@ -885,6 +890,8 @@ OpCode get_opcode_from_node_type(const string &node)
}
static mesh_ptr __empty_mesh__;
+static ListBase __empty_listbase__ = {0};
+static duplis_ptr __empty_duplis__ = duplis_ptr(&__empty_listbase__);
static void register_opcode_node_types()
{
@@ -930,6 +937,10 @@ static void register_opcode_node_types()
nt->add_input("value", TYPE_MESH, __empty_mesh__);
nt->add_output("value", TYPE_MESH);
+ nt = NodeGraph::add_pass_node_type("PASS_DUPLIS");
+ nt->add_input("value", TYPE_MESH, __empty_duplis__);
+ nt->add_output("value", TYPE_MESH);
+
nt = NodeGraph::add_pass_node_type("PASS_FLOAT_ARRAY");
nt->add_input("value", TYPE_FLOAT_ARRAY, array<BVM_FLOAT>());
nt->add_output("value", TYPE_FLOAT_ARRAY);
@@ -962,6 +973,10 @@ static void register_opcode_node_types()
nt->add_input("value", TYPE_MESH_ARRAY, array<BVM_MESH>());
nt->add_output("value", TYPE_MESH_ARRAY);
+ nt = NodeGraph::add_pass_node_type("PASS_DUPLIS_ARRAY");
+ nt->add_input("value", TYPE_DUPLIS_ARRAY, array<BVM_DUPLIS>());
+ nt->add_output("value", TYPE_DUPLIS_ARRAY);
+
nt = NodeGraph::add_function_node_type("ARG_FLOAT");
nt->add_output("value", TYPE_FLOAT);
@@ -986,6 +1001,9 @@ static void register_opcode_node_types()
nt = NodeGraph::add_function_node_typ
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list