UNPKG

phaser

Version:

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

173 lines (150 loc) 7.35 kB
/** * @author Benjamin D. Richards <benjamindrichards@gmail.com> * @copyright 2013-2026 Phaser Studio Inc. * @license {@link https://opensource.org/licenses/MIT|MIT License} */ var Class = require('../../../../utils/Class'); var Utils = require('../../Utils.js'); var SubmitterQuad = require('./SubmitterQuad.js'); var getTint = Utils.getTintAppendFloatAlpha; /** * @classdesc * The SubmitterTileSprite RenderNode submits data for rendering a single TileSprite GameObject. * It uses a BatchHandler to render the TileSprite as part of a batch. * * This node receives the drawing context, game object, and parent matrix. * It also receives the texturer, tinter, and transformer nodes * from the node that invoked it. * This allows the behavior to be configured by setting the appropriate nodes * on the GameObject for individual tweaks, or on the invoking Renderer node * for global changes. * * @class SubmitterTileSprite * @memberof Phaser.Renderer.WebGL.RenderNodes * @constructor * @since 4.0.0 * @extends Phaser.Renderer.WebGL.RenderNodes.SubmitterQuad * @param {Phaser.Renderer.WebGL.RenderNodes.RenderNodeManager} manager - The manager that owns this RenderNode. * @param {Phaser.Types.Renderer.WebGL.RenderNodes.SubmitterQuadConfig} [config] - The configuration object for this Submitter. This is a SubmitterQuad configuration object with the `name` defaulting to `SubmitterTileSprite`. */ var SubmitterTileSprite = new Class({ Extends: SubmitterQuad, initialize: function SubmitterTileSprite (manager, config) { SubmitterQuad.call(this, manager, config); this._renderOptions.wrapFrame = true; }, /** * The default configuration for this RenderNode. * * @name Phaser.Renderer.WebGL.RenderNodes.SubmitterTileSprite#defaultConfig * @type {Phaser.Types.Renderer.WebGL.RenderNodes.SubmitterQuadConfig} */ defaultConfig: { name: 'SubmitterTileSprite', role: 'Submitter', batchHandler: 'BatchHandler' }, /** * Submits vertex, texture, and tint data for a single TileSprite GameObject * to the appropriate batch handler for WebGL rendering. This method invokes * the texturer, transformer, and tinter nodes in sequence to populate the * required rendering data, then passes it to the batch handler along with * the UV matrix quad for tile scrolling and wrapping, and any lighting * options including the tile's rotation applied to the normal map. * * @method Phaser.Renderer.WebGL.RenderNodes.SubmitterTileSprite#run * @since 4.0.0 * @param {Phaser.Renderer.WebGL.DrawingContext} drawingContext - The current drawing context. * @param {Phaser.GameObjects.GameObject} gameObject - The GameObject being rendered. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - The parent matrix of the GameObject. * @param {?object} element - The specific element within the game object. This is used for objects that consist of multiple quads. * @param {Phaser.Renderer.WebGL.RenderNodes.RenderNode} texturerNode - The texturer node used to texture the GameObject. You may pass a TexturerTileSprite node or an object containing equivalent data without a `run` method. * @param {Phaser.Renderer.WebGL.RenderNodes.TransformerTileSprite|{ quad: Float32Array }} transformerNode - The transformer node used to transform the GameObject. You may pass a transformer node or an object with a `quad` property. * @param {Phaser.Renderer.WebGL.RenderNodes.RenderNode|Omit<Phaser.Renderer.WebGL.RenderNodes.RenderNode, 'run'>} [tinterNode] - The tinter node used to tint the GameObject. You may pass a tinter node or an object containing equivalent data without a `run` method. If omitted, Image-style tinting will be used. * @param {Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper} [normalMap] - The normal map texture to use for lighting. If omitted, the normal map texture of the GameObject will be used, or the default normal map texture of the renderer. * @param {number} [normalMapRotation] - The rotation of the normal map texture. If omitted, the rotation of the GameObject will be used. */ run: function ( drawingContext, gameObject, parentMatrix, element, texturerNode, transformerNode, tinterNode, normalMap, normalMapRotation ) { this.onRunBegin(drawingContext); var tintEffect, tintTopLeft, tintBottomLeft, tintTopRight, tintBottomRight; if (texturerNode.run) { texturerNode.run(drawingContext, gameObject, element); } if (transformerNode.run) { transformerNode.run(drawingContext, gameObject, texturerNode, parentMatrix, element); } if (tinterNode) { if (tinterNode.run) { tinterNode.run(drawingContext, gameObject, element); } tintEffect = tinterNode.tintEffect; tintTopLeft = tinterNode.tintTopLeft; tintBottomLeft = tinterNode.tintBottomLeft; tintTopRight = tinterNode.tintTopRight; tintBottomRight = tinterNode.tintBottomRight; } else { tintEffect = gameObject.tintMode; tintTopLeft = getTint(gameObject.tintTopLeft, gameObject._alphaTL); tintBottomLeft = getTint(gameObject.tintBottomLeft, gameObject._alphaBL); tintTopRight = getTint(gameObject.tintTopRight, gameObject._alphaTR); tintBottomRight = getTint(gameObject.tintBottomRight, gameObject._alphaBR); } var frame = texturerNode.frame; var quad = transformerNode.quad; var uvSource = frame; var u0 = uvSource.u0; var v0 = uvSource.v0; var u1 = uvSource.u1; var v1 = uvSource.v1; var uvQuad = texturerNode.uvMatrix.quad; this.setRenderOptions(gameObject, normalMap, normalMapRotation); // Normal map rotation must include the texture rotation. this._lightingOptions.normalMapRotation += gameObject.tileRotation; ( gameObject.customRenderNodes[this.batchHandler] || gameObject.defaultRenderNodes[this.batchHandler] ).batch( drawingContext, // Use `frame.source.glTexture` instead of `frame.glTexture` // to avoid unnecessary getter function calls. frame.source.glTexture, // Transformed quad in order TL, BL, TR, BR: quad[0], quad[1], quad[2], quad[3], quad[6], quad[7], quad[4], quad[5], // Texture coordinates in X, Y, Width, Height: u0, v0, u1 - u0, v1 - v0, tintEffect, // Tint colors in order TL, BL, TR, BR: tintTopLeft, tintBottomLeft, tintTopRight, tintBottomRight, // Extra render options: this._renderOptions, // Dynamic UV coordinates in order TL, BL, TR, BR: uvQuad[0], uvQuad[1], uvQuad[2], uvQuad[3], uvQuad[6], uvQuad[7], uvQuad[4], uvQuad[5] ); this.onRunEnd(drawingContext); } }); module.exports = SubmitterTileSprite;