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

solarSystemMapIcon.py (8683B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\maps\solarSystemMapIcon.py
      2 import collections
      3 import geo2
      4 import carbonui.const as uiconst
      5 import inventorycommon
      6 import trinity
      7 from carbonui.primitives import vectorarc
      8 from carbonui.primitives.container import Container
      9 from carbonui.primitives.sprite import Sprite
     10 from eve.common.lib import appConst
     11 from eve.client.script.ui.shared.maps.map2D import Map2D
     12 SIZE_DOTS = 6
     13 DRAW_REGIONS = 1
     14 DRAW_CONSTELLATIONS = 2
     15 DRAW_SOLARSYSTEMS = 3
     16 DRAW_SOLARSYSTEM_INTERIOR = 4
     17 FLIPMAP = -1
     18 Map2DCelestialItemInfoType = collections.namedtuple('Map2DItemInfoType', ['itemID',
     19  'typeID',
     20  'orbitID',
     21  'orbitIndex',
     22  'celestialIndex',
     23  'locationID',
     24  'groupID',
     25  'x',
     26  'y',
     27  'z'])
     28 
     29 def GetMap2DItemsForSolarSystem(solarSystemID):
     30     items = []
     31     try:
     32         solarSystemItems = cfg.mapSolarSystemContentCache[solarSystemID]
     33     except (IndexError, KeyError):
     34         return []
     35 
     36     for stargateID, stargate in solarSystemItems.stargates.iteritems():
     37         items.append(Map2DCelestialItemInfoType(itemID=stargateID, orbitID=1, orbitIndex=1, locationID=solarSystemID, celestialIndex=0, groupID=appConst.groupStargate, typeID=stargate.typeID, x=stargate.position.x, y=stargate.position.y, z=stargate.position.z))
     38 
     39     for planetID, planet in solarSystemItems.planets.iteritems():
     40         items.append(Map2DCelestialItemInfoType(itemID=planetID, orbitID=1, orbitIndex=1, locationID=solarSystemID, celestialIndex=planet.celestialIndex, groupID=appConst.groupPlanet, typeID=planet.typeID, x=planet.position.x, y=planet.position.y, z=planet.position.z))
     41         asteroidBelts = getattr(planet, 'asteroidBelts', {})
     42         for asteroidBeltID, asteroidBelt in asteroidBelts.iteritems():
     43             items.append(Map2DCelestialItemInfoType(itemID=asteroidBeltID, orbitID=planetID, orbitIndex=1, celestialIndex=planet.celestialIndex, locationID=solarSystemID, groupID=9, typeID=asteroidBelt.typeID, x=asteroidBelt.position.x, y=asteroidBelt.position.y, z=asteroidBelt.position.z))
     44 
     45         npcStations = getattr(planet, 'npcStations', {})
     46         for npcStationID, npcStation in npcStations.iteritems():
     47             items.append(Map2DCelestialItemInfoType(itemID=npcStationID, orbitID=planetID, orbitIndex=1, celestialIndex=planet.celestialIndex, locationID=solarSystemID, groupID=appConst.groupStation, typeID=npcStation.typeID, x=npcStation.position.x, y=npcStation.position.y, z=npcStation.position.z))
     48 
     49         moons = getattr(planet, 'moons', {})
     50         for moonID, moon in moons.iteritems():
     51             items.append(Map2DCelestialItemInfoType(itemID=moonID, orbitID=planetID, orbitIndex=1, locationID=solarSystemID, celestialIndex=planet.celestialIndex, groupID=appConst.groupMoon, typeID=moon.typeID, x=moon.position.x, y=moon.position.y, z=moon.position.z))
     52             asteroidBelts = getattr(moon, 'asteroidBelts', {})
     53             for asteroidBeltID, asteroidBelt in asteroidBelts.iteritems():
     54                 items.append(Map2DCelestialItemInfoType(itemID=asteroidBeltID, orbitID=moonID, orbitIndex=1, celestialIndex=planet.celestialIndex, locationID=solarSystemID, groupID=9, typeID=asteroidBelt.typeID, x=asteroidBelt.position.x, y=asteroidBelt.position.y, z=asteroidBelt.position.z))
     55 
     56             npcStations = getattr(moon, 'npcStations', {})
     57             for npcStationID, npcStation in npcStations.iteritems():
     58                 items.append(Map2DCelestialItemInfoType(itemID=npcStationID, orbitID=planetID, orbitIndex=1, celestialIndex=planet.celestialIndex, locationID=solarSystemID, groupID=appConst.groupStation, typeID=npcStation.typeID, x=npcStation.position.x, y=npcStation.position.y, z=npcStation.position.z))
     59 
     60     return items
     61 
     62 
     63 class SolarSystemMapIcon(Container):
     64 
     65     def ApplyAttributes(self, attributes):
     66         Container.ApplyAttributes(self, attributes)
     67         self.fillSize = 0.8
     68         self.solarSystemID = None
     69 
     70     def Draw(self, solarSystemID, size):
     71         self.solarSystemID = solarSystemID
     72         mapitems = GetMap2DItemsForSolarSystem(solarSystemID)
     73         self.DrawSolarsystem(mapitems, size)
     74 
     75     def DrawSolarsystem(self, mapitems, size):
     76         if not len(mapitems):
     77             return
     78         planets = []
     79         stargates = []
     80         asteroidbelts = []
     81         for item in mapitems:
     82             if item.groupID == appConst.groupPlanet:
     83                 planets.append(item)
     84             elif item.groupID == appConst.groupStargate:
     85                 stargates.append(item)
     86             elif item.groupID == appConst.groupAsteroidBelt:
     87                 asteroidbelts.append(item)
     88 
     89         cords = {}
     90         self.size = size
     91         maxdist = self._GetMaxDistance(mapitems)
     92         self.sizefactor = size / 2 / maxdist * self.fillSize
     93         self._DrawSun()
     94         for i, item in enumerate(planets):
     95             self._DrawPlanet(cords, item)
     96 
     97         for orbit in planets:
     98             if orbit.itemID in cords:
     99                 self._DrawOrbit(cords, orbit)
    100 
    101         for item in stargates:
    102             self._DrawStargate(cords, item)
    103 
    104     def _DrawSun(self):
    105         star = cfg.mapSolarSystemContentCache[self.solarSystemID].star
    106         gfx = inventorycommon.typeHelpers.GetGraphic(star.typeID)
    107         if hasattr(gfx, 'emissiveColor') and gfx.emissiveColor:
    108             color = tuple(gfx.emissiveColor)
    109         else:
    110             color = (1, 1, 1, 1)
    111         size = self.size * 0.4
    112         Sprite(parent=self, align=uiconst.CENTER, width=size, height=size, texturePath='res:/UI/Texture/shared/circularGradient2.png', state=uiconst.UI_DISABLED, color=color, opacity=0.03, blendMode=trinity.TR2_SBM_ADD)
    113 
    114     def _GetMaxDistance(self, mapitems):
    115         for item in mapitems:
    116             pos = (item.x, 0.0, item.z)
    117             maxdist = geo2.Vec3Length(pos)
    118 
    119         return maxdist
    120 
    121     def _DrawStargate(self, cords, item):
    122         x = FLIPMAP * self.sizefactor * item.x + self.size / 2 + 6
    123         y = self.sizefactor * item.z + self.size / 2
    124         radius = 1
    125         Sprite(parent=self, align=uiconst.TOPLEFT, left=x - 4, top=self.size - y - 4, width=SIZE_DOTS, height=SIZE_DOTS, texturePath='res:/UI/Texture/classes/graph/point.png', state=uiconst.UI_DISABLED, color=self.GetColorByGroupID(appConst.groupStargate))
    126         cords[item.itemID] = (x, self.size - y, radius)
    127 
    128     def _DrawOrbit(self, cords, orbit):
    129         x, y, radius = cords[orbit.itemID]
    130         center = self.size / 2
    131         frompos = geo2.Vector(float(center), 0.0, float(center))
    132         topos = geo2.Vector(float(x), 0.0, float(y))
    133         diff = topos - frompos
    134         rad = int(geo2.Vec3Length(diff))
    135         vectorarc.VectorArc(parent=self, align=uiconst.TOPLEFT, radius=rad, fill=False, left=center, lineWidth=1, top=center, width=self.size, height=self.size, color=self.GetColorByGroupID(appConst.groupPlanet), spriteEffect=trinity.TR2_SFX_FILL_AA)
    136 
    137     def _DrawPlanet(self, cords, item):
    138         pos = (item.x, 0.0, item.z)
    139         x = FLIPMAP * pos[0] * self.sizefactor + self.size / 2
    140         y = pos[2] * self.sizefactor + self.size / 2
    141         radius = 1
    142         cords[item.itemID] = (x, self.size - y, radius)
    143         Sprite(parent=self, align=uiconst.TOPLEFT, left=x - 4, top=self.size - y - 4, width=SIZE_DOTS, height=SIZE_DOTS, texturePath='res:/UI/Texture/classes/graph/point.png', state=uiconst.UI_DISABLED, color=self.GetColorByGroupID(appConst.groupPlanet))
    144 
    145     def GetChilds(self, parentID, childs, i):
    146         i += 1
    147         if i == 20 or len(childs) > 1000:
    148             return childs
    149         _childs = [ child for child in self.mapitems if child.orbitID == parentID and child not in childs ]
    150         if len(_childs):
    151             childs += _childs
    152             for granchild in _childs:
    153                 childs = self.GetChilds(granchild.itemID, childs, i)
    154 
    155         return childs
    156 
    157     def GetColorByGroupID(self, groupID):
    158         col = {appConst.groupAsteroidBelt: (0, 0, 1),
    159          appConst.groupPlanet: (0.53, 0.53, 0.53),
    160          appConst.groupStargate: (0, 0.53, 0),
    161          appConst.groupStation: (1, 0.2, 0.2)}.get(groupID, (0.6, 0.6, 0.6))
    162         return col
    163 
    164 
    165 class _MapIcon(Container):
    166     default_clipChildren = True
    167     map_level = None
    168 
    169     def __init__(self, location_id, size = 64, lineColors = None, dotColor = None, dotSizeMultiplier = None, **kwargs):
    170         super(_MapIcon, self).__init__(width=size, height=size, **kwargs)
    171         ssmap = Map2D()
    172         ssmap.Draw([location_id], self.map_level, self.map_level + 1, size - 4, self, lineColors=lineColors, dotColor=dotColor, dotSizeMultiplier=dotSizeMultiplier)
    173 
    174 
    175 class ConstellationMapIcon(_MapIcon):
    176     map_level = 2
    177 
    178 
    179 class RegionMapIcon(_MapIcon):
    180     map_level = 1