UNPKG

three

Version:

JavaScript 3D library

119 lines (64 loc) 1.78 kB
let _id = 0; class WebGLShaderCache { constructor() { this.shaderCache = new Map(); this.materialCache = new Map(); } update( material, vertexShaderStage, fragmentShaderStage ) { const materialShaders = this._getShaderCacheForMaterial( material ); if ( materialShaders.has( vertexShaderStage ) === false ) { materialShaders.add( vertexShaderStage ); vertexShaderStage.usedTimes ++; } if ( materialShaders.has( fragmentShaderStage ) === false ) { materialShaders.add( fragmentShaderStage ); fragmentShaderStage.usedTimes ++; } return this; } remove( material ) { const materialShaders = this.materialCache.get( material ); for ( const shaderStage of materialShaders ) { shaderStage.usedTimes --; if ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code ); } this.materialCache.delete( material ); return this; } getVertexShaderStage( material ) { return this._getShaderStage( material.vertexShader ); } getFragmentShaderStage( material ) { return this._getShaderStage( material.fragmentShader ); } dispose() { this.shaderCache.clear(); this.materialCache.clear(); } _getShaderCacheForMaterial( material ) { const cache = this.materialCache; let set = cache.get( material ); if ( set === undefined ) { set = new Set(); cache.set( material, set ); } return set; } _getShaderStage( code ) { const cache = this.shaderCache; let stage = cache.get( code ); if ( stage === undefined ) { stage = new WebGLShaderStage( code ); cache.set( code, stage ); } return stage; } } class WebGLShaderStage { constructor( code ) { this.id = _id ++; this.code = code; this.usedTimes = 0; } } export { WebGLShaderCache };