📄 RenderContexts.js
¶
📊 Analysis Summary¶
Metric | Count |
---|---|
🔧 Functions | 4 |
🧱 Classes | 1 |
📦 Imports | 4 |
📊 Variables & Constants | 6 |
📚 Table of Contents¶
🛠️ File Location:¶
📂 src/renderers/common/RenderContexts.js
📦 Imports¶
Name | Source |
---|---|
ChainMap |
./ChainMap.js |
RenderContext |
./RenderContext.js |
Scene |
../../scenes/Scene.js |
Camera |
../../cameras/Camera.js |
Variables & Constants¶
Name | Type | Kind | Value | Exported |
---|---|---|---|---|
_chainKeys |
any[] |
let/var | [] |
✗ |
_defaultScene |
Scene |
let/var | new Scene() |
✗ |
_defaultCamera |
Camera |
let/var | new Camera() |
✗ |
attachmentState |
any |
let/var | *not shown* |
✗ |
format |
any |
let/var | renderTarget.texture.format |
✗ |
count |
any |
let/var | renderTarget.textures.length |
✗ |
Functions¶
RenderContexts.get(scene: Scene, camera: Camera, renderTarget: RenderTarget): RenderContext
¶
JSDoc:
/**
* Returns a render context for the given scene, camera and render target.
*
* @param {Scene} scene - The scene.
* @param {Camera} camera - The camera that is used to render the scene.
* @param {?RenderTarget} [renderTarget=null] - The active render target.
* @return {RenderContext} The render context.
*/
Parameters:
scene
Scene
camera
Camera
renderTarget
RenderTarget
Returns: RenderContext
Calls:
this._getChainMap
chainMap.get
chainMap.set
Code
get( scene, camera, renderTarget = null ) {
_chainKeys[ 0 ] = scene;
_chainKeys[ 1 ] = camera;
let attachmentState;
if ( renderTarget === null ) {
attachmentState = 'default';
} else {
const format = renderTarget.texture.format;
const count = renderTarget.textures.length;
attachmentState = `${ count }:${ format }:${ renderTarget.samples }:${ renderTarget.depthBuffer }:${ renderTarget.stencilBuffer }`;
}
const chainMap = this._getChainMap( attachmentState );
let renderState = chainMap.get( _chainKeys );
if ( renderState === undefined ) {
renderState = new RenderContext();
chainMap.set( _chainKeys, renderState );
}
_chainKeys.length = 0;
if ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
return renderState;
}
RenderContexts.getForClear(renderTarget: RenderTarget): RenderContext
¶
JSDoc:
/**
* Returns a render context intended for clear operations.
*
* @param {?RenderTarget} [renderTarget=null] - The active render target.
* @return {RenderContext} The render context.
*/
Parameters:
renderTarget
RenderTarget
Returns: RenderContext
Calls:
this.get
Code
RenderContexts._getChainMap(attachmentState: string): ChainMap
¶
JSDoc:
/**
* Returns a chain map for the given attachment state.
*
* @private
* @param {string} attachmentState - The attachment state.
* @return {ChainMap} The chain map.
*/
Parameters:
attachmentState
string
Returns: ChainMap
Code
RenderContexts.dispose(): void
¶
JSDoc:
Returns: void
Classes¶
RenderContexts
¶
Class Code
class RenderContexts {
/**
* Constructs a new render context management component.
*/
constructor() {
/**
* A dictionary that manages render contexts in chain maps
* for each attachment state.
*
* @type {Object<string,ChainMap>}
*/
this.chainMaps = {};
}
/**
* Returns a render context for the given scene, camera and render target.
*
* @param {Scene} scene - The scene.
* @param {Camera} camera - The camera that is used to render the scene.
* @param {?RenderTarget} [renderTarget=null] - The active render target.
* @return {RenderContext} The render context.
*/
get( scene, camera, renderTarget = null ) {
_chainKeys[ 0 ] = scene;
_chainKeys[ 1 ] = camera;
let attachmentState;
if ( renderTarget === null ) {
attachmentState = 'default';
} else {
const format = renderTarget.texture.format;
const count = renderTarget.textures.length;
attachmentState = `${ count }:${ format }:${ renderTarget.samples }:${ renderTarget.depthBuffer }:${ renderTarget.stencilBuffer }`;
}
const chainMap = this._getChainMap( attachmentState );
let renderState = chainMap.get( _chainKeys );
if ( renderState === undefined ) {
renderState = new RenderContext();
chainMap.set( _chainKeys, renderState );
}
_chainKeys.length = 0;
if ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
return renderState;
}
/**
* Returns a render context intended for clear operations.
*
* @param {?RenderTarget} [renderTarget=null] - The active render target.
* @return {RenderContext} The render context.
*/
getForClear( renderTarget = null ) {
return this.get( _defaultScene, _defaultCamera, renderTarget );
}
/**
* Returns a chain map for the given attachment state.
*
* @private
* @param {string} attachmentState - The attachment state.
* @return {ChainMap} The chain map.
*/
_getChainMap( attachmentState ) {
return this.chainMaps[ attachmentState ] || ( this.chainMaps[ attachmentState ] = new ChainMap() );
}
/**
* Frees internal resources.
*/
dispose() {
this.chainMaps = {};
}
}
Methods¶
get(scene: Scene, camera: Camera, renderTarget: RenderTarget): RenderContext
¶
Code
get( scene, camera, renderTarget = null ) {
_chainKeys[ 0 ] = scene;
_chainKeys[ 1 ] = camera;
let attachmentState;
if ( renderTarget === null ) {
attachmentState = 'default';
} else {
const format = renderTarget.texture.format;
const count = renderTarget.textures.length;
attachmentState = `${ count }:${ format }:${ renderTarget.samples }:${ renderTarget.depthBuffer }:${ renderTarget.stencilBuffer }`;
}
const chainMap = this._getChainMap( attachmentState );
let renderState = chainMap.get( _chainKeys );
if ( renderState === undefined ) {
renderState = new RenderContext();
chainMap.set( _chainKeys, renderState );
}
_chainKeys.length = 0;
if ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
return renderState;
}