polygon.py (13815B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\primitives\polygon.py 2 import math 3 import carbonui.const as uiconst 4 from carbonui.primitives.sprite import TexturedBase 5 from carbonui.util import colorblind 6 import mathext 7 import trinity 8 9 class Polygon(TexturedBase): 10 __renderObject__ = trinity.Tr2Sprite2dPolygon 11 default_name = 'polygon' 12 default_color = (1, 1, 1, 1) 13 default_spriteEffect = trinity.TR2_SFX_FILL 14 default_state = uiconst.UI_DISABLED 15 16 def Flush(self): 17 ro = self.GetRenderObject() 18 del ro.triangles[:] 19 del ro.vertices[:] 20 21 def MakeArc(self, radius = 32.0, outerRadius = 66.0, segments = 12, fromDeg = 0.0, toDeg = 90.0, innerColor = default_color, outerColor = default_color, feather = 3.0): 22 self.Flush() 23 ro = self.GetRenderObject() 24 segmentStep = (toDeg - fromDeg) / float(segments) 25 TRANSPCOLOR = (0, 0, 0, 0) 26 for i in xrange(segments + 1): 27 a = math.radians(fromDeg + i * segmentStep) 28 x = math.cos(a) 29 y = math.sin(a) 30 innerVertex = trinity.Tr2Sprite2dVertex() 31 innerVertex.position = (x * radius, y * radius) 32 innerVertex.color = innerColor 33 ro.vertices.append(innerVertex) 34 outerVertex = trinity.Tr2Sprite2dVertex() 35 outerVertex.position = (x * outerRadius, y * outerRadius) 36 outerVertex.color = outerColor 37 ro.vertices.append(outerVertex) 38 39 for i in xrange(segments * 2): 40 triangle = trinity.Tr2Sprite2dTriangle() 41 triangle.index0 = i 42 triangle.index1 = i + 1 43 triangle.index2 = i + 2 44 ro.triangles.append(triangle) 45 46 if feather: 47 shift = len(ro.vertices) 48 for i in xrange(segments + 1): 49 a = math.radians(fromDeg + i * segmentStep) 50 x = math.cos(a) 51 y = math.sin(a) 52 innerFeatherVertex = trinity.Tr2Sprite2dVertex() 53 innerFeatherVertex.position = (x * (radius - feather), y * (radius - feather)) 54 innerFeatherVertex.color = TRANSPCOLOR 55 ro.vertices.append(innerFeatherVertex) 56 outerFeatherVertex = trinity.Tr2Sprite2dVertex() 57 outerFeatherVertex.position = (x * (outerRadius + feather), y * (outerRadius + feather)) 58 outerFeatherVertex.color = TRANSPCOLOR 59 ro.vertices.append(outerFeatherVertex) 60 61 for i in xrange(segments * 2): 62 triangle = trinity.Tr2Sprite2dTriangle() 63 triangle.index0 = i 64 triangle.index1 = shift + i 65 triangle.index2 = shift + i + 2 66 ro.triangles.append(triangle) 67 triangle = trinity.Tr2Sprite2dTriangle() 68 triangle.index0 = shift + i + 2 69 triangle.index1 = i + 2 70 triangle.index2 = i 71 ro.triangles.append(triangle) 72 73 def MakeCircle(self, radius = 64.0, segments = 12, centerColor = default_color, edgeColor = default_color): 74 ro = self.GetRenderObject() 75 del ro.triangles[:] 76 del ro.vertices[:] 77 centerVertex = trinity.Tr2Sprite2dVertex() 78 centerVertex.position = (radius, radius) 79 centerVertex.color = centerColor 80 centerVertex.texCoord0 = (0.5, 0.5) 81 centerVertex.texCoord1 = (0.5, 0.5) 82 ro.vertices.append(centerVertex) 83 for i in xrange(segments): 84 a = math.pi * 2.0 / float(segments) * float(i) 85 x = math.cos(a) 86 y = math.sin(a) 87 edgeVertex = trinity.Tr2Sprite2dVertex() 88 edgeVertex.position = (x * radius + radius, y * radius + radius) 89 edgeVertex.color = edgeColor 90 edgeVertex.texCoord0 = (x * 0.5 + 0.5, y * 0.5 + 0.5) 91 edgeVertex.texCoord1 = edgeVertex.texCoord0 92 ro.vertices.append(edgeVertex) 93 94 for i in xrange(segments - 1): 95 triangle = trinity.Tr2Sprite2dTriangle() 96 triangle.index0 = 0 97 triangle.index1 = i + 1 98 triangle.index2 = i + 2 99 ro.triangles.append(triangle) 100 101 triangle = trinity.Tr2Sprite2dTriangle() 102 triangle.index0 = 0 103 triangle.index1 = segments 104 triangle.index2 = 1 105 ro.triangles.append(triangle) 106 107 def MakeRectangle(self, topLeft = (0, 0), topLeftColor = (1, 1, 1, 1), topRight = (64, 0), topRightColor = (1, 1, 1, 1), bottomRight = (64, 64), bottomRightColor = (1, 1, 1, 1), bottomLeft = (0, 64), bottomLeftColor = (1, 1, 1, 1)): 108 ro = self.GetRenderObject() 109 del ro.triangles[:] 110 del ro.vertices[:] 111 vertex = trinity.Tr2Sprite2dVertex() 112 vertex.position = topLeft 113 vertex.color = topLeftColor 114 vertex.SetTexCoord(0, (0, 0)) 115 vertex.SetTexCoord(1, (0, 0)) 116 ro.vertices.append(vertex) 117 vertex = trinity.Tr2Sprite2dVertex() 118 vertex.position = topRight 119 vertex.color = topRightColor 120 vertex.SetTexCoord(0, (1, 0)) 121 vertex.SetTexCoord(1, (1, 0)) 122 ro.vertices.append(vertex) 123 vertex = trinity.Tr2Sprite2dVertex() 124 vertex.position = bottomRight 125 vertex.color = bottomRightColor 126 vertex.SetTexCoord(0, (1, 1)) 127 vertex.SetTexCoord(1, (1, 1)) 128 ro.vertices.append(vertex) 129 vertex = trinity.Tr2Sprite2dVertex() 130 vertex.position = bottomLeft 131 vertex.color = bottomLeftColor 132 vertex.SetTexCoord(0, (0, 1)) 133 vertex.SetTexCoord(1, (0, 1)) 134 ro.vertices.append(vertex) 135 triangle = trinity.Tr2Sprite2dTriangle() 136 triangle.index0 = 0 137 triangle.index1 = 1 138 triangle.index2 = 2 139 ro.triangles.append(triangle) 140 triangle = trinity.Tr2Sprite2dTriangle() 141 triangle.index0 = 0 142 triangle.index1 = 2 143 triangle.index2 = 3 144 ro.triangles.append(triangle) 145 146 def MakeTriangle(self, pos1, pos2, pos3, color): 147 ro = self.GetRenderObject() 148 del ro.triangles[:] 149 del ro.vertices[:] 150 vertex = trinity.Tr2Sprite2dVertex() 151 vertex.position = pos1 152 vertex.color = color 153 vertex.SetTexCoord(0, (0, 0)) 154 vertex.SetTexCoord(1, (0, 0)) 155 ro.vertices.append(vertex) 156 vertex = trinity.Tr2Sprite2dVertex() 157 vertex.position = pos2 158 vertex.color = color 159 vertex.SetTexCoord(0, (1, 0)) 160 vertex.SetTexCoord(1, (1, 0)) 161 ro.vertices.append(vertex) 162 vertex = trinity.Tr2Sprite2dVertex() 163 vertex.position = pos3 164 vertex.color = color 165 vertex.SetTexCoord(0, (1, 1)) 166 vertex.SetTexCoord(1, (1, 1)) 167 ro.vertices.append(vertex) 168 triangle = trinity.Tr2Sprite2dTriangle() 169 triangle.index0 = 0 170 triangle.index1 = 1 171 triangle.index2 = 2 172 ro.triangles.append(triangle) 173 174 def MakeGradient(self, width = 256, height = 256, colorPoints = [(0, (0, 0, 0, 1)), (1, (1, 1, 1, 1))], rotation = 0): 175 ro = self.GetRenderObject() 176 del ro.triangles[:] 177 del ro.vertices[:] 178 startPoint = colorPoints[0] 179 startValue = startPoint[0] 180 startColor = startPoint[1] 181 topLeft = (startValue, 0) 182 bottomLeft = (startValue, height) 183 vertex = trinity.Tr2Sprite2dVertex() 184 vertex.position = topLeft 185 vertex.color = startColor 186 vertex.texCoord0 = (0, 0) 187 vertex.texCoord1 = (0, 0) 188 ro.vertices.append(vertex) 189 vertex = trinity.Tr2Sprite2dVertex() 190 vertex.position = bottomLeft 191 vertex.color = startColor 192 vertex.texCoord0 = (0, 1) 193 vertex.texCoord1 = (0, 1) 194 ro.vertices.append(vertex) 195 baseIx = 0 196 for i in xrange(len(colorPoints) - 1): 197 endPoint = colorPoints[i + 1] 198 endValue = endPoint[0] 199 endColor = endPoint[1] 200 topLeft = (endValue * width, 0) 201 bottomLeft = (endValue * width, height) 202 vertex = trinity.Tr2Sprite2dVertex() 203 vertex.position = topLeft 204 vertex.color = endColor 205 vertex.texCoord0 = (endValue, 0) 206 vertex.texCoord1 = (endValue, 0) 207 ro.vertices.append(vertex) 208 vertex = trinity.Tr2Sprite2dVertex() 209 vertex.position = bottomLeft 210 vertex.color = endColor 211 vertex.texCoord0 = (endValue, 1) 212 vertex.texCoord1 = (endValue, 1) 213 ro.vertices.append(vertex) 214 triangle = trinity.Tr2Sprite2dTriangle() 215 triangle.index0 = baseIx + 0 216 triangle.index1 = baseIx + 1 217 triangle.index2 = baseIx + 2 218 ro.triangles.append(triangle) 219 triangle = trinity.Tr2Sprite2dTriangle() 220 triangle.index0 = baseIx + 1 221 triangle.index1 = baseIx + 2 222 triangle.index2 = baseIx + 3 223 ro.triangles.append(triangle) 224 baseIx += 2 225 startValue = endValue 226 startColor = endColor 227 228 def MakeSegmentedRectangle(self, segments, tex): 229 ro = self.GetRenderObject() 230 del ro.triangles[:] 231 del ro.vertices[:] 232 self.texture = tex 233 width = tex.atlasTexture.width 234 height = tex.atlasTexture.height 235 step = float(width) / float(segments) 236 ustep = 1.0 / float(segments) 237 x = 0.0 238 u = 0.0 239 yTop = 0.0 240 yBottom = float(height) 241 vTop = 0.0 242 vBottom = 1.0 243 color = (1, 1, 1, 1) 244 vertex = trinity.Tr2Sprite2dVertex() 245 vertex.position = (x, yTop) 246 vertex.color = color 247 vertex.texCoord0 = (u, vTop) 248 vertex.texCoord1 = (u, vTop) 249 ro.vertices.append(vertex) 250 vertex = trinity.Tr2Sprite2dVertex() 251 vertex.position = (x, yBottom) 252 vertex.color = color 253 vertex.texCoord0 = (u, vBottom) 254 vertex.texCoord1 = (u, vBottom) 255 ro.vertices.append(vertex) 256 baseIx = 0 257 for i in xrange(segments): 258 x += step 259 u += ustep 260 vertex = trinity.Tr2Sprite2dVertex() 261 vertex.position = (x, yTop) 262 vertex.color = color 263 vertex.texCoord0 = (u, vTop) 264 vertex.texCoord1 = (u, vTop) 265 ro.vertices.append(vertex) 266 vertex = trinity.Tr2Sprite2dVertex() 267 vertex.position = (x, yBottom) 268 vertex.color = color 269 vertex.texCoord0 = (u, vBottom) 270 vertex.texCoord1 = (u, vBottom) 271 ro.vertices.append(vertex) 272 triangle = trinity.Tr2Sprite2dTriangle() 273 triangle.index0 = baseIx + 0 274 triangle.index1 = baseIx + 1 275 triangle.index2 = baseIx + 2 276 ro.triangles.append(triangle) 277 triangle = trinity.Tr2Sprite2dTriangle() 278 triangle.index0 = baseIx + 1 279 triangle.index1 = baseIx + 2 280 triangle.index2 = baseIx + 3 281 ro.triangles.append(triangle) 282 baseIx += 2 283 284 def _ApplyColorblindCorrection(self, colors): 285 if colors: 286 if isinstance(colors[0], (float, int)): 287 colors = colorblind.CheckReplaceColor(colors) 288 else: 289 colors = [ colorblind.CheckReplaceColor(color) for color in colors ] 290 return colors 291 292 def AppendVertices(self, positions, transform, colors, texcoords = None): 293 colors = self._ApplyColorblindCorrection(colors) 294 if texcoords: 295 self.renderObject.AppendVertices(positions, transform, colors, texcoords) 296 else: 297 self.renderObject.AppendVertices(positions, transform, colors) 298 299 def AddPoint(self, x, y, color): 300 positions = [(x, y)] 301 transform = None 302 colors = self._ApplyColorblindCorrection([color]) 303 self.renderObject.AppendVertices(positions, transform, colors) 304 305 def UpdatePoint(self, index, x, y): 306 positions = [] 307 transform = None 308 colors = [] 309 for order, vertex in enumerate(self.renderObject.vertices): 310 if index == order: 311 positions.append((x, y)) 312 else: 313 positions.append((vertex.position[0], vertex.position[1])) 314 colors.append(vertex.color) 315 316 self.Flush() 317 self.renderObject.AppendVertices(positions, transform, colors) 318 319 def RemovePoint(self, index): 320 positions = [] 321 transform = None 322 colors = [] 323 for order, vertex in enumerate(self.renderObject.vertices): 324 if index != order: 325 positions.append((vertex.position[0], vertex.position[1])) 326 colors.append(vertex.color) 327 328 self.Flush() 329 self.renderObject.AppendVertices(positions, transform, colors) 330 331 def _GetIndexedVertices(self): 332 return {(int(vertex.position[0]), int(vertex.position[1])):index for index, vertex in enumerate(self.renderObject.vertices)} 333 334 def _GetVertexIndex(self, x, y): 335 indexedPoints = self._GetIndexedVertices() 336 return indexedPoints[int(x), int(y)] 337 338 def Triangulate(self): 339 indexedPoints = self._GetIndexedVertices() 340 points = sorted(indexedPoints.keys(), key=lambda point: indexedPoints[point]) 341 trianglesAsPoints = mathext.triangulate(points) 342 trianglesAsIndices = [] 343 for triangle in trianglesAsPoints: 344 p1, p2, p3 = triangle 345 i1, i2, i3 = self._GetVertexIndex(*p1), self._GetVertexIndex(*p2), self._GetVertexIndex(*p3) 346 trianglesAsIndices.append((i1, i2, i3)) 347 348 self.SetTriangles(trianglesAsIndices) 349 350 def SetTriangles(self, triangles): 351 del self.renderObject.triangles[:] 352 self.renderObject.AppendTriangles(triangles)