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