UNPKG

phaser

Version:

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

164 lines (143 loc) 6.67 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 SubmitterQuad = require('./SubmitterQuad'); /** * @classdesc * A specialized RenderNode that extends SubmitterQuad to handle the submission * of tile rendering data to the WebGL batch handler. It is used internally by * Tilemap layers to render individual tiles. Unlike the base SubmitterQuad, * SubmitterTile enables frame clamping (`clampFrame = true`) on its render * options, which prevents texture bleeding between adjacent tiles that share a * tileset texture atlas. * * @class SubmitterTile * @extends Phaser.Renderer.WebGL.RenderNodes.SubmitterQuad * @memberof Phaser.Renderer.WebGL.RenderNodes * @constructor * @since 4.0.0 * @param {Phaser.Renderer.WebGL.WebGLRenderer} manager - The WebGLRenderer that owns this Submitter. * @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 `SubmitterTile`. */ var SubmitterTile = new Class({ Extends: SubmitterQuad, initialize: function SubmitterTile (manager, config) { SubmitterQuad.call(this, manager, config); this._renderOptions.clampFrame = true; }, /** * The default configuration for this RenderNode. * * @name Phaser.Renderer.WebGL.RenderNodes.SubmitterTile#defaultConfig * @type {Phaser.Types.Renderer.WebGL.RenderNodes.SubmitterQuadConfig} */ defaultConfig: { name: 'SubmitterTile', role: 'Submitter', batchHandler: 'BatchHandler' }, /** * Submits rendering data for a single tile to the WebGL batch handler. * Optionally executes the texturer, transformer, and tinter nodes to resolve * texture coordinates, transformed quad geometry, and per-corner tint colors. * If no tinter node is provided, the tile is rendered without tinting using * a full white (0xffffffff) color. The resolved data is then passed to the * appropriate batch handler for GPU submission. * * @method Phaser.Renderer.WebGL.RenderNodes.SubmitterTile#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, no 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; var tint = 0xffffffff; tintTopLeft = tint; tintBottomLeft = tint; tintTopRight = tint; tintBottomRight = tint; } var frame = texturerNode.frame; var quad = transformerNode.quad; var uvSource = texturerNode.uvSource; var u0 = uvSource.u0; var v0 = uvSource.v0; var u1 = uvSource.u1; var v1 = uvSource.v1; this.setRenderOptions(gameObject, normalMap, normalMapRotation); ( 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, // Frame coordinates in order TL, BL, TR, BR: u0, v1, u0, v0, u1, v1, u1, v0 ); this.onRunEnd(drawingContext); } }); module.exports = SubmitterTile;