summaryrefslogtreecommitdiff
path: root/geometry.py
diff options
context:
space:
mode:
Diffstat (limited to 'geometry.py')
-rw-r--r--geometry.py67
1 files changed, 37 insertions, 30 deletions
diff --git a/geometry.py b/geometry.py
index 6ea8994..b2cb9c0 100644
--- a/geometry.py
+++ b/geometry.py
@@ -225,7 +225,7 @@ class Geometry(object):
return len(self.solids)-1
@timeit
- def build(self, bits=8, shift=3):
+ def build(self, bits=8, shift=3, use_cache=True):
"""
Build the bounding volume hierarchy, material/surface code arrays, and
color array for this geometry. If the bounding volume hierarchy is
@@ -240,6 +240,11 @@ class Geometry(object):
The number of bits to shift the zvalue of each node when
building the next layer of the bounding volume hierarchy.
Defaults to 3.
+ - use_cache: bool, *optional*
+ If true, the on-disk cache in ~/.chroma/ will be checked for
+ a previously built version of this geometry, otherwise the
+ BVH will be computed and saved to the cache. If false,
+ the cache is ignored and also not updated.
"""
nv = np.cumsum([0] + [len(solid.mesh.vertices) for solid in self.solids])
nt = np.cumsum([0] + [len(solid.mesh.triangles) for solid in self.solids])
@@ -286,26 +291,27 @@ class Geometry(object):
cache_file = checksum.hexdigest()
cache_path = os.path.join(cache_dir, cache_file)
- try:
- f = gzip.GzipFile(cache_path, 'rb')
- except IOError:
- pass
- else:
- print 'loading cache.'
- data = pickle.load(f)
-
- 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
+ if use_cache:
+ try:
+ f = gzip.GzipFile(cache_path, 'rb')
+ except IOError:
+ pass
+ else:
+ print 'loading cache.'
+ data = pickle.load(f)
+
+ 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
zvalues_mesh = morton_order(self.mesh, bits)
reorder = np.argsort(zvalues_mesh)
@@ -366,14 +372,15 @@ class Geometry(object):
if unique_zvalues.size == 1:
break
- print >>sys.stderr, 'Writing BVH to cache directory...'
+ if use_cache:
+ print >>sys.stderr, 'Writing BVH to cache directory...'
- if not os.path.exists(cache_dir):
- os.makedirs(cache_dir)
+ if not os.path.exists(cache_dir):
+ os.makedirs(cache_dir)
- with gzip.GzipFile(cache_path, 'wb', compresslevel=1) as f:
- data = {}
- 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)
+ with gzip.GzipFile(cache_path, 'wb', compresslevel=1) as f:
+ data = {}
+ 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)