diff options
Diffstat (limited to 'camera.py')
-rwxr-xr-x | camera.py | 485 |
1 files changed, 209 insertions, 276 deletions
@@ -2,12 +2,12 @@ import numpy as np from itertools import product, count from threading import Thread, Lock -import time -import datetime import os import sys -from color import map_wavelength +from color import map_wavelength, map_to_color +from gpu import GPU, CUDAFuncs +from tools import timeit from transform import rotate import pygame @@ -21,14 +21,6 @@ from subprocess import call import shutil import tempfile -def timeit(func): - def f(*args, **kwargs): - t0 = time.time() - func(*args, **kwargs) - elapsed = time.time() - t0 - print '%s elapsed in %s().' % (datetime.timedelta(seconds=elapsed), func.__name__) - return f - def encode_movie(dir): root, ext = 'movie', 'avi' for i in count(): @@ -43,23 +35,11 @@ def encode_movie(dir): print 'movie saved to %s.' % filename -def get_rays(position, size = (800, 600), film_size = (0.035, 0.024), focal_length=0.05): - """ - Generate ray positions and directions from a pinhole camera facing the negative y direction. - - Args: - - position: tuple, - Position of the camera. - - size: tuple, *optional* - Pixel array shape. - - film_size: tuple, *optional* - Physical size of photographic film. Defaults to 35mm film size. - - focal_length: float, *optional* - Focal length of camera. - """ +def get_rays(position, size = (800, 600), width = 0.035, focal_length=0.05): + height = width*(size[1]/float(size[0])) - x = np.linspace(-film_size[0]/2, film_size[0]/2, size[0]) - z = np.linspace(-film_size[1]/2, film_size[1]/2, size[1]) + x = np.linspace(-width/2, width/2, size[0]) + z = np.linspace(-height/2, height/2, size[1]) grid = np.array(tuple(product(x,[0],z))) @@ -72,24 +52,24 @@ def get_rays(position, size = (800, 600), film_size = (0.035, 0.024), focal_leng return grid, focal_point-grid class Camera(Thread): - def __init__(self, geometry, module, context, lock=None, size=(800,600), - spnav=False): + def __init__(self, geometry, size=(800,600), device_id=None, spnav=False): Thread.__init__(self) self.geometry = geometry - self.module = module - self.context = context + self.device_id = device_id + self.size = size + self.spnav = spnav if spnav: import spnav as spnav_module self.spnav_module = spnav_module - if lock is None: - self.lock = Lock() - else: - self.lock = lock + def init_gpu(self): + self.gpu = GPU(self.device_id) + self.gpu.load_geometry(geometry) + + self.kernels = CUDAFuncs(self.gpu.module, ['ray_trace', 'rotate', 'rotate_around_point', 'translate', 'update_xyz_lookup', 'update_xyz_image', 'process_image', 'init_rng']) - self.size = size self.width, self.height = size pygame.init() @@ -97,18 +77,6 @@ class Camera(Thread): pygame.display.set_caption('') self.clock = pygame.time.Clock() - with self.lock: - self.context.push() - self.ray_trace_kernel = self.module.get_function('ray_trace') - self.rotate_kernel = self.module.get_function('rotate') - self.rotate_around_point_kernel = self.module.get_function('rotate_around_point') - self.translate_kernel = self.module.get_function('translate') - self.update_xyz_lookup_kernel = self.module.get_function('update_xyz_lookup') - self.update_xyz_image_kernel = self.module.get_function('update_xyz_image') - self.process_image_kernel = self.module.get_function('process_image') - self.init_rng_kernel = self.module.get_function('init_rng') - self.context.pop() - lower_bound, upper_bound = self.geometry.mesh.get_bounds() self.scale = np.linalg.norm(upper_bound-lower_bound) @@ -120,12 +88,9 @@ class Camera(Thread): origins, directions = get_rays(self.point, self.size) - with self.lock: - self.context.push() - self.origins_gpu = gpuarray.to_gpu(origins.astype(np.float32).view(gpuarray.vec.float3)) - self.directions_gpu = gpuarray.to_gpu(directions.astype(np.float32).view(gpuarray.vec.float3)) - self.pixels_gpu = gpuarray.zeros(self.width*self.height, dtype=np.int32) - self.context.pop() + self.origins_gpu = gpuarray.to_gpu(origins.astype(np.float32).view(gpuarray.vec.float3)) + self.directions_gpu = gpuarray.to_gpu(directions.astype(np.float32).view(gpuarray.vec.float3)) + self.pixels_gpu = gpuarray.zeros(self.width*self.height, dtype=np.int32) self.movie = False self.movie_index = 0 @@ -134,16 +99,12 @@ class Camera(Thread): @timeit def initialize_render(self): - with self.lock: - self.context.push() - print 'beginning initialize_render()' - self.rng_states_gpu = cuda.mem_alloc(self.width*self.height*sizeof('curandStateXORWOW', '#include <curand_kernel.h>')) - self.init_rng_kernel(np.int32(self.width*self.height), self.rng_states_gpu, np.int32(0), np.int32(0), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) - self.xyz_lookup1_gpu = gpuarray.zeros(len(self.geometry.mesh.triangles), dtype=gpuarray.vec.float3) - self.xyz_lookup2_gpu = gpuarray.zeros(len(self.geometry.mesh.triangles), dtype=gpuarray.vec.float3) - self.image_gpu = gpuarray.zeros(self.width*self.height, dtype=gpuarray.vec.float3) - self.context.synchronize() - self.context.pop() + self.rng_states_gpu = cuda.mem_alloc(self.width*self.height*sizeof('curandStateXORWOW', '#include <curand_kernel.h>')) + self.kernels.init_rng(np.int32(self.width*self.height), self.rng_states_gpu, np.int32(0), np.int32(0), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) + self.xyz_lookup1_gpu = gpuarray.zeros(len(self.geometry.mesh.triangles), dtype=gpuarray.vec.float3) + self.xyz_lookup2_gpu = gpuarray.zeros(len(self.geometry.mesh.triangles), dtype=gpuarray.vec.float3) + self.image_gpu = gpuarray.zeros(self.width*self.height, dtype=gpuarray.vec.float3) + self.context.synchronize() self.source_position = self.point @@ -152,54 +113,39 @@ class Camera(Thread): self.max_steps = 10 def clear_xyz_lookup(self): - with self.lock: - self.context.push() - self.xyz_lookup1_gpu.fill(gpuarray.vec.make_float3(0.0,0.0,0.0)) - self.xyz_lookup2_gpu.fill(gpuarray.vec.make_float3(0.0,0.0,0.0)) - self.context.pop() + self.xyz_lookup1_gpu.fill(gpuarray.vec.make_float3(0.0,0.0,0.0)) + self.xyz_lookup2_gpu.fill(gpuarray.vec.make_float3(0.0,0.0,0.0)) self.nlookup_calls = 0 def update_xyz_lookup(self, source_position): - with self.lock: - self.context.push() - for i in range(self.xyz_lookup1_gpu.size//(self.width*self.height)+1): - self.update_xyz_lookup_kernel(np.int32(self.width*self.height), np.int32(self.xyz_lookup1_gpu.size), np.int32(i*self.width*self.height), gpuarray.vec.make_float3(*source_position), self.rng_states_gpu, np.float32(685.0), gpuarray.vec.make_float3(1.0,0.0,0.0), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, np.int32(self.max_steps), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) + for i in range(self.xyz_lookup1_gpu.size//(self.width*self.height)+1): + self.kernels.update_xyz_lookup(np.int32(self.width*self.height), np.int32(self.xyz_lookup1_gpu.size), np.int32(i*self.width*self.height), gpuarray.vec.make_float3(*source_position), self.rng_states_gpu, np.float32(685.0), gpuarray.vec.make_float3(1.0,0.0,0.0), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, np.int32(self.max_steps), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) - for i in range(self.xyz_lookup1_gpu.size//(self.width*self.height)+1): - self.update_xyz_lookup_kernel(np.int32(self.width*self.height), np.int32(self.xyz_lookup1_gpu.size), np.int32(i*self.width*self.height), gpuarray.vec.make_float3(*source_position), self.rng_states_gpu, np.float32(545.0), gpuarray.vec.make_float3(0.0,1.0,0.0), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, np.int32(self.max_steps), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) + for i in range(self.xyz_lookup1_gpu.size//(self.width*self.height)+1): + self.kernels.update_xyz_lookup(np.int32(self.width*self.height), np.int32(self.xyz_lookup1_gpu.size), np.int32(i*self.width*self.height), gpuarray.vec.make_float3(*source_position), self.rng_states_gpu, np.float32(545.0), gpuarray.vec.make_float3(0.0,1.0,0.0), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, np.int32(self.max_steps), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) - for i in range(self.xyz_lookup1_gpu.size//(self.width*self.height)+1): - self.update_xyz_lookup_kernel(np.int32(self.width*self.height), np.int32(self.xyz_lookup1_gpu.size), np.int32(i*self.width*self.height), gpuarray.vec.make_float3(*source_position), self.rng_states_gpu, np.float32(445.0), gpuarray.vec.make_float3(0.0,0.0,1.0), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, np.int32(self.max_steps), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) - self.context.pop() + for i in range(self.xyz_lookup1_gpu.size//(self.width*self.height)+1): + self.kernels.update_xyz_lookup(np.int32(self.width*self.height), np.int32(self.xyz_lookup1_gpu.size), np.int32(i*self.width*self.height), gpuarray.vec.make_float3(*source_position), self.rng_states_gpu, np.float32(445.0), gpuarray.vec.make_float3(0.0,0.0,1.0), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, np.int32(self.max_steps), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) self.nlookup_calls += 1 def clear_image(self): - with self.lock: - self.context.push() - self.image_gpu.fill(gpuarray.vec.make_float3(0.0,0.0,0.0)) - self.context.pop() + self.image_gpu.fill(gpuarray.vec.make_float3(0.0,0.0,0.0)) self.nimages = 0 def update_image(self): - with self.lock: - self.context.push() - self.update_xyz_image_kernel(np.int32(self.width*self.height), self.rng_states_gpu, self.origins_gpu, self.directions_gpu, np.float32(685.0), gpuarray.vec.make_float3(1.0,0.0,0.0), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, self.image_gpu, np.int32(self.nlookup_calls), np.int32(self.max_steps), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) + self.kernels.update_xyz_image(np.int32(self.width*self.height), self.rng_states_gpu, self.origins_gpu, self.directions_gpu, np.float32(685.0), gpuarray.vec.make_float3(1.0,0.0,0.0), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, self.image_gpu, np.int32(self.nlookup_calls), np.int32(self.max_steps), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) - self.update_xyz_image_kernel(np.int32(self.width*self.height), self.rng_states_gpu, self.origins_gpu, self.directions_gpu, np.float32(545.0), gpuarray.vec.make_float3(0.0,1.0,0.0), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, self.image_gpu, np.int32(self.nlookup_calls), np.int32(self.max_steps), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) + self.kernels.update_xyz_image(np.int32(self.width*self.height), self.rng_states_gpu, self.origins_gpu, self.directions_gpu, np.float32(545.0), gpuarray.vec.make_float3(0.0,1.0,0.0), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, self.image_gpu, np.int32(self.nlookup_calls), np.int32(self.max_steps), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) - self.update_xyz_image_kernel(np.int32(self.width*self.height), self.rng_states_gpu, self.origins_gpu, self.directions_gpu, np.float32(445.0), gpuarray.vec.make_float3(0.0,0.0,1.0), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, self.image_gpu, np.int32(self.nlookup_calls), np.int32(self.max_steps), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) - self.context.pop() + self.kernels.update_xyz_image(np.int32(self.width*self.height), self.rng_states_gpu, self.origins_gpu, self.directions_gpu, np.float32(445.0), gpuarray.vec.make_float3(0.0,0.0,1.0), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, self.image_gpu, np.int32(self.nlookup_calls), np.int32(self.max_steps), block=(self.nblocks,1,1), grid=(self.width*self.height//self.nblocks+1,1)) self.nimages += 1 def process_image(self): - with self.lock: - self.context.push() - self.process_image_kernel(np.int32(self.width*self.height), self.image_gpu, self.pixels_gpu, np.int32(self.nimages), block=(self.nblocks,1,1), grid=((self.width*self.height)//self.nblocks+1,1)) - self.context.pop() + self.kernels.process_image(np.int32(self.width*self.height), self.image_gpu, self.pixels_gpu, np.int32(self.nimages), block=(self.nblocks,1,1), grid=((self.width*self.height)//self.nblocks+1,1)) def screenshot(self, dir='', start=0): root, ext = 'screenshot', 'png' @@ -214,15 +160,12 @@ class Camera(Thread): print 'image saved to %s' % filename def rotate(self, phi, n): - with self.lock: - self.context.push() - self.rotate_kernel(np.int32(self.pixels_gpu.size), self.origins_gpu, np.float32(phi), gpuarray.vec.make_float3(*n), block=(self.nblocks,1,1), grid=(self.pixels_gpu.size//self.nblocks+1,1)) - self.rotate_kernel(np.int32(self.pixels_gpu.size), self.directions_gpu, np.float32(phi), gpuarray.vec.make_float3(*n), block=(self.nblocks,1,1), grid=(self.pixels_gpu.size//self.nblocks+1,1)) + self.kernels.rotate(np.int32(self.pixels_gpu.size), self.origins_gpu, np.float32(phi), gpuarray.vec.make_float3(*n), block=(self.nblocks,1,1), grid=(self.pixels_gpu.size//self.nblocks+1,1)) + self.kernels.rotate(np.int32(self.pixels_gpu.size), self.directions_gpu, np.float32(phi), gpuarray.vec.make_float3(*n), block=(self.nblocks,1,1), grid=(self.pixels_gpu.size//self.nblocks+1,1)) - self.point = rotate(self.point, phi, n) - self.axis1 = rotate(self.axis1, phi, n) - self.axis2 = rotate(self.axis2, phi, n) - self.context.pop() + self.point = rotate(self.point, phi, n) + self.axis1 = rotate(self.axis1, phi, n) + self.axis2 = rotate(self.axis2, phi, n) if self.render: self.clear_image() @@ -230,11 +173,8 @@ class Camera(Thread): self.update() def rotate_around_point(self, phi, n, point, redraw=True): - with self.lock: - self.context.push() - self.rotate_around_point_kernel(np.int32(self.origins_gpu.size), self.origins_gpu, np.float32(phi), gpuarray.vec.make_float3(*n), gpuarray.vec.make_float3(*point), block=(self.nblocks,1,1), grid=(self.origins_gpu.size//self.nblocks+1,1)) - self.rotate_kernel(np.int32(self.directions_gpu.size), self.directions_gpu, np.float32(phi), gpuarray.vec.make_float3(*n), block=(self.nblocks,1,1), grid=(self.directions_gpu.size//self.nblocks+1,1)) - self.context.pop() + self.kernels.rotate_around_point(np.int32(self.origins_gpu.size), self.origins_gpu, np.float32(phi), gpuarray.vec.make_float3(*n), gpuarray.vec.make_float3(*point), block=(self.nblocks,1,1), grid=(self.origins_gpu.size//self.nblocks+1,1)) + self.kernels.rotate(np.int32(self.directions_gpu.size), self.directions_gpu, np.float32(phi), gpuarray.vec.make_float3(*n), block=(self.nblocks,1,1), grid=(self.directions_gpu.size//self.nblocks+1,1)) self.axis1 = rotate(self.axis1, phi, n) self.axis2 = rotate(self.axis2, phi, n) @@ -246,12 +186,9 @@ class Camera(Thread): self.update() def translate(self, v, redraw=True): - with self.lock: - self.context.push() - self.translate_kernel(np.int32(self.pixels_gpu.size), self.origins_gpu, gpuarray.vec.make_float3(*v), block=(self.nblocks,1,1), grid=(self.pixels_gpu.size//self.nblocks,1)) + self.kernels.translate(np.int32(self.pixels_gpu.size), self.origins_gpu, gpuarray.vec.make_float3(*v), block=(self.nblocks,1,1), grid=(self.pixels_gpu.size//self.nblocks,1)) - self.point += v - self.context.pop() + self.point += v if redraw: if self.render: @@ -266,38 +203,138 @@ class Camera(Thread): self.update_image() self.process_image() else: - with self.lock: - self.context.push() - self.ray_trace_kernel(np.int32(self.pixels_gpu.size), self.origins_gpu, self.directions_gpu, self.pixels_gpu, block=(self.nblocks,1,1), grid=(self.pixels_gpu.size//self.nblocks+1,1)) - self.context.pop() + self.kernels.ray_trace(np.int32(self.pixels_gpu.size), self.origins_gpu, self.directions_gpu, self.pixels_gpu, block=(self.nblocks,1,1), grid=(self.pixels_gpu.size//self.nblocks+1,1)) - with self.lock: - self.context.push() - pygame.surfarray.blit_array(self.screen, self.pixels_gpu.get().reshape(self.size)) - pygame.display.flip() - self.context.pop() + pygame.surfarray.blit_array(self.screen, self.pixels_gpu.get().reshape(self.size)) + pygame.display.flip() if self.movie: self.screenshot(self.movie_dir, self.movie_index) self.movie_index += 1 + def process_event(self, event): + if event.type == MOUSEBUTTONDOWN: + if event.button == 4: + v = self.scale*np.cross(self.axis1,self.axis2)/10.0 + self.translate(v) + + elif event.button == 5: + v = -self.scale*np.cross(self.axis1,self.axis2)/10.0 + self.translate(v) + + elif event.button == 1: + mouse_position = pygame.mouse.get_rel() + self.clicked = True + + elif event.type == MOUSEBUTTONUP: + if event.button == 1: + self.clicked = False + + elif event.type == MOUSEMOTION and self.clicked: + movement = np.array(pygame.mouse.get_rel()) + + if (movement == 0).all(): + return + + length = np.linalg.norm(movement) + + mouse_direction = movement[0]*self.axis1 + movement[1]*self.axis2 + mouse_direction /= np.linalg.norm(mouse_direction) + + if pygame.key.get_mods() & (KMOD_LSHIFT | KMOD_RSHIFT): + v = mouse_direction*self.scale*length/float(self.width) + self.translate(v) + else: + phi = np.float32(2*np.pi*length/float(self.width)) + n = rotate(mouse_direction, np.pi/2, -np.cross(self.axis1,self.axis2)) + + if pygame.key.get_mods() & KMOD_LCTRL: + self.rotate_around_point(phi, n, self.point) + else: + self.rotate(phi, n) + + elif event.type == KEYDOWN: + if event.key == K_a: + v = self.scale*self.axis1/10.0 + self.translate(v) + + elif event.key == K_d: + v = -self.scale*self.axis1/10.0 + self.translate(v) + + elif event.key == K_w: + v = self.scale*np.cross(self.axis1,self.axis2)/10.0 + self.translate(v) + + elif event.key == K_s: + v = -self.scale*np.cross(self.axis1,self.axis2)/10.0 + self.translate(v) + + elif event.key == K_SPACE: + v = self.scale*self.axis2/10.0 + self.translate(v) + + elif event.key == K_F6: + self.clear_xyz_lookup() + self.clear_image() + self.source_position = self.point + + elif event.key == K_p: + for i in range(100): + self.update_xyz_lookup(self.point) + self.source_position = self.point + + elif event.key == K_F11: + pygame.display.toggle_fullscreen() + + elif event.key == K_ESCAPE: + self.done = True + return + + elif event.key == K_F12: + self.screenshot() + + elif event.key == K_F5: + if not hasattr(self, 'rng_states_gpu'): + self.initialize_render() + + self.render = not self.render + self.clear_image() + self.update() + + elif event.key == K_m: + if self.movie: + encode_movie(self.movie_dir) + self.movie_dir = None + self.movie = False + else: + self.movie_index = 0 + self.movie_dir = tempfile.mkdtemp() + self.movie = True + + elif event.type == pygame.QUIT: + self.done = True + return + def run(self): + self.init_gpu() + if self.spnav: self.spnav_module.spnav_open() self.update() - done = False - clicked = False - shift = False - ctrl = False + self.done = False + self.clicked = False + #shift = False + #ctrl = False #current_layer = 0 - while not done: + while not self.done: self.clock.tick(20) - if self.render and not clicked and not pygame.event.peek(KEYDOWN): + if self.render and not self.clicked and not pygame.event.peek(KEYDOWN): self.update() # Space Navigator controls @@ -353,156 +390,60 @@ class Camera(Thread): for event in pygame.event.get(): - if event.type == MOUSEBUTTONDOWN: - if event.button == 4: - v = self.scale*np.cross(self.axis1,self.axis2)/10.0 - self.translate(v) - - if event.button == 5: - v = -self.scale*np.cross(self.axis1,self.axis2)/10.0 - self.translate(v) - - if event.button == 1: - clicked = True - mouse_position = pygame.mouse.get_rel() - - if event.type == MOUSEBUTTONUP: - if event.button == 1: - clicked = False + self.process_event(event) - if event.type == MOUSEMOTION and clicked: - movement = np.array(pygame.mouse.get_rel()) - - if (movement == 0).all(): - continue - - length = np.linalg.norm(movement) - - mouse_direction = movement[0]*self.axis1 + movement[1]*self.axis2 - mouse_direction /= np.linalg.norm(mouse_direction) - - if shift: - v = mouse_direction*self.scale*length/float(self.width) - self.translate(v) - else: - phi = np.float32(2*np.pi*length/float(self.width)) - n = rotate(mouse_direction, np.pi/2, -np.cross(self.axis1,self.axis2)) - - if ctrl: - self.rotate_around_point(phi, n, self.point) - else: - self.rotate(phi, n) - - if event.type == KEYDOWN: - if event.key == K_a: - v = self.scale*self.axis1/10.0 - self.translate(v) - - if event.key == K_d: - v = -self.scale*self.axis1/10.0 - self.translate(v) - - if event.key == K_w: - v = self.scale*np.cross(self.axis1,self.axis2)/10.0 - self.translate(v) - - if event.key == K_s: - v = -self.scale*np.cross(self.axis1,self.axis2)/10.0 - self.translate(v) - - if event.key == K_SPACE: - v = self.scale*self.axis2/10.0 - self.translate(v) - - # if event.key == K_LCTRL: - # v = -self.scale*self.axis2/10.0 - # self.translate(v) - - if event.key == K_F6: - self.clear_xyz_lookup() - self.clear_image() - self.source_position = self.point - - if event.key == K_p: - for i in range(100): - self.update_xyz_lookup(self.point) - self.source_position = self.point - - if event.key == K_LSHIFT or event.key == K_RSHIFT: - shift = True - - if event.key == K_LCTRL or event.key == K_RCTRL: - ctrl = True - - if event.key == K_ESCAPE: - done = True - break - - #if event.key == K_PAGEUP and load_bvh: - # try: - # if current_layer+1 >= len(bvhg): - # raise IndexError - - # geometry = bvhg[current_layer+1] - # current_layer += 1 - - # geometry.load(module, color=True) - # update() - # except IndexError: - # print 'no further layers to view' - - #if event.key == K_PAGEDOWN and load_bvh: - # try: - # if current_layer-1 < 0: - # raise IndexError + if self.movie: + encode_movie(self.movie_dir) - # geometry = bvhg[current_layer-1] - # current_layer -= 1 + pygame.display.quit() + if self.spnav: + self.spnav_module.spnav_close() - # geometry.load(module, color=True) - # update() - # except IndexError: - # print 'no further layers to view' + del self.gpu - if event.key == K_F12: - self.screenshot() +class EventViewer(Camera): + def __init__(self, geometry, filename, **kwargs): + Camera.__init__(self, geometry, **kwargs) - if event.key == K_F5: - if not hasattr(self, 'rng_states_gpu'): - self.initialize_render() + import ROOT - self.render = not self.render - self.clear_image() - self.update() + self.f = ROOT.TFile(filename) + self.T = self.f.Get('T') + self.T.GetEntry(0) - if event.key == K_m: - if self.movie: - encode_movie(self.movie_dir) - self.movie_dir = None - self.movie = False - else: - self.movie_index = 0 - self.movie_dir = tempfile.mkdtemp() - self.movie = True + #@timeit + def color_hit_pmts(self): + self.gpu.reset_colors() - if event.type == KEYUP: - if event.key == K_LSHIFT or event.key == K_RSHIFT: - shift = False + solid_ids = np.empty(len(self.T.ev.channel), np.uint32) + t = np.empty(len(self.T.ev.channel), np.float32) + q = np.empty(len(self.T.ev.channel), np.float32) - if event.key == K_LCTRL or event.key == K_RCTRL: - ctrl = False + for i, channel in enumerate(self.T.ev.channel): + solid_ids[i] = channel.channel_id + t[i] = channel.t + q[i] = channel.q - if event.type == pygame.QUIT: - done = True - break + self.gpu.color_solids(solid_ids, map_to_color(t, (t.min(), t.mean()))) + self.update() - if self.movie: - encode_movie(self.movie_dir) + def process_event(self, event): + if event.type == KEYDOWN: + if event.key == K_PAGEUP: + entry = self.T.GetReadEntry() + if entry < self.T.GetEntries() - 1: + self.T.GetEntry(entry+1) + self.color_hit_pmts() + return - pygame.display.quit() - if self.spnav: - self.spnav_module.spnav_close() + if event.key == K_PAGEDOWN: + entry = self.T.GetReadEntry() + if entry > 0: + self.T.GetEntry(entry-1) + self.color_hit_pmts() + return + Camera.process_event(self, event) if __name__ == '__main__': import optparse @@ -512,11 +453,8 @@ if __name__ == '__main__': import detectors import scenes from stl import mesh_from_stl - import src from view import build - from pycuda.compiler import SourceModule - parser = optparse.OptionParser('%prog filename.stl') parser.add_option('-b', '--bits', type='int', dest='bits', help='bits for z-ordering space axes', default=10) @@ -524,6 +462,7 @@ if __name__ == '__main__': # help='load bounding volumes', default=False) parser.add_option('-r', '--resolution', dest='resolution', help='specify resolution', default='800,600') + parser.add_option('-i', dest='io_file', default=None) parser.add_option('--spnav', action='store_true', dest='spnav', help='activate Space Navigator support', default=False) options, args = parser.parse_args() @@ -538,6 +477,7 @@ if __name__ == '__main__': if ext.lower() in ('.stl', '.bz2'): obj = mesh_from_stl(args[0]) + else: members = dict(inspect.getmembers(detectors) + inspect.getmembers(solids) + inspect.getmembers(scenes)) @@ -552,16 +492,9 @@ if __name__ == '__main__': else: raise Exception("can't find object %s" % args[0]) - from pycuda.tools import make_default_context - from gpu import * - geometry = build(obj, options.bits) - - lock = Lock() - - gpu = GPU() - gpu.load_geometry(geometry) - gpu.context.pop() - camera = Camera(geometry, gpu.module, gpu.context, lock, size=size, - spnav=options.spnav) + if options.io_file is not None: + camera = EventViewer(geometry, options.io_file, size=size, spnav=options.spnav) + else: + camera = Camera(geometry, size, spnav=options.spnav) camera.start() |