TexViewer.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from panda3d.core import CardMaker, LineSegs, TextNode, Texture, TransparencyAttrib
  2. from direct.showbase.DirectObject import DirectObject
  3. from direct.showbase import ShowBaseGlobal
  4. class TexViewer(DirectObject):
  5. """ A simple class to pop up a card onscreen to see the contents
  6. of a texture. """
  7. def __init__(self, tex):
  8. self.tex = tex
  9. self.cleanedUp = False
  10. self.root = ShowBaseGlobal.aspect2d.attachNewNode('texViewer')
  11. self.root.setBin('gui-popup', 10000)
  12. cards = self.root.attachNewNode('cards')
  13. # We'll put the full-resolution texture on the left.
  14. cm = CardMaker('left')
  15. l, r, b, t = (-1.0, -0.1, 0.0, 0.9)
  16. cm.setFrame(l, r, b, t)
  17. left = cards.attachNewNode(cm.generate())
  18. left.setTexture(self.tex)
  19. left.setTransparency(TransparencyAttrib.MAlpha)
  20. ls = LineSegs('frame')
  21. ls.setColor(0, 0, 0, 1)
  22. ls.moveTo(l, 0, b)
  23. ls.drawTo(r, 0, b)
  24. ls.drawTo(r, 0, t)
  25. ls.drawTo(l, 0, t)
  26. ls.drawTo(l, 0, b)
  27. cards.attachNewNode(ls.create())
  28. # And the "simple", reduced-resolution version goes on the
  29. # right.
  30. if self.tex.hasSimpleRamImage():
  31. self.t2 = Texture('simple')
  32. self.t2.setup2dTexture(self.tex.getSimpleXSize(),
  33. self.tex.getSimpleYSize(),
  34. Texture.TUnsignedByte,
  35. Texture.FRgba8)
  36. self.t2.setRamImage(self.tex.getSimpleRamImage())
  37. self.t2.setMagfilter(Texture.FTNearest)
  38. cm = CardMaker('right')
  39. l, r, b, t = (0.1, 1, 0, 0.9)
  40. cm.setFrame(l, r, b, t)
  41. right = cards.attachNewNode(cm.generate())
  42. right.setTexture(self.t2)
  43. right.setTransparency(TransparencyAttrib.MAlpha)
  44. ls = LineSegs('frame')
  45. ls.setColor(0, 0, 0, 1)
  46. ls.moveTo(l, 0, b)
  47. ls.drawTo(r, 0, b)
  48. ls.drawTo(r, 0, t)
  49. ls.drawTo(l, 0, t)
  50. ls.drawTo(l, 0, b)
  51. cards.attachNewNode(ls.create())
  52. # Scale both sides by the aspect ratio.
  53. if self.tex.getXSize() > self.tex.getYSize():
  54. cards.setScale(1, 1, float(self.tex.getYSize()) / self.tex.getXSize())
  55. else:
  56. cards.setScale(float(self.tex.getXSize()) / self.tex.getYSize(), 1, 1)
  57. # Label the texture.
  58. tn = TextNode('label')
  59. tn.setShadow(0.1, 0.1)
  60. tn.setText(self.tex.getName())
  61. tn.setAlign(tn.ACenter)
  62. tnp = self.root.attachNewNode(tn)
  63. tnp.setScale(0.1)
  64. tnp.setPos(0, 0, -tn.getHeight() * 0.1)
  65. def cleanup(self):
  66. if not self.cleanedUp:
  67. self.root.removeNode()
  68. self.cleanedUp = True
  69. self.tex = None
  70. self.t2 = None