UNPKG

@babylonjs/viewer

Version:

The Babylon Viewer aims to simplify a specific but common Babylon.js use case: loading, viewing, and interacting with a 3D model.

3 lines (2 loc) 7.21 kB
import{bt as e,C as s,O as t,bu as a,aY as r,aA as i}from"./index-BPURObVq.esm.min.js";import"./renderTargetTexture-BannnLgS.esm.min.js";import"./tools-BGvNItez.esm.min.js";e();class n{static _GetDefaultOptions(){return{renderSize:1024,samples:4,lodGenerationScale:1,lodGenerationOffset:-4,renderTargetTextureType:s.TEXTURETYPE_HALF_FLOAT,generateMipmaps:!0}}constructor(e,s){this._opaqueRenderTarget=null,this._opaqueMeshesCache=[],this._transparentMeshesCache=[],this._materialObservers={},this._newMeshObserver=null,this._removedMeshObserver=null,this._disposed=!1,this._materialImpls=[],this._adapterCache=new WeakMap,this._translucentMaterialIndices=new Map,this._opaqueOnlySubMeshes=new Map,this._savedSubMeshes=new Map,this._options={...n._GetDefaultOptions(),...e},this._scene=s,this._scene._transmissionHelper=this,this.onErrorObservable=new t,this._scene.onDisposeObservable.addOnce(()=>{this.dispose()}),this._parseScene(),this._setupRenderTargets()}addMaterialImpl(e){this._materialImpls.some(s=>s.materialClass===e.materialClass)||this._materialImpls.push(e)}updateOptions(e){if(!Object.keys(e).filter(s=>this._options[s]!==e[s]).length)return;const s={...this._options,...e},t=this._options;this._options=s,s.renderSize===t.renderSize&&s.renderTargetTextureType===t.renderTargetTextureType&&s.generateMipmaps===t.generateMipmaps&&this._opaqueRenderTarget?(this._opaqueRenderTarget.samples=s.samples,this._opaqueRenderTarget.lodGenerationScale=s.lodGenerationScale,this._opaqueRenderTarget.lodGenerationOffset=s.lodGenerationOffset):this._setupRenderTargets()}getOpaqueTarget(){return this._opaqueRenderTarget}_getOrCreateAdapter(e){let s=this._adapterCache.get(e);if(!s)for(const t of this._materialImpls)if(e instanceof t.materialClass){s=new t.adapterClass(e),this._adapterCache.set(e,s);break}return s}_classifyMeshMaterials(e){const s=e.material;if(!s)return"opaque";if(!(s instanceof a)){const e=this._getOrCreateAdapter(s);return e&&e.isTranslucent()?(e.refractionBackgroundTexture=this._opaqueRenderTarget,"transparent"):"opaque"}let t=!1,r=!1;const i=new Set;for(let e=0;e<s.subMaterials.length;e++){const a=s.subMaterials[e];if(!a){r=!0;continue}const n=this._getOrCreateAdapter(a);n&&n.isTranslucent()?(n.refractionBackgroundTexture=this._opaqueRenderTarget,t=!0,i.add(e)):r=!0}return t&&r?(this._translucentMaterialIndices.set(e,i),this._rebuildOpaqueOnlySubMeshes(e,i),"mixed"):(this._translucentMaterialIndices.delete(e),this._opaqueOnlySubMeshes.delete(e),t?"transparent":"opaque")}_rebuildOpaqueOnlySubMeshes(e,s){e.subMeshes&&this._opaqueOnlySubMeshes.set(e,e.subMeshes.filter(e=>!s.has(e.materialIndex)))}_addMesh(e){this._materialObservers[e.uniqueId]=e.onMaterialChangedObservable.add(this._onMeshMaterialChanged.bind(this)),r.SetImmediate(()=>{if(!this._disposed&&e.material){"transparent"===this._classifyMeshMaterials(e)?-1===this._transparentMeshesCache.indexOf(e)&&this._transparentMeshesCache.push(e):-1===this._opaqueMeshesCache.indexOf(e)&&this._opaqueMeshesCache.push(e)}})}_removeMesh(e){e.onMaterialChangedObservable.remove(this._materialObservers[e.uniqueId]),delete this._materialObservers[e.uniqueId];let s=this._transparentMeshesCache.indexOf(e);-1!==s&&this._transparentMeshesCache.splice(s,1),s=this._opaqueMeshesCache.indexOf(e),-1!==s&&this._opaqueMeshesCache.splice(s,1),this._translucentMaterialIndices.delete(e),this._opaqueOnlySubMeshes.delete(e)}_parseScene(){this._scene.meshes.forEach(this._addMesh.bind(this)),this._newMeshObserver=this._scene.onNewMeshAddedObservable.add(this._addMesh.bind(this)),this._removedMeshObserver=this._scene.onMeshRemovedObservable.add(this._removeMesh.bind(this))}_onMeshMaterialChanged(e){const s=this._transparentMeshesCache.indexOf(e),t=this._opaqueMeshesCache.indexOf(e);"transparent"===this._classifyMeshMaterials(e)?-1!==t?(this._opaqueMeshesCache.splice(t,1),this._transparentMeshesCache.push(e)):-1===s&&this._transparentMeshesCache.push(e):-1!==s?(this._transparentMeshesCache.splice(s,1),this._opaqueMeshesCache.push(e)):-1===t&&this._opaqueMeshesCache.push(e)}_isRenderTargetValid(){return null!==this._opaqueRenderTarget?.getInternalTexture()}_setupRenderTargets(){let e;this._opaqueRenderTarget&&this._opaqueRenderTarget.dispose(),this._opaqueRenderTarget=new i("opaqueSceneTexture",this._options.renderSize,this._scene,this._options.generateMipmaps,void 0,this._options.renderTargetTextureType),this._opaqueRenderTarget.ignoreCameraViewport=!0,this._opaqueRenderTarget.renderList=this._opaqueMeshesCache,this._opaqueRenderTarget.forceLayerMaskCheck=!0,this._opaqueRenderTarget.clearColor=this._options.clearColor?.clone()??this._scene.clearColor.clone(),this._opaqueRenderTarget.clearColor.a=0,this._opaqueRenderTarget.gammaSpace=!1,this._opaqueRenderTarget.lodGenerationScale=this._options.lodGenerationScale,this._opaqueRenderTarget.lodGenerationOffset=this._options.lodGenerationOffset,this._opaqueRenderTarget.samples=this._options.samples,this._opaqueRenderTarget.renderSprites=!0,this._opaqueRenderTarget.renderParticles=!0,this._opaqueRenderTarget.disableImageProcessing=!0,this._opaqueRenderTarget.onBeforeBindObservable.add(s=>{e=this._scene.environmentIntensity,this._scene.environmentIntensity=1,this._options.clearColor?s.clearColor.copyFrom(this._options.clearColor):this._scene.clearColor.toLinearSpaceToRef(s.clearColor,this._scene.getEngine().useExactSrgbConversions),s.clearColor.a=0;const t=this._opaqueOnlySubMeshes.entries();for(let e=t.next();!e.done;e=t.next()){const s=e.value[0],t=e.value[1];s.subMeshes&&(this._savedSubMeshes.set(s,s.subMeshes),s.subMeshes=t)}}),this._opaqueRenderTarget.onAfterUnbindObservable.add(()=>{this._scene.environmentIntensity=e;const s=this._savedSubMeshes.entries();for(let e=s.next();!e.done;e=s.next())e.value[0].subMeshes=e.value[1];this._savedSubMeshes.clear()});for(const e of this._transparentMeshesCache)e.material&&this._classifyMeshMaterials(e);const s=this._translucentMaterialIndices.entries();for(let e=s.next();!e.done;e=s.next()){const s=e.value[0];s.material&&this._classifyMeshMaterials(s)}}dispose(){this._disposed=!0,this._newMeshObserver?.remove(),this._removedMeshObserver?.remove(),this._newMeshObserver=null,this._removedMeshObserver=null;const e=[...this._transparentMeshesCache,...this._opaqueMeshesCache];for(const s of e){const e=this._materialObservers[s.uniqueId];e&&(e.remove(),delete this._materialObservers[s.uniqueId])}for(const e of this._scene.meshes){const s=this._materialObservers[e.uniqueId];s&&(s.remove(),delete this._materialObservers[e.uniqueId])}this._materialObservers={},this._scene._transmissionHelper=void 0,this._opaqueRenderTarget&&(this._opaqueRenderTarget.dispose(),this._opaqueRenderTarget=null),this._transparentMeshesCache=[],this._opaqueMeshesCache=[],this._translucentMaterialIndices.clear(),this._opaqueOnlySubMeshes.clear(),this._savedSubMeshes.clear()}}function h(e,s){if(e.parent.dontUseTransmissionHelper)return;const t=s.getScene()._transmissionHelper,a=t??new n({},s.getScene());for(const s of Array.from(e._pbrMaterialImpls.values()))a.addMaterialImpl(s);t&&!t._isRenderTargetValid()&&t._setupRenderTargets()}export{h as e}; //# sourceMappingURL=transmissionHelper-DREwgz9m.esm.min.js.map