class AsVis(Frame.Frame): ''' The top level object for visualising astrophysics ''' def __init__(self, window=None): ''' Constructor ''' Frame.Frame.__init__(self) self._renderer = None self._snapshot = Snapshot() self._camera = Camera() self._setup = False self._lmb = False # Make the game window title = "Astrophysics Visualisation" windowed = True screenSize = (1800,1024) if window == None: window = pyglet.window.Window(screenSize[0], screenSize[1],caption = title) self._window = window def Window(self): ''' Return the pyglet window object used by the visualiser ''' return self._window def Run(self): ''' Start the draw loop ''' pyglet.app.run() def Setup(self): ''' Set up the main level - can usually be guaranteed to run before Run() ''' glEnable(GL_DEPTH_TEST) if not self._setup: # This starts threads and stuff, so don't grunk up anything by self._renderer = Renderer(self.Window(), self._camera) self._renderer.Setup() self._setup = True def LoadSnapshot(self, filename): ''' Load a snapshot ''' self._snapshot.Open(filename) self._renderer.LogText(self._snapshot.InfoText()) self._renderer.Redraw() def Draw(self, dummy=None): if self._camera.ZoomActive(): self._renderer.Redraw() self._renderer.Draw([self._snapshot]) #if self._camera.ZoomActive(): def Redraw(self): self._renderer.Redraw() def OnMouseMove(self, state): ''' Parse mouse movement ''' if self._lmb: self._renderer.Camera().OnMouseMove(state) self.Redraw() def OnKeyboard(self, state): ''' Register the pressing or releasing of a keyboard key This can be overridden by the concrete class if desired, or left inactive state - a dictionary of the mouse state: {"button": button, "mod": modifier keys used, "pressed":True or False} ''' # 113 = Q, 101 = e, YES I KNOW I'M IN A HURRY OK # Escape pressed = state["pressed"] button = state["button"] #if button == pyglet.window.key.ESCAPE: # Upon returning the window will now quit too # Q if button == pyglet.window.key.Q: self._renderer.Camera().ZoomIn(pressed) # E if button == pyglet.window.key.E: self._renderer.Camera().ZoomOut(pressed) # Switch render modes # TODO: Unbreak this #if button == pyglet.window.key.P and not pressed: # self._renderer.ToggleBillboarding() def OnMouseButton(self, state): if state["button"] % 2 == pyglet.window.mouse.LEFT: self._lmb = state["pressed"] # True if pressed, False if not