shipPOVCamera.py (5981B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\camera\shipPOVCamera.py 2 import math 3 import blue 4 from eve.client.script.parklife import states 5 from eve.client.script.ui.camera.baseSpaceCamera import BaseSpaceCamera 6 from eve.client.script.ui.camera.cameraUtil import GetBallPosition 7 from eve.client.script.ui.inflight.povCameraInSceneContainer import PovCameraInSceneContainer 8 import evecamera 9 import geo2 10 import uthread 11 from carbonui.uicore import uicore 12 from evecamera.locationalcamera import get_orbit_camera_by_solar_system 13 ROTANGLE = (math.pi - 1.0) / 2.0 14 15 class ShipPOVCamera(BaseSpaceCamera): 16 name = 'ShipPOVCamera' 17 cameraID = evecamera.CAM_SHIPPOV 18 minZoom = 100000 19 default_fov = 1.0 20 __notifyevents__ = BaseSpaceCamera.__notifyevents__ + ['OnLoadScene'] 21 22 def __init__(self): 23 BaseSpaceCamera.__init__(self) 24 self.lastLookAtID = None 25 self.trackBall = None 26 self.inSceneContainer = None 27 28 def Update(self): 29 BaseSpaceCamera.Update(self) 30 if not session.solarsystemid: 31 return 32 if not self.trackBall: 33 self.UpdateTrackBall() 34 if self.trackBall and getattr(self.trackBall, 'model', None) and hasattr(self.trackBall.model.rotationCurve, 'value'): 35 self.UpdateUpDirection() 36 self.UpdateAtEyePositions() 37 self.UpdateInSceneContainer() 38 if self.trackBall and self.trackBall.id != self.ego: 39 camera = get_orbit_camera_by_solar_system(session.solarsystemid2) 40 uthread.new(sm.GetService('sceneManager').SetPrimaryCamera, camera) 41 42 def UpdateAtEyePositions(self): 43 lookDir = self.GetLookDirection() 44 ballPos = GetBallPosition(self.trackBall) 45 if self.trackBall.model: 46 radius = self.trackBall.model.GetBoundingSphereRadius() 47 else: 48 radius = self.trackBall.radius * 1.2 49 self.SetEyePosition(geo2.Vec3Add(ballPos, geo2.Vec3Scale(lookDir, -radius))) 50 self.SetAtPosition(geo2.Vec3Add(ballPos, geo2.Vec3Scale(lookDir, -2 * radius))) 51 52 def GetTrackPosition(self): 53 trackPos = self.trackBall.GetVectorAt(blue.os.GetSimTime()) 54 return (trackPos.x, trackPos.y, trackPos.z) 55 56 def GetLookDirection(self): 57 lookDir = geo2.QuaternionTransformVector(self.trackBall.model.rotationCurve.value, (0.0, 0.0, -1.0)) 58 lookDir = geo2.Vec3Normalize(lookDir) 59 return lookDir 60 61 def UpdateUpDirection(self): 62 model = self.trackBall.model 63 upDirection = geo2.QuaternionTransformVector(model.rotationCurve.value, (0.0, 1.0, 0.0)) 64 self.upDirection = geo2.Vec3Normalize(upDirection) 65 66 def UpdateInSceneContainer(self): 67 if not self.inSceneContainer: 68 return 69 if not sm.GetService('ui').IsUiVisible(): 70 self.inSceneContainer.transform.display = False 71 return 72 self.inSceneContainer.transform.display = True 73 self.UpdateInSceneContainerPosition() 74 lookAtDir = self.GetLookAtDirection() 75 pitch = math.acos(geo2.Vec3Dot(lookAtDir, (0, -1, 0))) 76 rightDir = geo2.Vec3Cross(self.GetUpDirection(), lookAtDir) 77 roll = math.acos(geo2.Vec3Dot(rightDir, (0, 1, 0))) 78 self.inSceneContainer.Update(pitch, roll) 79 80 def UpdateInSceneContainerPosition(self): 81 translation = geo2.Vec3Add(self.eyePosition, geo2.Vec3Scale(self.GetLookAtDirection(), -10)) 82 self.inSceneContainer.transform.translation = translation 83 x = 10000.0 / uicore.desktop.width * self.fov ** 0.85 84 self.inSceneContainer.transform.scaling = (x, x, 1.0) 85 86 def OnDeactivated(self): 87 BaseSpaceCamera.OnDeactivated(self) 88 if self.trackBall: 89 self.trackBall = None 90 if self.inSceneContainer: 91 self.inSceneContainer.Close() 92 self.ResetRotate() 93 94 def OnActivated(self, lastCamera = None, **kwargs): 95 BaseSpaceCamera.OnActivated(self, lastCamera=lastCamera, **kwargs) 96 sm.StartService('stateSvc').SetState(self.ego, states.lookingAt, True) 97 settings.char.ui.Set('spaceCameraID', evecamera.CAM_SHIPPOV) 98 self.UpdateTrackBall() 99 if lastCamera is not None and lastCamera.cameraID == evecamera.CAM_JUMP: 100 self.Transit(lastCamera.atPosition, lastCamera.eyePosition, (0, 0, -1), (0, 0, 0), duration=lastCamera.transitionDelay) 101 uthread.new(self.ConstructInSceneContainer) 102 103 def UpdateTrackBall(self): 104 bp = sm.GetService('michelle').GetBallpark() 105 if bp: 106 self.trackBall = bp.GetBall(self.ego) 107 108 def ConstructInSceneContainer(self): 109 while self.isActive: 110 scene = sm.GetService('sceneManager').GetRegisteredScene('default') 111 if scene: 112 container = uicore.uilib.FindRootObject('PovCameraBracket') 113 if container: 114 self.inSceneContainer = container 115 else: 116 self.inSceneContainer = PovCameraInSceneContainer(scene=scene, name='PovCameraBracket', width=500, height=500, clearBackground=True, backgroundColor=(0, 0, 0, 0), faceCamera=True, renderJob=uicore.uilib.GetRenderJob()) 117 break 118 blue.synchro.Yield() 119 120 def LookAt(self, itemID, *args, **kwargs): 121 if itemID == self.ego: 122 return 123 if not self.CheckObjectTooFar(itemID): 124 camera = get_orbit_camera_by_solar_system(session.solarsystemid2) 125 sm.GetService('sceneManager').SetPrimaryCamera(camera, itemID=itemID) 126 127 def ResetCamera(self, *args): 128 pass 129 130 def Track(self, itemID, **kwargs): 131 pass 132 133 def _ClampRotateX(self, x): 134 return max(-ROTANGLE, min(x, ROTANGLE)) 135 136 def _ClampRotateY(self, y): 137 return max(-ROTANGLE, min(y, ROTANGLE)) 138 139 def OnLoadScene(self, *args): 140 if self.inSceneContainer: 141 self.inSceneContainer.Close() 142 self.ConstructInSceneContainer()