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
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
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
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'
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
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 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
def _CreateDepthStencilAL(width, height, format, msaaType, msaaQuality): ds = trinity.Tr2DepthStencil() ds.Create(width, height, format, msaaType, msaaQuality) return ds
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()
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
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)