Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import direct.directbase.DirectStart
- from direct.showbase.DirectObject import DirectObject
- from pandac.PandaModules import *
- loadPrcFileData("", "fullscreen 1")
- loadPrcFileData("","win-size 1024 768")
- from direct.interval.IntervalGlobal import LerpFunc
- import sys
- from chunk import *
- from direct.stdpy import thread # Threading stuff
- PStatClient.connect()
- base.setFrameRateMeter(True)
- lastPos = base.cam.getPos()
- updateDistanceSquared = 64*64
- skybox = loader.loadModel("skybox")
- skybox.setScale(256)
- skybox.setBin('background', 1)
- skybox.setDepthWrite(0)
- skybox.setLightOff()
- skybox.reparentTo(render)
- taskMgr.setupTaskChain('custom task chain', numThreads = 1, tickClock = None, #Task chain for separate thread
- threadPriority = TP_normal, frameBudget = -1,
- frameSync = False, timeslicePriority = None)
- class FPS(object,DirectObject):
- chunks2 = []
- coords = []
- positionX = 0
- positionY = 0
- chunksToMake = []
- def __init__(self):
- global c,chunks,chunks1
- ## self.initChunks()
- self.makeChunksAroundX(self.positionX,self.positionY)
- self.winXhalf = base.win.getXSize()/2
- self.winYhalf = base.win.getYSize()/2
- ## self.makeTrees()
- self.initCollision()
- ## self.initShadows()
- c = 0.0
- self.initPlayer()
- self.initWater()
- ## def initChunks(self):
- ## #make a chunk
- ## start = chunk(0,0,0,0)
- ## start.makeChunk()
- ## start.done = True
- ## self.currentChunk = start
- ## chunks2.append(start)
- ## #make chunks around it - east
- ## c = chunk(self.currentChunk.x+chunksize,self.currentChunk.y,self.currentChunk.offsetx+chunksize-1,self.currentChunk.offsety)
- ## c.makeChunk()
- ## self.currentChunk.east = True
- ## self.currentChunk.East = c
- ## c.done = True
- ## c.West = self.currentChunk
- ## chunks2.append(c)
- ## # - west
- ## c = chunk(self.currentChunk.x-chunksize,self.currentChunk.y,self.currentChunk.offsetx-chunksize+1,self.currentChunk.offsety)
- ## c.makeChunk()
- ## self.currentChunk.west = True
- ## self.currentChunk.West = c
- ## c.done = True
- ## c.East = self.currentChunk
- ## chunks2.append(c)
- ## # - north
- ## c = chunk(self.currentChunk.x,self.currentChunk.y+chunksize,self.currentChunk.offsetx,self.currentChunk.offsety+chunksize-1)
- ## c.makeChunk()
- ## self.currentChunk.north = True
- ## self.currentChunk.North = c
- ## c.done = True
- ## c.South = self.currentChunk
- ## chunks2.append(c)
- ## # - south
- ## c = chunk(self.currentChunk.x,self.currentChunk.y-chunksize,self.currentChunk.offsetx,self.currentChunk.offsety-chunksize+1)
- ## c.makeChunk()
- ## self.currentChunk.south = True
- ## self.currentChunk.South = c
- ## c.done = True
- ## c.North = self.currentChunk
- ## chunks2.append(c)
- def makeChunksAroundX(self,X,Y):
- #initial chunk
- ## start = chunk(0,0,0,0)
- ## self.currentChunk = start
- ## self.chunks2.append(start)
- offsetx =X -(chunksize*3)
- offsety =Y -(chunksize*3)
- for y in xrange(7):
- for x in xrange(7):
- if [offsetx,offsety] not in self.coords:
- c = chunk(offsetx,offsety)
- self.chunksToMake.append(c)
- self.chunks2.append(c)
- offsetx += chunksize
- if offsetx == 0 and offsety == 0:
- self.currentChunk = c
- self.coords.append([c.x,c.y])
- else:
- pass
- offsety += chunksize
- offsetx =X -(chunksize*3)
- taskMgr.add(self.extendChunkGrid,'update-chunks')
- taskMgr.add(self.checkForChunks, 'Check chunks to be loaded', taskChain = 'custom task chain') #Task in separate thread
- def extendChunkGrid(self,task):
- if self.man.getX() > self.positionX+(chunksize*4): #East
- self.positionX+=chunksize*7
- self.makeChunksAroundX(self.positionX,self.positionY)
- elif self.man.getX() < self.positionX-(chunksize*3): #West
- self.positionX-=chunksize*7
- self.makeChunksAroundX(self.positionX,self.positionY)
- if self.man.getY() > self.positionY+(chunksize*4): #North
- self.positionY+=chunksize*7
- self.makeChunksAroundX(self.positionX,self.positionY)
- elif self.man.getY() < self.positionY-(chunksize*3): #South
- self.positionY-=chunksize*7
- self.makeChunksAroundX(self.positionX,self.positionY)
- return task.cont
- def checkForChunks(self,task): #Check chunksToMake list and make the chunks 1 per frame so program doesn't lagspike
- if len(self.chunksToMake) != 0: #This function is cause of frame rate problems according to pstats :/
- self.chunksToMake[0].makeChunk()
- self.chunksToMake.remove(self.chunksToMake[0])
- return task.cont
- def makeTrees(self):
- self.trees = []
- self.tree = loader.loadModel("trees/treeHighA")
- self.tree.setScale(0.2)
- self.trees.append(self.tree)
- self.tree1 = loader.loadModel("trees/treeHighB")
- self.tree1.setScale(0.2)
- self.trees.append(self.tree1)
- self.tree2 = loader.loadModel("trees/treeHighC")
- self.tree2.setScale(0.2)
- self.trees.append(self.tree2)
- self.tree3 = loader.loadModel("trees/treeLowA")
- self.tree3.setScale(0.2)
- self.trees.append(self.tree3)
- self.tree4 = loader.loadModel("trees/treeLowB")
- self.tree4.setScale(0.2)
- self.trees.append(self.tree4)
- self.tree5 = loader.loadModel("trees/treeLowC")
- self.tree5.setScale(0.2)
- self.trees.append(self.tree5)
- def initCollision(self):
- #initialize traverser
- base.cTrav = CollisionTraverser()
- base.cTrav.setRespectPrevTransform(True)
- # base.cTrav.showCollisions(render)
- #initialize pusher
- self.pusher = CollisionHandlerPusher()
- # collision bits
- self.groundCollBit = BitMask32.bit(0)
- self.collBitOff = BitMask32.allOff()
- def initPlayer(self):
- #load man
- self.man = render.attachNewNode('man') # keep this node scaled to identity
- self.man.setPos(chunksize/2,chunksize/2,25)
- # should be avatar model
- # model = loader.loadModel('teapot')
- # model.reparentTo(self.man)
- # model.setScale(.05)
- # camera
- base.camera.reparentTo(self.man)
- base.camera.setPos(0,0,8.7)#8.7 #2.7 #1.7
- base.camLens.setNearFar(1.0,450) #originally at .1,1000
- base.disableMouse()
- props = WindowProperties()
- props.setCursorHidden(True)
- base.win.requestProperties(props)
- #create a collsion solid around the man
- manC = self.man.attachCollisionSphere('manSphere', 0,0,1, .4, self.groundCollBit,self.collBitOff)
- self.pusher.addCollider(manC,self.man)
- base.cTrav.addCollider(manC,self.pusher)
- speed = 20
- Forward = Vec3(0,speed*2,0)
- Back = Vec3(0,-speed,0)
- Left = Vec3(-speed,0,0)
- Right = Vec3(speed,0,0)
- Stop = Vec3(0)
- self.walk = Stop
- self.strafe = Stop
- self.jump = 0
- taskMgr.add(self.move, 'move-task')
- self.jumping = LerpFunc( Functor(self.__setattr__,"jump"),
- duration=1.5, fromData=.25, toData=0)
- self.accept( "escape",sys.exit )
- self.accept( "space" , self.startJump)
- self.accept( "s" , self.__setattr__,["walk",Back] )
- self.accept( "w" , self.__setattr__,["walk",Forward])
- self.accept( "s-up" , self.__setattr__,["walk",Stop] )
- self.accept( "w-up" , self.__setattr__,["walk",Stop] )
- self.accept( "a" , self.__setattr__,["strafe",Left])
- self.accept( "d" , self.__setattr__,["strafe",Right] )
- self.accept( "a-up" , self.__setattr__,["strafe",Stop] )
- self.accept( "d-up" , self.__setattr__,["strafe",Stop] )
- self.manGroundColNp = self.man.attachCollisionRay( 'manRay',
- 0,0,.6, 0,0,-1,
- self.groundCollBit,self.collBitOff)
- self.manGroundHandler = CollisionHandlerGravity()
- self.manGroundHandler.addCollider(self.manGroundColNp,self.man)
- base.cTrav.addCollider(self.manGroundColNp, self.manGroundHandler)
- def startJump(self):
- if self.manGroundHandler.isOnGround():
- self.jumping.start()
- def move(self,task):
- dt=globalClock.getDt()
- # mouse
- md = base.win.getPointer(0)
- x = md.getX()
- y = md.getY()
- if base.win.movePointer(0, self.winXhalf, self.winYhalf):
- self.man.setH(self.man, (x - self.winXhalf)*-0.1)
- base.camera.setP( clampScalar(-90,90, base.camera.getP() - (y - self.winYhalf)*0.1) )
- # move where the keys set it
- moveVec=(self.walk+self.strafe)*dt # horisontal
- moveVec.setZ( self.jump ) # vertical
- self.man.setFluidPos(self.man,moveVec)
- # jump damping
- if self.jump>0:
- self.jump = clampScalar( 0,1, self.jump*.9)
- skybox.setPos(base.camera,0,0,0)
- ## water.setPos(base.camera,-50,-50,10)
- return task.cont
- def moveGuy(self,task):
- global xpos
- self.m.setX(xpos)
- xpos+=0.5
- return task.cont
- def initWally(self):
- self.wally = loader.loadModel("wally")
- self.wally.reparentTo(render)
- self.wally.setPos(0,0,4)
- def initShadows(self):
- # Add a light to the scene.
- self.lightpivot = render.attachNewNode("lightpivot")
- self.lightpivot.setPos(0,0,25)
- self.plight = PointLight('plight')
- self.plight.setColor(Vec4(1, 1, 1, 1))
- self.plight.setAttenuation(Vec3(0.001,0.001,0))#0.7,0.05,0))
- self.plnp = self.lightpivot.attachNewNode(self.plight)
- self.plnp.setPos(45, 45, 400)
- # Add an ambient light
- self.alight = AmbientLight('alight')
- self.alight.setColor(Vec4(0.2, 0.2, 0.2, 1))
- self.alnp = render.attachNewNode(self.alight)
- # create a sphere to denote the light
- sphere = loader.loadModel("sphere")
- sphere.setScale(40)
- self.shaderenable = 1
- def initWater(self):
- cm = CardMaker("water")
- cm.setFrame(-1, 1, -1, 1)
- self.water = render.attachNewNode(cm.generate())
- self.water.setScale(4096)
- self.water.lookAt(0, 0, -1)
- self.water.setZ(15)#62.365)
- self.water.setShaderOff(1)
- self.water.setLightOff(1)
- self.water.setAlphaScale(0.6)#0.5)
- self.water.setTransparency(TransparencyAttrib.MAlpha)
- wbuffer = base.win.makeTextureBuffer("water", 512, 512)
- wbuffer.setClearColorActive(True)
- wbuffer.setClearColor(base.win.getClearColor())
- self.wcamera = base.makeCamera(wbuffer)
- self.wcamera.reparentTo(render)
- self.wcamera.node().setLens(base.camLens)
- self.wcamera.node().setCameraMask(BitMask32.bit(1))
- self.water.hide(BitMask32.bit(1))
- ## fir.hide(BitMask32.bit(1))
- wtexture = wbuffer.getTexture()
- wtexture.setWrapU(Texture.WMClamp)
- wtexture.setWrapV(Texture.WMClamp)
- wtexture.setMinfilter(Texture.FTLinearMipmapLinear)
- self.wplane = Plane(Vec3(0, 0, 1), Point3(0, 0, self.water.getZ()))
- self.wplanenp = render.attachNewNode(PlaneNode("water", self.wplane))
- tmpnp = NodePath("StateInitializer")
- tmpnp.setClipPlane(self.wplanenp)
- tmpnp.setAttrib(CullFaceAttrib.makeReverse())
- self.wcamera.node().setInitialState(tmpnp.getState())
- self.water.projectTexture(TextureStage("reflection"), wtexture, self.wcamera)
- ## base.bufferViewer.toggleEnable()
- taskMgr.add(self.update_camera, 'update-water', sort=45)
- def update_camera(self, task):
- mat = base.cam.getMat(self.wplanenp)
- mat *= self.wplane.getReflectionMat()
- self.wcamera.setMat(mat)
- return task.cont
- # Add a task to keep updating the terrain
- def updateTask(task):
- global lastPos
- pos = base.cam.getPos()
- distSq = (pos - lastPos).lengthSquared()
- for i in chunks:
- i.getRoot().setCollideMask(BitMask32.bit(0))
- if distSq > updateDistanceSquared:
- lastPos = pos
- for i in chunks:
- i.update()
- return task.cont
- taskMgr.add(updateTask, "update")
- FPS()
- render.setShaderAuto()
- run()
Advertisement
Add Comment
Please, Sign In to add comment