DirectGrid.py 4.7 KB

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