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

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)