94 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import ChainMap from './ChainMap.js';
 | 
						|
import RenderObject from './RenderObject.js';
 | 
						|
 | 
						|
class RenderObjects {
 | 
						|
 | 
						|
	constructor( renderer, nodes, geometries, pipelines, bindings, info ) {
 | 
						|
 | 
						|
		this.renderer = renderer;
 | 
						|
		this.nodes = nodes;
 | 
						|
		this.geometries = geometries;
 | 
						|
		this.pipelines = pipelines;
 | 
						|
		this.bindings = bindings;
 | 
						|
		this.info = info;
 | 
						|
 | 
						|
		this.chainMaps = {};
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	get( object, material, scene, camera, lightsNode, renderContext, passId ) {
 | 
						|
 | 
						|
		const chainMap = this.getChainMap( passId );
 | 
						|
		const chainArray = [ object, material, renderContext, lightsNode ];
 | 
						|
 | 
						|
		let renderObject = chainMap.get( chainArray );
 | 
						|
 | 
						|
		if ( renderObject === undefined ) {
 | 
						|
 | 
						|
			renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, renderContext, passId );
 | 
						|
 | 
						|
			chainMap.set( chainArray, renderObject );
 | 
						|
 | 
						|
		} else {
 | 
						|
 | 
						|
			renderObject.updateClipping( renderContext.clippingContext );
 | 
						|
 | 
						|
			if ( renderObject.version !== material.version || renderObject.needsUpdate ) {
 | 
						|
 | 
						|
				if ( renderObject.initialCacheKey !== renderObject.getCacheKey() ) {
 | 
						|
 | 
						|
					renderObject.dispose();
 | 
						|
 | 
						|
					renderObject = this.get( object, material, scene, camera, lightsNode, renderContext, passId );
 | 
						|
 | 
						|
				} else {
 | 
						|
 | 
						|
					renderObject.version = material.version;
 | 
						|
 | 
						|
				}
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		return renderObject;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	getChainMap( passId = 'default' ) {
 | 
						|
 | 
						|
		return this.chainMaps[ passId ] || ( this.chainMaps[ passId ] = new ChainMap() );
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	dispose() {
 | 
						|
 | 
						|
		this.chainMaps = {};
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext, passId ) {
 | 
						|
 | 
						|
		const chainMap = this.getChainMap( passId );
 | 
						|
 | 
						|
		const renderObject = new RenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext );
 | 
						|
 | 
						|
		renderObject.onDispose = () => {
 | 
						|
 | 
						|
			this.pipelines.delete( renderObject );
 | 
						|
			this.bindings.delete( renderObject );
 | 
						|
			this.nodes.delete( renderObject );
 | 
						|
 | 
						|
			chainMap.delete( renderObject.getChainArray() );
 | 
						|
 | 
						|
		};
 | 
						|
 | 
						|
		return renderObject;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
export default RenderObjects;
 |