diff options
Diffstat (limited to 'geometry.py')
-rw-r--r-- | geometry.py | 48 |
1 files changed, 20 insertions, 28 deletions
diff --git a/geometry.py b/geometry.py index 8af8d49..8dee8c9 100644 --- a/geometry.py +++ b/geometry.py @@ -106,25 +106,17 @@ class Geometry(object): 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]) + surface = np.concatenate([solid.surface for solid in self.solids]) - self.surfaces = list(np.unique(np.concatenate([surface1, surface2]))) + self.surfaces = list(np.unique(surface)) - self.surface1_index = np.empty(len(self.mesh), dtype=np.int32) - self.surface2_index = np.empty(len(self.mesh), dtype=np.int32) + self.surface_index = np.empty(len(self.mesh), dtype=np.int32) - for i, surface in enumerate(surface1[reorder]): + for i, surface in enumerate(surface[reorder]): if surface is not None: - self.surface1_index[i] = self.surfaces.index(surface) + self.surface_index[i] = self.surfaces.index(surface) else: - self.surface1_index[i] = -1 - - for i, surface in enumerate(surface2[reorder]): - if surface is not None: - self.surface2_index[i] = self.surfaces.index(surface) - else: - self.surface2_index[i] = -1 + self.surface_index[i] = -1 self.colors = np.concatenate([solid.color for solid in self.solids]) @@ -210,6 +202,10 @@ class Geometry(object): of the texture references. """ + set_wavelength_range = module.get_function('set_wavelength_range') + + set_wavelength_range(wavelengths[0], wavelengths[-1], wavelengths[1]-wavelengths[0], block=(1,1,1), grid=(1,1)) + set_material = module.get_function('set_material') for i, material in enumerate(self.materials): if material is None: @@ -223,7 +219,7 @@ class Geometry(object): 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_material(np.int32(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): @@ -232,33 +228,29 @@ class Geometry(object): 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) + reflection_specular = np.interp(wavelengths, surface.reflection_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) + set_surface(np.int32(i), surface.absorption_gpu, surface.reflection_diffuse_gpu, surface.reflection_specular_gpu, block=(1,1,1), grid=(1,1)) - material1_index_tex = module.get_texref('material1_index') - material2_index_tex = module.get_texref('material2_index') - surface1_index_tex = module.get_texref('surface1_index') - surface2_index_tex = module.get_texref('surface2_index') + material1_index_tex = module.get_texref('material1_lookup') + material2_index_tex = module.get_texref('material2_lookup') + surface_index_tex = module.get_texref('surface_lookup') material1_index_gpu = cuda.to_device(self.material1_index) material2_index_gpu = cuda.to_device(self.material2_index) - surface1_index_gpu = cuda.to_device(self.surface1_index) - surface2_index_gpu = cuda.to_device(self.surface2_index) + surface_index_gpu = cuda.to_device(self.surface_index) material1_index_tex.set_address(material1_index_gpu, self.material1_index.nbytes) material2_index_tex.set_address(material2_index_gpu, self.material2_index.nbytes) - surface1_index_tex.set_address(surface1_index_gpu, self.surface1_index.nbytes) - surface2_index_tex.set_address(surface2_index_gpu, self.surface2_index.nbytes) + surface_index_tex.set_address(surface_index_gpu, self.surface_index.nbytes) material1_index_tex.set_format(cuda.array_format.SIGNED_INT32, 1) material2_index_tex.set_format(cuda.array_format.SIGNED_INT32, 1) - surface1_index_tex.set_format(cuda.array_format.SIGNED_INT32, 1) - surface2_index_tex.set_format(cuda.array_format.SIGNED_INT32, 1) + surface_index_tex.set_format(cuda.array_format.SIGNED_INT32, 1) vertices = np.empty(len(self.mesh.vertices), dtype=gpuarray.vec.float4) vertices['x'] = self.mesh.vertices[:,0] @@ -274,7 +266,7 @@ class Geometry(object): if color: triangles['w'] = self.colors else: - triangles['w'] = (self.material1_index << 24) | (self.material2_index << 16) | (self.surface1_index << 8) | self.surface2_index + triangles['w'] = (self.material1_index << 24) | (self.material2_index << 16) | (self.surface_index << 8) lower_bounds = np.empty(self.lower_bounds.shape[0], dtype=gpuarray.vec.float4) lower_bounds['x'] = self.lower_bounds[:,0] |