class FirstTry(visual): def setup(self): self.tex1 = MovieTexture('videos/saturn5_apollo_launch.mp4') assert self.tex1.read('videos/saturn5_apollo_launch.mp4') self.tex2 = MovieTexture('videos/boards_eye_view.mp4') assert self.tex2.read('videos/boards_eye_view.mp4') self.cm1 = CardMaker('saturn') self.cm1.setFrameFullscreenQuad() self.cm1.setUvRange(self.tex1) self.card1 = NodePath(self.cm1.generate()) self.card1.reparentTo(self.path) self.card1.setPos(0,0,10) self.card1.setP(50) self.cm2 = CardMaker('board') self.cm2.setFrameFullscreenQuad() self.cm2.setUvRange(self.tex2) self.card2 = NodePath(self.cm2.generate()) self.card2.reparentTo(self.path) self.card2.setPos(0,0,-10) self.card2.setP(-50) self.card1.setTexture(self.tex1) self.card1.setTexScale(TextureStage.getDefault(), self.tex1.getTexScale()) self.card2.setTexture(self.tex2) self.card2.setTexScale(TextureStage.getDefault(), self.tex2.getTexScale()) self.card1.setScale(10) self.card2.setScale(10) def getBeat(self): pass
class DistributedCinemaInterior(DistributedToonInterior.DistributedToonInterior ): notify = directNotify.newCategory("DistributedCinemaInterior") def __init__(self, cr): DistributedToonInterior.DistributedToonInterior.__init__(self, cr) self.fsm = ClassicFSM.ClassicFSM('DCinemaInterior', [ State.State('off', self.enterOff, self.exitOff), State.State('show', self.enterShow, self.exitShow), State.State('intermission', self.enterIntermission, self.exitIntermission) ], 'off', 'off') self.fsm.enterInitialState() self.state = None self.cinemaIndex = None self.movieTex = None self.movieCard = None self.movieSound = None self.movieTrack = None self.intermissionText = None def makeInterior(self): # Always use the same room for cinemas. DistributedToonInterior.DistributedToonInterior.makeInterior( self, roomIndex=0) def announceGenerate(self): DistributedToonInterior.DistributedToonInterior.announceGenerate(self) self.sendUpdate('requestStateAndTimestamp') def disable(self): self.fsm.requestFinalState() self.fsm = None self.state = None self.cinemaIndex = None self.movieTex = None self.movieCard = None self.movieSound = None self.movieTrack = None self.intermissionText = None self.cr.playGame.hood.loader.interiorMusic.stop() DistributedToonInterior.DistributedToonInterior.disable(self) def darkenInterior(self): darkenIval = self.interior.colorScaleInterval( 3.0, colorScale=(0.3, 0.3, 0.3, 1.0), startColorScale=(1.0, 1.0, 1.0, 1.0), blendType='easeInOut') darkenIval.start() def lightenInterior(self): lightenIval = self.interior.colorScaleInterval( 3.0, colorScale=(1, 1, 1, 1.0), startColorScale=(0.3, 0.3, 0.3, 1.0), blendType='easeInOut') lightenIval.start() def enterShow(self, ts=0): self.darkenInterior() self.cr.playGame.hood.loader.interiorMusic.stop() videoFile = CinemaGlobals.Cinemas[self.cinemaIndex][0] audioFile = CinemaGlobals.Cinemas[self.cinemaIndex][1] self.movieTex = MovieTexture(self.uniqueName("movieTex")) self.movieTex.read(videoFile) card = CardMaker(self.uniqueName('movieCard')) card.setFrame(-1.5, 1.5, -1, 1) self.movieCard = NodePath(card.generate()) self.movieCard.reparentTo(render) self.movieCard.setPos( self.interior.find('**/sign_origin;+s').getPos(render)) #self.movieCard.setX(self.movieCard, -0.05) self.movieCard.setHpr( self.interior.find('**/sign_origin;+s').getHpr(render)) self.movieCard.setDepthWrite(1, 1) self.movieCard.setTwoSided(True) self.movieCard.setTexture(self.movieTex) self.movieCard.setTexScale(TextureStage.getDefault(), self.movieTex.getTexScale()) self.movieCard.setScale(2.5) self.movieSound = base.loadSfx(audioFile) self.movieTex.synchronizeTo(self.movieSound) self.movieTrack = SoundInterval(self.movieSound, name=self.uniqueName('movieTrack')) self.movieTrack.setDoneEvent(self.movieTrack.getName()) self.acceptOnce(self.movieTrack.getDoneEvent(), self.fsm.request, ['off']) self.movieTrack.start(ts) def exitShow(self): self.ignore(self.movieTrack.getDoneEvent()) self.movieTrack.finish() self.movieTrack = None self.movieSound = None self.movieCard.removeNode() self.movieCard = None self.movieTex = None self.lightenInterior() self.cr.playGame.hood.loader.interiorMusic.play() def enterIntermission(self, ts=0): self.intermissionText = DirectLabel( relief=None, text_decal=True, text="", scale=0.7, parent=self.interior.find('**/sign_origin;+s'), text_font=CIGlobals.getMickeyFont(), text_fg=(1, 0.9, 0, 1)) self.movieTrack = Sequence(name=self.uniqueName('intermissionTrack')) for second in range(CinemaGlobals.IntermissionLength + 1): timeRemaining = CinemaGlobals.IntermissionLength - second self.movieTrack.append( Func(self.setIntermissionText, "Next show in:\n%d" % timeRemaining)) self.movieTrack.append(Wait(1.0)) self.movieTrack.setDoneEvent(self.movieTrack.getName()) self.acceptOnce(self.movieTrack.getDoneEvent(), self.fsm.request, ['off']) self.movieTrack.start(ts) def setIntermissionText(self, text): self.intermissionText['text'] = text def exitIntermission(self): self.ignore(self.movieTrack.getDoneEvent()) self.movieTrack.finish() self.movieTrack = None self.intermissionText.destroy() self.intermissionText = None def enterOff(self): pass def exitOff(self): pass def setCinemaIndex(self, index): self.cinemaIndex = index def getCinemaIndex(self): return self.cinemaIndex def setState(self, state, timestamp): ts = globalClockDelta.localElapsedTime(timestamp) self.state = state self.fsm.request(state, [ts]) def getState(self): return self.state
class Tutorial: def __init__(self, pat): self.t = Transitions(loader) self.pickAToon = pat def askTutorial(self): self.firstTimeMsg = YesNoDialog(text=CIGlobals.FirstTimeMsg, text_scale=0.07, text_wordwrap=18, buttonGeomList=[ CIGlobals.getOkayBtnGeom(), CIGlobals.getCancelBtnGeom() ], button_relief=None, button_text_pos=(0, -0.1), command=self.handleTutorialDecision, image_color=CIGlobals.DialogColor, fadeScreen=1) def handleTutorialDecision(self, value): if value: self.firstTimeMsg.destroy() self.startTutorial() base.hoodBGM.stop() else: self.firstTimeMsg.destroy() self.enablePatButtons() def enablePatButtons(self): for btn in self.pickAToon.btnList: btn['state'] = DGG.NORMAL self.pickAToon.quit_btn['state'] = DGG.NORMAL def startTutorial(self): self.t.fadeOut(1) Sequence(Wait(1.2), Func(self.playVideo)).start() def playVideo(self): self.t.fadeIn(0) self.pickAToon.removeGui() self.movieTex = MovieTexture("tutorial") assert self.movieTex.read( "tutorial.avi"), "Failed to load tutorial video" cm = CardMaker("tutorialCard") cm.setFrameFullscreenQuad() self.card = NodePath(cm.generate()) self.card.reparentTo(render2d) self.card.setTexture(self.movieTex) self.card.setTexScale(TextureStage.getDefault(), self.movieTex.getTexScale()) self.movieSound = loader.loadSfx("tutorial.avi") self.movieTex.synchronizeTo(self.movieSound) self.movieSound.play() taskMgr.add(self.checkMovieStatus, "checkMovieStatus") def checkMovieStatus(self, task): if self.movieSound.status() == AudioSound.READY: self.stopVideo() return task.done return task.cont def stopVideo(self): self.movieSound.stop() self.card.removeNode() self.t.fadeOut(0) self.pickAToon.createGui(1) Sequence(Wait(0.2), Func(self.t.fadeIn, 1)).start()
class CameraApp(GuiHandler): __ImageDir = "data/images" def __init__(self, device): GuiHandler.__init__(self) self.func3 = "Si" self.func2 = "" self.func1 = "No" self.title = "Guardar?" self.parent = device self.video_mode = False option = WebcamVideo.get_option(0) self.texture = MovieTexture(option) self.texture.setKeepRamImage(True) #self.texture = OpenCVTexture() #self.texture.fromCamera() scale = self.texture.getTexScale() print scale #self.texture = OpenCVTexture() self.card = CardMaker('webcam') self.card.setFrame(-scale[0], scale[0], -scale[1], scale[1]) self.card.setUvRange(Point2(scale[0], 0), Point2(0, scale[1])) self.card = render.attachNewNode(self.card.generate()) screen = self.parent.get_screen() self.card.reparentTo(screen.getParent()) self.card.setTransform(screen.getTransform()) self.card.setSx(0.49) self.card.setSz(0.394) self.card.setHpr(0, 270, 0) self.card.setPos(0.004, 0.335, 0.1) self.card.hide() def activate(self, events): self.toggle_view(True) events.add_action("boton_izq1", self.quit) events.add_action("centro", self.shoot) events.add_action("boton_der", self.shoot) events.add_action("boton_izq", self.cancel) def shoot(self): if self.video_mode: max = self.texture.getXSize() * self.texture.getYSize() data = array.array('B') data.fromstring(self.texture.getRamImageAs("BGR1").getData()) img = cairo.ImageSurface.create_for_data(data, cairo.FORMAT_ARGB32, self.texture.getXSize(), self.texture.getYSize(), self.texture.getXSize() * 4) self.cam_shot = cairo.ImageSurface(cairo.FORMAT_ARGB32, self.texture.getVideoWidth(), self.texture.getVideoHeight()) ctx = cairo.Context(self.cam_shot) ctx.set_source_surface(img, 0 , 0) ctx.paint() self.paint_background() self.cr.set_source_surface(self.draw_viewer(self.cam_shot), 30, self.top_margin + 5) self.cr.paint() self.paint_foreground() self.surface.write_to_png(self.get_output()) self.parent.repaint() self.toggle_view(False) else: print "Saving..." pic_path = CameraApp.__ImageDir + "/p" + Util.generate_id() + ".png" print pic_path self.cam_shot.write_to_png(pic_path) self.toggle_view(True) def paint_scene(self): drawer_width = self.width - 60 drawer_height = 2 * self.height / 3 surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, self.width, self.height) context = cairo.Context(surface) scale_x = float(self.width) / float(self.cam_shot.get_width()) scale_y = float(self.height) / float(self.cam_shot.get_height()) context.scale(scale_x, scale_y) context.set_source_surface(self.cam_shot, 0, 0) context.paint() return surface def cancel(self): self.cam_shot = None self.toggle_view(True) def draw_viewer(self, image_surface): drawer_width = self.width - 60 drawer_height = 2 * self.height / 3 surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, drawer_width, drawer_height) context = cairo.Context(surface) context.rectangle(0, 0, drawer_width, drawer_height) context.set_source_rgba(.05, .05, .05, .8) context.fill() context.rectangle(1, 1, drawer_width - 2, drawer_height - 2) context.clip() context.new_path() context.transform(get_transformation_matrix(drawer_width, drawer_height, image_surface.get_width(), image_surface.get_height())) context.set_source_surface(image_surface, 0, 0) context.paint() return surface def paint_background(self): # Fondo gradient = cairo.LinearGradient(0, 0, 0, self.height) gradient.add_color_stop_rgb(0, 0, 0, 0) gradient.add_color_stop_rgb(1, .4, .4, .4) self.cr.set_source(gradient) self.cr.move_to(0, 0) self.cr.line_to(self.width, 0) self.cr.line_to(self.width, self.height) self.cr.line_to(0, self.height) self.cr.close_path() self.cr.fill() def quit(self): self.toggle_view(False) self.parent.launch("menu") def toggle_view(self, video): self.video_mode = video if video: #self.texture.fromCamera() self.card.setTexture(self.texture) print (self.texture.getVideoWidth(), self.texture.getVideoHeight()) self.card.show() self.parent.get_screen().hide() else: #self.texture = OpenCVTexture() self.card.setTexture(self.texture) self.card.hide() self.parent.get_screen().show()
class CameraApp(GuiHandler): __ImageDir = "data/images" def __init__(self, device): GuiHandler.__init__(self) self.func3 = "Si" self.func2 = "" self.func1 = "No" self.title = "Guardar?" self.parent = device self.video_mode = False option = WebcamVideo.get_option(0) self.texture = MovieTexture(option) self.texture.setKeepRamImage(True) #self.texture = OpenCVTexture() #self.texture.fromCamera() scale = self.texture.getTexScale() print scale #self.texture = OpenCVTexture() self.card = CardMaker('webcam') self.card.setFrame(-scale[0], scale[0], -scale[1], scale[1]) self.card.setUvRange(Point2(scale[0], 0), Point2(0, scale[1])) self.card = render.attachNewNode(self.card.generate()) screen = self.parent.get_screen() self.card.reparentTo(screen.getParent()) self.card.setTransform(screen.getTransform()) self.card.setSx(0.49) self.card.setSz(0.394) self.card.setHpr(0, 270, 0) self.card.setPos(0.004, 0.335, 0.1) self.card.hide() def activate(self, events): self.toggle_view(True) events.add_action("boton_izq1", self.quit) events.add_action("centro", self.shoot) events.add_action("boton_der", self.shoot) events.add_action("boton_izq", self.cancel) def shoot(self): if self.video_mode: max = self.texture.getXSize() * self.texture.getYSize() data = array.array('B') data.fromstring(self.texture.getRamImageAs("BGR1").getData()) img = cairo.ImageSurface.create_for_data( data, cairo.FORMAT_ARGB32, self.texture.getXSize(), self.texture.getYSize(), self.texture.getXSize() * 4) self.cam_shot = cairo.ImageSurface(cairo.FORMAT_ARGB32, self.texture.getVideoWidth(), self.texture.getVideoHeight()) ctx = cairo.Context(self.cam_shot) ctx.set_source_surface(img, 0, 0) ctx.paint() self.paint_background() self.cr.set_source_surface(self.draw_viewer(self.cam_shot), 30, self.top_margin + 5) self.cr.paint() self.paint_foreground() self.surface.write_to_png(self.get_output()) self.parent.repaint() self.toggle_view(False) else: print "Saving..." pic_path = CameraApp.__ImageDir + "/p" + Util.generate_id( ) + ".png" print pic_path self.cam_shot.write_to_png(pic_path) self.toggle_view(True) def paint_scene(self): drawer_width = self.width - 60 drawer_height = 2 * self.height / 3 surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, self.width, self.height) context = cairo.Context(surface) scale_x = float(self.width) / float(self.cam_shot.get_width()) scale_y = float(self.height) / float(self.cam_shot.get_height()) context.scale(scale_x, scale_y) context.set_source_surface(self.cam_shot, 0, 0) context.paint() return surface def cancel(self): self.cam_shot = None self.toggle_view(True) def draw_viewer(self, image_surface): drawer_width = self.width - 60 drawer_height = 2 * self.height / 3 surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, drawer_width, drawer_height) context = cairo.Context(surface) context.rectangle(0, 0, drawer_width, drawer_height) context.set_source_rgba(.05, .05, .05, .8) context.fill() context.rectangle(1, 1, drawer_width - 2, drawer_height - 2) context.clip() context.new_path() context.transform( get_transformation_matrix(drawer_width, drawer_height, image_surface.get_width(), image_surface.get_height())) context.set_source_surface(image_surface, 0, 0) context.paint() return surface def paint_background(self): # Fondo gradient = cairo.LinearGradient(0, 0, 0, self.height) gradient.add_color_stop_rgb(0, 0, 0, 0) gradient.add_color_stop_rgb(1, .4, .4, .4) self.cr.set_source(gradient) self.cr.move_to(0, 0) self.cr.line_to(self.width, 0) self.cr.line_to(self.width, self.height) self.cr.line_to(0, self.height) self.cr.close_path() self.cr.fill() def quit(self): self.toggle_view(False) self.parent.launch("menu") def toggle_view(self, video): self.video_mode = video if video: #self.texture.fromCamera() self.card.setTexture(self.texture) print(self.texture.getVideoWidth(), self.texture.getVideoHeight()) self.card.show() self.parent.get_screen().hide() else: #self.texture = OpenCVTexture() self.card.setTexture(self.texture) self.card.hide() self.parent.get_screen().show()
class DistributedCinemaInterior(DistributedToonInterior.DistributedToonInterior): notify = directNotify.newCategory('DistributedCinemaInterior') def __init__(self, cr): DistributedToonInterior.DistributedToonInterior.__init__(self, cr) self.fsm = ClassicFSM.ClassicFSM('DCinemaInterior', [State.State('off', self.enterOff, self.exitOff), State.State('show', self.enterShow, self.exitShow), State.State('intermission', self.enterIntermission, self.exitIntermission)], 'off', 'off') self.fsm.enterInitialState() self.state = None self.cinemaIndex = None self.movieTex = None self.movieCard = None self.movieSound = None self.movieTrack = None self.intermissionText = None return def makeInterior(self): DistributedToonInterior.DistributedToonInterior.makeInterior(self, roomIndex=0) def announceGenerate(self): DistributedToonInterior.DistributedToonInterior.announceGenerate(self) self.sendUpdate('requestStateAndTimestamp') def disable(self): self.fsm.requestFinalState() self.fsm = None self.state = None self.cinemaIndex = None self.movieTex = None self.movieCard = None self.movieSound = None self.movieTrack = None self.intermissionText = None self.cr.playGame.hood.loader.interiorMusic.stop() DistributedToonInterior.DistributedToonInterior.disable(self) return def darkenInterior(self): darkenIval = self.interior.colorScaleInterval(3.0, colorScale=(0.3, 0.3, 0.3, 1.0), startColorScale=(1.0, 1.0, 1.0, 1.0), blendType='easeInOut') darkenIval.start() def lightenInterior(self): lightenIval = self.interior.colorScaleInterval(3.0, colorScale=(1, 1, 1, 1.0), startColorScale=(0.3, 0.3, 0.3, 1.0), blendType='easeInOut') lightenIval.start() def enterShow(self, ts = 0): self.darkenInterior() self.cr.playGame.hood.loader.interiorMusic.stop() videoFile = CinemaGlobals.Cinemas[self.cinemaIndex][0] audioFile = CinemaGlobals.Cinemas[self.cinemaIndex][1] self.movieTex = MovieTexture(self.uniqueName('movieTex')) self.movieTex.read(videoFile) card = CardMaker(self.uniqueName('movieCard')) card.setFrame(-1.5, 1.5, -1, 1) self.movieCard = NodePath(card.generate()) self.movieCard.reparentTo(render) self.movieCard.setPos(self.interior.find('**/sign_origin;+s').getPos(render)) self.movieCard.setHpr(self.interior.find('**/sign_origin;+s').getHpr(render)) self.movieCard.setDepthWrite(1, 1) self.movieCard.setTwoSided(True) self.movieCard.setTexture(self.movieTex) self.movieCard.setTexScale(TextureStage.getDefault(), self.movieTex.getTexScale()) self.movieCard.setScale(2.5) self.movieSound = base.loadSfx(audioFile) self.movieTex.synchronizeTo(self.movieSound) self.movieTrack = SoundInterval(self.movieSound, name=self.uniqueName('movieTrack')) self.movieTrack.setDoneEvent(self.movieTrack.getName()) self.acceptOnce(self.movieTrack.getDoneEvent(), self.fsm.request, ['off']) self.movieTrack.start(ts) def exitShow(self): self.ignore(self.movieTrack.getDoneEvent()) self.movieTrack.finish() self.movieTrack = None self.movieSound = None self.movieCard.removeNode() self.movieCard = None self.movieTex = None self.lightenInterior() self.cr.playGame.hood.loader.interiorMusic.play() return def enterIntermission(self, ts = 0): self.intermissionText = DirectLabel(relief=None, text_decal=True, text='', scale=0.7, parent=self.interior.find('**/sign_origin;+s'), text_font=CIGlobals.getMickeyFont(), text_fg=(1, 0.9, 0, 1)) self.movieTrack = Sequence(name=self.uniqueName('intermissionTrack')) for second in range(CinemaGlobals.IntermissionLength + 1): timeRemaining = CinemaGlobals.IntermissionLength - second self.movieTrack.append(Func(self.setIntermissionText, 'Next show in:\n%d' % timeRemaining)) self.movieTrack.append(Wait(1.0)) self.movieTrack.setDoneEvent(self.movieTrack.getName()) self.acceptOnce(self.movieTrack.getDoneEvent(), self.fsm.request, ['off']) self.movieTrack.start(ts) return def setIntermissionText(self, text): self.intermissionText['text'] = text def exitIntermission(self): self.ignore(self.movieTrack.getDoneEvent()) self.movieTrack.finish() self.movieTrack = None self.intermissionText.destroy() self.intermissionText = None return def enterOff(self): pass def exitOff(self): pass def setCinemaIndex(self, index): self.cinemaIndex = index def getCinemaIndex(self): return self.cinemaIndex def setState(self, state, timestamp): ts = globalClockDelta.localElapsedTime(timestamp) self.state = state self.fsm.request(state, [ts]) def getState(self): return self.state