[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