phaser3-rex-plugins
Version:
1,727 lines (1,403 loc) • 110 kB
JavaScript
(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.rexcheckbox = 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 = {
setBoxFillStyle(color, alpha) {
if (alpha === undefined) {
alpha = 1;
}
this.dirty = this.dirty ||
(this.boxFillColor !== color) ||
(this.boxFillAlpha !== alpha);
this.boxFillColor = color;
this.boxFillAlpha = alpha;
return this;
},
setUncheckedBoxFillStyle(color, alpha) {
if (alpha === undefined) {
alpha = 1;
}
this.dirty = this.dirty ||
(this.uncheckedBoxFillColor !== color) ||
(this.uncheckedBoxFillAlpha !== alpha);
this.uncheckedBoxFillColor = color;
this.uncheckedBoxFillAlpha = alpha;
return this;
},
setBoxStrokeStyle(lineWidth, color, alpha) {
if (alpha === undefined) {
alpha = 1;
}
this.dirty = this.dirty ||
(this.boxLineWidth !== lineWidth) ||
(this.boxStrokeColor !== color) ||
(this.boxStrokeAlpha !== alpha);
this.boxLineWidth = lineWidth;
this.boxStrokeColor = color;
this.boxStrokeAlpha = alpha;
return this;
},
setUncheckedBoxStrokeStyle(lineWidth, color, alpha) {
if (alpha === undefined) {
alpha = 1;
}
this.dirty = this.dirty ||
(this.uncheckedBoxLineWidth !== lineWidth) ||
(this.uncheckedBoxStrokeColor !== color) ||
(this.uncheckedBoxStrokeAlpha !== alpha);
this.uncheckedBoxLineWidth = lineWidth;
this.uncheckedBoxStrokeColor = color;
this.uncheckedBoxStrokeAlpha = alpha;
return this;
},
setCheckerStyle(color, alpha) {
if (alpha === undefined) {
alpha = 1;
}
this.dirty = this.dirty ||
(this.checkerColor !== color) ||
(this.checkAlpha !== alpha);
this.checkerColor = color;
this.checkAlpha = alpha;
return this;
},
setBoxShape(isCircleShape) {
if (isCircleShape === undefined) {
isCircleShape = false;
}
if (this.isCircleShape === isCircleShape) {
return this;
}
this.isCircleShape = isCircleShape;
this.isSizeChanged = true;
this.dirty = true;
return this;
}
};
var SizeMethods = {
setBoxSize(size) {
this.dirty = this.dirty ||
(this.boxSize !== size);
this.boxSize = size;
return this;
},
setCheckerSize(size) {
this.dirty = this.dirty ||
(this.checkerSize !== size);
this.checkerSize = size;
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$1 = 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$1(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.pa