[Bf-blender-cvs] [a16ff1f] object_nodes: New node for finding the closest point on a mesh.

Lukas Tönne noreply at git.blender.org
Tue Jan 12 12:38:21 CET 2016


Commit: a16ff1f56812f5d1ac7a82b8a89655189821b7f1
Author: Lukas Tönne
Date:   Wed Jan 6 12:50:01 2016 +0100
Branches: object_nodes
https://developer.blender.org/rBa16ff1f56812f5d1ac7a82b8a89655189821b7f1

New node for finding the closest point on a mesh.

This will be useful for shrinkwrap-type modifier behavior.

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

M	release/scripts/nodes/geometry_nodes.py
M	source/blender/blenvm/bvm/bvm_eval.cc
M	source/blender/blenvm/bvm/bvm_eval_common.h
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/nodes/geometry_nodes.py b/release/scripts/nodes/geometry_nodes.py
index 9e1f48d..ccd8df0 100644
--- a/release/scripts/nodes/geometry_nodes.py
+++ b/release/scripts/nodes/geometry_nodes.py
@@ -286,6 +286,28 @@ class GeometryBooleanNode(GeometryNodeBase, ObjectNode):
         
         compiler.map_output(0, node.outputs[0])
 
+
+class GeometryClosestPointNode(GeometryNodeBase, ObjectNode):
+    '''Closest point on the a mesh'''
+    bl_idname = 'GeometryClosestPointNode'
+    bl_label = 'Closest Point'
+
+    def init(self, context):
+        self.inputs.new('GeometrySocket', "Mesh")
+        self.inputs.new('NodeSocketVector', "Vector")
+        self.outputs.new('NodeSocketVector', "Position")
+        self.outputs.new('NodeSocketVector', "Normal")
+        self.outputs.new('NodeSocketVector', "Tangent")
+
+    def compile(self, compiler):
+        node = compiler.add_node("MESH_CLOSEST_POINT")
+        
+        compiler.map_input(0, node.inputs["mesh"])
+        compiler.map_input(1, node.inputs["vector"])
+        compiler.map_output(0, node.outputs["position"])
+        compiler.map_output(1, node.outputs["normal"])
+        compiler.map_output(2, node.outputs["tangent"])
+
 ###############################################################################
 
 class CurveNodeBase(NodeBase):
@@ -413,6 +435,7 @@ def register():
             NodeItem("ObjectGetAxisAngleNode"),
             NodeItem("ObjectGetScaleNode"),
             NodeItem("ObjectRandomNode"),
+            NodeItem("GeometryClosestPointNode"),
             ]),
         GeometryNodeCategory("GEO_TEXTURE", "Texture", items=[
             NodeItem("ObjectTextureCloudsNode"),
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index 3bbbf63..9b61286 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -1048,6 +1048,18 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const Function *
 				                     offset_threshold, offset_mesh_out);
 				break;
 			}
+			case OP_MESH_CLOSEST_POINT: {
+				StackIndex offset_mesh = fn->read_stack_index(&instr);
+				StackIndex offset_transform = fn->read_stack_index(&instr);
+				StackIndex offset_invtransform = fn->read_stack_index(&instr);
+				StackIndex offset_vector = fn->read_stack_index(&instr);
+				StackIndex offset_position = fn->read_stack_index(&instr);
+				StackIndex offset_normal = fn->read_stack_index(&instr);
+				StackIndex offset_tangent = fn->read_stack_index(&instr);
+				eval_op_mesh_closest_point(stack, offset_mesh, offset_transform, offset_invtransform, offset_vector,
+				                           offset_position, offset_normal, offset_tangent);
+				break;
+			}
 			
 			case OP_CURVE_PATH: {
 				StackIndex offset_object = 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 e4975ca..935f25d 100644
--- a/source/blender/blenvm/bvm/bvm_eval_common.h
+++ b/source/blender/blenvm/bvm/bvm_eval_common.h
@@ -69,6 +69,17 @@ inline static matrix44 stack_load_matrix44(float *stack, StackIndex offset)
 	return *(matrix44 *)(&stack[offset]);
 }
 
+/* convenience function */
+inline static SpaceTransform stack_load_space_transform(float *stack,
+                                                        StackIndex offset_transform,
+                                                        StackIndex offset_invtransform)
+{
+	SpaceTransform transform;
+	copy_m4_m4(transform.local2target, stack_load_matrix44(stack, offset_transform).data);
+	copy_m4_m4(transform.target2local, stack_load_matrix44(stack, offset_invtransform).data);
+	return transform;
+}
+
 inline static const char *stack_load_string(float *stack, StackIndex offset)
 {
 	return *(const char **)(&stack[offset]);
@@ -126,6 +137,16 @@ inline static void stack_store_matrix44(float *stack, StackIndex offset, matrix4
 	*(matrix44 *)(&stack[offset]) = m;
 }
 
+/* convenience function */
+inline static void stack_store_space_transform(float *stack,
+                                               StackIndex offset_transform,
+                                               StackIndex offset_invtransform,
+                                               SpaceTransform transform)
+{
+	stack_store_matrix44(stack, offset_transform, matrix44::from_data(&transform.local2target[0][0]));
+	stack_store_matrix44(stack, offset_invtransform, matrix44::from_data(&transform.target2local[0][0]));
+}
+
 inline static void stack_store_string(float *stack, StackIndex offset, const char *s)
 {
 	*(const char **)(&stack[offset]) = s;
diff --git a/source/blender/blenvm/bvm/bvm_eval_mesh.h b/source/blender/blenvm/bvm/bvm_eval_mesh.h
index a75942b..a087b2f 100644
--- a/source/blender/blenvm/bvm/bvm_eval_mesh.h
+++ b/source/blender/blenvm/bvm/bvm_eval_mesh.h
@@ -481,6 +481,46 @@ static void eval_op_mesh_boolean(const EvalGlobals *UNUSED(globals),
 	stack_store_mesh(stack, offset_mesh_out, result);
 }
 
+static void eval_op_mesh_closest_point(float *stack,
+                                       StackIndex offset_mesh,
+                                       StackIndex offset_transform,
+	                                   StackIndex offset_invtransform,
+                                       StackIndex offset_vector,
+                                       StackIndex offset_position,
+                                       StackIndex offset_normal,
+                                       StackIndex offset_tangent)
+{
+	DerivedMesh *dm = stack_load_mesh(stack, offset_mesh);
+	SpaceTransform transform = stack_load_space_transform(stack, offset_transform, offset_invtransform);
+	
+	float3 vec;
+	vec = stack_load_float3(stack, offset_vector);
+	BLI_space_transform_invert(&transform, &vec.x);
+	
+	float3 pos(0.0f, 0.0f, 0.0f), nor(0.0f, 0.0f, 0.0f), tang(0.0f, 0.0f, 0.0f);
+	
+	BVHTreeFromMesh treeData = {NULL};
+	bvhtree_from_mesh_looptri(&treeData, dm, 0.0, 2, 6);
+	if (treeData.tree) {
+		BVHTreeNearest nearest;
+		nearest.index = -1;
+		nearest.dist_sq = FLT_MAX;
+		BLI_bvhtree_find_nearest(treeData.tree, &vec.x, &nearest, treeData.nearest_callback, &treeData);
+		
+		if (nearest.index != -1) {
+			copy_v3_v3(&pos.x, nearest.co);
+			copy_v3_v3(&nor.x, nearest.no);
+			BLI_space_transform_apply(&transform, &pos.x);
+			BLI_space_transform_apply_normal(&transform, &nor.x);
+			// TODO tangent is still undefined
+		}
+	}
+	
+	stack_store_float3(stack, offset_position, pos);
+	stack_store_float3(stack, offset_normal, nor);
+	stack_store_float3(stack, offset_tangent, tang);
+}
+
 } /* 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 cf9de60..0795bd2 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -147,6 +147,7 @@ namespace bvm {
 	DEF_OPCODE(MESH_ARRAY) \
 	DEF_OPCODE(MESH_DISPLACE) \
 	DEF_OPCODE(MESH_BOOLEAN) \
+	DEF_OPCODE(MESH_CLOSEST_POINT) \
 	\
 	DEF_OPCODE(CURVE_PATH) \
 	\
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index 2303675..c3f2846 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -965,6 +965,7 @@ OpCode get_opcode_from_node_type(const string &node)
 	NODETYPE(MESH_ARRAY);
 	NODETYPE(MESH_DISPLACE);
 	NODETYPE(MESH_BOOLEAN);
+	NODETYPE(MESH_CLOSEST_POINT);
 	
 	NODETYPE(CURVE_PATH);
 	
@@ -1408,6 +1409,15 @@ static void register_opcode_node_types()
 	nt->add_input("threshold", TYPE_FLOAT, 0.0f);
 	nt->add_output("mesh_out", TYPE_MESH);
 	
+	nt = NodeGraph::add_function_node_type("MESH_CLOSEST_POINT");
+	nt->add_input("mesh", TYPE_MESH, __empty_mesh__);
+	nt->add_input("transform", TYPE_MATRIX44, matrix44::identity());
+	nt->add_input("inverse_transform", TYPE_MATRIX44, matrix44::identity());
+	nt->add_input("vector", TYPE_FLOAT3, float3(0.0f, 0.0f, 0.0f));
+	nt->add_output("position", TYPE_FLOAT3);
+	nt->add_output("normal", TYPE_FLOAT3);
+	nt->add_output("tangent", TYPE_FLOAT3);
+	
 	nt = NodeGraph::add_function_node_type("CURVE_PATH");
 	nt->add_input("object", TYPE_POINTER, PointerRNA_NULL);
 	nt->add_input("transform", TYPE_MATRIX44, matrix44::identity());




More information about the Bf-blender-cvs mailing list