예제 #1
0
파일: photosvc.py 프로젝트: R4M80MrX/eve-1
 def TakeSnapShot_Render(self, scene, size, view, projection, transparentBackground = False, bgColor = None):
     self.LogInfo('TakeSnapShot_Render')
     if transparentBackground:
         bbFormat = trinity.PIXEL_FORMAT.B8G8R8A8_UNORM
         clearColor = bgColor or (0.0, 0.0, 0.0, 0.0)
     else:
         bbFormat = trinity.PIXEL_FORMAT.B8G8R8X8_UNORM
         clearColor = bgColor or (0.0, 0.0, 0.0, 1.0)
     dsFormat = trinity.DEPTH_STENCIL_FORMAT.AUTO
     renderTarget = trinity.Tr2RenderTarget(size, size, 1, bbFormat)
     depthStencil = trinity.Tr2DepthStencil(size, size, dsFormat)
     self.LogInfo('TakeSnapShot_Render_After_Resource_Creation')
     renderJob = trinity.CreateRenderJob('TakeSnapShot')
     renderJob.PushRenderTarget(renderTarget)
     renderJob.SetProjection(projection)
     renderJob.SetView(view)
     renderJob.PushDepthStencil(depthStencil)
     renderJob.Clear(clearColor, 1.0)
     renderJob.Update(scene)
     renderJob.RenderScene(scene)
     renderJob.PopDepthStencil()
     renderJob.PopRenderTarget()
     trinity.WaitForResourceLoads()
     renderJob.ScheduleOnce()
     renderJob.WaitForFinish()
     hostCopy = trinity.Tr2HostBitmap(renderTarget)
     hostCopy.name = 'TakeSnapeShot_Render'
     return hostCopy
예제 #2
0
def csaaScreenshot(useNVidiaAA, width, height, scene):
    try:
        csaaFmt = trinity.TRIMULTISAMPLE_8_SAMPLES if useNVidiaAA else trinity.TRIMULTISAMPLE_NONE
        csaaQty = 2 if useNVidiaAA else 0
        buffer = trinity.Tr2RenderTarget(width, height, 1,
                                         trinity.PIXEL_FORMAT.B8G8R8X8_UNORM,
                                         csaaFmt, csaaQty)
        depth = trinity.Tr2DepthStencil(width, height,
                                        trinity.DEPTH_STENCIL_FORMAT.D24S8,
                                        csaaFmt, csaaQty)
        job = trinity.CreateRenderJob('CSAA screenshot')
        job.SetRenderTarget(buffer)
        job.SetDepthStencil(depth)
        vp = trinity.TriViewport()
        vp.x = 0
        vp.y = 0
        vp.width = width
        vp.height = height
        job.SetViewport(vp)
        job.Clear((0, 0, 0, 0), 1.0)
        job.RenderScene(scene)
        trinity.SetPerspectiveProjection(trinity.GetFieldOfView(),
                                         trinity.GetFrontClip(),
                                         trinity.GetBackClip(), 1.0)
        job.ScheduleOnce()
        return (job, buffer)
    except Exception:
        return None
def csaaScreenshot(useNVidiaAA, width, height, scene):
    """
    Create a renderjob that will render the scene into a buffer using CSAA, if available.
    Returns ( job, buffer ) (which can be None if you ask for CSAA and it doesn't work).
    Use Tr2HostBitmap(buffer).Save or whatever to get to the data, after doing WaitForFinish if needed
    """
    try:
        csaaFmt = trinity.TRIMULTISAMPLE_8_SAMPLES if useNVidiaAA else trinity.TRIMULTISAMPLE_NONE
        csaaQty = 2 if useNVidiaAA else 0
        buffer = trinity.Tr2RenderTarget(width, height, 1,
                                         trinity.PIXEL_FORMAT.B8G8R8X8_UNORM,
                                         csaaFmt, csaaQty)
        depth = trinity.Tr2DepthStencil(width, height,
                                        trinity.DEPTH_STENCIL_FORMAT.D24S8,
                                        csaaFmt, csaaQty)
        job = trinity.CreateRenderJob('CSAA screenshot')
        job.SetRenderTarget(buffer)
        job.SetDepthStencil(depth)
        vp = trinity.TriViewport()
        vp.x = 0
        vp.y = 0
        vp.width = width
        vp.height = height
        job.SetViewport(vp)
        job.Clear((0, 0, 0, 0), 1.0)
        job.RenderScene(scene)
        trinity.SetPerspectiveProjection(trinity.GetFieldOfView(),
                                         trinity.GetFrontClip(),
                                         trinity.GetBackClip(), 1.0)
        job.ScheduleOnce()
        return (job, buffer)
    except Exception:
        return None
예제 #4
0
    def CreateRenderTargets(self, lightmapFormat):
        try:
            self.lightmap = self.CreateRenderTarget(self.lightmapSize[0], self.lightmapSize[1], lightmapFormat)
            self.stretchmap = self.CreateRenderTarget(min(1024, self.lightmapSize[0]), min(1024, self.lightmapSize[1]), lightmapFormat)
            self.scatteredLightmap = self.CreateRenderTarget(self.lightmapSize[0], self.lightmapSize[1], lightmapFormat)
            self.depth = trinity.Tr2DepthStencil(self.lightmapSize[0], self.lightmapSize[1], trinity.DEPTH_STENCIL_FORMAT.D24S8)
        except Exception:
            self.lightmap = None
            self.stretchmap = None
            self.scatteredLightmap = None
            return False

        return True
예제 #5
0
 def _CreateRenderTargets(self):
     if not self.prepared:
         return
     SceneRenderJobSpace._CreateRenderTargets(self)
     vp = self.GetViewport()
     self.rtWidth = vp.width
     self.rtHeight = vp.height
     if self.customBackBuffer is None:
         self.offscreenRenderTarget = trinity.Tr2RenderTarget(vp.width, vp.height, 1, self.bbFormat)
         self.finalTexture = self.offscreenRenderTarget
     else:
         self.finalTexture = trinity.Tr2RenderTarget(vp.width, vp.height, 1, self.customBackBuffer.format)
     if self.customDepthStencil is None:
         self.offscreenDepthStencil = trinity.Tr2DepthStencil(vp.width, vp.height, trinity.DEPTH_STENCIL_FORMAT.AUTO)
     self.finalTexture.name = 'finalTexture'
예제 #6
0
 def GetPortraitTexture(self, portraitID):
     size = 512
     sceneManager = sm.GetService('sceneManager')
     scene = sceneManager.GetActiveScene()
     backdropPath = self.backdropPath
     if backdropPath:
         backdropScene = trinity.Tr2Sprite2dScene()
         backdropScene.displayWidth = size
         backdropScene.displayHeight = size
         sprite = trinity.Tr2Sprite2d()
         sprite.texturePrimary = trinity.Tr2Sprite2dTexture()
         sprite.texturePrimary.resPath = backdropPath
         sprite.displayWidth = size
         sprite.displayHeight = size
         backdropScene.children.append(sprite)
     target = trinity.Tr2RenderTarget(size, size, 1,
                                      trinity.PIXEL_FORMAT.B8G8R8X8_UNORM)
     depth = trinity.Tr2DepthStencil(size, size,
                                     trinity.DEPTH_STENCIL_FORMAT.AUTO)
     renderJob = trinity.CreateRenderJob('TakeSnapShot')
     renderJob.PushRenderTarget(target)
     renderJob.PushDepthStencil(depth)
     projection = trinity.TriProjection()
     projection.PerspectiveFov(self.camera.fieldOfView, 1, 0.1, 5.0)
     view = self.camera.viewMatrix
     renderJob.Clear((0.0, 0.0, 0.0, 1.0), 1.0)
     renderJob.SetProjection(projection)
     renderJob.SetView(view)
     if backdropPath:
         renderJob.Update(backdropScene)
         renderJob.RenderScene(backdropScene)
     renderJob.RenderScene(scene)
     trinity.WaitForResourceLoads()
     renderJob.PopDepthStencil()
     renderJob.PopRenderTarget()
     renderJob.ScheduleOnce()
     renderJob.WaitForFinish()
     filename = self.GetPortraitSnapshotPath(portraitID)
     trinity.Tr2HostBitmap(target).Save(filename)
     path = 'cache:/Pictures/Portraits/PortraitSnapshot_%s_%s.jpg' % (
         portraitID, session.userid)
     blue.motherLode.Delete(path)
     tex = blue.resMan.GetResource(path, 'atlas')
     return tex
예제 #7
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
예제 #8
0
    def CreateRenderTargets(self, lightmapFormat):
        """
        See if the hardware supports self.lightmapSize with the given format.
        """
        try:
            self.lightmap = self.CreateRenderTarget(self.lightmapSize[0],
                                                    self.lightmapSize[1],
                                                    lightmapFormat)
            self.stretchmap = self.CreateRenderTarget(
                min(1024, self.lightmapSize[0]),
                min(1024, self.lightmapSize[1]), lightmapFormat)
            self.scatteredLightmap = self.CreateRenderTarget(
                self.lightmapSize[0], self.lightmapSize[1], lightmapFormat)
            self.depth = trinity.Tr2DepthStencil(
                self.lightmapSize[0], self.lightmapSize[1],
                trinity.DEPTH_STENCIL_FORMAT.D24S8)
        except Exception:
            self.lightmap = None
            self.stretchmap = None
            self.scatteredLightmap = None
            return False

        return True
예제 #9
0
 def _CreateDepthStencilAL(width, height, format, msaaType, msaaQuality):
     ds = trinity.Tr2DepthStencil()
     ds.Create(width, height, format, msaaType, msaaQuality)
     return ds
예제 #10
0
def CreateRenderJob(size,
                    view,
                    projection,
                    bgColor=None,
                    transparent=False,
                    postProcessingQuality=2,
                    antiAliasingQuality=3):
    """
    Creates a Jessica render job and adds functionality for 2D sprite background and overlays.
    """
    def _GetRenderStepPosition(renderJob, name):
        for i, each in enumerate(renderJob.steps):
            if each.name == name:
                return i

        return i

    if transparent:
        clearColor = bgColor or (0.0, 0.0, 0.0, 0.0)
        format = trinity.PIXEL_FORMAT.B8G8R8A8_UNORM
    else:
        clearColor = bgColor or (0.0, 0.0, 0.0, 1.0)
        format = trinity.PIXEL_FORMAT.B8G8R8X8_UNORM
    rt = trinity.Tr2RenderTarget(size, size, 1, format)
    rt.name = 'MyRT'
    ds = trinity.Tr2DepthStencil()
    ds.Create(size, size, trinity.DEPTH_STENCIL_FORMAT.D24S8, 0, 0)
    ds.name = 'MyDS'
    vp = trinity.TriViewport()
    vp.width = size
    vp.height = size
    renderJob = CreateJessicaSpaceRenderJob()
    renderJob.updateJob = None
    renderJob.CreateBasicRenderSteps()
    renderJob.OverrideSettings('hdrEnabled', True)
    settings = renderJob.GetSettings()
    settings['postProcessingQuality'] = postProcessingQuality
    settings['aaQuality'] = antiAliasingQuality
    renderJob.SetSettings(settings)
    renderJob.SetClearColor(clearColor)
    renderJob.OverrideSettings('bbFormat', format)
    renderJob.SetActiveCamera(view=view, projection=projection)
    renderJob.SetViewport(vp)
    renderJob.OverrideBuffers(rt, ds)
    renderJob.Enable(False)
    bgStep = trinity.TriStepRenderScene()
    bgStep.name = 'BACKGROUND_SPRITE'
    bgSprite1 = CreateSprite(1.0, size)
    bgSprite2 = CreateSprite(1.0, size)
    bgSpriteScene = trinity.Tr2Sprite2dScene()
    bgSpriteScene.children.append(bgSprite1)
    bgSpriteScene.children.append(bgSprite2)
    bgStep.scene = bgSpriteScene
    pos = _GetRenderStepPosition(renderJob, 'CLEAR')
    renderJob.steps.insert(pos + 1, bgStep)
    setattr(renderJob, 'iconTexture', bgSprite1.texturePrimary)
    setattr(renderJob, 'backgroundTexture', bgSprite2.texturePrimary)
    oStep = trinity.TriStepRenderScene()
    oStep.name = 'OVERLAY_SPRITES'
    oSprite1 = CreateSprite(1.0, size)
    oSprite1.blendMode = 2
    oSprite2 = CreateSprite(16.0 / size, size)
    oSpriteScene = trinity.Tr2Sprite2dScene()
    oSpriteScene.children.append(oSprite1)
    oSpriteScene.children.append(oSprite2)
    oStep.scene = oSpriteScene
    pos2 = _GetRenderStepPosition(renderJob, 'END_RENDERING')
    renderJob.steps.insert(pos2 + 1, oStep)
    setattr(renderJob, 'overlayTexture', oSprite1.texturePrimary)
    setattr(renderJob, 'techTexture', oSprite2.texturePrimary)
    setattr(renderJob, 'renderTarget', rt)
    return renderJob
    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()
예제 #12
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
예제 #13
0
    def SetupPickScene(self, doUpdate = True):
        self.pickScene = trinity.Tr2InteriorScene()
        cell = trinity.Tr2InteriorCell()
        cell.isUnbounded = True
        self.pickScene.cells.append(cell)
        if hasattr(self.pickScene, 'updateShadowCubeMap'):
            self.pickScene.updateShadowCubeMap = False
        self.pickAvatarCache = {}
        self.pickAvatar = self.avatar.CopyTo()
        self.pickAvatar.clothMeshes.removeAt(-1)
        foundUpperNude = False
        foundLowerNude = False
        foundHead = False
        torsoClickable = False
        for meshIx in range(len(self.avatar.visualModel.meshes)):
            mesh = self.avatar.visualModel.meshes[meshIx]
            self.pickAvatar.visualModel.meshes[meshIx].SetGeometryRes(mesh.geometry)
            if mesh.name.startswith('topinner'):
                foundUpperNude = True
                if len(mesh.opaqueAreas):
                    torsoClickable |= True
            if mesh.name.startswith('bottominner'):
                foundLowerNude = True
            if mesh.name.startswith('head'):
                foundHead = True

        deleteList = []
        for mesh in self.pickAvatar.visualModel.meshes:
            if mesh.name.startswith('feet') or mesh.name.startswith('hands'):
                deleteList.append(mesh)

        for d in deleteList:
            self.pickAvatar.visualModel.meshes.remove(d)

        self.pickExtraMods = []
        if not foundUpperNude or not torsoClickable:
            deleteList = []
            for mesh in self.pickAvatar.visualModel.meshes:
                if mesh.name.startswith('topinner'):
                    deleteList.append(mesh)

            for d in deleteList:
                self.pickAvatar.visualModel.meshes.remove(d)

            torsoMod = self.factory.CollectBuildData(self.doll.gender, 'topinner/torso_nude')
            self.pickExtraMods.append(torsoMod)
            item = blue.resMan.LoadObject(torsoMod.redfile)
            if item:
                index = 1
                for m in item.meshes:
                    m.name = 'topinner' + str(index)
                    self.pickAvatar.visualModel.meshes.append(m)
                    torsoMod.meshGeometryResPaths[m.name] = m.geometryResPath
                    self.pickAvatarPaths[m.name] = m.geometryResPath
                    index += 1

        index = 1
        for armPart in ['dependants/sleeveslower/standard', 'dependants/sleevesupper/standard']:
            armMod = self.factory.CollectBuildData(self.doll.gender, armPart)
            self.pickExtraMods.append(armMod)
            item = blue.resMan.LoadObject(armMod.redfile)
            if item:
                for m in item.meshes:
                    m.name = 'dependantsnude' + str(index)
                    self.pickAvatar.visualModel.meshes.append(m)
                    armMod.meshGeometryResPaths[m.name] = m.geometryResPath
                    self.pickAvatarPaths[m.name] = m.geometryResPath
                    index += 1

        if not foundLowerNude:
            legMod = self.factory.CollectBuildData(self.doll.gender, 'bottominner/legs_nude')
            self.pickExtraMods.append(legMod)
            item = blue.resMan.LoadObject(legMod.redfile)
            if item:
                index = 1
                for m in item.meshes:
                    m.name = 'bottominner' + str(index)
                    self.pickAvatar.visualModel.meshes.append(m)
                    legMod.meshGeometryResPaths[m.name] = m.geometryResPath
                    self.pickAvatarPaths[m.name] = m.geometryResPath
                    index += 1

        if not foundHead:
            headMod = self.factory.CollectBuildData(self.doll.gender, 'head/head_generic')
            self.pickExtraMods.append(headMod)
            item = blue.resMan.LoadObject(headMod.redfile)
            if item:
                index = 1
                for m in item.meshes:
                    m.name = 'head' + str(index)
                    self.pickAvatar.visualModel.meshes.append(m)
                    headMod.meshGeometryResPaths[m.name] = m.geometryResPath
                    self.pickAvatarPaths[m.name] = m.geometryResPath
                    index += 1

        handMod = self.factory.CollectBuildData(self.doll.gender, 'hands/hands_nude')
        self.pickExtraMods.append(handMod)
        item = blue.resMan.LoadObject(handMod.redfile)
        if item:
            index = 1
            for m in item.meshes:
                m.name = 'hands' + str(index)
                self.pickAvatar.visualModel.meshes.append(m)
                handMod.meshGeometryResPaths[m.name] = m.geometryResPath
                self.pickAvatarPaths[m.name] = m.geometryResPath
                index += 1

        feetMod = self.factory.CollectBuildData(self.doll.gender, 'feet/feet_nude')
        self.pickExtraMods.append(feetMod)
        item = blue.resMan.LoadObject(feetMod.redfile)
        if item:
            index = 1
            for m in item.meshes:
                m.name = 'feet' + str(index)
                self.pickAvatar.visualModel.meshes.append(m)
                feetMod.meshGeometryResPaths[m.name] = m.geometryResPath
                self.pickAvatarPaths[m.name] = m.geometryResPath
                index += 1

        for mesh in self.pickAvatar.visualModel.meshes:
            if len(mesh.decalAreas):
                for decalArea in mesh.decalAreas:
                    mesh.opaqueAreas.append(decalArea)

        self.pickAvatar.animationUpdater = self.avatar.animationUpdater
        self.pickAvatar.worldTransformUpdater = self.avatar.worldTransformUpdater

        def Filter(mesh):
            for f in ['head',
             'topinner',
             'bottominner',
             'hands',
             'feet',
             'dependantsnude']:
                if mesh.name.lower().startswith(f):
                    return True

            return False

        index = 0
        remList = []
        for mesh in self.pickAvatar.visualModel.meshes:
            if not Filter(mesh):
                remList.append(mesh)

        for m in remList:
            self.pickAvatar.visualModel.meshes.remove(m)

        self.pickScene.AddDynamic(self.pickAvatar)
        self.pickScene.RebuildSceneData()
        cameraProj, cameraView = self.GetProjectionAndViewMatrixFunc()
        rj = trinity.CreateRenderJob('ProdPickScene')
        RT = trinity.Tr2RenderTarget(32, 32, 1, trinity.PIXEL_FORMAT.B8G8R8A8_UNORM)
        depth = trinity.Tr2DepthStencil(32, 32, trinity.DEPTH_STENCIL_FORMAT.D24S8)
        rj.PushRenderTarget(RT)
        rj.PushDepthStencil(depth)
        rj.SetStdRndStates(trinity.RM_PICKING)
        rj.SetView(cameraView)
        rj.SetProjection(cameraProj)
        rj.Update(self.pickScene)
        rj.VisibilityQuery()
        rj.RenderScene(self.pickScene)
        rj.PopDepthStencil()
        rj.PopRenderTarget()
        rj.ScheduleOnce()
        trinity.renderJobs.UnscheduleByName('PickSceneUpdate')
        self.updateRenderjob = trinity.CreateRenderJob('PickSceneUpdate')
        self.updateRenderjob.SetView(cameraView)
        self.updateRenderjob.SetProjection(cameraProj)
        self.updateRenderjob.Update(self.pickScene)
        self.updateRenderjob.ScheduleRecurring()
        self.UpdateBlendShapes([], doUpdate=doUpdate)