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

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