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

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