UNPKG

phaser4-rex-plugins

Version:
1,680 lines (1,378 loc) 69 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.rexdelaunayimageplugin = factory()); })(this, (function () { 'use strict'; const GameObject = Phaser.GameObjects.GameObject; let Image$1 = class Image extends GameObject { }; const Components = Phaser.GameObjects.Components; Phaser.Class.mixin(Image$1, [ Components.AlphaSingle, Components.BlendMode, Components.Depth, Components.Flip, Components.Mask, Components.Origin, Components.RenderNodes, Components.Size, Components.Texture, Components.Transform, Components.Visible, Components.ScrollFactor, ] ); const GetCalcMatrix = Phaser.GameObjects.GetCalcMatrix; var renderOptions = { multiTexturing: false, smoothPixelArt: false }; var WebGLRenderer = function (renderer, src, drawingContext, parentMatrix) { var camera = drawingContext.camera; camera.addToRenderList(src); if (src.skipRender()) { return; } var calcMatrix = GetCalcMatrix(src, camera, parentMatrix, !drawingContext.useCanvas).calc; if (src.dirty) { src.updateBuffers(); } // Get smooth pixel art option. var smoothPixelArt; var srcTexture = src.texture; if (srcTexture && srcTexture.smoothPixelArt !== null) { smoothPixelArt = srcTexture.smoothPixelArt; } else { smoothPixelArt = src.scene.sys.game.config.smoothPixelArt; } renderOptions.smoothPixelArt = smoothPixelArt; (src.customRenderNodes.BatchHandler || src.defaultRenderNodes.BatchHandler).batchTriangles( drawingContext, src, calcMatrix, src.texture.source[0].glTexture, src.vertexBuffer, src.uvBuffer, src.colorBuffer, src.alphaBuffer, src.alpha, src.tintFill, renderOptions, src.debugCallback ); }; var CanvasRenderer = function (renderer, src, camera, parentMatrix) { }; var SkipRender = function () { return this.faces.length === 0; }; var Render = { renderWebGL: WebGLRenderer, renderCanvas: CanvasRenderer, skipRender: SkipRender, }; const RotateAround$1 = Phaser.Math.RotateAround; var LocalXYToWorldXY = function (gameObject, localX, localY, out) { if (out === undefined) { out = {}; } else if (out === true) { out = GlobalXY$1; } var ox = gameObject.displayOriginX; var oy = gameObject.displayOriginY; out.x = localX - ox; out.y = localY - oy; RotateAround$1(out, 0, 0, gameObject.rotation); out.x *= gameObject.scaleX; out.y *= gameObject.scaleY; out.x += gameObject.x; out.y += gameObject.y; return out; }; var WorldXYToLocalXY = function (gameObject, worldX, worldY, out) { if (out === undefined) { out = {}; } else if (out === true) { out = GlobalXY$1; } var ox = gameObject.displayOriginX; var oy = gameObject.displayOriginY; out.x = worldX - gameObject.x; out.y = worldY - gameObject.y; out.x /= gameObject.scaleX; out.y /= gameObject.scaleY; RotateAround$1(out, 0, 0, -gameObject.rotation); out.x += ox; out.y += oy; return out; }; var GlobalXY$1 = {}; const Linear = Phaser.Math.Linear; const RotateAround = Phaser.Math.RotateAround; class Vertex { constructor() { this.parent = undefined; // Mesh game object this.name = ''; this.u = 0; this.v = 0; this.frameU = 0; this.frameV = 0; this.frameX = 0; this.frameY = 0; this._dx = 0; this._dy = 0; this.localX = 0; this.localY = 0; this.alpha = 1; this.color = 0xffffff; } setParent(parent) { this.parent = parent; return this; } setName(name) { this.name = name; return this; } get frameU() { return this._frameU; } set frameU(value) { if (this._frameU === value) { return; } this._frameU = value; if (this.parent) { this.parent.setUVDirtyFlag(); } } get frameV() { return this._frameV; } set frameV(value) { if (this._frameV === value) { return; } this._frameV = value; if (this.parent) { this.parent.setUVDirtyFlag(); } } get frameX() { return this._frameX; } set frameX(value) { if (this._frameX === value) { return; } this._frameX = value; this._localX = value + this._dx; if (this.parent) { this.parent.setVertexDirtyFlag(); } } get frameY() { return this._frameY; } set frameY(value) { if (this._frameY === value) { return; } this._frameY = value; this._localY = value + this._dy; if (this.parent) { this.parent.setVertexDirtyFlag(); } } get localX() { return this._localX; } set localX(value) { if (this._localX === value) { return; } this._localX = value; this._dx = value - this._frameX; if (this.parent) { this.parent.setVertexDirtyFlag(); } } get localY() { return this._localY; } set localY(value) { if (this._localY === value) { return; } this._localY = value; this._dy = value - this._frameY; if (this.parent) { this.parent.setVertexDirtyFlag(); } } get alpha() { return this._alpha; } set alpha(value) { if (this._alpha === value) { return; } this._alpha = value; if (this.parent) { this.parent.setAlphaDirtyFlag(); } } get color() { return this._color; } set color(value) { if (this._color === value) { return; } this._color = value; if (this.parent) { this.parent.setColorDirtyFlag(); } } setUV(u, v) { this.u = u; this.v = v; return this; } setFrameUV(frameU0, frameV0, frameU1, frameV1) { this.frameU = Linear(frameU0, frameU1, this.u); this.frameV = Linear(frameV0, frameV1, this.v); return this; } setFrameSize(frameWidth, frameHeight) { this.frameX = this.u * frameWidth; this.frameY = this.v * frameHeight; return this; } // Reset position to frame position resetPosition() { this.localX = this.frameX; this.localY = this.frameY; return this; } setLocalPosition(x, y) { this.localX = x; this.localY = y; return this; } rotateAround(ox, oy, rotation) { GlobalXY.x = this.localX; GlobalXY.y = this.localY; RotateAround(GlobalXY, ox, oy, rotation); this.localX = GlobalXY.x; this.localY = GlobalXY.y; return this; } setAlpha(value) { this.alpha = value; return this; } setColor(value) { this.color = value; return this; } getWorldXY(out) { if (this.parent) { return LocalXYToWorldXY(this.parent, this.localX, this.localY, out); } else { return null; } } setWorldXY(x, y) { var out = WorldXYToLocalXY(this.parent, x, y, true); this.setLocalPosition(out.x, out.y); return this; } setPosition(x, y) { this.setWorldXY(x, y); return this; } get x() { if (this.parent) { return this.getWorldXY(true).x; } else { return null; } } set x(value) { this.setWorldXY(value, this.y); } get y() { if (this.parent) { return this.getWorldXY(true).y; } else { return null; } } set y(value) { this.setWorldXY(this.x, value); } } var GlobalXY = {}; const InCenter = Phaser.Geom.Triangle.InCenter; var GetInCenter = function (face, out) { if (out === undefined) { out = {}; } else if (out === true) { out = GlobalOut; } GlobalTriangle.x1 = face.vertices[0].localX; GlobalTriangle.y1 = face.vertices[0].localY; GlobalTriangle.x2 = face.vertices[1].localX; GlobalTriangle.y2 = face.vertices[1].localY; GlobalTriangle.x3 = face.vertices[2].localX; GlobalTriangle.y3 = face.vertices[2].localY; return InCenter(GlobalTriangle, out); }; var GlobalTriangle = {}; var GlobalOut = {}; var Contains$1 = function (face, x, y) { var vertices = face.vertices; var v0 = vertices[0]; var v1 = vertices[1]; var v2 = vertices[2]; GlobTriangle.setTo( v0.localX, v0.localY, v1.localX, v1.localY, v2.localX, v2.localY, ); return GlobTriangle.contains(x, y); }; var GlobTriangle = new Phaser.Geom.Triangle(); const RadToDeg = Phaser.Math.RadToDeg; const DegToRad = Phaser.Math.DegToRad; class Face { constructor(vertex0, vertex1, vertex2) { if (vertex0 === undefined) { vertex0 = new Vertex(); } if (vertex1 === undefined) { vertex1 = new Vertex(); } if (vertex2 === undefined) { vertex2 = new Vertex(); } this.parent = undefined; // Mesh game object this.name = ''; this.vertices = [vertex0, vertex1, vertex2]; this._localOffsetX = 0; this._localOffsetY = 0; this._rotation = 0; this._alpha = 1; this._color = 0xffffff; } setParent(parent) { this.parent = parent; this.vertices[0].setParent(parent); this.vertices[1].setParent(parent); this.vertices[2].setParent(parent); return this; } setName(name) { this.name = name; return this; } get vertex0() { return this.vertices[0]; } set vertex0(value) { this.vertices[0] = value; } get vertex1() { return this.vertices[1]; } set vertex1(value) { this.vertices[1] = value; } get vertex2() { return this.vertices[2]; } set vertex2(value) { this.vertices[2] = value; } get localOffsetX() { return this._localOffsetX; } set localOffsetX(value) { if (value === this._localOffsetX) { return; } this._localOffsetX = value; this.updateVerticesPosition(); } get localOffsetY() { return this._localOffsetY; } set localOffsetY(value) { if (value === this._localOffsetY) { return; } this._localOffsetY = value; this.updateVerticesPosition(); } get rotation() { return this._rotation; } set rotation(value) { if (value === this._rotation) { return; } this._rotation = value; var oxy = GetInCenter(this, true); var ox = oxy.x; var oy = oxy.y; this.vertices[0].rotateAround(ox, oy, value); this.vertices[1].rotateAround(ox, oy, value); this.vertices[2].rotateAround(ox, oy, value); } get angle() { return RadToDeg(this._rotation); } set angle(value) { this.rotation = DegToRad(value); } get alpha() { return this._alpha; } set alpha(value) { if (this._alpha === value) { return; } this._alpha = value; this.vertices[0].setAlpha(value); this.vertices[1].setAlpha(value); this.vertices[2].setAlpha(value); } get color() { return this._color; } set color(value) { if (this._color === value) { return; } this._color = value; this.vertices[0].setColor(value); this.vertices[1].setColor(value); this.vertices[2].setColor(value); } get isPositionModified() { return (this._localOffsetX !== 0) || (this._localOffsetY !== 0) || (this._rotation !== 0); } setUV(u0, v0, u1, v1, u2, v2) { this.vertices[0].setUV(u0, v0); this.vertices[1].setUV(u1, v1); this.vertices[2].setUV(u2, v2); return this; } setFrameUV(frameU0, frameV0, frameU1, frameV1) { this.vertices[0].setFrameUV(frameU0, frameV0, frameU1, frameV1); this.vertices[1].setFrameUV(frameU0, frameV0, frameU1, frameV1); this.vertices[2].setFrameUV(frameU0, frameV0, frameU1, frameV1); return this; } setFrameSize(frameWidth, frameHeight) { // Set local position of vertices by frameXY and dxy for (var i = 0, cnt = this.vertices.length; i < cnt; i++) { this.vertices[i].setFrameSize(frameWidth, frameHeight); } // Apply face offset, and rotation to vertices if (this.isPositionModified) { this.updateVerticesPosition(); } return this; } setLocalOffset(x, y) { this.localOffsetX = x; this.localOffsetY = y; return this; } resetVerticesPosition() { for (var i = 0, cnt = this.vertices.length; i < cnt; i++) { this.vertices[i].resetPosition(); } if (this.isPositionModified) { this.updateVerticesPosition(); } return this; } updateVerticesPosition() { // Extract the horizontal offset of the Face to calculate the new vertex positions var offsetX = this._localOffsetX; // Extract the vertical offset of the Face to calculate the new vertex positions var offsetY = this._localOffsetY; var vertices = this.vertices; for (var i = 0, cnt = vertices.length; i < cnt; i++) { var vertex = vertices[i]; // Update each vertex position based on frameX, frameY, and the Face's offsets // This process overrides the original dx and dy values, ensuring the relative distance between the three vertices is maintained vertex.setLocalPosition(vertex.frameX + offsetX, vertex.frameY + offsetY); } // Save the current rotation value to reapply after resetting rotation to 0 var rotationSave = this.rotation; this._rotation = 0; this.rotation = rotationSave; return this; } setRotation(value) { this.rotation = value; return this; } setAngle(value) { this.angle = value; return this; } setAlpha(value) { this.alpha = value; return this; } setColor(value) { this.color = value; return this; } contains(localX, localY) { return Contains$1(this, localX, localY); } } var IsPlainObject$3 = function (obj) { // Not plain objects: // - Any object or value whose internal [[Class]] property is not "[object Object]" // - DOM nodes // - window if (typeof(obj) !== 'object' || obj.nodeType || obj === obj.window) { return false; } // Support: Firefox <20 // The try/catch suppresses exceptions thrown when attempting to access // the "constructor" property of certain host objects, ie. |window.location| // https://bugzilla.mozilla.org/show_bug.cgi?id=814622 try { if (obj.constructor && !({}).hasOwnProperty.call(obj.constructor.prototype, 'isPrototypeOf')) { return false; } } catch (e) { return false; } // If the function hasn't returned already, we're confident that // |obj| is a plain object, created by {} or constructed with new Object return true; }; var GenerateGridVertices = function (gameObject, columns, rows, sharedVertexMode) { if (IsPlainObject$3(columns)) { var config = columns; columns = config.columns; rows = config.rows; sharedVertexMode = config.sharedVertexMode; } if (columns === undefined) { columns = 1; } if (rows === undefined) { rows = 1; } if (sharedVertexMode === undefined) { sharedVertexMode = false; } var faces = []; var vertices; if (sharedVertexMode) { vertices = []; for (var r = 0; r <= rows; r++) { for (var c = 0; c <= columns; c++) { var vertex = gameObject.createVertex(c / columns, r / rows); vertices.push(vertex); } } } var vertex0, vertex1, vertex2; var face; for (var r = 0; r < rows; r++) { for (var c = 0; c < columns; c++) { if (sharedVertexMode) { var indexTL = (r * (columns + 1)) + c, indexTR = indexTL + 1, indexBL = ((r + 1) * (columns + 1)) + c, indexBR = indexBL + 1; var vertexTL = vertices[indexTL]; var vertexTR = vertices[indexTR]; var vertexBL = vertices[indexBL]; var vertexBR = vertices[indexBR]; face = gameObject.createFace(vertexTL, vertexBR, vertexBL); gameObject.addFace(face); faces.push(face); face = gameObject.createFace(vertexTL, vertexTR, vertexBR); gameObject.addFace(face); faces.push(face); } else { var lx = c / columns, rx = (c + 1) / columns, ty = r / rows, by = (r + 1) / rows; vertex0 = gameObject.createVertex(lx, ty); // top-left vertex1 = gameObject.createVertex(lx, by); // bottom-left vertex2 = gameObject.createVertex(rx, by); // bottom-right face = gameObject.createFace(vertex0, vertex1, vertex2); gameObject.addFace(face); faces.push(face); vertex0 = gameObject.createVertex(lx, ty); // top-left vertex1 = gameObject.createVertex(rx, by); // bottom-right vertex2 = gameObject.createVertex(rx, ty); // top-right face = gameObject.createFace(vertex0, vertex1, vertex2); gameObject.addFace(face); faces.push(face); } } } if (sharedVertexMode) { gameObject.vertices.sort(function (vertexA, vertexB) { if (vertexA.v === vertexB.v) { return vertexA.u - vertexB.u; } else { return vertexA.v - vertexB.v; } }); } return faces; }; const GetFirst = Phaser.Utils.Array.GetFirst; var VertexMethods = { clear() { this.faces.length = 0; this.vertices.length = 0; this.setFaceCountDirtyFlag(); return this; }, createVertex(u, v) { if (u === undefined) { u = 0; } if (v === undefined) { v = 0; } var vertex = new Vertex(); vertex.setUV(u, v); return vertex; }, createFace(vertex0, vertex1, vertex2) { return new Face(vertex0, vertex1, vertex2); }, addFace(face) { if (this.faces.includes(face)) { return this; } face.setParent(this); this.faces.push(face); this.setFaceCountDirtyFlag(); var frame = this.frame; face .setFrameSize(frame.cutWidth, frame.cutHeight) .setFrameUV(frame.u0, frame.v0, frame.u1, frame.v1) .resetVerticesPosition(); var vertices = this.vertices; face.vertices.forEach(function (faceVertex) { if (vertices.includes(faceVertex)) { return; } vertices.push(faceVertex); }); return this; }, addFaces(faces) { for (var i = 0, cnt = faces.length; i < cnt; i++) { this.addFace(faces[i]); } return this; }, resetFaceSize() { var frame = this.frame; var frameWidth = frame.realWidth; var frameHeight = frame.realHeight; var faces = this.faces; for (var i = 0, cnt = faces.length; i < cnt; i++) { faces[i].setFrameSize(frameWidth, frameHeight); } return this; }, addGridFaces(columns, rows, sharedVertexMode) { GenerateGridVertices(this, columns, rows, sharedVertexMode); return this; }, getVertexByName(name) { return GetFirst(this.vertices, 'name', name); }, getFaceByName(name) { return GetFirst(this.faces, 'name', name); }, resetVerticesPosition() { var vertices = this.vertices; for (var i = 0, cnt = vertices.length; i < cnt; i++) { vertices[i].resetPosition(); } return this; } }; const UPDATE_ARRAYS = (1 << 0); const UPDATE_UV = (1 << 1); const UPDATE_VERTEX = (1 << 2); const UPDATE_ALPHA = (1 << 3); const UPDATE_COLOR = (1 << 4); const UPDATE_ALL = UPDATE_ARRAYS | UPDATE_UV | UPDATE_VERTEX | UPDATE_ALPHA | UPDATE_COLOR; var DirtyFlagsMethods = { clearDirtyFlag() { this.dirtyFlags = 0; return this; }, setFaceCountDirtyFlag() { this.dirtyFlags |= UPDATE_ALL; return this; }, setUVDirtyFlag() { this.dirtyFlags |= UPDATE_UV; return this; }, setVertexDirtyFlag() { this.dirtyFlags |= UPDATE_VERTEX; return this; }, setAlphaDirtyFlag() { this.dirtyFlags |= UPDATE_ALPHA; return this; }, setColorDirtyFlag() { this.dirtyFlags |= UPDATE_COLOR; return this; }, }; var UpdateMethods = { updateBuffers() { if (!this.dirty) { return this; } if (this.dirtyFlags & UPDATE_ARRAYS) { this.resizeBuffers(); } if (this.dirtyFlags & UPDATE_UV) { this.updateUVBuffer(); } if (this.dirtyFlags & UPDATE_VERTEX) { this.updateVertexBuffer(); } if (this.dirtyFlags & UPDATE_ALPHA) { this.updateAlphaBuffer(); } if (this.dirtyFlags & UPDATE_COLOR) { this.updateColorBuffer(); } this.clearDirtyFlag(); return this; }, resizeBuffers() { var size = this.faces.length; this.vertexBuffer = new Float32Array(size * 6); this.uvBuffer = new Float32Array(size * 6); this.colorBuffer = new Uint32Array(size * 3); this.alphaBuffer = new Float32Array(size * 3); return this; }, updateUVBuffer() { var uvBuffer = this.uvBuffer, index; var faces = this.faces, vertices; for (var i = 0, cnt = faces.length; i < cnt; i++) { vertices = faces[i].vertices; index = i * 6; uvBuffer[index] = vertices[0].frameU; uvBuffer[index + 1] = vertices[0].frameV; uvBuffer[index + 2] = vertices[1].frameU; uvBuffer[index + 3] = vertices[1].frameV; uvBuffer[index + 4] = vertices[2].frameU; uvBuffer[index + 5] = vertices[2].frameV; } return this; }, updateVertexBuffer() { var vertexBuffer = this.vertexBuffer, index; var faces = this.faces, vertices; for (var i = 0, cnt = faces.length; i < cnt; i++) { vertices = faces[i].vertices; index = i * 6; vertexBuffer[index] = vertices[0].localX; vertexBuffer[index + 1] = vertices[0].localY; vertexBuffer[index + 2] = vertices[1].localX; vertexBuffer[index + 3] = vertices[1].localY; vertexBuffer[index + 4] = vertices[2].localX; vertexBuffer[index + 5] = vertices[2].localY; } return this; }, updateAlphaBuffer() { var alphaBuffer = this.alphaBuffer, index; var faces = this.faces, vertices; for (var i = 0, cnt = faces.length; i < cnt; i++) { vertices = faces[i].vertices; index = i * 3; alphaBuffer[index] = vertices[0].alpha; alphaBuffer[index + 1] = vertices[1].alpha; alphaBuffer[index + 2] = vertices[2].alpha; } return this; }, updateColorBuffer() { var colorBuffer = this.colorBuffer, index; var faces = this.faces, vertices; for (var i = 0, cnt = faces.length; i < cnt; i++) { vertices = faces[i].vertices; index = i * 3; colorBuffer[index] = vertices[0].color; colorBuffer[index + 1] = vertices[1].color; colorBuffer[index + 2] = vertices[2].color; } return this; } }; var TintMethods = { setTintFill(value) { if (value === undefined) { value = false; } this.tintFill = value; return this; }, setTint(color) { this.tint = color; return this; }, clearTint() { this.setTint(0xffffff); return this; } }; var DebugMethods = { setDebug(graphic, callback) { this.debugGraphic = graphic; if (!graphic && !callback) { this.debugCallback = null; } else if (!callback) { this.debugCallback = this.renderDebugVerts; } else { this.debugCallback = callback; } return this; }, renderDebugVerts(src, meshLength, verts) { var graphic = src.debugGraphic; for (var i = 0; i < meshLength; i += 6) { var x0 = verts[i + 0]; var y0 = verts[i + 1]; var x1 = verts[i + 2]; var y1 = verts[i + 3]; var x2 = verts[i + 4]; var y2 = verts[i + 5]; graphic.lineBetween(x0, y0, x1, y1); graphic.lineBetween(x1, y1, x2, y2); graphic.lineBetween(x2, y2, x0, y0); } }, }; const TransformMatrix = Phaser.GameObjects.Components.TransformMatrix; const TransformXY = Phaser.Math.TransformXY; var WorldXYToGameObjectLocalXY = function (gameObject, worldX, worldY, camera, out) { if (camera === undefined) { camera = gameObject.scene.cameras.main; } if (out === undefined) { out = {}; } else if (out === true) { out = globOut; } var csx = camera.scrollX; var csy = camera.scrollY; var px = worldX + (csx * gameObject.scrollFactorX) - csx; var py = worldY + (csy * gameObject.scrollFactorY) - csy; if (gameObject.parentContainer) { if (tempMatrix === undefined) { tempMatrix = new TransformMatrix(); parentMatrix = new TransformMatrix(); } gameObject.getWorldTransformMatrix(tempMatrix, parentMatrix); tempMatrix.applyInverse(px, py, out); } else { TransformXY(px, py, gameObject.x, gameObject.y, gameObject.rotation, gameObject.scaleX, gameObject.scaleY, out); } out.x += gameObject.displayOriginX; out.y += gameObject.displayOriginY; return out; }; var tempMatrix, parentMatrix; var globOut = {}; var PointMethods = { getFaceAt(worldX, worldY, camera) { var localXY = WorldXYToGameObjectLocalXY(this, worldX, worldY, camera, true); var localX = localXY.x, localY = localXY.y; var faces = this.faces; for (var i = 0, cnt = faces.length; i < cnt; i++) { var face = faces[i]; if (face.contains(localX, localY)) { return face; } } return null; }, hasFaceAt(worldX, worldY, camera) { return !!this.getFaceAt(worldX, worldY, camera); }, }; var Contains = function (shape, x, y, gameObject) { var faces = gameObject.faces; for (var i = 0, cnt = faces.length; i < cnt; i++) { var face = faces[i]; if (face.contains(x, y)) { gameObject.input.hitFace = face; return true; } } gameObject.input.hitFace = null; return false; }; var OnPointerDown = function (pointer, localX, localY, event) { var face = this.input.hitFace; this.emit('face.pointerdown', face, pointer, localX, localY, event); }; var OnPointerUp = function (pointer, localX, localY, event) { var face = this.input.hitFace; this.emit('face.pointerup', face, pointer, localX, localY, event); this.input.hitFace = null; }; var OnPointerMove = function (pointer, localX, localY, event) { var face = this.input.hitFace; var prevFace = this.input.prevHitFace; if (face === prevFace) { this.emit('face.pointermove', face, pointer, localX, localY, event); return } if (prevFace) { this.emit('face.pointerout', prevFace, pointer, event); } if (face) { this.emit('face.pointerover', face, pointer, event); } this.input.prevHitFace = face; }; var OnPointerOut = function (pointer, event) { var face = this.input.prevHitFace; if (face) { this.emit('face.pointerout', face, pointer, event); } this.input.hitFace = null; this.input.prevHitFace = null; }; var SetFaceInteractive = function (config) { if (this.input) { return; } if (config === undefined) { config = {}; } config.hitArea = {}; config.hitAreaCallback = Contains; this .setInteractive(config) .on('pointerdown', OnPointerDown, this) .on('pointerup', OnPointerUp, this) .on('pointermove', OnPointerMove, this) .on('pointerover', OnPointerMove, this) .on('pointerout', OnPointerOut, this); return this; }; var Methods$2 = { setFaceInteractive: SetFaceInteractive }; Object.assign( Methods$2, VertexMethods, DirtyFlagsMethods, UpdateMethods, TintMethods, DebugMethods, PointMethods, ); const ShaderSourceFS = Phaser.Renderer.WebGL.Shaders.MultiFrag; const ShaderSourceVS = Phaser.Renderer.WebGL.Shaders.MultiVert; const ShaderAdditionMakers = Phaser.Renderer.WebGL.ShaderAdditionMakers; const MakeApplyTint = ShaderAdditionMakers.MakeApplyTint; const MakeDefineTexCount = ShaderAdditionMakers.MakeDefineTexCount; const MakeGetTexCoordOut = ShaderAdditionMakers.MakeGetTexCoordOut; const MakeGetTexRes = ShaderAdditionMakers.MakeGetTexRes; const MakeSmoothPixelArt = ShaderAdditionMakers.MakeSmoothPixelArt; const MakeGetTexture = ShaderAdditionMakers.MakeGetTexture; const Utils = Phaser.Renderer.WebGL.Utils; const BatchHandlerQuad = Phaser.Renderer.WebGL.RenderNodes.BatchHandlerQuad; const getTint = Utils.getTintAppendFloatAlpha; class BatchHandlerTriangles extends BatchHandlerQuad { constructor(manager, config) { super(manager, config); // We do not expect to use extra textures. this.renderOptions.multiTexturing = true; } _generateElementIndices(instances) { // Independent Triangles var buffer = new ArrayBuffer(instances * 5 * 2); var indices = new Uint16Array(buffer); // 0,0,1,2,2,3,3,4,5,5,6,6,7,8,8,.... var offset = 0; for (var i = 0; i < instances; i++) { var index = i * 3; indices[offset++] = index; // Duplicate indices[offset++] = index; indices[offset++] = index + 1; indices[offset++] = index + 2; indices[offset++] = index + 2; // Duplicate } return buffer; } batchTriangles( drawingContext, src, calcMatrix, glTexture, vertices, uv, colors, alphas, alpha, tintFill, renderOptions, debugCallback ) { if (this.instanceCount === 0) { this.manager.setCurrentBatchNode(this, drawingContext); } var submittedInstanceCount = vertices.length / (2 * this.verticesPerInstance); if (submittedInstanceCount > this.instancesPerBatch) { throw new Error('rexBatchHandlerTriangle: Vertex count exceeds maximum per batch (' + this.maxVerticesPerBatch + ')'); } // Check whether the batch should be rendered immediately. // This guarantees that none of the arrays are full below. if (this.instanceCount + submittedInstanceCount > this.instancesPerBatch) { this.run(drawingContext); // Now the batch is empty. } // Check render options and run the batch if they differ. this.updateRenderOptions(renderOptions); if (this._renderOptionsChanged) { this.run(drawingContext); this.updateShaderConfig(); } // Process textures and get relevant data. var textureDatum = this.batchTextures(glTexture); // Update the vertex buffer. var vertexOffset32 = this.instanceCount * this.floatsPerInstance; var vertexBuffer = this.vertexBufferLayout.buffer; var vertexViewF32 = vertexBuffer.viewF32; var vertexViewU32 = vertexBuffer.viewU32; var debugVertices; if (debugCallback) { debugVertices = []; } var a = calcMatrix.a; var b = calcMatrix.b; var c = calcMatrix.c; var d = calcMatrix.d; var e = calcMatrix.e; var f = calcMatrix.f; var displayOffsetX = -src.displayOriginX; var displayOffsetY = -src.displayOriginY; var meshVerticesLength = vertices.length; for (var i = 0; i < meshVerticesLength; i += 6) { for (var j = 0; j < 3; j++) { var vertexIndex = i + j * 2; var x = vertices[vertexIndex]; var y = vertices[vertexIndex + 1]; x += displayOffsetX; y += displayOffsetY; var tx = x * a + y * c + e; var ty = x * b + y * d + f; var tintIndex = (i / 2) + j; var tint = getTint( colors[tintIndex], alphas[tintIndex] * alpha ); vertexViewF32[vertexOffset32++] = tx; vertexViewF32[vertexOffset32++] = ty; vertexViewF32[vertexOffset32++] = uv[vertexIndex]; vertexViewF32[vertexOffset32++] = uv[vertexIndex + 1]; vertexViewF32[vertexOffset32++] = textureDatum; vertexViewF32[vertexOffset32++] = tintFill; vertexViewU32[vertexOffset32++] = tint; if (debugVertices) { debugVertices.push(tx, ty); } } this.instanceCount++; this.currentBatchEntry.count++; } if (debugCallback) { debugCallback.call(src, src, meshVerticesLength, debugVertices); } } } BatchHandlerTriangles.prototype.defaultConfig = { name: 'rexBatchHandlerTriangle', verticesPerInstance: 3, indicesPerInstance: 5, shaderName: 'REXTRI', vertexSource: ShaderSourceVS, fragmentSource: ShaderSourceFS, shaderAdditions: [ MakeGetTexCoordOut(), MakeGetTexRes(true), MakeSmoothPixelArt(true), MakeDefineTexCount(1), MakeGetTexture(), MakeApplyTint() ], vertexBufferLayout: { usage: 'DYNAMIC_DRAW', layout: [ { name: 'inPosition', size: 2 }, { name: 'inTexCoord', size: 2 }, { name: 'inTexDatum' }, { name: 'inTintEffect' }, { name: 'inTint', size: 4, type: 'UNSIGNED_BYTE', normalized: true } ] } }; const GameClass = Phaser.Game; var IsGame = function (object) { return (object instanceof GameClass); }; const SceneClass = Phaser.Scene; var IsSceneObject = function (object) { return (object instanceof SceneClass); }; var GetGame = function (object) { if ((object == null) || (typeof (object) !== 'object')) { return null; } else if (IsGame(object)) { return object; } else if (IsGame(object.game)) { return object.game; } else if (IsSceneObject(object)) { // object = scene object return object.sys.game; } else if (IsSceneObject(object.scene)) { // object = game object return object.scene.sys.game; } }; var AddNodeConstructor = function (game, name, constructor) { var renderNodes = GetGame(game).renderer.renderNodes; if (!renderNodes.hasNode(name, true)) { renderNodes.addNodeConstructor(name, constructor); } }; const DefaultMeshNodes = new Phaser.Structs.Map([ ['BatchHandler', 'rexBatchHandlerTriangles'] ]); class Image extends Image$1 { constructor(scene, x, y, texture, frame) { if (x === undefined) { x = 0; } if (y === undefined) { y = 0; } if (texture === undefined) { texture = '__DEFAULT'; } super(scene, 'rexMeshImage'); this.dirtyFlags = 0; // Each face has 3 vertics, each vertex has x,y, u,v, alpha, color members this.vertices = []; this.faces = []; // Buffers this.vertexBuffer = null; this.uvBuffer = null; this.alphaBuffer = null; this.colorBuffer = null; this.tintFill = false; this.debugCallback = null; this.debugGraphic = null; this.setTexture(texture, frame); this.setPosition(x, y); this.setSizeToFrame(); this.setOriginFromFrame(); AddNodeConstructor(scene, 'rexBatchHandlerTriangles', BatchHandlerTriangles); this.initRenderNodes(this._defaultRenderNodesMap); } get _defaultRenderNodesMap() { return DefaultMeshNodes; } get dirty() { return this.dirtyFlags !== 0; } get frame() { return this._frame; } set frame(value) { if (this._frame === value) { return; } this._frame = value; var faces = this.faces; if (!faces) { return; } var frameU0 = (value) ? value.u0 : 0; var frameV0 = (value) ? value.v0 : 0; var frameU1 = (value) ? value.u1 : 0; var frameV1 = (value) ? value.v1 : 0; var frameWidth = (value) ? value.cutWidth : 0; var frameHeight = (value) ? value.cutHeight : 0; var isSizeChanged = (this._frameWidthSave !== frameWidth) || (this._frameHeightSave !== frameHeight); this._frameWidthSave = frameWidth; this._frameHeightSave = frameHeight; for (var i = 0, cnt = faces.length; i < cnt; i++) { var face = faces[i]; face.setFrameUV(frameU0, frameV0, frameU1, frameV1); if (isSizeChanged) { face.setFrameSize(frameWidth, frameHeight); } } } get tint() { if (this.faces.length > 0) { return this.faces[0].color; } else { return 0xffffff; } } set tint(value) { var faces = this.faces; for (var i = 0, cnt = faces.length; i < cnt; i++) { faces[i].setColor(value); } } // Overrides Game Object method addedToScene() { this.scene.sys.updateList.add(this); } // Overrides Game Object method removedFromScene() { this.scene.sys.updateList.remove(this); } } Object.assign( Image.prototype, Render, Methods$2 ); var AnmiationMethods = { play(key, ignoreIfPlaying) { return this.anims.play(key, ignoreIfPlaying); }, playReverse(key, ignoreIfPlaying) { return this.anims.playReverse(key, ignoreIfPlaying); }, playAfterDelay(key, delay) { return this.anims.playAfterDelay(key, delay); }, playAfterRepeat(key, repeatCount) { return this.anims.playAfterRepeat(key, repeatCount); }, chain(key) { return this.anims.chain(key); }, stop() { return this.anims.stop(); }, stopAfterDelay(delay) { return this.anims.stopAfterDelay(delay); }, stopAfterRepeat(repeatCount) { return this.anims.stopAfterRepeat(repeatCount); }, stopOnFrame(frame) { return this.anims.stopOnFrame(frame); }, }; var Methods$1 = {}; Object.assign( Methods$1, AnmiationMethods, ); const AnimationState = Phaser.Animations.AnimationState; class Sprite extends Image { constructor(scene, x, y, texture, frame) { super(scene, x, y, texture, frame); this.type = 'rexMeshSprite'; this.anims = new AnimationState(this); } preUpdate(time, delta) { this.anims.update(time, delta); } preDestroy() { this.anims.destroy(); this.anims = undefined; } } Object.assign( Sprite.prototype, Methods$1, ); var ConfigurationMethods = { setTriangleCount(triangleCount) { // Even number this.triangleCount = triangleCount; return this; }, }; var ResetImage = function () { this .clear() .addGridFaces(1, 1); return this }; function getDefaultExportFromCjs (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } var delaunay = {exports: {}}; (function (module) { // https://github.com/darkskyapp/delaunay-fast/blob/master/delaunay.js var Delaunay; (function() { var EPSILON = 1.0 / 1048576.0; function supertriangle(vertices) { var xmin = Number.POSITIVE_INFINITY, ymin = Number.POSITIVE_INFINITY, xmax = Number.NEGATIVE_INFINITY, ymax = Number.NEGATIVE_INFINITY, i, dx, dy, dmax, xmid, ymid; for(i = vertices.length; i--; ) { if(vertices[i][0] < xmin) xmin = vertices[i][0]; if(vertices[i][0] > xmax) xmax = vertices[i][0]; if(vertices[i][1] < ymin) ymin = vertices[i][1]; if(vertices[i][1] > ymax) ymax = vertices[i][1]; } dx = xmax - xmin; dy = ymax - ymin; dmax = Math.max(dx, dy); xmid = xmin + dx * 0.5; ymid = ymin + dy * 0.5; return [