64 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import ChainMap from './ChainMap.js';
 | |
| import RenderContext from './RenderContext.js';
 | |
| 
 | |
| class RenderContexts {
 | |
| 
 | |
| 	constructor() {
 | |
| 
 | |
| 		this.chainMaps = {};
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	get( scene, camera, renderTarget = null ) {
 | |
| 
 | |
| 		const chainKey = [ scene, camera ];
 | |
| 
 | |
| 		let attachmentState;
 | |
| 
 | |
| 		if ( renderTarget === null ) {
 | |
| 
 | |
| 			attachmentState = 'default';
 | |
| 
 | |
| 		} else {
 | |
| 
 | |
| 			const format = renderTarget.texture.format;
 | |
| 			const count = renderTarget.count;
 | |
| 
 | |
| 			attachmentState = `${ count }:${ format }:${ renderTarget.samples }:${ renderTarget.depthBuffer }:${ renderTarget.stencilBuffer }`;
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		const chainMap = this.getChainMap( attachmentState );
 | |
| 
 | |
| 		let renderState = chainMap.get( chainKey );
 | |
| 
 | |
| 		if ( renderState === undefined ) {
 | |
| 
 | |
| 			renderState = new RenderContext();
 | |
| 
 | |
| 			chainMap.set( chainKey, renderState );
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		if ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
 | |
| 
 | |
| 		return renderState;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	getChainMap( attachmentState ) {
 | |
| 
 | |
| 		return this.chainMaps[ attachmentState ] || ( this.chainMaps[ attachmentState ] = new ChainMap() );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	dispose() {
 | |
| 
 | |
| 		this.chainMaps = {};
 | |
| 
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| export default RenderContexts;
 |