diff options
Diffstat (limited to 'geometry.py')
-rw-r--r-- | geometry.py | 89 |
1 files changed, 74 insertions, 15 deletions
diff --git a/geometry.py b/geometry.py index 0657a77..579e01d 100644 --- a/geometry.py +++ b/geometry.py @@ -1,7 +1,10 @@ import sys +import os import numpy as np from itertoolset import * from tools import timeit +from hashlib import md5 +import cPickle as pickle # all material/surface properties are interpolated at these # wavelengths when they are sent to the gpu @@ -227,43 +230,88 @@ class Geometry(object): self.mesh = Mesh(vertices, triangles) - zvalues_mesh = morton_order(self.mesh, bits) - reorder = np.argsort(zvalues_mesh) - zvalues_mesh = zvalues_mesh[reorder] - - if (np.diff(zvalues_mesh) < 0).any(): - raise Exception('zvalues_mesh out of order.') + self.colors = np.concatenate([solid.color for solid in self.solids]) - self.mesh.triangles = self.mesh.triangles[reorder] + self.solid_id = np.concatenate([np.fromiter(repeat(i, len(solid.mesh.triangles)), dtype=np.uint32) for i, solid in enumerate(self.solids)]) self.unique_materials = list(np.unique(np.concatenate([solid.unique_materials for solid in self.solids]))) material_lookup = dict(zip(self.unique_materials, range(len(self.unique_materials)))) self.material1_index = \ - np.fromiter(imap(material_lookup.get, chain(*[solid.material1 for solid in self.solids])), dtype=np.int32)[reorder] + np.fromiter(imap(material_lookup.get, chain(*[solid.material1 for solid in self.solids])), dtype=np.int32) self.material2_index = \ - np.fromiter(imap(material_lookup.get, chain(*[solid.material2 for solid in self.solids])), dtype=np.int32)[reorder] + np.fromiter(imap(material_lookup.get, chain(*[solid.material2 for solid in self.solids])), dtype=np.int32) self.unique_surfaces = list(np.unique(np.concatenate([solid.unique_surfaces for solid in self.solids]))) surface_lookup = dict(zip(self.unique_surfaces, range(len(self.unique_surfaces)))) self.surface_index = \ - np.fromiter(imap(surface_lookup.get, chain(*[solid.surface for solid in self.solids])), dtype=np.int32)[reorder] + np.fromiter(imap(surface_lookup.get, chain(*[solid.surface for solid in self.solids])), dtype=np.int32) try: self.surface_index[self.surface_index == self.unique_surfaces.index(None)] = -1 except ValueError: pass - self.colors = \ - np.concatenate([solid.color for solid in self.solids])[reorder] + checksum = md5(str(bits)) + + 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() + cache_path = os.path.join(cache_dir, cache_file) - self.solid_id = \ - np.concatenate([np.tile(i, len(solid.mesh)) for i, solid in \ - enumerate(self.solids)])[reorder] + try: + f = open(cache_path, 'rb') + except IOError: + pass + 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(): + setattr(self, key, value) + f.close() + return + + zvalues_mesh = morton_order(self.mesh, bits) + reorder = np.argsort(zvalues_mesh) + zvalues_mesh = zvalues_mesh[reorder] + + if (np.diff(zvalues_mesh) < 0).any(): + raise Exception('zvalues_mesh out of order.') + + 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] unique_zvalues = np.unique(zvalues_mesh) @@ -308,3 +356,14 @@ class Geometry(object): if unique_zvalues.size == 1: break + + if not os.path.exists(cache_dir): + os.makedirs(cache_dir) + + f = open(cache_path, 'wb') + 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']: + data[key] = getattr(self, key) + data['reorder'] = reorder + pickle.dump(data, f, -1) + f.close() |