def __init__(self): log.debug('Starting Client') #open a window... but first set all the needed props wp = self.loadWindoProperites() #open the window base.openMainWindow(props=wp) #base.setBackgroundColor(0.06, 0.1, 0.12, 1) base.setBackgroundColor(0.0, 0.0, 0.0, 1) base.disableMouse() base.enableParticles() #needed to determine what window event fired self.window_focused = base.win.getProperties().getForeground() self.window_x = base.win.getXSize() self.window_y = base.win.getYSize() self.window_minimized = base.win.getProperties().getMinimized() #filter manager, post process self.filters = Filters() #audio sound effects (sfx) + music self.audio = Audio() self.audio.setMusic('background') self.audio.playMusic() #light manager self.lights = LightManager() #setup the user interface (gui+key/mouse bind) self.ui = UserInterface() #skybox self.sun_and_sky = Skybox(self.lights) #player (character) droid self.droid = PCDroid(self.ui) #some vars used later self.map_name = None self.loading_status = set() self.level_root = render.attachNewNode('level_root') self.level_root.hide() self.is_in_game = False #events base.win.setCloseRequestEvent('exit-event') self.accept('exit-event', self.onClientExit) self.accept('window-event', self.onWindowEvent) self.accept('window-reset', self.onWindowReset) self.accept('client-mouselock', self.setMouseLock) self.accept('load-level', self.onLevelLoad) self.accept('loading-done', self.onLoadingDone) self.accept('reload-shaders', self.onShaderReload) self.accept('client-set-team', self.onTeamCahnge) self.accept('client-quit', self.onQuit) # Task taskMgr.add(self.update, 'client_update') log.debug('Client started')
def testLightManager(): lm = LightManager.Instance() lm.load() # Make sure all lights were loaded. print("LIGHT MANAGER UNIT TESTING") for id in ['100001','100002','100003', \ '100004','100005']: print(str(lm.getLight(id) != None) + ' (Light id=' + id + ' loaded.)') # Test name changing and permissions. print(str(lm.changeLightName('100001', 'lol')) + ' (Change light name.)') print(str(lm.getLight('100001')['name'] == 'lol') + ' (Verify change.)') print( str(lm.changeLightClient('100001', 'new client')) + ' (Change light client.)') print( str(lm.getLight('100001', )['client'] == 'new client') + ' (Verify change.)') print(str(lm.lightExists('100001')) + ' (Verify existence testing.)') print(str(not lm.lightExists('fake ID')) + ' (Verify existence testing.)') print(str(not lm.deleteLight('fake ID')) + ' (Delete fake light.)') print(str(lm.deleteLight('100003')) + ' (Delete real light.)') print(str(not lm.getLight('100003')) + ' (Verify deletion.)') print(str(not lm.deleteLight('100003')) + ' (Check double delete.)') print( str(not lm.isAllowed('3', '100002')) + ' (Check light whitelisting.)') print(str(lm.isAllowed('6', '100002')) + ' (Check light whitelisting.)') print(str(lm.isAllowed('3', '100001')) + ' (Check light whitelisting.)') print( str(not lm.isAllowed('999', '100001')) + ' (Check light whitelisting.)') result = lm.addUUIDtoSubset('new UUID', ['100001', '100002', '100004']) test = True for light in result.values(): test = test and light['success'] print(str(test) + ' (Test adding UUID to multiple lights.') print(str(lm.isAllowed('new UUID', '100002')) + ' (Verify add.)') print(str(not lm.isAllowed('new UUID', '100005')) + ' (Verify add.)') result = lm.removeUUIDfromSubset('new UUID', ['100001', '100002', '100004']) test = True for light in result.values(): test = test and light['success'] print(str(test) + ' (Test removing UUID from multiple lights.') print(str(not lm.isAllowed('new UUID', '100002')) + ' (Verify removal.)') print(str(not lm.isAllowed('new UUID', '100005')) + ' (Verify removal.)')
def __init__(self): base = ShowBase.ShowBase() base.trackball.node().setPos(0, 600, -80) base.trackball.node().setHpr(0, 40, 0) LM=LightManager(max_lights=32, ambient=(0.2, 0.2, 0.2)) print "Number of lights:", LM.max_lights for i in range(LM.max_lights): x=random.randrange(-128, 128) y=random.randrange(-128, 128) z=random.randrange(1, 20) r=random.uniform(0.0, 1.0) g=random.uniform(0.0, 1.0) b=random.uniform(0.0, 1.0) LM.addLight(pos=(x, y, z), color=(r,g,b), radius=50.0, specular=1.0) #preview cm = CardMaker("plane") cm.setFrame(-128, 128, -128,128) self.plane=render.attachNewNode(cm.generate()) self.plane.lookAt(0, 0, -1) self.plane.flattenStrong() #self.plane.hprInterval(30.0, LPoint3(360, 0,0)).loop() self.plane.setShader(Shader.load(Shader.SL_GLSL,'v.glsl','f.glsl')) self.plane.setShaderInput("normal_map",loader.loadTexture("1324-normal.jpg")) self.plane.setTexture(loader.loadTexture("1324.jpg")) self.smiley = loader.loadModel('smiley') self.smiley.reparentTo(render) self.smiley.setPos(-5,60,10) self.smiley.setScale(10) self.smiley.hprInterval(3.0, LPoint3(360, 0,0)).loop() axis = render.attachNewNode('axis') self.smiley.wrtReparentTo(axis) axis.hprInterval(10.0, LPoint3(-360, 0,0)).loop() self.smiley.setShader(Shader.load(Shader.SL_GLSL,'v.glsl','f.glsl')) self.smiley.setShaderInput("normal_map",loader.loadTexture("7569-normal.jpg"))
class InteractionManager(object): datePicker = DatePicker() session = Session() lightmanager = LightManager() def setUser(self, user): self.user = user def sendusertosession(self, previoussession): self.session = Session() self.session.setUser(self.user) if previoussession == 0: self.startSession1() elif previoussession == 1: self.startSession2() else: self.startSession3() self.lightmanager.setSession(previoussession + 1) # Runs light in current phaase def startSession1(self): self.session.setSessionNumber("1") self.session.setHeading("Afklaring") user = self.session.user # get the user from the session self.session.appendElement("hilsen", "Hej " + user.name) for question in self.buildList(self.questionsforone, 5): self.session.appendElement("question", question) for statement in self.buildList(self.economyStatements, 2): number = randint(5000, 20000) concatenate = statement % (number) print concatenate self.session.appendElement("blue", concatenate) numberofelements = len(self.moneyStatements) - 1 picknumber = randint(0, numberofelements) self.session.appendElement("blue", self.moneyStatements[picknumber] % int(user.money)) self.session.appendElement("green", "Nuværende Addresse: " + user.address + ", " + user.city) for statement in self.buildList(self.workstatements, 2): self.session.appendElement("green", statement) self.session.appendElement("green", "Du har snart jubilæum i %s" % self.volunteerclubs[randint(0, len(self.volunteerclubs) - 1)]) self.session.appendElement("green", "Du har været været ansat i %d år, i dit sidste job." % randint(0, 10)) self.session.appendElement("red", "Fødselsdato: " + user.birthday) date = self.datePicker.randomDate("1/1/2012", "24/5/2016", random.uniform(0, 1)) print date self.session.appendElement("red", "Du var sidst ved lægen den: " + date) for statement in self.buildList(self.healthstatements, 1): self.session.appendElement("red", statement) print "Starter session: 1" def startSession2(self): self.session.setSessionNumber("2") self.session.setHeading("Valg") user = self.session.user # get the user from the session self.session.appendElement("hilsen", "Velkommen tilbage " + user.name) self.session.appendElement("valg", self.makeChoice(user)) self.session.appendElement("telefon", "Økonomisk rådgivning kan tilgås via kommunen på tlf: 41 85 63 86 mellem 09.00 og 14.00 på alle hverdage") print "Starter session: 2" def makeChoice(self, person): if person.age < 30: self.session.appendElement("uddannelse", "En Uddannelsesvejleder kan snakke med omkring din fremtid på 33925000, alle hverdage fra 09.00 til 14.00.") return "Du har ikke ret til kontanthjælp, du kan i stedet for modtage uddannnelseshjælp." elif person.money > 10000: return self.nolist[randint(0, len(self.nolist) - 1)] else: return self.choicelist[randint(0, len(self.choicelist) - 1)] def startSession3(self): self.session.setSessionNumber("3") self.session.setHeading("Fremtid") print "Starter session: 3" def getContent(self): return self.session """ Precondition list should be bigger than max or endless recursion """ def buildList(self, list, max): res = [] numlist = [] highest = len(list) print max for number in range(0, max): choice = self.guessnumber(0, highest - 1, numlist) statement = list[choice] res.append(statement) return res def guessnumber(self, min, max, list): num = randint(min, max) for number in list: if num == number: return self.guessnumber(min, max, list) list.append(num) return num questionsforone = [ "Har jeg råd til mad?", "Har jeg det jeg skal bruge i min hverdag?", "Hvordan har familien det?", "Er der sket noget jeg har behov for en anden til at snakke med om?", "Går det godt, alt taget i betragtning?", "Er de gamle skavanker helet?", "Hvornår har jeg sidst være ved lægen?", "Kunne jeg tænke mig at blive selvstændig?", "Var jeg glad for dit gamle arbejde?", "Lyst til at arbejde i en ny branche?", "Er jeg færdig med at uddanne mig?", "Hvad kan jeg blive?", "Hvor mange penge skal der til, for at jeg kan få det til at køre rundt?", "Er der balance i min økonomi?", "Er der mere jeg vil vide?"] moneyStatements = [ "Der står %d på din konto", "Samlet set ejer du %d kroner"] #UDVID economyStatements = ["Du har lån for %d kroner.", "Du har brugt %d kroner på elektronik det sidste halve år", "Du bruger i gennemsnit %d kroner på mad hver halve år"] healthstatements = [ "Din journal siger du døjer med rygproblemer.", "Du har været ved lægen sidste måned med ondt i knæet ved en sportskade.", "Din journal siger du har problemer i højre håndled fra arbejde ved din bærbare computer.", "Du mangler anden vaccination af din Hepapitis B for at fuldt ud vaccineret.", "Du har været ved vagtlægen 3 gange i løbet af sidste år."] workstatements = [ "Du betragtes som erfaren indenfor din branche.", "Dine evner er eftertragtet hos erhvervslivet i øjeblikket.", "Du har en god chance for at komme hurtigt i nyt job."] volunteerclubs = [ "fodboldkluben", "håndboldkluben", "klatreklubben", "golfklubben", "petanqueklubben", "dartklubben", "open space aarhus", "sportsklubben"] choicelist = [ "Du har efter reglerne ret til kontanthjælp, da du er bedømt til ikke at være i stand til at forsørge dig selv på grund af helbredsmæssige årsager.", "På grund af dine økonomiske årsager er du blevet bedømt som havende krav på modtage kontanthjælp.", "Da du står uden forsørger efter samlivsophør, er du blevet berettiget kontanthjælp."] nolist = [ "Du har ikke ret til kontanthjælp, da du efter reglerne er i stand til at forsørge dig selv.", "Du har ikke ret til kontanthjælp, eftersom du har nok penge på dine konti til selvforsørgelse."]
return setupChromecast(attempts) cast.wait() return cast # find the sonos system and pick the highest priority room sonos = SonosManager(SONOS_SPEAKERS) album_manager = AlbumManager(LASTFM_API_KEY, LASTFM_API_SECRET, lastfm_username, lastfm_password) cast = setupChromecast() castViewer = cast.media_controller track = {'title': 'NA', 'artist': 'NA', 'album': 'NA'} # The 5 used below is for all light_manager = LightManager(HUE_IP_ADDRESS, hue_lights=HUE_LIGHTS, limitlessled_groups=[5]) duration = '' failed_album_artwork = False is_paused = False while 1: # get the current album is being played in currently selected sonos speaker track = sonos.wait_for_next_track() if not sonos.get_paused_state(): # if we were paused but are now moving forward if is_paused: # This means the play button was pressed cast = setupChromecast() castViewer = cast.media_controller # make sure everything gets setup next time # track = {'title': 'NA', 'artist': 'NA', 'album': 'NA'}
class Demo (DirectObject): def __init__(self, directory): #init ShowBase base = ShowBase.ShowBase() base.setBackgroundColor(1,1,1) #PStatClient.connect() self.lManager=LightManager() self.skyimg=PNMImage("data/sky_grad.png") #manager for post process filters (fxaa, soft shadows, dof) manager=FilterManager(base.win, base.cam) self.filters=setupFilters(manager, path, fxaa_only=False) #load a level self.level=loadLevel(path=path, from_dir=directory) self.startpos=None #process properties functions={'coll_mask':self.setCollideMaskOn, 'hide':self.hideNode, 'startpos':self.setStratPos, 'alpha':self.setAlpha } processProps(self.level, functions) #lights and shadows self.sun=setupLights(self.lManager) self.shadows=setupShadows(buffer_size=1024) #camera controll base.disableMouse() self.controler=CameraControler(shadows=self.shadows) #point and click interface self.pointer=PointAndClick() self.accept('mouse1', self.onMouseClick) #player model #could be another class.... well next time self.pcNode=render.attachNewNode('pcNode') self.actor=Actor("demo_models/male", {"attack1":"demo_models/male_attack1", "attack2":"demo_models/male_attack2", "walk":"demo_models/male_run", "block":"demo_models/male_block", "die":"demo_models/male_die", "strafe":"demo_models/male_strafe2", "hit":"demo_models/male_hit", "idle":"demo_models/male_ready2"}) self.actor.setBlend(frameBlend = True) self.actor.reparentTo(self.pcNode) self.actor.setScale(.1) self.actor.setShader(Shader.load(Shader.SLGLSL, path+"shaders/player_v.glsl",path+"shaders/player_f.glsl")) self.actor.loop("idle") self.pcNode.setPos(self.startpos) #collisions self.coll_ray=self.pcNode.attachNewNode(CollisionNode('collRay')) self.coll_ray.node().addSolid(CollisionRay(0, 0, 20, 0,0,-180)) self.coll_ray.node().setIntoCollideMask(BitMask32.allOff()) self.coll_ray.node().setFromCollideMask(BitMask32.bit(1)) #self.coll_ray.show() self.traverser = CollisionTraverser() self.queue = CollisionHandlerQueue() self.traverser.addCollider(self.coll_ray, self.queue) #pathfinding self.navi=Navigator(path+directory+'/navmesh.csv', self.pcNode, self.actor) self.target=render.attachNewNode('target') self.setTime(7.5) #tasks taskMgr.add(self.update, 'update_task', sort=45) self.clock=7.5 taskMgr.doMethodLater(1.0, self.clockTick,'clock_task', sort=10) self.accept( 'window-event', self.windowEventHandler) def clockTick(self, task): self.clock+=0.05 if self.clock>23.9: self.clock=0.0 self.setTime(self.clock) return task.again def blendPixels(self, p1, p2, blend): c1=[p1[0]/255.0,p1[1]/255.0,p1[2]/255.0, p1[3]/255.0] c2=[p2[0]/255.0,p2[1]/255.0,p2[2]/255.0, p2[3]/255.0] return Vec4( c1[0]*blend+c2[0]*(1.0-blend), c1[1]*blend+c2[1]*(1.0-blend), c1[2]*blend+c2[2]*(1.0-blend), c1[3]*blend+c2[3]*(1.0-blend)) def setTime(self, time): sunpos=min(0.5, max(-0.5,(time-12.0)/14.0)) render.setShaderInput('sunpos', sunpos) x1=int(time) x2=x1-1 if x2<0: x2=0 blend=time%1.0 p1=self.skyimg.getPixel(x1, 0) p2=self.skyimg.getPixel(x2, 0) sunColor=self.blendPixels(p1, p2, blend) sunColor[0]=sunColor[0]*1.5 sunColor[1]=sunColor[1]*1.5 sunColor[2]=sunColor[2]*1.5 p1=self.skyimg.getPixel(x1, 1) p2=self.skyimg.getPixel(x2, 1) skyColor=self.blendPixels(p1, p2, blend) p1=self.skyimg.getPixel(x1, 2) p2=self.skyimg.getPixel(x2, 2) cloudColor=self.blendPixels(p1, p2, blend) p1=self.skyimg.getPixel(x1, 3) p2=self.skyimg.getPixel(x2, 3) fogColor=self.blendPixels(p1, p2, blend) fogColor[3]=abs(sunpos)*0.01+0.001 if time<6.0 or time>18.0: p=0.0 else: p=sunpos*-180.0 LerpHprInterval(self.shadows['sunNode'], 1.0, (0,p,0)).start() #self.shadows['sunNode'].setP(p) self.lManager.setLight(id=self.sun, pos=self.shadows['shadowCamera'].getPos(render), color=sunColor, radius=10000.0) self.level['skydome'].setShaderInput("sunColor",sunColor) self.level['skydome'].setShaderInput("skyColor",skyColor) self.level['skydome'].setShaderInput("cloudColor",cloudColor) render.setShaderInput("fog", fogColor) def windowEventHandler( self, window=None ): if window is not None: # window is none if panda3d is not started self.filters[-1].setShaderInput("rt_w",float(base.win.getXSize())) self.filters[-1].setShaderInput("rt_h",float(base.win.getYSize())) def onMouseClick(self): pos=self.pointer.getPos() if pos: self.target.setPos(pos) self.navi.moveTo(self.target) def setAlpha(self, node, mode): pass #node.setTransparency(TransparencyAttrib.MAlpha) def setCollideMaskOn(self, node, mask): print "setting mask", mask, "on", node node.setCollideMask(BitMask32.bit(mask)) def hideNode(self, node, doHide): if doHide==1: print "hidding node", node node.hide() def setStratPos(self, node, not_used=None): self.startpos=node.getPos(render) def update(self, task): time=globalClock.getFrameTime() render.setShaderInput('time', time) self.controler.cameraNode.setPos(self.pcNode.getPos()) #self.shadows['shadowNode'].setPos(self.pcNode.getPos()) if len(self.filters)>1: self.filters[4].setShaderInput('time', time) #water if self.level['water']['waterNP'].getZ()>0.0: self.level['water']['waterCamera'].setMat(base.cam.getMat(render)*self.level['water']['wPlane'].getReflectionMat()) #collision self.traverser.traverse(render) if self.queue.getNumEntries() > 0: self.queue.sortEntries() pos=self.queue.getEntry(0).getSurfacePoint(render) self.pcNode.setZ(pos[2]+0.2) return task.cont
def __init__(self, directory): #init ShowBase base = ShowBase.ShowBase() base.setBackgroundColor(1,1,1) #PStatClient.connect() self.lManager=LightManager() self.skyimg=PNMImage("data/sky_grad.png") #manager for post process filters (fxaa, soft shadows, dof) manager=FilterManager(base.win, base.cam) self.filters=setupFilters(manager, path, fxaa_only=False) #load a level self.level=loadLevel(path=path, from_dir=directory) self.startpos=None #process properties functions={'coll_mask':self.setCollideMaskOn, 'hide':self.hideNode, 'startpos':self.setStratPos, 'alpha':self.setAlpha } processProps(self.level, functions) #lights and shadows self.sun=setupLights(self.lManager) self.shadows=setupShadows(buffer_size=1024) #camera controll base.disableMouse() self.controler=CameraControler(shadows=self.shadows) #point and click interface self.pointer=PointAndClick() self.accept('mouse1', self.onMouseClick) #player model #could be another class.... well next time self.pcNode=render.attachNewNode('pcNode') self.actor=Actor("demo_models/male", {"attack1":"demo_models/male_attack1", "attack2":"demo_models/male_attack2", "walk":"demo_models/male_run", "block":"demo_models/male_block", "die":"demo_models/male_die", "strafe":"demo_models/male_strafe2", "hit":"demo_models/male_hit", "idle":"demo_models/male_ready2"}) self.actor.setBlend(frameBlend = True) self.actor.reparentTo(self.pcNode) self.actor.setScale(.1) self.actor.setShader(Shader.load(Shader.SLGLSL, path+"shaders/player_v.glsl",path+"shaders/player_f.glsl")) self.actor.loop("idle") self.pcNode.setPos(self.startpos) #collisions self.coll_ray=self.pcNode.attachNewNode(CollisionNode('collRay')) self.coll_ray.node().addSolid(CollisionRay(0, 0, 20, 0,0,-180)) self.coll_ray.node().setIntoCollideMask(BitMask32.allOff()) self.coll_ray.node().setFromCollideMask(BitMask32.bit(1)) #self.coll_ray.show() self.traverser = CollisionTraverser() self.queue = CollisionHandlerQueue() self.traverser.addCollider(self.coll_ray, self.queue) #pathfinding self.navi=Navigator(path+directory+'/navmesh.csv', self.pcNode, self.actor) self.target=render.attachNewNode('target') self.setTime(7.5) #tasks taskMgr.add(self.update, 'update_task', sort=45) self.clock=7.5 taskMgr.doMethodLater(1.0, self.clockTick,'clock_task', sort=10) self.accept( 'window-event', self.windowEventHandler)
cast.wait() return cast # find the sonos system and pick the highest priority room sonos = SonosManager(SONOS_SPEAKERS) album_manager = AlbumManager(LASTFM_API_KEY, LASTFM_API_SECRET, lastfm_username, lastfm_password) cast = setupChromecast() castViewer = cast.media_controller track = {'title': 'NA', 'artist': 'NA', 'album': 'NA'} # The 5 used below is for all light_manager = LightManager(HUE_IP_ADDRESS, hue_lights=HUE_LIGHTS, limitlessled_groups=[5]) duration = '' failed_album_artwork = False is_paused = False while 1: # get the current album is being played in currently selected sonos speaker track = sonos.wait_for_next_track() if not sonos.get_paused_state(): # if we were paused but are now moving forward if is_paused: # This means the play button was pressed cast = setupChromecast() castViewer = cast.media_controller # make sure everything gets setup next time
def __init__(self): self._lm = LightManager.Instance() self._am = AliasManager.Instance() self._cm = ClientManager.Instance()
def __init__(self, directory): #init ShowBase base = ShowBase.ShowBase() base.setBackgroundColor(1, 1, 1) #PStatClient.connect() self.lManager = LightManager() self.skyimg = PNMImage("data/sky_grad.png") #manager for post process filters (fxaa, soft shadows, dof) manager = FilterManager(base.win, base.cam) self.filters = setupFilters(manager, path, fxaa_only=False) #load a level self.level = loadLevel(path=path, from_dir=directory) self.startpos = None #process properties functions = { 'coll_mask': self.setCollideMaskOn, 'hide': self.hideNode, 'startpos': self.setStratPos, 'alpha': self.setAlpha } processProps(self.level, functions) #lights and shadows self.sun = setupLights(self.lManager) self.shadows = setupShadows(buffer_size=1024) #camera controll base.disableMouse() self.controler = CameraControler(shadows=self.shadows) #point and click interface self.pointer = PointAndClick() self.accept('mouse1', self.onMouseClick) #player model #could be another class.... well next time self.pcNode = render.attachNewNode('pcNode') self.actor = Actor( "demo_models/male", { "attack1": "demo_models/male_attack1", "attack2": "demo_models/male_attack2", "walk": "demo_models/male_run", "block": "demo_models/male_block", "die": "demo_models/male_die", "strafe": "demo_models/male_strafe2", "hit": "demo_models/male_hit", "idle": "demo_models/male_ready2" }) self.actor.setBlend(frameBlend=True) self.actor.reparentTo(self.pcNode) self.actor.setScale(.1) self.actor.setShader( Shader.load(Shader.SLGLSL, path + "shaders/player_v.glsl", path + "shaders/player_f.glsl")) self.actor.loop("idle") self.pcNode.setPos(self.startpos) #collisions self.coll_ray = self.pcNode.attachNewNode(CollisionNode('collRay')) self.coll_ray.node().addSolid(CollisionRay(0, 0, 20, 0, 0, -180)) self.coll_ray.node().setIntoCollideMask(BitMask32.allOff()) self.coll_ray.node().setFromCollideMask(BitMask32.bit(1)) #self.coll_ray.show() self.traverser = CollisionTraverser() self.queue = CollisionHandlerQueue() self.traverser.addCollider(self.coll_ray, self.queue) #pathfinding self.navi = Navigator(path + directory + '/navmesh.csv', self.pcNode, self.actor) self.target = render.attachNewNode('target') self.setTime(7.5) #tasks taskMgr.add(self.update, 'update_task', sort=45) self.clock = 7.5 taskMgr.doMethodLater(1.0, self.clockTick, 'clock_task', sort=10) self.accept('window-event', self.windowEventHandler)
class Demo(DirectObject): def __init__(self, directory): #init ShowBase base = ShowBase.ShowBase() base.setBackgroundColor(1, 1, 1) #PStatClient.connect() self.lManager = LightManager() self.skyimg = PNMImage("data/sky_grad.png") #manager for post process filters (fxaa, soft shadows, dof) manager = FilterManager(base.win, base.cam) self.filters = setupFilters(manager, path, fxaa_only=False) #load a level self.level = loadLevel(path=path, from_dir=directory) self.startpos = None #process properties functions = { 'coll_mask': self.setCollideMaskOn, 'hide': self.hideNode, 'startpos': self.setStratPos, 'alpha': self.setAlpha } processProps(self.level, functions) #lights and shadows self.sun = setupLights(self.lManager) self.shadows = setupShadows(buffer_size=1024) #camera controll base.disableMouse() self.controler = CameraControler(shadows=self.shadows) #point and click interface self.pointer = PointAndClick() self.accept('mouse1', self.onMouseClick) #player model #could be another class.... well next time self.pcNode = render.attachNewNode('pcNode') self.actor = Actor( "demo_models/male", { "attack1": "demo_models/male_attack1", "attack2": "demo_models/male_attack2", "walk": "demo_models/male_run", "block": "demo_models/male_block", "die": "demo_models/male_die", "strafe": "demo_models/male_strafe2", "hit": "demo_models/male_hit", "idle": "demo_models/male_ready2" }) self.actor.setBlend(frameBlend=True) self.actor.reparentTo(self.pcNode) self.actor.setScale(.1) self.actor.setShader( Shader.load(Shader.SLGLSL, path + "shaders/player_v.glsl", path + "shaders/player_f.glsl")) self.actor.loop("idle") self.pcNode.setPos(self.startpos) #collisions self.coll_ray = self.pcNode.attachNewNode(CollisionNode('collRay')) self.coll_ray.node().addSolid(CollisionRay(0, 0, 20, 0, 0, -180)) self.coll_ray.node().setIntoCollideMask(BitMask32.allOff()) self.coll_ray.node().setFromCollideMask(BitMask32.bit(1)) #self.coll_ray.show() self.traverser = CollisionTraverser() self.queue = CollisionHandlerQueue() self.traverser.addCollider(self.coll_ray, self.queue) #pathfinding self.navi = Navigator(path + directory + '/navmesh.csv', self.pcNode, self.actor) self.target = render.attachNewNode('target') self.setTime(7.5) #tasks taskMgr.add(self.update, 'update_task', sort=45) self.clock = 7.5 taskMgr.doMethodLater(1.0, self.clockTick, 'clock_task', sort=10) self.accept('window-event', self.windowEventHandler) def clockTick(self, task): self.clock += 0.05 if self.clock > 23.9: self.clock = 0.0 self.setTime(self.clock) return task.again def blendPixels(self, p1, p2, blend): c1 = [p1[0] / 255.0, p1[1] / 255.0, p1[2] / 255.0, p1[3] / 255.0] c2 = [p2[0] / 255.0, p2[1] / 255.0, p2[2] / 255.0, p2[3] / 255.0] return Vec4(c1[0] * blend + c2[0] * (1.0 - blend), c1[1] * blend + c2[1] * (1.0 - blend), c1[2] * blend + c2[2] * (1.0 - blend), c1[3] * blend + c2[3] * (1.0 - blend)) def setTime(self, time): sunpos = min(0.5, max(-0.5, (time - 12.0) / 14.0)) render.setShaderInput('sunpos', sunpos) x1 = int(time) x2 = x1 - 1 if x2 < 0: x2 = 0 blend = time % 1.0 p1 = self.skyimg.getPixel(x1, 0) p2 = self.skyimg.getPixel(x2, 0) sunColor = self.blendPixels(p1, p2, blend) sunColor[0] = sunColor[0] * 1.5 sunColor[1] = sunColor[1] * 1.5 sunColor[2] = sunColor[2] * 1.5 p1 = self.skyimg.getPixel(x1, 1) p2 = self.skyimg.getPixel(x2, 1) skyColor = self.blendPixels(p1, p2, blend) p1 = self.skyimg.getPixel(x1, 2) p2 = self.skyimg.getPixel(x2, 2) cloudColor = self.blendPixels(p1, p2, blend) p1 = self.skyimg.getPixel(x1, 3) p2 = self.skyimg.getPixel(x2, 3) fogColor = self.blendPixels(p1, p2, blend) fogColor[3] = abs(sunpos) * 0.01 + 0.001 if time < 6.0 or time > 18.0: p = 0.0 else: p = sunpos * -180.0 LerpHprInterval(self.shadows['sunNode'], 1.0, (0, p, 0)).start() #self.shadows['sunNode'].setP(p) self.lManager.setLight(id=self.sun, pos=self.shadows['shadowCamera'].getPos(render), color=sunColor, radius=10000.0) self.level['skydome'].setShaderInput("sunColor", sunColor) self.level['skydome'].setShaderInput("skyColor", skyColor) self.level['skydome'].setShaderInput("cloudColor", cloudColor) render.setShaderInput("fog", fogColor) def windowEventHandler(self, window=None): if window is not None: # window is none if panda3d is not started self.filters[-1].setShaderInput("rt_w", float(base.win.getXSize())) self.filters[-1].setShaderInput("rt_h", float(base.win.getYSize())) def onMouseClick(self): pos = self.pointer.getPos() if pos: self.target.setPos(pos) self.navi.moveTo(self.target) def setAlpha(self, node, mode): pass #node.setTransparency(TransparencyAttrib.MAlpha) def setCollideMaskOn(self, node, mask): print("setting mask", mask, "on", node) node.setCollideMask(BitMask32.bit(mask)) def hideNode(self, node, doHide): if doHide == 1: print("hidding node", node) node.hide() def setStratPos(self, node, not_used=None): self.startpos = node.getPos(render) def update(self, task): time = globalClock.getFrameTime() render.setShaderInput('time', time) self.controler.cameraNode.setPos(self.pcNode.getPos()) #self.shadows['shadowNode'].setPos(self.pcNode.getPos()) if len(self.filters) > 1: self.filters[4].setShaderInput('time', time) #water if self.level['water']['waterNP'].getZ() > 0.0: self.level['water']['waterCamera'].setMat( base.cam.getMat(render) * self.level['water']['wPlane'].getReflectionMat()) #collision self.traverser.traverse(render) if self.queue.getNumEntries() > 0: self.queue.sortEntries() pos = self.queue.getEntry(0).getSurfacePoint(render) self.pcNode.setZ(pos[2] + 0.2) return task.cont
def __init__(self): #setup size=512 #size of the wave buffer self.update_speed=1.0/60.0 #the waves only look good when generated at this constant rate (1/60=60fps) base = ShowBase.ShowBase() base.setBackgroundColor(0.1,0.25,0.4) #I don't know what I'm doin'... base.trackball.node().setPos(-128, 150, -50) base.trackball.node().setHpr(0, 40, 0) #wave source buffer self.wave_source=self.makeBuffer(size=256, texFilter=Texture.FTNearest) self.wave_source['quad'].setColor(0,0,0, 0) self.wave_source['quad'].setZ(-10) #a normal, animated actor visible_panda=self.makeWalkingPanda(render) #a copy of the panda, but rendered offscreen phantom_panda=self.makeWalkingPanda(self.wave_source['root']) #do the magic self.setWaveCaster(phantom_panda) #make the ping-pong buffer to draw the water waves #shader 2 makes no use of the wave_source texture, appart from that they are identical shader1=Shader.load(Shader.SL_GLSL,'v.glsl', 'make_wave_f.glsl') shader2=Shader.load(Shader.SL_GLSL,'v.glsl', 'make_wave2_f.glsl') self.ping=self.makeBuffer(shader1, size) self.pong=self.makeBuffer(shader2, size) self.ping['quad'].setShaderInput("size",float(size)) self.pong['quad'].setShaderInput("size",float(size)) self.ping['quad'].setTexture(self.pong['tex']) self.pong['quad'].setTexture(self.ping['tex']) self.ping['quad'].setShaderInput('startmap', self.wave_source['tex']) self.ping['buff'].setActive(True) self.pong['buff'].setActive(False) #some vars to track the state of things self.time=0 self.state=0 #set lights #reusing some of my old stuff, no mind the light manager l=LightManager() self.sun=l.addLight(pos=(128.0, 300.0, 50.0), color=(0.9, 0.9, 0.9), radius=500.0) #skybox skybox=loader.loadModel('skybox/skybox') skybox.reparentTo(render) skybox.setPos(128, 128, 64) skybox.setScale(300) #preview cm = CardMaker("plane") cm.setFrame(0, 256, 0, 256) self.water_plane=render.attachNewNode(cm.generate()) self.water_plane.lookAt(0, 0, -1) self.water_plane.setPos(0,0,1.0) self.water_plane.flattenStrong() self.water_plane.setShader(Shader.load(Shader.SL_GLSL,'water_v.glsl','water_f.glsl')) self.water_plane.setShaderInput("size",float(size)) self.water_plane.setShaderInput("normal_map",loader.loadTexture("normal.png")) self.water_plane.setTexture(self.pong['tex']) self.water_plane.hide(BitMask32.bit(1)) self.makeWaterBuffer() #self.water_plane.hide() #update task taskMgr.add(self.update, 'update')