basic.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #!/usr/bin/env python
  2. # Author: Kwasi Mensah ([email protected])
  3. # Date: 7/25/2005
  4. from direct.showbase.ShowBase import ShowBase
  5. from panda3d.core import Filename, Shader
  6. from panda3d.core import PandaNode, NodePath
  7. from panda3d.core import AmbientLight, DirectionalLight
  8. from panda3d.core import TextNode, LPoint3
  9. from direct.showbase.DirectObject import DirectObject
  10. from direct.filter.CommonFilters import CommonFilters
  11. from direct.gui.OnscreenText import OnscreenText
  12. from direct.actor.Actor import Actor
  13. import sys
  14. import os
  15. # Function to put instructions on the screen.
  16. def addInstructions(pos, msg):
  17. return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1),
  18. parent=base.a2dTopLeft, align=TextNode.ALeft,
  19. pos=(0.08, -pos - 0.04), scale=.05)
  20. # Function to put title on the screen.
  21. def addTitle(text):
  22. return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1),
  23. parent=base.a2dBottomRight, align=TextNode.ARight,
  24. pos=(-0.1, 0.09), scale=.08)
  25. class GlowDemo(ShowBase):
  26. def __init__(self):
  27. # Initialize the ShowBase class from which we inherit, which will
  28. # create a window and set up everything we need for rendering into it.
  29. ShowBase.__init__(self)
  30. base.disableMouse()
  31. base.setBackgroundColor(0, 0, 0)
  32. camera.setPos(0, -50, 0)
  33. # Check video card capabilities.
  34. if not base.win.getGsg().getSupportsBasicShaders():
  35. addTitle(
  36. "Glow Filter: Video driver reports that Cg shaders are not supported.")
  37. return
  38. # Use class 'CommonFilters' to enable a bloom filter.
  39. # The brightness of a pixel is measured using a weighted average
  40. # of R,G,B,A. We put all the weight on Alpha, meaning that for
  41. # us, the framebuffer's alpha channel alpha controls bloom.
  42. self.filters = CommonFilters(base.win, base.cam)
  43. filterok = self.filters.setBloom(
  44. blend=(0, 0, 0, 1), desat=-0.5, intensity=3.0, size="small")
  45. if (filterok == False):
  46. addTitle(
  47. "Toon Shader: Video card not powerful enough to do image postprocessing")
  48. return
  49. self.glowSize = 1
  50. # Post the instructions
  51. self.title = addTitle("Panda3D: Tutorial - Glow Filter")
  52. self.inst1 = addInstructions(0.06, "ESC: Quit")
  53. self.inst2 = addInstructions(0.12, "Space: Toggle Glow Filter Small/Med/Large/Off")
  54. self.inst3 = addInstructions(0.18, "Enter: Toggle Running/Spinning")
  55. self.inst4 = addInstructions(0.24, "V: View the render-to-texture results")
  56. # load our model
  57. self.tron = Actor()
  58. self.tron.loadModel("models/tron")
  59. self.tron.loadAnims({"running": "models/tron_anim"})
  60. self.tron.reparentTo(render)
  61. self.interval = self.tron.hprInterval(60, LPoint3(360, 0, 0))
  62. self.interval.loop()
  63. self.isRunning = False
  64. # put some lighting on the model
  65. dlight = DirectionalLight('dlight')
  66. alight = AmbientLight('alight')
  67. dlnp = render.attachNewNode(dlight)
  68. alnp = render.attachNewNode(alight)
  69. dlight.setColor((1.0, 0.7, 0.2, 1))
  70. alight.setColor((0.2, 0.2, 0.2, 1))
  71. dlnp.setHpr(0, -60, 0)
  72. render.setLight(dlnp)
  73. render.setLight(alnp)
  74. # Panda contains a built-in viewer that lets you view the results of
  75. # your render-to-texture operations. This code configures the viewer.
  76. self.accept("v", base.bufferViewer.toggleEnable)
  77. self.accept("V", base.bufferViewer.toggleEnable)
  78. base.bufferViewer.setPosition("llcorner")
  79. base.bufferViewer.setLayout("hline")
  80. # base.camLens.setFov(100)
  81. # event handling
  82. self.accept("space", self.toggleGlow)
  83. self.accept("enter", self.toggleDisplay)
  84. self.accept("escape", sys.exit, [0])
  85. def toggleGlow(self):
  86. self.glowSize = self.glowSize + 1
  87. if self.glowSize == 4:
  88. self.glowSize = 0
  89. self.filters.setBloom(blend=(0, 0, 0, 1), desat=-0.5, intensity=3.0,
  90. size=self.glowSize)
  91. def toggleDisplay(self):
  92. self.isRunning = not self.isRunning
  93. if not self.isRunning:
  94. camera.setPos(0, -50, 0)
  95. self.tron.stop("running")
  96. self.tron.pose("running", 0)
  97. self.interval.loop()
  98. else:
  99. camera.setPos(0, -170, 3)
  100. self.interval.finish()
  101. self.tron.setHpr(0, 0, 0)
  102. self.tron.loop("running")
  103. demo = GlowDemo()
  104. demo.run()