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