explosionCamera.py (9586B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\camera\explosionCamera.py 2 import random 3 import math 4 from eve.client.script.ui.camera.baseSpaceCamera import BaseSpaceCamera 5 from eve.client.script.ui.camera.cameraUtil import GetBall, GetBallPosition 6 from eve.client.script.ui.view.viewStateConst import ViewState 7 import evecamera 8 import blue 9 import geo2 10 from evegraphics.explosions.spaceObjectExplosionManager import SpaceObjectExplosionManager 11 from carbonui.uicore import uicore 12 BOUNDING_SPHERE_MULTIPLICATION = 20 13 14 def MiddlePoint(endPos, startPos): 15 return geo2.Vec3Scale(geo2.Vec3Direction(endPos, startPos), geo2.Vec3Distance(startPos, endPos) * 0.5) 16 17 18 class ExplosionCamera(BaseSpaceCamera): 19 cameraID = evecamera.CAM_EXPLOSION 20 name = 'ExplosionCamera' 21 22 def __init__(self): 23 BaseSpaceCamera.__init__(self) 24 self.msUntilGlobal = 0.0 25 self.interest = None 26 self.startTime = 0 27 self.isRunning = False 28 self.animateCamera = False 29 self.endTime = 0 30 self.p0, self.p1, self.p2, self.p3, self.p4 = (None, None, None, None, None) 31 32 def ResetCamera(self): 33 self.p0, self.p1, self.p2, self.p3, self.p4 = (None, None, None, None, None) 34 self.startTime = 0 35 self.isRunning = False 36 self.animateCamera = False 37 self.endTime = 0.0 38 self.msUntilGlobal = 0.0 39 40 def OnActivated(self, lastCamera = None, itemID = None, **kwargs): 41 BaseSpaceCamera.OnActivated(self, **kwargs) 42 if lastCamera and lastCamera.cameraID in evecamera.INSPACE_CAMERAS: 43 self.SetAtPosition(lastCamera.atPosition) 44 self.SetEyePosition(lastCamera.eyePosition) 45 self.interest = itemID 46 self.fov = lastCamera.fov 47 self.SetFovTarget(self.default_fov) 48 SpaceObjectExplosionManager.GetExplosionTimesWhenAvailable(itemID, self.SetTimes) 49 50 def SetTimes(self, globalExplosionStart, wreckSwitchTime): 51 self.startTime = blue.os.GetSimTime() 52 self.msUntilGlobal = float(blue.os.TimeDiffInMs(self.startTime, long(globalExplosionStart))) * 1.2 53 self.CalculatePoints() 54 if self.animateCamera: 55 velocity = geo2.Vec3Distance(self.p0, self.p2) / max(self.msUntilGlobal, 100) 56 self.endTime = self.msUntilGlobal + min(geo2.Vec3Distance(self.p2, self.p3) / velocity, 5000) 57 self.isRunning = True 58 59 def Update(self): 60 if not self.isRunning: 61 BaseSpaceCamera.Update(self) 62 return 63 egoBall = GetBall(self.ego) 64 if egoBall is None: 65 self.isRunning = False 66 return 67 if not self.animateCamera: 68 egoPos = GetBallPosition(egoBall) 69 self.Transit(self.atPosition, self.eyePosition, egoPos, self.eyePosition, 3.0, callback=self.SwitchToPrimaryCamera) 70 self.isRunning = False 71 else: 72 interestBall = GetBall(self.interest) 73 if interestBall is None: 74 self.isRunning = True 75 return 76 t = float(blue.os.TimeDiffInMs(self.startTime, blue.os.GetSimTime())) 77 self.atPosition = GetBallPosition(interestBall) 78 if t < self.msUntilGlobal: 79 self.eyePosition = self.GetSplinePosition(t / self.msUntilGlobal, self.p0, self.p1, self.p2) 80 elif t < self.endTime: 81 frac = (t - self.msUntilGlobal) / (self.endTime - self.msUntilGlobal) 82 self.eyePosition = self.GetPosBetweenTwoPoints(frac, self.p2, self.p3) 83 else: 84 egoPos = GetBallPosition(egoBall) 85 self.Transit(self.atPosition, self.p3, egoPos, self.p3, 5.0, callback=self.SwitchToPrimaryCamera) 86 self.isRunning = False 87 BaseSpaceCamera.Update(self) 88 89 def GetPosBetweenTwoPoints(self, frac, p0, p1): 90 invFrac = 1 - frac 91 p0Influence = geo2.Vec3Scale(p0, invFrac) 92 p1Influence = geo2.Vec3Scale(p1, frac) 93 newPoint = geo2.Vec3Add(p0Influence, p1Influence) 94 return newPoint 95 96 def GetSplinePosition(self, frac, p0, p1, p2): 97 invFrac = 1 - frac 98 p0Influence = geo2.Vec3Scale(p0, invFrac * invFrac) 99 p1Influence = geo2.Vec3Scale(p1, 2.0 * frac * invFrac) 100 p2Influence = geo2.Vec3Scale(p2, frac * frac) 101 newPoint = geo2.Vec3Add(p0Influence, geo2.Vec3Add(p1Influence, p2Influence)) 102 return newPoint 103 104 def CalculatePoints(self): 105 startBall = GetBall(self.interest) 106 startPos = GetBallPosition(startBall) 107 egoBall = GetBall(self.ego) 108 endPos = GetBallPosition(egoBall) 109 offset = geo2.Vec3Subtract(endPos, startPos) 110 if self.GetDistanceFromLookAt() > geo2.Vec3Length(offset): 111 self.animateCamera = False 112 return 113 self.animateCamera = True 114 distanceFromLookAt = self.GetDistanceFromLookAt() 115 self.p0 = self.eyePosition 116 self.p3 = self._GetNewLookAtEyePosWithPositionInView(endPos, max(distanceFromLookAt, egoBall.radius * 5.0), startPos) 117 shipBasedBounds = startBall.radius * BOUNDING_SPHERE_MULTIPLICATION 118 if geo2.Vec3DistanceSq(endPos, startPos) < geo2.Vec3DistanceSq(endPos, self.p0): 119 if distanceFromLookAt < shipBasedBounds: 120 self.SetupOrbitTrackInsideOfBounds(distanceFromLookAt, shipBasedBounds) 121 else: 122 self.SetupOrbitTrackOutsideOfBounds(distanceFromLookAt) 123 elif distanceFromLookAt < shipBasedBounds: 124 self.SetupTranslationTrackInsideOfBounds(distanceFromLookAt, shipBasedBounds) 125 else: 126 self.SetupTranslationTrackOutsideOfBounds() 127 128 def SetupOrbitTrackInsideOfBounds(self, distanceFromLookAt, bounds): 129 perpendicularDirection = self.FindPerpendicularDirection(self.eyePosition, self.atPosition, self.p3) 130 self.p1 = geo2.Vec3Add(self.atPosition, geo2.Vec3Scale(perpendicularDirection, distanceFromLookAt)) 131 lengthToBounds = bounds * bounds - distanceFromLookAt * distanceFromLookAt 132 lengthFromP1ToP3 = geo2.Vec3DistanceSq(self.p1, self.p3) 133 if lengthToBounds > lengthFromP1ToP3: 134 self.p2 = self.p3 135 else: 136 p1ToP3 = geo2.Vec3Direction(self.p3, self.p1) 137 self.p2 = geo2.Vec3Add(self.p1, geo2.Vec3Scale(p1ToP3, math.sqrt(lengthToBounds))) 138 139 def SetupTranslationTrackInsideOfBounds(self, distanceFromLookAt, bounds): 140 perpendicularDirection = self.FindPerpendicularDirection(self.eyePosition, self.atPosition, self.p3) 141 perpendicularPos = geo2.Vec3Add(self.atPosition, geo2.Vec3Scale(perpendicularDirection, distanceFromLookAt)) 142 lengthToBounds = bounds * bounds - distanceFromLookAt * distanceFromLookAt 143 lengthFromP1ToP3 = geo2.Vec3DistanceSq(perpendicularPos, self.p3) 144 if lengthToBounds > lengthFromP1ToP3: 145 self.p2 = self.p3 146 else: 147 p1ToP3 = geo2.Vec3Direction(self.p3, perpendicularPos) 148 self.p2 = geo2.Vec3Add(self.atPosition, geo2.Vec3Scale(p1ToP3, math.sqrt(lengthToBounds))) 149 self.p1 = geo2.Vec3Add(self.p0, MiddlePoint(self.p2, self.p0)) 150 151 def SetupOrbitTrackOutsideOfBounds(self, distanceFromLookAt): 152 perpendicularDirection = self.FindPerpendicularDirection(self.eyePosition, self.atPosition, self.p3) 153 self.p2 = geo2.Vec3Add(self.atPosition, geo2.Vec3Scale(perpendicularDirection, distanceFromLookAt)) 154 self.p1 = geo2.Vec3Add(self.p0, MiddlePoint(self.p2, self.p0)) 155 156 def SetupTranslationTrackOutsideOfBounds(self): 157 self.p1 = self.GetPosBetweenTwoPoints(0.1, self.p0, self.p3) 158 self.p2 = self.GetPosBetweenTwoPoints(0.2, self.p0, self.p3) 159 160 def FindPerpendicularDirection(self, eyePosition, atPosition, point): 161 eyeToAt = geo2.Vec3Subtract(atPosition, eyePosition) 162 eyeToPoint = geo2.Vec3Subtract(point, eyePosition) 163 scale = geo2.Vec3Dot(eyeToPoint, eyeToAt) / geo2.Vec3Dot(eyeToAt, eyeToAt) 164 closestPointOnLine = geo2.Vec3Add(eyePosition, geo2.Vec3Scale(eyeToAt, scale)) 165 direction = geo2.Vec3Direction(point, closestPointOnLine) 166 return direction 167 168 def SwitchToPrimaryCamera(self): 169 spaceCamera = sm.GetService('viewState').GetView(ViewState.Space).ActivatePrimaryCamera() 170 if self.animateCamera: 171 spaceCamera.eyePosition = self.eyePosition 172 spaceCamera.atPosition = self.atPosition 173 self.ResetCamera() 174 return spaceCamera 175 176 def OnDeactivated(self): 177 BaseSpaceCamera.OnDeactivated(self) 178 uicore.animations.StopAllAnimations(self) 179 180 def Track(self, itemID, **kwargs): 181 cam = self.SwitchToPrimaryCamera() 182 if cam: 183 cam.Track(itemID) 184 185 def LookAt(self, itemID, **kwargs): 186 cam = self.SwitchToPrimaryCamera() 187 if cam: 188 cam.LookAt(itemID, **kwargs) 189 190 def LookAtMaintainDistance(self, itemID): 191 pass 192 193 def _GetNewLookAtEyePosWithPositionInView(self, atPos1, radius, interestPosition): 194 vectorDiff = geo2.Vec3Subtract(atPos1, interestPosition) 195 fov = self.fov - self.fovOffset 196 angleToRotate = -fov * 0.65 197 randomness = 0.5 * random.random() 198 invRandomness = 0.5 - randomness 199 rotation = geo2.MatrixMultiply(geo2.MatrixRotationX(angleToRotate * randomness), geo2.MatrixRotationY(angleToRotate * invRandomness)) 200 newEyeDir = geo2.Vec3Normalize(vectorDiff) 201 newEyeDir = geo2.Vec3Transform(newEyeDir, rotation) 202 return geo2.Vec3Add(geo2.Vec3Scale(newEyeDir, radius), atPos1)