Revision: 45454
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45454
Author:   xercesblue
Date:     2012-04-07 03:15:20 +0000 (Sat, 07 Apr 2012)
Log Message:
-----------
Added Vertex Slide: Slides a vertex along a selected and connected edge 
(Shift+Ctrl+V)
-
BMop: "vertslide vert=%e edge=%hfev distance_t=%f"

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
    trunk/blender/source/blender/bmesh/CMakeLists.txt
    trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    trunk/blender/source/blender/bmesh/intern/bmesh_operators_private.h
    trunk/blender/source/blender/editors/mesh/CMakeLists.txt
    trunk/blender/source/blender/editors/mesh/mesh_intern.h
    trunk/blender/source/blender/editors/mesh/mesh_ops.c

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

Modified: trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_view3d.py 2012-04-07 
02:19:11 UTC (rev 45453)
+++ trunk/blender/release/scripts/startup/bl_ui/space_view3d.py 2012-04-07 
03:15:20 UTC (rev 45454)
@@ -1684,6 +1684,7 @@
         layout.operator("mesh.split")
         layout.operator("mesh.separate")
         layout.operator("mesh.vert_connect")
+        layout.operator("mesh.vert_slide")
 
         layout.separator()
 

Modified: trunk/blender/source/blender/bmesh/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/bmesh/CMakeLists.txt   2012-04-07 02:19:11 UTC 
(rev 45453)
+++ trunk/blender/source/blender/bmesh/CMakeLists.txt   2012-04-07 03:15:20 UTC 
(rev 45454)
@@ -36,6 +36,7 @@
 set(SRC
        operators/bmo_bevel.c
        operators/bmo_connect.c
+       operators/bmo_slide.c
        operators/bmo_create.c
        operators/bmo_dissolve.c
        operators/bmo_dupe.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2012-04-07 
02:19:11 UTC (rev 45453)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2012-04-07 
03:15:20 UTC (rev 45454)
@@ -1103,6 +1103,23 @@
        0
 };
 
+/*
+ * Vertex Slide
+ *
+ * Translates vertes along an edge
+ */
+static BMOpDefine bmo_vert_slide_def = {
+"vertslide",
+       {{BMO_OP_SLOT_ELEMENT_BUF, "vert"},
+        {BMO_OP_SLOT_ELEMENT_BUF, "edge"},
+        {BMO_OP_SLOT_ELEMENT_BUF, "vertout"},
+        {BMO_OP_SLOT_FLT, "distance_t"},
+        {0} /* null-terminating sentinel */},
+       bmo_vert_slide_exec,
+       BMO_OP_FLAG_UNTAN_MULTIRES
+};
+
+
 BMOpDefine *opdefines[] = {
        &bmo_split_def,
        &bmo_spin_def,
@@ -1170,6 +1187,7 @@
        &bmo_bridge_loops_def,
        &bmo_solidify_def,
        &bmo_inset_def,
+       &bmo_vert_slide_def,
 };
 
 int bmesh_total_ops = (sizeof(opdefines) / sizeof(void *));

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators_private.h 
2012-04-07 02:19:11 UTC (rev 45453)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators_private.h 
2012-04-07 03:15:20 UTC (rev 45454)
@@ -43,6 +43,7 @@
 void bmo_dissolve_verts_exec(BMesh *bmesh, BMOperator *op);
 void bmo_dissolve_limit_exec(BMesh *bmesh, BMOperator *op);
 void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op);
+void bmo_vert_slide_exec(BMesh *bm, BMOperator *op);
 void bmo_connectverts_exec(BMesh *bm, BMOperator *op);
 void bmo_extrude_vert_indiv_exec(BMesh *bm, BMOperator *op);
 void bmo_mesh_to_bmesh_exec(BMesh *bm, BMOperator *op);

Added: trunk/blender/source/blender/bmesh/operators/bmo_slide.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_slide.c                    
        (rev 0)
+++ trunk/blender/source/blender/bmesh/operators/bmo_slide.c    2012-04-07 
03:15:20 UTC (rev 45454)
@@ -0,0 +1,122 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Francisco De La Cruz
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/bmesh/operators/bmo_slide.c
+*  \ingroup bmesh
+*/
+
+#include "MEM_guardedalloc.h"
+
+#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
+#define VERT_MARK 2
+
+/*
+ * Slides a vertex along a connected edge
+ *
+ */
+void bmo_vert_slide_exec(BMesh *bm, BMOperator *op)
+{
+       BMOIter oiter;
+       BMIter iter;
+       BMHeader *h;
+       BMVert *vertex;
+       BMEdge *edge;
+       int is_start_v1 = 0;
+
+       /* Selection counts */
+       int selected_verts = 0;
+       int selected_edges = 0;
+
+       /* Get slide amount */
+       const float distance_t = BMO_slot_float_get(op, "distance_t");
+
+       /* Get start vertex */
+       vertex = BMO_iter_new(&oiter, bm, op, "vert", BM_VERT);
+
+
+       if (!vertex) {
+               if (G.debug & G_DEBUG)
+                       fprintf(stderr, "vertslide: No vertex selected...");
+               return;
+       }
+
+       /* Count selected edges */
+       BMO_ITER(h, &oiter, bm, op, "edge", BM_VERT | BM_EDGE) {
+               switch (h->htype) {
+                       case BM_VERT:
+                               selected_verts++;
+                               break;
+                       case BM_EDGE:
+                               selected_edges++;
+                               /* Mark all selected edges (cast 
BMHeader->BMEdge) */
+                               BMO_elem_flag_enable(bm, (BMElemF *)h, 
EDGE_MARK);
+                               break;
+               }
+       }
+
+       /* Only allow sliding between two verts */
+
+       if (selected_verts != 2 || selected_edges == 0) {
+               if (G.debug & G_DEBUG)
+                       fprintf(stderr, "vertslide: select a single edge\n");
+               return;
+       }
+
+       /* Make sure we get the correct edge. */
+       BM_ITER(edge, &iter, bm, BM_EDGES_OF_VERT, vertex) {
+               if (BMO_elem_flag_test(bm, edge, EDGE_MARK)) {
+                       is_start_v1 = (edge->v1 == vertex);
+                       break;
+               }
+       }
+
+       /* Found edge */
+       if (edge) {
+               BMVert *other = BM_edge_other_vert(edge, vertex);
+
+               /* mark */
+               BMO_elem_flag_enable(bm, vertex, VERT_MARK);
+
+               /* Interpolate */
+               interp_v3_v3v3(vertex->co, vertex->co, other->co, distance_t);
+       }
+
+       /* Deselect the edges */
+       BMO_slot_buffer_hflag_disable(bm, op, "edge", BM_ALL, BM_ELEM_SELECT, 
TRUE);
+
+       /* Return the new edge. The same previously marked with VERT_MARK */
+       BMO_slot_buffer_from_enabled_flag(bm, op, "vertout", BM_VERT, 
VERT_MARK);
+       return;
+}
+
+#undef EDGE_MARK
+#undef VERT_MARK

Modified: trunk/blender/source/blender/editors/mesh/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/editors/mesh/CMakeLists.txt    2012-04-07 
02:19:11 UTC (rev 45453)
+++ trunk/blender/source/blender/editors/mesh/CMakeLists.txt    2012-04-07 
03:15:20 UTC (rev 45454)
@@ -46,6 +46,7 @@
        editmesh_select.c
        editmesh_tools.c
        editmesh_utils.c
+       editmesh_slide.c
        mesh_data.c
        mesh_ops.c
        meshtools.c

Added: trunk/blender/source/blender/editors/mesh/editmesh_slide.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_slide.c                  
        (rev 0)
+++ trunk/blender/source/blender/editors/mesh/editmesh_slide.c  2012-04-07 
03:15:20 UTC (rev 45454)
@@ -0,0 +1,695 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Francisco De La Cruz
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* 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"
+#include "ED_space_api.h"
+
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "mesh_intern.h"
+
+#define VTX_SLIDE_SLIDE_SENS_F 15.0f
+#define VTX_SLIDE_SNAP_THRSH    0.3f
+
+/* Cusom VertexSlide Operator data */
+typedef struct VertexSlideOp {
+       /* Starting Vertex */
+       BMVert *start_vtx;
+       BMEdge *sel_edge;
+
+       ViewContext *view_context;
+       ARegion *active_region;
+
+       /* Draw callback handle */
+       void *draw_handle;
+
+       /* Active Object */
+       Object *obj;
+
+       /* Are we in slide mode */
+       int slide_mode;
+       int snap_n_weld;
+       int snap_to_end_vtx;
+       int snap_to_mid;
+
+       float distance;
+       float interp[3];
+
+       /* Edge Frame Count */
+       int disk_edges;
+
+       /* Edges */
+       BMEdge** edge_frame;
+
+       /* Slide Frame Endpoints */
+       float (*vtx_frame)[3];
+
+       /* Mouse Click 2d pos */
+       int m_co[2];
+
+} VertexSlideOp;
+
+static void vtx_slide_draw(const bContext *C, ARegion *ar, void *arg);
+static int edbm_vert_slide_exec(bContext *C, wmOperator *op);
+static void vtx_slide_exit(const bContext *C, wmOperator *op);
+static void vtx_slide_set_frame(VertexSlideOp *vso);
+
+static int vtx_slide_init(bContext *C, wmOperator *op)
+{
+       Object *obedit = CTX_data_edit_object(C);
+       BMEditMesh *em = BMEdit_FromObject(obedit);
+       BMEditSelection *ese = em->bm->selected.first;
+
+       /* Custom data */
+       VertexSlideOp *vso;
+
+       const char *header_str = "Vertex Slide: Hover over an edge and 
left-click to select slide edge. "
+                                "Left-Shift: Midpoint Snap, Left-Alt: Snap, 
Left-Ctrl: Snap&Weld";
+
+       if (!obedit) {
+               BKE_report(op->reports, RPT_ERROR, "Vertex Slide Error: Not 
object in context");
+               return FALSE;
+       }
+
+       EDBM_selectmode_flush(em);
+       ese = em->bm->selected.first;
+
+       /* Is there a starting vertex  ? */
+       if (ese == NULL || ese->htype != BM_VERT) {

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to