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

vectorlinetrace.py (10331B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\primitives\vectorlinetrace.py
      2 import math
      3 from math import cos, sin
      4 import trinity
      5 import geo2
      6 from carbonui import uiconst
      7 from carbonui.primitives.sprite import TexturedBase
      8 from carbonui.uicore import uicore
      9 from carbonui.util import colorblind
     10 CORNERTYPE_MITER = 0
     11 CORNERTYPE_ROUND = 1
     12 CORNERTYPE_NONE = 2
     13 
     14 class VectorLineTrace(TexturedBase):
     15     __renderObject__ = trinity.Tr2Sprite2dLineTrace
     16     default_align = uiconst.TOPLEFT
     17     default_lineWidth = 1.0
     18     default_spriteEffect = trinity.TR2_SFX_FILL_AA
     19     default_textureWidth = 1.0
     20     default_cornerType = CORNERTYPE_MITER
     21     default_start = 0.0
     22     default_end = 1.0
     23     default_isLoop = False
     24 
     25     def ApplyAttributes(self, attributes):
     26         TexturedBase.ApplyAttributes(self, attributes)
     27         self.lineWidth = attributes.get('lineWidth', self.default_lineWidth)
     28         self.textureWidth = attributes.get('textureWidth', self.default_textureWidth)
     29         self.cornerType = attributes.get('cornerType', self.default_cornerType)
     30         self.start = attributes.get('start', self.default_start)
     31         self.end = attributes.get('end', self.default_end)
     32         self.isLoop = attributes.get('isLoop', self.default_isLoop)
     33         points = attributes.points
     34         if points:
     35             for point in points:
     36                 self.AddPoint(*point)
     37 
     38     def Close(self):
     39         self.Flush()
     40         super(VectorLineTrace, self).Close()
     41 
     42     @property
     43     def lineWidth(self):
     44         return self._lineWidth
     45 
     46     @lineWidth.setter
     47     def lineWidth(self, value):
     48         self._lineWidth = value
     49         if self.renderObject:
     50             self.renderObject.lineWidth = uicore.ScaleDpiF(value)
     51 
     52     @property
     53     def isLoop(self):
     54         return self.renderObject.isLoop
     55 
     56     @isLoop.setter
     57     def isLoop(self, value):
     58         self.renderObject.isLoop = value
     59 
     60     @property
     61     def cornerType(self):
     62         return self.renderObject.cornerType
     63 
     64     @cornerType.setter
     65     def cornerType(self, value):
     66         self.renderObject.cornerType = value
     67 
     68     @property
     69     def start(self):
     70         if self.renderObject:
     71             return self.renderObject.start
     72         else:
     73             return 0.0
     74 
     75     @start.setter
     76     def start(self, value):
     77         if self.renderObject:
     78             self.renderObject.start = value
     79 
     80     @property
     81     def end(self):
     82         if self.renderObject:
     83             return self.renderObject.end
     84         else:
     85             return 1.0
     86 
     87     @end.setter
     88     def end(self, value):
     89         if self.renderObject:
     90             self.renderObject.end = value
     91 
     92     @property
     93     def textureWidth(self):
     94         if not self.renderObject:
     95             return
     96         return self.renderObject.textureWidth
     97 
     98     @textureWidth.setter
     99     def textureWidth(self, value):
    100         if not self.renderObject:
    101             return
    102         self.renderObject.textureWidth = value
    103 
    104     @property
    105     def textureOffset(self):
    106         if not self.renderObject:
    107             return
    108         return self.renderObject.textureOffset
    109 
    110     @textureOffset.setter
    111     def textureOffset(self, value):
    112         if not self.renderObject:
    113             return
    114         self.renderObject.textureOffset = value
    115 
    116     def AddPoint(self, pos, color = (1.0, 1.0, 1.0, 1.0), name = '', idx = -1):
    117         color = colorblind.CheckReplaceColor(color)
    118         v = trinity.Tr2Sprite2dLineTraceVertex()
    119         x, y = pos
    120         x = uicore.ScaleDpiF(x)
    121         y = uicore.ScaleDpiF(y)
    122         v.position = (x, y)
    123         v.color = color
    124         v.name = name
    125         if self.renderObject:
    126             self.renderObject.vertices.insert(idx, v)
    127 
    128     def AddPoints(self, posList, color = (1.0, 1.0, 1.0, 1.0)):
    129         for pos in posList:
    130             self.AddPoint(pos, color)
    131 
    132     def UpdatePoint(self, index, x, y):
    133         positions = []
    134         transform = None
    135         colors = []
    136         for order, vertex in enumerate(self.renderObject.vertices):
    137             if index == order:
    138                 positions.append((uicore.ScaleDpiF(x), uicore.ScaleDpiF(y)))
    139             else:
    140                 positions.append(vertex.position)
    141             colors.append(vertex.color)
    142 
    143         self.Flush()
    144         self.renderObject.AppendVertices(positions, transform, colors)
    145 
    146     def RemovePoint(self, index):
    147         positions = []
    148         transform = None
    149         colors = []
    150         for order, vertex in enumerate(self.renderObject.vertices):
    151             if index != order:
    152                 positions.append(vertex.position)
    153                 colors.append(vertex.color)
    154 
    155         self.Flush()
    156         self.renderObject.AppendVertices(positions, transform, colors)
    157 
    158     def SetTexturePath(self, texturePath):
    159         TexturedBase.SetTexturePath(self, texturePath)
    160         if self.texturePath:
    161             self.renderObject.texturePrimary.atlasTexture.isStandAlone = True
    162 
    163     texturePath = property(TexturedBase.GetTexturePath, SetTexturePath)
    164 
    165     def Flush(self):
    166         if self.renderObject:
    167             del self.renderObject.vertices[:]
    168 
    169     def _ApplyColorblindCorrection(self, colors):
    170         if colors:
    171             if isinstance(colors[0], (float, int)):
    172                 colors = colorblind.CheckReplaceColor(colors)
    173             else:
    174                 colors = [ colorblind.CheckReplaceColor(color) for color in colors ]
    175         return colors
    176 
    177     def AppendVertices(self, positions, transform, colors):
    178         colors = self._ApplyColorblindCorrection(colors)
    179         self.renderObject.AppendVertices(positions, transform, colors)
    180 
    181     def UpdateUIScaling(self, value, oldValue):
    182         positions = []
    183         colors = []
    184         multiplier = value / oldValue
    185         for vertex in self.renderObject.vertices:
    186             x, y = vertex.position
    187             positions.append((multiplier * x, multiplier * y))
    188             colors.append(vertex.color)
    189 
    190         self.Flush()
    191         self.renderObject.AppendVertices(positions, None, colors)
    192         self.lineWidth = self._lineWidth
    193 
    194 
    195 class DashedCircle(VectorLineTrace):
    196     demoCount = 0
    197     default_smoothScale = 4
    198 
    199     def ApplyAttributes(self, attributes):
    200         VectorLineTrace.ApplyAttributes(self, attributes)
    201         self.dashCount = attributes.dashCount or 5
    202         self._dashSizeFactor = attributes.dashSizeFactor or 2.0
    203         self.startAngle = attributes.startAngle or math.radians(180.0)
    204         self.range = attributes.range or math.radians(180.0)
    205         self._radius = attributes.radius or 60
    206         self.lineWidth = attributes.lineWidth or 7
    207         self.startColor = attributes.startColor or (1, 1, 1, 1)
    208         self.endColor = attributes.endColor or (1, 1, 1, 1)
    209         self.gapEnds = attributes.gapEnds or True
    210         self.smoothScale = attributes.smoothScale or self.default_smoothScale
    211         self.PlotLineTrace()
    212 
    213     @property
    214     def radius(self):
    215         return self._radius
    216 
    217     @radius.setter
    218     def radius(self, newRadius):
    219         self._radius = newRadius
    220         self.Flush()
    221         self.PlotLineTrace()
    222 
    223     @property
    224     def dashSizeFactor(self):
    225         return self._dashSizeFactor
    226 
    227     @dashSizeFactor.setter
    228     def dashSizeFactor(self, newDashSize):
    229         self._dashSizeFactor = newDashSize
    230         self.Flush()
    231         self.PlotLineTrace()
    232 
    233     def SetValue(self, value):
    234         self.end = value
    235 
    236     def SetValueTimed(self, value, duration):
    237         uicore.animations.MorphScalar(self, 'end', self.end, value, duration=duration, curveType=uiconst.ANIM_LINEAR)
    238 
    239     def ValueDown(self):
    240         self.demoCount += 1
    241         if self.demoCount < 2:
    242             uicore.animations.MorphScalar(self, 'end', 1.0, 0.0, duration=2.0, callback=self.ValueUp)
    243 
    244     def ValueUp(self):
    245         uicore.animations.MorphScalar(self, 'end', 0.0, 1.0, duration=2.0, callback=self.ValueDown)
    246 
    247     def PlotLineTrace(self):
    248         circum = self.radius * self.range
    249         if self.gapEnds:
    250             gapStepRad = self.range / (self.dashCount * (self.dashSizeFactor + 1))
    251         else:
    252             gapStepRad = self.range / (self.dashCount * (self.dashSizeFactor + 1) - 1)
    253         dashStepRad = gapStepRad * self.dashSizeFactor
    254         pixelRad = self.range / circum
    255         centerOffset = self.radius + self.lineWidth * 0.5
    256         jointOffset = min(gapStepRad / 3, pixelRad / 2)
    257         rot = self.startAngle
    258         if self.gapEnds:
    259             rot += gapStepRad / 2
    260         for i in xrange(self.dashCount):
    261             point = (centerOffset + self.radius * cos(rot - jointOffset), centerOffset + self.radius * sin(rot - jointOffset))
    262             dashColor = geo2.Vec4Lerp(self.startColor, self.endColor, (rot - jointOffset - self.startAngle) / self.range)
    263             r, g, b, a = dashColor
    264             self.AddPoint(point, (r,
    265              g,
    266              b,
    267              0.0))
    268             point = (centerOffset + self.radius * cos(rot + jointOffset), centerOffset + self.radius * sin(rot + jointOffset))
    269             dashColor = geo2.Vec4Lerp(self.startColor, self.endColor, (rot + jointOffset - self.startAngle) / self.range)
    270             self.AddPoint(point, dashColor)
    271             smoothRad = pixelRad * self.smoothScale + jointOffset
    272             while smoothRad < dashStepRad - jointOffset:
    273                 point = (centerOffset + self.radius * cos(rot + smoothRad), centerOffset + self.radius * sin(rot + smoothRad))
    274                 dashColor = geo2.Vec4Lerp(self.startColor, self.endColor, (rot + smoothRad - self.startAngle) / self.range)
    275                 self.AddPoint(point, dashColor)
    276                 smoothRad += pixelRad * self.smoothScale
    277 
    278             rot += dashStepRad
    279             point = (centerOffset + self.radius * cos(rot - jointOffset), centerOffset + self.radius * sin(rot - jointOffset))
    280             dashColor = geo2.Vec4Lerp(self.startColor, self.endColor, (rot - jointOffset - self.startAngle) / self.range)
    281             self.AddPoint(point, dashColor)
    282             point = (centerOffset + self.radius * cos(rot + jointOffset), centerOffset + self.radius * sin(rot + jointOffset))
    283             dashColor = geo2.Vec4Lerp(self.startColor, self.endColor, (rot + jointOffset - self.startAngle) / self.range)
    284             r, g, b, a = dashColor
    285             self.AddPoint(point, (r,
    286              g,
    287              b,
    288              0.0))
    289             rot += gapStepRad
    290 
    291         self.width = self.height = centerOffset * 2