summaryrefslogtreecommitdiff
path: root/camera.py
diff options
context:
space:
mode:
Diffstat (limited to 'camera.py')
-rwxr-xr-xcamera.py47
1 files changed, 35 insertions, 12 deletions
diff --git a/camera.py b/camera.py
index e913624..84c6231 100755
--- a/camera.py
+++ b/camera.py
@@ -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)