dungeonEditorToolGeometry.py (17329B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\parklife\dungeonEditorToolGeometry.py 2 import geo2 3 import trinity 4 import math 5 import sys 6 LIGHT_GREEN = (0.25, 1.0, 0.6, 1.0) 7 LIGHT_GRAY = (0.5, 0.5, 0.5, 1.0) 8 DARK_GRAY = (0.12, 0.12, 0.12, 1.0) 9 RED = (1.0, 0.01, 0.01, 1.0) 10 GREEN = (0.01, 1.0, 0.01, 1.0) 11 BLUE = (0.01, 0.01, 1.0, 1.0) 12 YELLOW = (1.0, 1.0, 0.01, 1.0) 13 MAGENTA = (1.0, 0.01, 1.0, 1.0) 14 DARK_MAGENTA = (0.5, 0.01, 0.5, 1.0) 15 CYAN = (0.0, 1.0, 1.0, 1.0) 16 BOX_LINES = [geo2.Vector(-0.5, -0.5, 0.5), 17 geo2.Vector(0.5, -0.5, 0.5), 18 geo2.Vector(-0.5, 0.5, 0.5), 19 geo2.Vector(0.5, 0.5, 0.5), 20 geo2.Vector(-0.5, 0.5, -0.5), 21 geo2.Vector(0.5, 0.5, -0.5), 22 geo2.Vector(-0.5, -0.5, -0.5), 23 geo2.Vector(0.5, -0.5, -0.5), 24 geo2.Vector(-0.5, -0.5, 0.5), 25 geo2.Vector(-0.5, 0.5, 0.5), 26 geo2.Vector(0.5, -0.5, 0.5), 27 geo2.Vector(0.5, 0.5, 0.5), 28 geo2.Vector(-0.5, 0.5, 0.5), 29 geo2.Vector(-0.5, 0.5, -0.5), 30 geo2.Vector(0.5, 0.5, 0.5), 31 geo2.Vector(0.5, 0.5, -0.5), 32 geo2.Vector(-0.5, 0.5, -0.5), 33 geo2.Vector(-0.5, -0.5, -0.5), 34 geo2.Vector(0.5, 0.5, -0.5), 35 geo2.Vector(0.5, -0.5, -0.5), 36 geo2.Vector(-0.5, -0.5, -0.5), 37 geo2.Vector(-0.5, -0.5, 0.5), 38 geo2.Vector(0.5, -0.5, -0.5), 39 geo2.Vector(0.5, -0.5, 0.5)] 40 41 def GeoToTri(obj): 42 if len(obj) == 3: 43 return trinity.TriVector(*obj) 44 if len(obj) == 4: 45 if isinstance(obj[0], tuple): 46 tempTuple = obj[0] + obj[1] + obj[2] + obj[3] 47 return trinity.TriMatrix(*tempTuple) 48 else: 49 return trinity.TriQuaternion(*obj) 50 else: 51 raise TypeError('Unsupported type') 52 53 54 def GenBoxTriangles(): 55 points = [(-0.0750000029802, -0.0750000029802, 0.0750000029802), 56 (0.0750000029802, -0.0750000029802, 0.0750000029802), 57 (-0.0750000029802, 0.0750000029802, 0.0750000029802), 58 (-0.0750000029802, 0.0750000029802, 0.0750000029802), 59 (0.0750000029802, -0.0750000029802, 0.0750000029802), 60 (0.0750000029802, 0.0750000029802, 0.0750000029802), 61 (-0.0750000029802, 0.0750000029802, 0.0750000029802), 62 (0.0750000029802, 0.0750000029802, 0.0750000029802), 63 (-0.0750000029802, 0.0750000029802, -0.0750000029802), 64 (-0.0750000029802, 0.0750000029802, -0.0750000029802), 65 (0.0750000029802, 0.0750000029802, 0.0750000029802), 66 (0.0750000029802, 0.0750000029802, -0.0750000029802), 67 (-0.0750000029802, 0.0750000029802, -0.0750000029802), 68 (0.0750000029802, 0.0750000029802, -0.0750000029802), 69 (-0.0750000029802, -0.0750000029802, -0.0750000029802), 70 (-0.0750000029802, -0.0750000029802, -0.0750000029802), 71 (0.0750000029802, 0.0750000029802, -0.0750000029802), 72 (0.0750000029802, -0.0750000029802, -0.0750000029802), 73 (-0.0750000029802, -0.0750000029802, -0.0750000029802), 74 (0.0750000029802, -0.0750000029802, -0.0750000029802), 75 (-0.0750000029802, -0.0750000029802, 0.0750000029802), 76 (-0.0750000029802, -0.0750000029802, 0.0750000029802), 77 (0.0750000029802, -0.0750000029802, -0.0750000029802), 78 (0.0750000029802, -0.0750000029802, 0.0750000029802), 79 (0.0750000029802, -0.0750000029802, 0.0750000029802), 80 (0.0750000029802, -0.0750000029802, -0.0750000029802), 81 (0.0750000029802, 0.0750000029802, 0.0750000029802), 82 (0.0750000029802, 0.0750000029802, 0.0750000029802), 83 (0.0750000029802, -0.0750000029802, -0.0750000029802), 84 (0.0750000029802, 0.0750000029802, -0.0750000029802), 85 (-0.0750000029802, -0.0750000029802, -0.0750000029802), 86 (-0.0750000029802, -0.0750000029802, 0.0750000029802), 87 (-0.0750000029802, 0.0750000029802, -0.0750000029802), 88 (-0.0750000029802, 0.0750000029802, -0.0750000029802), 89 (-0.0750000029802, -0.0750000029802, 0.0750000029802), 90 (-0.0750000029802, 0.0750000029802, 0.0750000029802)] 91 triangles = [] 92 for i in range(12): 93 triangles.append(geo2.Vector(*points[i * 3])) 94 triangles.append(geo2.Vector(*points[i * 3 + 1])) 95 triangles.append(geo2.Vector(*points[i * 3 + 2])) 96 97 return triangles 98 99 100 def GenCubeTriangles(size = 0.075): 101 points = [(-size, -size, size), 102 (size, -size, size), 103 (-size, size, size), 104 (-size, size, size), 105 (size, -size, size), 106 (size, size, size), 107 (-size, size, size), 108 (size, size, size), 109 (-size, size, -size), 110 (-size, size, -size), 111 (size, size, size), 112 (size, size, -size), 113 (-size, size, -size), 114 (size, size, -size), 115 (-size, -size, -size), 116 (-size, -size, -size), 117 (size, size, -size), 118 (size, -size, -size), 119 (-size, -size, -size), 120 (size, -size, -size), 121 (-size, -size, size), 122 (-size, -size, size), 123 (size, -size, -size), 124 (size, -size, size), 125 (size, -size, size), 126 (size, -size, -size), 127 (size, size, size), 128 (size, size, size), 129 (size, -size, -size), 130 (size, size, -size), 131 (-size, -size, -size), 132 (-size, -size, size), 133 (-size, size, -size), 134 (-size, size, -size), 135 (-size, -size, size), 136 (-size, size, size)] 137 triangles = [] 138 for i in range(12): 139 triangles.append(points[i * 3]) 140 triangles.append(points[i * 3 + 1]) 141 triangles.append(points[i * 3 + 2]) 142 143 return triangles 144 145 146 def GenConeTriangles(): 147 top = geo2.Vector(0.0, 0.25, 0.0) 148 pi = math.pi 149 rad = pi / 10.0 150 triangles = [] 151 for each in range(20): 152 triangles.append(top) 153 triangles.append(geo2.Vector(math.cos((each + 1) * rad) * 0.1, 0.0, math.sin((each + 1) * rad) * 0.1)) 154 triangles.append(geo2.Vector(math.cos(each * rad) * 0.1, 0.0, math.sin(each * rad) * 0.1)) 155 triangles.append(geo2.Vector(math.cos((each + 1) * rad) * 0.1, 0.0, math.sin((each + 1) * rad) * 0.1)) 156 triangles.append(geo2.Vector(0.0, 0.0, 0.0)) 157 triangles.append(geo2.Vector(math.cos(each * rad) * 0.1, 0.0, math.sin(each * rad) * 0.1)) 158 159 return triangles 160 161 162 def GenCirclePoints(radius, subd = 20): 163 pi = math.pi 164 rad = pi / (subd / 2.0) 165 lines = [] 166 for each in range(subd): 167 lines.append((math.cos(each * rad) * radius, math.sin(each * rad) * radius, 0.0)) 168 lines.append((math.cos((each + 1) * rad) * radius, math.sin((each + 1) * rad) * radius, 0.0)) 169 170 return lines 171 172 173 def GenCircleTriangles(radius, subd = 20): 174 pi = math.pi 175 rad = pi / (subd / 2.0) 176 triangles = [] 177 startPoint = (math.cos(0.0) * radius, math.sin(0.0) * radius, 0.0) 178 for each in range(1, subd): 179 triangles.append(startPoint) 180 triangles.append((math.cos(each * rad) * radius, math.sin(each * rad) * radius, 0.0)) 181 triangles.append((math.cos((each + 1) * rad) * radius, math.sin((each + 1) * rad) * radius, 0.0)) 182 183 return triangles 184 185 186 def GenLightSpikes(radius, subd = 8): 187 pi = math.pi 188 rad = pi / (subd / 2.0) 189 lines = [] 190 for each in range(subd): 191 lines.append(geo2.Vector(math.cos(each * rad) * radius, 0.0, math.sin(each * rad) * radius)) 192 lines.append(geo2.Vector(math.cos(each * rad) * radius * 2.0, 0.0, math.sin(each * rad) * radius * 2.0)) 193 194 return lines 195 196 197 def GenSquarePoints(): 198 pi = math.pi 199 rad = pi / 10.0 200 lines = [] 201 c = math.cos(pi / 4) 202 s = math.sin(pi / 4 * 3) 203 lines = [geo2.Vector(s, 0.0, c), 204 geo2.Vector(-s, 0.0, c), 205 geo2.Vector(-s, 0.0, c), 206 geo2.Vector(-s, 0.0, -c), 207 geo2.Vector(-s, 0.0, -c), 208 geo2.Vector(s, 0.0, -c), 209 geo2.Vector(s, 0.0, -c), 210 geo2.Vector(s, 0.0, c)] 211 return lines 212 213 214 def GetGeometry(mlist): 215 lines = [] 216 for i in range(0, len(mlist), 2): 217 lines.append(geo2.Vector(*mlist[i])) 218 lines.append(geo2.Vector(*mlist[i + 1])) 219 220 return lines 221 222 223 BOX_TRIS = GenBoxTriangles() 224 CUBE_TRIS = GenCubeTriangles() 225 CONE_TRIS = GenConeTriangles() 226 CIRCLE_POINTS_QUART = GenCirclePoints(0.25) 227 CIRCLE_POINTS_UNIT = GenCirclePoints(1.0) 228 SQUARE_POINTS = GenSquarePoints() 229 LIGHT_SPIKES_QUART = GenLightSpikes(0.25) 230 LIGHT_SPIKES_UNIT = GenLightSpikes(1.0) 231 QUAD = [geo2.Vector(-1.0, 0.0, -1.0), 232 geo2.Vector(1.0, 0.0, 1.0), 233 geo2.Vector(1.0, 0.0, -1.0), 234 geo2.Vector(-1.0, 0.0, -1.0), 235 geo2.Vector(1.0, 0.0, -1.0), 236 geo2.Vector(1.0, 0.0, 1.0)] 237 238 def GetSolidAroundLine(line, radius): 239 rad = math.pi * 2.0 / 3.0 240 triangle1 = [] 241 triangle1.append((math.cos(0) * radius, math.sin(0) * radius, 0.0)) 242 triangle1.append((math.cos(rad) * radius, math.sin(rad) * radius, 0.0)) 243 triangle1.append((math.cos(2 * rad) * radius, math.sin(2 * rad) * radius, 0.0)) 244 dirOfLine = geo2.Vec3Normalize(geo2.Vec3Subtract(line[1], line[0])) 245 if abs(geo2.Vec3Dot((0.0, 0.0, 1.0), dirOfLine)) != 1.0: 246 rot = geo2.QuaternionRotationArc((0.0, 0.0, 1.0), dirOfLine) 247 else: 248 rot = geo2.QuaternionIdentity() 249 rot = geo2.MatrixRotationQuaternion(rot) 250 t1 = geo2.MatrixTranslation(*line[0]) 251 t2 = geo2.MatrixTranslation(*line[1]) 252 compA = geo2.MatrixMultiply(rot, t1) 253 compB = geo2.MatrixMultiply(rot, t2) 254 startTri = geo2.Vec3TransformCoordArray(triangle1, compA) 255 endTri = geo2.Vec3TransformCoordArray(triangle1, compB) 256 triangles = [startTri[1], 257 endTri[0], 258 startTri[0], 259 endTri[1], 260 endTri[0], 261 startTri[1], 262 startTri[2], 263 endTri[1], 264 startTri[1], 265 endTri[2], 266 endTri[1], 267 startTri[2], 268 startTri[0], 269 endTri[2], 270 startTri[2], 271 endTri[0], 272 endTri[2], 273 startTri[0]] 274 return triangles 275 276 277 def GetSolidAroundLines(poslist, width): 278 triangles = [] 279 for each in xrange(0, len(poslist), 2): 280 triangles.extend(GetSolidAroundLine((poslist[each], poslist[each + 1]), width)) 281 282 return triangles 283 284 285 class basearea(object): 286 287 def __init__(self, name, color = (0.0, 0.0, 0.0, 1.0), primitiveScene = None): 288 object.__init__(self) 289 self.name = name 290 self._color = color 291 self._display = False 292 self.primitiveScene = primitiveScene 293 self.primitives = [] 294 self.valuebindings = [] 295 self.localTransform = geo2.MatrixIdentity() 296 297 def __del__(self): 298 if self.primitiveScene is not None: 299 for each in iter(self.primitives): 300 self.primitiveScene.primitives.fremove(each) 301 302 def SetSourceObject(self, obj, attr, call = None): 303 for each in iter(self.valuebindings): 304 each.sourceAttribute = attr 305 each.sourceObject = obj 306 if callable(call): 307 each.copyValueCallable = call 308 309 def SetDisplay(self, val): 310 if self.primitiveScene is not None: 311 if val: 312 for each in iter(self.primitives): 313 if each not in self.primitiveScene.primitives: 314 self.primitiveScene.primitives.append(each) 315 316 else: 317 for each in iter(self.primitives): 318 self.primitiveScene.primitives.fremove(each) 319 320 self._display = val 321 322 def GetDisplay(self): 323 return self._display 324 325 display = property(GetDisplay, SetDisplay) 326 327 def SetColor(self, val): 328 self._color = val 329 for each in iter(self.primitives): 330 each.color = val 331 332 def GetColor(self): 333 return self._color 334 335 color = property(GetColor, SetColor) 336 337 def UpdateTransform(self, transform): 338 mat = geo2.MatrixMultiply(self.localTransform, transform) 339 for each in iter(self.primitives): 340 each.localTransform = mat 341 342 343 class area(basearea): 344 345 def __init__(self, name, color = (0.0, 0.0, 0.0, 1.0), scaleByDistance = True, viewOriented = False, primitiveScene = None): 346 basearea.__init__(self, name, color, primitiveScene) 347 self._lineset = trinity.Tr2LineSet() 348 self._lineset.scaleByDistanceToView = scaleByDistance 349 self._lineset.viewOriented = viewOriented 350 self._lineset.name = name 351 self._lineset.effect = trinity.Tr2Effect() 352 self._lineset.pickEffect = trinity.Tr2Effect() 353 self._lineset.effect.effectFilePath = 'res:/Graphics/Effect/Managed/Utility/LinesNoZ.fx' 354 self._lineset.pickEffect.effectFilePath = 'res:/Graphics/Effect/Managed/Utility/PrimitivePicking.fx' 355 self._solidset = trinity.Tr2SolidSet() 356 self._solidset.scaleByDistanceToView = scaleByDistance 357 self._solidset.name = name 358 self._solidset.effect = trinity.Tr2Effect() 359 self._solidset.pickEffect = trinity.Tr2Effect() 360 self._solidset.effect.effectFilePath = 'res:/Graphics/Effect/Managed/Utility/SolidsNoZ.fx' 361 self._solidset.pickEffect.effectFilePath = 'res:/Graphics/Effect/Managed/Utility/PrimitivePicking.fx' 362 self.primitives.append(self._solidset) 363 self.primitives.append(self._lineset) 364 365 def SetColor(self, val): 366 self._color = val 367 for each in iter(self.primitives): 368 each.color = val 369 370 def GetColor(self): 371 return self._color 372 373 color = property(GetColor, SetColor) 374 375 def Update(self, transform): 376 mat = geo2.MatrixMultiply(self.localTransform, transform) 377 tmat = GeoToTri(mat) 378 if len(self.lines) > 0: 379 self.lineset.transform = tmat 380 if len(self.triangles) > 0: 381 self.solidset.transform = tmat 382 if len(self.points) > 0: 383 self.pointset.transform = tmat 384 if self.bounds: 385 try: 386 self.bounds.Update(mat) 387 except Exception as e: 388 import traceback 389 traceback.print_exc() 390 sys.exc_clear() 391 392 def Render(self): 393 if len(self.lines) > 0: 394 self.lineset.Render() 395 if len(self.triangles) > 0: 396 self.solidset.Render() 397 if len(self.points) > 0: 398 self.pointset.Render() 399 if self.drawBounds: 400 try: 401 self.bounds.Render() 402 except Exception as e: 403 import traceback 404 traceback.print_exc() 405 sys.exc_clear() 406 407 def AddToPickingSet(self, poslist): 408 if len(poslist) % 3 != 0: 409 raise RuntimeError('The number of points must be a multiple of 3') 410 for i in xrange(0, len(poslist), 3): 411 self._lineset.AddPickingTriangle(poslist[i], poslist[i + 1], poslist[i + 2]) 412 413 self._lineset.SubmitChanges() 414 415 def AddToLineSet(self, poslist, genPickingGeo = False): 416 if len(poslist) % 2 != 0: 417 raise RuntimeError('The number of points must be a multiple of 2') 418 for i in xrange(0, len(poslist), 2): 419 self._lineset.AddLine(poslist[i], self._color, poslist[i + 1], self._color) 420 421 if genPickingGeo: 422 triangles = GetSolidAroundLines(poslist, 0.08) 423 self.AddToPickingSet(triangles) 424 else: 425 self._lineset.SubmitChanges() 426 427 def AddToPointSet(self, poslist): 428 if self.bounds: 429 self.bounds.ComputeBounds(poslist) 430 xr = xrange(len(poslist)) 431 vec = geo2.Vector 432 points = self.points 433 p_append = points.append 434 for i in xr: 435 a = vec(*poslist[i]) 436 p_append(a) 437 438 self.pointset.SetDefaultColor(self._color) 439 self.pointset.AddPoints(points) 440 441 def AddToSolidSet(self, poslist): 442 if len(poslist) % 3 != 0: 443 raise RuntimeError('The number of points must be a multiple of 3') 444 for i in xrange(0, len(poslist), 3): 445 self._solidset.AddTriangle(poslist[i], self._color, poslist[i + 1], self._color, poslist[i + 2], self._color) 446 447 self._solidset.SubmitChanges() 448 449 def BoundProbe(self, ray, start): 450 if self.bounds: 451 return self.bounds.RayToBound(ray, start) 452 else: 453 return False 454 455 456 class geometry(object): 457 458 def __init__(self, primitiveScene): 459 self.primitiveScene = primitiveScene 460 self.areas = [] 461 self.groups = {} 462 self.visible_areas = [] 463 self._display = False 464 465 def Update(self, transform): 466 self.visible_areas = [] 467 for each in iter(self.areas): 468 if each.display: 469 each.UpdateTransform(transform) 470 self.visible_areas.append(each) 471 472 return self.visible_areas 473 474 def AppendArea(self, a): 475 self.areas.append(a) 476 g = self.groups.get(a.name, []) 477 g.append(a) 478 self.groups[a.name] = g 479 a.primitiveScene = self.primitiveScene 480 481 def ExtendArea(self, a): 482 self.areas.extend(a) 483 g = self.groups.get(a[0].name, []) 484 g.extend(a) 485 self.groups[a[0].name] = g 486 for each in a: 487 each.primitiveScene = self.primitiveScene 488 489 def GetArea(self, name): 490 for each in self.areas: 491 if each.name == name: 492 return each 493 494 def SetArea(self, name, area): 495 found = False 496 for i, each in enumerate(self.areas): 497 if each.name == name: 498 found = True 499 break 500 501 if found: 502 self.areas[i] = area 503 return found 504 505 def GetAreas(self, name): 506 areas = [] 507 for each in self.areas: 508 if each.name == name: 509 areas.append(each) 510 511 return areas 512 513 def SetDisplay(self, val): 514 for each in self.areas: 515 each.display = val 516 517 self._display = val 518 519 def GetDisplay(self): 520 return self._display 521 522 display = property(GetDisplay, SetDisplay)