示例#1
0
class Water(object):
    def __init__(self, parent):
        self.parent = parent
        self.baseNode = self.parent.attachNewNode(self.__class__.__name__)

        x1 = -200
        y1 = -200
        x2 = 200
        y2 = 200
        z = 0.0

        #waterNP = NodePath("Water Node Parent")
        #waterNP.reparentTo(parent)

        #sn = self.drawSquare(-100, -100, 0, 100, 100, 0);
        #sn.reparentTo(self.baseNode)
        water = Square(self.baseNode, Point3(x1, y1, 0.2), Point3(x2, y2, 0.2),
                       Vec4(0.0, 0.0, 0.5, 0.5))
        wNp = water.draw()
        t1 = loader.loadTexture('assets/textures/wave.png')
        t1.setWrapU(Texture.WMRepeat)
        t1.setWrapV(Texture.WMRepeat)
        wNp.setTexture(t1)

        # Water Shader from
        # http://www.panda3d.org/forums/viewtopic.php?p=70853&sid=53d92b5ae1683bd9458f21d6026ad36e
        # anim: vx, vy, scale, skip
        # distort: offset, strength, refraction factor (0 = perfect mirror,
        #   1 = total refraction), refractivity
        anim = (.022, -.012, 2.5, 0)
        distort = (.1, 2, .5, .45)

        self.buffer = base.win.makeTextureBuffer('waterBuffer', 512, 512)
        self.watercamNP = base.makeCamera(self.buffer)

        # Create water surface using a card
        # The surface will be centered and
        maker = CardMaker('water')  # Water surface
        maker.setFrame(x1, x2, y1, y2)
        self.waterNP = self.baseNode.attachNewNode(maker.generate())
        self.waterNP.setPosHpr((0, 0, z), (0, -90, 0))
        self.waterNP.setTransparency(TransparencyAttrib.MAlpha)
        self.waterNP.setTwoSided(True)

        # Attach the water shader to the water shader surface
        waterShader = Shader.load("shaders/water.sha")
        self.waterNP.setShader(waterShader)
        self.waterNP.setShaderInput('wateranim', anim)
        self.waterNP.setShaderInput('waterdistort', distort)
        self.waterNP.setShaderInput('time', 0)

        self.waterPlane = Plane((0, 0, z + 1), (0, 0, z))  # Reflection plane
        PlaneNode('waterPlane').setPlane(self.waterPlane)

        self.buffer.setClearColor((0, 0, 0.5, 1))  # buffer

        self.watercamNP.reparentTo(self.baseNode)  # reflection camera
        cam = self.watercamNP.node()
        cam.getLens().setFov(base.camLens.getFov())
        cam.getLens().setNearFar(1, 5000)
        cam.setInitialState(RenderState.make(CullFaceAttrib.makeReverse()))
        cam.setTagStateKey('Clipped')
        cam.setTagState(
            'True',
            RenderState.make(ShaderAttrib.make().setShader(
                loader.loadShader('shaders/splut3Clipped.sha'))))

        tex0 = self.buffer.getTexture()  # reflection texture, created in
        # realtime by the 'water camera'
        tex0.setWrapU(Texture.WMClamp)
        tex0.setWrapV(Texture.WMClamp)
        self.waterNP.setTexture(TextureStage('reflection'), tex0)
        self.waterNP.setTexture(
            TextureStage('distortion'),
            loader.loadTexture(
                'assets/textures/water.png'))  # distortion texture

        self.task = taskMgr.add(self.update, 'waterUpdate', sort=50)

    def remove(self):
        self.waterNP.removeNode()
        taskMgr.remove(self.task)

    def destroy(self):
        base.graphicsEngine.removeWindow(WaterNode.buffer)
        base.win.removeDisplayRegion(
            WaterNode.watercamNP.node().getDisplayRegion(0))
        WaterNode.watercamNP.removeNode()

    def update(self, task):
        self.waterNP.setShaderInput('time', task.time)  # time for distortions
        self.watercamNP.setMat(  # update the matrix of the reflection camera
            base.camera.getMat() * self.waterPlane.getReflectionMat())
        return task.cont
示例#2
0
class WaterNode():
	def __init__(self, world, x1, y1, x2, y2, z):
		self.world = world
		logging.info(('setting up water plane at z=' + str(z)))
		
		# Water surface
		maker = CardMaker('water')
		maker.setFrame(x1, x2, y1, y2)
		
		self.waterNP = render.attachNewNode(maker.generate())
		self.waterNP.setHpr(0, -90, 0)
		self.waterNP.setPos(0, 0, z)
		self.waterNP.setTransparency(TransparencyAttrib.MAlpha)
		self.waterNP.setShader(loader.loadShader('shaders/water.sha'))
		self.waterNP.setShaderInput('wateranim', Vec4(0.03, -0.015, 64.0, 0)) # vx, vy, scale, skip
		# offset, strength, refraction factor (0=perfect mirror, 1=total refraction), refractivity
		self.waterNP.setShaderInput('waterdistort', Vec4(0.4, 4.0, 0.25, 0.45))
		self.waterNP.setShaderInput('time', 0)
		
		# Reflection plane	
		self.waterPlane = Plane(Vec3(0, 0, z + 1), Point3(0, 0, z))
		planeNode = PlaneNode('waterPlane')
		planeNode.setPlane(self.waterPlane)
		
		# Buffer and reflection camera
		buffer = base.win.makeTextureBuffer('waterBuffer', 512, 512)
		buffer.setClearColor(Vec4(0, 0, 0, 1))
		
		cfa = CullFaceAttrib.makeReverse()
		rs = RenderState.make(cfa)
		
		self.watercamNP = base.makeCamera(buffer)
		self.watercamNP.reparentTo(render)
		
		#sa = ShaderAttrib.make()
		#sa = sa.setShader(loader.loadShader('shaders/splut3Clipped.sha') )
		
		cam = self.watercamNP.node()
		cam.getLens().setFov(base.camLens.getFov())
		cam.getLens().setNear(1)
		cam.getLens().setFar(5000)
		cam.setInitialState(rs)
		cam.setTagStateKey('Clipped')
		#cam.setTagState('True', RenderState.make(sa))
		
		# ---- water textures -----------------------------------------------
		
		#reflection texture, created in realtime by the 'water camera'
		tex0 = buffer.getTexture()
		tex0.setWrapU(Texture.WMClamp)
		tex0.setWrapV(Texture.WMClamp)
		ts0 = TextureStage('reflection')
		self.waterNP.setTexture(ts0, tex0)
		
		# distortion texture
		tex1 = loader.loadTexture('textures/water.png')
		ts1 = TextureStage('distortion')
		self.waterNP.setTexture(ts1, tex1)
		
		# ---- Fog --- broken
		min = Point3(x1, y1, -999.0)
		max = Point3(x2, y2, z)
		boundry = BoundingBox(min, max
		self.waterFog = Fog('waterFog')
		self.waterFog.setBounds(boundry)
		colour = (0.2, 0.5, 0.8)
		self.waterFog.setColor(*colour)
		self.waterFog.setExpDensity(0.05)
		render.attachNewNode(self.waterFog)
		#render.setFog(world.waterFog)
		taskMgr.add(self.update, "waterTask")
		
	def update(self, task):
		# update matrix of the reflection camera
		mc = base.camera.getMat()
		mf = self.waterPlane.getReflectionMat()
		self.watercamNP.setMat(mc * mf)
		self.waterNP.setShaderInput('time', task.time)
		self.waterNP.setX(self.world.ralph.getX())
		self.waterNP.setY(self.world.ralph.getY())
		return task.cont
示例#3
0
文件: water.py 项目: figo-sh/naith
class Water:
    """Represents a water surface"""

    def __init__(self, manager, xml):
        self.surface = getWaterSurface(manager)
        self.surface.reparentTo(render)
        self.surface.hide(BitMask32.bit(1))  # Invisible to reflection camera (speedup)
        self.surface.hide(BitMask32.bit(2))  # Invisible to volumetric lighting camera (speedup)
        self.surface.hide(BitMask32.bit(3))  # Invisible to shadow cameras (speedup)
        self.surface.setShader(
            loader.loadShader(manager.get("paths").getConfig().find("shaders").get("path") + "/water.cg")
        )
        self.surface.setShaderInput("time", 0.0, 0.0, 0.0, 0.0)
        ntex = loader.loadTexture(manager.get("paths").getConfig().find("textures").get("path") + "/water-normal.png")
        ntex.setMinfilter(Texture.FTLinearMipmapLinear)
        self.surface.setShaderInput("normal", ntex)
        self.surface.setShaderInput("camera", base.cam)
        self.surface.setTransparency(TransparencyAttrib.MDual, 10)
        self.surface.setTwoSided(True)

        self.surface.setShaderInput("waveInfo", Vec4(0.4, 0.4, 0.4, 0))
        self.surface.setShaderInput("param2", Vec4(-0.015, 0.005, 0.05, 0.05))
        self.surface.setShaderInput("param3", Vec4(0.7, 0.3, 0, 0))
        self.surface.setShaderInput("param4", Vec4(2.0, 0.5, 0.5, 0.0))
        # self.surface.setShaderInput('speed', Vec4(-.8, -.4, -.9, .3))
        self.surface.setShaderInput("speed", Vec4(0.2, -1.2, -0.2, -0.7))
        self.surface.setShaderInput("deepcolor", Vec4(0.0, 0.3, 0.5, 1.0))
        self.surface.setShaderInput("shallowcolor", Vec4(0.0, 1.0, 1.0, 1.0))
        self.surface.setShaderInput("reflectioncolor", Vec4(0.95, 1.0, 1.0, 1.0))
        self.surface.hide()

        self.wbuffer = base.win.makeTextureBuffer("water", 512, 512)
        self.wbuffer.setClearColorActive(True)
        self.wbuffer.setClearColor(base.win.getClearColor())
        self.wcamera = base.makeCamera(self.wbuffer)
        if manager.get("sky") != None and manager.get("sky").model != None:
            self.sky = manager.get("sky").model.copyTo(self.wcamera)
            self.sky.setTwoSided(True)
            self.sky.setSz(self.sky, -1)
            self.sky.setClipPlaneOff(1)
            self.sky.show()
            self.sky.hide(BitMask32.bit(0))  # Hide for normal camera
            self.sky.hide(BitMask32.bit(2))  # Hide for volumetric lighting camera
            self.sky.hide(BitMask32.bit(3))  # Hide for shadow camera(s), if any
        else:
            self.sky = None
        self.wcamera.reparentTo(render)
        self.wcamera.node().setLens(base.camLens)
        self.wcamera.node().setCameraMask(BitMask32.bit(1))
        self.surface.hide(BitMask32.bit(1))
        wtexture = self.wbuffer.getTexture()
        wtexture.setWrapU(Texture.WMClamp)
        wtexture.setWrapV(Texture.WMClamp)
        wtexture.setMinfilter(Texture.FTLinearMipmapLinear)
        self.surface.setShaderInput("reflection", wtexture)
        self.wplane = Plane(Vec3(0, 0, 1), Point3(0, 0, 0))
        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.fog = Fog('UnderwaterFog')
        # self.fog.setColor(0.0,0.3,0.5)
        self.fogEnabled = False

    def start(self):
        self.updateTask = taskMgr.add(self.update, "water-update")
        self.surface.show()

    def stop(self):
        self.surface.hide()
        taskMgr.remove(self.updateTask)

    def update(self, task):
        if base.cam.getX(render) < 0.0 and not self.fogEnabled:
            self.fogEnabled = True
        elif base.cam.getX(render) > 0.0 and self.fogEnabled:
            self.fogEnabled = False
        self.surface.setX(render, base.cam.getX(render))
        self.surface.setY(render, base.cam.getY(render))
        self.wcamera.setMat(base.cam.getMat(render) * self.wplane.getReflectionMat())
        self.surface.setShaderInput("time", task.time, 0.0, 0, 0)
        return task.cont
示例#4
0
class WaterNode():
    def __init__(self, world, x1, y1, x2, y2, z):
        self.world = world
        logging.info(('setting up water plane at z=' + str(z)))

        # Water surface
        maker = CardMaker('water')
        maker.setFrame(x1, x2, y1, y2)

        self.waterNP = render.attachNewNode(maker.generate())
        self.waterNP.setHpr(0, -90, 0)
        self.waterNP.setPos(0, 0, z)
        self.waterNP.setTransparency(TransparencyAttrib.MAlpha)
        self.waterNP.setShader(loader.loadShader('shaders/water.sha'))
        self.waterNP.setShaderInput('wateranim',
                                    Vec4(0.03, -0.015, 64.0,
                                         0))  # vx, vy, scale, skip
        # offset, strength, refraction factor (0=perfect mirror, 1=total refraction), refractivity
        self.waterNP.setShaderInput('waterdistort', Vec4(0.4, 4.0, 0.25, 0.45))
        self.waterNP.setShaderInput('time', 0)

        # Reflection plane
        self.waterPlane = Plane(Vec3(0, 0, z + 1), Point3(0, 0, z))
        planeNode = PlaneNode('waterPlane')
        planeNode.setPlane(self.waterPlane)

        # Buffer and reflection camera
        buffer = base.win.makeTextureBuffer('waterBuffer', 512, 512)
        buffer.setClearColor(Vec4(0, 0, 0, 1))

        cfa = CullFaceAttrib.makeReverse()
        rs = RenderState.make(cfa)

        self.watercamNP = base.makeCamera(buffer)
        self.watercamNP.reparentTo(render)

        #sa = ShaderAttrib.make()
        #sa = sa.setShader(loader.loadShader('shaders/splut3Clipped.sha') )

        cam = self.watercamNP.node()
        cam.getLens().setFov(base.camLens.getFov())
        cam.getLens().setNear(1)
        cam.getLens().setFar(5000)
        cam.setInitialState(rs)
        cam.setTagStateKey('Clipped')
        #cam.setTagState('True', RenderState.make(sa))

        # ---- water textures ---------------------------------------------

        # reflection texture, created in realtime by the 'water camera'
        tex0 = buffer.getTexture()
        tex0.setWrapU(Texture.WMClamp)
        tex0.setWrapV(Texture.WMClamp)
        ts0 = TextureStage('reflection')
        self.waterNP.setTexture(ts0, tex0)

        # distortion texture
        tex1 = loader.loadTexture('textures/water.png')
        ts1 = TextureStage('distortion')
        self.waterNP.setTexture(ts1, tex1)

        # ---- Fog --- broken
        min = Point3(x1, y1, -999.0)
        max = Point3(x2, y2, z)
        boundry = BoundingBox(min, max)
        self.waterFog = Fog('waterFog')
        self.waterFog.setBounds(boundry)
        colour = (0.2, 0.5, 0.8)
        self.waterFog.setColor(*colour)
        self.waterFog.setExpDensity(0.05)
        render.attachNewNode(self.waterFog)
        #render.setFog(world.waterFog)
        taskMgr.add(self.update, "waterTask")

    def update(self, task):
        # update matrix of the reflection camera
        mc = base.camera.getMat()
        mf = self.waterPlane.getReflectionMat()
        self.watercamNP.setMat(mc * mf)
        self.waterNP.setShaderInput('time', task.time)
        self.waterNP.setX(self.world.ralph.getX())
        self.waterNP.setY(self.world.ralph.getY())
        return task.cont
示例#5
0
class Water:
    """Represents a water surface"""
    def __init__(self, manager, xml):
        self.surface = getWaterSurface(manager)
        self.surface.reparentTo(render)
        self.surface.hide(
            BitMask32.bit(1))  # Invisible to reflection camera (speedup)
        self.surface.hide(BitMask32.bit(
            2))  # Invisible to volumetric lighting camera (speedup)
        self.surface.hide(
            BitMask32.bit(3))  # Invisible to shadow cameras (speedup)
        self.surface.setShader(
            loader.loadShader(
                manager.get('paths').getConfig().find('shaders').get('path') +
                '/water.cg'))
        self.surface.setShaderInput('time', 0.0, 0.0, 0.0, 0.0)
        ntex = loader.loadTexture(
            manager.get('paths').getConfig().find('textures').get('path') +
            '/water-normal.png')
        ntex.setMinfilter(Texture.FTLinearMipmapLinear)
        self.surface.setShaderInput('normal', ntex)
        self.surface.setShaderInput('camera', base.cam)
        self.surface.setTransparency(TransparencyAttrib.MDual, 10)
        self.surface.setTwoSided(True)

        self.surface.setShaderInput('waveInfo', Vec4(0.4, 0.4, 0.4, 0))
        self.surface.setShaderInput('param2', Vec4(-0.015, 0.005, 0.05, 0.05))
        self.surface.setShaderInput('param3', Vec4(0.7, 0.3, 0, 0))
        self.surface.setShaderInput('param4', Vec4(2.0, 0.5, 0.5, 0.0))
        #self.surface.setShaderInput('speed', Vec4(-.8, -.4, -.9, .3))
        self.surface.setShaderInput('speed', Vec4(0.2, -1.2, -0.2, -0.7))
        self.surface.setShaderInput('deepcolor', Vec4(0.0, 0.3, 0.5, 1.0))
        self.surface.setShaderInput('shallowcolor', Vec4(0.0, 1.0, 1.0, 1.0))
        self.surface.setShaderInput('reflectioncolor',
                                    Vec4(0.95, 1.0, 1.0, 1.0))
        self.surface.hide()

        self.wbuffer = base.win.makeTextureBuffer('water', 512, 512)
        self.wbuffer.setClearColorActive(True)
        self.wbuffer.setClearColor(base.win.getClearColor())
        self.wcamera = base.makeCamera(self.wbuffer)
        if manager.get('sky') != None and manager.get('sky').model != None:
            self.sky = manager.get('sky').model.copyTo(self.wcamera)
            self.sky.setTwoSided(True)
            self.sky.setSz(self.sky, -1)
            self.sky.setClipPlaneOff(1)
            self.sky.show()
            self.sky.hide(BitMask32.bit(0))  # Hide for normal camera
            self.sky.hide(
                BitMask32.bit(2))  # Hide for volumetric lighting camera
            self.sky.hide(
                BitMask32.bit(3))  # Hide for shadow camera(s), if any
        else:
            self.sky = None
        self.wcamera.reparentTo(render)
        self.wcamera.node().setLens(base.camLens)
        self.wcamera.node().setCameraMask(BitMask32.bit(1))
        self.surface.hide(BitMask32.bit(1))
        wtexture = self.wbuffer.getTexture()
        wtexture.setWrapU(Texture.WMClamp)
        wtexture.setWrapV(Texture.WMClamp)
        wtexture.setMinfilter(Texture.FTLinearMipmapLinear)
        self.surface.setShaderInput('reflection', wtexture)
        self.wplane = Plane(Vec3(0, 0, 1), Point3(0, 0, 0))
        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.fog = Fog('UnderwaterFog')
        #self.fog.setColor(0.0,0.3,0.5)
        self.fogEnabled = False

    def start(self):
        self.updateTask = taskMgr.add(self.update, 'water-update')
        self.surface.show()

    def stop(self):
        self.surface.hide()
        taskMgr.remove(self.updateTask)

    def update(self, task):
        if base.cam.getX(render) < 0.0 and not self.fogEnabled:
            self.fogEnabled = True
        elif base.cam.getX(render) > 0.0 and self.fogEnabled:
            self.fogEnabled = False
        self.surface.setX(render, base.cam.getX(render))
        self.surface.setY(render, base.cam.getY(render))
        self.wcamera.setMat(
            base.cam.getMat(render) * self.wplane.getReflectionMat())
        self.surface.setShaderInput('time', task.time, 0.0, 0, 0)
        return task.cont
class Game(DirectObject):

	def __init__(self):
		self.count_tree=0
		self.playVideo("intro.mp4")
		base.disableMouse()
		self.environ = loader.loadModel("models/scene.egg.pz")
		self.objects=loader.loadModel("models/objects.egg")
		self.plants=loader.loadModel("models/plants.egg")
		self.plants.reparentTo(render)
		self.objects.reparentTo(render)
		self.environ.reparentTo(render)
		self.makeSkyBox()
		
		
		self.makingActor()
		self.makeRacers()
		self.controlSkater()

		self.makeLights()
		self.makeWater()
		#self.controlRacer()
		self.addCollisions()
		self.addDuck()
		#self.makeRacingai()
		self.tree_array={}
		self.stone_array={}
		self.count_stone=0
		self.isSitted=False
		self.bench={}
		self.count_bench=0;
		self.AddBench(-40,-30)
		self.AddBench(-40,-40,180)
		self.AddBench(40,-30)
		self.AddBench(40,-40,180)
		self.AddBench(40,30)
		self.AddBench(40,40,180)
		self.AddBench(-40,30)
		self.AddBench(-40,40,180)



		for i in range(-70,70,6):
				#for j in range (-80,-70,3):
					self.AddTree(i,-65)
		for i in range(-70,70,6):
				#for j in range (-80,-70,3):
					self.AddTree(i+5,-70)			
		for i in range(-70,70,6):
				#for j in range (60,70,3):
					self.AddTree(i,65)
		for i in range(-70,70,6):
				#for j in range (60,70,3):
					self.AddTree(i+5,70)
		for j in range(-70,70,6):
				#for i in range (60,70,3):
					self.AddTree(65,j)
		for j in range(-70,70,6):
				#for i in range (60,70,3):
					self.AddTree(70,j+5)
		for j in range(-70,70,6):
				#for i in range (-80,-70,3):
					self.AddTree(-70,j)
		for j in range(-70,70,6):
				#for i in range (-80,-70,3):
					self.AddTree(-65,j+5)
		self.initailState()

		render.setShaderAuto()
	def playVideo(self,src):
		tex = MovieTexture("name")
		assert tex.read(src), "Failed to load video!"
		cm = CardMaker("My Fullscreen Card");
		cm.setFrameFullscreenQuad()
		cm.setUvRange(tex)
		card = NodePath(cm.generate())
		card.reparentTo(render2d)
		card.setTexture(tex)
		card.setTexScale(TextureStage.getDefault(), tex.getTexScale())
		sound=loader.loadSfx(src)
		tex.synchronizeTo(sound)
		tex.setLoop(False)
		sound.play()
		def  myTask(task):
			i=14
			if(src=='talk.mp4'):
				i=7

			if (int(tex.getTime()) >=i):
				#print "Stoping"
				card.remove()
				return task.done
			# if myMovieTexture.getTime() == myMovieLength:
			# 	print "movie puri"
			return task.cont
		taskMgr.add(myTask, "Task")
	
	def addDuck(self):
		
		self.duck={}
		
		self.count_duck=0

		self.interval1={};self.interval11={}
		self.interval2={};self.interval22={}
		for i in range(0,3,1):
			self.duck[self.count_duck]=loader.loadModel("models/duck.egg")
			self.duck[self.count_duck].setScale(random.uniform(5,7))
			self.duck[self.count_duck].setZ(0.65)
			self.duck[self.count_duck].setX(i*3-3)
			self.duck[self.count_duck].reparentTo(render)
			self.interval1[self.count_duck]= self.duck[self.count_duck].posInterval(10,Point3(i*3-3, random.uniform(0,12),0.65),startPos=Point3(i*3-3,-1*random.uniform(0,12),0.65))
			self.interval11[self.count_duck]=self.duck[self.count_duck].hprInterval(0.1, Vec3(0, 0, 0))
			self.interval2[self.count_duck]= self.duck[self.count_duck].posInterval(10,Point3(i*3-3,-1*random.uniform(0,12),0.65),startPos=Point3(i*3-3,random.uniform(0,12),0.65))
			self.interval22[self.count_duck]=self.duck[self.count_duck].hprInterval(0.1, Vec3(180, 0, 0))
			if(self.count_duck==0):
				self.mySequence=Sequence(self.interval1[self.count_duck], name="duck")
			self.mySequence.append(self.interval11[self.count_duck])
			self.mySequence.append(self.interval2[self.count_duck])
			self.mySequence.append(self.interval22[self.count_duck])

			self.count_duck=self.count_duck+1
		self.mySequence.loop()

		
	def makeSkyBox(self):
		#colour = (0.5,0.8,0.5)
		
		self.skybox=loader.loadModel("models/skybox.egg")
		self.skybox.reparentTo(render)
		self.skybox.setLightOff(1)
		self.skybox.setZ(-10)
		self.skybox.setScale(140,140,70)
	def makingActor(self):
		self.skater = Actor("models/scater.egg",{"fall":"models/scaterfall.egg","skate":"models/scater.egg",
			"walk":"models/scaterwalk.egg","run":"models/scaterrun.egg","sit":"models/scatersit.egg"})

		self.skater.setPos(-20.67,-41.99,0)
		self.skater.setScale(0.075,0.075,0.075)
		#self.skater.setH(180)
		self.skater.reparentTo(render)
	def makeWater(self):
		
		self.water = loader.loadModel("models/water.egg")
		self.water.setPos(0,0,1)
		self.water.setShader(loader.loadShader('shaders/water.sha'))
		self.water.setShaderInput('wateranim', Vec4(0.03, -0.015, 64.0, 0))
		self.water.setShaderInput('waterdistort', Vec4(0.4, 4.0, 0.25, 0.45))
		self.water.setShaderInput('time', 0)
		buffer = base.win.makeTextureBuffer('waterBuffer', 512, 512)
		#buffer.setClearColor(Vec4(0.3, 0.3, 1, 1))
		cfa = CullFaceAttrib.makeReverse()
		rs = RenderState.make(cfa)
		self.watercamNP = base.makeCamera(buffer)
		self.watercamNP.reparentTo(render)
		cam = self.watercamNP.node()
		cam.getLens().setFov(base.camLens.getFov())
		cam.getLens().setNear(1)
		cam.getLens().setFar(5000)
		cam.setInitialState(rs)
		self.waterPlane = Plane(Vec3(0, 0,  1), Point3(0, 0, 0))
		planeNode = PlaneNode('waterPlane')
		planeNode.setPlane(self.waterPlane)
		#cam.lookAt(0,0,-1)
		cam.setTagStateKey('Clipped')
		tex0 = buffer.getTexture()
		tex0.setWrapU(Texture.WMClamp)
		tex0.setWrapV(Texture.WMClamp)
		ts0 = TextureStage('reflection')

		self.water.setTexture(ts0, tex0)
		tex1 = loader.loadTexture('texture/water.png')
		ts1 = TextureStage('distortion')
		self.water.setTexture(ts1, tex1)
		self.keyMap={};
		self.keyMap["sit"]=0
		self.keyMap["call"]=0
		self.keyMap["left"]=0
		self.keyMap["forward"]=0
		self.keyMap["right"]=0
		taskMgr.add(self.waterUpdate, "waterTask")
		
		taskMgr.add(self.cameraControl,"cameraControl")



		self.water.reparentTo(render)
	def controlSkater(self):

		self.isMoving = False
		self.floater = NodePath(PandaNode("floater"))
		self.floater.reparentTo(render)

		self.accept("arrow_up", self.setKey,  ["forward",1])
		self.accept("arrow_up-repeat",self.setKey,  ["forward",1])
		self.accept("arrow_up-up",self.setKey, ["forward",0])
		self.accept("arrow_down", self.setKey,  ["forward",-1])
		self.accept("arrow_down-repeat",self.setKey,  ["forward",-1])
		self.accept("arrow_down-up",self.setKey, ["forward",0])
		self.accept("e",self.setKey,["sit",1])
		self.accept("q",self.setKey,["sit",0])
		self.accept("c",self.setKey,["call",1])
		#self.accept("c-up",self.setKey,["call",0])
		
		
		self.accept("arrow_left", self.setKey, ["left",1])
		self.accept("arrow_left-repeat",self.setKey, ["left",1])
		self.accept("arrow_left-up",self.setKey,["left",0])
		self.accept("arrow_right", self.setKey, ["right",1])
		self.accept("arrow_right-repeat",self.setKey, ["right",1])
		self.accept("arrow_right-up",self.setKey,["right",0])
		self.accept("escape", sys.exit)
	def makeRacers(self):
		#self.floater=0
		self.racers={}
		self.racersCount=0
		self.racers[self.racersCount] = Actor("models/scater.egg",{"skate":"models/scater.egg",
			"walk":"models/scaterwalk.egg","sit":"models/scatersit.egg","standup":"models/scaterstandup.egg"})
		self.racers[self.racersCount].setTexture(loader.loadTexture("texture/racer.tga"),1)
		self.racers[self.racersCount].setPos(-30,30,0)
		self.racers[self.racersCount].setScale(0.075,0.075,0.075)
		#self.racers[self.racersCount].setH(90)
		self.racers[self.racersCount].reparentTo(render)
		#self.racerMoveTo(self.racersCount,-60,0)
		#self.interval={}
		#self.controlRacer(self.racersCount)
		

		
		#self.racersCount=self.racersCount+1
	def racerMoveTo(self,no,x,y,direcation,anim='skate'):
		if(x-self.racers[no].getX()!=0):
			self.angle=atan(float(y-self.racers[no].getY())/float(x-self.racers[no].getX()))+90
			if(x<self.racers[no].getX()):
				self.angle=self.angle+90

		else:
			if(y>self.racers[no].getY()):
				self.angle=180
			if(y<self.racers[no].getY()):
				self.angle=0
		self.racers[no].setH(self.angle*180/pi)
		self.interval= self.racers[no].posInterval(direcation,Point3(x,y,0),startPos=self.racers[no].getPos())
		#self.pace = Sequence(interval,name="skatePose")
		self.interval.start()
		#s		while (interval.isPlaying())
		self.racers[no].loop(anim)

		#while (self.racers[no].getY()!=y and self.racers[no].getX()!=x):
		#	self.racers[no].setY(self.racers[no], -100 * globalClock.getDt())
	def controlRacer(self,no):
		self.pointNo=1;
		
		taskMgr.add(self.controlRacerTask, "race")
		self.racers[self.racersCount].setPos(-12.3668,42.92,0)
		self.racerMoveTo(no,-12.3668,42.92,3)
		#y={42.92,10.61,-4.685,-29.29,-41.99,-45,-40.87,-33.22,-17.81,-1.14,21.30,36.82,45.5}
		#for i in range(0,13,1):
			#self.racerMoveTo(self.racersCount,x[i],y[0],7)
			#time.sleep(7)
	def controlRacerTask(self,task):
		if(self.interval.isPlaying()==False and self.exploringMode==False):			
			self.racerMoveTo(self.racersCount,self.x[self.pointNo],self.y[self.pointNo],2)
			self.pointNo=(self.pointNo+1)%13

			#print self.pointNo
		#time.sleep(7)
			
		return task.cont
	def addCollisions(self):
		self.cTrav = CollisionTraverser()

		self.skaterGroundRay = CollisionRay()
		self.skaterGroundRay.setOrigin(0,0,1000)
		self.skaterGroundRay.setDirection(0,0,-1)
		self.skaterGroundCol = CollisionNode('skater')
		self.skaterGroundCol.addSolid(self.skaterGroundRay)
		self.skaterGroundCol.addSolid(CollisionTube(0,0,0,0,0,50,10))
		#self.skaterGroundCol.setFromCollideMask(BitMask32.bit(0))
		#self.skaterGroundCol.setIntoCollideMask(BitMask32.allOff())
		self.skaterGroundColNp = self.skater.attachNewNode(self.skaterGroundCol)
		self.skaterGroundHandler = CollisionHandlerQueue()
		self.cTrav.addCollider(self.skaterGroundColNp, self.skaterGroundHandler)
		#self.skaterGroundColNp.show()
		#self.cTrav.showCollisions(render)
		self.angle=180/pi;
		self.isFall=False
	def setKey(self,key,value):
		self.keyMap[key] = value
	def Move(self,task):
		

		if(self.isSitted ):
			if(self.keyMap['sit']==0):
				self.isSitted=False
				self.skater.pose("walk",12)

				self.isMoving = False
			return task.cont

		startpos = self.skater.getPos()
		if (self.keyMap["left"]!=0):
			self.skater.setH(self.skater.getH() + 100 * globalClock.getDt())
			
		if (self.keyMap["right"]!=0):
			self.skater.setH(self.skater.getH() - 100 * globalClock.getDt())
			
		#if (self.keyMap["right"]!=0):
		#    self.ralph.setH(self.ralph.getH() - 300 * globalClock.getDt())
		dx=100
		if(self.raceingStart==True):
			dx=150
		if (self.keyMap["forward"]!=0):
			if(self.exploringMode==False and self.raceingStart==True and self.startingTime>=3):
				self.skater.setY(self.skater, -dx * globalClock.getDt())
			else:
				if(self.exploringMode==True):
					self.skater.setY(self.skater, -dx * globalClock.getDt())

		
		
		if (self.keyMap["forward"]!=0) :
				
				if self.isMoving == False:
					if self.exploringMode==True:
						self.skater.loop("walk")
					else:
						self.skater.loop("skate")
					self.isMoving = True
		else:
			#if self.isSitted:
				#	@self.skater.loop("sit")
				if self.isMoving :
					#if(self.skater.getCurrentAnim()=='skate'):
						self.skater.stop()
						self.skater.pose("walk",12)
						self.isMoving = False
				
					
		"""
		if(self.isFall==True):
			if(self.skater.getCurrentAnim()=='fall'):
				if(self.skater.getCurrentFrame('fall')>=20):
					self.isFall=False
					self.skater.pose("skate",5)"""
					




		for i in range(0,self.count_bench,1):
				x=self.bench[i].getX()
				y=self.bench[i].getY()
				X=self.skater.getX();Y=self.skater.getY();

				dist=sqrt((x-X)*(x-X)+(y-Y)*(y-Y))
				if(dist<=5):
					if(self.isSitted==False and self.keyMap['sit']==1):
						self.skater.stop()
						self.skater.setPos(self.bench[i].getPos())
						#self.skater.setY(self.skater.getY()+3)
						self.skater.setH(self.bench[i].getH()+270)
						self.skater.play('sit')
						self.isSitted=True
		if(self.isMoving==True):	
			"""if(self.isFall==True):
				if(self.skater.getCurrentFrame('fall')==25):
					self.isFall=False"""


			self.cTrav.traverse(render)

			entries = []
			for i in range(self.skaterGroundHandler.getNumEntries()):
				entry = self.skaterGroundHandler.getEntry(i)
				entries.append(entry)
			entries.sort(lambda x,y: cmp(y.getSurfacePoint(render).getZ(),
									 x.getSurfacePoint(render).getZ()))
			print entries[0].getIntoNode().getName()
			if (len(entries)>0 and entries[0].getIntoNode().getName() == "character"):

				
					self.skater.setZ(entries[0].getSurfacePoint(render).getZ())
				

			else:
				self.skater.setPos(startpos)
			

					
				
				#self.skater.setPos(startpos)

				#self.skater.play('fall')
				#self.isFall=True

					
				
		
		return task.cont

	def AddBench(self,x,y,angle=0):
		self.bench[self.count_bench]=loader.loadModel("models/bench.egg")
		self.bench[self.count_bench].reparentTo(render)
		self.bench[self.count_bench].setH(angle)
		
		self.bench[self.count_bench].setPos(x,y,0)
		self.bench[self.count_bench].setTexture(loader.loadTexture("texture/wood.jpg"),1)
		self.count_bench=self.count_bench+1
		#self.bench[self.count_bench].setScale(0.03,0.03,0.03)
	def AddTree(self,x,y):
		self.tree_array[self.count_tree]=loader.loadModel("models/smalltree.egg")
		self.tree_array[self.count_tree].reparentTo(render)
		self.tree_array[self.count_tree].setPos(x,y,-2)
		self.tree_array[self.count_tree].setScale( random.uniform(0.01,0.02),random.uniform(0.01, 0.02),random.uniform(0.01, 0.02))
		self.tree_array[self.count_tree].setTexture(loader.loadTexture("models/smalltree.png"),1)
		self.tree_array[self.count_tree].setTransparency(TransparencyAttrib.MDual)
		self.tree_array[self.count_tree].setShaderAuto()
		self.tree_array[self.count_tree].setColor(VBase4(0.5+random.uniform(0,0.5),1,0.5+random.uniform(0,0.5),1))
		self.count_tree=self.count_tree+1
	def AddStone(self,x,y):
		self.stone_array[self.count_stone]=loader.loadModel("models/stone1.egg")
		self.stone_array[self.count_stone].reparentTo(render)
		self.stone_array[self.count_stone].setPos(x,y,0)
		self.stone_array[self.count_stone].setH(random.uniform(0,360))
		self.stone_array[self.count_stone].setTexture(loader.loadTexture("texture/Stone_2_DiffuseMap.jpg"),1)
		self.stone_array[self.count_stone].setScale(random.uniform(0.005,0.015))
		self.stone_array[self.count_stone].setShaderAuto()
		
		self.count_stone=self.count_stone+1
	def cameraControl(self,task):
		self.floater.setPos(self.skater.getPos())
		self.floater.setZ(self.skater.getZ() + 10.0)
		#camera.lookAt(self.floater)
		
		return task.cont
	def waterUpdate(self,task):
		self.slnp.lookAt(self.skater)
		#print self.skater.getX(),self.skater.getY()
		base.camera.setPos(self.skater.getPos())
		base.camera.setZ(self.skater.getZ() + 10.0)
		base.camera.setY(self.skater.getY() - 30*sin((-self.skater.getH()-90)*pi/180))
		base.camera.setX(self.skater.getX() + 30*cos((-self.skater.getH()-90)*pi/180))
		if base.mouseWatcherNode.hasMouse():
			x=base.mouseWatcherNode.getMouseX()
			y=base.mouseWatcherNode.getMouseY()
			base.camera.lookAt(self.skater.getX() ,self.skater.getY(),self.skater.getZ()+((y+1)/2)*10+0.5)  
		
		#base.camera.setH(self.skater.getH())
		#base.camera.lookAt(self.skater)
		mc = base.camera.getMat()
		mf = self.waterPlane.getReflectionMat()
		self.mc = base.camera.getMat()
		mf = self.waterPlane.getReflectionMat()
		self.watercamNP.setMat(mc * mf)
		self.water.setShaderInput('time', task.time)
		return task.cont
	def makeLights(self):
		slight = Spotlight('slight')
		slight.setColor(VBase4(1, 1, 1, 1))
		lens = PerspectiveLens()
		slight.setLens(lens)
		#slight.setFov(90)
		self.slnp = render.attachNewNode(slight)
		self.slnp.setPos(0, 0, 70)
		self.ambientLight=AmbientLight('AmbientLight')
		self.ambientLight.setColor(VBase4(0.3, 0.3, 0.3, 0.3))
		#
		self.ambientNP = render.attachNewNode(self.ambientLight)
		
		render.setLight(self.ambientNP)
		render.setLight(self.slnp)
		#render.setLight(self.ambientNP)
	def racingInteraction(self,task):
		if(self.raceingStart==True):
			self.startingTime=task.time
		x=self.racers[self.racersCount].getX()
		y=self.racers[self.racersCount].getY()
		X=self.skater.getX();Y=self.skater.getY();
		dist=sqrt((x-X)*(x-X)+(y-Y)*(y-Y))
		
		if(self.exploringMode==False):
			if((task.time-self.startedTime)<=3):
				self.txt.setText(str(int(task.time-self.startedTime)))
				#self.keyMap["forward"]=0
				self.isRacing=True
			else:
				self.txt.setText("")
		if(dist<=5):
			if(self.keyMap["call"]==1 and self.raceingStart==False):
				self.racers[self.racersCount].play('standup')
				
				self.raceingStart=True
			else:
				if(self.keyMap["call"]==1 and self.raceingStart==True):
				
					 

					if(self.racers[self.racersCount].getAnimControl('standup').isPlaying()==False and self.exploringMode==True):
						self.startedTime=task.time

						#self.playVideo('talk.mp4')
						
						#mytimer.setY(0)
						self.exploringMode=False
						self.skater.setH(0)
						self.skater.setPos(-15.3668,44,0)
						self.controlRacer(self.racersCount)
		#print self.skater.getX(),self.skater.getY()

		if(
			self.exploringMode==False and self.skater.getX()>=-5 and self.skater.getX()<=5 and self.skater.getY()>=42 and self.skater.getY()<=55):
			
			self.exploringMode=True
			self.raceingStart=False
			self.txt.setText("Finish \n You Win")
			self.finishTime=task.time;
			self.interval.finish()
			self.racers[self.racersCount].setPos(-40,-30,0)
			self.keyMap["call"]=0
			self.skater.setPos(-15.3668,44,0)
			self.racers[self.racersCount].setH(self.bench[0].getH()+270)
			self.racers[self.racersCount].pose('standup',0)
		if(self.exploringMode==False and  self.racers[self.racersCount].getX()>=-5 and self.racers[self.racersCount].getX()<=5 
			and self.racers[self.racersCount].getY()>=42 and self.racers[self.racersCount].getY()<=55):
			
			self.exploringMode=True
			self.raceingStart=False
			

			self.txt.setText("  Finish \n You Lose")
			self.finishTime=task.time;
			self.interval.finish()
			self.racers[self.racersCount].setPos(-40,-30,0)
			self.keyMap["call"]=0
			
			self.racers[self.racersCount].setH(self.bench[0].getH()+270)
			self.racers[self.racersCount].pose('standup',0)
		
		if(task.time-self.finishTime>=1 and self.finishTime!=0):
		
			self.txt.setText("")




		return task.cont
	def initailState(self):
		OnscreenText(text="[1] Press E for sit ", style=1, fg=(1,1,1,1),pos=(-1.75, 0.9), align=TextNode.ALeft, scale = 0.06)
		OnscreenText(text="[2] Press Q for stand", style=1, fg=(1,1,1,1),pos=(-1.75, 0.8), align=TextNode.ALeft, scale = 0.06)
		OnscreenText(text="[3] Press C for Challenge", style=1, fg=(1,1,1,1),pos=(-1.75, 0.7), align=TextNode.ALeft, scale = 0.06)
		self.finishX=0
		self.finishTime=0
		map_data = Image.open("texture/map.png") 
		pix_data = map_data.load()
		for i in range(0,80,3):
			for j in range (0,80,3):
				#print pix_data[i,j]
				if pix_data[i,j]==0:
					self.AddStone(i-40,j-40)
				else:
					if pix_data[i,j]==3:
						self.AddTree(i-40,j-40)




				
		self.txt=OnscreenText(text="", style=1, fg=(1,1,1,1),pos=(0, 0), align=TextNode.ALeft, scale = 0.06)
		self.raceingStart=False
		self.exploringMode=True

		self.racers[self.racersCount].setPos(-40,-30,0)
		self.racers[self.racersCount].setH(self.bench[0].getH()+270)
		self.racers[self.racersCount].pose('standup',0)
		self.x={};
		self.x[0]=-12.3668;self.x[1]=-19.79;self.x[2]=-21.90;self.x[3]=-26.53;self.x[4]=-20.67;
		self.x[5]=-3;self.x[6]=13.93;self.x[7]=22.65;self.x[8]=24.74;self.x[9]=24.38;
		self.x[10]=18.65;self.x[11]=12.10;self.x[12]=-1.92;

		#x={-12.3668,-19.79,-21.90,-26.53,-20.67,-3,13.93,22.65,24.74,24.38,18.65,12.10,-1.92}
		self.y={}
		self.y[0]=42.92;self.y[1]=10.61;self.y[2]=-4.685;self.y[3]=-29.29;self.y[4]=-41.99;
		self.y[5]=-45;self.y[6]=-40.87;self.y[7]=-33.22;self.y[8]=-17.81;self.y[9]=-1.14;
		self.y[10]=21.30;self.y[11]=36.82;self.y[12]=45.5
		taskMgr.add(self.Move,"moveTask")
		taskMgr.add(self.racingInteraction,"moveTask")
示例#7
0
class WaterNode(Att_base):
    def __init__(self, x1, y1, x2, y2, z):
        Att_base.__init__(self, False, "Water1")
        # Water surface
        maker = CardMaker( 'water' )
        maker.setFrame( x1, x2, y1, y2 )

        self.waterNP = render.attachNewNode(maker.generate())
        self.waterNP.setHpr(0,-90,0)
        self.waterNP.setPos(0,0,z)
        self.waterNP.setTransparency(TransparencyAttrib.MAlpha )
        self.waterNP.setShader(loader.loadShader( 'Shaders/water1.sha' ))

        # Reflection plane
        self.waterPlane = Plane( Vec3( 0, 0, z+1 ), Point3( 0, 0, z ) )

        planeNode = PlaneNode( 'waterPlane' )
        planeNode.setPlane( self.waterPlane )

        # Buffer and reflection camera
        self.buffer = base.win.makeTextureBuffer( 'waterBuffer', 512, 512 )
        self.buffer.setClearColor( Vec4( 0, 0, 0, 1 ) )

        cfa = CullFaceAttrib.makeReverse( )
        rs = RenderState.make(cfa)

        self.watercamNP = base.makeCamera( self.buffer )
        self.watercamNP.reparentTo(render)

        sa = ShaderAttrib.make()
        sa = sa.setShader(loader.loadShader('Shaders/splut3Clipped.sha') )

        self.cam = self.watercamNP.node()
        self.cam.getLens( ).setFov( base.camLens.getFov( ) )
        self.cam.getLens().setNear(1)
        self.cam.getLens().setFar(5000)
        self.cam.setInitialState( rs )
        self.cam.setTagStateKey('Clipped')
        self.cam.setTagState('True', RenderState.make(sa))


        # ---- water textures ---------------------------------------------

        # reflection texture, created in realtime by the 'water camera'
        tex0 = self.buffer.getTexture( )
        tex0.setWrapU(Texture.WMClamp)
        tex0.setWrapV(Texture.WMClamp)
        ts0 = TextureStage( 'reflection' )
        self.waterNP.setTexture( ts0, tex0 )

        # distortion texture
        tex1 = loader.loadTexture('Textures/water.png')
        ts1 = TextureStage('distortion')
        self.waterNP.setTexture(ts1, tex1)
    
    def removeNode(self):
        self.cam.setInitialState(RenderState.makeEmpty())
        self.watercamNP.removeNode()
        self.waterNP.clearShader()
        self.waterNP.removeNode()

    def Destroy(self):
        base.graphicsEngine.removeWindow(self.buffer)
        self.cam.setInitialState(RenderState.makeEmpty())
        self.watercamNP.removeNode()
        self.waterNP.clearShader()
        self.waterNP.removeNode()

    def setParams(self, offset, strength, refractionfactor, refractivity, vx, vy, scale):
        self.waterNP.setShaderInput('waterdistort', Vec4( offset, strength, refractionfactor, refractivity ))
        self.waterNP.setShaderInput('wateranim', Vec4( vx, vy, scale, 0 )) # vx, vy, scale, skip

    def changeCameraPos(self, pos, mc=None):
        if mc != None:
            # update matrix of the reflection camera
            mf = self.waterPlane.getReflectionMat( )
            self.watercamNP.setMat(mc * mf)

    def changeParams(self, object):
        self.setParams(self.att_offset.v,self.att_strength.v,self.att_refractionfactor.v,self.att_refractivity.v,
                self.att_vx.v, self.att_vy.v, self.att_scale.v)

    def setStandardControl(self):
        self.att_offset = Att_FloatRange(False, "Water:Offset", 0.0, 1.0, 0.4)
        self.att_strength = Att_FloatRange(False, "Water:Strength", 0.0, 100.0, 4)
        self.att_refractionfactor = Att_FloatRange(False, "Water:Refraction Factor", 0.0, 1.0, 0.2)
        self.att_refractivity = Att_FloatRange(False, "Water:Refractivity", 0.0, 1.0, 0.45)
        self.att_vx = Att_FloatRange(False, "Water:Speed X", -1.0, 1.0, 0.1)
        self.att_vy = Att_FloatRange(False, "Water:Speed Y", -1.0, 1.0, -0.1)
        self.att_scale = Att_FloatRange(False, "Water:Scale", 1.0, 200.0, 64.0,0)
        self.att_offset.setNotifier(self.changeParams)
        self.att_strength.setNotifier(self.changeParams)
        self.att_refractionfactor.setNotifier(self.changeParams)
        self.att_refractivity.setNotifier(self.changeParams)
        self.att_vx.setNotifier(self.changeParams)
        self.att_vy.setNotifier(self.changeParams)
        self.att_scale.setNotifier(self.changeParams)
        self.changeParams(None)


    def hide(self):
        self.waterNP.hide()

    def show(self):
        self.waterNP.show()

    def setFov(self, fov):
        # the reflection cam has to follow the base.cam fov
        self.cam.getLens().setFov(fov)

    def setCubeMap(self, cubemapfile):
        pass
示例#8
0
class Water(object):
    def __init__(self, parent):
        self.parent = parent
        self.baseNode = self.parent.attachNewNode(self.__class__.__name__)
        
        x1 = -200
        y1 = -200
        x2 =  200
        y2 =  200
        z  =  0.0
        
        #waterNP = NodePath("Water Node Parent")
        #waterNP.reparentTo(parent)
        
        #sn = self.drawSquare(-100, -100, 0, 100, 100, 0);
        #sn.reparentTo(self.baseNode)
        water = Square(self.baseNode,
                       Point3(x1, y1, 0.2),
                       Point3(x2, y2, 0.2),
                       Vec4(0.0,0.0,0.5,0.5))
        wNp = water.draw()
        t1 = loader.loadTexture( 'assets/textures/wave.png' )
        t1.setWrapU(Texture.WMRepeat)
        t1.setWrapV(Texture.WMRepeat)
        wNp.setTexture(t1)
        
        # Water Shader from
        # http://www.panda3d.org/forums/viewtopic.php?p=70853&sid=53d92b5ae1683bd9458f21d6026ad36e
        # anim: vx, vy, scale, skip
        # distort: offset, strength, refraction factor (0 = perfect mirror,
        #   1 = total refraction), refractivity
        anim = ( .022, -.012, 2.5, 0 )
        distort = ( .1, 2, .5, .45 )
        
        self.buffer = base.win.makeTextureBuffer( 'waterBuffer', 512, 512 )
        self.watercamNP = base.makeCamera( self.buffer )
        
        # Create water surface using a card
        # The surface will be centered and 
        maker = CardMaker( 'water' ) # Water surface
        maker.setFrame( x1, x2, y1, y2 )
        self.waterNP = self.baseNode.attachNewNode( maker.generate() )
        self.waterNP.setPosHpr( ( 0, 0, z ), ( 0, -90, 0 ) )
        self.waterNP.setTransparency( TransparencyAttrib.MAlpha )
        self.waterNP.setTwoSided(True)
        
        # Attach the water shader to the water shader surface
        waterShader = Shader.load("shaders/water.sha")
        self.waterNP.setShader(waterShader)
        self.waterNP.setShaderInput('wateranim',    anim )
        self.waterNP.setShaderInput('waterdistort', distort )
        self.waterNP.setShaderInput('time',         0 )
        
        self.waterPlane = Plane( ( 0, 0, z + 1 ), ( 0, 0, z ) ) # Reflection plane
        PlaneNode( 'waterPlane' ).setPlane( self.waterPlane )
        
        self.buffer.setClearColor( ( 0, 0, 0.5, 1 ) ) # buffer

        self.watercamNP.reparentTo( self.baseNode ) # reflection camera
        cam = self.watercamNP.node()
        cam.getLens().setFov( base.camLens.getFov() )
        cam.getLens().setNearFar( 1, 5000 )
        cam.setInitialState( RenderState.make( CullFaceAttrib.makeReverse() ) )
        cam.setTagStateKey( 'Clipped' )
        cam.setTagState('True', RenderState.make(
          ShaderAttrib.make().setShader(
            loader.loadShader( 'shaders/splut3Clipped.sha' ) ) ) )
        
        tex0 = self.buffer.getTexture() # reflection texture, created in
                                             # realtime by the 'water camera'
        tex0.setWrapU( Texture.WMClamp ); tex0.setWrapV( Texture.WMClamp )
        self.waterNP.setTexture( TextureStage( 'reflection' ), tex0 )
        self.waterNP.setTexture( TextureStage( 'distortion' ),
          loader.loadTexture( 'assets/textures/water.png' ) ) # distortion texture
        
        self.task = taskMgr.add( self.update, 'waterUpdate', sort = 50 )
        
    def remove( self ):
        self.waterNP.removeNode()
        taskMgr.remove( self.task )

    def destroy( self ):
        base.graphicsEngine.removeWindow( WaterNode.buffer )
        base.win.removeDisplayRegion(
          WaterNode.watercamNP.node().getDisplayRegion( 0 ) )
        WaterNode.watercamNP.removeNode()
  
    def update( self, task ):
        self.waterNP.setShaderInput( 'time', task.time ) # time for distortions
        self.watercamNP.setMat( # update the matrix of the reflection camera
          base.camera.getMat() * self.waterPlane.getReflectionMat() )
        return task.cont