UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

68 lines 1.97 kB
let _id = 0; class WebGLShaderCache { constructor() { this.shaderCache = new Map(); this.materialCache = new Map(); } update(material) { const vertexShader = material.vertexShader; const fragmentShader = material.fragmentShader; const vertexShaderStage = this._getShaderStage(vertexShader); const fragmentShaderStage = this._getShaderStage(fragmentShader); 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; } getVertexShaderID(material) { return this._getShaderStage(material.vertexShader).id; } getFragmentShaderID(material) { return this._getShaderStage(material.fragmentShader).id; } 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 };