diff options
author | Stan Seibert <stan@mtrr.org> | 2011-08-09 12:42:01 -0400 |
---|---|---|
committer | Stan Seibert <stan@mtrr.org> | 2011-08-09 12:42:01 -0400 |
commit | 135ad2ca5b5ade4c52ae98f8fc7545fcc88fb449 (patch) | |
tree | e9cd893958a64295f3b439f800bcf0ab47ea5d95 | |
parent | 57b7eb0f16e47ed673cd5a80ac064634436baecd (diff) | |
download | chroma-135ad2ca5b5ade4c52ae98f8fc7545fcc88fb449.tar.gz chroma-135ad2ca5b5ade4c52ae98f8fc7545fcc88fb449.tar.bz2 chroma-135ad2ca5b5ade4c52ae98f8fc7545fcc88fb449.zip |
Update camera to use SpaceNav over X11 protocol. Now events pass through pygame loop.
-rwxr-xr-x | camera.py | 113 |
1 files changed, 59 insertions, 54 deletions
@@ -312,6 +312,59 @@ class Camera(Thread): self.movie_dir = tempfile.mkdtemp() self.movie = True + elif event.type == pygame.SYSWMEVENT and self.spnav: + # Space Navigator controls + spnav_event = self.spnav_module.spnav_x11_event(event.event) + if spnav_event is None: + return + + if spnav_event.type == self.spnav_module.SPNAV_EVENT_MOTION: + if pygame.key.get_mods() & (KMOD_LSHIFT | KMOD_RSHIFT): + accelerate_factor = 2.0 + else: + accelerate_factor = 1.0 + #print 'raw:', spnav_event + v1 = self.axis1 + v2 = self.axis2 + v3 = np.cross(self.axis1,self.axis2) + + v = -v1*spnav_event.motion.x + v2*spnav_event.motion.y \ + + v3*spnav_event.motion.z + v *= self.scale / 5000.0 * accelerate_factor + + #print 'translate:', v + self.translate(v, redraw=False) + + axis = v1*spnav_event.motion.rx + -v2*spnav_event.motion.ry \ + + -v3*spnav_event.motion.rz + + # Zero all but non-max values + #axis[~(np.abs(axis) == np.abs(axis).max())] = 0 + #axis[np.abs(axis) < 15] = 0 + if (axis != 0).any(): + axis = axis.astype(float) + length = np.linalg.norm(axis) + angle = length * 0.0001 * accelerate_factor + axis /= length + #print 'rotate:', angle, axis + self.rotate_around_point(angle, axis, self.point, redraw=False) + + if self.render: + self.clear_image() + + self.update() + pygame.event.clear(pygame.SYSWMEVENT) + + elif spnav_event.type == self.spnav_module.SPNAV_EVENT_BUTTON: + if spnav_event.button.bnum == 0 and spnav_event.button.press: + if not hasattr(self, 'rng_states_gpu'): + self.initialize_render() + + self.render = not self.render + self.clear_image() + self.update() + pygame.event.clear(pygame.SYSWMEVENT) + elif event.type == pygame.QUIT: self.done = True return @@ -320,7 +373,10 @@ class Camera(Thread): self.init_gpu() if self.spnav: - self.spnav_module.spnav_open() + wm_info = pygame.display.get_wm_info() + self.spnav_module.spnav_x11_open(wm_info['display'], + wm_info['window']) + pygame.event.set_allowed(pygame.SYSWMEVENT) self.update() @@ -337,59 +393,8 @@ class Camera(Thread): if self.render and not self.clicked and not pygame.event.peek(KEYDOWN): self.update() - # Space Navigator controls - if self.spnav: - spnav_event = self.spnav_module.spnav_poll_event() - if spnav_event: - if spnav_event.type == self.spnav_module.SPNAV_EVENT_MOTION: - if shift: - accelerate_factor = 2.0 - else: - accelerate_factor = 1.0 - #print 'raw:', spnav_event - v1 = self.axis1 - v2 = self.axis2 - v3 = np.cross(self.axis1,self.axis2) - - v = -v1*spnav_event.motion.x + v2*spnav_event.motion.y \ - + v3*spnav_event.motion.z - v *= self.scale / 10000.0 * accelerate_factor - - #print 'translate:', v - self.translate(v, redraw=False) - - axis = v1*spnav_event.motion.rx + -v2*spnav_event.motion.ry \ - + -v3*spnav_event.motion.rz - - # Zero all but non-max values - #axis[~(np.abs(axis) == np.abs(axis).max())] = 0 - #axis[np.abs(axis) < 15] = 0 - if (axis != 0).any(): - axis = axis.astype(float) - length = np.linalg.norm(axis) - angle = length * 0.0001 * accelerate_factor - axis /= length - #print 'rotate:', angle, axis - self.rotate_around_point(angle, axis, self.point, redraw=False) - - if self.render: - self.clear_image() - - self.update() - self.spnav_module.spnav_remove_events(self.spnav_module.SPNAV_EVENT_MOTION) - - elif spnav_event.type == self.spnav_module.SPNAV_EVENT_BUTTON: - if spnav_event.button.bnum == 0 and spnav_event.button.press: - if not hasattr(self, 'rng_states_gpu'): - self.initialize_render() - - self.render = not self.render - self.clear_image() - self.update() - self.spnav_module.spnav_remove_events(self.spnav_module.SPNAV_EVENT_ANY) - - - for event in pygame.event.get(): + # Grab only last SYSWMEVENT (SpaceNav!) to avoid lagged controls + for event in pygame.event.get(pygame.SYSWMEVENT)[-1:] + pygame.event.get(): self.process_event(event) if self.movie: |