summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Seibert <stan@mtrr.org>2011-08-09 12:42:01 -0400
committerStan Seibert <stan@mtrr.org>2011-08-09 12:42:01 -0400
commit135ad2ca5b5ade4c52ae98f8fc7545fcc88fb449 (patch)
treee9cd893958a64295f3b439f800bcf0ab47ea5d95
parent57b7eb0f16e47ed673cd5a80ac064634436baecd (diff)
downloadchroma-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-xcamera.py113
1 files changed, 59 insertions, 54 deletions
diff --git a/camera.py b/camera.py
index 2071d25..797fdbe 100755
--- a/camera.py
+++ b/camera.py
@@ -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: