NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

vcsConsumerCamera.py (6899B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\camera\vcsConsumerCamera.py
      2 from __future__ import absolute_import
      3 import geo2
      4 import trinity
      5 import weakref
      6 import logging
      7 from carbon.common.script.util.mathCommon import FloatCloseEnough
      8 from eve.client.script.ui.camera.baseSpaceCamera import BaseSpaceCamera
      9 import evecamera
     10 from .util.egoChangeSmoother import EgoChangeSmoother
     11 logger = logging.getLogger(__name__)
     12 
     13 def _ItemIDsToModels(itemIDs):
     14     ballpark = sm.GetService('michelle').GetBallpark()
     15     if ballpark is None:
     16         return
     17     found = []
     18     for itemID in itemIDs:
     19         ball = ballpark.GetBall(itemID)
     20         if hasattr(ball, 'model') and ball.model:
     21             found.append(ball.model)
     22         else:
     23             logger.warning('A trinity model could not be found for item ID: {}'.format(itemID))
     24 
     25     return found
     26 
     27 
     28 def _LoadCameraFromFile(resFilePath):
     29     camera = trinity.Load(resFilePath)
     30     if not camera or not isinstance(camera, trinity.EveVirtualCamera):
     31         camera = None
     32     return camera
     33 
     34 
     35 class _LinkedVirtualCamera(object):
     36 
     37     def __init__(self, virtualCameraInterface):
     38         self.vcsInterface = weakref.ref(virtualCameraInterface)
     39         self._sourceCamera = None
     40         self._egoChangeSmoother = EgoChangeSmoother(10.0)
     41 
     42     @property
     43     def externalCamera(self):
     44         vcsi = self.vcsInterface()
     45         if vcsi:
     46             return vcsi.externalCamera
     47         else:
     48             return None
     49 
     50     def Activate(self, lastCamera):
     51         self._sourceCamera = lastCamera
     52 
     53     def Deactivate(self):
     54         self._sourceCamera = None
     55 
     56     def Update(self):
     57         if self.externalCamera and self._sourceCamera:
     58             egoOffset = self._egoChangeSmoother.GetTotalOffset(8.0)
     59             self.externalCamera.UpdateExternal(geo2.Vec3Add(self._sourceCamera.eyePosition, egoOffset), geo2.Vec3Add(self._sourceCamera.atPosition, egoOffset), self._sourceCamera.fov, self._sourceCamera.GetRoll())
     60 
     61 
     62 class VirtualCameraSystemInterface(object):
     63 
     64     def __init__(self):
     65         self._vcs = None
     66         self._scene = None
     67         self._eveCameraLink = None
     68 
     69     @property
     70     def vcs(self):
     71         if not self._vcs:
     72             self._vcs = trinity.EveVirtualCameraSystem()
     73         return self._vcs
     74 
     75     @property
     76     def externalCamera(self):
     77         return self.vcs.externalCamera
     78 
     79     def FindCameraByName(self, name):
     80         return self.vcs.GetCameraByName(name)
     81 
     82     def Update(self, parentEveCamera):
     83         if self._eveCameraLink:
     84             self._eveCameraLink.Update()
     85         camera = self.vcs.GetCurrentCamera()
     86         if camera and not FloatCloseEnough(a=geo2.Vec3Distance(camera.pointOfInterest, camera.position), b=0.0, epsilon=0.01):
     87             parentEveCamera.eyePosition = camera.position
     88             parentEveCamera.atPosition = camera.pointOfInterest
     89             parentEveCamera.fov = camera.fov
     90             parentEveCamera.upDirection = camera.up
     91 
     92     def _CreateVirtualCamera(self):
     93         camera = trinity.EveVirtualCamera()
     94         self.vcs.cameras.append(camera)
     95         return camera
     96 
     97     def LoadVirtualCameraSystem(self, resFilePath):
     98         vcs = trinity.Load(resFilePath)
     99         if vcs and isinstance(vcs, trinity.EveVirtualCameraSystem):
    100             self._vcs = vcs
    101         else:
    102             vcs = None
    103         return vcs
    104 
    105     def AddCameraFromFile(self, resFilePath):
    106         logger.debug('Adding camera from file %s', resFilePath)
    107         camera = _LoadCameraFromFile(resFilePath)
    108         if camera:
    109             logger.debug("Adding camera '%s'", camera.name)
    110             self.vcs.cameras.append(camera)
    111         else:
    112             raise RuntimeError('Failed to load camera from {}'.format(resFilePath))
    113         return camera
    114 
    115     def SetAnchorsFromItemIDs(self, camera, positionAnchorIDs = None, pointOfInterestAnchorIDs = None):
    116         logger.debug("Adding anchors for camera '%s' posAnchorIDs=%s pointOfInterestAnchorIDs=%s", camera.name, positionAnchorIDs, pointOfInterestAnchorIDs)
    117         del camera.positionAnchors[:]
    118         del camera.pointOfInterestAnchors[:]
    119         if positionAnchorIDs is not None:
    120             camera.positionAnchors.extend(_ItemIDsToModels(positionAnchorIDs))
    121         if pointOfInterestAnchorIDs is not None:
    122             camera.pointOfInterestAnchors.extend(_ItemIDsToModels(pointOfInterestAnchorIDs))
    123 
    124     def CutToCamera(self, camera):
    125         logger.debug("Cut to camera '%s'", camera.name)
    126         self.vcs.CutToCamera(camera)
    127 
    128     def LerpToCamera(self, camera, transitionTime):
    129         currentCamera = self.vcs.GetCurrentCamera()
    130         logger.debug("Lerp to camera '%s'. Current camera is '%s'", camera.name, currentCamera.name if currentCamera else None)
    131         if not self.vcs.GetCurrentCamera():
    132             self.vcs.CutToCamera(camera)
    133         else:
    134             self.vcs.LerpToCamera(camera, transitionTime)
    135 
    136     def _CleanUpScene(self):
    137         if self._scene and self._scene.virtualCameraSystem is self.vcs:
    138             self._scene.virtualCameraSystem = None
    139 
    140     def _CleanUpVCS(self):
    141         self._CleanUpScene()
    142         self._eveCameraLink = None
    143         self._vcs = None
    144 
    145     def SetScene(self, scene):
    146         self._scene = scene
    147 
    148     def Activate(self, lastCamera):
    149         logger.debug('Activate camera. Last camera was %s', lastCamera.name if lastCamera else None)
    150         self._CleanUpScene()
    151         if not self._scene:
    152             self._scene = sm.GetService('sceneManager').GetRegisteredScene('default')
    153         if self._scene:
    154             self._scene.virtualCameraSystem = self.vcs
    155         if not self._eveCameraLink:
    156             self._eveCameraLink = _LinkedVirtualCamera(self)
    157         self._eveCameraLink.Activate(lastCamera)
    158 
    159     def Deactivate(self):
    160         logger.debug('Deactivate camera')
    161         if self._eveCameraLink:
    162             self._eveCameraLink.Deactivate()
    163         self._CleanUpVCS()
    164         self._scene = None
    165 
    166     def __del__(self):
    167         self.Deactivate()
    168 
    169 
    170 class VCSConsumerCamera(BaseSpaceCamera):
    171     name = 'VirtualCamera'
    172     cameraID = evecamera.CAM_VCS_CONSUMER
    173     default_fov = 1.0
    174 
    175     def __init__(self):
    176         self._vcsInterface = VirtualCameraSystemInterface()
    177         super(VCSConsumerCamera, self).__init__()
    178 
    179     @property
    180     def vcsInterface(self):
    181         return self._vcsInterface
    182 
    183     def OnActivated(self, lastCamera = None, itemID = None, **kwargs):
    184         self.vcsInterface.Activate(lastCamera)
    185         super(VCSConsumerCamera, self).OnActivated(**kwargs)
    186 
    187     def OnDeactivated(self):
    188         self._vcsInterface.Deactivate()
    189 
    190     def GetItemID(self):
    191         return self.ego
    192 
    193     def IsLocked(self):
    194         return True
    195 
    196     def Track(self, itemID, **kwargs):
    197         pass
    198 
    199     def LookAt(self, itemID, radius = None, **kwargs):
    200         pass
    201 
    202     def Update(self):
    203         self._vcsInterface.Update(self)
    204         super(VCSConsumerCamera, self).Update()