basic.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #!/usr/bin/env python
  2. from panda3d.core import *
  3. import sys
  4. import os
  5. from direct.showbase.ShowBase import ShowBase
  6. from direct.interval.IntervalGlobal import *
  7. from direct.gui.DirectGui import OnscreenText
  8. from direct.showbase.DirectObject import DirectObject
  9. from direct.actor import Actor
  10. from random import *
  11. # Function to put instructions on the screen.
  12. def addInstructions(pos, msg):
  13. return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=.05,
  14. shadow=(0, 0, 0, 1), parent=base.a2dTopLeft,
  15. pos=(0.08, -pos - 0.04), align=TextNode.ALeft)
  16. # Function to put title on the screen.
  17. def addTitle(text):
  18. return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), scale=.07,
  19. parent=base.a2dBottomRight, align=TextNode.ARight,
  20. pos=(-0.1, 0.09), shadow=(0, 0, 0, 1))
  21. class World(DirectObject):
  22. def __init__(self):
  23. # Preliminary capabilities check.
  24. if not base.win.getGsg().getSupportsBasicShaders():
  25. self.t = addTitle(
  26. "Shadow Demo: Video driver reports that shaders are not supported.")
  27. return
  28. if not base.win.getGsg().getSupportsDepthTexture():
  29. self.t = addTitle(
  30. "Shadow Demo: Video driver reports that depth textures are not supported.")
  31. return
  32. self.inst_p = addInstructions(0.06, 'P : stop/start the Panda Rotation')
  33. self.inst_w = addInstructions(0.12, 'W : stop/start the Walk Cycle')
  34. self.inst_t = addInstructions(0.18, 'T : stop/start the Teapot')
  35. self.inst_l = addInstructions(0.24, 'L : move light source far or close')
  36. self.inst_v = addInstructions(0.30, 'V: View the Depth-Texture results')
  37. self.inst_x = addInstructions(0.36, 'Left/Right Arrow : switch camera angles')
  38. base.setBackgroundColor(0, 0, 0.2, 1)
  39. base.camLens.setNearFar(1.0, 10000)
  40. base.camLens.setFov(75)
  41. base.disableMouse()
  42. # Load the scene.
  43. floorTex = loader.loadTexture('maps/envir-ground.jpg')
  44. cm = CardMaker('')
  45. cm.setFrame(-2, 2, -2, 2)
  46. floor = render.attachNewNode(PandaNode("floor"))
  47. for y in range(12):
  48. for x in range(12):
  49. nn = floor.attachNewNode(cm.generate())
  50. nn.setP(-90)
  51. nn.setPos((x - 6) * 4, (y - 6) * 4, 0)
  52. floor.setTexture(floorTex)
  53. floor.flattenStrong()
  54. self.pandaAxis = render.attachNewNode('panda axis')
  55. self.pandaModel = Actor.Actor('panda-model', {'walk': 'panda-walk4'})
  56. self.pandaModel.reparentTo(self.pandaAxis)
  57. self.pandaModel.setPos(9, 0, 0)
  58. self.pandaModel.setScale(0.01)
  59. self.pandaWalk = self.pandaModel.actorInterval('walk', playRate=1.8)
  60. self.pandaWalk.loop()
  61. self.pandaMovement = self.pandaAxis.hprInterval(
  62. 20.0, LPoint3(-360, 0, 0), startHpr=LPoint3(0, 0, 0))
  63. self.pandaMovement.loop()
  64. self.teapot = loader.loadModel('teapot')
  65. self.teapot.reparentTo(render)
  66. self.teapot.setPos(0, -20, 10)
  67. self.teapot.setShaderInput("texDisable", 1, 1, 1, 1)
  68. self.teapotMovement = self.teapot.hprInterval(50, LPoint3(0, 360, 360))
  69. self.teapotMovement.loop()
  70. self.accept('escape', sys.exit)
  71. self.accept("arrow_left", self.incrementCameraPosition, [-1])
  72. self.accept("arrow_right", self.incrementCameraPosition, [1])
  73. self.accept("p", self.toggleInterval, [self.pandaMovement])
  74. self.accept("P", self.toggleInterval, [self.pandaMovement])
  75. self.accept("t", self.toggleInterval, [self.teapotMovement])
  76. self.accept("T", self.toggleInterval, [self.teapotMovement])
  77. self.accept("w", self.toggleInterval, [self.pandaWalk])
  78. self.accept("W", self.toggleInterval, [self.pandaWalk])
  79. self.accept("v", base.bufferViewer.toggleEnable)
  80. self.accept("V", base.bufferViewer.toggleEnable)
  81. self.accept("l", self.incrementLightPosition, [1])
  82. self.accept("L", self.incrementLightPosition, [1])
  83. self.accept("o", base.oobe)
  84. self.light = render.attachNewNode(Spotlight("Spot"))
  85. self.light.node().setScene(render)
  86. self.light.node().setShadowCaster(True)
  87. self.light.node().showFrustum()
  88. self.light.node().getLens().setFov(40)
  89. self.light.node().getLens().setNearFar(10, 100)
  90. render.setLight(self.light)
  91. self.alight = render.attachNewNode(AmbientLight("Ambient"))
  92. self.alight.node().setColor(LVector4(0.2, 0.2, 0.2, 1))
  93. render.setLight(self.alight)
  94. # Important! Enable the shader generator.
  95. render.setShaderAuto()
  96. # default values
  97. self.cameraSelection = 0
  98. self.lightSelection = 0
  99. self.incrementCameraPosition(0)
  100. self.incrementLightPosition(0)
  101. def toggleInterval(self, ival):
  102. if ival.isPlaying():
  103. ival.pause()
  104. else:
  105. ival.resume()
  106. def incrementCameraPosition(self, n):
  107. self.cameraSelection = (self.cameraSelection + n) % 6
  108. if (self.cameraSelection == 0):
  109. base.cam.reparentTo(render)
  110. base.cam.setPos(30, -45, 26)
  111. base.cam.lookAt(0, 0, 0)
  112. self.light.node().hideFrustum()
  113. if (self.cameraSelection == 1):
  114. base.cam.reparentTo(self.pandaModel)
  115. base.cam.setPos(7, -3, 9)
  116. base.cam.lookAt(0, 0, 0)
  117. self.light.node().hideFrustum()
  118. if (self.cameraSelection == 2):
  119. base.cam.reparentTo(self.pandaModel)
  120. base.cam.setPos(-7, -3, 9)
  121. base.cam.lookAt(0, 0, 0)
  122. self.light.node().hideFrustum()
  123. if (self.cameraSelection == 3):
  124. base.cam.reparentTo(render)
  125. base.cam.setPos(7, -23, 12)
  126. base.cam.lookAt(self.teapot)
  127. self.light.node().hideFrustum()
  128. if (self.cameraSelection == 4):
  129. base.cam.reparentTo(render)
  130. base.cam.setPos(-7, -23, 12)
  131. base.cam.lookAt(self.teapot)
  132. self.light.node().hideFrustum()
  133. if (self.cameraSelection == 5):
  134. base.cam.reparentTo(render)
  135. base.cam.setPos(1000, 0, 195)
  136. base.cam.lookAt(0, 0, 0)
  137. self.light.node().showFrustum()
  138. def incrementLightPosition(self, n):
  139. self.lightSelection = (self.lightSelection + n) % 2
  140. if (self.lightSelection == 0):
  141. self.light.setPos(0, -40, 25)
  142. self.light.lookAt(0, -10, 0)
  143. self.light.node().getLens().setNearFar(10, 100)
  144. if (self.lightSelection == 1):
  145. self.light.setPos(0, -600, 200)
  146. self.light.lookAt(0, -10, 0)
  147. self.light.node().getLens().setNearFar(10, 1000)
  148. def shaderSupported(self):
  149. return base.win.getGsg().getSupportsBasicShaders() and \
  150. base.win.getGsg().getSupportsDepthTexture() and \
  151. base.win.getGsg().getSupportsShadowFilter()
  152. if __name__ == '__main__':
  153. base = ShowBase()
  154. w = World()
  155. base.run()