diff options
Diffstat (limited to 'camera.py')
-rwxr-xr-x | camera.py | 47 |
1 files changed, 35 insertions, 12 deletions
@@ -14,7 +14,8 @@ from pycuda import gpuarray as ga from chroma.color import map_to_color from chroma.geometry import Mesh, Solid, Geometry -from chroma.transform import rotate +from chroma.transform import rotate, make_rotation_matrix +from chroma.sample import uniform_sphere from chroma.optics import vacuum from chroma.project import from_film from chroma.fileio.root import RootReader @@ -102,7 +103,7 @@ class Camera(multiprocessing.Process): self.spnav = False def init_gpu(self): - self.context = gpu.create_context(self.device_id) + self.context = gpu.create_cuda_context(self.device_id) self.gpu_geometry = gpu.GPUGeometry(self.geometry) self.gpu_funcs = gpu.GPUFuncs(gpu.get_cu_module('mesh.h')) @@ -133,6 +134,8 @@ class Camera(multiprocessing.Process): self.scale = self.mesh_diagonal_norm + self.motion = 'coarse' + self.nblocks = 64 self.point = np.array([0, -self.mesh_diagonal_norm, @@ -148,7 +151,7 @@ class Camera(multiprocessing.Process): self.rays = gpu.GPURays(pos, dir, max_alpha_depth=self.max_alpha_depth) - self.pixels_gpu = ga.empty(self.npixels, dtype=np.int32) + self.pixels_gpu = ga.empty(self.npixels, dtype=np.uint32) self.movie = False self.movie_index = 0 @@ -187,8 +190,10 @@ class Camera(multiprocessing.Process): self.scope_rays = gpu.GPURays(scope_pos, scope_dir) - self.pixels1_gpu = ga.empty(self.width*self.height, dtype=np.int32) - self.pixels2_gpu = ga.empty(self.width*self.height, dtype=np.int32) + self.scope_pixels_gpu = ga.empty(self.scope_rays.pos.size, dtype=np.uint32) + + self.pixels1_gpu = ga.empty(self.width*self.height, dtype=np.uint32) + self.pixels2_gpu = ga.empty(self.width*self.height, dtype=np.uint32) self.distances_gpu = ga.empty(self.scope_rays.pos.size, dtype=np.float32) @@ -346,9 +351,18 @@ class Camera(multiprocessing.Process): def update_viewing_angle(self): if self.display3d: - self.gpu_funcs.distance_to_mesh(np.int32(self.scope_rays.pos.size), self.scope_rays.pos, self.scope_rays.dir, self.gpu_geometry.gpudata, self.distances_gpu, block=(self.nblocks,1,1), grid=(self.scope_rays.pos.size//self.nblocks,1)) + distance_gpu = ga.empty(self.scope_rays.pos.size, dtype=np.float32) + distance_gpu.fill(1e9) + + for i, gpu_geometry in enumerate(self.gpu_geometries): + self.gpu_funcs.distance_to_mesh(np.int32(self.scope_rays.pos.size), self.scope_rays.pos, self.scope_rays.dir, gpu_geometry.gpudata, distance_gpu, block=(self.nblocks,1,1), grid=(self.scope_rays.pos.size//self.nblocks,1)) - baseline = ga.min(self.distances_gpu).get().item() + if i == 0: + distance = distance_gpu.get() + else: + distance = np.minimum(distance, distance_gpu.get()) + + baseline = distance.min() if baseline < 1e9: d1 = self.point1 - self.point @@ -477,10 +491,15 @@ class Camera(multiprocessing.Process): elif event.type == KEYDOWN: if event.key == K_LALT or event.key == K_RALT: - if self.scale == self.mesh_diagonal_norm: - self.scale /= 20.0 - else: + if self.motion == 'coarse': + self.scale = self.mesh_diagonal_norm/20.0 + self.motion = 'fine' + elif self.motion == 'fine': + self.scale = self.mesh_diagonal_norm/400.0 + self.motion = 'superfine' + elif self.motion == 'superfine': self.scale = self.mesh_diagonal_norm + self.motion = 'coarse' elif event.key == K_F6: self.clear_xyz_lookup() @@ -670,11 +689,15 @@ class EventViewer(Camera): self.rr = RootReader(filename) def render_particle_track(self): - marker = Solid(make.cube(0.1), vacuum, vacuum) + x = 0.01 + h = x*np.sqrt(3)/2 + pyramid = make.linear_extrude([-x/2,0,x/2], [-h/2,h/2,-h/2], h, + [0]*3, [0]*3) + marker = Solid(pyramid, vacuum, vacuum) geometry = Geometry() for pos in self.ev.photons_beg.pos[::100]: - geometry.add_solid(marker, displacement=pos) + geometry.add_solid(marker, displacement=pos, rotation=make_rotation_matrix(np.random.uniform(0,2*np.pi), uniform_sphere())) geometry.build(bits=11) gpu_geometry = gpu.GPUGeometry(geometry) |