Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / space_graph / space_graph.c
index 84220ce..56236ea 100644 (file)
@@ -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);
 }