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;
 |