Revision: 56102
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56102
Author:   campbellbarton
Date:     2013-04-17 05:49:06 +0000 (Wed, 17 Apr 2013)
Log Message:
-----------
add interp_v3_v3v3v3_uv() to use for use with uv value from isect_ray_tri_v3(), 
rename tree -> bmtree for BMBVHTree.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/editmesh_bvh.c
    trunk/blender/source/blender/blenlib/BLI_math_vector.h
    trunk/blender/source/blender/blenlib/intern/math_vector.c

Modified: trunk/blender/source/blender/blenkernel/intern/editmesh_bvh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editmesh_bvh.c       
2013-04-17 04:53:23 UTC (rev 56101)
+++ trunk/blender/source/blender/blenkernel/intern/editmesh_bvh.c       
2013-04-17 05:49:06 UTC (rev 56102)
@@ -78,7 +78,7 @@
 BMBVHTree *BKE_bmbvh_new(BMEditMesh *em, int flag, struct Scene *scene)
 {
        struct BMLoop *(*looptris)[3] = em->looptris;
-       BMBVHTree *tree = MEM_callocN(sizeof(*tree), "BMBVHTree");
+       BMBVHTree *bmtree = MEM_callocN(sizeof(*bmtree), "BMBVHTree");
        DerivedMesh *cage, *final;
        float cos[3][3], (*cagecos)[3] = NULL;
        int i;
@@ -90,10 +90,10 @@
        /* cage-flag needs scene */
        BLI_assert(scene || !(flag & BMBVH_USE_CAGE));
 
-       tree->em = em;
-       tree->bm = em->bm;
-       tree->epsilon = FLT_EPSILON * 2.0f;
-       tree->flag = flag;
+       bmtree->em = em;
+       bmtree->bm = em->bm;
+       bmtree->epsilon = FLT_EPSILON * 2.0f;
+       bmtree->flag = flag;
 
        if (flag & (BMBVH_RESPECT_SELECT)) {
                tottri = 0;
@@ -115,7 +115,7 @@
                tottri = em->tottri;
        }
 
-       tree->tree = BLI_bvhtree_new(tottri, tree->epsilon, 8, 8);
+       bmtree->tree = BLI_bvhtree_new(tottri, bmtree->epsilon, 8, 8);
        
        if (flag & BMBVH_USE_CAGE) {
                BLI_bitmap vert_bitmap;
@@ -123,10 +123,10 @@
                BMVert *v;
                struct CageUserData data;
 
-               tree->cos = MEM_callocN(sizeof(*tree->cos) * em->bm->totvert, 
"bmbvh cos");
+               bmtree->cos = MEM_callocN(sizeof(*bmtree->cos) * 
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);
+                       copy_v3_v3(bmtree->cos[i], v->co);
                }
                em->bm->elem_index_dirty &= ~BM_VERT;
 
@@ -147,11 +147,10 @@
                MEM_freeN(vert_bitmap);
        }
        
-       tree->cagecos = cagecos;
+       bmtree->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)) {
@@ -176,34 +175,37 @@
                        copy_v3_v3(cos[2], looptris[i][2]->v->co);
                }
 
-               BLI_bvhtree_insert(tree->tree, i, (float *)cos, 3);
+               BLI_bvhtree_insert(bmtree->tree, i, (float *)cos, 3);
        }
        
-       BLI_bvhtree_balance(tree->tree);
+       BLI_bvhtree_balance(bmtree->tree);
        
-       return tree;
+       return bmtree;
 }
 
-void BKE_bmbvh_free(BMBVHTree *tree)
+void BKE_bmbvh_free(BMBVHTree *bmtree)
 {
-       BLI_bvhtree_free(tree->tree);
+       BLI_bvhtree_free(bmtree->tree);
        
-       if (tree->cagecos)
-               MEM_freeN(tree->cagecos);
-       if (tree->cos)
-               MEM_freeN(tree->cos);
+       if (bmtree->cagecos)
+               MEM_freeN(bmtree->cagecos);
+       if (bmtree->cos)
+               MEM_freeN(bmtree->cos);
        
-       MEM_freeN(tree);
+       MEM_freeN(bmtree);
 }
 
 /* taken from bvhutils.c */
 static void raycallback(void *userdata, int index, const BVHTreeRay *ray, 
BVHTreeRayHit *hit)
 {
-       BMBVHTree *tree = userdata;
-       BMLoop **ltri = tree->em->looptris[index];
+       BMBVHTree *bmtree = userdata;
+       BMLoop **ltri = bmtree->em->looptris[index];
        float dist, uv[2];
+       const float *co1 = ltri[0]->v->co;
+       const float *co2 = ltri[1]->v->co;
+       const float *co3 = ltri[2]->v->co;
 
-       if (isect_ray_tri_v3(ray->origin, ray->direction, ltri[0]->v->co, 
ltri[1]->v->co, ltri[2]->v->co, &dist, uv) &&
+       if (isect_ray_tri_v3(ray->origin, ray->direction, co1, co2, co3, &dist, 
uv) &&
            (dist < hit->dist))
        {
                hit->dist = dist;
@@ -216,11 +218,11 @@
                mul_v3_fl(hit->co, dist);
                add_v3_v3(hit->co, ray->origin);
                
-               copy_v2_v2(tree->uv, uv);
+               copy_v2_v2(bmtree->uv, uv);
        }
 }
 
-BMFace *BKE_bmbvh_ray_cast(BMBVHTree *tree, const float co[3], const float 
dir[3],
+BMFace *BKE_bmbvh_ray_cast(BMBVHTree *bmtree, const float co[3], const float 
dir[3],
                            float *r_dist, float r_hitout[3], float 
r_cagehit[3])
 {
        BVHTreeRayHit hit;
@@ -229,24 +231,14 @@
        hit.dist = dist;
        hit.index = -1;
 
-       zero_v2(tree->uv);
+       zero_v2(bmtree->uv);
        
-       BLI_bvhtree_ray_cast(tree->tree, co, dir, 0.0f, &hit, raycallback, 
tree);
+       BLI_bvhtree_ray_cast(bmtree->tree, co, dir, 0.0f, &hit, raycallback, 
bmtree);
        if (hit.index != -1 && hit.dist != dist) {
                if (r_hitout) {
-                       if (tree->flag & BMBVH_RETURN_ORIG) {
-                               BMLoop **ltri = tree->em->looptris[hit.index];
-                               const float *co1, *co2, *co3;
-                               int i;
-
-                               co1 = ltri[0]->v->co;
-                               co2 = ltri[1]->v->co;
-                               co3 = ltri[2]->v->co;
-                               
-                               for (i = 0; i < 3; i++) {
-                                       r_hitout[i] = co1[i] + ((co2[i] - 
co1[i]) * tree->uv[0]) +
-                                                              ((co3[i] - 
co1[i]) * tree->uv[1]);
-                               }
+                       if (bmtree->flag & BMBVH_RETURN_ORIG) {
+                               BMLoop **ltri = bmtree->em->looptris[hit.index];
+                               interp_v3_v3v3v3_uv(r_hitout, ltri[0]->v->co, 
ltri[1]->v->co, ltri[2]->v->co, bmtree->uv);
                        }
                        else {
                                copy_v3_v3(r_hitout, hit.co);
@@ -261,25 +253,25 @@
                        *r_dist = hit.dist;
                }
 
-               return tree->em->looptris[hit.index][0]->f;
+               return bmtree->em->looptris[hit.index][0]->f;
        }
 
        return NULL;
 }
 
-BVHTree *BKE_bmbvh_tree_get(BMBVHTree *tree)
+BVHTree *BKE_bmbvh_tree_get(BMBVHTree *bmtree)
 {
-       return tree->tree;
+       return bmtree->tree;
 }
 
 static void vertsearchcallback(void *userdata, int index, const float 
*UNUSED(co), BVHTreeNearest *hit)
 {
-       BMBVHTree *tree = userdata;
-       BMLoop **ltri = tree->em->looptris[index];
+       BMBVHTree *bmtree = userdata;
+       BMLoop **ltri = bmtree->em->looptris[index];
        float dist, maxdist, v[3];
        int i;
 
-       maxdist = tree->maxdist;
+       maxdist = bmtree->maxdist;
 
        for (i = 0; i < 3; i++) {
                sub_v3_v3v3(v, hit->co, ltri[i]->v->co);
@@ -294,7 +286,7 @@
        }
 }
 
-BMVert *BKE_bmbvh_find_vert_closest(BMBVHTree *tree, const float co[3], const 
float maxdist)
+BMVert *BKE_bmbvh_find_vert_closest(BMBVHTree *bmtree, const float co[3], 
const float maxdist)
 {
        BVHTreeNearest hit;
 
@@ -302,15 +294,15 @@
        hit.dist = maxdist * 5;
        hit.index = -1;
 
-       tree->maxdist = maxdist;
+       bmtree->maxdist = maxdist;
 
-       BLI_bvhtree_find_nearest(tree->tree, co, &hit, vertsearchcallback, 
tree);
+       BLI_bvhtree_find_nearest(bmtree->tree, co, &hit, vertsearchcallback, 
bmtree);
        if (hit.dist != FLT_MAX && hit.index != -1) {
-               BMLoop **ltri = tree->em->looptris[hit.index];
-               float dist, curdist = tree->maxdist;
+               BMLoop **ltri = bmtree->em->looptris[hit.index];
+               float dist, curdist = bmtree->maxdist;
                int cur = 0, i;
 
-               /* maxdist = tree->maxdist; */  /* UNUSED */
+               /* maxdist = bmtree->maxdist; */  /* UNUSED */
 
                for (i = 0; i < 3; i++) {
                        dist = len_v3v3(hit.co, ltri[i]->v->co);

Modified: trunk/blender/source/blender/blenlib/BLI_math_vector.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_vector.h      2013-04-17 
04:53:23 UTC (rev 56101)
+++ trunk/blender/source/blender/blenlib/BLI_math_vector.h      2013-04-17 
05:49:06 UTC (rev 56102)
@@ -176,6 +176,7 @@
 void interp_v4_v4v4(float r[4], const float a[4], const float b[4], const 
float t);
 void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const 
float v3[4], const float w[3]);
 void interp_v4_v4v4v4v4(float p[4], const float v1[4], const float v2[4], 
const float v3[4], const float v4[4], const float w[4]);
+void interp_v3_v3v3v3_uv(float p[3], const float v1[3], const float v2[3], 
const float v3[3], const float uv[2]);
 
 void mid_v3_v3v3(float r[3], const float a[3], const float b[3]);
 void mid_v2_v2v2(float r[2], const float a[2], const float b[2]);

Modified: trunk/blender/source/blender/blenlib/intern/math_vector.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_vector.c   2013-04-17 
04:53:23 UTC (rev 56101)
+++ trunk/blender/source/blender/blenlib/intern/math_vector.c   2013-04-17 
05:49:06 UTC (rev 56102)
@@ -102,6 +102,13 @@
        p[3] = v1[3] * w[0] + v2[3] * w[1] + v3[3] * w[2] + v4[3] * w[3];
 }
 
+void interp_v3_v3v3v3_uv(float p[3], const float v1[3], const float v2[3], 
const float v3[3], const float uv[2])
+{
+       p[0] = v1[0] + ((v2[0] - v1[0]) * uv[0]) + ((v3[0] - v1[0]) * uv[1]);
+       p[1] = v1[1] + ((v2[1] - v1[1]) * uv[0]) + ((v3[1] - v1[1]) * uv[1]);
+       p[2] = v1[2] + ((v2[2] - v1[2]) * uv[0]) + ((v3[2] - v1[2]) * uv[1]);
+}
+
 void mid_v3_v3v3(float v[3], const float v1[3], const float v2[3])
 {
        v[0] = 0.5f * (v1[0] + v2[0]);

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

Reply via email to