[Bf-extensions-cvs] [a996e50] master: Simplified progress reports: Use simple module-level settings for controlling output, and don't pass report types as extra args.
Lukas Tönne
noreply at git.blender.org
Tue Dec 16 10:24:15 CET 2014
Commit: a996e50204231290d8871ce96ecfe9904fc5da45
Author: Lukas Tönne
Date: Tue Dec 16 10:21:56 2014 +0100
Branches: master
https://developer.blender.org/rBACa996e50204231290d8871ce96ecfe9904fc5da45
Simplified progress reports: Use simple module-level settings for
controlling output, and don't pass report types as extra args.
===================================================================
M object_physics_meadow/hierarchical_dart_throw.py
M object_physics_meadow/meadow.py
M object_physics_meadow/patch.py
A object_physics_meadow/progress.py
M object_physics_meadow/ui.py
M object_physics_meadow/util.py
===================================================================
diff --git a/object_physics_meadow/hierarchical_dart_throw.py b/object_physics_meadow/hierarchical_dart_throw.py
index 78f8ca7..b395896 100644
--- a/object_physics_meadow/hierarchical_dart_throw.py
+++ b/object_physics_meadow/hierarchical_dart_throw.py
@@ -23,6 +23,7 @@ import bpy
from math import *
from object_physics_meadow.util import *
+from object_physics_meadow import progress
# Implements Poisson Disk sampling according to
# "Poisson Disk Point Sets by Hierarchical Dart Throwing"
@@ -62,7 +63,7 @@ class GridLevel():
for k in range(kmin, kmax):
for j in range(jmin, jmax):
for i in range(imin, imax):
- progress_add(1)
+ progress.progress_add(1)
self.cells[c] = GridCell(i, j, k)
c += 1
@@ -150,7 +151,7 @@ class PointGrid():
# modified range generator for progress reports
def range_progress(tot):
for i in range(tot):
- progress_add(1)
+ progress.progress_add(1)
yield i
# note: row-major, so we can address it with cells[i][j]
self.cells = tuple(tuple(PointCell() for j in range_progress(self.nb)) for i in range(self.na))
@@ -236,8 +237,7 @@ def split_cell(radius2, b0, pgrid, child_level, cell, x0, x1, y0, y1, z0, z1):
if not is_covered(radius2, b0, pgrid, child_level, ci, cj, cx0, cx1, cy0, cy1):
child_cell = child_level.activate(ci, cj, ck)
-def hierarchical_dart_throw_gen(radius, max_levels, xmin, xmax, ymin, ymax,
- progress_reporter=DummyProgressContext):
+def hierarchical_dart_throw_gen(radius, max_levels, xmin, xmax, ymin, ymax):
radius2 = radius * radius
gridmin = (xmin, ymin)
gridmax = (xmax, ymax)
@@ -253,15 +253,15 @@ def hierarchical_dart_throw_gen(radius, max_levels, xmin, xmax, ymin, ymax,
levels = [base_level] + [GridLevel(i, base_level.size / (2**i), radius) for i in range(1, max_levels)]
epsilon = levels[-1].weight * 0.5
- with progress_reporter("Activate Cells", 0, GridLevel.num_cells_in_range(imin, imax, jmin, jmax, 0, 1)):
+ with progress.ProgressContext("Activate Cells", 0, GridLevel.num_cells_in_range(imin, imax, jmin, jmax, 0, 1)):
base_level.set_active_cells(imin, imax, jmin, jmax, 0, 1)
- with progress_reporter("Init Spatial Grid", 0, PointGrid.num_cells(radius, gridmin, gridmax)):
+ with progress.ProgressContext("Init Spatial Grid", 0, PointGrid.num_cells(radius, gridmin, gridmax)):
pgrid = PointGrid(radius, gridmin, gridmax)
- with progress_reporter("Generate Samples", 0, num):
+ with progress.ProgressContext("Generate Samples", 0, num):
for i in range(num):
- progress_add(1)
+ progress.progress_add(1)
if not any(level.cells for level in levels):
break
diff --git a/object_physics_meadow/meadow.py b/object_physics_meadow/meadow.py
index 0e10bec..e3f2768 100644
--- a/object_physics_meadow/meadow.py
+++ b/object_physics_meadow/meadow.py
@@ -45,7 +45,7 @@ def make_samples(context, gridob, groundob):
# get a sample generator implementation
#gen = best_candidate_gen(groundob.meadow.patch_radius, xmin, xmax, ymin, ymax)
- gen = hierarchical_dart_throw_gen(groundob.meadow.patch_radius, groundob.meadow.sampling_levels, xmin, xmax, ymin, ymax, progress_reporter=make_progress_reporter(True, True))
+ gen = hierarchical_dart_throw_gen(groundob.meadow.patch_radius, groundob.meadow.sampling_levels, xmin, xmax, ymin, ymax)
mat = groundob.matrix_world
loc2D = [(mat * Vector(p[0:3] + (1.0,)))[0:2] for p in gen(groundob.meadow.seed, groundob.meadow.max_patches)]
diff --git a/object_physics_meadow/patch.py b/object_physics_meadow/patch.py
index 1270a18..aa48565 100644
--- a/object_physics_meadow/patch.py
+++ b/object_physics_meadow/patch.py
@@ -24,6 +24,7 @@ from bpy_extras import object_utils
from object_physics_meadow import settings as _settings
from object_physics_meadow.util import *
+from object_physics_meadow import progress
#-----------------------------------------------------------------------
@@ -243,7 +244,7 @@ def count_bakeable(context):
num += 1
return num
-def bake_all(context, progress_reporter):
+def bake_all(context):
settings = _settings.get(context)
wm = context.window_manager
@@ -252,13 +253,13 @@ def bake_all(context, progress_reporter):
total = count_bakeable(context)
- with progress_reporter("Bake Blob", 0, total):
+ with progress.ProgressContext("Bake Blob", 0, total):
for ob in patch_objects(context):
for psys in ob.particle_systems:
- progress_add(1)
+ progress.progress_add(1)
bake_psys(context, ob, psys)
-def patch_objects_rebake(context, progress_reporter=DummyProgressContext):
+def patch_objects_rebake(context):
settings = _settings.get(context)
wm = context.window_manager
@@ -270,6 +271,6 @@ def patch_objects_rebake(context, progress_reporter=DummyProgressContext):
# XXX have to set this because bake operator only bakes up to the last frame ...
scene.frame_current = scene.frame_end
- bake_all(context, progress_reporter)
+ bake_all(context)
scene.frame_set(curframe)
diff --git a/object_physics_meadow/progress.py b/object_physics_meadow/progress.py
new file mode 100644
index 0000000..16c5431
--- /dev/null
+++ b/object_physics_meadow/progress.py
@@ -0,0 +1,134 @@
+### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy, time, sys
+from math import *
+
+show_progress_bar = True
+show_stdout = False
+
+_progress_context = None
+
+def _get_time_string(x):
+ if x >= 0.0:
+ return time.strftime("%H:%M:%S", time.gmtime(x)) + ".%02d" % (int(x * 100.0) % 100)
+ else:
+ return "??:??:??.??"
+
+class ProgressContext():
+ def __init__(self, name, pmin, pmax):
+ self.name = name
+ self.pmin = pmin
+ self.pmax = pmax
+ self.tot = pmax - pmin
+ self.norm = 1.0 / float(self.tot) if self.tot > 0 else 0.0
+
+ self.pcur = pmin
+ self.perc_show = -2.0 # last displayed percentage, init to make sure we show the first time
+
+ self.duration = 0.0
+ self.start_time = 0.0
+
+ def __enter__(self):
+ global _progress_context, show_progress_bar, show_stdout
+
+ assert(_progress_context is None)
+ _progress_context = self
+
+ self.start_time = time.time()
+
+ if show_progress_bar:
+ wm = bpy.context.window_manager
+ # always use 0..100 percentage on the progress counter,
+ # it does not display large numbers well
+ wm.progress_begin(0, 100)
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ global _progress_context, show_progress_bar, show_stdout
+
+ if show_progress_bar:
+ wm = bpy.context.window_manager
+ wm.progress_end()
+
+ if show_stdout:
+ # make a final report
+ done = self.pcur - self.pmin
+ sys.stdout.write("\r>> {}: {}/{}, {}".format(self.name,
+ str(done).rjust(len(str(self.tot))), str(self.tot),
+ _get_time_string(self.duration)))
+ # clean newline
+ sys.stdout.write("\n")
+ sys.stdout.flush()
+
+ assert(_progress_context is self)
+ _progress_context = None
+
+ def estimate_total_duration(self):
+ done = self.pcur - self.pmin
+ if done > 0:
+ return self.duration * self.tot / done
+ else:
+ return -1.0
+
+ def set_progress(self, value, message):
+ global _progress_context, show_progress_bar, show_stdout
+
+ self.pcur = value
+ done = value - self.pmin
+ perc = 100.0 * done * self.norm
+
+ # only write to progress indicator or stdout if the percentage actually changed
+ # avoids overhead for very frequent updates
+ if perc > self.perc_show + 1.0:
+ self.perc_show = perc
+ perc = min(max(perc, 0), 100)
+
+ self.duration = time.time() - self.start_time
+
+ if show_progress_bar:
+ wm = bpy.context.window_manager
+ wm.progress_update(perc)
+
+ if show_stdout:
+ bar = 50
+ filled = int(bar * done * self.norm)
+
+ eta = self.estimate_total_duration()
+
+ sys.stdout.write("\r>> {}: {}/{} [{}{}] {}/{} | {}".format(self.name,
+ str(done).rjust(len(str(self.tot))), str(self.tot),
+ '.' * filled, ' ' * (bar - filled),
+ _get_time_string(self.duration), _get_time_string(eta),
+ message))
+ sys.stdout.flush()
+
+def progress_set(value, mess
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list