@openhps/core
Version:
Open Hybrid Positioning System - Core component
168 lines (155 loc) • 5.76 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _ChainMap = _interopRequireDefault(require("./ChainMap.js"));
var _RenderObject = _interopRequireDefault(require("./RenderObject.js"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const _chainKeys = [];
/**
* This module manages the render objects of the renderer.
*
* @private
*/
class RenderObjects {
/**
* Constructs a new render object management component.
*
* @param {Renderer} renderer - The renderer.
* @param {Nodes} nodes - Renderer component for managing nodes related logic.
* @param {Geometries} geometries - Renderer component for managing geometries.
* @param {Pipelines} pipelines - Renderer component for managing pipelines.
* @param {Bindings} bindings - Renderer component for managing bindings.
* @param {Info} info - Renderer component for managing metrics and monitoring data.
*/
constructor(renderer, nodes, geometries, pipelines, bindings, info) {
/**
* The renderer.
*
* @type {Renderer}
*/
this.renderer = renderer;
/**
* Renderer component for managing nodes related logic.
*
* @type {Nodes}
*/
this.nodes = nodes;
/**
* Renderer component for managing geometries.
*
* @type {Geometries}
*/
this.geometries = geometries;
/**
* Renderer component for managing pipelines.
*
* @type {Pipelines}
*/
this.pipelines = pipelines;
/**
* Renderer component for managing bindings.
*
* @type {Bindings}
*/
this.bindings = bindings;
/**
* Renderer component for managing metrics and monitoring data.
*
* @type {Info}
*/
this.info = info;
/**
* A dictionary that manages render contexts in chain maps
* for each pass ID.
*
* @type {Object<string,ChainMap>}
*/
this.chainMaps = {};
}
/**
* Returns a render object for the given object and state data.
*
* @param {Object3D} object - The 3D object.
* @param {Material} material - The 3D object's material.
* @param {Scene} scene - The scene the 3D object belongs to.
* @param {Camera} camera - The camera the 3D object should be rendered with.
* @param {LightsNode} lightsNode - The lights node.
* @param {RenderContext} renderContext - The render context.
* @param {ClippingContext} clippingContext - The clipping context.
* @param {string} [passId] - An optional ID for identifying the pass.
* @return {RenderObject} The render object.
*/
get(object, material, scene, camera, lightsNode, renderContext, clippingContext, passId) {
const chainMap = this.getChainMap(passId);
// reuse chainArray
_chainKeys[0] = object;
_chainKeys[1] = material;
_chainKeys[2] = renderContext;
_chainKeys[3] = lightsNode;
let renderObject = chainMap.get(_chainKeys);
if (renderObject === undefined) {
renderObject = this.createRenderObject(this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, renderContext, clippingContext, passId);
chainMap.set(_chainKeys, renderObject);
} else {
renderObject.updateClipping(clippingContext);
if (renderObject.needsGeometryUpdate) {
renderObject.setGeometry(object.geometry);
}
if (renderObject.version !== material.version || renderObject.needsUpdate) {
if (renderObject.initialCacheKey !== renderObject.getCacheKey()) {
renderObject.dispose();
renderObject = this.get(object, material, scene, camera, lightsNode, renderContext, clippingContext, passId);
} else {
renderObject.version = material.version;
}
}
}
_chainKeys.length = 0;
return renderObject;
}
/**
* Returns a chain map for the given pass ID.
*
* @param {string} [passId='default'] - The pass ID.
* @return {ChainMap} The chain map.
*/
getChainMap(passId = 'default') {
return this.chainMaps[passId] || (this.chainMaps[passId] = new _ChainMap.default());
}
/**
* Frees internal resources.
*/
dispose() {
this.chainMaps = {};
}
/**
* Factory method for creating render objects with the given list of parameters.
*
* @param {Nodes} nodes - Renderer component for managing nodes related logic.
* @param {Geometries} geometries - Renderer component for managing geometries.
* @param {Renderer} renderer - The renderer.
* @param {Object3D} object - The 3D object.
* @param {Material} material - The object's material.
* @param {Scene} scene - The scene the 3D object belongs to.
* @param {Camera} camera - The camera the object should be rendered with.
* @param {LightsNode} lightsNode - The lights node.
* @param {RenderContext} renderContext - The render context.
* @param {ClippingContext} clippingContext - The clipping context.
* @param {string} [passId] - An optional ID for identifying the pass.
* @return {RenderObject} The render object.
*/
createRenderObject(nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext, clippingContext, passId) {
const chainMap = this.getChainMap(passId);
const renderObject = new _RenderObject.default(nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext, clippingContext);
renderObject.onDispose = () => {
this.pipelines.delete(renderObject);
this.bindings.delete(renderObject);
this.nodes.delete(renderObject);
chainMap.delete(renderObject.getChainArray());
};
return renderObject;
}
}
var _default = exports.default = RenderObjects;