[Bf-blender-cvs] [7038bdb] soc-2014-shapekey: Another iteration for Modal Blend From Shape
Grigory Revzin
noreply at git.blender.org
Sat Aug 2 04:10:49 CEST 2014
Commit: 7038bdb1597bff4e4a55ad2cb8dd41cb95296630
Author: Grigory Revzin
Date: Sat Aug 2 04:21:58 2014 +0400
Branches: soc-2014-shapekey
https://developer.blender.org/rB7038bdb1597bff4e4a55ad2cb8dd41cb95296630
Another iteration for Modal Blend From Shape
===================================================================
M source/blender/editors/mesh/editmesh_tools.c
M source/blender/editors/mesh/editmesh_utils.c
===================================================================
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 19396c9..27145cc 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -40,6 +40,7 @@
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_curve_types.h"
#include "BLI_listbase.h"
#include "BLI_noise.h"
@@ -60,6 +61,7 @@
#include "BLF_translation.h"
#include "BLF_api.h"
+#include "BIF_gl.h"
#include "RNA_define.h"
#include "RNA_access.h"
@@ -2054,15 +2056,19 @@ typedef struct bfs_customdata {
short ww, wh; /* area width and height */
float distance; /* PE falloff distance */
- int origx, origy; /* mouse coords at previous state */
- float xscale, yscale; /* scale between mousemove and changes in mouse pos */
+ int origx, origy; /* mouse coords at starting state;state */
+
+ float xscale; /* scale between the horiz mouse movement and amount */
+ float yscale; /* scale between the vert mouse movement and falloff */
int blend_mode; /* 0 = interp, 1 = add */
int prop_mode; /* from DNA_scene_types.h, PE falloff interpolator mode */
int prop_type; /* simple/connected/projected */
- int prev_prop_type; /* used for */
+ int prev_prop_type; /* used for deciding when to recalc falloff distances */
+
+ int longest_kb_name_l; /* used for drawing info*/
float obmat[3][3]; /* object's worldmat */
@@ -2071,6 +2077,7 @@ typedef struct bfs_customdata {
ARegion *ar; /* View3D */
void *draw_handler; /* pointer to info handler */
+ uiBlock *shapesel;
} bfs_customdata;
#define BFS_TOTAL_PARAM 6
@@ -2303,17 +2310,12 @@ static char *edbm_bfs_get_preposition(int blend_mode)
return NULL;
}
-#include "UI_interface_icons.h"
-
-/* draw info in bottom-right corner */
static void edbm_bfs_draw_info(bContext *C, ARegion *ar, void *customdata)
{
#define BUFFER 1024 /* long keyblock names are a reality :\ */
char buf[BUFFER];
rcti rect;
- int y = 0;
- int x = 0;
- int x_namebase, x_valuebase, strl;
+ int y, x_namebase, x_valuebase;
bfs_customdata *state = customdata;
/* we draw a small table: on the left, the parameter names, on the right, the values */
/* _______________________________
@@ -2325,8 +2327,8 @@ static void edbm_bfs_draw_info(bContext *C, ARegion *ar, void *customdata)
ED_region_visible_rect(state->ar, &rect);
/* determine x_valuebase: space for ~15 chars or more for keyblock name */
- if ((strl = strlen(state->opkb->name)) > 10) {
- x_valuebase = ceil(rect.xmax - U.widget_unit - BLF_width_default(state->opkb->name, strl));
+ if (state->longest_kb_name_l > 10) {
+ x_valuebase = ceil(rect.xmax - U.widget_unit - state->longest_kb_name_l * BLF_width_default("_", 1));
}
else {
x_valuebase = ceil(rect.xmax - U.widget_unit - 15 * BLF_width_default("_", 1));
@@ -2342,13 +2344,37 @@ static void edbm_bfs_draw_info(bContext *C, ARegion *ar, void *customdata)
return;
}
+ if (state->opkb->next) {
+ if (state->opkb->next != BKE_keyblock_from_object(state->em->ob)) {
+ BLI_snprintf(buf, BUFFER, "%s", state->opkb->next->name);
+ BLF_draw_default(x_valuebase, y + U.widget_unit / 1.5f, 0.0f, buf, strlen(buf));
+ }
+ else if (state->opkb->next->next) {
+ BLI_snprintf(buf, BUFFER, "%s", state->opkb->next->next->name);
+ BLF_draw_default(x_valuebase, y + U.widget_unit / 1.5f, 0.0f, buf, strlen(buf));
+ }
+ }
+
/* draw argument kb */
BLI_snprintf(buf, BUFFER, "%s:", edbm_bfs_get_preposition(state->blend_mode));
BLF_draw_default(x_namebase, y, 0.0f, buf, strlen(buf));
BLI_snprintf(buf, BUFFER, "%s", state->opkb->name);
BLF_draw_default(x_valuebase, y, 0.0f, buf, strlen(buf));
- y -= U.widget_unit;
+ /* if there's a possibility, draw prev and next kb */
+
+ if (state->opkb->prev) {
+ if (state->opkb->prev != BKE_keyblock_from_object(state->em->ob)) {
+ BLI_snprintf(buf, BUFFER, "%s", state->opkb->prev->name);
+ BLF_draw_default(x_valuebase, y - U.widget_unit / 1.5f, 0.0f, buf, strlen(buf));
+ }
+ else if (state->opkb->prev->prev) {
+ BLI_snprintf(buf, BUFFER, "%s", state->opkb->prev->prev->name);
+ BLF_draw_default(x_valuebase, y - U.widget_unit / 1.5f, 0.0f, buf, strlen(buf));
+ }
+ }
+
+ y -= 1.3f * U.widget_unit ;
strcpy(buf, IFACE_("Amount:"));
BLF_draw_default(x_namebase, y, 0.0f, buf, strlen(buf));
BLI_snprintf(buf, BUFFER, "%.3f", state->amount);
@@ -2382,17 +2408,28 @@ static void edbm_bfs_draw_info(bContext *C, ARegion *ar, void *customdata)
BLF_draw_default(x_valuebase, y, 0.0f, buf, strlen(buf));
}
-
strcpy(buf, "Mouse drag up/down: falloff distance. Mouse left/right: amount."
"Mousewheel: select keyblock. LMB / RMB: Confirm. ESC: Cancel."
- "O: Cycle Falloff Types. Shift-O: No PE/On//Connected/Projected.");
+ "O: Cycle Falloff Types. Shift-O: No PE/On/Connected/Projected.");
-
ED_area_headerprint(CTX_wm_area(C), buf);
#undef BUFFER
}
+static uiBlock *edbm_bfs_create_shapeselector(bContext *C, ARegion *ar, void *arg_op)
+{
+ uiBlock *block;
+ uiLayout *layout;
+
+ block = uiBeginBlock(C, ar, "edbm blend from shape shape falldown", UI_EMBOSS);
+ uiBlockClearFlag(block, UI_BLOCK_LOOP);
+ uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN);
+
+ layout = uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 15 * UI_UNIT_X, UI_UNIT_Y, 0, UI_GetStyle());
+
+}
+
static int edbm_bfs_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
Object *obedit = CTX_data_edit_object(C);
@@ -2434,9 +2471,10 @@ static int edbm_bfs_invoke(bContext *C, wmOperator *op, const wmEvent *event)
state->origy = event->y;
state->em = em;
state->key = k;
- state->prop_type = state->prev_prop_type = ts->proportional; /* simple/cnct/proj */
- state->prop_mode = ts->prop_mode; /* falloffs */
- state->opkb = BKE_keyblock_from_object(obedit);
+ state->prop_type = ts->proportional; /* no/simple/cnct/proj */
+ state->prev_prop_type = -1;
+ state->prop_mode = ts->prop_mode; /* falloffs */
+ state->opkb = BKE_key_from_object(obedit)->block.first;
state->wh = ar->winy;
state->ww = ar->winx;
@@ -2466,6 +2504,15 @@ static int edbm_bfs_invoke(bContext *C, wmOperator *op, const wmEvent *event)
state->xscale = 2.0f / ar->winx;
}
+ state->longest_kb_name_l = 0;
+
+ LISTBASE_ITER_FWD(state->key->block, kb) {
+ int a;
+ if ((a = strlen(kb->name)) > state->longest_kb_name_l) {
+ state->longest_kb_name_l = a;
+ }
+ }
+
/* register modal handler */
WM_event_add_modal_handler(C, op);
@@ -2474,23 +2521,11 @@ static int edbm_bfs_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void edbm_bfs_handle_mousemove(short mx, short my, bfs_customdata *state)
{
-#define EXPSWITCHLEVEL state->wh * 0.8f
-#define STEEPNESS state->yscale / 50.0f
+ state->distance = my * state->yscale;
state->amount = -1.0f + mx * state->xscale;
- if (my < EXPSWITCHLEVEL)
- state->distance = my * state->yscale;
- else
- /* go exponential here */
- state->distance = EXPSWITCHLEVEL * state->yscale /* constant part */
- /* exp part */ + exp((my - EXPSWITCHLEVEL) / ((state->wh - EXPSWITCHLEVEL)) / STEEPNESS) - 1.0f;
-
- /* TODO: make this follow some nice spline */
-
- CLAMP(state->amount, -1.0f, 1.0f);
+ CLAMP(state->amount, -1.5f, 1.5f);
CLAMP(state->distance, 0.0f, FLT_MAX);
-#undef EXPSWITCHLEVEL
-#undef STEEPNESS
}
static void edbm_bfs_recalc_factors(bfs_customdata *state) {
@@ -2502,11 +2537,7 @@ static void edbm_bfs_recalc_factors(bfs_customdata *state) {
memset(state->factors, 0.0f, sizeof(float) * state->em->bm->totvert);
if (state->prop_type != state->prev_prop_type) {
-
switch (state->prop_type) {
- BMVert *v;
- BMIter iter;
-
case PROP_EDIT_ON:
BM_prop_dist_calc(state->em->bm, state->obmat, NULL, state->distances);
break;
@@ -2520,19 +2551,26 @@ static void edbm_bfs_recalc_factors(bfs_customdata *state) {
BM_prop_dist_calc_connected(state->em->bm, state->obmat, state->distances);
break;
default:
- /* selected = 1.0 factor */
- BM_ITER_MESH_INDEX(v, &iter, state->em->bm, BM_VERTS_OF_MESH, a) {
- state->factors[a] = BM_elem_flag_test(v, BM_ELEM_SELECT) ? 1.0f : 0.0f;
- }
- break;
+ state->prev_prop_type = state->prop_type;
+ return;
}
-
- state->prev_prop_type = state->prop_type;
}
- for (a = 0; a < state->em->bm->totvert; ++a) {
- state->factors[a] = BM_prop_factor_distance(state->distances[a], state->distance, state->prop_mode);
+ if (state->prop_type) {
+ for (a = 0; a < state->em->bm->totvert; ++a) {
+ state->factors[a] = BM_prop_factor_distance(state->distances[a], state->distance, state->prop_mode);
+ }
+ }
+ else {
+ BMVert *v;
+ BMIter iter;
+ /* selected = 1.0 factor */
+ BM_ITER_MESH_INDEX(v, &iter, state->em->bm, BM_VERTS_OF_MESH, a) {
+ state->factors[a] = BM_elem_flag_test(v, BM_ELEM_SELECT) ? 1.0f : 0.0f;
+ }
}
+
+ state->prev_prop_type = state->prop_type;
}
static int edbm_bfs_modal(bContext *C, wmOperator *op, const wmEvent *event)
@@ -2552,7 +2590,7 @@ static int edbm_bfs_modal(bContext *C, wmOperator *op, const wmEvent *event)
if (event->shift) {
/* cycle PE */
state->prop_type++;
- if (state->prop_type > PROP_EDIT_PROJECTED)
+ if (state->prop_type == PROP_EDIT_PROJECTED) /* skip projected for now */
state->prop_type = 0;
break;
}
@@ -2618,13 +2656,11 @@ static int edbm_bfs_modal(bContext *C, wmOperator *op, const wmEvent *event)
rc = OPERATOR_CANCELLED;
break;
}
-
/* recalc */
edbm_bfs_recalc_factors(state);
edbm_bfs_recalc_shapes(state);
- /* update editmesh display */
EDBM_update_generic(state->em, false, false);
ED_region_tag_redraw(CTX_wm_region(C));
@@ -2633,7 +2669,6 @@ static int edbm_bfs_modal(bContext *C, wmOperator *op, const wmEvent *event)
ED_area_headerprint(CTX_wm_area(C), "ROTATE MOUSEWHEEL");
return OPERATOR_RUNNING_MODAL;
}
-
if (rc) {
/* exit */
@@ -2674,7 +2709,7 @@ void MESH_OT_blend_from_shape(wmOperatorType *ot)
/* api callbacks */
ot->exec = edbm_bfs_exec;
ot->modal = edbm_bfs_modal;
- ot->invoke = edbm_bfs_invoke; //WM_oper
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list