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()