Revision: 15046
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15046
Author: theeth
Date: 2008-05-29 12:51:10 +0200 (Thu, 29 May 2008)
Log Message:
-----------
Transform Snap
Editmode snapping to derived mesh.
Now all the fun snapping options (snapping to faces, verts, edges) are
supported inside edit mode and you can also snap to subsurfed faces, virtual
array copies, ... from inside edit mode.
Modified Paths:
--------------
branches/apricot/source/blender/src/transform_snap.c
Modified: branches/apricot/source/blender/src/transform_snap.c
===================================================================
--- branches/apricot/source/blender/src/transform_snap.c 2008-05-29
09:23:18 UTC (rev 15045)
+++ branches/apricot/source/blender/src/transform_snap.c 2008-05-29
10:51:10 UTC (rev 15046)
@@ -55,6 +55,7 @@
#include "BIF_screen.h"
#include "BIF_editsima.h"
#include "BIF_drawimage.h"
+#include "BIF_editmesh.h"
#include "BKE_global.h"
#include "BKE_utildefines.h"
@@ -95,6 +96,7 @@
#define NOT_ACTIVE 1
int snapObjects(int *dist, float *loc, float *no, int mode);
+
/****************** IMPLEMENTATIONS *********************/
int BIF_snappingSupported(void)
@@ -516,19 +518,13 @@
/* Mesh edit mode */
else if (G.obedit != NULL && G.obedit->type==OB_MESH)
{
- /*if (G.scene->selectmode & B_SEL_VERT)*/
-
if (t->spacetype == SPACE_VIEW3D)
{
- EditVert *nearest=NULL;
float vec[3];
float no[3];
int found = 0;
int dist = 40; // Use a user defined value here
-
- // use findnearestverts in vert mode, others in other
modes
- nearest = findnearestvert(&dist, SELECT, 1);
-
+
found = snapObjects(&dist, vec, no, NOT_ACTIVE);
if (found == 1)
{
@@ -537,15 +533,6 @@
t->tsnap.status |= POINT_INIT;
}
- /* If there's no outside vertex nearer, but there's one
in this mesh
- */
- else if (nearest != NULL)
- {
- VECCOPY(t->tsnap.snapPoint, nearest->co);
- Mat4MulVecfl(G.obedit->obmat,
t->tsnap.snapPoint);
-
- t->tsnap.status |= POINT_INIT;
- }
else
{
t->tsnap.status &= ~POINT_INIT;
@@ -576,33 +563,6 @@
t->tsnap.status &= ~POINT_INIT;
}
}
-
-
- /*
- if (G.scene->selectmode & B_SEL_EDGE)
- {
- EditEdge *nearest=NULL;
- int dist = 50; // Use a user defined value here
-
- // use findnearestverts in vert mode, others in other
modes
- nearest = findnearestedge(&dist);
-
- if (nearest != NULL)
- {
- VecAddf(t->tsnap.snapPoint, nearest->v1->co,
nearest->v2->co);
-
- VecMulf(t->tsnap.snapPoint, 0.5f);
-
- Mat4MulVecfl(G.obedit->obmat,
t->tsnap.snapPoint);
-
- t->tsnap.status |= POINT_INIT;
- }
- else
- {
- t->tsnap.status &= ~POINT_INIT;
- }
- }
- */
}
}
@@ -883,7 +843,7 @@
return result;
}
-int snapDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float
ray_start[3], float ray_normal[3], short mval[2], float *loc, float *no, int
*dist, float *depth)
+int snapDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float
ray_start[3], float ray_normal[3], short mval[2], float *loc, float *no, int
*dist, float *depth, short EditMesh)
{
float object_depth = FLT_MAX;
int retval = 0;
@@ -919,54 +879,58 @@
if (test == 1) {
MVert *verts = dm->getVertArray(dm);
MFace *faces = dm->getFaceArray(dm);
+ int *index_array;
+ int index = 0;
int i;
+ test = 1;
+
+ if (EditMesh)
+ {
+ index_array = dm->getFaceDataArray(dm,
CD_ORIGINDEX);
+ EM_init_index_arrays(0, 0, 1);
+ }
+
for( i = 0; i < totface; i++) {
MFace *f = faces + i;
float lambda;
int result;
- result = RayIntersectsTriangle(ray_start_local,
ray_normal_local, verts[f->v1].co, verts[f->v2].co, verts[f->v3].co, &lambda,
NULL);
-
- if (result && lambda < object_depth) {
- float location[3], normal[3];
- float intersect[3];
+ if (EditMesh)
+ {
+ EditFace *efa = NULL;
- VECCOPY(intersect, ray_normal_local);
- VecMulf(intersect, lambda);
- VecAddf(intersect, intersect,
ray_start_local);
+ if (index_array)
+ {
+ index = index_array[i];
+ }
+ else
+ {
+ index = i;
+ }
- if (snapFace(f, verts, intersect,
location, normal))
- {
- float new_depth;
- int screen_loc[2];
+ if (index == ORIGINDEX_NONE)
+ {
+ test = 0;
+ }
+ else
+ {
+ efa =
EM_get_face_for_index(index);
- object_depth = lambda;
- Mat4MulVecfl(obmat, location);
-
- new_depth = VecLenf(location,
ray_start);
-
- if (new_depth < *depth)
+ if (efa)
{
- *depth = new_depth;
- retval = 1;
-
- VECCOPY(loc, location);
- VECCOPY(no, normal);
-
- Mat3MulVecfl(timat, no);
- Normalize(no);
-
- project_int(loc,
screen_loc);
-
- *dist =
abs(screen_loc[0] - mval[0]) + abs(screen_loc[1] - mval[1]);
- }
+ if (efa->v1->f1 &
SELECT || efa->v2->f1 & SELECT || efa->v3->f1 & SELECT || (efa->v4 &&
efa->v4->f1 & SELECT))
+ {
+ test = 0;
+ }
+ }
}
}
-
- if (f->v4 && result == 0)
+
+
+ if (test)
{
- result =
RayIntersectsTriangle(ray_start_local, ray_normal_local, verts[f->v3].co,
verts[f->v4].co, verts[f->v1].co, &lambda, NULL);
+ result =
RayIntersectsTriangle(ray_start_local, ray_normal_local, verts[f->v1].co,
verts[f->v2].co, verts[f->v3].co, &lambda, NULL);
if (result && lambda < object_depth) {
float location[3], normal[3];
@@ -975,19 +939,19 @@
VECCOPY(intersect,
ray_normal_local);
VecMulf(intersect, lambda);
VecAddf(intersect, intersect,
ray_start_local);
-
+
if (snapFace(f, verts,
intersect, location, normal))
{
float new_depth;
int screen_loc[2];
- object_depth = lambda;
Mat4MulVecfl(obmat,
location);
new_depth =
VecLenf(location, ray_start);
if (new_depth < *depth)
{
+ object_depth =
lambda;
*depth =
new_depth;
retval = 1;
@@ -1003,8 +967,54 @@
}
}
}
+
+ if (f->v4 && result == 0)
+ {
+ result =
RayIntersectsTriangle(ray_start_local, ray_normal_local, verts[f->v3].co,
verts[f->v4].co, verts[f->v1].co, &lambda, NULL);
+
+ if (result && lambda <
object_depth) {
+ float location[3],
normal[3];
+ float intersect[3];
+
+ VECCOPY(intersect,
ray_normal_local);
+ VecMulf(intersect,
lambda);
+ VecAddf(intersect,
intersect, ray_start_local);
+
+ if (snapFace(f, verts,
intersect, location, normal))
+ {
+ float new_depth;
+ int
screen_loc[2];
+
+
Mat4MulVecfl(obmat, location);
+
+ new_depth =
VecLenf(location, ray_start);
+
+ if (new_depth <
*depth)
+ {
+
object_depth = lambda;
+ *depth
= new_depth;
+ retval
= 1;
+
+
VECCOPY(loc, location);
+
VECCOPY(no, normal);
+
+
Mat3MulVecfl(timat, no);
+
Normalize(no);
+
+
project_int(loc, screen_loc);
+
+ *dist =
abs(screen_loc[0] - mval[0]) + abs(screen_loc[1] - mval[1]);
+ }
+ }
+ }
+ }
}
}
+
+ if (EditMesh)
+ {
+ EM_free_index_arrays();
+ }
}
}
@@ -1021,8 +1031,6 @@
getmouseco_areawin(mval);
viewray(mval, ray_start, ray_normal);
-#if 0
- /* CODE DISABLE because selection flags are not probagated to derived
mesh from edit mesh */
if (mode == NOT_ACTIVE)
{
DerivedMesh *dm, *dm_cage;
@@ -1030,12 +1038,11 @@
dm_cage = editmesh_get_derived_cage_and_final(&dm,
CD_MASK_BAREMESH);
- retval = snapDerivedMesh(ob, dm, ray_start, ray_normal, mval,
loc, no, dist, &depth);
+ retval = snapDerivedMesh(ob, dm, ob->obmat, ray_start,
ray_normal, mval, loc, no, dist, &depth, 1);
dm_cage->release(dm_cage);
dm->release(dm);
}
-#endif
base= FIRSTBASE;
for ( base = FIRSTBASE; base != NULL; base = base->next ) {
@@ -1055,7 +1062,7 @@
DerivedMesh *dm =
mesh_get_derived_final(ob, CD_MASK_BAREMESH);
int val;
- val = snapDerivedMesh(ob, dm,
dupli_ob->mat, ray_start, ray_normal, mval, loc, no, dist, &depth);
+ val = snapDerivedMesh(ob, dm,
dupli_ob->mat, ray_start, ray_normal, mval, loc, no, dist, &depth, 0);
retval = retval || val;
@@ -1070,7 +1077,7 @@
DerivedMesh *dm = mesh_get_derived_final(ob,
CD_MASK_BAREMESH);
int val;
- val = snapDerivedMesh(ob, dm, ob->obmat,
ray_start, ray_normal, mval, loc, no, dist, &depth);
+ val = snapDerivedMesh(ob, dm, ob->obmat,
ray_start, ray_normal, mval, loc, no, dist, &depth, 0);
retval = retval || val;
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs
