Revision: 38449
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38449
Author:   campbellbarton
Date:     2011-07-17 12:40:18 +0000 (Sun, 17 Jul 2011)
Log Message:
-----------
patch [#28001] Find the nearest point on an object to the given location
from Andrew Hale (trumanblending) 

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/intern/rna_object_api.c

Modified: trunk/blender/source/blender/makesrna/intern/rna_object_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object_api.c       
2011-07-17 12:37:38 UTC (rev 38448)
+++ trunk/blender/source/blender/makesrna/intern/rna_object_api.c       
2011-07-17 12:40:18 UTC (rev 38449)
@@ -415,6 +415,41 @@
        *index= -1;
 }
 
+void rna_Object_closest_point_on_mesh(Object *ob, ReportList *reports, float 
point_co[3], float n_location[3], float n_normal[3], int *index)
+{
+       BVHTreeFromMesh treeData= {NULL};
+       
+       if(ob->derivedFinal==NULL) {
+               BKE_reportf(reports, RPT_ERROR, "object \"%s\" has no mesh data 
to be used for finding nearest point.", ob->id.name+2);
+               return;
+       }
+
+       /* no need to managing allocation or freeing of the BVH data. this is 
generated and freed as needed */
+       bvhtree_from_mesh_faces(&treeData, ob->derivedFinal, 0.0f, 4, 6);
+
+       if(treeData.tree==NULL) {
+               BKE_reportf(reports, RPT_ERROR, "object \"%s\" could not create 
internal data for finding nearest point", ob->id.name+2);
+               return;
+       }
+       else {
+               BVHTreeNearest nearest;
+
+               nearest.index = -1;
+               nearest.dist = FLT_MAX;
+
+               if(BLI_bvhtree_find_nearest(treeData.tree, point_co, &nearest, 
treeData.nearest_callback, &treeData) != -1) {
+                       copy_v3_v3(n_location, nearest.co);
+                       copy_v3_v3(n_normal, nearest.no);
+                       *index= nearest.index;
+                       return;
+               }
+       }
+
+       zero_v3(n_location);
+       zero_v3(n_normal);
+       *index= -1;
+}
+
 /* ObjectBase */
 
 void rna_ObjectBase_layers_from_view(Base *base, View3D *v3d)
@@ -501,6 +536,26 @@
        parm= RNA_def_int(func, "index", 0, 0, 0, "", "The face index, -1 when 
no intersection is found.", 0, 0);
        RNA_def_function_output(func, parm);
 
+       /* Nearest Point */
+       func= RNA_def_function(srna, "closest_point_on_mesh", 
"rna_Object_closest_point_on_mesh");
+       RNA_def_function_ui_description(func, "Find the nearest point on the 
object.");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
+
+       /* ray start and end */
+       parm= RNA_def_float_vector(func, "point", 3, NULL, -FLT_MAX, FLT_MAX, 
"", "", -1e4, 1e4);
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+
+       /* return location and normal */
+       parm= RNA_def_float_vector(func, "location", 3, NULL, -FLT_MAX, 
FLT_MAX, "Location", "The location on the object closest to the point", -1e4, 
1e4);
+       RNA_def_property_flag(parm, PROP_THICK_WRAP);
+       RNA_def_function_output(func, parm);
+       parm= RNA_def_float_vector(func, "normal", 3, NULL, -FLT_MAX, FLT_MAX, 
"Normal", "The face normal at the closest point", -1e4, 1e4);
+       RNA_def_property_flag(parm, PROP_THICK_WRAP);
+       RNA_def_function_output(func, parm);
+
+       parm= RNA_def_int(func, "index", 0, 0, 0, "", "The face index, -1 when 
no intersection is found.", 0, 0);
+       RNA_def_function_output(func, parm);
+
        /* View */
        func= RNA_def_function(srna, "is_visible", "rna_Object_is_visible");
        RNA_def_function_ui_description(func, "Determine if object is visible 
in a given scene.");

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to