Use looptri for volume snapping

This commit is contained in:
Campbell Barton 2015-07-23 12:56:44 +10:00
parent 748899a50a
commit 717046ad2a

@ -2062,9 +2062,11 @@ static bool peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[4][4],
{
bool retval = false;
int totvert = dm->getNumVerts(dm);
int totface = dm->getNumTessFaces(dm);
if (totvert > 0) {
const MLoopTri *looptri = dm->getLoopTriArray(dm);
const MLoop *mloop = dm->getLoopArray(dm);
int looptri_num = dm->getNumLoopTri(dm);
float imat[4][4];
float timat[3][3]; /* transpose inverse matrix for normals */
float ray_start_local[3], ray_normal_local[3];
@ -2080,23 +2082,27 @@ static bool peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[4][4],
/* If number of vert is more than an arbitrary limit,
* test against boundbox first
* */
if (totface > 16) {
if (looptri_num > 16) {
struct BoundBox *bb = BKE_object_boundbox_get(ob);
test = BKE_boundbox_ray_hit_check(bb, ray_start_local, ray_normal_local, NULL);
}
if (test == 1) {
const MLoopTri *lt;
MVert *verts = dm->getVertArray(dm);
MFace *faces = dm->getTessFaceArray(dm);
float (*polynors)[3] = dm->getPolyDataArray(dm, CD_NORMAL);
int i;
for (i = 0; i < totface; i++) {
MFace *f = faces + i;
for (i = 0, lt = looptri; i < looptri_num; i++, lt++) {
const unsigned int vtri[3] = {mloop[lt->tri[0]].v, mloop[lt->tri[1]].v, mloop[lt->tri[2]].v};
float lambda;
int result;
result = isect_ray_tri_threshold_v3(ray_start_local, ray_normal_local, verts[f->v1].co, verts[f->v2].co, verts[f->v3].co, &lambda, NULL, 0.001);
result = isect_ray_tri_threshold_v3(
ray_start_local, ray_normal_local,
verts[vtri[0]].co, verts[vtri[1]].co, verts[vtri[2]].co,
&lambda, NULL, 0.001);
if (result) {
float location[3], normal[3];
@ -2108,11 +2114,13 @@ static bool peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[4][4],
add_v3_v3(intersect, ray_start_local);
copy_v3_v3(location, intersect);
if (f->v4)
normal_quad_v3(normal, verts[f->v1].co, verts[f->v2].co, verts[f->v3].co, verts[f->v4].co);
else
normal_tri_v3(normal, verts[f->v1].co, verts[f->v2].co, verts[f->v3].co);
if (polynors) {
copy_v3_v3(normal, polynors[lt->poly]);
}
else {
normal_tri_v3(normal, verts[vtri[0]].co, verts[vtri[1]].co, verts[vtri[2]].co);
}
mul_m4_v3(obmat, location);
@ -2123,36 +2131,6 @@ static bool peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[4][4],
addDepthPeel(depth_peels, new_depth, location, normal, ob);
}
if (f->v4 && result == 0) {
result = isect_ray_tri_threshold_v3(ray_start_local, ray_normal_local, verts[f->v3].co, verts[f->v4].co, verts[f->v1].co, &lambda, NULL, 0.001);
if (result) {
float location[3], normal[3];
float intersect[3];
float new_depth;
copy_v3_v3(intersect, ray_normal_local);
mul_v3_fl(intersect, lambda);
add_v3_v3(intersect, ray_start_local);
copy_v3_v3(location, intersect);
if (f->v4)
normal_quad_v3(normal, verts[f->v1].co, verts[f->v2].co, verts[f->v3].co, verts[f->v4].co);
else
normal_tri_v3(normal, verts[f->v1].co, verts[f->v2].co, verts[f->v3].co);
mul_m4_v3(obmat, location);
new_depth = len_v3v3(location, ray_start);
mul_m3_v3(timat, normal);
normalize_v3(normal);
addDepthPeel(depth_peels, new_depth, location, normal, ob);
}
}
}
}
}