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