[Bf-blender-cvs] [f46223f] master: Bake-API: progress (bar) working

Dalai Felinto noreply at git.blender.org
Thu Jul 17 15:31:03 CEST 2014


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",




More information about the Bf-blender-cvs mailing list