diff options
Diffstat (limited to 'source/blender/editors/space_graph/space_graph.c')
-rw-r--r-- | source/blender/editors/space_graph/space_graph.c | 192 |
1 files changed, 96 insertions, 96 deletions
diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c index 84220ce6faf..56236ea8f47 100644 --- a/source/blender/editors/space_graph/space_graph.c +++ b/source/blender/editors/space_graph/space_graph.c @@ -71,7 +71,7 @@ ARegion *graph_has_buttons_region(ScrArea *sa) { ARegion *ar, *arnew; - + ar = BKE_area_find_region_type(sa, RGN_TYPE_UI); if (ar) return ar; @@ -80,15 +80,15 @@ ARegion *graph_has_buttons_region(ScrArea *sa) /* is error! */ if (ar == NULL) return NULL; - + arnew = MEM_callocN(sizeof(ARegion), "buttons for graph"); - + BLI_insertlinkafter(&sa->regionbase, ar, arnew); arnew->regiontype = RGN_TYPE_UI; arnew->alignment = RGN_ALIGN_RIGHT; - + arnew->flag = RGN_FLAG_HIDDEN; - + return arnew; } @@ -99,82 +99,82 @@ static SpaceLink *graph_new(const ScrArea *UNUSED(sa), const Scene *scene) { ARegion *ar; SpaceIpo *sipo; - + /* Graph Editor - general stuff */ sipo = MEM_callocN(sizeof(SpaceIpo), "init graphedit"); sipo->spacetype = SPACE_IPO; - + sipo->autosnap = SACTSNAP_FRAME; - + /* allocate DopeSheet data for Graph Editor */ sipo->ads = MEM_callocN(sizeof(bDopeSheet), "GraphEdit DopeSheet"); sipo->ads->source = (ID *)scene; - + /* settings for making it easier by default to just see what you're interested in tweaking */ sipo->ads->filterflag |= ADS_FILTER_ONLYSEL; sipo->flag |= SIPO_SELVHANDLESONLY; - + /* header */ ar = MEM_callocN(sizeof(ARegion), "header for graphedit"); - + BLI_addtail(&sipo->regionbase, ar); ar->regiontype = RGN_TYPE_HEADER; ar->alignment = RGN_ALIGN_TOP; - + /* channels */ ar = MEM_callocN(sizeof(ARegion), "channels region for graphedit"); - + BLI_addtail(&sipo->regionbase, ar); ar->regiontype = RGN_TYPE_CHANNELS; ar->alignment = RGN_ALIGN_LEFT; - + ar->v2d.scroll = (V2D_SCROLL_RIGHT | V2D_SCROLL_BOTTOM); - + /* ui buttons */ ar = MEM_callocN(sizeof(ARegion), "buttons region for graphedit"); - + BLI_addtail(&sipo->regionbase, ar); ar->regiontype = RGN_TYPE_UI; ar->alignment = RGN_ALIGN_RIGHT; ar->flag = RGN_FLAG_HIDDEN; - + /* main region */ ar = MEM_callocN(sizeof(ARegion), "main region for graphedit"); - + BLI_addtail(&sipo->regionbase, ar); ar->regiontype = RGN_TYPE_WINDOW; - + ar->v2d.tot.xmin = 0.0f; ar->v2d.tot.ymin = (float)scene->r.sfra - 10.0f; ar->v2d.tot.xmax = (float)scene->r.efra; ar->v2d.tot.ymax = 10.0f; - + ar->v2d.cur = ar->v2d.tot; - + ar->v2d.min[0] = FLT_MIN; ar->v2d.min[1] = FLT_MIN; ar->v2d.max[0] = MAXFRAMEF; ar->v2d.max[1] = FLT_MAX; - + ar->v2d.scroll = (V2D_SCROLL_BOTTOM | V2D_SCROLL_SCALE_HORIZONTAL); ar->v2d.scroll |= (V2D_SCROLL_LEFT | V2D_SCROLL_SCALE_VERTICAL); - + ar->v2d.keeptot = 0; - + return (SpaceLink *)sipo; } /* not spacelink itself */ static void graph_free(SpaceLink *sl) -{ +{ SpaceIpo *si = (SpaceIpo *)sl; - + if (si->ads) { BLI_freelistN(&si->ads->chanbase); MEM_freeN(si->ads); } - + if (si->ghostCurves.first) free_fcurves(&si->ghostCurves); } @@ -184,13 +184,13 @@ static void graph_free(SpaceLink *sl) static void graph_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa) { SpaceIpo *sipo = (SpaceIpo *)sa->spacedata.first; - + /* init dopesheet data if non-existent (i.e. for old files) */ if (sipo->ads == NULL) { sipo->ads = MEM_callocN(sizeof(bDopeSheet), "GraphEdit DopeSheet"); sipo->ads->source = (ID *)(G.main->scene.first); // FIXME: this is a really nasty hack here for now... } - + /* force immediate init of any invalid F-Curve colors */ /* XXX: but, don't do SIPO_TEMP_NEEDCHANSYNC (i.e. channel select state sync) * as this is run on each region resize; setting this here will cause selection @@ -202,11 +202,11 @@ static void graph_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa) static SpaceLink *graph_duplicate(SpaceLink *sl) { SpaceIpo *sipon = MEM_dupallocN(sl); - + /* clear or remove stuff from old */ BLI_duplicatelist(&sipon->ghostCurves, &((SpaceIpo *)sl)->ghostCurves); sipon->ads = MEM_dupallocN(sipon->ads); - + return (SpaceLink *)sipon; } @@ -214,9 +214,9 @@ static SpaceLink *graph_duplicate(SpaceLink *sl) static void graph_main_region_init(wmWindowManager *wm, ARegion *ar) { wmKeyMap *keymap; - + UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy); - + /* own keymap */ keymap = WM_keymap_find(wm->defaultconf, "Graph Editor", SPACE_IPO, 0); WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); @@ -235,42 +235,42 @@ static void graph_main_region_draw(const bContext *C, ARegion *ar) View2DScrollers *scrollers; float col[3]; short unitx = 0, unity = V2D_UNIT_VALUES, cfra_flag = 0; - + /* clear and setup matrix */ UI_GetThemeColor3fv(TH_BACK, col); glClearColor(col[0], col[1], col[2], 0.0); glClear(GL_COLOR_BUFFER_BIT); - + UI_view2d_view_ortho(v2d); - + /* grid */ unitx = ((sipo->mode == SIPO_MODE_ANIMATION) && (sipo->flag & SIPO_DRAWTIME)) ? V2D_UNIT_SECONDS : V2D_UNIT_FRAMESCALE; grid = UI_view2d_grid_calc(CTX_data_scene(C), v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP, ar->winx, ar->winy); UI_view2d_grid_draw(v2d, grid, V2D_GRIDLINES_ALL); - + ED_region_draw_cb_draw(C, ar, REGION_DRAW_PRE_VIEW); - + /* start and end frame (in F-Curve mode only) */ if (sipo->mode != SIPO_MODE_DRIVERS) { ANIM_draw_framerange(scene, v2d); } - + /* draw data */ if (ANIM_animdata_get_context(C, &ac)) { /* draw ghost curves */ graph_draw_ghost_curves(&ac, sipo, ar); - + /* draw curves twice - unselected, then selected, so that the are fewer occlusion problems */ graph_draw_curves(&ac, sipo, ar, grid, 0); graph_draw_curves(&ac, sipo, ar, grid, 1); - + /* XXX the slow way to set tot rect... but for nice sliders needed (ton) */ get_graph_keyframe_extents(&ac, &v2d->tot.xmin, &v2d->tot.xmax, &v2d->tot.ymin, &v2d->tot.ymax, false, true); /* extra offset so that these items are visible */ v2d->tot.xmin -= 10.0f; v2d->tot.xmax += 10.0f; } - + /* only free grid after drawing data, as we need to use it to determine sampling rate */ UI_view2d_grid_free(grid); @@ -322,28 +322,28 @@ static void graph_main_region_draw(const bContext *C, ARegion *ar) if (sipo->flag & SIPO_DRAWTIME) cfra_flag |= DRAWCFRA_UNIT_SECONDS; ANIM_draw_cfra(C, v2d, cfra_flag); } - + /* markers */ UI_view2d_view_orthoSpecial(ar, v2d, 1); ED_markers_draw(C, DRAW_MARKERS_MARGIN); - + /* preview range */ UI_view2d_view_ortho(v2d); ANIM_draw_previewrange(C, v2d, 0); - + /* callback */ UI_view2d_view_ortho(v2d); ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW); /* reset view matrix */ UI_view2d_view_restore(C); - + /* scrollers */ // FIXME: args for scrollers depend on the type of data being shown... scrollers = UI_view2d_scrollers_calc(C, v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP); UI_view2d_scrollers_draw(C, v2d, scrollers); UI_view2d_scrollers_free(scrollers); - + /* draw current frame number-indicator on top of scrollers */ if ((sipo->mode != SIPO_MODE_DRIVERS) && ((sipo->flag & SIPO_NODRAWCFRANUM) == 0)) { UI_view2d_view_orthoSpecial(ar, v2d, 1); @@ -354,15 +354,15 @@ static void graph_main_region_draw(const bContext *C, ARegion *ar) static void graph_channel_region_init(wmWindowManager *wm, ARegion *ar) { wmKeyMap *keymap; - + /* make sure we keep the hide flags */ ar->v2d.scroll |= V2D_SCROLL_RIGHT; ar->v2d.scroll &= ~(V2D_SCROLL_LEFT | V2D_SCROLL_TOP | V2D_SCROLL_BOTTOM); /* prevent any noise of past */ ar->v2d.scroll |= V2D_SCROLL_HORIZONTAL_HIDE; ar->v2d.scroll |= V2D_SCROLL_VERTICAL_HIDE; - + UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy); - + /* own keymap */ keymap = WM_keymap_find(wm->defaultconf, "Animation Channels", 0, 0); WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); @@ -376,22 +376,22 @@ static void graph_channel_region_draw(const bContext *C, ARegion *ar) View2D *v2d = &ar->v2d; View2DScrollers *scrollers; float col[3]; - + /* clear and setup matrix */ UI_GetThemeColor3fv(TH_BACK, col); glClearColor(col[0], col[1], col[2], 0.0); glClear(GL_COLOR_BUFFER_BIT); - + UI_view2d_view_ortho(v2d); - + /* draw channels */ if (ANIM_animdata_get_context(C, &ac)) { graph_draw_channel_names((bContext *)C, &ac, ar); } - + /* reset view matrix */ UI_view2d_view_restore(C); - + /* scrollers */ scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY); UI_view2d_scrollers_draw(C, v2d, scrollers); @@ -413,7 +413,7 @@ static void graph_header_region_draw(const bContext *C, ARegion *ar) static void graph_buttons_region_init(wmWindowManager *wm, ARegion *ar) { wmKeyMap *keymap; - + ED_region_panels_init(wm, ar); keymap = WM_keymap_find(wm->defaultconf, "Graph Editor Generic", SPACE_IPO, 0); @@ -483,7 +483,7 @@ static void graph_region_listener( if (wmn->data == ND_KEYS) ED_region_tag_redraw(ar); break; - + } } @@ -525,7 +525,7 @@ static void graph_region_message_subscribe( WM_msg_subscribe_rna(mbus, &idptr, props[i], &msg_sub_value_region_tag_redraw, __func__); } } - + /* All dopesheet filter settings, etc. affect the drawing of this editor, * also same applies for all animation-related datatypes that may appear here, * so just whitelist the entire structs for updates @@ -534,12 +534,12 @@ static void graph_region_message_subscribe( wmMsgParams_RNA msg_key_params = {{{0}}}; StructRNA *type_array[] = { &RNA_DopeSheet, /* dopesheet filters */ - + &RNA_ActionGroup, /* channel groups */ &RNA_FCurve, /* F-Curve */ &RNA_Keyframe, &RNA_FCurveSample, - + &RNA_FModifier, /* F-Modifiers (XXX: Why can't we just do all subclasses too?) */ &RNA_FModifierCycles, &RNA_FModifierEnvelope, @@ -568,7 +568,7 @@ static void graph_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn, Sc WorkSpace *UNUSED(workspace)) { SpaceIpo *sipo = (SpaceIpo *)sa->spacedata.first; - + /* context changes */ switch (wmn->category) { case NC_ANIMATION: @@ -585,7 +585,7 @@ static void graph_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn, Sc sipo->flag |= SIPO_TEMP_NEEDCHANSYNC; ED_area_tag_refresh(sa); break; - + default: /* just redrawing the view will do */ ED_area_tag_redraw(sa); break; @@ -600,7 +600,7 @@ static void graph_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn, Sc break; case ND_TRANSFORM: break; /*do nothing*/ - + default: /* just redrawing the view will do */ ED_area_tag_redraw(sa); break; @@ -623,7 +623,7 @@ static void graph_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn, Sc ED_area_tag_refresh(sa); } break; - + // XXX: restore the case below if not enough updates occur... //default: // if (wmn->data == ND_KEYS) @@ -635,29 +635,29 @@ static void graph_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn, Sc static void graph_refresh_fcurve_colors(const bContext *C) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; size_t items; int filter; int i; - + if (ANIM_animdata_get_context(C, &ac) == false) return; - + UI_SetTheme(SPACE_IPO, RGN_TYPE_WINDOW); - + /* build list of F-Curves which will be visible as channels in channel-region * - we don't include ANIMFILTER_CURVEVISIBLE filter, as that will result in a * mismatch between channel-colors and the drawn curves */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_NODUPLIS); items = ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* loop over F-Curves, assigning colors */ for (ale = anim_data.first, i = 0; ale; ale = ale->next, i++) { FCurve *fcu = (FCurve *)ale->data; - + /* set color of curve here */ switch (fcu->color_mode) { case FCURVE_COLOR_CUSTOM: @@ -669,11 +669,11 @@ static void graph_refresh_fcurve_colors(const bContext *C) } case FCURVE_COLOR_AUTO_RGB: { - /* F-Curve's array index is automatically mapped to RGB values. This works best of 3-value vectors. + /* F-Curve's array index is automatically mapped to RGB values. This works best of 3-value vectors. * TODO: find a way to module the hue so that not all curves have same color... */ float *col = fcu->color; - + switch (fcu->array_index) { case 0: UI_GetThemeColor3fv(TH_AXIS_X, col); @@ -695,7 +695,7 @@ static void graph_refresh_fcurve_colors(const bContext *C) { /* Like FCURVE_COLOR_AUTO_RGB, except this is for quaternions... */ float *col = fcu->color; - + switch (fcu->array_index) { case 1: UI_GetThemeColor3fv(TH_AXIS_X, col); @@ -706,29 +706,29 @@ static void graph_refresh_fcurve_colors(const bContext *C) case 3: UI_GetThemeColor3fv(TH_AXIS_Z, col); break; - + case 0: { /* Special Case: "W" channel should be yellowish, so blend X and Y channel colors... */ float c1[3], c2[3]; float h1[3], h2[3]; float hresult[3]; - + /* - get colors (rgb) */ UI_GetThemeColor3fv(TH_AXIS_X, c1); UI_GetThemeColor3fv(TH_AXIS_Y, c2); - + /* - perform blending in HSV space (to keep brightness similar) */ rgb_to_hsv_v(c1, h1); rgb_to_hsv_v(c2, h2); - + interp_v3_v3v3(hresult, h1, h2, 0.5f); - + /* - convert back to RGB for display */ hsv_to_rgb_v(hresult, col); break; } - + default: /* 'unknown' color - bluish so as to not conflict with handles */ col[0] = 0.3f; col[1] = 0.8f; col[2] = 1.0f; @@ -747,7 +747,7 @@ static void graph_refresh_fcurve_colors(const bContext *C) } } } - + /* free temp list */ ANIM_animdata_freelist(&anim_data); } @@ -755,24 +755,24 @@ static void graph_refresh_fcurve_colors(const bContext *C) static void graph_refresh(const bContext *C, ScrArea *sa) { SpaceIpo *sipo = (SpaceIpo *)sa->spacedata.first; - + /* updates to data needed depends on Graph Editor mode... */ switch (sipo->mode) { case SIPO_MODE_ANIMATION: /* all animation */ { break; } - + case SIPO_MODE_DRIVERS: /* drivers only */ { break; } } - + /* region updates? */ // XXX re-sizing y-extents of tot should go here? - - /* update the state of the animchannels in response to changes from the data they represent + + /* update the state of the animchannels in response to changes from the data they represent * NOTE: the temp flag is used to indicate when this needs to be done, and will be cleared once handled */ if (sipo->flag & SIPO_TEMP_NEEDCHANSYNC) { @@ -780,7 +780,7 @@ static void graph_refresh(const bContext *C, ScrArea *sa) sipo->flag &= ~SIPO_TEMP_NEEDCHANSYNC; ED_area_tag_redraw(sa); } - + /* init/adjust F-Curve colors */ graph_refresh_fcurve_colors(C); } @@ -788,7 +788,7 @@ static void graph_refresh(const bContext *C, ScrArea *sa) static void graph_id_remap(ScrArea *UNUSED(sa), SpaceLink *slink, ID *old_id, ID *new_id) { SpaceIpo *sgraph = (SpaceIpo *)slink; - + if (sgraph->ads) { if ((ID *)sgraph->ads->filter_grp == old_id) { sgraph->ads->filter_grp = (Collection *)new_id; @@ -804,10 +804,10 @@ void ED_spacetype_ipo(void) { SpaceType *st = MEM_callocN(sizeof(SpaceType), "spacetype ipo"); ARegionType *art; - + st->spaceid = SPACE_IPO; strncpy(st->name, "Graph", BKE_ST_MAXNAME); - + st->new = graph_new; st->free = graph_free; st->init = graph_init; @@ -828,7 +828,7 @@ void ED_spacetype_ipo(void) art->keymapflag = ED_KEYMAP_VIEW2D | ED_KEYMAP_MARKERS | ED_KEYMAP_ANIMATION | ED_KEYMAP_FRAMES; BLI_addhead(&st->regiontypes, art); - + /* regions: header */ art = MEM_callocN(sizeof(ARegionType), "spacetype graphedit region"); art->regionid = RGN_TYPE_HEADER; @@ -837,9 +837,9 @@ void ED_spacetype_ipo(void) art->listener = graph_region_listener; art->init = graph_header_region_init; art->draw = graph_header_region_draw; - + BLI_addhead(&st->regiontypes, art); - + /* regions: channels */ art = MEM_callocN(sizeof(ARegionType), "spacetype graphedit region"); art->regionid = RGN_TYPE_CHANNELS; @@ -849,9 +849,9 @@ void ED_spacetype_ipo(void) art->message_subscribe = graph_region_message_subscribe; art->init = graph_channel_region_init; art->draw = graph_channel_region_draw; - + BLI_addhead(&st->regiontypes, art); - + /* regions: UI buttons */ art = MEM_callocN(sizeof(ARegionType), "spacetype graphedit region"); art->regionid = RGN_TYPE_UI; @@ -860,11 +860,11 @@ void ED_spacetype_ipo(void) art->listener = graph_region_listener; art->init = graph_buttons_region_init; art->draw = graph_buttons_region_draw; - + BLI_addhead(&st->regiontypes, art); graph_buttons_register(art); - + BKE_spacetype_register(st); } |