diff options
Diffstat (limited to 'source/blender/editors/animation/fmodifier_ui.c')
-rw-r--r-- | source/blender/editors/animation/fmodifier_ui.c | 1495 |
1 files changed, 899 insertions, 596 deletions
diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c index 8edad506a33..919090cdee9 100644 --- a/source/blender/editors/animation/fmodifier_ui.c +++ b/source/blender/editors/animation/fmodifier_ui.c @@ -21,7 +21,6 @@ * \ingroup edanimation */ - /* User-Interface Stuff for F-Modifiers: * This file defines the (C-Coded) templates + editing callbacks needed * by the interface stuff or F-Modifiers, as used by F-Curves in the Graph Editor, @@ -65,635 +64,939 @@ // XXX! -------------------------------- /* temporary definition for limits of float number buttons (FLT_MAX tends to infinity with old system) */ -#define UI_FLT_MAX 10000.0f +#define UI_FLT_MAX 10000.0f -#define B_REDR 1 -#define B_FMODIFIER_REDRAW 20 +#define B_REDR 1 +#define B_FMODIFIER_REDRAW 20 /* callback to verify modifier data */ static void validate_fmodifier_cb(bContext *UNUSED(C), void *fcm_v, void *UNUSED(arg)) { - FModifier *fcm = (FModifier *)fcm_v; - const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm); + FModifier *fcm = (FModifier *)fcm_v; + const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm); - /* call the verify callback on the modifier if applicable */ - if (fmi && fmi->verify_data) - fmi->verify_data(fcm); + /* call the verify callback on the modifier if applicable */ + if (fmi && fmi->verify_data) + fmi->verify_data(fcm); } /* callback to remove the given modifier */ typedef struct FModifierDeleteContext { - ID *fcurve_owner_id; - ListBase *modifiers; + ID *fcurve_owner_id; + ListBase *modifiers; } FModifierDeleteContext; static void delete_fmodifier_cb(bContext *C, void *ctx_v, void *fcm_v) { - FModifierDeleteContext *ctx = (FModifierDeleteContext *)ctx_v; - ListBase *modifiers = ctx->modifiers; - FModifier *fcm = (FModifier *)fcm_v; + FModifierDeleteContext *ctx = (FModifierDeleteContext *)ctx_v; + ListBase *modifiers = ctx->modifiers; + FModifier *fcm = (FModifier *)fcm_v; - /* remove the given F-Modifier from the active modifier-stack */ - remove_fmodifier(modifiers, fcm); + /* remove the given F-Modifier from the active modifier-stack */ + remove_fmodifier(modifiers, fcm); - ED_undo_push(C, "Delete F-Curve Modifier"); + ED_undo_push(C, "Delete F-Curve Modifier"); - /* send notifiers */ - // XXX for now, this is the only way to get updates in all the right places... but would be nice to have a special one in this case - WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); - DEG_id_tag_update(ctx->fcurve_owner_id, ID_RECALC_ANIMATION); + /* send notifiers */ + // XXX for now, this is the only way to get updates in all the right places... but would be nice to have a special one in this case + WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); + DEG_id_tag_update(ctx->fcurve_owner_id, ID_RECALC_ANIMATION); } /* --------------- */ /* draw settings for generator modifier */ -static void draw_modifier__generator(uiLayout *layout, ID *fcurve_owner_id, FModifier *fcm, short width) +static void draw_modifier__generator(uiLayout *layout, + ID *fcurve_owner_id, + FModifier *fcm, + short width) { - FMod_Generator *data = (FMod_Generator *)fcm->data; - uiLayout /* *col, */ /* UNUSED */ *row; - uiBlock *block; - uiBut *but; - PointerRNA ptr; - short bwidth = width - 1.5 * UI_UNIT_X; /* max button width */ - - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierFunctionGenerator, fcm, &ptr); - - /* basic settings (backdrop + mode selector + some padding) */ - /* col = uiLayoutColumn(layout, true); */ /* UNUSED */ - block = uiLayoutGetBlock(layout); - UI_block_align_begin(block); - but = uiDefButR(block, UI_BTYPE_MENU, B_FMODIFIER_REDRAW, NULL, 0, 0, bwidth, UI_UNIT_Y, &ptr, "mode", -1, 0, 0, -1, -1, NULL); - UI_but_func_set(but, validate_fmodifier_cb, fcm, NULL); - - uiDefButR(block, UI_BTYPE_TOGGLE, B_FMODIFIER_REDRAW, NULL, 0, 0, bwidth, UI_UNIT_Y, &ptr, "use_additive", -1, 0, 0, -1, -1, NULL); - UI_block_align_end(block); - - /* now add settings for individual modes */ - switch (data->mode) { - case FCM_GENERATOR_POLYNOMIAL: /* polynomial expression */ - { - const uiFontStyle *fstyle = UI_FSTYLE_WIDGET; - float *cp = NULL; - char xval[32]; - unsigned int i; - int maxXWidth; - - /* draw polynomial order selector */ - row = uiLayoutRow(layout, false); - block = uiLayoutGetBlock(row); - but = uiDefButI(block, UI_BTYPE_NUM, B_FMODIFIER_REDRAW, IFACE_("Poly Order:"), 0.5f * UI_UNIT_X, 0, bwidth, UI_UNIT_Y, - &data->poly_order, 1, 100, 0, 0, - TIP_("'Order' of the Polynomial (for a polynomial with n terms, 'order' is n-1)")); - UI_but_func_set(but, validate_fmodifier_cb, fcm, NULL); - - - /* calculate maximum width of label for "x^n" labels */ - if (data->arraysize > 2) { - BLI_snprintf(xval, sizeof(xval), "x^%u", data->arraysize); - /* XXX: UI_fontstyle_string_width is not accurate */ - maxXWidth = UI_fontstyle_string_width(fstyle, xval) + 0.5 * UI_UNIT_X; - } - else { - /* basic size (just "x") */ - maxXWidth = UI_fontstyle_string_width(fstyle, "x") + 0.5 * UI_UNIT_X; - } - - /* draw controls for each coefficient and a + sign at end of row */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - - cp = data->coefficients; - for (i = 0; (i < data->arraysize) && (cp); i++, cp++) { - /* To align with first line... */ - if (i) - uiDefBut(block, UI_BTYPE_LABEL, 1, " ", 0, 0, 2 * UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - else - uiDefBut(block, UI_BTYPE_LABEL, 1, "y =", 0, 0, 2 * UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - - /* coefficient */ - uiDefButF(block, UI_BTYPE_NUM, B_FMODIFIER_REDRAW, "", 0, 0, bwidth / 2, UI_UNIT_Y, cp, -UI_FLT_MAX, UI_FLT_MAX, - 10, 3, TIP_("Coefficient for polynomial")); - - /* 'x' param (and '+' if necessary) */ - if (i == 0) - BLI_strncpy(xval, "", sizeof(xval)); - else if (i == 1) - BLI_strncpy(xval, "x", sizeof(xval)); - else - BLI_snprintf(xval, sizeof(xval), "x^%u", i); - uiDefBut(block, UI_BTYPE_LABEL, 1, xval, 0, 0, maxXWidth, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, TIP_("Power of x")); - - if ( (i != (data->arraysize - 1)) || ((i == 0) && data->arraysize == 2) ) { - uiDefBut(block, UI_BTYPE_LABEL, 1, "+", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - - /* next coefficient on a new row */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - } - else { - /* For alignment in UI! */ - uiDefBut(block, UI_BTYPE_LABEL, 1, " ", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - } - } - break; - } - - case FCM_GENERATOR_POLYNOMIAL_FACTORISED: /* Factorized polynomial expression */ - { - float *cp = NULL; - unsigned int i; - - /* draw polynomial order selector */ - row = uiLayoutRow(layout, false); - block = uiLayoutGetBlock(row); - but = uiDefButI(block, UI_BTYPE_NUM, B_FMODIFIER_REDRAW, IFACE_("Poly Order:"), 0, 0, width - 1.5 * UI_UNIT_X, UI_UNIT_Y, - &data->poly_order, 1, 100, 0, 0, - TIP_("'Order' of the Polynomial (for a polynomial with n terms, 'order' is n-1)")); - UI_but_func_set(but, validate_fmodifier_cb, fcm, NULL); - - - /* draw controls for each pair of coefficients */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - - cp = data->coefficients; - for (i = 0; (i < data->poly_order) && (cp); i++, cp += 2) { - /* To align with first line */ - if (i) - uiDefBut(block, UI_BTYPE_LABEL, 1, " ", 0, 0, 2.5 * UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - else - uiDefBut(block, UI_BTYPE_LABEL, 1, "y =", 0, 0, 2.5 * UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - /* opening bracket */ - uiDefBut(block, UI_BTYPE_LABEL, 1, "(", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - - /* coefficients */ - uiDefButF(block, UI_BTYPE_NUM, B_FMODIFIER_REDRAW, "", 0, 0, 5 * UI_UNIT_X, UI_UNIT_Y, cp, -UI_FLT_MAX, UI_FLT_MAX, - 10, 3, TIP_("Coefficient of x")); - - uiDefBut(block, UI_BTYPE_LABEL, 1, "x +", 0, 0, 2 * UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefButF(block, UI_BTYPE_NUM, B_FMODIFIER_REDRAW, "", 0, 0, 5 * UI_UNIT_X, UI_UNIT_Y, cp + 1, -UI_FLT_MAX, UI_FLT_MAX, - 10, 3, TIP_("Second coefficient")); - - /* closing bracket and multiplication sign */ - if ( (i != (data->poly_order - 1)) || ((i == 0) && data->poly_order == 2) ) { - uiDefBut(block, UI_BTYPE_LABEL, 1, ") \xc3\x97", 0, 0, 2 * UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - - /* set up new row for the next pair of coefficients */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - } - else - uiDefBut(block, UI_BTYPE_LABEL, 1, ") ", 0, 0, 2 * UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - } - break; - } - } + FMod_Generator *data = (FMod_Generator *)fcm->data; + uiLayout /* *col, */ /* UNUSED */ *row; + uiBlock *block; + uiBut *but; + PointerRNA ptr; + short bwidth = width - 1.5 * UI_UNIT_X; /* max button width */ + + /* init the RNA-pointer */ + RNA_pointer_create(fcurve_owner_id, &RNA_FModifierFunctionGenerator, fcm, &ptr); + + /* basic settings (backdrop + mode selector + some padding) */ + /* col = uiLayoutColumn(layout, true); */ /* UNUSED */ + block = uiLayoutGetBlock(layout); + UI_block_align_begin(block); + but = uiDefButR(block, + UI_BTYPE_MENU, + B_FMODIFIER_REDRAW, + NULL, + 0, + 0, + bwidth, + UI_UNIT_Y, + &ptr, + "mode", + -1, + 0, + 0, + -1, + -1, + NULL); + UI_but_func_set(but, validate_fmodifier_cb, fcm, NULL); + + uiDefButR(block, + UI_BTYPE_TOGGLE, + B_FMODIFIER_REDRAW, + NULL, + 0, + 0, + bwidth, + UI_UNIT_Y, + &ptr, + "use_additive", + -1, + 0, + 0, + -1, + -1, + NULL); + UI_block_align_end(block); + + /* now add settings for individual modes */ + switch (data->mode) { + case FCM_GENERATOR_POLYNOMIAL: /* polynomial expression */ + { + const uiFontStyle *fstyle = UI_FSTYLE_WIDGET; + float *cp = NULL; + char xval[32]; + unsigned int i; + int maxXWidth; + + /* draw polynomial order selector */ + row = uiLayoutRow(layout, false); + block = uiLayoutGetBlock(row); + but = uiDefButI( + block, + UI_BTYPE_NUM, + B_FMODIFIER_REDRAW, + IFACE_("Poly Order:"), + 0.5f * UI_UNIT_X, + 0, + bwidth, + UI_UNIT_Y, + &data->poly_order, + 1, + 100, + 0, + 0, + TIP_("'Order' of the Polynomial (for a polynomial with n terms, 'order' is n-1)")); + UI_but_func_set(but, validate_fmodifier_cb, fcm, NULL); + + /* calculate maximum width of label for "x^n" labels */ + if (data->arraysize > 2) { + BLI_snprintf(xval, sizeof(xval), "x^%u", data->arraysize); + /* XXX: UI_fontstyle_string_width is not accurate */ + maxXWidth = UI_fontstyle_string_width(fstyle, xval) + 0.5 * UI_UNIT_X; + } + else { + /* basic size (just "x") */ + maxXWidth = UI_fontstyle_string_width(fstyle, "x") + 0.5 * UI_UNIT_X; + } + + /* draw controls for each coefficient and a + sign at end of row */ + row = uiLayoutRow(layout, true); + block = uiLayoutGetBlock(row); + + cp = data->coefficients; + for (i = 0; (i < data->arraysize) && (cp); i++, cp++) { + /* To align with first line... */ + if (i) + uiDefBut(block, + UI_BTYPE_LABEL, + 1, + " ", + 0, + 0, + 2 * UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0, + 0, + ""); + else + uiDefBut(block, + UI_BTYPE_LABEL, + 1, + "y =", + 0, + 0, + 2 * UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0, + 0, + ""); + + /* coefficient */ + uiDefButF(block, + UI_BTYPE_NUM, + B_FMODIFIER_REDRAW, + "", + 0, + 0, + bwidth / 2, + UI_UNIT_Y, + cp, + -UI_FLT_MAX, + UI_FLT_MAX, + 10, + 3, + TIP_("Coefficient for polynomial")); + + /* 'x' param (and '+' if necessary) */ + if (i == 0) + BLI_strncpy(xval, "", sizeof(xval)); + else if (i == 1) + BLI_strncpy(xval, "x", sizeof(xval)); + else + BLI_snprintf(xval, sizeof(xval), "x^%u", i); + uiDefBut(block, + UI_BTYPE_LABEL, + 1, + xval, + 0, + 0, + maxXWidth, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0, + 0, + TIP_("Power of x")); + + if ((i != (data->arraysize - 1)) || ((i == 0) && data->arraysize == 2)) { + uiDefBut( + block, UI_BTYPE_LABEL, 1, "+", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); + + /* next coefficient on a new row */ + row = uiLayoutRow(layout, true); + block = uiLayoutGetBlock(row); + } + else { + /* For alignment in UI! */ + uiDefBut( + block, UI_BTYPE_LABEL, 1, " ", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); + } + } + break; + } + + case FCM_GENERATOR_POLYNOMIAL_FACTORISED: /* Factorized polynomial expression */ + { + float *cp = NULL; + unsigned int i; + + /* draw polynomial order selector */ + row = uiLayoutRow(layout, false); + block = uiLayoutGetBlock(row); + but = uiDefButI( + block, + UI_BTYPE_NUM, + B_FMODIFIER_REDRAW, + IFACE_("Poly Order:"), + 0, + 0, + width - 1.5 * UI_UNIT_X, + UI_UNIT_Y, + &data->poly_order, + 1, + 100, + 0, + 0, + TIP_("'Order' of the Polynomial (for a polynomial with n terms, 'order' is n-1)")); + UI_but_func_set(but, validate_fmodifier_cb, fcm, NULL); + + /* draw controls for each pair of coefficients */ + row = uiLayoutRow(layout, true); + block = uiLayoutGetBlock(row); + + cp = data->coefficients; + for (i = 0; (i < data->poly_order) && (cp); i++, cp += 2) { + /* To align with first line */ + if (i) + uiDefBut(block, + UI_BTYPE_LABEL, + 1, + " ", + 0, + 0, + 2.5 * UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0, + 0, + ""); + else + uiDefBut(block, + UI_BTYPE_LABEL, + 1, + "y =", + 0, + 0, + 2.5 * UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0, + 0, + ""); + /* opening bracket */ + uiDefBut( + block, UI_BTYPE_LABEL, 1, "(", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); + + /* coefficients */ + uiDefButF(block, + UI_BTYPE_NUM, + B_FMODIFIER_REDRAW, + "", + 0, + 0, + 5 * UI_UNIT_X, + UI_UNIT_Y, + cp, + -UI_FLT_MAX, + UI_FLT_MAX, + 10, + 3, + TIP_("Coefficient of x")); + + uiDefBut(block, + UI_BTYPE_LABEL, + 1, + "x +", + 0, + 0, + 2 * UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0, + 0, + ""); + + uiDefButF(block, + UI_BTYPE_NUM, + B_FMODIFIER_REDRAW, + "", + 0, + 0, + 5 * UI_UNIT_X, + UI_UNIT_Y, + cp + 1, + -UI_FLT_MAX, + UI_FLT_MAX, + 10, + 3, + TIP_("Second coefficient")); + + /* closing bracket and multiplication sign */ + if ((i != (data->poly_order - 1)) || ((i == 0) && data->poly_order == 2)) { + uiDefBut(block, + UI_BTYPE_LABEL, + 1, + ") \xc3\x97", + 0, + 0, + 2 * UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0, + 0, + ""); + + /* set up new row for the next pair of coefficients */ + row = uiLayoutRow(layout, true); + block = uiLayoutGetBlock(row); + } + else + uiDefBut(block, + UI_BTYPE_LABEL, + 1, + ") ", + 0, + 0, + 2 * UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0, + 0, + ""); + } + break; + } + } } /* --------------- */ /* draw settings for generator modifier */ -static void draw_modifier__fn_generator(uiLayout *layout, ID *fcurve_owner_id, FModifier *fcm, short UNUSED(width)) +static void draw_modifier__fn_generator(uiLayout *layout, + ID *fcurve_owner_id, + FModifier *fcm, + short UNUSED(width)) { - uiLayout *col; - PointerRNA ptr; - - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierFunctionGenerator, fcm, &ptr); - - /* add the settings */ - col = uiLayoutColumn(layout, true); - uiItemR(col, &ptr, "function_type", 0, "", ICON_NONE); - uiItemR(col, &ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); - - col = uiLayoutColumn(layout, false); // no grouping for now - uiItemR(col, &ptr, "amplitude", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "phase_multiplier", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "phase_offset", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "value_offset", 0, NULL, ICON_NONE); + uiLayout *col; + PointerRNA ptr; + + /* init the RNA-pointer */ + RNA_pointer_create(fcurve_owner_id, &RNA_FModifierFunctionGenerator, fcm, &ptr); + + /* add the settings */ + col = uiLayoutColumn(layout, true); + uiItemR(col, &ptr, "function_type", 0, "", ICON_NONE); + uiItemR(col, &ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); + + col = uiLayoutColumn(layout, false); // no grouping for now + uiItemR(col, &ptr, "amplitude", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "phase_multiplier", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "phase_offset", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "value_offset", 0, NULL, ICON_NONE); } /* --------------- */ /* draw settings for cycles modifier */ -static void draw_modifier__cycles(uiLayout *layout, ID *fcurve_owner_id, FModifier *fcm, short UNUSED(width)) +static void draw_modifier__cycles(uiLayout *layout, + ID *fcurve_owner_id, + FModifier *fcm, + short UNUSED(width)) { - uiLayout *split, *col; - PointerRNA ptr; - - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierCycles, fcm, &ptr); - - /* split into 2 columns - * NOTE: the mode comboboxes shouldn't get labels, otherwise there isn't enough room - */ - split = uiLayoutSplit(layout, 0.5f, false); - - /* before range */ - col = uiLayoutColumn(split, true); - uiItemL(col, IFACE_("Before:"), ICON_NONE); - uiItemR(col, &ptr, "mode_before", 0, "", ICON_NONE); - uiItemR(col, &ptr, "cycles_before", 0, NULL, ICON_NONE); - - /* after range */ - col = uiLayoutColumn(split, true); - uiItemL(col, IFACE_("After:"), ICON_NONE); - uiItemR(col, &ptr, "mode_after", 0, "", ICON_NONE); - uiItemR(col, &ptr, "cycles_after", 0, NULL, ICON_NONE); + uiLayout *split, *col; + PointerRNA ptr; + + /* init the RNA-pointer */ + RNA_pointer_create(fcurve_owner_id, &RNA_FModifierCycles, fcm, &ptr); + + /* split into 2 columns + * NOTE: the mode comboboxes shouldn't get labels, otherwise there isn't enough room + */ + split = uiLayoutSplit(layout, 0.5f, false); + + /* before range */ + col = uiLayoutColumn(split, true); + uiItemL(col, IFACE_("Before:"), ICON_NONE); + uiItemR(col, &ptr, "mode_before", 0, "", ICON_NONE); + uiItemR(col, &ptr, "cycles_before", 0, NULL, ICON_NONE); + + /* after range */ + col = uiLayoutColumn(split, true); + uiItemL(col, IFACE_("After:"), ICON_NONE); + uiItemR(col, &ptr, "mode_after", 0, "", ICON_NONE); + uiItemR(col, &ptr, "cycles_after", 0, NULL, ICON_NONE); } /* --------------- */ /* draw settings for noise modifier */ -static void draw_modifier__noise(uiLayout *layout, ID *fcurve_owner_id, FModifier *fcm, short UNUSED(width)) +static void draw_modifier__noise(uiLayout *layout, + ID *fcurve_owner_id, + FModifier *fcm, + short UNUSED(width)) { - uiLayout *split, *col; - PointerRNA ptr; + uiLayout *split, *col; + PointerRNA ptr; - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierNoise, fcm, &ptr); + /* init the RNA-pointer */ + RNA_pointer_create(fcurve_owner_id, &RNA_FModifierNoise, fcm, &ptr); - /* blending mode */ - uiItemR(layout, &ptr, "blend_type", 0, NULL, ICON_NONE); + /* blending mode */ + uiItemR(layout, &ptr, "blend_type", 0, NULL, ICON_NONE); - /* split into 2 columns */ - split = uiLayoutSplit(layout, 0.5f, false); + /* split into 2 columns */ + split = uiLayoutSplit(layout, 0.5f, false); - /* col 1 */ - col = uiLayoutColumn(split, false); - uiItemR(col, &ptr, "scale", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "strength", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "offset", 0, NULL, ICON_NONE); + /* col 1 */ + col = uiLayoutColumn(split, false); + uiItemR(col, &ptr, "scale", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "strength", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "offset", 0, NULL, ICON_NONE); - /* col 2 */ - col = uiLayoutColumn(split, false); - uiItemR(col, &ptr, "phase", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "depth", 0, NULL, ICON_NONE); + /* col 2 */ + col = uiLayoutColumn(split, false); + uiItemR(col, &ptr, "phase", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "depth", 0, NULL, ICON_NONE); } /* callback to add new envelope data point */ static void fmod_envelope_addpoint_cb(bContext *C, void *fcm_dv, void *UNUSED(arg)) { - Scene *scene = CTX_data_scene(C); - FMod_Envelope *env = (FMod_Envelope *)fcm_dv; - FCM_EnvelopeData *fedn; - FCM_EnvelopeData fed; - - /* init template data */ - fed.min = -1.0f; - fed.max = 1.0f; - fed.time = (float)scene->r.cfra; // XXX make this int for ease of use? - fed.f1 = fed.f2 = 0; - - /* check that no data exists for the current frame... */ - if (env->data) { - bool exists; - int i = BKE_fcm_envelope_find_index(env->data, (float)(scene->r.cfra), env->totvert, &exists); - - /* binarysearch_...() will set exists by default to 0, - * so if it is non-zero, that means that the point exists already */ - if (exists) { - return; - } - - /* add new */ - fedn = MEM_callocN((env->totvert + 1) * sizeof(FCM_EnvelopeData), "FCM_EnvelopeData"); - - /* add the points that should occur before the point to be pasted */ - if (i > 0) - memcpy(fedn, env->data, i * sizeof(FCM_EnvelopeData)); - - /* add point to paste at index i */ - *(fedn + i) = fed; - - /* add the points that occur after the point to be pasted */ - if (i < env->totvert) - memcpy(fedn + i + 1, env->data + i, (env->totvert - i) * sizeof(FCM_EnvelopeData)); - - /* replace (+ free) old with new */ - MEM_freeN(env->data); - env->data = fedn; - - env->totvert++; - } - else { - env->data = MEM_callocN(sizeof(FCM_EnvelopeData), "FCM_EnvelopeData"); - *(env->data) = fed; - - env->totvert = 1; - } + Scene *scene = CTX_data_scene(C); + FMod_Envelope *env = (FMod_Envelope *)fcm_dv; + FCM_EnvelopeData *fedn; + FCM_EnvelopeData fed; + + /* init template data */ + fed.min = -1.0f; + fed.max = 1.0f; + fed.time = (float)scene->r.cfra; // XXX make this int for ease of use? + fed.f1 = fed.f2 = 0; + + /* check that no data exists for the current frame... */ + if (env->data) { + bool exists; + int i = BKE_fcm_envelope_find_index(env->data, (float)(scene->r.cfra), env->totvert, &exists); + + /* binarysearch_...() will set exists by default to 0, + * so if it is non-zero, that means that the point exists already */ + if (exists) { + return; + } + + /* add new */ + fedn = MEM_callocN((env->totvert + 1) * sizeof(FCM_EnvelopeData), "FCM_EnvelopeData"); + + /* add the points that should occur before the point to be pasted */ + if (i > 0) + memcpy(fedn, env->data, i * sizeof(FCM_EnvelopeData)); + + /* add point to paste at index i */ + *(fedn + i) = fed; + + /* add the points that occur after the point to be pasted */ + if (i < env->totvert) + memcpy(fedn + i + 1, env->data + i, (env->totvert - i) * sizeof(FCM_EnvelopeData)); + + /* replace (+ free) old with new */ + MEM_freeN(env->data); + env->data = fedn; + + env->totvert++; + } + else { + env->data = MEM_callocN(sizeof(FCM_EnvelopeData), "FCM_EnvelopeData"); + *(env->data) = fed; + + env->totvert = 1; + } } /* callback to remove envelope data point */ // TODO: should we have a separate file for things like this? static void fmod_envelope_deletepoint_cb(bContext *UNUSED(C), void *fcm_dv, void *ind_v) { - FMod_Envelope *env = (FMod_Envelope *)fcm_dv; - FCM_EnvelopeData *fedn; - int index = POINTER_AS_INT(ind_v); - - /* check that no data exists for the current frame... */ - if (env->totvert > 1) { - /* allocate a new smaller array */ - fedn = MEM_callocN(sizeof(FCM_EnvelopeData) * (env->totvert - 1), "FCM_EnvelopeData"); - - memcpy(fedn, env->data, sizeof(FCM_EnvelopeData) * (index)); - memcpy(fedn + index, env->data + (index + 1), sizeof(FCM_EnvelopeData) * ((env->totvert - index) - 1)); - - /* free old array, and set the new */ - MEM_freeN(env->data); - env->data = fedn; - env->totvert--; - } - else { - /* just free array, since the only vert was deleted */ - if (env->data) { - MEM_freeN(env->data); - env->data = NULL; - } - env->totvert = 0; - } + FMod_Envelope *env = (FMod_Envelope *)fcm_dv; + FCM_EnvelopeData *fedn; + int index = POINTER_AS_INT(ind_v); + + /* check that no data exists for the current frame... */ + if (env->totvert > 1) { + /* allocate a new smaller array */ + fedn = MEM_callocN(sizeof(FCM_EnvelopeData) * (env->totvert - 1), "FCM_EnvelopeData"); + + memcpy(fedn, env->data, sizeof(FCM_EnvelopeData) * (index)); + memcpy(fedn + index, + env->data + (index + 1), + sizeof(FCM_EnvelopeData) * ((env->totvert - index) - 1)); + + /* free old array, and set the new */ + MEM_freeN(env->data); + env->data = fedn; + env->totvert--; + } + else { + /* just free array, since the only vert was deleted */ + if (env->data) { + MEM_freeN(env->data); + env->data = NULL; + } + env->totvert = 0; + } } /* draw settings for envelope modifier */ -static void draw_modifier__envelope(uiLayout *layout, ID *fcurve_owner_id, FModifier *fcm, short UNUSED(width)) +static void draw_modifier__envelope(uiLayout *layout, + ID *fcurve_owner_id, + FModifier *fcm, + short UNUSED(width)) { - FMod_Envelope *env = (FMod_Envelope *)fcm->data; - FCM_EnvelopeData *fed; - uiLayout *col, *row; - uiBlock *block; - uiBut *but; - PointerRNA ptr; - int i; - - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierEnvelope, fcm, &ptr); - - /* general settings */ - col = uiLayoutColumn(layout, true); - uiItemL(col, IFACE_("Envelope:"), ICON_NONE); - uiItemR(col, &ptr, "reference_value", 0, NULL, ICON_NONE); - - row = uiLayoutRow(col, true); - uiItemR(row, &ptr, "default_min", 0, IFACE_("Min"), ICON_NONE); - uiItemR(row, &ptr, "default_max", 0, IFACE_("Max"), ICON_NONE); - - /* control points header */ - /* TODO: move this control-point control stuff to using the new special widgets for lists - * the current way is far too cramped */ - row = uiLayoutRow(layout, false); - block = uiLayoutGetBlock(row); - - uiDefBut(block, UI_BTYPE_LABEL, 1, IFACE_("Control Points:"), 0, 0, 7.5 * UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - - but = uiDefBut(block, UI_BTYPE_BUT, B_FMODIFIER_REDRAW, IFACE_("Add Point"), 0, 0, 7.5 * UI_UNIT_X, UI_UNIT_Y, - NULL, 0, 0, 0, 0, TIP_("Add a new control-point to the envelope on the current frame")); - UI_but_func_set(but, fmod_envelope_addpoint_cb, env, NULL); - - /* control points list */ - for (i = 0, fed = env->data; i < env->totvert; i++, fed++) { - /* get a new row to operate on */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - - UI_block_align_begin(block); - but = uiDefButF(block, UI_BTYPE_NUM, B_FMODIFIER_REDRAW, IFACE_("Fra:"), 0, 0, 4.5 * UI_UNIT_X, UI_UNIT_Y, - &fed->time, -MAXFRAMEF, MAXFRAMEF, 10, 1, TIP_("Frame that envelope point occurs")); - UI_but_func_set(but, validate_fmodifier_cb, fcm, NULL); - - uiDefButF(block, UI_BTYPE_NUM, B_FMODIFIER_REDRAW, IFACE_("Min:"), 0, 0, 5 * UI_UNIT_X, UI_UNIT_Y, - &fed->min, -UI_FLT_MAX, UI_FLT_MAX, 10, 2, TIP_("Minimum bound of envelope at this point")); - uiDefButF(block, UI_BTYPE_NUM, B_FMODIFIER_REDRAW, IFACE_("Max:"), 0, 0, 5 * UI_UNIT_X, UI_UNIT_Y, - &fed->max, -UI_FLT_MAX, UI_FLT_MAX, 10, 2, TIP_("Maximum bound of envelope at this point")); - - but = uiDefIconBut(block, UI_BTYPE_BUT, B_FMODIFIER_REDRAW, ICON_X, 0, 0, 0.9 * UI_UNIT_X, UI_UNIT_Y, - NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Delete envelope control point")); - UI_but_func_set(but, fmod_envelope_deletepoint_cb, env, POINTER_FROM_INT(i)); - UI_block_align_begin(block); - } + FMod_Envelope *env = (FMod_Envelope *)fcm->data; + FCM_EnvelopeData *fed; + uiLayout *col, *row; + uiBlock *block; + uiBut *but; + PointerRNA ptr; + int i; + + /* init the RNA-pointer */ + RNA_pointer_create(fcurve_owner_id, &RNA_FModifierEnvelope, fcm, &ptr); + + /* general settings */ + col = uiLayoutColumn(layout, true); + uiItemL(col, IFACE_("Envelope:"), ICON_NONE); + uiItemR(col, &ptr, "reference_value", 0, NULL, ICON_NONE); + + row = uiLayoutRow(col, true); + uiItemR(row, &ptr, "default_min", 0, IFACE_("Min"), ICON_NONE); + uiItemR(row, &ptr, "default_max", 0, IFACE_("Max"), ICON_NONE); + + /* control points header */ + /* TODO: move this control-point control stuff to using the new special widgets for lists + * the current way is far too cramped */ + row = uiLayoutRow(layout, false); + block = uiLayoutGetBlock(row); + + uiDefBut(block, + UI_BTYPE_LABEL, + 1, + IFACE_("Control Points:"), + 0, + 0, + 7.5 * UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0, + 0, + ""); + + but = uiDefBut(block, + UI_BTYPE_BUT, + B_FMODIFIER_REDRAW, + IFACE_("Add Point"), + 0, + 0, + 7.5 * UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0, + 0, + 0, + 0, + TIP_("Add a new control-point to the envelope on the current frame")); + UI_but_func_set(but, fmod_envelope_addpoint_cb, env, NULL); + + /* control points list */ + for (i = 0, fed = env->data; i < env->totvert; i++, fed++) { + /* get a new row to operate on */ + row = uiLayoutRow(layout, true); + block = uiLayoutGetBlock(row); + + UI_block_align_begin(block); + but = uiDefButF(block, + UI_BTYPE_NUM, + B_FMODIFIER_REDRAW, + IFACE_("Fra:"), + 0, + 0, + 4.5 * UI_UNIT_X, + UI_UNIT_Y, + &fed->time, + -MAXFRAMEF, + MAXFRAMEF, + 10, + 1, + TIP_("Frame that envelope point occurs")); + UI_but_func_set(but, validate_fmodifier_cb, fcm, NULL); + + uiDefButF(block, + UI_BTYPE_NUM, + B_FMODIFIER_REDRAW, + IFACE_("Min:"), + 0, + 0, + 5 * UI_UNIT_X, + UI_UNIT_Y, + &fed->min, + -UI_FLT_MAX, + UI_FLT_MAX, + 10, + 2, + TIP_("Minimum bound of envelope at this point")); + uiDefButF(block, + UI_BTYPE_NUM, + B_FMODIFIER_REDRAW, + IFACE_("Max:"), + 0, + 0, + 5 * UI_UNIT_X, + UI_UNIT_Y, + &fed->max, + -UI_FLT_MAX, + UI_FLT_MAX, + 10, + 2, + TIP_("Maximum bound of envelope at this point")); + + but = uiDefIconBut(block, + UI_BTYPE_BUT, + B_FMODIFIER_REDRAW, + ICON_X, + 0, + 0, + 0.9 * UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0.0, + 0.0, + TIP_("Delete envelope control point")); + UI_but_func_set(but, fmod_envelope_deletepoint_cb, env, POINTER_FROM_INT(i)); + UI_block_align_begin(block); + } } /* --------------- */ /* draw settings for limits modifier */ -static void draw_modifier__limits(uiLayout *layout, ID *fcurve_owner_id, FModifier *fcm, short UNUSED(width)) +static void draw_modifier__limits(uiLayout *layout, + ID *fcurve_owner_id, + FModifier *fcm, + short UNUSED(width)) { - uiLayout *split, *col /* , *row */ /* UNUSED */; - PointerRNA ptr; - - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierLimits, fcm, &ptr); - - /* row 1: minimum */ - { - /* row = uiLayoutRow(layout, false); */ /* UNUSED */ - - /* split into 2 columns */ - split = uiLayoutSplit(layout, 0.5f, false); - - /* x-minimum */ - col = uiLayoutColumn(split, true); - uiItemR(col, &ptr, "use_min_x", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "min_x", 0, NULL, ICON_NONE); - - /* y-minimum*/ - col = uiLayoutColumn(split, true); - uiItemR(col, &ptr, "use_min_y", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "min_y", 0, NULL, ICON_NONE); - } - - /* row 2: maximum */ - { - /* row = uiLayoutRow(layout, false); */ /* UNUSED */ - - /* split into 2 columns */ - split = uiLayoutSplit(layout, 0.5f, false); - - /* x-minimum */ - col = uiLayoutColumn(split, true); - uiItemR(col, &ptr, "use_max_x", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "max_x", 0, NULL, ICON_NONE); - - /* y-minimum*/ - col = uiLayoutColumn(split, true); - uiItemR(col, &ptr, "use_max_y", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "max_y", 0, NULL, ICON_NONE); - } + uiLayout *split, *col /* , *row */ /* UNUSED */; + PointerRNA ptr; + + /* init the RNA-pointer */ + RNA_pointer_create(fcurve_owner_id, &RNA_FModifierLimits, fcm, &ptr); + + /* row 1: minimum */ + { + /* row = uiLayoutRow(layout, false); */ /* UNUSED */ + + /* split into 2 columns */ + split = uiLayoutSplit(layout, 0.5f, false); + + /* x-minimum */ + col = uiLayoutColumn(split, true); + uiItemR(col, &ptr, "use_min_x", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "min_x", 0, NULL, ICON_NONE); + + /* y-minimum*/ + col = uiLayoutColumn(split, true); + uiItemR(col, &ptr, "use_min_y", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "min_y", 0, NULL, ICON_NONE); + } + + /* row 2: maximum */ + { + /* row = uiLayoutRow(layout, false); */ /* UNUSED */ + + /* split into 2 columns */ + split = uiLayoutSplit(layout, 0.5f, false); + + /* x-minimum */ + col = uiLayoutColumn(split, true); + uiItemR(col, &ptr, "use_max_x", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "max_x", 0, NULL, ICON_NONE); + + /* y-minimum*/ + col = uiLayoutColumn(split, true); + uiItemR(col, &ptr, "use_max_y", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "max_y", 0, NULL, ICON_NONE); + } } /* --------------- */ /* draw settings for stepped interpolation modifier */ -static void draw_modifier__stepped(uiLayout *layout, ID *fcurve_owner_id, FModifier *fcm, short UNUSED(width)) +static void draw_modifier__stepped(uiLayout *layout, + ID *fcurve_owner_id, + FModifier *fcm, + short UNUSED(width)) { - uiLayout *col, *sub; - PointerRNA ptr; + uiLayout *col, *sub; + PointerRNA ptr; - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierStepped, fcm, &ptr); + /* init the RNA-pointer */ + RNA_pointer_create(fcurve_owner_id, &RNA_FModifierStepped, fcm, &ptr); - /* block 1: "stepping" settings */ - col = uiLayoutColumn(layout, false); - uiItemR(col, &ptr, "frame_step", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "frame_offset", 0, NULL, ICON_NONE); + /* block 1: "stepping" settings */ + col = uiLayoutColumn(layout, false); + uiItemR(col, &ptr, "frame_step", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "frame_offset", 0, NULL, ICON_NONE); - /* block 2: start range settings */ - col = uiLayoutColumn(layout, true); - uiItemR(col, &ptr, "use_frame_start", 0, NULL, ICON_NONE); + /* block 2: start range settings */ + col = uiLayoutColumn(layout, true); + uiItemR(col, &ptr, "use_frame_start", 0, NULL, ICON_NONE); - sub = uiLayoutColumn(col, true); - uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_frame_start")); - uiItemR(sub, &ptr, "frame_start", 0, NULL, ICON_NONE); + sub = uiLayoutColumn(col, true); + uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_frame_start")); + uiItemR(sub, &ptr, "frame_start", 0, NULL, ICON_NONE); - /* block 3: end range settings */ - col = uiLayoutColumn(layout, true); - uiItemR(col, &ptr, "use_frame_end", 0, NULL, ICON_NONE); + /* block 3: end range settings */ + col = uiLayoutColumn(layout, true); + uiItemR(col, &ptr, "use_frame_end", 0, NULL, ICON_NONE); - sub = uiLayoutColumn(col, true); - uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_frame_end")); - uiItemR(sub, &ptr, "frame_end", 0, NULL, ICON_NONE); + sub = uiLayoutColumn(col, true); + uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_frame_end")); + uiItemR(sub, &ptr, "frame_end", 0, NULL, ICON_NONE); } /* --------------- */ -void ANIM_uiTemplate_fmodifier_draw(uiLayout *layout, ID *fcurve_owner_id, - ListBase *modifiers, FModifier *fcm) +void ANIM_uiTemplate_fmodifier_draw(uiLayout *layout, + ID *fcurve_owner_id, + ListBase *modifiers, + FModifier *fcm) { - const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm); - uiLayout *box, *row, *sub, *col; - uiBlock *block; - uiBut *but; - short width = 314; - PointerRNA ptr; - - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifier, fcm, &ptr); - - /* draw header */ - { - /* get layout-row + UI-block for this */ - box = uiLayoutBox(layout); - - row = uiLayoutRow(box, false); - block = uiLayoutGetBlock(row); // err... - - /* left-align -------------------------------------------- */ - sub = uiLayoutRow(row, true); - uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT); - - UI_block_emboss_set(block, UI_EMBOSS_NONE); - - /* expand */ - uiItemR(sub, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); - - /* checkbox for 'active' status (for now) */ - uiItemR(sub, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); - - /* name */ - if (fmi) - uiItemL(sub, IFACE_(fmi->name), ICON_NONE); - else - uiItemL(sub, IFACE_("<Unknown Modifier>"), ICON_NONE); - - /* right-align ------------------------------------------- */ - sub = uiLayoutRow(row, true); - uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_RIGHT); - - - /* 'mute' button */ - uiItemR(sub, &ptr, "mute", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); - - UI_block_emboss_set(block, UI_EMBOSS_NONE); - - /* delete button */ - but = uiDefIconBut(block, UI_BTYPE_BUT, B_REDR, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, - NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Delete F-Curve Modifier")); - FModifierDeleteContext *ctx = MEM_mallocN(sizeof(FModifierDeleteContext), "fmodifier ctx"); - ctx->fcurve_owner_id = fcurve_owner_id; - ctx->modifiers = modifiers; - UI_but_funcN_set(but, delete_fmodifier_cb, ctx, fcm); - - UI_block_emboss_set(block, UI_EMBOSS); - } - - /* when modifier is expanded, draw settings */ - if (fcm->flag & FMODIFIER_FLAG_EXPANDED) { - /* set up the flexible-box layout which acts as the backdrop for the modifier settings */ - box = uiLayoutBox(layout); - - /* draw settings for individual modifiers */ - switch (fcm->type) { - case FMODIFIER_TYPE_GENERATOR: /* Generator */ - draw_modifier__generator(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_FN_GENERATOR: /* Built-In Function Generator */ - draw_modifier__fn_generator(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_CYCLES: /* Cycles */ - draw_modifier__cycles(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_ENVELOPE: /* Envelope */ - draw_modifier__envelope(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_LIMITS: /* Limits */ - draw_modifier__limits(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_NOISE: /* Noise */ - draw_modifier__noise(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_STEPPED: /* Stepped */ - draw_modifier__stepped(box, fcurve_owner_id, fcm, width); - break; - - default: /* unknown type */ - break; - } - - /* one last panel below this: FModifier range */ - // TODO: experiment with placement of this - { - box = uiLayoutBox(layout); - - /* restricted range ----------------------------------------------------- */ - col = uiLayoutColumn(box, true); - - /* top row: use restricted range */ - row = uiLayoutRow(col, true); - uiItemR(row, &ptr, "use_restricted_range", 0, NULL, ICON_NONE); - - if (fcm->flag & FMODIFIER_FLAG_RANGERESTRICT) { - /* second row: settings */ - row = uiLayoutRow(col, true); - - uiItemR(row, &ptr, "frame_start", 0, IFACE_("Start"), ICON_NONE); - uiItemR(row, &ptr, "frame_end", 0, IFACE_("End"), ICON_NONE); - - /* third row: blending influence */ - row = uiLayoutRow(col, true); - - uiItemR(row, &ptr, "blend_in", 0, IFACE_("In"), ICON_NONE); - uiItemR(row, &ptr, "blend_out", 0, IFACE_("Out"), ICON_NONE); - } - - /* influence -------------------------------------------------------------- */ - col = uiLayoutColumn(box, true); - - /* top row: use influence */ - uiItemR(col, &ptr, "use_influence", 0, NULL, ICON_NONE); - - if (fcm->flag & FMODIFIER_FLAG_USEINFLUENCE) { - /* second row: influence value */ - uiItemR(col, &ptr, "influence", 0, NULL, ICON_NONE); - } - } - } + const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm); + uiLayout *box, *row, *sub, *col; + uiBlock *block; + uiBut *but; + short width = 314; + PointerRNA ptr; + + /* init the RNA-pointer */ + RNA_pointer_create(fcurve_owner_id, &RNA_FModifier, fcm, &ptr); + + /* draw header */ + { + /* get layout-row + UI-block for this */ + box = uiLayoutBox(layout); + + row = uiLayoutRow(box, false); + block = uiLayoutGetBlock(row); // err... + + /* left-align -------------------------------------------- */ + sub = uiLayoutRow(row, true); + uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT); + + UI_block_emboss_set(block, UI_EMBOSS_NONE); + + /* expand */ + uiItemR(sub, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); + + /* checkbox for 'active' status (for now) */ + uiItemR(sub, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); + + /* name */ + if (fmi) + uiItemL(sub, IFACE_(fmi->name), ICON_NONE); + else + uiItemL(sub, IFACE_("<Unknown Modifier>"), ICON_NONE); + + /* right-align ------------------------------------------- */ + sub = uiLayoutRow(row, true); + uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_RIGHT); + + /* 'mute' button */ + uiItemR(sub, &ptr, "mute", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); + + UI_block_emboss_set(block, UI_EMBOSS_NONE); + + /* delete button */ + but = uiDefIconBut(block, + UI_BTYPE_BUT, + B_REDR, + ICON_X, + 0, + 0, + UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0.0, + 0.0, + TIP_("Delete F-Curve Modifier")); + FModifierDeleteContext *ctx = MEM_mallocN(sizeof(FModifierDeleteContext), "fmodifier ctx"); + ctx->fcurve_owner_id = fcurve_owner_id; + ctx->modifiers = modifiers; + UI_but_funcN_set(but, delete_fmodifier_cb, ctx, fcm); + + UI_block_emboss_set(block, UI_EMBOSS); + } + + /* when modifier is expanded, draw settings */ + if (fcm->flag & FMODIFIER_FLAG_EXPANDED) { + /* set up the flexible-box layout which acts as the backdrop for the modifier settings */ + box = uiLayoutBox(layout); + + /* draw settings for individual modifiers */ + switch (fcm->type) { + case FMODIFIER_TYPE_GENERATOR: /* Generator */ + draw_modifier__generator(box, fcurve_owner_id, fcm, width); + break; + + case FMODIFIER_TYPE_FN_GENERATOR: /* Built-In Function Generator */ + draw_modifier__fn_generator(box, fcurve_owner_id, fcm, width); + break; + + case FMODIFIER_TYPE_CYCLES: /* Cycles */ + draw_modifier__cycles(box, fcurve_owner_id, fcm, width); + break; + + case FMODIFIER_TYPE_ENVELOPE: /* Envelope */ + draw_modifier__envelope(box, fcurve_owner_id, fcm, width); + break; + + case FMODIFIER_TYPE_LIMITS: /* Limits */ + draw_modifier__limits(box, fcurve_owner_id, fcm, width); + break; + + case FMODIFIER_TYPE_NOISE: /* Noise */ + draw_modifier__noise(box, fcurve_owner_id, fcm, width); + break; + + case FMODIFIER_TYPE_STEPPED: /* Stepped */ + draw_modifier__stepped(box, fcurve_owner_id, fcm, width); + break; + + default: /* unknown type */ + break; + } + + /* one last panel below this: FModifier range */ + // TODO: experiment with placement of this + { + box = uiLayoutBox(layout); + + /* restricted range ----------------------------------------------------- */ + col = uiLayoutColumn(box, true); + + /* top row: use restricted range */ + row = uiLayoutRow(col, true); + uiItemR(row, &ptr, "use_restricted_range", 0, NULL, ICON_NONE); + + if (fcm->flag & FMODIFIER_FLAG_RANGERESTRICT) { + /* second row: settings */ + row = uiLayoutRow(col, true); + + uiItemR(row, &ptr, "frame_start", 0, IFACE_("Start"), ICON_NONE); + uiItemR(row, &ptr, "frame_end", 0, IFACE_("End"), ICON_NONE); + + /* third row: blending influence */ + row = uiLayoutRow(col, true); + + uiItemR(row, &ptr, "blend_in", 0, IFACE_("In"), ICON_NONE); + uiItemR(row, &ptr, "blend_out", 0, IFACE_("Out"), ICON_NONE); + } + + /* influence -------------------------------------------------------------- */ + col = uiLayoutColumn(box, true); + + /* top row: use influence */ + uiItemR(col, &ptr, "use_influence", 0, NULL, ICON_NONE); + + if (fcm->flag & FMODIFIER_FLAG_USEINFLUENCE) { + /* second row: influence value */ + uiItemR(col, &ptr, "influence", 0, NULL, ICON_NONE); + } + } + } } /* ********************************************** */ @@ -707,8 +1010,8 @@ static ListBase fmodifier_copypaste_buf = {NULL, NULL}; /* free the copy/paste buffer */ void ANIM_fmodifiers_copybuf_free(void) { - /* just free the whole buffer */ - free_fmodifiers(&fmodifier_copypaste_buf); + /* just free the whole buffer */ + free_fmodifiers(&fmodifier_copypaste_buf); } /* copy the given F-Modifiers to the buffer, returning whether anything was copied or not @@ -717,28 +1020,28 @@ void ANIM_fmodifiers_copybuf_free(void) */ bool ANIM_fmodifiers_copy_to_buf(ListBase *modifiers, bool active) { - bool ok = true; - - /* sanity checks */ - if (ELEM(NULL, modifiers, modifiers->first)) - return 0; - - /* copy the whole list, or just the active one? */ - if (active) { - FModifier *fcm = find_active_fmodifier(modifiers); - - if (fcm) { - FModifier *fcmN = copy_fmodifier(fcm); - BLI_addtail(&fmodifier_copypaste_buf, fcmN); - } - else - ok = 0; - } - else - copy_fmodifiers(&fmodifier_copypaste_buf, modifiers); - - /* did we succeed? */ - return ok; + bool ok = true; + + /* sanity checks */ + if (ELEM(NULL, modifiers, modifiers->first)) + return 0; + + /* copy the whole list, or just the active one? */ + if (active) { + FModifier *fcm = find_active_fmodifier(modifiers); + + if (fcm) { + FModifier *fcmN = copy_fmodifier(fcm); + BLI_addtail(&fmodifier_copypaste_buf, fcmN); + } + else + ok = 0; + } + else + copy_fmodifiers(&fmodifier_copypaste_buf, modifiers); + + /* did we succeed? */ + return ok; } /* 'Paste' the F-Modifier(s) from the buffer to the specified list @@ -746,40 +1049,40 @@ bool ANIM_fmodifiers_copy_to_buf(ListBase *modifiers, bool active) */ bool ANIM_fmodifiers_paste_from_buf(ListBase *modifiers, bool replace, FCurve *curve) { - FModifier *fcm; - bool ok = false; + FModifier *fcm; + bool ok = false; - /* sanity checks */ - if (modifiers == NULL) - return 0; + /* sanity checks */ + if (modifiers == NULL) + return 0; - bool was_cyclic = curve && BKE_fcurve_is_cyclic(curve); + bool was_cyclic = curve && BKE_fcurve_is_cyclic(curve); - /* if replacing the list, free the existing modifiers */ - if (replace) - free_fmodifiers(modifiers); + /* if replacing the list, free the existing modifiers */ + if (replace) + free_fmodifiers(modifiers); - /* now copy over all the modifiers in the buffer to the end of the list */ - for (fcm = fmodifier_copypaste_buf.first; fcm; fcm = fcm->next) { - /* make a copy of it */ - FModifier *fcmN = copy_fmodifier(fcm); + /* now copy over all the modifiers in the buffer to the end of the list */ + for (fcm = fmodifier_copypaste_buf.first; fcm; fcm = fcm->next) { + /* make a copy of it */ + FModifier *fcmN = copy_fmodifier(fcm); - fcmN->curve = curve; + fcmN->curve = curve; - /* make sure the new one isn't active, otherwise the list may get several actives */ - fcmN->flag &= ~FMODIFIER_FLAG_ACTIVE; + /* make sure the new one isn't active, otherwise the list may get several actives */ + fcmN->flag &= ~FMODIFIER_FLAG_ACTIVE; - /* now add it to the end of the list */ - BLI_addtail(modifiers, fcmN); - ok = 1; - } + /* now add it to the end of the list */ + BLI_addtail(modifiers, fcmN); + ok = 1; + } - /* adding or removing the Cycles modifier requires an update to handles */ - if (curve && BKE_fcurve_is_cyclic(curve) != was_cyclic) - calchandles_fcurve(curve); + /* adding or removing the Cycles modifier requires an update to handles */ + if (curve && BKE_fcurve_is_cyclic(curve) != was_cyclic) + calchandles_fcurve(curve); - /* did we succeed? */ - return ok; + /* did we succeed? */ + return ok; } /* ********************************************** */ |