Revision: 56079
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56079
Author:   campbellbarton
Date:     2013-04-16 05:23:34 +0000 (Tue, 16 Apr 2013)
Log Message:
-----------
move editmesh_bvh.c into blenkernel.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/CMakeLists.txt
    trunk/blender/source/blender/editors/include/ED_mesh.h
    trunk/blender/source/blender/editors/mesh/CMakeLists.txt
    trunk/blender/source/blender/editors/mesh/editmesh_knife.c
    trunk/blender/source/blender/editors/mesh/editmesh_utils.c
    trunk/blender/source/blender/editors/transform/transform.c

Added Paths:
-----------
    trunk/blender/source/blender/blenkernel/BKE_editmesh_bvh.h
    trunk/blender/source/blender/blenkernel/intern/editmesh_bvh.c

Removed Paths:
-------------
    trunk/blender/source/blender/editors/mesh/editmesh_bvh.c
    trunk/blender/source/blender/editors/mesh/editmesh_bvh.h

Copied: trunk/blender/source/blender/blenkernel/BKE_editmesh_bvh.h (from rev 
56077, trunk/blender/source/blender/editors/mesh/editmesh_bvh.h)
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_editmesh_bvh.h                  
        (rev 0)
+++ trunk/blender/source/blender/blenkernel/BKE_editmesh_bvh.h  2013-04-16 
05:23:34 UTC (rev 56079)
@@ -0,0 +1,65 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file BKE_editmesh_bvh.h
+ *  \ingroup bke
+ */
+
+#ifndef __BKE_EDITMESH_BVH_H__
+#define __BKE_EDITMESH_BVH_H__
+
+struct BMEditMesh;
+struct BMFace;
+struct BMEdge;
+struct BMVert;
+struct RegionView3D;
+struct BMBVHTree;
+struct BVHTree;
+struct Scene;
+struct Object;
+
+typedef struct BMBVHTree BMBVHTree;
+
+BMBVHTree *BMBVH_NewBVH(struct BMEditMesh *em, int flag, struct Scene *scene);
+void BMBVH_FreeBVH(BMBVHTree *tree);
+struct BVHTree *BMBVH_BVHTree(BMBVHTree *tree);
+
+struct BMFace *BMBVH_RayCast(BMBVHTree *tree, const float co[3], const float 
dir[3],
+                             float r_hitout[3], float r_cagehit[3]);
+
+/*find a vert closest to co in a sphere of radius maxdist*/
+struct BMVert *BMBVH_FindClosestVert(BMBVHTree *tree, const float co[3], const 
float maxdist);
+
+/* BMBVH_NewBVH flag parameter */
+enum {
+       BMBVH_USE_CAGE        = 1, /* project geometry onto modifier cage */
+       BMBVH_RETURN_ORIG     = 2, /* use with BMBVH_USE_CAGE, returns hits in 
relation to original geometry */
+       BMBVH_RESPECT_SELECT  = 4, /* restrict to hidden geometry (overrides 
BMBVH_RESPECT_HIDDEN) */
+       BMBVH_RESPECT_HIDDEN  = 8  /* omit hidden geometry */
+};
+
+#endif  /* __BKE_EDITMESH_BVH_H__ */

Modified: trunk/blender/source/blender/blenkernel/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/blenkernel/CMakeLists.txt      2013-04-16 
03:27:51 UTC (rev 56078)
+++ trunk/blender/source/blender/blenkernel/CMakeLists.txt      2013-04-16 
05:23:34 UTC (rev 56079)
@@ -84,6 +84,7 @@
        intern/displist.c
        intern/dynamicpaint.c
        intern/editderivedmesh.c
+       intern/editmesh_bvh.c
        intern/effect.c
        intern/fcurve.c
        intern/fluidsim.c
@@ -237,6 +238,7 @@
        BKE_subsurf.h
        BKE_suggestions.h
        BKE_editmesh.h
+       BKE_editmesh_bvh.h
        BKE_text.h
        BKE_texture.h
        BKE_tracking.h

Copied: trunk/blender/source/blender/blenkernel/intern/editmesh_bvh.c (from rev 
56077, trunk/blender/source/blender/editors/mesh/editmesh_bvh.c)
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editmesh_bvh.c               
                (rev 0)
+++ trunk/blender/source/blender/blenkernel/intern/editmesh_bvh.c       
2013-04-16 05:23:34 UTC (rev 56079)
@@ -0,0 +1,357 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2010 by Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joseph Eagar
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/editmesh_bvh.c
+ *  \ingroup bke
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+
+#include "BLI_math.h"
+#include "BLI_smallhash.h"
+
+#include "BKE_DerivedMesh.h"
+#include "BKE_editmesh.h"
+
+#include "BKE_editmesh_bvh.h"  /* own include */
+
+
+typedef struct BMBVHTree {
+       BMEditMesh *em;
+       BMesh *bm;
+       BVHTree *tree;
+       float epsilon;
+       float maxdist; /* for nearest point search */
+       float uv[2];
+       
+       /* stuff for topological vert search */
+       BMVert *v, *curv;
+       GHash *gh;
+       float curw, curd;
+       float co[3], (*cagecos)[3], (*cos)[3];
+       int curtag, flag;
+       
+       Object *ob;
+       Scene *scene;
+} BMBVHTree;
+
+static void cage_mapped_verts_callback(void *userData, int index, const float 
co[3],
+                                       const float UNUSED(no_f[3]), const 
short UNUSED(no_s[3]))
+{
+       void **data = userData;
+       BMEditMesh *em = data[0];
+       float (*cagecos)[3] = data[1];
+       SmallHash *hash = data[2];
+       
+       if (index >= 0 && index < em->bm->totvert && 
!BLI_smallhash_haskey(hash, index)) {
+               BLI_smallhash_insert(hash, index, NULL);
+               copy_v3_v3(cagecos[index], co);
+       }
+}
+
+BMBVHTree *BMBVH_NewBVH(BMEditMesh *em, int flag, Scene *scene)
+{
+       BMBVHTree *tree = MEM_callocN(sizeof(*tree), "BMBVHTree");
+       DerivedMesh *cage, *final;
+       SmallHash shash;
+       float cos[3][3], (*cagecos)[3] = NULL;
+       int i;
+       int tottri;
+
+       /* when initializing cage verts, we only want the first cage coordinate 
for each vertex,
+        * so that e.g. mirror or array use original vertex coordinates and not 
mirrored or duplicate */
+       BLI_smallhash_init(&shash);
+       
+       BMEdit_RecalcTessellation(em);
+
+       tree->ob = em->ob;
+       tree->scene = scene;
+       tree->em = em;
+       tree->bm = em->bm;
+       tree->epsilon = FLT_EPSILON * 2.0f;
+       tree->flag = flag;
+
+       if (flag & (BMBVH_RESPECT_SELECT)) {
+               tottri = 0;
+               for (i = 0; i < em->tottri; i++) {
+                       if (BM_elem_flag_test(em->looptris[i][0]->f, 
BM_ELEM_SELECT)) {
+                               tottri++;
+                       }
+               }
+       }
+       else if (flag & (BMBVH_RESPECT_HIDDEN)) {
+               tottri = 0;
+               for (i = 0; i < em->tottri; i++) {
+                       if (!BM_elem_flag_test(em->looptris[i][0]->f, 
BM_ELEM_HIDDEN)) {
+                               tottri++;
+                       }
+               }
+       }
+       else {
+               tottri = em->tottri;
+       }
+
+       tree->tree = BLI_bvhtree_new(tottri, tree->epsilon, 8, 8);
+       
+       if (flag & BMBVH_USE_CAGE) {
+               BMIter iter;
+               BMVert *v;
+               void *data[3];
+               
+               tree->cos = MEM_callocN(sizeof(float) * 3 * em->bm->totvert, 
"bmbvh cos");
+               BM_ITER_MESH_INDEX (v, &iter, em->bm, BM_VERTS_OF_MESH, i) {
+                       BM_elem_index_set(v, i); /* set_inline */
+                       copy_v3_v3(tree->cos[i], v->co);
+               }
+               em->bm->elem_index_dirty &= ~BM_VERT;
+
+
+               cage = editbmesh_get_derived_cage_and_final(scene, em->ob, em, 
&final, CD_MASK_DERIVEDMESH);
+               cagecos = MEM_callocN(sizeof(float) * 3 * em->bm->totvert, 
"bmbvh cagecos");
+               
+               data[0] = em;
+               data[1] = cagecos;
+               data[2] = &shash;
+               
+               cage->foreachMappedVert(cage, cage_mapped_verts_callback, data);
+       }
+       
+       tree->cagecos = cagecos;
+       
+       for (i = 0; i < em->tottri; i++) {
+
+
+               if (flag & BMBVH_RESPECT_SELECT) {
+                       /* note, the arrays wont align now! take care */
+                       if (!BM_elem_flag_test(em->looptris[i][0]->f, 
BM_ELEM_SELECT)) {
+                               continue;
+                       }
+               }
+               else if (flag & BMBVH_RESPECT_HIDDEN) {
+                       /* note, the arrays wont align now! take care */
+                       if (BM_elem_flag_test(em->looptris[i][0]->f, 
BM_ELEM_HIDDEN)) {
+                               continue;
+                       }
+               }
+
+               if (flag & BMBVH_USE_CAGE) {
+                       copy_v3_v3(cos[0], 
cagecos[BM_elem_index_get(em->looptris[i][0]->v)]);
+                       copy_v3_v3(cos[1], 
cagecos[BM_elem_index_get(em->looptris[i][1]->v)]);
+                       copy_v3_v3(cos[2], 
cagecos[BM_elem_index_get(em->looptris[i][2]->v)]);
+               }
+               else {
+                       copy_v3_v3(cos[0], em->looptris[i][0]->v->co);
+                       copy_v3_v3(cos[1], em->looptris[i][1]->v->co);
+                       copy_v3_v3(cos[2], em->looptris[i][2]->v->co);
+               }
+
+               BLI_bvhtree_insert(tree->tree, i, (float *)cos, 3);
+       }
+       
+       BLI_bvhtree_balance(tree->tree);
+       BLI_smallhash_release(&shash);
+       
+       return tree;
+}
+
+void BMBVH_FreeBVH(BMBVHTree *tree)
+{
+       BLI_bvhtree_free(tree->tree);
+       
+       if (tree->cagecos)
+               MEM_freeN(tree->cagecos);
+       if (tree->cos)
+               MEM_freeN(tree->cos);
+       
+       MEM_freeN(tree);
+}
+
+/* taken from bvhutils.c */
+static float ray_tri_intersection(const BVHTreeRay *ray, const float 
UNUSED(m_dist),
+                                  const float v0[3],  const float v1[3], const 
float v2[3],
+                                  float r_uv[2], float UNUSED(e))
+{
+       float dist;
+
+       if (isect_ray_tri_v3((float *)ray->origin, (float *)ray->direction, v0, 
v1, v2, &dist, r_uv)) {
+               return dist;
+       }
+
+       return FLT_MAX;
+}
+
+static void raycallback(void *userdata, int index, const BVHTreeRay *ray, 
BVHTreeRayHit *hit)
+{
+       BMBVHTree *tree = userdata;
+       BMLoop **ls = tree->em->looptris[index];
+       float dist, uv[2];
+        
+       if (!ls[0] || !ls[1] || !ls[2])
+               return;
+       
+       dist = ray_tri_intersection(ray, hit->dist, ls[0]->v->co, ls[1]->v->co,
+                                   ls[2]->v->co, uv, tree->epsilon);
+       if (dist < hit->dist) {
+               hit->dist = dist;
+               hit->index = index;
+               
+               copy_v3_v3(hit->no, ls[0]->v->no);
+
+               copy_v3_v3(hit->co, ray->direction);
+               normalize_v3(hit->co);
+               mul_v3_fl(hit->co, dist);
+               add_v3_v3(hit->co, ray->origin);
+               
+               copy_v2_v2(tree->uv, uv);
+       }
+}
+
+BMFace *BMBVH_RayCast(BMBVHTree *tree, const float co[3], const float dir[3],
+                      float r_hitout[3], float r_cagehit[3])
+{
+       BVHTreeRayHit hit;
+
+       hit.dist = FLT_MAX;
+       hit.index = -1;
+       
+       tree->uv[0] = tree->uv[1] = 0.0f;
+       
+       BLI_bvhtree_ray_cast(tree->tree, co, dir, 0.0f, &hit, raycallback, 
tree);
+       if (hit.dist != FLT_MAX && hit.index != -1) {
+               if (r_hitout) {
+                       if (tree->flag & BMBVH_RETURN_ORIG) {
+                               BMVert *v1, *v2, *v3;
+                               int i;
+                               
+                               v1 = tree->em->looptris[hit.index][0]->v;

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to