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