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

enterSpaceCamera.py (4897B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\camera\enterSpaceCamera.py
      2 import math
      3 import logging
      4 import blue
      5 import geo2
      6 import evecamera
      7 import uthread
      8 from ballparkCommon import parkhelpers
      9 from carbonui.uicore import uicore
     10 from eve.client.script.ui.camera.baseSpaceCamera import BaseSpaceCamera
     11 from eve.client.script.ui.camera.cameraUtil import GetBall, GetBallPosition, GetBallMaxZoom, GetBallRadius, GetBallWaitForModel, IsDynamicCameraMovementEnabled, GetSpeedDirection, GetInitialLookAtDistance
     12 from eve.client.script.ui.view.viewStateConst import ViewState
     13 from eve.common.script.sys.idCheckers import IsVoidSpaceSystem
     14 duration = 15.0
     15 logger = logging.getLogger('enterSpaceCamera')
     16 
     17 class EnterSpaceCamera(BaseSpaceCamera):
     18     cameraID = evecamera.CAM_ENTERSPACE
     19     name = 'EnterSpaceCamera'
     20     __notifyevents__ = BaseSpaceCamera.__notifyevents__ + ['OnCurrSessionSpaceEnteredFirstTime']
     21 
     22     def __init__(self):
     23         BaseSpaceCamera.__init__(self)
     24         self.animEntryThread = None
     25 
     26     def Update(self):
     27         BaseSpaceCamera.Update(self)
     28         if IsDynamicCameraMovementEnabled():
     29             self.SetFovTarget(self.GetDynamicFov())
     30         ball = GetBall(self.ego)
     31         if ball:
     32             self.SetAtPosition(GetBallPosition(ball))
     33 
     34     def StartAnimation(self):
     35         self.animEntryThread = uthread.new(self._OnActivated)
     36 
     37     def _OnActivated(self):
     38         if not (sm.RemoteSvc('monolithTaskTrackerMgr').HasEverWarped() or IsVoidSpaceSystem(session.solarsystemid)):
     39             self.AnimEnterFirstTimeEverInSpace()
     40         else:
     41             self.AnimEnter()
     42         uthread.new(self.SwitchToPrimaryCamera)
     43 
     44     def AnimEnter(self):
     45         logger.info('Performing camera animation for entering space')
     46         ball = GetBallWaitForModel(self.ego)
     47         self.SetEyePosition(geo2.Vec3Scale(GetSpeedDirection(ball), 2 * GetBallRadius(ball)))
     48         self.SetMaxZoom(GetBallMaxZoom(ball, self.nearClip))
     49         uicore.animations.MorphScalar(self, 'yaw', self.yaw, self.yaw + math.pi / 20, duration=duration)
     50         uicore.animations.MorphScalar(self, 'pitch', self.pitch, self.pitch + math.pi / 40, duration=duration)
     51         dist = GetInitialLookAtDistance(self.maxZoom, self.minZoom)
     52         zoom0 = self.GetZoomProportionByZoomDistance(5 * dist)
     53         zoom1 = self.GetZoomProportionByZoomDistance(dist)
     54         uicore.animations.MorphScalar(self, 'zoom', zoom0, zoom1, duration=duration * 0.8)
     55         blue.synchro.SleepWallclock(duration * 1000)
     56 
     57     def AnimEnterFirstTimeEverInSpace(self):
     58         logger.info('Performing camera animation for first time ever in space')
     59         ball = GetBallWaitForModel(self.ego)
     60         radius = GetBallRadius(ball)
     61         self.SetMaxZoom(GetBallMaxZoom(ball, self.nearClip))
     62         eyePos0 = self._GetEyePos0(radius)
     63         eyePos1 = self._GetEyePos1(radius)
     64         uicore.animations.MorphVector3(self, '_eyePosition', eyePos0, eyePos1, duration=duration, sleep=True)
     65 
     66     def _GetEyePos0(self, radius):
     67         bp = sm.GetService('michelle').GetBallpark()
     68         direction = geo2.Vec3Normalize(bp.GetCurrentEgoPos())
     69         eyePos0 = geo2.Vec3Scale(direction, 5 * radius)
     70         eyePos0 = geo2.Vec3Add(eyePos0, (0, 0.5 * radius, 0))
     71         quat = geo2.QuaternionRotationAxis((0, 1, 0), 0.5)
     72         eyePos0 = geo2.QuaternionTransformVector(quat, eyePos0)
     73         return eyePos0
     74 
     75     def _GetEyePos1(self, radius):
     76         bp = sm.GetService('michelle').GetBallpark()
     77         shipPosition = bp.GetCurrentEgoPos()
     78         planet = parkhelpers.GetNearestPlanet(session.solarsystemid, shipPosition)
     79         planetPos = planet.position.data
     80         surfaceVector = geo2.Vec3Scale(geo2.Vec3Normalize(planetPos), planet.radius)
     81         axis = geo2.Vec3Cross(planetPos, shipPosition)
     82         quat = geo2.QuaternionRotationAxis((0, 1, 0), math.pi)
     83         surfaceVector = geo2.QuaternionTransformVector(quat, surfaceVector)
     84         surfacePoint = geo2.Vec3Subtract(planetPos, surfaceVector)
     85         surfacePoint = geo2.Vec3Subtract(surfacePoint, shipPosition)
     86         lookDir = geo2.Vec3Normalize(surfacePoint)
     87         eyePos = geo2.Vec3Scale(lookDir, -5 * radius)
     88         eyePos = geo2.Vec3Add(eyePos, (0, radius, 0))
     89         return eyePos
     90 
     91     def GetMinZoomProp(self):
     92         return self.maxZoom / self.minZoom
     93 
     94     def SwitchToPrimaryCamera(self):
     95         sm.GetService('viewState').GetView(ViewState.Space).ActivatePrimaryCamera()
     96 
     97     def OnDeactivated(self):
     98         BaseSpaceCamera.OnDeactivated(self)
     99         uicore.animations.StopAllAnimations(self)
    100         if self.animEntryThread:
    101             self.animEntryThread.kill()
    102             self.animEntryThread = None
    103 
    104     def OnCurrSessionSpaceEnteredFirstTime(self):
    105         if self.isActive:
    106             self.StartAnimation()
    107 
    108     def Track(self, itemID, **kwargs):
    109         self.SwitchToPrimaryCamera()