|
|
@@ -0,0 +1,234 @@
|
|
|
+from pandac.PandaModules import *
|
|
|
+from direct.fsm.FSM import FSM
|
|
|
+from direct.interval.IntervalGlobal import *
|
|
|
+from direct.distributed.DistributedObject import DistributedObject
|
|
|
+
|
|
|
+class Fixture(NodePath, FSM):
|
|
|
+ def __init__(self, id, parent, pos, hpr):
|
|
|
+ NodePath.__init__(self, 'cam-%s' % id)
|
|
|
+ FSM.__init__(self, '%s-fsm' % self.getName())
|
|
|
+ self.id = id
|
|
|
+
|
|
|
+ model = loader.loadModel('models/misc/camera', okMissing = True)
|
|
|
+ model.reparentTo(self)
|
|
|
+
|
|
|
+ self.reparentTo(parent)
|
|
|
+ self.setPos(*pos)
|
|
|
+ self.setHpr(*hpr)
|
|
|
+ self.setLightOff(100)
|
|
|
+ self.hide()
|
|
|
+
|
|
|
+ self.scaleIval = None
|
|
|
+
|
|
|
+ self.recordingInProgress = False
|
|
|
+ pass
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ return 'Fixture(%d, \'%s\', %s, %s)' % (self.id, self.state, self.getPos(), self.getHpr())
|
|
|
+
|
|
|
+ def pack(self):
|
|
|
+ return 'Camera(%s, %s)' % (self.getPos(), self.getHpr())
|
|
|
+
|
|
|
+ def setId(self, id):
|
|
|
+ self.id = id
|
|
|
+ pass
|
|
|
+
|
|
|
+ def setRecordingInProgress(self, inProgress):
|
|
|
+ self.recordingInProgress = inProgress
|
|
|
+ if self.recordingInProgress and \
|
|
|
+ base.config.GetInt('camera-id', -1) >= 0:
|
|
|
+ self.hide()
|
|
|
+ pass
|
|
|
+ else:
|
|
|
+ self.show()
|
|
|
+ pass
|
|
|
+ pass
|
|
|
+
|
|
|
+ def show(self):
|
|
|
+ if base.config.GetBool('aware-of-cameras',0) and \
|
|
|
+ not self.recordingInProgress:
|
|
|
+ NodePath.show(self)
|
|
|
+ pass
|
|
|
+ pass
|
|
|
+
|
|
|
+ def getScaleIval(self):
|
|
|
+ if not self.scaleIval:
|
|
|
+ self.scaleIval = Sequence(LerpScaleInterval(self.getChild(0), 0.25, 2, startScale = 1, blendType = 'easeInOut'),
|
|
|
+ LerpScaleInterval(self.getChild(0), 0.25, 1, startScale = 2, blendType = 'easeInOut'))
|
|
|
+ pass
|
|
|
+ return self.scaleIval
|
|
|
+
|
|
|
+ def setState(self, state):
|
|
|
+ self.request(state)
|
|
|
+ pass
|
|
|
+
|
|
|
+ def defaultFilter(self, request, args):
|
|
|
+ if request == self.getCurrentOrNextState():
|
|
|
+ return None
|
|
|
+ return FSM.defaultFilter(self, request, args)
|
|
|
+
|
|
|
+ def exitOff(self):
|
|
|
+ self.accept('recordingInProgress', self.setRecordingInProgress)
|
|
|
+ pass
|
|
|
+
|
|
|
+ def enterOff(self):
|
|
|
+ self.ignore('recordingInProgress')
|
|
|
+
|
|
|
+ if self.scaleIval:
|
|
|
+ self.scaleIval.finish()
|
|
|
+ self.scaleIval = None
|
|
|
+ pass
|
|
|
+
|
|
|
+ self.hide()
|
|
|
+ pass
|
|
|
+
|
|
|
+ def enterStandby(self):
|
|
|
+ self.show()
|
|
|
+ if self.id == base.config.GetInt('camera-id', -1):
|
|
|
+ self.setColorScale(3,0,0,1)
|
|
|
+ else:
|
|
|
+ self.setColorScale(3,3,0,1)
|
|
|
+ pass
|
|
|
+ pass
|
|
|
+
|
|
|
+ def enterBlinking(self):
|
|
|
+ self.show()
|
|
|
+ self.setColorScale(0,3,0,1)
|
|
|
+ self.getScaleIval().loop()
|
|
|
+ pass
|
|
|
+
|
|
|
+ def exitBlinking(self):
|
|
|
+ if self.scaleIval:
|
|
|
+ self.scaleIval.finish()
|
|
|
+ pass
|
|
|
+ pass
|
|
|
+
|
|
|
+ def enterRecording(self):
|
|
|
+ if base.config.GetInt('camera-id', -1) == self.id:
|
|
|
+ self.demand('Using')
|
|
|
+ pass
|
|
|
+ else:
|
|
|
+ self.show()
|
|
|
+ self.setColorScale(3,0,0,1)
|
|
|
+ self.getScaleIval().loop()
|
|
|
+ pass
|
|
|
+ pass
|
|
|
+
|
|
|
+ def exitRecording(self):
|
|
|
+ if self.scaleIval:
|
|
|
+ self.scaleIval.finish()
|
|
|
+ pass
|
|
|
+ pass
|
|
|
+
|
|
|
+ def enterUsing(self):
|
|
|
+ localAvatar.b_setGameState('Camera')
|
|
|
+ camera.setPosHpr(0,0,0,0,0,0)
|
|
|
+ camera.reparentTo(self)
|
|
|
+ self.hide()
|
|
|
+ pass
|
|
|
+
|
|
|
+ def exitUsing(self):
|
|
|
+ localAvatar.b_setGameState('LandRoam')
|
|
|
+ self.show()
|
|
|
+ pass
|
|
|
+
|
|
|
+
|
|
|
+class DistributedCamera(DistributedObject):
|
|
|
+ def __init__(self, cr):
|
|
|
+ DistributedObject.__init__(self, cr)
|
|
|
+ self.parent = None
|
|
|
+ self.fixtures = {}
|
|
|
+ self.cameraId = base.config.GetInt('camera-id',0)
|
|
|
+
|
|
|
+ pass
|
|
|
+
|
|
|
+ def __getitem__(self, index):
|
|
|
+ return self.fixtures.get(index)
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ out = ''
|
|
|
+ for fixture in self.fixtures.itervalues():
|
|
|
+ out = '%s\n%s' % (out, fixture)
|
|
|
+ return out[1:]
|
|
|
+
|
|
|
+ def pack(self):
|
|
|
+ out = ''
|
|
|
+ for fixture in self.fixtures.itervalues():
|
|
|
+ out = '%s\n%s' % (out, fixture.pack())
|
|
|
+ return out[1:]
|
|
|
+
|
|
|
+ def disable(self):
|
|
|
+ self.ignore('escape')
|
|
|
+
|
|
|
+ self.parent = None
|
|
|
+
|
|
|
+ for fixture in self.fixtures.itervalues():
|
|
|
+ fixture.cleanup()
|
|
|
+ fixture.detachNode()
|
|
|
+ pass
|
|
|
+ self.fixtures = {}
|
|
|
+
|
|
|
+ DistributedObject.disable(self)
|
|
|
+
|
|
|
+ def getOV(self):
|
|
|
+ return self.cr.doId2ownerView.get(self.getDoId())
|
|
|
+
|
|
|
+ def setCamParent(self, doId):
|
|
|
+ if doId != self.parent:
|
|
|
+ if not doId:
|
|
|
+ self.parent = render
|
|
|
+ else:
|
|
|
+ self.parent = self.cr.getDo(doId)
|
|
|
+ pass
|
|
|
+
|
|
|
+ for fix in self.fixtures.itervalues():
|
|
|
+ fix.reparentTo(self.parent)
|
|
|
+ pass
|
|
|
+ pass
|
|
|
+ pass
|
|
|
+
|
|
|
+ def getCamParent(self):
|
|
|
+ return self.parent
|
|
|
+
|
|
|
+ def setFixtures(self, fixtures):
|
|
|
+
|
|
|
+ for x in range(len(fixtures), len(self.fixtures)):
|
|
|
+ fixture = self.fixtures.pop(x)
|
|
|
+ fixture.cleanup()
|
|
|
+ fixture.detachNode()
|
|
|
+ pass
|
|
|
+
|
|
|
+ recordingInProgress = False
|
|
|
+ for x,fixture in enumerate(fixtures):
|
|
|
+ fix = self.fixtures.get(x)
|
|
|
+ if not fix:
|
|
|
+ fix = Fixture(x, self.parent, fixture[:3], fixture[3:6])
|
|
|
+ self.fixtures[x] = fix
|
|
|
+ pass
|
|
|
+
|
|
|
+ posHpr = fixture[:6]
|
|
|
+ state = fixture[6]
|
|
|
+ fix.setId(x)
|
|
|
+ fix.setPosHpr(*posHpr)
|
|
|
+ fix.setState(state)
|
|
|
+ recordingInProgress = recordingInProgress or state == 'Recording'
|
|
|
+ pass
|
|
|
+
|
|
|
+ messenger.send('recordingInProgress', [recordingInProgress])
|
|
|
+
|
|
|
+ def testFixture(self, index):
|
|
|
+ fixture = self.fixtures.get(index)
|
|
|
+ if fixture:
|
|
|
+ fixture.request('Using')
|
|
|
+ self.accept('escape', self.stopTesting, [index])
|
|
|
+ pass
|
|
|
+ pass
|
|
|
+
|
|
|
+ def stopTesting(self, index):
|
|
|
+ fixture = self.fixtures.get(index)
|
|
|
+ if fixture:
|
|
|
+ self.ignore('escape')
|
|
|
+ fixture.request('Standby')
|
|
|
+ localAvatar.b_setGameState('LandRoam')
|
|
|
+ pass
|
|
|
+
|