mapMarkerScanResult.py (9363B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\mapView\markers\mapMarkerScanResult.py 2 import math 3 import carbonui.const as uiconst 4 import geo2 5 from carbon.common.script.util.format import FmtDist 6 from carbonui.primitives.container import Container 7 from carbonui.primitives.transform import Transform 8 from carbonui.primitives.vectorlinetrace import VectorLineTrace 9 from carbonui.uianimations import animations 10 from carbonui.util.color import Color 11 from eve.client.script.ui.control.gaugeCircular import GaugeCircular 12 from eve.client.script.ui.control.themeColored import SpriteThemeColored 13 from eve.client.script.ui.inflight.scannerFiles.scannerUtil import GetScanDifficultyText 14 from eve.client.script.ui.shared.mapView.markers.mapMarkerBase_Icon import MarkerIconBase 15 from eve.client.script.ui.shared.mapView.markers.mapMarkerSpaceObjectRadialMenu import MapMarkerSpaceObjectRadialMenu 16 from eve.client.script.ui.shared.mapView.markers.mapMarkerUtil import GetResultColor, GetResultTexturePath 17 from eve.common.lib.appConst import minWarpDistance 18 from eveservices.menu import GetMenuService 19 from localization import GetByLabel 20 from logmodule import LogException 21 from sensorsuite.overlay.controllers.probescanner import SiteDataFromScanResult 22 MIN_WARP_DISTANCE_SQUARED = minWarpDistance ** 2 23 24 def IsResultWithinWarpDistance(result): 25 ballpark = sm.GetService('michelle').GetBallpark() 26 egoBall = ballpark.GetBall(ballpark.ego) 27 egoPos = geo2.Vector(egoBall.x, egoBall.y, egoBall.z) 28 resultPos = geo2.Vector(*result.data) 29 distanceSquared = geo2.Vec3LengthSq(egoPos - resultPos) 30 return distanceSquared > MIN_WARP_DISTANCE_SQUARED 31 32 33 class MarkerScanResult(MarkerIconBase): 34 __notifyevents__ = ['OnSiteSelectionChanged', 'OnClientEvent_PerfectScanResultReached'] 35 distanceFadeAlphaNearFar = None 36 backgroundTexturePath = None 37 graph = None 38 highlightFrame = None 39 label = None 40 41 def __init__(self, *args, **kwds): 42 MarkerIconBase.__init__(self, *args, **kwds) 43 sm.RegisterNotify(self) 44 self.resultData = resultData = kwds['resultData'] 45 self.gaugeCircular = None 46 self.gaugeCont = None 47 self.texturePath = GetResultTexturePath(self.resultData) 48 self.projectBracket.offsetY = 0 49 self.iconSprite = None 50 self.CreateClientBall() 51 52 def UpdateIcon(self): 53 self.texturePath = GetResultTexturePath(self.resultData) 54 if self.iconSprite: 55 self.iconSprite.texturePath = self.texturePath 56 57 def Close(self, *args): 58 MarkerIconBase.Close(self, *args) 59 sm.UnregisterNotify(self) 60 61 def UpdateResultData(self, resultData): 62 self.resultData = resultData 63 if self.isLoaded: 64 self.UpdateScanResult() 65 self.CheckShowGauge() 66 self.UpdateIcon() 67 68 def SetOverlappedState(self, overlapState): 69 self.overlapMarkers = None 70 if self.overlapStackContainer: 71 overlapStackContainer = self.overlapStackContainer 72 self.overlapStackContainer = None 73 overlapStackContainer.Close() 74 75 def Load(self): 76 if self.isLoaded: 77 return 78 MarkerIconBase.Load(self) 79 self.UpdateScanResult() 80 self.CheckShowGauge() 81 82 def CheckShowGauge(self): 83 if sm.GetService('scanSvc').IsSiteSelected(self.resultData.id): 84 self.ConstructGauge() 85 self.UpdateCircularGauge() 86 self.gaugeCont.Show() 87 elif self.gaugeCont: 88 self.gaugeCont.Hide() 89 90 def ConstructGauge(self): 91 if not self.gaugeCircular or self.gaugeCircular.destroyed or not self.gaugeCircular.parent: 92 self.gaugeCont = Container(parent=self.markerContainer, pos=(0, 0, 60, 60), align=uiconst.CENTER) 93 self.gaugeCircular = GaugeCircular(parent=self.gaugeCont, radius=22, align=uiconst.CENTER, lineWidth=2, showMarker=False, state=uiconst.UI_DISABLED) 94 SpriteThemeColored(parent=self.gaugeCont, align=uiconst.TOALL, state=uiconst.UI_DISABLED, texturePath='res:/UI/Texture/Shared/CircularGradient.png', colorType=uiconst.COLORTYPE_UIBASE, opacity=0.4) 95 96 def GetResultColor(self): 97 certainty = self.resultData.certainty 98 return GetResultColor(certainty) 99 100 def UpdateScanResult(self): 101 color = self.GetResultColor() 102 self.iconColor = color 103 self.iconSprite.SetRGBA(*color) 104 try: 105 self.UpdateCircularGauge() 106 except: 107 LogException() 108 raise 109 110 def UpdateCircularGauge(self): 111 if not self.gaugeCircular: 112 return 113 col = self.GetResultColor() 114 colBg = Color(*col).SetBrightness(0.4).GetRGBA() 115 colEnd = col 116 brightness = Color(*col).GetBrightness() 117 colStart = Color(*colEnd).SetBrightness(brightness * 0.8).GetRGBA() 118 self.gaugeCircular.SetColor(colStart, colEnd) 119 self.gaugeCircular.SetColorBg(colBg) 120 certainty = self.resultData.certainty 121 self.gaugeCircular.SetValue(certainty) 122 123 def GetLabelText(self): 124 scanSvc = sm.GetService('scanSvc') 125 displayName = scanSvc.GetDisplayName(self.resultData) 126 labelText = '%s %s' % (self.resultData.id, displayName) 127 distance = self.GetDistance() 128 if distance is not None: 129 labelText += ' ' + FmtDist(distance) 130 return labelText 131 132 def GetBracketLabelText(self): 133 labelText = MarkerIconBase.GetBracketLabelText(self) 134 if self.resultData.certainty < 1.0: 135 difficulty = GetScanDifficultyText(self.resultData.difficulty) 136 labelText += '\n' + GetByLabel('UI/Inflight/Scanner/ScanningDifficulty', difficulty=difficulty) 137 return labelText 138 139 def _SetLabelOffset(self): 140 MarkerIconBase._SetLabelOffset(self) 141 if self.resultData.certainty < 1.0: 142 y_offset = -8 143 else: 144 y_offset = 2 145 self.label.x_offset = 32 146 self.label.y_offset = y_offset 147 148 def IsPartialResult(self): 149 return self.resultData.certainty < 1.0 150 151 def GetMenu(self): 152 scanSvc = sm.GetService('scanSvc') 153 scanResult = SiteDataFromScanResult(self.resultData) 154 return scanSvc.GetScanResultMenuWithIgnore(scanResult, self.resultData.groupID) 155 156 def GetDistance(self): 157 bp = sm.GetService('michelle').GetBallpark() 158 if bp is None: 159 return 160 if not bp.ego: 161 return 162 ego = bp.balls[bp.ego] 163 myPos = (ego.x, ego.y, ego.z) 164 return self.resultData.GetDistance(myPos) 165 166 def OnMouseDown(self, *args): 167 siteData = SiteDataFromScanResult(self.resultData) 168 if self.clientBall: 169 GetMenuService().TryExpandActionMenu(itemID=self.clientBall.id, clickedObject=self, siteData=siteData, radialMenuClass=MapMarkerSpaceObjectRadialMenu, markerObject=self) 170 171 def OnSiteSelectionChanged(self): 172 self.CheckShowGauge() 173 174 def OnClick(self, *args, **kwds): 175 MarkerIconBase.OnClick(self, *args, **kwds) 176 doDScan = self.CheckDirectionalScanItem() 177 if not doDScan: 178 sm.GetService('scanSvc').SelectSite(self.resultData.id) 179 180 def OnClientEvent_PerfectScanResultReached(self, results): 181 for result in results: 182 if result.id == self.resultData.id: 183 self.AnimPerfectResult() 184 185 def AnimPerfectResult(self): 186 if self.gaugeCircular: 187 animations.BlinkIn(self.gaugeCircular, loops=4) 188 self._AnimCircle(0.25) 189 self._AnimCircle(0.65) 190 191 def _AnimCircle(self, timeOffset): 192 radius = 40 193 transform = Transform(parent=self.markerContainer, align=uiconst.CENTER, width=radius * 2, height=radius * 2, state=uiconst.UI_DISABLED, scalingCenter=(0.5, 0.5)) 194 circle = Circle(parent=transform, radius=radius, color=(0.4, 1.0, 0.4, 1.0)) 195 duration = 0.8 196 animations.FadeTo(circle, 0.3, 0.0, duration=duration, callback=circle.Close, timeOffset=timeOffset) 197 animations.MorphVector2(transform, 'scale', (0.0, 0.0), (1.4, 1.4), duration=duration, curveType=uiconst.ANIM_LINEAR, timeOffset=timeOffset) 198 animations.MorphScalar(circle, 'lineWidth', radius, 0.0, duration=duration, curveType=uiconst.ANIM_LINEAR, timeOffset=timeOffset, callback=transform.Close) 199 200 def GetMarkerOpacity(self, bracketCameraDistance, cameraZoomDistance): 201 if sm.GetService('scanSvc').IsSiteSelected(self.markerID[1][0]): 202 return 1.0 203 else: 204 return 0.6 205 206 207 class Circle(VectorLineTrace): 208 default_color = Color.WHITE 209 default_radius = 10 210 211 def ApplyAttributes(self, attributes): 212 VectorLineTrace.ApplyAttributes(self, attributes) 213 color = attributes.get('color', self.default_color) 214 self.radius = attributes.get('radius', self.default_radius) 215 self.isLoop = True 216 numPoints = max(20, self.radius) 217 w = self.lineWidth / 2.0 218 stepSize = 2 * math.pi / numPoints 219 for i in xrange(numPoints): 220 t = float(i) * stepSize 221 point = self.GetLinePoint(t, w) 222 self.AddPoint(point, color) 223 224 def GetLinePoint(self, t, w): 225 r = self.radius - w 226 xPoint = w + r * (1.0 + math.cos(t)) 227 yPoint = w + r * (1.0 + math.sin(t)) 228 return (xPoint, yPoint)