UNPKG

pixi.js

Version:

<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">

1 lines 31.6 kB
{"version":3,"file":"RenderLayer.mjs","sources":["../../../src/scene/layers/RenderLayer.ts"],"sourcesContent":["import { type InstructionSet } from '../../rendering/renderers/shared/instructions/InstructionSet';\nimport { type Renderer } from '../../rendering/renderers/types';\nimport { warn } from '../../utils/logging/warn';\nimport { type Bounds } from '../container/bounds/Bounds';\nimport { Container } from '../container/Container';\n\n// NOTE: Filters on ancestor containers do not apply to children attached to a RenderLayer.\n// See \"Known issues\" in the RenderLayer JSDoc below.\n\n/**\n * Options for configuring a RenderLayer. A RenderLayer allows control over rendering order\n * independent of the scene graph hierarchy.\n * @example\n * ```ts\n * // Basic layer with automatic sorting\n * const layer = new RenderLayer({\n * sortableChildren: true\n * });\n *\n * // Layer with custom sort function\n * const customLayer = new RenderLayer({\n * sortableChildren: true,\n * sortFunction: (a, b) => {\n * // Sort by y position\n * return a.position.y - b.position.y;\n * }\n * });\n *\n * // Add objects to layer while maintaining scene graph parent\n * const sprite = new Sprite(texture);\n * container.addChild(sprite); // Add to scene graph\n * layer.attach(sprite); // Add to render layer\n *\n * // Manual sorting when needed\n * const manualLayer = new RenderLayer({\n * sortableChildren: false\n * });\n * manualLayer.attach(sprite1, sprite2);\n * manualLayer.sortRenderLayerChildren(); // Sort manually\n * ```\n * @category scene\n * @standard\n */\nexport interface RenderLayerOptions\n{\n /**\n * If true, the layer's children will be sorted by zIndex before rendering.\n * If false, you can manually sort the children using sortRenderLayerChildren when needed.\n * @default false\n * @example\n * ```ts\n * const layer = new RenderLayer({\n * sortableChildren: true // Automatically sorts children by zIndex\n * });\n * ```\n * @see {@link RenderLayer#sortRenderLayerChildren} For manual sorting\n * @see {@link RenderLayer#sortFunction} For customizing the sort logic\n * @see {@link Container#zIndex} For the default sort property\n */\n sortableChildren?: boolean;\n\n /**\n * Custom sort function to sort layer children. Default sorts by zIndex.\n * @param a - First container to compare\n * @param b - Second container to compare\n * @returns Negative if a should render before b, positive if b should render before a\n * @example\n * ```ts\n * const layer = new RenderLayer({\n * sortFunction: (a, b) => {\n * // Sort by y position\n * return a.position.y - b.position.y;\n * }\n * });\n * ```\n * @see {@link RenderLayer#sortableChildren} For enabling automatic sorting\n * @see {@link RenderLayer#sortRenderLayerChildren} For manual sorting\n * @see {@link Container#zIndex} For the default sort property\n * @default (a, b) => a.zIndex - b.zIndex\n */\n sortFunction?: (a: Container, b: Container) => number;\n}\n\n/**\n * The RenderLayer API provides a way to control the rendering order of objects independently\n * of their logical parent-child relationships in the scene graph.\n * This allows developers to decouple how objects are transformed\n * (via their logical parent) from how they are rendered on the screen.\n *\n * ### Key Concepts\n *\n * #### RenderLayers Control Rendering Order:\n * - RenderLayers define where in the render stack objects are drawn,\n * but they do not affect an object's transformations (e.g., position, scale, rotation) or logical hierarchy.\n * - RenderLayers can be added anywhere in the scene graph.\n *\n * #### Logical Parenting Remains Unchanged:\n * - Objects still have a logical parent for transformations via addChild.\n * - Assigning an object to a layer does not reparent it.\n *\n * #### Explicit Control:\n * - Developers assign objects to layers using renderLayer.add and remove them using renderLayer.remove.\n * ---\n * ### API Details\n *\n * #### 1. Creating a RenderLayer\n * A RenderLayer is a lightweight object responsible for controlling render order.\n * It has no children or transformations of its own\n * but can be inserted anywhere in the scene graph to define its render position.\n * ```js\n * const layer = new RenderLayer();\n * app.stage.addChild(layer); // Insert the layer into the scene graph\n * ```\n *\n * #### 2. Adding Objects to a Layer\n * Use renderLayer.add to assign an object to a layer.\n * This overrides the object's default render order defined by its logical parent.\n * ```js\n * const rect = new Graphics();\n * container.addChild(rect); // Add to logical parent\n * layer.attach(rect); // Control render order via the layer\n * ```\n *\n * #### 3. Removing Objects from a Layer\n * To stop an object from being rendered in the layer, use remove.\n * ```js\n * layer.remove(rect); // Stop rendering rect via the layer\n * ```\n * When an object is removed from its logical parent (removeChild), it is automatically removed from the layer.\n *\n * #### 4. Re-Adding Objects to Layers\n * If an object is re-added to a logical parent, it does not automatically reassign itself to the layer.\n * Developers must explicitly reassign it.\n * ```js\n * container.addChild(rect); // Logical parent\n * layer.attach(rect); // Explicitly reassign to the layer\n * ```\n *\n * #### 5. Layer Position in Scene Graph\n * A layer's position in the scene graph determines its render priority relative to other layers and objects.\n * Layers can be inserted anywhere in the scene graph.\n * ```js\n * const backgroundLayer = new RenderLayer();\n * const uiLayer = new RenderLayer();\n *\n * app.stage.addChild(backgroundLayer);\n * app.stage.addChild(world);\n * app.stage.addChild(uiLayer);\n * ```\n * This is a new API and therefore considered experimental at this stage.\n * While the core is pretty robust, there are still a few tricky issues we need to tackle.\n * However, even with the known issues below, we believe this API is incredibly useful!\n *\n * Known issues:\n * - Interaction may not work as expected since hit testing does not account for the visual render order created by layers.\n * For example, if an object is visually moved to the front via a layer, hit testing will still use its original position.\n * - RenderLayers and their children must all belong to the same renderGroup to work correctly.\n * - Filters on ancestor containers do not apply to children attached to a RenderLayer.\n * This is because render layer children are rendered outside their parent's filter scope\n * (filters capture children into a texture via push/pop, but render layer children skip\n * their parent's collection and render at the layer's position instead).\n * @category scene\n * @class\n * @extends null\n * @standard\n */\nexport class RenderLayer extends Container\n{\n /**\n * Default options for RenderLayer instances. These options control the sorting behavior\n * of objects within the render layer.\n * @example\n * ```ts\n * // Create a custom render layer with modified default options\n * RenderLayer.defaultOptions = {\n * sortableChildren: true,\n * sortFunction: (a, b) => a.y - b.y // Sort by vertical position\n * };\n *\n * // All new render layers will use these defaults\n * const layer1 = new RenderLayer();\n * // layer1 will have sortableChildren = true\n * ```\n * @property {boolean} sortableChildren -\n * @property {Function} sortFunction -\n * @see {@link RenderLayer} For the main render layer class\n * @see {@link Container#zIndex} For the default sort property\n * @see {@link RenderLayer#sortRenderLayerChildren} For manual sorting\n */\n public static defaultOptions: RenderLayerOptions = {\n /** If true, layer children will be automatically sorted each render. Default is false. */\n sortableChildren: false,\n /**\n * Function used to sort layer children.\n * Default sorts by zIndex. Accepts two Container objects and returns\n * a number indicating their relative order.\n * @param a - First container to compare\n * @param b - Second container to compare\n * @returns Negative if a should render before b, positive if b should render before a\n */\n sortFunction: (a, b) => a.zIndex - b.zIndex,\n };\n\n /** Function used to sort layer children if sortableChildren is true */\n public sortFunction: (a: Container, b: Container) => number;\n\n /**\n * The list of objects that this layer is responsible for rendering. Objects in this list maintain\n * their original parent in the scene graph but are rendered as part of this layer.\n * @example\n * ```ts\n * const layer = new RenderLayer();\n * const sprite = new Sprite(texture);\n *\n * // Add sprite to scene graph for transforms\n * container.addChild(sprite);\n *\n * // Add to layer for render order control\n * layer.attach(sprite);\n * console.log(layer.renderLayerChildren.length); // 1\n *\n * // Access objects in the layer\n * layer.renderLayerChildren.forEach(child => {\n * console.log('Layer child:', child);\n * });\n *\n * // Check if object is in layer\n * const isInLayer = layer.renderLayerChildren.includes(sprite);\n *\n * // Clear all objects from layer\n * layer.detachAll();\n * console.log(layer.renderLayerChildren.length); // 0\n * ```\n * @readonly\n * @see {@link RenderLayer#attach} For adding objects to the layer\n * @see {@link RenderLayer#detach} For removing objects from the layer\n * @see {@link RenderLayer#detachAll} For removing all objects from the layer\n */\n public renderLayerChildren: Container[] = [];\n\n /** @internal */\n public parent: Container | null;\n /** @internal */\n public didChange: boolean;\n /** @internal */\n public _updateFlags: number;\n /** @internal */\n public parentRenderLayer: null;\n /** @internal */\n public destroyed: boolean;\n /** @internal */\n public layerParentId: string;\n /**\n * If true, the layer's children will be sorted by zIndex before rendering.\n * If false, you can manually sort the children using sortRenderLayerChildren when needed.\n * @default false\n * @example\n * ```ts\n * const layer = new RenderLayer({\n * sortableChildren: true // Automatically sorts children by zIndex\n * });\n * ```\n * @see {@link RenderLayer#sortRenderLayerChildren} For manual sorting\n * @see {@link RenderLayer#sortFunction} For customizing the sort logic\n * @see {@link Container#zIndex} For the default sort property\n */\n public sortableChildren;\n\n /**\n * Creates a new RenderLayer instance\n * @param options - Configuration options for the RenderLayer\n * @param {boolean} [options.sortableChildren=false] - If true, layer children will be automatically sorted each render\n * @param {Function} [options.sortFunction] - Custom function to sort layer children. Default sorts by zIndex\n */\n constructor(options: RenderLayerOptions = {})\n {\n options = { ...RenderLayer.defaultOptions, ...options };\n\n super();\n\n this.sortableChildren = options.sortableChildren;\n this.sortFunction = options.sortFunction;\n }\n\n /**\n * Adds one or more Containers to this render layer. The Containers will be rendered as part of this layer\n * while maintaining their original parent in the scene graph.\n *\n * If the Container already belongs to a layer, it will be removed from the old layer before being added to this one.\n * @example\n * ```ts\n * const layer = new RenderLayer();\n * const container = new Container();\n * const sprite1 = new Sprite(texture1);\n * const sprite2 = new Sprite(texture2);\n *\n * // Add sprites to scene graph for transforms\n * container.addChild(sprite1, sprite2);\n *\n * // Add sprites to layer for render order control\n * layer.attach(sprite1, sprite2);\n *\n * // Add single sprite with type checking\n * const typedSprite = layer.attach<Sprite>(new Sprite(texture3));\n * typedSprite.tint = 'red';\n *\n * // Automatically removes from previous layer if needed\n * const otherLayer = new RenderLayer();\n * otherLayer.attach(sprite1); // Removes from previous layer\n * ```\n * @param children - The Container(s) to add to this layer. Can be any Container or array of Containers.\n * @returns The first child that was added, for method chaining\n * @see {@link RenderLayer#detach} For removing objects from the layer\n * @see {@link RenderLayer#detachAll} For removing all objects from the layer\n * @see {@link Container#addChild} For adding to scene graph hierarchy\n */\n public attach<U extends Container[]>(...children: U): U[0]\n {\n for (let i = 0; i < children.length; i++)\n {\n const child = children[i];\n\n if (child.parentRenderLayer)\n {\n if (child.parentRenderLayer === this) continue;\n\n child.parentRenderLayer.detach(child);\n }\n\n this.renderLayerChildren.push(child);\n\n child.parentRenderLayer = this;\n\n const renderGroup = this.renderGroup || this.parentRenderGroup;\n\n if (renderGroup)\n {\n renderGroup.structureDidChange = true;\n }\n }\n\n return children[0];\n }\n\n /**\n * Removes one or more Containers from this render layer. The Containers will maintain their\n * original parent in the scene graph but will no longer be rendered as part of this layer.\n * @example\n * ```ts\n * const layer = new RenderLayer();\n * const container = new Container();\n * const sprite1 = new Sprite(texture1);\n * const sprite2 = new Sprite(texture2);\n *\n * // Add sprites to scene graph and layer\n * container.addChild(sprite1, sprite2);\n * layer.attach(sprite1, sprite2);\n *\n * // Remove single sprite from layer\n * layer.detach(sprite1);\n * // sprite1 is still child of container but not rendered in layer\n *\n * // Remove multiple sprites at once\n * const otherLayer = new RenderLayer();\n * otherLayer.attach(sprite3, sprite4);\n * otherLayer.detach(sprite3, sprite4);\n *\n * // Type-safe detachment\n * const typedSprite = layer.detach<Sprite>(spriteInLayer);\n * typedSprite.texture = newTexture; // TypeScript knows this is a Sprite\n * ```\n * @param children - The Container(s) to remove from this layer\n * @returns The first child that was removed, for method chaining\n * @see {@link RenderLayer#attach} For adding objects to the layer\n * @see {@link RenderLayer#detachAll} For removing all objects from the layer\n * @see {@link Container#removeChild} For removing from scene graph hierarchy\n */\n public detach<U extends Container[]>(...children: U): U[0]\n {\n for (let i = 0; i < children.length; i++)\n {\n const child = children[i];\n\n const index = this.renderLayerChildren.indexOf(child);\n\n if (index !== -1)\n {\n this.renderLayerChildren.splice(index, 1);\n }\n\n child.parentRenderLayer = null;\n\n const renderGroup = this.renderGroup || this.parentRenderGroup;\n\n if (renderGroup)\n {\n renderGroup.structureDidChange = true;\n }\n }\n\n return children[0];\n }\n\n /**\n * Removes all objects from this render layer. Objects will maintain their\n * original parent in the scene graph but will no longer be rendered as part of this layer.\n * @example\n * ```ts\n * const layer = new RenderLayer();\n * const container = new Container();\n *\n * // Add multiple sprites to scene graph and layer\n * const sprites = [\n * new Sprite(texture1),\n * new Sprite(texture2),\n * new Sprite(texture3)\n * ];\n *\n * container.addChild(...sprites); // Add to scene graph\n * layer.attach(...sprites); // Add to render layer\n *\n * // Later, remove all sprites from layer at once\n * layer.detachAll();\n * console.log(layer.renderLayerChildren.length); // 0\n * console.log(container.children.length); // 3 (still in scene graph)\n * ```\n * @returns The RenderLayer instance for method chaining\n * @see {@link RenderLayer#attach} For adding objects to the layer\n * @see {@link RenderLayer#detach} For removing individual objects\n * @see {@link Container#removeChildren} For removing from scene graph\n */\n public detachAll()\n {\n const layerChildren = this.renderLayerChildren;\n\n for (let i = 0; i < layerChildren.length; i++)\n {\n layerChildren[i].parentRenderLayer = null;\n }\n\n this.renderLayerChildren.length = 0;\n }\n\n /**\n * Collects renderables for this layer and its children.\n * This method is called by the renderer to gather all objects that should be rendered in this layer.\n * @param instructionSet - The set of instructions to collect renderables into.\n * @param renderer - The renderer that is collecting renderables.\n * @param _currentLayer - The current render layer being processed.\n * @internal\n */\n public override collectRenderables(instructionSet: InstructionSet, renderer: Renderer, _currentLayer: RenderLayer): void\n {\n const layerChildren = this.renderLayerChildren;\n const length = layerChildren.length;\n\n if (this.sortableChildren)\n {\n this.sortRenderLayerChildren();\n }\n\n for (let i = 0; i < length; i++)\n {\n if (!layerChildren[i].parent)\n {\n // eslint-disable-next-line max-len\n warn('Container must be added to both layer and scene graph. Layers only handle render order - the scene graph is required for transforms (addChild)',\n layerChildren[i]);\n }\n\n layerChildren[i].collectRenderables(instructionSet, renderer, this);\n }\n }\n\n /**\n * Sort the layer's children using the defined sort function. This method allows manual sorting\n * of layer children and is automatically called during rendering if sortableChildren is true.\n * @example\n * ```ts\n * const layer = new RenderLayer();\n *\n * // Add multiple sprites at different depths\n * const sprite1 = new Sprite(texture);\n * const sprite2 = new Sprite(texture);\n * const sprite3 = new Sprite(texture);\n *\n * sprite1.zIndex = 3;\n * sprite2.zIndex = 1;\n * sprite3.zIndex = 2;\n *\n * layer.attach(sprite1, sprite2, sprite3);\n *\n * // Manual sorting with default zIndex sort\n * layer.sortRenderLayerChildren();\n * // Order is now: sprite2 (1), sprite3 (2), sprite1 (3)\n *\n * // Custom sort by y position\n * layer.sortFunction = (a, b) => a.y - b.y;\n * layer.sortRenderLayerChildren();\n *\n * // Automatic sorting\n * layer.sortableChildren = true; // Will sort each render\n * ```\n * @returns The RenderLayer instance for method chaining\n * @see {@link RenderLayer#sortableChildren} For enabling automatic sorting\n * @see {@link RenderLayer#sortFunction} For customizing the sort logic\n */\n public sortRenderLayerChildren()\n {\n this.renderLayerChildren.sort(this.sortFunction);\n }\n\n /**\n * Recursively calculates the global bounds of this RenderLayer and its children.\n * @param factorRenderLayers\n * @param bounds\n * @param _currentLayer\n * @internal\n */\n public override _getGlobalBoundsRecursive(\n factorRenderLayers: boolean,\n bounds: Bounds,\n _currentLayer: RenderLayer,\n ): void\n {\n if (!factorRenderLayers) return;\n\n const children = this.renderLayerChildren;\n\n for (let i = 0; i < children.length; i++)\n {\n children[i]._getGlobalBoundsRecursive(true, bounds, this);\n }\n }\n\n /**\n * @inheritdoc\n * @internal\n */\n public getFastGlobalBounds(factorRenderLayers?: boolean, bounds?: Bounds): Bounds\n {\n return super.getFastGlobalBounds(factorRenderLayers, bounds);\n }\n /**\n * This method is not available in RenderLayer.\n *\n * Calling this method will throw an error. Please use `RenderLayer.attach()` instead.\n * @param {...any} _children\n * @throws {Error} Always throws an error as this method is not available.\n * @ignore\n */\n public override addChild<U extends Container[]>(..._children: U): never\n {\n throw new Error(\n 'RenderLayer.addChild() is not available. Please use RenderLayer.attach()',\n );\n }\n /**\n * This method is not available in RenderLayer.\n * Calling this method will throw an error. Please use `RenderLayer.detach()` instead.\n * @param {...any} _children\n * @throws {Error} Always throws an error as this method is not available.\n * @ignore\n */\n public override removeChild<U extends Container[]>(..._children: U): never\n {\n throw new Error(\n 'RenderLayer.removeChild() is not available. Please use RenderLayer.detach()',\n );\n }\n /**\n * This method is not available in RenderLayer.\n *\n * Calling this method will throw an error. Please use `RenderLayer.detach()` instead.\n * @param {number} [_beginIndex]\n * @param {number} [_endIndex]\n * @throws {Error} Always throws an error as this method is not available.\n * @ignore\n */\n public override removeChildren(_beginIndex?: number, _endIndex?: number): never\n {\n throw new Error(\n 'RenderLayer.removeChildren() is not available. Please use RenderLayer.detach()',\n );\n }\n /**\n * This method is not available in RenderLayer.\n *\n * Calling this method will throw an error.\n * @param {number} _index\n * @throws {Error} Always throws an error as this method is not available.\n * @ignore\n */\n public override removeChildAt(_index: number): never\n {\n throw new Error(\n 'RenderLayer.removeChildAt() is not available',\n );\n }\n /**\n * This method is not available in RenderLayer.\n *\n * Calling this method will throw an error.\n * @param {number} _index\n * @throws {Error} Always throws an error as this method is not available.\n * @ignore\n */\n public override getChildAt(_index: number): never\n {\n throw new Error(\n 'RenderLayer.getChildAt() is not available',\n );\n }\n /**\n * This method is not available in RenderLayer.\n *\n * Calling this method will throw an error.\n * @param {Container} _child\n * @param {number} _index\n * @throws {Error} Always throws an error as this method is not available.\n * @ignore\n */\n public override setChildIndex(_child: Container, _index: number): never\n {\n throw new Error(\n 'RenderLayer.setChildIndex() is not available',\n );\n }\n /**\n * This method is not available in RenderLayer.\n *\n * Calling this method will throw an error.\n * @param {Container} _child\n * @throws {Error} Always throws an error as this method is not available.\n * @ignore\n */\n public override getChildIndex(_child: Container): never\n {\n throw new Error(\n 'RenderLayer.getChildIndex() is not available',\n );\n }\n /**\n * This method is not available in RenderLayer.\n *\n * Calling this method will throw an error.\n * @param {Container} _child\n * @param {number} _index\n * @throws {Error} Always throws an error as this method is not available.\n * @ignore\n */\n public override addChildAt<U extends Container>(_child: U, _index: number): never\n {\n throw new Error(\n 'RenderLayer.addChildAt() is not available',\n );\n }\n /**\n * This method is not available in RenderLayer.\n *\n * Calling this method will throw an error.\n * @param {Container} _child\n * @param {Container} _child2\n * @ignore\n */\n public override swapChildren<U extends Container>(_child: U, _child2: U): never\n {\n throw new Error(\n 'RenderLayer.swapChildren() is not available',\n );\n }\n\n /**\n * This method is not available in RenderLayer.\n *\n * Calling this method will throw an error.\n * @param _child - The child to reparent\n * @throws {Error} Always throws an error as this method is not available.\n * @ignore\n */\n public override reparentChild(..._child: Container[]): never\n {\n throw new Error('RenderLayer.reparentChild() is not available with the render layer');\n }\n\n /**\n * This method is not available in RenderLayer.\n *\n * Calling this method will throw an error.\n * @param _child - The child to reparent\n * @param _index - The index to reparent the child to\n * @throws {Error} Always throws an error as this method is not available.\n * @ignore\n */\n public override reparentChildAt(_child: Container, _index: number): never\n {\n throw new Error('RenderLayer.reparentChildAt() is not available with the render layer');\n }\n}\n"],"names":[],"mappings":"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"}