diff options
Diffstat (limited to 'source/blender/editors/space_graph/space_graph.c')
-rw-r--r-- | source/blender/editors/space_graph/space_graph.c | 190 |
1 files changed, 95 insertions, 95 deletions
diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c index 2193a027f99..383c2b5b220 100644 --- a/source/blender/editors/space_graph/space_graph.c +++ b/source/blender/editors/space_graph/space_graph.c @@ -68,7 +68,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; @@ -77,15 +77,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; } @@ -97,82 +97,82 @@ static SpaceLink *graph_new(const bContext *C) Scene *scene = CTX_data_scene(C); 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_BOTTOM; - + /* 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); } @@ -182,13 +182,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 @@ -200,11 +200,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; } @@ -212,9 +212,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); @@ -232,45 +232,45 @@ static void graph_main_region_draw(const bContext *C, ARegion *ar) View2DScrollers *scrollers; float col[3]; short unitx = 0, unity = V2D_UNIT_VALUES, 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); /* 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); - + /* horizontal component of value-cursor (value line before the current frame line) */ if ((sipo->flag & SIPO_NODRAWCURSOR) == 0) { float y = sipo->cursorVal; - + /* Draw a green line to indicate the cursor value */ UI_ThemeColorShadeAlpha(TH_CFRAME, -10, -50); glEnable(GL_BLEND); @@ -283,17 +283,17 @@ static void graph_main_region_draw(const bContext *C, ARegion *ar) glDisable(GL_BLEND); } - + /* current frame or vertical component of vertical component of the cursor */ if (sipo->mode == SIPO_MODE_DRIVERS) { /* cursor x-value */ float x = sipo->cursorTime; - + /* to help differentiate this from the current frame, draw slightly darker like the horizontal one */ UI_ThemeColorShadeAlpha(TH_CFRAME, -40, -50); glEnable(GL_BLEND); glLineWidth(2.0); - + glBegin(GL_LINES); glVertex2f(x, v2d->cur.ymin); glVertex2f(x, v2d->cur.ymax); @@ -307,22 +307,22 @@ static void graph_main_region_draw(const bContext *C, ARegion *ar) if ((sipo->flag & SIPO_NODRAWCFRANUM) == 0) flag |= DRAWCFRA_SHOW_NUMBOX; ANIM_draw_cfra(C, v2d, 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); @@ -333,15 +333,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); @@ -355,22 +355,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); @@ -392,7 +392,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); @@ -454,7 +454,7 @@ static void graph_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), AReg if (wmn->data == ND_KEYS) ED_region_tag_redraw(ar); break; - + } } @@ -462,7 +462,7 @@ static void graph_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), AReg static void graph_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn) { SpaceIpo *sipo = (SpaceIpo *)sa->spacedata.first; - + /* context changes */ switch (wmn->category) { case NC_ANIMATION: @@ -479,7 +479,7 @@ static void graph_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn) sipo->flag |= SIPO_TEMP_NEEDCHANSYNC; ED_area_tag_refresh(sa); break; - + default: /* just redrawing the view will do */ ED_area_tag_redraw(sa); break; @@ -494,7 +494,7 @@ static void graph_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn) break; case ND_TRANSFORM: break; /*do nothing*/ - + default: /* just redrawing the view will do */ ED_area_tag_redraw(sa); break; @@ -517,7 +517,7 @@ static void graph_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn) ED_area_tag_refresh(sa); } break; - + // XXX: restore the case below if not enough updates occur... //default: // if (wmn->data == ND_KEYS) @@ -529,29 +529,29 @@ static void graph_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn) 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: @@ -563,11 +563,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); @@ -589,7 +589,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); @@ -600,29 +600,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; @@ -641,7 +641,7 @@ static void graph_refresh_fcurve_colors(const bContext *C) } } } - + /* free temp list */ ANIM_animdata_freelist(&anim_data); } @@ -649,24 +649,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) { @@ -674,7 +674,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); } @@ -682,7 +682,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 = (Group *)new_id; @@ -698,10 +698,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; @@ -721,7 +721,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; @@ -730,9 +730,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; @@ -741,9 +741,9 @@ void ED_spacetype_ipo(void) art->listener = graph_region_listener; 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; @@ -752,11 +752,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); } |