Advertisement
DangerOnTheRanger

Tut-Shadow-Mapping-Advanced.py

Sep 21st, 2011
425
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.30 KB | None | 0 0
  1. from panda3d.core import *
  2. import sys,os
  3. loadPrcFileData("", "prefer-parasite-buffer #f")
  4. loadPrcFileData("", 'show-frame-rate-meter #t')
  5.  
  6. import direct.directbase.DirectStart
  7. from direct.interval.IntervalGlobal import *
  8. from direct.gui.DirectGui import OnscreenText
  9. from direct.showbase.DirectObject import DirectObject
  10. from direct.actor import Actor
  11. from random import *
  12.  
  13. # Function to put instructions on the screen.
  14. def addInstructions(pos, msg):
  15.     return OnscreenText(text=msg, style=1, fg=(1,1,1,1), mayChange=1,
  16.                         pos=(-1.3, pos), align=TextNode.ALeft, scale = .05, shadow=(0,0,0,1), shadowOffset=(0.1,0.1))
  17.  
  18. # Function to put title on the screen.
  19. def addTitle(text):
  20.     return OnscreenText(text=text, style=1, fg=(1,1,1,1),
  21.                         pos=(1.3,-0.95), align=TextNode.ARight, scale = .07)
  22.  
  23. class World(DirectObject):
  24.     def __init__(self):
  25.  
  26.         # Preliminary capabilities check.
  27.    
  28.         if (base.win.getGsg().getSupportsBasicShaders()==0):
  29.             self.t=addTitle("Shadow Demo: Video driver reports that shaders are not supported.")
  30.             return
  31.         if (base.win.getGsg().getSupportsDepthTexture()==0):
  32.             self.t=addTitle("Shadow Demo: Video driver reports that depth textures are not supported.")
  33.             return
  34.        
  35.         # creating the offscreen buffer.
  36.    
  37.         winprops = WindowProperties.size(512,512)
  38.         props = FrameBufferProperties()
  39.         props.setRgbColor(1)
  40.         props.setAlphaBits(1)
  41.         props.setDepthBits(1)
  42.         LBuffer = base.graphicsEngine.makeOutput(
  43.                  base.pipe, "offscreen buffer", -2,
  44.                  props, winprops,
  45.                  GraphicsPipe.BFRefuseWindow,
  46.                  base.win.getGsg(), base.win)
  47.    
  48.         if (LBuffer == None):
  49.            self.t=addTitle("Shadow Demo: Video driver cannot create an offscreen buffer.")
  50.            return
  51.  
  52.         # Adding a color texture is totally unnecessary, but it helps with debugging.
  53.         Lcolormap = Texture()
  54.         LBuffer.addRenderTexture(Lcolormap, GraphicsOutput.RTMBindOrCopy, GraphicsOutput.RTPColor)
  55.    
  56.         self.inst_p = addInstructions(0.95, 'P : stop/start the Panda Rotation')
  57.         self.inst_w = addInstructions(0.90, 'W : stop/start the Walk Cycle')
  58.         self.inst_t = addInstructions(0.85, 'T : stop/start the Teapot')
  59.         self.inst_l = addInstructions(0.80, 'L : move light source far or close')
  60.         self.inst_v = addInstructions(0.75, 'V: View the Depth-Texture results')
  61.         self.inst_x = addInstructions(0.70, 'Left/Right Arrow : switch camera angles')
  62.         self.inst_a = addInstructions(0.65, 'Something about A/Z and push bias')
  63.    
  64.         base.setBackgroundColor(0,0,0.2,1)
  65.    
  66.         base.camLens.setNearFar(1.0,10000)
  67.         base.camLens.setFov(75)
  68.         base.disableMouse()
  69.  
  70.         # Load the scene.
  71.    
  72.         floorTex=loader.loadTexture('maps/envir-ground.jpg')
  73.         cm=CardMaker('')
  74.         cm.setFrame(-2,2,-2,2)
  75.         floor = render.attachNewNode(PandaNode("floor"))
  76.         for y in range(12):
  77.             for x in range(12):
  78.                 nn = floor.attachNewNode(cm.generate())
  79.                 nn.setP(-90)
  80.                 nn.setPos((x-6)*4, (y-6)*4, 0)
  81.         floor.setTexture(floorTex)
  82.         floor.flattenStrong()
  83.    
  84.         self.pandaAxis=render.attachNewNode('panda axis')
  85.         self.pandaModel=Actor.Actor('panda-model',{'walk':'panda-walk4'})
  86.         self.pandaModel.reparentTo(self.pandaAxis)
  87.         self.pandaModel.setPos(9,0,0)
  88.         self.pandaModel.setShaderInput("scale",0.01,0.01,0.01,1.0)
  89.         self.pandaWalk = self.pandaModel.actorInterval('walk',playRate=1.8)
  90.         self.pandaWalk.loop()
  91.         self.pandaMovement = self.pandaAxis.hprInterval(20.0,Point3(-360,0,0),startHpr=Point3(0,0,0))
  92.         self.pandaMovement.loop()
  93.    
  94.         self.teapot=loader.loadModel('teapot')
  95.         self.teapot.reparentTo(render)
  96.         self.teapot.setPos(0,-20,10)
  97.         self.teapot.setShaderInput("texDisable",1,1,1,1)
  98.         self.teapotMovement = self.teapot.hprInterval(50,Point3(0,360,360))
  99.         self.teapotMovement.loop()
  100.    
  101.         self.accept('escape',sys.exit)
  102.    
  103.         self.accept("arrow_left", self.incrementCameraPosition, [-1])
  104.         self.accept("arrow_right", self.incrementCameraPosition, [1])
  105.         self.accept("p", self.toggleInterval, [self.pandaMovement])
  106.         self.accept("P", self.toggleInterval, [self.pandaMovement])
  107.         self.accept("t", self.toggleInterval, [self.teapotMovement])
  108.         self.accept("T", self.toggleInterval, [self.teapotMovement])
  109.         self.accept("w", self.toggleInterval, [self.pandaWalk])
  110.         self.accept("W", self.toggleInterval, [self.pandaWalk])
  111.         self.accept("v", base.bufferViewer.toggleEnable)
  112.         self.accept("V", base.bufferViewer.toggleEnable)
  113.         self.accept("l", self.incrementLightPosition, [1])
  114.         self.accept("L", self.incrementLightPosition, [1])
  115.         self.accept("o", base.oobe)
  116.         self.accept('a',self.adjustPushBias,[1.1])
  117.         self.accept('A',self.adjustPushBias,[1.1])
  118.         self.accept('z',self.adjustPushBias,[0.9])
  119.         self.accept('Z',self.adjustPushBias,[0.9])
  120.    
  121.         self.LCam=base.makeCamera(LBuffer)
  122.         self.LCam.reparentTo(render)
  123.         self.LCam.node().setScene(render)
  124.         self.LCam.node().getLens().setFov(40)
  125.         self.LCam.node().getLens().setNearFar(10,100)
  126.         self.LCam.node().getLens().setFilmSize(100,100)
  127.         self.LCam.setPos(-1, -1, 1)
  128.  
  129.         # default values
  130.         self.pushBias=0.50
  131.         self.ambient=0.20
  132.         self.cameraSelection = 0
  133.         self.lightSelection = 0
  134.  
  135.         mci = NodePath(PandaNode("Main Camera Initializer"))
  136.         if (base.win.getGsg().getSupportsShadowFilter()):
  137.             mci.setShader(Shader.load('shadow.sha'))
  138.         else:
  139.             mci.setShader(Shader.load('shadow-nosupport.sha'))
  140.         base.cam.node().setInitialState(mci.getState())
  141.    
  142.         # setting up shader
  143.         render.setShaderInput('light',self.LCam)
  144.         render.setShaderInput('Ldepthmap',Lcolormap)
  145.         render.setShaderInput('ambient',self.ambient,0,0,1.0)
  146.         render.setShaderInput('texDisable',0,0,0,0)
  147.         render.setShaderInput('scale',1,1,1,1)
  148.  
  149.         render.setShaderInput('push',0.20,0.20,0.20,0)
  150.    
  151.         # Put a shader on the Light camera.
  152.         lci = NodePath(PandaNode("Light Camera Initializer"))
  153.         lci.setShader(Shader.load('caster.sha'))
  154.         self.LCam.node().setInitialState(lci.getState())
  155.    
  156.         # Put a shader on the Main camera.
  157.         # Some video cards have special hardware for shadow maps.
  158.         # If the card has that, use it.  If not, use a different
  159.         # shader that does not require hardware support.
  160.    
  161.         self.incrementCameraPosition(0)
  162.         self.incrementLightPosition(0)
  163.         self.adjustPushBias(self.pushBias)
  164.    
  165. # end of __init__
  166.  
  167.     def toggleInterval(self, ival):
  168.         if (ival.isPlaying()):
  169.             ival.pause()
  170.         else:
  171.             ival.resume()
  172.  
  173.     def incrementCameraPosition(self,n):
  174.         self.cameraSelection = (self.cameraSelection + n) % 6
  175.         if (self.cameraSelection == 0):
  176.             base.cam.reparentTo(render)
  177.             base.cam.setPos(30,-45,26)
  178.             base.cam.lookAt(0,0,0)
  179.             self.LCam.node().hideFrustum()
  180.         if (self.cameraSelection == 1):
  181.             base.cam.reparentTo(self.pandaModel)
  182.             base.cam.setPos(7,-3,9)
  183.             base.cam.lookAt(0,0,0)
  184.             self.LCam.node().hideFrustum()
  185.         if (self.cameraSelection == 2):
  186.             base.cam.reparentTo(self.pandaModel)
  187.             base.cam.setPos(-7,-3,9)
  188.             base.cam.lookAt(0,0,0)
  189.             self.LCam.node().hideFrustum()
  190.         if (self.cameraSelection == 3):
  191.             base.cam.reparentTo(render)
  192.             base.cam.setPos(7,-23,12)
  193.             base.cam.lookAt(self.teapot)
  194.             self.LCam.node().hideFrustum()
  195.         if (self.cameraSelection == 4):
  196.             base.cam.reparentTo(render)
  197.             base.cam.setPos(-7,-23,12)
  198.             base.cam.lookAt(self.teapot)
  199.             self.LCam.node().hideFrustum()
  200.         if (self.cameraSelection == 5):
  201.             base.cam.reparentTo(render)
  202.             base.cam.setPos(1000,0,195)
  203.             base.cam.lookAt(0,0,0)
  204.             self.LCam.node().showFrustum()
  205.  
  206.     def incrementLightPosition(self,n):
  207.         self.lightSelection = (self.lightSelection + n) % 2
  208.         if (self.lightSelection == 0):
  209.             self.LCam.setPos(0,-40,25)
  210.             self.LCam.lookAt(0,-10,0)
  211.             self.LCam.node().getLens().setNearFar(10,100)
  212.         if (self.lightSelection == 1):
  213.             self.LCam.setPos(0,-600,200)
  214.             self.LCam.lookAt(0,-10,0)
  215.             self.LCam.node().getLens().setNearFar(10,1000)
  216.  
  217.     def shaderSupported(self):
  218.         return base.win.getGsg().getSupportsBasicShaders() and \
  219.                base.win.getGsg().getSupportsDepthTexture() and \
  220.                base.win.getGsg().getSupportsShadowFilter()
  221.  
  222.     def adjustPushBias(self,inc):
  223.         self.pushBias *= inc
  224.         self.inst_a.setText('A/Z: Increase/Decrease the Push-Bias [%F]' % self.pushBias)
  225.         render.setShaderInput('push',self.pushBias,self.pushBias,self.pushBias,0)
  226.  
  227.  
  228. World()
  229. run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement