微信小程序-省心预览工具
This commit is contained in:
commit
edf1e51846
173 files changed
+78282
No files matched your search
+347
@@ -0,0 +1,347 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes License Agreement
|
||||
* Last updated April 5, 2025. Replaces all prior versions.
|
||||
*
|
||||
* Copyright (c) 2013-2025, Esoteric Software LLC
|
||||
*
|
||||
* Integration of the Spine Runtimes into software or otherwise creating
|
||||
* derivative works of the Spine Runtimes is permitted under the terms and
|
||||
* conditions of Section 2 of the Spine Editor License Agreement:
|
||||
* http://esotericsoftware.com/spine-editor-license
|
||||
*
|
||||
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
||||
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
||||
* "Products"), provided that each user of the Products must obtain their own
|
||||
* Spine Editor license and redistribution of the Products in any form must
|
||||
* include this license and copyright notice.
|
||||
*
|
||||
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
||||
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
import { Color, Vector2, MathUtils } from "@esotericsoftware/spine-core";
|
||||
import { Mesh, Position2Attribute, ColorAttribute } from "./Mesh.js";
|
||||
import { ManagedWebGLRenderingContext } from "./WebGL.js";
|
||||
export class ShapeRenderer {
|
||||
context;
|
||||
isDrawing = false;
|
||||
mesh;
|
||||
shapeType = ShapeType.Filled;
|
||||
color = new Color(1, 1, 1, 1);
|
||||
shader = null;
|
||||
vertexIndex = 0;
|
||||
tmp = new Vector2();
|
||||
srcColorBlend;
|
||||
srcAlphaBlend;
|
||||
dstBlend;
|
||||
constructor(context, maxVertices = 10920) {
|
||||
if (maxVertices > 10920)
|
||||
throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices);
|
||||
this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context);
|
||||
this.mesh = new Mesh(context, [new Position2Attribute(), new ColorAttribute()], maxVertices, 0);
|
||||
let gl = this.context.gl;
|
||||
this.srcColorBlend = gl.SRC_ALPHA;
|
||||
this.srcAlphaBlend = gl.ONE;
|
||||
this.dstBlend = gl.ONE_MINUS_SRC_ALPHA;
|
||||
}
|
||||
begin(shader) {
|
||||
if (this.isDrawing)
|
||||
throw new Error("ShapeRenderer.begin() has already been called");
|
||||
this.shader = shader;
|
||||
this.vertexIndex = 0;
|
||||
this.isDrawing = true;
|
||||
let gl = this.context.gl;
|
||||
gl.enable(gl.BLEND);
|
||||
gl.blendFuncSeparate(this.srcColorBlend, this.dstBlend, this.srcAlphaBlend, this.dstBlend);
|
||||
}
|
||||
setBlendMode(srcColorBlend, srcAlphaBlend, dstBlend) {
|
||||
this.srcColorBlend = srcColorBlend;
|
||||
this.srcAlphaBlend = srcAlphaBlend;
|
||||
this.dstBlend = dstBlend;
|
||||
if (this.isDrawing) {
|
||||
this.flush();
|
||||
let gl = this.context.gl;
|
||||
gl.blendFuncSeparate(srcColorBlend, dstBlend, srcAlphaBlend, dstBlend);
|
||||
}
|
||||
}
|
||||
setColor(color) {
|
||||
this.color.setFromColor(color);
|
||||
}
|
||||
setColorWith(r, g, b, a) {
|
||||
this.color.set(r, g, b, a);
|
||||
}
|
||||
point(x, y, color) {
|
||||
this.check(ShapeType.Point, 1);
|
||||
if (!color)
|
||||
color = this.color;
|
||||
this.vertex(x, y, color);
|
||||
}
|
||||
line(x, y, x2, y2, color) {
|
||||
this.check(ShapeType.Line, 2);
|
||||
let vertices = this.mesh.getVertices();
|
||||
let idx = this.vertexIndex;
|
||||
if (!color)
|
||||
color = this.color;
|
||||
this.vertex(x, y, color);
|
||||
this.vertex(x2, y2, color);
|
||||
}
|
||||
triangle(filled, x, y, x2, y2, x3, y3, color, color2, color3) {
|
||||
this.check(filled ? ShapeType.Filled : ShapeType.Line, 3);
|
||||
let vertices = this.mesh.getVertices();
|
||||
let idx = this.vertexIndex;
|
||||
if (!color)
|
||||
color = this.color;
|
||||
if (!color2)
|
||||
color2 = this.color;
|
||||
if (!color3)
|
||||
color3 = this.color;
|
||||
if (filled) {
|
||||
this.vertex(x, y, color);
|
||||
this.vertex(x2, y2, color2);
|
||||
this.vertex(x3, y3, color3);
|
||||
}
|
||||
else {
|
||||
this.vertex(x, y, color);
|
||||
this.vertex(x2, y2, color2);
|
||||
this.vertex(x2, y2, color);
|
||||
this.vertex(x3, y3, color2);
|
||||
this.vertex(x3, y3, color);
|
||||
this.vertex(x, y, color2);
|
||||
}
|
||||
}
|
||||
quad(filled, x, y, x2, y2, x3, y3, x4, y4, color, color2, color3, color4) {
|
||||
this.check(filled ? ShapeType.Filled : ShapeType.Line, 3);
|
||||
let vertices = this.mesh.getVertices();
|
||||
let idx = this.vertexIndex;
|
||||
if (!color)
|
||||
color = this.color;
|
||||
if (!color2)
|
||||
color2 = this.color;
|
||||
if (!color3)
|
||||
color3 = this.color;
|
||||
if (!color4)
|
||||
color4 = this.color;
|
||||
if (filled) {
|
||||
this.vertex(x, y, color);
|
||||
this.vertex(x2, y2, color2);
|
||||
this.vertex(x3, y3, color3);
|
||||
this.vertex(x3, y3, color3);
|
||||
this.vertex(x4, y4, color4);
|
||||
this.vertex(x, y, color);
|
||||
}
|
||||
else {
|
||||
this.vertex(x, y, color);
|
||||
this.vertex(x2, y2, color2);
|
||||
this.vertex(x2, y2, color2);
|
||||
this.vertex(x3, y3, color3);
|
||||
this.vertex(x3, y3, color3);
|
||||
this.vertex(x4, y4, color4);
|
||||
this.vertex(x4, y4, color4);
|
||||
this.vertex(x, y, color);
|
||||
}
|
||||
}
|
||||
rect(filled, x, y, width, height, color) {
|
||||
this.quad(filled, x, y, x + width, y, x + width, y + height, x, y + height, color, color, color, color);
|
||||
}
|
||||
rectLine(filled, x1, y1, x2, y2, width, color) {
|
||||
this.check(filled ? ShapeType.Filled : ShapeType.Line, 8);
|
||||
if (!color)
|
||||
color = this.color;
|
||||
let t = this.tmp.set(y2 - y1, x1 - x2);
|
||||
t.normalize();
|
||||
width *= 0.5;
|
||||
let tx = t.x * width;
|
||||
let ty = t.y * width;
|
||||
if (!filled) {
|
||||
this.vertex(x1 + tx, y1 + ty, color);
|
||||
this.vertex(x1 - tx, y1 - ty, color);
|
||||
this.vertex(x2 + tx, y2 + ty, color);
|
||||
this.vertex(x2 - tx, y2 - ty, color);
|
||||
this.vertex(x2 + tx, y2 + ty, color);
|
||||
this.vertex(x1 + tx, y1 + ty, color);
|
||||
this.vertex(x2 - tx, y2 - ty, color);
|
||||
this.vertex(x1 - tx, y1 - ty, color);
|
||||
}
|
||||
else {
|
||||
this.vertex(x1 + tx, y1 + ty, color);
|
||||
this.vertex(x1 - tx, y1 - ty, color);
|
||||
this.vertex(x2 + tx, y2 + ty, color);
|
||||
this.vertex(x2 - tx, y2 - ty, color);
|
||||
this.vertex(x2 + tx, y2 + ty, color);
|
||||
this.vertex(x1 - tx, y1 - ty, color);
|
||||
}
|
||||
}
|
||||
x(x, y, size) {
|
||||
this.line(x - size, y - size, x + size, y + size);
|
||||
this.line(x - size, y + size, x + size, y - size);
|
||||
}
|
||||
polygon(polygonVertices, offset, count, color) {
|
||||
if (count < 3)
|
||||
throw new Error("Polygon must contain at least 3 vertices");
|
||||
this.check(ShapeType.Line, count * 2);
|
||||
if (!color)
|
||||
color = this.color;
|
||||
let vertices = this.mesh.getVertices();
|
||||
let idx = this.vertexIndex;
|
||||
offset <<= 1;
|
||||
count <<= 1;
|
||||
let firstX = polygonVertices[offset];
|
||||
let firstY = polygonVertices[offset + 1];
|
||||
let last = offset + count;
|
||||
for (let i = offset, n = offset + count - 2; i < n; i += 2) {
|
||||
let x1 = polygonVertices[i];
|
||||
let y1 = polygonVertices[i + 1];
|
||||
let x2 = 0;
|
||||
let y2 = 0;
|
||||
if (i + 2 >= last) {
|
||||
x2 = firstX;
|
||||
y2 = firstY;
|
||||
}
|
||||
else {
|
||||
x2 = polygonVertices[i + 2];
|
||||
y2 = polygonVertices[i + 3];
|
||||
}
|
||||
this.vertex(x1, y1, color);
|
||||
this.vertex(x2, y2, color);
|
||||
}
|
||||
}
|
||||
circle(filled, x, y, radius, color, segments = 0) {
|
||||
if (segments == 0)
|
||||
segments = Math.max(1, (6 * MathUtils.cbrt(radius)) | 0);
|
||||
if (segments <= 0)
|
||||
throw new Error("segments must be > 0.");
|
||||
if (!color)
|
||||
color = this.color;
|
||||
let angle = 2 * MathUtils.PI / segments;
|
||||
let cos = Math.cos(angle);
|
||||
let sin = Math.sin(angle);
|
||||
let cx = radius, cy = 0;
|
||||
if (!filled) {
|
||||
this.check(ShapeType.Line, segments * 2 + 2);
|
||||
for (let i = 0; i < segments; i++) {
|
||||
this.vertex(x + cx, y + cy, color);
|
||||
let temp = cx;
|
||||
cx = cos * cx - sin * cy;
|
||||
cy = sin * temp + cos * cy;
|
||||
this.vertex(x + cx, y + cy, color);
|
||||
}
|
||||
// Ensure the last segment is identical to the first.
|
||||
this.vertex(x + cx, y + cy, color);
|
||||
}
|
||||
else {
|
||||
this.check(ShapeType.Filled, segments * 3 + 3);
|
||||
segments--;
|
||||
for (let i = 0; i < segments; i++) {
|
||||
this.vertex(x, y, color);
|
||||
this.vertex(x + cx, y + cy, color);
|
||||
let temp = cx;
|
||||
cx = cos * cx - sin * cy;
|
||||
cy = sin * temp + cos * cy;
|
||||
this.vertex(x + cx, y + cy, color);
|
||||
}
|
||||
// Ensure the last segment is identical to the first.
|
||||
this.vertex(x, y, color);
|
||||
this.vertex(x + cx, y + cy, color);
|
||||
}
|
||||
let temp = cx;
|
||||
cx = radius;
|
||||
cy = 0;
|
||||
this.vertex(x + cx, y + cy, color);
|
||||
}
|
||||
curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color) {
|
||||
this.check(ShapeType.Line, segments * 2 + 2);
|
||||
if (!color)
|
||||
color = this.color;
|
||||
// Algorithm from: http://www.antigrain.com/research/bezier_interpolation/index.html#PAGE_BEZIER_INTERPOLATION
|
||||
let subdiv_step = 1 / segments;
|
||||
let subdiv_step2 = subdiv_step * subdiv_step;
|
||||
let subdiv_step3 = subdiv_step * subdiv_step * subdiv_step;
|
||||
let pre1 = 3 * subdiv_step;
|
||||
let pre2 = 3 * subdiv_step2;
|
||||
let pre4 = 6 * subdiv_step2;
|
||||
let pre5 = 6 * subdiv_step3;
|
||||
let tmp1x = x1 - cx1 * 2 + cx2;
|
||||
let tmp1y = y1 - cy1 * 2 + cy2;
|
||||
let tmp2x = (cx1 - cx2) * 3 - x1 + x2;
|
||||
let tmp2y = (cy1 - cy2) * 3 - y1 + y2;
|
||||
let fx = x1;
|
||||
let fy = y1;
|
||||
let dfx = (cx1 - x1) * pre1 + tmp1x * pre2 + tmp2x * subdiv_step3;
|
||||
let dfy = (cy1 - y1) * pre1 + tmp1y * pre2 + tmp2y * subdiv_step3;
|
||||
let ddfx = tmp1x * pre4 + tmp2x * pre5;
|
||||
let ddfy = tmp1y * pre4 + tmp2y * pre5;
|
||||
let dddfx = tmp2x * pre5;
|
||||
let dddfy = tmp2y * pre5;
|
||||
while (segments-- > 0) {
|
||||
this.vertex(fx, fy, color);
|
||||
fx += dfx;
|
||||
fy += dfy;
|
||||
dfx += ddfx;
|
||||
dfy += ddfy;
|
||||
ddfx += dddfx;
|
||||
ddfy += dddfy;
|
||||
this.vertex(fx, fy, color);
|
||||
}
|
||||
this.vertex(fx, fy, color);
|
||||
this.vertex(x2, y2, color);
|
||||
}
|
||||
vertex(x, y, color) {
|
||||
let idx = this.vertexIndex;
|
||||
let vertices = this.mesh.getVertices();
|
||||
vertices[idx++] = x;
|
||||
vertices[idx++] = y;
|
||||
vertices[idx++] = color.r;
|
||||
vertices[idx++] = color.g;
|
||||
vertices[idx++] = color.b;
|
||||
vertices[idx++] = color.a;
|
||||
this.vertexIndex = idx;
|
||||
}
|
||||
end() {
|
||||
if (!this.isDrawing)
|
||||
throw new Error("ShapeRenderer.begin() has not been called");
|
||||
this.flush();
|
||||
let gl = this.context.gl;
|
||||
gl.disable(gl.BLEND);
|
||||
this.isDrawing = false;
|
||||
}
|
||||
flush() {
|
||||
if (this.vertexIndex == 0)
|
||||
return;
|
||||
if (!this.shader)
|
||||
throw new Error("No shader set.");
|
||||
this.mesh.setVerticesLength(this.vertexIndex);
|
||||
this.mesh.draw(this.shader, this.shapeType);
|
||||
this.vertexIndex = 0;
|
||||
}
|
||||
check(shapeType, numVertices) {
|
||||
if (!this.isDrawing)
|
||||
throw new Error("ShapeRenderer.begin() has not been called");
|
||||
if (this.shapeType == shapeType) {
|
||||
if (this.mesh.maxVertices() - this.mesh.numVertices() < numVertices)
|
||||
this.flush();
|
||||
else
|
||||
return;
|
||||
}
|
||||
else {
|
||||
this.flush();
|
||||
this.shapeType = shapeType;
|
||||
}
|
||||
}
|
||||
dispose() {
|
||||
this.mesh.dispose();
|
||||
}
|
||||
}
|
||||
export var ShapeType;
|
||||
(function (ShapeType) {
|
||||
ShapeType[ShapeType["Point"] = 0] = "Point";
|
||||
ShapeType[ShapeType["Line"] = 1] = "Line";
|
||||
ShapeType[ShapeType["Filled"] = 4] = "Filled";
|
||||
})(ShapeType || (ShapeType = {}));
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcGVSZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TaGFwZVJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQWMsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRixPQUFPLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFMUQsTUFBTSxPQUFPLGFBQWE7SUFDakIsT0FBTyxDQUErQjtJQUN0QyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLElBQUksQ0FBTztJQUNYLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQzdCLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLEdBQWtCLElBQUksQ0FBQztJQUM3QixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ3BCLGFBQWEsQ0FBUztJQUN0QixhQUFhLENBQVM7SUFDdEIsUUFBUSxDQUFTO0lBRXpCLFlBQWEsT0FBNkQsRUFBRSxjQUFzQixLQUFLO1FBQ3RHLElBQUksV0FBVyxHQUFHLEtBQUs7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBQzNHLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxZQUFZLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckgsSUFBSSxDQUFDLElBQUksR0FBRyxJ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
Line truncated
|
||||
Reference in new issue
Block a user