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

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