mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 18:31:55 -04:00
adding new distributed camera class to assist with video capture
This commit is contained in:
parent
9278348147
commit
a4cd716f9f
234
direct/src/distributed/DistributedCamera.py
Executable file
234
direct/src/distributed/DistributedCamera.py
Executable file
@ -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
|
||||
|
15
direct/src/distributed/DistributedCameraAI.py
Executable file
15
direct/src/distributed/DistributedCameraAI.py
Executable file
@ -0,0 +1,15 @@
|
||||
from direct.distributed.DistributedObjectAI import DistributedObjectAI
|
||||
|
||||
|
||||
class DistributedCameraAI(DistributedObjectAI):
|
||||
def __init__(self, air):
|
||||
DistributedObjectAI.__init__(self, air)
|
||||
self.parent = 0
|
||||
self.fixtures = []
|
||||
pass
|
||||
|
||||
def getCamParent(self):
|
||||
return self.parent
|
||||
|
||||
def getFixtures(self):
|
||||
return self.fixtures
|
114
direct/src/distributed/DistributedCameraOV.py
Executable file
114
direct/src/distributed/DistributedCameraOV.py
Executable file
@ -0,0 +1,114 @@
|
||||
from pandac.PandaModules import *
|
||||
from direct.distributed.DistributedObjectOV import DistributedObjectOV
|
||||
|
||||
class DistributedCameraOV(DistributedObjectOV):
|
||||
def __init__(self, cr):
|
||||
DistributedObjectOV.__init__(self, cr)
|
||||
self.parent = 0
|
||||
self.fixtures = []
|
||||
pass
|
||||
|
||||
def delete(self):
|
||||
self.ignore('escape')
|
||||
DistributedObjectOV.delete(self)
|
||||
|
||||
def getObject(self):
|
||||
return self.cr.getDo(self.getDoId())
|
||||
|
||||
def setCamParent(self, doId):
|
||||
self.parent = doId
|
||||
pass
|
||||
|
||||
def setFixtures(self, fixtures):
|
||||
self.fixtures = fixtures
|
||||
pass
|
||||
|
||||
def storeToFile(self, name):
|
||||
f = file('cameras-%s.txt' % name, 'w')
|
||||
f.writelines(self.getObject().pack())
|
||||
f.close()
|
||||
pass
|
||||
|
||||
def loadFromFile(self, name):
|
||||
self.b_setFixtures([])
|
||||
f = file('cameras-%s.txt' % name, 'r');
|
||||
for line in f.readlines():
|
||||
line = line.strip().replace('Camera(','').replace('))','')
|
||||
line = line.replace('Point3(','').replace('), VBase3(',', ')
|
||||
eval('self.addFixture([%s, \'Standby\'])' % line)
|
||||
pass
|
||||
f.close()
|
||||
pass
|
||||
|
||||
def b_setFixtures(self, fixtures):
|
||||
self.getObject().setFixtures(fixtures)
|
||||
self.setFixtures(fixtures)
|
||||
self.d_setFixtures(fixtures)
|
||||
pass
|
||||
|
||||
def d_setFixtures(self, fixtures):
|
||||
self.sendUpdate('setFixtures', [fixtures])
|
||||
pass
|
||||
|
||||
def addFixture(self, fixture, index = None):
|
||||
if index is not None:
|
||||
self.fixtures.insert(index, fixture)
|
||||
else:
|
||||
self.fixtures.append(fixture)
|
||||
pass
|
||||
self.b_setFixtures(self.fixtures)
|
||||
return self.fixtures.index(fixture)
|
||||
|
||||
def blinkFixture(self, index):
|
||||
if index < len(self.fixtures):
|
||||
fixture = self.fixtures[index]
|
||||
fixture[6] = 'Blinking'
|
||||
self.b_setFixtures(self.fixtures)
|
||||
pass
|
||||
pass
|
||||
|
||||
def standbyFixture(self, index):
|
||||
if index < len(self.fixtures):
|
||||
fixture = self.fixtures[index]
|
||||
fixture[6] = 'Standby'
|
||||
self.b_setFixtures(self.fixtures)
|
||||
pass
|
||||
|
||||
def testFixture(self, index):
|
||||
if index < len(self.fixtures):
|
||||
self.getObject().testFixture(index)
|
||||
pass
|
||||
|
||||
def removeFixture(self, index):
|
||||
self.fixtures.pop(index)
|
||||
self.b_setFixtures(self.fixtures)
|
||||
pass
|
||||
|
||||
def saveFixture(self, index = None):
|
||||
"""
|
||||
Position the camera with ~oobe, then call this to save its telemetry.
|
||||
"""
|
||||
parent = self.getObject().getCamParent()
|
||||
pos = base.cam.getPos(parent)
|
||||
hpr = base.cam.getHpr(parent)
|
||||
return self.addFixture([pos[0], pos[1], pos[2],
|
||||
hpr[0], hpr[1], hpr[2],
|
||||
'Standby'],
|
||||
index)
|
||||
pass
|
||||
|
||||
def startRecording(self):
|
||||
self.accept('escape', self.stopRecording)
|
||||
for fixture in self.fixtures:
|
||||
fixture[6] = 'Recording'
|
||||
pass
|
||||
self.b_setFixtures(self.fixtures)
|
||||
pass
|
||||
|
||||
def stopRecording(self):
|
||||
self.ignore('escape')
|
||||
for fixture in self.fixtures:
|
||||
fixture[6] = 'Standby'
|
||||
pass
|
||||
self.b_setFixtures(self.fixtures)
|
||||
pass
|
Loading…
x
Reference in New Issue
Block a user