DirectGrid.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. from PandaObject import *
  2. from DirectUtil import *
  3. from DirectGeometry import *
  4. class DirectGrid(NodePath,PandaObject):
  5. def __init__(self):
  6. # Initialize superclass
  7. NodePath.__init__(self)
  8. self.assign(hidden.attachNewNode('DirectGrid'))
  9. # Don't wireframe or light
  10. useDirectRenderStyle(self)
  11. # Load up grid parts to initialize grid object
  12. # Polygon used to mark grid plane
  13. self.gridBack = loader.loadModel('models/misc/gridBack')
  14. self.gridBack.reparentTo(self)
  15. self.gridBack.setColor(0.5,0.5,0.5,0.5)
  16. # Grid Lines
  17. self.lines = self.attachNewNode('gridLines')
  18. self.minorLines = LineNodePath(self.lines)
  19. self.minorLines.lineNode.setName('minorLines')
  20. self.minorLines.setColor(VBase4(0.3,0.55,1,1))
  21. self.minorLines.setThickness(1)
  22. self.majorLines = LineNodePath(self.lines)
  23. self.majorLines.lineNode.setName('majorLines')
  24. self.majorLines.setColor(VBase4(0.3,0.55,1,1))
  25. self.majorLines.setThickness(5)
  26. self.centerLines = LineNodePath(self.lines)
  27. self.centerLines.lineNode.setName('centerLines')
  28. self.centerLines.setColor(VBase4(1,0,0,0))
  29. self.centerLines.setThickness(3)
  30. # Small marker to hilight snap-to-grid point
  31. self.snapMarker = loader.loadModel('models/misc/sphere')
  32. self.snapMarker.node().setName('gridSnapMarker')
  33. self.snapMarker.reparentTo(self)
  34. self.snapMarker.setColor(1,0,0,1)
  35. self.snapMarker.setScale(0.3)
  36. self.snapPos = Point3(0)
  37. # Initialize Grid characteristics
  38. self.fXyzSnap = 1
  39. self.fHprSnap = 1
  40. self.gridSize = 100.0
  41. self.gridSpacing = 5.0
  42. self.snapAngle = 15.0
  43. self.enable()
  44. def enable(self):
  45. self.reparentTo(direct.group)
  46. self.updateGrid()
  47. self.fEnabled = 1
  48. def disable(self):
  49. self.reparentTo(hidden)
  50. self.fEnabled = 0
  51. def toggleGrid(self):
  52. if self.fEnabled:
  53. self.disable()
  54. else:
  55. self.enable()
  56. def isEnabled(self):
  57. return self.fEnabled
  58. def updateGrid(self):
  59. # Update grid lines based upon current grid spacing and grid size
  60. # First reset existing grid lines
  61. self.minorLines.reset()
  62. self.majorLines.reset()
  63. self.centerLines.reset()
  64. # Now redraw lines
  65. numLines = math.ceil(self.gridSize/self.gridSpacing)
  66. scaledSize = numLines * self.gridSpacing
  67. center = self.centerLines
  68. minor = self.minorLines
  69. major = self.majorLines
  70. for i in range(-numLines,numLines + 1):
  71. if i == 0:
  72. center.moveTo(i * self.gridSpacing, -scaledSize, 0)
  73. center.drawTo(i * self.gridSpacing, scaledSize, 0)
  74. center.moveTo(-scaledSize, i * self.gridSpacing, 0)
  75. center.drawTo(scaledSize, i * self.gridSpacing, 0)
  76. else:
  77. if (i % 5) == 0:
  78. major.moveTo(i * self.gridSpacing, -scaledSize, 0)
  79. major.drawTo(i * self.gridSpacing, scaledSize, 0)
  80. major.moveTo(-scaledSize, i * self.gridSpacing, 0)
  81. major.drawTo(scaledSize, i * self.gridSpacing, 0)
  82. else:
  83. minor.moveTo(i * self.gridSpacing, -scaledSize, 0)
  84. minor.drawTo(i * self.gridSpacing, scaledSize, 0)
  85. minor.moveTo(-scaledSize, i * self.gridSpacing, 0)
  86. minor.drawTo(scaledSize, i * self.gridSpacing, 0)
  87. center.create()
  88. minor.create()
  89. major.create()
  90. self.gridBack.setScale(scaledSize)
  91. def setXyzSnap(self, fSnap):
  92. self.fXyzSnap = fSnap
  93. def getXyzSnap(self):
  94. return self.fXyzSnap
  95. def setHprSnap(self, fSnap):
  96. self.fHprSnap = fSnap
  97. def getHprSnap(self):
  98. return self.fHprSnap
  99. def computeSnapPoint(self, point):
  100. # Start of with current point
  101. self.snapPos.assign(point)
  102. # Snap if necessary
  103. if self.fXyzSnap:
  104. self.snapPos.set(
  105. ROUND_TO(self.snapPos[0], self.gridSpacing),
  106. ROUND_TO(self.snapPos[1], self.gridSpacing),
  107. ROUND_TO(self.snapPos[2], self.gridSpacing))
  108. # Move snap marker to this point
  109. self.snapMarker.setPos(self.snapPos)
  110. # Return the hit point
  111. return self.snapPos
  112. def computeSnapAngle(self, angle):
  113. return ROUND_TO(angle, self.snapAngle)
  114. def setSnapAngle(self, angle):
  115. self.snapAngle = angle
  116. def getSnapAngle(self):
  117. return self.snapAngle
  118. def setGridSpacing(self, spacing):
  119. self.gridSpacing = spacing
  120. self.updateGrid()
  121. def getGridSpacing(self):
  122. return self.gridSpacing
  123. def setGridSize(self, size):
  124. # Set size of grid back and redraw lines
  125. self.gridSize = size
  126. self.updateGrid()
  127. def getGridSize(self):
  128. return self.gridSize