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

curveLineDrawer.py (11083B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\planet\curveLineDrawer.py
      2 import math
      3 import trinity
      4 import geo2
      5 import utillib
      6 from carbonui.util.color import Color
      7 from eve.common.script.planet.surfacePoint import SurfacePoint
      8 
      9 class CurveLineDrawer:
     10 
     11     def __init__(self):
     12         self.p0 = (0.0, 0.0, 0.0)
     13         self.lineSets = {}
     14         self.lastZoom = None
     15         self.transformsByLineSets = {}
     16 
     17     def CreateLineSet(self, lsName, transform, animationTexture = None, scale = 1.0):
     18         ls = trinity.EveCurveLineSet()
     19         ls.scaling = (scale, scale, scale)
     20         tex2D_1 = trinity.TriTextureParameter()
     21         tex2D_1.name = 'TexMap'
     22         tex2D_1.resourcePath = 'res:/texture/global/lineSolid.dds'
     23         ls.lineEffect.resources.append(tex2D_1)
     24         if animationTexture:
     25             tex2D_2 = trinity.TriTextureParameter()
     26             tex2D_2.name = 'OverlayTexMap'
     27             tex2D_2.resourcePath = animationTexture
     28             ls.lineEffect.resources.append(tex2D_2)
     29         self.lineSets[lsName] = ls
     30         transform.children.append(ls)
     31         self.transformsByLineSets[ls] = transform
     32         return ls
     33 
     34     def GetLineSet(self, lsName):
     35         return self.lineSets[lsName]
     36 
     37     def ScaleLineSet(self, lsName, scale):
     38         ls = self.GetLineSet(lsName)
     39         ls.scaling = (scale, scale, scale)
     40 
     41     def RotateLineSet(self, lsName, rotX, rotY, rotZ):
     42         ls = self.GetLineSet(lsName)
     43         ls.rotation = (0.0,
     44          rotX,
     45          rotY,
     46          rotZ)
     47 
     48     def SetLineSetNumSegments(self, lsName, lineID, numSegments):
     49         ls = self.GetLineSet(lsName)
     50         ls.ChangeLineSegmentation(lineID, numSegments)
     51 
     52     def RemoveLine(self, lsName, lineID):
     53         ls = self.GetLineSet(lsName)
     54         ls.RemoveLine(lineID)
     55         ls.SubmitChanges()
     56 
     57     def ClearLineSets(self):
     58         for ls in self.lineSets.values():
     59             self.transformsByLineSets[ls].children.remove(ls)
     60 
     61         self.transformsByLineSets = {}
     62         self.lineSets = {}
     63 
     64     def ClearLines(self, lsName):
     65         if lsName not in self.lineSets:
     66             return None
     67         ls = self.lineSets[lsName]
     68         ls.ClearLines()
     69         ls.SubmitChanges()
     70 
     71     def RemoveLineSet(self, lsName):
     72         self.lineSets.pop(lsName, None)
     73 
     74     def ChangeLineColor(self, lsName, lineID, color):
     75         ls = self.GetLineSet(lsName)
     76         ls.ChangeLineColor(lineID, color, color)
     77 
     78     def ChangeLineSetWidth(self, lsName, widthFactor):
     79         ls = self.GetLineSet(lsName)
     80         ls.lineWidthFactor = widthFactor
     81 
     82     def ChangeLineWidth(self, lsName, lineID, width):
     83         ls = self.GetLineSet(lsName)
     84         ls.ChangeLineWidth(lineID, width)
     85         ls.SubmitChanges()
     86 
     87     def ChangeLinePosition(self, lsName, lineID, start, end):
     88         ls = self.GetLineSet(lsName)
     89         p1 = start.GetAsXYZTuple()
     90         p2 = end.GetAsXYZTuple()
     91         ls.ChangeLinePositionCrt(lineID, p1, p2)
     92         self.SubmitLineset(lsName)
     93 
     94     def ChangeLineAnimation(self, lsName, lineID, color, speed, scale):
     95         ls = self.GetLineSet(lsName)
     96         ls.ChangeLineAnimation(lineID, color, speed, scale)
     97 
     98     def DrawArc(self, lsName, surfacePoint1, surfacePoint2, lineWidth = 1.0, color1 = Color.WHITE, color2 = Color.WHITE):
     99         ls = self.GetLineSet(lsName)
    100         p1 = surfacePoint1.GetAsXYZTuple()
    101         p2 = surfacePoint2.GetAsXYZTuple()
    102         lineID = ls.AddSpheredLineCrt(p1, color1, p2, color2, self.p0, lineWidth)
    103         return lineID
    104 
    105     def DrawLine(self, lsName, surfacePoint1, surfacePoint2, lineWidth = 1.0, color1 = Color.WHITE, color2 = Color.WHITE):
    106         ls = self.GetLineSet(lsName)
    107         p1 = surfacePoint1.GetAsXYZTuple()
    108         p2 = surfacePoint2.GetAsXYZTuple()
    109         lineID = ls.AddStraightLine(p1, color1, p2, color2, lineWidth)
    110         return lineID
    111 
    112     def SubmitLineset(self, lsName):
    113         ls = self.GetLineSet(lsName)
    114         ls.SubmitChanges()
    115 
    116     def DrawMesh(self, zoom):
    117         layers = [utillib.KeyVal(numTheta=40, numPhi=20, showAtZoom=1.0, phiSkip=3, linesetName='planetExternalGrid', lineSet=None)]
    118         if not hasattr(self, 'meshInitialized'):
    119             for l in layers:
    120                 self._DrawMesh(l.linesetName, l.numPhi, l.numTheta, l.phiSkip, 1.0)
    121 
    122             self.meshInitialized = True
    123         lineWidth = 2.0
    124         for l in layers:
    125             ls = self.GetLineSet(l.linesetName)
    126             if zoom <= l.showAtZoom:
    127                 ls.lineWidthFactor = lineWidth
    128                 lineWidth += 1.0
    129             else:
    130                 ls.lineWidthFactor = 0.0
    131 
    132     def _DrawMesh(self, lsName, numPhi = 30, numTheta = 60, phiSkip = 0, lineWidth = 2.0, col = (1.0, 1.0, 1.0, 0.01)):
    133         col = (0.8, 0.8, 1.0, 0.3)
    134         colAnim = (1.0, 1.0, 1.0, 1.0)
    135         speedAnim = 0.06
    136         scaleAnim = 2.0
    137         phi0 = math.pi / 90
    138         phiStep = (math.pi - 2 * phi0) / numPhi
    139         phiInit = phi0 + phiStep * phiSkip
    140         ls = self.GetLineSet(lsName)
    141         for p in xrange(numPhi + 1):
    142             if p <= phiSkip - 1 or p > numPhi - phiSkip:
    143                 continue
    144             phi = phi0 + float(p) * phiStep
    145             for quarter in xrange(0, 4):
    146                 th0 = math.pi / 2 * quarter
    147                 p1 = SurfacePoint(theta=th0, phi=phi)
    148                 p2 = SurfacePoint(theta=th0 + math.pi / 2, phi=phi)
    149                 pC = SurfacePoint(0.0, p1.y, 0.0)
    150                 lineID = ls.AddSpheredLineCrt(p1.GetAsXYZTuple(), col, p2.GetAsXYZTuple(), col, pC.GetAsXYZTuple(), lineWidth)
    151                 ls.ChangeLineAnimation(lineID, colAnim, speedAnim, scaleAnim)
    152 
    153         for t in xrange(numTheta):
    154             th = float(t) / numTheta * math.pi * 2
    155             p1 = SurfacePoint(theta=th, phi=math.pi / 2.0)
    156             p2 = SurfacePoint(theta=th, phi=phiInit)
    157             lineID = ls.AddSpheredLineCrt(p1.GetAsXYZTuple(), col, p2.GetAsXYZTuple(), col, self.p0, lineWidth)
    158             ls.ChangeLineAnimation(lineID, colAnim, speedAnim, scaleAnim)
    159             p2 = SurfacePoint(theta=th, phi=math.pi - phiInit)
    160             lineID = ls.AddSpheredLineCrt(p1.GetAsXYZTuple(), col, p2.GetAsXYZTuple(), col, self.p0, lineWidth)
    161             ls.ChangeLineAnimation(lineID, colAnim, speedAnim, scaleAnim)
    162 
    163         ls.SubmitChanges()
    164 
    165     def DrawCartesianAxis(self):
    166         lsName = 'cartesianAxis'
    167         sp = SurfacePoint
    168         len = 1.5
    169         if getattr(self, 'cartesianAxisAlreadyDrawn', False):
    170             self.ClearLines(lsName)
    171             self.cartesianAxisAlreadyDrawn = False
    172             return
    173         if lsName not in self.lineSets:
    174             self.CreateLineSet(lsName, sm.GetService('planetUI').planetTransform)
    175         self.DrawLine(lsName, sp(), sp(len, 0, 0), 3.0, Color.RED, Color.RED)
    176         self.DrawLine(lsName, sp(), sp(0, len, 0), 3.0, Color.GREEN, Color.GREEN)
    177         self.DrawLine(lsName, sp(), sp(0, 0, len), 3.0, Color.BLUE, Color.BLUE)
    178         self.SubmitLineset(lsName)
    179         self.cartesianAxisAlreadyDrawn = True
    180 
    181     def DrawIcosahedronGrid(self):
    182         detailLevel = 3
    183         t = (1.0 + math.sqrt(5)) / 2.0
    184         sp = SurfacePoint
    185         sps = []
    186         sps = [sp(t, 1, 0),
    187          sp(-t, 1, 0),
    188          sp(t, -1, 0),
    189          sp(-t, -1, 0),
    190          sp(1, 0, t),
    191          sp(1, 0, -t),
    192          sp(-1, 0, t),
    193          sp(-1, 0, -t),
    194          sp(0, t, 1),
    195          sp(0, -t, 1),
    196          sp(0, t, -1),
    197          sp(0, -t, -1)]
    198         for p in sps:
    199             p.SetRadius(1.0)
    200 
    201         triangles = [(0, 8, 4),
    202          (0, 5, 10),
    203          (2, 4, 9),
    204          (2, 11, 5),
    205          (1, 6, 8),
    206          (1, 10, 7),
    207          (3, 9, 6),
    208          (3, 7, 11),
    209          (0, 10, 8),
    210          (1, 8, 10),
    211          (2, 9, 11),
    212          (3, 9, 11),
    213          (4, 2, 0),
    214          (5, 0, 2),
    215          (6, 1, 3),
    216          (7, 3, 1),
    217          (8, 6, 4),
    218          (9, 4, 6),
    219          (10, 5, 7),
    220          (11, 7, 5)]
    221         lines = set()
    222         cLines = set()
    223         hLines = set()
    224         for t in triangles:
    225             v0 = sps[t[0]]
    226             v1 = sps[t[1]]
    227             v2 = sps[t[2]]
    228             cLines.add((v0, v1))
    229             cLines.add((v1, v2))
    230             cLines.add((v2, v0))
    231             self._SplitTriangle(v0, v1, v2, lines, cLines, hLines, sps, detailLevel)
    232 
    233         cLineCol = (174.0 / 256,
    234          222.0 / 256,
    235          228.0 / 256,
    236          0.9)
    237         lineCol1 = cLineCol
    238         lineCol2 = (0.0, 0.0, 0.0, 0.0)
    239         hLineCol = (0.0, 0.0, 0.0, 0.0)
    240         for l in lines:
    241             self.DrawLine('icosahedron', l[0], l[1], 2.0, color1=lineCol1, color2=lineCol2)
    242 
    243         self.SubmitLineset('icosahedron')
    244 
    245     def _SplitTriangle(self, v0, v1, v2, lines, cLines, hLines, sps, level):
    246         level -= 1
    247         lc0 = self._GetLineCenterPoint(v0, v1)
    248         lc1 = self._GetLineCenterPoint(v1, v2)
    249         lc2 = self._GetLineCenterPoint(v2, v0)
    250         tc = self._GetTriangleCenterPoint(v0, v1, v2)
    251         if level > 0:
    252             self._SplitTriangle(v0, lc0, lc2, lines, cLines, hLines, sps, level)
    253             self._SplitTriangle(v1, lc1, lc0, lines, cLines, hLines, sps, level)
    254             self._SplitTriangle(v2, lc2, lc1, lines, cLines, hLines, sps, level)
    255             self._SplitTriangle(lc0, lc1, lc2, lines, cLines, hLines, sps, level)
    256         else:
    257             v = geo2.Vector
    258             vecC = v(*tc.GetAsXYZTuple())
    259             vec0 = v(*v0.GetAsXYZTuple())
    260             vec1 = v(*v0.GetAsXYZTuple())
    261             vec2 = v(*v0.GetAsXYZTuple())
    262             vec01 = v(*(v1.x - v0.x, v1.y - v0.y, v1.z - v0.z))
    263             n0 = v(*geo2.Vec3Cross(vecC, vec01))
    264             vec12 = v(*(v2.x - v1.x, v2.y - v1.y, v2.z - v1.z))
    265             n1 = v(*geo2.Vec3Cross(vecC, vec12))
    266             vec20 = v(*(v0.x - v2.x, v0.y - v2.y, v0.z - v2.z))
    267             n2 = v(*geo2.Vec3Cross(vecC, vec20))
    268             s = 0.16
    269             sGap = 0.1
    270             n0 = v(*(s * n0))
    271             n1 = v(*(s * n1))
    272             n2 = v(*(s * n2))
    273             lp0 = SurfacePoint(*(vecC - n0))
    274             lp1 = SurfacePoint(*(vecC - n1))
    275             lp2 = SurfacePoint(*(vecC - n2))
    276             lr0 = SurfacePoint(*(vecC - v(*(sGap * n0))))
    277             lr1 = SurfacePoint(*(vecC - v(*(sGap * n1))))
    278             lr2 = SurfacePoint(*(vecC - v(*(sGap * n2))))
    279             lp0.SetRadius(1.0)
    280             lp1.SetRadius(1.0)
    281             lp2.SetRadius(1.0)
    282             lr0.SetRadius(1.0)
    283             lr1.SetRadius(1.0)
    284             lr2.SetRadius(1.0)
    285             lines.add((lr0, lp0))
    286             lines.add((lr1, lp1))
    287             lines.add((lr2, lp2))
    288 
    289     def _GetTriangleCenterPoint(self, sp1, sp2, sp3):
    290         x = sp1.x / 3.0 + sp2.x / 3.0 + sp3.x / 3.0
    291         y = sp1.y / 3.0 + sp2.y / 3.0 + sp3.y / 3.0
    292         z = sp1.z / 3.0 + sp2.z / 3.0 + sp3.z / 3.0
    293         sp = SurfacePoint(x, y, z)
    294         sp.SetRadius(1.0)
    295         return sp
    296 
    297     def _GetLineCenterPoint(self, sp1, sp2):
    298         x = sp1.x / 2.0 + sp2.x / 2.0
    299         y = sp1.y / 2.0 + sp2.y / 2.0
    300         z = sp1.z / 2.0 + sp2.z / 2.0
    301         sp = SurfacePoint(x, y, z)
    302         sp.SetRadius(1.0)
    303         return sp