baseCameraController.py (7049B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\camera\baseCameraController.py 2 from carbon.client.script.environment.audioService import GetAudioService 3 from carbon.common.script.sys import service 4 import trinity 5 import carbonui.const as uiconst 6 from eve.client.script.ui.camera.cameraUtil import GetCameraSensitivityMultiplier 7 from eve.client.script.ui.util.uix import GetBallparkRecord 8 from eve.client.script.parklife import states 9 from eve.common.script.sys.eveCfg import InSpace 10 import geo2 11 import uthread 12 from carbonui.uicore import uicore 13 from eveservices.menu import GetMenuService 14 15 class BaseCameraController(object): 16 enablePickTransparent = False 17 cameraID = None 18 19 def __init__(self, *args): 20 self.mouseDownPos = None 21 self.isMovingSceneCursor = None 22 23 def Activate(self): 24 pass 25 26 def Deactivate(self): 27 pass 28 29 def OnMouseEnter(self, *args): 30 pass 31 32 def OnMouseExit(self, *args): 33 pass 34 35 def OnMouseDown(self, *args): 36 _, pickobject = self.GetPick() 37 self.mouseDownPos = (uicore.uilib.x, uicore.uilib.y) 38 self.CheckInSceneCursorPicked(pickobject) 39 return pickobject 40 41 def OnMouseUp(self, button, *args): 42 isLeftBtn = button == 0 43 if isLeftBtn and not uicore.uilib.rightbtn: 44 self.cameraStillSpinning = False 45 if not self.IsMouseDragged(): 46 self.TryClickSceneObject() 47 self.CheckReleaseSceneCursor() 48 isRightBtn = button == 1 49 if isRightBtn: 50 uthread.new(sm.GetService('target').CancelTargetOrder) 51 self.mouseDownPos = None 52 53 def IsMouseDragged(self): 54 mt = self.GetMouseTravel() 55 return mt is not None and mt >= 5 56 57 def OnMouseMove(self, *args): 58 pass 59 60 def OnDblClick(self, *args): 61 pass 62 63 def OnMouseWheel(self, *args): 64 pass 65 66 def GetCamera(self): 67 return sm.GetService('sceneManager').GetRegisteredCamera(self.cameraID) 68 69 @property 70 def camera(self): 71 return self.GetCamera() 72 73 def GetPick(self, x = None, y = None, scene = None): 74 if not trinity.app.IsActive(): 75 return (None, None) 76 if scene is None: 77 scene = self._GetScene() 78 if scene: 79 x = x or uicore.uilib.x 80 y = y or uicore.uilib.y 81 x, y = uicore.ScaleDpi(x), uicore.ScaleDpi(y) 82 camera = self.GetCamera() 83 pickTransparent = trinity.Tr2PickType.PICK_TYPE_TRANSPARENT if self.enablePickTransparent else 0 84 filter = trinity.Tr2PickType.PICK_TYPE_PICKING | trinity.Tr2PickType.PICK_TYPE_OPAQUE | pickTransparent 85 pickResult = scene.PickObjectAndAreaID(x, y, camera.projectionMatrix, camera.viewMatrix, self.GetViewport(), filter) 86 if pickResult is not None: 87 pickObj, areaID = pickResult 88 areaName = self.GetAreaName(areaID) 89 return (areaName, pickObj) 90 return (None, None) 91 92 def _GetScene(self): 93 sceneMgr = sm.GetService('sceneManager') 94 if sceneMgr.IsLoadingScene('default'): 95 return None 96 else: 97 return sceneMgr.GetActiveScene() 98 99 def GetAreaName(self, areaID): 100 return 'scene' 101 102 def GetPickVector(self, x = None, y = None): 103 if x is None: 104 x = int(uicore.uilib.x * uicore.desktop.dpiScaling) 105 if y is None: 106 y = int(uicore.uilib.y * uicore.desktop.dpiScaling) 107 camera = self.GetCamera() 108 viewport = self.GetViewport() 109 view = camera.viewMatrix.transform 110 projection = camera.projectionMatrix.transform 111 direction, startPos = trinity.device.GetPickRayFromViewport(x, y, viewport, view, projection) 112 return (direction, startPos) 113 114 def GetViewport(self): 115 return trinity.device.viewport 116 117 def ProjectWorldToScreen(self, vec3): 118 cam = self.GetCamera() 119 viewport = self.GetViewport() 120 viewport = (viewport.x, 121 viewport.y, 122 viewport.width, 123 viewport.height, 124 viewport.minZ, 125 viewport.maxZ) 126 x, y, z, w = geo2.Vec3Project(vec3, viewport, cam.projectionMatrix.transform, cam.viewMatrix.transform, geo2.MatrixIdentity()) 127 return (x, y) 128 129 def TryClickSceneObject(self): 130 _, pickobject = self.GetPick() 131 if pickobject and hasattr(pickobject, 'translationCurve') and hasattr(pickobject.translationCurve, 'id'): 132 slimItem = GetBallparkRecord(pickobject.translationCurve.id) 133 if slimItem and slimItem.groupID not in const.nonTargetableGroups: 134 itemID = pickobject.translationCurve.id 135 GetAudioService().SendUIEvent(uiconst.SOUND_ENTRY_SELECT) 136 sm.GetService('stateSvc').SetState(itemID, states.selected, 1) 137 GetMenuService().TacticalItemClicked(itemID) 138 return True 139 elif uicore.cmd.IsCombatCommandLoaded('CmdToggleLookAtItem'): 140 uicore.cmd.ExecuteCombatCommand(session.shipid, uiconst.UI_KEYUP) 141 elif uicore.cmd.IsCombatCommandLoaded('CmdToggleCameraTracking'): 142 uicore.cmd.ExecuteCombatCommand(session.shipid, uiconst.UI_KEYUP) 143 return False 144 145 def GetMouseTravel(self): 146 if self.mouseDownPos: 147 x, y = uicore.uilib.x, uicore.uilib.y 148 v = trinity.TriVector(float(x - self.mouseDownPos[0]), float(y - self.mouseDownPos[1]), 0.0) 149 return int(v.Length()) 150 else: 151 return None 152 153 def CheckInSceneCursorPicked(self, pickobject): 154 if not InSpace(): 155 return 156 if sm.IsServiceRunning('scenario') and sm.GetService('scenario').IsActive(): 157 self.isMovingSceneCursor = sm.GetService('scenario').GetPickAxis() 158 elif pickobject and sm.IsServiceRunning('posAnchor') and sm.GetService('posAnchor').IsActive() and pickobject.name[:6] == 'cursor': 159 self.isMovingSceneCursor = pickobject 160 161 def CheckReleaseSceneCursor(self): 162 if self.isMovingSceneCursor: 163 self.isMovingSceneCursor = None 164 if sm.GetService('posAnchor').IsActive(): 165 sm.GetService('posAnchor').StopMovingCursor() 166 return True 167 return False 168 169 def CheckMoveSceneCursor(self): 170 if not self.isMovingSceneCursor or not uicore.uilib.leftbtn: 171 return False 172 if sm.GetService('posAnchor').IsActive(): 173 sm.GetService('posAnchor').MoveCursor(self.isMovingSceneCursor, self.GetMouseDX(), self.GetMouseDY(), self.GetCamera()) 174 return True 175 if session.role & service.ROLE_CONTENT: 176 sm.GetService('scenario').MoveCursor(self.isMovingSceneCursor, self.GetMouseDX(), self.GetMouseDY(), self.GetCamera()) 177 return True 178 return False 179 180 def GetMouseDY(self): 181 return uicore.uilib.dy * GetCameraSensitivityMultiplier() 182 183 def GetMouseDX(self): 184 return uicore.uilib.dx * GetCameraSensitivityMultiplier()