summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Seibert <stan@mtrr.org>2011-08-11 17:44:43 -0400
committerStan Seibert <stan@mtrr.org>2011-08-11 17:44:43 -0400
commit8487c83d39b12bd830325202a60848df0adf02f5 (patch)
tree54ae0ce9f8213ca045aa6522bd46a9e1105927e7
parent2b7ee5fb5a20fadfa24766442d2d3609ed291b63 (diff)
parent00aa07a12f8f00e29a3a04f2850ccd4fc91cc951 (diff)
downloadchroma-8487c83d39b12bd830325202a60848df0adf02f5.tar.gz
chroma-8487c83d39b12bd830325202a60848df0adf02f5.tar.bz2
chroma-8487c83d39b12bd830325202a60848df0adf02f5.zip
merge
-rw-r--r--geometry.py37
-rw-r--r--gpu.py7
-rw-r--r--itertoolset.py11
3 files changed, 30 insertions, 25 deletions
diff --git a/geometry.py b/geometry.py
index 35da2ac..9ef49bc 100644
--- a/geometry.py
+++ b/geometry.py
@@ -258,28 +258,9 @@ class Geometry(object):
pass
checksum = md5(str(bits))
-
+ checksum.update(str(shift))
checksum.update(self.mesh.vertices)
checksum.update(self.mesh.triangles)
- checksum.update(self.colors)
- checksum.update(self.solid_id)
- checksum.update(self.material1_index)
- checksum.update(self.material2_index)
- checksum.update(self.surface_index)
-
- for material in self.unique_materials:
- checksum.update(material.refractive_index)
- checksum.update(material.absorption_length)
- checksum.update(material.scattering_length)
-
- for surface in self.unique_surfaces:
- if surface is not None:
- checksum.update(surface.detect)
- checksum.update(surface.absorb)
- checksum.update(surface.reflect_diffuse)
- checksum.update(surface.reflect_specular)
- else:
- checksum.update(str(None))
cache_dir = os.path.expanduser('~/.chroma')
cache_file = checksum.hexdigest()
@@ -292,9 +273,16 @@ class Geometry(object):
else:
print 'loading cache.'
data = pickle.load(f)
- self.mesh.triangles = self.mesh.triangles[data['reorder']]
- del data['reorder']
- for key, value in data.items():
+
+ reorder = data.pop('reorder')
+ self.mesh.triangles = self.mesh.triangles[reorder]
+ self.material1_index = self.material1_index[reorder]
+ self.material2_index = self.material2_index[reorder]
+ self.surface_index = self.surface_index[reorder]
+ self.colors = self.colors[reorder]
+ self.solid_id = self.solid_id[reorder]
+
+ for key, value in data.iteritems():
setattr(self, key, value)
f.close()
return
@@ -365,8 +353,7 @@ class Geometry(object):
with gzip.GzipFile(cache_path, 'wb', compresslevel=1) as f:
data = {}
- for key in ['material1_index', 'material2_index', 'surface_index', 'colors', 'solid_id', 'lower_bounds', 'upper_bounds', 'node_map', 'node_map_end', 'layers', 'first_node']:
+ for key in ['lower_bounds', 'upper_bounds', 'node_map', 'node_map_end', 'layers', 'first_node']:
data[key] = getattr(self, key)
data['reorder'] = reorder
pickle.dump(data, f, -1)
-
diff --git a/gpu.py b/gpu.py
index fbf1fef..f0cf19e 100644
--- a/gpu.py
+++ b/gpu.py
@@ -176,6 +176,13 @@ class GPU(object):
self.geometry = geometry
+ print 'average of %f child nodes per node' % (np.mean(geometry.node_map_end[geometry.first_node:] - geometry.node_map[geometry.first_node:]))
+
+ print '%i nodes with one child' % (np.count_nonzero((geometry.node_map_end[geometry.first_node:] - geometry.node_map[geometry.first_node:]) == 1))
+
+ print '%i leaf nodes with one child' % (np.count_nonzero((geometry.node_map_end[:geometry.first_node] - geometry.node_map[:geometry.first_node]) == 1))
+
+
self.print_device_usage()
def reset_colors(self):
diff --git a/itertoolset.py b/itertoolset.py
index bd4e45c..9d5200c 100644
--- a/itertoolset.py
+++ b/itertoolset.py
@@ -1,4 +1,5 @@
from itertools import *
+import collections
def roundrobin(*iterables):
"""roundrobin('ABC', 'D', 'EF') --> A D E B F C"""
@@ -36,3 +37,13 @@ def ncycles(iterable, n):
def take(n, iterable):
"Return first n items of the iterable as a list"
return list(islice(iterable, n))
+
+def consume(iterator, n=None):
+ "Advance the iterator n-steps ahead. If n is none, consume entirely."
+ # Use functions that consume iterators at C speed.
+ if n is None:
+ # feed the entire iterator into a zero-length deque
+ collections.deque(iterator, maxlen=0)
+ else:
+ # advance to the empty slice starting at position n
+ next(islice(iterator, n, n), None)