Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2006-01-29 11:36:01 +0300
committerCampbell Barton <ideasman42@gmail.com>2006-01-29 11:36:01 +0300
commit9ccdad0d13bacba1d0c6995efe23bc77b7866050 (patch)
tree5bdd248eaf912868d1d2052b422bd68a7bfc877a /source/blender/src
parent904e298dc1d86119a4ae9c798cdb4a8784a969ef (diff)
Made mesh align to face/verts also align to an edge and a verts normal, existing functionality was not changed.
usefull for rotating about an edge.
Diffstat (limited to 'source/blender/src')
-rw-r--r--source/blender/src/editmesh_mods.c50
1 files changed, 36 insertions, 14 deletions
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index 330555c5f14..7eb1e400245 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -2455,18 +2455,12 @@ void editmesh_align_view_to_selected(View3D *v3d, int axis)
{
EditMesh *em = G.editMesh;
int nselverts= EM_nvertices_selected();
-
- if (nselverts<3) {
- if (nselverts==0) {
- error("No faces or vertices selected.");
- } else {
- error("At least one face or three vertices must be selected.");
- }
+ float norm[3]={0.0, 0.0, 0.0}; /* used for storing the mesh normal */
+
+ if (nselverts==0) {
+ error("No faces or vertices selected.");
} else if (EM_nfaces_selected()) {
- float norm[3];
EditFace *efa;
-
- norm[0]= norm[1]= norm[2]= 0.0;
for (efa= em->faces.first; efa; efa= efa->next) {
if (faceselectedAND(efa, SELECT)) {
float fno[3];
@@ -2483,11 +2477,10 @@ void editmesh_align_view_to_selected(View3D *v3d, int axis)
Mat4Mul3Vecfl(G.obedit->obmat, norm);
view3d_align_axis_to_vector(v3d, axis, norm);
- } else {
- float cent[3], norm[3];
+ } else if (nselverts>2) {
+ float cent[3];
EditVert *eve, *leve= NULL;
- norm[0]= norm[1]= norm[2]= 0.0;
editmesh_calc_selvert_center(cent);
for (eve= em->verts.first; eve; eve= eve->next) {
if (eve->f & SELECT) {
@@ -2508,8 +2501,37 @@ void editmesh_align_view_to_selected(View3D *v3d, int axis)
Mat4Mul3Vecfl(G.obedit->obmat, norm);
view3d_align_axis_to_vector(v3d, axis, norm);
+ } else if (nselverts==2) { /* Align view to edge (or 2 verts) */
+ EditVert *eve, *leve= NULL;
+
+ for (eve= em->verts.first; eve; eve= eve->next) {
+ if (eve->f & SELECT) {
+ if (leve) {
+ norm[0]= leve->co[0] - eve->co[0];
+ norm[1]= leve->co[1] - eve->co[1];
+ norm[2]= leve->co[2] - eve->co[2];
+ break; /* we know there are only 2 verts so no need to keep looking */
+ }
+ leve= eve;
+ }
+ }
+ Mat4Mul3Vecfl(G.obedit->obmat, norm);
+ view3d_align_axis_to_vector(v3d, axis, norm);
+ } else if (nselverts==1) { /* Align view to vert normal */
+ EditVert *eve, *leve= NULL;
+
+ for (eve= em->verts.first; eve; eve= eve->next) {
+ if (eve->f & SELECT) {
+ norm[0]= eve->no[0];
+ norm[1]= eve->no[1];
+ norm[2]= eve->no[2];
+ break; /* we know this is the only selected vert, so no need to keep looking */
+ }
+ }
+ Mat4Mul3Vecfl(G.obedit->obmat, norm);
+ view3d_align_axis_to_vector(v3d, axis, norm);
}
-}
+}
/* **************** VERTEX DEFORMS *************** */