@openhps/core
Version:
Open Hybrid Positioning System - Core component
93 lines (87 loc) • 2.93 kB
JavaScript
;
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;