summaryrefslogtreecommitdiff
path: root/geometry.py
diff options
context:
space:
mode:
Diffstat (limited to 'geometry.py')
-rw-r--r--geometry.py27
1 files changed, 18 insertions, 9 deletions
diff --git a/geometry.py b/geometry.py
index 938001e..8af8d49 100644
--- a/geometry.py
+++ b/geometry.py
@@ -58,14 +58,23 @@ class Geometry(object):
self.solids.append(solid)
def build(self, bits=8):
- vertices = []
- triangles = []
+ offsets = [ (0,0) ]
for solid in self.solids:
- triangles.extend(solid.mesh.triangles + len(vertices))
- vertices.extend(np.inner(solid.mesh.vertices, solid.rotation) + \
- solid.displacement)
+ offsets.append( (offsets[-1][0] + len(solid.mesh.vertices),
+ offsets[-1][1] + len(solid.mesh.triangles)) )
+ vertices = np.zeros(shape=(offsets[-1][0], 3), dtype=np.float32)
+ triangles = np.zeros(shape=(offsets[-1][1],3), dtype=np.int32)
+
+ for solid, (vertex_offset, triangle_offset) in zip(self.solids, offsets[:-1]):
+ triangles[triangle_offset:triangle_offset+len(solid.mesh.triangles),:] = \
+ solid.mesh.triangles + vertex_offset
+ vertices[vertex_offset:vertex_offset + len(solid.mesh.vertices),:] = \
+ np.inner(solid.mesh.vertices, solid.rotation) + solid.displacement
+
self.mesh = Mesh(vertices, triangles)
+ del vertices
+ del triangles
zvalues_mesh = morton_order(self.mesh[:], bits)
reorder = np.argsort(zvalues_mesh)
@@ -284,25 +293,25 @@ class Geometry(object):
self.node_map_gpu = cuda.to_device(self.node_map)
self.node_length_gpu = cuda.to_device(self.node_length)
+ set_pointer = module.get_function('set_pointer')
+ set_pointer(self.triangles_gpu, block=(1,1,1), grid=(1,1))
+
vertices_tex = module.get_texref('vertices')
- triangles_tex = module.get_texref('triangles')
lower_bounds_tex = module.get_texref('lower_bounds')
upper_bounds_tex = module.get_texref('upper_bounds')
node_map_tex = module.get_texref('node_map')
node_length_tex = module.get_texref('node_length')
vertices_tex.set_address(self.vertices_gpu, vertices.nbytes)
- triangles_tex.set_address(self.triangles_gpu, triangles.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)
node_map_tex.set_address(self.node_map_gpu, self.node_map.nbytes)
node_length_tex.set_address(self.node_length_gpu, self.node_length.nbytes)
vertices_tex.set_format(cuda.array_format.FLOAT, 4)
- triangles_tex.set_format(cuda.array_format.UNSIGNED_INT32, 4)
lower_bounds_tex.set_format(cuda.array_format.FLOAT, 4)
upper_bounds_tex.set_format(cuda.array_format.FLOAT, 4)
node_map_tex.set_format(cuda.array_format.UNSIGNED_INT32, 1)
node_length_tex.set_format(cuda.array_format.UNSIGNED_INT32, 1)
- return [vertices_tex, triangles_tex, lower_bounds_tex, upper_bounds_tex, node_map_tex, node_length_tex]
+ return [vertices_tex, lower_bounds_tex, upper_bounds_tex, node_map_tex, node_length_tex]