[Bf-blender-cvs] [aa6d621] object_nodes: New modifier node for generic vertex displacement.

Lukas Tönne noreply at git.blender.org
Wed Dec 9 14:52:51 CET 2015


Commit: aa6d62132da8b3a9d6a49c3d083bcf200f3fc290
Author: Lukas Tönne
Date:   Wed Dec 9 14:52:31 2015 +0100
Branches: object_nodes
https://developer.blender.org/rBaa6d62132da8b3a9d6a49c3d083bcf200f3fc290

New modifier node for generic vertex displacement.

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

M	release/scripts/nodes/geometry_nodes.py
M	source/blender/blenvm/bvm/bvm_eval.cc
M	source/blender/blenvm/bvm/bvm_eval_mesh.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/intern/bvm_api.cc

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

diff --git a/release/scripts/nodes/geometry_nodes.py b/release/scripts/nodes/geometry_nodes.py
index 4c9e342..fe910dd 100644
--- a/release/scripts/nodes/geometry_nodes.py
+++ b/release/scripts/nodes/geometry_nodes.py
@@ -70,6 +70,20 @@ class GeometryOutputNode(GeometryNodeBase, ObjectNode):
         compiler.map_input(0, compiler.graph_output("mesh"))
 
 
+class GeometryElementInfoNode(GeometryNodeBase, ObjectNode):
+    '''Properties of the current geometry element'''
+    bl_idname = 'GeometryElementInfoNode'
+    bl_label = 'Element Info'
+
+    def init(self, context):
+        self.outputs.new('NodeSocketInt', "Index")
+        self.outputs.new('NodeSocketVector', "Location")
+
+    def compile(self, compiler):
+        compiler.map_output(0, compiler.graph_input("element.index"))
+        compiler.map_output(1, compiler.graph_input("element.location"))
+
+
 class GeometryMeshLoadNode(GeometryNodeBase, ObjectNode):
     '''Mesh object data'''
     bl_idname = 'GeometryMeshLoadNode'
@@ -185,6 +199,23 @@ class GeometryMeshArrayNode(GeometryNodeBase, ObjectNode):
         compiler.map_input(2, node.inputs["transform"])
         compiler.map_output(0, node.outputs["mesh_out"])
 
+
+class GeometryMeshDisplaceNode(GeometryNodeBase, ObjectNode):
+    '''Add an offset vector to each vertex location'''
+    bl_idname = 'GeometryMeshDisplaceNode'
+    bl_label = 'Displace'
+
+    def init(self, context):
+        self.inputs.new('GeometrySocket', "")
+        self.inputs.new('NodeSocketVector', "Vector")
+        self.outputs.new('GeometrySocket', "")
+
+    def compile(self, compiler):
+        node = compiler.add_node("MESH_DISPLACE")
+        compiler.map_input(0, node.inputs["mesh_in"])
+        compiler.map_input(1, node.inputs["vector"])
+        compiler.map_output(0, node.outputs["mesh_out"])
+
 ###############################################################################
 
 class GeometryNodesNew(Operator):
@@ -211,6 +242,7 @@ def register():
             NodeItem("ObjectIterationNode"),
             NodeItem("GeometryMeshLoadNode"),
             NodeItem(ginput.bl_idname),
+            NodeItem("GeometryElementInfoNode"),
             ]),
         GeometryNodeCategory("GEO_OUTPUT", "Output", items=[
             NodeItem("GeometryOutputNode"),
@@ -218,6 +250,7 @@ def register():
             ]),
         GeometryNodeCategory("GEO_MODIFIER", "Modifier", items=[
             NodeItem("GeometryMeshArrayNode"),
+            NodeItem("GeometryMeshDisplaceNode"),
             ]),
         GeometryNodeCategory("GEO_CONVERTER", "Converter", items=[
             NodeItem("ObjectSeparateVectorNode"),
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index 13b7890..9787110 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -743,6 +743,18 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const Function *
 				                   fn_transform, offset_transform, offset_iteration);
 				break;
 			}
+			case OP_MESH_DISPLACE: {
+				StackIndex offset_mesh_in = fn->read_stack_index(&instr);
+				int fn_vector = fn->read_jump_address(&instr);
+				StackIndex offset_vector = fn->read_stack_index(&instr);
+				StackIndex offset_mesh_out = fn->read_stack_index(&instr);
+				StackIndex offset_elem_index = fn->read_stack_index(&instr);
+				StackIndex offset_elem_loc = fn->read_stack_index(&instr);
+				eval_op_mesh_displace(globals, &kd, stack,
+				                      offset_mesh_in, offset_mesh_out, fn_vector, offset_vector,
+				                      offset_elem_index, offset_elem_loc);
+				break;
+			}
 			case OP_END:
 				return;
 			default:
diff --git a/source/blender/blenvm/bvm/bvm_eval_mesh.h b/source/blender/blenvm/bvm/bvm_eval_mesh.h
index 4b0cc07..099a448 100644
--- a/source/blender/blenvm/bvm/bvm_eval_mesh.h
+++ b/source/blender/blenvm/bvm/bvm_eval_mesh.h
@@ -274,6 +274,48 @@ static void eval_op_mesh_array(const EvalGlobals *globals, const EvalKernelData
 	stack_store_mesh(stack, offset_mesh_out, result);
 }
 
+static DerivedMesh *do_displace(const EvalGlobals *globals, const EvalKernelData *kernel_data, float *stack,
+                        DerivedMesh *dm, int fn_vector, StackIndex offset_vector,
+                        StackIndex offset_elem_index, StackIndex offset_elem_loc)
+{
+	const bool use_recalc_normals = (dm->dirty & DM_DIRTY_NORMALS);
+	
+	DerivedMesh *result = CDDM_copy(dm);
+	MVert *orig_mv, *orig_mverts = dm->getVertArray(dm);
+	MVert *mv, *mverts = result->getVertArray(result);
+	int i, numverts = result->getNumVerts(result);
+	
+	for (i = 0, mv = mverts, orig_mv = orig_mverts; i < numverts; ++i, ++mv, ++orig_mv) {
+		stack_store_int(stack, offset_elem_index, i);
+		stack_store_float3(stack, offset_elem_loc, float3::from_data(orig_mv->co));
+		
+		kernel_data->context->eval_expression(globals, kernel_data->function, fn_vector, stack);
+		float3 dco = stack_load_float3(stack, offset_vector);
+		
+		add_v3_v3v3(mv->co, orig_mv->co, dco.data());
+	}
+	
+	if (use_recalc_normals) {
+		result->dirty = (DMDirtyFlag)(result->dirty | (int)DM_DIRTY_NORMALS);
+	}
+	
+	return result;
+}
+
+static void eval_op_mesh_displace(const EvalGlobals *globals, const EvalKernelData *kernel_data, float *stack,
+                                  StackIndex offset_mesh_in, StackIndex offset_mesh_out,
+                                  int fn_vector, StackIndex offset_vector,
+                                  StackIndex offset_elem_index, StackIndex offset_elem_loc)
+{
+	DerivedMesh *dm = stack_load_mesh(stack, offset_mesh_in);
+	
+	DerivedMesh *result = do_displace(globals, kernel_data, stack,
+	                                  dm, fn_vector, offset_vector,
+	                                  offset_elem_index, offset_elem_loc);
+	
+	stack_store_mesh(stack, offset_mesh_out, result);
+}
+
 } /* namespace bvm */
 
 #endif /* __BVM_EVAL_MESH_H__ */
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h b/source/blender/blenvm/bvm/bvm_opcode.h
index cb88b1f..3d4996c 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -126,6 +126,7 @@ enum OpCode {
 	OP_MESH_LOAD,
 	OP_MESH_COMBINE,
 	OP_MESH_ARRAY,
+	OP_MESH_DISPLACE,
 	
 	OP_END,
 	
diff --git a/source/blender/blenvm/compile/bvm_codegen.cc b/source/blender/blenvm/compile/bvm_codegen.cc
index 95af262..66a6c58 100644
--- a/source/blender/blenvm/compile/bvm_codegen.cc
+++ b/source/blender/blenvm/compile/bvm_codegen.cc
@@ -106,6 +106,7 @@ void BVMCompiler::resolve_function_symbols(const NodeGraph &graph, BVMCompiler::
 			if (output->value_type == OUTPUT_LOCAL) {
 				const NodeGraph::Input *graph_input = graph.get_input(output->name);
 				
+				assert(graph_input);
 				if (graph_input->key.node) {
 					local_input_index[graph_input->key] = stack_index;
 				}
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index 298fef2..4089c39 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -1143,6 +1143,7 @@ OpCode get_opcode_from_node_type(const string &node)
 	NODETYPE(MESH_LOAD);
 	NODETYPE(MESH_COMBINE);
 	NODETYPE(MESH_ARRAY);
+	NODETYPE(MESH_DISPLACE);
 	
 	#undef NODETYPE
 	
@@ -1409,6 +1410,13 @@ static void register_opcode_node_types()
 	nt->add_output("mesh_out", BVM_MESH);
 	nt->add_output("iteration", BVM_INT, OUTPUT_LOCAL);
 	
+	nt = NodeGraph::add_kernel_node_type("MESH_DISPLACE");
+	nt->add_input("mesh_in", BVM_MESH, __empty_mesh__);
+	nt->add_input("vector", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f), INPUT_FUNCTION);
+	nt->add_output("mesh_out", BVM_MESH);
+	nt->add_output("element.index", BVM_FLOAT3, OUTPUT_LOCAL);
+	nt->add_output("element.location", BVM_FLOAT3, OUTPUT_LOCAL);
+	
 	nt = NodeGraph::add_function_node_type("ADD_MATRIX44");
 	nt->add_input("value_a", BVM_MATRIX44, matrix44::identity());
 	nt->add_input("value_b", BVM_MATRIX44, matrix44::identity());
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index 3ab70c3..f341edb 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -936,6 +936,8 @@ struct BVMFunction *BVM_gen_modifier_function(const struct BVMEvalGlobals *globa
 	
 	NodeGraph graph;
 	graph.add_input("iteration", BVM_INT);
+	graph.add_input("element.index", BVM_INT);
+	graph.add_input("element.location", BVM_FLOAT3);
 	graph.add_input("modifier.base_mesh", BVM_POINTER);
 	graph.add_output("mesh", BVM_MESH, __empty_mesh__);
 	
@@ -962,8 +964,10 @@ struct DerivedMesh *BVM_eval_modifier(struct BVMEvalContext *ctx, struct BVMFunc
 	PointerRNA base_mesh_ptr;
 	RNA_id_pointer_create((ID *)base_mesh, &base_mesh_ptr);
 	int iteration = 0;
+	int elem_index = 0;
+	float3 elem_loc(0.0f, 0.0f, 0.0f);
 	mesh_ptr result;
-	const void *args[] = { &iteration, &base_mesh_ptr };
+	const void *args[] = { &iteration, &elem_index, &elem_loc, &base_mesh_ptr };
 	void *results[] = { &result };
 	
 	_CTX(ctx)->eval_function(&globals, _FUNC(fn), args, results);




More information about the Bf-blender-cvs mailing list