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