sceneContainerCamera.py (6201B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\camera\sceneContainerCamera.py 2 from eve.client.script.ui.camera.baseCamera import Camera 3 import geo2 4 import uthread 5 import blue 6 7 class SceneContainerCamera(Camera): 8 kFovSpeed = 7.0 9 10 def __init__(self): 11 Camera.__init__(self) 12 self._aspectRatio = 1.0 13 self.innerBoundRadius = (0.0, 0.0, 0.0) 14 self._advancedInspectionModeOn = False 15 self._currentlyInspecting = False 16 self.inspectionUpdateThread = None 17 self._modelCenterOffset = (0.0, 0.0, 0.0) 18 self._inspectionZoomLevel = 0.0 19 self._width = 0.0 20 self._height = 0.0 21 22 def UpdateViewportSize(self, width, height): 23 self._width = width 24 self._height = height 25 if height: 26 self._aspectRatio = float(width) / height 27 28 def GetWidth(self): 29 return self._width 30 31 def GetHeight(self): 32 return self._height 33 34 def GetAspectRatio(self): 35 return self._aspectRatio 36 37 def OnActivated(self, **kwargs): 38 Camera.OnActivated(self, **kwargs) 39 sm.GetService('sceneManager').RegisterForCameraUpdate(self) 40 41 def OnDeactivated(self): 42 Camera.OnActivated(self) 43 sm.GetService('sceneManager').UnregisterForCameraUpdate(self) 44 45 def SetAdvancedInspectionMode(self, isOn): 46 self._advancedInspectionModeOn = isOn 47 48 def GetAdvancedInspectionModeStatus(self): 49 return self._advancedInspectionModeOn 50 51 def SetCurrentInspectionStatus(self, isOn): 52 if not self._currentlyInspecting and isOn: 53 self._currentlyInspecting = isOn 54 self.SetFovTarget(1.0) 55 self._inspectionZoomLevel = 0.0 56 if self.inspectionUpdateThread is None: 57 self.inspectionUpdateThread = uthread.new(self.InspectionUpdateThread) 58 elif self._currentlyInspecting and not isOn: 59 self.ResetRotate() 60 self._rotateOffset = (0.0, 0.0) 61 self._currentlyInspecting = isOn 62 self.SetFovTarget(1.2) 63 64 def GetCurrentInspectionStatus(self): 65 return self._currentlyInspecting 66 67 def SetZoom(self, proportion): 68 if not self._currentlyInspecting: 69 direction = self.GetLookAtDirection() 70 distance = self.GetZoomDistanceByZoomProportion(proportion) 71 zoomVec = geo2.Vec3Scale(direction, distance) 72 self.SetEyePosition(geo2.Vec3Add(self.GetZoomToPoint(), zoomVec)) 73 74 def Zoom(self, dz): 75 if not self._currentlyInspecting: 76 return super(SceneContainerCamera, self).Zoom(dz) 77 self._inspectionZoomLevel += dz 78 self._inspectionZoomLevel = min(1.0, max(0.0, self._inspectionZoomLevel)) 79 80 def SetInnerBoundRadius(self, innerRadius): 81 maxSideLength = max(self.innerBoundRadius) 82 padding = (0.1 * maxSideLength, 0.1 * maxSideLength, 0.1 * maxSideLength) 83 self.innerBoundRadius = geo2.Vec3Add(innerRadius, padding) 84 85 def SetModelCenter(self, modelCenter): 86 self._modelCenterOffset = modelCenter 87 self.SetAtPosition(self._modelCenterOffset) 88 89 def GetLookAtDirection(self): 90 if not self._currentlyInspecting: 91 return super(SceneContainerCamera, self).GetLookAtDirection() 92 return geo2.Vec3Direction(self._eyePosition, self._modelCenterOffset) 93 94 def InspectionUpdateThread(self): 95 try: 96 maxSideLength = max(self.innerBoundRadius) 97 directionScaler = (self.innerBoundRadius[0] / maxSideLength, self.innerBoundRadius[1] / maxSideLength, self.innerBoundRadius[2] / maxSideLength) 98 offsetFactor = 1 - pow(min(directionScaler), 1.3) 99 finalZoomLevel = 0.3 100 followSpeed = 0.0 101 while True: 102 if not self._currentlyInspecting: 103 numBufferUpdatesRemaining = 60.0 104 followSpeed = 0.0 105 while numBufferUpdatesRemaining > 0.0: 106 if self._currentlyInspecting: 107 followSpeed = 0.0 108 break 109 direction = self.GetLookAtDirection() 110 distance = self.maxZoom + finalZoomLevel * (self.minZoom - self.maxZoom) 111 zoomVec = geo2.Vec3Scale(direction, distance) 112 targetEyePos = geo2.Vec3Add(self.GetZoomToPoint(), zoomVec) 113 self.SetAtPosition(geo2.Vec3Lerp(self.GetAtPosition(), self._modelCenterOffset, followSpeed)) 114 self.SetEyePosition(geo2.Vec3Lerp(self.GetEyePosition(), targetEyePos, followSpeed)) 115 followSpeed = min(1.0, followSpeed + 0.02) 116 numBufferUpdatesRemaining -= 1.0 117 blue.synchro.Yield() 118 119 if not self._currentlyInspecting: 120 break 121 rotationQuaternion = self.GetRotationQuat() 122 direction = geo2.QuaternionTransformVector(rotationQuaternion, (0.0, 0.0, 1.0)) 123 adjustedDirection = (direction[0] / directionScaler[0], direction[1] / directionScaler[1], direction[2] / directionScaler[2]) 124 ipScale = 1.0 + self._inspectionZoomLevel 125 innerPoint = tuple((ele1 * ele2 * ipScale for ele1, ele2 in zip(adjustedDirection, self.innerBoundRadius))) 126 offsetAtPosition = tuple((ele1 * ele2 * ele3 * offsetFactor for ele1, ele2, ele3 in zip(adjustedDirection, self.innerBoundRadius, directionScaler))) 127 targetAtPosition = geo2.Vec3Add(self._modelCenterOffset, offsetAtPosition) 128 targetEyePos = geo2.Vec3Add(self._modelCenterOffset, innerPoint) 129 self.SetAtPosition(geo2.Vec3Lerp(self.GetAtPosition(), targetAtPosition, followSpeed)) 130 self.SetEyePosition(geo2.Vec3Lerp(self.GetEyePosition(), targetEyePos, followSpeed)) 131 followSpeed = min(1.0, followSpeed + 0.01) 132 blue.synchro.Yield() 133 134 finally: 135 self.SetAtPosition(self._modelCenterOffset) 136 self.SetZoomLinear(finalZoomLevel) 137 self.inspectionUpdateThread = None