UNPKG

phaser

Version:

A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.

205 lines (183 loc) 6.75 kB
/** * @author Benjamin D. Richards <benjamindrichards@gmail.com> * @copyright 2013-2026 Phaser Studio Inc. * @license {@link https://opensource.org/licenses/MIT|MIT License} */ var DeepCopy = require('../../utils/object/DeepCopy'); /** * Provides methods for configuring WebGL render nodes on a Game Object. Render nodes are modular units responsible for different phases of the rendering pipeline (submitting draw calls, transforming vertices, handling textures). Each Game Object has a set of default render nodes, but you can override them with custom nodes for advanced rendering effects. This component is WebGL only. * * @namespace Phaser.GameObjects.Components.RenderNodes * @webglOnly * @since 4.0.0 */ var RenderNodes = { /** * Customized WebGL render nodes of this Game Object. * RenderNodes are responsible for managing the rendering process of this Game Object. * A default set of RenderNodes is coded into the engine, * but the renderer will check this object first to see if a custom node has been set. * * @name Phaser.GameObjects.Components.RenderNodes#customRenderNodes * @type {object} * @webglOnly * @since 4.0.0 */ customRenderNodes: null, /** * The default RenderNodes for this Game Object. * RenderNodes are responsible for managing the rendering process of this Game Object. * These are the nodes that are used if no custom ones are set. * * RenderNodes are identified by a unique key for their role. * * Common role keys include: * * - 'Submitter': responsible for running other node roles for each element. * - 'Transformer': responsible for providing vertex coordinates for an element. * - 'Texturer': responsible for handling textures for an element. * * @name Phaser.GameObjects.Components.RenderNodes#defaultRenderNodes * @type {object} * @webglOnly * @since 4.0.0 */ defaultRenderNodes: null, /** * An object to store render node specific data in, to be read by the render nodes this Game Object uses. * * Render nodes store their data under their own name, not their role. * * @name Phaser.GameObjects.Components.RenderNodes#renderNodeData * @type {object} * @webglOnly * @since 4.0.0 */ renderNodeData: null, /** * Initializes the render nodes for this Game Object. * * This method is called when the Game Object is added to the Scene. * It is responsible for setting up the default render nodes * this Game Object will use. * * @method Phaser.GameObjects.Components.RenderNodes#initRenderNodes * @webglOnly * @since 4.0.0 * @param {Map<string, string>} defaultNodes - The default render nodes to set for this Game Object. */ initRenderNodes: function (defaultNodes) { this.customRenderNodes = {}; this.defaultRenderNodes = {}; this.renderNodeData = {}; var renderer = this.scene.sys.renderer; if (!renderer) { return; } var manager = renderer.renderNodes; if (!(manager && defaultNodes)) { return; } var defaultRenderNodes = this.defaultRenderNodes; defaultNodes.each(function (role, node) { defaultRenderNodes[role] = manager.getNode(node); }); }, /** * Sets the RenderNode for a given role. * * Also sets the relevant render node data object, if specified. * * If the node cannot be set, no changes are made. * * @method Phaser.GameObjects.Components.RenderNodes#setRenderNodeRole * @webglOnly * @since 4.0.0 * @param {string} key - The key of the role to set the render node for. * @param {string|Phaser.Renderer.WebGL.RenderNodes.RenderNode|null} renderNode - The render node to set on this Game Object. Either a string, or a RenderNode instance. If `null`, the render node is removed, along with its data. * @param {object} [renderNodeData] - An object to store render node specific data in, to be read by the render nodes this Game Object uses. * @param {boolean} [copyData=false] - Should the data be copied from the `renderNodeData` object? * @return {this} This Game Object instance. */ setRenderNodeRole: function (key, renderNode, renderNodeData, copyData) { var renderer = this.scene.sys.renderer; if (!renderer) { return this; } var manager = renderer.renderNodes; if (!manager) { return this; } if (renderNode !== null) { if (typeof renderNode === 'string') { renderNode = manager.getNode(renderNode); } if (!renderNode) { return this; } this.customRenderNodes[key] = renderNode; if (renderNodeData) { this.renderNodeData[renderNode.name] = copyData ? DeepCopy(renderNodeData) : renderNodeData; } else { this.renderNodeData[renderNode.name] = {}; } } else { var node = this.customRenderNodes[key]; if (node) { delete this.renderNodeData[node.name]; delete this.customRenderNodes[key]; } } return this; }, /** * Sets or removes a property in the data object for a specific render node within `renderNodeData`. * * If `key` is not set, it is created. If it is set, it is updated. * * If `value` is undefined and `key` exists, the key is removed. * * @method Phaser.GameObjects.Components.RenderNodes#setRenderNodeData * @webglOnly * @since 4.0.0 * @param {string|Phaser.Renderer.WebGL.RenderNodes.RenderNode} renderNode - The render node to set the data for. If a string, it should be the name of the render node. * @param {string} key - The key of the property to set. * @param {*} value - The value to set the property to. * @return {this} This Game Object instance. */ setRenderNodeData: function (renderNode, key, value) { var name = renderNode; if (typeof renderNode !== 'string') { name = renderNode.name; } var data = this.renderNodeData[name]; if (value === undefined) { delete data[key]; } else { data[key] = value; } return this; } }; module.exports = RenderNodes;