three
Version:
JavaScript 3D library
93 lines (51 loc) • 1.75 kB
JavaScript
import DataMap from './DataMap.js';
import ChainMap from './ChainMap.js';
import RenderObject from './RenderObject.js';
class RenderObjects extends ChainMap {
constructor( renderer, nodes, geometries, pipelines, info ) {
super();
this.renderer = renderer;
this.nodes = nodes;
this.geometries = geometries;
this.pipelines = pipelines;
this.info = info;
this.dataMap = new DataMap();
}
get( object, material, scene, camera, lightsNode ) {
const chainArray = [ object, material, scene, camera, lightsNode ];
let renderObject = super.get( chainArray );
if ( renderObject === undefined ) {
renderObject = new RenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode );
this._initRenderObject( renderObject );
this.set( chainArray, renderObject );
} else {
const data = this.dataMap.get( renderObject );
const cacheKey = renderObject.getCacheKey();
if ( data.cacheKey !== cacheKey ) {
data.cacheKey = cacheKey;
this.pipelines.delete( renderObject );
this.nodes.delete( renderObject );
}
}
return renderObject;
}
dispose() {
super.dispose();
this.dataMap.clear();
}
_initRenderObject( renderObject ) {
const data = this.dataMap.get( renderObject );
if ( data.initialized !== true ) {
data.initialized = true;
data.cacheKey = renderObject.getCacheKey();
const onDispose = () => {
renderObject.material.removeEventListener( 'dispose', onDispose );
this.pipelines.delete( renderObject );
this.nodes.delete( renderObject );
this.delete( renderObject.getChainArray() );
};
renderObject.material.addEventListener( 'dispose', onDispose );
}
}
}
export default RenderObjects;