Preview Range Tweak:
authorJoshua Leung <aligorith@gmail.com>
Tue, 19 Jan 2010 20:30:04 +0000 (20:30 +0000)
committerJoshua Leung <aligorith@gmail.com>
Tue, 19 Jan 2010 20:30:04 +0000 (20:30 +0000)
Made preview range be turned on/off using a proper flag instead of just relying on checking for start-frame = 0. It is no longer satisfactory to do that since we can have negative frame numbers, and also having it as a proper flag means that the range can be toggled on/off non-destructively.

source/blender/editors/animation/anim_draw.c
source/blender/editors/animation/anim_ops.c
source/blender/editors/screen/screen_ops.c
source/blender/editors/space_action/action_edit.c
source/blender/editors/space_graph/graph_edit.c
source/blender/editors/space_graph/space_graph.c
source/blender/editors/space_node/node_edit.c
source/blender/editors/space_time/time_ops.c
source/blender/makesdna/DNA_scene_types.h
source/blender/makesrna/intern/rna_scene.c

index f8a5a9daa06cc1690dc8baa171db30a8ec2fa0ae..6b1933a791f9a0f69ed31935b0652faa40deec17 100644 (file)
@@ -215,7 +215,7 @@ void ANIM_draw_previewrange (const bContext *C, View2D *v2d)
        Scene *scene= CTX_data_scene(C);
        
        /* only draw this if preview range is set */
-       if (scene->r.psfra) {
+       if (PRVRANGEON) {
                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                glEnable(GL_BLEND);
                glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
index 9544bb7085510aa6863aa591200c396656003304..82a2b615681006e5ea41efb19858a0f1ed382d11 100644 (file)
@@ -205,6 +205,7 @@ static int previewrange_define_exec(bContext *C, wmOperator *op)
        if (efra < 1) efra = 1.0f;
        if (efra < sfra) efra= sfra;
        
+       scene->r.flag |= SCER_PRV_RANGE;
        scene->r.psfra= (int)floor(sfra + 0.5f);
        scene->r.pefra= (int)floor(efra + 0.5f);
        
@@ -251,6 +252,7 @@ static int previewrange_clear_exec(bContext *C, wmOperator *op)
                return OPERATOR_CANCELLED;
        
        /* simply clear values */
+       scene->r.flag &= ~SCER_PRV_RANGE;
        scene->r.psfra= 0;
        scene->r.pefra= 0;
        
index f1e0f9c6bf1c2226d33a32189f373c94ae76d01f..87b61d2df27673caaf555ba72f70559881fcf37c 100644 (file)
@@ -2429,7 +2429,7 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event)
                
                if (sad->flag & ANIMPLAY_FLAG_REVERSE) {
                        /* jump back to end? */
-                       if (scene->r.psfra) {
+                       if (PRVRANGEON) {
                                if (scene->r.cfra < scene->r.psfra) {
                                        scene->r.cfra= scene->r.pefra;
                                        sad->flag |= ANIMPLAY_FLAG_JUMPED;
@@ -2444,7 +2444,7 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event)
                }
                else {
                        /* jump back to start? */
-                       if (scene->r.psfra) {
+                       if (PRVRANGEON) {
                                if (scene->r.cfra > scene->r.pefra) {
                                        scene->r.cfra= scene->r.psfra;
                                        sad->flag |= ANIMPLAY_FLAG_JUMPED;
index d94d5bec4909dc5809e7ca89c86a5d65aff39284..1ab4364951d6c065044457b5c00cc918cd2ae188 100644 (file)
@@ -214,6 +214,7 @@ static int actkeys_previewrange_exec(bContext *C, wmOperator *op)
        
        /* set the range directly */
        get_keyframe_extents(&ac, &min, &max);
+       scene->r.flag |= SCER_PRV_RANGE;
        scene->r.psfra= (int)floor(min + 0.5f);
        scene->r.pefra= (int)floor(max + 0.5f);
        
index db63499d645d5d4adddeae1da848e91294324c19..9fda92a58520b5d959e4c1974bf3f2d739f295c4 100644 (file)
@@ -174,6 +174,7 @@ static int graphkeys_previewrange_exec(bContext *C, wmOperator *op)
        
        /* set the range directly */
        get_graph_keyframe_extents(&ac, &min, &max, NULL, NULL);
+       scene->r.flag |= SCER_PRV_RANGE;
        scene->r.psfra= (int)floor(min + 0.5f);
        scene->r.pefra= (int)floor(max + 0.5f);
        
index cf99e3602dd6176dc7640088288490da5172c4b0..bd37eb996ce49e9139d977cdf6133784f79059b2 100644 (file)
@@ -151,8 +151,8 @@ static SpaceLink *graph_new(const bContext *C)
        
        ar->v2d.cur= ar->v2d.tot;
        
-       ar->v2d.min[0]= 0.001f;
-       ar->v2d.min[1]= 0.001f;
+       ar->v2d.min[0]= 0.00001f;
+       ar->v2d.min[1]= 0.00001f;
        
        ar->v2d.max[0]= MAXFRAMEF;
        ar->v2d.max[1]= 50000.0f;
index 9e10feb898d1f6830c29ee3ba649c4c10f9abd6c..bd9c56bf8a003d13a0e36657f7064a429bdf8825 100644 (file)
@@ -1118,7 +1118,7 @@ static bNodeSocket *best_socket_input(bNodeTree *ntree, bNode *node, int num, in
 {
        bNodeSocket *sock;
        int socktype, maxtype=0;
-       int a;
+       int a = 0;
        
        for (sock=node->inputs.first; sock; sock=sock->next) {
                maxtype = MAX2(sock->type, maxtype);
index b4eb3231b506ac723c1dc9b2ad0b7f9980bb27af..e3ea2ea29eaaf9508576c2395e71c4f24c77f05b 100644 (file)
@@ -69,7 +69,7 @@ static int time_set_sfra_exec (bContext *C, wmOperator *op)
        if (PEFRA < frame) frame= PEFRA;
                
        /* if Preview Range is defined, set the 'start' frame for that */
-       if (scene->r.psfra)
+       if (PRVRANGEON)
                scene->r.psfra= frame;
        else
                scene->r.sfra= frame;
@@ -109,7 +109,7 @@ static int time_set_efra_exec (bContext *C, wmOperator *op)
        if (PSFRA > frame) frame= PSFRA;
                
        /* if Preview Range is defined, set the 'end' frame for that */
-       if (scene->r.psfra) /* start frame 0 is used to check if the preview is used at all */
+       if (PRVRANGEON)
                scene->r.pefra= frame;
        else
                scene->r.efra= frame;
index 85f75684d857f78533b81c8cd02534a74de0878e..7ea4bb1b0222972414ef072bb57df052de783c24 100644 (file)
@@ -789,6 +789,10 @@ typedef struct Scene {
 #define R_FRONTBUF             4
 #define R_FRONTBUFANIM 8
 
+/* flag */
+       /* use preview range */
+#define SCER_PRV_RANGE (1<<0)
+
 /* mode (int now) */
 #define R_OSA                  0x0001
 #define R_SHADOW               0x0002
@@ -991,8 +995,9 @@ typedef struct Scene {
 #define        F_CFRA                  ((float)(scene->r.cfra))
 #define        SFRA                    (scene->r.sfra)
 #define        EFRA                    (scene->r.efra)
-#define PSFRA                  ((scene->r.psfra != 0)? (scene->r.psfra): (scene->r.sfra))
-#define PEFRA                  ((scene->r.psfra != 0)? (scene->r.pefra): (scene->r.efra))
+#define PRVRANGEON             (scene->r.flag & SCER_PRV_RANGE)
+#define PSFRA                  ((PRVRANGEON)? (scene->r.psfra): (scene->r.sfra))
+#define PEFRA                  ((PRVRANGEON)? (scene->r.pefra): (scene->r.efra))
 #define FRA2TIME(a)           ((((double) scene->r.frs_sec_base) * (a)) / scene->r.frs_sec)
 #define TIME2FRA(a)           ((((double) scene->r.frs_sec) * (a)) / scene->r.frs_sec_base)
 #define FPS                     (((double) scene->r.frs_sec) / scene->r.frs_sec_base)
index d68ac2ce14ce72c9ae6be03300b1fa73920e7014..f75f6244fa276f54d292f6571ae937972090c115 100644 (file)
@@ -227,28 +227,21 @@ static void rna_Scene_end_frame_set(PointerRNA *ptr, int value)
        data->r.efra= value;
 }
 
-static int rna_Scene_use_preview_range_get(PointerRNA *ptr)
-{
-       Scene *data= (Scene*)ptr->data;
-       
-       /* this is simply overloaded to assume that preview-range 
-        * start frame cannot be less than 1 when on,
-        * so psfra=0 means 'off'
-        */
-       return (data->r.psfra != 0);
-}
-
 static void rna_Scene_use_preview_range_set(PointerRNA *ptr, int value)
 {
        Scene *data= (Scene*)ptr->data;
        
-       /* if enable, copy range from render-range, otherwise just clear */
        if (value) {
-               data->r.psfra= data->r.sfra;
-               data->r.pefra= data->r.efra;
+               /* copy range from scene if not set before */
+               if ((data->r.psfra == data->r.pefra) && (data->r.psfra == 0)) {
+                       data->r.psfra= data->r.sfra;
+                       data->r.pefra= data->r.efra;
+               }
+               
+               data->r.flag |= SCER_PRV_RANGE;
        }
        else
-               data->r.psfra= 0;
+               data->r.flag &= ~SCER_PRV_RANGE;
 }
 
 
@@ -257,14 +250,14 @@ static void rna_Scene_preview_range_start_frame_set(PointerRNA *ptr, int value)
        Scene *data= (Scene*)ptr->data;
        
        /* check if enabled already */
-       if (data->r.psfra == 0) {
+       if ((data->r.flag & SCER_PRV_RANGE) == 0) {
                /* set end of preview range to end frame, then clamp as per normal */
                // TODO: or just refuse to set instead?
                data->r.pefra= data->r.efra;
        }
        
        /* now set normally */
-       CLAMP(value, 1, data->r.pefra);
+       CLAMP(value, MINAFRAME, data->r.pefra);
        data->r.psfra= value;
 }
 
@@ -273,7 +266,7 @@ static void rna_Scene_preview_range_end_frame_set(PointerRNA *ptr, int value)
        Scene *data= (Scene*)ptr->data;
        
        /* check if enabled already */
-       if (data->r.psfra == 0) {
+       if ((data->r.flag & SCER_PRV_RANGE) == 0) {
                /* set start of preview range to start frame, then clamp as per normal */
                // TODO: or just refuse to set instead?
                data->r.psfra= data->r.sfra; 
@@ -2522,9 +2515,10 @@ void RNA_def_scene(BlenderRNA *brna)
        RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
        
        /* Preview Range (frame-range for UI playback) */
-       prop=RNA_def_property(srna, "use_preview_range", PROP_BOOLEAN, PROP_NONE); /* use_preview_range is not really a separate setting in SDNA */
+       prop=RNA_def_property(srna, "use_preview_range", PROP_BOOLEAN, PROP_NONE); 
        RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
-       RNA_def_property_boolean_funcs(prop, "rna_Scene_use_preview_range_get", "rna_Scene_use_preview_range_set");
+       RNA_def_property_boolean_sdna(prop, NULL, "r.flag", SCER_PRV_RANGE);
+       RNA_def_property_boolean_funcs(prop, NULL, "rna_Scene_use_preview_range_set");
        RNA_def_property_ui_text(prop, "Use Preview Range", "");
        RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);