[Bf-blender-cvs] [48ee73d] object_nodes: Simple node for concatenating 2 meshes into one.

Lukas Tönne noreply at git.blender.org
Wed Dec 2 17:41:46 CET 2015


Commit: 48ee73d5005c9f8fe770f7e4efc8ef967c668907
Author: Lukas Tönne
Date:   Wed Dec 2 17:41:12 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB48ee73d5005c9f8fe770f7e4efc8ef967c668907

Simple node for concatenating 2 meshes into one.

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

M	release/scripts/startup/bl_operators/object_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_nodegraph.cc

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

diff --git a/release/scripts/startup/bl_operators/object_nodes.py b/release/scripts/startup/bl_operators/object_nodes.py
index 688bc47..ab496a2 100644
--- a/release/scripts/startup/bl_operators/object_nodes.py
+++ b/release/scripts/startup/bl_operators/object_nodes.py
@@ -83,6 +83,7 @@ node_categories = [
     GeometryNodeCategory("GEO_CONVERTER", "Converter", items=[
         NodeItem("ObjectSeparateVectorNode"),
         NodeItem("ObjectCombineVectorNode"),
+        NodeItem("GeometryMeshCombineNode"),
         ]),
     GeometryNodeCategory("GEO_MATH", "Math", items=[
         NodeItem("ObjectMathNode"),
@@ -584,6 +585,23 @@ class GeometryMeshLoadNode(GeometryNodeBase, ObjectNode):
         compiler.map_output(0, node.outputs[0])
 
 
+class GeometryMeshCombineNode(GeometryNodeBase, ObjectNode):
+    '''Combine multiple meshes into one'''
+    bl_idname = 'GeometryMeshCombineNode'
+    bl_label = 'Combine Meshes'
+
+    def init(self, context):
+        self.inputs.new('GeometrySocket', "A")
+        self.inputs.new('GeometrySocket', "B")
+        self.outputs.new('GeometrySocket', "")
+
+    def compile(self, compiler):
+        node = compiler.add_node("MESH_COMBINE", self.name)
+        compiler.map_input(0, node.inputs[0])
+        compiler.map_input(1, node.inputs[1])
+        compiler.map_output(0, node.outputs[0])
+
+
 class GeometryMeshArrayNode(GeometryNodeBase, ObjectNode):
     '''Make a number of transformed copies of a mesh'''
     bl_idname = 'GeometryMeshArrayNode'
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index 5863f4d..078f292 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -886,6 +886,13 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
 				eval_op_mesh_load(data, stack, offset_mesh);
 				break;
 			}
+			case OP_MESH_COMBINE: {
+				StackIndex offset_mesh_a = fn->read_stack_index(&instr);
+				StackIndex offset_mesh_b = fn->read_stack_index(&instr);
+				StackIndex offset_mesh_out = fn->read_stack_index(&instr);
+				eval_op_mesh_combine(&kd, stack, offset_mesh_a, offset_mesh_b, offset_mesh_out);
+				break;
+			}
 			case OP_MESH_ARRAY: {
 				StackIndex offset_mesh_in = fn->read_stack_index(&instr);
 				StackIndex offset_count = fn->read_stack_index(&instr);
diff --git a/source/blender/blenvm/bvm/bvm_eval_mesh.h b/source/blender/blenvm/bvm/bvm_eval_mesh.h
index 1df6ed0..ba3e77f 100644
--- a/source/blender/blenvm/bvm/bvm_eval_mesh.h
+++ b/source/blender/blenvm/bvm/bvm_eval_mesh.h
@@ -46,6 +46,111 @@ static void eval_op_mesh_load(const EvalData *data, float *stack, StackIndex off
 	stack_store_mesh(stack, offset, dm);
 }
 
+static void dm_insert(
+        DerivedMesh *result, DerivedMesh *dm,
+        int ofs_verts, int ofs_edges, int ofs_loops, int ofs_polys)
+{
+	int *index_orig;
+	int i;
+	MVert *mv;
+	MEdge *me;
+	MLoop *ml;
+	MPoly *mp;
+
+	/* needed for subsurf so arrays are allocated */
+	dm->getVertArray(dm);
+	dm->getEdgeArray(dm);
+	dm->getLoopArray(dm);
+	dm->getPolyArray(dm);
+
+	int cap_nverts = dm->getNumVerts(dm);
+	int cap_nedges = dm->getNumEdges(dm);
+	int cap_nloops = dm->getNumLoops(dm);
+	int cap_npolys = dm->getNumPolys(dm);
+
+	DM_copy_vert_data(dm, result, 0, ofs_verts, cap_nverts);
+	DM_copy_edge_data(dm, result, 0, ofs_edges, cap_nedges);
+	DM_copy_loop_data(dm, result, 0, ofs_loops, cap_nloops);
+	DM_copy_poly_data(dm, result, 0, ofs_polys, cap_npolys);
+
+	mv = CDDM_get_verts(result) + ofs_verts;
+
+	for (i = 0; i < cap_nverts; i++, mv++) {
+		/* Reset MVert flags for caps */
+		mv->flag = mv->bweight = 0;
+	}
+
+	/* adjust cap edge vertex indices */
+	me = CDDM_get_edges(result) + ofs_edges;
+	for (i = 0; i < cap_nedges; i++, me++) {
+		me->v1 += ofs_verts;
+		me->v2 += ofs_verts;
+	}
+
+	/* adjust cap poly loopstart indices */
+	mp = CDDM_get_polys(result) + ofs_polys;
+	for (i = 0; i < cap_npolys; i++, mp++) {
+		mp->loopstart += ofs_loops;
+	}
+
+	/* adjust cap loop vertex and edge indices */
+	ml = CDDM_get_loops(result) + ofs_loops;
+	for (i = 0; i < cap_nloops; i++, ml++) {
+		ml->v += ofs_verts;
+		ml->e += ofs_edges;
+	}
+
+	/* set origindex */
+	index_orig = (int *)result->getVertDataArray(result, CD_ORIGINDEX);
+	if (index_orig) {
+		copy_vn_i(index_orig + ofs_verts, cap_nverts, ORIGINDEX_NONE);
+	}
+
+	index_orig = (int *)result->getEdgeDataArray(result, CD_ORIGINDEX);
+	if (index_orig) {
+		copy_vn_i(index_orig + ofs_edges, cap_nedges, ORIGINDEX_NONE);
+	}
+
+	index_orig = (int *)result->getPolyDataArray(result, CD_ORIGINDEX);
+	if (index_orig) {
+		copy_vn_i(index_orig + ofs_polys, cap_npolys, ORIGINDEX_NONE);
+	}
+
+	index_orig = (int *)result->getLoopDataArray(result, CD_ORIGINDEX);
+	if (index_orig) {
+		copy_vn_i(index_orig + ofs_loops, cap_nloops, ORIGINDEX_NONE);
+	}
+}
+
+static void eval_op_mesh_combine(const EvalKernelData */*kernel_data*/, float *stack,
+                                 StackIndex offset_mesh_a, StackIndex offset_mesh_b, StackIndex offset_mesh_out)
+{
+	DerivedMesh *dm_a = stack_load_mesh(stack, offset_mesh_a);
+	DerivedMesh *dm_b = stack_load_mesh(stack, offset_mesh_b);
+	
+	int numVertsA = dm_a->getNumVerts(dm_a);
+	int numEdgesA = dm_a->getNumEdges(dm_a);
+	int numTessFacesA = dm_a->getNumTessFaces(dm_a);
+	int numLoopsA = dm_a->getNumLoops(dm_a);
+	int numPolysA = dm_a->getNumPolys(dm_a);
+	int numVertsB = dm_b->getNumVerts(dm_b);
+	int numEdgesB = dm_b->getNumEdges(dm_b);
+	int numTessFacesB = dm_b->getNumTessFaces(dm_b);
+	int numLoopsB = dm_b->getNumLoops(dm_b);
+	int numPolysB = dm_b->getNumPolys(dm_b);
+	
+	DerivedMesh *result = CDDM_new(numVertsA + numVertsB,
+	                               numEdgesA + numEdgesB,
+	                               numTessFacesA + numTessFacesB,
+	                               numLoopsA + numLoopsB,
+	                               numPolysA + numPolysB);
+	
+	dm_insert(result, dm_a, 0, 0, 0, 0);
+	dm_insert(result, dm_b, numVertsA, numEdgesA, numLoopsA, numPolysA);
+	
+	stack_store_mesh(stack, offset_mesh_out, result);
+}
+
 static DerivedMesh *do_array(const EvalGlobals *globals, const EvalData *data, const EvalKernelData *kernel_data, float *stack,
                              DerivedMesh *dm, int count, int fn_transform, StackIndex offset_transform)
 {
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h b/source/blender/blenvm/bvm/bvm_opcode.h
index 8fd8760..6d76762 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -111,6 +111,7 @@ enum OpCode {
 	OP_EFFECTOR_CLOSEST_POINT,
 	
 	OP_MESH_LOAD,
+	OP_MESH_COMBINE,
 	OP_MESH_ARRAY,
 	
 	OP_END,
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index 3f356a8..cdbf0b0 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -1091,6 +1091,7 @@ OpCode get_opcode_from_node_type(const string &node)
 	NODETYPE(EFFECTOR_CLOSEST_POINT);
 	
 	NODETYPE(MESH_LOAD);
+	NODETYPE(MESH_COMBINE);
 	NODETYPE(MESH_ARRAY);
 	
 	#undef NODETYPE
@@ -1351,6 +1352,11 @@ static void register_opcode_node_types()
 	nt = NodeGraph::add_kernel_node_type("MESH_LOAD");
 	nt->add_output("mesh", BVM_MESH, __empty_mesh__);
 	
+	nt = NodeGraph::add_kernel_node_type("MESH_COMBINE");
+	nt->add_input("mesh_a", BVM_MESH, __empty_mesh__);
+	nt->add_input("mesh_b", BVM_MESH, __empty_mesh__);
+	nt->add_output("mesh_out", BVM_MESH, __empty_mesh__);
+	
 	nt = NodeGraph::add_kernel_node_type("MESH_ARRAY");
 	nt->add_input("mesh_in", BVM_MESH, __empty_mesh__);
 	nt->add_input("count", BVM_INT, 1);




More information about the Bf-blender-cvs mailing list