[Bf-blender-cvs] [cd62b50] compositor-2016: Dynamicpaint: fix (unreported) missing progress bar in early baking stage.

Bastien Montagne noreply at git.blender.org
Wed Jun 8 21:48:48 CEST 2016


Commit: cd62b50b6c3234b966faa65389f01a880b658835
Author: Bastien Montagne
Date:   Sat May 21 16:09:35 2016 +0200
Branches: compositor-2016
https://developer.blender.org/rBcd62b50b6c3234b966faa65389f01a880b658835

Dynamicpaint: fix (unreported) missing progress bar in early baking stage.

Nothing was shown in UI during pre-bake step, while it can take several minutes
to complete with heavy geometry.

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

M	source/blender/blenkernel/BKE_dynamicpaint.h
M	source/blender/blenkernel/intern/dynamicpaint.c
M	source/blender/editors/physics/dynamicpaint_ops.c

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

diff --git a/source/blender/blenkernel/BKE_dynamicpaint.h b/source/blender/blenkernel/BKE_dynamicpaint.h
index 0025617..5abb53d 100644
--- a/source/blender/blenkernel/BKE_dynamicpaint.h
+++ b/source/blender/blenkernel/BKE_dynamicpaint.h
@@ -82,7 +82,7 @@ void dynamicPaint_resetPreview(struct DynamicPaintCanvasSettings *canvas);
 struct DynamicPaintSurface *get_activeSurface(struct DynamicPaintCanvasSettings *canvas);
 
 /* image sequence baking */
-int dynamicPaint_createUVSurface(struct Scene *scene, struct DynamicPaintSurface *surface);
+int dynamicPaint_createUVSurface(struct Scene *scene, struct DynamicPaintSurface *surface, float *progress, short *do_update);
 int dynamicPaint_calculateFrame(struct DynamicPaintSurface *surface, struct Scene *scene, struct Object *cObject, int frame);
 void dynamicPaint_outputSurfaceImage(struct DynamicPaintSurface *surface, char *filename, short output_layer);
 
diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c
index 2dc0388..d593ec7 100644
--- a/source/blender/blenkernel/intern/dynamicpaint.c
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -2496,7 +2496,7 @@ static int dynamic_paint_find_neighbour_pixel(
 	}
 }
 
-int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface)
+int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface, float *progress, short *do_update)
 {
 	/* Antialias jitter point relative coords	*/
 	const int aa_samples = (surface->flags & MOD_DPAINT_ANTIALIAS) ? 5 : 1;
@@ -2517,6 +2517,9 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface)
 	Bounds2D *faceBB = NULL;
 	int *final_index;
 
+	*progress = 0.0f;
+	*do_update = true;
+
 	if (!dm)
 		return setError(canvas, N_("Canvas mesh not updated"));
 	if (surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ)
@@ -2575,6 +2578,9 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface)
 			error = true;
 	}
 
+	*progress = 0.01f;
+	*do_update = true;
+
 	if (!error) {
 		for (int i = 0; i < tottri; i++) {
 			copy_v2_v2(faceBB[i].min, mloopuv[mlooptri[i].tri[0]].uv);
@@ -2585,6 +2591,9 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface)
 			}
 		}
 
+		*progress = 0.02f;
+		*do_update = true;
+
 		/* Loop through every pixel and check if pixel is uv-mapped on a canvas face. */
 		DynamicPaintCreateUVSurfaceData data = {
 		    .surface = surface, .tempPoints = tempPoints, .tempWeights = tempWeights,
@@ -2593,6 +2602,9 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface)
 		};
 		BLI_task_parallel_range(0, h, &data, dynamic_paint_create_uv_surface_direct_cb, h > 64 || tottri > 1000);
 
+		*progress = 0.04f;
+		*do_update = true;
+
 		/*
 		 *	Now loop through every pixel that was left without index
 		 *	and find if they have neighboring pixels that have an index.
@@ -2602,6 +2614,9 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface)
 		data.active_points = &active_points;
 		BLI_task_parallel_range(0, h, &data, dynamic_paint_create_uv_surface_neighbor_cb, h > 64);
 
+		*progress = 0.06f;
+		*do_update = true;
+
 		/*	Generate surface adjacency data. */
 		{
 			int cursor = 0;
@@ -2660,6 +2675,9 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface)
 			}
 		}
 
+		*progress = 0.08f;
+		*do_update = true;
+
 		/* Create final surface data without inactive points */
 		ImgSeqFormatData *f_data = MEM_callocN(sizeof(*f_data), "ImgSeqFormatData");
 		if (f_data) {
@@ -2740,6 +2758,9 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface)
 		dynamicPaint_setInitialColor(scene, surface);
 	}
 
+	*progress = 0.09f;
+	*do_update = true;
+
 	return (error == 0);
 }
 
diff --git a/source/blender/editors/physics/dynamicpaint_ops.c b/source/blender/editors/physics/dynamicpaint_ops.c
index a5d2d2c..3d7a458 100644
--- a/source/blender/editors/physics/dynamicpaint_ops.c
+++ b/source/blender/editors/physics/dynamicpaint_ops.c
@@ -350,6 +350,9 @@ static void dynamicPaint_bakeImageSequence(DynamicPaintBakeJob *job)
 		return;
 	}
 
+	/* Show progress bar. */
+	*(job->do_update) = true;
+
 	/* Set frame to start point (also inits modifier data) */
 	frame = surface->start_frame;
 	orig_frame = scene->r.cfra;
@@ -357,14 +360,15 @@ static void dynamicPaint_bakeImageSequence(DynamicPaintBakeJob *job)
 	ED_update_for_newframe(job->bmain, scene, 1);
 
 	/* Init surface	*/
-	if (!dynamicPaint_createUVSurface(scene, surface)) {
+	if (!dynamicPaint_createUVSurface(scene, surface, job->progress, job->do_update)) {
 		job->success = 0;
 		return;
 	}
 
 	/* Loop through selected frames */
 	for (frame = surface->start_frame; frame <= surface->end_frame; frame++) {
-		float progress = (frame - surface->start_frame) / (float)frames;
+		/* The first 10% are for createUVSurface... */
+		const float progress = 0.1f + 0.9f * (frame - surface->start_frame) / (float)frames;
 		surface->current_frame = frame;
 
 		/* If user requested stop, quit baking */




More information about the Bf-blender-cvs mailing list