Convert and Delete only selected strokes.
Convert no longer remove converted strokes. Akey -> select all/deselect all strokes
This commit is contained in:
parent
e9b4080354
commit
718c0d5d70
|
@ -151,9 +151,6 @@ typedef struct Global {
|
|||
|
||||
/* confusing... G.f and G.flags */
|
||||
int flags;
|
||||
|
||||
int bone_sketching; /* regroup with edbo into an EditArmature struct */
|
||||
|
||||
} Global;
|
||||
|
||||
/* **************** GLOBAL ********************* */
|
||||
|
|
|
@ -23,8 +23,10 @@
|
|||
#ifndef BIF_SKETCH_H
|
||||
#define BIF_SKETCH_H
|
||||
|
||||
int BIF_paintSketch();
|
||||
int BIF_paintSketch(short mbut);
|
||||
void BIF_convertSketch();
|
||||
void BIF_deleteSketch();
|
||||
void BIF_selectAllSketch(int mode); /* -1: deselect, 0: select, 1: toggle */
|
||||
int BIF_validSketchMode();
|
||||
|
||||
#endif /* BIF_SKETCH_H */
|
||||
|
|
|
@ -438,9 +438,12 @@ typedef struct ToolSettings {
|
|||
char skgen_postpro_passes;
|
||||
char skgen_subdivisions[3];
|
||||
|
||||
/* Skeleton Sketching */
|
||||
char bone_sketching;
|
||||
|
||||
/* Alt+RMB option */
|
||||
char edge_mode;
|
||||
char pad3[4];
|
||||
char pad3[3];
|
||||
} ToolSettings;
|
||||
|
||||
/* Used by all brushes to store their properties, which can be directly set
|
||||
|
@ -854,6 +857,9 @@ typedef struct Scene {
|
|||
#define SKGEN_AVERAGE 1
|
||||
#define SKGEN_SHARPEN 2
|
||||
|
||||
/* toolsettings->bone_sketching */
|
||||
#define BONE_SKETCHING 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -2300,7 +2300,7 @@ static void view3d_panel_bonesketch_spaces(short cntrl)
|
|||
uiBlockBeginAlign(block);
|
||||
|
||||
/* use real flag instead of 1 */
|
||||
uiDefButBitI(block, TOG, 1, B_REDR, "Use Bone Sketching", 10, 225, 150, 20, &G.bone_sketching, 0, 0, 0, 0, "Use sketching to create and edit bones");
|
||||
uiDefButBitC(block, TOG, BONE_SKETCHING, B_REDR, "Use Bone Sketching", 10, 225, 150, 20, &G.scene->toolsettings->bone_sketching, 0, 0, 0, 0, "Use sketching to create and edit bones");
|
||||
but = uiDefBut(block, BUT, B_REDR, "Convert", 10,205,150,20, 0, 0, 0, 0, 0, "Convert sketch to armature");
|
||||
uiButSetFunc(but, convert_sketch_armature, NULL, NULL);
|
||||
but = uiDefBut(block, BUT, B_REDR, "Delete", 10,185,150,20, 0, 0, 0, 0, 0, "Delete sketch");
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
#include "BIF_space.h"
|
||||
#include "BIF_mywindow.h"
|
||||
#include "BIF_editarmature.h"
|
||||
#include "BIF_sketch.h"
|
||||
|
||||
#include "blendef.h"
|
||||
#include "mydevice.h"
|
||||
|
@ -100,6 +101,8 @@ typedef struct SK_Sketch
|
|||
SK_Sketch *GLOBAL_sketch = NULL;
|
||||
SK_Point boneSnap;
|
||||
|
||||
#define SNAP_MIN_DISTANCE 12
|
||||
|
||||
/******************** PROTOTYPES ******************************/
|
||||
|
||||
void sk_freeStroke(SK_Stroke *stk);
|
||||
|
@ -762,13 +765,18 @@ void sk_interpolateDepth(SK_Stroke *stk, int start, int end, float length, float
|
|||
}
|
||||
}
|
||||
|
||||
void sk_addStrokeSnapPoint(SK_Stroke *stk, SK_DrawData *dd, SK_Point *snap_pt)
|
||||
int sk_addStrokeSnapPoint(SK_Stroke *stk, SK_DrawData *dd, SK_Point *snap_pt)
|
||||
{
|
||||
SK_Point pt;
|
||||
float distance;
|
||||
float length;
|
||||
int i, total;
|
||||
|
||||
if (snap_pt == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
pt.type = PT_EXACT;
|
||||
pt.mode = PT_SNAP;
|
||||
|
||||
|
@ -797,9 +805,11 @@ void sk_addStrokeSnapPoint(SK_Stroke *stk, SK_DrawData *dd, SK_Point *snap_pt)
|
|||
}
|
||||
|
||||
VECCOPY(stk->points[stk->nb_points - 1].p, snap_pt->p);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void sk_addStrokeDrawPoint(SK_Stroke *stk, SK_DrawData *dd)
|
||||
int sk_addStrokeDrawPoint(SK_Stroke *stk, SK_DrawData *dd)
|
||||
{
|
||||
SK_Point pt;
|
||||
|
||||
|
@ -809,15 +819,18 @@ void sk_addStrokeDrawPoint(SK_Stroke *stk, SK_DrawData *dd)
|
|||
sk_projectPaintData(stk, dd, pt.p);
|
||||
|
||||
sk_appendStrokePoint(stk, &pt);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void sk_addStrokeEmbedPoint(SK_Stroke *stk, SK_DrawData *dd)
|
||||
int sk_addStrokeEmbedPoint(SK_Stroke *stk, SK_DrawData *dd)
|
||||
{
|
||||
ListBase depth_peels;
|
||||
SK_DepthPeel *p1, *p2;
|
||||
SK_Point *last_pt = NULL;
|
||||
float dist = FLT_MAX;
|
||||
float p[3];
|
||||
int point_added = 0;
|
||||
|
||||
depth_peels.first = depth_peels.last = NULL;
|
||||
|
||||
|
@ -874,11 +887,7 @@ void sk_addStrokeEmbedPoint(SK_Stroke *stk, SK_DrawData *dd)
|
|||
}
|
||||
}
|
||||
|
||||
if (dist == FLT_MAX)
|
||||
{
|
||||
sk_addStrokeDrawPoint(stk, dd);
|
||||
}
|
||||
else
|
||||
if (dist != FLT_MAX)
|
||||
{
|
||||
SK_Point pt;
|
||||
float length, distance;
|
||||
|
@ -912,9 +921,13 @@ void sk_addStrokeEmbedPoint(SK_Stroke *stk, SK_DrawData *dd)
|
|||
}
|
||||
|
||||
VECCOPY(stk->points[stk->nb_points - 1].p, p);
|
||||
|
||||
point_added = 1;
|
||||
}
|
||||
|
||||
BLI_freelistN(&depth_peels);
|
||||
|
||||
return point_added;
|
||||
}
|
||||
|
||||
void sk_endContinuousStroke(SK_Stroke *stk)
|
||||
|
@ -995,16 +1008,68 @@ void sk_convert(SK_Sketch *sketch)
|
|||
|
||||
for (stk = sketch->strokes.first; stk; stk = stk->next)
|
||||
{
|
||||
sk_convertStroke(stk);
|
||||
if (stk->selected == 1)
|
||||
{
|
||||
sk_convertStroke(stk);
|
||||
}
|
||||
}
|
||||
|
||||
BLI_freelistN(&sketch->strokes);
|
||||
}
|
||||
/********************************************/
|
||||
|
||||
void sk_selectStroke(SK_Sketch *sketch)
|
||||
void sk_deleteStrokes(SK_Sketch *sketch)
|
||||
{
|
||||
SK_Stroke *stk, *next;
|
||||
|
||||
for (stk = sketch->strokes.first; stk; stk = next)
|
||||
{
|
||||
next = stk->next;
|
||||
|
||||
if (stk->selected == 1)
|
||||
{
|
||||
BLI_remlink(&sketch->strokes, stk);
|
||||
sk_freeStroke(stk);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sk_selectAllSketch(SK_Sketch *sketch, int mode)
|
||||
{
|
||||
SK_Stroke *stk = NULL;
|
||||
|
||||
if (mode == -1)
|
||||
{
|
||||
for (stk = sketch->strokes.first; stk; stk = stk->next)
|
||||
{
|
||||
stk->selected = 0;
|
||||
}
|
||||
}
|
||||
else if (mode == 0)
|
||||
{
|
||||
for (stk = sketch->strokes.first; stk; stk = stk->next)
|
||||
{
|
||||
stk->selected = 1;
|
||||
}
|
||||
}
|
||||
else if (mode == 1)
|
||||
{
|
||||
int selected = 1;
|
||||
|
||||
for (stk = sketch->strokes.first; stk; stk = stk->next)
|
||||
{
|
||||
selected &= stk->selected;
|
||||
}
|
||||
|
||||
selected ^= 1;
|
||||
|
||||
for (stk = sketch->strokes.first; stk; stk = stk->next)
|
||||
{
|
||||
stk->selected = selected;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sk_selectStroke(SK_Sketch *sketch)
|
||||
{
|
||||
unsigned int buffer[MAXPICKBUF];
|
||||
short hits, mval[2];
|
||||
|
||||
|
@ -1031,18 +1096,18 @@ void sk_selectStroke(SK_Sketch *sketch)
|
|||
{
|
||||
SK_Stroke *selected_stk = BLI_findlink(&sketch->strokes, besthitresult);
|
||||
|
||||
selected_stk->selected ^= 1;
|
||||
|
||||
if ((G.qual & LR_SHIFTKEY) == 0)
|
||||
{
|
||||
for (stk = sketch->strokes.first; stk; stk = stk->next)
|
||||
{
|
||||
if (stk != selected_stk)
|
||||
{
|
||||
stk->selected = 0;
|
||||
}
|
||||
}
|
||||
sk_selectAllSketch(sketch, -1);
|
||||
|
||||
selected_stk->selected = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
selected_stk->selected ^= 1;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1110,7 +1175,7 @@ void sk_drawSketch(SK_Sketch *sketch, int with_names)
|
|||
|
||||
if (G.qual & LR_CTRLKEY)
|
||||
{
|
||||
SK_Point *snap_pt = sk_snapPoint(sketch, dd.mval, 30);
|
||||
SK_Point *snap_pt = sk_snapPoint(sketch, dd.mval, SNAP_MIN_DISTANCE);
|
||||
|
||||
if (snap_pt != NULL)
|
||||
{
|
||||
|
@ -1152,26 +1217,22 @@ int sk_paint(SK_Sketch *sketch, short mbut)
|
|||
|
||||
/* only add current point to buffer if mouse moved (otherwise wait until it does) */
|
||||
if (sk_stroke_filtermval(&dd)) {
|
||||
int point_added = 0;
|
||||
|
||||
if (G.qual & LR_CTRLKEY)
|
||||
{
|
||||
SK_Point *snap_pt = sk_snapPoint(sketch, dd.mval, 30);
|
||||
|
||||
if (snap_pt != NULL)
|
||||
{
|
||||
sk_addStrokeSnapPoint(sketch->active_stroke, &dd, snap_pt);
|
||||
}
|
||||
else
|
||||
{
|
||||
sk_addStrokeDrawPoint(sketch->active_stroke, &dd);
|
||||
}
|
||||
SK_Point *snap_pt = sk_snapPoint(sketch, dd.mval, SNAP_MIN_DISTANCE);
|
||||
point_added = sk_addStrokeSnapPoint(sketch->active_stroke, &dd, snap_pt);
|
||||
}
|
||||
else if (G.qual & LR_SHIFTKEY)
|
||||
|
||||
if (point_added == 0 && G.qual & LR_SHIFTKEY)
|
||||
{
|
||||
sk_addStrokeEmbedPoint(sketch->active_stroke, &dd);
|
||||
point_added = sk_addStrokeEmbedPoint(sketch->active_stroke, &dd);
|
||||
}
|
||||
else
|
||||
|
||||
if (point_added == 0)
|
||||
{
|
||||
sk_addStrokeDrawPoint(sketch->active_stroke, &dd);
|
||||
point_added = sk_addStrokeDrawPoint(sketch->active_stroke, &dd);
|
||||
}
|
||||
|
||||
sk_updateDrawData(&dd);
|
||||
|
@ -1214,7 +1275,7 @@ int sk_paint(SK_Sketch *sketch, short mbut)
|
|||
|
||||
void BDR_drawSketchNames()
|
||||
{
|
||||
if (G.bone_sketching & 1)
|
||||
if (BIF_validSketchMode())
|
||||
{
|
||||
if (GLOBAL_sketch != NULL)
|
||||
{
|
||||
|
@ -1225,7 +1286,7 @@ void BDR_drawSketchNames()
|
|||
|
||||
void BDR_drawSketch()
|
||||
{
|
||||
if (G.bone_sketching & 1)
|
||||
if (BIF_validSketchMode())
|
||||
{
|
||||
if (GLOBAL_sketch != NULL)
|
||||
{
|
||||
|
@ -1236,16 +1297,15 @@ void BDR_drawSketch()
|
|||
|
||||
void BIF_deleteSketch()
|
||||
{
|
||||
if (GLOBAL_sketch != NULL)
|
||||
if (BIF_validSketchMode())
|
||||
{
|
||||
sk_freeSketch(GLOBAL_sketch);
|
||||
GLOBAL_sketch = NULL;
|
||||
sk_deleteStrokes(GLOBAL_sketch);
|
||||
}
|
||||
}
|
||||
|
||||
void BIF_convertSketch()
|
||||
{
|
||||
if (G.bone_sketching & 1)
|
||||
if (BIF_validSketchMode())
|
||||
{
|
||||
if (GLOBAL_sketch != NULL)
|
||||
{
|
||||
|
@ -1256,7 +1316,7 @@ void BIF_convertSketch()
|
|||
|
||||
int BIF_paintSketch(short mbut)
|
||||
{
|
||||
if (G.bone_sketching & 1)
|
||||
if (BIF_validSketchMode())
|
||||
{
|
||||
if (GLOBAL_sketch == NULL)
|
||||
{
|
||||
|
@ -1273,7 +1333,7 @@ int BIF_paintSketch(short mbut)
|
|||
|
||||
void BDR_queueDrawSketch()
|
||||
{
|
||||
if (G.bone_sketching & 1)
|
||||
if (BIF_validSketchMode())
|
||||
{
|
||||
if (GLOBAL_sketch != NULL)
|
||||
{
|
||||
|
@ -1281,3 +1341,29 @@ void BDR_queueDrawSketch()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BIF_selectAllSketch(int mode)
|
||||
{
|
||||
if (BIF_validSketchMode())
|
||||
{
|
||||
if (GLOBAL_sketch != NULL)
|
||||
{
|
||||
sk_selectAllSketch(GLOBAL_sketch, mode);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int BIF_validSketchMode()
|
||||
{
|
||||
if (G.obedit &&
|
||||
G.obedit->type == OB_ARMATURE &&
|
||||
G.scene->toolsettings->bone_sketching & BONE_SKETCHING)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1899,7 +1899,16 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
|||
else if(G.obedit->type==OB_LATTICE)
|
||||
deselectall_Latt();
|
||||
else if(G.obedit->type==OB_ARMATURE)
|
||||
deselectall_armature(1, 1); /* 1 == toggle */
|
||||
{
|
||||
if (G.scene->toolsettings->bone_sketching & BONE_SKETCHING)
|
||||
{
|
||||
BIF_selectAllSketch(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
deselectall_armature(1, 1); /* 1 == toggle */
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (ob && (ob->flag & OB_POSEMODE)){
|
||||
deselectall_posearmature(ob, 1, 1);
|
||||
|
|
|
@ -83,6 +83,7 @@
|
|||
#include "BDR_drawobject.h" /* For draw_object */
|
||||
#include "BDR_editface.h" /* For minmax_tface */
|
||||
#include "BDR_sculptmode.h"
|
||||
#include "BDR_sketch.h"
|
||||
|
||||
#include "mydevice.h"
|
||||
#include "blendef.h"
|
||||
|
@ -1883,7 +1884,7 @@ short view3d_opengl_select(unsigned int *buffer, unsigned int bufsize, short x1
|
|||
draw_object(BASACT, DRAW_PICKING|DRAW_CONSTCOLOR);
|
||||
}
|
||||
else if ((G.obedit && G.obedit->type==OB_ARMATURE)) {
|
||||
if (G.bone_sketching & 1)
|
||||
if (G.scene->toolsettings->bone_sketching & BONE_SKETCHING)
|
||||
{
|
||||
BDR_drawSketchNames();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue