# a Blender scene #import Blender #(is this non-realtime rendering stuff only? no..) import GameLogic import Rasterizer #import time import kyperjokki from GameKeys import * #import time #why not allowed? .. seems to be # a shorthand for blender def act1(act): GameLogic.addActiveActuator(act,1) def act0(act): GameLogic.addActiveActuator(act,0) print "initializing.." #moverscene=kyperjokki.Scene() #moverscene=GameLogic.moverscene #not needed here but imported to elsewhere to not dupe badness scene=kyperjokki.moverscene #scene.movernames=("Guy", "Snake", "Kenguru", "Gorilla", "Alien", "808", "K", "Kyperjokki", "tornado") #in this public version only the dull logos are provided at this stage, #feel free to use your own models and animations! scene.movernames=("K", "808") for mover in scene.movernames: scene.pot_movers.append(None) #guy = kyperjokki.Mover("Guy", [("ABC", 12), # ("Guitar", 44), # ("Head", 10), # ("Leg", 7), # ("Dance", 45), # ("LeftHand", 15), # ("RightHand",15), # ("IndianDance", 200) # ], # "chest", # scene) #snake = kyperjokki.Mover("Snake", [("Crawl", 30), # ("updown", 30), # ("updown2", 30)], # "DJaw", # scene) #kenguru = kyperjokki.Mover("Kenguru", [("jump", 30), # ("Head.001", 70), # ("Drums", 69)], # "Back", # scene) #gorilla = kyperjokki.Mover("Gorilla", [("MonkeyDance1", 20), # ("vaappuu", 60), # ("Dance", 45), # ("ABC", 12), # ("Guitar", 44) # ], # "chest2", # scene) #alien = kyperjokki.Mover("Alien", [("AlienRun", 21), # ], # "pelvis", # scene) state = kyperjokki.Mover("808", [("Center", 41), ("Ellipse",41), ], "Center", scene) k = kyperjokki.Mover("K", [("Center", 41), ("Ellipse", 41) ], "Center", scene) #kypertitle = kyperjokki.Mover("Kyperjokki", [], # None, # scene) #tornado = kyperjokki.Mover("tornado", [], # None, # scene) # if Mover.__init__ could put in place: #for pot_mover in scene.movernames: # scene.pot_movers.append(None) zoomIn = kyperjokki.Event(scene, "global") zoomIn.actions.append("self.scene.camera.zoom = self.scene.camera.zoom + 1") zoomOut = kyperjokki.Event(scene, "global") zoomOut.actions.append("self.scene.camera.zoom = self.scene.camera.zoom - 1") setScene = kyperjokki.Event(scene, "global") setScene.actions.append("self.scene.setscene.setScene('XXX')") #argh! setScene.actions.append("act1(self.scene.setscene)") class setTrack(kyperjokki.GlobalEvent): def start(self): kyperjokki.GlobalEvent.start(self) if self.scene.act_movers: #self.targetname=self.scene.act_movers[-1].bobject.getName()[2:] self.target=self.scene.act_movers[-1] ## if self.scene.act_movers[-1].clones: ## self.latestclone=self.scene.act_movers[-1].clones[-1] ## self.targetname=self.latestclone[0].getName()[2:] ## else: ## self.targetname=self.scene.act_movers[-1].bobject.getName()[2:] ## #BO or not? #tracks to the Main empty that is moved to where the target is, #('cause of a Blender bug that would otherwise point to the hidden # object on another layer which was the basis for adding the target) self.scene.controllerobject.setPosition(self.target.bobject.getPosition()) self.scene.camtrack.setObject('Main') act1(self.scene.camtrack) def stop(self): act0(self.scene.camtrack) kyperjokki.GlobalEvent.stop(self) def act(self): pass trackTo = setTrack(scene) #trackTo.actions.append("act1(camtrack)") class MouseCamera(kyperjokki.GlobalEvent): def act(self): self.scene.camera.movex = -(self.scene.horizontal.value-0.5)*0.1 self.scene.movey = (self.scene.vertical.value-0.5)*0.1 self.scene.cammove.setDLoc(self.scene.camera.movex,self.scene.camera.movey,0,1) def stop(self): self.scene.camera.movez=0 self.scene.camera.movex=0 self.scene.camera.movey=0 self.scene.cammove.setDLoc(self.scene.camera.movex,self.scene.camera.movey,self.scene.camera.movez,1) kyperjokki.GlobalEvent.stop(self) mouseCamera = MouseCamera(scene) setCameraFront=kyperjokki.SetCamera("front") setCameraBack=kyperjokki.SetCamera("back") setCameraLeft=kyperjokki.SetCamera("left") setCameraRight=kyperjokki.SetCamera("right") #movecOut.actions.append("camera.movez = camera.movez + 0.001") #movecIn.actions.append("camera.movez = camera.movez - 0.001") class Movec(kyperjokki.GlobalEvent): def __init__(self, scene, direction): kyperjokki.GlobalEvent.__init__(self, scene) self.direction=direction def start(self): kyperjokki.GlobalEvent.start(self) act0(self.scene.cammove) self.scene.camera.movez=0.01 #camera.getPosition()[2:] self.mode="normal" def stop(self): self.stopcount=0 print "begin stopping" self.mode="stopping" kyperjokki.GlobalEvent.stop(self) def act(self): if self.mode == "normal": if self.direction =="in": self.scene.camera.movez = -(abs(self.scene.camera.movez) * 1.01) #* abs(camera.movez)) #print "in" elif self.direction =="out": self.scene.camera.movez = self.scene.camera.movez * 1.01 #* abs(camera.movez)) #print "out" else: print "invalid movement with camera" self.scene.cammove.setDLoc(self.scene.camera.movex,self.scene.camera.movey,self.scene.camera.movez,1) act1(self.scene.cammove) if self.mode == "stopping": self.scene.camera.movez = self.scene.camera.movez / 1.5 self.stopcount = self.stopcount+1 if self.stopcount > 50: kyperjokki.Event.stop(self) self.scene.camera.movez=0 self.scene.cammove.setDLoc(self.scene.camera.movex,self.scene.camera.movey,self.scene.camera.movez,1) act1(self.scene.cammove) print "stopped." else: act1(self.scene.cammove) #camera.setPosition(camera.getPosition()[:1],camera.movez) #HoX! Here Z is position not velocity movecOut = Movec(scene, "out") movecIn = Movec(scene, "in") #are these used anywhere? (bound to any keys?) movecLeft = kyperjokki.Event(scene, "global") movecLeft.actions.append("camera.movey = camera.movey + 1") movecRight = kyperjokki.Event(scene, "global") movecRight.actions.append("camera.movey = camera.movey - 1") movecUp = kyperjokki.Event(scene, "global") movecUp.actions.append("camera.movex = camera.movex + 1") movecDown = kyperjokki.Event(scene, "global") movecDown.actions.append("camera.movex = camera.movex - 1") #for turning, have a motion vector that the actions adjust # .. seemed not to be working, so having as a property .. *sigh* #turnX=0 #turnY=0 #if kyperjokki.moversready: if 1: print "setting up, movers should be ready by now" #should these be used? now to specify mover specific events. #guy = GameLogic.Object['Guy'] #snake = GameLogic.Object['Snake'] print scene.pot_movers #"snake is:"+repr(snake) class setTimeMode(kyperjokki.GlobalEvent): def __init__(self, scene, whichmode): kyperjokki.GlobalEvent.__init__(self, scene) self.mode=whichmode def start(self): kyperjokki.Event.start(self) self.modewas=self.scene.time.mode self.scene.time.mode=self.mode print self.scene.time.mode def stop(self): self.scene.time.mode=self.modewas print self.scene.time.mode kyperjokki.Event.stop(self) def act(self): #for current system (mouse used for scrub only..) #could read mouse here, but that is about to change.. # -- has changed already, as there is mouse cam move. pass scrubMode = setTimeMode(scene, "scrub") #gee, dividing (instead of incrementing/decrementing) discovered! slowTurning = kyperjokki.Event(scene, "mover") slowTurning.actions.append("if mover.bobject.turnX != 0: mover.bobject.turnX = mover.bobject.turnX / 2") slowTurning.actions.append("if mover.bobject.turnY != 0: mover.bobject.turnY = mover.bobject.turnY / 2") #addObject=kyperjokki.ObjectAdder() #endObject=kyperjokki.ObjectRemover() countBeat = kyperjokki.BeatTap(scene) class SelectMover(kyperjokki.GlobalEvent): def __init__(self, scene, number): kyperjokki.GlobalEvent.__init__(self, scene) self.number=number def act(self): if self.number==0: for mover in scene.pot_movers: if mover: mover.deselect() #'cause of 'None's else: if self.scene.pot_movers[self.number-1]: self.scene.pot_movers[self.number-1].select() print "mover ", self.number, "exists, selected it.." else: scene.addMover(self.number) print scene.act_movers class RemoveMover(SelectMover): def act(self): if self.number==0: for mover in scene.pot_movers: if mover: pass #remove all? better just to reset? call that here? no.. else: if self.scene.pot_movers[self.number-1]: self.scene.pot_movers[self.number-1].remove() print "mover ", self.number, "exists, removing it.." else: print "tried to remove what is not there?" print scene.act_movers #selectOne = SelectMover #selectOne.actions.append("self.scene.pot_movers[0].select()") #selectTwo = kyperjokki.Event("global") #selectTwo.actions.append("self.scene.pot_movers[1].select()") #selectThree = kyperjokki.Event("global") #selectThree.actions.append("self.scene.pot_movers[2].select()") #selectNone = kyperjokki.Event("global") #selectNone.actions.append("for m in self.scene.act_movers: m.deselect()") #switchtoPlane = kyperjokki.Event("global") #switchtoPlane.actions.append("changemesh.setMesh(\"Plane\")") #this first test of more complicated action lead to a sequence (state machine), some kind of class should probably be made out of it? stated/sequencedEvent/Action? class DanceAround(kyperjokki.Event): def __init__(self, scene): self.scene=scene self.type="mover" self.state=0 self.count=0 def act(self, mover): if self.state==0: mover.bobject.turnX = mover.bobject.turnX * 2 mover.bobject.turnY = mover.bobject.turnY * 2 self.state=1 elif self.state==1: slowTurning.start(scene) self.state=2 elif self.state==2: slowTurning.stop() self.state=3 elif self.state==3: if self.count < 10: if self.count == 1: zoomOut.start(scene) self.count = self.count + 1 else: zoomOut.stop() self.stop() def stop(self): self.state=0 self.count=0 #events.remove(self) kyperjokki.Event.stop(self, scene) danceAround = DanceAround(scene) matrixMode=kyperjokki.MatrixMode(scene) # a dict for keybindings here, instead of within keyboard.py in Blender? # types: WHENPRESSED = 1 TOGGLE = 2 ONCLICK = 3 #.. keybindings = {#keyID, eventname, controltype, ZKEY: (zoomOut, WHENPRESSED), AKEY: (zoomIn, WHENPRESSED), LEFTARROWKEY: (kyperjokki.TurnMover(scene, "left"), WHENPRESSED), RIGHTARROWKEY: (kyperjokki.TurnMover(scene, "right"), WHENPRESSED), UPARROWKEY: (kyperjokki.TurnMover(scene, "up"), WHENPRESSED), DOWNARROWKEY: (kyperjokki.TurnMover(scene, "down"), WHENPRESSED), BACKSPACEKEY: (kyperjokki.TurnMover(scene, "slow"), TOGGLE), DKEY: (kyperjokki.MoveMover(scene, "forward"), WHENPRESSED), CKEY: (kyperjokki.MoveMover(scene, "backward"), WHENPRESSED), TABKEY: (scrubMode, TOGGLE), ZEROKEY: (SelectMover(scene, 0), ONCLICK), #deselects all ONEKEY: (SelectMover(scene, 1), ONCLICK), TWOKEY: (SelectMover(scene, 2), ONCLICK), THREEKEY: (SelectMover(scene, 3), ONCLICK), FOURKEY: (SelectMover(scene, 4), ONCLICK), FIVEKEY: (SelectMover(scene, 5), ONCLICK), SIXKEY: (SelectMover(scene, 6), ONCLICK), SEVENKEY: (SelectMover(scene, 7), ONCLICK), EIGHTKEY: (SelectMover(scene, 8), ONCLICK), NINEKEY: (SelectMover(scene, 9), ONCLICK), QKEY: (kyperjokki.AnimateMover(scene, 1), WHENPRESSED), WKEY: (kyperjokki.AnimateMover(scene, 2), WHENPRESSED), EKEY: (kyperjokki.AnimateMover(scene, 3), WHENPRESSED), RKEY: (kyperjokki.AnimateMover(scene, 4), WHENPRESSED), TKEY: (kyperjokki.AnimateMover(scene, 5), WHENPRESSED), YKEY: (kyperjokki.AnimateMover(scene, 6), WHENPRESSED), UKEY: (kyperjokki.AnimateMover(scene, 7), WHENPRESSED), IKEY: (kyperjokki.AnimateMover(scene, 8), WHENPRESSED), #animate first, animate second selected mover separately - like this? #YKEY: (kyperjokki.AnimateMover(1,2), -- optional? 2nd argument #YKEY: (guitarPlay,WHENPRESSED), #UKEY: (headBang,WHENPRESSED), #IKEY: (headNod,WHENPRESSED), #TKEY: (snakeCrawl,WHENPRESSED), #RKEY: (snakeDown,WHENPRESSED), #EKEY: (snakeUp,WHENPRESSED), #OKEY: (legTap,WHENPRESSED), BKEY: (countBeat, ONCLICK), MKEY: (matrixMode, TOGGLE), #is same as RIGHTSHIFT at least on mac :o LEFTSHIFTKEY: (trackTo, WHENPRESSED), PADMINUS: (mouseCamera, TOGGLE), XKEY: (movecOut, WHENPRESSED), SKEY: (movecIn, WHENPRESSED), 177: (kyperjokki.CommandMover(scene, "clone", "horizontal"), ONCLICK), 178: (kyperjokki.CommandMover(scene, "declone", "horizontal"), ONCLICK), LKEY: (kyperjokki.CommandMover(scene, "clone", "vertical"), ONCLICK), KKEY: (kyperjokki.CommandMover(scene, "declone", "vertical"), ONCLICK), SPACEKEY: (kyperjokki.JuggleMode(scene), WHENPRESSED), PAD2: (setCameraFront, WHENPRESSED), PAD8: (setCameraBack, WHENPRESSED), PAD4: (setCameraLeft, WHENPRESSED), PAD2: (setCameraRight, WHENPRESSED), #with modifiers .. uh has to play with numbers, say ctrl = 500 ?-o 500+ONEKEY: (RemoveMover(scene, 1), ONCLICK), 500+TWOKEY: (RemoveMover(scene, 2), ONCLICK), 500+THREEKEY: (RemoveMover(scene, 3), ONCLICK), 500+FOURKEY: (RemoveMover(scene, 4), ONCLICK), 500+FIVEKEY: (RemoveMover(scene, 5), ONCLICK), 500+SIXKEY: (RemoveMover(scene, 6), ONCLICK), 500+SEVENKEY: (RemoveMover(scene, 7), ONCLICK), 500+EIGHTKEY: (RemoveMover(scene, 8), ONCLICK), 500+NINEKEY: (RemoveMover(scene, 9), ONCLICK), #make algo.. #modifiers: #RIGHTCTRLKEY 124: (500, "mod"), F2KEY: (setScene, ONCLICK) } #"AKEY", ..., "ZKEY", "ZERO_KEY" , ..., "NINEKEY", "CAPSLOCKKEY", "LEFTCTRLKEY", "LEFTALTKEY", "RIGHTALTKEY", "RIGHTCTRLKEY", "RIGHTSHIFTKEY", "LEFTSHIFTKEY", "ESCKEY", "TABKEY", "RETKEY", "SPACEKEY", "LINEFEEDKEY", "BACKSPACEKEY", "DELKEY", "SEMICOLONKEY", "PERIODKEY", "COMMAKEY", "QUOTEKEY", "ACCENTGRAVEKEY", "MINUSKEY", "VIRGULEKEY", "SLASHKEY", "BACKSLASHKEY", "EQUALKEY", "LEFTBRACKETKEY", "RIGHTBRACKETKEY", "LEFTARROWKEY", "DOWNARROWKEY", "RIGHTARROWKEY", "UPARROWKEY", "PAD0", ..., "PAD9", "PADPERIOD", "PADVIRGULEKEY", "PADASTERKEY", "PADMINUS", "PADENTER", "PADPLUSKEY", "F1KEY", ..., "F12KEY", "PAUSEKEY", "INSERTKEY", "HOMEKEY", "PAGEUPKEY", "PAGEDOWNKEY", and "ENDKEY". #mouse things in blend-controls.py now :/ else: print "BUG XXX this should never happend! ksetup called unsafely." #could be translated to pygame keys with another dict! #act1(camzoom) #act1(cammove) #act1(move) #kyperscene = GameLogic.SceneActuator() #print kyperscene.getScene() #scene = Blender.Scene.New('kyperscene') #GameLogic.setScene('kyperscene') #scene.makeCurrent() #scene.update() #Blender.Redraw() #print scene.getChildren() #camera = Blender.Camera.New('persp') #camera.lens = 35.0 #cameraobj = Blender.Object.New('Camera') #cameraobj.link(camera) #scene.link(cameraobj) #scene.setCurrentCamera(cameraobj) #lamp = Blender.Lamp.New('Spot') #lamp.energy = 1.8 #lamp.spotSize = 30.0 #lampobj = Blender.Object.New('Lamp') #lampobj.link(lamp) #scene.link(lampobj) #Blender.loadFile("meshes.blend") #print dir(Blender.Mesh) #mesh = Blender.Mesh.get("Guy") # now are: Guy, Monster(?), Suzanne #meshobj = Blender.Object.New('Mesh') #meshobj.link(mesh) #print meshobj #meshobj.update() #scene.link(meshobj) #ob = Blender.Object.New('Lamp2') #ob.setLocation(10.0, 0.0, 0.0) #ob.link(lamp) #scene.link(ob) #print scene.getChildren() #scene.update() #Blender.Redraw() #while 1: pass #time.sleep(10) #for z in range(0,10000): # meshobj.setLocation((0, 0, z/100)) #print "a bit more made"