Commit: f46223f29e64f6a460b5e7a405d3d38abf765d79
Author: Dalai Felinto
Date:   Thu Jul 17 10:29:18 2014 -0300
https://developer.blender.org/rBf46223f29e64f6a460b5e7a405d3d38abf765d79

Bake-API: progress (bar) working

Note: This makes no change to the user, the render engine (Cycles) still
need to update the progress during baking. But this is the Blender side
of this.

===================================================================

M       source/blender/editors/object/object_bake_api.c

===================================================================

diff --git a/source/blender/editors/object/object_bake_api.c 
b/source/blender/editors/object/object_bake_api.c
index b45ac12..f57ab22 100644
--- a/source/blender/editors/object/object_bake_api.c
+++ b/source/blender/editors/object/object_bake_api.c
@@ -74,6 +74,63 @@
 
 #include "object_intern.h"
 
+
+typedef struct BakeAPIRender {
+       Object *ob;
+       Main *main;
+       Scene *scene;
+       ReportList *reports;
+       ListBase selected_objects;
+
+       ScenePassType pass_type;
+       int margin;
+
+       int save_mode;
+
+       bool is_clear;
+       bool is_split_materials;
+       bool is_automatic_name;
+       bool is_selected_to_active;
+       bool is_cage;
+
+       float cage_extrusion;
+       int normal_space;
+       BakeNormalSwizzle normal_swizzle[3];
+
+       char uv_layer[MAX_CUSTOMDATA_LAYER_NAME];
+       char custom_cage[MAX_NAME];
+       char filepath[FILE_MAX];
+
+       int width;
+       int height;
+       const char *identifier;
+
+       int result;
+       bool ready;
+
+       /* callbacks */
+       Render *render;
+       float *progress;
+       short *do_update;
+
+       /* for redrawing */
+       ScrArea *sa;
+} BakeAPIRender;
+
+/* callbacks */
+
+static void bake_progress_update(void *bjv, float progress)
+{
+       BakeAPIRender *bj = bjv;
+
+       if (bj->progress && *bj->progress != progress) {
+               *bj->progress = progress;
+
+               /* make jobs timer to send notifier */
+               *(bj->do_update) = true;
+       }
+}
+
 /* catch esc */
 static int bake_modal(bContext *C, wmOperator *UNUSED(op), const wmEvent 
*event)
 {
@@ -473,45 +530,8 @@ static int initialize_internal_images(BakeImages 
*bake_images, ReportList *repor
        return tot_size;
 }
 
-typedef struct BakeAPIRender {
-       Object *ob;
-       Main *main;
-       Scene *scene;
-       ReportList *reports;
-       ListBase selected_objects;
-
-       ScenePassType pass_type;
-       int margin;
-
-       int save_mode;
-
-       bool is_clear;
-       bool is_split_materials;
-       bool is_automatic_name;
-       bool is_selected_to_active;
-       bool is_cage;
-
-       float cage_extrusion;
-       int normal_space;
-       BakeNormalSwizzle normal_swizzle[3];
-
-       char uv_layer[MAX_CUSTOMDATA_LAYER_NAME];
-       char custom_cage[MAX_NAME];
-       char filepath[FILE_MAX];
-
-       int width;
-       int height;
-       const char *identifier;
-
-       int result;
-       bool ready;
-
-       /* for redrawing */
-       ScrArea *sa;
-} BakeAPIRender;
-
 static int bake(
-        Main *bmain, Scene *scene, Object *ob_low, ListBase *selected_objects, 
ReportList *reports,
+        Render *re, Main *bmain, Scene *scene, Object *ob_low, ListBase 
*selected_objects, ReportList *reports,
         const ScenePassType pass_type, const int margin,
         const BakeSaveMode save_mode, const bool is_clear, const bool 
is_split_materials,
         const bool is_automatic_name, const bool is_selected_to_active, const 
bool is_cage,
@@ -532,7 +552,6 @@ static int bake(
 
        Mesh *me_low = NULL;
        Mesh *me_cage = NULL;
-       Render *re;
 
        float *result = NULL;
 
@@ -548,9 +567,6 @@ static int bake(
        int tot_materials;
        int i;
 
-       re = RE_NewRender(scene->id.name);
-       RE_SetReports(re, NULL);
-
        RE_bake_engine_set_engine_parameters(re, bmain, scene);
 
        if (!RE_bake_has_engine(re)) {
@@ -647,11 +663,6 @@ static int bake(
                }
        }
 
-       /* blender_test_break uses this global */
-       G.is_break = false;
-
-       RE_test_break_cb(re, NULL, bake_break);
-
        pixel_array_low = MEM_callocN(sizeof(BakePixel) * num_pixels, "bake 
pixels low poly");
        result = MEM_callocN(sizeof(float) * depth * num_pixels, "bake return 
pixels");
 
@@ -1038,6 +1049,8 @@ static void bake_init_api_data(wmOperator *op, bContext 
*C, BakeAPIRender *bkr)
 
        bkr->result = OPERATOR_CANCELLED;
 
+       bkr->render = RE_NewRender(bkr->scene->id.name);
+
        /* XXX hack to force saving to always be internal. Whether (and how) to 
support
         * external saving will be addressed later */
        bkr->save_mode = R_BAKE_SAVE_INTERNAL;
@@ -1045,10 +1058,16 @@ static void bake_init_api_data(wmOperator *op, bContext 
*C, BakeAPIRender *bkr)
 
 static int bake_exec(bContext *C, wmOperator *op)
 {
+       Render *re;
        int result = OPERATOR_CANCELLED;
        BakeAPIRender bkr = {NULL};
 
        bake_init_api_data(op, C, &bkr);
+       re = bkr.render;
+
+       /* setup new render */
+       RE_test_break_cb(re, NULL, bake_break);
+       RE_progress_cb(re, NULL, bake_progress_update);
 
        if (!bake_objects_check(bkr.main, bkr.ob, &bkr.selected_objects, 
bkr.reports, bkr.is_selected_to_active))
                return OPERATOR_CANCELLED;
@@ -1058,9 +1077,11 @@ static int bake_exec(bContext *C, wmOperator *op)
                bake_images_clear(bkr.main, is_tangent);
        }
 
+       RE_SetReports(re, bkr.reports);
+
        if (bkr.is_selected_to_active) {
                result = bake(
-                       bkr.main, bkr.scene, bkr.ob, &bkr.selected_objects, 
bkr.reports,
+                       bkr.render, bkr.main, bkr.scene, bkr.ob, 
&bkr.selected_objects, bkr.reports,
                        bkr.pass_type, bkr.margin, bkr.save_mode,
                        bkr.is_clear, bkr.is_split_materials, 
bkr.is_automatic_name, true, bkr.is_cage,
                        bkr.cage_extrusion, bkr.normal_space, 
bkr.normal_swizzle,
@@ -1073,7 +1094,7 @@ static int bake_exec(bContext *C, wmOperator *op)
                for (link = bkr.selected_objects.first; link; link = 
link->next) {
                        Object *ob_iter = link->ptr.data;
                        result = bake(
-                               bkr.main, bkr.scene, ob_iter, NULL, bkr.reports,
+                               bkr.render, bkr.main, bkr.scene, ob_iter, NULL, 
bkr.reports,
                                bkr.pass_type, bkr.margin, bkr.save_mode,
                                is_clear, bkr.is_split_materials, 
bkr.is_automatic_name, false, bkr.is_cage,
                                bkr.cage_extrusion, bkr.normal_space, 
bkr.normal_swizzle,
@@ -1082,14 +1103,22 @@ static int bake_exec(bContext *C, wmOperator *op)
                }
        }
 
+       RE_SetReports(re, NULL);
+
        BLI_freelistN(&bkr.selected_objects);
        return result;
 }
 
-static void bake_startjob(void *bkv, short *UNUSED(stop), short 
*UNUSED(do_update), float *UNUSED(progress))
+static void bake_startjob(void *bkv, short *UNUSED(stop), short *do_update, 
float *progress)
 {
        BakeAPIRender *bkr = (BakeAPIRender *)bkv;
 
+       /* setup new render */
+       bkr->do_update = do_update;
+       bkr->progress = progress;
+
+       RE_SetReports(bkr->render, bkr->reports);
+
        if (!bake_objects_check(bkr->main, bkr->ob, &bkr->selected_objects, 
bkr->reports, bkr->is_selected_to_active)) {
                bkr->result = OPERATOR_CANCELLED;
                return;
@@ -1102,7 +1131,7 @@ static void bake_startjob(void *bkv, short *UNUSED(stop), 
short *UNUSED(do_updat
 
        if (bkr->is_selected_to_active) {
                bkr->result = bake(
-                       bkr->main, bkr->scene, bkr->ob, &bkr->selected_objects, 
bkr->reports,
+                       bkr->render, bkr->main, bkr->scene, bkr->ob, 
&bkr->selected_objects, bkr->reports,
                        bkr->pass_type, bkr->margin, bkr->save_mode,
                        bkr->is_clear, bkr->is_split_materials, 
bkr->is_automatic_name, true, bkr->is_cage,
                        bkr->cage_extrusion, bkr->normal_space, 
bkr->normal_swizzle,
@@ -1115,7 +1144,7 @@ static void bake_startjob(void *bkv, short *UNUSED(stop), 
short *UNUSED(do_updat
                for (link = bkr->selected_objects.first; link; link = 
link->next) {
                        Object *ob_iter = link->ptr.data;
                        bkr->result = bake(
-                               bkr->main, bkr->scene, ob_iter, NULL, 
bkr->reports,
+                               bkr->render, bkr->main, bkr->scene, ob_iter, 
NULL, bkr->reports,
                                bkr->pass_type, bkr->margin, bkr->save_mode,
                                is_clear, bkr->is_split_materials, 
bkr->is_automatic_name, false, bkr->is_cage,
                                bkr->cage_extrusion, bkr->normal_space, 
bkr->normal_swizzle,
@@ -1126,6 +1155,8 @@ static void bake_startjob(void *bkv, short *UNUSED(stop), 
short *UNUSED(do_updat
                                return;
                }
        }
+
+       RE_SetReports(bkr->render, NULL);
 }
 
 static void bake_freejob(void *bkv)
@@ -1228,6 +1259,7 @@ static int bake_invoke(bContext *C, wmOperator *op, const 
wmEvent *UNUSED(event)
 {
        wmJob *wm_job;
        BakeAPIRender *bkr;
+       Render *re;
        Scene *scene = CTX_data_scene(C);
 
        bake_set_props(op, scene);
@@ -1240,6 +1272,11 @@ static int bake_invoke(bContext *C, wmOperator *op, 
const wmEvent *UNUSED(event)
 
        /* init bake render */
        bake_init_api_data(op, C, bkr);
+       re = bkr->render;
+
+       /* setup new render */
+       RE_test_break_cb(re, NULL, bake_break);
+       RE_progress_cb(re, bkr, bake_progress_update);
 
        /* setup job */
        wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, 
"Texture Bake",

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to