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)