UNPKG

phaser3-rex-plugins

Version:
1,737 lines (1,408 loc) 111 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.rextoggleswitchplugin = factory()); })(this, (function () { 'use strict'; const GetCalcMatrix = Phaser.GameObjects.GetCalcMatrix; var WebGLRenderer = function (renderer, src, camera, parentMatrix) { src.updateData(); camera.addToRenderList(src); var pipeline = renderer.pipelines.set(src.pipeline); var result = GetCalcMatrix(src, camera, parentMatrix); var calcMatrix = pipeline.calcMatrix.copyFrom(result.calc); var dx = src._displayOriginX; var dy = src._displayOriginY; var alpha = camera.alpha * src.alpha; renderer.pipelines.preBatch(src); var shapes = src.geom, shape; for (var i = 0, cnt = shapes.length; i < cnt; i++) { shape = shapes[i]; if (shape.visible) { shape.webglRender(pipeline, calcMatrix, alpha, dx, dy); } } renderer.pipelines.postBatch(src); }; const SetTransform = Phaser.Renderer.Canvas.SetTransform; var CanvasRenderer = function (renderer, src, camera, parentMatrix) { src.updateData(); camera.addToRenderList(src); var ctx = renderer.currentContext; if (SetTransform(renderer, ctx, src, camera, parentMatrix)) { var dx = src._displayOriginX; var dy = src._displayOriginY; var shapes = src.geom, shape; for (var i = 0, cnt = shapes.length; i < cnt; i++) { shape = shapes[i]; if (shape.visible) { shape.canvasRender(ctx, dx, dy); } } // Restore the context saved in SetTransform ctx.restore(); } }; var Render = { renderWebGL: WebGLRenderer, renderCanvas: CanvasRenderer }; var Clear = function (obj) { if ((typeof (obj) !== 'object') || (obj === null)) { return obj; } if (Array.isArray(obj)) { obj.length = 0; } else { for (var key in obj) { delete obj[key]; } } return obj; }; const Shape = Phaser.GameObjects.Shape; const RemoveItem = Phaser.Utils.Array.Remove; class BaseShapes extends Shape { constructor(scene, x, y, width, height) { if (x === undefined) { x = 0; } if (y === undefined) { y = 0; } if (width === undefined) { width = 2; } if (height === undefined) { height = width; } super(scene, 'rexShapes', []); this._width = -1; this._height = -1; this.dirty = true; this.isSizeChanged = true; this.shapes = {}; this.setPosition(x, y); this.setSize(width, height); this.updateDisplayOrigin(); } get width() { return this._width; } set width(value) { this.setSize(value, this._height); } get height() { return this._height; } set height(value) { this.setSize(this._width, value); } setDirty(value) { if (value === undefined) { value = true; } this.dirty = value; return this; } setSize(width, height) { this.isSizeChanged = this.isSizeChanged || (this._width !== width) || (this._height !== height); this.dirty = this.dirty || this.isSizeChanged; this._width = width; this._height = height; this.updateDisplayOrigin(); var input = this.input; if (input && !input.customHitArea) { input.hitArea.width = width; input.hitArea.height = height; } return this; } resize(width, height) { this.setSize(width, height); return this; } get fillColor() { return this._fillColor; } set fillColor(value) { this.setFillStyle(value, this._fillAlpha); } get fillAlpha() { return this._fillAlpha; } set fillAlpha(value) { this.setFillStyle(this._fillColor, value); } setFillStyle(color, alpha) { if (alpha === undefined) { alpha = 1; } this.dirty = this.dirty || (this.fillColor !== color) || (this.fillAlpha !== alpha); this._fillColor = color; this._fillAlpha = alpha; return this; } get lineWidth() { return this._lineWidth; } set lineWidth(value) { this.setStrokeStyle(value, this._strokeColor, this._strokeAlpha); } get strokeColor() { return this._strokeColor; } set strokeColor(value) { this.setStrokeStyle(this._lineWidth, value, this._strokeAlpha); } get strokeAlpha() { return this._strokeAlpha; } set strokeAlpha(value) { this.setStrokeStyle(this._lineWidth, this._strokeColor, value); } setStrokeStyle(lineWidth, color, alpha) { if (alpha === undefined) { alpha = 1; } this.dirty = this.dirty || (this.lineWidth !== lineWidth) || (this.strokeColor !== color) || (this.strokeAlpha !== alpha); this._lineWidth = lineWidth; this._strokeColor = color; this._strokeAlpha = alpha; return this; } updateShapes() { } updateData() { if (!this.dirty) { return this; } this.updateShapes(); var shapes = this.geom; for (var i = 0, cnt = shapes.length; i < cnt; i++) { var shape = shapes[i]; if (shape.dirty) { shape.updateData(); } } this.isSizeChanged = false; this.dirty = false; return this; } clear() { this.geom.length = 0; Clear(this.shapes); this.dirty = true; return this; } getShape(name) { return this.shapes[name]; } getShapes() { return this.geom; } addShape(shape) { this.geom.push(shape); var name = shape.name; if (name) { this.shapes[name] = shape; } this.dirty = true; return this; } deleteShape(name) { var shape = this.getShape(name); if (shape) { delete this.shapes[name]; RemoveItem(this.geom, shape); } return this; } } Object.assign( BaseShapes.prototype, Render ); var StyleMethods$1 = { setTrackFillStyle(color, alpha) { if (alpha === undefined) { alpha = 1; } this.dirty = this.dirty || (this.trackFillColor !== color) || (this.trackFillAlpha !== alpha); this.trackFillColor = color; this.trackFillAlpha = alpha; return this; }, setFalseValueTrackFillStyle(color, alpha) { if (alpha === undefined) { alpha = 1; } this.dirty = this.dirty || (this.falseValueTrackColor !== color) || (this.uncheckedTrackFillAlpha !== alpha); this.falseValueTrackColor = color; this.falseValueTrackFillAlpha = alpha; return this; }, setThumbStyle(color, alpha) { if (alpha === undefined) { alpha = 1; } this.dirty = this.dirty || (this.thumbColor !== color) || (this.checkAlpha !== alpha); this.thumbColor = color; this.thumbAlpha = alpha; return this; }, }; var SizeMethods = { setTrackSize(width, height) { this.dirty = this.dirty || (this.trackWidth !== width) || (this.trackHeight !== height); this.trackWidth = width; this.trackHeight = height; return this; }, setTrackRadius(radius) { this.dirty = this.dirty || (this.trackRadius !== radius); this.trackRadius = radius; return this; }, setThumbSize(width, height) { if (height === undefined) { height = width; } this.dirty = this.dirty || (this.thumbWidth !== width) || (this.thumbHeight !== height); this.thumbWidth = width; this.thumbHeight = height; return this; }, setThumbRadius(radius) { this.dirty = this.dirty || (this.thumbRadius !== radius); this.thumbRadius = radius; return this; }, }; var PositionMethods = { setThumbPosition(left, right) { if (right === undefined) { right = 1 - left; } this.thumbLeftX = left; this.thumbRightX = right; return this; }, setRTL(rtl) { if (rtl === undefined) { rtl = true; } this.rtl = rtl; return this; } }; var FillStyle = function (color, alpha) { if (color == null) { this.isFilled = false; } else { if (alpha === undefined) { alpha = 1; } this.isFilled = true; this.fillColor = color; this.fillAlpha = alpha; } return this; }; var LineStyle = function (lineWidth, color, alpha) { if ((lineWidth == null) || (color == null)) { this.isStroked = false; } else { if (alpha === undefined) { alpha = 1; } this.isStroked = true; this.lineWidth = lineWidth; this.strokeColor = color; this.strokeAlpha = alpha; } return this; }; var StyleMethods = { fillStyle: FillStyle, lineStyle: LineStyle }; var GetValue$a = function (source, key, defaultValue, altSource) { var isValidSource = source && (typeof source === 'object' || typeof source === 'function'); var isValidAltSource = altSource && (typeof altSource === 'object' || typeof altSource === 'function'); if (!isValidSource && !isValidAltSource) { return defaultValue; } var keyPath = String(key); // Shortcut: // If obj[keyPath] can be read (including prototype chain), return it directly. // This also supports literal keys like "a.b". if (isValidSource && (keyPath in source)) { return source[keyPath]; } if (isValidAltSource && (keyPath in altSource)) { return altSource[keyPath]; } // If there is no dot, we already know it's missing. if (keyPath.indexOf('.') === -1) { return defaultValue; } var keys = keyPath.split('.'); // 1) Try source path first if (isValidSource) { var sourceResult = WalkPath(source, keys, defaultValue); if (sourceResult.found) { return sourceResult.value; } } // 2) Then try altSource path if (isValidAltSource) { var altSourceResult = WalkPath(altSource, keys, defaultValue); if (altSourceResult.found) { return altSourceResult.value; } } return defaultValue; }; var WalkPath = function (source, keys, defaultValue) { var parent = source; var value = defaultValue; var found; for (var index = 0, cnt = keys.length; index < cnt; index++) { var partKey = keys[index]; if (parent && (typeof parent === 'object' || typeof parent === 'function')) { found = (partKey in parent); } else { found = false; } if (!found) { WalkPathResult.found = false; return WalkPathResult; } value = parent[partKey]; parent = value; } WalkPathResult.found = true; WalkPathResult.value = value; return WalkPathResult; }; var WalkPathResult = {}; var DataMethods = { enableData() { if (this.data === undefined) { this.data = {}; } return this; }, setData(key, value) { this.enableData(); if (arguments.length === 1) { var data = key; for (key in data) { this.data[key] = data[key]; } } else { this.data[key] = value; } return this; }, getData(key, defaultValue) { this.enableData(); return (key === undefined) ? this.data : GetValue$a(this.data, key, defaultValue); }, incData(key, inc, defaultValue) { if (defaultValue === undefined) { defaultValue = 0; } this.enableData(); this.setData(key, this.getData(key, defaultValue) + inc); return this; }, mulData(key, mul, defaultValue) { if (defaultValue === undefined) { defaultValue = 0; } this.enableData(); this.setData(key, this.getData(key, defaultValue) * mul); return this; }, clearData() { if (this.data) { Clear(this.data); } return this; }, }; class BaseGeom { constructor() { this.name = undefined; this.dirty = true; this.visible = true; this.data = undefined; this.isFilled = false; this.fillColor = undefined; this.fillAlpha = 1; this.isStroked = false; this.lineWidth = 1; this.strokeColor = undefined; this.strokeAlpha = 1; } setName(name) { this.name = name; return this; } setVisible(visible) { if (visible === undefined) { visible = true; } this.visible = visible; return this; } reset() { this .setVisible() .fillStyle() .lineStyle(); return this; } webglRender(pipeline, calcMatrix, alpha, dx, dy) { } canvasRender(ctx, dx, dy) { } updateData() { this.dirty = false; } } Object.assign( BaseGeom.prototype, StyleMethods, DataMethods ); /* src: { fillColor, fillAlpha, pathData, pathIndexes // Earcut(pathData) } */ var Utils$1 = Phaser.Renderer.WebGL.Utils; var FillPathWebGL = function (pipeline, calcMatrix, src, alpha, dx, dy) { var fillTintColor = Utils$1.getTintAppendFloatAlpha(src.fillColor, src.fillAlpha * alpha); var path = src.pathData; var pathIndexes = src.pathIndexes; for (var i = 0; i < pathIndexes.length; i += 3) { var p0 = pathIndexes[i] * 2; var p1 = pathIndexes[i + 1] * 2; var p2 = pathIndexes[i + 2] * 2; var x0 = path[p0 + 0] - dx; var y0 = path[p0 + 1] - dy; var x1 = path[p1 + 0] - dx; var y1 = path[p1 + 1] - dy; var x2 = path[p2 + 0] - dx; var y2 = path[p2 + 1] - dy; var tx0 = calcMatrix.getX(x0, y0); var ty0 = calcMatrix.getY(x0, y0); var tx1 = calcMatrix.getX(x1, y1); var ty1 = calcMatrix.getY(x1, y1); var tx2 = calcMatrix.getX(x2, y2); var ty2 = calcMatrix.getY(x2, y2); pipeline.batchTri(src, tx0, ty0, tx1, ty1, tx2, ty2, 0, 0, 1, 1, fillTintColor, fillTintColor, fillTintColor, 2); } }; /* src: { strokeColor, strokeAlpha, pathData, lineWidth, closePath, isDashed, strokePathData, strokePathMask } */ var Utils = Phaser.Renderer.WebGL.Utils; var StrokePathWebGL = function (pipeline, src, alpha, dx, dy) { var strokeTint = pipeline.strokeTint; var strokeTintColor = Utils.getTintAppendFloatAlpha(src.strokeColor, src.strokeAlpha * alpha); strokeTint.TL = strokeTintColor; strokeTint.TR = strokeTintColor; strokeTint.BL = strokeTintColor; strokeTint.BR = strokeTintColor; var isDashed = src.isDashed && !!src.strokePathData; var path = (!isDashed) ? src.pathData : src.strokePathData; var pathLength = path.length - 1; var lineWidth = src.lineWidth; var halfLineWidth = lineWidth / 2; var px1 = path[0] - dx; var py1 = path[1] - dy; var px2, py2; if (!src.closePath) { pathLength -= 2; } if (!isDashed) { // Default behavior for (var i = 2; i < pathLength; i += 2) { px2 = path[i] - dx; py2 = path[i + 1] - dy; pipeline.batchLine( px1, py1, px2, py2, halfLineWidth, halfLineWidth, lineWidth, i - 2, (src.closePath) ? (i === pathLength - 1) : false ); px1 = px2; py1 = py2; } } else { // Draw dashed line var strokePathMask = src.strokePathMask; var drawMaskIdx = 0; var segLineIdx = 0; for (var i = 2; i < pathLength; i += 2) { px2 = path[i] - dx; py2 = path[i + 1] - dy; if (strokePathMask[drawMaskIdx]) { pipeline.batchLine( px1, py1, px2, py2, halfLineWidth, halfLineWidth, lineWidth, segLineIdx, false ); segLineIdx++; } else { segLineIdx = 0; } px1 = px2; py1 = py2; drawMaskIdx++; } } }; var FillStyleCanvas = function (ctx, src, altColor, altAlpha) { var fillColor = (altColor) ? altColor : src.fillColor; var fillAlpha = (altAlpha) ? altAlpha : src.fillAlpha; var red = ((fillColor & 0xFF0000) >>> 16); var green = ((fillColor & 0xFF00) >>> 8); var blue = (fillColor & 0xFF); ctx.fillStyle = 'rgba(' + red + ',' + green + ',' + blue + ',' + fillAlpha + ')'; }; /* src: { fillColor, fillAlpha, pathData, closePath } */ var FillPathCanvas = function (ctx, src, dx, dy) { var path = src.pathData; if (!path || (path.length < 4)) { return; } var pathLength = path.length - 1; var px1 = path[0] - dx; var py1 = path[1] - dy; ctx.beginPath(); ctx.moveTo(px1, py1); if (!src.closePath) { pathLength -= 2; } for (var i = 2; i < pathLength; i += 2) { var px2 = path[i] - dx; var py2 = path[i + 1] - dy; ctx.lineTo(px2, py2); } if (src.closePath) { ctx.closePath(); } FillStyleCanvas(ctx, src); ctx.fill(); }; var LineStyleCanvas = function (ctx, src, altColor, altAlpha) { var strokeColor = (altColor) ? altColor : src.strokeColor; var strokeAlpha = (altAlpha) ? altAlpha : src.strokeAlpha; var red = ((strokeColor & 0xFF0000) >>> 16); var green = ((strokeColor & 0xFF00) >>> 8); var blue = (strokeColor & 0xFF); ctx.strokeStyle = 'rgba(' + red + ',' + green + ',' + blue + ',' + strokeAlpha + ')'; ctx.lineWidth = src.lineWidth; }; /* src: { strokeColor, strokeAlpha, pathData, lineWidth, closePath, isDashed, strokePathData, strokePathMask } */ var StrokePathCanvas = function (ctx, src, dx, dy) { var isDashed = src.isDashed && !!src.strokePathData; var path = (!isDashed) ? src.pathData : src.strokePathData; if (!path || (path.length < 4)) { return; } var pathLength = path.length - 1; var px1 = path[0] - dx; var py1 = path[1] - dy; LineStyleCanvas(ctx, src); ctx.beginPath(); if (!src.closePath) { pathLength -= 2; } if (!isDashed) { // Default behavior ctx.moveTo(px1, py1); for (var i = 2; i < pathLength; i += 2) { var px2 = path[i] - dx; var py2 = path[i + 1] - dy; ctx.lineTo(px2, py2); } if (src.closePath) { ctx.closePath(); } } else { // Draw dashed line var strokePathMask = src.strokePathMask; var drawMaskIdx = 0; for (var i = 2; i < pathLength; i += 2) { var px2 = path[i] - dx; var py2 = path[i + 1] - dy; if (strokePathMask[drawMaskIdx]) { ctx.moveTo(px1, py1); ctx.lineTo(px2, py2); } px1 = px2; py1 = py2; drawMaskIdx++; } } ctx.stroke(); }; const EPSILON = 1e-6; const DEFAULT_SEGMENT_COUNT = 10; const DEFAULT_DRAW_RATIO = 0.5; var NormalizeDashArray = function (dashPattern) { if (!Array.isArray(dashPattern)) { return null; } var normalized = []; for (var i = 0, cnt = dashPattern.length; i < cnt; i++) { var d = Number(dashPattern[i]); if (isFinite(d) && (d > 0)) { normalized.push(d); } } return (normalized.length > 0) ? normalized : null; }; var BuildAutoDashPattern = function (dashPattern, totalPathLength) { var { segments = DEFAULT_SEGMENT_COUNT, drawRatio = DEFAULT_DRAW_RATIO } = dashPattern; segments = Math.round(segments); if (!isFinite(segments) || (segments <= 0)) { return null; } if (!(totalPathLength > EPSILON)) { return null; } var segmentLength = totalPathLength / segments; if (!(segmentLength > EPSILON)) { return null; } drawRatio = Math.max(0, Math.min(1, drawRatio)); if (drawRatio >= (1 - EPSILON)) { // 100% draw ratio becomes a solid stroke. return null; } var drawLength = segmentLength * drawRatio; if (drawLength <= EPSILON) { drawLength = EPSILON; } var gapLength = segmentLength - drawLength; if (gapLength <= EPSILON) { return null; } return [drawLength, gapLength]; }; var NormalizeDashPattern = function (dashPattern, totalPathLength) { return NormalizeDashArray(dashPattern) || BuildAutoDashPattern(dashPattern, totalPathLength); }; var WrapOffset = function (offset, totalLength) { if (!isFinite(offset)) { offset = 0; } offset = offset % totalLength; if (offset < 0) { offset += totalLength; } return offset; }; var ForEachStrokeSegment = function (pathData, closePath, callback) { if ((!pathData) || (pathData.length < 4)) { return; } var pathLength = pathData.length - 1; if (!closePath) { pathLength -= 2; } if (pathLength < 2) { return; } var px1 = pathData[0]; var py1 = pathData[1]; for (var i = 2; i < pathLength; i += 2) { var px2 = pathData[i]; var py2 = pathData[i + 1]; callback(px1, py1, px2, py2); px1 = px2; py1 = py2; } }; var GetTotalPathLength = function (pathData, closePath) { var totalLength = 0; ForEachStrokeSegment(pathData, closePath, function (x0, y0, x1, y1) { var dx = x1 - x0; var dy = y1 - y0; totalLength += Math.sqrt((dx * dx) + (dy * dy)); }); return totalLength; }; var BuildDashStroke = function (pathData, config, out) { if (config === undefined) { config = {}; } if (out === undefined) { out = {}; } var { closePath = false, dashPattern, dashOffset = 0, } = config; var totalPathLength = GetTotalPathLength(pathData, closePath); dashPattern = NormalizeDashPattern(dashPattern, totalPathLength); // No valid dash pattern -> keep original stroke path, disable mask. if (dashPattern === null) { return null; } var strokePathData = []; var strokePathMask = []; var totalPatternLength = 0; for (var i = 0, cnt = dashPattern.length; i < cnt; i++) { totalPatternLength += dashPattern[i]; } if (totalPatternLength <= EPSILON) { out.strokePathData = (pathData) ? pathData.slice() : []; out.strokePathMask = undefined; return out; } var patternIndex = 0; var draw = true; // Pattern starts from a draw segment. var patternRemain = dashPattern[patternIndex]; var AdvancePattern = function () { patternIndex = (patternIndex + 1) % dashPattern.length; draw = !draw; patternRemain = dashPattern[patternIndex]; }; var offset = WrapOffset(dashOffset, totalPatternLength); while (offset > EPSILON) { if (offset < (patternRemain - EPSILON)) { patternRemain -= offset; offset = 0; } else { offset -= patternRemain; AdvancePattern(); } } var PushSegment = function (x0, y0, x1, y1, drawState) { if (strokePathData.length === 0) { strokePathData.push(x0, y0); } else { var lastX = strokePathData[strokePathData.length - 2]; var lastY = strokePathData[strokePathData.length - 1]; if ((lastX !== x0) || (lastY !== y0)) { strokePathData.push(x0, y0); } } strokePathData.push(x1, y1); strokePathMask.push(drawState ? 1 : 0); }; ForEachStrokeSegment(pathData, closePath, function (x0, y0, x1, y1) { var dx = x1 - x0; var dy = y1 - y0; var segLength = Math.sqrt((dx * dx) + (dy * dy)); if (segLength <= EPSILON) { return; } var traveled = 0; while (traveled < (segLength - EPSILON)) { var step = Math.min(patternRemain, segLength - traveled); if (step <= EPSILON) { AdvancePattern(); continue; } var t0 = traveled / segLength; var t1 = (traveled + step) / segLength; var sx = x0 + (dx * t0); var sy = y0 + (dy * t0); var ex = x0 + (dx * t1); var ey = y0 + (dy * t1); PushSegment(sx, sy, ex, ey, draw); traveled += step; patternRemain -= step; if (patternRemain <= EPSILON) { AdvancePattern(); } } }); // Keep the existing open-path convention in StrokePathWebGL: // an extra tail point is ignored by the renderer when closePath=false. if (!closePath && (strokePathData.length >= 2)) { strokePathData.push( strokePathData[strokePathData.length - 2], strokePathData[strokePathData.length - 1] ); } out.strokePathData = strokePathData; out.strokePathMask = strokePathMask; return out; }; var SetDashPattern = function (dashPattern, dashOffset) { // dashPattern: [draw, gap] , or {segments, drawRatio} this.dashPattern = dashPattern; this.dashOffset = dashOffset || 0; this.isDashed = !!dashPattern; return this; }; var ClearDashPattern = function () { this.setDashPattern(); return this; }; var SetDashed = function (enable) { if (enable === undefined) { enable = true; } this.isDashed = enable; return this; }; var BuildStrokePath = function () { if (this.isDashed) { var result = BuildDashStroke(this.pathData, { closePath: this.closePath, dashPattern: this.dashPattern, dashOffset: this.dashOffset }, this); if (result) { this.strokePathData = result.strokePathData; this.strokePathMask = result.strokePathMask; } else { this.isDashed = false; } } return this; }; var StrokePathConfigMethods = { setDashPattern: SetDashPattern, clearDashPattern: ClearDashPattern, setDashed: SetDashed }; var Methods = { buildStrokePath: BuildStrokePath }; Object.assign( Methods, StrokePathConfigMethods, ); const Earcut$1 = Phaser.Geom.Polygon.Earcut; class PathBase extends BaseGeom { constructor() { super(); this.pathData = []; this.isDashed = false; this.strokePathData = undefined; this.strokePathMask = undefined; this.dashPattern = undefined; this.dashOffset = 0; this.pathIndexes = []; this.closePath = false; } updateData() { this.pathIndexes = Earcut$1(this.pathData); super.updateData(); this.buildStrokePath(); return this; } webglRender(pipeline, calcMatrix, alpha, dx, dy) { if (this.isFilled) { FillPathWebGL(pipeline, calcMatrix, this, alpha, dx, dy); } if (this.isStroked) { StrokePathWebGL(pipeline, this, alpha, dx, dy); } } canvasRender(ctx, dx, dy) { if (this.isFilled) { FillPathCanvas(ctx, this, dx, dy); } if (this.isStroked) { StrokePathCanvas(ctx, this, dx, dy); } } } Object.assign( PathBase.prototype, Methods, ); var LineTo = function (x, y, pathData) { var cnt = pathData.length; if (cnt >= 2) { var lastX = pathData[cnt - 2]; var lastY = pathData[cnt - 1]; if ((x === lastX) && (y === lastY)) { return pathData; } } pathData.push(x, y); return pathData; }; const DegToRad$1 = Phaser.Math.DegToRad; var ArcTo = function (centerX, centerY, radiusX, radiusY, startAngle, endAngle, antiClockWise, iteration, pathData) { // startAngle, endAngle: 0 ~ 360 if (antiClockWise && (endAngle > startAngle)) { endAngle -= 360; } else if (!antiClockWise && (endAngle < startAngle)) { endAngle += 360; } var deltaAngle = endAngle - startAngle; var step = DegToRad$1(deltaAngle) / iteration; startAngle = DegToRad$1(startAngle); for (var i = 0; i <= iteration; i++) { var angle = startAngle + (step * i); var x = centerX + (radiusX * Math.cos(angle)); var y = centerY + (radiusY * Math.sin(angle)); LineTo(x, y, pathData); } return pathData; }; Phaser.Math.DegToRad; var StartAt = function (x, y, pathData) { pathData.length = 0; if (x != null) { pathData.push(x, y); } return pathData; }; //import QuadraticBezierInterpolation from '../../utils/math/interpolation/QuadraticBezierInterpolation.js'; const QuadraticBezierInterpolation = Phaser.Math.Interpolation.QuadraticBezier; var QuadraticBezierTo = function (cx, cy, x, y, iterations, pathData) { var pathDataCnt = pathData.length; var p0x = pathData[pathDataCnt - 2]; var p0y = pathData[pathDataCnt - 1]; for (var i = 1, last = iterations - 1; i <= last; i++) { var t = i / last; pathData.push( QuadraticBezierInterpolation(t, p0x, cx, x), QuadraticBezierInterpolation(t, p0y, cy, y) ); } return pathData; }; // import CubicBezierInterpolation from '../../utils/math/interpolation/CubicBezierInterpolation.js'; const CubicBezierInterpolation = Phaser.Math.Interpolation.CubicBezier; var CubicBezierCurveTo = function (cx0, cy0, cx1, cy1, x, y, iterations, pathData) { var pathDataCnt = pathData.length; var p0x = pathData[pathDataCnt - 2]; var p0y = pathData[pathDataCnt - 1]; for (var i = 1, last = iterations - 1; i <= last; i++) { var t = i / last; pathData.push( CubicBezierInterpolation(t, p0x, cx0, cx1, x), CubicBezierInterpolation(t, p0y, cy0, cy1, y) ); } return pathData; }; //import CatmullRomInterpolation from '../../utils/math/interpolation/CatmullRomInterpolation.js'; const CatmullRomInterpolation = Phaser.Math.Interpolation.CatmullRom; var CatmullRomTo = function (points, iterations, pathData) { var pathDataCnt = pathData.length; var p0x = pathData[pathDataCnt - 2]; var p0y = pathData[pathDataCnt - 1]; var xList = [p0x]; var yList = [p0y]; for (var i = 0, cnt = points.length; i < cnt; i += 2) { xList.push(points[i]); yList.push(points[i + 1]); } for (var i = 1, last = iterations - 1; i <= last; i++) { var t = i / last; pathData.push( CatmullRomInterpolation(xList, t), CatmullRomInterpolation(yList, t) ); } return pathData; }; var DuplicateLast = function (pathData) { var len = pathData.length; if (len < 2) { return pathData; } var lastX = pathData[len - 2]; var lastY = pathData[len - 1]; pathData.push(lastX); pathData.push(lastY); return pathData; }; var AddPathMethods = { clear() { this.start(); return this; }, start() { this.startAt(); return this; }, startAt(x, y) { this.restorePathData(); this.accumulationLengths = undefined; StartAt(x, y, this.pathData); this.firstPointX = x; this.firstPointY = y; this.lastPointX = x; this.lastPointY = y; return this; }, lineTo(x, y, relative) { if (relative === undefined) { relative = false; } if (relative) { x += this.lastPointX; y += this.lastPointY; } LineTo(x, y, this.pathData); this.lastPointX = x; this.lastPointY = y; return this; }, verticalLineTo(x, relative) { this.lineTo(x, this.lastPointY, relative); return this; }, horizontalLineTo(y, relative) { this.lineTo(this.lastPointX, y, relative); return this; }, ellipticalArc(centerX, centerY, radiusX, radiusY, startAngle, endAngle, anticlockwise) { if (anticlockwise === undefined) { anticlockwise = false; } ArcTo( centerX, centerY, radiusX, radiusY, startAngle, endAngle, anticlockwise, this.iterations, this.pathData ); this.lastPointX = this.pathData[this.pathData.length - 2]; this.lastPointY = this.pathData[this.pathData.length - 1]; return this; }, arc(centerX, centerY, radius, startAngle, endAngle, anticlockwise) { this.ellipticalArc(centerX, centerY, radius, radius, startAngle, endAngle, anticlockwise); return this; }, quadraticBezierTo(cx, cy, x, y) { QuadraticBezierTo( cx, cy, x, y, this.iterations, this.pathData ); this.lastPointX = x; this.lastPointY = y; return this; }, cubicBezierTo(cx0, cy0, cx1, cy1, x, y) { CubicBezierCurveTo( cx0, cy0, cx1, cy1, x, y, this.iterations, this.pathData ); this.lastPointX = x; this.lastPointY = y; return this; }, catmullRomTo(...points) { CatmullRomTo( points, this.iterations, this.pathData ); this.lastPointX = points[points.length-2]; this.lastPointY = points[points.length-1]; return this; }, close() { // Line to first point var startX = this.pathData[0], startY = this.pathData[1]; if ((startX !== this.lastPointX) || (startY !== this.lastPointY)) { this.lineTo(startX, startY); } this.closePath = true; return this; }, end() { DuplicateLast(this.pathData); return this; }, }; //import PointRotateAround from '../../utils/math/RotateAround.js'; const PointRotateAround = Phaser.Math.RotateAround; var RotateAround = function (centerX, centerY, angle, pathData) { var point = { x: 0, y: 0 }; for (var i = 0, cnt = pathData.length - 1; i < cnt; i += 2) { point.x = pathData[i]; point.y = pathData[i + 1]; PointRotateAround(point, centerX, centerY, angle); pathData[i] = point.x; pathData[i + 1] = point.y; } return pathData; }; var Scale = function (centerX, centerY, scaleX, scaleY, pathData) { for (var i = 0, cnt = pathData.length - 1; i < cnt; i += 2) { var x = pathData[i] - centerX; var y = pathData[i + 1] - centerY; x *= scaleX; y *= scaleY; pathData[i] = x + centerX; pathData[i + 1] = y + centerY; } return pathData; }; var Offset = function (x, y, pathData) { for (var i = 0, cnt = pathData.length - 1; i < cnt; i += 2) { pathData[i] += x; pathData[i + 1] += y; } return pathData; }; const DegToRad = Phaser.Math.DegToRad; Phaser.Math.RotateAround; var TransformPointsMethods = { rotateAround(centerX, centerY, angle) { if (this.pathData.length === 0) { return this; } angle = DegToRad(angle); RotateAround(centerX, centerY, angle, this.pathData); var pathDataCnt = this.pathData.length; this.lastPointX = this.pathData[pathDataCnt - 2]; this.lastPointY = this.pathData[pathDataCnt - 1]; return this; }, scale(centerX, centerY, scaleX, scaleY) { if (this.pathData.length === 0) { return this; } Scale(centerX, centerY, scaleX, scaleY, this.pathData); this.lastPointX = this.pathData[pathDataCnt - 2]; this.lastPointY = this.pathData[pathDataCnt - 1]; return this; }, offset(x, y) { Offset(x, y, this.pathData); return this; } }; var Copy = function (dest, src, startIdx, endIdx) { if (startIdx === undefined) { startIdx = 0; } if (endIdx === undefined) { endIdx = src.length; } dest.length = endIdx - startIdx; for (var i = 0, len = dest.length; i < len; i++) { dest[i] = src[i + startIdx]; } return dest; }; var SavePathDataMethods = { savePathData() { if (this.pathDataSaved) { return this; } this.pathDataSave = [...this.pathData]; this.pathData.length = 0; this.pathDataSaved = true; return this; }, restorePathData() { if (!this.pathDataSaved) { return this; } Copy(this.pathData, this.pathDataSave); this.pathDataSave = undefined; this.pathDataSaved = false; return this; }, }; const DistanceBetween = Phaser.Math.Distance.Between; const Wrap = Phaser.Math.Wrap; const Linear$3 = Phaser.Math.Linear; var AppendFromPathSegment = function (srcPathData, accumulationLengths, startT, endT, destPathData) { if (endT === undefined) { endT = startT; startT = 0; } startT = WrapT(startT); endT = WrapT(endT); if (startT === endT) { return; } var totalPathLength = accumulationLengths[accumulationLengths.length - 1]; var startL = totalPathLength * startT; var endL = totalPathLength * endT; if (startT < endT) { AddPathSegment(srcPathData, accumulationLengths, startL, endL, destPathData); } else { AddPathSegment(srcPathData, accumulationLengths, startL, totalPathLength, destPathData); AddPathSegment(srcPathData, accumulationLengths, 0, endL, destPathData); } DuplicateLast(destPathData); }; var AddPathSegment = function (srcPathData, accumulationLengths, startL, endL, destPathData) { var skipState = (startL > 0); for (var i = 0, cnt = accumulationLengths.length; i < cnt; i++) { var pIdx = i * 2; var d = accumulationLengths[i]; if (skipState) { if (d < startL) { continue; } else if (d == startL) { skipState = false; } else { // d > startL var deltaD = d - accumulationLengths[i - 1]; var t = 1 - ((d - startL) / deltaD); destPathData.push(GetInterpolation(srcPathData, pIdx - 2, pIdx, t)); destPathData.push(GetInterpolation(srcPathData, pIdx - 1, pIdx + 1, t)); skipState = false; } } if (d <= endL) { destPathData.push(srcPathData[pIdx]); destPathData.push(srcPathData[pIdx + 1]); if (d === endL) { break; } } else { // d > endL var deltaD = d - accumulationLengths[i - 1]; var t = 1 - ((d - endL) / deltaD); destPathData.push(GetInterpolation(srcPathData, pIdx - 2, pIdx, t)); destPathData.push(GetInterpolation(srcPathData, pIdx - 1, pIdx + 1, t)); break; } } }; var GetInterpolation = function (pathData, i0, i1, t) { var p0 = pathData[i0], p1 = pathData[i1]; return Linear$3(p0, p1, t); }; var WrapT = function (t) { if (t === 0) { return 0; } else if ((t % 1) === 0) { return 1; } return Wrap(t, 0, 1); }; var PathSegmentMethods = { updateAccumulationLengths() { if (this.accumulationLengths == null) { this.accumulationLengths = []; } else if (this.accumulationLengths.length === (this.pathData.length / 2)) { return this; } var accumulationLengths = this.accumulationLengths; var pathData = this.pathData; var prevX, prevY, x, y; var d, accumulationLength = 0; for (var i = 0, cnt = pathData.length; i < cnt; i += 2) { x = pathData[i]; y = pathData[i + 1]; d = (prevX === undefined) ? 0 : DistanceBetween(prevX, prevY, x, y); accumulationLength += d; accumulationLengths.push(accumulationLength); prevX = x; prevY = y; } this.totalPathLength = accumulationLength; return this; }, setDisplayPathSegment(startT, endT) { if (!this.pathDataSaved) { this.updateAccumulationLengths(); this.savePathData(); } this.pathData.length = 0; AppendFromPathSegment(this.pathDataSave, this.accumulationLengths, startT, endT, this.pathData); return this; }, appendFromPathSegment(src, startT, endT) { if (startT === undefined) { this.pathData.push(...src.pathData); } else { src.updateAccumulationLengths(); AppendFromPathSegment(src.pathData, src.accumulationLengths, startT, endT, this.pathData); } this.firstPointX = this.pathData[0]; this.firstPointY = this.pathData[1]; this.lastPointX = this.pathData[this.pathData.length - 2]; this.lastPointY = this.pathData[this.pathData.length - 1]; return this; }, }; var GraphicsMethods = { draw(graphics, isFill, isStroke) { var points = this.toPoints();