diff options
Diffstat (limited to 'geometry.py')
-rw-r--r-- | geometry.py | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/geometry.py b/geometry.py index f0f5c20..08ce291 100644 --- a/geometry.py +++ b/geometry.py @@ -1,3 +1,4 @@ +import sys import numpy as np import pycuda.driver as cuda from pycuda import gpuarray @@ -119,9 +120,15 @@ class Surface(object): def __init__(self, name='none'): self.name = name - self.absorption = None - self.reflection_diffuse = None - self.reflection_specular = None + self.set('detect', 0) + self.set('absorb', 0) + self.set('reflect_diffuse', 0) + self.set('reflect_specular', 0) + + #self.detect = None + #self.absorb = None + #self.reflect_diffuse = None + #self.reflect_specular = None def set(self, name, value, wavelengths=standard_wavelengths): if np.iterable(value): @@ -202,7 +209,7 @@ class Geometry(object): return len(self.solids)-1 - def build(self, bits=8): + def build(self, bits=8, shift=3): offsets = [ (0,0) ] for solid in self.solids: offsets.append( (offsets[-1][0] + len(solid.mesh.vertices), @@ -246,7 +253,10 @@ class Geometry(object): self.surface_index = \ np.fromiter(imap(surface_lookup.get, chain(*[solid.surface for solid in self.solids])), dtype=np.int32)[reorder] - self.surface_index[self.surface_index == self.unique_surfaces.index(None)] = -1 + 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] @@ -262,6 +272,9 @@ class Geometry(object): self.upper_bounds = np.empty((unique_zvalues.size,3), dtype=np.float32) self.node_map = np.empty(unique_zvalues.size, dtype=np.uint32) self.node_length = np.empty(unique_zvalues.size, dtype=np.uint32) + self.layers = np.empty(unique_zvalues.size, dtype=np.uint32) + + layer = 0 for i, z in enumerate(unique_zvalues): i1 = np.searchsorted(zvalues_mesh, z) @@ -277,6 +290,7 @@ class Geometry(object): self.node_map[i] = i1 self.node_length[i] = i2-i1 + self.layers[i] = layer zvalues[i] = z @@ -284,8 +298,10 @@ class Geometry(object): begin_last_layer = 0 + layer += 1 + while True: - bit_shifted_zvalues = zvalues >> 1 + bit_shifted_zvalues = zvalues >> shift unique_bit_shifted_zvalues = np.unique(bit_shifted_zvalues) zvalues = np.empty(unique_bit_shifted_zvalues.size, dtype=np.uint64) @@ -299,6 +315,8 @@ class Geometry(object): self.node_length.resize(\ self.node_length.size+unique_bit_shifted_zvalues.size) + self.layers.resize(self.layers.size+unique_bit_shifted_zvalues.size) + for i, z in enumerate(unique_bit_shifted_zvalues): i1 = np.searchsorted(bit_shifted_zvalues, z) + \ begin_last_layer @@ -321,9 +339,12 @@ class Geometry(object): self.node_map[i] = i1 self.node_length[i] = i2-i1 + self.layers[i] = layer begin_last_layer += bit_shifted_zvalues.size + layer += 1 + if unique_bit_shifted_zvalues.size == 1: break @@ -360,15 +381,17 @@ class Geometry(object): if surface is None: continue - absorption = np.interp(standard_wavelengths, surface.absorption[:,0], surface.absorption[:,1]).astype(np.float32) - reflection_diffuse = np.interp(standard_wavelengths, surface.reflection_diffuse[:,0], surface.reflection_diffuse[:,1]).astype(np.float32) - reflection_specular = np.interp(standard_wavelengths, surface.reflection_specular[:,0], surface.reflection_specular[:,1]).astype(np.float32) + detect = np.interp(standard_wavelengths, surface.detect[:,0], surface.detect[:,1]).astype(np.float32) + absorb = np.interp(standard_wavelengths, surface.absorb[:,0], surface.absorb[:,1]).astype(np.float32) + reflect_diffuse = np.interp(standard_wavelengths, surface.reflect_diffuse[:,0], surface.reflect_diffuse[:,1]).astype(np.float32) + reflect_specular = np.interp(standard_wavelengths, surface.reflect_specular[:,0], surface.reflect_specular[:,1]).astype(np.float32) - surface.absorption_gpu = cuda.to_device(absorption) - surface.reflection_diffuse_gpu = cuda.to_device(reflection_diffuse) - surface.reflection_specular_gpu = cuda.to_device(reflection_specular) + surface.detect_gpu = cuda.to_device(detect) + surface.absorb_gpu = cuda.to_device(absorb) + surface.reflect_diffuse_gpu = cuda.to_device(reflect_diffuse) + surface.reflect_specular_gpu = cuda.to_device(reflect_specular) - set_surface(np.int32(i), surface.absorption_gpu, surface.reflection_diffuse_gpu, surface.reflection_specular_gpu, block=(1,1,1), grid=(1,1)) + set_surface(np.int32(i), surface.detect_gpu, surface.absorb_gpu, surface.reflect_diffuse_gpu, surface.reflect_specular_gpu, block=(1,1,1), grid=(1,1)) vertices = np.empty(len(self.mesh.vertices), dtype=gpuarray.vec.float3) vertices['x'] = self.mesh.vertices[:,0] |