summaryrefslogtreecommitdiff
path: root/geometry.py
diff options
context:
space:
mode:
authorAnthony LaTorre <telatorre@gmail.com>2011-06-12 21:31:22 -0400
committerAnthony LaTorre <telatorre@gmail.com>2011-06-12 21:31:22 -0400
commit870236b3c4950762a73247c68023a8dee6e14a7b (patch)
treea9b634e0ef43f17c00e725972240d48673a708b6 /geometry.py
parente06a8b551c730e3d1111fc571c5d48edb85f70ce (diff)
downloadchroma-870236b3c4950762a73247c68023a8dee6e14a7b.tar.gz
chroma-870236b3c4950762a73247c68023a8dee6e14a7b.tar.bz2
chroma-870236b3c4950762a73247c68023a8dee6e14a7b.zip
added some fun models; added some untested code to implement absorption, scattering, reflection, and refraction
Diffstat (limited to 'geometry.py')
-rw-r--r--geometry.py48
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]