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

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)