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

utils_scene.py (8532B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\iconrendering2\renderers\utils_scene.py
      2 from __future__ import print_function
      3 import geo2
      4 import trinity
      5 import blue
      6 from math import sin, tan
      7 from iconrendering2.utils import Pump
      8 try:
      9     long
     10 except NameError:
     11     long = int
     12 
     13 GETPHOTO_ANGLE = (0.3, -0.3, 0.0)
     14 GETPHOTO_VIEW_UP = (0.0, 1.0, 0.0)
     15 GETPHOTO_FOV = 1.0
     16 GETPHOTO_BACKCLIP = 500000.0
     17 GETPHOTO_PROJECTION = (GETPHOTO_FOV,
     18  1.0,
     19  1.0,
     20  GETPHOTO_BACKCLIP)
     21 
     22 def FreezeTime():
     23     blue.os.advanceTimeInPump = False
     24     blue.os.SetTime(long(1))
     25     trinity.device.animationTimeScale = 0.0
     26     trinity.device.animationTime = 1
     27     Pump()
     28     trinity.app.ProcessMessages()
     29 
     30 
     31 def WaitForGeometryLoad(object, geometryPath = 'mesh.geometry', context = ''):
     32 
     33     def _IsGeometryLoaded():
     34         o = object
     35         for attr in geometryPath.split('.'):
     36             o = getattr(o, attr, None)
     37 
     38         return o is not None and o.isGood
     39 
     40     blue.resMan.Wait()
     41     Pump()
     42     maxWaits = 100
     43     currentWait = 0
     44     while not _IsGeometryLoaded() and currentWait != maxWaits:
     45         currentWait += 1
     46         blue.resMan.Wait()
     47         Pump()
     48 
     49     geometry = object
     50     for attr in geometryPath.split('.'):
     51         geometry = getattr(geometry, attr, None)
     52 
     53     if currentWait == maxWaits:
     54         print('Waiting for geometry failed for %s' % context)
     55 
     56 
     57 def GetViewProjectionForObject(object, scene, cameraAngle = None):
     58     if object is None:
     59         return (None, None)
     60     boundingSphereRadius = object.GetBoundingSphereRadius()
     61     if getattr(object, 'mesh', None) is not None:
     62         geometry = object.mesh.geometry
     63         boundingSphereCenter = object.GetBoundingSphereCenter()
     64         view, projection = GetViewAndProjectionUsingMeshGeometry(geometry, scene=scene, boundingSphereRadius=boundingSphereRadius, boundingSphereCenter=boundingSphereCenter, cameraAngle=cameraAngle)
     65     else:
     66         view, projection = GetViewAndProjectionUsingBoundingSphere(boundingSphereRadius)
     67     return (view, projection)
     68 
     69 
     70 def _GetViewMatrixFromAngle(cameraAngle, lookAt, cameraDistance):
     71     view_at = geo2.Vector(lookAt[0], lookAt[1], lookAt[2])
     72     view_eye = geo2.Vector(0.0, 0.0, 1.0)
     73     angleTransform = geo2.MatrixRotationYawPitchRoll(cameraAngle[0], cameraAngle[1], cameraAngle[2])
     74     view_eye = geo2.Vec3TransformCoord(view_eye, angleTransform)
     75     view_eye = geo2.Vector(*view_eye)
     76     view_eye = view_eye * cameraDistance + view_at
     77     return (view_eye, view_at, geo2.Vector(*GETPHOTO_VIEW_UP))
     78 
     79 
     80 def _SphericalFit(radius, fov = GETPHOTO_FOV, fudge = 1.15):
     81     alpha = fov / 2.0
     82     return radius / sin(alpha) * fudge
     83 
     84 
     85 def _GetViewAndProjectionUsingProjectedBoundingBox(calculateProjectedBoundingBox, scene = None, boundingSphereRadius = None, boundingSphereCenter = None, boundingBoxMin = None, boundingBoxMax = None, cameraAngle = None, aspectRatio = 1.0):
     86     cameraAngle = cameraAngle or GETPHOTO_ANGLE
     87     zn = 1.0
     88     if boundingSphereRadius:
     89         radius = boundingSphereRadius
     90         center = boundingSphereCenter if boundingSphereCenter else (0.0, 0.0, 0.0)
     91     else:
     92         center = geo2.Vec3Add(boundingBoxMin, boundingBoxMax)
     93         center = geo2.Vec3Scale(center, 0.5)
     94         radius = geo2.Vec3Length(geo2.Vec3Subtract(boundingBoxMax, boundingBoxMin))
     95     dist = zn + _SphericalFit(radius)
     96     viewEyeAtUp = _GetViewMatrixFromAngle(cameraAngle, center, dist)
     97     projTransform = geo2.MatrixPerspectiveFovRH(*GETPHOTO_PROJECTION)
     98     viewTransform = geo2.MatrixLookAtRH(*viewEyeAtUp)
     99     combinedTransform = viewTransform
    100     combinedTransform = geo2.MatrixMultiply(combinedTransform, projTransform)
    101     safeMin, safeMax = calculateProjectedBoundingBox(combinedTransform)
    102     deltaX = safeMax[0] - safeMin[0]
    103     deltaY = safeMax[1] - safeMin[1]
    104     scalingFactor = 0.9 * (2.0 / max(deltaX, deltaY))
    105     try:
    106         if scene.backgroundEffect is not None:
    107             params = scene.backgroundEffect.Find(['trinity.Tr2FloatParameter'])
    108             for param in params:
    109                 if param.name == 'ProjectionScaling':
    110                     param.value = scalingFactor
    111 
    112     except AttributeError:
    113         pass
    114 
    115     offsetX = -1 * scalingFactor * (safeMin[0] + safeMax[0]) / 2.0
    116     offsetY = -1 * scalingFactor * (safeMin[1] + safeMax[1]) / 2.0
    117     scale = 1.0 / tan(GETPHOTO_FOV / 2.0) * scalingFactor
    118     zf = dist + radius * 2
    119     t = zn * (1 - offsetY) / scale / aspectRatio
    120     b = -zn * (1 + offsetY) / scale / aspectRatio
    121     r = zn * (1 - offsetX) / scale
    122     l = -zn * (1 + offsetX) / scale
    123     projection = trinity.TriProjection()
    124     projection.PerspectiveOffCenter(l, r, b, t, zn, zf)
    125     view = trinity.TriView()
    126     view.SetLookAtPosition(*viewEyeAtUp)
    127     return (view, projection)
    128 
    129 
    130 def GetViewAndProjectionUsingMeshGeometry(geometry, geometryMeshIdx = 0, scene = None, boundingSphereRadius = None, boundingSphereCenter = None, boundingBoxMin = None, boundingBoxMax = None, cameraAngle = None, aspectRatio = 1.0):
    131 
    132     def calculateProjectedBoundingBox(combinedTransform):
    133         return geometry.CalculateBoundingBoxFromTransform(geometryMeshIdx, combinedTransform)
    134 
    135     return _GetViewAndProjectionUsingProjectedBoundingBox(calculateProjectedBoundingBox, scene, boundingSphereRadius=boundingSphereRadius, boundingSphereCenter=boundingSphereCenter, boundingBoxMin=boundingBoxMin, boundingBoxMax=boundingBoxMax, cameraAngle=cameraAngle, aspectRatio=aspectRatio)
    136 
    137 
    138 def GetViewAndProjectionForSkinnedModel(model, scene = None, boundingSphereRadius = None, boundingSphereCenter = None, boundingBoxMin = None, boundingBoxMax = None, cameraAngle = None):
    139 
    140     def calculateProjectedBoundingBox(combinedTransform):
    141         bb = model.CalculateSkinnedBoundingBoxFromTransform(combinedTransform)
    142         print(bb)
    143         return bb
    144 
    145     return _GetViewAndProjectionUsingProjectedBoundingBox(calculateProjectedBoundingBox, scene, boundingSphereRadius=boundingSphereRadius, boundingSphereCenter=boundingSphereCenter, boundingBoxMin=boundingBoxMin, boundingBoxMax=boundingBoxMax, cameraAngle=cameraAngle)
    146 
    147 
    148 def GetViewAndProjectionUsingBoundingBox(boundingBoxMin = None, boundingBoxMax = None, scene = None, cameraAngle = None):
    149 
    150     def calculateProjectedBoundingBox(combinedTransform):
    151         edges = []
    152         edges.append(geo2.Vector(boundingBoxMin[0], boundingBoxMin[1], boundingBoxMin[2]))
    153         edges.append(geo2.Vector(boundingBoxMin[0], boundingBoxMin[1], boundingBoxMax[2]))
    154         edges.append(geo2.Vector(boundingBoxMin[0], boundingBoxMax[1], boundingBoxMin[2]))
    155         edges.append(geo2.Vector(boundingBoxMin[0], boundingBoxMax[1], boundingBoxMax[2]))
    156         edges.append(geo2.Vector(boundingBoxMax[0], boundingBoxMin[1], boundingBoxMin[2]))
    157         edges.append(geo2.Vector(boundingBoxMax[0], boundingBoxMin[1], boundingBoxMax[2]))
    158         edges.append(geo2.Vector(boundingBoxMax[0], boundingBoxMax[1], boundingBoxMin[2]))
    159         edges.append(geo2.Vector(boundingBoxMax[0], boundingBoxMax[1], boundingBoxMax[2]))
    160         for i, edge in enumerate(edges):
    161             edge = geo2.Vector(*geo2.Vec3TransformCoord(edge, combinedTransform))
    162             if i == 0:
    163                 safeMin = geo2.Vector(*edge)
    164                 safeMax = geo2.Vector(*edge)
    165             else:
    166                 safeMin.x = min(safeMin.x, edge[0])
    167                 safeMin.y = min(safeMin.y, edge[1])
    168                 safeMin.z = min(safeMin.z, edge[2])
    169                 safeMax.x = max(safeMax.x, edge[0])
    170                 safeMax.y = max(safeMax.y, edge[1])
    171                 safeMax.z = max(safeMax.z, edge[2])
    172 
    173         return (safeMin, safeMax)
    174 
    175     return _GetViewAndProjectionUsingProjectedBoundingBox(calculateProjectedBoundingBox, scene, boundingBoxMin=boundingBoxMin, boundingBoxMax=boundingBoxMax, cameraAngle=cameraAngle, boundingSphereRadius=None, boundingSphereCenter=None)
    176 
    177 
    178 def GetViewAndProjectionUsingBoundingSphere(boundingSphereRadius, boundingSphereCenter = None, cameraAngle = None, distanceOverride = None, fov = GETPHOTO_FOV, near = 1.0, aspectRatio = 1.0):
    179     cameraAngle = cameraAngle or GETPHOTO_ANGLE
    180     boundingSphereCenter = boundingSphereCenter or (0.0, 0.0, 0.0)
    181     dist = distanceOverride if distanceOverride else _SphericalFit(boundingSphereRadius, fov)
    182     dist = max(dist, 1.5)
    183     projection = trinity.TriProjection()
    184     projection.PerspectiveFov(fov, aspectRatio, near, GETPHOTO_BACKCLIP)
    185     view = trinity.TriView()
    186     view.SetLookAtPosition(*_GetViewMatrixFromAngle(cameraAngle, boundingSphereCenter, dist))
    187     return (view, projection)