Esempio n. 1
0
 def GenGeometry(self):
     """
     Generates the geometry for the scaling tool.
     """
     scalingGeo = dungeonEditorToolGeometry.geometry(self.primitiveScene)
     wBox = dungeonEditorToolGeometry.area('w',
                                           dungeonEditorToolGeometry.CYAN)
     wBox.AddToSolidSet(dungeonEditorToolGeometry.CUBE_TRIS)
     xBox = dungeonEditorToolGeometry.area('x',
                                           dungeonEditorToolGeometry.RED)
     transform = geo2.MatrixTranslation(1.0, 0.0, 0.0)
     x_tris = geo2.Vec3TransformCoordArray(
         dungeonEditorToolGeometry.CUBE_TRIS, transform)
     xBox.AddToSolidSet(x_tris)
     xBox.AddToLineSet(((0.0, 0.0, 0.0), (1.0, 0.0, 0.0)))
     transform = geo2.MatrixTranslation(0.0, 1.0, 0.0)
     y_tris = geo2.Vec3TransformCoordArray(
         dungeonEditorToolGeometry.CUBE_TRIS, transform)
     yBox = dungeonEditorToolGeometry.area('y',
                                           dungeonEditorToolGeometry.GREEN)
     yBox.AddToSolidSet(y_tris)
     yBox.AddToLineSet(((0.0, 0.0, 0.0), (0.0, 1.0, 0.0)))
     transform = geo2.MatrixTranslation(0.0, 0.0, 1.0)
     z_tris = geo2.Vec3TransformCoordArray(
         dungeonEditorToolGeometry.CUBE_TRIS, transform)
     zBox = dungeonEditorToolGeometry.area('z',
                                           dungeonEditorToolGeometry.BLUE)
     zBox.AddToSolidSet(z_tris)
     zBox.AddToLineSet(((0.0, 0.0, 0.0), (0.0, 0.0, 1.0)))
     scalingGeo.AppendArea(xBox)
     scalingGeo.AppendArea(yBox)
     scalingGeo.AppendArea(zBox)
     scalingGeo.AppendArea(wBox)
     return scalingGeo
def GetSolidAroundLine(line, radius):
    rad = math.pi * 2.0 / 3.0
    triangle1 = []
    triangle1.append((math.cos(0) * radius, math.sin(0) * radius, 0.0))
    triangle1.append((math.cos(rad) * radius, math.sin(rad) * radius, 0.0))
    triangle1.append(
        (math.cos(2 * rad) * radius, math.sin(2 * rad) * radius, 0.0))
    dirOfLine = geo2.Vec3Normalize(geo2.Vec3Subtract(line[1], line[0]))
    if abs(geo2.Vec3Dot((0.0, 0.0, 1.0), dirOfLine)) != 1.0:
        rot = geo2.QuaternionRotationArc((0.0, 0.0, 1.0), dirOfLine)
    else:
        rot = geo2.QuaternionIdentity()
    rot = geo2.MatrixRotationQuaternion(rot)
    t1 = geo2.MatrixTranslation(*line[0])
    t2 = geo2.MatrixTranslation(*line[1])
    compA = geo2.MatrixMultiply(rot, t1)
    compB = geo2.MatrixMultiply(rot, t2)
    startTri = geo2.Vec3TransformCoordArray(triangle1, compA)
    endTri = geo2.Vec3TransformCoordArray(triangle1, compB)
    triangles = [
        startTri[1], endTri[0], startTri[0], endTri[1], endTri[0], startTri[1],
        startTri[2], endTri[1], startTri[1], endTri[2], endTri[1], startTri[2],
        startTri[0], endTri[2], startTri[2], endTri[0], endTri[2], startTri[0]
    ]
    return triangles
Esempio n. 3
0
 def Orbit(self, yaw, pitch):
     dev = trinity.device
     self.Focus(self.pointOfInterest)
     up = geo2.Vector(0.0, 1.0, 0.0)
     t = geo2.Vector(self.localViewMatrix[1][0], self.localViewMatrix[1][1], self.localViewMatrix[1][2])
     if geo2.Vec3Dot(t, up) <= 0.0:
         pitch = -pitch
         yaw = -yaw
     pos = self.GetPosition()
     target = self.pointOfInterest
     view = geo2.Subtract(pos, target)
     view = geo2.Vec3Normalize(view)
     right = geo2.Vec3Cross(view, up)
     mat = self.localViewMatrix
     ipmat = geo2.MatrixTranslation(-target[0], -target[1], -target[2])
     pmat = geo2.MatrixTranslation(target[0], target[1], target[2])
     mat = geo2.MatrixInverse(mat)
     yrotMat = geo2.MatrixRotationAxis(up, yaw)
     rrotMat = geo2.MatrixRotationAxis(right, pitch)
     yrotMat = geo2.MatrixMultiply(yrotMat, rrotMat)
     mat = geo2.MatrixMultiply(mat, ipmat)
     mat = geo2.MatrixMultiply(mat, yrotMat)
     mat = geo2.MatrixMultiply(mat, pmat)
     self._position = geo2.MatrixDecompose(mat)[2]
     mat = geo2.MatrixInverse(mat)
     self.localViewMatrix = mat
Esempio n. 4
0
 def GenGeometry(self):
     rotateMat = geo2.MatrixRotationZ(-math.pi / 2.0)
     transform = geo2.MatrixTranslation(0.0, 1.0, 0.0)
     transform = geo2.MatrixMultiply(transform, rotateMat)
     c_tris = geo2.Vec3TransformCoordArray(dungeonEditorToolGeometry.CONE_TRIS, transform)
     xTransAreaCone = dungeonEditorToolGeometry.area('x', dungeonEditorToolGeometry.RED)
     xTransAreaCone.AddToSolidSet(c_tris)
     xTransAreaAxis = dungeonEditorToolGeometry.area('x', dungeonEditorToolGeometry.RED)
     xTransAreaAxis.AddToLineSet([(0.0, 0.0, 0.0), (1.0, 0.0, 0.0)])
     t = dungeonEditorToolGeometry.GetSolidAroundLine([(0.3, 0.0, 0.0), (1.0, 0.0, 0.0)], 0.08)
     xTransAreaAxis.AddToPickingSet(t)
     transform = geo2.MatrixTranslation(0.0, 1.0, 0.0)
     c_tris = geo2.Vec3TransformCoordArray(dungeonEditorToolGeometry.CONE_TRIS, transform)
     yTransAreaCone = dungeonEditorToolGeometry.area('y', dungeonEditorToolGeometry.GREEN)
     yTransAreaCone.AddToSolidSet(c_tris)
     yTransAreaAxis = dungeonEditorToolGeometry.area('y', dungeonEditorToolGeometry.GREEN)
     yTransAreaAxis.AddToLineSet([(0.0, 0.0, 0.0), (0.0, 1.0, 0.0)])
     t = dungeonEditorToolGeometry.GetSolidAroundLine([(0.0, 0.3, 0.0), (0.0, 1.0, 0.0)], 0.08)
     yTransAreaAxis.AddToPickingSet(t)
     transform = geo2.MatrixTranslation(0.0, 1.0, 0.0)
     rotateMat = geo2.MatrixRotationX(math.pi / 2.0)
     transform = geo2.MatrixMultiply(transform, rotateMat)
     c_tris = geo2.Vec3TransformCoordArray(dungeonEditorToolGeometry.CONE_TRIS, transform)
     zTransAreaCone = dungeonEditorToolGeometry.area('z', dungeonEditorToolGeometry.BLUE)
     zTransAreaCone.AddToSolidSet(c_tris)
     zTransAreaAxis = dungeonEditorToolGeometry.area('z', dungeonEditorToolGeometry.BLUE)
     zTransAreaAxis.AddToLineSet([(0.0, 0.0, 0.0), (0.0, 0.0, 1.0)])
     t = dungeonEditorToolGeometry.GetSolidAroundLine([(0.0, 0.0, 0.3), (0.0, 0.0, 1.0)], 0.08)
     zTransAreaAxis.AddToPickingSet(t)
     wTransAreaPlane = dungeonEditorToolGeometry.area('w', dungeonEditorToolGeometry.CYAN)
     wTransAreaPlane.AddToLineSet(dungeonEditorToolGeometry.CIRCLE_POINTS_QUART)
     wTransAreaPlane._lineset.viewOriented = True
     picking_tris = dungeonEditorToolGeometry.GenCircleTriangles(0.25)
     if not trinity.IsRightHanded():
         picking_tris.reverse()
     wTransAreaPlane.AddToPickingSet(picking_tris)
     translationGeo = dungeonEditorToolGeometry.geometry(self.primitiveScene)
     translationGeo.AppendArea(wTransAreaPlane)
     translationGeo.AppendArea(xTransAreaCone)
     translationGeo.AppendArea(xTransAreaAxis)
     translationGeo.AppendArea(yTransAreaCone)
     translationGeo.AppendArea(yTransAreaAxis)
     translationGeo.AppendArea(zTransAreaCone)
     translationGeo.AppendArea(zTransAreaAxis)
     self.cones.append(xTransAreaCone)
     self.cones.append(yTransAreaCone)
     self.cones.append(zTransAreaCone)
     self.axes.append(xTransAreaAxis)
     self.axes.append(yTransAreaAxis)
     self.axes.append(zTransAreaAxis)
     return translationGeo
 def _UpdateFreelookCamera(self):
     lastTime = blue.os.GetSimTime()
     while self.IsFreeLook():
         camera = sm.GetService('sceneManager').GetRegisteredCamera(
             None, defaultOnActiveCamera=True)
         if camera is not None:
             delta = blue.os.TimeDiffInMs(lastTime, blue.os.GetSimTime())
             keyDown = uicore.uilib.Key
             if keyDown(uiconst.VK_CONTROL) and not keyDown(
                     uiconst.VK_MENU) and not keyDown(uiconst.VK_SHIFT):
                 if keyDown(uiconst.VK_W):
                     self._ChangeCamPos(
                         geo2.Vec3Scale(camera.viewVec, -delta))
                 if keyDown(uiconst.VK_S):
                     self._ChangeCamPos(
                         geo2.Vec3Scale(camera.viewVec, delta))
                 if keyDown(uiconst.VK_A):
                     self._ChangeCamPos(
                         geo2.Vec3Scale(camera.rightVec, -delta))
                 if keyDown(uiconst.VK_D):
                     self._ChangeCamPos(
                         geo2.Vec3Scale(camera.rightVec, delta))
                 if keyDown(uiconst.VK_R):
                     self._ChangeCamPos(geo2.Vec3Scale(camera.upVec, delta))
                 if keyDown(uiconst.VK_F):
                     self._ChangeCamPos(geo2.Vec3Scale(
                         camera.upVec, -delta))
             self.axisLines.localTransform = geo2.MatrixTranslation(
                 *self._cameraSvc.GetCameraParent().translation)
         lastTime = blue.os.GetSimTime()
         blue.synchro.Yield()
Esempio n. 6
0
 def GetSafeSpotTransformMatrix(self):
     rotQuat = geo2.QuaternionRotationSetYawPitchRoll(
         self.GetSafeSpotYaw(), 0, 0)
     rotMatrix = geo2.MatrixRotationQuaternion(rotQuat)
     rotMatrix = geo2.MatrixInverse(rotMatrix)
     transMatrix = geo2.MatrixTranslation(*self.GetSafeSpotPosition())
     return geo2.MatrixMultiply(rotMatrix, transMatrix)
Esempio n. 7
0
 def GetTargetPlaneProjectionMatrix(self):
     trans = self.GetTranslation()
     adjusted_translation = ProjectPointTowardsFrontPlane(trans)
     rmat = geo2.MatrixRotationQuaternion(self.GetRotation())
     rmat = geo2.MatrixTranspose(rmat)
     mat = geo2.MatrixTranslation(adjusted_translation.x, adjusted_translation.y, adjusted_translation.z)
     self.frontPlaneTranslation = geo2.MatrixMultiply(rmat, mat)
     return self.frontPlaneTranslation
Esempio n. 8
0
 def Update(self):
     parentMat = geo2.MatrixTranslation(*self.parentPos)
     viewInv = geo2.MatrixInverse(self.localViewMatrix)
     newT = geo2.MatrixMultiply(viewInv, parentMat)
     self.viewMatrix = geo2.MatrixInverse(newT)
     trinity.SetViewTransform(self.viewMatrix)
     trinity.SetPerspectiveProjection(self.fieldOfView, self.frontClip, self.backClip, self.aspectRatio)
     self.projection.PerspectiveFov(self.fieldOfView, self.aspectRatio, self.frontClip, self.backClip)
Esempio n. 9
0
 def AddToScene(self, entity, component):
     if component.trinityObject is None:
         component.trinityObject = trinity.Load(component.redFile)
     scene = self.graphicClient.GetScene(entity.scene.sceneID)
     if scene:
         scene.AddDynamic(component.trinityObject)
     positionComponent = entity.GetComponent('position')
     if positionComponent is not None and component.trinityObject is not None:
         component.trinityObject.transform = geo2.MatrixMultiply(
             geo2.MatrixRotationQuaternion(positionComponent.rotation),
             geo2.MatrixTranslation(positionComponent.position[0],
                                    positionComponent.position[1],
                                    positionComponent.position[2]))
Esempio n. 10
0
 def ApplyParticleEffect(self, *args):
     if not sm.GetService('device').GetAppFeatureState('Interior.ParticlesEnabled', True):
         return True
     entityID, effectFilePath, boneName, duration, xOffset, yOffset, zOffset = args[:7]
     yawOffset, pitchOffset, rollOffset, ignoreTransform, effectStringID = args[7:]
     effectID = self._GetNextEffectID()
     zaction.AddPropertyForCurrentPythonProc({effectStringID: effectID})
     translation = geo2.MatrixTranslation(xOffset, yOffset, zOffset)
     rotation = geo2.MatrixRotationYawPitchRoll(math.radians(yawOffset), math.radians(pitchOffset), math.radians(rollOffset))
     offset = geo2.MatrixMultiply(rotation, translation)
     with self.activeParticlesSemaphore:
         trinityObject = trinity.Load(effectFilePath)
         entity = self.entityClient.FindEntityByID(entityID)
         scene = self.graphicClient.GetScene(entity.scene.sceneID)
         scene.AddDynamic(trinityObject)
         curveSet = None
         positionComponent = entity.GetComponent('position')
         if boneName or positionComponent:
             curveSet = trinity.TriCurveSet()
             scene.AddCurveSetToScene(curveSet)
             if boneName:
                 paperDollComponent = entity.GetComponent('paperdoll')
                 model = paperDollComponent.doll.avatar
                 curve = trinity.Tr2BoneMatrixCurve()
                 curve.skinnedObject = model
                 curve.bone = boneName
                 if not ignoreTransform:
                     offset = geo2.MatrixMultiply(offset, trinityObject.transform)
                 curve.transform = offset
             else:
                 curve = GameWorld.PositionComponentCurve()
                 curve.positionComponent = positionComponent
                 curve.positionOffset = geo2.Vector(xOffset, yOffset, zOffset)
                 curve.rotationOffset = geo2.QuaternionRotationSetYawPitchRoll(yawOffset, pitchOffset, rollOffset)
             bind = trinity.TriValueBinding()
             bind.destinationObject = trinityObject
             bind.destinationAttribute = 'transform'
             bind.sourceObject = curve
             bind.sourceAttribute = 'currentValue'
             curveSet.curves.append(curve)
             curveSet.bindings.append(bind)
             curveSet.Play()
         expireTime = blue.os.GetWallclockTime() + duration * const.MSEC
         effectData = util.KeyVal(effectID=effectID, entityID=entityID, effectFilePath=effectFilePath, expireTime=expireTime, offset=offset, trinityObject=trinityObject, sceneID=entity.scene.sceneID, curveSet=curveSet)
         self.activeParticleEffects[effectID] = effectData
         if duration > 0:
             self.timedParticleEffects.append(effectData)
             self.timedParticleEffects.sort(key=lambda entry: entry.expireTime)
             self.updateTaskletLock.set()
         self._ConnectEffectCurveSets(effectData, effectStringID)
     return True
Esempio n. 11
0
    def FollowCamera(self, target, aimTarget=None):
        viewStep, proj = self.GetViewAndProjection()
        if viewStep:
            viewStep.view = trinity.TriView()
        camera = sm.GetService('sceneManager').GetRegisteredCamera(
            None, defaultOnActiveCamera=True)
        globalSceneScale = 1.0
        ballpark = sm.GetService('michelle').GetBallpark()
        ball = ballpark.GetBall(eve.session.shipid)
        self.resetCamera = False
        while not self.resetCamera and target:
            time = blue.os.GetSimTime()
            rot = target.rotationCurve
            if True:
                rotation = rot.GetQuaternionAt(time)
                translation = target.translationCurve.GetVectorAt(time)
                if ball:
                    targetPos = ball.model.worldPosition
                    targetVector = (targetPos[0] - translation.x,
                                    targetPos[0] - translation.x,
                                    targetPos[0] - translation.x)
                    targetVector = geo2.Vec3Normalize(targetVector)
                    dist = 100.0
                    elevation = 0.0
                    translation.x = translation.x - targetVector[0] * dist
                    translation.y = translation.y - targetVector[
                        1] * dist + elevation
                    translation.z = translation.z - targetVector[2] * dist
                    lookat = geo2.MatrixLookAtRH(
                        (translation.x, translation.y, translation.z),
                        targetPos, (0.0, 1.0, 0.0))
                trans = geo2.MatrixTranslation(
                    translation.x * globalSceneScale,
                    translation.y * globalSceneScale,
                    translation.z * globalSceneScale)
                rot = geo2.MatrixRotationQuaternion(
                    (rotation.x, rotation.y, rotation.z, rotation.w))
                if viewStep and viewStep.view:
                    viewStep.view.transform = lookat
            blue.synchro.Yield()

        if viewStep:
            viewStep.view = None
        proj.projection = camera.projectionMatrix
        self.resetCamera = False
Esempio n. 12
0
    def _UpdateCameraAnimation(self,
                               alignToParent=False,
                               alignTargets=None,
                               loop=False,
                               clipName=None,
                               parent=None):
        def FindParametersInPostFx():
            blurScaleH = None
            blurScaleV = None
            blurFade = None
            exposure = None
            rj = self.GetRenderJob()
            if rj:
                for step in rj.steps:
                    if step.name == 'RJ_POSTPROCESSING':
                        if step.job:
                            for jobStep in step.job.steps:
                                if jobStep.name == 'PostProcess Blur':
                                    for fx in jobStep.PostProcess.stages:
                                        for param in fx.parameters:
                                            if param.name == 'ScalingFactor':
                                                if fx.name == 'Gaussian Horizontal Blur':
                                                    blurScaleH = param
                                                if fx.name == 'Gaussianl Vertical Blur':
                                                    blurScaleV = param
                                                if fx.name == '4x Up Filter and Add':
                                                    blurFade = param

                                if jobStep.name == 'PostProcess Exposure':
                                    for fx in jobStep.PostProcess.stages:
                                        for param in fx.parameters:
                                            if param.name == 'ScalingFactor':
                                                if fx.name == '4x Up Filter and Add':
                                                    exposure = param

            return (blurScaleH, blurScaleV, blurFade, exposure)

        transformTrack = None
        shakeSequencer = None
        duration = 0.0
        curveSetName = 'AnimatedCamera'
        scene = sm.GetService('sceneManager').GetRegisteredScene('default')
        viewStep, proj = self.GetViewAndProjection()
        camera = viewStep.camera
        for cset in scene.curveSets:
            if cset.name == curveSetName:
                transformTrack = cset.curves[0]
                if len(cset.curves) > 1:
                    shakeSequencer = cset.curves[1]

        duration = transformTrack.duration - 1 / 10.0
        oldFov = camera.fieldOfView
        ppJob.AddPostProcess('Blur', 'res:/fisfx/postprocess/blur.red')
        ppJob.AddPostProcess('Exposure', 'res:/fisfx/postprocess/exposure.red')
        blurScaleH, blurScaleV, blurFade, exposure = FindParametersInPostFx()
        ballpark = sm.GetService('michelle').GetBallpark()
        ball = ballpark.GetBall(session.shipid)
        if parent:
            ball = parent.translationCurve
        if alignTargets:
            ball = alignTargets[0]
        if viewStep:
            viewStep.view = trinity.TriView()
        startTime = blue.os.GetSimTime()
        if loop:
            endTime = startTime + 36000000000L
        else:
            endTime = startTime + duration * 10000000
        time = startTime
        globalSceneScale = 4.0 / 30.0 * ball.model.boundingSphereRadius
        lastWorldPos = None
        lastWorldRot = None
        while time < endTime and not self.resetCamera and not self.interrupt:
            time = blue.os.GetSimTime()
            weight1 = 0.0
            weight2 = 0.0
            if self.vectorTracks:
                currentTime = trinity.device.animationTime
                for cvt in self.vectorTracks:
                    if cvt == 'targetWeight1' or cvt == 'targetWeight2':
                        vecTrack = self.vectorTracks[cvt]
                        if cvt == 'targetWeight1':
                            weight1 = vecTrack.value
                        else:
                            weight2 = vecTrack.value

            if viewStep:
                trans = geo2.MatrixTranslation(
                    transformTrack.translation[0] * globalSceneScale,
                    transformTrack.translation[1] * globalSceneScale,
                    transformTrack.translation[2] * globalSceneScale)
                rot = geo2.MatrixRotationQuaternion(transformTrack.rotation)
                comp = geo2.MatrixMultiply(rot, trans)
                if alignToParent:
                    if not ball.model and lastWorldPos:
                        translation = lastWorldPos
                        rotation = lastWorldRot
                    else:
                        rotation = ball.GetQuaternionAt(time)
                        translation = ball.model.worldPosition
                    lastWorldPos = translation
                    lastWorldRot = rotation
                    transOffset = geo2.MatrixTranslation(
                        translation[0], translation[1], translation[2])
                    rotOffset = geo2.MatrixRotationQuaternion(
                        (rotation.x, rotation.y, rotation.z, rotation.w))
                    comp = geo2.MatrixMultiply(comp, rotOffset)
                    comp = geo2.MatrixMultiply(comp, transOffset)
                if alignTargets:
                    t1 = alignTargets[0].model.worldPosition
                    t2 = alignTargets[1].model.worldPosition
                    if True:
                        sphereOffset = alignTargets[
                            1].model.boundingSphereCenter
                        qr = alignTargets[
                            1].model.rotationCurve.GetQuaternionAt(time)
                        quatRotation = (qr.x, qr.y, qr.z, qr.w)
                        correctedOffset = geo2.QuaternionTransformVector(
                            quatRotation, sphereOffset)
                        t2 = geo2.Vec3Add(t2, correctedOffset)
                    rot = geo2.MatrixLookAtRH(t2, t1, (0.0, 1.0, 0.0))
                    rot = geo2.MatrixInverse(rot)
                    rot = (rot[0], rot[1], rot[2], (t1[0], t1[1], t1[2], 1.0))
                    comp = geo2.MatrixMultiply(comp, rot)
                    if weight1 > 0.0001:
                        shake = shakeSequencer.value
                        pos = (comp[3][0], comp[3][1], comp[3][2])
                        targetPos = (t2[0] + shake.x, t2[1] + shake.y,
                                     t2[2] + shake.z)
                        lookat = geo2.MatrixLookAtRH(pos, targetPos,
                                                     (0.0, 1.0, 0.0))
                        lookat = geo2.MatrixInverse(lookat)
                        qlookat = geo2.QuaternionRotationMatrix(lookat)
                        qorig = geo2.QuaternionRotationMatrix(comp)
                        qresult = geo2.Lerp(qorig, qlookat, weight1)
                        mresult = geo2.MatrixRotationQuaternion(qresult)
                        comp = (mresult[0], mresult[1], mresult[2], comp[3])
                if viewStep.view:
                    viewStep.view.transform = geo2.MatrixInverse(comp)
            if self.vectorTracks:
                currentTime = trinity.device.animationTime
                for cvt in self.vectorTracks:
                    if cvt == 'fov':
                        vecTrack = self.vectorTracks['fov']
                        fovValue = vecTrack.value
                        camera.fieldOfView = fovValue
                        proj.projection.PerspectiveFov(
                            fovValue, trinity.device.width /
                            float(trinity.device.height), camera.frontClip,
                            camera.backClip)
                    if cvt == 'blur':
                        vecTrack = self.vectorTracks['blur']
                        blurValue = vecTrack.value
                        if blurScaleH and blurScaleV and blurFade:
                            blurScaleH.value = blurValue
                            blurScaleV.value = blurValue
                            if blurValue > 0.01:
                                blurFade.value = 1.0
                            else:
                                blurFade.value = 0.0
                    if cvt == 'exposure':
                        vecTrack = self.vectorTracks['exposure']
                        exposureValue = vecTrack.value
                        if exposure:
                            exposure.value = exposureValue

                if 'fov' not in self.vectorTracks:
                    camera.fieldOfView = oldFov
                    proj.projection.PerspectiveFov(
                        oldFov,
                        trinity.device.width / float(trinity.device.height),
                        camera.frontClip, camera.backClip)
            blue.synchro.Yield()

        if exposure and blurFade:
            exposure.value = 0.0
            blurFade.value = 0.0
        if viewStep:
            viewStep.view = None
        camera.fieldOfView = oldFov
        if not self.interrupt:
            if not camera.fieldOfView == 1.0:
                self.LogWarn('Warning: Camera fov not 1, correcting...')
                camera.fieldOfView = 1.0
            proj.projection = camera.projectionMatrix
        self.playingClip = False
        if self.continuousType and not self.interrupt and not self.resetCamera:
            self.interrupt = False
            self.UpdateContinuous()
        self.resetCamera = False
        self.interrupt = False
        if clipName:
            self.LogInfo('Camera clip done:', clipName)