@openhps/core
Version:
Open Hybrid Positioning System - Core component
68 lines • 1.97 kB
JavaScript
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 };