DistributedCamera.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. from pandac.PandaModules import *
  2. from direct.fsm.FSM import FSM
  3. from direct.interval.IntervalGlobal import *
  4. from direct.distributed.DistributedObject import DistributedObject
  5. class Fixture(NodePath, FSM):
  6. def __init__(self, id, parent, pos, hpr):
  7. NodePath.__init__(self, 'cam-%s' % id)
  8. FSM.__init__(self, '%s-fsm' % self.getName())
  9. self.id = id
  10. model = loader.loadModel('models/misc/camera', okMissing = True)
  11. model.reparentTo(self)
  12. self.reparentTo(parent)
  13. self.setPos(*pos)
  14. self.setHpr(*hpr)
  15. self.setLightOff(100)
  16. self.hide()
  17. self.scaleIval = None
  18. self.recordingInProgress = False
  19. pass
  20. def __str__(self):
  21. return 'Fixture(%d, \'%s\', %s, %s)' % (self.id, self.state, self.getPos(), self.getHpr())
  22. def pack(self):
  23. return 'Camera(%s, %s)' % (self.getPos(), self.getHpr())
  24. def setId(self, id):
  25. self.id = id
  26. pass
  27. def setRecordingInProgress(self, inProgress):
  28. self.recordingInProgress = inProgress
  29. if self.recordingInProgress and \
  30. base.config.GetInt('camera-id', -1) >= 0:
  31. self.hide()
  32. pass
  33. else:
  34. self.show()
  35. pass
  36. pass
  37. def show(self):
  38. if base.config.GetBool('aware-of-cameras',0) and \
  39. not self.recordingInProgress:
  40. NodePath.show(self)
  41. pass
  42. pass
  43. def getScaleIval(self):
  44. if not self.scaleIval:
  45. self.scaleIval = Sequence(LerpScaleInterval(self.getChild(0), 0.25, 2, startScale = 1, blendType = 'easeInOut'),
  46. LerpScaleInterval(self.getChild(0), 0.25, 1, startScale = 2, blendType = 'easeInOut'))
  47. pass
  48. return self.scaleIval
  49. def setState(self, state):
  50. self.request(state)
  51. pass
  52. def defaultFilter(self, request, args):
  53. if request == self.getCurrentOrNextState():
  54. return None
  55. return FSM.defaultFilter(self, request, args)
  56. def exitOff(self):
  57. self.accept('recordingInProgress', self.setRecordingInProgress)
  58. pass
  59. def enterOff(self):
  60. self.ignore('recordingInProgress')
  61. if self.scaleIval:
  62. self.scaleIval.finish()
  63. self.scaleIval = None
  64. pass
  65. self.hide()
  66. pass
  67. def enterStandby(self):
  68. self.show()
  69. if self.id == base.config.GetInt('camera-id', -1):
  70. self.setColorScale(3,0,0,1)
  71. else:
  72. self.setColorScale(3,3,0,1)
  73. pass
  74. pass
  75. def enterBlinking(self):
  76. self.show()
  77. self.setColorScale(0,3,0,1)
  78. self.getScaleIval().loop()
  79. pass
  80. def exitBlinking(self):
  81. if self.scaleIval:
  82. self.scaleIval.finish()
  83. pass
  84. pass
  85. def enterRecording(self):
  86. if base.config.GetInt('camera-id', -1) == self.id:
  87. self.demand('Using')
  88. pass
  89. else:
  90. self.show()
  91. self.setColorScale(3,0,0,1)
  92. self.getScaleIval().loop()
  93. pass
  94. pass
  95. def exitRecording(self):
  96. if self.scaleIval:
  97. self.scaleIval.finish()
  98. pass
  99. pass
  100. def enterUsing(self):
  101. localAvatar.b_setGameState('Camera')
  102. camera.setPosHpr(0,0,0,0,0,0)
  103. camera.reparentTo(self)
  104. self.hide()
  105. pass
  106. def exitUsing(self):
  107. localAvatar.b_setGameState('LandRoam')
  108. self.show()
  109. pass
  110. class DistributedCamera(DistributedObject):
  111. def __init__(self, cr):
  112. DistributedObject.__init__(self, cr)
  113. self.parent = None
  114. self.fixtures = {}
  115. self.cameraId = base.config.GetInt('camera-id',0)
  116. pass
  117. def __getitem__(self, index):
  118. return self.fixtures.get(index)
  119. def __str__(self):
  120. out = ''
  121. for fixture in self.fixtures.itervalues():
  122. out = '%s\n%s' % (out, fixture)
  123. return out[1:]
  124. def pack(self):
  125. out = ''
  126. for fixture in self.fixtures.itervalues():
  127. out = '%s\n%s' % (out, fixture.pack())
  128. return out[1:]
  129. def disable(self):
  130. self.ignore('escape')
  131. self.parent = None
  132. for fixture in self.fixtures.itervalues():
  133. fixture.cleanup()
  134. fixture.detachNode()
  135. pass
  136. self.fixtures = {}
  137. DistributedObject.disable(self)
  138. def getOV(self):
  139. return self.cr.doId2ownerView.get(self.getDoId())
  140. def setCamParent(self, doId):
  141. if doId != self.parent:
  142. if not doId:
  143. self.parent = render
  144. else:
  145. self.parent = self.cr.getDo(doId)
  146. pass
  147. for fix in self.fixtures.itervalues():
  148. fix.reparentTo(self.parent)
  149. pass
  150. pass
  151. pass
  152. def getCamParent(self):
  153. return self.parent
  154. def setFixtures(self, fixtures):
  155. for x in range(len(fixtures), len(self.fixtures)):
  156. fixture = self.fixtures.pop(x)
  157. fixture.cleanup()
  158. fixture.detachNode()
  159. pass
  160. recordingInProgress = False
  161. for x,fixture in enumerate(fixtures):
  162. fix = self.fixtures.get(x)
  163. if not fix:
  164. fix = Fixture(x, self.parent, fixture[:3], fixture[3:6])
  165. self.fixtures[x] = fix
  166. pass
  167. posHpr = fixture[:6]
  168. state = fixture[6]
  169. fix.setId(x)
  170. fix.setPosHpr(*posHpr)
  171. fix.setState(state)
  172. recordingInProgress = recordingInProgress or state == 'Recording'
  173. pass
  174. messenger.send('recordingInProgress', [recordingInProgress])
  175. def testFixture(self, index):
  176. fixture = self.fixtures.get(index)
  177. if fixture:
  178. fixture.request('Using')
  179. self.accept('escape', self.stopTesting, [index])
  180. pass
  181. pass
  182. def stopTesting(self, index):
  183. fixture = self.fixtures.get(index)
  184. if fixture:
  185. self.ignore('escape')
  186. fixture.request('Standby')
  187. localAvatar.b_setGameState('LandRoam')
  188. pass