| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- 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
-
|