def __init__(self): self.objects = [] self.camera = None self.playback = Parameter(default=self.PAUSED, enum=[('Play',self.PLAYING),('Pause',self.PAUSED)]) #self.playback = self.PLAYING self.fps = 24.0 self.time = 0 # in seconds? self.frame = Parameter(default=1, vmin=0, vmax=100, title='Frame', update=self.update_time) self.sframe = Parameter(default=1, vmin=0, vmax=100, title='Start Frame') self.eframe = Parameter(default=100, vmin=0, vmax=100, title='End Frame') self.ui3d_shader = Shader(self.vertex_shader) self.ui3d_batch = pyglet.graphics.Batch() self.grid = Grid(10, 10, self.ui3d_batch ) self.axes = Axes(0.5, self.ui3d_batch ) self.bbmin = None self.bbmax = None
def calculate_bounds(self): self.bbmin = None self.bbmax = None for ob in self.objects: if hasattr(ob, "bbmin") and hasattr(ob, "bbmax"): if self.bbmin is None and self.bbmax is None: self.bbmin = ob.bbmin self.bbmax = ob.bbmax else: self.bbmin.x = min(ob.bbmin.x, self.bbmin.x) self.bbmin.y = min(ob.bbmin.y, self.bbmin.y) self.bbmin.z = min(ob.bbmin.z, self.bbmin.z) self.bbmax.x = max(ob.bbmax.x, self.bbmax.x) self.bbmax.y = max(ob.bbmax.y, self.bbmax.y) self.bbmax.z = max(ob.bbmax.z, self.bbmax.z) self.grid.delete() del self.grid diam = self.bbmax - self.bbmin center = self.bbmin + diam*0.5 self.grid = Grid(10, 10, self.ui3d_batch, center=center[:])
class Scene(object): PAUSED = 0 PLAYING = 1 vertex_shader = ''' uniform mat4 modelview; uniform mat4 projection; void main() { gl_FrontColor = gl_Color; vec4 modelSpacePos = modelview * gl_Vertex; gl_Position = projection * modelSpacePos; } ''' def __init__(self): self.objects = [] self.camera = None self.playback = Parameter(default=self.PAUSED, enum=[('Play',self.PLAYING),('Pause',self.PAUSED)]) #self.playback = self.PLAYING self.fps = 24.0 self.time = 0 # in seconds? self.frame = Parameter(default=1, vmin=0, vmax=100, title='Frame', update=self.update_time) self.sframe = Parameter(default=1, vmin=0, vmax=100, title='Start Frame') self.eframe = Parameter(default=100, vmin=0, vmax=100, title='End Frame') self.ui3d_shader = Shader(self.vertex_shader) self.ui3d_batch = pyglet.graphics.Batch() self.grid = Grid(10, 10, self.ui3d_batch ) self.axes = Axes(0.5, self.ui3d_batch ) self.bbmin = None self.bbmax = None def calculate_bounds(self): self.bbmin = None self.bbmax = None for ob in self.objects: if hasattr(ob, "bbmin") and hasattr(ob, "bbmax"): if self.bbmin is None and self.bbmax is None: self.bbmin = ob.bbmin self.bbmax = ob.bbmax else: self.bbmin.x = min(ob.bbmin.x, self.bbmin.x) self.bbmin.y = min(ob.bbmin.y, self.bbmin.y) self.bbmin.z = min(ob.bbmin.z, self.bbmin.z) self.bbmax.x = max(ob.bbmax.x, self.bbmax.x) self.bbmax.y = max(ob.bbmax.y, self.bbmax.y) self.bbmax.z = max(ob.bbmax.z, self.bbmax.z) self.grid.delete() del self.grid diam = self.bbmax - self.bbmin center = self.bbmin + diam*0.5 self.grid = Grid(10, 10, self.ui3d_batch, center=center[:]) def on_key_press(self, symbol, modifiers): if symbol == pyglet.window.key.H: self.calculate_bounds() self.camera.focus(self) if symbol == pyglet.window.key.RIGHT: self.frame.value += 1 if symbol == pyglet.window.key.LEFT: self.frame.value -= 1 def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers): if not (modifiers & pyglet.window.key.MOD_ALT or \ modifiers & pyglet.window.key.MOD_CTRL or \ modifiers & pyglet.window.key.MOD_SHIFT or \ keys[pyglet.window.key.SPACE]): if buttons & mouse.MIDDLE: self.frame.value += dx*0.05 return pyglet.event.EVENT_HANDLED def on_draw(self): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # 3D Geometry for ob in self.objects: ob.draw(time=self.time, camera=self.camera) # 3D UI elements glEnable(GL_LINE_SMOOTH) glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glHint (GL_LINE_SMOOTH_HINT, GL_NICEST); self.ui3d_shader.bind() self.ui3d_shader.uniform_matrixf('modelview', self.camera.matrixinv) self.ui3d_shader.uniform_matrixf('projection', self.camera.persp_matrix) self.ui3d_batch.draw() self.ui3d_shader.unbind() glDisable(GL_LINE_SMOOTH) def update_time(self): for ob in self.objects: ob.update(self.time, self.frame.value) def update(self, dt): if self.playback.value == self.PLAYING: #self.time += dt # loop playback #frame = self.time * self.fps frame = self.frame.value + 1 if frame > self.eframe.value: frame = self.sframe.value self.frame.value = frame self.update_time()