Пример #1
0
 def __init__(self, paparazziMode=False):
     if not paparazziMode:
         sm.RegisterNotify(self)
     if len(trinity.textureAtlasMan.atlases) == 0:
         trinity.textureAtlasMan.AddAtlas(
             trinity.PIXEL_FORMAT.B8G8R8A8_UNORM, 2048, 2048)
     self.textureAtlas = trinity.textureAtlasMan.atlases[0]
     self.textureAtlas.optimizeOnRemoval = False
     self.renderObjectToPyObjectDict = weakref.WeakValueDictionary()
     self.x = -1
     self.y = -1
     self.z = 0
     self.dx = 0
     self.dy = 0
     self.dz = 0
     self._mouseOver = None
     self._auxMouseOverRO = None
     self._capturingMouseItem = None
     self._clickItem = None
     self._mouseTargetObject = None
     self.exclusiveMouseFocusActive = False
     self.appfocusitem = None
     self.selectedCursorType = uiconst.UICURSOR_DEFAULT
     self.centerMouse = False
     self.ignoreDeadChar = None
     self._lastEventTime = None
     self._globalClickCounter = 0
     self._globalKeyDownCounter = 0
     self._clickTime = None
     self._clickCount = 0
     self._clickTimer = None
     self._clickPosition = None
     self.rootObjects = []
     self.rootObjectsByName = {}
     self._triuiRegs = {}
     self._triuiRegsByMsgID = {}
     self._mouseButtonStates = {}
     self._mouseDownPosition = {}
     self._appfocusitem = None
     self._modkeysOff = tuple([0 for x in uiconst.MODKEYS])
     self._expandMenu = None
     self._keyDownAcceleratorThread = None
     self.blurredBackBufferRenderJob = None
     self.blurredBackBufferAtlas = None
     self.desktopBlurredBg = None
     self._pickProjection = trinity.TriProjection()
     self._pickView = trinity.TriView()
     self._pickViewport = trinity.TriViewport()
     self.cursorCache = {}
     self.alignIslands = []
     uicore.uilib = self
     trinity.fontMan.loadFlag = 32
     if not paparazziMode:
         self._SetupRenderJob()
         self.desktop = self.CreateRootObject('Desktop', isFullscreen=True)
         uthread.new(self.EnableEventHandling)
         from eve.client.script.ui.tooltips.tooltipHandler import TooltipHandler
         self.tooltipHandler = TooltipHandler()
     trinity.device.RegisterResource(self)
     self._hoverThread = None
    def RunSimulation(self):
        trinity.settings.SetValue('frustumCullingDisabled', 1)
        trinity.settings.SetValue('eveSpaceSceneVisibilityThreshold', 0)
        trinity.settings.SetValue('eveSpaceSceneLowDetailThreshold', 0)
        trinity.settings.SetValue('eveSpaceSceneMediumDetailThreshold', 0)
        ut.StartTasklet(self._PumpBlue)
        import sceneutils
        scene = sceneutils.GetOrCreateScene()
        scene.objects.append(self.redNodeMutated)
        self._UpdateBoundingBox(True)
        rj = trinity.CreateRenderJob('CallbackJob')
        projection = trinity.TriProjection()
        projection.PerspectiveFov(1, 1, 1, 10000000)
        rj.steps.append(trinity.TriStepSetProjection(projection))
        view = trinity.TriView()
        view.SetLookAtPosition((50000, 0, 0), (0, 0, 0), (0, 1, 0))
        rj.steps.append(trinity.TriStepSetView(view))
        rj.steps.append(trinity.TriStepUpdate(scene))
        rj.steps.append(trinity.TriStepRenderScene(scene))
        rj.steps.append(trinity.TriStepPythonCB(self.AccumulateBounds))
        rj.ScheduleRecurring()
        for i in range(self._passes):
            self.activeIndex[0] = i
            for cs in self.curveSets:
                cs.Play()

            for sys in self.systems:
                sys.ClearParticles()

            self.started[0] = True
            ut.SleepSim(self._time)

        rj.UnscheduleRecurring()
        self._pumpBlue = False
Пример #3
0
 def __init__(self):
     sm.RegisterNotify(self)
     self._fov = self.default_fov
     self._nearClip = self.default_nearClip
     self._farClip = self.default_farClip
     self._eyePosition = self.default_eyePosition
     self._atPosition = self.default_atPosition
     self._upDirection = self.default_upDirection
     self.panTarget = None
     self.panUpdateThread = None
     self.zoomTarget = None
     self.zoomUpdateThread = None
     self.orbitTarget = None
     self.orbitUpdateThread = None
     self.rotateTarget = None
     self._rotateOffset = (0.0, 0.0)
     self.rotateUpdateThread = None
     self.fovTarget = None
     self.fovUpdateThread = None
     self._fovOffset = 0.0
     self._eyeOffset = None
     self._atOffset = None
     self._eyeAndAtOffset = None
     self._atTransitOffset = None
     self._eyeTransitOffset = None
     self._effectOffset = None
     self.centerOffset = None
     self.isActive = False
     self._transitDoneTime = None
     self.viewMatrix = trinity.TriView()
     self.projectionMatrix = trinity.TriProjection()
Пример #4
0
 def PickObject(self, x, y):
     if self.sceneManager.GetActiveScene() != self.renderScene:
         return
     rescale = 1.0 / 10000.0
     projection = trinity.TriProjection()
     projection.PerspectiveFov(trinity.GetFieldOfView(),
                               trinity.GetAspectRatio(),
                               trinity.GetFrontClip(),
                               trinity.GetBackClip())
     view = trinity.TriView()
     view.transform = trinity.GetViewTransform()
     scaling, rotation, translation = geo2.MatrixDecompose(
         self.transform.worldTransform)
     pZ = geo2.Vec3Transform((0, 0, 1), self.transform.worldTransform)
     surfaceNormal = geo2.Subtract(pZ, translation)
     cameraZ = geo2.Vector(view.transform[0][2], view.transform[1][2],
                           view.transform[2][2])
     if geo2.Vec3Dot(surfaceNormal, cameraZ) < 0:
         return
     self.renderObject.translation = geo2.Vec3Scale(translation, rescale)
     self.renderObject.rotation = rotation
     self.renderObject.scaling = geo2.Vec3Scale(scaling, rescale)
     scaling, rotation, translation = geo2.MatrixDecompose(view.transform)
     translation = geo2.Vec3Scale(translation, rescale)
     view.transform = geo2.MatrixTransformation(None, None, scaling, None,
                                                rotation, translation)
     return self.renderObject.PickObject(x, y, projection, view,
                                         trinity.device.viewport)
Пример #5
0
 def GetViewAndProjectionUsingBoundingSphere(self, boundingSphereRadius, boundingSphereCenter = None, cameraAngle = None, distanceOverride = None, fov = GETPHOTO_FOV):
     cameraAngle = cameraAngle or GETPHOTO_ANGLE
     boundingSphereCenter = boundingSphereCenter or (0.0, 0.0, 0.0)
     dist = distanceOverride if distanceOverride else self._SphericalFit(boundingSphereRadius, fov)
     projection = trinity.TriProjection()
     projection.PerspectiveFov(fov, 1.0, 1.0, GETPHOTO_BACKCLIP)
     view = trinity.TriView()
     view.SetLookAtPosition(*self._GetViewMatrixFromAngle(cameraAngle, boundingSphereCenter, dist))
     return (view, projection)
Пример #6
0
def _GetViewAndProjectionUsingProjectedBoundingBox(
        calculateProjectedBoundingBox,
        scene=None,
        boundingSphereRadius=None,
        boundingSphereCenter=None,
        boundingBoxMin=None,
        boundingBoxMax=None,
        cameraAngle=None):
    """
    Fits an object in frame with view and projection matrices. We first do a rough fit
    using either the bounding sphere or bounding box. We then "zoom in" to the point where
    the projected bounding box fills 90% of the image.
    """
    cameraAngle = cameraAngle or GETPHOTO_ANGLE
    if boundingSphereRadius:
        radius = boundingSphereRadius
        center = boundingSphereCenter if boundingSphereCenter else (0.0, 0.0,
                                                                    0.0)
    else:
        center = geo2.Vec3Add(boundingBoxMin, boundingBoxMax)
        center = geo2.Vec3Scale(center, 0.5)
        radius = geo2.Vec3Length(
            geo2.Vec3Subtract(boundingBoxMax, boundingBoxMin))
    dist = _SphericalFit(radius)
    viewEyeAtUp = _GetViewMatrixFromAngle(cameraAngle, center, dist)
    projTransform = geo2.MatrixPerspectiveFovRH(*GETPHOTO_PROJECTION)
    viewTransform = geo2.MatrixLookAtRH(*viewEyeAtUp)
    combinedTransform = viewTransform
    combinedTransform = geo2.MatrixMultiply(combinedTransform, projTransform)
    safeMin, safeMax = calculateProjectedBoundingBox(combinedTransform)
    deltaX = safeMax[0] - safeMin[0]
    deltaY = safeMax[1] - safeMin[1]
    scalingFactor = 0.9 * (2.0 / max(deltaX, deltaY))
    try:
        if scene.backgroundEffect is not None:
            params = scene.backgroundEffect.Find(['trinity.Tr2FloatParameter'])
            for param in params:
                if param.name == 'ProjectionScaling':
                    param.value = scalingFactor

    except AttributeError:
        pass

    offsetX = -1 * scalingFactor * (safeMin[0] + safeMax[0]) / 2.0
    offsetY = -1 * scalingFactor * (safeMin[1] + safeMax[1]) / 2.0
    scale = 1.0 / tan(GETPHOTO_FOV / 2.0) * scalingFactor
    zn = 1.0
    zf = dist + radius * 2
    t = zn * (1 - offsetY) / scale
    b = -t * (1 + offsetY) / (1 - offsetY)
    r = zn * (1 - offsetX) / scale
    l = -r * (1 + offsetX) / (1 - offsetX)
    projection = trinity.TriProjection()
    projection.PerspectiveOffCenter(l, r, b, t, zn, zf)
    view = trinity.TriView()
    view.SetLookAtPosition(*viewEyeAtUp)
    return (view, projection)
Пример #7
0
 def __init__(self):
     self.direction = (math.pi / 4.0, math.pi / 4.0, math.pi / 4.0)
     self.cameraPosition = (0, 0, 0)
     self.viewMatrix = trinity.TriView()
     self.baseViewMatrix = trinity.TriView()
     self.projectionMatrix = trinity.TriProjection()
     self.fieldOfView = 1.0
     self.frontClip = 0.1
     self.backClip = 1000.0
     self.yaw, self.pitch = self.GetYawPitch()
     self.mouseLeftButtonDown = False
     self.mouseRightButtonDown = False
     self.desiredDeltaX = 0
     self.desiredDeltaY = 0
     self.controlEnabled = True
     self.cameraBehaviors = []
     self.lastUpdateTime = blue.os.GetWallclockTime()
     self.audio2Listener = None
Пример #8
0
 def SetupIncarnaBackground(self, scene, sceneTranslation, sceneRotation):
     if scene is not None:
         self.incarnaRenderJob.SetBackgroundScene(scene)
         self.backgroundView = trinity.TriView()
         self.backgroundProjection = trinity.TriProjection()
         backGroundCameraUpdateFunction = self.incarnaRenderJob.GetBackgroundCameraUpdateFunction(
             self.backgroundView, self.backgroundProjection, 10.0, 40000.0,
             sceneTranslation, sceneRotation)
         self.incarnaRenderJob.SetBackgroundCameraViewAndProjection(
             self.backgroundView, self.backgroundProjection,
             backGroundCameraUpdateFunction)
Пример #9
0
 def __init__(self, fov, front, back, asp):
     self.minZoomDistance = 0.05
     self.maxZoomDistance = 100000.0
     self.parentPos = (0.0, 0.0, 0.0)
     self.localViewMatrix = geo2.MatrixIdentity()
     self.view = trinity.TriView()
     self.view.transform = geo2.MatrixIdentity()
     self.projection = trinity.TriProjection()
     self.SetPerspective(fov, front, back, asp)
     self.SetPosition((0.0, 50.0, -100.0))
     self.Focus((0.0, 0.0, 0.0))
Пример #10
0
 def PickPrimitiveScene(self, x, y):
     camera = sm.GetService('sceneManager').GetActiveCamera()
     view = trinity.TriView()
     view.transform = camera.viewMatrix.transform
     proj = trinity.TriProjection()
     p = camera.projectionMatrix.transform
     proj.CustomProjection(p)
     res = self.primitiveScene.PickObject(x, y, proj, view, trinity.device.viewport)
     if res and res.name in self.PickableAxis():
         return res.name
     else:
         return None
Пример #11
0
 def Run(self, *etc):
     service.Service.Run(self, *etc)
     self.trinityViewMatrix = trinity.TriView()
     self.trinityProjectionMatrix = trinity.TriProjection()
     self.cameraStartupInfo = None
     self.audioListener = None
     self.enabled = False
     self.transition = False
     defaultCamera = cameras.PolarCamera()
     defaultCamera.SetTrinityMatrixObjects(self.trinityViewMatrix, self.trinityProjectionMatrix)
     self.sharedCameras = {'Basic Camera': defaultCamera}
     self.cameraStack = [defaultCamera]
    def _ExpandOpaque(self, bodyPart, targetTex):
        """
        Using pre-generated masks, we bleed the opaque accross the edges defined by said masks.
        This reduces visible seams when the tattoos have been projected in object space so that 
        their pixels in UV space aren't continuous.
        """
        eoMaskPath = 'res:/graphics/character/global/tattoomask/{0}_opaque_mask_{1}.dds'.format(self._gender, bodyPart)
        eoMaskRes = blue.resMan.GetResource(eoMaskPath)
        fx = trinity.Tr2Effect()
        fx.effectFilePath = EO_SHADERRES
        while eoMaskRes.isLoading or fx.effectResource.isLoading:
            PD.Yield()

        tex = trinity.TriTexture2DParameter()
        tex.name = 'Mask'
        tex.SetResource(eoMaskRes)
        fx.resources.append(tex)
        v = trinity.Tr2Vector2Parameter()
        v.name = 'gMaskSize'
        v.value = (eoMaskRes.width, eoMaskRes.height)
        fx.parameters.append(v)
        tex = trinity.TriTexture2DParameter()
        tex.name = 'Texture'
        tex.SetResource(targetTex)
        fx.resources.append(tex)
        v = trinity.Tr2Vector2Parameter()
        v.name = 'gTextureSize'
        v.value = (targetTex.width, targetTex.height)
        fx.parameters.append(v)
        fx.RebuildCachedData()
        vp = trinity.TriViewport()
        vp.width = targetTex.width
        vp.height = targetTex.height
        expandedRT = trinity.Tr2RenderTarget(vp.width, vp.height, 1, trinity.PIXEL_FORMAT.B8G8R8A8_UNORM)
        rj = trinity.CreateRenderJob('Expanding Opaque')
        rj.PushRenderTarget(expandedRT)
        rj.SetProjection(trinity.TriProjection())
        rj.SetView(trinity.TriView())
        rj.SetViewport(vp)
        rj.PushDepthStencil(None)
        rj.Clear((0.0, 0.0, 0.0, 0.0))
        rj.SetStdRndStates(trinity.RM_FULLSCREEN)
        rj.SetRenderState(trinity.D3DRS_SEPARATEALPHABLENDENABLE, 1)
        rj.SetRenderState(trinity.D3DRS_SRCBLENDALPHA, trinity.TRIBLEND_ONE)
        rj.SetRenderState(trinity.D3DRS_DESTBLENDALPHA, trinity.TRIBLEND_ZERO)
        rj.RenderEffect(fx)
        rj.SetRenderTarget(targetTex.wrappedRenderTarget)
        rj.RenderTexture(expandedRT)
        rj.PopRenderTarget()
        rj.PopDepthStencil()
        rj.ScheduleChained()
        rj.WaitForFinish()
Пример #13
0
 def __init__(self):
     service.Service.__init__(self)
     self.selection = []
     self.selectionObjs = []
     self.ignoreAxis = None
     self.lookatID = None
     self.ed = None
     view = trinity.TriView()
     view.SetLookAtPosition((0, 2, -2), (0, 3, 0), (0, 1, 0))
     projection = trinity.TriProjection()
     projection.PerspectiveFov(1, trinity.device.viewport.GetAspectRatio(),
                               1, 3000)
     self.clientToolsScene = None
     self.clientToolsScene = scene = self.GetClientToolsScene()
     self.cursors = {
         'Translation':
         dungeonEditorTools.TranslationTool(view, projection, scene),
         'Rotation':
         dungeonEditorTools.RotationTool(view, projection, scene),
         'Scaling':
         dungeonEditorTools.ScalingTool(view, projection, scene)
     }
     self.currentCursor = None
     self.isActive = False
     self.isMoving = False
     self.isSaving = False
     self.isUnlocking = False
     self.dungeonOrigin = None
     self.playerLocation = None
     self.fakeBallTransforms = {}
     self.backupTranslations = {}
     self.backupRotations = {}
     self.unsavedChanges = {}
     self.unsavedTime = {}
     self.lockedObjects = {}
     self.lockedTime = {}
     self.lastChangeTimestamp = None
     self.lastUpdateRecievedTimestamp = None
     self.selectionCenter = (0.0, 0.0, 0.0)
     self.groupRotation = geo2.Vector(0, 0, 0, 1)
     self.addSelectedTaskletCount = 0
     self.currentHardGroup = None
     self.hardGroupRotations = {}
     self.rotatedSelectionGroups = {}
     self.editDungeonID = None
     self.editRoomID = None
     self.editRoomPos = None
     self.groupsWithNoModel = [
         const.groupCosmicAnomaly, const.groupCosmicSignature
     ]
Пример #14
0
    def _GetViewAndProjectionUsingProjectedBoundingBox(self, CalculateProjectedBoundingBox, scene = None, boundingSphereRadius = None, boundingSphereCenter = None, boundingBoxMin = None, boundingBoxMax = None, cameraAngle = None):
        self.LogInfo('TakeSnapShotUsingBoundingBox')
        cameraAngle = cameraAngle or GETPHOTO_ANGLE
        if boundingSphereRadius:
            radius = boundingSphereRadius
            center = boundingSphereCenter if boundingSphereCenter else (0.0, 0.0, 0.0)
        elif boundingBoxMin and boundingBoxMax:
            boundingBoxMin = geo2.Vector(boundingBoxMin.x, boundingBoxMin.y, boundingBoxMin.z)
            boundingBoxMax = geo2.Vector(boundingBoxMax.x, boundingBoxMax.y, boundingBoxMax.z)
            center = (boundingBoxMin + boundingBoxMax) / 2.0
            radius = geo2.Vec3Length(boundingBoxMax - boundingBoxMin)
        else:
            raise RuntimeError('Can not do a rough fit without either a bounding sphere or bounding box.')
        dist = self._SphericalFit(radius)
        viewEyeAtUp = self._GetViewMatrixFromAngle(cameraAngle, center, dist)
        projTransform = geo2.MatrixPerspectiveFovRH(*GETPHOTO_PROJECTION)
        viewTransform = geo2.MatrixLookAtRH(*viewEyeAtUp)
        combinedTransform = viewTransform
        combinedTransform = geo2.MatrixMultiply(combinedTransform, projTransform)
        safeMin, safeMax = CalculateProjectedBoundingBox(combinedTransform)
        deltaX = safeMax[0] - safeMin[0]
        deltaY = safeMax[1] - safeMin[1]
        scalingFactor = 0.9 * (2.0 / max(deltaX, deltaY))
        try:
            if scene.backgroundEffect is not None:
                params = scene.backgroundEffect.Find(['trinity.TriFloatParameter', 'trinity.Tr2FloatParameter'])
                for param in params:
                    if param.name == 'ProjectionScaling':
                        param.value = scalingFactor

        except AttributeError:
            pass

        offsetX = -1 * scalingFactor * (safeMin[0] + safeMax[0]) / 2.0
        offsetY = -1 * scalingFactor * (safeMin[1] + safeMax[1]) / 2.0
        scale = 1.0 / tan(GETPHOTO_FOV / 2.0) * scalingFactor
        zn = 1.0
        zf = dist + radius * 2
        t = zn * (1 - offsetY) / scale
        b = -t * (1 + offsetY) / (1 - offsetY)
        r = zn * (1 - offsetX) / scale
        l = -r * (1 + offsetX) / (1 - offsetX)
        projection = trinity.TriProjection()
        projection.PerspectiveOffCenter(l, r, b, t, zn, zf)
        view = trinity.TriView()
        view.SetLookAtPosition(*viewEyeAtUp)
        return (view, projection)
Пример #15
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
Пример #16
0
 def __init__(self):
     sm.RegisterNotify(self)
     self._animationCurves = {}
     self._fov = self.default_fov
     self._nearClip = self.default_nearClip
     self._farClip = self.default_farClip
     self._eyePosition = self.default_eyePosition
     self._atPosition = self.default_atPosition
     self._upDirection = self.default_upDirection
     self.panTarget = None
     self.panUpdateThread = None
     self.zoomTarget = None
     self.zoomUpdateThread = None
     self.orbitTarget = None
     self.orbitUpdateThread = None
     self.eventListeners = defaultdict(list)
     self.viewMatrix = trinity.TriView()
     self.projectionMatrix = trinity.TriProjection()
     self.Update()
Пример #17
0
 def GetScenePicture(self, res=128, blur=0):
     scene = sm.GetService('sceneManager').GetRegisteredScene(
         None, defaultOnActiveScene=True)
     camera = sm.GetService('sceneManager').GetActiveCamera()
     depthTexture = scene.depthTexture
     scene.depthTexture = None
     renderTarget = trinity.Tr2RenderTarget(
         res, res, 1, trinity.PIXEL_FORMAT.B8G8R8A8_UNORM)
     depthStencil = trinity.Tr2DepthStencil(
         res, res, trinity.DEPTH_STENCIL_FORMAT.AUTO)
     view = trinity.TriView()
     view.transform = camera.viewMatrix.transform
     projection = camera.projectionMatrix
     renderJob = trinity.CreateRenderJob('StaticScene')
     renderJob.PushRenderTarget(renderTarget)
     renderJob.PushDepthStencil(depthStencil)
     renderJob.SetProjection(projection)
     renderJob.SetView(view)
     renderJob.Clear((0.0, 0.0, 0.0, 0.0), 1.0)
     renderJob.RenderScene(scene)
     renderJob.PopDepthStencil()
     renderJob.PopRenderTarget()
     renderJob.ScheduleOnce()
     renderJob.WaitForFinish()
     scene.depthTexture = depthTexture
     hostCopy = trinity.Tr2HostBitmap(renderTarget)
     hostCopy.name = 'hostCopy'
     if blur:
         gaussBlur = trinity.TriConvolutionMatrix5(2.0, 3.0, 5.0, 3.0, 2.0,
                                                   3.0, 4.0, 8.0, 5.0, 3.0,
                                                   5.0, 7.0, 13.0, 7.0, 5.0,
                                                   3.0, 4.0, 8.0, 5.0, 3.0,
                                                   2.0, 3.0, 5.0, 3.0, 2.0)
         blurCopy = trinity.Tr2HostBitmap(
             res, res, 1, trinity.PIXEL_FORMAT.B8G8R8A8_UNORM)
         blurCopy.name = 'blurCopy'
         blurCopy.ApplyConvFilter(hostCopy, gaussBlur, 0)
         hostCopy = blurCopy
     pic = uiprimitives.Sprite(align=uiconst.TOALL)
     pic.texture.atlasTexture = uicore.uilib.CreateTexture(res, res)
     pic.texture.atlasTexture.CopyFromHostBitmap(hostCopy)
     return pic
 def _Bake(self, targetTex, transform):
     self.SetShaderValue(self.__avatar, 'TattooVSUVTransform', transform)
     size = (targetTex.width, targetTex.height)
     renderTarget = targetTex.wrappedRenderTarget
     sourceVP = trinity.TriViewport()
     sourceVP.width = size[0]
     sourceVP.height = size[1]
     rj = trinity.CreateRenderJob('Baking out source decal texture')
     rj.PushRenderTarget(renderTarget)
     rj.SetProjection(trinity.TriProjection())
     rj.SetView(trinity.TriView())
     rj.SetViewport(sourceVP)
     rj.PushDepthStencil(None)
     rj.Clear((0.0, 0.0, 0.0, 0.0))
     rj.SetStdRndStates(trinity.RM_FULLSCREEN)
     rj.Update(self.bakeScene)
     rj.RenderScene(self.bakeScene)
     rj.PopRenderTarget()
     rj.PopDepthStencil()
     rj.ScheduleChained()
     rj.WaitForFinish()
Пример #19
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)
Пример #20
0
    def RenderStaticEnvironment(self):
        alphaFill = trinity.Tr2Effect()
        alphaFill.effectFilePath = 'res:/Graphics/Effect/Utility/Compositing/AlphaFill.fx'
        trinity.WaitForResourceLoads()
        if self.staticEnvResource is None:
            self.staticEnvResource = StaticEnvironmentResource(self)
        dev = trinity.device
        self.hangarScene.display = True
        self.hangarScene.update = True
        depthTexture = self.hangarScene.depthTexture
        distortionTexture = self.hangarScene.distortionTexture
        self.hangarScene.depthTexture = None
        self.hangarScene.distortionTexture = None
        clientWidth = trinity.device.width
        clientHeight = trinity.device.height
        renderTarget = trinity.Tr2RenderTarget(
            clientWidth, clientHeight, 1, trinity.PIXEL_FORMAT.B8G8R8A8_UNORM)
        depthStencil = trinity.Tr2DepthStencil(
            clientWidth, clientHeight, trinity.DEPTH_STENCIL_FORMAT.AUTO)
        self.SetupCamera()
        camera = self.sceneManager.GetRegisteredCamera(self.name)
        camera.idleMove = False
        updateJob = trinity.CreateRenderJob('UpdateScene')
        updateJob.SetView(None)
        updateJob.Update(self.hangarScene)
        while updateJob.status != trinity.RJ_DONE:
            updateJob.ScheduleOnce()
            updateJob.WaitForFinish()

        view = trinity.TriView()
        view.SetLookAtPosition(camera.pos, camera.intr, (0.0, 1.0, 0.0))
        projection = trinity.TriProjection()
        fov = camera.fieldOfView
        aspectRatio = float(clientWidth) / clientHeight
        projection.PerspectiveFov(fov, aspectRatio, 1.0, 350000.0)
        renderJob = trinity.CreateRenderJob('StaticScene')
        renderJob.PushRenderTarget(renderTarget)
        renderJob.SetProjection(projection)
        renderJob.SetView(view)
        renderJob.PushDepthStencil(depthStencil)
        renderJob.Clear((0.0, 0.0, 0.0, 0.0), 1.0)
        renderJob.RenderScene(self.hangarScene)
        renderJob.SetStdRndStates(trinity.RM_FULLSCREEN)
        renderJob.RenderEffect(alphaFill)
        renderJob.PopDepthStencil()
        renderJob.PopRenderTarget()
        while renderJob.status != trinity.RJ_DONE:
            renderJob.ScheduleOnce()
            renderJob.WaitForFinish()

        self.hangarScene.display = False
        self.hangarScene.update = False
        try:
            rgbSource = trinity.Tr2HostBitmap(renderTarget)
        except Exception:
            log.LogException()
            sys.exc_clear()
            return

        self.RemoveFullScreenSprite()
        self.sprite = uicls.Sprite(parent=uicore.uilib.desktop,
                                   width=uicore.uilib.desktop.width,
                                   height=uicore.uilib.desktop.height,
                                   left=0,
                                   top=0)
        self.sprite.name = 'fullScreenSprite'
        self.sprite.texture.atlasTexture = uicore.uilib.CreateTexture(
            rgbSource.width, rgbSource.height)
        self.sprite.texture.atlasTexture.CopyFromHostBitmap(rgbSource)
        self.hangarScene.display = False
        self.hangarScene.update = False
        self.hangarScene.depthTexture = depthTexture
        self.hangarScene.distortionTexture = distortionTexture
Пример #21
0
 def __init__(self, paparazziMode=False):
     if len(trinity.textureAtlasMan.atlases) == 0:
         trinity.textureAtlasMan.AddAtlas(
             trinity.PIXEL_FORMAT.B8G8R8A8_UNORM, 2048, 2048)
     self.textureAtlas = trinity.textureAtlasMan.atlases[0]
     self.textureAtlas.optimizeOnRemoval = False
     self.renderObjectToPyObjectDict = weakref.WeakValueDictionary()
     self.x = -1
     self.y = -1
     self.z = 0
     self.dx = 0
     self.dy = 0
     self.dz = 0
     self._mouseOver = None
     self._auxMouseOverRO = None
     self._capturingMouseItem = None
     self._clickItem = None
     self.exclusiveMouseFocusActive = False
     self.appfocusitem = None
     self.selectedCursorType = uiconst.UICURSOR_DEFAULT
     self.centerMouse = False
     self.ignoreDeadChar = None
     self._lastEventTime = None
     self._globalClickCounter = 0
     self._globalKeyDownCounter = 0
     self._clickTime = None
     self._clickCount = 0
     self._clickTimer = None
     self._clickPosition = None
     self.rootObjects = []
     self.rootObjectsByName = {}
     self._triuiRegs = {}
     self._triuiRegsByMsgID = {}
     self._mouseButtonStates = {}
     self._mouseDownPosition = {}
     self._appfocusitem = None
     self._modkeysOff = tuple([0 for x in uiconst.MODKEYS])
     self._expandMenu = None
     self._keyDownAcceleratorThread = None
     self._pickProjection = trinity.TriProjection()
     self._pickView = trinity.TriView()
     self._pickViewport = trinity.TriViewport()
     self.cursorCache = {}
     self.alignIslands = []
     uicore.uilib = self
     trinity.fontMan.loadFlag = 32
     if not paparazziMode:
         self.inSceneRenderJob = trinity.CreateRenderJob()
         self.inSceneRenderJob.name = 'In-scene UI'
         self.inSceneRenderJob.ScheduleRecurring(insertFront=True)
         self.renderJob = trinity.CreateRenderJob()
         self.renderJob.name = 'UI'
         self.sceneViewStep = self.renderJob.SetView()
         self.scaledViewportStep = self.renderJob.SetViewport()
         self.sceneProjectionStep = self.renderJob.SetProjection()
         videoJobStep = self.renderJob.RunJob()
         videoJobStep.name = 'Videos'
         self.videoJob = trinity.CreateRenderJob()
         self.videoJob.name = 'Update videos job'
         videoJobStep.job = self.videoJob
         self.bracketCurveSet = trinity.TriCurveSet()
         self.bracketCurveSet.Play()
         self.renderJob.Update(
             self.bracketCurveSet).name = 'Update brackets'
         self.renderJob.SetViewport()
         self.renderJob.PythonCB(self.Update).name = 'Update uilib'
         isFpsEnabled = trinity.IsFpsEnabled()
         if isFpsEnabled:
             trinity.SetFpsEnabled(False)
         self.renderJob.ScheduleRecurring()
         if isFpsEnabled:
             trinity.SetFpsEnabled(True)
         self.desktop = self.CreateRootObject('Desktop', isFullscreen=True)
         uthread.new(self.EnableEventHandling)
     trinity.device.RegisterResource(self)
     self._hoverThread = None
Пример #22
0
 def __init__(self, *args, **kwds):
     self.viewport = None
     self.viewMatrix = trinity.TriView()
     self.projectionMatrix = trinity.TriProjection()
     self.enabled = True
     uthread.new(self.UpdateTick)
    def CreateRenderJobsForLight(self, light):
        """
        Create a renderjob to render out the shadow map for this light, and blur
        it for VSM; optionally also show it on the screen for debugging.
        """
        self.lights.append(light)
        if not SkinSpotLightShadows.REUSE_ENGINE_MAPS:
            light.shadowCasterTypes = 0
        else:
            light.shadowResolution = 1024
        ignoreLight = False
        if self.lightFilter is not None and light.name not in self.lightFilter:
            ignoreLight = True
        elif len(self.lights) > SkinSpotLightShadows.MAX_LIGHTS or light.coneAlphaOuter > 89:
            ignoreLight = True
        if ignoreLight:
            light.importanceScale = 0
            light.importanceBias = -9999
            light.shadowCasterTypes = 0
            return
        light.importanceScale = 0
        light.importanceBias = -len(self.lights)
        if SkinSpotLightShadows.REUSE_ENGINE_MAPS:
            self.RTs[light] = light.GetShadowTextureRes()
            rj = trinity.CreateRenderJob('render shadowmap ' + str(light))
            self.jobs[light] = [rj]
            cb = trinity.TriStepPythonCB()
            cb.name = 'UpdateViewProjForLight'
            cb.SetCallback(lambda : self.UpdateViewProjForLight(None, None, light, None))
            rj.steps.append(cb)
            rj.ScheduleRecurring()
            return
        rj = trinity.CreateRenderJob('render shadowmap ' + str(light))
        renderTarget = None
        while self.width > 8:
            renderTarget = trinity.Tr2RenderTarget(self.width, self.height, 1, self.format)
            if renderTarget is None or not renderTarget.isValid:
                renderTarget = None
                self.width /= 2
                self.height /= 2
                pdCf.Yield()
            else:
                break

        self.RTs[light] = renderTarget
        depthStencil = None
        while self.width > 8:
            depthStencil = trinity.Tr2DepthStencil(self.width, self.height, trinity.DEPTH_STENCIL_FORMAT.D24S8)
            if depthStencil is None or not depthStencil.isValid:
                depthStencil = None
                self.width /= 2
                self.height /= 2
                pdCf.Yield()
            else:
                break

        if not renderTarget or not depthStencil or not renderTarget.isValid or not depthStencil.isValid:
            return
        v = None
        rj.PushViewport()
        rj.PushRenderTarget(renderTarget)
        rj.PushDepthStencil(depthStencil)
        clearColor = (100.0, 1.0, 1.0, 1.0)
        rj.Clear(clearColor, 1.0)
        vp = trinity.TriViewport()
        vp.x = 0
        vp.y = 0
        vp.width = self.width
        vp.height = self.height
        rj.PushProjection()
        rj.PushViewTransform()
        rj.SetViewport(vp)
        cb = trinity.TriStepPythonCB()
        cb.name = 'UpdateViewProjForLight'
        rj.steps.append(cb)
        stepProj = rj.SetProjection(trinity.TriProjection())
        stepView = rj.SetView(trinity.TriView())
        self.UpdateViewProjForLight(stepView, stepProj, light, v)
        cb.SetCallback(lambda : self.UpdateViewProjForLight(stepView, stepProj, light, v))

        def applyVisualizer(doIt):
            for meshData in self.meshes.itervalues():
                if doIt:
                    meshData.applyShadowEffect()
                else:
                    meshData.applyOriginalEffect()

        cb = trinity.TriStepPythonCB()
        cb.name = 'applyVisualizer(True)'
        cb.SetCallback(lambda : applyVisualizer(True))
        rj.steps.append(cb)
        rj.RenderScene(self.scene)
        cb = trinity.TriStepPythonCB()
        cb.name = 'applyVisualizer(False)'
        cb.SetCallback(lambda : applyVisualizer(False))
        rj.steps.append(cb)
        rj.PopDepthStencil()
        rj.PopRenderTarget()
        rj.PopViewTransform().name = 'TriStepPopViewTransform Restoring state'
        rj.PopViewport()
        rj.PopProjection()
        if SkinSpotLightShadows.renderJob is not None and SkinSpotLightShadows.renderJob.object is not None:
            step = trinity.TriStepRunJob()
            step.job = rj
            SkinSpotLightShadows.renderJob.object.steps.insert(0, step)
        else:
            self.jobs[light] = [rj]
            rj.ScheduleRecurring(insertFront=True)
        if self.debugVisualize:
            rj2 = trinity.CreateRenderJob('visualize shadowmap ' + str(light))
            if light not in self.jobs:
                self.jobs[light] = [rj2]
            else:
                self.jobs[light].append(rj2)
            rj2.PushDepthStencil(None)
            size = 200
            vp2 = trinity.TriViewport()
            vp2.x = 10
            vp2.y = 10 + (size + 10) * (len(self.lights) - 1)
            vp2.width = size
            vp2.height = size
            rj2.PushViewport()
            rj2.PushProjection()
            rj2.PushViewTransform()
            rj2.SetViewport(vp2)
            rj2.SetStdRndStates(trinity.RM_FULLSCREEN)
            rj2.RenderTexture(renderTarget)
            rj2.PopViewTransform()
            rj2.PopProjection()
            rj2.PopViewport()
            rj2.PopDepthStencil()
            rj2.ScheduleRecurring()