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:
authorMartin Poirier <theeth@yahoo.com>2009-03-23 04:01:44 +0300
committerMartin Poirier <theeth@yahoo.com>2009-03-23 04:01:44 +0300
commit438ba310ed39cabb5a22ca7387922316ee2feeac (patch)
treedf2f9b8664a5855bb5a8957bd1326cfaaedd95c0 /source/blender/editors/armature
parentfe1169f6356501c84cb51701ef6b7a8488f3110a (diff)
Finished porting etch-a-ton to 2.5
Changes: Gestures are now Shift-ActionMouse (doing it with SelectMouse required a bit of juggling and triggered a display glitch that I'll try to debug later) Everything else should be as functional as in trunk, apart from the dotted rubber band line which doesn't update while the view is rotated and only the current area getting redrawn while drawing (the later should be easy to fix).
Diffstat (limited to 'source/blender/editors/armature')
-rw-r--r--source/blender/editors/armature/armature_intern.h1
-rw-r--r--source/blender/editors/armature/armature_ops.c11
-rw-r--r--source/blender/editors/armature/editarmature_sketch.c367
3 files changed, 168 insertions, 211 deletions
diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h
index 942c3644793..d13001d4ad5 100644
--- a/source/blender/editors/armature/armature_intern.h
+++ b/source/blender/editors/armature/armature_intern.h
@@ -63,7 +63,6 @@ void POSE_OT_select_connected(struct wmOperatorType *ot);
void SKETCH_OT_gesture(struct wmOperatorType *ot);
void SKETCH_OT_delete(struct wmOperatorType *ot);
-void SKETCH_OT_draw_poly(struct wmOperatorType *ot);
void SKETCH_OT_draw_stroke(struct wmOperatorType *ot);
void SKETCH_OT_draw_preview(struct wmOperatorType *ot);
void SKETCH_OT_finish_stroke(struct wmOperatorType *ot);
diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c
index 4701002db67..2a629838127 100644
--- a/source/blender/editors/armature/armature_ops.c
+++ b/source/blender/editors/armature/armature_ops.c
@@ -133,7 +133,6 @@ void ED_operatortypes_armature(void)
/* SKETCH */
WM_operatortype_append(SKETCH_OT_gesture);
WM_operatortype_append(SKETCH_OT_delete);
- WM_operatortype_append(SKETCH_OT_draw_poly);
WM_operatortype_append(SKETCH_OT_draw_stroke);
WM_operatortype_append(SKETCH_OT_draw_preview);
WM_operatortype_append(SKETCH_OT_finish_stroke);
@@ -208,17 +207,7 @@ void ED_keymap_armature(wmWindowManager *wm)
WM_keymap_add_item(keymap, "ARMATURE_OT_click_extrude", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
/* Armature ------------------------ */
-// keymap= WM_keymap_listbase(wm, "Sketch", 0, 0);
-
- WM_keymap_add_item(keymap, "SKETCH_OT_gesture", EVT_TWEAK_S, KM_ANY, 0, 0);
WM_keymap_add_item(keymap, "SKETCH_OT_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "SKETCH_OT_draw_poly", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0);
- kmi = WM_keymap_add_item(keymap, "SKETCH_OT_draw_poly", ACTIONMOUSE, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "snap", 1);
- WM_keymap_add_item(keymap, "SKETCH_OT_draw_preview", MOUSEMOVE, KM_ANY, KM_SHIFT, 0);
- kmi = WM_keymap_add_item(keymap, "SKETCH_OT_draw_preview", MOUSEMOVE, KM_ANY, KM_SHIFT|KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "snap", 1);
- WM_keymap_add_item(keymap, "SKETCH_OT_draw_stroke", EVT_TWEAK_A, KM_ANY, 0, 0);
WM_keymap_add_item(keymap, "SKETCH_OT_finish_stroke", SELECTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "SKETCH_OT_cancel_stroke", ESCKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "SKETCH_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c
index d8a0a3e62ba..5d0b954046c 100644
--- a/source/blender/editors/armature/editarmature_sketch.c
+++ b/source/blender/editors/armature/editarmature_sketch.c
@@ -1249,11 +1249,11 @@ void sk_updateOverdraw(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa
int closest_index = -1;
int dist = SNAP_MIN_DISTANCE * 2;
- /* If snapping, don't start overdraw */
- if (sk_lastStrokePoint(stk)->mode == PT_SNAP)
- {
- return;
- }
+// /* If snapping, don't start overdraw */ Can't do that, snap is embed too now
+// if (sk_lastStrokePoint(stk)->mode == PT_SNAP)
+// {
+// return;
+// }
for (target = sketch->strokes.first; target; target = target->next)
{
@@ -1711,7 +1711,7 @@ void sk_addStrokePoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa
point_added = sk_addStrokeDrawPoint(C, sketch, stk, dd);
}
- if (scene->toolsettings->bone_sketching & BONE_SKETCHING_ADJUST)
+ if (stk == sketch->active_stroke && scene->toolsettings->bone_sketching & BONE_SKETCHING_ADJUST)
{
sk_updateOverdraw(C, sketch, stk, dd);
}
@@ -1743,11 +1743,10 @@ void sk_endContinuousStroke(SK_Stroke *stk)
stk->points[stk->nb_points - 1].type = PT_EXACT;
}
-void sk_updateNextPoint(SK_Sketch *sketch)
+void sk_updateNextPoint(SK_Sketch *sketch, SK_Stroke *stk)
{
- if (sketch->active_stroke)
+ if (stk)
{
- SK_Stroke *stk = sketch->active_stroke;
memcpy(&sketch->next_point, stk->points[stk->nb_points - 1].p, sizeof(SK_Point));
}
}
@@ -2856,10 +2855,8 @@ int sk_finish_stroke(bContext *C, SK_Sketch *sketch)
return 0;
}
-void sk_draw_poly(bContext *C, SK_Sketch *sketch, short mval[2], short snap)
+void sk_start_draw_stroke(SK_Sketch *sketch)
{
- SK_DrawData dd;
-
if (sketch->active_stroke == NULL)
{
sk_startStroke(sketch);
@@ -2867,160 +2864,24 @@ void sk_draw_poly(bContext *C, SK_Sketch *sketch, short mval[2], short snap)
sketch->active_stroke->selected = 1;
}
-
- sk_initDrawData(&dd, mval);
- sk_addStrokePoint(C, sketch, sketch->active_stroke, &dd, snap);
-
- sk_updateNextPoint(sketch);
}
-int sk_paint(bContext *C, SK_Sketch *sketch, short mbut)
+void sk_start_draw_gesture(SK_Sketch *sketch)
{
- Scene *scene = CTX_data_scene(C);
- int retval = 1;
- short qual = 0;
- short mval[2];
-
- if (mbut == LEFTMOUSE)
- {
- SK_DrawData dd;
- if (sketch->active_stroke == NULL)
- {
- sk_startStroke(sketch);
- sk_selectAllSketch(sketch, -1);
-
- sketch->active_stroke->selected = 1;
- }
-
- sk_initDrawData(&dd, mval);
-
- /* paint loop */
- do {
- /* get current user input */
-// XXX
-// getmouseco_areawin(dd.mval);
-
- /* only add current point to buffer if mouse moved (otherwise wait until it does) */
- if (sk_stroke_filtermval(&dd)) {
+ sketch->gesture = sk_createStroke();
+}
- sk_addStrokePoint(C, sketch, sketch->active_stroke, &dd, qual);
- sk_updateDrawData(&dd);
-// XXX
-// force_draw(0);
- }
- else
- {
-// BIF_wait_for_statechange();
- }
-
-// while( qtest() ) {
-// short event, val;
-// event = extern_qread(&val);
-// }
-
- /* do mouse checking at the end, so don't check twice, and potentially
- * miss a short tap
- */
- } while (0 /*get_mbut() & L_MOUSE*/);
-
- sk_endContinuousStroke(sketch->active_stroke);
- sk_filterLastContinuousStroke(sketch->active_stroke);
- sk_updateNextPoint(sketch);
- }
- else if (mbut == RIGHTMOUSE)
+int sk_draw_stroke(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap)
+{
+ if (sk_stroke_filtermval(dd))
{
- if (sketch->active_stroke != NULL)
- {
- SK_Stroke *stk = sketch->active_stroke;
-
- sk_endStroke(C, sketch);
-
- if (scene->toolsettings->bone_sketching & BONE_SKETCHING_QUICK)
- {
- if (scene->toolsettings->bone_sketching_convert == SK_CONVERT_RETARGET)
- {
- sk_retargetStroke(C, stk);
- }
- else
- {
- sk_convertStroke(C, stk);
- }
-// XXX
-// BIF_undo_push("Convert Sketch");
- sk_removeStroke(sketch, stk);
-// XXX
-// allqueue(REDRAWBUTSEDIT, 0);
- }
-
-// XXX
-// allqueue(REDRAWVIEW3D, 0);
- }
- /* no gestures in quick mode */
- else if (scene->toolsettings->bone_sketching & BONE_SKETCHING_QUICK)
- {
- retval = 0; /* return zero for default click behavior */
- }
- else
- {
- SK_DrawData dd;
- sketch->gesture = sk_createStroke();
-
- sk_initDrawData(&dd, mval);
-
- /* paint loop */
- do {
- /* get current user input */
-// XXX
-// getmouseco_areawin(dd.mval);
-
- /* only add current point to buffer if mouse moved (otherwise wait until it does) */
- if (sk_stroke_filtermval(&dd)) {
-
- sk_addStrokeDrawPoint(C, sketch, sketch->gesture, &dd);
- sk_updateDrawData(&dd);
-
- /* draw only if mouse has moved */
- if (sketch->gesture->nb_points > 1)
- {
-// XXX
-// force_draw(0);
- }
- }
- else
- {
-// BIF_wait_for_statechange();
- }
-
-// while( qtest() ) {
-// short event, val;
-// event = extern_qread(&val);
-// }
-
- /* do mouse checking at the end, so don't check twice, and potentially
- * miss a short tap
- */
- } while (0 /*get_mbut() & R_MOUSE*/);
-
- sk_endContinuousStroke(sketch->gesture);
- sk_filterLastContinuousStroke(sketch->gesture);
- sk_filterLastContinuousStroke(sketch->gesture);
- sk_filterLastContinuousStroke(sketch->gesture);
-
- if (sketch->gesture->nb_points > 1)
- {
- /* apply gesture here */
- sk_applyGesture(C, sketch);
- }
-
- sk_freeStroke(sketch->gesture);
- sketch->gesture = NULL;
-
-// XXX
-// allqueue(REDRAWVIEW3D, 0);
- }
+ sk_addStrokePoint(C, sketch, stk, dd, snap);
+ sk_updateDrawData(dd);
+ sk_updateNextPoint(sketch, stk);
+ return 1;
}
- return retval;
+ return 0;
}
static int ValidSketchViewContext(ViewContext *vc)
@@ -3110,23 +2971,6 @@ void BIF_deleteSketch(bContext *C)
}
}
-//int BIF_paintSketch(bContext *C, short mbut)
-//{
-// if (BIF_validSketchMode(C))
-// {
-// if (GLOBAL_sketch == NULL)
-// {
-// GLOBAL_sketch = sk_createSketch();
-// }
-//
-// return sk_paint(C, GLOBAL_sketch, mbut);
-// }
-// else
-// {
-// return 0;
-// }
-//}
-//
//void BIF_selectAllSketch(bContext *C, int mode)
//{
// if (BIF_validSketchMode(C))
@@ -3185,18 +3029,132 @@ static int sketch_select(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_FINISHED;
}
-static int sketch_draw_poly(bContext *C, wmOperator *op, wmEvent *event)
+static int sketch_draw_stroke_cancel(bContext *C, wmOperator *op)
+{
+ sk_cancelStroke(GLOBAL_sketch);
+ MEM_freeN(op->customdata);
+ return OPERATOR_CANCELLED;
+}
+
+static int sketch_draw_stroke(bContext *C, wmOperator *op, wmEvent *event)
{
short snap = RNA_boolean_get(op->ptr, "snap");
+ SK_DrawData *dd;
if (GLOBAL_sketch == NULL)
{
GLOBAL_sketch = sk_createSketch();
}
- sk_draw_poly(C, GLOBAL_sketch, event->mval, snap);
+ op->customdata = dd = MEM_callocN(sizeof("SK_DrawData"), "SketchDrawData");
+ sk_initDrawData(dd, event->mval);
- return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH;
+ sk_start_draw_stroke(GLOBAL_sketch);
+
+ sk_draw_stroke(C, GLOBAL_sketch, GLOBAL_sketch->active_stroke, dd, snap);
+
+ WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int sketch_draw_gesture_cancel(bContext *C, wmOperator *op)
+{
+ sk_cancelStroke(GLOBAL_sketch);
+ MEM_freeN(op->customdata);
+ return OPERATOR_CANCELLED;
+}
+
+static int sketch_draw_gesture(bContext *C, wmOperator *op, wmEvent *event)
+{
+ short snap = RNA_boolean_get(op->ptr, "snap");
+ SK_DrawData *dd;
+
+ if (GLOBAL_sketch == NULL)
+ {
+ GLOBAL_sketch = sk_createSketch();
+ }
+
+ op->customdata = dd = MEM_callocN(sizeof("SK_DrawData"), "SketchDrawData");
+ sk_initDrawData(dd, event->mval);
+
+ sk_start_draw_gesture(GLOBAL_sketch);
+ sk_draw_stroke(C, GLOBAL_sketch, GLOBAL_sketch->gesture, dd, snap);
+
+ WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int sketch_draw_modal(bContext *C, wmOperator *op, wmEvent *event, short gesture, SK_Stroke *stk)
+{
+ short snap = RNA_boolean_get(op->ptr, "snap");
+ SK_DrawData *dd = op->customdata;
+ int retval = OPERATOR_RUNNING_MODAL;
+
+ switch (event->type)
+ {
+ case LEFTCTRLKEY:
+ case RIGHTCTRLKEY:
+ snap = event->ctrl;
+ RNA_boolean_set(op->ptr, "snap", snap);
+ break;
+ case MOUSEMOVE:
+ dd->mval[0] = event->mval[0];
+ dd->mval[1] = event->mval[1];
+ sk_draw_stroke(C, GLOBAL_sketch, stk, dd, snap);
+ ED_area_tag_redraw(CTX_wm_area(C));
+ break;
+ case ESCKEY:
+ op->type->cancel(C, op);
+ ED_area_tag_redraw(CTX_wm_area(C));
+ retval = OPERATOR_CANCELLED;
+ break;
+ case LEFTMOUSE:
+ if (event->val == 0)
+ {
+ if (gesture == 0)
+ {
+ sk_endContinuousStroke(stk);
+ sk_filterLastContinuousStroke(stk);
+ sk_updateNextPoint(GLOBAL_sketch, stk);
+ ED_area_tag_redraw(CTX_wm_area(C));
+ MEM_freeN(op->customdata);
+ retval = OPERATOR_FINISHED;
+ }
+ else
+ {
+ sk_endContinuousStroke(stk);
+ sk_filterLastContinuousStroke(stk);
+
+ if (stk->nb_points > 1)
+ {
+ /* apply gesture here */
+ sk_applyGesture(C, GLOBAL_sketch);
+ }
+
+ sk_freeStroke(stk);
+ GLOBAL_sketch->gesture = NULL;
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+ MEM_freeN(op->customdata);
+ retval = OPERATOR_FINISHED;
+ }
+ }
+ break;
+ }
+
+ return retval;
+}
+
+static int sketch_draw_stroke_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+ return sketch_draw_modal(C, op, event, 0, GLOBAL_sketch->active_stroke);
+}
+
+static int sketch_draw_gesture_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+ return sketch_draw_modal(C, op, event, 1, GLOBAL_sketch->gesture);
}
static int sketch_draw_preview(bContext *C, wmOperator *op, wmEvent *event)
@@ -3237,6 +3195,26 @@ int ED_operator_sketch_mode_active_stroke(bContext *C)
}
}
+int ED_operator_sketch_mode_gesture(bContext *C)
+{
+ Object *obedit = CTX_data_edit_object(C);
+ Scene *scene = CTX_data_scene(C);
+
+ if (obedit &&
+ obedit->type == OB_ARMATURE &&
+ scene->toolsettings->bone_sketching & BONE_SKETCHING &&
+ (scene->toolsettings->bone_sketching & BONE_SKETCHING_QUICK) == 0 &&
+ GLOBAL_sketch != NULL &&
+ GLOBAL_sketch->active_stroke == NULL)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
int ED_operator_sketch_full_mode(bContext *C)
{
Object *obedit = CTX_data_edit_object(C);
@@ -3334,23 +3312,6 @@ void SKETCH_OT_finish_stroke(wmOperatorType *ot)
// ot->flag= OPTYPE_UNDO;
}
-void SKETCH_OT_draw_poly(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "draw poly";
- ot->idname= "SKETCH_OT_draw_poly";
-
- /* api callbacks */
- ot->invoke= sketch_draw_poly;
-
- ot->poll= ED_operator_sketch_mode;
-
- RNA_def_boolean(ot->srna, "snap", 0, "Snap", "");
-
- /* flags */
-// ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
void SKETCH_OT_draw_preview(wmOperatorType *ot)
{
/* identifiers */
@@ -3375,10 +3336,14 @@ void SKETCH_OT_draw_stroke(wmOperatorType *ot)
ot->idname= "SKETCH_OT_draw_stroke";
/* api callbacks */
- ot->invoke= sketch_draw_poly;
+ ot->invoke = sketch_draw_stroke;
+ ot->modal = sketch_draw_stroke_modal;
+ ot->cancel = sketch_draw_stroke_cancel;
ot->poll= ED_operator_sketch_mode;
+ RNA_def_boolean(ot->srna, "snap", 0, "Snap", "");
+
/* flags */
// ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
@@ -3390,9 +3355,13 @@ void SKETCH_OT_gesture(wmOperatorType *ot)
ot->idname= "SKETCH_OT_gesture";
/* api callbacks */
- ot->invoke= sketch_draw_poly;
+ ot->invoke = sketch_draw_gesture;
+ ot->modal = sketch_draw_gesture_modal;
+ ot->cancel = sketch_draw_gesture_cancel;
- ot->poll= ED_operator_sketch_full_mode;
+ ot->poll= ED_operator_sketch_mode_gesture;
+
+ RNA_def_boolean(ot->srna, "snap", 0, "Snap", "");
/* flags */
// ot->flag= OPTYPE_UNDO;