diff options
Diffstat (limited to 'geometry.py')
-rw-r--r-- | geometry.py | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/geometry.py b/geometry.py index 8f2196c..0569dcd 100644 --- a/geometry.py +++ b/geometry.py @@ -3,6 +3,7 @@ import numpy.ma as ma import pycuda.driver as cuda from pycuda import gpuarray from mesh import Mesh +from materials import wavelengths def interleave(arr, bits): """ @@ -81,28 +82,40 @@ class Geometry(object): self.materials = \ list(np.unique(np.concatenate([material1, material2]))) - self.material1_index = np.empty(len(self.mesh), dtype=np.uint32) - self.material2_index = np.empty(len(self.mesh), dtype=np.uint32) + self.material1_index = np.empty(len(self.mesh), dtype=np.int32) + self.material2_index = np.empty(len(self.mesh), dtype=np.int32) for i, material in enumerate(material1[reorder]): - self.material1_index[i] = self.materials.index(material) + if material is not None: + self.material1_index[i] = self.materials.index(material) + else: + self.material1_index[i] = -1 for i, material in enumerate(material2[reorder]): - self.material2_index[i] = self.materials.index(material) + if material is not None: + self.material2_index[i] = self.materials.index(material) + else: + self.material2_index[i] = -1 surface1 = np.concatenate([solid.surface1 for solid in self.solids]) surface2 = np.concatenate([solid.surface2 for solid in self.solids]) self.surfaces = list(np.unique(np.concatenate([surface1, surface2]))) - self.surface1_index = np.empty(len(self.mesh), dtype=np.uint32) - self.surface2_index = np.empty(len(self.mesh), dtype=np.uint32) + self.surface1_index = np.empty(len(self.mesh), dtype=np.int32) + self.surface2_index = np.empty(len(self.mesh), dtype=np.int32) for i, surface in enumerate(surface1[reorder]): - self.surface1_index[i] = self.surfaces.index(surface) + if surface is not None: + self.surface1_index[i] = self.surfaces.index(surface) + else: + self.surface1_index[i] = -1 for i, surface in enumerate(surface2[reorder]): - self.surface2_index[i] = self.surfaces.index(surface) + if surface is not None: + self.surface2_index[i] = self.surfaces.index(surface) + else: + self.surface2_index[i] = -1 self.colors = np.concatenate([solid.color for solid in self.solids]) @@ -187,6 +200,37 @@ class Geometry(object): bind it to the appropriate textures, and return a list of the texture references. """ + + set_material = module.get_function('set_material') + for i, material in enumerate(self.materials): + if material is None: + continue + + refractive_index = np.interp(wavelengths, material.refractive_index[:,0], material.refractive_index[:,1]).astype(np.float32) + absorption_length = np.interp(wavelengths, material.absorption_length[:,0], material.absorption_length[:,1]).astype(np.float32) + scattering_length = np.interp(wavelengths, material.scattering_length[:,0], material.scattering_length[:,1]).astype(np.float32) + + material.refractive_index_gpu = cuda.to_device(refractive_index) + material.absorption_length_gpu = cuda.to_device(absorption_length) + material.scattering_length_gpu = cuda.to_device(scattering_length) + + set_material(i, material.refractive_index_gpu, material.absorption_length_gpu, material.scattering_length_gpu, block=(1,1,1), grid=(1,1)) + + set_surface = module.get_function('set_surface') + for i, surface in enumerate(self.surfaces): + if surface is None: + continue + + absorption = np.interp(wavelengths, surface.absorption[:,0], surface.absorption[:,1]).astype(np.float32) + reflection_diffuse = np.interp(wavelengths, surface.reflection_diffuse[:,0], surface.reflection_diffuse[:,1]).astype(np.float32) + reflection_specular = np.interp(wavelengths, surface.refelection_specular[:,0], surface.reflection_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) + + set_surface(i, surface.absorption_gpu, surface.reflection_diffuse_gpu, surface.reflection_specular_gpu) + vertices = np.empty(len(self.mesh.vertices), dtype=gpuarray.vec.float4) vertices['x'] = self.mesh.vertices[:,0] vertices['y'] = self.mesh.vertices[:,1] |