Adding Knife tool as to be released in 2.3
authorRobert Wenzlaff <rwenzlaff@soylent-green.com>
Sun, 19 Oct 2003 19:50:17 +0000 (19:50 +0000)
committerRobert Wenzlaff <rwenzlaff@soylent-green.com>
Sun, 19 Oct 2003 19:50:17 +0000 (19:50 +0000)
User Info:
To use this tool, select a group of verts, it can be larger than the
desired cut as explained below.  Then hit Shift-K.
The tool will  prompt for cut type (Exact line or Edge centers),
Select, then use LMB to draw a "cut-line".  Holding down LMB causes
a freehand draw, clicking LMB causes a polyline draw.  MMB locks the axis.
When done press enter to divide mesh on cut line. Subdivide routines have
been modified to produce fewer triangles as part of this tool.
Edge Centers preserves UV info, Exact Line does not (it will be there, just
slightly distorted).

Since the cut line exists in 2D space, and does not make a persistant
selection that can be modified in another 3D view, the knife selection
is the AND of the vertex selection and the knife line, ie; the edge will
be subdivided only if both verts are selected, and the knife line crosses
the edge.  Select your verts first, but you don't have to be overly
precise. If you want to cut a few faces on the front of a sphere, you
can select the whole front of the sphere, then knife the faces you want.

Coder Info:
KnifeSubdivide is called with 1 of 3 modes. KNIFE_PROMPT, KNIFE_EXACT,
KNIFE_MIDPOINTS.  The hotkey calls KNIFE_PROMPT.  When adding to a menu
or button, explicitly call out the mode.

Part of the tool provides get_mouse_trail() that returns a CutCurve struct
that defines a knife line.  There are modes defined, but currently they are not
implimented.

Another part of this tool defines new behaviour for subdivideflag().
Setting beauty param to B_KNIFE tells subdivideflag() that the edges
are preselected ans to skip the vert check.  Also setting B_PERCENTSUB tells
subdivideflag() to divide the edge at a percentage of the distance from
eed->v1 to eed->v2.  This percentage is passed in the eed->f1 flag as a
short (ie, setting eed->f1 to 16384 cuts the edge half-way).

source/blender/include/BIF_editmesh.h
source/blender/src/editmesh.c
source/blender/src/space.c

index 1a91d31750ebed3f3bd835692794a8ea983a51eb..6cff0bdb692ef060edde3664541a655009dc989f 100644 (file)
@@ -54,8 +54,17 @@ typedef struct CutCurve {
        short  y;
 } CutCurve;
 
-void KnifeSubdivide(void);
-CutCurve *get_mouse_trail(int * length);
+void KnifeSubdivide(char mode);
+#define KNIFE_PROMPT 0
+#define KNIFE_EXACT 1
+#define KNIFE_MIDPOINT 2
+
+CutCurve *get_mouse_trail(int * length, char mode);
+#define TRAIL_POLYLINE 1 /* For future use, They don't do anything yet */
+#define TRAIL_FREEHAND 2
+#define TRAIL_MIXED    3 
+#define TRAIL_AUTO     4 
+
 short seg_intersect(struct EditEdge * e, CutCurve *c, int len);
 /* End Knife Subdiv */
 
index cee9b4dc5f71a3dde910afcfce679fe5022beac6..e390bfe463bc96aac98c71add3524e9d66381de2 100644 (file)
@@ -6862,7 +6862,7 @@ It is up to the caller to free the block when done with it,
 this doesn't belong here.....
  */
 
-CutCurve *get_mouse_trail(int *len){
+CutCurve *get_mouse_trail(int *len, char mode){
 
        CutCurve *curve,*temp;
        short event, val, ldown=0, restart=0, rubberband=0;
@@ -6880,6 +6880,8 @@ CutCurve *get_mouse_trail(int *len){
        glDrawBuffer(GL_FRONT);
 
        persp(PERSP_WIN);
+       
+       headerprint("LMB to draw, Enter to finish, ESC to abort.");
 
        event=extern_qread(&val);
        while((event != RETKEY ) && (event != RIGHTMOUSE) ){  
@@ -6980,17 +6982,17 @@ CutCurve *get_mouse_trail(int *len){
        
        Currently mapped to KKey when in MeshEdit mode.
        Usage:
-               Hit K, 
+               Hit Shift K, Select Centers or Exact
                Hold LMB down to draw path, hit RETKEY.
                ESC cancels as expected.
    
        Contributed by Robert Wenzlaff (Det. Thorn).
 */
 
-void KnifeSubdivide(){
+void KnifeSubdivide(char mode){
 
        int oldcursor, len=0;
-       short isect=0, mode=0;
+       short isect=0;
        CutCurve *curve;                
        EditEdge *eed;  
        
@@ -7001,10 +7003,10 @@ void KnifeSubdivide(){
        set_cursor(CURSOR_PENCIL); 
        
        calc_meshverts_ext();  /*Update screen coords for current window */
+               
+       if (mode==KNIFE_PROMPT) mode=pupmenu("Cut Type %t|Exact Line%x1|Centers%x2|");
        
-       curve=get_mouse_trail(&len);
-       
-       if (curve) mode=pupmenu("Cut Type %t|Intersect%x1|50%%x2|");
+       curve=get_mouse_trail(&len, TRAIL_MIXED);
        
        if (curve && len && mode){
                eed= G.eded.first;              
index 80ac9ae7cd55943b5b5af08f9a8aeb855b861686..7877a7c3423aa864ba35a5c0af08ea8616ac4b68 100644 (file)
@@ -1019,7 +1019,7 @@ void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                        case KKEY:
                                if(G.obedit) {
                                        if (G.qual & LR_SHIFTKEY ){
-                                               if (G.obedit->type==OB_MESH) KnifeSubdivide();
+                                               if (G.obedit->type==OB_MESH) KnifeSubdivide(KNIFE_PROMPT);
                                        }
                                        else if(G.obedit->type==OB_SURF) printknots();
                                }