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