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