DistributedNode.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. """DistributedNode module: contains the DistributedNode class"""
  2. from ShowBaseGlobal import *
  3. import NodePath
  4. import DistributedObject
  5. import Correction
  6. import Prediction
  7. import Task
  8. class DistributedNode(DistributedObject.DistributedObject, NodePath.NodePath):
  9. """Distributed Node class:"""
  10. def __init__(self, cr):
  11. try:
  12. self.DistributedNode_initialized
  13. except:
  14. self.DistributedNode_initialized = 1
  15. DistributedObject.DistributedObject.__init__(self, cr)
  16. self.DeadReckoningFlag = 0
  17. return None
  18. def disable(self):
  19. self.reparentTo(hidden)
  20. DistributedObject.DistributedObject.disable(self)
  21. def delete(self):
  22. self.removeNode()
  23. DistributedObject.DistributedObject.delete(self)
  24. def generate(self):
  25. # Turn on dead reckoning
  26. #print ("Turning on dead reckoning!!!")
  27. #self.deadReckoningOn()
  28. DistributedObject.DistributedObject.generate(self)
  29. def deadReckoningOn(self):
  30. # Be sure that it isn't already on
  31. self.deadReckoningOff()
  32. self.deadReckoningFlag = 1
  33. self.Predictor = NullPrediction(Point3(self.getX(), self.getY(),
  34. self.getZ()))
  35. self.Corrector = SplineCorrection(Point3(self.getX(), self.getY(),
  36. self.getZ()), Vec3(0))
  37. taskName = self.taskName("correctionPos")
  38. # remove any old tasks
  39. taskMgr.removeTasksNamed(taskName)
  40. # spawn new task
  41. task = Task.Task(self.correctPos)
  42. taskMgr.spawnTaskNamed(task, taskName)
  43. return self.deadReckoningFlag
  44. def deadReckoningOff(self):
  45. self.deadReckoningFlag = 0
  46. self.Predictor = None
  47. self.Corrector = None
  48. taskName = self.taskName("correctionPos")
  49. taskMgr.removeTasksNamed(taskName)
  50. return self.deadReckoningFlag
  51. ### setParent ###
  52. def b_setParent(self, parentString):
  53. self.setParent(parentString)
  54. self.d_setParent(parentString)
  55. return None
  56. def d_setParent(self, parentString):
  57. self.sendUpdate("setParent", [parentString])
  58. return None
  59. def setParent(self, parentString):
  60. print "setting parent of %s to %s" % (self.getName(), parentString)
  61. assert(self.cr.name2nodePath.has_key(parentString))
  62. parent = self.cr.name2nodePath[parentString]
  63. self.wrtReparentTo(parent)
  64. return None
  65. ###### set pos and hpr functions #######
  66. # setX provided by NodePath
  67. def d_setX(self, x):
  68. self.sendUpdate("setX", [x])
  69. # setY provided by NodePath
  70. def d_setY(self, y):
  71. self.sendUpdate("setY", [y])
  72. # setZ provided by NodePath
  73. def d_setZ(self, z):
  74. self.sendUpdate("setZ", [z])
  75. # setH provided by NodePath
  76. def d_setH(self, h):
  77. self.sendUpdate("setH", [h])
  78. # setP provided by NodePath
  79. def d_setP(self, p):
  80. self.sendUpdate("setP", [p])
  81. # setR provided by NodePath
  82. def d_setR(self, r):
  83. self.sendUpdate("setR", [r])
  84. def setXY(self, x, y):
  85. self.setX(x)
  86. self.setY(y)
  87. def d_setXY(self, x, y):
  88. self.sendUpdate("setXY", [x, y])
  89. # setPos provided by NodePath
  90. def d_setPos(self, x, y, z):
  91. self.sendUpdate("setPos", [x, y, z])
  92. # setHpr provided by NodePath
  93. def d_setHpr(self, h, p, r):
  94. self.sendUpdate("setHpr", [h, p, r])
  95. def setXYH(self, x, y, h):
  96. self.setX(x)
  97. self.setY(y)
  98. self.setH(h)
  99. def d_setXYH(self, x, y, h):
  100. self.sendUpdate("setXYH", [x, y, h])
  101. def setXYZH(self, x, y, z, h):
  102. self.setPos(x, y, z)
  103. self.setH(h)
  104. def d_setXYZH(self, x, y, z, h):
  105. self.sendUpdate("setXYZH", [x, y, z, h])
  106. # setPosHpr provided by NodePath
  107. def d_setPosHpr(self, x, y, z, h, p, r):
  108. self.sendUpdate("setPosHpr", [x, y, z, h, p, r])
  109. ###### Dead Reckoned set pos and hpr functions ######
  110. def setDRX(self, x):
  111. curPoint = self.Predictor.getPos()
  112. self.Predictor.newTelemetry(x, curPoint[1], curPoint[2])
  113. def d_setDRX(self, x):
  114. self.sendUpdate("setDRX", [x])
  115. def setDRY(self, y):
  116. curPoint = self.Predictor.getPos()
  117. self.Predictor.newTelemetry(curPoint[0], y, curPoint[2])
  118. def d_setDRY(self, y):
  119. self.sendUpdate("setDRY", [y])
  120. def setDRZ(self, z):
  121. curPoint = self.Predictor.getPos()
  122. self.Predictor.newTelemetry(curPoint[0], curPoint[1], z)
  123. def d_setDRZ(self, z):
  124. self.sendUpdate("setDRZ", [z])
  125. def setDRH(self, h):
  126. self.setH(h)
  127. def d_setDRH(self, h):
  128. self.sendUpdate("setDRH", [h])
  129. def setDRP(self, p):
  130. self.setP(p)
  131. def d_setDRP(self, p):
  132. self.sendUpdate("setDRP", [p])
  133. def setDRR(self, r):
  134. self.setR(r)
  135. def d_setDRR(self, r):
  136. self.sendUpdate("setDRR", [r])
  137. def setDRXY(self, x, y):
  138. curPoint = self.Predictor.getPos()
  139. self.Predictor.newTelemetry(Point3(x, y, curPoint[2]))
  140. def d_setDRXY(self, x, y):
  141. self.sendUpdate("setDRXY", [x, y])
  142. def setDRPos(self, x, y, z):
  143. self.Predictor.newTelemetry(Point3(x, y, z))
  144. def d_setDRPos(self, x, y, z):
  145. self.sendUpdate("setDRPos", [x, y, z])
  146. def setDRHpr(self, h, p, r):
  147. self.setHpr(h, p, r)
  148. def d_setDRHpr(self, h, p, r):
  149. self.sendUpdate("setDRHpr", [h, p, r])
  150. def setDRXYH(self, x, y, h):
  151. curPoint = self.Predictor.getPos()
  152. self.Predictor.newTelemetry(Point3(x, y, curPoint[2]))
  153. self.setH(h)
  154. def d_setDRXYH(self, x, y, h):
  155. self.sendUpdate("setDRXYH", [x, y, h])
  156. def setDRXYZH(self, x, y, z, h):
  157. self.Predictor.newTelemetry(Point3(x, y, z))
  158. self.setH(h)
  159. def d_setDRXYZH(self, x, y, z, h):
  160. self.sendUpdate("setDRXYZH", [x, y, z, h])
  161. def setDRPosHpr(self, x, y, z, h, p, r):
  162. self.Predictor.newTelemetry(Point3(x, y, z))
  163. NodePath.NodePath.setHpr(self, h, p, r)
  164. def d_setDRPosHpr(self, x, y, z, h, p, r):
  165. self.sendUpdate("setDRPosHpr", [x, y, z, h, p, r])
  166. def correctPos(self, task):
  167. self.Corrector.newTarget(self.Predictor.getPos(),
  168. self.Predictor.getVel())
  169. self.Corrector.step()
  170. NodePath.NodePath.setPos(self, self.Corrector.getPos())
  171. return Task.cont