summaryrefslogtreecommitdiff
path: root/geometry.py
diff options
context:
space:
mode:
Diffstat (limited to 'geometry.py')
-rw-r--r--geometry.py60
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]