UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

93 lines (87 loc) 2.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ChainMap = _interopRequireDefault(require("./ChainMap.js")); var _RenderContext = _interopRequireDefault(require("./RenderContext.js")); var _Scene = require("../../scenes/Scene.js"); var _Camera = require("../../cameras/Camera.js"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const _chainKeys = []; const _defaultScene = /*@__PURE__*/new _Scene.Scene(); const _defaultCamera = /*@__PURE__*/new _Camera.Camera(); /** * This module manages the render contexts of the renderer. * * @private */ 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.default(); 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.default()); } /** * Frees internal resources. */ dispose() { this.chainMaps = {}; } } var _default = exports.default = RenderContexts;