three
Version:
JavaScript 3D library
101 lines (68 loc) • 2.1 kB
JavaScript
import RenderContext from './RenderContext.js';
/**
* This module manages the render contexts of the renderer.
*
* @private
*/
class RenderContexts {
/**
* Constructs a new render context management component.
*
* @param {Renderer} renderer - The renderer.
*/
constructor( renderer ) {
/**
* The renderer.
*
* @type {Renderer}
*/
this.renderer = renderer;
/**
* A dictionary that manages render contexts.
*
* @type {Object<string,RenderContext>}
*/
this._renderContexts = {};
}
/**
* Returns a render context for the given scene, camera and render target.
*
* @param {?RenderTarget} [renderTarget=null] - The active render target.
* @param {?MRTNode} [mrt=null] - The MRT configuration
* @param {?number} [callDepth=0] - The call depth of the renderer.
* @return {RenderContext} The render context.
*/
get( renderTarget = null, mrt = null, callDepth = 0 ) {
//
let attachmentState;
if ( renderTarget === null ) {
attachmentState = 'default';
} else {
const format = renderTarget.texture.format;
const type = renderTarget.texture.type;
const count = renderTarget.textures.length;
attachmentState = `${ count }:${ format }:${ type }:${ renderTarget.samples }:${ renderTarget.depthBuffer }:${ renderTarget.stencilBuffer }`;
}
//
const mrtState = ( mrt !== null ) ? mrt.id : 'default';
//
const renderStateKey = attachmentState + '-' + mrtState + '-' + callDepth;
let renderState = this._renderContexts[ renderStateKey ];
if ( renderState === undefined ) {
renderState = new RenderContext();
renderState.mrt = mrt;
this._renderContexts[ renderStateKey ] = renderState;
}
if ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
renderState.clearDepthValue = this.renderer.getClearDepth();
renderState.clearStencilValue = this.renderer.getClearStencil();
return renderState;
}
/**
* Frees internal resources.
*/
dispose() {
this._renderContexts = {};
}
}
export default RenderContexts;