planetUISvc.py (33355B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\planet\planetUISvc.py 2 import math 3 import blue 4 import carbonui.const as uiconst 5 import evecamera 6 import evegraphics.settings as gfxsettings 7 import evetypes 8 import inventorycommon.typeHelpers 9 import localization 10 import log 11 import trinity 12 import uthread 13 from carbon.common.script.sys.service import Service 14 from carbon.common.script.sys.serviceConst import SERVICE_RUNNING, SERVICE_START_PENDING 15 from carbonui.primitives.container import Container 16 from carbonui.uicore import uicore 17 from eve.client.script.environment.spaceObject.planet import Planet 18 from eve.client.script.ui.shared.dockedUI.lobbyWnd import LobbyWnd 19 from eve.client.script.ui.shared.planet.pinContainers.LinkContainer import LinkContainer 20 from eve.client.script.ui.shared.planet.pinContainers.containersByPinType import containerClsByPinType 21 from eve.client.script.ui.shared.planet.planetConst import SCALE_OTHERLINKS, SCALE_RUBBERLINK, SCALE_EXTRACTORLINKS, SCALE_LINKS 22 from eve.common.lib.PlanetResources import builder 23 from eve.common.script.planet.planetUtil import MATH_2PI 24 from eveexceptions import UserError 25 from localization import GetByLabel 26 from carbonui.control.window import Window 27 from eve.client.script.ui.shared.planet.curveLineDrawer import CurveLineDrawer 28 from eve.client.script.ui.shared.planet.eventManager import EventManager 29 from eve.client.script.ui.shared.planet.myPinManager import MyPinManager 30 from eve.client.script.ui.shared.planet.otherPinManager import OtherPinManager 31 from eve.client.script.ui.shared.planet.planetCommon import PLANET_RESOURCE_TEX_WIDTH, PLANET_RESOURCE_TEX_HEIGHT 32 from eve.client.script.ui.shared.planet.planetCommon import PLANET_TEXTURE_SIZE, PLANET_SCALE 33 from eve.client.script.ui.shared.planet.importExportUI import PlanetaryImportExportUI 34 from eve.client.script.ui.shared.planet.orbitalMaterialUI import OrbitalMaterialUI 35 from eve.client.script.ui.shared.planet.surveyUI import SurveyWindow 36 from eve.client.script.ui.inflight.orbitalConfiguration import OrbitalConfigurationWindow 37 from eve.common.lib import appConst as const 38 from player_messaging.client.ui_message import prompt_player_fsd_dialog 39 SQRT_NUM_SAMPLES = 80 40 LINER_BLENDING_RATIO = 0.8 41 RESOURCE_BASE_COLOR = (1, 1, 1, 0.175) 42 43 class ResourceRenderAbortedError(Exception): 44 pass 45 46 47 class PlanetUISvc(Service): 48 __guid__ = 'svc.planetUI' 49 __notifyevents__ = ['OnGraphicSettingsChanged', 50 'OnUIRefresh', 51 'ProcessUIRefresh', 52 'OnPILaunchesChange'] 53 __exportedcalls__ = {} 54 __servicename__ = 'planetUI' 55 __displayname__ = 'Planet UI Client Service' 56 __update_on_reload__ = 0 57 58 def Run(self, memStream = None): 59 self.state = SERVICE_START_PENDING 60 self.LogInfo('Starting Planet UI Client Svc') 61 uicore.layer.planet.Flush() 62 self.planetID = None 63 self.oldPlanetID = None 64 self.format = trinity.PIXEL_FORMAT.B8G8R8A8_UNORM 65 self.busy = 0 66 self.isLoadingResource = False 67 self.selectedResourceTypeID = None 68 self.minimizedWindows = [] 69 self.planetAccessRequired = None 70 self.currSphericalHarmonic = None 71 self.spherePinsPendingLoad = [] 72 self.spherePinLoadThread = None 73 self.inEditMode = False 74 self.launchsRowSet = None 75 self.planetDimensions = 1000 76 self.planet = None 77 self.curveLineDrawer = CurveLineDrawer() 78 self.myPinManager = None 79 self.otherPinManager = None 80 self.eventManager = None 81 self.planetRoot = None 82 self.trinityPlanet = None 83 self.planetTransform = None 84 self.resourceLayer = None 85 self.pinTransform = None 86 self.pinOthersTransform = None 87 self.orbitalObjectTransform = None 88 self.modeController = None 89 self.scanController = None 90 self.currentContainer = None 91 self.planetNav = None 92 self.planetUIContainer = Container(parent=uicore.layer.planet, name='planetUIContainer', align=uiconst.TOALL, state=uiconst.UI_PICKCHILDREN) 93 self.state = SERVICE_RUNNING 94 self.LogInfo('Planet UI Client Svc Started') 95 96 def Stop(self, memStream = None): 97 if trinity.device is None: 98 return 99 self.LogInfo('service is stopping') 100 if self.spherePinLoadThread: 101 self.spherePinLoadThread.kill() 102 self.spherePinLoadThread = None 103 self.Reset() 104 105 def Reset(self): 106 self.LogInfo('PlanetUISvc Reset') 107 self.minimizedWindows = [] 108 self.CleanScene() 109 sm.ScatterEvent('OnPlanetUIReset') 110 111 def CleanScene(self): 112 self.LogInfo('CleanScene') 113 self.CloseCurrentlyOpenPinContainer() 114 self.planetUIContainer.Flush() 115 if self.planetTransform is not None: 116 del self.planetTransform.children[:] 117 if self.planetRoot is not None: 118 del self.planetRoot.children[:] 119 self.planetTransform = None 120 self.pinTransform = None 121 self.pinOthersTransform = None 122 if self.trinityPlanet is not None: 123 self.trinityPlanet.model = None 124 self.trinityPlanet = None 125 self.planetRoot = None 126 self.planetNav = None 127 if self.scanController is not None: 128 self.scanController.Close() 129 self.scanController = None 130 self.resourceLayer = None 131 self.isLoadingResource = False 132 133 def RevertChanges(self): 134 self.planet.RevertChanges() 135 self.eventManager.SetStateNormal() 136 137 def CleanView(self): 138 if self.planetTransform is not None: 139 self.planetTransform.children.remove(self.pinTransform) 140 self.planetTransform.children.remove(self.pinOthersTransform) 141 if self.eventManager: 142 self.eventManager.OnPlanetViewClosed() 143 if self.myPinManager: 144 self.myPinManager.OnPlanetViewClosed() 145 if self.otherPinManager: 146 self.otherPinManager.OnPlanetViewClosed() 147 self.eventManager.DeselectCurrentlySelected() 148 self.planetUIContainer.Flush() 149 self.busy = 0 150 self.StopSpherePinLoadThread() 151 del self.pinTransform 152 self.pinTransform = None 153 del self.pinOthersTransform 154 self.pinOthersTransform = None 155 if self.scanController is not None: 156 self.scanController.Close() 157 self.scanController = None 158 self.resourceLayer = None 159 160 def ProcessUIRefresh(self): 161 self.oldPlanetID = None 162 if sm.GetService('viewState').IsViewActive('planet'): 163 self.oldPlanetID = self.planetID 164 self.planetID = None 165 self.Reset() 166 167 def GetLaunches(self, force = 0): 168 if self.launchsRowSet is None or force: 169 self.launchsRowSet = sm.RemoteSvc('planetMgr').GetMyLaunchesDetails() 170 return self.launchsRowSet 171 172 def OnPILaunchesChange(self, *args): 173 self.launchsRowSet = None 174 sm.GetService('neocom').Blink('planets', GetByLabel('UI/Neocom/Blink/PlanetaryLaunch')) 175 176 def OnUIRefresh(self): 177 if self.oldPlanetID: 178 self.Open(self.oldPlanetID) 179 self.oldPlanetID = None 180 181 def MinimizeWindows(self): 182 lobby = LobbyWnd.GetIfOpen() 183 if lobby and not lobby.destroyed and lobby.state != uiconst.UI_HIDDEN and not lobby.IsMinimized() and not lobby.IsCollapsed(): 184 lobby.Minimize() 185 self.minimizedWindows.append(LobbyWnd.default_windowID) 186 187 def Open(self, planetID): 188 sm.GetService('viewState').ActivateView('planet', planetID=planetID) 189 190 def ExitView(self): 191 sm.GetService('viewState').CloseSecondaryView('planet') 192 193 def _Open(self, planetID): 194 mapSvc = sm.GetService('map') 195 planetData = mapSvc.GetPlanetInfo(planetID) 196 planetChanged = planetID != self.planetID 197 oldPlanetID = self.planetID 198 self.planetID = planetID 199 self.typeID = planetData.typeID 200 self.solarSystemID = planetData.solarSystemID 201 try: 202 self.InitUI(planetChanged) 203 except: 204 self.Stop() 205 self.Run() 206 raise 207 208 sm.GetService('audio').SendUIEvent('msg_pi_general_opening_play') 209 sm.ScatterEvent('OnPlanetViewChanged', planetID, oldPlanetID) 210 self.planetAccessRequired = session.solarsystemid2 == self.solarSystemID or sm.GetService('planetSvc').IsPlanetColonizedByMe(planetID) 211 212 def Close(self, clearAll = True): 213 if getattr(self, 'busy', 0): 214 return True 215 self.busy = 1 216 if len(self.minimizedWindows) > 0: 217 for windowID in self.minimizedWindows: 218 wnd = Window.GetIfOpen(windowID=windowID) 219 if wnd and wnd.IsMinimized(): 220 wnd.Maximize() 221 222 self.minimizedWindows = [] 223 sm.GetService('sceneManager').SetRegisteredScenes('default') 224 self.busy = 0 225 if self.eventManager: 226 self.eventManager.OnPlanetViewClosed() 227 if self.myPinManager: 228 self.myPinManager.OnPlanetViewClosed() 229 if self.otherPinManager: 230 self.otherPinManager.OnPlanetViewClosed() 231 self.CleanScene() 232 self.StopSpherePinLoadThread() 233 sm.ScatterEvent('OnPlanetViewChanged', None, self.planetID) 234 if self.planetAccessRequired is not None: 235 self.planetAccessRequired = None 236 self.planetID = None 237 self.planet = None 238 self.selectedResourceTypeID = None 239 sm.GetService('audio').SendUIEvent('msg_pi_general_closing_play') 240 if clearAll: 241 self.cameraScene = None 242 self.planetScene = None 243 sm.GetService('sceneManager').UnregisterScene('planet') 244 return True 245 246 def InitUI(self, planetChanged): 247 self.LogInfo('Initializing UI') 248 self.StartLoadingBar('planet_ui_init', localization.GetByLabel('UI/InfoWindow/TabNames/PlanetaryProduction'), localization.GetByLabel('UI/PI/Common/LoadingPlanetResources'), 5) 249 try: 250 sm.GetService('planetSvc').GetPlanet(self.planetID) 251 except UserError: 252 self.StopLoadingBar('planet_ui_init') 253 raise 254 except Exception: 255 prompt_player_fsd_dialog('PlanetLoadingFailed', {'planet': (const.UE_LOCID, self.planetID)}) 256 self.StopLoadingBar('planet_ui_init') 257 log.LogException() 258 return 259 260 if not sm.GetService('viewState').IsViewActive('planet'): 261 self.MinimizeWindows() 262 newScene = False 263 if self.planetRoot is None or planetChanged: 264 self.CreateScene() 265 newScene = True 266 self.UpdateLoadingBar('planet_ui_init', localization.GetByLabel('UI/InfoWindow/TabNames/PlanetaryProduction'), localization.GetByLabel('UI/PI/Common/LoadingPlanetResources'), 1, 4) 267 sceneManager = sm.GetService('sceneManager') 268 sceneManager.SetRegisteredScenes('planet') 269 sm.GetService('sceneManager').SetSecondaryCamera(evecamera.CAM_PLANET) 270 self.UpdateLoadingBar('planet_ui_init', localization.GetByLabel('UI/InfoWindow/TabNames/PlanetaryProduction'), localization.GetByLabel('UI/PI/Common/LoadingPlanetResources'), 2, 4) 271 self.SetPlanet() 272 self.UpdateLoadingBar('planet_ui_init', localization.GetByLabel('UI/InfoWindow/TabNames/PlanetaryProduction'), localization.GetByLabel('UI/PI/Common/LoadingPlanetResources'), 3, 4) 273 self.LoadPI(newScene) 274 self.UpdateLoadingBar('planet_ui_init', localization.GetByLabel('UI/InfoWindow/TabNames/PlanetaryProduction'), localization.GetByLabel('UI/PI/Common/LoadingPlanetResources'), 4, 4) 275 self.StopLoadingBar('planet_ui_init') 276 277 def LoadPI(self, newScene = True): 278 self.InitTrinityTransforms() 279 self.InitUIContainers() 280 self.InitLinesets() 281 if self.myPinManager: 282 self.myPinManager.Close() 283 self.myPinManager = MyPinManager() 284 if self.otherPinManager: 285 self.otherPinManager.Close() 286 self.otherPinManager = OtherPinManager() 287 if self.eventManager: 288 self.eventManager.Close() 289 self.eventManager = EventManager() 290 self.planetNav.Startup() 291 self.eventManager.OnPlanetViewOpened() 292 self.myPinManager.OnPlanetViewOpened() 293 self.otherPinManager.OnPlanetViewOpened() 294 295 def SetModeController(self, modeController): 296 self.modeController = modeController 297 298 def InitUIContainers(self): 299 self.pinInfoParent = Container(parent=self.planetUIContainer, name='pinInfoParent', align=uiconst.TOALL, state=uiconst.UI_PICKCHILDREN) 300 self.planetNav = sm.GetService('viewState').GetView('planet').layer 301 302 def InitTrinityTransforms(self): 303 self.pinTransform = trinity.EveTransform() 304 self.pinTransform.name = 'myPins' 305 self.pinOthersTransform = trinity.EveTransform() 306 self.pinOthersTransform.name = 'othersPins' 307 self.planetTransform.children.append(self.pinTransform) 308 self.planetTransform.children.append(self.pinOthersTransform) 309 310 def InitLinesets(self): 311 self.curveLineDrawer.CreateLineSet('links', self.pinTransform, 'res:/UI/Texture/Planet/link.dds', scale=SCALE_LINKS) 312 self.curveLineDrawer.CreateLineSet('linksExtraction', self.pinTransform, 'res:/UI/Texture/Planet/link.dds', scale=SCALE_EXTRACTORLINKS) 313 self.curveLineDrawer.CreateLineSet('rubberLink', self.pinTransform, 'res:/UI/Texture/Planet/link.dds', scale=SCALE_RUBBERLINK) 314 self.curveLineDrawer.CreateLineSet('otherLinks', self.pinOthersTransform, 'res:/UI/Texture/Planet/link.dds', scale=SCALE_OTHERLINKS) 315 316 def CreateRenderTarget(self): 317 textureQuality = gfxsettings.Get(gfxsettings.GFX_TEXTURE_QUALITY) 318 self.maxSizeLimit = size = PLANET_TEXTURE_SIZE >> textureQuality 319 rt = None 320 while rt is None or not rt.isValid: 321 rt = trinity.Tr2RenderTarget(2 * size, size, 0, self.format) 322 if not rt.isValid: 323 if size < 2: 324 return 325 self.maxSizeLimit = size = size / 2 326 rt = None 327 328 self.LogInfo('CreateRenderTarget textureQuality', textureQuality, 'size', size, 'maxSizeLimit', self.maxSizeLimit) 329 return rt 330 331 def CreateScene(self): 332 self.LogInfo('CreateScene') 333 self.planetScene = self.GetPlanetScene() 334 self.planetScene.sunDirection = (0.0, 0.0, 1.0) 335 self.planetScene.sunDiffuseColor = (1.0, 1.0, 1.0, 1.0) 336 self.planetScene.planetScale = self.planetDimensions 337 self.planetScene.planetCameraScale = self.planetDimensions 338 self.planetRoot = trinity.EveRootTransform() 339 self.planetRoot.name = 'planetRoot' 340 self.planetScene.objects.append(self.planetRoot) 341 self.LoadPlanet() 342 sm.GetService('sceneManager').RegisterScene(self.planetScene, 'planet') 343 344 def GetScene(self): 345 _, regionID, constellationID, solarSystemID, _ = sm.GetService('map').GetParentLocationID(self.solarSystemID) 346 scene = sm.GetService('sceneManager').GetScene(location=(solarSystemID, constellationID, regionID)) 347 return scene 348 349 def GetPlanetScene(self): 350 scenepath = self.GetScene() 351 scene = trinity.Load(scenepath) 352 scene.backgroundRenderingEnabled = True 353 return scene 354 355 def LoadPlanet(self): 356 self.LogInfo('LoadPlanet planet', self.planetID, 'type', self.typeID, 'system', self.solarSystemID) 357 planet = Planet() 358 graphicFile = inventorycommon.typeHelpers.GetGraphicFile(self.typeID) 359 planet.typeData['graphicFile'] = graphicFile 360 planet.typeID = self.typeID 361 planet.LoadPlanet(self.planetID, forPhotoService=True, rotate=False, hiTextures=True, notifyLoaded=False) 362 self.trinityPlanet = planet 363 if planet.model is None: 364 return 365 planet.name = 'planet' 366 planet.model.scaling = tuple([self.planetDimensions] * 3) 367 planet.model.radius = self.planetDimensions 368 planet.model.translationCurve = None 369 planet.model.rotationCurve = None 370 planet.model.zOnlyModel = trinity.Load('res:/dx9/model/worldobject/planet/planetzonly.red').effectChildren[0] 371 planet.model.zOnlyModel.scaling = (0.99, 0.99, 0.99) 372 planetTransform = trinity.EveTransform() 373 planetTransform.name = 'planet' 374 planetTransform.scaling = (PLANET_SCALE, PLANET_SCALE, PLANET_SCALE) 375 self.planetTransform = planetTransform 376 self.planetRoot.children.append(self.planetTransform) 377 self.planetScene.planets.append(planet.model) 378 trinity.WaitForResourceLoads() 379 self.evePlanet = planet.model 380 381 def GetCurrentPlanet(self): 382 if not self.planetID: 383 return None 384 return sm.GetService('planetSvc').GetPlanet(self.planetID) 385 386 def StartLoadingBar(self, key, tile, action, total): 387 if getattr(self, 'loadingBarActive', None) is None: 388 sm.GetService('loading').ProgressWnd(tile, action, 0, total) 389 self.loadingBarActive = key 390 391 def UpdateLoadingBar(self, key, tile, action, part, total): 392 if getattr(self, 'loadingBarActive', None) == key: 393 sm.GetService('loading').ProgressWnd(tile, action, part, total) 394 395 def StopLoadingBar(self, key): 396 if getattr(self, 'loadingBarActive', None) == key: 397 sm.GetService('loading').StopCycle() 398 self.loadingBarActive = None 399 400 def OnGraphicSettingsChanged(self, changes): 401 changed = gfxsettings.GFX_TEXTURE_QUALITY in changes or gfxsettings.GFX_SHADER_QUALITY in changes 402 if sm.GetService('viewState').IsViewActive('planet') and self.trinityPlanet is not None and changed: 403 if self.selectedResourceTypeID is not None: 404 self.ShowResource(self.selectedResourceTypeID) 405 406 def ShowResource(self, resourceTypeID): 407 self.LogInfo('ShowResource', resourceTypeID) 408 oldResourceTypeID = self.selectedResourceTypeID 409 self.selectedResourceTypeID = resourceTypeID 410 if resourceTypeID is None: 411 if self.resourceLayer is not None: 412 self.resourceLayer.display = False 413 self.otherPinManager.HideOtherPlayersExtractors() 414 if self.IsModeControllerPresent(): 415 self.modeController.resourceControllerTab.ResourceSelected(resourceTypeID) 416 elif not getattr(self, 'isLoadingResource', False): 417 if self.IsModeControllerPresent(): 418 self.modeController.resourceControllerTab.ResourceSelected(resourceTypeID) 419 self.isLoadingResource = True 420 uthread.new(self._ShowResource, resourceTypeID) 421 self.modeController.resourceControllerTab.ResourceSelected(resourceTypeID) 422 elif oldResourceTypeID != resourceTypeID: 423 while self.isLoadingResource: 424 blue.pyos.synchro.SleepWallclock(50) 425 426 if resourceTypeID == self.selectedResourceTypeID: 427 self.ShowResource(resourceTypeID) 428 429 def _ShowResource(self, resourceTypeID): 430 self.LogInfo('_ShowResource', resourceTypeID) 431 inRange = False 432 try: 433 inRange, texture = self.GetResourceAndRender(resourceTypeID) 434 if self.planetTransform is not None: 435 self.EnableResourceLayer() 436 self.SetResourceTexture(texture) 437 except ResourceRenderAbortedError: 438 pass 439 finally: 440 self.isLoadingResource = False 441 if self.IsModeControllerPresent(): 442 self.modeController.resourceControllerTab.StopLoadingResources(resourceTypeID) 443 if self.otherPinManager is not None and inRange: 444 self.otherPinManager.RenderOtherPlayersExtractors(resourceTypeID) 445 446 def IsModeControllerPresent(self): 447 return self.modeController is not None and hasattr(self.modeController, 'resourceControllerTab') and self.modeController.resourceControllerTab is not None 448 449 def IsColonyPresent(self): 450 if not self.planet: 451 return False 452 return session.charid in self.planet.colonies 453 454 def EnableResourceLayer(self): 455 if self.planetTransform is not None: 456 if self.resourceLayer is None: 457 self.LogInfo('_ShowResource no resourceLayer found. Loading resource layer') 458 self.resourceLayer = trinity.Load('res:/dx9/model/worldobject/planet/uiplanet.red') 459 trinity.WaitForResourceLoads() 460 effect = self.resourceLayer.mesh.transparentAreas[0].effect 461 for resource in effect.resources: 462 if resource.name == 'ColorRampMap': 463 resource.resourcePath = 'res:/dx9/model/worldobject/planet/resource_colorramp.dds' 464 465 for param in effect.parameters: 466 if param.name == 'MainColor': 467 param.value = RESOURCE_BASE_COLOR 468 elif param.name == 'ResourceTextureInfo': 469 param.value = (PLANET_RESOURCE_TEX_WIDTH, 470 PLANET_RESOURCE_TEX_HEIGHT, 471 0, 472 0) 473 474 offset = trinity.Tr2FloatParameter() 475 offset.name = 'HeatOffset' 476 offset.value = 0.0 477 effect.parameters.append(offset) 478 stretch = trinity.Tr2FloatParameter() 479 stretch.name = 'HeatStretch' 480 stretch.value = 1.0 481 effect.parameters.append(stretch) 482 self.planetTransform.children.append(self.resourceLayer) 483 else: 484 self.resourceLayer.display = True 485 low, hi = self.GetResourceDisplayRange() 486 self.SetResourceDisplayRange(low, hi) 487 488 def GetResourceTexture(self): 489 effect = self.resourceLayer.mesh.transparentAreas[0].effect 490 for resource in effect.resources: 491 if resource.name == 'ResourceDistMap': 492 return resource 493 494 def GetResourceAndRender(self, resourceTypeID): 495 self.LogInfo('GetResourceAndRender resourceTypeID', resourceTypeID) 496 planet = sm.GetService('planetSvc').GetPlanet(self.planetID) 497 inRange, sh = planet.GetResourceData(resourceTypeID) 498 self.currSphericalHarmonic = sh 499 sh = builder.CopySH(sh) 500 builder.ScaleSH(sh, 1.0 / const.planetResourceMaxValue) 501 bmp = self.ChartResourceLayer(sh) 502 texture = trinity.TriTextureRes() 503 texture.CreateFromHostBitmap(bmp) 504 return (inRange, texture) 505 506 def GetCurrentResourceValueAt(self, phi, theta): 507 if not self.currSphericalHarmonic: 508 return None 509 return builder.GetValueAt(self.currSphericalHarmonic, phi, theta) 510 511 def GenerateSamplePoints(self, sqrtNumSamples): 512 self.LogInfo('GenerateSamplePoints creating', sqrtNumSamples ** 2, 'samples for chart generation') 513 thetaSamples = [] 514 phiSamples = [] 515 scale = 1.0 / (sqrtNumSamples - 1) 516 for b in xrange(sqrtNumSamples): 517 theta = math.pi * b * scale 518 thetaSamples.append(theta) 519 520 for a in xrange(sqrtNumSamples): 521 phi = MATH_2PI * a * scale 522 phiSamples.append(phi) 523 524 return (thetaSamples, phiSamples) 525 526 def ChartResourceLayer(self, resSH): 527 if not hasattr(self, 'thetaSamples'): 528 self.thetaSamples, self.phiSamples = self.GenerateSamplePoints(SQRT_NUM_SAMPLES) 529 data = [] 530 for t in self.thetaSamples: 531 for p in self.phiSamples: 532 value = builder.GetValueAt(resSH, p, t) 533 data.append(value) 534 535 maxValue = max(data) 536 minValue = min(data) 537 d = maxValue - minValue 538 maxIntensity = min(max(maxValue, 0.0), 255.0) / 255.0 539 if d == 0.0: 540 d = 1.0 541 data = map(lambda x: maxIntensity * (x - minValue) / d, data) 542 bmp = trinity.Tr2HostBitmap(PLANET_RESOURCE_TEX_WIDTH, PLANET_RESOURCE_TEX_HEIGHT, 1, trinity.PIXEL_FORMAT.A8_UNORM) 543 bmp.CreateFromHeightData(data, len(self.phiSamples), len(self.thetaSamples)) 544 return bmp 545 546 def SetResourceTexture(self, texture): 547 effect = self.resourceLayer.mesh.transparentAreas[0].effect 548 for resource in effect.resources: 549 if resource.name == 'ResourceDistMap': 550 resource.SetResource(texture) 551 552 def GetResourceDisplayRange(self): 553 defaultResourceDisplayRange = settings.char.ui.Get('planet_resource_display_range', (0.0, 0.5)) 554 return settings.char.ui.Get('planet_resource_display_range_{}'.format(self.planetID), defaultResourceDisplayRange) 555 556 def SetResourceDisplayRange(self, low, hi): 557 settings.char.ui.Set('planet_resource_display_range', (low, hi)) 558 settings.char.ui.Set('planet_resource_display_range_{}'.format(self.planetID), (low, hi)) 559 stretch = 1.0 / (hi - low) 560 offset = -low * stretch 561 if self.planetTransform is not None: 562 if self.resourceLayer is not None: 563 effect = self.resourceLayer.mesh.transparentAreas[0].effect 564 for param in effect.parameters: 565 if param.name == 'HeatStretch': 566 param.value = stretch 567 elif param.name == 'HeatOffset': 568 param.value = offset 569 570 def OpenPlanetCustomsOfficeImportWindow(self, customsOfficeID, spaceportPinID = None): 571 wnd = PlanetaryImportExportUI.GetIfOpen() 572 if wnd: 573 if wnd.customsOfficeID != customsOfficeID or wnd.spaceportPinID != spaceportPinID: 574 wnd.CloseByUser() 575 wnd = None 576 else: 577 wnd.Maximize() 578 if not wnd: 579 PlanetaryImportExportUI.Open(customsOfficeID=customsOfficeID, spaceportPinID=spaceportPinID) 580 581 def OpenUpgradeWindow(self, orbitalID): 582 wnd = OrbitalMaterialUI.GetIfOpen() 583 if wnd: 584 if wnd.orbitalID != orbitalID: 585 wnd.CloseByUser() 586 wnd = None 587 else: 588 wnd.Maximize() 589 if not wnd: 590 OrbitalMaterialUI.Open(orbitalID=orbitalID) 591 592 def OpenConfigureWindow(self, orbitalItem): 593 wnd = OrbitalConfigurationWindow.GetIfOpen() 594 if wnd: 595 if getattr(wnd, 'orbitalID', None) != orbitalItem.itemID: 596 wnd.CloseByUser() 597 wnd = None 598 else: 599 wnd.Maximize() 600 if not wnd: 601 if getattr(orbitalItem, 'locationID', None) is None: 602 orbitalItem.locationID = session.solarsystemid 603 OrbitalConfigurationWindow.Open(orbitalItem=orbitalItem) 604 605 def GetSurveyWindow(self, ecuPinID): 606 wnd = SurveyWindow.Open(ecuPinID=ecuPinID) 607 if wnd.ecuPinID != ecuPinID: 608 self.CloseSurveyWindow() 609 self.myPinManager.EnterSurveyMode(ecuPinID) 610 else: 611 self.EnterSurveyMode(ecuPinID) 612 return SurveyWindow.GetIfOpen() 613 614 def EnterSurveyMode(self, ecuPinID): 615 if self.IsModeControllerPresent(): 616 self.modeController.resourceControllerTab.EnterSurveyMode() 617 618 def ExitSurveyMode(self): 619 if self.IsModeControllerPresent(): 620 self.modeController.resourceControllerTab.ExitSurveyMode() 621 self.myPinManager.LockHeads() 622 623 def CloseSurveyWindow(self): 624 SurveyWindow.CloseIfOpen() 625 626 def GMShowResource(self, resourceTypeID, layer): 627 self.LogInfo('GMShowResource', resourceTypeID, layer) 628 planet = sm.GetService('planetSvc').GetPlanet(self.planetID) 629 data = planet.remoteHandler.GMGetCompleteResource(resourceTypeID, layer) 630 sh = builder.CreateSHFromBuffer(data.data, data.numBands) 631 self.ShowSH(sh, scaleIt=layer == 'base') 632 633 def ShowSH(self, sh, scaleIt = True): 634 if scaleIt: 635 builder.ScaleSH(sh, 1.0 / const.planetResourceMaxValue) 636 bmp = self.ChartResourceLayer(sh) 637 texture = trinity.TriTextureRes() 638 texture.CreateFromHostBitmap(bmp) 639 if self.planetTransform is not None: 640 self.EnableResourceLayer() 641 self.SetResourceTexture(texture) 642 643 def GMCreateNuggetLayer(self, typeID): 644 self.planet.remoteHandler.GMCreateNuggetLayer(self.planetID, typeID) 645 self.GMShowResource(typeID, 'nuggets') 646 647 def SetPlanet(self, planetID = None): 648 pID = planetID 649 if pID is None: 650 pID = self.planetID 651 self.planet = sm.GetService('planetSvc').GetPlanet(pID) 652 self.planet.StartTicking() 653 654 def OpenContainer(self, pin, panelID = None): 655 containerCls = self._GetPinContainerClass(pin.typeID) 656 self.currentContainer = containerCls(pin=pin, panelID=panelID) 657 658 def _GetPinContainerClass(self, typeID): 659 groupID = evetypes.GetGroupID(typeID) 660 containerCls = containerClsByPinType[groupID] 661 return containerCls 662 663 def GetCurrContainerPanelID(self): 664 if not self.currentContainer: 665 return 666 return self.currentContainer.GetPanelID() 667 668 def OpenContainerLink(self, link, panelID = None): 669 self.currentContainer = LinkContainer(pin=link, panelID=panelID) 670 671 def CloseCurrentlyOpenPinContainer(self): 672 if not self.currentContainer: 673 return 674 panelID = self.GetCurrContainerPanelID() 675 self.currentContainer.updateInfoContTimer.KillTimer() 676 self.currentContainer.Close() 677 self.currentContainer = None 678 return panelID 679 680 def CloseCurrentlyOpenPinContainerIfOpen(self, pinID): 681 if self.currentContainer and self.currentContainer.GetID() == pinID: 682 self.CloseCurrentlyOpenPinContainer() 683 684 def FocusCameraOnCommandCenter(self): 685 self.planetNav.OrbitToCommandCenter() 686 687 def OnPlanetZoomChanged(self, zoom): 688 self.curveLineDrawer.ChangeLineSetWidth('links', 1.1 - zoom) 689 690 def VerifySimulation(self): 691 self.planet.GMVerifySimulation() 692 693 def GetLocalDistributionReport(self, surfacePoint): 694 report = self.planet.GetLocalDistributionReport(surfacePoint) 695 reportRows = [] 696 for k in report['base'].keys(): 697 reportRows.append(localization.GetByLabel('UI/PI/Planet/LocalDistributionReportRow', item=k, itemID=k, base=report['base'][k], quality=report['quality'][k], deplete=report['deplete'][k], final=report['final'][k], raw=report['raw'][k])) 698 699 txtMsg = localization.GetByLabel('UI/PI/Planet/LocalDistributionReport', latitude=math.degrees(surfacePoint.phi), longitude=math.degrees(surfacePoint.theta), reportRows='<br>'.join(reportRows)) 700 uthread.new(prompt_player_fsd_dialog, 'CustomInfo', {'info': txtMsg}).context = 'gameui.ServerMessage' 701 702 def AddDepletionPoint(self, point): 703 self.myPinManager.AddDepletionPoint(point) 704 705 def CancelInstallProgram(self, pinID, pinData): 706 currentPlanet = self.GetCurrentPlanet() 707 if currentPlanet is None: 708 return 709 pin = currentPlanet.CancelInstallProgram(pinID, pinData) 710 if pin is not None: 711 self.myPinManager.ReRenderPin(pin) 712 self.eventManager.SetStateNormal() 713 714 def LoadSpherePinResources(self, spherePin, textureName): 715 self.spherePinsPendingLoad.append((spherePin, textureName)) 716 if not self.spherePinLoadThread: 717 self.spherePinLoadThread = uthread.new(self._LoadSpherePinResources) 718 719 def _LoadEffectResource(self, effect): 720 if effect.effectResource.isPrepared: 721 return 722 if not effect.effectResource.isLoading: 723 effect.effectResource.Reload() 724 while not effect.effectResource.isPrepared: 725 blue.synchro.Yield() 726 727 def _LoadSpherePinResources(self): 728 while self.spherePinsPendingLoad: 729 spherePin, textureName = self.spherePinsPendingLoad.pop() 730 self._LoadEffectResource(spherePin.pinEffect) 731 spherePin.pinEffect.PopulateParameters() 732 for res in spherePin.pinEffect.resources: 733 if res.name == 'Layer1Map': 734 res.resourcePath = textureName 735 elif res.name == 'Layer2Map': 736 res.resourcePath = 'res:/dx9/texture/UI/pinCircularRamp.dds' 737 738 self._LoadEffectResource(spherePin.pickEffect) 739 spherePin.pickEffect.PopulateParameters() 740 for res in spherePin.pickEffect.resources: 741 if res.name == 'Layer1Map': 742 res.resourcePath = textureName 743 744 spherePin.pinColor = spherePin.pinColor 745 spherePin.geometryResPath = 'res:/dx9/model/worldobject/planet/PlanetSphere.gr2' 746 747 self.spherePinLoadThread = None 748 749 def StopSpherePinLoadThread(self): 750 if self.spherePinLoadThread: 751 self.spherePinLoadThread.kill() 752 self.spherePinLoadThread = None 753 754 def EnteredEditMode(self, planetID): 755 if self.planetID != planetID: 756 return 757 self.inEditMode = True 758 if self.myPinManager is not None: 759 self.myPinManager.OnPlanetEnteredEditMode() 760 761 def ExitedEditMode(self, planetID): 762 if self.planetID != planetID: 763 return 764 self.inEditMode = False 765 if self.myPinManager is not None: 766 self.myPinManager.OnPlanetExitedEditMode()