diff options
Diffstat (limited to 'geometry.py')
-rw-r--r-- | geometry.py | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/geometry.py b/geometry.py index 3a11daf..e3748e6 100644 --- a/geometry.py +++ b/geometry.py @@ -1,5 +1,7 @@ import numpy as np from itertools import chain +import pycuda.driver as cuda +from pycuda import gpuarray def compress(data, selectors): """ @@ -235,8 +237,8 @@ class Geometry(object): self.lower_bounds = np.empty((len(nodes),3)) self.upper_bounds = np.empty((len(nodes),3)) - self.child_map = np.empty(len(nodes)) - self.child_len = np.empty(len(nodes)) + self.child_map = np.empty(len(nodes), dtype=np.uint32) + self.child_len = np.empty(len(nodes), dtype=np.uint32) self.first_leaf = None for i, node in enumerate(nodes): @@ -256,3 +258,50 @@ class Geometry(object): if self.first_leaf is None: self.first_leaf = i + + def load(self, module): + """ + Load the bounding volume hierarchy onto the GPU module, + bind it to the appropriate textures, and return a list + of the texture references. + """ + mesh = np.empty(self.mesh.shape[0]*3, dtype=gpuarray.vec.float4) + mesh['x'] = self.mesh[:,:,0].flatten() + mesh['y'] = self.mesh[:,:,1].flatten() + mesh['z'] = self.mesh[:,:,2].flatten() + + lower_bounds = np.empty(self.lower_bounds.shape[0], dtype=gpuarray.vec.float4) + lower_bounds['x'] = self.lower_bounds[:,0] + lower_bounds['y'] = self.lower_bounds[:,1] + lower_bounds['z'] = self.lower_bounds[:,2] + + upper_bounds = np.empty(self.upper_bounds.shape[0], dtype=gpuarray.vec.float4) + upper_bounds['x'] = self.upper_bounds[:,0] + upper_bounds['y'] = self.upper_bounds[:,1] + upper_bounds['z'] = self.upper_bounds[:,2] + + self.mesh_gpu = cuda.to_device(mesh) + self.lower_bounds_gpu = cuda.to_device(lower_bounds) + self.upper_bounds_gpu = cuda.to_device(upper_bounds) + self.child_map_gpu = cuda.to_device(self.child_map) + self.child_len_gpu = cuda.to_device(self.child_len) + + mesh_tex = module.get_texref('mesh') + lower_bounds_tex = module.get_texref('lower_bounds') + upper_bounds_tex = module.get_texref('upper_bounds') + child_map_tex = module.get_texref('child_map_arr') + child_len_tex = module.get_texref('child_len_arr') + + mesh_tex.set_address(self.mesh_gpu, mesh.nbytes) + lower_bounds_tex.set_address(self.lower_bounds_gpu, lower_bounds.nbytes) + upper_bounds_tex.set_address(self.upper_bounds_gpu, upper_bounds.nbytes) + child_map_tex.set_address(self.child_map_gpu, self.child_map.nbytes) + child_len_tex.set_address(self.child_len_gpu, self.child_len.nbytes) + + mesh_tex.set_format(cuda.array_format.FLOAT, 4) + lower_bounds_tex.set_format(cuda.array_format.FLOAT, 4) + upper_bounds_tex.set_format(cuda.array_format.FLOAT, 4) + child_map_tex.set_format(cuda.array_format.UNSIGNED_INT32, 1) + child_len_tex.set_format(cuda.array_format.UNSIGNED_INT32, 1) + + return [mesh_tex, lower_bounds_tex, upper_bounds_tex, child_map_tex, child_len_tex] |