[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45456] trunk/blender/source/blender: fix for vertex slide not taking object transformation into account.

Campbell Barton ideasman42 at gmail.com
Sat Apr 7 15:42:01 CEST 2012


Revision: 45456
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45456
Author:   campbellbarton
Date:     2012-04-07 13:42:00 +0000 (Sat, 07 Apr 2012)
Log Message:
-----------
fix for vertex slide not taking object transformation into account.

also make the shortcut 'Shift+V'

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/operators/bmo_slide.c
    trunk/blender/source/blender/editors/mesh/editmesh_slide.c
    trunk/blender/source/blender/editors/mesh/mesh_ops.c

Modified: trunk/blender/source/blender/bmesh/operators/bmo_slide.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_slide.c	2012-04-07 12:37:15 UTC (rev 45455)
+++ trunk/blender/source/blender/bmesh/operators/bmo_slide.c	2012-04-07 13:42:00 UTC (rev 45456)
@@ -29,11 +29,8 @@
 #include "BKE_global.h"
 
 #include "BLI_math.h"
-#include "BLI_array.h"
-#include "BLI_utildefines.h"
 
 #include "bmesh.h"
-
 #include "intern/bmesh_operators_private.h" /* own include */
 
 #define EDGE_MARK 1

Modified: trunk/blender/source/blender/editors/mesh/editmesh_slide.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_slide.c	2012-04-07 12:37:15 UTC (rev 45455)
+++ trunk/blender/source/blender/editors/mesh/editmesh_slide.c	2012-04-07 13:42:00 UTC (rev 45456)
@@ -20,36 +20,26 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
+/** \file blender/editors/mesh/editmesh_slide.c
+ *  \ingroup edmesh
+ */
+
 /* Takes heavily from editmesh_loopcut.c */
 
-#include <float.h>
-#include <string.h>
-#include <ctype.h>
-#include <stdio.h>
-
 #include "DNA_object_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_userdef_types.h"
-#include "DNA_space_types.h"
 
 #include "MEM_guardedalloc.h"
 
 #include "BLI_array.h"
-#include "BLI_blenlib.h"
 #include "BLI_math.h"
-#include "BLI_utildefines.h"
 
-#include "BKE_blender.h"
 #include "BKE_context.h"
-#include "BKE_depsgraph.h"
-#include "BKE_mesh.h"
 #include "BKE_report.h"
 #include "BKE_tessmesh.h"
 
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
 
-
 #include "ED_screen.h"
 #include "ED_view3d.h"
 #include "ED_mesh.h"
@@ -129,7 +119,7 @@
 	}
 
 	EDBM_selectmode_flush(em);
-	ese = em->bm->selected.first;
+	ese = em->bm->selected.last;
 
 	/* Is there a starting vertex  ? */
 	if (ese == NULL || ese->htype != BM_VERT) {
@@ -210,7 +200,8 @@
 	
 		EDBM_op_callf(em, op, "pointmerge verts=%hv mergeco=%v", BM_ELEM_SELECT, other->co);
 		EDBM_flag_disable_all(em, BM_ELEM_SELECT);
-	} else {
+	}
+	else {
 		/* Store edit selection of the active vertex, allows other
 		 *  ops to run without reselecting */
 		EDBM_editselection_store(em, &vso->start_vtx->head);
@@ -268,8 +259,9 @@
 	if (vso && vso->sel_edge) {
 		/* Get 3d view */
 		View3D *view3d = CTX_wm_view3d(C);
-		int outline_w = UI_GetThemeValuef(TH_OUTLINE_WIDTH) + 1;
+		const int outline_w = UI_GetThemeValuef(TH_OUTLINE_WIDTH) + 1;
 		int i = 0;
+
 		if (view3d && view3d->zbuf)
 			glDisable(GL_DEPTH_TEST);
 
@@ -335,10 +327,16 @@
 		float v1_proj[3], v2_proj[3];
 		float dist = 0;
 		float min_dist = FLT_MAX;
+
 		for (i = 0; i < vso->disk_edges; i++) {
 			edge = vso->edge_frame[i];
-			project_float_noclip(vso->active_region, edge->v1->co, v1_proj);
-			project_float_noclip(vso->active_region, edge->v2->co, v2_proj);
+
+			mul_v3_m4v3(v1_proj, vso->obj->obmat, edge->v1->co);
+			project_float_noclip(vso->active_region, v1_proj, v1_proj);
+
+			mul_v3_m4v3(v2_proj, vso->obj->obmat, edge->v2->co);
+			project_float_noclip(vso->active_region, v2_proj, v2_proj);
+
 			dist = dist_to_line_segment_v2(mval, v1_proj, v2_proj);
 			if (dist < min_dist) {
 				min_dist = dist;
@@ -357,11 +355,10 @@
 	/* Temp Vtx */
 	BMVert *start_vtx = vso->start_vtx;
 
-	float mval_float[] = { (float)event->mval[0], (float)event->mval[1]};
+	const float mval_float[] = { (float)event->mval[0], (float)event->mval[1]};
 
 	/* Set mouse coords */
-	vso->view_context->mval[0] = event->mval[0];
-	vso->view_context->mval[1] = event->mval[1];
+	copy_v2_v2_int(vso->view_context->mval, event->mval);
 
 	/* Find nearest edge */
 	nst_edge = vtx_slide_nrst_in_frame(vso, mval_float);
@@ -370,8 +367,7 @@
 		/* Find a connected edge */
 		if (nst_edge->v1 == start_vtx || nst_edge->v2 == start_vtx) {
 			/* Save mouse coords */
-			vso->m_co[0] = event->mval[0];
-			vso->m_co[1] = event->mval[1];
+			copy_v2_v2_int(vso->m_co, event->mval);
 
 			/* Set edge */
 			vso->sel_edge = nst_edge;
@@ -383,13 +379,15 @@
 static void vtx_slide_update(VertexSlideOp *vso, wmEvent *event)
 {
 	BMEdge *edge;
-	float edge_other_proj[3];
-	float start_vtx_proj[3];
-	BMVert *other;
+
 	/* Find nearest edge */
 	edge = vso->sel_edge;
 
 	if (edge) {
+		float edge_other_proj[3];
+		float start_vtx_proj[3];
+		BMVert *other;
+
 		float interp[3];
 
 		/* Calculate interpolation value for preview */
@@ -401,9 +399,11 @@
 		other = BM_edge_other_vert(edge, vso->start_vtx);
 
 		/* Project points onto screen and do interpolation in 2D */
-		project_float_noclip(vso->active_region, vso->start_vtx->co, start_vtx_proj);
+		mul_v3_m4v3(start_vtx_proj, vso->obj->obmat, vso->start_vtx->co);
+		project_float_noclip(vso->active_region, start_vtx_proj, start_vtx_proj);
 
-		project_float_noclip(vso->active_region, other->co, edge_other_proj);
+		mul_v3_m4v3(edge_other_proj, vso->obj->obmat, other->co);
+		project_float_noclip(vso->active_region, edge_other_proj, edge_other_proj);
 
 		closest_to_line_v2(closest_2d, mval_float, start_vtx_proj, edge_other_proj);
 
@@ -476,10 +476,7 @@
 	{
 		BLI_array_growone(vtx_frame);
 
-		if (sel_vtx == edge->v1)
-			copy_v3_v3(vtx_frame[idx], edge->v2->co);
-		else
-			copy_v3_v3(vtx_frame[idx], edge->v1->co);
+		copy_v3_v3(vtx_frame[idx], BM_edge_other_vert(edge, sel_vtx)->co);
 
 		BLI_array_append(edge_frame, edge);
 		vso->disk_edges++;
@@ -621,6 +618,7 @@
 	/* Invoked modally? */
 	if (op->type->modal == edbm_vert_slide_modal && op->customdata) {
 		VertexSlideOp *vso = op->customdata;
+
 		if (bm->totedgesel > 1) {
 			EDBM_flag_disable_all(em, BM_ELEM_SELECT);
 			BM_edge_select_set(bm, vso->sel_edge, TRUE);

Modified: trunk/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_ops.c	2012-04-07 12:37:15 UTC (rev 45455)
+++ trunk/blender/source/blender/editors/mesh/mesh_ops.c	2012-04-07 13:42:00 UTC (rev 45456)
@@ -337,7 +337,7 @@
 	WM_keymap_add_item(keymap, "MESH_OT_vert_connect", JKEY, KM_PRESS, 0, 0);
 
 	/* Vertex Slide */
-	WM_keymap_add_item(keymap, "MESH_OT_vert_slide", VKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
+	WM_keymap_add_item(keymap, "MESH_OT_vert_slide", VKEY, KM_PRESS, KM_SHIFT, 0);
 	/* use KM_CLICK because same key is used for tweaks */
 	kmi = WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", ACTIONMOUSE, KM_CLICK, KM_CTRL, 0);
 	RNA_boolean_set(kmi->ptr, "rotate_source", TRUE);




More information about the Bf-blender-cvs mailing list