mirror of
https://gitlab.com/skysthelimit.dev/selenite.git
synced 2025-06-16 18:42:08 -05:00
73686 lines
2.7 MiB
73686 lines
2.7 MiB
"use strict";
|
||
'use strict';
|
||
(function(global, factory) {
|
||
typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : (global = global || self,
|
||
factory(global.glMatrix = {}))
|
||
}
|
||
)(this, function(exports) {
|
||
var EPSILON = 1E-6;
|
||
var ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array;
|
||
var RANDOM = Math.random;
|
||
function setMatrixArrayType(type) {
|
||
ARRAY_TYPE = type
|
||
}
|
||
var degree = Math.PI / 180;
|
||
function toRadian(a) {
|
||
return a * degree
|
||
}
|
||
function equals(a, b) {
|
||
return Math.abs(a - b) <= EPSILON * Math.max(1, Math.abs(a), Math.abs(b))
|
||
}
|
||
if (!Math.hypot)
|
||
Math.hypot = function() {
|
||
var y = 0
|
||
, i = arguments.length;
|
||
while (i--)
|
||
y += arguments[i] * arguments[i];
|
||
return Math.sqrt(y)
|
||
}
|
||
;
|
||
var common = Object.freeze({
|
||
__proto__: null,
|
||
EPSILON: EPSILON,
|
||
get ARRAY_TYPE() {
|
||
return ARRAY_TYPE
|
||
},
|
||
RANDOM: RANDOM,
|
||
setMatrixArrayType: setMatrixArrayType,
|
||
toRadian: toRadian,
|
||
equals: equals
|
||
});
|
||
function create() {
|
||
var out = new ARRAY_TYPE(4);
|
||
if (ARRAY_TYPE != Float32Array) {
|
||
out[1] = 0;
|
||
out[2] = 0
|
||
}
|
||
out[0] = 1;
|
||
out[3] = 1;
|
||
return out
|
||
}
|
||
function clone(a) {
|
||
var out = new ARRAY_TYPE(4);
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[3];
|
||
return out
|
||
}
|
||
function copy(out, a) {
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[3];
|
||
return out
|
||
}
|
||
function identity(out) {
|
||
out[0] = 1;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 1;
|
||
return out
|
||
}
|
||
function fromValues(m00, m01, m10, m11) {
|
||
var out = new ARRAY_TYPE(4);
|
||
out[0] = m00;
|
||
out[1] = m01;
|
||
out[2] = m10;
|
||
out[3] = m11;
|
||
return out
|
||
}
|
||
function set(out, m00, m01, m10, m11) {
|
||
out[0] = m00;
|
||
out[1] = m01;
|
||
out[2] = m10;
|
||
out[3] = m11;
|
||
return out
|
||
}
|
||
function transpose(out, a) {
|
||
if (out === a) {
|
||
var a1 = a[1];
|
||
out[1] = a[2];
|
||
out[2] = a1
|
||
} else {
|
||
out[0] = a[0];
|
||
out[1] = a[2];
|
||
out[2] = a[1];
|
||
out[3] = a[3]
|
||
}
|
||
return out
|
||
}
|
||
function invert(out, a) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3];
|
||
var det = a0 * a3 - a2 * a1;
|
||
if (!det)
|
||
return null;
|
||
det = 1 / det;
|
||
out[0] = a3 * det;
|
||
out[1] = -a1 * det;
|
||
out[2] = -a2 * det;
|
||
out[3] = a0 * det;
|
||
return out
|
||
}
|
||
function adjoint(out, a) {
|
||
var a0 = a[0];
|
||
out[0] = a[3];
|
||
out[1] = -a[1];
|
||
out[2] = -a[2];
|
||
out[3] = a0;
|
||
return out
|
||
}
|
||
function determinant(a) {
|
||
return a[0] * a[3] - a[2] * a[1]
|
||
}
|
||
function multiply(out, a, b) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3];
|
||
var b0 = b[0]
|
||
, b1 = b[1]
|
||
, b2 = b[2]
|
||
, b3 = b[3];
|
||
out[0] = a0 * b0 + a2 * b1;
|
||
out[1] = a1 * b0 + a3 * b1;
|
||
out[2] = a0 * b2 + a2 * b3;
|
||
out[3] = a1 * b2 + a3 * b3;
|
||
return out
|
||
}
|
||
function rotate(out, a, rad) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3];
|
||
var s = Math.sin(rad);
|
||
var c = Math.cos(rad);
|
||
out[0] = a0 * c + a2 * s;
|
||
out[1] = a1 * c + a3 * s;
|
||
out[2] = a0 * -s + a2 * c;
|
||
out[3] = a1 * -s + a3 * c;
|
||
return out
|
||
}
|
||
function scale(out, a, v) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3];
|
||
var v0 = v[0]
|
||
, v1 = v[1];
|
||
out[0] = a0 * v0;
|
||
out[1] = a1 * v0;
|
||
out[2] = a2 * v1;
|
||
out[3] = a3 * v1;
|
||
return out
|
||
}
|
||
function fromRotation(out, rad) {
|
||
var s = Math.sin(rad);
|
||
var c = Math.cos(rad);
|
||
out[0] = c;
|
||
out[1] = s;
|
||
out[2] = -s;
|
||
out[3] = c;
|
||
return out
|
||
}
|
||
function fromScaling(out, v) {
|
||
out[0] = v[0];
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = v[1];
|
||
return out
|
||
}
|
||
function str(a) {
|
||
return "mat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"
|
||
}
|
||
function frob(a) {
|
||
return Math.hypot(a[0], a[1], a[2], a[3])
|
||
}
|
||
function LDU(L, D, U, a) {
|
||
L[2] = a[2] / a[0];
|
||
U[0] = a[0];
|
||
U[1] = a[1];
|
||
U[3] = a[3] - L[2] * U[1];
|
||
return [L, D, U]
|
||
}
|
||
function add(out, a, b) {
|
||
out[0] = a[0] + b[0];
|
||
out[1] = a[1] + b[1];
|
||
out[2] = a[2] + b[2];
|
||
out[3] = a[3] + b[3];
|
||
return out
|
||
}
|
||
function subtract(out, a, b) {
|
||
out[0] = a[0] - b[0];
|
||
out[1] = a[1] - b[1];
|
||
out[2] = a[2] - b[2];
|
||
out[3] = a[3] - b[3];
|
||
return out
|
||
}
|
||
function exactEquals(a, b) {
|
||
return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]
|
||
}
|
||
function equals$1(a, b) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3];
|
||
var b0 = b[0]
|
||
, b1 = b[1]
|
||
, b2 = b[2]
|
||
, b3 = b[3];
|
||
return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3))
|
||
}
|
||
function multiplyScalar(out, a, b) {
|
||
out[0] = a[0] * b;
|
||
out[1] = a[1] * b;
|
||
out[2] = a[2] * b;
|
||
out[3] = a[3] * b;
|
||
return out
|
||
}
|
||
function multiplyScalarAndAdd(out, a, b, scale) {
|
||
out[0] = a[0] + b[0] * scale;
|
||
out[1] = a[1] + b[1] * scale;
|
||
out[2] = a[2] + b[2] * scale;
|
||
out[3] = a[3] + b[3] * scale;
|
||
return out
|
||
}
|
||
var mul = multiply;
|
||
var sub = subtract;
|
||
var mat2 = Object.freeze({
|
||
__proto__: null,
|
||
create: create,
|
||
clone: clone,
|
||
copy: copy,
|
||
identity: identity,
|
||
fromValues: fromValues,
|
||
set: set,
|
||
transpose: transpose,
|
||
invert: invert,
|
||
adjoint: adjoint,
|
||
determinant: determinant,
|
||
multiply: multiply,
|
||
rotate: rotate,
|
||
scale: scale,
|
||
fromRotation: fromRotation,
|
||
fromScaling: fromScaling,
|
||
str: str,
|
||
frob: frob,
|
||
LDU: LDU,
|
||
add: add,
|
||
subtract: subtract,
|
||
exactEquals: exactEquals,
|
||
equals: equals$1,
|
||
multiplyScalar: multiplyScalar,
|
||
multiplyScalarAndAdd: multiplyScalarAndAdd,
|
||
mul: mul,
|
||
sub: sub
|
||
});
|
||
function create$1() {
|
||
var out = new ARRAY_TYPE(6);
|
||
if (ARRAY_TYPE != Float32Array) {
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[4] = 0;
|
||
out[5] = 0
|
||
}
|
||
out[0] = 1;
|
||
out[3] = 1;
|
||
return out
|
||
}
|
||
function clone$1(a) {
|
||
var out = new ARRAY_TYPE(6);
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[3];
|
||
out[4] = a[4];
|
||
out[5] = a[5];
|
||
return out
|
||
}
|
||
function copy$1(out, a) {
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[3];
|
||
out[4] = a[4];
|
||
out[5] = a[5];
|
||
return out
|
||
}
|
||
function identity$1(out) {
|
||
out[0] = 1;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 1;
|
||
out[4] = 0;
|
||
out[5] = 0;
|
||
return out
|
||
}
|
||
function fromValues$1(a, b, c, d, tx, ty) {
|
||
var out = new ARRAY_TYPE(6);
|
||
out[0] = a;
|
||
out[1] = b;
|
||
out[2] = c;
|
||
out[3] = d;
|
||
out[4] = tx;
|
||
out[5] = ty;
|
||
return out
|
||
}
|
||
function set$1(out, a, b, c, d, tx, ty) {
|
||
out[0] = a;
|
||
out[1] = b;
|
||
out[2] = c;
|
||
out[3] = d;
|
||
out[4] = tx;
|
||
out[5] = ty;
|
||
return out
|
||
}
|
||
function invert$1(out, a) {
|
||
var aa = a[0]
|
||
, ab = a[1]
|
||
, ac = a[2]
|
||
, ad = a[3];
|
||
var atx = a[4]
|
||
, aty = a[5];
|
||
var det = aa * ad - ab * ac;
|
||
if (!det)
|
||
return null;
|
||
det = 1 / det;
|
||
out[0] = ad * det;
|
||
out[1] = -ab * det;
|
||
out[2] = -ac * det;
|
||
out[3] = aa * det;
|
||
out[4] = (ac * aty - ad * atx) * det;
|
||
out[5] = (ab * atx - aa * aty) * det;
|
||
return out
|
||
}
|
||
function determinant$1(a) {
|
||
return a[0] * a[3] - a[1] * a[2]
|
||
}
|
||
function multiply$1(out, a, b) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3]
|
||
, a4 = a[4]
|
||
, a5 = a[5];
|
||
var b0 = b[0]
|
||
, b1 = b[1]
|
||
, b2 = b[2]
|
||
, b3 = b[3]
|
||
, b4 = b[4]
|
||
, b5 = b[5];
|
||
out[0] = a0 * b0 + a2 * b1;
|
||
out[1] = a1 * b0 + a3 * b1;
|
||
out[2] = a0 * b2 + a2 * b3;
|
||
out[3] = a1 * b2 + a3 * b3;
|
||
out[4] = a0 * b4 + a2 * b5 + a4;
|
||
out[5] = a1 * b4 + a3 * b5 + a5;
|
||
return out
|
||
}
|
||
function rotate$1(out, a, rad) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3]
|
||
, a4 = a[4]
|
||
, a5 = a[5];
|
||
var s = Math.sin(rad);
|
||
var c = Math.cos(rad);
|
||
out[0] = a0 * c + a2 * s;
|
||
out[1] = a1 * c + a3 * s;
|
||
out[2] = a0 * -s + a2 * c;
|
||
out[3] = a1 * -s + a3 * c;
|
||
out[4] = a4;
|
||
out[5] = a5;
|
||
return out
|
||
}
|
||
function scale$1(out, a, v) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3]
|
||
, a4 = a[4]
|
||
, a5 = a[5];
|
||
var v0 = v[0]
|
||
, v1 = v[1];
|
||
out[0] = a0 * v0;
|
||
out[1] = a1 * v0;
|
||
out[2] = a2 * v1;
|
||
out[3] = a3 * v1;
|
||
out[4] = a4;
|
||
out[5] = a5;
|
||
return out
|
||
}
|
||
function translate(out, a, v) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3]
|
||
, a4 = a[4]
|
||
, a5 = a[5];
|
||
var v0 = v[0]
|
||
, v1 = v[1];
|
||
out[0] = a0;
|
||
out[1] = a1;
|
||
out[2] = a2;
|
||
out[3] = a3;
|
||
out[4] = a0 * v0 + a2 * v1 + a4;
|
||
out[5] = a1 * v0 + a3 * v1 + a5;
|
||
return out
|
||
}
|
||
function fromRotation$1(out, rad) {
|
||
var s = Math.sin(rad)
|
||
, c = Math.cos(rad);
|
||
out[0] = c;
|
||
out[1] = s;
|
||
out[2] = -s;
|
||
out[3] = c;
|
||
out[4] = 0;
|
||
out[5] = 0;
|
||
return out
|
||
}
|
||
function fromScaling$1(out, v) {
|
||
out[0] = v[0];
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = v[1];
|
||
out[4] = 0;
|
||
out[5] = 0;
|
||
return out
|
||
}
|
||
function fromTranslation(out, v) {
|
||
out[0] = 1;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 1;
|
||
out[4] = v[0];
|
||
out[5] = v[1];
|
||
return out
|
||
}
|
||
function str$1(a) {
|
||
return "mat2d(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ")"
|
||
}
|
||
function frob$1(a) {
|
||
return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], 1)
|
||
}
|
||
function add$1(out, a, b) {
|
||
out[0] = a[0] + b[0];
|
||
out[1] = a[1] + b[1];
|
||
out[2] = a[2] + b[2];
|
||
out[3] = a[3] + b[3];
|
||
out[4] = a[4] + b[4];
|
||
out[5] = a[5] + b[5];
|
||
return out
|
||
}
|
||
function subtract$1(out, a, b) {
|
||
out[0] = a[0] - b[0];
|
||
out[1] = a[1] - b[1];
|
||
out[2] = a[2] - b[2];
|
||
out[3] = a[3] - b[3];
|
||
out[4] = a[4] - b[4];
|
||
out[5] = a[5] - b[5];
|
||
return out
|
||
}
|
||
function multiplyScalar$1(out, a, b) {
|
||
out[0] = a[0] * b;
|
||
out[1] = a[1] * b;
|
||
out[2] = a[2] * b;
|
||
out[3] = a[3] * b;
|
||
out[4] = a[4] * b;
|
||
out[5] = a[5] * b;
|
||
return out
|
||
}
|
||
function multiplyScalarAndAdd$1(out, a, b, scale) {
|
||
out[0] = a[0] + b[0] * scale;
|
||
out[1] = a[1] + b[1] * scale;
|
||
out[2] = a[2] + b[2] * scale;
|
||
out[3] = a[3] + b[3] * scale;
|
||
out[4] = a[4] + b[4] * scale;
|
||
out[5] = a[5] + b[5] * scale;
|
||
return out
|
||
}
|
||
function exactEquals$1(a, b) {
|
||
return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5]
|
||
}
|
||
function equals$2(a, b) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3]
|
||
, a4 = a[4]
|
||
, a5 = a[5];
|
||
var b0 = b[0]
|
||
, b1 = b[1]
|
||
, b2 = b[2]
|
||
, b3 = b[3]
|
||
, b4 = b[4]
|
||
, b5 = b[5];
|
||
return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1, Math.abs(a5), Math.abs(b5))
|
||
}
|
||
var mul$1 = multiply$1;
|
||
var sub$1 = subtract$1;
|
||
var mat2d = Object.freeze({
|
||
__proto__: null,
|
||
create: create$1,
|
||
clone: clone$1,
|
||
copy: copy$1,
|
||
identity: identity$1,
|
||
fromValues: fromValues$1,
|
||
set: set$1,
|
||
invert: invert$1,
|
||
determinant: determinant$1,
|
||
multiply: multiply$1,
|
||
rotate: rotate$1,
|
||
scale: scale$1,
|
||
translate: translate,
|
||
fromRotation: fromRotation$1,
|
||
fromScaling: fromScaling$1,
|
||
fromTranslation: fromTranslation,
|
||
str: str$1,
|
||
frob: frob$1,
|
||
add: add$1,
|
||
subtract: subtract$1,
|
||
multiplyScalar: multiplyScalar$1,
|
||
multiplyScalarAndAdd: multiplyScalarAndAdd$1,
|
||
exactEquals: exactEquals$1,
|
||
equals: equals$2,
|
||
mul: mul$1,
|
||
sub: sub$1
|
||
});
|
||
function create$2() {
|
||
var out = new ARRAY_TYPE(9);
|
||
if (ARRAY_TYPE != Float32Array) {
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[5] = 0;
|
||
out[6] = 0;
|
||
out[7] = 0
|
||
}
|
||
out[0] = 1;
|
||
out[4] = 1;
|
||
out[8] = 1;
|
||
return out
|
||
}
|
||
function fromMat4(out, a) {
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[4];
|
||
out[4] = a[5];
|
||
out[5] = a[6];
|
||
out[6] = a[8];
|
||
out[7] = a[9];
|
||
out[8] = a[10];
|
||
return out
|
||
}
|
||
function clone$2(a) {
|
||
var out = new ARRAY_TYPE(9);
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[3];
|
||
out[4] = a[4];
|
||
out[5] = a[5];
|
||
out[6] = a[6];
|
||
out[7] = a[7];
|
||
out[8] = a[8];
|
||
return out
|
||
}
|
||
function copy$2(out, a) {
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[3];
|
||
out[4] = a[4];
|
||
out[5] = a[5];
|
||
out[6] = a[6];
|
||
out[7] = a[7];
|
||
out[8] = a[8];
|
||
return out
|
||
}
|
||
function fromValues$2(m00, m01, m02, m10, m11, m12, m20, m21, m22) {
|
||
var out = new ARRAY_TYPE(9);
|
||
out[0] = m00;
|
||
out[1] = m01;
|
||
out[2] = m02;
|
||
out[3] = m10;
|
||
out[4] = m11;
|
||
out[5] = m12;
|
||
out[6] = m20;
|
||
out[7] = m21;
|
||
out[8] = m22;
|
||
return out
|
||
}
|
||
function set$2(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {
|
||
out[0] = m00;
|
||
out[1] = m01;
|
||
out[2] = m02;
|
||
out[3] = m10;
|
||
out[4] = m11;
|
||
out[5] = m12;
|
||
out[6] = m20;
|
||
out[7] = m21;
|
||
out[8] = m22;
|
||
return out
|
||
}
|
||
function identity$2(out) {
|
||
out[0] = 1;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = 1;
|
||
out[5] = 0;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = 1;
|
||
return out
|
||
}
|
||
function transpose$1(out, a) {
|
||
if (out === a) {
|
||
var a01 = a[1]
|
||
, a02 = a[2]
|
||
, a12 = a[5];
|
||
out[1] = a[3];
|
||
out[2] = a[6];
|
||
out[3] = a01;
|
||
out[5] = a[7];
|
||
out[6] = a02;
|
||
out[7] = a12
|
||
} else {
|
||
out[0] = a[0];
|
||
out[1] = a[3];
|
||
out[2] = a[6];
|
||
out[3] = a[1];
|
||
out[4] = a[4];
|
||
out[5] = a[7];
|
||
out[6] = a[2];
|
||
out[7] = a[5];
|
||
out[8] = a[8]
|
||
}
|
||
return out
|
||
}
|
||
function invert$2(out, a) {
|
||
var a00 = a[0]
|
||
, a01 = a[1]
|
||
, a02 = a[2];
|
||
var a10 = a[3]
|
||
, a11 = a[4]
|
||
, a12 = a[5];
|
||
var a20 = a[6]
|
||
, a21 = a[7]
|
||
, a22 = a[8];
|
||
var b01 = a22 * a11 - a12 * a21;
|
||
var b11 = -a22 * a10 + a12 * a20;
|
||
var b21 = a21 * a10 - a11 * a20;
|
||
var det = a00 * b01 + a01 * b11 + a02 * b21;
|
||
if (!det)
|
||
return null;
|
||
det = 1 / det;
|
||
out[0] = b01 * det;
|
||
out[1] = (-a22 * a01 + a02 * a21) * det;
|
||
out[2] = (a12 * a01 - a02 * a11) * det;
|
||
out[3] = b11 * det;
|
||
out[4] = (a22 * a00 - a02 * a20) * det;
|
||
out[5] = (-a12 * a00 + a02 * a10) * det;
|
||
out[6] = b21 * det;
|
||
out[7] = (-a21 * a00 + a01 * a20) * det;
|
||
out[8] = (a11 * a00 - a01 * a10) * det;
|
||
return out
|
||
}
|
||
function adjoint$1(out, a) {
|
||
var a00 = a[0]
|
||
, a01 = a[1]
|
||
, a02 = a[2];
|
||
var a10 = a[3]
|
||
, a11 = a[4]
|
||
, a12 = a[5];
|
||
var a20 = a[6]
|
||
, a21 = a[7]
|
||
, a22 = a[8];
|
||
out[0] = a11 * a22 - a12 * a21;
|
||
out[1] = a02 * a21 - a01 * a22;
|
||
out[2] = a01 * a12 - a02 * a11;
|
||
out[3] = a12 * a20 - a10 * a22;
|
||
out[4] = a00 * a22 - a02 * a20;
|
||
out[5] = a02 * a10 - a00 * a12;
|
||
out[6] = a10 * a21 - a11 * a20;
|
||
out[7] = a01 * a20 - a00 * a21;
|
||
out[8] = a00 * a11 - a01 * a10;
|
||
return out
|
||
}
|
||
function determinant$2(a) {
|
||
var a00 = a[0]
|
||
, a01 = a[1]
|
||
, a02 = a[2];
|
||
var a10 = a[3]
|
||
, a11 = a[4]
|
||
, a12 = a[5];
|
||
var a20 = a[6]
|
||
, a21 = a[7]
|
||
, a22 = a[8];
|
||
return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20)
|
||
}
|
||
function multiply$2(out, a, b) {
|
||
var a00 = a[0]
|
||
, a01 = a[1]
|
||
, a02 = a[2];
|
||
var a10 = a[3]
|
||
, a11 = a[4]
|
||
, a12 = a[5];
|
||
var a20 = a[6]
|
||
, a21 = a[7]
|
||
, a22 = a[8];
|
||
var b00 = b[0]
|
||
, b01 = b[1]
|
||
, b02 = b[2];
|
||
var b10 = b[3]
|
||
, b11 = b[4]
|
||
, b12 = b[5];
|
||
var b20 = b[6]
|
||
, b21 = b[7]
|
||
, b22 = b[8];
|
||
out[0] = b00 * a00 + b01 * a10 + b02 * a20;
|
||
out[1] = b00 * a01 + b01 * a11 + b02 * a21;
|
||
out[2] = b00 * a02 + b01 * a12 + b02 * a22;
|
||
out[3] = b10 * a00 + b11 * a10 + b12 * a20;
|
||
out[4] = b10 * a01 + b11 * a11 + b12 * a21;
|
||
out[5] = b10 * a02 + b11 * a12 + b12 * a22;
|
||
out[6] = b20 * a00 + b21 * a10 + b22 * a20;
|
||
out[7] = b20 * a01 + b21 * a11 + b22 * a21;
|
||
out[8] = b20 * a02 + b21 * a12 + b22 * a22;
|
||
return out
|
||
}
|
||
function translate$1(out, a, v) {
|
||
var a00 = a[0]
|
||
, a01 = a[1]
|
||
, a02 = a[2]
|
||
, a10 = a[3]
|
||
, a11 = a[4]
|
||
, a12 = a[5]
|
||
, a20 = a[6]
|
||
, a21 = a[7]
|
||
, a22 = a[8]
|
||
, x = v[0]
|
||
, y = v[1];
|
||
out[0] = a00;
|
||
out[1] = a01;
|
||
out[2] = a02;
|
||
out[3] = a10;
|
||
out[4] = a11;
|
||
out[5] = a12;
|
||
out[6] = x * a00 + y * a10 + a20;
|
||
out[7] = x * a01 + y * a11 + a21;
|
||
out[8] = x * a02 + y * a12 + a22;
|
||
return out
|
||
}
|
||
function rotate$2(out, a, rad) {
|
||
var a00 = a[0]
|
||
, a01 = a[1]
|
||
, a02 = a[2]
|
||
, a10 = a[3]
|
||
, a11 = a[4]
|
||
, a12 = a[5]
|
||
, a20 = a[6]
|
||
, a21 = a[7]
|
||
, a22 = a[8]
|
||
, s = Math.sin(rad)
|
||
, c = Math.cos(rad);
|
||
out[0] = c * a00 + s * a10;
|
||
out[1] = c * a01 + s * a11;
|
||
out[2] = c * a02 + s * a12;
|
||
out[3] = c * a10 - s * a00;
|
||
out[4] = c * a11 - s * a01;
|
||
out[5] = c * a12 - s * a02;
|
||
out[6] = a20;
|
||
out[7] = a21;
|
||
out[8] = a22;
|
||
return out
|
||
}
|
||
function scale$2(out, a, v) {
|
||
var x = v[0]
|
||
, y = v[1];
|
||
out[0] = x * a[0];
|
||
out[1] = x * a[1];
|
||
out[2] = x * a[2];
|
||
out[3] = y * a[3];
|
||
out[4] = y * a[4];
|
||
out[5] = y * a[5];
|
||
out[6] = a[6];
|
||
out[7] = a[7];
|
||
out[8] = a[8];
|
||
return out
|
||
}
|
||
function fromTranslation$1(out, v) {
|
||
out[0] = 1;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = 1;
|
||
out[5] = 0;
|
||
out[6] = v[0];
|
||
out[7] = v[1];
|
||
out[8] = 1;
|
||
return out
|
||
}
|
||
function fromRotation$2(out, rad) {
|
||
var s = Math.sin(rad)
|
||
, c = Math.cos(rad);
|
||
out[0] = c;
|
||
out[1] = s;
|
||
out[2] = 0;
|
||
out[3] = -s;
|
||
out[4] = c;
|
||
out[5] = 0;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = 1;
|
||
return out
|
||
}
|
||
function fromScaling$2(out, v) {
|
||
out[0] = v[0];
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = v[1];
|
||
out[5] = 0;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = 1;
|
||
return out
|
||
}
|
||
function fromMat2d(out, a) {
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = 0;
|
||
out[3] = a[2];
|
||
out[4] = a[3];
|
||
out[5] = 0;
|
||
out[6] = a[4];
|
||
out[7] = a[5];
|
||
out[8] = 1;
|
||
return out
|
||
}
|
||
function fromQuat(out, q) {
|
||
var x = q[0]
|
||
, y = q[1]
|
||
, z = q[2]
|
||
, w = q[3];
|
||
var x2 = x + x;
|
||
var y2 = y + y;
|
||
var z2 = z + z;
|
||
var xx = x * x2;
|
||
var yx = y * x2;
|
||
var yy = y * y2;
|
||
var zx = z * x2;
|
||
var zy = z * y2;
|
||
var zz = z * z2;
|
||
var wx = w * x2;
|
||
var wy = w * y2;
|
||
var wz = w * z2;
|
||
out[0] = 1 - yy - zz;
|
||
out[3] = yx - wz;
|
||
out[6] = zx + wy;
|
||
out[1] = yx + wz;
|
||
out[4] = 1 - xx - zz;
|
||
out[7] = zy - wx;
|
||
out[2] = zx - wy;
|
||
out[5] = zy + wx;
|
||
out[8] = 1 - xx - yy;
|
||
return out
|
||
}
|
||
function normalFromMat4(out, a) {
|
||
var a00 = a[0]
|
||
, a01 = a[1]
|
||
, a02 = a[2]
|
||
, a03 = a[3];
|
||
var a10 = a[4]
|
||
, a11 = a[5]
|
||
, a12 = a[6]
|
||
, a13 = a[7];
|
||
var a20 = a[8]
|
||
, a21 = a[9]
|
||
, a22 = a[10]
|
||
, a23 = a[11];
|
||
var a30 = a[12]
|
||
, a31 = a[13]
|
||
, a32 = a[14]
|
||
, a33 = a[15];
|
||
var b00 = a00 * a11 - a01 * a10;
|
||
var b01 = a00 * a12 - a02 * a10;
|
||
var b02 = a00 * a13 - a03 * a10;
|
||
var b03 = a01 * a12 - a02 * a11;
|
||
var b04 = a01 * a13 - a03 * a11;
|
||
var b05 = a02 * a13 - a03 * a12;
|
||
var b06 = a20 * a31 - a21 * a30;
|
||
var b07 = a20 * a32 - a22 * a30;
|
||
var b08 = a20 * a33 - a23 * a30;
|
||
var b09 = a21 * a32 - a22 * a31;
|
||
var b10 = a21 * a33 - a23 * a31;
|
||
var b11 = a22 * a33 - a23 * a32;
|
||
var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
|
||
if (!det)
|
||
return null;
|
||
det = 1 / det;
|
||
out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
|
||
out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
|
||
out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
|
||
out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
|
||
out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
|
||
out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
|
||
out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
|
||
out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
|
||
out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
|
||
return out
|
||
}
|
||
function projection(out, width, height) {
|
||
out[0] = 2 / width;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = -2 / height;
|
||
out[5] = 0;
|
||
out[6] = -1;
|
||
out[7] = 1;
|
||
out[8] = 1;
|
||
return out
|
||
}
|
||
function str$2(a) {
|
||
return "mat3(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ")"
|
||
}
|
||
function frob$2(a) {
|
||
return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8])
|
||
}
|
||
function add$2(out, a, b) {
|
||
out[0] = a[0] + b[0];
|
||
out[1] = a[1] + b[1];
|
||
out[2] = a[2] + b[2];
|
||
out[3] = a[3] + b[3];
|
||
out[4] = a[4] + b[4];
|
||
out[5] = a[5] + b[5];
|
||
out[6] = a[6] + b[6];
|
||
out[7] = a[7] + b[7];
|
||
out[8] = a[8] + b[8];
|
||
return out
|
||
}
|
||
function subtract$2(out, a, b) {
|
||
out[0] = a[0] - b[0];
|
||
out[1] = a[1] - b[1];
|
||
out[2] = a[2] - b[2];
|
||
out[3] = a[3] - b[3];
|
||
out[4] = a[4] - b[4];
|
||
out[5] = a[5] - b[5];
|
||
out[6] = a[6] - b[6];
|
||
out[7] = a[7] - b[7];
|
||
out[8] = a[8] - b[8];
|
||
return out
|
||
}
|
||
function multiplyScalar$2(out, a, b) {
|
||
out[0] = a[0] * b;
|
||
out[1] = a[1] * b;
|
||
out[2] = a[2] * b;
|
||
out[3] = a[3] * b;
|
||
out[4] = a[4] * b;
|
||
out[5] = a[5] * b;
|
||
out[6] = a[6] * b;
|
||
out[7] = a[7] * b;
|
||
out[8] = a[8] * b;
|
||
return out
|
||
}
|
||
function multiplyScalarAndAdd$2(out, a, b, scale) {
|
||
out[0] = a[0] + b[0] * scale;
|
||
out[1] = a[1] + b[1] * scale;
|
||
out[2] = a[2] + b[2] * scale;
|
||
out[3] = a[3] + b[3] * scale;
|
||
out[4] = a[4] + b[4] * scale;
|
||
out[5] = a[5] + b[5] * scale;
|
||
out[6] = a[6] + b[6] * scale;
|
||
out[7] = a[7] + b[7] * scale;
|
||
out[8] = a[8] + b[8] * scale;
|
||
return out
|
||
}
|
||
function exactEquals$2(a, b) {
|
||
return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8]
|
||
}
|
||
function equals$3(a, b) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3]
|
||
, a4 = a[4]
|
||
, a5 = a[5]
|
||
, a6 = a[6]
|
||
, a7 = a[7]
|
||
, a8 = a[8];
|
||
var b0 = b[0]
|
||
, b1 = b[1]
|
||
, b2 = b[2]
|
||
, b3 = b[3]
|
||
, b4 = b[4]
|
||
, b5 = b[5]
|
||
, b6 = b[6]
|
||
, b7 = b[7]
|
||
, b8 = b[8];
|
||
return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1, Math.abs(a8), Math.abs(b8))
|
||
}
|
||
var mul$2 = multiply$2;
|
||
var sub$2 = subtract$2;
|
||
var mat3 = Object.freeze({
|
||
__proto__: null,
|
||
create: create$2,
|
||
fromMat4: fromMat4,
|
||
clone: clone$2,
|
||
copy: copy$2,
|
||
fromValues: fromValues$2,
|
||
set: set$2,
|
||
identity: identity$2,
|
||
transpose: transpose$1,
|
||
invert: invert$2,
|
||
adjoint: adjoint$1,
|
||
determinant: determinant$2,
|
||
multiply: multiply$2,
|
||
translate: translate$1,
|
||
rotate: rotate$2,
|
||
scale: scale$2,
|
||
fromTranslation: fromTranslation$1,
|
||
fromRotation: fromRotation$2,
|
||
fromScaling: fromScaling$2,
|
||
fromMat2d: fromMat2d,
|
||
fromQuat: fromQuat,
|
||
normalFromMat4: normalFromMat4,
|
||
projection: projection,
|
||
str: str$2,
|
||
frob: frob$2,
|
||
add: add$2,
|
||
subtract: subtract$2,
|
||
multiplyScalar: multiplyScalar$2,
|
||
multiplyScalarAndAdd: multiplyScalarAndAdd$2,
|
||
exactEquals: exactEquals$2,
|
||
equals: equals$3,
|
||
mul: mul$2,
|
||
sub: sub$2
|
||
});
|
||
function create$3() {
|
||
var out = new ARRAY_TYPE(16);
|
||
if (ARRAY_TYPE != Float32Array) {
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = 0;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = 0;
|
||
out[9] = 0;
|
||
out[11] = 0;
|
||
out[12] = 0;
|
||
out[13] = 0;
|
||
out[14] = 0
|
||
}
|
||
out[0] = 1;
|
||
out[5] = 1;
|
||
out[10] = 1;
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function clone$3(a) {
|
||
var out = new ARRAY_TYPE(16);
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[3];
|
||
out[4] = a[4];
|
||
out[5] = a[5];
|
||
out[6] = a[6];
|
||
out[7] = a[7];
|
||
out[8] = a[8];
|
||
out[9] = a[9];
|
||
out[10] = a[10];
|
||
out[11] = a[11];
|
||
out[12] = a[12];
|
||
out[13] = a[13];
|
||
out[14] = a[14];
|
||
out[15] = a[15];
|
||
return out
|
||
}
|
||
function copy$3(out, a) {
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[3];
|
||
out[4] = a[4];
|
||
out[5] = a[5];
|
||
out[6] = a[6];
|
||
out[7] = a[7];
|
||
out[8] = a[8];
|
||
out[9] = a[9];
|
||
out[10] = a[10];
|
||
out[11] = a[11];
|
||
out[12] = a[12];
|
||
out[13] = a[13];
|
||
out[14] = a[14];
|
||
out[15] = a[15];
|
||
return out
|
||
}
|
||
function fromValues$3(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {
|
||
var out = new ARRAY_TYPE(16);
|
||
out[0] = m00;
|
||
out[1] = m01;
|
||
out[2] = m02;
|
||
out[3] = m03;
|
||
out[4] = m10;
|
||
out[5] = m11;
|
||
out[6] = m12;
|
||
out[7] = m13;
|
||
out[8] = m20;
|
||
out[9] = m21;
|
||
out[10] = m22;
|
||
out[11] = m23;
|
||
out[12] = m30;
|
||
out[13] = m31;
|
||
out[14] = m32;
|
||
out[15] = m33;
|
||
return out
|
||
}
|
||
function set$3(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {
|
||
out[0] = m00;
|
||
out[1] = m01;
|
||
out[2] = m02;
|
||
out[3] = m03;
|
||
out[4] = m10;
|
||
out[5] = m11;
|
||
out[6] = m12;
|
||
out[7] = m13;
|
||
out[8] = m20;
|
||
out[9] = m21;
|
||
out[10] = m22;
|
||
out[11] = m23;
|
||
out[12] = m30;
|
||
out[13] = m31;
|
||
out[14] = m32;
|
||
out[15] = m33;
|
||
return out
|
||
}
|
||
function identity$3(out) {
|
||
out[0] = 1;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = 0;
|
||
out[5] = 1;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = 0;
|
||
out[9] = 0;
|
||
out[10] = 1;
|
||
out[11] = 0;
|
||
out[12] = 0;
|
||
out[13] = 0;
|
||
out[14] = 0;
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function transpose$2(out, a) {
|
||
if (out === a) {
|
||
var a01 = a[1]
|
||
, a02 = a[2]
|
||
, a03 = a[3];
|
||
var a12 = a[6]
|
||
, a13 = a[7];
|
||
var a23 = a[11];
|
||
out[1] = a[4];
|
||
out[2] = a[8];
|
||
out[3] = a[12];
|
||
out[4] = a01;
|
||
out[6] = a[9];
|
||
out[7] = a[13];
|
||
out[8] = a02;
|
||
out[9] = a12;
|
||
out[11] = a[14];
|
||
out[12] = a03;
|
||
out[13] = a13;
|
||
out[14] = a23
|
||
} else {
|
||
out[0] = a[0];
|
||
out[1] = a[4];
|
||
out[2] = a[8];
|
||
out[3] = a[12];
|
||
out[4] = a[1];
|
||
out[5] = a[5];
|
||
out[6] = a[9];
|
||
out[7] = a[13];
|
||
out[8] = a[2];
|
||
out[9] = a[6];
|
||
out[10] = a[10];
|
||
out[11] = a[14];
|
||
out[12] = a[3];
|
||
out[13] = a[7];
|
||
out[14] = a[11];
|
||
out[15] = a[15]
|
||
}
|
||
return out
|
||
}
|
||
function invert$3(out, a) {
|
||
var a00 = a[0]
|
||
, a01 = a[1]
|
||
, a02 = a[2]
|
||
, a03 = a[3];
|
||
var a10 = a[4]
|
||
, a11 = a[5]
|
||
, a12 = a[6]
|
||
, a13 = a[7];
|
||
var a20 = a[8]
|
||
, a21 = a[9]
|
||
, a22 = a[10]
|
||
, a23 = a[11];
|
||
var a30 = a[12]
|
||
, a31 = a[13]
|
||
, a32 = a[14]
|
||
, a33 = a[15];
|
||
var b00 = a00 * a11 - a01 * a10;
|
||
var b01 = a00 * a12 - a02 * a10;
|
||
var b02 = a00 * a13 - a03 * a10;
|
||
var b03 = a01 * a12 - a02 * a11;
|
||
var b04 = a01 * a13 - a03 * a11;
|
||
var b05 = a02 * a13 - a03 * a12;
|
||
var b06 = a20 * a31 - a21 * a30;
|
||
var b07 = a20 * a32 - a22 * a30;
|
||
var b08 = a20 * a33 - a23 * a30;
|
||
var b09 = a21 * a32 - a22 * a31;
|
||
var b10 = a21 * a33 - a23 * a31;
|
||
var b11 = a22 * a33 - a23 * a32;
|
||
var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
|
||
if (!det)
|
||
return null;
|
||
det = 1 / det;
|
||
out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
|
||
out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
|
||
out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
|
||
out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;
|
||
out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
|
||
out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
|
||
out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
|
||
out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;
|
||
out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
|
||
out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
|
||
out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
|
||
out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;
|
||
out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;
|
||
out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;
|
||
out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;
|
||
out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;
|
||
return out
|
||
}
|
||
function adjoint$2(out, a) {
|
||
var a00 = a[0]
|
||
, a01 = a[1]
|
||
, a02 = a[2]
|
||
, a03 = a[3];
|
||
var a10 = a[4]
|
||
, a11 = a[5]
|
||
, a12 = a[6]
|
||
, a13 = a[7];
|
||
var a20 = a[8]
|
||
, a21 = a[9]
|
||
, a22 = a[10]
|
||
, a23 = a[11];
|
||
var a30 = a[12]
|
||
, a31 = a[13]
|
||
, a32 = a[14]
|
||
, a33 = a[15];
|
||
out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);
|
||
out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));
|
||
out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);
|
||
out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));
|
||
out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));
|
||
out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);
|
||
out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));
|
||
out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);
|
||
out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);
|
||
out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));
|
||
out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);
|
||
out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));
|
||
out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));
|
||
out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);
|
||
out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));
|
||
out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);
|
||
return out
|
||
}
|
||
function determinant$3(a) {
|
||
var a00 = a[0]
|
||
, a01 = a[1]
|
||
, a02 = a[2]
|
||
, a03 = a[3];
|
||
var a10 = a[4]
|
||
, a11 = a[5]
|
||
, a12 = a[6]
|
||
, a13 = a[7];
|
||
var a20 = a[8]
|
||
, a21 = a[9]
|
||
, a22 = a[10]
|
||
, a23 = a[11];
|
||
var a30 = a[12]
|
||
, a31 = a[13]
|
||
, a32 = a[14]
|
||
, a33 = a[15];
|
||
var b00 = a00 * a11 - a01 * a10;
|
||
var b01 = a00 * a12 - a02 * a10;
|
||
var b02 = a00 * a13 - a03 * a10;
|
||
var b03 = a01 * a12 - a02 * a11;
|
||
var b04 = a01 * a13 - a03 * a11;
|
||
var b05 = a02 * a13 - a03 * a12;
|
||
var b06 = a20 * a31 - a21 * a30;
|
||
var b07 = a20 * a32 - a22 * a30;
|
||
var b08 = a20 * a33 - a23 * a30;
|
||
var b09 = a21 * a32 - a22 * a31;
|
||
var b10 = a21 * a33 - a23 * a31;
|
||
var b11 = a22 * a33 - a23 * a32;
|
||
return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06
|
||
}
|
||
function multiply$3(out, a, b) {
|
||
var a00 = a[0]
|
||
, a01 = a[1]
|
||
, a02 = a[2]
|
||
, a03 = a[3];
|
||
var a10 = a[4]
|
||
, a11 = a[5]
|
||
, a12 = a[6]
|
||
, a13 = a[7];
|
||
var a20 = a[8]
|
||
, a21 = a[9]
|
||
, a22 = a[10]
|
||
, a23 = a[11];
|
||
var a30 = a[12]
|
||
, a31 = a[13]
|
||
, a32 = a[14]
|
||
, a33 = a[15];
|
||
var b0 = b[0]
|
||
, b1 = b[1]
|
||
, b2 = b[2]
|
||
, b3 = b[3];
|
||
out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
|
||
out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
|
||
out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
|
||
out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
|
||
b0 = b[4];
|
||
b1 = b[5];
|
||
b2 = b[6];
|
||
b3 = b[7];
|
||
out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
|
||
out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
|
||
out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
|
||
out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
|
||
b0 = b[8];
|
||
b1 = b[9];
|
||
b2 = b[10];
|
||
b3 = b[11];
|
||
out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
|
||
out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
|
||
out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
|
||
out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
|
||
b0 = b[12];
|
||
b1 = b[13];
|
||
b2 = b[14];
|
||
b3 = b[15];
|
||
out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
|
||
out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
|
||
out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
|
||
out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
|
||
return out
|
||
}
|
||
function translate$2(out, a, v) {
|
||
var x = v[0]
|
||
, y = v[1]
|
||
, z = v[2];
|
||
var a00, a01, a02, a03;
|
||
var a10, a11, a12, a13;
|
||
var a20, a21, a22, a23;
|
||
if (a === out) {
|
||
out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
|
||
out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
|
||
out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
|
||
out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]
|
||
} else {
|
||
a00 = a[0];
|
||
a01 = a[1];
|
||
a02 = a[2];
|
||
a03 = a[3];
|
||
a10 = a[4];
|
||
a11 = a[5];
|
||
a12 = a[6];
|
||
a13 = a[7];
|
||
a20 = a[8];
|
||
a21 = a[9];
|
||
a22 = a[10];
|
||
a23 = a[11];
|
||
out[0] = a00;
|
||
out[1] = a01;
|
||
out[2] = a02;
|
||
out[3] = a03;
|
||
out[4] = a10;
|
||
out[5] = a11;
|
||
out[6] = a12;
|
||
out[7] = a13;
|
||
out[8] = a20;
|
||
out[9] = a21;
|
||
out[10] = a22;
|
||
out[11] = a23;
|
||
out[12] = a00 * x + a10 * y + a20 * z + a[12];
|
||
out[13] = a01 * x + a11 * y + a21 * z + a[13];
|
||
out[14] = a02 * x + a12 * y + a22 * z + a[14];
|
||
out[15] = a03 * x + a13 * y + a23 * z + a[15]
|
||
}
|
||
return out
|
||
}
|
||
function scale$3(out, a, v) {
|
||
var x = v[0]
|
||
, y = v[1]
|
||
, z = v[2];
|
||
out[0] = a[0] * x;
|
||
out[1] = a[1] * x;
|
||
out[2] = a[2] * x;
|
||
out[3] = a[3] * x;
|
||
out[4] = a[4] * y;
|
||
out[5] = a[5] * y;
|
||
out[6] = a[6] * y;
|
||
out[7] = a[7] * y;
|
||
out[8] = a[8] * z;
|
||
out[9] = a[9] * z;
|
||
out[10] = a[10] * z;
|
||
out[11] = a[11] * z;
|
||
out[12] = a[12];
|
||
out[13] = a[13];
|
||
out[14] = a[14];
|
||
out[15] = a[15];
|
||
return out
|
||
}
|
||
function rotate$3(out, a, rad, axis) {
|
||
var x = axis[0]
|
||
, y = axis[1]
|
||
, z = axis[2];
|
||
var len = Math.hypot(x, y, z);
|
||
var s, c, t;
|
||
var a00, a01, a02, a03;
|
||
var a10, a11, a12, a13;
|
||
var a20, a21, a22, a23;
|
||
var b00, b01, b02;
|
||
var b10, b11, b12;
|
||
var b20, b21, b22;
|
||
if (len < EPSILON)
|
||
return null;
|
||
len = 1 / len;
|
||
x *= len;
|
||
y *= len;
|
||
z *= len;
|
||
s = Math.sin(rad);
|
||
c = Math.cos(rad);
|
||
t = 1 - c;
|
||
a00 = a[0];
|
||
a01 = a[1];
|
||
a02 = a[2];
|
||
a03 = a[3];
|
||
a10 = a[4];
|
||
a11 = a[5];
|
||
a12 = a[6];
|
||
a13 = a[7];
|
||
a20 = a[8];
|
||
a21 = a[9];
|
||
a22 = a[10];
|
||
a23 = a[11];
|
||
b00 = x * x * t + c;
|
||
b01 = y * x * t + z * s;
|
||
b02 = z * x * t - y * s;
|
||
b10 = x * y * t - z * s;
|
||
b11 = y * y * t + c;
|
||
b12 = z * y * t + x * s;
|
||
b20 = x * z * t + y * s;
|
||
b21 = y * z * t - x * s;
|
||
b22 = z * z * t + c;
|
||
out[0] = a00 * b00 + a10 * b01 + a20 * b02;
|
||
out[1] = a01 * b00 + a11 * b01 + a21 * b02;
|
||
out[2] = a02 * b00 + a12 * b01 + a22 * b02;
|
||
out[3] = a03 * b00 + a13 * b01 + a23 * b02;
|
||
out[4] = a00 * b10 + a10 * b11 + a20 * b12;
|
||
out[5] = a01 * b10 + a11 * b11 + a21 * b12;
|
||
out[6] = a02 * b10 + a12 * b11 + a22 * b12;
|
||
out[7] = a03 * b10 + a13 * b11 + a23 * b12;
|
||
out[8] = a00 * b20 + a10 * b21 + a20 * b22;
|
||
out[9] = a01 * b20 + a11 * b21 + a21 * b22;
|
||
out[10] = a02 * b20 + a12 * b21 + a22 * b22;
|
||
out[11] = a03 * b20 + a13 * b21 + a23 * b22;
|
||
if (a !== out) {
|
||
out[12] = a[12];
|
||
out[13] = a[13];
|
||
out[14] = a[14];
|
||
out[15] = a[15]
|
||
}
|
||
return out
|
||
}
|
||
function rotateX(out, a, rad) {
|
||
var s = Math.sin(rad);
|
||
var c = Math.cos(rad);
|
||
var a10 = a[4];
|
||
var a11 = a[5];
|
||
var a12 = a[6];
|
||
var a13 = a[7];
|
||
var a20 = a[8];
|
||
var a21 = a[9];
|
||
var a22 = a[10];
|
||
var a23 = a[11];
|
||
if (a !== out) {
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[3];
|
||
out[12] = a[12];
|
||
out[13] = a[13];
|
||
out[14] = a[14];
|
||
out[15] = a[15]
|
||
}
|
||
out[4] = a10 * c + a20 * s;
|
||
out[5] = a11 * c + a21 * s;
|
||
out[6] = a12 * c + a22 * s;
|
||
out[7] = a13 * c + a23 * s;
|
||
out[8] = a20 * c - a10 * s;
|
||
out[9] = a21 * c - a11 * s;
|
||
out[10] = a22 * c - a12 * s;
|
||
out[11] = a23 * c - a13 * s;
|
||
return out
|
||
}
|
||
function rotateY(out, a, rad) {
|
||
var s = Math.sin(rad);
|
||
var c = Math.cos(rad);
|
||
var a00 = a[0];
|
||
var a01 = a[1];
|
||
var a02 = a[2];
|
||
var a03 = a[3];
|
||
var a20 = a[8];
|
||
var a21 = a[9];
|
||
var a22 = a[10];
|
||
var a23 = a[11];
|
||
if (a !== out) {
|
||
out[4] = a[4];
|
||
out[5] = a[5];
|
||
out[6] = a[6];
|
||
out[7] = a[7];
|
||
out[12] = a[12];
|
||
out[13] = a[13];
|
||
out[14] = a[14];
|
||
out[15] = a[15]
|
||
}
|
||
out[0] = a00 * c - a20 * s;
|
||
out[1] = a01 * c - a21 * s;
|
||
out[2] = a02 * c - a22 * s;
|
||
out[3] = a03 * c - a23 * s;
|
||
out[8] = a00 * s + a20 * c;
|
||
out[9] = a01 * s + a21 * c;
|
||
out[10] = a02 * s + a22 * c;
|
||
out[11] = a03 * s + a23 * c;
|
||
return out
|
||
}
|
||
function rotateZ(out, a, rad) {
|
||
var s = Math.sin(rad);
|
||
var c = Math.cos(rad);
|
||
var a00 = a[0];
|
||
var a01 = a[1];
|
||
var a02 = a[2];
|
||
var a03 = a[3];
|
||
var a10 = a[4];
|
||
var a11 = a[5];
|
||
var a12 = a[6];
|
||
var a13 = a[7];
|
||
if (a !== out) {
|
||
out[8] = a[8];
|
||
out[9] = a[9];
|
||
out[10] = a[10];
|
||
out[11] = a[11];
|
||
out[12] = a[12];
|
||
out[13] = a[13];
|
||
out[14] = a[14];
|
||
out[15] = a[15]
|
||
}
|
||
out[0] = a00 * c + a10 * s;
|
||
out[1] = a01 * c + a11 * s;
|
||
out[2] = a02 * c + a12 * s;
|
||
out[3] = a03 * c + a13 * s;
|
||
out[4] = a10 * c - a00 * s;
|
||
out[5] = a11 * c - a01 * s;
|
||
out[6] = a12 * c - a02 * s;
|
||
out[7] = a13 * c - a03 * s;
|
||
return out
|
||
}
|
||
function fromTranslation$2(out, v) {
|
||
out[0] = 1;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = 0;
|
||
out[5] = 1;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = 0;
|
||
out[9] = 0;
|
||
out[10] = 1;
|
||
out[11] = 0;
|
||
out[12] = v[0];
|
||
out[13] = v[1];
|
||
out[14] = v[2];
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function fromScaling$3(out, v) {
|
||
out[0] = v[0];
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = 0;
|
||
out[5] = v[1];
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = 0;
|
||
out[9] = 0;
|
||
out[10] = v[2];
|
||
out[11] = 0;
|
||
out[12] = 0;
|
||
out[13] = 0;
|
||
out[14] = 0;
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function fromRotation$3(out, rad, axis) {
|
||
var x = axis[0]
|
||
, y = axis[1]
|
||
, z = axis[2];
|
||
var len = Math.hypot(x, y, z);
|
||
var s, c, t;
|
||
if (len < EPSILON)
|
||
return null;
|
||
len = 1 / len;
|
||
x *= len;
|
||
y *= len;
|
||
z *= len;
|
||
s = Math.sin(rad);
|
||
c = Math.cos(rad);
|
||
t = 1 - c;
|
||
out[0] = x * x * t + c;
|
||
out[1] = y * x * t + z * s;
|
||
out[2] = z * x * t - y * s;
|
||
out[3] = 0;
|
||
out[4] = x * y * t - z * s;
|
||
out[5] = y * y * t + c;
|
||
out[6] = z * y * t + x * s;
|
||
out[7] = 0;
|
||
out[8] = x * z * t + y * s;
|
||
out[9] = y * z * t - x * s;
|
||
out[10] = z * z * t + c;
|
||
out[11] = 0;
|
||
out[12] = 0;
|
||
out[13] = 0;
|
||
out[14] = 0;
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function fromXRotation(out, rad) {
|
||
var s = Math.sin(rad);
|
||
var c = Math.cos(rad);
|
||
out[0] = 1;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = 0;
|
||
out[5] = c;
|
||
out[6] = s;
|
||
out[7] = 0;
|
||
out[8] = 0;
|
||
out[9] = -s;
|
||
out[10] = c;
|
||
out[11] = 0;
|
||
out[12] = 0;
|
||
out[13] = 0;
|
||
out[14] = 0;
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function fromYRotation(out, rad) {
|
||
var s = Math.sin(rad);
|
||
var c = Math.cos(rad);
|
||
out[0] = c;
|
||
out[1] = 0;
|
||
out[2] = -s;
|
||
out[3] = 0;
|
||
out[4] = 0;
|
||
out[5] = 1;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = s;
|
||
out[9] = 0;
|
||
out[10] = c;
|
||
out[11] = 0;
|
||
out[12] = 0;
|
||
out[13] = 0;
|
||
out[14] = 0;
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function fromZRotation(out, rad) {
|
||
var s = Math.sin(rad);
|
||
var c = Math.cos(rad);
|
||
out[0] = c;
|
||
out[1] = s;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = -s;
|
||
out[5] = c;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = 0;
|
||
out[9] = 0;
|
||
out[10] = 1;
|
||
out[11] = 0;
|
||
out[12] = 0;
|
||
out[13] = 0;
|
||
out[14] = 0;
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function fromRotationTranslation(out, q, v) {
|
||
var x = q[0]
|
||
, y = q[1]
|
||
, z = q[2]
|
||
, w = q[3];
|
||
var x2 = x + x;
|
||
var y2 = y + y;
|
||
var z2 = z + z;
|
||
var xx = x * x2;
|
||
var xy = x * y2;
|
||
var xz = x * z2;
|
||
var yy = y * y2;
|
||
var yz = y * z2;
|
||
var zz = z * z2;
|
||
var wx = w * x2;
|
||
var wy = w * y2;
|
||
var wz = w * z2;
|
||
out[0] = 1 - (yy + zz);
|
||
out[1] = xy + wz;
|
||
out[2] = xz - wy;
|
||
out[3] = 0;
|
||
out[4] = xy - wz;
|
||
out[5] = 1 - (xx + zz);
|
||
out[6] = yz + wx;
|
||
out[7] = 0;
|
||
out[8] = xz + wy;
|
||
out[9] = yz - wx;
|
||
out[10] = 1 - (xx + yy);
|
||
out[11] = 0;
|
||
out[12] = v[0];
|
||
out[13] = v[1];
|
||
out[14] = v[2];
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function fromQuat2(out, a) {
|
||
var translation = new ARRAY_TYPE(3);
|
||
var bx = -a[0]
|
||
, by = -a[1]
|
||
, bz = -a[2]
|
||
, bw = a[3]
|
||
, ax = a[4]
|
||
, ay = a[5]
|
||
, az = a[6]
|
||
, aw = a[7];
|
||
var magnitude = bx * bx + by * by + bz * bz + bw * bw;
|
||
if (magnitude > 0) {
|
||
translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;
|
||
translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;
|
||
translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude
|
||
} else {
|
||
translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;
|
||
translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;
|
||
translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2
|
||
}
|
||
fromRotationTranslation(out, a, translation);
|
||
return out
|
||
}
|
||
function getTranslation(out, mat) {
|
||
out[0] = mat[12];
|
||
out[1] = mat[13];
|
||
out[2] = mat[14];
|
||
return out
|
||
}
|
||
function getScaling(out, mat) {
|
||
var m11 = mat[0];
|
||
var m12 = mat[1];
|
||
var m13 = mat[2];
|
||
var m21 = mat[4];
|
||
var m22 = mat[5];
|
||
var m23 = mat[6];
|
||
var m31 = mat[8];
|
||
var m32 = mat[9];
|
||
var m33 = mat[10];
|
||
out[0] = Math.hypot(m11, m12, m13);
|
||
out[1] = Math.hypot(m21, m22, m23);
|
||
out[2] = Math.hypot(m31, m32, m33);
|
||
return out
|
||
}
|
||
function getRotation(out, mat) {
|
||
var scaling = new ARRAY_TYPE(3);
|
||
getScaling(scaling, mat);
|
||
var is1 = 1 / scaling[0];
|
||
var is2 = 1 / scaling[1];
|
||
var is3 = 1 / scaling[2];
|
||
var sm11 = mat[0] * is1;
|
||
var sm12 = mat[1] * is2;
|
||
var sm13 = mat[2] * is3;
|
||
var sm21 = mat[4] * is1;
|
||
var sm22 = mat[5] * is2;
|
||
var sm23 = mat[6] * is3;
|
||
var sm31 = mat[8] * is1;
|
||
var sm32 = mat[9] * is2;
|
||
var sm33 = mat[10] * is3;
|
||
var trace = sm11 + sm22 + sm33;
|
||
var S = 0;
|
||
if (trace > 0) {
|
||
S = Math.sqrt(trace + 1) * 2;
|
||
out[3] = .25 * S;
|
||
out[0] = (sm23 - sm32) / S;
|
||
out[1] = (sm31 - sm13) / S;
|
||
out[2] = (sm12 - sm21) / S
|
||
} else if (sm11 > sm22 && sm11 > sm33) {
|
||
S = Math.sqrt(1 + sm11 - sm22 - sm33) * 2;
|
||
out[3] = (sm23 - sm32) / S;
|
||
out[0] = .25 * S;
|
||
out[1] = (sm12 + sm21) / S;
|
||
out[2] = (sm31 + sm13) / S
|
||
} else if (sm22 > sm33) {
|
||
S = Math.sqrt(1 + sm22 - sm11 - sm33) * 2;
|
||
out[3] = (sm31 - sm13) / S;
|
||
out[0] = (sm12 + sm21) / S;
|
||
out[1] = .25 * S;
|
||
out[2] = (sm23 + sm32) / S
|
||
} else {
|
||
S = Math.sqrt(1 + sm33 - sm11 - sm22) * 2;
|
||
out[3] = (sm12 - sm21) / S;
|
||
out[0] = (sm31 + sm13) / S;
|
||
out[1] = (sm23 + sm32) / S;
|
||
out[2] = .25 * S
|
||
}
|
||
return out
|
||
}
|
||
function fromRotationTranslationScale(out, q, v, s) {
|
||
var x = q[0]
|
||
, y = q[1]
|
||
, z = q[2]
|
||
, w = q[3];
|
||
var x2 = x + x;
|
||
var y2 = y + y;
|
||
var z2 = z + z;
|
||
var xx = x * x2;
|
||
var xy = x * y2;
|
||
var xz = x * z2;
|
||
var yy = y * y2;
|
||
var yz = y * z2;
|
||
var zz = z * z2;
|
||
var wx = w * x2;
|
||
var wy = w * y2;
|
||
var wz = w * z2;
|
||
var sx = s[0];
|
||
var sy = s[1];
|
||
var sz = s[2];
|
||
out[0] = (1 - (yy + zz)) * sx;
|
||
out[1] = (xy + wz) * sx;
|
||
out[2] = (xz - wy) * sx;
|
||
out[3] = 0;
|
||
out[4] = (xy - wz) * sy;
|
||
out[5] = (1 - (xx + zz)) * sy;
|
||
out[6] = (yz + wx) * sy;
|
||
out[7] = 0;
|
||
out[8] = (xz + wy) * sz;
|
||
out[9] = (yz - wx) * sz;
|
||
out[10] = (1 - (xx + yy)) * sz;
|
||
out[11] = 0;
|
||
out[12] = v[0];
|
||
out[13] = v[1];
|
||
out[14] = v[2];
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function fromRotationTranslationScaleOrigin(out, q, v, s, o) {
|
||
var x = q[0]
|
||
, y = q[1]
|
||
, z = q[2]
|
||
, w = q[3];
|
||
var x2 = x + x;
|
||
var y2 = y + y;
|
||
var z2 = z + z;
|
||
var xx = x * x2;
|
||
var xy = x * y2;
|
||
var xz = x * z2;
|
||
var yy = y * y2;
|
||
var yz = y * z2;
|
||
var zz = z * z2;
|
||
var wx = w * x2;
|
||
var wy = w * y2;
|
||
var wz = w * z2;
|
||
var sx = s[0];
|
||
var sy = s[1];
|
||
var sz = s[2];
|
||
var ox = o[0];
|
||
var oy = o[1];
|
||
var oz = o[2];
|
||
var out0 = (1 - (yy + zz)) * sx;
|
||
var out1 = (xy + wz) * sx;
|
||
var out2 = (xz - wy) * sx;
|
||
var out4 = (xy - wz) * sy;
|
||
var out5 = (1 - (xx + zz)) * sy;
|
||
var out6 = (yz + wx) * sy;
|
||
var out8 = (xz + wy) * sz;
|
||
var out9 = (yz - wx) * sz;
|
||
var out10 = (1 - (xx + yy)) * sz;
|
||
out[0] = out0;
|
||
out[1] = out1;
|
||
out[2] = out2;
|
||
out[3] = 0;
|
||
out[4] = out4;
|
||
out[5] = out5;
|
||
out[6] = out6;
|
||
out[7] = 0;
|
||
out[8] = out8;
|
||
out[9] = out9;
|
||
out[10] = out10;
|
||
out[11] = 0;
|
||
out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);
|
||
out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);
|
||
out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function fromQuat$1(out, q) {
|
||
var x = q[0]
|
||
, y = q[1]
|
||
, z = q[2]
|
||
, w = q[3];
|
||
var x2 = x + x;
|
||
var y2 = y + y;
|
||
var z2 = z + z;
|
||
var xx = x * x2;
|
||
var yx = y * x2;
|
||
var yy = y * y2;
|
||
var zx = z * x2;
|
||
var zy = z * y2;
|
||
var zz = z * z2;
|
||
var wx = w * x2;
|
||
var wy = w * y2;
|
||
var wz = w * z2;
|
||
out[0] = 1 - yy - zz;
|
||
out[1] = yx + wz;
|
||
out[2] = zx - wy;
|
||
out[3] = 0;
|
||
out[4] = yx - wz;
|
||
out[5] = 1 - xx - zz;
|
||
out[6] = zy + wx;
|
||
out[7] = 0;
|
||
out[8] = zx + wy;
|
||
out[9] = zy - wx;
|
||
out[10] = 1 - xx - yy;
|
||
out[11] = 0;
|
||
out[12] = 0;
|
||
out[13] = 0;
|
||
out[14] = 0;
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function frustum(out, left, right, bottom, top, near, far) {
|
||
var rl = 1 / (right - left);
|
||
var tb = 1 / (top - bottom);
|
||
var nf = 1 / (near - far);
|
||
out[0] = near * 2 * rl;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = 0;
|
||
out[5] = near * 2 * tb;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = (right + left) * rl;
|
||
out[9] = (top + bottom) * tb;
|
||
out[10] = (far + near) * nf;
|
||
out[11] = -1;
|
||
out[12] = 0;
|
||
out[13] = 0;
|
||
out[14] = far * near * 2 * nf;
|
||
out[15] = 0;
|
||
return out
|
||
}
|
||
function perspective(out, fovy, aspect, near, far) {
|
||
var f = 1 / Math.tan(fovy / 2), nf;
|
||
out[0] = f / aspect;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = 0;
|
||
out[5] = f;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = 0;
|
||
out[9] = 0;
|
||
out[11] = -1;
|
||
out[12] = 0;
|
||
out[13] = 0;
|
||
out[15] = 0;
|
||
if (far != null && far !== Infinity) {
|
||
nf = 1 / (near - far);
|
||
out[10] = (far + near) * nf;
|
||
out[14] = 2 * far * near * nf
|
||
} else {
|
||
out[10] = -1;
|
||
out[14] = -2 * near
|
||
}
|
||
return out
|
||
}
|
||
function perspectiveFromFieldOfView(out, fov, near, far) {
|
||
var upTan = Math.tan(fov.upDegrees * Math.PI / 180);
|
||
var downTan = Math.tan(fov.downDegrees * Math.PI / 180);
|
||
var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180);
|
||
var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180);
|
||
var xScale = 2 / (leftTan + rightTan);
|
||
var yScale = 2 / (upTan + downTan);
|
||
out[0] = xScale;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = 0;
|
||
out[5] = yScale;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = -((leftTan - rightTan) * xScale * .5);
|
||
out[9] = (upTan - downTan) * yScale * .5;
|
||
out[10] = far / (near - far);
|
||
out[11] = -1;
|
||
out[12] = 0;
|
||
out[13] = 0;
|
||
out[14] = far * near / (near - far);
|
||
out[15] = 0;
|
||
return out
|
||
}
|
||
function ortho(out, left, right, bottom, top, near, far) {
|
||
var lr = 1 / (left - right);
|
||
var bt = 1 / (bottom - top);
|
||
var nf = 1 / (near - far);
|
||
out[0] = -2 * lr;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
out[4] = 0;
|
||
out[5] = -2 * bt;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
out[8] = 0;
|
||
out[9] = 0;
|
||
out[10] = 2 * nf;
|
||
out[11] = 0;
|
||
out[12] = (left + right) * lr;
|
||
out[13] = (top + bottom) * bt;
|
||
out[14] = (far + near) * nf;
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function lookAt(out, eye, center, up) {
|
||
var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;
|
||
var eyex = eye[0];
|
||
var eyey = eye[1];
|
||
var eyez = eye[2];
|
||
var upx = up[0];
|
||
var upy = up[1];
|
||
var upz = up[2];
|
||
var centerx = center[0];
|
||
var centery = center[1];
|
||
var centerz = center[2];
|
||
if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON)
|
||
return identity$3(out);
|
||
z0 = eyex - centerx;
|
||
z1 = eyey - centery;
|
||
z2 = eyez - centerz;
|
||
len = 1 / Math.hypot(z0, z1, z2);
|
||
z0 *= len;
|
||
z1 *= len;
|
||
z2 *= len;
|
||
x0 = upy * z2 - upz * z1;
|
||
x1 = upz * z0 - upx * z2;
|
||
x2 = upx * z1 - upy * z0;
|
||
len = Math.hypot(x0, x1, x2);
|
||
if (!len) {
|
||
x0 = 0;
|
||
x1 = 0;
|
||
x2 = 0
|
||
} else {
|
||
len = 1 / len;
|
||
x0 *= len;
|
||
x1 *= len;
|
||
x2 *= len
|
||
}
|
||
y0 = z1 * x2 - z2 * x1;
|
||
y1 = z2 * x0 - z0 * x2;
|
||
y2 = z0 * x1 - z1 * x0;
|
||
len = Math.hypot(y0, y1, y2);
|
||
if (!len) {
|
||
y0 = 0;
|
||
y1 = 0;
|
||
y2 = 0
|
||
} else {
|
||
len = 1 / len;
|
||
y0 *= len;
|
||
y1 *= len;
|
||
y2 *= len
|
||
}
|
||
out[0] = x0;
|
||
out[1] = y0;
|
||
out[2] = z0;
|
||
out[3] = 0;
|
||
out[4] = x1;
|
||
out[5] = y1;
|
||
out[6] = z1;
|
||
out[7] = 0;
|
||
out[8] = x2;
|
||
out[9] = y2;
|
||
out[10] = z2;
|
||
out[11] = 0;
|
||
out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
|
||
out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
|
||
out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function targetTo(out, eye, target, up) {
|
||
var eyex = eye[0]
|
||
, eyey = eye[1]
|
||
, eyez = eye[2]
|
||
, upx = up[0]
|
||
, upy = up[1]
|
||
, upz = up[2];
|
||
var z0 = eyex - target[0]
|
||
, z1 = eyey - target[1]
|
||
, z2 = eyez - target[2];
|
||
var len = z0 * z0 + z1 * z1 + z2 * z2;
|
||
if (len > 0) {
|
||
len = 1 / Math.sqrt(len);
|
||
z0 *= len;
|
||
z1 *= len;
|
||
z2 *= len
|
||
}
|
||
var x0 = upy * z2 - upz * z1
|
||
, x1 = upz * z0 - upx * z2
|
||
, x2 = upx * z1 - upy * z0;
|
||
len = x0 * x0 + x1 * x1 + x2 * x2;
|
||
if (len > 0) {
|
||
len = 1 / Math.sqrt(len);
|
||
x0 *= len;
|
||
x1 *= len;
|
||
x2 *= len
|
||
}
|
||
out[0] = x0;
|
||
out[1] = x1;
|
||
out[2] = x2;
|
||
out[3] = 0;
|
||
out[4] = z1 * x2 - z2 * x1;
|
||
out[5] = z2 * x0 - z0 * x2;
|
||
out[6] = z0 * x1 - z1 * x0;
|
||
out[7] = 0;
|
||
out[8] = z0;
|
||
out[9] = z1;
|
||
out[10] = z2;
|
||
out[11] = 0;
|
||
out[12] = eyex;
|
||
out[13] = eyey;
|
||
out[14] = eyez;
|
||
out[15] = 1;
|
||
return out
|
||
}
|
||
function str$3(a) {
|
||
return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")"
|
||
}
|
||
function frob$3(a) {
|
||
return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15])
|
||
}
|
||
function add$3(out, a, b) {
|
||
out[0] = a[0] + b[0];
|
||
out[1] = a[1] + b[1];
|
||
out[2] = a[2] + b[2];
|
||
out[3] = a[3] + b[3];
|
||
out[4] = a[4] + b[4];
|
||
out[5] = a[5] + b[5];
|
||
out[6] = a[6] + b[6];
|
||
out[7] = a[7] + b[7];
|
||
out[8] = a[8] + b[8];
|
||
out[9] = a[9] + b[9];
|
||
out[10] = a[10] + b[10];
|
||
out[11] = a[11] + b[11];
|
||
out[12] = a[12] + b[12];
|
||
out[13] = a[13] + b[13];
|
||
out[14] = a[14] + b[14];
|
||
out[15] = a[15] + b[15];
|
||
return out
|
||
}
|
||
function subtract$3(out, a, b) {
|
||
out[0] = a[0] - b[0];
|
||
out[1] = a[1] - b[1];
|
||
out[2] = a[2] - b[2];
|
||
out[3] = a[3] - b[3];
|
||
out[4] = a[4] - b[4];
|
||
out[5] = a[5] - b[5];
|
||
out[6] = a[6] - b[6];
|
||
out[7] = a[7] - b[7];
|
||
out[8] = a[8] - b[8];
|
||
out[9] = a[9] - b[9];
|
||
out[10] = a[10] - b[10];
|
||
out[11] = a[11] - b[11];
|
||
out[12] = a[12] - b[12];
|
||
out[13] = a[13] - b[13];
|
||
out[14] = a[14] - b[14];
|
||
out[15] = a[15] - b[15];
|
||
return out
|
||
}
|
||
function multiplyScalar$3(out, a, b) {
|
||
out[0] = a[0] * b;
|
||
out[1] = a[1] * b;
|
||
out[2] = a[2] * b;
|
||
out[3] = a[3] * b;
|
||
out[4] = a[4] * b;
|
||
out[5] = a[5] * b;
|
||
out[6] = a[6] * b;
|
||
out[7] = a[7] * b;
|
||
out[8] = a[8] * b;
|
||
out[9] = a[9] * b;
|
||
out[10] = a[10] * b;
|
||
out[11] = a[11] * b;
|
||
out[12] = a[12] * b;
|
||
out[13] = a[13] * b;
|
||
out[14] = a[14] * b;
|
||
out[15] = a[15] * b;
|
||
return out
|
||
}
|
||
function multiplyScalarAndAdd$3(out, a, b, scale) {
|
||
out[0] = a[0] + b[0] * scale;
|
||
out[1] = a[1] + b[1] * scale;
|
||
out[2] = a[2] + b[2] * scale;
|
||
out[3] = a[3] + b[3] * scale;
|
||
out[4] = a[4] + b[4] * scale;
|
||
out[5] = a[5] + b[5] * scale;
|
||
out[6] = a[6] + b[6] * scale;
|
||
out[7] = a[7] + b[7] * scale;
|
||
out[8] = a[8] + b[8] * scale;
|
||
out[9] = a[9] + b[9] * scale;
|
||
out[10] = a[10] + b[10] * scale;
|
||
out[11] = a[11] + b[11] * scale;
|
||
out[12] = a[12] + b[12] * scale;
|
||
out[13] = a[13] + b[13] * scale;
|
||
out[14] = a[14] + b[14] * scale;
|
||
out[15] = a[15] + b[15] * scale;
|
||
return out
|
||
}
|
||
function exactEquals$3(a, b) {
|
||
return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]
|
||
}
|
||
function equals$4(a, b) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3];
|
||
var a4 = a[4]
|
||
, a5 = a[5]
|
||
, a6 = a[6]
|
||
, a7 = a[7];
|
||
var a8 = a[8]
|
||
, a9 = a[9]
|
||
, a10 = a[10]
|
||
, a11 = a[11];
|
||
var a12 = a[12]
|
||
, a13 = a[13]
|
||
, a14 = a[14]
|
||
, a15 = a[15];
|
||
var b0 = b[0]
|
||
, b1 = b[1]
|
||
, b2 = b[2]
|
||
, b3 = b[3];
|
||
var b4 = b[4]
|
||
, b5 = b[5]
|
||
, b6 = b[6]
|
||
, b7 = b[7];
|
||
var b8 = b[8]
|
||
, b9 = b[9]
|
||
, b10 = b[10]
|
||
, b11 = b[11];
|
||
var b12 = b[12]
|
||
, b13 = b[13]
|
||
, b14 = b[14]
|
||
, b15 = b[15];
|
||
return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1, Math.abs(a15), Math.abs(b15))
|
||
}
|
||
var mul$3 = multiply$3;
|
||
var sub$3 = subtract$3;
|
||
var mat4 = Object.freeze({
|
||
__proto__: null,
|
||
create: create$3,
|
||
clone: clone$3,
|
||
copy: copy$3,
|
||
fromValues: fromValues$3,
|
||
set: set$3,
|
||
identity: identity$3,
|
||
transpose: transpose$2,
|
||
invert: invert$3,
|
||
adjoint: adjoint$2,
|
||
determinant: determinant$3,
|
||
multiply: multiply$3,
|
||
translate: translate$2,
|
||
scale: scale$3,
|
||
rotate: rotate$3,
|
||
rotateX: rotateX,
|
||
rotateY: rotateY,
|
||
rotateZ: rotateZ,
|
||
fromTranslation: fromTranslation$2,
|
||
fromScaling: fromScaling$3,
|
||
fromRotation: fromRotation$3,
|
||
fromXRotation: fromXRotation,
|
||
fromYRotation: fromYRotation,
|
||
fromZRotation: fromZRotation,
|
||
fromRotationTranslation: fromRotationTranslation,
|
||
fromQuat2: fromQuat2,
|
||
getTranslation: getTranslation,
|
||
getScaling: getScaling,
|
||
getRotation: getRotation,
|
||
fromRotationTranslationScale: fromRotationTranslationScale,
|
||
fromRotationTranslationScaleOrigin: fromRotationTranslationScaleOrigin,
|
||
fromQuat: fromQuat$1,
|
||
frustum: frustum,
|
||
perspective: perspective,
|
||
perspectiveFromFieldOfView: perspectiveFromFieldOfView,
|
||
ortho: ortho,
|
||
lookAt: lookAt,
|
||
targetTo: targetTo,
|
||
str: str$3,
|
||
frob: frob$3,
|
||
add: add$3,
|
||
subtract: subtract$3,
|
||
multiplyScalar: multiplyScalar$3,
|
||
multiplyScalarAndAdd: multiplyScalarAndAdd$3,
|
||
exactEquals: exactEquals$3,
|
||
equals: equals$4,
|
||
mul: mul$3,
|
||
sub: sub$3
|
||
});
|
||
function create$4() {
|
||
var out = new ARRAY_TYPE(3);
|
||
if (ARRAY_TYPE != Float32Array) {
|
||
out[0] = 0;
|
||
out[1] = 0;
|
||
out[2] = 0
|
||
}
|
||
return out
|
||
}
|
||
function clone$4(a) {
|
||
var out = new ARRAY_TYPE(3);
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
return out
|
||
}
|
||
function length(a) {
|
||
var x = a[0];
|
||
var y = a[1];
|
||
var z = a[2];
|
||
return Math.hypot(x, y, z)
|
||
}
|
||
function fromValues$4(x, y, z) {
|
||
var out = new ARRAY_TYPE(3);
|
||
out[0] = x;
|
||
out[1] = y;
|
||
out[2] = z;
|
||
return out
|
||
}
|
||
function copy$4(out, a) {
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
return out
|
||
}
|
||
function set$4(out, x, y, z) {
|
||
out[0] = x;
|
||
out[1] = y;
|
||
out[2] = z;
|
||
return out
|
||
}
|
||
function add$4(out, a, b) {
|
||
out[0] = a[0] + b[0];
|
||
out[1] = a[1] + b[1];
|
||
out[2] = a[2] + b[2];
|
||
return out
|
||
}
|
||
function subtract$4(out, a, b) {
|
||
out[0] = a[0] - b[0];
|
||
out[1] = a[1] - b[1];
|
||
out[2] = a[2] - b[2];
|
||
return out
|
||
}
|
||
function multiply$4(out, a, b) {
|
||
out[0] = a[0] * b[0];
|
||
out[1] = a[1] * b[1];
|
||
out[2] = a[2] * b[2];
|
||
return out
|
||
}
|
||
function divide(out, a, b) {
|
||
out[0] = a[0] / b[0];
|
||
out[1] = a[1] / b[1];
|
||
out[2] = a[2] / b[2];
|
||
return out
|
||
}
|
||
function ceil(out, a) {
|
||
out[0] = Math.ceil(a[0]);
|
||
out[1] = Math.ceil(a[1]);
|
||
out[2] = Math.ceil(a[2]);
|
||
return out
|
||
}
|
||
function floor(out, a) {
|
||
out[0] = Math.floor(a[0]);
|
||
out[1] = Math.floor(a[1]);
|
||
out[2] = Math.floor(a[2]);
|
||
return out
|
||
}
|
||
function min(out, a, b) {
|
||
out[0] = Math.min(a[0], b[0]);
|
||
out[1] = Math.min(a[1], b[1]);
|
||
out[2] = Math.min(a[2], b[2]);
|
||
return out
|
||
}
|
||
function max(out, a, b) {
|
||
out[0] = Math.max(a[0], b[0]);
|
||
out[1] = Math.max(a[1], b[1]);
|
||
out[2] = Math.max(a[2], b[2]);
|
||
return out
|
||
}
|
||
function round(out, a) {
|
||
out[0] = Math.round(a[0]);
|
||
out[1] = Math.round(a[1]);
|
||
out[2] = Math.round(a[2]);
|
||
return out
|
||
}
|
||
function scale$4(out, a, b) {
|
||
out[0] = a[0] * b;
|
||
out[1] = a[1] * b;
|
||
out[2] = a[2] * b;
|
||
return out
|
||
}
|
||
function scaleAndAdd(out, a, b, scale) {
|
||
out[0] = a[0] + b[0] * scale;
|
||
out[1] = a[1] + b[1] * scale;
|
||
out[2] = a[2] + b[2] * scale;
|
||
return out
|
||
}
|
||
function distance(a, b) {
|
||
var x = b[0] - a[0];
|
||
var y = b[1] - a[1];
|
||
var z = b[2] - a[2];
|
||
return Math.hypot(x, y, z)
|
||
}
|
||
function squaredDistance(a, b) {
|
||
var x = b[0] - a[0];
|
||
var y = b[1] - a[1];
|
||
var z = b[2] - a[2];
|
||
return x * x + y * y + z * z
|
||
}
|
||
function squaredLength(a) {
|
||
var x = a[0];
|
||
var y = a[1];
|
||
var z = a[2];
|
||
return x * x + y * y + z * z
|
||
}
|
||
function negate(out, a) {
|
||
out[0] = -a[0];
|
||
out[1] = -a[1];
|
||
out[2] = -a[2];
|
||
return out
|
||
}
|
||
function inverse(out, a) {
|
||
out[0] = 1 / a[0];
|
||
out[1] = 1 / a[1];
|
||
out[2] = 1 / a[2];
|
||
return out
|
||
}
|
||
function normalize(out, a) {
|
||
var x = a[0];
|
||
var y = a[1];
|
||
var z = a[2];
|
||
var len = x * x + y * y + z * z;
|
||
if (len > 0)
|
||
len = 1 / Math.sqrt(len);
|
||
out[0] = a[0] * len;
|
||
out[1] = a[1] * len;
|
||
out[2] = a[2] * len;
|
||
return out
|
||
}
|
||
function dot(a, b) {
|
||
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
|
||
}
|
||
function cross(out, a, b) {
|
||
var ax = a[0]
|
||
, ay = a[1]
|
||
, az = a[2];
|
||
var bx = b[0]
|
||
, by = b[1]
|
||
, bz = b[2];
|
||
out[0] = ay * bz - az * by;
|
||
out[1] = az * bx - ax * bz;
|
||
out[2] = ax * by - ay * bx;
|
||
return out
|
||
}
|
||
function lerp(out, a, b, t) {
|
||
var ax = a[0];
|
||
var ay = a[1];
|
||
var az = a[2];
|
||
out[0] = ax + t * (b[0] - ax);
|
||
out[1] = ay + t * (b[1] - ay);
|
||
out[2] = az + t * (b[2] - az);
|
||
return out
|
||
}
|
||
function hermite(out, a, b, c, d, t) {
|
||
var factorTimes2 = t * t;
|
||
var factor1 = factorTimes2 * (2 * t - 3) + 1;
|
||
var factor2 = factorTimes2 * (t - 2) + t;
|
||
var factor3 = factorTimes2 * (t - 1);
|
||
var factor4 = factorTimes2 * (3 - 2 * t);
|
||
out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;
|
||
out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;
|
||
out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;
|
||
return out
|
||
}
|
||
function bezier(out, a, b, c, d, t) {
|
||
var inverseFactor = 1 - t;
|
||
var inverseFactorTimesTwo = inverseFactor * inverseFactor;
|
||
var factorTimes2 = t * t;
|
||
var factor1 = inverseFactorTimesTwo * inverseFactor;
|
||
var factor2 = 3 * t * inverseFactorTimesTwo;
|
||
var factor3 = 3 * factorTimes2 * inverseFactor;
|
||
var factor4 = factorTimes2 * t;
|
||
out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;
|
||
out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;
|
||
out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;
|
||
return out
|
||
}
|
||
function random(out, scale) {
|
||
scale = scale || 1;
|
||
var r = RANDOM() * 2 * Math.PI;
|
||
var z = RANDOM() * 2 - 1;
|
||
var zScale = Math.sqrt(1 - z * z) * scale;
|
||
out[0] = Math.cos(r) * zScale;
|
||
out[1] = Math.sin(r) * zScale;
|
||
out[2] = z * scale;
|
||
return out
|
||
}
|
||
function transformMat4(out, a, m) {
|
||
var x = a[0]
|
||
, y = a[1]
|
||
, z = a[2];
|
||
var w = m[3] * x + m[7] * y + m[11] * z + m[15];
|
||
w = w || 1;
|
||
out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;
|
||
out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;
|
||
out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;
|
||
return out
|
||
}
|
||
function transformMat3(out, a, m) {
|
||
var x = a[0]
|
||
, y = a[1]
|
||
, z = a[2];
|
||
out[0] = x * m[0] + y * m[3] + z * m[6];
|
||
out[1] = x * m[1] + y * m[4] + z * m[7];
|
||
out[2] = x * m[2] + y * m[5] + z * m[8];
|
||
return out
|
||
}
|
||
function transformQuat(out, a, q) {
|
||
var qx = q[0]
|
||
, qy = q[1]
|
||
, qz = q[2]
|
||
, qw = q[3];
|
||
var x = a[0]
|
||
, y = a[1]
|
||
, z = a[2];
|
||
var uvx = qy * z - qz * y
|
||
, uvy = qz * x - qx * z
|
||
, uvz = qx * y - qy * x;
|
||
var uuvx = qy * uvz - qz * uvy
|
||
, uuvy = qz * uvx - qx * uvz
|
||
, uuvz = qx * uvy - qy * uvx;
|
||
var w2 = qw * 2;
|
||
uvx *= w2;
|
||
uvy *= w2;
|
||
uvz *= w2;
|
||
uuvx *= 2;
|
||
uuvy *= 2;
|
||
uuvz *= 2;
|
||
out[0] = x + uvx + uuvx;
|
||
out[1] = y + uvy + uuvy;
|
||
out[2] = z + uvz + uuvz;
|
||
return out
|
||
}
|
||
function rotateX$1(out, a, b, rad) {
|
||
var p = []
|
||
, r = [];
|
||
p[0] = a[0] - b[0];
|
||
p[1] = a[1] - b[1];
|
||
p[2] = a[2] - b[2];
|
||
r[0] = p[0];
|
||
r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);
|
||
r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad);
|
||
out[0] = r[0] + b[0];
|
||
out[1] = r[1] + b[1];
|
||
out[2] = r[2] + b[2];
|
||
return out
|
||
}
|
||
function rotateY$1(out, a, b, rad) {
|
||
var p = []
|
||
, r = [];
|
||
p[0] = a[0] - b[0];
|
||
p[1] = a[1] - b[1];
|
||
p[2] = a[2] - b[2];
|
||
r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);
|
||
r[1] = p[1];
|
||
r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad);
|
||
out[0] = r[0] + b[0];
|
||
out[1] = r[1] + b[1];
|
||
out[2] = r[2] + b[2];
|
||
return out
|
||
}
|
||
function rotateZ$1(out, a, b, rad) {
|
||
var p = []
|
||
, r = [];
|
||
p[0] = a[0] - b[0];
|
||
p[1] = a[1] - b[1];
|
||
p[2] = a[2] - b[2];
|
||
r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);
|
||
r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);
|
||
r[2] = p[2];
|
||
out[0] = r[0] + b[0];
|
||
out[1] = r[1] + b[1];
|
||
out[2] = r[2] + b[2];
|
||
return out
|
||
}
|
||
function angle(a, b) {
|
||
var ax = a[0]
|
||
, ay = a[1]
|
||
, az = a[2]
|
||
, bx = b[0]
|
||
, by = b[1]
|
||
, bz = b[2]
|
||
, mag1 = Math.sqrt(ax * ax + ay * ay + az * az)
|
||
, mag2 = Math.sqrt(bx * bx + by * by + bz * bz)
|
||
, mag = mag1 * mag2
|
||
, cosine = mag && dot(a, b) / mag;
|
||
return Math.acos(Math.min(Math.max(cosine, -1), 1))
|
||
}
|
||
function zero(out) {
|
||
out[0] = 0;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
return out
|
||
}
|
||
function str$4(a) {
|
||
return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")"
|
||
}
|
||
function exactEquals$4(a, b) {
|
||
return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]
|
||
}
|
||
function equals$5(a, b) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2];
|
||
var b0 = b[0]
|
||
, b1 = b[1]
|
||
, b2 = b[2];
|
||
return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2))
|
||
}
|
||
var sub$4 = subtract$4;
|
||
var mul$4 = multiply$4;
|
||
var div = divide;
|
||
var dist = distance;
|
||
var sqrDist = squaredDistance;
|
||
var len = length;
|
||
var sqrLen = squaredLength;
|
||
var forEach = function() {
|
||
var vec = create$4();
|
||
return function(a, stride, offset, count, fn, arg) {
|
||
var i, l;
|
||
if (!stride)
|
||
stride = 3;
|
||
if (!offset)
|
||
offset = 0;
|
||
if (count)
|
||
l = Math.min(count * stride + offset, a.length);
|
||
else
|
||
l = a.length;
|
||
for (i = offset; i < l; i += stride) {
|
||
vec[0] = a[i];
|
||
vec[1] = a[i + 1];
|
||
vec[2] = a[i + 2];
|
||
fn(vec, vec, arg);
|
||
a[i] = vec[0];
|
||
a[i + 1] = vec[1];
|
||
a[i + 2] = vec[2]
|
||
}
|
||
return a
|
||
}
|
||
}();
|
||
var vec3 = Object.freeze({
|
||
__proto__: null,
|
||
create: create$4,
|
||
clone: clone$4,
|
||
length: length,
|
||
fromValues: fromValues$4,
|
||
copy: copy$4,
|
||
set: set$4,
|
||
add: add$4,
|
||
subtract: subtract$4,
|
||
multiply: multiply$4,
|
||
divide: divide,
|
||
ceil: ceil,
|
||
floor: floor,
|
||
min: min,
|
||
max: max,
|
||
round: round,
|
||
scale: scale$4,
|
||
scaleAndAdd: scaleAndAdd,
|
||
distance: distance,
|
||
squaredDistance: squaredDistance,
|
||
squaredLength: squaredLength,
|
||
negate: negate,
|
||
inverse: inverse,
|
||
normalize: normalize,
|
||
dot: dot,
|
||
cross: cross,
|
||
lerp: lerp,
|
||
hermite: hermite,
|
||
bezier: bezier,
|
||
random: random,
|
||
transformMat4: transformMat4,
|
||
transformMat3: transformMat3,
|
||
transformQuat: transformQuat,
|
||
rotateX: rotateX$1,
|
||
rotateY: rotateY$1,
|
||
rotateZ: rotateZ$1,
|
||
angle: angle,
|
||
zero: zero,
|
||
str: str$4,
|
||
exactEquals: exactEquals$4,
|
||
equals: equals$5,
|
||
sub: sub$4,
|
||
mul: mul$4,
|
||
div: div,
|
||
dist: dist,
|
||
sqrDist: sqrDist,
|
||
len: len,
|
||
sqrLen: sqrLen,
|
||
forEach: forEach
|
||
});
|
||
function create$5() {
|
||
var out = new ARRAY_TYPE(4);
|
||
if (ARRAY_TYPE != Float32Array) {
|
||
out[0] = 0;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0
|
||
}
|
||
return out
|
||
}
|
||
function clone$5(a) {
|
||
var out = new ARRAY_TYPE(4);
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[3];
|
||
return out
|
||
}
|
||
function fromValues$5(x, y, z, w) {
|
||
var out = new ARRAY_TYPE(4);
|
||
out[0] = x;
|
||
out[1] = y;
|
||
out[2] = z;
|
||
out[3] = w;
|
||
return out
|
||
}
|
||
function copy$5(out, a) {
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[3];
|
||
return out
|
||
}
|
||
function set$5(out, x, y, z, w) {
|
||
out[0] = x;
|
||
out[1] = y;
|
||
out[2] = z;
|
||
out[3] = w;
|
||
return out
|
||
}
|
||
function add$5(out, a, b) {
|
||
out[0] = a[0] + b[0];
|
||
out[1] = a[1] + b[1];
|
||
out[2] = a[2] + b[2];
|
||
out[3] = a[3] + b[3];
|
||
return out
|
||
}
|
||
function subtract$5(out, a, b) {
|
||
out[0] = a[0] - b[0];
|
||
out[1] = a[1] - b[1];
|
||
out[2] = a[2] - b[2];
|
||
out[3] = a[3] - b[3];
|
||
return out
|
||
}
|
||
function multiply$5(out, a, b) {
|
||
out[0] = a[0] * b[0];
|
||
out[1] = a[1] * b[1];
|
||
out[2] = a[2] * b[2];
|
||
out[3] = a[3] * b[3];
|
||
return out
|
||
}
|
||
function divide$1(out, a, b) {
|
||
out[0] = a[0] / b[0];
|
||
out[1] = a[1] / b[1];
|
||
out[2] = a[2] / b[2];
|
||
out[3] = a[3] / b[3];
|
||
return out
|
||
}
|
||
function ceil$1(out, a) {
|
||
out[0] = Math.ceil(a[0]);
|
||
out[1] = Math.ceil(a[1]);
|
||
out[2] = Math.ceil(a[2]);
|
||
out[3] = Math.ceil(a[3]);
|
||
return out
|
||
}
|
||
function floor$1(out, a) {
|
||
out[0] = Math.floor(a[0]);
|
||
out[1] = Math.floor(a[1]);
|
||
out[2] = Math.floor(a[2]);
|
||
out[3] = Math.floor(a[3]);
|
||
return out
|
||
}
|
||
function min$1(out, a, b) {
|
||
out[0] = Math.min(a[0], b[0]);
|
||
out[1] = Math.min(a[1], b[1]);
|
||
out[2] = Math.min(a[2], b[2]);
|
||
out[3] = Math.min(a[3], b[3]);
|
||
return out
|
||
}
|
||
function max$1(out, a, b) {
|
||
out[0] = Math.max(a[0], b[0]);
|
||
out[1] = Math.max(a[1], b[1]);
|
||
out[2] = Math.max(a[2], b[2]);
|
||
out[3] = Math.max(a[3], b[3]);
|
||
return out
|
||
}
|
||
function round$1(out, a) {
|
||
out[0] = Math.round(a[0]);
|
||
out[1] = Math.round(a[1]);
|
||
out[2] = Math.round(a[2]);
|
||
out[3] = Math.round(a[3]);
|
||
return out
|
||
}
|
||
function scale$5(out, a, b) {
|
||
out[0] = a[0] * b;
|
||
out[1] = a[1] * b;
|
||
out[2] = a[2] * b;
|
||
out[3] = a[3] * b;
|
||
return out
|
||
}
|
||
function scaleAndAdd$1(out, a, b, scale) {
|
||
out[0] = a[0] + b[0] * scale;
|
||
out[1] = a[1] + b[1] * scale;
|
||
out[2] = a[2] + b[2] * scale;
|
||
out[3] = a[3] + b[3] * scale;
|
||
return out
|
||
}
|
||
function distance$1(a, b) {
|
||
var x = b[0] - a[0];
|
||
var y = b[1] - a[1];
|
||
var z = b[2] - a[2];
|
||
var w = b[3] - a[3];
|
||
return Math.hypot(x, y, z, w)
|
||
}
|
||
function squaredDistance$1(a, b) {
|
||
var x = b[0] - a[0];
|
||
var y = b[1] - a[1];
|
||
var z = b[2] - a[2];
|
||
var w = b[3] - a[3];
|
||
return x * x + y * y + z * z + w * w
|
||
}
|
||
function length$1(a) {
|
||
var x = a[0];
|
||
var y = a[1];
|
||
var z = a[2];
|
||
var w = a[3];
|
||
return Math.hypot(x, y, z, w)
|
||
}
|
||
function squaredLength$1(a) {
|
||
var x = a[0];
|
||
var y = a[1];
|
||
var z = a[2];
|
||
var w = a[3];
|
||
return x * x + y * y + z * z + w * w
|
||
}
|
||
function negate$1(out, a) {
|
||
out[0] = -a[0];
|
||
out[1] = -a[1];
|
||
out[2] = -a[2];
|
||
out[3] = -a[3];
|
||
return out
|
||
}
|
||
function inverse$1(out, a) {
|
||
out[0] = 1 / a[0];
|
||
out[1] = 1 / a[1];
|
||
out[2] = 1 / a[2];
|
||
out[3] = 1 / a[3];
|
||
return out
|
||
}
|
||
function normalize$1(out, a) {
|
||
var x = a[0];
|
||
var y = a[1];
|
||
var z = a[2];
|
||
var w = a[3];
|
||
var len = x * x + y * y + z * z + w * w;
|
||
if (len > 0)
|
||
len = 1 / Math.sqrt(len);
|
||
out[0] = x * len;
|
||
out[1] = y * len;
|
||
out[2] = z * len;
|
||
out[3] = w * len;
|
||
return out
|
||
}
|
||
function dot$1(a, b) {
|
||
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]
|
||
}
|
||
function cross$1(out, u, v, w) {
|
||
var A = v[0] * w[1] - v[1] * w[0]
|
||
, B = v[0] * w[2] - v[2] * w[0]
|
||
, C = v[0] * w[3] - v[3] * w[0]
|
||
, D = v[1] * w[2] - v[2] * w[1]
|
||
, E = v[1] * w[3] - v[3] * w[1]
|
||
, F = v[2] * w[3] - v[3] * w[2];
|
||
var G = u[0];
|
||
var H = u[1];
|
||
var I = u[2];
|
||
var J = u[3];
|
||
out[0] = H * F - I * E + J * D;
|
||
out[1] = -(G * F) + I * C - J * B;
|
||
out[2] = G * E - H * C + J * A;
|
||
out[3] = -(G * D) + H * B - I * A;
|
||
return out
|
||
}
|
||
function lerp$1(out, a, b, t) {
|
||
var ax = a[0];
|
||
var ay = a[1];
|
||
var az = a[2];
|
||
var aw = a[3];
|
||
out[0] = ax + t * (b[0] - ax);
|
||
out[1] = ay + t * (b[1] - ay);
|
||
out[2] = az + t * (b[2] - az);
|
||
out[3] = aw + t * (b[3] - aw);
|
||
return out
|
||
}
|
||
function random$1(out, scale) {
|
||
scale = scale || 1;
|
||
var v1, v2, v3, v4;
|
||
var s1, s2;
|
||
do {
|
||
v1 = RANDOM() * 2 - 1;
|
||
v2 = RANDOM() * 2 - 1;
|
||
s1 = v1 * v1 + v2 * v2
|
||
} while (s1 >= 1);
|
||
do {
|
||
v3 = RANDOM() * 2 - 1;
|
||
v4 = RANDOM() * 2 - 1;
|
||
s2 = v3 * v3 + v4 * v4
|
||
} while (s2 >= 1);
|
||
var d = Math.sqrt((1 - s1) / s2);
|
||
out[0] = scale * v1;
|
||
out[1] = scale * v2;
|
||
out[2] = scale * v3 * d;
|
||
out[3] = scale * v4 * d;
|
||
return out
|
||
}
|
||
function transformMat4$1(out, a, m) {
|
||
var x = a[0]
|
||
, y = a[1]
|
||
, z = a[2]
|
||
, w = a[3];
|
||
out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
|
||
out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
|
||
out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
|
||
out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
|
||
return out
|
||
}
|
||
function transformQuat$1(out, a, q) {
|
||
var x = a[0]
|
||
, y = a[1]
|
||
, z = a[2];
|
||
var qx = q[0]
|
||
, qy = q[1]
|
||
, qz = q[2]
|
||
, qw = q[3];
|
||
var ix = qw * x + qy * z - qz * y;
|
||
var iy = qw * y + qz * x - qx * z;
|
||
var iz = qw * z + qx * y - qy * x;
|
||
var iw = -qx * x - qy * y - qz * z;
|
||
out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
|
||
out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
|
||
out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
|
||
out[3] = a[3];
|
||
return out
|
||
}
|
||
function zero$1(out) {
|
||
out[0] = 0;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 0;
|
||
return out
|
||
}
|
||
function str$5(a) {
|
||
return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"
|
||
}
|
||
function exactEquals$5(a, b) {
|
||
return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]
|
||
}
|
||
function equals$6(a, b) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3];
|
||
var b0 = b[0]
|
||
, b1 = b[1]
|
||
, b2 = b[2]
|
||
, b3 = b[3];
|
||
return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3))
|
||
}
|
||
var sub$5 = subtract$5;
|
||
var mul$5 = multiply$5;
|
||
var div$1 = divide$1;
|
||
var dist$1 = distance$1;
|
||
var sqrDist$1 = squaredDistance$1;
|
||
var len$1 = length$1;
|
||
var sqrLen$1 = squaredLength$1;
|
||
var forEach$1 = function() {
|
||
var vec = create$5();
|
||
return function(a, stride, offset, count, fn, arg) {
|
||
var i, l;
|
||
if (!stride)
|
||
stride = 4;
|
||
if (!offset)
|
||
offset = 0;
|
||
if (count)
|
||
l = Math.min(count * stride + offset, a.length);
|
||
else
|
||
l = a.length;
|
||
for (i = offset; i < l; i += stride) {
|
||
vec[0] = a[i];
|
||
vec[1] = a[i + 1];
|
||
vec[2] = a[i + 2];
|
||
vec[3] = a[i + 3];
|
||
fn(vec, vec, arg);
|
||
a[i] = vec[0];
|
||
a[i + 1] = vec[1];
|
||
a[i + 2] = vec[2];
|
||
a[i + 3] = vec[3]
|
||
}
|
||
return a
|
||
}
|
||
}();
|
||
var vec4 = Object.freeze({
|
||
__proto__: null,
|
||
create: create$5,
|
||
clone: clone$5,
|
||
fromValues: fromValues$5,
|
||
copy: copy$5,
|
||
set: set$5,
|
||
add: add$5,
|
||
subtract: subtract$5,
|
||
multiply: multiply$5,
|
||
divide: divide$1,
|
||
ceil: ceil$1,
|
||
floor: floor$1,
|
||
min: min$1,
|
||
max: max$1,
|
||
round: round$1,
|
||
scale: scale$5,
|
||
scaleAndAdd: scaleAndAdd$1,
|
||
distance: distance$1,
|
||
squaredDistance: squaredDistance$1,
|
||
length: length$1,
|
||
squaredLength: squaredLength$1,
|
||
negate: negate$1,
|
||
inverse: inverse$1,
|
||
normalize: normalize$1,
|
||
dot: dot$1,
|
||
cross: cross$1,
|
||
lerp: lerp$1,
|
||
random: random$1,
|
||
transformMat4: transformMat4$1,
|
||
transformQuat: transformQuat$1,
|
||
zero: zero$1,
|
||
str: str$5,
|
||
exactEquals: exactEquals$5,
|
||
equals: equals$6,
|
||
sub: sub$5,
|
||
mul: mul$5,
|
||
div: div$1,
|
||
dist: dist$1,
|
||
sqrDist: sqrDist$1,
|
||
len: len$1,
|
||
sqrLen: sqrLen$1,
|
||
forEach: forEach$1
|
||
});
|
||
function create$6() {
|
||
var out = new ARRAY_TYPE(4);
|
||
if (ARRAY_TYPE != Float32Array) {
|
||
out[0] = 0;
|
||
out[1] = 0;
|
||
out[2] = 0
|
||
}
|
||
out[3] = 1;
|
||
return out
|
||
}
|
||
function identity$4(out) {
|
||
out[0] = 0;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 1;
|
||
return out
|
||
}
|
||
function setAxisAngle(out, axis, rad) {
|
||
rad = rad * .5;
|
||
var s = Math.sin(rad);
|
||
out[0] = s * axis[0];
|
||
out[1] = s * axis[1];
|
||
out[2] = s * axis[2];
|
||
out[3] = Math.cos(rad);
|
||
return out
|
||
}
|
||
function getAxisAngle(out_axis, q) {
|
||
var rad = Math.acos(q[3]) * 2;
|
||
var s = Math.sin(rad / 2);
|
||
if (s > EPSILON) {
|
||
out_axis[0] = q[0] / s;
|
||
out_axis[1] = q[1] / s;
|
||
out_axis[2] = q[2] / s
|
||
} else {
|
||
out_axis[0] = 1;
|
||
out_axis[1] = 0;
|
||
out_axis[2] = 0
|
||
}
|
||
return rad
|
||
}
|
||
function getAngle(a, b) {
|
||
var dotproduct = dot$2(a, b);
|
||
return Math.acos(2 * dotproduct * dotproduct - 1)
|
||
}
|
||
function multiply$6(out, a, b) {
|
||
var ax = a[0]
|
||
, ay = a[1]
|
||
, az = a[2]
|
||
, aw = a[3];
|
||
var bx = b[0]
|
||
, by = b[1]
|
||
, bz = b[2]
|
||
, bw = b[3];
|
||
out[0] = ax * bw + aw * bx + ay * bz - az * by;
|
||
out[1] = ay * bw + aw * by + az * bx - ax * bz;
|
||
out[2] = az * bw + aw * bz + ax * by - ay * bx;
|
||
out[3] = aw * bw - ax * bx - ay * by - az * bz;
|
||
return out
|
||
}
|
||
function rotateX$2(out, a, rad) {
|
||
rad *= .5;
|
||
var ax = a[0]
|
||
, ay = a[1]
|
||
, az = a[2]
|
||
, aw = a[3];
|
||
var bx = Math.sin(rad)
|
||
, bw = Math.cos(rad);
|
||
out[0] = ax * bw + aw * bx;
|
||
out[1] = ay * bw + az * bx;
|
||
out[2] = az * bw - ay * bx;
|
||
out[3] = aw * bw - ax * bx;
|
||
return out
|
||
}
|
||
function rotateY$2(out, a, rad) {
|
||
rad *= .5;
|
||
var ax = a[0]
|
||
, ay = a[1]
|
||
, az = a[2]
|
||
, aw = a[3];
|
||
var by = Math.sin(rad)
|
||
, bw = Math.cos(rad);
|
||
out[0] = ax * bw - az * by;
|
||
out[1] = ay * bw + aw * by;
|
||
out[2] = az * bw + ax * by;
|
||
out[3] = aw * bw - ay * by;
|
||
return out
|
||
}
|
||
function rotateZ$2(out, a, rad) {
|
||
rad *= .5;
|
||
var ax = a[0]
|
||
, ay = a[1]
|
||
, az = a[2]
|
||
, aw = a[3];
|
||
var bz = Math.sin(rad)
|
||
, bw = Math.cos(rad);
|
||
out[0] = ax * bw + ay * bz;
|
||
out[1] = ay * bw - ax * bz;
|
||
out[2] = az * bw + aw * bz;
|
||
out[3] = aw * bw - az * bz;
|
||
return out
|
||
}
|
||
function calculateW(out, a) {
|
||
var x = a[0]
|
||
, y = a[1]
|
||
, z = a[2];
|
||
out[0] = x;
|
||
out[1] = y;
|
||
out[2] = z;
|
||
out[3] = Math.sqrt(Math.abs(1 - x * x - y * y - z * z));
|
||
return out
|
||
}
|
||
function exp(out, a) {
|
||
var x = a[0]
|
||
, y = a[1]
|
||
, z = a[2]
|
||
, w = a[3];
|
||
var r = Math.sqrt(x * x + y * y + z * z);
|
||
var et = Math.exp(w);
|
||
var s = r > 0 ? et * Math.sin(r) / r : 0;
|
||
out[0] = x * s;
|
||
out[1] = y * s;
|
||
out[2] = z * s;
|
||
out[3] = et * Math.cos(r);
|
||
return out
|
||
}
|
||
function ln(out, a) {
|
||
var x = a[0]
|
||
, y = a[1]
|
||
, z = a[2]
|
||
, w = a[3];
|
||
var r = Math.sqrt(x * x + y * y + z * z);
|
||
var t = r > 0 ? Math.atan2(r, w) / r : 0;
|
||
out[0] = x * t;
|
||
out[1] = y * t;
|
||
out[2] = z * t;
|
||
out[3] = .5 * Math.log(x * x + y * y + z * z + w * w);
|
||
return out
|
||
}
|
||
function pow(out, a, b) {
|
||
ln(out, a);
|
||
scale$6(out, out, b);
|
||
exp(out, out);
|
||
return out
|
||
}
|
||
function slerp(out, a, b, t) {
|
||
var ax = a[0]
|
||
, ay = a[1]
|
||
, az = a[2]
|
||
, aw = a[3];
|
||
var bx = b[0]
|
||
, by = b[1]
|
||
, bz = b[2]
|
||
, bw = b[3];
|
||
var omega, cosom, sinom, scale0, scale1;
|
||
cosom = ax * bx + ay * by + az * bz + aw * bw;
|
||
if (cosom < 0) {
|
||
cosom = -cosom;
|
||
bx = -bx;
|
||
by = -by;
|
||
bz = -bz;
|
||
bw = -bw
|
||
}
|
||
if (1 - cosom > EPSILON) {
|
||
omega = Math.acos(cosom);
|
||
sinom = Math.sin(omega);
|
||
scale0 = Math.sin((1 - t) * omega) / sinom;
|
||
scale1 = Math.sin(t * omega) / sinom
|
||
} else {
|
||
scale0 = 1 - t;
|
||
scale1 = t
|
||
}
|
||
out[0] = scale0 * ax + scale1 * bx;
|
||
out[1] = scale0 * ay + scale1 * by;
|
||
out[2] = scale0 * az + scale1 * bz;
|
||
out[3] = scale0 * aw + scale1 * bw;
|
||
return out
|
||
}
|
||
function random$2(out) {
|
||
var u1 = RANDOM();
|
||
var u2 = RANDOM();
|
||
var u3 = RANDOM();
|
||
var sqrt1MinusU1 = Math.sqrt(1 - u1);
|
||
var sqrtU1 = Math.sqrt(u1);
|
||
out[0] = sqrt1MinusU1 * Math.sin(2 * Math.PI * u2);
|
||
out[1] = sqrt1MinusU1 * Math.cos(2 * Math.PI * u2);
|
||
out[2] = sqrtU1 * Math.sin(2 * Math.PI * u3);
|
||
out[3] = sqrtU1 * Math.cos(2 * Math.PI * u3);
|
||
return out
|
||
}
|
||
function invert$4(out, a) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3];
|
||
var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;
|
||
var invDot = dot ? 1 / dot : 0;
|
||
out[0] = -a0 * invDot;
|
||
out[1] = -a1 * invDot;
|
||
out[2] = -a2 * invDot;
|
||
out[3] = a3 * invDot;
|
||
return out
|
||
}
|
||
function conjugate(out, a) {
|
||
out[0] = -a[0];
|
||
out[1] = -a[1];
|
||
out[2] = -a[2];
|
||
out[3] = a[3];
|
||
return out
|
||
}
|
||
function fromMat3(out, m) {
|
||
var fTrace = m[0] + m[4] + m[8];
|
||
var fRoot;
|
||
if (fTrace > 0) {
|
||
fRoot = Math.sqrt(fTrace + 1);
|
||
out[3] = .5 * fRoot;
|
||
fRoot = .5 / fRoot;
|
||
out[0] = (m[5] - m[7]) * fRoot;
|
||
out[1] = (m[6] - m[2]) * fRoot;
|
||
out[2] = (m[1] - m[3]) * fRoot
|
||
} else {
|
||
var i = 0;
|
||
if (m[4] > m[0])
|
||
i = 1;
|
||
if (m[8] > m[i * 3 + i])
|
||
i = 2;
|
||
var j = (i + 1) % 3;
|
||
var k = (i + 2) % 3;
|
||
fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1);
|
||
out[i] = .5 * fRoot;
|
||
fRoot = .5 / fRoot;
|
||
out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;
|
||
out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;
|
||
out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot
|
||
}
|
||
return out
|
||
}
|
||
function fromEuler(out, x, y, z) {
|
||
var halfToRad = .5 * Math.PI / 180;
|
||
x *= halfToRad;
|
||
y *= halfToRad;
|
||
z *= halfToRad;
|
||
var sx = Math.sin(x);
|
||
var cx = Math.cos(x);
|
||
var sy = Math.sin(y);
|
||
var cy = Math.cos(y);
|
||
var sz = Math.sin(z);
|
||
var cz = Math.cos(z);
|
||
out[0] = sx * cy * cz - cx * sy * sz;
|
||
out[1] = cx * sy * cz + sx * cy * sz;
|
||
out[2] = cx * cy * sz - sx * sy * cz;
|
||
out[3] = cx * cy * cz + sx * sy * sz;
|
||
return out
|
||
}
|
||
function str$6(a) {
|
||
return "quat(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"
|
||
}
|
||
var clone$6 = clone$5;
|
||
var fromValues$6 = fromValues$5;
|
||
var copy$6 = copy$5;
|
||
var set$6 = set$5;
|
||
var add$6 = add$5;
|
||
var mul$6 = multiply$6;
|
||
var scale$6 = scale$5;
|
||
var dot$2 = dot$1;
|
||
var lerp$2 = lerp$1;
|
||
var length$2 = length$1;
|
||
var len$2 = length$2;
|
||
var squaredLength$2 = squaredLength$1;
|
||
var sqrLen$2 = squaredLength$2;
|
||
var normalize$2 = normalize$1;
|
||
var exactEquals$6 = exactEquals$5;
|
||
var equals$7 = equals$6;
|
||
var rotationTo = function() {
|
||
var tmpvec3 = create$4();
|
||
var xUnitVec3 = fromValues$4(1, 0, 0);
|
||
var yUnitVec3 = fromValues$4(0, 1, 0);
|
||
return function(out, a, b) {
|
||
var dot$1 = dot(a, b);
|
||
if (dot$1 < -.999999) {
|
||
cross(tmpvec3, xUnitVec3, a);
|
||
if (len(tmpvec3) < 1E-6)
|
||
cross(tmpvec3, yUnitVec3, a);
|
||
normalize(tmpvec3, tmpvec3);
|
||
setAxisAngle(out, tmpvec3, Math.PI);
|
||
return out
|
||
} else if (dot$1 > .999999) {
|
||
out[0] = 0;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 1;
|
||
return out
|
||
} else {
|
||
cross(tmpvec3, a, b);
|
||
out[0] = tmpvec3[0];
|
||
out[1] = tmpvec3[1];
|
||
out[2] = tmpvec3[2];
|
||
out[3] = 1 + dot$1;
|
||
return normalize$2(out, out)
|
||
}
|
||
}
|
||
}();
|
||
var sqlerp = function() {
|
||
var temp1 = create$6();
|
||
var temp2 = create$6();
|
||
return function(out, a, b, c, d, t) {
|
||
slerp(temp1, a, d, t);
|
||
slerp(temp2, b, c, t);
|
||
slerp(out, temp1, temp2, 2 * t * (1 - t));
|
||
return out
|
||
}
|
||
}();
|
||
var setAxes = function() {
|
||
var matr = create$2();
|
||
return function(out, view, right, up) {
|
||
matr[0] = right[0];
|
||
matr[3] = right[1];
|
||
matr[6] = right[2];
|
||
matr[1] = up[0];
|
||
matr[4] = up[1];
|
||
matr[7] = up[2];
|
||
matr[2] = -view[0];
|
||
matr[5] = -view[1];
|
||
matr[8] = -view[2];
|
||
return normalize$2(out, fromMat3(out, matr))
|
||
}
|
||
}();
|
||
var quat = Object.freeze({
|
||
__proto__: null,
|
||
create: create$6,
|
||
identity: identity$4,
|
||
setAxisAngle: setAxisAngle,
|
||
getAxisAngle: getAxisAngle,
|
||
getAngle: getAngle,
|
||
multiply: multiply$6,
|
||
rotateX: rotateX$2,
|
||
rotateY: rotateY$2,
|
||
rotateZ: rotateZ$2,
|
||
calculateW: calculateW,
|
||
exp: exp,
|
||
ln: ln,
|
||
pow: pow,
|
||
slerp: slerp,
|
||
random: random$2,
|
||
invert: invert$4,
|
||
conjugate: conjugate,
|
||
fromMat3: fromMat3,
|
||
fromEuler: fromEuler,
|
||
str: str$6,
|
||
clone: clone$6,
|
||
fromValues: fromValues$6,
|
||
copy: copy$6,
|
||
set: set$6,
|
||
add: add$6,
|
||
mul: mul$6,
|
||
scale: scale$6,
|
||
dot: dot$2,
|
||
lerp: lerp$2,
|
||
length: length$2,
|
||
len: len$2,
|
||
squaredLength: squaredLength$2,
|
||
sqrLen: sqrLen$2,
|
||
normalize: normalize$2,
|
||
exactEquals: exactEquals$6,
|
||
equals: equals$7,
|
||
rotationTo: rotationTo,
|
||
sqlerp: sqlerp,
|
||
setAxes: setAxes
|
||
});
|
||
function create$7() {
|
||
var dq = new ARRAY_TYPE(8);
|
||
if (ARRAY_TYPE != Float32Array) {
|
||
dq[0] = 0;
|
||
dq[1] = 0;
|
||
dq[2] = 0;
|
||
dq[4] = 0;
|
||
dq[5] = 0;
|
||
dq[6] = 0;
|
||
dq[7] = 0
|
||
}
|
||
dq[3] = 1;
|
||
return dq
|
||
}
|
||
function clone$7(a) {
|
||
var dq = new ARRAY_TYPE(8);
|
||
dq[0] = a[0];
|
||
dq[1] = a[1];
|
||
dq[2] = a[2];
|
||
dq[3] = a[3];
|
||
dq[4] = a[4];
|
||
dq[5] = a[5];
|
||
dq[6] = a[6];
|
||
dq[7] = a[7];
|
||
return dq
|
||
}
|
||
function fromValues$7(x1, y1, z1, w1, x2, y2, z2, w2) {
|
||
var dq = new ARRAY_TYPE(8);
|
||
dq[0] = x1;
|
||
dq[1] = y1;
|
||
dq[2] = z1;
|
||
dq[3] = w1;
|
||
dq[4] = x2;
|
||
dq[5] = y2;
|
||
dq[6] = z2;
|
||
dq[7] = w2;
|
||
return dq
|
||
}
|
||
function fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) {
|
||
var dq = new ARRAY_TYPE(8);
|
||
dq[0] = x1;
|
||
dq[1] = y1;
|
||
dq[2] = z1;
|
||
dq[3] = w1;
|
||
var ax = x2 * .5
|
||
, ay = y2 * .5
|
||
, az = z2 * .5;
|
||
dq[4] = ax * w1 + ay * z1 - az * y1;
|
||
dq[5] = ay * w1 + az * x1 - ax * z1;
|
||
dq[6] = az * w1 + ax * y1 - ay * x1;
|
||
dq[7] = -ax * x1 - ay * y1 - az * z1;
|
||
return dq
|
||
}
|
||
function fromRotationTranslation$1(out, q, t) {
|
||
var ax = t[0] * .5
|
||
, ay = t[1] * .5
|
||
, az = t[2] * .5
|
||
, bx = q[0]
|
||
, by = q[1]
|
||
, bz = q[2]
|
||
, bw = q[3];
|
||
out[0] = bx;
|
||
out[1] = by;
|
||
out[2] = bz;
|
||
out[3] = bw;
|
||
out[4] = ax * bw + ay * bz - az * by;
|
||
out[5] = ay * bw + az * bx - ax * bz;
|
||
out[6] = az * bw + ax * by - ay * bx;
|
||
out[7] = -ax * bx - ay * by - az * bz;
|
||
return out
|
||
}
|
||
function fromTranslation$3(out, t) {
|
||
out[0] = 0;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 1;
|
||
out[4] = t[0] * .5;
|
||
out[5] = t[1] * .5;
|
||
out[6] = t[2] * .5;
|
||
out[7] = 0;
|
||
return out
|
||
}
|
||
function fromRotation$4(out, q) {
|
||
out[0] = q[0];
|
||
out[1] = q[1];
|
||
out[2] = q[2];
|
||
out[3] = q[3];
|
||
out[4] = 0;
|
||
out[5] = 0;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
return out
|
||
}
|
||
function fromMat4$1(out, a) {
|
||
var outer = create$6();
|
||
getRotation(outer, a);
|
||
var t = new ARRAY_TYPE(3);
|
||
getTranslation(t, a);
|
||
fromRotationTranslation$1(out, outer, t);
|
||
return out
|
||
}
|
||
function copy$7(out, a) {
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
out[2] = a[2];
|
||
out[3] = a[3];
|
||
out[4] = a[4];
|
||
out[5] = a[5];
|
||
out[6] = a[6];
|
||
out[7] = a[7];
|
||
return out
|
||
}
|
||
function identity$5(out) {
|
||
out[0] = 0;
|
||
out[1] = 0;
|
||
out[2] = 0;
|
||
out[3] = 1;
|
||
out[4] = 0;
|
||
out[5] = 0;
|
||
out[6] = 0;
|
||
out[7] = 0;
|
||
return out
|
||
}
|
||
function set$7(out, x1, y1, z1, w1, x2, y2, z2, w2) {
|
||
out[0] = x1;
|
||
out[1] = y1;
|
||
out[2] = z1;
|
||
out[3] = w1;
|
||
out[4] = x2;
|
||
out[5] = y2;
|
||
out[6] = z2;
|
||
out[7] = w2;
|
||
return out
|
||
}
|
||
var getReal = copy$6;
|
||
function getDual(out, a) {
|
||
out[0] = a[4];
|
||
out[1] = a[5];
|
||
out[2] = a[6];
|
||
out[3] = a[7];
|
||
return out
|
||
}
|
||
var setReal = copy$6;
|
||
function setDual(out, q) {
|
||
out[4] = q[0];
|
||
out[5] = q[1];
|
||
out[6] = q[2];
|
||
out[7] = q[3];
|
||
return out
|
||
}
|
||
function getTranslation$1(out, a) {
|
||
var ax = a[4]
|
||
, ay = a[5]
|
||
, az = a[6]
|
||
, aw = a[7]
|
||
, bx = -a[0]
|
||
, by = -a[1]
|
||
, bz = -a[2]
|
||
, bw = a[3];
|
||
out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;
|
||
out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;
|
||
out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;
|
||
return out
|
||
}
|
||
function translate$3(out, a, v) {
|
||
var ax1 = a[0]
|
||
, ay1 = a[1]
|
||
, az1 = a[2]
|
||
, aw1 = a[3]
|
||
, bx1 = v[0] * .5
|
||
, by1 = v[1] * .5
|
||
, bz1 = v[2] * .5
|
||
, ax2 = a[4]
|
||
, ay2 = a[5]
|
||
, az2 = a[6]
|
||
, aw2 = a[7];
|
||
out[0] = ax1;
|
||
out[1] = ay1;
|
||
out[2] = az1;
|
||
out[3] = aw1;
|
||
out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2;
|
||
out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2;
|
||
out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2;
|
||
out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2;
|
||
return out
|
||
}
|
||
function rotateX$3(out, a, rad) {
|
||
var bx = -a[0]
|
||
, by = -a[1]
|
||
, bz = -a[2]
|
||
, bw = a[3]
|
||
, ax = a[4]
|
||
, ay = a[5]
|
||
, az = a[6]
|
||
, aw = a[7]
|
||
, ax1 = ax * bw + aw * bx + ay * bz - az * by
|
||
, ay1 = ay * bw + aw * by + az * bx - ax * bz
|
||
, az1 = az * bw + aw * bz + ax * by - ay * bx
|
||
, aw1 = aw * bw - ax * bx - ay * by - az * bz;
|
||
rotateX$2(out, a, rad);
|
||
bx = out[0];
|
||
by = out[1];
|
||
bz = out[2];
|
||
bw = out[3];
|
||
out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
|
||
out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
|
||
out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
|
||
out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
|
||
return out
|
||
}
|
||
function rotateY$3(out, a, rad) {
|
||
var bx = -a[0]
|
||
, by = -a[1]
|
||
, bz = -a[2]
|
||
, bw = a[3]
|
||
, ax = a[4]
|
||
, ay = a[5]
|
||
, az = a[6]
|
||
, aw = a[7]
|
||
, ax1 = ax * bw + aw * bx + ay * bz - az * by
|
||
, ay1 = ay * bw + aw * by + az * bx - ax * bz
|
||
, az1 = az * bw + aw * bz + ax * by - ay * bx
|
||
, aw1 = aw * bw - ax * bx - ay * by - az * bz;
|
||
rotateY$2(out, a, rad);
|
||
bx = out[0];
|
||
by = out[1];
|
||
bz = out[2];
|
||
bw = out[3];
|
||
out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
|
||
out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
|
||
out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
|
||
out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
|
||
return out
|
||
}
|
||
function rotateZ$3(out, a, rad) {
|
||
var bx = -a[0]
|
||
, by = -a[1]
|
||
, bz = -a[2]
|
||
, bw = a[3]
|
||
, ax = a[4]
|
||
, ay = a[5]
|
||
, az = a[6]
|
||
, aw = a[7]
|
||
, ax1 = ax * bw + aw * bx + ay * bz - az * by
|
||
, ay1 = ay * bw + aw * by + az * bx - ax * bz
|
||
, az1 = az * bw + aw * bz + ax * by - ay * bx
|
||
, aw1 = aw * bw - ax * bx - ay * by - az * bz;
|
||
rotateZ$2(out, a, rad);
|
||
bx = out[0];
|
||
by = out[1];
|
||
bz = out[2];
|
||
bw = out[3];
|
||
out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
|
||
out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
|
||
out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
|
||
out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
|
||
return out
|
||
}
|
||
function rotateByQuatAppend(out, a, q) {
|
||
var qx = q[0]
|
||
, qy = q[1]
|
||
, qz = q[2]
|
||
, qw = q[3]
|
||
, ax = a[0]
|
||
, ay = a[1]
|
||
, az = a[2]
|
||
, aw = a[3];
|
||
out[0] = ax * qw + aw * qx + ay * qz - az * qy;
|
||
out[1] = ay * qw + aw * qy + az * qx - ax * qz;
|
||
out[2] = az * qw + aw * qz + ax * qy - ay * qx;
|
||
out[3] = aw * qw - ax * qx - ay * qy - az * qz;
|
||
ax = a[4];
|
||
ay = a[5];
|
||
az = a[6];
|
||
aw = a[7];
|
||
out[4] = ax * qw + aw * qx + ay * qz - az * qy;
|
||
out[5] = ay * qw + aw * qy + az * qx - ax * qz;
|
||
out[6] = az * qw + aw * qz + ax * qy - ay * qx;
|
||
out[7] = aw * qw - ax * qx - ay * qy - az * qz;
|
||
return out
|
||
}
|
||
function rotateByQuatPrepend(out, q, a) {
|
||
var qx = q[0]
|
||
, qy = q[1]
|
||
, qz = q[2]
|
||
, qw = q[3]
|
||
, bx = a[0]
|
||
, by = a[1]
|
||
, bz = a[2]
|
||
, bw = a[3];
|
||
out[0] = qx * bw + qw * bx + qy * bz - qz * by;
|
||
out[1] = qy * bw + qw * by + qz * bx - qx * bz;
|
||
out[2] = qz * bw + qw * bz + qx * by - qy * bx;
|
||
out[3] = qw * bw - qx * bx - qy * by - qz * bz;
|
||
bx = a[4];
|
||
by = a[5];
|
||
bz = a[6];
|
||
bw = a[7];
|
||
out[4] = qx * bw + qw * bx + qy * bz - qz * by;
|
||
out[5] = qy * bw + qw * by + qz * bx - qx * bz;
|
||
out[6] = qz * bw + qw * bz + qx * by - qy * bx;
|
||
out[7] = qw * bw - qx * bx - qy * by - qz * bz;
|
||
return out
|
||
}
|
||
function rotateAroundAxis(out, a, axis, rad) {
|
||
if (Math.abs(rad) < EPSILON)
|
||
return copy$7(out, a);
|
||
var axisLength = Math.hypot(axis[0], axis[1], axis[2]);
|
||
rad = rad * .5;
|
||
var s = Math.sin(rad);
|
||
var bx = s * axis[0] / axisLength;
|
||
var by = s * axis[1] / axisLength;
|
||
var bz = s * axis[2] / axisLength;
|
||
var bw = Math.cos(rad);
|
||
var ax1 = a[0]
|
||
, ay1 = a[1]
|
||
, az1 = a[2]
|
||
, aw1 = a[3];
|
||
out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
|
||
out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
|
||
out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
|
||
out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
|
||
var ax = a[4]
|
||
, ay = a[5]
|
||
, az = a[6]
|
||
, aw = a[7];
|
||
out[4] = ax * bw + aw * bx + ay * bz - az * by;
|
||
out[5] = ay * bw + aw * by + az * bx - ax * bz;
|
||
out[6] = az * bw + aw * bz + ax * by - ay * bx;
|
||
out[7] = aw * bw - ax * bx - ay * by - az * bz;
|
||
return out
|
||
}
|
||
function add$7(out, a, b) {
|
||
out[0] = a[0] + b[0];
|
||
out[1] = a[1] + b[1];
|
||
out[2] = a[2] + b[2];
|
||
out[3] = a[3] + b[3];
|
||
out[4] = a[4] + b[4];
|
||
out[5] = a[5] + b[5];
|
||
out[6] = a[6] + b[6];
|
||
out[7] = a[7] + b[7];
|
||
return out
|
||
}
|
||
function multiply$7(out, a, b) {
|
||
var ax0 = a[0]
|
||
, ay0 = a[1]
|
||
, az0 = a[2]
|
||
, aw0 = a[3]
|
||
, bx1 = b[4]
|
||
, by1 = b[5]
|
||
, bz1 = b[6]
|
||
, bw1 = b[7]
|
||
, ax1 = a[4]
|
||
, ay1 = a[5]
|
||
, az1 = a[6]
|
||
, aw1 = a[7]
|
||
, bx0 = b[0]
|
||
, by0 = b[1]
|
||
, bz0 = b[2]
|
||
, bw0 = b[3];
|
||
out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0;
|
||
out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0;
|
||
out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0;
|
||
out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0;
|
||
out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0;
|
||
out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0;
|
||
out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0;
|
||
out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0;
|
||
return out
|
||
}
|
||
var mul$7 = multiply$7;
|
||
function scale$7(out, a, b) {
|
||
out[0] = a[0] * b;
|
||
out[1] = a[1] * b;
|
||
out[2] = a[2] * b;
|
||
out[3] = a[3] * b;
|
||
out[4] = a[4] * b;
|
||
out[5] = a[5] * b;
|
||
out[6] = a[6] * b;
|
||
out[7] = a[7] * b;
|
||
return out
|
||
}
|
||
var dot$3 = dot$2;
|
||
function lerp$3(out, a, b, t) {
|
||
var mt = 1 - t;
|
||
if (dot$3(a, b) < 0)
|
||
t = -t;
|
||
out[0] = a[0] * mt + b[0] * t;
|
||
out[1] = a[1] * mt + b[1] * t;
|
||
out[2] = a[2] * mt + b[2] * t;
|
||
out[3] = a[3] * mt + b[3] * t;
|
||
out[4] = a[4] * mt + b[4] * t;
|
||
out[5] = a[5] * mt + b[5] * t;
|
||
out[6] = a[6] * mt + b[6] * t;
|
||
out[7] = a[7] * mt + b[7] * t;
|
||
return out
|
||
}
|
||
function invert$5(out, a) {
|
||
var sqlen = squaredLength$3(a);
|
||
out[0] = -a[0] / sqlen;
|
||
out[1] = -a[1] / sqlen;
|
||
out[2] = -a[2] / sqlen;
|
||
out[3] = a[3] / sqlen;
|
||
out[4] = -a[4] / sqlen;
|
||
out[5] = -a[5] / sqlen;
|
||
out[6] = -a[6] / sqlen;
|
||
out[7] = a[7] / sqlen;
|
||
return out
|
||
}
|
||
function conjugate$1(out, a) {
|
||
out[0] = -a[0];
|
||
out[1] = -a[1];
|
||
out[2] = -a[2];
|
||
out[3] = a[3];
|
||
out[4] = -a[4];
|
||
out[5] = -a[5];
|
||
out[6] = -a[6];
|
||
out[7] = a[7];
|
||
return out
|
||
}
|
||
var length$3 = length$2;
|
||
var len$3 = length$3;
|
||
var squaredLength$3 = squaredLength$2;
|
||
var sqrLen$3 = squaredLength$3;
|
||
function normalize$3(out, a) {
|
||
var magnitude = squaredLength$3(a);
|
||
if (magnitude > 0) {
|
||
magnitude = Math.sqrt(magnitude);
|
||
var a0 = a[0] / magnitude;
|
||
var a1 = a[1] / magnitude;
|
||
var a2 = a[2] / magnitude;
|
||
var a3 = a[3] / magnitude;
|
||
var b0 = a[4];
|
||
var b1 = a[5];
|
||
var b2 = a[6];
|
||
var b3 = a[7];
|
||
var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3;
|
||
out[0] = a0;
|
||
out[1] = a1;
|
||
out[2] = a2;
|
||
out[3] = a3;
|
||
out[4] = (b0 - a0 * a_dot_b) / magnitude;
|
||
out[5] = (b1 - a1 * a_dot_b) / magnitude;
|
||
out[6] = (b2 - a2 * a_dot_b) / magnitude;
|
||
out[7] = (b3 - a3 * a_dot_b) / magnitude
|
||
}
|
||
return out
|
||
}
|
||
function str$7(a) {
|
||
return "quat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ")"
|
||
}
|
||
function exactEquals$7(a, b) {
|
||
return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7]
|
||
}
|
||
function equals$8(a, b) {
|
||
var a0 = a[0]
|
||
, a1 = a[1]
|
||
, a2 = a[2]
|
||
, a3 = a[3]
|
||
, a4 = a[4]
|
||
, a5 = a[5]
|
||
, a6 = a[6]
|
||
, a7 = a[7];
|
||
var b0 = b[0]
|
||
, b1 = b[1]
|
||
, b2 = b[2]
|
||
, b3 = b[3]
|
||
, b4 = b[4]
|
||
, b5 = b[5]
|
||
, b6 = b[6]
|
||
, b7 = b[7];
|
||
return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1, Math.abs(a7), Math.abs(b7))
|
||
}
|
||
var quat2 = Object.freeze({
|
||
__proto__: null,
|
||
create: create$7,
|
||
clone: clone$7,
|
||
fromValues: fromValues$7,
|
||
fromRotationTranslationValues: fromRotationTranslationValues,
|
||
fromRotationTranslation: fromRotationTranslation$1,
|
||
fromTranslation: fromTranslation$3,
|
||
fromRotation: fromRotation$4,
|
||
fromMat4: fromMat4$1,
|
||
copy: copy$7,
|
||
identity: identity$5,
|
||
set: set$7,
|
||
getReal: getReal,
|
||
getDual: getDual,
|
||
setReal: setReal,
|
||
setDual: setDual,
|
||
getTranslation: getTranslation$1,
|
||
translate: translate$3,
|
||
rotateX: rotateX$3,
|
||
rotateY: rotateY$3,
|
||
rotateZ: rotateZ$3,
|
||
rotateByQuatAppend: rotateByQuatAppend,
|
||
rotateByQuatPrepend: rotateByQuatPrepend,
|
||
rotateAroundAxis: rotateAroundAxis,
|
||
add: add$7,
|
||
multiply: multiply$7,
|
||
mul: mul$7,
|
||
scale: scale$7,
|
||
dot: dot$3,
|
||
lerp: lerp$3,
|
||
invert: invert$5,
|
||
conjugate: conjugate$1,
|
||
length: length$3,
|
||
len: len$3,
|
||
squaredLength: squaredLength$3,
|
||
sqrLen: sqrLen$3,
|
||
normalize: normalize$3,
|
||
str: str$7,
|
||
exactEquals: exactEquals$7,
|
||
equals: equals$8
|
||
});
|
||
function create$8() {
|
||
var out = new ARRAY_TYPE(2);
|
||
if (ARRAY_TYPE != Float32Array) {
|
||
out[0] = 0;
|
||
out[1] = 0
|
||
}
|
||
return out
|
||
}
|
||
function clone$8(a) {
|
||
var out = new ARRAY_TYPE(2);
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
return out
|
||
}
|
||
function fromValues$8(x, y) {
|
||
var out = new ARRAY_TYPE(2);
|
||
out[0] = x;
|
||
out[1] = y;
|
||
return out
|
||
}
|
||
function copy$8(out, a) {
|
||
out[0] = a[0];
|
||
out[1] = a[1];
|
||
return out
|
||
}
|
||
function set$8(out, x, y) {
|
||
out[0] = x;
|
||
out[1] = y;
|
||
return out
|
||
}
|
||
function add$8(out, a, b) {
|
||
out[0] = a[0] + b[0];
|
||
out[1] = a[1] + b[1];
|
||
return out
|
||
}
|
||
function subtract$6(out, a, b) {
|
||
out[0] = a[0] - b[0];
|
||
out[1] = a[1] - b[1];
|
||
return out
|
||
}
|
||
function multiply$8(out, a, b) {
|
||
out[0] = a[0] * b[0];
|
||
out[1] = a[1] * b[1];
|
||
return out
|
||
}
|
||
function divide$2(out, a, b) {
|
||
out[0] = a[0] / b[0];
|
||
out[1] = a[1] / b[1];
|
||
return out
|
||
}
|
||
function ceil$2(out, a) {
|
||
out[0] = Math.ceil(a[0]);
|
||
out[1] = Math.ceil(a[1]);
|
||
return out
|
||
}
|
||
function floor$2(out, a) {
|
||
out[0] = Math.floor(a[0]);
|
||
out[1] = Math.floor(a[1]);
|
||
return out
|
||
}
|
||
function min$2(out, a, b) {
|
||
out[0] = Math.min(a[0], b[0]);
|
||
out[1] = Math.min(a[1], b[1]);
|
||
return out
|
||
}
|
||
function max$2(out, a, b) {
|
||
out[0] = Math.max(a[0], b[0]);
|
||
out[1] = Math.max(a[1], b[1]);
|
||
return out
|
||
}
|
||
function round$2(out, a) {
|
||
out[0] = Math.round(a[0]);
|
||
out[1] = Math.round(a[1]);
|
||
return out
|
||
}
|
||
function scale$8(out, a, b) {
|
||
out[0] = a[0] * b;
|
||
out[1] = a[1] * b;
|
||
return out
|
||
}
|
||
function scaleAndAdd$2(out, a, b, scale) {
|
||
out[0] = a[0] + b[0] * scale;
|
||
out[1] = a[1] + b[1] * scale;
|
||
return out
|
||
}
|
||
function distance$2(a, b) {
|
||
var x = b[0] - a[0]
|
||
, y = b[1] - a[1];
|
||
return Math.hypot(x, y)
|
||
}
|
||
function squaredDistance$2(a, b) {
|
||
var x = b[0] - a[0]
|
||
, y = b[1] - a[1];
|
||
return x * x + y * y
|
||
}
|
||
function length$4(a) {
|
||
var x = a[0]
|
||
, y = a[1];
|
||
return Math.hypot(x, y)
|
||
}
|
||
function squaredLength$4(a) {
|
||
var x = a[0]
|
||
, y = a[1];
|
||
return x * x + y * y
|
||
}
|
||
function negate$2(out, a) {
|
||
out[0] = -a[0];
|
||
out[1] = -a[1];
|
||
return out
|
||
}
|
||
function inverse$2(out, a) {
|
||
out[0] = 1 / a[0];
|
||
out[1] = 1 / a[1];
|
||
return out
|
||
}
|
||
function normalize$4(out, a) {
|
||
var x = a[0]
|
||
, y = a[1];
|
||
var len = x * x + y * y;
|
||
if (len > 0)
|
||
len = 1 / Math.sqrt(len);
|
||
out[0] = a[0] * len;
|
||
out[1] = a[1] * len;
|
||
return out
|
||
}
|
||
function dot$4(a, b) {
|
||
return a[0] * b[0] + a[1] * b[1]
|
||
}
|
||
function cross$2(out, a, b) {
|
||
var z = a[0] * b[1] - a[1] * b[0];
|
||
out[0] = out[1] = 0;
|
||
out[2] = z;
|
||
return out
|
||
}
|
||
function lerp$4(out, a, b, t) {
|
||
var ax = a[0]
|
||
, ay = a[1];
|
||
out[0] = ax + t * (b[0] - ax);
|
||
out[1] = ay + t * (b[1] - ay);
|
||
return out
|
||
}
|
||
function random$3(out, scale) {
|
||
scale = scale || 1;
|
||
var r = RANDOM() * 2 * Math.PI;
|
||
out[0] = Math.cos(r) * scale;
|
||
out[1] = Math.sin(r) * scale;
|
||
return out
|
||
}
|
||
function transformMat2(out, a, m) {
|
||
var x = a[0]
|
||
, y = a[1];
|
||
out[0] = m[0] * x + m[2] * y;
|
||
out[1] = m[1] * x + m[3] * y;
|
||
return out
|
||
}
|
||
function transformMat2d(out, a, m) {
|
||
var x = a[0]
|
||
, y = a[1];
|
||
out[0] = m[0] * x + m[2] * y + m[4];
|
||
out[1] = m[1] * x + m[3] * y + m[5];
|
||
return out
|
||
}
|
||
function transformMat3$1(out, a, m) {
|
||
var x = a[0]
|
||
, y = a[1];
|
||
out[0] = m[0] * x + m[3] * y + m[6];
|
||
out[1] = m[1] * x + m[4] * y + m[7];
|
||
return out
|
||
}
|
||
function transformMat4$2(out, a, m) {
|
||
var x = a[0];
|
||
var y = a[1];
|
||
out[0] = m[0] * x + m[4] * y + m[12];
|
||
out[1] = m[1] * x + m[5] * y + m[13];
|
||
return out
|
||
}
|
||
function rotate$4(out, a, b, rad) {
|
||
var p0 = a[0] - b[0]
|
||
, p1 = a[1] - b[1]
|
||
, sinC = Math.sin(rad)
|
||
, cosC = Math.cos(rad);
|
||
out[0] = p0 * cosC - p1 * sinC + b[0];
|
||
out[1] = p0 * sinC + p1 * cosC + b[1];
|
||
return out
|
||
}
|
||
function angle$1(a, b) {
|
||
var x1 = a[0]
|
||
, y1 = a[1]
|
||
, x2 = b[0]
|
||
, y2 = b[1]
|
||
, mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2)
|
||
, cosine = mag && (x1 * x2 + y1 * y2) / mag;
|
||
return Math.acos(Math.min(Math.max(cosine, -1), 1))
|
||
}
|
||
function zero$2(out) {
|
||
out[0] = 0;
|
||
out[1] = 0;
|
||
return out
|
||
}
|
||
function str$8(a) {
|
||
return "vec2(" + a[0] + ", " + a[1] + ")"
|
||
}
|
||
function exactEquals$8(a, b) {
|
||
return a[0] === b[0] && a[1] === b[1]
|
||
}
|
||
function equals$9(a, b) {
|
||
var a0 = a[0]
|
||
, a1 = a[1];
|
||
var b0 = b[0]
|
||
, b1 = b[1];
|
||
return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1))
|
||
}
|
||
var len$4 = length$4;
|
||
var sub$6 = subtract$6;
|
||
var mul$8 = multiply$8;
|
||
var div$2 = divide$2;
|
||
var dist$2 = distance$2;
|
||
var sqrDist$2 = squaredDistance$2;
|
||
var sqrLen$4 = squaredLength$4;
|
||
var forEach$2 = function() {
|
||
var vec = create$8();
|
||
return function(a, stride, offset, count, fn, arg) {
|
||
var i, l;
|
||
if (!stride)
|
||
stride = 2;
|
||
if (!offset)
|
||
offset = 0;
|
||
if (count)
|
||
l = Math.min(count * stride + offset, a.length);
|
||
else
|
||
l = a.length;
|
||
for (i = offset; i < l; i += stride) {
|
||
vec[0] = a[i];
|
||
vec[1] = a[i + 1];
|
||
fn(vec, vec, arg);
|
||
a[i] = vec[0];
|
||
a[i + 1] = vec[1]
|
||
}
|
||
return a
|
||
}
|
||
}();
|
||
var vec2 = Object.freeze({
|
||
__proto__: null,
|
||
create: create$8,
|
||
clone: clone$8,
|
||
fromValues: fromValues$8,
|
||
copy: copy$8,
|
||
set: set$8,
|
||
add: add$8,
|
||
subtract: subtract$6,
|
||
multiply: multiply$8,
|
||
divide: divide$2,
|
||
ceil: ceil$2,
|
||
floor: floor$2,
|
||
min: min$2,
|
||
max: max$2,
|
||
round: round$2,
|
||
scale: scale$8,
|
||
scaleAndAdd: scaleAndAdd$2,
|
||
distance: distance$2,
|
||
squaredDistance: squaredDistance$2,
|
||
length: length$4,
|
||
squaredLength: squaredLength$4,
|
||
negate: negate$2,
|
||
inverse: inverse$2,
|
||
normalize: normalize$4,
|
||
dot: dot$4,
|
||
cross: cross$2,
|
||
lerp: lerp$4,
|
||
random: random$3,
|
||
transformMat2: transformMat2,
|
||
transformMat2d: transformMat2d,
|
||
transformMat3: transformMat3$1,
|
||
transformMat4: transformMat4$2,
|
||
rotate: rotate$4,
|
||
angle: angle$1,
|
||
zero: zero$2,
|
||
str: str$8,
|
||
exactEquals: exactEquals$8,
|
||
equals: equals$9,
|
||
len: len$4,
|
||
sub: sub$6,
|
||
mul: mul$8,
|
||
div: div$2,
|
||
dist: dist$2,
|
||
sqrDist: sqrDist$2,
|
||
sqrLen: sqrLen$4,
|
||
forEach: forEach$2
|
||
});
|
||
exports.glMatrix = common;
|
||
exports.mat2 = mat2;
|
||
exports.mat2d = mat2d;
|
||
exports.mat3 = mat3;
|
||
exports.mat4 = mat4;
|
||
exports.quat = quat;
|
||
exports.quat2 = quat2;
|
||
exports.vec2 = vec2;
|
||
exports.vec3 = vec3;
|
||
exports.vec4 = vec4;
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
})
|
||
});
|
||
'use strict';
|
||
{
|
||
function lineInt(l1, l2, precision) {
|
||
precision = precision || 0;
|
||
var i = [0, 0];
|
||
var a1, b1, c1, a2, b2, c2, det;
|
||
a1 = l1[1][1] - l1[0][1];
|
||
b1 = l1[0][0] - l1[1][0];
|
||
c1 = a1 * l1[0][0] + b1 * l1[0][1];
|
||
a2 = l2[1][1] - l2[0][1];
|
||
b2 = l2[0][0] - l2[1][0];
|
||
c2 = a2 * l2[0][0] + b2 * l2[0][1];
|
||
det = a1 * b2 - a2 * b1;
|
||
if (!scalar_eq(det, 0, precision)) {
|
||
i[0] = (b2 * c1 - b1 * c2) / det;
|
||
i[1] = (a1 * c2 - a2 * c1) / det
|
||
}
|
||
return i
|
||
}
|
||
function lineSegmentsIntersect(p1, p2, q1, q2) {
|
||
var dx = p2[0] - p1[0];
|
||
var dy = p2[1] - p1[1];
|
||
var da = q2[0] - q1[0];
|
||
var db = q2[1] - q1[1];
|
||
if (da * dy - db * dx === 0)
|
||
return false;
|
||
var s = (dx * (q1[1] - p1[1]) + dy * (p1[0] - q1[0])) / (da * dy - db * dx);
|
||
var t = (da * (p1[1] - q1[1]) + db * (q1[0] - p1[0])) / (db * dx - da * dy);
|
||
return s >= 0 && s <= 1 && t >= 0 && t <= 1
|
||
}
|
||
function triangleArea(a, b, c) {
|
||
return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1])
|
||
}
|
||
function isLeft(a, b, c) {
|
||
return triangleArea(a, b, c) > 0
|
||
}
|
||
function isLeftOn(a, b, c) {
|
||
return triangleArea(a, b, c) >= 0
|
||
}
|
||
function isRight(a, b, c) {
|
||
return triangleArea(a, b, c) < 0
|
||
}
|
||
function isRightOn(a, b, c) {
|
||
return triangleArea(a, b, c) <= 0
|
||
}
|
||
var tmpPoint1 = []
|
||
, tmpPoint2 = [];
|
||
function collinear(a, b, c, thresholdAngle) {
|
||
if (!thresholdAngle)
|
||
return triangleArea(a, b, c) === 0;
|
||
else {
|
||
var ab = tmpPoint1
|
||
, bc = tmpPoint2;
|
||
ab[0] = b[0] - a[0];
|
||
ab[1] = b[1] - a[1];
|
||
bc[0] = c[0] - b[0];
|
||
bc[1] = c[1] - b[1];
|
||
var dot = ab[0] * bc[0] + ab[1] * bc[1]
|
||
, magA = Math.sqrt(ab[0] * ab[0] + ab[1] * ab[1])
|
||
, magB = Math.sqrt(bc[0] * bc[0] + bc[1] * bc[1])
|
||
, angle = Math.acos(dot / (magA * magB));
|
||
return angle < thresholdAngle
|
||
}
|
||
}
|
||
function sqdist(a, b) {
|
||
var dx = b[0] - a[0];
|
||
var dy = b[1] - a[1];
|
||
return dx * dx + dy * dy
|
||
}
|
||
function polygonAt(polygon, i) {
|
||
var s = polygon.length;
|
||
return polygon[i < 0 ? i % s + s : i % s]
|
||
}
|
||
function polygonClear(polygon) {
|
||
polygon.length = 0
|
||
}
|
||
function polygonAppend(polygon, poly, from, to) {
|
||
for (var i = from; i < to; i++)
|
||
polygon.push(poly[i])
|
||
}
|
||
function polygonMakeCCW(polygon) {
|
||
var br = 0
|
||
, v = polygon;
|
||
for (var i = 1; i < polygon.length; ++i)
|
||
if (v[i][1] < v[br][1] || v[i][1] === v[br][1] && v[i][0] > v[br][0])
|
||
br = i;
|
||
if (!isLeft(polygonAt(polygon, br - 1), polygonAt(polygon, br), polygonAt(polygon, br + 1))) {
|
||
polygonReverse(polygon);
|
||
return true
|
||
} else
|
||
return false
|
||
}
|
||
function polygonReverse(polygon) {
|
||
var tmp = [];
|
||
var N = polygon.length;
|
||
for (var i = 0; i !== N; i++)
|
||
tmp.push(polygon.pop());
|
||
for (var i = 0; i !== N; i++)
|
||
polygon[i] = tmp[i]
|
||
}
|
||
function polygonIsReflex(polygon, i) {
|
||
return isRight(polygonAt(polygon, i - 1), polygonAt(polygon, i), polygonAt(polygon, i + 1))
|
||
}
|
||
var tmpLine1 = []
|
||
, tmpLine2 = [];
|
||
function polygonCanSee(polygon, a, b) {
|
||
var p, dist, l1 = tmpLine1, l2 = tmpLine2;
|
||
if (isLeftOn(polygonAt(polygon, a + 1), polygonAt(polygon, a), polygonAt(polygon, b)) && isRightOn(polygonAt(polygon, a - 1), polygonAt(polygon, a), polygonAt(polygon, b)))
|
||
return false;
|
||
dist = sqdist(polygonAt(polygon, a), polygonAt(polygon, b));
|
||
for (var i = 0; i !== polygon.length; ++i) {
|
||
if ((i + 1) % polygon.length === a || i === a)
|
||
continue;
|
||
if (isLeftOn(polygonAt(polygon, a), polygonAt(polygon, b), polygonAt(polygon, i + 1)) && isRightOn(polygonAt(polygon, a), polygonAt(polygon, b), polygonAt(polygon, i))) {
|
||
l1[0] = polygonAt(polygon, a);
|
||
l1[1] = polygonAt(polygon, b);
|
||
l2[0] = polygonAt(polygon, i);
|
||
l2[1] = polygonAt(polygon, i + 1);
|
||
p = lineInt(l1, l2);
|
||
if (sqdist(polygonAt(polygon, a), p) < dist)
|
||
return false
|
||
}
|
||
}
|
||
return true
|
||
}
|
||
function polygonCanSee2(polygon, a, b) {
|
||
for (var i = 0; i !== polygon.length; ++i) {
|
||
if (i === a || i === b || (i + 1) % polygon.length === a || (i + 1) % polygon.length === b)
|
||
continue;
|
||
if (lineSegmentsIntersect(polygonAt(polygon, a), polygonAt(polygon, b), polygonAt(polygon, i), polygonAt(polygon, i + 1)))
|
||
return false
|
||
}
|
||
return true
|
||
}
|
||
function polygonCopy(polygon, i, j, targetPoly) {
|
||
var p = targetPoly || [];
|
||
polygonClear(p);
|
||
if (i < j)
|
||
for (var k = i; k <= j; k++)
|
||
p.push(polygon[k]);
|
||
else {
|
||
for (var k = 0; k <= j; k++)
|
||
p.push(polygon[k]);
|
||
for (var k = i; k < polygon.length; k++)
|
||
p.push(polygon[k])
|
||
}
|
||
return p
|
||
}
|
||
function polygonGetCutEdges(polygon) {
|
||
var min = []
|
||
, tmp1 = []
|
||
, tmp2 = []
|
||
, tmpPoly = [];
|
||
var nDiags = Number.MAX_VALUE;
|
||
for (var i = 0; i < polygon.length; ++i)
|
||
if (polygonIsReflex(polygon, i))
|
||
for (var j = 0; j < polygon.length; ++j)
|
||
if (polygonCanSee(polygon, i, j)) {
|
||
tmp1 = polygonGetCutEdges(polygonCopy(polygon, i, j, tmpPoly));
|
||
tmp2 = polygonGetCutEdges(polygonCopy(polygon, j, i, tmpPoly));
|
||
for (var k = 0; k < tmp2.length; k++)
|
||
tmp1.push(tmp2[k]);
|
||
if (tmp1.length < nDiags) {
|
||
min = tmp1;
|
||
nDiags = tmp1.length;
|
||
min.push([polygonAt(polygon, i), polygonAt(polygon, j)])
|
||
}
|
||
}
|
||
return min
|
||
}
|
||
function polygonDecomp(polygon) {
|
||
var edges = polygonGetCutEdges(polygon);
|
||
if (edges.length > 0)
|
||
return polygonSlice(polygon, edges);
|
||
else
|
||
return [polygon]
|
||
}
|
||
function polygonSlice(polygon, cutEdges) {
|
||
if (cutEdges.length === 0)
|
||
return [polygon];
|
||
if (cutEdges instanceof Array && cutEdges.length && cutEdges[0]instanceof Array && cutEdges[0].length === 2 && cutEdges[0][0]instanceof Array) {
|
||
var polys = [polygon];
|
||
for (var i = 0; i < cutEdges.length; i++) {
|
||
var cutEdge = cutEdges[i];
|
||
for (var j = 0; j < polys.length; j++) {
|
||
var poly = polys[j];
|
||
var result = polygonSlice(poly, cutEdge);
|
||
if (result) {
|
||
polys.splice(j, 1);
|
||
polys.push(result[0], result[1]);
|
||
break
|
||
}
|
||
}
|
||
}
|
||
return polys
|
||
} else {
|
||
var cutEdge = cutEdges;
|
||
var i = polygon.indexOf(cutEdge[0]);
|
||
var j = polygon.indexOf(cutEdge[1]);
|
||
if (i !== -1 && j !== -1)
|
||
return [polygonCopy(polygon, i, j), polygonCopy(polygon, j, i)];
|
||
else
|
||
return false
|
||
}
|
||
}
|
||
function polygonIsSimple(polygon) {
|
||
var path = polygon, i;
|
||
for (i = 0; i < path.length - 1; i++)
|
||
for (var j = 0; j < i - 1; j++)
|
||
if (lineSegmentsIntersect(path[i], path[i + 1], path[j], path[j + 1]))
|
||
return false;
|
||
for (i = 1; i < path.length - 2; i++)
|
||
if (lineSegmentsIntersect(path[0], path[path.length - 1], path[i], path[i + 1]))
|
||
return false;
|
||
return true
|
||
}
|
||
function getIntersectionPoint(p1, p2, q1, q2, delta) {
|
||
delta = delta || 0;
|
||
var a1 = p2[1] - p1[1];
|
||
var b1 = p1[0] - p2[0];
|
||
var c1 = a1 * p1[0] + b1 * p1[1];
|
||
var a2 = q2[1] - q1[1];
|
||
var b2 = q1[0] - q2[0];
|
||
var c2 = a2 * q1[0] + b2 * q1[1];
|
||
var det = a1 * b2 - a2 * b1;
|
||
if (!scalar_eq(det, 0, delta))
|
||
return [(b2 * c1 - b1 * c2) / det, (a1 * c2 - a2 * c1) / det];
|
||
else
|
||
return [0, 0]
|
||
}
|
||
function polygonQuickDecomp(polygon, result, reflexVertices, steinerPoints, delta, maxlevel, level) {
|
||
maxlevel = maxlevel || 100;
|
||
level = level || 0;
|
||
delta = delta || 25;
|
||
result = typeof result !== "undefined" ? result : [];
|
||
reflexVertices = reflexVertices || [];
|
||
steinerPoints = steinerPoints || [];
|
||
var upperInt = [0, 0]
|
||
, lowerInt = [0, 0]
|
||
, p = [0, 0];
|
||
var upperDist = 0
|
||
, lowerDist = 0
|
||
, d = 0
|
||
, closestDist = 0;
|
||
var upperIndex = 0
|
||
, lowerIndex = 0
|
||
, closestIndex = 0;
|
||
var lowerPoly = []
|
||
, upperPoly = [];
|
||
var poly = polygon
|
||
, v = polygon;
|
||
if (v.length < 3)
|
||
return result;
|
||
level++;
|
||
if (level > maxlevel) {
|
||
console.warn("quickDecomp: max level (" + maxlevel + ") reached.");
|
||
return result
|
||
}
|
||
for (var i = 0; i < polygon.length; ++i)
|
||
if (polygonIsReflex(poly, i)) {
|
||
reflexVertices.push(poly[i]);
|
||
upperDist = lowerDist = Number.MAX_VALUE;
|
||
for (var j = 0; j < polygon.length; ++j) {
|
||
if (isLeft(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j)) && isRightOn(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j - 1))) {
|
||
p = getIntersectionPoint(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j), polygonAt(poly, j - 1));
|
||
if (isRight(polygonAt(poly, i + 1), polygonAt(poly, i), p)) {
|
||
d = sqdist(poly[i], p);
|
||
if (d < lowerDist) {
|
||
lowerDist = d;
|
||
lowerInt = p;
|
||
lowerIndex = j
|
||
}
|
||
}
|
||
}
|
||
if (isLeft(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j + 1)) && isRightOn(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j))) {
|
||
p = getIntersectionPoint(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j), polygonAt(poly, j + 1));
|
||
if (isLeft(polygonAt(poly, i - 1), polygonAt(poly, i), p)) {
|
||
d = sqdist(poly[i], p);
|
||
if (d < upperDist) {
|
||
upperDist = d;
|
||
upperInt = p;
|
||
upperIndex = j
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (lowerIndex === (upperIndex + 1) % polygon.length) {
|
||
p[0] = (lowerInt[0] + upperInt[0]) / 2;
|
||
p[1] = (lowerInt[1] + upperInt[1]) / 2;
|
||
steinerPoints.push(p);
|
||
if (i < upperIndex) {
|
||
polygonAppend(lowerPoly, poly, i, upperIndex + 1);
|
||
lowerPoly.push(p);
|
||
upperPoly.push(p);
|
||
if (lowerIndex !== 0)
|
||
polygonAppend(upperPoly, poly, lowerIndex, poly.length);
|
||
polygonAppend(upperPoly, poly, 0, i + 1)
|
||
} else {
|
||
if (i !== 0)
|
||
polygonAppend(lowerPoly, poly, i, poly.length);
|
||
polygonAppend(lowerPoly, poly, 0, upperIndex + 1);
|
||
lowerPoly.push(p);
|
||
upperPoly.push(p);
|
||
polygonAppend(upperPoly, poly, lowerIndex, i + 1)
|
||
}
|
||
} else {
|
||
if (lowerIndex > upperIndex)
|
||
upperIndex += polygon.length;
|
||
closestDist = Number.MAX_VALUE;
|
||
if (upperIndex < lowerIndex)
|
||
return result;
|
||
for (var j = lowerIndex; j <= upperIndex; ++j)
|
||
if (isLeftOn(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j)) && isRightOn(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j))) {
|
||
d = sqdist(polygonAt(poly, i), polygonAt(poly, j));
|
||
if (d < closestDist && polygonCanSee2(poly, i, j)) {
|
||
closestDist = d;
|
||
closestIndex = j % polygon.length
|
||
}
|
||
}
|
||
if (i < closestIndex) {
|
||
polygonAppend(lowerPoly, poly, i, closestIndex + 1);
|
||
if (closestIndex !== 0)
|
||
polygonAppend(upperPoly, poly, closestIndex, v.length);
|
||
polygonAppend(upperPoly, poly, 0, i + 1)
|
||
} else {
|
||
if (i !== 0)
|
||
polygonAppend(lowerPoly, poly, i, v.length);
|
||
polygonAppend(lowerPoly, poly, 0, closestIndex + 1);
|
||
polygonAppend(upperPoly, poly, closestIndex, i + 1)
|
||
}
|
||
}
|
||
if (lowerPoly.length < upperPoly.length) {
|
||
polygonQuickDecomp(lowerPoly, result, reflexVertices, steinerPoints, delta, maxlevel, level);
|
||
polygonQuickDecomp(upperPoly, result, reflexVertices, steinerPoints, delta, maxlevel, level)
|
||
} else {
|
||
polygonQuickDecomp(upperPoly, result, reflexVertices, steinerPoints, delta, maxlevel, level);
|
||
polygonQuickDecomp(lowerPoly, result, reflexVertices, steinerPoints, delta, maxlevel, level)
|
||
}
|
||
return result
|
||
}
|
||
result.push(polygon);
|
||
return result
|
||
}
|
||
function polygonRemoveCollinearPoints(polygon, precision) {
|
||
var num = 0;
|
||
for (var i = polygon.length - 1; polygon.length > 3 && i >= 0; --i)
|
||
if (collinear(polygonAt(polygon, i - 1), polygonAt(polygon, i), polygonAt(polygon, i + 1), precision)) {
|
||
polygon.splice(i % polygon.length, 1);
|
||
num++
|
||
}
|
||
return num
|
||
}
|
||
function polygonRemoveDuplicatePoints(polygon, precision) {
|
||
for (var i = polygon.length - 1; i >= 1; --i) {
|
||
var pi = polygon[i];
|
||
for (var j = i - 1; j >= 0; --j)
|
||
if (points_eq(pi, polygon[j], precision)) {
|
||
polygon.splice(i, 1);
|
||
continue
|
||
}
|
||
}
|
||
}
|
||
function scalar_eq(a, b, precision) {
|
||
precision = precision || 0;
|
||
return Math.abs(a - b) <= precision
|
||
}
|
||
function points_eq(a, b, precision) {
|
||
return scalar_eq(a[0], b[0], precision) && scalar_eq(a[1], b[1], precision)
|
||
}
|
||
self.polyDecomp = {
|
||
decomp: polygonDecomp,
|
||
quickDecomp: polygonQuickDecomp,
|
||
isSimple: polygonIsSimple,
|
||
removeCollinearPoints: polygonRemoveCollinearPoints,
|
||
removeDuplicatePoints: polygonRemoveDuplicatePoints,
|
||
makeCCW: polygonMakeCCW
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
let isReady = false;
|
||
let hasAppStarted = false;
|
||
let buildMode = "dev";
|
||
const C3 = self.C3 = class C3 {
|
||
constructor() {
|
||
throw TypeError("static class can't be instantiated");
|
||
}
|
||
static SetReady() {
|
||
isReady = true
|
||
}
|
||
static IsReady() {
|
||
return isReady
|
||
}
|
||
static SetAppStarted() {
|
||
hasAppStarted = true
|
||
}
|
||
static HasAppStarted() {
|
||
return hasAppStarted
|
||
}
|
||
static SetBuildMode(m) {
|
||
buildMode = m
|
||
}
|
||
static GetBuildMode() {
|
||
return buildMode
|
||
}
|
||
static IsReleaseBuild() {
|
||
return buildMode === "final"
|
||
}
|
||
}
|
||
;
|
||
C3.isDebug = false;
|
||
C3.isDebugDefend = false;
|
||
C3.hardwareConcurrency = navigator.hardwareConcurrency || 2
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.QueryParser = class QueryParser {
|
||
constructor(queryString) {
|
||
this._queryString = queryString;
|
||
this._parameters = new Map;
|
||
this._Parse()
|
||
}
|
||
_Parse() {
|
||
let str = this._queryString;
|
||
if (str.startsWith("?") || str.startsWith("#"))
|
||
str = str.substr(1);
|
||
const arr = str.split("&");
|
||
for (const p of arr)
|
||
this._ParseParameter(p)
|
||
}
|
||
_ParseParameter(p) {
|
||
if (!p)
|
||
return;
|
||
if (!p.includes("=")) {
|
||
this._parameters.set(p, null);
|
||
return
|
||
}
|
||
const i = p.indexOf("=");
|
||
const parameterName = decodeURIComponent(p.substring(0, i));
|
||
const parameterValue = decodeURIComponent(p.substring(i + 1));
|
||
this._parameters.set(parameterName, parameterValue)
|
||
}
|
||
LogAll() {
|
||
for (const e of this._parameters)
|
||
console.log("[QueryParser] Parameter '" + e[0] + "' = " + (e[1] === null ? "null" : "'" + e[1] + "'"))
|
||
}
|
||
Has(name) {
|
||
return this._parameters.has(name)
|
||
}
|
||
Get(name) {
|
||
const ret = this._parameters.get(name);
|
||
if (typeof ret === "undefined")
|
||
return null;
|
||
else
|
||
return ret
|
||
}
|
||
ClearHash() {
|
||
history.replaceState("", document.title, location.pathname + location.search)
|
||
}
|
||
Reparse(str) {
|
||
this._queryString = str;
|
||
this._parameters.clear();
|
||
this._Parse()
|
||
}
|
||
}
|
||
;
|
||
C3.QueryString = new C3.QueryParser(location.search);
|
||
C3.LocationHashString = new C3.QueryParser(location.hash);
|
||
if (C3.QueryString.Get("mode") !== "dev")
|
||
C3.SetBuildMode("final")
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const UNKNOWN = "(unknown)";
|
||
const UA = navigator.userAgent;
|
||
let Flags = {
|
||
linux: /linux|openbsd|freebsd|netbsd/i.test(UA),
|
||
chromeOS: /CrOS/.test(UA),
|
||
windowsTizen: /trident|iemobile|msie|tizen/i.test(UA),
|
||
genericMS: /trident|iemobile|msie|edge\//i.test(UA),
|
||
opera: /OPR\//.test(UA),
|
||
blackberry: /bb10/i.test(UA),
|
||
edge: /edge\//i.test(UA),
|
||
trident: /trident/i.test(UA),
|
||
webkit: /webkit/i.test(UA),
|
||
safari: /safari\//i.test(UA),
|
||
chrome: /chrome\//i.test(UA),
|
||
chromium: /chromium\//i.test(UA),
|
||
crosswalk: /crosswalk|xwalk/i.test(UA),
|
||
nwjs: /nwjs/i.test(UA),
|
||
amazonwebapp: /amazonwebappplatform/i.test(UA),
|
||
webview: /wv\)/.test(UA),
|
||
android: /android/i.test(UA),
|
||
nokia: /nokiabrowser\/[0-9.]+/i.test(UA)
|
||
};
|
||
let Versions = {
|
||
windows: /windows\s+nt\s+\d+\.\d+/i.exec(UA),
|
||
OSX: /mac\s+os\s+x\s+[0-9_]+/i.exec(UA),
|
||
android: /android\s+[0-9.]+/i.exec(UA),
|
||
opera: /OPR\/[0-9.]+/.exec(UA),
|
||
tizen: /tizen\s+[0-9.]+/i.exec(UA),
|
||
iphone: /iphone\s+os\s+[0-9_]+/i.exec(UA),
|
||
ipad: /ipad[^)]*os\s+[0-9_]+/i.exec(UA),
|
||
winPhone: /windows\s+phone\s+[0-9.]+/i.exec(UA),
|
||
winPhoneOS: /windows\s+phone\s+os\s+[0-9.]+/i.exec(UA),
|
||
chrome: /chrome\/[0-9.]+/i.exec(UA),
|
||
chromium: /chromium\/[0-9.]+/i.exec(UA),
|
||
nwjs: /nwjs\/[0-9.]+/i.exec(UA),
|
||
firefox: /firefox\/[0-9.]+/i.exec(UA),
|
||
ie: /msie\s+[0-9.]+/i.exec(UA),
|
||
edge: /edge\/[0-9.]+/i.exec(UA),
|
||
edgeChromium: /edg\/[0-9.]+/i.exec(UA),
|
||
silk: /silk\/[0-9.]+/i.exec(UA)
|
||
};
|
||
let os = UNKNOWN;
|
||
let os_version = UNKNOWN;
|
||
let os_arch = UNKNOWN;
|
||
let browser = UNKNOWN;
|
||
let browser_version = UNKNOWN;
|
||
let browser_arch = UNKNOWN;
|
||
let engine = UNKNOWN;
|
||
let context = "browser";
|
||
let is_desktop = false;
|
||
let is_desktop_app = false;
|
||
let testResults = new Map;
|
||
function runTest(name, value, fn) {
|
||
if (value === true) {
|
||
const result = fn();
|
||
testResults.set(name, true)
|
||
} else if (value && value.length) {
|
||
const result = fn(value[0]);
|
||
testResults.set(name, true)
|
||
} else
|
||
;
|
||
}
|
||
runTest("isWindows", Versions.windows, WIN=>{
|
||
os = "Windows";
|
||
const nt_ver = WIN.split(" ")[2];
|
||
if (nt_ver)
|
||
switch (nt_ver) {
|
||
case "5.0":
|
||
os_version = "2000";
|
||
break;
|
||
case "5.1":
|
||
os_version = "XP";
|
||
break;
|
||
case "5.2":
|
||
os_version = "XP";
|
||
break;
|
||
case "6.0":
|
||
os_version = "Vista";
|
||
break;
|
||
case "6.1":
|
||
os_version = "7";
|
||
break;
|
||
case "6.2":
|
||
os_version = "8";
|
||
break;
|
||
case "6.3":
|
||
os_version = "8.1";
|
||
break;
|
||
case "10.0":
|
||
os_version = "10";
|
||
break
|
||
}
|
||
}
|
||
);
|
||
runTest("isOSX", Versions.OSX, OSX=>{
|
||
os = "Mac OS X";
|
||
const osx_ver = OSX.split(" ")[3];
|
||
if (osx_ver)
|
||
os_version = osx_ver.replace("_", ".")
|
||
}
|
||
);
|
||
runTest("isLinux", Flags.linux, ()=>{
|
||
os = "Linux"
|
||
}
|
||
);
|
||
runTest("isChromeOS", Flags.chromeOS, ()=>{
|
||
os = "Chrome OS"
|
||
}
|
||
);
|
||
runTest("isAndroid", !Flags.windowsTizen && Versions.android, AND=>{
|
||
os = "Android";
|
||
const android_ver = AND.split(" ")[1];
|
||
if (android_ver)
|
||
os_version = android_ver
|
||
}
|
||
);
|
||
runTest("isTizen", Versions.tizen, TIZ=>{
|
||
os = "Tizen";
|
||
const tizen_ver = TIZ.split(" ")[1];
|
||
if (tizen_ver)
|
||
os_version = tizen_ver
|
||
}
|
||
);
|
||
runTest("isIPhone", !Flags.windowsTizen && Versions.iphone, IOS=>{
|
||
os = "iOS";
|
||
const ios_ver = IOS.split(" ")[2];
|
||
if (ios_ver)
|
||
os_version = ios_ver.replace("_", ".")
|
||
}
|
||
);
|
||
runTest("isIPad", !Flags.windowsTizen && Versions.ipad, IOS=>{
|
||
os = "iOS";
|
||
const ios_ver = IOS.split(" ")[3];
|
||
if (ios_ver)
|
||
os_version = ios_ver.replace("_", ".")
|
||
}
|
||
);
|
||
runTest("isWindowsPhone", Versions.winPhone, WIN=>{
|
||
os = "Windows Phone";
|
||
const ver_str = WIN.split(" ")[2];
|
||
if (ver_str)
|
||
os_version = ver_str
|
||
}
|
||
);
|
||
runTest("isWindowsPhoneOS", Versions.winPhoneOS, WIN=>{
|
||
os = "Windows Phone";
|
||
const ver_str = WIN.split(" ")[3];
|
||
if (ver_str)
|
||
os_version = ver_str
|
||
}
|
||
);
|
||
runTest("isBlackberry", Flags.blackberry, ()=>{
|
||
os = "Blackberry";
|
||
os_version = "10";
|
||
browser = "stock";
|
||
engine = "webkit"
|
||
}
|
||
);
|
||
runTest("isChrome", !Flags.edge && !Flags.opera && Versions.chrome, CHR=>{
|
||
browser = "Chrome";
|
||
engine = "Chromium";
|
||
const ver_str = CHR.split("/")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
);
|
||
runTest("isOpera", Versions.opera, OPR=>{
|
||
browser = "Opera";
|
||
engine = "Chromium";
|
||
const ver_str = OPR.split("/")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
);
|
||
runTest("isChromium", Versions.chromium, CHR=>{
|
||
browser = "Chromium";
|
||
engine = "Chromium";
|
||
const ver_str = CHR.split("/")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
);
|
||
runTest("isFirefox", Versions.firefox, FIR=>{
|
||
browser = "Firefox";
|
||
engine = "Gecko";
|
||
const ver_str = FIR.split("/")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
);
|
||
runTest("isInternetExplorer", Versions.ie, IE=>{
|
||
browser = "Internet Explorer";
|
||
engine = "Trident";
|
||
const ver_str = IE.split(" ")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
);
|
||
runTest("isTrident", browser !== "Internet Explorer" && Flags.trident, ()=>{
|
||
engine = "Trident";
|
||
const rRv = /rv:[0-9.]+/i.exec(UA);
|
||
if (rRv && rRv.length) {
|
||
browser = "Internet Explorer";
|
||
const ver_str = rRv[0].split(":")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
}
|
||
);
|
||
runTest("isEdge", Versions.edge, EDGE=>{
|
||
browser = "Edge";
|
||
engine = "Edge";
|
||
const ver_str = EDGE.split("/")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
);
|
||
runTest("isEdgeChromium", Versions.edgeChromium, EDGECHR=>{
|
||
browser = "Edge";
|
||
engine = "Chromium";
|
||
const ver_str = EDGECHR.split("/")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
);
|
||
runTest("isSafari", Flags.safari && !Flags.nokia && !Flags.chrome && !Flags.chromium && !Flags.genericIE && !Flags.blackberry, ()=>{
|
||
browser = "Safari";
|
||
engine = "WebKit";
|
||
const rVersion = /version\/[0-9.]+/i.exec(UA);
|
||
const rChromeiOS = /crios\/[0-9.]+/i.exec(UA);
|
||
const rFirefoxiOS = /fxios\/[0-9.]+/i.exec(UA);
|
||
if (rVersion && rVersion.length) {
|
||
const ver_str = rVersion[0].split("/")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
if (rChromeiOS && rChromeiOS.length) {
|
||
browser = "Chrome for iOS";
|
||
const ver_str = rChromeiOS[0].split("/")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
if (rFirefoxiOS && rFirefoxiOS.length) {
|
||
browser = "Firefox for iOS";
|
||
const ver_str = rFirefoxiOS[0].split("/")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
}
|
||
);
|
||
runTest("isSilk", Versions.silk, SILK=>{
|
||
browser = "Silk";
|
||
const ver_str = SILK.split("/")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
);
|
||
runTest("isCrosswalk", Flags.crosswalk, ()=>context = "crosswalk");
|
||
runTest("isCordova", self["device"] && (self["device"]["cordova"] || self["device"]["phonegap"]), ()=>context = "cordova");
|
||
runTest("isNWJS", Versions.nwjs, NWJS=>{
|
||
context = "nwjs";
|
||
browser = "NW.js";
|
||
engine = "Chromium";
|
||
const ver_str = NWJS.split("/")[1];
|
||
if (ver_str)
|
||
browser_version = ver_str
|
||
}
|
||
);
|
||
runTest("isAmazonWebApp", Flags.amazonwebapp, ()=>context = "webapp");
|
||
runTest("isHomeScreenWebApp", context !== "nwjs" && typeof window !== "undefined" && (window.matchMedia && window.matchMedia("(display-mode: standalone)").matches || navigator["standalone"]), ()=>context = "webapp");
|
||
runTest("isFalseSafari", browser === "Safari" && (os === "Android" || os === "Tizen" || os === "Blackberry"), ()=>browser = "stock");
|
||
runTest("isAndroidWebview", browser === "Chrome" && context === "browser" && Flags.webview, ()=>context = "webview");
|
||
runTest("isFirefoxOS", browser === "Firefox" && os === UNKNOWN, ()=>os = "Firefox OS");
|
||
runTest("isAndroidFallback", os === UNKNOWN && !Flags.windowsTizen && Flags.android, ()=>os = "Android");
|
||
runTest("isTridentFallback", os === UNKNOWN && Flags.trident, ()=>engine = "Trident");
|
||
runTest("isWebkitFallback", os === UNKNOWN && Flags.webkit, ()=>engine = "WebKit");
|
||
runTest("is64Bit", (is64=>{
|
||
return is64.test(UA) || is64.test(navigator.platform) || navigator.cpuClass === "x64"
|
||
}
|
||
)(/x86_64|x86-64|win64|x64;|x64\)|x64_|amd64|wow64|ia64|arm64|arch64|sparc64|ppc64|irix64/i), ()=>os_arch = "64-bit");
|
||
runTest("is32Bit", (is32=>{
|
||
return is32.test(UA) || is32.test(navigator.platform) || navigator.cpuClass === "x86"
|
||
}
|
||
)(/x86;|x86\)|i86|i386|i486|i586|i686|armv1|armv2|armv3|armv4|armv5|armv6|armv7/i), ()=>os_arch = "32-bit");
|
||
runTest("is64BitFallback", os_arch === UNKNOWN && os === "Mac OS X" && parseFloat(os_version) >= 10.7, ()=>os_arch = "64-bit");
|
||
runTest("is32BitFallback", os_arch === UNKNOWN && os === "Windows" || os === "Android" && parseFloat(os_version) < 5, ()=>os_arch = "32-bit");
|
||
runTest("is32BitBrowser", os_arch === "32-bit" || /wow64/i.test(UA), ()=>browser_arch = "32-bit");
|
||
runTest("is64BitBrowser", /win64/i.test(UA), ()=>browser_arch = "64-bit");
|
||
runTest("isDesktop", (()=>{
|
||
return os === "Windows" || os === "Mac OS X" || os === "Linux" || os === "Chrome OS" || context === "nwjs"
|
||
}
|
||
)(), ()=>is_desktop = true);
|
||
if (engine === "Edge" && typeof Windows !== "undefined" && typeof Windows["System"] !== "undefined")
|
||
context = "windows-store";
|
||
is_desktop_app = context === "nwjs";
|
||
const is_ipad_os = os === "Mac OS X" && navigator["maxTouchPoints"] && navigator["maxTouchPoints"] > 2;
|
||
if (is_ipad_os) {
|
||
os = "iOS";
|
||
os_version = browser_version;
|
||
is_desktop = false;
|
||
is_desktop_app = false
|
||
}
|
||
C3.Platform = {
|
||
OS: os,
|
||
OSVersion: os_version,
|
||
OSArchitecture: os_arch,
|
||
Browser: browser,
|
||
BrowserVersion: browser_version,
|
||
BrowserVersionNumber: parseFloat(browser_version),
|
||
BrowserArchitecture: browser_arch,
|
||
BrowserEngine: engine,
|
||
Context: context,
|
||
IsDesktop: is_desktop,
|
||
IsMobile: !is_desktop,
|
||
IsDesktopApp: is_desktop_app,
|
||
IsChromeWebStore: !!(self["chrome"] && self["chrome"]["runtime"] && self["chrome"]["runtime"]["id"]),
|
||
IsAppleOS: os === "Mac OS X" || os === "iOS",
|
||
IsIpadOS: is_ipad_os
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const VERSION = 2;
|
||
const STORE_NAME = "keyvaluepairs";
|
||
const DATABASE_PROMISE_MAP = new Map;
|
||
const SUPPORTS_GETALL = typeof IDBObjectStore !== "undefined" && typeof IDBObjectStore.prototype.getAll === "function";
|
||
const SUPPORTS_GETALLKEYS = typeof IDBObjectStore !== "undefined" && typeof IDBObjectStore.prototype.getAllKeys === "function";
|
||
function asyncifyRequest(request) {
|
||
return new Promise((res,rej)=>{
|
||
request.onsuccess = ()=>res(request.result);
|
||
request.onerror = ()=>rej(request.error)
|
||
}
|
||
)
|
||
}
|
||
function asyncifyTransaction(tx) {
|
||
return new Promise((res,rej)=>{
|
||
tx.oncomplete = ()=>res();
|
||
tx.onerror = ()=>rej(tx.error);
|
||
tx.onabort = ()=>rej(tx.error)
|
||
}
|
||
)
|
||
}
|
||
function openReadOnlyTransaction(name, method) {
|
||
return openTransaction(name, method)
|
||
}
|
||
function openWriteTransaction(name, method) {
|
||
return openTransaction(name, method, true)
|
||
}
|
||
async function openTransaction(name, method, write=false, allowRetry=true) {
|
||
const db = await lazyOpenDatabase(name);
|
||
try {
|
||
const tx = db.transaction([STORE_NAME], write ? "readwrite" : "readonly");
|
||
return method(tx)
|
||
} catch (err) {
|
||
if (allowRetry && err["name"] === "InvalidStateError") {
|
||
DATABASE_PROMISE_MAP.delete(name);
|
||
return openTransaction(name, method, write, false)
|
||
} else
|
||
throw err;
|
||
}
|
||
}
|
||
function lazyOpenDatabase(name) {
|
||
RequireString(name);
|
||
let dbPromise = DATABASE_PROMISE_MAP.get(name);
|
||
if (!(dbPromise instanceof Promise)) {
|
||
dbPromise = openDatabase(name);
|
||
DATABASE_PROMISE_MAP.set(name, dbPromise);
|
||
dbPromise.catch(err=>DATABASE_PROMISE_MAP.delete(name))
|
||
}
|
||
return dbPromise
|
||
}
|
||
async function openDatabase(name) {
|
||
RequireString(name);
|
||
const openRequest = indexedDB.open(name, VERSION);
|
||
openRequest.addEventListener("upgradeneeded", e=>{
|
||
try {
|
||
const db = e.target.result;
|
||
db.createObjectStore(STORE_NAME)
|
||
} catch (err) {
|
||
console.error(`Failed to create objectstore for database ${name}`, err)
|
||
}
|
||
}
|
||
);
|
||
return asyncifyRequest(openRequest)
|
||
}
|
||
function RequireString(x) {
|
||
if (typeof x !== "string")
|
||
throw new TypeError("expected string");
|
||
}
|
||
function getEntriesFromCursor(tx, type) {
|
||
const request = tx.objectStore(STORE_NAME).openCursor();
|
||
return new Promise(resolve=>{
|
||
const results = [];
|
||
request.onsuccess = event=>{
|
||
const cursor = event.target.result;
|
||
if (cursor) {
|
||
switch (type) {
|
||
case "entries":
|
||
results.push([cursor.key, cursor.value]);
|
||
break;
|
||
case "keys":
|
||
results.push(cursor.key);
|
||
break;
|
||
case "values":
|
||
results.push(cursor.value);
|
||
break
|
||
}
|
||
cursor.continue()
|
||
} else
|
||
resolve(results)
|
||
}
|
||
}
|
||
)
|
||
}
|
||
class KVStorageContainer {
|
||
constructor(name) {
|
||
RequireString(name);
|
||
this.name = name
|
||
}
|
||
async ready() {
|
||
await lazyOpenDatabase(this.name)
|
||
}
|
||
set(key, value) {
|
||
RequireString(key);
|
||
return openWriteTransaction(this.name, async tx=>{
|
||
const request = tx.objectStore(STORE_NAME).put(value, key);
|
||
const requestPromise = asyncifyRequest(request);
|
||
const txPromise = asyncifyTransaction(tx);
|
||
await Promise.all([txPromise, requestPromise])
|
||
}
|
||
)
|
||
}
|
||
get(key) {
|
||
RequireString(key);
|
||
return openReadOnlyTransaction(this.name, async tx=>{
|
||
const request = tx.objectStore(STORE_NAME).get(key);
|
||
const requestPromise = asyncifyRequest(request);
|
||
const txPromise = asyncifyTransaction(tx);
|
||
const [_,value] = await Promise.all([txPromise, requestPromise]);
|
||
return value
|
||
}
|
||
)
|
||
}
|
||
delete(key) {
|
||
RequireString(key);
|
||
return openWriteTransaction(this.name, async tx=>{
|
||
const request = tx.objectStore(STORE_NAME).delete(key);
|
||
const requestPromise = asyncifyRequest(request);
|
||
const txPromise = asyncifyTransaction(tx);
|
||
await Promise.all([txPromise, requestPromise])
|
||
}
|
||
)
|
||
}
|
||
clear() {
|
||
return openWriteTransaction(this.name, async tx=>{
|
||
const request = tx.objectStore(STORE_NAME).clear();
|
||
const requestPromise = asyncifyRequest(request);
|
||
const txPromise = asyncifyTransaction(tx);
|
||
await Promise.all([txPromise, requestPromise])
|
||
}
|
||
)
|
||
}
|
||
keys() {
|
||
return openReadOnlyTransaction(this.name, async tx=>{
|
||
let requestPromise;
|
||
if (SUPPORTS_GETALLKEYS) {
|
||
const request = tx.objectStore(STORE_NAME).getAllKeys();
|
||
requestPromise = asyncifyRequest(request)
|
||
} else
|
||
requestPromise = getEntriesFromCursor(tx, "keys");
|
||
const txPromise = asyncifyTransaction(tx);
|
||
const [_,value] = await Promise.all([txPromise, requestPromise]);
|
||
return value
|
||
}
|
||
)
|
||
}
|
||
values() {
|
||
return openReadOnlyTransaction(this.name, async tx=>{
|
||
let requestPromise;
|
||
if (SUPPORTS_GETALL) {
|
||
const request = tx.objectStore(STORE_NAME).getAll();
|
||
requestPromise = asyncifyRequest(request)
|
||
} else
|
||
requestPromise = getEntriesFromCursor(tx, "values");
|
||
const txPromise = asyncifyTransaction(tx);
|
||
const [_,value] = await Promise.all([txPromise, requestPromise]);
|
||
return value
|
||
}
|
||
)
|
||
}
|
||
entries() {
|
||
return openReadOnlyTransaction(this.name, async tx=>{
|
||
const requestPromise = getEntriesFromCursor(tx, "entries");
|
||
const txPromise = asyncifyTransaction(tx);
|
||
const [_,value] = await Promise.all([txPromise, requestPromise]);
|
||
return value
|
||
}
|
||
)
|
||
}
|
||
}
|
||
self.KVStorageContainer = KVStorageContainer
|
||
}
|
||
;'use strict';
|
||
{
|
||
const KVStorageContainer = self.KVStorageContainer;
|
||
const CRITICAL_ERRORS = [/no available storage method found/i, /an attempt was made to break through the security policy of the user agent/i, /the user denied permission to access the database/i, /a mutation operation was attempted on a database that did not allow mutations/i, /idbfactory\.open\(\) called in an invalid security context/i];
|
||
const memoryStorage = new WeakMap;
|
||
let isInMemory = false;
|
||
if (typeof indexedDB === "undefined") {
|
||
isInMemory = true;
|
||
console.warn("Unable to use local storage because indexedDB is not defined")
|
||
}
|
||
function NOT_IMPLEMENTED(name) {
|
||
throw new Error(`"${name}" is not implemented`);
|
||
}
|
||
function DISALLOW_CALLBACK(fn) {
|
||
if (typeof fn === "function")
|
||
throw new Error(`localforage callback API is not implemented; please use the promise API instead`);
|
||
}
|
||
function StructuredClone(value) {
|
||
if (typeof value === "object")
|
||
return new Promise(resolve=>{
|
||
const {port1, port2} = new MessageChannel;
|
||
port2.onmessage = ev=>resolve(ev.data);
|
||
port1.postMessage(value)
|
||
}
|
||
);
|
||
else
|
||
return Promise.resolve(value)
|
||
}
|
||
class ForageAdaptor {
|
||
constructor(inst) {
|
||
this._inst = inst;
|
||
memoryStorage.set(this, new Map)
|
||
}
|
||
_MaybeSwitchToMemoryFallback(err) {
|
||
if (isInMemory)
|
||
return;
|
||
for (const regex of CRITICAL_ERRORS)
|
||
if (err && regex.test(err.message)) {
|
||
console.error("Unable to use local storage, reverting to in-memory store: ", err, err.message);
|
||
isInMemory = true;
|
||
break
|
||
}
|
||
}
|
||
async _getItemFallback(name) {
|
||
const value = memoryStorage.get(this).get(name);
|
||
const ret = await StructuredClone(value);
|
||
return typeof ret === "undefined" ? null : ret
|
||
}
|
||
async _setItemFallback(name, value) {
|
||
value = await StructuredClone(value);
|
||
memoryStorage.get(this).set(name, value)
|
||
}
|
||
_removeItemFallback(name) {
|
||
memoryStorage.get(this).delete(name)
|
||
}
|
||
_clearFallback() {
|
||
memoryStorage.get(this).clear()
|
||
}
|
||
_keysFallback() {
|
||
return Array.from(memoryStorage.get(this).keys())
|
||
}
|
||
IsUsingFallback() {
|
||
return isInMemory
|
||
}
|
||
async getItem(key, successCallback) {
|
||
DISALLOW_CALLBACK(successCallback);
|
||
if (isInMemory)
|
||
return await this._getItemFallback(key);
|
||
let result;
|
||
try {
|
||
result = await this._inst.get(key)
|
||
} catch (err) {
|
||
this._MaybeSwitchToMemoryFallback(err);
|
||
if (isInMemory)
|
||
return await this._getItemFallback(key);
|
||
else {
|
||
console.error(`Error reading '${key}' from storage, returning null: `, err);
|
||
return null
|
||
}
|
||
}
|
||
return typeof result === "undefined" ? null : result
|
||
}
|
||
async setItem(key, value, successCallback) {
|
||
DISALLOW_CALLBACK(successCallback);
|
||
if (typeof value === "undefined")
|
||
value = null;
|
||
if (isInMemory) {
|
||
await this._setItemFallback(key, value);
|
||
return
|
||
}
|
||
try {
|
||
await this._inst.set(key, value)
|
||
} catch (err) {
|
||
this._MaybeSwitchToMemoryFallback(err);
|
||
if (isInMemory)
|
||
await this._setItemFallback(key, value);
|
||
else
|
||
throw err;
|
||
}
|
||
}
|
||
async removeItem(key, successCallback) {
|
||
DISALLOW_CALLBACK(successCallback);
|
||
if (isInMemory) {
|
||
this._removeItemFallback(key);
|
||
return
|
||
}
|
||
try {
|
||
await this._inst.delete(key)
|
||
} catch (err) {
|
||
this._MaybeSwitchToMemoryFallback(err);
|
||
if (isInMemory)
|
||
this._removeItemFallback(key);
|
||
else
|
||
console.error(`Error removing '${key}' from storage: `, err)
|
||
}
|
||
}
|
||
async clear(successCallback) {
|
||
DISALLOW_CALLBACK(successCallback);
|
||
if (isInMemory) {
|
||
this._clearFallback();
|
||
return
|
||
}
|
||
try {
|
||
await this._inst.clear()
|
||
} catch (err) {
|
||
this._MaybeSwitchToMemoryFallback(err);
|
||
if (isInMemory)
|
||
this._clearFallback();
|
||
else
|
||
console.error(`Error clearing storage: `, err)
|
||
}
|
||
}
|
||
async keys(successCallback) {
|
||
DISALLOW_CALLBACK(successCallback);
|
||
if (isInMemory)
|
||
return this._keysFallback();
|
||
let result = [];
|
||
try {
|
||
result = await this._inst.keys()
|
||
} catch (err) {
|
||
this._MaybeSwitchToMemoryFallback(err);
|
||
if (isInMemory)
|
||
return this._keysFallback();
|
||
else
|
||
console.error(`Error getting storage keys: `, err)
|
||
}
|
||
return result
|
||
}
|
||
ready(successCallback) {
|
||
DISALLOW_CALLBACK(successCallback);
|
||
if (isInMemory)
|
||
return Promise.resolve(true);
|
||
else
|
||
return this._inst.ready()
|
||
}
|
||
createInstance(options) {
|
||
if (typeof options !== "object")
|
||
throw new TypeError("invalid options object");
|
||
const name = options["name"];
|
||
if (typeof name !== "string")
|
||
throw new TypeError("invalid store name");
|
||
const inst = new KVStorageContainer(name);
|
||
return new ForageAdaptor(inst)
|
||
}
|
||
length(successCallback) {
|
||
NOT_IMPLEMENTED("localforage.length()")
|
||
}
|
||
key(index, successCallback) {
|
||
NOT_IMPLEMENTED("localforage.key()")
|
||
}
|
||
iterate(iteratorCallback, successCallback) {
|
||
NOT_IMPLEMENTED("localforage.iterate()")
|
||
}
|
||
setDriver(driverName) {
|
||
NOT_IMPLEMENTED("localforage.setDriver()")
|
||
}
|
||
config(options) {
|
||
NOT_IMPLEMENTED("localforage.config()")
|
||
}
|
||
defineDriver(customDriver) {
|
||
NOT_IMPLEMENTED("localforage.defineDriver()")
|
||
}
|
||
driver() {
|
||
NOT_IMPLEMENTED("localforage.driver()")
|
||
}
|
||
supports(driverName) {
|
||
NOT_IMPLEMENTED("localforage.supports()")
|
||
}
|
||
dropInstance() {
|
||
NOT_IMPLEMENTED("localforage.dropInstance()")
|
||
}
|
||
disableMemoryMode() {
|
||
isInMemory = false
|
||
}
|
||
}
|
||
self["localforage"] = new ForageAdaptor(new KVStorageContainer("localforage"))
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Supports = {};
|
||
C3.Supports.WebAnimations = (()=>{
|
||
try {
|
||
if (C3.Platform.Browser === "Safari")
|
||
return false;
|
||
if (typeof document === "undefined")
|
||
return false;
|
||
const e = document.createElement("div");
|
||
if (typeof e.animate === "undefined")
|
||
return false;
|
||
const player = e.animate([{
|
||
opacity: "0"
|
||
}, {
|
||
opacity: "1"
|
||
}], 1E3);
|
||
return typeof player.reverse !== "undefined"
|
||
} catch (e) {
|
||
return false
|
||
}
|
||
}
|
||
)();
|
||
C3.Supports.DialogElement = typeof HTMLDialogElement !== "undefined";
|
||
C3.Supports.RequestIdleCallback = !!self.requestIdleCallback;
|
||
C3.Supports.ImageBitmap = !!self.createImageBitmap;
|
||
C3.Supports.ImageBitmapOptions = false;
|
||
if (C3.Supports.ImageBitmap)
|
||
try {
|
||
self.createImageBitmap(new ImageData(32,32), {
|
||
premultiplyAlpha: "none"
|
||
}).then(imageBitmap=>{
|
||
C3.Supports.ImageBitmapOptions = true
|
||
}
|
||
).catch(err=>{
|
||
C3.Supports.ImageBitmapOptions = false
|
||
}
|
||
)
|
||
} catch (e) {
|
||
C3.Supports.ImageBitmapOptions = false
|
||
}
|
||
C3.Supports.ClipboardReadText = !!(navigator["clipboard"] && navigator["clipboard"]["readText"] && C3.Platform.Browser !== "Firefox");
|
||
C3.Supports.PermissionsQuery = !!(navigator["permissions"] && navigator["permissions"]["query"]);
|
||
C3.Supports.Proxies = typeof Proxy !== "undefined";
|
||
C3.Supports.DownloadAttribute = (()=>{
|
||
if (typeof document === "undefined")
|
||
return false;
|
||
const a = document.createElement("a");
|
||
return typeof a.download !== "undefined"
|
||
}
|
||
)();
|
||
C3.Supports.CanvasToBlob = (()=>{
|
||
return typeof HTMLCanvasElement !== "undefined" && HTMLCanvasElement.prototype.toBlob
|
||
}
|
||
)();
|
||
C3.Supports.Fetch = typeof fetch === "function";
|
||
C3.Supports.PersistentStorage = !!(self.isSecureContext && C3.Platform.Browser !== "Opera" && (navigator["storage"] && navigator["storage"]["persist"]));
|
||
C3.Supports.StorageQuotaEstimate = !!(self.isSecureContext && (navigator["storage"] && navigator["storage"]["estimate"]));
|
||
C3.Supports.Fullscreen = (()=>{
|
||
if (typeof document === "undefined")
|
||
return false;
|
||
if (C3.Platform.OS === "iOS")
|
||
return false;
|
||
const elem = document.documentElement;
|
||
return !!(elem.requestFullscreen || elem.msRequestFullscreen || elem.mozRequestFullScreen || elem.webkitRequestFullscreen)
|
||
}
|
||
)();
|
||
C3.Supports.ImageDecoder = typeof self["ImageDecoder"] !== "undefined";
|
||
C3.Supports.NativeFileSystemAPI = !!self["showOpenFilePicker"];
|
||
C3.Supports.NavigatorFontsQuery = !!(navigator["fonts"] && navigator["fonts"]["query"])
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
if (!String.prototype.trimStart) {
|
||
const startWhitespace = /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]*/;
|
||
String.prototype.trimStart = function trimStart() {
|
||
return this.replace(startWhitespace, "")
|
||
}
|
||
}
|
||
if (!String.prototype.trimEnd) {
|
||
const endWhitespace = /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]*$/;
|
||
String.prototype.trimEnd = function trimEnd() {
|
||
return this.replace(endWhitespace, "")
|
||
}
|
||
}
|
||
if (!String.prototype.replaceAll)
|
||
String.prototype.replaceAll = function replaceAll(find, replace) {
|
||
return this.replace(new RegExp(C3.EscapeRegex(find),"g"), replace)
|
||
}
|
||
;
|
||
if (!Array.prototype.values)
|
||
Array.prototype.values = function*() {
|
||
for (const i of this)
|
||
yield i
|
||
}
|
||
;
|
||
if (!Array.prototype.flat) {
|
||
function arrayFlat(arr, depth) {
|
||
return arr.reduce((acc,val)=>{
|
||
if (depth > 0 && Array.isArray(val)) {
|
||
Array.prototype.push.apply(acc, arrayFlat(val, depth - 1));
|
||
return acc
|
||
} else {
|
||
acc.push(val);
|
||
return acc
|
||
}
|
||
}
|
||
, [])
|
||
}
|
||
Array.prototype.flat = function(depth=1) {
|
||
return arrayFlat(this, depth)
|
||
}
|
||
}
|
||
if (!RegExp.escape)
|
||
RegExp.escape = function(s) {
|
||
return String(s).replace(/[\\^$*+?.()|[\]{}]/g, "\\$&")
|
||
}
|
||
;
|
||
if (navigator["storage"] && !navigator["storage"]["estimate"] && navigator["webkitTemporaryStorage"] && navigator["webkitTemporaryStorage"]["queryUsageAndQuota"])
|
||
navigator["storage"]["estimate"] = function() {
|
||
return new Promise((resolve,reject)=>{
|
||
return navigator["webkitTemporaryStorage"]["queryUsageAndQuota"]((usage,quota)=>resolve({
|
||
"usage": usage,
|
||
"quota": quota
|
||
}), reject)
|
||
}
|
||
)
|
||
}
|
||
;
|
||
if (typeof HTMLCollection !== "undefined" && !HTMLCollection.prototype[Symbol.iterator])
|
||
HTMLCollection.prototype[Symbol.iterator] = function() {
|
||
let i = 0;
|
||
return {
|
||
next: ()=>{
|
||
if (i >= this.length)
|
||
return {
|
||
done: true
|
||
};
|
||
else
|
||
return {
|
||
value: this.item(i++),
|
||
done: false
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;
|
||
if (typeof NodeList !== "undefined" && !NodeList.prototype[Symbol.iterator])
|
||
NodeList.prototype[Symbol.iterator] = function() {
|
||
let i = 0;
|
||
return {
|
||
next: ()=>{
|
||
if (i >= this.length)
|
||
return {
|
||
done: true
|
||
};
|
||
else
|
||
return {
|
||
value: this.item(i++),
|
||
done: false
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;
|
||
if (typeof DOMTokenList !== "undefined" && !DOMTokenList.prototype[Symbol.iterator])
|
||
DOMTokenList.prototype[Symbol.iterator] = function() {
|
||
let i = 0;
|
||
return {
|
||
next: ()=>{
|
||
if (i >= this.length)
|
||
return {
|
||
done: true
|
||
};
|
||
else
|
||
return {
|
||
value: this.item(i++),
|
||
done: false
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;
|
||
if (typeof FileList !== "undefined" && !FileList.prototype[Symbol.iterator])
|
||
FileList.prototype[Symbol.iterator] = function() {
|
||
let i = 0;
|
||
return {
|
||
next: ()=>{
|
||
if (i >= this.length)
|
||
return {
|
||
done: true
|
||
};
|
||
else
|
||
return {
|
||
value: this.item(i++),
|
||
done: false
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;
|
||
if (typeof TextEncoder === "undefined") {
|
||
self.TextEncoder = class TextEncoder {
|
||
constructor() {
|
||
Object.defineProperty(this, "encoding", {
|
||
"value": "utf-8",
|
||
"writable": false
|
||
})
|
||
}
|
||
encode(str) {
|
||
var Len = str.length
|
||
, resPos = -1;
|
||
var resArr = new Uint8Array(Len * 3);
|
||
for (var point = 0, nextcode = 0, i = 0; i !== Len; ) {
|
||
point = str.charCodeAt(i),
|
||
i += 1;
|
||
if (point >= 55296 && point <= 56319) {
|
||
if (i === Len) {
|
||
resArr[resPos += 1] = 239;
|
||
resArr[resPos += 1] = 191;
|
||
resArr[resPos += 1] = 189;
|
||
break
|
||
}
|
||
nextcode = str.charCodeAt(i);
|
||
if (nextcode >= 56320 && nextcode <= 57343) {
|
||
point = (point - 55296) * 1024 + nextcode - 56320 + 65536;
|
||
i += 1;
|
||
if (point > 65535) {
|
||
resArr[resPos += 1] = 30 << 3 | point >>> 18;
|
||
resArr[resPos += 1] = 2 << 6 | point >>> 12 & 63;
|
||
resArr[resPos += 1] = 2 << 6 | point >>> 6 & 63;
|
||
resArr[resPos += 1] = 2 << 6 | point & 63;
|
||
continue
|
||
}
|
||
} else {
|
||
resArr[resPos += 1] = 239;
|
||
resArr[resPos += 1] = 191;
|
||
resArr[resPos += 1] = 189;
|
||
continue
|
||
}
|
||
}
|
||
if (point <= 127)
|
||
resArr[resPos += 1] = 0 << 7 | point;
|
||
else if (point <= 2047) {
|
||
resArr[resPos += 1] = 6 << 5 | point >>> 6;
|
||
resArr[resPos += 1] = 2 << 6 | point & 63
|
||
} else {
|
||
resArr[resPos += 1] = 14 << 4 | point >>> 12;
|
||
resArr[resPos += 1] = 2 << 6 | point >>> 6 & 63;
|
||
resArr[resPos += 1] = 2 << 6 | point & 63
|
||
}
|
||
}
|
||
return new Uint8Array(resArr.buffer.slice(0, resPos + 1))
|
||
}
|
||
toString() {
|
||
return "[object TextEncoder]"
|
||
}
|
||
}
|
||
;
|
||
TextEncoder[Symbol.toStringTag] = "TextEncoder"
|
||
}
|
||
if (typeof TextDecoder === "undefined") {
|
||
function persist(iterable) {
|
||
const itr = iterable[Symbol.iterator]();
|
||
return {
|
||
next: _=>itr.next(),
|
||
[Symbol.iterator]() {
|
||
return this
|
||
}
|
||
}
|
||
}
|
||
function readNext(bytes) {
|
||
const n = bytes.next();
|
||
if (n.done)
|
||
throw new Error("unexpected end of input");
|
||
if ((n.value & 192 ^ 128) != 0)
|
||
throw new Error("invalid byte");
|
||
return n.value & 63
|
||
}
|
||
const _decoders = new Map;
|
||
_decoders.set("utf-8", (arr,fatal)=>{
|
||
let view;
|
||
if (arr.buffer)
|
||
view = new Uint8Array(arr.buffer,arr.byteOffset,arr.byteLength);
|
||
else if (view instanceof ArrayBuffer)
|
||
view = new Uint8Array(arr);
|
||
else
|
||
throw new Error("Invalid parameter");
|
||
const bytes = persist(view);
|
||
const result = [];
|
||
try {
|
||
for (const ch of bytes) {
|
||
let val;
|
||
if (ch < 127)
|
||
val = ch & 127;
|
||
else if (ch < 223)
|
||
val = (ch & 31) << 6 | readNext(bytes);
|
||
else if (ch < 239)
|
||
val = (ch & 15) << 12 | readNext(bytes) << 6 | readNext(bytes);
|
||
else if (ch < 247)
|
||
val = (ch & 7) << 18 | readNext(bytes) << 12 | readNext(bytes) << 6 | readNext(bytes);
|
||
else
|
||
throw new Error("Invalid character");
|
||
result.push(String.fromCodePoint(val))
|
||
}
|
||
} catch (e) {
|
||
if (fatal)
|
||
throw e;
|
||
result.push("\ufffd")
|
||
}
|
||
return result.join("")
|
||
}
|
||
);
|
||
_decoders.set("utf8", _decoders.get("utf-8"));
|
||
_decoders.set("utf-16le", (arr,fatal)=>{
|
||
throw new Error("utf-16le decoder not implemented");
|
||
}
|
||
);
|
||
self.TextDecoder = class TextDecoder {
|
||
constructor(label="utf-8", options={}) {
|
||
const decoder = _decoders.get(label);
|
||
if (!decoder)
|
||
throw new Error(`TextDecoder polyfill does not support "${label}"`);
|
||
Object.defineProperty(this, "fatal", {
|
||
"value": options["fatal"] === true,
|
||
"writable": false
|
||
});
|
||
Object.defineProperty(this, "_decoder", {
|
||
"value": decoder,
|
||
"writable": false
|
||
});
|
||
Object.defineProperty(this, "encoding", {
|
||
"value": label,
|
||
"writable": false
|
||
})
|
||
}
|
||
decode(arr) {
|
||
return this["_decoder"](arr, this["fatal"])
|
||
}
|
||
toString() {
|
||
return "[object TextDecoder]"
|
||
}
|
||
}
|
||
;
|
||
TextDecoder[Symbol.toStringTag] = "TextDecoder"
|
||
}
|
||
if (typeof self.isSecureContext === "undefined")
|
||
self.isSecureContext = location.protocol === "https:";
|
||
if (typeof self["globalThis"] === "undefined")
|
||
self["globalThis"] = self
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
function assertFail(msg_) {
|
||
let stack = C3.GetCallStack();
|
||
let msg = "Assertion failure: " + msg_ + "\n\nStack trace:\n" + stack;
|
||
console.error(msg)
|
||
}
|
||
self.assert = function assert(cnd_, msg_) {
|
||
if (!cnd_)
|
||
assertFail(msg_)
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.IsNumber = function IsNumber(x) {
|
||
return typeof x === "number"
|
||
}
|
||
;
|
||
C3.IsFiniteNumber = function IsFiniteNumber(x) {
|
||
return C3.IsNumber(x) && isFinite(x)
|
||
}
|
||
;
|
||
C3.RequireNumber = function RequireNumber(x) {
|
||
if (!C3.IsNumber(x))
|
||
throw new TypeError("expected number");
|
||
}
|
||
;
|
||
C3.RequireOptionalNumber = function RequireOptionalNumber(x) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return
|
||
}
|
||
;
|
||
C3.RequireNumberInRange = function RequireNumberInRange(x, low, high) {
|
||
if (!C3.IsNumber(x) || isNaN(x) || low > x || high < x)
|
||
throw new RangeError("number outside of range");
|
||
}
|
||
;
|
||
C3.RequireAllNumber = function RequireAllNumber(...args) {
|
||
for (let a of args)
|
||
;
|
||
}
|
||
;
|
||
C3.RequireFiniteNumber = function RequireFiniteNumber(x) {
|
||
if (!C3.IsFiniteNumber(x))
|
||
throw new TypeError("expected finite number");
|
||
}
|
||
;
|
||
C3.RequireOptionalFiniteNumber = function RequireOptionalFiniteNumber(x) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return
|
||
}
|
||
;
|
||
C3.RequireAllFiniteNumber = function RequireAllFiniteNumber(...args) {
|
||
for (let a of args)
|
||
;
|
||
}
|
||
;
|
||
C3.IsString = function IsString(x) {
|
||
return typeof x === "string"
|
||
}
|
||
;
|
||
C3.RequireString = function RequireString(x) {
|
||
if (!C3.IsString(x))
|
||
throw new TypeError("expected string");
|
||
}
|
||
;
|
||
C3.RequireOptionalString = function RequireOptionalString(x) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return
|
||
}
|
||
;
|
||
C3.RequireAllString = function RequireAllString(...args) {
|
||
for (let a of args)
|
||
;
|
||
}
|
||
;
|
||
C3.IsSimpleObject = function IsSimpleObject(x) {
|
||
if (typeof x !== "object" || x === null)
|
||
return false;
|
||
let proto = Object.getPrototypeOf(x);
|
||
return proto ? proto.constructor === Object : proto === null
|
||
}
|
||
;
|
||
C3.RequireSimpleObject = function RequireSimpleObject(x) {
|
||
if (!C3.IsSimpleObject(x))
|
||
throw new TypeError("expected simple object");
|
||
}
|
||
;
|
||
C3.RequireOptionalSimpleObject = function RequireSimpleObject(x) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return;
|
||
if (!C3.IsSimpleObject(x))
|
||
throw new TypeError("expected simple object");
|
||
}
|
||
;
|
||
C3.IsObject = function IsObject(x) {
|
||
return typeof x === "object" && x !== null && !Array.isArray(x)
|
||
}
|
||
;
|
||
C3.RequireObject = function RequireObject(x) {
|
||
if (!C3.IsObject(x))
|
||
throw new TypeError("expected object");
|
||
}
|
||
;
|
||
C3.RequireOptionalObject = function RequireOptionalObject(x) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return
|
||
}
|
||
;
|
||
C3.RequireAllObject = function RequireAllObject(...args) {
|
||
for (let a of args)
|
||
;
|
||
}
|
||
;
|
||
C3.IsFileLike = function IsFileLike(x) {
|
||
return C3.IsInstanceOf(x, Blob) && typeof x["name"] === "string"
|
||
}
|
||
;
|
||
C3.RequireFileLike = function RequireFileLike(x) {
|
||
if (!C3.IsFileLike(x))
|
||
throw new TypeError("expected file");
|
||
}
|
||
;
|
||
C3.RequireOptionalFileLike = function RequireOptionalFileLike(x) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return
|
||
}
|
||
;
|
||
C3.IsArray = function IsArray(x) {
|
||
return Array.isArray(x)
|
||
}
|
||
;
|
||
C3.RequireArray = function RequireArray(x) {
|
||
if (!C3.IsArray(x))
|
||
throw new TypeError("expected array");
|
||
}
|
||
;
|
||
C3.RequireOptionalArray = function RequireOptionalArray(x) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return
|
||
}
|
||
;
|
||
C3.RequireAllArray = function RequireAllArray(...args) {
|
||
for (let a of args)
|
||
;
|
||
}
|
||
;
|
||
C3.Is2DArray = function(x) {
|
||
if (!C3.IsArray(x))
|
||
return false;
|
||
if (!x.length)
|
||
return true;
|
||
if (!C3.IsArray(x[0]))
|
||
return false;
|
||
return true
|
||
}
|
||
;
|
||
C3.Require2DArray = function Require2DArray(x) {
|
||
if (!C3.Is2DArray(x))
|
||
throw new TypeError("expected 2d array");
|
||
for (let arr of x)
|
||
if (!C3.IsArray(arr))
|
||
throw new TypeError("expected 2d array");
|
||
}
|
||
;
|
||
C3.RequireOptional2DArray = function Require2DArray(x) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return
|
||
}
|
||
;
|
||
C3.IsFunction = function IsFunction(x) {
|
||
return typeof x === "function"
|
||
}
|
||
;
|
||
C3.RequireFunction = function RequireFunction(x, f) {
|
||
if (!C3.IsFunction(x))
|
||
throw new TypeError("expected function");
|
||
if (!C3.IsNullOrUndefined(f))
|
||
if (x !== f)
|
||
throw new TypeError("expected same function reference");
|
||
}
|
||
;
|
||
C3.RequireOptionalFunction = function RequireOptionalFunction(x) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return
|
||
}
|
||
;
|
||
C3.RequireAllFunction = function RequireAllFunction(...args) {
|
||
for (let a of args)
|
||
;
|
||
}
|
||
;
|
||
C3.RequireAnyFunction = function RequireAllFunction(x, ...args) {
|
||
if (!C3.IsFunction(x))
|
||
throw new TypeError("expected function");
|
||
if (!args.length)
|
||
throw new Error("missing comparison functions");
|
||
for (let a of args)
|
||
if (!C3.IsNullOrUndefined(a))
|
||
if (x === a)
|
||
return;
|
||
throw new TypeError("expected same function reference");
|
||
}
|
||
;
|
||
C3.RequireOptionalAllFunction = function RequireAllFunction(...args) {
|
||
if (C3.IsNullOrUndefined(args))
|
||
return;
|
||
for (let a of args)
|
||
;
|
||
}
|
||
;
|
||
C3.IsInstanceOf = function IsInstanceOf(x, t) {
|
||
return x instanceof t
|
||
}
|
||
;
|
||
C3.IsInstanceOfAny = function IsInstanceOfAny(x, ...args) {
|
||
for (let t of args)
|
||
if (C3.IsInstanceOf(x, t))
|
||
return true;
|
||
return false
|
||
}
|
||
;
|
||
C3.RequireInstanceOf = function RequireInstanceOf(x, t) {
|
||
if (!C3.IsInstanceOf(x, t))
|
||
throw new TypeError("unexpected type");
|
||
}
|
||
;
|
||
C3.RequireOptionalInstanceOf = function RequireOptionalInstanceOf(x, t) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return
|
||
}
|
||
;
|
||
C3.RequireAllInstanceOf = function RequireAllInstanceOf(t, ...args) {
|
||
for (let a of args)
|
||
;
|
||
}
|
||
;
|
||
C3.RequireAnyInstanceOf = function RequireAnyInstanceOf(x, ...args) {
|
||
if (!C3.IsInstanceOfAny(x, ...args))
|
||
throw new TypeError("unexpected type");
|
||
}
|
||
;
|
||
C3.RequireAnyOptionalInstanceOf = function RequireAnyOptionalInstanceOf(x, ...args) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return;
|
||
if (!C3.IsInstanceOfAny(x, ...args))
|
||
throw new TypeError("unexpected type");
|
||
}
|
||
;
|
||
C3.IsArrayOf = function IsArrayOf(x, t) {
|
||
for (let i of x)
|
||
if (!C3.IsInstanceOf(i, t))
|
||
return false;
|
||
return true
|
||
}
|
||
;
|
||
C3.IsArrayOfFiniteNumbers = function IsArrayOf(x) {
|
||
for (let i of x)
|
||
if (!C3.IsFiniteNumber(i))
|
||
return false;
|
||
return true
|
||
}
|
||
;
|
||
C3.RequireArrayOf = function RequireArrayOf(x, t) {
|
||
for (let i of x)
|
||
;
|
||
}
|
||
;
|
||
C3.RequireOptionalArrayOf = function RequireOptionalArrayOf(x, t) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return;
|
||
for (let i of x)
|
||
;
|
||
}
|
||
;
|
||
C3.RequireArrayOfAny = function RequireArrayOf(x, ...args) {
|
||
for (let i of x)
|
||
;
|
||
}
|
||
;
|
||
C3.RequireOptionalArrayOfAny = function RequireOptionalArrayOfAny(x, ...args) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return;
|
||
for (let i of x)
|
||
;
|
||
}
|
||
;
|
||
C3.IsDOMNode = function IsDOMNode(d, n) {
|
||
if (C3.IsNullOrUndefined(d) || !C3.IsString(d.nodeName))
|
||
return false;
|
||
return !n || C3.equalsNoCase(d.nodeName, n)
|
||
}
|
||
;
|
||
C3.RequireDOMNode = function RequireDOMNode(d, n) {
|
||
if (C3.IsNullOrUndefined(d) || !C3.IsString(d.nodeName))
|
||
throw new TypeError("expected DOM node");
|
||
if (n && !C3.equalsNoCase(d.nodeName, n))
|
||
throw new TypeError(`expected DOM '${n}' node`);
|
||
}
|
||
;
|
||
C3.RequireOptionalDOMNode = function RequireOptionalDOMNode(d, n) {
|
||
if (C3.IsNullOrUndefined(d))
|
||
return
|
||
}
|
||
;
|
||
C3.IsHTMLElement = function IsHTMLElement(e, t) {
|
||
if (C3.IsNullOrUndefined(e) || !C3.IsString(e.tagName))
|
||
return false;
|
||
return !t || C3.equalsNoCase(e.tagName, t)
|
||
}
|
||
;
|
||
C3.RequireHTMLElement = function RequireHTMLElement(e, t) {
|
||
if (C3.IsNullOrUndefined(e) || !C3.IsString(e.tagName))
|
||
throw new TypeError("expected HTML element");
|
||
if (t && !C3.equalsNoCase(e.tagName, t))
|
||
throw new TypeError(`expected HTML '${t}' element`);
|
||
}
|
||
;
|
||
C3.RequireOptionalHTMLElement = function RequireOptionalHTMLElement(e, t) {
|
||
if (C3.IsNullOrUndefined(e))
|
||
return
|
||
}
|
||
;
|
||
C3.IsDrawable = function IsDrawable(d) {
|
||
return C3.IsHTMLElement(d, "img") || C3.IsHTMLElement(d, "canvas") || C3.IsHTMLElement(d, "video") || typeof OffscreenCanvas !== "undefined" && d instanceof OffscreenCanvas || typeof ImageBitmap !== "undefined" && d instanceof ImageBitmap
|
||
}
|
||
;
|
||
C3.RequireDrawable = function RequireDrawable(d) {
|
||
if (!C3.IsDrawable(d))
|
||
throw new TypeError("expected drawable");
|
||
}
|
||
;
|
||
C3.RequireOptionalDrawable = function RequireOptionalDrawable(d) {
|
||
if (C3.IsNullOrUndefined(d))
|
||
return
|
||
}
|
||
;
|
||
C3.IsDrawableOrImageData = function IsDrawableOrImageData(x) {
|
||
if (x instanceof ImageData)
|
||
return true;
|
||
return C3.IsDrawable(x)
|
||
}
|
||
;
|
||
C3.RequireDrawableOrImageData = function RequireDrawableOrImageData(d) {
|
||
if (!C3.IsDrawableOrImageData(d))
|
||
throw new TypeError("expected drawable or image data");
|
||
}
|
||
;
|
||
C3.RequireOptionalDrawableOrImageData = function RequireOptionalDrawableOrImageData(d) {
|
||
if (C3.IsNullOrUndefined(d))
|
||
return;
|
||
if (!C3.IsDrawableOrImageData(d))
|
||
throw new TypeError("expected drawable or image data");
|
||
}
|
||
;
|
||
C3.IsStringLike = function IsStringLike(x) {
|
||
return typeof x === "string" || x instanceof C3.HtmlString || x instanceof C3.BBString
|
||
}
|
||
;
|
||
C3.RequireStringLike = function RequireStringLike(x) {
|
||
if (!C3.IsStringLike(x))
|
||
throw new TypeError("expected string-like");
|
||
}
|
||
;
|
||
C3.RequireOptionalStringLike = function RequireOptionalStringLike(x) {
|
||
if (C3.IsNullOrUndefined(x))
|
||
return
|
||
}
|
||
;
|
||
C3.RequireAllStringLike = function RequireAllStringLike(...args) {
|
||
for (let a of args)
|
||
;
|
||
}
|
||
;
|
||
C3.RequireOverride = function RequireOverride() {
|
||
throw new Error("must be overridden");
|
||
}
|
||
;
|
||
C3.NotYetImplemented = function NotYetImplemented() {
|
||
throw new Error("not yet implemented");
|
||
}
|
||
;
|
||
C3.IsDefined = function isDefined(obj, ...follow) {
|
||
let currentObject = obj;
|
||
if (typeof currentObject === "undefined")
|
||
return false;
|
||
for (let key of follow) {
|
||
if (typeof currentObject[key] === "undefined")
|
||
return false;
|
||
currentObject = currentObject[key]
|
||
}
|
||
return true
|
||
}
|
||
;
|
||
C3.IsNullOrUndefined = function(x) {
|
||
return typeof x === "undefined" || x === null
|
||
}
|
||
;
|
||
C3.AreArrayElementsOfSameType = function(arr) {
|
||
let type = arr[0].constructor;
|
||
for (let x of arr)
|
||
if (x.constructor !== type)
|
||
return false;
|
||
return type
|
||
}
|
||
;
|
||
C3.AreArrayElementsOfType = function(arr, t) {
|
||
for (let x of arr)
|
||
if (!(x instanceof t))
|
||
return false;
|
||
return true
|
||
}
|
||
;
|
||
const TypedArray = Object.getPrototypeOf(Uint8Array);
|
||
C3.IsTypedArray = function(view) {
|
||
return C3.IsInstanceOf(view, TypedArray)
|
||
}
|
||
;
|
||
C3.RequireTypedArray = function(view) {}
|
||
;
|
||
C3.WeakRequireTypedArray = function WeakRequireTypedArray(inst) {
|
||
C3.WeakRequireInstanceOf(inst, TypedArray)
|
||
}
|
||
;
|
||
C3.WeakRequireAnyInstanceOf = function WeakRequireAnyInstanceOf(inst, ...ctors) {
|
||
if (!C3.WeakIsAnyInstanceOf(inst, ...ctors))
|
||
throw new TypeError("unexpected type");
|
||
}
|
||
;
|
||
C3.WeakIsAnyInstanceOf = function WeakIsAnyInstanceOf(inst, ...ctors) {
|
||
for (const ctor of ctors)
|
||
if (C3.WeakIsInstanceOf(inst, ctor))
|
||
return true;
|
||
return false
|
||
}
|
||
;
|
||
C3.WeakRequireInstanceOf = function WeakRequireInstanceOf(inst, ctor) {
|
||
if (!C3.WeakIsInstanceOf(inst, ctor))
|
||
throw new TypeError("unexpected type");
|
||
}
|
||
;
|
||
C3.WeakIsInstanceOf = function WeakIsInstanceOf(inst, ctor) {
|
||
while (inst = Object.getPrototypeOf(inst))
|
||
if (inst.constructor.name === ctor.name)
|
||
return true;
|
||
return false
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.GetCallStack = function GetCallStack() {
|
||
return (new Error).stack
|
||
}
|
||
;
|
||
C3.Debugger = function Debugger() {
|
||
debugger
|
||
}
|
||
;
|
||
C3.cast = function cast(o, T) {
|
||
if (o && o instanceof T)
|
||
return o;
|
||
else
|
||
return null
|
||
}
|
||
;
|
||
C3.getName = function getName(o) {
|
||
if (typeof o === "undefined")
|
||
return "undefined";
|
||
if (o === null)
|
||
return "null";
|
||
if (typeof o === "boolean")
|
||
return "<boolean>";
|
||
if (C3.IsNumber(o))
|
||
return "<number>";
|
||
if (C3.IsString(o))
|
||
return "<string>";
|
||
if (C3.IsArray(o))
|
||
return "<array>";
|
||
if (typeof o === "symbol")
|
||
return "<" + o.toString() + ">";
|
||
if (C3.IsFunction(o)) {
|
||
if (o.name && o.name !== "Function")
|
||
return o.name;
|
||
return "<anonymous function>"
|
||
}
|
||
if (typeof o === "object") {
|
||
if (o.constructor && o.constructor.name && o.constructor.name !== "Object")
|
||
return o.constructor.name;
|
||
return "<anonymous object>"
|
||
}
|
||
return "<unknown>"
|
||
}
|
||
;
|
||
C3.getType = function getType(o) {
|
||
if (o === null)
|
||
return "null";
|
||
if (Array.isArray(o))
|
||
return "array";
|
||
return typeof o
|
||
}
|
||
;
|
||
C3.range = function *range(a, b) {
|
||
if (!isFinite(Math.abs(a - b)))
|
||
throw new Error("Invalid parameters");
|
||
if (a > b)
|
||
for (let i = a - 1; i >= b; i--)
|
||
yield i;
|
||
else
|
||
for (let i = a; i < b; i++)
|
||
yield i
|
||
}
|
||
;
|
||
function isValidTypeChange(from, to) {
|
||
let fromType = C3.getType(from);
|
||
let toType = C3.getType(to);
|
||
if (fromType === "null" || toType === "null")
|
||
return true;
|
||
if (fromType === "undefined" || toType === "undefined")
|
||
return false;
|
||
return fromType === toType
|
||
}
|
||
let ctorObjectToProxy = new Map;
|
||
let ctorProxyToObject = new Map;
|
||
let proxyToObject = new WeakMap;
|
||
let releasedObjects = new WeakMap;
|
||
C3.DefendHandler = {};
|
||
const VALID_GET_MISSING_KEYS = new Set(["then", "splice"]);
|
||
function logDefendedObjectWarning(msg) {
|
||
console.warn("[Defence] " + msg + " @", C3.GetCallStack())
|
||
}
|
||
C3.DefendHandler.get = function defended_get(target, key) {
|
||
if (!(key in target) && typeof key !== "symbol" && !VALID_GET_MISSING_KEYS.has(key))
|
||
logDefendedObjectWarning(`Accessed missing property '${key}' from defended object '${C3.getName(target)}', returning undefined`);
|
||
if (releasedObjects.has(target) && typeof key !== "symbol" && !VALID_GET_MISSING_KEYS.has(key))
|
||
logDefendedObjectWarning(`Accessed property '${key}' on a released object '${C3.getName(target)}'\nObject was originally released at: ${releasedObjects.get(target)})\nCall stack at access: `);
|
||
return target[key]
|
||
}
|
||
;
|
||
C3.DefendHandler.set = function defended_set(target, key, value) {
|
||
if (!(key in target) && !ctorObjectToProxy.has(target))
|
||
logDefendedObjectWarning(`Set non-existent property '${key}' to '${value}' on defended object '${C3.getName(target)}'`);
|
||
if (!isValidTypeChange(target[key], value) && !ctorObjectToProxy.has(target))
|
||
logDefendedObjectWarning(`Set '${C3.getType(target[key])}' property '${key}' to type '${C3.getType(value)}' on defended object '${C3.getName(target)}'`);
|
||
if (releasedObjects.has(target))
|
||
logDefendedObjectWarning(`Set property '${key}' on a released object '${C3.getName(target)}'\nObject was originally released at: ${releasedObjects.get(target)})\nCall stack at access: `);
|
||
target[key] = value;
|
||
return true
|
||
}
|
||
;
|
||
C3.DefendHandler.deleteProperty = function defended_deleteProperty(target, key) {
|
||
throw new ReferenceError(`Cannot delete property '${key}' from defended object '${C3.getName(target)}'`);
|
||
}
|
||
;
|
||
C3.DefendHandler.defineProperty = function defended_defineProperty(target, key, desc) {
|
||
throw new ReferenceError(`Cannot define property '${key}' on defended object '${C3.getName(target)}'`);
|
||
}
|
||
;
|
||
C3.DefendHandler.enumerate = function defended_enumerate(target) {
|
||
throw new ReferenceError(`Cannot enumerate defended object '${C3.getName(target)}'`);
|
||
}
|
||
;
|
||
let checkRafId = -1;
|
||
function CheckDefendedObjectsUsedCorrectly() {
|
||
checkRafId = -1;
|
||
if (ctorObjectToProxy.size > 0 || ctorProxyToObject.size > 0) {
|
||
let uniqueNames = new Set([...ctorObjectToProxy.keys()].map(o=>C3.getName(o)));
|
||
let leftoverNames = [...uniqueNames].join(",");
|
||
console.warn(`An object derived from DefendedBase was not protected with debugDefend(). This will disable some checks. See the coding guidelines! Possible affected class names: ${leftoverNames}`);
|
||
ctorObjectToProxy.clear();
|
||
ctorProxyToObject.clear()
|
||
}
|
||
}
|
||
C3.DefendedBase = class DefendedBase {
|
||
constructor() {
|
||
if (!C3.isDebugDefend || !C3.Supports.Proxies)
|
||
return;
|
||
let newTarget = new.target;
|
||
let realObject = Object.create(newTarget.prototype);
|
||
let proxy = new Proxy(realObject,C3.DefendHandler);
|
||
ctorObjectToProxy.set(realObject, proxy);
|
||
ctorProxyToObject.set(proxy, realObject);
|
||
proxyToObject.set(proxy, realObject);
|
||
if (checkRafId === -1)
|
||
checkRafId = requestAnimationFrame(CheckDefendedObjectsUsedCorrectly);
|
||
return proxy
|
||
}
|
||
}
|
||
;
|
||
C3.debugDefend = function debugDefend(o) {
|
||
if (C3.isDebugDefend && C3.Supports.Proxies && o instanceof C3.DefendedBase) {
|
||
if (!ctorProxyToObject.has(o))
|
||
return o;
|
||
let realObject = ctorProxyToObject.get(o);
|
||
ctorProxyToObject.delete(o);
|
||
ctorObjectToProxy.delete(realObject);
|
||
return o
|
||
} else if (C3.isDebug)
|
||
return Object.seal(o);
|
||
else
|
||
return o
|
||
}
|
||
;
|
||
C3.New = function New(Type, ...args) {
|
||
let o;
|
||
try {
|
||
o = new Type(...args)
|
||
} catch (e) {
|
||
ctorProxyToObject.clear();
|
||
ctorObjectToProxy.clear();
|
||
throw e;
|
||
}
|
||
if (C3.isDebugDefend)
|
||
VerifyObjectPropertiesConsistent(Type, o);
|
||
return C3.debugDefend(o)
|
||
}
|
||
;
|
||
C3.Release = function Release(o) {
|
||
let realObject = proxyToObject.get(o);
|
||
if (realObject)
|
||
releasedObjects.set(realObject, C3.GetCallStack())
|
||
}
|
||
;
|
||
C3.WasReleased = function(o) {
|
||
let realObject = proxyToObject.get(o);
|
||
if (!realObject)
|
||
return false;
|
||
return !!releasedObjects.get(realObject)
|
||
}
|
||
;
|
||
let typeProperties = new Map;
|
||
function getObjectPropertySet(o) {
|
||
let ret = new Set;
|
||
for (let k in o)
|
||
ret.add(k);
|
||
return ret
|
||
}
|
||
function VerifyObjectPropertiesConsistent(Type, o) {
|
||
let properties = getObjectPropertySet(o);
|
||
let existingProperties = typeProperties.get(Type);
|
||
if (existingProperties) {
|
||
let inconsistentProperties = [];
|
||
for (let k of existingProperties.values())
|
||
if (properties.has(k))
|
||
properties.delete(k);
|
||
else
|
||
inconsistentProperties.push(k);
|
||
C3.appendArray(inconsistentProperties, [...properties]);
|
||
if (inconsistentProperties.length)
|
||
console.warn(`[Defence] '${C3.getName(Type)}' constructor creates inconsistent properties: ${inconsistentProperties.join(", ")}`)
|
||
} else
|
||
typeProperties.set(Type, properties)
|
||
}
|
||
C3.PerfMark = class PerfMark {
|
||
constructor(name) {
|
||
this._name = "";
|
||
if (name)
|
||
this.start(name)
|
||
}
|
||
start(name) {
|
||
this._name = name;
|
||
performance.mark(this._name + "-Start")
|
||
}
|
||
end() {
|
||
performance.mark(this._name + "-End");
|
||
performance.measure(this._name, this._name + "-Start", this._name + "-End")
|
||
}
|
||
next(name) {
|
||
this.end();
|
||
this._name = name;
|
||
performance.mark(this._name + "-Start")
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const TWO_PI = Math.PI * 2;
|
||
const D_TO_R = Math.PI / 180;
|
||
const R_TO_D = 180 / Math.PI;
|
||
C3.wrap = function wrap(x, min, max) {
|
||
x = Math.floor(x);
|
||
min = Math.floor(min);
|
||
max = Math.floor(max);
|
||
if (x < min) {
|
||
let r = max - (min - x) % (max - min);
|
||
return r === max ? 0 : r
|
||
} else
|
||
return min + (x - min) % (max - min)
|
||
}
|
||
;
|
||
C3.mapToRange = function mapToRange(x, inMin, inMax, outMin, outMax) {
|
||
return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
|
||
}
|
||
;
|
||
C3.normalize = function normalize(value, minimum, maximum) {
|
||
return (value - minimum) / (maximum - minimum)
|
||
}
|
||
;
|
||
C3.clamp = function clamp(x, a, b) {
|
||
if (x < a)
|
||
return a;
|
||
else if (x > b)
|
||
return b;
|
||
else
|
||
return x
|
||
}
|
||
;
|
||
C3.clampAngle = function clampAngle(a) {
|
||
a %= TWO_PI;
|
||
if (a < 0)
|
||
a += TWO_PI;
|
||
return a
|
||
}
|
||
;
|
||
C3.toRadians = function toRadians(x) {
|
||
return x * D_TO_R
|
||
}
|
||
;
|
||
C3.toDegrees = function toDegrees(x) {
|
||
return x * R_TO_D
|
||
}
|
||
;
|
||
C3.distanceTo = function distanceTo(x1, y1, x2, y2) {
|
||
return Math.hypot(x2 - x1, y2 - y1)
|
||
}
|
||
;
|
||
C3.distanceSquared = function distanceSquared(x1, y1, x2, y2) {
|
||
const dx = x2 - x1;
|
||
const dy = y2 - y1;
|
||
return dx * dx + dy * dy
|
||
}
|
||
;
|
||
C3.angleTo = function angleTo(x1, y1, x2, y2) {
|
||
return Math.atan2(y2 - y1, x2 - x1)
|
||
}
|
||
;
|
||
C3.angleDiff = function angleDiff(a1, a2) {
|
||
if (a1 === a2)
|
||
return 0;
|
||
let s1 = Math.sin(a1);
|
||
let c1 = Math.cos(a1);
|
||
let s2 = Math.sin(a2);
|
||
let c2 = Math.cos(a2);
|
||
let n = s1 * s2 + c1 * c2;
|
||
if (n >= 1)
|
||
return 0;
|
||
if (n <= -1)
|
||
return Math.PI;
|
||
return Math.acos(n)
|
||
}
|
||
;
|
||
C3.angleRotate = function angleRotate(start, end, step) {
|
||
let ss = Math.sin(start);
|
||
let cs = Math.cos(start);
|
||
let se = Math.sin(end);
|
||
let ce = Math.cos(end);
|
||
if (Math.acos(ss * se + cs * ce) > step)
|
||
if (cs * se - ss * ce > 0)
|
||
return C3.clampAngle(start + step);
|
||
else
|
||
return C3.clampAngle(start - step);
|
||
else
|
||
return C3.clampAngle(end)
|
||
}
|
||
;
|
||
C3.angleClockwise = function angleClockwise(a1, a2) {
|
||
let s1 = Math.sin(a1);
|
||
let c1 = Math.cos(a1);
|
||
let s2 = Math.sin(a2);
|
||
let c2 = Math.cos(a2);
|
||
return c1 * s2 - s1 * c2 <= 0
|
||
}
|
||
;
|
||
C3.angleLerp = function angleLerp(a, b, x, r=0) {
|
||
let diff = C3.angleDiff(a, b);
|
||
const revs = TWO_PI * r;
|
||
if (C3.angleClockwise(b, a))
|
||
return C3.clampAngle(a + (diff + revs) * x);
|
||
else
|
||
return C3.clampAngle(a - (diff + revs) * x)
|
||
}
|
||
;
|
||
C3.angleLerpClockwise = function angleLerpClockwise(a, b, x, r=0) {
|
||
const diff = C3.angleDiff(a, b);
|
||
const revs = TWO_PI * r;
|
||
if (C3.angleClockwise(b, a))
|
||
return C3.clampAngle(a + (diff + revs) * x);
|
||
return C3.clampAngle((TWO_PI - diff + revs) * x)
|
||
}
|
||
;
|
||
C3.angleLerpAntiClockwise = function angleLerpAntiClockwise(a, b, x, r=0) {
|
||
const diff = C3.angleDiff(a, b);
|
||
const revs = TWO_PI * r;
|
||
if (C3.angleClockwise(b, a))
|
||
return C3.clampAngle((-TWO_PI + diff - revs) * x);
|
||
return C3.clampAngle(a - (diff + revs) * x)
|
||
}
|
||
;
|
||
C3.lerp = function lerp(a, b, x) {
|
||
return a + x * (b - a)
|
||
}
|
||
;
|
||
C3.unlerp = function unlerp(a, b, x) {
|
||
if (a === b)
|
||
return 0;
|
||
return (x - a) / (b - a)
|
||
}
|
||
;
|
||
C3.relerp = function relerp(a, b, x, c, d) {
|
||
return C3.lerp(c, d, C3.unlerp(a, b, x))
|
||
}
|
||
;
|
||
C3.qarp = function qarp(a, b, c, x) {
|
||
return C3.lerp(C3.lerp(a, b, x), C3.lerp(b, c, x), x)
|
||
}
|
||
;
|
||
C3.cubic = function cubic(a, b, c, d, x) {
|
||
return C3.lerp(C3.qarp(a, b, c, x), C3.qarp(b, c, d, x), x)
|
||
}
|
||
;
|
||
C3.cosp = function cosp(a, b, x) {
|
||
return (a + b + (a - b) * Math.cos(x * Math.PI)) / 2
|
||
}
|
||
;
|
||
C3.isPOT = function isPOT(x) {
|
||
return x > 0 && (x - 1 & x) === 0
|
||
}
|
||
;
|
||
C3.nextHighestPowerOfTwo = function nextHighestPowerOfTwo(x) {
|
||
--x;
|
||
for (let i = 1; i < 32; i <<= 1)
|
||
x = x | x >> i;
|
||
return x + 1
|
||
}
|
||
;
|
||
C3.roundToNearestFraction = function roundToNearestFraction(x, n) {
|
||
return Math.round(x * n) / n
|
||
}
|
||
;
|
||
C3.floorToNearestFraction = function floorToNearestFraction(x, n) {
|
||
return Math.floor(x * n) / n
|
||
}
|
||
;
|
||
C3.round6dp = function round6dp(x) {
|
||
return Math.round(x * 1E6) / 1E6
|
||
}
|
||
;
|
||
C3.toFixed = function toFixed(n, dp) {
|
||
let ret = n.toFixed(dp);
|
||
let last = ret.length - 1;
|
||
for (; last >= 0 && ret.charAt(last) === "0"; --last)
|
||
;
|
||
if (last >= 0 && ret.charAt(last) === ".")
|
||
--last;
|
||
if (last < 0)
|
||
return ret;
|
||
return ret.substr(0, last + 1)
|
||
}
|
||
;
|
||
C3.PackRGB = function PackRGB(red, green, blue) {
|
||
return C3.clamp(red, 0, 255) | C3.clamp(green, 0, 255) << 8 | C3.clamp(blue, 0, 255) << 16
|
||
}
|
||
;
|
||
const ALPHAEX_SHIFT = 1024;
|
||
const ALPHAEX_MAX = 1023;
|
||
const RGBEX_SHIFT = 16384;
|
||
const RGBEX_MAX = 8191;
|
||
const RGBEX_MIN = -8192;
|
||
C3.PackRGBAEx = function PackRGBAEx(red, green, blue, alpha) {
|
||
red = C3.clamp(Math.floor(red * 1024), RGBEX_MIN, RGBEX_MAX);
|
||
green = C3.clamp(Math.floor(green * 1024), RGBEX_MIN, RGBEX_MAX);
|
||
blue = C3.clamp(Math.floor(blue * 1024), RGBEX_MIN, RGBEX_MAX);
|
||
alpha = C3.clamp(Math.floor(alpha * ALPHAEX_MAX), 0, ALPHAEX_MAX);
|
||
if (red < 0)
|
||
red += RGBEX_SHIFT;
|
||
if (green < 0)
|
||
green += RGBEX_SHIFT;
|
||
if (blue < 0)
|
||
blue += RGBEX_SHIFT;
|
||
return -(red * RGBEX_SHIFT * RGBEX_SHIFT * ALPHAEX_SHIFT + green * RGBEX_SHIFT * ALPHAEX_SHIFT + blue * ALPHAEX_SHIFT + alpha)
|
||
}
|
||
;
|
||
C3.PackRGBEx = function PackRGBEx(red, green, blue) {
|
||
return C3.PackRGBAEx(red, green, blue, 1)
|
||
}
|
||
;
|
||
function isNegativeZero(x) {
|
||
return x === 0 && 1 / x < 0
|
||
}
|
||
C3.GetRValue = function GetRValue(rgb) {
|
||
if (rgb >= 0)
|
||
return (rgb & 255) / 255;
|
||
else {
|
||
let v = Math.floor(-rgb / (RGBEX_SHIFT * RGBEX_SHIFT * ALPHAEX_SHIFT));
|
||
if (v > RGBEX_MAX)
|
||
v -= RGBEX_SHIFT;
|
||
return v / 1024
|
||
}
|
||
}
|
||
;
|
||
C3.GetGValue = function GetGValue(rgb) {
|
||
if (rgb >= 0)
|
||
return ((rgb & 65280) >> 8) / 255;
|
||
else {
|
||
let v = Math.floor(-rgb % (RGBEX_SHIFT * RGBEX_SHIFT * ALPHAEX_SHIFT) / (RGBEX_SHIFT * ALPHAEX_SHIFT));
|
||
if (v > RGBEX_MAX)
|
||
v -= RGBEX_SHIFT;
|
||
return v / 1024
|
||
}
|
||
}
|
||
;
|
||
C3.GetBValue = function GetBValue(rgb) {
|
||
if (rgb >= 0)
|
||
return ((rgb & 16711680) >> 16) / 255;
|
||
else {
|
||
let v = Math.floor(-rgb % (RGBEX_SHIFT * ALPHAEX_SHIFT) / ALPHAEX_SHIFT);
|
||
if (v > RGBEX_MAX)
|
||
v -= RGBEX_SHIFT;
|
||
return v / 1024
|
||
}
|
||
}
|
||
;
|
||
C3.GetAValue = function GetAValue(rgb) {
|
||
if (isNegativeZero(rgb))
|
||
return 0;
|
||
else if (rgb >= 0)
|
||
return 1;
|
||
else {
|
||
const v = Math.floor(-rgb % ALPHAEX_SHIFT);
|
||
return v / ALPHAEX_MAX
|
||
}
|
||
}
|
||
;
|
||
C3.greatestCommonDivisor = function greatestCommonDivisor(a, b) {
|
||
a = Math.floor(a);
|
||
b = Math.floor(b);
|
||
while (b !== 0) {
|
||
let t = b;
|
||
b = a % b;
|
||
a = t
|
||
}
|
||
return a
|
||
}
|
||
;
|
||
const COMMON_ASPECT_RATIOS = [[3, 2], [4, 3], [5, 4], [5, 3], [6, 5], [14, 9], [16, 9], [16, 10], [21, 9]];
|
||
C3.getAspectRatio = function getAspectRatio(w, h) {
|
||
w = Math.floor(w);
|
||
h = Math.floor(h);
|
||
if (w === h)
|
||
return [1, 1];
|
||
for (let aspect of COMMON_ASPECT_RATIOS) {
|
||
let approxH = w / aspect[0] * aspect[1];
|
||
if (Math.abs(h - approxH) < 1)
|
||
return aspect.slice(0);
|
||
approxH = w / aspect[1] * aspect[0];
|
||
if (Math.abs(h - approxH) < 1)
|
||
return [aspect[1], aspect[0]]
|
||
}
|
||
let gcd = C3.greatestCommonDivisor(w, h);
|
||
return [w / gcd, h / gcd]
|
||
}
|
||
;
|
||
C3.segmentsIntersect = function segmentsIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {
|
||
const min_ax = Math.min(a1x, a2x);
|
||
const max_ax = Math.max(a1x, a2x);
|
||
const min_bx = Math.min(b1x, b2x);
|
||
const max_bx = Math.max(b1x, b2x);
|
||
if (max_ax < min_bx || min_ax > max_bx)
|
||
return false;
|
||
const min_ay = Math.min(a1y, a2y);
|
||
const max_ay = Math.max(a1y, a2y);
|
||
const min_by = Math.min(b1y, b2y);
|
||
const max_by = Math.max(b1y, b2y);
|
||
if (max_ay < min_by || min_ay > max_by)
|
||
return false;
|
||
const dpx = b1x - a1x + b2x - a2x;
|
||
const dpy = b1y - a1y + b2y - a2y;
|
||
const qax = a2x - a1x;
|
||
const qay = a2y - a1y;
|
||
const qbx = b2x - b1x;
|
||
const qby = b2y - b1y;
|
||
const d = Math.abs(qay * qbx - qby * qax);
|
||
const la = qbx * dpy - qby * dpx;
|
||
if (Math.abs(la) > d)
|
||
return false;
|
||
const lb = qax * dpy - qay * dpx;
|
||
return Math.abs(lb) <= d
|
||
}
|
||
;
|
||
C3.segmentsIntersectPreCalc = function segmentsIntersectPreCalc(a1x, a1y, a2x, a2y, min_ax, max_ax, min_ay, max_ay, b1x, b1y, b2x, b2y) {
|
||
const min_bx = Math.min(b1x, b2x);
|
||
const max_bx = Math.max(b1x, b2x);
|
||
if (max_ax < min_bx || min_ax > max_bx)
|
||
return false;
|
||
const min_by = Math.min(b1y, b2y);
|
||
const max_by = Math.max(b1y, b2y);
|
||
if (max_ay < min_by || min_ay > max_by)
|
||
return false;
|
||
const dpx = b1x - a1x + b2x - a2x;
|
||
const dpy = b1y - a1y + b2y - a2y;
|
||
const qax = a2x - a1x;
|
||
const qay = a2y - a1y;
|
||
const qbx = b2x - b1x;
|
||
const qby = b2y - b1y;
|
||
const d = Math.abs(qay * qbx - qby * qax);
|
||
const la = qbx * dpy - qby * dpx;
|
||
if (Math.abs(la) > d)
|
||
return false;
|
||
const lb = qax * dpy - qay * dpx;
|
||
return Math.abs(lb) <= d
|
||
}
|
||
;
|
||
C3.segmentIntersectsQuad = function segmentIntersectsQuad(x1, y1, x2, y2, q) {
|
||
const min_x = Math.min(x1, x2);
|
||
const max_x = Math.max(x1, x2);
|
||
const min_y = Math.min(y1, y2);
|
||
const max_y = Math.max(y1, y2);
|
||
const tlx = q.getTlx()
|
||
, tly = q.getTly()
|
||
, trx = q.getTrx()
|
||
, try_ = q.getTry()
|
||
, brx = q.getBrx()
|
||
, bry = q.getBry()
|
||
, blx = q.getBlx()
|
||
, bly = q.getBly();
|
||
return C3.segmentsIntersectPreCalc(x1, y1, x2, y2, min_x, max_x, min_y, max_y, tlx, tly, trx, try_) || C3.segmentsIntersectPreCalc(x1, y1, x2, y2, min_x, max_x, min_y, max_y, trx, try_, brx, bry) || C3.segmentsIntersectPreCalc(x1, y1, x2, y2, min_x, max_x, min_y, max_y, brx, bry, blx, bly) || C3.segmentsIntersectPreCalc(x1, y1, x2, y2, min_x, max_x, min_y, max_y, blx, bly, tlx, tly)
|
||
}
|
||
;
|
||
C3.segmentIntersectsAnyN = function segmentIntersectsAnyN(x1, y1, x2, y2, points) {
|
||
const min_x = Math.min(x1, x2);
|
||
const max_x = Math.max(x1, x2);
|
||
const min_y = Math.min(y1, y2);
|
||
const max_y = Math.max(y1, y2);
|
||
let i = 0;
|
||
for (let last = points.length - 4; i <= last; i += 2)
|
||
if (C3.segmentsIntersectPreCalc(x1, y1, x2, y2, min_x, max_x, min_y, max_y, points[i], points[i + 1], points[i + 2], points[i + 3]))
|
||
return true;
|
||
return C3.segmentsIntersectPreCalc(x1, y1, x2, y2, min_x, max_x, min_y, max_y, points[i], points[i + 1], points[0], points[1])
|
||
}
|
||
;
|
||
const NO_HIT = 2;
|
||
const PADDING = 1E-6;
|
||
C3.rayIntersect = function rayIntersect(rx1, ry1, rx2, ry2, sx1, sy1, sx2, sy2) {
|
||
const rdx = rx2 - rx1;
|
||
const rdy = ry2 - ry1;
|
||
const sdx = sx2 - sx1;
|
||
const sdy = sy2 - sy1;
|
||
const det = rdx * sdy - rdy * sdx;
|
||
if (det === 0)
|
||
return NO_HIT;
|
||
const gamma = ((ry1 - ry2) * (sx2 - rx1) + rdx * (sy2 - ry1)) / det;
|
||
if (0 < gamma && gamma < 1 + PADDING)
|
||
return (sdy * (sx2 - rx1) + (sx1 - sx2) * (sy2 - ry1)) / det;
|
||
return NO_HIT
|
||
}
|
||
;
|
||
C3.rayIntersectExtended = function rayIntersect(rx1, ry1, rx2, ry2, sx1, sy1, sx2, sy2, f) {
|
||
const dx = (sx2 - sx1) * f;
|
||
const dy = (sy2 - sy1) * f;
|
||
return C3.rayIntersect(rx1, ry1, rx2, ry2, sx1 - dx, sy1 - dy, sx2 + dx, sy2 + dy)
|
||
}
|
||
;
|
||
C3.isPointInTriangleInclusive = function isPointInTriangleInclusive(px, py, tx1, ty1, tx2, ty2, tx3, ty3) {
|
||
const v0x = tx2 - tx1;
|
||
const v0y = ty2 - ty1;
|
||
const v1x = tx3 - tx1;
|
||
const v1y = ty3 - ty1;
|
||
const v2x = px - tx1;
|
||
const v2y = py - ty1;
|
||
const dot00 = v0x * v0x + v0y * v0y;
|
||
const dot01 = v0x * v1x + v0y * v1y;
|
||
const dot02 = v0x * v2x + v0y * v2y;
|
||
const dot11 = v1x * v1x + v1y * v1y;
|
||
const dot12 = v1x * v2x + v1y * v2y;
|
||
const invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
|
||
const u = (dot11 * dot02 - dot01 * dot12) * invDenom;
|
||
const v = (dot00 * dot12 - dot01 * dot02) * invDenom;
|
||
return u >= 0 && v >= 0 && u + v <= 1
|
||
}
|
||
;
|
||
C3.triangleCartesianToBarycentric = function triangleCartesianToBarycentric(px, py, tx1, ty1, tx2, ty2, tx3, ty3) {
|
||
const v0x = tx2 - tx1;
|
||
const v0y = ty2 - ty1;
|
||
const v1x = tx3 - tx1;
|
||
const v1y = ty3 - ty1;
|
||
const v2x = px - tx1;
|
||
const v2y = py - ty1;
|
||
const dot00 = v0x * v0x + v0y * v0y;
|
||
const dot01 = v0x * v1x + v0y * v1y;
|
||
const dot11 = v1x * v1x + v1y * v1y;
|
||
const dot20 = v2x * v0x + v2y * v0y;
|
||
const dot21 = v2x * v1x + v2y * v1y;
|
||
const denom = dot00 * dot11 - dot01 * dot01;
|
||
const v = (dot11 * dot20 - dot01 * dot21) / denom;
|
||
const w = (dot00 * dot21 - dot01 * dot20) / denom;
|
||
const u = 1 - v - w;
|
||
return [u, v, w]
|
||
}
|
||
;
|
||
C3.triangleBarycentricToCartesian = function triangleBarycentricToCartesian(u, v, w, tx1, ty1, tx2, ty2, tx3, ty3) {
|
||
return [u * tx1 + v * tx2 + w * tx3, u * ty1 + v * ty2 + w * ty3]
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
let mainDocument = null;
|
||
let baseHref = "";
|
||
if (typeof document !== "undefined") {
|
||
mainDocument = document;
|
||
const baseElem = document.querySelector("base");
|
||
baseHref = baseElem && baseElem.hasAttribute("href") ? baseElem.getAttribute("href") : "";
|
||
if (baseHref) {
|
||
if (baseHref.startsWith("/"))
|
||
baseHref = baseHref.substr(1);
|
||
if (!baseHref.endsWith("/"))
|
||
baseHref += "/"
|
||
}
|
||
}
|
||
C3.GetBaseHref = function GetBaseHref() {
|
||
return baseHref
|
||
}
|
||
;
|
||
C3.GetBaseURL = function GetBaseURL() {
|
||
if (!mainDocument)
|
||
return "";
|
||
const loc = mainDocument.location;
|
||
return C3.GetPathFromURL(loc.origin + loc.pathname) + baseHref
|
||
}
|
||
;
|
||
C3.GetPathFromURL = function GetPathFromURL(url) {
|
||
if (!url.length)
|
||
return url;
|
||
if (url.endsWith("/") || url.endsWith("\\"))
|
||
return url;
|
||
const lastSlash = Math.max(url.lastIndexOf("/"), url.lastIndexOf("\\"));
|
||
if (lastSlash === -1)
|
||
return "";
|
||
return url.substr(0, lastSlash + 1)
|
||
}
|
||
;
|
||
C3.GetFilenameFromURL = function GetFilenameFromURL(url) {
|
||
if (!url.length)
|
||
return url;
|
||
if (url.endsWith("/") || url.endsWith("\\"))
|
||
return "";
|
||
const lastSlash = Math.max(url.lastIndexOf("/"), url.lastIndexOf("\\"));
|
||
if (lastSlash === -1)
|
||
return url;
|
||
return url.substr(lastSlash + 1)
|
||
}
|
||
;
|
||
C3.DataTransferHasFiles = function DataTransferHasFiles(dataTransfer) {
|
||
if (dataTransfer.types)
|
||
for (let i = 0; i < dataTransfer.types.length; i++)
|
||
if (dataTransfer.types[i] === "Files" || dataTransfer.types[i] === "application/x-c3-file")
|
||
return true;
|
||
return false
|
||
}
|
||
;
|
||
C3.DataTransferFilterFiles = async function DataTransferHasFiles(dataTransfer, filter) {
|
||
const ret = Array.from(dataTransfer.files).filter(file=>{
|
||
return file.size !== 0
|
||
}
|
||
).filter(file=>{
|
||
return filter(file)
|
||
}
|
||
).map(async file=>{
|
||
try {
|
||
return await C3.CloneFile(file)
|
||
} catch (err) {
|
||
return null
|
||
}
|
||
}
|
||
);
|
||
const files = await Promise.all(ret);
|
||
return files.filter(file=>file)
|
||
}
|
||
;
|
||
C3.IsFileAnImage = function IsFileAnImage(file) {
|
||
if (file.type)
|
||
return file.type.search(/image\/.*/) !== -1;
|
||
else {
|
||
const type = C3.MimeType.GetForFileExtension(C3.GetFileExtension(file.name)).GetString();
|
||
return type.search(/image\/.*/) !== -1
|
||
}
|
||
}
|
||
;
|
||
C3.IsFileAnSVG = function IsFileAnSVG(file) {
|
||
return file.type === "image/svg+xml"
|
||
}
|
||
;
|
||
C3.IsFileAMultiImageContainer = function IsFileAMultiImageContainer(file) {
|
||
if (file.type)
|
||
return C3.MimeType.Get(file.type).IsAnimatedImage();
|
||
else
|
||
return C3.MimeType.GetForFileExtension(C3.GetFileExtension(file.name)).IsAnimatedImage()
|
||
}
|
||
;
|
||
C3.GetFileExtension = function GetFileExtension(filename) {
|
||
let i = filename.lastIndexOf(".");
|
||
if (i < 1)
|
||
return "";
|
||
else
|
||
return filename.substr(i)
|
||
}
|
||
;
|
||
C3.GetFileNamePart = function GetFileNamePart(filename) {
|
||
let i = filename.lastIndexOf(".");
|
||
if (i < 1)
|
||
return filename;
|
||
else
|
||
return filename.substr(0, i)
|
||
}
|
||
;
|
||
C3.NormalizeFileSeparator = function NormalizeFileSeparator(path) {
|
||
return path.replace(/\\/g, "/")
|
||
}
|
||
;
|
||
C3.ParseFilePath = function ParseFilePath(path) {
|
||
path = C3.NormalizeFileSeparator(path);
|
||
let root = /^\w:\//.exec(path);
|
||
if (root) {
|
||
root = root[0];
|
||
path = path.slice(3);
|
||
if (path[0] !== "/")
|
||
path = "/" + path
|
||
} else
|
||
root = "";
|
||
path = path.replace(/\/{2,}/g, "/");
|
||
if (path.length > 1 && path.slice(-1) === "/")
|
||
path = path.slice(0, -1);
|
||
const start = path.lastIndexOf("/") + 1;
|
||
let dir = "", base = path, name, ext = "";
|
||
if (start > 0) {
|
||
dir = path.slice(0, start);
|
||
base = path.slice(start)
|
||
}
|
||
name = base;
|
||
const end = base.lastIndexOf(".");
|
||
if (end > 0) {
|
||
ext = base.slice(end);
|
||
name = base.slice(0, -ext.length)
|
||
}
|
||
const full = root + dir + base;
|
||
return {
|
||
dir,
|
||
base,
|
||
name,
|
||
root,
|
||
ext,
|
||
full
|
||
}
|
||
}
|
||
;
|
||
C3.Wait = function Wait(delay, argument) {
|
||
return new Promise((resolve,reject)=>{
|
||
self.setTimeout(resolve, delay, argument)
|
||
}
|
||
)
|
||
}
|
||
;
|
||
C3.swallowException = function swallowException(f) {
|
||
try {
|
||
f()
|
||
} catch (e) {
|
||
if (C3.isDebug)
|
||
console.warn("Swallowed exception: ", e)
|
||
}
|
||
}
|
||
;
|
||
C3.noop = function noop() {}
|
||
;
|
||
C3.equalsNoCase = function equalsNoCase(a, b) {
|
||
if (typeof a !== "string" || typeof b !== "string")
|
||
return false;
|
||
if (a === b)
|
||
return true;
|
||
a = a.normalize();
|
||
b = b.normalize();
|
||
if (a.length !== b.length)
|
||
return false;
|
||
return a.toLowerCase() === b.toLowerCase()
|
||
}
|
||
;
|
||
C3.equalsCase = function equalsCase(a, b) {
|
||
if (typeof a !== "string" || typeof b !== "string")
|
||
return false;
|
||
if (a === b)
|
||
return true;
|
||
return a.normalize() === b.normalize()
|
||
}
|
||
;
|
||
C3.typedArraySet16 = function typedArraySet16(dest, src, i) {
|
||
dest[i++] = src[0];
|
||
dest[i++] = src[1];
|
||
dest[i++] = src[2];
|
||
dest[i++] = src[3];
|
||
dest[i++] = src[4];
|
||
dest[i++] = src[5];
|
||
dest[i++] = src[6];
|
||
dest[i++] = src[7];
|
||
dest[i++] = src[8];
|
||
dest[i++] = src[9];
|
||
dest[i++] = src[10];
|
||
dest[i++] = src[11];
|
||
dest[i++] = src[12];
|
||
dest[i++] = src[13];
|
||
dest[i++] = src[14];
|
||
dest[i] = src[15]
|
||
}
|
||
;
|
||
C3.truncateArray = function truncateArray(arr, index) {
|
||
arr.length = index
|
||
}
|
||
;
|
||
C3.clearArray = function clearArray(arr) {
|
||
if (!arr)
|
||
return;
|
||
if (arr.length === 0)
|
||
return;
|
||
C3.truncateArray(arr, 0)
|
||
}
|
||
;
|
||
C3.clear2DArray = function clear2DArray(arr) {
|
||
if (!arr)
|
||
return;
|
||
for (let i = 0; i < arr.length; i++) {
|
||
let a = arr[i];
|
||
C3.truncateArray(a, 0)
|
||
}
|
||
C3.truncateArray(arr, 0)
|
||
}
|
||
;
|
||
C3.extendArray = function extendArray(arr, len, filler) {
|
||
len = len | 0;
|
||
const arrayLength = arr.length;
|
||
if (len <= arrayLength)
|
||
return;
|
||
for (let i = arrayLength; i < len; ++i)
|
||
arr.push(filler)
|
||
}
|
||
;
|
||
C3.resizeArray = function resizeArray(arr, len, filler) {
|
||
len = len | 0;
|
||
const arrayLength = arr.length;
|
||
if (len < arrayLength)
|
||
C3.truncateArray(arr, len);
|
||
else if (len > arrayLength)
|
||
C3.extendArray(arr, len, filler)
|
||
}
|
||
;
|
||
C3.shallowAssignArray = function shallowAssignArray(dest, src) {
|
||
C3.clearArray(dest);
|
||
C3.appendArray(dest, src)
|
||
}
|
||
;
|
||
C3.appendArray = function appendArray(a, b) {
|
||
if (b.length < 1E4)
|
||
a.push(...b);
|
||
else
|
||
for (let i = 0, len = b.length; i < len; ++i)
|
||
a.push(b[i])
|
||
}
|
||
;
|
||
C3.arrayRemove = function(arr, index) {
|
||
index = Math.floor(index);
|
||
if (index < 0 || index >= arr.length)
|
||
return;
|
||
let len = arr.length - 1;
|
||
for (let i = index; i < len; ++i)
|
||
arr[i] = arr[i + 1];
|
||
C3.truncateArray(arr, len)
|
||
}
|
||
;
|
||
C3.arrayFindRemove = function arrayFindRemove(a, o) {
|
||
let i = a.indexOf(o);
|
||
if (i >= 0)
|
||
a.splice(i, 1)
|
||
}
|
||
;
|
||
C3.arraysEqual = function arraysEqual(a, b) {
|
||
let len = a.length;
|
||
if (b.length !== len)
|
||
return false;
|
||
for (let i = 0; i < len; ++i)
|
||
if (a[i] !== b[i])
|
||
return false;
|
||
return true
|
||
}
|
||
;
|
||
C3.arrayFilterOut = function arrayFilterOut(arr, callback) {
|
||
let ret = [];
|
||
let j = 0;
|
||
for (let i = 0, len = arr.length; i < len; ++i) {
|
||
let item = arr[i];
|
||
if (callback(item))
|
||
ret.push(item);
|
||
else {
|
||
arr[j] = item;
|
||
++j
|
||
}
|
||
}
|
||
C3.truncateArray(arr, j);
|
||
return ret
|
||
}
|
||
;
|
||
C3.arrayRemoveAllInSet = function arrayRemoveAllInSet(arr, s) {
|
||
const oldLen = arr.length;
|
||
let j = 0;
|
||
for (let i = 0, len = arr.length; i < len; ++i) {
|
||
let item = arr[i];
|
||
if (!s.has(item))
|
||
arr[j++] = item
|
||
}
|
||
C3.truncateArray(arr, j);
|
||
return oldLen - j
|
||
}
|
||
;
|
||
C3.isArrayIndexInBounds = function isArrayIndexInBounds(index, array) {
|
||
if (index !== Math.floor(index))
|
||
return false;
|
||
return index >= 0 && index < array.length
|
||
}
|
||
;
|
||
C3.validateArrayIndex = function validateArrayIndex(index, array) {
|
||
if (!C3.isArrayIndexInBounds(index, array))
|
||
throw new RangeError("array index out of bounds");
|
||
}
|
||
;
|
||
C3.cloneArray = function cloneArray(array) {
|
||
return array.slice()
|
||
}
|
||
;
|
||
C3.deepCloneArray = function deepCloneArray(array, f) {
|
||
let ret = [];
|
||
for (let e of array)
|
||
if (C3.IsObject(e)) {
|
||
let clone = f(e);
|
||
if (!clone)
|
||
throw new Error("missing clone");
|
||
if (clone.constructor !== e.constructor)
|
||
throw new Error("object is not a clone");
|
||
ret.push(clone)
|
||
} else if (C3.IsArray(e))
|
||
ret.push(C3.deepCloneArray(e, f));
|
||
else
|
||
ret.push(e);
|
||
return ret
|
||
}
|
||
;
|
||
C3.clone2DArray = function cloneArray(array) {
|
||
let ret = [];
|
||
for (let arr of array)
|
||
ret.push(arr.slice());
|
||
return ret
|
||
}
|
||
;
|
||
C3.mergeSets = function mergeSets(set1, set2) {
|
||
return new Set([...set1, ...set2])
|
||
}
|
||
;
|
||
C3.mergeSetsInPlace = function mergeSetsInPlace(set1, set2) {
|
||
for (const item of set2)
|
||
set1.add(item);
|
||
return set1
|
||
}
|
||
;
|
||
C3.first = function first(iterable) {
|
||
for (let i of iterable)
|
||
return i;
|
||
return null
|
||
}
|
||
;
|
||
C3.xor = function(x, y) {
|
||
return !x !== !y
|
||
}
|
||
;
|
||
C3.compare = function compare(x, cmp, y) {
|
||
switch (cmp) {
|
||
case 0:
|
||
return x === y;
|
||
case 1:
|
||
return x !== y;
|
||
case 2:
|
||
return x < y;
|
||
case 3:
|
||
return x <= y;
|
||
case 4:
|
||
return x > y;
|
||
case 5:
|
||
return x >= y;
|
||
default:
|
||
return false
|
||
}
|
||
}
|
||
;
|
||
C3.hasAnyOwnProperty = function hasAnyOwnProperty(o) {
|
||
for (let p in o)
|
||
if (o.hasOwnProperty(p))
|
||
return true;
|
||
return false
|
||
}
|
||
;
|
||
C3.PromiseAllWithProgress = function PromiseAllWithProgress(arr, progressCallback) {
|
||
if (!arr.length)
|
||
return Promise.resolve([]);
|
||
return new Promise((resolve,reject)=>{
|
||
const results = [];
|
||
let numberCompleted = 0;
|
||
let cancelled = false;
|
||
for (let i = 0, len = arr.length; i < len; ++i) {
|
||
results.push(void 0);
|
||
arr[i].then(result=>{
|
||
if (cancelled)
|
||
return;
|
||
results[i] = result;
|
||
++numberCompleted;
|
||
if (numberCompleted === arr.length)
|
||
resolve(results);
|
||
else
|
||
progressCallback(numberCompleted, arr.length)
|
||
}
|
||
).catch(err=>{
|
||
cancelled = true;
|
||
reject(err)
|
||
}
|
||
)
|
||
}
|
||
}
|
||
)
|
||
}
|
||
;
|
||
let memoryCallbacks = [];
|
||
C3.AddLibraryMemoryCallback = function AddLibraryMemoryCallback(f) {
|
||
memoryCallbacks.push(f)
|
||
}
|
||
;
|
||
C3.GetEstimatedLibraryMemoryUsage = function GetEstimatedLibraryMemoryUsage() {
|
||
let ret = 0;
|
||
for (let f of memoryCallbacks) {
|
||
let m = f();
|
||
ret += m
|
||
}
|
||
return Math.floor(ret)
|
||
}
|
||
;
|
||
let nextTaskId = 1;
|
||
const activeTaskIds = new Map;
|
||
const taskMessageChannel = new MessageChannel;
|
||
taskMessageChannel.port2.onmessage = function OnTask(e) {
|
||
const id = e.data;
|
||
const callback = activeTaskIds.get(id);
|
||
activeTaskIds.delete(id);
|
||
if (callback)
|
||
callback(e.timeStamp)
|
||
}
|
||
;
|
||
C3.RequestUnlimitedAnimationFrame = function RequestUnlimitedAnimationFrame(callback) {
|
||
const id = nextTaskId++;
|
||
activeTaskIds.set(id, callback);
|
||
taskMessageChannel.port1.postMessage(id);
|
||
return id
|
||
}
|
||
;
|
||
C3.CancelUnlimitedAnimationFrame = function CancelUnlimitedAnimationFrame(id) {
|
||
activeTaskIds.delete(id)
|
||
}
|
||
;
|
||
C3.PostTask = C3.RequestUnlimitedAnimationFrame;
|
||
C3.WaitForNextTask = function WaitForNextTask() {
|
||
return new Promise(resolve=>C3.PostTask(resolve))
|
||
}
|
||
;
|
||
const activeRPAFids = new Set;
|
||
C3.RequestPostAnimationFrame = function RequestPostAnimationFrame(callback) {
|
||
const id = self.requestAnimationFrame(async timestamp=>{
|
||
await C3.WaitForNextTask();
|
||
if (!activeRPAFids.has(id))
|
||
return;
|
||
activeRPAFids.delete(id);
|
||
callback(timestamp)
|
||
}
|
||
);
|
||
activeRPAFids.add(id);
|
||
return id
|
||
}
|
||
;
|
||
C3.CancelPostAnimationFrame = function CancelPostAnimationFrame(id) {
|
||
if (!activeRPAFids.has(id))
|
||
return;
|
||
self.cancelAnimationFrame(id);
|
||
activeRPAFids.delete(id)
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.IsAbsoluteURL = function IsAbsoluteURL(url) {
|
||
return /^(?:[a-z]+:)?\/\//.test(url) || url.substr(0, 5) === "data:" || url.substr(0, 5) === "blob:"
|
||
}
|
||
;
|
||
C3.IsRelativeURL = function IsRelativeURL(url) {
|
||
return !C3.IsAbsoluteURL(url)
|
||
}
|
||
;
|
||
C3.ThrowIfNotOk = function ThrowIfNotOk(response) {
|
||
if (!response.ok)
|
||
throw new Error(`fetch '${response.url}' response returned ${response.status} ${response.statusText}`);
|
||
}
|
||
;
|
||
C3.FetchOk = function FetchOk(url, init) {
|
||
return fetch(url, init).then(response=>{
|
||
C3.ThrowIfNotOk(response);
|
||
return response
|
||
}
|
||
)
|
||
}
|
||
;
|
||
C3.FetchText = function FetchText(url) {
|
||
return C3.FetchOk(url).then(response=>response.text())
|
||
}
|
||
;
|
||
C3.FetchJson = function FetchJson(url) {
|
||
return C3.FetchOk(url).then(response=>response.json())
|
||
}
|
||
;
|
||
C3.FetchBlob = function FetchBlob(url) {
|
||
return C3.FetchOk(url).then(response=>response.blob())
|
||
}
|
||
;
|
||
C3.FetchArrayBuffer = function FetchArrayBuffer(url) {
|
||
return C3.FetchOk(url).then(response=>response.arrayBuffer())
|
||
}
|
||
;
|
||
C3.FetchImage = function FetchImage(url) {
|
||
return new Promise((resolve,reject)=>{
|
||
const img = new Image;
|
||
img.onload = ()=>resolve(img);
|
||
img.onerror = err=>reject(err);
|
||
img.src = url
|
||
}
|
||
)
|
||
}
|
||
;
|
||
C3.BlobToArrayBuffer = function BlobToArrayBuffer(blob) {
|
||
if (typeof blob["arrayBuffer"] === "function")
|
||
return blob["arrayBuffer"]();
|
||
else
|
||
return new Promise((resolve,reject)=>{
|
||
const fileReader = new FileReader;
|
||
fileReader.onload = ()=>resolve(fileReader.result);
|
||
fileReader.onerror = ()=>reject(fileReader.error);
|
||
fileReader.readAsArrayBuffer(blob)
|
||
}
|
||
)
|
||
}
|
||
;
|
||
C3.BlobToString = function BlobToString(blob) {
|
||
if (typeof blob["text"] === "function")
|
||
return blob["text"]();
|
||
else
|
||
return new Promise((resolve,reject)=>{
|
||
const fileReader = new FileReader;
|
||
fileReader.onload = ()=>resolve(fileReader.result);
|
||
fileReader.onerror = ()=>reject(fileReader.error);
|
||
fileReader.readAsText(blob)
|
||
}
|
||
)
|
||
}
|
||
;
|
||
C3.BlobToJson = function BlobToJson(blob) {
|
||
return C3.BlobToString(blob).then(text=>JSON.parse(text))
|
||
}
|
||
;
|
||
C3.BlobToImage = async function BlobToImage(blob, decodeImage) {
|
||
let blobUrl = URL.createObjectURL(blob);
|
||
try {
|
||
const img = await C3.FetchImage(blobUrl);
|
||
URL.revokeObjectURL(blobUrl);
|
||
blobUrl = "";
|
||
if (decodeImage && typeof img["decode"] === "function")
|
||
await img["decode"]();
|
||
return img
|
||
} finally {
|
||
if (blobUrl)
|
||
URL.revokeObjectURL(blobUrl)
|
||
}
|
||
}
|
||
;
|
||
C3.CreateCanvas = function CreateCanvas(width, height) {
|
||
if (typeof document !== "undefined" && typeof document.createElement === "function") {
|
||
const canvas = document.createElement("canvas");
|
||
canvas.width = width;
|
||
canvas.height = height;
|
||
return canvas
|
||
} else
|
||
return new OffscreenCanvas(width,height)
|
||
}
|
||
;
|
||
C3.CanvasToBlob = function CanvasToBlob(canvas, type, quality) {
|
||
if (typeof quality !== "number")
|
||
quality = 1;
|
||
type = type || "image/png";
|
||
quality = C3.clamp(quality, 0, 1);
|
||
if (canvas.toBlob)
|
||
return new Promise(resolve=>canvas.toBlob(resolve, type, quality));
|
||
else if (canvas["convertToBlob"])
|
||
return canvas["convertToBlob"]({
|
||
"type": type,
|
||
"quality": quality
|
||
});
|
||
else
|
||
return C3.Asyncify(()=>C3.CanvasToBlobSync(canvas, type, quality))
|
||
}
|
||
;
|
||
C3.CanvasToBlobSync = function CanvasToBlobSync(canvas, type, quality) {
|
||
if (typeof quality !== "number")
|
||
quality = 1;
|
||
type = type || "image/png";
|
||
quality = C3.clamp(quality, 0, 1);
|
||
return C3.DataURIToBinaryBlobSync(canvas.toDataURL(type, quality))
|
||
}
|
||
;
|
||
C3.DataURIToBinaryBlobSync = function DataURIToBinaryBlobSync(datauri) {
|
||
const o = C3.ParseDataURI(datauri);
|
||
return C3.BinaryStringToBlob(o.data, o.mime_type)
|
||
}
|
||
;
|
||
C3.ParseDataURI = function ParseDataURI(datauri) {
|
||
if (datauri.substr(0, 5) !== "data:")
|
||
throw new URIError("expected data: uri");
|
||
let comma = datauri.indexOf(",");
|
||
if (comma < 0)
|
||
throw new URIError("expected comma in data: uri");
|
||
let typepart = datauri.substring(5, comma);
|
||
let datapart = datauri.substring(comma + 1);
|
||
let typearr = typepart.split(";");
|
||
let mimetype = typearr[0] || "";
|
||
let encoding1 = typearr[1];
|
||
let encoding2 = typearr[2];
|
||
let decodeddata;
|
||
if (encoding1 === "base64" || encoding2 === "base64")
|
||
decodeddata = atob(datapart);
|
||
else
|
||
decodeddata = decodeURIComponent(datapart);
|
||
return {
|
||
mime_type: mimetype,
|
||
data: decodeddata
|
||
}
|
||
}
|
||
;
|
||
C3.BinaryStringToBlob = function BinaryStringToBlob(binstr, mime_type) {
|
||
let len = binstr.length;
|
||
let len32 = len >> 2;
|
||
let a8 = new Uint8Array(len);
|
||
let a32 = new Uint32Array(a8.buffer,0,len32);
|
||
let i, j;
|
||
for (i = 0,
|
||
j = 0; i < len32; ++i)
|
||
a32[i] = binstr.charCodeAt(j++) | binstr.charCodeAt(j++) << 8 | binstr.charCodeAt(j++) << 16 | binstr.charCodeAt(j++) << 24;
|
||
let tailLength = len & 3;
|
||
while (tailLength--) {
|
||
a8[j] = binstr.charCodeAt(j);
|
||
++j
|
||
}
|
||
if (mime_type)
|
||
return new Blob([a8],{
|
||
"type": mime_type
|
||
});
|
||
else
|
||
return new Blob([a8])
|
||
}
|
||
;
|
||
C3.DrawableToBlob = function DrawableToBlob(drawable, type, quality) {
|
||
const canvas = C3.CreateCanvas(drawable.width, drawable.height);
|
||
const ctx = canvas.getContext("2d");
|
||
ctx.drawImage(drawable, 0, 0);
|
||
return C3.CanvasToBlob(canvas, type, quality)
|
||
}
|
||
;
|
||
C3.ImageDataToBlobSync = function ImageDataToBlobSync(imageData, type, quality) {
|
||
const canvas = C3.CreateCanvas(imageData.width, imageData.height);
|
||
const ctx = canvas.getContext("2d");
|
||
ctx.putImageData(imageData, 0, 0);
|
||
return C3.CanvasToBlobSync(canvas, type, quality)
|
||
}
|
||
;
|
||
C3.ImageDataToBlob = function ImageDataToBlob(imageData, type, quality) {
|
||
if (C3.Supports.ImageBitmapOptions)
|
||
return createImageBitmap(imageData, {
|
||
"premultiplyAlpha": "none"
|
||
}).then(imageBitmap=>C3.DrawableToBlob(imageBitmap, type, quality));
|
||
else if (C3.Supports.ImageBitmap)
|
||
return createImageBitmap(imageData).then(imageBitmap=>C3.DrawableToBlob(imageBitmap, type, quality));
|
||
else {
|
||
const canvas = C3.CreateCanvas(imageData.width, imageData.height);
|
||
const ctx = canvas.getContext("2d");
|
||
ctx.putImageData(imageData, 0, 0);
|
||
return C3.CanvasToBlob(canvas, type, quality)
|
||
}
|
||
}
|
||
;
|
||
C3.CopySet = function CopySet(dest, src) {
|
||
dest.clear();
|
||
for (const x of src)
|
||
dest.add(x)
|
||
}
|
||
;
|
||
C3.MapToObject = function MapToObject(map) {
|
||
const ret = Object.create(null);
|
||
for (const [k,v] of map.entries())
|
||
ret[k] = v;
|
||
return ret
|
||
}
|
||
;
|
||
C3.ObjectToMap = function ObjectToMap(o, map) {
|
||
map.clear();
|
||
for (const [k,v] of Object.entries(o))
|
||
map.set(k, v)
|
||
}
|
||
;
|
||
C3.ToSuperJSON = function ToSuperJSON(v) {
|
||
if (typeof v === "object" && v !== null)
|
||
if (v instanceof Set)
|
||
return {
|
||
"_c3type_": "set",
|
||
"data": [...v].map(o=>ToSuperJSON(o))
|
||
};
|
||
else if (v instanceof Map)
|
||
return {
|
||
"_c3type_": "map",
|
||
"data": [...v].map(pair=>[pair[0], ToSuperJSON(pair[1])])
|
||
};
|
||
else {
|
||
const ret = Object.create(null);
|
||
for (const [key,value] of Object.entries(v))
|
||
ret[key] = ToSuperJSON(value);
|
||
return ret
|
||
}
|
||
return v
|
||
}
|
||
;
|
||
C3.FromSuperJSON = function FromSuperJSON(v) {
|
||
if (typeof v === "object" & v !== null)
|
||
if (v["_c3type_"] === "set")
|
||
return new Set(v["data"].map(o=>FromSuperJSON(o)));
|
||
else if (v["_c3type_"] === "map")
|
||
return new Map(v["data"].map(pair=>[pair[0], FromSuperJSON(pair[1])]));
|
||
else {
|
||
const ret = Object.create(null);
|
||
for (const [key,value] of Object.entries(v))
|
||
ret[key] = FromSuperJSON(value);
|
||
return ret
|
||
}
|
||
return v
|
||
}
|
||
;
|
||
C3.CSSToCamelCase = function(str) {
|
||
let ret = "";
|
||
let isAfterHyphen = false;
|
||
for (const ch of str)
|
||
if (ch === "-")
|
||
isAfterHyphen = true;
|
||
else if (isAfterHyphen) {
|
||
ret += ch.toUpperCase();
|
||
isAfterHyphen = false
|
||
} else
|
||
ret += ch;
|
||
return ret
|
||
}
|
||
;
|
||
C3.IsIterator = function(o) {
|
||
return typeof o === "object" && typeof o.next === "function"
|
||
}
|
||
;
|
||
C3.MakeFilledArray = function MakeFilledArray(len, data) {
|
||
const ret = [];
|
||
if (typeof data === "function")
|
||
for (let i = 0; i < len; ++i)
|
||
ret.push(data());
|
||
else
|
||
for (let i = 0; i < len; ++i)
|
||
ret.push(data);
|
||
return ret
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const HSL_TEST = /([0-9.]+),([0-9.]+)%?,([0-9.]+)%?/i;
|
||
const HSLA_TEST = /([0-9.]+),([0-9.]+)%?,([0-9.]+)%?,([0-9.])/i;
|
||
function padTwoDigits(str) {
|
||
if (str.length === 0)
|
||
return "00";
|
||
else if (str.length === 1)
|
||
return "0" + str;
|
||
else
|
||
return str
|
||
}
|
||
function hueToRGB(p, q, t) {
|
||
if (t < 0)
|
||
t += 1;
|
||
if (t > 1)
|
||
t -= 1;
|
||
if (t < 1 / 6)
|
||
return p + (q - p) * 6 * t;
|
||
if (t < 1 / 2)
|
||
return q;
|
||
if (t < 2 / 3)
|
||
return p + (q - p) * (2 / 3 - t) * 6;
|
||
return p
|
||
}
|
||
C3.Color = class Color {
|
||
constructor(r, g, b, a) {
|
||
this._r = NaN;
|
||
this._g = NaN;
|
||
this._b = NaN;
|
||
this._a = NaN;
|
||
this._r = 0;
|
||
this._g = 0;
|
||
this._b = 0;
|
||
this._a = 0;
|
||
if (r instanceof C3.Color)
|
||
this.set(r);
|
||
else
|
||
this.setRgba(r || 0, g || 0, b || 0, a || 0)
|
||
}
|
||
setRgb(r, g, b) {
|
||
this._r = +r;
|
||
this._g = +g;
|
||
this._b = +b;
|
||
this.clamp();
|
||
return this
|
||
}
|
||
setRgba(r, g, b, a) {
|
||
this._r = +r;
|
||
this._g = +g;
|
||
this._b = +b;
|
||
this._a = +a;
|
||
this.clamp();
|
||
return this
|
||
}
|
||
set(c) {
|
||
this._r = c._r;
|
||
this._g = c._g;
|
||
this._b = c._b;
|
||
this._a = c._a;
|
||
return this
|
||
}
|
||
copy(c) {
|
||
return this.set(c)
|
||
}
|
||
add(c) {
|
||
this._r += c._r;
|
||
this._g += c._g;
|
||
this._b += c._b;
|
||
this._a += c._a;
|
||
this.clamp()
|
||
}
|
||
addRgb(r, g, b, a=0) {
|
||
this._r += +r;
|
||
this._g += +g;
|
||
this._b += +b;
|
||
this._a += +a;
|
||
this.clamp()
|
||
}
|
||
diff(c) {
|
||
this.setR(Math.max(this._r, c._r) - Math.min(this._r, c._r));
|
||
this.setG(Math.max(this._g, c._g) - Math.min(this._g, c._g));
|
||
this.setB(Math.max(this._b, c._b) - Math.min(this._b, c._b));
|
||
this.setA(Math.max(this._a, c._a) - Math.min(this._a, c._a));
|
||
this.clamp()
|
||
}
|
||
copyRgb(c) {
|
||
this._r = c._r;
|
||
this._g = c._g;
|
||
this._b = c._b
|
||
}
|
||
setR(r) {
|
||
this._r = C3.clamp(+r, 0, 1)
|
||
}
|
||
getR() {
|
||
return this._r
|
||
}
|
||
setG(g) {
|
||
this._g = C3.clamp(+g, 0, 1)
|
||
}
|
||
getG() {
|
||
return this._g
|
||
}
|
||
setB(b) {
|
||
this._b = C3.clamp(+b, 0, 1)
|
||
}
|
||
getB() {
|
||
return this._b
|
||
}
|
||
setA(a) {
|
||
this._a = C3.clamp(+a, 0, 1)
|
||
}
|
||
getA() {
|
||
return this._a
|
||
}
|
||
clone() {
|
||
return C3.New(C3.Color, this._r, this._g, this._b, this._a)
|
||
}
|
||
toArray() {
|
||
return [this._r, this._g, this._b, this._a]
|
||
}
|
||
toTypedArray() {
|
||
return new Float64Array(this.toArray())
|
||
}
|
||
writeToTypedArray(ta, i) {
|
||
ta[i++] = this._r;
|
||
ta[i++] = this._g;
|
||
ta[i++] = this._b;
|
||
ta[i] = this._a
|
||
}
|
||
equals(c) {
|
||
return this._r === c._r && this._g === c._g && this._b === c._b && this._a === c._a
|
||
}
|
||
equalsIgnoringAlpha(c) {
|
||
return this._r === c._r && this._g === c._g && this._b === c._b
|
||
}
|
||
equalsRgb(r, g, b) {
|
||
return this._r === r && this._g === g && this._b === b
|
||
}
|
||
equalsRgba(r, g, b, a) {
|
||
return this._r === r && this._g === g && this._b === b && this._a === a
|
||
}
|
||
multiply(c) {
|
||
this._r *= c._r;
|
||
this._g *= c._g;
|
||
this._b *= c._b;
|
||
this._a *= c._a
|
||
}
|
||
multiplyAlpha(a) {
|
||
this._r *= a;
|
||
this._g *= a;
|
||
this._b *= a;
|
||
this._a *= a
|
||
}
|
||
premultiply() {
|
||
this._r *= this._a;
|
||
this._g *= this._a;
|
||
this._b *= this._a;
|
||
return this
|
||
}
|
||
unpremultiply() {
|
||
this._r /= this._a;
|
||
this._g /= this._a;
|
||
this._b /= this._a;
|
||
return this
|
||
}
|
||
clamp() {
|
||
this._r = C3.clamp(this._r, 0, 1);
|
||
this._g = C3.clamp(this._g, 0, 1);
|
||
this._b = C3.clamp(this._b, 0, 1);
|
||
this._a = C3.clamp(this._a, 0, 1);
|
||
return this
|
||
}
|
||
setFromRgbValue(rgb) {
|
||
this._r = C3.GetRValue(rgb);
|
||
this._g = C3.GetGValue(rgb);
|
||
this._b = C3.GetBValue(rgb);
|
||
this._a = C3.GetAValue(rgb)
|
||
}
|
||
getCssRgb(_r, _g, _b) {
|
||
const r = C3.IsFiniteNumber(_r) ? _r : this.getR();
|
||
const g = C3.IsFiniteNumber(_g) ? _g : this.getG();
|
||
const b = C3.IsFiniteNumber(_b) ? _b : this.getB();
|
||
return `rgb(${r * 100}%, ${g * 100}%, ${b * 100}%)`
|
||
}
|
||
getCssRgba(_r, _g, _b, _a) {
|
||
const r = C3.IsFiniteNumber(_r) ? _r : this.getR();
|
||
const g = C3.IsFiniteNumber(_g) ? _g : this.getG();
|
||
const b = C3.IsFiniteNumber(_b) ? _b : this.getB();
|
||
const a = C3.IsFiniteNumber(_a) ? _a : this.getA();
|
||
return `rgba(${r * 100}%, ${g * 100}%, ${b * 100}%, ${a})`
|
||
}
|
||
toHexString() {
|
||
const rh = Math.round(this.getR() * 255);
|
||
const gh = Math.round(this.getG() * 255);
|
||
const bh = Math.round(this.getB() * 255);
|
||
return "#" + padTwoDigits(rh.toString(16)) + padTwoDigits(gh.toString(16)) + padTwoDigits(bh.toString(16))
|
||
}
|
||
parseHexString(str) {
|
||
if (typeof str !== "string")
|
||
return false;
|
||
str = str.trim();
|
||
if (str.charAt(0) === "#")
|
||
str = str.substr(1);
|
||
let rv;
|
||
let gv;
|
||
let bv;
|
||
if (str.length === 3) {
|
||
rv = parseInt(str[0], 16) / 15;
|
||
gv = parseInt(str[1], 16) / 15;
|
||
bv = parseInt(str[2], 16) / 15
|
||
} else if (str.length === 6) {
|
||
rv = parseInt(str.substr(0, 2), 16) / 255;
|
||
gv = parseInt(str.substr(2, 2), 16) / 255;
|
||
bv = parseInt(str.substr(4, 2), 16) / 255
|
||
} else
|
||
return false;
|
||
if (isFinite(rv))
|
||
this.setR(rv);
|
||
if (isFinite(gv))
|
||
this.setG(gv);
|
||
if (isFinite(bv))
|
||
this.setB(bv);
|
||
this.setA(1);
|
||
return true
|
||
}
|
||
toCommaSeparatedRgb() {
|
||
const rv = Math.round(this.getR() * 255);
|
||
const gv = Math.round(this.getG() * 255);
|
||
const bv = Math.round(this.getB() * 255);
|
||
return `${rv}, ${gv}, ${bv}`
|
||
}
|
||
toRgbArray() {
|
||
const rv = Math.round(this.getR() * 255);
|
||
const gv = Math.round(this.getG() * 255);
|
||
const bv = Math.round(this.getB() * 255);
|
||
return [rv, gv, bv]
|
||
}
|
||
parseCommaSeparatedRgb(str) {
|
||
if (typeof str !== "string")
|
||
return false;
|
||
str = str.replace(/^rgb\(|\)|%/, "");
|
||
const arr = str.split(",");
|
||
if (arr.length < 3)
|
||
return false;
|
||
const rv = parseInt(arr[0].trim(), 10) / 255;
|
||
const gv = parseInt(arr[1].trim(), 10) / 255;
|
||
const bv = parseInt(arr[2].trim(), 10) / 255;
|
||
if (isFinite(rv))
|
||
this.setR(rv);
|
||
if (isFinite(gv))
|
||
this.setG(gv);
|
||
if (isFinite(bv))
|
||
this.setB(bv);
|
||
this.setA(1);
|
||
return true
|
||
}
|
||
parseCommaSeparatedPercentageRgb(str) {
|
||
if (typeof str !== "string")
|
||
return false;
|
||
str = str.replace(/^rgb\(|\)|%/, "");
|
||
const arr = str.split(",");
|
||
if (arr.length < 3)
|
||
return false;
|
||
const rv = parseInt(arr[0].trim(), 10) / 100;
|
||
const gv = parseInt(arr[1].trim(), 10) / 100;
|
||
const bv = parseInt(arr[2].trim(), 10) / 100;
|
||
if (isFinite(rv))
|
||
this.setR(rv);
|
||
if (isFinite(gv))
|
||
this.setG(gv);
|
||
if (isFinite(bv))
|
||
this.setB(bv);
|
||
this.setA(1);
|
||
return true
|
||
}
|
||
parseCommaSeparatedRgba(str) {
|
||
if (typeof str !== "string")
|
||
return false;
|
||
str = str.replace(/^rgba\(|\)|%/, "");
|
||
const arr = str.split(",");
|
||
if (arr.length < 4)
|
||
return false;
|
||
const rv = parseInt(arr[0].trim(), 10) / 255;
|
||
const gv = parseInt(arr[1].trim(), 10) / 255;
|
||
const bv = parseInt(arr[2].trim(), 10) / 255;
|
||
const av = parseFloat(arr[3].trim());
|
||
if (isFinite(rv))
|
||
this.setR(rv);
|
||
if (isFinite(gv))
|
||
this.setG(gv);
|
||
if (isFinite(bv))
|
||
this.setB(bv);
|
||
if (isFinite(av))
|
||
this.setA(av);
|
||
return true
|
||
}
|
||
parseCommaSeparatedPercentageRgba(str) {
|
||
if (typeof str !== "string")
|
||
return false;
|
||
str = str.replace(/^rgba\(|\)|%/, "");
|
||
const arr = str.split(",");
|
||
if (arr.length < 4)
|
||
return false;
|
||
const rv = parseInt(arr[0].trim(), 10) / 100;
|
||
const gv = parseInt(arr[1].trim(), 10) / 100;
|
||
const bv = parseInt(arr[2].trim(), 10) / 100;
|
||
const av = parseFloat(arr[3].trim());
|
||
if (isFinite(rv))
|
||
this.setR(rv);
|
||
if (isFinite(gv))
|
||
this.setG(gv);
|
||
if (isFinite(bv))
|
||
this.setB(bv);
|
||
if (isFinite(av))
|
||
this.setA(av);
|
||
return true
|
||
}
|
||
parseString(str) {
|
||
if (typeof str !== "string")
|
||
return false;
|
||
str = str.replace(/\s+/, "");
|
||
if (str.includes(","))
|
||
if (str.startsWith("rgb("))
|
||
if (str.includes("%"))
|
||
return this.parseCommaSeparatedPercentageRgb(str);
|
||
else
|
||
return this.parseCommaSeparatedRgb(str);
|
||
else if (str.startsWith("rgba("))
|
||
if (str.includes("%"))
|
||
return this.parseCommaSeparatedPercentageRgba(str);
|
||
else
|
||
return this.parseCommaSeparatedRgba(str);
|
||
else if (str.startsWith("hsl(") || str.startsWith("hsla("))
|
||
return this.parseHSLString(str);
|
||
else {
|
||
const components = str.split(",");
|
||
if (str.includes("%")) {
|
||
if (components.length === 3)
|
||
return this.parseCommaSeparatedPercentageRgb(str);
|
||
else if (components.length === 4)
|
||
return this.parseCommaSeparatedPercentageRgba(str);
|
||
return false
|
||
} else {
|
||
if (components.length === 3)
|
||
return this.parseCommaSeparatedRgb(str);
|
||
else if (components.length === 4)
|
||
return this.parseCommaSeparatedRgba(str);
|
||
return false
|
||
}
|
||
}
|
||
else
|
||
return this.parseHexString(str)
|
||
}
|
||
toJSON() {
|
||
return [this._r, this._g, this._b, this._a]
|
||
}
|
||
setFromHSLA(h, s, l, a) {
|
||
let r;
|
||
let g;
|
||
let b;
|
||
h %= 360;
|
||
s = C3.clamp(s, 0, 100);
|
||
l = C3.clamp(l, 0, 100);
|
||
a = C3.clamp(a, 0, 1);
|
||
h /= 360;
|
||
s /= 100;
|
||
l /= 100;
|
||
if (s === 0)
|
||
r = g = b = l;
|
||
else {
|
||
const q = l < .5 ? l * (1 + s) : l + s - l * s;
|
||
const p = 2 * l - q;
|
||
r = hueToRGB(p, q, h + 1 / 3);
|
||
g = hueToRGB(p, q, h);
|
||
b = hueToRGB(p, q, h - 1 / 3)
|
||
}
|
||
this.setR(r);
|
||
this.setG(g);
|
||
this.setB(b);
|
||
this.setA(a);
|
||
return this
|
||
}
|
||
parseHSLString(str) {
|
||
const cleanString = str.replace(/ |hsl|hsla|\(|\)|;/gi, "");
|
||
const hsl = HSL_TEST.exec(cleanString);
|
||
const hsla = HSLA_TEST.exec(cleanString);
|
||
if (hsl && hsl.length === 4) {
|
||
this.setFromHSLA(+hsl[1], +hsl[2], +hsl[3], 1);
|
||
return true
|
||
} else if (hsla && hsla.length === 5) {
|
||
this.setFromHSLA(+hsl[1], +hsl[2], +hsl[3], +hsl[4]);
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
toHSLAString() {
|
||
const r = this._r;
|
||
const g = this._g;
|
||
const b = this._b;
|
||
const a = this._a;
|
||
const h = C3.Color.GetHue(r, g, b);
|
||
const s = C3.Color.GetSaturation(r, g, b);
|
||
const l = C3.Color.GetLuminosity(r, g, b);
|
||
return `hsla(${h}, ${s}%, ${l}%, ${a})`
|
||
}
|
||
toHSLAArray() {
|
||
const r = this._r;
|
||
const g = this._g;
|
||
const b = this._b;
|
||
return [C3.Color.GetHue(r, g, b), C3.Color.GetSaturation(r, g, b), C3.Color.GetLuminosity(r, g, b), this._a]
|
||
}
|
||
setFromJSON(arr) {
|
||
if (!Array.isArray(arr))
|
||
return;
|
||
if (arr.length < 3)
|
||
return;
|
||
this._r = arr[0];
|
||
this._g = arr[1];
|
||
this._b = arr[2];
|
||
if (arr.length >= 4)
|
||
this._a = arr[3];
|
||
else
|
||
this._a = 1
|
||
}
|
||
set r(r) {
|
||
this.setR(r)
|
||
}
|
||
get r() {
|
||
return this.getR()
|
||
}
|
||
set g(g) {
|
||
this.setG(g)
|
||
}
|
||
get g() {
|
||
return this.getG()
|
||
}
|
||
set b(b) {
|
||
this.setB(b)
|
||
}
|
||
get b() {
|
||
return this.getB()
|
||
}
|
||
set a(a) {
|
||
this.setA(a)
|
||
}
|
||
get a() {
|
||
return this.getA()
|
||
}
|
||
setAtIndex(i, v) {
|
||
switch (i) {
|
||
case 0:
|
||
this.setR(v);
|
||
break;
|
||
case 1:
|
||
this.setG(v);
|
||
break;
|
||
case 2:
|
||
this.setB(v);
|
||
break;
|
||
case 3:
|
||
this.setA(v);
|
||
break;
|
||
default:
|
||
throw new RangeError("invalid color index");
|
||
}
|
||
}
|
||
getAtIndex(i) {
|
||
switch (i) {
|
||
case 0:
|
||
return this.getR();
|
||
case 1:
|
||
return this.getG();
|
||
case 2:
|
||
return this.getB();
|
||
case 3:
|
||
return this.getA();
|
||
default:
|
||
throw new RangeError("invalid color index");
|
||
}
|
||
}
|
||
static DiffChannel(channel1, channel2) {
|
||
return C3.clamp(Math.max(channel1, channel2) - Math.min(channel1, channel2), 0, 1)
|
||
}
|
||
static Diff(c1, c2) {
|
||
const ret = new C3.Color;
|
||
ret.setR(Math.max(c1._r, c2._r) - Math.min(c1._r, c2._r));
|
||
ret.setG(Math.max(c1._g, c2._g) - Math.min(c1._g, c2._g));
|
||
ret.setB(Math.max(c1._b, c2._b) - Math.min(c1._b, c2._b));
|
||
ret.setA(Math.max(c1._a, c2._a) - Math.min(c1._a, c2._a));
|
||
return ret
|
||
}
|
||
static DiffNoAlpha(c1, c2) {
|
||
const ret = new C3.Color(0,0,0,1);
|
||
ret.setR(Math.max(c1._r, c2._r) - Math.min(c1._r, c2._r));
|
||
ret.setG(Math.max(c1._g, c2._g) - Math.min(c1._g, c2._g));
|
||
ret.setB(Math.max(c1._b, c2._b) - Math.min(c1._b, c2._b));
|
||
return ret
|
||
}
|
||
static GetHue(r, g, b) {
|
||
const max = Math.max(r, g, b);
|
||
const min = Math.min(r, g, b);
|
||
if (max === min)
|
||
return 0;
|
||
let h = 0;
|
||
switch (max) {
|
||
case r:
|
||
h = (g - b) / (max - min) + (g < b ? 6 : 0);
|
||
break;
|
||
case g:
|
||
h = (b - r) / (max - min) + 2;
|
||
break;
|
||
case b:
|
||
h = (r - g) / (max - min) + 4;
|
||
break
|
||
}
|
||
return Math.round(h / 6 * 360)
|
||
}
|
||
static GetSaturation(r, g, b) {
|
||
const max = Math.max(r, g, b);
|
||
const min = Math.min(r, g, b);
|
||
if (max === min)
|
||
return 0;
|
||
const l = (max + min) / 2;
|
||
const d = max - min;
|
||
const s = l > .5 ? d / (2 - max - min) : d / (max + min);
|
||
return Math.round(s * 100)
|
||
}
|
||
static GetLuminosity(r, g, b) {
|
||
const max = Math.max(r, g, b);
|
||
const min = Math.min(r, g, b);
|
||
const l = (max + min) / 2;
|
||
if (!max)
|
||
return 0;
|
||
return Math.round(l * 100)
|
||
}
|
||
}
|
||
;
|
||
C3.Color.White = Object.freeze(C3.New(C3.Color, 1, 1, 1, 1));
|
||
C3.Color.Black = Object.freeze(C3.New(C3.Color, 0, 0, 0, 1));
|
||
C3.Color.TransparentBlack = Object.freeze(C3.New(C3.Color, 0, 0, 0, 0))
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Vector2 = class Vector2 {
|
||
constructor(x, y) {
|
||
this._x = 0;
|
||
this._y = 0;
|
||
if (x instanceof C3.Vector2)
|
||
this.copy(x);
|
||
else
|
||
this.set(x || 0, y || 0)
|
||
}
|
||
set(x, y) {
|
||
this._x = +x;
|
||
this._y = +y
|
||
}
|
||
copy(v) {
|
||
this._x = v._x;
|
||
this._y = v._y
|
||
}
|
||
equals(v) {
|
||
return this._x === v._x && this._y === v._y
|
||
}
|
||
setX(x) {
|
||
this._x = +x
|
||
}
|
||
getX() {
|
||
return this._x
|
||
}
|
||
setY(y) {
|
||
this._y = +y
|
||
}
|
||
getY() {
|
||
return this._y
|
||
}
|
||
toArray() {
|
||
return [this._x, this._y]
|
||
}
|
||
toTypedArray() {
|
||
return new Float64Array(this.toArray())
|
||
}
|
||
writeToTypedArray(ta, i) {
|
||
ta[i++] = this._x;
|
||
ta[i] = this._y
|
||
}
|
||
offset(x, y) {
|
||
this._x += +x;
|
||
this._y += +y
|
||
}
|
||
scale(x, y) {
|
||
this._x *= x;
|
||
this._y *= y
|
||
}
|
||
round() {
|
||
this._x = Math.round(this._x);
|
||
this._y = Math.round(this._y)
|
||
}
|
||
floor() {
|
||
this._x = Math.floor(this._x);
|
||
this._y = Math.floor(this._y)
|
||
}
|
||
ceil() {
|
||
this._x = Math.ceil(this._x);
|
||
this._y = Math.ceil(this._y)
|
||
}
|
||
angle() {
|
||
return C3.angleTo(0, 0, this._x, this._y)
|
||
}
|
||
lengthSquared() {
|
||
return this._x * this._x + this._y * this._y
|
||
}
|
||
length() {
|
||
return Math.sqrt(this.lengthSquared())
|
||
}
|
||
rotatePrecalc(sin_a, cos_a) {
|
||
const temp = this._x * cos_a - this._y * sin_a;
|
||
this._y = this._y * cos_a + this._x * sin_a;
|
||
this._x = temp
|
||
}
|
||
rotate(a) {
|
||
if (a === 0)
|
||
return;
|
||
this.rotatePrecalc(Math.sin(a), Math.cos(a))
|
||
}
|
||
rotateAbout(a, x, y) {
|
||
if (a === 0 || x === this._x && y === this._y)
|
||
return;
|
||
this._x -= x;
|
||
this._y -= y;
|
||
this.rotatePrecalc(Math.sin(a), Math.cos(a));
|
||
this._x += +x;
|
||
this._y += +y
|
||
}
|
||
move(a, dist) {
|
||
if (dist === 0)
|
||
return;
|
||
this._x += Math.cos(a) * dist;
|
||
this._y += Math.sin(a) * dist
|
||
}
|
||
normalize() {
|
||
const m = this.length();
|
||
if (m !== 0 && m !== 1) {
|
||
this._x /= m;
|
||
this._y /= m
|
||
}
|
||
}
|
||
clamp(lower, upper) {
|
||
this._x = C3.clamp(this._x, lower, upper);
|
||
this._y = C3.clamp(this._y, lower, upper)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Rect = class Rect {
|
||
constructor(left, top, right, bottom) {
|
||
this._left = NaN;
|
||
this._top = NaN;
|
||
this._right = NaN;
|
||
this._bottom = NaN;
|
||
this._left = 0;
|
||
this._top = 0;
|
||
this._right = 0;
|
||
this._bottom = 0;
|
||
if (left instanceof C3.Rect)
|
||
this.copy(left);
|
||
else
|
||
this.set(left || 0, top || 0, right || 0, bottom || 0)
|
||
}
|
||
set(left, top, right, bottom) {
|
||
this._left = +left;
|
||
this._top = +top;
|
||
this._right = +right;
|
||
this._bottom = +bottom
|
||
}
|
||
setWH(left, top, width, height) {
|
||
left = +left;
|
||
top = +top;
|
||
this._left = left;
|
||
this._top = top;
|
||
this._right = left + +width;
|
||
this._bottom = top + +height
|
||
}
|
||
copy(rect) {
|
||
this._left = +rect._left;
|
||
this._top = +rect._top;
|
||
this._right = +rect._right;
|
||
this._bottom = +rect._bottom
|
||
}
|
||
clone() {
|
||
return new C3.Rect(this._left,this._top,this._right,this._bottom)
|
||
}
|
||
static Merge(first, second) {
|
||
const ret = new C3.Rect;
|
||
ret.setLeft(Math.min(first._left, second._left));
|
||
ret.setTop(Math.min(first._top, second._top));
|
||
ret.setRight(Math.max(first._right, second._right));
|
||
ret.setBottom(Math.max(first._bottom, second._bottom));
|
||
return ret
|
||
}
|
||
static FromObject(o) {
|
||
return new C3.Rect(o.left,o.top,o.right,o.bottom)
|
||
}
|
||
equals(rect) {
|
||
return this._left === rect._left && this._top === rect._top && this._right === rect._right && this._bottom === rect._bottom
|
||
}
|
||
setLeft(l) {
|
||
this._left = +l
|
||
}
|
||
getLeft() {
|
||
return this._left
|
||
}
|
||
setTop(t) {
|
||
this._top = +t
|
||
}
|
||
getTop() {
|
||
return this._top
|
||
}
|
||
setRight(r) {
|
||
this._right = +r
|
||
}
|
||
getRight() {
|
||
return this._right
|
||
}
|
||
setBottom(b) {
|
||
this._bottom = +b
|
||
}
|
||
getBottom() {
|
||
return this._bottom
|
||
}
|
||
toArray() {
|
||
return [this._left, this._top, this._right, this._bottom]
|
||
}
|
||
toTypedArray() {
|
||
return new Float64Array(this.toArray())
|
||
}
|
||
toDOMRect() {
|
||
return new DOMRect(this._left,this._top,this.width(),this.height())
|
||
}
|
||
writeToTypedArray(ta, i) {
|
||
ta[i++] = this._left;
|
||
ta[i++] = this._top;
|
||
ta[i++] = this._right;
|
||
ta[i] = this._bottom
|
||
}
|
||
writeAsQuadToTypedArray(ta, i) {
|
||
ta[i++] = this._left;
|
||
ta[i++] = this._top;
|
||
ta[i++] = this._right;
|
||
ta[i++] = this._top;
|
||
ta[i++] = this._right;
|
||
ta[i++] = this._bottom;
|
||
ta[i++] = this._left;
|
||
ta[i] = this._bottom
|
||
}
|
||
width() {
|
||
return this._right - this._left
|
||
}
|
||
height() {
|
||
return this._bottom - this._top
|
||
}
|
||
midX() {
|
||
return (this._left + this._right) / 2
|
||
}
|
||
midY() {
|
||
return (this._top + this._bottom) / 2
|
||
}
|
||
offset(x, y) {
|
||
x = +x;
|
||
y = +y;
|
||
this._left += x;
|
||
this._top += y;
|
||
this._right += x;
|
||
this._bottom += y
|
||
}
|
||
offsetLeft(x) {
|
||
this._left += +x
|
||
}
|
||
offsetTop(y) {
|
||
this._top += +y
|
||
}
|
||
offsetRight(x) {
|
||
this._right += +x
|
||
}
|
||
offsetBottom(y) {
|
||
this._bottom += +y
|
||
}
|
||
toSquare(axis) {
|
||
if (axis !== "x")
|
||
throw new Error("invalid axis, only 'x' supported");
|
||
if (this._top < this._bottom)
|
||
if (this._left < this._right)
|
||
this._bottom = this._top + this.width();
|
||
else
|
||
this._bottom = this._top - this.width();
|
||
else if (this._left < this._right)
|
||
this._bottom = this._top - this.width();
|
||
else
|
||
this._bottom = this._top + this.width()
|
||
}
|
||
inflate(x, y) {
|
||
x = +x;
|
||
y = +y;
|
||
this._left -= x;
|
||
this._top -= y;
|
||
this._right += x;
|
||
this._bottom += y
|
||
}
|
||
deflate(x, y) {
|
||
x = +x;
|
||
y = +y;
|
||
this._left += x;
|
||
this._top += y;
|
||
this._right -= x;
|
||
this._bottom -= y
|
||
}
|
||
multiply(x, y) {
|
||
this._left *= x;
|
||
this._top *= y;
|
||
this._right *= x;
|
||
this._bottom *= y
|
||
}
|
||
divide(x, y) {
|
||
this._left /= x;
|
||
this._top /= y;
|
||
this._right /= x;
|
||
this._bottom /= y
|
||
}
|
||
mirrorAround(origin) {
|
||
this._left = +origin - this._left;
|
||
this._right = +origin - this._right
|
||
}
|
||
flipAround(origin) {
|
||
this._top = +origin - this._top;
|
||
this._bottom = +origin - this._bottom
|
||
}
|
||
swapLeftRight() {
|
||
const temp = this._left;
|
||
this._left = this._right;
|
||
this._right = temp
|
||
}
|
||
swapTopBottom() {
|
||
const temp = this._top;
|
||
this._top = this._bottom;
|
||
this._bottom = temp
|
||
}
|
||
shuntY(h) {
|
||
const top = this._top;
|
||
this._top = +h - this._bottom;
|
||
this._bottom = +h - top
|
||
}
|
||
round() {
|
||
this._left = Math.round(this._left);
|
||
this._top = Math.round(this._top);
|
||
this._right = Math.round(this._right);
|
||
this._bottom = Math.round(this._bottom)
|
||
}
|
||
roundInner() {
|
||
this._left = Math.ceil(this._left);
|
||
this._top = Math.ceil(this._top);
|
||
this._right = Math.floor(this._right);
|
||
this._bottom = Math.floor(this._bottom)
|
||
}
|
||
roundOuter() {
|
||
this._left = Math.floor(this._left);
|
||
this._top = Math.floor(this._top);
|
||
this._right = Math.ceil(this._right);
|
||
this._bottom = Math.ceil(this._bottom)
|
||
}
|
||
floor() {
|
||
this._left = Math.floor(this._left);
|
||
this._top = Math.floor(this._top);
|
||
this._right = Math.floor(this._right);
|
||
this._bottom = Math.floor(this._bottom)
|
||
}
|
||
ceil() {
|
||
this._left = Math.ceil(this._left);
|
||
this._top = Math.ceil(this._top);
|
||
this._right = Math.ceil(this._right);
|
||
this._bottom = Math.ceil(this._bottom)
|
||
}
|
||
clamp(l, t, r, b) {
|
||
if (this._left < l)
|
||
this._left = +l;
|
||
if (this._top < t)
|
||
this._top = +t;
|
||
if (this._right > r)
|
||
this._right = +r;
|
||
if (this._bottom > b)
|
||
this._bottom = +b
|
||
}
|
||
clampFlipped(l, t, r, b) {
|
||
if (this._left < l)
|
||
this._left = +l;
|
||
if (this._top > t)
|
||
this._top = +t;
|
||
if (this._right > r)
|
||
this._right = +r;
|
||
if (this._bottom < b)
|
||
this._bottom = +b
|
||
}
|
||
normalize() {
|
||
if (this._left > this._right)
|
||
this.swapLeftRight();
|
||
if (this._top > this._bottom)
|
||
this.swapTopBottom()
|
||
}
|
||
intersectsRect(rect) {
|
||
return !(rect._right < this._left || rect._bottom < this._top || rect._left > this._right || rect._top > this._bottom)
|
||
}
|
||
intersectsRectOffset(rect, x, y) {
|
||
return !(rect._right + x < this._left || rect._bottom + y < this._top || rect._left + x > this._right || rect._top + y > this._bottom)
|
||
}
|
||
containsPoint(x, y) {
|
||
return x >= this._left && x <= this._right && y >= this._top && y <= this._bottom
|
||
}
|
||
containsRect(rect) {
|
||
return rect._left >= this._left && rect._top >= this._top && rect._right <= this._right && rect._bottom <= this._bottom
|
||
}
|
||
expandToContain(rect) {
|
||
if (rect._left < this._left)
|
||
this._left = +rect._left;
|
||
if (rect._top < this._top)
|
||
this._top = +rect._top;
|
||
if (rect._right > this._right)
|
||
this._right = +rect._right;
|
||
if (rect._bottom > this._bottom)
|
||
this._bottom = +rect._bottom
|
||
}
|
||
lerpInto(rect) {
|
||
this._left = C3.lerp(rect._left, rect._right, this._left);
|
||
this._top = C3.lerp(rect._top, rect._bottom, this._top);
|
||
this._right = C3.lerp(rect._left, rect._right, this._right);
|
||
this._bottom = C3.lerp(rect._top, rect._bottom, this._bottom)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Quad = class Quad {
|
||
constructor(tlx, tly, trx, try_, brx, bry, blx, bly) {
|
||
this._tlx = NaN;
|
||
this._tly = NaN;
|
||
this._trx = NaN;
|
||
this._try = NaN;
|
||
this._brx = NaN;
|
||
this._bry = NaN;
|
||
this._blx = NaN;
|
||
this._bly = NaN;
|
||
this._tlx = 0;
|
||
this._tly = 0;
|
||
this._trx = 0;
|
||
this._try = 0;
|
||
this._brx = 0;
|
||
this._bry = 0;
|
||
this._blx = 0;
|
||
this._bly = 0;
|
||
if (tlx instanceof C3.Quad)
|
||
this.copy(tlx);
|
||
else
|
||
this.set(tlx || 0, tly || 0, trx || 0, try_ || 0, brx || 0, bry || 0, blx || 0, bly || 0)
|
||
}
|
||
set(tlx, tly, trx, try_, brx, bry, blx, bly) {
|
||
this._tlx = +tlx;
|
||
this._tly = +tly;
|
||
this._trx = +trx;
|
||
this._try = +try_;
|
||
this._brx = +brx;
|
||
this._bry = +bry;
|
||
this._blx = +blx;
|
||
this._bly = +bly
|
||
}
|
||
setRect(left, top, right, bottom) {
|
||
this.set(left, top, right, top, right, bottom, left, bottom)
|
||
}
|
||
copy(q) {
|
||
this._tlx = q._tlx;
|
||
this._tly = q._tly;
|
||
this._trx = q._trx;
|
||
this._try = q._try;
|
||
this._brx = q._brx;
|
||
this._bry = q._bry;
|
||
this._blx = q._blx;
|
||
this._bly = q._bly
|
||
}
|
||
equals(q) {
|
||
return this._tlx === q._tlx && this._tly === q._tly && this._trx === q._trx && this._try === q._try && this._brx === q._brx && this._bry === q._bry && this._blx === q._blx && this._bly === q._bly
|
||
}
|
||
setTlx(v) {
|
||
this._tlx = +v
|
||
}
|
||
getTlx() {
|
||
return this._tlx
|
||
}
|
||
setTly(v) {
|
||
this._tly = +v
|
||
}
|
||
getTly() {
|
||
return this._tly
|
||
}
|
||
setTrx(v) {
|
||
this._trx = +v
|
||
}
|
||
getTrx() {
|
||
return this._trx
|
||
}
|
||
setTry(v) {
|
||
this._try = +v
|
||
}
|
||
getTry() {
|
||
return this._try
|
||
}
|
||
setBrx(v) {
|
||
this._brx = +v
|
||
}
|
||
getBrx() {
|
||
return this._brx
|
||
}
|
||
setBry(v) {
|
||
this._bry = +v
|
||
}
|
||
getBry() {
|
||
return this._bry
|
||
}
|
||
setBlx(v) {
|
||
this._blx = +v
|
||
}
|
||
getBlx() {
|
||
return this._blx
|
||
}
|
||
setBly(v) {
|
||
this._bly = +v
|
||
}
|
||
getBly() {
|
||
return this._bly
|
||
}
|
||
toDOMQuad() {
|
||
return new DOMQuad(new DOMPoint(this._tlx,this._tly),new DOMPoint(this._trx,this._try),new DOMPoint(this._brx,this._bry),new DOMPoint(this._blx,this._bly))
|
||
}
|
||
toArray() {
|
||
return [this._tlx, this._tly, this._trx, this._try, this._brx, this._bry, this._blx, this._bly]
|
||
}
|
||
toTypedArray() {
|
||
return new Float64Array(this.toArray())
|
||
}
|
||
writeToTypedArray(ta, i) {
|
||
ta[i++] = this._tlx;
|
||
ta[i++] = this._tly;
|
||
ta[i++] = this._trx;
|
||
ta[i++] = this._try;
|
||
ta[i++] = this._brx;
|
||
ta[i++] = this._bry;
|
||
ta[i++] = this._blx;
|
||
ta[i] = this._bly
|
||
}
|
||
writeToTypedArray3D(ta, i, z) {
|
||
ta[i++] = this._tlx;
|
||
ta[i++] = this._tly;
|
||
ta[i++] = z;
|
||
ta[i++] = this._trx;
|
||
ta[i++] = this._try;
|
||
ta[i++] = z;
|
||
ta[i++] = this._brx;
|
||
ta[i++] = this._bry;
|
||
ta[i++] = z;
|
||
ta[i++] = this._blx;
|
||
ta[i++] = this._bly;
|
||
ta[i] = z
|
||
}
|
||
offset(x, y) {
|
||
x = +x;
|
||
y = +y;
|
||
this._tlx += x;
|
||
this._tly += y;
|
||
this._trx += x;
|
||
this._try += y;
|
||
this._brx += x;
|
||
this._bry += y;
|
||
this._blx += x;
|
||
this._bly += y
|
||
}
|
||
round() {
|
||
this._tlx = Math.round(this._tlx);
|
||
this._tly = Math.round(this._tly);
|
||
this._trx = Math.round(this._trx);
|
||
this._try = Math.round(this._try);
|
||
this._brx = Math.round(this._brx);
|
||
this._bry = Math.round(this._bry);
|
||
this._blx = Math.round(this._blx);
|
||
this._bly = Math.round(this._bly)
|
||
}
|
||
floor() {
|
||
this._tlx = Math.floor(this._tlx);
|
||
this._tly = Math.floor(this._tly);
|
||
this._trx = Math.floor(this._trx);
|
||
this._try = Math.floor(this._try);
|
||
this._brx = Math.floor(this._brx);
|
||
this._bry = Math.floor(this._bry);
|
||
this._blx = Math.floor(this._blx);
|
||
this._bly = Math.floor(this._bly)
|
||
}
|
||
ceil() {
|
||
this._tlx = Math.ceil(this._tlx);
|
||
this._tly = Math.ceil(this._tly);
|
||
this._trx = Math.ceil(this._trx);
|
||
this._try = Math.ceil(this._try);
|
||
this._brx = Math.ceil(this._brx);
|
||
this._bry = Math.ceil(this._bry);
|
||
this._blx = Math.ceil(this._blx);
|
||
this._bly = Math.ceil(this._bly)
|
||
}
|
||
setFromRect(rect) {
|
||
this._tlx = rect._left;
|
||
this._tly = rect._top;
|
||
this._trx = rect._right;
|
||
this._try = rect._top;
|
||
this._brx = rect._right;
|
||
this._bry = rect._bottom;
|
||
this._blx = rect._left;
|
||
this._bly = rect._bottom
|
||
}
|
||
setFromRotatedRect(rect, a) {
|
||
if (a === 0)
|
||
this.setFromRect(rect);
|
||
else
|
||
this.setFromRotatedRectPrecalc(rect, Math.sin(a), Math.cos(a))
|
||
}
|
||
setFromRotatedRectPrecalc(rect, sin_a, cos_a) {
|
||
const left_sin_a = rect._left * sin_a;
|
||
const top_sin_a = rect._top * sin_a;
|
||
const right_sin_a = rect._right * sin_a;
|
||
const bottom_sin_a = rect._bottom * sin_a;
|
||
const left_cos_a = rect._left * cos_a;
|
||
const top_cos_a = rect._top * cos_a;
|
||
const right_cos_a = rect._right * cos_a;
|
||
const bottom_cos_a = rect._bottom * cos_a;
|
||
this._tlx = left_cos_a - top_sin_a;
|
||
this._tly = top_cos_a + left_sin_a;
|
||
this._trx = right_cos_a - top_sin_a;
|
||
this._try = top_cos_a + right_sin_a;
|
||
this._brx = right_cos_a - bottom_sin_a;
|
||
this._bry = bottom_cos_a + right_sin_a;
|
||
this._blx = left_cos_a - bottom_sin_a;
|
||
this._bly = bottom_cos_a + left_sin_a
|
||
}
|
||
getBoundingBox(rect) {
|
||
rect.set(Math.min(this._tlx, this._trx, this._brx, this._blx), Math.min(this._tly, this._try, this._bry, this._bly), Math.max(this._tlx, this._trx, this._brx, this._blx), Math.max(this._tly, this._try, this._bry, this._bly))
|
||
}
|
||
containsPoint(x, y) {
|
||
let v0x = this._trx - this._tlx;
|
||
let v0y = this._try - this._tly;
|
||
const v1x = this._brx - this._tlx;
|
||
const v1y = this._bry - this._tly;
|
||
const v2x = x - this._tlx;
|
||
const v2y = y - this._tly;
|
||
let dot00 = v0x * v0x + v0y * v0y;
|
||
let dot01 = v0x * v1x + v0y * v1y;
|
||
let dot02 = v0x * v2x + v0y * v2y;
|
||
const dot11 = v1x * v1x + v1y * v1y;
|
||
const dot12 = v1x * v2x + v1y * v2y;
|
||
let invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
|
||
let u = (dot11 * dot02 - dot01 * dot12) * invDenom;
|
||
let v = (dot00 * dot12 - dot01 * dot02) * invDenom;
|
||
if (u >= 0 && v > 0 && u + v < 1)
|
||
return true;
|
||
v0x = this._blx - this._tlx;
|
||
v0y = this._bly - this._tly;
|
||
dot00 = v0x * v0x + v0y * v0y;
|
||
dot01 = v0x * v1x + v0y * v1y;
|
||
dot02 = v0x * v2x + v0y * v2y;
|
||
invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
|
||
u = (dot11 * dot02 - dot01 * dot12) * invDenom;
|
||
v = (dot00 * dot12 - dot01 * dot02) * invDenom;
|
||
return u >= 0 && v > 0 && u + v < 1
|
||
}
|
||
midX() {
|
||
return (this._tlx + this._trx + this._brx + this._blx) / 4
|
||
}
|
||
midY() {
|
||
return (this._tly + this._try + this._bry + this._bly) / 4
|
||
}
|
||
intersectsSegment(x1, y1, x2, y2) {
|
||
if (this.containsPoint(x1, y1) || this.containsPoint(x2, y2))
|
||
return true;
|
||
return C3.segmentIntersectsQuad(x1, y1, x2, y2, this)
|
||
}
|
||
intersectsQuad(rhs) {
|
||
let midX = rhs.midX();
|
||
let midY = rhs.midY();
|
||
if (this.containsPoint(midX, midY))
|
||
return true;
|
||
midX = this.midX();
|
||
midY = this.midY();
|
||
if (rhs.containsPoint(midX, midY))
|
||
return true;
|
||
const tlx = this._tlx
|
||
, tly = this._tly
|
||
, trx = this._trx
|
||
, try_ = this._try
|
||
, brx = this._brx
|
||
, bry = this._bry
|
||
, blx = this._blx
|
||
, bly = this._bly;
|
||
return C3.segmentIntersectsQuad(tlx, tly, trx, try_, rhs) || C3.segmentIntersectsQuad(trx, try_, brx, bry, rhs) || C3.segmentIntersectsQuad(brx, bry, blx, bly, rhs) || C3.segmentIntersectsQuad(blx, bly, tlx, tly, rhs)
|
||
}
|
||
mirror() {
|
||
this._swap(0, 2);
|
||
this._swap(1, 3);
|
||
this._swap(6, 4);
|
||
this._swap(7, 5)
|
||
}
|
||
flip() {
|
||
this._swap(0, 6);
|
||
this._swap(1, 7);
|
||
this._swap(2, 4);
|
||
this._swap(3, 5)
|
||
}
|
||
diag() {
|
||
this._swap(2, 6);
|
||
this._swap(3, 7)
|
||
}
|
||
_swap(i, j) {
|
||
const tmp = this._getAtIndex(i);
|
||
this._setAtIndex(i, this._getAtIndex(j));
|
||
this._setAtIndex(j, tmp)
|
||
}
|
||
_getAtIndex(i) {
|
||
switch (i) {
|
||
case 0:
|
||
return this._tlx;
|
||
case 1:
|
||
return this._tly;
|
||
case 2:
|
||
return this._trx;
|
||
case 3:
|
||
return this._try;
|
||
case 4:
|
||
return this._brx;
|
||
case 5:
|
||
return this._bry;
|
||
case 6:
|
||
return this._blx;
|
||
case 7:
|
||
return this._bly;
|
||
default:
|
||
throw new RangeError("invalid quad point index");
|
||
}
|
||
}
|
||
_setAtIndex(i, v) {
|
||
v = +v;
|
||
switch (i) {
|
||
case 0:
|
||
this._tlx = v;
|
||
break;
|
||
case 1:
|
||
this._tly = v;
|
||
break;
|
||
case 2:
|
||
this._trx = v;
|
||
break;
|
||
case 3:
|
||
this._try = v;
|
||
break;
|
||
case 4:
|
||
this._brx = v;
|
||
break;
|
||
case 5:
|
||
this._bry = v;
|
||
break;
|
||
case 6:
|
||
this._blx = v;
|
||
break;
|
||
case 7:
|
||
this._bly = v;
|
||
break;
|
||
default:
|
||
throw new RangeError("invalid quad point index");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
const DEFAULT_POLY_POINTS = [0, 0, 1, 0, 1, 1, 0, 1];
|
||
const tempQuad = C3.New(C3.Quad);
|
||
C3.CollisionPoly = class CollisionPoly extends C3.DefendedBase {
|
||
constructor(pointsArr, enabled=true) {
|
||
super();
|
||
if (!pointsArr)
|
||
pointsArr = DEFAULT_POLY_POINTS;
|
||
this._ptsArr = Float64Array.from(pointsArr);
|
||
this._bbox = new C3.Rect;
|
||
this._isBboxChanged = true;
|
||
this._enabled = enabled
|
||
}
|
||
Release() {}
|
||
pointsArr() {
|
||
return this._ptsArr
|
||
}
|
||
pointCount() {
|
||
return this._ptsArr.length / 2
|
||
}
|
||
setPoints(pointsArr) {
|
||
if (this._ptsArr.length === pointsArr.length)
|
||
this._ptsArr.set(pointsArr);
|
||
else
|
||
this._ptsArr = Float64Array.from(pointsArr);
|
||
this._isBboxChanged = true
|
||
}
|
||
setDefaultPoints() {
|
||
this.setPoints(DEFAULT_POLY_POINTS)
|
||
}
|
||
copy(poly) {
|
||
this.setPoints(poly._ptsArr)
|
||
}
|
||
setBboxChanged() {
|
||
this._isBboxChanged = true
|
||
}
|
||
_updateBbox() {
|
||
if (!this._isBboxChanged)
|
||
return;
|
||
const ptsArr = this._ptsArr;
|
||
let left = ptsArr[0];
|
||
let top = ptsArr[1];
|
||
let right = left;
|
||
let bottom = top;
|
||
for (let i = 0, len = ptsArr.length; i < len; i += 2) {
|
||
const x = ptsArr[i];
|
||
const y = ptsArr[i + 1];
|
||
if (x < left)
|
||
left = x;
|
||
if (x > right)
|
||
right = x;
|
||
if (y < top)
|
||
top = y;
|
||
if (y > bottom)
|
||
bottom = y
|
||
}
|
||
this._bbox.set(left, top, right, bottom);
|
||
this._isBboxChanged = false
|
||
}
|
||
setFromRect(rc, offX, offY) {
|
||
let ptsArr = this._ptsArr;
|
||
if (ptsArr.length !== 8) {
|
||
ptsArr = new Float64Array(8);
|
||
this._ptsArr = ptsArr
|
||
}
|
||
ptsArr[0] = rc.getLeft() - offX;
|
||
ptsArr[1] = rc.getTop() - offY;
|
||
ptsArr[2] = rc.getRight() - offX;
|
||
ptsArr[3] = rc.getTop() - offY;
|
||
ptsArr[4] = rc.getRight() - offX;
|
||
ptsArr[5] = rc.getBottom() - offY;
|
||
ptsArr[6] = rc.getLeft() - offX;
|
||
ptsArr[7] = rc.getBottom() - offY;
|
||
this._bbox.copy(rc);
|
||
if (offX !== 0 || offY !== 0)
|
||
this._bbox.offset(-offX, -offY);
|
||
this._isBboxChanged = false
|
||
}
|
||
setFromQuad(q, offX, offY) {
|
||
tempQuad.copy(q);
|
||
tempQuad.offset(offX, offY);
|
||
this.setPoints(tempQuad.toArray());
|
||
this._isBboxChanged = true
|
||
}
|
||
transform(w, h, a) {
|
||
let sina = 0;
|
||
let cosa = 1;
|
||
if (a !== 0) {
|
||
sina = Math.sin(a);
|
||
cosa = Math.cos(a)
|
||
}
|
||
this.transformPrecalc(w, h, sina, cosa)
|
||
}
|
||
transformPrecalc(w, h, sina, cosa) {
|
||
const ptsArr = this._ptsArr;
|
||
for (let i = 0, len = ptsArr.length; i < len; i += 2) {
|
||
const j = i + 1;
|
||
const x = ptsArr[i] * w;
|
||
const y = ptsArr[j] * h;
|
||
ptsArr[i] = x * cosa - y * sina;
|
||
ptsArr[j] = y * cosa + x * sina
|
||
}
|
||
this._isBboxChanged = true
|
||
}
|
||
offset(x, y) {
|
||
const ptsArr = this._ptsArr;
|
||
for (let i = 0, len = ptsArr.length; i < len; i += 2) {
|
||
ptsArr[i] += x;
|
||
ptsArr[i + 1] += y
|
||
}
|
||
}
|
||
containsPoint(a2x, a2y) {
|
||
const ptsArr = this._ptsArr;
|
||
if (a2x === ptsArr[0] && a2y === ptsArr[1])
|
||
return true;
|
||
this._updateBbox();
|
||
const bbox = this._bbox;
|
||
const a1x = bbox.getLeft() - 110;
|
||
const a1y = bbox.getTop() - 101;
|
||
const a3x = bbox.getRight() + 131;
|
||
const a3y = bbox.getBottom() + 120;
|
||
let minAx12 = 0;
|
||
let minAy12 = 0;
|
||
let maxAx12 = 0;
|
||
let maxAy12 = 0;
|
||
let minAx32 = 0;
|
||
let minAy32 = 0;
|
||
let maxAx32 = 0;
|
||
let maxAy32 = 0;
|
||
if (a1x < a2x) {
|
||
minAx12 = a1x;
|
||
maxAx12 = a2x
|
||
} else {
|
||
minAx12 = a2x;
|
||
maxAx12 = a1x
|
||
}
|
||
if (a1y < a2y) {
|
||
minAy12 = a1y;
|
||
maxAy12 = a2y
|
||
} else {
|
||
minAy12 = a2y;
|
||
maxAy12 = a1y
|
||
}
|
||
if (a3x < a2x) {
|
||
minAx32 = a3x;
|
||
maxAx32 = a2x
|
||
} else {
|
||
minAx32 = a2x;
|
||
maxAx32 = a3x
|
||
}
|
||
if (a3y < a2y) {
|
||
minAy32 = a3y;
|
||
maxAy32 = a2y
|
||
} else {
|
||
minAy32 = a2y;
|
||
maxAy32 = a3y
|
||
}
|
||
let count1 = 0;
|
||
let count2 = 0;
|
||
for (let i = 0, len = ptsArr.length; i < len; i += 2) {
|
||
const j = (i + 2) % len;
|
||
const b1x = ptsArr[i];
|
||
const b1y = ptsArr[i + 1];
|
||
const b2x = ptsArr[j];
|
||
const b2y = ptsArr[j + 1];
|
||
if (C3.segmentsIntersectPreCalc(a1x, a1y, a2x, a2y, minAx12, maxAx12, minAy12, maxAy12, b1x, b1y, b2x, b2y))
|
||
++count1;
|
||
if (C3.segmentsIntersectPreCalc(a3x, a3y, a2x, a2y, minAx32, maxAx32, minAy32, maxAy32, b1x, b1y, b2x, b2y))
|
||
++count2
|
||
}
|
||
return count1 % 2 === 1 || count2 % 2 === 1
|
||
}
|
||
intersectsPoly(poly, offX, offY) {
|
||
const rPts = poly._ptsArr;
|
||
const lPts = this._ptsArr;
|
||
if (this.containsPoint(rPts[0] + offX, rPts[1] + offY))
|
||
return true;
|
||
if (poly.containsPoint(lPts[0] - offX, lPts[1] - offY))
|
||
return true;
|
||
for (let i = 0, leni = lPts.length; i < leni; i += 2) {
|
||
const j = (i + 2) % leni;
|
||
const a1x = lPts[i];
|
||
const a1y = lPts[i + 1];
|
||
const a2x = lPts[j];
|
||
const a2y = lPts[j + 1];
|
||
let minAx = 0;
|
||
let minAy = 0;
|
||
let maxAx = 0;
|
||
let maxAy = 0;
|
||
if (a1x < a2x) {
|
||
minAx = a1x;
|
||
maxAx = a2x
|
||
} else {
|
||
minAx = a2x;
|
||
maxAx = a1x
|
||
}
|
||
if (a1y < a2y) {
|
||
minAy = a1y;
|
||
maxAy = a2y
|
||
} else {
|
||
minAy = a2y;
|
||
maxAy = a1y
|
||
}
|
||
for (let k = 0, lenk = rPts.length; k < lenk; k += 2) {
|
||
const l = (k + 2) % lenk;
|
||
const b1x = rPts[k] + offX;
|
||
const b1y = rPts[k + 1] + offY;
|
||
const b2x = rPts[l] + offX;
|
||
const b2y = rPts[l + 1] + offY;
|
||
if (C3.segmentsIntersectPreCalc(a1x, a1y, a2x, a2y, minAx, maxAx, minAy, maxAy, b1x, b1y, b2x, b2y))
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|
||
intersectsSegment(offX, offY, a1x, a1y, a2x, a2y) {
|
||
if (this.containsPoint(a1x - offX, a1y - offY))
|
||
return true;
|
||
if (this.containsPoint(a2x - offX, a2y - offY))
|
||
return true;
|
||
let minAx = 0;
|
||
let minAy = 0;
|
||
let maxAx = 0;
|
||
let maxAy = 0;
|
||
if (a1x < a2x) {
|
||
minAx = a1x;
|
||
maxAx = a2x
|
||
} else {
|
||
minAx = a2x;
|
||
maxAx = a1x
|
||
}
|
||
if (a1y < a2y) {
|
||
minAy = a1y;
|
||
maxAy = a2y
|
||
} else {
|
||
minAy = a2y;
|
||
maxAy = a1y
|
||
}
|
||
const ptsArr = this._ptsArr;
|
||
for (let i = 0, len = ptsArr.length; i < len; i += 2) {
|
||
const j = (i + 2) % len;
|
||
const b1x = ptsArr[i] + offX;
|
||
const b1y = ptsArr[i + 1] + offY;
|
||
const b2x = ptsArr[j] + offX;
|
||
const b2y = ptsArr[j + 1] + offY;
|
||
if (C3.segmentsIntersectPreCalc(a1x, a1y, a2x, a2y, minAx, maxAx, minAy, maxAy, b1x, b1y, b2x, b2y))
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
mirror(px) {
|
||
const ptsArr = this._ptsArr;
|
||
for (let i = 0, len = ptsArr.length; i < len; i += 2)
|
||
ptsArr[i] = px * 2 - ptsArr[i];
|
||
this._isBboxChanged = true
|
||
}
|
||
flip(py) {
|
||
const ptsArr = this._ptsArr;
|
||
for (let i = 0, len = ptsArr.length; i < len; i += 2) {
|
||
const j = i + 1;
|
||
ptsArr[j] = py * 2 - ptsArr[j]
|
||
}
|
||
this._isBboxChanged = true
|
||
}
|
||
diag() {
|
||
const ptsArr = this._ptsArr;
|
||
for (let i = 0, len = ptsArr.length; i < len; i += 2) {
|
||
const j = i + 1;
|
||
const temp = ptsArr[i];
|
||
ptsArr[i] = ptsArr[j];
|
||
ptsArr[j] = temp
|
||
}
|
||
this._isBboxChanged = true
|
||
}
|
||
GetMidX() {
|
||
const ptsArr = this._ptsArr;
|
||
let ret = 0;
|
||
for (let i = 0, len = ptsArr.length; i < len; i += 2)
|
||
ret += ptsArr[i];
|
||
return ret / this.pointCount()
|
||
}
|
||
GetMidY() {
|
||
const ptsArr = this._ptsArr;
|
||
let ret = 0;
|
||
for (let i = 0, len = ptsArr.length; i < len; i += 2)
|
||
ret += ptsArr[i + 1];
|
||
return ret / this.pointCount()
|
||
}
|
||
GetPointsArray() {
|
||
return this._ptsArr
|
||
}
|
||
GetPointCount() {
|
||
return this.pointCount()
|
||
}
|
||
IsEnabled() {
|
||
return this._enabled
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.PairMap = class PairMap extends C3.DefendedBase {
|
||
constructor(iterable) {
|
||
super();
|
||
this._firstMap = new Map;
|
||
if (iterable)
|
||
for (const [x,y,value] of iterable)
|
||
this.Set(x, y, value)
|
||
}
|
||
Release() {
|
||
this.Clear();
|
||
this._firstMap = null
|
||
}
|
||
Clear() {
|
||
const firstMap = this._firstMap;
|
||
for (const secondMap of firstMap.values())
|
||
secondMap.clear();
|
||
firstMap.clear()
|
||
}
|
||
Set(x, y, value) {
|
||
const firstMap = this._firstMap;
|
||
let secondMap = firstMap.get(x);
|
||
if (!secondMap) {
|
||
secondMap = new Map;
|
||
firstMap.set(x, secondMap)
|
||
}
|
||
secondMap.set(y, value)
|
||
}
|
||
Get(x, y) {
|
||
const secondMap = this._firstMap.get(x);
|
||
if (!secondMap)
|
||
return secondMap;
|
||
return secondMap.get(y)
|
||
}
|
||
Has(x, y) {
|
||
const secondMap = this._firstMap.get(x);
|
||
if (!secondMap)
|
||
return false;
|
||
return secondMap.has(y)
|
||
}
|
||
Delete(x, y) {
|
||
const firstMap = this._firstMap;
|
||
const secondMap = firstMap.get(x);
|
||
if (!secondMap)
|
||
return false;
|
||
const ret = secondMap.delete(y);
|
||
if (ret && secondMap.size === 0)
|
||
firstMap.delete(x);
|
||
return ret
|
||
}
|
||
DeleteEither(k) {
|
||
const firstMap = this._firstMap;
|
||
const secondMap = firstMap.get(k);
|
||
if (secondMap) {
|
||
secondMap.clear();
|
||
firstMap.delete(k)
|
||
}
|
||
for (const [x,secondMap] of firstMap.entries())
|
||
if (secondMap.delete(k) && secondMap.size === 0)
|
||
firstMap.delete(x)
|
||
}
|
||
GetSize() {
|
||
let ret = 0;
|
||
for (const secondMap of this._firstMap.values())
|
||
ret += secondMap.size;
|
||
return ret
|
||
}
|
||
*values() {
|
||
for (const secondMap of this._firstMap.values())
|
||
yield*secondMap.values()
|
||
}
|
||
*keyPairs() {
|
||
for (const [x,secondMap] of this._firstMap.entries())
|
||
for (const y of secondMap.keys())
|
||
yield[x, y]
|
||
}
|
||
*entries() {
|
||
for (const [x,secondMap] of this._firstMap.entries())
|
||
for (const [y,value] of secondMap.entries())
|
||
yield[x, y, value]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.ArraySet = class ArraySet extends C3.DefendedBase {
|
||
constructor() {
|
||
super();
|
||
this._set = new Set;
|
||
this._arr = [];
|
||
this._needToRebuildArray = false
|
||
}
|
||
Release() {
|
||
this.Clear()
|
||
}
|
||
Clear() {
|
||
this._set.clear();
|
||
C3.clearArray(this._arr);
|
||
this._needToRebuildArray = false
|
||
}
|
||
Add(v) {
|
||
if (this._set.has(v))
|
||
return;
|
||
this._set.add(v);
|
||
if (!this._needToRebuildArray)
|
||
this._arr.push(v)
|
||
}
|
||
Has(v) {
|
||
return this._set.has(v)
|
||
}
|
||
Delete(v) {
|
||
if (this._set.delete(v))
|
||
this._needToRebuildArray = true
|
||
}
|
||
GetSize() {
|
||
return this._set.size
|
||
}
|
||
IsEmpty() {
|
||
return this._set.size === 0
|
||
}
|
||
GetArray() {
|
||
if (this._needToRebuildArray) {
|
||
this._RebuildArray();
|
||
this._needToRebuildArray = false
|
||
}
|
||
return this._arr
|
||
}
|
||
_RebuildArray() {
|
||
const arr = this._arr;
|
||
C3.clearArray(arr);
|
||
for (const v of this._set)
|
||
arr.push(v)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const EASE_MAP = new Map;
|
||
const PREDEFINED_EASE_MAP = new Map;
|
||
const CUSTOM_EASE_EDITOR_MAP = new Map;
|
||
const CUSTOM_EASE_RUNTIME_MAP = new Map;
|
||
const PRIVATE_EASE_MAP = new Map;
|
||
const ALIAS_MAP = new Map;
|
||
ALIAS_MAP.set("linear", "noease");
|
||
ALIAS_MAP.set("default", "noease");
|
||
self.Ease = class Ease {
|
||
constructor() {}
|
||
static InheritEase() {
|
||
return "default"
|
||
}
|
||
static DefaultEase() {
|
||
return "noease"
|
||
}
|
||
static GetEditorEaseNames(project, ...filter) {
|
||
this._CreateEaseMap();
|
||
if (!CUSTOM_EASE_EDITOR_MAP.has(project))
|
||
CUSTOM_EASE_EDITOR_MAP.set(project, new Map);
|
||
const customEaseMap = CUSTOM_EASE_EDITOR_MAP.get(project);
|
||
return [...PREDEFINED_EASE_MAP.keys()].concat([...customEaseMap.keys()]).filter(ease=>!filter.includes(ease))
|
||
}
|
||
static GetRuntimeEaseNames() {
|
||
this._CreateEaseMap();
|
||
return [...PREDEFINED_EASE_MAP.keys()].concat([...CUSTOM_EASE_RUNTIME_MAP.keys()])
|
||
}
|
||
static IsNamePredefined(easeName) {
|
||
this._CreateEaseMap();
|
||
return [...PREDEFINED_EASE_MAP.keys()].includes(easeName)
|
||
}
|
||
static _GetEase(easeName) {
|
||
const realEaseName = ALIAS_MAP.get(easeName);
|
||
if (realEaseName)
|
||
return EASE_MAP.get(realEaseName);
|
||
if (Ease.IsNamePredefined(easeName))
|
||
return EASE_MAP.get(easeName);
|
||
if (PRIVATE_EASE_MAP.has(easeName))
|
||
return PRIVATE_EASE_MAP.get(easeName)
|
||
}
|
||
static GetEditorEase(easeName, project) {
|
||
this._CreateEaseMap();
|
||
const ease = Ease._GetEase(easeName);
|
||
if (ease)
|
||
return ease;
|
||
return CUSTOM_EASE_EDITOR_MAP.get(project).get(easeName)
|
||
}
|
||
static GetRuntimeEase(easeName) {
|
||
this._CreateEaseMap();
|
||
const ease = Ease._GetEase(easeName);
|
||
if (ease)
|
||
return ease;
|
||
return CUSTOM_EASE_RUNTIME_MAP.get(easeName)
|
||
}
|
||
static GetEaseFromIndex(index) {
|
||
this._CreateEaseMap();
|
||
const names = this.GetRuntimeEaseNames();
|
||
return names[index]
|
||
}
|
||
static GetIndexForEase(name, project) {
|
||
this._CreateEaseMap();
|
||
const names = this.GetEditorEaseNames(project);
|
||
return names.indexOf(name)
|
||
}
|
||
static _CreateEaseMap() {
|
||
if (EASE_MAP.size !== 0)
|
||
return;
|
||
this._AddPredifinedEase("default", ()=>{}
|
||
);
|
||
this._AddPredifinedEase("noease", this.NoEase);
|
||
this._AddPredifinedEase("easeinsine", this.EaseInSine);
|
||
this._AddPredifinedEase("easeoutsine", this.EaseOutSine);
|
||
this._AddPredifinedEase("easeinoutsine", this.EaseInOutSine);
|
||
this._AddPredifinedEase("easeinelastic", this.EaseInElastic);
|
||
this._AddPredifinedEase("easeoutelastic", this.EaseOutElastic);
|
||
this._AddPredifinedEase("easeinoutelastic", this.EaseInOutElastic);
|
||
this._AddPredifinedEase("easeinback", this.EaseInBack);
|
||
this._AddPredifinedEase("easeoutback", this.EaseOutBack);
|
||
this._AddPredifinedEase("easeinoutback", this.EaseInOutBack);
|
||
this._AddPredifinedEase("easeinbounce", this.EaseInBounce);
|
||
this._AddPredifinedEase("easeoutbounce", this.EaseOutBounce);
|
||
this._AddPredifinedEase("easeinoutbounce", this.EaseInOutBounce);
|
||
this._AddPredifinedEase("easeincubic", this.EaseInCubic);
|
||
this._AddPredifinedEase("easeoutcubic", this.EaseOutCubic);
|
||
this._AddPredifinedEase("easeinoutcubic", this.EaseInOutCubic);
|
||
this._AddPredifinedEase("easeinquad", this.EaseInQuad);
|
||
this._AddPredifinedEase("easeoutquad", this.EaseOutQuad);
|
||
this._AddPredifinedEase("easeinoutquad", this.EaseInOutQuad);
|
||
this._AddPredifinedEase("easeinquart", this.EaseInQuart);
|
||
this._AddPredifinedEase("easeoutquart", this.EaseOutQuart);
|
||
this._AddPredifinedEase("easeinoutquart", this.EaseInOutQuart);
|
||
this._AddPredifinedEase("easeinquint", this.EaseInQuint);
|
||
this._AddPredifinedEase("easeoutquint", this.EaseOutQuint);
|
||
this._AddPredifinedEase("easeinoutquint", this.EaseInOutQuint);
|
||
this._AddPredifinedEase("easeincirc", this.EaseInCirc);
|
||
this._AddPredifinedEase("easeoutcirc", this.EaseOutCirc);
|
||
this._AddPredifinedEase("easeinoutcirc", this.EaseInOutCirc);
|
||
this._AddPredifinedEase("easeinexpo", this.EaseInExpo);
|
||
this._AddPredifinedEase("easeoutexpo", this.EaseOutExpo);
|
||
this._AddPredifinedEase("easeinoutexpo", this.EaseInOutExpo);
|
||
this._AddPrivateCustomEase("cubicbezier", this.EaseCubicBezier);
|
||
this._AddPrivateCustomEase("spline", this.EaseSpline)
|
||
}
|
||
static _AddPredifinedEase(name, func) {
|
||
Ease._AddEase(name, func, "predefined")
|
||
}
|
||
static _AddPrivateCustomEase(name, func) {
|
||
Ease._AddEase(name, func, "private")
|
||
}
|
||
static AddCustomEase(name, func, project) {
|
||
this._CreateEaseMap();
|
||
Ease._AddEase(name, func, "custom", project)
|
||
}
|
||
static RemoveCustomEase(name, project) {
|
||
if (this.IsNamePredefined(name))
|
||
return;
|
||
if ([...PRIVATE_EASE_MAP.keys()].includes(name))
|
||
return;
|
||
const customEaseMap = CUSTOM_EASE_EDITOR_MAP.get(project);
|
||
if (customEaseMap)
|
||
customEaseMap.delete(name)
|
||
}
|
||
static _AddEase(name, func, mode, project) {
|
||
switch (mode) {
|
||
case "predefined":
|
||
EASE_MAP.set(name, func);
|
||
PREDEFINED_EASE_MAP.set(name, func);
|
||
break;
|
||
case "custom":
|
||
if (project) {
|
||
if (!CUSTOM_EASE_EDITOR_MAP.has(project))
|
||
CUSTOM_EASE_EDITOR_MAP.set(project, new Map);
|
||
const customEaseMap = CUSTOM_EASE_EDITOR_MAP.get(project);
|
||
customEaseMap.set(name, func)
|
||
} else
|
||
CUSTOM_EASE_RUNTIME_MAP.set(name, func);
|
||
break;
|
||
case "private":
|
||
EASE_MAP.set(name, func);
|
||
PRIVATE_EASE_MAP.set(name, func);
|
||
break;
|
||
default:
|
||
throw new Error("unexpected ease mode");
|
||
}
|
||
}
|
||
static NoEase(t, b, c, d) {
|
||
return c * t / d + b
|
||
}
|
||
static EaseInQuad(t, b, c, d) {
|
||
return c * (t /= d) * t + b
|
||
}
|
||
static EaseOutQuad(t, b, c, d) {
|
||
return -c * (t /= d) * (t - 2) + b
|
||
}
|
||
static EaseInOutQuad(t, b, c, d) {
|
||
if ((t /= d / 2) < 1)
|
||
return c / 2 * t * t + b;
|
||
return -c / 2 * (--t * (t - 2) - 1) + b
|
||
}
|
||
static EaseInCubic(t, b, c, d) {
|
||
return c * (t /= d) * t * t + b
|
||
}
|
||
static EaseOutCubic(t, b, c, d) {
|
||
return c * ((t = t / d - 1) * t * t + 1) + b
|
||
}
|
||
static EaseInOutCubic(t, b, c, d) {
|
||
if ((t /= d / 2) < 1)
|
||
return c / 2 * t * t * t + b;
|
||
return c / 2 * ((t -= 2) * t * t + 2) + b
|
||
}
|
||
static EaseInQuart(t, b, c, d) {
|
||
return c * (t /= d) * t * t * t + b
|
||
}
|
||
static EaseOutQuart(t, b, c, d) {
|
||
return -c * ((t = t / d - 1) * t * t * t - 1) + b
|
||
}
|
||
static EaseInOutQuart(t, b, c, d) {
|
||
if ((t /= d / 2) < 1)
|
||
return c / 2 * t * t * t * t + b;
|
||
return -c / 2 * ((t -= 2) * t * t * t - 2) + b
|
||
}
|
||
static EaseInQuint(t, b, c, d) {
|
||
return c * (t /= d) * t * t * t * t + b
|
||
}
|
||
static EaseOutQuint(t, b, c, d) {
|
||
return c * ((t = t / d - 1) * t * t * t * t + 1) + b
|
||
}
|
||
static EaseInOutQuint(t, b, c, d) {
|
||
if ((t /= d / 2) < 1)
|
||
return c / 2 * t * t * t * t * t + b;
|
||
return c / 2 * ((t -= 2) * t * t * t * t + 2) + b
|
||
}
|
||
static EaseInSine(t, b, c, d) {
|
||
return -c * Math.cos(t / d * (Math.PI / 2)) + c + b
|
||
}
|
||
static EaseOutSine(t, b, c, d) {
|
||
return c * Math.sin(t / d * (Math.PI / 2)) + b
|
||
}
|
||
static EaseInOutSine(t, b, c, d) {
|
||
return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b
|
||
}
|
||
static EaseInExpo(t, b, c, d) {
|
||
return t === 0 ? b : c * Math.pow(2, 10 * (t / d - 1)) + b
|
||
}
|
||
static EaseOutExpo(t, b, c, d) {
|
||
return t === d ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b
|
||
}
|
||
static EaseInOutExpo(t, b, c, d) {
|
||
if (t === 0)
|
||
return b;
|
||
if (t === d)
|
||
return b + c;
|
||
if ((t /= d / 2) < 1)
|
||
return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
|
||
return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b
|
||
}
|
||
static EaseInCirc(t, b, c, d) {
|
||
return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b
|
||
}
|
||
static EaseOutCirc(t, b, c, d) {
|
||
return c * Math.sqrt(1 - (t = t / d - 1) * t) + b
|
||
}
|
||
static EaseInOutCirc(t, b, c, d) {
|
||
if ((t /= d / 2) < 1)
|
||
return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;
|
||
return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b
|
||
}
|
||
static EaseInElastic(t, b, c, d) {
|
||
let s = 1.70158;
|
||
let p = 0;
|
||
let a = c;
|
||
if (t === 0)
|
||
return b;
|
||
if ((t /= d) === 1)
|
||
return b + c;
|
||
if (!p)
|
||
p = d * .3;
|
||
if (a < Math.abs(c)) {
|
||
a = c;
|
||
s = p / 4
|
||
} else
|
||
s = p / (2 * Math.PI) * Math.asin(c / a);
|
||
return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b
|
||
}
|
||
static EaseOutElastic(t, b, c, d) {
|
||
let s = 1.70158;
|
||
let p = 0;
|
||
let a = c;
|
||
if (t === 0)
|
||
return b;
|
||
if ((t /= d) === 1)
|
||
return b + c;
|
||
if (!p)
|
||
p = d * .3;
|
||
if (a < Math.abs(c)) {
|
||
a = c;
|
||
s = p / 4
|
||
} else
|
||
s = p / (2 * Math.PI) * Math.asin(c / a);
|
||
return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b
|
||
}
|
||
static EaseInOutElastic(t, b, c, d) {
|
||
let s = 1.70158;
|
||
let p = 0;
|
||
let a = c;
|
||
if (t === 0)
|
||
return b;
|
||
if ((t /= d / 2) === 2)
|
||
return b + c;
|
||
if (!p)
|
||
p = d * (.3 * 1.5);
|
||
if (a < Math.abs(c)) {
|
||
a = c;
|
||
s = p / 4
|
||
} else
|
||
s = p / (2 * Math.PI) * Math.asin(c / a);
|
||
if (t < 1)
|
||
return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
|
||
return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b
|
||
}
|
||
static EaseInBack(t, b, c, d, s) {
|
||
if (s === undefined)
|
||
s = 1.70158;
|
||
return c * (t /= d) * t * ((s + 1) * t - s) + b
|
||
}
|
||
static EaseOutBack(t, b, c, d, s) {
|
||
if (s === undefined)
|
||
s = 1.70158;
|
||
return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b
|
||
}
|
||
static EaseInOutBack(t, b, c, d, s) {
|
||
if (s === undefined)
|
||
s = 1.70158;
|
||
if ((t /= d / 2) < 1)
|
||
return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;
|
||
return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b
|
||
}
|
||
static EaseInBounce(t, b, c, d) {
|
||
return c - Ease.EaseOutBounce(d - t, 0, c, d) + b
|
||
}
|
||
static EaseOutBounce(t, b, c, d) {
|
||
if ((t /= d) < 1 / 2.75)
|
||
return c * (7.5625 * t * t) + b;
|
||
else if (t < 2 / 2.75)
|
||
return c * (7.5625 * (t -= 1.5 / 2.75) * t + .75) + b;
|
||
else if (t < 2.5 / 2.75)
|
||
return c * (7.5625 * (t -= 2.25 / 2.75) * t + .9375) + b;
|
||
else
|
||
return c * (7.5625 * (t -= 2.625 / 2.75) * t + .984375) + b
|
||
}
|
||
static EaseInOutBounce(t, b, c, d) {
|
||
if (t < d / 2)
|
||
return Ease.EaseInBounce(t * 2, 0, c, d) * .5 + b;
|
||
return Ease.EaseOutBounce(t * 2 - d, 0, c, d) * .5 + c * .5 + b
|
||
}
|
||
static EaseCubicBezier(t, p0, p1, p2, p3) {
|
||
const _0 = p0;
|
||
const _1 = 3 * t * (p1 - p0);
|
||
const _2 = 3 * t ** 2 * (p0 + p2 - 2 * p1);
|
||
const _3 = t ** 3 * (p3 - p0 + 3 * p1 - 3 * p2);
|
||
return _0 + _1 + _2 + _3
|
||
}
|
||
static EaseSpline(t, sx, sy, x1, y1, x2, y2, ex, ey, samples) {
|
||
if (x1 === y1 && x2 === y2)
|
||
return t;
|
||
const tx = get_t_for_x(t, sx, x1, x2, ex, samples);
|
||
const va = a(sy, y1, y2, ey);
|
||
const vb = b(sy, y1, y2, ey);
|
||
const vc = c(sy, y1, y2, ey);
|
||
return calc_bezier(tx, va, vb, vc)
|
||
}
|
||
static GetBezierSamples(startx, a1x, a2x, endx) {
|
||
const ret = [];
|
||
const va = a(startx, a1x, a2x, endx);
|
||
const vb = b(startx, a1x, a2x, endx);
|
||
const vc = c(startx, a1x, a2x, endx);
|
||
for (let i = 0; i < SAMPLE_COUNT; ++i) {
|
||
const sample = calc_bezier(i * SAMPLE_STEP, va, vb, vc);
|
||
ret.push(sample)
|
||
}
|
||
return ret
|
||
}
|
||
}
|
||
;
|
||
const SAMPLE_COUNT = 11;
|
||
const SAMPLE_STEP = 1 / (SAMPLE_COUNT - 1);
|
||
const NEWTON_RAPHSON_ITERATIONS = 4;
|
||
const NEWTON_RAPHSON_MIN_SLOPE = .02;
|
||
const SUBDIVISION_PRECISION = 1E-7;
|
||
const SUBDIVISION_MAX_ITERATIONS = 10;
|
||
const a = (p0,p1,p2,p3)=>{
|
||
return p3 - 3 * p2 + 3 * p1 - p0
|
||
}
|
||
;
|
||
const b = (p0,p1,p2,p3)=>{
|
||
return 3 * p2 - 6 * p1 + 3 * p0
|
||
}
|
||
;
|
||
const c = (p0,p1,p2,p3)=>{
|
||
return 3 * (p1 - p0)
|
||
}
|
||
;
|
||
const calc_bezier = (aT,a,b,c)=>{
|
||
return ((a * aT + b) * aT + c) * aT
|
||
}
|
||
;
|
||
const get_slope = (aT,a,b,c)=>{
|
||
return 3 * a * aT * aT + 2 * b * aT + c
|
||
}
|
||
;
|
||
const get_t_for_x = (aX,p0,p1,p2,p3,samples)=>{
|
||
if (aX == 1)
|
||
return 1;
|
||
let intervalStart = 0;
|
||
let currentSampleIndex = 1;
|
||
let currentSampleValue = samples[currentSampleIndex];
|
||
let lastSampleIndex = SAMPLE_COUNT - 1;
|
||
let lastSampleValue = samples[SAMPLE_COUNT - 1];
|
||
while (currentSampleIndex != lastSampleIndex && currentSampleValue <= aX) {
|
||
currentSampleIndex++;
|
||
currentSampleValue = samples[currentSampleIndex];
|
||
intervalStart += SAMPLE_STEP
|
||
}
|
||
currentSampleIndex--;
|
||
currentSampleValue = samples[currentSampleIndex];
|
||
const dist = (aX - currentSampleValue) / (samples[currentSampleIndex + 1] - currentSampleValue);
|
||
let guess = intervalStart + dist * SAMPLE_STEP;
|
||
const va = a(p0, p1, p2, p3);
|
||
const vb = b(p0, p1, p2, p3);
|
||
const vc = c(p0, p1, p2, p3);
|
||
const initSlope = get_slope(guess, va, vb, vc);
|
||
if (initSlope === 0)
|
||
return guess;
|
||
else if (initSlope >= NEWTON_RAPHSON_MIN_SLOPE) {
|
||
for (let i = 0; i < NEWTON_RAPHSON_ITERATIONS; ++i) {
|
||
const x = calc_bezier(guess, va, vb, vc) - aX;
|
||
const slope = get_slope(guess, va, vb, vc);
|
||
guess -= x / slope
|
||
}
|
||
return guess
|
||
} else {
|
||
let aA = intervalStart;
|
||
let aB = intervalStart + SAMPLE_STEP;
|
||
let i = 0;
|
||
let precissionLimit;
|
||
let maxIterations;
|
||
do {
|
||
guess = aA + (aB - aA) / 2;
|
||
let x = calc_bezier(guess, va, vb, vc) - aX;
|
||
if (x > 0)
|
||
aB = guess;
|
||
else
|
||
aA = guess;
|
||
precissionLimit = Math.abs(x) > SUBDIVISION_PRECISION;
|
||
maxIterations = ++i < SUBDIVISION_MAX_ITERATIONS
|
||
} while (precissionLimit && maxIterations);
|
||
return guess
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
function RequireStringOrNumber(value) {
|
||
if (!C3.IsString(value))
|
||
;
|
||
}
|
||
C3.ProbabilityTable = class ProbabilityTable {
|
||
constructor() {
|
||
this._items = [];
|
||
this._totalWeight = 0
|
||
}
|
||
Release() {
|
||
this.Clear();
|
||
this._items = null
|
||
}
|
||
Clear() {
|
||
C3.clear2DArray(this._items);
|
||
this._totalWeight = 0
|
||
}
|
||
GetTotalWeight() {
|
||
return this._totalWeight
|
||
}
|
||
Sample(t=Math.random() * this.GetTotalWeight()) {
|
||
let sumWeight = 0;
|
||
for (const [weight,value] of this._items) {
|
||
sumWeight += weight;
|
||
if (t < sumWeight)
|
||
return value
|
||
}
|
||
return 0
|
||
}
|
||
AddItem(weight, value) {
|
||
RequireStringOrNumber(value);
|
||
this._totalWeight += weight;
|
||
this._items.push([weight, value])
|
||
}
|
||
RemoveItem(weight, value) {
|
||
RequireStringOrNumber(value);
|
||
const ignoreWeight = weight === 0;
|
||
for (let i = 0; i < this._items.length; i++) {
|
||
const item = this._items[i];
|
||
const doesWeightMatch = ignoreWeight || item[0] === weight;
|
||
const doesValueMatch = item[1] === value;
|
||
if (doesWeightMatch && doesValueMatch) {
|
||
this._items.splice(i, 1);
|
||
this._totalWeight -= item[0];
|
||
break
|
||
}
|
||
}
|
||
}
|
||
asJSON() {
|
||
return JSON.stringify(this._items)
|
||
}
|
||
static fromJSON(str) {
|
||
const table = new C3.ProbabilityTable;
|
||
const items = JSON.parse(str);
|
||
for (const item of items) {
|
||
const weight = item[0];
|
||
const value = item[1];
|
||
table.AddItem(weight, value)
|
||
}
|
||
return table
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Event = class Event {
|
||
constructor(type, cancelable) {
|
||
this.type = type;
|
||
this.cancelable = !!cancelable;
|
||
this.defaultPrevented = false;
|
||
this.propagationStopped = false;
|
||
this.isAsync = false
|
||
}
|
||
preventDefault() {
|
||
if (!this.cancelable)
|
||
throw new Error(`event '${this.type}' is not cancelable`);
|
||
this.defaultPrevented = true
|
||
}
|
||
stopPropagation() {
|
||
if (!this.cancelable)
|
||
throw new Error(`event '${this.type}' cannot be stopped`);
|
||
if (this.isAsync)
|
||
throw new Error(`cannot stop async event '${this.type}' propagation`);
|
||
this.propagationStopped = true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
C3.Event.Handler = class EventHandler extends C3.DefendedBase {
|
||
constructor(type) {
|
||
super();
|
||
this._type = type;
|
||
this._captureListeners = [];
|
||
this._captureListenersSet = new Set;
|
||
this._listeners = [];
|
||
this._listenersSet = new Set;
|
||
this._fireDepth = 0;
|
||
this._queueAddListeners = [];
|
||
this._queueRemoveCaptureListeners = [];
|
||
this._queueRemoveListeners = []
|
||
}
|
||
Release() {
|
||
if (this._fireDepth > 0)
|
||
return;
|
||
C3.clearArray(this._captureListeners);
|
||
this._captureListenersSet.clear();
|
||
C3.clearArray(this._listeners);
|
||
this._listenersSet.clear();
|
||
C3.clearArray(this._queueAddListeners);
|
||
C3.clearArray(this._queueRemoveCaptureListeners);
|
||
C3.clearArray(this._queueRemoveListeners);
|
||
C3.Release(this)
|
||
}
|
||
_AddListener(func, capture) {
|
||
if (this._IsFiring()) {
|
||
this._queueAddListeners.push([func, capture]);
|
||
return
|
||
}
|
||
if (capture) {
|
||
if (this._captureListenersSet.has(func))
|
||
return;
|
||
this._captureListeners.push(func);
|
||
this._captureListenersSet.add(func)
|
||
} else {
|
||
if (this._listenersSet.has(func))
|
||
return;
|
||
this._listeners.push(func);
|
||
this._listenersSet.add(func)
|
||
}
|
||
}
|
||
_RemoveListener(func, capture) {
|
||
if (this._IsFiring()) {
|
||
if (capture)
|
||
this._queueRemoveCaptureListeners.push(func);
|
||
else
|
||
this._queueRemoveListeners.push(func);
|
||
return
|
||
}
|
||
if (capture) {
|
||
if (this._captureListenersSet.has(func)) {
|
||
this._captureListenersSet.delete(func);
|
||
C3.arrayFindRemove(this._captureListeners, func)
|
||
}
|
||
} else if (this._listenersSet.has(func)) {
|
||
this._listenersSet.delete(func);
|
||
C3.arrayFindRemove(this._listeners, func)
|
||
}
|
||
}
|
||
_IsEmpty() {
|
||
return !this._captureListeners.length && !this._listeners.length
|
||
}
|
||
_IsFiring() {
|
||
return this._fireDepth > 0
|
||
}
|
||
_ProcessQueuedListeners() {
|
||
for (let q of this._queueAddListeners)
|
||
this._AddListener(...q);
|
||
C3.clearArray(this._queueAddListeners);
|
||
for (const func of this._queueRemoveListeners)
|
||
this._listenersSet.delete(func);
|
||
for (const func of this._queueRemoveCaptureListeners)
|
||
this._captureListenersSet.delete(func);
|
||
const removeListenersSet = new Set(this._queueRemoveListeners);
|
||
const removeCaptureListenersSet = new Set(this._queueRemoveCaptureListeners);
|
||
C3.arrayRemoveAllInSet(this._listeners, removeListenersSet);
|
||
C3.arrayRemoveAllInSet(this._captureListeners, removeCaptureListenersSet);
|
||
C3.clearArray(this._queueRemoveCaptureListeners);
|
||
C3.clearArray(this._queueRemoveListeners)
|
||
}
|
||
_FireCancellable(event) {
|
||
this._IncreaseFireDepth();
|
||
let isStopped = false;
|
||
for (let i = 0, len = this._captureListeners.length; i < len; ++i) {
|
||
this._captureListeners[i](event);
|
||
if (event.propagationStopped) {
|
||
isStopped = true;
|
||
break
|
||
}
|
||
}
|
||
if (!isStopped)
|
||
for (let i = 0, len = this._listeners.length; i < len; ++i) {
|
||
this._listeners[i](event);
|
||
if (event.propagationStopped)
|
||
break
|
||
}
|
||
this._DecreaseFireDepth();
|
||
return !event.defaultPrevented
|
||
}
|
||
_FireNonCancellable(event) {
|
||
this._IncreaseFireDepth();
|
||
for (let i = 0, len = this._captureListeners.length; i < len; ++i)
|
||
this._captureListeners[i](event);
|
||
for (let i = 0, len = this._listeners.length; i < len; ++i)
|
||
this._listeners[i](event);
|
||
this._DecreaseFireDepth();
|
||
return true
|
||
}
|
||
_IncreaseFireDepth() {
|
||
this._fireDepth++
|
||
}
|
||
_DecreaseFireDepth() {
|
||
this._fireDepth--;
|
||
if (this._fireDepth === 0 && (this._queueAddListeners.length || this._queueRemoveCaptureListeners.length || this._queueRemoveListeners.length))
|
||
this._ProcessQueuedListeners()
|
||
}
|
||
SetDelayRemoveEventsEnabled(e) {
|
||
if (e)
|
||
this._IncreaseFireDepth();
|
||
else
|
||
this._DecreaseFireDepth()
|
||
}
|
||
_FireAsync(event) {
|
||
let callbackPromises = [];
|
||
for (let i = 0, len = this._captureListeners.length; i < len; ++i) {
|
||
let func = this._captureListeners[i];
|
||
callbackPromises.push(C3.Asyncify(()=>func(event)))
|
||
}
|
||
for (let i = 0, len = this._listeners.length; i < len; ++i) {
|
||
let func = this._listeners[i];
|
||
callbackPromises.push(C3.Asyncify(()=>func(event)))
|
||
}
|
||
return Promise.all(callbackPromises).then(()=>!event.defaultPrevented)
|
||
}
|
||
_FireAndWait_AsyncOptional(event) {
|
||
const results = [];
|
||
this._IncreaseFireDepth();
|
||
for (let i = 0, len = this._captureListeners.length; i < len; ++i) {
|
||
const ret = this._captureListeners[i](event);
|
||
if (ret instanceof Promise)
|
||
results.push(ret)
|
||
}
|
||
for (let i = 0, len = this._listeners.length; i < len; ++i) {
|
||
const ret = this._listeners[i](event);
|
||
if (ret instanceof Promise)
|
||
results.push(ret)
|
||
}
|
||
this._DecreaseFireDepth();
|
||
if (results.length)
|
||
return Promise.all(results).then(()=>!event.defaultPrevented);
|
||
else
|
||
return !event.defaultPrevented
|
||
}
|
||
async _FireAndWaitAsync(event) {
|
||
return await this._FireAndWait_AsyncOptional(event)
|
||
}
|
||
async _FireAndWaitAsyncSequential(event) {
|
||
this._IncreaseFireDepth();
|
||
for (let i = 0, len = this._captureListeners.length; i < len; ++i) {
|
||
const ret = this._captureListeners[i](event);
|
||
if (ret instanceof Promise)
|
||
await ret
|
||
}
|
||
for (let i = 0, len = this._listeners.length; i < len; ++i) {
|
||
const ret = this._listeners[i](event);
|
||
if (ret instanceof Promise)
|
||
await ret
|
||
}
|
||
this._DecreaseFireDepth();
|
||
return !event.defaultPrevented
|
||
}
|
||
*_FireAsGenerator(event) {
|
||
this._IncreaseFireDepth();
|
||
for (let i = 0, len = this._captureListeners.length; i < len; ++i) {
|
||
const ret = this._captureListeners[i](event);
|
||
if (C3.IsIterator(ret))
|
||
yield*ret
|
||
}
|
||
for (let i = 0, len = this._listeners.length; i < len; ++i) {
|
||
const ret = this._listeners[i](event);
|
||
if (C3.IsIterator(ret))
|
||
yield*ret
|
||
}
|
||
this._DecreaseFireDepth()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Event.Dispatcher = class EventDispatcher extends C3.DefendedBase {
|
||
constructor() {
|
||
super();
|
||
this._eventHandlers = new Map;
|
||
this._dispatcherWasReleased = false
|
||
}
|
||
Release() {
|
||
if (this._dispatcherWasReleased)
|
||
throw new Error("already released");
|
||
this.ClearEvents();
|
||
this._dispatcherWasReleased = true;
|
||
C3.Release(this)
|
||
}
|
||
WasReleased() {
|
||
return this._dispatcherWasReleased
|
||
}
|
||
ClearEvents() {
|
||
for (let handler of this._eventHandlers.values())
|
||
handler.Release();
|
||
this._eventHandlers.clear()
|
||
}
|
||
_GetHandlerByType(type, create_if_missing) {
|
||
let handler = this._eventHandlers.get(type);
|
||
if (handler)
|
||
return handler;
|
||
if (create_if_missing) {
|
||
handler = C3.New(C3.Event.Handler, type);
|
||
this._eventHandlers.set(type, handler);
|
||
return handler
|
||
}
|
||
return null
|
||
}
|
||
HasAnyHandlerFor(type) {
|
||
return this._eventHandlers.has(type)
|
||
}
|
||
addEventListener(type, func, capture) {
|
||
let handler = this._GetHandlerByType(type, true);
|
||
handler._AddListener(func, !!capture)
|
||
}
|
||
removeEventListener(type, func, capture) {
|
||
let handler = this._GetHandlerByType(type, false);
|
||
if (!handler)
|
||
return;
|
||
handler._RemoveListener(func, !!capture);
|
||
if (handler._IsEmpty())
|
||
this._eventHandlers.delete(type)
|
||
}
|
||
dispatchEvent(event) {
|
||
const handler = this._GetHandlerByType(event.type, false);
|
||
if (!handler)
|
||
return true;
|
||
if (event.cancelable)
|
||
return handler._FireCancellable(event);
|
||
else
|
||
return handler._FireNonCancellable(event)
|
||
}
|
||
dispatchEventAsync(event) {
|
||
const handler = this._GetHandlerByType(event.type, false);
|
||
if (!handler)
|
||
return Promise.resolve(true);
|
||
event.isAsync = true;
|
||
return handler._FireAsync(event)
|
||
}
|
||
async dispatchEventAndClearAsync(event) {
|
||
const handler = this._GetHandlerByType(event.type, false);
|
||
if (!handler)
|
||
return true;
|
||
this._eventHandlers.delete(event.type);
|
||
event.isAsync = true;
|
||
const ret = await handler._FireAsync(event);
|
||
handler.Release();
|
||
return ret
|
||
}
|
||
async dispatchEventAndWaitAsync(event) {
|
||
const handler = this._GetHandlerByType(event.type, false);
|
||
if (!handler)
|
||
return true;
|
||
return await handler._FireAndWaitAsync(event)
|
||
}
|
||
dispatchEventAndWait_AsyncOptional(event) {
|
||
const handler = this._GetHandlerByType(event.type, false);
|
||
if (!handler)
|
||
return true;
|
||
return handler._FireAndWait_AsyncOptional(event)
|
||
}
|
||
async dispatchEventAndWaitAsyncSequential(event) {
|
||
const handler = this._GetHandlerByType(event.type, false);
|
||
if (!handler)
|
||
return true;
|
||
return await handler._FireAndWaitAsyncSequential(event)
|
||
}
|
||
dispatchGeneratorEvent(event) {
|
||
const handler = this._GetHandlerByType(event.type, false);
|
||
if (!handler)
|
||
return null;
|
||
if (event.cancelable)
|
||
throw new Error("not supported");
|
||
else
|
||
return handler._FireAsGenerator(event)
|
||
}
|
||
SetDelayRemoveEventsEnabled(e) {
|
||
for (const handler of this._eventHandlers.values())
|
||
handler.SetDelayRemoveEventsEnabled(e)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const SETTIMEOUT_WORK_DURATION = 12;
|
||
const SETTIMEOUT_INTERVAL = 16;
|
||
const IDLECALLBACK_TIMEOUT = 35;
|
||
const SUPPORTS_RIC = typeof requestIdleCallback !== "undefined";
|
||
let workQueue = [];
|
||
let callbackId = -1;
|
||
let highThroughputMode = 0;
|
||
function SetNewCallback(timerTimeout) {
|
||
if (SUPPORTS_RIC && highThroughputMode === 0)
|
||
callbackId = requestIdleCallback(DoAsyncifiedWork, {
|
||
timeout: IDLECALLBACK_TIMEOUT
|
||
});
|
||
else
|
||
callbackId = setTimeout(DoAsyncifiedWork, highThroughputMode > 0 ? 1 : timerTimeout)
|
||
}
|
||
function DoAsyncifiedWork(deadline) {
|
||
callbackId = -1;
|
||
if (!workQueue.length)
|
||
return;
|
||
let startTime = performance.now();
|
||
let curTime = startTime;
|
||
let jobCount = 0;
|
||
let estimatedNextJobDuration = 0;
|
||
do {
|
||
DoNextAsyncifiedJob(workQueue.shift());
|
||
curTime = performance.now();
|
||
++jobCount;
|
||
estimatedNextJobDuration = (curTime - startTime) / jobCount * 1.1
|
||
} while (workQueue.length && (SUPPORTS_RIC && highThroughputMode === 0 && typeof deadline !== "undefined" ? estimatedNextJobDuration < deadline["timeRemaining"]() : curTime - startTime + estimatedNextJobDuration < SETTIMEOUT_WORK_DURATION));
|
||
if (callbackId === -1 && workQueue.length) {
|
||
let workDuration = curTime - startTime;
|
||
let timeout = Math.max(SETTIMEOUT_INTERVAL - workDuration, 4);
|
||
SetNewCallback(timeout)
|
||
}
|
||
}
|
||
function DoNextAsyncifiedJob(w) {
|
||
let ret;
|
||
try {
|
||
ret = w.func()
|
||
} catch (e) {
|
||
w.reject(e);
|
||
return
|
||
}
|
||
w.resolve(ret)
|
||
}
|
||
let asyncifyDisabled = C3.QueryString.Has("disable-asyncify");
|
||
if (asyncifyDisabled)
|
||
console.warn("[Asyncify] Asyncify has been disabled due to disable-asyncify in the query string. Some work will now be done synchronously.");
|
||
C3.Asyncify = function Asyncify(func) {
|
||
let stack = null;
|
||
if (C3.isDebug)
|
||
stack = C3.GetCallStack();
|
||
return new Promise((resolve,reject)=>{
|
||
workQueue.push({
|
||
func: func,
|
||
resolve: resolve,
|
||
reject: reject,
|
||
stack: stack
|
||
});
|
||
if (asyncifyDisabled) {
|
||
DoNextAsyncifiedJob(workQueue.pop());
|
||
return
|
||
}
|
||
if (callbackId === -1)
|
||
SetNewCallback(SETTIMEOUT_INTERVAL)
|
||
}
|
||
)
|
||
}
|
||
;
|
||
C3.Asyncify.SetHighThroughputMode = function SetHighThroughputMode(m) {
|
||
if (m)
|
||
++highThroughputMode;
|
||
else {
|
||
--highThroughputMode;
|
||
if (highThroughputMode < 0)
|
||
throw new Error("already turned off high throughput mode");
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const IDLE_CHECK_MIN_INTERVAL = 1E3;
|
||
const IDLE_CHECK_TIMER_OVERSHOOT = 100;
|
||
let cachedNowTime = -1;
|
||
function ClearTimeCache() {
|
||
cachedNowTime = -1
|
||
}
|
||
C3.FastGetDateNow = function FastGetDateNow() {
|
||
if (cachedNowTime === -1) {
|
||
cachedNowTime = Date.now();
|
||
self.setTimeout(ClearTimeCache, 16)
|
||
}
|
||
return cachedNowTime
|
||
}
|
||
;
|
||
let timerId = -1;
|
||
let nextDeadline = -1;
|
||
let activeIdleTimeouts = new Set;
|
||
function CheckActiveIdleTimeouts() {
|
||
timerId = -1;
|
||
nextDeadline = -1;
|
||
let nowTime = Date.now();
|
||
for (let i of activeIdleTimeouts)
|
||
if (i._CheckTimeout(nowTime)) {
|
||
let deadline = i._GetDeadline();
|
||
if (nextDeadline === -1 || deadline < nextDeadline)
|
||
nextDeadline = deadline
|
||
} else
|
||
activeIdleTimeouts.delete(i);
|
||
if (nextDeadline !== -1) {
|
||
let duration = Math.max(nextDeadline - nowTime + IDLE_CHECK_TIMER_OVERSHOOT, IDLE_CHECK_MIN_INTERVAL);
|
||
timerId = self.setTimeout(CheckActiveIdleTimeouts, duration)
|
||
}
|
||
}
|
||
C3.IdleTimeout = class IdleTimeout {
|
||
constructor(callback, timeoutInSeconds) {
|
||
this._callback = callback;
|
||
this._timeout = timeoutInSeconds * 1E3;
|
||
this._deadline = 0;
|
||
this._isActive = false
|
||
}
|
||
Reset() {
|
||
let nowTime = C3.FastGetDateNow();
|
||
this._deadline = nowTime + this._timeout;
|
||
if (!this._isActive) {
|
||
activeIdleTimeouts.add(this);
|
||
this._isActive = true
|
||
}
|
||
if (timerId === -1) {
|
||
nextDeadline = this._deadline;
|
||
timerId = self.setTimeout(CheckActiveIdleTimeouts, this._timeout + IDLE_CHECK_TIMER_OVERSHOOT)
|
||
} else if (this._deadline < nextDeadline && nextDeadline > nowTime + IDLE_CHECK_MIN_INTERVAL) {
|
||
self.clearTimeout(timerId);
|
||
nextDeadline = this._deadline;
|
||
timerId = self.setTimeout(CheckActiveIdleTimeouts, this._timeout + IDLE_CHECK_TIMER_OVERSHOOT)
|
||
}
|
||
}
|
||
_CheckTimeout(nowTime) {
|
||
if (nowTime >= this._deadline) {
|
||
if (this._callback()) {
|
||
this._deadline = nowTime + this._timeout;
|
||
return true
|
||
}
|
||
this._isActive = false;
|
||
return false
|
||
}
|
||
return true
|
||
}
|
||
_GetDeadline() {
|
||
return this._deadline
|
||
}
|
||
Cancel() {
|
||
if (this._isActive) {
|
||
activeIdleTimeouts.delete(this);
|
||
this._isActive = false;
|
||
if (activeIdleTimeouts.size === 0 && timerId !== -1) {
|
||
self.clearTimeout(timerId);
|
||
timerId = -1;
|
||
nextDeadline = -1
|
||
}
|
||
}
|
||
}
|
||
Release() {
|
||
this.Cancel();
|
||
this._callback = null
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Disposable = class Disposable {
|
||
constructor(disposeAction) {
|
||
this._disposed = false;
|
||
this._disposeAction = disposeAction
|
||
}
|
||
Dispose() {
|
||
if (this._disposed)
|
||
return;
|
||
this._disposed = true;
|
||
if (this._disposeAction) {
|
||
this._disposeAction();
|
||
this._disposeAction = null
|
||
}
|
||
}
|
||
IsDisposed() {
|
||
return this._disposed
|
||
}
|
||
Release() {
|
||
this.Dispose()
|
||
}
|
||
static Release(instance) {
|
||
return new Disposable(()=>instance.Release())
|
||
}
|
||
static From(eventDispatcher, eventNames, eventHandler, opts, scope) {
|
||
if (typeof opts === "undefined" || opts === null)
|
||
opts = false;
|
||
else if (typeof opts !== "boolean" && typeof opts !== "object")
|
||
throw new TypeError("invalid event listener options");
|
||
if (scope)
|
||
eventHandler = eventHandler.bind(scope);
|
||
if (eventNames.includes(" ")) {
|
||
eventNames = eventNames.split(" ");
|
||
const disposable = new C3.CompositeDisposable;
|
||
for (let eventName of eventNames) {
|
||
eventDispatcher.addEventListener(eventName, eventHandler, opts);
|
||
disposable.Add(C3.New(C3.Disposable, ()=>eventDispatcher.removeEventListener(eventName, eventHandler, opts)))
|
||
}
|
||
return disposable
|
||
} else {
|
||
eventDispatcher.addEventListener(eventNames, eventHandler, opts);
|
||
return C3.New(C3.Disposable, ()=>eventDispatcher.removeEventListener(eventNames, eventHandler, opts))
|
||
}
|
||
}
|
||
}
|
||
;
|
||
C3.StubDisposable = class StubDisposable extends C3.Disposable {
|
||
SetAction(disposeAction) {
|
||
this._disposeAction = disposeAction
|
||
}
|
||
}
|
||
;
|
||
C3.CompositeDisposable = class CompositeDisposable extends C3.Disposable {
|
||
constructor(...disposables) {
|
||
super();
|
||
this._disposables = new Set;
|
||
for (let disposable of disposables)
|
||
this.Add(disposable)
|
||
}
|
||
Add(...disposables) {
|
||
if (this._disposed)
|
||
throw new Error("already disposed");
|
||
for (let disposable of disposables)
|
||
this._disposables.add(disposable)
|
||
}
|
||
Remove(disposable) {
|
||
if (this._disposed)
|
||
throw new Error("already disposed");
|
||
this._disposables.delete(disposable)
|
||
}
|
||
RemoveAll() {
|
||
if (this._disposed)
|
||
throw new Error("already disposed");
|
||
if (!this._disposables)
|
||
return;
|
||
for (let disposable of this._disposables)
|
||
disposable.Dispose();
|
||
this._disposables.clear()
|
||
}
|
||
IsDisposed() {
|
||
return this._disposed
|
||
}
|
||
Dispose() {
|
||
if (this._disposed)
|
||
throw new Error("already disposed");
|
||
this._disposed = true;
|
||
for (let disposable of this._disposables)
|
||
disposable.Dispose();
|
||
this._disposables.clear();
|
||
this._disposables = null
|
||
}
|
||
Release() {
|
||
this.Dispose()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.KahanSum = class KahanSum extends C3.DefendedBase {
|
||
constructor() {
|
||
super();
|
||
this._c = 0;
|
||
this._y = 0;
|
||
this._t = 0;
|
||
this._sum = 0
|
||
}
|
||
Add(v) {
|
||
v = +v;
|
||
this._y = v - this._c;
|
||
this._t = this._sum + this._y;
|
||
this._c = this._t - this._sum - this._y;
|
||
this._sum = this._t
|
||
}
|
||
Subtract(v) {
|
||
this._sum -= +v
|
||
}
|
||
Get() {
|
||
return this._sum
|
||
}
|
||
Reset() {
|
||
this._c = 0;
|
||
this._y = 0;
|
||
this._t = 0;
|
||
this._sum = 0
|
||
}
|
||
Set(s) {
|
||
this._c = 0;
|
||
this._y = 0;
|
||
this._t = 0;
|
||
this._sum = +s
|
||
}
|
||
Release() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const js_cols = {};
|
||
const RED = true;
|
||
const BLACK = false;
|
||
js_cols.RBnode = function(tree) {
|
||
this.tree = tree;
|
||
this.right = this.tree.sentinel;
|
||
this.left = this.tree.sentinel;
|
||
this.parent = null;
|
||
this.color = false;
|
||
this.key = null
|
||
}
|
||
;
|
||
js_cols.RedBlackSet = function(compare_func) {
|
||
this.size = 0;
|
||
this.sentinel = new js_cols.RBnode(this);
|
||
this.sentinel.color = BLACK;
|
||
this.root = this.sentinel;
|
||
this.root.parent = this.sentinel;
|
||
this.compare = compare_func || this.default_compare
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.default_compare = function(a, b) {
|
||
if (a < b)
|
||
return -1;
|
||
else if (b < a)
|
||
return 1;
|
||
else
|
||
return 0
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.clone = function() {
|
||
var rv = new js_cols.RedBlackSet(this.compare);
|
||
rv.insertAll(this);
|
||
return rv
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.clear = function() {
|
||
this.size = 0;
|
||
this.sentinel = new js_cols.RBnode(this);
|
||
this.sentinel.color = BLACK;
|
||
this.root = this.sentinel;
|
||
this.root.parent = this.sentinel
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.leftRotate = function(x) {
|
||
var y = x.right;
|
||
x.right = y.left;
|
||
if (y.left != this.sentinel)
|
||
y.left.parent = x;
|
||
y.parent = x.parent;
|
||
if (x.parent == this.sentinel)
|
||
this.root = y;
|
||
else if (x == x.parent.left)
|
||
x.parent.left = y;
|
||
else
|
||
x.parent.right = y;
|
||
y.left = x;
|
||
x.parent = y
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.rightRotate = function(x) {
|
||
var y = x.left;
|
||
x.left = y.right;
|
||
if (y.right != this.sentinel)
|
||
y.right.parent = x;
|
||
y.parent = x.parent;
|
||
if (x.parent == this.sentinel)
|
||
this.root = y;
|
||
else if (x == x.parent.right)
|
||
x.parent.right = y;
|
||
else
|
||
x.parent.left = y;
|
||
y.right = x;
|
||
x.parent = y
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.insert = function(key) {
|
||
if (!this.contains(key)) {
|
||
var z = new js_cols.RBnode(this);
|
||
z.key = key;
|
||
var y = this.sentinel;
|
||
var x = this.root;
|
||
while (x != this.sentinel) {
|
||
y = x;
|
||
if (this.compare(z.key, x.key) < 0)
|
||
x = x.left;
|
||
else
|
||
x = x.right
|
||
}
|
||
z.parent = y;
|
||
if (y == this.sentinel)
|
||
this.root = z;
|
||
else if (this.compare(z.key, y.key) < 0)
|
||
y.left = z;
|
||
else
|
||
y.right = z;
|
||
z.left = this.sentinel;
|
||
z.right = this.sentinel;
|
||
z.color = RED;
|
||
this.insertFixup(z);
|
||
this.size++
|
||
} else {
|
||
var node = this.get_(key);
|
||
node.key = key
|
||
}
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.insertFixup = function(z) {
|
||
while (z != this.sentinel && z != this.root && z.parent.color == RED)
|
||
if (z.parent == z.parent.parent.left) {
|
||
var y = z.parent.parent.right;
|
||
if (y.color == RED) {
|
||
z.parent.color = BLACK;
|
||
y.color = BLACK;
|
||
z.parent.parent.color = RED;
|
||
z = z.parent.parent
|
||
} else {
|
||
if (z == z.parent.right) {
|
||
z = z.parent;
|
||
this.leftRotate(z)
|
||
}
|
||
z.parent.color = BLACK;
|
||
z.parent.parent.color = RED;
|
||
if (z.parent.parent != this.sentinel)
|
||
this.rightRotate(z.parent.parent)
|
||
}
|
||
} else {
|
||
var y = z.parent.parent.left;
|
||
if (y.color == RED) {
|
||
z.parent.color = BLACK;
|
||
y.color = BLACK;
|
||
z.parent.parent.color = RED;
|
||
z = z.parent.parent
|
||
} else {
|
||
if (z == z.parent.left) {
|
||
z = z.parent;
|
||
this.rightRotate(z)
|
||
}
|
||
z.parent.color = BLACK;
|
||
z.parent.parent.color = RED;
|
||
if (z.parent.parent != this.sentinel)
|
||
this.leftRotate(z.parent.parent)
|
||
}
|
||
}
|
||
this.root.color = BLACK
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.delete_ = function(z) {
|
||
var y;
|
||
var x;
|
||
if (z.left == this.sentinel || z.right == this.sentinel)
|
||
y = z;
|
||
else
|
||
y = this.successor_(z);
|
||
if (y.left != this.sentinel)
|
||
x = y.left;
|
||
else
|
||
x = y.right;
|
||
x.parent = y.parent;
|
||
if (y.parent == this.sentinel)
|
||
this.root = x;
|
||
else if (y == y.parent.left)
|
||
y.parent.left = x;
|
||
else
|
||
y.parent.right = x;
|
||
if (y != z)
|
||
z.key = y.key;
|
||
if (y.color == BLACK)
|
||
this.deleteFixup(x);
|
||
this.size--
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.deleteFixup = function(x) {
|
||
while (x != this.root && x.color == BLACK)
|
||
if (x == x.parent.left) {
|
||
var w = x.parent.right;
|
||
if (w.color == RED) {
|
||
w.color = BLACK;
|
||
x.parent.color = RED;
|
||
this.leftRotate(x.parent);
|
||
w = x.parent.right
|
||
}
|
||
if (w.left.color == BLACK && w.right.color == BLACK) {
|
||
w.color = RED;
|
||
x = x.parent
|
||
} else {
|
||
if (w.right.color == BLACK) {
|
||
w.left.color = BLACK;
|
||
w.color = RED;
|
||
this.rightRotate(w);
|
||
w = x.parent.right
|
||
}
|
||
w.color = x.parent.color;
|
||
x.parent.color = BLACK;
|
||
w.right.color = BLACK;
|
||
this.leftRotate(x.parent);
|
||
x = this.root
|
||
}
|
||
} else {
|
||
var w = x.parent.left;
|
||
if (w.color == RED) {
|
||
w.color = BLACK;
|
||
x.parent.color = RED;
|
||
this.rightRotate(x.parent);
|
||
w = x.parent.left
|
||
}
|
||
if (w.right.color == BLACK && w.left.color == BLACK) {
|
||
w.color = RED;
|
||
x = x.parent
|
||
} else {
|
||
if (w.left.color == BLACK) {
|
||
w.right.color = BLACK;
|
||
w.color = RED;
|
||
this.leftRotate(w);
|
||
w = x.parent.left
|
||
}
|
||
w.color = x.parent.color;
|
||
x.parent.color = BLACK;
|
||
w.left.color = BLACK;
|
||
this.rightRotate(x.parent);
|
||
x = this.root
|
||
}
|
||
}
|
||
x.color = BLACK
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.remove = function(key) {
|
||
var x = this.get_(key);
|
||
if (x != this.sentinel) {
|
||
var retval = x.key;
|
||
this.delete_(x);
|
||
return retval
|
||
} else
|
||
return null
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.removeSwapped = function(value, key) {
|
||
this.remove(key)
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.min = function(x) {
|
||
while (x.left != this.sentinel)
|
||
x = x.left;
|
||
return x
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.max = function(x) {
|
||
while (x.right != this.sentinel)
|
||
x = x.right;
|
||
return x
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.successor_ = function(x) {
|
||
if (x.right != this.sentinel)
|
||
return this.min(x.right);
|
||
var y = x.parent;
|
||
while (y != this.sentinel && x == y.right) {
|
||
x = y;
|
||
y = y.parent
|
||
}
|
||
return y
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.predeccessor_ = function(x) {
|
||
if (x.left != this.sentinel)
|
||
return this.max(x.left);
|
||
var y = x.parent;
|
||
while (y != this.sentinel && x == y.left) {
|
||
x = y;
|
||
y = y.parent
|
||
}
|
||
return y
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.successor = function(key) {
|
||
if (this.size > 0) {
|
||
var x = this.get_(key);
|
||
if (x == this.sentinel)
|
||
return null;
|
||
if (x.right != this.sentinel)
|
||
return this.min(x.right).key;
|
||
var y = x.parent;
|
||
while (y != this.sentinel && x == y.right) {
|
||
x = y;
|
||
y = y.parent
|
||
}
|
||
if (y != this.sentinel)
|
||
return y.key;
|
||
else
|
||
return null
|
||
} else
|
||
return null
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.predecessor = function(key) {
|
||
if (this.size > 0) {
|
||
var x = this.get_(key);
|
||
if (x == this.sentinel)
|
||
return null;
|
||
if (x.left != this.sentinel)
|
||
return this.max(x.left).key;
|
||
var y = x.parent;
|
||
while (y != this.sentinel && x == y.left) {
|
||
x = y;
|
||
y = y.parent
|
||
}
|
||
if (y != this.sentinel)
|
||
return y.key;
|
||
else
|
||
return null
|
||
} else
|
||
return null
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.getMin = function() {
|
||
return this.min(this.root).key
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.getMax = function() {
|
||
return this.max(this.root).key
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.get_ = function(key) {
|
||
var x = this.root;
|
||
while (x != this.sentinel && this.compare(x.key, key) != 0)
|
||
if (this.compare(key, x.key) < 0)
|
||
x = x.left;
|
||
else
|
||
x = x.right;
|
||
return x
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.contains = function(key) {
|
||
return this.get_(key).key != null
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.getValues = function() {
|
||
var ret = [];
|
||
this.forEach(function(x) {
|
||
ret.push(x)
|
||
});
|
||
return ret
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.insertAll = function(col) {
|
||
if (js_cols.typeOf(col) == "array")
|
||
for (var i = 0; i < col.length; i++)
|
||
this.insert(col[i]);
|
||
else if (js_cols.typeOf(col.forEach) == "function")
|
||
col.forEach(this.insert, this);
|
||
else if (js_cols.typeOf(col.getValues) == "function") {
|
||
var arr = col.getValues();
|
||
for (var i = 0; i < arr.length; i++)
|
||
this.insert(arr[i])
|
||
} else if (js_cols.typeOf(col) == "object")
|
||
for (var key in col)
|
||
this.insert(col[key])
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.removeAll = function(col) {
|
||
if (js_cols.typeOf(col) == "array")
|
||
for (var i = 0; i < col.length; i++)
|
||
this.remove(col[i]);
|
||
else if (js_cols.typeOf(col.forEach) == "function")
|
||
col.forEach(this.removeSwapped, this);
|
||
else if (js_cols.typeOf(col.getValues) == "function") {
|
||
var arr = col.getValues();
|
||
for (var i = 0; i < arr.length; i++)
|
||
this.remove(arr[i])
|
||
} else if (js_cols.typeOf(col) == "object")
|
||
for (var key in col)
|
||
this.remove(col[key])
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.containsAll = function(col) {
|
||
if (js_cols.typeOf(col) == "array") {
|
||
for (var i = 0; i < col.length; i++)
|
||
if (!this.contains(col[i]))
|
||
return false;
|
||
return true
|
||
} else if (js_cols.typeOf(col.forEach) == "function")
|
||
return col.every(this.contains, this);
|
||
else if (js_cols.typeOf(col.getValues) == "function") {
|
||
var arr = col.getValues();
|
||
for (var i = 0; i < arr.length; i++)
|
||
if (!this.contains(arr[i]))
|
||
return false;
|
||
return true
|
||
} else if (js_cols.typeOf(col) == "object") {
|
||
for (var key in col)
|
||
if (!this.contains(col[key]))
|
||
return false;
|
||
return true
|
||
}
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.range = function(from, to) {
|
||
var retArray = [];
|
||
this.traverseFromTo(function(x) {
|
||
retArray.push(x)
|
||
}, from, to);
|
||
return retArray
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.traverse = function(f, opt_obj) {
|
||
if (this.isEmpty())
|
||
return;
|
||
var node = this.min(this.root);
|
||
while (node != this.sentinel) {
|
||
if (f.call(opt_obj, node.key, this))
|
||
return;
|
||
node = this.successor_(node)
|
||
}
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.traverseFrom = function(f, fromKey, opt_obj) {
|
||
if (this.isEmpty())
|
||
return;
|
||
var node = this.get_(fromKey);
|
||
while (node != this.sentinel) {
|
||
if (f.call(opt_obj, node.key, this))
|
||
return;
|
||
node = this.successor_(node)
|
||
}
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.traverseTo = function(f, toKey, opt_obj) {
|
||
if (this.isEmpty())
|
||
return;
|
||
var node = this.min(this.root);
|
||
var toNode = this.get_(toKey);
|
||
while (node != toNode) {
|
||
if (f.call(opt_obj, node.key, this))
|
||
return;
|
||
node = this.successor_(node)
|
||
}
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.traverseFromTo = function(f, fromKey, toKey, opt_obj) {
|
||
if (this.isEmpty())
|
||
return;
|
||
var node = this.get_(fromKey);
|
||
var toNode = this.get_(toKey);
|
||
while (node != toNode) {
|
||
if (f.call(opt_obj, node.key, this))
|
||
return;
|
||
node = this.successor_(node)
|
||
}
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.traverseBackwards = function(f, opt_obj) {
|
||
if (this.isEmpty())
|
||
return;
|
||
var node = this.max(this.root);
|
||
while (node != this.sentinel) {
|
||
if (f.call(opt_obj, node.key, this))
|
||
return;
|
||
node = this.predeccessor_(node)
|
||
}
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.forEach = function(f, opt_obj) {
|
||
if (this.isEmpty())
|
||
return;
|
||
for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n))
|
||
f.call(opt_obj, n.key, n.key, this)
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.some = function(f, opt_obj) {
|
||
if (this.isEmpty())
|
||
return false;
|
||
for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n))
|
||
if (f.call(opt_obj, n.key, n.key, this))
|
||
return true;
|
||
return false
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.every = function(f, opt_obj) {
|
||
if (this.isEmpty())
|
||
return false;
|
||
for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n))
|
||
if (!f.call(opt_obj, n.key, n.key, this))
|
||
return false;
|
||
return true
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.map = function(f, opt_obj) {
|
||
var rv = [];
|
||
if (this.isEmpty())
|
||
return rv;
|
||
for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n))
|
||
rv.push(f.call(opt_obj, n.key, n.key, this));
|
||
return rv
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.filter = function(f, opt_obj) {
|
||
var rv = [];
|
||
if (this.isEmpty())
|
||
return rv;
|
||
for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n))
|
||
if (f.call(opt_obj, n.key, n.key, this))
|
||
rv.push(n.key);
|
||
return rv
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.getCount = function() {
|
||
return this.size
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.isEmpty = function() {
|
||
return this.size == 0
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.isSubsetOf = function(col) {
|
||
var colCount = js_cols.getCount(col);
|
||
if (this.getCount() > colCount)
|
||
return false;
|
||
var i = 0;
|
||
if (this.isEmpty())
|
||
return true;
|
||
for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n))
|
||
if (js_cols.contains.call(col, col, n.key))
|
||
i++;
|
||
return i == this.getCount()
|
||
}
|
||
;
|
||
js_cols.RedBlackSet.prototype.intersection = function(col) {
|
||
var result = new js_cols.RedBlackSet(this.compare);
|
||
if (this.isEmpty())
|
||
return result;
|
||
for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n))
|
||
if (col.contains.call(col, n.key, n.key, this))
|
||
result.insert(n.key);
|
||
return result
|
||
}
|
||
;
|
||
C3.RedBlackSet = class RedBlackSet extends C3.DefendedBase {
|
||
constructor(sortFunc) {
|
||
super();
|
||
this._rbSet = new js_cols.RedBlackSet(sortFunc);
|
||
this._enableQueue = false;
|
||
this._queueInsert = new Set;
|
||
this._queueRemove = new Set
|
||
}
|
||
Add(item) {
|
||
if (this._enableQueue)
|
||
if (this._rbSet.contains(item))
|
||
this._queueRemove.delete(item);
|
||
else
|
||
this._queueInsert.add(item);
|
||
else
|
||
this._rbSet.insert(item)
|
||
}
|
||
Remove(item) {
|
||
if (this._enableQueue)
|
||
if (this._rbSet.contains(item))
|
||
this._queueRemove.add(item);
|
||
else
|
||
this._queueInsert.delete(item);
|
||
else
|
||
this._rbSet.remove(item)
|
||
}
|
||
Has(item) {
|
||
if (this._enableQueue) {
|
||
if (this._queueInsert.has(item))
|
||
return true;
|
||
return !this._queueRemove.has(item) && this._rbSet.contains(item)
|
||
} else
|
||
return this._rbSet.contains(item)
|
||
}
|
||
Clear() {
|
||
this._rbSet.clear();
|
||
this._queueInsert.clear();
|
||
this._queueRemove.clear()
|
||
}
|
||
toArray() {
|
||
if (this._enableQueue)
|
||
throw new Error("cannot be used in queueing mode");
|
||
return this._rbSet.getValues()
|
||
}
|
||
GetSize() {
|
||
return this._rbSet.getCount() + this._queueInsert.size - this._queueRemove.size
|
||
}
|
||
IsEmpty() {
|
||
return this.GetSize() === 0
|
||
}
|
||
Front() {
|
||
if (this.IsEmpty())
|
||
throw new Error("empty set");
|
||
if (this._enableQueue)
|
||
throw new Error("cannot be used in queueing mode");
|
||
const rbSet = this._rbSet;
|
||
const n = rbSet.min(rbSet.root);
|
||
return n.key
|
||
}
|
||
Shift() {
|
||
if (this.IsEmpty())
|
||
throw new Error("empty set");
|
||
if (this._enableQueue)
|
||
throw new Error("cannot be used in queueing mode");
|
||
const item = this.Front();
|
||
this.Remove(item);
|
||
return item
|
||
}
|
||
SetQueueingEnabled(q) {
|
||
q = !!q;
|
||
if (this._enableQueue === q)
|
||
return;
|
||
this._enableQueue = q;
|
||
if (!q) {
|
||
for (const item of this._queueRemove)
|
||
this._rbSet.remove(item);
|
||
this._queueRemove.clear();
|
||
for (const item of this._queueInsert)
|
||
this._rbSet.insert(item);
|
||
this._queueInsert.clear()
|
||
}
|
||
}
|
||
ForEach(func) {
|
||
this._rbSet.forEach(func)
|
||
}
|
||
*values() {
|
||
if (this.IsEmpty())
|
||
return;
|
||
const rbSet = this._rbSet;
|
||
for (let n = rbSet.min(rbSet.root); n != rbSet.sentinel; n = rbSet.successor_(n))
|
||
yield n.key
|
||
}
|
||
[Symbol.iterator]() {
|
||
return this.values()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.PromiseThrottle = class PromiseThrottle {
|
||
constructor(maxParallel=C3.hardwareConcurrency) {
|
||
this._maxParallel = maxParallel;
|
||
this._queue = [];
|
||
this._activeCount = 0
|
||
}
|
||
Add(func) {
|
||
return new Promise((resolve,reject)=>{
|
||
this._queue.push({
|
||
func,
|
||
resolve,
|
||
reject
|
||
});
|
||
this._MaybeStartNext()
|
||
}
|
||
)
|
||
}
|
||
_FindInQueue(func) {
|
||
for (let i = 0, len = this._queue.length; i < len; ++i)
|
||
if (this._queue[i].func === func)
|
||
return i;
|
||
return -1
|
||
}
|
||
RemoveAndResolve(func, value) {
|
||
const i = this._FindInQueue(func);
|
||
if (i === -1)
|
||
throw new Error("cannot find promise to resolve");
|
||
this._queue[i].resolve(value);
|
||
this._queue.splice(i, 1)
|
||
}
|
||
RemoveAndReject(func, value) {
|
||
const i = this._FindInQueue(func);
|
||
if (i === -1)
|
||
throw new Error("cannot find promise to reject");
|
||
this._queue[i].reject(value);
|
||
this._queue.splice(i, 1)
|
||
}
|
||
async _MaybeStartNext() {
|
||
if (!this._queue.length)
|
||
return;
|
||
if (this._activeCount >= this._maxParallel)
|
||
return;
|
||
this._activeCount++;
|
||
const job = this._queue.shift();
|
||
try {
|
||
const result = await job.func();
|
||
job.resolve(result)
|
||
} catch (err) {
|
||
job.reject(err)
|
||
}
|
||
this._activeCount--;
|
||
this._MaybeStartNext()
|
||
}
|
||
static async Batch(concurrency, methods) {
|
||
const results = [];
|
||
let failed = false;
|
||
const execute = async _=>{
|
||
let fn;
|
||
while (fn = methods.pop()) {
|
||
if (failed)
|
||
return;
|
||
try {
|
||
results.push(await fn())
|
||
} catch (e) {
|
||
failed = true;
|
||
throw e;
|
||
}
|
||
}
|
||
}
|
||
;
|
||
const promises = [];
|
||
while (concurrency--)
|
||
promises.push(execute());
|
||
await Promise.all(promises);
|
||
return results
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.RateLimiter = class RateLimiter {
|
||
constructor(callback, interval, intervalOnBattery) {
|
||
this._callback = callback;
|
||
this._interval = interval;
|
||
this._intervalOnBattery = intervalOnBattery || interval * 2;
|
||
this._timerId = -1;
|
||
this._lastCallTime = -Infinity;
|
||
this._timerCallFunc = ()=>this._OnTimer();
|
||
this._ignoreReset = false;
|
||
this._canRunImmediate = false;
|
||
this._callbackArguments = null
|
||
}
|
||
SetCanRunImmediate(c) {
|
||
this._canRunImmediate = !!c
|
||
}
|
||
_GetInterval() {
|
||
if (typeof C3.Battery !== "undefined" && C3.Battery.IsOnBatteryPower())
|
||
return this._intervalOnBattery;
|
||
else
|
||
return this._interval
|
||
}
|
||
Call(...args) {
|
||
if (this._timerId !== -1)
|
||
return;
|
||
this._callbackArguments = args;
|
||
let nowTime = C3.FastGetDateNow();
|
||
let timeSinceLastCall = nowTime - this._lastCallTime;
|
||
let interval = this._GetInterval();
|
||
if (timeSinceLastCall >= interval && this._canRunImmediate) {
|
||
this._lastCallTime = nowTime;
|
||
this._RunCallback()
|
||
} else
|
||
this._timerId = self.setTimeout(this._timerCallFunc, Math.max(interval - timeSinceLastCall, 4))
|
||
}
|
||
_RunCallback() {
|
||
this._ignoreReset = true;
|
||
const args = this._callbackArguments;
|
||
this._callbackArguments = null;
|
||
if (args)
|
||
this._callback(...args);
|
||
else
|
||
this._callback();
|
||
this._ignoreReset = false
|
||
}
|
||
Reset() {
|
||
if (this._ignoreReset)
|
||
return;
|
||
this._CancelTimer();
|
||
this._callbackArguments = null;
|
||
this._lastCallTime = C3.FastGetDateNow()
|
||
}
|
||
_OnTimer() {
|
||
this._timerId = -1;
|
||
this._lastCallTime = C3.FastGetDateNow();
|
||
this._RunCallback()
|
||
}
|
||
_CancelTimer() {
|
||
if (this._timerId !== -1) {
|
||
self.clearTimeout(this._timerId);
|
||
this._timerId = -1
|
||
}
|
||
}
|
||
Release() {
|
||
this._CancelTimer();
|
||
this._callback = null;
|
||
this._callbackArguments = null;
|
||
this._timerCallFunc = null
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.SVGRasterManager = class SVGRasterManager {
|
||
constructor() {
|
||
this._images = new Map;
|
||
this._allowNpotSurfaces = false;
|
||
this._getBaseSizeCallback = null;
|
||
this._rasterAtSizeCallback = null;
|
||
this._releaseResultCallback = null;
|
||
this._redrawCallback = null
|
||
}
|
||
SetNpotSurfaceAllowed(a) {
|
||
this._allowNpotSurfaces = !!a
|
||
}
|
||
IsNpotSurfaceAllowed() {
|
||
return this._allowNpotSurfaces
|
||
}
|
||
SetGetBaseSizeCallback(f) {
|
||
this._getBaseSizeCallback = f
|
||
}
|
||
GetBaseSize(dataSource) {
|
||
if (!this._getBaseSizeCallback)
|
||
throw new Error("no get base size callback set");
|
||
return this._getBaseSizeCallback(dataSource)
|
||
}
|
||
SetRasterAtSizeCallback(f) {
|
||
this._rasterAtSizeCallback = f
|
||
}
|
||
RasterAtSize(dataSource, context, surfaceWidth, surfaceHeight, imageWidth, imageHeight) {
|
||
if (!this._rasterAtSizeCallback)
|
||
throw new Error("no raster at size callback set");
|
||
return this._rasterAtSizeCallback(dataSource, context, surfaceWidth, surfaceHeight, imageWidth, imageHeight)
|
||
}
|
||
SetReleaseResultCallback(f) {
|
||
this._releaseResultCallback = f
|
||
}
|
||
ReleaseResult(rasterizedResult) {
|
||
if (!this._releaseResultCallback)
|
||
throw new Error("no release result callback set");
|
||
this._releaseResultCallback(rasterizedResult)
|
||
}
|
||
SetRedrawCallback(f) {
|
||
this._redrawCallback = f
|
||
}
|
||
Redraw() {
|
||
if (!this._redrawCallback)
|
||
throw new Error("no redraw callback set");
|
||
this._redrawCallback()
|
||
}
|
||
AddImage(dataSource) {
|
||
let ret = this._images.get(dataSource);
|
||
if (!ret) {
|
||
ret = C3.New(C3.SVGRasterImage, this, dataSource);
|
||
this._images.set(dataSource, ret)
|
||
}
|
||
ret.IncReference();
|
||
return ret
|
||
}
|
||
_RemoveImage(ri) {
|
||
this._images.delete(ri.GetDataSource())
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const MAX_SURFACE_SIZE = 2048;
|
||
C3.SVGRasterImage = class SVGRasterImage {
|
||
constructor(manager, dataSource) {
|
||
this._manager = manager;
|
||
this._dataSource = dataSource;
|
||
this._refCount = 0;
|
||
this._baseWidth = 0;
|
||
this._baseHeight = 0;
|
||
this._getBaseSizePromise = this._manager.GetBaseSize(dataSource).then(baseSize=>{
|
||
this._baseWidth = baseSize[0];
|
||
this._baseHeight = baseSize[1];
|
||
this._manager.Redraw()
|
||
}
|
||
).catch(err=>{
|
||
console.error("[SVG] Error loading SVG: ", err);
|
||
this._hadError = true;
|
||
this._manager.Redraw()
|
||
}
|
||
);
|
||
this._rasterSurfaceWidth = 0;
|
||
this._rasterSurfaceHeight = 0;
|
||
this._rasterImageWidth = 0;
|
||
this._rasterImageHeight = 0;
|
||
this._isRasterizing = false;
|
||
this._rasterizedResult = null;
|
||
this._forceRaster = false;
|
||
this._hadError = false
|
||
}
|
||
Release() {
|
||
if (this._refCount <= 0)
|
||
throw new Error("already released");
|
||
this._refCount--;
|
||
if (this._refCount === 0)
|
||
this._Release()
|
||
}
|
||
_Release() {
|
||
if (this._rasterizedResult) {
|
||
this._manager.ReleaseResult(this._rasterizedResult);
|
||
this._rasterizedResult = null
|
||
}
|
||
this._manager._RemoveImage(this);
|
||
this._manager = null
|
||
}
|
||
GetDataSource() {
|
||
return this._dataSource
|
||
}
|
||
IncReference() {
|
||
this._refCount++
|
||
}
|
||
HasReferences() {
|
||
return this._refCount > 0
|
||
}
|
||
GetRasterizedResult() {
|
||
return this._rasterizedResult
|
||
}
|
||
ForceRasterAgain() {
|
||
this._forceRaster = true
|
||
}
|
||
async StartRasterForSize(context, width, height) {
|
||
if (width === 0 || height === 0 || this._hadError)
|
||
return;
|
||
if (this._isRasterizing)
|
||
return;
|
||
let rasterSurfaceWidth = C3.nextHighestPowerOfTwo(Math.ceil(width));
|
||
let rasterSurfaceHeight = C3.nextHighestPowerOfTwo(Math.ceil(height));
|
||
const maxDim = Math.max(rasterSurfaceWidth, rasterSurfaceHeight);
|
||
if (maxDim > MAX_SURFACE_SIZE) {
|
||
const scale = MAX_SURFACE_SIZE / maxDim;
|
||
width *= scale;
|
||
height *= scale;
|
||
rasterSurfaceWidth = Math.min(Math.ceil(rasterSurfaceWidth * scale), MAX_SURFACE_SIZE);
|
||
rasterSurfaceHeight = Math.min(Math.ceil(rasterSurfaceHeight * scale), MAX_SURFACE_SIZE)
|
||
}
|
||
if (width < rasterSurfaceWidth && height < rasterSurfaceHeight) {
|
||
const imageAspectRatio = width / height;
|
||
const surfaceAspectRatio = rasterSurfaceWidth / rasterSurfaceHeight;
|
||
if (surfaceAspectRatio > imageAspectRatio) {
|
||
width = rasterSurfaceHeight * imageAspectRatio;
|
||
height = rasterSurfaceHeight
|
||
} else {
|
||
width = rasterSurfaceWidth;
|
||
height = rasterSurfaceWidth / imageAspectRatio
|
||
}
|
||
}
|
||
if (this._manager.IsNpotSurfaceAllowed()) {
|
||
rasterSurfaceWidth = Math.ceil(width);
|
||
rasterSurfaceHeight = Math.ceil(height)
|
||
}
|
||
if (rasterSurfaceWidth <= this._rasterSurfaceWidth && rasterSurfaceHeight <= this._rasterSurfaceHeight && !this._forceRaster)
|
||
return;
|
||
this._isRasterizing = true;
|
||
this._rasterSurfaceWidth = rasterSurfaceWidth;
|
||
this._rasterSurfaceHeight = rasterSurfaceHeight;
|
||
const newRasterizedResult = await this._manager.RasterAtSize(this._dataSource, context, this._rasterSurfaceWidth, this._rasterSurfaceHeight, width, height);
|
||
if (this._rasterizedResult)
|
||
this._manager.ReleaseResult(this._rasterizedResult);
|
||
this._rasterizedResult = newRasterizedResult;
|
||
this._rasterImageWidth = width;
|
||
this._rasterImageHeight = height;
|
||
this._isRasterizing = false;
|
||
this._forceRaster = false;
|
||
this._manager.Redraw()
|
||
}
|
||
WhenBaseSizeReady() {
|
||
return this._getBaseSizePromise
|
||
}
|
||
GetBaseWidth() {
|
||
return this._baseWidth
|
||
}
|
||
GetBaseHeight() {
|
||
return this._baseHeight
|
||
}
|
||
GetRasterWidth() {
|
||
return this._rasterImageWidth
|
||
}
|
||
GetRasterHeight() {
|
||
return this._rasterImageHeight
|
||
}
|
||
HadError() {
|
||
return this._hadError
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.UTF8_BOM = "\ufeff";
|
||
const NUMERIC_CHARS = new Set([..."0123456789"]);
|
||
C3.IsNumericChar = function IsNumericChar(c) {
|
||
return NUMERIC_CHARS.has(c)
|
||
}
|
||
;
|
||
const WHITESPACE_CHARS = new Set([..." \t\n\r\u00a0\u0085\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u202f\u205f\u3000"]);
|
||
C3.IsWhitespaceChar = function IsWhitespaceChar(c) {
|
||
return WHITESPACE_CHARS.has(c)
|
||
}
|
||
;
|
||
C3.FilterWhitespace = function FilterWhitespace(str) {
|
||
return [...str].filter(ch=>!C3.IsWhitespaceChar(ch)).join("")
|
||
}
|
||
;
|
||
C3.IsStringAllWhitespace = function IsStringAllWhitespace(str) {
|
||
for (const ch of str)
|
||
if (!C3.IsWhitespaceChar(ch))
|
||
return false;
|
||
return true
|
||
}
|
||
;
|
||
C3.IsUnprintableChar = function IsUnprintableChar(c) {
|
||
return c.length === 1 && c.charCodeAt(0) < 32
|
||
}
|
||
;
|
||
C3.FilterUnprintableChars = function FilterUnprintableChars(str) {
|
||
return [...str].filter(ch=>!C3.IsUnprintableChar(ch)).join("")
|
||
}
|
||
;
|
||
const NUMERIC_STRING_CHARS = new Set([..."0123456789.+-e"]);
|
||
C3.IsStringNumber = function IsStringNumber(str) {
|
||
str = str.trim();
|
||
if (!str.length)
|
||
return false;
|
||
let firstChar = str.charAt(0);
|
||
if (firstChar !== "-" && !NUMERIC_CHARS.has(firstChar))
|
||
return false;
|
||
for (let ch of str)
|
||
if (!NUMERIC_STRING_CHARS.has(ch))
|
||
return false;
|
||
return true
|
||
}
|
||
;
|
||
C3.RemoveTrailingDigits = function RemoveTrailingDigits(str) {
|
||
let i = str.length;
|
||
while (i > 0) {
|
||
let prev_ch = str.charAt(i - 1);
|
||
if (!C3.IsNumericChar(prev_ch))
|
||
break;
|
||
--i
|
||
}
|
||
return str.substr(0, i)
|
||
}
|
||
;
|
||
C3.IncrementNumberAtEndOf = function IncrementNumberAtEndOf(str) {
|
||
let baseStr = C3.RemoveTrailingDigits(str);
|
||
let numberStr = str.substr(baseStr.length);
|
||
if (numberStr)
|
||
numberStr = (parseInt(numberStr, 10) + 1).toString();
|
||
else
|
||
numberStr = "2";
|
||
return baseStr + numberStr
|
||
}
|
||
;
|
||
const HTML_ENTITY_MAP = new Map([["&", "&"], ["<", "<"], [">", ">"], ['"', """], ["'", "'"]]);
|
||
function lookupHtmlEntity(s) {
|
||
return HTML_ENTITY_MAP.get(s)
|
||
}
|
||
const HTML_ENTITY_REGEX = /[&<>"']/g;
|
||
C3.EscapeHTML = function EscapeHTML(str) {
|
||
return str.replace(HTML_ENTITY_REGEX, lookupHtmlEntity)
|
||
}
|
||
;
|
||
C3.EscapeJS = function EscapeJS(str) {
|
||
let ret = C3.ReplaceAll(str, "\\", "\\\\");
|
||
ret = C3.ReplaceAll(ret, '"', '\\"');
|
||
ret = C3.ReplaceAll(ret, "\t", "\\t");
|
||
ret = C3.ReplaceAll(ret, "\r", "");
|
||
return C3.ReplaceAll(ret, "\n", "\\n")
|
||
}
|
||
;
|
||
C3.EscapeXML = function EscapeXML(str) {
|
||
let ret = C3.ReplaceAll(str, "&", "&");
|
||
ret = C3.ReplaceAll(ret, "<", "<");
|
||
ret = C3.ReplaceAll(ret, ">", ">");
|
||
return C3.ReplaceAll(ret, '"', """)
|
||
}
|
||
;
|
||
const ESCAPE_REGEX = /[-[\]{}()*+?.,\\^$|#\s]/g;
|
||
C3.EscapeRegex = function EscapeRegex(str) {
|
||
return str.replace(ESCAPE_REGEX, "\\$&")
|
||
}
|
||
;
|
||
C3.FindAll = function FindAll(str, find, matchCase=false) {
|
||
if (!find)
|
||
return [];
|
||
if (!matchCase) {
|
||
str = str.toLowerCase();
|
||
find = find.toLowerCase()
|
||
}
|
||
const findLen = find.length;
|
||
let startIndex = 0;
|
||
let index = 0;
|
||
let ret = [];
|
||
while ((index = str.indexOf(find, startIndex)) > -1) {
|
||
ret.push(index);
|
||
startIndex = index + findLen
|
||
}
|
||
return ret
|
||
}
|
||
;
|
||
C3.ReplaceAll = function ReplaceAll(str, find, replace) {
|
||
return str.replaceAll(find, ()=>replace)
|
||
}
|
||
;
|
||
C3.ReplaceAllCaseInsensitive = function ReplaceAll(str, find, replace) {
|
||
return str.replace(new RegExp(C3.EscapeRegex(find),"gi"), ()=>replace)
|
||
}
|
||
;
|
||
C3.SetElementContent = function SetElementContent(elem, stringlike) {
|
||
if (typeof stringlike === "string")
|
||
elem.textContent = stringlike;
|
||
else if (stringlike.isPlainText())
|
||
elem.textContent = stringlike.toString();
|
||
else {
|
||
elem.innerHTML = stringlike.toHTML();
|
||
if (stringlike instanceof C3.BBString)
|
||
stringlike.attachLinkHandlers(elem)
|
||
}
|
||
}
|
||
;
|
||
C3.StringLikeEquals = function StringLikeEquals(a, b) {
|
||
if (a instanceof C3.HtmlString || a instanceof C3.BBString)
|
||
return a.equals(b);
|
||
else if (b instanceof C3.HtmlString || b instanceof C3.BBString)
|
||
return b.equals(a);
|
||
else
|
||
return a === b
|
||
}
|
||
;
|
||
C3.StringSubstitute = function StringSubstitute(str, ...arr) {
|
||
let ret = str;
|
||
for (let i = 0, len = arr.length; i < len; ++i) {
|
||
const sub = `{${i}}`;
|
||
if (!str.includes(sub))
|
||
throw new Error(`missing placeholder '${sub}' in string substitution`);
|
||
ret = ret.replace(sub, arr[i].toString())
|
||
}
|
||
return ret
|
||
}
|
||
;
|
||
C3.StringSubstituteAllowMissing = function StringSubstituteAllowMissing(str, ...arr) {
|
||
let ret = str;
|
||
let lowestMissingIndex = -1;
|
||
let highestUsedIndex = -1;
|
||
for (let i = 0, len = arr.length; i < len; ++i) {
|
||
const sub = `{${i}}`;
|
||
if (str.includes(sub)) {
|
||
highestUsedIndex = i;
|
||
ret = ret.replace(sub, arr[i].toString())
|
||
} else if (lowestMissingIndex === -1)
|
||
lowestMissingIndex = i
|
||
}
|
||
if (lowestMissingIndex >= 0 && highestUsedIndex >= 0 && lowestMissingIndex < highestUsedIndex)
|
||
throw new Error(`missing placeholder '${lowestMissingIndex}' in string substitution`);
|
||
return ret
|
||
}
|
||
;
|
||
C3.StringSubstituteMap = function StringSubstituteMap(str, o) {
|
||
let ret = str;
|
||
for (let[placeholder,substitution] of Object.entries(o))
|
||
ret = ret.replaceAll(placeholder, substitution.toString());
|
||
return ret
|
||
}
|
||
;
|
||
C3.SortAZCaseInsensitive = function SortAZCaseInsensitive(a, b) {
|
||
let lowerA = a.toLowerCase();
|
||
let lowerB = b.toLowerCase();
|
||
if (lowerA > lowerB)
|
||
return 1;
|
||
else if (lowerA < lowerB)
|
||
return -1;
|
||
else
|
||
return 0
|
||
}
|
||
;
|
||
const KILOBYTE = 1024;
|
||
const MEGABYTE = KILOBYTE * 1024;
|
||
const GIGABYTE = MEGABYTE * 1024;
|
||
const TERABYTE = GIGABYTE * 1024;
|
||
C3.FormatDataSize = function FormatDataSize(sizeInBytes, asRate) {
|
||
let rootKey = "common." + (asRate ? "dataRates" : "dataSizes") + ".";
|
||
const langSub = self.langSub;
|
||
if (sizeInBytes < KILOBYTE)
|
||
return langSub(rootKey + "bytes", sizeInBytes);
|
||
else if (sizeInBytes < MEGABYTE) {
|
||
let kb = sizeInBytes / KILOBYTE;
|
||
if (kb < 10)
|
||
kb = Math.round(kb * 10) / 10;
|
||
else
|
||
kb = Math.round(kb);
|
||
return langSub(rootKey + "kilobytes", kb)
|
||
} else if (sizeInBytes < GIGABYTE) {
|
||
let mb = sizeInBytes / MEGABYTE;
|
||
if (mb < 10)
|
||
mb = Math.round(mb * 10) / 10;
|
||
else
|
||
mb = Math.round(mb);
|
||
return langSub(rootKey + "megabytes", mb)
|
||
} else if (sizeInBytes < TERABYTE) {
|
||
let gb = sizeInBytes / GIGABYTE;
|
||
if (gb < 10)
|
||
gb = Math.round(gb * 10) / 10;
|
||
else
|
||
gb = Math.round(gb);
|
||
return langSub(rootKey + "gigabytes", gb)
|
||
} else {
|
||
let tb = sizeInBytes / TERABYTE;
|
||
if (tb < 10)
|
||
tb = Math.round(tb * 10) / 10;
|
||
else
|
||
tb = Math.round(tb);
|
||
return langSub(rootKey + "terabytes", tb)
|
||
}
|
||
}
|
||
;
|
||
const DEFAULT_FORMATTIME_OPTS = {
|
||
approximate: false,
|
||
days: true,
|
||
hours: true,
|
||
minutes: true,
|
||
seconds: true
|
||
};
|
||
C3.FormatTime = function FormatTime(secondsTotal, opts) {
|
||
opts = Object.assign({}, DEFAULT_FORMATTIME_OPTS, opts);
|
||
C3.Lang.PushContext("common.time");
|
||
const parts = [];
|
||
const lang = self.lang;
|
||
const langPluralSub = self.langPluralSub;
|
||
if (opts.days) {
|
||
const days = Math.floor(secondsTotal / (24 * 3600));
|
||
if (days > 0) {
|
||
secondsTotal -= days * 24 * 3600;
|
||
parts.push(langPluralSub(".days", null, days))
|
||
}
|
||
}
|
||
if (opts.hours) {
|
||
const hours = Math.floor(secondsTotal / 3600);
|
||
if (hours > 0 || parts.length) {
|
||
secondsTotal -= hours * 3600;
|
||
parts.push(langPluralSub(".hours", null, hours))
|
||
}
|
||
}
|
||
if (opts.minutes) {
|
||
const minutes = Math.floor(secondsTotal / 60);
|
||
if (minutes > 0 || parts.length || !opts.seconds) {
|
||
secondsTotal -= minutes * 60;
|
||
parts.push(langPluralSub(".minutes", null, minutes))
|
||
}
|
||
}
|
||
if (opts.seconds) {
|
||
const seconds = Math.floor(secondsTotal % 60);
|
||
parts.push(langPluralSub(".seconds", null, seconds))
|
||
}
|
||
const ret = (opts.approximate ? lang(".approx-prefix") : "") + parts.join(lang(".separator"));
|
||
C3.Lang.PopContext();
|
||
return ret
|
||
}
|
||
;
|
||
C3.ZeroPad = function(n, d) {
|
||
let s = n < 0 ? "-" : "";
|
||
n = Math.abs(n);
|
||
let nStr = n.toString();
|
||
let zeroes = d - nStr.length;
|
||
for (let i = 0; i < zeroes; ++i)
|
||
s += "0";
|
||
return s + nStr
|
||
}
|
||
;
|
||
C3.StringToTitleCase = function StringToTitleCase(str) {
|
||
return str.toLowerCase().replace(/\b\w/g, t=>t.toUpperCase())
|
||
}
|
||
;
|
||
C3.CompareVersionStrings = function CompareVersionStrings(v1, v2) {
|
||
let a1 = v1.split(".").map(s=>s.trim());
|
||
let a2 = v2.split(".").map(s=>s.trim());
|
||
C3.resizeArray(a1, 4, "0");
|
||
C3.resizeArray(a2, 4, "0");
|
||
a1 = a1.map(s=>parseInt(s, 10));
|
||
a2 = a2.map(s=>parseInt(s, 10));
|
||
for (let i = 0; i < 4; ++i) {
|
||
const diff = a1[i] - a2[i];
|
||
if (diff !== 0)
|
||
return diff < 0 ? -1 : 1
|
||
}
|
||
return 0
|
||
}
|
||
;
|
||
C3.CreateGUID = function CreateGUID() {
|
||
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, c=>{
|
||
const r = Math.floor(Math.random() * 16);
|
||
const v = c === "x" ? r : r & 3 | 8;
|
||
return v.toString(16)
|
||
}
|
||
)
|
||
}
|
||
;
|
||
C3.StringHammingDistance = function StringHammingDistance(a, b) {
|
||
if (a.length !== b.length)
|
||
throw new Error("strings must be same length");
|
||
let ret = 0;
|
||
for (let i = 0, len = a.length; i < len; ++i)
|
||
if (a.charAt(i) !== b.charAt(i))
|
||
++ret;
|
||
return ret
|
||
}
|
||
;
|
||
C3.StringLevenshteinDistance = function StringLevenshteinDistance(a, b) {
|
||
if (a.length === 0)
|
||
return b.length;
|
||
if (b.length === 0)
|
||
return a.length;
|
||
let tmp, i, j, prev, val, row;
|
||
if (a.length > b.length) {
|
||
tmp = a;
|
||
a = b;
|
||
b = tmp
|
||
}
|
||
row = Array(a.length + 1);
|
||
for (i = 0; i <= a.length; i++)
|
||
row[i] = i;
|
||
for (i = 1; i <= b.length; i++) {
|
||
prev = i;
|
||
for (j = 1; j <= a.length; j++) {
|
||
if (b[i - 1] === a[j - 1])
|
||
val = row[j - 1];
|
||
else
|
||
val = Math.min(row[j - 1] + 1, Math.min(prev + 1, row[j] + 1));
|
||
row[j - 1] = prev;
|
||
prev = val
|
||
}
|
||
row[a.length] = prev
|
||
}
|
||
return row[a.length]
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
const BB_CODE_MAP = new Map([["b", "strong"], ["i", "em"], ["s", "s"], ["u", "u"], ["sub", "sub"], ["sup", "sup"], ["small", "small"], ["mark", "mark"], ["a1", "a"], ["a2", "a"], ["a3", "a"], ["a4", "a"], ["a5", "a"], ["a6", "a"], ["a7", "a"], ["a8", "a"], ["a9", "a"], ["bad", ["span", "bbCodeBad"]], ["good", ["span", "bbCodeGood"]], ["info", ["span", "bbCodeInfo"]], ["h1", ["span", "bbCodeH1"]], ["h2", ["span", "bbCodeH2"]], ["h3", ["span", "bbCodeH3"]], ["h4", ["span", "bbCodeH4"]], ["item", ["span", "bbCodeItem"]]]);
|
||
const BBREGEX = /\[(\/?)([a-zA-Z0-9]+)\]/g;
|
||
const CUSTOM_BBREGEX = /\[(\/?)([^\[]*?)\]/g;
|
||
let linkActions = null;
|
||
let classIndex = 0;
|
||
function bbToHtmlReplacerFunc(match, closeSlash, tagName) {
|
||
const entry = BB_CODE_MAP.get(tagName);
|
||
if (entry)
|
||
if (typeof entry === "string")
|
||
if (entry === "a" && !closeSlash) {
|
||
const index = parseInt(tagName.substring(1), 10) - 1;
|
||
if (index < 0 || index >= linkActions.length)
|
||
throw new Error("invalid bbcode link substitution");
|
||
const linkAction = linkActions[index];
|
||
if (typeof linkAction === "string")
|
||
return `<a href="${linkActions[index]}">`;
|
||
else if (typeof linkAction === "function")
|
||
return `<a class="bblink${index}">`;
|
||
else
|
||
throw new TypeError("invalid bbcode link action");
|
||
} else
|
||
return "<" + closeSlash + entry + ">";
|
||
else if (Array.isArray(entry)) {
|
||
let tag = entry[0];
|
||
let className = entry[1];
|
||
if (closeSlash)
|
||
return "</" + tag + ">";
|
||
else
|
||
return `<${tag} class="${className}">`
|
||
} else
|
||
;
|
||
else if (tagName === "class")
|
||
if (closeSlash)
|
||
return "</span>";
|
||
else
|
||
return `<span class="bbclass${classIndex++}">`;
|
||
else
|
||
return match
|
||
}
|
||
const LINEBREAK_REGEX = /\n/g;
|
||
C3.BBString = class BBString {
|
||
constructor(str, opts) {
|
||
this._bbstr = opts && opts.noEscape ? str : C3.EscapeHTML(str);
|
||
this._htmlstr = "";
|
||
this._convertLineBreaks = false;
|
||
this._linkActions = [];
|
||
if (opts) {
|
||
this._convertLineBreaks = !!opts.convertLineBreaks;
|
||
if (opts.links) {
|
||
if (opts.links.length > 9)
|
||
throw new Error("too many links");
|
||
this._linkActions = opts.links
|
||
}
|
||
}
|
||
this._hasAnyBBtags = this._bbstr.includes("[");
|
||
this._needsLineBreakConversion = this._convertLineBreaks && this._bbstr.includes("\n");
|
||
this._isPlain = !this._hasAnyBBtags && !this._needsLineBreakConversion && !this._bbstr.includes("&");
|
||
this._hasParsedFragments = false;
|
||
this._fragments = []
|
||
}
|
||
toString() {
|
||
return this._bbstr
|
||
}
|
||
valueOf() {
|
||
return this._bbstr
|
||
}
|
||
isPlainText() {
|
||
return this._isPlain
|
||
}
|
||
toPlainText() {
|
||
if (this._hasAnyBBtags)
|
||
return this._bbstr.replace(BBREGEX, "");
|
||
else
|
||
return this._bbstr
|
||
}
|
||
toHTML() {
|
||
if (this._isPlain)
|
||
return this._bbstr;
|
||
if (!this._htmlstr && this._bbstr) {
|
||
let str = this._bbstr;
|
||
if (this._hasAnyBBtags) {
|
||
classIndex = 0;
|
||
linkActions = this._linkActions;
|
||
str = str.replace(BBREGEX, bbToHtmlReplacerFunc);
|
||
linkActions = null
|
||
}
|
||
if (this._needsLineBreakConversion)
|
||
str = str.replace(LINEBREAK_REGEX, "<br>");
|
||
this._htmlstr = str
|
||
}
|
||
return this._htmlstr
|
||
}
|
||
attachLinkHandlers(parentElem) {
|
||
if (!this._linkActions.length)
|
||
return;
|
||
for (let i = 0, len = this._linkActions.length; i < len; ++i) {
|
||
const linkAction = this._linkActions[i];
|
||
if (typeof linkAction !== "function")
|
||
continue;
|
||
const linkElem = parentElem.querySelector(".bblink" + i);
|
||
if (!linkElem)
|
||
throw new Error("unable to attach BBString link handler");
|
||
linkElem.onclick = linkAction
|
||
}
|
||
}
|
||
equals(s) {
|
||
if (s instanceof C3.HtmlString)
|
||
return this.toHTML() === s.toHTML();
|
||
else if (s instanceof C3.BBString)
|
||
return this._bbstr === s._bbstr;
|
||
else
|
||
return this._bbstr === s
|
||
}
|
||
toFragmentList() {
|
||
if (this._hasParsedFragments)
|
||
return this._fragments;
|
||
const bbStr = this._bbstr;
|
||
const styleStack = [];
|
||
CUSTOM_BBREGEX.lastIndex = 0;
|
||
let prevIndex = 0;
|
||
let result = null;
|
||
while ((result = CUSTOM_BBREGEX.exec(bbStr)) !== null) {
|
||
const index = result.index;
|
||
if (index > 0 && bbStr.charAt(index - 1) === "\\")
|
||
continue;
|
||
const matchStr = result[0];
|
||
const closeSlash = result[1];
|
||
const tagName = result[2];
|
||
const strFrag = bbStr.substring(prevIndex, index);
|
||
prevIndex = index + matchStr.length;
|
||
if (strFrag)
|
||
this._fragments.push({
|
||
text: strFrag,
|
||
styles: styleStack.slice(0)
|
||
});
|
||
if (!tagName)
|
||
continue;
|
||
if (closeSlash) {
|
||
const lowerTagName = tagName.toLowerCase();
|
||
for (let i = styleStack.length - 1; i >= 0; --i)
|
||
if (styleStack[i].tag === lowerTagName) {
|
||
styleStack.splice(i, 1);
|
||
break
|
||
}
|
||
} else {
|
||
let tag = tagName;
|
||
let param = null;
|
||
const eq = tagName.indexOf("=");
|
||
if (eq !== -1) {
|
||
tag = tagName.substring(0, eq).toLowerCase();
|
||
param = tagName.substring(eq + 1)
|
||
} else
|
||
tag = tag.toLowerCase();
|
||
styleStack.push({
|
||
tag,
|
||
param
|
||
})
|
||
}
|
||
}
|
||
if (prevIndex < bbStr.length)
|
||
this._fragments.push({
|
||
text: bbStr.substring(prevIndex),
|
||
styles: styleStack.slice(0)
|
||
});
|
||
for (const frag of this._fragments)
|
||
frag.text = this._ProcessBBCodeEscapeSequences(frag.text);
|
||
this._hasParsedFragments = true;
|
||
return this._fragments
|
||
}
|
||
_ProcessBBCodeEscapeSequences(text) {
|
||
text = C3.ReplaceAll(text, "\\[", "[");
|
||
return C3.ReplaceAll(text, "\\\\", "\\")
|
||
}
|
||
static StripTags(str) {
|
||
return C3.New(C3.BBString, str, {
|
||
noEscape: true
|
||
}).toPlainText()
|
||
}
|
||
static StripAnyTags(str) {
|
||
return str.replace(CUSTOM_BBREGEX, "")
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.WordWrap = class WordWrap {
|
||
constructor() {
|
||
this._lines = []
|
||
}
|
||
GetLines() {
|
||
return this._lines
|
||
}
|
||
GetLineCount() {
|
||
return this._lines.length
|
||
}
|
||
_MeasureLine(line, measureFunc) {
|
||
let width = 0;
|
||
let height = 0;
|
||
for (const frag of line) {
|
||
if (frag.width === -1) {
|
||
const m = measureFunc(frag.text, frag.styles);
|
||
frag.width = m.width;
|
||
frag.height = m.height
|
||
}
|
||
width += frag.width;
|
||
height = Math.max(height, frag.height)
|
||
}
|
||
return {
|
||
width,
|
||
height
|
||
}
|
||
}
|
||
_AddLine(fragments, width, height) {
|
||
this._lines.push({
|
||
fragments,
|
||
width,
|
||
height
|
||
})
|
||
}
|
||
WordWrap(fragmentArr, measureFunc, wrapWidth, wrapMode, endOfLineMargin) {
|
||
if (typeof fragmentArr === "string")
|
||
fragmentArr = [{
|
||
text: fragmentArr,
|
||
styles: []
|
||
}];
|
||
C3.clearArray(this._lines);
|
||
if (!fragmentArr.length || fragmentArr.length === 1 && !fragmentArr[0].text.length || wrapWidth < 2)
|
||
return;
|
||
if (fragmentArr.length === 1) {
|
||
const frag = fragmentArr[0];
|
||
const text = frag.text;
|
||
const styles = frag.styles;
|
||
if (text.length <= 100 && !text.includes("\n")) {
|
||
let {width, height} = measureFunc(text, styles);
|
||
width += endOfLineMargin;
|
||
if (width <= wrapWidth) {
|
||
this._AddLine([{
|
||
text,
|
||
styles,
|
||
width,
|
||
height
|
||
}], width, height);
|
||
return
|
||
}
|
||
}
|
||
}
|
||
let tokenisedFragments;
|
||
if (wrapMode === "word")
|
||
tokenisedFragments = this._TokeniseWords(fragmentArr);
|
||
else {
|
||
tokenisedFragments = [];
|
||
for (const frag of fragmentArr)
|
||
C3.appendArray(tokenisedFragments, [...frag.text].map(ch=>[{
|
||
text: ch,
|
||
styles: frag.styles
|
||
}]))
|
||
}
|
||
this._WrapText(tokenisedFragments, measureFunc, wrapWidth, endOfLineMargin)
|
||
}
|
||
_TokeniseWords(fragmentArr) {
|
||
const ret = [];
|
||
let curWord = [];
|
||
let isCurWhitespace = false;
|
||
for (const frag of fragmentArr) {
|
||
const text = frag.text;
|
||
const styles = frag.styles;
|
||
for (const ch of text)
|
||
if (ch === "\n") {
|
||
if (curWord.length > 0)
|
||
ret.push(curWord);
|
||
ret.push([{
|
||
text: "\n",
|
||
styles
|
||
}]);
|
||
curWord = []
|
||
} else if (curWord.length === 0) {
|
||
curWord.push({
|
||
text: ch,
|
||
styles
|
||
});
|
||
isCurWhitespace = C3.IsWhitespaceChar(ch)
|
||
} else {
|
||
const isWhitespace = C3.IsWhitespaceChar(ch);
|
||
if (isWhitespace === isCurWhitespace) {
|
||
const curFrag = curWord[curWord.length - 1];
|
||
if (curFrag.styles === styles)
|
||
curFrag.text += ch;
|
||
else
|
||
curWord.push({
|
||
text: ch,
|
||
styles
|
||
})
|
||
} else {
|
||
ret.push(curWord);
|
||
curWord = [];
|
||
curWord.push({
|
||
text: ch,
|
||
styles
|
||
});
|
||
isCurWhitespace = isWhitespace
|
||
}
|
||
}
|
||
}
|
||
if (curWord.length > 0)
|
||
ret.push(curWord);
|
||
return ret
|
||
}
|
||
_CopyLine(line) {
|
||
return line.map(f=>({
|
||
text: f.text,
|
||
styles: f.styles,
|
||
width: f.width,
|
||
height: f.height
|
||
}))
|
||
}
|
||
_AddWordToLine(currentLine, curWord) {
|
||
const lastFrag = currentLine.length ? currentLine[currentLine.length - 1] : null;
|
||
let i = 0;
|
||
if (lastFrag && curWord[0].styles === lastFrag.styles) {
|
||
lastFrag.text += curWord[0].text;
|
||
lastFrag.width = -1;
|
||
lastFrag.height = -1;
|
||
i = 1
|
||
}
|
||
for (let len = curWord.length; i < len; ++i) {
|
||
const f = curWord[i];
|
||
currentLine.push({
|
||
text: f.text,
|
||
styles: f.styles,
|
||
width: -1,
|
||
height: -1
|
||
})
|
||
}
|
||
}
|
||
_WrapText(tokenisedFragments, measureFunc, wrapWidth, endOfLineMargin) {
|
||
let currentLine = [];
|
||
let currentLineWidth = 0;
|
||
let currentLineHeight = 0;
|
||
for (const curWord of tokenisedFragments) {
|
||
if (curWord.length === 1 && curWord[0].text === "\n") {
|
||
if (currentLineHeight === 0)
|
||
currentLineHeight = measureFunc(" ", curWord[0].styles).height;
|
||
this._AddLine(currentLine, currentLineWidth, currentLineHeight);
|
||
currentLine = [];
|
||
currentLineWidth = 0;
|
||
currentLineHeight = 0;
|
||
continue
|
||
}
|
||
const tryLine = this._CopyLine(currentLine);
|
||
this._AddWordToLine(tryLine, curWord);
|
||
const tryMetrics = this._MeasureLine(tryLine, measureFunc);
|
||
const tryLineWidth = tryMetrics.width;
|
||
const tryLineHeight = tryMetrics.height;
|
||
if (tryLineWidth >= wrapWidth) {
|
||
if (currentLine.length > 0)
|
||
this._AddLine(currentLine, currentLineWidth, currentLineHeight);
|
||
currentLine = [];
|
||
if (C3.IsStringAllWhitespace(curWord[0].text)) {
|
||
currentLineWidth = 0;
|
||
currentLineHeight = 0
|
||
} else {
|
||
this._AddWordToLine(currentLine, curWord);
|
||
const metrics = this._MeasureLine(currentLine, measureFunc);
|
||
currentLineWidth = metrics.width;
|
||
currentLineHeight = metrics.height
|
||
}
|
||
} else {
|
||
currentLine = tryLine;
|
||
currentLineWidth = tryLineWidth;
|
||
currentLineHeight = tryLineHeight
|
||
}
|
||
}
|
||
if (currentLine.length > 0)
|
||
this._AddLine(currentLine, currentLineWidth, currentLineHeight);
|
||
this._TrimLinesTrailingWhitespace(measureFunc, endOfLineMargin)
|
||
}
|
||
_TrimLinesTrailingWhitespace(measureFunc, endOfLineMargin) {
|
||
for (const line of this._lines) {
|
||
const fragments = line.fragments;
|
||
if (!fragments.length)
|
||
continue;
|
||
let lastFrag = fragments[fragments.length - 1];
|
||
const text = lastFrag.text;
|
||
const trimmedText = text.trimEnd();
|
||
if (!trimmedText) {
|
||
line.width -= lastFrag.width;
|
||
fragments.pop()
|
||
} else if (trimmedText.length < text.length) {
|
||
const trimmedWidth = measureFunc(trimmedText, lastFrag.styles).width;
|
||
const diff = lastFrag.width - trimmedWidth;
|
||
lastFrag.width = trimmedWidth;
|
||
lastFrag.text = trimmedText;
|
||
line.width -= diff
|
||
}
|
||
if (endOfLineMargin !== 0 && fragments.length > 0) {
|
||
lastFrag = fragments[fragments.length - 1];
|
||
lastFrag.width += endOfLineMargin;
|
||
line.width += endOfLineMargin
|
||
}
|
||
}
|
||
}
|
||
Clear() {
|
||
C3.clearArray(this._lines)
|
||
}
|
||
GetMaxLineWidth() {
|
||
return this._lines.reduce((a,v)=>Math.max(a, v.width), 0)
|
||
}
|
||
GetTotalLineHeight() {
|
||
return this._lines.reduce((a,v)=>a + v.height, 0)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
self.C3.Gfx = {};
|
||
'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const PERSPECTIVE_NEAR_Z = 1;
|
||
const PERSPECTIVE_FAR_Z = 1E4;
|
||
const fTempo = [0, 0, 0, 0, 0, 0, 0, 0];
|
||
const glMatrix = self.glMatrix;
|
||
const vec3 = glMatrix.vec3;
|
||
const mat4 = glMatrix.mat4;
|
||
const tmpVec3 = vec3.fromValues(0, 0, 0);
|
||
C3.Gfx.RendererBase = class RendererBase {
|
||
constructor() {
|
||
this._width = 0;
|
||
this._height = 0;
|
||
this._cam = vec3.fromValues(0, 0, 100);
|
||
this._look = vec3.fromValues(0, 0, 0);
|
||
this._up = vec3.fromValues(0, 1, 0);
|
||
this._worldScale = vec3.fromValues(1, 1, 1);
|
||
this._matP = mat4.create();
|
||
this._matMV = mat4.create();
|
||
this._lastMV = mat4.create();
|
||
this._allShaderPrograms = [];
|
||
this._shaderProgramsByName = new Map;
|
||
this._spTextureFill = null;
|
||
this._stateGroups = new Map;
|
||
this._currentStateGroup = null;
|
||
this._blendModeTable = [];
|
||
this._namedBlendModeMap = new Map;
|
||
this._frameNumber = 0;
|
||
this._enableMipmaps = true
|
||
}
|
||
FillIndexBufferData(indexData) {
|
||
let i = 0
|
||
, len = indexData.length
|
||
, fv = 0;
|
||
while (i < len) {
|
||
indexData[i++] = fv;
|
||
indexData[i++] = fv + 1;
|
||
indexData[i++] = fv + 2;
|
||
indexData[i++] = fv;
|
||
indexData[i++] = fv + 2;
|
||
indexData[i++] = fv + 3;
|
||
fv += 4
|
||
}
|
||
}
|
||
Project(x, y, w, h, out) {
|
||
const mv = this._matMV;
|
||
const proj = this._matP;
|
||
for (let i = 0, len = fTempo.length; i < len; ++i)
|
||
fTempo[i] = 0;
|
||
fTempo[0] = mv[0] * x + mv[4] * y + mv[12];
|
||
fTempo[1] = mv[1] * x + mv[5] * y + mv[13];
|
||
fTempo[2] = mv[2] * x + mv[6] * y + mv[14];
|
||
fTempo[3] = mv[3] * x + mv[7] * y + mv[15];
|
||
fTempo[4] = proj[0] * fTempo[0] + proj[4] * fTempo[1] + proj[8] * fTempo[2] + proj[12] * fTempo[3];
|
||
fTempo[5] = proj[1] * fTempo[0] + proj[5] * fTempo[1] + proj[9] * fTempo[2] + proj[13] * fTempo[3];
|
||
fTempo[6] = proj[2] * fTempo[0] + proj[6] * fTempo[1] + proj[10] * fTempo[2] + proj[14] * fTempo[3];
|
||
fTempo[7] = -fTempo[2];
|
||
if (fTempo[7] === 0)
|
||
return;
|
||
fTempo[7] = 1 / fTempo[7];
|
||
fTempo[4] *= fTempo[7];
|
||
fTempo[5] *= fTempo[7];
|
||
fTempo[6] *= fTempo[7];
|
||
out[0] = (fTempo[4] * .5 + .5) * w;
|
||
out[1] = (fTempo[5] * .5 + .5) * h
|
||
}
|
||
GetWidth() {
|
||
return this._width
|
||
}
|
||
GetHeight() {
|
||
return this._height
|
||
}
|
||
GetNearZ() {
|
||
return PERSPECTIVE_NEAR_Z
|
||
}
|
||
GetFarZ() {
|
||
return PERSPECTIVE_FAR_Z
|
||
}
|
||
SetCameraXYZ(x, y, z) {
|
||
this._cam[0] = x * this._worldScale[0];
|
||
this._cam[1] = y * this._worldScale[1];
|
||
this._cam[2] = z
|
||
}
|
||
SetLookXYZ(x, y, z) {
|
||
this._look[0] = x * this._worldScale[0];
|
||
this._look[1] = y * this._worldScale[1];
|
||
this._look[2] = z
|
||
}
|
||
ResetModelView(alternateUpVector) {
|
||
mat4.lookAt(this._matMV, this._cam, this._look, alternateUpVector || this._up);
|
||
mat4.scale(this._matMV, this._matMV, this._worldScale)
|
||
}
|
||
Translate(x, y) {
|
||
if (x === 0 && y === 0)
|
||
return;
|
||
tmpVec3[0] = x;
|
||
tmpVec3[1] = y;
|
||
tmpVec3[2] = 0;
|
||
mat4.translate(this._matMV, this._matMV, tmpVec3)
|
||
}
|
||
Scale(x, y) {
|
||
if (x === 1 && y === 1)
|
||
return;
|
||
tmpVec3[0] = x;
|
||
tmpVec3[1] = y;
|
||
tmpVec3[2] = 1;
|
||
mat4.scale(this._matMV, this._matMV, tmpVec3)
|
||
}
|
||
RotateZ(a) {
|
||
if (a === 0)
|
||
return;
|
||
mat4.rotateZ(this._matMV, this._matMV, a)
|
||
}
|
||
_AddShaderProgram(sp) {
|
||
this._allShaderPrograms.push(sp);
|
||
this._shaderProgramsByName.set(sp.GetName(), sp)
|
||
}
|
||
_RemoveShaderProgram(sp) {
|
||
const i = this._allShaderPrograms.indexOf(sp);
|
||
if (i !== -1)
|
||
this._allShaderPrograms.splice(i, 1);
|
||
this._shaderProgramsByName.delete(sp.GetName())
|
||
}
|
||
_ClearAllShaderPrograms() {
|
||
C3.clearArray(this._allShaderPrograms);
|
||
this._shaderProgramsByName.clear()
|
||
}
|
||
GetShaderProgramByName(name) {
|
||
return this._shaderProgramsByName.get(name) || null
|
||
}
|
||
GetTextureFillShaderProgram() {
|
||
return this._spTextureFill
|
||
}
|
||
_SetCurrentStateGroup(sg) {
|
||
this._currentStateGroup = sg
|
||
}
|
||
GetCurrentStateGroup() {
|
||
return this._currentStateGroup
|
||
}
|
||
AcquireStateGroup(shaderProgram_or_name, blendMode, color, zElevation) {
|
||
const key = C3.Gfx.StateGroup.MakeKey(shaderProgram_or_name, blendMode, color, zElevation);
|
||
let stateGroup = this._stateGroups.get(key);
|
||
if (!stateGroup) {
|
||
stateGroup = C3.New(C3.Gfx.StateGroup, this, shaderProgram_or_name, blendMode, color, zElevation);
|
||
this._stateGroups.set(key, stateGroup)
|
||
}
|
||
stateGroup.AddRef();
|
||
return stateGroup
|
||
}
|
||
ReleaseStateGroup(stateGroup) {
|
||
stateGroup.DecRef();
|
||
if (stateGroup._GetRefCount() === 0) {
|
||
if (this._currentStateGroup === stateGroup)
|
||
this._currentStateGroup = null;
|
||
this._stateGroups.delete(stateGroup.GetKey());
|
||
stateGroup.Release()
|
||
}
|
||
}
|
||
_InitBlendModeData(blendModeData) {
|
||
C3.clearArray(this._blendModeTable);
|
||
this._namedBlendModeMap.clear();
|
||
for (const bmd of blendModeData) {
|
||
const name = bmd[0];
|
||
const srcBlend = bmd[1];
|
||
const destBlend = bmd[2];
|
||
this._blendModeTable.push([srcBlend, destBlend]);
|
||
this._namedBlendModeMap.set(name, {
|
||
srcBlend,
|
||
destBlend
|
||
})
|
||
}
|
||
}
|
||
_GetBlendByIndex(blendIndex) {
|
||
return this._blendModeTable[blendIndex]
|
||
}
|
||
GetSrcBlendByIndex(blendIndex) {
|
||
return this._GetBlendByIndex(blendIndex)[0]
|
||
}
|
||
GetDestBlendByIndex(blendIndex) {
|
||
return this._GetBlendByIndex(blendIndex)[1]
|
||
}
|
||
GetNamedBlend(blendName) {
|
||
const ret = this._namedBlendModeMap.get(blendName);
|
||
if (typeof ret === "undefined")
|
||
throw new Error("invalid blend name");
|
||
return ret
|
||
}
|
||
Finish() {
|
||
this.EndBatch();
|
||
this._frameNumber++
|
||
}
|
||
GetFrameNumber() {
|
||
return this._frameNumber
|
||
}
|
||
IncrementFrameNumber() {
|
||
this._frameNumber++
|
||
}
|
||
SetMipmapsEnabled(e) {
|
||
this._enableMipmaps = !!e
|
||
}
|
||
AreMipmapsEnabled() {
|
||
return this._enableMipmaps
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Gfx.StateGroup = class StateGroup {
|
||
constructor(renderer, shaderProgram_or_name, blendMode, color, zElevation) {
|
||
this._renderer = renderer;
|
||
this._refCount = 0;
|
||
this._shaderProgram = null;
|
||
this._shaderProgramName = "";
|
||
this._blendMode = blendMode;
|
||
this._color = C3.New(C3.Color);
|
||
this._color.set(color);
|
||
this._zElevation = zElevation;
|
||
if (typeof shaderProgram_or_name === "string")
|
||
this._shaderProgramName = shaderProgram_or_name;
|
||
else {
|
||
this._shaderProgram = shaderProgram_or_name;
|
||
this._shaderProgramName = this._shaderProgram.GetName()
|
||
}
|
||
}
|
||
Release() {
|
||
if (this._refCount > 0)
|
||
throw new Error("releasing state group still in use");
|
||
this._renderer = null;
|
||
this._shaderProgram = null;
|
||
this._shaderProgramName = ""
|
||
}
|
||
Apply() {
|
||
const renderer = this._renderer;
|
||
renderer.SetProgram(this._shaderProgram);
|
||
renderer.SetBlendMode(this._blendMode);
|
||
renderer.SetColor(this._color);
|
||
renderer.SetCurrentZ(this._zElevation);
|
||
renderer._SetCurrentStateGroup(this)
|
||
}
|
||
GetKey() {
|
||
return C3.Gfx.StateGroup.MakeKey(this._shaderProgramName, this._blendMode, this._color, this._zElevation)
|
||
}
|
||
AddRef() {
|
||
++this._refCount
|
||
}
|
||
DecRef() {
|
||
--this._refCount
|
||
}
|
||
_GetRefCount() {
|
||
return this._refCount
|
||
}
|
||
OnContextLost() {
|
||
this._shaderProgram = null
|
||
}
|
||
OnContextRestored(renderer) {
|
||
this._shaderProgram = renderer.GetShaderProgramByName(this._shaderProgramName);
|
||
if (!this._shaderProgram)
|
||
throw new Error("failed to restore shader program");
|
||
}
|
||
static MakeKey(shaderProgram_or_name, blendMode, c, zElevation) {
|
||
const shaderProgramName = typeof shaderProgram_or_name === "string" ? shaderProgram_or_name : shaderProgram_or_name.GetName();
|
||
return shaderProgramName + "," + blendMode + "," + c.getR() + "," + c.getG() + "," + c.getB() + "," + c.getA() + "," + zElevation
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const tempQuadPos = C3.New(C3.Quad);
|
||
const tempQuadTex = C3.New(C3.Quad);
|
||
function interpolateQuad(srcX, srcY, quad) {
|
||
const qtlx = quad.getTlx();
|
||
const qtly = quad.getTly();
|
||
const qtrx = quad.getTrx() - qtlx;
|
||
const qtry = quad.getTry() - qtly;
|
||
const qblx = quad.getBlx() - qtlx;
|
||
const qbly = quad.getBly() - qtly;
|
||
const xix = qtrx * srcX;
|
||
const xiy = qtry * srcX;
|
||
const yix = qblx * srcY;
|
||
const yiy = qbly * srcY;
|
||
return [qtlx + xix + yix, qtly + xiy + yiy]
|
||
}
|
||
class MeshPoint {
|
||
constructor(mesh) {
|
||
this._mesh = mesh;
|
||
this._x = NaN;
|
||
this._y = NaN;
|
||
this._u = NaN;
|
||
this._v = NaN;
|
||
this._x = 0;
|
||
this._y = 0;
|
||
this._u = 0;
|
||
this._v = 0
|
||
}
|
||
_Init(x, y, u, v) {
|
||
this._x = x;
|
||
this._y = y;
|
||
this._u = u;
|
||
this._v = v
|
||
}
|
||
GetX() {
|
||
return this._x
|
||
}
|
||
SetX(x) {
|
||
if (this._x === x)
|
||
return;
|
||
this._x = x;
|
||
this._mesh._SetPointsChanged()
|
||
}
|
||
GetY() {
|
||
return this._y
|
||
}
|
||
SetY(y) {
|
||
if (this._y === y)
|
||
return;
|
||
this._y = y;
|
||
this._mesh._SetPointsChanged()
|
||
}
|
||
GetU() {
|
||
return this._u
|
||
}
|
||
SetU(u) {
|
||
this._u = u
|
||
}
|
||
GetV() {
|
||
return this._v
|
||
}
|
||
SetV(v) {
|
||
this._v = v
|
||
}
|
||
_Interpolate_TexRect(srcPoint, quadPos, rcTex) {
|
||
[this._x,this._y] = interpolateQuad(srcPoint._x, srcPoint._y, quadPos);
|
||
this._u = C3.lerp(rcTex.getLeft(), rcTex.getRight(), srcPoint._u);
|
||
this._v = C3.lerp(rcTex.getTop(), rcTex.getBottom(), srcPoint._v)
|
||
}
|
||
_Interpolate_TexQuad(srcPoint, quadPos, quadTex) {
|
||
[this._x,this._y] = interpolateQuad(srcPoint._x, srcPoint._y, quadPos);
|
||
[this._u,this._v] = interpolateQuad(srcPoint._u, srcPoint._v, quadTex)
|
||
}
|
||
}
|
||
C3.Gfx.Mesh = class Mesh {
|
||
constructor(hsize, vsize) {
|
||
if (hsize < 2 || vsize < 2)
|
||
throw new Error("invalid mesh size");
|
||
this._hsize = hsize;
|
||
this._vsize = vsize;
|
||
this._pts = [];
|
||
this._minX = 0;
|
||
this._minY = 0;
|
||
this._maxX = 1;
|
||
this._maxY = 1;
|
||
this._pointsChanged = false;
|
||
const lastX = hsize - 1;
|
||
const lastY = vsize - 1;
|
||
for (let y = 0; y < vsize; ++y) {
|
||
const row = [];
|
||
for (let x = 0; x < hsize; ++x) {
|
||
const meshPoint = C3.New(MeshPoint, this);
|
||
const xf = x / lastX;
|
||
const yf = y / lastY;
|
||
meshPoint._Init(xf, yf, xf, yf);
|
||
row.push(meshPoint)
|
||
}
|
||
this._pts.push(row)
|
||
}
|
||
}
|
||
Release() {
|
||
C3.clearArray(this._pts)
|
||
}
|
||
GetHSize() {
|
||
return this._hsize
|
||
}
|
||
GetVSize() {
|
||
return this._vsize
|
||
}
|
||
_SetPointsChanged() {
|
||
this._pointsChanged = true
|
||
}
|
||
_MaybeComputeBounds() {
|
||
if (!this._pointsChanged)
|
||
return;
|
||
let minX = Infinity;
|
||
let minY = Infinity;
|
||
let maxX = -Infinity;
|
||
let maxY = -Infinity;
|
||
for (const row of this._pts)
|
||
for (const meshPoint of row) {
|
||
const x = meshPoint.GetX();
|
||
const y = meshPoint.GetY();
|
||
minX = Math.min(minX, x);
|
||
minY = Math.min(minY, y);
|
||
maxX = Math.max(maxX, x);
|
||
maxY = Math.max(maxY, y)
|
||
}
|
||
this._minX = minX;
|
||
this._minY = minY;
|
||
this._maxX = maxX;
|
||
this._maxY = maxY;
|
||
this._pointsChanged = false
|
||
}
|
||
GetMinX() {
|
||
this._MaybeComputeBounds();
|
||
return this._minX
|
||
}
|
||
GetMinY() {
|
||
this._MaybeComputeBounds();
|
||
return this._minY
|
||
}
|
||
GetMaxX() {
|
||
this._MaybeComputeBounds();
|
||
return this._maxX
|
||
}
|
||
GetMaxY() {
|
||
this._MaybeComputeBounds();
|
||
return this._maxY
|
||
}
|
||
GetMeshPointAt(x, y) {
|
||
x = Math.floor(x);
|
||
y = Math.floor(y);
|
||
if (x < 0 || x >= this._hsize || y < 0 || y >= this._vsize)
|
||
return null;
|
||
return this._pts[y][x]
|
||
}
|
||
CalculateTransformedMesh(srcMesh, quadPos, rcTex_or_quad) {
|
||
const isTexRect = rcTex_or_quad instanceof C3.Rect;
|
||
if (srcMesh.GetHSize() !== this.GetHSize() || srcMesh.GetVSize() !== this.GetVSize())
|
||
throw new Error("source mesh wrong size");
|
||
const srcPts = srcMesh._pts;
|
||
const destPts = this._pts;
|
||
for (let y = 0, lenY = destPts.length; y < lenY; ++y) {
|
||
const srcRow = srcPts[y];
|
||
const destRow = destPts[y];
|
||
for (let x = 0, lenX = destRow.length; x < lenX; ++x) {
|
||
const srcPoint = srcRow[x];
|
||
const destPoint = destRow[x];
|
||
if (isTexRect)
|
||
destPoint._Interpolate_TexRect(srcPoint, quadPos, rcTex_or_quad);
|
||
else
|
||
destPoint._Interpolate_TexQuad(srcPoint, quadPos, rcTex_or_quad)
|
||
}
|
||
}
|
||
}
|
||
Draw(renderer) {
|
||
const pts = this._pts;
|
||
let prevRow = pts[0];
|
||
for (let y = 1, lenY = pts.length; y < lenY; ++y) {
|
||
const row = pts[y];
|
||
let tl = prevRow[0];
|
||
let bl = row[0];
|
||
for (let x = 1, lenX = row.length; x < lenX; ++x) {
|
||
const tr = prevRow[x];
|
||
const br = row[x];
|
||
tempQuadPos.set(tl.GetX(), tl.GetY(), tr.GetX(), tr.GetY(), br.GetX(), br.GetY(), bl.GetX(), bl.GetY());
|
||
tempQuadTex.set(tl.GetU(), tl.GetV(), tr.GetU(), tr.GetV(), br.GetU(), br.GetV(), bl.GetU(), bl.GetV());
|
||
renderer.Quad4(tempQuadPos, tempQuadTex);
|
||
tl = tr;
|
||
bl = br
|
||
}
|
||
prevRow = row
|
||
}
|
||
}
|
||
Outline(renderer) {
|
||
const pts = this._pts;
|
||
let prevRow = pts[0];
|
||
for (let y = 1, lenY = pts.length; y < lenY; ++y) {
|
||
const row = pts[y];
|
||
let tl = prevRow[0];
|
||
let bl = row[0];
|
||
for (let x = 1, lenX = row.length; x < lenX; ++x) {
|
||
const tr = prevRow[x];
|
||
const br = row[x];
|
||
const tlx = tl.GetX();
|
||
const tly = tl.GetY();
|
||
const trx = tr.GetX();
|
||
const try_ = tr.GetY();
|
||
const brx = br.GetX();
|
||
const bry = br.GetY();
|
||
const blx = bl.GetX();
|
||
const bly = bl.GetY();
|
||
renderer.Line(tlx, tly, trx, try_);
|
||
renderer.Line(tlx, tly, brx, bry);
|
||
renderer.Line(tlx, tly, blx, bly);
|
||
if (x === lenX - 1)
|
||
renderer.Line(trx, try_, brx, bry);
|
||
if (y === lenY - 1)
|
||
renderer.Line(blx, bly, brx, bry);
|
||
tl = tr;
|
||
bl = br
|
||
}
|
||
prevRow = row
|
||
}
|
||
}
|
||
InsertPolyMeshVertices(srcPoly) {
|
||
const RAY_EXT_DIST = .001;
|
||
const MIN_RAY_DIST = 0;
|
||
const MAX_RAY_DIST = .99999999;
|
||
const inPts = srcPoly.pointsArr();
|
||
const outPts = [];
|
||
const colCount = this.GetHSize() - 1;
|
||
const rowCount = this.GetVSize() - 1;
|
||
const colWidthNorm = 1 / colCount;
|
||
const rowHeightNorm = 1 / rowCount;
|
||
const lastCol = colCount - 1;
|
||
const lastRow = rowCount - 1;
|
||
let curX = inPts[0];
|
||
let curY = inPts[1];
|
||
let curCol = C3.clamp(Math.floor(curX * colCount), 0, lastCol);
|
||
let curRow = C3.clamp(Math.floor(curY * rowCount), 0, lastRow);
|
||
let isUpper = true;
|
||
let nextX = 0;
|
||
let nextY = 0;
|
||
let rayHit = 0;
|
||
const NOTHING_DISABLED = -1;
|
||
const DISABLE_DIAGONAL = 0;
|
||
const DISABLE_LEFT_EDGE = 1;
|
||
const DISABLE_TOP_EDGE = 2;
|
||
const DISABLE_RIGHT_EDGE = 3;
|
||
const DISABLE_BOTTOM_EDGE = 4;
|
||
let disableCheck = NOTHING_DISABLED;
|
||
const addVertexAtRayHit = ()=>{
|
||
curX = C3.clamp(C3.lerp(curX, nextX, rayHit), 0, 1);
|
||
curY = C3.clamp(C3.lerp(curY, nextY, rayHit), 0, 1);
|
||
outPts.push(curX, curY)
|
||
}
|
||
;
|
||
for (let i = 0, len = inPts.length; i < len; i += 2) {
|
||
curX = inPts[i];
|
||
curY = inPts[i + 1];
|
||
outPts.push(curX, curY);
|
||
curCol = C3.clamp(Math.floor(curX * colCount), 0, lastCol);
|
||
curRow = C3.clamp(Math.floor(curY * rowCount), 0, lastRow);
|
||
const j = (i + 2) % len;
|
||
nextX = inPts[j];
|
||
nextY = inPts[j + 1];
|
||
disableCheck = NOTHING_DISABLED;
|
||
while (true) {
|
||
if (outPts.length > 1E6)
|
||
throw new Error("Too many mesh poly points");
|
||
const srcTlx = curCol * colWidthNorm;
|
||
const srcTly = curRow * rowHeightNorm;
|
||
const srcBrx = (curCol + 1) * colWidthNorm;
|
||
const srcBry = (curRow + 1) * rowHeightNorm;
|
||
isUpper = C3.isPointInTriangleInclusive(curX, curY, srcTlx, srcTly, srcBrx, srcTly, srcBrx, srcBry);
|
||
if (disableCheck !== DISABLE_DIAGONAL) {
|
||
rayHit = C3.rayIntersectExtended(curX, curY, nextX, nextY, srcTlx, srcTly, srcBrx, srcBry, -RAY_EXT_DIST);
|
||
if (rayHit >= MIN_RAY_DIST && rayHit <= MAX_RAY_DIST) {
|
||
addVertexAtRayHit();
|
||
isUpper = !isUpper;
|
||
disableCheck = DISABLE_DIAGONAL;
|
||
continue
|
||
}
|
||
}
|
||
if (curRow > 0 && disableCheck !== DISABLE_TOP_EDGE) {
|
||
rayHit = C3.rayIntersectExtended(curX, curY, nextX, nextY, srcTlx, srcTly, srcBrx, srcTly, RAY_EXT_DIST);
|
||
if (rayHit >= MIN_RAY_DIST && rayHit <= MAX_RAY_DIST) {
|
||
addVertexAtRayHit();
|
||
curRow--;
|
||
isUpper = false;
|
||
disableCheck = DISABLE_BOTTOM_EDGE;
|
||
continue
|
||
}
|
||
}
|
||
if (curCol < lastCol && disableCheck !== DISABLE_RIGHT_EDGE) {
|
||
rayHit = C3.rayIntersectExtended(curX, curY, nextX, nextY, srcBrx, srcTly, srcBrx, srcBry, RAY_EXT_DIST);
|
||
if (rayHit >= MIN_RAY_DIST && rayHit <= MAX_RAY_DIST) {
|
||
addVertexAtRayHit();
|
||
curCol++;
|
||
isUpper = false;
|
||
disableCheck = DISABLE_LEFT_EDGE;
|
||
continue
|
||
}
|
||
}
|
||
if (curCol > 0 && disableCheck !== DISABLE_LEFT_EDGE) {
|
||
rayHit = C3.rayIntersectExtended(curX, curY, nextX, nextY, srcTlx, srcTly, srcTlx, srcBry, RAY_EXT_DIST);
|
||
if (rayHit >= MIN_RAY_DIST && rayHit <= MAX_RAY_DIST) {
|
||
addVertexAtRayHit();
|
||
curCol--;
|
||
isUpper = true;
|
||
disableCheck = DISABLE_RIGHT_EDGE;
|
||
continue
|
||
}
|
||
}
|
||
if (curRow < lastRow && disableCheck !== DISABLE_BOTTOM_EDGE) {
|
||
rayHit = C3.rayIntersectExtended(curX, curY, nextX, nextY, srcTlx, srcBry, srcBrx, srcBry, RAY_EXT_DIST);
|
||
if (rayHit >= MIN_RAY_DIST && rayHit <= MAX_RAY_DIST) {
|
||
addVertexAtRayHit();
|
||
curRow++;
|
||
isUpper = true;
|
||
disableCheck = DISABLE_TOP_EDGE;
|
||
continue
|
||
}
|
||
}
|
||
break
|
||
}
|
||
}
|
||
return C3.New(C3.CollisionPoly, outPts)
|
||
}
|
||
TransformCollisionPoly(srcPoly, destPoly) {
|
||
const ptsArr = this._TransformPolyPoints(srcPoly);
|
||
this._SimplifyPoly(ptsArr);
|
||
destPoly.setPoints(ptsArr)
|
||
}
|
||
_TransformPolyPoints(srcPoly) {
|
||
const outPts = [];
|
||
const ptsArr = srcPoly.pointsArr();
|
||
for (let i = 0, len = ptsArr.length; i < len; i += 2) {
|
||
const srcX = ptsArr[i];
|
||
const srcY = ptsArr[i + 1];
|
||
const [destX,destY] = this.TransformPoint(srcX, srcY);
|
||
outPts.push(destX, destY)
|
||
}
|
||
return outPts
|
||
}
|
||
TransformPoint(srcX, srcY) {
|
||
const lastCol = this.GetHSize() - 1;
|
||
const lastRow = this.GetVSize() - 1;
|
||
const colWidthNorm = 1 / lastCol;
|
||
const rowHeightNorm = 1 / lastRow;
|
||
const srcCol = C3.clamp(Math.floor(srcX * lastCol), 0, lastCol - 1);
|
||
const srcRow = C3.clamp(Math.floor(srcY * lastRow), 0, lastRow - 1);
|
||
const srcTlx = srcCol * colWidthNorm;
|
||
const srcTly = srcRow * rowHeightNorm;
|
||
const srcBrx = (srcCol + 1) * colWidthNorm;
|
||
const srcBry = (srcRow + 1) * rowHeightNorm;
|
||
const destTl = this.GetMeshPointAt(srcCol, srcRow);
|
||
const destBr = this.GetMeshPointAt(srcCol + 1, srcRow + 1);
|
||
const isUpper = C3.isPointInTriangleInclusive(srcX, srcY, srcTlx, srcTly, srcBrx, srcTly, srcBrx, srcBry);
|
||
const srcAltX = isUpper ? srcTlx + colWidthNorm : srcTlx;
|
||
const srcAltY = isUpper ? srcTly : srcTly + rowHeightNorm;
|
||
const destAlt = this.GetMeshPointAt(srcCol + (isUpper ? 1 : 0), srcRow + (isUpper ? 0 : 1));
|
||
const [u,v,w] = C3.triangleCartesianToBarycentric(srcX, srcY, srcTlx, srcTly, srcAltX, srcAltY, srcBrx, srcBry);
|
||
return C3.triangleBarycentricToCartesian(u, v, w, destTl.GetX(), destTl.GetY(), destAlt.GetX(), destAlt.GetY(), destBr.GetX(), destBr.GetY())
|
||
}
|
||
_SimplifyPoly(ptsArr) {
|
||
const outPts = [];
|
||
const EPSILON = 1E-7;
|
||
let curX = ptsArr[0];
|
||
let curY = ptsArr[1];
|
||
let lastDx = curX - ptsArr[ptsArr.length - 2];
|
||
let lastDy = curY - ptsArr[ptsArr.length - 1];
|
||
for (let i = 0, len = ptsArr.length; i < len; i += 2) {
|
||
const j = (i + 2) % len;
|
||
const nextX = ptsArr[j];
|
||
const nextY = ptsArr[j + 1];
|
||
const dx = nextX - curX;
|
||
const dy = nextY - curY;
|
||
const bothXNearZero = Math.abs(dx) < EPSILON && Math.abs(lastDx) < EPSILON && Math.sign(dy) === Math.sign(lastDy);
|
||
const bothYNearZero = Math.abs(dy) < EPSILON && Math.abs(lastDy) < EPSILON && Math.sign(dx) === Math.sign(lastDx);
|
||
if (!bothXNearZero && !bothYNearZero && Math.abs(dx / lastDx - dy / lastDy) > EPSILON || dx == 0 && dy === 0)
|
||
outPts.push(curX, curY);
|
||
curX = nextX;
|
||
curY = nextY;
|
||
lastDx = dx;
|
||
lastDy = dy
|
||
}
|
||
if (outPts.length < ptsArr.length)
|
||
C3.shallowAssignArray(ptsArr, outPts)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const VALID_PIXEL_FORMATS = new Set(["rgba8", "rgb8", "rgba4", "rgb5_a1", "rgb565"]);
|
||
const VALID_SAMPLINGS = new Set(["nearest", "bilinear", "trilinear"]);
|
||
const VALID_MIPMAP_QUALITIES = new Set(["default", "low", "high"]);
|
||
const VALID_WRAP_MODES = new Set(["clamp-to-edge", "repeat", "mirror-repeat"]);
|
||
function GetFormatSpecifiers(pixelFormat, gl) {
|
||
let sizedinternalformat;
|
||
let internalformat;
|
||
let format;
|
||
let type;
|
||
switch (pixelFormat) {
|
||
case "rgba8":
|
||
sizedinternalformat = gl.RGBA8;
|
||
internalformat = gl.RGBA;
|
||
format = gl.RGBA;
|
||
type = gl.UNSIGNED_BYTE;
|
||
break;
|
||
case "rgb8":
|
||
sizedinternalformat = gl.RGB8;
|
||
internalformat = gl.RGB;
|
||
format = gl.RGB;
|
||
type = gl.UNSIGNED_BYTE;
|
||
break;
|
||
case "rgba4":
|
||
sizedinternalformat = gl.RGBA4;
|
||
internalformat = gl.RGBA;
|
||
format = gl.RGBA;
|
||
type = gl.UNSIGNED_SHORT_4_4_4_4;
|
||
break;
|
||
case "rgb5_a1":
|
||
sizedinternalformat = gl.RGB5_A1;
|
||
internalformat = gl.RGBA;
|
||
format = gl.RGBA;
|
||
type = gl.UNSIGNED_SHORT_5_5_5_1;
|
||
break;
|
||
case "rgb565":
|
||
sizedinternalformat = gl.RGB565;
|
||
internalformat = gl.RGB;
|
||
format = gl.RGB;
|
||
type = gl.UNSIGNED_SHORT_5_6_5;
|
||
break;
|
||
default:
|
||
throw new Error("invalid pixel format");
|
||
}
|
||
return {
|
||
sizedinternalformat,
|
||
internalformat,
|
||
format,
|
||
type
|
||
}
|
||
}
|
||
const CREATEFROM_DEFAULT_OPTIONS = {
|
||
wrapX: "clamp-to-edge",
|
||
wrapY: "clamp-to-edge",
|
||
sampling: "trilinear",
|
||
pixelFormat: "rgba8",
|
||
mipMap: true,
|
||
mipMapQuality: "default",
|
||
premultiplyAlpha: true,
|
||
isSvg: false,
|
||
width: -1,
|
||
height: -1
|
||
};
|
||
const UPDATE_DEFAULT_OPTIONS = {
|
||
premultiplyAlpha: true,
|
||
flipY: false
|
||
};
|
||
const allTextures = new Set;
|
||
C3.Gfx.WebGLRendererTexture = class WebGLRendererTexture {
|
||
constructor(renderer) {
|
||
this._renderer = renderer;
|
||
this._texture = null;
|
||
this._width = 0;
|
||
this._height = 0;
|
||
this._isStatic = true;
|
||
this._wrapX = "clamp-to-edge";
|
||
this._wrapY = "clamp-to-edge";
|
||
this._sampling = "trilinear";
|
||
this._pixelFormat = "rgba8";
|
||
this._isMipMapped = false;
|
||
this._mipMapQuality = "default";
|
||
this._refCount = 0
|
||
}
|
||
_CreateStatic(data, opts) {
|
||
if ((typeof HTMLImageElement === "undefined" || !(data instanceof HTMLImageElement)) && (typeof HTMLCanvasElement === "undefined" || !(data instanceof HTMLCanvasElement)) && (typeof ImageBitmap === "undefined" || !(data instanceof ImageBitmap)) && (typeof OffscreenCanvas === "undefined" || !(data instanceof OffscreenCanvas)) && !(data instanceof ImageData) && !(data instanceof ArrayBuffer) && data !== null)
|
||
throw new Error("invalid texture source");
|
||
opts = Object.assign({}, CREATEFROM_DEFAULT_OPTIONS, opts);
|
||
if (this._texture)
|
||
throw new Error("already created texture");
|
||
this._wrapX = opts.wrapX;
|
||
this._wrapY = opts.wrapY;
|
||
this._sampling = opts.sampling;
|
||
this._pixelFormat = opts.pixelFormat;
|
||
this._isMipMapped = !!opts.mipMap && this._renderer.AreMipmapsEnabled();
|
||
this._mipMapQuality = opts.mipMapQuality;
|
||
if (!VALID_WRAP_MODES.has(this._wrapX) || !VALID_WRAP_MODES.has(this._wrapY))
|
||
throw new Error("invalid wrap mode");
|
||
if (!VALID_SAMPLINGS.has(this._sampling))
|
||
throw new Error("invalid sampling");
|
||
if (!VALID_PIXEL_FORMATS.has(this._pixelFormat))
|
||
throw new Error("invalid pixel format");
|
||
if (!VALID_MIPMAP_QUALITIES.has(this._mipMapQuality))
|
||
throw new Error("invalid mipmap quality");
|
||
this._isStatic = true;
|
||
if (data instanceof ArrayBuffer || data === null || opts.isSvg) {
|
||
this._width = opts.width;
|
||
this._height = opts.height;
|
||
if (data instanceof ArrayBuffer && data.byteLength !== this._width * this._height * 4)
|
||
throw new Error("ArrayBuffer wrong size");
|
||
} else {
|
||
this._width = data.width;
|
||
this._height = data.height
|
||
}
|
||
if (this._width <= 0 || this._height <= 0)
|
||
throw new Error("invalid texture data size");
|
||
if (opts.isSvg) {
|
||
const canvas = C3.CreateCanvas(this._width, this._height);
|
||
const ctx = canvas.getContext("2d");
|
||
ctx.drawImage(data, 0, 0, this._width, this._height);
|
||
data = canvas
|
||
}
|
||
const isPOT = C3.isPOT(this._width) && C3.isPOT(this._height);
|
||
const maxTextureSize = this._renderer.GetMaxTextureSize();
|
||
if (this._width > maxTextureSize || this._height > maxTextureSize)
|
||
throw new Error("texture data exceeds maximum texture size");
|
||
const gl = this._renderer.GetContext();
|
||
const webglVersion = this._renderer.GetWebGLVersionNumber();
|
||
this._texture = gl.createTexture();
|
||
gl.bindTexture(gl.TEXTURE_2D, this._texture);
|
||
gl.pixelStorei(gl["UNPACK_PREMULTIPLY_ALPHA_WEBGL"], opts.premultiplyAlpha);
|
||
const formatspec = GetFormatSpecifiers(this._pixelFormat, gl);
|
||
if (!this._renderer.SupportsNPOTTextures() && !isPOT && this._IsTiled()) {
|
||
if (data === null)
|
||
throw new Error("cannot pass null data when creating a NPOT tiled texture without NPOT support");
|
||
if (data instanceof ArrayBuffer)
|
||
data = new ImageData(new Uint8ClampedArray(data),this._width,this._height);
|
||
if (data instanceof ImageData) {
|
||
const tmpCanvas = C3.CreateCanvas(this._width, this._height);
|
||
const tmpCtx = tmpCanvas.getContext("2d");
|
||
tmpCtx.putImageData(data, 0, 0);
|
||
data = tmpCanvas
|
||
}
|
||
const canvas = C3.CreateCanvas(C3.nextHighestPowerOfTwo(this._width), C3.nextHighestPowerOfTwo(this._height));
|
||
const ctx = canvas.getContext("2d");
|
||
ctx.imageSmoothingEnabled = this._sampling !== "nearest";
|
||
ctx.drawImage(data, 0, 0, this._width, this._height, 0, 0, canvas.width, canvas.height);
|
||
gl.texImage2D(gl.TEXTURE_2D, 0, formatspec.internalformat, formatspec.format, formatspec.type, canvas)
|
||
} else if (webglVersion >= 2) {
|
||
let levels;
|
||
if (this._isMipMapped)
|
||
levels = Math.floor(Math.log2(Math.max(this._width, this._height)) + 1);
|
||
else
|
||
levels = 1;
|
||
gl.texStorage2D(gl.TEXTURE_2D, levels, formatspec.sizedinternalformat, this._width, this._height);
|
||
if (data instanceof ArrayBuffer)
|
||
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this._width, this._height, formatspec.format, formatspec.type, new Uint8Array(data));
|
||
else if (data !== null)
|
||
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, formatspec.format, formatspec.type, data)
|
||
} else if (data instanceof ArrayBuffer)
|
||
gl.texImage2D(gl.TEXTURE_2D, 0, formatspec.internalformat, this._width, this._height, 0, formatspec.format, formatspec.type, new Uint8Array(data));
|
||
else if (data === null)
|
||
gl.texImage2D(gl.TEXTURE_2D, 0, formatspec.internalformat, this._width, this._height, 0, formatspec.format, formatspec.type, null);
|
||
else
|
||
gl.texImage2D(gl.TEXTURE_2D, 0, formatspec.internalformat, formatspec.format, formatspec.type, data);
|
||
if (data !== null)
|
||
this._SetTextureParameters(gl);
|
||
gl.bindTexture(gl.TEXTURE_2D, null);
|
||
this._renderer._ResetLastTexture();
|
||
this._refCount = 1;
|
||
allTextures.add(this)
|
||
}
|
||
_CreateDynamic(width, height, opts) {
|
||
opts = Object.assign({}, CREATEFROM_DEFAULT_OPTIONS, opts);
|
||
if (this._texture)
|
||
throw new Error("already created texture");
|
||
this._wrapX = opts.wrapX;
|
||
this._wrapY = opts.wrapY;
|
||
this._sampling = opts.sampling;
|
||
this._pixelFormat = opts.pixelFormat;
|
||
this._isMipMapped = !!opts.mipMap && this._renderer.AreMipmapsEnabled();
|
||
this._mipMapQuality = opts.mipMapQuality;
|
||
if (!VALID_WRAP_MODES.has(this._wrapX) || !VALID_WRAP_MODES.has(this._wrapY))
|
||
throw new Error("invalid wrap mode");
|
||
if (!VALID_SAMPLINGS.has(this._sampling))
|
||
throw new Error("invalid sampling");
|
||
if (!VALID_PIXEL_FORMATS.has(this._pixelFormat))
|
||
throw new Error("invalid pixel format");
|
||
if (!VALID_MIPMAP_QUALITIES.has(this._mipMapQuality))
|
||
throw new Error("invalid mipmap quality");
|
||
this._isStatic = false;
|
||
this._width = Math.floor(width);
|
||
this._height = Math.floor(height);
|
||
const isPOT = C3.isPOT(this._width) && C3.isPOT(this._height);
|
||
const maxTextureSize = this._renderer.GetMaxTextureSize();
|
||
if (this._width <= 0 || this._height <= 0)
|
||
throw new Error("invalid texture size");
|
||
if (this._width > maxTextureSize || this._height > maxTextureSize)
|
||
throw new Error("texture exceeds maximum texture size");
|
||
if (!this._renderer.SupportsNPOTTextures() && this._IsTiled() && !isPOT)
|
||
throw new Error("non-power-of-two tiled textures not supported");
|
||
const gl = this._renderer.GetContext();
|
||
const webglVersion = this._renderer.GetWebGLVersionNumber();
|
||
this._texture = gl.createTexture();
|
||
gl.bindTexture(gl.TEXTURE_2D, this._texture);
|
||
gl.pixelStorei(gl["UNPACK_PREMULTIPLY_ALPHA_WEBGL"], opts.premultiplyAlpha);
|
||
const formatspec = GetFormatSpecifiers(this._pixelFormat, gl);
|
||
const internalformat = webglVersion >= 2 ? formatspec.sizedinternalformat : formatspec.internalformat;
|
||
gl.texImage2D(gl.TEXTURE_2D, 0, internalformat, this._width, this._height, 0, formatspec.format, formatspec.type, null);
|
||
this._SetTextureParameters(gl);
|
||
gl.bindTexture(gl.TEXTURE_2D, null);
|
||
this._renderer._ResetLastTexture();
|
||
this._refCount = 1;
|
||
allTextures.add(this)
|
||
}
|
||
_GetMipMapHint(gl) {
|
||
if (this._mipMapQuality === "default")
|
||
return this._isStatic ? gl.NICEST : gl.FASTEST;
|
||
else if (this._mipMapQuality === "low")
|
||
return gl.FASTEST;
|
||
else if (this._mipMapQuality === "high")
|
||
return gl.NICEST;
|
||
else
|
||
throw new Error("invalid mipmap quality");
|
||
}
|
||
_IsTiled() {
|
||
return this._wrapX !== "clamp-to-edge" || this._wrapY !== "clamp-to-edge"
|
||
}
|
||
_GetTextureWrapMode(gl, wrapMode) {
|
||
if (wrapMode === "clamp-to-edge")
|
||
return gl.CLAMP_TO_EDGE;
|
||
else if (wrapMode === "repeat")
|
||
return gl.REPEAT;
|
||
else if (wrapMode === "mirror-repeat")
|
||
return gl.MIRRORED_REPEAT;
|
||
else
|
||
throw new Error("invalid wrap mode");
|
||
}
|
||
_SetTextureParameters(gl) {
|
||
const isPOT = C3.isPOT(this._width) && C3.isPOT(this._height);
|
||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, this._GetTextureWrapMode(gl, this._wrapX));
|
||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, this._GetTextureWrapMode(gl, this._wrapY));
|
||
if (this._sampling === "nearest") {
|
||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
||
this._isMipMapped = false
|
||
} else {
|
||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
||
if ((isPOT || this._renderer.SupportsNPOTTextures()) && this._isMipMapped) {
|
||
gl.hint(gl.GENERATE_MIPMAP_HINT, this._GetMipMapHint(gl));
|
||
gl.generateMipmap(gl.TEXTURE_2D);
|
||
const useTrilinear = this._sampling === "trilinear" && !this._renderer.HasMajorPerformanceCaveat();
|
||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, useTrilinear ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR_MIPMAP_NEAREST)
|
||
} else {
|
||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
||
this._isMipMapped = false
|
||
}
|
||
}
|
||
}
|
||
_Update(data, opts) {
|
||
if ((typeof HTMLImageElement === "undefined" || !(data instanceof HTMLImageElement)) && (typeof HTMLVideoElement === "undefined" || !(data instanceof HTMLVideoElement)) && (typeof HTMLCanvasElement === "undefined" || !(data instanceof HTMLCanvasElement)) && (typeof ImageBitmap === "undefined" || !(data instanceof ImageBitmap)) && (typeof OffscreenCanvas === "undefined" || !(data instanceof OffscreenCanvas)) && !(data instanceof ImageData))
|
||
throw new Error("invalid texture source");
|
||
if (!this._texture || this._refCount <= 0)
|
||
throw new Error("texture not created");
|
||
if (this._isStatic)
|
||
throw new Error("cannot update static texture");
|
||
opts = Object.assign({}, UPDATE_DEFAULT_OPTIONS, opts);
|
||
const dataWidth = data.width || data.videoWidth;
|
||
const dataHeight = data.height || data.videoHeight;
|
||
const webglVersion = this._renderer.GetWebGLVersionNumber();
|
||
const gl = this._renderer.GetContext();
|
||
gl.bindTexture(gl.TEXTURE_2D, this._texture);
|
||
gl.pixelStorei(gl["UNPACK_PREMULTIPLY_ALPHA_WEBGL"], opts.premultiplyAlpha);
|
||
gl.pixelStorei(gl["UNPACK_FLIP_Y_WEBGL"], !!opts.flipY);
|
||
const formatspec = GetFormatSpecifiers(this._pixelFormat, gl);
|
||
const internalformat = webglVersion >= 2 ? formatspec.sizedinternalformat : formatspec.internalformat;
|
||
try {
|
||
if (this._width === dataWidth && this._height === dataHeight) {
|
||
const isPOT = C3.isPOT(this._width) && C3.isPOT(this._height);
|
||
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, formatspec.format, formatspec.type, data);
|
||
if ((isPOT || this._renderer.SupportsNPOTTextures()) && this._isMipMapped) {
|
||
gl.hint(gl.GENERATE_MIPMAP_HINT, this._GetMipMapHint(gl));
|
||
gl.generateMipmap(gl.TEXTURE_2D)
|
||
}
|
||
} else {
|
||
this._width = dataWidth;
|
||
this._height = dataHeight;
|
||
const isPOT = C3.isPOT(this._width) && C3.isPOT(this._height);
|
||
if (!this._renderer.SupportsNPOTTextures() && this._IsTiled() && !isPOT)
|
||
throw new Error("non-power-of-two tiled textures not supported");
|
||
gl.texImage2D(gl.TEXTURE_2D, 0, internalformat, formatspec.format, formatspec.type, data);
|
||
if ((isPOT || this._renderer.SupportsNPOTTextures()) && this._isMipMapped) {
|
||
gl.hint(gl.GENERATE_MIPMAP_HINT, this._GetMipMapHint(gl));
|
||
gl.generateMipmap(gl.TEXTURE_2D)
|
||
}
|
||
}
|
||
} catch (e) {
|
||
console.error("Error updating WebGL texture: ", e)
|
||
}
|
||
gl.bindTexture(gl.TEXTURE_2D, null);
|
||
this._renderer._ResetLastTexture()
|
||
}
|
||
_Delete() {
|
||
if (this._refCount > 0)
|
||
throw new Error("texture still has references");
|
||
if (!this._texture)
|
||
throw new Error("already deleted texture");
|
||
allTextures.delete(this);
|
||
const gl = this._renderer.GetContext();
|
||
gl.deleteTexture(this._texture);
|
||
this._texture = null
|
||
}
|
||
IsValid() {
|
||
return !!this._texture
|
||
}
|
||
_GetTexture() {
|
||
return this._texture
|
||
}
|
||
GetRenderer() {
|
||
return this._renderer
|
||
}
|
||
AddReference() {
|
||
this._refCount++
|
||
}
|
||
SubtractReference() {
|
||
if (this._refCount <= 0)
|
||
throw new Error("no more references");
|
||
this._refCount--
|
||
}
|
||
GetReferenceCount() {
|
||
return this._refCount
|
||
}
|
||
GetWidth() {
|
||
return this._width
|
||
}
|
||
GetHeight() {
|
||
return this._height
|
||
}
|
||
IsStatic() {
|
||
return this._isStatic
|
||
}
|
||
GetEstimatedMemoryUsage() {
|
||
let size = this._width * this._height;
|
||
switch (this._pixelFormat) {
|
||
case "rgba8":
|
||
size *= 4;
|
||
break;
|
||
case "rgb8":
|
||
size *= 3;
|
||
break;
|
||
case "rgba4":
|
||
case "rgb5_a1":
|
||
case "rgb565":
|
||
size *= 2;
|
||
break
|
||
}
|
||
if (this._isMipMapped)
|
||
size += Math.floor(size / 3);
|
||
return size
|
||
}
|
||
static OnContextLost() {
|
||
allTextures.clear()
|
||
}
|
||
static allTextures() {
|
||
return allTextures.values()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
const VALID_SAMPLINGS = new Set(["nearest", "bilinear", "trilinear"]);
|
||
const DEFAULT_RENDERTARGET_OPTIONS = {
|
||
sampling: "trilinear",
|
||
alpha: true,
|
||
readback: true,
|
||
isDefaultSize: true,
|
||
multisampling: 0
|
||
};
|
||
const allRenderTargets = new Set;
|
||
C3.Gfx.WebGLRenderTarget = class WebGLRenderTarget {
|
||
constructor(renderer) {
|
||
this._renderer = renderer;
|
||
this._frameBuffer = null;
|
||
this._texture = null;
|
||
this._renderBuffer = null;
|
||
this._width = 0;
|
||
this._height = 0;
|
||
this._isDefaultSize = true;
|
||
this._sampling = "trilinear";
|
||
this._alpha = true;
|
||
this._readback = true;
|
||
this._multisampling = 0
|
||
}
|
||
_Create(width, height, opts) {
|
||
opts = Object.assign({}, DEFAULT_RENDERTARGET_OPTIONS, opts);
|
||
const webGLVersion = this._renderer.GetWebGLVersionNumber();
|
||
if (this._texture || this._renderBuffer)
|
||
throw new Error("already created render target");
|
||
this._sampling = opts.sampling;
|
||
this._alpha = !!opts.alpha;
|
||
this._readback = !!opts.readback;
|
||
this._isDefaultSize = !!opts.isDefaultSize;
|
||
this._multisampling = opts.multisampling;
|
||
if (!VALID_SAMPLINGS.has(this._sampling))
|
||
throw new Error("invalid sampling");
|
||
if (this._multisampling > 0 && (webGLVersion < 2 || this._readback))
|
||
throw new Error("invalid use of multisampling");
|
||
if (webGLVersion < 2)
|
||
this._readback = true;
|
||
this._width = width;
|
||
this._height = height;
|
||
if (this._width <= 0 || this._height <= 0)
|
||
throw new Error("invalid render target size");
|
||
const gl = this._renderer.GetContext();
|
||
this._frameBuffer = gl.createFramebuffer();
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);
|
||
if (this._readback) {
|
||
this._texture = this._renderer.CreateDynamicTexture(this._width, this._height, {
|
||
sampling: this._sampling,
|
||
pixelFormat: this._alpha ? "rgba8" : "rgb8",
|
||
mipMap: false
|
||
});
|
||
const tex = this._texture._GetTexture();
|
||
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0)
|
||
} else {
|
||
this._renderBuffer = gl.createRenderbuffer();
|
||
gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);
|
||
const internalFormat = this._alpha ? gl.RGBA8 : gl.RGB8;
|
||
if (this._multisampling > 0) {
|
||
const formatSamples = gl.getInternalformatParameter(gl.RENDERBUFFER, internalFormat, gl.SAMPLES);
|
||
if (formatSamples && formatSamples[0]) {
|
||
const maxSamples = formatSamples[0];
|
||
if (this._multisampling > maxSamples)
|
||
this._multisampling = maxSamples
|
||
} else
|
||
this._multisampling = 0
|
||
}
|
||
if (this._multisampling === 0)
|
||
gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, this._width, this._height);
|
||
else
|
||
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, this._multisampling, internalFormat, this._width, this._height);
|
||
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, this._renderBuffer);
|
||
gl.bindRenderbuffer(gl.RENDERBUFFER, null)
|
||
}
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
||
allRenderTargets.add(this)
|
||
}
|
||
_Resize(width, height) {
|
||
if (this._width === width && this._height === height)
|
||
return;
|
||
this._width = width;
|
||
this._height = height;
|
||
const gl = this._renderer.GetContext();
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);
|
||
if (this._texture)
|
||
this._texture._Update(new ImageData(this._width,this._height));
|
||
else {
|
||
gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);
|
||
gl.renderbufferStorage(gl.RENDERBUFFER, this._alpha ? gl.RGBA8 : gl.RGB8, this._width, this._height);
|
||
gl.bindRenderbuffer(gl.RENDERBUFFER, null)
|
||
}
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, null)
|
||
}
|
||
_Delete() {
|
||
if (!this._texture && !this._renderBuffer)
|
||
throw new Error("already deleted render target");
|
||
allRenderTargets.delete(this);
|
||
const gl = this._renderer.GetContext();
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);
|
||
if (this._texture) {
|
||
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
|
||
this._renderer.DeleteTexture(this._texture);
|
||
this._texture = null
|
||
} else if (this._renderBuffer) {
|
||
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
|
||
gl.deleteRenderbuffer(this._renderBuffer);
|
||
this._renderBuffer = null
|
||
}
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
||
if (this._renderer.GetWebGLVersionNumber() >= 2) {
|
||
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);
|
||
gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null)
|
||
}
|
||
gl.deleteFramebuffer(this._frameBuffer);
|
||
this._renderer.GetBatchState().currentFramebuffer = null;
|
||
this._frameBuffer = null
|
||
}
|
||
_GetFramebuffer() {
|
||
return this._frameBuffer
|
||
}
|
||
GetWebGLRenderer() {
|
||
return this._renderer
|
||
}
|
||
GetTexture() {
|
||
return this._texture
|
||
}
|
||
IsLinearSampling() {
|
||
return this._sampling !== "nearest"
|
||
}
|
||
HasAlpha() {
|
||
return this._alpha
|
||
}
|
||
IsReadback() {
|
||
return this._readback
|
||
}
|
||
GetWidth() {
|
||
return this._width
|
||
}
|
||
GetHeight() {
|
||
return this._height
|
||
}
|
||
IsDefaultSize() {
|
||
return this._isDefaultSize
|
||
}
|
||
GetMultisampling() {
|
||
return this._multisampling
|
||
}
|
||
GetOptions() {
|
||
const ret = {
|
||
sampling: this._sampling,
|
||
alpha: this._alpha,
|
||
readback: this._readback
|
||
};
|
||
if (!this._isDefaultSize) {
|
||
ret.width = this._width;
|
||
ret.height = this._height
|
||
}
|
||
return ret
|
||
}
|
||
IsCompatibleWithOptions(opts) {
|
||
opts = Object.assign({}, DEFAULT_RENDERTARGET_OPTIONS, opts);
|
||
if (opts.sampling !== "nearest" !== this.IsLinearSampling())
|
||
return false;
|
||
if (!!opts.alpha !== this.HasAlpha())
|
||
return false;
|
||
if (this._renderer.GetWebGLVersionNumber() >= 2)
|
||
if (!!opts.readback !== this.IsReadback())
|
||
return false;
|
||
if (typeof opts.width === "number" || typeof opts.height === "number")
|
||
return !this.IsDefaultSize() && this.GetWidth() === opts.width && this.GetHeight() === opts.height;
|
||
else
|
||
return this.IsDefaultSize()
|
||
}
|
||
_GetWebGLTexture() {
|
||
if (!this._texture)
|
||
return null;
|
||
return this._texture._GetTexture()
|
||
}
|
||
GetEstimatedMemoryUsage() {
|
||
if (this._texture)
|
||
return this._texture.GetEstimatedMemoryUsage();
|
||
return this._width * this._height * (this._alpha ? 4 : 3)
|
||
}
|
||
static async DebugReadPixelsToBlob(renderer, renderTarget) {
|
||
const imageData = await renderer.ReadBackRenderTargetToImageData(renderTarget, true);
|
||
return await C3.ImageDataToBlob(imageData)
|
||
}
|
||
static OnContextLost() {
|
||
allRenderTargets.clear()
|
||
}
|
||
static allRenderTargets() {
|
||
return allRenderTargets.values()
|
||
}
|
||
static ResizeAll(width, height) {
|
||
for (const rt of allRenderTargets)
|
||
if (rt.IsDefaultSize())
|
||
rt._Resize(width, height)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const glMatrix = self.glMatrix;
|
||
const vec3 = glMatrix.vec3;
|
||
const mat4 = glMatrix.mat4;
|
||
const RESERVED_UNIFORM_NAMES = new Set(["aPos", "aTex", "aPoints", "matP", "matMV", "samplerFront", "samplerBack", "destStart", "destEnd", "srcStart", "srcEnd", "srcOriginStart", "srcOriginEnd", "pixelSize", "seconds", "layerScale", "layerAngle", "layoutStart", "layoutEnd", "color", "color2_", "pointTexStart", "pointTexEnd", "zElevation", "tileSize", "tileSpacing", "outlineThickness"]);
|
||
C3.Gfx.WebGLShaderProgram = class WebGLShaderProgram {
|
||
static async Compile(renderer, fragSrc, vsSource, name) {
|
||
const gl = renderer.GetContext();
|
||
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
|
||
gl.shaderSource(fragmentShader, fragSrc);
|
||
gl.compileShader(fragmentShader);
|
||
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
|
||
gl.shaderSource(vertexShader, vsSource);
|
||
gl.compileShader(vertexShader);
|
||
const shaderProgram = gl.createProgram();
|
||
gl.attachShader(shaderProgram, fragmentShader);
|
||
gl.attachShader(shaderProgram, vertexShader);
|
||
gl.bindAttribLocation(shaderProgram, 0, "aPos");
|
||
gl.bindAttribLocation(shaderProgram, 1, "aTex");
|
||
gl.bindAttribLocation(shaderProgram, 2, "aPoints");
|
||
gl.linkProgram(shaderProgram);
|
||
const parallelShaderCompileExt = renderer._GetParallelShaderCompileExtension();
|
||
if (parallelShaderCompileExt)
|
||
await renderer._WaitForObjectReady(()=>gl.getProgramParameter(shaderProgram, parallelShaderCompileExt["COMPLETION_STATUS_KHR"]));
|
||
else
|
||
await C3.Wait(5);
|
||
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
|
||
const log = gl.getShaderInfoLog(fragmentShader);
|
||
gl.deleteShader(fragmentShader);
|
||
gl.deleteShader(vertexShader);
|
||
gl.deleteProgram(shaderProgram);
|
||
throw new Error("Error compiling fragment shader: " + log);
|
||
}
|
||
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
|
||
const log = gl.getShaderInfoLog(vertexShader);
|
||
gl.deleteShader(fragmentShader);
|
||
gl.deleteShader(vertexShader);
|
||
gl.deleteProgram(shaderProgram);
|
||
throw new Error("Error compiling vertex shader: " + log);
|
||
}
|
||
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
|
||
const log = gl.getProgramInfoLog(shaderProgram);
|
||
gl.deleteShader(fragmentShader);
|
||
gl.deleteShader(vertexShader);
|
||
gl.deleteProgram(shaderProgram);
|
||
throw new Error("Error linking shader program: " + log);
|
||
}
|
||
const infoLog = C3.FilterUnprintableChars(gl.getProgramInfoLog(shaderProgram) || "").trim();
|
||
if (infoLog && !C3.IsStringAllWhitespace(infoLog))
|
||
console.info(`[WebGL] Shader program '${name}' compilation log: `, infoLog);
|
||
gl.deleteShader(fragmentShader);
|
||
gl.deleteShader(vertexShader);
|
||
return shaderProgram
|
||
}
|
||
static async Create(renderer, shaderInfo, vsSource, name) {
|
||
const shaderProgram = await C3.Gfx.WebGLShaderProgram.Compile(renderer, shaderInfo.src, vsSource, name);
|
||
return new C3.Gfx.WebGLShaderProgram(renderer,shaderProgram,shaderInfo,name)
|
||
}
|
||
constructor(renderer, shaderProgram, shaderInfo, name) {
|
||
const gl = renderer.GetContext();
|
||
const batchState = renderer.GetBatchState();
|
||
renderer.EndBatch();
|
||
gl.useProgram(shaderProgram);
|
||
this._gl = gl;
|
||
this._renderer = renderer;
|
||
this._name = name;
|
||
this._shaderProgram = shaderProgram;
|
||
this._isDeviceTransform = name === "<default-device-transform>";
|
||
const locAPos = gl.getAttribLocation(shaderProgram, "aPos");
|
||
const locATex = gl.getAttribLocation(shaderProgram, "aTex");
|
||
const locAPoints = gl.getAttribLocation(shaderProgram, "aPoints");
|
||
if (locAPos !== -1) {
|
||
gl.bindBuffer(gl.ARRAY_BUFFER, renderer._vertexBuffer);
|
||
gl.vertexAttribPointer(locAPos, renderer.GetNumVertexComponents(), gl.FLOAT, false, 0, 0);
|
||
gl.enableVertexAttribArray(locAPos)
|
||
}
|
||
if (locATex !== -1) {
|
||
gl.bindBuffer(gl.ARRAY_BUFFER, renderer._texcoordBuffer);
|
||
gl.vertexAttribPointer(locATex, 2, gl.FLOAT, false, 0, 0);
|
||
gl.enableVertexAttribArray(locATex)
|
||
}
|
||
if (locAPoints !== -1) {
|
||
gl.bindBuffer(gl.ARRAY_BUFFER, renderer._pointBuffer);
|
||
gl.vertexAttribPointer(locAPoints, 4, gl.FLOAT, false, 0, 0);
|
||
gl.enableVertexAttribArray(locAPoints)
|
||
}
|
||
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
||
this._uMatP = new C3.Gfx.WebGLShaderUniform(this,"matP","mat4");
|
||
this._uMatMV = new C3.Gfx.WebGLShaderUniform(this,"matMV","mat4");
|
||
this._uColor = new C3.Gfx.WebGLShaderUniform(this,"color","vec4");
|
||
this._uSamplerFront = new C3.Gfx.WebGLShaderUniform(this,"samplerFront","sampler");
|
||
this._uPointTexStart = new C3.Gfx.WebGLShaderUniform(this,"pointTexStart","vec2");
|
||
this._uPointTexEnd = new C3.Gfx.WebGLShaderUniform(this,"pointTexEnd","vec2");
|
||
this._uZElevation = new C3.Gfx.WebGLShaderUniform(this,"zElevation","float");
|
||
this._uTileSize = new C3.Gfx.WebGLShaderUniform(this,"tileSize","vec2");
|
||
this._uTileSpacing = new C3.Gfx.WebGLShaderUniform(this,"tileSpacing","vec2");
|
||
this._uColor2 = new C3.Gfx.WebGLShaderUniform(this,"color2_","vec4");
|
||
this._uOutlineThickness = new C3.Gfx.WebGLShaderUniform(this,"outlineThickness","float");
|
||
this._uSamplerBack = new C3.Gfx.WebGLShaderUniform(this,"samplerBack","sampler");
|
||
this._uDestStart = new C3.Gfx.WebGLShaderUniform(this,"destStart","vec2");
|
||
this._uDestEnd = new C3.Gfx.WebGLShaderUniform(this,"destEnd","vec2");
|
||
this._uSrcStart = new C3.Gfx.WebGLShaderUniform(this,"srcStart","vec2");
|
||
this._uSrcEnd = new C3.Gfx.WebGLShaderUniform(this,"srcEnd","vec2");
|
||
this._uSrcOriginStart = new C3.Gfx.WebGLShaderUniform(this,"srcOriginStart","vec2");
|
||
this._uSrcOriginEnd = new C3.Gfx.WebGLShaderUniform(this,"srcOriginEnd","vec2");
|
||
this._uPixelSize = new C3.Gfx.WebGLShaderUniform(this,"pixelSize","vec2");
|
||
this._uSeconds = new C3.Gfx.WebGLShaderUniform(this,"seconds","float");
|
||
this._uLayerScale = new C3.Gfx.WebGLShaderUniform(this,"layerScale","float");
|
||
this._uLayerAngle = new C3.Gfx.WebGLShaderUniform(this,"layerAngle","float");
|
||
this._uLayoutStart = new C3.Gfx.WebGLShaderUniform(this,"layoutStart","vec2");
|
||
this._uLayoutEnd = new C3.Gfx.WebGLShaderUniform(this,"layoutEnd","vec2");
|
||
this._hasAnyOptionalUniforms = !!(this._uPixelSize.IsUsed() || this._uSeconds.IsUsed() || this._uSamplerBack.IsUsed() || this._uDestStart.IsUsed() || this._uDestEnd.IsUsed() || this._uSrcStart.IsUsed() || this._uSrcEnd.IsUsed() || this._uSrcOriginStart.IsUsed() || this._uSrcOriginEnd.IsUsed() || this._uLayerScale.IsUsed() || this._uLayerAngle.IsUsed() || this._uLayoutStart.IsUsed() || this._uLayoutEnd.IsUsed());
|
||
this._extendBoxHorizontal = shaderInfo.extendBoxHorizontal || 0;
|
||
this._extendBoxVertical = shaderInfo.extendBoxVertical || 0;
|
||
this._crossSampling = !!shaderInfo.crossSampling;
|
||
this._mustPreDraw = !!shaderInfo.mustPreDraw;
|
||
this._preservesOpaqueness = !!shaderInfo.preservesOpaqueness;
|
||
this._animated = !!shaderInfo.animated;
|
||
const customParameterDefs = shaderInfo.parameters || [];
|
||
this._uCustomParameters = [];
|
||
this._usesDest = this._uDestStart.IsUsed() || this._uDestEnd.IsUsed();
|
||
this._usesAnySrcRectOrPixelSize = this._uPixelSize.IsUsed() || this._uSrcStart.IsUsed() || this._uSrcEnd.IsUsed() || this._uSrcOriginStart.IsUsed() || this._uSrcOriginEnd.IsUsed();
|
||
this._needsPostDrawOrExtendBox = this._crossSampling || this._usesDest || this._extendBoxHorizontal !== 0 || this._extendBoxVertical !== 0;
|
||
this._hasCurrentMatP = false;
|
||
this._hasCurrentMatMV = false;
|
||
this._uColor.Init4f(1, 1, 1, 1);
|
||
this._uColor2.Init4f(1, 1, 1, 1);
|
||
this._uSamplerFront.Init1i(0);
|
||
this._uSamplerBack.Init1i(1);
|
||
this._uPointTexStart.Init2f(0, 0);
|
||
this._uPointTexEnd.Init2f(1, 1);
|
||
this._uZElevation.Init1f(0);
|
||
this._uTileSize.Init2f(0, 0);
|
||
this._uTileSpacing.Init2f(0, 0);
|
||
this._uDestStart.Init2f(0, 0);
|
||
this._uDestEnd.Init2f(1, 1);
|
||
this._uSrcStart.Init2f(0, 0);
|
||
this._uSrcEnd.Init2f(0, 0);
|
||
this._uSrcOriginStart.Init2f(0, 0);
|
||
this._uSrcOriginEnd.Init2f(0, 0);
|
||
this._uPixelSize.Init2f(0, 0);
|
||
this._uLayerScale.Init1f(1);
|
||
this._uLayerAngle.Init1f(0);
|
||
this._uSeconds.Init1f(0);
|
||
this._uLayoutStart.Init2f(0, 0);
|
||
this._uLayoutEnd.Init2f(0, 0);
|
||
this._uOutlineThickness.Init1f(1);
|
||
for (const p of customParameterDefs) {
|
||
const uniformName = p[0];
|
||
const paramType = p[2];
|
||
const shaderUniform = new C3.Gfx.WebGLShaderUniform(this,uniformName,paramType);
|
||
if (paramType === "color")
|
||
shaderUniform.Init3f(0, 0, 0);
|
||
else
|
||
shaderUniform.Init1f(0);
|
||
this._uCustomParameters.push(shaderUniform)
|
||
}
|
||
if (this._isDeviceTransform)
|
||
this._UpdateDeviceTransformUniforms(batchState.currentMatP);
|
||
else {
|
||
this.UpdateMatP(batchState.currentMatP, true);
|
||
this.UpdateMatMV(batchState.currentMV, true)
|
||
}
|
||
const currentShader = batchState.currentShader;
|
||
gl.useProgram(currentShader ? currentShader._shaderProgram : null)
|
||
}
|
||
Release() {
|
||
this._gl.deleteProgram(this._shaderProgram);
|
||
this._shaderProgram = null;
|
||
this._renderer._RemoveShaderProgram(this);
|
||
this._gl = null;
|
||
this._renderer = null
|
||
}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
GetWebGLContext() {
|
||
return this._gl
|
||
}
|
||
GetShaderProgram() {
|
||
return this._shaderProgram
|
||
}
|
||
UsesDest() {
|
||
return this._usesDest
|
||
}
|
||
UsesCrossSampling() {
|
||
return this._crossSampling
|
||
}
|
||
MustPreDraw() {
|
||
return this._mustPreDraw
|
||
}
|
||
PreservesOpaqueness() {
|
||
return this._preservesOpaqueness
|
||
}
|
||
ExtendsBox() {
|
||
return this._extendBoxHorizontal !== 0 || this._extendBoxVertical !== 0
|
||
}
|
||
GetBoxExtendHorizontal() {
|
||
return this._extendBoxHorizontal
|
||
}
|
||
GetBoxExtendVertical() {
|
||
return this._extendBoxVertical
|
||
}
|
||
UsesAnySrcRectOrPixelSize() {
|
||
return this._usesAnySrcRectOrPixelSize
|
||
}
|
||
NeedsPostDrawOrExtendsBox() {
|
||
return this._needsPostDrawOrExtendBox
|
||
}
|
||
GetParameterCount() {
|
||
return this._uCustomParameters.length
|
||
}
|
||
GetParameterType(paramIndex) {
|
||
return this._uCustomParameters[paramIndex].GetType()
|
||
}
|
||
AreCustomParametersAlreadySetInBatch(params) {
|
||
for (let i = 0, len = params.length; i < len; ++i)
|
||
if (!this._uCustomParameters[i].IsSetToCustomInBatch(params[i]))
|
||
return false;
|
||
return true
|
||
}
|
||
SetCustomParametersInBatch(params) {
|
||
for (let i = 0, len = params.length; i < len; ++i)
|
||
this._uCustomParameters[i].SetBatchValueCustom(params[i])
|
||
}
|
||
AreOptionalUniformsAlreadySetInBatch(destRect, srcRect, srcOriginRect, layoutRect, pixelWidth, pixelHeight, layerScale, layerAngle, time) {
|
||
if (this._uSamplerBack.IsUsed())
|
||
return false;
|
||
if (this._uPixelSize.IsUsed() && !this._uPixelSize.IsSetTo2InBatch(pixelWidth, pixelHeight))
|
||
return false;
|
||
if (this._uDestStart.IsUsed() && !this._uDestStart.IsSetTo2InBatch(destRect.getLeft(), destRect.getTop()))
|
||
return false;
|
||
if (this._uDestEnd.IsUsed() && !this._uDestEnd.IsSetTo2InBatch(destRect.getRight(), destRect.getBottom()))
|
||
return false;
|
||
if (this._uLayerScale.IsUsed() && !this._uLayerScale.IsSetTo1InBatch(layerScale))
|
||
return false;
|
||
if (this._uLayerAngle.IsUsed() && !this._uLayerAngle.IsSetTo1InBatch(layerAngle))
|
||
return false;
|
||
if (this._uSrcStart.IsUsed() && !this._uSrcStart.IsSetTo2InBatch(srcRect.getLeft(), srcRect.getTop()))
|
||
return false;
|
||
if (this._uSrcEnd.IsUsed() && !this._uSrcEnd.IsSetTo2InBatch(srcRect.getRight(), srcRect.getBottom()))
|
||
return false;
|
||
if (this._uSrcOriginStart.IsUsed() && !this._uSrcOriginStart.IsSetTo2InBatch(srcOriginRect.getLeft(), srcOriginRect.getTop()))
|
||
return false;
|
||
if (this._uSrcOriginEnd.IsUsed() && !this._uSrcOriginEnd.IsSetTo2InBatch(srcOriginRect.getRight(), srcOriginRect.getBottom()))
|
||
return false;
|
||
if (this._uLayoutStart.IsUsed() && !this._uLayoutStart.IsSetTo2InBatch(layoutRect.getLeft(), layoutRect.getTop()))
|
||
return false;
|
||
if (this._uLayoutEnd.IsUsed() && !this._uLayoutEnd.IsSetTo2InBatch(layoutRect.getTop(), layoutRect.getBottom()))
|
||
return false;
|
||
if (this._uSeconds.IsUsed() && !this._uSeconds.IsSetTo1InBatch(time))
|
||
return false;
|
||
return true
|
||
}
|
||
SetOptionalUniformsInBatch(destRect, srcRect, srcOriginRect, layoutRect, pixelWidth, pixelHeight, layerScale, layerAngle, time) {
|
||
if (this._uSamplerBack.IsUsed())
|
||
return;
|
||
if (this._uPixelSize.IsUsed())
|
||
this._uPixelSize.SetBatch2(pixelWidth, pixelHeight);
|
||
if (this._uDestStart.IsUsed())
|
||
this._uDestStart.SetBatch2(destRect.getLeft(), destRect.getTop());
|
||
if (this._uDestEnd.IsUsed())
|
||
this._uDestEnd.SetBatch2(destRect.getRight(), destRect.getBottom());
|
||
if (this._uLayerScale.IsUsed())
|
||
this._uLayerScale.SetBatch1(layerScale);
|
||
if (this._uLayerAngle.IsUsed())
|
||
this._uLayerAngle.SetBatch1(layerAngle);
|
||
if (this._uSrcStart.IsUsed())
|
||
this._uSrcStart.SetBatch2(srcRect.getLeft(), srcRect.getTop());
|
||
if (this._uSrcEnd.IsUsed())
|
||
this._uSrcEnd.SetBatch2(srcRect.getRight(), srcRect.getBottom());
|
||
if (this._uSrcOriginStart.IsUsed())
|
||
this._uSrcOriginStart.SetBatch2(srcOriginRect.getLeft(), srcOriginRect.getTop());
|
||
if (this._uSrcOriginEnd.IsUsed())
|
||
this._uSrcOriginEnd.SetBatch2(srcOriginRect.getRight(), srcOriginRect.getBottom());
|
||
if (this._uLayoutStart.IsUsed())
|
||
this._uLayoutStart.SetBatch2(layoutRect.getLeft(), layoutRect.getTop());
|
||
if (this._uLayoutEnd.IsUsed())
|
||
this._uLayoutEnd.SetBatch2(layoutRect.getTop(), layoutRect.getBottom());
|
||
if (this._uSeconds.IsUsed())
|
||
this._uSeconds.SetBatch1(time)
|
||
}
|
||
IsAnimated() {
|
||
return this._animated
|
||
}
|
||
UpdateMatP(matP, force) {
|
||
if (this._hasCurrentMatP && !force)
|
||
return;
|
||
if (this._isDeviceTransform)
|
||
return;
|
||
if (this._uMatP.IsUsed())
|
||
this._uMatP.UpdateMatrix4fv(matP);
|
||
this._hasCurrentMatP = true
|
||
}
|
||
SetMatPStale() {
|
||
this._hasCurrentMatP = false
|
||
}
|
||
UpdateMatMV(matMV, force) {
|
||
if (this._hasCurrentMatMV && !force)
|
||
return;
|
||
if (this._isDeviceTransform)
|
||
return;
|
||
if (this._uMatMV.IsUsed())
|
||
this._uMatMV.UpdateMatrix4fv(matMV);
|
||
this._hasCurrentMatMV = true
|
||
}
|
||
SetMatMVStale() {
|
||
this._hasCurrentMatMV = false
|
||
}
|
||
_UpdateDeviceTransformUniforms(matP) {
|
||
if (!this._isDeviceTransform)
|
||
throw new Error("not device transform shader");
|
||
this._uMatP.UpdateMatrix4fv(matP);
|
||
const renderer = this._renderer;
|
||
const scrollX = renderer.GetWidth() / 2;
|
||
const scrollY = renderer.GetHeight() / 2;
|
||
const worldScale = renderer._worldScale;
|
||
const cam = vec3.fromValues(scrollX * worldScale[0], scrollY * worldScale[1], 100 * self.devicePixelRatio);
|
||
const look = vec3.fromValues(scrollX * worldScale[0], scrollY * worldScale[1], 0);
|
||
const mv = mat4.create();
|
||
mat4.lookAt(mv, cam, look, renderer._up);
|
||
mat4.scale(mv, mv, worldScale);
|
||
this._uMatMV.UpdateMatrix4fv(mv)
|
||
}
|
||
UpdateColor(c) {
|
||
if (this._uColor.IsUsed())
|
||
this._uColor.Update4f(c[0], c[1], c[2], c[3])
|
||
}
|
||
static GetReservedUniformNames() {
|
||
return RESERVED_UNIFORM_NAMES
|
||
}
|
||
static GetDefaultVertexShaderSource(is3d, useHighP) {
|
||
const texPrecision = useHighP ? "highmedp" : "mediump";
|
||
return [`#ifdef GL_FRAGMENT_PRECISION_HIGH`, `#define highmedp highp`, `#else`, `#define highmedp mediump`, `#endif`, `attribute highp ${is3d ? "vec3" : "vec2"} aPos;`, `attribute ${texPrecision} vec2 aTex;`, `varying ${texPrecision} vec2 vTex;`, `uniform highp mat4 matP;`, `uniform highp mat4 matMV;`, `void main(void) {`, ` gl_Position = matP * matMV * vec4(aPos, ${is3d ? "" : "0.0,"} 1.0);`, ` vTex = aTex;`, `}`].join("\n")
|
||
}
|
||
static GetTextureFillFragmentShaderSource() {
|
||
return ["varying mediump vec2 vTex;", "uniform lowp vec4 color;", "uniform lowp sampler2D samplerFront;", "void main(void) {", "\tgl_FragColor = texture2D(samplerFront, vTex) * color;", "}"].join("\n")
|
||
}
|
||
static GetTilemapFragmentShaderSource() {
|
||
return ["#ifdef GL_FRAGMENT_PRECISION_HIGH", "#define highmedp highp", "#else", "#define highmedp mediump", "#endif", "varying highmedp vec2 vTex;", "uniform lowp vec4 color;", "uniform lowp sampler2D samplerFront;", "uniform highmedp vec2 srcStart;", "uniform highmedp vec2 pixelSize;", "uniform highmedp vec2 tileSize;", "uniform highmedp vec2 tileSpacing;", "void main(void) {", "\thighmedp vec2 tile = floor(vTex);", "\thighmedp vec2 tex = fract(vTex);", "\thighmedp vec2 tileOrigin = srcStart + tile * (tileSize + tileSpacing);", "\thighmedp vec2 lowerBound = tileOrigin + pixelSize / 2.0;", "\thighmedp vec2 upperBound = tileOrigin + tileSize - pixelSize / 2.0;", "\tgl_FragColor = texture2D(samplerFront, clamp(tex, lowerBound, upperBound), -16.0) * color;", "}"].join("\n")
|
||
}
|
||
static GetPointVertexShaderSource() {
|
||
return ["attribute vec4 aPoints;", "varying float pointOpacity;", "uniform float zElevation;", "uniform mat4 matP;", "uniform mat4 matMV;", "void main(void) {", "\tgl_Position = matP * matMV * vec4(aPoints.xy, zElevation, 1.0);", "\tgl_PointSize = aPoints.z;", "\tpointOpacity = aPoints.w;", "}"].join("\n")
|
||
}
|
||
static GetPointFragmentShaderSource() {
|
||
return ["uniform lowp sampler2D samplerFront;", "varying lowp float pointOpacity;", "uniform mediump vec2 pointTexStart;", "uniform mediump vec2 pointTexEnd;", "uniform lowp vec4 color;", "void main(void) {", "\tgl_FragColor = texture2D(samplerFront, mix(pointTexStart, pointTexEnd, gl_PointCoord)) * color * pointOpacity;", "}"].join("\n")
|
||
}
|
||
static GetColorFillFragmentShaderSource() {
|
||
return ["uniform lowp vec4 color;", "void main(void) {", "\tgl_FragColor = color;", "}"].join("\n")
|
||
}
|
||
static GetLinearGradientFillFragmentShaderSource() {
|
||
return ["precision lowp float;", "varying mediump vec2 vTex;", "uniform vec4 color;", "uniform vec4 color2_;", "vec3 fromLinear(vec3 linearRGB)", "{", "\tbvec3 cutoff = lessThan(linearRGB, vec3(0.0031308));", "\tvec3 higher = vec3(1.055) * pow(abs(linearRGB), vec3(1.0/2.4)) - vec3(0.055);", "\tvec3 lower = linearRGB * vec3(12.92);", "\treturn mix(higher, lower, vec3(cutoff));", "}", "vec3 toLinear(vec3 sRGB)", "{", "\tbvec3 cutoff = lessThan(sRGB, vec3(0.04045));", "\tvec3 higher = pow(abs((sRGB + vec3(0.055))/vec3(1.055)), vec3(2.4));", "\tvec3 lower = sRGB/vec3(12.92);", "\treturn mix(higher, lower, vec3(cutoff));", "}", "void main(void) {", "\tvec3 linearGrad = mix(toLinear(color.rgb), toLinear(color2_.rgb), vTex.x);", "\tfloat a = mix(color.a, color2_.a, vTex.x);", "\tgl_FragColor = vec4(fromLinear(linearGrad) * a, a);", "}"].join("\n")
|
||
}
|
||
static GetSmoothLineFillFragmentShaderSource() {
|
||
return ["varying mediump vec2 vTex;", "uniform lowp vec4 color;", "void main(void) {", "\tlowp float f = 1.0 - abs(vTex.y - 0.5) * 2.0;", "\tgl_FragColor = color * f;", "}"].join("\n")
|
||
}
|
||
static GetHardEllipseFillFragmentShaderSource() {
|
||
return ["varying mediump vec2 vTex;", "uniform lowp vec4 color;", "void main(void) {", "\tmediump vec2 diff = vTex - vec2(0.5, 0.5);", "\tmediump vec2 diffSq = diff * diff;", "\tmediump float f = step(diffSq.x + diffSq.y, 0.25);", "\tgl_FragColor = color * f;", "}"].join("\n")
|
||
}
|
||
static GetHardEllipseOutlineFragmentShaderSource() {
|
||
return ["varying mediump vec2 vTex;", "uniform lowp vec4 color;", "uniform mediump vec2 pixelSize;", "uniform mediump float outlineThickness;", "void main(void) {", "\tmediump vec2 diff = vTex - vec2(0.5, 0.5);", "\tmediump vec2 diffSq = diff * diff;", "\tmediump float distSq = diffSq.x + diffSq.y;", "\tmediump vec2 norm = normalize(diff);", "\tmediump vec2 halfNorm = norm * 0.5;", "\tmediump float innerF = step(distSq, 0.25);", "\tmediump vec2 innerEdge = halfNorm - pixelSize * norm * outlineThickness;", "\tmediump vec2 innerEdgeSq = innerEdge * innerEdge;", "\tmediump float outerF = step(innerEdgeSq.x + innerEdgeSq.y, distSq);", "\tgl_FragColor = color * innerF * outerF;", "}"].join("\n")
|
||
}
|
||
static GetSmoothEllipseFillFragmentShaderSource() {
|
||
return ["varying mediump vec2 vTex;", "uniform lowp vec4 color;", "uniform mediump vec2 pixelSize;", "void main(void) {", "\tmediump vec2 diff = vTex - vec2(0.5, 0.5);", "\tmediump vec2 diffSq = diff * diff;", "\tmediump vec2 norm = normalize(diff);", "\tmediump vec2 halfNorm = norm * 0.5;", "\tmediump vec2 halfNormSq = halfNorm * halfNorm;", "\tmediump vec2 innerEdge = halfNorm - pixelSize * norm;", "\tmediump vec2 innerEdgeSq = innerEdge * innerEdge;", "\tmediump float f = smoothstep(halfNormSq.x + halfNormSq.y, innerEdgeSq.x + innerEdgeSq.y, diffSq.x + diffSq.y);", "\tgl_FragColor = color * f;", "}"].join("\n")
|
||
}
|
||
static GetSmoothEllipseOutlineFragmentShaderSource() {
|
||
return ["varying mediump vec2 vTex;", "uniform lowp vec4 color;", "uniform mediump vec2 pixelSize;", "uniform mediump float outlineThickness;", "void main(void) {", "\tmediump vec2 diff = vTex - vec2(0.5, 0.5);", "\tmediump vec2 diffSq = diff * diff;", "\tmediump float distSq = diffSq.x + diffSq.y;", "\tmediump vec2 norm = normalize(diff);", "\tmediump vec2 halfNorm = norm * 0.5;", "\tmediump vec2 halfNormSq = halfNorm * halfNorm;", "\tmediump vec2 pxNorm = pixelSize * norm;", "\tmediump vec2 innerEdge1 = halfNorm - pxNorm;", "\tmediump vec2 innerEdge1Sq = innerEdge1 * innerEdge1;", "\tmediump float innerF = smoothstep(halfNormSq.x + halfNormSq.y, innerEdge1Sq.x + innerEdge1Sq.y, distSq);", "\tmediump vec2 innerEdge2 = halfNorm - pxNorm * outlineThickness;", "\tmediump vec2 innerEdge2Sq = innerEdge2 * innerEdge2;", "\tmediump vec2 innerEdge3 = halfNorm - pxNorm * (outlineThickness + 1.0);", "\tmediump vec2 innerEdge3Sq = innerEdge3 * innerEdge3;", "\tmediump float outerF = smoothstep(innerEdge3Sq.x + innerEdge3Sq.y, innerEdge2Sq.x + innerEdge2Sq.y, distSq);", "\tgl_FragColor = color * innerF * outerF;", "}"].join("\n")
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const TYPE_SIZES = new Map([["float", 1], ["percent", 1], ["sampler", 1], ["vec2", 2], ["vec3", 3], ["color", 3], ["vec4", 4], ["mat4", 16]]);
|
||
function areMat4sEqual(a, b) {
|
||
return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]
|
||
}
|
||
C3.Gfx.WebGLShaderUniform = class WebGLShaderUniform {
|
||
constructor(owner, name, type) {
|
||
if (!TYPE_SIZES.has(type))
|
||
throw new Error("invalid uniform type");
|
||
this._owner = owner;
|
||
this._gl = this._owner.GetWebGLContext();
|
||
this._name = name;
|
||
this._type = type;
|
||
this._isColorType = this._type === "color";
|
||
this._location = this._gl.getUniformLocation(this._owner.GetShaderProgram(), name);
|
||
this._isUsed = !!this._location;
|
||
const typeSize = TYPE_SIZES.get(type);
|
||
this._lastValue = new Float32Array(typeSize);
|
||
this._lastBatchValue = new Float32Array(typeSize)
|
||
}
|
||
Release() {
|
||
this._owner = null;
|
||
this._gl = null;
|
||
this._location = null
|
||
}
|
||
IsUsed() {
|
||
return this._isUsed
|
||
}
|
||
GetType() {
|
||
return this._type
|
||
}
|
||
IsColorType() {
|
||
return this._isColorType
|
||
}
|
||
Init1f(v0) {
|
||
if (!this.IsUsed())
|
||
return;
|
||
this._lastValue[0] = v0;
|
||
this._lastBatchValue.set(this._lastValue);
|
||
this._gl.uniform1f(this._location, v0)
|
||
}
|
||
Init1i(v0) {
|
||
if (!this.IsUsed())
|
||
return;
|
||
this._lastValue[0] = v0;
|
||
this._lastBatchValue.set(this._lastValue);
|
||
this._gl.uniform1i(this._location, v0)
|
||
}
|
||
Init2f(v0, v1) {
|
||
if (!this.IsUsed())
|
||
return;
|
||
this._lastValue[0] = v0;
|
||
this._lastValue[1] = v1;
|
||
this._lastBatchValue.set(this._lastValue);
|
||
this._gl.uniform2f(this._location, v0, v1)
|
||
}
|
||
Init3f(v0, v1, v2) {
|
||
if (!this.IsUsed())
|
||
return;
|
||
this._lastValue[0] = v0;
|
||
this._lastValue[1] = v1;
|
||
this._lastValue[2] = v2;
|
||
this._lastBatchValue.set(this._lastValue);
|
||
this._gl.uniform3f(this._location, v0, v1, v2)
|
||
}
|
||
Init4f(v0, v1, v2, v3) {
|
||
if (!this.IsUsed())
|
||
return;
|
||
this._lastValue[0] = v0;
|
||
this._lastValue[1] = v1;
|
||
this._lastValue[2] = v2;
|
||
this._lastValue[3] = v3;
|
||
this._lastBatchValue.set(this._lastValue);
|
||
this._gl.uniform4f(this._location, v0, v1, v2, v3)
|
||
}
|
||
Update1f(v0) {
|
||
v0 = Math.fround(v0);
|
||
const lastValue = this._lastValue;
|
||
if (lastValue[0] === v0)
|
||
return;
|
||
lastValue[0] = v0;
|
||
this._gl.uniform1f(this._location, v0)
|
||
}
|
||
Update1i(v0) {
|
||
const lastValue = this._lastValue;
|
||
if (lastValue[0] === v0)
|
||
return;
|
||
lastValue[0] = v0;
|
||
this._gl.uniform1i(this._location, v0)
|
||
}
|
||
Update2f(v0, v1) {
|
||
v0 = Math.fround(v0);
|
||
v1 = Math.fround(v1);
|
||
const lastValue = this._lastValue;
|
||
if (lastValue[0] === v0 && lastValue[1] === v1)
|
||
return;
|
||
lastValue[0] = v0;
|
||
lastValue[1] = v1;
|
||
this._gl.uniform2f(this._location, v0, v1)
|
||
}
|
||
Update3f(v0, v1, v2) {
|
||
v0 = Math.fround(v0);
|
||
v1 = Math.fround(v1);
|
||
v2 = Math.fround(v2);
|
||
const lastValue = this._lastValue;
|
||
if (lastValue[0] === v0 && lastValue[1] === v1 && lastValue[2] === v2)
|
||
return;
|
||
lastValue[0] = v0;
|
||
lastValue[1] = v1;
|
||
lastValue[2] = v2;
|
||
this._gl.uniform3f(this._location, v0, v1, v2)
|
||
}
|
||
Update4f(v0, v1, v2, v3) {
|
||
v0 = Math.fround(v0);
|
||
v1 = Math.fround(v1);
|
||
v2 = Math.fround(v2);
|
||
v3 = Math.fround(v3);
|
||
const lastValue = this._lastValue;
|
||
if (lastValue[0] === v0 && lastValue[1] === v1 && lastValue[2] === v2 && lastValue[3] === v3)
|
||
return;
|
||
lastValue[0] = v0;
|
||
lastValue[1] = v1;
|
||
lastValue[2] = v2;
|
||
lastValue[3] = v3;
|
||
this._gl.uniform4f(this._location, v0, v1, v2, v3)
|
||
}
|
||
UpdateMatrix4fv(m) {
|
||
const lastValue = this._lastValue;
|
||
if (areMat4sEqual(lastValue, m))
|
||
return;
|
||
C3.typedArraySet16(lastValue, m, 0);
|
||
this._gl.uniformMatrix4fv(this._location, false, m)
|
||
}
|
||
IsSetToCustomInBatch(p) {
|
||
const batchValue = this._lastBatchValue;
|
||
if (this.IsColorType())
|
||
return batchValue[0] === Math.fround(p.getR()) && batchValue[1] === Math.fround(p.getG()) && batchValue[2] === Math.fround(p.getB());
|
||
else
|
||
return batchValue[0] === Math.fround(p)
|
||
}
|
||
SetBatchValueCustom(p) {
|
||
const batchValue = this._lastBatchValue;
|
||
if (this.IsColorType()) {
|
||
batchValue[0] = p.getR();
|
||
batchValue[1] = p.getG();
|
||
batchValue[2] = p.getB()
|
||
} else
|
||
batchValue[0] = p
|
||
}
|
||
IsSetTo1InBatch(x) {
|
||
return this._lastBatchValue[0] === Math.fround(x)
|
||
}
|
||
IsSetTo2InBatch(x, y) {
|
||
const batchValue = this._lastBatchValue;
|
||
return batchValue[0] === Math.fround(x) && batchValue[1] === Math.fround(y)
|
||
}
|
||
SetBatch1(x) {
|
||
this._lastBatchValue[0] = x
|
||
}
|
||
SetBatch2(x, y) {
|
||
const batchValue = this._lastBatchValue;
|
||
batchValue[0] = x;
|
||
batchValue[1] = y
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const glMatrix = self.glMatrix;
|
||
const vec4 = glMatrix.vec4;
|
||
const mat4 = glMatrix.mat4;
|
||
const BATCH_NULL = 0;
|
||
const BATCH_QUAD = 1;
|
||
const BATCH_SETTEXTURE = 2;
|
||
const BATCH_SETCOLOR = 3;
|
||
const BATCH_SETBLEND = 4;
|
||
const BATCH_UPDATEMODELVIEW = 5;
|
||
const BATCH_SETRENDERTARGET = 6;
|
||
const BATCH_CLEARSURFACE = 7;
|
||
const BATCH_CLEARRECT = 8;
|
||
const BATCH_POINTS = 9;
|
||
const BATCH_SETPROGRAM = 10;
|
||
const BATCH_SETPROGRAMPARAMETERS = 11;
|
||
const BATCH_INVALIDATEFRAMEBUFFER = 12;
|
||
const BATCH_SETPOINTTEXCOORDS = 13;
|
||
const BATCH_SETTILEMAPINFO = 14;
|
||
const BATCH_BLITFRAMEBUFFER = 15;
|
||
const BATCH_STARTQUERY = 16;
|
||
const BATCH_ENDQUERY = 17;
|
||
const BATCH_SETELLIPSEPARAMS = 18;
|
||
const BATCH_SETGRADIENTCOLOR = 19;
|
||
C3.Gfx.BatchState = class BatchState {
|
||
constructor(renderer) {
|
||
this.renderer = renderer;
|
||
this.currentMV = mat4.create();
|
||
this.currentMatP = mat4.create();
|
||
this.currentFramebuffer = null;
|
||
this.currentColor = vec4.fromValues(1, 1, 1, 1);
|
||
this.currentShader = null;
|
||
this.pointTexCoords = new C3.Rect;
|
||
this.clearColor = C3.New(C3.Color, 0, 0, 0, 0)
|
||
}
|
||
}
|
||
;
|
||
C3.Gfx.WebGLBatchJob = class WebGLBatchJob {
|
||
constructor(batchState) {
|
||
const arrayBuffer = new ArrayBuffer(96);
|
||
this._type = 0;
|
||
this._batchState = batchState;
|
||
this._gl = batchState.renderer.GetContext();
|
||
this._startIndex = 0;
|
||
this._indexCount = 0;
|
||
this._texParam = null;
|
||
this._mat4param = new Float32Array(arrayBuffer,0,16);
|
||
this._colorParam = new Float32Array(arrayBuffer,64,4);
|
||
this._srcOriginRect = new Float32Array(arrayBuffer,80,4);
|
||
this._shaderParams = []
|
||
}
|
||
InitQuad(startIndex, indexCount) {
|
||
this._type = BATCH_QUAD;
|
||
this._startIndex = startIndex;
|
||
this._indexCount = indexCount
|
||
}
|
||
DoQuad() {
|
||
const gl = this._gl;
|
||
gl.drawElements(gl.TRIANGLES, this._indexCount, gl.UNSIGNED_SHORT, this._startIndex)
|
||
}
|
||
InitSetTexture(rendererTex) {
|
||
this._type = BATCH_SETTEXTURE;
|
||
this._texParam = rendererTex
|
||
}
|
||
DoSetTexture() {
|
||
const gl = this._gl;
|
||
const texParam = this._texParam;
|
||
gl.bindTexture(gl.TEXTURE_2D, texParam ? texParam._GetTexture() : null)
|
||
}
|
||
InitSetColor(c) {
|
||
this._type = BATCH_SETCOLOR;
|
||
c.writeToTypedArray(this._colorParam, 0)
|
||
}
|
||
DoSetColor() {
|
||
const c = this._colorParam;
|
||
const batchState = this._batchState;
|
||
vec4.copy(batchState.currentColor, c);
|
||
batchState.currentShader.UpdateColor(c)
|
||
}
|
||
InitSetGradientColor(c) {
|
||
this._type = BATCH_SETGRADIENTCOLOR;
|
||
c.writeToTypedArray(this._colorParam, 0)
|
||
}
|
||
DoSetGradientColor() {
|
||
const c = this._colorParam;
|
||
const s = this._batchState.currentShader;
|
||
if (s._uColor2.IsUsed())
|
||
s._uColor2.Update4f(c[0], c[1], c[2], c[3])
|
||
}
|
||
InitSetBlend(s, d) {
|
||
this._type = BATCH_SETBLEND;
|
||
this._startIndex = s;
|
||
this._indexCount = d
|
||
}
|
||
DoSetBlend() {
|
||
this._gl.blendFunc(this._startIndex, this._indexCount)
|
||
}
|
||
InitUpdateModelView(m) {
|
||
this._type = BATCH_UPDATEMODELVIEW;
|
||
mat4.copy(this._mat4param, m)
|
||
}
|
||
DoUpdateModelView() {
|
||
const batchState = this._batchState;
|
||
const allShaderPrograms = batchState.renderer._allShaderPrograms;
|
||
const currentShader = batchState.currentShader;
|
||
const mat4param = this._mat4param;
|
||
for (let i = 0, len = allShaderPrograms.length; i < len; ++i) {
|
||
const s = allShaderPrograms[i];
|
||
if (s === currentShader)
|
||
s.UpdateMatMV(mat4param, true);
|
||
else
|
||
s.SetMatMVStale()
|
||
}
|
||
mat4.copy(batchState.currentMV, mat4param)
|
||
}
|
||
InitSetRenderTarget(renderTarget, didSurfaceSizeChange, matP) {
|
||
this._type = BATCH_SETRENDERTARGET;
|
||
this._texParam = renderTarget;
|
||
this._startIndex = didSurfaceSizeChange ? 1 : 0;
|
||
if (didSurfaceSizeChange)
|
||
mat4.copy(this._mat4param, matP)
|
||
}
|
||
DoSetRenderTarget() {
|
||
const gl = this._gl;
|
||
const renderTarget = this._texParam;
|
||
const didSurfaceSizeChange = this._startIndex !== 0;
|
||
const matP = this._mat4param;
|
||
const batchState = this._batchState;
|
||
const renderer = batchState.renderer;
|
||
let newViewportWidth, newViewportHeight;
|
||
if (renderTarget) {
|
||
const fbo = renderTarget._GetFramebuffer();
|
||
batchState.currentFramebuffer = fbo;
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
|
||
newViewportWidth = renderTarget.GetWidth();
|
||
newViewportHeight = renderTarget.GetHeight()
|
||
} else {
|
||
batchState.currentFramebuffer = null;
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
||
newViewportWidth = renderer.GetScissoredViewportWidth();
|
||
newViewportHeight = renderer.GetScissoredViewportHeight()
|
||
}
|
||
if (didSurfaceSizeChange)
|
||
renderer._UpdateViewportBatch(newViewportWidth, newViewportHeight, matP)
|
||
}
|
||
InitClearSurface(c) {
|
||
this._type = BATCH_CLEARSURFACE;
|
||
c.writeToTypedArray(this._mat4param, 0)
|
||
}
|
||
InitClearSurface2(r, g, b, a) {
|
||
this._type = BATCH_CLEARSURFACE;
|
||
const c = this._mat4param;
|
||
c[0] = r;
|
||
c[1] = g;
|
||
c[2] = b;
|
||
c[3] = a
|
||
}
|
||
DoClearSurface() {
|
||
const gl = this._gl;
|
||
const mat4param = this._mat4param;
|
||
const batchState = this._batchState;
|
||
const renderer = batchState.renderer;
|
||
const lastClearColor = batchState.clearColor;
|
||
const debugSkipScissor = renderer._isScissorViewport && C3.isDebug;
|
||
if (debugSkipScissor)
|
||
gl.disable(gl.SCISSOR_TEST);
|
||
const r = mat4param[0];
|
||
const g = mat4param[1];
|
||
const b = mat4param[2];
|
||
const a = mat4param[3];
|
||
if (!lastClearColor.equalsRgba(r, g, b, a)) {
|
||
gl.clearColor(r, g, b, a);
|
||
lastClearColor.setRgba(r, g, b, a)
|
||
}
|
||
gl.clear(gl.COLOR_BUFFER_BIT);
|
||
if (debugSkipScissor)
|
||
gl.enable(gl.SCISSOR_TEST)
|
||
}
|
||
InitClearRect(x, y, w, h, r, g, b, a) {
|
||
this._type = BATCH_CLEARRECT;
|
||
const m = this._mat4param;
|
||
m[0] = x;
|
||
m[1] = y;
|
||
m[2] = w;
|
||
m[3] = h;
|
||
m[4] = r;
|
||
m[5] = g;
|
||
m[6] = b;
|
||
m[7] = a
|
||
}
|
||
DoClearRectangle() {
|
||
const gl = this._gl;
|
||
const mat4param = this._mat4param;
|
||
const batchState = this._batchState;
|
||
const renderer = batchState.renderer;
|
||
const lastClearColor = batchState.clearColor;
|
||
if (!renderer._isScissorViewport)
|
||
gl.enable(gl.SCISSOR_TEST);
|
||
gl.scissor(mat4param[0], mat4param[1], mat4param[2], mat4param[3]);
|
||
const r = mat4param[4];
|
||
const g = mat4param[5];
|
||
const b = mat4param[6];
|
||
const a = mat4param[7];
|
||
if (!lastClearColor.equalsRgba(r, g, b, a)) {
|
||
gl.clearColor(r, g, b, a);
|
||
lastClearColor.setRgba(r, g, b, a)
|
||
}
|
||
gl.clear(gl.COLOR_BUFFER_BIT);
|
||
if (!renderer._isScissorViewport)
|
||
gl.disable(gl.SCISSOR_TEST);
|
||
else
|
||
gl.scissor(0, 0, renderer._viewportScissorWidth, renderer._viewportScissorHeight)
|
||
}
|
||
InitSetPointTexCoords(rect) {
|
||
this._type = BATCH_SETPOINTTEXCOORDS;
|
||
rect.writeToTypedArray(this._mat4param, 0)
|
||
}
|
||
DoSetPointTextureCoords() {
|
||
const mat4param = this._mat4param;
|
||
this._batchState.pointTexCoords.set(mat4param[0], mat4param[1], mat4param[2], mat4param[3])
|
||
}
|
||
InitPoints(startIndex, z) {
|
||
this._type = BATCH_POINTS;
|
||
this._startIndex = startIndex;
|
||
this._indexCount = 1;
|
||
this._mat4param[0] = z
|
||
}
|
||
DoPoints() {
|
||
const gl = this._gl;
|
||
const batchState = this._batchState;
|
||
const renderer = batchState.renderer;
|
||
const s = renderer._spPoints;
|
||
gl.useProgram(s._shaderProgram);
|
||
s.UpdateMatP(batchState.currentMatP, false);
|
||
s.UpdateMatMV(batchState.currentMV, false);
|
||
const ptc = batchState.pointTexCoords;
|
||
if (s._uPointTexStart.IsUsed())
|
||
s._uPointTexStart.Update2f(ptc.getLeft(), ptc.getTop());
|
||
if (s._uPointTexEnd.IsUsed())
|
||
s._uPointTexEnd.Update2f(ptc.getRight(), ptc.getBottom());
|
||
const z = this._mat4param[0];
|
||
if (s._uZElevation.IsUsed())
|
||
s._uZElevation.Update1f(z);
|
||
if (s._uColor.IsUsed()) {
|
||
const c = batchState.currentColor;
|
||
s._uColor.Update4f(c[0], c[1], c[2], c[3])
|
||
}
|
||
gl.drawArrays(gl.POINTS, this._startIndex / 4, this._indexCount);
|
||
gl.useProgram(batchState.currentShader._shaderProgram)
|
||
}
|
||
InitSetProgram(program) {
|
||
this._type = BATCH_SETPROGRAM;
|
||
this._texParam = program
|
||
}
|
||
DoSetProgram() {
|
||
const gl = this._gl;
|
||
const batchState = this._batchState;
|
||
const s = this._texParam;
|
||
batchState.currentShader = s;
|
||
gl.useProgram(s._shaderProgram);
|
||
s.UpdateMatP(batchState.currentMatP, false);
|
||
s.UpdateMatMV(batchState.currentMV, false);
|
||
if (s._uColor.IsUsed()) {
|
||
const c = batchState.currentColor;
|
||
s._uColor.Update4f(c[0], c[1], c[2], c[3])
|
||
}
|
||
}
|
||
InitSetProgramParameters() {
|
||
this._type = BATCH_SETPROGRAMPARAMETERS
|
||
}
|
||
DoSetProgramParameters() {
|
||
const s = this._batchState.currentShader;
|
||
if (s._hasAnyOptionalUniforms)
|
||
this._DoSetOptionalUniformProgramParameters(s);
|
||
if (s._uCustomParameters.length)
|
||
this._DoUpdateCustomProgramParameters(s)
|
||
}
|
||
_DoSetOptionalUniformProgramParameters(s) {
|
||
const gl = this._gl;
|
||
const mat4param = this._mat4param;
|
||
const colorParam = this._colorParam;
|
||
const srcOriginRect = this._srcOriginRect;
|
||
if (s._uSamplerBack.IsUsed()) {
|
||
const renderer = this._batchState.renderer;
|
||
const texParam = this._texParam;
|
||
if (renderer._lastTexture1 !== texParam) {
|
||
gl.activeTexture(gl.TEXTURE1);
|
||
gl.bindTexture(gl.TEXTURE_2D, texParam ? texParam._GetTexture() : null);
|
||
renderer._lastTexture1 = texParam;
|
||
gl.activeTexture(gl.TEXTURE0)
|
||
}
|
||
}
|
||
if (s._uPixelSize.IsUsed())
|
||
s._uPixelSize.Update2f(mat4param[0], mat4param[1]);
|
||
if (s._uDestStart.IsUsed())
|
||
s._uDestStart.Update2f(mat4param[2], mat4param[3]);
|
||
if (s._uDestEnd.IsUsed())
|
||
s._uDestEnd.Update2f(mat4param[4], mat4param[5]);
|
||
if (s._uLayerScale.IsUsed())
|
||
s._uLayerScale.Update1f(mat4param[6]);
|
||
if (s._uLayerAngle.IsUsed())
|
||
s._uLayerAngle.Update1f(mat4param[7]);
|
||
if (s._uSrcStart.IsUsed())
|
||
s._uSrcStart.Update2f(mat4param[12], mat4param[13]);
|
||
if (s._uSrcEnd.IsUsed())
|
||
s._uSrcEnd.Update2f(mat4param[14], mat4param[15]);
|
||
if (s._uSrcOriginStart.IsUsed())
|
||
s._uSrcOriginStart.Update2f(srcOriginRect[0], srcOriginRect[1]);
|
||
if (s._uSrcOriginEnd.IsUsed())
|
||
s._uSrcOriginEnd.Update2f(srcOriginRect[2], srcOriginRect[3]);
|
||
if (s._uLayoutStart.IsUsed())
|
||
s._uLayoutStart.Update2f(colorParam[0], colorParam[1]);
|
||
if (s._uLayoutEnd.IsUsed())
|
||
s._uLayoutEnd.Update2f(colorParam[2], colorParam[3]);
|
||
if (s._uSeconds.IsUsed())
|
||
s._uSeconds.Update1f(this._startIndex)
|
||
}
|
||
_DoUpdateCustomProgramParameters(s) {
|
||
const uCustomParameters = s._uCustomParameters;
|
||
const shaderParams = this._shaderParams;
|
||
for (let i = 0, len = uCustomParameters.length; i < len; ++i) {
|
||
const shaderUniform = uCustomParameters[i];
|
||
const paramValue = shaderParams[i];
|
||
if (shaderUniform.IsColorType())
|
||
shaderUniform.Update3f(paramValue.getR(), paramValue.getG(), paramValue.getB());
|
||
else
|
||
shaderUniform.Update1f(paramValue)
|
||
}
|
||
}
|
||
InitInvalidateFramebuffer(fbo) {
|
||
this._type = BATCH_INVALIDATEFRAMEBUFFER;
|
||
this._texParam = fbo
|
||
}
|
||
DoInvalidateFramebuffer() {
|
||
const gl = this._gl;
|
||
const fbo = this._texParam;
|
||
const lastBoundFbo = this._batchState.currentFramebuffer;
|
||
if (fbo !== lastBoundFbo)
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
|
||
gl.invalidateFramebuffer(gl.FRAMEBUFFER, [gl.COLOR_ATTACHMENT0]);
|
||
if (fbo !== lastBoundFbo)
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, lastBoundFbo)
|
||
}
|
||
InitBlitFramebuffer(sourceRenderTarget, destRenderTarget, mode) {
|
||
this._type = BATCH_BLITFRAMEBUFFER;
|
||
const mat4param = this._mat4param;
|
||
const renderer = this._batchState.renderer;
|
||
mat4param[0] = sourceRenderTarget.GetWidth();
|
||
mat4param[1] = sourceRenderTarget.GetHeight();
|
||
mat4param[2] = destRenderTarget ? destRenderTarget.GetWidth() : renderer.GetWidth();
|
||
mat4param[3] = destRenderTarget ? destRenderTarget.GetHeight() : renderer.GetHeight();
|
||
mat4param[4] = sourceRenderTarget.IsLinearSampling() ? 1 : 0;
|
||
mat4param[5] = mode === "stretch";
|
||
const shaderParams = this._shaderParams;
|
||
C3.clearArray(shaderParams);
|
||
shaderParams.push(sourceRenderTarget._GetFramebuffer());
|
||
shaderParams.push(destRenderTarget ? destRenderTarget._GetFramebuffer() : null)
|
||
}
|
||
DoBlitFramebuffer() {
|
||
const mat4param = this._mat4param;
|
||
const shaderParams = this._shaderParams;
|
||
const gl = this._gl;
|
||
const srcWidth = mat4param[0];
|
||
const srcHeight = mat4param[1];
|
||
const destWidth = mat4param[2];
|
||
const destHeight = mat4param[3];
|
||
const isLinearSampling = mat4param[4] !== 0;
|
||
const isStretch = mat4param[5] !== 0;
|
||
const srcFbo = shaderParams[0];
|
||
const destFbo = shaderParams[1];
|
||
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, srcFbo);
|
||
gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, destFbo);
|
||
if (isStretch)
|
||
gl.blitFramebuffer(0, 0, srcWidth, srcHeight, 0, 0, destWidth, destHeight, gl.COLOR_BUFFER_BIT, isLinearSampling ? gl.LINEAR : gl.NEAREST);
|
||
else {
|
||
const w = Math.min(srcWidth, destWidth);
|
||
const h = Math.min(srcHeight, destHeight);
|
||
const srcOffY = Math.max(srcHeight - destHeight, 0);
|
||
const destOffY = Math.max(destHeight - srcHeight, 0);
|
||
gl.blitFramebuffer(0, srcOffY, w, h + srcOffY, 0, destOffY, w, h + destOffY, gl.COLOR_BUFFER_BIT, gl.NEAREST)
|
||
}
|
||
}
|
||
InitStartQuery(query) {
|
||
this._type = BATCH_STARTQUERY;
|
||
this._texParam = query
|
||
}
|
||
DoStartQuery() {
|
||
this._texParam.BeginTimeElapsed();
|
||
this._texParam = null
|
||
}
|
||
InitEndQuery(query) {
|
||
this._type = BATCH_ENDQUERY;
|
||
this._texParam = query
|
||
}
|
||
DoEndQuery() {
|
||
this._texParam.EndTimeElapsed();
|
||
this._texParam = null
|
||
}
|
||
InitSetEllipseParams(pixelW, pixelH, outlineThickness) {
|
||
this._type = BATCH_SETELLIPSEPARAMS;
|
||
const mat4param = this._mat4param;
|
||
mat4param[0] = pixelW;
|
||
mat4param[1] = pixelH;
|
||
mat4param[2] = outlineThickness
|
||
}
|
||
DoSetEllipseParams() {
|
||
const s = this._batchState.currentShader;
|
||
const mat4param = this._mat4param;
|
||
if (s._uPixelSize.IsUsed())
|
||
s._uPixelSize.Update2f(mat4param[0], mat4param[1]);
|
||
if (s._uOutlineThickness.IsUsed())
|
||
s._uOutlineThickness.Update1f(mat4param[2])
|
||
}
|
||
InitSetTilemapInfo(srcRect, textureWidth, textureHeight, tileWidth, tileHeight, tileSpacingX, tileSpacingY) {
|
||
this._type = BATCH_SETTILEMAPINFO;
|
||
const mat4param = this._mat4param;
|
||
srcRect.writeToTypedArray(mat4param, 0);
|
||
mat4param[4] = 1 / textureWidth;
|
||
mat4param[5] = 1 / textureHeight;
|
||
mat4param[6] = tileWidth / textureWidth;
|
||
mat4param[7] = tileHeight / textureHeight;
|
||
mat4param[8] = tileSpacingX / textureWidth;
|
||
mat4param[9] = tileSpacingY / textureHeight
|
||
}
|
||
DoSetTilemapInfo() {
|
||
const s = this._batchState.currentShader;
|
||
const mat4param = this._mat4param;
|
||
if (s._uSrcStart.IsUsed())
|
||
s._uSrcStart.Update2f(mat4param[0], mat4param[1]);
|
||
if (s._uPixelSize.IsUsed())
|
||
s._uPixelSize.Update2f(mat4param[4], mat4param[5]);
|
||
if (s._uTileSize.IsUsed())
|
||
s._uTileSize.Update2f(mat4param[6], mat4param[7]);
|
||
if (s._uTileSpacing.IsUsed())
|
||
s._uTileSpacing.Update2f(mat4param[8], mat4param[9])
|
||
}
|
||
Run() {
|
||
switch (this._type) {
|
||
case 1:
|
||
this.DoQuad();
|
||
return;
|
||
case 2:
|
||
this.DoSetTexture();
|
||
return;
|
||
case 3:
|
||
this.DoSetColor();
|
||
return;
|
||
case 4:
|
||
this.DoSetBlend();
|
||
return;
|
||
case 5:
|
||
this.DoUpdateModelView();
|
||
return;
|
||
case 6:
|
||
this.DoSetRenderTarget();
|
||
return;
|
||
case 7:
|
||
this.DoClearSurface();
|
||
return;
|
||
case 8:
|
||
this.DoClearRectangle();
|
||
return;
|
||
case 9:
|
||
this.DoPoints();
|
||
return;
|
||
case 10:
|
||
this.DoSetProgram();
|
||
return;
|
||
case 11:
|
||
this.DoSetProgramParameters();
|
||
return;
|
||
case 12:
|
||
this.DoInvalidateFramebuffer();
|
||
return;
|
||
case 13:
|
||
this.DoSetPointTextureCoords();
|
||
return;
|
||
case 14:
|
||
this.DoSetTilemapInfo();
|
||
return;
|
||
case 15:
|
||
this.DoBlitFramebuffer();
|
||
return;
|
||
case 16:
|
||
this.DoStartQuery();
|
||
return;
|
||
case 17:
|
||
this.DoEndQuery();
|
||
return;
|
||
case 18:
|
||
this.DoSetEllipseParams();
|
||
return;
|
||
case 19:
|
||
this.DoSetGradientColor();
|
||
return
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const MAX_TEXTURE_SIZE = 2048;
|
||
const EXTRA_LINE_HEIGHT = 4;
|
||
const DEFAULT_OPTS = {
|
||
timeout: 60
|
||
};
|
||
const tempColor = new C3.Color(0,0,0,1);
|
||
const VALID_HORIZ_ALIGNMENTS = new Set(["left", "center", "right"]);
|
||
const VALID_VERT_ALIGNMENTS = new Set(["top", "center", "bottom"]);
|
||
const VALID_WORD_WRAP_MODES = new Set(["word", "character"]);
|
||
const allRendererTexts = new Set;
|
||
if (C3.FontManager)
|
||
C3.FontManager.addEventListener("fontload", e=>{
|
||
const fontName = e.font.GetName();
|
||
for (const f of allRendererTexts)
|
||
if (f.IsBBCodeEnabled() || C3.equalsNoCase(f.GetFontName(), fontName))
|
||
f._SetTextChanged()
|
||
}
|
||
);
|
||
function fillOrStrokeText(ctx, isStroke, text, x, y, maxWidth) {
|
||
if (isStroke)
|
||
if (C3.Platform.BrowserEngine === "Gecko")
|
||
ctx.strokeText(text, x, y, maxWidth);
|
||
else
|
||
ctx.strokeText(text, x, y);
|
||
else if (C3.Platform.BrowserEngine === "Gecko")
|
||
ctx.fillText(text, x, y, maxWidth);
|
||
else
|
||
ctx.fillText(text, x, y)
|
||
}
|
||
function fillOrStrokeRect(ctx, isStroke, x, y, w, h) {
|
||
if (isStroke)
|
||
ctx.strokeRect(x, y, w, h);
|
||
else
|
||
ctx.fillRect(x, y, w, h)
|
||
}
|
||
function ptToPx(pt) {
|
||
return pt * (4 / 3)
|
||
}
|
||
C3.Gfx.RendererText = class RendererText {
|
||
constructor(renderer, opts) {
|
||
opts = Object.assign({}, DEFAULT_OPTS, opts);
|
||
this._renderer = renderer;
|
||
this._fontName = "Arial";
|
||
this._fontSize = 16;
|
||
this._lineHeight = 0;
|
||
this._isBold = false;
|
||
this._isItalic = false;
|
||
this._colorStr = "black";
|
||
this._isBBcodeEnabled = false;
|
||
this.onloadfont = null;
|
||
this._alreadyLoadedFonts = new Set;
|
||
this._horizontalAlign = "left";
|
||
this._verticalAlign = "top";
|
||
this._text = "";
|
||
this._bbString = null;
|
||
this._wrappedText = C3.New(C3.WordWrap);
|
||
this._wrapMode = "word";
|
||
this._textChanged = false;
|
||
this._isUpdating = false;
|
||
this._isAsync = true;
|
||
this._drawMaxCharCount = -1;
|
||
this._drawCharCount = 0;
|
||
this._cssWidth = 0;
|
||
this._cssHeight = 0;
|
||
this._width = 0;
|
||
this._height = 0;
|
||
this._zoom = 1;
|
||
this._changed = false;
|
||
this._textCanvas = null;
|
||
this._textContext = null;
|
||
this._measureContext = null;
|
||
this._lastCanvasWidth = -1;
|
||
this._lastCanvasHeight = -1;
|
||
this._lastTextCanvasFont = "";
|
||
this._lastMeasureCanvasFont = "";
|
||
this._lastTextCanvasFillStyle = "";
|
||
this._lastTextCanvasOpacity = 1;
|
||
this._lastTextCanvasLineWidth = 1;
|
||
this._measureTextCallback = (text,styles)=>this._MeasureText(text, styles);
|
||
this._texture = null;
|
||
this._textureWidth = 0;
|
||
this._textureHeight = 0;
|
||
this._rcTex = new C3.Rect;
|
||
this._scaleFactor = 1;
|
||
this._needToRecreateTexture = false;
|
||
this._textureTimeout = new C3.IdleTimeout(()=>{
|
||
this.ReleaseTexture();
|
||
this._SetTextCanvasSize(8, 8)
|
||
}
|
||
,opts.timeout);
|
||
this.ontextureupdate = null;
|
||
this._wasReleased = false;
|
||
allRendererTexts.add(this)
|
||
}
|
||
Release() {
|
||
this.onloadfont = null;
|
||
this._alreadyLoadedFonts.clear();
|
||
this._bbString = null;
|
||
this._textCanvas = null;
|
||
this._textContext = null;
|
||
this._measureContext = null;
|
||
this._measureTextCallback = null;
|
||
this._textureTimeout.Release();
|
||
this.ontextureupdate = null;
|
||
this.ReleaseTexture();
|
||
this._wrappedText.Clear();
|
||
this._wrappedText = null;
|
||
this._renderer = null;
|
||
this._wasReleased = true;
|
||
allRendererTexts.delete(this)
|
||
}
|
||
_SetChanged() {
|
||
this._changed = true
|
||
}
|
||
_SetTextChanged() {
|
||
this._SetChanged();
|
||
this._wrappedText.Clear();
|
||
this._textChanged = true
|
||
}
|
||
SetIsAsync(a) {
|
||
this._isAsync = !!a
|
||
}
|
||
IsAsync() {
|
||
return this._isAsync
|
||
}
|
||
SetBBCodeEnabled(e) {
|
||
e = !!e;
|
||
if (this._isBBcodeEnabled === e)
|
||
return;
|
||
this._isBBcodeEnabled = e;
|
||
if (this._textContext)
|
||
this._textContext.textBaseline = this._isBBcodeEnabled ? "alphabetic" : "top";
|
||
this._SetTextChanged()
|
||
}
|
||
IsBBCodeEnabled() {
|
||
return this._isBBcodeEnabled
|
||
}
|
||
SetFontName(fontName) {
|
||
if (!fontName)
|
||
fontName = "serif";
|
||
if (this._fontName === fontName)
|
||
return;
|
||
this._fontName = fontName;
|
||
this._SetTextChanged()
|
||
}
|
||
GetFontName() {
|
||
return this._fontName
|
||
}
|
||
SetFontSize(fontSize) {
|
||
if (fontSize < .1)
|
||
fontSize = .1;
|
||
if (this._fontSize === fontSize)
|
||
return;
|
||
this._fontSize = fontSize;
|
||
this._SetTextChanged()
|
||
}
|
||
SetLineHeight(h) {
|
||
if (this._lineHeight === h)
|
||
return;
|
||
this._lineHeight = h;
|
||
this._SetChanged()
|
||
}
|
||
SetBold(bold) {
|
||
bold = !!bold;
|
||
if (this._isBold === bold)
|
||
return;
|
||
this._isBold = bold;
|
||
this._SetTextChanged()
|
||
}
|
||
SetItalic(italic) {
|
||
italic = !!italic;
|
||
if (this._isItalic === italic)
|
||
return;
|
||
this._isItalic = italic;
|
||
this._SetTextChanged()
|
||
}
|
||
SetDrawMaxCharacterCount(n) {
|
||
n = Math.floor(n);
|
||
if (this._drawMaxCharCount === n)
|
||
return;
|
||
this._drawMaxCharCount = n;
|
||
this._SetChanged()
|
||
}
|
||
GetDrawMaxCharacterCount() {
|
||
return this._drawMaxCharCount
|
||
}
|
||
_GetStyleTag(styles, tag) {
|
||
for (let i = styles.length - 1; i >= 0; --i) {
|
||
const s = styles[i];
|
||
if (s.tag === tag)
|
||
return s
|
||
}
|
||
return null
|
||
}
|
||
_HasStyleTag(styles, tag) {
|
||
return !!this._GetStyleTag(styles, tag)
|
||
}
|
||
_GetFontString(useCssUnits, styles) {
|
||
let ret = "";
|
||
if (this._isBold || this._HasStyleTag(styles, "b"))
|
||
ret += "bold";
|
||
if (this._isItalic || this._HasStyleTag(styles, "i"))
|
||
ret += " italic";
|
||
const sizeStyle = this._GetStyleTag(styles, "size");
|
||
const fontSize = sizeStyle ? parseFloat(sizeStyle.param) : this._fontSize;
|
||
if (useCssUnits)
|
||
ret += " " + fontSize + "pt";
|
||
else
|
||
ret += " " + fontSize * this._scaleFactor * this._zoom * self.devicePixelRatio + "pt";
|
||
let fontName = this._fontName;
|
||
const fontStyle = this._GetStyleTag(styles, "font");
|
||
if (fontStyle && fontStyle.param) {
|
||
fontName = fontStyle.param;
|
||
if (this.onloadfont && !this._alreadyLoadedFonts.has(fontName)) {
|
||
this.onloadfont(fontName);
|
||
this._alreadyLoadedFonts.add(fontName)
|
||
}
|
||
}
|
||
if (fontName)
|
||
ret += ' "' + fontName + '"';
|
||
return ret
|
||
}
|
||
SetColor(c) {
|
||
if (c instanceof C3.Color)
|
||
c = c.getCssRgb();
|
||
if (this._colorStr === c)
|
||
return;
|
||
this._colorStr = c;
|
||
this._SetChanged()
|
||
}
|
||
SetColorRgb(r, g, b) {
|
||
tempColor.setRgb(r, g, b);
|
||
this.SetColor(tempColor)
|
||
}
|
||
SetHorizontalAlignment(h) {
|
||
if (!VALID_HORIZ_ALIGNMENTS.has(h))
|
||
throw new Error("invalid horizontal alignment");
|
||
if (this._horizontalAlign === h)
|
||
return;
|
||
this._horizontalAlign = h;
|
||
this._SetChanged()
|
||
}
|
||
SetVerticalAlignment(v) {
|
||
if (!VALID_VERT_ALIGNMENTS.has(v))
|
||
throw new Error("invalid vertical alignment");
|
||
if (this._verticalAlign === v)
|
||
return;
|
||
this._verticalAlign = v;
|
||
this._SetChanged()
|
||
}
|
||
SetWordWrapMode(m) {
|
||
if (!VALID_WORD_WRAP_MODES.has(m))
|
||
throw new Error("invalid word wrap mode");
|
||
if (this._wrapMode === m)
|
||
return;
|
||
this._wrapMode = m;
|
||
this._SetTextChanged()
|
||
}
|
||
SetText(text) {
|
||
if (this._text === text)
|
||
return;
|
||
this._text = text;
|
||
this._SetTextChanged()
|
||
}
|
||
SetSize(cssWidth, cssHeight, zoom) {
|
||
if (typeof zoom === "undefined")
|
||
zoom = 1;
|
||
if (cssWidth <= 0 || cssWidth <= 0)
|
||
return;
|
||
if (this._cssWidth === cssWidth && this._cssHeight === cssHeight && this._zoom === zoom)
|
||
return;
|
||
if (this._zoom === 1 !== (zoom === 1))
|
||
this._needToRecreateTexture = true;
|
||
const oldCssWidth = this._cssWidth;
|
||
const oldZoom = this._zoom;
|
||
this._cssWidth = cssWidth;
|
||
this._cssHeight = cssHeight;
|
||
this._zoom = zoom;
|
||
const dpr = self.devicePixelRatio;
|
||
this._width = this._cssWidth * this._zoom * dpr;
|
||
this._height = this._cssHeight * this._zoom * dpr;
|
||
const maxDim = Math.max(this._width, this._height);
|
||
const maxTextureSize = Math.min(this._renderer.GetMaxTextureSize(), MAX_TEXTURE_SIZE);
|
||
let scale = 1;
|
||
if (maxDim > maxTextureSize) {
|
||
scale = maxTextureSize / maxDim;
|
||
this._width = Math.min(this._width * scale, maxTextureSize);
|
||
this._height = Math.min(this._height * scale, maxTextureSize)
|
||
}
|
||
this._scaleFactor = scale;
|
||
if (this._textureWidth > 0 && this._textureHeight > 0 && this._zoom === oldZoom)
|
||
this._rcTex.set(0, 0, this._width / this._textureWidth, this._height / this._textureHeight);
|
||
if (this._cssWidth !== oldCssWidth)
|
||
this._SetTextChanged();
|
||
else
|
||
this._SetChanged()
|
||
}
|
||
GetWidth() {
|
||
return this._width
|
||
}
|
||
GetHeight() {
|
||
return this._height
|
||
}
|
||
GetTextWidth() {
|
||
this._MaybeWrapText();
|
||
return this._wrappedText.GetMaxLineWidth()
|
||
}
|
||
GetTextHeight() {
|
||
this._MaybeWrapText();
|
||
return this._wrappedText.GetTotalLineHeight() + this._wrappedText.GetLineCount() * (this._lineHeight + EXTRA_LINE_HEIGHT) - this._lineHeight
|
||
}
|
||
GetTexture() {
|
||
this._textureTimeout.Reset();
|
||
this._MaybeUpdate();
|
||
return this._texture
|
||
}
|
||
_MaybeUpdate() {
|
||
if (this._texture && !this._changed && !this._textChanged)
|
||
return;
|
||
if (this._isUpdating)
|
||
return;
|
||
if (this._width <= 0 || this._height <= 0)
|
||
return;
|
||
this._changed = false;
|
||
this._isUpdating = true;
|
||
if (this._isAsync)
|
||
C3.Asyncify(()=>this._DoUpdate());
|
||
else
|
||
this._DoUpdate()
|
||
}
|
||
_DoUpdate() {
|
||
if (this._wasReleased)
|
||
return;
|
||
this._SetTextCanvasSize(Math.ceil(this._width), Math.ceil(this._height));
|
||
this._MaybeWrapText();
|
||
this._DrawTextToCanvas();
|
||
this._UpdateTexture();
|
||
this._textureTimeout.Reset();
|
||
this._isUpdating = false
|
||
}
|
||
_SetTextCanvasSize(w, h) {
|
||
if (!this._textCanvas)
|
||
this._textCanvas = C3.CreateCanvas(16, 16);
|
||
let wasReset = false;
|
||
if (this._lastCanvasWidth !== w || this._lastCanvasHeight !== h) {
|
||
this._lastCanvasWidth = w;
|
||
this._lastCanvasHeight = h;
|
||
this._textCanvas.width = w;
|
||
this._textCanvas.height = h;
|
||
wasReset = true
|
||
}
|
||
if (!this._textContext) {
|
||
this._textContext = this._textCanvas.getContext("2d");
|
||
wasReset = true
|
||
}
|
||
if (wasReset) {
|
||
this._textContext.textBaseline = this._isBBcodeEnabled ? "alphabetic" : "top";
|
||
this._textContext.font = this._lastTextCanvasFont;
|
||
this._textContext.fillStyle = this._lastTextCanvasFillStyle;
|
||
this._textContext.strokeStyle = this._lastTextCanvasFillStyle;
|
||
this._textContext.globalAlpha = this._lastTextCanvasOpacity;
|
||
this._textContext.lineWidth = this._lastTextCanvasLineWidth
|
||
} else
|
||
this._textContext.clearRect(0, 0, w, h)
|
||
}
|
||
_MaybeCreateMeasureContext() {
|
||
if (this._measureContext)
|
||
return;
|
||
this._measureContext = C3.CreateCanvas(16, 16).getContext("2d")
|
||
}
|
||
_SetMeasureFontString(fontString) {
|
||
if (this._lastMeasureCanvasFont === fontString)
|
||
return;
|
||
this._lastMeasureCanvasFont = fontString;
|
||
this._measureContext.font = fontString
|
||
}
|
||
_MaybeWrapText() {
|
||
if (!this._textChanged)
|
||
return;
|
||
this._MaybeCreateMeasureContext();
|
||
if (this._isBBcodeEnabled && (!this._bbString || this._bbString.toString() !== this._text))
|
||
this._bbString = new C3.BBString(this._text,{
|
||
noEscape: true
|
||
});
|
||
this._wrappedText.WordWrap(this._isBBcodeEnabled ? this._bbString.toFragmentList() : this._text, this._measureTextCallback, this._cssWidth, this._wrapMode, 0);
|
||
this._textChanged = false
|
||
}
|
||
_MeasureText(text, styles) {
|
||
this._SetMeasureFontString(this._GetFontString(true, styles));
|
||
const sizeStyle = this._GetStyleTag(styles, "size");
|
||
const fontSize = sizeStyle ? parseFloat(sizeStyle.param) : this._fontSize;
|
||
return {
|
||
width: this._measureContext.measureText(text).width,
|
||
height: ptToPx(fontSize)
|
||
}
|
||
}
|
||
_SetDrawFontString(fontString) {
|
||
if (this._lastTextCanvasFont === fontString)
|
||
return;
|
||
this._lastTextCanvasFont = fontString;
|
||
this._textContext.font = fontString
|
||
}
|
||
_SetDrawCanvasColor(styleStr) {
|
||
if (this._lastTextCanvasFillStyle === styleStr)
|
||
return;
|
||
this._lastTextCanvasFillStyle = styleStr;
|
||
this._textContext.fillStyle = styleStr;
|
||
this._textContext.strokeStyle = styleStr
|
||
}
|
||
_SetDrawCanvasOpacity(o) {
|
||
if (this._lastTextCanvasOpacity === o)
|
||
return;
|
||
this._lastTextCanvasOpacity = o;
|
||
this._textContext.globalAlpha = o
|
||
}
|
||
_SetDrawCanvasLineWith(w) {
|
||
if (this._lastTextCanvasLineWidth === w)
|
||
return;
|
||
this._lastTextCanvasLineWidth = w;
|
||
this._textContext.lineWidth = w
|
||
}
|
||
_DrawTextToCanvas() {
|
||
this._drawCharCount = 0;
|
||
const scale = this._scaleFactor * this._zoom * self.devicePixelRatio;
|
||
const lineSpaceHeight = (EXTRA_LINE_HEIGHT + this._lineHeight) * scale;
|
||
let penY = 0;
|
||
const lines = this._wrappedText.GetLines();
|
||
const linesTotalHeight = lines.reduce((a,v)=>a + v.height * scale + lineSpaceHeight, 0) - this._lineHeight * scale;
|
||
if (this._verticalAlign === "center")
|
||
penY = Math.max(this._height / 2 - linesTotalHeight / 2, 0);
|
||
else if (this._verticalAlign === "bottom")
|
||
penY = this._height - linesTotalHeight - 2;
|
||
for (let i = 0, len = lines.length; i < len; ++i) {
|
||
const line = lines[i];
|
||
const curLineTextHeight = line.height * scale;
|
||
const startPenY = penY;
|
||
if (this._isBBcodeEnabled) {
|
||
penY += curLineTextHeight;
|
||
if (i > 0 && penY > this._height - EXTRA_LINE_HEIGHT * scale)
|
||
break
|
||
} else if (i > 0 && penY >= this._height - curLineTextHeight)
|
||
break;
|
||
if (startPenY >= 0)
|
||
this._DrawTextLine(line, penY, scale);
|
||
if (!this._isBBcodeEnabled)
|
||
penY += curLineTextHeight;
|
||
penY += lineSpaceHeight
|
||
}
|
||
}
|
||
_DrawTextLine(line, penY, scale) {
|
||
let penX = 0;
|
||
if (this._horizontalAlign === "center")
|
||
penX = (this._width - line.width * scale) / 2;
|
||
else if (this._horizontalAlign === "right")
|
||
penX = this._width - line.width * scale;
|
||
for (const frag of line.fragments) {
|
||
this._DrawTextFragment(frag, penX, penY, scale, line.height);
|
||
penX += frag.width * scale
|
||
}
|
||
}
|
||
_DrawTextFragment(frag, penX, penY, scale, lineHeight) {
|
||
const textContext = this._textContext;
|
||
const lineFontScale = lineHeight / 16;
|
||
let fragWidth = frag.width * scale;
|
||
const fragHeight = frag.height * scale;
|
||
const fragFontScale = frag.height / 16;
|
||
const lineSpaceHeight = (EXTRA_LINE_HEIGHT + this._lineHeight) * scale;
|
||
const styles = frag.styles;
|
||
let text = frag.text;
|
||
if (this._drawMaxCharCount !== -1) {
|
||
if (this._drawCharCount >= this._drawMaxCharCount)
|
||
return;
|
||
if (this._drawCharCount + text.length > this._drawMaxCharCount) {
|
||
text = text.substr(0, this._drawMaxCharCount - this._drawCharCount);
|
||
fragWidth = this._MeasureText(text, styles).width * scale
|
||
}
|
||
this._drawCharCount += text.length
|
||
}
|
||
const backgroundStyle = this._GetStyleTag(styles, "background");
|
||
const hasUnderline = this._HasStyleTag(styles, "u");
|
||
const hasStrikethrough = this._HasStyleTag(styles, "s");
|
||
if (C3.IsStringAllWhitespace(text) && !backgroundStyle && !hasUnderline && !hasStrikethrough || this._HasStyleTag(styles, "hide"))
|
||
return;
|
||
const offsetXStyle = this._GetStyleTag(styles, "offsetx");
|
||
penX += offsetXStyle ? parseFloat(offsetXStyle.param) * scale : 0;
|
||
const offsetYStyle = this._GetStyleTag(styles, "offsety");
|
||
penY += offsetYStyle ? parseFloat(offsetYStyle.param) * scale : 0;
|
||
if (backgroundStyle) {
|
||
this._SetDrawCanvasColor(backgroundStyle.param);
|
||
textContext.fillRect(penX, penY - fragHeight, fragWidth, fragHeight + lineSpaceHeight)
|
||
}
|
||
const colorStyle = this._GetStyleTag(styles, "color");
|
||
this._SetDrawCanvasColor(colorStyle ? colorStyle.param : this._colorStr);
|
||
const opacityStyle = this._GetStyleTag(styles, "opacity");
|
||
this._SetDrawCanvasOpacity(opacityStyle ? parseFloat(opacityStyle.param) / 100 : 1);
|
||
const isStroke = this._HasStyleTag(styles, "stroke");
|
||
if (isStroke)
|
||
this._SetDrawCanvasLineWith(fragFontScale * this._scaleFactor * this._zoom);
|
||
if (hasUnderline)
|
||
fillOrStrokeRect(textContext, isStroke, penX, penY + scale * lineFontScale, fragWidth, scale * lineFontScale);
|
||
if (hasStrikethrough)
|
||
fillOrStrokeRect(textContext, isStroke, penX, penY - fragHeight / 4, fragWidth, scale * fragFontScale);
|
||
this._SetDrawFontString(this._GetFontString(false, styles));
|
||
fillOrStrokeText(textContext, isStroke, text, penX, penY, fragWidth);
|
||
if (!isStroke) {
|
||
this._SetDrawCanvasLineWith(fragFontScale * this._scaleFactor * this._zoom);
|
||
const outlineStyle = this._GetStyleTag(styles, "outline");
|
||
if (outlineStyle) {
|
||
this._SetDrawCanvasColor(outlineStyle.param);
|
||
fillOrStrokeText(textContext, true, text, penX, penY, fragWidth)
|
||
}
|
||
}
|
||
}
|
||
_UpdateTexture() {
|
||
if (this._renderer.IsContextLost())
|
||
return;
|
||
this._textureWidth = Math.ceil(this._width);
|
||
this._textureHeight = Math.ceil(this._height);
|
||
this._rcTex.set(0, 0, this._width / this._textureWidth, this._height / this._textureHeight);
|
||
if (this._needToRecreateTexture) {
|
||
this.ReleaseTexture();
|
||
this._needToRecreateTexture = false
|
||
}
|
||
if (!this._texture)
|
||
this._texture = this._renderer.CreateDynamicTexture(this._textureWidth, this._textureHeight, {
|
||
mipMap: this._zoom === 1,
|
||
mipMapQuality: "high"
|
||
});
|
||
this._renderer.UpdateTexture(this._textCanvas, this._texture);
|
||
if (this.ontextureupdate)
|
||
this.ontextureupdate()
|
||
}
|
||
GetTexRect() {
|
||
return this._rcTex
|
||
}
|
||
ReleaseTexture() {
|
||
if (this._texture) {
|
||
if (!this._renderer.IsContextLost())
|
||
this._renderer.DeleteTexture(this._texture);
|
||
this._texture = null
|
||
}
|
||
}
|
||
static OnContextLost() {
|
||
for (const rendererText of allRendererTexts)
|
||
rendererText.ReleaseTexture()
|
||
}
|
||
static GetAll() {
|
||
return allRendererTexts.values()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
class WebGLRealTimeElapsedQuery {
|
||
constructor(renderer) {
|
||
this._gl = renderer.GetContext();
|
||
this._version = renderer.GetWebGLVersionNumber();
|
||
this._timerExt = renderer._GetDisjointTimerQueryExtension();
|
||
this._query = null;
|
||
this._isActive = false;
|
||
this._hasResult = false;
|
||
this._result = 0;
|
||
if (this._version === 1)
|
||
this._query = this._timerExt["createQueryEXT"]();
|
||
else
|
||
this._query = this._gl["createQuery"]()
|
||
}
|
||
Release() {
|
||
this._DeleteQueryObject();
|
||
this._gl = null;
|
||
this._timerExt = null;
|
||
this._hasResult = false
|
||
}
|
||
_DeleteQueryObject() {
|
||
if (!this._query)
|
||
return;
|
||
if (this._version === 1)
|
||
this._timerExt["deleteQueryEXT"](this._query);
|
||
else
|
||
this._gl["deleteQuery"](this._query);
|
||
this._query = null
|
||
}
|
||
BeginTimeElapsed() {
|
||
if (this._isActive)
|
||
throw new Error("query already active");
|
||
if (this._version === 1)
|
||
this._timerExt["beginQueryEXT"](this._timerExt["TIME_ELAPSED_EXT"], this._query);
|
||
else
|
||
this._gl["beginQuery"](this._timerExt["TIME_ELAPSED_EXT"], this._query);
|
||
this._isActive = true
|
||
}
|
||
EndTimeElapsed() {
|
||
if (!this._isActive)
|
||
throw new Error("query not active");
|
||
if (this._version === 1)
|
||
this._timerExt["endQueryEXT"](this._timerExt["TIME_ELAPSED_EXT"]);
|
||
else
|
||
this._gl["endQuery"](this._timerExt["TIME_ELAPSED_EXT"]);
|
||
this._isActive = false
|
||
}
|
||
CheckForResult() {
|
||
if (!this._query || this._hasResult || this._isActive)
|
||
return;
|
||
let available = false;
|
||
if (this._version === 1)
|
||
available = this._timerExt["getQueryObjectEXT"](this._query, this._timerExt["QUERY_RESULT_AVAILABLE_EXT"]);
|
||
else
|
||
available = this._gl["getQueryParameter"](this._query, this._gl["QUERY_RESULT_AVAILABLE"]);
|
||
const disjoint = this._gl.getParameter(this._timerExt["GPU_DISJOINT_EXT"]);
|
||
if (available && !disjoint) {
|
||
if (this._version === 1)
|
||
this._result = this._timerExt["getQueryObjectEXT"](this._query, this._timerExt["QUERY_RESULT_EXT"]);
|
||
else
|
||
this._result = this._gl["getQueryParameter"](this._query, this._gl["QUERY_RESULT"]);
|
||
this._result /= 1E9;
|
||
this._hasResult = true
|
||
}
|
||
if (available || disjoint)
|
||
this._DeleteQueryObject()
|
||
}
|
||
HasResult() {
|
||
return this._hasResult
|
||
}
|
||
GetResult() {
|
||
if (!this._hasResult)
|
||
throw new Error("no result available");
|
||
return this._result
|
||
}
|
||
}
|
||
C3.Gfx.WebGLTimeElapsedQuery = class WebGLTimeElapsedQuery {
|
||
constructor(renderer) {
|
||
this._renderer = renderer;
|
||
this._frameNumber = renderer.GetFrameNumber();
|
||
this._isActive = false;
|
||
this._parentQuery = null;
|
||
this._isNested = false;
|
||
this._realQuery = null;
|
||
this._queries = []
|
||
}
|
||
Release() {
|
||
for (const q of this._queries)
|
||
if (q instanceof WebGLRealTimeElapsedQuery)
|
||
q.Release();
|
||
C3.clearArray(this._queries);
|
||
this._parentQuery = null;
|
||
this._realQuery = null;
|
||
this._renderer = null
|
||
}
|
||
BeginTimeElapsed() {
|
||
if (this._isActive)
|
||
throw new Error("query already active");
|
||
const stack = this._renderer._GetTimeQueryStack();
|
||
if (stack.length > 0) {
|
||
this._isNested = true;
|
||
this._parentQuery = stack[stack.length - 1];
|
||
this._parentQuery._EndReal();
|
||
this._parentQuery._queries.push(this)
|
||
} else {
|
||
this._isNested = false;
|
||
this._parentQuery = null
|
||
}
|
||
this._isActive = true;
|
||
stack.push(this);
|
||
this._StartReal()
|
||
}
|
||
EndTimeElapsed() {
|
||
if (!this._isActive)
|
||
throw new Error("query not active");
|
||
const top = this._renderer._GetTimeQueryStack().pop();
|
||
if (top !== this)
|
||
throw new Error("can only end most nested query");
|
||
this._isActive = false;
|
||
this._EndReal();
|
||
if (this._parentQuery) {
|
||
this._parentQuery._StartReal();
|
||
this._parentQuery = null
|
||
}
|
||
}
|
||
_StartReal() {
|
||
this._realQuery = C3.New(WebGLRealTimeElapsedQuery, this._renderer);
|
||
this._queries.push(this._realQuery);
|
||
this._realQuery.BeginTimeElapsed()
|
||
}
|
||
_EndReal() {
|
||
this._realQuery.EndTimeElapsed();
|
||
this._realQuery = null
|
||
}
|
||
CheckForResult() {
|
||
for (const q of this._queries)
|
||
q.CheckForResult()
|
||
}
|
||
IsNested() {
|
||
return this._isNested
|
||
}
|
||
HasResult() {
|
||
return this._queries.every(q=>q.HasResult())
|
||
}
|
||
GetResult() {
|
||
return this._queries.reduce((a,v)=>a + v.GetResult(), 0)
|
||
}
|
||
GetFrameNumber() {
|
||
return this._frameNumber
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Gfx.WebGLQueryResultBuffer = class WebGLQueryResultBuffer {
|
||
constructor(renderer, maxQueries=1E3) {
|
||
this._renderer = renderer;
|
||
this._maxQueries = maxQueries;
|
||
this._buffer = [];
|
||
this._renderer._AddQueryResultBuffer(this)
|
||
}
|
||
Release() {
|
||
this.Clear();
|
||
this._renderer._RemoveQueryResultBuffer(this);
|
||
this._renderer = null
|
||
}
|
||
Clear() {
|
||
for (const q of this._buffer)
|
||
q.Release();
|
||
C3.clearArray(this._buffer)
|
||
}
|
||
AddTimeElapsedQuery() {
|
||
const ret = new C3.Gfx.WebGLTimeElapsedQuery(this._renderer);
|
||
this._buffer.push(ret);
|
||
if (this._buffer.length > this._maxQueries) {
|
||
const oldest = this._buffer.shift();
|
||
oldest.Release()
|
||
}
|
||
return ret
|
||
}
|
||
CheckForResults(toFrameNumber) {
|
||
for (const q of this._buffer) {
|
||
if (q.GetFrameNumber() >= toFrameNumber)
|
||
return;
|
||
if (q.IsNested())
|
||
return;
|
||
q.CheckForResult()
|
||
}
|
||
}
|
||
GetFrameRangeResultSum(startFrame, endFrame) {
|
||
if (endFrame <= startFrame)
|
||
return NaN;
|
||
let sum = 0;
|
||
for (const q of this._buffer) {
|
||
if (q.GetFrameNumber() >= endFrame)
|
||
break;
|
||
if (q.GetFrameNumber() < startFrame)
|
||
continue;
|
||
if (q.HasResult())
|
||
sum += q.GetResult();
|
||
else
|
||
return NaN
|
||
}
|
||
return sum
|
||
}
|
||
DeleteAllBeforeFrameNumber(frameNumber) {
|
||
for (let i = 0, len = this._buffer.length; i < len; ++i) {
|
||
const q = this._buffer[i];
|
||
if (q.GetFrameNumber() < frameNumber)
|
||
q.Release();
|
||
else {
|
||
if (i > 0)
|
||
this._buffer.splice(0, i);
|
||
return
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
const glMatrix = self.glMatrix;
|
||
const vec3 = glMatrix.vec3;
|
||
const vec4 = glMatrix.vec4;
|
||
const mat4 = glMatrix.mat4;
|
||
const DEFAULT_WEBGLRENDERER_OPTS = {
|
||
powerPreference: "default",
|
||
enableGpuProfiling: true,
|
||
alpha: false,
|
||
lowLatency: false,
|
||
maxWebGLVersion: 2
|
||
};
|
||
const VALID_POWER_PREFERENCES = new Set(["default", "low-power", "high-performance"]);
|
||
const MAX_VERTICES = 8E3;
|
||
const MAX_INDICES = MAX_VERTICES / 2 * 3;
|
||
const MAX_POINTS = 8E3;
|
||
const LAST_POINT = MAX_POINTS - 4;
|
||
const PARTIAL_TEXTURE_UPLOAD_CHUNK_SIZE = 256 * 1024;
|
||
function areMat4sEqual(a, b) {
|
||
return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]
|
||
}
|
||
const defaultTexCoordsQuad = new C3.Quad(0,0,1,0,1,1,0,1);
|
||
const tmpVec3 = vec3.fromValues(0, 0, 0);
|
||
const tmpVec3b = vec3.fromValues(0, 0, 0);
|
||
const tmpMat4 = mat4.create();
|
||
const tmpQuad = new C3.Quad;
|
||
const tmpRect = new C3.Rect;
|
||
let loseContextExtension = null;
|
||
if (C3.isDebug) {
|
||
self.debug_lose_context = function() {
|
||
if (!loseContextExtension) {
|
||
console.warn("WEBGL_lose_context not supported");
|
||
return
|
||
}
|
||
loseContextExtension.loseContext()
|
||
}
|
||
;
|
||
self.debug_restore_context = function() {
|
||
if (!loseContextExtension) {
|
||
console.warn("WEBGL_lose_context not supported");
|
||
return
|
||
}
|
||
loseContextExtension.restoreContext()
|
||
}
|
||
}
|
||
const pendingPolls = new Set;
|
||
let pollRafId = -1;
|
||
function CheckPendingPolls() {
|
||
pollRafId = -1;
|
||
for (const info of pendingPolls)
|
||
if (info.checkFunc()) {
|
||
info.resolve();
|
||
pendingPolls.delete(info)
|
||
}
|
||
if (pendingPolls.size > 0)
|
||
pollRafId = self.requestAnimationFrame(CheckPendingPolls)
|
||
}
|
||
function GetWebGLContext(canvas, attribs, maxWebGLVersion) {
|
||
let gl = null;
|
||
if (maxWebGLVersion >= 2) {
|
||
gl = canvas.getContext("webgl2", attribs);
|
||
if (gl)
|
||
return {
|
||
gl,
|
||
version: 2
|
||
}
|
||
}
|
||
gl = canvas.getContext("webgl", attribs);
|
||
if (!gl)
|
||
try {
|
||
gl = canvas.getContext("experimental-webgl", attribs)
|
||
} catch (err) {
|
||
console.warn("Error requesting 'experimental-webgl' context: ", err)
|
||
}
|
||
return {
|
||
gl,
|
||
version: 1
|
||
}
|
||
}
|
||
C3.Gfx.WebGLRenderer = class WebGLRenderer extends C3.Gfx.RendererBase {
|
||
constructor(canvas, opts) {
|
||
super();
|
||
opts = Object.assign({}, DEFAULT_WEBGLRENDERER_OPTS, opts);
|
||
if (!VALID_POWER_PREFERENCES.has(opts.powerPreference))
|
||
throw new Error("invalid power preference");
|
||
let hasMajorPerformanceCaveat = false;
|
||
const attribs = {
|
||
"alpha": !!opts.alpha,
|
||
"depth": false,
|
||
"antialias": false,
|
||
"powerPreference": opts.powerPreference,
|
||
"failIfMajorPerformanceCaveat": true
|
||
};
|
||
if (opts.lowLatency) {
|
||
attribs["desynchronized"] = true;
|
||
attribs["preserveDrawingBuffer"] = true
|
||
}
|
||
let ctxInfo = GetWebGLContext(canvas, attribs, opts.maxWebGLVersion);
|
||
if (!ctxInfo.gl) {
|
||
hasMajorPerformanceCaveat = true;
|
||
attribs["failIfMajorPerformanceCaveat"] = false;
|
||
ctxInfo = GetWebGLContext(canvas, attribs, opts.maxWebGLVersion)
|
||
}
|
||
if (!ctxInfo.gl)
|
||
throw new Error("failed to initialise WebGL context");
|
||
const gl = ctxInfo.gl;
|
||
this._gl = gl;
|
||
this._attribs = gl.getContextAttributes();
|
||
if (opts.lowLatency && !this._attribs["desynchronized"])
|
||
console.info("[WebGLRenderer] Low-latency mode specified but is not supported here");
|
||
this._versionString = gl.getParameter(gl.VERSION);
|
||
this._version = ctxInfo.version;
|
||
this._is3d = true;
|
||
this._lastBackbufferWidth = 0;
|
||
this._lastBackbufferHeight = 0;
|
||
this._vertexBuffer = null;
|
||
this._texcoordBuffer = null;
|
||
this._indexBuffer = null;
|
||
this._pointBuffer = null;
|
||
this._vertexData = new Float32Array(MAX_VERTICES * this.GetNumVertexComponents());
|
||
this._indexData = new Uint16Array(MAX_INDICES);
|
||
this._texcoordData = new Float32Array(MAX_VERTICES * 2);
|
||
this._pointData = new Float32Array(MAX_POINTS * 4);
|
||
this._vertexPtr = 0;
|
||
this._texPtr = 0;
|
||
this._pointPtr = 0;
|
||
this._lastVertexPtr = 0;
|
||
this._lastProgram = null;
|
||
this._spDeviceTransformTextureFill = null;
|
||
this._spColorFill = null;
|
||
this._spLinearGradientFill = null;
|
||
this._spHardEllipseFill = null;
|
||
this._spHardEllipseOutline = null;
|
||
this._spSmoothEllipseFill = null;
|
||
this._spSmoothEllipseOutline = null;
|
||
this._spSmoothLineFill = null;
|
||
this._spPoints = null;
|
||
this._spTilemapFill = null;
|
||
this._batch = [];
|
||
this._batchPtr = 0;
|
||
this._topOfBatch = 0;
|
||
this._currentRenderTarget = null;
|
||
this._baseZ = 0;
|
||
this._currentZ = 0;
|
||
this._lastPointZ = 0;
|
||
this._batchState = C3.New(C3.Gfx.BatchState, this);
|
||
this._lastColor = C3.New(C3.Color, 1, 1, 1, 1);
|
||
this._lastTexture0 = null;
|
||
this._lastTexture1 = null;
|
||
this._lastSrcBlend = 0;
|
||
this._lastDestBlend = 0;
|
||
this._lineWidth = 1;
|
||
this._lineWidthStack = [this._lineWidth];
|
||
this._lineCap = 1;
|
||
this._lineCapStack = [this._lineCap];
|
||
this._lineOffset = .5;
|
||
this._lineOffsetStack = [this._lineOffset];
|
||
this._isScissorViewport = false;
|
||
this._viewportScissorWidth = -1;
|
||
this._viewportScissorHeight = -1;
|
||
this._lastPointTexCoords = new C3.Rect;
|
||
this._maxTextureSize = -1;
|
||
this._minPointSize = 0;
|
||
this._maxPointSize = 0;
|
||
this._highpPrecision = 0;
|
||
this._unmaskedVendor = "(unavailable)";
|
||
this._unmaskedRenderer = "(unavailable)";
|
||
this._extensions = [];
|
||
this._hasMajorPerformanceCaveat = hasMajorPerformanceCaveat;
|
||
this._isInitialisingAfterContextRestored = false;
|
||
this._parallelShaderCompileExt = null;
|
||
this._isGpuProfilingEnabled = !!opts.enableGpuProfiling;
|
||
this._timerExt = null;
|
||
this._allQueryResultBuffers = new Set;
|
||
this._timeQueryStack = [];
|
||
this.FillIndexBufferData(this._indexData)
|
||
}
|
||
async InitState() {
|
||
const gl = this._gl;
|
||
const numVertexComponents = this.GetNumVertexComponents();
|
||
this._lastColor.setRgba(1, 1, 1, 1);
|
||
this._lastTexture0 = null;
|
||
this._lastTexture1 = null;
|
||
this._vertexPtr = 0;
|
||
this._pointPtr = 0;
|
||
this._lastVertexPtr = MAX_VERTICES * numVertexComponents - 4 * numVertexComponents;
|
||
C3.clearArray(this._batch);
|
||
this._batchPtr = 0;
|
||
this._topOfBatch = 0;
|
||
this._lastProgram = null;
|
||
this._currentRenderTarget = null;
|
||
this._lastPointTexCoords.set(0, 0, 1, 1);
|
||
this._baseZ = 0;
|
||
this._currentZ = 0;
|
||
this._lastPointZ = 0;
|
||
const batchState = this._batchState;
|
||
batchState.currentShader = null;
|
||
batchState.currentFramebuffer = null;
|
||
vec4.set(batchState.currentColor, 1, 1, 1, 1);
|
||
batchState.clearColor.setRgba(0, 0, 0, 0);
|
||
batchState.pointTexCoords.set(0, 0, 1, 1);
|
||
gl.clearColor(0, 0, 0, 0);
|
||
gl.clear(gl.COLOR_BUFFER_BIT);
|
||
gl.enable(gl.BLEND);
|
||
gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
||
this._lastSrcBlend = gl.ONE;
|
||
this._lastDestBlend = gl.ONE_MINUS_SRC_ALPHA;
|
||
this._InitBlendModes(gl);
|
||
gl.disable(gl.CULL_FACE);
|
||
gl.disable(gl.STENCIL_TEST);
|
||
gl.disable(gl.DITHER);
|
||
gl.disable(gl.DEPTH_TEST);
|
||
this._pointBuffer = gl.createBuffer();
|
||
gl.bindBuffer(gl.ARRAY_BUFFER, this._pointBuffer);
|
||
gl.bufferData(gl.ARRAY_BUFFER, this._pointData.byteLength, gl.DYNAMIC_DRAW);
|
||
this._vertexBuffer = gl.createBuffer();
|
||
gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);
|
||
gl.bufferData(gl.ARRAY_BUFFER, this._vertexData.byteLength, gl.DYNAMIC_DRAW);
|
||
this._texcoordBuffer = gl.createBuffer();
|
||
gl.bindBuffer(gl.ARRAY_BUFFER, this._texcoordBuffer);
|
||
gl.bufferData(gl.ARRAY_BUFFER, this._texcoordData.byteLength, gl.DYNAMIC_DRAW);
|
||
this._indexBuffer = gl.createBuffer();
|
||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);
|
||
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._indexData, gl.STATIC_DRAW);
|
||
gl.activeTexture(gl.TEXTURE0);
|
||
gl.bindTexture(gl.TEXTURE_2D, null);
|
||
this._maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
|
||
const pointsizes = gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE);
|
||
this._minPointSize = pointsizes[0];
|
||
this._maxPointSize = pointsizes[1];
|
||
const highpVertex = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT);
|
||
const highpFrag = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT);
|
||
if (highpVertex && highpFrag)
|
||
this._highpPrecision = Math.min(highpVertex["precision"], highpFrag["precision"]);
|
||
else
|
||
this._highpPrecision = 0;
|
||
if (this._maxPointSize > 2048)
|
||
this._maxPointSize = 2048;
|
||
this._extensions = gl.getSupportedExtensions();
|
||
const debug_ext = gl.getExtension("WEBGL_debug_renderer_info");
|
||
if (debug_ext) {
|
||
this._unmaskedVendor = gl.getParameter(debug_ext["UNMASKED_VENDOR_WEBGL"]);
|
||
this._unmaskedRenderer = gl.getParameter(debug_ext["UNMASKED_RENDERER_WEBGL"])
|
||
}
|
||
this._parallelShaderCompileExt = gl.getExtension("KHR_parallel_shader_compile");
|
||
if (C3.isDebug)
|
||
loseContextExtension = gl.getExtension("WEBGL_lose_context");
|
||
if (this._isGpuProfilingEnabled)
|
||
if (this.GetWebGLVersionNumber() === 1) {
|
||
if (C3.Platform.BrowserEngine !== "Chromium" || C3.Platform.BrowserVersionNumber >= 81 || typeof document !== "undefined")
|
||
this._timerExt = gl.getExtension("EXT_disjoint_timer_query")
|
||
} else
|
||
this._timerExt = gl.getExtension("EXT_disjoint_timer_query_webgl2") || gl.getExtension("EXT_disjoint_timer_query");
|
||
this._ClearAllShaderPrograms();
|
||
const WebGLShaderProgram = C3.Gfx.WebGLShaderProgram;
|
||
const vsSource = WebGLShaderProgram.GetDefaultVertexShaderSource(this._is3d, false);
|
||
const DEFAULT_SHADER_PROGRAMS = [[WebGLShaderProgram.GetTextureFillFragmentShaderSource(), vsSource, "<default>"], [WebGLShaderProgram.GetTextureFillFragmentShaderSource(), vsSource, "<default-device-transform>"], [WebGLShaderProgram.GetPointFragmentShaderSource(), WebGLShaderProgram.GetPointVertexShaderSource(), "<point>"], [WebGLShaderProgram.GetColorFillFragmentShaderSource(), vsSource, "<fill>"], [WebGLShaderProgram.GetLinearGradientFillFragmentShaderSource(), vsSource, "<lineargradient>"], [WebGLShaderProgram.GetHardEllipseFillFragmentShaderSource(), vsSource, "<hardellipse>"], [WebGLShaderProgram.GetHardEllipseOutlineFragmentShaderSource(), vsSource, "<hardellipseoutline>"], [WebGLShaderProgram.GetSmoothEllipseFillFragmentShaderSource(), vsSource, "<smoothellipse>"], [WebGLShaderProgram.GetSmoothEllipseOutlineFragmentShaderSource(), vsSource, "<smoothellipseoutline>"], [WebGLShaderProgram.GetSmoothLineFillFragmentShaderSource(), vsSource, "<smoothline>"], [WebGLShaderProgram.GetTilemapFragmentShaderSource(), WebGLShaderProgram.GetDefaultVertexShaderSource(this._is3d, true), "<tilemap>"]];
|
||
const defaultShaders = await Promise.all(DEFAULT_SHADER_PROGRAMS.map(i=>this.CreateShaderProgram({
|
||
src: i[0]
|
||
}, i[1], i[2])));
|
||
this._spTextureFill = defaultShaders[0];
|
||
this._spDeviceTransformTextureFill = defaultShaders[1];
|
||
this._spPoints = defaultShaders[2];
|
||
this._spColorFill = defaultShaders[3];
|
||
this._spLinearGradientFill = defaultShaders[4];
|
||
this._spHardEllipseFill = defaultShaders[5];
|
||
this._spHardEllipseOutline = defaultShaders[6];
|
||
this._spSmoothEllipseFill = defaultShaders[7];
|
||
this._spSmoothEllipseOutline = defaultShaders[8];
|
||
this._spSmoothLineFill = defaultShaders[9];
|
||
this._spTilemapFill = defaultShaders[10];
|
||
this._currentStateGroup = null;
|
||
this.SetTextureFillMode()
|
||
}
|
||
Is3D() {
|
||
return this._is3d
|
||
}
|
||
GetNumVertexComponents() {
|
||
return this._is3d ? 3 : 2
|
||
}
|
||
SetBaseZ(z) {
|
||
this._baseZ = z
|
||
}
|
||
GetBaseZ() {
|
||
return this._baseZ
|
||
}
|
||
SetCurrentZ(z) {
|
||
this._currentZ = z;
|
||
this._currentStateGroup = null
|
||
}
|
||
GetCurrentZ() {
|
||
return this._currentZ
|
||
}
|
||
async CreateShaderProgram(shaderInfo, vsSource, name) {
|
||
const ret = await C3.Gfx.WebGLShaderProgram.Create(this, shaderInfo, vsSource, name);
|
||
this._AddShaderProgram(ret);
|
||
return ret
|
||
}
|
||
ResetLastProgram() {
|
||
this._lastProgram = null
|
||
}
|
||
SetSize(w, h, force) {
|
||
if (this._width === w && this._height === h && !force)
|
||
return;
|
||
this.EndBatch();
|
||
const gl = this._gl;
|
||
const batchState = this._batchState;
|
||
this._width = w;
|
||
this._height = h;
|
||
const viewW = this.GetScissoredViewportWidth();
|
||
const viewH = this.GetScissoredViewportHeight();
|
||
this._UpdateViewportRenderer(viewW, viewH, this._width, this._height);
|
||
this._UpdateViewportBatch(viewW, viewH, this._matP);
|
||
if (this._spDeviceTransformTextureFill) {
|
||
gl.useProgram(this._spDeviceTransformTextureFill.GetShaderProgram());
|
||
this._spDeviceTransformTextureFill._UpdateDeviceTransformUniforms(this._matP);
|
||
this._lastProgram = this._spDeviceTransformTextureFill;
|
||
this._batchState.currentShader = this._spDeviceTransformTextureFill
|
||
}
|
||
gl.bindTexture(gl.TEXTURE_2D, null);
|
||
gl.activeTexture(gl.TEXTURE1);
|
||
gl.bindTexture(gl.TEXTURE_2D, null);
|
||
gl.activeTexture(gl.TEXTURE0);
|
||
this._lastTexture0 = null;
|
||
this._lastTexture1 = null;
|
||
if (this._currentRenderTarget)
|
||
this._currentRenderTarget._Resize(this._width, this._height);
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
||
this._currentRenderTarget = null;
|
||
batchState.currentFramebuffer = null
|
||
}
|
||
_UpdateViewportRenderer(viewW, viewH, surfaceW, surfaceH) {
|
||
this._cam[2] = 100;
|
||
mat4.lookAt(this._matMV, this._cam, this._look, this._up);
|
||
mat4.perspective(this._matP, 45, viewW / viewH, this.GetNearZ(), this.GetFarZ());
|
||
const tl = [0, 0];
|
||
const br = [0, 0];
|
||
const dpr = self.devicePixelRatio;
|
||
this.Project(0, 0, viewW, viewH, tl);
|
||
this.Project(1, 1, viewW, viewH, br);
|
||
this._worldScale[0] = dpr / (br[0] - tl[0]);
|
||
this._worldScale[1] = -dpr / (br[1] - tl[1]);
|
||
this._lastBackbufferWidth = surfaceW;
|
||
this._lastBackbufferHeight = surfaceH
|
||
}
|
||
_UpdateViewportBatch(viewW, viewH, matP) {
|
||
const gl = this._gl;
|
||
const batchState = this._batchState;
|
||
gl.viewport(0, 0, viewW, viewH);
|
||
const allShaderPrograms = this._allShaderPrograms;
|
||
const currentShader = batchState.currentShader;
|
||
for (let i = 0, len = allShaderPrograms.length; i < len; ++i) {
|
||
const s = allShaderPrograms[i];
|
||
if (s === currentShader)
|
||
s.UpdateMatP(matP, true);
|
||
else
|
||
s.SetMatPStale()
|
||
}
|
||
mat4.copy(batchState.currentMatP, matP)
|
||
}
|
||
SetViewportScissor(w, h) {
|
||
const gl = this._gl;
|
||
if (this._width === w && this._height === h) {
|
||
if (this._isScissorViewport) {
|
||
this.EndBatch();
|
||
gl.disable(gl.SCISSOR_TEST);
|
||
this._isScissorViewport = false;
|
||
this._viewportScissorWidth = -1;
|
||
this._viewportScissorHeight = -1;
|
||
this.SetSize(this._width, this._height, true)
|
||
}
|
||
return
|
||
}
|
||
if (!this._isScissorViewport) {
|
||
this.EndBatch();
|
||
gl.enable(gl.SCISSOR_TEST);
|
||
this._isScissorViewport = true
|
||
}
|
||
if (this._viewportScissorWidth !== w || this._viewportScissorHeight !== h) {
|
||
this.EndBatch();
|
||
gl.scissor(0, 0, w, h);
|
||
this._viewportScissorWidth = w;
|
||
this._viewportScissorHeight = h;
|
||
this.SetSize(this._width, this._height, true)
|
||
}
|
||
}
|
||
RemoveViewportScissor() {
|
||
const gl = this._gl;
|
||
if (this._isScissorViewport) {
|
||
this.EndBatch();
|
||
gl.disable(gl.SCISSOR_TEST);
|
||
this._isScissorViewport = false
|
||
}
|
||
this._viewportScissorWidth = -1;
|
||
this._viewportScissorHeight = -1
|
||
}
|
||
GetScissoredViewportWidth() {
|
||
if (this._isScissorViewport)
|
||
return this._viewportScissorWidth;
|
||
else
|
||
return this.GetWidth()
|
||
}
|
||
GetScissoredViewportHeight() {
|
||
if (this._isScissorViewport)
|
||
return this._viewportScissorHeight;
|
||
else
|
||
return this.GetHeight()
|
||
}
|
||
UpdateModelView() {
|
||
if (areMat4sEqual(this._lastMV, this._matMV))
|
||
return;
|
||
const b = this.PushBatch();
|
||
b.InitUpdateModelView(this._matMV);
|
||
mat4.copy(this._lastMV, this._matMV);
|
||
this._topOfBatch = 0
|
||
}
|
||
GetBatchState() {
|
||
return this._batchState
|
||
}
|
||
PushBatch() {
|
||
const batch = this._batch;
|
||
if (this._batchPtr === batch.length)
|
||
batch.push(new C3.Gfx.WebGLBatchJob(this._batchState));
|
||
return batch[this._batchPtr++]
|
||
}
|
||
EndBatch() {
|
||
if (this._batchPtr === 0)
|
||
return;
|
||
if (this.IsContextLost())
|
||
return;
|
||
this._WriteBuffers();
|
||
this._ExecuteBatch();
|
||
this._batchPtr = 0;
|
||
this._vertexPtr = 0;
|
||
this._texPtr = 0;
|
||
this._pointPtr = 0;
|
||
this._topOfBatch = 0
|
||
}
|
||
_WriteBuffers() {
|
||
const gl = this._gl;
|
||
if (this._pointPtr > 0) {
|
||
gl.bindBuffer(gl.ARRAY_BUFFER, this._pointBuffer);
|
||
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._pointData.subarray(0, this._pointPtr))
|
||
}
|
||
if (this._vertexPtr > 0) {
|
||
gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);
|
||
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._vertexData.subarray(0, this._vertexPtr));
|
||
gl.bindBuffer(gl.ARRAY_BUFFER, this._texcoordBuffer);
|
||
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._texcoordData.subarray(0, this._texPtr))
|
||
}
|
||
}
|
||
_ExecuteBatch() {
|
||
const batch = this._batch;
|
||
for (let i = 0, len = this._batchPtr; i < len; ++i)
|
||
batch[i].Run()
|
||
}
|
||
GetOpacity() {
|
||
return this._lastColor.getA()
|
||
}
|
||
SetColorRgba(r, g, b, a) {
|
||
const lastColor = this._lastColor;
|
||
if (lastColor.equalsRgba(r, g, b, a))
|
||
return;
|
||
lastColor.setRgba(r, g, b, a);
|
||
const batch = this.PushBatch();
|
||
batch.InitSetColor(lastColor);
|
||
this._topOfBatch = 0;
|
||
this._currentStateGroup = null
|
||
}
|
||
SetOpacity(a) {
|
||
const lastColor = this._lastColor;
|
||
if (lastColor.getA() === a)
|
||
return;
|
||
lastColor.setA(a);
|
||
const batch = this.PushBatch();
|
||
batch.InitSetColor(lastColor);
|
||
this._topOfBatch = 0;
|
||
this._currentStateGroup = null
|
||
}
|
||
SetColor(c) {
|
||
const lastColor = this._lastColor;
|
||
if (lastColor.equals(c))
|
||
return;
|
||
lastColor.set(c);
|
||
const batch = this.PushBatch();
|
||
batch.InitSetColor(lastColor);
|
||
this._topOfBatch = 0;
|
||
this._currentStateGroup = null
|
||
}
|
||
ResetColor() {
|
||
this.SetColorRgba(1, 1, 1, 1)
|
||
}
|
||
GetColor() {
|
||
return this._lastColor
|
||
}
|
||
SetTexture(rendererTex) {
|
||
if (rendererTex === this._lastTexture0)
|
||
return;
|
||
const b = this.PushBatch();
|
||
b.InitSetTexture(rendererTex);
|
||
this._lastTexture0 = rendererTex;
|
||
this._topOfBatch = 0
|
||
}
|
||
_ResetLastTexture() {
|
||
this._lastTexture0 = null
|
||
}
|
||
SetBlendMode(bm) {
|
||
const arr = this._GetBlendByIndex(bm);
|
||
this._SetBlend(arr[0], arr[1])
|
||
}
|
||
SetNamedBlendMode(bm) {
|
||
const o = this.GetNamedBlend(bm);
|
||
this._SetBlend(o.srcBlend, o.destBlend)
|
||
}
|
||
_SetBlend(s, d) {
|
||
if (s === this._lastSrcBlend && d === this._lastDestBlend)
|
||
return;
|
||
const b = this.PushBatch();
|
||
b.InitSetBlend(s, d);
|
||
this._lastSrcBlend = s;
|
||
this._lastDestBlend = d;
|
||
this._topOfBatch = 0;
|
||
this._currentStateGroup = null
|
||
}
|
||
IsPremultipliedAlphaBlend() {
|
||
return this._lastSrcBlend === this._gl.ONE && this._lastDestBlend === this._gl.ONE_MINUS_SRC_ALPHA
|
||
}
|
||
SetAlphaBlend() {
|
||
this._SetBlend(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA)
|
||
}
|
||
SetNoPremultiplyAlphaBlend() {
|
||
this._SetBlend(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA)
|
||
}
|
||
SetCopyBlend() {
|
||
this._SetBlend(this._gl.ONE, this._gl.ZERO)
|
||
}
|
||
Rect(r) {
|
||
this.Rect2(r.getLeft(), r.getTop(), r.getRight(), r.getBottom())
|
||
}
|
||
Rect2(left, top, right, bottom) {
|
||
this.Quad2(left, top, right, top, right, bottom, left, bottom)
|
||
}
|
||
_ExtendQuadBatch() {
|
||
let v = this._vertexPtr;
|
||
if (v >= this._lastVertexPtr) {
|
||
this.EndBatch();
|
||
v = 0
|
||
}
|
||
if (this._topOfBatch === 1)
|
||
this._batch[this._batchPtr - 1]._indexCount += 6;
|
||
else {
|
||
const b = this.PushBatch();
|
||
b.InitQuad(this._is3d ? v : v / 2 * 3, 6);
|
||
this._topOfBatch = 1
|
||
}
|
||
}
|
||
_WriteQuadToVertexBuffer(quad) {
|
||
quad.writeToTypedArray3D(this._vertexData, this._vertexPtr, this._baseZ + this._currentZ);
|
||
this._vertexPtr += 12
|
||
}
|
||
Quad(quad) {
|
||
this._ExtendQuadBatch();
|
||
this._WriteQuadToVertexBuffer(quad);
|
||
defaultTexCoordsQuad.writeToTypedArray(this._texcoordData, this._texPtr);
|
||
this._texPtr += 8
|
||
}
|
||
Quad2(tlx, tly, trx, try_, brx, bry, blx, bly) {
|
||
this._ExtendQuadBatch();
|
||
const vd = this._vertexData;
|
||
let v = this._vertexPtr;
|
||
const z = this._baseZ + this._currentZ;
|
||
if (this._is3d) {
|
||
vd[v++] = tlx;
|
||
vd[v++] = tly;
|
||
vd[v++] = z;
|
||
vd[v++] = trx;
|
||
vd[v++] = try_;
|
||
vd[v++] = z;
|
||
vd[v++] = brx;
|
||
vd[v++] = bry;
|
||
vd[v++] = z;
|
||
vd[v++] = blx;
|
||
vd[v++] = bly;
|
||
vd[v++] = z
|
||
} else {
|
||
vd[v++] = tlx;
|
||
vd[v++] = tly;
|
||
vd[v++] = trx;
|
||
vd[v++] = try_;
|
||
vd[v++] = brx;
|
||
vd[v++] = bry;
|
||
vd[v++] = blx;
|
||
vd[v++] = bly
|
||
}
|
||
this._vertexPtr = v;
|
||
defaultTexCoordsQuad.writeToTypedArray(this._texcoordData, this._texPtr);
|
||
this._texPtr += 8
|
||
}
|
||
Quad3(quad, rcTex) {
|
||
this._ExtendQuadBatch();
|
||
this._WriteQuadToVertexBuffer(quad);
|
||
rcTex.writeAsQuadToTypedArray(this._texcoordData, this._texPtr);
|
||
this._texPtr += 8
|
||
}
|
||
Quad4(quad, uv) {
|
||
this._ExtendQuadBatch();
|
||
this._WriteQuadToVertexBuffer(quad);
|
||
uv.writeToTypedArray(this._texcoordData, this._texPtr);
|
||
this._texPtr += 8
|
||
}
|
||
FullscreenQuad(mode, curTex) {
|
||
mat4.copy(tmpMat4, this._lastMV);
|
||
vec3.copy(tmpVec3, this._cam);
|
||
vec3.copy(tmpVec3b, this._look);
|
||
this._cam[0] = 0;
|
||
this._cam[1] = 0;
|
||
this._cam[2] = 100 * self.devicePixelRatio;
|
||
this._look[0] = 0;
|
||
this._look[1] = 0;
|
||
this._look[2] = 0;
|
||
this.ResetModelView();
|
||
this.UpdateModelView();
|
||
if (this._isScissorViewport) {
|
||
const left = this._viewportScissorWidth / 2;
|
||
const top = this._viewportScissorHeight / 2;
|
||
tmpRect.set(-left, top, -left + this._viewportScissorWidth, top - this._viewportScissorHeight);
|
||
tmpQuad.setFromRect(tmpRect);
|
||
tmpRect.set(0, 0, this._viewportScissorWidth / this._width, this._viewportScissorHeight / this._height);
|
||
this.Quad3(tmpQuad, tmpRect)
|
||
} else if (mode === "crop" && this._currentRenderTarget && curTex) {
|
||
const left = this._width / 2;
|
||
const top = this._height / 2;
|
||
const srcW = curTex.GetWidth();
|
||
const srcH = curTex.GetHeight();
|
||
const destW = this._currentRenderTarget.GetWidth();
|
||
const destH = this._currentRenderTarget.GetHeight();
|
||
const copyW = Math.min(destW, srcW);
|
||
const copyH = Math.min(destH, srcH);
|
||
const srcOffY = Math.max(srcH - destH, 0);
|
||
const destOffY = Math.max(destH - srcH, 0);
|
||
tmpRect.set(-left, top - destOffY, -left + copyW, top - copyH - destOffY);
|
||
tmpQuad.setFromRect(tmpRect);
|
||
tmpRect.set(0, srcOffY, copyW, copyH + srcOffY);
|
||
tmpRect.divide(srcW, srcH);
|
||
this.Quad3(tmpQuad, tmpRect)
|
||
} else {
|
||
let[width,height] = this.GetRenderTargetSize(this._currentRenderTarget);
|
||
const halfW = width / 2;
|
||
const halfH = height / 2;
|
||
this.Rect2(-halfW, halfH, halfW, -halfH)
|
||
}
|
||
mat4.copy(this._matMV, tmpMat4);
|
||
vec3.copy(this._cam, tmpVec3);
|
||
vec3.copy(this._look, tmpVec3b);
|
||
this.UpdateModelView()
|
||
}
|
||
ConvexPoly(pts) {
|
||
const pts_count = pts.length / 2;
|
||
if (pts_count < 3)
|
||
throw new Error("need at least 3 points");
|
||
const tris = pts_count - 2;
|
||
const last_tri = tris - 1;
|
||
const p0x = pts[0];
|
||
const p0y = pts[1];
|
||
for (let i = 0; i < tris; i += 2) {
|
||
const i2 = i * 2;
|
||
const p1x = pts[i2 + 2];
|
||
const p1y = pts[i2 + 3];
|
||
const p2x = pts[i2 + 4];
|
||
const p2y = pts[i2 + 5];
|
||
if (i === last_tri)
|
||
this.Quad2(p0x, p0y, p1x, p1y, p2x, p2y, p2x, p2y);
|
||
else {
|
||
const p3x = pts[i2 + 6];
|
||
const p3y = pts[i2 + 7];
|
||
this.Quad2(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y)
|
||
}
|
||
}
|
||
}
|
||
Line(x1, y1, x2, y2) {
|
||
const a = C3.angleTo(x1, y1, x2, y2);
|
||
const sin_a = Math.sin(a);
|
||
const cos_a = Math.cos(a);
|
||
const halfLineWidth = this._lineWidth * .5;
|
||
const sin_a_hlw = sin_a * halfLineWidth;
|
||
const cos_a_hlw = cos_a * halfLineWidth;
|
||
const lineCap = this._lineCap;
|
||
if (lineCap === 2)
|
||
this.LinePreCalc_LineCap2(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw);
|
||
else if (lineCap === 1)
|
||
this.LinePreCalc_LineCap1(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw);
|
||
else
|
||
this.LinePreCalc_LineCap0(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw)
|
||
}
|
||
LinePreCalc_LineCap2(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw) {
|
||
const lineOffset = this._lineOffset;
|
||
const startX = x1 + lineOffset - cos_a_hlw;
|
||
const startY = y1 + lineOffset - sin_a_hlw;
|
||
const endX = x2 + lineOffset + cos_a_hlw;
|
||
const endY = y2 + lineOffset + sin_a_hlw;
|
||
const cos_a_lw = cos_a_hlw * 2;
|
||
const sin_a_lw = sin_a_hlw * 2;
|
||
const tlx = startX + sin_a_hlw;
|
||
const tly = startY - cos_a_hlw;
|
||
const blx = startX - sin_a_hlw + cos_a_lw;
|
||
const bly = startY + cos_a_hlw + sin_a_lw;
|
||
const trx = endX + sin_a_hlw;
|
||
const try_ = endY - cos_a_hlw;
|
||
const brx = endX - sin_a_hlw - cos_a_lw;
|
||
const bry = endY + cos_a_hlw - sin_a_lw;
|
||
this.Quad2(tlx, tly, trx, try_, brx, bry, blx, bly)
|
||
}
|
||
LinePreCalc_LineCap1(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw) {
|
||
const lineOffset = this._lineOffset;
|
||
const startX = x1 + lineOffset - cos_a_hlw;
|
||
const startY = y1 + lineOffset - sin_a_hlw;
|
||
const endX = x2 + lineOffset + cos_a_hlw;
|
||
const endY = y2 + lineOffset + sin_a_hlw;
|
||
const tlx = startX + sin_a_hlw;
|
||
const tly = startY - cos_a_hlw;
|
||
const blx = startX - sin_a_hlw;
|
||
const bly = startY + cos_a_hlw;
|
||
const trx = endX + sin_a_hlw;
|
||
const try_ = endY - cos_a_hlw;
|
||
const brx = endX - sin_a_hlw;
|
||
const bry = endY + cos_a_hlw;
|
||
this.Quad2(tlx, tly, trx, try_, brx, bry, blx, bly)
|
||
}
|
||
LinePreCalc_LineCap0(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw) {
|
||
const lineOffset = this._lineOffset;
|
||
const startX = x1 + lineOffset;
|
||
const startY = y1 + lineOffset;
|
||
const endX = x2 + lineOffset;
|
||
const endY = y2 + lineOffset;
|
||
const tlx = startX + sin_a_hlw;
|
||
const tly = startY - cos_a_hlw;
|
||
const blx = startX - sin_a_hlw;
|
||
const bly = startY + cos_a_hlw;
|
||
const trx = endX + sin_a_hlw;
|
||
const try_ = endY - cos_a_hlw;
|
||
const brx = endX - sin_a_hlw;
|
||
const bry = endY + cos_a_hlw;
|
||
this.Quad2(tlx, tly, trx, try_, brx, bry, blx, bly)
|
||
}
|
||
TexturedLine(x1, y1, x2, y2, u, v) {
|
||
const a = C3.angleTo(x1, y1, x2, y2);
|
||
const sin_a = Math.sin(a);
|
||
const cos_a = Math.cos(a);
|
||
const halfLineWidth = this._lineWidth * .5;
|
||
const sin_a_hlw = sin_a * halfLineWidth;
|
||
const cos_a_hlw = cos_a * halfLineWidth;
|
||
const lineCap = this._lineCap;
|
||
if (lineCap === 2)
|
||
this.TexturedLinePreCalc_LineCap2(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw, u, v);
|
||
else if (lineCap === 1)
|
||
this.TexturedLinePreCalc_LineCap1(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw, u, v);
|
||
else
|
||
this.TexturedLinePreCalc_LineCap0(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw, u, v)
|
||
}
|
||
TexturedLinePreCalc_LineCap2(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw, u, v) {
|
||
const lineOffset = this._lineOffset;
|
||
const startX = x1 + lineOffset - cos_a_hlw;
|
||
const startY = y1 + lineOffset - sin_a_hlw;
|
||
const endX = x2 + lineOffset + cos_a_hlw;
|
||
const endY = y2 + lineOffset + sin_a_hlw;
|
||
const cos_a_lw = cos_a_hlw * 2;
|
||
const sin_a_lw = sin_a_hlw * 2;
|
||
const tlx = startX + sin_a_hlw;
|
||
const tly = startY - cos_a_hlw;
|
||
const blx = startX - sin_a_hlw + cos_a_lw;
|
||
const bly = startY + cos_a_hlw + sin_a_lw;
|
||
const trx = endX + sin_a_hlw;
|
||
const try_ = endY - cos_a_hlw;
|
||
const brx = endX - sin_a_hlw - cos_a_lw;
|
||
const bry = endY + cos_a_hlw - sin_a_lw;
|
||
tmpQuad.set(tlx, tly, trx, try_, brx, bry, blx, bly);
|
||
tmpRect.set(u, 0, v, 0);
|
||
this.Quad3(tmpQuad, tmpRect)
|
||
}
|
||
TexturedLinePreCalc_LineCap1(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw, u, v) {
|
||
const lineOffset = this._lineOffset;
|
||
const startX = x1 + lineOffset - cos_a_hlw;
|
||
const startY = y1 + lineOffset - sin_a_hlw;
|
||
const endX = x2 + lineOffset + cos_a_hlw;
|
||
const endY = y2 + lineOffset + sin_a_hlw;
|
||
const tlx = startX + sin_a_hlw;
|
||
const tly = startY - cos_a_hlw;
|
||
const blx = startX - sin_a_hlw;
|
||
const bly = startY + cos_a_hlw;
|
||
const trx = endX + sin_a_hlw;
|
||
const try_ = endY - cos_a_hlw;
|
||
const brx = endX - sin_a_hlw;
|
||
const bry = endY + cos_a_hlw;
|
||
tmpQuad.set(tlx, tly, trx, try_, brx, bry, blx, bly);
|
||
tmpRect.set(u, 0, v, 0);
|
||
this.Quad3(tmpQuad, tmpRect)
|
||
}
|
||
TexturedLinePreCalc_LineCap0(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw, u, v) {
|
||
const lineOffset = this._lineOffset;
|
||
const startX = x1 + lineOffset;
|
||
const startY = y1 + lineOffset;
|
||
const endX = x2 + lineOffset;
|
||
const endY = y2 + lineOffset;
|
||
const tlx = startX + sin_a_hlw;
|
||
const tly = startY - cos_a_hlw;
|
||
const blx = startX - sin_a_hlw;
|
||
const bly = startY + cos_a_hlw;
|
||
const trx = endX + sin_a_hlw;
|
||
const try_ = endY - cos_a_hlw;
|
||
const brx = endX - sin_a_hlw;
|
||
const bry = endY + cos_a_hlw;
|
||
tmpQuad.set(tlx, tly, trx, try_, brx, bry, blx, bly);
|
||
tmpRect.set(u, 0, v, 0);
|
||
this.Quad3(tmpQuad, tmpRect)
|
||
}
|
||
LineRect(left, top, right, bottom) {
|
||
const halfLineWidth = this._lineWidth * .5;
|
||
const lineCap = this._lineCap;
|
||
if (lineCap === 2)
|
||
this._LineRectPreCalc_LineCap2(left, top, right, bottom, halfLineWidth);
|
||
else if (lineCap === 1)
|
||
this._LineRectPreCalc_LineCap1(left, top, right, bottom, halfLineWidth);
|
||
else
|
||
this._LineRectPreCalc_LineCap0(left, top, right, bottom, halfLineWidth)
|
||
}
|
||
_LineRectPreCalc_LineCap2(left, top, right, bottom, halfLineWidth) {
|
||
this.LinePreCalc_LineCap2(left, top, right, top, 0, halfLineWidth);
|
||
this.LinePreCalc_LineCap2(right, top, right, bottom, halfLineWidth, 0);
|
||
this.LinePreCalc_LineCap2(right, bottom, left, bottom, 0, -halfLineWidth);
|
||
this.LinePreCalc_LineCap2(left, bottom, left, top, -halfLineWidth, 0)
|
||
}
|
||
_LineRectPreCalc_LineCap1(left, top, right, bottom, halfLineWidth) {
|
||
this.LinePreCalc_LineCap1(left, top, right, top, 0, halfLineWidth);
|
||
this.LinePreCalc_LineCap1(right, top, right, bottom, halfLineWidth, 0);
|
||
this.LinePreCalc_LineCap1(right, bottom, left, bottom, 0, -halfLineWidth);
|
||
this.LinePreCalc_LineCap1(left, bottom, left, top, -halfLineWidth, 0)
|
||
}
|
||
_LineRectPreCalc_LineCap0(left, top, right, bottom, halfLineWidth) {
|
||
this.LinePreCalc_LineCap0(left, top, right, top, 0, halfLineWidth);
|
||
this.LinePreCalc_LineCap0(right, top, right, bottom, halfLineWidth, 0);
|
||
this.LinePreCalc_LineCap0(right, bottom, left, bottom, 0, -halfLineWidth);
|
||
this.LinePreCalc_LineCap0(left, bottom, left, top, -halfLineWidth, 0)
|
||
}
|
||
LineRect2(r) {
|
||
this.LineRect(r.getLeft(), r.getTop(), r.getRight(), r.getBottom())
|
||
}
|
||
LineQuad(q) {
|
||
const a = C3.angleTo(q.getTlx(), q.getTly(), q.getTrx(), q.getTry());
|
||
const sin_a = Math.sin(a);
|
||
const cos_a = Math.cos(a);
|
||
const halfLineWidth = this._lineWidth * .5;
|
||
const sin_a_hlw = sin_a * halfLineWidth;
|
||
const cos_a_hlw = cos_a * halfLineWidth;
|
||
const lineCap = this._lineCap;
|
||
if (lineCap === 2)
|
||
this._LineQuadPreCalc_LineCap2(q, sin_a_hlw, cos_a_hlw);
|
||
else if (lineCap === 1)
|
||
this._LineQuadPreCalc_LineCap1(q, sin_a_hlw, cos_a_hlw);
|
||
else
|
||
this._LineQuadPreCalc_LineCap0(q, sin_a_hlw, cos_a_hlw)
|
||
}
|
||
_LineQuadPreCalc_LineCap2(q, sin_a_hlw, cos_a_hlw) {
|
||
this.LinePreCalc_LineCap2(q.getTlx(), q.getTly(), q.getTrx(), q.getTry(), sin_a_hlw, cos_a_hlw);
|
||
this.LinePreCalc_LineCap2(q.getTrx(), q.getTry(), q.getBrx(), q.getBry(), cos_a_hlw, -sin_a_hlw);
|
||
this.LinePreCalc_LineCap2(q.getBrx(), q.getBry(), q.getBlx(), q.getBly(), -sin_a_hlw, -cos_a_hlw);
|
||
this.LinePreCalc_LineCap2(q.getBlx(), q.getBly(), q.getTlx(), q.getTly(), -cos_a_hlw, sin_a_hlw)
|
||
}
|
||
_LineQuadPreCalc_LineCap1(q, sin_a_hlw, cos_a_hlw) {
|
||
this.LinePreCalc_LineCap1(q.getTlx(), q.getTly(), q.getTrx(), q.getTry(), sin_a_hlw, cos_a_hlw);
|
||
this.LinePreCalc_LineCap1(q.getTrx(), q.getTry(), q.getBrx(), q.getBry(), cos_a_hlw, -sin_a_hlw);
|
||
this.LinePreCalc_LineCap1(q.getBrx(), q.getBry(), q.getBlx(), q.getBly(), -sin_a_hlw, -cos_a_hlw);
|
||
this.LinePreCalc_LineCap1(q.getBlx(), q.getBly(), q.getTlx(), q.getTly(), -cos_a_hlw, sin_a_hlw)
|
||
}
|
||
_LineQuadPreCalc_LineCap0(q, sin_a_hlw, cos_a_hlw) {
|
||
this.LinePreCalc_LineCap0(q.getTlx(), q.getTly(), q.getTrx(), q.getTry(), sin_a_hlw, cos_a_hlw);
|
||
this.LinePreCalc_LineCap0(q.getTrx(), q.getTry(), q.getBrx(), q.getBry(), cos_a_hlw, -sin_a_hlw);
|
||
this.LinePreCalc_LineCap0(q.getBrx(), q.getBry(), q.getBlx(), q.getBly(), -sin_a_hlw, -cos_a_hlw);
|
||
this.LinePreCalc_LineCap0(q.getBlx(), q.getBly(), q.getTlx(), q.getTly(), -cos_a_hlw, sin_a_hlw)
|
||
}
|
||
SetLineWidth(n) {
|
||
this._lineWidth = n;
|
||
this._lineWidthStack[this._lineWidthStack.length - 1] = n
|
||
}
|
||
GetLineWidth() {
|
||
return this._lineWidth
|
||
}
|
||
PushLineWidth(n) {
|
||
if (this._lineWidthStack.length >= 100)
|
||
throw new Error("pushed too many line widths - check push/pop pairs");
|
||
this._lineWidthStack.push(n);
|
||
this._lineWidth = n
|
||
}
|
||
PopLineWidth() {
|
||
if (this._lineWidthStack.length <= 1)
|
||
throw new Error("cannot pop last line width - check push/pop pairs");
|
||
this._lineWidthStack.pop();
|
||
this._lineWidth = this._lineWidthStack[this._lineWidthStack.length - 1]
|
||
}
|
||
SetLineCapButt() {
|
||
this._lineCap = 0;
|
||
this._lineCapStack[this._lineCapStack.length - 1] = 0
|
||
}
|
||
SetLineCapSquare() {
|
||
this._lineCap = 1;
|
||
this._lineCapStack[this._lineCapStack.length - 1] = 0
|
||
}
|
||
SetLineCapZag() {
|
||
this._lineCap = 2;
|
||
this._lineCapStack[this._lineCapStack.length - 1] = 0
|
||
}
|
||
PushLineCap(type) {
|
||
if (type === "butt")
|
||
this.PushLineCapButt();
|
||
else if (type === "square")
|
||
this.PushLineCapSquare();
|
||
else if (type === "zag")
|
||
this.PushLineCapZag();
|
||
else
|
||
throw new Error("invalid line cap");
|
||
}
|
||
PushLineCapButt() {
|
||
if (this._lineCapStack.length >= 100)
|
||
throw new Error("pushed too many line caps - check push/pop pairs");
|
||
this._lineCapStack.push(0);
|
||
this._lineCap = 0
|
||
}
|
||
PushLineCapSquare() {
|
||
if (this._lineCapStack.length >= 100)
|
||
throw new Error("pushed too many line caps - check push/pop pairs");
|
||
this._lineCapStack.push(1);
|
||
this._lineCap = 1
|
||
}
|
||
PushLineCapZag() {
|
||
if (this._lineCapStack.length >= 100)
|
||
throw new Error("pushed too many line caps - check push/pop pairs");
|
||
this._lineCapStack.push(2);
|
||
this._lineCap = 2
|
||
}
|
||
PopLineCap() {
|
||
if (this._lineCapStack.length <= 1)
|
||
throw new Error("cannot pop last line cap - check push/pop pairs");
|
||
this._lineCapStack.pop();
|
||
this._lineCap = this._lineCapStack[this._lineCapStack.length - 1]
|
||
}
|
||
SetLineOffset(n) {
|
||
this._lineOffset = n;
|
||
this._lineOffsetStack[this._lineOffsetStack.length - 1] = n
|
||
}
|
||
GetLineOffset() {
|
||
return this._lineOffset
|
||
}
|
||
PushLineOffset(n) {
|
||
if (this._lineOffsetStack.length >= 100)
|
||
throw new Error("pushed too many line offsets - check push/pop pairs");
|
||
this._lineOffsetStack.push(n);
|
||
this._lineOffset = n
|
||
}
|
||
PopLineOffset() {
|
||
if (this._lineOffsetStack.length <= 1)
|
||
throw new Error("cannot pop last line offset - check push/pop pairs");
|
||
this._lineOffsetStack.pop();
|
||
this._lineOffset = this._lineOffsetStack[this._lineOffsetStack.length - 1]
|
||
}
|
||
SetPointTextureCoords(rect) {
|
||
if (this._lastPointTexCoords.equals(rect))
|
||
return;
|
||
this._lastPointTexCoords.copy(rect);
|
||
const b = this.PushBatch();
|
||
b.InitSetPointTexCoords(rect);
|
||
this._topOfBatch = 0
|
||
}
|
||
Point(x_, y_, size_, opacity_) {
|
||
if (this._pointPtr >= LAST_POINT)
|
||
this.EndBatch();
|
||
let p = this._pointPtr;
|
||
const z = this._baseZ + this._currentZ;
|
||
if (this._topOfBatch === 2 && this._lastPointZ === z)
|
||
this._batch[this._batchPtr - 1]._indexCount++;
|
||
else {
|
||
const b = this.PushBatch();
|
||
b.InitPoints(p, z);
|
||
this._topOfBatch = 2;
|
||
this._lastPointZ = z
|
||
}
|
||
const pd = this._pointData;
|
||
pd[p++] = x_;
|
||
pd[p++] = y_;
|
||
pd[p++] = size_;
|
||
pd[p++] = opacity_;
|
||
this._pointPtr = p
|
||
}
|
||
SetProgram(program) {
|
||
if (this._lastProgram === program)
|
||
return;
|
||
const b = this.PushBatch();
|
||
b.InitSetProgram(program);
|
||
this._lastProgram = program;
|
||
this._topOfBatch = 0;
|
||
this._currentStateGroup = null
|
||
}
|
||
SetTextureFillMode() {
|
||
this.SetProgram(this._spTextureFill)
|
||
}
|
||
SetDeviceTransformTextureFillMode() {
|
||
this.SetProgram(this._spDeviceTransformTextureFill)
|
||
}
|
||
SetColorFillMode() {
|
||
this.SetProgram(this._spColorFill)
|
||
}
|
||
SetLinearGradientFillMode() {
|
||
this.SetProgram(this._spLinearGradientFill)
|
||
}
|
||
SetGradientColor(c) {
|
||
const b = this.PushBatch();
|
||
b.InitSetGradientColor(c);
|
||
this._topOfBatch = 0
|
||
}
|
||
SetHardEllipseFillMode() {
|
||
this.SetProgram(this._spHardEllipseFill)
|
||
}
|
||
SetHardEllipseOutlineMode() {
|
||
this.SetProgram(this._spHardEllipseOutline)
|
||
}
|
||
SetSmoothEllipseFillMode() {
|
||
this.SetProgram(this._spSmoothEllipseFill)
|
||
}
|
||
SetSmoothEllipseOutlineMode() {
|
||
this.SetProgram(this._spSmoothEllipseOutline)
|
||
}
|
||
SetEllipseParams(pixelW, pixelH, outlineThickness=1) {
|
||
const b = this.PushBatch();
|
||
b.InitSetEllipseParams(pixelW, pixelH, outlineThickness);
|
||
this._topOfBatch = 0
|
||
}
|
||
SetSmoothLineFillMode() {
|
||
this.SetProgram(this._spSmoothLineFill)
|
||
}
|
||
SetTilemapFillMode() {
|
||
this.SetProgram(this._spTilemapFill)
|
||
}
|
||
SetTilemapInfo(srcRect, textureWidth, textureHeight, tileWidth, tileHeight, tileSpacingX, tileSpacingY) {
|
||
if (this._lastProgram !== this._spTilemapFill)
|
||
throw new Error("must set tilemap fill mode first");
|
||
const b = this.PushBatch();
|
||
b.InitSetTilemapInfo(srcRect, textureWidth, textureHeight, tileWidth, tileHeight, tileSpacingX, tileSpacingY);
|
||
this._topOfBatch = 0
|
||
}
|
||
SetProgramParameters(backTex, destRect, srcRect, srcOriginRect, layoutRect, pixelWidth, pixelHeight, layerScale, layerAngle, time, params) {
|
||
const s = this._lastProgram;
|
||
const hasAnyOptionalUniforms = s._hasAnyOptionalUniforms;
|
||
const hasAnyCustomParams = !!params.length;
|
||
if ((!hasAnyOptionalUniforms || s.AreOptionalUniformsAlreadySetInBatch(destRect, srcRect, srcOriginRect, layoutRect, pixelWidth, pixelHeight, layerScale, layerAngle, time)) && (!hasAnyCustomParams || s.AreCustomParametersAlreadySetInBatch(params)))
|
||
return;
|
||
const b = this.PushBatch();
|
||
b.InitSetProgramParameters();
|
||
if (hasAnyOptionalUniforms) {
|
||
s.SetOptionalUniformsInBatch(destRect, srcRect, srcOriginRect, layoutRect, pixelWidth, pixelHeight, layerScale, layerAngle, time);
|
||
const mat4param = b._mat4param;
|
||
mat4param[0] = pixelWidth;
|
||
mat4param[1] = pixelHeight;
|
||
destRect.writeToTypedArray(mat4param, 2);
|
||
mat4param[6] = layerScale;
|
||
mat4param[7] = layerAngle;
|
||
srcRect.writeToTypedArray(mat4param, 12);
|
||
const colorParam = b._colorParam;
|
||
layoutRect.writeToTypedArray(colorParam, 0);
|
||
const tmp = colorParam[1];
|
||
colorParam[1] = colorParam[3];
|
||
colorParam[3] = tmp;
|
||
srcOriginRect.writeToTypedArray(b._srcOriginRect, 0);
|
||
b._startIndex = time;
|
||
if (s._uSamplerBack.IsUsed())
|
||
b._texParam = backTex ? backTex.GetTexture() : null;
|
||
else
|
||
b._texParam = null
|
||
}
|
||
if (hasAnyCustomParams) {
|
||
s.SetCustomParametersInBatch(params);
|
||
C3.shallowAssignArray(b._shaderParams, params)
|
||
}
|
||
this._topOfBatch = 0
|
||
}
|
||
ClearRgba(r, g, b_, a) {
|
||
const b = this.PushBatch();
|
||
b.InitClearSurface2(r, g, b_, a);
|
||
this._topOfBatch = 0
|
||
}
|
||
Clear(c) {
|
||
const b = this.PushBatch();
|
||
b.InitClearSurface(c);
|
||
this._topOfBatch = 0
|
||
}
|
||
ClearRect(x, y, w, h) {
|
||
this.ClearRect4(x, y, w, h, 0, 0, 0, 0)
|
||
}
|
||
ClearRect2(rc) {
|
||
this.ClearRect4(rc.getLeft(), rc.getTop(), rc.width(), rc.height(), 0, 0, 0, 0)
|
||
}
|
||
ClearRect3(rc, c) {
|
||
this.ClearRect4(rc.getLeft(), rc.getTop(), rc.width(), rc.height(), c.getR(), c.getG(), c.getB(), c.getA())
|
||
}
|
||
ClearRect4(x, y, w, h, r, g, b, a) {
|
||
if (w < 0 || h < 0)
|
||
return;
|
||
const batch = this.PushBatch();
|
||
batch.InitClearRect(x, y, w, h, r, g, b, a);
|
||
this._topOfBatch = 0
|
||
}
|
||
Start() {}
|
||
Finish() {
|
||
super.Finish();
|
||
this._gl.flush()
|
||
}
|
||
CheckForQueryResults() {
|
||
for (const qrb of this._allQueryResultBuffers)
|
||
qrb.CheckForResults(this._frameNumber)
|
||
}
|
||
IsContextLost() {
|
||
return !this._gl || this._gl.isContextLost() || this._isInitialisingAfterContextRestored
|
||
}
|
||
OnContextLost() {
|
||
C3.Gfx.WebGLRendererTexture.OnContextLost();
|
||
C3.Gfx.WebGLRenderTarget.OnContextLost();
|
||
C3.Gfx.RendererText.OnContextLost();
|
||
for (const qrb of this._allQueryResultBuffers)
|
||
qrb.Clear();
|
||
this._extensions = [];
|
||
this._timerExt = null;
|
||
this._parallelShaderCompileExt = null;
|
||
this._unmaskedVendor = "(unavailable)";
|
||
this._unmaskedRenderer = "(unavailable)";
|
||
this._lastProgram = null;
|
||
this._spTextureFill = null;
|
||
this._spDeviceTransformTextureFill = null;
|
||
this._spColorFill = null;
|
||
this._spLinearGradientFill = null;
|
||
this._spHardEllipseFill = null;
|
||
this._spHardEllipseOutline = null;
|
||
this._spSmoothEllipseFill = null;
|
||
this._spSmoothEllipseOutline = null;
|
||
this._spSmoothLineFill = null;
|
||
this._spPoints = null;
|
||
this._spTilemapFill = null;
|
||
for (const stateGroup of this._stateGroups.values())
|
||
stateGroup.OnContextLost();
|
||
for (const s of this._allShaderPrograms)
|
||
s.Release();
|
||
this._ClearAllShaderPrograms()
|
||
}
|
||
async OnContextRestored() {
|
||
this._isInitialisingAfterContextRestored = true;
|
||
await this.InitState();
|
||
this._isInitialisingAfterContextRestored = false;
|
||
for (const stateGroup of this._stateGroups.values())
|
||
stateGroup.OnContextRestored(this);
|
||
this.SetSize(this._width, this._height, true)
|
||
}
|
||
CreateStaticTexture(data, opts) {
|
||
if (this.IsContextLost())
|
||
throw new Error("context lost");
|
||
this.EndBatch();
|
||
const rendererTex = C3.New(C3.Gfx.WebGLRendererTexture, this);
|
||
rendererTex._CreateStatic(data, opts);
|
||
return rendererTex
|
||
}
|
||
CreateStaticTextureAsync(data, opts) {
|
||
if (this.IsContextLost())
|
||
return Promise.reject("context lost");
|
||
opts = Object.assign({}, opts);
|
||
const isTiled = opts.wrapX && opts.wrapX !== "clamp-to-edge" || opts.wrapY && opts.wrapY !== "clamp-to-edge";
|
||
if (C3.Supports.ImageBitmapOptions && (this.SupportsNPOTTextures() || !isTiled)) {
|
||
opts.premultiplyAlpha = false;
|
||
return createImageBitmap(data, {
|
||
"premultiplyAlpha": "premultiply"
|
||
}).then(imageBitmap=>C3.Asyncify(()=>this.CreateStaticTexture(imageBitmap, opts)))
|
||
} else if (C3.Supports.ImageBitmap)
|
||
return createImageBitmap(data).then(imageBitmap=>C3.Asyncify(()=>this.CreateStaticTexture(imageBitmap, opts)));
|
||
else if (data instanceof Blob)
|
||
return C3.BlobToImage(data, true).then(img=>this.CreateStaticTextureAsync(img, opts));
|
||
else if (typeof HTMLImageElement !== "undefined" && data instanceof HTMLImageElement && typeof data["decode"] === "function")
|
||
return data["decode"]().then(()=>C3.Asyncify(()=>this.CreateStaticTexture(data, opts)));
|
||
else
|
||
return C3.Asyncify(()=>this.CreateStaticTexture(data, opts))
|
||
}
|
||
CreateDynamicTexture(width, height, opts) {
|
||
this.EndBatch();
|
||
const rendererTex = C3.New(C3.Gfx.WebGLRendererTexture, this);
|
||
rendererTex._CreateDynamic(width, height, opts);
|
||
return rendererTex
|
||
}
|
||
UpdateTexture(data, rendererTex, opts) {
|
||
this.EndBatch();
|
||
rendererTex._Update(data, opts)
|
||
}
|
||
DeleteTexture(rendererTex) {
|
||
if (!rendererTex)
|
||
return;
|
||
rendererTex.SubtractReference();
|
||
if (rendererTex.GetReferenceCount() > 0)
|
||
return;
|
||
this.EndBatch();
|
||
if (rendererTex === this._lastTexture0) {
|
||
this._gl.bindTexture(this._gl.TEXTURE_2D, null);
|
||
this._lastTexture0 = null
|
||
}
|
||
if (rendererTex === this._lastTexture1) {
|
||
this._gl.activeTexture(this._gl.TEXTURE1);
|
||
this._gl.bindTexture(this._gl.TEXTURE_2D, null);
|
||
this._gl.activeTexture(this._gl.TEXTURE0);
|
||
this._lastTexture1 = null
|
||
}
|
||
rendererTex._Delete()
|
||
}
|
||
CreateRenderTarget(opts) {
|
||
let width = this._width;
|
||
let height = this._height;
|
||
let isDefaultSize = true;
|
||
if (opts) {
|
||
if (typeof opts.width === "number") {
|
||
width = opts.width;
|
||
isDefaultSize = false
|
||
}
|
||
if (typeof opts.height === "number") {
|
||
height = opts.height;
|
||
isDefaultSize = false
|
||
}
|
||
}
|
||
if (width <= 0 || height <= 0)
|
||
throw new Error("invalid size");
|
||
this.EndBatch();
|
||
const renderTarget = C3.New(C3.Gfx.WebGLRenderTarget, this);
|
||
renderTarget._Create(width, height, Object.assign({
|
||
isDefaultSize
|
||
}, opts));
|
||
this._currentRenderTarget = null;
|
||
this._batchState.currentFramebuffer = null;
|
||
return renderTarget
|
||
}
|
||
SetRenderTarget(renderTarget) {
|
||
if (renderTarget === this._currentRenderTarget)
|
||
return;
|
||
let newViewWidth, newViewHeight, newSurfaceWidth, newSurfaceHeight;
|
||
if (renderTarget) {
|
||
if (renderTarget.IsDefaultSize())
|
||
renderTarget._Resize(this._width, this._height);
|
||
newSurfaceWidth = renderTarget.GetWidth();
|
||
newSurfaceHeight = renderTarget.GetHeight();
|
||
newViewWidth = newSurfaceWidth;
|
||
newViewHeight = newSurfaceHeight
|
||
} else {
|
||
newSurfaceWidth = this._width;
|
||
newSurfaceHeight = this._height;
|
||
newViewWidth = this.GetScissoredViewportWidth();
|
||
newViewHeight = this.GetScissoredViewportHeight()
|
||
}
|
||
const didSurfaceSizeChange = this._lastBackbufferWidth !== newSurfaceWidth || this._lastBackbufferHeight !== newSurfaceHeight;
|
||
if (didSurfaceSizeChange)
|
||
this._UpdateViewportRenderer(newViewWidth, newViewHeight, newSurfaceWidth, newSurfaceHeight);
|
||
const b = this.PushBatch();
|
||
b.InitSetRenderTarget(renderTarget, didSurfaceSizeChange, this._matP);
|
||
this._currentRenderTarget = renderTarget;
|
||
this._topOfBatch = 0
|
||
}
|
||
GetRenderTarget() {
|
||
return this._currentRenderTarget
|
||
}
|
||
GetRenderTargetSize(renderTarget) {
|
||
if (renderTarget)
|
||
return [renderTarget.GetWidth(), renderTarget.GetHeight()];
|
||
else
|
||
return [this._width, this._height]
|
||
}
|
||
CopyRenderTarget(renderTarget, mode="stretch") {
|
||
if (this._version < 2 || this._currentRenderTarget && this._currentRenderTarget.GetMultisampling() > 0) {
|
||
this.SetCopyBlend();
|
||
this.ResetColor();
|
||
this.DrawRenderTarget(renderTarget, mode)
|
||
} else {
|
||
const b = this.PushBatch();
|
||
b.InitBlitFramebuffer(renderTarget, this._currentRenderTarget, mode);
|
||
this._topOfBatch = 0
|
||
}
|
||
}
|
||
DrawRenderTarget(renderTarget, mode="stretch") {
|
||
const tex = renderTarget.GetTexture();
|
||
if (!tex)
|
||
throw new Error("not a texture-backed render target");
|
||
this.SetTexture(tex);
|
||
this.FullscreenQuad(mode, tex)
|
||
}
|
||
InvalidateRenderTarget(renderTarget) {
|
||
if (this._version < 2)
|
||
return;
|
||
const b = this.PushBatch();
|
||
b.InitInvalidateFramebuffer(renderTarget._GetFramebuffer());
|
||
this._topOfBatch = 0
|
||
}
|
||
DeleteRenderTarget(renderTarget) {
|
||
this.SetRenderTarget(null);
|
||
this.EndBatch();
|
||
const renderTex = renderTarget.GetTexture();
|
||
if (renderTex === this._lastTexture0) {
|
||
this._gl.bindTexture(this._gl.TEXTURE_2D, null);
|
||
this._lastTexture0 = null
|
||
}
|
||
if (renderTex === this._lastTexture1) {
|
||
this._gl.activeTexture(this._gl.TEXTURE1);
|
||
this._gl.bindTexture(this._gl.TEXTURE_2D, null);
|
||
this._gl.activeTexture(this._gl.TEXTURE0);
|
||
this._lastTexture1 = null
|
||
}
|
||
renderTarget._Delete()
|
||
}
|
||
async ReadBackRenderTargetToImageData(renderTarget, forceSynchronous, areaRect) {
|
||
this.EndBatch();
|
||
const oldRenderTarget = this._currentRenderTarget;
|
||
let width, height, framebuffer;
|
||
if (renderTarget) {
|
||
width = renderTarget.GetWidth();
|
||
height = renderTarget.GetHeight();
|
||
framebuffer = renderTarget._GetFramebuffer()
|
||
} else {
|
||
width = this.GetWidth();
|
||
height = this.GetHeight();
|
||
framebuffer = null
|
||
}
|
||
let x = 0;
|
||
let y = 0;
|
||
let areaWidth = width;
|
||
let areaHeight = height;
|
||
if (areaRect) {
|
||
x = C3.clamp(Math.floor(areaRect.getLeft()), 0, width - 1);
|
||
y = C3.clamp(Math.floor(areaRect.getTop()), 0, height - 1);
|
||
let w = areaRect.width();
|
||
if (w === 0)
|
||
w = width - x;
|
||
else
|
||
w = C3.clamp(Math.floor(w), 0, width - x);
|
||
let h = areaRect.height();
|
||
if (h === 0)
|
||
h = height - y;
|
||
else
|
||
h = C3.clamp(Math.floor(h), 0, height - y);
|
||
areaWidth = w;
|
||
areaHeight = h;
|
||
y = height - (y + areaHeight)
|
||
}
|
||
const gl = this._gl;
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
|
||
const restorePreviousRenderTarget = ()=>{
|
||
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
||
this._currentRenderTarget = null;
|
||
this._batchState.currentFramebuffer = null;
|
||
this.SetRenderTarget(oldRenderTarget)
|
||
}
|
||
;
|
||
let imageData;
|
||
if (!forceSynchronous && this.GetWebGLVersionNumber() >= 2) {
|
||
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, framebuffer);
|
||
const pixelBuffer = gl.createBuffer();
|
||
const bufferSize = areaWidth * areaHeight * 4;
|
||
const PIXEL_PACK_BUFFER = gl["PIXEL_PACK_BUFFER"];
|
||
gl.bindBuffer(PIXEL_PACK_BUFFER, pixelBuffer);
|
||
gl.bufferData(PIXEL_PACK_BUFFER, bufferSize, gl["STREAM_READ"]);
|
||
gl.readPixels(x, y, areaWidth, areaHeight, gl.RGBA, gl.UNSIGNED_BYTE, 0);
|
||
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);
|
||
gl.bindBuffer(PIXEL_PACK_BUFFER, null);
|
||
restorePreviousRenderTarget();
|
||
const sync = gl["fenceSync"](gl["SYNC_GPU_COMMANDS_COMPLETE"], 0);
|
||
await this._WaitForObjectReady(()=>gl["getSyncParameter"](sync, gl["SYNC_STATUS"]) === gl["SIGNALED"]);
|
||
gl["deleteSync"](sync);
|
||
imageData = new ImageData(areaWidth,areaHeight);
|
||
gl.bindBuffer(PIXEL_PACK_BUFFER, pixelBuffer);
|
||
gl["getBufferSubData"](PIXEL_PACK_BUFFER, 0, new Uint8Array(imageData.data.buffer), 0, bufferSize);
|
||
gl.bindBuffer(PIXEL_PACK_BUFFER, null);
|
||
gl.deleteBuffer(pixelBuffer)
|
||
} else {
|
||
imageData = new ImageData(areaWidth,areaHeight);
|
||
gl.readPixels(x, y, areaWidth, areaHeight, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(imageData.data.buffer));
|
||
restorePreviousRenderTarget()
|
||
}
|
||
return imageData
|
||
}
|
||
StartQuery(query) {
|
||
if (!this.SupportsGPUProfiling())
|
||
return;
|
||
const b = this.PushBatch();
|
||
b.InitStartQuery(query);
|
||
this._topOfBatch = 0
|
||
}
|
||
EndQuery(query) {
|
||
if (!this.SupportsGPUProfiling())
|
||
return;
|
||
const b = this.PushBatch();
|
||
b.InitEndQuery(query);
|
||
this._topOfBatch = 0
|
||
}
|
||
_WaitForObjectReady(checkFunc) {
|
||
const ret = new Promise(resolve=>pendingPolls.add({
|
||
resolve,
|
||
checkFunc
|
||
}));
|
||
if (pollRafId === -1)
|
||
pollRafId = self.requestAnimationFrame(CheckPendingPolls);
|
||
return ret
|
||
}
|
||
IsDesynchronized() {
|
||
return !!this._attribs["desynchronized"]
|
||
}
|
||
GetEstimatedBackBufferMemoryUsage() {
|
||
return this._width * this._height * (this._attribs["alpha"] ? 4 : 3)
|
||
}
|
||
GetEstimatedRenderBufferMemoryUsage() {
|
||
let ret = 0;
|
||
for (const t of C3.Gfx.WebGLRenderTarget.allRenderTargets()) {
|
||
if (t.GetTexture())
|
||
continue;
|
||
ret += t.GetEstimatedMemoryUsage()
|
||
}
|
||
return ret
|
||
}
|
||
GetEstimatedTextureMemoryUsage() {
|
||
let ret = 0;
|
||
for (const t of C3.Gfx.WebGLRendererTexture.allTextures())
|
||
ret += t.GetEstimatedMemoryUsage();
|
||
return ret
|
||
}
|
||
GetEstimatedTotalMemoryUsage() {
|
||
return this.GetEstimatedBackBufferMemoryUsage() + this.GetEstimatedRenderBufferMemoryUsage() + this.GetEstimatedTextureMemoryUsage()
|
||
}
|
||
GetWebGLVersionString() {
|
||
return this._versionString
|
||
}
|
||
GetWebGLVersionNumber() {
|
||
return this._version
|
||
}
|
||
SupportsNPOTTextures() {
|
||
return this.GetWebGLVersionNumber() >= 2
|
||
}
|
||
GetMaxTextureSize() {
|
||
return this._maxTextureSize
|
||
}
|
||
GetMinPointSize() {
|
||
return this._minPointSize
|
||
}
|
||
GetMaxPointSize() {
|
||
return this._maxPointSize
|
||
}
|
||
SupportsHighP() {
|
||
return this._highpPrecision !== 0
|
||
}
|
||
GetHighPPrecision() {
|
||
return this._highpPrecision
|
||
}
|
||
GetUnmaskedVendor() {
|
||
return this._unmaskedVendor
|
||
}
|
||
GetUnmaskedRenderer() {
|
||
return this._unmaskedRenderer
|
||
}
|
||
GetExtensions() {
|
||
return this._extensions
|
||
}
|
||
HasMajorPerformanceCaveat() {
|
||
return this._hasMajorPerformanceCaveat
|
||
}
|
||
SupportsGPUProfiling() {
|
||
return !!this._timerExt
|
||
}
|
||
_GetDisjointTimerQueryExtension() {
|
||
return this._timerExt
|
||
}
|
||
_GetParallelShaderCompileExtension() {
|
||
return this._parallelShaderCompileExt
|
||
}
|
||
_AddQueryResultBuffer(qrb) {
|
||
this._allQueryResultBuffers.add(qrb)
|
||
}
|
||
_RemoveQueryResultBuffer(qrb) {
|
||
this._allQueryResultBuffers.delete(qrb)
|
||
}
|
||
_GetTimeQueryStack() {
|
||
return this._timeQueryStack
|
||
}
|
||
GetContext() {
|
||
return this._gl
|
||
}
|
||
_InitBlendModes(gl) {
|
||
this._InitBlendModeData([["normal", gl.ONE, gl.ONE_MINUS_SRC_ALPHA], ["additive", gl.ONE, gl.ONE], ["xor", gl.ONE, gl.ONE_MINUS_SRC_ALPHA], ["copy", gl.ONE, gl.ZERO], ["destination-over", gl.ONE_MINUS_DST_ALPHA, gl.ONE], ["source-in", gl.DST_ALPHA, gl.ZERO], ["destination-in", gl.ZERO, gl.SRC_ALPHA], ["source-out", gl.ONE_MINUS_DST_ALPHA, gl.ZERO], ["destination-out", gl.ZERO, gl.ONE_MINUS_SRC_ALPHA], ["source-atop", gl.DST_ALPHA, gl.ONE_MINUS_SRC_ALPHA], ["destination-atop", gl.ONE_MINUS_DST_ALPHA, gl.SRC_ALPHA]])
|
||
}
|
||
CreateRendererText() {
|
||
return C3.New(C3.Gfx.RendererText, this)
|
||
}
|
||
CreateWebGLText() {
|
||
return this.CreateRendererText()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
let runtime = null;
|
||
const keysDownByKey = new Set;
|
||
function SortZOrderList(a, b) {
|
||
const layerA = a[0];
|
||
const layerB = b[0];
|
||
const diff = layerA - layerB;
|
||
if (diff !== 0)
|
||
return diff;
|
||
const indexA = a[1];
|
||
const indexB = b[1];
|
||
return indexA - indexB
|
||
}
|
||
const tempZOrderList = [];
|
||
const tempInstances = [];
|
||
let didWarnInAlertPolyfill = false;
|
||
self.IRuntime = class IRuntime {
|
||
constructor(runtime_, objects) {
|
||
runtime = runtime_;
|
||
Object.defineProperties(this, {
|
||
assets: {
|
||
value: runtime.GetAssetManager().GetIAssetManager(),
|
||
writable: false
|
||
},
|
||
objects: {
|
||
value: objects,
|
||
writable: false
|
||
},
|
||
globalVars: {
|
||
value: {},
|
||
writable: false
|
||
},
|
||
projectName: {
|
||
value: runtime.GetProjectName(),
|
||
writable: false
|
||
},
|
||
projectVersion: {
|
||
value: runtime.GetProjectVersion(),
|
||
writable: false
|
||
},
|
||
storage: {
|
||
value: new self.IStorage(runtime),
|
||
writable: false
|
||
},
|
||
isInWorker: {
|
||
value: runtime.IsInWorker(),
|
||
writable: false
|
||
}
|
||
});
|
||
runtime.UserScriptDispatcher().addEventListener("keydown", e=>{
|
||
if (keysDownByKey.has(e["key"])) {
|
||
e.stopPropagation();
|
||
return
|
||
}
|
||
keysDownByKey.add(e["key"])
|
||
}
|
||
);
|
||
runtime.UserScriptDispatcher().addEventListener("keyup", e=>keysDownByKey.delete(e["key"]));
|
||
runtime.Dispatcher().addEventListener("window-blur", ()=>keysDownByKey.clear());
|
||
if (runtime.IsInWorker())
|
||
self["alert"] = message=>{
|
||
if (!didWarnInAlertPolyfill) {
|
||
didWarnInAlertPolyfill = true;
|
||
console.warn("[Construct 3] alert() was called from a Web Worker, because the project 'Use worker' setting is enabled. This method is not normally available in a Web Worker. Construct has implemented the alert for you, but note that other features may be missing in worker mode. You may wish to disable 'Use worker', or use a more convenient function like console.log(). For more information please refer to the scripting section of the manual.")
|
||
}
|
||
return this.alert(message)
|
||
}
|
||
}
|
||
_InitGlobalVars(globalVarDescriptors) {
|
||
Object.defineProperties(this.globalVars, globalVarDescriptors)
|
||
}
|
||
addEventListener(name, func) {
|
||
runtime.UserScriptDispatcher().addEventListener(name, func)
|
||
}
|
||
removeEventListener(name, func) {
|
||
runtime.UserScriptDispatcher().removeEventListener(name, func)
|
||
}
|
||
callFunction(name, ...params) {
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
const functionBlock = eventSheetManager.GetFunctionBlockByName(name);
|
||
if (!functionBlock)
|
||
throw new Error(`cannot find function name '${name}'`);
|
||
if (!functionBlock.IsEnabled())
|
||
return functionBlock.GetDefaultReturnValue();
|
||
if (params.length < functionBlock.GetFunctionParameterCount())
|
||
throw new Error(`not enough function parameters passed for '${name}' (${params.length} passed, ${functionBlock.GetFunctionParameterCount()} expected)`);
|
||
const callEventBlock = functionBlock.GetEventBlock();
|
||
let solModifiers = null;
|
||
const currentEvent = eventSheetManager.GetCurrentEvent();
|
||
if (currentEvent) {
|
||
const sm = currentEvent.GetSolModifiersIncludingParents();
|
||
if (sm.length > 0) {
|
||
solModifiers = sm;
|
||
eventSheetManager.PushCleanSol(sm)
|
||
}
|
||
}
|
||
const ret = callEventBlock.RunAsExpressionFunctionCall(callEventBlock.GetSolModifiersIncludingParents(), functionBlock.GetReturnType(), functionBlock.GetDefaultReturnValue(), ...params);
|
||
if (solModifiers)
|
||
eventSheetManager.PopSol(solModifiers);
|
||
return ret
|
||
}
|
||
setReturnValue(v) {
|
||
const frame = runtime.GetEventStack().GetCurrentExpFuncStackFrame();
|
||
if (!frame)
|
||
throw new Error("not in a function which returns a value");
|
||
switch (frame.GetFunctionReturnType()) {
|
||
case 1:
|
||
if (typeof v === "number")
|
||
frame.SetFunctionReturnValue(v);
|
||
break;
|
||
case 2:
|
||
if (typeof v === "string")
|
||
frame.SetFunctionReturnValue(v);
|
||
break;
|
||
case 3:
|
||
if (typeof v === "number" || typeof v === "string")
|
||
frame.SetFunctionReturnValue(v);
|
||
break
|
||
}
|
||
}
|
||
get dt() {
|
||
return runtime.GetDt()
|
||
}
|
||
get gameTime() {
|
||
return runtime.GetGameTime()
|
||
}
|
||
get wallTime() {
|
||
return runtime.GetWallTime()
|
||
}
|
||
random() {
|
||
return runtime.Random()
|
||
}
|
||
get layout() {
|
||
return runtime.GetMainRunningLayout().GetILayout()
|
||
}
|
||
getLayout(nameOrIndex) {
|
||
const layoutManager = runtime.GetLayoutManager();
|
||
let layout = null;
|
||
if (typeof nameOrIndex === "number" || typeof nameOrIndex === "string")
|
||
layout = layoutManager.GetLayout(nameOrIndex);
|
||
else
|
||
throw new TypeError("expected string or number");
|
||
if (!layout)
|
||
throw new Error("invalid layout");
|
||
return layout.GetILayout()
|
||
}
|
||
getAllLayouts() {
|
||
return runtime.GetLayoutManager().GetAllLayouts().map(layout=>layout.GetILayout())
|
||
}
|
||
goToLayout(nameOrIndex) {
|
||
const layoutManager = runtime.GetLayoutManager();
|
||
let layout = null;
|
||
if (typeof nameOrIndex === "number" || typeof nameOrIndex === "string")
|
||
layout = layoutManager.GetLayout(nameOrIndex);
|
||
else
|
||
throw new TypeError("expected string or number");
|
||
if (!layout)
|
||
throw new Error("invalid layout");
|
||
if (layoutManager.IsPendingChangeMainLayout())
|
||
return;
|
||
layoutManager.ChangeMainLayout(layout)
|
||
}
|
||
get keyboard() {
|
||
const ret = runtime._GetCommonScriptInterfaces().keyboard;
|
||
if (!ret)
|
||
throw new Error("runtime.keyboard used but Keyboard object missing - add it to your project first");
|
||
return ret
|
||
}
|
||
get mouse() {
|
||
const ret = runtime._GetCommonScriptInterfaces().mouse;
|
||
if (!ret)
|
||
throw new Error("runtime.mouse used but Mouse object missing - add it to your project first");
|
||
return ret
|
||
}
|
||
get touch() {
|
||
const ret = runtime._GetCommonScriptInterfaces().touch;
|
||
if (!ret)
|
||
throw new Error("runtime.touch used but Touch object missing - add it to your project first");
|
||
return ret
|
||
}
|
||
invokeDownload(url, filename) {
|
||
runtime.InvokeDownload(url, filename)
|
||
}
|
||
getInstanceByUid(uid) {
|
||
const ret = runtime.GetInstanceByUID(uid);
|
||
return ret ? ret.GetInterfaceClass() : null
|
||
}
|
||
sortZOrder(iterable, callback) {
|
||
const layout = runtime.GetCurrentLayout();
|
||
for (const iinst of iterable) {
|
||
const inst = runtime._UnwrapScriptInterface(iinst);
|
||
if (!inst || !inst.GetWorldInfo())
|
||
throw new Error("invalid instance");
|
||
const wi = inst.GetWorldInfo();
|
||
tempZOrderList.push([wi.GetLayer().GetIndex(), wi.GetZIndex()]);
|
||
tempInstances.push(inst)
|
||
}
|
||
if (tempZOrderList.length === 0)
|
||
return;
|
||
tempZOrderList.sort(SortZOrderList);
|
||
tempInstances.sort((a,b)=>callback(a.GetInterfaceClass(), b.GetInterfaceClass()));
|
||
let anyChanged = false;
|
||
for (let i = 0, len = tempZOrderList.length; i < len; ++i) {
|
||
const inst = tempInstances[i];
|
||
const layer = layout.GetLayerByIndex(tempZOrderList[i][0]);
|
||
const toZ = tempZOrderList[i][1];
|
||
const layerInstances = layer._GetInstances();
|
||
if (layerInstances[toZ] !== inst) {
|
||
layerInstances[toZ] = inst;
|
||
inst.GetWorldInfo()._SetLayer(layer);
|
||
layer.SetZIndicesChanged();
|
||
anyChanged = true
|
||
}
|
||
}
|
||
if (anyChanged)
|
||
runtime.UpdateRender();
|
||
C3.clearArray(tempZOrderList);
|
||
C3.clearArray(tempInstances)
|
||
}
|
||
alert(message) {
|
||
return runtime.PostComponentMessageToDOMAsync("runtime", "alert", {
|
||
"message": message + (runtime.IsInWorker() ? " [via Web Worker]" : "")
|
||
})
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
let assetManager = null;
|
||
self.IAssetManager = class IAssetManager {
|
||
constructor(assetManager_) {
|
||
assetManager = assetManager_;
|
||
Object.defineProperties(this, {
|
||
isWebMOpusSupported: {
|
||
value: assetManager.IsAudioFormatSupported("audio/webm; codecs=opus"),
|
||
writable: false
|
||
}
|
||
})
|
||
}
|
||
fetchText(url) {
|
||
return assetManager.FetchText(url)
|
||
}
|
||
fetchJson(url) {
|
||
return assetManager.FetchJson(url)
|
||
}
|
||
fetchBlob(url) {
|
||
return assetManager.FetchBlob(url)
|
||
}
|
||
fetchArrayBuffer(url) {
|
||
return assetManager.FetchArrayBuffer(url)
|
||
}
|
||
getProjectFileUrl(url) {
|
||
return assetManager.GetProjectFileUrl(url)
|
||
}
|
||
getMediaFileUrl(url) {
|
||
if (C3.IsRelativeURL(url))
|
||
url = url.toLowerCase();
|
||
return assetManager.GetMediaFileUrl(url, assetManager.GetMediaSubfolder())
|
||
}
|
||
get mediaFolder() {
|
||
return assetManager.GetMediaSubfolder()
|
||
}
|
||
async decodeWebMOpus(audioContext, arrayBuffer) {
|
||
if (this.isWebMOpusSupported)
|
||
throw new Error("decodeWebMOpus(): not supported because WebM Opus is supported by the platform");
|
||
const decodedArrayBuffer = await assetManager.GetRuntime()._WasmDecodeWebMOpus(arrayBuffer);
|
||
const decodedFloats = new Float32Array(decodedArrayBuffer);
|
||
const audioBuffer = audioContext["createBuffer"](1, decodedFloats.length, 48E3);
|
||
const channelBuffer = audioBuffer["getChannelData"](0);
|
||
channelBuffer.set(decodedFloats);
|
||
return audioBuffer
|
||
}
|
||
loadScripts(...urls) {
|
||
return assetManager.LoadScripts(...urls)
|
||
}
|
||
compileWebAssembly(url) {
|
||
return assetManager.CompileWebAssembly(url)
|
||
}
|
||
loadStyleSheet(url) {
|
||
return assetManager.LoadStyleSheet(url)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
self.IStorage = class IStorage {
|
||
constructor(runtime) {
|
||
this._storage = runtime._GetProjectStorage()
|
||
}
|
||
getItem(key) {
|
||
return this._storage.getItem(key)
|
||
}
|
||
setItem(key, value) {
|
||
return this._storage.setItem(key, value)
|
||
}
|
||
removeItem(key) {
|
||
return this._storage.removeItem(key)
|
||
}
|
||
clear() {
|
||
return this._storage.clear()
|
||
}
|
||
keys() {
|
||
return this._storage.keys()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const map = new WeakMap;
|
||
self.IObjectClass = class IObjectClass {
|
||
constructor(objectClass) {
|
||
map.set(this, objectClass);
|
||
Object.defineProperties(this, {
|
||
name: {
|
||
value: objectClass.GetName(),
|
||
writable: false
|
||
}
|
||
});
|
||
objectClass.GetRuntime()._MapScriptInterface(this, objectClass)
|
||
}
|
||
addEventListener(name, func) {
|
||
map.get(this).UserScriptDispatcher().addEventListener(name, func)
|
||
}
|
||
removeEventListener(name, func) {
|
||
map.get(this).UserScriptDispatcher().removeEventListener(name, func)
|
||
}
|
||
getAllInstances() {
|
||
return map.get(this).GetInstances().map(inst=>inst.GetInterfaceClass())
|
||
}
|
||
getFirstInstance() {
|
||
const instances = map.get(this).GetInstances();
|
||
if (instances.length > 0)
|
||
return instances[0].GetInterfaceClass();
|
||
else
|
||
return null
|
||
}
|
||
getPickedInstances() {
|
||
return map.get(this).GetCurrentSol().GetInstances().map(inst=>inst.GetInterfaceClass())
|
||
}
|
||
getFirstPickedInstance() {
|
||
const pickedInstances = map.get(this).GetCurrentSol().GetInstances();
|
||
if (pickedInstances.length > 0)
|
||
return pickedInstances[0].GetInterfaceClass();
|
||
else
|
||
return null
|
||
}
|
||
*instances() {
|
||
for (const inst of map.get(this).GetInstances())
|
||
yield inst.GetInterfaceClass()
|
||
}
|
||
*pickedInstances() {
|
||
for (const inst of map.get(this).GetCurrentSol().GetInstances())
|
||
yield inst.GetInterfaceClass()
|
||
}
|
||
setInstanceClass(Class) {
|
||
const objectClass = map.get(this);
|
||
if (objectClass.GetInstanceCount() > 0)
|
||
throw new Error("setInstanceClass() called too late, because instances have already been created - call in runOnStartup");
|
||
map.get(this)._SetUserScriptInstanceClass(Class)
|
||
}
|
||
createInstance(layerNameOrIndex, x, y) {
|
||
if (typeof layerNameOrIndex !== "number" && typeof layerNameOrIndex !== "string")
|
||
throw new TypeError("invalid layer parameter");
|
||
const objectClass = map.get(this);
|
||
const runtime = objectClass.GetRuntime();
|
||
const layer = runtime.GetMainRunningLayout().GetLayer(layerNameOrIndex);
|
||
if (!layer)
|
||
throw new Error("invalid layer");
|
||
const inst = runtime.CreateInstance(objectClass, layer, x, y);
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
eventSheetManager.BlockFlushingInstances(true);
|
||
inst._TriggerOnCreated();
|
||
if (inst.IsInContainer())
|
||
for (const s of inst.siblings())
|
||
s._TriggerOnCreated();
|
||
eventSheetManager.BlockFlushingInstances(false);
|
||
return inst.GetInterfaceClass()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const map = new WeakMap;
|
||
self.ILayout = class ILayout {
|
||
constructor(layout) {
|
||
map.set(this, layout);
|
||
const effectInstanceArr = [];
|
||
const effectList = layout.GetEffectList();
|
||
const effectCount = effectList.GetAllEffectTypes().length;
|
||
for (let i = 0; i < effectCount; ++i)
|
||
effectInstanceArr.push(new self.IEffectInstance(effectList,i));
|
||
Object.defineProperties(this, {
|
||
name: {
|
||
value: layout.GetName(),
|
||
writable: false
|
||
},
|
||
index: {
|
||
value: layout.GetIndex(),
|
||
writable: false
|
||
},
|
||
effects: {
|
||
value: effectInstanceArr,
|
||
writable: false
|
||
}
|
||
})
|
||
}
|
||
addEventListener(name, func) {
|
||
map.get(this).UserScriptDispatcher().addEventListener(name, func)
|
||
}
|
||
removeEventListener(name, func) {
|
||
map.get(this).UserScriptDispatcher().removeEventListener(name, func)
|
||
}
|
||
get width() {
|
||
return map.get(this).GetWidth()
|
||
}
|
||
set width(w) {
|
||
map.get(this).SetWidth(w)
|
||
}
|
||
get height() {
|
||
return map.get(this).GetHeight()
|
||
}
|
||
set height(h) {
|
||
map.get(this).SetHeight(h)
|
||
}
|
||
scrollTo(x, y) {
|
||
const layout = map.get(this);
|
||
layout.SetScrollX(x);
|
||
layout.SetScrollY(y)
|
||
}
|
||
getLayer(nameOrIndex) {
|
||
const layout = map.get(this);
|
||
let layer = null;
|
||
if (typeof nameOrIndex === "number" || typeof nameOrIndex === "string")
|
||
layer = layout.GetLayer(nameOrIndex);
|
||
else
|
||
throw new TypeError("expected string or number");
|
||
if (!layer)
|
||
throw new Error("invalid layer");
|
||
return layer.GetILayer()
|
||
}
|
||
getAllLayers() {
|
||
return map.get(this).GetLayers().map(layer=>layer.GetILayer())
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const map = new WeakMap;
|
||
self.ILayer = class ILayer {
|
||
constructor(layer) {
|
||
map.set(this, layer);
|
||
const effectInstanceArr = [];
|
||
const effectList = layer.GetEffectList();
|
||
const effectCount = effectList.GetAllEffectTypes().length;
|
||
for (let i = 0; i < effectCount; ++i)
|
||
effectInstanceArr.push(new self.IEffectInstance(effectList,i));
|
||
Object.defineProperties(this, {
|
||
name: {
|
||
value: layer.GetName(),
|
||
writable: false
|
||
},
|
||
index: {
|
||
value: layer.GetIndex(),
|
||
writable: false
|
||
},
|
||
layout: {
|
||
value: layer.GetLayout().GetILayout(),
|
||
writable: false
|
||
},
|
||
effects: {
|
||
value: effectInstanceArr,
|
||
writable: false
|
||
}
|
||
})
|
||
}
|
||
static _Unwrap(ilayer) {
|
||
return map.get(ilayer)
|
||
}
|
||
get isVisible() {
|
||
return map.get(this).IsVisible()
|
||
}
|
||
set isVisible(v) {
|
||
map.get(this).SetVisible(v)
|
||
}
|
||
get opacity() {
|
||
return map.get(this).GetOpacity()
|
||
}
|
||
set opacity(o) {
|
||
o = C3.clamp(+o, 0, 1);
|
||
if (isNaN(o))
|
||
return;
|
||
map.get(this).SetOpacity(o)
|
||
}
|
||
getViewport() {
|
||
return map.get(this).GetViewport().toDOMRect()
|
||
}
|
||
cssPxToLayer(clientX, clientY, z=0) {
|
||
const layer = map.get(this);
|
||
const runtime = layer.GetRuntime();
|
||
return layer.CanvasCssToLayer(clientX - runtime.GetCanvasClientX(), clientY - runtime.GetCanvasClientY(), z)
|
||
}
|
||
layerToCssPx(layerX, layerY, z=0) {
|
||
const layer = map.get(this);
|
||
const runtime = layer.GetRuntime();
|
||
const [clientX,clientY] = layer.LayerToCanvasCss(layerX, layerY, z);
|
||
return [clientX + runtime.GetCanvasClientX(), clientY + runtime.GetCanvasClientY()]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const map = new WeakMap;
|
||
const dispatchers = new WeakMap;
|
||
function GetDispatcher(iinst) {
|
||
let dispatcher = dispatchers.get(iinst);
|
||
if (dispatcher)
|
||
return dispatcher;
|
||
dispatcher = C3.New(C3.Event.Dispatcher);
|
||
dispatchers.set(iinst, dispatcher);
|
||
return dispatcher
|
||
}
|
||
let initInst = null;
|
||
self.IInstance = class IInstance {
|
||
constructor() {
|
||
map.set(this, initInst);
|
||
const descriptors = {
|
||
runtime: {
|
||
value: initInst.GetRuntime().GetIRuntime(),
|
||
writable: false
|
||
},
|
||
objectType: {
|
||
value: initInst.GetObjectClass().GetIObjectClass(),
|
||
writable: false
|
||
},
|
||
uid: {
|
||
value: initInst.GetUID(),
|
||
writable: false
|
||
}
|
||
};
|
||
initInst._GetInstVarsScriptDescriptor(descriptors);
|
||
initInst._GetBehaviorsScriptDescriptor(descriptors);
|
||
Object.defineProperties(this, descriptors);
|
||
initInst.GetRuntime()._MapScriptInterface(this, initInst)
|
||
}
|
||
static _Init(inst) {
|
||
initInst = inst
|
||
}
|
||
static _GetInitInst() {
|
||
return initInst
|
||
}
|
||
_Release() {
|
||
const dispatcher = dispatchers.get(this);
|
||
if (dispatcher) {
|
||
dispatcher.Release();
|
||
dispatchers.delete(this)
|
||
}
|
||
map.delete(this)
|
||
}
|
||
addEventListener(type, func, capture) {
|
||
GetDispatcher(this).addEventListener(type, func, capture)
|
||
}
|
||
removeEventListener(type, func, capture) {
|
||
GetDispatcher(this).removeEventListener(type, func, capture)
|
||
}
|
||
dispatchEvent(e) {
|
||
GetDispatcher(this).dispatchEvent(e)
|
||
}
|
||
destroy() {
|
||
const inst = map.get(this);
|
||
inst.GetRuntime().DestroyInstance(inst)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const IInstance = self.IInstance;
|
||
const ILayer = self.ILayer;
|
||
const map = new WeakMap;
|
||
const BLEND_MODE_TO_INDEX = new Map([["normal", 0], ["additive", 1], ["copy", 3], ["destination-over", 4], ["source-in", 5], ["destination-in", 6], ["source-out", 7], ["destination-out", 8], ["source-atop", 9], ["destination-atop", 10]]);
|
||
const INDEX_TO_BLEND_MODE = new Map([...BLEND_MODE_TO_INDEX.entries()].map(a=>[a[1], a[0]]));
|
||
const tempColor = C3.New(C3.Color);
|
||
self.IWorldInstance = class IWorldInstance extends IInstance {
|
||
constructor() {
|
||
super();
|
||
const inst = IInstance._GetInitInst();
|
||
map.set(this, inst);
|
||
const effectInstanceArr = [];
|
||
const wi = inst.GetWorldInfo();
|
||
const instanceEffectList = wi.GetInstanceEffectList();
|
||
if (instanceEffectList) {
|
||
const effectCount = wi.GetObjectClass().GetEffectList().GetAllEffectTypes().length;
|
||
for (let i = 0; i < effectCount; ++i)
|
||
effectInstanceArr.push(new self.IEffectInstance(instanceEffectList,i))
|
||
}
|
||
const descriptors = {
|
||
effects: {
|
||
value: effectInstanceArr,
|
||
writable: false
|
||
}
|
||
};
|
||
Object.defineProperties(this, descriptors)
|
||
}
|
||
get layout() {
|
||
return map.get(this).GetWorldInfo().GetLayout().GetILayout()
|
||
}
|
||
get layer() {
|
||
return map.get(this).GetWorldInfo().GetLayer().GetILayer()
|
||
}
|
||
get x() {
|
||
return map.get(this).GetWorldInfo().GetX()
|
||
}
|
||
set x(v) {
|
||
v = +v;
|
||
const wi = map.get(this).GetWorldInfo();
|
||
if (isNaN(v) || wi.GetX() === v)
|
||
return;
|
||
wi.SetX(v);
|
||
wi.SetBboxChanged()
|
||
}
|
||
get y() {
|
||
return map.get(this).GetWorldInfo().GetY()
|
||
}
|
||
set y(v) {
|
||
v = +v;
|
||
const wi = map.get(this).GetWorldInfo();
|
||
if (isNaN(v) || wi.GetY() === v)
|
||
return;
|
||
wi.SetY(v);
|
||
wi.SetBboxChanged()
|
||
}
|
||
get zElevation() {
|
||
return map.get(this).GetWorldInfo().GetZElevation()
|
||
}
|
||
set zElevation(z) {
|
||
z = +z;
|
||
const inst = map.get(this);
|
||
const wi = inst.GetWorldInfo();
|
||
if (wi.GetZElevation() === z)
|
||
return;
|
||
wi.SetZElevation(z);
|
||
inst.GetRuntime().UpdateRender()
|
||
}
|
||
get totalZElevation() {
|
||
return map.get(this).GetWorldInfo().GetTotalZElevation()
|
||
}
|
||
get width() {
|
||
return map.get(this).GetWorldInfo().GetWidth()
|
||
}
|
||
set width(w) {
|
||
w = +w;
|
||
const wi = map.get(this).GetWorldInfo();
|
||
if (isNaN(w) || wi.GetWidth() === w)
|
||
return;
|
||
wi.SetWidth(w);
|
||
wi.SetBboxChanged()
|
||
}
|
||
get height() {
|
||
return map.get(this).GetWorldInfo().GetHeight()
|
||
}
|
||
set height(h) {
|
||
h = +h;
|
||
const wi = map.get(this).GetWorldInfo();
|
||
if (isNaN(h) || wi.GetHeight() === h)
|
||
return;
|
||
wi.SetHeight(h);
|
||
wi.SetBboxChanged()
|
||
}
|
||
get angle() {
|
||
return map.get(this).GetWorldInfo().GetAngle()
|
||
}
|
||
set angle(a) {
|
||
a = C3.clampAngle(+a);
|
||
const wi = map.get(this).GetWorldInfo();
|
||
if (isNaN(a) || wi.GetAngle() === a)
|
||
return;
|
||
wi.SetAngle(a);
|
||
wi.SetBboxChanged()
|
||
}
|
||
get angleDegrees() {
|
||
return C3.toDegrees(this.angle)
|
||
}
|
||
set angleDegrees(a) {
|
||
this.angle = C3.toRadians(a)
|
||
}
|
||
getBoundingBox() {
|
||
return map.get(this).GetWorldInfo().GetBoundingBox().toDOMRect()
|
||
}
|
||
getBoundingQuad() {
|
||
return map.get(this).GetWorldInfo().GetBoundingQuad().toDOMQuad()
|
||
}
|
||
get isVisible() {
|
||
return map.get(this).GetWorldInfo().IsVisible()
|
||
}
|
||
set isVisible(v) {
|
||
v = !!v;
|
||
const inst = map.get(this);
|
||
const wi = inst.GetWorldInfo();
|
||
if (wi.IsVisible() === v)
|
||
return;
|
||
wi.SetVisible(v);
|
||
inst.GetRuntime().UpdateRender()
|
||
}
|
||
get opacity() {
|
||
return map.get(this).GetWorldInfo().GetOpacity()
|
||
}
|
||
set opacity(o) {
|
||
o = C3.clamp(+o, 0, 1);
|
||
const inst = map.get(this);
|
||
const wi = inst.GetWorldInfo();
|
||
if (isNaN(o) || wi.GetOpacity() === o)
|
||
return;
|
||
wi.SetOpacity(o);
|
||
inst.GetRuntime().UpdateRender()
|
||
}
|
||
set colorRgb(arr) {
|
||
if (arr.length < 3)
|
||
throw new Error("expected 3 elements");
|
||
tempColor.setRgb(arr[0], arr[1], arr[2]);
|
||
const inst = map.get(this);
|
||
const wi = inst.GetWorldInfo();
|
||
if (wi.GetUnpremultipliedColor().equalsIgnoringAlpha(tempColor))
|
||
return;
|
||
wi.SetUnpremultipliedColor(tempColor);
|
||
inst.GetRuntime().UpdateRender()
|
||
}
|
||
get colorRgb() {
|
||
const c = map.get(this).GetWorldInfo().GetUnpremultipliedColor();
|
||
return [c.getR(), c.getG(), c.getB()]
|
||
}
|
||
set blendMode(bm) {
|
||
const index = BLEND_MODE_TO_INDEX.get(bm);
|
||
if (typeof index !== "number")
|
||
throw new Error("invalid blend mode");
|
||
const inst = map.get(this);
|
||
const wi = inst.GetWorldInfo();
|
||
wi.SetBlendMode(index);
|
||
inst.GetRuntime().UpdateRender()
|
||
}
|
||
get blendMode() {
|
||
return INDEX_TO_BLEND_MODE.get(map.get(this).GetWorldInfo().GetBlendMode())
|
||
}
|
||
moveToTop() {
|
||
map.get(this).GetWorldInfo().ZOrderMoveToTop()
|
||
}
|
||
moveToBottom() {
|
||
map.get(this).GetWorldInfo().ZOrderMoveToBottom()
|
||
}
|
||
moveToLayer(ilayer) {
|
||
const layer = ILayer._Unwrap(ilayer);
|
||
if (!layer)
|
||
throw new Error("invalid layer");
|
||
map.get(this).GetWorldInfo().ZOrderMoveToLayer(layer)
|
||
}
|
||
moveAdjacentToInstance(other, isAfter) {
|
||
map.get(this).GetWorldInfo().ZOrderMoveAdjacentToInstance(map.get(other), isAfter)
|
||
}
|
||
containsPoint(x, y) {
|
||
return map.get(this).GetWorldInfo().ContainsPoint(+x, +y)
|
||
}
|
||
testOverlap(worldInstance) {
|
||
const a = map.get(this);
|
||
const b = map.get(worldInstance);
|
||
return a.GetRuntime().GetCollisionEngine().TestOverlap(a, b)
|
||
}
|
||
testOverlapSolid() {
|
||
const inst = map.get(this);
|
||
const overlapInst = inst.GetRuntime().GetCollisionEngine().TestOverlapSolid(inst);
|
||
return overlapInst ? overlapInst.GetInterfaceClass() : null
|
||
}
|
||
getParent() {
|
||
const parent = map.get(this).GetParent();
|
||
return parent ? parent.GetInterfaceClass() : null
|
||
}
|
||
getTopParent() {
|
||
const parent = map.get(this).GetTopParent();
|
||
return parent ? parent.GetInterfaceClass() : null
|
||
}
|
||
*parents() {
|
||
for (const parent of map.get(this).parents())
|
||
yield parent.GetInterfaceClass()
|
||
}
|
||
getChildCount() {
|
||
return map.get(this).GetChildCount()
|
||
}
|
||
getChildAt(index) {
|
||
const child = map.get(this).GetChildAt(index);
|
||
return child ? child.GetInterfaceClass() : null
|
||
}
|
||
*children() {
|
||
for (const child of map.get(this).children())
|
||
yield child.GetInterfaceClass()
|
||
}
|
||
*allChildren() {
|
||
for (const child of map.get(this).allChildren())
|
||
yield child.GetInterfaceClass()
|
||
}
|
||
addChild(ichild, opts) {
|
||
if (!opts)
|
||
opts = {};
|
||
const inst = map.get(this);
|
||
const child = map.get(ichild);
|
||
inst.AddChild(child, opts)
|
||
}
|
||
removeChild(ichild) {
|
||
const inst = map.get(this);
|
||
const child = map.get(ichild);
|
||
inst.RemoveChild(child)
|
||
}
|
||
removeFromParent() {
|
||
const inst = map.get(this);
|
||
if (!inst.HasParent())
|
||
return;
|
||
const parent = inst.GetParent();
|
||
parent.RemoveChild(inst)
|
||
}
|
||
createMesh(hsize, vsize) {
|
||
map.get(this).GetWorldInfo().CreateMesh(hsize, vsize)
|
||
}
|
||
releaseMesh() {
|
||
const wi = map.get(this).GetWorldInfo();
|
||
wi.ReleaseMesh();
|
||
wi.SetBboxChanged()
|
||
}
|
||
setMeshPoint(col, row, opts) {
|
||
const wi = map.get(this).GetWorldInfo();
|
||
if (wi.SetMeshPoint(col, row, opts))
|
||
wi.SetBboxChanged()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const map = new WeakMap;
|
||
self.IDOMInstance = class IDOMInstance extends self.IWorldInstance {
|
||
constructor() {
|
||
super();
|
||
map.set(this, self.IInstance._GetInitInst())
|
||
}
|
||
getElement() {
|
||
return map.get(this).GetSdkInstance()._GetElementInDOMMode()
|
||
}
|
||
focus() {
|
||
map.get(this).GetSdkInstance().FocusElement()
|
||
}
|
||
blur() {
|
||
map.get(this).GetSdkInstance().BlurElement()
|
||
}
|
||
setCssStyle(prop, val) {
|
||
map.get(this).GetSdkInstance().SetElementCSSStyle(prop, val)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const map = new WeakMap;
|
||
const dispatchers = new WeakMap;
|
||
function GetDispatcher(ibehinst) {
|
||
let dispatcher = dispatchers.get(ibehinst);
|
||
if (dispatcher)
|
||
return dispatcher;
|
||
dispatcher = C3.New(C3.Event.Dispatcher);
|
||
dispatchers.set(ibehinst, dispatcher);
|
||
return dispatcher
|
||
}
|
||
let initBehInst = null;
|
||
self.IBehaviorInstance = class IBehaviorInstance {
|
||
constructor() {
|
||
map.set(this, initBehInst);
|
||
const descriptors = {
|
||
runtime: {
|
||
value: initBehInst.GetRuntime().GetIRuntime(),
|
||
writable: false
|
||
},
|
||
behavior: {
|
||
value: initBehInst.GetBehavior().GetIBehavior(),
|
||
writable: false
|
||
}
|
||
};
|
||
Object.defineProperties(this, descriptors)
|
||
}
|
||
static _Init(behInst) {
|
||
initBehInst = behInst
|
||
}
|
||
static _GetInitInst() {
|
||
return initBehInst
|
||
}
|
||
get instance() {
|
||
return map.get(this).GetObjectInstance().GetInterfaceClass()
|
||
}
|
||
_Release() {
|
||
const dispatcher = dispatchers.get(this);
|
||
if (dispatcher) {
|
||
dispatcher.Release();
|
||
dispatchers.delete(this)
|
||
}
|
||
map.delete(this)
|
||
}
|
||
addEventListener(type, func, capture) {
|
||
GetDispatcher(this).addEventListener(type, func, capture)
|
||
}
|
||
removeEventListener(type, func, capture) {
|
||
GetDispatcher(this).removeEventListener(type, func, capture)
|
||
}
|
||
dispatchEvent(e) {
|
||
GetDispatcher(this).dispatchEvent(e)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const map = new WeakMap;
|
||
self.IBehavior = class IBehavior {
|
||
constructor(behavior) {
|
||
map.set(this, behavior);
|
||
const descriptors = {
|
||
runtime: {
|
||
value: behavior.GetRuntime().GetIRuntime(),
|
||
writable: false
|
||
}
|
||
};
|
||
Object.defineProperties(this, descriptors)
|
||
}
|
||
getAllInstances() {
|
||
return map.get(this).GetInstances().map(inst=>inst.GetInterfaceClass())
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const map = new WeakMap;
|
||
self.IEffectInstance = class IEffectInstance {
|
||
constructor(effectList, index) {
|
||
map.set(this, effectList);
|
||
const descriptors = {
|
||
index: {
|
||
value: index,
|
||
writable: false
|
||
}
|
||
};
|
||
Object.defineProperties(this, descriptors)
|
||
}
|
||
get name() {
|
||
const effectTypes = map.get(this).GetAllEffectTypes();
|
||
return effectTypes[this.index].GetName()
|
||
}
|
||
get isActive() {
|
||
return map.get(this).IsEffectIndexActive(this.index)
|
||
}
|
||
set isActive(a) {
|
||
a = !!a;
|
||
const fxList = map.get(this);
|
||
if (fxList.IsEffectIndexActive(this.index) === a)
|
||
return;
|
||
fxList.SetEffectIndexActive(this.index, a);
|
||
fxList.UpdateActiveEffects();
|
||
fxList.GetRuntime().UpdateRender()
|
||
}
|
||
setParameter(i, v) {
|
||
i = Math.floor(+i);
|
||
const fxList = map.get(this);
|
||
const paramsArr = fxList.GetEffectParametersForIndex(this.index);
|
||
if (i < 0 || i >= paramsArr.length)
|
||
throw new RangeError("invalid effect parameter index");
|
||
const oldValue = paramsArr[i];
|
||
if (oldValue instanceof C3.Color) {
|
||
if (!Array.isArray(v) || v.length < 3)
|
||
throw new TypeError("expected array with 3 elements");
|
||
const r = v[0];
|
||
const g = v[1];
|
||
const b = v[2];
|
||
if (oldValue.equalsRgb(r, g, b))
|
||
return;
|
||
oldValue.setRgb(r, g, b)
|
||
} else {
|
||
if (typeof v !== "number")
|
||
throw new TypeError("expected number");
|
||
if (oldValue === v)
|
||
return;
|
||
paramsArr[i] = v
|
||
}
|
||
if (fxList.IsEffectIndexActive(this.index))
|
||
fxList.GetRuntime().UpdateRender()
|
||
}
|
||
getParameter(i) {
|
||
i = Math.floor(+i);
|
||
const fxList = map.get(this);
|
||
const paramsArr = fxList.GetEffectParametersForIndex(this.index);
|
||
if (i < 0 || i >= paramsArr.length)
|
||
throw new RangeError("invalid effect parameter index");
|
||
const ret = paramsArr[i];
|
||
if (ret instanceof C3.Color)
|
||
return [ret.getR(), ret.getG(), ret.getB()];
|
||
else
|
||
return ret
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const VALID_LOAD_POLICIES = new Set(["local", "remote"]);
|
||
const EXT_TO_TYPE = new Map([["mp4", "video/mp4"], ["webm", "video/webm"], ["m4a", "audio/mp4"], ["mp3", "audio/mpeg"], ["js", "application/javascript"], ["wasm", "application/wasm"], ["svg", "image/svg+xml"], ["html", "text/html"]]);
|
||
function GetTypeFromFileExtension(filename) {
|
||
if (!filename)
|
||
return "";
|
||
const parts = filename.split(".");
|
||
if (parts.length < 2)
|
||
return "";
|
||
const ext = parts[parts.length - 1].toLowerCase();
|
||
return EXT_TO_TYPE.get(ext) || ""
|
||
}
|
||
function AddScript(url) {
|
||
return new Promise((resolve,reject)=>{
|
||
const elem = document.createElement("script");
|
||
elem.onload = resolve;
|
||
elem.onerror = reject;
|
||
elem.async = false;
|
||
elem.src = url;
|
||
document.head.appendChild(elem)
|
||
}
|
||
)
|
||
}
|
||
C3.AssetManager = class AssetManager extends C3.DefendedBase {
|
||
constructor(runtime, opts) {
|
||
super();
|
||
if (!VALID_LOAD_POLICIES.has(opts.defaultLoadPolicy))
|
||
throw new Error("invalid load policy");
|
||
this._runtime = runtime;
|
||
this._localUrlBlobs = new Map;
|
||
this._localBlobUrlCache = new Map;
|
||
this._isCordova = !!opts.isCordova;
|
||
this._isiOSCordova = !!opts.isiOSCordova;
|
||
this._isFileProtocol = location.protocol === "file:";
|
||
this._supportedAudioFormats = opts.supportedAudioFormats || {};
|
||
this._audioFiles = new Map;
|
||
this._preloadSounds = false;
|
||
this._mediaSubfolder = "";
|
||
this._fontsSubfolder = "";
|
||
this._iconsSubfolder = "";
|
||
this._defaultLoadPolicy = opts.defaultLoadPolicy;
|
||
this._allAssets = [];
|
||
this._assetsByUrl = new Map;
|
||
this._webFonts = [];
|
||
this._loadPromises = [];
|
||
this._hasFinishedInitialLoad = false;
|
||
this._totalAssetSizeToLoad = 0;
|
||
this._assetSizeLoaded = 0;
|
||
this._lastLoadProgress = 0;
|
||
this._hasHadErrorLoading = false;
|
||
this._loadingRateLimiter = C3.New(C3.RateLimiter, ()=>this._FireLoadingProgressEvent(), 50);
|
||
this._promiseThrottle = new C3.PromiseThrottle(Math.max(C3.hardwareConcurrency, 8));
|
||
if (opts.localUrlBlobs)
|
||
for (const [url,blob] of Object.entries(opts.localUrlBlobs))
|
||
this._localUrlBlobs.set(url.toLowerCase(), blob);
|
||
this._iAssetManager = new self.IAssetManager(this)
|
||
}
|
||
Release() {
|
||
this._localUrlBlobs.clear();
|
||
for (const url of this._localBlobUrlCache.values())
|
||
URL.revokeObjectURL(url);
|
||
this._localBlobUrlCache.clear();
|
||
for (const asset of this._allAssets)
|
||
asset.Release();
|
||
C3.clearArray(this._allAssets);
|
||
this._assetsByUrl.clear();
|
||
C3.clearArray(this._loadPromises);
|
||
this._runtime = null
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
_SetMediaSubfolder(folder) {
|
||
this._mediaSubfolder = folder
|
||
}
|
||
GetMediaSubfolder() {
|
||
return this._mediaSubfolder
|
||
}
|
||
_SetFontsSubfolder(folder) {
|
||
this._fontsSubfolder = folder
|
||
}
|
||
GetFontsSubfolder() {
|
||
return this._fontsSubfolder
|
||
}
|
||
_SetIconsSubfolder(folder) {
|
||
this._iconsSubfolder = folder
|
||
}
|
||
GetIconsSubfolder() {
|
||
return this._iconsSubfolder
|
||
}
|
||
_HasLocalUrlBlob(url) {
|
||
return this._localUrlBlobs.has(url.toLowerCase())
|
||
}
|
||
_GetLocalUrlBlob(url) {
|
||
return this._localUrlBlobs.get(url.toLowerCase()) || null
|
||
}
|
||
GetLocalUrlAsBlobUrl(url) {
|
||
const blob = this._GetLocalUrlBlob(url);
|
||
if (!blob)
|
||
return url;
|
||
let ret = this._localBlobUrlCache.get(blob);
|
||
if (!ret) {
|
||
ret = URL.createObjectURL(blob);
|
||
this._localBlobUrlCache.set(blob, ret)
|
||
}
|
||
return ret
|
||
}
|
||
FetchBlob(url, loadPolicy) {
|
||
loadPolicy = loadPolicy || this._defaultLoadPolicy;
|
||
const localBlob = this._GetLocalUrlBlob(url);
|
||
if (localBlob)
|
||
return Promise.resolve(localBlob);
|
||
else if (C3.IsRelativeURL(url)) {
|
||
const lowerUrl = url.toLowerCase();
|
||
if (this._isCordova && this._isFileProtocol)
|
||
return this.CordovaFetchLocalFileAsBlob(lowerUrl);
|
||
else if (loadPolicy === "local")
|
||
return this._promiseThrottle.Add(()=>C3.FetchBlob(lowerUrl));
|
||
else
|
||
return C3.FetchBlob(lowerUrl)
|
||
} else
|
||
return C3.FetchBlob(url)
|
||
}
|
||
FetchArrayBuffer(url) {
|
||
const localBlob = this._GetLocalUrlBlob(url);
|
||
if (localBlob)
|
||
return C3.BlobToArrayBuffer(localBlob);
|
||
else if (C3.IsRelativeURL(url)) {
|
||
const lowerUrl = url.toLowerCase();
|
||
if (this._isCordova && this._isFileProtocol)
|
||
return this.CordovaFetchLocalFileAsArrayBuffer(lowerUrl);
|
||
else if (this._defaultLoadPolicy === "local")
|
||
return this._promiseThrottle.Add(()=>C3.FetchArrayBuffer(lowerUrl));
|
||
else
|
||
return C3.FetchArrayBuffer(lowerUrl)
|
||
} else
|
||
return C3.FetchArrayBuffer(url)
|
||
}
|
||
FetchText(url) {
|
||
const localBlob = this._GetLocalUrlBlob(url);
|
||
if (localBlob)
|
||
return C3.BlobToString(localBlob);
|
||
else if (C3.IsRelativeURL(url)) {
|
||
const lowerUrl = url.toLowerCase();
|
||
if (this._isCordova && this._isFileProtocol)
|
||
return this.CordovaFetchLocalFileAsText(lowerUrl);
|
||
else if (this._defaultLoadPolicy === "local")
|
||
return this._promiseThrottle.Add(()=>C3.FetchText(lowerUrl));
|
||
else
|
||
return C3.FetchText(lowerUrl)
|
||
} else
|
||
return C3.FetchText(url)
|
||
}
|
||
async FetchJson(url) {
|
||
const text = await this.FetchText(url);
|
||
return JSON.parse(text)
|
||
}
|
||
_CordovaFetchLocalFileAs(filename, as_) {
|
||
return this._runtime.PostComponentMessageToDOMAsync("runtime", "cordova-fetch-local-file", {
|
||
"filename": filename,
|
||
"as": as_
|
||
})
|
||
}
|
||
CordovaFetchLocalFileAsText(filename) {
|
||
return this._CordovaFetchLocalFileAs(filename, "text")
|
||
}
|
||
async CordovaFetchLocalFileAsBlob(filename) {
|
||
const buffer = await this._CordovaFetchLocalFileAs(filename, "buffer");
|
||
const type = GetTypeFromFileExtension(filename);
|
||
return new Blob([buffer],{
|
||
"type": type
|
||
})
|
||
}
|
||
async CordovaFetchLocalFileAsBlobURL(filename) {
|
||
filename = filename.toLowerCase();
|
||
let blobUrl = this._localBlobUrlCache.get(filename);
|
||
if (blobUrl)
|
||
return blobUrl;
|
||
const blob = await this.CordovaFetchLocalFileAsBlob(filename);
|
||
blobUrl = URL.createObjectURL(blob);
|
||
this._localBlobUrlCache.set(filename, blobUrl);
|
||
return blobUrl
|
||
}
|
||
CordovaFetchLocalFileAsArrayBuffer(filename) {
|
||
return this._CordovaFetchLocalFileAs(filename, "buffer")
|
||
}
|
||
GetMediaFileUrl(filename) {
|
||
if (this._HasLocalUrlBlob(filename))
|
||
return this.GetLocalUrlAsBlobUrl(filename);
|
||
else
|
||
return this._mediaSubfolder + filename.toLowerCase()
|
||
}
|
||
GetProjectFileUrl(url, subfolder="") {
|
||
if (C3.IsAbsoluteURL(url)) {
|
||
if (subfolder)
|
||
throw new Error("cannot specify subfolder with remote URL");
|
||
return Promise.resolve(url)
|
||
} else if (this._HasLocalUrlBlob(url))
|
||
return Promise.resolve(this.GetLocalUrlAsBlobUrl(url));
|
||
else if (this._isCordova && this._isFileProtocol)
|
||
return this.CordovaFetchLocalFileAsBlobURL(subfolder + url);
|
||
else
|
||
return Promise.resolve(subfolder + url.toLowerCase())
|
||
}
|
||
LoadProjectFileUrl(url) {
|
||
return this.GetProjectFileUrl(url)
|
||
}
|
||
LoadImage(opts) {
|
||
if (opts.loadPolicy && !VALID_LOAD_POLICIES.has(opts.loadPolicy))
|
||
throw new Error("invalid load policy");
|
||
let asset = this._assetsByUrl.get(opts.url);
|
||
if (asset)
|
||
return asset;
|
||
asset = C3.New(C3.ImageAsset, this, {
|
||
url: opts.url,
|
||
size: opts.size || 0,
|
||
loadPolicy: opts.loadPolicy || this._defaultLoadPolicy
|
||
});
|
||
this._allAssets.push(asset);
|
||
this._assetsByUrl.set(asset.GetURL(), asset);
|
||
if (!this._hasFinishedInitialLoad) {
|
||
this._totalAssetSizeToLoad += asset.GetSize();
|
||
this._loadPromises.push(asset.Load().then(()=>this._AddLoadedSize(asset.GetSize())))
|
||
}
|
||
return asset
|
||
}
|
||
async WaitForAllToLoad() {
|
||
try {
|
||
await Promise.all(this._loadPromises);
|
||
this._lastLoadProgress = 1
|
||
} catch (err) {
|
||
console.error("Error loading: ", err);
|
||
this._hasHadErrorLoading = true;
|
||
this._FireLoadingProgressEvent()
|
||
}
|
||
}
|
||
SetInitialLoadFinished() {
|
||
this._hasFinishedInitialLoad = true
|
||
}
|
||
HasHadErrorLoading() {
|
||
return this._hasHadErrorLoading
|
||
}
|
||
_AddLoadedSize(s) {
|
||
this._assetSizeLoaded += s;
|
||
this._loadingRateLimiter.Call()
|
||
}
|
||
_FireLoadingProgressEvent() {
|
||
const event = C3.New(C3.Event, "loadingprogress");
|
||
this._lastLoadProgress = C3.clamp(this._assetSizeLoaded / this._totalAssetSizeToLoad, 0, 1);
|
||
event.progress = this._lastLoadProgress;
|
||
this._runtime.Dispatcher().dispatchEvent(event)
|
||
}
|
||
GetLoadProgress() {
|
||
return this._lastLoadProgress
|
||
}
|
||
_SetWebFonts(arr) {
|
||
C3.shallowAssignArray(this._webFonts, arr);
|
||
if (this._webFonts.length)
|
||
this._loadPromises.push(this._LoadWebFonts())
|
||
}
|
||
_LoadWebFonts() {
|
||
if (typeof FontFace === "undefined")
|
||
return Promise.resolve();
|
||
const promises = [];
|
||
for (const [name,filename,size] of this._webFonts) {
|
||
this._totalAssetSizeToLoad += size;
|
||
promises.push(this._LoadWebFont(name, filename).then(()=>this._AddLoadedSize(size)))
|
||
}
|
||
return Promise.all(promises)
|
||
}
|
||
async _LoadWebFont(name, filename) {
|
||
try {
|
||
const url = await this.GetProjectFileUrl(filename, this._fontsSubfolder);
|
||
const fontFace = new FontFace(name,`url('${url}')`);
|
||
if (this._runtime.IsInWorker())
|
||
self.fonts.add(fontFace);
|
||
else
|
||
document.fonts.add(fontFace);
|
||
await fontFace.load()
|
||
} catch (err) {
|
||
console.warn(`[C3 runtime] Failed to load web font '${name}': `, err)
|
||
}
|
||
}
|
||
IsAudioFormatSupported(type) {
|
||
return !!this._supportedAudioFormats[type]
|
||
}
|
||
_SetAudioFiles(arr, preloadSounds) {
|
||
this._preloadSounds = !!preloadSounds;
|
||
for (const [fileName,projectFilesInfo,isMusic] of arr)
|
||
this._audioFiles.set(fileName, {
|
||
fileName,
|
||
formats: projectFilesInfo.map(si=>({
|
||
type: si[0],
|
||
fileExtension: si[1],
|
||
fullName: fileName + si[1],
|
||
fileSize: si[2]
|
||
})),
|
||
isMusic
|
||
})
|
||
}
|
||
GetPreferredAudioFile(namePart) {
|
||
const info = this._audioFiles.get(namePart.toLowerCase());
|
||
if (!info)
|
||
return null;
|
||
let webMOpusFile = null;
|
||
for (const formatInfo of info.formats) {
|
||
if (!webMOpusFile && formatInfo.type === "audio/webm; codecs=opus")
|
||
webMOpusFile = formatInfo;
|
||
if (this.IsAudioFormatSupported(formatInfo.type))
|
||
return formatInfo
|
||
}
|
||
return webMOpusFile
|
||
}
|
||
GetProjectAudioFileUrl(namePart) {
|
||
const formatInfo = this.GetPreferredAudioFile(namePart);
|
||
if (!formatInfo)
|
||
return null;
|
||
return {
|
||
url: this.GetMediaFileUrl(formatInfo.fullName),
|
||
type: formatInfo.type
|
||
}
|
||
}
|
||
GetAudioToPreload() {
|
||
if (this._preloadSounds) {
|
||
const ret = [];
|
||
for (const info of this._audioFiles.values()) {
|
||
if (info.isMusic)
|
||
continue;
|
||
const formatInfo = this.GetPreferredAudioFile(info.fileName);
|
||
if (!formatInfo)
|
||
continue;
|
||
ret.push({
|
||
originalUrl: info.fileName,
|
||
url: this.GetMediaFileUrl(formatInfo.fullName),
|
||
type: formatInfo.type,
|
||
fileSize: formatInfo.fileSize
|
||
})
|
||
}
|
||
return ret
|
||
} else
|
||
return []
|
||
}
|
||
GetIAssetManager() {
|
||
return this._iAssetManager
|
||
}
|
||
async LoadScripts(...urls) {
|
||
const scriptUrls = await Promise.all(urls.map(url=>this.GetProjectFileUrl(url)));
|
||
if (this._runtime.IsInWorker())
|
||
importScripts(...scriptUrls);
|
||
else
|
||
await Promise.all(scriptUrls.map(url=>AddScript(url)))
|
||
}
|
||
async CompileWebAssembly(url) {
|
||
if (WebAssembly.compileStreaming) {
|
||
const fetchUrl = await this.GetProjectFileUrl(url);
|
||
return await WebAssembly.compileStreaming(fetch(fetchUrl))
|
||
} else {
|
||
const arrayBuffer = await C3.FetchArrayBuffer(url);
|
||
return await WebAssembly.compile(arrayBuffer)
|
||
}
|
||
}
|
||
async LoadStyleSheet(url) {
|
||
const fetchUrl = await this.GetProjectFileUrl(url);
|
||
return await this._runtime.PostComponentMessageToDOMAsync("runtime", "add-stylesheet", {
|
||
"url": fetchUrl
|
||
})
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Asset = class Asset extends C3.DefendedBase {
|
||
constructor(assetManager, opts) {
|
||
super();
|
||
this._assetManager = assetManager;
|
||
this._runtime = assetManager.GetRuntime();
|
||
this._url = opts.url;
|
||
this._size = opts.size;
|
||
this._loadPolicy = opts.loadPolicy;
|
||
this._blob = null;
|
||
this._isLoaded = false;
|
||
this._loadPromise = null
|
||
}
|
||
Release() {
|
||
this._loadPromise = null;
|
||
this._assetManager = null;
|
||
this._runtime = null;
|
||
this._blob = null
|
||
}
|
||
GetURL() {
|
||
return this._url
|
||
}
|
||
GetSize() {
|
||
return this._size
|
||
}
|
||
Load() {
|
||
if (this._loadPolicy === "local" || this._blob) {
|
||
this._isLoaded = true;
|
||
return Promise.resolve()
|
||
}
|
||
if (this._loadPromise)
|
||
return this._loadPromise;
|
||
this._loadPromise = this._assetManager.FetchBlob(this._url, this._loadPolicy).then(blob=>{
|
||
this._isLoaded = true;
|
||
this._loadPromise = null;
|
||
this._blob = blob
|
||
}
|
||
).catch(err=>console.error("Error loading resource: ", err));
|
||
return this._loadPromise
|
||
}
|
||
IsLoaded() {
|
||
return this._isLoaded
|
||
}
|
||
GetBlob() {
|
||
if (this._blob)
|
||
return Promise.resolve(this._blob);
|
||
return this._assetManager.FetchBlob(this._url, this._loadPolicy)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const promiseThrottle = new C3.PromiseThrottle;
|
||
const allImageAssets = new Set;
|
||
C3.ImageAsset = class ImageAsset extends C3.Asset {
|
||
constructor(assetManager, opts) {
|
||
super(assetManager, opts);
|
||
this._texturePromise = null;
|
||
this._webglTexture = null;
|
||
this._refCount = 0;
|
||
this._imageWidth = -1;
|
||
this._imageHeight = -1;
|
||
allImageAssets.add(this)
|
||
}
|
||
Release() {
|
||
this.ReleaseTexture();
|
||
if (this._refCount !== 0)
|
||
throw new Error("released image asset which still has texture references");
|
||
this._texturePromise = null;
|
||
allImageAssets.delete(this);
|
||
super.Release()
|
||
}
|
||
static OnWebGLContextLost() {
|
||
for (const imageAsset of allImageAssets) {
|
||
imageAsset._texturePromise = null;
|
||
imageAsset._webglTexture = null;
|
||
imageAsset._refCount = 0
|
||
}
|
||
}
|
||
LoadStaticTexture(renderer, opts) {
|
||
this._refCount++;
|
||
if (this._webglTexture)
|
||
return Promise.resolve(this._webglTexture);
|
||
if (this._texturePromise)
|
||
return this._texturePromise;
|
||
this._texturePromise = this.GetBlob().then(blob=>promiseThrottle.Add(()=>renderer.CreateStaticTextureAsync(blob, opts).then(texture=>{
|
||
this._texturePromise = null;
|
||
if (this._refCount === 0) {
|
||
renderer.DeleteTexture(texture);
|
||
return null
|
||
}
|
||
this._webglTexture = texture;
|
||
this._imageWidth = texture.GetWidth();
|
||
this._imageHeight = texture.GetHeight();
|
||
return this._webglTexture
|
||
}
|
||
))).catch(err=>{
|
||
console.error("Failed to load texture: ", err);
|
||
throw err;
|
||
}
|
||
);
|
||
return this._texturePromise
|
||
}
|
||
ReleaseTexture() {
|
||
if (this._refCount <= 0)
|
||
throw new Error("texture released too many times");
|
||
this._refCount--;
|
||
if (this._refCount === 0 && this._webglTexture) {
|
||
const renderer = this._webglTexture.GetRenderer();
|
||
renderer.DeleteTexture(this._webglTexture);
|
||
this._webglTexture = null
|
||
}
|
||
}
|
||
GetTexture() {
|
||
return this._webglTexture
|
||
}
|
||
GetWidth() {
|
||
return this._imageWidth
|
||
}
|
||
GetHeight() {
|
||
return this._imageHeight
|
||
}
|
||
async LoadToDrawable() {
|
||
const blob = await this.GetBlob();
|
||
if (C3.Supports.ImageBitmapOptions)
|
||
return await createImageBitmap(blob, {
|
||
"premultiplyAlpha": "none"
|
||
});
|
||
else if (C3.Supports.ImageBitmap)
|
||
return await createImageBitmap(blob);
|
||
else
|
||
return await C3.BlobToImage(blob)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
function SortByInstLastCachedZIndex(a, b) {
|
||
return a.GetWorldInfo()._GetLastCachedZIndex() - b.GetWorldInfo()._GetLastCachedZIndex()
|
||
}
|
||
C3.RenderCell = class RenderCell extends C3.DefendedBase {
|
||
constructor(grid, x, y) {
|
||
super();
|
||
this._grid = grid;
|
||
this._x = x;
|
||
this._y = y;
|
||
this._instances = [];
|
||
this._isSorted = true;
|
||
this._pendingRemoval = new Set;
|
||
this._isAnyPendingRemoval = false
|
||
}
|
||
Release() {
|
||
C3.clearArray(this._instances);
|
||
this._pendingRemoval.clear();
|
||
this._grid = null
|
||
}
|
||
Reset() {
|
||
C3.clearArray(this._instances);
|
||
this._isSorted = true;
|
||
this._pendingRemoval.clear();
|
||
this._isAnyPendingRemoval = false
|
||
}
|
||
SetChanged() {
|
||
this._isSorted = false
|
||
}
|
||
IsEmpty() {
|
||
if (!this._instances.length)
|
||
return true;
|
||
if (this._instances.length > this._pendingRemoval.size)
|
||
return false;
|
||
this._FlushPending();
|
||
return true
|
||
}
|
||
Insert(inst) {
|
||
if (this._pendingRemoval.has(inst)) {
|
||
this._pendingRemoval.delete(inst);
|
||
if (this._pendingRemoval.size === 0)
|
||
this._isAnyPendingRemoval = false;
|
||
return
|
||
}
|
||
this._instances.push(inst);
|
||
this._isSorted = this._instances.length === 1
|
||
}
|
||
Remove(inst) {
|
||
this._pendingRemoval.add(inst);
|
||
this._isAnyPendingRemoval = true;
|
||
if (this._pendingRemoval.size >= 50)
|
||
this._FlushPending()
|
||
}
|
||
_FlushPending() {
|
||
if (!this._isAnyPendingRemoval)
|
||
return;
|
||
if (this._instances.length === this._pendingRemoval.size) {
|
||
this.Reset();
|
||
return
|
||
}
|
||
C3.arrayRemoveAllInSet(this._instances, this._pendingRemoval);
|
||
this._pendingRemoval.clear();
|
||
this._isAnyPendingRemoval = false
|
||
}
|
||
_EnsureSorted() {
|
||
if (this._isSorted)
|
||
return;
|
||
this._instances.sort(SortByInstLastCachedZIndex);
|
||
this._isSorted = true
|
||
}
|
||
Dump(result) {
|
||
this._FlushPending();
|
||
this._EnsureSorted();
|
||
if (this._instances.length)
|
||
result.push(this._instances)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.RenderGrid = class RenderGrid extends C3.DefendedBase {
|
||
constructor(cellWidth, cellHeight) {
|
||
super();
|
||
this._cellWidth = cellWidth;
|
||
this._cellHeight = cellHeight;
|
||
this._cells = C3.New(C3.PairMap)
|
||
}
|
||
Release() {
|
||
this._cells.Release();
|
||
this._cells = null
|
||
}
|
||
GetCell(x, y, createIfMissing) {
|
||
let ret = this._cells.Get(x, y);
|
||
if (ret)
|
||
return ret;
|
||
else if (createIfMissing) {
|
||
ret = C3.New(C3.RenderCell, this, x, y);
|
||
this._cells.Set(x, y, ret);
|
||
return ret
|
||
} else
|
||
return null
|
||
}
|
||
XToCell(x) {
|
||
return Math.floor(x / this._cellWidth)
|
||
}
|
||
YToCell(y) {
|
||
return Math.floor(y / this._cellHeight)
|
||
}
|
||
Update(inst, oldRange, newRange) {
|
||
if (oldRange)
|
||
for (let x = oldRange.getLeft(), lenx = oldRange.getRight(); x <= lenx; ++x)
|
||
for (let y = oldRange.getTop(), leny = oldRange.getBottom(); y <= leny; ++y) {
|
||
if (newRange && newRange.containsPoint(x, y))
|
||
continue;
|
||
const cell = this.GetCell(x, y, false);
|
||
if (!cell)
|
||
continue;
|
||
cell.Remove(inst);
|
||
if (cell.IsEmpty())
|
||
this._cells.Delete(x, y)
|
||
}
|
||
if (newRange)
|
||
for (let x = newRange.getLeft(), lenx = newRange.getRight(); x <= lenx; ++x)
|
||
for (let y = newRange.getTop(), leny = newRange.getBottom(); y <= leny; ++y) {
|
||
if (oldRange && oldRange.containsPoint(x, y))
|
||
continue;
|
||
this.GetCell(x, y, true).Insert(inst)
|
||
}
|
||
}
|
||
QueryRange(rc, result) {
|
||
let x = this.XToCell(rc.getLeft());
|
||
const ystart = this.YToCell(rc.getTop());
|
||
const lenx = this.XToCell(rc.getRight());
|
||
const leny = this.YToCell(rc.getBottom());
|
||
for (; x <= lenx; ++x)
|
||
for (let y = ystart; y <= leny; ++y) {
|
||
const cell = this.GetCell(x, y, false);
|
||
if (!cell)
|
||
continue;
|
||
cell.Dump(result)
|
||
}
|
||
}
|
||
MarkRangeChanged(rc) {
|
||
let x = rc.getLeft();
|
||
const ystart = rc.getTop();
|
||
const lenx = rc.getRight();
|
||
const leny = rc.getBottom();
|
||
for (; x <= lenx; ++x)
|
||
for (let y = ystart; y <= leny; ++y) {
|
||
const cell = this.GetCell(x, y, false);
|
||
if (!cell)
|
||
continue;
|
||
cell.SetChanged()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const tmpRect = new C3.Rect;
|
||
const tmpQuad = new C3.Quad;
|
||
const renderCellArr = [];
|
||
const tmpDestRect = new C3.Rect;
|
||
const tmpSrcRect = new C3.Rect;
|
||
const glMatrix = self.glMatrix;
|
||
const vec3 = glMatrix.vec3;
|
||
const tempVec3 = vec3.fromValues(0, 1, 0);
|
||
function SortByInstLastCachedZIndex(a, b) {
|
||
return a.GetWorldInfo()._GetLastCachedZIndex() - b.GetWorldInfo()._GetLastCachedZIndex()
|
||
}
|
||
function SortByInstZElevation(a, b) {
|
||
return a.GetWorldInfo().GetZElevation() - b.GetWorldInfo().GetZElevation()
|
||
}
|
||
C3.Layer = class Layer extends C3.DefendedBase {
|
||
constructor(layout, index, data) {
|
||
super();
|
||
this._layout = layout;
|
||
this._runtime = layout.GetRuntime();
|
||
this._name = data[0];
|
||
this._index = index;
|
||
this._sid = data[2];
|
||
this._isVisible = !!data[3];
|
||
this._backgroundColor = C3.New(C3.Color);
|
||
this._backgroundColor.setFromJSON(data[4].map(x=>x / 255));
|
||
this._isTransparent = !!data[5];
|
||
this._parallaxX = data[6];
|
||
this._parallaxY = data[7];
|
||
this._color = C3.New(C3.Color, 1, 1, 1, data[8]);
|
||
this._premultipliedColor = C3.New(C3.Color);
|
||
this._isForceOwnTexture = data[9];
|
||
this._useRenderCells = data[10];
|
||
this._scaleRate = data[11];
|
||
this._blendMode = data[12];
|
||
this._curRenderTarget = null;
|
||
this._scale = 1;
|
||
this._zElevation = data[16];
|
||
this._angle = 0;
|
||
this._isAngleEnabled = true;
|
||
this._viewport = C3.New(C3.Rect);
|
||
this._viewportZ0 = C3.New(C3.Rect);
|
||
this._startupInitialInstances = [];
|
||
this._initialInstances = [];
|
||
this._createdGlobalUids = [];
|
||
this._instances = [];
|
||
this._zIndicesUpToDate = false;
|
||
this._anyInstanceZElevated = false;
|
||
this._effectList = C3.New(C3.EffectList, this, data[15]);
|
||
this._renderGrid = null;
|
||
this._lastRenderList = [];
|
||
this._isRenderListUpToDate = false;
|
||
this._lastRenderCells = C3.New(C3.Rect, 0, 0, -1, -1);
|
||
this._curRenderCells = C3.New(C3.Rect, 0, 0, -1, -1);
|
||
this._iLayer = new self.ILayer(this);
|
||
this._UpdatePremultipliedColor();
|
||
if (this._useRenderCells)
|
||
this._renderGrid = C3.New(C3.RenderGrid, this._runtime.GetOriginalViewportWidth(), this._runtime.GetOriginalViewportHeight());
|
||
for (const instData of data[14]) {
|
||
const objectClass = this._runtime.GetObjectClassByIndex(instData[1]);
|
||
this._layout._AddInitialObjectClass(objectClass);
|
||
if (!objectClass.GetDefaultInstanceData()) {
|
||
objectClass.SetDefaultInstanceData(instData);
|
||
objectClass._SetDefaultLayerIndex(this._index)
|
||
}
|
||
this._initialInstances.push(instData)
|
||
}
|
||
C3.shallowAssignArray(this._startupInitialInstances, this._initialInstances)
|
||
}
|
||
static Create(layout, index, data) {
|
||
return C3.New(C3.Layer, layout, index, data)
|
||
}
|
||
Release() {
|
||
this._layout = null;
|
||
this._runtime = null
|
||
}
|
||
CreateInitialInstances(createdInstances) {
|
||
const isFirstVisit = this._layout.IsFirstVisit();
|
||
let k = 0;
|
||
const initialInstances = this._initialInstances;
|
||
for (let i = 0, len = initialInstances.length; i < len; ++i) {
|
||
const instData = initialInstances[i];
|
||
const objectClass = this._runtime.GetObjectClassByIndex(instData[1]);
|
||
let keep = true;
|
||
if (!objectClass.HasPersistBehavior() || isFirstVisit) {
|
||
const inst = this._runtime.CreateInstanceFromData(instData, this, true);
|
||
createdInstances.push(inst);
|
||
if (objectClass.IsGlobal()) {
|
||
keep = false;
|
||
this._createdGlobalUids.push(inst.GetUID())
|
||
}
|
||
}
|
||
if (keep) {
|
||
initialInstances[k] = initialInstances[i];
|
||
++k
|
||
}
|
||
}
|
||
C3.truncateArray(initialInstances, k);
|
||
this._runtime.FlushPendingInstances();
|
||
this.SetZIndicesChanged()
|
||
}
|
||
_AddInstance(inst, addToGrid) {
|
||
const wi = inst.GetWorldInfo();
|
||
if (wi.GetLayer() !== this)
|
||
throw new Error("instance added to wrong layer");
|
||
this._instances.push(inst);
|
||
if (wi.GetZElevation() !== 0)
|
||
this._anyInstanceZElevated = true;
|
||
if (addToGrid && this._useRenderCells)
|
||
inst.GetWorldInfo().SetBboxChanged();
|
||
this.SetZIndicesChanged()
|
||
}
|
||
_MaybeAddInstance(inst) {
|
||
if (this._instances.includes(inst))
|
||
return;
|
||
this._instances.push(inst);
|
||
if (inst.GetWorldInfo().GetZElevation() !== 0)
|
||
this._anyInstanceZElevated = true;
|
||
this.SetZIndicesChanged()
|
||
}
|
||
_PrependInstance(inst, addToGrid) {
|
||
const wi = inst.GetWorldInfo();
|
||
if (wi.GetLayer() !== this)
|
||
throw new Error("instance added to wrong layer");
|
||
this._instances.unshift(inst);
|
||
if (wi.GetZElevation() !== 0)
|
||
this._anyInstanceZElevated = true;
|
||
this.SetZIndicesChanged();
|
||
if (addToGrid && this._useRenderCells)
|
||
inst.GetWorldInfo().SetBboxChanged()
|
||
}
|
||
_RemoveInstance(inst, removeFromGrid) {
|
||
const index = this._instances.indexOf(inst);
|
||
if (index < 0)
|
||
return;
|
||
if (removeFromGrid && this._useRenderCells)
|
||
inst.GetWorldInfo()._RemoveFromRenderCells();
|
||
this._instances.splice(index, 1);
|
||
this.SetZIndicesChanged();
|
||
this._MaybeResetAnyInstanceZElevatedFlag()
|
||
}
|
||
_SetAnyInstanceZElevated() {
|
||
this._anyInstanceZElevated = true
|
||
}
|
||
_MaybeResetAnyInstanceZElevatedFlag() {
|
||
if (this._instances.length === 0)
|
||
this._anyInstanceZElevated = false
|
||
}
|
||
_SortInstancesByLastCachedZIndex(isPersistMode) {
|
||
if (isPersistMode) {
|
||
const assignedZIndices = new Set;
|
||
for (const inst of this._instances) {
|
||
const cachedZIndex = inst.GetWorldInfo()._GetLastCachedZIndex();
|
||
if (cachedZIndex >= 0)
|
||
assignedZIndices.add(cachedZIndex)
|
||
}
|
||
let index = -1;
|
||
for (const inst of this._instances) {
|
||
const wi = inst.GetWorldInfo();
|
||
if (wi._GetLastCachedZIndex() >= 0)
|
||
continue;
|
||
++index;
|
||
while (assignedZIndices.has(index))
|
||
++index;
|
||
wi._SetZIndex(index)
|
||
}
|
||
}
|
||
this._instances.sort(SortByInstLastCachedZIndex)
|
||
}
|
||
_Start() {}
|
||
_End() {
|
||
for (const inst of this._instances)
|
||
if (!inst.GetObjectClass().IsGlobal())
|
||
this._runtime.DestroyInstance(inst);
|
||
this._runtime.FlushPendingInstances();
|
||
C3.clearArray(this._instances);
|
||
this._anyInstanceZElevated = false;
|
||
this.SetZIndicesChanged()
|
||
}
|
||
RecreateInitialObjects(objectClass, rc, offsetX, offsetY) {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
const allObjectClasses = this._runtime.GetAllObjectClasses();
|
||
const isFamily = objectClass.IsFamily();
|
||
const ret = [];
|
||
for (const instData of this._initialInstances) {
|
||
const worldData = instData[0];
|
||
const x = worldData[0];
|
||
const y = worldData[1];
|
||
if (!rc.containsPoint(x, y))
|
||
continue;
|
||
const objectType = allObjectClasses[instData[1]];
|
||
if (objectType !== objectClass)
|
||
if (isFamily) {
|
||
if (!objectClass.FamilyHasMember(objectType))
|
||
continue
|
||
} else
|
||
continue;
|
||
let createOnLayer = this;
|
||
const runningLayout = this._runtime.GetCurrentLayout();
|
||
if (this.GetLayout() !== runningLayout) {
|
||
createOnLayer = runningLayout.GetLayerByName(this.GetName());
|
||
if (!createOnLayer)
|
||
createOnLayer = runningLayout.GetLayerByIndex(this.GetIndex())
|
||
}
|
||
const inst = this._runtime.CreateInstanceFromData(instData, createOnLayer, false);
|
||
const wi = inst.GetWorldInfo();
|
||
wi.OffsetXY(offsetX, offsetY);
|
||
wi.SetBboxChanged();
|
||
eventSheetManager.BlockFlushingInstances(true);
|
||
inst._TriggerOnCreated();
|
||
if (inst.IsInContainer())
|
||
for (const s of inst.siblings())
|
||
s._TriggerOnCreated();
|
||
eventSheetManager.BlockFlushingInstances(false);
|
||
ret.push(inst)
|
||
}
|
||
return ret
|
||
}
|
||
GetInstanceCount() {
|
||
return this._instances.length
|
||
}
|
||
GetLayout() {
|
||
return this._layout
|
||
}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
GetIndex() {
|
||
return this._index
|
||
}
|
||
GetSID() {
|
||
return this._sid
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetDevicePixelRatio() {
|
||
return this._runtime.GetDevicePixelRatio()
|
||
}
|
||
GetEffectList() {
|
||
return this._effectList
|
||
}
|
||
UsesRenderCells() {
|
||
return this._useRenderCells
|
||
}
|
||
GetRenderGrid() {
|
||
return this._renderGrid
|
||
}
|
||
SetRenderListStale() {
|
||
this._isRenderListUpToDate = false
|
||
}
|
||
IsVisible() {
|
||
return this._isVisible
|
||
}
|
||
SetVisible(v) {
|
||
v = !!v;
|
||
if (this._isVisible === v)
|
||
return;
|
||
this._isVisible = v;
|
||
this._runtime.UpdateRender()
|
||
}
|
||
GetViewport() {
|
||
return this._viewport
|
||
}
|
||
GetViewportForZ(z, outRect) {
|
||
const viewportZ0 = this._viewportZ0;
|
||
if (z === 0)
|
||
outRect.copy(viewportZ0);
|
||
else {
|
||
const scaleFactor = this.Get2DScaleFactorToZ(z);
|
||
const midX = viewportZ0.midX();
|
||
const midY = viewportZ0.midY();
|
||
const halfW = .5 * viewportZ0.width() / scaleFactor;
|
||
const halfH = .5 * viewportZ0.height() / scaleFactor;
|
||
outRect.set(midX - halfW, midY - halfH, midX + halfW, midY + halfH)
|
||
}
|
||
}
|
||
GetOpacity() {
|
||
return this._color.getA()
|
||
}
|
||
SetOpacity(o) {
|
||
o = C3.clamp(o, 0, 1);
|
||
if (this._color.getA() === o)
|
||
return;
|
||
this._color.setA(o);
|
||
this._UpdatePremultipliedColor();
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_UpdatePremultipliedColor() {
|
||
this._premultipliedColor.copy(this._color);
|
||
this._premultipliedColor.premultiply()
|
||
}
|
||
GetPremultipliedColor() {
|
||
return this._premultipliedColor
|
||
}
|
||
HasDefaultColor() {
|
||
return this._color.equalsRgba(1, 1, 1, 1)
|
||
}
|
||
GetScaleRate() {
|
||
return this._scaleRate
|
||
}
|
||
SetScaleRate(r) {
|
||
if (this._scaleRate === r)
|
||
return;
|
||
this._scaleRate = r;
|
||
this._runtime.UpdateRender()
|
||
}
|
||
GetParallaxX() {
|
||
return this._parallaxX
|
||
}
|
||
GetParallaxY() {
|
||
return this._parallaxY
|
||
}
|
||
SetParallax(px, py) {
|
||
if (this._parallaxX === px && this._parallaxY === py)
|
||
return;
|
||
this._parallaxX = px;
|
||
this._parallaxY = py;
|
||
this._runtime.UpdateRender();
|
||
if (this._parallaxX !== 1 || this._parallaxY !== 1)
|
||
for (const inst of this._instances)
|
||
inst.GetObjectClass()._SetAnyInstanceParallaxed(true)
|
||
}
|
||
SetParallaxX(px) {
|
||
this.SetParallax(px, this.GetParallaxY())
|
||
}
|
||
SetParallaxY(py) {
|
||
this.SetParallax(this.GetParallaxX(), py)
|
||
}
|
||
SetZElevation(z) {
|
||
z = +z;
|
||
if (this._zElevation === z)
|
||
return;
|
||
this._zElevation = z;
|
||
this._runtime.UpdateRender()
|
||
}
|
||
GetZElevation() {
|
||
return this._zElevation
|
||
}
|
||
SetAngle(a) {
|
||
this._angle = C3.clampAngle(a)
|
||
}
|
||
GetAngle() {
|
||
if (this._isAngleEnabled)
|
||
return C3.clampAngle(this._layout.GetAngle() + this._angle);
|
||
else
|
||
return 0
|
||
}
|
||
GetOwnAngle() {
|
||
return this._angle
|
||
}
|
||
HasInstances() {
|
||
return this._instances.length > 0
|
||
}
|
||
_GetInstances() {
|
||
return this._instances
|
||
}
|
||
GetBackgroundColor() {
|
||
return this._backgroundColor
|
||
}
|
||
IsTransparent() {
|
||
return this._isTransparent
|
||
}
|
||
SetTransparent(t) {
|
||
this._isTransparent = !!t
|
||
}
|
||
IsForceOwnTexture() {
|
||
return this._isForceOwnTexture
|
||
}
|
||
SetForceOwnTexture(f) {
|
||
this._isForceOwnTexture = !!f
|
||
}
|
||
SetBlendMode(bm) {
|
||
if (this._blendMode === bm)
|
||
return;
|
||
this._blendMode = bm;
|
||
this._runtime.UpdateRender()
|
||
}
|
||
GetBlendMode() {
|
||
return this._blendMode
|
||
}
|
||
IsTransformCompatibleWith(otherLayer) {
|
||
return this === otherLayer || this._parallaxX === otherLayer._parallaxX && this._parallaxY === otherLayer._parallaxY && this._scale === otherLayer._scale && this._scaleRate === otherLayer._scaleRate && this._angle === otherLayer._angle
|
||
}
|
||
_RemoveAllInstancesInSet(s) {
|
||
if (s.size === 0)
|
||
return;
|
||
const numRemoved = C3.arrayRemoveAllInSet(this._instances, s);
|
||
if (numRemoved > 0) {
|
||
this._MaybeResetAnyInstanceZElevatedFlag();
|
||
this.SetZIndicesChanged()
|
||
}
|
||
}
|
||
SetZIndicesChanged() {
|
||
this._zIndicesUpToDate = false;
|
||
this._isRenderListUpToDate = false
|
||
}
|
||
_UpdateZIndices() {
|
||
if (this._zIndicesUpToDate)
|
||
return;
|
||
this._instances.sort(SortByInstZElevation);
|
||
if (this._useRenderCells)
|
||
for (let i = 0, len = this._instances.length; i < len; ++i) {
|
||
const wi = this._instances[i].GetWorldInfo();
|
||
wi._SetZIndex(i);
|
||
this._renderGrid.MarkRangeChanged(wi.GetRenderCellRange())
|
||
}
|
||
else
|
||
for (let i = 0, len = this._instances.length; i < len; ++i)
|
||
this._instances[i].GetWorldInfo()._SetZIndex(i);
|
||
this._zIndicesUpToDate = true
|
||
}
|
||
MoveInstanceAdjacent(inst, other, isAfter) {
|
||
const instWi = inst.GetWorldInfo();
|
||
const otherWi = other.GetWorldInfo();
|
||
if (instWi.GetLayer() !== this || otherWi.GetLayer() !== this)
|
||
throw new Error("can't arrange Z order unless both objects on this layer");
|
||
const myZ = instWi.GetZIndex();
|
||
let insertZ = otherWi.GetZIndex();
|
||
if (myZ === insertZ + (isAfter ? 1 : -1))
|
||
return false;
|
||
C3.arrayRemove(this._instances, myZ);
|
||
if (myZ < insertZ)
|
||
insertZ--;
|
||
if (isAfter)
|
||
insertZ++;
|
||
if (insertZ === this._instances.length)
|
||
this._instances.push(inst);
|
||
else
|
||
this._instances.splice(insertZ, 0, inst);
|
||
this.SetZIndicesChanged();
|
||
return true
|
||
}
|
||
_MergeSortedZArrays(a, b) {
|
||
const ret = [];
|
||
let i = 0
|
||
, j = 0
|
||
, lena = a.length
|
||
, lenb = b.length;
|
||
while (i < lena && j < lenb) {
|
||
const ai = a[i];
|
||
const bj = b[j];
|
||
if (ai.GetWorldInfo()._GetLastCachedZIndex() < bj.GetWorldInfo()._GetLastCachedZIndex()) {
|
||
ret.push(ai);
|
||
++i
|
||
} else {
|
||
ret.push(bj);
|
||
++j
|
||
}
|
||
}
|
||
for (; i < lena; ++i)
|
||
ret.push(a[i]);
|
||
for (; j < lenb; ++j)
|
||
ret.push(b[j]);
|
||
return ret
|
||
}
|
||
_MergeAllSortedZArrays_pass(arr) {
|
||
const ret = [];
|
||
const len = arr.length;
|
||
for (let i = 0; i < len - 1; i += 2) {
|
||
const arr1 = arr[i];
|
||
const arr2 = arr[i + 1];
|
||
ret.push(this._MergeSortedZArrays(arr1, arr2))
|
||
}
|
||
if (len % 2 === 1)
|
||
ret.push(arr[len - 1]);
|
||
return ret
|
||
}
|
||
_MergeAllSortedZArrays(arr) {
|
||
while (arr.length > 1)
|
||
arr = this._MergeAllSortedZArrays_pass(arr);
|
||
return arr[0]
|
||
}
|
||
_GetRenderCellInstancesToDraw() {
|
||
this._UpdateZIndices();
|
||
C3.clearArray(renderCellArr);
|
||
this._renderGrid.QueryRange(this._viewport, renderCellArr);
|
||
if (!renderCellArr.length)
|
||
return [];
|
||
if (renderCellArr.length === 1)
|
||
return renderCellArr[0];
|
||
return this._MergeAllSortedZArrays(renderCellArr)
|
||
}
|
||
_IsOpaque() {
|
||
return !this.UsesOwnTexture() && !this.IsTransparent()
|
||
}
|
||
ShouldDraw() {
|
||
return this.IsVisible() && this.GetOpacity() > 0 && (this.HasInstances() || !this.IsTransparent())
|
||
}
|
||
UsesOwnTexture() {
|
||
return this.IsForceOwnTexture() || !this.HasDefaultColor() || this.GetBlendMode() !== 0 || this._effectList.HasAnyActiveEffect()
|
||
}
|
||
GetRenderTarget() {
|
||
return this._curRenderTarget
|
||
}
|
||
_CanFastPathDrawLayer(activeEffectTypes) {
|
||
if (activeEffectTypes.length === 0)
|
||
return true;
|
||
if (activeEffectTypes.length >= 2)
|
||
return false;
|
||
const effectType = activeEffectTypes[0];
|
||
const shaderProgram = effectType.GetShaderProgram();
|
||
return !shaderProgram.MustPreDraw() && !shaderProgram.UsesDest() && !shaderProgram.UsesCrossSampling() && this.HasDefaultColor()
|
||
}
|
||
Get2DScaleFactorToZ(z) {
|
||
const camZ = this.GetCameraZ();
|
||
return camZ / (camZ - z)
|
||
}
|
||
GetCameraZ() {
|
||
return 100 / this.GetNormalScale()
|
||
}
|
||
_SetTransform(renderer, offX=0, offY=0) {
|
||
const renderScale = this._runtime.GetRenderScale();
|
||
const camX = (this._viewport.midX() + offX) * renderScale;
|
||
const camY = (this._viewport.midY() + offY) * renderScale;
|
||
const camZ = this.GetCameraZ();
|
||
renderer.SetCameraXYZ(camX, camY, camZ);
|
||
renderer.SetLookXYZ(camX, camY, camZ - 100);
|
||
const a = this.GetAngle();
|
||
const upVector = tempVec3;
|
||
if (a === 0)
|
||
vec3.set(upVector, 0, 1, 0);
|
||
else
|
||
vec3.set(upVector, Math.sin(a), Math.cos(a), 0);
|
||
renderer.ResetModelView(upVector);
|
||
renderer.Scale(renderScale, renderScale);
|
||
renderer.UpdateModelView()
|
||
}
|
||
Draw(renderer, destinationRenderTarget, isFirstDrawnLayer) {
|
||
const canvasManager = this._runtime.GetCanvasManager();
|
||
const useOwnTexture = this.UsesOwnTexture();
|
||
let ownRenderTarget = null;
|
||
let layerQuery = null;
|
||
if (this._runtime.IsGPUProfiling() && renderer.SupportsGPUProfiling()) {
|
||
const timingsBuffer = canvasManager.GetLayerTimingsBuffer(this);
|
||
if (timingsBuffer) {
|
||
layerQuery = timingsBuffer.AddTimeElapsedQuery();
|
||
renderer.StartQuery(layerQuery)
|
||
}
|
||
}
|
||
if (useOwnTexture) {
|
||
const rtOpts = {
|
||
sampling: this._runtime.GetSampling()
|
||
};
|
||
if (canvasManager.GetCurrentFullscreenScalingQuality() === "low") {
|
||
rtOpts.width = canvasManager.GetDrawWidth();
|
||
rtOpts.height = canvasManager.GetDrawHeight()
|
||
}
|
||
ownRenderTarget = this._runtime.GetAdditionalRenderTarget(rtOpts);
|
||
renderer.SetRenderTarget(ownRenderTarget);
|
||
if (this.IsTransparent())
|
||
renderer.ClearRgba(0, 0, 0, 0)
|
||
} else
|
||
renderer.SetRenderTarget(destinationRenderTarget);
|
||
if (!this.IsTransparent())
|
||
renderer.Clear(this._backgroundColor);
|
||
this._curRenderTarget = ownRenderTarget || destinationRenderTarget;
|
||
this._SetTransform(renderer);
|
||
renderer.SetBaseZ(this.GetZElevation());
|
||
if (this.GetNormalScale() > Number.EPSILON) {
|
||
this._UpdateZIndices();
|
||
const useRenderCells = this._useRenderCells && this.GetZElevation() === 0 && !this._anyInstanceZElevated;
|
||
if (useRenderCells)
|
||
this._DrawInstances_RenderCells(renderer);
|
||
else
|
||
this._DrawInstances(renderer, this._instances)
|
||
}
|
||
renderer.SetBaseZ(0);
|
||
renderer.SetCurrentZ(0);
|
||
renderer.SetCameraXYZ(0, 0, 100);
|
||
renderer.SetLookXYZ(0, 0, 0);
|
||
if (useOwnTexture)
|
||
this._DrawLayerOwnTextureToRenderTarget(renderer, ownRenderTarget, destinationRenderTarget, isFirstDrawnLayer);
|
||
if (layerQuery)
|
||
renderer.EndQuery(layerQuery);
|
||
this._curRenderTarget = null
|
||
}
|
||
_DrawInstances(renderer, instances) {
|
||
const viewport = this._viewport;
|
||
const renderTarget = this._curRenderTarget;
|
||
let lastInst = null;
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
if (inst === lastInst)
|
||
continue;
|
||
lastInst = inst;
|
||
const wi = inst.GetWorldInfo();
|
||
if (wi.IsVisible() && wi.IsInViewport(viewport))
|
||
if (wi.HasAnyActiveEffect())
|
||
this._DrawInstanceWithEffectsAndRestore(inst, wi, renderer, renderTarget);
|
||
else
|
||
this._DrawInstance(inst, wi, renderer)
|
||
}
|
||
}
|
||
_DrawInstances_RenderCells(renderer) {
|
||
const renderGrid = this._renderGrid;
|
||
const curRenderCells = this._curRenderCells;
|
||
const lastRenderCells = this._lastRenderCells;
|
||
const viewport = this._viewport;
|
||
let instancesToDraw;
|
||
curRenderCells.set(renderGrid.XToCell(viewport.getLeft()), renderGrid.YToCell(viewport.getTop()), renderGrid.XToCell(viewport.getRight()), renderGrid.YToCell(viewport.getBottom()));
|
||
if (!this._isRenderListUpToDate || !curRenderCells.equals(lastRenderCells)) {
|
||
instancesToDraw = this._GetRenderCellInstancesToDraw();
|
||
this._isRenderListUpToDate = true;
|
||
lastRenderCells.copy(curRenderCells)
|
||
} else
|
||
instancesToDraw = this._lastRenderList;
|
||
this._DrawInstances(renderer, instancesToDraw);
|
||
if (instancesToDraw !== this._lastRenderList)
|
||
C3.shallowAssignArray(this._lastRenderList, instancesToDraw)
|
||
}
|
||
_DrawInstance(inst, wi, renderer) {
|
||
const wiStateGroup = wi.GetRendererStateGroup();
|
||
if (renderer.GetCurrentStateGroup() !== wiStateGroup)
|
||
wiStateGroup.Apply();
|
||
inst.Draw(renderer)
|
||
}
|
||
_DrawInstanceWithEffectsAndRestore(inst, wi, renderer, renderTarget) {
|
||
if (this._DrawInstanceWithEffects(inst, wi, renderer, renderTarget, null))
|
||
this._SetTransform(renderer)
|
||
}
|
||
_DrawInstanceWithEffects(inst, wi, renderer, renderTarget, opts) {
|
||
const activeEffectTypes = wi.GetInstanceEffectList().GetActiveEffectTypes();
|
||
if (activeEffectTypes.length === 1) {
|
||
const effectType = activeEffectTypes[0];
|
||
const shaderProgram = effectType.GetShaderProgram();
|
||
if (!shaderProgram.NeedsPostDrawOrExtendsBox() && wi.HasDefaultColor() && !inst.MustPreDraw()) {
|
||
this._DrawInstanceWithEffects_FastPath(inst, wi, effectType, shaderProgram, renderer);
|
||
return false
|
||
}
|
||
}
|
||
const ret = C3.RenderEffectChain(renderer, this._runtime, inst, renderTarget, activeEffectTypes, opts);
|
||
renderer.SetBaseZ(this.GetZElevation());
|
||
return ret
|
||
}
|
||
_DrawInstanceWithEffects_FastPath(inst, wi, effectType, shaderProgram, renderer) {
|
||
renderer.SetProgram(shaderProgram);
|
||
renderer.SetBlendMode(wi.GetBlendMode());
|
||
if (shaderProgram.IsAnimated())
|
||
this._runtime.UpdateRender();
|
||
let pixelWidth = 0
|
||
, pixelHeight = 0;
|
||
if (shaderProgram.UsesAnySrcRectOrPixelSize()) {
|
||
const [sheetWidth,sheetHeight] = inst.GetCurrentSurfaceSize();
|
||
pixelWidth = 1 / sheetWidth;
|
||
pixelHeight = 1 / sheetHeight;
|
||
const instTexRect = inst.GetCurrentTexRect();
|
||
if (instTexRect)
|
||
tmpSrcRect.copy(instTexRect);
|
||
else
|
||
tmpSrcRect.set(0, 0, 0, 0)
|
||
}
|
||
const paramArr = wi.GetInstanceEffectList().GetEffectParametersForIndex(effectType.GetIndex());
|
||
renderer.SetCurrentZ(wi.GetZElevation());
|
||
renderer.SetProgramParameters(null, tmpDestRect, tmpSrcRect, tmpSrcRect, wi.GetBoundingBox(), pixelWidth, pixelHeight, this.GetOwnScale(), this.GetAngle(), this._runtime.GetGameTime(), paramArr);
|
||
inst.Draw(renderer)
|
||
}
|
||
_DrawLayerOwnTextureToRenderTarget(renderer, ownRenderTarget, destinationRenderTarget, isFirstDrawnLayer) {
|
||
const activeEffectTypes = this._effectList.GetActiveEffectTypes();
|
||
const runtime = this._runtime;
|
||
if (this._CanFastPathDrawLayer(activeEffectTypes)) {
|
||
renderer.SetRenderTarget(destinationRenderTarget);
|
||
if (activeEffectTypes.length === 1) {
|
||
const effectType = activeEffectTypes[0];
|
||
const shaderProgram = effectType.GetShaderProgram();
|
||
renderer.SetProgram(shaderProgram);
|
||
tmpSrcRect.set(0, 0, 1, 1);
|
||
const paramArr = this._effectList.GetEffectParametersForIndex(effectType.GetIndex());
|
||
renderer.SetProgramParameters(null, tmpDestRect, tmpSrcRect, tmpSrcRect, this._viewport, 1 / runtime.GetDrawWidth(), 1 / runtime.GetDrawHeight(), this.GetNormalScale(), this.GetAngle(), runtime.GetGameTime(), paramArr);
|
||
if (shaderProgram.IsAnimated())
|
||
runtime.UpdateRender()
|
||
} else
|
||
renderer.SetTextureFillMode();
|
||
if (isFirstDrawnLayer && this._blendMode === 0 && this.HasDefaultColor() && activeEffectTypes.length === 0)
|
||
renderer.CopyRenderTarget(ownRenderTarget);
|
||
else {
|
||
renderer.SetBlendMode(this._blendMode);
|
||
renderer.SetColor(this._premultipliedColor);
|
||
renderer.DrawRenderTarget(ownRenderTarget)
|
||
}
|
||
renderer.InvalidateRenderTarget(ownRenderTarget);
|
||
runtime.ReleaseAdditionalRenderTarget(ownRenderTarget)
|
||
} else
|
||
C3.RenderEffectChain(renderer, runtime, this, destinationRenderTarget, activeEffectTypes)
|
||
}
|
||
GetOwnScale() {
|
||
return this._scale
|
||
}
|
||
SetOwnScale(s) {
|
||
if (this._scale === s)
|
||
return;
|
||
this._scale = s;
|
||
this._layout.BoundScrolling();
|
||
this._runtime.UpdateRender()
|
||
}
|
||
GetRenderScale() {
|
||
return this.GetNormalScale() * this._runtime.GetRenderScale()
|
||
}
|
||
GetDisplayScale() {
|
||
return this.GetNormalScale() * this._runtime.GetDisplayScale()
|
||
}
|
||
GetNormalScale() {
|
||
return (this._scale * this._layout.GetScale() - 1) * this._scaleRate + 1
|
||
}
|
||
UpdateViewport() {
|
||
this._isAngleEnabled = false;
|
||
let[px,py] = this.CanvasCssToLayer(0, 0);
|
||
this._isAngleEnabled = true;
|
||
if (this._runtime.IsPixelRoundingEnabled()) {
|
||
px = Math.round(px);
|
||
py = Math.round(py)
|
||
}
|
||
const invScale = 1 / this.GetNormalScale();
|
||
const viewportZ0 = this._viewportZ0;
|
||
viewportZ0.set(px, py, px + this._runtime.GetViewportWidth() * invScale, py + this._runtime.GetViewportHeight() * invScale);
|
||
const myAngle = this.GetAngle();
|
||
if (myAngle !== 0) {
|
||
tmpRect.copy(viewportZ0);
|
||
tmpRect.offset(-viewportZ0.midX(), -viewportZ0.midY());
|
||
tmpQuad.setFromRotatedRect(tmpRect, myAngle);
|
||
tmpQuad.getBoundingBox(tmpRect);
|
||
tmpRect.offset(viewportZ0.midX(), viewportZ0.midY());
|
||
viewportZ0.copy(tmpRect)
|
||
}
|
||
this.GetViewportForZ(this._zElevation, this._viewport)
|
||
}
|
||
CanvasCssToLayer(ptx, pty, z=0) {
|
||
return this._CanvasToLayer(ptx, pty, z, this.GetDisplayScale())
|
||
}
|
||
DrawSurfaceToLayer(ptx, pty, z=0) {
|
||
return this._CanvasToLayer(ptx, pty, z, this.GetRenderScale() * this.GetDevicePixelRatio())
|
||
}
|
||
_CanvasToLayer(canvasX, canvasY, zElevation, displayScale) {
|
||
const parallaxOriginX = this._runtime.GetParallaxXOrigin();
|
||
const parallaxOriginY = this._runtime.GetParallaxYOrigin();
|
||
const scrollOriginX = (this._layout.GetScrollX() - parallaxOriginX) * this._parallaxX + parallaxOriginX;
|
||
const scrollOriginY = (this._layout.GetScrollY() - parallaxOriginY) * this._parallaxY + parallaxOriginY;
|
||
const normalScale = this.GetNormalScale();
|
||
const scaledViewportWidth = this._runtime.GetViewportWidth() / normalScale;
|
||
const scaledViewportHeight = this._runtime.GetViewportHeight() / normalScale;
|
||
const viewportOriginX = scrollOriginX - scaledViewportWidth / 2;
|
||
const viewportOriginY = scrollOriginY - scaledViewportHeight / 2;
|
||
let layerX = viewportOriginX + canvasX / displayScale;
|
||
let layerY = viewportOriginY + canvasY / displayScale;
|
||
const a = this.GetAngle();
|
||
if (a !== 0) {
|
||
layerX -= scrollOriginX;
|
||
layerY -= scrollOriginY;
|
||
const cosa = Math.cos(a);
|
||
const sina = Math.sin(a);
|
||
const x_temp = layerX * cosa - layerY * sina;
|
||
layerY = layerY * cosa + layerX * sina;
|
||
layerX = x_temp;
|
||
layerX += scrollOriginX;
|
||
layerY += scrollOriginY
|
||
}
|
||
if (zElevation !== 0) {
|
||
const midX = this._viewportZ0.midX();
|
||
const midY = this._viewportZ0.midY();
|
||
const scaleFactor = this.Get2DScaleFactorToZ(zElevation);
|
||
layerX = (layerX - midX) / scaleFactor + midX;
|
||
layerY = (layerY - midY) / scaleFactor + midY
|
||
}
|
||
return [layerX, layerY]
|
||
}
|
||
CanvasCssToLayer_DefaultTransform(ptx, pty) {
|
||
const scale = this._scale;
|
||
const scaleRate = this._scaleRate;
|
||
const parallaxX = this._parallaxX;
|
||
const parallaxY = this._parallaxY;
|
||
const angle = this._angle;
|
||
this._scale = 1;
|
||
this._scaleRate = 1;
|
||
this._parallaxX = 1;
|
||
this._parallaxY = 1;
|
||
this._angle = 0;
|
||
const ret = this.CanvasCssToLayer(ptx, pty);
|
||
this._scale = scale;
|
||
this._scaleRate = scaleRate;
|
||
this._parallaxX = parallaxX;
|
||
this._parallaxY = parallaxY;
|
||
this._angle = angle;
|
||
return ret
|
||
}
|
||
LayerToCanvasCss(ptx, pty, z=0) {
|
||
return this._LayerToCanvas(ptx, pty, z, this.GetDisplayScale())
|
||
}
|
||
LayerToDrawSurface(ptx, pty, z=0) {
|
||
return this._LayerToCanvas(ptx, pty, z, this.GetRenderScale() * this.GetDevicePixelRatio())
|
||
}
|
||
_LayerToCanvas(layerX, layerY, zElevation, displayScale) {
|
||
const runtime = this._runtime;
|
||
const layout = this._layout;
|
||
if (zElevation !== 0) {
|
||
const midX = this._viewportZ0.midX();
|
||
const midY = this._viewportZ0.midY();
|
||
const scaleFactor = this.Get2DScaleFactorToZ(zElevation);
|
||
layerX = (layerX - midX) * scaleFactor + midX;
|
||
layerY = (layerY - midY) * scaleFactor + midY
|
||
}
|
||
const parallaxOriginX = runtime.GetParallaxXOrigin();
|
||
const parallaxOriginY = runtime.GetParallaxYOrigin();
|
||
const scrollOriginX = (layout.GetScrollX() - parallaxOriginX) * this._parallaxX + parallaxOriginX;
|
||
const scrollOriginY = (layout.GetScrollY() - parallaxOriginY) * this._parallaxY + parallaxOriginY;
|
||
const a = this.GetAngle();
|
||
if (a !== 0) {
|
||
layerX -= scrollOriginX;
|
||
layerY -= scrollOriginY;
|
||
const cosa = Math.cos(-a);
|
||
const sina = Math.sin(-a);
|
||
const x_temp = layerX * cosa - layerY * sina;
|
||
layerY = layerY * cosa + layerX * sina;
|
||
layerX = x_temp;
|
||
layerX += scrollOriginX;
|
||
layerY += scrollOriginY
|
||
}
|
||
const normalScale = this.GetNormalScale();
|
||
const scaledViewportWidth = runtime.GetViewportWidth() / normalScale;
|
||
const scaledViewportHeight = runtime.GetViewportHeight() / normalScale;
|
||
const viewportOriginX = scrollOriginX - scaledViewportWidth / 2;
|
||
const viewportOriginY = scrollOriginY - scaledViewportHeight / 2;
|
||
const viewportOffX = layerX - viewportOriginX;
|
||
const viewportOffY = layerY - viewportOriginY;
|
||
const canvasX = viewportOffX * displayScale;
|
||
const canvasY = viewportOffY * displayScale;
|
||
return [canvasX, canvasY]
|
||
}
|
||
_GetLayerToDrawSurfaceScale(size, zElevation) {
|
||
size *= this.GetRenderScale() * this.GetDevicePixelRatio();
|
||
if (zElevation !== 0)
|
||
size *= this.Get2DScaleFactorToZ(zElevation);
|
||
return size
|
||
}
|
||
_SaveToJson() {
|
||
const o = {
|
||
"s": this.GetOwnScale(),
|
||
"a": this.GetOwnAngle(),
|
||
"vl": this._viewport.getLeft(),
|
||
"vt": this._viewport.getTop(),
|
||
"vr": this._viewport.getRight(),
|
||
"vb": this._viewport.getBottom(),
|
||
"v": this.IsVisible(),
|
||
"bc": this._backgroundColor.toJSON(),
|
||
"t": this.IsTransparent(),
|
||
"px": this.GetParallaxX(),
|
||
"py": this.GetParallaxY(),
|
||
"c": this._color.toJSON(),
|
||
"sr": this.GetScaleRate(),
|
||
"fx": this._effectList.SaveToJson(),
|
||
"cg": this._createdGlobalUids
|
||
};
|
||
return o
|
||
}
|
||
_LoadFromJson(o) {
|
||
this._scale = o["s"];
|
||
this._angle = o["a"];
|
||
this._viewport.set(o["vl"], o["vt"], o["vr"], o["vb"]);
|
||
this._isVisible = !!o["v"];
|
||
this._backgroundColor.setFromJSON(o["bc"]);
|
||
this._isTransparent = !!o["t"];
|
||
this._parallaxX = o["px"];
|
||
this._parallaxY = o["py"];
|
||
this._color.setFromJSON(o["c"]);
|
||
this._scaleRate = o["sr"];
|
||
C3.shallowAssignArray(this._createdGlobalUids, o["cg"]);
|
||
C3.shallowAssignArray(this._initialInstances, this._startupInitialInstances);
|
||
const tempSet = new Set(this._createdGlobalUids);
|
||
let j = 0;
|
||
for (let i = 0, len = this._initialInstances.length; i < len; ++i)
|
||
if (!tempSet.has(this._initialInstances[i][2])) {
|
||
this._initialInstances[j] = this._initialInstances[i];
|
||
++j
|
||
}
|
||
C3.truncateArray(this._initialInstances, j);
|
||
this._effectList.LoadFromJson(o["fx"]);
|
||
this._SortInstancesByLastCachedZIndex(false);
|
||
this.SetZIndicesChanged()
|
||
}
|
||
GetILayer() {
|
||
return this._iLayer
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const C3Debugger = self.C3Debugger;
|
||
const assert = self.assert;
|
||
const tempDestRect = C3.New(C3.Rect);
|
||
const tempSrcRect = C3.New(C3.Rect);
|
||
const tempLayoutRect = C3.New(C3.Rect);
|
||
C3.Layout = class Layout extends C3.DefendedBase {
|
||
constructor(layoutManager, index, data) {
|
||
super();
|
||
this._layoutManager = layoutManager;
|
||
this._runtime = layoutManager.GetRuntime();
|
||
this._name = data[0];
|
||
this._originalWidth = data[1];
|
||
this._originalHeight = data[2];
|
||
this._width = data[1];
|
||
this._height = data[2];
|
||
this._isUnboundedScrolling = !!data[3];
|
||
this._eventSheetName = data[4];
|
||
this._eventSheet = null;
|
||
this._sid = data[5];
|
||
this._index = index;
|
||
this._scrollX = 0;
|
||
this._scrollY = 0;
|
||
this._scale = 1;
|
||
this._angle = 0;
|
||
this._initialObjectClasses = new Set;
|
||
this._textureLoadedTypes = new Set;
|
||
this._textureLoadPendingPromises = new Set;
|
||
this._createdInstances = [];
|
||
this._initialNonWorld = [];
|
||
this._layers = [];
|
||
this._layersByName = new Map;
|
||
this._layersBySid = new Map;
|
||
this._effectList = C3.New(C3.EffectList, this, data[8]);
|
||
this._curRenderTarget = null;
|
||
this._persistData = {};
|
||
this._isFirstVisit = true;
|
||
this._iLayout = new self.ILayout(this);
|
||
this._userScriptDispatcher = C3.New(C3.Event.Dispatcher);
|
||
for (const layerData of data[6]) {
|
||
const layer = C3.Layer.Create(this, this._layers.length, layerData);
|
||
this._layers.push(layer);
|
||
this._layersByName.set(layer.GetName().toLowerCase(), layer);
|
||
this._layersBySid.set(layer.GetSID(), layer)
|
||
}
|
||
for (const instData of data[7]) {
|
||
const objectClass = this._runtime.GetObjectClassByIndex(instData[1]);
|
||
if (!objectClass)
|
||
throw new Error("missing nonworld object class");
|
||
if (!objectClass.GetDefaultInstanceData())
|
||
objectClass.SetDefaultInstanceData(instData);
|
||
this._initialNonWorld.push(instData);
|
||
this._AddInitialObjectClass(objectClass)
|
||
}
|
||
}
|
||
Release() {
|
||
for (const l of this._layers)
|
||
l.Release();
|
||
C3.clearArray(this._layers);
|
||
this._textureLoadPendingPromises.clear();
|
||
this._eventSheet = null;
|
||
this._layoutManager = null;
|
||
this._runtime = null
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
GetSID() {
|
||
return this._sid
|
||
}
|
||
GetIndex() {
|
||
return this._index
|
||
}
|
||
GetEffectList() {
|
||
return this._effectList
|
||
}
|
||
GetMinLayerScale() {
|
||
let m = this._layers[0].GetNormalScale();
|
||
for (let i = 1, len = this._layers.length; i < len; ++i) {
|
||
const layer = this._layers[i];
|
||
if (layer.GetParallaxX() === 0 && layer.GetParallaxY() === 0)
|
||
continue;
|
||
m = Math.min(m, layer.GetNormalScale())
|
||
}
|
||
return m
|
||
}
|
||
SetScrollX(x) {
|
||
if (!this._isUnboundedScrolling) {
|
||
const widthBoundary = this._runtime.GetViewportWidth() * (1 / this.GetMinLayerScale()) / 2;
|
||
if (x > this._width - widthBoundary)
|
||
x = this._width - widthBoundary;
|
||
if (x < widthBoundary)
|
||
x = widthBoundary
|
||
}
|
||
if (this._scrollX !== x) {
|
||
this._scrollX = x;
|
||
this._runtime.UpdateRender()
|
||
}
|
||
}
|
||
GetScrollX() {
|
||
return this._scrollX
|
||
}
|
||
SetScrollY(y) {
|
||
if (!this._isUnboundedScrolling) {
|
||
const heightBoundary = this._runtime.GetViewportHeight() * (1 / this.GetMinLayerScale()) / 2;
|
||
if (y > this._height - heightBoundary)
|
||
y = this._height - heightBoundary;
|
||
if (y < heightBoundary)
|
||
y = heightBoundary
|
||
}
|
||
if (this._scrollY !== y) {
|
||
this._scrollY = y;
|
||
this._runtime.UpdateRender()
|
||
}
|
||
}
|
||
GetScrollY() {
|
||
return this._scrollY
|
||
}
|
||
BoundScrolling() {
|
||
this.SetScrollX(this.GetScrollX());
|
||
this.SetScrollY(this.GetScrollY())
|
||
}
|
||
GetScale() {
|
||
return this._scale
|
||
}
|
||
SetScale(s) {
|
||
s = +s;
|
||
if (this._scale === s)
|
||
return;
|
||
this._scale = s;
|
||
this.BoundScrolling()
|
||
}
|
||
SetAngle(a) {
|
||
this._angle = C3.clampAngle(a)
|
||
}
|
||
GetAngle() {
|
||
return this._angle
|
||
}
|
||
GetWidth() {
|
||
return this._width
|
||
}
|
||
SetWidth(w) {
|
||
if (!isFinite(w) || w < 1)
|
||
return;
|
||
this._width = w
|
||
}
|
||
GetHeight() {
|
||
return this._height
|
||
}
|
||
SetHeight(h) {
|
||
if (!isFinite(h) || h < 1)
|
||
return;
|
||
this._height = h
|
||
}
|
||
GetEventSheet() {
|
||
return this._eventSheet
|
||
}
|
||
GetLayers() {
|
||
return this._layers
|
||
}
|
||
GetLayerCount() {
|
||
return this._layers.length
|
||
}
|
||
GetLayer(p) {
|
||
if (typeof p === "number")
|
||
return this.GetLayerByIndex(p);
|
||
else
|
||
return this.GetLayerByName(p.toString())
|
||
}
|
||
GetLayerByIndex(i) {
|
||
i = C3.clamp(Math.floor(i), 0, this._layers.length - 1);
|
||
return this._layers[i]
|
||
}
|
||
GetLayerByName(name) {
|
||
return this._layersByName.get(name.toLowerCase()) || null
|
||
}
|
||
GetLayerBySID(sid) {
|
||
return this._layersBySid.get(sid) || null
|
||
}
|
||
HasOpaqueBottomLayer() {
|
||
for (const layer of this._layers)
|
||
if (layer.ShouldDraw())
|
||
return layer._IsOpaque();
|
||
return false
|
||
}
|
||
IsFirstVisit() {
|
||
return this._isFirstVisit
|
||
}
|
||
_GetInitialObjectClasses() {
|
||
return [...this._initialObjectClasses]
|
||
}
|
||
_AddInitialObjectClass(objectClass) {
|
||
if (objectClass.IsInContainer())
|
||
for (const containerType of objectClass.GetContainer().GetObjectTypes())
|
||
this._initialObjectClasses.add(containerType);
|
||
else
|
||
this._initialObjectClasses.add(objectClass)
|
||
}
|
||
_GetTextureLoadedObjectTypes() {
|
||
return [...this._textureLoadedTypes]
|
||
}
|
||
_Load(previousLayout, renderer) {
|
||
if (previousLayout === this || !renderer)
|
||
return Promise.resolve();
|
||
if (previousLayout) {
|
||
C3.CopySet(this._textureLoadedTypes, previousLayout._textureLoadedTypes);
|
||
previousLayout._textureLoadedTypes.clear()
|
||
}
|
||
const promises = [];
|
||
for (const oc of this._initialObjectClasses)
|
||
if (!this._textureLoadedTypes.has(oc)) {
|
||
promises.push(oc.LoadTextures(renderer));
|
||
this._textureLoadedTypes.add(oc)
|
||
}
|
||
return Promise.all(promises)
|
||
}
|
||
async MaybeLoadTexturesFor(objectClass) {
|
||
if (objectClass.IsFamily())
|
||
throw new Error("cannot load textures for family");
|
||
const renderer = this._runtime.GetWebGLRenderer();
|
||
if (!renderer || renderer.IsContextLost() || this._textureLoadedTypes.has(objectClass))
|
||
return;
|
||
this._textureLoadedTypes.add(objectClass);
|
||
const loadPromise = objectClass.LoadTextures(renderer);
|
||
this._AddPendingTextureLoadPromise(loadPromise);
|
||
await loadPromise;
|
||
objectClass.OnDynamicTextureLoadComplete();
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_AddPendingTextureLoadPromise(promise) {
|
||
this._textureLoadPendingPromises.add(promise);
|
||
promise.then(()=>this._textureLoadPendingPromises.delete(promise)).catch(()=>this._textureLoadPendingPromises.delete(promise))
|
||
}
|
||
WaitForPendingTextureLoadsToComplete() {
|
||
return Promise.all([...this._textureLoadPendingPromises])
|
||
}
|
||
MaybeUnloadTexturesFor(objectClass) {
|
||
if (objectClass.IsFamily() || objectClass.GetInstanceCount() > 0)
|
||
throw new Error("cannot unload textures");
|
||
const renderer = this._runtime.GetWebGLRenderer();
|
||
if (!renderer || !this._textureLoadedTypes.has(objectClass))
|
||
return;
|
||
this._textureLoadedTypes.delete(objectClass);
|
||
objectClass.ReleaseTextures(renderer)
|
||
}
|
||
_Unload(nextLayout, renderer) {
|
||
if (nextLayout === this || !renderer)
|
||
return;
|
||
for (const oc of this._textureLoadedTypes)
|
||
if (!oc.IsGlobal() && !nextLayout._initialObjectClasses.has(oc)) {
|
||
oc.ReleaseTextures();
|
||
this._textureLoadedTypes.delete(oc)
|
||
}
|
||
}
|
||
_OnWebGLContextLost() {
|
||
this._textureLoadedTypes.clear()
|
||
}
|
||
async _StartRunning(isFirstLayout) {
|
||
const runtime = this._runtime;
|
||
const layoutManager = this._layoutManager;
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
if (this._eventSheetName) {
|
||
this._eventSheet = eventSheetManager.GetEventSheetByName(this._eventSheetName);
|
||
this._eventSheet._UpdateDeepIncludes()
|
||
}
|
||
layoutManager._SetMainRunningLayout(this);
|
||
this._width = this._originalWidth;
|
||
this._height = this._originalHeight;
|
||
this._scrollX = runtime.GetOriginalViewportWidth() / 2;
|
||
this._scrollY = runtime.GetOriginalViewportHeight() / 2;
|
||
this.BoundScrolling();
|
||
this._MoveGlobalObjectsToThisLayout(isFirstLayout);
|
||
this._runtime.SetUsingCreatePromises(true);
|
||
this._CreateInitialInstances();
|
||
if (!this._isFirstVisit)
|
||
this._CreatePersistedInstances();
|
||
this._CreateAndLinkContainerInstances(this._createdInstances);
|
||
this._CreateInitialNonWorldInstances();
|
||
layoutManager.ClearPendingChangeLayout();
|
||
runtime.FlushPendingInstances();
|
||
this._runtime.SetUsingCreatePromises(false);
|
||
const createPromises = this._runtime.GetCreatePromises();
|
||
await Promise.all(createPromises);
|
||
C3.clearArray(createPromises);
|
||
if (runtime.IsLoadingState())
|
||
runtime._TriggerOnCreateAfterLoad(this._createdInstances);
|
||
else
|
||
for (const inst of this._createdInstances) {
|
||
inst._TriggerOnCreated();
|
||
inst.SetupInitialSceneGraphConnections()
|
||
}
|
||
C3.clearArray(this._createdInstances);
|
||
await Promise.all([...this._initialObjectClasses].map(oc=>oc.PreloadTexturesWithInstances(this._runtime.GetWebGLRenderer())));
|
||
if (isFirstLayout) {
|
||
runtime.Dispatcher().dispatchEvent(new C3.Event("beforefirstlayoutstart"));
|
||
await runtime.DispatchUserScriptEventAsyncWait(new C3.Event("beforeprojectstart"))
|
||
}
|
||
await this.DispatchUserScriptEventAsyncWait(new C3.Event("beforelayoutstart"));
|
||
if (!runtime.IsLoadingState())
|
||
await runtime.TriggerAsync(C3.Plugins.System.Cnds.OnLayoutStart, null, null);
|
||
await this.DispatchUserScriptEventAsyncWait(new C3.Event("afterlayoutstart"));
|
||
if (isFirstLayout) {
|
||
runtime.Dispatcher().dispatchEvent(new C3.Event("afterfirstlayoutstart"));
|
||
await runtime.DispatchUserScriptEventAsyncWait(new C3.Event("afterprojectstart"))
|
||
}
|
||
eventSheetManager._RunQueuedTriggers(layoutManager);
|
||
await this.WaitForPendingTextureLoadsToComplete();
|
||
this._isFirstVisit = false
|
||
}
|
||
_MoveGlobalObjectsToThisLayout(isFirstLayout) {
|
||
for (const objectClass of this._runtime.GetAllObjectClasses()) {
|
||
if (objectClass.IsFamily() || !objectClass.IsWorldType())
|
||
continue;
|
||
for (const inst of objectClass.GetInstances()) {
|
||
const wi = inst.GetWorldInfo();
|
||
const oldLayer = wi.GetLayer();
|
||
const layerIndex = C3.clamp(oldLayer.GetIndex(), 0, this._layers.length - 1);
|
||
const newLayer = this._layers[layerIndex];
|
||
wi._SetLayer(newLayer);
|
||
newLayer._MaybeAddInstance(inst)
|
||
}
|
||
}
|
||
if (!isFirstLayout)
|
||
for (const layer of this._layers)
|
||
layer._SortInstancesByLastCachedZIndex(false)
|
||
}
|
||
_CreateInitialInstances() {
|
||
for (const layer of this._layers) {
|
||
layer.CreateInitialInstances(this._createdInstances);
|
||
layer.UpdateViewport();
|
||
layer._Start()
|
||
}
|
||
}
|
||
_CreatePersistedInstances() {
|
||
let uidsChanged = false;
|
||
for (const [sidStr,typeData] of Object.entries(this._persistData)) {
|
||
const objectClass = this._runtime.GetObjectClassBySID(parseInt(sidStr, 10));
|
||
if (!objectClass || objectClass.IsFamily() || !objectClass.HasPersistBehavior())
|
||
continue;
|
||
for (const instData of typeData) {
|
||
let layer = null;
|
||
if (objectClass.IsWorldType()) {
|
||
layer = this.GetLayerBySID(instData["w"]["l"]);
|
||
if (!layer)
|
||
continue
|
||
}
|
||
const inst = this._runtime.CreateInstanceFromData(objectClass, layer, false, 0, 0, true);
|
||
inst.LoadFromJson(instData);
|
||
uidsChanged = true;
|
||
this._createdInstances.push(inst)
|
||
}
|
||
C3.clearArray(typeData)
|
||
}
|
||
for (const layer of this._layers) {
|
||
layer._SortInstancesByLastCachedZIndex(true);
|
||
layer.SetZIndicesChanged()
|
||
}
|
||
if (uidsChanged) {
|
||
this._runtime.FlushPendingInstances();
|
||
this._runtime._RefreshUidMap()
|
||
}
|
||
}
|
||
_CreateAndLinkContainerInstances(createdInstances) {
|
||
for (const inst of createdInstances) {
|
||
if (!inst.IsInContainer())
|
||
continue;
|
||
const wi = inst.GetWorldInfo();
|
||
const iid = inst.GetIID();
|
||
for (const containerType of inst.GetObjectClass().GetContainer().objectTypes()) {
|
||
if (containerType === inst.GetObjectClass())
|
||
continue;
|
||
const instances = containerType.GetInstances();
|
||
if (instances.length > iid)
|
||
inst._AddSibling(instances[iid]);
|
||
else {
|
||
let s;
|
||
if (wi)
|
||
s = this._runtime.CreateInstanceFromData(containerType, wi.GetLayer(), true, wi.GetX(), wi.GetY(), true);
|
||
else
|
||
s = this._runtime.CreateInstanceFromData(containerType, null, true, 0, 0, true);
|
||
this._runtime.FlushPendingInstances();
|
||
containerType._UpdateIIDs();
|
||
inst._AddSibling(s);
|
||
createdInstances.push(s)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
_CreateInitialNonWorldInstances() {
|
||
for (const instData of this._initialNonWorld) {
|
||
const objectClass = this._runtime.GetObjectClassByIndex(instData[1]);
|
||
if (!objectClass.IsInContainer())
|
||
this._runtime.CreateInstanceFromData(instData, null, true)
|
||
}
|
||
}
|
||
_CreateGlobalNonWorlds() {
|
||
const createdInstances = [];
|
||
const initialNonWorld = this._initialNonWorld;
|
||
let k = 0;
|
||
for (let i = 0, len = initialNonWorld.length; i < len; ++i) {
|
||
const instData = initialNonWorld[i];
|
||
const objectClass = this._runtime.GetObjectClassByIndex(instData[1]);
|
||
if (objectClass.IsGlobal()) {
|
||
if (!objectClass.IsInContainer() || !objectClass.GetContainer().HasAnyWorldType())
|
||
createdInstances.push(this._runtime.CreateInstanceFromData(instData, null, true))
|
||
} else {
|
||
initialNonWorld[k] = instData;
|
||
++k
|
||
}
|
||
}
|
||
C3.truncateArray(initialNonWorld, k);
|
||
this._runtime.FlushPendingInstances();
|
||
this._CreateAndLinkContainerInstances(createdInstances)
|
||
}
|
||
RecreateInitialObjects(objectClass, rc, srcLayer, offsetX, offsetY) {
|
||
if (srcLayer)
|
||
return srcLayer.RecreateInitialObjects(objectClass, rc, offsetX, offsetY);
|
||
else {
|
||
const ret = [];
|
||
for (const layer of this._layers)
|
||
ret.push(layer.RecreateInitialObjects(objectClass, rc, offsetX, offsetY));
|
||
return ret.flat()
|
||
}
|
||
}
|
||
async _StopRunning() {
|
||
const layoutManager = this._layoutManager;
|
||
if (!this._runtime.IsLoadingState())
|
||
await this._runtime.TriggerAsync(C3.Plugins.System.Cnds.OnLayoutEnd, null, null);
|
||
layoutManager.SetIsEndingLayout(true);
|
||
this._runtime.GetEventSheetManager().ClearAllScheduledWaits();
|
||
if (!this._isFirstVisit)
|
||
this._SavePersistData();
|
||
for (const layer of this._layers)
|
||
layer._End();
|
||
for (const objectClass of this._runtime.GetAllObjectClasses()) {
|
||
if (objectClass.IsGlobal() || objectClass.IsWorldType() || objectClass.GetPlugin().IsSingleGlobal() || objectClass.IsFamily())
|
||
continue;
|
||
for (const inst of objectClass.GetInstances())
|
||
this._runtime.DestroyInstance(inst);
|
||
this._runtime.FlushPendingInstances()
|
||
}
|
||
layoutManager.SetIsEndingLayout(false);
|
||
if (layoutManager.GetMainRunningLayout() === this)
|
||
layoutManager._SetMainRunningLayout(null)
|
||
}
|
||
_SaveInstanceToPersist(inst) {
|
||
const sidStr = inst.GetObjectClass().GetSID().toString();
|
||
if (!this._persistData.hasOwnProperty(sidStr))
|
||
this._persistData[sidStr] = [];
|
||
const typePersist = this._persistData[sidStr];
|
||
typePersist.push(inst.SaveToJson())
|
||
}
|
||
_SavePersistData() {
|
||
for (const layer of this._layers) {
|
||
layer._UpdateZIndices();
|
||
for (const inst of layer._GetInstances()) {
|
||
const objectClass = inst.GetObjectClass();
|
||
if (!objectClass.IsGlobal() && objectClass.HasPersistBehavior())
|
||
this._SaveInstanceToPersist(inst)
|
||
}
|
||
}
|
||
}
|
||
ResetPersistData() {
|
||
this._persistData = {};
|
||
this._isFirstVisit = true
|
||
}
|
||
GetRenderTarget() {
|
||
return this._curRenderTarget
|
||
}
|
||
UsesOwnTexture() {
|
||
return this._runtime.GetCanvasManager().GetCurrentFullscreenScalingQuality() === "low" || this._runtime.UsesAnyBackgroundBlending() || this._runtime.GetCompositingMode() === "low-latency" || this._effectList.HasAnyActiveEffect()
|
||
}
|
||
_CanFastPathDrawLayout(activeEffectTypes) {
|
||
if (activeEffectTypes.length === 0)
|
||
return true;
|
||
if (activeEffectTypes.length >= 2)
|
||
return false;
|
||
const effectType = activeEffectTypes[0];
|
||
const shaderProgram = effectType.GetShaderProgram();
|
||
return !shaderProgram.MustPreDraw()
|
||
}
|
||
Draw(renderer) {
|
||
const canvasManager = this._runtime.GetCanvasManager();
|
||
const useOwnTexture = this.UsesOwnTexture();
|
||
let ownRenderTarget = null;
|
||
if (useOwnTexture) {
|
||
if (this._runtime.GetCompositingMode() !== "low-latency") {
|
||
renderer.SetRenderTarget(null);
|
||
renderer.ClearRgba(0, 0, 0, 0)
|
||
}
|
||
const rtOpts = {
|
||
sampling: this._runtime.GetSampling(),
|
||
readback: this._runtime.UsesAnyBackgroundBlending() || this._effectList.HasAnyActiveEffect()
|
||
};
|
||
if (canvasManager.GetCurrentFullscreenScalingQuality() === "low") {
|
||
rtOpts.width = canvasManager.GetDrawWidth();
|
||
rtOpts.height = canvasManager.GetDrawHeight()
|
||
}
|
||
ownRenderTarget = this._runtime.GetAdditionalRenderTarget(rtOpts);
|
||
renderer.SetRenderTarget(ownRenderTarget)
|
||
} else
|
||
renderer.SetRenderTarget(null);
|
||
if (!this.HasOpaqueBottomLayer())
|
||
renderer.ClearRgba(0, 0, 0, 0);
|
||
this._curRenderTarget = ownRenderTarget;
|
||
let isFirstDrawnLayer = true;
|
||
for (const layer of this._layers) {
|
||
layer.UpdateViewport();
|
||
if (layer.ShouldDraw()) {
|
||
layer.Draw(renderer, ownRenderTarget, isFirstDrawnLayer);
|
||
isFirstDrawnLayer = false
|
||
}
|
||
}
|
||
if (useOwnTexture)
|
||
this._DrawLayoutOwnTextureToRenderTarget(renderer, ownRenderTarget);
|
||
this._curRenderTarget = null
|
||
}
|
||
_DrawLayoutOwnTextureToRenderTarget(renderer, ownRenderTarget) {
|
||
const activeEffectTypes = this._effectList.GetActiveEffectTypes();
|
||
const runtime = this._runtime;
|
||
if (this._CanFastPathDrawLayout(activeEffectTypes)) {
|
||
renderer.SetRenderTarget(null);
|
||
if (activeEffectTypes.length === 1) {
|
||
const effectType = activeEffectTypes[0];
|
||
const shaderProgram = effectType.GetShaderProgram();
|
||
renderer.SetProgram(shaderProgram);
|
||
tempSrcRect.set(0, 0, 1, 1);
|
||
tempLayoutRect.set(0, 0, runtime.GetViewportWidth(), runtime.GetViewportHeight());
|
||
const paramArr = this._effectList.GetEffectParametersForIndex(effectType.GetIndex());
|
||
renderer.SetProgramParameters(null, tempDestRect, tempSrcRect, tempSrcRect, tempLayoutRect, 1 / runtime.GetDrawWidth(), 1 / runtime.GetDrawHeight(), this.GetScale(), this.GetAngle(), runtime.GetGameTime(), paramArr);
|
||
if (shaderProgram.IsAnimated())
|
||
runtime.UpdateRender()
|
||
} else
|
||
renderer.SetTextureFillMode();
|
||
if (activeEffectTypes.length === 0)
|
||
renderer.CopyRenderTarget(ownRenderTarget);
|
||
else {
|
||
renderer.SetAlphaBlend();
|
||
renderer.ResetColor();
|
||
renderer.DrawRenderTarget(ownRenderTarget)
|
||
}
|
||
renderer.InvalidateRenderTarget(ownRenderTarget);
|
||
runtime.ReleaseAdditionalRenderTarget(ownRenderTarget)
|
||
} else
|
||
C3.RenderEffectChain(renderer, runtime, this, null, activeEffectTypes)
|
||
}
|
||
_SaveToJson() {
|
||
const o = {
|
||
"sx": this.GetScrollX(),
|
||
"sy": this.GetScrollY(),
|
||
"s": this.GetScale(),
|
||
"a": this.GetAngle(),
|
||
"w": this.GetWidth(),
|
||
"h": this.GetHeight(),
|
||
"fv": this._isFirstVisit,
|
||
"persist": this._persistData,
|
||
"fx": this._effectList.SaveToJson(),
|
||
"layers": {}
|
||
};
|
||
for (const layer of this._layers)
|
||
o["layers"][layer.GetSID().toString()] = layer._SaveToJson();
|
||
return o
|
||
}
|
||
_LoadFromJson(o) {
|
||
this._scrollX = o["sx"];
|
||
this._scrollY = o["sy"];
|
||
this._scale = o["s"];
|
||
this._angle = o["a"];
|
||
this._width = o["w"];
|
||
this._height = o["h"];
|
||
this._isFirstVisit = !!o["fv"];
|
||
this._persistData = o["persist"];
|
||
this._effectList.LoadFromJson(o["fx"]);
|
||
for (const [sidStr,data] of Object.entries(o["layers"])) {
|
||
const sid = parseInt(sidStr, 10);
|
||
const layer = this.GetLayerBySID(sid);
|
||
if (!layer)
|
||
continue;
|
||
layer._LoadFromJson(data)
|
||
}
|
||
}
|
||
GetILayout() {
|
||
return this._iLayout
|
||
}
|
||
UserScriptDispatcher() {
|
||
return this._userScriptDispatcher
|
||
}
|
||
DispatchUserScriptEvent(e) {
|
||
e.layout = this.GetILayout();
|
||
const runtime = this._runtime;
|
||
const shouldTime = runtime.IsDebug() && !runtime.GetEventSheetManager().IsInEventEngine();
|
||
if (shouldTime)
|
||
C3Debugger.StartMeasuringScriptTime();
|
||
this._userScriptDispatcher.dispatchEvent(e);
|
||
if (shouldTime)
|
||
C3Debugger.AddScriptTime()
|
||
}
|
||
DispatchUserScriptEventAsyncWait(e) {
|
||
e.layout = this.GetILayout();
|
||
return this._userScriptDispatcher.dispatchEventAndWaitAsync(e)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.LayoutManager = class LayoutManager extends C3.DefendedBase {
|
||
constructor(runtime) {
|
||
super();
|
||
this._runtime = runtime;
|
||
this._allLayouts = [];
|
||
this._layoutsByName = new Map;
|
||
this._layoutsBySid = new Map;
|
||
this._mainRunningLayout = null;
|
||
this._runningSubLayouts = [];
|
||
this._firstLayout = null;
|
||
this._isEndingLayout = 0;
|
||
this._pendingChangeLayout = null
|
||
}
|
||
Release() {
|
||
this._runtime = null;
|
||
this._mainRunningLayout = null;
|
||
this._firstLayout = null;
|
||
this._pendingChangeLayout = null;
|
||
C3.clearArray(this._allLayouts);
|
||
this._layoutsByName.clear();
|
||
this._layoutsBySid.clear();
|
||
C3.clearArray(this._runningSubLayouts)
|
||
}
|
||
Create(layoutData) {
|
||
const layout = C3.New(C3.Layout, this, this._allLayouts.length, layoutData);
|
||
this._allLayouts.push(layout);
|
||
this._layoutsByName.set(layout.GetName().toLowerCase(), layout);
|
||
this._layoutsBySid.set(layout.GetSID(), layout)
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
SetFirstLayout(layout) {
|
||
this._firstLayout = layout
|
||
}
|
||
GetFirstLayout() {
|
||
if (this._firstLayout)
|
||
return this._firstLayout;
|
||
if (this._allLayouts.length)
|
||
return this._allLayouts[0];
|
||
throw new Error("no first layout");
|
||
}
|
||
GetLayoutByName(name) {
|
||
return this._layoutsByName.get(name.toLowerCase()) || null
|
||
}
|
||
GetLayoutBySID(sid) {
|
||
return this._layoutsBySid.get(sid) || null
|
||
}
|
||
GetLayoutByIndex(index) {
|
||
index = C3.clamp(Math.floor(index), 0, this._allLayouts.length - 1);
|
||
return this._allLayouts[index]
|
||
}
|
||
GetLayout(p) {
|
||
if (typeof p === "number")
|
||
return this.GetLayoutByIndex(p);
|
||
else
|
||
return this.GetLayoutByName(p.toString())
|
||
}
|
||
GetAllLayouts() {
|
||
return this._allLayouts
|
||
}
|
||
_SetMainRunningLayout(layout) {
|
||
this._mainRunningLayout = layout
|
||
}
|
||
GetMainRunningLayout() {
|
||
return this._mainRunningLayout
|
||
}
|
||
_AddRunningSubLayout(layout) {
|
||
if (this._runningSubLayouts.includes(layout))
|
||
throw new Error("layout already running");
|
||
this._runningSubLayouts.push(layout)
|
||
}
|
||
_RemoveRunningSubLayout(layout) {
|
||
const i = this._runningSubLayouts.indexOf(layout);
|
||
if (i === -1)
|
||
throw new Error("layout not running");
|
||
this._runningSubLayouts.splice(i, 1)
|
||
}
|
||
*runningLayouts() {
|
||
if (this._mainRunningLayout)
|
||
yield this._mainRunningLayout;
|
||
if (this._runningSubLayouts.length)
|
||
yield*this._runningSubLayouts
|
||
}
|
||
IsLayoutRunning(layout) {
|
||
return this._mainRunningLayout === layout || this._runningSubLayouts.includes(layout)
|
||
}
|
||
SetIsEndingLayout(e) {
|
||
if (e)
|
||
this._isEndingLayout++;
|
||
else {
|
||
if (this._isEndingLayout <= 0)
|
||
throw new Error("already unset");
|
||
this._isEndingLayout--
|
||
}
|
||
}
|
||
IsEndingLayout() {
|
||
return this._isEndingLayout > 0
|
||
}
|
||
ChangeMainLayout(layout) {
|
||
this._pendingChangeLayout = layout
|
||
}
|
||
ClearPendingChangeLayout() {
|
||
this._pendingChangeLayout = null
|
||
}
|
||
IsPendingChangeMainLayout() {
|
||
return !!this._pendingChangeLayout
|
||
}
|
||
GetPendingChangeMainLayout() {
|
||
return this._pendingChangeLayout
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
class RenderEffectChainState {
|
||
constructor() {
|
||
this.renderer = null;
|
||
this.runtime = null;
|
||
this.drawWidth = 0;
|
||
this.drawHeight = 0;
|
||
this.surfaceWidth = 0;
|
||
this.surfaceHeight = 0;
|
||
this.layoutRect = new C3.Rect;
|
||
this.rcTexBounce = new C3.Rect;
|
||
this.rcTexDest = new C3.Rect;
|
||
this.rcTexOrigin = new C3.Rect;
|
||
this.screenRect = new C3.Rect;
|
||
this.clearRect = new C3.Rect;
|
||
this.srcRect = new C3.Rect;
|
||
this.fxTex = [null, null];
|
||
this.fxIndex = 0;
|
||
this.otherFxIndex = 1;
|
||
this.boxExtendHorizontal = 0;
|
||
this.boxExtendVertical = 0;
|
||
this.layerScale = 0;
|
||
this.layerAngle = 0;
|
||
this.layout = null;
|
||
this.layer = null;
|
||
this.inst = null;
|
||
this.wi = null;
|
||
this.renderTarget = null;
|
||
this.preDraw = false;
|
||
this.postDraw = false;
|
||
this.didChangeTransform = false;
|
||
this.opts = null
|
||
}
|
||
Clear() {
|
||
this.renderer = null;
|
||
this.runtime = null;
|
||
this.layout = null;
|
||
this.layer = null;
|
||
this.inst = null;
|
||
this.wi = null;
|
||
this.renderTarget = null;
|
||
this.opts = null
|
||
}
|
||
ShouldPreDraw(firstEffectType) {
|
||
const shaderProgram = firstEffectType.GetShaderProgram();
|
||
if (shaderProgram.MustPreDraw())
|
||
return true;
|
||
if (this.inst)
|
||
return shaderProgram.UsesDest() && (this.wi.GetAngle() !== 0 || this.wi.GetWidth() < 0 || this.wi.GetHeight() < 0) || this.boxExtendHorizontal !== 0 || this.boxExtendVertical !== 0 || !this.wi.HasDefaultColor() || this.inst.MustPreDraw();
|
||
else if (this.layer)
|
||
return !this.layer.HasDefaultColor()
|
||
}
|
||
ShouldPostDraw(lastEffectType) {
|
||
const shaderProgram = lastEffectType.GetShaderProgram();
|
||
return shaderProgram.UsesDest() || shaderProgram.UsesCrossSampling() || this.layout && this.runtime.GetCanvasManager().GetCurrentFullscreenScalingQuality() === "low"
|
||
}
|
||
GetEffectRenderTarget(i) {
|
||
if (i !== 0 && i !== 1)
|
||
throw new Error("invalid effect target");
|
||
const fxTex = this.fxTex;
|
||
if (!fxTex[i]) {
|
||
const runtime = this.runtime;
|
||
const canvasManager = runtime.GetCanvasManager();
|
||
const opts = {
|
||
sampling: runtime.GetSampling()
|
||
};
|
||
if (canvasManager.GetCurrentFullscreenScalingQuality() === "low") {
|
||
opts.width = canvasManager.GetDrawWidth();
|
||
opts.height = canvasManager.GetDrawHeight()
|
||
}
|
||
fxTex[i] = canvasManager.GetAdditionalRenderTarget(opts)
|
||
}
|
||
return fxTex[i]
|
||
}
|
||
ReleaseEffectRenderTargets() {
|
||
const fxTex = this.fxTex;
|
||
const canvasManager = this.runtime.GetCanvasManager();
|
||
if (fxTex[0]) {
|
||
canvasManager.ReleaseAdditionalRenderTarget(fxTex[0]);
|
||
fxTex[0] = null
|
||
}
|
||
if (fxTex[1]) {
|
||
canvasManager.ReleaseAdditionalRenderTarget(fxTex[1]);
|
||
fxTex[1] = null
|
||
}
|
||
}
|
||
}
|
||
const ctxStack = [];
|
||
let ctxPtr = 0;
|
||
function AllocRenderEffectChainState() {
|
||
if (ctxPtr === ctxStack.length)
|
||
ctxStack.push(new RenderEffectChainState);
|
||
return ctxStack[ctxPtr++]
|
||
}
|
||
function ReleaseRenderEffectChainState(ctx) {
|
||
ctx.ReleaseEffectRenderTargets();
|
||
ctx.Clear();
|
||
ctxPtr--
|
||
}
|
||
const tempQuad = new C3.Quad;
|
||
let isDebug = false;
|
||
let isDebugFrame = false;
|
||
async function DebugLogRenderTargetContents(msg, renderer, renderTarget) {
|
||
const blob = await C3.Gfx.WebGLRenderTarget.DebugReadPixelsToBlob(renderer, renderTarget);
|
||
const blobUrl = URL.createObjectURL(blob);
|
||
console.log("[FX] " + msg + " " + (renderTarget ? "" : " [to display]") + ": ", blobUrl)
|
||
}
|
||
C3.RenderEffectChain = function RenderEffectChain(renderer, runtime, effectsObject, renderTarget_, activeEffectTypes, opts_) {
|
||
const ctx = AllocRenderEffectChainState();
|
||
ctx.renderer = renderer;
|
||
ctx.runtime = runtime;
|
||
if (effectsObject instanceof C3.Instance) {
|
||
ctx.inst = effectsObject;
|
||
ctx.wi = ctx.inst.GetWorldInfo()
|
||
} else if (effectsObject instanceof C3.Layer)
|
||
ctx.layer = effectsObject;
|
||
else if (effectsObject instanceof C3.Layout)
|
||
ctx.layout = effectsObject;
|
||
else
|
||
throw new Error("invalid effects object");
|
||
const canvasManager = runtime.GetCanvasManager();
|
||
ctx.renderTarget = renderTarget_;
|
||
ctx.drawWidth = canvasManager.GetDrawWidth();
|
||
ctx.drawHeight = canvasManager.GetDrawHeight();
|
||
ctx.surfaceWidth = ctx.drawWidth;
|
||
ctx.surfaceHeight = ctx.drawHeight;
|
||
ctx.fxIndex = 0;
|
||
ctx.otherFxIndex = 1;
|
||
ctx.boxExtendHorizontal = 0;
|
||
ctx.boxExtendVertical = 0;
|
||
ctx.screenRect.set(0, 0, ctx.drawWidth, ctx.drawHeight);
|
||
ctx.clearRect.set(0, 0, ctx.drawWidth, ctx.drawHeight);
|
||
ctx.didChangeTransform = false;
|
||
ctx.opts = opts_;
|
||
if (ctx.inst) {
|
||
const wi = ctx.wi;
|
||
ctx.layerScale = wi.GetLayer().GetRenderScale();
|
||
ctx.layerAngle = wi.GetLayer().GetAngle();
|
||
ctx.layoutRect.copy(wi.GetBoundingBox())
|
||
} else if (ctx.layer) {
|
||
const layer = ctx.layer;
|
||
ctx.layerScale = layer.GetRenderScale();
|
||
ctx.layerAngle = layer.GetAngle();
|
||
ctx.layoutRect.copy(layer.GetViewport())
|
||
} else {
|
||
const layout = ctx.layout;
|
||
ctx.layerScale = layout.GetScale();
|
||
ctx.layerAngle = layout.GetAngle();
|
||
ctx.layoutRect.set(0, 0, ctx.drawWidth, ctx.drawHeight)
|
||
}
|
||
if (ctx.inst)
|
||
GetInstanceBox(ctx, activeEffectTypes);
|
||
else {
|
||
ctx.rcTexBounce.set(0, 0, ctx.drawWidth / ctx.surfaceWidth, ctx.drawHeight / ctx.surfaceHeight);
|
||
ctx.rcTexDest.copy(ctx.rcTexBounce);
|
||
ctx.rcTexOrigin.copy(ctx.rcTexBounce);
|
||
ctx.rcTexBounce.swapTopBottom();
|
||
ctx.rcTexDest.swapTopBottom();
|
||
ctx.rcTexOrigin.swapTopBottom()
|
||
}
|
||
renderer.SetAlphaBlend();
|
||
renderer.ResetColor();
|
||
renderer.SetBaseZ(0);
|
||
renderer.SetCurrentZ(0);
|
||
ctx.preDraw = ctx.ShouldPreDraw(activeEffectTypes[0]);
|
||
if (ctx.preDraw)
|
||
PreDraw(ctx);
|
||
renderer.ResetColor();
|
||
const lastEffectTypeIndex = activeEffectTypes.length - 1;
|
||
ctx.postDraw = ctx.ShouldPostDraw(activeEffectTypes[lastEffectTypeIndex]);
|
||
for (let i = 0, len = activeEffectTypes.length; i < len; ++i) {
|
||
const effectType = activeEffectTypes[i];
|
||
const shaderProgram = effectType.GetShaderProgram();
|
||
renderer.SetProgram(shaderProgram);
|
||
if (shaderProgram.IsAnimated())
|
||
runtime.UpdateRender();
|
||
if (i === 0 && !ctx.preDraw)
|
||
RenderFirstBounce(ctx, effectType);
|
||
else {
|
||
renderer.SetCopyBlend();
|
||
const isLast = i === lastEffectTypeIndex && !ctx.postDraw;
|
||
RenderBounce(ctx, effectType, isLast, i)
|
||
}
|
||
if (ctx.fxIndex === 0) {
|
||
ctx.fxIndex = 1;
|
||
ctx.otherFxIndex = 0
|
||
} else {
|
||
ctx.fxIndex = 0;
|
||
ctx.otherFxIndex = 1
|
||
}
|
||
}
|
||
if (ctx.postDraw)
|
||
PostDraw(ctx, activeEffectTypes);
|
||
const ret = ctx.didChangeTransform;
|
||
ReleaseRenderEffectChainState(ctx);
|
||
isDebugFrame = false;
|
||
return ret
|
||
}
|
||
;
|
||
function GetInstanceBox(ctx, activeEffectTypes) {
|
||
for (let i = 0, len = activeEffectTypes.length; i < len; ++i) {
|
||
const shaderProgram = activeEffectTypes[i].GetShaderProgram();
|
||
ctx.boxExtendHorizontal += shaderProgram.GetBoxExtendHorizontal();
|
||
ctx.boxExtendVertical += shaderProgram.GetBoxExtendVertical()
|
||
}
|
||
const wi = ctx.wi;
|
||
const layer = wi.GetLayer();
|
||
const layerAngle = layer.GetAngle();
|
||
const bbox = wi.GetBoundingBox();
|
||
const z = wi.GetTotalZElevation();
|
||
let[sl,st] = layer.LayerToDrawSurface(bbox.getLeft(), bbox.getTop(), z);
|
||
let[sr,sb] = layer.LayerToDrawSurface(bbox.getRight(), bbox.getBottom(), z);
|
||
if (layerAngle !== 0) {
|
||
const [strx,stry] = layer.LayerToDrawSurface(bbox.getRight(), bbox.getTop(), z);
|
||
const [sblx,sbly] = layer.LayerToDrawSurface(bbox.getLeft(), bbox.getBottom(), z);
|
||
let temp = Math.min(sl, sr, strx, sblx);
|
||
sr = Math.max(sl, sr, strx, sblx);
|
||
sl = temp;
|
||
temp = Math.min(st, sb, stry, sbly);
|
||
sb = Math.max(st, sb, stry, sbly);
|
||
st = temp
|
||
}
|
||
const screenRect = ctx.screenRect;
|
||
const rcTexOrigin = ctx.rcTexOrigin;
|
||
const rcTexDest = ctx.rcTexDest;
|
||
const clearRect = ctx.clearRect;
|
||
const rcTexBounce = ctx.rcTexBounce;
|
||
screenRect.set(sl, st, sr, sb);
|
||
screenRect.shuntY(ctx.drawHeight);
|
||
rcTexOrigin.copy(screenRect);
|
||
rcTexOrigin.divide(ctx.surfaceWidth, ctx.surfaceHeight);
|
||
rcTexOrigin.swapTopBottom();
|
||
screenRect.inflate(ctx.boxExtendHorizontal, ctx.boxExtendVertical);
|
||
rcTexDest.copy(screenRect);
|
||
rcTexDest.divide(ctx.surfaceWidth, ctx.surfaceHeight);
|
||
rcTexDest.swapTopBottom();
|
||
clearRect.copy(screenRect);
|
||
clearRect.roundOuter();
|
||
clearRect.inflate(ctx.boxExtendHorizontal + 1, ctx.boxExtendVertical + 1);
|
||
screenRect.clamp(0, 0, ctx.drawWidth, ctx.drawHeight);
|
||
clearRect.clamp(0, 0, ctx.drawWidth, ctx.drawHeight);
|
||
rcTexBounce.copy(screenRect);
|
||
rcTexBounce.divide(ctx.surfaceWidth, ctx.surfaceHeight);
|
||
rcTexBounce.swapTopBottom()
|
||
}
|
||
function PreDraw(ctx) {
|
||
const renderer = ctx.renderer;
|
||
renderer.SetTextureFillMode();
|
||
const fxTarget = ctx.GetEffectRenderTarget(ctx.fxIndex);
|
||
renderer.SetRenderTarget(fxTarget);
|
||
const opts = ctx.opts;
|
||
if (opts && opts.preTransform)
|
||
opts.preTransform();
|
||
if (isDebug)
|
||
renderer.ClearRgba(1, 0, 0, 1);
|
||
renderer.ClearRect2(ctx.clearRect);
|
||
if (ctx.inst) {
|
||
renderer.SetColor(ctx.wi.GetPremultipliedColor());
|
||
renderer.SetCurrentZ(ctx.wi.GetTotalZElevation());
|
||
ctx.inst.Draw(renderer);
|
||
renderer.SetCurrentZ(0)
|
||
} else {
|
||
const renderSurface = (ctx.layer || ctx.layout).GetRenderTarget();
|
||
if (ctx.layer)
|
||
renderer.SetColor(ctx.layer.GetPremultipliedColor());
|
||
else
|
||
renderer.ResetColor();
|
||
renderer.DrawRenderTarget(renderSurface);
|
||
renderer.InvalidateRenderTarget(renderSurface);
|
||
ctx.runtime.GetCanvasManager().ReleaseAdditionalRenderTarget(renderSurface)
|
||
}
|
||
ctx.rcTexDest.clampFlipped(0, 1, 1, 0);
|
||
ctx.fxIndex = 1;
|
||
ctx.otherFxIndex = 0;
|
||
if (isDebugFrame)
|
||
DebugLogRenderTargetContents("Pre-draw", renderer, fxTarget)
|
||
}
|
||
function RenderFirstBounce(ctx, effectType) {
|
||
const renderer = ctx.renderer;
|
||
const runtime = ctx.runtime;
|
||
const fxTarget = ctx.GetEffectRenderTarget(ctx.fxIndex);
|
||
renderer.SetRenderTarget(fxTarget);
|
||
const opts = ctx.opts;
|
||
if (opts && opts.preTransform)
|
||
opts.preTransform();
|
||
if (isDebug)
|
||
renderer.ClearRgba(1, 0, 0, 1);
|
||
renderer.ClearRect2(ctx.clearRect);
|
||
if (ctx.inst) {
|
||
const [sheetWidth,sheetHeight] = ctx.inst.GetCurrentSurfaceSize();
|
||
const instTexRect = ctx.inst.GetCurrentTexRect();
|
||
if (instTexRect)
|
||
ctx.srcRect.copy(instTexRect);
|
||
else
|
||
ctx.srcRect.set(0, 0, 0, 0);
|
||
const paramArr = ctx.wi.GetInstanceEffectList().GetEffectParametersForIndex(effectType.GetIndex());
|
||
renderer.SetProgramParameters(ctx.renderTarget, ctx.rcTexDest, ctx.srcRect, ctx.srcRect, ctx.layoutRect, 1 / sheetWidth, 1 / sheetHeight, ctx.layerScale, ctx.layerAngle, runtime.GetGameTime(), paramArr);
|
||
renderer.SetCurrentZ(ctx.wi.GetTotalZElevation());
|
||
ctx.inst.Draw(renderer);
|
||
renderer.SetCurrentZ(0);
|
||
ctx.rcTexDest.clampFlipped(0, 1, 1, 0);
|
||
ctx.screenRect.shuntY(ctx.drawHeight);
|
||
if (isDebugFrame)
|
||
DebugLogRenderTargetContents("First bounce", renderer, fxTarget)
|
||
} else {
|
||
const paramArr = (ctx.layer || ctx.layout).GetEffectList().GetEffectParametersForIndex(effectType.GetIndex());
|
||
renderer.SetProgramParameters(ctx.renderTarget, ctx.rcTexDest, ctx.rcTexBounce, ctx.rcTexOrigin, ctx.layoutRect, 1 / ctx.drawWidth, 1 / ctx.drawHeight, ctx.layerScale, ctx.layerAngle, runtime.GetGameTime(), paramArr);
|
||
const renderSurface = (ctx.layer || ctx.layout).GetRenderTarget();
|
||
if (isDebugFrame)
|
||
DebugLogRenderTargetContents("Layer target", renderer, renderSurface);
|
||
renderer.DrawRenderTarget(renderSurface);
|
||
renderer.InvalidateRenderTarget(renderSurface);
|
||
runtime.GetCanvasManager().ReleaseAdditionalRenderTarget(renderSurface);
|
||
if (isDebugFrame)
|
||
DebugLogRenderTargetContents("First bounce", renderer, fxTarget)
|
||
}
|
||
}
|
||
function RenderBounce(ctx, effectType, isLast, i) {
|
||
const renderer = ctx.renderer;
|
||
const runtime = ctx.runtime;
|
||
let fxTarget;
|
||
let paramArr;
|
||
if (i === 0 && ctx.preDraw && ctx.inst)
|
||
ctx.screenRect.shuntY(ctx.drawHeight);
|
||
if (isLast) {
|
||
if (ctx.inst)
|
||
renderer.SetBlendMode(ctx.wi.GetBlendMode());
|
||
else if (ctx.layer)
|
||
renderer.SetBlendMode(ctx.layer.GetBlendMode());
|
||
fxTarget = ctx.renderTarget;
|
||
renderer.SetRenderTarget(fxTarget)
|
||
} else {
|
||
fxTarget = ctx.GetEffectRenderTarget(ctx.fxIndex);
|
||
renderer.SetRenderTarget(fxTarget);
|
||
if (isDebug)
|
||
renderer.ClearRgba(1, 0, 0, 1);
|
||
renderer.ClearRect2(ctx.clearRect)
|
||
}
|
||
if (ctx.inst)
|
||
paramArr = ctx.wi.GetInstanceEffectList().GetEffectParametersForIndex(effectType.GetIndex());
|
||
else
|
||
paramArr = (ctx.layer || ctx.layout).GetEffectList().GetEffectParametersForIndex(effectType.GetIndex());
|
||
renderer.SetProgramParameters(ctx.renderTarget, ctx.rcTexDest, ctx.rcTexBounce, ctx.rcTexOrigin, ctx.layoutRect, 1 / ctx.surfaceWidth, 1 / ctx.surfaceHeight, ctx.layerScale, ctx.layerAngle, runtime.GetGameTime(), paramArr);
|
||
const srcTarget = ctx.GetEffectRenderTarget(ctx.otherFxIndex);
|
||
renderer.SetTexture(srcTarget.GetTexture());
|
||
runtime.GetCanvasManager().SetDeviceTransform(renderer);
|
||
ctx.didChangeTransform = true;
|
||
tempQuad.setFromRect(ctx.screenRect);
|
||
renderer.Quad3(tempQuad, ctx.rcTexBounce);
|
||
if (!ctx.inst)
|
||
renderer.InvalidateRenderTarget(srcTarget);
|
||
if (isDebugFrame)
|
||
DebugLogRenderTargetContents("Bounce " + i, renderer, fxTarget)
|
||
}
|
||
function PostDraw(ctx, activeEffectTypes) {
|
||
const renderer = ctx.renderer;
|
||
if (ctx.layout) {
|
||
renderer.SetTextureFillMode();
|
||
renderer.SetRenderTarget(ctx.renderTarget);
|
||
const srcTarget = ctx.GetEffectRenderTarget(ctx.otherFxIndex);
|
||
renderer.CopyRenderTarget(srcTarget);
|
||
renderer.InvalidateRenderTarget(srcTarget);
|
||
return
|
||
}
|
||
const canvasManager = ctx.runtime.GetCanvasManager();
|
||
if (canvasManager.GetCurrentFullscreenScalingQuality() === "low") {
|
||
renderer.SetTextureFillMode();
|
||
canvasManager.SetDeviceTransform(renderer, canvasManager.GetDrawWidth(), canvasManager.GetDrawHeight());
|
||
ctx.didChangeTransform = true
|
||
} else
|
||
renderer.SetDeviceTransformTextureFillMode();
|
||
if (ctx.inst)
|
||
renderer.SetBlendMode(ctx.wi.GetBlendMode());
|
||
else if (ctx.layer)
|
||
renderer.SetBlendMode(ctx.layer.GetBlendMode());
|
||
renderer.SetRenderTarget(ctx.renderTarget);
|
||
const srcTarget = ctx.GetEffectRenderTarget(ctx.otherFxIndex);
|
||
renderer.SetTexture(srcTarget.GetTexture());
|
||
tempQuad.setFromRect(ctx.screenRect);
|
||
renderer.Quad3(tempQuad, ctx.rcTexBounce);
|
||
if (!ctx.inst)
|
||
renderer.InvalidateRenderTarget(srcTarget);
|
||
if (isDebugFrame)
|
||
DebugLogRenderTargetContents("Post-draw", renderer, ctx.renderTarget)
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const NAMES_REGEXP = new RegExp("<(.+?)>","g");
|
||
C3.TimelineManager = class TimelineManager extends C3.DefendedBase {
|
||
constructor(runtime) {
|
||
super();
|
||
this._runtime = runtime;
|
||
this._timelineDataManager = C3.New(C3.TimelineDataManager);
|
||
this._pluginInstance = null;
|
||
this._timelines = [];
|
||
this._timelinesByName = new Map;
|
||
this._objectClassToTimelineMap = new Map;
|
||
this._timelinesCreatedByTemplate = new Map;
|
||
this._scheduledTimelines = [];
|
||
this._playingTimelines = [];
|
||
this._hasRuntimeListeners = false;
|
||
this._changingLayout = false;
|
||
this._isTickingTimelines = false;
|
||
this._tickFunc = ()=>this._OnTick();
|
||
this._tick2Func = ()=>this._OnTick2();
|
||
this._beforeLayoutChange = ()=>this._OnBeforeChangeLayout();
|
||
this._layoutChange = ()=>this._OnAfterChangeLayout();
|
||
this._instanceDestroy = e=>this._OnInstanceDestroy(e.instance);
|
||
this._afterLoad = e=>this._OnAfterLoad();
|
||
this._destroyedWhileLoadingState = []
|
||
}
|
||
Release() {
|
||
this.RemoveRuntimeListeners();
|
||
this._tickFunc = null;
|
||
this._tick2Func = null;
|
||
this._beforeLayoutChange = null;
|
||
this._layoutChange = null;
|
||
this._instanceDestroy = null;
|
||
this._afterLoad = null;
|
||
for (const timeline of this._timelines) {
|
||
timeline.Stop();
|
||
timeline.Release()
|
||
}
|
||
C3.clearArray(this._timelines);
|
||
this._timelines = null;
|
||
this._timelineDataManager.Release();
|
||
this._timelineDataManager = null;
|
||
C3.clearArray(this._scheduledTimelines);
|
||
this._scheduledTimelines = null;
|
||
C3.clearArray(this._playingTimelines);
|
||
this._playingTimelines = null;
|
||
this._timelinesByName.clear();
|
||
this._timelinesByName = null;
|
||
this._objectClassToTimelineMap.clear();
|
||
this._objectClassToTimelineMap = null;
|
||
this._timelinesCreatedByTemplate.clear();
|
||
this._timelinesCreatedByTemplate = null;
|
||
C3.clearArray(this._destroyedWhileLoadingState);
|
||
this._destroyedWhileLoadingState = null;
|
||
this._runtime = null
|
||
}
|
||
AddRuntimeListeners() {
|
||
const dispatcher = this._runtime.Dispatcher();
|
||
dispatcher.addEventListener("pretick", this._tickFunc);
|
||
dispatcher.addEventListener("tick2", this._tick2Func);
|
||
dispatcher.addEventListener("beforelayoutchange", this._beforeLayoutChange);
|
||
dispatcher.addEventListener("layoutchange", this._layoutChange);
|
||
dispatcher.addEventListener("instancedestroy", this._instanceDestroy);
|
||
dispatcher.addEventListener("afterload", this._afterLoad)
|
||
}
|
||
RemoveRuntimeListeners() {
|
||
const dispatcher = this._runtime.Dispatcher();
|
||
dispatcher.removeEventListener("pretick", this._tickFunc);
|
||
dispatcher.removeEventListener("tick2", this._tick2Func);
|
||
dispatcher.removeEventListener("beforelayoutchange", this._beforeLayoutChange);
|
||
dispatcher.removeEventListener("layoutchange", this._layoutChange);
|
||
dispatcher.removeEventListener("instancedestroy", this._instanceDestroy);
|
||
dispatcher.removeEventListener("afterload", this._afterLoad)
|
||
}
|
||
Create(timelineData) {
|
||
this._timelineDataManager.Add(timelineData);
|
||
const timeline = C3.TimelineState.CreateInitial(timelineData, this);
|
||
this.Add(timeline);
|
||
this.SetTimelineObjectClassesToMap(timeline);
|
||
this._timelinesCreatedByTemplate.set(timeline.GetName(), 0)
|
||
}
|
||
CreateFromTemplate(template) {
|
||
const timelineDataManager = this.GetTimelineDataManager();
|
||
const templateName = template.GetTemplateName();
|
||
const timelineDataItem = timelineDataManager.Get(templateName);
|
||
const timeline = C3.TimelineState.CreateFromTemplate(`${templateName}:${this._timelinesCreatedByTemplate.get(templateName)}`, timelineDataItem, this);
|
||
this._IncreaseTemplateTimelinesCount(templateName);
|
||
this.Add(timeline);
|
||
return timeline
|
||
}
|
||
_IncreaseTemplateTimelinesCount(templateName) {
|
||
this._timelinesCreatedByTemplate.set(templateName, this._timelinesCreatedByTemplate.get(templateName) + 1)
|
||
}
|
||
_SetCreatedTemplateTimelinesCount() {
|
||
for (const timeline of this._timelines) {
|
||
if (timeline.IsTemplate())
|
||
continue;
|
||
const templateName = timeline.GetTemplateName();
|
||
this._IncreaseTemplateTimelinesCount(templateName)
|
||
}
|
||
}
|
||
_ClearCreatedTemplateTimelinesCount() {
|
||
for (const templateName of this._timelinesCreatedByTemplate.keys())
|
||
this._timelinesCreatedByTemplate.set(templateName, 0)
|
||
}
|
||
Add(timeline) {
|
||
this._timelines.push(timeline);
|
||
this._timelinesByName.set(timeline.GetName().toLowerCase(), timeline)
|
||
}
|
||
Remove(timeline) {
|
||
if (timeline.IsTemplate())
|
||
return;
|
||
C3.arrayFindRemove(this._timelines, timeline);
|
||
C3.arrayFindRemove(this._scheduledTimelines, timeline);
|
||
C3.arrayFindRemove(this._playingTimelines, timeline);
|
||
this._timelinesByName.delete(timeline.GetName().toLowerCase());
|
||
this.RemoveTimelineFromObjectClassMap(timeline);
|
||
if (!timeline.IsReleased())
|
||
timeline.Release()
|
||
}
|
||
Trigger(method) {
|
||
this._runtime.Trigger(method, this._pluginInstance, null)
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetTimelineDataManager() {
|
||
return this._timelineDataManager
|
||
}
|
||
SetPluginInstance(inst) {
|
||
this._pluginInstance = inst
|
||
}
|
||
GetPluginInstance() {
|
||
return this._pluginInstance
|
||
}
|
||
*GetTimelines() {
|
||
for (const timeline of this._timelines)
|
||
yield timeline
|
||
}
|
||
SetTimelineObjectClassToMap(objectClass, timeline) {
|
||
if (!this._objectClassToTimelineMap.has(objectClass))
|
||
this._objectClassToTimelineMap.set(objectClass, new Set);
|
||
this._objectClassToTimelineMap.get(objectClass).add(timeline)
|
||
}
|
||
SetTimelineObjectClassesToMap(timeline) {
|
||
for (const objectClass of timeline.GetObjectClasses())
|
||
this.SetTimelineObjectClassToMap(objectClass, timeline)
|
||
}
|
||
RemoveTimelineFromObjectClassMap(timeline) {
|
||
for (const [objectClass,timelines] of this._objectClassToTimelineMap.entries())
|
||
if (timelines.has(timeline)) {
|
||
timelines.delete(timeline);
|
||
if (timelines.size === 0)
|
||
this._objectClassToTimelineMap.delete(objectClass)
|
||
}
|
||
}
|
||
GetTimelinesForObjectClass(objectClass) {
|
||
if (!this._objectClassToTimelineMap.has(objectClass))
|
||
return;
|
||
return this._objectClassToTimelineMap.get(objectClass)
|
||
}
|
||
GetTimelineOfTemplateForInstances(templateTimeline, instancesObject) {
|
||
if (!instancesObject)
|
||
return;
|
||
for (const timeline of this._timelines) {
|
||
const found = instancesObject.every(io=>{
|
||
return timeline.HasTrackInstance(io.instance, io.trackId)
|
||
}
|
||
);
|
||
if (found)
|
||
if (timeline.GetName().includes(templateTimeline.GetName()))
|
||
return timeline
|
||
}
|
||
}
|
||
GetTimelineByName(name) {
|
||
return this._timelinesByName.get(name.toLowerCase()) || null
|
||
}
|
||
GetScheduledOrPlayingTimelineByName(name) {
|
||
for (const timeline of this._scheduledTimelines)
|
||
if (timeline.GetName() === name)
|
||
return timeline;
|
||
for (const timeline of this._playingTimelines)
|
||
if (timeline.GetName() === name)
|
||
return timeline;
|
||
return null
|
||
}
|
||
*GetTimelinesByName(name) {
|
||
if (NAMES_REGEXP.test(name)) {
|
||
NAMES_REGEXP.lastIndex = 0;
|
||
let match;
|
||
const uniqueNames = new Set;
|
||
do {
|
||
match = NAMES_REGEXP.exec(name);
|
||
if (match) {
|
||
const names = match[1].split(",");
|
||
for (const name of names)
|
||
uniqueNames.add(name)
|
||
}
|
||
} while (match);
|
||
for (const name of uniqueNames.values()) {
|
||
const timeline = this.GetTimelineByName(name);
|
||
if (timeline)
|
||
yield timeline
|
||
}
|
||
uniqueNames.clear()
|
||
} else {
|
||
const timeline = this.GetTimelineByName(name);
|
||
if (timeline)
|
||
yield timeline
|
||
}
|
||
}
|
||
*GetTimelinesByTags(tags) {
|
||
for (const timeline of this._timelines)
|
||
if (timeline.HasTags(tags))
|
||
yield timeline
|
||
}
|
||
AddScheduledTimeline(timeline) {
|
||
if (!this._scheduledTimelines.includes(timeline))
|
||
this._scheduledTimelines.push(timeline);
|
||
this._MaybeEnableRuntimeListeners()
|
||
}
|
||
RemovePlayingTimeline(timeline) {
|
||
C3.arrayFindRemove(this._playingTimelines, timeline);
|
||
this._MaybeDisableRuntimeListeners()
|
||
}
|
||
ScheduleTimeline(timeline) {
|
||
if (this._playingTimelines.includes(timeline)) {
|
||
timeline.SetPlaying(true);
|
||
timeline.SetScheduled(false);
|
||
timeline.SetMarkedForRemoval(false)
|
||
} else {
|
||
timeline.SetPlaying(false);
|
||
timeline.SetScheduled(true);
|
||
timeline.SetMarkedForRemoval(false);
|
||
if (!this._scheduledTimelines.includes(timeline))
|
||
this._scheduledTimelines.push(timeline)
|
||
}
|
||
this._MaybeEnableRuntimeListeners()
|
||
}
|
||
DeScheduleTimeline(timeline) {
|
||
timeline.SetPlaying(false);
|
||
timeline.SetScheduled(false);
|
||
timeline.ResolvePlayPromise();
|
||
C3.arrayFindRemove(this._scheduledTimelines, timeline);
|
||
this._MaybeDisableRuntimeListeners()
|
||
}
|
||
CompleteTimeline(timeline) {
|
||
timeline.SetPlaying(false);
|
||
timeline.SetScheduled(false);
|
||
timeline.SetMarkedForRemoval(true)
|
||
}
|
||
CompleteTimelineAndResolve(timeline) {
|
||
this.CompleteTimeline(timeline);
|
||
timeline.ResolvePlayPromise()
|
||
}
|
||
_OnTick() {
|
||
if (this.GetRuntime().IsLoadingState())
|
||
return;
|
||
if (!this._hasRuntimeListeners)
|
||
return;
|
||
if (this._changingLayout)
|
||
return;
|
||
let renderChange = false;
|
||
this._isTickingTimelines = true;
|
||
while (this._scheduledTimelines.length) {
|
||
const timeline = this._scheduledTimelines.pop();
|
||
timeline.SetInitialState();
|
||
this._playingTimelines.push(timeline)
|
||
}
|
||
const dt = this._runtime.GetDt();
|
||
const ts = this._runtime.GetTimeScale();
|
||
for (const t of this._playingTimelines) {
|
||
if (t.IsMarkedForRemoval())
|
||
continue;
|
||
const change = t.Tick(dt, ts);
|
||
if (!renderChange && change)
|
||
renderChange = true
|
||
}
|
||
this._isTickingTimelines = false;
|
||
if (renderChange)
|
||
this.GetRuntime().UpdateRender()
|
||
}
|
||
_OnTick2() {
|
||
if (this.GetRuntime().IsLoadingState())
|
||
return;
|
||
if (!this._hasRuntimeListeners)
|
||
return;
|
||
if (this._changingLayout)
|
||
return;
|
||
let timelinesToRemove;
|
||
for (const t of this._playingTimelines) {
|
||
if (!t.IsMarkedForRemoval())
|
||
continue;
|
||
if (!timelinesToRemove)
|
||
timelinesToRemove = new Set;
|
||
this._MaybeExecuteTimelineFinishTriggers(t);
|
||
timelinesToRemove.add(t)
|
||
}
|
||
if (timelinesToRemove)
|
||
C3.arrayRemoveAllInSet(this._playingTimelines, timelinesToRemove);
|
||
this._MaybeDisableRuntimeListeners()
|
||
}
|
||
_MaybeExecuteTimelineFinishTriggers(timeline) {
|
||
if (timeline.IsReleased())
|
||
return;
|
||
if (!timeline.HasValidTracks())
|
||
return;
|
||
if (timeline.IsComplete() && timeline.InitialStateSet())
|
||
timeline.FinishTriggers()
|
||
}
|
||
_MaybeEnableRuntimeListeners() {
|
||
if (this._hasRuntimeListeners)
|
||
return;
|
||
this._hasRuntimeListeners = true
|
||
}
|
||
_MaybeDisableRuntimeListeners() {
|
||
if (this._playingTimelines.length)
|
||
return;
|
||
if (this._scheduledTimelines.length)
|
||
return;
|
||
if (this._isTickingTimelines)
|
||
return;
|
||
this._hasRuntimeListeners = false
|
||
}
|
||
_OnBeforeChangeLayout() {
|
||
this._changingLayout = true;
|
||
while (this._scheduledTimelines.length)
|
||
this.DeScheduleTimeline(this._scheduledTimelines.pop());
|
||
const timelinesToRemove = new Set;
|
||
for (const t of this._playingTimelines) {
|
||
const remove = t._OnBeforeChangeLayout();
|
||
if (remove)
|
||
timelinesToRemove.add(t)
|
||
}
|
||
C3.arrayRemoveAllInSet(this._playingTimelines, timelinesToRemove);
|
||
this._MaybeDisableRuntimeListeners();
|
||
for (const timeline of this._timelines)
|
||
timeline.CleanCaches()
|
||
}
|
||
_OnAfterChangeLayout() {
|
||
this._changingLayout = false
|
||
}
|
||
_OnInstanceDestroy(instance) {
|
||
const objectClass = instance.GetObjectClass();
|
||
const timelines = this.GetTimelinesForObjectClass(objectClass);
|
||
if (!timelines)
|
||
return;
|
||
if (this._runtime.IsLoadingState())
|
||
this._destroyedWhileLoadingState.push(instance);
|
||
else
|
||
for (const timeline of timelines) {
|
||
if (timeline.IsTemplate())
|
||
continue;
|
||
if (timeline.IsReleased()) {
|
||
this.Remove(timeline);
|
||
continue
|
||
}
|
||
if (!timeline.HasValidTracks()) {
|
||
this._MaybeExecuteTimelineFinishTriggers(timeline);
|
||
this.Remove(timeline)
|
||
}
|
||
}
|
||
}
|
||
_OnAfterLoad() {
|
||
for (const destroyedInstance of this._destroyedWhileLoadingState)
|
||
this._OnInstanceDestroy(destroyedInstance);
|
||
C3.clearArray(this._destroyedWhileLoadingState)
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"timelinesJson": this._SaveTimelinesToJson(),
|
||
"scheduledTimelinesJson": this._SaveScheduledTimelinesToJson(),
|
||
"playingTimelinesJson": this._SavePlayingTimelinesToJson(),
|
||
"hasRuntimeListeners": this._hasRuntimeListeners,
|
||
"changingLayout": this._changingLayout,
|
||
"isTickingTimelines": this._isTickingTimelines
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
this._ClearCreatedTemplateTimelinesCount();
|
||
this._LoadTimelinesFromJson(o["timelinesJson"]);
|
||
this._LoadScheduledTimelinesFromJson(o["scheduledTimelinesJson"]);
|
||
this._LoadPlayingTimelinesFromJson(o["playingTimelinesJson"]);
|
||
this._hasRuntimeListeners = !o["hasRuntimeListeners"];
|
||
this._changingLayout = !!o["changingLayout"];
|
||
this._isTickingTimelines = !!o["isTickingTimelines"];
|
||
this._SetCreatedTemplateTimelinesCount();
|
||
this._MaybeEnableRuntimeListeners();
|
||
this._MaybeDisableRuntimeListeners()
|
||
}
|
||
_SaveTimelinesToJson() {
|
||
return this._timelines.map(timelineState=>timelineState._SaveToJson())
|
||
}
|
||
_LoadTimelinesFromJson(timelinesJson) {
|
||
for (const timelineJson of timelinesJson) {
|
||
let timeline = this.GetTimelineByName(timelineJson["name"]);
|
||
if (timeline)
|
||
timeline._LoadFromJson(timelineJson);
|
||
else {
|
||
const templateName = this._GetTemplateNameFromJson(timelineJson);
|
||
if (!templateName)
|
||
continue;
|
||
const templateTimeline = this.GetTimelineByName(templateName);
|
||
timeline = this.CreateFromTemplate(templateTimeline);
|
||
timeline._LoadFromJson(timelineJson)
|
||
}
|
||
if (!timeline.HasTracks())
|
||
this.Remove(timeline)
|
||
}
|
||
}
|
||
_GetTemplateNameFromJson(timelineJson) {
|
||
const name = timelineJson["name"];
|
||
const nameParts = name.split(":");
|
||
if (!nameParts || nameParts.length !== 2)
|
||
return null;
|
||
return nameParts[0]
|
||
}
|
||
_SaveScheduledTimelinesToJson() {
|
||
return this._SaveTimelines(this._scheduledTimelines)
|
||
}
|
||
_LoadScheduledTimelinesFromJson(scheduledTimelinesJson) {
|
||
this._LoadTimelines(scheduledTimelinesJson, this._scheduledTimelines)
|
||
}
|
||
_SavePlayingTimelinesToJson() {
|
||
return this._SaveTimelines(this._playingTimelines)
|
||
}
|
||
_LoadPlayingTimelinesFromJson(playingTimelinesJson) {
|
||
this._LoadTimelines(playingTimelinesJson, this._playingTimelines)
|
||
}
|
||
_IsTimelineInJson(timeline, json) {
|
||
for (const name of json)
|
||
if (name === timeline.GetName())
|
||
return true;
|
||
return false
|
||
}
|
||
_SaveTimelines(collection) {
|
||
return collection.map(t=>t.GetName())
|
||
}
|
||
_LoadTimelines(timelinesJson, collection) {
|
||
const timelinesToRemove = new Set;
|
||
for (const timeline of collection)
|
||
if (!this._IsTimelineInJson(timeline, timelinesJson))
|
||
timelinesToRemove.add(timeline);
|
||
C3.arrayRemoveAllInSet(collection, timelinesToRemove);
|
||
const ff = tn=>t=>t.GetName() === tn;
|
||
for (const name of timelinesJson) {
|
||
const timeline = this.GetTimelineByName(name);
|
||
if (timeline) {
|
||
const t = collection.find(ff(name));
|
||
if (!t)
|
||
collection.push(timeline)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const PING_PONG_BEGIN = 0;
|
||
const PING_PONG_END = 1;
|
||
C3.TimelineState = class Timeline extends C3.DefendedBase {
|
||
constructor(name, timelineDataItem, timelineManager) {
|
||
super();
|
||
this._runtime = timelineManager.GetRuntime();
|
||
this._timelineManager = timelineManager;
|
||
this._timelineDataItem = timelineDataItem;
|
||
this._name = name;
|
||
this._tracks = [];
|
||
for (const trackDataItem of this._timelineDataItem.GetTrackData().trackDataItems())
|
||
this._tracks.push(C3.TrackState.Create(this, trackDataItem));
|
||
this._playPromise = null;
|
||
this._playResolve = null;
|
||
this._playheadTime = C3.New(C3.KahanSum);
|
||
this._playheadTime.Set(0);
|
||
this._playbackRate = 1;
|
||
this._pingPongState = PING_PONG_BEGIN;
|
||
this._currentRepeatCount = 1;
|
||
this._isPlaying = false;
|
||
this._isScheduled = false;
|
||
this._initialStateSet = false;
|
||
this._complete = true;
|
||
this._released = false;
|
||
this._markedForRemoval = false;
|
||
this._completedTick = -1;
|
||
this._implicitPause = false;
|
||
this._isTemplate = false;
|
||
this._finishedTriggers = false;
|
||
this._firstTick = false;
|
||
this._lastDelta = NaN;
|
||
this._tags = [""];
|
||
this._stringTags = "";
|
||
this._tagsChanged = false
|
||
}
|
||
static CreateInitial(timelineDataJson, timelineManager) {
|
||
const timelineDataManager = timelineManager.GetTimelineDataManager();
|
||
const nameId = timelineDataManager.GetNameId();
|
||
const timelineDataItem = timelineDataManager.Get(timelineDataJson[nameId]);
|
||
const timeline = C3.New(C3.TimelineState, timelineDataJson[nameId], timelineDataItem, timelineManager);
|
||
timeline.SetIsTemplate(true);
|
||
return timeline
|
||
}
|
||
static CreateFromTemplate(name, timelineDataItem, timelineManager) {
|
||
return C3.New(C3.TimelineState, name, timelineDataItem, timelineManager)
|
||
}
|
||
static get WORLD_INSTANCE_BOX_CHANGE() {
|
||
return 1
|
||
}
|
||
static get LAYOUT_RENDER_CHANGE() {
|
||
return C3.nextHighestPowerOfTwo(1)
|
||
}
|
||
Release() {
|
||
if (this.IsReleased())
|
||
return;
|
||
this._timelineManager.DeScheduleTimeline(this);
|
||
this._timelineManager.CompleteTimelineAndResolve(this);
|
||
for (const track of this._tracks)
|
||
track.Release();
|
||
C3.clearArray(this._tracks);
|
||
this._tracks = null;
|
||
this._playheadTime.Release();
|
||
this._playheadTime = null;
|
||
this._runtime = null;
|
||
this._timelineManager = null;
|
||
this._timelineDataItem = null;
|
||
this._released = true;
|
||
this._playPromise = null;
|
||
this._playResolve = null
|
||
}
|
||
GetTimelineManager() {
|
||
return this._timelineManager
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetTracks() {
|
||
return this._tracks
|
||
}
|
||
GetSimilarPropertyTracks(instance, sourceAdapter, propertyName) {
|
||
const ret = [];
|
||
for (const track of this._tracks) {
|
||
if (instance !== track.GetInstance())
|
||
continue;
|
||
const propertyTrack = track.GetPropertyTrack(propertyName);
|
||
if (!propertyTrack)
|
||
continue;
|
||
if (sourceAdapter.constructor !== propertyTrack.GetSourceAdapter().constructor)
|
||
continue;
|
||
ret.push(propertyTrack)
|
||
}
|
||
return ret
|
||
}
|
||
HasTracks() {
|
||
return !!this._tracks.length
|
||
}
|
||
GetTrackById(trackId) {
|
||
for (const track of this._tracks)
|
||
if (C3.equalsNoCase(track.GetId(), trackId))
|
||
return track;
|
||
return null
|
||
}
|
||
SetName(name) {
|
||
this._name = name
|
||
}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
GetTimelineDataItem() {
|
||
return this._timelineDataItem
|
||
}
|
||
GetTemplateName() {
|
||
return this._timelineDataItem.GetName()
|
||
}
|
||
GetTotalTime() {
|
||
return this._timelineDataItem.GetTotalTime()
|
||
}
|
||
SetTotalTime(tt) {
|
||
this._timelineDataItem.SetTotalTime(tt)
|
||
}
|
||
GetStep() {
|
||
return this._timelineDataItem.GetStep()
|
||
}
|
||
SetStep(s) {
|
||
this._timelineDataItem.SetStep(s)
|
||
}
|
||
GetInterpolationMode() {
|
||
return this._timelineDataItem.GetInterpolationMode()
|
||
}
|
||
SetInterpolationMode(im) {
|
||
this._timelineDataItem.SetInterpolationMode(im)
|
||
}
|
||
GetResultMode() {
|
||
return this._timelineDataItem.GetResultMode()
|
||
}
|
||
SetResultMode(rm) {
|
||
this._timelineDataItem.GetResultMode(rm)
|
||
}
|
||
SetEase(e) {
|
||
for (const track of this.GetTracks())
|
||
track.SetEase(e)
|
||
}
|
||
GetLoop() {
|
||
return this._timelineDataItem.GetLoop()
|
||
}
|
||
SetLoop(l) {
|
||
return this._timelineDataItem.SetLoop(l)
|
||
}
|
||
GetPingPong() {
|
||
return this._timelineDataItem.GetPingPong()
|
||
}
|
||
SetPingPong(p) {
|
||
return this._timelineDataItem.SetPingPong(p)
|
||
}
|
||
GetRepeatCount() {
|
||
return this._timelineDataItem.GetRepeatCount()
|
||
}
|
||
SetPlaybackRate(r) {
|
||
return this._playbackRate = r
|
||
}
|
||
GetPlaybackRate() {
|
||
return this._playbackRate
|
||
}
|
||
IsForwardPlayBack() {
|
||
if (!this.IsPlaying())
|
||
return true;
|
||
return this._playbackRate > 0
|
||
}
|
||
GetPlayPromise() {
|
||
if (this._playPromise)
|
||
return this._playPromise;
|
||
this._playPromise = new Promise(resolve=>{
|
||
this._playResolve = resolve
|
||
}
|
||
);
|
||
return this._playPromise
|
||
}
|
||
ResolvePlayPromise() {
|
||
if (!this._playPromise)
|
||
return;
|
||
this._playResolve();
|
||
this._playPromise = null;
|
||
this._playResolve = null
|
||
}
|
||
SetTags(tags) {
|
||
this._tags = C3.TimelineState._GetTagArray(tags);
|
||
this._tagsChanged = true
|
||
}
|
||
GetTags() {
|
||
return this._tags
|
||
}
|
||
GetStringTags() {
|
||
if (this._tagsChanged)
|
||
this._stringTags = this._tags.join(" ");
|
||
this._tagsChanged = false;
|
||
return this._stringTags
|
||
}
|
||
HasTags(tags) {
|
||
if (!this._tags)
|
||
return false;
|
||
if (!this._tags.length)
|
||
return false;
|
||
const t = C3.TimelineState._GetTagArray(tags);
|
||
if (!t)
|
||
return false;
|
||
if (!t.length)
|
||
return false;
|
||
return t.every(C3.TimelineState._HasTag, this)
|
||
}
|
||
OnStarted() {
|
||
C3.Plugins.Timeline.Cnds.SetTriggerTimeline(this);
|
||
this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimelineStarted);
|
||
this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimelineStartedByName);
|
||
this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimelineStartedByTags);
|
||
this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnAnyTimelineStarted);
|
||
C3.Plugins.Timeline.Cnds.SetTriggerTimeline(null)
|
||
}
|
||
OnCompleted() {
|
||
this._completedTick = this._runtime.GetTickCount()
|
||
}
|
||
FinishTriggers() {
|
||
if (this._finishedTriggers)
|
||
return;
|
||
this._finishedTriggers = true;
|
||
C3.Plugins.Timeline.Cnds.SetTriggerTimeline(this);
|
||
this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimelineFinished);
|
||
this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimelineFinishedByName);
|
||
this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimelineFinishedByTags);
|
||
this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnAnyTimelineFinished);
|
||
C3.Plugins.Timeline.Cnds.SetTriggerTimeline(null)
|
||
}
|
||
SetPlaying(p) {
|
||
this._isPlaying = p
|
||
}
|
||
IsCompletedTick() {
|
||
return this._completedTick === this._runtime.GetTickCount()
|
||
}
|
||
IsPlaying(playingOnly=false) {
|
||
if (this.IsCompletedTick())
|
||
return true;
|
||
if (this.IsScheduled() && !playingOnly)
|
||
return true;
|
||
return this._isPlaying
|
||
}
|
||
_IsPlaying() {
|
||
return this.IsPlaying(true)
|
||
}
|
||
IsPaused() {
|
||
return this._IsPaused()
|
||
}
|
||
_IsPaused() {
|
||
if (this.IsReleased())
|
||
return false;
|
||
if (this.IsScheduled())
|
||
return false;
|
||
if (this._IsPlaying())
|
||
return false;
|
||
if (this.IsComplete())
|
||
return false;
|
||
return true
|
||
}
|
||
SetScheduled(s) {
|
||
this._isScheduled = s
|
||
}
|
||
IsScheduled() {
|
||
return this._isScheduled
|
||
}
|
||
SetComplete(c) {
|
||
this._complete = c;
|
||
const t = this.GetTime();
|
||
if (t <= 0 || t >= this.GetTotalTime())
|
||
this._complete = true
|
||
}
|
||
IsComplete() {
|
||
return this._complete
|
||
}
|
||
IsReleased() {
|
||
return this._released
|
||
}
|
||
SetMarkedForRemoval(mfr) {
|
||
this._markedForRemoval = mfr
|
||
}
|
||
IsMarkedForRemoval() {
|
||
return this._markedForRemoval
|
||
}
|
||
SetImplicitPause(ip) {
|
||
this._implicitPause = ip
|
||
}
|
||
IsImplicitPause() {
|
||
return this._implicitPause
|
||
}
|
||
SetIsTemplate(it) {
|
||
this._isTemplate = !!it
|
||
}
|
||
IsTemplate() {
|
||
return this._isTemplate
|
||
}
|
||
InitialStateSet() {
|
||
return this._initialStateSet
|
||
}
|
||
GetTime() {
|
||
return this._playheadTime.Get()
|
||
}
|
||
SetTime(time) {
|
||
const lastGlobalTime = this.GetTime();
|
||
this._SetTime(time);
|
||
this.SetComplete(false);
|
||
if (!this.IsComplete())
|
||
this.SetImplicitPause(true);
|
||
if (!this._IsPlaying() && !this.IsScheduled() && this._initialStateSet)
|
||
;
|
||
else if (!this._IsPlaying() && !this.IsScheduled() && !this._initialStateSet)
|
||
this.SetInitialStateFromSetTime();
|
||
else if (this._IsPlaying())
|
||
this.Stop();
|
||
else if (this.IsScheduled()) {
|
||
this._timelineManager.DeScheduleTimeline(this);
|
||
this.SetInitialStateFromSetTime()
|
||
}
|
||
const renderChange = this._Interpolate(time, false, true, true, lastGlobalTime);
|
||
if (renderChange)
|
||
this.GetRuntime().UpdateRender();
|
||
this._OnSetTime()
|
||
}
|
||
_SetTime(time) {
|
||
if (time < 0)
|
||
this._playheadTime.Set(0);
|
||
else if (time >= this.GetTotalTime())
|
||
this._playheadTime.Set(this.GetTotalTime());
|
||
else
|
||
this._playheadTime.Set(time)
|
||
}
|
||
_OnSetTime() {
|
||
if (!C3.Plugins.Timeline || this.constructor !== C3.TimelineState)
|
||
return;
|
||
C3.Plugins.Timeline.Cnds.SetTriggerTimeline(this);
|
||
this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimeSet);
|
||
this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimeSetByName);
|
||
this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimeSetByTags);
|
||
C3.Plugins.Timeline.Cnds.SetTriggerTimeline(null)
|
||
}
|
||
_CanResume() {
|
||
if (this.GetLoop())
|
||
return true;
|
||
else if (this.GetPingPong() && this._pingPongState === PING_PONG_END)
|
||
if (this.IsForwardPlayBack()) {
|
||
if (this.GetTime() >= this.GetTotalTime())
|
||
return false
|
||
} else {
|
||
if (this.GetTime() <= 0)
|
||
return false
|
||
}
|
||
else if (!this.GetLoop() && !this.GetPingPong())
|
||
if (this.IsForwardPlayBack()) {
|
||
if (this.GetTime() >= this.GetTotalTime())
|
||
return false
|
||
} else if (this.GetTime() <= 0)
|
||
return false;
|
||
return true
|
||
}
|
||
Resume() {
|
||
if (this.IsReleased())
|
||
return;
|
||
if (this._CanResume())
|
||
this.Play(true)
|
||
}
|
||
Play(resume=false) {
|
||
if (this.IsReleased())
|
||
return false;
|
||
if (this.IsScheduled())
|
||
return false;
|
||
if (this._IsPlaying() && this.IsCompletedTick())
|
||
return this._SchedulePlayingTimeline();
|
||
if (this._IsPlaying())
|
||
return false;
|
||
if (!this.IsComplete() && !resume && !this.IsImplicitPause())
|
||
return false;
|
||
return this._ScheduleStoppedTimeline()
|
||
}
|
||
_SchedulePlayingTimeline() {
|
||
this.SetImplicitPause(false);
|
||
this._timelineManager.RemovePlayingTimeline(this);
|
||
this._timelineManager.ScheduleTimeline(this);
|
||
this.GetPlayPromise();
|
||
return true
|
||
}
|
||
_ScheduleStoppedTimeline() {
|
||
this.SetImplicitPause(false);
|
||
this._timelineManager.ScheduleTimeline(this);
|
||
this.GetPlayPromise();
|
||
return true
|
||
}
|
||
Stop(completed=false) {
|
||
if (this.IsReleased())
|
||
return;
|
||
this.SetComplete(completed);
|
||
this._timelineManager.CompleteTimeline(this);
|
||
if (this.IsComplete())
|
||
this.ResolvePlayPromise()
|
||
}
|
||
Reset(render=true, beforeChangeLayout=false) {
|
||
if (this.IsReleased())
|
||
return;
|
||
if (!this._IsPlaying() && this.IsScheduled())
|
||
return this._timelineManager.DeScheduleTimeline(this);
|
||
if (this.IsComplete())
|
||
return;
|
||
this.Stop(true);
|
||
if (this.IsForwardPlayBack())
|
||
this._SetTime(0);
|
||
else
|
||
this._SetTime(this.GetTotalTime());
|
||
let renderChange;
|
||
const time = this.GetTime();
|
||
if (beforeChangeLayout)
|
||
renderChange = this._InterpolateBeforeChangeLayout(time);
|
||
else
|
||
renderChange = this._Interpolate(time, false, false, true);
|
||
if (render)
|
||
this._OnSetTime();
|
||
if (renderChange && render)
|
||
this.GetRuntime().UpdateRender()
|
||
}
|
||
ResetBeforeChangeLayout() {
|
||
this.Reset(false, true)
|
||
}
|
||
_InterpolateBeforeChangeLayout(time) {
|
||
this._Interpolate(time, false, false, true, NaN, false, true)
|
||
}
|
||
_OnBeforeChangeLayout() {
|
||
if (this.IsReleased())
|
||
return true;
|
||
if (this.HasValidGlobalTracks())
|
||
return false;
|
||
this._timelineManager.CompleteTimeline(this);
|
||
this.ResetBeforeChangeLayout();
|
||
return true
|
||
}
|
||
SetInitialStateFromSetTime() {
|
||
this.SetInitialState(true)
|
||
}
|
||
SetInitialState(fromSetTime) {
|
||
if (this.IsMarkedForRemoval())
|
||
return;
|
||
if (fromSetTime) {
|
||
this._initialStateSet = true;
|
||
this._firstTick = true;
|
||
for (const track of this._tracks)
|
||
track.SetInitialState()
|
||
} else {
|
||
this.SetPlaying(true);
|
||
this.SetScheduled(false);
|
||
this.OnStarted();
|
||
if (this.IsComplete()) {
|
||
this._completedTick = -1;
|
||
this._pingPongState = PING_PONG_BEGIN;
|
||
this._currentRepeatCount = 1;
|
||
this._complete = false;
|
||
this._finishedTriggers = false;
|
||
this._initialStateSet = true;
|
||
this._firstTick = true;
|
||
if (this.IsForwardPlayBack())
|
||
this._SetTime(0);
|
||
else
|
||
this._SetTime(this.GetTotalTime());
|
||
for (const track of this._tracks)
|
||
track.SetInitialState()
|
||
} else {
|
||
this._firstTick = true;
|
||
for (const track of this._tracks)
|
||
track.SetResumeState()
|
||
}
|
||
}
|
||
}
|
||
Tick(deltaTime, timeScale) {
|
||
if (deltaTime === 0 && this._lastDelta === 0)
|
||
return;
|
||
this._lastDelta = deltaTime;
|
||
const lastTime = this.GetTime();
|
||
const newDeltaTime = deltaTime * timeScale * this._playbackRate;
|
||
this._SetTime(lastTime + newDeltaTime);
|
||
let complete;
|
||
if (!this.GetLoop() && !this.GetPingPong())
|
||
complete = this._SimpleCompleteCheck();
|
||
else if (this.GetLoop() && !this.GetPingPong())
|
||
complete = this._LoopCompleteCheck();
|
||
else if (!this.GetLoop() && this.GetPingPong())
|
||
complete = this._PingPongCompleteCheck();
|
||
else if (this.GetLoop() && this.GetPingPong())
|
||
complete = this._LoopPingPongCompleteCheck();
|
||
if (complete) {
|
||
for (const track of this._tracks)
|
||
track.SetEndState();
|
||
this.Stop(true);
|
||
this.OnCompleted();
|
||
return true
|
||
} else
|
||
return this._Interpolate(this.GetTime(), true, false, false, lastTime, true)
|
||
}
|
||
_Interpolate(time, isTicking=false, setTime=false, ensureValue=false, lastTime=NaN, onTickCall=false, ignoreGlobals=false) {
|
||
let renderChange = false;
|
||
for (const track of this._tracks)
|
||
track.BeforeInterpolate();
|
||
for (const track of this._tracks) {
|
||
let t = time;
|
||
if (typeof lastTime === "number") {
|
||
const globalTime = this.GetTime();
|
||
const localTime = globalTime - track.GetStartOffset();
|
||
const lastLocalTime = lastTime - track.GetStartOffset();
|
||
if (localTime < 0 && lastLocalTime > 0) {
|
||
t = track.GetStartOffset();
|
||
this._SetTime(t)
|
||
}
|
||
}
|
||
const change = track.Interpolate(t, isTicking, setTime, ensureValue, this._firstTick, ignoreGlobals);
|
||
if (!renderChange && change)
|
||
renderChange = true
|
||
}
|
||
for (const track of this._tracks)
|
||
track.AfterInterpolate();
|
||
if (this._firstTick && onTickCall)
|
||
this._firstTick = false;
|
||
return renderChange
|
||
}
|
||
_SimpleCompleteCheck() {
|
||
if (this.IsForwardPlayBack()) {
|
||
if (this.GetTime() >= this.GetTotalTime())
|
||
if (this._currentRepeatCount < this.GetRepeatCount()) {
|
||
this._currentRepeatCount++;
|
||
this._SetTime(0)
|
||
} else {
|
||
this._SetTime(this.GetTotalTime());
|
||
return true
|
||
}
|
||
} else if (this.GetTime() <= 0)
|
||
if (this._currentRepeatCount < this.GetRepeatCount()) {
|
||
this._currentRepeatCount++;
|
||
this._SetTime(this.GetTotalTime())
|
||
} else {
|
||
this._SetTime(0);
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
_LoopCompleteCheck() {
|
||
if (this.IsForwardPlayBack()) {
|
||
if (this.GetTime() >= this.GetTotalTime())
|
||
this._SetTime(0)
|
||
} else if (this.GetTime() <= 0)
|
||
this._SetTime(this.GetTotalTime());
|
||
return false
|
||
}
|
||
_PingPongCompleteCheck() {
|
||
if (this.IsForwardPlayBack()) {
|
||
if (this.GetTime() >= this.GetTotalTime()) {
|
||
this._SetTime(this.GetTotalTime());
|
||
this.SetPlaybackRate(this.GetPlaybackRate() * -1);
|
||
if (this._pingPongState === PING_PONG_END)
|
||
if (this._currentRepeatCount < this.GetRepeatCount()) {
|
||
this._currentRepeatCount++;
|
||
this._pingPongState = PING_PONG_BEGIN
|
||
} else
|
||
return true;
|
||
else if (this._pingPongState === PING_PONG_BEGIN)
|
||
this._pingPongState = PING_PONG_END
|
||
}
|
||
} else if (this.GetTime() <= 0) {
|
||
this._SetTime(0);
|
||
this.SetPlaybackRate(this.GetPlaybackRate() * -1);
|
||
if (this._pingPongState === PING_PONG_END)
|
||
if (this._currentRepeatCount < this.GetRepeatCount()) {
|
||
this._currentRepeatCount++;
|
||
this._pingPongState = PING_PONG_BEGIN
|
||
} else
|
||
return true;
|
||
else if (this._pingPongState === PING_PONG_BEGIN)
|
||
this._pingPongState = PING_PONG_END
|
||
}
|
||
return false
|
||
}
|
||
_LoopPingPongCompleteCheck() {
|
||
if (this.IsForwardPlayBack()) {
|
||
if (this.GetTime() >= this.GetTotalTime()) {
|
||
this._SetTime(this.GetTotalTime());
|
||
this.SetPlaybackRate(this.GetPlaybackRate() * -1)
|
||
}
|
||
} else if (this.GetTime() <= 0) {
|
||
this._SetTime(0);
|
||
this.SetPlaybackRate(this.GetPlaybackRate() * -1)
|
||
}
|
||
return false
|
||
}
|
||
AddTrack() {
|
||
const trackDataItem = this._timelineDataItem.GetTrackData().AddEmptyTrackDataItem();
|
||
const track = C3.TrackState.Create(this, trackDataItem);
|
||
this._tracks.push(track);
|
||
return track
|
||
}
|
||
CleanCaches() {
|
||
for (const track of this._tracks)
|
||
track.CleanCaches()
|
||
}
|
||
ClearTrackInstances() {
|
||
for (const track of this._tracks)
|
||
track.ClearInstance()
|
||
}
|
||
SetTrackInstance(trackId, instance) {
|
||
if (!instance)
|
||
return;
|
||
for (const track of this._tracks)
|
||
if (trackId) {
|
||
if (track.GetId() !== trackId)
|
||
continue;
|
||
track.SetInstance(instance);
|
||
this._timelineManager.SetTimelineObjectClassToMap(instance.GetObjectClass(), this);
|
||
break
|
||
} else {
|
||
if (track.HasInstance())
|
||
continue;
|
||
track.SetInstance(instance);
|
||
this._timelineManager.SetTimelineObjectClassToMap(instance.GetObjectClass(), this);
|
||
break
|
||
}
|
||
}
|
||
HasTrackInstance(instance, trackId) {
|
||
for (const track of this._tracks)
|
||
if (trackId) {
|
||
if (trackId === track.GetId() && instance === track.GetInstance())
|
||
return true
|
||
} else if (instance === track.GetInstance())
|
||
return true;
|
||
return false
|
||
}
|
||
HasValidTracks() {
|
||
return this._tracks.some(t=>t.CanInstanceBeValid())
|
||
}
|
||
HasValidGlobalTracks() {
|
||
return this._tracks.some(t=>{
|
||
if (!t.CanInstanceBeValid())
|
||
return false;
|
||
const objectClass = t.GetObjectClass();
|
||
if (!objectClass)
|
||
return false;
|
||
return objectClass.IsGlobal()
|
||
}
|
||
)
|
||
}
|
||
GetPropertyTrack(propertyName) {
|
||
for (const track of this.GetTracks())
|
||
for (const propertyTrack of track.GetPropertyTracks())
|
||
if (propertyTrack.GetPropertyName() === propertyName)
|
||
return propertyTrack
|
||
}
|
||
GetKeyframeWithTags(tags) {
|
||
let tagsArray = tags ? tags.split(" ") : [];
|
||
const tagsSet = new Set(tagsArray.map(t=>t.toLowerCase().trim()));
|
||
tagsArray = [...tagsSet.values()];
|
||
for (const track of this.GetTracks())
|
||
for (const keyframeDataItem of track.GetKeyframeDataItems()) {
|
||
const hasAllTags = tagsArray.every(t=>keyframeDataItem.HasTag(t));
|
||
if (hasAllTags)
|
||
return keyframeDataItem
|
||
}
|
||
}
|
||
GetObjectClasses() {
|
||
const ret = [];
|
||
for (const track of this.GetTracks())
|
||
ret.push(track.GetObjectClass());
|
||
return ret.filter(oc=>oc)
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"tracksJson": this._SaveTracksToJson(),
|
||
"name": this._name,
|
||
"playheadTime": this.GetTime(),
|
||
"playbackRate": this._playbackRate,
|
||
"pingPongState": this._pingPongState,
|
||
"currentRepeatCount": this._currentRepeatCount,
|
||
"isPlaying": this._isPlaying,
|
||
"isScheduled": this._isScheduled,
|
||
"initialStateSet": this._initialStateSet,
|
||
"finishedTriggers": this._finishedTriggers,
|
||
"complete": this._complete,
|
||
"released": this._released,
|
||
"markedForRemoval": this._markedForRemoval,
|
||
"completedTick": this._completedTick,
|
||
"implicitPause": this._implicitPause,
|
||
"isTemplate": this._isTemplate,
|
||
"tags": this._tags.join(" "),
|
||
"stringTags": this._stringTags,
|
||
"tagsChanged": this._tagsChanged,
|
||
"firstTick": this._firstTick
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
this._LoadTracksFromJson(o["tracksJson"]);
|
||
this._name = o["name"];
|
||
this._playheadTime.Set(o["playheadTime"]);
|
||
this._playbackRate = o["playbackRate"];
|
||
this._pingPongState = o["pingPongState"];
|
||
this._currentRepeatCount = o["currentRepeatCount"];
|
||
this._isPlaying = !!o["isPlaying"];
|
||
this._isScheduled = !!o["isScheduled"];
|
||
this._initialStateSet = !!o["initialStateSet"];
|
||
this._finishedTriggers = o.hasOwnProperty("finishedTriggers") ? !!o["finishedTriggers"] : false;
|
||
this._complete = !!o["complete"];
|
||
this._released = !!o["released"];
|
||
this._markedForRemoval = !!o["markedForRemoval"];
|
||
this._completedTick = o["completedTick"];
|
||
this._implicitPause = !!o["implicitPause"];
|
||
this._isTemplate = !!o["isTemplate"];
|
||
this._tags = o["tags"].split(" ");
|
||
this._stringTags = o["stringTags"];
|
||
this._tagsChanged = !!o["tagsChanged"];
|
||
this._firstTick = !!o["firstTick"]
|
||
}
|
||
_SaveTracksToJson() {
|
||
return this._tracks.map(trackState=>trackState._SaveToJson())
|
||
}
|
||
_LoadTracksFromJson(tracksJson) {
|
||
tracksJson.forEach((trackJson,i)=>{
|
||
const track = this._tracks[i];
|
||
track._LoadFromJson(trackJson)
|
||
}
|
||
);
|
||
this._tracks.filter(track=>track.CanInstanceBeValid())
|
||
}
|
||
static _HasTag(tag) {
|
||
const tags = this.GetTags();
|
||
if (tag === "")
|
||
return tags.length === 1 && tags[0] === "";
|
||
return tags.includes(tag)
|
||
}
|
||
static _GetTagArray(tags) {
|
||
if (C3.IsArray(tags))
|
||
return tags.slice(0);
|
||
if (C3.IsString(tags))
|
||
return tags.split(" ")
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.TrackState = class Track extends C3.DefendedBase {
|
||
constructor(timeline, trackDataItem) {
|
||
super();
|
||
this._timeline = timeline;
|
||
this._trackDataItem = trackDataItem;
|
||
this._trackData = trackDataItem.GetTrackData();
|
||
this._instanceUid = NaN;
|
||
this._objectClassIndex = NaN;
|
||
this._instance = null;
|
||
this._worldInfo = null;
|
||
this._isNested = trackDataItem.GetStartOffset() > 0;
|
||
this._initialStateOfNestedSet = false;
|
||
this._endStateOfNestedSet = false;
|
||
this._lastKeyframeDataItem = null;
|
||
this._keyframeDataItems = this._trackDataItem.GetKeyframeData().GetKeyframeDataItemArray();
|
||
this._propertyTracks = [];
|
||
for (const propertyTrackDataItem of this._trackDataItem.GetPropertyTrackData().propertyTrackDataItems())
|
||
this._propertyTracks.push(C3.PropertyTrackState.Create(this, propertyTrackDataItem))
|
||
}
|
||
static Create(timeline, trackDataItem) {
|
||
return C3.New(C3.TrackState, timeline, trackDataItem)
|
||
}
|
||
Release() {
|
||
this._keyframeDataItems = null;
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.Release();
|
||
C3.clearArray(this._propertyTracks);
|
||
this._propertyTracks = null;
|
||
this._timeline = null;
|
||
this._instance = null;
|
||
this._worldInfo = null;
|
||
this._trackDataItem = null;
|
||
this._lastKeyframeDataItem = null
|
||
}
|
||
CleanCaches() {
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.CleanCaches();
|
||
this._instance = null;
|
||
this._worldInfo = null
|
||
}
|
||
GetTimeline() {
|
||
return this._timeline
|
||
}
|
||
GetRuntime() {
|
||
return this._timeline.GetRuntime()
|
||
}
|
||
GetKeyframeDataItems() {
|
||
if (this._keyframeDataItems)
|
||
return this._keyframeDataItems;
|
||
this._keyframeDataItems = this._trackDataItem.GetKeyframeData().GetKeyframeDataItemArray();
|
||
return this._keyframeDataItems
|
||
}
|
||
GetPropertyTracks() {
|
||
return this._propertyTracks
|
||
}
|
||
GetPropertyTrack(propertyName) {
|
||
for (const propertyTrack of this._propertyTracks)
|
||
if (propertyTrack.GetPropertyName() === propertyName)
|
||
return propertyTrack
|
||
}
|
||
MaybeGetInstance() {
|
||
if (!this._instance)
|
||
this.GetInstance()
|
||
}
|
||
IsInstanceValid() {
|
||
if (!this._instance)
|
||
return false;
|
||
return !this._instance.IsDestroyed()
|
||
}
|
||
CanInstanceBeValid() {
|
||
const uid = this.GetInstanceUID();
|
||
const instance = this.GetRuntime().GetInstanceByUID(uid);
|
||
if (!instance)
|
||
return false;
|
||
return !instance.IsDestroyed()
|
||
}
|
||
GetObjectClass() {
|
||
const index = this.GetObjectClassIndex();
|
||
if (index === -1)
|
||
return;
|
||
return this.GetRuntime().GetObjectClassByIndex(index)
|
||
}
|
||
ClearInstance() {
|
||
this._instance = null;
|
||
this._instanceUid = -1;
|
||
this._worldInfo = null;
|
||
this._objectClassIndex = -1
|
||
}
|
||
HasInstance() {
|
||
return !!this._instance
|
||
}
|
||
GetInstance() {
|
||
if (this._instance && this.IsInstanceValid())
|
||
return this._instance;
|
||
const uid = this.GetInstanceUID();
|
||
this._instance = this.GetRuntime().GetInstanceByUID(uid);
|
||
return this._instance
|
||
}
|
||
SetInstance(instance) {
|
||
if (this._instance === instance)
|
||
return;
|
||
this.CleanCaches();
|
||
this._instance = instance;
|
||
this._objectClassIndex = instance.GetObjectClass().GetIndex();
|
||
this._instanceUid = instance.GetUID();
|
||
this._worldInfo = instance.GetWorldInfo();
|
||
for (const item of this.propertyTrackItems()) {
|
||
const propertyTrack = item.propertyTrack;
|
||
const sourceAdapter = item.sourceAdapter;
|
||
const id = propertyTrack.GetSourceAdapterId();
|
||
switch (id) {
|
||
case "instance-variable":
|
||
{
|
||
const index = sourceAdapter.GetEditorIndex();
|
||
const objectClass = instance.GetObjectClass();
|
||
const i = objectClass.GetInstanceVariableIndexByName(item.name);
|
||
const name = objectClass.GetInstanceVariableName(i);
|
||
const type = objectClass.GetInstanceVariableType(i);
|
||
if (name === item.name && type === item.type)
|
||
sourceAdapter.UpdateInstanceVariableIndex(i);
|
||
break
|
||
}
|
||
case "behavior":
|
||
{
|
||
const timelineBehaviorType = item.behaviorType;
|
||
const trackObjectClass = this.GetObjectClass();
|
||
const objectClass = instance.GetObjectClass();
|
||
const instanceBehaviorType = sourceAdapter.GetBehaviorType(objectClass);
|
||
if (timelineBehaviorType && instanceBehaviorType) {
|
||
const name = timelineBehaviorType.GetName();
|
||
const templateBehaviorIndex = trackObjectClass.GetBehaviorIndexByName(name);
|
||
const instanceBehaviorIndex = objectClass.GetBehaviorIndexByName(name);
|
||
const propertyIndex = sourceAdapter.GetEditorIndex();
|
||
sourceAdapter.UpdateBehaviorTypeSid(instanceBehaviorType.GetSID())
|
||
}
|
||
break
|
||
}
|
||
}
|
||
}
|
||
}
|
||
*propertyTrackItems() {
|
||
for (const propertyTrack of this._propertyTracks) {
|
||
const sourceAdapter = propertyTrack.GetSourceAdapter();
|
||
const objectClass = this.GetObjectClass();
|
||
const ret = {
|
||
propertyTrack: propertyTrack,
|
||
sourceAdapter: sourceAdapter
|
||
};
|
||
switch (propertyTrack.GetSourceAdapterId()) {
|
||
case "world-instance":
|
||
{
|
||
ret.property = propertyTrack.GetPropertyName();
|
||
break
|
||
}
|
||
case "instance-variable":
|
||
{
|
||
const index = sourceAdapter.GetEditorIndex();
|
||
ret.name = objectClass.GetInstanceVariableName(index);
|
||
ret.type = objectClass.GetInstanceVariableType(index);
|
||
break
|
||
}
|
||
case "effect":
|
||
{
|
||
const effectList = objectClass.GetEffectList();
|
||
const effectType = sourceAdapter.GetEffectType(effectList);
|
||
ret.effectType = effectType;
|
||
break
|
||
}
|
||
case "behavior":
|
||
{
|
||
const behaviorType = sourceAdapter.GetBehaviorType(objectClass);
|
||
ret.behaviorType = behaviorType;
|
||
break
|
||
}
|
||
case "plugin":
|
||
{
|
||
ret.plugin = objectClass.GetPlugin();
|
||
break
|
||
}
|
||
}
|
||
yield ret
|
||
}
|
||
}
|
||
GetWorldInfo() {
|
||
if (this._worldInfo && this.IsInstanceValid())
|
||
return this._worldInfo;
|
||
const instance = this.GetInstance();
|
||
if (instance)
|
||
this._worldInfo = instance.GetWorldInfo();
|
||
return this._worldInfo
|
||
}
|
||
GetTrackDataItem() {
|
||
return this._trackDataItem
|
||
}
|
||
GetInstanceUID() {
|
||
if (this._instanceUid)
|
||
return this._instanceUid;
|
||
return this._trackDataItem.GetInstanceUID()
|
||
}
|
||
SetInstanceUID(uid) {
|
||
this._trackDataItem.SetInstanceUID(uid)
|
||
}
|
||
GetInterpolationMode() {
|
||
return this._trackDataItem.GetInterpolationMode()
|
||
}
|
||
SetInterpolationMode(im) {
|
||
this._trackDataItem.SetInterpolationMode(im)
|
||
}
|
||
GetResultMode() {
|
||
return this._trackDataItem.GetResultMode()
|
||
}
|
||
GetId() {
|
||
return this._trackDataItem.GetId()
|
||
}
|
||
GetStartOffset() {
|
||
return this._trackDataItem.GetStartOffset()
|
||
}
|
||
GetLocalTotalTime() {
|
||
return this._trackDataItem.GetLocalTotalTime()
|
||
}
|
||
SetResultMode(rm) {
|
||
this._trackDataItem.SetResultMode(rm)
|
||
}
|
||
SetEase(e) {
|
||
for (const keyframeDataItem of this.GetKeyframeDataItems())
|
||
keyframeDataItem.SetEase(e);
|
||
for (const propertyTrack of this.GetPropertyTracks())
|
||
propertyTrack.SetEase(e)
|
||
}
|
||
GetEnable() {
|
||
return this._trackDataItem.GetEnable()
|
||
}
|
||
SetEnable(e) {
|
||
this._trackDataItem.SetEnable(e)
|
||
}
|
||
GetObjectClassIndex() {
|
||
if (!isNaN(this._objectClassIndex))
|
||
return this._objectClassIndex;
|
||
return this._trackDataItem.GetObjectClassIndex()
|
||
}
|
||
SetObjectClassIndex(objectClassIndex) {
|
||
this._trackDataItem.SetObjectClassIndex(objectClassIndex)
|
||
}
|
||
SetOriginalWidth(w) {
|
||
this._trackDataItem.SetOriginalWidth(w)
|
||
}
|
||
GetOriginalWidth() {
|
||
return this._trackDataItem.GetOriginalWidth()
|
||
}
|
||
SetOriginalHeight(h) {
|
||
this._trackDataItem.SetOriginalHeight(h)
|
||
}
|
||
GetOriginalHeight() {
|
||
return this._trackDataItem.GetOriginalHeight()
|
||
}
|
||
SetInitialState() {
|
||
this.MaybeGetInstance();
|
||
if (!this.IsInstanceValid())
|
||
return;
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.SetInitialState();
|
||
const timeline = this.GetTimeline();
|
||
const isForwardPlayBack = timeline.IsForwardPlayBack();
|
||
const time = isForwardPlayBack ? 0 : this.GetLocalTotalTime();
|
||
this._lastKeyframeDataItem = this.GetLastKeyFrameBeforeTime(time);
|
||
this._initialStateOfNestedSet = false;
|
||
this._endStateOfNestedSet = false;
|
||
this.Interpolate(time)
|
||
}
|
||
SetResumeState() {
|
||
this.MaybeGetInstance();
|
||
if (!this.IsInstanceValid())
|
||
return;
|
||
const playbackDirection = this._timeline.IsForwardPlayBack();
|
||
const time = this._timeline.GetTime() - this.GetStartOffset();
|
||
this._lastKeyframeDataItem = this.GetLastKeyFrameBeforeTime(time);
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.SetResumeState()
|
||
}
|
||
SetEndState() {
|
||
if (this.GetTimeline().IsComplete())
|
||
return;
|
||
this.MaybeGetInstance();
|
||
if (!this.IsInstanceValid())
|
||
return;
|
||
if (!this._isNested) {
|
||
const time = this._timeline.GetTime();
|
||
const totalTime = this.GetStartOffset() + this.GetLocalTotalTime();
|
||
if (time >= totalTime)
|
||
this.Interpolate(this.GetLocalTotalTime(), true, false, true);
|
||
else if (time <= 0)
|
||
this.Interpolate(0, true, false, true)
|
||
}
|
||
}
|
||
BeforeInterpolate() {
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.BeforeInterpolate()
|
||
}
|
||
Interpolate(time, isTicking=false, setTime=false, ensureValue=false, firstTick=false, ignoreGlobals=false) {
|
||
this.MaybeGetInstance();
|
||
if (!this.IsInstanceValid())
|
||
return false;
|
||
if (ignoreGlobals && this.GetObjectClass().IsGlobal())
|
||
return false;
|
||
time = time - this.GetStartOffset();
|
||
if (time < 0)
|
||
return false;
|
||
this.MaybeSetInitialStateOfNestedTrack(time, isTicking);
|
||
this.MaybeTriggerKeyframeReachedConditions(time, isTicking, firstTick);
|
||
let boxChange = false;
|
||
let renderChange = false;
|
||
for (const propertyTrack of this._propertyTracks) {
|
||
const change = propertyTrack.Interpolate(time, setTime, false, ensureValue);
|
||
if (!boxChange && (change & C3.TimelineState.WORLD_INSTANCE_BOX_CHANGE) !== 0)
|
||
boxChange = true;
|
||
if (!renderChange && (change & C3.TimelineState.LAYOUT_RENDER_CHANGE) !== 0)
|
||
renderChange = true
|
||
}
|
||
this.MaybeSetEndStateOfNestedTrack(time, isTicking);
|
||
if (boxChange) {
|
||
const worldInfo = this.GetWorldInfo();
|
||
if (worldInfo)
|
||
worldInfo.SetBboxChanged()
|
||
}
|
||
return renderChange
|
||
}
|
||
AfterInterpolate() {
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.AfterInterpolate()
|
||
}
|
||
MaybeSetInitialStateOfNestedTrack(time, isTicking) {
|
||
if (!isTicking)
|
||
return;
|
||
if (!this._isNested)
|
||
return;
|
||
if (this._initialStateOfNestedSet)
|
||
return;
|
||
const timeline = this.GetTimeline();
|
||
if (timeline.IsForwardPlayBack()) {
|
||
if (time < 0)
|
||
return;
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.Interpolate(0, false, false, true)
|
||
} else {
|
||
if (time > this.GetLocalTotalTime())
|
||
return;
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.Interpolate(this.GetLocalTotalTime(), false, false, true)
|
||
}
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.SetInitialState();
|
||
this._initialStateOfNestedSet = true
|
||
}
|
||
MaybeSetEndStateOfNestedTrack(time, isTicking) {
|
||
if (!isTicking)
|
||
return;
|
||
if (!this._isNested)
|
||
return;
|
||
if (this._endStateOfNestedSet)
|
||
return;
|
||
const timeline = this.GetTimeline();
|
||
if (timeline.IsForwardPlayBack()) {
|
||
if (time >= this.GetLocalTotalTime()) {
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.Interpolate(this.GetLocalTotalTime(), false, false, true);
|
||
this._endStateOfNestedSet = true
|
||
}
|
||
} else if (time <= 0) {
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.Interpolate(0, false, false, true);
|
||
this._endStateOfNestedSet = true
|
||
}
|
||
}
|
||
MaybeTriggerKeyframeReachedConditions(time, isTicking, firstTick) {
|
||
if (firstTick)
|
||
return;
|
||
if (!isTicking)
|
||
return;
|
||
let keyframeDataItem = this.GetLastKeyFrameBeforeTime(time);
|
||
if (keyframeDataItem !== this._lastKeyframeDataItem)
|
||
this.OnKeyframeReached(keyframeDataItem);
|
||
this._lastKeyframeDataItem = keyframeDataItem;
|
||
return keyframeDataItem
|
||
}
|
||
GetLastKeyFrameBeforeTime(time) {
|
||
const timeline = this.GetTimeline();
|
||
let keyframeDataItem = this._trackData.GetKeyFrameDataItemAtTime(time, this._trackDataItem);
|
||
if (keyframeDataItem)
|
||
return keyframeDataItem;
|
||
else if (timeline.IsForwardPlayBack())
|
||
return this._trackData.GetFirstKeyFrameDataItemLowerOrEqualThan(time, this._trackDataItem);
|
||
else
|
||
return this._trackData.GetFirstKeyFrameDataItemHigherOrEqualThan(time, this._trackDataItem)
|
||
}
|
||
OnKeyframeReached(keyframeDataItem) {
|
||
if (!C3.Plugins.Timeline || this.GetTimeline().constructor !== C3.TimelineState)
|
||
return;
|
||
const timeline = this.GetTimeline();
|
||
C3.Plugins.Timeline.Cnds.SetTriggerTimeline(timeline);
|
||
C3.Plugins.Timeline.Cnds.SetTriggerKeyframe(keyframeDataItem);
|
||
const timelineManager = timeline.GetTimelineManager();
|
||
timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnAnyKeyframeReached);
|
||
timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnKeyframeReached);
|
||
C3.Plugins.Timeline.Cnds.SetTriggerTimeline(null);
|
||
C3.Plugins.Timeline.Cnds.SetTriggerKeyframe(null)
|
||
}
|
||
AddKeyframe() {
|
||
const keyframeData = this._trackDataItem.GetKeyframeData();
|
||
const keyframeDataItem = keyframeData.AddEmptyKeyframeDataItem();
|
||
return keyframeDataItem
|
||
}
|
||
AddPropertyTrack() {
|
||
const propertyTrackData = this._trackDataItem.GetPropertyTrackData();
|
||
const propertyTrackDataItem = propertyTrackData.AddEmptyPropertyTrackDataItem();
|
||
const propertyTrack = C3.PropertyTrackState.Create(this, propertyTrackDataItem);
|
||
this._propertyTracks.push(propertyTrack);
|
||
return propertyTrack
|
||
}
|
||
DeleteKeyframes(match) {
|
||
const keyframeData = this._trackDataItem.GetKeyframeData();
|
||
keyframeData.DeleteKeyframeDataItems(match)
|
||
}
|
||
DeletePropertyKeyframes(match) {
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.DeletePropertyKeyframes(match)
|
||
}
|
||
SaveState() {
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.SaveState()
|
||
}
|
||
CompareInitialStateWithCurrent() {
|
||
this.MaybeGetInstance();
|
||
if (!this.IsInstanceValid())
|
||
return;
|
||
for (const propertyTrack of this._propertyTracks)
|
||
propertyTrack.CompareInitialStateWithCurrent()
|
||
}
|
||
CompareSaveStateWithCurrent() {
|
||
this.MaybeGetInstance();
|
||
if (!this.IsInstanceValid())
|
||
return;
|
||
let difference = false;
|
||
for (const propertyTrack of this._propertyTracks) {
|
||
const diff = propertyTrack.CompareSaveStateWithCurrent();
|
||
if (!difference && diff)
|
||
difference = true
|
||
}
|
||
if (difference) {
|
||
const keyframeDataItem = this.AddKeyframe();
|
||
keyframeDataItem.SetTime(this.GetTimeline().GetTime());
|
||
keyframeDataItem.SetEase("noease");
|
||
keyframeDataItem.SetEnable(true);
|
||
keyframeDataItem.SetTags("")
|
||
}
|
||
}
|
||
_SaveToJson() {
|
||
const instance = this.GetInstance();
|
||
const uid = instance ? instance.GetUID() : this.GetInstanceUID();
|
||
return {
|
||
"propertyTracksJson": this._SavePropertyTracksToJson(),
|
||
"lastKeyframeDataItemJson": this._SaveLastKeyframeDataItemToJson(),
|
||
"initialStateOfNestedSet": this._initialStateOfNestedSet,
|
||
"endStateOfNestedSet": this._endStateOfNestedSet,
|
||
"instanceUid": uid
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
this._LoadPropertyTracksFromJson(o["propertyTracksJson"]);
|
||
this._LoadLastKeyframeDataItemFromJson(o["lastKeyframeDataItemJson"]);
|
||
this._LoadInstanceFromJson(o["instanceUid"]);
|
||
this._initialStateOfNestedSet = false;
|
||
if (o.hasOwnProperty["initialStateOfNestedSet"])
|
||
this._initialStateOfNestedSet = o["initialStateOfNestedSet"];
|
||
this._endStateOfNestedSet = false;
|
||
if (o.hasOwnProperty["endStateOfNestedSet"])
|
||
this._endStateOfNestedSet = o["endStateOfNestedSet"]
|
||
}
|
||
_SaveLastKeyframeDataItemToJson() {
|
||
const keyframeData = this._trackDataItem.GetKeyframeData();
|
||
return keyframeData.GetKeyframeDataItemIndex(this._lastKeyframeDataItem)
|
||
}
|
||
_SavePropertyTracksToJson() {
|
||
return this._propertyTracks.map(propertyTrackState=>propertyTrackState._SaveToJson())
|
||
}
|
||
_LoadPropertyTracksFromJson(propertyTracksJson) {
|
||
propertyTracksJson.forEach((propertyTrackJson,i)=>{
|
||
const propertyTrack = this._propertyTracks[i];
|
||
propertyTrack._LoadFromJson(propertyTrackJson)
|
||
}
|
||
)
|
||
}
|
||
_LoadInstanceFromJson(uid) {
|
||
if (!C3.IsFiniteNumber(uid))
|
||
return;
|
||
const instance = this.GetRuntime().GetInstanceByUID(uid);
|
||
if (!instance)
|
||
return;
|
||
const timeline = this.GetTimeline();
|
||
timeline.ClearTrackInstances();
|
||
timeline.SetTrackInstance(this._trackDataItem.GetId(), instance)
|
||
}
|
||
_LoadLastKeyframeDataItemFromJson(lastKeyframeDataItemIndex) {
|
||
const keyframeData = this._trackDataItem.GetKeyframeData();
|
||
this._lastKeyframeDataItem = keyframeData.GetKeyframeDataItemFromIndex(lastKeyframeDataItemIndex)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.PropertyTrackState = class PropertyTrack extends C3.DefendedBase {
|
||
constructor(track, propertyTrackDataItem) {
|
||
super();
|
||
this._track = track;
|
||
this._propertyTrackDataItem = propertyTrackDataItem;
|
||
this._propertyTrackData = propertyTrackDataItem.GetPropertyTrackData();
|
||
this._sourceAdapter = this.GetSourceAdapter();
|
||
this._propertyKeyframeDataItems = this._propertyTrackDataItem.GetPropertyKeyframeData().GetPropertyKeyframeDataItemArray()
|
||
}
|
||
static Create(track, propertyTrackDataItem) {
|
||
return C3.New(C3.PropertyTrackState, track, propertyTrackDataItem)
|
||
}
|
||
Release() {
|
||
this._track = null;
|
||
if (this._sourceAdapter) {
|
||
this._sourceAdapter.Release();
|
||
this._sourceAdapter = null
|
||
}
|
||
this._propertyKeyframeDataItems = null;
|
||
this._propertyTrackDataItem = null;
|
||
this._propertyTrackData = null
|
||
}
|
||
GetTrack() {
|
||
return this._track
|
||
}
|
||
GetPropertyTrackDataItem() {
|
||
return this._propertyTrackDataItem
|
||
}
|
||
GetPropertyTrackData() {
|
||
return this._propertyTrackData
|
||
}
|
||
GetTimeline() {
|
||
return this._track.GetTimeline()
|
||
}
|
||
GetRuntime() {
|
||
return this._track.GetRuntime()
|
||
}
|
||
GetInstance() {
|
||
return this._track.GetInstance()
|
||
}
|
||
GetSourceAdapter() {
|
||
if (this._sourceAdapter)
|
||
return this._sourceAdapter;
|
||
const id = this._propertyTrackDataItem.GetSourceAdapterId();
|
||
let ret;
|
||
switch (id) {
|
||
case "behavior":
|
||
ret = new C3.PropertyTrackState.BehaviorSourceAdapter(this);
|
||
break;
|
||
case "effect":
|
||
ret = new C3.PropertyTrackState.EffectSourceAdapter(this);
|
||
break;
|
||
case "instance-variable":
|
||
ret = new C3.PropertyTrackState.InstanceVariableSourceAdapter(this);
|
||
break;
|
||
case "plugin":
|
||
ret = new C3.PropertyTrackState.PluginSourceAdapter(this);
|
||
break;
|
||
case "world-instance":
|
||
ret = new C3.PropertyTrackState.WorldInstanceSourceAdapter(this);
|
||
break;
|
||
case "value":
|
||
ret = new C3.PropertyTrackState.ValueSourceAdapter(this);
|
||
break
|
||
}
|
||
this._sourceAdapter = ret;
|
||
return this._sourceAdapter
|
||
}
|
||
GetSourceAdapterId() {
|
||
return this._propertyTrackDataItem.GetSourceAdapterId()
|
||
}
|
||
SetSourceAdapterId(said) {
|
||
this._propertyTrackDataItem.SetSourceAdapterId(said)
|
||
}
|
||
GetSourceAdapterArgs() {
|
||
return this._propertyTrackDataItem.GetSourceAdapterArguments()
|
||
}
|
||
SetSourceAdapterArgs(sargs) {
|
||
this._propertyTrackDataItem.SetSourceAdapterArguments(sargs)
|
||
}
|
||
GetSourceAdapterValue() {
|
||
return this.GetSourceAdapter().GetValue()
|
||
}
|
||
GetPropertyName() {
|
||
return this._propertyTrackDataItem.GetProperty()
|
||
}
|
||
SetPropertyName(pn) {
|
||
this._propertyTrackDataItem.SetProperty(pn)
|
||
}
|
||
GetPropertyType() {
|
||
return this._propertyTrackDataItem.GetType()
|
||
}
|
||
SetPropertyType(pt) {
|
||
this._propertyTrackDataItem.SetType(pt)
|
||
}
|
||
GetPropertyKeyframeType() {
|
||
return this.GetPropertyTrackData().GetFirstPropertyKeyframeDataItem(this._propertyTrackDataItem).GetType()
|
||
}
|
||
GetMin() {
|
||
return this._propertyTrackDataItem.GetMin()
|
||
}
|
||
SetMin(min) {
|
||
this._propertyTrackDataItem.SetMin(min)
|
||
}
|
||
GetMax() {
|
||
return this._propertyTrackDataItem.GetMax()
|
||
}
|
||
SetMax(max) {
|
||
this._propertyTrackDataItem.SetMax(max)
|
||
}
|
||
GetEnable() {
|
||
return this._propertyTrackDataItem.GetEnable()
|
||
}
|
||
SetEnable(e) {
|
||
this._propertyTrackDataItem.SetEnable(e)
|
||
}
|
||
GetInterpolationMode() {
|
||
return this._propertyTrackDataItem.GetInterpolationMode()
|
||
}
|
||
SetInterpolationMode(im) {
|
||
this._propertyTrackDataItem.SetInterpolationMode(im)
|
||
}
|
||
GetResultMode() {
|
||
return this._propertyTrackDataItem.GetResultMode()
|
||
}
|
||
SetResultMode(rm) {
|
||
this._propertyTrackDataItem.SetResultMode(rm)
|
||
}
|
||
SetEase(e) {
|
||
for (const propertyKeyframeDataItem of this.GetPropertyKeyframeDataItems())
|
||
propertyKeyframeDataItem.SetEase(e)
|
||
}
|
||
GetPropertyKeyframeDataItems() {
|
||
if (this._propertyKeyframeDataItems)
|
||
return this._propertyKeyframeDataItems;
|
||
this._propertyKeyframeDataItems = this._propertyTrackDataItem.GetPropertyKeyframeData().GetPropertyKeyframeDataItemArray();
|
||
return this._propertyKeyframeDataItems
|
||
}
|
||
*GetPropertyKeyframeValues() {
|
||
for (const propertyKeyframeDataItem of this.GetPropertyKeyframeDataItems())
|
||
yield propertyKeyframeDataItem.GetValueWithResultMode()
|
||
}
|
||
CleanCaches() {
|
||
this.GetSourceAdapter().CleanCaches()
|
||
}
|
||
GetCurrentState() {
|
||
return this.GetSourceAdapter().GetCurrentState()
|
||
}
|
||
SetInitialState() {
|
||
this.GetSourceAdapter().SetInitialState()
|
||
}
|
||
SetResumeState() {
|
||
this.GetSourceAdapter().SetResumeState()
|
||
}
|
||
BeforeInterpolate() {
|
||
this.GetSourceAdapter().BeforeInterpolate()
|
||
}
|
||
Interpolate(time, setTime=false, noChange=false, ensureValue=false) {
|
||
const propertyTrackDataItem = this._propertyTrackDataItem;
|
||
let start = this._propertyTrackData.GetPropertyKeyFrameDataItemAtTime(time, propertyTrackDataItem);
|
||
let end;
|
||
if (start)
|
||
end = this._propertyTrackData.GetFirstPropertyKeyFrameDataItemHigherThan(time, propertyTrackDataItem);
|
||
else {
|
||
start = this._propertyTrackData.GetFirstPropertyKeyFrameDataItemLowerOrEqualThan(time, propertyTrackDataItem);
|
||
end = this._propertyTrackData.GetFirstPropertyKeyFrameDataItemHigherOrEqualThan(time, propertyTrackDataItem)
|
||
}
|
||
return this.GetSourceAdapter().Interpolate(time, start, end, setTime, noChange, ensureValue)
|
||
}
|
||
AfterInterpolate() {
|
||
this.GetSourceAdapter().AfterInterpolate()
|
||
}
|
||
static GetStartPropertyKeyframeForTime(time, propertyTrack) {
|
||
const propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem();
|
||
const propertyTrackData = propertyTrack._propertyTrackData;
|
||
let start = propertyTrackData.GetPropertyKeyFrameDataItemAtTime(time, propertyTrackDataItem);
|
||
if (!start)
|
||
start = propertyTrackData.GetFirstPropertyKeyFrameDataItemLowerOrEqualThan(time, propertyTrackDataItem);
|
||
return start
|
||
}
|
||
static GetEndPropertyKeyframeForTime(time, propertyTrack) {
|
||
const propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem();
|
||
const propertyTrackData = propertyTrack._propertyTrackData;
|
||
let end = propertyTrackData.GetPropertyKeyFrameDataItemAtTime(time, propertyTrackDataItem);
|
||
if (end)
|
||
return propertyTrackData.GetFirstPropertyKeyFrameDataItemHigherThan(time, propertyTrackDataItem);
|
||
else
|
||
return propertyTrackData.GetFirstPropertyKeyFrameDataItemHigherOrEqualThan(time, propertyTrackDataItem)
|
||
}
|
||
AddPropertyKeyframe() {
|
||
const propertyKeyframeData = this._propertyTrackDataItem.GetPropertyKeyframeData();
|
||
const propertyKeyframeDataItem = propertyKeyframeData.AddEmptyPropertyKeyframeDataItem();
|
||
return propertyKeyframeDataItem
|
||
}
|
||
DeletePropertyKeyframes(match) {
|
||
const propertyKeyframeData = this._propertyTrackDataItem.GetPropertyKeyframeData();
|
||
propertyKeyframeData.DeletePropertyKeyframeDataItems(match)
|
||
}
|
||
SaveState() {
|
||
this.GetSourceAdapter().SaveState()
|
||
}
|
||
CompareInitialStateWithCurrent() {
|
||
const difference = this.GetSourceAdapter().CompareInitialStateWithCurrent();
|
||
if (difference) {
|
||
const propertyKeyframeDataItem = this._propertyTrackData.GetFirstPropertyKeyframeDataItem(this._propertyTrackDataItem);
|
||
const currentState = this.GetSourceAdapter().GetCurrentState();
|
||
propertyKeyframeDataItem.SetAbsoluteValue(currentState)
|
||
}
|
||
}
|
||
CompareSaveStateWithCurrent() {
|
||
const difference = this.GetSourceAdapter().CompareSaveStateWithCurrent();
|
||
if (difference)
|
||
this.AddPropertyKeyframeAtCurrentTime();
|
||
this.GetSourceAdapter().ClearSaveState();
|
||
return difference
|
||
}
|
||
AddPropertyKeyframeAtCurrentTime() {
|
||
const time = this.GetTimeline().GetTime();
|
||
const sourceAdapter = this.GetSourceAdapter();
|
||
const startPropertyKeyframe = C3.PropertyTrackState.GetStartPropertyKeyframeForTime(time, this);
|
||
const propertyKeyframeDataItem = this.AddPropertyKeyframe();
|
||
propertyKeyframeDataItem.SetType(startPropertyKeyframe.GetType());
|
||
propertyKeyframeDataItem.SetTime(time);
|
||
propertyKeyframeDataItem.SetEase(startPropertyKeyframe.GetEase());
|
||
propertyKeyframeDataItem.SetEnable(true);
|
||
propertyKeyframeDataItem.SetValue(sourceAdapter.GetValueAtTime());
|
||
propertyKeyframeDataItem.SetAbsoluteValue(sourceAdapter.GetCurrentState())
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"sourceAdapterJson": this.GetSourceAdapter()._SaveToJson()
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
this.GetSourceAdapter()._LoadFromJson(o["sourceAdapterJson"])
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const NS = C3.PropertyTrackState;
|
||
NS.PropertySourceAdapter = class PropertySourceAdapter {
|
||
constructor(propertyTrack) {
|
||
this._propertyTrack = propertyTrack;
|
||
this._propertyAdapter = null
|
||
}
|
||
Release() {
|
||
if (this._propertyAdapter) {
|
||
this._propertyAdapter.Release();
|
||
this._propertyAdapter = null
|
||
}
|
||
this._propertyTrack = null
|
||
}
|
||
GetPropertyTrack() {
|
||
return this._propertyTrack
|
||
}
|
||
CleanCaches() {
|
||
if (this._propertyAdapter)
|
||
this._propertyAdapter.CleanCaches()
|
||
}
|
||
GetPropertyAdapter() {
|
||
if (this._propertyAdapter)
|
||
return this._propertyAdapter;
|
||
this._propertyAdapter = this._CreatePropertyAdapter();
|
||
return this._propertyAdapter
|
||
}
|
||
GetEditorIndex() {}
|
||
GetIndex() {
|
||
return this.GetEditorIndex()
|
||
}
|
||
GetTarget() {}
|
||
SetInitialState() {
|
||
this.GetPropertyAdapter().SetInitialState()
|
||
}
|
||
SetResumeState() {
|
||
this.GetPropertyAdapter().SetResumeState()
|
||
}
|
||
BeforeInterpolate() {
|
||
this.GetPropertyAdapter().BeforeChangeProperty()
|
||
}
|
||
Interpolate(time, start, end, setTime, noChange, ensureValue) {
|
||
const interpolateFunc = NS.PropertySourceAdapter.GetInterpolateFunc(this._propertyTrack);
|
||
const value = interpolateFunc(time, start, end, this._propertyTrack);
|
||
if (noChange)
|
||
return value;
|
||
return this.GetPropertyAdapter().ChangeProperty(time, value, start, end, setTime, ensureValue)
|
||
}
|
||
AfterInterpolate() {
|
||
this.GetPropertyAdapter().AfterChangeProperty()
|
||
}
|
||
SaveState() {
|
||
this.GetPropertyAdapter().SetSaveState()
|
||
}
|
||
ClearSaveState() {
|
||
this.GetPropertyAdapter().ClearSaveState()
|
||
}
|
||
GetCurrentState() {
|
||
return this.GetPropertyAdapter().GetCurrentState()
|
||
}
|
||
CompareInitialStateWithCurrent() {
|
||
return this.GetPropertyAdapter().CompareInitialStateWithCurrent()
|
||
}
|
||
CompareSaveStateWithCurrent() {
|
||
return this.GetPropertyAdapter().CompareSaveStateWithCurrent()
|
||
}
|
||
GetValueAtTime() {
|
||
return NS.PropertySourceAdapter.GetValueAtTime(this._propertyTrack)
|
||
}
|
||
_CreatePropertyAdapter() {
|
||
const propertyType = this._propertyTrack.GetPropertyType();
|
||
const keyframePropertyType = this._propertyTrack.GetPropertyKeyframeType();
|
||
switch (keyframePropertyType) {
|
||
case "combo":
|
||
case "boolean":
|
||
case "text":
|
||
case "string":
|
||
{
|
||
return new NS.PropertyInterpolationAdapter.NoInterpolationAdapter(this)
|
||
}
|
||
case "numeric":
|
||
case "number":
|
||
case "angle":
|
||
{
|
||
if (propertyType === "combo")
|
||
return new NS.PropertyInterpolationAdapter.NoInterpolationAdapter(this);
|
||
return new NS.PropertyInterpolationAdapter.NumericInterpolationAdapter(this)
|
||
}
|
||
case "color":
|
||
case "offsetColor":
|
||
{
|
||
return new NS.PropertyInterpolationAdapter.ColorInterpolationAdapter(this)
|
||
}
|
||
}
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"propertyAdapterJson": this.GetPropertyAdapter()._SaveToJson()
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
this.GetPropertyAdapter()._LoadFromJson(o["propertyAdapterJson"])
|
||
}
|
||
static GetValueAtTime(propertyTrack) {
|
||
const track = propertyTrack.GetTrack();
|
||
const time = track.GetTimeline().GetTime();
|
||
const start = NS.GetStartPropertyKeyframeForTime(time, propertyTrack);
|
||
const end = NS.GetEndPropertyKeyframeForTime(time, propertyTrack);
|
||
const interpolateFunc = NS.PropertySourceAdapter.GetInterpolateFunc(propertyTrack);
|
||
return interpolateFunc(time, start, end, propertyTrack)
|
||
}
|
||
static GetValue(propertyTrack, initialValue, value) {
|
||
let resultMode = propertyTrack.GetResultMode();
|
||
if (propertyTrack.GetPropertyType() === "combo")
|
||
resultMode = "absolute";
|
||
switch (resultMode) {
|
||
case "relative":
|
||
return initialValue + value;
|
||
case "absolute":
|
||
return value
|
||
}
|
||
}
|
||
static GetInterpolateFunc(propertyTrack) {
|
||
const type = propertyTrack.GetPropertyKeyframeType();
|
||
switch (type) {
|
||
case "numeric":
|
||
return NS.NumericTypeAdapter.Interpolate;
|
||
case "angle":
|
||
return NS.AngleTypeAdapter.Interpolate;
|
||
case "boolean":
|
||
return NS.BooleanTypeAdapter.Interpolate;
|
||
case "color":
|
||
return NS.ColorTypeAdapter.Interpolate;
|
||
case "text":
|
||
return NS.TextTypeAdapter.Interpolate
|
||
}
|
||
}
|
||
static GetWillChangeFunc(propertyTrack) {
|
||
const type = propertyTrack.GetPropertyKeyframeType();
|
||
switch (type) {
|
||
case "numeric":
|
||
return NS.NumericTypeAdapter.WillChange;
|
||
case "angle":
|
||
return NS.AngleTypeAdapter.WillChange;
|
||
case "boolean":
|
||
return NS.BooleanTypeAdapter.WillChange;
|
||
case "color":
|
||
return NS.ColorTypeAdapter.WillChange;
|
||
case "text":
|
||
return NS.TextTypeAdapter.WillChange
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
class WorldInstanceSourceAdapter extends C3.PropertyTrackState.PropertySourceAdapter {
|
||
constructor(propertyTrack) {
|
||
super(propertyTrack)
|
||
}
|
||
}
|
||
C3.PropertyTrackState.WorldInstanceSourceAdapter = WorldInstanceSourceAdapter
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const INDEX = 0;
|
||
class InstanceVariableSourceAdapter extends C3.PropertyTrackState.PropertySourceAdapter {
|
||
constructor(propertyTrack) {
|
||
super(propertyTrack);
|
||
this._updatedIndex = NaN
|
||
}
|
||
GetEditorIndex() {
|
||
return this._propertyTrack.GetPropertyTrackDataItem().GetSourceAdapterArguments()[INDEX]
|
||
}
|
||
GetIndex() {
|
||
if (this._updatedIndex)
|
||
return this._updatedIndex;
|
||
return super.GetIndex()
|
||
}
|
||
GetTarget() {
|
||
return this._propertyTrack.GetTrack().GetInstance()
|
||
}
|
||
UpdateInstanceVariableIndex(index) {
|
||
const i = this._propertyTrack.GetPropertyTrackDataItem().GetSourceAdapterArguments()[INDEX];
|
||
if (i === index)
|
||
return;
|
||
this._updatedIndex = index
|
||
}
|
||
Interpolate(time, start, end, setTime, noChange, ensureValue) {
|
||
if (!this.GetPropertyAdapter().CanChange(start.GetValue()))
|
||
return;
|
||
return super.Interpolate(time, start, end, setTime, noChange, ensureValue)
|
||
}
|
||
_SaveToJson() {
|
||
return Object.assign(super._SaveToJson(), {
|
||
"index": this._updatedIndex
|
||
})
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
super._LoadFromJson(o);
|
||
this._updatedIndex = o["index"]
|
||
}
|
||
}
|
||
C3.PropertyTrackState.InstanceVariableSourceAdapter = InstanceVariableSourceAdapter
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const SID = 0;
|
||
const INDEX = 1;
|
||
const NAME = 2;
|
||
class BehaviorSourceAdapter extends C3.PropertyTrackState.PropertySourceAdapter {
|
||
constructor(propertyTrack) {
|
||
super(propertyTrack);
|
||
this._sid = NaN
|
||
}
|
||
GetEditorIndex() {
|
||
const dataItem = this._propertyTrack.GetPropertyTrackDataItem();
|
||
return dataItem.GetSourceAdapterArguments()[INDEX]
|
||
}
|
||
GetTarget() {
|
||
const dataItem = this._propertyTrack.GetPropertyTrackDataItem();
|
||
const track = this._propertyTrack.GetTrack();
|
||
const sid = this._sid ? this._sid : dataItem.GetSourceAdapterArguments()[SID];
|
||
const instance = track.GetInstance();
|
||
const index = instance.GetBehaviorIndexBySID(sid);
|
||
const behaviorInstance = instance.GetBehaviorInstances()[index];
|
||
return behaviorInstance.GetSdkInstance()
|
||
}
|
||
GetBehaviorType(objectClass) {
|
||
const dataItem = this._propertyTrack.GetPropertyTrackDataItem();
|
||
const name = dataItem.GetSourceAdapterArguments()[NAME];
|
||
return objectClass.GetBehaviorTypeByName(name)
|
||
}
|
||
UpdateBehaviorTypeSid(sid) {
|
||
const dataItem = this._propertyTrack.GetPropertyTrackDataItem();
|
||
if (dataItem.GetSourceAdapterArguments()[SID] === sid)
|
||
return;
|
||
this._sid = sid
|
||
}
|
||
Interpolate(time, start, end, setTime, noChange, ensureValue) {
|
||
const track = this._propertyTrack.GetTrack();
|
||
const instance = track.GetInstance();
|
||
if (!this.GetBehaviorType(instance.GetObjectClass()))
|
||
return;
|
||
return super.Interpolate(time, start, end, setTime, noChange, ensureValue)
|
||
}
|
||
_SaveToJson() {
|
||
return Object.assign(super._SaveToJson(), {
|
||
"sid": this._sid
|
||
})
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
super._LoadFromJson(o);
|
||
this._sid = o["sid"]
|
||
}
|
||
}
|
||
C3.PropertyTrackState.BehaviorSourceAdapter = BehaviorSourceAdapter
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const NAME = 0;
|
||
const INDEX = 1;
|
||
class EffectSourceAdapter extends C3.PropertyTrackState.PropertySourceAdapter {
|
||
constructor(propertyTrack) {
|
||
super(propertyTrack)
|
||
}
|
||
GetEditorIndex() {
|
||
return this._propertyTrack.GetPropertyTrackDataItem().GetSourceAdapterArguments()[INDEX]
|
||
}
|
||
GetTarget() {
|
||
const pTrack = this._propertyTrack;
|
||
const track = pTrack.GetTrack();
|
||
const worldInfo = track.GetWorldInfo();
|
||
const instanceEffectList = worldInfo.GetInstanceEffectList();
|
||
const effectList = instanceEffectList.GetEffectList();
|
||
const effectType = this.GetEffectType(effectList);
|
||
const effectIndex = effectType.GetIndex();
|
||
if (instanceEffectList.IsEffectIndexActive(effectIndex))
|
||
return instanceEffectList.GetEffectParametersForIndex(effectIndex);
|
||
return null
|
||
}
|
||
GetEffectType(effectList) {
|
||
const pTrack = this._propertyTrack;
|
||
const name = pTrack.GetPropertyTrackDataItem().GetSourceAdapterArguments()[NAME];
|
||
return effectList.GetEffectTypeByName(name)
|
||
}
|
||
Interpolate(time, start, end, setTime, noChange, ensureValue) {
|
||
if (!this._IsEffectActive())
|
||
return;
|
||
return super.Interpolate(time, start, end, setTime, noChange, ensureValue)
|
||
}
|
||
_IsEffectActive() {
|
||
const pTrack = this._propertyTrack;
|
||
const track = pTrack.GetTrack();
|
||
const worldInfo = track.GetWorldInfo();
|
||
const instanceEffectList = worldInfo.GetInstanceEffectList();
|
||
const effectList = instanceEffectList.GetEffectList();
|
||
const effectType = this.GetEffectType(effectList);
|
||
if (!effectType)
|
||
return;
|
||
const effectIndex = effectType.GetIndex();
|
||
return instanceEffectList.IsEffectIndexActive(effectIndex)
|
||
}
|
||
}
|
||
C3.PropertyTrackState.EffectSourceAdapter = EffectSourceAdapter
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const INDEX = 0;
|
||
class PluginSourceAdapter extends C3.PropertyTrackState.PropertySourceAdapter {
|
||
constructor(propertyTrack) {
|
||
super(propertyTrack)
|
||
}
|
||
GetEditorIndex() {
|
||
return this._propertyTrack.GetPropertyTrackDataItem().GetSourceAdapterArguments()[INDEX]
|
||
}
|
||
GetTarget() {
|
||
return this._propertyTrack.GetTrack().GetInstance().GetSdkInstance()
|
||
}
|
||
Interpolate(time, start, end, setTime, noChange, ensureValue) {
|
||
const track = this._propertyTrack.GetTrack();
|
||
const templatePlugin = track.GetObjectClass().GetPlugin();
|
||
const currentPlugin = track.GetInstance().GetObjectClass().GetPlugin();
|
||
if (templatePlugin !== currentPlugin)
|
||
return;
|
||
return super.Interpolate(time, start, end, setTime, noChange, ensureValue)
|
||
}
|
||
}
|
||
C3.PropertyTrackState.PluginSourceAdapter = PluginSourceAdapter
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
class ValueSourceAdapter extends C3.PropertyTrackState.PropertySourceAdapter {
|
||
constructor(propertyTrack) {
|
||
super(propertyTrack);
|
||
this._value = 0;
|
||
this._init = false
|
||
}
|
||
SetInitialState() {
|
||
const propertyTrackData = this._propertyTrack.GetPropertyTrackData();
|
||
let propertyTrackDataItem = this._propertyTrack.GetPropertyTrackDataItem();
|
||
propertyTrackDataItem = propertyTrackData.GetFirstPropertyKeyframeDataItem(propertyTrackDataItem);
|
||
this._value = propertyTrackDataItem.GetValueWithResultMode()
|
||
}
|
||
SetResumeState() {}
|
||
GetValue() {
|
||
if (!this._init)
|
||
this._propertyTrack.Interpolate(0);
|
||
return this._value
|
||
}
|
||
Interpolate(time, start, end, setTime, noChange, ensureValue) {
|
||
const interpolateFunc = C3.PropertyTrackState.NumericTypeAdapter.Interpolate;
|
||
this._value = interpolateFunc(time, start, end, this._propertyTrack);
|
||
this._init = true
|
||
}
|
||
SaveState() {}
|
||
ClearSaveState() {}
|
||
GetCurrentState() {
|
||
return this._value
|
||
}
|
||
CompareInitialStateWithCurrent() {
|
||
return false
|
||
}
|
||
CompareSaveStateWithCurrent() {
|
||
return false
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"value": this._value,
|
||
"init": this._init
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
this._value = o["value"];
|
||
this._init = o.hasOwnProperty("init") ? o["init"] : true
|
||
}
|
||
}
|
||
C3.PropertyTrackState.ValueSourceAdapter = ValueSourceAdapter
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.PropertyTrackState.PropertyInterpolationAdapter = class PropertyInterpolationAdapter {
|
||
constructor(sourceAdapter) {
|
||
this._sourceAdapter = sourceAdapter;
|
||
this._propertyTrack = sourceAdapter.GetPropertyTrack();
|
||
this._worldInfo = this._propertyTrack.GetTrack().GetWorldInfo();
|
||
this._property = this._propertyTrack.GetPropertyName();
|
||
this._firstAbsoluteUpdate = false;
|
||
this._saveState = null;
|
||
this._target = null
|
||
}
|
||
Release() {
|
||
this._sourceAdapter = null;
|
||
this._propertyTrack = null;
|
||
this._worldInfo = null;
|
||
this._saveState = null;
|
||
this._target = null
|
||
}
|
||
CleanCaches() {
|
||
this._worldInfo = null;
|
||
this._saveState = null;
|
||
this._target = null
|
||
}
|
||
GetPropertyTrack() {
|
||
return this._propertyTrack
|
||
}
|
||
GetWorldInfo() {
|
||
if (this._worldInfo)
|
||
return this._worldInfo;
|
||
this._worldInfo = this._propertyTrack.GetTrack().GetWorldInfo();
|
||
return this._worldInfo
|
||
}
|
||
SetFirstAbsoluteUpdate(f) {
|
||
this._firstAbsoluteUpdate = !!f
|
||
}
|
||
GetFirstAbsoluteUpdate() {
|
||
return this._firstAbsoluteUpdate
|
||
}
|
||
SetInitialState() {}
|
||
SetResumeState() {}
|
||
SetSaveState() {
|
||
this._saveState = this.GetCurrentState()
|
||
}
|
||
ClearSaveState() {
|
||
this._saveState = null
|
||
}
|
||
GetCurrentState() {}
|
||
CompareInitialStateWithCurrent() {}
|
||
CompareSaveStateWithCurrent() {}
|
||
CanChange(value) {
|
||
const targetType = typeof this._Getter();
|
||
const newType = typeof value;
|
||
return targetType === newType
|
||
}
|
||
BeforeChangeProperty() {}
|
||
ChangeProperty(time, value, start, end, setTime) {}
|
||
AfterChangeProperty() {}
|
||
_FirstKeyframeGetter() {
|
||
const propertyKeyframeDataItem = this._PickTimelinePlaybackMode(()=>{
|
||
const propertyTrackDataItem = this._propertyTrack.GetPropertyTrackDataItem();
|
||
const propertyTrackData = this._propertyTrack.GetPropertyTrackData();
|
||
return propertyTrackData.GetFirstPropertyKeyframeDataItem(propertyTrackDataItem)
|
||
}
|
||
, ()=>{
|
||
const propertyTrackDataItem = this._propertyTrack.GetPropertyTrackDataItem();
|
||
const propertyTrackData = this._propertyTrack.GetPropertyTrackData();
|
||
return propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem)
|
||
}
|
||
);
|
||
return propertyKeyframeDataItem.GetAbsoluteValue()
|
||
}
|
||
_CurrentKeyframeGetter() {
|
||
const timeline = this._propertyTrack.GetTimeline();
|
||
const time = timeline.GetTime() - this._propertyTrack.GetTrack().GetStartOffset();
|
||
const propertyKeyframe = this._PickTimelinePlaybackMode(()=>{
|
||
const propertyTrackDataItem = this._propertyTrack.GetPropertyTrackDataItem();
|
||
const propertyTrackData = this._propertyTrack.GetPropertyTrackData();
|
||
return propertyTrackData.GetFirstPropertyKeyFrameDataItemLowerOrEqualThan(time, propertyTrackDataItem)
|
||
}
|
||
, ()=>{
|
||
const propertyTrackDataItem = this._propertyTrack.GetPropertyTrackDataItem();
|
||
const propertyTrackData = this._propertyTrack.GetPropertyTrackData();
|
||
const ret = propertyTrackData.GetFirstPropertyKeyFrameDataItemHigherOrEqualThan(time, propertyTrackDataItem);
|
||
if (!ret)
|
||
return propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem);
|
||
return ret
|
||
}
|
||
);
|
||
return propertyKeyframe.GetAbsoluteValue()
|
||
}
|
||
_PickTimelinePlaybackMode(forwardFunc, backwardFunc) {
|
||
const timeline = this._propertyTrack.GetTimeline();
|
||
return timeline.IsForwardPlayBack() ? forwardFunc() : backwardFunc()
|
||
}
|
||
_PickResultMode(relativeFunc, absoluteFunc) {
|
||
const resultMode = this._propertyTrack.GetResultMode();
|
||
return resultMode === "relative" ? relativeFunc() : absoluteFunc()
|
||
}
|
||
_PickFirstAbsoluteUpdate(firstFunc, otherFunc) {
|
||
if (this.GetFirstAbsoluteUpdate()) {
|
||
this.SetFirstAbsoluteUpdate(false);
|
||
return firstFunc()
|
||
} else
|
||
return otherFunc()
|
||
}
|
||
_GetAbsoluteInitialValue(keyframeValue) {}
|
||
_GetIndex() {
|
||
return this._sourceAdapter.GetIndex()
|
||
}
|
||
_GetTarget() {
|
||
if (this._target)
|
||
return this._target;
|
||
this._target = this._sourceAdapter.GetTarget();
|
||
return this._target
|
||
}
|
||
_PickSource(bFunc, eFunc, ivFunc, pFunc, wiFunc) {
|
||
const id = this._propertyTrack.GetSourceAdapterId();
|
||
switch (id) {
|
||
case "behavior":
|
||
return bFunc();
|
||
case "effect":
|
||
return eFunc();
|
||
case "instance-variable":
|
||
return ivFunc();
|
||
case "plugin":
|
||
return pFunc();
|
||
case "world-instance":
|
||
return wiFunc()
|
||
}
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"firstAbsoluteUpdate": this._firstAbsoluteUpdate,
|
||
"saveState": this._saveState
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
this._firstAbsoluteUpdate = o["firstAbsoluteUpdate"];
|
||
this._saveState = o["saveState"]
|
||
}
|
||
_GetPropertyKeyframeStubs(propertyTracks, firstOnly=false) {
|
||
const ret = [];
|
||
for (const propertyTrack of propertyTracks) {
|
||
const startOffset = propertyTrack.GetTrack().GetStartOffset();
|
||
for (const propertyKeyframeDataItem of propertyTrack.GetPropertyKeyframeDataItems())
|
||
if (firstOnly && propertyKeyframeDataItem.GetTime() === 0)
|
||
ret.push({
|
||
time: startOffset + propertyKeyframeDataItem.GetTime(),
|
||
value: propertyKeyframeDataItem.GetAbsoluteValue()
|
||
});
|
||
else if (!firstOnly)
|
||
ret.push({
|
||
time: startOffset + propertyKeyframeDataItem.GetTime(),
|
||
value: propertyKeyframeDataItem.GetAbsoluteValue()
|
||
})
|
||
}
|
||
return ret.sort((f,s)=>f.time - s.time)
|
||
}
|
||
_GetLastPropertyKeyframeStub(timeline, time, propertyKeyframeStubs) {
|
||
return this._GetPropertyKeyframeStubLowerThanPlayhead(time, propertyKeyframeStubs)
|
||
}
|
||
_GetPropertyKeyframeStubLowerThanPlayhead(time, propertyKeyframeStubs) {
|
||
for (let i = propertyKeyframeStubs.length - 1; i >= 0; i--) {
|
||
const stubTime = propertyKeyframeStubs[i].time;
|
||
if (stubTime <= time)
|
||
return propertyKeyframeStubs[i]
|
||
}
|
||
return null
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const TMP_COLORS_MAP = new Map;
|
||
const TMP_COLOR = [0, 0, 0];
|
||
class ColorInterpolationAdapter extends C3.PropertyTrackState.PropertyInterpolationAdapter {
|
||
constructor(sourceAdapter) {
|
||
super(sourceAdapter)
|
||
}
|
||
SetInitialState() {}
|
||
SetResumeState() {}
|
||
GetCurrentState() {
|
||
const id = this._propertyTrack.GetSourceAdapterId();
|
||
const target = this._GetTarget();
|
||
const index = this._GetIndex();
|
||
switch (id) {
|
||
case "behavior":
|
||
return this._ToColorArray(target.GetPropertyValueByIndex(index));
|
||
case "effect":
|
||
return this._ToColorArray(target[index]);
|
||
case "plugin":
|
||
return this._ToColorArray(target.GetPropertyValueByIndex(index));
|
||
case "world-instance":
|
||
return this._ToColorArray(this._Getter())
|
||
}
|
||
}
|
||
CompareInitialStateWithCurrent() {
|
||
const firstKeyframeColor = this._FirstKeyframeGetter();
|
||
return !this._CompareColors(firstKeyframeColor, this._Getter())
|
||
}
|
||
CompareSaveStateWithCurrent() {
|
||
if (C3.IsNullOrUndefined(this._saveState))
|
||
return false;
|
||
return !this._CompareColors(this._saveState, this._Getter())
|
||
}
|
||
_CompareColors(fColor, sColor) {
|
||
return fColor.equalsIgnoringAlpha(sColor)
|
||
}
|
||
_FirstKeyframeGetter() {
|
||
const color = super._FirstKeyframeGetter();
|
||
return this._GetColorFromArray(color)
|
||
}
|
||
_CurrentKeyframeGetter() {
|
||
const color = super._CurrentKeyframeGetter();
|
||
return this._GetColorFromArray(color)
|
||
}
|
||
_GetAbsoluteInitialValue(value) {}
|
||
_ToColorArray(color) {
|
||
if (C3.IsInstanceOf(color, C3.Color))
|
||
return color.toArray().slice(0, 3);
|
||
return color.slice(0, 3)
|
||
}
|
||
_GetColorFromArray(color) {
|
||
if (C3.IsInstanceOf(color, C3.Color))
|
||
return color;
|
||
return new C3.Color(color[0],color[1],color[2],1)
|
||
}
|
||
CanChange(value) {
|
||
return true
|
||
}
|
||
BeforeChangeProperty() {
|
||
const instance = this._propertyTrack.GetInstance();
|
||
if (!TMP_COLORS_MAP.has(instance))
|
||
TMP_COLORS_MAP.set(instance, new Map);
|
||
const instanceMap = TMP_COLORS_MAP.get(instance);
|
||
const id = this._propertyTrack.GetSourceAdapterId();
|
||
if (!instanceMap.has(id))
|
||
instanceMap.set(id, new Map);
|
||
const sourceMap = instanceMap.get(id);
|
||
if (!sourceMap.has(this._property))
|
||
sourceMap.set(this._property, {
|
||
used: false,
|
||
color: new C3.Color(0,0,0,1)
|
||
})
|
||
}
|
||
_GetTmpColor(instance, sourceId, propertyName) {
|
||
const tmpColorObj = TMP_COLORS_MAP.get(instance).get(sourceId).get(propertyName);
|
||
tmpColorObj.used = true;
|
||
return tmpColorObj.color
|
||
}
|
||
ChangeProperty(time, value, start, end, setTime) {
|
||
const timeline = this._propertyTrack.GetTimeline();
|
||
const track = this._propertyTrack.GetTrack();
|
||
const instance = this._propertyTrack.GetInstance();
|
||
const sourceAdapter = this._propertyTrack.GetSourceAdapter();
|
||
const sourceAdapterId = this._propertyTrack.GetSourceAdapterId();
|
||
const property = this._property;
|
||
const propertyTracks = timeline.GetSimilarPropertyTracks(instance, sourceAdapter, property);
|
||
if (propertyTracks.length > 1) {
|
||
const propertyKeyframeStubs = this._GetPropertyKeyframeStubs(propertyTracks, true);
|
||
const stub = this._GetLastPropertyKeyframeStub(timeline, timeline.GetTime(), propertyKeyframeStubs);
|
||
if (stub) {
|
||
const startOffset = track.GetStartOffset();
|
||
const t = stub.time - startOffset;
|
||
if (t === 0)
|
||
this._GetTmpColor(instance, sourceAdapterId, this._property).addRgb(value[0], value[1], value[2]);
|
||
else {
|
||
if (t < 0)
|
||
return;
|
||
const r = value[0];
|
||
const g = value[1];
|
||
const b = value[2];
|
||
const v = this._propertyTrack.Interpolate(t, false, true);
|
||
const dr = C3.Color.DiffChannel(r, v[0]);
|
||
const dg = C3.Color.DiffChannel(g, v[1]);
|
||
const db = C3.Color.DiffChannel(b, v[2]);
|
||
this._GetTmpColor(instance, sourceAdapterId, this._property).addRgb(dr, dg, db)
|
||
}
|
||
}
|
||
} else
|
||
this._Setter(value[0], value[1], value[2]);
|
||
return C3.TimelineState.LAYOUT_RENDER_CHANGE
|
||
}
|
||
AfterChangeProperty() {
|
||
const instance = this._propertyTrack.GetInstance();
|
||
if (!TMP_COLORS_MAP.has(instance))
|
||
return;
|
||
const instanceMap = TMP_COLORS_MAP.get(instance);
|
||
const id = this._propertyTrack.GetSourceAdapterId();
|
||
if (!instanceMap.has(id))
|
||
return;
|
||
const sourceMap = instanceMap.get(id);
|
||
if (!sourceMap.has(this._property))
|
||
return;
|
||
const tmpColorObj = sourceMap.get(this._property);
|
||
const used = tmpColorObj.used;
|
||
const color = tmpColorObj.color;
|
||
if (used)
|
||
this._Setter(color.getR(), color.getG(), color.getB());
|
||
if (sourceMap.size === 0)
|
||
instanceMap.delete(id);
|
||
if (instanceMap.size === 0)
|
||
TMP_COLORS_MAP.delete(instance)
|
||
}
|
||
_Getter() {
|
||
const id = this._propertyTrack.GetSourceAdapterId();
|
||
const target = this._GetTarget();
|
||
const index = this._GetIndex();
|
||
switch (id) {
|
||
case "behavior":
|
||
return this._GetColorFromArray(target.GetPropertyValueByIndex(index));
|
||
case "effect":
|
||
return target[index].clone();
|
||
case "plugin":
|
||
return this._GetColorFromArray(target.GetPropertyValueByIndex(index));
|
||
case "world-instance":
|
||
return this.GetWorldInfo().GetUnpremultipliedColor().clone()
|
||
}
|
||
}
|
||
_Setter(r, g, b) {
|
||
const id = this._propertyTrack.GetSourceAdapterId();
|
||
const target = this._GetTarget();
|
||
const index = this._GetIndex();
|
||
switch (id) {
|
||
case "behavior":
|
||
TMP_COLOR[0] = r;
|
||
TMP_COLOR[1] = g;
|
||
TMP_COLOR[2] = b;
|
||
target.SetPropertyValueByIndex(index, TMP_COLOR);
|
||
break;
|
||
case "effect":
|
||
target[index].setRgb(r, g, b);
|
||
break;
|
||
case "plugin":
|
||
TMP_COLOR[0] = r;
|
||
TMP_COLOR[1] = g;
|
||
TMP_COLOR[2] = b;
|
||
target.SetPropertyValueByIndex(index, TMP_COLOR);
|
||
break;
|
||
case "world-instance":
|
||
this.GetWorldInfo().SetUnpremultipliedColorRGB(r, g, b);
|
||
break
|
||
}
|
||
}
|
||
_SaveToJson() {}
|
||
_LoadFromJson(o) {}
|
||
}
|
||
C3.PropertyTrackState.PropertyInterpolationAdapter.ColorInterpolationAdapter = ColorInterpolationAdapter
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
class NoInterpolationAdapter extends C3.PropertyTrackState.PropertyInterpolationAdapter {
|
||
constructor(sourceAdapter) {
|
||
super(sourceAdapter)
|
||
}
|
||
SetInitialState() {}
|
||
SetResumeState() {}
|
||
GetCurrentState() {
|
||
return this._Getter()
|
||
}
|
||
CompareInitialStateWithCurrent() {
|
||
const firstKeyframeValue = this._FirstKeyframeGetter();
|
||
return firstKeyframeValue !== this.GetCurrentState()
|
||
}
|
||
CompareSaveStateWithCurrent() {
|
||
if (C3.IsNullOrUndefined(this._saveState))
|
||
return false;
|
||
return this._saveState !== this.GetCurrentState()
|
||
}
|
||
ChangeProperty(time, value, start, end, setTime) {
|
||
const willChangeFunc = C3.PropertyTrackState.PropertySourceAdapter.GetWillChangeFunc(this._propertyTrack);
|
||
const propertyTrack = this._propertyTrack;
|
||
const track = propertyTrack.GetTrack();
|
||
const id = propertyTrack.GetSourceAdapterId();
|
||
const timeline = propertyTrack.GetTimeline();
|
||
const instance = track.GetInstance();
|
||
const sourceAdapter = propertyTrack.GetSourceAdapter();
|
||
const property = this._property;
|
||
const propertyTracks = timeline.GetSimilarPropertyTracks(instance, sourceAdapter, property);
|
||
if (propertyTracks.length > 1) {
|
||
const propertyKeyframeStubs = this._GetPropertyKeyframeStubs(propertyTracks);
|
||
const t = time + track.GetStartOffset();
|
||
const stub = this._GetLastPropertyKeyframeStub(timeline, t, propertyKeyframeStubs);
|
||
if (stub)
|
||
value = stub.value
|
||
}
|
||
const change = willChangeFunc(this._GetIndex(), this._GetTarget(), value, id);
|
||
if (!change)
|
||
return;
|
||
this._Setter(value);
|
||
switch (id) {
|
||
case "behavior":
|
||
return;
|
||
case "effect":
|
||
return;
|
||
case "instance-variable":
|
||
return;
|
||
case "plugin":
|
||
return C3.TimelineState.LAYOUT_RENDER_CHANGE
|
||
}
|
||
}
|
||
_Getter() {
|
||
const id = this._propertyTrack.GetSourceAdapterId();
|
||
const target = this._GetTarget();
|
||
const index = this._GetIndex();
|
||
switch (id) {
|
||
case "behavior":
|
||
return target.GetPropertyValueByIndex(index);
|
||
case "effect":
|
||
return target[index];
|
||
case "instance-variable":
|
||
return target.GetInstanceVariableValue(index);
|
||
case "plugin":
|
||
return target.GetPropertyValueByIndex(index)
|
||
}
|
||
}
|
||
_Setter(value) {
|
||
const id = this._propertyTrack.GetSourceAdapterId();
|
||
const target = this._GetTarget();
|
||
const index = this._GetIndex();
|
||
switch (id) {
|
||
case "behavior":
|
||
target.SetPropertyValueByIndex(index, value);
|
||
break;
|
||
case "effect":
|
||
target[index] = value;
|
||
break;
|
||
case "instance-variable":
|
||
target.SetInstanceVariableValue(index, value);
|
||
break;
|
||
case "plugin":
|
||
target.SetPropertyValueByIndex(index, value);
|
||
break
|
||
}
|
||
}
|
||
}
|
||
C3.PropertyTrackState.PropertyInterpolationAdapter.NoInterpolationAdapter = NoInterpolationAdapter
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const NS = C3.PropertyTrackState.PropertyInterpolationAdapter;
|
||
const INSTANCE_FUNC_MAP = new Map;
|
||
const add = (prop,setter,absolute_setter,getter,round)=>INSTANCE_FUNC_MAP.set(prop, {
|
||
setter,
|
||
absolute_setter,
|
||
getter,
|
||
round
|
||
});
|
||
add("offsetX", (wi,v)=>wi.OffsetX(v), (wi,v)=>wi.SetX(v), wi=>wi.GetX(), true);
|
||
add("offsetY", (wi,v)=>wi.OffsetY(v), (wi,v)=>wi.SetY(v), wi=>wi.GetY(), true);
|
||
add("offsetWidth", (wi,v)=>wi.OffsetWidth(v), (wi,v)=>wi.SetWidth(v), wi=>wi.GetWidth(), true);
|
||
add("offsetHeight", (wi,v)=>wi.OffsetHeight(v), (wi,v)=>wi.SetHeight(v), wi=>wi.GetHeight(), true);
|
||
add("offsetAngle", (wi,v)=>wi.OffsetAngle(v), (wi,v)=>wi.SetAngle(v), wi=>wi.GetAngle(), false);
|
||
add("offsetOpacity", (wi,v)=>wi.OffsetOpacity(v), (wi,v)=>wi.SetOpacity(v), wi=>wi.GetOpacity(), false);
|
||
add("offsetOriginX", (wi,v)=>wi.OffsetOriginX(v), (wi,v)=>wi.SetOriginX(v), wi=>wi.GetOriginX(), false);
|
||
add("offsetOriginY", (wi,v)=>wi.OffsetOriginY(v), (wi,v)=>wi.SetOriginY(v), wi=>wi.GetOriginY(), false);
|
||
add("offsetZElevation", (wi,v)=>wi.OffsetZElevation(v), (wi,v)=>wi.SetZElevation(v), wi=>wi.GetZElevation(), true);
|
||
add("offsetScaleX", (wi,v,t)=>{
|
||
wi.OffsetWidth(t.GetOriginalWidth() * v)
|
||
}
|
||
, (wi,v,t)=>{
|
||
wi.SetWidth(t.GetOriginalWidth() * v)
|
||
}
|
||
, (wi,t)=>{
|
||
return wi.GetWidth() / t.GetOriginalWidth()
|
||
}
|
||
, false);
|
||
add("offsetScaleY", (wi,v,t)=>{
|
||
wi.OffsetHeight(t.GetOriginalHeight() * v)
|
||
}
|
||
, (wi,v,t)=>{
|
||
wi.SetHeight(t.GetOriginalHeight() * v)
|
||
}
|
||
, (wi,t)=>{
|
||
return wi.GetHeight() / t.GetOriginalHeight()
|
||
}
|
||
, false);
|
||
class NumericInterpolationAdapter extends C3.PropertyTrackState.PropertyInterpolationAdapter {
|
||
constructor(sourceAdapter) {
|
||
super(sourceAdapter);
|
||
this._lastValue = 0;
|
||
this._instance_getter = null;
|
||
this._instance_setter = null;
|
||
this._instance_absolute_setter = null;
|
||
this._round = false;
|
||
if (C3.IsInstanceOf(this._propertyTrack.GetTimeline(), C3.Tween))
|
||
this._typeAdapter = new C3.PropertyTrackState.PropertyInterpolationAdapter.NumericInterpolationAdapterForTween(this);
|
||
else
|
||
this._typeAdapter = new C3.PropertyTrackState.PropertyInterpolationAdapter.NumericInterpolationAdapterForTimeline(this);
|
||
const property = this._propertyTrack.GetPropertyName();
|
||
if (this._propertyTrack.GetSourceAdapterId() === "world-instance") {
|
||
const p = INSTANCE_FUNC_MAP.get(property);
|
||
this._instance_getter = p.getter;
|
||
this._instance_setter = p.setter;
|
||
this._instance_absolute_setter = p.absolute_setter;
|
||
this._round = p.round
|
||
}
|
||
}
|
||
Release() {
|
||
this._typeAdapter = null;
|
||
this._instance_getter = null;
|
||
this._instance_setter = null;
|
||
this._instance_absolute_setter = null;
|
||
super.Release()
|
||
}
|
||
GetLastValue() {
|
||
return this._lastValue
|
||
}
|
||
SetLastValue(v) {
|
||
this._lastValue = v
|
||
}
|
||
SetInitialState() {
|
||
const initValue = this._typeAdapter.SetInitialState();
|
||
if (typeof initValue === "number")
|
||
this._lastValue = initValue
|
||
}
|
||
SetResumeState() {
|
||
const resumeValue = this._typeAdapter.SetResumeState();
|
||
if (typeof resumeValue === "number")
|
||
this._lastValue = resumeValue
|
||
}
|
||
GetCurrentState() {
|
||
return this._Getter()
|
||
}
|
||
CompareInitialStateWithCurrent() {
|
||
const firstKeyframeValue = this._FirstKeyframeGetter();
|
||
return firstKeyframeValue !== this.GetCurrentState()
|
||
}
|
||
CompareSaveStateWithCurrent() {
|
||
if (C3.IsNullOrUndefined(this._saveState))
|
||
return false;
|
||
return this._saveState !== this.GetCurrentState()
|
||
}
|
||
BeforeChangeProperty() {
|
||
this._typeAdapter.BeforeChangeProperty()
|
||
}
|
||
ChangeProperty(time, value, start, end, setTime, ensureValue) {
|
||
return this._typeAdapter.ChangeProperty(time, value, start, end, setTime, ensureValue)
|
||
}
|
||
AfterChangeProperty() {
|
||
this._typeAdapter.AfterChangeProperty()
|
||
}
|
||
_Getter() {
|
||
const target = this._GetTarget();
|
||
const index = this._GetIndex();
|
||
const track = this._propertyTrack.GetTrack();
|
||
const wi = this.GetWorldInfo();
|
||
return this._PickSource(()=>target.GetPropertyValueByIndex(index), ()=>target[index], ()=>target.GetInstanceVariableValue(index), ()=>target.GetPropertyValueByIndex(index), ()=>this._instance_getter(wi, track))
|
||
}
|
||
_Setter(value, start, end) {
|
||
const target = this._GetTarget();
|
||
const index = this._GetIndex();
|
||
const track = this._propertyTrack.GetTrack();
|
||
const wi = this.GetWorldInfo();
|
||
this._PickSource(()=>target.OffsetPropertyValueByIndex(index, value), ()=>target[index] += value, ()=>target.SetInstanceVariableOffset(index, value), ()=>target.OffsetPropertyValueByIndex(index, value), ()=>this._instance_setter(wi, value, track))
|
||
}
|
||
_SetterAbsolute(value, start, end) {
|
||
const target = this._GetTarget();
|
||
const index = this._GetIndex();
|
||
const track = this._propertyTrack.GetTrack();
|
||
const wi = this.GetWorldInfo();
|
||
this._PickSource(()=>target.SetPropertyValueByIndex(index, value), ()=>target[index] = value, ()=>target.SetInstanceVariableValue(index, value), ()=>target.SetPropertyValueByIndex(index, value), ()=>this._instance_absolute_setter(wi, value, track))
|
||
}
|
||
_MaybeEnsureValue(time, start, end, setTime, lastValue, currentValue) {
|
||
this._typeAdapter._MaybeEnsureValue(time, start, end, setTime, lastValue, currentValue)
|
||
}
|
||
_AddDelta(value, start, end) {
|
||
const stringValue = value.toString();
|
||
const decimalsString = stringValue.split(".")[1] || "";
|
||
const decimalPlaces = decimalsString.length;
|
||
const v = this._Getter();
|
||
let rv;
|
||
if (decimalPlaces === 0)
|
||
rv = this._round ? Math.round(v) : v;
|
||
else
|
||
rv = C3.toFixed(v, decimalPlaces);
|
||
this._Setter(rv - v, start, end)
|
||
}
|
||
_SaveToJson() {
|
||
return Object.assign(super._SaveToJson(), {
|
||
"v": this._lastValue
|
||
})
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
super._LoadFromJson(o);
|
||
this._lastValue = o["v"]
|
||
}
|
||
}
|
||
C3.PropertyTrackState.PropertyInterpolationAdapter.NumericInterpolationAdapter = NumericInterpolationAdapter
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const TMP_ABSOLUTE_VALUES_MAP = new Map;
|
||
class NumericInterpolationAdapterForTimeline {
|
||
constructor(numericInterpolationAdapter) {
|
||
this._numericInterpolationAdapter = numericInterpolationAdapter
|
||
}
|
||
Release() {
|
||
this._numericInterpolationAdapter = null
|
||
}
|
||
SetInitialState() {
|
||
const adapter = this._numericInterpolationAdapter;
|
||
const propertyTrack = this._numericInterpolationAdapter.GetPropertyTrack();
|
||
return adapter._PickResultMode(()=>{
|
||
return adapter._PickTimelinePlaybackMode(()=>0, ()=>C3.PropertyTrackState.PropertySourceAdapter.GetValueAtTime(propertyTrack))
|
||
}
|
||
, ()=>{}
|
||
)
|
||
}
|
||
SetResumeState() {}
|
||
BeforeChangeProperty() {
|
||
const adapter = this._numericInterpolationAdapter;
|
||
const propertyTrack = this._numericInterpolationAdapter.GetPropertyTrack();
|
||
const property = propertyTrack.GetPropertyName();
|
||
adapter._PickResultMode(()=>{}
|
||
, ()=>{
|
||
const instance = propertyTrack.GetInstance();
|
||
if (!TMP_ABSOLUTE_VALUES_MAP.has(instance))
|
||
TMP_ABSOLUTE_VALUES_MAP.set(instance, new Map);
|
||
const instanceMap = TMP_ABSOLUTE_VALUES_MAP.get(instance);
|
||
const id = propertyTrack.GetSourceAdapterId();
|
||
if (!instanceMap.has(id))
|
||
instanceMap.set(id, new Map);
|
||
const sourceMap = instanceMap.get(id);
|
||
if (!sourceMap.has(property))
|
||
sourceMap.set(property, {
|
||
used: false,
|
||
value: 0
|
||
})
|
||
}
|
||
)
|
||
}
|
||
_GetTmpAbsoluteValueObject(instance, sourceId, propertyName) {
|
||
const tmpAbsoluteValueObj = TMP_ABSOLUTE_VALUES_MAP.get(instance).get(sourceId).get(propertyName);
|
||
tmpAbsoluteValueObj.used = true;
|
||
return tmpAbsoluteValueObj
|
||
}
|
||
ChangeProperty(time, value, start, end, setTime, ensureValue) {
|
||
const adapter = this._numericInterpolationAdapter;
|
||
const propertyTrack = this._numericInterpolationAdapter.GetPropertyTrack();
|
||
const property = propertyTrack.GetPropertyName();
|
||
adapter._PickResultMode(()=>{
|
||
const lastValue = adapter.GetLastValue();
|
||
adapter._Setter(value - lastValue, start, end);
|
||
if (ensureValue)
|
||
this._MaybeEnsureValue(time, start, end, setTime, lastValue, value);
|
||
adapter.SetLastValue(value)
|
||
}
|
||
, ()=>{
|
||
const timeline = propertyTrack.GetTimeline();
|
||
const track = propertyTrack.GetTrack();
|
||
const instance = propertyTrack.GetInstance();
|
||
const sourceAdapter = propertyTrack.GetSourceAdapter();
|
||
const sourceAdapterId = propertyTrack.GetSourceAdapterId();
|
||
const propertyTracks = timeline.GetSimilarPropertyTracks(instance, sourceAdapter, property);
|
||
if (propertyTracks.length > 1) {
|
||
const propertyKeyframeStubs = adapter._GetPropertyKeyframeStubs(propertyTracks, true);
|
||
const stub = adapter._GetLastPropertyKeyframeStub(timeline, timeline.GetTime(), propertyKeyframeStubs);
|
||
if (stub) {
|
||
const startOffset = track.GetStartOffset();
|
||
const t = stub.time - startOffset;
|
||
if (t === 0) {
|
||
const valueObj = this._GetTmpAbsoluteValueObject(instance, sourceAdapterId, property);
|
||
valueObj.value += value
|
||
} else {
|
||
if (t < 0)
|
||
return;
|
||
const v = propertyTrack.Interpolate(t, false, true);
|
||
const valueObj = this._GetTmpAbsoluteValueObject(instance, sourceAdapterId, property);
|
||
valueObj.value += value - v
|
||
}
|
||
}
|
||
} else
|
||
adapter._SetterAbsolute(value)
|
||
}
|
||
);
|
||
return adapter._PickSource(()=>{}
|
||
, ()=>C3.TimelineState.LAYOUT_RENDER_CHANGE, ()=>{}
|
||
, ()=>C3.TimelineState.LAYOUT_RENDER_CHANGE, ()=>C3.TimelineState.LAYOUT_RENDER_CHANGE)
|
||
}
|
||
AfterChangeProperty() {
|
||
const adapter = this._numericInterpolationAdapter;
|
||
const propertyTrack = this._numericInterpolationAdapter.GetPropertyTrack();
|
||
const property = propertyTrack.GetPropertyName();
|
||
adapter._PickResultMode(()=>{}
|
||
, ()=>{
|
||
const instance = propertyTrack.GetInstance();
|
||
if (!TMP_ABSOLUTE_VALUES_MAP.has(instance))
|
||
return;
|
||
const instanceMap = TMP_ABSOLUTE_VALUES_MAP.get(instance);
|
||
const id = propertyTrack.GetSourceAdapterId();
|
||
if (!instanceMap.has(id))
|
||
return;
|
||
const sourceMap = instanceMap.get(id);
|
||
if (!sourceMap.has(property))
|
||
return;
|
||
const tmpValueObj = sourceMap.get(property);
|
||
const used = tmpValueObj.used;
|
||
const value = tmpValueObj.value;
|
||
if (used)
|
||
adapter._SetterAbsolute(value);
|
||
sourceMap.delete(property);
|
||
if (sourceMap.size === 0)
|
||
instanceMap.delete(id);
|
||
if (instanceMap.size === 0)
|
||
TMP_ABSOLUTE_VALUES_MAP.delete(instance)
|
||
}
|
||
)
|
||
}
|
||
_MaybeEnsureValue(time, start, end, setTime, lastValue, currentValue) {
|
||
const adapter = this._numericInterpolationAdapter;
|
||
if (setTime)
|
||
return;
|
||
if (start && time === start.GetTime())
|
||
adapter._AddDelta(start.GetValueWithResultMode(), start, end);
|
||
else if (end && time === end.GetTime())
|
||
adapter._AddDelta(end.GetValueWithResultMode(), start, end);
|
||
else if (currentValue - lastValue === 0)
|
||
adapter._AddDelta(start.GetValueWithResultMode(), start, end)
|
||
}
|
||
}
|
||
C3.PropertyTrackState.PropertyInterpolationAdapter.NumericInterpolationAdapterForTimeline = NumericInterpolationAdapterForTimeline
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const TMP_ABSOLUTE_VALUES_MAP = new Map;
|
||
class NumericInterpolationAdapterForTween {
|
||
constructor(numericInterpolationAdapter) {
|
||
this._numericInterpolationAdapter = numericInterpolationAdapter
|
||
}
|
||
Release() {
|
||
this._numericInterpolationAdapter = null
|
||
}
|
||
SetInitialState() {
|
||
const adapter = this._numericInterpolationAdapter;
|
||
adapter.SetFirstAbsoluteUpdate(true);
|
||
return this._GetAbsoluteInitialValue(adapter._FirstKeyframeGetter())
|
||
}
|
||
SetResumeState() {
|
||
const adapter = this._numericInterpolationAdapter;
|
||
if (adapter._FirstKeyframeGetter() === adapter._CurrentKeyframeGetter())
|
||
return;
|
||
adapter.SetFirstAbsoluteUpdate(true);
|
||
return this._GetAbsoluteInitialValue(adapter._CurrentKeyframeGetter())
|
||
}
|
||
BeforeChangeProperty() {}
|
||
ChangeProperty(time, value, start, end, setTime, ensureValue) {
|
||
const adapter = this._numericInterpolationAdapter;
|
||
const lastValue = adapter.GetLastValue();
|
||
adapter._PickResultMode(()=>{
|
||
adapter._Setter(value - lastValue, start, end);
|
||
if (ensureValue)
|
||
this._MaybeEnsureValue(time, start, end, setTime, lastValue, value)
|
||
}
|
||
, ()=>{
|
||
adapter._PickFirstAbsoluteUpdate(()=>{
|
||
adapter._Setter(lastValue, start, end)
|
||
}
|
||
, ()=>{
|
||
adapter._Setter(value - lastValue, start, end);
|
||
if (ensureValue)
|
||
this._MaybeEnsureValue(time, start, end, setTime, lastValue, value)
|
||
}
|
||
)
|
||
}
|
||
);
|
||
adapter.SetLastValue(value);
|
||
return adapter._PickSource(()=>{}
|
||
, ()=>C3.TimelineState.LAYOUT_RENDER_CHANGE, ()=>{}
|
||
, ()=>C3.TimelineState.LAYOUT_RENDER_CHANGE, ()=>C3.TimelineState.LAYOUT_RENDER_CHANGE)
|
||
}
|
||
AfterChangeProperty() {}
|
||
_GetAbsoluteInitialValue(keyframeValue) {
|
||
const adapter = this._numericInterpolationAdapter;
|
||
return keyframeValue - adapter.GetCurrentState()
|
||
}
|
||
_MaybeEnsureValue(time, start, end, setTime, lastValue, currentValue) {
|
||
const adapter = this._numericInterpolationAdapter;
|
||
if (setTime)
|
||
if (start && time === start.GetTime())
|
||
adapter._AddDelta(start.GetValueWithResultMode(), start, end);
|
||
else if (end && time === end.GetTime())
|
||
adapter._AddDelta(end.GetValueWithResultMode(), start, end);
|
||
else {
|
||
if (!end)
|
||
adapter._AddDelta(start.GetValueWithResultMode(), start, end)
|
||
}
|
||
else if (start && time === start.GetTime())
|
||
adapter._AddDelta(start.GetValueWithResultMode(), start, end);
|
||
else if (end && time === end.GetTime())
|
||
adapter._AddDelta(end.GetValueWithResultMode(), start, end);
|
||
else if (currentValue - lastValue === 0)
|
||
adapter._AddDelta(start.GetValueWithResultMode(), start, end)
|
||
}
|
||
}
|
||
C3.PropertyTrackState.PropertyInterpolationAdapter.NumericInterpolationAdapterForTween = NumericInterpolationAdapterForTween
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const Ease = self.Ease;
|
||
C3.PropertyTrackState.NumericTypeAdapter = class NumericTypeAdapter {
|
||
constructor() {}
|
||
static WillChange(index, source, newValue, type) {
|
||
let oldValue;
|
||
switch (type) {
|
||
case "behavior":
|
||
oldValue = source.GetPropertyValueByIndex(index);
|
||
break;
|
||
case "effect":
|
||
oldValue = source[index];
|
||
break;
|
||
case "instance-variable":
|
||
oldValue = source.GetInstanceVariableValue(index);
|
||
break;
|
||
case "plugin":
|
||
oldValue = source.GetPropertyValueByIndex(index);
|
||
break
|
||
}
|
||
if (oldValue === newValue)
|
||
return false;
|
||
return true
|
||
}
|
||
static Interpolate(time, start, end, propertyTrack) {
|
||
if (!end) {
|
||
let propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem();
|
||
const propertyTrackData = propertyTrack.GetPropertyTrackData();
|
||
propertyTrackDataItem = propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem);
|
||
return propertyTrackDataItem.GetValueWithResultMode()
|
||
}
|
||
let mode = propertyTrack.GetInterpolationMode();
|
||
if (mode === "default")
|
||
mode = "continuous";
|
||
if (propertyTrack.GetPropertyType() === "combo")
|
||
mode = "discrete";
|
||
if (mode === "discrete")
|
||
return start.GetValueWithResultMode();
|
||
else if (mode === "continuous" || mode === "step") {
|
||
if (mode === "step") {
|
||
const step = propertyTrack.GetTimeline().GetStep();
|
||
if (step !== 0) {
|
||
const s = 1 / step;
|
||
time = Math.floor(time * s) / s
|
||
}
|
||
}
|
||
const st = start.GetTime();
|
||
const et = end.GetTime();
|
||
const sv = start.GetValueWithResultMode();
|
||
const ev = end.GetValueWithResultMode();
|
||
if (sv === ev)
|
||
return sv;
|
||
const n = C3.normalize(time, st, et);
|
||
const e = start.GetEase();
|
||
let ret;
|
||
const startAddon = start.GetAddOn("cubic-bezier");
|
||
const endAddon = end.GetAddOn("cubic-bezier");
|
||
if (startAddon && startAddon.GetStartEnable() && endAddon && endAddon.GetEndEnable()) {
|
||
const dt = et - st;
|
||
ret = Ease.GetRuntimeEase(e)(dt * n, 0, 1, dt);
|
||
ret = Ease.GetRuntimeEase("cubicbezier")(ret, sv, sv + startAddon.GetStartAnchor(), ev + endAddon.GetEndAnchor(), ev)
|
||
} else
|
||
ret = Ease.GetRuntimeEase(e)((et - st) * n, sv, ev - sv, et - st);
|
||
if (propertyTrack.GetPropertyType() === "integer")
|
||
return Math.floor(ret);
|
||
return ret
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.PropertyTrackState.AngleTypeAdapter = class AngleTypeAdapter {
|
||
constructor() {}
|
||
static WillChange(index, source, newValue, type) {
|
||
let oldValue;
|
||
switch (type) {
|
||
case "behavior":
|
||
oldValue = source.GetPropertyValueByIndex(index);
|
||
break;
|
||
case "effect":
|
||
oldValue = source[index];
|
||
break;
|
||
case "instance-variable":
|
||
oldValue = source.GetInstanceVariableValue(index);
|
||
break;
|
||
case "plugin":
|
||
oldValue = source.GetPropertyValueByIndex(index);
|
||
break
|
||
}
|
||
if (oldValue === newValue)
|
||
return false;
|
||
return true
|
||
}
|
||
static Interpolate(time, start, end, propertyTrack) {
|
||
if (!end) {
|
||
let propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem();
|
||
const propertyTrackData = propertyTrack.GetPropertyTrackData();
|
||
propertyTrackDataItem = propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem);
|
||
return propertyTrackDataItem.GetValueWithResultMode()
|
||
}
|
||
let mode = propertyTrack.GetInterpolationMode();
|
||
if (mode === "default")
|
||
mode = "continuous";
|
||
if (propertyTrack.GetPropertyType() === "combo")
|
||
mode = "discrete";
|
||
if (mode === "discrete")
|
||
return start.GetValueWithResultMode();
|
||
else if (mode === "continuous" || mode === "step") {
|
||
if (mode === "step") {
|
||
const step = propertyTrack.GetTimeline().GetStep();
|
||
if (step !== 0) {
|
||
const s = 1 / step;
|
||
time = Math.floor(time * s) / s
|
||
}
|
||
}
|
||
const st = start.GetTime();
|
||
const et = end.GetTime();
|
||
const sv = start.GetValueWithResultMode();
|
||
const ev = end.GetValueWithResultMode();
|
||
const angleAddon = start.GetAddOn("angle");
|
||
if (angleAddon) {
|
||
const revolutions = angleAddon.GetRevolutions();
|
||
if (sv === ev && revolutions === 0)
|
||
return sv;
|
||
const n = C3.normalize(time, st, et);
|
||
const easeFunc = self.Ease.GetRuntimeEase(start.GetEase());
|
||
const easeRes = easeFunc(n, 0, 1, 1);
|
||
switch (angleAddon.GetDirection()) {
|
||
case "closest":
|
||
return C3.angleLerp(sv, ev, easeRes, revolutions);
|
||
case "clockwise":
|
||
return C3.angleLerpClockwise(sv, ev, easeRes, revolutions);
|
||
case "anti-clockwise":
|
||
return C3.angleLerpAntiClockwise(sv, ev, easeRes, revolutions)
|
||
}
|
||
} else {
|
||
if (sv === ev)
|
||
return sv;
|
||
const n = C3.normalize(time, st, et);
|
||
const easeFunc = self.Ease.GetRuntimeEase(start.GetEase());
|
||
return C3.angleLerp(sv, ev, easeFunc(n, 0, 1, 1))
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.PropertyTrackState.BooleanTypeAdapter = class BooleanTypeAdapter {
|
||
constructor() {}
|
||
static WillChange(index, source, newValue, type) {
|
||
let oldValue;
|
||
switch (type) {
|
||
case "behavior":
|
||
oldValue = source.GetPropertyValueByIndex(index);
|
||
break;
|
||
case "effect":
|
||
oldValue = source[index];
|
||
break;
|
||
case "instance-variable":
|
||
oldValue = source.GetInstanceVariableValue(index);
|
||
break;
|
||
case "plugin":
|
||
oldValue = source.GetPropertyValueByIndex(index);
|
||
break
|
||
}
|
||
if (!!oldValue === !!newValue)
|
||
return false;
|
||
return true
|
||
}
|
||
static Interpolate(time, start, end, propertyTrack) {
|
||
if (!end) {
|
||
let propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem();
|
||
const propertyTrackData = propertyTrack.GetPropertyTrackData();
|
||
propertyTrackDataItem = propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem);
|
||
return propertyTrackDataItem.GetValueWithResultMode() ? 1 : 0
|
||
}
|
||
return start.GetValueWithResultMode() ? 1 : 0
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const TEMP_COLOR_ARRAY = [0, 0, 0];
|
||
const TEMP_COLOR_ARRAY_2 = [0, 0, 0];
|
||
const TEMP_COLOR_ARRAY_3 = [0, 0, 0];
|
||
C3.PropertyTrackState.ColorTypeAdapter = class ColorTypeAdapter {
|
||
constructor() {}
|
||
static WillChange(index, source, newValue, type) {
|
||
let oldValue;
|
||
switch (type) {
|
||
case "behavior":
|
||
oldValue = source.GetPropertyValueByIndex(index);
|
||
break;
|
||
case "effect":
|
||
oldValue = source[index];
|
||
break;
|
||
case "instance-variable":
|
||
oldValue = source.GetInstanceVariableValue(index);
|
||
break;
|
||
case "plugin":
|
||
oldValue = source.GetPropertyValueByIndex(index);
|
||
break
|
||
}
|
||
if (Array.isArray(newValue)) {
|
||
TEMP_COLOR_ARRAY[0] = newValue[0];
|
||
TEMP_COLOR_ARRAY[1] = newValue[1];
|
||
TEMP_COLOR_ARRAY[2] = newValue[2]
|
||
} else {
|
||
TEMP_COLOR_ARRAY_3.parseCommaSeparatedRgb(newValue);
|
||
TEMP_COLOR_ARRAY[0] = Math.floor(TEMP_COLOR_ARRAY_3.getR() * 255);
|
||
TEMP_COLOR_ARRAY[1] = Math.floor(TEMP_COLOR_ARRAY_3.getG() * 255);
|
||
TEMP_COLOR_ARRAY[2] = Math.floor(TEMP_COLOR_ARRAY_3.getB() * 255)
|
||
}
|
||
if (Array.isArray(oldValue)) {
|
||
TEMP_COLOR_ARRAY_2[0] = oldValue[0];
|
||
TEMP_COLOR_ARRAY_2[1] = oldValue[1];
|
||
TEMP_COLOR_ARRAY_2[2] = oldValue[2]
|
||
} else {
|
||
TEMP_COLOR_ARRAY_3.parseCommaSeparatedRgb(oldValue);
|
||
TEMP_COLOR_ARRAY_2[0] = Math.floor(TEMP_COLOR_ARRAY_3.getR() * 255);
|
||
TEMP_COLOR_ARRAY_2[1] = Math.floor(TEMP_COLOR_ARRAY_3.getG() * 255);
|
||
TEMP_COLOR_ARRAY_2[2] = Math.floor(TEMP_COLOR_ARRAY_3.getB() * 255)
|
||
}
|
||
if (TEMP_COLOR_ARRAY[0] !== TEMP_COLOR_ARRAY_2[0])
|
||
return true;
|
||
if (TEMP_COLOR_ARRAY[1] !== TEMP_COLOR_ARRAY_2[1])
|
||
return true;
|
||
if (TEMP_COLOR_ARRAY[2] !== TEMP_COLOR_ARRAY_2[2])
|
||
return true;
|
||
return false
|
||
}
|
||
static Interpolate(time, start, end, propertyTrack) {
|
||
if (!end) {
|
||
let propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem();
|
||
const propertyTrackData = propertyTrack.GetPropertyTrackData();
|
||
propertyTrackDataItem = propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem);
|
||
const color = propertyTrackDataItem.GetValueWithResultMode();
|
||
TEMP_COLOR_ARRAY[0] = color[0];
|
||
TEMP_COLOR_ARRAY[1] = color[1];
|
||
TEMP_COLOR_ARRAY[2] = color[2];
|
||
return TEMP_COLOR_ARRAY
|
||
}
|
||
let mode = propertyTrack.GetInterpolationMode();
|
||
if (mode === "default")
|
||
mode = "continuous";
|
||
if (mode === "discrete") {
|
||
const color = start.GetValueWithResultMode();
|
||
TEMP_COLOR_ARRAY[0] = color[0];
|
||
TEMP_COLOR_ARRAY[1] = color[1];
|
||
TEMP_COLOR_ARRAY[2] = color[2];
|
||
return TEMP_COLOR_ARRAY
|
||
} else if (mode === "continuous" || mode === "step") {
|
||
if (mode === "step") {
|
||
const step = propertyTrack.GetTimeline().GetStep();
|
||
if (step !== 0) {
|
||
const s = 1 / step;
|
||
time = Math.floor(time * s) / s
|
||
}
|
||
}
|
||
const st = start.GetTime();
|
||
const et = end.GetTime();
|
||
const sv = start.GetValueWithResultMode();
|
||
const ev = end.GetValueWithResultMode();
|
||
const n = C3.normalize(time, st, et);
|
||
const e = start.GetEase();
|
||
const sr = sv[0];
|
||
const sg = sv[1];
|
||
const sb = sv[2];
|
||
const er = ev[0];
|
||
const eg = ev[1];
|
||
const eb = ev[2];
|
||
const easeFunc = self.Ease.GetRuntimeEase(e);
|
||
const d = et - st;
|
||
const dn = d * n;
|
||
if (sr === er)
|
||
TEMP_COLOR_ARRAY[0] = sr;
|
||
else
|
||
TEMP_COLOR_ARRAY[0] = easeFunc(dn, sr, er - sr, d);
|
||
if (sg === eg)
|
||
TEMP_COLOR_ARRAY[1] = sg;
|
||
else
|
||
TEMP_COLOR_ARRAY[1] = easeFunc(dn, sg, eg - sg, d);
|
||
if (sb === eb)
|
||
TEMP_COLOR_ARRAY[2] = sb;
|
||
else
|
||
TEMP_COLOR_ARRAY[2] = easeFunc(dn, sb, eb - sb, d);
|
||
return TEMP_COLOR_ARRAY
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.PropertyTrackState.TextTypeAdapter = class TextTypeAdapter {
|
||
constructor() {}
|
||
static WillChange(index, source, newValue, type) {
|
||
let oldValue;
|
||
switch (type) {
|
||
case "behavior":
|
||
oldValue = source.GetPropertyValueByIndex(index);
|
||
break;
|
||
case "effect":
|
||
oldValue = source[index];
|
||
break;
|
||
case "instance-variable":
|
||
oldValue = source.GetInstanceVariableValue(index);
|
||
break;
|
||
case "plugin":
|
||
oldValue = source.GetPropertyValueByIndex(index);
|
||
break
|
||
}
|
||
if (oldValue === newValue)
|
||
return false;
|
||
return true
|
||
}
|
||
static Interpolate(time, start, end, propertyTrack) {
|
||
if (!end) {
|
||
let propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem();
|
||
const propertyTrackData = propertyTrack.GetPropertyTrackData();
|
||
propertyTrackDataItem = propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem);
|
||
return propertyTrackDataItem.GetValueWithResultMode()
|
||
}
|
||
return start.GetValueWithResultMode()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.TimelineDataManager = class TimelineDataManager {
|
||
constructor() {
|
||
this._timelineDataItems = new Map
|
||
}
|
||
Release() {
|
||
for (const timelineDataItem of this._timelineDataItems.values())
|
||
timelineDataItem.Release();
|
||
this._timelineDataItems.clear();
|
||
this._timelineDataItems = null
|
||
}
|
||
Add(data) {
|
||
const timelineDataItem = new C3.TimelineDataItem(data);
|
||
const name = timelineDataItem.GetName();
|
||
this._timelineDataItems.set(name, timelineDataItem)
|
||
}
|
||
Get(name) {
|
||
return this._timelineDataItems.get(name)
|
||
}
|
||
GetNameId() {
|
||
return 0
|
||
}
|
||
static _CreateDataItems(items, jsonItems, dataItemConstructor, dataContainer) {
|
||
if (!jsonItems)
|
||
return;
|
||
for (const jsonItem of jsonItems)
|
||
C3.TimelineDataManager._CreateDataItem("create", jsonItem, items, dataItemConstructor, dataContainer)
|
||
}
|
||
static _LoadDataItemsFromJson(items, jsonItems, dataItemConstructor, dataContainer) {
|
||
if (items.length)
|
||
jsonItems.forEach((jsonItem,index)=>{
|
||
items[index]._LoadFromJson(jsonItem)
|
||
}
|
||
);
|
||
else
|
||
jsonItems.forEach(jsonItem=>{
|
||
C3.TimelineDataManager._CreateDataItem("load", jsonItem, items, dataItemConstructor, dataContainer)
|
||
}
|
||
)
|
||
}
|
||
static _CreateDataItem(mode, json, items, dataItemConstructor, dataContainer) {
|
||
let dataItem;
|
||
if (typeof dataItemConstructor === "function")
|
||
switch (mode) {
|
||
case "load":
|
||
dataItem = new dataItemConstructor(null,dataContainer);
|
||
break;
|
||
case "create":
|
||
dataItem = new dataItemConstructor(json,dataContainer);
|
||
break
|
||
}
|
||
else if (typeof dataItemConstructor === "object") {
|
||
const prop = dataItemConstructor.prop;
|
||
const value = json[prop];
|
||
const cnstrctr = dataItemConstructor.map.get(value);
|
||
switch (mode) {
|
||
case "load":
|
||
dataItem = new cnstrctr(null,dataContainer);
|
||
break;
|
||
case "create":
|
||
dataItem = new cnstrctr(json,dataContainer);
|
||
break
|
||
}
|
||
}
|
||
switch (mode) {
|
||
case "load":
|
||
dataItem._LoadFromJson(json);
|
||
items.push(dataItem);
|
||
break;
|
||
case "create":
|
||
if (typeof dataItem.GetEnable === "function" && !dataItem.GetEnable())
|
||
return dataItem.Release();
|
||
items.push(dataItem);
|
||
break
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const NAME = 0;
|
||
const TOTAL_TIME = 1;
|
||
const STEP = 2;
|
||
const INTERPOLATION_MODE = 3;
|
||
const RESULT_MODE = 4;
|
||
const TRACKS = 5;
|
||
const LOOP = 6;
|
||
const PING_PONG = 7;
|
||
const REPEAT_COUNT = 8;
|
||
C3.TimelineDataItem = class TimelineDataItem {
|
||
constructor(timelineDataJson) {
|
||
this._name = "";
|
||
this._totalTime = NaN;
|
||
this._step = 0;
|
||
this._interpolationMode = "default";
|
||
this._resultMode = "default";
|
||
this._loop = false;
|
||
this._pingPong = false;
|
||
this._repeatCount = 1;
|
||
this._trackData = null;
|
||
if (!timelineDataJson)
|
||
return;
|
||
this._name = timelineDataJson[NAME];
|
||
this._totalTime = timelineDataJson[TOTAL_TIME];
|
||
this._step = timelineDataJson[STEP];
|
||
this._interpolationMode = timelineDataJson[INTERPOLATION_MODE];
|
||
this._resultMode = timelineDataJson[RESULT_MODE];
|
||
this._loop = !!timelineDataJson[LOOP];
|
||
this._pingPong = !!timelineDataJson[PING_PONG];
|
||
this._repeatCount = timelineDataJson[REPEAT_COUNT];
|
||
this._trackData = new C3.TrackData(timelineDataJson[TRACKS],this)
|
||
}
|
||
Release() {
|
||
this._trackData.Release();
|
||
this._trackData = null
|
||
}
|
||
GetTrackData() {
|
||
if (!this._trackData)
|
||
this._trackData = new C3.TrackData(null,this);
|
||
return this._trackData
|
||
}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
SetName(n) {
|
||
this._name = n
|
||
}
|
||
GetTotalTime() {
|
||
return this._totalTime
|
||
}
|
||
SetTotalTime(tt) {
|
||
this._totalTime = tt
|
||
}
|
||
GetStep() {
|
||
return this._step
|
||
}
|
||
SetStep(s) {
|
||
this._step = s
|
||
}
|
||
GetInterpolationMode() {
|
||
return this._interpolationMode
|
||
}
|
||
SetInterpolationMode(im) {
|
||
this._interpolationMode = im
|
||
}
|
||
GetResultMode() {
|
||
return this._resultMode
|
||
}
|
||
SetResultMode(rm) {
|
||
this._resultMode = rm
|
||
}
|
||
GetLoop() {
|
||
return this._loop
|
||
}
|
||
SetLoop(l) {
|
||
this._loop = l
|
||
}
|
||
GetPingPong() {
|
||
return this._pingPong
|
||
}
|
||
SetPingPong(p) {
|
||
this._pingPong = p
|
||
}
|
||
GetRepeatCount() {
|
||
return this._repeatCount
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"trackDataJson": this._trackData._SaveToJson(),
|
||
"name": this._name,
|
||
"totalTime": this._totalTime,
|
||
"step": this._step,
|
||
"interpolationMode": this._interpolationMode,
|
||
"resultMode": this._resultMode,
|
||
"loop": this._loop,
|
||
"pingPong": this._pingPong,
|
||
"repeatCount": this._repeatCount
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
this.GetTrackData()._LoadFromJson(o["trackDataJson"]);
|
||
this._name = o["name"];
|
||
this._totalTime = o["totalTime"];
|
||
this._step = o["step"];
|
||
this._interpolationMode = o["interpolationMode"];
|
||
this._resultMode = o["resultMode"];
|
||
this._loop = o["loop"];
|
||
this._pingPong = o["pingPong"];
|
||
this._repeatCount = o["repeatCount"]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const WI_DATA = 0;
|
||
const OC_INDEX = 1;
|
||
const WI_UID = 2;
|
||
const INTERPOLATION_MODE = 1;
|
||
const RESULT_MODE = 2;
|
||
const ENABLED = 3;
|
||
const KEYFRAMES = 4;
|
||
const PROPERTY_TRACKS = 5;
|
||
const ID = 6;
|
||
const NESTED_DATA = 7;
|
||
const START_OFFSET = 0;
|
||
const LOCAL_TOTAL_TIME = 1;
|
||
const WI_ADDITIONAL_DATA = 8;
|
||
const ORIGINAL_WIDTH = 0;
|
||
const ORIGINAL_HEIGHT = 1;
|
||
class TrackDataItem {
|
||
constructor(trackDataJson, trackData) {
|
||
this._trackData = trackData;
|
||
this._instanceData = null;
|
||
this._additionalInstanceData = null;
|
||
this._instanceUid = NaN;
|
||
this._objectClassIndex = NaN;
|
||
this._interpolationMode = "default";
|
||
this._resultMode = "default";
|
||
this._enabled = false;
|
||
this._keyframeData = null;
|
||
this._propertyTrackData = null;
|
||
this._id = "";
|
||
this._nestedData = null;
|
||
this._startOffset = 0;
|
||
this._localTotalTime = this._trackData.GetTimelineDataItem().GetTotalTime();
|
||
if (!trackDataJson)
|
||
return;
|
||
this._instanceData = trackDataJson[WI_DATA];
|
||
this._instanceUid = trackDataJson[WI_DATA][WI_UID];
|
||
this._objectClassIndex = trackDataJson[WI_DATA][OC_INDEX];
|
||
this._interpolationMode = trackDataJson[INTERPOLATION_MODE];
|
||
this._resultMode = trackDataJson[RESULT_MODE];
|
||
this._enabled = !!trackDataJson[ENABLED];
|
||
if (trackDataJson[ID])
|
||
this._id = trackDataJson[ID];
|
||
if (trackDataJson[NESTED_DATA]) {
|
||
this._nestedData = trackDataJson[NESTED_DATA];
|
||
this._startOffset = trackDataJson[NESTED_DATA][START_OFFSET];
|
||
this._localTotalTime = trackDataJson[NESTED_DATA][LOCAL_TOTAL_TIME]
|
||
}
|
||
if (trackDataJson[WI_ADDITIONAL_DATA])
|
||
this._additionalInstanceData = trackDataJson[WI_ADDITIONAL_DATA];
|
||
this._keyframeData = new C3.KeyframeData(trackDataJson[KEYFRAMES],this);
|
||
this._propertyTrackData = new C3.PropertyTrackData(trackDataJson[PROPERTY_TRACKS],this)
|
||
}
|
||
Release() {
|
||
this._instanceData = null;
|
||
this._trackData = null;
|
||
if (this._keyframeData) {
|
||
this._keyframeData.Release();
|
||
this._keyframeData = null
|
||
}
|
||
if (this._propertyTrackData) {
|
||
this._propertyTrackData.Release();
|
||
this._propertyTrackData = null
|
||
}
|
||
this._nestedData = null
|
||
}
|
||
GetTrackData() {
|
||
return this._trackData
|
||
}
|
||
GetKeyframeData() {
|
||
if (!this._keyframeData)
|
||
this._keyframeData = new C3.KeyframeData(null,this);
|
||
return this._keyframeData
|
||
}
|
||
GetPropertyTrackData() {
|
||
if (!this._propertyTrackData)
|
||
this._propertyTrackData = new C3.PropertyTrackData(null,this);
|
||
return this._propertyTrackData
|
||
}
|
||
GetInstanceData() {
|
||
return this._instanceData
|
||
}
|
||
GetObjectClassIndex() {
|
||
return this._objectClassIndex
|
||
}
|
||
SetObjectClassIndex(index) {
|
||
this._objectClassIndex = index
|
||
}
|
||
GetInstanceUID() {
|
||
return this._instanceUid
|
||
}
|
||
SetInstanceUID(uid) {
|
||
this._instanceUid = uid
|
||
}
|
||
GetInterpolationMode() {
|
||
return this._interpolationMode
|
||
}
|
||
SetInterpolationMode(im) {
|
||
this._interpolationMode = im
|
||
}
|
||
GetResultMode() {
|
||
return this._resultMode
|
||
}
|
||
SetResultMode(rm) {
|
||
this._resultMode = rm
|
||
}
|
||
GetEnable() {
|
||
return this._enabled
|
||
}
|
||
SetEnable(e) {
|
||
this._enabled = !!e
|
||
}
|
||
GetId() {
|
||
return this._id
|
||
}
|
||
GetStartOffset() {
|
||
return this._startOffset
|
||
}
|
||
GetLocalTotalTime() {
|
||
return this._localTotalTime
|
||
}
|
||
GetOriginalWidth() {
|
||
return this._additionalInstanceData[ORIGINAL_WIDTH]
|
||
}
|
||
SetOriginalWidth(w) {
|
||
if (!this._additionalInstanceData)
|
||
this._additionalInstanceData = [];
|
||
this._additionalInstanceData[ORIGINAL_WIDTH] = w
|
||
}
|
||
GetOriginalHeight() {
|
||
if (!this._additionalInstanceData)
|
||
this._additionalInstanceData = [];
|
||
return this._additionalInstanceData[ORIGINAL_HEIGHT]
|
||
}
|
||
SetOriginalHeight(h) {
|
||
if (!this._additionalInstanceData)
|
||
this._additionalInstanceData = [];
|
||
this._additionalInstanceData[ORIGINAL_HEIGHT] = h
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"keyframeDataJson": this._keyframeData._SaveToJson(),
|
||
"propertyTrackDataJson": this._propertyTrackData._SaveToJson(),
|
||
"instanceData": this._instanceData,
|
||
"additionalInstanceData": this._additionalInstanceData,
|
||
"instanceUid": this._instanceUid,
|
||
"objectClassIndex": this._objectClassIndex,
|
||
"interpolationMode": this._interpolationMode,
|
||
"resultMode": this._resultMode,
|
||
"enabled": this._enabled,
|
||
"id": this._id,
|
||
"nestedData": this._nestedData
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
this._instanceData = o["instanceData"];
|
||
this._instanceUid = o["instanceUid"];
|
||
this._objectClassIndex = o["objectClassIndex"];
|
||
this._interpolationMode = o["interpolationMode"];
|
||
this._resultMode = o["resultMode"];
|
||
this._enabled = o["enabled"];
|
||
this._id = o["id"];
|
||
this._localTotalTime = this._trackData.GetTimelineDataItem().GetTotalTime();
|
||
if (o["nestedData"]) {
|
||
this._nestedData = o["nestedData"];
|
||
this._startOffset = this._nestedData[START_OFFSET];
|
||
this._localTotalTime = this._nestedData[LOCAL_TOTAL_TIME]
|
||
}
|
||
if (o["additionalInstanceData"])
|
||
this._additionalInstanceData = o["additionalInstanceData"];
|
||
this.GetKeyframeData()._LoadFromJson(o["keyframeDataJson"]);
|
||
this.GetPropertyTrackData()._LoadFromJson(o["propertyTrackDataJson"])
|
||
}
|
||
}
|
||
C3.TrackData = class TrackData {
|
||
constructor(tracksDataJson, timelineDataItem) {
|
||
this._timelineDataItem = timelineDataItem;
|
||
this._trackDataItems = [];
|
||
this._keyframeTimeMap = new Map;
|
||
C3.TimelineDataManager._CreateDataItems(this._trackDataItems, tracksDataJson, TrackDataItem, this)
|
||
}
|
||
Release() {
|
||
this._timelineDataItem = null;
|
||
for (const trackDataItem of this._trackDataItems)
|
||
trackDataItem.Release();
|
||
C3.clearArray(this._trackDataItems);
|
||
this._trackDataItems = null;
|
||
this._keyframeTimeMap.clear();
|
||
this._keyframeTimeMap = null
|
||
}
|
||
GetTimelineDataItem() {
|
||
return this._timelineDataItem
|
||
}
|
||
AddEmptyTrackDataItem() {
|
||
const trackDataItem = new TrackDataItem(null,this);
|
||
this._trackDataItems.push(trackDataItem);
|
||
return trackDataItem
|
||
}
|
||
GetFirstKeyframeDataItem(trackDataItem) {
|
||
return trackDataItem.GetKeyframeData().GetKeyframeDataItemArray()[0]
|
||
}
|
||
GetLastKeyframeDataItem(trackDataItem) {
|
||
const keyframeDataItems = trackDataItem.GetKeyframeData().GetKeyframeDataItemArray();
|
||
return keyframeDataItems[keyframeDataItems.length - 1]
|
||
}
|
||
GetKeyFrameDataItemAtTime(time, trackDataItem) {
|
||
const keyframeDataItemEntry = this._keyframeTimeMap.get(trackDataItem);
|
||
if (!!keyframeDataItemEntry && keyframeDataItemEntry.has(time))
|
||
return keyframeDataItemEntry.get(time);
|
||
for (const keyframeDataItem of trackDataItem.GetKeyframeData().keyframeDataItems())
|
||
if (keyframeDataItem.GetTime() === time) {
|
||
if (!keyframeDataItemEntry)
|
||
this._keyframeTimeMap.set(trackDataItem, new Map);
|
||
this._keyframeTimeMap.get(trackDataItem).set(time, keyframeDataItem);
|
||
return keyframeDataItem
|
||
}
|
||
}
|
||
GetFirstKeyFrameDataItemHigherThan(time, trackDataItem) {
|
||
for (const keyframeDataItem of trackDataItem.GetKeyframeData().keyframeDataItems())
|
||
if (keyframeDataItem.GetTime() > time)
|
||
return keyframeDataItem
|
||
}
|
||
GetFirstKeyFrameDataItemHigherOrEqualThan(time, trackDataItem) {
|
||
for (const keyframeDataItem of trackDataItem.GetKeyframeData().keyframeDataItems())
|
||
if (keyframeDataItem.GetTime() >= time)
|
||
return keyframeDataItem
|
||
}
|
||
GetFirstKeyFrameDataItemLowerOrEqualThan(time, trackDataItem) {
|
||
for (const keyframeDataItem of trackDataItem.GetKeyframeData().keyframeDataItemsReverse())
|
||
if (keyframeDataItem.GetTime() <= time)
|
||
return keyframeDataItem
|
||
}
|
||
*trackDataItems() {
|
||
for (const trackDataItem of this._trackDataItems)
|
||
yield trackDataItem
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"trackDataItemsJson": this._trackDataItems.map(trackDataItem=>trackDataItem._SaveToJson())
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
C3.TimelineDataManager._LoadDataItemsFromJson(this._trackDataItems, o["trackDataItemsJson"], TrackDataItem, this)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const SOURCE_DATA = 0;
|
||
const SOURCE = 0;
|
||
const PROPERTY = 1;
|
||
const TYPE = 2;
|
||
const MIN = 3;
|
||
const MAX = 4;
|
||
const INTERPOLATION_MODE = 5;
|
||
const RESULT_MODE = 6;
|
||
const ENABLED = 7;
|
||
const PROPERTY_KEYFRAMES = 8;
|
||
class PropertyTrackDataItem {
|
||
constructor(propertyTrackDataJson, propertyTrackData) {
|
||
this._propertyTrackData = propertyTrackData;
|
||
this._sourceAdapterId = "";
|
||
this._sourceAdapterArguments = null;
|
||
this._property = null;
|
||
this._type = null;
|
||
this._min = NaN;
|
||
this._max = NaN;
|
||
this._interpolationMode = "default";
|
||
this._resultMode = "default";
|
||
this._enabled = false;
|
||
this._propertyKeyframeData = null;
|
||
if (!propertyTrackDataJson)
|
||
return;
|
||
this._sourceAdapterId = propertyTrackDataJson[SOURCE_DATA][SOURCE];
|
||
this._sourceAdapterArguments = propertyTrackDataJson[SOURCE_DATA].slice(1);
|
||
this._property = propertyTrackDataJson[PROPERTY];
|
||
this._type = propertyTrackDataJson[TYPE];
|
||
this._min = propertyTrackDataJson[MIN];
|
||
this._max = propertyTrackDataJson[MAX];
|
||
this._interpolationMode = propertyTrackDataJson[INTERPOLATION_MODE];
|
||
this._resultMode = propertyTrackDataJson[RESULT_MODE];
|
||
this._enabled = !!propertyTrackDataJson[ENABLED];
|
||
this._propertyKeyframeData = new C3.PropertyKeyframeData(propertyTrackDataJson[PROPERTY_KEYFRAMES],this)
|
||
}
|
||
Release() {
|
||
this._propertyKeyframeData.Release();
|
||
this._propertyKeyframeData = null;
|
||
this._propertyTrackData = null;
|
||
this._sourceAdapterArguments = null
|
||
}
|
||
GetPropertyTrackData() {
|
||
return this._propertyTrackData
|
||
}
|
||
GetPropertyKeyframeData() {
|
||
if (!this._propertyKeyframeData)
|
||
this._propertyKeyframeData = new C3.PropertyKeyframeData(null,this);
|
||
return this._propertyKeyframeData
|
||
}
|
||
GetSourceAdapterId() {
|
||
return this._sourceAdapterId
|
||
}
|
||
SetSourceAdapterId(said) {
|
||
this._sourceAdapterId = said
|
||
}
|
||
GetSourceAdapterArguments() {
|
||
return this._sourceAdapterArguments
|
||
}
|
||
SetSourceAdapterArguments(sargs) {
|
||
this._sourceAdapterArguments = sargs
|
||
}
|
||
GetProperty() {
|
||
return this._property
|
||
}
|
||
SetProperty(p) {
|
||
this._property = p
|
||
}
|
||
GetType() {
|
||
return this._type
|
||
}
|
||
SetType(t) {
|
||
this._type = t
|
||
}
|
||
GetMin() {
|
||
return this._min
|
||
}
|
||
SetMin(min) {
|
||
this._min = min
|
||
}
|
||
GetMax() {
|
||
return this._max
|
||
}
|
||
SetMax(max) {
|
||
this._max = max
|
||
}
|
||
GetInterpolationMode() {
|
||
return this._interpolationMode
|
||
}
|
||
SetInterpolationMode(im) {
|
||
this._interpolationMode = im
|
||
}
|
||
GetResultMode() {
|
||
return this._resultMode
|
||
}
|
||
SetResultMode(rm) {
|
||
this._resultMode = rm
|
||
}
|
||
GetEnable() {
|
||
return this._enabled
|
||
}
|
||
SetEnable(e) {
|
||
this._enabled = !!e
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"propertyKeyframeDataJson": this._propertyKeyframeData._SaveToJson(),
|
||
"sourceAdapterId": this._sourceAdapterId,
|
||
"sourceAdapterArguments": this._sourceAdapterArguments,
|
||
"property": this._property,
|
||
"type": this._type,
|
||
"min": this._min,
|
||
"max": this._max,
|
||
"interpolationMode": this._interpolationMode,
|
||
"resultMode": this._resultMode,
|
||
"enabled": this._enabled
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
this._sourceAdapterId = o["sourceAdapterId"];
|
||
this._sourceAdapterArguments = o["sourceAdapterArguments"];
|
||
this._property = o["property"];
|
||
this._type = o["type"];
|
||
this._min = o["min"];
|
||
this._max = o["max"];
|
||
this._interpolationMode = o["interpolationMode"];
|
||
this._resultMode = o["resultMode"];
|
||
this._enabled = o["enabled"];
|
||
this.GetPropertyKeyframeData()._LoadFromJson(o["propertyKeyframeDataJson"])
|
||
}
|
||
}
|
||
C3.PropertyTrackData = class PropertyTrackData {
|
||
constructor(propertyTracksDataJson, trackDataItem) {
|
||
this._trackDataItem = trackDataItem;
|
||
this._propertyTrackDataItems = [];
|
||
this._propertyKeyframeTimeMap = new Map;
|
||
C3.TimelineDataManager._CreateDataItems(this._propertyTrackDataItems, propertyTracksDataJson, PropertyTrackDataItem, this)
|
||
}
|
||
Release() {
|
||
this._trackDataItem = null;
|
||
for (const propertyTrackDataItem of this._propertyTrackDataItems)
|
||
propertyTrackDataItem.Release();
|
||
C3.clearArray(this._propertyTrackDataItems);
|
||
this._propertyTrackDataItems = null;
|
||
this._propertyKeyframeTimeMap.clear();
|
||
this._propertyKeyframeTimeMap = null
|
||
}
|
||
GetTrackDataItem() {
|
||
return this._trackDataItem
|
||
}
|
||
AddEmptyPropertyTrackDataItem() {
|
||
const propertyTrackDataItem = new PropertyTrackDataItem(null,this);
|
||
this._propertyTrackDataItems.push(propertyTrackDataItem);
|
||
return propertyTrackDataItem
|
||
}
|
||
GetFirstPropertyKeyframeDataItem(propertyTrackDataItem) {
|
||
const propertyKeyframeData = propertyTrackDataItem.GetPropertyKeyframeData();
|
||
return propertyKeyframeData.GetPropertyKeyframeDataItemArray()[0]
|
||
}
|
||
GetLastPropertyKeyframeDataItem(propertyTrackDataItem) {
|
||
const propertyKeyframeData = propertyTrackDataItem.GetPropertyKeyframeData();
|
||
const propertyKeyframeDataItems = propertyKeyframeData.GetPropertyKeyframeDataItemArray();
|
||
return propertyKeyframeDataItems[propertyKeyframeDataItems.length - 1]
|
||
}
|
||
GetPropertyKeyFrameDataItemAtTime(time, propertyTrackDataItem) {
|
||
const propertyKeyframeDataItemEntry = this._propertyKeyframeTimeMap.get(propertyTrackDataItem);
|
||
if (!!propertyKeyframeDataItemEntry && propertyKeyframeDataItemEntry.has(time))
|
||
return propertyKeyframeDataItemEntry.get(time);
|
||
const propertyKeyframeData = propertyTrackDataItem.GetPropertyKeyframeData();
|
||
for (const propertyKeyframeDataItem of propertyKeyframeData.propertyKeyframeDataItems())
|
||
if (propertyKeyframeDataItem.GetTime() === time) {
|
||
if (!propertyKeyframeDataItemEntry)
|
||
this._propertyKeyframeTimeMap.set(propertyTrackDataItem, new Map);
|
||
this._propertyKeyframeTimeMap.get(propertyTrackDataItem).set(time, propertyKeyframeDataItem);
|
||
return propertyKeyframeDataItem
|
||
}
|
||
}
|
||
GetFirstPropertyKeyFrameDataItemHigherThan(time, propertyTrackDataItem) {
|
||
const propertyKeyframeData = propertyTrackDataItem.GetPropertyKeyframeData();
|
||
for (const propertyKeyframeDataItem of propertyKeyframeData.propertyKeyframeDataItems())
|
||
if (propertyKeyframeDataItem.GetTime() > time)
|
||
return propertyKeyframeDataItem
|
||
}
|
||
GetFirstPropertyKeyFrameDataItemHigherOrEqualThan(time, propertyTrackDataItem) {
|
||
const propertyKeyframeData = propertyTrackDataItem.GetPropertyKeyframeData();
|
||
for (const propertyKeyframeDataItem of propertyKeyframeData.propertyKeyframeDataItems())
|
||
if (propertyKeyframeDataItem.GetTime() >= time)
|
||
return propertyKeyframeDataItem
|
||
}
|
||
GetFirstPropertyKeyFrameDataItemLowerOrEqualThan(time, propertyTrackDataItem) {
|
||
const propertyKeyframeData = propertyTrackDataItem.GetPropertyKeyframeData();
|
||
for (const propertyKeyframeDataItem of propertyKeyframeData.propertyKeyframeDataItemsReverse())
|
||
if (propertyKeyframeDataItem.GetTime() <= time)
|
||
return propertyKeyframeDataItem
|
||
}
|
||
*propertyTrackDataItems() {
|
||
for (const propertyTrackDataItem of this._propertyTrackDataItems)
|
||
yield propertyTrackDataItem
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"propertyTrackDataItemsJson": this._propertyTrackDataItems.map(propertyTrackDataItem=>propertyTrackDataItem._SaveToJson())
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
C3.TimelineDataManager._LoadDataItemsFromJson(this._propertyTrackDataItems, o["propertyTrackDataItemsJson"], PropertyTrackDataItem, this)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const TIME = 0;
|
||
const EASE = 1;
|
||
const ENABLE = 2;
|
||
const TAGS = 3;
|
||
class KeyframeDataItem {
|
||
constructor(keyframeDataJson, keyframeData) {
|
||
this._keyframeData = keyframeData;
|
||
this._time = -1;
|
||
this._ease = "noease";
|
||
this._enable = false;
|
||
this._tags = null;
|
||
this._lowerTags = null;
|
||
if (!keyframeDataJson)
|
||
return;
|
||
this._time = keyframeDataJson[TIME];
|
||
this._ease = keyframeDataJson[EASE];
|
||
this._enable = !!keyframeDataJson[ENABLE];
|
||
const tagStr = keyframeDataJson[TAGS];
|
||
this._tags = tagStr ? tagStr.split(" ") : [];
|
||
this._lowerTags = new Set(this._tags.map(t=>t.toLowerCase()))
|
||
}
|
||
Release() {
|
||
this._keyframeData = null;
|
||
C3.clearArray(this._tags);
|
||
this._tags = null;
|
||
this._lowerTags.clear();
|
||
this._lowerTags = null
|
||
}
|
||
GetKeyframeData() {
|
||
return this._keyframeData
|
||
}
|
||
GetTime() {
|
||
return this._time
|
||
}
|
||
SetTime(t) {
|
||
this._time = t
|
||
}
|
||
GetEase() {
|
||
return this._ease
|
||
}
|
||
SetEase(e) {
|
||
this._ease = e
|
||
}
|
||
GetEnable() {
|
||
return this._enable
|
||
}
|
||
SetEnable(e) {
|
||
this._enable = !!e
|
||
}
|
||
GetTags() {
|
||
return this._tags
|
||
}
|
||
SetTags(t) {
|
||
this._tags = t ? t.split(" ") : [];
|
||
this._lowerTags = new Set(this._tags.map(t=>t.toLowerCase()))
|
||
}
|
||
GetLowerTags() {
|
||
return this._lowerTags
|
||
}
|
||
HasTag(tag) {
|
||
return this._lowerTags.has(tag.toLowerCase())
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"time": this._time,
|
||
"ease": this._ease,
|
||
"enable": this._enable,
|
||
"tags": this._tags
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
this._time = o["time"];
|
||
this._ease = o["ease"];
|
||
this._enable = o["enable"];
|
||
this._tags = o["tags"];
|
||
this._lowerTags = new Set(this._tags.map(t=>t.toLowerCase()))
|
||
}
|
||
}
|
||
C3.KeyframeData = class KeyframeData {
|
||
constructor(keyframesDataJson, trackDataItem) {
|
||
this._trackDataItem = trackDataItem;
|
||
this._keyframeDataItems = [];
|
||
C3.TimelineDataManager._CreateDataItems(this._keyframeDataItems, keyframesDataJson, KeyframeDataItem, this)
|
||
}
|
||
Release() {
|
||
this._trackDataItem = null;
|
||
for (const keyframeDataItem of this._keyframeDataItems)
|
||
keyframeDataItem.Release();
|
||
C3.clearArray(this._keyframeDataItems);
|
||
this._keyframeDataItems = null
|
||
}
|
||
GetTrackDataItem() {
|
||
return this._trackDataItem
|
||
}
|
||
GetKeyframeDataItemCount() {
|
||
return this._keyframeDataItems.length
|
||
}
|
||
GetKeyframeDataItemArray() {
|
||
return this._keyframeDataItems
|
||
}
|
||
AddEmptyKeyframeDataItem() {
|
||
const keyframeDataItem = new KeyframeDataItem(null,this);
|
||
this._keyframeDataItems.push(keyframeDataItem);
|
||
return keyframeDataItem
|
||
}
|
||
DeleteKeyframeDataItems(match) {
|
||
for (const keyframeDataItem of this._keyframeDataItems) {
|
||
if (!match(keyframeDataItem))
|
||
continue;
|
||
const index = this._keyframeDataItems.indexOf(keyframeDataItem);
|
||
if (index === -1)
|
||
continue;
|
||
keyframeDataItem.Release();
|
||
this._keyframeDataItems.splice(index, 1)
|
||
}
|
||
this.SortKeyframeDataItems()
|
||
}
|
||
SortKeyframeDataItems() {
|
||
this._keyframeDataItems.sort((a,b)=>a.GetTime() - b.GetTime())
|
||
}
|
||
GetKeyframeDataItemIndex(keyframeDataItem) {
|
||
return this._keyframeDataItems.indexOf(keyframeDataItem)
|
||
}
|
||
GetKeyframeDataItemFromIndex(index) {
|
||
return this._keyframeDataItems[index]
|
||
}
|
||
*keyframeDataItems() {
|
||
for (const keyframeDataItem of this._keyframeDataItems)
|
||
yield keyframeDataItem
|
||
}
|
||
*keyframeDataItemsReverse() {
|
||
for (let i = this._keyframeDataItems.length - 1; i >= 0; i--)
|
||
yield this._keyframeDataItems[i]
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"keyframeDataItemsJson": this._keyframeDataItems.map(keyframeDataItem=>keyframeDataItem._SaveToJson())
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
C3.TimelineDataManager._LoadDataItemsFromJson(this._keyframeDataItems, o["keyframeDataItemsJson"], KeyframeDataItem, this)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const VALUE_DATA = 0;
|
||
const VALUE_DATA_VALUE = 0;
|
||
const VALUE_DATA_ABSOLUTE_VALUE = 1;
|
||
const VALUE_DATA_TYPE = 2;
|
||
const TIME = 1;
|
||
const EASE = 2;
|
||
const ENABLE = 3;
|
||
const ADDONS = 4;
|
||
class PropertyKeyframeDataItem {
|
||
constructor(propertyKeyframeDataJson, propertyKeyframeData) {
|
||
this._propertyKeyframeData = propertyKeyframeData;
|
||
this._value = null;
|
||
this._aValue = null;
|
||
this._type = "";
|
||
this._time = NaN;
|
||
this._ease = "noease";
|
||
this._enable = false;
|
||
this._addonData = null;
|
||
if (!propertyKeyframeDataJson)
|
||
return;
|
||
this._value = propertyKeyframeDataJson[VALUE_DATA][VALUE_DATA_VALUE];
|
||
this._aValue = propertyKeyframeDataJson[VALUE_DATA][VALUE_DATA_ABSOLUTE_VALUE];
|
||
this._type = propertyKeyframeDataJson[VALUE_DATA][VALUE_DATA_TYPE];
|
||
this._time = propertyKeyframeDataJson[TIME];
|
||
this._ease = propertyKeyframeDataJson[EASE];
|
||
this._enable = !!propertyKeyframeDataJson[ENABLE];
|
||
this._addonData = null;
|
||
if (!!propertyKeyframeDataJson[ADDONS])
|
||
this._addonData = new C3.AddonData(propertyKeyframeDataJson[ADDONS],this)
|
||
}
|
||
Release() {
|
||
this._propertyKeyframeData = null;
|
||
if (this._addonData) {
|
||
this._addonData.Release();
|
||
this._addonData = null
|
||
}
|
||
}
|
||
GetAddonData() {
|
||
return this._addonData
|
||
}
|
||
GetValue() {
|
||
return this._value
|
||
}
|
||
SetValue(value) {
|
||
if (this._type === "color" && C3.IsFiniteNumber(value)) {
|
||
this._value[0] = C3.GetRValue(value);
|
||
this._value[1] = C3.GetGValue(value);
|
||
this._value[2] = C3.GetBValue(value)
|
||
} else
|
||
this._value = value
|
||
}
|
||
GetAbsoluteValue() {
|
||
return this._aValue
|
||
}
|
||
SetAbsoluteValue(aValue) {
|
||
if (this._type === "color" && C3.IsFiniteNumber(aValue)) {
|
||
this._aValue[0] = C3.GetRValue(aValue);
|
||
this._aValue[1] = C3.GetGValue(aValue);
|
||
this._aValue[2] = C3.GetBValue(aValue)
|
||
} else
|
||
this._aValue = aValue
|
||
}
|
||
GetValueWithResultMode() {
|
||
const rm = this._propertyKeyframeData.GetPropertyTrackDataItem().GetResultMode();
|
||
if (rm === "relative")
|
||
return this.GetValue();
|
||
else if (rm === "absolute")
|
||
return this.GetAbsoluteValue()
|
||
}
|
||
GetType() {
|
||
return this._type
|
||
}
|
||
SetType(t) {
|
||
this._type = t
|
||
}
|
||
GetTime() {
|
||
return this._time
|
||
}
|
||
SetTime(t) {
|
||
this._time = t
|
||
}
|
||
GetEase() {
|
||
return this._ease
|
||
}
|
||
SetEase(e) {
|
||
this._ease = e
|
||
}
|
||
GetEnable() {
|
||
return this._enable
|
||
}
|
||
SetEnable(e) {
|
||
this._enable = !!e
|
||
}
|
||
GetAddOn(id) {
|
||
if (!this.GetAddonData())
|
||
return;
|
||
for (const addonDataItem of this.GetAddonData().addonDataItems())
|
||
if (addonDataItem.GetId() === id)
|
||
return addonDataItem
|
||
}
|
||
_SaveToJson() {
|
||
const aData = this._addonData;
|
||
return {
|
||
"addonDataJson": aData ? aData._SaveToJson() : aData,
|
||
"value": this._value,
|
||
"aValue": this._aValue,
|
||
"type": this._type,
|
||
"time": this._time,
|
||
"ease": this._ease,
|
||
"enable": this._enable
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
if (o["addonDataJson"])
|
||
this._addonData._SetFromJson(o["addonDataJson"]);
|
||
this._value = o["value"];
|
||
this._aValue = o["aValue"];
|
||
this._type = o["type"];
|
||
this._time = o["time"];
|
||
this._ease = o["ease"];
|
||
this._enable = o["enable"]
|
||
}
|
||
}
|
||
C3.PropertyKeyframeData = class PropertyKeyframeData {
|
||
constructor(propertyKeyframesDataJson, propertyTrackDataItem) {
|
||
this._propertyTrackDataItem = propertyTrackDataItem;
|
||
this._propertyKeyframeDataItems = [];
|
||
C3.TimelineDataManager._CreateDataItems(this._propertyKeyframeDataItems, propertyKeyframesDataJson, PropertyKeyframeDataItem, this)
|
||
}
|
||
Release() {
|
||
this._propertyTrackDataItem = null;
|
||
for (const propertyKeyframeDataItem of this._propertyKeyframeDataItems)
|
||
propertyKeyframeDataItem.Release();
|
||
C3.clearArray(this._propertyKeyframeDataItems);
|
||
this._propertyKeyframeDataItems = null
|
||
}
|
||
AddEmptyPropertyKeyframeDataItem() {
|
||
const propertyKeyframeDataItem = new PropertyKeyframeDataItem(null,this);
|
||
this._propertyKeyframeDataItems.push(propertyKeyframeDataItem);
|
||
return propertyKeyframeDataItem
|
||
}
|
||
DeletePropertyKeyframeDataItems(match) {
|
||
for (const propertyKeyframeDataItem of this._propertyKeyframeDataItems) {
|
||
if (!match(propertyKeyframeDataItem))
|
||
continue;
|
||
const index = this._propertyKeyframeDataItems.indexOf(propertyKeyframeDataItem);
|
||
if (index === -1)
|
||
continue;
|
||
propertyKeyframeDataItem.Release();
|
||
this._propertyKeyframeDataItems.splice(index, 1)
|
||
}
|
||
this.SortPropertyKeyFrameDataItems()
|
||
}
|
||
SortPropertyKeyFrameDataItems() {
|
||
this._propertyKeyframeDataItems.sort((a,b)=>a.GetTime() - b.GetTime())
|
||
}
|
||
GetPropertyTrackDataItem() {
|
||
return this._propertyTrackDataItem
|
||
}
|
||
GetPropertyKeyframeDataItemCount() {
|
||
return this._propertyKeyframeDataItems.length
|
||
}
|
||
GetPropertyKeyframeDataItemArray() {
|
||
return this._propertyKeyframeDataItems
|
||
}
|
||
*propertyKeyframeDataItems() {
|
||
for (const propertyKeyframeDataItem of this._propertyKeyframeDataItems)
|
||
yield propertyKeyframeDataItem
|
||
}
|
||
*propertyKeyframeDataItemsReverse() {
|
||
for (let i = this._propertyKeyframeDataItems.length - 1; i >= 0; i--)
|
||
yield this._propertyKeyframeDataItems[i]
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"propertyKeyframeDataItemsJson": this._propertyKeyframeDataItems.map(propertyTrackDataItem=>propertyTrackDataItem._SaveToJson())
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
C3.TimelineDataManager._LoadDataItemsFromJson(this._propertyKeyframeDataItems, o["propertyKeyframeDataItemsJson"], PropertyKeyframeDataItem, this)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const ADDON_ID = 0;
|
||
const ADDON_DATA = 1;
|
||
class AddonDataItem {
|
||
constructor(addonDataJson, addonData) {
|
||
this._addonData = addonData;
|
||
this._id = addonDataJson[ADDON_ID];
|
||
this._data = addonDataJson[ADDON_DATA]
|
||
}
|
||
Release() {
|
||
this._addonData = null;
|
||
this._data = null
|
||
}
|
||
GetAddonData() {
|
||
return this._addonData
|
||
}
|
||
GetId() {
|
||
return this._id
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"id": this._id,
|
||
"data": this._data
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
this._id = o["id"];
|
||
this._data = o["data"]
|
||
}
|
||
}
|
||
const START_ANCHOR = 0;
|
||
const START_ENABLE = 1;
|
||
const END_ANCHOR = 2;
|
||
const END_ENABLE = 3;
|
||
class AddonDataCubicBezierItem extends AddonDataItem {
|
||
constructor(addonDataJson, addonData) {
|
||
super(addonDataJson, addonData);
|
||
this._startAnchor = this._data[START_ANCHOR];
|
||
this._startEnable = !!this._data[START_ENABLE];
|
||
this._endAnchor = this._data[END_ANCHOR];
|
||
this._endEnable = !!this._data[END_ENABLE]
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
GetStartAnchor() {
|
||
return this._startAnchor
|
||
}
|
||
GetStartEnable() {
|
||
return this._startEnable
|
||
}
|
||
GetEndAnchor() {
|
||
return this._endAnchor
|
||
}
|
||
GetEndEnable() {
|
||
return this._endEnable
|
||
}
|
||
_SaveToJson() {
|
||
return Object.assign(super._SaveToJson(), {
|
||
"startAnchor": this._startAnchor,
|
||
"startEnable": !!this._startEnable,
|
||
"endAnchor": this._endAnchor,
|
||
"endEnable": !!this._endEnable
|
||
})
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
super._LoadFromJson(o);
|
||
this._startAnchor = o["startAnchor"];
|
||
this._startEnable = !!o["startEnable"];
|
||
this._endAnchor = o["endAnchor"];
|
||
this._endEnable = !!o["endEnable"]
|
||
}
|
||
}
|
||
const DIRECTION = 0;
|
||
const REVOLUTIONS = 1;
|
||
class AddonDataAngleItem extends AddonDataItem {
|
||
constructor(addonDataJson, addonData) {
|
||
super(addonDataJson, addonData);
|
||
this._direction = this._data[DIRECTION];
|
||
this._revolutions = this._data[REVOLUTIONS]
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
GetDirection() {
|
||
return this._direction
|
||
}
|
||
GetRevolutions() {
|
||
return this._revolutions
|
||
}
|
||
_SaveToJson() {
|
||
return Object.assign(super._SaveToJson(), {
|
||
"direction": this._direction,
|
||
"revolutions": this._revolutions
|
||
})
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
super._LoadFromJson(o);
|
||
this._direction = o["direction"];
|
||
this._revolutions = o["revolutions"]
|
||
}
|
||
}
|
||
C3.AddonData = class AddonData {
|
||
constructor(addonsDataJson, propertyKeyframeDataItem) {
|
||
this._propertyKeyframeDataItem = propertyKeyframeDataItem;
|
||
this._addonDataItems = [];
|
||
C3.TimelineDataManager._CreateDataItems(this._addonDataItems, addonsDataJson, {
|
||
prop: 0,
|
||
map: new Map([["cubic-bezier", AddonDataCubicBezierItem], ["angle", AddonDataAngleItem]])
|
||
}, this)
|
||
}
|
||
Release() {
|
||
this._propertyKeyframeDataItem = null;
|
||
for (const addonDataItem of this._addonDataItems)
|
||
addonDataItem.Release();
|
||
C3.clearArray(this._addonDataItems);
|
||
this._addonDataItems = null
|
||
}
|
||
GetPropertyKeyframeDataItem() {
|
||
return this._propertyKeyframeDataItem
|
||
}
|
||
*addonDataItems() {
|
||
for (const addonDataItem of this._addonDataItems)
|
||
yield addonDataItem
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"addonDataItemsJson": this._addonDataItems.map(addonDataItem=>addonDataItem._SaveToJson())
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
C3.TimelineDataManager._LoadDataItemsFromJson(this._addonDataItems, o["addonDataItemsJson"], {
|
||
prop: "id",
|
||
map: new Map([["cubic-bezier", AddonDataCubicBezierItem], ["angle", AddonDataAngleItem]])
|
||
}, this)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const INITIAL_VALUE_MODE_START_VALUE = "start-value";
|
||
const INITIAL_VALUE_MODE_CURRENT_STATE = "current-state";
|
||
let createdTweens = 0;
|
||
C3.Tween = class Tween extends C3.TimelineState {
|
||
constructor(tweenDataItem, timelineManager) {
|
||
super(`tween-${createdTweens++}`, tweenDataItem, timelineManager);
|
||
this._id = "";
|
||
this._destroyInstanceOnComplete = false;
|
||
this._initialValueMode = INITIAL_VALUE_MODE_START_VALUE;
|
||
this._on_completed_callbacks = null;
|
||
this._on_started_callbacks = null
|
||
}
|
||
GetInstance() {
|
||
const tracks = this.GetTracks();
|
||
if (!tracks || !tracks.length)
|
||
return;
|
||
const track = tracks[0];
|
||
if (!track)
|
||
return;
|
||
const instance = track.GetInstance();
|
||
return track.IsInstanceValid() ? instance : null
|
||
}
|
||
AddStartedCallback(c) {
|
||
if (!this._on_started_callbacks)
|
||
this._on_started_callbacks = [];
|
||
this._on_started_callbacks.push(c)
|
||
}
|
||
AddCompletedCallback(c) {
|
||
if (!this._on_completed_callbacks)
|
||
this._on_completed_callbacks = [];
|
||
this._on_completed_callbacks.push(c)
|
||
}
|
||
RemoveStartedCallback(c) {
|
||
if (!this._on_started_callbacks)
|
||
return;
|
||
const index = this._on_started_callbacks.indexOf(c);
|
||
if (index !== -1)
|
||
this._on_started_callbacks.splice(index, 1)
|
||
}
|
||
RemoveCompletedCallback(c) {
|
||
if (!this._on_completed_callbacks)
|
||
return;
|
||
const index = this._on_completed_callbacks.indexOf(c);
|
||
if (index !== -1)
|
||
this._on_completed_callbacks.splice(index, 1)
|
||
}
|
||
SetStartValue(startValue, propertyName) {
|
||
for (const track of this._tracks)
|
||
for (const propertyTrack of track._propertyTracks) {
|
||
if (propertyTrack.GetPropertyName() !== propertyName)
|
||
continue;
|
||
const propertyTrackData = propertyTrack.GetPropertyTrackData();
|
||
const propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem();
|
||
const propertyKeyframeDataItem = propertyTrackData.GetFirstPropertyKeyframeDataItem(propertyTrackDataItem);
|
||
propertyKeyframeDataItem.SetValue(startValue);
|
||
propertyKeyframeDataItem.SetAbsoluteValue(startValue)
|
||
}
|
||
}
|
||
_GetPropertyTrackState(propertyName) {
|
||
for (const track of this._tracks)
|
||
for (const propertyTrack of track._propertyTracks)
|
||
if (propertyTrack.GetPropertyName() === propertyName)
|
||
return propertyTrack
|
||
}
|
||
BeforeSetEndValues(properties) {
|
||
for (const propertyName of properties) {
|
||
const propertyTrackState = this._GetPropertyTrackState(propertyName);
|
||
this.SetStartValue(propertyTrackState.GetCurrentState(), propertyName)
|
||
}
|
||
if (this.IsForwardPlayBack()) {
|
||
this.SetTotalTime(this.GetTotalTime() - this.GetTime());
|
||
this._SetTime(0)
|
||
} else {
|
||
this.SetTotalTime(this.GetTime());
|
||
this._SetTime(this.GetTotalTime())
|
||
}
|
||
this.SetInitialStateFromSetTime()
|
||
}
|
||
SetEndValue(endValue, propertyName) {
|
||
const propertyTrackState = this._GetPropertyTrackState(propertyName);
|
||
const propertyTrackData = propertyTrackState.GetPropertyTrackData();
|
||
const propertyTrackDataItem = propertyTrackState.GetPropertyTrackDataItem();
|
||
const propertyKeyframeDataItem = propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem);
|
||
propertyKeyframeDataItem.SetTime(this.GetTotalTime());
|
||
propertyKeyframeDataItem.SetValue(endValue);
|
||
propertyKeyframeDataItem.SetAbsoluteValue(endValue)
|
||
}
|
||
SetId(id) {
|
||
this._id = id
|
||
}
|
||
GetId() {
|
||
return this._id
|
||
}
|
||
SetInitialValueMode(initialValueMode) {
|
||
this._initialValueMode = initialValueMode
|
||
}
|
||
GetInitialValueMode() {
|
||
return this._initialValueMode
|
||
}
|
||
SetDestroyInstanceOnComplete(releaseOnComplete) {
|
||
this._destroyInstanceOnComplete = releaseOnComplete
|
||
}
|
||
GetDestroyInstanceOnComplete() {
|
||
return this._destroyInstanceOnComplete
|
||
}
|
||
OnStarted() {
|
||
if (this._on_started_callbacks)
|
||
for (const c of this._on_started_callbacks)
|
||
c(this);
|
||
if (this.IsComplete())
|
||
return;
|
||
for (const track of this._tracks)
|
||
track.CompareSaveStateWithCurrent()
|
||
}
|
||
OnCompleted() {
|
||
this._completedTick = this._runtime.GetTickCount()
|
||
}
|
||
FinishTriggers() {
|
||
if (this._finishedTriggers)
|
||
return;
|
||
this._finishedTriggers = true;
|
||
if (this._on_completed_callbacks)
|
||
for (const c of this._on_completed_callbacks)
|
||
c(this)
|
||
}
|
||
SetTime(time) {
|
||
this._DeleteIntermediateKeyframes();
|
||
super.SetTime(time)
|
||
}
|
||
SetInitialState(fromSetTime) {
|
||
if (!this.InitialStateSet() && this.GetInitialValueMode() === INITIAL_VALUE_MODE_CURRENT_STATE)
|
||
for (const track of this._tracks)
|
||
track.CompareInitialStateWithCurrent();
|
||
super.SetInitialState(fromSetTime)
|
||
}
|
||
Stop(completed=false) {
|
||
super.Stop(completed);
|
||
if (this.IsComplete())
|
||
return;
|
||
for (const track of this._tracks)
|
||
track.SaveState()
|
||
}
|
||
Reset(render=true, beforeChangeLayout=false) {
|
||
this._DeleteIntermediateKeyframes();
|
||
super.Reset(render, beforeChangeLayout)
|
||
}
|
||
_DeleteIntermediateKeyframes() {
|
||
for (const track of this._tracks) {
|
||
const del = kf=>{
|
||
const time = kf.GetTime();
|
||
const totalTime = this.GetTotalTime();
|
||
return time !== 0 && time !== totalTime
|
||
}
|
||
;
|
||
track.DeleteKeyframes(del);
|
||
track.DeletePropertyKeyframes(del)
|
||
}
|
||
}
|
||
_OnBeforeChangeLayout() {
|
||
if (this.IsReleased())
|
||
return true;
|
||
const instance = this.GetInstance();
|
||
if (instance && instance.GetObjectClass().IsGlobal())
|
||
return false;
|
||
this._timelineManager.CompleteTimeline(this);
|
||
this.ResetBeforeChangeLayout();
|
||
return true
|
||
}
|
||
MaybeTriggerKeyframeReachedConditions() {}
|
||
Tick(deltaTime, timeScale) {
|
||
const instance = this.GetInstance();
|
||
const dt = this.GetRuntime().GetDt(instance);
|
||
super.Tick(dt, 1)
|
||
}
|
||
_SaveToJson() {
|
||
const ret = super._SaveToJson();
|
||
const tweenDataItem = this.GetTimelineDataItem();
|
||
return Object.assign(ret, {
|
||
"tweenDataItemJson": tweenDataItem._SaveToJson(),
|
||
"id": this._id,
|
||
"destroyInstanceOnComplete": this._destroyInstanceOnComplete,
|
||
"initialValueMode": this._initialValueMode
|
||
})
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (!o)
|
||
return;
|
||
const tweenDataItem = this.GetTimelineDataItem();
|
||
tweenDataItem._LoadFromJson(o["tweenDataItemJson"]);
|
||
super._LoadFromJson(o);
|
||
this._id = o["id"];
|
||
this._destroyInstanceOnComplete = o["destroyInstanceOnComplete"];
|
||
this._initialValueMode = o["initialValueMode"]
|
||
}
|
||
static IsPlaying(tween) {
|
||
return tween.IsPlaying()
|
||
}
|
||
static IsPaused(tween) {
|
||
return tween.IsPaused()
|
||
}
|
||
static Build(config) {
|
||
const timelineManager = config.runtime.GetTimelineManager();
|
||
const tweenDataItem = new C3.TimelineDataItem;
|
||
if (config.json) {
|
||
tweenDataItem._LoadFromJson(config.json["tweenDataItemJson"]);
|
||
const tween = new C3.Tween(tweenDataItem,timelineManager);
|
||
tween._LoadFromJson(config.json);
|
||
return tween
|
||
} else {
|
||
const tween = new C3.Tween(tweenDataItem,timelineManager);
|
||
if (!C3.IsArray(config.propertyTracksConfig))
|
||
config.propertyTracksConfig = [config.propertyTracksConfig];
|
||
tween.SetId(config.id);
|
||
tween.SetTags(config.tags);
|
||
tween.SetInitialValueMode(config.initialValueMode);
|
||
tween.SetDestroyInstanceOnComplete(config.releaseOnComplete);
|
||
tween.SetLoop(config.loop);
|
||
tween.SetPingPong(config.pingPong);
|
||
tween.SetTotalTime(config.time);
|
||
tween.SetStep(0);
|
||
tween.SetInterpolationMode("default");
|
||
tween.SetResultMode(config.propertyTracksConfig[0].resultMode);
|
||
const track = tween.AddTrack();
|
||
track.SetInstanceUID(config.instance.GetUID());
|
||
track.SetInterpolationMode("default");
|
||
track.SetResultMode(config.propertyTracksConfig[0].resultMode);
|
||
track.SetEnable(true);
|
||
track.SetObjectClassIndex(config.instance.GetObjectClass().GetIndex());
|
||
track.SetOriginalWidth(config.instance.GetWorldInfo().GetWidth());
|
||
track.SetOriginalHeight(config.instance.GetWorldInfo().GetHeight());
|
||
const startKeyframeDataItem = track.AddKeyframe();
|
||
startKeyframeDataItem.SetTime(0);
|
||
startKeyframeDataItem.SetEase("noease");
|
||
startKeyframeDataItem.SetEnable(true);
|
||
startKeyframeDataItem.SetTags("");
|
||
const endKeyframeDataItem = track.AddKeyframe();
|
||
endKeyframeDataItem.SetTime(config.time);
|
||
endKeyframeDataItem.SetEase("noease");
|
||
endKeyframeDataItem.SetEnable(true);
|
||
endKeyframeDataItem.SetTags("");
|
||
for (const propertyTrackConfig of config.propertyTracksConfig) {
|
||
const propertyTrack = track.AddPropertyTrack();
|
||
propertyTrack.SetSourceAdapterId(propertyTrackConfig.sourceId);
|
||
propertyTrack.SetSourceAdapterArgs(propertyTrackConfig.sourceArgs);
|
||
propertyTrack.SetPropertyName(propertyTrackConfig.property);
|
||
propertyTrack.SetPropertyType(propertyTrackConfig.type);
|
||
propertyTrack.SetMin(NaN);
|
||
propertyTrack.SetMax(NaN);
|
||
propertyTrack.SetInterpolationMode("default");
|
||
propertyTrack.SetResultMode(propertyTrackConfig.resultMode);
|
||
propertyTrack.SetEnable(true);
|
||
const startPropertyKeyframeDataItem = propertyTrack.AddPropertyKeyframe();
|
||
startPropertyKeyframeDataItem.SetType(propertyTrackConfig.valueType);
|
||
startPropertyKeyframeDataItem.SetTime(0);
|
||
startPropertyKeyframeDataItem.SetEase(propertyTrackConfig.ease);
|
||
startPropertyKeyframeDataItem.SetEnable(true);
|
||
startPropertyKeyframeDataItem.SetValue(propertyTrackConfig.startValue);
|
||
startPropertyKeyframeDataItem.SetAbsoluteValue(propertyTrackConfig.startValue);
|
||
const endPropertyKeyframeDataItem = propertyTrack.AddPropertyKeyframe();
|
||
endPropertyKeyframeDataItem.SetType(propertyTrackConfig.valueType);
|
||
endPropertyKeyframeDataItem.SetTime(config.time);
|
||
endPropertyKeyframeDataItem.SetEase(propertyTrackConfig.ease);
|
||
endPropertyKeyframeDataItem.SetEnable(true);
|
||
endPropertyKeyframeDataItem.SetValue(propertyTrackConfig.endValue);
|
||
endPropertyKeyframeDataItem.SetAbsoluteValue(propertyTrackConfig.endValue)
|
||
}
|
||
return tween
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const Ease = self.Ease;
|
||
const NAME = 0;
|
||
const TRANSITION_KEYFRAMES = 1;
|
||
C3.Transition = class Transition extends C3.DefendedBase {
|
||
constructor(data) {
|
||
super();
|
||
this._name = data[NAME];
|
||
this._transitionKeyframes = [];
|
||
for (const transitionKeyframeData of data[TRANSITION_KEYFRAMES]) {
|
||
const transitionKeyframe = C3.TransitionKeyframe.Create(this, transitionKeyframeData);
|
||
this._transitionKeyframes.push(transitionKeyframe)
|
||
}
|
||
this._precalculatedSamples = new Map;
|
||
this._transitionKeyframeCache = new Map;
|
||
this._PreCalcSamples();
|
||
Ease.AddCustomEase(this._name, (t,sv,dv,tt)=>this.Interpolate(t, sv, dv, tt))
|
||
}
|
||
static Create(data) {
|
||
return C3.New(C3.Transition, data)
|
||
}
|
||
Release() {
|
||
for (const transitionKeyframe of this._transitionKeyframes)
|
||
transitionKeyframe.Release();
|
||
C3.clearArray(this._transitionKeyframes);
|
||
this._transitionKeyframes = null;
|
||
this._precalculatedSamples.clear();
|
||
this._precalculatedSamples = null;
|
||
this._transitionKeyframeCache.clear();
|
||
this._transitionKeyframeCache = null
|
||
}
|
||
GetTransitionKeyFrameAt(x) {
|
||
const transitionKeyframe = this._transitionKeyframeCache.get(x);
|
||
if (transitionKeyframe)
|
||
return transitionKeyframe;
|
||
for (const transitionKeyframe of this._transitionKeyframes)
|
||
if (transitionKeyframe.GetValueX() === x) {
|
||
this._transitionKeyframeCache.set(x, transitionKeyframe);
|
||
return transitionKeyframe
|
||
}
|
||
}
|
||
GetFirstTransitionKeyFrameHigherThan(x) {
|
||
for (const transitionKeyframe of this._transitionKeyframes)
|
||
if (transitionKeyframe.GetValueX() > x)
|
||
return transitionKeyframe
|
||
}
|
||
GetFirstTransitionKeyFrameHigherOrEqualThan(x) {
|
||
for (const transitionKeyframe of this._transitionKeyframes)
|
||
if (transitionKeyframe.GetValueX() >= x)
|
||
return transitionKeyframe
|
||
}
|
||
GetFirstTransitionKeyFrameLowerOrEqualThan(x) {
|
||
for (let i = this._transitionKeyframes.length - 1; i >= 0; i--) {
|
||
const transitionKeyframe = this._transitionKeyframes[i];
|
||
if (transitionKeyframe.GetValueX() <= x)
|
||
return transitionKeyframe
|
||
}
|
||
}
|
||
Interpolate(time, startValue, deltaValue, totalTime) {
|
||
const n = time / totalTime;
|
||
let start = this.GetTransitionKeyFrameAt(n);
|
||
let end = null;
|
||
if (start)
|
||
end = this.GetFirstTransitionKeyFrameHigherThan(n);
|
||
else {
|
||
start = this.GetFirstTransitionKeyFrameLowerOrEqualThan(n);
|
||
end = this.GetFirstTransitionKeyFrameHigherOrEqualThan(n)
|
||
}
|
||
const delta = end.GetValueX() - start.GetValueX();
|
||
const nn = C3.mapToRange(n, start.GetValueX(), end.GetValueX(), 0, delta);
|
||
const startX = start.GetValueX();
|
||
const startY = start.GetValueY();
|
||
const anchor1X = start.GetValueX() + start.GetStartAnchorX();
|
||
const anchor1Y = start.GetValueY() + start.GetStartAnchorY();
|
||
const anchor2X = end.GetValueX() + end.GetEndAnchorX();
|
||
const anchor2Y = end.GetValueY() + end.GetEndAnchorY();
|
||
const endX = end.GetValueX();
|
||
const endY = end.GetValueY();
|
||
let ret = Ease.GetRuntimeEase("spline")(nn, startX, startY, anchor1X, anchor1Y, anchor2X, anchor2Y, endX, endY, this._precalculatedSamples.get(start));
|
||
ret += start.GetValueY();
|
||
return (1 - ret) * startValue + ret * (startValue + deltaValue)
|
||
}
|
||
_PreCalcSamples() {
|
||
this._precalculatedSamples.clear();
|
||
for (let i = 0; i < this._transitionKeyframes.length - 1; i++) {
|
||
const transitionKeyframe = this._transitionKeyframes[i];
|
||
if (!transitionKeyframe.GetStartEnable())
|
||
continue;
|
||
const start = transitionKeyframe;
|
||
const end = this._transitionKeyframes[i + 1];
|
||
const startValue = start.GetValueX();
|
||
const anchor1Value = start.GetValueX() + start.GetStartAnchorX();
|
||
const anchor2Value = end.GetValueX() + end.GetEndAnchorX();
|
||
const endValue = end.GetValueX();
|
||
this._precalculatedSamples.set(start, Ease.GetBezierSamples(startValue, anchor1Value, anchor2Value, endValue))
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const VALUE_X = 0;
|
||
const VALUE_Y = 1;
|
||
const START_ANCHOR_X = 2;
|
||
const START_ANCHOR_Y = 3;
|
||
const END_ANCHOR_X = 4;
|
||
const END_ANCHOR_Y = 5;
|
||
const START_ENABLE = 6;
|
||
const END_ENABLE = 7;
|
||
C3.TransitionKeyframe = class TransitionKeyframe extends C3.DefendedBase {
|
||
constructor(transition, data) {
|
||
super();
|
||
this._transition = transition;
|
||
this._valueX = data[VALUE_X];
|
||
this._valueY = data[VALUE_Y];
|
||
this._startAnchorX = data[START_ANCHOR_X];
|
||
this._startAnchorY = data[START_ANCHOR_Y];
|
||
this._endAnchorX = data[END_ANCHOR_X];
|
||
this._endAnchorY = data[END_ANCHOR_Y];
|
||
this._startEnable = data[START_ENABLE];
|
||
this._endEnable = data[END_ENABLE]
|
||
}
|
||
Release() {
|
||
this._transition = null
|
||
}
|
||
static Create(transition, data) {
|
||
return C3.New(C3.TransitionKeyframe, transition, data)
|
||
}
|
||
GetValueX() {
|
||
return this._valueX
|
||
}
|
||
GetValueY() {
|
||
return this._valueY
|
||
}
|
||
GetStartAnchorX() {
|
||
return this._startAnchorX
|
||
}
|
||
GetStartAnchorY() {
|
||
return this._startAnchorY
|
||
}
|
||
GetEndAnchorX() {
|
||
return this._endAnchorX
|
||
}
|
||
GetEndAnchorY() {
|
||
return this._endAnchorY
|
||
}
|
||
GetStartEnable() {
|
||
return this._startEnable
|
||
}
|
||
GetEndEnable() {
|
||
return this._endEnable
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.TransitionManager = class TransitionManager extends C3.DefendedBase {
|
||
constructor(runtime) {
|
||
super();
|
||
this._runtime = runtime;
|
||
this._transitions = []
|
||
}
|
||
Release() {
|
||
for (const transition of this._transitions)
|
||
transition.Release();
|
||
C3.clearArray(this._transitions);
|
||
this._transitions = null
|
||
}
|
||
Create(transitionData) {
|
||
this._transitions.push(C3.Transition.Create(transitionData))
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.SolStack = class SolStack extends C3.DefendedBase {
|
||
constructor(objectClass) {
|
||
super();
|
||
this._objectClass = objectClass;
|
||
this._stack = [];
|
||
this._stack.push(C3.New(C3.Sol, this));
|
||
this._index = 0;
|
||
this._current = this._stack[0]
|
||
}
|
||
Release() {
|
||
for (const s of this._stack)
|
||
s.Release();
|
||
C3.clearArray(this._stack);
|
||
this._current = null;
|
||
this._objectClass = null
|
||
}
|
||
GetObjectClass() {
|
||
return this._objectClass
|
||
}
|
||
GetCurrentSol() {
|
||
return this._current
|
||
}
|
||
Clear() {
|
||
this.GetCurrentSol().Clear()
|
||
}
|
||
PushClean() {
|
||
const stack = this._stack;
|
||
const index = ++this._index;
|
||
if (index === stack.length) {
|
||
const sol = C3.New(C3.Sol, this);
|
||
stack.push(sol);
|
||
this._current = sol
|
||
} else {
|
||
const sol = stack[index];
|
||
sol.Reset();
|
||
this._current = sol
|
||
}
|
||
}
|
||
PushCopy() {
|
||
const stack = this._stack;
|
||
const index = ++this._index;
|
||
if (index === stack.length)
|
||
stack.push(C3.New(C3.Sol, this));
|
||
const sol = stack[index];
|
||
sol.Copy(stack[index - 1]);
|
||
this._current = sol
|
||
}
|
||
Pop() {
|
||
this._current = this._stack[--this._index]
|
||
}
|
||
RemoveInstances(s) {
|
||
const stack = this._stack;
|
||
for (let i = 0, len = stack.length; i < len; ++i)
|
||
stack[i].RemoveInstances(s)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Sol = class Sol extends C3.DefendedBase {
|
||
constructor(stack) {
|
||
super();
|
||
this._stack = stack;
|
||
this._objectClass = this._stack.GetObjectClass();
|
||
this._eventStack = this._objectClass.GetRuntime().GetEventStack();
|
||
this._selectAll = true;
|
||
this._instances = [];
|
||
this._elseInstances = []
|
||
}
|
||
Release() {
|
||
this.ClearArrays();
|
||
this._stack = null;
|
||
this._objectClass = null;
|
||
this._eventStack = null
|
||
}
|
||
ClearArrays() {
|
||
C3.clearArray(this._instances);
|
||
C3.clearArray(this._elseInstances)
|
||
}
|
||
GetObjectClass() {
|
||
return this._objectClass
|
||
}
|
||
IsSelectAll() {
|
||
return this._selectAll
|
||
}
|
||
HasAnyInstances() {
|
||
if (this._selectAll)
|
||
return !!this._objectClass.GetInstanceCount();
|
||
else
|
||
return !!this._instances.length
|
||
}
|
||
GetInstances() {
|
||
if (this._selectAll)
|
||
return this._objectClass.GetInstances();
|
||
else
|
||
return this._instances
|
||
}
|
||
HasAnyElseInstances() {
|
||
return !!this._elseInstances.length
|
||
}
|
||
GetElseInstances() {
|
||
return this._elseInstances
|
||
}
|
||
GetExpressionInstances() {
|
||
const ret = this.GetInstances();
|
||
if (ret.length)
|
||
return ret;
|
||
else
|
||
return this._elseInstances
|
||
}
|
||
Reset() {
|
||
this._selectAll = true;
|
||
C3.clearArray(this._elseInstances)
|
||
}
|
||
Clear() {
|
||
this._selectAll = true
|
||
}
|
||
Copy(sol) {
|
||
if (sol.IsSelectAll())
|
||
this.Reset();
|
||
else {
|
||
this._selectAll = false;
|
||
C3.shallowAssignArray(this._instances, sol._instances);
|
||
C3.clearArray(this._elseInstances)
|
||
}
|
||
}
|
||
_PushInstance(inst) {
|
||
this._instances.push(inst)
|
||
}
|
||
_PushElseInstance(inst) {
|
||
this._elseInstances.push(inst)
|
||
}
|
||
_SetSelectAll(s) {
|
||
this._selectAll = !!s
|
||
}
|
||
_GetOwnInstances() {
|
||
return this._instances
|
||
}
|
||
_GetOwnElseInstances() {
|
||
return this._elseInstances
|
||
}
|
||
SetSinglePicked(inst) {
|
||
this._selectAll = false;
|
||
C3.clearArray(this._instances);
|
||
this._instances.push(inst)
|
||
}
|
||
SetArrayPicked(arr) {
|
||
this._selectAll = false;
|
||
C3.shallowAssignArray(this._instances, arr)
|
||
}
|
||
SetSetPicked(set) {
|
||
this._selectAll = false;
|
||
C3.clearArray(this._instances);
|
||
for (const item of set)
|
||
this._instances.push(item)
|
||
}
|
||
AddElseInstances(setOfPicked, arrayOfAllPicked) {
|
||
for (const inst of arrayOfAllPicked)
|
||
if (!setOfPicked.has(inst))
|
||
this._elseInstances.push(inst)
|
||
}
|
||
TransferElseInstancesToOwn(setOfPicked) {
|
||
for (const inst of setOfPicked)
|
||
this._instances.push(inst);
|
||
C3.arrayRemoveAllInSet(this._elseInstances, setOfPicked)
|
||
}
|
||
PickOne(inst) {
|
||
if (!inst)
|
||
return;
|
||
if (this._eventStack.GetCurrentStackFrame().GetCurrentEvent().IsOrBlock()) {
|
||
if (this.IsSelectAll()) {
|
||
C3.clearArray(this._instances);
|
||
C3.shallowAssignArray(this._elseInstances, inst.GetObjectClass().GetInstances());
|
||
this._selectAll = false
|
||
}
|
||
const i = this._elseInstances.indexOf(inst);
|
||
if (i !== -1) {
|
||
this._instances.push(this._elseInstances[i]);
|
||
this._elseInstances.splice(i, 1)
|
||
}
|
||
} else
|
||
this.SetSinglePicked(inst)
|
||
}
|
||
RemoveInstances(s) {
|
||
C3.arrayRemoveAllInSet(this._instances, s);
|
||
C3.arrayRemoveAllInSet(this._elseInstances, s)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.EventStack = class EventStack extends C3.DefendedBase {
|
||
constructor(eventSheetManager) {
|
||
super();
|
||
this._eventSheetManager = eventSheetManager;
|
||
this._runtime = this._eventSheetManager.GetRuntime();
|
||
this._stack = [];
|
||
this._stack.push(C3.New(C3.EventStackFrame, this, null));
|
||
this._index = 0;
|
||
this._expFuncStack = []
|
||
}
|
||
Release() {
|
||
for (const e of this._stack)
|
||
e.Release();
|
||
C3.clearArray(this._stack);
|
||
C3.clearArray(this._expFuncStack);
|
||
this._eventSheetManager = null;
|
||
this._runtime = null
|
||
}
|
||
GetEventSheetManager() {
|
||
return this._eventSheetManager
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetCurrentStackFrame() {
|
||
return this._stack[this._index]
|
||
}
|
||
Push(currentEvent) {
|
||
const stack = this._stack;
|
||
const index = ++this._index;
|
||
if (index === stack.length) {
|
||
const ret = C3.New(C3.EventStackFrame, this, currentEvent);
|
||
stack.push(ret);
|
||
return ret
|
||
} else {
|
||
const ret = stack[index];
|
||
ret.Reset(currentEvent);
|
||
return ret
|
||
}
|
||
}
|
||
Pop() {
|
||
--this._index
|
||
}
|
||
PushExpFunc(frame) {
|
||
this._expFuncStack.push(frame)
|
||
}
|
||
PopExpFunc() {
|
||
this._expFuncStack.pop()
|
||
}
|
||
GetCurrentExpFuncStackFrame() {
|
||
const expFuncStack = this._expFuncStack;
|
||
if (expFuncStack.length === 0)
|
||
return null;
|
||
else
|
||
return expFuncStack[expFuncStack.length - 1]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.EventStackFrame = class EventStackFrame extends C3.DefendedBase {
|
||
constructor(stack, currentEvent) {
|
||
super();
|
||
this._stack = stack;
|
||
this._runtime = this._stack.GetRuntime();
|
||
this._currentEvent = currentEvent;
|
||
this._cndIndex = 0;
|
||
this._actIndex = 0;
|
||
this._lastEventTrue = false;
|
||
this._elseBranchRan = false;
|
||
this._expressionObjectClass = null;
|
||
this._functionReturnType = 0;
|
||
this._functionReturnValue = 0
|
||
}
|
||
Release() {
|
||
this.Reset(null);
|
||
this._stack = null;
|
||
this._runtime = null
|
||
}
|
||
Reset(currentEvent) {
|
||
this._currentEvent = currentEvent;
|
||
this._cndIndex = 0;
|
||
this._actIndex = 0;
|
||
this._lastEventTrue = false;
|
||
this._elseBranchRan = false
|
||
}
|
||
_Restore(currentEvent, actIndex) {
|
||
this._currentEvent = currentEvent;
|
||
this._cndIndex = 0;
|
||
this._actIndex = actIndex
|
||
}
|
||
ResetQuick() {
|
||
this._cndIndex = 0;
|
||
this._actIndex = 0
|
||
}
|
||
GetCurrentEvent() {
|
||
return this._currentEvent
|
||
}
|
||
SetCurrentEvent(currentEvent) {
|
||
this._currentEvent = currentEvent
|
||
}
|
||
GetConditionIndex() {
|
||
return this._cndIndex
|
||
}
|
||
SetConditionIndex(i) {
|
||
this._cndIndex = i
|
||
}
|
||
GetActionIndex() {
|
||
return this._actIndex
|
||
}
|
||
SetActionIndex(i) {
|
||
this._actIndex = i
|
||
}
|
||
SetLastEventTrue(t) {
|
||
this._lastEventTrue = !!t
|
||
}
|
||
GetLastEventTrue() {
|
||
return this._lastEventTrue
|
||
}
|
||
SetElseBranchRan(r) {
|
||
this._elseBranchRan = !!r
|
||
}
|
||
GetElseBranchRan() {
|
||
return this._elseBranchRan
|
||
}
|
||
SetExpressionObjectClass(objectClass) {
|
||
this._expressionObjectClass = objectClass
|
||
}
|
||
GetExpressionObjectClass() {
|
||
return this._expressionObjectClass
|
||
}
|
||
InitCallFunctionExpression(returnType, defaultReturnValue) {
|
||
this._functionReturnType = returnType;
|
||
this._functionReturnValue = defaultReturnValue
|
||
}
|
||
GetFunctionReturnType() {
|
||
return this._functionReturnType
|
||
}
|
||
SetFunctionReturnValue(v) {
|
||
this._functionReturnValue = v
|
||
}
|
||
GetFunctionReturnValue() {
|
||
return this._functionReturnValue
|
||
}
|
||
IsSolModifierAfterCnds() {
|
||
const currentEvent = this._currentEvent;
|
||
if (currentEvent.IsSolWriterAfterCnds())
|
||
return true;
|
||
if (this._cndIndex < currentEvent.GetConditionCount() - 1)
|
||
return !!currentEvent.GetSolModifiers().length;
|
||
return false
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.LocalVarStack = class LocalVarStack extends C3.DefendedBase {
|
||
constructor(eventSheetManager) {
|
||
super();
|
||
this._eventSheetManager = eventSheetManager;
|
||
this._runtime = this._eventSheetManager.GetRuntime();
|
||
this._stack = [];
|
||
this._index = -1;
|
||
this._current = null;
|
||
this._initialValues = []
|
||
}
|
||
Release() {
|
||
C3.clearArray(this._stack);
|
||
this._eventSheetManager = null;
|
||
this._runtime = null
|
||
}
|
||
_SetInitialValues(initialValues) {
|
||
this._initialValues = initialValues;
|
||
const arr = this._initialValues.slice(0);
|
||
this._stack.push(arr);
|
||
this._index = 0;
|
||
this._current = arr
|
||
}
|
||
GetEventSheetManager() {
|
||
return this._eventSheetManager
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetCurrent() {
|
||
return this._current
|
||
}
|
||
Push() {
|
||
const index = ++this._index;
|
||
const stack = this._stack;
|
||
if (index === stack.length)
|
||
stack.push(this._initialValues.slice(0));
|
||
else
|
||
C3.shallowAssignArray(stack[index], this._initialValues);
|
||
this._current = stack[index]
|
||
}
|
||
Pop() {
|
||
this._current = this._stack[--this._index]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.LoopStack = class LoopStack extends C3.DefendedBase {
|
||
constructor(eventSheetManager) {
|
||
super();
|
||
this._eventSheetManager = eventSheetManager;
|
||
this._runtime = this._eventSheetManager.GetRuntime();
|
||
this._stack = [];
|
||
this._index = -1
|
||
}
|
||
Release() {
|
||
C3.clearArray(this._stack);
|
||
this._eventSheetManager = null;
|
||
this._runtime = null
|
||
}
|
||
GetEventSheetManager() {
|
||
return this._eventSheetManager
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
IsInLoop() {
|
||
return this._index >= 0
|
||
}
|
||
GetCurrent() {
|
||
return this._stack[this._index]
|
||
}
|
||
Push() {
|
||
++this._index;
|
||
if (this._index === this._stack.length) {
|
||
const ret = C3.New(C3.Loop, this);
|
||
this._stack.push(ret);
|
||
return ret
|
||
} else {
|
||
const ret = this._stack[this._index];
|
||
ret.Reset();
|
||
return ret
|
||
}
|
||
}
|
||
Pop() {
|
||
--this._index
|
||
}
|
||
FindByName(name) {
|
||
const stack = this._stack;
|
||
for (let i = this._index; i >= 0; --i) {
|
||
const loop = stack[i];
|
||
if (loop.GetName() === name)
|
||
return loop
|
||
}
|
||
return null
|
||
}
|
||
_GetStack() {
|
||
return this._stack.slice(0, this._index + 1)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Loop = class Loop extends C3.DefendedBase {
|
||
constructor(loopStack) {
|
||
super();
|
||
this._loopStack = loopStack;
|
||
this._name = "";
|
||
this._index = 0;
|
||
this._isStopped = false;
|
||
this._end = NaN
|
||
}
|
||
Reset() {
|
||
this._name = "";
|
||
this._index = 0;
|
||
this._isStopped = false;
|
||
this._end = NaN
|
||
}
|
||
SetName(name) {
|
||
this._name = name
|
||
}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
SetIndex(i) {
|
||
this._index = i
|
||
}
|
||
GetIndex() {
|
||
return this._index
|
||
}
|
||
Stop() {
|
||
this._isStopped = true
|
||
}
|
||
IsStopped() {
|
||
return this._isStopped
|
||
}
|
||
SetEnd(e) {
|
||
this._end = e
|
||
}
|
||
GetEnd() {
|
||
return this._end
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.ArrayStack = class ArrayStack extends C3.DefendedBase {
|
||
constructor() {
|
||
super();
|
||
this._stack = [];
|
||
this._index = -1
|
||
}
|
||
Release() {
|
||
C3.clearArray(this._stack)
|
||
}
|
||
GetCurrent() {
|
||
return this._stack[this._index]
|
||
}
|
||
Push() {
|
||
++this._index;
|
||
if (this._index === this._stack.length) {
|
||
const ret = [];
|
||
this._stack.push(ret);
|
||
return ret
|
||
} else
|
||
return this._stack[this._index]
|
||
}
|
||
Pop() {
|
||
--this._index
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
function SortSolArray(a, b) {
|
||
return a.GetIndex() - b.GetIndex()
|
||
}
|
||
function IsSolArrayIdentical(a, b) {
|
||
for (let i = 0, len = a.length; i < len; ++i)
|
||
if (a[i] !== b[i])
|
||
return false;
|
||
return true
|
||
}
|
||
C3.EventSheetManager = class EventSheetManager extends C3.DefendedBase {
|
||
constructor(runtime) {
|
||
super();
|
||
this._runtime = runtime;
|
||
this._allSheets = [];
|
||
this._sheetsByName = new Map;
|
||
this._allGroups = [];
|
||
this._groupsByName = new Map;
|
||
this._blocksBySid = new Map;
|
||
this._cndsBySid = new Map;
|
||
this._actsBySid = new Map;
|
||
this._allUniqueSolModifiers = new Map;
|
||
this._eventVarsBySid = new Map;
|
||
this._nextLocalVarIndex = 0;
|
||
this._allGlobalVars = [];
|
||
this._allLocalVars = [];
|
||
this._localVarInitialValues = [];
|
||
this._functionBlocksByName = new Map;
|
||
this._eventStack = C3.New(C3.EventStack, this);
|
||
this._localVarStack = C3.New(C3.LocalVarStack, this);
|
||
this._loopStack = C3.New(C3.LoopStack, this);
|
||
this._triggersToPostInit = [];
|
||
this._queuedTriggers = [];
|
||
this._queuedDebugTriggers = [];
|
||
this._runningEventsDepth = 0;
|
||
this._executingTriggerDepth = 0;
|
||
this._blockFlushingDepth = 0;
|
||
this._scheduledWaits = [];
|
||
this._asyncActionPromises = [];
|
||
self["c3_callFunction"] = (name,params)=>this._InvokeFunctionFromJS(name, params)
|
||
}
|
||
Release() {
|
||
this.ClearAllScheduledWaits();
|
||
this._eventStack.Release();
|
||
this._eventStack = null;
|
||
this._localVarStack.Release();
|
||
this._localVarStack = null;
|
||
C3.clearArray(this._queuedTriggers);
|
||
C3.clearArray(this._queuedDebugTriggers);
|
||
this._runtime = null;
|
||
C3.clearArray(this._allSheets);
|
||
this._sheetsByName.clear()
|
||
}
|
||
Create(eventSheetData) {
|
||
const eventSheet = C3.New(C3.EventSheet, this, eventSheetData);
|
||
this._allSheets.push(eventSheet);
|
||
this._sheetsByName.set(eventSheet.GetName().toLowerCase(), eventSheet)
|
||
}
|
||
_AddTriggerToPostInit(trig) {
|
||
this._triggersToPostInit.push(trig)
|
||
}
|
||
_PostInit() {
|
||
for (const functionBlock of this._functionBlocksByName.values())
|
||
functionBlock._PostInit(false);
|
||
for (const sheet of this._allSheets)
|
||
sheet._PostInit();
|
||
for (const sheet of this._allSheets)
|
||
sheet._UpdateDeepIncludes();
|
||
for (const trig of this._triggersToPostInit)
|
||
trig._PostInit(false);
|
||
C3.clearArray(this._triggersToPostInit);
|
||
this._localVarStack._SetInitialValues(this._localVarInitialValues)
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetEventSheetByName(name) {
|
||
return this._sheetsByName.get(name.toLowerCase()) || null
|
||
}
|
||
_RegisterGroup(group) {
|
||
this._allGroups.push(group);
|
||
this._groupsByName.set(group.GetGroupName(), group)
|
||
}
|
||
_RegisterEventBlock(eventBlock) {
|
||
this._blocksBySid.set(eventBlock.GetSID(), eventBlock)
|
||
}
|
||
_RegisterCondition(condition) {
|
||
this._cndsBySid.set(condition.GetSID(), condition)
|
||
}
|
||
_RegisterAction(action) {
|
||
this._actsBySid.set(action.GetSID(), action)
|
||
}
|
||
_RegisterFunctionBlock(functionBlock) {
|
||
this._functionBlocksByName.set(functionBlock.GetFunctionName().toLowerCase(), functionBlock)
|
||
}
|
||
_RegisterEventVariable(ev) {
|
||
this._eventVarsBySid.set(ev.GetSID(), ev);
|
||
if (ev.IsGlobal())
|
||
this._allGlobalVars.push(ev);
|
||
else
|
||
this._allLocalVars.push(ev)
|
||
}
|
||
_DeduplicateSolModifierList(arr) {
|
||
if (arr.length >= 2)
|
||
arr.sort(SortSolArray);
|
||
let candidateList = this._allUniqueSolModifiers.get(arr.length);
|
||
if (!candidateList) {
|
||
candidateList = [];
|
||
this._allUniqueSolModifiers.set(arr.length, candidateList)
|
||
}
|
||
for (let i = 0, len = candidateList.length; i < len; ++i) {
|
||
const candidate = candidateList[i];
|
||
if (IsSolArrayIdentical(arr, candidate))
|
||
return candidate
|
||
}
|
||
candidateList.push(arr);
|
||
return arr
|
||
}
|
||
_GetNextLocalVarIndex(eventVar) {
|
||
this._localVarInitialValues.push(eventVar.GetInitialValue());
|
||
return this._nextLocalVarIndex++
|
||
}
|
||
GetEventStack() {
|
||
return this._eventStack
|
||
}
|
||
GetCurrentEventStackFrame() {
|
||
return this.GetEventStack().GetCurrentStackFrame()
|
||
}
|
||
GetCurrentEvent() {
|
||
return this.GetCurrentEventStackFrame().GetCurrentEvent()
|
||
}
|
||
GetCurrentCondition() {
|
||
const frame = this.GetCurrentEventStackFrame();
|
||
const event = frame.GetCurrentEvent();
|
||
return event.GetConditionAt(frame.GetConditionIndex())
|
||
}
|
||
GetCurrentAction() {
|
||
const frame = this.GetCurrentEventStackFrame();
|
||
const event = frame.GetCurrentEvent();
|
||
return event.GetActionAt(frame.GetActionIndex())
|
||
}
|
||
GetLocalVarStack() {
|
||
return this._localVarStack
|
||
}
|
||
GetLoopStack() {
|
||
return this._loopStack
|
||
}
|
||
GetAllLocalVariablesInScope(fromRow) {
|
||
const ret = [];
|
||
fromRow = fromRow.GetScopeParent();
|
||
while (fromRow) {
|
||
C3.appendArray(ret, fromRow._GetAllLocalVariablesInScope());
|
||
fromRow = fromRow.GetScopeParent()
|
||
}
|
||
return ret
|
||
}
|
||
_GetLocalVariablesScriptInterface(fromRow) {
|
||
const localVarDescriptors = {};
|
||
for (const v of this.GetAllLocalVariablesInScope(fromRow))
|
||
localVarDescriptors[v.GetJsPropName()] = v._GetScriptInterfaceDescriptor();
|
||
return Object.create(Object.prototype, localVarDescriptors)
|
||
}
|
||
GetEventVariableBySID(sid) {
|
||
return this._eventVarsBySid.get(sid) || null
|
||
}
|
||
GetEventBlockBySID(sid) {
|
||
return this._blocksBySid.get(sid) || null
|
||
}
|
||
GetConditionBySID(sid) {
|
||
return this._cndsBySid.get(sid) || null
|
||
}
|
||
GetActionBySID(sid) {
|
||
return this._actsBySid.get(sid) || null
|
||
}
|
||
GetFunctionBlockByName(name) {
|
||
return this._functionBlocksByName.get(name.toLowerCase()) || null
|
||
}
|
||
GetAllGlobalVariables() {
|
||
return this._allGlobalVars
|
||
}
|
||
GetAllLocalVariables() {
|
||
return this._allLocalVars
|
||
}
|
||
ResetAllGlobalsToInitialValue() {
|
||
for (const ev of this._allGlobalVars)
|
||
ev.ResetToInitialValue()
|
||
}
|
||
GetEventGroupByName(name) {
|
||
return this._groupsByName.get(name.toLowerCase()) || null
|
||
}
|
||
GetEventGroupBySID(sid) {
|
||
const group = this._blocksBySid.get(sid);
|
||
if (group && group.IsGroup())
|
||
return group;
|
||
else
|
||
return null
|
||
}
|
||
GetAllGroups() {
|
||
return this._allGroups
|
||
}
|
||
ResetAllGroupsInitialActivation() {
|
||
for (const group of this._allGroups)
|
||
group.ResetInitialActivation()
|
||
}
|
||
_ResetAllHasRunFlags() {
|
||
for (const sheet of this._allSheets)
|
||
sheet._ResetHasRunFlag()
|
||
}
|
||
RunEvents(layoutManager) {
|
||
this._ResetAllHasRunFlags();
|
||
this._runningEventsDepth++;
|
||
for (const layout of layoutManager.runningLayouts()) {
|
||
const eventSheet = layout.GetEventSheet();
|
||
if (!eventSheet)
|
||
continue;
|
||
this._runtime.PushCurrentLayout(layout);
|
||
eventSheet.Run();
|
||
this._runtime.PopCurrentLayout()
|
||
}
|
||
this._runningEventsDepth--
|
||
}
|
||
async DebugRunEvents(layoutManager) {
|
||
this._ResetAllHasRunFlags();
|
||
this._runningEventsDepth++;
|
||
for (const breakEventObject of this._DebugRunEventsGen(layoutManager))
|
||
await this._runtime.DebugBreak(breakEventObject);
|
||
this._runningEventsDepth--
|
||
}
|
||
*_DebugRunEventsGen(layoutManager) {
|
||
for (const layout of layoutManager.runningLayouts()) {
|
||
const eventSheet = layout.GetEventSheet();
|
||
if (!eventSheet)
|
||
continue;
|
||
this._runtime.PushCurrentLayout(layout);
|
||
yield*eventSheet.DebugRun();
|
||
this._runtime.PopCurrentLayout()
|
||
}
|
||
}
|
||
_Trigger(layoutManager, method, inst, behaviorType) {
|
||
let ret = false;
|
||
if (!layoutManager.GetMainRunningLayout())
|
||
return this.QueueTrigger(method, inst, behaviorType);
|
||
this._executingTriggerDepth++;
|
||
for (const layout of layoutManager.runningLayouts()) {
|
||
const eventSheet = layout.GetEventSheet();
|
||
if (!eventSheet)
|
||
continue;
|
||
this._runtime.PushCurrentLayout(layout);
|
||
for (const includeSheet of eventSheet.deepIncludes()) {
|
||
const result = includeSheet._Trigger(method, inst, behaviorType);
|
||
ret = ret || result
|
||
}
|
||
const result2 = eventSheet._Trigger(method, inst, behaviorType);
|
||
ret = ret || result2;
|
||
this._runtime.PopCurrentLayout()
|
||
}
|
||
this._executingTriggerDepth--;
|
||
return ret
|
||
}
|
||
*_DebugTrigger(layoutManager, method, inst, behaviorType) {
|
||
let ret = false;
|
||
if (!layoutManager.GetMainRunningLayout())
|
||
return this.QueueTrigger(method, inst, behaviorType);
|
||
this._executingTriggerDepth++;
|
||
for (const layout of layoutManager.runningLayouts()) {
|
||
const eventSheet = layout.GetEventSheet();
|
||
if (!eventSheet)
|
||
continue;
|
||
this._runtime.PushCurrentLayout(layout);
|
||
for (const includeSheet of eventSheet.deepIncludes()) {
|
||
const result = yield*includeSheet._DebugTrigger(method, inst, behaviorType);
|
||
ret = ret || result
|
||
}
|
||
const result2 = yield*eventSheet._DebugTrigger(method, inst, behaviorType);
|
||
ret = ret || result2;
|
||
this._runtime.PopCurrentLayout()
|
||
}
|
||
this._executingTriggerDepth--;
|
||
return ret
|
||
}
|
||
QueueTrigger(method, inst, behaviorType) {
|
||
this._queuedTriggers.push([method, inst, behaviorType]);
|
||
return false
|
||
}
|
||
QueueDebugTrigger(method, inst, behaviorType) {
|
||
let resolve = null;
|
||
const ret = new Promise(r=>resolve = r);
|
||
this._queuedDebugTriggers.push([method, inst, behaviorType, resolve]);
|
||
return ret
|
||
}
|
||
*_RunQueuedDebugTriggersGen() {
|
||
if (this._runtime.HitBreakpoint())
|
||
throw new Error("should not be in breakpoint");
|
||
const layoutManager = this._runtime.GetLayoutManager();
|
||
while (this._queuedDebugTriggers.length) {
|
||
const [method,inst,behaviorType,resolve] = this._queuedDebugTriggers.shift();
|
||
const ret = yield*this._DebugTrigger(layoutManager, method, inst, behaviorType);
|
||
resolve(ret)
|
||
}
|
||
}
|
||
async RunQueuedDebugTriggersAsync() {
|
||
for (const breakEventObject of this._RunQueuedDebugTriggersGen())
|
||
await this._runtime.DebugBreak(breakEventObject)
|
||
}
|
||
_FastTrigger(layoutManager, method, inst, value) {
|
||
let ret = false;
|
||
const layout = layoutManager.GetMainRunningLayout();
|
||
const eventSheet = layout.GetEventSheet();
|
||
if (!eventSheet)
|
||
return;
|
||
this._executingTriggerDepth++;
|
||
this._runtime.PushCurrentLayout(layout);
|
||
const deepIncludes = eventSheet.deepIncludes();
|
||
for (let i = 0, len = deepIncludes.length; i < len; ++i) {
|
||
const result = deepIncludes[i]._FastTrigger(method, inst, value);
|
||
ret = ret || result
|
||
}
|
||
const result2 = eventSheet._FastTrigger(method, inst, value);
|
||
ret = ret || result2;
|
||
this._runtime.PopCurrentLayout();
|
||
this._executingTriggerDepth--;
|
||
return ret
|
||
}
|
||
*_DebugFastTrigger(layoutManager, method, inst, value) {
|
||
let ret = false;
|
||
const layout = layoutManager.GetMainRunningLayout();
|
||
const eventSheet = layout.GetEventSheet();
|
||
if (!eventSheet)
|
||
return;
|
||
this._executingTriggerDepth++;
|
||
this._runtime.PushCurrentLayout(layout);
|
||
const deepIncludes = eventSheet.deepIncludes();
|
||
for (let i = 0, len = deepIncludes.length; i < len; ++i) {
|
||
const result = yield*deepIncludes[i]._DebugFastTrigger(method, inst, value);
|
||
ret = ret || result
|
||
}
|
||
const result2 = yield*eventSheet._DebugFastTrigger(method, inst, value);
|
||
ret = ret || result2;
|
||
this._runtime.PopCurrentLayout();
|
||
this._executingTriggerDepth--;
|
||
return ret
|
||
}
|
||
GetTriggerDepth() {
|
||
return this._executingTriggerDepth
|
||
}
|
||
IsInTrigger() {
|
||
return this.GetTriggerDepth() > 0
|
||
}
|
||
_IncTriggerDepth() {
|
||
return ++this._executingTriggerDepth
|
||
}
|
||
_DecTriggerDepth() {
|
||
--this._executingTriggerDepth
|
||
}
|
||
IsRunningEvents() {
|
||
return this._runningEventsDepth > 0
|
||
}
|
||
IsInEventEngine() {
|
||
return this.IsRunningEvents() || this.IsInTrigger()
|
||
}
|
||
_RunQueuedTriggers(layoutManager) {
|
||
for (const [method,inst,behaviorType] of this._queuedTriggers)
|
||
this._Trigger(layoutManager, method, inst, behaviorType);
|
||
C3.clearArray(this._queuedTriggers)
|
||
}
|
||
BlockFlushingInstances(e) {
|
||
if (e)
|
||
this._blockFlushingDepth++;
|
||
else
|
||
this._blockFlushingDepth--
|
||
}
|
||
IsFlushingBlocked() {
|
||
return this._blockFlushingDepth > 0
|
||
}
|
||
ClearSol(solModifiers) {
|
||
for (let i = 0, len = solModifiers.length; i < len; ++i)
|
||
solModifiers[i].GetSolStack().Clear()
|
||
}
|
||
PushCleanSol(solModifiers) {
|
||
for (let i = 0, len = solModifiers.length; i < len; ++i)
|
||
solModifiers[i].GetSolStack().PushClean()
|
||
}
|
||
PushCopySol(solModifiers) {
|
||
for (let i = 0, len = solModifiers.length; i < len; ++i)
|
||
solModifiers[i].GetSolStack().PushCopy()
|
||
}
|
||
PopSol(solModifiers) {
|
||
for (let i = 0, len = solModifiers.length; i < len; ++i)
|
||
solModifiers[i].GetSolStack().Pop()
|
||
}
|
||
AddScheduledWait() {
|
||
const w = C3.New(C3.ScheduledWait, this);
|
||
this._scheduledWaits.push(w);
|
||
return w
|
||
}
|
||
scheduledWaits() {
|
||
return this._scheduledWaits
|
||
}
|
||
RunScheduledWaits() {
|
||
if (!this._scheduledWaits.length)
|
||
return;
|
||
const frame = this.GetCurrentEventStackFrame();
|
||
let didAnyRun = false;
|
||
this._runningEventsDepth++;
|
||
for (let i = 0, len = this._scheduledWaits.length; i < len; ++i) {
|
||
const w = this._scheduledWaits[i];
|
||
if (w._ShouldRun())
|
||
w._Run(frame);
|
||
if (w.ShouldRelease())
|
||
didAnyRun = true
|
||
}
|
||
if (didAnyRun)
|
||
this._FilterScheduledWaitsToRelease();
|
||
this._runningEventsDepth--
|
||
}
|
||
async DebugRunScheduledWaits() {
|
||
if (!this._scheduledWaits.length)
|
||
return;
|
||
const frame = this.GetCurrentEventStackFrame();
|
||
let didAnyRun = false;
|
||
this._runningEventsDepth++;
|
||
for (let i = 0, len = this._scheduledWaits.length; i < len; ++i) {
|
||
const w = this._scheduledWaits[i];
|
||
if (w._ShouldRun())
|
||
await w._DebugRun(frame);
|
||
if (w.ShouldRelease())
|
||
didAnyRun = true
|
||
}
|
||
if (didAnyRun)
|
||
this._FilterScheduledWaitsToRelease();
|
||
this._runningEventsDepth--
|
||
}
|
||
_FilterScheduledWaitsToRelease() {
|
||
const toRelease = C3.arrayFilterOut(this._scheduledWaits, w=>w.ShouldRelease());
|
||
for (const w of toRelease)
|
||
w.Release()
|
||
}
|
||
ClearAllScheduledWaits() {
|
||
for (const w of this._scheduledWaits)
|
||
w.Release();
|
||
C3.clearArray(this._scheduledWaits)
|
||
}
|
||
RemoveInstancesFromScheduledWaits(s) {
|
||
for (const w of this._scheduledWaits)
|
||
w.RemoveInstances(s)
|
||
}
|
||
AddAsyncActionPromise(p) {
|
||
this._asyncActionPromises.push(p)
|
||
}
|
||
ClearAsyncActionPromises() {
|
||
C3.clearArray(this._asyncActionPromises)
|
||
}
|
||
GetPromiseForAllAsyncActions() {
|
||
const ret = Promise.all(this._asyncActionPromises);
|
||
this._asyncActionPromises = [];
|
||
return ret
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"groups": this._SaveGroupsToJson(),
|
||
"cnds": this._SaveCndsToJson(),
|
||
"acts": this._SaveActsToJson(),
|
||
"vars": this._SaveVarsToJson(),
|
||
"waits": this._SaveScheduledWaitsToJson()
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
this._LoadGroupsFromJson(o["groups"]);
|
||
this._LoadCndsFromJson(o["cnds"]);
|
||
this._LoadActsFromJson(o["acts"]);
|
||
this._LoadVarsFromJson(o["vars"]);
|
||
this._LoadScheduledWaitsFromJson(o["waits"])
|
||
}
|
||
_SaveGroupsToJson() {
|
||
const o = {};
|
||
for (const group of this.GetAllGroups())
|
||
o[group.GetSID().toString()] = group.IsGroupActive();
|
||
return o
|
||
}
|
||
_LoadGroupsFromJson(o) {
|
||
for (const [sidStr,data] of Object.entries(o)) {
|
||
const sid = parseInt(sidStr, 10);
|
||
const group = this.GetEventGroupBySID(sid);
|
||
if (group)
|
||
group.SetGroupActive(data)
|
||
}
|
||
}
|
||
_SaveCndsToJson() {
|
||
const o = {};
|
||
for (const [sid,cnd] of this._cndsBySid) {
|
||
const data = cnd._SaveToJson();
|
||
if (data)
|
||
o[sid.toString()] = data
|
||
}
|
||
return o
|
||
}
|
||
_LoadCndsFromJson(o) {
|
||
const map = new Map;
|
||
for (const [sidStr,data] of Object.entries(o))
|
||
map.set(parseInt(sidStr, 10), data);
|
||
for (const [sid,cnd] of this._cndsBySid)
|
||
cnd._LoadFromJson(map.get(sid) || null)
|
||
}
|
||
_SaveActsToJson() {
|
||
const o = {};
|
||
for (const [sid,act] of this._actsBySid) {
|
||
const data = act._SaveToJson();
|
||
if (data)
|
||
o[sid.toString()] = data
|
||
}
|
||
return o
|
||
}
|
||
_LoadActsFromJson(o) {
|
||
const map = new Map;
|
||
for (const [sidStr,data] of Object.entries(o))
|
||
map.set(parseInt(sidStr, 10), data);
|
||
for (const [sid,act] of this._actsBySid)
|
||
act._LoadFromJson(map.get(sid) || null)
|
||
}
|
||
_SaveVarsToJson() {
|
||
const o = {};
|
||
for (const [sid,eventVar] of this._eventVarsBySid)
|
||
if (!eventVar.IsConstant() && (eventVar.IsGlobal() || eventVar.IsStatic()))
|
||
o[sid.toString()] = eventVar.GetValue();
|
||
return o
|
||
}
|
||
_LoadVarsFromJson(o) {
|
||
for (const [sidStr,data] of Object.entries(o)) {
|
||
const sid = parseInt(sidStr, 10);
|
||
const eventVar = this.GetEventVariableBySID(sid);
|
||
if (eventVar)
|
||
eventVar.SetValue(data)
|
||
}
|
||
}
|
||
_SaveScheduledWaitsToJson() {
|
||
return this._scheduledWaits.filter(w=>!w.IsPromise()).map(w=>w._SaveToJson())
|
||
}
|
||
_LoadScheduledWaitsFromJson(arr) {
|
||
this.ClearAllScheduledWaits();
|
||
for (const data of arr) {
|
||
const sw = C3.ScheduledWait._CreateFromJson(this, data);
|
||
if (sw)
|
||
this._scheduledWaits.push(sw)
|
||
}
|
||
}
|
||
_GetPerfRecords() {
|
||
return [...this._runtime.GetLayoutManager().runningLayouts()].map(l=>l.GetEventSheet()).filter(eventSheet=>eventSheet).map(e=>e._GetPerfRecord())
|
||
}
|
||
FindFirstFunctionBlockParent(eventRow) {
|
||
while (eventRow) {
|
||
const scopeParent = eventRow.GetScopeParent();
|
||
if (scopeParent instanceof C3.FunctionBlock)
|
||
return scopeParent;
|
||
eventRow = eventRow.GetParent()
|
||
}
|
||
return null
|
||
}
|
||
_InvokeFunctionFromJS(name, params) {
|
||
if (!Array.isArray(params))
|
||
params = [];
|
||
const functionBlock = this.GetFunctionBlockByName(name.toLowerCase());
|
||
if (!functionBlock)
|
||
return null;
|
||
if (!functionBlock.IsEnabled())
|
||
return functionBlock.GetDefaultReturnValue();
|
||
const functionParameters = functionBlock.GetFunctionParameters();
|
||
if (params.length < functionParameters.length) {
|
||
params = params.slice(0);
|
||
do
|
||
params.push(functionParameters[params.length].GetInitialValue());
|
||
while (params.length < functionParameters.length)
|
||
}
|
||
const callEventBlock = functionBlock.GetEventBlock();
|
||
return callEventBlock.RunAsExpressionFunctionCall(callEventBlock.GetSolModifiersIncludingParents(), functionBlock.GetReturnType(), functionBlock.GetDefaultReturnValue(), ...params)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.EventSheet = class EventSheet extends C3.DefendedBase {
|
||
constructor(eventSheetManager, data) {
|
||
super();
|
||
this._eventSheetManager = eventSheetManager;
|
||
this._runtime = eventSheetManager.GetRuntime();
|
||
this._name = data[0];
|
||
this._events = [];
|
||
this._triggers = new Map;
|
||
this._fastTriggers = new Map;
|
||
this._eventsByDisplayNumber = new Map;
|
||
this._hasRun = false;
|
||
this._shallowIncludes = [];
|
||
this._deepIncludes = [];
|
||
this._alreadyIncludedSheets = new Set;
|
||
for (const eventData of data[1])
|
||
this._CreateEvent(eventData, null, this._events);
|
||
this._perfRecord = this._runtime.IsDebug() ? {
|
||
type: "sheet",
|
||
name: this._name,
|
||
totalTimeCounter: 0,
|
||
children: []
|
||
} : null
|
||
}
|
||
Release() {
|
||
this._eventSheetManager = null;
|
||
this._runtime = null
|
||
}
|
||
_CreateEvent(eventData, parent, nontriggers) {
|
||
switch (eventData[0]) {
|
||
case 0:
|
||
case 3:
|
||
this._CreateEventBlock(eventData, parent, nontriggers);
|
||
break;
|
||
case 1:
|
||
this._CreateEventVariable(eventData, parent, nontriggers);
|
||
break;
|
||
case 2:
|
||
this._CreateInclude(eventData, parent, nontriggers);
|
||
break;
|
||
case 4:
|
||
this._CreateFunctionBlock(eventData, parent);
|
||
break;
|
||
case 5:
|
||
this._CreateScriptBlock(eventData, parent, nontriggers);
|
||
break;
|
||
default:
|
||
throw new Error("invalid event type");
|
||
}
|
||
}
|
||
_CreateEventBlock(data, parent, nontriggers) {
|
||
const eventBlock = C3.EventBlock.Create(this, parent, data);
|
||
if (eventBlock.IsOrBlock()) {
|
||
nontriggers.push(eventBlock);
|
||
const conditions = eventBlock.GetConditions();
|
||
for (let i = 0, len = conditions.length; i < len; ++i)
|
||
if (conditions[i].IsTrigger())
|
||
this._InitTrigger(eventBlock, i)
|
||
} else if (eventBlock.IsTrigger())
|
||
this._InitTrigger(eventBlock, 0);
|
||
else
|
||
nontriggers.push(eventBlock)
|
||
}
|
||
_CreateFunctionBlock(data, parent) {
|
||
const functionBlock = C3.FunctionBlock.Create(this, parent, data);
|
||
this._eventSheetManager._RegisterFunctionBlock(functionBlock)
|
||
}
|
||
_CreateEventVariable(data, parent, nontriggers) {
|
||
const v = C3.EventVariable.Create(this, parent, data);
|
||
nontriggers.push(v)
|
||
}
|
||
_CreateInclude(data, parent, nontriggers) {
|
||
const include = C3.EventInclude.Create(this, parent, data);
|
||
nontriggers.push(include)
|
||
}
|
||
_CreateScriptBlock(data, parent, nontriggers) {
|
||
const scriptBlock = C3.EventScript.Create(this, parent, data);
|
||
nontriggers.push(scriptBlock)
|
||
}
|
||
_InitTrigger(eventBlock, i) {
|
||
if (!eventBlock.IsOrBlock())
|
||
this._eventSheetManager._AddTriggerToPostInit(eventBlock);
|
||
const cnd = eventBlock.GetConditionAt(i);
|
||
const func = cnd._GetFunc();
|
||
const objectClass = cnd.GetObjectClass();
|
||
if (cnd.IsFastTrigger()) {
|
||
let methodMap = this._fastTriggers.get(objectClass);
|
||
if (!methodMap) {
|
||
methodMap = new Map;
|
||
this._fastTriggers.set(objectClass, methodMap)
|
||
}
|
||
const value = cnd.GetFastTriggerValue().toLowerCase();
|
||
let valueMap = methodMap.get(func);
|
||
if (!valueMap) {
|
||
valueMap = new Map;
|
||
methodMap.set(func, valueMap)
|
||
}
|
||
let triggerArr = valueMap.get(value);
|
||
if (!triggerArr) {
|
||
triggerArr = [];
|
||
valueMap.set(value, triggerArr)
|
||
}
|
||
triggerArr.push([eventBlock, i])
|
||
} else {
|
||
let ocInfo = this._triggers.get(objectClass);
|
||
if (!ocInfo) {
|
||
ocInfo = {
|
||
methodMap: new Map,
|
||
behaviors: new Map
|
||
};
|
||
this._triggers.set(objectClass, ocInfo)
|
||
}
|
||
const behaviorType = cnd.GetBehaviorType();
|
||
let methodMap;
|
||
if (behaviorType) {
|
||
methodMap = ocInfo.behaviors.get(behaviorType);
|
||
if (!methodMap) {
|
||
methodMap = new Map;
|
||
ocInfo.behaviors.set(behaviorType, methodMap)
|
||
}
|
||
} else
|
||
methodMap = ocInfo.methodMap;
|
||
let triggerArr = methodMap.get(func);
|
||
if (!triggerArr) {
|
||
triggerArr = [];
|
||
methodMap.set(func, triggerArr)
|
||
}
|
||
triggerArr.push([eventBlock, i])
|
||
}
|
||
}
|
||
_PostInit() {
|
||
const events = this._events;
|
||
for (let i = 0, len = events.length; i < len; ++i) {
|
||
const hasElseBlock = i < len - 1 && events[i + 1]instanceof C3.EventBlock && events[i + 1].IsElseBlock();
|
||
events[i]._PostInit(hasElseBlock)
|
||
}
|
||
}
|
||
_AddShallowInclude(include) {
|
||
this._shallowIncludes.push(include)
|
||
}
|
||
_UpdateDeepIncludes() {
|
||
C3.clearArray(this._deepIncludes);
|
||
this._AddDeepIncludes(this);
|
||
this._alreadyIncludedSheets.clear()
|
||
}
|
||
_AddDeepIncludes(rootSheet) {
|
||
const deepIncludes = rootSheet._deepIncludes;
|
||
const alreadyIncludedSheets = rootSheet._alreadyIncludedSheets;
|
||
for (const include of this._shallowIncludes) {
|
||
const sheet = include.GetIncludeSheet();
|
||
if (!include.IsActive() || rootSheet === sheet || alreadyIncludedSheets.has(sheet))
|
||
continue;
|
||
alreadyIncludedSheets.add(sheet);
|
||
sheet._AddDeepIncludes(rootSheet);
|
||
deepIncludes.push(sheet)
|
||
}
|
||
}
|
||
deepIncludes() {
|
||
return this._deepIncludes
|
||
}
|
||
GetEventSheetManager() {
|
||
return this._eventSheetManager
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
_RegisterEventByDisplayNumber(eventBlock, displayNumber) {
|
||
this._eventsByDisplayNumber.set(displayNumber, eventBlock)
|
||
}
|
||
_GetEventByDisplayNumber(displayNumber) {
|
||
return this._eventsByDisplayNumber.get(displayNumber) || null
|
||
}
|
||
_ResetHasRunFlag() {
|
||
this._hasRun = false
|
||
}
|
||
Run() {
|
||
if (this._hasRun)
|
||
return;
|
||
const runtime = this._runtime;
|
||
const profile = runtime.IsCPUProfiling();
|
||
const startTime = profile ? performance.now() : 0;
|
||
this._hasRun = true;
|
||
const eventSheetManager = this.GetEventSheetManager();
|
||
const frame = eventSheetManager.GetCurrentEventStackFrame();
|
||
for (const e of this._events) {
|
||
e.Run(frame);
|
||
eventSheetManager.ClearSol(e.GetSolModifiers());
|
||
eventSheetManager.ClearAsyncActionPromises();
|
||
runtime.FlushPendingInstances()
|
||
}
|
||
frame.Reset(null);
|
||
if (profile)
|
||
this._perfRecord.totalTimeCounter += performance.now() - startTime
|
||
}
|
||
*DebugRun() {
|
||
if (this._hasRun)
|
||
return;
|
||
this._hasRun = true;
|
||
const runtime = this._runtime;
|
||
const eventSheetManager = this.GetEventSheetManager();
|
||
const frame = eventSheetManager.GetCurrentEventStackFrame();
|
||
for (const e of this._events) {
|
||
yield*e.DebugRun(frame);
|
||
eventSheetManager.ClearSol(e.GetSolModifiers());
|
||
eventSheetManager.ClearAsyncActionPromises();
|
||
runtime.FlushPendingInstances()
|
||
}
|
||
frame.Reset(null)
|
||
}
|
||
_Trigger(method, inst, behaviorType) {
|
||
if (inst) {
|
||
const objectClass = inst.GetObjectClass();
|
||
let ret = false;
|
||
let r = this._TriggerForClass(method, inst, objectClass, behaviorType);
|
||
ret = ret || r;
|
||
for (const family of objectClass.GetFamilies()) {
|
||
r = this._TriggerForClass(method, inst, family, behaviorType);
|
||
ret = ret || r
|
||
}
|
||
} else
|
||
return this._TriggerForClass(method, inst, null, null)
|
||
}
|
||
_TriggerForClass(method, inst, objectClass, behaviorType) {
|
||
const ocInfo = this._triggers.get(objectClass);
|
||
if (!ocInfo)
|
||
return false;
|
||
const methodMap = behaviorType ? ocInfo.behaviors.get(behaviorType) : ocInfo.methodMap;
|
||
if (!methodMap)
|
||
return false;
|
||
const triggerList = methodMap.get(method);
|
||
if (!triggerList)
|
||
return false;
|
||
let ret = false;
|
||
for (const [trigger,index] of triggerList) {
|
||
const r = this._ExecuteTrigger(inst, trigger, index);
|
||
ret = ret || r
|
||
}
|
||
return ret
|
||
}
|
||
*_DebugTrigger(method, inst, behaviorType) {
|
||
if (inst) {
|
||
const objectClass = inst.GetObjectClass();
|
||
let ret = false;
|
||
let r = yield*this._DebugTriggerForClass(method, inst, objectClass, behaviorType);
|
||
ret = ret || r;
|
||
for (const family of objectClass.GetFamilies()) {
|
||
r = yield*this._DebugTriggerForClass(method, inst, family, behaviorType);
|
||
ret = ret || r
|
||
}
|
||
} else
|
||
return yield*this._DebugTriggerForClass(method, inst, null, null)
|
||
}
|
||
*_DebugTriggerForClass(method, inst, objectClass, behaviorType) {
|
||
const ocInfo = this._triggers.get(objectClass);
|
||
if (!ocInfo)
|
||
return false;
|
||
const methodMap = behaviorType ? ocInfo.behaviors.get(behaviorType) : ocInfo.methodMap;
|
||
if (!methodMap)
|
||
return false;
|
||
const triggerList = methodMap.get(method);
|
||
if (!triggerList)
|
||
return false;
|
||
let ret = false;
|
||
for (const [trigger,index] of triggerList) {
|
||
let r;
|
||
if (trigger.DebugCanRunFast())
|
||
r = this._ExecuteTrigger(inst, trigger, index);
|
||
else
|
||
r = yield*this._DebugExecuteTrigger(inst, trigger, index);
|
||
ret = ret || r
|
||
}
|
||
return ret
|
||
}
|
||
_FastTrigger(method, inst, value) {
|
||
const objectClass = inst.GetObjectClass();
|
||
const methodMap = this._fastTriggers.get(objectClass);
|
||
if (!methodMap)
|
||
return false;
|
||
const valueMap = methodMap.get(method);
|
||
if (!valueMap)
|
||
return false;
|
||
const triggerList = valueMap.get(value);
|
||
if (!triggerList)
|
||
return false;
|
||
let ret = false;
|
||
for (let i = 0, len = triggerList.length; i < len; ++i) {
|
||
const t = triggerList[i];
|
||
const r = this._ExecuteTrigger(null, t[0], t[1]);
|
||
ret = ret || r
|
||
}
|
||
return ret
|
||
}
|
||
*_DebugFastTrigger(method, inst, value) {
|
||
const objectClass = inst.GetObjectClass();
|
||
const methodMap = this._fastTriggers.get(objectClass);
|
||
if (!methodMap)
|
||
return false;
|
||
const valueMap = methodMap.get(method);
|
||
if (!valueMap)
|
||
return false;
|
||
const triggerList = valueMap.get(value);
|
||
if (!triggerList)
|
||
return false;
|
||
let ret = false;
|
||
for (let i = 0, len = triggerList.length; i < len; ++i) {
|
||
const t = triggerList[i];
|
||
const trigger = t[0];
|
||
const index = t[1];
|
||
let r;
|
||
if (trigger.DebugCanRunFast())
|
||
r = this._ExecuteTrigger(null, trigger, index);
|
||
else
|
||
r = yield*this._DebugExecuteTrigger(null, trigger, index);
|
||
ret = ret || r
|
||
}
|
||
return ret
|
||
}
|
||
_ExecuteTrigger(inst, trigger, index) {
|
||
const runtime = this._runtime;
|
||
const eventSheetManager = this._eventSheetManager;
|
||
const currentEvent = eventSheetManager.GetCurrentEvent();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const triggerDepth = eventSheetManager.GetTriggerDepth();
|
||
let ret = false;
|
||
if (currentEvent)
|
||
eventSheetManager.PushCleanSol(currentEvent.GetSolModifiersIncludingParents());
|
||
eventSheetManager.PushCleanSol(trigger.GetSolModifiersIncludingParents());
|
||
const isRecursive = triggerDepth > 1;
|
||
if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Push();
|
||
const frame = eventStack.Push(trigger);
|
||
if (inst) {
|
||
const objectClass = trigger.GetConditions()[index].GetObjectClass();
|
||
const sol = objectClass.GetCurrentSol();
|
||
sol.SetSinglePicked(inst);
|
||
if (inst.IsInContainer())
|
||
inst.SetSiblingsSinglePicked()
|
||
}
|
||
let okToRun = true;
|
||
if (trigger.GetParent()) {
|
||
const parents = trigger.GetTriggerParents();
|
||
for (let i = 0, len = parents.length; i < len; ++i)
|
||
if (!parents[i].RunPreTrigger(frame)) {
|
||
okToRun = false;
|
||
break
|
||
}
|
||
}
|
||
if (okToRun) {
|
||
runtime.IncrementExecCount();
|
||
if (trigger.IsOrBlock())
|
||
trigger.RunOrBlockTrigger(frame, index);
|
||
else
|
||
trigger.Run(frame);
|
||
ret = frame.GetLastEventTrue()
|
||
}
|
||
eventStack.Pop();
|
||
if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Pop();
|
||
eventSheetManager.PopSol(trigger.GetSolModifiersIncludingParents());
|
||
if (currentEvent)
|
||
eventSheetManager.PopSol(currentEvent.GetSolModifiersIncludingParents());
|
||
if (!currentEvent && triggerDepth === 1 && !eventSheetManager.IsFlushingBlocked())
|
||
runtime.FlushPendingInstances();
|
||
return ret
|
||
}
|
||
*_DebugExecuteTrigger(inst, trigger, index) {
|
||
const runtime = this._runtime;
|
||
const eventSheetManager = this._eventSheetManager;
|
||
const currentEvent = eventSheetManager.GetCurrentEvent();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const triggerDepth = eventSheetManager.GetTriggerDepth();
|
||
let ret = false;
|
||
if (currentEvent)
|
||
eventSheetManager.PushCleanSol(currentEvent.GetSolModifiersIncludingParents());
|
||
eventSheetManager.PushCleanSol(trigger.GetSolModifiersIncludingParents());
|
||
const isRecursive = triggerDepth > 1;
|
||
if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Push();
|
||
const frame = eventStack.Push(trigger);
|
||
if (inst) {
|
||
const objectClass = trigger.GetConditions()[index].GetObjectClass();
|
||
const sol = objectClass.GetCurrentSol();
|
||
sol.SetSinglePicked(inst);
|
||
if (inst.IsInContainer())
|
||
inst.SetSiblingsSinglePicked()
|
||
}
|
||
let okToRun = true;
|
||
if (trigger.GetParent()) {
|
||
const parents = trigger.GetTriggerParents();
|
||
for (let i = 0, len = parents.length; i < len; ++i)
|
||
if (!(yield*parents[i].DebugRunPreTrigger(frame))) {
|
||
okToRun = false;
|
||
break
|
||
}
|
||
}
|
||
if (okToRun) {
|
||
runtime.IncrementExecCount();
|
||
if (trigger.IsOrBlock())
|
||
yield*trigger.DebugRunOrBlockTrigger(frame, index);
|
||
else
|
||
yield*trigger.DebugRun(frame);
|
||
ret = frame.GetLastEventTrue()
|
||
}
|
||
eventStack.Pop();
|
||
if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Pop();
|
||
eventSheetManager.PopSol(trigger.GetSolModifiersIncludingParents());
|
||
if (currentEvent)
|
||
eventSheetManager.PopSol(currentEvent.GetSolModifiersIncludingParents());
|
||
if (!currentEvent && triggerDepth === 1 && !eventSheetManager.IsFlushingBlocked())
|
||
runtime.FlushPendingInstances();
|
||
return ret
|
||
}
|
||
_GetPerfRecord() {
|
||
return this._perfRecord
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const EMPTY_ARRAY = [];
|
||
function NoActions(frame, index) {
|
||
return true
|
||
}
|
||
function *DebugNoActions(frame, index) {
|
||
return true
|
||
}
|
||
C3.EventBlock = class EventBlock extends C3.DefendedBase {
|
||
constructor(eventSheet, parent, data) {
|
||
super();
|
||
this._eventSheet = eventSheet;
|
||
this._runtime = eventSheet.GetRuntime();
|
||
this._parent = parent;
|
||
this._scopeParent = null;
|
||
this._eventStack = this._runtime.GetEventSheetManager().GetEventStack();
|
||
this._solModifiers = [];
|
||
this._solModifiersIncludingParents = [];
|
||
this._hasGotSolModifiersIncludingParents = false;
|
||
this._isSolWriterAfterCnds = false;
|
||
this._isTopLevelGroup = false;
|
||
this._hasElseBlock = false;
|
||
this._isOrBlock = !!data[2];
|
||
this._isElseBlock = false;
|
||
this._triggerParents = null;
|
||
this._conditions = [];
|
||
this._actions = [];
|
||
this._subEvents = [];
|
||
this._RunActions = NoActions;
|
||
this._DebugRunActions = DebugNoActions;
|
||
this._isGroup = false;
|
||
this._isInitiallyActive = false;
|
||
this._groupName = "";
|
||
this._isGroupActive = false;
|
||
this._containedIncludes = null;
|
||
this._perfRecord = null;
|
||
this._sid = data[4];
|
||
this._displayNumber = data[5];
|
||
this._eventSheet._RegisterEventByDisplayNumber(this, this._displayNumber);
|
||
this._debugData = this._runtime.IsDebug() ? {
|
||
isBreakpoint: data[3][0],
|
||
isBreakable: data[3][1],
|
||
canRunAllConditionsFast: false,
|
||
canRunAllActionsFast: false,
|
||
canRunAllSubEventsFast: false,
|
||
canRunSelfFast: false
|
||
} : null;
|
||
this.GetEventSheetManager()._RegisterEventBlock(this);
|
||
if (data[0] === 3)
|
||
this._InitGroup(data[1]);
|
||
let index = 0;
|
||
for (const cndData of data[6]) {
|
||
const condition = C3.Condition.Create(this, cndData, index++);
|
||
this._conditions.push(condition);
|
||
this._AddSolModifier(condition.GetObjectClass())
|
||
}
|
||
index = 0;
|
||
for (const actData of data[7]) {
|
||
const action = C3.Action.Create(this, actData, index++);
|
||
this._actions.push(action)
|
||
}
|
||
if (data.length === 9) {
|
||
const subEventsData = data[8];
|
||
for (const eventData of subEventsData)
|
||
this._eventSheet._CreateEvent(eventData, this, this._subEvents)
|
||
}
|
||
if (this._conditions.length)
|
||
this._isElseBlock = this._conditions[0].GetObjectClass() === null && this._conditions[0]._GetFunc() === C3.Plugins.System.Cnds.Else;
|
||
if (this._conditions.length === 0)
|
||
this._conditions = EMPTY_ARRAY;
|
||
if (this._actions.length === 0)
|
||
this._actions = EMPTY_ARRAY;
|
||
if (this._subEvents.length === 0)
|
||
this._subEvents = EMPTY_ARRAY
|
||
}
|
||
static Create(eventSheet, parent, data) {
|
||
return C3.New(C3.EventBlock, eventSheet, parent, data)
|
||
}
|
||
_InitGroup(groupData) {
|
||
this._isGroup = true;
|
||
this._isInitiallyActive = !!groupData[0];
|
||
this._isGroupActive = this._isInitiallyActive;
|
||
this._groupName = groupData[1].toLowerCase();
|
||
this._containedIncludes = [];
|
||
this.GetEventSheetManager()._RegisterGroup(this);
|
||
if (this._runtime.IsDebug())
|
||
this._perfRecord = {
|
||
type: "group",
|
||
name: groupData[1],
|
||
totalTimeCounter: 0,
|
||
children: []
|
||
}
|
||
}
|
||
_AddContainedInclude(include) {
|
||
this._containedIncludes.push(include)
|
||
}
|
||
_AddContainerSolModifierToList(objectClass, arr) {
|
||
for (const containerType of objectClass.GetContainer().objectTypes())
|
||
if (!arr.includes(containerType))
|
||
arr.push(containerType)
|
||
}
|
||
_AddSolModifierToList(objectClass, arr) {
|
||
if (!objectClass)
|
||
return;
|
||
if (!arr.includes(objectClass))
|
||
arr.push(objectClass);
|
||
if (objectClass.IsFamily())
|
||
for (const familyMember of objectClass.GetFamilyMembers()) {
|
||
if (familyMember.IsInContainer())
|
||
this._AddContainerSolModifierToList(familyMember, arr)
|
||
}
|
||
else if (objectClass.IsInContainer())
|
||
this._AddContainerSolModifierToList(objectClass, arr)
|
||
}
|
||
_AddSolModifier(objectClass) {
|
||
this._AddSolModifierToList(objectClass, this._solModifiers)
|
||
}
|
||
_AddParentSolModifier(objectClass) {
|
||
this._AddSolModifierToList(objectClass, this._solModifiersIncludingParents)
|
||
}
|
||
SetAllSolModifiers() {
|
||
this._solModifiers = this._runtime.GetAllObjectClasses()
|
||
}
|
||
_PostInit(hasElse) {
|
||
this._hasElseBlock = !!hasElse;
|
||
this._IdentifyTopLevelGroup();
|
||
this._IdentifyTriggerParents();
|
||
for (const c of this._conditions)
|
||
c._PostInit();
|
||
if (this._actions.length > 0) {
|
||
let hasAnyActionWithReturnType = false;
|
||
for (const a of this._actions) {
|
||
a._PostInit();
|
||
if (a.HasReturnType())
|
||
hasAnyActionWithReturnType = true
|
||
}
|
||
if (hasAnyActionWithReturnType) {
|
||
this._RunActions = this._RunActions_ReturnValue;
|
||
this._DebugRunActions = this._DebugRunActions_ReturnValue
|
||
} else {
|
||
this._RunActions = this._RunActions_Fast;
|
||
this._DebugRunActions = this._DebugRunActions_Fast
|
||
}
|
||
}
|
||
const subEvents = this._subEvents;
|
||
for (let i = 0, len = subEvents.length; i < len; ++i) {
|
||
const hasElseBlock = i < len - 1 && subEvents[i + 1]instanceof C3.EventBlock && subEvents[i + 1].IsElseBlock();
|
||
subEvents[i]._PostInit(hasElseBlock)
|
||
}
|
||
if (this._debugData)
|
||
this._UpdateCanRunFast();
|
||
if (this._perfRecord)
|
||
this._GetPerfRecordParent()._GetPerfRecord().children.push(this._perfRecord)
|
||
}
|
||
_GetPerfRecord() {
|
||
return this._perfRecord
|
||
}
|
||
_GetPerfRecordParent() {
|
||
let p = this.GetParent();
|
||
while (p) {
|
||
if (p.IsGroup())
|
||
return p;
|
||
p = p.GetParent()
|
||
}
|
||
return this._eventSheet
|
||
}
|
||
_UpdateCanRunFast() {
|
||
const dd = this._debugData;
|
||
dd.canRunAllConditionsFast = this._conditions.every(c=>c.DebugCanRunFast());
|
||
dd.canRunAllActionsFast = this._actions.every(a=>a.DebugCanRunFast());
|
||
dd.canRunAllSubEventsFast = this._subEvents.every(s=>s.DebugCanRunFast());
|
||
dd.canRunSelfFast = dd.canRunAllConditionsFast && dd.canRunAllActionsFast && dd.canRunAllSubEventsFast
|
||
}
|
||
_UpdateCanRunFastRecursive() {
|
||
let e = this;
|
||
do {
|
||
e._UpdateCanRunFast();
|
||
e = e.GetParent()
|
||
} while (e)
|
||
}
|
||
_IdentifyTopLevelGroup() {
|
||
if (!this.IsGroup())
|
||
return;
|
||
let p = this.GetParent();
|
||
this._isTopLevelGroup = true;
|
||
while (p) {
|
||
if (!p.IsGroup()) {
|
||
this._isTopLevelGroup = false;
|
||
break
|
||
}
|
||
p = p.GetParent()
|
||
}
|
||
}
|
||
_IdentifySolModifiersIncludingParents() {
|
||
const allObjectClasses = this._runtime.GetAllObjectClasses();
|
||
if (this._solModifiers === allObjectClasses)
|
||
this._solModifiersIncludingParents = allObjectClasses;
|
||
else {
|
||
this._solModifiersIncludingParents = C3.cloneArray(this._solModifiers);
|
||
let p = this.GetParent();
|
||
while (p) {
|
||
for (const o of p._solModifiers)
|
||
this._AddParentSolModifier(o);
|
||
p = p.GetParent()
|
||
}
|
||
const eventSheetManager = this.GetEventSheetManager();
|
||
this._solModifiers = eventSheetManager._DeduplicateSolModifierList(this._solModifiers);
|
||
this._solModifiersIncludingParents = eventSheetManager._DeduplicateSolModifierList(this._solModifiersIncludingParents)
|
||
}
|
||
}
|
||
_IdentifyTriggerParents() {
|
||
if (!this.HasAnyTriggeredCondition())
|
||
return;
|
||
this._triggerParents = [];
|
||
let p = this.GetParent();
|
||
while (p) {
|
||
this._triggerParents.push(p);
|
||
p = p.GetParent()
|
||
}
|
||
this._triggerParents.reverse()
|
||
}
|
||
SetSolWriterAfterCnds() {
|
||
this._isSolWriterAfterCnds = true;
|
||
if (this._parent)
|
||
this._parent.SetSolWriterAfterCnds()
|
||
}
|
||
IsSolWriterAfterCnds() {
|
||
return this._isSolWriterAfterCnds
|
||
}
|
||
GetSolModifiers() {
|
||
return this._solModifiers
|
||
}
|
||
GetSolModifiersIncludingParents() {
|
||
if (!this._hasGotSolModifiersIncludingParents) {
|
||
this._hasGotSolModifiersIncludingParents = true;
|
||
this._IdentifySolModifiersIncludingParents()
|
||
}
|
||
return this._solModifiersIncludingParents
|
||
}
|
||
HasSolModifier(objectClass) {
|
||
return this._solModifiers.includes(objectClass)
|
||
}
|
||
GetTriggerParents() {
|
||
return this._triggerParents
|
||
}
|
||
GetEventSheet() {
|
||
return this._eventSheet
|
||
}
|
||
GetEventSheetManager() {
|
||
return this._eventSheet.GetEventSheetManager()
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetParent() {
|
||
return this._parent
|
||
}
|
||
_SetScopeParent(p) {
|
||
this._scopeParent = p
|
||
}
|
||
GetScopeParent() {
|
||
return this._scopeParent || this._parent
|
||
}
|
||
GetDisplayNumber() {
|
||
return this._displayNumber
|
||
}
|
||
IsDebugBreakable() {
|
||
return this._debugData && this._debugData.isBreakable
|
||
}
|
||
IsDebugBreakpoint() {
|
||
return this.IsDebugBreakable() && this._debugData.isBreakpoint
|
||
}
|
||
_SetDebugBreakpoint(b) {
|
||
this._debugData.isBreakpoint = !!b;
|
||
this._UpdateCanRunFastRecursive()
|
||
}
|
||
IsGroup() {
|
||
return this._isGroup
|
||
}
|
||
IsTopLevelGroup() {
|
||
return this._isTopLevelGroup
|
||
}
|
||
IsElseBlock() {
|
||
return this._isElseBlock
|
||
}
|
||
HasElseBlock() {
|
||
return this._hasElseBlock
|
||
}
|
||
GetGroupName() {
|
||
return this._groupName
|
||
}
|
||
IsGroupActive() {
|
||
return this._isGroupActive
|
||
}
|
||
ResetInitialActivation() {
|
||
this.SetGroupActive(this._isInitiallyActive)
|
||
}
|
||
SetGroupActive(a) {
|
||
a = !!a;
|
||
if (!this._isGroup)
|
||
throw new Error("not a group");
|
||
if (this._isGroupActive === a)
|
||
return;
|
||
this._isGroupActive = a;
|
||
for (const include of this._containedIncludes)
|
||
include.UpdateActive();
|
||
if (this._containedIncludes.length) {
|
||
const currentLayout = this._runtime.GetCurrentLayout();
|
||
const mainEventSheet = currentLayout.GetEventSheet();
|
||
if (mainEventSheet)
|
||
mainEventSheet._UpdateDeepIncludes()
|
||
}
|
||
}
|
||
GetSID() {
|
||
return this._sid
|
||
}
|
||
IsOrBlock() {
|
||
return this._isOrBlock
|
||
}
|
||
IsTrigger() {
|
||
return this._conditions.length && this._conditions[0].IsTrigger()
|
||
}
|
||
IsForFunctionBlock() {
|
||
return this._scopeParent && this._scopeParent instanceof C3.FunctionBlock
|
||
}
|
||
HasAnyTriggeredCondition() {
|
||
return this.IsForFunctionBlock() || this._conditions.some(c=>c.IsTrigger())
|
||
}
|
||
GetConditions() {
|
||
return this._conditions
|
||
}
|
||
GetConditionCount() {
|
||
return this._conditions.length
|
||
}
|
||
GetConditionAt(i) {
|
||
i = Math.floor(i);
|
||
if (i < 0 || i >= this._conditions.length)
|
||
throw new RangeError("invalid condition index");
|
||
return this._conditions[i]
|
||
}
|
||
GetConditionByDebugIndex(i) {
|
||
return this.GetConditionAt(i)
|
||
}
|
||
IsFirstConditionOfType(cnd) {
|
||
let i = cnd.GetIndex();
|
||
if (i === 0)
|
||
return true;
|
||
--i;
|
||
for (; i >= 0; --i)
|
||
if (this._conditions[i].GetObjectClass() === cnd.GetObjectClass())
|
||
return false;
|
||
return true
|
||
}
|
||
GetActions() {
|
||
return this._actions
|
||
}
|
||
GetActionCount() {
|
||
return this._actions.length
|
||
}
|
||
GetActionAt(i) {
|
||
i = Math.floor(i);
|
||
if (i < 0 || i >= this._actions.length)
|
||
throw new RangeError("invalid action index");
|
||
return this._actions[i]
|
||
}
|
||
GetActionByDebugIndex(i) {
|
||
i = Math.floor(i);
|
||
const ret = this._actions.find(a=>a.GetDebugIndex() === i);
|
||
if (!ret)
|
||
throw new RangeError("invalid action debug index");
|
||
return ret
|
||
}
|
||
_HasActionIndex(i) {
|
||
i = Math.floor(i);
|
||
return i >= 0 && i < this._actions.length
|
||
}
|
||
GetSubEvents() {
|
||
return this._subEvents
|
||
}
|
||
_GetAllLocalVariablesInScope() {
|
||
return this._subEvents.filter(e=>e instanceof C3.EventVariable)
|
||
}
|
||
RunPreTrigger(frame) {
|
||
frame.SetCurrentEvent(this);
|
||
let isAnyTrue = false;
|
||
const conditions = this._conditions;
|
||
for (let i = 0, len = conditions.length; i < len; ++i) {
|
||
const c = conditions[i];
|
||
frame.SetConditionIndex(i);
|
||
if (c.IsLooping())
|
||
throw new Error("trigger cannot be used as sub-event to a loop");
|
||
if (c.Run())
|
||
isAnyTrue = true;
|
||
else if (!this._isOrBlock)
|
||
return false
|
||
}
|
||
return this._isOrBlock ? isAnyTrue : true
|
||
}
|
||
RunOrBlockTrigger(frame, index) {
|
||
frame.SetCurrentEvent(this);
|
||
if (this._conditions[index].Run()) {
|
||
if (this._RunActions(frame, 0))
|
||
this._RunSubEvents(frame);
|
||
frame.SetLastEventTrue(true)
|
||
}
|
||
}
|
||
*DebugRunPreTrigger(frame) {
|
||
frame.SetCurrentEvent(this);
|
||
let isAnyTrue = false;
|
||
const conditions = this._conditions;
|
||
for (let i = 0, len = conditions.length; i < len; ++i) {
|
||
const c = conditions[i];
|
||
frame.SetConditionIndex(i);
|
||
if (c.IsLooping())
|
||
throw new Error("trigger cannot be used as sub-event to a loop");
|
||
let ret;
|
||
if (c.DebugCanRunFast())
|
||
ret = c.Run();
|
||
else
|
||
ret = yield*c.DebugRun();
|
||
if (ret)
|
||
isAnyTrue = true;
|
||
else if (!this._isOrBlock)
|
||
return false
|
||
}
|
||
return this._isOrBlock ? isAnyTrue : true
|
||
}
|
||
*DebugRunOrBlockTrigger(frame, index) {
|
||
frame.SetCurrentEvent(this);
|
||
const c = this._conditions[index];
|
||
let ret;
|
||
if (c.DebugCanRunFast())
|
||
ret = c.Run();
|
||
else
|
||
ret = yield*c.DebugRun();
|
||
if (ret) {
|
||
let actRet;
|
||
if (this.DebugCanRunActionsFast())
|
||
actRet = this._RunActions(frame, 0);
|
||
else
|
||
actRet = yield*this._DebugRunActions(frame, 0);
|
||
if (actRet)
|
||
if (this.DebugCanRunSubEventsFast())
|
||
this._RunSubEvents();
|
||
else
|
||
yield*this._DebugRunSubEvents();
|
||
frame.SetLastEventTrue(true)
|
||
}
|
||
}
|
||
Run(frame) {
|
||
frame.SetCurrentEvent(this);
|
||
if (!this._isElseBlock)
|
||
frame.SetElseBranchRan(false);
|
||
if (this._isOrBlock)
|
||
this._RunOrBlock(frame);
|
||
else
|
||
this._RunAndBlock(frame)
|
||
}
|
||
*DebugRun(frame) {
|
||
if (this.IsDebugBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
frame.SetCurrentEvent(this);
|
||
if (!this._isElseBlock)
|
||
frame.SetElseBranchRan(false);
|
||
if (this._isOrBlock)
|
||
yield*this._DebugRunOrBlock(frame);
|
||
else
|
||
yield*this._DebugRunAndBlock(frame)
|
||
}
|
||
_RunOrBlock(frame) {
|
||
const conditions = this._conditions;
|
||
let isAnyTrue = conditions.length === 0;
|
||
for (let i = 0, len = conditions.length; i < len; ++i) {
|
||
const c = conditions[i];
|
||
if (c.IsTrigger())
|
||
continue;
|
||
frame.SetConditionIndex(i);
|
||
const result = c.Run();
|
||
isAnyTrue = isAnyTrue || result
|
||
}
|
||
frame.SetLastEventTrue(isAnyTrue);
|
||
if (isAnyTrue) {
|
||
if (this._RunActions(frame, 0))
|
||
this._RunSubEvents(frame);
|
||
if (this._hasElseBlock)
|
||
frame.SetElseBranchRan(true)
|
||
}
|
||
}
|
||
*_DebugRunOrBlock(frame) {
|
||
const conditions = this._conditions;
|
||
let isAnyTrue = conditions.length === 0;
|
||
for (let i = 0, len = conditions.length; i < len; ++i) {
|
||
const c = conditions[i];
|
||
if (c.IsTrigger())
|
||
continue;
|
||
frame.SetConditionIndex(i);
|
||
let ret;
|
||
if (c.DebugCanRunFast())
|
||
ret = c.Run();
|
||
else
|
||
ret = yield*c.DebugRun();
|
||
isAnyTrue = isAnyTrue || ret
|
||
}
|
||
frame.SetLastEventTrue(isAnyTrue);
|
||
if (isAnyTrue) {
|
||
let actRet;
|
||
if (this.DebugCanRunActionsFast())
|
||
actRet = this._RunActions(frame, 0);
|
||
else
|
||
actRet = yield*this._DebugRunActions(frame, 0);
|
||
if (actRet)
|
||
if (this.DebugCanRunSubEventsFast())
|
||
this._RunSubEvents();
|
||
else
|
||
yield*this._DebugRunSubEvents();
|
||
if (this._hasElseBlock)
|
||
frame.SetElseBranchRan(true)
|
||
}
|
||
}
|
||
_RunAndBlock(frame) {
|
||
const conditions = this._conditions;
|
||
for (let i = 0, len = conditions.length; i < len; ++i) {
|
||
const c = conditions[i];
|
||
frame.SetConditionIndex(i);
|
||
const result = c.Run();
|
||
if (!result) {
|
||
frame.SetLastEventTrue(false);
|
||
return
|
||
}
|
||
}
|
||
frame.SetLastEventTrue(true);
|
||
if (this._RunActions(frame, 0))
|
||
this._RunSubEvents(frame);
|
||
if (frame.GetLastEventTrue() && this._hasElseBlock)
|
||
frame.SetElseBranchRan(true)
|
||
}
|
||
*_DebugRunAndBlock(frame) {
|
||
const conditions = this._conditions;
|
||
for (let i = 0, len = conditions.length; i < len; ++i) {
|
||
const c = conditions[i];
|
||
frame.SetConditionIndex(i);
|
||
let ret;
|
||
if (c.DebugCanRunFast())
|
||
ret = c.Run();
|
||
else
|
||
ret = yield*c.DebugRun();
|
||
if (!ret) {
|
||
frame.SetLastEventTrue(false);
|
||
return
|
||
}
|
||
}
|
||
frame.SetLastEventTrue(true);
|
||
let actRet;
|
||
if (this.DebugCanRunActionsFast())
|
||
actRet = this._RunActions(frame, 0);
|
||
else
|
||
actRet = yield*this._DebugRunActions(frame, 0);
|
||
if (actRet)
|
||
if (this.DebugCanRunSubEventsFast())
|
||
this._RunSubEvents();
|
||
else
|
||
yield*this._DebugRunSubEvents();
|
||
if (frame.GetLastEventTrue() && this._hasElseBlock)
|
||
frame.SetElseBranchRan(true)
|
||
}
|
||
_RunActions_Fast(frame, startIndex) {
|
||
const actions = this._actions;
|
||
for (let i = startIndex, len = actions.length; i < len; ++i) {
|
||
const a = actions[i];
|
||
frame.SetActionIndex(i);
|
||
a.Run()
|
||
}
|
||
return true
|
||
}
|
||
*_DebugRunActions_Fast(frame, startIndex) {
|
||
const actions = this._actions;
|
||
for (let i = startIndex, len = actions.length; i < len; ++i) {
|
||
const a = actions[i];
|
||
frame.SetActionIndex(i);
|
||
if (a.DebugCanRunFast())
|
||
a.Run();
|
||
else
|
||
yield*a.DebugRun()
|
||
}
|
||
return true
|
||
}
|
||
_RunActions_ReturnValue(frame, startIndex) {
|
||
const eventSheetManager = this.GetEventSheetManager();
|
||
const actions = this._actions;
|
||
for (let i = startIndex, len = actions.length; i < len; ++i) {
|
||
const a = actions[i];
|
||
frame.SetActionIndex(i);
|
||
const ret = a.Run();
|
||
if (a.CanBailOut() && ret === true)
|
||
return false;
|
||
else if (a.IsAsync() && ret instanceof Promise)
|
||
eventSheetManager.AddAsyncActionPromise(ret)
|
||
}
|
||
return true
|
||
}
|
||
*_DebugRunActions_ReturnValue(frame, startIndex) {
|
||
const eventSheetManager = this.GetEventSheetManager();
|
||
const actions = this._actions;
|
||
for (let i = startIndex, len = actions.length; i < len; ++i) {
|
||
const a = actions[i];
|
||
frame.SetActionIndex(i);
|
||
let ret;
|
||
if (a.DebugCanRunFast())
|
||
ret = a.Run();
|
||
else
|
||
ret = yield*a.DebugRun();
|
||
if (a.CanBailOut() && ret === true)
|
||
return false;
|
||
else if (a.IsAsync() && ret instanceof Promise)
|
||
eventSheetManager.AddAsyncActionPromise(ret)
|
||
}
|
||
return true
|
||
}
|
||
_ResumeActionsAndSubEvents(frame) {
|
||
if (this._RunActions(frame, frame.GetActionIndex()))
|
||
this._RunSubEvents()
|
||
}
|
||
*_DebugResumeActionsAndSubEvents(frame) {
|
||
if (yield*this._DebugRunActions(frame, frame.GetActionIndex()))
|
||
yield*this._DebugRunSubEvents()
|
||
}
|
||
_RunSubEvents() {
|
||
if (!this._subEvents.length)
|
||
return;
|
||
const profile = this.IsGroup() && this._runtime.IsCPUProfiling();
|
||
const startTime = profile ? performance.now() : 0;
|
||
const eventStack = this._eventStack;
|
||
const frame = eventStack.Push(this);
|
||
if (this._isSolWriterAfterCnds)
|
||
this._RunSubEvents_SolWriterAfterCnds(frame);
|
||
else
|
||
this._RunSubEvents_Fast(frame);
|
||
eventStack.Pop();
|
||
if (profile)
|
||
this._perfRecord.totalTimeCounter += performance.now() - startTime
|
||
}
|
||
_RunSubEvents_SolWriterAfterCnds(frame) {
|
||
const isGroup = this._isGroup;
|
||
const isTopLevelGroup = this._isTopLevelGroup;
|
||
const eventSheetManager = this.GetEventSheetManager();
|
||
const subEvents = this._subEvents;
|
||
for (let i = 0, len = subEvents.length, last = len - 1; i < len; ++i) {
|
||
const e = subEvents[i];
|
||
const solModifiers = e.GetSolModifiers();
|
||
const copySol = !isTopLevelGroup || !isGroup && i < last;
|
||
if (copySol)
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
e.Run(frame);
|
||
if (copySol)
|
||
eventSheetManager.PopSol(solModifiers);
|
||
else
|
||
eventSheetManager.ClearSol(solModifiers)
|
||
}
|
||
}
|
||
_RunSubEvents_Fast(frame) {
|
||
const subEvents = this._subEvents;
|
||
for (let i = 0, len = subEvents.length; i < len; ++i)
|
||
subEvents[i].Run(frame)
|
||
}
|
||
*_DebugRunSubEvents() {
|
||
if (!this._subEvents.length)
|
||
return;
|
||
const eventStack = this._eventStack;
|
||
const frame = eventStack.Push(this);
|
||
if (this._isSolWriterAfterCnds)
|
||
yield*this._DebugRunSubEvents_SolWriterAfterCnds(frame);
|
||
else
|
||
yield*this._DebugRunSubEvents_Fast(frame);
|
||
eventStack.Pop()
|
||
}
|
||
*_DebugRunSubEvents_SolWriterAfterCnds(frame) {
|
||
const isGroup = this._isGroup;
|
||
const isTopLevelGroup = this._isTopLevelGroup;
|
||
const eventSheetManager = this.GetEventSheetManager();
|
||
const subEvents = this._subEvents;
|
||
for (let i = 0, len = subEvents.length, last = len - 1; i < len; ++i) {
|
||
const e = subEvents[i];
|
||
const solModifiers = e.GetSolModifiers();
|
||
const copySol = !isTopLevelGroup || !isGroup && i < last;
|
||
if (copySol)
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
yield*e.DebugRun(frame);
|
||
if (copySol)
|
||
eventSheetManager.PopSol(solModifiers);
|
||
else
|
||
eventSheetManager.ClearSol(solModifiers)
|
||
}
|
||
}
|
||
*_DebugRunSubEvents_Fast(frame) {
|
||
const subEvents = this._subEvents;
|
||
for (let i = 0, len = subEvents.length; i < len; ++i)
|
||
yield*subEvents[i].DebugRun(frame)
|
||
}
|
||
Retrigger(oldFrame, newFrame) {
|
||
this._runtime.IncrementExecCount();
|
||
newFrame.ResetQuick();
|
||
const conditions = this._conditions;
|
||
if (!this.IsOrBlock())
|
||
for (let i = oldFrame.GetConditionIndex() + 1, len = conditions.length; i < len; ++i) {
|
||
const c = conditions[i];
|
||
newFrame.SetConditionIndex(i);
|
||
const result = c.Run();
|
||
if (!result)
|
||
return false
|
||
}
|
||
if (this._RunActions(newFrame, 0))
|
||
this._RunSubEvents(newFrame);
|
||
return true
|
||
}
|
||
*DebugRetrigger(oldFrame, newFrame) {
|
||
this._runtime.IncrementExecCount();
|
||
newFrame.ResetQuick();
|
||
const conditions = this._conditions;
|
||
if (!this.IsOrBlock())
|
||
for (let i = oldFrame.GetConditionIndex() + 1, len = conditions.length; i < len; ++i) {
|
||
const c = conditions[i];
|
||
newFrame.SetConditionIndex(i);
|
||
let ret;
|
||
if (c.DebugCanRunFast())
|
||
ret = c.Run();
|
||
else
|
||
ret = yield*c.DebugRun();
|
||
if (!ret)
|
||
return false
|
||
}
|
||
let actRet;
|
||
if (this.DebugCanRunActionsFast())
|
||
actRet = this._RunActions(newFrame, 0);
|
||
else
|
||
actRet = yield*this._DebugRunActions(newFrame, 0);
|
||
if (actRet)
|
||
if (this.DebugCanRunSubEventsFast())
|
||
this._RunSubEvents();
|
||
else
|
||
yield*this._DebugRunSubEvents();
|
||
return true
|
||
}
|
||
DebugCanRunFast() {
|
||
return !this.IsDebugBreakpoint() && !this._runtime.DebugBreakNext() && this._debugData.canRunSelfFast
|
||
}
|
||
DebugCanRunActionsFast() {
|
||
return !this._runtime.DebugBreakNext() && this._debugData.canRunAllActionsFast
|
||
}
|
||
DebugCanRunSubEventsFast() {
|
||
return !this._runtime.DebugBreakNext() && this._debugData.canRunAllSubEventsFast
|
||
}
|
||
_CheckParentsOKToRun(frame) {
|
||
if (this.GetParent()) {
|
||
const parents = this.GetTriggerParents();
|
||
for (let i = 0, len = parents.length; i < len; ++i)
|
||
if (!parents[i].RunPreTrigger(frame))
|
||
return false
|
||
}
|
||
return true
|
||
}
|
||
*_DebugCheckParentsOKToRun(frame) {
|
||
if (this.GetParent()) {
|
||
const parents = this.GetTriggerParents();
|
||
for (let i = 0, len = parents.length; i < len; ++i)
|
||
if (!(yield*parents[i].DebugRunPreTrigger(frame)))
|
||
return false
|
||
}
|
||
return true
|
||
}
|
||
_EvaluateFunctionCallParameters(eventSheetManager, parameters, isRecursive) {
|
||
if (parameters.length > 0)
|
||
if (isRecursive) {
|
||
const paramResults = parameters.map(p=>p.Get(0));
|
||
eventSheetManager.GetLocalVarStack().Push();
|
||
this._scopeParent.SetFunctionParameters(paramResults)
|
||
} else
|
||
this._scopeParent.EvaluateFunctionParameters(parameters);
|
||
else if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Push()
|
||
}
|
||
RunAsFunctionCall(combinedSolModifiers, parameters) {
|
||
let ret;
|
||
let asyncId;
|
||
const hasAnySolModifiers = combinedSolModifiers.length > 0;
|
||
const runtime = this._runtime;
|
||
const eventStack = this._eventStack;
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
const triggerDepth = eventSheetManager._IncTriggerDepth();
|
||
const isRecursive = triggerDepth > 1;
|
||
this._EvaluateFunctionCallParameters(eventSheetManager, parameters, isRecursive);
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PushCleanSol(combinedSolModifiers);
|
||
const frame = eventStack.Push(this);
|
||
if (this._CheckParentsOKToRun(frame)) {
|
||
runtime.IncrementExecCount();
|
||
frame.SetCurrentEvent(this);
|
||
const isAsync = this._scopeParent.IsAsync();
|
||
if (isAsync)
|
||
[asyncId,ret] = this._scopeParent.StartAsyncFunctionCall();
|
||
this._RunAndBlock(frame);
|
||
if (isAsync)
|
||
this._scopeParent.MaybeFinishAsyncFunctionCall(asyncId)
|
||
}
|
||
eventStack.Pop();
|
||
if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Pop();
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PopSol(combinedSolModifiers);
|
||
eventSheetManager._DecTriggerDepth();
|
||
return ret
|
||
}
|
||
*DebugRunAsFunctionCall(combinedSolModifiers, parameters) {
|
||
let ret;
|
||
let asyncId;
|
||
if (this.IsDebugBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
const hasAnySolModifiers = combinedSolModifiers.length > 0;
|
||
const runtime = this._runtime;
|
||
const eventStack = this._eventStack;
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
const triggerDepth = eventSheetManager._IncTriggerDepth();
|
||
const isRecursive = triggerDepth > 1;
|
||
this._EvaluateFunctionCallParameters(eventSheetManager, parameters, isRecursive);
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PushCleanSol(combinedSolModifiers);
|
||
const frame = eventStack.Push(this);
|
||
if (yield*this._DebugCheckParentsOKToRun(frame)) {
|
||
runtime.IncrementExecCount();
|
||
frame.SetCurrentEvent(this);
|
||
const isAsync = this._scopeParent.IsAsync();
|
||
if (isAsync)
|
||
[asyncId,ret] = this._scopeParent.StartAsyncFunctionCall();
|
||
yield*this._DebugRunAndBlock(frame);
|
||
if (isAsync)
|
||
this._scopeParent.MaybeFinishAsyncFunctionCall(asyncId)
|
||
}
|
||
eventStack.Pop();
|
||
if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Pop();
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PopSol(combinedSolModifiers);
|
||
eventSheetManager._DecTriggerDepth();
|
||
return ret
|
||
}
|
||
RunAsMappedFunctionCall(paramResults) {
|
||
const solModifiers = this.GetSolModifiersIncludingParents();
|
||
const hasAnySolModifiers = solModifiers.length > 0;
|
||
const runtime = this._runtime;
|
||
const eventStack = this._eventStack;
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
const triggerDepth = eventSheetManager._IncTriggerDepth();
|
||
const isRecursive = triggerDepth > 1;
|
||
if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Push();
|
||
this._scopeParent.SetFunctionParameters(paramResults);
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PushCleanSol(solModifiers);
|
||
const frame = eventStack.Push(this);
|
||
if (this._CheckParentsOKToRun(frame)) {
|
||
runtime.IncrementExecCount();
|
||
frame.SetCurrentEvent(this);
|
||
this._RunAndBlock(frame)
|
||
}
|
||
eventStack.Pop();
|
||
if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Pop();
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PopSol(solModifiers);
|
||
eventSheetManager._DecTriggerDepth()
|
||
}
|
||
*DebugRunAsMappedFunctionCall(paramResults) {
|
||
if (this.IsDebugBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
const solModifiers = this.GetSolModifiersIncludingParents();
|
||
const hasAnySolModifiers = solModifiers.length > 0;
|
||
const runtime = this._runtime;
|
||
const eventStack = this._eventStack;
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
const triggerDepth = eventSheetManager._IncTriggerDepth();
|
||
const isRecursive = triggerDepth > 1;
|
||
if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Push();
|
||
this._scopeParent.SetFunctionParameters(paramResults);
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PushCleanSol(solModifiers);
|
||
const frame = eventStack.Push(this);
|
||
if (yield*this._DebugCheckParentsOKToRun(frame)) {
|
||
runtime.IncrementExecCount();
|
||
frame.SetCurrentEvent(this);
|
||
yield*this._DebugRunAndBlock(frame)
|
||
}
|
||
eventStack.Pop();
|
||
if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Pop();
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PopSol(solModifiers);
|
||
eventSheetManager._DecTriggerDepth()
|
||
}
|
||
RunAsExpressionFunctionCall(combinedSolModifiers, returnType, defaultReturnValue, ...paramResults) {
|
||
let ret;
|
||
let asyncId;
|
||
const hasAnySolModifiers = combinedSolModifiers.length > 0;
|
||
const runtime = this._runtime;
|
||
const eventStack = this._eventStack;
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
const triggerDepth = eventSheetManager._IncTriggerDepth();
|
||
const isRecursive = triggerDepth > 1;
|
||
if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Push();
|
||
if (paramResults.length > 0)
|
||
this._scopeParent.SetFunctionParameters(paramResults);
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PushCleanSol(combinedSolModifiers);
|
||
const frame = eventStack.Push(this);
|
||
frame.InitCallFunctionExpression(returnType, defaultReturnValue);
|
||
eventStack.PushExpFunc(frame);
|
||
runtime.SetDebuggingEnabled(false);
|
||
if (this._CheckParentsOKToRun(frame)) {
|
||
runtime.IncrementExecCount();
|
||
frame.SetCurrentEvent(this);
|
||
const isAsync = this._scopeParent.IsAsync();
|
||
if (isAsync)
|
||
[asyncId,ret] = this._scopeParent.StartAsyncFunctionCall();
|
||
this._RunAndBlock(frame);
|
||
if (isAsync)
|
||
this._scopeParent.MaybeFinishAsyncFunctionCall(asyncId)
|
||
}
|
||
runtime.SetDebuggingEnabled(true);
|
||
eventStack.Pop();
|
||
eventStack.PopExpFunc();
|
||
if (isRecursive)
|
||
eventSheetManager.GetLocalVarStack().Pop();
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PopSol(combinedSolModifiers);
|
||
eventSheetManager._DecTriggerDepth();
|
||
return ret || frame.GetFunctionReturnValue()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const EMPTY_SOL_MODIFIERS = [];
|
||
let hadUserScriptException = false;
|
||
C3.EventScript = class EventScript extends C3.DefendedBase {
|
||
constructor(eventSheet, parent, data) {
|
||
super();
|
||
const runtime = eventSheet.GetRuntime();
|
||
const eventSheetManager = eventSheet.GetEventSheetManager();
|
||
this._eventSheet = eventSheet;
|
||
this._eventSheetManager = eventSheetManager;
|
||
this._runtime = eventSheet.GetRuntime();
|
||
this._parent = parent;
|
||
const userMethod = runtime.GetObjectReference(data[1]);
|
||
this._func = userMethod;
|
||
this._displayNumber = data[2];
|
||
this._eventSheet._RegisterEventByDisplayNumber(this, this._displayNumber);
|
||
this._debugData = runtime.IsDebug() ? {
|
||
isBreakpoint: data[3][0],
|
||
isBreakable: data[3][1]
|
||
} : null
|
||
}
|
||
static Create(eventSheet, parent, data) {
|
||
return C3.New(C3.EventScript, eventSheet, parent, data)
|
||
}
|
||
_PostInit() {
|
||
const userMethod = this._func;
|
||
const localVars = this._runtime.GetEventSheetManager()._GetLocalVariablesScriptInterface(this);
|
||
this._func = userMethod.bind(null, this._runtime.GetIRuntime(), localVars)
|
||
}
|
||
GetParent() {
|
||
return this._parent
|
||
}
|
||
GetScopeParent() {
|
||
return this._parent
|
||
}
|
||
GetEventSheet() {
|
||
return this._eventSheet
|
||
}
|
||
GetDisplayNumber() {
|
||
return this._displayNumber
|
||
}
|
||
IsDebugBreakable() {
|
||
return this._debugData && this._debugData.isBreakable
|
||
}
|
||
IsDebugBreakpoint() {
|
||
return this.IsDebugBreakable() && this._debugData.isBreakpoint
|
||
}
|
||
_SetDebugBreakpoint(b) {
|
||
this._debugData.isBreakpoint = !!b
|
||
}
|
||
IsElseBlock() {
|
||
return false
|
||
}
|
||
GetSolModifiers() {
|
||
return EMPTY_SOL_MODIFIERS
|
||
}
|
||
GetSolModifiersIncludingParents() {
|
||
if (this._parent)
|
||
return this._parent.GetSolModifiersIncludingParents();
|
||
else
|
||
return EMPTY_SOL_MODIFIERS
|
||
}
|
||
Run(frame) {
|
||
frame.SetCurrentEvent(this);
|
||
this._eventSheetManager.AddAsyncActionPromise(this._RunUserScript())
|
||
}
|
||
async _RunUserScript() {
|
||
try {
|
||
await this._func()
|
||
} catch (err) {
|
||
console.error(`Unhandled exception running script %c${this.GetEventSheet().GetName()}, event ${this.GetDisplayNumber()}:`, "font-size: 1.2em; font-weight: bold;", err);
|
||
if (self.C3Debugger)
|
||
self.C3Debugger._SetLastErrorScript(this);
|
||
if (!hadUserScriptException) {
|
||
console.info(`%cTip:%c run this to highlight in Construct the last script that had an error: %cgoToLastErrorScript()`, "font-weight: bold; text-decoration: underline", "", "font-weight: bold");
|
||
hadUserScriptException = true
|
||
}
|
||
}
|
||
}
|
||
*DebugRun(frame) {
|
||
frame.SetCurrentEvent(this);
|
||
if (this.IsDebugBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
this.Run(frame)
|
||
}
|
||
DebugCanRunFast() {
|
||
return !this.IsDebugBreakpoint() && !this._runtime.DebugBreakNext()
|
||
}
|
||
static HadUserScriptException() {
|
||
return hadUserScriptException
|
||
}
|
||
static SetHadUserScriptException() {
|
||
hadUserScriptException = true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
C3.FunctionBlock = class FunctionBlock extends C3.DefendedBase {
|
||
constructor(eventSheet, parent, data) {
|
||
super();
|
||
this._eventSheet = eventSheet;
|
||
this._runtime = eventSheet.GetRuntime();
|
||
this._parent = parent;
|
||
const funcData = data[1];
|
||
this._functionName = funcData[0];
|
||
this._returnType = funcData[1];
|
||
this._functionParameters = funcData[2].map(paramData=>C3.EventVariable.Create(eventSheet, this, paramData));
|
||
this._isEnabled = funcData[3];
|
||
this._isAsync = funcData[4];
|
||
this._nextAsyncId = 0;
|
||
this._currentAsyncId = -1;
|
||
this._asyncMap = new Map;
|
||
this._eventBlock = C3.EventBlock.Create(eventSheet, parent, data);
|
||
this._eventBlock._SetScopeParent(this)
|
||
}
|
||
static Create(eventSheet, parent, data) {
|
||
return C3.New(C3.FunctionBlock, eventSheet, parent, data)
|
||
}
|
||
_PostInit() {
|
||
for (const fp of this._functionParameters)
|
||
fp._PostInit();
|
||
this._eventBlock._PostInit(false)
|
||
}
|
||
_GetAllLocalVariablesInScope() {
|
||
return this._functionParameters
|
||
}
|
||
GetFunctionParameters() {
|
||
return this._functionParameters
|
||
}
|
||
GetFunctionParameterCount() {
|
||
return this._functionParameters.length
|
||
}
|
||
EvaluateFunctionParameters(parameters) {
|
||
const functionParameters = this._functionParameters;
|
||
for (let i = 0, len = functionParameters.length; i < len; ++i)
|
||
functionParameters[i].SetValue(parameters[i].Get(0))
|
||
}
|
||
SetFunctionParameters(paramResults) {
|
||
const functionParameters = this._functionParameters;
|
||
for (let i = 0, len = functionParameters.length; i < len; ++i)
|
||
functionParameters[i].SetValue(paramResults[i])
|
||
}
|
||
CaptureFunctionParameters() {
|
||
return this._functionParameters.map(p=>p.GetValue())
|
||
}
|
||
GetParent() {
|
||
return this._parent
|
||
}
|
||
GetScopeParent() {
|
||
return this._parent
|
||
}
|
||
GetFunctionName() {
|
||
return this._functionName
|
||
}
|
||
GetReturnType() {
|
||
return this._returnType
|
||
}
|
||
IsEnabled() {
|
||
return this._isEnabled
|
||
}
|
||
GetDefaultReturnValue() {
|
||
switch (this._returnType) {
|
||
case 0:
|
||
return null;
|
||
case 2:
|
||
return "";
|
||
default:
|
||
return 0
|
||
}
|
||
}
|
||
GetEventBlock() {
|
||
return this._eventBlock
|
||
}
|
||
IsAsync() {
|
||
return this._isAsync
|
||
}
|
||
StartAsyncFunctionCall() {
|
||
const asyncId = this._nextAsyncId++;
|
||
this._currentAsyncId = asyncId;
|
||
let resolve;
|
||
const promise = new Promise(r=>resolve = r);
|
||
this._asyncMap.set(asyncId, {
|
||
resolve,
|
||
pauseCount: 0
|
||
});
|
||
return [asyncId, promise]
|
||
}
|
||
MaybeFinishAsyncFunctionCall(asyncId) {
|
||
const info = this._asyncMap.get(asyncId);
|
||
if (info.pauseCount === 0) {
|
||
info.resolve();
|
||
this._asyncMap.delete(asyncId)
|
||
}
|
||
this._currentAsyncId = -1
|
||
}
|
||
PauseCurrentAsyncFunction() {
|
||
const info = this._asyncMap.get(this._currentAsyncId);
|
||
info.pauseCount++;
|
||
return this._currentAsyncId
|
||
}
|
||
ResumeAsyncFunction(asyncId) {
|
||
this._currentAsyncId = asyncId;
|
||
const info = this._asyncMap.get(asyncId);
|
||
info.pauseCount--
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const EMPTY_SOL_MODIFIERS = [];
|
||
C3.EventVariable = class EventVariable extends C3.DefendedBase {
|
||
constructor(eventSheet, parent, data) {
|
||
super();
|
||
const eventSheetManager = eventSheet.GetEventSheetManager();
|
||
this._eventSheet = eventSheet;
|
||
this._eventSheetManager = eventSheetManager;
|
||
this._runtime = eventSheet.GetRuntime();
|
||
this._parent = parent;
|
||
this._localVarStack = eventSheetManager.GetLocalVarStack();
|
||
this._name = data[1];
|
||
this._type = data[2];
|
||
this._initialValue = data[3];
|
||
this._isStatic = !!data[4];
|
||
this._isConstant = !!data[5];
|
||
this._isFunctionParameter = parent instanceof C3.FunctionBlock;
|
||
this._sid = data[6];
|
||
this._jsPropName = this._runtime.GetJsPropName(data[8]);
|
||
this._scriptSetter = v=>this.SetValue(v);
|
||
this._scriptGetter = ()=>this.GetValue();
|
||
this._hasSingleValue = !this._parent || this._isStatic || this._isConstant;
|
||
this._value = this._initialValue;
|
||
this._localIndex = -1;
|
||
if (this.IsBoolean())
|
||
this._value = this._value ? 1 : 0;
|
||
if (this.IsLocal() && !this.IsStatic() && !this.IsConstant())
|
||
this._localIndex = eventSheetManager._GetNextLocalVarIndex(this);
|
||
eventSheetManager._RegisterEventVariable(this)
|
||
}
|
||
static Create(eventSheet, parent, data) {
|
||
return C3.New(C3.EventVariable, eventSheet, parent, data)
|
||
}
|
||
_PostInit() {}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
GetJsPropName() {
|
||
return this._jsPropName
|
||
}
|
||
GetParent() {
|
||
return this._parent
|
||
}
|
||
IsGlobal() {
|
||
return !this.GetParent()
|
||
}
|
||
IsLocal() {
|
||
return !this.IsGlobal()
|
||
}
|
||
IsFunctionParameter() {
|
||
return this._isFunctionParameter
|
||
}
|
||
IsStatic() {
|
||
return this._isStatic
|
||
}
|
||
IsConstant() {
|
||
return this._isConstant
|
||
}
|
||
IsNumber() {
|
||
return this._type === 0
|
||
}
|
||
IsString() {
|
||
return this._type === 1
|
||
}
|
||
IsBoolean() {
|
||
return this._type === 2
|
||
}
|
||
IsElseBlock() {
|
||
return false
|
||
}
|
||
GetSID() {
|
||
return this._sid
|
||
}
|
||
GetInitialValue() {
|
||
return this._initialValue
|
||
}
|
||
GetSolModifiers() {
|
||
return EMPTY_SOL_MODIFIERS
|
||
}
|
||
Run(frame) {
|
||
if (this.IsLocal() && !this.IsStatic() && !this.IsConstant())
|
||
this.SetValue(this.GetInitialValue())
|
||
}
|
||
DebugCanRunFast() {
|
||
return true
|
||
}
|
||
*DebugRun(frame) {
|
||
this.Run(frame)
|
||
}
|
||
SetValue(v) {
|
||
if (this.IsNumber()) {
|
||
if (typeof v !== "number")
|
||
v = parseFloat(v)
|
||
} else if (this.IsString()) {
|
||
if (typeof v !== "string")
|
||
v = v.toString()
|
||
} else if (this.IsBoolean())
|
||
v = v ? 1 : 0;
|
||
if (this._hasSingleValue)
|
||
this._value = v;
|
||
else
|
||
this._localVarStack.GetCurrent()[this._localIndex] = v
|
||
}
|
||
GetValue() {
|
||
return this._hasSingleValue ? this._value : this._localVarStack.GetCurrent()[this._localIndex]
|
||
}
|
||
GetTypedValue() {
|
||
let ret = this.GetValue();
|
||
if (this.IsBoolean())
|
||
ret = !!ret;
|
||
return ret
|
||
}
|
||
ResetToInitialValue() {
|
||
this._value = this._initialValue
|
||
}
|
||
_GetScriptInterfaceDescriptor() {
|
||
return {
|
||
configurable: false,
|
||
enumerable: true,
|
||
get: this._scriptGetter,
|
||
set: this._scriptSetter
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
const EMPTY_SOL_MODIFIERS = [];
|
||
C3.EventInclude = class EventInclude extends C3.DefendedBase {
|
||
constructor(eventSheet, parent, data) {
|
||
super();
|
||
const eventSheetManager = eventSheet.GetEventSheetManager();
|
||
this._eventSheet = eventSheet;
|
||
this._eventSheetManager = eventSheetManager;
|
||
this._runtime = eventSheet.GetRuntime();
|
||
this._parent = parent;
|
||
this._includeSheet = null;
|
||
this._includeSheetName = data[1];
|
||
this._isActive = true
|
||
}
|
||
static Create(eventSheet, parent, data) {
|
||
return C3.New(C3.EventInclude, eventSheet, parent, data)
|
||
}
|
||
_PostInit() {
|
||
this._includeSheet = this._eventSheetManager.GetEventSheetByName(this._includeSheetName);
|
||
this._eventSheet._AddShallowInclude(this);
|
||
let p = this.GetParent();
|
||
while (p) {
|
||
if (p instanceof C3.EventBlock && p.IsGroup())
|
||
p._AddContainedInclude(this);
|
||
p = p.GetParent()
|
||
}
|
||
this.UpdateActive();
|
||
if (this._runtime.IsDebug())
|
||
this._eventSheet._GetPerfRecord().children.push(this._includeSheet._GetPerfRecord())
|
||
}
|
||
GetParent() {
|
||
return this._parent
|
||
}
|
||
GetSolModifiers() {
|
||
return EMPTY_SOL_MODIFIERS
|
||
}
|
||
GetIncludeSheet() {
|
||
return this._includeSheet
|
||
}
|
||
Run(frame) {
|
||
const pushSol = !!this.GetParent();
|
||
const allObjectClasses = this._runtime.GetAllObjectClasses();
|
||
if (pushSol)
|
||
this._eventSheetManager.PushCleanSol(allObjectClasses);
|
||
this._includeSheet.Run();
|
||
if (pushSol)
|
||
this._eventSheetManager.PopSol(allObjectClasses)
|
||
}
|
||
*DebugRun(frame) {
|
||
const pushSol = !!this.GetParent();
|
||
const allObjectClasses = this._runtime.GetAllObjectClasses();
|
||
if (pushSol)
|
||
this._eventSheetManager.PushCleanSol(allObjectClasses);
|
||
yield*this._includeSheet.DebugRun();
|
||
if (pushSol)
|
||
this._eventSheetManager.PopSol(allObjectClasses)
|
||
}
|
||
DebugCanRunFast() {
|
||
return false
|
||
}
|
||
IsActive() {
|
||
return this._isActive
|
||
}
|
||
UpdateActive() {
|
||
let p = this.GetParent();
|
||
while (p) {
|
||
if (p instanceof C3.EventBlock && p.IsGroup() && !p.IsGroupActive()) {
|
||
this._isActive = false;
|
||
return
|
||
}
|
||
p = p.GetParent()
|
||
}
|
||
this._isActive = true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
C3.ExpNode = class ExpNode extends C3.DefendedBase {
|
||
constructor(owner) {
|
||
super();
|
||
this._owner = owner;
|
||
this._runtime = owner.GetRuntime()
|
||
}
|
||
_PostInit() {}
|
||
static CreateNode(owner, data) {
|
||
const type = data[0];
|
||
const Classes = [BehaviorExpressionNode, ObjectExpressionNode, InstVarExpressionNode, EventVarExpNode, SystemExpressionExpNode, CallFunctionExpressionExpNode];
|
||
return C3.New(Classes[type], owner, data)
|
||
}
|
||
}
|
||
;
|
||
class SystemExpressionExpNode extends C3.ExpNode {
|
||
constructor(owner, data) {
|
||
super(owner);
|
||
this._systemPlugin = this._runtime.GetSystemPlugin();
|
||
this._func = this._runtime.GetObjectReference(data[1]);
|
||
if (this._func === C3.Plugins.System.Exps.random || this._func === C3.Plugins.System.Exps.choose)
|
||
this._owner.SetVariesPerInstance()
|
||
}
|
||
GetBoundMethod() {
|
||
return this._systemPlugin._GetBoundACEMethod(this._func, this._systemPlugin)
|
||
}
|
||
}
|
||
class CallFunctionExpressionExpNode extends C3.ExpNode {
|
||
constructor(owner, data) {
|
||
super(owner);
|
||
this._functionBlock = null;
|
||
this._functionName = data[1];
|
||
this._owner.SetVariesPerInstance()
|
||
}
|
||
_PostInit() {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
this._functionBlock = eventSheetManager.GetFunctionBlockByName(this._functionName);
|
||
this._functionName = null;
|
||
const myEventBlock = this._owner.GetEventBlock();
|
||
const callEventBlock = this._functionBlock.GetEventBlock();
|
||
this._combinedSolModifiers = [...new Set([...myEventBlock.GetSolModifiersIncludingParents(), ...callEventBlock.GetSolModifiersIncludingParents()])];
|
||
this._combinedSolModifiers = eventSheetManager._DeduplicateSolModifierList(this._combinedSolModifiers)
|
||
}
|
||
GetBoundMethod() {
|
||
const functionBlock = this._functionBlock;
|
||
if (functionBlock.IsEnabled()) {
|
||
const callEventBlock = functionBlock.GetEventBlock();
|
||
return C3.EventBlock.prototype.RunAsExpressionFunctionCall.bind(callEventBlock, this._combinedSolModifiers, functionBlock.GetReturnType(), functionBlock.GetDefaultReturnValue())
|
||
} else {
|
||
const defaultReturnValue = functionBlock.GetDefaultReturnValue();
|
||
return ()=>defaultReturnValue
|
||
}
|
||
}
|
||
}
|
||
function WrapIndex(index, len) {
|
||
if (index >= len)
|
||
return index % len;
|
||
else if (index < 0) {
|
||
if (index <= -len)
|
||
index %= len;
|
||
if (index < 0)
|
||
index += len;
|
||
return index
|
||
} else
|
||
return index
|
||
}
|
||
class ObjectExpressionNode extends C3.ExpNode {
|
||
constructor(owner, data) {
|
||
super(owner);
|
||
this._objectClass = this._runtime.GetObjectClassByIndex(data[1]);
|
||
this._func = this._runtime.GetObjectReference(data[2]);
|
||
this._returnsString = !!data[3];
|
||
this._eventStack = this._runtime.GetEventSheetManager().GetEventStack();
|
||
this._owner._MaybeVaryFor(this._objectClass)
|
||
}
|
||
GetBoundMethod() {
|
||
return this._objectClass.GetPlugin()._GetBoundACEMethod(this._func, this._objectClass.GetSingleGlobalInstance().GetSdkInstance())
|
||
}
|
||
ExpObject(...args) {
|
||
const objectClass = this._objectClass;
|
||
const instances = objectClass.GetCurrentSol().GetExpressionInstances();
|
||
const len = instances.length;
|
||
if (len === 0)
|
||
return this._returnsString ? "" : 0;
|
||
const index = WrapIndex(this._owner.GetSolIndex(), len);
|
||
this._eventStack.GetCurrentStackFrame().SetExpressionObjectClass(objectClass);
|
||
return this._func.apply(instances[index].GetSdkInstance(), args)
|
||
}
|
||
ExpObject_InstExpr(instIndex, ...args) {
|
||
const objectClass = this._objectClass;
|
||
const instances = objectClass.GetInstances();
|
||
const len = instances.length;
|
||
if (len === 0)
|
||
return this._returnsString ? "" : 0;
|
||
const index = WrapIndex(instIndex, len);
|
||
this._eventStack.GetCurrentStackFrame().SetExpressionObjectClass(objectClass);
|
||
return this._func.apply(instances[index].GetSdkInstance(), args)
|
||
}
|
||
}
|
||
class InstVarExpressionNode extends C3.ExpNode {
|
||
constructor(owner, data) {
|
||
super(owner);
|
||
this._objectClass = this._runtime.GetObjectClassByIndex(data[1]);
|
||
this._varIndex = data[3];
|
||
this._returnsString = !!data[2];
|
||
this._owner._MaybeVaryFor(this._objectClass)
|
||
}
|
||
ExpInstVar() {
|
||
const instances = this._objectClass.GetCurrentSol().GetExpressionInstances();
|
||
const len = instances.length;
|
||
if (len === 0)
|
||
return this._returnsString ? "" : 0;
|
||
const index = WrapIndex(this._owner.GetSolIndex(), len);
|
||
return instances[index]._GetInstanceVariableValueUnchecked(this._varIndex)
|
||
}
|
||
ExpInstVar_Family() {
|
||
const objectClass = this._objectClass;
|
||
const instances = objectClass.GetCurrentSol().GetExpressionInstances();
|
||
const len = instances.length;
|
||
if (len === 0)
|
||
return this._returnsString ? "" : 0;
|
||
const index = WrapIndex(this._owner.GetSolIndex(), len);
|
||
const inst = instances[index];
|
||
const offset = inst.GetObjectClass().GetFamilyInstanceVariableOffset(objectClass.GetFamilyIndex());
|
||
return inst._GetInstanceVariableValueUnchecked(this._varIndex + offset)
|
||
}
|
||
ExpInstVar_InstExpr(instIndex) {
|
||
const objectClass = this._objectClass;
|
||
const instances = objectClass.GetInstances();
|
||
const len = instances.length;
|
||
if (len === 0)
|
||
return this._returnsString ? "" : 0;
|
||
const index = WrapIndex(instIndex, len);
|
||
const inst = instances[index];
|
||
let offset = 0;
|
||
if (objectClass.IsFamily())
|
||
offset = inst.GetObjectClass().GetFamilyInstanceVariableOffset(objectClass.GetFamilyIndex());
|
||
return inst._GetInstanceVariableValueUnchecked(this._varIndex + offset)
|
||
}
|
||
}
|
||
class BehaviorExpressionNode extends C3.ExpNode {
|
||
constructor(owner, data) {
|
||
super(owner);
|
||
this._objectClass = this._runtime.GetObjectClassByIndex(data[1]);
|
||
this._behaviorType = this._objectClass.GetBehaviorTypeByName(data[2]);
|
||
this._behaviorIndex = this._objectClass.GetBehaviorIndexByName(data[2]);
|
||
this._func = this._runtime.GetObjectReference(data[3]);
|
||
this._returnsString = !!data[4];
|
||
this._eventStack = this._runtime.GetEventSheetManager().GetEventStack();
|
||
this._owner._MaybeVaryFor(this._objectClass)
|
||
}
|
||
ExpBehavior(...args) {
|
||
const objectClass = this._objectClass;
|
||
const instances = objectClass.GetCurrentSol().GetExpressionInstances();
|
||
const len = instances.length;
|
||
if (len === 0)
|
||
return this._returnsString ? "" : 0;
|
||
const index = WrapIndex(this._owner.GetSolIndex(), len);
|
||
this._eventStack.GetCurrentStackFrame().SetExpressionObjectClass(objectClass);
|
||
const inst = instances[index];
|
||
let offset = 0;
|
||
if (objectClass.IsFamily())
|
||
offset = inst.GetObjectClass().GetFamilyBehaviorOffset(objectClass.GetFamilyIndex());
|
||
return this._func.apply(inst.GetBehaviorInstances()[this._behaviorIndex + offset].GetSdkInstance(), args)
|
||
}
|
||
ExpBehavior_InstExpr(instIndex, ...args) {
|
||
const objectClass = this._objectClass;
|
||
const instances = objectClass.GetInstances();
|
||
const len = instances.length;
|
||
if (len === 0)
|
||
return this._returnsString ? "" : 0;
|
||
const index = WrapIndex(instIndex, len);
|
||
this._eventStack.GetCurrentStackFrame().SetExpressionObjectClass(objectClass);
|
||
const inst = instances[index];
|
||
let offset = 0;
|
||
if (objectClass.IsFamily())
|
||
offset = inst.GetObjectClass().GetFamilyBehaviorOffset(objectClass.GetFamilyIndex());
|
||
return this._func.apply(inst.GetBehaviorInstances()[this._behaviorIndex + offset].GetSdkInstance(), args)
|
||
}
|
||
}
|
||
class EventVarExpNode extends C3.ExpNode {
|
||
constructor(owner, data) {
|
||
super(owner);
|
||
this._eventVar = null;
|
||
this._eventVarSid = data[1]
|
||
}
|
||
_PostInit() {
|
||
this._eventVar = this._runtime.GetEventSheetManager().GetEventVariableBySID(this._eventVarSid)
|
||
}
|
||
GetVar() {
|
||
return this._eventVar
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
C3.Parameter = class Parameter extends C3.DefendedBase {
|
||
constructor(owner, type, index) {
|
||
super();
|
||
this._owner = owner;
|
||
this._index = index;
|
||
this._type = type;
|
||
this.Get = null;
|
||
this._variesPerInstance = false;
|
||
this._isConstant = false
|
||
}
|
||
static Create(owner, data, index) {
|
||
const type = data[0];
|
||
const Classes = [ExpressionParameter, StringExpressionParameter, FileParameter, ComboParameter, ObjectParameter, LayerExpressionParameter, LayoutParameter, ExpressionParameter, ComboParameter, ComboParameter, InstVarParameter, EventVarParameter, FileParameter, VariadicParameter, StringExpressionParameter, TimelineParameter, BooleanParameter, FunctionParameter, EaseParameter];
|
||
return C3.New(Classes[type], owner, type, index, data)
|
||
}
|
||
_PostInit() {}
|
||
SetVariesPerInstance() {
|
||
this._variesPerInstance = true
|
||
}
|
||
_MaybeVaryFor(objectClass) {
|
||
if (this._variesPerInstance)
|
||
return;
|
||
if (!objectClass)
|
||
return;
|
||
if (!objectClass.GetPlugin().IsSingleGlobal())
|
||
this._variesPerInstance = true
|
||
}
|
||
VariesPerInstance() {
|
||
return this._variesPerInstance
|
||
}
|
||
GetIndex() {
|
||
return this._index
|
||
}
|
||
GetRuntime() {
|
||
return this._owner.GetRuntime()
|
||
}
|
||
GetEventBlock() {
|
||
return this._owner.GetEventBlock()
|
||
}
|
||
IsConstant() {
|
||
return this._isConstant
|
||
}
|
||
}
|
||
;
|
||
function GetExpressionFunc(number) {
|
||
const ret = self.C3_ExpressionFuncs[number];
|
||
if (!ret)
|
||
throw new Error("invalid expression number");
|
||
return ret
|
||
}
|
||
class ExpressionParameter extends C3.Parameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index);
|
||
this._solIndex = 0;
|
||
const expData = data[1];
|
||
this._expressionNumber = expData[0];
|
||
this._numberedNodes = [];
|
||
this._expressionFunc = null;
|
||
for (let i = 1, len = expData.length; i < len; ++i)
|
||
this._numberedNodes.push(C3.ExpNode.CreateNode(this, expData[i]));
|
||
if (this._numberedNodes.length)
|
||
this.Get = this.GetExpression;
|
||
else {
|
||
this.Get = GetExpressionFunc(this._expressionNumber);
|
||
this._isConstant = true
|
||
}
|
||
}
|
||
_GetNode(i) {
|
||
if (i < 0 || i >= this._numberedNodes.length)
|
||
throw new RangeError("invalid numbered node");
|
||
return this._numberedNodes[i]
|
||
}
|
||
_PostInit() {
|
||
for (const node of this._numberedNodes)
|
||
node._PostInit();
|
||
const func = GetExpressionFunc(this._expressionNumber);
|
||
if (this._numberedNodes.length)
|
||
this._expressionFunc = func(this);
|
||
else
|
||
this._expressionFunc = func
|
||
}
|
||
GetSolIndex() {
|
||
return this._solIndex
|
||
}
|
||
GetExpression(solIndex) {
|
||
this._solIndex = solIndex;
|
||
return this._expressionFunc()
|
||
}
|
||
}
|
||
class StringExpressionParameter extends ExpressionParameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index, data);
|
||
this.Get = this.GetStringExpression;
|
||
if (type === 14) {
|
||
this.GetEventBlock().SetAllSolModifiers();
|
||
if (this._owner instanceof C3.Action)
|
||
this.GetEventBlock().SetSolWriterAfterCnds()
|
||
}
|
||
}
|
||
GetStringExpression(solIndex) {
|
||
this._solIndex = solIndex;
|
||
const ret = this._expressionFunc();
|
||
if (typeof ret === "string")
|
||
return ret;
|
||
else
|
||
return ""
|
||
}
|
||
_GetFastTriggerValue() {
|
||
return GetExpressionFunc(this._expressionNumber)()
|
||
}
|
||
}
|
||
class LayerExpressionParameter extends ExpressionParameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index, data);
|
||
this.Get = this.GetLayer;
|
||
this._isConstant = false
|
||
}
|
||
GetLayer(solIndex) {
|
||
this._solIndex = solIndex;
|
||
const ret = this._expressionFunc();
|
||
const layout = this.GetRuntime().GetCurrentLayout();
|
||
return layout.GetLayer(ret)
|
||
}
|
||
}
|
||
class ComboParameter extends C3.Parameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index);
|
||
this._combo = data[1];
|
||
this.Get = this.GetCombo;
|
||
this._isConstant = true
|
||
}
|
||
GetCombo() {
|
||
return this._combo
|
||
}
|
||
}
|
||
class BooleanParameter extends C3.Parameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index);
|
||
this._bool = data[1];
|
||
this.Get = this.GetBoolean;
|
||
this._isConstant = true
|
||
}
|
||
GetBoolean() {
|
||
return this._bool
|
||
}
|
||
}
|
||
class ObjectParameter extends C3.Parameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index);
|
||
this._objectClass = this.GetRuntime().GetObjectClassByIndex(data[1]);
|
||
this.Get = this.GetObjectClass;
|
||
const eventBlock = this.GetEventBlock();
|
||
eventBlock._AddSolModifier(this._objectClass);
|
||
if (this._owner instanceof C3.Action)
|
||
eventBlock.SetSolWriterAfterCnds();
|
||
else if (eventBlock.GetParent())
|
||
eventBlock.GetParent().SetSolWriterAfterCnds();
|
||
this._isConstant = true
|
||
}
|
||
GetObjectClass() {
|
||
return this._objectClass
|
||
}
|
||
}
|
||
class LayoutParameter extends C3.Parameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index);
|
||
this._layout = this.GetRuntime().GetLayoutManager().GetLayoutByName(data[1]);
|
||
this.Get = this.GetLayout;
|
||
this._isConstant = true
|
||
}
|
||
GetLayout() {
|
||
return this._layout
|
||
}
|
||
}
|
||
class TimelineParameter extends C3.Parameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index);
|
||
this._timeline = this.GetRuntime().GetTimelineManager().GetTimelineByName(data[1]);
|
||
this.Get = this.GetTimeline;
|
||
this._isConstant = true
|
||
}
|
||
GetTimeline() {
|
||
return this._timeline
|
||
}
|
||
}
|
||
class FileParameter extends C3.Parameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index);
|
||
this._fileInfo = data[1];
|
||
this.Get = this.GetFile;
|
||
this._isConstant = true
|
||
}
|
||
GetFile() {
|
||
return this._fileInfo
|
||
}
|
||
}
|
||
class InstVarParameter extends C3.Parameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index);
|
||
this._instVarIndex = data[1];
|
||
const ownerObjectClass = this._owner.GetObjectClass();
|
||
if (ownerObjectClass && ownerObjectClass.IsFamily()) {
|
||
this.Get = this.GetFamilyInstanceVariable;
|
||
this.SetVariesPerInstance()
|
||
} else {
|
||
this.Get = this.GetInstanceVariable;
|
||
this._isConstant = true
|
||
}
|
||
}
|
||
GetInstanceVariable() {
|
||
return this._instVarIndex
|
||
}
|
||
GetFamilyInstanceVariable(solIndex) {
|
||
solIndex = solIndex || 0;
|
||
const familyType = this._owner.GetObjectClass();
|
||
const sol = familyType.GetCurrentSol();
|
||
const instances = sol.GetInstances();
|
||
let realType = null;
|
||
if (instances.length)
|
||
realType = instances[solIndex % instances.length].GetObjectClass();
|
||
else if (sol.HasAnyElseInstances()) {
|
||
const elseInstances = sol.GetElseInstances();
|
||
realType = elseInstances[solIndex % elseInstances.length].GetObjectClass()
|
||
} else if (familyType.GetInstanceCount() > 0) {
|
||
const familyInstances = familyType.GetInstances();
|
||
realType = familyInstances[solIndex % familyInstances.length].GetObjectClass()
|
||
} else
|
||
return 0;
|
||
return this._instVarIndex + realType.GetFamilyInstanceVariableOffset(familyType.GetFamilyIndex())
|
||
}
|
||
}
|
||
class EventVarParameter extends C3.Parameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index);
|
||
this._eventVarSid = data[1];
|
||
this._eventVar = null;
|
||
this.Get = this.GetEventVariable;
|
||
this._isConstant = true
|
||
}
|
||
_PostInit() {
|
||
this._eventVar = this.GetRuntime().GetEventSheetManager().GetEventVariableBySID(this._eventVarSid)
|
||
}
|
||
GetEventVariable() {
|
||
return this._eventVar
|
||
}
|
||
}
|
||
class FunctionParameter extends C3.Parameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index);
|
||
this._functionBlockName = data[1];
|
||
this._functionBlock = null;
|
||
this.Get = this.GetFunction;
|
||
this._isConstant = true
|
||
}
|
||
_PostInit() {
|
||
this._functionBlock = this.GetRuntime().GetEventSheetManager().GetFunctionBlockByName(this._functionBlockName);
|
||
this._functionBlockName = null
|
||
}
|
||
GetFunction() {
|
||
return this._functionBlock
|
||
}
|
||
}
|
||
class VariadicParameter extends C3.Parameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index);
|
||
this._subParams = [];
|
||
this._variadicRet = [];
|
||
this._isConstant = true;
|
||
for (let i = 1, len = data.length; i < len; ++i) {
|
||
const subParam = C3.Parameter.Create(this._owner, data[i], 0);
|
||
this._subParams.push(subParam);
|
||
this._variadicRet.push(0);
|
||
if (!subParam.IsConstant())
|
||
this._isConstant = false
|
||
}
|
||
this.Get = this.GetVariadic
|
||
}
|
||
_PostInit() {
|
||
for (const subParam of this._subParams)
|
||
subParam._PostInit()
|
||
}
|
||
GetVariadic() {
|
||
const subParams = this._subParams;
|
||
const variadicRet = this._variadicRet;
|
||
for (let i = 0, len = subParams.length; i < len; ++i)
|
||
variadicRet[i] = subParams[i].Get(0);
|
||
return variadicRet
|
||
}
|
||
}
|
||
class EaseParameter extends C3.Parameter {
|
||
constructor(owner, type, index, data) {
|
||
super(owner, type, index);
|
||
this._easeIndex = data[1];
|
||
this.Get = this.GetEase;
|
||
this._isConstant = true
|
||
}
|
||
GetEase() {
|
||
return this._easeIndex
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
function EvalParams(parameters, results) {
|
||
for (let i = 0, len = parameters.length; i < len; ++i)
|
||
results[i] = parameters[i].Get(0)
|
||
}
|
||
const EMPTY_PARAMS_ARRAY = [];
|
||
const noop = function() {};
|
||
C3.Condition = class Condition extends C3.DefendedBase {
|
||
constructor(eventBlock, data, index) {
|
||
super();
|
||
this._eventBlock = eventBlock;
|
||
this._runtime = eventBlock.GetRuntime();
|
||
this._index = index;
|
||
this._func = this._runtime.GetObjectReference(data[1]);
|
||
this._isTrigger = data[3] > 0;
|
||
this._isFastTrigger = data[3] === 2;
|
||
this._isLooping = !!data[4];
|
||
this._isInverted = !!data[5];
|
||
this._isStatic = !!data[6];
|
||
this._sid = data[7];
|
||
this._isInOrBlock = this._eventBlock.IsOrBlock();
|
||
this._objectClass = null;
|
||
this._behaviorType = null;
|
||
this._behaviorIndex = -1;
|
||
this._systemPlugin = null;
|
||
this.Run = noop;
|
||
this.DebugRun = noop;
|
||
this._parameters = [];
|
||
this._results = [];
|
||
this._anyParamVariesPerInstance = false;
|
||
this._savedData = null;
|
||
this._unsavedData = null;
|
||
this._debugData = this._runtime.IsDebug() ? {
|
||
isBreakpoint: data[8][0],
|
||
canDebug: data[8][1]
|
||
} : null;
|
||
if (data[0] === -1)
|
||
this._systemPlugin = this._runtime.GetSystemPlugin();
|
||
else {
|
||
this._objectClass = this._runtime.GetObjectClassByIndex(data[0]);
|
||
if (data[2]) {
|
||
this._behaviorType = this._objectClass.GetBehaviorTypeByName(data[2]);
|
||
this._behaviorIndex = this._objectClass.GetBehaviorIndexByName(data[2])
|
||
}
|
||
if (this._eventBlock.GetParent())
|
||
this._eventBlock.GetParent().SetSolWriterAfterCnds()
|
||
}
|
||
if (data.length === 10) {
|
||
let paramData = data[9];
|
||
for (let data of paramData) {
|
||
this._parameters.push(C3.Parameter.Create(this, data, this._parameters.length));
|
||
this._results.push(0)
|
||
}
|
||
}
|
||
if (this._parameters.length === 0) {
|
||
this._parameters = EMPTY_PARAMS_ARRAY;
|
||
this._results = EMPTY_PARAMS_ARRAY
|
||
}
|
||
this._eventBlock.GetEventSheetManager()._RegisterCondition(this)
|
||
}
|
||
static Create(eventBlock, data, index) {
|
||
return C3.New(C3.Condition, eventBlock, data, index)
|
||
}
|
||
_PostInit() {
|
||
for (const param of this._parameters) {
|
||
param._PostInit();
|
||
if (param.VariesPerInstance())
|
||
this._anyParamVariesPerInstance = true
|
||
}
|
||
if (this._isFastTrigger) {
|
||
this.Run = this._RunFastTrigger;
|
||
this.DebugRun = this._DebugRunFastTrigger
|
||
} else if (this._systemPlugin) {
|
||
this._SetSystemRunMethod();
|
||
this.DebugRun = this._DebugRunSystem
|
||
} else if (this._objectClass.GetPlugin().IsSingleGlobal()) {
|
||
this._SetSingleGlobalRunMethod();
|
||
this.DebugRun = this._DebugRunSingleGlobal
|
||
} else if (this._isStatic) {
|
||
this.Run = this._RunStatic;
|
||
this.DebugRun = this._DebugRunStatic
|
||
} else {
|
||
this.Run = this._RunObject;
|
||
this.DebugRun = this._DebugRunObject
|
||
}
|
||
}
|
||
_SetSystemRunMethod() {
|
||
const plugin = this._systemPlugin;
|
||
const bindThis = this._systemPlugin;
|
||
this._SetRunMethodForBoundFunc(plugin, bindThis, this._RunSystem)
|
||
}
|
||
_SetSingleGlobalRunMethod() {
|
||
const plugin = this._objectClass.GetPlugin();
|
||
const bindThis = this._objectClass.GetSingleGlobalInstance().GetSdkInstance();
|
||
this._SetRunMethodForBoundFunc(plugin, bindThis, this._RunSingleGlobal)
|
||
}
|
||
_SetRunMethodForBoundFunc(plugin, bindThis, fallbackMethod) {
|
||
const func = this._func;
|
||
const isInverted = this._isInverted;
|
||
const parameters = this._parameters;
|
||
if (parameters.length === 0) {
|
||
const boundFunc = plugin._GetBoundACEMethod(func, bindThis);
|
||
if (isInverted)
|
||
this.Run = function RunSingleCnd_0param() {
|
||
return C3.xor(boundFunc(), isInverted)
|
||
}
|
||
;
|
||
else
|
||
this.Run = boundFunc
|
||
} else if (parameters.length === 1) {
|
||
const param0 = parameters[0];
|
||
if (!isInverted && param0.IsConstant())
|
||
this.Run = plugin._GetBoundACEMethod_1param(func, bindThis, param0.Get(0));
|
||
else {
|
||
const boundFunc = plugin._GetBoundACEMethod(func, bindThis);
|
||
this.Run = function RunSingleCnd_1param() {
|
||
return C3.xor(boundFunc(param0.Get(0)), isInverted)
|
||
}
|
||
}
|
||
} else if (parameters.length === 2) {
|
||
const param0 = parameters[0];
|
||
const param1 = parameters[1];
|
||
if (!isInverted && param0.IsConstant() && param1.IsConstant())
|
||
this.Run = plugin._GetBoundACEMethod_2params(func, bindThis, param0.Get(0), param1.Get(0));
|
||
else {
|
||
const boundFunc = plugin._GetBoundACEMethod(func, bindThis);
|
||
this.Run = function RunSingleCnd_2params() {
|
||
return C3.xor(boundFunc(param0.Get(0), param1.Get(0)), isInverted)
|
||
}
|
||
}
|
||
} else if (parameters.length === 3) {
|
||
const param0 = parameters[0];
|
||
const param1 = parameters[1];
|
||
const param2 = parameters[2];
|
||
if (!isInverted && param0.IsConstant() && param1.IsConstant() && param2.IsConstant())
|
||
this.Run = plugin._GetBoundACEMethod_3params(func, bindThis, param0.Get(0), param1.Get(0), param2.Get(0));
|
||
else {
|
||
const boundFunc = plugin._GetBoundACEMethod(func, bindThis);
|
||
this.Run = function RunSingleCnd_3params() {
|
||
return C3.xor(boundFunc(param0.Get(0), param1.Get(0), param2.Get(0)), isInverted)
|
||
}
|
||
}
|
||
} else
|
||
this.Run = fallbackMethod
|
||
}
|
||
GetSID() {
|
||
return this._sid
|
||
}
|
||
_GetFunc() {
|
||
return this._func
|
||
}
|
||
GetObjectClass() {
|
||
return this._objectClass
|
||
}
|
||
GetBehaviorType() {
|
||
return this._behaviorType
|
||
}
|
||
GetEventBlock() {
|
||
return this._eventBlock
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetIndex() {
|
||
return this._index
|
||
}
|
||
GetDebugIndex() {
|
||
return this.GetIndex()
|
||
}
|
||
IsTrigger() {
|
||
return this._isTrigger
|
||
}
|
||
IsFastTrigger() {
|
||
return this._isFastTrigger
|
||
}
|
||
IsInverted() {
|
||
return this._isInverted
|
||
}
|
||
IsLooping() {
|
||
return this._isLooping
|
||
}
|
||
IsBreakpoint() {
|
||
return this._debugData.isBreakpoint
|
||
}
|
||
_SetBreakpoint(b) {
|
||
this._debugData.isBreakpoint = !!b;
|
||
this._eventBlock._UpdateCanRunFastRecursive()
|
||
}
|
||
_DebugReturnsGenerator() {
|
||
return this._debugData.canDebug
|
||
}
|
||
DebugCanRunFast() {
|
||
return !this.IsBreakpoint() && !this._runtime.DebugBreakNext() && !this._DebugReturnsGenerator()
|
||
}
|
||
GetSavedDataMap() {
|
||
if (!this._savedData)
|
||
this._savedData = new Map;
|
||
return this._savedData
|
||
}
|
||
GetUnsavedDataMap() {
|
||
if (!this._unsavedData)
|
||
this._unsavedData = new Map;
|
||
return this._unsavedData
|
||
}
|
||
_RunSystem() {
|
||
const results = this._results;
|
||
EvalParams(this._parameters, results);
|
||
return C3.xor(this._func.apply(this._systemPlugin, results), this._isInverted)
|
||
}
|
||
*_DebugRunSystem() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
if (this._DebugReturnsGenerator()) {
|
||
const results = this._results;
|
||
EvalParams(this._parameters, results);
|
||
let ret = this._func.apply(this._systemPlugin, results);
|
||
if (C3.IsIterator(ret))
|
||
ret = yield*ret;
|
||
return C3.xor(ret, this._isInverted)
|
||
} else
|
||
return this.Run()
|
||
}
|
||
_RunSingleGlobal() {
|
||
const results = this._results;
|
||
EvalParams(this._parameters, results);
|
||
const inst = this._objectClass.GetSingleGlobalInstance().GetSdkInstance();
|
||
return C3.xor(this._func.apply(inst, results), this._isInverted)
|
||
}
|
||
*_DebugRunSingleGlobal() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
if (this._DebugReturnsGenerator()) {
|
||
const results = this._results;
|
||
EvalParams(this._parameters, results);
|
||
const inst = this._objectClass.GetSingleGlobalInstance().GetSdkInstance();
|
||
let ret = this._func.apply(inst, results);
|
||
if (C3.IsIterator(ret))
|
||
ret = yield*ret;
|
||
return C3.xor(ret, this._isInverted)
|
||
} else
|
||
return this.Run()
|
||
}
|
||
_RunFastTrigger() {
|
||
return true
|
||
}
|
||
*_DebugRunFastTrigger() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
return true
|
||
}
|
||
_RunStatic() {
|
||
const results = this._results;
|
||
EvalParams(this._parameters, results);
|
||
const ret = this._func.apply(this._behaviorType || this._objectClass, results);
|
||
this._objectClass.ApplySolToContainer();
|
||
return ret
|
||
}
|
||
*_DebugRunStatic() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
if (this._DebugReturnsGenerator()) {
|
||
const results = this._results;
|
||
EvalParams(this._parameters, results);
|
||
let ret = this._func.apply(this._behaviorType || this._objectClass, results);
|
||
if (C3.IsIterator(ret))
|
||
ret = yield*ret;
|
||
this._objectClass.ApplySolToContainer();
|
||
return ret
|
||
} else
|
||
return this.Run()
|
||
}
|
||
_RunObject() {
|
||
const parameters = this._parameters;
|
||
const results = this._results;
|
||
const sol = this._objectClass.GetCurrentSol();
|
||
for (let i = 0, len = parameters.length; i < len; ++i) {
|
||
const p = parameters[i];
|
||
if (!p.VariesPerInstance())
|
||
results[i] = p.Get(0)
|
||
}
|
||
if (sol.IsSelectAll())
|
||
return this._RunObject_FirstFilter(sol);
|
||
else
|
||
return this._RunObject_NextFilter(sol)
|
||
}
|
||
*_DebugRunObject() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
return this._RunObject()
|
||
}
|
||
_EvaluateVaryingParameters(solIndex) {
|
||
const parameters = this._parameters;
|
||
const results = this._results;
|
||
for (let i = 0, len = parameters.length; i < len; ++i) {
|
||
const p = parameters[i];
|
||
if (p.VariesPerInstance())
|
||
results[i] = p.Get(solIndex)
|
||
}
|
||
}
|
||
_RunObject_FirstFilter(sol) {
|
||
const objectClass = this._objectClass;
|
||
const isFamily = objectClass.IsFamily();
|
||
const familyIndex = objectClass.GetFamilyIndex();
|
||
const behaviorIndex = this._behaviorIndex;
|
||
const isBehavior = behaviorIndex >= 0;
|
||
const allInstances = objectClass.GetInstances();
|
||
const paramsVary = this._anyParamVariesPerInstance;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const isInverted = this._isInverted;
|
||
const isInOrBlock = this._isInOrBlock && !this._isTrigger;
|
||
sol.ClearArrays();
|
||
for (let i = 0, len = allInstances.length; i < len; ++i) {
|
||
const inst = allInstances[i];
|
||
if (paramsVary)
|
||
this._EvaluateVaryingParameters(i);
|
||
let ret;
|
||
if (isBehavior) {
|
||
const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0;
|
||
ret = func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results)
|
||
} else
|
||
ret = func.apply(inst.GetSdkInstance(), results);
|
||
if (C3.xor(ret, isInverted))
|
||
sol._PushInstance(inst);
|
||
else if (isInOrBlock)
|
||
sol._PushElseInstance(inst)
|
||
}
|
||
objectClass.FinishCondition(true);
|
||
sol._SetSelectAll(false);
|
||
objectClass.ApplySolToContainer();
|
||
return sol.HasAnyInstances()
|
||
}
|
||
_RunObject_NextFilter(sol) {
|
||
const objectClass = this._objectClass;
|
||
const isFamily = objectClass.IsFamily();
|
||
const familyIndex = objectClass.GetFamilyIndex();
|
||
const isInContainer = objectClass.IsInContainer();
|
||
const behaviorIndex = this._behaviorIndex;
|
||
const isBehavior = behaviorIndex >= 0;
|
||
const paramsVary = this._anyParamVariesPerInstance;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const isInverted = this._isInverted;
|
||
const isInOrBlock = this._isInOrBlock && !this._isTrigger;
|
||
const solInstances = sol._GetOwnInstances();
|
||
const solElseInstances = sol._GetOwnElseInstances();
|
||
const isUsingElseInstances = isInOrBlock && !this._eventBlock.IsFirstConditionOfType(this);
|
||
const arr = isUsingElseInstances ? solElseInstances : solInstances;
|
||
let k = 0;
|
||
let isAnyTrue = false;
|
||
for (let i = 0, len = arr.length; i < len; ++i) {
|
||
const inst = arr[i];
|
||
if (paramsVary)
|
||
this._EvaluateVaryingParameters(i);
|
||
let ret;
|
||
if (isBehavior) {
|
||
const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0;
|
||
ret = func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results)
|
||
} else
|
||
ret = func.apply(inst.GetSdkInstance(), results);
|
||
if (C3.xor(ret, isInverted)) {
|
||
isAnyTrue = true;
|
||
if (isUsingElseInstances) {
|
||
solInstances.push(inst);
|
||
if (isInContainer)
|
||
inst._PushSiblingsToSolInstances()
|
||
} else {
|
||
arr[k] = inst;
|
||
if (isInContainer)
|
||
inst._SetSiblingsToSolInstancesIndex(k);
|
||
++k
|
||
}
|
||
} else if (isUsingElseInstances) {
|
||
arr[k] = inst;
|
||
if (isInContainer)
|
||
inst._SetSiblingsToSolElseInstancesIndex(k);
|
||
++k
|
||
} else if (isInOrBlock) {
|
||
solElseInstances.push(inst);
|
||
if (isInContainer)
|
||
inst._PushSiblingsToSolElseInstances()
|
||
}
|
||
}
|
||
C3.truncateArray(arr, k);
|
||
if (isInContainer)
|
||
objectClass._TruncateContainerSols(isUsingElseInstances, k);
|
||
const pickInFinish = isAnyTrue;
|
||
if (isUsingElseInstances && !isAnyTrue)
|
||
isAnyTrue = this._OrBlockCheckInstances(solInstances);
|
||
objectClass.FinishCondition(pickInFinish || isInOrBlock);
|
||
return isInOrBlock ? isAnyTrue : sol.HasAnyInstances()
|
||
}
|
||
_OrBlockCheckInstances(solInstances) {
|
||
const objectClass = this._objectClass;
|
||
const isFamily = objectClass.IsFamily();
|
||
const familyIndex = objectClass.GetFamilyIndex();
|
||
const paramsVary = this._anyParamVariesPerInstance;
|
||
const behaviorIndex = this._behaviorIndex;
|
||
const isBehavior = behaviorIndex >= 0;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const isInverted = this._isInverted;
|
||
for (let i = 0, len = solInstances.length; i < len; ++i) {
|
||
const inst = solInstances[i];
|
||
if (paramsVary)
|
||
this._EvaluateVaryingParameters(i);
|
||
let ret;
|
||
if (isBehavior) {
|
||
const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0;
|
||
ret = func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results)
|
||
} else
|
||
ret = func.apply(inst.GetSdkInstance(), results);
|
||
if (C3.xor(ret, isInverted))
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
ReevaluateParameter(paramIndex, solIndex) {
|
||
return this._parameters[paramIndex].Get(solIndex)
|
||
}
|
||
GetFastTriggerValue() {
|
||
const parameters = this._parameters;
|
||
if (!parameters.length)
|
||
throw new Error("no parameters");
|
||
return parameters[0]._GetFastTriggerValue()
|
||
}
|
||
_SaveToJson() {
|
||
if (!this._savedData || !this._savedData.size)
|
||
return null;
|
||
const ex = {};
|
||
for (const [k,v] of this._savedData.entries()) {
|
||
let saveVal = v;
|
||
if (k === "collmemory")
|
||
saveVal = [...v.entries()].map(arr=>[arr[0].GetUID(), arr[1].GetUID(), arr[2]]);
|
||
ex[k] = saveVal
|
||
}
|
||
return {
|
||
"ex": ex
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (this._savedData) {
|
||
this._savedData.clear();
|
||
this._savedData = null
|
||
}
|
||
if (!o)
|
||
return;
|
||
const runtime = this._runtime;
|
||
const ex = o["ex"];
|
||
if (ex) {
|
||
const map = this.GetSavedDataMap();
|
||
map.clear();
|
||
for (const [k,v] of Object.entries(ex)) {
|
||
let loadVal = v;
|
||
if (k === "collmemory")
|
||
loadVal = C3.New(C3.PairMap, v.map(arr=>[runtime.GetInstanceByUID(arr[0]), runtime.GetInstanceByUID(arr[1]), arr[2]]).filter(arr=>arr[0] && arr[1]));
|
||
map.set(k, loadVal)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const assert = self.assert;
|
||
function EvalParams(parameters, results) {
|
||
for (let i = 0, len = parameters.length; i < len; ++i)
|
||
results[i] = parameters[i].Get(0)
|
||
}
|
||
const EMPTY_PARAMS_ARRAY = [];
|
||
const noop = function() {};
|
||
const noopGenerator = function*() {};
|
||
C3.Action = class Action extends C3.DefendedBase {
|
||
constructor(eventBlock, data, index) {
|
||
super();
|
||
this._eventBlock = eventBlock;
|
||
const runtime = eventBlock.GetRuntime();
|
||
this._runtime = runtime;
|
||
this._index = index;
|
||
this._sid = data.length >= 4 ? data[3] : -1;
|
||
this._actionReturnType = data.length >= 5 ? data[4] : 0;
|
||
this._func = null;
|
||
this._objectClass = null;
|
||
this._behaviorType = null;
|
||
this._behaviorIndex = -1;
|
||
this._systemPlugin = null;
|
||
this._callFunctionName = "";
|
||
this._callEventBlock = null;
|
||
this._combinedSolModifiers = null;
|
||
this.Run = noop;
|
||
this.DebugRun = noop;
|
||
this._parameters = [];
|
||
this._results = [];
|
||
this._anyParamVariesPerInstance = false;
|
||
this._savedData = null;
|
||
this._unsavedData = null;
|
||
const isScript = data[0] === -3;
|
||
const debugInfo = isScript ? data[2] : data[5];
|
||
this._debugData = runtime.IsDebug() || isScript ? {
|
||
isBreakpoint: debugInfo[0],
|
||
canDebug: debugInfo[1],
|
||
index: debugInfo[2]
|
||
} : null;
|
||
if (data[0] === -1) {
|
||
this._systemPlugin = runtime.GetSystemPlugin();
|
||
this._func = runtime.GetObjectReference(data[1])
|
||
} else if (data[0] === -2)
|
||
this._callFunctionName = data[1];
|
||
else if (isScript) {
|
||
const userMethod = runtime.GetObjectReference(data[1]);
|
||
this._func = userMethod;
|
||
this.Run = this.RunUserScript;
|
||
this.DebugRun = this.DebugRunUserScript;
|
||
this._actionReturnType = 1
|
||
} else {
|
||
this._func = runtime.GetObjectReference(data[1]);
|
||
this._objectClass = runtime.GetObjectClassByIndex(data[0]);
|
||
if (data[2]) {
|
||
this._behaviorType = this._objectClass.GetBehaviorTypeByName(data[2]);
|
||
this._behaviorIndex = this._objectClass.GetBehaviorIndexByName(data[2])
|
||
}
|
||
}
|
||
if (data.length === 7) {
|
||
const paramData = data[6];
|
||
for (const data of paramData) {
|
||
this._parameters.push(C3.Parameter.Create(this, data, this._parameters.length));
|
||
this._results.push(0)
|
||
}
|
||
}
|
||
if (this._parameters.length === 0) {
|
||
this._parameters = EMPTY_PARAMS_ARRAY;
|
||
this._results = EMPTY_PARAMS_ARRAY
|
||
}
|
||
this._eventBlock.GetEventSheetManager()._RegisterAction(this)
|
||
}
|
||
static Create(eventBlock, data, index) {
|
||
return C3.New(C3.Action, eventBlock, data, index)
|
||
}
|
||
_PostInit() {
|
||
for (const param of this._parameters) {
|
||
param._PostInit();
|
||
if (param.VariesPerInstance())
|
||
this._anyParamVariesPerInstance = true
|
||
}
|
||
if (this._systemPlugin) {
|
||
this._SetSystemRunMethod();
|
||
this.DebugRun = this._DebugRunSystem
|
||
} else if (this._callFunctionName) {
|
||
this._SetCallFunctionRunMethod();
|
||
this._callFunctionName = ""
|
||
} else if (this.Run === this.RunUserScript) {
|
||
const userMethod = this._func;
|
||
const localVars = this._runtime.GetEventSheetManager()._GetLocalVariablesScriptInterface(this._eventBlock);
|
||
this._func = userMethod.bind(null, this._runtime.GetIRuntime(), localVars)
|
||
} else if (this._behaviorType)
|
||
if (this.IsAsync()) {
|
||
this.Run = this._RunBehavior_Async;
|
||
this.DebugRun = this._DebugRunBehavior_Async
|
||
} else {
|
||
this.Run = this._RunBehavior;
|
||
this.DebugRun = this._DebugRunBehavior
|
||
}
|
||
else if (this._objectClass.GetPlugin().IsSingleGlobal()) {
|
||
this._SetSingleGlobalRunMethod();
|
||
this.DebugRun = this._DebugRunSingleGlobal
|
||
} else if (this.IsAsync()) {
|
||
this.Run = this._RunObject_Async;
|
||
this.DebugRun = this._DebugRunObject_Async
|
||
} else if (!this._parameters.length) {
|
||
this.Run = this._RunObject_ParamsConst;
|
||
this.DebugRun = this._DebugRunObject_ParamsConst
|
||
} else if (this._parameters.every(p=>p.VariesPerInstance())) {
|
||
this.Run = this._RunObject_AllParamsVary;
|
||
this.DebugRun = this._DebugRunObject_AllParamsVary
|
||
} else if (this._anyParamVariesPerInstance) {
|
||
this.Run = this._RunObject_SomeParamsVary;
|
||
this.DebugRun = this._DebugRunObject_SomeParamsVary
|
||
} else if (this._parameters.every(p=>p.IsConstant())) {
|
||
EvalParams(this._parameters, this._results);
|
||
this.Run = this._RunObject_ParamsConst;
|
||
this.DebugRun = this._DebugRunObject_ParamsConst
|
||
} else {
|
||
this.Run = this._RunObject_ParamsDontVary;
|
||
this.DebugRun = this._DebugRunObject_ParamsDontVary
|
||
}
|
||
}
|
||
_SetSystemRunMethod() {
|
||
const plugin = this._systemPlugin;
|
||
const bindThis = this._systemPlugin;
|
||
this._SetRunMethodForBoundFunc(plugin, bindThis, this._RunSystem)
|
||
}
|
||
_SetSingleGlobalRunMethod() {
|
||
const plugin = this._objectClass.GetPlugin();
|
||
const bindThis = this._objectClass.GetSingleGlobalInstance().GetSdkInstance();
|
||
this._SetRunMethodForBoundFunc(plugin, bindThis, this._RunSingleGlobal)
|
||
}
|
||
_SetCallFunctionRunMethod() {
|
||
const eventSheetManager = this._eventBlock.GetEventSheetManager();
|
||
const functionBlock = eventSheetManager.GetFunctionBlockByName(this._callFunctionName);
|
||
if (functionBlock.IsEnabled()) {
|
||
this._callEventBlock = functionBlock.GetEventBlock();
|
||
this._combinedSolModifiers = [...new Set([...this._eventBlock.GetSolModifiersIncludingParents(), ...this._callEventBlock.GetSolModifiersIncludingParents()])];
|
||
this._combinedSolModifiers = eventSheetManager._DeduplicateSolModifierList(this._combinedSolModifiers);
|
||
this.Run = C3.EventBlock.prototype.RunAsFunctionCall.bind(this._callEventBlock, this._combinedSolModifiers, this._parameters);
|
||
this.DebugRun = this._DebugRunCallFunction
|
||
} else {
|
||
this.Run = noop;
|
||
this.DebugRun = noopGenerator
|
||
}
|
||
}
|
||
_SetRunMethodForBoundFunc(plugin, bindThis, fallbackMethod) {
|
||
const func = this._func;
|
||
const parameters = this._parameters;
|
||
if (parameters.length === 0)
|
||
this.Run = plugin._GetBoundACEMethod(func, bindThis);
|
||
else if (parameters.length === 1) {
|
||
const param0 = parameters[0];
|
||
if (param0.IsConstant())
|
||
this.Run = plugin._GetBoundACEMethod_1param(func, bindThis, param0.Get(0));
|
||
else {
|
||
const boundFunc = plugin._GetBoundACEMethod(func, bindThis);
|
||
this.Run = function RunSingleAct_1param() {
|
||
return boundFunc(param0.Get(0))
|
||
}
|
||
}
|
||
} else if (parameters.length === 2) {
|
||
const param0 = parameters[0];
|
||
const param1 = parameters[1];
|
||
if (param0.IsConstant() && param1.IsConstant())
|
||
this.Run = plugin._GetBoundACEMethod_2params(func, bindThis, param0.Get(0), param1.Get(0));
|
||
else {
|
||
const boundFunc = plugin._GetBoundACEMethod(func, bindThis);
|
||
this.Run = function RunSingleAct_2params() {
|
||
return boundFunc(param0.Get(0), param1.Get(0))
|
||
}
|
||
}
|
||
} else if (parameters.length === 3) {
|
||
const param0 = parameters[0];
|
||
const param1 = parameters[1];
|
||
const param2 = parameters[2];
|
||
if (param0.IsConstant() && param1.IsConstant() && param2.IsConstant())
|
||
this.Run = plugin._GetBoundACEMethod_3params(func, bindThis, param0.Get(0), param1.Get(0), param2.Get(0));
|
||
else {
|
||
const boundFunc = plugin._GetBoundACEMethod(func, bindThis);
|
||
this.Run = function RunSingleAct_3params() {
|
||
return boundFunc(param0.Get(0), param1.Get(0), param2.Get(0))
|
||
}
|
||
}
|
||
} else
|
||
this.Run = fallbackMethod
|
||
}
|
||
GetSID() {
|
||
return this._sid
|
||
}
|
||
IsAsync() {
|
||
return this._actionReturnType === 1
|
||
}
|
||
CanBailOut() {
|
||
return this._actionReturnType === 2
|
||
}
|
||
HasReturnType() {
|
||
return this._actionReturnType !== 0
|
||
}
|
||
GetObjectClass() {
|
||
return this._objectClass
|
||
}
|
||
GetEventBlock() {
|
||
return this._eventBlock
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetIndex() {
|
||
return this._index
|
||
}
|
||
GetDebugIndex() {
|
||
return this._debugData.index
|
||
}
|
||
GetCombinedSolModifiers() {
|
||
return this._combinedSolModifiers
|
||
}
|
||
IsBreakpoint() {
|
||
return this._debugData.isBreakpoint
|
||
}
|
||
_SetBreakpoint(b) {
|
||
this._debugData.isBreakpoint = !!b;
|
||
this._eventBlock._UpdateCanRunFastRecursive()
|
||
}
|
||
_DebugReturnsGenerator() {
|
||
return this._debugData.canDebug
|
||
}
|
||
DebugCanRunFast() {
|
||
return !this.IsBreakpoint() && !this._runtime.DebugBreakNext() && !this._DebugReturnsGenerator()
|
||
}
|
||
GetSavedDataMap() {
|
||
if (!this._savedData)
|
||
this._savedData = new Map;
|
||
return this._savedData
|
||
}
|
||
GetUnsavedDataMap() {
|
||
if (!this._unsavedData)
|
||
this._unsavedData = new Map;
|
||
return this._unsavedData
|
||
}
|
||
_RunSystem() {
|
||
const results = this._results;
|
||
EvalParams(this._parameters, results);
|
||
return this._func.apply(this._systemPlugin, results)
|
||
}
|
||
*_DebugRunSystem() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
if (this._DebugReturnsGenerator()) {
|
||
const results = this._results;
|
||
EvalParams(this._parameters, results);
|
||
const ret = yield*this._func.apply(this._systemPlugin, results);
|
||
return ret
|
||
} else
|
||
return this.Run()
|
||
}
|
||
*_DebugRunCallFunction() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
const ret = yield*this._callEventBlock.DebugRunAsFunctionCall(this._combinedSolModifiers, this._parameters);
|
||
return ret
|
||
}
|
||
_RunSingleGlobal() {
|
||
const results = this._results;
|
||
EvalParams(this._parameters, results);
|
||
return this._func.apply(this._objectClass.GetSingleGlobalInstance().GetSdkInstance(), results)
|
||
}
|
||
*_DebugRunSingleGlobal() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
if (this._DebugReturnsGenerator()) {
|
||
const results = this._results;
|
||
EvalParams(this._parameters, results);
|
||
const ret = yield*this._func.apply(this._objectClass.GetSingleGlobalInstance().GetSdkInstance(), results);
|
||
return ret
|
||
} else
|
||
return this.Run()
|
||
}
|
||
_RunObject_ParamsConst() {
|
||
const results = this._results;
|
||
const instances = this._objectClass.GetCurrentSol().GetInstances();
|
||
for (let i = 0, len = instances.length; i < len; ++i)
|
||
this._func.apply(instances[i].GetSdkInstance(), results)
|
||
}
|
||
*_DebugRunObject_ParamsConst() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
if (this._DebugReturnsGenerator()) {
|
||
const results = this._results;
|
||
const instances = this._objectClass.GetCurrentSol().GetInstances();
|
||
for (let i = 0, len = instances.length; i < len; ++i)
|
||
yield*this._func.apply(instances[i].GetSdkInstance(), results)
|
||
} else
|
||
this._RunObject_ParamsConst()
|
||
}
|
||
_RunObject_ParamsDontVary() {
|
||
const results = this._results;
|
||
EvalParams(this._parameters, results);
|
||
const instances = this._objectClass.GetCurrentSol().GetInstances();
|
||
for (let i = 0, len = instances.length; i < len; ++i)
|
||
this._func.apply(instances[i].GetSdkInstance(), results)
|
||
}
|
||
*_DebugRunObject_ParamsDontVary() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
if (this._DebugReturnsGenerator()) {
|
||
const results = this._results;
|
||
EvalParams(this._parameters, results);
|
||
const instances = this._objectClass.GetCurrentSol().GetInstances();
|
||
for (let i = 0, len = instances.length; i < len; ++i)
|
||
yield*this._func.apply(instances[i].GetSdkInstance(), results)
|
||
} else
|
||
this._RunObject_ParamsDontVary()
|
||
}
|
||
_RunObject_AllParamsVary() {
|
||
const parameters = this._parameters;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const instances = this._objectClass.GetCurrentSol().GetInstances();
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
for (let j = 0, lenj = parameters.length; j < lenj; ++j)
|
||
results[j] = parameters[j].Get(i);
|
||
func.apply(inst.GetSdkInstance(), results)
|
||
}
|
||
}
|
||
*_DebugRunObject_AllParamsVary() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
if (this._DebugReturnsGenerator()) {
|
||
const parameters = this._parameters;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const instances = this._objectClass.GetCurrentSol().GetInstances();
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
for (let j = 0, lenj = parameters.length; j < lenj; ++j)
|
||
results[j] = parameters[j].Get(i);
|
||
yield*func.apply(inst.GetSdkInstance(), results)
|
||
}
|
||
} else
|
||
this._RunObject_AllParamsVary()
|
||
}
|
||
_RunObject_SomeParamsVary() {
|
||
const parameters = this._parameters;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const instances = this._objectClass.GetCurrentSol().GetInstances();
|
||
for (let i = 0, len = parameters.length; i < len; ++i) {
|
||
const p = parameters[i];
|
||
if (!p.VariesPerInstance())
|
||
results[i] = p.Get(0)
|
||
}
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
for (let j = 0, lenj = parameters.length; j < lenj; ++j) {
|
||
const p = parameters[j];
|
||
if (p.VariesPerInstance())
|
||
results[j] = p.Get(i)
|
||
}
|
||
func.apply(inst.GetSdkInstance(), results)
|
||
}
|
||
}
|
||
*_DebugRunObject_SomeParamsVary() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
if (this._DebugReturnsGenerator()) {
|
||
const parameters = this._parameters;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const instances = this._objectClass.GetCurrentSol().GetInstances();
|
||
for (let i = 0, len = parameters.length; i < len; ++i) {
|
||
const p = parameters[i];
|
||
if (!p.VariesPerInstance())
|
||
results[i] = p.Get(0)
|
||
}
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
for (let j = 0, lenj = parameters.length; j < lenj; ++j) {
|
||
const p = parameters[j];
|
||
if (p.VariesPerInstance())
|
||
results[j] = p.Get(i)
|
||
}
|
||
yield*func.apply(inst.GetSdkInstance(), results)
|
||
}
|
||
} else
|
||
this._RunObject_SomeParamsVary()
|
||
}
|
||
_RunBehavior() {
|
||
const objectClass = this._objectClass;
|
||
const isFamily = objectClass.IsFamily();
|
||
const familyIndex = objectClass.GetFamilyIndex();
|
||
const parameters = this._parameters;
|
||
const paramsVary = this._anyParamVariesPerInstance;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const behaviorIndex = this._behaviorIndex;
|
||
const instances = objectClass.GetCurrentSol().GetInstances();
|
||
for (let i = 0, len = parameters.length; i < len; ++i) {
|
||
const p = parameters[i];
|
||
if (!p.VariesPerInstance())
|
||
results[i] = p.Get(0)
|
||
}
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
if (paramsVary)
|
||
for (let j = 0, lenj = parameters.length; j < lenj; ++j) {
|
||
const p = parameters[j];
|
||
if (p.VariesPerInstance())
|
||
results[j] = p.Get(i)
|
||
}
|
||
const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0;
|
||
func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results)
|
||
}
|
||
}
|
||
*_DebugRunBehavior() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
if (this._DebugReturnsGenerator()) {
|
||
const objectClass = this._objectClass;
|
||
const isFamily = objectClass.IsFamily();
|
||
const familyIndex = objectClass.GetFamilyIndex();
|
||
const parameters = this._parameters;
|
||
const paramsVary = this._anyParamVariesPerInstance;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const behaviorIndex = this._behaviorIndex;
|
||
const instances = objectClass.GetCurrentSol().GetInstances();
|
||
for (let i = 0, len = parameters.length; i < len; ++i) {
|
||
const p = parameters[i];
|
||
if (!p.VariesPerInstance())
|
||
results[i] = p.Get(0)
|
||
}
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
if (paramsVary)
|
||
for (let j = 0, lenj = parameters.length; j < lenj; ++j) {
|
||
const p = parameters[j];
|
||
if (p.VariesPerInstance())
|
||
results[j] = p.Get(i)
|
||
}
|
||
const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0;
|
||
yield*func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results)
|
||
}
|
||
} else
|
||
this._RunBehavior()
|
||
}
|
||
_RunObject_Async() {
|
||
const parameters = this._parameters;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const instances = this._objectClass.GetCurrentSol().GetInstances();
|
||
const promises = [];
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
for (let j = 0, lenj = parameters.length; j < lenj; ++j)
|
||
results[j] = parameters[j].Get(i);
|
||
promises.push(func.apply(inst.GetSdkInstance(), results))
|
||
}
|
||
return Promise.all(promises)
|
||
}
|
||
*_DebugRunObject_Async() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
if (this._DebugReturnsGenerator()) {
|
||
const parameters = this._parameters;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const instances = this._objectClass.GetCurrentSol().GetInstances();
|
||
const promises = [];
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
for (let j = 0, lenj = parameters.length; j < lenj; ++j)
|
||
results[j] = parameters[j].Get(i);
|
||
promises.push(yield*func.apply(inst.GetSdkInstance(), results))
|
||
}
|
||
return Promise.all(promises)
|
||
} else
|
||
return this._RunObject_Async()
|
||
}
|
||
_RunBehavior_Async() {
|
||
const objectClass = this._objectClass;
|
||
const isFamily = objectClass.IsFamily();
|
||
const familyIndex = objectClass.GetFamilyIndex();
|
||
const parameters = this._parameters;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const behaviorIndex = this._behaviorIndex;
|
||
const instances = objectClass.GetCurrentSol().GetInstances();
|
||
const promises = [];
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
for (let j = 0, lenj = parameters.length; j < lenj; ++j)
|
||
results[j] = parameters[j].Get(i);
|
||
const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0;
|
||
promises.push(func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results))
|
||
}
|
||
return Promise.all(promises)
|
||
}
|
||
*_DebugRunBehavior_Async() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
if (this._DebugReturnsGenerator()) {
|
||
const objectClass = this._objectClass;
|
||
const isFamily = objectClass.IsFamily();
|
||
const familyIndex = objectClass.GetFamilyIndex();
|
||
const parameters = this._parameters;
|
||
const results = this._results;
|
||
const func = this._func;
|
||
const behaviorIndex = this._behaviorIndex;
|
||
const instances = objectClass.GetCurrentSol().GetInstances();
|
||
const promises = [];
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
for (let j = 0, lenj = parameters.length; j < lenj; ++j)
|
||
results[j] = parameters[j].Get(i);
|
||
const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0;
|
||
promises.push(yield*func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results))
|
||
}
|
||
return Promise.all(promises)
|
||
} else
|
||
return this._RunBehavior_Async()
|
||
}
|
||
async RunUserScript() {
|
||
try {
|
||
await this._func()
|
||
} catch (err) {
|
||
console.error(`Unhandled exception running script %c${this._eventBlock.GetEventSheet().GetName()}, event ${this._eventBlock.GetDisplayNumber()}, action ${this.GetDebugIndex() + 1}:`, "font-size: 1.2em; font-weight: bold;", err);
|
||
if (self.C3Debugger)
|
||
self.C3Debugger._SetLastErrorScript(this);
|
||
if (!C3.EventScript.HadUserScriptException()) {
|
||
console.info(`%cTip:%c run this to highlight in Construct the last script that had an error: %cgoToLastErrorScript()`, "font-weight: bold; text-decoration: underline", "", "font-weight: bold");
|
||
C3.EventScript.SetHadUserScriptException()
|
||
}
|
||
}
|
||
}
|
||
*DebugRunUserScript() {
|
||
if (this.IsBreakpoint() || this._runtime.DebugBreakNext())
|
||
yield this;
|
||
return this.RunUserScript()
|
||
}
|
||
_SaveToJson() {
|
||
if (!this._savedData || !this._savedData.size)
|
||
return null;
|
||
return {
|
||
"ex": C3.ToSuperJSON(this._savedData)
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (this._savedData) {
|
||
this._savedData.clear();
|
||
this._savedData = null
|
||
}
|
||
if (!o)
|
||
return;
|
||
const ex = o["ex"];
|
||
if (ex)
|
||
this._savedData = C3.FromSuperJSON(ex)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const tempColor = new C3.Color;
|
||
function CompareX(cmp, x) {
|
||
return C3.compare(this.GetWorldInfo().GetX(), cmp, x)
|
||
}
|
||
function CompareY(cmp, y) {
|
||
return C3.compare(this.GetWorldInfo().GetY(), cmp, y)
|
||
}
|
||
function IsOnScreen() {
|
||
const wi = this.GetWorldInfo();
|
||
return wi.IsInViewport(wi.GetLayer().GetViewport())
|
||
}
|
||
function IsOutsideLayout() {
|
||
const wi = this.GetWorldInfo();
|
||
const layout = wi.GetLayout();
|
||
const bbox = wi.GetBoundingBox();
|
||
return bbox.getRight() < 0 || bbox.getBottom() < 0 || bbox.getLeft() > layout.GetWidth() || bbox.getTop() > layout.GetHeight()
|
||
}
|
||
function PickDistance(which, x, y) {
|
||
const sol = this.GetCurrentSol();
|
||
const instances = sol.GetInstances();
|
||
if (!instances.length)
|
||
return false;
|
||
let inst = instances[0];
|
||
let wi = inst.GetWorldInfo();
|
||
let pickme = inst;
|
||
let dist2 = C3.distanceSquared(wi.GetX(), wi.GetY(), x, y);
|
||
for (let i = 1, len = instances.length; i < len; ++i) {
|
||
inst = instances[i];
|
||
wi = inst.GetWorldInfo();
|
||
const d2 = C3.distanceSquared(wi.GetX(), wi.GetY(), x, y);
|
||
if (which === 0 && d2 < dist2 || which === 1 && d2 > dist2) {
|
||
dist2 = d2;
|
||
pickme = inst
|
||
}
|
||
}
|
||
sol.PickOne(pickme);
|
||
return true
|
||
}
|
||
function SetX(x) {
|
||
const wi = this.GetWorldInfo();
|
||
if (wi.GetX() === x)
|
||
return;
|
||
wi.SetX(x);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function SetY(y) {
|
||
const wi = this.GetWorldInfo();
|
||
if (wi.GetY() === y)
|
||
return;
|
||
wi.SetY(y);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function SetPos(x, y) {
|
||
const wi = this.GetWorldInfo();
|
||
if (wi.EqualsXY(x, y))
|
||
return;
|
||
wi.SetXY(x, y);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function SetPosToObject(objectClass, imgPt) {
|
||
if (!objectClass)
|
||
return;
|
||
const inst = objectClass.GetPairedInstance(this._inst);
|
||
if (!inst)
|
||
return;
|
||
const [x,y] = inst.GetImagePoint(imgPt);
|
||
const wi = this.GetWorldInfo();
|
||
if (wi.GetX() === x && wi.GetY() === y)
|
||
return;
|
||
wi.SetXY(x, y);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function MoveForward(dist) {
|
||
if (dist === 0)
|
||
return;
|
||
const wi = this.GetWorldInfo();
|
||
wi.OffsetXY(wi.GetCosAngle() * dist, wi.GetSinAngle() * dist);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function MoveAtAngle(a, dist) {
|
||
if (dist === 0)
|
||
return;
|
||
const wi = this.GetWorldInfo();
|
||
a = C3.toRadians(a);
|
||
wi.OffsetXY(Math.cos(a) * dist, Math.sin(a) * dist);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function GetX() {
|
||
return this.GetWorldInfo().GetX()
|
||
}
|
||
function GetY() {
|
||
return this.GetWorldInfo().GetY()
|
||
}
|
||
function GetDt() {
|
||
return this._runtime.GetDt(this._inst)
|
||
}
|
||
function CompareWidth(cmp, w) {
|
||
return C3.compare(this.GetWorldInfo().GetWidth(), cmp, w)
|
||
}
|
||
function CompareHeight(cmp, h) {
|
||
return C3.compare(this.GetWorldInfo().GetHeight(), cmp, h)
|
||
}
|
||
function SetWidth(w) {
|
||
const wi = this.GetWorldInfo();
|
||
if (wi.GetWidth() === w)
|
||
return;
|
||
wi.SetWidth(w);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function SetHeight(h) {
|
||
const wi = this.GetWorldInfo();
|
||
if (wi.GetHeight() === h)
|
||
return;
|
||
wi.SetHeight(h);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function SetSize(w, h) {
|
||
const wi = this.GetWorldInfo();
|
||
if (wi.GetWidth() === w && wi.GetHeight() === h)
|
||
return;
|
||
wi.SetSize(w, h);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function GetWidth() {
|
||
return this.GetWorldInfo().GetWidth()
|
||
}
|
||
function GetHeight() {
|
||
return this.GetWorldInfo().GetHeight()
|
||
}
|
||
function GetBboxLeft() {
|
||
return this.GetWorldInfo().GetBoundingBox().getLeft()
|
||
}
|
||
function GetBboxTop() {
|
||
return this.GetWorldInfo().GetBoundingBox().getTop()
|
||
}
|
||
function GetBboxRight() {
|
||
return this.GetWorldInfo().GetBoundingBox().getRight()
|
||
}
|
||
function GetBboxBottom() {
|
||
return this.GetWorldInfo().GetBoundingBox().getBottom()
|
||
}
|
||
function IsAngleWithin(within, a) {
|
||
return C3.angleDiff(this.GetWorldInfo().GetAngle(), C3.toRadians(a)) <= C3.toRadians(within)
|
||
}
|
||
function IsAngleClockwiseFrom(a) {
|
||
return C3.angleClockwise(this.GetWorldInfo().GetAngle(), C3.toRadians(a))
|
||
}
|
||
function IsBetweenAngles(a, b) {
|
||
const lower = C3.toRadians(a);
|
||
const upper = C3.toRadians(b);
|
||
const angle = this.GetWorldInfo().GetAngle();
|
||
const obtuse = !C3.angleClockwise(upper, lower);
|
||
if (obtuse)
|
||
return !(!C3.angleClockwise(angle, lower) && C3.angleClockwise(angle, upper));
|
||
else
|
||
return C3.angleClockwise(angle, lower) && !C3.angleClockwise(angle, upper)
|
||
}
|
||
function SetAngle(a) {
|
||
const wi = this.GetWorldInfo();
|
||
const newAngle = C3.clampAngle(C3.toRadians(a));
|
||
if (isNaN(newAngle) || wi.GetAngle() === newAngle)
|
||
return;
|
||
wi.SetAngle(newAngle);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function RotateClockwise(a) {
|
||
if (isNaN(a) || a === 0)
|
||
return;
|
||
const wi = this.GetWorldInfo();
|
||
wi.SetAngle(wi.GetAngle() + C3.toRadians(a));
|
||
wi.SetBboxChanged()
|
||
}
|
||
function RotateCounterclockwise(a) {
|
||
if (isNaN(a) || a === 0)
|
||
return;
|
||
const wi = this.GetWorldInfo();
|
||
wi.SetAngle(wi.GetAngle() - C3.toRadians(a));
|
||
wi.SetBboxChanged()
|
||
}
|
||
function RotateTowardAngle(amt, target) {
|
||
const wi = this.GetWorldInfo();
|
||
const a = wi.GetAngle();
|
||
const newAngle = C3.angleRotate(a, C3.toRadians(target), C3.toRadians(amt));
|
||
if (isNaN(newAngle) || a === newAngle)
|
||
return;
|
||
wi.SetAngle(newAngle);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function RotateTowardPosition(amt, x, y) {
|
||
const wi = this.GetWorldInfo();
|
||
const a = wi.GetAngle();
|
||
const dx = x - wi.GetX();
|
||
const dy = y - wi.GetY();
|
||
const target = Math.atan2(dy, dx);
|
||
const newAngle = C3.angleRotate(a, target, C3.toRadians(amt));
|
||
if (isNaN(newAngle) || a === newAngle)
|
||
return;
|
||
wi.SetAngle(newAngle);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function SetTowardPosition(x, y) {
|
||
const wi = this.GetWorldInfo();
|
||
const a = wi.GetAngle();
|
||
const dx = x - wi.GetX();
|
||
const dy = y - wi.GetY();
|
||
const newAngle = Math.atan2(dy, dx);
|
||
if (isNaN(newAngle) || a === newAngle)
|
||
return;
|
||
wi.SetAngle(newAngle);
|
||
wi.SetBboxChanged()
|
||
}
|
||
function GetAngle() {
|
||
return C3.toDegrees(this.GetWorldInfo().GetAngle())
|
||
}
|
||
function CompareOpacity(cmp, x) {
|
||
return C3.compare(C3.round6dp(this.GetWorldInfo().GetOpacity() * 100), cmp, x)
|
||
}
|
||
function IsVisible() {
|
||
return this.GetWorldInfo().IsVisible()
|
||
}
|
||
function SetVisible(v) {
|
||
const wi = this.GetWorldInfo();
|
||
if (v === 2)
|
||
v = !wi.IsVisible();
|
||
else
|
||
v = v !== 0;
|
||
if (wi.IsVisible() === v)
|
||
return;
|
||
wi.SetVisible(v);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
function SetOpacity(o) {
|
||
const newOpacity = C3.clamp(o / 100, 0, 1);
|
||
const wi = this.GetWorldInfo();
|
||
if (wi.GetOpacity() === newOpacity)
|
||
return;
|
||
wi.SetOpacity(newOpacity);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
function SetDefaultColor(rgb) {
|
||
tempColor.setFromRgbValue(rgb);
|
||
const wi = this.GetWorldInfo();
|
||
if (wi.GetUnpremultipliedColor().equalsIgnoringAlpha(tempColor))
|
||
return;
|
||
wi.SetUnpremultipliedColor(tempColor);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
function GetColor() {
|
||
const c = this.GetWorldInfo().GetUnpremultipliedColor();
|
||
return C3.PackRGBAEx(c.getR(), c.getG(), c.getB(), c.getA())
|
||
}
|
||
function GetOpacity() {
|
||
return C3.round6dp(this.GetWorldInfo().GetOpacity() * 100)
|
||
}
|
||
function IsOnLayer(layer) {
|
||
if (!layer)
|
||
return false;
|
||
return this.GetWorldInfo().GetLayer() === layer
|
||
}
|
||
function PickTopBottom(which) {
|
||
const sol = this.GetCurrentSol();
|
||
const instances = sol.GetInstances();
|
||
if (!instances.length)
|
||
return false;
|
||
let inst = instances[0];
|
||
let pickme = inst;
|
||
for (let i = 1, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
const instWi = inst.GetWorldInfo();
|
||
const pickmeWi = pickme.GetWorldInfo();
|
||
const instLayerIndex = instWi.GetLayer().GetIndex();
|
||
const pickmeLayerIndex = pickmeWi.GetLayer().GetIndex();
|
||
if (which === 0) {
|
||
if (instLayerIndex > pickmeLayerIndex || instLayerIndex === pickmeLayerIndex && instWi.GetZIndex() > pickmeWi.GetZIndex())
|
||
pickme = inst
|
||
} else if (instLayerIndex < pickmeLayerIndex || instLayerIndex === pickmeLayerIndex && instWi.GetZIndex() < pickmeWi.GetZIndex())
|
||
pickme = inst
|
||
}
|
||
sol.PickOne(pickme);
|
||
return true
|
||
}
|
||
function CompareZElevation(which, cmp, value) {
|
||
const wi = this.GetWorldInfo();
|
||
const z = which === 0 ? wi.GetZElevation() : wi.GetTotalZElevation();
|
||
return C3.compare(z, cmp, value)
|
||
}
|
||
function MoveToTop() {
|
||
this.GetWorldInfo().ZOrderMoveToTop()
|
||
}
|
||
function MoveToBottom() {
|
||
this.GetWorldInfo().ZOrderMoveToBottom()
|
||
}
|
||
function MoveToLayer(layerMove) {
|
||
if (!layerMove)
|
||
return;
|
||
this.GetWorldInfo().ZOrderMoveToLayer(layerMove)
|
||
}
|
||
function ZMoveToObject(where, objectClass) {
|
||
const isAfter = where === 0;
|
||
if (!objectClass)
|
||
return;
|
||
const otherInst = objectClass.GetFirstPicked(this.GetInstance());
|
||
if (!otherInst)
|
||
return;
|
||
this.GetWorldInfo().ZOrderMoveAdjacentToInstance(otherInst, isAfter)
|
||
}
|
||
function SetZElevation(z) {
|
||
const wi = this.GetWorldInfo();
|
||
if (wi.GetZElevation() === z)
|
||
return;
|
||
wi.SetZElevation(z);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
function LayerNumber() {
|
||
return this.GetWorldInfo().GetLayer().GetIndex()
|
||
}
|
||
function LayerName() {
|
||
return this.GetWorldInfo().GetLayer().GetName()
|
||
}
|
||
function ZIndex() {
|
||
return this.GetWorldInfo().GetZIndex()
|
||
}
|
||
function ZElevation() {
|
||
return this.GetWorldInfo().GetZElevation()
|
||
}
|
||
function TotalZElevation() {
|
||
return this.GetWorldInfo().GetTotalZElevation()
|
||
}
|
||
function SetEffectEnabled(enabled, effectName) {
|
||
const effectType = this.GetObjectClass().GetEffectList().GetEffectTypeByName(effectName);
|
||
if (!effectType)
|
||
return;
|
||
const effectTypeIndex = effectType.GetIndex();
|
||
const e = enabled === 1;
|
||
const instFxList = this.GetWorldInfo().GetInstanceEffectList();
|
||
if (instFxList.IsEffectIndexActive(effectTypeIndex) === e)
|
||
return;
|
||
instFxList.SetEffectIndexActive(effectTypeIndex, e);
|
||
instFxList.UpdateActiveEffects();
|
||
this._runtime.UpdateRender()
|
||
}
|
||
function SetEffectParam(effectName, paramIndex, value) {
|
||
const effectType = this.GetObjectClass().GetEffectList().GetEffectTypeByName(effectName);
|
||
if (!effectType)
|
||
return;
|
||
const effectTypeIndex = effectType.GetIndex();
|
||
const instFxList = this.GetWorldInfo().GetInstanceEffectList();
|
||
const paramsArr = instFxList.GetEffectParametersForIndex(effectTypeIndex);
|
||
paramIndex = Math.floor(paramIndex);
|
||
if (paramIndex < 0 || paramIndex >= paramsArr.length)
|
||
return;
|
||
const paramType = effectType.GetShaderProgram().GetParameterType(paramIndex);
|
||
if (paramType === "color") {
|
||
tempColor.setFromRgbValue(value);
|
||
const curColor = paramsArr[paramIndex];
|
||
if (tempColor.equalsIgnoringAlpha(curColor))
|
||
return;
|
||
curColor.copyRgb(tempColor)
|
||
} else {
|
||
if (paramType === "percent")
|
||
value /= 100;
|
||
if (paramsArr[paramIndex] === value)
|
||
return;
|
||
paramsArr[paramIndex] = value
|
||
}
|
||
if (instFxList.IsEffectIndexActive(effectTypeIndex))
|
||
this._runtime.UpdateRender()
|
||
}
|
||
function HasParent() {
|
||
return this.GetWorldInfo().HasParent()
|
||
}
|
||
function HasChildren() {
|
||
return this.GetWorldInfo().HasChildren()
|
||
}
|
||
function PickParent(parentObjectClass, which) {
|
||
const mySol = this.GetCurrentSol();
|
||
const myInstances = mySol.GetInstances();
|
||
if (myInstances.length === 0)
|
||
return false;
|
||
const parentSol = parentObjectClass.GetCurrentSol();
|
||
const parentInstances = parentSol.GetInstances();
|
||
if (parentInstances.length === 0)
|
||
return false;
|
||
const parentInstancesSet = new Set(parentInstances);
|
||
const pickParents = new Set;
|
||
for (let i = 0, len = myInstances.length; i < len; ++i) {
|
||
const myInst = myInstances[i];
|
||
if (which === 1)
|
||
for (const parentInst of myInst.parents()) {
|
||
if (parentInst.BelongsToObjectClass(parentObjectClass) && parentInstancesSet.has(parentInst))
|
||
pickParents.add(parentInst)
|
||
}
|
||
else {
|
||
let parentInst;
|
||
if (which === 0) {
|
||
parentInst = myInst.GetParent();
|
||
if (parentInst === null)
|
||
continue
|
||
} else
|
||
parentInst = myInst.GetTopParent();
|
||
if (parentInst.BelongsToObjectClass(parentObjectClass) && parentInstancesSet.has(parentInst))
|
||
pickParents.add(parentInst)
|
||
}
|
||
}
|
||
if (pickParents.size === 0)
|
||
return false;
|
||
parentSol.SetSetPicked(pickParents);
|
||
parentObjectClass.ApplySolToContainer();
|
||
return true
|
||
}
|
||
function PickChildren(childObjectClass, which) {
|
||
const mySol = this.GetCurrentSol();
|
||
const myInstances = mySol.GetInstances();
|
||
if (myInstances.length === 0)
|
||
return false;
|
||
const childSol = childObjectClass.GetCurrentSol();
|
||
const childInstances = childSol.GetInstances();
|
||
if (childInstances.length === 0)
|
||
return false;
|
||
const childInstancesSet = new Set(childInstances);
|
||
const pickChildren = new Set;
|
||
for (let i = 0, len = myInstances.length; i < len; ++i) {
|
||
const myInst = myInstances[i];
|
||
if (which === 2 && !myInst.HasChildren() && myInst.BelongsToObjectClass(childObjectClass) && childInstancesSet.has(myInst))
|
||
pickChildren.add(myInst);
|
||
for (const childInst of which === 0 ? myInst.children() : myInst.allChildren()) {
|
||
if (which === 2 && childInst.HasChildren())
|
||
continue;
|
||
if (childInst.BelongsToObjectClass(childObjectClass) && childInstancesSet.has(childInst))
|
||
pickChildren.add(childInst)
|
||
}
|
||
}
|
||
if (pickChildren.size === 0)
|
||
return false;
|
||
childSol.SetSetPicked(pickChildren);
|
||
childObjectClass.ApplySolToContainer();
|
||
return true
|
||
}
|
||
function PickNthChild(childObjectClass, index) {
|
||
const mySol = this.GetCurrentSol();
|
||
const myInstances = mySol.GetInstances();
|
||
if (myInstances.length === 0)
|
||
return false;
|
||
const childSol = childObjectClass.GetCurrentSol();
|
||
const childInstances = childSol.GetInstances();
|
||
if (childInstances.length === 0)
|
||
return false;
|
||
const childInstancesSet = new Set(childInstances);
|
||
const pickChildren = [];
|
||
for (let i = 0, len = myInstances.length; i < len; ++i) {
|
||
const myInst = myInstances[i];
|
||
const childInst = myInst.GetChildAt(index);
|
||
if (childInst !== null && childInst.BelongsToObjectClass(childObjectClass) && childInstancesSet.has(childInst))
|
||
pickChildren.push(childInst)
|
||
}
|
||
if (pickChildren.length === 0)
|
||
return false;
|
||
childSol.SetArrayPicked(pickChildren);
|
||
childObjectClass.ApplySolToContainer();
|
||
return true
|
||
}
|
||
function CompareChildCount(cmp, count) {
|
||
return C3.compare(this._inst.GetChildCount(), cmp, count)
|
||
}
|
||
function AddChild(childObjectClass, transformX, transformY, transformWidth, transformHeight, transformAngle, transformZElevation, destroyWithParent) {
|
||
const inst = this._inst;
|
||
const actObjectClass = this._runtime.GetCurrentAction().GetObjectClass();
|
||
for (const child of childObjectClass.allCorrespondingInstances(inst, actObjectClass)) {
|
||
if (!child.GetPlugin().SupportsSceneGraph())
|
||
return;
|
||
inst.AddChild(child, {
|
||
transformX,
|
||
transformY,
|
||
transformWidth,
|
||
transformHeight,
|
||
transformAngle,
|
||
transformZElevation,
|
||
destroyWithParent
|
||
})
|
||
}
|
||
}
|
||
function RemoveChild(childObjectClass) {
|
||
const inst = this._inst;
|
||
const actObjectClass = this._runtime.GetCurrentAction().GetObjectClass();
|
||
for (const child of childObjectClass.allCorrespondingInstances(inst, actObjectClass))
|
||
inst.RemoveChild(child)
|
||
}
|
||
function RemoveFromParent() {
|
||
if (!this._inst.HasParent())
|
||
return;
|
||
const parent = this._inst.GetParent();
|
||
parent.RemoveChild(this._inst)
|
||
}
|
||
function ChildCount() {
|
||
return this._inst.GetChildCount()
|
||
}
|
||
function SetMeshSize(cols, rows) {
|
||
cols = Math.floor(cols);
|
||
rows = Math.floor(rows);
|
||
const wi = this.GetWorldInfo();
|
||
if (cols < 2 || rows < 2 || !isFinite(cols) || !isFinite(rows)) {
|
||
wi.ReleaseMesh();
|
||
wi.SetBboxChanged()
|
||
} else
|
||
wi.CreateMesh(cols, rows)
|
||
}
|
||
function SetMeshPoint(col, row, mode, posx, posy, texu, texv) {
|
||
const wi = this.GetWorldInfo();
|
||
const didBboxChange = wi.SetMeshPoint(col, row, {
|
||
mode: mode === 0 ? "absolute" : "relative",
|
||
x: posx,
|
||
y: posy,
|
||
u: texu,
|
||
v: texv
|
||
});
|
||
if (didBboxChange)
|
||
wi.SetBboxChanged()
|
||
}
|
||
function MeshColumns() {
|
||
const wi = this.GetWorldInfo();
|
||
return wi.HasMesh() ? wi.GetSourceMesh().GetHSize() : 0
|
||
}
|
||
function MeshRows() {
|
||
const wi = this.GetWorldInfo();
|
||
return wi.HasMesh() ? wi.GetSourceMesh().GetVSize() : 0
|
||
}
|
||
function SetElementVisible(v) {
|
||
const wi = this.GetWorldInfo();
|
||
if (v === 2)
|
||
v = !wi.IsVisible();
|
||
else
|
||
v = v !== 0;
|
||
if (wi.IsVisible() === v)
|
||
return;
|
||
wi.SetVisible(v)
|
||
}
|
||
function SetElementCSSStyle(prop, val) {
|
||
this.SetElementCSSStyle(prop, val)
|
||
}
|
||
function SetElementAttribute(attribName, value) {
|
||
this.SetElementAttribute(attribName, "" + value)
|
||
}
|
||
function RemoveElementAttribute(attribName) {
|
||
this.RemoveElementAttribute(attribName)
|
||
}
|
||
function SetElementFocus() {
|
||
this.FocusElement()
|
||
}
|
||
function SetElementBlur() {
|
||
this.BlurElement()
|
||
}
|
||
function IsElementFocused() {
|
||
return this.IsElementFocused()
|
||
}
|
||
function SetElementEnabled(e) {
|
||
this._SetEnabled(e !== 0)
|
||
}
|
||
function IsElementEnabled() {
|
||
return this._IsEnabled()
|
||
}
|
||
function CompareInstanceVar(iv, cmp, val) {
|
||
return C3.compare(this.GetInstance().GetInstanceVariableValue(iv), cmp, val)
|
||
}
|
||
function IsBoolInstanceVarSet(iv) {
|
||
return !!this.GetInstance().GetInstanceVariableValue(iv)
|
||
}
|
||
function PickInstVarHiLow(which, iv) {
|
||
const sol = this.GetCurrentSol();
|
||
const instances = sol.GetInstances();
|
||
if (!instances.length)
|
||
return false;
|
||
let inst = instances[0];
|
||
let pickme = inst;
|
||
let val = inst.GetInstanceVariableValue(iv);
|
||
for (let i = 1, len = instances.length; i < len; ++i) {
|
||
inst = instances[i];
|
||
const v = inst.GetInstanceVariableValue(iv);
|
||
if (which === 0 && v < val || which === 1 && v > val) {
|
||
val = v;
|
||
pickme = inst
|
||
}
|
||
}
|
||
sol.PickOne(pickme);
|
||
return true
|
||
}
|
||
function PickByUID(uid) {
|
||
if (this._runtime.GetCurrentCondition().IsInverted())
|
||
return PickByUID_Inverted(this, uid);
|
||
else
|
||
return PickByUID_Normal(this, uid)
|
||
}
|
||
function PickByUID_Normal(objectClass, uid) {
|
||
const inst = objectClass.GetRuntime().GetInstanceByUID(uid);
|
||
if (!inst)
|
||
return false;
|
||
const sol = objectClass.GetCurrentSol();
|
||
if (!sol.IsSelectAll() && !sol._GetOwnInstances().includes(inst))
|
||
return false;
|
||
if (objectClass.IsFamily()) {
|
||
if (inst.GetObjectClass().BelongsToFamily(objectClass)) {
|
||
sol.PickOne(inst);
|
||
objectClass.ApplySolToContainer();
|
||
return true
|
||
}
|
||
} else if (inst.GetObjectClass() === objectClass) {
|
||
sol.PickOne(inst);
|
||
objectClass.ApplySolToContainer();
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
function PickByUID_Inverted(objectClass, uid) {
|
||
const sol = objectClass.GetCurrentSol();
|
||
if (sol.IsSelectAll()) {
|
||
sol._SetSelectAll(false);
|
||
sol.ClearArrays();
|
||
const instances = objectClass.GetInstances();
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
if (inst.GetUID() === uid)
|
||
sol._PushElseInstance(inst);
|
||
else
|
||
sol._PushInstance(inst)
|
||
}
|
||
objectClass.ApplySolToContainer();
|
||
return !!sol._GetOwnInstances().length
|
||
} else {
|
||
const instances = sol._GetOwnInstances();
|
||
let j = 0;
|
||
for (let i = 0, len = instances.length; i < len; ++i) {
|
||
const inst = instances[i];
|
||
instances[j] = inst;
|
||
if (inst.GetUID() === uid)
|
||
sol._PushElseInstance(inst);
|
||
else
|
||
++j
|
||
}
|
||
C3.truncateArray(instances, j);
|
||
objectClass.ApplySolToContainer();
|
||
return !!instances.length
|
||
}
|
||
}
|
||
function Destroy() {
|
||
this._runtime.DestroyInstance(this._inst)
|
||
}
|
||
function OnCreated() {
|
||
return true
|
||
}
|
||
function OnDestroyed() {
|
||
return true
|
||
}
|
||
function SetInstanceVar(iv, value) {
|
||
this.GetInstance().SetInstanceVariableValue(iv, value)
|
||
}
|
||
function AddInstanceVar(iv, value) {
|
||
const instance = this.GetInstance();
|
||
const lastValue = instance.GetInstanceVariableValue(iv);
|
||
if (typeof lastValue === "number" && typeof value !== "number")
|
||
value = parseFloat(value);
|
||
else if (typeof lastValue === "string" && typeof value !== "string")
|
||
value = value.toString();
|
||
instance.SetInstanceVariableValue(iv, lastValue + value)
|
||
}
|
||
function SubInstanceVar(iv, value) {
|
||
const instance = this.GetInstance();
|
||
const lastValue = instance.GetInstanceVariableValue(iv);
|
||
if (typeof lastValue !== "number")
|
||
return;
|
||
if (typeof value !== "number")
|
||
value = parseFloat(value);
|
||
instance.SetInstanceVariableValue(iv, lastValue - value)
|
||
}
|
||
function SetBoolInstanceVar(iv, value) {
|
||
this.GetInstance().SetInstanceVariableValue(iv, value ? 1 : 0)
|
||
}
|
||
function ToggleBoolInstanceVar(iv) {
|
||
const instance = this.GetInstance();
|
||
instance.SetInstanceVariableValue(iv, instance.GetInstanceVariableValue(iv) === 0 ? 1 : 0)
|
||
}
|
||
function LoadFromJsonString(str) {
|
||
let o;
|
||
try {
|
||
o = JSON.parse(str)
|
||
} catch (err) {
|
||
console.error("Failed to load from JSON string: ", err);
|
||
return
|
||
}
|
||
this.GetInstance().LoadFromJson(o, "state")
|
||
}
|
||
function AsJSON() {
|
||
return JSON.stringify(this.GetInstance().SaveToJson("state"))
|
||
}
|
||
function ObjectTypeName() {
|
||
return this.GetInstance().GetObjectClass().GetName()
|
||
}
|
||
function Count() {
|
||
const expObjectClass = this._runtime.GetCurrentEventStackFrame().GetExpressionObjectClass();
|
||
let count = expObjectClass.GetInstanceCount();
|
||
const instancesPendingCreate = this._runtime._GetInstancesPendingCreate();
|
||
for (const inst of instancesPendingCreate)
|
||
if (expObjectClass.IsFamily()) {
|
||
if (inst.GetObjectClass().BelongsToFamily(expObjectClass))
|
||
++count
|
||
} else if (inst.GetObjectClass() === expObjectClass)
|
||
++count;
|
||
return count
|
||
}
|
||
function PickedCount() {
|
||
return this._runtime.GetCurrentEventStackFrame().GetExpressionObjectClass().GetCurrentSol().GetInstances().length
|
||
}
|
||
function GetIID() {
|
||
return this._inst.GetIID()
|
||
}
|
||
function GetUID() {
|
||
return this._inst.GetUID()
|
||
}
|
||
C3.AddCommonACEs = function AddCommonACEs(pluginData, pluginCtor) {
|
||
const isSingleGlobal = pluginData[1];
|
||
const hasPositionACEs = pluginData[3];
|
||
const hasSizeACEs = pluginData[4];
|
||
const hasAngleACEs = pluginData[5];
|
||
const hasAppearanceACEs = pluginData[6];
|
||
const hasZOrderACEs = pluginData[7];
|
||
const hasEffectsACEs = pluginData[8];
|
||
const hasElementACEs = pluginData[10];
|
||
const hasElementFocusACEs = pluginData[11];
|
||
const hasElementEnabledACEs = pluginData[12];
|
||
const hasSceneGraphACEs = pluginData[13];
|
||
const hasMeshACEs = pluginData[14];
|
||
const Cnds = pluginCtor.Cnds;
|
||
const Acts = pluginCtor.Acts;
|
||
const Exps = pluginCtor.Exps;
|
||
if (hasPositionACEs) {
|
||
Cnds.CompareX = CompareX;
|
||
Cnds.CompareY = CompareY;
|
||
Cnds.IsOnScreen = IsOnScreen;
|
||
Cnds.IsOutsideLayout = IsOutsideLayout;
|
||
Cnds.PickDistance = PickDistance;
|
||
Acts.SetX = SetX;
|
||
Acts.SetY = SetY;
|
||
Acts.SetPos = SetPos;
|
||
Acts.SetPosToObject = SetPosToObject;
|
||
Acts.MoveForward = MoveForward;
|
||
Acts.MoveAtAngle = MoveAtAngle;
|
||
Exps.X = GetX;
|
||
Exps.Y = GetY;
|
||
Exps.dt = GetDt
|
||
}
|
||
if (hasSizeACEs) {
|
||
Cnds.CompareWidth = CompareWidth;
|
||
Cnds.CompareHeight = CompareHeight;
|
||
Acts.SetWidth = SetWidth;
|
||
Acts.SetHeight = SetHeight;
|
||
Acts.SetSize = SetSize;
|
||
Exps.Width = GetWidth;
|
||
Exps.Height = GetHeight;
|
||
Exps.BBoxLeft = GetBboxLeft;
|
||
Exps.BBoxTop = GetBboxTop;
|
||
Exps.BBoxRight = GetBboxRight;
|
||
Exps.BBoxBottom = GetBboxBottom
|
||
}
|
||
if (hasAngleACEs) {
|
||
Cnds.AngleWithin = IsAngleWithin;
|
||
Cnds.IsClockwiseFrom = IsAngleClockwiseFrom;
|
||
Cnds.IsBetweenAngles = IsBetweenAngles;
|
||
Acts.SetAngle = SetAngle;
|
||
Acts.RotateClockwise = RotateClockwise;
|
||
Acts.RotateCounterclockwise = RotateCounterclockwise;
|
||
Acts.RotateTowardAngle = RotateTowardAngle;
|
||
Acts.RotateTowardPosition = RotateTowardPosition;
|
||
Acts.SetTowardPosition = SetTowardPosition;
|
||
Exps.Angle = GetAngle
|
||
}
|
||
if (hasAppearanceACEs) {
|
||
Cnds.IsVisible = IsVisible;
|
||
Cnds.CompareOpacity = CompareOpacity;
|
||
Acts.SetVisible = SetVisible;
|
||
Acts.SetOpacity = SetOpacity;
|
||
Acts.SetDefaultColor = SetDefaultColor;
|
||
Exps.Opacity = GetOpacity;
|
||
Exps.ColorValue = GetColor
|
||
}
|
||
if (hasZOrderACEs) {
|
||
Cnds.IsOnLayer = IsOnLayer;
|
||
Cnds.PickTopBottom = PickTopBottom;
|
||
Cnds.CompareZElevation = CompareZElevation;
|
||
Acts.MoveToTop = MoveToTop;
|
||
Acts.MoveToBottom = MoveToBottom;
|
||
Acts.MoveToLayer = MoveToLayer;
|
||
Acts.ZMoveToObject = ZMoveToObject;
|
||
Acts.SetZElevation = SetZElevation;
|
||
Exps.LayerNumber = LayerNumber;
|
||
Exps.LayerName = LayerName;
|
||
Exps.ZIndex = ZIndex;
|
||
Exps.ZElevation = ZElevation;
|
||
Exps.TotalZElevation = TotalZElevation
|
||
}
|
||
if (hasEffectsACEs) {
|
||
Acts.SetEffectEnabled = SetEffectEnabled;
|
||
Acts.SetEffectParam = SetEffectParam
|
||
}
|
||
if (hasSceneGraphACEs) {
|
||
Cnds.HasParent = HasParent;
|
||
Cnds.HasChildren = HasChildren;
|
||
Cnds.PickParent = PickParent;
|
||
Cnds.PickChildren = PickChildren;
|
||
Cnds.PickNthChild = PickNthChild;
|
||
Cnds.CompareChildCount = CompareChildCount;
|
||
Acts.AddChild = AddChild;
|
||
Acts.RemoveChild = RemoveChild;
|
||
Acts.RemoveFromParent = RemoveFromParent;
|
||
Exps.ChildCount = ChildCount
|
||
}
|
||
if (hasMeshACEs) {
|
||
Acts.SetMeshSize = SetMeshSize;
|
||
Acts.SetMeshPoint = SetMeshPoint;
|
||
Exps.MeshColumns = MeshColumns;
|
||
Exps.MeshRows = MeshRows
|
||
}
|
||
if (hasElementACEs) {
|
||
Cnds.IsVisible = IsVisible;
|
||
Acts.SetVisible = SetElementVisible;
|
||
Acts.SetCSSStyle = SetElementCSSStyle;
|
||
Acts.SetElemAttribute = SetElementAttribute;
|
||
Acts.RemoveElemAttribute = RemoveElementAttribute
|
||
}
|
||
if (hasElementFocusACEs) {
|
||
Cnds.IsFocused = IsElementFocused;
|
||
Acts.SetFocus = SetElementFocus;
|
||
Acts.SetBlur = SetElementBlur
|
||
}
|
||
if (hasElementEnabledACEs) {
|
||
Cnds.IsEnabled = IsElementEnabled;
|
||
Acts.SetEnabled = SetElementEnabled
|
||
}
|
||
if (!isSingleGlobal) {
|
||
Cnds.CompareInstanceVar = CompareInstanceVar;
|
||
Cnds.IsBoolInstanceVarSet = IsBoolInstanceVarSet;
|
||
Cnds.PickInstVarHiLow = PickInstVarHiLow;
|
||
Cnds.PickByUID = PickByUID;
|
||
Acts.SetInstanceVar = SetInstanceVar;
|
||
Acts.AddInstanceVar = AddInstanceVar;
|
||
Acts.SubInstanceVar = SubInstanceVar;
|
||
Acts.SetBoolInstanceVar = SetBoolInstanceVar;
|
||
Acts.ToggleBoolInstanceVar = ToggleBoolInstanceVar;
|
||
Cnds.OnCreated = OnCreated;
|
||
Cnds.OnDestroyed = OnDestroyed;
|
||
Acts.Destroy = Destroy;
|
||
if (!Acts.LoadFromJsonString)
|
||
Acts.LoadFromJsonString = LoadFromJsonString;
|
||
if (!Exps.AsJSON)
|
||
Exps.AsJSON = AsJSON;
|
||
Exps.Count = Count;
|
||
Exps.PickedCount = PickedCount;
|
||
Exps.IID = GetIID;
|
||
Exps.UID = GetUID;
|
||
Exps.ObjectTypeName = ObjectTypeName
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.ScheduledWait = class ScheduledWait extends C3.DefendedBase {
|
||
constructor(eventSheetManager) {
|
||
super();
|
||
this._eventSheetManager = eventSheetManager;
|
||
this._type = "";
|
||
this._time = -1;
|
||
this._signalTag = "";
|
||
this._isSignalled = false;
|
||
this._event = null;
|
||
this._actIndex = 0;
|
||
this._solModifiers = [];
|
||
this._sols = new Map;
|
||
this._callingFunctionBlock = null;
|
||
this._asyncId = -1;
|
||
this._functionParameters = null;
|
||
this._shouldRelease = false
|
||
}
|
||
Release() {
|
||
this._type = "";
|
||
this._time = -1;
|
||
this._signalTag = "";
|
||
this._event = null;
|
||
this._callingFunctionBlock = null;
|
||
this._functionParameters = null;
|
||
this._asyncId = -1;
|
||
C3.clearArray(this._solModifiers);
|
||
for (const s of this._sols.values())
|
||
s.Release();
|
||
this._sols.clear()
|
||
}
|
||
_Init() {
|
||
const eventSheetManager = this._eventSheetManager;
|
||
const allObjectClasses = eventSheetManager.GetRuntime().GetAllObjectClasses();
|
||
const frame = eventSheetManager.GetCurrentEventStackFrame();
|
||
this._event = frame.GetCurrentEvent();
|
||
this._actIndex = frame.GetActionIndex() + 1;
|
||
const functionBlock = eventSheetManager.FindFirstFunctionBlockParent(this._event);
|
||
if (functionBlock) {
|
||
this._callingFunctionBlock = functionBlock;
|
||
this._functionParameters = functionBlock.CaptureFunctionParameters();
|
||
if (functionBlock.IsAsync())
|
||
this._asyncId = functionBlock.PauseCurrentAsyncFunction()
|
||
}
|
||
for (const objectClass of allObjectClasses) {
|
||
const sol = objectClass.GetCurrentSol();
|
||
if (sol.IsSelectAll() && !this._event.HasSolModifier(objectClass))
|
||
continue;
|
||
this._solModifiers.push(objectClass);
|
||
this._sols.set(objectClass, C3.New(C3.SolState, sol))
|
||
}
|
||
}
|
||
InitTimer(seconds) {
|
||
this._type = "timer";
|
||
this._Init();
|
||
this._time = this._eventSheetManager.GetRuntime().GetGameTime() + seconds
|
||
}
|
||
InitSignal(tag) {
|
||
this._type = "signal";
|
||
this._Init();
|
||
this._signalTag = tag.toLowerCase()
|
||
}
|
||
InitPromise(p) {
|
||
this._type = "promise";
|
||
this._Init();
|
||
p.then(()=>this.SetSignalled()).catch(err=>{
|
||
console.warn("[C3 runtime] Promise rejected in 'Wait for previous actions to complete': ", err);
|
||
this.SetSignalled()
|
||
}
|
||
)
|
||
}
|
||
IsTimer() {
|
||
return this._type === "timer"
|
||
}
|
||
IsSignal() {
|
||
return this._type === "signal"
|
||
}
|
||
IsPromise() {
|
||
return this._type === "promise"
|
||
}
|
||
GetSignalTag() {
|
||
return this._signalTag
|
||
}
|
||
IsSignalled() {
|
||
return this._isSignalled
|
||
}
|
||
SetSignalled() {
|
||
this._isSignalled = true
|
||
}
|
||
_ShouldRun() {
|
||
if (this.IsTimer())
|
||
return this._time <= this._eventSheetManager.GetRuntime().GetGameTime();
|
||
else
|
||
return this.IsSignalled()
|
||
}
|
||
_RestoreState(frame) {
|
||
frame._Restore(this._event, this._actIndex);
|
||
for (const [objectClass,solState] of this._sols.entries()) {
|
||
const sol = objectClass.GetCurrentSol();
|
||
solState._Restore(sol)
|
||
}
|
||
const callingFunctionBlock = this._callingFunctionBlock;
|
||
if (callingFunctionBlock) {
|
||
callingFunctionBlock.SetFunctionParameters(this._functionParameters);
|
||
if (callingFunctionBlock.IsAsync())
|
||
callingFunctionBlock.ResumeAsyncFunction(this._asyncId)
|
||
}
|
||
}
|
||
_Run(frame) {
|
||
this._RestoreState(frame);
|
||
this._event._ResumeActionsAndSubEvents(frame);
|
||
if (this._callingFunctionBlock && this._callingFunctionBlock.IsAsync())
|
||
this._callingFunctionBlock.MaybeFinishAsyncFunctionCall(this._asyncId);
|
||
this._eventSheetManager.ClearSol(this._solModifiers);
|
||
this._shouldRelease = true
|
||
}
|
||
async _DebugRun(frame) {
|
||
this._RestoreState(frame);
|
||
for (const breakEventObject of this._event._DebugResumeActionsAndSubEvents(frame))
|
||
await this._eventSheetManager.GetRuntime().DebugBreak(breakEventObject);
|
||
if (this._callingFunctionBlock && this._callingFunctionBlock.IsAsync())
|
||
this._callingFunctionBlock.MaybeFinishAsyncFunctionCall(this._asyncId);
|
||
this._eventSheetManager.ClearSol(this._solModifiers);
|
||
this._shouldRelease = true
|
||
}
|
||
ShouldRelease() {
|
||
return this._shouldRelease
|
||
}
|
||
RemoveInstances(s) {
|
||
for (const solState of this._sols.values())
|
||
solState.RemoveInstances(s)
|
||
}
|
||
_SaveToJson() {
|
||
const sols = {};
|
||
const o = {
|
||
"t": this._time,
|
||
"st": this._signalTag,
|
||
"s": this._isSignalled,
|
||
"ev": this._event.GetSID(),
|
||
"sm": this._solModifiers.map(oc=>oc.GetSID()),
|
||
"sols": sols
|
||
};
|
||
if (this._event._HasActionIndex(this._actIndex))
|
||
o["act"] = this._event.GetActionAt(this._actIndex).GetSID();
|
||
for (const [objectClass,solState] of this._sols)
|
||
sols[objectClass.GetSID().toString()] = solState._SaveToJson();
|
||
return o
|
||
}
|
||
static _CreateFromJson(eventSheetManager, o) {
|
||
const runtime = eventSheetManager.GetRuntime();
|
||
const event = eventSheetManager.GetEventBlockBySID(o["ev"]);
|
||
if (!event)
|
||
return null;
|
||
let actIndex = 0;
|
||
if (o.hasOwnProperty("act")) {
|
||
const act = eventSheetManager.GetActionBySID(o["act"]);
|
||
if (!act)
|
||
return null;
|
||
actIndex = act.GetIndex()
|
||
}
|
||
const sw = C3.New(C3.ScheduledWait, eventSheetManager);
|
||
sw._time = o["t"];
|
||
sw._type = sw._time === -1 ? "signal" : "timer";
|
||
sw._signalTag = o["st"];
|
||
sw._isSignalled = o["s"];
|
||
sw._event = event;
|
||
sw._actIndex = actIndex;
|
||
for (const sid of o["sm"]) {
|
||
const objectClass = runtime.GetObjectClassBySID(sid);
|
||
if (objectClass)
|
||
sw._solModifiers.push(objectClass)
|
||
}
|
||
for (const [sidStr,solData] of Object.entries(o["sols"])) {
|
||
const sid = parseInt(sidStr, 10);
|
||
const objectClass = runtime.GetObjectClassBySID(sid);
|
||
if (!objectClass)
|
||
continue;
|
||
const solState = C3.New(C3.SolState, null);
|
||
solState._LoadFromJson(eventSheetManager, solData);
|
||
sw._sols.set(objectClass, solState)
|
||
}
|
||
return sw
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.SolState = class SolState extends C3.DefendedBase {
|
||
constructor(sol) {
|
||
super();
|
||
this._objectClass = null;
|
||
this._isSelectAll = true;
|
||
this._instances = [];
|
||
if (sol) {
|
||
this._objectClass = sol.GetObjectClass();
|
||
this._isSelectAll = sol.IsSelectAll();
|
||
C3.shallowAssignArray(this._instances, sol._GetOwnInstances())
|
||
}
|
||
}
|
||
Release() {
|
||
this._objectClass = null;
|
||
C3.clearArray(this._instances)
|
||
}
|
||
_Restore(sol) {
|
||
sol._SetSelectAll(this._isSelectAll);
|
||
C3.shallowAssignArray(sol._GetOwnInstances(), this._instances)
|
||
}
|
||
RemoveInstances(s) {
|
||
C3.arrayRemoveAllInSet(this._instances, s)
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"sa": this._isSelectAll,
|
||
"insts": this._instances.map(inst=>inst.GetUID())
|
||
}
|
||
}
|
||
_LoadFromJson(eventSheetManager, o) {
|
||
const runtime = eventSheetManager.GetRuntime();
|
||
this._isSelectAll = !!o["sa"];
|
||
C3.clearArray(this._instances);
|
||
for (const uid of o["insts"]) {
|
||
const inst = runtime.GetInstanceByUID(uid);
|
||
if (inst)
|
||
this._instances.push(inst)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
function GetNextParamMap(paramMap, param) {
|
||
let nextParamMap = paramMap.get(param);
|
||
if (!nextParamMap) {
|
||
nextParamMap = new Map;
|
||
paramMap.set(param, nextParamMap)
|
||
}
|
||
return nextParamMap
|
||
}
|
||
C3.SDKPluginBase = class SDKPluginBase extends C3.DefendedBase {
|
||
constructor(opts) {
|
||
super();
|
||
this._runtime = opts.runtime;
|
||
this._isSingleGlobal = !!opts.isSingleGlobal;
|
||
this._isWorldType = !!opts.isWorld;
|
||
this._isRotatable = !!opts.isRotatable;
|
||
this._mustPredraw = !!opts.mustPredraw;
|
||
this._hasEffects = !!opts.hasEffects;
|
||
this._supportsSceneGraph = !!opts.supportsSceneGraph;
|
||
this._supportsMesh = !!opts.supportsMesh;
|
||
this._singleGlobalObjectClass = null;
|
||
this._boundACEMethodCache = new Map;
|
||
this._boundACEMethodCache_1param = new Map;
|
||
this._boundACEMethodCache_2params = new Map;
|
||
this._boundACEMethodCache_3params = new Map
|
||
}
|
||
Release() {
|
||
this._runtime = null
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
OnCreate() {}
|
||
IsSingleGlobal() {
|
||
return this._isSingleGlobal
|
||
}
|
||
IsWorldType() {
|
||
return this._isWorldType
|
||
}
|
||
IsRotatable() {
|
||
return this._isRotatable
|
||
}
|
||
MustPreDraw() {
|
||
return this._mustPredraw
|
||
}
|
||
HasEffects() {
|
||
return this._hasEffects
|
||
}
|
||
SupportsSceneGraph() {
|
||
return this._supportsSceneGraph
|
||
}
|
||
SupportsMesh() {
|
||
return this._supportsMesh
|
||
}
|
||
_GetBoundACEMethod(func, bindThis) {
|
||
if (!bindThis)
|
||
throw new Error("missing 'this' binding");
|
||
let ret = this._boundACEMethodCache.get(func);
|
||
if (ret)
|
||
return ret;
|
||
ret = func.bind(bindThis);
|
||
this._boundACEMethodCache.set(func, ret);
|
||
return ret
|
||
}
|
||
_GetBoundACEMethod_1param(func, bindThis, param0) {
|
||
if (!bindThis)
|
||
throw new Error("missing 'this' binding");
|
||
const param0map = GetNextParamMap(this._boundACEMethodCache_1param, func);
|
||
let ret = param0map.get(param0);
|
||
if (ret)
|
||
return ret;
|
||
ret = func.bind(bindThis, param0);
|
||
param0map.set(param0, ret);
|
||
return ret
|
||
}
|
||
_GetBoundACEMethod_2params(func, bindThis, param0, param1) {
|
||
if (!bindThis)
|
||
throw new Error("missing 'this' binding");
|
||
const param0map = GetNextParamMap(this._boundACEMethodCache_2params, func);
|
||
const param1map = GetNextParamMap(param0map, param0);
|
||
let ret = param1map.get(param1);
|
||
if (ret)
|
||
return ret;
|
||
ret = func.bind(bindThis, param0, param1);
|
||
param1map.set(param1, ret);
|
||
return ret
|
||
}
|
||
_GetBoundACEMethod_3params(func, bindThis, param0, param1, param2) {
|
||
if (!bindThis)
|
||
throw new Error("missing 'this' binding");
|
||
const param0map = GetNextParamMap(this._boundACEMethodCache_3params, func);
|
||
const param1map = GetNextParamMap(param0map, param0);
|
||
const param2map = GetNextParamMap(param1map, param1);
|
||
let ret = param2map.get(param2);
|
||
if (ret)
|
||
return ret;
|
||
ret = func.bind(bindThis, param0, param1, param2);
|
||
param2map.set(param2, ret);
|
||
return ret
|
||
}
|
||
_SetSingleGlobalObjectClass(objectClass) {
|
||
if (!this.IsSingleGlobal())
|
||
throw new Error("must be single-global plugin");
|
||
this._singleGlobalObjectClass = objectClass
|
||
}
|
||
GetSingleGlobalObjectClass() {
|
||
if (!this.IsSingleGlobal())
|
||
throw new Error("must be single-global plugin");
|
||
return this._singleGlobalObjectClass
|
||
}
|
||
GetSingleGlobalInstance() {
|
||
if (!this.IsSingleGlobal())
|
||
throw new Error("must be single-global plugin");
|
||
return this._singleGlobalObjectClass.GetSingleGlobalInstance()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.SDKDOMPluginBase = class SDKDOMPluginBase extends C3.SDKPluginBase {
|
||
constructor(opts, DOM_COMPONENT_ID) {
|
||
super(opts);
|
||
this._domComponentId = DOM_COMPONENT_ID;
|
||
this._nextElementId = 0;
|
||
this._instMap = new Map;
|
||
this.AddElementMessageHandler("elem-focused", sdkInst=>sdkInst._OnElemFocused());
|
||
this.AddElementMessageHandler("elem-blurred", sdkInst=>{
|
||
if (sdkInst)
|
||
sdkInst._OnElemBlurred()
|
||
}
|
||
)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
_AddElement(sdkInst) {
|
||
const elementId = this._nextElementId++;
|
||
this._instMap.set(elementId, sdkInst);
|
||
return elementId
|
||
}
|
||
_RemoveElement(elementId) {
|
||
this._instMap.delete(elementId)
|
||
}
|
||
AddElementMessageHandler(handler, func) {
|
||
this._runtime.AddDOMComponentMessageHandler(this._domComponentId, handler, e=>{
|
||
const sdkInst = this._instMap.get(e["elementId"]);
|
||
func(sdkInst, e)
|
||
}
|
||
)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.SDKTypeBase = class SDKTypeBase extends C3.DefendedBase {
|
||
constructor(objectClass) {
|
||
super();
|
||
this._objectClass = objectClass;
|
||
this._runtime = objectClass.GetRuntime();
|
||
this._plugin = objectClass.GetPlugin()
|
||
}
|
||
Release() {
|
||
this._objectClass = null;
|
||
this._runtime = null;
|
||
this._plugin = null
|
||
}
|
||
GetObjectClass() {
|
||
return this._objectClass
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetPlugin() {
|
||
return this._plugin
|
||
}
|
||
GetImageInfo() {
|
||
return this._objectClass.GetImageInfo()
|
||
}
|
||
FinishCondition(f) {}
|
||
LoadTextures(renderer) {}
|
||
ReleaseTextures() {}
|
||
OnDynamicTextureLoadComplete() {}
|
||
PreloadTexturesWithInstances(renderer) {}
|
||
LoadTilemapData() {}
|
||
GetScriptInterfaceClass() {
|
||
return null
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.SDKInstanceBase = class SDKInstanceBase extends C3.DefendedBase {
|
||
constructor(inst, domComponentId) {
|
||
super();
|
||
this._inst = inst;
|
||
this._domComponentId = domComponentId;
|
||
this._runtime = inst.GetRuntime();
|
||
this._objectClass = this._inst.GetObjectClass();
|
||
this._sdkType = this._objectClass.GetSdkType();
|
||
this._tickFunc = null;
|
||
this._tick2Func = null;
|
||
this._isTicking = false;
|
||
this._isTicking2 = false;
|
||
this._disposables = null;
|
||
this._wasReleased = false
|
||
}
|
||
Release() {
|
||
this._wasReleased = true;
|
||
this._StopTicking();
|
||
this._StopTicking2();
|
||
this._tickFunc = null;
|
||
this._tick2Func = null;
|
||
if (this._disposables) {
|
||
this._disposables.Release();
|
||
this._disposables = null
|
||
}
|
||
this._inst = null;
|
||
this._runtime = null;
|
||
this._objectClass = null;
|
||
this._sdkType = null
|
||
}
|
||
WasReleased() {
|
||
return this._wasReleased
|
||
}
|
||
GetInstance() {
|
||
return this._inst
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetObjectClass() {
|
||
return this._objectClass
|
||
}
|
||
GetPlugin() {
|
||
return this._sdkType.GetPlugin()
|
||
}
|
||
GetSdkType() {
|
||
return this._sdkType
|
||
}
|
||
GetScriptInterface() {
|
||
return this._inst.GetInterfaceClass()
|
||
}
|
||
Trigger(method) {
|
||
return this._runtime.Trigger(method, this._inst, null)
|
||
}
|
||
DebugTrigger(method) {
|
||
return this._runtime.DebugTrigger(method, this._inst, null)
|
||
}
|
||
TriggerAsync(method) {
|
||
return this._runtime.TriggerAsync(method, this._inst, null)
|
||
}
|
||
FastTrigger(method, value) {
|
||
return this._runtime.FastTrigger(method, this._inst, value)
|
||
}
|
||
DebugFastTrigger(method, value) {
|
||
return this._runtime.DebugFastTrigger(method, this._inst, value)
|
||
}
|
||
ScheduleTriggers(f) {
|
||
return this._runtime.ScheduleTriggers(f)
|
||
}
|
||
AddDOMMessageHandler(handler, func) {
|
||
this._runtime.AddDOMComponentMessageHandler(this._domComponentId, handler, func)
|
||
}
|
||
AddDOMMessageHandlers(list) {
|
||
for (const [handler,func] of list)
|
||
this.AddDOMMessageHandler(handler, func)
|
||
}
|
||
PostToDOM(handler, data) {
|
||
this._runtime.PostComponentMessageToDOM(this._domComponentId, handler, data)
|
||
}
|
||
PostToDOMAsync(handler, data) {
|
||
return this._runtime.PostComponentMessageToDOMAsync(this._domComponentId, handler, data)
|
||
}
|
||
_PostToDOMMaybeSync(handler, data) {
|
||
if (this._runtime.IsInWorker())
|
||
this.PostToDOM(handler, data);
|
||
else
|
||
return window["c3_runtimeInterface"]["_OnMessageFromRuntime"]({
|
||
"type": "event",
|
||
"component": this._domComponentId,
|
||
"handler": handler,
|
||
"data": data,
|
||
"responseId": null
|
||
})
|
||
}
|
||
GetCurrentImageInfo() {
|
||
return null
|
||
}
|
||
GetCurrentSurfaceSize() {
|
||
const imageInfo = this.GetCurrentImageInfo();
|
||
if (imageInfo) {
|
||
const texture = imageInfo.GetTexture();
|
||
if (texture)
|
||
return [texture.GetWidth(), texture.GetHeight()]
|
||
}
|
||
return [100, 100]
|
||
}
|
||
GetCurrentTexRect() {
|
||
const imageInfo = this.GetCurrentImageInfo();
|
||
return imageInfo ? imageInfo.GetTexRect() : null
|
||
}
|
||
GetImagePoint(nameOrIndex) {
|
||
const wi = this._inst.GetWorldInfo();
|
||
return [wi.GetX(), wi.GetY()]
|
||
}
|
||
Tick() {}
|
||
Tick2() {}
|
||
_StartTicking() {
|
||
if (this._isTicking)
|
||
return;
|
||
if (!this._tickFunc)
|
||
this._tickFunc = ()=>this.Tick();
|
||
this._runtime.Dispatcher().addEventListener("tick", this._tickFunc);
|
||
this._isTicking = true
|
||
}
|
||
_StopTicking() {
|
||
if (!this._isTicking)
|
||
return;
|
||
this._runtime.Dispatcher().removeEventListener("tick", this._tickFunc);
|
||
this._isTicking = false
|
||
}
|
||
IsTicking() {
|
||
return this._isTicking
|
||
}
|
||
_StartTicking2() {
|
||
if (this._isTicking2)
|
||
return;
|
||
if (!this._tick2Func)
|
||
this._tick2Func = ()=>this.Tick2();
|
||
this._runtime.Dispatcher().addEventListener("tick2", this._tick2Func);
|
||
this._isTicking2 = true
|
||
}
|
||
_StopTicking2() {
|
||
if (!this._isTicking2)
|
||
return;
|
||
this._runtime.Dispatcher().removeEventListener("tick2", this._tick2Func);
|
||
this._isTicking2 = false
|
||
}
|
||
IsTicking2() {
|
||
return this._isTicking2
|
||
}
|
||
GetDebuggerProperties() {
|
||
return []
|
||
}
|
||
SaveToJson() {
|
||
return null
|
||
}
|
||
LoadFromJson(o) {}
|
||
LoadTilemapData(data, mapWidth, mapHeight) {}
|
||
TestPointOverlapTile(x, y) {}
|
||
GetPropertyValueByIndex(index) {}
|
||
SetPropertyValueByIndex(index, value) {}
|
||
OffsetPropertyValueByIndex(index, offset) {
|
||
if (offset === 0)
|
||
return;
|
||
const value = this.GetPropertyValueByIndex(index);
|
||
if (typeof value !== "number")
|
||
throw new Error("expected number");
|
||
this.SetPropertyValueByIndex(index, value + offset)
|
||
}
|
||
SetPropertyColorOffsetValueByIndex(offset, r, g, b) {}
|
||
CallAction(actMethod, ...args) {
|
||
actMethod.call(this, ...args)
|
||
}
|
||
CallExpression(expMethod, ...args) {
|
||
return expMethod.call(this, ...args)
|
||
}
|
||
GetScriptInterfaceClass() {
|
||
return null
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.SDKWorldInstanceBase = class SDKWorldInstanceBase extends C3.SDKInstanceBase {
|
||
constructor(inst, domComponentId) {
|
||
super(inst, domComponentId);
|
||
this._worldInfo = inst.GetWorldInfo();
|
||
this._webglcontextlost_handler = null;
|
||
this._webglcontextrestored_handler = null
|
||
}
|
||
Release() {
|
||
if (this._webglcontextlost_handler) {
|
||
const dispatcher = this._runtime.Dispatcher();
|
||
dispatcher.removeEventListener("webglcontextlost", this._webglcontextlost_handler);
|
||
dispatcher.removeEventListener("webglcontextrestored", this._webglcontextrestored_handler);
|
||
this._webglcontextlost_handler = null;
|
||
this._webglcontextrestored_handler = null
|
||
}
|
||
this._worldInfo = null;
|
||
super.Release()
|
||
}
|
||
HandleWebGLContextLoss() {
|
||
if (this._webglcontextlost_handler)
|
||
return;
|
||
this._webglcontextlost_handler = ()=>this.OnWebGLContextLost();
|
||
this._webglcontextrestored_handler = ()=>this.OnWebGLContextRestored();
|
||
const dispatcher = this._runtime.Dispatcher();
|
||
dispatcher.addEventListener("webglcontextlost", this._webglcontextlost_handler);
|
||
dispatcher.addEventListener("webglcontextrestored", this._webglcontextrestored_handler)
|
||
}
|
||
OnWebGLContextLost() {}
|
||
OnWebGLContextRestored() {}
|
||
GetWorldInfo() {
|
||
return this._worldInfo
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const tempRect = C3.New(C3.Rect);
|
||
C3.SDKDOMInstanceBase = class SDKDOMInstanceBase extends C3.SDKWorldInstanceBase {
|
||
constructor(inst, domComponentId) {
|
||
super(inst, domComponentId);
|
||
this._elementId = this.GetPlugin()._AddElement(this);
|
||
this._isElementShowing = true;
|
||
this._elemHasFocus = false;
|
||
this._autoFontSize = false;
|
||
this._lastRect = C3.New(C3.Rect, 0, 0, -1, -1);
|
||
const canvasManager = this._runtime.GetCanvasManager();
|
||
this._lastWindowWidth = canvasManager.GetLastWidth();
|
||
this._lastWindowHeight = canvasManager.GetLastHeight();
|
||
this._isPendingUpdateState = false;
|
||
this._StartTicking()
|
||
}
|
||
Release() {
|
||
this.GetPlugin()._RemoveElement(this._elementId);
|
||
this.PostToDOMElement("destroy");
|
||
this._elementId = -1;
|
||
super.Release()
|
||
}
|
||
_GetElementInDOMMode() {
|
||
if (this._runtime.IsInWorker())
|
||
throw new Error("not valid in worker mode");
|
||
return this._PostToDOMElementMaybeSync("get-element")
|
||
}
|
||
PostToDOMElement(handler, data) {
|
||
if (!data)
|
||
data = {};
|
||
data["elementId"] = this._elementId;
|
||
this.PostToDOM(handler, data)
|
||
}
|
||
_PostToDOMElementMaybeSync(handler, data) {
|
||
if (!data)
|
||
data = {};
|
||
data["elementId"] = this._elementId;
|
||
return this._PostToDOMMaybeSync(handler, data)
|
||
}
|
||
PostToDOMElementAsync(handler, data) {
|
||
if (!data)
|
||
data = {};
|
||
data["elementId"] = this._elementId;
|
||
return this.PostToDOMAsync(handler, data)
|
||
}
|
||
CreateElement(data) {
|
||
if (!data)
|
||
data = {};
|
||
const isVisible = this.GetWorldInfo().IsVisible();
|
||
data["elementId"] = this._elementId;
|
||
data["isVisible"] = isVisible;
|
||
Object.assign(data, this.GetElementState());
|
||
this._isElementShowing = !!data["isVisible"];
|
||
this._PostToDOMMaybeSync("create", data);
|
||
this._UpdatePosition(true)
|
||
}
|
||
SetElementVisible(v) {
|
||
v = !!v;
|
||
if (this._isElementShowing === v)
|
||
return;
|
||
this._isElementShowing = v;
|
||
this.PostToDOMElement("set-visible", {
|
||
"isVisible": v
|
||
})
|
||
}
|
||
Tick() {
|
||
this._UpdatePosition(false)
|
||
}
|
||
_ShouldPreserveElement() {
|
||
const fullscreenMode = this._runtime.GetCanvasManager().GetFullscreenMode();
|
||
return C3.Platform.OS === "Android" && (fullscreenMode === "scale-inner" || fullscreenMode === "scale-outer" || fullscreenMode === "crop")
|
||
}
|
||
_UpdatePosition(first) {
|
||
const wi = this.GetWorldInfo();
|
||
const layer = wi.GetLayer();
|
||
const x = wi.GetX();
|
||
const y = wi.GetY();
|
||
let[cleft,ctop] = layer.LayerToCanvasCss(x, y);
|
||
let[cright,cbottom] = layer.LayerToCanvasCss(x + wi.GetWidth(), y + wi.GetHeight());
|
||
const canvasManager = this._runtime.GetCanvasManager();
|
||
const rightEdge = canvasManager.GetCssWidth();
|
||
const bottomEdge = canvasManager.GetCssHeight();
|
||
if (!wi.IsVisible() || !layer.IsVisible()) {
|
||
this.SetElementVisible(false);
|
||
return
|
||
}
|
||
if (!this._ShouldPreserveElement()) {
|
||
if (cright <= 0 || cbottom <= 0 || cleft >= rightEdge || ctop >= bottomEdge) {
|
||
this.SetElementVisible(false);
|
||
return
|
||
}
|
||
if (cleft < 1)
|
||
cleft = 1;
|
||
if (ctop < 1)
|
||
ctop = 1;
|
||
if (cright >= rightEdge)
|
||
cright = rightEdge - 1;
|
||
if (cbottom >= bottomEdge)
|
||
cbottom = bottomEdge - 1
|
||
}
|
||
tempRect.set(cleft, ctop, cright, cbottom);
|
||
const curWinWidth = canvasManager.GetLastWidth();
|
||
const curWinHeight = canvasManager.GetLastHeight();
|
||
if (!first && tempRect.equals(this._lastRect) && this._lastWindowWidth === curWinWidth && this._lastWindowHeight === curWinHeight) {
|
||
this.SetElementVisible(true);
|
||
return
|
||
}
|
||
this._lastRect.copy(tempRect);
|
||
this._lastWindowWidth = curWinWidth;
|
||
this._lastWindowHeight = curWinHeight;
|
||
this.SetElementVisible(true);
|
||
let fontSize = null;
|
||
if (this._autoFontSize)
|
||
fontSize = layer.GetDisplayScale() - .2;
|
||
this.PostToDOMElement("update-position", {
|
||
"left": Math.round(this._lastRect.getLeft()) + canvasManager.GetCanvasClientX(),
|
||
"top": Math.round(this._lastRect.getTop()) + canvasManager.GetCanvasClientY(),
|
||
"width": Math.round(this._lastRect.width()),
|
||
"height": Math.round(this._lastRect.height()),
|
||
"fontSize": fontSize
|
||
})
|
||
}
|
||
FocusElement() {
|
||
this._PostToDOMElementMaybeSync("focus", {
|
||
"focus": true
|
||
})
|
||
}
|
||
BlurElement() {
|
||
this._PostToDOMElementMaybeSync("focus", {
|
||
"focus": false
|
||
})
|
||
}
|
||
_OnElemFocused() {
|
||
this._elemHasFocus = true
|
||
}
|
||
_OnElemBlurred() {
|
||
this._elemHasFocus = false
|
||
}
|
||
IsElementFocused() {
|
||
return this._elemHasFocus
|
||
}
|
||
SetElementCSSStyle(prop, val) {
|
||
this.PostToDOMElement("set-css-style", {
|
||
"prop": C3.CSSToCamelCase(prop),
|
||
"val": val
|
||
})
|
||
}
|
||
SetElementAttribute(attribName, value) {
|
||
this.PostToDOMElement("set-attribute", {
|
||
"name": attribName,
|
||
"val": value
|
||
})
|
||
}
|
||
RemoveElementAttribute(attribName) {
|
||
this.PostToDOMElement("remove-attribute", {
|
||
"name": attribName
|
||
})
|
||
}
|
||
UpdateElementState() {
|
||
if (this._isPendingUpdateState)
|
||
return;
|
||
this._isPendingUpdateState = true;
|
||
Promise.resolve().then(()=>{
|
||
this._isPendingUpdateState = false;
|
||
this.PostToDOMElement("update-state", this.GetElementState())
|
||
}
|
||
)
|
||
}
|
||
GetElementState() {}
|
||
GetElementId() {
|
||
return this._elementId
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const IBehavior = self.IBehavior;
|
||
C3.SDKBehaviorBase = class SDKBehaviorBase extends C3.DefendedBase {
|
||
constructor(opts) {
|
||
super();
|
||
this._runtime = opts.runtime;
|
||
this._myObjectClasses = C3.New(C3.ArraySet);
|
||
this._myInstances = C3.New(C3.ArraySet);
|
||
this._iBehavior = null;
|
||
const CustomScriptClass = opts.scriptInterfaceClass;
|
||
if (CustomScriptClass) {
|
||
this._iBehavior = new CustomScriptClass(this);
|
||
if (!(this._iBehavior instanceof IBehavior))
|
||
throw new TypeError("script interface class must derive from IBehavior");
|
||
} else
|
||
this._iBehavior = new IBehavior(this)
|
||
}
|
||
Release() {
|
||
this._myInstances.Release();
|
||
this._myObjectClasses.Release();
|
||
this._runtime = null
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
OnCreate() {}
|
||
_AddObjectClass(objectClass) {
|
||
this._myObjectClasses.Add(objectClass)
|
||
}
|
||
GetObjectClasses() {
|
||
return this._myObjectClasses.GetArray()
|
||
}
|
||
_AddInstance(inst) {
|
||
this._myInstances.Add(inst)
|
||
}
|
||
_RemoveInstance(inst) {
|
||
this._myInstances.Delete(inst)
|
||
}
|
||
GetInstances() {
|
||
return this._myInstances.GetArray()
|
||
}
|
||
GetIBehavior() {
|
||
return this._iBehavior
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.SDKBehaviorTypeBase = class SDKBehaviorTypeBase extends C3.DefendedBase {
|
||
constructor(behaviorType) {
|
||
super();
|
||
this._runtime = behaviorType.GetRuntime();
|
||
this._behaviorType = behaviorType;
|
||
this._objectClass = behaviorType.GetObjectClass();
|
||
this._behavior = behaviorType.GetBehavior();
|
||
this._behavior._AddObjectClass(this._objectClass)
|
||
}
|
||
Release() {
|
||
this._runtime = null;
|
||
this._behaviorType = null;
|
||
this._objectClass = null;
|
||
this._behavior = null
|
||
}
|
||
GetBehaviorType() {
|
||
return this._behaviorType
|
||
}
|
||
GetObjectClass() {
|
||
return this._objectClass
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetBehavior() {
|
||
return this._behavior
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.SDKBehaviorInstanceBase = class SDKBehaviorInstanceBase extends C3.DefendedBase {
|
||
constructor(behInst, domComponentId) {
|
||
super();
|
||
this._behInst = behInst;
|
||
this._domComponentId = domComponentId;
|
||
this._inst = behInst.GetObjectInstance();
|
||
this._runtime = behInst.GetRuntime();
|
||
this._behaviorType = behInst.GetBehaviorType();
|
||
this._sdkType = this._behaviorType.GetSdkType();
|
||
this._isTicking = false;
|
||
this._isTicking2 = false;
|
||
this._isPostTicking = false;
|
||
this._disposables = null
|
||
}
|
||
Release() {
|
||
this._StopTicking();
|
||
this._StopTicking2();
|
||
this._StopPostTicking();
|
||
if (this._disposables) {
|
||
this._disposables.Release();
|
||
this._disposables = null
|
||
}
|
||
this._behInst = null;
|
||
this._inst = null;
|
||
this._runtime = null;
|
||
this._behaviorType = null;
|
||
this._sdkType = null
|
||
}
|
||
GetBehavior() {
|
||
return this._behaviorType.GetBehavior()
|
||
}
|
||
GetBehaviorInstance() {
|
||
return this._behInst
|
||
}
|
||
GetObjectInstance() {
|
||
return this._inst
|
||
}
|
||
GetObjectClass() {
|
||
return this._inst.GetObjectClass()
|
||
}
|
||
GetWorldInfo() {
|
||
return this._inst.GetWorldInfo()
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetBehaviorType() {
|
||
return this._behaviorType
|
||
}
|
||
GetSdkType() {
|
||
return this._sdkType
|
||
}
|
||
GetScriptInterface() {
|
||
return this._behInst.GetScriptInterface()
|
||
}
|
||
Trigger(method) {
|
||
return this._runtime.Trigger(method, this._inst, this._behaviorType)
|
||
}
|
||
DebugTrigger(method) {
|
||
return this._runtime.DebugTrigger(method, this._inst, this._behaviorType)
|
||
}
|
||
TriggerAsync(method) {
|
||
return this._runtime.TriggerAsync(method, this._inst, this._behaviorType)
|
||
}
|
||
PostCreate() {}
|
||
Tick() {}
|
||
Tick2() {}
|
||
PostTick() {}
|
||
_StartTicking() {
|
||
if (this._isTicking)
|
||
return;
|
||
this._runtime._AddBehInstToTick(this);
|
||
this._isTicking = true
|
||
}
|
||
_StopTicking() {
|
||
if (!this._isTicking)
|
||
return;
|
||
this._runtime._RemoveBehInstToTick(this);
|
||
this._isTicking = false
|
||
}
|
||
IsTicking() {
|
||
return this._isTicking
|
||
}
|
||
_StartTicking2() {
|
||
if (this._isTicking2)
|
||
return;
|
||
this._runtime._AddBehInstToTick2(this);
|
||
this._isTicking2 = true
|
||
}
|
||
_StopTicking2() {
|
||
if (!this._isTicking2)
|
||
return;
|
||
this._runtime._RemoveBehInstToTick2(this);
|
||
this._isTicking2 = false
|
||
}
|
||
IsTicking2() {
|
||
return this._isTicking2
|
||
}
|
||
_StartPostTicking() {
|
||
if (this._isPostTicking)
|
||
return;
|
||
this._runtime._AddBehInstToPostTick(this);
|
||
this._isPostTicking = true
|
||
}
|
||
_StopPostTicking() {
|
||
if (!this._isPostTicking)
|
||
return;
|
||
this._runtime._RemoveBehInstToPostTick(this);
|
||
this._isPostTicking = false
|
||
}
|
||
IsPostTicking() {
|
||
return this._isPostTicking
|
||
}
|
||
GetDebuggerProperties() {
|
||
return []
|
||
}
|
||
AddDOMMessageHandler(handler, func) {
|
||
this._runtime.AddDOMComponentMessageHandler(this._domComponentId, handler, func)
|
||
}
|
||
OnSpriteFrameChanged(prevFrame, nextFrame) {}
|
||
SaveToJson() {
|
||
return null
|
||
}
|
||
LoadFromJson(o) {}
|
||
GetPropertyValueByIndex(index) {}
|
||
SetPropertyValueByIndex(index, value) {}
|
||
OffsetPropertyValueByIndex(index, offset) {
|
||
if (offset === 0)
|
||
return;
|
||
const value = this.GetPropertyValueByIndex(index);
|
||
if (typeof value !== "number")
|
||
throw new Error("expected number");
|
||
this.SetPropertyValueByIndex(index, value + offset)
|
||
}
|
||
SetPropertyColorOffsetValueByIndex(index, offsetR, offsetG, offsetB) {}
|
||
CallAction(actMethod, ...args) {
|
||
actMethod.call(this, ...args)
|
||
}
|
||
CallExpression(expMethod, ...args) {
|
||
return expMethod.call(this, ...args)
|
||
}
|
||
GetScriptInterfaceClass() {
|
||
return null
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins = {};
|
||
C3.Behaviors = {};
|
||
C3.PluginManager = class PluginManager extends C3.DefendedBase {
|
||
constructor(runtime) {
|
||
super();
|
||
this._runtime = runtime;
|
||
this._allPlugins = [];
|
||
this._pluginsByCtor = new Map;
|
||
this._systemPlugin = null;
|
||
this._allBehaviors = [];
|
||
this._behaviorsByCtor = new Map;
|
||
this._solidBehavior = null;
|
||
this._jumpthruBehavior = null
|
||
}
|
||
CreatePlugin(pluginData) {
|
||
const Ctor = this._runtime.GetObjectReference(pluginData[0]);
|
||
if (!Ctor)
|
||
throw new Error("missing plugin");
|
||
C3.AddCommonACEs(pluginData, Ctor);
|
||
const plugin = C3.New(Ctor, {
|
||
runtime: this._runtime,
|
||
isSingleGlobal: pluginData[1],
|
||
isWorld: pluginData[2],
|
||
isRotatable: pluginData[5],
|
||
hasEffects: pluginData[8],
|
||
mustPredraw: pluginData[9],
|
||
supportsSceneGraph: pluginData[13],
|
||
supportsMesh: pluginData[14]
|
||
});
|
||
plugin.OnCreate();
|
||
this._allPlugins.push(plugin);
|
||
this._pluginsByCtor.set(Ctor, plugin)
|
||
}
|
||
CreateSystemPlugin() {
|
||
this._systemPlugin = C3.New(C3.Plugins.System, {
|
||
runtime: this._runtime,
|
||
isSingleGlobal: true
|
||
});
|
||
this._systemPlugin.OnCreate()
|
||
}
|
||
CreateBehavior(behaviorData) {
|
||
const Ctor = this._runtime.GetObjectReference(behaviorData[1]);
|
||
if (!Ctor)
|
||
throw new Error("missing behavior");
|
||
const behavior = C3.New(Ctor, {
|
||
runtime: this._runtime
|
||
});
|
||
behavior.OnCreate();
|
||
this._allBehaviors.push(behavior);
|
||
this._behaviorsByCtor.set(Ctor, behavior);
|
||
if (!this._solidBehavior && C3.Behaviors.solid && behavior instanceof C3.Behaviors.solid)
|
||
this._solidBehavior = behavior;
|
||
else if (!this._jumpthruBehavior && C3.Behaviors.jumpthru && behavior instanceof C3.Behaviors.jumpthru)
|
||
this._jumpthruBehavior = behavior
|
||
}
|
||
GetPluginByConstructorFunction(ctor) {
|
||
return this._pluginsByCtor.get(ctor) || null
|
||
}
|
||
HasBehaviorByConstructorFunction(ctor) {
|
||
return this._behaviorsByCtor.has(ctor)
|
||
}
|
||
GetBehaviorByConstructorFunction(ctor) {
|
||
return this._behaviorsByCtor.get(ctor) || null
|
||
}
|
||
GetSystemPlugin() {
|
||
return this._systemPlugin
|
||
}
|
||
GetSolidBehavior() {
|
||
return this._solidBehavior
|
||
}
|
||
GetJumpthruBehavior() {
|
||
return this._jumpthruBehavior
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const allImageInfos = new Set;
|
||
C3.ImageInfo = class ImageInfo extends C3.DefendedBase {
|
||
constructor() {
|
||
super();
|
||
this._url = "";
|
||
this._size = 0;
|
||
this._pixelFormat = 0;
|
||
this._offsetX = 0;
|
||
this._offsetY = 0;
|
||
this._width = 0;
|
||
this._height = 0;
|
||
this._hasMetaData = false;
|
||
this._imageAsset = null;
|
||
this._textureState = "";
|
||
this._rcTex = C3.New(C3.Rect);
|
||
allImageInfos.add(this)
|
||
}
|
||
Release() {
|
||
this.ReleaseTexture();
|
||
this._imageAsset = null;
|
||
allImageInfos.delete(this)
|
||
}
|
||
static OnWebGLContextLost() {
|
||
for (const imageInfo of allImageInfos) {
|
||
imageInfo._textureState = "";
|
||
imageInfo._rcTex.set(0, 0, 0, 0)
|
||
}
|
||
}
|
||
LoadData(imageData) {
|
||
this._url = imageData[0];
|
||
this._size = imageData[1];
|
||
this._pixelFormat = imageData[2];
|
||
this._offsetX = imageData[3];
|
||
this._offsetY = imageData[4];
|
||
this._width = imageData[5];
|
||
this._height = imageData[6];
|
||
this._hasMetaData = true
|
||
}
|
||
LoadAnimationFrameData(frameData) {
|
||
this._url = frameData[0];
|
||
this._size = frameData[1];
|
||
this._offsetX = frameData[2];
|
||
this._offsetY = frameData[3];
|
||
this._width = frameData[4];
|
||
this._height = frameData[5];
|
||
this._pixelFormat = frameData[11];
|
||
this._hasMetaData = true
|
||
}
|
||
LoadDynamicAsset(runtime, url) {
|
||
if (this._imageAsset)
|
||
throw new Error("already loaded asset");
|
||
this._url = url;
|
||
const opts = {};
|
||
if (C3.IsAbsoluteURL(url))
|
||
opts.loadPolicy = "remote";
|
||
this.LoadAsset(runtime, opts);
|
||
return this._imageAsset.Load()
|
||
}
|
||
ReplaceWith(otherImageInfo) {
|
||
if (otherImageInfo === this)
|
||
throw new Error("cannot replace with self");
|
||
this.ReleaseTexture();
|
||
this._url = otherImageInfo._url;
|
||
this._size = otherImageInfo._size;
|
||
this._pixelFormat = otherImageInfo._pixelFormat;
|
||
this._offsetX = otherImageInfo._offsetX;
|
||
this._offsetY = otherImageInfo._offsetY;
|
||
this._width = otherImageInfo._width;
|
||
this._height = otherImageInfo._height;
|
||
this._hasMetaData = otherImageInfo._hasMetaData;
|
||
this._imageAsset = otherImageInfo._imageAsset;
|
||
this._textureState = otherImageInfo._textureState;
|
||
this._rcTex = otherImageInfo._rcTex
|
||
}
|
||
GetURL() {
|
||
return this._url
|
||
}
|
||
GetSize() {
|
||
return this._size
|
||
}
|
||
GetPixelFormat() {
|
||
return this._pixelFormat
|
||
}
|
||
GetOffsetX() {
|
||
return this._offsetX
|
||
}
|
||
GetOffsetY() {
|
||
return this._offsetY
|
||
}
|
||
GetWidth() {
|
||
return this._width
|
||
}
|
||
GetHeight() {
|
||
return this._height
|
||
}
|
||
GetSheetWidth() {
|
||
return this._imageAsset.GetWidth()
|
||
}
|
||
GetSheetHeight() {
|
||
return this._imageAsset.GetHeight()
|
||
}
|
||
LoadAsset(runtime, opts) {
|
||
if (this._imageAsset)
|
||
throw new Error("already got asset");
|
||
opts = Object.assign({}, opts, {
|
||
url: this.GetURL(),
|
||
size: this.GetSize()
|
||
});
|
||
this._imageAsset = runtime.LoadImage(opts)
|
||
}
|
||
IsLoaded() {
|
||
return this._imageAsset && this._imageAsset.IsLoaded()
|
||
}
|
||
async LoadStaticTexture(renderer, opts) {
|
||
if (!this._imageAsset)
|
||
throw new Error("no asset");
|
||
if (this._textureState)
|
||
throw new Error("already loaded texture");
|
||
this._textureState = "loading";
|
||
const texture = await this._imageAsset.LoadStaticTexture(renderer, opts);
|
||
if (!texture) {
|
||
this._textureState = "";
|
||
return null
|
||
}
|
||
this._textureState = "loaded";
|
||
if (!this._hasMetaData) {
|
||
this._width = texture.GetWidth();
|
||
this._height = texture.GetHeight();
|
||
this._hasMetaData = true
|
||
}
|
||
this._rcTex.set(this._offsetX, this._offsetY, this._offsetX + this._width, this._offsetY + this._height);
|
||
this._rcTex.divide(texture.GetWidth(), texture.GetHeight());
|
||
return texture
|
||
}
|
||
ReleaseTexture() {
|
||
if (!this._textureState)
|
||
return;
|
||
if (this._imageAsset)
|
||
this._imageAsset.ReleaseTexture();
|
||
this._textureState = "";
|
||
this._rcTex.set(0, 0, 0, 0)
|
||
}
|
||
GetTexture() {
|
||
return this._imageAsset ? this._imageAsset.GetTexture() : null
|
||
}
|
||
GetTexRect() {
|
||
return this._rcTex
|
||
}
|
||
async ExtractImageToCanvas() {
|
||
const srcDrawable = await this._imageAsset.LoadToDrawable();
|
||
const canvas = C3.CreateCanvas(this._width, this._height);
|
||
const ctx = canvas.getContext("2d");
|
||
ctx.drawImage(srcDrawable, this._offsetX, this._offsetY, this._width, this._height, 0, 0, this._width, this._height);
|
||
return canvas
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.AnimationInfo = class AnimationInfo extends C3.DefendedBase {
|
||
constructor(animData) {
|
||
super();
|
||
this._name = animData[0];
|
||
this._speed = animData[1];
|
||
this._isLooping = !!animData[2];
|
||
this._repeatCount = animData[3];
|
||
this._repeatTo = animData[4];
|
||
this._isPingPong = !!animData[5];
|
||
this._sid = animData[6];
|
||
this._frames = animData[7].map(frameData=>C3.New(C3.AnimationFrameInfo, frameData))
|
||
}
|
||
Release() {
|
||
for (const f of this._frames)
|
||
f.Release();
|
||
C3.clearArray(this._frames)
|
||
}
|
||
LoadAllAssets(runtime) {
|
||
for (const f of this._frames)
|
||
f.GetImageInfo().LoadAsset(runtime)
|
||
}
|
||
LoadAllTextures(renderer, opts) {
|
||
return Promise.all(this._frames.map(f=>f.GetImageInfo().LoadStaticTexture(renderer, opts)))
|
||
}
|
||
ReleaseAllTextures() {
|
||
for (const f of this._frames)
|
||
f.GetImageInfo().ReleaseTexture()
|
||
}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
GetSID() {
|
||
return this._sid
|
||
}
|
||
GetFrameCount() {
|
||
return this._frames.length
|
||
}
|
||
GetFrames() {
|
||
return this._frames
|
||
}
|
||
GetFrameAt(i) {
|
||
i = Math.floor(i);
|
||
if (i < 0 || i >= this._frames.length)
|
||
throw new RangeError("invalid frame");
|
||
return this._frames[i]
|
||
}
|
||
GetSpeed() {
|
||
return this._speed
|
||
}
|
||
IsLooping() {
|
||
return this._isLooping
|
||
}
|
||
GetRepeatCount() {
|
||
return this._repeatCount
|
||
}
|
||
GetRepeatTo() {
|
||
return this._repeatTo
|
||
}
|
||
IsPingPong() {
|
||
return this._isPingPong
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.AnimationFrameInfo = class AnimationFrameInfo extends C3.DefendedBase {
|
||
constructor(frameData) {
|
||
super();
|
||
this._imageInfo = C3.New(C3.ImageInfo);
|
||
this._imageInfo.LoadAnimationFrameData(frameData);
|
||
this._duration = frameData[6];
|
||
this._origin = C3.New(C3.Vector2, frameData[7], frameData[8]);
|
||
this._imagePoints = frameData[9].map(data=>C3.New(C3.ImagePoint, this, data));
|
||
this._imagePointsByName = new Map;
|
||
for (const ip of this._imagePoints)
|
||
this._imagePointsByName.set(ip.GetName().toLowerCase(), ip);
|
||
this._collisionPoly = null;
|
||
const polyPoints = frameData[10];
|
||
if (polyPoints.length >= 6)
|
||
this._collisionPoly = C3.New(C3.CollisionPoly, polyPoints)
|
||
}
|
||
Release() {
|
||
if (this._collisionPoly) {
|
||
this._collisionPoly.Release();
|
||
this._collisionPoly = null
|
||
}
|
||
this._imageInfo.Release();
|
||
this._imageInfo = null
|
||
}
|
||
GetImageInfo() {
|
||
return this._imageInfo
|
||
}
|
||
GetDuration() {
|
||
return this._duration
|
||
}
|
||
GetOriginX() {
|
||
return this._origin.getX()
|
||
}
|
||
GetOriginY() {
|
||
return this._origin.getY()
|
||
}
|
||
GetCollisionPoly() {
|
||
return this._collisionPoly
|
||
}
|
||
GetImagePointByName(name) {
|
||
return this._imagePointsByName.get(name.toLowerCase()) || null
|
||
}
|
||
GetImagePointByIndex(index) {
|
||
index = Math.floor(index);
|
||
if (index < 0 || index >= this._imagePoints.length)
|
||
return null;
|
||
return this._imagePoints[index]
|
||
}
|
||
GetImagePointCount() {
|
||
return this._imagePoints.length
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.ImagePoint = class ImagePoint extends C3.DefendedBase {
|
||
constructor(afi, data) {
|
||
super();
|
||
this._afi = afi;
|
||
this._name = data[0];
|
||
this._pos = C3.New(C3.Vector2, data[1], data[2])
|
||
}
|
||
Release() {}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
GetX() {
|
||
return this._pos.getX()
|
||
}
|
||
GetY() {
|
||
return this._pos.getY()
|
||
}
|
||
GetVec2() {
|
||
return this._pos
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const C3Debugger = self.C3Debugger;
|
||
const IObjectClass = self.IObjectClass;
|
||
const assert = self.assert;
|
||
C3.ObjectClass = class ObjectClass extends C3.DefendedBase {
|
||
constructor(runtime, index, data) {
|
||
super();
|
||
const PluginCtor = runtime.GetObjectReference(data[1]);
|
||
this._runtime = runtime;
|
||
this._plugin = runtime.GetPluginManager().GetPluginByConstructorFunction(PluginCtor);
|
||
this._sdkType = null;
|
||
this._instSdkCtor = PluginCtor.Instance;
|
||
this._index = index;
|
||
this._sid = data[11];
|
||
this._name = data[0];
|
||
this._jsPropName = this._runtime.GetJsPropName(data[14]);
|
||
this._isGlobal = !!data[9];
|
||
this._isFamily = !!data[2];
|
||
this._isOnLoaderLayout = !!data[10];
|
||
this._instVars = data[3].map(arr=>({
|
||
sid: arr[0],
|
||
type: arr[1],
|
||
name: arr[2],
|
||
jsPropName: runtime.GetJsPropName(arr[3])
|
||
}));
|
||
this._behaviorsCount = data[4];
|
||
this._effectsCount = data[5];
|
||
this._isWorldType = this._plugin.IsWorldType();
|
||
this._effectList = null;
|
||
this._collisionGrid = C3.New(C3.SparseGrid, runtime.GetOriginalViewportWidth(), runtime.GetOriginalViewportHeight());
|
||
this._anyCollisionCellChanged = true;
|
||
this._anyInstanceParallaxed = false;
|
||
this._familyMembers = null;
|
||
this._familyMembersSet = null;
|
||
this._familyIndex = -1;
|
||
this._families = null;
|
||
this._familiesSet = null;
|
||
this._familyInstVarMap = null;
|
||
this._familyBehaviorMap = null;
|
||
this._familyEffectMap = null;
|
||
this._isInContainer = false;
|
||
this._container = null;
|
||
this._behaviorTypes = data[8].map(behaviorTypeData=>C3.BehaviorType.Create(this, behaviorTypeData));
|
||
this._behaviorTypesIncludingInherited = [];
|
||
this._behaviorsByName = new Map;
|
||
this._behaviorNameToIndex = new Map;
|
||
this._usedBehaviorCtors = new Set;
|
||
this._solStack = C3.New(C3.SolStack, this);
|
||
this._defaultInstanceData = null;
|
||
this._defaultLayerIndex = 0;
|
||
this._isContained = false;
|
||
this._container = null;
|
||
this._imageInfo = null;
|
||
this._animations = null;
|
||
this._animationsByName = null;
|
||
this._animationsBySid = null;
|
||
this._textureRefCount = 0;
|
||
this._savedData = new Map;
|
||
this._unsavedData = new Map;
|
||
this._instances = [];
|
||
this._iidsStale = true;
|
||
if (this._plugin.HasEffects())
|
||
this._effectList = C3.New(C3.EffectList, this, data[12]);
|
||
if (data[6]) {
|
||
this._imageInfo = C3.New(C3.ImageInfo);
|
||
this._imageInfo.LoadData(data[6])
|
||
}
|
||
if (data[7]) {
|
||
this._animations = data[7].map(animData=>C3.New(C3.AnimationInfo, animData));
|
||
this._animationsByName = new Map;
|
||
this._animationsBySid = new Map;
|
||
for (const anim of this._animations) {
|
||
this._animationsByName.set(anim.GetName().toLowerCase(), anim);
|
||
this._animationsBySid.set(anim.GetSID(), anim)
|
||
}
|
||
}
|
||
if (this._isFamily) {
|
||
this._familyMembers = [];
|
||
this._familyMembersSet = new Set;
|
||
this._familyIndex = this._runtime._GetNextFamilyIndex()
|
||
} else {
|
||
this._families = [];
|
||
this._familiesSet = new Set;
|
||
this._familyInstVarMap = [];
|
||
this._familyBehaviorMap = [];
|
||
this._familyEffectMap = []
|
||
}
|
||
this._sdkType = C3.New(PluginCtor.Type, this, data[15]);
|
||
this._iObjectClass = null;
|
||
this._instanceUserScriptClass = null;
|
||
this._userScriptDispatcher = C3.New(C3.Event.Dispatcher);
|
||
const CustomScriptClass = this._sdkType.GetScriptInterfaceClass();
|
||
if (CustomScriptClass) {
|
||
this._iObjectClass = new CustomScriptClass(this);
|
||
if (!(this._iObjectClass instanceof IObjectClass))
|
||
throw new TypeError("script interface class must derive from IObjectClass");
|
||
} else
|
||
this._iObjectClass = new IObjectClass(this);
|
||
if (data[13]) {
|
||
const tilemapData = data[13];
|
||
if (tilemapData) {
|
||
const tilePolyData = tilemapData[0];
|
||
const maxTileIndex = tilemapData[1];
|
||
this._sdkType.LoadTilemapData(tilePolyData, maxTileIndex)
|
||
}
|
||
}
|
||
if (!this._runtime.UsesLoaderLayout() || this._isFamily || this._isOnLoaderLayout || !this._isWorldType)
|
||
this.OnCreate();
|
||
if (this._plugin.IsSingleGlobal()) {
|
||
this._plugin._SetSingleGlobalObjectClass(this);
|
||
this._CreateSingleGlobalInstance(data)
|
||
}
|
||
}
|
||
static Create(runtime, index, objectClassData) {
|
||
return C3.New(C3.ObjectClass, runtime, index, objectClassData)
|
||
}
|
||
Release() {
|
||
if (this._imageInfo) {
|
||
this._imageInfo.Release();
|
||
this._imageInfo = null
|
||
}
|
||
if (this._animations) {
|
||
for (const a of this._animations)
|
||
a.Release();
|
||
C3.clearArray(this._animations);
|
||
this._animationsByName.clear();
|
||
this._animationsBySid.clear()
|
||
}
|
||
this._solStack.Release();
|
||
this._solStack = null;
|
||
this._savedData.clear();
|
||
this._unsavedData.clear();
|
||
this._container = null;
|
||
this._runtime = null
|
||
}
|
||
_LoadFamily(familyData) {
|
||
for (let i = 1, len = familyData.length; i < len; ++i) {
|
||
const memberType = this._runtime.GetObjectClassByIndex(familyData[i]);
|
||
this._familyMembers.push(memberType);
|
||
this._familyMembersSet.add(memberType);
|
||
memberType._families.push(this);
|
||
memberType._familiesSet.add(this)
|
||
}
|
||
}
|
||
_SetContainer(container) {
|
||
this._isInContainer = true;
|
||
this._container = container
|
||
}
|
||
IsInContainer() {
|
||
return this._isInContainer
|
||
}
|
||
GetContainer() {
|
||
return this._container
|
||
}
|
||
_OnAfterCreate() {
|
||
let index = 0;
|
||
if (!this._isFamily)
|
||
for (const family of this._families)
|
||
for (const familyBehType of family.GetBehaviorTypes()) {
|
||
const lowerName = familyBehType.GetName().toLowerCase();
|
||
this._behaviorsByName.set(lowerName, familyBehType);
|
||
this._behaviorNameToIndex.set(lowerName, index);
|
||
this._behaviorTypesIncludingInherited.push(familyBehType);
|
||
++index
|
||
}
|
||
for (const behaviorType of this.GetBehaviorTypes()) {
|
||
const lowerName = behaviorType.GetName().toLowerCase();
|
||
this._behaviorsByName.set(lowerName, behaviorType);
|
||
this._behaviorNameToIndex.set(lowerName, index);
|
||
this._behaviorTypesIncludingInherited.push(behaviorType);
|
||
++index
|
||
}
|
||
for (const behaviorType of this._behaviorTypesIncludingInherited)
|
||
this._usedBehaviorCtors.add(behaviorType.GetBehavior().constructor);
|
||
if (!this._isFamily && this._families.length) {
|
||
const familyCount = this._runtime.GetFamilyCount();
|
||
C3.extendArray(this._familyInstVarMap, familyCount, 0);
|
||
C3.extendArray(this._familyBehaviorMap, familyCount, 0);
|
||
C3.extendArray(this._familyEffectMap, familyCount, 0);
|
||
const allFx = [];
|
||
let ivSum = 0;
|
||
let behSum = 0;
|
||
let fxSum = 0;
|
||
for (const family of this._families) {
|
||
const familyIndex = family.GetFamilyIndex();
|
||
this._familyInstVarMap[familyIndex] = ivSum;
|
||
ivSum += family.GetInstanceVariablesCount();
|
||
this._familyBehaviorMap[familyIndex] = behSum;
|
||
behSum += family.GetBehaviorTypesCount();
|
||
this._familyEffectMap[familyIndex] = fxSum;
|
||
fxSum += family.GetEffectTypesCount();
|
||
const familyEffectList = family.GetEffectList();
|
||
if (familyEffectList && this._effectList)
|
||
for (const effectType of familyEffectList.GetAllEffectTypes())
|
||
allFx.push(effectType.Clone(this._effectList))
|
||
}
|
||
if (this._effectList)
|
||
this._effectList.PrependEffectTypes(allFx)
|
||
}
|
||
}
|
||
_CreateSingleGlobalInstance(data) {
|
||
const uid = this._runtime._GetNewUID();
|
||
const inst = C3.New(C3.Instance, {
|
||
runtime: this._runtime,
|
||
objectType: this,
|
||
uid: uid
|
||
});
|
||
inst._CreateSdkInstance(data[16], []);
|
||
this._runtime._MapInstanceByUID(uid, inst);
|
||
this._instances.push(inst)
|
||
}
|
||
GetSdkType() {
|
||
return this._sdkType
|
||
}
|
||
IsOnLoaderLayout() {
|
||
return this._isOnLoaderLayout
|
||
}
|
||
OnCreate() {
|
||
if (!this._isFamily)
|
||
this._sdkType.OnCreate()
|
||
}
|
||
HasLoadedTextures() {
|
||
return this._textureRefCount > 0
|
||
}
|
||
LoadTextures(renderer) {
|
||
if (this._isFamily)
|
||
return Promise.resolve();
|
||
this._textureRefCount++;
|
||
if (this._textureRefCount === 1)
|
||
return this._sdkType.LoadTextures(renderer) || Promise.resolve();
|
||
else
|
||
return Promise.resolve()
|
||
}
|
||
ReleaseTextures() {
|
||
if (this._isFamily)
|
||
return;
|
||
this._textureRefCount--;
|
||
if (this._textureRefCount < 0)
|
||
throw new Error("released textures too many times");
|
||
if (this._textureRefCount === 0)
|
||
this._sdkType.ReleaseTextures()
|
||
}
|
||
OnDynamicTextureLoadComplete() {
|
||
if (this._isFamily)
|
||
throw new Error("not applicable to family");
|
||
this._sdkType.OnDynamicTextureLoadComplete()
|
||
}
|
||
PreloadTexturesWithInstances(renderer) {
|
||
if (this._isFamily)
|
||
return Promise.resolve();
|
||
return this._sdkType.PreloadTexturesWithInstances(renderer)
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetPlugin() {
|
||
return this._plugin
|
||
}
|
||
GetInstanceSdkCtor() {
|
||
return this._instSdkCtor
|
||
}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
GetJsPropName() {
|
||
return this._jsPropName
|
||
}
|
||
GetIndex() {
|
||
return this._index
|
||
}
|
||
GetSID() {
|
||
return this._sid
|
||
}
|
||
IsFamily() {
|
||
return this._isFamily
|
||
}
|
||
IsGlobal() {
|
||
return this._isGlobal
|
||
}
|
||
IsWorldType() {
|
||
return this._isWorldType
|
||
}
|
||
GetFamilyIndex() {
|
||
return this._familyIndex
|
||
}
|
||
GetBehaviorTypes() {
|
||
return this._behaviorTypes
|
||
}
|
||
GetBehaviorTypesCount() {
|
||
return this._behaviorsCount
|
||
}
|
||
UsesBehaviorByCtor(Ctor) {
|
||
return Ctor && this._usedBehaviorCtors.has(Ctor)
|
||
}
|
||
GetInstanceVariablesCount() {
|
||
return this._instVars.length
|
||
}
|
||
GetInstanceVariableSIDs() {
|
||
return this._instVars.map(iv=>iv.sid)
|
||
}
|
||
GetInstanceVariableIndexBySID(sid) {
|
||
return this._instVars.findIndex(iv=>iv.sid === sid)
|
||
}
|
||
GetInstanceVariableIndexByName(name) {
|
||
return this._instVars.findIndex(iv=>iv.name === name)
|
||
}
|
||
_GetAllInstanceVariableNames() {
|
||
return this._instVars.map(iv=>iv.name)
|
||
}
|
||
_GetAllInstanceVariableJsPropNames() {
|
||
return this._instVars.map(iv=>iv.jsPropName)
|
||
}
|
||
GetInstanceVariableType(i) {
|
||
i = Math.floor(i);
|
||
if (i < 0 || i >= this._instVars.length)
|
||
throw new RangeError("invalid instance variable index");
|
||
return this._instVars[i].type
|
||
}
|
||
GetInstanceVariableName(i) {
|
||
i = Math.floor(i);
|
||
if (i < 0 || i >= this._instVars.length)
|
||
throw new RangeError("invalid instance variable index");
|
||
return this._instVars[i].name
|
||
}
|
||
GetEffectTypesCount() {
|
||
return this._effectsCount
|
||
}
|
||
GetBehaviorTypesIncludingInherited() {
|
||
return this._behaviorTypesIncludingInherited
|
||
}
|
||
GetBehaviorTypeByName(name) {
|
||
return this._behaviorsByName.get(name.toLowerCase()) || null
|
||
}
|
||
GetBehaviorIndexByName(name) {
|
||
const ret = this._behaviorNameToIndex.get(name.toLowerCase());
|
||
if (typeof ret === "undefined")
|
||
return -1;
|
||
else
|
||
return ret
|
||
}
|
||
GetEffectList() {
|
||
return this._effectList
|
||
}
|
||
HasEffects() {
|
||
return this._plugin.HasEffects()
|
||
}
|
||
UsesEffects() {
|
||
return this._effectList && this._effectList.HasAnyEffectType()
|
||
}
|
||
GetSolStack() {
|
||
return this._solStack
|
||
}
|
||
GetCurrentSol() {
|
||
return this._solStack.GetCurrentSol()
|
||
}
|
||
GetImageInfo() {
|
||
return this._imageInfo
|
||
}
|
||
SetDefaultInstanceData(d) {
|
||
this._defaultInstanceData = d
|
||
}
|
||
GetDefaultInstanceData() {
|
||
return this._defaultInstanceData
|
||
}
|
||
_SetDefaultLayerIndex(i) {
|
||
this._defaultLayerIndex = i
|
||
}
|
||
GetDefaultLayerIndex() {
|
||
return this._defaultLayerIndex
|
||
}
|
||
GetAnimations() {
|
||
return this._animations
|
||
}
|
||
GetAnimationCount() {
|
||
return this._animations.length
|
||
}
|
||
GetFamilies() {
|
||
return this._families
|
||
}
|
||
BelongsToFamily(family) {
|
||
return this._familiesSet.has(family)
|
||
}
|
||
GetFamilyMembers() {
|
||
return this._familyMembers
|
||
}
|
||
FamilyHasMember(objectType) {
|
||
return this._familyMembersSet.has(objectType)
|
||
}
|
||
GetFamilyBehaviorOffset(familyIndex) {
|
||
return this._familyBehaviorMap[familyIndex]
|
||
}
|
||
GetFamilyInstanceVariableOffset(familyIndex) {
|
||
return this._familyInstVarMap[familyIndex]
|
||
}
|
||
GetAnimationByName(name) {
|
||
if (!this._animations)
|
||
throw new Error("no animations");
|
||
return this._animationsByName.get(name.toLowerCase()) || null
|
||
}
|
||
GetAnimationBySID(sid) {
|
||
if (!this._animations)
|
||
throw new Error("no animations");
|
||
return this._animationsBySid.get(sid) || null
|
||
}
|
||
GetFirstAnimationFrame() {
|
||
if (!this._animations)
|
||
throw new Error("no animations");
|
||
return this._animations[0].GetFrameAt(0)
|
||
}
|
||
GetDefaultInstanceSize() {
|
||
if (this._animations) {
|
||
const firstFrameInfo = this.GetFirstAnimationFrame().GetImageInfo();
|
||
return [firstFrameInfo.GetWidth(), firstFrameInfo.GetHeight()]
|
||
} else if (this._imageInfo)
|
||
return [this._imageInfo.GetWidth(), this._imageInfo.GetHeight()];
|
||
else
|
||
return [100, 100]
|
||
}
|
||
GetSingleGlobalInstance() {
|
||
if (!this._plugin.IsSingleGlobal())
|
||
throw new Error("not a single-global plugin");
|
||
return this._instances[0]
|
||
}
|
||
GetInstances() {
|
||
return this._instances
|
||
}
|
||
*instances() {
|
||
yield*this._instances
|
||
}
|
||
*instancesIncludingPendingCreate() {
|
||
yield*this._instances;
|
||
for (const inst of this._runtime._GetInstancesPendingCreate())
|
||
if (inst.GetObjectClass() === this)
|
||
yield inst
|
||
}
|
||
GetInstanceCount() {
|
||
return this._instances.length
|
||
}
|
||
_AddInstance(inst) {
|
||
this._instances.push(inst)
|
||
}
|
||
_SetIIDsStale() {
|
||
this._iidsStale = true
|
||
}
|
||
_UpdateIIDs() {
|
||
if (!this._iidsStale || this._isFamily)
|
||
return;
|
||
const instances = this._instances;
|
||
let i = 0;
|
||
for (let len = instances.length; i < len; ++i)
|
||
instances[i]._SetIID(i);
|
||
const instancesPendingCreate = this._runtime._GetInstancesPendingCreate();
|
||
for (const inst of instancesPendingCreate)
|
||
if (inst.GetObjectClass() === this)
|
||
inst._SetIID(i++);
|
||
this._iidsStale = false
|
||
}
|
||
GetInstanceByIID(i) {
|
||
const instances = this._instances;
|
||
if (i < instances.length)
|
||
return instances[i];
|
||
i -= instances.length;
|
||
const instancesPendingCreate = this._runtime._GetInstancesPendingCreate();
|
||
for (const inst of instancesPendingCreate)
|
||
if (inst.GetObjectClass() === this) {
|
||
if (i === 0)
|
||
return inst;
|
||
--i
|
||
}
|
||
return null
|
||
}
|
||
GetFirstPicked(fromInst) {
|
||
if (fromInst && fromInst.IsInContainer() && fromInst.GetObjectClass() !== this)
|
||
for (const s of fromInst.siblings())
|
||
if (s.GetObjectClass() === this)
|
||
return s;
|
||
const instances = this.GetCurrentSol().GetInstances();
|
||
if (instances.length)
|
||
return instances[0];
|
||
else
|
||
return null
|
||
}
|
||
GetPairedInstance(inst) {
|
||
const instances = this.GetCurrentSol().GetInstances();
|
||
if (instances.length)
|
||
return instances[inst.GetIID() % instances.length];
|
||
else
|
||
return null
|
||
}
|
||
*allCorrespondingInstances(inst, objectClass) {
|
||
const myInstances = this.GetCurrentSol().GetInstances();
|
||
const myInstanceCount = myInstances.length;
|
||
const otherSol = objectClass.GetCurrentSol();
|
||
const otherInstances = objectClass.GetCurrentSol().GetInstances();
|
||
const otherInstanceCount = otherInstances.length;
|
||
let index = inst.GetIID();
|
||
if (objectClass.IsFamily() || !otherSol.IsSelectAll())
|
||
index = otherInstances.indexOf(inst);
|
||
const divisor = Math.ceil(myInstanceCount / otherInstanceCount);
|
||
const remainder = myInstanceCount % otherInstanceCount;
|
||
let startIndex = 0;
|
||
let correspondCount = 0;
|
||
if (remainder === 0 || index < remainder) {
|
||
startIndex = index * divisor;
|
||
correspondCount = divisor
|
||
} else {
|
||
startIndex = remainder * divisor + (index - remainder) * (divisor - 1);
|
||
correspondCount = divisor - 1
|
||
}
|
||
for (let i = startIndex, end = startIndex + correspondCount; i < end; ++i)
|
||
yield myInstances[i]
|
||
}
|
||
FinishCondition(f) {
|
||
this._sdkType.FinishCondition(f)
|
||
}
|
||
ApplySolToContainer() {
|
||
if (!this._isInContainer || this._isFamily)
|
||
return;
|
||
this._UpdateIIDs();
|
||
const sol1 = this.GetCurrentSol();
|
||
const sol1instances = sol1._GetOwnInstances();
|
||
const selectAll = sol1.IsSelectAll();
|
||
const es = this._runtime.GetCurrentEventStackFrame();
|
||
const isOrBlock = es && es.GetCurrentEvent() && es.GetCurrentEvent().IsOrBlock();
|
||
for (const containerType of this._container.objectTypes()) {
|
||
if (containerType === this)
|
||
continue;
|
||
containerType._UpdateIIDs();
|
||
const sol2 = containerType.GetCurrentSol();
|
||
sol2._SetSelectAll(selectAll);
|
||
if (!selectAll) {
|
||
const sol2instances = sol2._GetOwnInstances();
|
||
C3.clearArray(sol2instances);
|
||
for (const inst of sol1instances)
|
||
sol2instances.push(containerType.GetInstanceByIID(inst.GetIID()));
|
||
if (isOrBlock) {
|
||
const sol1elseInstances = sol1._GetOwnElseInstances();
|
||
const sol2elseInstances = sol2._GetOwnElseInstances();
|
||
C3.clearArray(sol2elseInstances);
|
||
for (const inst of sol1elseInstances)
|
||
sol2elseInstances.push(containerType.GetInstanceByIID(inst.GetIID()))
|
||
}
|
||
}
|
||
}
|
||
}
|
||
_TruncateContainerSols(useElseInstances, i) {
|
||
for (const containerType of this.GetContainer().objectTypes()) {
|
||
const sol = containerType.GetCurrentSol();
|
||
if (useElseInstances)
|
||
C3.truncateArray(sol._GetOwnElseInstances(), i);
|
||
else
|
||
C3.truncateArray(sol._GetOwnInstances(), i)
|
||
}
|
||
}
|
||
_GetCollisionCellGrid() {
|
||
return this._collisionGrid
|
||
}
|
||
_SetAnyCollisionCellChanged(c) {
|
||
this._anyCollisionCellChanged = !!c
|
||
}
|
||
_SetAnyInstanceParallaxed(p) {
|
||
this._anyInstanceParallaxed = !!p
|
||
}
|
||
IsAnyInstanceParallaxed() {
|
||
return this._anyInstanceParallaxed
|
||
}
|
||
_UpdateAllCollisionCells() {
|
||
if (!this._anyCollisionCellChanged || !this._isWorldType)
|
||
return;
|
||
for (const inst of this._instances)
|
||
inst.GetWorldInfo()._UpdateCollisionCell();
|
||
for (const inst of this._runtime._GetInstancesPendingCreate())
|
||
if (inst.GetObjectClass() === this)
|
||
inst.GetWorldInfo()._UpdateCollisionCell();
|
||
this._anyCollisionCellChanged = false
|
||
}
|
||
GetSavedDataMap() {
|
||
if (!this._savedData)
|
||
this._savedData = new Map;
|
||
return this._savedData
|
||
}
|
||
GetUnsavedDataMap() {
|
||
if (!this._unsavedData)
|
||
this._unsavedData = new Map;
|
||
return this._unsavedData
|
||
}
|
||
HasSolidBehavior() {
|
||
return this.UsesBehaviorByCtor(C3.Behaviors.solid)
|
||
}
|
||
HasNoSaveBehavior() {
|
||
return this.UsesBehaviorByCtor(C3.Behaviors.NoSave)
|
||
}
|
||
HasPersistBehavior() {
|
||
return this.UsesBehaviorByCtor(C3.Behaviors.Persist)
|
||
}
|
||
_SaveToJson() {
|
||
const o = {
|
||
"instances": this._instances.map(inst=>inst.SaveToJson())
|
||
};
|
||
if (this._savedData && this._savedData.size)
|
||
o["ex"] = C3.ToSuperJSON(this._savedData);
|
||
return o
|
||
}
|
||
_LoadFromJson(o) {
|
||
if (this._savedData) {
|
||
this._savedData.clear();
|
||
this._savedData = null
|
||
}
|
||
const ex = o["ex"];
|
||
if (ex)
|
||
this._savedData = C3.FromSuperJSON(ex);
|
||
const existingInstances = this._instances;
|
||
const loadInstances = o["instances"];
|
||
for (let i = 0, len = Math.min(existingInstances.length, loadInstances.length); i < len; ++i)
|
||
existingInstances[i].LoadFromJson(loadInstances[i]);
|
||
for (let i = loadInstances.length, len = existingInstances.length; i < len; ++i)
|
||
this._runtime.DestroyInstance(existingInstances[i]);
|
||
for (let i = existingInstances.length, len = loadInstances.length; i < len; ++i) {
|
||
const data = loadInstances[i];
|
||
let layer = null;
|
||
if (this.IsWorldType()) {
|
||
layer = this._runtime.GetMainRunningLayout().GetLayerBySID(data["w"]["l"]);
|
||
if (!layer)
|
||
continue
|
||
}
|
||
const inst = this._runtime.CreateInstanceFromData(this._defaultInstanceData || this, layer, false, 0, 0, true);
|
||
inst.LoadFromJson(data)
|
||
}
|
||
this._SetIIDsStale()
|
||
}
|
||
GetIObjectClass() {
|
||
return this._iObjectClass
|
||
}
|
||
UserScriptDispatcher() {
|
||
return this._userScriptDispatcher
|
||
}
|
||
_GetUserScriptInstanceClass() {
|
||
return this._instanceUserScriptClass
|
||
}
|
||
_SetUserScriptInstanceClass(Class) {
|
||
this._instanceUserScriptClass = Class
|
||
}
|
||
DispatchUserScriptEvent(e) {
|
||
const runtime = this._runtime;
|
||
const shouldTime = runtime.IsDebug() && !runtime.GetEventSheetManager().IsInEventEngine();
|
||
if (shouldTime)
|
||
C3Debugger.StartMeasuringScriptTime();
|
||
this._userScriptDispatcher.dispatchEvent(e);
|
||
if (shouldTime)
|
||
C3Debugger.AddScriptTime()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Container = class Container extends C3.DefendedBase {
|
||
constructor(runtime, objectTypes) {
|
||
super();
|
||
this._runtime = runtime;
|
||
this._objectTypes = objectTypes;
|
||
for (const objectType of this._objectTypes)
|
||
objectType._SetContainer(this)
|
||
}
|
||
Release() {
|
||
this._runtime = null
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetObjectTypes() {
|
||
return this._objectTypes
|
||
}
|
||
objectTypes() {
|
||
return this._objectTypes
|
||
}
|
||
HasAnyWorldType() {
|
||
return this._objectTypes.some(o=>o.IsWorldType())
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const C3Debugger = self.C3Debugger;
|
||
const IInstance = self.IInstance;
|
||
const EMPTY_ARRAY = [];
|
||
let nextPuid = 0;
|
||
const savedDataMaps = new WeakMap;
|
||
const unsavedDataMaps = new WeakMap;
|
||
const FLAG_DESTROYED = 1 << 0;
|
||
const FLAG_TILEMAP = 1 << 1;
|
||
const FLAG_MUST_PREDRAW = 1 << 2;
|
||
const FLAG_SOLID_ENABLED = 1 << 3;
|
||
const FLAG_JUMPTHRU_ENABLED = 1 << 4;
|
||
C3.Instance = class Instance extends C3.DefendedBase {
|
||
constructor(opts) {
|
||
super();
|
||
this._runtime = opts.runtime;
|
||
this._objectType = opts.objectType;
|
||
this._worldInfo = null;
|
||
this._sdkInst = null;
|
||
this._iScriptInterface = null;
|
||
this._iid = 0;
|
||
this._uid = opts.uid;
|
||
this._puid = nextPuid++;
|
||
this._flags = 0;
|
||
this._instVarValues = EMPTY_ARRAY;
|
||
this._behaviorInstances = EMPTY_ARRAY;
|
||
const behaviorTypes = this._objectType.GetBehaviorTypesIncludingInherited();
|
||
if (behaviorTypes.length > 0)
|
||
this._behaviorInstances = behaviorTypes.map((behaviorType,index)=>C3.New(C3.BehaviorInstance, {
|
||
runtime: this._runtime,
|
||
behaviorType: behaviorType,
|
||
instance: this,
|
||
index
|
||
}));
|
||
this._siblings = this._objectType.IsInContainer() ? [] : null;
|
||
this._timeScale = -1;
|
||
this._dispatcher = null;
|
||
const plugin = this.GetPlugin();
|
||
if (plugin.MustPreDraw())
|
||
this._flags |= FLAG_MUST_PREDRAW;
|
||
if (plugin.IsWorldType()) {
|
||
this._worldInfo = C3.New(C3.WorldInfo, this, opts.layer);
|
||
if (opts.worldData)
|
||
this._worldInfo.Init(opts.worldData);
|
||
else {
|
||
this._worldInfo.InitNoData();
|
||
const [width,height] = this._objectType.GetDefaultInstanceSize();
|
||
this._worldInfo.SetSize(width, height);
|
||
if (this.GetObjectClass().UsesEffects())
|
||
this._worldInfo.GetInstanceEffectList().LoadDefaultEffectParameters()
|
||
}
|
||
}
|
||
if (opts.instVarData)
|
||
this._LoadInstanceVariableData(opts.instVarData);
|
||
else
|
||
this._LoadDefaultInstanceVariables()
|
||
}
|
||
Release() {
|
||
if (this._iScriptInterface) {
|
||
this._iScriptInterface._Release();
|
||
this._iScriptInterface = null
|
||
}
|
||
if (this._behaviorInstances.length > 0) {
|
||
for (const behInst of this._behaviorInstances)
|
||
behInst.Release();
|
||
C3.clearArray(this._behaviorInstances)
|
||
}
|
||
this._sdkInst.Release();
|
||
this._sdkInst = null;
|
||
const savedData = savedDataMaps.get(this);
|
||
if (savedData) {
|
||
savedData.clear();
|
||
savedDataMaps.delete(this)
|
||
}
|
||
const unsavedData = unsavedDataMaps.get(this);
|
||
if (unsavedData) {
|
||
unsavedData.clear();
|
||
unsavedDataMaps.delete(this)
|
||
}
|
||
if (this._siblings)
|
||
C3.clearArray(this._siblings);
|
||
if (this._dispatcher) {
|
||
this._dispatcher.Release();
|
||
this._dispatcher = null
|
||
}
|
||
this._runtime = null;
|
||
this._objectType = null;
|
||
if (this._instVarValues.length > 0)
|
||
C3.clearArray(this._instVarValues);
|
||
if (this._worldInfo) {
|
||
this._worldInfo.Release();
|
||
this._worldInfo = null
|
||
}
|
||
}
|
||
_LoadInstanceVariableData(instVarData) {
|
||
if (instVarData.length > 0) {
|
||
this._instVarValues = [];
|
||
C3.shallowAssignArray(this._instVarValues, instVarData)
|
||
}
|
||
}
|
||
_LoadDefaultInstanceVariables() {
|
||
const len = this._objectType.GetInstanceVariablesCount();
|
||
if (len === 0)
|
||
return;
|
||
this._instVarValues = [];
|
||
const typeToInitValue = [0, 0, ""];
|
||
for (let i = 0; i < len; ++i)
|
||
this._instVarValues.push(typeToInitValue[this._objectType.GetInstanceVariableType(i)])
|
||
}
|
||
_CreateSdkInstance(properties, behInstProperties) {
|
||
if (this._sdkInst)
|
||
throw new Error("already got sdk instance");
|
||
for (let i = 0, len = this._behaviorInstances.length; i < len; ++i) {
|
||
const behInst = this._behaviorInstances[i];
|
||
behInst._CreateSdkInstance(behInstProperties ? behInstProperties[i] : null)
|
||
}
|
||
this._sdkInst = C3.New(this._objectType.GetInstanceSdkCtor(), this, properties);
|
||
if (!(this._sdkInst instanceof C3.SDKInstanceBase))
|
||
throw new Error("sdk type must derive from SDKInstanceBase");
|
||
for (let i = 0, len = this._behaviorInstances.length; i < len; ++i)
|
||
this._behaviorInstances[i].PostCreate();
|
||
if (this._objectType._GetUserScriptInstanceClass())
|
||
this._InitUserScriptInterface()
|
||
}
|
||
GetSdkInstance() {
|
||
return this._sdkInst
|
||
}
|
||
GetWorldInfo() {
|
||
return this._worldInfo
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetTimeScale() {
|
||
return this._timeScale
|
||
}
|
||
GetActiveTimeScale() {
|
||
const ts = this._timeScale;
|
||
if (ts === -1)
|
||
return this.GetRuntime().GetTimeScale();
|
||
else
|
||
return ts
|
||
}
|
||
SetTimeScale(ts) {
|
||
ts = +ts;
|
||
if (ts < 0 || !isFinite(ts))
|
||
ts = 0;
|
||
this._timeScale = ts
|
||
}
|
||
RestoreTimeScale() {
|
||
this._timeScale = -1
|
||
}
|
||
Dispatcher() {
|
||
if (!this._dispatcher)
|
||
this._dispatcher = C3.New(C3.Event.Dispatcher);
|
||
return this._dispatcher
|
||
}
|
||
Draw(renderer) {
|
||
this._sdkInst.Draw(renderer)
|
||
}
|
||
OnCreate(properties) {
|
||
this._sdkInst.OnCreate(properties)
|
||
}
|
||
_SetHasTilemap() {
|
||
this._flags |= FLAG_TILEMAP
|
||
}
|
||
HasTilemap() {
|
||
return (this._flags & FLAG_TILEMAP) !== 0
|
||
}
|
||
_MarkDestroyed() {
|
||
this._flags |= FLAG_DESTROYED
|
||
}
|
||
IsDestroyed() {
|
||
return (this._flags & FLAG_DESTROYED) !== 0
|
||
}
|
||
MustPreDraw() {
|
||
return (this._flags & FLAG_MUST_PREDRAW) !== 0
|
||
}
|
||
_IsSolidEnabled() {
|
||
return (this._flags & FLAG_SOLID_ENABLED) !== 0
|
||
}
|
||
_SetSolidEnabled(e) {
|
||
if (e)
|
||
this._flags |= FLAG_SOLID_ENABLED;
|
||
else
|
||
this._flags &= ~FLAG_SOLID_ENABLED
|
||
}
|
||
_IsJumpthruEnabled() {
|
||
return (this._flags & FLAG_JUMPTHRU_ENABLED) !== 0
|
||
}
|
||
_SetJumpthruEnabled(e) {
|
||
if (e)
|
||
this._flags |= FLAG_JUMPTHRU_ENABLED;
|
||
else
|
||
this._flags &= ~FLAG_JUMPTHRU_ENABLED
|
||
}
|
||
SetFlag(bit, enable) {
|
||
bit <<= 16;
|
||
if (enable)
|
||
this._flags |= bit;
|
||
else
|
||
this._flags &= ~bit
|
||
}
|
||
GetFlag(bit) {
|
||
return (this._flags & bit << 16) !== 0
|
||
}
|
||
GetCurrentImageInfo() {
|
||
return this._sdkInst.GetCurrentImageInfo()
|
||
}
|
||
GetCurrentSurfaceSize() {
|
||
return this._sdkInst.GetCurrentSurfaceSize()
|
||
}
|
||
GetCurrentTexRect() {
|
||
return this._sdkInst.GetCurrentTexRect()
|
||
}
|
||
GetImagePoint(nameOrIndex) {
|
||
return this._sdkInst.GetImagePoint(nameOrIndex)
|
||
}
|
||
GetObjectClass() {
|
||
return this._objectType
|
||
}
|
||
BelongsToObjectClass(objectClass) {
|
||
if (objectClass.IsFamily())
|
||
return objectClass.FamilyHasMember(this.GetObjectClass());
|
||
else
|
||
return this.GetObjectClass() === objectClass
|
||
}
|
||
VerifySupportsSceneGraph() {
|
||
if (!this.GetPlugin().SupportsSceneGraph())
|
||
throw new Error("object does not support scene graph");
|
||
}
|
||
HasParent() {
|
||
return this.GetParent() !== null
|
||
}
|
||
GetParent() {
|
||
const wi = this.GetWorldInfo();
|
||
if (!wi)
|
||
return null;
|
||
const parentWi = wi.GetParent();
|
||
return parentWi ? parentWi.GetInstance() : null
|
||
}
|
||
GetTopParent() {
|
||
const wi = this.GetWorldInfo();
|
||
if (!wi)
|
||
return null;
|
||
const parentWi = wi.GetTopParent();
|
||
return parentWi ? parentWi.GetInstance() : null
|
||
}
|
||
*parents() {
|
||
const wi = this.GetWorldInfo();
|
||
if (!wi)
|
||
return;
|
||
for (const parentWi of wi.parents())
|
||
yield parentWi.GetInstance()
|
||
}
|
||
HasChildren() {
|
||
const wi = this.GetWorldInfo();
|
||
return wi ? wi.HasChildren() : false
|
||
}
|
||
GetChildren() {
|
||
const wi = this.GetWorldInfo();
|
||
if (!wi)
|
||
return [];
|
||
return wi.GetChildren().map(wi=>wi.GetInstance())
|
||
}
|
||
*children() {
|
||
const wi = this.GetWorldInfo();
|
||
if (!wi)
|
||
return;
|
||
for (const childWi of wi.children())
|
||
yield childWi.GetInstance()
|
||
}
|
||
*allChildren() {
|
||
const wi = this.GetWorldInfo();
|
||
if (!wi)
|
||
return;
|
||
for (const childWi of wi.allChildren())
|
||
yield childWi.GetInstance()
|
||
}
|
||
GetChildCount() {
|
||
const wi = this.GetWorldInfo();
|
||
return wi ? wi.GetChildCount() : 0
|
||
}
|
||
GetChildAt(index) {
|
||
const wi = this.GetWorldInfo();
|
||
if (!wi)
|
||
return null;
|
||
const childWi = wi.GetChildAt(index);
|
||
return childWi ? childWi.GetInstance() : null
|
||
}
|
||
AddChild(childInst, opts) {
|
||
this.VerifySupportsSceneGraph();
|
||
childInst.VerifySupportsSceneGraph();
|
||
this.GetWorldInfo().AddChild(childInst.GetWorldInfo(), opts || {})
|
||
}
|
||
RemoveChild(childInst) {
|
||
const wi = this.GetWorldInfo();
|
||
if (!wi)
|
||
return;
|
||
wi.RemoveChild(childInst.GetWorldInfo())
|
||
}
|
||
GetDestroyWithParent() {
|
||
const wi = this.GetWorldInfo();
|
||
return wi ? wi.GetDestroyWithParent() : false
|
||
}
|
||
SetupInitialSceneGraphConnections() {
|
||
const wi = this.GetWorldInfo();
|
||
if (!wi)
|
||
return;
|
||
const childrenData = wi.GetSceneGraphChildrenExportData();
|
||
if (!childrenData)
|
||
return;
|
||
for (const childData of childrenData) {
|
||
const child = this._runtime.GetInstanceByUID(childData[0]);
|
||
if (child) {
|
||
const flags = childData[1];
|
||
this.AddChild(child, {
|
||
transformX: !!(flags >> 0 & 1),
|
||
transformY: !!(flags >> 1 & 1),
|
||
transformWidth: !!(flags >> 2 & 1),
|
||
transformHeight: !!(flags >> 3 & 1),
|
||
transformAngle: !!(flags >> 4 & 1),
|
||
destroyWithParent: !!(flags >> 5 & 1),
|
||
transformZElevation: !!(flags >> 6 & 1)
|
||
})
|
||
}
|
||
}
|
||
}
|
||
IsInContainer() {
|
||
return this._siblings !== null
|
||
}
|
||
_AddSibling(inst) {
|
||
this._siblings.push(inst)
|
||
}
|
||
GetSiblings() {
|
||
return this._siblings
|
||
}
|
||
siblings() {
|
||
return this._siblings
|
||
}
|
||
SetSiblingsSinglePicked() {
|
||
for (const s of this.siblings())
|
||
s.GetObjectClass().GetCurrentSol().SetSinglePicked(s)
|
||
}
|
||
_PushSiblingsToSolInstances() {
|
||
for (const s of this.siblings())
|
||
s.GetObjectClass().GetCurrentSol()._PushInstance(s)
|
||
}
|
||
_SetSiblingsToSolInstancesIndex(i) {
|
||
for (const s of this.siblings())
|
||
s.GetObjectClass().GetCurrentSol()._GetOwnInstances()[i] = s
|
||
}
|
||
_PushSiblingsToSolElseInstances() {
|
||
for (const s of this.siblings())
|
||
s.GetObjectClass().GetCurrentSol()._PushElseInstance(s)
|
||
}
|
||
_SetSiblingsToSolElseInstancesIndex(i) {
|
||
for (const s of this.siblings())
|
||
s.GetObjectClass().GetCurrentSol()._GetOwnElseInstances()[i] = s
|
||
}
|
||
GetPlugin() {
|
||
return this._objectType.GetPlugin()
|
||
}
|
||
_SetIID(i) {
|
||
this._iid = i
|
||
}
|
||
GetIID() {
|
||
this._objectType._UpdateIIDs();
|
||
return this._iid
|
||
}
|
||
GetUID() {
|
||
return this._uid
|
||
}
|
||
GetPUID() {
|
||
return this._puid
|
||
}
|
||
GetBehaviorInstances() {
|
||
return this._behaviorInstances
|
||
}
|
||
GetBehaviorInstanceFromCtor(ctor) {
|
||
if (!ctor)
|
||
return null;
|
||
for (const behInst of this._behaviorInstances)
|
||
if (behInst.GetBehavior()instanceof ctor)
|
||
return behInst;
|
||
return null
|
||
}
|
||
GetBehaviorSdkInstanceFromCtor(ctor) {
|
||
if (!ctor)
|
||
return null;
|
||
const behInst = this.GetBehaviorInstanceFromCtor(ctor);
|
||
if (behInst)
|
||
return behInst.GetSdkInstance();
|
||
else
|
||
return null
|
||
}
|
||
GetBehaviorIndexBySID(sid) {
|
||
const behaviorInstances = this._behaviorInstances;
|
||
for (let i = 0, len = behaviorInstances.length; i < len; ++i)
|
||
if (behaviorInstances[i].GetBehaviorType().GetSID() === sid)
|
||
return i;
|
||
return -1
|
||
}
|
||
GetAllInstanceVariableValues() {
|
||
return this._instVarValues
|
||
}
|
||
_GetAllInstanceVariableNames() {
|
||
return this._objectType._GetAllInstanceVariableNames()
|
||
}
|
||
GetInstanceVariableCount() {
|
||
return this._instVarValues.length
|
||
}
|
||
GetInstanceVariableValue(index) {
|
||
index = index | 0;
|
||
const instVarValues = this._instVarValues;
|
||
if (index < 0 || index >= instVarValues.length)
|
||
throw new RangeError("invalid instance variable");
|
||
return instVarValues[index]
|
||
}
|
||
_GetInstanceVariableValueUnchecked(index) {
|
||
return this._instVarValues[index]
|
||
}
|
||
SetInstanceVariableValue(index, value) {
|
||
index = index | 0;
|
||
const instVarValues = this._instVarValues;
|
||
if (index < 0 || index >= instVarValues.length)
|
||
throw new RangeError("invalid instance variable");
|
||
const lastValue = instVarValues[index];
|
||
if (typeof lastValue === "number")
|
||
if (typeof value === "number")
|
||
instVarValues[index] = value;
|
||
else
|
||
instVarValues[index] = parseFloat(value);
|
||
else if (typeof lastValue === "boolean")
|
||
if (typeof value === "boolean")
|
||
instVarValues[index] = value;
|
||
else
|
||
instVarValues[index] = !!value;
|
||
else if (typeof lastValue === "string")
|
||
if (typeof value === "string")
|
||
instVarValues[index] = value;
|
||
else
|
||
instVarValues[index] = value.toString();
|
||
else
|
||
throw new Error("unknown instance variable type");
|
||
}
|
||
SetInstanceVariableOffset(index, offset) {
|
||
if (offset === 0)
|
||
return;
|
||
index = index | 0;
|
||
const instVarValues = this._instVarValues;
|
||
if (index < 0 || index >= instVarValues.length)
|
||
throw new RangeError("invalid instance variable");
|
||
const lastValue = instVarValues[index];
|
||
if (typeof lastValue === "number")
|
||
if (typeof offset === "number")
|
||
instVarValues[index] += offset;
|
||
else
|
||
instVarValues[index] += parseFloat(offset);
|
||
else if (typeof lastValue === "boolean")
|
||
throw new Error("can not set offset of boolean variable");
|
||
else if (typeof lastValue === "string")
|
||
throw new Error("can not set offset of string variable");
|
||
else
|
||
throw new Error("unknown instance variable type");
|
||
}
|
||
GetSavedDataMap() {
|
||
let ret = savedDataMaps.get(this);
|
||
if (ret)
|
||
return ret;
|
||
ret = new Map;
|
||
savedDataMaps.set(this, ret);
|
||
return ret
|
||
}
|
||
GetUnsavedDataMap() {
|
||
let ret = unsavedDataMaps.get(this);
|
||
if (ret)
|
||
return ret;
|
||
ret = new Map;
|
||
unsavedDataMaps.set(this, ret);
|
||
return ret
|
||
}
|
||
_HasAnyCreateDestroyHandler(name) {
|
||
const objectType = this.GetObjectClass();
|
||
if (objectType.UserScriptDispatcher().HasAnyHandlerFor(name))
|
||
return true;
|
||
for (const family of objectType.GetFamilies())
|
||
if (family.UserScriptDispatcher().HasAnyHandlerFor(name))
|
||
return true;
|
||
if (this._runtime.UserScriptDispatcher().HasAnyHandlerFor(name))
|
||
return true;
|
||
return false
|
||
}
|
||
_TriggerOnCreated() {
|
||
if (this._HasAnyCreateDestroyHandler("instancecreate")) {
|
||
const objectType = this.GetObjectClass();
|
||
const instCreateEvent = new C3.Event("instancecreate");
|
||
instCreateEvent.instance = this.GetInterfaceClass();
|
||
objectType.DispatchUserScriptEvent(instCreateEvent);
|
||
for (const family of objectType.GetFamilies())
|
||
family.DispatchUserScriptEvent(instCreateEvent);
|
||
this._runtime.DispatchUserScriptEvent(instCreateEvent)
|
||
}
|
||
this._runtime.Trigger(this.GetPlugin().constructor.Cnds.OnCreated, this, null)
|
||
}
|
||
_TriggerOnDestroyed() {
|
||
this._runtime.Trigger(this.GetPlugin().constructor.Cnds.OnDestroyed, this, null)
|
||
}
|
||
_FireDestroyedScriptEvents(isEndingLayout) {
|
||
if (this._iScriptInterface) {
|
||
const e = new C3.Event("destroy");
|
||
e.isEndingLayout = isEndingLayout;
|
||
this.DispatchUserScriptEvent(e)
|
||
}
|
||
if (!this._HasAnyCreateDestroyHandler("instancedestroy"))
|
||
return;
|
||
const objectType = this.GetObjectClass();
|
||
const instDestroyEvent = new C3.Event("instancedestroy");
|
||
instDestroyEvent.instance = this.GetInterfaceClass();
|
||
instDestroyEvent.isEndingLayout = isEndingLayout;
|
||
objectType.DispatchUserScriptEvent(instDestroyEvent);
|
||
for (const family of objectType.GetFamilies())
|
||
family.DispatchUserScriptEvent(instDestroyEvent);
|
||
this._runtime.DispatchUserScriptEvent(instDestroyEvent)
|
||
}
|
||
_GetDebuggerProperties() {
|
||
return this._sdkInst.GetDebuggerProperties()
|
||
}
|
||
SaveToJson(mode="full") {
|
||
const o = {};
|
||
if (mode === "full")
|
||
o["uid"] = this.GetUID();
|
||
else
|
||
o["c3"] = true;
|
||
if (mode !== "visual-state") {
|
||
const savedData = savedDataMaps.get(this);
|
||
if (savedData && savedData.size)
|
||
o["ex"] = C3.ToSuperJSON(savedData);
|
||
if (this.GetTimeScale() !== -1)
|
||
o["mts"] = this.GetTimeScale();
|
||
if (this._objectType.GetInstanceVariablesCount() > 0) {
|
||
const ivs = {};
|
||
const ivSids = this._objectType.GetInstanceVariableSIDs();
|
||
for (let i = 0, len = this._instVarValues.length; i < len; ++i)
|
||
ivs[ivSids[i].toString()] = this._instVarValues[i];
|
||
o["ivs"] = ivs
|
||
}
|
||
if (this._behaviorInstances.length) {
|
||
const behs = {};
|
||
for (const behInst of this._behaviorInstances) {
|
||
const data = behInst.SaveToJson();
|
||
if (data)
|
||
behs[behInst.GetBehaviorType().GetSID().toString()] = data
|
||
}
|
||
o["behs"] = behs
|
||
}
|
||
}
|
||
if (this._worldInfo)
|
||
o["w"] = this._worldInfo._SaveToJson();
|
||
const ownData = this._sdkInst.SaveToJson();
|
||
if (ownData)
|
||
o["data"] = ownData;
|
||
return o
|
||
}
|
||
LoadFromJson(o, mode="full") {
|
||
if (mode === "full")
|
||
this._uid = o["uid"];
|
||
else if (!o["c3"])
|
||
return;
|
||
if (mode !== "visual-state") {
|
||
let savedData = savedDataMaps.get(this);
|
||
if (savedData) {
|
||
savedData.clear();
|
||
savedDataMaps.delete(this)
|
||
}
|
||
const ex = o["ex"];
|
||
if (ex) {
|
||
savedData = C3.FromSuperJSON(ex);
|
||
savedDataMaps.set(this, savedData)
|
||
}
|
||
this._timeScale = o.hasOwnProperty("mts") ? o["mts"] : -1;
|
||
const ivs = o["ivs"];
|
||
if (ivs)
|
||
for (const [sidStr,value] of Object.entries(ivs)) {
|
||
const sid = parseInt(sidStr, 10);
|
||
const index = this._objectType.GetInstanceVariableIndexBySID(sid);
|
||
if (index < 0 || index >= this._instVarValues.length)
|
||
continue;
|
||
let v = value;
|
||
if (v === null)
|
||
v = NaN;
|
||
this._instVarValues[index] = v
|
||
}
|
||
}
|
||
if (this.GetPlugin().IsWorldType()) {
|
||
const worldData = o["w"];
|
||
const layerSid = worldData["l"];
|
||
if (this._worldInfo.GetLayer().GetSID() !== layerSid) {
|
||
const oldLayer = this._worldInfo.GetLayer();
|
||
const newLayer = oldLayer.GetLayout().GetLayerBySID(layerSid);
|
||
if (newLayer) {
|
||
this._worldInfo._SetLayer(newLayer);
|
||
oldLayer._RemoveInstance(this, true);
|
||
newLayer._AddInstance(this, true);
|
||
newLayer.SetZIndicesChanged();
|
||
this._worldInfo.SetBboxChanged()
|
||
} else if (mode === "full")
|
||
this._runtime.DestroyInstance(this)
|
||
}
|
||
this._worldInfo._LoadFromJson(worldData)
|
||
}
|
||
if (mode !== "visual-state") {
|
||
const behs = o["behs"];
|
||
if (behs)
|
||
for (const [sidStr,data] of Object.entries(behs)) {
|
||
const sid = parseInt(sidStr, 10);
|
||
const index = this.GetBehaviorIndexBySID(sid);
|
||
if (index < 0 || index >= this._behaviorInstances.length)
|
||
continue;
|
||
this._behaviorInstances[index].LoadFromJson(data)
|
||
}
|
||
}
|
||
const ownData = o["data"];
|
||
if (ownData)
|
||
this._sdkInst.LoadFromJson(ownData)
|
||
}
|
||
GetInterfaceClass() {
|
||
return this._iScriptInterface || this._InitUserScriptInterface()
|
||
}
|
||
_InitUserScriptInterface() {
|
||
const DefaultScriptClass = this._worldInfo ? self.IWorldInstance : IInstance;
|
||
const SdkScriptClass = this._sdkInst.GetScriptInterfaceClass();
|
||
const UserScriptClass = this._objectType._GetUserScriptInstanceClass();
|
||
const ScriptInterfaceClass = UserScriptClass || SdkScriptClass || DefaultScriptClass;
|
||
IInstance._Init(this);
|
||
this._iScriptInterface = new ScriptInterfaceClass;
|
||
IInstance._Init(null);
|
||
if (SdkScriptClass && !(this._iScriptInterface instanceof DefaultScriptClass))
|
||
throw new TypeError(`script interface class '${SdkScriptClass.name}' does not extend the right base class '${DefaultScriptClass.name}'`);
|
||
if (UserScriptClass) {
|
||
const ExpectedBaseClass = SdkScriptClass || DefaultScriptClass;
|
||
if (!(this._iScriptInterface instanceof ExpectedBaseClass))
|
||
throw new TypeError(`setInstanceClass(): class '${UserScriptClass.name}' does not extend the right base class '${ExpectedBaseClass.name}'`);
|
||
}
|
||
return this._iScriptInterface
|
||
}
|
||
_GetInstVarsScriptDescriptor(instDescriptors) {
|
||
if (this._instVarValues.length === 0)
|
||
return;
|
||
const varDescriptors = {};
|
||
const instVarJsPropNames = this._objectType._GetAllInstanceVariableJsPropNames();
|
||
for (let i = 0, len = instVarJsPropNames.length; i < len; ++i)
|
||
varDescriptors[instVarJsPropNames[i]] = {
|
||
configurable: false,
|
||
enumerable: true,
|
||
get: C3.Instance.prototype._GetInstanceVariableValueUnchecked.bind(this, i),
|
||
set: C3.Instance.prototype.SetInstanceVariableValue.bind(this, i)
|
||
};
|
||
const instVarsObj = Object.create(Object.prototype, varDescriptors);
|
||
instDescriptors.instVars = {
|
||
value: instVarsObj,
|
||
writable: false
|
||
}
|
||
}
|
||
_GetBehaviorsScriptDescriptor(instDescriptors) {
|
||
const behaviorInstances = this._behaviorInstances;
|
||
if (behaviorInstances.length === 0)
|
||
return;
|
||
const behDescriptors = {};
|
||
for (const behInst of behaviorInstances)
|
||
behDescriptors[behInst.GetBehaviorType().GetJsPropName()] = {
|
||
value: behInst.GetScriptInterface(),
|
||
writable: false
|
||
};
|
||
const behaviorsObj = Object.create(Object.prototype, behDescriptors);
|
||
instDescriptors.behaviors = {
|
||
value: behaviorsObj,
|
||
writable: false
|
||
}
|
||
}
|
||
DispatchUserScriptEvent(e) {
|
||
e.instance = this.GetInterfaceClass();
|
||
const runtime = this._runtime;
|
||
const shouldTime = runtime.IsDebug() && !runtime.GetEventSheetManager().IsInEventEngine();
|
||
if (shouldTime)
|
||
C3Debugger.StartMeasuringScriptTime();
|
||
this.GetInterfaceClass().dispatchEvent(e);
|
||
if (shouldTime)
|
||
C3Debugger.AddScriptTime()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.SceneGraphInfo = class SceneGraphInfo extends C3.DefendedBase {
|
||
constructor(owner) {
|
||
super();
|
||
this._owner = owner;
|
||
this._parent = null;
|
||
this._children = [];
|
||
this._myStartWidth = owner.GetWidth();
|
||
this._myStartHeight = owner.GetHeight();
|
||
this._parentStartAngle = 0
|
||
}
|
||
Release() {
|
||
this._parent = null;
|
||
C3.clearArray(this._children)
|
||
}
|
||
SetParent(parent) {
|
||
this._parent = parent;
|
||
this._parentStartAngle = parent ? parent.GetAngle() : 0
|
||
}
|
||
GetParent() {
|
||
return this._parent
|
||
}
|
||
HasChildren() {
|
||
return this._children.length > 0
|
||
}
|
||
GetChildren() {
|
||
return this._children
|
||
}
|
||
_GetStartWidth() {
|
||
return this._myStartWidth
|
||
}
|
||
_GetStartHeight() {
|
||
return this._myStartHeight
|
||
}
|
||
GetParentScaleX() {
|
||
if (this._owner.GetTransformWithParentWidth())
|
||
return this._parent.GetWidth() / this._parent._GetSceneGraphInfo()._GetStartWidth();
|
||
else
|
||
return 1
|
||
}
|
||
GetParentScaleY() {
|
||
if (this._owner.GetTransformWithParentHeight())
|
||
return this._parent.GetHeight() / this._parent._GetSceneGraphInfo()._GetStartHeight();
|
||
else
|
||
return 1
|
||
}
|
||
GetParentStartAngle() {
|
||
return this._parentStartAngle
|
||
}
|
||
_SaveToJson() {
|
||
return {
|
||
"sw": this._myStartWidth,
|
||
"sh": this._myStartHeight,
|
||
"psa": this._parentStartAngle,
|
||
"c": this._children.map(c=>{
|
||
let flagsStr = "";
|
||
if (c.GetTransformWithParentX())
|
||
flagsStr += "x";
|
||
if (c.GetTransformWithParentY())
|
||
flagsStr += "y";
|
||
if (c.GetTransformWithParentWidth())
|
||
flagsStr += "w";
|
||
if (c.GetTransformWithParentHeight())
|
||
flagsStr += "h";
|
||
if (c.GetTransformWithParentAngle())
|
||
flagsStr += "a";
|
||
if (c.GetTransformWithParentZElevation())
|
||
flagsStr += "z";
|
||
if (c.GetDestroyWithParent())
|
||
flagsStr += "d";
|
||
return {
|
||
"uid": c.GetInstance().GetUID(),
|
||
"f": flagsStr
|
||
}
|
||
}
|
||
)
|
||
}
|
||
}
|
||
_LoadFromJson(o) {
|
||
this._myStartWidth = o["sw"];
|
||
this._myStartHeight = o["sh"];
|
||
this._parentStartAngle = o["psa"]
|
||
}
|
||
_OnAfterLoad(o) {
|
||
const owner = this._owner;
|
||
const runtime = owner.GetRuntime();
|
||
for (const childData of o["c"]) {
|
||
const childUid = childData["uid"];
|
||
const childInst = runtime.GetInstanceByUID(childUid);
|
||
const childWi = childInst.GetWorldInfo();
|
||
const flagsStr = childData["f"];
|
||
const opts = {};
|
||
opts.transformX = flagsStr.includes("x");
|
||
opts.transformY = flagsStr.includes("y");
|
||
opts.transformWidth = flagsStr.includes("w");
|
||
opts.transformHeight = flagsStr.includes("h");
|
||
opts.transformAngle = flagsStr.includes("a");
|
||
opts.transformZElevation = flagsStr.includes("z");
|
||
opts.destroyWithParent = flagsStr.includes("d");
|
||
owner.AddChild(childWi, opts)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const tempRect = C3.New(C3.Rect);
|
||
const tempQuad = C3.New(C3.Quad);
|
||
const bboxChangeEvent = C3.New(C3.Event, "bboxchange", false);
|
||
const tempColor = C3.New(C3.Color, 0, 0, 0, 0);
|
||
const tempCollisionPoly = C3.New(C3.CollisionPoly);
|
||
const DEFAULT_COLOR = C3.New(C3.Color, 1, 1, 1, 1);
|
||
const DEFAULT_RENDER_CELLS = C3.New(C3.Rect, 0, 0, -1, -1);
|
||
const DEFAULT_COLLISION_CELLS = C3.New(C3.Rect, 0, 0, -1, -1);
|
||
const VALID_SET_MESH_POINT_MODES = new Set(["absolute", "relative"]);
|
||
const EMPTY_ARRAY = [];
|
||
let enableUpdateRendererStateGroup = true;
|
||
const FLAG_IS_VISIBLE = 1 << 0;
|
||
const FLAG_BBOX_CHANGED = 1 << 1;
|
||
const FLAG_ENABLE_BBOX_CHANGED_EVENT = 1 << 2;
|
||
const FLAG_COLLISION_ENABLED = 1 << 3;
|
||
const FLAG_COLLISION_CELL_CHANGED = 1 << 4;
|
||
const FLAG_SOLID_FILTER_INCLUSIVE = 1 << 5;
|
||
const FLAG_HAS_ANY_ACTIVE_EFFECT = 1 << 6;
|
||
const FLAG_IS_ROTATABLE = 1 << 7;
|
||
const FLAG_DESTROY_WITH_PARENT = 1 << 8;
|
||
const FLAG_TRANSFORM_WITH_PARENT_X = 1 << 9;
|
||
const FLAG_TRANSFORM_WITH_PARENT_Y = 1 << 10;
|
||
const FLAG_TRANSFORM_WITH_PARENT_W = 1 << 11;
|
||
const FLAG_TRANSFORM_WITH_PARENT_H = 1 << 12;
|
||
const FLAG_TRANSFORM_WITH_PARENT_A = 1 << 13;
|
||
const FLAG_TRANSFORM_WITH_PARENT_Z_ELEVATION = 1 << 14;
|
||
const MASK_ALL_SCENE_GRAPH_FLAGS = FLAG_DESTROY_WITH_PARENT | FLAG_TRANSFORM_WITH_PARENT_X | FLAG_TRANSFORM_WITH_PARENT_Y | FLAG_TRANSFORM_WITH_PARENT_W | FLAG_TRANSFORM_WITH_PARENT_H | FLAG_TRANSFORM_WITH_PARENT_A | FLAG_TRANSFORM_WITH_PARENT_Z_ELEVATION;
|
||
const FLAG_MESH_CHANGED = 1 << 15;
|
||
const FLAG_PHYSICS_BODY_CHANGED = 1 << 16;
|
||
const FLAG_SIN_COS_ANGLE_CHANGED = 1 << 17;
|
||
const FLAG_BLEND_MODE_BIT_OFFSET = 26;
|
||
const FLAG_BLEND_MODE_MASK = 31 << FLAG_BLEND_MODE_BIT_OFFSET;
|
||
C3.WorldInfo = class WorldInfo extends C3.DefendedBase {
|
||
constructor(inst, layer) {
|
||
super();
|
||
this._inst = inst;
|
||
this._objectClass = inst.GetObjectClass();
|
||
this._runtime = inst.GetRuntime();
|
||
this._layer = layer;
|
||
this._zIndex = -1;
|
||
this._flags = FLAG_IS_VISIBLE | FLAG_BBOX_CHANGED | FLAG_COLLISION_ENABLED | FLAG_COLLISION_CELL_CHANGED | FLAG_MESH_CHANGED | FLAG_PHYSICS_BODY_CHANGED;
|
||
if (this._objectClass.GetPlugin().IsRotatable())
|
||
this._flags |= FLAG_IS_ROTATABLE;
|
||
this._x = NaN;
|
||
this._y = NaN;
|
||
this._zElevation = NaN;
|
||
this._w = NaN;
|
||
this._h = NaN;
|
||
this._a = NaN;
|
||
this._sinA = NaN;
|
||
this._cosA = NaN;
|
||
this._ox = NaN;
|
||
this._oy = NaN;
|
||
this._boundingBox = C3.New(C3.Rect);
|
||
this._boundingQuad = C3.New(C3.Quad);
|
||
this._collisionCells = DEFAULT_COLLISION_CELLS;
|
||
this._renderCells = DEFAULT_RENDER_CELLS;
|
||
this._sourceCollisionPoly = null;
|
||
this._transformedPolyInfo = null;
|
||
this._solidFilterTags = null;
|
||
this._color = DEFAULT_COLOR;
|
||
this._colorPremultiplied = DEFAULT_COLOR;
|
||
this._stateGroup = null;
|
||
this._instanceEffectList = null;
|
||
if (this._inst.GetObjectClass().UsesEffects())
|
||
this._instanceEffectList = C3.New(C3.InstanceEffectList, this._inst, this);
|
||
this._sceneGraphInfo = null;
|
||
this._sceneGraphFlagsExportData = NaN;
|
||
this._sceneGraphChildrenExportData = null;
|
||
this._meshInfo = null
|
||
}
|
||
Release() {
|
||
if (this._stateGroup) {
|
||
this._runtime.GetRenderer().ReleaseStateGroup(this._stateGroup);
|
||
this._stateGroup = null
|
||
}
|
||
this._sourceCollisionPoly = null;
|
||
if (this._transformedPolyInfo) {
|
||
this._transformedPolyInfo.poly.Release();
|
||
this._transformedPolyInfo = null
|
||
}
|
||
if (this._solidFilterTags) {
|
||
this._solidFilterTags.clear();
|
||
this._solidFilterTags = null
|
||
}
|
||
this.ReleaseMesh();
|
||
if (this.HasParent())
|
||
this.GetParent().RemoveChild(this);
|
||
if (this.HasChildren()) {
|
||
const childrenToRelease = [...this.GetChildren()];
|
||
for (const child of childrenToRelease)
|
||
this.RemoveChild(child)
|
||
}
|
||
this._ReleaseSceneGraphInfo();
|
||
this._inst = null;
|
||
this._objectClass = null;
|
||
this._runtime = null;
|
||
this._layer = null
|
||
}
|
||
Init(data) {
|
||
enableUpdateRendererStateGroup = false;
|
||
this.SetXY(data[0], data[1]);
|
||
this.SetZElevation(data[2]);
|
||
this.SetSize(data[3], data[4]);
|
||
if (this.IsRotatable())
|
||
this.SetAngle(data[6]);
|
||
else
|
||
this._a = 0;
|
||
tempColor.setFromJSON(data[7]);
|
||
this._SetColor(tempColor);
|
||
this.SetOriginX(data[8]);
|
||
this.SetOriginY(data[9]);
|
||
this.SetBlendMode(data[10]);
|
||
if (this._instanceEffectList)
|
||
this._instanceEffectList._LoadEffectParameters(data[12]);
|
||
if (data[14]) {
|
||
this._sceneGraphFlagsExportData = data[14][0];
|
||
this._sceneGraphChildrenExportData = data[14][1]
|
||
}
|
||
enableUpdateRendererStateGroup = true;
|
||
this._UpdateRendererStateGroup()
|
||
}
|
||
InitNoData() {
|
||
this._x = 0;
|
||
this._y = 0;
|
||
this._zElevation = 0;
|
||
this._w = 0;
|
||
this._h = 0;
|
||
this._a = 0;
|
||
this._sinA = 0;
|
||
this._cosA = 1;
|
||
this._ox = 0;
|
||
this._oy = 0;
|
||
this._UpdateRendererStateGroup()
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetObjectClass() {
|
||
return this._objectClass
|
||
}
|
||
GetInstance() {
|
||
return this._inst
|
||
}
|
||
_GetParentOffsetAngle() {
|
||
if (this.GetTransformWithParentAngle())
|
||
return this.GetParent().GetAngle() - this._sceneGraphInfo.GetParentStartAngle();
|
||
else
|
||
return 0
|
||
}
|
||
SetX(x) {
|
||
x = +x;
|
||
if (this.GetTransformWithParentX()) {
|
||
const sgi = this._sceneGraphInfo;
|
||
const dx = x - this.GetX();
|
||
const da = -this._GetParentOffsetAngle();
|
||
if (da === 0)
|
||
this._x += dx / sgi.GetParentScaleX();
|
||
else {
|
||
this._x += Math.cos(da) * dx / sgi.GetParentScaleX();
|
||
if (this.GetTransformWithParentY())
|
||
this._y += Math.sin(da) * dx / sgi.GetParentScaleY()
|
||
}
|
||
} else
|
||
this._x = x
|
||
}
|
||
OffsetX(x) {
|
||
x = +x;
|
||
if (this.GetTransformWithParentX())
|
||
this.SetX(this.GetX() + x);
|
||
else
|
||
this._x += x
|
||
}
|
||
GetX() {
|
||
if (this.GetTransformWithParentX()) {
|
||
let x = this._x;
|
||
const sgi = this._sceneGraphInfo;
|
||
const parent = this.GetParent();
|
||
const da = this._GetParentOffsetAngle();
|
||
if (da === 0)
|
||
x *= sgi.GetParentScaleX();
|
||
else {
|
||
x = x * sgi.GetParentScaleX() * Math.cos(da);
|
||
if (this.GetTransformWithParentY())
|
||
x -= this._y * sgi.GetParentScaleY() * Math.sin(da)
|
||
}
|
||
return parent.GetX() + x
|
||
} else
|
||
return this._x
|
||
}
|
||
SetY(y) {
|
||
y = +y;
|
||
if (this.GetTransformWithParentY()) {
|
||
const sgi = this._sceneGraphInfo;
|
||
const dy = y - this.GetY();
|
||
const da = -this._GetParentOffsetAngle();
|
||
if (da === 0)
|
||
this._y += dy / sgi.GetParentScaleY();
|
||
else {
|
||
if (this.GetTransformWithParentX())
|
||
this._x -= Math.sin(da) * dy / sgi.GetParentScaleX();
|
||
this._y += Math.cos(da) * dy / sgi.GetParentScaleY()
|
||
}
|
||
} else
|
||
this._y = y
|
||
}
|
||
OffsetY(y) {
|
||
y = +y;
|
||
if (this.GetTransformWithParentY())
|
||
this.SetY(this.GetY() + y);
|
||
else
|
||
this._y += y
|
||
}
|
||
GetY() {
|
||
if (this.GetTransformWithParentY()) {
|
||
let y = this._y;
|
||
const sgi = this._sceneGraphInfo;
|
||
const parent = this.GetParent();
|
||
const da = this._GetParentOffsetAngle();
|
||
if (da === 0)
|
||
y *= sgi.GetParentScaleY();
|
||
else {
|
||
y = y * sgi.GetParentScaleY() * Math.cos(da);
|
||
if (this.GetTransformWithParentX())
|
||
y += this._x * sgi.GetParentScaleX() * Math.sin(da)
|
||
}
|
||
return parent.GetY() + y
|
||
} else
|
||
return this._y
|
||
}
|
||
SetXY(x, y) {
|
||
x = +x;
|
||
y = +y;
|
||
if (this.GetTransformWithParentXOrY()) {
|
||
const isTransformX = this.GetTransformWithParentX();
|
||
const isTransformY = this.GetTransformWithParentY();
|
||
const sgi = this._sceneGraphInfo;
|
||
const dx = x - this.GetX();
|
||
const dy = y - this.GetY();
|
||
const da = -this._GetParentOffsetAngle();
|
||
if (da === 0) {
|
||
if (isTransformX)
|
||
this._x += dx / sgi.GetParentScaleX();
|
||
else
|
||
this._x = x;
|
||
if (isTransformY)
|
||
this._y += dy / sgi.GetParentScaleY();
|
||
else
|
||
this._y = y
|
||
} else {
|
||
const sinDa = Math.sin(da);
|
||
const cosDa = Math.cos(da);
|
||
if (isTransformX)
|
||
if (isTransformY)
|
||
this._x += (cosDa * dx - sinDa * dy) / sgi.GetParentScaleX();
|
||
else
|
||
this._x += cosDa * dx / sgi.GetParentScaleX();
|
||
else
|
||
this._x = x;
|
||
if (isTransformY)
|
||
if (isTransformX)
|
||
this._y += (sinDa * dx + cosDa * dy) / sgi.GetParentScaleY();
|
||
else
|
||
this._y += cosDa * dy / sgi.GetParentScaleY();
|
||
else
|
||
this._y = y
|
||
}
|
||
} else {
|
||
this._x = x;
|
||
this._y = y
|
||
}
|
||
}
|
||
OffsetXY(x, y) {
|
||
x = +x;
|
||
y = +y;
|
||
if (this.GetTransformWithParentXOrY())
|
||
this.SetXY(this.GetX() + x, this.GetY() + y);
|
||
else {
|
||
this._x += x;
|
||
this._y += y
|
||
}
|
||
}
|
||
EqualsXY(x, y) {
|
||
return this.GetX() === x && this.GetY() === y
|
||
}
|
||
SetZElevation(z) {
|
||
z = +z;
|
||
if (this.GetTransformWithParentZElevation())
|
||
z -= this.GetParent().GetZElevation();
|
||
if (this._zElevation === z)
|
||
return;
|
||
this._zElevation = z;
|
||
this._UpdateZElevation();
|
||
const layer = this.GetLayer();
|
||
if (this._zElevation !== 0)
|
||
layer._SetAnyInstanceZElevated();
|
||
layer.SetZIndicesChanged()
|
||
}
|
||
_UpdateZElevation() {
|
||
this._UpdateRendererStateGroup();
|
||
if (this.HasChildren()) {
|
||
const children = this.GetChildren();
|
||
for (let i = 0, len = children.length; i < len; i++) {
|
||
const child = children[i];
|
||
if (child.GetTransformWithParentZElevation())
|
||
child._UpdateZElevation()
|
||
}
|
||
}
|
||
}
|
||
OffsetZElevation(z) {
|
||
this.SetZElevation(this.GetZElevation() + z)
|
||
}
|
||
GetZElevation() {
|
||
if (this.GetTransformWithParentZElevation())
|
||
return this.GetParent().GetZElevation() + this._zElevation;
|
||
else
|
||
return this._zElevation
|
||
}
|
||
GetTotalZElevation() {
|
||
return this.GetLayer().GetZElevation() + this.GetZElevation()
|
||
}
|
||
SetWidth(w) {
|
||
w = +w;
|
||
if (this.GetTransformWithParentWidth())
|
||
this._w *= w / this.GetWidth();
|
||
else
|
||
this._w = w
|
||
}
|
||
OffsetWidth(w) {
|
||
w = +w;
|
||
if (this.GetTransformWithParentWidth())
|
||
this.SetWidth(this.GetWidth() + w);
|
||
else
|
||
this._w += w
|
||
}
|
||
GetWidth() {
|
||
if (this.GetTransformWithParentWidth())
|
||
return this.GetParent().GetWidth() * this._w;
|
||
else
|
||
return this._w
|
||
}
|
||
SetHeight(h) {
|
||
h = +h;
|
||
if (this.GetTransformWithParentHeight())
|
||
this._h *= h / this.GetHeight();
|
||
else
|
||
this._h = h
|
||
}
|
||
OffsetHeight(h) {
|
||
h = +h;
|
||
if (this.GetTransformWithParentHeight())
|
||
this.SetHeight(this.GetHeight() + h);
|
||
else
|
||
this._h += h
|
||
}
|
||
GetHeight() {
|
||
if (this.GetTransformWithParentHeight())
|
||
return this.GetParent().GetHeight() * this._h;
|
||
else
|
||
return this._h
|
||
}
|
||
SetSize(w, h) {
|
||
w = +w;
|
||
h = +h;
|
||
if (this.GetTransformWithParentWidth())
|
||
this._w *= w / this.GetWidth();
|
||
else
|
||
this._w = w;
|
||
if (this.GetTransformWithParentHeight())
|
||
this._h *= h / this.GetHeight();
|
||
else
|
||
this._h = h
|
||
}
|
||
GetSceneGraphScale() {
|
||
if (this.HasParent()) {
|
||
const sgi = this._sceneGraphInfo;
|
||
return Math.min(sgi.GetParentScaleX(), sgi.GetParentScaleY())
|
||
} else
|
||
return 1
|
||
}
|
||
IsRotatable() {
|
||
return (this._flags & FLAG_IS_ROTATABLE) !== 0
|
||
}
|
||
SetAngle(a) {
|
||
a = +a;
|
||
if (!this.IsRotatable())
|
||
return;
|
||
if (this.GetTransformWithParentAngle())
|
||
a -= this.GetParent().GetAngle();
|
||
a = C3.clampAngle(a);
|
||
if (this._a === a)
|
||
return;
|
||
this._a = a;
|
||
this._MarkSinCosAngleChanged()
|
||
}
|
||
OffsetAngle(a) {
|
||
a = +a;
|
||
if (a === 0 || !this.IsRotatable())
|
||
return;
|
||
this._a = C3.clampAngle(this._a + a);
|
||
this._MarkSinCosAngleChanged()
|
||
}
|
||
_MarkSinCosAngleChanged() {
|
||
this._flags |= FLAG_SIN_COS_ANGLE_CHANGED;
|
||
if (this.HasChildren()) {
|
||
const children = this.GetChildren();
|
||
for (let i = 0, len = children.length; i < len; i++)
|
||
children[i]._MarkSinCosAngleChanged()
|
||
}
|
||
}
|
||
GetAngle() {
|
||
if (this.GetTransformWithParentAngle())
|
||
return C3.clampAngle(this.GetParent().GetAngle() + this._a);
|
||
else
|
||
return this._a
|
||
}
|
||
_MaybeUpdateSinCosAngle() {
|
||
const flags = this._flags;
|
||
if ((flags & FLAG_SIN_COS_ANGLE_CHANGED) === 0)
|
||
return;
|
||
const a = this.GetAngle();
|
||
this._sinA = Math.sin(a);
|
||
this._cosA = Math.cos(a);
|
||
this._flags = flags & ~FLAG_SIN_COS_ANGLE_CHANGED
|
||
}
|
||
GetSinAngle() {
|
||
this._MaybeUpdateSinCosAngle();
|
||
return this._sinA
|
||
}
|
||
GetCosAngle() {
|
||
this._MaybeUpdateSinCosAngle();
|
||
return this._cosA
|
||
}
|
||
SetOriginX(x) {
|
||
this._ox = +x
|
||
}
|
||
OffsetOriginX(x) {
|
||
this._ox += +x
|
||
}
|
||
GetOriginX() {
|
||
return this._ox
|
||
}
|
||
SetOriginY(y) {
|
||
this._oy = +y
|
||
}
|
||
OffsetOriginY(y) {
|
||
this._oy += +y
|
||
}
|
||
GetOriginY() {
|
||
return this._oy
|
||
}
|
||
_SetColor(c) {
|
||
if (this._color.equals(c))
|
||
return;
|
||
if (this._color === DEFAULT_COLOR) {
|
||
this._color = C3.New(C3.Color, c);
|
||
this._colorPremultiplied = C3.New(C3.Color, c);
|
||
this._colorPremultiplied.premultiply()
|
||
} else if (c.equalsRgba(1, 1, 1, 1)) {
|
||
this._color = DEFAULT_COLOR;
|
||
this._colorPremultiplied = DEFAULT_COLOR
|
||
} else {
|
||
this._color.set(c);
|
||
this._colorPremultiplied.set(c);
|
||
this._colorPremultiplied.premultiply()
|
||
}
|
||
this._UpdateRendererStateGroup()
|
||
}
|
||
SetOpacity(o) {
|
||
o = C3.clamp(+o, 0, 1);
|
||
if (this._color.a === o)
|
||
return;
|
||
tempColor.copyRgb(this._color);
|
||
tempColor.a = o;
|
||
this._SetColor(tempColor)
|
||
}
|
||
OffsetOpacity(o) {
|
||
this.SetOpacity(this.GetOpacity() + o)
|
||
}
|
||
GetOpacity() {
|
||
return this._color.a
|
||
}
|
||
SetUnpremultipliedColor(c) {
|
||
if (this._color.equalsIgnoringAlpha(c))
|
||
return;
|
||
tempColor.copyRgb(c);
|
||
tempColor.a = this._color.a;
|
||
this._SetColor(tempColor)
|
||
}
|
||
SetUnpremultipliedColorRGB(r, g, b) {
|
||
tempColor.setRgb(r, g, b);
|
||
this.SetUnpremultipliedColor(tempColor)
|
||
}
|
||
OffsetUnpremultipliedColorRGB(r, g, b) {
|
||
if (r === 0 && g === 0 && b === 0)
|
||
return;
|
||
tempColor.copyRgb(this._color);
|
||
tempColor.r += r;
|
||
tempColor.g += g;
|
||
tempColor.b += b;
|
||
this.SetUnpremultipliedColor(tempColor)
|
||
}
|
||
GetUnpremultipliedColor() {
|
||
return this._color
|
||
}
|
||
GetPremultipliedColor() {
|
||
return this._colorPremultiplied
|
||
}
|
||
GetDestroyWithParent() {
|
||
return (this._flags & FLAG_DESTROY_WITH_PARENT) !== 0
|
||
}
|
||
SetDestroyWithParent(d) {
|
||
this._SetFlag(FLAG_DESTROY_WITH_PARENT, d)
|
||
}
|
||
GetTransformWithParentX() {
|
||
return (this._flags & FLAG_TRANSFORM_WITH_PARENT_X) !== 0
|
||
}
|
||
SetTransformWithParentX(tpx) {
|
||
this._SetFlag(FLAG_TRANSFORM_WITH_PARENT_X, tpx)
|
||
}
|
||
GetTransformWithParentY() {
|
||
return (this._flags & FLAG_TRANSFORM_WITH_PARENT_Y) !== 0
|
||
}
|
||
GetTransformWithParentXOrY() {
|
||
return (this._flags & (FLAG_TRANSFORM_WITH_PARENT_X | FLAG_TRANSFORM_WITH_PARENT_Y)) !== 0
|
||
}
|
||
SetTransformWithParentY(tpx) {
|
||
this._SetFlag(FLAG_TRANSFORM_WITH_PARENT_Y, tpx)
|
||
}
|
||
GetTransformWithParentWidth() {
|
||
return (this._flags & FLAG_TRANSFORM_WITH_PARENT_W) !== 0
|
||
}
|
||
SetTransformWithParentWidth(tpw) {
|
||
this._SetFlag(FLAG_TRANSFORM_WITH_PARENT_W, tpw)
|
||
}
|
||
GetTransformWithParentHeight() {
|
||
return (this._flags & FLAG_TRANSFORM_WITH_PARENT_H) !== 0
|
||
}
|
||
SetTransformWithParentHeight(tph) {
|
||
this._SetFlag(FLAG_TRANSFORM_WITH_PARENT_H, tph)
|
||
}
|
||
GetTransformWithParentAngle() {
|
||
return (this._flags & FLAG_TRANSFORM_WITH_PARENT_A) !== 0
|
||
}
|
||
SetTransformWithParentAngle(tpa) {
|
||
this._SetFlag(FLAG_TRANSFORM_WITH_PARENT_A, tpa)
|
||
}
|
||
GetTransformWithParentZElevation() {
|
||
return (this._flags & FLAG_TRANSFORM_WITH_PARENT_Z_ELEVATION) !== 0
|
||
}
|
||
SetTransformWithParentZElevation(tpz) {
|
||
this._SetFlag(FLAG_TRANSFORM_WITH_PARENT_Z_ELEVATION, tpz)
|
||
}
|
||
_ClearAllSceneGraphFlags() {
|
||
this._flags &= ~MASK_ALL_SCENE_GRAPH_FLAGS
|
||
}
|
||
AddChild(child, opts) {
|
||
if (child === this)
|
||
return;
|
||
if (child.HasParent())
|
||
return;
|
||
if (this._HasChildRecursive(child))
|
||
return;
|
||
if (this._HasAnyParent(child))
|
||
return;
|
||
const absX = child.GetX();
|
||
const absY = child.GetY();
|
||
const absW = child.GetWidth();
|
||
const absH = child.GetHeight();
|
||
const absA = child.GetAngle();
|
||
const absZElevation = child.GetZElevation();
|
||
child._SetParent(this);
|
||
child.SetTransformWithParentX(opts.transformX);
|
||
child.SetTransformWithParentY(opts.transformY);
|
||
child.SetTransformWithParentWidth(opts.transformWidth);
|
||
child.SetTransformWithParentHeight(opts.transformHeight);
|
||
child.SetTransformWithParentAngle(opts.transformAngle);
|
||
child.SetTransformWithParentZElevation(opts.transformZElevation);
|
||
child.SetDestroyWithParent(opts.destroyWithParent);
|
||
if (opts.transformX)
|
||
child._x = absX - this.GetX();
|
||
if (opts.transformY)
|
||
child._y = absY - this.GetY();
|
||
if (opts.transformWidth)
|
||
child._w = absW / this.GetWidth();
|
||
if (opts.transformHeight)
|
||
child._h = absH / this.GetHeight();
|
||
if (opts.transformAngle)
|
||
child._a = absA - this.GetAngle();
|
||
if (opts.transformZElevation)
|
||
child._zElevation = absZElevation - this.GetZElevation();
|
||
this._AddChildToSceneGraphInfo(child);
|
||
this.SetBboxChanged()
|
||
}
|
||
RemoveChild(child) {
|
||
if (child.GetParent() !== this)
|
||
return;
|
||
const absX = child.GetX();
|
||
const absY = child.GetY();
|
||
const absW = child.GetWidth();
|
||
const absH = child.GetHeight();
|
||
const absA = child.GetAngle();
|
||
const absZElevation = child.GetZElevation();
|
||
child._SetParent(null);
|
||
child._ClearAllSceneGraphFlags();
|
||
child.SetXY(absX, absY);
|
||
child.SetSize(absW, absH);
|
||
child.SetAngle(absA);
|
||
child.SetZElevation(absZElevation);
|
||
this._RemoveChildFromSceneGraphInfo(child);
|
||
this.SetBboxChanged()
|
||
}
|
||
_ResetAllSceneGraphState() {
|
||
for (const c of this.children())
|
||
this.RemoveChild(c);
|
||
const parent = this.GetParent();
|
||
if (parent)
|
||
parent.RemoveChild(this);
|
||
this._ClearAllSceneGraphFlags()
|
||
}
|
||
HasParent() {
|
||
return this.GetParent() !== null
|
||
}
|
||
GetParent() {
|
||
const sgi = this._sceneGraphInfo;
|
||
return sgi !== null ? sgi.GetParent() : null
|
||
}
|
||
GetTopParent() {
|
||
let p = this;
|
||
while (p.HasParent())
|
||
p = p.GetParent();
|
||
return p
|
||
}
|
||
*parents() {
|
||
let parent = this.GetParent();
|
||
while (parent) {
|
||
yield parent;
|
||
parent = parent.GetParent()
|
||
}
|
||
}
|
||
HasChild(child) {
|
||
return this.GetChildren().includes(child)
|
||
}
|
||
HasChildren() {
|
||
const sgi = this._sceneGraphInfo;
|
||
return sgi !== null ? sgi.HasChildren() : false
|
||
}
|
||
GetChildren() {
|
||
const sgi = this._sceneGraphInfo;
|
||
return sgi !== null ? sgi.GetChildren() : EMPTY_ARRAY
|
||
}
|
||
children() {
|
||
return this.GetChildren()
|
||
}
|
||
*allChildren() {
|
||
for (const child of this.children()) {
|
||
yield child;
|
||
yield*child.allChildren()
|
||
}
|
||
}
|
||
GetChildCount() {
|
||
return this.GetChildren().length
|
||
}
|
||
GetChildAt(index) {
|
||
const children = this.GetChildren();
|
||
index = Math.floor(+index);
|
||
if (index < 0 || index >= children.length)
|
||
return null;
|
||
return children[index]
|
||
}
|
||
_CreateSceneGraphInfo(parent) {
|
||
if (!this._sceneGraphInfo)
|
||
this._sceneGraphInfo = C3.New(C3.SceneGraphInfo, this);
|
||
if (parent)
|
||
this._sceneGraphInfo.SetParent(parent)
|
||
}
|
||
_GetSceneGraphInfo() {
|
||
return this._sceneGraphInfo
|
||
}
|
||
_ReleaseSceneGraphInfo() {
|
||
if (!this._sceneGraphInfo)
|
||
return;
|
||
this._sceneGraphInfo.Release();
|
||
this._sceneGraphInfo = null
|
||
}
|
||
_SetParent(parent) {
|
||
if (parent) {
|
||
parent._CreateSceneGraphInfo(null);
|
||
this._CreateSceneGraphInfo(parent)
|
||
} else {
|
||
if (this._sceneGraphInfo)
|
||
this._sceneGraphInfo.SetParent(null);
|
||
if (!this.HasChildren())
|
||
this._ReleaseSceneGraphInfo()
|
||
}
|
||
}
|
||
_HasAnyParent(child) {
|
||
if (!this.HasParent())
|
||
return false;
|
||
const parent = this.GetParent();
|
||
if (parent === child)
|
||
return true;
|
||
return parent._HasAnyParent(child)
|
||
}
|
||
_HasChildRecursive(child) {
|
||
if (this.HasChild(child))
|
||
return true;
|
||
for (const c of this.GetChildren())
|
||
if (c._HasChildRecursive(child))
|
||
return true;
|
||
return false
|
||
}
|
||
_AddChildToSceneGraphInfo(child) {
|
||
this._sceneGraphInfo.GetChildren().push(child)
|
||
}
|
||
_RemoveChildFromSceneGraphInfo(child) {
|
||
const children = this._sceneGraphInfo.GetChildren();
|
||
const index = children.indexOf(child);
|
||
if (index !== -1)
|
||
children.splice(index, 1);
|
||
if (children.length === 0 && !this.HasParent())
|
||
this._ReleaseSceneGraphInfo();
|
||
if (!child.HasChildren())
|
||
child._ReleaseSceneGraphInfo()
|
||
}
|
||
GetSceneGraphChildrenExportData() {
|
||
return this._sceneGraphChildrenExportData
|
||
}
|
||
_UpdateRendererStateGroup() {
|
||
if (!enableUpdateRendererStateGroup)
|
||
return;
|
||
const renderer = this._runtime.GetRenderer();
|
||
if (this._stateGroup)
|
||
renderer.ReleaseStateGroup(this._stateGroup);
|
||
this._stateGroup = renderer.AcquireStateGroup(renderer.GetTextureFillShaderProgram() || "<default>", this.GetBlendMode(), this._colorPremultiplied, this.GetZElevation())
|
||
}
|
||
GetRendererStateGroup() {
|
||
return this._stateGroup
|
||
}
|
||
HasDefaultColor() {
|
||
return this._color === DEFAULT_COLOR
|
||
}
|
||
SetBlendMode(bm) {
|
||
bm = bm | 0;
|
||
if (bm < 0 || bm > 31)
|
||
throw new RangeError("invalid blend mode");
|
||
if (this.GetBlendMode() === bm)
|
||
return;
|
||
this._flags = this._flags & ~FLAG_BLEND_MODE_MASK | bm << FLAG_BLEND_MODE_BIT_OFFSET;
|
||
this._UpdateRendererStateGroup()
|
||
}
|
||
GetBlendMode() {
|
||
return (this._flags & FLAG_BLEND_MODE_MASK) >> FLAG_BLEND_MODE_BIT_OFFSET
|
||
}
|
||
_SetLayer(layer) {
|
||
this._layer = layer;
|
||
if (this.GetZElevation() !== 0)
|
||
this._layer._SetAnyInstanceZElevated()
|
||
}
|
||
GetLayer() {
|
||
return this._layer
|
||
}
|
||
GetLayout() {
|
||
return this.GetLayer().GetLayout()
|
||
}
|
||
_SetZIndex(z) {
|
||
this._zIndex = z | 0
|
||
}
|
||
GetZIndex() {
|
||
this._layer._UpdateZIndices();
|
||
return this._zIndex
|
||
}
|
||
_GetLastCachedZIndex() {
|
||
return this._zIndex
|
||
}
|
||
_SetFlag(bit, enable) {
|
||
if (enable)
|
||
this._flags |= bit;
|
||
else
|
||
this._flags &= ~bit
|
||
}
|
||
IsVisible() {
|
||
return (this._flags & FLAG_IS_VISIBLE) !== 0
|
||
}
|
||
SetVisible(v) {
|
||
this._SetFlag(FLAG_IS_VISIBLE, v)
|
||
}
|
||
IsCollisionEnabled() {
|
||
return (this._flags & FLAG_COLLISION_ENABLED) !== 0
|
||
}
|
||
SetCollisionEnabled(e) {
|
||
e = !!e;
|
||
if (this.IsCollisionEnabled() === e)
|
||
return;
|
||
this._SetFlag(FLAG_COLLISION_ENABLED, e);
|
||
if (e)
|
||
this.SetBboxChanged();
|
||
else
|
||
this._RemoveFromCollisionCells()
|
||
}
|
||
SetSolidCollisionFilter(isInclusive, tags) {
|
||
this._SetFlag(FLAG_SOLID_FILTER_INCLUSIVE, isInclusive);
|
||
if (this._solidFilterTags)
|
||
this._solidFilterTags.clear();
|
||
if (!tags.trim()) {
|
||
this._solidFilterTags = null;
|
||
return
|
||
}
|
||
if (!this._solidFilterTags)
|
||
this._solidFilterTags = new Set;
|
||
for (const tag of tags.split(" "))
|
||
if (tag)
|
||
this._solidFilterTags.add(tag.toLowerCase())
|
||
}
|
||
IsSolidCollisionAllowed(solidTagSet) {
|
||
const isInclusive = (this._flags & FLAG_SOLID_FILTER_INCLUSIVE) !== 0;
|
||
const filterTags = this._solidFilterTags;
|
||
if (!solidTagSet || !filterTags)
|
||
return !isInclusive;
|
||
for (const tag of filterTags)
|
||
if (solidTagSet.has(tag))
|
||
return isInclusive;
|
||
return !isInclusive
|
||
}
|
||
SetBboxChanged() {
|
||
this._flags |= FLAG_BBOX_CHANGED | FLAG_COLLISION_CELL_CHANGED | FLAG_MESH_CHANGED;
|
||
this._objectClass._SetAnyCollisionCellChanged(true);
|
||
this._runtime.UpdateRender();
|
||
if (this._layer.UsesRenderCells()) {
|
||
this.CalculateBbox(this._boundingBox, this._boundingQuad, true);
|
||
this._flags &= ~FLAG_BBOX_CHANGED;
|
||
this._UpdateRenderCell()
|
||
}
|
||
if ((this._flags & FLAG_ENABLE_BBOX_CHANGED_EVENT) !== 0)
|
||
this._inst.Dispatcher().dispatchEvent(bboxChangeEvent);
|
||
if (this._sceneGraphInfo !== null) {
|
||
const children = this._sceneGraphInfo.GetChildren();
|
||
for (let i = 0, len = children.length; i < len; ++i)
|
||
children[i].SetBboxChanged()
|
||
}
|
||
}
|
||
CalculateBbox(bbox, bquad, includeMesh) {
|
||
const x = this.GetX();
|
||
const y = this.GetY();
|
||
const w = this.GetWidth();
|
||
const h = this.GetHeight();
|
||
const a = this.GetAngle();
|
||
bbox.setWH(x - this._ox * w, y - this._oy * h, w, h);
|
||
if (includeMesh && this.HasMesh())
|
||
this._ExpandBboxForMesh(bbox);
|
||
if (a === 0)
|
||
bquad.setFromRect(bbox);
|
||
else {
|
||
bbox.offset(-x, -y);
|
||
bquad.setFromRotatedRectPrecalc(bbox, this.GetSinAngle(), this.GetCosAngle());
|
||
bquad.offset(x, y);
|
||
bquad.getBoundingBox(bbox)
|
||
}
|
||
bbox.normalize()
|
||
}
|
||
_UpdateBbox() {
|
||
const flags = this._flags;
|
||
if ((flags & FLAG_BBOX_CHANGED) !== 0) {
|
||
this.CalculateBbox(this._boundingBox, this._boundingQuad, true);
|
||
this._flags = flags & ~FLAG_BBOX_CHANGED
|
||
}
|
||
}
|
||
GetBoundingBox() {
|
||
this._UpdateBbox();
|
||
return this._boundingBox
|
||
}
|
||
GetBoundingQuad() {
|
||
this._UpdateBbox();
|
||
return this._boundingQuad
|
||
}
|
||
PixelRoundQuad(quad) {
|
||
const x = this.GetX();
|
||
const y = this.GetY();
|
||
const ox = Math.round(x) - x;
|
||
const oy = Math.round(y) - y;
|
||
if (ox === 0 && oy === 0)
|
||
return quad;
|
||
else {
|
||
tempQuad.copy(quad);
|
||
tempQuad.offset(ox, oy);
|
||
return tempQuad
|
||
}
|
||
}
|
||
OverwriteBoundingBox(box) {
|
||
this._boundingBox.copy(box);
|
||
this._boundingQuad.setFromRect(this._boundingBox);
|
||
this._flags &= ~FLAG_BBOX_CHANGED;
|
||
this._UpdateCollisionCell();
|
||
this._UpdateRenderCell()
|
||
}
|
||
SetBboxChangeEventEnabled(e) {
|
||
this._SetFlag(FLAG_ENABLE_BBOX_CHANGED_EVENT, e)
|
||
}
|
||
IsBboxChangeEventEnabled() {
|
||
return (this._flags & FLAG_ENABLE_BBOX_CHANGED_EVENT) !== 0
|
||
}
|
||
IsInViewport(viewport) {
|
||
return this.GetZElevation() === 0 ? viewport.intersectsRect(this.GetBoundingBox()) : this._IsInViewport_ZElevated()
|
||
}
|
||
_IsInViewport_ZElevated() {
|
||
const layer = this.GetLayer();
|
||
const totalZElevation = this.GetTotalZElevation();
|
||
if (totalZElevation >= layer.GetCameraZ())
|
||
return false;
|
||
layer.GetViewportForZ(totalZElevation, tempRect);
|
||
return tempRect.intersectsRect(this.GetBoundingBox())
|
||
}
|
||
SetSourceCollisionPoly(poly) {
|
||
this._sourceCollisionPoly = poly;
|
||
this._DiscardTransformedCollisionPoly();
|
||
if (this.HasMesh())
|
||
this._meshInfo.meshPoly = null
|
||
}
|
||
GetSourceCollisionPoly() {
|
||
return this._sourceCollisionPoly
|
||
}
|
||
HasOwnCollisionPoly() {
|
||
return this._sourceCollisionPoly !== null || this.HasMesh()
|
||
}
|
||
GetTransformedCollisionPoly() {
|
||
return this._GetCustomTransformedCollisionPolyPrecalc(this.GetWidth(), this.GetHeight(), this.GetAngle(), this.GetSinAngle(), this.GetCosAngle())
|
||
}
|
||
GetCustomTransformedCollisionPoly(w, h, a) {
|
||
let sina = 0;
|
||
let cosa = 1;
|
||
if (a !== 0) {
|
||
sina = Math.sin(a);
|
||
cosa = Math.cos(a)
|
||
}
|
||
return this._GetCustomTransformedCollisionPolyPrecalc(w, h, a, sina, cosa)
|
||
}
|
||
_GetCustomTransformedCollisionPolyPrecalc(w, h, a, sinA, cosA) {
|
||
let tpi = this._transformedPolyInfo;
|
||
if (tpi === null) {
|
||
tpi = {
|
||
poly: C3.New(C3.CollisionPoly),
|
||
width: NaN,
|
||
height: NaN,
|
||
angle: NaN
|
||
};
|
||
this._transformedPolyInfo = tpi
|
||
}
|
||
const transformedPoly = tpi.poly;
|
||
if (tpi.width === w && tpi.height === h && tpi.angle === a)
|
||
return transformedPoly;
|
||
const sourcePoly = this._sourceCollisionPoly;
|
||
if (this.HasMesh()) {
|
||
const ox = this.GetOriginX();
|
||
const oy = this.GetOriginY();
|
||
const sourceMesh = this.GetSourceMesh();
|
||
let meshPoly = this._meshInfo.meshPoly;
|
||
if (!meshPoly) {
|
||
if (sourcePoly) {
|
||
tempCollisionPoly.copy(sourcePoly);
|
||
tempCollisionPoly.offset(ox, oy)
|
||
} else
|
||
tempCollisionPoly.setDefaultPoints();
|
||
meshPoly = sourceMesh.InsertPolyMeshVertices(tempCollisionPoly);
|
||
this._meshInfo.meshPoly = meshPoly
|
||
}
|
||
sourceMesh.TransformCollisionPoly(meshPoly, transformedPoly);
|
||
transformedPoly.offset(-ox, -oy);
|
||
transformedPoly.transformPrecalc(w, h, sinA, cosA)
|
||
} else if (sourcePoly) {
|
||
transformedPoly.copy(sourcePoly);
|
||
transformedPoly.transformPrecalc(w, h, sinA, cosA)
|
||
} else
|
||
transformedPoly.setFromQuad(this.GetBoundingQuad(), -this.GetX(), -this.GetY());
|
||
tpi.width = w;
|
||
tpi.height = h;
|
||
tpi.angle = a;
|
||
return transformedPoly
|
||
}
|
||
_DiscardTransformedCollisionPoly() {
|
||
this.SetPhysicsBodyChanged(true);
|
||
const tpi = this._transformedPolyInfo;
|
||
if (tpi === null)
|
||
return;
|
||
tpi.width = NaN
|
||
}
|
||
CreateMesh(hsize, vsize) {
|
||
hsize = Math.floor(hsize);
|
||
vsize = Math.floor(vsize);
|
||
if (!this.GetInstance().GetPlugin().SupportsMesh())
|
||
throw new Error("object does not support mesh");
|
||
this.ReleaseMesh();
|
||
this._meshInfo = {
|
||
sourceMesh: C3.New(C3.Gfx.Mesh, hsize, vsize),
|
||
transformedMesh: C3.New(C3.Gfx.Mesh, hsize, vsize),
|
||
meshPoly: null
|
||
}
|
||
}
|
||
HasMesh() {
|
||
return this._meshInfo !== null
|
||
}
|
||
GetSourceMesh() {
|
||
if (!this.HasMesh())
|
||
throw new Error("no mesh");
|
||
return this._meshInfo.sourceMesh
|
||
}
|
||
GetTransformedMesh() {
|
||
if (!this.HasMesh())
|
||
throw new Error("no mesh");
|
||
return this._meshInfo.transformedMesh
|
||
}
|
||
SetMeshChanged(e) {
|
||
this._SetFlag(FLAG_MESH_CHANGED, e)
|
||
}
|
||
IsMeshChanged() {
|
||
return (this._flags & FLAG_MESH_CHANGED) !== 0
|
||
}
|
||
SetPhysicsBodyChanged(e) {
|
||
this._SetFlag(FLAG_PHYSICS_BODY_CHANGED, e)
|
||
}
|
||
IsPhysicsBodyChanged() {
|
||
return (this._flags & FLAG_PHYSICS_BODY_CHANGED) !== 0
|
||
}
|
||
_ExpandBboxForMesh(bbox) {
|
||
const sourceMesh = this._meshInfo.sourceMesh;
|
||
const minX = Math.min(sourceMesh.GetMinX(), 0);
|
||
const minY = Math.min(sourceMesh.GetMinY(), 0);
|
||
const maxX = Math.max(sourceMesh.GetMaxX(), 1);
|
||
const maxY = Math.max(sourceMesh.GetMaxY(), 1);
|
||
const w = bbox.width();
|
||
const h = bbox.height();
|
||
bbox.offsetLeft(minX * w);
|
||
bbox.offsetTop(minY * h);
|
||
bbox.offsetRight((maxX - 1) * w);
|
||
bbox.offsetBottom((maxY - 1) * h)
|
||
}
|
||
ReleaseMesh() {
|
||
if (!this._meshInfo)
|
||
return;
|
||
this._meshInfo.sourceMesh.Release();
|
||
this._meshInfo.transformedMesh.Release();
|
||
this._meshInfo = null;
|
||
this._DiscardTransformedCollisionPoly()
|
||
}
|
||
SetMeshPoint(col, row, opts) {
|
||
col = Math.floor(col);
|
||
row = Math.floor(row);
|
||
const mode = opts.mode || "absolute";
|
||
if (!VALID_SET_MESH_POINT_MODES.has(mode))
|
||
throw new Error("invalid mode");
|
||
const isRelative = mode === "relative";
|
||
let posx = opts.x;
|
||
let posy = opts.y;
|
||
let texu = typeof opts.u === "number" ? opts.u : isRelative ? 0 : -1;
|
||
let texv = typeof opts.v === "number" ? opts.v : isRelative ? 0 : -1;
|
||
if (!this.HasMesh())
|
||
return false;
|
||
const sourceMesh = this.GetSourceMesh();
|
||
const p = sourceMesh.GetMeshPointAt(col, row);
|
||
if (p === null)
|
||
return false;
|
||
if (isRelative) {
|
||
posx += col / (sourceMesh.GetHSize() - 1);
|
||
posy += row / (sourceMesh.GetVSize() - 1)
|
||
}
|
||
if (texu === -1 && !isRelative)
|
||
texu = p.GetU();
|
||
else {
|
||
if (isRelative)
|
||
texu += col / (sourceMesh.GetHSize() - 1);
|
||
texu = C3.clamp(texu, 0, 1)
|
||
}
|
||
if (texv === -1 && !isRelative)
|
||
texv = p.GetV();
|
||
else {
|
||
if (isRelative)
|
||
texv += row / (sourceMesh.GetVSize() - 1);
|
||
texv = C3.clamp(texv, 0, 1)
|
||
}
|
||
if (p.GetX() === posx && p.GetY() === posy && p.GetU() === texu && p.GetV() === texv)
|
||
return false;
|
||
p.SetX(posx);
|
||
p.SetY(posy);
|
||
p.SetU(texu);
|
||
p.SetV(texv);
|
||
this._DiscardTransformedCollisionPoly();
|
||
return true
|
||
}
|
||
HasTilemap() {
|
||
return this._inst.HasTilemap()
|
||
}
|
||
ContainsPoint(x, y) {
|
||
if (!this.GetBoundingBox().containsPoint(x, y))
|
||
return false;
|
||
if (!this.GetBoundingQuad().containsPoint(x, y))
|
||
return false;
|
||
if (this.HasTilemap())
|
||
return this._inst.GetSdkInstance().TestPointOverlapTile(x, y);
|
||
if (!this.HasOwnCollisionPoly())
|
||
return true;
|
||
return this.GetTransformedCollisionPoly().containsPoint(x - this.GetX(), y - this.GetY())
|
||
}
|
||
_IsCollisionCellChanged() {
|
||
return (this._flags & FLAG_COLLISION_CELL_CHANGED) !== 0
|
||
}
|
||
_UpdateCollisionCell() {
|
||
if (!this._IsCollisionCellChanged() || !this.IsCollisionEnabled())
|
||
return;
|
||
const bbox = this.GetBoundingBox();
|
||
const grid = this._objectClass._GetCollisionCellGrid();
|
||
const collisionCells = this._collisionCells;
|
||
tempRect.set(grid.XToCell(bbox.getLeft()), grid.YToCell(bbox.getTop()), grid.XToCell(bbox.getRight()), grid.YToCell(bbox.getBottom()));
|
||
if (collisionCells.equals(tempRect))
|
||
return;
|
||
const inst = this._inst;
|
||
if (collisionCells === DEFAULT_COLLISION_CELLS) {
|
||
grid.Update(inst, null, tempRect);
|
||
this._collisionCells = C3.New(C3.Rect, tempRect)
|
||
} else {
|
||
grid.Update(inst, collisionCells, tempRect);
|
||
collisionCells.copy(tempRect)
|
||
}
|
||
this._flags &= ~FLAG_COLLISION_CELL_CHANGED
|
||
}
|
||
_RemoveFromCollisionCells() {
|
||
const collisionCells = this._collisionCells;
|
||
if (collisionCells === DEFAULT_COLLISION_CELLS)
|
||
return;
|
||
this._objectClass._GetCollisionCellGrid().Update(this._inst, collisionCells, null);
|
||
this._collisionCells = DEFAULT_COLLISION_CELLS
|
||
}
|
||
_UpdateRenderCell() {
|
||
const layer = this.GetLayer();
|
||
if (!layer.UsesRenderCells())
|
||
return;
|
||
const renderGrid = layer.GetRenderGrid();
|
||
const bbox = this.GetBoundingBox();
|
||
const renderCells = this._renderCells;
|
||
tempRect.set(renderGrid.XToCell(bbox.getLeft()), renderGrid.YToCell(bbox.getTop()), renderGrid.XToCell(bbox.getRight()), renderGrid.YToCell(bbox.getBottom()));
|
||
if (renderCells.equals(tempRect))
|
||
return;
|
||
const inst = this._inst;
|
||
if (renderCells === DEFAULT_RENDER_CELLS) {
|
||
renderGrid.Update(inst, null, tempRect);
|
||
this._renderCells = C3.New(C3.Rect, tempRect)
|
||
} else {
|
||
renderGrid.Update(inst, renderCells, tempRect);
|
||
renderCells.copy(tempRect)
|
||
}
|
||
layer.SetRenderListStale()
|
||
}
|
||
_RemoveFromRenderCells() {
|
||
const renderCells = this._renderCells;
|
||
if (renderCells === DEFAULT_RENDER_CELLS)
|
||
return;
|
||
this.GetLayer().GetRenderGrid().Update(this._inst, renderCells, null);
|
||
this._renderCells = DEFAULT_RENDER_CELLS
|
||
}
|
||
GetRenderCellRange() {
|
||
return this._renderCells
|
||
}
|
||
ZOrderMoveToTop() {
|
||
const inst = this._inst;
|
||
const layer = this._layer;
|
||
const layerInstances = layer._GetInstances();
|
||
if (layerInstances.length && layerInstances[layerInstances.length - 1] === inst)
|
||
return;
|
||
layer._RemoveInstance(inst, false);
|
||
layer._AddInstance(inst, false);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
ZOrderMoveToBottom() {
|
||
const inst = this._inst;
|
||
const layer = this._layer;
|
||
const layerInstances = layer._GetInstances();
|
||
if (layerInstances.length && layerInstances[0] === inst)
|
||
return;
|
||
layer._RemoveInstance(inst, false);
|
||
layer._PrependInstance(inst, false);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
ZOrderMoveToLayer(layerMove) {
|
||
const inst = this._inst;
|
||
const curLayer = this._layer;
|
||
if (curLayer.GetLayout() !== layerMove.GetLayout())
|
||
throw new Error("layer from different layout");
|
||
if (layerMove === curLayer)
|
||
return;
|
||
curLayer._RemoveInstance(inst, true);
|
||
this._SetLayer(layerMove);
|
||
layerMove._AddInstance(inst, true);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
ZOrderMoveAdjacentToInstance(otherInst, isAfter) {
|
||
const inst = this._inst;
|
||
const curLayer = this._layer;
|
||
if (otherInst.GetUID() === inst.GetUID())
|
||
return;
|
||
const otherWi = otherInst.GetWorldInfo();
|
||
if (!otherWi)
|
||
throw new Error("expected world instance");
|
||
const otherLayer = otherWi.GetLayer();
|
||
let didChangeLayer = false;
|
||
if (curLayer.GetIndex() !== otherLayer.GetIndex()) {
|
||
curLayer._RemoveInstance(inst, true);
|
||
this._SetLayer(otherLayer);
|
||
otherLayer._AddInstance(inst, true);
|
||
didChangeLayer = true
|
||
}
|
||
const didChangeZOrder = otherLayer.MoveInstanceAdjacent(inst, otherInst, !!isAfter);
|
||
if (didChangeLayer || didChangeZOrder)
|
||
this._runtime.UpdateRender()
|
||
}
|
||
GetInstanceEffectList() {
|
||
return this._instanceEffectList
|
||
}
|
||
_SetHasAnyActiveEffect(e) {
|
||
this._SetFlag(FLAG_HAS_ANY_ACTIVE_EFFECT, e)
|
||
}
|
||
HasAnyActiveEffect() {
|
||
return (this._flags & FLAG_HAS_ANY_ACTIVE_EFFECT) !== 0
|
||
}
|
||
_SaveToJson() {
|
||
const o = {
|
||
"x": this.GetX(),
|
||
"y": this.GetY(),
|
||
"w": this.GetWidth(),
|
||
"h": this.GetHeight(),
|
||
"l": this.GetLayer().GetSID(),
|
||
"zi": this.GetZIndex()
|
||
};
|
||
if (this.GetZElevation() !== 0)
|
||
o["ze"] = this.GetZElevation();
|
||
if (this.GetAngle() !== 0)
|
||
o["a"] = this.GetAngle();
|
||
if (!this.HasDefaultColor())
|
||
o["c"] = this._color.toJSON();
|
||
if (this.GetOriginX() !== .5)
|
||
o["oX"] = this.GetOriginX();
|
||
if (this.GetOriginY() !== .5)
|
||
o["oY"] = this.GetOriginY();
|
||
if (this.GetBlendMode() !== 0)
|
||
o["bm"] = this.GetBlendMode();
|
||
if (!this.IsVisible())
|
||
o["v"] = this.IsVisible();
|
||
if (!this.IsCollisionEnabled())
|
||
o["ce"] = this.IsCollisionEnabled();
|
||
if (this.IsBboxChangeEventEnabled())
|
||
o["be"] = this.IsBboxChangeEventEnabled();
|
||
if (this._instanceEffectList)
|
||
o["fx"] = this._instanceEffectList._SaveToJson();
|
||
const isSolidFilterInclusive = (this._flags & FLAG_SOLID_FILTER_INCLUSIVE) !== 0;
|
||
if (isSolidFilterInclusive)
|
||
o["sfi"] = isSolidFilterInclusive;
|
||
if (this._solidFilterTags)
|
||
o["sft"] = [...this._solidFilterTags].join(" ");
|
||
if (this._sceneGraphInfo)
|
||
o["sgi"] = this._sceneGraphInfo._SaveToJson();
|
||
return o
|
||
}
|
||
_LoadFromJson(o) {
|
||
enableUpdateRendererStateGroup = false;
|
||
this._ResetAllSceneGraphState();
|
||
this.SetX(o["x"]);
|
||
this.SetY(o["y"]);
|
||
this.SetWidth(o["w"]);
|
||
this.SetHeight(o["h"]);
|
||
this._SetZIndex(o["zi"]);
|
||
this.SetZElevation(o.hasOwnProperty("ze") ? o["ze"] : 0);
|
||
this.SetAngle(o.hasOwnProperty("a") ? o["a"] : 0);
|
||
if (o.hasOwnProperty("c"))
|
||
tempColor.setFromJSON(o["c"]);
|
||
else if (o.hasOwnProperty("o")) {
|
||
tempColor.copyRgb(this._color);
|
||
tempColor.a = o["o"]
|
||
} else
|
||
tempColor.setRgba(1, 1, 1, 1);
|
||
this._SetColor(tempColor);
|
||
this.SetOriginX(o.hasOwnProperty("oX") ? o["oX"] : .5);
|
||
this.SetOriginY(o.hasOwnProperty("oY") ? o["oY"] : .5);
|
||
this.SetBlendMode(o.hasOwnProperty("bm") ? o["bm"] : 0);
|
||
this.SetVisible(o.hasOwnProperty("v") ? o["v"] : true);
|
||
this.SetCollisionEnabled(o.hasOwnProperty("ce") ? o["ce"] : true);
|
||
this.SetBboxChangeEventEnabled(o.hasOwnProperty("be") ? o["be"] : false);
|
||
this.SetSolidCollisionFilter(o.hasOwnProperty("sfi") ? o["sfi"] : false, o.hasOwnProperty("sft") ? o["sft"] : "");
|
||
if (this._instanceEffectList && o.hasOwnProperty("fx"))
|
||
this._instanceEffectList._LoadFromJson(o["fx"]);
|
||
if (o.hasOwnProperty("sgi")) {
|
||
this._CreateSceneGraphInfo(null);
|
||
const sgi = this._sceneGraphInfo;
|
||
const sgiData = o["sgi"];
|
||
sgi._LoadFromJson(sgiData);
|
||
const runtimeDispatcher = this.GetRuntime().Dispatcher();
|
||
const onAfterLoad = ()=>{
|
||
runtimeDispatcher.removeEventListener("afterload", onAfterLoad);
|
||
sgi._OnAfterLoad(sgiData)
|
||
}
|
||
;
|
||
runtimeDispatcher.addEventListener("afterload", onAfterLoad)
|
||
}
|
||
this.SetBboxChanged();
|
||
enableUpdateRendererStateGroup = true;
|
||
this._UpdateRendererStateGroup()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.BehaviorType = class BehaviorType extends C3.DefendedBase {
|
||
constructor(objectClass, data) {
|
||
super();
|
||
const runtime = objectClass.GetRuntime();
|
||
const pluginManager = runtime.GetPluginManager();
|
||
const BehaviorCtor = runtime.GetObjectReference(data[1]);
|
||
if (!pluginManager.HasBehaviorByConstructorFunction(BehaviorCtor))
|
||
pluginManager.CreateBehavior(data);
|
||
this._runtime = runtime;
|
||
this._objectClass = objectClass;
|
||
this._behavior = pluginManager.GetBehaviorByConstructorFunction(BehaviorCtor);
|
||
this._sdkType = null;
|
||
this._instSdkCtor = BehaviorCtor.Instance;
|
||
this._sid = data[2];
|
||
this._name = data[0];
|
||
this._jsPropName = this._runtime.GetJsPropName(data[3]);
|
||
this._sdkType = C3.New(BehaviorCtor.Type, this);
|
||
this.OnCreate()
|
||
}
|
||
static Create(objectClass, behaviorTypeData) {
|
||
return C3.New(C3.BehaviorType, objectClass, behaviorTypeData)
|
||
}
|
||
Release() {
|
||
this._runtime = null;
|
||
this._behavior = null;
|
||
this._sdkType.Release();
|
||
this._sdkType = null;
|
||
this._instSdkCtor = null
|
||
}
|
||
GetSdkType() {
|
||
return this._sdkType
|
||
}
|
||
OnCreate() {
|
||
this._sdkType.OnCreate()
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetObjectClass() {
|
||
return this._objectClass
|
||
}
|
||
GetBehavior() {
|
||
return this._behavior
|
||
}
|
||
GetInstanceSdkCtor() {
|
||
return this._instSdkCtor
|
||
}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
GetSID() {
|
||
return this._sid
|
||
}
|
||
GetJsPropName() {
|
||
return this._jsPropName
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const IBehaviorInstance = self.IBehaviorInstance;
|
||
C3.BehaviorInstance = class BehaviorInstance extends C3.DefendedBase {
|
||
constructor(opts) {
|
||
super();
|
||
this._runtime = opts.runtime;
|
||
this._behaviorType = opts.behaviorType;
|
||
this._behavior = this._behaviorType.GetBehavior();
|
||
this._inst = opts.instance;
|
||
this._index = opts.index;
|
||
this._sdkInst = null;
|
||
this._iScriptInterface = null;
|
||
this._behavior._AddInstance(this._inst)
|
||
}
|
||
Release() {
|
||
if (this._iScriptInterface) {
|
||
this._iScriptInterface._Release();
|
||
this._iScriptInterface = null
|
||
}
|
||
this._behavior._RemoveInstance(this._inst);
|
||
this._sdkInst.Release();
|
||
this._sdkInst = null;
|
||
this._iScriptInterface = null;
|
||
this._runtime = null;
|
||
this._behaviorType = null;
|
||
this._behavior = null;
|
||
this._inst = null
|
||
}
|
||
_CreateSdkInstance(properties) {
|
||
if (this._sdkInst)
|
||
throw new Error("already got sdk instance");
|
||
this._sdkInst = C3.New(this._behaviorType.GetInstanceSdkCtor(), this, properties);
|
||
this._InitScriptInterface()
|
||
}
|
||
GetSdkInstance() {
|
||
return this._sdkInst
|
||
}
|
||
GetObjectInstance() {
|
||
return this._inst
|
||
}
|
||
GetRuntime() {
|
||
return this._runtime
|
||
}
|
||
GetBehaviorType() {
|
||
return this._behaviorType
|
||
}
|
||
GetBehavior() {
|
||
return this._behavior
|
||
}
|
||
_GetIndex() {
|
||
return this._index
|
||
}
|
||
PostCreate() {
|
||
this._sdkInst.PostCreate()
|
||
}
|
||
OnSpriteFrameChanged(prevFrame, nextFrame) {
|
||
this._sdkInst.OnSpriteFrameChanged(prevFrame, nextFrame)
|
||
}
|
||
_GetDebuggerProperties() {
|
||
return this._sdkInst.GetDebuggerProperties()
|
||
}
|
||
SaveToJson() {
|
||
return this._sdkInst.SaveToJson()
|
||
}
|
||
LoadFromJson(o) {
|
||
return this._sdkInst.LoadFromJson(o)
|
||
}
|
||
static SortByTickSequence(a, b) {
|
||
const instA = a.GetObjectInstance();
|
||
const instB = b.GetObjectInstance();
|
||
const typeIndexA = instA.GetObjectClass().GetIndex();
|
||
const typeIndexB = instB.GetObjectClass().GetIndex();
|
||
if (typeIndexA !== typeIndexB)
|
||
return typeIndexA - typeIndexB;
|
||
const seqA = instA.GetPUID();
|
||
const seqB = instB.GetPUID();
|
||
if (seqA !== seqB)
|
||
return seqA - seqB;
|
||
return a.GetBehaviorInstance()._GetIndex() - b.GetBehaviorInstance()._GetIndex()
|
||
}
|
||
_InitScriptInterface() {
|
||
const DefaultScriptClass = IBehaviorInstance;
|
||
const SdkScriptClass = this._sdkInst.GetScriptInterfaceClass();
|
||
const ScriptInterfaceClass = SdkScriptClass || DefaultScriptClass;
|
||
IBehaviorInstance._Init(this);
|
||
this._iScriptInterface = new ScriptInterfaceClass;
|
||
IBehaviorInstance._Init(null);
|
||
if (SdkScriptClass && !(this._iScriptInterface instanceof DefaultScriptClass))
|
||
throw new TypeError(`script interface class '${SdkScriptClass.name}' does not extend the right base class '${DefaultScriptClass.name}'`);
|
||
}
|
||
GetScriptInterface() {
|
||
return this._iScriptInterface
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.EffectList = class EffectList extends C3.DefendedBase {
|
||
constructor(owner, data) {
|
||
super();
|
||
this._owner = owner;
|
||
this._allEffectTypes = [];
|
||
this._activeEffectTypes = [];
|
||
this._effectTypesByName = new Map;
|
||
this._effectParams = [];
|
||
this._preservesOpaqueness = true;
|
||
for (const d of data) {
|
||
const et = C3.New(C3.EffectType, this, d, this._allEffectTypes.length);
|
||
this._allEffectTypes.push(et);
|
||
this._effectTypesByName.set(et.GetName().toLowerCase(), et);
|
||
if (d.length >= 3)
|
||
this._effectParams.push(this._LoadSingleEffectParameters(d[2]))
|
||
}
|
||
this.GetRuntime()._AddEffectList(this)
|
||
}
|
||
Release() {
|
||
C3.clearArray(this._allEffectTypes);
|
||
C3.clearArray(this._activeEffectTypes);
|
||
this._effectTypesByName.clear();
|
||
C3.clearArray(this._effectParams);
|
||
this._owner = null
|
||
}
|
||
PrependEffectTypes(arr) {
|
||
if (!arr.length)
|
||
return;
|
||
this._allEffectTypes = arr.concat(this._allEffectTypes);
|
||
for (const et of arr)
|
||
this._effectTypesByName.set(et.GetName().toLowerCase(), et);
|
||
for (let i = 0, len = this._allEffectTypes.length; i < len; ++i)
|
||
this._allEffectTypes[i]._SetIndex(i)
|
||
}
|
||
_LoadSingleEffectParameters(arr) {
|
||
const ret = arr.slice(0);
|
||
for (let i = 0, len = ret.length; i < len; ++i) {
|
||
const p = ret[i];
|
||
if (Array.isArray(p)) {
|
||
const c = C3.New(C3.Color);
|
||
c.setFromJSON(p);
|
||
ret[i] = c
|
||
}
|
||
}
|
||
return ret
|
||
}
|
||
GetOwner() {
|
||
return this._owner
|
||
}
|
||
GetRuntime() {
|
||
return this._owner.GetRuntime()
|
||
}
|
||
UpdateActiveEffects() {
|
||
C3.clearArray(this._activeEffectTypes);
|
||
let preservesOpaqueness = true;
|
||
for (const et of this._allEffectTypes)
|
||
if (et.IsActive()) {
|
||
this._activeEffectTypes.push(et);
|
||
if (!et.GetShaderProgram().PreservesOpaqueness())
|
||
preservesOpaqueness = false
|
||
}
|
||
this._preservesOpaqueness = preservesOpaqueness
|
||
}
|
||
GetAllEffectTypes() {
|
||
return this._allEffectTypes
|
||
}
|
||
HasAnyEffectType() {
|
||
return this._allEffectTypes.length > 0
|
||
}
|
||
GetEffectTypeByName(name) {
|
||
return this._effectTypesByName.get(name.toLowerCase()) || null
|
||
}
|
||
GetEffectTypeByIndex(index) {
|
||
index = Math.floor(+index);
|
||
if (index < 0 || index >= this._allEffectTypes.length)
|
||
throw new RangeError("invalid effect type index");
|
||
return this._allEffectTypes[index]
|
||
}
|
||
IsEffectIndexActive(index) {
|
||
return this.GetEffectTypeByIndex(index).IsActive()
|
||
}
|
||
SetEffectIndexActive(index, a) {
|
||
this.GetEffectTypeByIndex(index).SetActive(a)
|
||
}
|
||
GetActiveEffectTypes() {
|
||
return this._activeEffectTypes
|
||
}
|
||
HasAnyActiveEffect() {
|
||
return this._activeEffectTypes.length > 0
|
||
}
|
||
PreservesOpaqueness() {
|
||
return this._preservesOpaqueness
|
||
}
|
||
GetEffectParametersForIndex(index) {
|
||
return this._effectParams[index]
|
||
}
|
||
static SaveFxParamToJson(param) {
|
||
if (param && param instanceof C3.Color)
|
||
return {
|
||
"t": "color",
|
||
"v": param.toJSON()
|
||
};
|
||
else
|
||
return param
|
||
}
|
||
static LoadFxParamFromJson(o) {
|
||
if (typeof o === "object") {
|
||
const type = o["t"];
|
||
if (type === "color") {
|
||
const color = C3.New(C3.Color);
|
||
color.setFromJSON(o["v"]);
|
||
return color
|
||
} else
|
||
throw new Error("invalid effect parameter type");
|
||
} else
|
||
return o
|
||
}
|
||
static SaveFxParamsToJson(params) {
|
||
return params.map(C3.EffectList.SaveFxParamToJson)
|
||
}
|
||
static LoadFxParamsFromJson(arr) {
|
||
return arr.map(C3.EffectList.LoadFxParamFromJson)
|
||
}
|
||
SaveToJson() {
|
||
return this._allEffectTypes.map(et=>({
|
||
"name": et.GetName(),
|
||
"active": et.IsActive(),
|
||
"params": C3.EffectList.SaveFxParamsToJson(this._effectParams[et.GetIndex()])
|
||
}))
|
||
}
|
||
LoadFromJson(arr) {
|
||
for (const o of arr) {
|
||
const et = this.GetEffectTypeByName(o["name"]);
|
||
if (!et)
|
||
continue;
|
||
et.SetActive(o["active"]);
|
||
this._effectParams[et.GetIndex()] = C3.EffectList.LoadFxParamsFromJson(o["params"])
|
||
}
|
||
this.UpdateActiveEffects()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.EffectType = class EffectType extends C3.DefendedBase {
|
||
constructor(effectList, data, index) {
|
||
super();
|
||
this._effectList = effectList;
|
||
this._id = data[0];
|
||
this._name = data[1];
|
||
this._index = index;
|
||
this._shaderProgram = null;
|
||
this._isActive = true
|
||
}
|
||
Release() {
|
||
this._effectList = null;
|
||
this._shaderProgram = null
|
||
}
|
||
Clone(effectListOwner) {
|
||
const ret = C3.New(C3.EffectType, effectListOwner, [this._id, this._name], -1);
|
||
ret._shaderProgram = this._shaderProgram;
|
||
ret._isActive = this._isActive;
|
||
return ret
|
||
}
|
||
_InitRenderer(renderer) {
|
||
const shaderProgram = renderer.GetShaderProgramByName(this._id);
|
||
if (!shaderProgram)
|
||
throw new Error("failed to find shader program '" + this._id + "'");
|
||
this._shaderProgram = shaderProgram
|
||
}
|
||
GetEffectList() {
|
||
return this._effectList
|
||
}
|
||
GetName() {
|
||
return this._name
|
||
}
|
||
_SetIndex(i) {
|
||
this._index = i
|
||
}
|
||
GetIndex() {
|
||
return this._index
|
||
}
|
||
GetOwner() {
|
||
return this._effectList.GetOwner()
|
||
}
|
||
GetRuntime() {
|
||
return this._effectList.GetRuntime()
|
||
}
|
||
SetActive(a) {
|
||
this._isActive = !!a
|
||
}
|
||
IsActive() {
|
||
return this._isActive
|
||
}
|
||
GetShaderProgram() {
|
||
return this._shaderProgram
|
||
}
|
||
GetDefaultParameterValues() {
|
||
const ret = [];
|
||
for (let i = 0, len = this._shaderProgram.GetParameterCount(); i < len; ++i) {
|
||
const type = this._shaderProgram.GetParameterType(i);
|
||
if (type === "float" || type === "percent")
|
||
ret.push(0);
|
||
else if (type === "color")
|
||
ret.push(C3.New(C3.Color, 1, 1, 1, 1));
|
||
else
|
||
throw new TypeError("unknown effect parameter type");
|
||
}
|
||
return ret
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.InstanceEffectList = class InstanceEffectList extends C3.DefendedBase {
|
||
constructor(inst, wi, data) {
|
||
super();
|
||
this._inst = inst;
|
||
this._wi = wi;
|
||
this._effectList = inst.GetObjectClass().GetEffectList();
|
||
this._activeEffectFlags = [];
|
||
this._activeEffectTypes = [];
|
||
this._preservesOpaqueness = true;
|
||
this._effectParams = [];
|
||
for (const et of this._effectList.GetAllEffectTypes())
|
||
this._activeEffectFlags.push(true);
|
||
this.UpdateActiveEffects()
|
||
}
|
||
Release() {
|
||
C3.clearArray(this._activeEffectFlags);
|
||
C3.clearArray(this._activeEffectTypes);
|
||
C3.clearArray(this._effectParams);
|
||
this._inst = null;
|
||
this._effectList = null
|
||
}
|
||
_LoadEffectParameters(data) {
|
||
for (const e of data)
|
||
this._effectParams.push(this._LoadSingleEffectParameters(e))
|
||
}
|
||
_LoadSingleEffectParameters(arr) {
|
||
const ret = arr.slice(0);
|
||
for (let i = 0, len = ret.length; i < len; ++i) {
|
||
const p = ret[i];
|
||
if (Array.isArray(p)) {
|
||
const c = C3.New(C3.Color);
|
||
c.setFromJSON(p);
|
||
ret[i] = c
|
||
}
|
||
}
|
||
return ret
|
||
}
|
||
LoadDefaultEffectParameters() {
|
||
for (const effectType of this._effectList.GetAllEffectTypes())
|
||
this._effectParams.push(effectType.GetDefaultParameterValues())
|
||
}
|
||
GetOwner() {
|
||
return this._owner
|
||
}
|
||
GetEffectList() {
|
||
return this._effectList
|
||
}
|
||
GetRuntime() {
|
||
return this._inst.GetRuntime()
|
||
}
|
||
UpdateActiveEffects() {
|
||
C3.clearArray(this._activeEffectTypes);
|
||
const allEffectTypes = this._effectList.GetAllEffectTypes();
|
||
const activeEffectTypes = this._activeEffectTypes;
|
||
const activeEffectFlags = this._activeEffectFlags;
|
||
let preservesOpaqueness = true;
|
||
for (let i = 0, len = allEffectTypes.length; i < len; ++i)
|
||
if (activeEffectFlags[i]) {
|
||
const et = allEffectTypes[i];
|
||
activeEffectTypes.push(et);
|
||
if (!et.GetShaderProgram().PreservesOpaqueness())
|
||
preservesOpaqueness = false
|
||
}
|
||
this._preservesOpaqueness = preservesOpaqueness;
|
||
this._wi._SetHasAnyActiveEffect(!!activeEffectTypes.length)
|
||
}
|
||
GetActiveEffectTypes() {
|
||
return this._activeEffectTypes
|
||
}
|
||
GetEffectParametersForIndex(index) {
|
||
return this._effectParams[index]
|
||
}
|
||
PreservesOpaqueness() {
|
||
return this._preservesOpaqueness
|
||
}
|
||
HasAnyActiveBackgroundBlendingEffect() {
|
||
return this._activeEffectTypes.some(et=>et.GetShaderProgram().UsesDest())
|
||
}
|
||
IsEffectIndexActive(i) {
|
||
return this._activeEffectFlags[i]
|
||
}
|
||
SetEffectIndexActive(i, e) {
|
||
this._activeEffectFlags[i] = !!e
|
||
}
|
||
GetAllEffectTypes() {
|
||
return this._effectList.GetAllEffectTypes()
|
||
}
|
||
_SaveToJson() {
|
||
return this._effectList.GetAllEffectTypes().map(et=>({
|
||
"name": et.GetName(),
|
||
"active": this._activeEffectFlags[et.GetIndex()],
|
||
"params": C3.EffectList.SaveFxParamsToJson(this._effectParams[et.GetIndex()])
|
||
}))
|
||
}
|
||
_LoadFromJson(arr) {
|
||
for (const o of arr) {
|
||
const et = this._effectList.GetEffectTypeByName(o["name"]);
|
||
if (!et)
|
||
continue;
|
||
this._activeEffectFlags[et.GetIndex()] = o["active"];
|
||
this._effectParams[et.GetIndex()] = C3.EffectList.LoadFxParamsFromJson(o["params"])
|
||
}
|
||
this.UpdateActiveEffects()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const tempCandidates = [];
|
||
const tileCollRectCandidates = [];
|
||
const tempJumpthruRet = [];
|
||
const tempPolyA = C3.New(C3.CollisionPoly);
|
||
const tempPolyB = C3.New(C3.CollisionPoly);
|
||
const tempQuad = C3.New(C3.Quad);
|
||
const tempRect = C3.New(C3.Rect);
|
||
const tempRect2 = C3.New(C3.Rect);
|
||
C3.CollisionEngine = class CollisionEngine extends C3.DefendedBase {
|
||
constructor(runtime) {
|
||
super();
|
||
this._runtime = runtime;
|
||
this._registeredCollisions = [];
|
||
this._collisionCheckCount = 0;
|
||
this._collisionCheckSec = 0;
|
||
this._polyCheckCount = 0;
|
||
this._polyCheckSec = 0
|
||
}
|
||
Release() {
|
||
this._runtime = null
|
||
}
|
||
_Update1sStats() {
|
||
this._collisionCheckSec = this._collisionCheckCount;
|
||
this._collisionCheckCount = 0;
|
||
this._polyCheckSec = this._polyCheckCount;
|
||
this._polyCheckCount = 0
|
||
}
|
||
Get1secCollisionChecks() {
|
||
return this._collisionCheckSec
|
||
}
|
||
Get1secPolyChecks() {
|
||
return this._polyCheckSec
|
||
}
|
||
RegisterCollision(a, b) {
|
||
const aw = a.GetWorldInfo();
|
||
const bw = b.GetWorldInfo();
|
||
if (!aw || !bw)
|
||
return;
|
||
if (!aw.IsCollisionEnabled() || !bw.IsCollisionEnabled())
|
||
return;
|
||
this._registeredCollisions.push([a, b])
|
||
}
|
||
AddRegisteredCollisionCandidates(inst, otherType, arr) {
|
||
for (const [a,b] of this._registeredCollisions) {
|
||
let otherInst = null;
|
||
if (inst === a)
|
||
otherInst = b;
|
||
else if (inst === b)
|
||
otherInst = a;
|
||
else
|
||
continue;
|
||
if (!otherInst.BelongsToObjectClass(otherType))
|
||
continue;
|
||
if (!arr.includes(otherInst))
|
||
arr.push(otherInst)
|
||
}
|
||
}
|
||
CheckRegisteredCollision(a, b) {
|
||
if (!this._registeredCollisions.length)
|
||
return false;
|
||
for (const [c,d] of this._registeredCollisions)
|
||
if (a === c && b === d || a === d && b === c)
|
||
return true;
|
||
return false
|
||
}
|
||
ClearRegisteredCollisions() {
|
||
C3.clearArray(this._registeredCollisions)
|
||
}
|
||
TestOverlap(a, b) {
|
||
if (!a || !b || a === b)
|
||
return false;
|
||
const aw = a.GetWorldInfo();
|
||
const bw = b.GetWorldInfo();
|
||
if (!aw.IsCollisionEnabled() || !bw.IsCollisionEnabled())
|
||
return false;
|
||
this._collisionCheckCount++;
|
||
const layerA = aw.GetLayer();
|
||
const layerB = bw.GetLayer();
|
||
const areLayerTransformsCompatible = layerA.IsTransformCompatibleWith(layerB);
|
||
if (areLayerTransformsCompatible)
|
||
return this._TestOverlap_SameLayers(aw, bw);
|
||
else
|
||
return this._TestOverlap_DifferentLayers(aw, bw)
|
||
}
|
||
_TestOverlap_SameLayers(aw, bw) {
|
||
if (!aw.GetBoundingBox().intersectsRect(bw.GetBoundingBox()))
|
||
return false;
|
||
this._polyCheckCount++;
|
||
if (!aw.GetBoundingQuad().intersectsQuad(bw.GetBoundingQuad()))
|
||
return false;
|
||
if (aw.HasTilemap() && bw.HasTilemap())
|
||
return false;
|
||
if (aw.HasTilemap())
|
||
return this.TestTilemapOverlap(aw, bw);
|
||
else if (bw.HasTilemap())
|
||
return this.TestTilemapOverlap(bw, aw);
|
||
if (!aw.HasOwnCollisionPoly() && !bw.HasOwnCollisionPoly())
|
||
return true;
|
||
const polyA = aw.GetTransformedCollisionPoly();
|
||
const polyB = bw.GetTransformedCollisionPoly();
|
||
return polyA.intersectsPoly(polyB, bw.GetX() - aw.GetX(), bw.GetY() - aw.GetY())
|
||
}
|
||
_TestOverlap_DifferentLayers(aw, bw) {
|
||
const layerA = aw.GetLayer();
|
||
const layerB = bw.GetLayer();
|
||
tempPolyA.copy(aw.GetTransformedCollisionPoly());
|
||
tempPolyB.copy(bw.GetTransformedCollisionPoly());
|
||
const ptsArrA = tempPolyA.pointsArr();
|
||
for (let i = 0, len = ptsArrA.length; i < len; i += 2) {
|
||
const j = i + 1;
|
||
const x = ptsArrA[i];
|
||
const y = ptsArrA[j];
|
||
const [lx,ly] = layerA.LayerToCanvasCss(x + aw.GetX(), y + aw.GetY());
|
||
ptsArrA[i] = lx;
|
||
ptsArrA[j] = ly
|
||
}
|
||
const ptsArrB = tempPolyB.pointsArr();
|
||
for (let i = 0, len = ptsArrB.length; i < len; i += 2) {
|
||
const j = i + 1;
|
||
const x = ptsArrB[i];
|
||
const y = ptsArrB[j];
|
||
const [lx,ly] = layerB.LayerToCanvasCss(x + bw.GetX(), y + bw.GetY());
|
||
ptsArrB[i] = lx;
|
||
ptsArrB[j] = ly
|
||
}
|
||
tempPolyA.setBboxChanged();
|
||
tempPolyB.setBboxChanged();
|
||
this._polyCheckCount++;
|
||
return tempPolyA.intersectsPoly(tempPolyB, 0, 0)
|
||
}
|
||
TestTilemapOverlap(tmWi, wi) {
|
||
const bbox = wi.GetBoundingBox();
|
||
const tmX = tmWi.GetX();
|
||
const tmY = tmWi.GetY();
|
||
const tmSdkInst = tmWi.GetInstance().GetSdkInstance();
|
||
const instX = wi.GetX();
|
||
const instY = wi.GetY();
|
||
const instHasPoly = wi.HasOwnCollisionPoly();
|
||
const instQuad = wi.GetBoundingQuad();
|
||
const collRects = tileCollRectCandidates;
|
||
tmSdkInst.GetCollisionRectCandidates(bbox, collRects);
|
||
for (let i = 0, len = collRects.length; i < len; ++i) {
|
||
const c = collRects[i];
|
||
const rc = c.GetRect();
|
||
this._collisionCheckCount++;
|
||
if (bbox.intersectsRectOffset(rc, tmX, tmY)) {
|
||
tempQuad.setFromRect(rc);
|
||
tempQuad.offset(tmX, tmY);
|
||
if (tempQuad.intersectsQuad(instQuad))
|
||
if (instHasPoly) {
|
||
const instPoly = wi.GetTransformedCollisionPoly();
|
||
const tilePoly = c.GetPoly();
|
||
if (tilePoly) {
|
||
this._polyCheckCount++;
|
||
if (tilePoly.intersectsPoly(instPoly, instX - (tmX + rc.getLeft()), instY - (tmY + rc.getTop()))) {
|
||
C3.clearArray(collRects);
|
||
return true
|
||
}
|
||
} else {
|
||
tempPolyA.setFromQuad(tempQuad, 0, 0);
|
||
if (tempPolyA.intersectsPoly(instPoly, instX, instY)) {
|
||
C3.clearArray(collRects);
|
||
return true
|
||
}
|
||
}
|
||
} else {
|
||
const tilePoly = c.GetPoly();
|
||
if (tilePoly) {
|
||
tempPolyA.setFromQuad(instQuad, 0, 0);
|
||
if (tilePoly.intersectsPoly(tempPolyA, -(tmX + rc.getLeft()), -(tmY + rc.getTop()))) {
|
||
C3.clearArray(collRects);
|
||
return true
|
||
}
|
||
} else {
|
||
C3.clearArray(collRects);
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
}
|
||
C3.clearArray(collRects);
|
||
return false
|
||
}
|
||
TestAndSelectCanvasPointOverlap(objectClass, ptx, pty, isInverted) {
|
||
const sol = objectClass.GetCurrentSol();
|
||
const currentEvent = this._runtime.GetCurrentEvent();
|
||
if (!currentEvent)
|
||
throw new Error("cannot call outside event");
|
||
const isOrBlock = currentEvent.IsOrBlock();
|
||
if (sol.IsSelectAll()) {
|
||
if (!isInverted) {
|
||
sol._SetSelectAll(false);
|
||
C3.clearArray(sol._GetOwnInstances())
|
||
}
|
||
for (const inst of objectClass.GetInstances()) {
|
||
const wi = inst.GetWorldInfo();
|
||
const layer = wi.GetLayer();
|
||
const [lx,ly] = layer.CanvasCssToLayer(ptx, pty, wi.GetTotalZElevation());
|
||
if (wi.ContainsPoint(lx, ly))
|
||
if (isInverted)
|
||
return false;
|
||
else
|
||
sol._PushInstance(inst);
|
||
else if (isOrBlock)
|
||
sol._PushElseInstance(inst)
|
||
}
|
||
} else {
|
||
const arr = isOrBlock ? sol._GetOwnElseInstances() : sol._GetOwnInstances();
|
||
let j = 0;
|
||
for (let i = 0, len = arr.length; i < len; ++i) {
|
||
const inst = arr[i];
|
||
const wi = inst.GetWorldInfo();
|
||
const layer = wi.GetLayer();
|
||
const [lx,ly] = layer.CanvasCssToLayer(ptx, pty, wi.GetTotalZElevation());
|
||
if (wi.ContainsPoint(lx, ly))
|
||
if (isInverted)
|
||
return false;
|
||
else if (isOrBlock)
|
||
sol._PushInstance(inst);
|
||
else
|
||
arr[j++] = inst;
|
||
else if (isOrBlock)
|
||
arr[j++] = inst
|
||
}
|
||
if (!isInverted)
|
||
arr.length = j
|
||
}
|
||
objectClass.ApplySolToContainer();
|
||
if (isInverted)
|
||
return true;
|
||
else
|
||
return sol.HasAnyInstances()
|
||
}
|
||
GetCollisionCandidates(layer, rtype, bbox, candidates) {
|
||
const isParallaxed = layer ? layer.GetParallaxX() !== 1 || layer.GetParallaxY() !== 1 : false;
|
||
if (rtype.IsFamily())
|
||
for (const memberType of rtype.GetFamilyMembers())
|
||
if (isParallaxed || memberType.IsAnyInstanceParallaxed())
|
||
C3.appendArray(candidates, memberType.GetInstances());
|
||
else {
|
||
memberType._UpdateAllCollisionCells();
|
||
memberType._GetCollisionCellGrid().QueryRange(bbox, candidates)
|
||
}
|
||
else if (isParallaxed || rtype.IsAnyInstanceParallaxed())
|
||
C3.appendArray(candidates, rtype.GetInstances());
|
||
else {
|
||
rtype._UpdateAllCollisionCells();
|
||
rtype._GetCollisionCellGrid().QueryRange(bbox, candidates)
|
||
}
|
||
}
|
||
GetObjectClassesCollisionCandidates(layer, objectClasses, bbox, candidates) {
|
||
for (const objectClass of objectClasses)
|
||
this.GetCollisionCandidates(layer, objectClass, bbox, candidates)
|
||
}
|
||
GetSolidCollisionCandidates(layer, bbox, candidates) {
|
||
const solidBehavior = this._runtime.GetSolidBehavior();
|
||
if (!solidBehavior)
|
||
return;
|
||
this.GetObjectClassesCollisionCandidates(layer, solidBehavior.GetObjectClasses(), bbox, candidates)
|
||
}
|
||
GetJumpthruCollisionCandidates(layer, bbox, candidates) {
|
||
const jumpthruBehavior = this._runtime.GetJumpthruBehavior();
|
||
if (!jumpthruBehavior)
|
||
return;
|
||
this.GetObjectClassesCollisionCandidates(layer, jumpthruBehavior.GetObjectClasses(), bbox, candidates)
|
||
}
|
||
IsSolidCollisionAllowed(solidInst, inst) {
|
||
return solidInst._IsSolidEnabled() && (!inst || inst.GetWorldInfo().IsSolidCollisionAllowed(solidInst.GetSavedDataMap().get("solidTags")))
|
||
}
|
||
TestOverlapSolid(inst) {
|
||
const wi = inst.GetWorldInfo();
|
||
this.GetSolidCollisionCandidates(wi.GetLayer(), wi.GetBoundingBox(), tempCandidates);
|
||
for (const s of tempCandidates) {
|
||
if (!this.IsSolidCollisionAllowed(s, inst))
|
||
continue;
|
||
if (this.TestOverlap(inst, s)) {
|
||
C3.clearArray(tempCandidates);
|
||
return s
|
||
}
|
||
}
|
||
C3.clearArray(tempCandidates);
|
||
return null
|
||
}
|
||
TestRectOverlapSolid(rect, inst) {
|
||
this.GetSolidCollisionCandidates(null, rect, tempCandidates);
|
||
for (const s of tempCandidates) {
|
||
if (!this.IsSolidCollisionAllowed(s, inst))
|
||
continue;
|
||
if (this.TestRectOverlap(rect, s)) {
|
||
C3.clearArray(tempCandidates);
|
||
return s
|
||
}
|
||
}
|
||
C3.clearArray(tempCandidates);
|
||
return null
|
||
}
|
||
TestOverlapJumpthru(inst, all) {
|
||
let ret = null;
|
||
if (all) {
|
||
ret = tempJumpthruRet;
|
||
C3.clearArray(ret)
|
||
}
|
||
const wi = inst.GetWorldInfo();
|
||
this.GetJumpthruCollisionCandidates(wi.GetLayer(), wi.GetBoundingBox(), tempCandidates);
|
||
for (const j of tempCandidates) {
|
||
if (!j._IsJumpthruEnabled())
|
||
continue;
|
||
if (this.TestOverlap(inst, j))
|
||
if (all)
|
||
ret.push(j);
|
||
else {
|
||
C3.clearArray(tempCandidates);
|
||
return j
|
||
}
|
||
}
|
||
C3.clearArray(tempCandidates);
|
||
return ret
|
||
}
|
||
PushOut(inst, xdir, ydir, dist, otherInst) {
|
||
dist = dist || 50;
|
||
const wi = inst.GetWorldInfo();
|
||
const oldX = wi.GetX();
|
||
const oldY = wi.GetY();
|
||
for (let i = 0; i < dist; ++i) {
|
||
wi.SetXY(oldX + xdir * i, oldY + ydir * i);
|
||
wi.SetBboxChanged();
|
||
if (!this.TestOverlap(inst, otherInst))
|
||
return true
|
||
}
|
||
wi.SetXY(oldX, oldY);
|
||
wi.SetBboxChanged();
|
||
return false
|
||
}
|
||
PushOutSolid(inst, xdir, ydir, dist, includeJumpthrus, specificJumpthru) {
|
||
dist = dist || 50;
|
||
const wi = inst.GetWorldInfo();
|
||
const oldX = wi.GetX();
|
||
const oldY = wi.GetY();
|
||
let lastOverlapped = null;
|
||
let secondLastOverlapped = null;
|
||
for (let i = 0; i < dist; ++i) {
|
||
wi.SetXY(oldX + xdir * i, oldY + ydir * i);
|
||
wi.SetBboxChanged();
|
||
if (!this.TestOverlap(inst, lastOverlapped)) {
|
||
lastOverlapped = this.TestOverlapSolid(inst);
|
||
if (lastOverlapped)
|
||
secondLastOverlapped = lastOverlapped;
|
||
else {
|
||
if (includeJumpthrus) {
|
||
if (specificJumpthru)
|
||
lastOverlapped = this.TestOverlap(inst, specificJumpthru) ? specificJumpthru : null;
|
||
else
|
||
lastOverlapped = this.TestOverlapJumpthru(inst);
|
||
if (lastOverlapped)
|
||
secondLastOverlapped = lastOverlapped
|
||
}
|
||
if (!lastOverlapped) {
|
||
if (secondLastOverlapped)
|
||
this.PushInFractional(inst, xdir, ydir, secondLastOverlapped, 16, true);
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
}
|
||
wi.SetXY(oldX, oldY);
|
||
wi.SetBboxChanged();
|
||
return false
|
||
}
|
||
PushOutSolidAxis(inst, xdir, ydir, dist) {
|
||
dist = dist || 50;
|
||
const wi = inst.GetWorldInfo();
|
||
const oldX = wi.GetX();
|
||
const oldY = wi.GetY();
|
||
let lastOverlapped = null;
|
||
let secondLastOverlapped = null;
|
||
for (let i = 0; i < dist; ++i)
|
||
for (let which = 0; which < 2; ++which) {
|
||
const sign = which * 2 - 1;
|
||
wi.SetXY(oldX + xdir * i * sign, oldY + ydir * i * sign);
|
||
wi.SetBboxChanged();
|
||
if (!this.TestOverlap(inst, lastOverlapped)) {
|
||
lastOverlapped = this.TestOverlapSolid(inst);
|
||
if (lastOverlapped)
|
||
secondLastOverlapped = lastOverlapped;
|
||
else {
|
||
if (secondLastOverlapped)
|
||
this.PushInFractional(inst, xdir * sign, ydir * sign, secondLastOverlapped, 16, true);
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
wi.SetXY(oldX, oldY);
|
||
wi.SetBboxChanged();
|
||
return false
|
||
}
|
||
PushInFractional(inst, xdir, ydir, otherInst, limit, includeAnySolid) {
|
||
let divisor = 2;
|
||
let forward = false;
|
||
let overlapping = false;
|
||
const wi = inst.GetWorldInfo();
|
||
let bestX = wi.GetX();
|
||
let bestY = wi.GetY();
|
||
while (divisor <= limit) {
|
||
const frac = 1 / divisor;
|
||
divisor *= 2;
|
||
wi.OffsetXY(xdir * frac * (forward ? 1 : -1), ydir * frac * (forward ? 1 : -1));
|
||
wi.SetBboxChanged();
|
||
if (this.TestOverlap(inst, otherInst) || includeAnySolid && this.TestOverlapSolid(inst)) {
|
||
forward = true;
|
||
overlapping = true
|
||
} else {
|
||
forward = false;
|
||
overlapping = false;
|
||
bestX = wi.GetX();
|
||
bestY = wi.GetY()
|
||
}
|
||
}
|
||
if (overlapping) {
|
||
wi.SetXY(bestX, bestY);
|
||
wi.SetBboxChanged()
|
||
}
|
||
}
|
||
PushOutSolidNearest(inst, maxDist=100) {
|
||
let dist = 0;
|
||
const wi = inst.GetWorldInfo();
|
||
const oldX = wi.GetX();
|
||
const oldY = wi.GetY();
|
||
let dir = 0;
|
||
let lastOverlapped = this.TestOverlapSolid(inst);
|
||
if (!lastOverlapped)
|
||
return true;
|
||
while (dist <= maxDist) {
|
||
let dx = 0;
|
||
let dy = 0;
|
||
switch (dir) {
|
||
case 0:
|
||
dx = 0;
|
||
dy = -1;
|
||
dist++;
|
||
break;
|
||
case 1:
|
||
dx = 1;
|
||
dy = -1;
|
||
break;
|
||
case 2:
|
||
dx = 1;
|
||
dy = 0;
|
||
break;
|
||
case 3:
|
||
dx = 1;
|
||
dy = 1;
|
||
break;
|
||
case 4:
|
||
dx = 0;
|
||
dy = 1;
|
||
break;
|
||
case 5:
|
||
dx = -1;
|
||
dy = 1;
|
||
break;
|
||
case 6:
|
||
dx = -1;
|
||
dy = 0;
|
||
break;
|
||
case 7:
|
||
dx = -1;
|
||
dy = -1;
|
||
break
|
||
}
|
||
dir = (dir + 1) % 8;
|
||
wi.SetXY(Math.floor(oldX + dx * dist), Math.floor(oldY + dy * dist));
|
||
wi.SetBboxChanged();
|
||
if (!this.TestOverlap(inst, lastOverlapped)) {
|
||
lastOverlapped = this.TestOverlapSolid(inst);
|
||
if (!lastOverlapped)
|
||
return true
|
||
}
|
||
}
|
||
wi.SetXY(oldX, oldY);
|
||
wi.SetBboxChanged();
|
||
return false
|
||
}
|
||
CalculateBounceAngle(inst, startX, startY, otherInst) {
|
||
const wi = inst.GetWorldInfo();
|
||
const oldX = wi.GetX();
|
||
const oldY = wi.GetY();
|
||
const radius = Math.max(10, C3.distanceTo(startX, startY, oldX, oldY));
|
||
const startAngle = C3.angleTo(startX, startY, oldX, oldY);
|
||
const firstInst = otherInst || this.TestOverlapSolid(inst);
|
||
if (!firstInst)
|
||
return C3.clampAngle(startAngle + Math.PI);
|
||
let curInst = firstInst;
|
||
let anticlockwiseFreeAngle = 0;
|
||
let clockwiseFreeAngle = 0;
|
||
const increment = C3.toRadians(5);
|
||
let i;
|
||
for (i = 1; i < 36; ++i) {
|
||
const curAngle = startAngle - i * increment;
|
||
wi.SetXY(startX + Math.cos(curAngle) * radius, startY + Math.sin(curAngle) * radius);
|
||
wi.SetBboxChanged();
|
||
if (!this.TestOverlap(inst, curInst)) {
|
||
curInst = otherInst ? null : this.TestOverlapSolid(inst);
|
||
if (!curInst) {
|
||
anticlockwiseFreeAngle = curAngle;
|
||
break
|
||
}
|
||
}
|
||
}
|
||
if (i === 36)
|
||
anticlockwiseFreeAngle = C3.clampAngle(startAngle + Math.PI);
|
||
curInst = firstInst;
|
||
for (i = 1; i < 36; ++i) {
|
||
const curAngle = startAngle + i * increment;
|
||
wi.SetXY(startX + Math.cos(curAngle) * radius, startY + Math.sin(curAngle) * radius);
|
||
wi.SetBboxChanged();
|
||
if (!this.TestOverlap(inst, curInst)) {
|
||
curInst = otherInst ? null : this.TestOverlapSolid(inst);
|
||
if (!curInst) {
|
||
clockwiseFreeAngle = curAngle;
|
||
break
|
||
}
|
||
}
|
||
}
|
||
if (i === 36)
|
||
clockwiseFreeAngle = C3.clampAngle(startAngle + Math.PI);
|
||
wi.SetXY(oldX, oldY);
|
||
wi.SetBboxChanged();
|
||
if (clockwiseFreeAngle === anticlockwiseFreeAngle)
|
||
return clockwiseFreeAngle;
|
||
const halfDiff = C3.angleDiff(clockwiseFreeAngle, anticlockwiseFreeAngle) / 2;
|
||
let normal;
|
||
if (C3.angleClockwise(clockwiseFreeAngle, anticlockwiseFreeAngle))
|
||
normal = C3.clampAngle(anticlockwiseFreeAngle + halfDiff + Math.PI);
|
||
else
|
||
normal = C3.clampAngle(clockwiseFreeAngle + halfDiff);
|
||
const vx = Math.cos(startAngle);
|
||
const vy = Math.sin(startAngle);
|
||
const nx = Math.cos(normal);
|
||
const ny = Math.sin(normal);
|
||
const v_dot_n = vx * nx + vy * ny;
|
||
const rx = vx - 2 * v_dot_n * nx;
|
||
const ry = vy - 2 * v_dot_n * ny;
|
||
return C3.angleTo(0, 0, rx, ry)
|
||
}
|
||
TestSegmentOverlap(x1, y1, x2, y2, inst) {
|
||
if (!inst)
|
||
return false;
|
||
const wi = inst.GetWorldInfo();
|
||
if (!wi.IsCollisionEnabled())
|
||
return false;
|
||
this._collisionCheckCount++;
|
||
tempRect.set(Math.min(x1, x2), Math.min(y1, y2), Math.max(x1, x2), Math.max(y1, y2));
|
||
if (!wi.GetBoundingBox().intersectsRect(tempRect))
|
||
return false;
|
||
if (inst.HasTilemap())
|
||
return this._TestSegmentOverlapTilemap(x1, y1, x2, y2, inst, wi);
|
||
this._polyCheckCount++;
|
||
if (!wi.GetBoundingQuad().intersectsSegment(x1, y1, x2, y2))
|
||
return false;
|
||
if (!wi.HasOwnCollisionPoly())
|
||
return true;
|
||
const poly = wi.GetTransformedCollisionPoly();
|
||
return poly.intersectsSegment(wi.GetX(), wi.GetY(), x1, y1, x2, y2)
|
||
}
|
||
_TestSegmentOverlapTilemap(x1, y1, x2, y2, inst, wi) {
|
||
const tmX = wi.GetX();
|
||
const tmY = wi.GetY();
|
||
const sdkInst = inst.GetSdkInstance();
|
||
const collRects = tileCollRectCandidates;
|
||
tempRect2.set(x1, y1, x2, y2);
|
||
tempRect2.normalize();
|
||
sdkInst.GetCollisionRectCandidates(tempRect2, collRects);
|
||
for (let i = 0, len = collRects.length; i < len; ++i) {
|
||
const c = collRects[i];
|
||
const tileRc = c.GetRect();
|
||
this._collisionCheckCount++;
|
||
if (tempRect.intersectsRectOffset(tileRc, tmX, tmY)) {
|
||
tempQuad.setFromRect(tileRc);
|
||
tempQuad.offset(tmX, tmY);
|
||
if (tempQuad.intersectsSegment(x1, y1, x2, y2)) {
|
||
const tilePoly = c.GetPoly();
|
||
if (tilePoly) {
|
||
this._polyCheckCount++;
|
||
if (tilePoly.intersectsSegment(tmX + tileRc.getLeft(), tmY + tileRc.getTop(), x1, y1, x2, y2)) {
|
||
C3.clearArray(collRects);
|
||
return true
|
||
}
|
||
} else {
|
||
C3.clearArray(collRects);
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
}
|
||
C3.clearArray(collRects);
|
||
return false
|
||
}
|
||
TestRectOverlap(rect, inst) {
|
||
if (!inst)
|
||
return false;
|
||
const wi = inst.GetWorldInfo();
|
||
if (!wi.IsCollisionEnabled())
|
||
return false;
|
||
this._collisionCheckCount++;
|
||
if (!wi.GetBoundingBox().intersectsRect(rect))
|
||
return false;
|
||
if (inst.HasTilemap())
|
||
return this._TestRectOverlapTilemap(rect, inst, wi);
|
||
this._polyCheckCount++;
|
||
tempQuad.setFromRect(rect);
|
||
if (!wi.GetBoundingQuad().intersectsQuad(tempQuad))
|
||
return false;
|
||
if (!wi.HasOwnCollisionPoly())
|
||
return true;
|
||
const polyA = tempPolyA;
|
||
polyA.setFromRect(rect, wi.GetX(), wi.GetY());
|
||
const polyB = wi.GetTransformedCollisionPoly();
|
||
return polyA.intersectsPoly(polyB, 0, 0)
|
||
}
|
||
_TestRectOverlapTilemap(rect, inst, wi) {
|
||
const tmX = wi.GetX();
|
||
const tmY = wi.GetY();
|
||
const sdkInst = inst.GetSdkInstance();
|
||
const collRects = tileCollRectCandidates;
|
||
sdkInst.GetCollisionRectCandidates(rect, collRects);
|
||
for (let i = 0, len = collRects.length; i < len; ++i) {
|
||
const c = collRects[i];
|
||
const tileRc = c.GetRect();
|
||
this._collisionCheckCount++;
|
||
if (rect.intersectsRectOffset(tileRc, tmX, tmY)) {
|
||
const tilePoly = c.GetPoly();
|
||
if (tilePoly) {
|
||
this._polyCheckCount++;
|
||
tempPolyA.setFromRect(rect, 0, 0);
|
||
if (tilePoly.intersectsPoly(tempPolyA, -(tmX + tileRc.getLeft()), -(tmY + tileRc.getTop()))) {
|
||
C3.clearArray(collRects);
|
||
return true
|
||
}
|
||
} else {
|
||
C3.clearArray(collRects);
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
C3.clearArray(collRects);
|
||
return false
|
||
}
|
||
TestRayIntersectsInstance(inst, ray) {
|
||
if (!inst)
|
||
return;
|
||
const wi = inst.GetWorldInfo();
|
||
if (!wi.IsCollisionEnabled())
|
||
return;
|
||
this._collisionCheckCount++;
|
||
if (!wi.GetBoundingBox().intersectsRect(ray.rect))
|
||
return;
|
||
if (inst.HasTilemap()) {
|
||
this._TestRayIntersectsTilemap(inst, wi, ray);
|
||
return
|
||
}
|
||
this._polyCheckCount++;
|
||
if (wi.HasOwnCollisionPoly())
|
||
ray.TestInstancePoly(inst, wi.GetX(), wi.GetY(), wi.GetTransformedCollisionPoly());
|
||
else
|
||
ray.TestInstanceQuad(inst, wi.GetBoundingQuad())
|
||
}
|
||
_TestRayIntersectsTilemap(inst, wi, ray) {
|
||
const xOffset = wi.GetX();
|
||
const yOffset = wi.GetY();
|
||
const collRects = tileCollRectCandidates;
|
||
inst.GetSdkInstance().GetCollisionRectCandidates(ray.rect, collRects);
|
||
for (let i = 0, l = collRects.length; i < l; i++) {
|
||
const c = collRects[i];
|
||
const tileRc = c.GetRect();
|
||
this._collisionCheckCount++;
|
||
if (ray.rect.intersectsRectOffset(tileRc, xOffset, yOffset)) {
|
||
const tilePoly = c.GetPoly();
|
||
this._polyCheckCount++;
|
||
if (tilePoly)
|
||
ray.TestInstancePoly(inst, xOffset + tileRc.getLeft(), yOffset + tileRc.getTop(), tilePoly);
|
||
else
|
||
ray.TestInstanceRect(inst, wi.GetX(), wi.GetY(), tileRc)
|
||
}
|
||
}
|
||
C3.clearArray(collRects)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.SparseGrid = class SparseGrid extends C3.DefendedBase {
|
||
constructor(cellWidth, cellHeight) {
|
||
super();
|
||
this._cellWidth = cellWidth;
|
||
this._cellHeight = cellHeight;
|
||
this._cells = C3.New(C3.PairMap)
|
||
}
|
||
Release() {
|
||
this._cells.Release();
|
||
this._cells = null
|
||
}
|
||
GetCell(x, y, createIfMissing) {
|
||
let ret = this._cells.Get(x, y);
|
||
if (ret)
|
||
return ret;
|
||
else if (createIfMissing) {
|
||
ret = C3.New(C3.GridCell, this, x, y);
|
||
this._cells.Set(x, y, ret);
|
||
return ret
|
||
} else
|
||
return null
|
||
}
|
||
XToCell(x) {
|
||
const ret = Math.floor(x / this._cellWidth);
|
||
return isFinite(ret) ? ret : 0
|
||
}
|
||
YToCell(y) {
|
||
const ret = Math.floor(y / this._cellHeight);
|
||
return isFinite(ret) ? ret : 0
|
||
}
|
||
Update(inst, oldRange, newRange) {
|
||
if (oldRange)
|
||
for (let x = oldRange.getLeft(), lenx = oldRange.getRight(); x <= lenx; ++x)
|
||
for (let y = oldRange.getTop(), leny = oldRange.getBottom(); y <= leny; ++y) {
|
||
if (newRange && newRange.containsPoint(x, y))
|
||
continue;
|
||
const cell = this.GetCell(x, y, false);
|
||
if (!cell)
|
||
continue;
|
||
cell.Remove(inst);
|
||
if (cell.IsEmpty())
|
||
this._cells.Delete(x, y)
|
||
}
|
||
if (newRange)
|
||
for (let x = newRange.getLeft(), lenx = newRange.getRight(); x <= lenx; ++x)
|
||
for (let y = newRange.getTop(), leny = newRange.getBottom(); y <= leny; ++y) {
|
||
if (oldRange && oldRange.containsPoint(x, y))
|
||
continue;
|
||
this.GetCell(x, y, true).Insert(inst)
|
||
}
|
||
}
|
||
QueryRange(rc, result) {
|
||
let x = this.XToCell(rc.getLeft());
|
||
const ystart = this.YToCell(rc.getTop());
|
||
const lenx = this.XToCell(rc.getRight());
|
||
const leny = this.YToCell(rc.getBottom());
|
||
if (!isFinite(lenx) || !isFinite(leny))
|
||
return;
|
||
for (; x <= lenx; ++x)
|
||
for (let y = ystart; y <= leny; ++y) {
|
||
const cell = this.GetCell(x, y, false);
|
||
if (!cell)
|
||
continue;
|
||
cell.Dump(result)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.GridCell = class GridCell extends C3.DefendedBase {
|
||
constructor(grid, x, y) {
|
||
super();
|
||
this._grid = grid;
|
||
this._x = x;
|
||
this._y = y;
|
||
this._instances = C3.New(C3.ArraySet)
|
||
}
|
||
Release() {
|
||
this._instances.Release();
|
||
this._instances = null;
|
||
this._grid = null
|
||
}
|
||
IsEmpty() {
|
||
return this._instances.IsEmpty()
|
||
}
|
||
Insert(inst) {
|
||
this._instances.Add(inst)
|
||
}
|
||
Remove(inst) {
|
||
this._instances.Delete(inst)
|
||
}
|
||
Dump(result) {
|
||
C3.appendArray(result, this._instances.GetArray())
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const PADDING = 1E-6;
|
||
const NO_HIT = 2;
|
||
C3.Ray = class Ray {
|
||
constructor() {
|
||
this.x1 = 0;
|
||
this.y1 = 0;
|
||
this.x2 = 0;
|
||
this.y2 = 0;
|
||
this.dx = 0;
|
||
this.dy = 0;
|
||
this.rect = new C3.Rect;
|
||
this.hitFraction = NO_HIT;
|
||
this.hitUid = null;
|
||
this.hitNormal = 0;
|
||
this.hitNormalDx = 0;
|
||
this.hitNormalDy = 0;
|
||
this.hitX = 0;
|
||
this.hitY = 0;
|
||
this.distance = 0;
|
||
this.normalX = 1;
|
||
this.normalY = 0;
|
||
this.reflectionX = 1;
|
||
this.reflectionY = 0
|
||
}
|
||
DidCollide() {
|
||
return this.hitFraction < 1 + PADDING
|
||
}
|
||
Set(x1, y1, x2, y2) {
|
||
this.x1 = x1;
|
||
this.y1 = y1;
|
||
this.x2 = x2;
|
||
this.y2 = y2;
|
||
this.dx = x2 - x1;
|
||
this.dy = y2 - y1;
|
||
this.rect.set(x1, y1, x2, y2);
|
||
this.rect.normalize();
|
||
this.hitFraction = NO_HIT;
|
||
this.hitUid = null;
|
||
this.hitNormal = 0;
|
||
this.hitNormalDx = 0;
|
||
this.hitNormalDy = 0;
|
||
this.hitX = 0;
|
||
this.hitY = 0;
|
||
this.distance = 0;
|
||
this.normalX = 1;
|
||
this.normalY = 0;
|
||
this.reflectionX = 1;
|
||
this.reflectionY = 0;
|
||
return this
|
||
}
|
||
Complete() {
|
||
if (this.DidCollide() === false)
|
||
return;
|
||
const dx = this.dx * this.hitFraction;
|
||
const dy = this.dy * this.hitFraction;
|
||
const length = Math.sqrt(dx * dx + dy * dy);
|
||
const dirx = dx / length;
|
||
const diry = dy / length;
|
||
this.distance = length - PADDING;
|
||
this.hitX = this.x1 + dirx * this.distance;
|
||
this.hitY = this.y1 + diry * this.distance;
|
||
this.hitNormal = Math.atan2(this.hitNormalDy, this.hitNormalDx) + Math.PI / 2;
|
||
this.normalX = Math.cos(this.hitNormal);
|
||
this.normalY = Math.sin(this.hitNormal);
|
||
const dot = dirx * this.normalX + diry * this.normalY;
|
||
this.reflectionX = dirx - 2 * this.normalX * dot;
|
||
this.reflectionY = diry - 2 * this.normalY * dot;
|
||
if (dot > 0) {
|
||
const PI = Math.PI;
|
||
this.hitNormal = C3.clampAngle(this.hitNormal + PI);
|
||
this.normalX = -this.normalX;
|
||
this.normalY = -this.normalY
|
||
}
|
||
}
|
||
TestInstanceSegment(inst, sx1, sy1, sx2, sy2) {
|
||
const t = C3.rayIntersect(this.x1, this.y1, this.x2, this.y2, sx1, sy1, sx2, sy2);
|
||
if (t >= 0 && t < this.hitFraction) {
|
||
this.hitFraction = t;
|
||
this.hitUid = inst.GetUID();
|
||
this.hitNormalDx = sx1 - sx2;
|
||
this.hitNormalDy = sy1 - sy2
|
||
}
|
||
}
|
||
TestInstanceRect(inst, offX, offY, rect) {
|
||
const lt = offX + rect.getLeft()
|
||
, rt = offX + rect.getRight()
|
||
, tp = offY + rect.getTop()
|
||
, bm = offY + rect.getBottom();
|
||
this.TestInstanceSegment(inst, lt, tp, rt, tp);
|
||
this.TestInstanceSegment(inst, rt, tp, rt, bm);
|
||
this.TestInstanceSegment(inst, rt, bm, lt, bm);
|
||
this.TestInstanceSegment(inst, lt, bm, lt, tp)
|
||
}
|
||
TestInstanceQuad(inst, quad) {
|
||
const tlX = quad.getTlx()
|
||
, tlY = quad.getTly()
|
||
, trX = quad.getTrx()
|
||
, trY = quad.getTry()
|
||
, brX = quad.getBrx()
|
||
, brY = quad.getBry()
|
||
, blX = quad.getBlx()
|
||
, blY = quad.getBly();
|
||
this.TestInstanceSegment(inst, tlX, tlY, trX, trY);
|
||
this.TestInstanceSegment(inst, trX, trY, brX, brY);
|
||
this.TestInstanceSegment(inst, brX, brY, blX, blY);
|
||
this.TestInstanceSegment(inst, blX, blY, tlX, tlY)
|
||
}
|
||
TestInstancePoly(inst, offX, offY, poly) {
|
||
const points = poly.pointsArr();
|
||
for (let i = 0, l = points.length; i < l; i += 2) {
|
||
const ii = (i + 2) % l;
|
||
const x1 = points[i] + offX;
|
||
const y1 = points[i + 1] + offY;
|
||
const x2 = points[ii] + offX;
|
||
const y2 = points[ii + 1] + offY;
|
||
this.TestInstanceSegment(inst, x1, y1, x2, y2)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const VALID_FULLSCREEN_MODES = new Set(["off", "crop", "scale-inner", "scale-outer", "letterbox-scale", "letterbox-integer-scale"]);
|
||
const VALID_FULLSCREEN_SCALING_QUALITIES = new Set(["high", "low"]);
|
||
const PERCENTTEXT_WIDTH = 300;
|
||
const PERCENTTEXT_HEIGHT = 200;
|
||
const PROGRESSBAR_WIDTH = 120;
|
||
const PROGRESSBAR_HEIGHT = 8;
|
||
const tempQuad = C3.New(C3.Quad);
|
||
const tempRect = C3.New(C3.Rect);
|
||
const SPLASH_MIN_DISPLAY_TIME = 3E3;
|
||
const SPLASH_AFTER_FADEOUT_WAIT_TIME = 200;
|
||
const SPLASH_FADE_DURATION = 300;
|
||
C3.CanvasManager = class CanvasManager extends C3.DefendedBase {
|
||
constructor(runtime) {
|
||
super();
|
||
this._runtime = runtime;
|
||
this._canvas = null;
|
||
this._webglRenderer = null;
|
||
this._gpuPreference = "high-performance";
|
||
this._windowInnerWidth = 0;
|
||
this._windowInnerHeight = 0;
|
||
this._canvasCssWidth = 0;
|
||
this._canvasCssHeight = 0;
|
||
this._canvasDeviceWidth = 0;
|
||
this._canvasDeviceHeight = 0;
|
||
this._canvasCssOffsetX = 0;
|
||
this._canvasCssOffsetY = 0;
|
||
this._enableMipmaps = true;
|
||
this._drawWidth = 0;
|
||
this._drawHeight = 0;
|
||
this._fullscreenMode = "letterbox-scale";
|
||
this._documentFullscreenMode = "letterbox-scale";
|
||
this._deviceTransformOffX = 0;
|
||
this._deviceTransformOffY = 0;
|
||
this._wantFullscreenScalingQuality = "high";
|
||
this._fullscreenScalingQuality = this._wantFullscreenScalingQuality;
|
||
this._isDocumentFullscreen = false;
|
||
this._availableAdditionalRenderTargets = [];
|
||
this._usedAdditionalRenderTargets = new Set;
|
||
this._shaderData = null;
|
||
this._gpuFrameTimingsBuffer = null;
|
||
this._gpuTimeStartFrame = 0;
|
||
this._gpuTimeEndFrame = 0;
|
||
this._gpuCurUtilisation = NaN;
|
||
this._gpuLastUtilisation = 0;
|
||
this._layersGpuProfile = new Map;
|
||
this._snapshotFormat = "";
|
||
this._snapshotQuality = 1;
|
||
this._snapshotArea = C3.New(C3.Rect);
|
||
this._snapshotUrl = "";
|
||
this._snapshotPromise = null;
|
||
this._snapshotResolve = null;
|
||
this._loaderStartTime = 0;
|
||
this._rafId = -1;
|
||
this._loadingProgress = 0;
|
||
this._loadingprogress_handler = e=>this._loadingProgress = e.progress;
|
||
this._percentText = null;
|
||
this._loadingLogoAsset = null;
|
||
this._splashTextures = {
|
||
logo: null,
|
||
powered: null,
|
||
website: null
|
||
};
|
||
this._splashFrameNumber = 0;
|
||
this._splashFadeInFinishTime = 0;
|
||
this._splashFadeOutStartTime = 0;
|
||
this._splashState = "fade-in";
|
||
this._splashDoneResolve = null;
|
||
this._splashDonePromise = new Promise(resolve=>this._splashDoneResolve = resolve)
|
||
}
|
||
_SetGPUPowerPreference(pref) {
|
||
this._gpuPreference = pref
|
||
}
|
||
async CreateCanvas(opts) {
|
||
this._canvas = opts["canvas"];
|
||
this._canvas.addEventListener("webglcontextlost", e=>this._OnWebGLContextLost(e));
|
||
this._canvas.addEventListener("webglcontextrestored", e=>this._OnWebGLContextRestored(e));
|
||
const rendererOpts = {
|
||
powerPreference: this._gpuPreference,
|
||
enableGpuProfiling: true
|
||
};
|
||
if (C3.Platform.OS === "Android" && C3.Platform.BrowserEngine === "Chromium" && C3.Platform.BrowserVersionNumber < 75) {
|
||
console.warn("[Construct 3] Disabling WebGL 2 because this device appears to be affected by crbug.com/934823. Install software updates to avoid this.");
|
||
rendererOpts.maxWebGLVersion = 1
|
||
}
|
||
if (this._runtime.GetCompositingMode() === "standard")
|
||
rendererOpts.alpha = true;
|
||
else {
|
||
rendererOpts.alpha = false;
|
||
rendererOpts.lowLatency = true
|
||
}
|
||
this._webglRenderer = C3.New(C3.Gfx.WebGLRenderer, this._canvas, rendererOpts);
|
||
await this._webglRenderer.InitState();
|
||
if (!this._webglRenderer.SupportsGPUProfiling())
|
||
this._gpuLastUtilisation = NaN;
|
||
this._runtime.AddDOMComponentMessageHandler("runtime", "window-resize", e=>this._OnWindowResize(e));
|
||
this._runtime.AddDOMComponentMessageHandler("runtime", "fullscreenchange", e=>this._OnFullscreenChange(e));
|
||
this._runtime.AddDOMComponentMessageHandler("runtime", "fullscreenerror", e=>this._OnFullscreenError(e));
|
||
this._isDocumentFullscreen = !!opts["isFullscreen"];
|
||
this.SetSize(opts["windowInnerWidth"], opts["windowInnerHeight"], true);
|
||
this._shaderData = self["C3_Shaders"];
|
||
await this._LoadShaderPrograms();
|
||
let hasAnyBackgroundBlending = false;
|
||
for (const effectList of this._runtime._GetAllEffectLists()) {
|
||
for (const effectType of effectList.GetAllEffectTypes()) {
|
||
effectType._InitRenderer(this._webglRenderer);
|
||
if (effectType.GetShaderProgram().UsesDest())
|
||
hasAnyBackgroundBlending = true
|
||
}
|
||
effectList.UpdateActiveEffects()
|
||
}
|
||
this._runtime._SetUsesAnyBackgroundBlending(hasAnyBackgroundBlending);
|
||
if (this._webglRenderer.SupportsGPUProfiling())
|
||
this._gpuFrameTimingsBuffer = C3.New(C3.Gfx.WebGLQueryResultBuffer, this._webglRenderer);
|
||
this._webglRenderer.SetMipmapsEnabled(this._enableMipmaps)
|
||
}
|
||
async _LoadShaderPrograms() {
|
||
if (!this._shaderData)
|
||
return;
|
||
const promises = [];
|
||
for (const [id,data] of Object.entries(this._shaderData)) {
|
||
const vertexSrc = C3.Gfx.WebGLShaderProgram.GetDefaultVertexShaderSource(this._webglRenderer.Is3D());
|
||
promises.push(this._webglRenderer.CreateShaderProgram(data, vertexSrc, id))
|
||
}
|
||
await Promise.all(promises);
|
||
this._webglRenderer.ResetLastProgram();
|
||
this._webglRenderer.SetTextureFillMode()
|
||
}
|
||
Release() {
|
||
this._runtime = null;
|
||
this._webglRenderer = null;
|
||
this._canvas = null
|
||
}
|
||
_OnWindowResize(e) {
|
||
const dpr = e["devicePixelRatio"];
|
||
if (this._runtime.IsInWorker())
|
||
self.devicePixelRatio = dpr;
|
||
this._runtime._SetDevicePixelRatio(dpr);
|
||
this.SetSize(e["innerWidth"], e["innerHeight"]);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_OnFullscreenChange(e) {
|
||
this._isDocumentFullscreen = !!e["isFullscreen"];
|
||
this.SetSize(e["innerWidth"], e["innerHeight"], true);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_OnFullscreenError(e) {
|
||
this._isDocumentFullscreen = !!e["isFullscreen"];
|
||
this.SetSize(e["innerWidth"], e["innerHeight"], true);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
SetSize(availableWidth, availableHeight, force=false) {
|
||
availableWidth = Math.floor(availableWidth);
|
||
availableHeight = Math.floor(availableHeight);
|
||
if (availableWidth <= 0 || availableHeight <= 0)
|
||
throw new Error("invalid size");
|
||
if (this._windowInnerWidth === availableWidth && this._windowInnerHeight === availableHeight && !force)
|
||
return;
|
||
this._windowInnerWidth = availableWidth;
|
||
this._windowInnerHeight = availableHeight;
|
||
const fullscreenMode = this.GetCurrentFullscreenMode();
|
||
if (fullscreenMode === "letterbox-scale")
|
||
this._CalculateLetterboxScale(availableWidth, availableHeight);
|
||
else if (fullscreenMode === "letterbox-integer-scale")
|
||
this._CalculateLetterboxIntegerScale(availableWidth, availableHeight);
|
||
else if (fullscreenMode === "off")
|
||
this._CalculateFixedSizeCanvas(availableWidth, availableHeight);
|
||
else
|
||
this._CalculateFullsizeCanvas(availableWidth, availableHeight);
|
||
this._UpdateFullscreenScalingQuality(fullscreenMode);
|
||
this._canvas.width = this._canvasDeviceWidth;
|
||
this._canvas.height = this._canvasDeviceHeight;
|
||
this._runtime.PostComponentMessageToDOM("canvas", "update-size", {
|
||
"marginLeft": this._canvasCssOffsetX,
|
||
"marginTop": this._canvasCssOffsetY,
|
||
"styleWidth": this._canvasCssWidth,
|
||
"styleHeight": this._canvasCssHeight
|
||
});
|
||
this._webglRenderer.SetSize(this._canvasDeviceWidth, this._canvasDeviceHeight, true)
|
||
}
|
||
_CalculateLetterboxScale(availableWidth, availableHeight) {
|
||
const dpr = this._runtime.GetDevicePixelRatio();
|
||
const originalViewportWidth = this._runtime.GetOriginalViewportWidth();
|
||
const originalViewportHeight = this._runtime.GetOriginalViewportHeight();
|
||
const originalAspectRatio = originalViewportWidth / originalViewportHeight;
|
||
const availableAspectRatio = availableWidth / availableHeight;
|
||
if (availableAspectRatio > originalAspectRatio) {
|
||
const letterboxedWidth = availableHeight * originalAspectRatio;
|
||
this._canvasCssWidth = Math.round(letterboxedWidth);
|
||
this._canvasCssHeight = availableHeight;
|
||
this._canvasCssOffsetX = Math.floor((availableWidth - this._canvasCssWidth) / 2);
|
||
this._canvasCssOffsetY = 0
|
||
} else {
|
||
const letterboxedHeight = availableWidth / originalAspectRatio;
|
||
this._canvasCssWidth = availableWidth;
|
||
this._canvasCssHeight = Math.round(letterboxedHeight);
|
||
this._canvasCssOffsetX = 0;
|
||
this._canvasCssOffsetY = Math.floor((availableHeight - this._canvasCssHeight) / 2)
|
||
}
|
||
this._canvasDeviceWidth = Math.round(this._canvasCssWidth * dpr);
|
||
this._canvasDeviceHeight = Math.round(this._canvasCssHeight * dpr);
|
||
this._runtime.SetViewportSize(originalViewportWidth, originalViewportHeight)
|
||
}
|
||
_CalculateLetterboxIntegerScale(availableWidth, availableHeight) {
|
||
const dpr = this._runtime.GetDevicePixelRatio();
|
||
if (dpr !== 1) {
|
||
availableWidth += 1;
|
||
availableHeight += 1
|
||
}
|
||
const originalViewportWidth = this._runtime.GetOriginalViewportWidth();
|
||
const originalViewportHeight = this._runtime.GetOriginalViewportHeight();
|
||
const originalAspectRatio = originalViewportWidth / originalViewportHeight;
|
||
const availableAspectRatio = availableWidth / availableHeight;
|
||
let intScale;
|
||
if (availableAspectRatio > originalAspectRatio) {
|
||
const letterboxedWidth = availableHeight * originalAspectRatio;
|
||
intScale = letterboxedWidth * dpr / originalViewportWidth
|
||
} else {
|
||
const letterboxedHeight = availableWidth / originalAspectRatio;
|
||
intScale = letterboxedHeight * dpr / originalViewportHeight
|
||
}
|
||
if (intScale > 1)
|
||
intScale = Math.floor(intScale);
|
||
else if (intScale < 1)
|
||
intScale = 1 / Math.ceil(1 / intScale);
|
||
this._canvasDeviceWidth = Math.round(originalViewportWidth * intScale);
|
||
this._canvasDeviceHeight = Math.round(originalViewportHeight * intScale);
|
||
this._canvasCssWidth = this._canvasDeviceWidth / dpr;
|
||
this._canvasCssHeight = this._canvasDeviceHeight / dpr;
|
||
this._canvasCssOffsetX = Math.max(Math.floor((availableWidth - this._canvasCssWidth) / 2), 0);
|
||
this._canvasCssOffsetY = Math.max(Math.floor((availableHeight - this._canvasCssHeight) / 2), 0);
|
||
this._runtime.SetViewportSize(originalViewportWidth, originalViewportHeight)
|
||
}
|
||
_CalculateFullsizeCanvas(availableWidth, availableHeight) {
|
||
const dpr = this._runtime.GetDevicePixelRatio();
|
||
this._canvasCssWidth = availableWidth;
|
||
this._canvasCssHeight = availableHeight;
|
||
this._canvasDeviceWidth = Math.round(this._canvasCssWidth * dpr);
|
||
this._canvasDeviceHeight = Math.round(this._canvasCssHeight * dpr);
|
||
this._canvasCssOffsetX = 0;
|
||
this._canvasCssOffsetY = 0;
|
||
const displayScale = this.GetDisplayScale();
|
||
this._runtime.SetViewportSize(this._canvasCssWidth / displayScale, this._canvasCssHeight / displayScale)
|
||
}
|
||
_CalculateFixedSizeCanvas(availableWidth, availableHeight) {
|
||
const dpr = this._runtime.GetDevicePixelRatio();
|
||
this._canvasCssWidth = this._runtime.GetViewportWidth();
|
||
this._canvasCssHeight = this._runtime.GetViewportHeight();
|
||
this._canvasDeviceWidth = Math.round(this._canvasCssWidth * dpr);
|
||
this._canvasDeviceHeight = Math.round(this._canvasCssHeight * dpr);
|
||
if (this.IsDocumentFullscreen()) {
|
||
this._canvasCssOffsetX = Math.floor((availableWidth - this._canvasCssWidth) / 2);
|
||
this._canvasCssOffsetY = Math.floor((availableHeight - this._canvasCssHeight) / 2)
|
||
} else {
|
||
this._canvasCssOffsetX = 0;
|
||
this._canvasCssOffsetY = 0
|
||
}
|
||
this._runtime.SetViewportSize(this._runtime.GetViewportWidth(), this._runtime.GetViewportHeight())
|
||
}
|
||
_UpdateFullscreenScalingQuality(fullscreenMode) {
|
||
if (this._wantFullscreenScalingQuality === "high") {
|
||
this._drawWidth = this._canvasDeviceWidth;
|
||
this._drawHeight = this._canvasDeviceHeight;
|
||
this._fullscreenScalingQuality = "high"
|
||
} else {
|
||
let viewportWidth, viewportHeight;
|
||
if (this.GetCurrentFullscreenMode() === "off") {
|
||
viewportWidth = this._runtime.GetViewportWidth();
|
||
viewportHeight = this._runtime.GetViewportHeight()
|
||
} else {
|
||
viewportWidth = this._runtime.GetOriginalViewportWidth();
|
||
viewportHeight = this._runtime.GetOriginalViewportHeight()
|
||
}
|
||
if (this._canvasDeviceWidth < viewportWidth && this._canvasDeviceHeight < viewportHeight) {
|
||
this._drawWidth = this._canvasDeviceWidth;
|
||
this._drawHeight = this._canvasDeviceHeight;
|
||
this._fullscreenScalingQuality = "high"
|
||
} else {
|
||
this._drawWidth = viewportWidth;
|
||
this._drawHeight = viewportHeight;
|
||
this._fullscreenScalingQuality = "low";
|
||
if (fullscreenMode === "scale-inner") {
|
||
const originalAspectRatio = viewportWidth / viewportHeight;
|
||
const currentAspectRatio = this._windowInnerWidth / this._windowInnerHeight;
|
||
if (currentAspectRatio < originalAspectRatio)
|
||
this._drawWidth = this._drawHeight * currentAspectRatio;
|
||
else if (currentAspectRatio > originalAspectRatio)
|
||
this._drawHeight = this._drawWidth / currentAspectRatio
|
||
} else if (fullscreenMode === "scale-outer") {
|
||
const originalAspectRatio = viewportWidth / viewportHeight;
|
||
const currentAspectRatio = this._windowInnerWidth / this._windowInnerHeight;
|
||
if (currentAspectRatio > originalAspectRatio)
|
||
this._drawWidth = this._drawHeight * currentAspectRatio;
|
||
else if (currentAspectRatio < originalAspectRatio)
|
||
this._drawHeight = this._drawWidth / currentAspectRatio
|
||
}
|
||
}
|
||
}
|
||
}
|
||
IsDocumentFullscreen() {
|
||
return this._isDocumentFullscreen
|
||
}
|
||
SetFullscreenMode(m) {
|
||
if (!VALID_FULLSCREEN_MODES.has(m))
|
||
throw new Error("invalid fullscreen mode");
|
||
this._fullscreenMode = m
|
||
}
|
||
GetFullscreenMode() {
|
||
return this._fullscreenMode
|
||
}
|
||
SetDocumentFullscreenMode(m) {
|
||
if (!VALID_FULLSCREEN_MODES.has(m))
|
||
throw new Error("invalid fullscreen mode");
|
||
this._documentFullscreenMode = m
|
||
}
|
||
GetDocumentFullscreenMode() {
|
||
return this._documentFullscreenMode
|
||
}
|
||
GetCurrentFullscreenMode() {
|
||
if (this.IsDocumentFullscreen())
|
||
return this.GetDocumentFullscreenMode();
|
||
else
|
||
return this.GetFullscreenMode()
|
||
}
|
||
SetFullscreenScalingQuality(q) {
|
||
if (!VALID_FULLSCREEN_SCALING_QUALITIES.has(q))
|
||
throw new Error("invalid fullscreen scaling quality");
|
||
this._wantFullscreenScalingQuality = q
|
||
}
|
||
GetSetFullscreenScalingQuality() {
|
||
return this._wantFullscreenScalingQuality
|
||
}
|
||
GetCurrentFullscreenScalingQuality() {
|
||
return this._fullscreenScalingQuality
|
||
}
|
||
static _FullscreenModeNumberToString(n) {
|
||
switch (n) {
|
||
case 0:
|
||
return "off";
|
||
case 1:
|
||
return "crop";
|
||
case 2:
|
||
return "scale-inner";
|
||
case 3:
|
||
return "scale-outer";
|
||
case 4:
|
||
return "letterbox-scale";
|
||
case 5:
|
||
return "letterbox-integer-scale";
|
||
default:
|
||
throw new Error("invalid fullscreen mode");
|
||
}
|
||
}
|
||
GetLastWidth() {
|
||
return this._windowInnerWidth
|
||
}
|
||
GetLastHeight() {
|
||
return this._windowInnerHeight
|
||
}
|
||
GetDrawWidth() {
|
||
return this._drawWidth
|
||
}
|
||
GetDrawHeight() {
|
||
return this._drawHeight
|
||
}
|
||
SetMipmapsEnabled(e) {
|
||
this._enableMipmaps = !!e
|
||
}
|
||
IsWebGLContextLost() {
|
||
return this._webglRenderer.IsContextLost()
|
||
}
|
||
_OnWebGLContextLost(e) {
|
||
console.log("[Construct 3] WebGL context lost");
|
||
e.preventDefault();
|
||
this._availableAdditionalRenderTargets = [];
|
||
this._usedAdditionalRenderTargets.clear();
|
||
this._webglRenderer.OnContextLost();
|
||
this._runtime._OnWebGLContextLost()
|
||
}
|
||
async _OnWebGLContextRestored(e) {
|
||
await this._webglRenderer.OnContextRestored();
|
||
await this._LoadShaderPrograms();
|
||
for (const effectList of this._runtime._GetAllEffectLists())
|
||
for (const effectType of effectList.GetAllEffectTypes())
|
||
effectType._InitRenderer(this._webglRenderer);
|
||
await this._runtime._OnWebGLContextRestored();
|
||
console.log("[Construct 3] WebGL context restored")
|
||
}
|
||
GetWebGLRenderer() {
|
||
return this._webglRenderer
|
||
}
|
||
GetRenderScale() {
|
||
if (this._fullscreenScalingQuality === "low")
|
||
return 1 / this._runtime.GetDevicePixelRatio();
|
||
return this.GetDisplayScale()
|
||
}
|
||
GetDisplayScale() {
|
||
const fullscreenMode = this.GetCurrentFullscreenMode();
|
||
if (fullscreenMode === "off" || fullscreenMode === "crop")
|
||
return 1;
|
||
const originalViewportWidth = this._runtime.GetOriginalViewportWidth();
|
||
const originalViewportHeight = this._runtime.GetOriginalViewportHeight();
|
||
const originalAspectRatio = originalViewportWidth / originalViewportHeight;
|
||
const currentAspectRatio = this._canvasDeviceWidth / this._canvasDeviceHeight;
|
||
if (fullscreenMode !== "scale-inner" && currentAspectRatio > originalAspectRatio || fullscreenMode === "scale-inner" && currentAspectRatio < originalAspectRatio)
|
||
return this._canvasCssHeight / originalViewportHeight;
|
||
else
|
||
return this._canvasCssWidth / originalViewportWidth
|
||
}
|
||
SetDeviceTransformOffset(x, y) {
|
||
this._deviceTransformOffX = x;
|
||
this._deviceTransformOffY = y
|
||
}
|
||
SetDeviceTransform(renderer, w, h) {
|
||
const scrollX = (w || this._drawWidth) / 2 + this._deviceTransformOffX;
|
||
const scrollY = (h || this._drawHeight) / 2 + this._deviceTransformOffY;
|
||
renderer.SetCameraXYZ(scrollX, scrollY, 100 * this._runtime.GetDevicePixelRatio());
|
||
renderer.SetLookXYZ(scrollX, scrollY, 0);
|
||
renderer.ResetModelView();
|
||
renderer.UpdateModelView()
|
||
}
|
||
SetCssTransform(renderer) {
|
||
const scrollX = this._canvasCssWidth / 2;
|
||
const scrollY = this._canvasCssHeight / 2;
|
||
renderer.SetCameraXYZ(scrollX, scrollY, 100);
|
||
renderer.SetLookXYZ(scrollX, scrollY, 0);
|
||
renderer.ResetModelView();
|
||
renderer.UpdateModelView()
|
||
}
|
||
GetDeviceWidth() {
|
||
return this._canvasDeviceWidth
|
||
}
|
||
GetDeviceHeight() {
|
||
return this._canvasDeviceHeight
|
||
}
|
||
GetCssWidth() {
|
||
return this._canvasCssWidth
|
||
}
|
||
GetCssHeight() {
|
||
return this._canvasCssHeight
|
||
}
|
||
GetCanvasClientX() {
|
||
return this._canvasCssOffsetX
|
||
}
|
||
GetCanvasClientY() {
|
||
return this._canvasCssOffsetY
|
||
}
|
||
GetAdditionalRenderTarget(opts) {
|
||
const arr = this._availableAdditionalRenderTargets;
|
||
const useIndex = arr.findIndex(rt=>rt.IsCompatibleWithOptions(opts));
|
||
let ret;
|
||
if (useIndex !== -1) {
|
||
ret = arr[useIndex];
|
||
arr.splice(useIndex, 1)
|
||
} else
|
||
ret = this._webglRenderer.CreateRenderTarget(opts);
|
||
this._usedAdditionalRenderTargets.add(ret);
|
||
return ret
|
||
}
|
||
ReleaseAdditionalRenderTarget(renderTarget) {
|
||
if (!this._usedAdditionalRenderTargets.has(renderTarget))
|
||
throw new Error("render target not in use");
|
||
this._usedAdditionalRenderTargets.delete(renderTarget);
|
||
this._availableAdditionalRenderTargets.push(renderTarget)
|
||
}
|
||
*activeLayersGpuProfiles() {
|
||
for (const layout of this._runtime.GetLayoutManager().runningLayouts())
|
||
for (const layer of layout.GetLayers()) {
|
||
const p = this._layersGpuProfile.get(layer);
|
||
if (p)
|
||
yield p
|
||
}
|
||
}
|
||
GetLayerTimingsBuffer(layer) {
|
||
if (!this._webglRenderer.SupportsGPUProfiling())
|
||
return null;
|
||
let p = this._layersGpuProfile.get(layer);
|
||
if (!p) {
|
||
p = {
|
||
name: layer.GetName(),
|
||
timingsBuffer: C3.New(C3.Gfx.WebGLQueryResultBuffer, this._webglRenderer),
|
||
curUtilisation: 0,
|
||
lastUtilisation: 0
|
||
};
|
||
this._layersGpuProfile.set(layer, p)
|
||
}
|
||
return p.timingsBuffer
|
||
}
|
||
_Update1sFrameRange() {
|
||
if (!this._webglRenderer.SupportsGPUProfiling())
|
||
return;
|
||
if (this._gpuTimeEndFrame === 0) {
|
||
this._gpuTimeEndFrame = this._webglRenderer.GetFrameNumber();
|
||
this._gpuCurUtilisation = NaN;
|
||
for (const p of this.activeLayersGpuProfiles())
|
||
p.curUtilisation = NaN
|
||
}
|
||
}
|
||
_UpdateTick() {
|
||
if (!this._webglRenderer.SupportsGPUProfiling() || !isNaN(this._gpuCurUtilisation))
|
||
return;
|
||
this._gpuCurUtilisation = this._gpuFrameTimingsBuffer.GetFrameRangeResultSum(this._gpuTimeStartFrame, this._gpuTimeEndFrame);
|
||
if (isNaN(this._gpuCurUtilisation))
|
||
return;
|
||
if (this._runtime.IsDebug())
|
||
for (const p of this.activeLayersGpuProfiles()) {
|
||
p.curUtilisation = p.timingsBuffer.GetFrameRangeResultSum(this._gpuTimeStartFrame, this._gpuTimeEndFrame);
|
||
if (isNaN(p.curUtilisation))
|
||
return
|
||
}
|
||
this._gpuFrameTimingsBuffer.DeleteAllBeforeFrameNumber(this._gpuTimeEndFrame);
|
||
this._gpuLastUtilisation = Math.min(this._gpuCurUtilisation, 1);
|
||
if (this._runtime.IsDebug()) {
|
||
for (const p of this.activeLayersGpuProfiles()) {
|
||
p.timingsBuffer.DeleteAllBeforeFrameNumber(this._gpuTimeEndFrame);
|
||
p.lastUtilisation = Math.min(p.curUtilisation, 1)
|
||
}
|
||
self.C3Debugger.UpdateGPUProfile(this._gpuLastUtilisation, [...this.activeLayersGpuProfiles()])
|
||
}
|
||
this._gpuTimeStartFrame = this._gpuTimeEndFrame;
|
||
this._gpuTimeEndFrame = 0
|
||
}
|
||
GetGPUFrameTimingsBuffer() {
|
||
return this._gpuFrameTimingsBuffer
|
||
}
|
||
GetGPUUtilisation() {
|
||
return this._gpuLastUtilisation
|
||
}
|
||
SnapshotCanvas(format, quality, x, y, width, height) {
|
||
this._snapshotFormat = format;
|
||
this._snapshotQuality = quality;
|
||
this._snapshotArea.setWH(x, y, width, height);
|
||
if (this._snapshotPromise)
|
||
return this._snapshotPromise;
|
||
this._snapshotPromise = new Promise(resolve=>{
|
||
this._snapshotResolve = resolve
|
||
}
|
||
);
|
||
return this._snapshotPromise
|
||
}
|
||
_MaybeTakeSnapshot() {
|
||
if (!this._snapshotFormat)
|
||
return;
|
||
let canvas = this._canvas;
|
||
const snapArea = this._snapshotArea;
|
||
const x = C3.clamp(Math.floor(snapArea.getLeft()), 0, canvas.width);
|
||
const y = C3.clamp(Math.floor(snapArea.getTop()), 0, canvas.height);
|
||
let w = snapArea.width();
|
||
if (w === 0)
|
||
w = canvas.width - x;
|
||
else
|
||
w = C3.clamp(Math.floor(w), 0, canvas.width - x);
|
||
let h = snapArea.height();
|
||
if (h === 0)
|
||
h = canvas.height - y;
|
||
else
|
||
h = C3.clamp(Math.floor(h), 0, canvas.height - y);
|
||
if ((x !== 0 || y !== 0 || w !== canvas.width || h !== canvas.height) && (w > 0 && h > 0)) {
|
||
canvas = C3.CreateCanvas(w, h);
|
||
const ctx = canvas.getContext("2d");
|
||
ctx.drawImage(this._canvas, x, y, w, h, 0, 0, w, h)
|
||
}
|
||
C3.CanvasToBlob(canvas, this._snapshotFormat, this._snapshotQuality).then(blob=>{
|
||
this._snapshotUrl = URL.createObjectURL(blob);
|
||
this._snapshotPromise = null;
|
||
this._snapshotResolve(this._snapshotUrl)
|
||
}
|
||
);
|
||
this._snapshotFormat = "";
|
||
this._snapshotQuality = 1
|
||
}
|
||
GetCanvasSnapshotUrl() {
|
||
return this._snapshotUrl
|
||
}
|
||
InitLoadingScreen(loaderStyle) {
|
||
if (loaderStyle === 2) {
|
||
this._percentText = C3.New(C3.Gfx.RendererText, this._webglRenderer);
|
||
this._percentText.SetIsAsync(false);
|
||
this._percentText.SetFontName("Arial");
|
||
this._percentText.SetFontSize(16);
|
||
this._percentText.SetHorizontalAlignment("center");
|
||
this._percentText.SetVerticalAlignment("center");
|
||
this._percentText.SetSize(PERCENTTEXT_WIDTH, PERCENTTEXT_HEIGHT)
|
||
} else if (loaderStyle === 0) {
|
||
const loadingLogoFilename = this._runtime.GetLoadingLogoFilename();
|
||
const assetManager = this._runtime.GetAssetManager();
|
||
let url;
|
||
if (this._runtime.IsPreview()) {
|
||
if (!assetManager._HasLocalUrlBlob(loadingLogoFilename))
|
||
return;
|
||
url = assetManager.GetLocalUrlAsBlobUrl(loadingLogoFilename)
|
||
} else
|
||
url = assetManager.GetIconsSubfolder() + loadingLogoFilename;
|
||
this._loadingLogoAsset = assetManager.LoadImage({
|
||
url
|
||
});
|
||
this._loadingLogoAsset.LoadStaticTexture(this._webglRenderer).catch(err=>console.warn(`[C3 runtime] Failed to load '${loadingLogoFilename}' for loading screen. Check the project has an icon with that name.`, err))
|
||
} else if (loaderStyle === 4) {
|
||
this._LoadSvgSplashImage("splash-images/splash-logo.svg").then(tex=>{
|
||
if (this._splashState === "done")
|
||
this._webglRenderer.DeleteTexture(tex);
|
||
else
|
||
this._splashTextures.logo = tex
|
||
}
|
||
).catch(err=>console.warn("Failed to load splash image: ", err));
|
||
this._LoadBitmapSplashImage("splash-images/splash-poweredby-512.png").then(tex=>{
|
||
if (this._splashState === "done")
|
||
this._webglRenderer.DeleteTexture(tex);
|
||
else
|
||
this._splashTextures.powered = tex
|
||
}
|
||
).catch(err=>console.warn("Failed to load splash image: ", err));
|
||
this._LoadBitmapSplashImage("splash-images/splash-website-512.png").then(tex=>{
|
||
if (this._splashState === "done")
|
||
this._webglRenderer.DeleteTexture(tex);
|
||
else
|
||
this._splashTextures.website = tex
|
||
}
|
||
).catch(err=>console.warn("Failed to load splash image: ", err))
|
||
}
|
||
}
|
||
async _LoadSvgSplashImage(url) {
|
||
url = (new URL(url,this._runtime.GetBaseURL())).toString();
|
||
const blob = await C3.FetchBlob(url);
|
||
const drawable = await this._runtime.RasterSvgImage(blob, 2048, 2048);
|
||
return await this._webglRenderer.CreateStaticTextureAsync(drawable, {
|
||
mipMapQuality: "high"
|
||
})
|
||
}
|
||
async _LoadBitmapSplashImage(url) {
|
||
url = (new URL(url,this._runtime.GetBaseURL())).toString();
|
||
const blob = await C3.FetchBlob(url);
|
||
return await this._webglRenderer.CreateStaticTextureAsync(blob, {
|
||
mipMapQuality: "high"
|
||
})
|
||
}
|
||
HideCordovaSplashScreen() {
|
||
this._runtime.PostComponentMessageToDOM("runtime", "hide-cordova-splash")
|
||
}
|
||
StartLoadingScreen() {
|
||
this._loaderStartTime = Date.now();
|
||
this._runtime.Dispatcher().addEventListener("loadingprogress", this._loadingprogress_handler);
|
||
this._rafId = requestAnimationFrame(()=>this._DrawLoadingScreen());
|
||
const loaderStyle = this._runtime.GetLoaderStyle();
|
||
if (loaderStyle !== 3)
|
||
this.HideCordovaSplashScreen()
|
||
}
|
||
async EndLoadingScreen() {
|
||
this._loadingProgress = 1;
|
||
const loaderStyle = this._runtime.GetLoaderStyle();
|
||
if (loaderStyle === 4)
|
||
await this._splashDonePromise;
|
||
this._splashDoneResolve = null;
|
||
this._splashDonePromise = null;
|
||
if (this._rafId !== -1) {
|
||
cancelAnimationFrame(this._rafId);
|
||
this._rafId = -1
|
||
}
|
||
this._runtime.Dispatcher().removeEventListener("loadingprogress", this._loadingprogress_handler);
|
||
this._loadingprogress_handler = null;
|
||
if (this._percentText) {
|
||
this._percentText.Release();
|
||
this._percentText = null
|
||
}
|
||
if (this._loadingLogoAsset) {
|
||
this._loadingLogoAsset.Release();
|
||
this._loadingLogoAsset = null
|
||
}
|
||
this._webglRenderer.Start();
|
||
if (this._splashTextures.logo) {
|
||
this._webglRenderer.DeleteTexture(this._splashTextures.logo);
|
||
this._splashTextures.logo = null
|
||
}
|
||
if (this._splashTextures.powered) {
|
||
this._webglRenderer.DeleteTexture(this._splashTextures.powered);
|
||
this._splashTextures.powered = null
|
||
}
|
||
if (this._splashTextures.website) {
|
||
this._webglRenderer.DeleteTexture(this._splashTextures.website);
|
||
this._splashTextures.website = null
|
||
}
|
||
this._webglRenderer.ClearRgba(0, 0, 0, 0);
|
||
this._webglRenderer.Finish();
|
||
this._splashState = "done";
|
||
this._gpuTimeStartFrame = this._webglRenderer.GetFrameNumber();
|
||
if (loaderStyle === 3)
|
||
this.HideCordovaSplashScreen()
|
||
}
|
||
_DrawLoadingScreen() {
|
||
if (this._rafId === -1)
|
||
return;
|
||
const renderer = this._webglRenderer;
|
||
renderer.Start();
|
||
this._rafId = -1;
|
||
const hasHadError = this._runtime.GetAssetManager().HasHadErrorLoading();
|
||
const loaderStyle = this._runtime.GetLoaderStyle();
|
||
if (loaderStyle !== 3) {
|
||
this.SetCssTransform(renderer);
|
||
renderer.ClearRgba(0, 0, 0, 0);
|
||
renderer.ResetColor();
|
||
renderer.SetTextureFillMode();
|
||
renderer.SetTexture(null)
|
||
}
|
||
if (loaderStyle === 0)
|
||
this._DrawProgressBarAndLogoLoadingScreen(hasHadError);
|
||
else if (loaderStyle === 1)
|
||
this._DrawProgressBarLoadingScreen(hasHadError, PROGRESSBAR_WIDTH, 0);
|
||
else if (loaderStyle === 2)
|
||
this._DrawPercentTextLoadingScreen(hasHadError);
|
||
else if (loaderStyle === 3)
|
||
C3.noop();
|
||
else if (loaderStyle === 4)
|
||
this._DrawSplashLoadingScreen(hasHadError);
|
||
else
|
||
throw new Error("invalid loader style");
|
||
renderer.Finish();
|
||
this._rafId = requestAnimationFrame(()=>this._DrawLoadingScreen())
|
||
}
|
||
_DrawPercentTextLoadingScreen(hasHadError) {
|
||
if (hasHadError)
|
||
this._percentText.SetColorRgb(1, 0, 0);
|
||
else
|
||
this._percentText.SetColorRgb(.6, .6, .6);
|
||
this._percentText.SetText(Math.round(this._loadingProgress * 100) + "%");
|
||
const midX = this._canvasCssWidth / 2;
|
||
const midY = this._canvasCssHeight / 2;
|
||
const hw = PERCENTTEXT_WIDTH / 2;
|
||
const hh = PERCENTTEXT_HEIGHT / 2;
|
||
tempQuad.setRect(midX - hw, midY - hh, midX + hw, midY + hh);
|
||
this._webglRenderer.SetTexture(this._percentText.GetTexture());
|
||
this._webglRenderer.Quad3(tempQuad, this._percentText.GetTexRect())
|
||
}
|
||
_DrawProgressBarLoadingScreen(hasHadError, width, yOff) {
|
||
const renderer = this._webglRenderer;
|
||
const height = PROGRESSBAR_HEIGHT;
|
||
renderer.SetColorFillMode();
|
||
if (hasHadError)
|
||
renderer.SetColorRgba(1, 0, 0, 1);
|
||
else
|
||
renderer.SetColorRgba(.118, .565, 1, 1);
|
||
const midX = this._canvasCssWidth / 2;
|
||
const midY = this._canvasCssHeight / 2;
|
||
const hw = width / 2;
|
||
const hh = height / 2;
|
||
tempRect.setWH(midX - hw, midY - hh + yOff, Math.floor(width * this._loadingProgress), height);
|
||
renderer.Rect(tempRect);
|
||
tempRect.setWH(midX - hw, midY - hh + yOff, width, height);
|
||
tempRect.offset(-.5, -.5);
|
||
tempRect.inflate(.5, .5);
|
||
renderer.SetColorRgba(0, 0, 0, 1);
|
||
renderer.LineRect2(tempRect);
|
||
tempRect.inflate(1, 1);
|
||
renderer.SetColorRgba(1, 1, 1, 1);
|
||
renderer.LineRect2(tempRect)
|
||
}
|
||
_DrawProgressBarAndLogoLoadingScreen(hasHadError) {
|
||
if (!this._loadingLogoAsset) {
|
||
this._DrawProgressBarLoadingScreen(hasHadError, PROGRESSBAR_WIDTH, 0);
|
||
return
|
||
}
|
||
const logoTexture = this._loadingLogoAsset.GetTexture();
|
||
if (!logoTexture) {
|
||
this._DrawProgressBarLoadingScreen(hasHadError, PROGRESSBAR_WIDTH, 0);
|
||
return
|
||
}
|
||
const logoW = logoTexture.GetWidth();
|
||
const logoH = logoTexture.GetHeight();
|
||
const midX = this._canvasCssWidth / 2;
|
||
const midY = this._canvasCssHeight / 2;
|
||
const hw = logoW / 2;
|
||
const hh = logoH / 2;
|
||
tempQuad.setRect(midX - hw, midY - hh, midX + hw, midY + hh);
|
||
this._webglRenderer.SetTexture(logoTexture);
|
||
this._webglRenderer.Quad(tempQuad);
|
||
this._DrawProgressBarLoadingScreen(hasHadError, logoW, hh + 16)
|
||
}
|
||
_DrawSplashLoadingScreen(hasHadError) {
|
||
const renderer = this._webglRenderer;
|
||
const logoTex = this._splashTextures.logo;
|
||
const poweredTex = this._splashTextures.powered;
|
||
const websiteTex = this._splashTextures.website;
|
||
const nowTime = Date.now();
|
||
if (this._splashFrameNumber === 0)
|
||
this._loaderStartTime = nowTime;
|
||
const allowQuickSplash = this._runtime.IsPreview() || this._runtime.IsFBInstantAvailable() && !this._runtime.IsCordova();
|
||
const splashAfterFadeOutWait = allowQuickSplash ? 0 : SPLASH_AFTER_FADEOUT_WAIT_TIME;
|
||
const splashMinDisplayTime = allowQuickSplash ? 0 : SPLASH_MIN_DISPLAY_TIME;
|
||
let a = 1;
|
||
if (this._splashState === "fade-in")
|
||
a = Math.min((nowTime - this._loaderStartTime) / SPLASH_FADE_DURATION, 1);
|
||
else if (this._splashState === "fade-out")
|
||
a = Math.max(1 - (nowTime - this._splashFadeOutStartTime) / SPLASH_FADE_DURATION, 0);
|
||
renderer.SetColorFillMode();
|
||
renderer.SetColorRgba(.231 * a, .251 * a, .271 * a, a);
|
||
tempRect.set(0, 0, this._canvasCssWidth, this._canvasCssHeight);
|
||
renderer.Rect(tempRect);
|
||
const w = Math.ceil(this._canvasCssWidth);
|
||
const h = Math.ceil(this._canvasCssHeight);
|
||
let drawW, drawH;
|
||
if (this._canvasCssHeight > 256) {
|
||
renderer.SetColorRgba(.302 * a, .334 * a, .365 * a, a);
|
||
drawW = w;
|
||
drawH = Math.max(h * .005, 2);
|
||
tempRect.setWH(0, h * .8 - drawH / 2, drawW, drawH);
|
||
renderer.Rect(tempRect);
|
||
if (hasHadError)
|
||
renderer.SetColorRgba(a, 0, 0, a);
|
||
else
|
||
renderer.SetColorRgba(.161 * a, .953 * a, .816 * a, a);
|
||
drawW = w * this._loadingProgress;
|
||
tempRect.setWH(w * .5 - drawW / 2, h * .8 - drawH / 2, drawW, drawH);
|
||
renderer.Rect(tempRect);
|
||
renderer.SetColorRgba(a, a, a, a);
|
||
renderer.SetTextureFillMode();
|
||
if (poweredTex) {
|
||
drawW = C3.clamp(h * .22, 105, w * .6) * 1.5;
|
||
drawH = drawW / 8;
|
||
tempRect.setWH(w * .5 - drawW / 2, h * .2 - drawH / 2, drawW, drawH);
|
||
renderer.SetTexture(poweredTex);
|
||
renderer.Rect(tempRect)
|
||
}
|
||
if (logoTex) {
|
||
drawW = Math.min(h * .395, w * .95);
|
||
drawH = drawW;
|
||
tempRect.setWH(w * .5 - drawW / 2, h * .485 - drawH / 2, drawW, drawH);
|
||
renderer.SetTexture(logoTex);
|
||
renderer.Rect(tempRect)
|
||
}
|
||
if (websiteTex) {
|
||
drawW = C3.clamp(h * .22, 105, w * .6) * 1.5;
|
||
drawH = drawW / 8;
|
||
tempRect.setWH(w * .5 - drawW / 2, h * .868 - drawH / 2, drawW, drawH);
|
||
renderer.SetTexture(websiteTex);
|
||
renderer.Rect(tempRect)
|
||
}
|
||
} else {
|
||
renderer.SetColorRgba(.302 * a, .334 * a, .365 * a, a);
|
||
drawW = w;
|
||
drawH = Math.max(h * .005, 2);
|
||
tempRect.setWH(0, h * .85 - drawH / 2, drawW, drawH);
|
||
renderer.Rect(tempRect);
|
||
if (hasHadError)
|
||
renderer.SetColorRgba(a, 0, 0, a);
|
||
else
|
||
renderer.SetColorRgba(.161 * a, .953 * a, .816 * a, a);
|
||
drawW = w * this._loadingProgress;
|
||
tempRect.setWH(w * .5 - drawW / 2, h * .85 - drawH / 2, drawW, drawH);
|
||
renderer.Rect(tempRect);
|
||
renderer.SetColorRgba(a, a, a, a);
|
||
renderer.SetTextureFillMode();
|
||
if (logoTex) {
|
||
drawW = h * .55;
|
||
drawH = drawW;
|
||
tempRect.setWH(w * .5 - drawW / 2, h * .45 - drawH / 2, drawW, drawH);
|
||
renderer.SetTexture(logoTex);
|
||
renderer.Rect(tempRect)
|
||
}
|
||
}
|
||
this._splashFrameNumber++;
|
||
if (this._splashState === "fade-in" && nowTime - this._loaderStartTime >= SPLASH_FADE_DURATION && this._splashFrameNumber >= 2) {
|
||
this._splashState = "wait";
|
||
this._splashFadeInFinishTime = nowTime
|
||
}
|
||
if (this._splashState === "wait" && nowTime - this._splashFadeInFinishTime >= splashMinDisplayTime && this._loadingProgress >= 1) {
|
||
this._splashState = "fade-out";
|
||
this._splashFadeOutStartTime = nowTime
|
||
}
|
||
if (this._splashState === "fade-out" && nowTime - this._splashFadeOutStartTime >= SPLASH_FADE_DURATION + splashAfterFadeOutWait || allowQuickSplash && this._loadingProgress >= 1 && nowTime - this._loaderStartTime < 500)
|
||
this._splashDoneResolve()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const C3Debugger = self.C3Debugger;
|
||
const assert = self.assert;
|
||
const DEFAULT_RUNTIME_OPTS = {
|
||
"messagePort": null,
|
||
"baseUrl": "",
|
||
"headless": false,
|
||
"hasDom": true,
|
||
"isInWorker": false,
|
||
"useAudio": true,
|
||
"projectData": "",
|
||
"exportType": ""
|
||
};
|
||
let ife = true;
|
||
C3.Runtime = class C3Runtime extends C3.DefendedBase {
|
||
constructor(opts) {
|
||
opts = Object.assign({}, DEFAULT_RUNTIME_OPTS, opts);
|
||
super();
|
||
this._messagePort = opts["messagePort"];
|
||
this._baseUrl = opts["baseUrl"];
|
||
this._isHeadless = !!opts["headless"];
|
||
this._hasDom = !!opts["hasDom"];
|
||
this._isInWorker = !!opts["isInWorker"];
|
||
ife = opts["ife"];
|
||
this._useAudio = !!opts["useAudio"];
|
||
this._exportType = opts["exportType"];
|
||
this._isiOSCordova = !!opts["isiOSCordova"];
|
||
this._isiOSWebView = !!opts["isiOSWebView"];
|
||
this._isFBInstantAvailable = !!opts["isFBInstantAvailable"];
|
||
this._opusWasmScriptUrl = opts["opusWasmScriptUrl"];
|
||
this._opusWasmBinaryUrl = opts["opusWasmBinaryUrl"];
|
||
this._dataJsonFilename = "data.json";
|
||
this._isDebug = !!(this._exportType === "preview" && opts["isDebug"]);
|
||
this._breakpointsEnabled = this._isDebug;
|
||
this._isDebugging = this._isDebug;
|
||
this._debuggingDisabled = 0;
|
||
const localUrlBlobs = opts["previewImageBlobs"];
|
||
const projectFileBlobs = opts["previewProjectFileBlobs"];
|
||
if (projectFileBlobs)
|
||
Object.assign(localUrlBlobs, projectFileBlobs);
|
||
const projectData = opts["projectData"];
|
||
if (projectData)
|
||
localUrlBlobs[this._dataJsonFilename] = projectData;
|
||
this._additionalLoadPromises = [];
|
||
this._additionalCreatePromises = [];
|
||
this._isUsingCreatePromises = false;
|
||
this._projectName = "";
|
||
this._projectVersion = "";
|
||
this._projectUniqueId = "";
|
||
this._appId = "";
|
||
this._originalViewportWidth = 0;
|
||
this._originalViewportHeight = 0;
|
||
this._devicePixelRatio = self.devicePixelRatio;
|
||
this._parallaxXorigin = 0;
|
||
this._parallaxYorigin = 0;
|
||
this._viewportWidth = 0;
|
||
this._viewportHeight = 0;
|
||
this._loaderStyle = 0;
|
||
this._usesLoaderLayout = false;
|
||
this._isLoading = true;
|
||
this._usesAnyBackgroundBlending = false;
|
||
this._loadingLogoFilename = "loading-logo.png";
|
||
const isRemoteLoadPolicy = this._exportType === "html5" || this._exportType === "scirra-arcade" || this._exportType === "instant-games";
|
||
this._assetManager = C3.New(C3.AssetManager, this, {
|
||
defaultLoadPolicy: isRemoteLoadPolicy ? "remote" : "local",
|
||
localUrlBlobs,
|
||
isCordova: this._exportType === "cordova",
|
||
isiOSCordova: this._isiOSCordova,
|
||
supportedAudioFormats: opts["supportedAudioFormats"]
|
||
});
|
||
this._layoutManager = C3.New(C3.LayoutManager, this);
|
||
this._eventSheetManager = C3.New(C3.EventSheetManager, this);
|
||
this._pluginManager = C3.New(C3.PluginManager, this);
|
||
this._collisionEngine = C3.New(C3.CollisionEngine, this);
|
||
this._timelineManager = C3.New(C3.TimelineManager, this);
|
||
this._transitionManager = C3.New(C3.TransitionManager, this);
|
||
this._allObjectClasses = [];
|
||
this._objectClassesByName = new Map;
|
||
this._objectClassesBySid = new Map;
|
||
this._familyCount = 0;
|
||
this._allContainers = [];
|
||
this._allEffectLists = [];
|
||
this._currentLayoutStack = [];
|
||
this._instancesPendingCreate = [];
|
||
this._instancesPendingDestroy = new Map;
|
||
this._hasPendingInstances = false;
|
||
this._isFlushingPendingInstances = false;
|
||
this._objectCount = 0;
|
||
this._nextUid = 0;
|
||
this._instancesByUid = new Map;
|
||
this._instancesToReleaseAtEndOfTick = new Set;
|
||
this._instancesToReleaseAffectedObjectClasses = new Set;
|
||
this._objectReferenceTable = [];
|
||
this._jsPropNameTable = [];
|
||
this._canvasManager = null;
|
||
this._framerateMode = "vsync";
|
||
this._compositingMode = "standard";
|
||
this._sampling = "trilinear";
|
||
this._isPixelRoundingEnabled = false;
|
||
this._needRender = true;
|
||
this._pauseOnBlur = false;
|
||
this._isPausedOnBlur = false;
|
||
this._tickCallbacks = {
|
||
normal: timestamp=>{
|
||
this._rafId = -1;
|
||
this._ruafId = -1;
|
||
this.Tick(timestamp)
|
||
}
|
||
,
|
||
tickOnly: timestamp=>{
|
||
this._ruafId = -1;
|
||
this.Tick(timestamp, false, "skip-render")
|
||
}
|
||
,
|
||
renderOnly: ()=>{
|
||
this._rafId = -1;
|
||
this.Render()
|
||
}
|
||
};
|
||
this._rafId = -1;
|
||
this._ruafId = -1;
|
||
this._tickCount = 0;
|
||
this._tickCountNoSave = 0;
|
||
this._execCount = 0;
|
||
this._hasStarted = false;
|
||
this._isInTick = false;
|
||
this._hasStartedTicking = false;
|
||
this._isLayoutFirstTick = true;
|
||
this._suspendCount = 0;
|
||
this._scheduleTriggersThrottle = new C3.PromiseThrottle(1);
|
||
this._randomNumberCallback = ()=>Math.random();
|
||
this._startTime = 0;
|
||
this._lastTickTime = 0;
|
||
this._dt1 = 0;
|
||
this._dt = 0;
|
||
this._timeScale = 1;
|
||
this._minimumFramerate = 30;
|
||
this._gameTime = C3.New(C3.KahanSum);
|
||
this._wallTime = C3.New(C3.KahanSum);
|
||
this._fpsFrameCount = -1;
|
||
this._fpsLastTime = 0;
|
||
this._fps = 0;
|
||
this._mainThreadTimeCounter = 0;
|
||
this._mainThreadTime = 0;
|
||
this._isLoadingState = false;
|
||
this._saveToSlotName = "";
|
||
this._loadFromSlotName = "";
|
||
this._loadFromJson = null;
|
||
this._lastSaveJson = "";
|
||
this._triggerOnCreateAfterLoad = [];
|
||
this._projectStorage = null;
|
||
this._savegamesStorage = null;
|
||
this._dispatcher = C3.New(C3.Event.Dispatcher);
|
||
this._domEventHandlers = new Map;
|
||
this._pendingResponsePromises = new Map;
|
||
this._nextDomResponseId = 0;
|
||
this._didRequestDeviceOrientationEvent = false;
|
||
this._didRequestDeviceMotionEvent = false;
|
||
this._isReadyToHandleEvents = false;
|
||
this._waitingToHandleEvents = [];
|
||
this._eventObjects = {
|
||
"pretick": C3.New(C3.Event, "pretick", false),
|
||
"tick": C3.New(C3.Event, "tick", false),
|
||
"tick2": C3.New(C3.Event, "tick2", false),
|
||
"instancedestroy": C3.New(C3.Event, "instancedestroy", false),
|
||
"beforelayoutchange": C3.New(C3.Event, "beforelayoutchange", false),
|
||
"layoutchange": C3.New(C3.Event, "layoutchange", false)
|
||
};
|
||
this._eventObjects["instancedestroy"].instance = null;
|
||
this._userScriptDispatcher = C3.New(C3.Event.Dispatcher);
|
||
this._userScriptEventObjects = null;
|
||
this._behInstsToTick = C3.New(C3.RedBlackSet, C3.BehaviorInstance.SortByTickSequence);
|
||
this._behInstsToPostTick = C3.New(C3.RedBlackSet, C3.BehaviorInstance.SortByTickSequence);
|
||
this._behInstsToTick2 = C3.New(C3.RedBlackSet, C3.BehaviorInstance.SortByTickSequence);
|
||
this._jobScheduler = C3.New(C3.JobSchedulerRuntime, this, opts["jobScheduler"]);
|
||
if (opts["canvas"])
|
||
this._canvasManager = C3.New(C3.CanvasManager, this);
|
||
this._messagePort.onmessage = e=>this["_OnMessageFromDOM"](e.data);
|
||
this.AddDOMComponentMessageHandler("runtime", "visibilitychange", e=>this._OnVisibilityChange(e));
|
||
this.AddDOMComponentMessageHandler("runtime", "opus-decode", e=>this._WasmDecodeWebMOpus(e["arrayBuffer"]));
|
||
this.AddDOMComponentMessageHandler("runtime", "get-remote-preview-status-info", ()=>this._GetRemotePreviewStatusInfo());
|
||
this.AddDOMComponentMessageHandler("runtime", "js-invoke-function", e=>this._InvokeFunctionFromJS(e));
|
||
this.AddDOMComponentMessageHandler("runtime", "go-to-last-error-script", self["goToLastErrorScript"]);
|
||
this._dispatcher.addEventListener("window-blur", e=>this._OnWindowBlur(e));
|
||
this._dispatcher.addEventListener("window-focus", ()=>this._OnWindowFocus());
|
||
this._timelineManager.AddRuntimeListeners();
|
||
this._iRuntime = null;
|
||
this._interfaceMap = new WeakMap;
|
||
this._commonScriptInterfaces = {
|
||
keyboard: null,
|
||
mouse: null,
|
||
touch: null
|
||
}
|
||
}
|
||
static Create(opts) {
|
||
return C3.New(C3.Runtime, opts)
|
||
}
|
||
Release() {
|
||
C3.clearArray(this._allObjectClasses);
|
||
this._objectClassesByName.clear();
|
||
this._objectClassesBySid.clear();
|
||
this._layoutManager.Release();
|
||
this._layoutManager = null;
|
||
this._eventSheetManager.Release();
|
||
this._eventSheetManager = null;
|
||
this._pluginManager.Release();
|
||
this._pluginManager = null;
|
||
this._assetManager.Release();
|
||
this._assetManager = null;
|
||
this._collisionEngine.Release();
|
||
this._collisionEngine = null;
|
||
this._timelineManager.Release();
|
||
this._timelineManager = null;
|
||
this._transitionManager.Release();
|
||
this._transitionManager = null;
|
||
if (this._canvasManager) {
|
||
this._canvasManager.Release();
|
||
this._canvasManager = null
|
||
}
|
||
this._dispatcher.Release();
|
||
this._dispatcher = null;
|
||
this._tickEvent = null
|
||
}
|
||
["_OnMessageFromDOM"](data) {
|
||
const type = data["type"];
|
||
if (type === "event")
|
||
this._OnEventFromDOM(data);
|
||
else if (type === "result")
|
||
this._OnResultFromDOM(data);
|
||
else
|
||
throw new Error(`unknown message '${type}'`);
|
||
}
|
||
_OnEventFromDOM(e) {
|
||
if (!this._isReadyToHandleEvents) {
|
||
this._waitingToHandleEvents.push(e);
|
||
return
|
||
}
|
||
const component = e["component"];
|
||
const handler = e["handler"];
|
||
const data = e["data"];
|
||
const dispatchOpts = e["dispatchOpts"];
|
||
const dispatchRuntimeEvent = !!(dispatchOpts && dispatchOpts["dispatchRuntimeEvent"]);
|
||
const dispatchUserScriptEvent = !!(dispatchOpts && dispatchOpts["dispatchUserScriptEvent"]);
|
||
const responseId = e["responseId"];
|
||
if (component === "runtime") {
|
||
if (dispatchRuntimeEvent) {
|
||
const event = new C3.Event(handler);
|
||
event.data = data;
|
||
this._dispatcher.dispatchEventAndWaitAsyncSequential(event)
|
||
}
|
||
if (dispatchUserScriptEvent) {
|
||
const event = new C3.Event(handler,true);
|
||
for (const [key,value] of Object.entries(data))
|
||
event[key] = value;
|
||
this.DispatchUserScriptEvent(event)
|
||
}
|
||
}
|
||
const handlerMap = this._domEventHandlers.get(component);
|
||
if (!handlerMap) {
|
||
if (!dispatchRuntimeEvent && !dispatchUserScriptEvent)
|
||
console.warn(`[Runtime] No DOM event handlers for component '${component}'`);
|
||
return
|
||
}
|
||
const func = handlerMap.get(handler);
|
||
if (!func) {
|
||
if (!dispatchRuntimeEvent && !dispatchUserScriptEvent)
|
||
console.warn(`[Runtime] No DOM handler '${handler}' for component '${component}'`);
|
||
return
|
||
}
|
||
let ret = null;
|
||
try {
|
||
ret = func(data)
|
||
} catch (err) {
|
||
console.error(`Exception in '${component}' handler '${handler}':`, err);
|
||
if (responseId !== null)
|
||
this._PostResultToDOM(responseId, false, "" + err);
|
||
return
|
||
}
|
||
if (responseId !== null)
|
||
if (ret && ret.then)
|
||
ret.then(result=>this._PostResultToDOM(responseId, true, result)).catch(err=>{
|
||
console.error(`Rejection from '${component}' handler '${handler}':`, err);
|
||
this._PostResultToDOM(responseId, false, "" + err)
|
||
}
|
||
);
|
||
else
|
||
this._PostResultToDOM(responseId, true, ret)
|
||
}
|
||
_PostResultToDOM(responseId, isOk, result) {
|
||
this._messagePort.postMessage({
|
||
"type": "result",
|
||
"responseId": responseId,
|
||
"isOk": isOk,
|
||
"result": result
|
||
})
|
||
}
|
||
_OnResultFromDOM(data) {
|
||
const responseId = data["responseId"];
|
||
const isOk = data["isOk"];
|
||
const result = data["result"];
|
||
const pendingPromise = this._pendingResponsePromises.get(responseId);
|
||
if (isOk)
|
||
pendingPromise.resolve(result);
|
||
else
|
||
pendingPromise.reject(result);
|
||
this._pendingResponsePromises.delete(responseId)
|
||
}
|
||
AddDOMComponentMessageHandler(component, handler, func) {
|
||
let handlerMap = this._domEventHandlers.get(component);
|
||
if (!handlerMap) {
|
||
handlerMap = new Map;
|
||
this._domEventHandlers.set(component, handlerMap)
|
||
}
|
||
if (handlerMap.has(handler))
|
||
throw new Error(`[Runtime] Component '${component}' already has handler '${handler}'`);
|
||
handlerMap.set(handler, func)
|
||
}
|
||
PostComponentMessageToDOM(component, handler, data) {
|
||
this._messagePort.postMessage({
|
||
"type": "event",
|
||
"component": component,
|
||
"handler": handler,
|
||
"data": data,
|
||
"responseId": null
|
||
})
|
||
}
|
||
PostComponentMessageToDOMAsync(component, handler, data) {
|
||
const responseId = this._nextDomResponseId++;
|
||
const ret = new Promise((resolve,reject)=>{
|
||
this._pendingResponsePromises.set(responseId, {
|
||
resolve,
|
||
reject
|
||
})
|
||
}
|
||
);
|
||
this._messagePort.postMessage({
|
||
"type": "event",
|
||
"component": component,
|
||
"handler": handler,
|
||
"data": data,
|
||
"responseId": responseId
|
||
});
|
||
return ret
|
||
}
|
||
PostToDebugger(data) {
|
||
if (!this.IsDebug())
|
||
throw new Error("not in debug mode");
|
||
this.PostComponentMessageToDOM("runtime", "post-to-debugger", data)
|
||
}
|
||
async Init(opts) {
|
||
if (this.IsDebug())
|
||
await C3Debugger.Init(this);
|
||
else if (self.C3Debugger)
|
||
self.C3Debugger.InitPreview(this);
|
||
const [o] = await Promise.all([this._assetManager.FetchJson(this._dataJsonFilename), this._MaybeLoadOpusDecoder(), this._jobScheduler.Init()]);
|
||
this._LoadDataJson(o);
|
||
await this._InitialiseCanvas(opts);
|
||
if (!this.IsPreview())
|
||
console.info("Made with Construct 3, the game and app creator :: https://www.construct.net");
|
||
const webglRenderer = this.GetWebGLRenderer();
|
||
if (webglRenderer) {
|
||
console.info(`[C3 runtime] Hosted in ${this.IsInWorker() ? "worker" : "DOM"}, rendering with WebGL ${webglRenderer.GetWebGLVersionNumber()} [${webglRenderer.GetUnmaskedRenderer()}] (${webglRenderer.IsDesynchronized() ? "desynchronized" : "standard"} compositing)`);
|
||
if (webglRenderer.HasMajorPerformanceCaveat())
|
||
console.warn("[C3 runtime] WebGL indicates a major performance caveat. Software rendering may be in use. This can result in significantly degraded performance.")
|
||
} else
|
||
console.info(`[C3 runtime] Hosted in ${this.IsInWorker() ? "worker" : "DOM"}, headless`);
|
||
this._isReadyToHandleEvents = true;
|
||
for (const e of this._waitingToHandleEvents)
|
||
this._OnEventFromDOM(e);
|
||
C3.clearArray(this._waitingToHandleEvents);
|
||
if (this._canvasManager)
|
||
this._canvasManager.StartLoadingScreen();
|
||
for (const f of opts["runOnStartupFunctions"])
|
||
this._additionalLoadPromises.push(this._RunOnStartupFunction(f));
|
||
await Promise.all([this._assetManager.WaitForAllToLoad(), ...this._additionalLoadPromises]);
|
||
C3.clearArray(this._additionalLoadPromises);
|
||
if (this._assetManager.HasHadErrorLoading()) {
|
||
if (this._canvasManager)
|
||
this._canvasManager.HideCordovaSplashScreen();
|
||
return
|
||
}
|
||
if (this._canvasManager)
|
||
await this._canvasManager.EndLoadingScreen();
|
||
await this._dispatcher.dispatchEventAndWaitAsync(new C3.Event("beforeruntimestart"));
|
||
await this.Start();
|
||
this._messagePort.postMessage({
|
||
"type": "runtime-ready"
|
||
});
|
||
return this
|
||
}
|
||
async _RunOnStartupFunction(f) {
|
||
try {
|
||
await f(this._iRuntime)
|
||
} catch (err) {
|
||
console.error("[C3 runtime] Error in runOnStartup function: ", err)
|
||
}
|
||
}
|
||
_LoadDataJson(o) {
|
||
const projectData = o["project"];
|
||
this._projectName = projectData[0];
|
||
this._projectVersion = projectData[16];
|
||
this._projectUniqueId = projectData[31];
|
||
this._appId = projectData[38];
|
||
this._loadingLogoFilename = projectData[39];
|
||
this._isPixelRoundingEnabled = !!projectData[9];
|
||
this._originalViewportWidth = this._viewportWidth = projectData[10];
|
||
this._originalViewportHeight = this._viewportHeight = projectData[11];
|
||
this._parallaxXorigin = this._originalViewportWidth / 2;
|
||
this._parallaxYorigin = this._originalViewportHeight / 2;
|
||
this._compositingMode = projectData[36];
|
||
this._framerateMode = projectData[37];
|
||
if (this._compositingMode === "low-latency" && this.IsAndroidWebView() && C3.Platform.BrowserVersionNumber <= 77) {
|
||
console.warn("[C3 runtime] Desynchronized (low-latency) compositing is enabled, but is disabled in the Android WebView <=77 due to crbug.com/1008842. Reverting to synchronized (standard) compositing.");
|
||
this._compositingMode = "standard"
|
||
}
|
||
this._sampling = projectData[14];
|
||
this._usesLoaderLayout = !!projectData[18];
|
||
this._loaderStyle = projectData[19];
|
||
this._nextUid = projectData[21];
|
||
this._pauseOnBlur = projectData[22];
|
||
this._assetManager._SetAudioFiles(projectData[7], projectData[25]);
|
||
this._assetManager._SetMediaSubfolder(projectData[8]);
|
||
this._assetManager._SetFontsSubfolder(projectData[32]);
|
||
this._assetManager._SetIconsSubfolder(projectData[28]);
|
||
this._assetManager._SetWebFonts(projectData[29]);
|
||
if (this._canvasManager) {
|
||
this._canvasManager.SetFullscreenMode(C3.CanvasManager._FullscreenModeNumberToString(projectData[12]));
|
||
this._canvasManager.SetFullscreenScalingQuality(projectData[23] ? "high" : "low");
|
||
this._canvasManager.SetMipmapsEnabled(projectData[24] !== 0);
|
||
this._canvasManager._SetGPUPowerPreference(projectData[34])
|
||
}
|
||
this._pluginManager.CreateSystemPlugin();
|
||
this._objectReferenceTable = self.C3_GetObjectRefTable();
|
||
for (const pluginData of projectData[2])
|
||
this._pluginManager.CreatePlugin(pluginData);
|
||
this._objectReferenceTable = self.C3_GetObjectRefTable();
|
||
this._LoadJsPropNameTable();
|
||
for (const objectClassData of projectData[3]) {
|
||
const objectClass = C3.ObjectClass.Create(this, this._allObjectClasses.length, objectClassData);
|
||
this._allObjectClasses.push(objectClass);
|
||
this._objectClassesByName.set(objectClass.GetName().toLowerCase(), objectClass);
|
||
this._objectClassesBySid.set(objectClass.GetSID(), objectClass)
|
||
}
|
||
for (const familyData of projectData[4]) {
|
||
const familyType = this._allObjectClasses[familyData[0]];
|
||
familyType._LoadFamily(familyData)
|
||
}
|
||
for (const containerData of projectData[27]) {
|
||
const containerTypes = containerData.map(index=>this._allObjectClasses[index]);
|
||
this._allContainers.push(C3.New(C3.Container, this, containerTypes))
|
||
}
|
||
for (const objectClass of this._allObjectClasses)
|
||
objectClass._OnAfterCreate();
|
||
for (const layoutData of projectData[5])
|
||
this._layoutManager.Create(layoutData);
|
||
const firstLayoutName = projectData[1];
|
||
if (firstLayoutName) {
|
||
const firstLayout = this._layoutManager.GetLayoutByName(firstLayoutName);
|
||
if (firstLayout)
|
||
this._layoutManager.SetFirstLayout(firstLayout)
|
||
}
|
||
for (const timelineData of projectData[33])
|
||
this._timelineManager.Create(timelineData);
|
||
for (const transitionData of projectData[35])
|
||
this._transitionManager.Create(transitionData);
|
||
this._InitScriptInterfaces();
|
||
for (const eventSheetData of projectData[6])
|
||
this._eventSheetManager.Create(eventSheetData);
|
||
this._eventSheetManager._PostInit();
|
||
this._InitGlobalVariableScriptInterface();
|
||
C3.clearArray(this._objectReferenceTable);
|
||
this.FlushPendingInstances();
|
||
let targetOrientation = "any";
|
||
const orientations = projectData[20];
|
||
if (orientations === 1)
|
||
targetOrientation = "portrait";
|
||
else if (orientations === 2)
|
||
targetOrientation = "landscape";
|
||
this.PostComponentMessageToDOM("runtime", "set-target-orientation", {
|
||
"targetOrientation": targetOrientation
|
||
})
|
||
}
|
||
GetLoaderStyle() {
|
||
return this._loaderStyle
|
||
}
|
||
IsFBInstantAvailable() {
|
||
return this._isFBInstantAvailable
|
||
}
|
||
IsLoading() {
|
||
return this._isLoading
|
||
}
|
||
AddLoadPromise(promise) {
|
||
this._additionalLoadPromises.push(promise)
|
||
}
|
||
SetUsingCreatePromises(e) {
|
||
this._isUsingCreatePromises = !!e
|
||
}
|
||
AddCreatePromise(promise) {
|
||
if (!this._isUsingCreatePromises)
|
||
return;
|
||
this._additionalCreatePromises.push(promise)
|
||
}
|
||
GetCreatePromises() {
|
||
return this._additionalCreatePromises
|
||
}
|
||
_GetNextFamilyIndex() {
|
||
return this._familyCount++
|
||
}
|
||
GetFamilyCount() {
|
||
return this._familyCount
|
||
}
|
||
_AddEffectList(el) {
|
||
this._allEffectLists.push(el)
|
||
}
|
||
_GetAllEffectLists() {
|
||
return this._allEffectLists
|
||
}
|
||
async _InitialiseCanvas(opts) {
|
||
if (!this._canvasManager)
|
||
return;
|
||
await this._canvasManager.CreateCanvas(opts);
|
||
this._canvasManager.InitLoadingScreen(this._loaderStyle)
|
||
}
|
||
async _MaybeLoadOpusDecoder() {
|
||
if (this._assetManager.IsAudioFormatSupported("audio/webm; codecs=opus"))
|
||
return;
|
||
let wasmBlob = null;
|
||
let wasmBuffer = null;
|
||
try {
|
||
if (this.IsiOSCordova() && location.protocol === "file:")
|
||
wasmBuffer = await this._assetManager.CordovaFetchLocalFileAsArrayBuffer(this._opusWasmBinaryUrl);
|
||
else
|
||
wasmBlob = await this._assetManager.FetchBlob(this._opusWasmBinaryUrl)
|
||
} catch (err) {
|
||
console.info("Failed to fetch Opus decoder WASM; assuming project has no Opus audio.", err);
|
||
return
|
||
}
|
||
if (wasmBuffer)
|
||
this.AddJobWorkerBuffer(wasmBuffer, "opus-decoder-wasm");
|
||
else
|
||
this.AddJobWorkerBlob(wasmBlob, "opus-decoder-wasm");
|
||
await this.AddJobWorkerScripts([this._opusWasmScriptUrl])
|
||
}
|
||
async _WasmDecodeWebMOpus(arrayBuffer) {
|
||
const result = await this.AddJob("OpusDecode", {
|
||
"arrayBuffer": arrayBuffer
|
||
}, [arrayBuffer]);
|
||
return result
|
||
}
|
||
async Start() {
|
||
this._hasStarted = true;
|
||
this._startTime = Date.now();
|
||
if (this._usesLoaderLayout) {
|
||
for (const objectClass of this._allObjectClasses)
|
||
if (!objectClass.IsFamily() && !objectClass.IsOnLoaderLayout() && objectClass.IsWorldType())
|
||
objectClass.OnCreate();
|
||
this._assetManager.WaitForAllToLoad().then(()=>{
|
||
this._isLoading = false;
|
||
this._OnLoadFinished()
|
||
}
|
||
)
|
||
} else
|
||
this._isLoading = false;
|
||
this._assetManager.SetInitialLoadFinished();
|
||
if (this.IsDebug())
|
||
C3Debugger.RuntimeInit(ife);
|
||
for (const layout of this._layoutManager.GetAllLayouts())
|
||
layout._CreateGlobalNonWorlds();
|
||
const firstLayout = this._layoutManager.GetFirstLayout();
|
||
await firstLayout._Load(null, this.GetWebGLRenderer());
|
||
await firstLayout._StartRunning(true);
|
||
this._fpsLastTime = performance.now();
|
||
if (!this._usesLoaderLayout)
|
||
this._OnLoadFinished();
|
||
const state = await this.PostComponentMessageToDOMAsync("runtime", "before-start-ticking");
|
||
if (state["isSuspended"])
|
||
this._suspendCount++;
|
||
else
|
||
this.Tick()
|
||
}
|
||
_OnLoadFinished() {
|
||
this.Trigger(C3.Plugins.System.Cnds.OnLoadFinished, null, null);
|
||
this.PostComponentMessageToDOM("runtime", "register-sw")
|
||
}
|
||
GetObjectReference(index) {
|
||
index = Math.floor(index);
|
||
const objRefTable = this._objectReferenceTable;
|
||
if (index < 0 || index >= objRefTable.length)
|
||
throw new Error("invalid object reference");
|
||
return objRefTable[index]
|
||
}
|
||
_LoadJsPropNameTable() {
|
||
for (const entry of self.C3_JsPropNameTable) {
|
||
const propName = C3.first(Object.keys(entry));
|
||
this._jsPropNameTable.push(propName)
|
||
}
|
||
}
|
||
GetJsPropName(index) {
|
||
index = Math.floor(index);
|
||
const jsPropNameTable = this._jsPropNameTable;
|
||
if (index < 0 || index >= jsPropNameTable.length)
|
||
throw new Error("invalid prop reference");
|
||
return jsPropNameTable[index]
|
||
}
|
||
HasDOM() {
|
||
return this._hasDom
|
||
}
|
||
IsHeadless() {
|
||
return this._isHeadless
|
||
}
|
||
IsInWorker() {
|
||
return this._isInWorker
|
||
}
|
||
GetBaseURL() {
|
||
return this._baseUrl
|
||
}
|
||
GetEventSheetManager() {
|
||
return this._eventSheetManager
|
||
}
|
||
GetEventStack() {
|
||
return this._eventSheetManager.GetEventStack()
|
||
}
|
||
GetCurrentEventStackFrame() {
|
||
return this._eventSheetManager.GetCurrentEventStackFrame()
|
||
}
|
||
GetCurrentEvent() {
|
||
return this._eventSheetManager.GetCurrentEvent()
|
||
}
|
||
GetCurrentCondition() {
|
||
return this._eventSheetManager.GetCurrentCondition()
|
||
}
|
||
IsCurrentConditionFirst() {
|
||
return this.GetCurrentEventStackFrame().GetConditionIndex() === 0
|
||
}
|
||
GetCurrentAction() {
|
||
return this._eventSheetManager.GetCurrentAction()
|
||
}
|
||
GetPluginManager() {
|
||
return this._pluginManager
|
||
}
|
||
GetSystemPlugin() {
|
||
return this._pluginManager.GetSystemPlugin()
|
||
}
|
||
GetObjectClassByIndex(i) {
|
||
i = Math.floor(i);
|
||
if (i < 0 || i >= this._allObjectClasses.length)
|
||
throw new RangeError("invalid index");
|
||
return this._allObjectClasses[i]
|
||
}
|
||
GetObjectClassByName(name) {
|
||
return this._objectClassesByName.get(name.toLowerCase()) || null
|
||
}
|
||
GetObjectClassBySID(sid) {
|
||
return this._objectClassesBySid.get(sid) || null
|
||
}
|
||
GetSingleGlobalObjectClassByCtor(ctor) {
|
||
const plugin = this._pluginManager.GetPluginByConstructorFunction(ctor);
|
||
if (!plugin)
|
||
return null;
|
||
return plugin.GetSingleGlobalObjectClass()
|
||
}
|
||
GetAllObjectClasses() {
|
||
return this._allObjectClasses
|
||
}
|
||
Dispatcher() {
|
||
return this._dispatcher
|
||
}
|
||
UserScriptDispatcher() {
|
||
return this._userScriptDispatcher
|
||
}
|
||
DispatchUserScriptEvent(e) {
|
||
e.runtime = this.GetIRuntime();
|
||
const shouldTime = this.IsDebug() && !this._eventSheetManager.IsInEventEngine();
|
||
if (shouldTime)
|
||
C3Debugger.StartMeasuringScriptTime();
|
||
this._userScriptDispatcher.dispatchEvent(e);
|
||
if (shouldTime)
|
||
C3Debugger.AddScriptTime()
|
||
}
|
||
DispatchUserScriptEventAsyncWait(e) {
|
||
e.runtime = this.GetIRuntime();
|
||
return this._userScriptDispatcher.dispatchEventAndWaitAsync(e)
|
||
}
|
||
GetOriginalViewportWidth() {
|
||
return this._originalViewportWidth
|
||
}
|
||
GetOriginalViewportHeight() {
|
||
return this._originalViewportHeight
|
||
}
|
||
SetOriginalViewportSize(w, h) {
|
||
this._originalViewportWidth = w;
|
||
this._originalViewportHeight = h
|
||
}
|
||
GetViewportWidth() {
|
||
return this._viewportWidth
|
||
}
|
||
GetViewportHeight() {
|
||
return this._viewportHeight
|
||
}
|
||
SetViewportSize(w, h) {
|
||
this._viewportWidth = w;
|
||
this._viewportHeight = h
|
||
}
|
||
_SetDevicePixelRatio(r) {
|
||
this._devicePixelRatio = r
|
||
}
|
||
GetDevicePixelRatio() {
|
||
return this._devicePixelRatio
|
||
}
|
||
GetParallaxXOrigin() {
|
||
return this._parallaxXorigin
|
||
}
|
||
GetParallaxYOrigin() {
|
||
return this._parallaxYorigin
|
||
}
|
||
GetCanvasManager() {
|
||
return this._canvasManager
|
||
}
|
||
GetDrawWidth() {
|
||
if (!this._canvasManager)
|
||
return this._viewportWidth;
|
||
return this._canvasManager.GetDrawWidth()
|
||
}
|
||
GetDrawHeight() {
|
||
if (!this._canvasManager)
|
||
return this._viewportHeight;
|
||
return this._canvasManager.GetDrawHeight()
|
||
}
|
||
GetRenderScale() {
|
||
if (!this._canvasManager)
|
||
return 1;
|
||
return this._canvasManager.GetRenderScale()
|
||
}
|
||
GetDisplayScale() {
|
||
if (!this._canvasManager)
|
||
return 1;
|
||
return this._canvasManager.GetDisplayScale()
|
||
}
|
||
GetCanvasClientX() {
|
||
if (!this._canvasManager)
|
||
return 0;
|
||
return this._canvasManager.GetCanvasClientX()
|
||
}
|
||
GetCanvasClientY() {
|
||
if (!this._canvasManager)
|
||
return 0;
|
||
return this._canvasManager.GetCanvasClientY()
|
||
}
|
||
GetCanvasCssWidth() {
|
||
if (!this._canvasManager)
|
||
return 0;
|
||
return this._canvasManager.GetCssWidth()
|
||
}
|
||
GetCanvasCssHeight() {
|
||
if (!this._canvasManager)
|
||
return 0;
|
||
return this._canvasManager.GetCssHeight()
|
||
}
|
||
GetFullscreenMode() {
|
||
if (!this._canvasManager)
|
||
return "off";
|
||
return this._canvasManager.GetFullscreenMode()
|
||
}
|
||
GetAdditionalRenderTarget(opts) {
|
||
if (!this._canvasManager)
|
||
return null;
|
||
return this._canvasManager.GetAdditionalRenderTarget(opts)
|
||
}
|
||
ReleaseAdditionalRenderTarget(renderTarget) {
|
||
if (!this._canvasManager)
|
||
return;
|
||
this._canvasManager.ReleaseAdditionalRenderTarget(renderTarget)
|
||
}
|
||
_SetUsesAnyBackgroundBlending(u) {
|
||
this._usesAnyBackgroundBlending = !!u
|
||
}
|
||
UsesAnyBackgroundBlending() {
|
||
return this._usesAnyBackgroundBlending
|
||
}
|
||
GetGPUUtilisation() {
|
||
if (!this._canvasManager)
|
||
return NaN;
|
||
return this._canvasManager.GetGPUUtilisation()
|
||
}
|
||
IsLinearSampling() {
|
||
return this.GetSampling() !== "nearest"
|
||
}
|
||
GetFramerateMode() {
|
||
return this._framerateMode
|
||
}
|
||
GetCompositingMode() {
|
||
return this._compositingMode
|
||
}
|
||
GetSampling() {
|
||
return this._sampling
|
||
}
|
||
UsesLoaderLayout() {
|
||
return this._usesLoaderLayout
|
||
}
|
||
GetLoadingLogoFilename() {
|
||
return this._loadingLogoFilename
|
||
}
|
||
GetLayoutManager() {
|
||
return this._layoutManager
|
||
}
|
||
GetMainRunningLayout() {
|
||
return this._layoutManager.GetMainRunningLayout()
|
||
}
|
||
GetTimelineManager() {
|
||
return this._timelineManager
|
||
}
|
||
GetTransitionManager() {
|
||
return this._transitionManager
|
||
}
|
||
GetAssetManager() {
|
||
return this._assetManager
|
||
}
|
||
LoadImage(opts) {
|
||
return this._assetManager.LoadImage(opts)
|
||
}
|
||
CreateInstance(objectClass, layer, x, y) {
|
||
return this.CreateInstanceFromData(objectClass, layer, false, x, y)
|
||
}
|
||
CreateInstanceFromData(instData_or_objectClass, layer, isStartupInstance, x, y, skipSiblings) {
|
||
let instData = null;
|
||
let objectClass = null;
|
||
if (instData_or_objectClass instanceof C3.ObjectClass) {
|
||
objectClass = instData_or_objectClass;
|
||
if (objectClass.IsFamily()) {
|
||
const members = objectClass.GetFamilyMembers();
|
||
const i = Math.floor(this.Random() * members.length);
|
||
objectClass = members[i]
|
||
}
|
||
instData = objectClass.GetDefaultInstanceData()
|
||
} else {
|
||
instData = instData_or_objectClass;
|
||
objectClass = this.GetObjectClassByIndex(instData[1])
|
||
}
|
||
const isWorld = objectClass.GetPlugin().IsWorldType();
|
||
if (this._isLoading && isWorld && !objectClass.IsOnLoaderLayout())
|
||
return null;
|
||
const originalLayer = layer;
|
||
if (!isWorld)
|
||
layer = null;
|
||
let uid;
|
||
if (isStartupInstance && !skipSiblings && instData && !this._instancesByUid.has(instData[2]))
|
||
uid = instData[2];
|
||
else
|
||
uid = this._nextUid++;
|
||
const worldData = instData ? instData[0] : null;
|
||
const inst = C3.New(C3.Instance, {
|
||
runtime: this,
|
||
objectType: objectClass,
|
||
layer: layer,
|
||
worldData,
|
||
instVarData: instData ? instData[3] : null,
|
||
uid: uid
|
||
});
|
||
this._instancesByUid.set(uid, inst);
|
||
let wi = null;
|
||
if (isWorld) {
|
||
wi = inst.GetWorldInfo();
|
||
if (typeof x !== "undefined" && typeof y !== "undefined") {
|
||
wi.SetX(x);
|
||
wi.SetY(y)
|
||
}
|
||
objectClass._SetAnyCollisionCellChanged(true)
|
||
}
|
||
if (layer) {
|
||
layer._AddInstance(inst, true);
|
||
if (layer.GetParallaxX() !== 1 || layer.GetParallaxY() !== 1)
|
||
objectClass._SetAnyInstanceParallaxed(true);
|
||
layer.GetLayout().MaybeLoadTexturesFor(objectClass)
|
||
}
|
||
this._objectCount++;
|
||
if (objectClass.IsInContainer() && !isStartupInstance && !skipSiblings) {
|
||
for (const containerType of objectClass.GetContainer().objectTypes()) {
|
||
if (containerType === objectClass)
|
||
continue;
|
||
const siblingInst = this.CreateInstanceFromData(containerType, originalLayer, false, wi ? wi.GetX() : x, wi ? wi.GetY() : y, true);
|
||
inst._AddSibling(siblingInst)
|
||
}
|
||
for (const s of inst.siblings()) {
|
||
s._AddSibling(inst);
|
||
for (const s2 of inst.siblings())
|
||
if (s !== s2)
|
||
s._AddSibling(s2)
|
||
}
|
||
}
|
||
objectClass._SetIIDsStale();
|
||
const instPropertyData = instData ? C3.cloneArray(instData[5]) : null;
|
||
const behPropertyData = instData ? instData[4].map(bp=>C3.cloneArray(bp)) : null;
|
||
const hasTilemap = isWorld && worldData && worldData.length === 14;
|
||
if (hasTilemap)
|
||
inst._SetHasTilemap();
|
||
inst._CreateSdkInstance(instPropertyData, behPropertyData);
|
||
if (hasTilemap) {
|
||
const tilemapData = worldData[13];
|
||
inst.GetSdkInstance().LoadTilemapData(tilemapData[2], tilemapData[0], tilemapData[1])
|
||
}
|
||
this._instancesPendingCreate.push(inst);
|
||
this._hasPendingInstances = true;
|
||
if (this.IsDebug())
|
||
C3Debugger.InstanceCreated(inst);
|
||
return inst
|
||
}
|
||
DestroyInstance(inst) {
|
||
if (this._instancesToReleaseAtEndOfTick.has(inst))
|
||
return;
|
||
const objectClass = inst.GetObjectClass();
|
||
let s = this._instancesPendingDestroy.get(objectClass);
|
||
if (s) {
|
||
if (s.has(inst))
|
||
return;
|
||
s.add(inst)
|
||
} else {
|
||
s = new Set;
|
||
s.add(inst);
|
||
this._instancesPendingDestroy.set(objectClass, s)
|
||
}
|
||
if (this.IsDebug())
|
||
C3Debugger.InstanceDestroyed(inst);
|
||
inst._MarkDestroyed();
|
||
this._hasPendingInstances = true;
|
||
if (inst.IsInContainer())
|
||
for (const s of inst.siblings())
|
||
this.DestroyInstance(s);
|
||
for (const c of inst.children())
|
||
if (c.GetDestroyWithParent())
|
||
this.DestroyInstance(c);
|
||
if (!this._layoutManager.IsEndingLayout() && !this._isLoadingState) {
|
||
const eventSheetManager = this.GetEventSheetManager();
|
||
eventSheetManager.BlockFlushingInstances(true);
|
||
inst._TriggerOnDestroyed();
|
||
eventSheetManager.BlockFlushingInstances(false)
|
||
}
|
||
inst._FireDestroyedScriptEvents(this._layoutManager.IsEndingLayout())
|
||
}
|
||
FlushPendingInstances() {
|
||
if (!this._hasPendingInstances)
|
||
return;
|
||
this._isFlushingPendingInstances = true;
|
||
this._FlushInstancesPendingCreate();
|
||
this._FlushInstancesPendingDestroy();
|
||
this._isFlushingPendingInstances = false;
|
||
this._hasPendingInstances = false;
|
||
this.UpdateRender()
|
||
}
|
||
_FlushInstancesPendingCreate() {
|
||
for (const inst of this._instancesPendingCreate) {
|
||
const objectType = inst.GetObjectClass();
|
||
objectType._AddInstance(inst);
|
||
for (const family of objectType.GetFamilies()) {
|
||
family._AddInstance(inst);
|
||
family._SetIIDsStale()
|
||
}
|
||
}
|
||
C3.clearArray(this._instancesPendingCreate)
|
||
}
|
||
_FlushInstancesPendingDestroy() {
|
||
this._dispatcher.SetDelayRemoveEventsEnabled(true);
|
||
for (const [objectClass,s] of this._instancesPendingDestroy.entries()) {
|
||
this._FlushInstancesPendingDestroyForObjectClass(objectClass, s);
|
||
s.clear()
|
||
}
|
||
this._instancesPendingDestroy.clear();
|
||
this._dispatcher.SetDelayRemoveEventsEnabled(false)
|
||
}
|
||
_FlushInstancesPendingDestroyForObjectClass(objectClass, s) {
|
||
for (const inst of s) {
|
||
const instanceDestroyEvent = this._eventObjects["instancedestroy"];
|
||
instanceDestroyEvent.instance = inst;
|
||
this._dispatcher.dispatchEvent(instanceDestroyEvent);
|
||
this._instancesByUid.delete(inst.GetUID());
|
||
const wi = inst.GetWorldInfo();
|
||
if (wi) {
|
||
wi._RemoveFromCollisionCells();
|
||
wi._RemoveFromRenderCells()
|
||
}
|
||
this._instancesToReleaseAtEndOfTick.add(inst);
|
||
this._objectCount--
|
||
}
|
||
C3.arrayRemoveAllInSet(objectClass.GetInstances(), s);
|
||
objectClass._SetIIDsStale();
|
||
this._instancesToReleaseAffectedObjectClasses.add(objectClass);
|
||
if (objectClass.GetInstances().length === 0)
|
||
objectClass._SetAnyInstanceParallaxed(false);
|
||
for (const family of objectClass.GetFamilies()) {
|
||
C3.arrayRemoveAllInSet(family.GetInstances(), s);
|
||
family._SetIIDsStale();
|
||
this._instancesToReleaseAffectedObjectClasses.add(family)
|
||
}
|
||
if (objectClass.GetPlugin().IsWorldType()) {
|
||
const layers = new Set([...s].map(i=>i.GetWorldInfo().GetLayer()));
|
||
for (const layer of layers)
|
||
layer._RemoveAllInstancesInSet(s)
|
||
}
|
||
}
|
||
_GetInstancesPendingCreate() {
|
||
return this._instancesPendingCreate
|
||
}
|
||
_GetNewUID() {
|
||
return this._nextUid++
|
||
}
|
||
_MapInstanceByUID(uid, inst) {
|
||
this._instancesByUid.set(uid, inst)
|
||
}
|
||
_OnWebGLContextLost() {
|
||
this._dispatcher.dispatchEvent(C3.New(C3.Event, "webglcontextlost"));
|
||
this.SetSuspended(true);
|
||
for (const objectClass of this._allObjectClasses)
|
||
if (!objectClass.IsFamily() && objectClass.HasLoadedTextures())
|
||
objectClass.ReleaseTextures();
|
||
const runningLayout = this.GetMainRunningLayout();
|
||
if (runningLayout)
|
||
runningLayout._OnWebGLContextLost();
|
||
C3.ImageInfo.OnWebGLContextLost();
|
||
C3.ImageAsset.OnWebGLContextLost()
|
||
}
|
||
async _OnWebGLContextRestored() {
|
||
await this.GetMainRunningLayout()._Load(null, this.GetWebGLRenderer());
|
||
this._dispatcher.dispatchEvent(C3.New(C3.Event, "webglcontextrestored"));
|
||
this.SetSuspended(false);
|
||
this.UpdateRender()
|
||
}
|
||
_OnVisibilityChange(e) {
|
||
this.SetSuspended(e["hidden"])
|
||
}
|
||
_OnWindowBlur(e) {
|
||
if (!this.IsPreview() || !this._pauseOnBlur || C3.Platform.IsMobile)
|
||
return;
|
||
if (!e.data["parentHasFocus"]) {
|
||
this.SetSuspended(true);
|
||
this._isPausedOnBlur = true
|
||
}
|
||
}
|
||
_OnWindowFocus() {
|
||
if (!this._isPausedOnBlur)
|
||
return;
|
||
this.SetSuspended(false);
|
||
this._isPausedOnBlur = false
|
||
}
|
||
_RequestAnimationFrame() {
|
||
const tickCallbacks = this._tickCallbacks;
|
||
if (this._framerateMode === "vsync") {
|
||
if (this._rafId === -1)
|
||
this._rafId = self.requestAnimationFrame(tickCallbacks.normal)
|
||
} else if (this._framerateMode === "unlimited-tick") {
|
||
if (this._ruafId === -1)
|
||
this._ruafId = C3.RequestUnlimitedAnimationFrame(tickCallbacks.tickOnly);
|
||
if (this._rafId === -1)
|
||
this._rafId = self.requestAnimationFrame(tickCallbacks.renderOnly)
|
||
} else if (this._ruafId === -1)
|
||
this._ruafId = C3.RequestUnlimitedAnimationFrame(tickCallbacks.normal)
|
||
}
|
||
_CancelAnimationFrame() {
|
||
if (this._rafId !== -1) {
|
||
self.cancelAnimationFrame(this._rafId);
|
||
this._rafId = -1
|
||
}
|
||
if (this._ruafId !== -1) {
|
||
C3.CancelUnlimitedAnimationFrame(this._ruafId);
|
||
this._ruafId = -1
|
||
}
|
||
}
|
||
IsSuspended() {
|
||
return this._suspendCount > 0
|
||
}
|
||
SetSuspended(s) {
|
||
const wasSuspended = this.IsSuspended();
|
||
this._suspendCount += s ? 1 : -1;
|
||
if (this._suspendCount < 0)
|
||
this._suspendCount = 0;
|
||
const isSuspended = this.IsSuspended();
|
||
if (!wasSuspended && isSuspended) {
|
||
console.log("[Construct 3] Suspending");
|
||
this._CancelAnimationFrame();
|
||
this._dispatcher.dispatchEvent(C3.New(C3.Event, "suspend"));
|
||
this.Trigger(C3.Plugins.System.Cnds.OnSuspend, null, null)
|
||
} else if (wasSuspended && !isSuspended) {
|
||
console.log("[Construct 3] Resuming");
|
||
const now = performance.now();
|
||
this._lastTickTime = now;
|
||
this._fpsLastTime = now;
|
||
this._fpsFrameCount = 0;
|
||
this._fps = 0;
|
||
this._mainThreadTime = 0;
|
||
this._mainThreadTimeCounter = 0;
|
||
this._dispatcher.dispatchEvent(C3.New(C3.Event, "resume"));
|
||
this.Trigger(C3.Plugins.System.Cnds.OnResume, null, null);
|
||
if (!this.HitBreakpoint())
|
||
this.Tick(now)
|
||
}
|
||
}
|
||
_AddBehInstToTick(behSdkInst) {
|
||
this._behInstsToTick.Add(behSdkInst)
|
||
}
|
||
_AddBehInstToPostTick(behSdkInst) {
|
||
this._behInstsToPostTick.Add(behSdkInst)
|
||
}
|
||
_AddBehInstToTick2(behSdkInst) {
|
||
this._behInstsToTick2.Add(behSdkInst)
|
||
}
|
||
_RemoveBehInstToTick(behSdkInst) {
|
||
this._behInstsToTick.Remove(behSdkInst)
|
||
}
|
||
_RemoveBehInstToPostTick(behSdkInst) {
|
||
this._behInstsToPostTick.Remove(behSdkInst)
|
||
}
|
||
_RemoveBehInstToTick2(behSdkInst) {
|
||
this._behInstsToTick2.Remove(behSdkInst)
|
||
}
|
||
_BehaviorTick() {
|
||
this._behInstsToTick.SetQueueingEnabled(true);
|
||
for (const bi of this._behInstsToTick)
|
||
bi.Tick();
|
||
this._behInstsToTick.SetQueueingEnabled(false)
|
||
}
|
||
_BehaviorPostTick() {
|
||
this._behInstsToPostTick.SetQueueingEnabled(true);
|
||
for (const bi of this._behInstsToPostTick)
|
||
bi.PostTick();
|
||
this._behInstsToPostTick.SetQueueingEnabled(false)
|
||
}
|
||
_BehaviorTick2() {
|
||
this._behInstsToTick2.SetQueueingEnabled(true);
|
||
for (const bi of this._behInstsToTick2)
|
||
bi.Tick2();
|
||
this._behInstsToTick2.SetQueueingEnabled(false)
|
||
}
|
||
*_DebugBehaviorTick() {
|
||
this._behInstsToTick.SetQueueingEnabled(true);
|
||
for (const bi of this._behInstsToTick) {
|
||
const ret = bi.Tick();
|
||
if (C3.IsIterator(ret))
|
||
yield*ret
|
||
}
|
||
this._behInstsToTick.SetQueueingEnabled(false)
|
||
}
|
||
*_DebugBehaviorPostTick() {
|
||
this._behInstsToPostTick.SetQueueingEnabled(true);
|
||
for (const bi of this._behInstsToPostTick) {
|
||
const ret = bi.PostTick();
|
||
if (C3.IsIterator(ret))
|
||
yield*ret
|
||
}
|
||
this._behInstsToPostTick.SetQueueingEnabled(false)
|
||
}
|
||
*_DebugBehaviorTick2() {
|
||
this._behInstsToTick2.SetQueueingEnabled(true);
|
||
for (const bi of this._behInstsToTick2) {
|
||
const ret = bi.Tick2();
|
||
if (C3.IsIterator(ret))
|
||
yield*ret
|
||
}
|
||
this._behInstsToTick2.SetQueueingEnabled(false)
|
||
}
|
||
async Tick(timestamp, isDebugStep, mode) {
|
||
this._hasStartedTicking = true;
|
||
const isBackgroundWake = mode === "background-wake";
|
||
const shouldRender = mode !== "background-wake" && mode !== "skip-render";
|
||
if (!this._hasStarted || this.IsSuspended() && !isDebugStep && !isBackgroundWake)
|
||
return;
|
||
const startTime = performance.now();
|
||
this._isInTick = true;
|
||
if (!timestamp)
|
||
timestamp = startTime;
|
||
this._MeasureDt(timestamp);
|
||
const beforePreTickRet = this.Step_BeforePreTick();
|
||
if (this.IsDebugging())
|
||
await beforePreTickRet;
|
||
const pretickRet = this._dispatcher.dispatchEventAndWait_AsyncOptional(this._eventObjects["pretick"]);
|
||
if (pretickRet instanceof Promise)
|
||
await pretickRet;
|
||
const afterPreTickRet = this.Step_AfterPreTick();
|
||
if (this.IsDebugging())
|
||
await afterPreTickRet;
|
||
if (this._NeedsHandleSaveOrLoad())
|
||
await this._HandleSaveOrLoad();
|
||
if (this.GetLayoutManager().IsPendingChangeMainLayout())
|
||
await this._MaybeChangeLayout();
|
||
const runEventsRet = this.Step_RunEventsEtc();
|
||
if (this.IsDebugging())
|
||
await runEventsRet;
|
||
if (shouldRender)
|
||
this.Render();
|
||
if (!this.IsSuspended() && !isBackgroundWake)
|
||
this._RequestAnimationFrame();
|
||
this._tickCount++;
|
||
this._tickCountNoSave++;
|
||
this._execCount++;
|
||
this._isInTick = false;
|
||
this._mainThreadTimeCounter += performance.now() - startTime
|
||
}
|
||
async Step_BeforePreTick() {
|
||
const eventSheetManager = this._eventSheetManager;
|
||
const isDebug = this.IsDebug();
|
||
this.FlushPendingInstances();
|
||
eventSheetManager.BlockFlushingInstances(true);
|
||
this.PushCurrentLayout(this.GetMainRunningLayout());
|
||
if (isDebug)
|
||
C3Debugger.StartMeasuringTime();
|
||
if (this.IsDebugging())
|
||
await eventSheetManager.DebugRunScheduledWaits();
|
||
else
|
||
eventSheetManager.RunScheduledWaits();
|
||
if (isDebug)
|
||
C3Debugger.AddEventsTime();
|
||
this.PopCurrentLayout();
|
||
eventSheetManager.BlockFlushingInstances(false);
|
||
this.FlushPendingInstances();
|
||
eventSheetManager.BlockFlushingInstances(true)
|
||
}
|
||
async Step_AfterPreTick() {
|
||
const isDebug = this.IsDebug();
|
||
const isDebugging = this.IsDebugging();
|
||
const dispatcher = this._dispatcher;
|
||
const eventObjects = this._eventObjects;
|
||
const userScriptEventObjects = this._userScriptEventObjects;
|
||
if (isDebug)
|
||
C3Debugger.StartMeasuringTime();
|
||
if (isDebugging)
|
||
await this.DebugIterateAndBreak(this._DebugBehaviorTick());
|
||
else
|
||
this._BehaviorTick();
|
||
if (isDebugging)
|
||
await this.DebugIterateAndBreak(this._DebugBehaviorPostTick());
|
||
else
|
||
this._BehaviorPostTick();
|
||
if (isDebug)
|
||
C3Debugger.AddBehaviorTickTime();
|
||
if (isDebug)
|
||
C3Debugger.StartMeasuringTime();
|
||
if (isDebugging)
|
||
await this.DebugFireGeneratorEventAndBreak(eventObjects["tick"]);
|
||
else
|
||
dispatcher.dispatchEvent(eventObjects["tick"]);
|
||
if (isDebug)
|
||
C3Debugger.AddPluginTickTime();
|
||
this._eventSheetManager.BlockFlushingInstances(false);
|
||
this.DispatchUserScriptEvent(userScriptEventObjects["tick"])
|
||
}
|
||
async Step_RunEventsEtc() {
|
||
const eventSheetManager = this._eventSheetManager;
|
||
const dispatcher = this._dispatcher;
|
||
const eventObjects = this._eventObjects;
|
||
const isDebug = this.IsDebug();
|
||
const isDebugging = this.IsDebugging();
|
||
if (isDebug)
|
||
C3Debugger.StartMeasuringTime();
|
||
if (isDebugging)
|
||
await eventSheetManager.DebugRunEvents(this._layoutManager);
|
||
else
|
||
eventSheetManager.RunEvents(this._layoutManager);
|
||
if (isDebug)
|
||
C3Debugger.AddEventsTime();
|
||
this._collisionEngine.ClearRegisteredCollisions();
|
||
if (this._instancesToReleaseAtEndOfTick.size > 0) {
|
||
dispatcher.SetDelayRemoveEventsEnabled(true);
|
||
for (const objectClass of this._instancesToReleaseAffectedObjectClasses)
|
||
objectClass.GetSolStack().RemoveInstances(this._instancesToReleaseAtEndOfTick);
|
||
this._instancesToReleaseAffectedObjectClasses.clear();
|
||
this._eventSheetManager.RemoveInstancesFromScheduledWaits(this._instancesToReleaseAtEndOfTick);
|
||
for (const inst of this._instancesToReleaseAtEndOfTick)
|
||
inst.Release();
|
||
this._instancesToReleaseAtEndOfTick.clear();
|
||
dispatcher.SetDelayRemoveEventsEnabled(false)
|
||
}
|
||
this._isLayoutFirstTick = false;
|
||
eventSheetManager.BlockFlushingInstances(true);
|
||
if (isDebug)
|
||
C3Debugger.StartMeasuringTime();
|
||
if (isDebugging)
|
||
await this.DebugIterateAndBreak(this._DebugBehaviorTick2());
|
||
else
|
||
this._BehaviorTick2();
|
||
if (isDebug)
|
||
C3Debugger.AddBehaviorTickTime();
|
||
if (isDebug)
|
||
C3Debugger.StartMeasuringTime();
|
||
if (isDebugging)
|
||
await this.DebugFireGeneratorEventAndBreak(eventObjects["tick2"]);
|
||
else
|
||
dispatcher.dispatchEvent(eventObjects["tick2"]);
|
||
if (isDebug)
|
||
C3Debugger.AddPluginTickTime();
|
||
eventSheetManager.BlockFlushingInstances(false);
|
||
if (isDebugging)
|
||
await eventSheetManager.RunQueuedDebugTriggersAsync()
|
||
}
|
||
async _MaybeChangeLayout() {
|
||
const layoutManager = this.GetLayoutManager();
|
||
let i = 0;
|
||
while (layoutManager.IsPendingChangeMainLayout() && i++ < 10)
|
||
await this._DoChangeLayout(layoutManager.GetPendingChangeMainLayout())
|
||
}
|
||
_MeasureDt(timestamp) {
|
||
if (this._lastTickTime !== 0) {
|
||
const msDiff = Math.max(timestamp - this._lastTickTime, 0);
|
||
this._dt1 = msDiff / 1E3;
|
||
const maxDt1 = 1 / this._minimumFramerate;
|
||
if (this._dt1 > .5)
|
||
this._dt1 = 0;
|
||
else if (this._dt1 > maxDt1)
|
||
this._dt1 = maxDt1
|
||
}
|
||
this._lastTickTime = timestamp;
|
||
this._dt = this._dt1 * this._timeScale;
|
||
this._gameTime.Add(this._dt);
|
||
this._wallTime.Add(this._dt1);
|
||
if (this._canvasManager)
|
||
this._canvasManager._UpdateTick();
|
||
if (timestamp - this._fpsLastTime >= 1E3) {
|
||
this._fpsLastTime += 1E3;
|
||
if (timestamp - this._fpsLastTime >= 1E3)
|
||
this._fpsLastTime = timestamp;
|
||
this._fps = this._fpsFrameCount;
|
||
this._fpsFrameCount = 0;
|
||
this._mainThreadTime = Math.min(this._mainThreadTimeCounter / 1E3, 1);
|
||
this._mainThreadTimeCounter = 0;
|
||
if (this._canvasManager)
|
||
this._canvasManager._Update1sFrameRange();
|
||
this._collisionEngine._Update1sStats();
|
||
if (this.IsDebug())
|
||
C3Debugger.Update1sPerfStats()
|
||
}
|
||
this._fpsFrameCount++
|
||
}
|
||
async _DoChangeLayout(changeToLayout) {
|
||
const dispatcher = this._dispatcher;
|
||
const layoutManager = this.GetLayoutManager();
|
||
const prevLayout = layoutManager.GetMainRunningLayout();
|
||
await prevLayout._StopRunning();
|
||
prevLayout._Unload(changeToLayout, this.GetWebGLRenderer());
|
||
if (prevLayout === changeToLayout)
|
||
this._eventSheetManager.ClearAllScheduledWaits();
|
||
this._collisionEngine.ClearRegisteredCollisions();
|
||
dispatcher.dispatchEvent(this._eventObjects["beforelayoutchange"]);
|
||
C3.Asyncify.SetHighThroughputMode(true);
|
||
await changeToLayout._Load(prevLayout, this.GetWebGLRenderer());
|
||
C3.Asyncify.SetHighThroughputMode(false);
|
||
await changeToLayout._StartRunning(false);
|
||
dispatcher.dispatchEvent(this._eventObjects["layoutchange"]);
|
||
this.UpdateRender();
|
||
this._isLayoutFirstTick = true;
|
||
this.FlushPendingInstances()
|
||
}
|
||
UpdateRender() {
|
||
this._needRender = true
|
||
}
|
||
GetWebGLRenderer() {
|
||
if (!this._canvasManager)
|
||
return null;
|
||
return this._canvasManager.GetWebGLRenderer()
|
||
}
|
||
GetRenderer() {
|
||
return this.GetWebGLRenderer()
|
||
}
|
||
Render() {
|
||
if (!this._canvasManager || this._canvasManager.IsWebGLContextLost())
|
||
return;
|
||
const renderer = this.GetWebGLRenderer();
|
||
renderer.Start();
|
||
renderer.CheckForQueryResults();
|
||
if (!this._needRender) {
|
||
renderer.IncrementFrameNumber();
|
||
return
|
||
}
|
||
const isDebug = this.IsDebug();
|
||
if (isDebug)
|
||
C3Debugger.StartMeasuringTime();
|
||
this._needRender = false;
|
||
let frameQuery = null;
|
||
if (renderer.SupportsGPUProfiling()) {
|
||
frameQuery = this._canvasManager.GetGPUFrameTimingsBuffer().AddTimeElapsedQuery();
|
||
renderer.StartQuery(frameQuery)
|
||
}
|
||
renderer.SetTextureFillMode();
|
||
renderer.SetAlphaBlend();
|
||
renderer.SetColorRgba(1, 1, 1, 1);
|
||
renderer.SetRenderTarget(null);
|
||
renderer.SetTexture(null);
|
||
const layout = this._layoutManager.GetMainRunningLayout();
|
||
layout.Draw(renderer);
|
||
if (frameQuery)
|
||
renderer.EndQuery(frameQuery);
|
||
renderer.Finish();
|
||
if (isDebug) {
|
||
C3Debugger.AddDrawCallsTime();
|
||
C3Debugger.UpdateInspectHighlight()
|
||
}
|
||
if (this._canvasManager)
|
||
this._canvasManager._MaybeTakeSnapshot()
|
||
}
|
||
Trigger(method, inst, behaviorType) {
|
||
if (!this._hasStarted)
|
||
return false;
|
||
const isTopLevel = !this._isInTick && !this._eventSheetManager.IsInTrigger();
|
||
let startTime = 0;
|
||
if (isTopLevel)
|
||
startTime = performance.now();
|
||
const isDebug = this.IsDebug();
|
||
if (isDebug)
|
||
this.SetDebuggingEnabled(false);
|
||
const ret = this._eventSheetManager._Trigger(this._layoutManager, method, inst, behaviorType);
|
||
if (isTopLevel) {
|
||
const triggerTime = performance.now() - startTime;
|
||
this._mainThreadTimeCounter += triggerTime;
|
||
if (isDebug)
|
||
C3Debugger.AddTriggersTime(triggerTime)
|
||
}
|
||
if (isDebug)
|
||
this.SetDebuggingEnabled(true);
|
||
return ret
|
||
}
|
||
DebugTrigger(method, inst, behaviorType) {
|
||
if (!this.IsDebug())
|
||
return this.Trigger(method, inst, behaviorType);
|
||
if (this.HitBreakpoint())
|
||
throw new Error("called DebugTrigger() while stopped on breakpoint");
|
||
if (!this._isInTick && !this._eventSheetManager.IsInTrigger())
|
||
throw new Error("called DebugTrigger() outside of event code - use TriggerAsync() instead");
|
||
return this._eventSheetManager._DebugTrigger(this._layoutManager, method, inst, behaviorType)
|
||
}
|
||
async TriggerAsync(method, inst, behaviorType) {
|
||
if (!this.IsDebugging())
|
||
return this.Trigger(method, inst, behaviorType);
|
||
if (!this._hasStarted)
|
||
return false;
|
||
if (this.HitBreakpoint())
|
||
return this._eventSheetManager.QueueDebugTrigger(method, inst, behaviorType);
|
||
if (!this.GetMainRunningLayout())
|
||
return this._eventSheetManager.QueueTrigger(method, inst, behaviorType);
|
||
const startTime = performance.now();
|
||
const iter = this._eventSheetManager._DebugTrigger(this._layoutManager, method, inst, behaviorType);
|
||
let result = iter.next();
|
||
while (!result.done) {
|
||
await this.DebugBreak(result.value);
|
||
result = iter.next()
|
||
}
|
||
if (!this.IsSuspended() && !this._eventSheetManager.IsInTrigger()) {
|
||
await this._eventSheetManager.RunQueuedDebugTriggersAsync();
|
||
if (this._hasStartedTicking && !this._isInTick)
|
||
this._RequestAnimationFrame()
|
||
}
|
||
this._mainThreadTimeCounter += performance.now() - startTime;
|
||
return result.value
|
||
}
|
||
FastTrigger(method, inst, value) {
|
||
const isDebug = this.IsDebug();
|
||
if (isDebug)
|
||
this.SetDebuggingEnabled(false);
|
||
const ret = this._eventSheetManager._FastTrigger(this._layoutManager, method, inst, value);
|
||
if (isDebug)
|
||
this.SetDebuggingEnabled(true);
|
||
return ret
|
||
}
|
||
DebugFastTrigger(method, inst, value) {
|
||
return this._eventSheetManager._DebugFastTrigger(this._layoutManager, method, inst, value)
|
||
}
|
||
ScheduleTriggers(f) {
|
||
return this._scheduleTriggersThrottle.Add(f)
|
||
}
|
||
PushCurrentLayout(layout) {
|
||
this._currentLayoutStack.push(layout)
|
||
}
|
||
PopCurrentLayout() {
|
||
if (!this._currentLayoutStack.length)
|
||
throw new Error("layout stack empty");
|
||
this._currentLayoutStack.pop()
|
||
}
|
||
GetCurrentLayout() {
|
||
if (!this._currentLayoutStack.length)
|
||
return this.GetMainRunningLayout();
|
||
return this._currentLayoutStack[this._currentLayoutStack.length - 1]
|
||
}
|
||
GetDt(inst) {
|
||
if (!inst || inst.GetTimeScale() === -1)
|
||
return this._dt;
|
||
return this._dt1 * inst.GetTimeScale()
|
||
}
|
||
_GetDtFast() {
|
||
return this._dt
|
||
}
|
||
GetDt1() {
|
||
return this._dt1
|
||
}
|
||
GetTimeScale() {
|
||
return this._timeScale
|
||
}
|
||
SetTimeScale(ts) {
|
||
if (isNaN(ts) || ts < 0)
|
||
ts = 0;
|
||
this._timeScale = ts
|
||
}
|
||
SetMinimumFramerate(fps) {
|
||
this._minimumFramerate = C3.clamp(fps, 1, 120)
|
||
}
|
||
GetMinimumFramerate() {
|
||
return this._minimumFramerate
|
||
}
|
||
GetFPS() {
|
||
return this._fps
|
||
}
|
||
GetMainThreadTime() {
|
||
return this._mainThreadTime
|
||
}
|
||
GetStartTime() {
|
||
return this._startTime
|
||
}
|
||
GetGameTime() {
|
||
return this._gameTime.Get()
|
||
}
|
||
GetWallTime() {
|
||
return this._wallTime.Get()
|
||
}
|
||
GetTickCount() {
|
||
return this._tickCount
|
||
}
|
||
GetTickCountNoSave() {
|
||
return this._tickCountNoSave
|
||
}
|
||
IncrementExecCount() {
|
||
++this._execCount
|
||
}
|
||
GetExecCount() {
|
||
return this._execCount
|
||
}
|
||
GetObjectCount() {
|
||
return this._objectCount
|
||
}
|
||
GetProjectName() {
|
||
return this._projectName
|
||
}
|
||
GetProjectVersion() {
|
||
return this._projectVersion
|
||
}
|
||
GetProjectUniqueId() {
|
||
return this._projectUniqueId
|
||
}
|
||
GetAppId() {
|
||
return this._appId
|
||
}
|
||
GetInstanceByUID(uid) {
|
||
if (this._isLoadingState)
|
||
throw new Error("cannot call while loading state - wait until afterload event");
|
||
return this._instancesByUid.get(uid) || null
|
||
}
|
||
_RefreshUidMap() {
|
||
this._instancesByUid.clear();
|
||
for (const objectClass of this._allObjectClasses) {
|
||
if (objectClass.IsFamily())
|
||
continue;
|
||
for (const inst of objectClass.GetInstances())
|
||
this._instancesByUid.set(inst.GetUID(), inst)
|
||
}
|
||
}
|
||
IsPreview() {
|
||
return this._exportType === "preview"
|
||
}
|
||
IsDebug() {
|
||
return this._isDebug
|
||
}
|
||
GetExportType() {
|
||
return this._exportType
|
||
}
|
||
IsCordova() {
|
||
return this._exportType === "cordova"
|
||
}
|
||
IsAndroidWebView() {
|
||
return C3.Platform.OS === "Android" && (this._exportType === "cordova" || this._exportType === "playable-ad" || this._exportType === "instant-games")
|
||
}
|
||
IsiOSCordova() {
|
||
return this._isiOSCordova
|
||
}
|
||
IsiOSWebView() {
|
||
return this._isiOSWebView
|
||
}
|
||
GetCollisionEngine() {
|
||
return this._collisionEngine
|
||
}
|
||
GetSolidBehavior() {
|
||
return this._pluginManager.GetSolidBehavior()
|
||
}
|
||
GetJumpthruBehavior() {
|
||
return this._pluginManager.GetJumpthruBehavior()
|
||
}
|
||
IsLayoutFirstTick() {
|
||
return this._isLayoutFirstTick
|
||
}
|
||
SetPixelRoundingEnabled(e) {
|
||
e = !!e;
|
||
if (this._isPixelRoundingEnabled === e)
|
||
return;
|
||
this._isPixelRoundingEnabled = e;
|
||
this.UpdateRender()
|
||
}
|
||
IsPixelRoundingEnabled() {
|
||
return this._isPixelRoundingEnabled
|
||
}
|
||
SaveToSlot(slotName) {
|
||
this._saveToSlotName = slotName
|
||
}
|
||
LoadFromSlot(slotName) {
|
||
this._loadFromSlotName = slotName
|
||
}
|
||
LoadFromJsonString(str) {
|
||
this._loadFromJson = str
|
||
}
|
||
GetLastSaveJsonString() {
|
||
return this._lastSaveJson
|
||
}
|
||
_NeedsHandleSaveOrLoad() {
|
||
return !!(this._saveToSlotName || this._loadFromSlotName || this._loadFromJson !== null)
|
||
}
|
||
async _HandleSaveOrLoad() {
|
||
if (this._saveToSlotName) {
|
||
this.FlushPendingInstances();
|
||
await this._DoSaveToSlot(this._saveToSlotName);
|
||
this._ClearSaveOrLoad()
|
||
}
|
||
if (this._loadFromSlotName) {
|
||
await this._DoLoadFromSlot(this._loadFromSlotName);
|
||
this._ClearSaveOrLoad();
|
||
if (this.IsDebug())
|
||
C3Debugger.StepIfPausedInDebugger()
|
||
}
|
||
if (this._loadFromJson !== null) {
|
||
this.FlushPendingInstances();
|
||
try {
|
||
await this._DoLoadFromJsonString(this._loadFromJson);
|
||
this._lastSaveJson = this._loadFromJson;
|
||
await this.TriggerAsync(C3.Plugins.System.Cnds.OnLoadComplete, null);
|
||
this._lastSaveJson = ""
|
||
} catch (err) {
|
||
console.error("[Construct 3] Failed to load state from JSON string: ", err);
|
||
await this.TriggerAsync(C3.Plugins.System.Cnds.OnLoadFailed, null)
|
||
}
|
||
this._ClearSaveOrLoad()
|
||
}
|
||
}
|
||
_ClearSaveOrLoad() {
|
||
this._saveToSlotName = "";
|
||
this._loadFromSlotName = "";
|
||
this._loadFromJson = null
|
||
}
|
||
_GetProjectStorage() {
|
||
if (!this._projectStorage)
|
||
this._projectStorage = localforage.createInstance({
|
||
name: "c3-localstorage-" + this.GetProjectUniqueId(),
|
||
description: this.GetProjectName()
|
||
});
|
||
return this._projectStorage
|
||
}
|
||
_GetSavegamesStorage() {
|
||
if (!this._savegamesStorage)
|
||
this._savegamesStorage = localforage.createInstance({
|
||
name: "c3-savegames-" + this.GetProjectUniqueId(),
|
||
description: this.GetProjectName()
|
||
});
|
||
return this._savegamesStorage
|
||
}
|
||
async _DoSaveToSlot(slotName) {
|
||
const saveJson = await this._SaveToJsonString();
|
||
try {
|
||
await this._GetSavegamesStorage().setItem(slotName, saveJson);
|
||
console.log("[Construct 3] Saved state to storage (" + saveJson.length + " chars)");
|
||
this._lastSaveJson = saveJson;
|
||
await this.TriggerAsync(C3.Plugins.System.Cnds.OnSaveComplete, null);
|
||
this._lastSaveJson = ""
|
||
} catch (err) {
|
||
console.error("[Construct 3] Failed to save state to storage: ", err);
|
||
await this.TriggerAsync(C3.Plugins.System.Cnds.OnSaveFailed, null)
|
||
}
|
||
}
|
||
async _DoLoadFromSlot(slotName) {
|
||
try {
|
||
const loadJson = await this._GetSavegamesStorage().getItem(slotName);
|
||
if (!loadJson)
|
||
throw new Error("empty slot");
|
||
console.log("[Construct 3] Loaded state from storage (" + loadJson.length + " chars)");
|
||
await this._DoLoadFromJsonString(loadJson);
|
||
this._lastSaveJson = loadJson;
|
||
await this.TriggerAsync(C3.Plugins.System.Cnds.OnLoadComplete, null);
|
||
this._lastSaveJson = ""
|
||
} catch (err) {
|
||
console.error("[Construct 3] Failed to load state from storage: ", err);
|
||
await this.TriggerAsync(C3.Plugins.System.Cnds.OnLoadFailed, null)
|
||
}
|
||
}
|
||
async _SaveToJsonString() {
|
||
const o = {
|
||
"c3save": true,
|
||
"version": 1,
|
||
"rt": {
|
||
"time": this.GetGameTime(),
|
||
"walltime": this.GetWallTime(),
|
||
"timescale": this.GetTimeScale(),
|
||
"tickcount": this.GetTickCount(),
|
||
"execcount": this.GetExecCount(),
|
||
"next_uid": this._nextUid,
|
||
"running_layout": this.GetMainRunningLayout().GetSID(),
|
||
"start_time_offset": Date.now() - this._startTime
|
||
},
|
||
"types": {},
|
||
"layouts": {},
|
||
"events": this._eventSheetManager._SaveToJson(),
|
||
"timelines": this._timelineManager._SaveToJson(),
|
||
"user_script_data": null
|
||
};
|
||
for (const objectClass of this._allObjectClasses) {
|
||
if (objectClass.IsFamily() || objectClass.HasNoSaveBehavior())
|
||
continue;
|
||
o["types"][objectClass.GetSID().toString()] = objectClass._SaveToJson()
|
||
}
|
||
for (const layout of this._layoutManager.GetAllLayouts())
|
||
o["layouts"][layout.GetSID().toString()] = layout._SaveToJson();
|
||
const saveEvent = this._CreateUserScriptEvent("save");
|
||
saveEvent.saveData = null;
|
||
await this.DispatchUserScriptEventAsyncWait(saveEvent);
|
||
o["user_script_data"] = saveEvent.saveData;
|
||
return JSON.stringify(o)
|
||
}
|
||
IsLoadingState() {
|
||
return this._isLoadingState
|
||
}
|
||
_TriggerOnCreateAfterLoad(arr) {
|
||
C3.shallowAssignArray(this._triggerOnCreateAfterLoad, arr)
|
||
}
|
||
async _DoLoadFromJsonString(jsonStr) {
|
||
const o = JSON.parse(jsonStr);
|
||
if (o["c2save"])
|
||
throw new Error("C2 saves are incompatible with C3 runtime");
|
||
if (!o["c3save"])
|
||
throw new Error("not valid C3 save data");
|
||
if (o["version"] > 1)
|
||
throw new Error("C3 save data from future version");
|
||
this._isLoadingState = true;
|
||
const rt = o["rt"];
|
||
this._gameTime.Set(rt["time"]);
|
||
this._wallTime.Set(rt["walltime"]);
|
||
this._timeScale = rt["timescale"];
|
||
this._tickCount = rt["tickcount"];
|
||
this._execCount = rt["execcount"];
|
||
this._startTime = Date.now() - rt["start_time_offset"];
|
||
const layoutSid = rt["running_layout"];
|
||
if (layoutSid !== this.GetMainRunningLayout().GetSID()) {
|
||
const changeToLayout = this._layoutManager.GetLayoutBySID(layoutSid);
|
||
if (changeToLayout)
|
||
await this._DoChangeLayout(changeToLayout);
|
||
else
|
||
return
|
||
}
|
||
for (const [sidStr,data] of Object.entries(o["types"])) {
|
||
const sid = parseInt(sidStr, 10);
|
||
const objectClass = this.GetObjectClassBySID(sid);
|
||
if (!objectClass || objectClass.IsFamily() || objectClass.HasNoSaveBehavior())
|
||
continue;
|
||
objectClass._LoadFromJson(data)
|
||
}
|
||
this.FlushPendingInstances();
|
||
this._RefreshUidMap();
|
||
this._isLoadingState = false;
|
||
this._nextUid = rt["next_uid"];
|
||
for (const [sidStr,data] of Object.entries(o["layouts"])) {
|
||
const sid = parseInt(sidStr, 10);
|
||
const layout = this._layoutManager.GetLayoutBySID(sid);
|
||
if (!layout)
|
||
continue;
|
||
layout._LoadFromJson(data)
|
||
}
|
||
this._eventSheetManager._LoadFromJson(o["events"]);
|
||
for (const inst of this._triggerOnCreateAfterLoad) {
|
||
inst._TriggerOnCreated();
|
||
inst.SetupInitialSceneGraphConnections()
|
||
}
|
||
C3.clearArray(this._triggerOnCreateAfterLoad);
|
||
for (const objectClass of this._allObjectClasses) {
|
||
if (objectClass.IsFamily() || !objectClass.IsInContainer())
|
||
continue;
|
||
for (const inst of objectClass.GetInstances()) {
|
||
const iid = inst.GetIID();
|
||
for (const otherType of objectClass.GetContainer().objectTypes()) {
|
||
if (otherType === objectClass)
|
||
continue;
|
||
const otherInstances = otherType.GetInstances();
|
||
if (iid < 0 || iid >= otherInstances.length)
|
||
throw new Error("missing sibling instance");
|
||
inst._AddSibling(otherInstances[iid])
|
||
}
|
||
}
|
||
}
|
||
this._timelineManager._LoadFromJson(o["timelines"]);
|
||
this._dispatcher.dispatchEvent(C3.New(C3.Event, "afterload"));
|
||
const loadEvent = this._CreateUserScriptEvent("load");
|
||
loadEvent.saveData = o["user_script_data"];
|
||
await this.DispatchUserScriptEventAsyncWait(loadEvent);
|
||
this.UpdateRender()
|
||
}
|
||
async AddJobWorkerScripts(scripts) {
|
||
const blobs = await Promise.all(scripts.map(url=>this._assetManager.FetchBlob(url)));
|
||
const blobUrls = blobs.map(b=>URL.createObjectURL(b));
|
||
this._jobScheduler.ImportScriptsToJobWorkers(blobUrls)
|
||
}
|
||
AddJobWorkerBlob(blob, id) {
|
||
this._jobScheduler.SendBlobToJobWorkers(blob, id)
|
||
}
|
||
AddJobWorkerBuffer(buffer, id) {
|
||
this._jobScheduler.SendBufferToJobWorkers(buffer, id)
|
||
}
|
||
AddJob(type, params, transferables) {
|
||
return this._jobScheduler.AddJob(type, params, transferables)
|
||
}
|
||
BroadcastJob(type, params, transferables) {
|
||
return this._jobScheduler.BroadcastJob(type, params, transferables)
|
||
}
|
||
InvokeDownload(url, filename) {
|
||
this.PostComponentMessageToDOM("runtime", "invoke-download", {
|
||
"url": url,
|
||
"filename": filename
|
||
})
|
||
}
|
||
async RasterSvgImage(blob, imageWidth, imageHeight, surfaceWidth, surfaceHeight, imageBitmapOpts) {
|
||
surfaceWidth = surfaceWidth || imageWidth;
|
||
surfaceHeight = surfaceHeight || imageHeight;
|
||
if (this.IsInWorker()) {
|
||
const result = await this.PostComponentMessageToDOMAsync("runtime", "raster-svg-image", {
|
||
"blob": blob,
|
||
"imageWidth": imageWidth,
|
||
"imageHeight": imageHeight,
|
||
"surfaceWidth": surfaceWidth,
|
||
"surfaceHeight": surfaceHeight,
|
||
"imageBitmapOpts": imageBitmapOpts
|
||
});
|
||
return result["imageBitmap"]
|
||
} else {
|
||
const canvas = await self["C3_RasterSvgImageBlob"](blob, imageWidth, imageHeight, surfaceWidth, surfaceHeight);
|
||
if (imageBitmapOpts)
|
||
return await self.createImageBitmap(canvas, imageBitmapOpts);
|
||
else
|
||
return canvas
|
||
}
|
||
}
|
||
async GetSvgImageSize(blob) {
|
||
if (this.IsInWorker())
|
||
return await this.PostComponentMessageToDOMAsync("runtime", "get-svg-image-size", {
|
||
"blob": blob
|
||
});
|
||
else
|
||
return await self["C3_GetSvgImageSize"](blob)
|
||
}
|
||
RequestDeviceOrientationEvent() {
|
||
if (this._didRequestDeviceOrientationEvent)
|
||
return;
|
||
this._didRequestDeviceOrientationEvent = true;
|
||
this.PostComponentMessageToDOM("runtime", "enable-device-orientation")
|
||
}
|
||
RequestDeviceMotionEvent() {
|
||
if (this._didRequestDeviceMotionEvent)
|
||
return;
|
||
this._didRequestDeviceMotionEvent = true;
|
||
this.PostComponentMessageToDOM("runtime", "enable-device-motion")
|
||
}
|
||
Random() {
|
||
return this._randomNumberCallback()
|
||
}
|
||
SetRandomNumberGeneratorCallback(f) {
|
||
this._randomNumberCallback = f
|
||
}
|
||
_GetRemotePreviewStatusInfo() {
|
||
return {
|
||
"fps": this.GetFPS(),
|
||
"cpu": this.GetMainThreadTime(),
|
||
"gpu": this.GetGPUUtilisation(),
|
||
"layout": this.GetMainRunningLayout() ? this.GetMainRunningLayout().GetName() : "",
|
||
"renderer": this.GetWebGLRenderer().GetUnmaskedRenderer()
|
||
}
|
||
}
|
||
HitBreakpoint() {
|
||
if (!this.IsDebug())
|
||
return false;
|
||
return C3Debugger.HitBreakpoint()
|
||
}
|
||
DebugBreak(eventObject) {
|
||
if (!this.IsDebugging())
|
||
return Promise.resolve();
|
||
return C3Debugger.DebugBreak(eventObject)
|
||
}
|
||
DebugBreakNext() {
|
||
if (!this.IsDebugging())
|
||
return false;
|
||
return C3Debugger.BreakNext()
|
||
}
|
||
SetDebugBreakpointsEnabled(e) {
|
||
this._breakpointsEnabled = !!e;
|
||
this._UpdateDebuggingFlag()
|
||
}
|
||
AreDebugBreakpointsEnabled() {
|
||
return this._breakpointsEnabled
|
||
}
|
||
IsDebugging() {
|
||
return this._isDebugging
|
||
}
|
||
SetDebuggingEnabled(d) {
|
||
if (d)
|
||
this._debuggingDisabled--;
|
||
else
|
||
this._debuggingDisabled++;
|
||
this._UpdateDebuggingFlag()
|
||
}
|
||
_UpdateDebuggingFlag() {
|
||
this._isDebugging = this.IsDebug() && this._breakpointsEnabled && this._debuggingDisabled === 0
|
||
}
|
||
IsCPUProfiling() {
|
||
return this.IsDebug() && C3Debugger.IsCPUProfiling()
|
||
}
|
||
IsGPUProfiling() {
|
||
return this.IsDebug() && this.GetWebGLRenderer().SupportsGPUProfiling() && C3Debugger.IsGPUProfiling()
|
||
}
|
||
async DebugIterateAndBreak(iter) {
|
||
if (!iter)
|
||
return;
|
||
for (const breakEventObject of iter)
|
||
await this.DebugBreak(breakEventObject)
|
||
}
|
||
DebugFireGeneratorEventAndBreak(event) {
|
||
return this.DebugIterateAndBreak(this._dispatcher.dispatchGeneratorEvent(event))
|
||
}
|
||
_InvokeFunctionFromJS(e) {
|
||
return this._eventSheetManager._InvokeFunctionFromJS(e["name"], e["params"])
|
||
}
|
||
GetIRuntime() {
|
||
return this._iRuntime
|
||
}
|
||
_CreateUserScriptEvent(name) {
|
||
const e = C3.New(C3.Event, name, false);
|
||
e.runtime = this._iRuntime;
|
||
return e
|
||
}
|
||
_InitScriptInterfaces() {
|
||
const objectDescriptors = {};
|
||
for (const objectClass of this._allObjectClasses)
|
||
objectDescriptors[objectClass.GetJsPropName()] = {
|
||
value: objectClass.GetIObjectClass(),
|
||
enumerable: true,
|
||
writable: false
|
||
};
|
||
const objects = Object.create(Object.prototype, objectDescriptors);
|
||
this._iRuntime = new self.IRuntime(this,objects);
|
||
this._userScriptEventObjects = {
|
||
"tick": this._CreateUserScriptEvent("tick")
|
||
}
|
||
}
|
||
_InitGlobalVariableScriptInterface() {
|
||
const globalVarDescriptors = {};
|
||
for (const globalVar of this.GetEventSheetManager().GetAllGlobalVariables())
|
||
globalVarDescriptors[globalVar.GetJsPropName()] = globalVar._GetScriptInterfaceDescriptor();
|
||
this._iRuntime._InitGlobalVars(globalVarDescriptors)
|
||
}
|
||
_GetCommonScriptInterfaces() {
|
||
return this._commonScriptInterfaces
|
||
}
|
||
_MapScriptInterface(interface_, class_) {
|
||
this._interfaceMap.set(interface_, class_)
|
||
}
|
||
_UnwrapScriptInterface(interface_) {
|
||
return this._interfaceMap.get(interface_)
|
||
}
|
||
}
|
||
;
|
||
self["C3_CreateRuntime"] = C3.Runtime.Create;
|
||
self["C3_InitRuntime"] = (runtime,opts)=>runtime.Init(opts)
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.JobSchedulerRuntime = class JobSchedulerRuntime extends C3.DefendedBase {
|
||
constructor(runtime, data) {
|
||
super();
|
||
this._runtime = runtime;
|
||
this._jobPromises = new Map;
|
||
this._nextJobId = 0;
|
||
this._inputPort = data["inputPort"];
|
||
data["outputPort"].onmessage = e=>this._OnJobWorkerMessage(e);
|
||
this._maxNumWorkers = data["maxNumWorkers"];
|
||
this._jobWorkerCount = 1;
|
||
this._isCreatingWorker = false;
|
||
this._hadErrorCreatingWorker = false
|
||
}
|
||
async Init() {}
|
||
ImportScriptsToJobWorkers(scripts) {
|
||
this._inputPort.postMessage({
|
||
"type": "_import_scripts",
|
||
"scripts": scripts
|
||
})
|
||
}
|
||
SendBlobToJobWorkers(blob, id) {
|
||
this._inputPort.postMessage({
|
||
"type": "_send_blob",
|
||
"blob": blob,
|
||
"id": id
|
||
})
|
||
}
|
||
SendBufferToJobWorkers(buffer, id) {
|
||
this._inputPort.postMessage({
|
||
"type": "_send_buffer",
|
||
"buffer": buffer,
|
||
"id": id
|
||
}, [buffer])
|
||
}
|
||
AddJob(type, params, transferables, progressHandler, abortDisposable) {
|
||
if (!transferables)
|
||
transferables = [];
|
||
const jobId = this._nextJobId++;
|
||
const job = {
|
||
"type": type,
|
||
"isBroadcast": false,
|
||
"jobId": jobId,
|
||
"params": params,
|
||
"transferables": transferables
|
||
};
|
||
const promise = new Promise((resolve,reject)=>{
|
||
this._jobPromises.set(jobId, {
|
||
resolve: resolve,
|
||
progress: progressHandler,
|
||
reject: reject,
|
||
cancelled: false
|
||
})
|
||
}
|
||
);
|
||
if (abortDisposable)
|
||
abortDisposable.SetAction(()=>this._CancelJob(jobId));
|
||
this._inputPort.postMessage(job, transferables);
|
||
this._MaybeCreateExtraWorker();
|
||
return promise
|
||
}
|
||
BroadcastJob(type, params, transferables) {
|
||
if (!transferables)
|
||
transferables = [];
|
||
const jobId = this._nextJobId++;
|
||
const job = {
|
||
"type": type,
|
||
"isBroadcast": true,
|
||
"jobId": jobId,
|
||
"params": params,
|
||
"transferables": transferables
|
||
};
|
||
this._inputPort.postMessage(job, transferables)
|
||
}
|
||
_CancelJob(jobId) {
|
||
const job = this._jobPromises.get(jobId);
|
||
if (job) {
|
||
job.cancelled = true;
|
||
job.resolve = null;
|
||
job.progress = null;
|
||
job.reject = null;
|
||
this._inputPort.postMessage({
|
||
"type": "_cancel",
|
||
"jobId": jobId
|
||
})
|
||
}
|
||
}
|
||
_OnJobWorkerMessage(e) {
|
||
const msg = e.data;
|
||
const type = msg["type"];
|
||
const id = msg["jobId"];
|
||
switch (type) {
|
||
case "result":
|
||
this._OnJobResult(id, msg["result"]);
|
||
break;
|
||
case "progress":
|
||
this._OnJobProgress(id, msg["progress"]);
|
||
break;
|
||
case "error":
|
||
this._OnJobError(id, msg["error"]);
|
||
break;
|
||
case "ready":
|
||
this._OnJobWorkerReady();
|
||
break;
|
||
default:
|
||
throw new Error(`unknown message from worker '${type}'`);
|
||
}
|
||
}
|
||
_OnJobResult(jobId, result) {
|
||
const p = this._jobPromises.get(jobId);
|
||
if (!p)
|
||
throw new Error("invalid job ID");
|
||
if (!p.cancelled)
|
||
p.resolve(result);
|
||
this._jobPromises.delete(jobId)
|
||
}
|
||
_OnJobProgress(jobId, progress) {
|
||
const p = this._jobPromises.get(jobId);
|
||
if (!p)
|
||
throw new Error("invalid job ID");
|
||
if (!p.cancelled && p.progress)
|
||
p.progress(progress)
|
||
}
|
||
_OnJobError(jobId, error) {
|
||
const p = this._jobPromises.get(jobId);
|
||
if (!p)
|
||
throw new Error("invalid job ID");
|
||
if (!p.cancelled)
|
||
p.reject(error);
|
||
this._jobPromises.delete(jobId)
|
||
}
|
||
_OnJobWorkerReady() {
|
||
if (!this._isCreatingWorker)
|
||
return;
|
||
this._isCreatingWorker = false;
|
||
this._jobWorkerCount++;
|
||
if (this._jobWorkerCount < this._maxNumWorkers)
|
||
this._MaybeCreateExtraWorker();
|
||
else
|
||
this._inputPort.postMessage({
|
||
"type": "_no_more_workers"
|
||
})
|
||
}
|
||
async _MaybeCreateExtraWorker() {
|
||
if (this._jobWorkerCount >= this._maxNumWorkers || this._isCreatingWorker || this._hadErrorCreatingWorker || this._jobPromises.size <= this._jobWorkerCount)
|
||
return;
|
||
try {
|
||
this._isCreatingWorker = true;
|
||
const result = await this._runtime.PostComponentMessageToDOMAsync("runtime", "create-job-worker");
|
||
result["outputPort"].onmessage = e=>this._OnJobWorkerMessage(e)
|
||
} catch (err) {
|
||
this._hadErrorCreatingWorker = true;
|
||
this._isCreatingWorker = false;
|
||
console.error(`[Construct 3] Failed to create job worker; stopping creating any more (created ${this._jobWorkerCount} so far)`, err)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;self["C3_Shaders"] = {};
|
||
self["C3_Shaders"]["hsladjust"] = {
|
||
src: "varying mediump vec2 vTex;\nuniform lowp sampler2D samplerFront;\nprecision mediump float;\nuniform float huerotate;\nuniform float satadjust;\nuniform float lumadjust;\nvec3 rgb_to_hsl(vec3 color)\n{\nvec3 hsl = vec3(0.0, 0.0, 0.0);\nfloat fmin = min(min(color.r, color.g), color.b);\nfloat fmax = max(max(color.r, color.g), color.b);\nfloat delta = fmax - fmin;\nhsl.z = (fmax + fmin) / 2.0;\nif (delta == 0.0)\n{\nhsl.x = 0.0;\nhsl.y = 0.0;\n}\nelse\n{\nif (hsl.z < 0.5)\nhsl.y = delta / (fmax + fmin);\nelse\nhsl.y = delta / (2.0 - fmax - fmin);\nfloat dR = (((fmax - color.r) / 6.0) + (delta / 2.0)) / delta;\nfloat dG = (((fmax - color.g) / 6.0) + (delta / 2.0)) / delta;\nfloat dB = (((fmax - color.b) / 6.0) + (delta / 2.0)) / delta;\nif (color.r == fmax)\nhsl.x = dB - dG;\nelse if (color.g == fmax)\nhsl.x = (1.0 / 3.0) + dR - dB;\nelse if (color.b == fmax)\nhsl.x = (2.0 / 3.0) + dG - dR;\nif (hsl.x < 0.0)\nhsl.x += 1.0;\nelse if (hsl.x > 1.0)\nhsl.x -= 1.0;\n}\nreturn hsl;\n}\nfloat hue_to_rgb(float f1, float f2, float hue)\n{\nif (hue < 0.0)\nhue += 1.0;\nelse if (hue > 1.0)\nhue -= 1.0;\nfloat ret;\nif ((6.0 * hue) < 1.0)\nret = f1 + (f2 - f1) * 6.0 * hue;\nelse if ((2.0 * hue) < 1.0)\nret = f2;\nelse if ((3.0 * hue) < 2.0)\nret = f1 + (f2 - f1) * ((2.0 / 3.0) - hue) * 6.0;\nelse\nret = f1;\nreturn ret;\n}\nvec3 hsl_to_rgb(vec3 hsl)\n{\nvec3 rgb = vec3(hsl.z);\nif (hsl.y != 0.0)\n{\nfloat f2;\nif (hsl.z < 0.5)\nf2 = hsl.z * (1.0 + hsl.y);\nelse\nf2 = (hsl.z + hsl.y) - (hsl.y * hsl.z);\nfloat f1 = 2.0 * hsl.z - f2;\nrgb.r = hue_to_rgb(f1, f2, hsl.x + (1.0 / 3.0));\nrgb.g = hue_to_rgb(f1, f2, hsl.x);\nrgb.b = hue_to_rgb(f1, f2, hsl.x - (1.0 / 3.0));\n}\nreturn rgb;\n}\nvoid main(void)\n{\nvec4 front = texture2D(samplerFront, vTex);\nvec3 rgb = rgb_to_hsl(front.rgb) + vec3((huerotate > 0.5 ? huerotate - 1.0 : huerotate), 0, (lumadjust - 1.0) * front.a);\nrgb.y *= satadjust;\nrgb = hsl_to_rgb(rgb);\ngl_FragColor = vec4(rgb, front.a);\n}",
|
||
extendBoxHorizontal: 0,
|
||
extendBoxVertical: 0,
|
||
crossSampling: false,
|
||
mustPreDraw: false,
|
||
preservesOpaqueness: true,
|
||
animated: false,
|
||
parameters: [["huerotate", 0, "percent"], ["satadjust", 0, "percent"], ["lumadjust", 0, "percent"]]
|
||
};
|
||
self["C3_Shaders"]["brightness"] = {
|
||
src: "varying mediump vec2 vTex;\nuniform lowp sampler2D samplerFront;\nuniform lowp float brightness;\nvoid main(void)\n{\nlowp vec4 front = texture2D(samplerFront, vTex);\nlowp float a = front.a;\nif (a != 0.0)\nfront.rgb /= front.a;\nfront.rgb += (brightness - 1.0);\nfront.rgb *= a;\ngl_FragColor = front;\n}",
|
||
extendBoxHorizontal: 0,
|
||
extendBoxVertical: 0,
|
||
crossSampling: false,
|
||
mustPreDraw: false,
|
||
preservesOpaqueness: true,
|
||
animated: false,
|
||
parameters: [["brightness", 0, "percent"]]
|
||
};
|
||
function forge() {
|
||
return function(e) {
|
||
function t(a) {
|
||
if (r[a])
|
||
return r[a].exports;
|
||
var n = r[a] = {
|
||
i: a,
|
||
l: !1,
|
||
exports: {}
|
||
};
|
||
return e[a].call(n.exports, n, n.exports, t),
|
||
n.l = !0,
|
||
n.exports
|
||
}
|
||
var r = {};
|
||
return t.m = e,
|
||
t.c = r,
|
||
t.d = function(e, r, a) {
|
||
t.o(e, r) || Object.defineProperty(e, r, {
|
||
configurable: !1,
|
||
enumerable: !0,
|
||
get: a
|
||
})
|
||
}
|
||
,
|
||
t.n = function(e) {
|
||
var r = e && e.__esModule ? function() {
|
||
return e.default
|
||
}
|
||
: function() {
|
||
return e
|
||
}
|
||
;
|
||
return t.d(r, "a", r),
|
||
r
|
||
}
|
||
,
|
||
t.o = function(e, t) {
|
||
return Object.prototype.hasOwnProperty.call(e, t)
|
||
}
|
||
,
|
||
t.p = "",
|
||
t(t.s = 34)
|
||
}([function(e, t) {
|
||
e.exports = {
|
||
options: {
|
||
usePureJavaScript: !1
|
||
}
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
(function(t) {
|
||
function a(e) {
|
||
if (8 !== e && 16 !== e && 24 !== e && 32 !== e)
|
||
throw new Error("Only 8, 16, 24, or 32 bits supported: " + e)
|
||
}
|
||
function n(e) {
|
||
if (this.data = "",
|
||
this.read = 0,
|
||
"string" == typeof e)
|
||
this.data = e;
|
||
else if (c.isArrayBuffer(e) || c.isArrayBufferView(e))
|
||
if ("undefined" != typeof Buffer && e instanceof Buffer)
|
||
this.data = e.toString("binary");
|
||
else {
|
||
var t = new Uint8Array(e);
|
||
try {
|
||
this.data = String.fromCharCode.apply(null, t)
|
||
} catch (e) {
|
||
for (var r = 0; r < t.length; ++r)
|
||
this.putByte(t[r])
|
||
}
|
||
}
|
||
else
|
||
(e instanceof n || "object" == typeof e && "string" == typeof e.data && "number" == typeof e.read) && (this.data = e.data,
|
||
this.read = e.read);
|
||
this._constructedStringLength = 0
|
||
}
|
||
function i(e, t) {
|
||
t = t || {},
|
||
this.read = t.readOffset || 0,
|
||
this.growSize = t.growSize || 1024;
|
||
var r = c.isArrayBuffer(e)
|
||
, a = c.isArrayBufferView(e);
|
||
if (r || a)
|
||
return this.data = r ? new DataView(e) : new DataView(e.buffer,e.byteOffset,e.byteLength),
|
||
void (this.write = "writeOffset"in t ? t.writeOffset : this.data.byteLength);
|
||
this.data = new DataView(new ArrayBuffer(0)),
|
||
this.write = 0,
|
||
null !== e && void 0 !== e && this.putBytes(e),
|
||
"writeOffset"in t && (this.write = t.writeOffset)
|
||
}
|
||
var s = r(0)
|
||
, o = r(37)
|
||
, c = e.exports = s.util = s.util || {};
|
||
!function() {
|
||
function e(e) {
|
||
if (e.source === window && e.data === t) {
|
||
e.stopPropagation();
|
||
var a = r.slice();
|
||
r.length = 0,
|
||
a.forEach(function(e) {
|
||
e()
|
||
})
|
||
}
|
||
}
|
||
if ("undefined" != typeof process && process.nextTick && !process.browser)
|
||
return c.nextTick = process.nextTick,
|
||
void ("function" == typeof setImmediate ? c.setImmediate = setImmediate : c.setImmediate = c.nextTick);
|
||
if ("function" == typeof setImmediate)
|
||
return c.setImmediate = function() {
|
||
return setImmediate.apply(void 0, arguments)
|
||
}
|
||
,
|
||
void (c.nextTick = function(e) {
|
||
return setImmediate(e)
|
||
}
|
||
);
|
||
if (c.setImmediate = function(e) {
|
||
setTimeout(e, 0)
|
||
}
|
||
,
|
||
"undefined" != typeof window && "function" == typeof window.postMessage) {
|
||
var t = "forge.setImmediate"
|
||
, r = [];
|
||
c.setImmediate = function(e) {
|
||
r.push(e),
|
||
1 === r.length && window.postMessage(t, "*")
|
||
}
|
||
,
|
||
window.addEventListener("message", e, !0)
|
||
}
|
||
if ("undefined" != typeof MutationObserver) {
|
||
var a = Date.now()
|
||
, n = !0
|
||
, i = document.createElement("div")
|
||
, r = [];
|
||
new MutationObserver(function() {
|
||
var e = r.slice();
|
||
r.length = 0,
|
||
e.forEach(function(e) {
|
||
e()
|
||
})
|
||
}
|
||
).observe(i, {
|
||
attributes: !0
|
||
});
|
||
var s = c.setImmediate;
|
||
c.setImmediate = function(e) {
|
||
Date.now() - a > 15 ? (a = Date.now(),
|
||
s(e)) : (r.push(e),
|
||
1 === r.length && i.setAttribute("a", n = !n))
|
||
}
|
||
}
|
||
c.nextTick = c.setImmediate
|
||
}(),
|
||
c.isNodejs = "undefined" != typeof process && process.versions && process.versions.node,
|
||
c.globalScope = function() {
|
||
return c.isNodejs ? t : "undefined" == typeof self ? window : self
|
||
}(),
|
||
c.isArray = Array.isArray || function(e) {
|
||
return "[object Array]" === Object.prototype.toString.call(e)
|
||
}
|
||
,
|
||
c.isArrayBuffer = function(e) {
|
||
return "undefined" != typeof ArrayBuffer && e instanceof ArrayBuffer
|
||
}
|
||
,
|
||
c.isArrayBufferView = function(e) {
|
||
return e && c.isArrayBuffer(e.buffer) && void 0 !== e.byteLength
|
||
}
|
||
,
|
||
c.ByteBuffer = n,
|
||
c.ByteStringBuffer = n;
|
||
c.ByteStringBuffer.prototype._optimizeConstructedString = function(e) {
|
||
this._constructedStringLength += e,
|
||
this._constructedStringLength > 4096 && (this.data.substr(0, 1),
|
||
this._constructedStringLength = 0)
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.length = function() {
|
||
return this.data.length - this.read
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.isEmpty = function() {
|
||
return this.length() <= 0
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.putByte = function(e) {
|
||
return this.putBytes(String.fromCharCode(e))
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.fillWithByte = function(e, t) {
|
||
e = String.fromCharCode(e);
|
||
for (var r = this.data; t > 0; )
|
||
1 & t && (r += e),
|
||
(t >>>= 1) > 0 && (e += e);
|
||
return this.data = r,
|
||
this._optimizeConstructedString(t),
|
||
this
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.putBytes = function(e) {
|
||
return this.data += e,
|
||
this._optimizeConstructedString(e.length),
|
||
this
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.putString = function(e) {
|
||
return this.putBytes(c.encodeUtf8(e))
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.putInt16 = function(e) {
|
||
return this.putBytes(String.fromCharCode(e >> 8 & 255) + String.fromCharCode(255 & e))
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.putInt24 = function(e) {
|
||
return this.putBytes(String.fromCharCode(e >> 16 & 255) + String.fromCharCode(e >> 8 & 255) + String.fromCharCode(255 & e))
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.putInt32 = function(e) {
|
||
return this.putBytes(String.fromCharCode(e >> 24 & 255) + String.fromCharCode(e >> 16 & 255) + String.fromCharCode(e >> 8 & 255) + String.fromCharCode(255 & e))
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.putInt16Le = function(e) {
|
||
return this.putBytes(String.fromCharCode(255 & e) + String.fromCharCode(e >> 8 & 255))
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.putInt24Le = function(e) {
|
||
return this.putBytes(String.fromCharCode(255 & e) + String.fromCharCode(e >> 8 & 255) + String.fromCharCode(e >> 16 & 255))
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.putInt32Le = function(e) {
|
||
return this.putBytes(String.fromCharCode(255 & e) + String.fromCharCode(e >> 8 & 255) + String.fromCharCode(e >> 16 & 255) + String.fromCharCode(e >> 24 & 255))
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.putInt = function(e, t) {
|
||
a(t);
|
||
var r = "";
|
||
do {
|
||
t -= 8,
|
||
r += String.fromCharCode(e >> t & 255)
|
||
} while (t > 0);
|
||
return this.putBytes(r)
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.putSignedInt = function(e, t) {
|
||
return e < 0 && (e += 2 << t - 1),
|
||
this.putInt(e, t)
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.putBuffer = function(e) {
|
||
return this.putBytes(e.getBytes())
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.getByte = function() {
|
||
return this.data.charCodeAt(this.read++)
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.getInt16 = function() {
|
||
var e = this.data.charCodeAt(this.read) << 8 ^ this.data.charCodeAt(this.read + 1);
|
||
return this.read += 2,
|
||
e
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.getInt24 = function() {
|
||
var e = this.data.charCodeAt(this.read) << 16 ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2);
|
||
return this.read += 3,
|
||
e
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.getInt32 = function() {
|
||
var e = this.data.charCodeAt(this.read) << 24 ^ this.data.charCodeAt(this.read + 1) << 16 ^ this.data.charCodeAt(this.read + 2) << 8 ^ this.data.charCodeAt(this.read + 3);
|
||
return this.read += 4,
|
||
e
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.getInt16Le = function() {
|
||
var e = this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8;
|
||
return this.read += 2,
|
||
e
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.getInt24Le = function() {
|
||
var e = this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2) << 16;
|
||
return this.read += 3,
|
||
e
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.getInt32Le = function() {
|
||
var e = this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2) << 16 ^ this.data.charCodeAt(this.read + 3) << 24;
|
||
return this.read += 4,
|
||
e
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.getInt = function(e) {
|
||
a(e);
|
||
var t = 0;
|
||
do {
|
||
t = (t << 8) + this.data.charCodeAt(this.read++),
|
||
e -= 8
|
||
} while (e > 0);
|
||
return t
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.getSignedInt = function(e) {
|
||
var t = this.getInt(e)
|
||
, r = 2 << e - 2;
|
||
return t >= r && (t -= r << 1),
|
||
t
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.getBytes = function(e) {
|
||
var t;
|
||
return e ? (e = Math.min(this.length(), e),
|
||
t = this.data.slice(this.read, this.read + e),
|
||
this.read += e) : 0 === e ? t = "" : (t = 0 === this.read ? this.data : this.data.slice(this.read),
|
||
this.clear()),
|
||
t
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.bytes = function(e) {
|
||
return void 0 === e ? this.data.slice(this.read) : this.data.slice(this.read, this.read + e)
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.at = function(e) {
|
||
return this.data.charCodeAt(this.read + e)
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.setAt = function(e, t) {
|
||
return this.data = this.data.substr(0, this.read + e) + String.fromCharCode(t) + this.data.substr(this.read + e + 1),
|
||
this
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.last = function() {
|
||
return this.data.charCodeAt(this.data.length - 1)
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.copy = function() {
|
||
var e = c.createBuffer(this.data);
|
||
return e.read = this.read,
|
||
e
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.compact = function() {
|
||
return this.read > 0 && (this.data = this.data.slice(this.read),
|
||
this.read = 0),
|
||
this
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.clear = function() {
|
||
return this.data = "",
|
||
this.read = 0,
|
||
this
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.truncate = function(e) {
|
||
var t = Math.max(0, this.length() - e);
|
||
return this.data = this.data.substr(this.read, t),
|
||
this.read = 0,
|
||
this
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.toHex = function() {
|
||
for (var e = "", t = this.read; t < this.data.length; ++t) {
|
||
var r = this.data.charCodeAt(t);
|
||
r < 16 && (e += "0"),
|
||
e += r.toString(16)
|
||
}
|
||
return e
|
||
}
|
||
,
|
||
c.ByteStringBuffer.prototype.toString = function() {
|
||
return c.decodeUtf8(this.bytes())
|
||
}
|
||
,
|
||
c.DataBuffer = i,
|
||
c.DataBuffer.prototype.length = function() {
|
||
return this.write - this.read
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.isEmpty = function() {
|
||
return this.length() <= 0
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.accommodate = function(e, t) {
|
||
if (this.length() >= e)
|
||
return this;
|
||
t = Math.max(t || this.growSize, e);
|
||
var r = new Uint8Array(this.data.buffer,this.data.byteOffset,this.data.byteLength)
|
||
, a = new Uint8Array(this.length() + t);
|
||
return a.set(r),
|
||
this.data = new DataView(a.buffer),
|
||
this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.putByte = function(e) {
|
||
return this.accommodate(1),
|
||
this.data.setUint8(this.write++, e),
|
||
this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.fillWithByte = function(e, t) {
|
||
this.accommodate(t);
|
||
for (var r = 0; r < t; ++r)
|
||
this.data.setUint8(e);
|
||
return this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.putBytes = function(e, t) {
|
||
if (c.isArrayBufferView(e)) {
|
||
var r = new Uint8Array(e.buffer,e.byteOffset,e.byteLength)
|
||
, a = r.byteLength - r.byteOffset;
|
||
this.accommodate(a);
|
||
var n = new Uint8Array(this.data.buffer,this.write);
|
||
return n.set(r),
|
||
this.write += a,
|
||
this
|
||
}
|
||
if (c.isArrayBuffer(e)) {
|
||
var r = new Uint8Array(e);
|
||
this.accommodate(r.byteLength);
|
||
var n = new Uint8Array(this.data.buffer);
|
||
return n.set(r, this.write),
|
||
this.write += r.byteLength,
|
||
this
|
||
}
|
||
if (e instanceof c.DataBuffer || "object" == typeof e && "number" == typeof e.read && "number" == typeof e.write && c.isArrayBufferView(e.data)) {
|
||
var r = new Uint8Array(e.data.byteLength,e.read,e.length());
|
||
this.accommodate(r.byteLength);
|
||
var n = new Uint8Array(e.data.byteLength,this.write);
|
||
return n.set(r),
|
||
this.write += r.byteLength,
|
||
this
|
||
}
|
||
if (e instanceof c.ByteStringBuffer && (e = e.data,
|
||
t = "binary"),
|
||
t = t || "binary",
|
||
"string" == typeof e) {
|
||
var i;
|
||
if ("hex" === t)
|
||
return this.accommodate(Math.ceil(e.length / 2)),
|
||
i = new Uint8Array(this.data.buffer,this.write),
|
||
this.write += c.binary.hex.decode(e, i, this.write),
|
||
this;
|
||
if ("base64" === t)
|
||
return this.accommodate(3 * Math.ceil(e.length / 4)),
|
||
i = new Uint8Array(this.data.buffer,this.write),
|
||
this.write += c.binary.base64.decode(e, i, this.write),
|
||
this;
|
||
if ("utf8" === t && (e = c.encodeUtf8(e),
|
||
t = "binary"),
|
||
"binary" === t || "raw" === t)
|
||
return this.accommodate(e.length),
|
||
i = new Uint8Array(this.data.buffer,this.write),
|
||
this.write += c.binary.raw.decode(i),
|
||
this;
|
||
if ("utf16" === t)
|
||
return this.accommodate(2 * e.length),
|
||
i = new Uint16Array(this.data.buffer,this.write),
|
||
this.write += c.text.utf16.encode(i),
|
||
this;
|
||
throw new Error("Invalid encoding: " + t)
|
||
}
|
||
throw Error("Invalid parameter: " + e)
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.putBuffer = function(e) {
|
||
return this.putBytes(e),
|
||
e.clear(),
|
||
this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.putString = function(e) {
|
||
return this.putBytes(e, "utf16")
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.putInt16 = function(e) {
|
||
return this.accommodate(2),
|
||
this.data.setInt16(this.write, e),
|
||
this.write += 2,
|
||
this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.putInt24 = function(e) {
|
||
return this.accommodate(3),
|
||
this.data.setInt16(this.write, e >> 8 & 65535),
|
||
this.data.setInt8(this.write, e >> 16 & 255),
|
||
this.write += 3,
|
||
this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.putInt32 = function(e) {
|
||
return this.accommodate(4),
|
||
this.data.setInt32(this.write, e),
|
||
this.write += 4,
|
||
this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.putInt16Le = function(e) {
|
||
return this.accommodate(2),
|
||
this.data.setInt16(this.write, e, !0),
|
||
this.write += 2,
|
||
this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.putInt24Le = function(e) {
|
||
return this.accommodate(3),
|
||
this.data.setInt8(this.write, e >> 16 & 255),
|
||
this.data.setInt16(this.write, e >> 8 & 65535, !0),
|
||
this.write += 3,
|
||
this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.putInt32Le = function(e) {
|
||
return this.accommodate(4),
|
||
this.data.setInt32(this.write, e, !0),
|
||
this.write += 4,
|
||
this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.putInt = function(e, t) {
|
||
a(t),
|
||
this.accommodate(t / 8);
|
||
do {
|
||
t -= 8,
|
||
this.data.setInt8(this.write++, e >> t & 255)
|
||
} while (t > 0);
|
||
return this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.putSignedInt = function(e, t) {
|
||
return a(t),
|
||
this.accommodate(t / 8),
|
||
e < 0 && (e += 2 << t - 1),
|
||
this.putInt(e, t)
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.getByte = function() {
|
||
return this.data.getInt8(this.read++)
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.getInt16 = function() {
|
||
var e = this.data.getInt16(this.read);
|
||
return this.read += 2,
|
||
e
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.getInt24 = function() {
|
||
var e = this.data.getInt16(this.read) << 8 ^ this.data.getInt8(this.read + 2);
|
||
return this.read += 3,
|
||
e
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.getInt32 = function() {
|
||
var e = this.data.getInt32(this.read);
|
||
return this.read += 4,
|
||
e
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.getInt16Le = function() {
|
||
var e = this.data.getInt16(this.read, !0);
|
||
return this.read += 2,
|
||
e
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.getInt24Le = function() {
|
||
var e = this.data.getInt8(this.read) ^ this.data.getInt16(this.read + 1, !0) << 8;
|
||
return this.read += 3,
|
||
e
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.getInt32Le = function() {
|
||
var e = this.data.getInt32(this.read, !0);
|
||
return this.read += 4,
|
||
e
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.getInt = function(e) {
|
||
a(e);
|
||
var t = 0;
|
||
do {
|
||
t = (t << 8) + this.data.getInt8(this.read++),
|
||
e -= 8
|
||
} while (e > 0);
|
||
return t
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.getSignedInt = function(e) {
|
||
var t = this.getInt(e)
|
||
, r = 2 << e - 2;
|
||
return t >= r && (t -= r << 1),
|
||
t
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.getBytes = function(e) {
|
||
var t;
|
||
return e ? (e = Math.min(this.length(), e),
|
||
t = this.data.slice(this.read, this.read + e),
|
||
this.read += e) : 0 === e ? t = "" : (t = 0 === this.read ? this.data : this.data.slice(this.read),
|
||
this.clear()),
|
||
t
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.bytes = function(e) {
|
||
return void 0 === e ? this.data.slice(this.read) : this.data.slice(this.read, this.read + e)
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.at = function(e) {
|
||
return this.data.getUint8(this.read + e)
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.setAt = function(e, t) {
|
||
return this.data.setUint8(e, t),
|
||
this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.last = function() {
|
||
return this.data.getUint8(this.write - 1)
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.copy = function() {
|
||
return new c.DataBuffer(this)
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.compact = function() {
|
||
if (this.read > 0) {
|
||
var e = new Uint8Array(this.data.buffer,this.read)
|
||
, t = new Uint8Array(e.byteLength);
|
||
t.set(e),
|
||
this.data = new DataView(t),
|
||
this.write -= this.read,
|
||
this.read = 0
|
||
}
|
||
return this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.clear = function() {
|
||
return this.data = new DataView(new ArrayBuffer(0)),
|
||
this.read = this.write = 0,
|
||
this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.truncate = function(e) {
|
||
return this.write = Math.max(0, this.length() - e),
|
||
this.read = Math.min(this.read, this.write),
|
||
this
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.toHex = function() {
|
||
for (var e = "", t = this.read; t < this.data.byteLength; ++t) {
|
||
var r = this.data.getUint8(t);
|
||
r < 16 && (e += "0"),
|
||
e += r.toString(16)
|
||
}
|
||
return e
|
||
}
|
||
,
|
||
c.DataBuffer.prototype.toString = function(e) {
|
||
var t = new Uint8Array(this.data,this.read,this.length());
|
||
if ("binary" === (e = e || "utf8") || "raw" === e)
|
||
return c.binary.raw.encode(t);
|
||
if ("hex" === e)
|
||
return c.binary.hex.encode(t);
|
||
if ("base64" === e)
|
||
return c.binary.base64.encode(t);
|
||
if ("utf8" === e)
|
||
return c.text.utf8.decode(t);
|
||
if ("utf16" === e)
|
||
return c.text.utf16.decode(t);
|
||
throw new Error("Invalid encoding: " + e)
|
||
}
|
||
,
|
||
c.createBuffer = function(e, t) {
|
||
return t = t || "raw",
|
||
void 0 !== e && "utf8" === t && (e = c.encodeUtf8(e)),
|
||
new c.ByteBuffer(e)
|
||
}
|
||
,
|
||
c.fillString = function(e, t) {
|
||
for (var r = ""; t > 0; )
|
||
1 & t && (r += e),
|
||
(t >>>= 1) > 0 && (e += e);
|
||
return r
|
||
}
|
||
,
|
||
c.xorBytes = function(e, t, r) {
|
||
for (var a = "", n = "", i = "", s = 0, o = 0; r > 0; --r,
|
||
++s)
|
||
n = e.charCodeAt(s) ^ t.charCodeAt(s),
|
||
o >= 10 && (a += i,
|
||
i = "",
|
||
o = 0),
|
||
i += String.fromCharCode(n),
|
||
++o;
|
||
return a += i
|
||
}
|
||
,
|
||
c.hexToBytes = function(e) {
|
||
var t = ""
|
||
, r = 0;
|
||
for (!0 & e.length && (r = 1,
|
||
t += String.fromCharCode(parseInt(e[0], 16))); r < e.length; r += 2)
|
||
t += String.fromCharCode(parseInt(e.substr(r, 2), 16));
|
||
return t
|
||
}
|
||
,
|
||
c.bytesToHex = function(e) {
|
||
return c.createBuffer(e).toHex()
|
||
}
|
||
,
|
||
c.int32ToBytes = function(e) {
|
||
return String.fromCharCode(e >> 24 & 255) + String.fromCharCode(e >> 16 & 255) + String.fromCharCode(e >> 8 & 255) + String.fromCharCode(255 & e)
|
||
}
|
||
;
|
||
var u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
|
||
, l = [62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 64, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51]
|
||
, p = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
||
c.encode64 = function(e, t) {
|
||
for (var r, a, n, i = "", s = "", o = 0; o < e.length; )
|
||
r = e.charCodeAt(o++),
|
||
a = e.charCodeAt(o++),
|
||
n = e.charCodeAt(o++),
|
||
i += u.charAt(r >> 2),
|
||
i += u.charAt((3 & r) << 4 | a >> 4),
|
||
isNaN(a) ? i += "==" : (i += u.charAt((15 & a) << 2 | n >> 6),
|
||
i += isNaN(n) ? "=" : u.charAt(63 & n)),
|
||
t && i.length > t && (s += i.substr(0, t) + "\r\n",
|
||
i = i.substr(t));
|
||
return s += i
|
||
}
|
||
,
|
||
c.decode64 = function(e) {
|
||
e = e.replace(/[^A-Za-z0-9\+\/\=]/g, "");
|
||
for (var t, r, a, n, i = "", s = 0; s < e.length; )
|
||
t = l[e.charCodeAt(s++) - 43],
|
||
r = l[e.charCodeAt(s++) - 43],
|
||
a = l[e.charCodeAt(s++) - 43],
|
||
n = l[e.charCodeAt(s++) - 43],
|
||
i += String.fromCharCode(t << 2 | r >> 4),
|
||
64 !== a && (i += String.fromCharCode((15 & r) << 4 | a >> 2),
|
||
64 !== n && (i += String.fromCharCode((3 & a) << 6 | n)));
|
||
return i
|
||
}
|
||
,
|
||
c.encodeUtf8 = function(e) {
|
||
return unescape(encodeURIComponent(e))
|
||
}
|
||
,
|
||
c.decodeUtf8 = function(e) {
|
||
return decodeURIComponent(escape(e))
|
||
}
|
||
,
|
||
c.binary = {
|
||
raw: {},
|
||
hex: {},
|
||
base64: {},
|
||
base58: {},
|
||
baseN: {
|
||
encode: o.encode,
|
||
decode: o.decode
|
||
}
|
||
},
|
||
c.binary.raw.encode = function(e) {
|
||
return String.fromCharCode.apply(null, e)
|
||
}
|
||
,
|
||
c.binary.raw.decode = function(e, t, r) {
|
||
var a = t;
|
||
a || (a = new Uint8Array(e.length)),
|
||
r = r || 0;
|
||
for (var n = r, i = 0; i < e.length; ++i)
|
||
a[n++] = e.charCodeAt(i);
|
||
return t ? n - r : a
|
||
}
|
||
,
|
||
c.binary.hex.encode = c.bytesToHex,
|
||
c.binary.hex.decode = function(e, t, r) {
|
||
var a = t;
|
||
a || (a = new Uint8Array(Math.ceil(e.length / 2))),
|
||
r = r || 0;
|
||
var n = 0
|
||
, i = r;
|
||
for (1 & e.length && (n = 1,
|
||
a[i++] = parseInt(e[0], 16)); n < e.length; n += 2)
|
||
a[i++] = parseInt(e.substr(n, 2), 16);
|
||
return t ? i - r : a
|
||
}
|
||
,
|
||
c.binary.base64.encode = function(e, t) {
|
||
for (var r, a, n, i = "", s = "", o = 0; o < e.byteLength; )
|
||
r = e[o++],
|
||
a = e[o++],
|
||
n = e[o++],
|
||
i += u.charAt(r >> 2),
|
||
i += u.charAt((3 & r) << 4 | a >> 4),
|
||
isNaN(a) ? i += "==" : (i += u.charAt((15 & a) << 2 | n >> 6),
|
||
i += isNaN(n) ? "=" : u.charAt(63 & n)),
|
||
t && i.length > t && (s += i.substr(0, t) + "\r\n",
|
||
i = i.substr(t));
|
||
return s += i
|
||
}
|
||
,
|
||
c.binary.base64.decode = function(e, t, r) {
|
||
var a = t;
|
||
a || (a = new Uint8Array(3 * Math.ceil(e.length / 4))),
|
||
e = e.replace(/[^A-Za-z0-9\+\/\=]/g, ""),
|
||
r = r || 0;
|
||
for (var n, i, s, o, c = 0, u = r; c < e.length; )
|
||
n = l[e.charCodeAt(c++) - 43],
|
||
i = l[e.charCodeAt(c++) - 43],
|
||
s = l[e.charCodeAt(c++) - 43],
|
||
o = l[e.charCodeAt(c++) - 43],
|
||
a[u++] = n << 2 | i >> 4,
|
||
64 !== s && (a[u++] = (15 & i) << 4 | s >> 2,
|
||
64 !== o && (a[u++] = (3 & s) << 6 | o));
|
||
return t ? u - r : a.subarray(0, u)
|
||
}
|
||
,
|
||
c.binary.base58.encode = function(e, t) {
|
||
return c.binary.baseN.encode(e, p, t)
|
||
}
|
||
,
|
||
c.binary.base58.decode = function(e, t) {
|
||
return c.binary.baseN.decode(e, p, t)
|
||
}
|
||
,
|
||
c.text = {
|
||
utf8: {},
|
||
utf16: {}
|
||
},
|
||
c.text.utf8.encode = function(e, t, r) {
|
||
e = c.encodeUtf8(e);
|
||
var a = t;
|
||
a || (a = new Uint8Array(e.length)),
|
||
r = r || 0;
|
||
for (var n = r, i = 0; i < e.length; ++i)
|
||
a[n++] = e.charCodeAt(i);
|
||
return t ? n - r : a
|
||
}
|
||
,
|
||
c.text.utf8.decode = function(e) {
|
||
return c.decodeUtf8(String.fromCharCode.apply(null, e))
|
||
}
|
||
,
|
||
c.text.utf16.encode = function(e, t, r) {
|
||
var a = t;
|
||
a || (a = new Uint8Array(2 * e.length));
|
||
var n = new Uint16Array(a.buffer);
|
||
r = r || 0;
|
||
for (var i = r, s = r, o = 0; o < e.length; ++o)
|
||
n[s++] = e.charCodeAt(o),
|
||
i += 2;
|
||
return t ? i - r : a
|
||
}
|
||
,
|
||
c.text.utf16.decode = function(e) {
|
||
return String.fromCharCode.apply(null, new Uint16Array(e.buffer))
|
||
}
|
||
,
|
||
c.deflate = function(e, t, r) {
|
||
if (t = c.decode64(e.deflate(c.encode64(t)).rval),
|
||
r) {
|
||
var a = 2;
|
||
32 & t.charCodeAt(1) && (a = 6),
|
||
t = t.substring(a, t.length - 4)
|
||
}
|
||
return t
|
||
}
|
||
,
|
||
c.inflate = function(e, t, r) {
|
||
var a = e.inflate(c.encode64(t)).rval;
|
||
return null === a ? null : c.decode64(a)
|
||
}
|
||
;
|
||
var f = function(e, t, r) {
|
||
if (!e)
|
||
throw new Error("WebStorage not available.");
|
||
var a;
|
||
if (null === r ? a = e.removeItem(t) : (r = c.encode64(JSON.stringify(r)),
|
||
a = e.setItem(t, r)),
|
||
void 0 !== a && !0 !== a.rval) {
|
||
var n = new Error(a.error.message);
|
||
throw n.id = a.error.id,
|
||
n.name = a.error.name,
|
||
n
|
||
}
|
||
}
|
||
, h = function(e, t) {
|
||
if (!e)
|
||
throw new Error("WebStorage not available.");
|
||
var r = e.getItem(t);
|
||
if (e.init)
|
||
if (null === r.rval) {
|
||
if (r.error) {
|
||
var a = new Error(r.error.message);
|
||
throw a.id = r.error.id,
|
||
a.name = r.error.name,
|
||
a
|
||
}
|
||
r = null
|
||
} else
|
||
r = r.rval;
|
||
return null !== r && (r = JSON.parse(c.decode64(r))),
|
||
r
|
||
}
|
||
, d = function(e, t, r, a) {
|
||
var n = h(e, t);
|
||
null === n && (n = {}),
|
||
n[r] = a,
|
||
f(e, t, n)
|
||
}
|
||
, y = function(e, t, r) {
|
||
var a = h(e, t);
|
||
return null !== a && (a = r in a ? a[r] : null),
|
||
a
|
||
}
|
||
, g = function(e, t, r) {
|
||
var a = h(e, t);
|
||
if (null !== a && r in a) {
|
||
delete a[r];
|
||
var n = !0;
|
||
for (var i in a) {
|
||
n = !1;
|
||
break
|
||
}
|
||
n && (a = null),
|
||
f(e, t, a)
|
||
}
|
||
}
|
||
, v = function(e, t) {
|
||
f(e, t, null)
|
||
}
|
||
, m = function(e, t, r) {
|
||
var a = null;
|
||
void 0 === r && (r = ["web", "flash"]);
|
||
var n, i = !1, s = null;
|
||
for (var o in r) {
|
||
n = r[o];
|
||
try {
|
||
if ("flash" === n || "both" === n) {
|
||
if (null === t[0])
|
||
throw new Error("Flash local storage not available.");
|
||
a = e.apply(this, t),
|
||
i = "flash" === n
|
||
}
|
||
"web" !== n && "both" !== n || (t[0] = localStorage,
|
||
a = e.apply(this, t),
|
||
i = !0)
|
||
} catch (e) {
|
||
s = e
|
||
}
|
||
if (i)
|
||
break
|
||
}
|
||
if (!i)
|
||
throw s;
|
||
return a
|
||
};
|
||
c.setItem = function(e, t, r, a, n) {
|
||
m(d, arguments, n)
|
||
}
|
||
,
|
||
c.getItem = function(e, t, r, a) {
|
||
return m(y, arguments, a)
|
||
}
|
||
,
|
||
c.removeItem = function(e, t, r, a) {
|
||
m(g, arguments, a)
|
||
}
|
||
,
|
||
c.clearItems = function(e, t, r) {
|
||
m(v, arguments, r)
|
||
}
|
||
,
|
||
c.parseUrl = function(e) {
|
||
var t = /^(https?):\/\/([^:&^\/]*):?(\d*)(.*)$/g;
|
||
t.lastIndex = 0;
|
||
var r = t.exec(e)
|
||
, a = null === r ? null : {
|
||
full: e,
|
||
scheme: r[1],
|
||
host: r[2],
|
||
port: r[3],
|
||
path: r[4]
|
||
};
|
||
console.log("--fx--host--", a);
|
||
return a && (a.fullHost = a.host,
|
||
a.port ? 80 !== a.port && "http" === a.scheme ? a.fullHost += ":" + a.port : 443 !== a.port && "https" === a.scheme && (a.fullHost += ":" + a.port) : "http" === a.scheme ? a.port = 80 : "https" === a.scheme && (a.port = 443),
|
||
a.full = a.scheme + "://" + a.fullHost),
|
||
a
|
||
}
|
||
;
|
||
var C = null;
|
||
c.getQueryVariables = function(e) {
|
||
var t, r = function(e) {
|
||
for (var t = {}, r = e.split("&"), a = 0; a < r.length; a++) {
|
||
var n, i, s = r[a].indexOf("=");
|
||
s > 0 ? (n = r[a].substring(0, s),
|
||
i = r[a].substring(s + 1)) : (n = r[a],
|
||
i = null),
|
||
n in t || (t[n] = []),
|
||
n in Object.prototype || null === i || t[n].push(unescape(i))
|
||
}
|
||
return t
|
||
};
|
||
return void 0 === e ? (null === C && (C = "undefined" != typeof window && window.location && window.location.search ? r(window.location.search.substring(1)) : {}),
|
||
t = C) : t = r(e),
|
||
t
|
||
}
|
||
,
|
||
c.parseFragment = function(e) {
|
||
var t = e
|
||
, r = ""
|
||
, a = e.indexOf("?");
|
||
a > 0 && (t = e.substring(0, a),
|
||
r = e.substring(a + 1));
|
||
var n = t.split("/");
|
||
return n.length > 0 && "" === n[0] && n.shift(),
|
||
{
|
||
pathString: t,
|
||
queryString: r,
|
||
path: n,
|
||
query: "" === r ? {} : c.getQueryVariables(r)
|
||
}
|
||
}
|
||
,
|
||
c.makeRequest = function(e) {
|
||
var t = c.parseFragment(e)
|
||
, r = {
|
||
path: t.pathString,
|
||
query: t.queryString,
|
||
getPath: function(e) {
|
||
return void 0 === e ? t.path : t.path[e]
|
||
},
|
||
getQuery: function(e, r) {
|
||
var a;
|
||
return void 0 === e ? a = t.query : (a = t.query[e]) && void 0 !== r && (a = a[r]),
|
||
a
|
||
},
|
||
getQueryLast: function(e, t) {
|
||
var a = r.getQuery(e);
|
||
return a ? a[a.length - 1] : t
|
||
}
|
||
};
|
||
return r
|
||
}
|
||
,
|
||
c.makeLink = function(e, t, r) {
|
||
e = jQuery.isArray(e) ? e.join("/") : e;
|
||
var a = jQuery.param(t || {});
|
||
return r = r || "",
|
||
e + (a.length > 0 ? "?" + a : "") + (r.length > 0 ? "#" + r : "")
|
||
}
|
||
,
|
||
c.setPath = function(e, t, r) {
|
||
if ("object" == typeof e && null !== e)
|
||
for (var a = 0, n = t.length; a < n; ) {
|
||
var i = t[a++];
|
||
if (a == n)
|
||
e[i] = r;
|
||
else {
|
||
var s = i in e;
|
||
(!s || s && "object" != typeof e[i] || s && null === e[i]) && (e[i] = {}),
|
||
e = e[i]
|
||
}
|
||
}
|
||
}
|
||
,
|
||
c.getPath = function(e, t, r) {
|
||
for (var a = 0, n = t.length, i = !0; i && a < n && "object" == typeof e && null !== e; ) {
|
||
var s = t[a++];
|
||
i = s in e,
|
||
i && (e = e[s])
|
||
}
|
||
return i ? e : r
|
||
}
|
||
,
|
||
c.deletePath = function(e, t) {
|
||
if ("object" == typeof e && null !== e)
|
||
for (var r = 0, a = t.length; r < a; ) {
|
||
var n = t[r++];
|
||
if (r == a)
|
||
delete e[n];
|
||
else {
|
||
if (!(n in e) || "object" != typeof e[n] || null === e[n])
|
||
break;
|
||
e = e[n]
|
||
}
|
||
}
|
||
}
|
||
,
|
||
c.isEmpty = function(e) {
|
||
for (var t in e)
|
||
if (e.hasOwnProperty(t))
|
||
return !1;
|
||
return !0
|
||
}
|
||
,
|
||
c.format = function(e) {
|
||
for (var t, r, a = /%./g, n = 0, i = [], s = 0; t = a.exec(e); ) {
|
||
r = e.substring(s, a.lastIndex - 2),
|
||
r.length > 0 && i.push(r),
|
||
s = a.lastIndex;
|
||
var o = t[0][1];
|
||
switch (o) {
|
||
case "s":
|
||
case "o":
|
||
n < arguments.length ? i.push(arguments[1 + n++]) : i.push("<?>");
|
||
break;
|
||
case "%":
|
||
i.push("%");
|
||
break;
|
||
default:
|
||
i.push("<%" + o + "?>")
|
||
}
|
||
}
|
||
return i.push(e.substring(s)),
|
||
i.join("")
|
||
}
|
||
,
|
||
c.formatNumber = function(e, t, r, a) {
|
||
var n = e
|
||
, i = isNaN(t = Math.abs(t)) ? 2 : t
|
||
, s = void 0 === r ? "," : r
|
||
, o = void 0 === a ? "." : a
|
||
, c = n < 0 ? "-" : ""
|
||
, u = parseInt(n = Math.abs(+n || 0).toFixed(i), 10) + ""
|
||
, l = u.length > 3 ? u.length % 3 : 0;
|
||
return c + (l ? u.substr(0, l) + o : "") + u.substr(l).replace(/(\d{3})(?=\d)/g, "$1" + o) + (i ? s + Math.abs(n - u).toFixed(i).slice(2) : "")
|
||
}
|
||
,
|
||
c.formatSize = function(e) {
|
||
return e = e >= 1073741824 ? c.formatNumber(e / 1073741824, 2, ".", "") + " GiB" : e >= 1048576 ? c.formatNumber(e / 1048576, 2, ".", "") + " MiB" : e >= 1024 ? c.formatNumber(e / 1024, 0) + " KiB" : c.formatNumber(e, 0) + " bytes"
|
||
}
|
||
,
|
||
c.bytesFromIP = function(e) {
|
||
return -1 !== e.indexOf(".") ? c.bytesFromIPv4(e) : -1 !== e.indexOf(":") ? c.bytesFromIPv6(e) : null
|
||
}
|
||
,
|
||
c.bytesFromIPv4 = function(e) {
|
||
if (e = e.split("."),
|
||
4 !== e.length)
|
||
return null;
|
||
for (var t = c.createBuffer(), r = 0; r < e.length; ++r) {
|
||
var a = parseInt(e[r], 10);
|
||
if (isNaN(a))
|
||
return null;
|
||
t.putByte(a)
|
||
}
|
||
return t.getBytes()
|
||
}
|
||
,
|
||
c.bytesFromIPv6 = function(e) {
|
||
var t = 0;
|
||
e = e.split(":").filter(function(e) {
|
||
return 0 === e.length && ++t,
|
||
!0
|
||
});
|
||
for (var r = 2 * (8 - e.length + t), a = c.createBuffer(), n = 0; n < 8; ++n)
|
||
if (e[n] && 0 !== e[n].length) {
|
||
var i = c.hexToBytes(e[n]);
|
||
i.length < 2 && a.putByte(0),
|
||
a.putBytes(i)
|
||
} else
|
||
a.fillWithByte(0, r),
|
||
r = 0;
|
||
return a.getBytes()
|
||
}
|
||
,
|
||
c.bytesToIP = function(e) {
|
||
return 4 === e.length ? c.bytesToIPv4(e) : 16 === e.length ? c.bytesToIPv6(e) : null
|
||
}
|
||
,
|
||
c.bytesToIPv4 = function(e) {
|
||
if (4 !== e.length)
|
||
return null;
|
||
for (var t = [], r = 0; r < e.length; ++r)
|
||
t.push(e.charCodeAt(r));
|
||
return t.join(".")
|
||
}
|
||
,
|
||
c.bytesToIPv6 = function(e) {
|
||
if (16 !== e.length)
|
||
return null;
|
||
for (var t = [], r = [], a = 0, n = 0; n < e.length; n += 2) {
|
||
for (var i = c.bytesToHex(e[n] + e[n + 1]); "0" === i[0] && "0" !== i; )
|
||
i = i.substr(1);
|
||
if ("0" === i) {
|
||
var s = r[r.length - 1]
|
||
, o = t.length;
|
||
s && o === s.end + 1 ? (s.end = o,
|
||
s.end - s.start > r[a].end - r[a].start && (a = r.length - 1)) : r.push({
|
||
start: o,
|
||
end: o
|
||
})
|
||
}
|
||
t.push(i)
|
||
}
|
||
if (r.length > 0) {
|
||
var u = r[a];
|
||
u.end - u.start > 0 && (t.splice(u.start, u.end - u.start + 1, ""),
|
||
0 === u.start && t.unshift(""),
|
||
7 === u.end && t.push(""))
|
||
}
|
||
return t.join(":")
|
||
}
|
||
,
|
||
c.estimateCores = function(e, t) {
|
||
function r(e, s, o) {
|
||
if (0 === s) {
|
||
var u = Math.floor(e.reduce(function(e, t) {
|
||
return e + t
|
||
}, 0) / e.length);
|
||
return c.cores = Math.max(1, u),
|
||
URL.revokeObjectURL(i),
|
||
t(null, c.cores)
|
||
}
|
||
a(o, function(t, a) {
|
||
e.push(n(o, a)),
|
||
r(e, s - 1, o)
|
||
})
|
||
}
|
||
function a(e, t) {
|
||
for (var r = [], a = [], n = 0; n < e; ++n) {
|
||
var s = new Worker(i);
|
||
s.addEventListener("message", function(n) {
|
||
if (a.push(n.data),
|
||
a.length === e) {
|
||
for (var i = 0; i < e; ++i)
|
||
r[i].terminate();
|
||
t(null, a)
|
||
}
|
||
}),
|
||
r.push(s)
|
||
}
|
||
for (var n = 0; n < e; ++n)
|
||
r[n].postMessage(n)
|
||
}
|
||
function n(e, t) {
|
||
for (var r = [], a = 0; a < e; ++a)
|
||
for (var n = t[a], i = r[a] = [], s = 0; s < e; ++s)
|
||
if (a !== s) {
|
||
var o = t[s];
|
||
(n.st > o.st && n.st < o.et || o.st > n.st && o.st < n.et) && i.push(s)
|
||
}
|
||
return r.reduce(function(e, t) {
|
||
return Math.max(e, t.length)
|
||
}, 0)
|
||
}
|
||
if ("function" == typeof e && (t = e,
|
||
e = {}),
|
||
e = e || {},
|
||
"cores"in c && !e.update)
|
||
return t(null, c.cores);
|
||
if ("undefined" != typeof navigator && "hardwareConcurrency"in navigator && navigator.hardwareConcurrency > 0)
|
||
return c.cores = navigator.hardwareConcurrency,
|
||
t(null, c.cores);
|
||
if ("undefined" == typeof Worker)
|
||
return c.cores = 1,
|
||
t(null, c.cores);
|
||
if ("undefined" == typeof Blob)
|
||
return c.cores = 2,
|
||
t(null, c.cores);
|
||
var i = URL.createObjectURL(new Blob(["(", function() {
|
||
self.addEventListener("message", function(e) {
|
||
for (var t = Date.now(), r = t + 4; Date.now() < r; )
|
||
;
|
||
self.postMessage({
|
||
st: t,
|
||
et: r
|
||
})
|
||
})
|
||
}
|
||
.toString(), ")()"],{
|
||
type: "application/javascript"
|
||
}));
|
||
r([], 5, 16)
|
||
}
|
||
}
|
||
).call(t, r(36))
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(5),
|
||
r(23),
|
||
r(24),
|
||
r(1),
|
||
function() {
|
||
if (a.random && a.random.getBytes)
|
||
return void (e.exports = a.random);
|
||
!function(t) {
|
||
function r() {
|
||
var e = a.prng.create(n);
|
||
return e.getBytes = function(t, r) {
|
||
return e.generate(t, r)
|
||
}
|
||
,
|
||
e.getBytesSync = function(t) {
|
||
return e.generate(t)
|
||
}
|
||
,
|
||
e
|
||
}
|
||
var n = {}
|
||
, i = new Array(4)
|
||
, s = a.util.createBuffer();
|
||
n.formatKey = function(e) {
|
||
var t = a.util.createBuffer(e);
|
||
return e = new Array(4),
|
||
e[0] = t.getInt32(),
|
||
e[1] = t.getInt32(),
|
||
e[2] = t.getInt32(),
|
||
e[3] = t.getInt32(),
|
||
a.aes._expandKey(e, !1)
|
||
}
|
||
,
|
||
n.formatSeed = function(e) {
|
||
var t = a.util.createBuffer(e);
|
||
return e = new Array(4),
|
||
e[0] = t.getInt32(),
|
||
e[1] = t.getInt32(),
|
||
e[2] = t.getInt32(),
|
||
e[3] = t.getInt32(),
|
||
e
|
||
}
|
||
,
|
||
n.cipher = function(e, t) {
|
||
return a.aes._updateBlock(e, t, i, !1),
|
||
s.putInt32(i[0]),
|
||
s.putInt32(i[1]),
|
||
s.putInt32(i[2]),
|
||
s.putInt32(i[3]),
|
||
s.getBytes()
|
||
}
|
||
,
|
||
n.increment = function(e) {
|
||
return ++e[3],
|
||
e
|
||
}
|
||
,
|
||
n.md = a.md.sha256;
|
||
var o = r()
|
||
, c = null
|
||
, u = a.util.globalScope
|
||
, l = u.crypto || u.msCrypto;
|
||
if (l && l.getRandomValues && (c = function(e) {
|
||
return l.getRandomValues(e)
|
||
}
|
||
),
|
||
a.options.usePureJavaScript || !a.util.isNodejs && !c) {
|
||
if ("undefined" == typeof window || window.document,
|
||
o.collectInt(+new Date, 32),
|
||
"undefined" != typeof navigator) {
|
||
var p = "";
|
||
for (var f in navigator)
|
||
try {
|
||
"string" == typeof navigator[f] && (p += navigator[f])
|
||
} catch (e) {}
|
||
o.collect(p),
|
||
p = null
|
||
}
|
||
t && (t().mousemove(function(e) {
|
||
o.collectInt(e.clientX, 16),
|
||
o.collectInt(e.clientY, 16)
|
||
}),
|
||
t().keypress(function(e) {
|
||
o.collectInt(e.charCode, 8)
|
||
}))
|
||
}
|
||
if (a.random)
|
||
for (var f in o)
|
||
a.random[f] = o[f];
|
||
else
|
||
a.random = o;
|
||
a.random.createInstance = r,
|
||
e.exports = a.random
|
||
}("undefined" != typeof jQuery ? jQuery : null)
|
||
}()
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e, t, r) {
|
||
if (r > t) {
|
||
var a = new Error("Too few bytes to parse DER.");
|
||
throw a.available = e.length(),
|
||
a.remaining = t,
|
||
a.requested = r,
|
||
a
|
||
}
|
||
}
|
||
function n(e, t, r, i) {
|
||
var c;
|
||
a(e, t, 2);
|
||
var u = e.getByte();
|
||
t--;
|
||
var l = 192 & u
|
||
, p = 31 & u;
|
||
c = e.length();
|
||
var f = o(e, t);
|
||
if (t -= c - e.length(),
|
||
void 0 !== f && f > t) {
|
||
if (i.strict) {
|
||
var h = new Error("Too few bytes to read ASN.1 value.");
|
||
throw h.available = e.length(),
|
||
h.remaining = t,
|
||
h.requested = f,
|
||
h
|
||
}
|
||
f = t
|
||
}
|
||
var d, y, g = 32 == (32 & u);
|
||
if (g)
|
||
if (d = [],
|
||
void 0 === f)
|
||
for (; ; ) {
|
||
if (a(e, t, 2),
|
||
e.bytes(2) === String.fromCharCode(0, 0)) {
|
||
e.getBytes(2),
|
||
t -= 2;
|
||
break
|
||
}
|
||
c = e.length(),
|
||
d.push(n(e, t, r + 1, i)),
|
||
t -= c - e.length()
|
||
}
|
||
else
|
||
for (; f > 0; )
|
||
c = e.length(),
|
||
d.push(n(e, f, r + 1, i)),
|
||
t -= c - e.length(),
|
||
f -= c - e.length();
|
||
if (void 0 === d && l === s.Class.UNIVERSAL && p === s.Type.BITSTRING && (y = e.bytes(f)),
|
||
void 0 === d && i.decodeBitStrings && l === s.Class.UNIVERSAL && p === s.Type.BITSTRING && f > 1) {
|
||
var v = e.read
|
||
, m = t
|
||
, C = 0;
|
||
if (p === s.Type.BITSTRING && (a(e, t, 1),
|
||
C = e.getByte(),
|
||
t--),
|
||
0 === C)
|
||
try {
|
||
c = e.length();
|
||
var E = {
|
||
verbose: i.verbose,
|
||
strict: !0,
|
||
decodeBitStrings: !0
|
||
}
|
||
, S = n(e, t, r + 1, E)
|
||
, T = c - e.length();
|
||
t -= T,
|
||
p == s.Type.BITSTRING && T++;
|
||
var I = S.tagClass;
|
||
T !== f || I !== s.Class.UNIVERSAL && I !== s.Class.CONTEXT_SPECIFIC || (d = [S])
|
||
} catch (e) {}
|
||
void 0 === d && (e.read = v,
|
||
t = m)
|
||
}
|
||
if (void 0 === d) {
|
||
if (void 0 === f) {
|
||
if (i.strict)
|
||
throw new Error("Non-constructed ASN.1 object of indefinite length.");
|
||
f = t
|
||
}
|
||
if (p === s.Type.BMPSTRING)
|
||
for (d = ""; f > 0; f -= 2)
|
||
a(e, t, 2),
|
||
d += String.fromCharCode(e.getInt16()),
|
||
t -= 2;
|
||
else
|
||
d = e.getBytes(f)
|
||
}
|
||
var b = void 0 === y ? null : {
|
||
bitStringContents: y
|
||
};
|
||
return s.create(l, p, g, d, b)
|
||
}
|
||
var i = r(0);
|
||
r(1),
|
||
r(6);
|
||
var s = e.exports = i.asn1 = i.asn1 || {};
|
||
s.Class = {
|
||
UNIVERSAL: 0,
|
||
APPLICATION: 64,
|
||
CONTEXT_SPECIFIC: 128,
|
||
PRIVATE: 192
|
||
},
|
||
s.Type = {
|
||
NONE: 0,
|
||
BOOLEAN: 1,
|
||
INTEGER: 2,
|
||
BITSTRING: 3,
|
||
OCTETSTRING: 4,
|
||
NULL: 5,
|
||
OID: 6,
|
||
ODESC: 7,
|
||
EXTERNAL: 8,
|
||
REAL: 9,
|
||
ENUMERATED: 10,
|
||
EMBEDDED: 11,
|
||
UTF8: 12,
|
||
ROID: 13,
|
||
SEQUENCE: 16,
|
||
SET: 17,
|
||
PRINTABLESTRING: 19,
|
||
IA5STRING: 22,
|
||
UTCTIME: 23,
|
||
GENERALIZEDTIME: 24,
|
||
BMPSTRING: 30
|
||
},
|
||
s.create = function(e, t, r, a, n) {
|
||
if (i.util.isArray(a)) {
|
||
for (var o = [], c = 0; c < a.length; ++c)
|
||
void 0 !== a[c] && o.push(a[c]);
|
||
a = o
|
||
}
|
||
var u = {
|
||
tagClass: e,
|
||
type: t,
|
||
constructed: r,
|
||
composed: r || i.util.isArray(a),
|
||
value: a
|
||
};
|
||
return n && "bitStringContents"in n && (u.bitStringContents = n.bitStringContents,
|
||
u.original = s.copy(u)),
|
||
u
|
||
}
|
||
,
|
||
s.copy = function(e, t) {
|
||
var r;
|
||
if (i.util.isArray(e)) {
|
||
r = [];
|
||
for (var a = 0; a < e.length; ++a)
|
||
r.push(s.copy(e[a], t));
|
||
return r
|
||
}
|
||
return "string" == typeof e ? e : (r = {
|
||
tagClass: e.tagClass,
|
||
type: e.type,
|
||
constructed: e.constructed,
|
||
composed: e.composed,
|
||
value: s.copy(e.value, t)
|
||
},
|
||
t && !t.excludeBitStringContents && (r.bitStringContents = e.bitStringContents),
|
||
r)
|
||
}
|
||
,
|
||
s.equals = function(e, t, r) {
|
||
if (i.util.isArray(e)) {
|
||
if (!i.util.isArray(t))
|
||
return !1;
|
||
if (e.length !== t.length)
|
||
return !1;
|
||
for (var a = 0; a < e.length; ++a)
|
||
if (!s.equals(e[a], t[a]))
|
||
return !1;
|
||
return !0
|
||
}
|
||
if (typeof e != typeof t)
|
||
return !1;
|
||
if ("string" == typeof e)
|
||
return e === t;
|
||
var n = e.tagClass === t.tagClass && e.type === t.type && e.constructed === t.constructed && e.composed === t.composed && s.equals(e.value, t.value);
|
||
return r && r.includeBitStringContents && (n = n && e.bitStringContents === t.bitStringContents),
|
||
n
|
||
}
|
||
,
|
||
s.getBerValueLength = function(e) {
|
||
var t = e.getByte();
|
||
if (128 !== t) {
|
||
return 128 & t ? e.getInt((127 & t) << 3) : t
|
||
}
|
||
}
|
||
;
|
||
var o = function(e, t) {
|
||
var r = e.getByte();
|
||
if (t--,
|
||
128 !== r) {
|
||
var n;
|
||
if (128 & r) {
|
||
var i = 127 & r;
|
||
a(e, t, i),
|
||
n = e.getInt(i << 3)
|
||
} else
|
||
n = r;
|
||
if (n < 0)
|
||
throw new Error("Negative length: " + n);
|
||
return n
|
||
}
|
||
};
|
||
s.fromDer = function(e, t) {
|
||
return void 0 === t && (t = {
|
||
strict: !0,
|
||
decodeBitStrings: !0
|
||
}),
|
||
"boolean" == typeof t && (t = {
|
||
strict: t,
|
||
decodeBitStrings: !0
|
||
}),
|
||
"strict"in t || (t.strict = !0),
|
||
"decodeBitStrings"in t || (t.decodeBitStrings = !0),
|
||
"string" == typeof e && (e = i.util.createBuffer(e)),
|
||
n(e, e.length(), 0, t)
|
||
}
|
||
,
|
||
s.toDer = function(e) {
|
||
var t = i.util.createBuffer()
|
||
, r = e.tagClass | e.type
|
||
, a = i.util.createBuffer()
|
||
, n = !1;
|
||
if ("bitStringContents"in e && (n = !0,
|
||
e.original && (n = s.equals(e, e.original))),
|
||
n)
|
||
a.putBytes(e.bitStringContents);
|
||
else if (e.composed) {
|
||
e.constructed ? r |= 32 : a.putByte(0);
|
||
for (var o = 0; o < e.value.length; ++o)
|
||
void 0 !== e.value[o] && a.putBuffer(s.toDer(e.value[o]))
|
||
} else if (e.type === s.Type.BMPSTRING)
|
||
for (var o = 0; o < e.value.length; ++o)
|
||
a.putInt16(e.value.charCodeAt(o));
|
||
else
|
||
e.type === s.Type.INTEGER && e.value.length > 1 && (0 === e.value.charCodeAt(0) && 0 == (128 & e.value.charCodeAt(1)) || 255 === e.value.charCodeAt(0) && 128 == (128 & e.value.charCodeAt(1))) ? a.putBytes(e.value.substr(1)) : a.putBytes(e.value);
|
||
if (t.putByte(r),
|
||
a.length() <= 127)
|
||
t.putByte(127 & a.length());
|
||
else {
|
||
var c = a.length()
|
||
, u = "";
|
||
do {
|
||
u += String.fromCharCode(255 & c),
|
||
c >>>= 8
|
||
} while (c > 0);
|
||
t.putByte(128 | u.length);
|
||
for (var o = u.length - 1; o >= 0; --o)
|
||
t.putByte(u.charCodeAt(o))
|
||
}
|
||
return t.putBuffer(a),
|
||
t
|
||
}
|
||
,
|
||
s.oidToDer = function(e) {
|
||
var t = e.split(".")
|
||
, r = i.util.createBuffer();
|
||
r.putByte(40 * parseInt(t[0], 10) + parseInt(t[1], 10));
|
||
for (var a, n, s, o, c = 2; c < t.length; ++c) {
|
||
a = !0,
|
||
n = [],
|
||
s = parseInt(t[c], 10);
|
||
do {
|
||
o = 127 & s,
|
||
s >>>= 7,
|
||
a || (o |= 128),
|
||
n.push(o),
|
||
a = !1
|
||
} while (s > 0);
|
||
for (var u = n.length - 1; u >= 0; --u)
|
||
r.putByte(n[u])
|
||
}
|
||
return r
|
||
}
|
||
,
|
||
s.derToOid = function(e) {
|
||
var t;
|
||
"string" == typeof e && (e = i.util.createBuffer(e));
|
||
var r = e.getByte();
|
||
t = Math.floor(r / 40) + "." + r % 40;
|
||
for (var a = 0; e.length() > 0; )
|
||
r = e.getByte(),
|
||
a <<= 7,
|
||
128 & r ? a += 127 & r : (t += "." + (a + r),
|
||
a = 0);
|
||
return t
|
||
}
|
||
,
|
||
s.utcTimeToDate = function(e) {
|
||
var t = new Date
|
||
, r = parseInt(e.substr(0, 2), 10);
|
||
r = r >= 50 ? 1900 + r : 2e3 + r;
|
||
var a = parseInt(e.substr(2, 2), 10) - 1
|
||
, n = parseInt(e.substr(4, 2), 10)
|
||
, i = parseInt(e.substr(6, 2), 10)
|
||
, s = parseInt(e.substr(8, 2), 10)
|
||
, o = 0;
|
||
if (e.length > 11) {
|
||
var c = e.charAt(10)
|
||
, u = 10;
|
||
"+" !== c && "-" !== c && (o = parseInt(e.substr(10, 2), 10),
|
||
u += 2)
|
||
}
|
||
if (t.setUTCFullYear(r, a, n),
|
||
t.setUTCHours(i, s, o, 0),
|
||
u && ("+" === (c = e.charAt(u)) || "-" === c)) {
|
||
var l = parseInt(e.substr(u + 1, 2), 10)
|
||
, p = parseInt(e.substr(u + 4, 2), 10)
|
||
, f = 60 * l + p;
|
||
f *= 6e4,
|
||
"+" === c ? t.setTime(+t - f) : t.setTime(+t + f)
|
||
}
|
||
return t
|
||
}
|
||
,
|
||
s.generalizedTimeToDate = function(e) {
|
||
var t = new Date
|
||
, r = parseInt(e.substr(0, 4), 10)
|
||
, a = parseInt(e.substr(4, 2), 10) - 1
|
||
, n = parseInt(e.substr(6, 2), 10)
|
||
, i = parseInt(e.substr(8, 2), 10)
|
||
, s = parseInt(e.substr(10, 2), 10)
|
||
, o = parseInt(e.substr(12, 2), 10)
|
||
, c = 0
|
||
, u = 0
|
||
, l = !1;
|
||
"Z" === e.charAt(e.length - 1) && (l = !0);
|
||
var p = e.length - 5
|
||
, f = e.charAt(p);
|
||
if ("+" === f || "-" === f) {
|
||
u = 60 * parseInt(e.substr(p + 1, 2), 10) + parseInt(e.substr(p + 4, 2), 10),
|
||
u *= 6e4,
|
||
"+" === f && (u *= -1),
|
||
l = !0
|
||
}
|
||
return "." === e.charAt(14) && (c = 1e3 * parseFloat(e.substr(14), 10)),
|
||
l ? (t.setUTCFullYear(r, a, n),
|
||
t.setUTCHours(i, s, o, c),
|
||
t.setTime(+t + u)) : (t.setFullYear(r, a, n),
|
||
t.setHours(i, s, o, c)),
|
||
t
|
||
}
|
||
,
|
||
s.dateToUtcTime = function(e) {
|
||
if ("string" == typeof e)
|
||
return e;
|
||
var t = ""
|
||
, r = [];
|
||
r.push(("" + e.getUTCFullYear()).substr(2)),
|
||
r.push("" + (e.getUTCMonth() + 1)),
|
||
r.push("" + e.getUTCDate()),
|
||
r.push("" + e.getUTCHours()),
|
||
r.push("" + e.getUTCMinutes()),
|
||
r.push("" + e.getUTCSeconds());
|
||
for (var a = 0; a < r.length; ++a)
|
||
r[a].length < 2 && (t += "0"),
|
||
t += r[a];
|
||
return t += "Z"
|
||
}
|
||
,
|
||
s.dateToGeneralizedTime = function(e) {
|
||
if ("string" == typeof e)
|
||
return e;
|
||
var t = ""
|
||
, r = [];
|
||
r.push("" + e.getUTCFullYear()),
|
||
r.push("" + (e.getUTCMonth() + 1)),
|
||
r.push("" + e.getUTCDate()),
|
||
r.push("" + e.getUTCHours()),
|
||
r.push("" + e.getUTCMinutes()),
|
||
r.push("" + e.getUTCSeconds());
|
||
for (var a = 0; a < r.length; ++a)
|
||
r[a].length < 2 && (t += "0"),
|
||
t += r[a];
|
||
return t += "Z"
|
||
}
|
||
,
|
||
s.integerToDer = function(e) {
|
||
var t = i.util.createBuffer();
|
||
if (e >= -128 && e < 128)
|
||
return t.putSignedInt(e, 8);
|
||
if (e >= -32768 && e < 32768)
|
||
return t.putSignedInt(e, 16);
|
||
if (e >= -8388608 && e < 8388608)
|
||
return t.putSignedInt(e, 24);
|
||
if (e >= -2147483648 && e < 2147483648)
|
||
return t.putSignedInt(e, 32);
|
||
var r = new Error("Integer too large; max is 32-bits.");
|
||
throw r.integer = e,
|
||
r
|
||
}
|
||
,
|
||
s.derToInteger = function(e) {
|
||
"string" == typeof e && (e = i.util.createBuffer(e));
|
||
var t = 8 * e.length();
|
||
if (t > 32)
|
||
throw new Error("Integer too large; max is 32-bits.");
|
||
return e.getSignedInt(t)
|
||
}
|
||
,
|
||
s.validate = function(e, t, r, a) {
|
||
var n = !1;
|
||
if (e.tagClass !== t.tagClass && void 0 !== t.tagClass || e.type !== t.type && void 0 !== t.type)
|
||
a && (e.tagClass !== t.tagClass && a.push("[" + t.name + '] Expected tag class "' + t.tagClass + '", got "' + e.tagClass + '"'),
|
||
e.type !== t.type && a.push("[" + t.name + '] Expected type "' + t.type + '", got "' + e.type + '"'));
|
||
else if (e.constructed === t.constructed || void 0 === t.constructed) {
|
||
if (n = !0,
|
||
t.value && i.util.isArray(t.value))
|
||
for (var o = 0, c = 0; n && c < t.value.length; ++c)
|
||
n = t.value[c].optional || !1,
|
||
e.value[o] && (n = s.validate(e.value[o], t.value[c], r, a),
|
||
n ? ++o : t.value[c].optional && (n = !0)),
|
||
!n && a && a.push("[" + t.name + '] Tag class "' + t.tagClass + '", type "' + t.type + '" expected value length "' + t.value.length + '", got "' + e.value.length + '"');
|
||
if (n && r && (t.capture && (r[t.capture] = e.value),
|
||
t.captureAsn1 && (r[t.captureAsn1] = e),
|
||
t.captureBitStringContents && "bitStringContents"in e && (r[t.captureBitStringContents] = e.bitStringContents),
|
||
t.captureBitStringValue && "bitStringContents"in e)) {
|
||
if (e.bitStringContents.length < 2)
|
||
r[t.captureBitStringValue] = "";
|
||
else {
|
||
var u = e.bitStringContents.charCodeAt(0);
|
||
if (0 !== u)
|
||
throw new Error("captureBitStringValue only supported for zero unused bits");
|
||
r[t.captureBitStringValue] = e.bitStringContents.slice(1)
|
||
}
|
||
}
|
||
} else
|
||
a && a.push("[" + t.name + '] Expected constructed "' + t.constructed + '", got "' + e.constructed + '"');
|
||
return n
|
||
}
|
||
;
|
||
var c = /[^\\u0000-\\u00ff]/;
|
||
s.prettyPrint = function(e, t, r) {
|
||
var a = "";
|
||
t = t || 0,
|
||
r = r || 2,
|
||
t > 0 && (a += "\n");
|
||
for (var n = "", o = 0; o < t * r; ++o)
|
||
n += " ";
|
||
switch (a += n + "Tag: ",
|
||
e.tagClass) {
|
||
case s.Class.UNIVERSAL:
|
||
a += "Universal:";
|
||
break;
|
||
case s.Class.APPLICATION:
|
||
a += "Application:";
|
||
break;
|
||
case s.Class.CONTEXT_SPECIFIC:
|
||
a += "Context-Specific:";
|
||
break;
|
||
case s.Class.PRIVATE:
|
||
a += "Private:"
|
||
}
|
||
if (e.tagClass === s.Class.UNIVERSAL)
|
||
switch (a += e.type,
|
||
e.type) {
|
||
case s.Type.NONE:
|
||
a += " (None)";
|
||
break;
|
||
case s.Type.BOOLEAN:
|
||
a += " (Boolean)";
|
||
break;
|
||
case s.Type.INTEGER:
|
||
a += " (Integer)";
|
||
break;
|
||
case s.Type.BITSTRING:
|
||
a += " (Bit string)";
|
||
break;
|
||
case s.Type.OCTETSTRING:
|
||
a += " (Octet string)";
|
||
break;
|
||
case s.Type.NULL:
|
||
a += " (Null)";
|
||
break;
|
||
case s.Type.OID:
|
||
a += " (Object Identifier)";
|
||
break;
|
||
case s.Type.ODESC:
|
||
a += " (Object Descriptor)";
|
||
break;
|
||
case s.Type.EXTERNAL:
|
||
a += " (External or Instance of)";
|
||
break;
|
||
case s.Type.REAL:
|
||
a += " (Real)";
|
||
break;
|
||
case s.Type.ENUMERATED:
|
||
a += " (Enumerated)";
|
||
break;
|
||
case s.Type.EMBEDDED:
|
||
a += " (Embedded PDV)";
|
||
break;
|
||
case s.Type.UTF8:
|
||
a += " (UTF8)";
|
||
break;
|
||
case s.Type.ROID:
|
||
a += " (Relative Object Identifier)";
|
||
break;
|
||
case s.Type.SEQUENCE:
|
||
a += " (Sequence)";
|
||
break;
|
||
case s.Type.SET:
|
||
a += " (Set)";
|
||
break;
|
||
case s.Type.PRINTABLESTRING:
|
||
a += " (Printable String)";
|
||
break;
|
||
case s.Type.IA5String:
|
||
a += " (IA5String (ASCII))";
|
||
break;
|
||
case s.Type.UTCTIME:
|
||
a += " (UTC time)";
|
||
break;
|
||
case s.Type.GENERALIZEDTIME:
|
||
a += " (Generalized time)";
|
||
break;
|
||
case s.Type.BMPSTRING:
|
||
a += " (BMP String)"
|
||
}
|
||
else
|
||
a += e.type;
|
||
if (a += "\n",
|
||
a += n + "Constructed: " + e.constructed + "\n",
|
||
e.composed) {
|
||
for (var u = 0, l = "", o = 0; o < e.value.length; ++o)
|
||
void 0 !== e.value[o] && (u += 1,
|
||
l += s.prettyPrint(e.value[o], t + 1, r),
|
||
o + 1 < e.value.length && (l += ","));
|
||
a += n + "Sub values: " + u + l
|
||
} else {
|
||
if (a += n + "Value: ",
|
||
e.type === s.Type.OID) {
|
||
var p = s.derToOid(e.value);
|
||
a += p,
|
||
i.pki && i.pki.oids && p in i.pki.oids && (a += " (" + i.pki.oids[p] + ") ")
|
||
}
|
||
if (e.type === s.Type.INTEGER)
|
||
try {
|
||
a += s.derToInteger(e.value)
|
||
} catch (t) {
|
||
a += "0x" + i.util.bytesToHex(e.value)
|
||
}
|
||
else if (e.type === s.Type.BITSTRING) {
|
||
if (e.value.length > 1 ? a += "0x" + i.util.bytesToHex(e.value.slice(1)) : a += "(none)",
|
||
e.value.length > 0) {
|
||
var f = e.value.charCodeAt(0);
|
||
1 == f ? a += " (1 unused bit shown)" : f > 1 && (a += " (" + f + " unused bits shown)")
|
||
}
|
||
} else
|
||
e.type === s.Type.OCTETSTRING ? (c.test(e.value) || (a += "(" + e.value + ") "),
|
||
a += "0x" + i.util.bytesToHex(e.value)) : e.type === s.Type.UTF8 ? a += i.util.decodeUtf8(e.value) : e.type === s.Type.PRINTABLESTRING || e.type === s.Type.IA5String ? a += e.value : c.test(e.value) ? a += "0x" + i.util.bytesToHex(e.value) : 0 === e.value.length ? a += "[null]" : a += e.value
|
||
}
|
||
return a
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
e.exports = a.md = a.md || {},
|
||
a.md.algorithms = a.md.algorithms || {}
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e, t) {
|
||
var r = function() {
|
||
return new c.aes.Algorithm(e,t)
|
||
};
|
||
c.cipher.registerAlgorithm(e, r)
|
||
}
|
||
function n() {
|
||
d = !0,
|
||
p = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54];
|
||
for (var e = new Array(256), t = 0; t < 128; ++t)
|
||
e[t] = t << 1,
|
||
e[t + 128] = t + 128 << 1 ^ 283;
|
||
u = new Array(256),
|
||
l = new Array(256),
|
||
f = new Array(4),
|
||
h = new Array(4);
|
||
for (var t = 0; t < 4; ++t)
|
||
f[t] = new Array(256),
|
||
h[t] = new Array(256);
|
||
for (var r, a, n, i, s, o, c, y = 0, g = 0, t = 0; t < 256; ++t) {
|
||
i = g ^ g << 1 ^ g << 2 ^ g << 3 ^ g << 4,
|
||
i = i >> 8 ^ 255 & i ^ 99,
|
||
u[y] = i,
|
||
l[i] = y,
|
||
s = e[i],
|
||
r = e[y],
|
||
a = e[r],
|
||
n = e[a],
|
||
o = s << 24 ^ i << 16 ^ i << 8 ^ i ^ s,
|
||
c = (r ^ a ^ n) << 24 ^ (y ^ n) << 16 ^ (y ^ a ^ n) << 8 ^ y ^ r ^ n;
|
||
for (var v = 0; v < 4; ++v)
|
||
f[v][y] = o,
|
||
h[v][i] = c,
|
||
o = o << 24 | o >>> 8,
|
||
c = c << 24 | c >>> 8;
|
||
0 === y ? y = g = 1 : (y = r ^ e[e[e[r ^ n]]],
|
||
g ^= e[e[g]])
|
||
}
|
||
}
|
||
function i(e, t) {
|
||
for (var r, a = e.slice(0), n = 1, i = a.length, s = i + 6 + 1, o = y * s, c = i; c < o; ++c)
|
||
r = a[c - 1],
|
||
c % i == 0 ? (r = u[r >>> 16 & 255] << 24 ^ u[r >>> 8 & 255] << 16 ^ u[255 & r] << 8 ^ u[r >>> 24] ^ p[n] << 24,
|
||
n++) : i > 6 && c % i == 4 && (r = u[r >>> 24] << 24 ^ u[r >>> 16 & 255] << 16 ^ u[r >>> 8 & 255] << 8 ^ u[255 & r]),
|
||
a[c] = a[c - i] ^ r;
|
||
if (t) {
|
||
var l, f = h[0], d = h[1], g = h[2], v = h[3], m = a.slice(0);
|
||
o = a.length;
|
||
for (var c = 0, C = o - y; c < o; c += y,
|
||
C -= y)
|
||
if (0 === c || c === o - y)
|
||
m[c] = a[C],
|
||
m[c + 1] = a[C + 3],
|
||
m[c + 2] = a[C + 2],
|
||
m[c + 3] = a[C + 1];
|
||
else
|
||
for (var E = 0; E < y; ++E)
|
||
l = a[C + E],
|
||
m[c + (3 & -E)] = f[u[l >>> 24]] ^ d[u[l >>> 16 & 255]] ^ g[u[l >>> 8 & 255]] ^ v[u[255 & l]];
|
||
a = m
|
||
}
|
||
return a
|
||
}
|
||
function s(e, t, r, a) {
|
||
var n, i, s, o, c, p = e.length / 4 - 1;
|
||
a ? (n = h[0],
|
||
i = h[1],
|
||
s = h[2],
|
||
o = h[3],
|
||
c = l) : (n = f[0],
|
||
i = f[1],
|
||
s = f[2],
|
||
o = f[3],
|
||
c = u);
|
||
var d, y, g, v, m, C, E;
|
||
d = t[0] ^ e[0],
|
||
y = t[a ? 3 : 1] ^ e[1],
|
||
g = t[2] ^ e[2],
|
||
v = t[a ? 1 : 3] ^ e[3];
|
||
for (var S = 3, T = 1; T < p; ++T)
|
||
m = n[d >>> 24] ^ i[y >>> 16 & 255] ^ s[g >>> 8 & 255] ^ o[255 & v] ^ e[++S],
|
||
C = n[y >>> 24] ^ i[g >>> 16 & 255] ^ s[v >>> 8 & 255] ^ o[255 & d] ^ e[++S],
|
||
E = n[g >>> 24] ^ i[v >>> 16 & 255] ^ s[d >>> 8 & 255] ^ o[255 & y] ^ e[++S],
|
||
v = n[v >>> 24] ^ i[d >>> 16 & 255] ^ s[y >>> 8 & 255] ^ o[255 & g] ^ e[++S],
|
||
d = m,
|
||
y = C,
|
||
g = E;
|
||
r[0] = c[d >>> 24] << 24 ^ c[y >>> 16 & 255] << 16 ^ c[g >>> 8 & 255] << 8 ^ c[255 & v] ^ e[++S],
|
||
r[a ? 3 : 1] = c[y >>> 24] << 24 ^ c[g >>> 16 & 255] << 16 ^ c[v >>> 8 & 255] << 8 ^ c[255 & d] ^ e[++S],
|
||
r[2] = c[g >>> 24] << 24 ^ c[v >>> 16 & 255] << 16 ^ c[d >>> 8 & 255] << 8 ^ c[255 & y] ^ e[++S],
|
||
r[a ? 1 : 3] = c[v >>> 24] << 24 ^ c[d >>> 16 & 255] << 16 ^ c[y >>> 8 & 255] << 8 ^ c[255 & g] ^ e[++S]
|
||
}
|
||
function o(e) {
|
||
e = e || {};
|
||
var t, r = (e.mode || "CBC").toUpperCase(), a = "AES-" + r;
|
||
t = e.decrypt ? c.cipher.createDecipher(a, e.key) : c.cipher.createCipher(a, e.key);
|
||
var n = t.start;
|
||
return t.start = function(e, r) {
|
||
var a = null;
|
||
r instanceof c.util.ByteBuffer && (a = r,
|
||
r = {}),
|
||
r = r || {},
|
||
r.output = a,
|
||
r.iv = e,
|
||
n.call(t, r)
|
||
}
|
||
,
|
||
t
|
||
}
|
||
var c = r(0);
|
||
r(13),
|
||
r(19),
|
||
r(1),
|
||
e.exports = c.aes = c.aes || {},
|
||
c.aes.startEncrypting = function(e, t, r, a) {
|
||
var n = o({
|
||
key: e,
|
||
output: r,
|
||
decrypt: !1,
|
||
mode: a
|
||
});
|
||
return n.start(t),
|
||
n
|
||
}
|
||
,
|
||
c.aes.createEncryptionCipher = function(e, t) {
|
||
return o({
|
||
key: e,
|
||
output: null,
|
||
decrypt: !1,
|
||
mode: t
|
||
})
|
||
}
|
||
,
|
||
c.aes.startDecrypting = function(e, t, r, a) {
|
||
var n = o({
|
||
key: e,
|
||
output: r,
|
||
decrypt: !0,
|
||
mode: a
|
||
});
|
||
return n.start(t),
|
||
n
|
||
}
|
||
,
|
||
c.aes.createDecryptionCipher = function(e, t) {
|
||
return o({
|
||
key: e,
|
||
output: null,
|
||
decrypt: !0,
|
||
mode: t
|
||
})
|
||
}
|
||
,
|
||
c.aes.Algorithm = function(e, t) {
|
||
d || n();
|
||
var r = this;
|
||
r.name = e,
|
||
r.mode = new t({
|
||
blockSize: 16,
|
||
cipher: {
|
||
encrypt: function(e, t) {
|
||
return s(r._w, e, t, !1)
|
||
},
|
||
decrypt: function(e, t) {
|
||
return s(r._w, e, t, !0)
|
||
}
|
||
}
|
||
}),
|
||
r._init = !1
|
||
}
|
||
,
|
||
c.aes.Algorithm.prototype.initialize = function(e) {
|
||
if (!this._init) {
|
||
var t, r = e.key;
|
||
if ("string" != typeof r || 16 !== r.length && 24 !== r.length && 32 !== r.length) {
|
||
if (c.util.isArray(r) && (16 === r.length || 24 === r.length || 32 === r.length)) {
|
||
t = r,
|
||
r = c.util.createBuffer();
|
||
for (var a = 0; a < t.length; ++a)
|
||
r.putByte(t[a])
|
||
}
|
||
} else
|
||
r = c.util.createBuffer(r);
|
||
if (!c.util.isArray(r)) {
|
||
t = r,
|
||
r = [];
|
||
var n = t.length();
|
||
if (16 === n || 24 === n || 32 === n) {
|
||
n >>>= 2;
|
||
for (var a = 0; a < n; ++a)
|
||
r.push(t.getInt32())
|
||
}
|
||
}
|
||
if (!c.util.isArray(r) || 4 !== r.length && 6 !== r.length && 8 !== r.length)
|
||
throw new Error("Invalid key parameter.");
|
||
var s = this.mode.name
|
||
, o = -1 !== ["CFB", "OFB", "CTR", "GCM"].indexOf(s);
|
||
this._w = i(r, e.decrypt && !o),
|
||
this._init = !0
|
||
}
|
||
}
|
||
,
|
||
c.aes._expandKey = function(e, t) {
|
||
return d || n(),
|
||
i(e, t)
|
||
}
|
||
,
|
||
c.aes._updateBlock = s,
|
||
a("AES-ECB", c.cipher.modes.ecb),
|
||
a("AES-CBC", c.cipher.modes.cbc),
|
||
a("AES-CFB", c.cipher.modes.cfb),
|
||
a("AES-OFB", c.cipher.modes.ofb),
|
||
a("AES-CTR", c.cipher.modes.ctr),
|
||
a("AES-GCM", c.cipher.modes.gcm);
|
||
var u, l, p, f, h, d = !1, y = 4
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e, t) {
|
||
s[e] = t,
|
||
s[t] = e
|
||
}
|
||
function n(e, t) {
|
||
s[e] = t
|
||
}
|
||
var i = r(0);
|
||
i.pki = i.pki || {};
|
||
var s = e.exports = i.pki.oids = i.oids = i.oids || {};
|
||
a("1.2.840.113549.1.1.1", "rsaEncryption"),
|
||
a("1.2.840.113549.1.1.4", "md5WithRSAEncryption"),
|
||
a("1.2.840.113549.1.1.5", "sha1WithRSAEncryption"),
|
||
a("1.2.840.113549.1.1.7", "RSAES-OAEP"),
|
||
a("1.2.840.113549.1.1.8", "mgf1"),
|
||
a("1.2.840.113549.1.1.9", "pSpecified"),
|
||
a("1.2.840.113549.1.1.10", "RSASSA-PSS"),
|
||
a("1.2.840.113549.1.1.11", "sha256WithRSAEncryption"),
|
||
a("1.2.840.113549.1.1.12", "sha384WithRSAEncryption"),
|
||
a("1.2.840.113549.1.1.13", "sha512WithRSAEncryption"),
|
||
a("1.2.840.10040.4.3", "dsa-with-sha1"),
|
||
a("1.3.14.3.2.7", "desCBC"),
|
||
a("1.3.14.3.2.26", "sha1"),
|
||
a("2.16.840.1.101.3.4.2.1", "sha256"),
|
||
a("2.16.840.1.101.3.4.2.2", "sha384"),
|
||
a("2.16.840.1.101.3.4.2.3", "sha512"),
|
||
a("1.2.840.113549.2.5", "md5"),
|
||
a("1.2.840.113549.1.7.1", "data"),
|
||
a("1.2.840.113549.1.7.2", "signedData"),
|
||
a("1.2.840.113549.1.7.3", "envelopedData"),
|
||
a("1.2.840.113549.1.7.4", "signedAndEnvelopedData"),
|
||
a("1.2.840.113549.1.7.5", "digestedData"),
|
||
a("1.2.840.113549.1.7.6", "encryptedData"),
|
||
a("1.2.840.113549.1.9.1", "emailAddress"),
|
||
a("1.2.840.113549.1.9.2", "unstructuredName"),
|
||
a("1.2.840.113549.1.9.3", "contentType"),
|
||
a("1.2.840.113549.1.9.4", "messageDigest"),
|
||
a("1.2.840.113549.1.9.5", "signingTime"),
|
||
a("1.2.840.113549.1.9.6", "counterSignature"),
|
||
a("1.2.840.113549.1.9.7", "challengePassword"),
|
||
a("1.2.840.113549.1.9.8", "unstructuredAddress"),
|
||
a("1.2.840.113549.1.9.14", "extensionRequest"),
|
||
a("1.2.840.113549.1.9.20", "friendlyName"),
|
||
a("1.2.840.113549.1.9.21", "localKeyId"),
|
||
a("1.2.840.113549.1.9.22.1", "x509Certificate"),
|
||
a("1.2.840.113549.1.12.10.1.1", "keyBag"),
|
||
a("1.2.840.113549.1.12.10.1.2", "pkcs8ShroudedKeyBag"),
|
||
a("1.2.840.113549.1.12.10.1.3", "certBag"),
|
||
a("1.2.840.113549.1.12.10.1.4", "crlBag"),
|
||
a("1.2.840.113549.1.12.10.1.5", "secretBag"),
|
||
a("1.2.840.113549.1.12.10.1.6", "safeContentsBag"),
|
||
a("1.2.840.113549.1.5.13", "pkcs5PBES2"),
|
||
a("1.2.840.113549.1.5.12", "pkcs5PBKDF2"),
|
||
a("1.2.840.113549.1.12.1.1", "pbeWithSHAAnd128BitRC4"),
|
||
a("1.2.840.113549.1.12.1.2", "pbeWithSHAAnd40BitRC4"),
|
||
a("1.2.840.113549.1.12.1.3", "pbeWithSHAAnd3-KeyTripleDES-CBC"),
|
||
a("1.2.840.113549.1.12.1.4", "pbeWithSHAAnd2-KeyTripleDES-CBC"),
|
||
a("1.2.840.113549.1.12.1.5", "pbeWithSHAAnd128BitRC2-CBC"),
|
||
a("1.2.840.113549.1.12.1.6", "pbewithSHAAnd40BitRC2-CBC"),
|
||
a("1.2.840.113549.2.7", "hmacWithSHA1"),
|
||
a("1.2.840.113549.2.8", "hmacWithSHA224"),
|
||
a("1.2.840.113549.2.9", "hmacWithSHA256"),
|
||
a("1.2.840.113549.2.10", "hmacWithSHA384"),
|
||
a("1.2.840.113549.2.11", "hmacWithSHA512"),
|
||
a("1.2.840.113549.3.7", "des-EDE3-CBC"),
|
||
a("2.16.840.1.101.3.4.1.2", "aes128-CBC"),
|
||
a("2.16.840.1.101.3.4.1.22", "aes192-CBC"),
|
||
a("2.16.840.1.101.3.4.1.42", "aes256-CBC"),
|
||
a("2.5.4.3", "commonName"),
|
||
a("2.5.4.5", "serialName"),
|
||
a("2.5.4.6", "countryName"),
|
||
a("2.5.4.7", "localityName"),
|
||
a("2.5.4.8", "stateOrProvinceName"),
|
||
a("2.5.4.10", "organizationName"),
|
||
a("2.5.4.11", "organizationalUnitName"),
|
||
a("2.5.4.13", "description"),
|
||
a("2.16.840.1.113730.1.1", "nsCertType"),
|
||
a("2.16.840.1.113730.1.13", "nsComment"),
|
||
n("2.5.29.1", "authorityKeyIdentifier"),
|
||
n("2.5.29.2", "keyAttributes"),
|
||
n("2.5.29.3", "certificatePolicies"),
|
||
n("2.5.29.4", "keyUsageRestriction"),
|
||
n("2.5.29.5", "policyMapping"),
|
||
n("2.5.29.6", "subtreesConstraint"),
|
||
n("2.5.29.7", "subjectAltName"),
|
||
n("2.5.29.8", "issuerAltName"),
|
||
n("2.5.29.9", "subjectDirectoryAttributes"),
|
||
n("2.5.29.10", "basicConstraints"),
|
||
n("2.5.29.11", "nameConstraints"),
|
||
n("2.5.29.12", "policyConstraints"),
|
||
n("2.5.29.13", "basicConstraints"),
|
||
a("2.5.29.14", "subjectKeyIdentifier"),
|
||
a("2.5.29.15", "keyUsage"),
|
||
n("2.5.29.16", "privateKeyUsagePeriod"),
|
||
a("2.5.29.17", "subjectAltName"),
|
||
a("2.5.29.18", "issuerAltName"),
|
||
a("2.5.29.19", "basicConstraints"),
|
||
n("2.5.29.20", "cRLNumber"),
|
||
n("2.5.29.21", "cRLReason"),
|
||
n("2.5.29.22", "expirationDate"),
|
||
n("2.5.29.23", "instructionCode"),
|
||
n("2.5.29.24", "invalidityDate"),
|
||
n("2.5.29.25", "cRLDistributionPoints"),
|
||
n("2.5.29.26", "issuingDistributionPoint"),
|
||
n("2.5.29.27", "deltaCRLIndicator"),
|
||
n("2.5.29.28", "issuingDistributionPoint"),
|
||
n("2.5.29.29", "certificateIssuer"),
|
||
n("2.5.29.30", "nameConstraints"),
|
||
a("2.5.29.31", "cRLDistributionPoints"),
|
||
a("2.5.29.32", "certificatePolicies"),
|
||
n("2.5.29.33", "policyMappings"),
|
||
n("2.5.29.34", "policyConstraints"),
|
||
a("2.5.29.35", "authorityKeyIdentifier"),
|
||
n("2.5.29.36", "policyConstraints"),
|
||
a("2.5.29.37", "extKeyUsage"),
|
||
n("2.5.29.46", "freshestCRL"),
|
||
n("2.5.29.54", "inhibitAnyPolicy"),
|
||
a("1.3.6.1.4.1.11129.2.4.2", "timestampList"),
|
||
a("1.3.6.1.5.5.7.1.1", "authorityInfoAccess"),
|
||
a("1.3.6.1.5.5.7.3.1", "serverAuth"),
|
||
a("1.3.6.1.5.5.7.3.2", "clientAuth"),
|
||
a("1.3.6.1.5.5.7.3.3", "codeSigning"),
|
||
a("1.3.6.1.5.5.7.3.4", "emailProtection"),
|
||
a("1.3.6.1.5.5.7.3.8", "timeStamping")
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e) {
|
||
for (var t = e.name + ": ", r = [], a = function(e, t) {
|
||
return " " + t
|
||
}, n = 0; n < e.values.length; ++n)
|
||
r.push(e.values[n].replace(/^(\S+\r\n)/, a));
|
||
t += r.join(",") + "\r\n";
|
||
for (var i = 0, s = -1, n = 0; n < t.length; ++n,
|
||
++i)
|
||
if (i > 65 && -1 !== s) {
|
||
var o = t[s];
|
||
"," === o ? (++s,
|
||
t = t.substr(0, s) + "\r\n " + t.substr(s)) : t = t.substr(0, s) + "\r\n" + o + t.substr(s + 1),
|
||
i = n - s - 1,
|
||
s = -1,
|
||
++n
|
||
} else
|
||
" " !== t[n] && "\t" !== t[n] && "," !== t[n] || (s = n);
|
||
return t
|
||
}
|
||
function n(e) {
|
||
return e.replace(/^\s+/, "")
|
||
}
|
||
var i = r(0);
|
||
r(1);
|
||
var s = e.exports = i.pem = i.pem || {};
|
||
s.encode = function(e, t) {
|
||
t = t || {};
|
||
var r, n = "-----BEGIN " + e.type + "-----\r\n";
|
||
if (e.procType && (r = {
|
||
name: "Proc-Type",
|
||
values: [String(e.procType.version), e.procType.type]
|
||
},
|
||
n += a(r)),
|
||
e.contentDomain && (r = {
|
||
name: "Content-Domain",
|
||
values: [e.contentDomain]
|
||
},
|
||
n += a(r)),
|
||
e.dekInfo && (r = {
|
||
name: "DEK-Info",
|
||
values: [e.dekInfo.algorithm]
|
||
},
|
||
e.dekInfo.parameters && r.values.push(e.dekInfo.parameters),
|
||
n += a(r)),
|
||
e.headers)
|
||
for (var s = 0; s < e.headers.length; ++s)
|
||
n += a(e.headers[s]);
|
||
return e.procType && (n += "\r\n"),
|
||
n += i.util.encode64(e.body, t.maxline || 64) + "\r\n",
|
||
n += "-----END " + e.type + "-----\r\n"
|
||
}
|
||
,
|
||
s.decode = function(e) {
|
||
for (var t, r = [], a = /\s*-----BEGIN ([A-Z0-9- ]+)-----\r?\n?([\x21-\x7e\s]+?(?:\r?\n\r?\n))?([:A-Za-z0-9+\/=\s]+?)-----END \1-----/g, s = /([\x21-\x7e]+):\s*([\x21-\x7e\s^:]+)/, o = /\r?\n/; ; ) {
|
||
if (!(t = a.exec(e)))
|
||
break;
|
||
var c = {
|
||
type: t[1],
|
||
procType: null,
|
||
contentDomain: null,
|
||
dekInfo: null,
|
||
headers: [],
|
||
body: i.util.decode64(t[3])
|
||
};
|
||
if (r.push(c),
|
||
t[2]) {
|
||
for (var u = t[2].split(o), l = 0; t && l < u.length; ) {
|
||
for (var p = u[l].replace(/\s+$/, ""), f = l + 1; f < u.length; ++f) {
|
||
var h = u[f];
|
||
if (!/\s/.test(h[0]))
|
||
break;
|
||
p += h,
|
||
l = f
|
||
}
|
||
if (t = p.match(s)) {
|
||
for (var d = {
|
||
name: t[1],
|
||
values: []
|
||
}, y = t[2].split(","), g = 0; g < y.length; ++g)
|
||
d.values.push(n(y[g]));
|
||
if (c.procType)
|
||
if (c.contentDomain || "Content-Domain" !== d.name)
|
||
if (c.dekInfo || "DEK-Info" !== d.name)
|
||
c.headers.push(d);
|
||
else {
|
||
if (0 === d.values.length)
|
||
throw new Error('Invalid PEM formatted message. The "DEK-Info" header must have at least one subfield.');
|
||
c.dekInfo = {
|
||
algorithm: y[0],
|
||
parameters: y[1] || null
|
||
}
|
||
}
|
||
else
|
||
c.contentDomain = y[0] || "";
|
||
else {
|
||
if ("Proc-Type" !== d.name)
|
||
throw new Error('Invalid PEM formatted message. The first encapsulated header must be "Proc-Type".');
|
||
if (2 !== d.values.length)
|
||
throw new Error('Invalid PEM formatted message. The "Proc-Type" header must have two subfields.');
|
||
c.procType = {
|
||
version: y[0],
|
||
type: y[1]
|
||
}
|
||
}
|
||
}
|
||
++l
|
||
}
|
||
if ("ENCRYPTED" === c.procType && !c.dekInfo)
|
||
throw new Error('Invalid PEM formatted message. The "DEK-Info" header must be present if "Proc-Type" is "ENCRYPTED".')
|
||
}
|
||
}
|
||
if (0 === r.length)
|
||
throw new Error("Invalid PEM formatted message.");
|
||
return r
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(4),
|
||
r(1),
|
||
(e.exports = a.hmac = a.hmac || {}).create = function() {
|
||
var e = null
|
||
, t = null
|
||
, r = null
|
||
, n = null
|
||
, i = {};
|
||
return i.start = function(i, s) {
|
||
if (null !== i)
|
||
if ("string" == typeof i) {
|
||
if (!((i = i.toLowerCase())in a.md.algorithms))
|
||
throw new Error('Unknown hash algorithm "' + i + '"');
|
||
t = a.md.algorithms[i].create()
|
||
} else
|
||
t = i;
|
||
if (null === s)
|
||
s = e;
|
||
else {
|
||
if ("string" == typeof s)
|
||
s = a.util.createBuffer(s);
|
||
else if (a.util.isArray(s)) {
|
||
var o = s;
|
||
s = a.util.createBuffer();
|
||
for (var c = 0; c < o.length; ++c)
|
||
s.putByte(o[c])
|
||
}
|
||
var u = s.length();
|
||
u > t.blockLength && (t.start(),
|
||
t.update(s.bytes()),
|
||
s = t.digest()),
|
||
r = a.util.createBuffer(),
|
||
n = a.util.createBuffer(),
|
||
u = s.length();
|
||
for (var c = 0; c < u; ++c) {
|
||
var o = s.at(c);
|
||
r.putByte(54 ^ o),
|
||
n.putByte(92 ^ o)
|
||
}
|
||
if (u < t.blockLength)
|
||
for (var o = t.blockLength - u, c = 0; c < o; ++c)
|
||
r.putByte(54),
|
||
n.putByte(92);
|
||
e = s,
|
||
r = r.bytes(),
|
||
n = n.bytes()
|
||
}
|
||
t.start(),
|
||
t.update(r)
|
||
}
|
||
,
|
||
i.update = function(e) {
|
||
t.update(e)
|
||
}
|
||
,
|
||
i.getMac = function() {
|
||
var e = t.digest().bytes();
|
||
return t.start(),
|
||
t.update(n),
|
||
t.update(e),
|
||
t.digest()
|
||
}
|
||
,
|
||
i.digest = i.getMac,
|
||
i
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
function a() {
|
||
o = String.fromCharCode(128),
|
||
o += i.util.fillString(String.fromCharCode(0), 64),
|
||
c = !0
|
||
}
|
||
function n(e, t, r) {
|
||
for (var a, n, i, s, o, c, u, l, p = r.length(); p >= 64; ) {
|
||
for (n = e.h0,
|
||
i = e.h1,
|
||
s = e.h2,
|
||
o = e.h3,
|
||
c = e.h4,
|
||
l = 0; l < 16; ++l)
|
||
a = r.getInt32(),
|
||
t[l] = a,
|
||
u = o ^ i & (s ^ o),
|
||
a = (n << 5 | n >>> 27) + u + c + 1518500249 + a,
|
||
c = o,
|
||
o = s,
|
||
s = (i << 30 | i >>> 2) >>> 0,
|
||
i = n,
|
||
n = a;
|
||
for (; l < 20; ++l)
|
||
a = t[l - 3] ^ t[l - 8] ^ t[l - 14] ^ t[l - 16],
|
||
a = a << 1 | a >>> 31,
|
||
t[l] = a,
|
||
u = o ^ i & (s ^ o),
|
||
a = (n << 5 | n >>> 27) + u + c + 1518500249 + a,
|
||
c = o,
|
||
o = s,
|
||
s = (i << 30 | i >>> 2) >>> 0,
|
||
i = n,
|
||
n = a;
|
||
for (; l < 32; ++l)
|
||
a = t[l - 3] ^ t[l - 8] ^ t[l - 14] ^ t[l - 16],
|
||
a = a << 1 | a >>> 31,
|
||
t[l] = a,
|
||
u = i ^ s ^ o,
|
||
a = (n << 5 | n >>> 27) + u + c + 1859775393 + a,
|
||
c = o,
|
||
o = s,
|
||
s = (i << 30 | i >>> 2) >>> 0,
|
||
i = n,
|
||
n = a;
|
||
for (; l < 40; ++l)
|
||
a = t[l - 6] ^ t[l - 16] ^ t[l - 28] ^ t[l - 32],
|
||
a = a << 2 | a >>> 30,
|
||
t[l] = a,
|
||
u = i ^ s ^ o,
|
||
a = (n << 5 | n >>> 27) + u + c + 1859775393 + a,
|
||
c = o,
|
||
o = s,
|
||
s = (i << 30 | i >>> 2) >>> 0,
|
||
i = n,
|
||
n = a;
|
||
for (; l < 60; ++l)
|
||
a = t[l - 6] ^ t[l - 16] ^ t[l - 28] ^ t[l - 32],
|
||
a = a << 2 | a >>> 30,
|
||
t[l] = a,
|
||
u = i & s | o & (i ^ s),
|
||
a = (n << 5 | n >>> 27) + u + c + 2400959708 + a,
|
||
c = o,
|
||
o = s,
|
||
s = (i << 30 | i >>> 2) >>> 0,
|
||
i = n,
|
||
n = a;
|
||
for (; l < 80; ++l)
|
||
a = t[l - 6] ^ t[l - 16] ^ t[l - 28] ^ t[l - 32],
|
||
a = a << 2 | a >>> 30,
|
||
t[l] = a,
|
||
u = i ^ s ^ o,
|
||
a = (n << 5 | n >>> 27) + u + c + 3395469782 + a,
|
||
c = o,
|
||
o = s,
|
||
s = (i << 30 | i >>> 2) >>> 0,
|
||
i = n,
|
||
n = a;
|
||
e.h0 = e.h0 + n | 0,
|
||
e.h1 = e.h1 + i | 0,
|
||
e.h2 = e.h2 + s | 0,
|
||
e.h3 = e.h3 + o | 0,
|
||
e.h4 = e.h4 + c | 0,
|
||
p -= 64
|
||
}
|
||
}
|
||
var i = r(0);
|
||
r(4),
|
||
r(1);
|
||
var s = e.exports = i.sha1 = i.sha1 || {};
|
||
i.md.sha1 = i.md.algorithms.sha1 = s,
|
||
s.create = function() {
|
||
c || a();
|
||
var e = null
|
||
, t = i.util.createBuffer()
|
||
, r = new Array(80)
|
||
, s = {
|
||
algorithm: "sha1",
|
||
blockLength: 64,
|
||
digestLength: 20,
|
||
messageLength: 0,
|
||
fullMessageLength: null,
|
||
messageLengthSize: 8
|
||
};
|
||
return s.start = function() {
|
||
s.messageLength = 0,
|
||
s.fullMessageLength = s.messageLength64 = [];
|
||
for (var r = s.messageLengthSize / 4, a = 0; a < r; ++a)
|
||
s.fullMessageLength.push(0);
|
||
return t = i.util.createBuffer(),
|
||
e = {
|
||
h0: 1732584193,
|
||
h1: 4023233417,
|
||
h2: 2562383102,
|
||
h3: 271733878,
|
||
h4: 3285377520
|
||
},
|
||
s
|
||
}
|
||
,
|
||
s.start(),
|
||
s.update = function(a, o) {
|
||
"utf8" === o && (a = i.util.encodeUtf8(a));
|
||
var c = a.length;
|
||
s.messageLength += c,
|
||
c = [c / 4294967296 >>> 0, c >>> 0];
|
||
for (var u = s.fullMessageLength.length - 1; u >= 0; --u)
|
||
s.fullMessageLength[u] += c[1],
|
||
c[1] = c[0] + (s.fullMessageLength[u] / 4294967296 >>> 0),
|
||
s.fullMessageLength[u] = s.fullMessageLength[u] >>> 0,
|
||
c[0] = c[1] / 4294967296 >>> 0;
|
||
return t.putBytes(a),
|
||
n(e, r, t),
|
||
(t.read > 2048 || 0 === t.length()) && t.compact(),
|
||
s
|
||
}
|
||
,
|
||
s.digest = function() {
|
||
var a = i.util.createBuffer();
|
||
a.putBytes(t.bytes());
|
||
var c = s.fullMessageLength[s.fullMessageLength.length - 1] + s.messageLengthSize
|
||
, u = c & s.blockLength - 1;
|
||
a.putBytes(o.substr(0, s.blockLength - u));
|
||
for (var l, p, f = 8 * s.fullMessageLength[0], h = 0; h < s.fullMessageLength.length - 1; ++h)
|
||
l = 8 * s.fullMessageLength[h + 1],
|
||
p = l / 4294967296 >>> 0,
|
||
f += p,
|
||
a.putInt32(f >>> 0),
|
||
f = l >>> 0;
|
||
a.putInt32(f);
|
||
var d = {
|
||
h0: e.h0,
|
||
h1: e.h1,
|
||
h2: e.h2,
|
||
h3: e.h3,
|
||
h4: e.h4
|
||
};
|
||
n(d, r, a);
|
||
var y = i.util.createBuffer();
|
||
return y.putInt32(d.h0),
|
||
y.putInt32(d.h1),
|
||
y.putInt32(d.h2),
|
||
y.putInt32(d.h3),
|
||
y.putInt32(d.h4),
|
||
y
|
||
}
|
||
,
|
||
s
|
||
}
|
||
;
|
||
var o = null
|
||
, c = !1
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e, t) {
|
||
var r = function() {
|
||
return new o.des.Algorithm(e,t)
|
||
};
|
||
o.cipher.registerAlgorithm(e, r)
|
||
}
|
||
function n(e) {
|
||
for (var t, r = [0, 4, 536870912, 536870916, 65536, 65540, 536936448, 536936452, 512, 516, 536871424, 536871428, 66048, 66052, 536936960, 536936964], a = [0, 1, 1048576, 1048577, 67108864, 67108865, 68157440, 68157441, 256, 257, 1048832, 1048833, 67109120, 67109121, 68157696, 68157697], n = [0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272, 0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272], i = [0, 2097152, 134217728, 136314880, 8192, 2105344, 134225920, 136323072, 131072, 2228224, 134348800, 136445952, 139264, 2236416, 134356992, 136454144], s = [0, 262144, 16, 262160, 0, 262144, 16, 262160, 4096, 266240, 4112, 266256, 4096, 266240, 4112, 266256], o = [0, 1024, 32, 1056, 0, 1024, 32, 1056, 33554432, 33555456, 33554464, 33555488, 33554432, 33555456, 33554464, 33555488], c = [0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746, 0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746], u = [0, 65536, 2048, 67584, 536870912, 536936448, 536872960, 536938496, 131072, 196608, 133120, 198656, 537001984, 537067520, 537004032, 537069568], l = [0, 262144, 0, 262144, 2, 262146, 2, 262146, 33554432, 33816576, 33554432, 33816576, 33554434, 33816578, 33554434, 33816578], p = [0, 268435456, 8, 268435464, 0, 268435456, 8, 268435464, 1024, 268436480, 1032, 268436488, 1024, 268436480, 1032, 268436488], f = [0, 32, 0, 32, 1048576, 1048608, 1048576, 1048608, 8192, 8224, 8192, 8224, 1056768, 1056800, 1056768, 1056800], h = [0, 16777216, 512, 16777728, 2097152, 18874368, 2097664, 18874880, 67108864, 83886080, 67109376, 83886592, 69206016, 85983232, 69206528, 85983744], d = [0, 4096, 134217728, 134221824, 524288, 528384, 134742016, 134746112, 16, 4112, 134217744, 134221840, 524304, 528400, 134742032, 134746128], y = [0, 4, 256, 260, 0, 4, 256, 260, 1, 5, 257, 261, 1, 5, 257, 261], g = e.length() > 8 ? 3 : 1, v = [], m = [0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0], C = 0, E = 0; E < g; E++) {
|
||
var S = e.getInt32()
|
||
, T = e.getInt32();
|
||
t = 252645135 & (S >>> 4 ^ T),
|
||
T ^= t,
|
||
S ^= t << 4,
|
||
t = 65535 & (T >>> -16 ^ S),
|
||
S ^= t,
|
||
T ^= t << -16,
|
||
t = 858993459 & (S >>> 2 ^ T),
|
||
T ^= t,
|
||
S ^= t << 2,
|
||
t = 65535 & (T >>> -16 ^ S),
|
||
S ^= t,
|
||
T ^= t << -16,
|
||
t = 1431655765 & (S >>> 1 ^ T),
|
||
T ^= t,
|
||
S ^= t << 1,
|
||
t = 16711935 & (T >>> 8 ^ S),
|
||
S ^= t,
|
||
T ^= t << 8,
|
||
t = 1431655765 & (S >>> 1 ^ T),
|
||
T ^= t,
|
||
S ^= t << 1,
|
||
t = S << 8 | T >>> 20 & 240,
|
||
S = T << 24 | T << 8 & 16711680 | T >>> 8 & 65280 | T >>> 24 & 240,
|
||
T = t;
|
||
for (var I = 0; I < m.length; ++I) {
|
||
m[I] ? (S = S << 2 | S >>> 26,
|
||
T = T << 2 | T >>> 26) : (S = S << 1 | S >>> 27,
|
||
T = T << 1 | T >>> 27),
|
||
S &= -15,
|
||
T &= -15;
|
||
var b = r[S >>> 28] | a[S >>> 24 & 15] | n[S >>> 20 & 15] | i[S >>> 16 & 15] | s[S >>> 12 & 15] | o[S >>> 8 & 15] | c[S >>> 4 & 15]
|
||
, A = u[T >>> 28] | l[T >>> 24 & 15] | p[T >>> 20 & 15] | f[T >>> 16 & 15] | h[T >>> 12 & 15] | d[T >>> 8 & 15] | y[T >>> 4 & 15];
|
||
t = 65535 & (A >>> 16 ^ b),
|
||
v[C++] = b ^ t,
|
||
v[C++] = A ^ t << 16
|
||
}
|
||
}
|
||
return v
|
||
}
|
||
function i(e, t, r, a) {
|
||
var n, i = 32 === e.length ? 3 : 9;
|
||
n = 3 === i ? a ? [30, -2, -2] : [0, 32, 2] : a ? [94, 62, -2, 32, 64, 2, 30, -2, -2] : [0, 32, 2, 62, 30, -2, 64, 96, 2];
|
||
var s, o = t[0], g = t[1];
|
||
s = 252645135 & (o >>> 4 ^ g),
|
||
g ^= s,
|
||
o ^= s << 4,
|
||
s = 65535 & (o >>> 16 ^ g),
|
||
g ^= s,
|
||
o ^= s << 16,
|
||
s = 858993459 & (g >>> 2 ^ o),
|
||
o ^= s,
|
||
g ^= s << 2,
|
||
s = 16711935 & (g >>> 8 ^ o),
|
||
o ^= s,
|
||
g ^= s << 8,
|
||
s = 1431655765 & (o >>> 1 ^ g),
|
||
g ^= s,
|
||
o ^= s << 1,
|
||
o = o << 1 | o >>> 31,
|
||
g = g << 1 | g >>> 31;
|
||
for (var v = 0; v < i; v += 3) {
|
||
for (var m = n[v + 1], C = n[v + 2], E = n[v]; E != m; E += C) {
|
||
var S = g ^ e[E]
|
||
, T = (g >>> 4 | g << 28) ^ e[E + 1];
|
||
s = o,
|
||
o = g,
|
||
g = s ^ (u[S >>> 24 & 63] | p[S >>> 16 & 63] | h[S >>> 8 & 63] | y[63 & S] | c[T >>> 24 & 63] | l[T >>> 16 & 63] | f[T >>> 8 & 63] | d[63 & T])
|
||
}
|
||
s = o,
|
||
o = g,
|
||
g = s
|
||
}
|
||
o = o >>> 1 | o << 31,
|
||
g = g >>> 1 | g << 31,
|
||
s = 1431655765 & (o >>> 1 ^ g),
|
||
g ^= s,
|
||
o ^= s << 1,
|
||
s = 16711935 & (g >>> 8 ^ o),
|
||
o ^= s,
|
||
g ^= s << 8,
|
||
s = 858993459 & (g >>> 2 ^ o),
|
||
o ^= s,
|
||
g ^= s << 2,
|
||
s = 65535 & (o >>> 16 ^ g),
|
||
g ^= s,
|
||
o ^= s << 16,
|
||
s = 252645135 & (o >>> 4 ^ g),
|
||
g ^= s,
|
||
o ^= s << 4,
|
||
r[0] = o,
|
||
r[1] = g
|
||
}
|
||
function s(e) {
|
||
e = e || {};
|
||
var t, r = (e.mode || "CBC").toUpperCase(), a = "DES-" + r;
|
||
t = e.decrypt ? o.cipher.createDecipher(a, e.key) : o.cipher.createCipher(a, e.key);
|
||
var n = t.start;
|
||
return t.start = function(e, r) {
|
||
var a = null;
|
||
r instanceof o.util.ByteBuffer && (a = r,
|
||
r = {}),
|
||
r = r || {},
|
||
r.output = a,
|
||
r.iv = e,
|
||
n.call(t, r)
|
||
}
|
||
,
|
||
t
|
||
}
|
||
var o = r(0);
|
||
r(13),
|
||
r(19),
|
||
r(1),
|
||
e.exports = o.des = o.des || {},
|
||
o.des.startEncrypting = function(e, t, r, a) {
|
||
var n = s({
|
||
key: e,
|
||
output: r,
|
||
decrypt: !1,
|
||
mode: a || (null === t ? "ECB" : "CBC")
|
||
});
|
||
return n.start(t),
|
||
n
|
||
}
|
||
,
|
||
o.des.createEncryptionCipher = function(e, t) {
|
||
return s({
|
||
key: e,
|
||
output: null,
|
||
decrypt: !1,
|
||
mode: t
|
||
})
|
||
}
|
||
,
|
||
o.des.startDecrypting = function(e, t, r, a) {
|
||
var n = s({
|
||
key: e,
|
||
output: r,
|
||
decrypt: !0,
|
||
mode: a || (null === t ? "ECB" : "CBC")
|
||
});
|
||
return n.start(t),
|
||
n
|
||
}
|
||
,
|
||
o.des.createDecryptionCipher = function(e, t) {
|
||
return s({
|
||
key: e,
|
||
output: null,
|
||
decrypt: !0,
|
||
mode: t
|
||
})
|
||
}
|
||
,
|
||
o.des.Algorithm = function(e, t) {
|
||
var r = this;
|
||
r.name = e,
|
||
r.mode = new t({
|
||
blockSize: 8,
|
||
cipher: {
|
||
encrypt: function(e, t) {
|
||
return i(r._keys, e, t, !1)
|
||
},
|
||
decrypt: function(e, t) {
|
||
return i(r._keys, e, t, !0)
|
||
}
|
||
}
|
||
}),
|
||
r._init = !1
|
||
}
|
||
,
|
||
o.des.Algorithm.prototype.initialize = function(e) {
|
||
if (!this._init) {
|
||
var t = o.util.createBuffer(e.key);
|
||
if (0 === this.name.indexOf("3DES") && 24 !== t.length())
|
||
throw new Error("Invalid Triple-DES key size: " + 8 * t.length());
|
||
this._keys = n(t),
|
||
this._init = !0
|
||
}
|
||
}
|
||
,
|
||
a("DES-ECB", o.cipher.modes.ecb),
|
||
a("DES-CBC", o.cipher.modes.cbc),
|
||
a("DES-CFB", o.cipher.modes.cfb),
|
||
a("DES-OFB", o.cipher.modes.ofb),
|
||
a("DES-CTR", o.cipher.modes.ctr),
|
||
a("3DES-ECB", o.cipher.modes.ecb),
|
||
a("3DES-CBC", o.cipher.modes.cbc),
|
||
a("3DES-CFB", o.cipher.modes.cfb),
|
||
a("3DES-OFB", o.cipher.modes.ofb),
|
||
a("3DES-CTR", o.cipher.modes.ctr);
|
||
var c = [16843776, 0, 65536, 16843780, 16842756, 66564, 4, 65536, 1024, 16843776, 16843780, 1024, 16778244, 16842756, 16777216, 4, 1028, 16778240, 16778240, 66560, 66560, 16842752, 16842752, 16778244, 65540, 16777220, 16777220, 65540, 0, 1028, 66564, 16777216, 65536, 16843780, 4, 16842752, 16843776, 16777216, 16777216, 1024, 16842756, 65536, 66560, 16777220, 1024, 4, 16778244, 66564, 16843780, 65540, 16842752, 16778244, 16777220, 1028, 66564, 16843776, 1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756]
|
||
, u = [-2146402272, -2147450880, 32768, 1081376, 1048576, 32, -2146435040, -2147450848, -2147483616, -2146402272, -2146402304, -2147483648, -2147450880, 1048576, 32, -2146435040, 1081344, 1048608, -2147450848, 0, -2147483648, 32768, 1081376, -2146435072, 1048608, -2147483616, 0, 1081344, 32800, -2146402304, -2146435072, 32800, 0, 1081376, -2146435040, 1048576, -2147450848, -2146435072, -2146402304, 32768, -2146435072, -2147450880, 32, -2146402272, 1081376, 32, 32768, -2147483648, 32800, -2146402304, 1048576, -2147483616, 1048608, -2147450848, -2147483616, 1048608, 1081344, 0, -2147450880, 32800, -2147483648, -2146435040, -2146402272, 1081344]
|
||
, l = [520, 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736, 134217736, 131072, 134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584, 134348800, 134348808, 131592, 134218248, 131584, 131072, 134218248, 8, 134349320, 512, 134217728, 134349312, 134217728, 131080, 520, 131072, 134349312, 134218240, 0, 512, 131080, 134349320, 134218240, 134217736, 512, 0, 134348808, 134218248, 131072, 134217728, 134349320, 8, 131592, 131584, 134217736, 134348800, 134218248, 520, 134348800, 131592, 8, 134348808, 131584]
|
||
, p = [8396801, 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929, 129, 0, 8388736, 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737, 1, 8320, 8388736, 8192, 8396928, 8396929, 129, 8388736, 8388609, 8396800, 8396929, 129, 0, 0, 8396800, 8320, 8388736, 8388737, 1, 8396801, 8321, 8321, 128, 8396929, 129, 1, 8192, 8388609, 8193, 8396928, 8388737, 8193, 8320, 8388608, 8396801, 128, 8388608, 8192, 8396928]
|
||
, f = [256, 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368, 524288, 33554688, 1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112, 1074266112, 0, 1073742080, 1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0, 1107296256, 34078976, 33554432, 1107296256, 524544, 524288, 1107296512, 256, 33554432, 1073741824, 34078720, 1107296512, 1074266368, 33554688, 1073741824, 1107820544, 34078976, 1074266368, 256, 33554432, 1107820544, 1107820800, 524544, 1107296256, 1107820800, 34078720, 0, 1074266112, 1107296256, 524544, 33554688, 1073742080, 524288, 0, 1074266112, 34078976, 1073742080]
|
||
, h = [536870928, 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296, 4210704, 4194304, 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312, 16384, 4210688, 536887312, 16, 541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688, 541081600, 536870912, 536887296, 16, 541065232, 4210688, 541081616, 4194304, 16400, 536870928, 4194304, 536887296, 536870912, 16400, 536870928, 541081616, 4210688, 541065216, 4210704, 541081600, 0, 541065232, 16, 16384, 541065216, 4210704, 16384, 4194320, 536887312, 0, 541081600, 536870912, 4194320, 536887312]
|
||
, d = [2097152, 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152, 0, 67108866, 2, 67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866, 69206016, 69208064, 2097154, 69206016, 2048, 2050, 69208066, 2099200, 2, 67108864, 2099200, 67108864, 2099200, 2097152, 67110914, 67110914, 69206018, 69206018, 2, 2097154, 67108864, 67110912, 2097152, 69208064, 2050, 2099202, 69208064, 2050, 67108866, 69208066, 69206016, 2099200, 0, 2, 69208066, 0, 2099202, 69206016, 2048, 67108866, 67110912, 2048, 2097154]
|
||
, y = [268439616, 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208, 268697600, 268701760, 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160, 266240, 262208, 268697664, 268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304, 262144, 266304, 262144, 268701696, 4096, 64, 268697664, 4096, 266304, 268439552, 64, 268435520, 268697600, 268697664, 268435456, 262144, 268439616, 0, 268701760, 262208, 268435520, 268697600, 268439552, 268439616, 0, 268701760, 266240, 266240, 4160, 4160, 262208, 268435456, 268701696]
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e, t, r) {
|
||
var a = f.util.createBuffer()
|
||
, n = Math.ceil(t.n.bitLength() / 8);
|
||
if (e.length > n - 11) {
|
||
var i = new Error("Message is too long for PKCS#1 v1.5 padding.");
|
||
throw i.length = e.length,
|
||
i.max = n - 11,
|
||
i
|
||
}
|
||
a.putByte(0),
|
||
a.putByte(r);
|
||
var s, o = n - 3 - e.length;
|
||
if (0 === r || 1 === r) {
|
||
s = 0 === r ? 0 : 255;
|
||
for (var c = 0; c < o; ++c)
|
||
a.putByte(s)
|
||
} else
|
||
for (; o > 0; ) {
|
||
for (var u = 0, l = f.random.getBytes(o), c = 0; c < o; ++c)
|
||
s = l.charCodeAt(c),
|
||
0 === s ? ++u : a.putByte(s);
|
||
o = u
|
||
}
|
||
return a.putByte(0),
|
||
a.putBytes(e),
|
||
a
|
||
}
|
||
function n(e, t, r, a) {
|
||
var n = Math.ceil(t.n.bitLength() / 8)
|
||
, i = f.util.createBuffer(e)
|
||
, s = i.getByte()
|
||
, o = i.getByte();
|
||
if (0 !== s || r && 0 !== o && 1 !== o || !r && 2 != o || r && 0 === o && void 0 === a)
|
||
throw new Error("Encryption block is invalid.");
|
||
var c = 0;
|
||
if (0 === o) {
|
||
c = n - 3 - a;
|
||
for (var u = 0; u < c; ++u)
|
||
if (0 !== i.getByte())
|
||
throw new Error("Encryption block is invalid.")
|
||
} else if (1 === o)
|
||
for (c = 0; i.length() > 1; ) {
|
||
if (255 !== i.getByte()) {
|
||
--i.read;
|
||
break
|
||
}
|
||
++c
|
||
}
|
||
else if (2 === o)
|
||
for (c = 0; i.length() > 1; ) {
|
||
if (0 === i.getByte()) {
|
||
--i.read;
|
||
break
|
||
}
|
||
++c
|
||
}
|
||
if (0 !== i.getByte() || c !== n - 3 - i.length())
|
||
throw new Error("Encryption block is invalid.");
|
||
return i.getBytes()
|
||
}
|
||
function i(e, t, r) {
|
||
function a() {
|
||
n(e.pBits, function(t, a) {
|
||
return t ? r(t) : (e.p = a,
|
||
null !== e.q ? i(t, e.q) : void n(e.qBits, i))
|
||
})
|
||
}
|
||
function n(e, t) {
|
||
f.prime.generateProbablePrime(e, s, t)
|
||
}
|
||
function i(t, s) {
|
||
if (t)
|
||
return r(t);
|
||
if (e.q = s,
|
||
e.p.compareTo(e.q) < 0) {
|
||
var o = e.p;
|
||
e.p = e.q,
|
||
e.q = o
|
||
}
|
||
if (0 !== e.p.subtract(h.ONE).gcd(e.e).compareTo(h.ONE))
|
||
return e.p = null,
|
||
void a();
|
||
if (0 !== e.q.subtract(h.ONE).gcd(e.e).compareTo(h.ONE))
|
||
return e.q = null,
|
||
void n(e.qBits, i);
|
||
if (e.p1 = e.p.subtract(h.ONE),
|
||
e.q1 = e.q.subtract(h.ONE),
|
||
e.phi = e.p1.multiply(e.q1),
|
||
0 !== e.phi.gcd(e.e).compareTo(h.ONE))
|
||
return e.p = e.q = null,
|
||
void a();
|
||
if (e.n = e.p.multiply(e.q),
|
||
e.n.bitLength() !== e.bits)
|
||
return e.q = null,
|
||
void n(e.qBits, i);
|
||
var c = e.e.modInverse(e.phi);
|
||
e.keys = {
|
||
privateKey: v.rsa.setPrivateKey(e.n, e.e, c, e.p, e.q, c.mod(e.p1), c.mod(e.q1), e.q.modInverse(e.p)),
|
||
publicKey: v.rsa.setPublicKey(e.n, e.e)
|
||
},
|
||
r(null, e.keys)
|
||
}
|
||
"function" == typeof t && (r = t,
|
||
t = {}),
|
||
t = t || {};
|
||
var s = {
|
||
algorithm: {
|
||
name: t.algorithm || "PRIMEINC",
|
||
options: {
|
||
workers: t.workers || 2,
|
||
workLoad: t.workLoad || 100,
|
||
workerScript: t.workerScript
|
||
}
|
||
}
|
||
};
|
||
"prng"in t && (s.prng = t.prng),
|
||
a()
|
||
}
|
||
function s(e) {
|
||
var t = e.toString(16);
|
||
t[0] >= "8" && (t = "00" + t);
|
||
var r = f.util.hexToBytes(t);
|
||
return r.length > 1 && (0 === r.charCodeAt(0) && 0 == (128 & r.charCodeAt(1)) || 255 === r.charCodeAt(0) && 128 == (128 & r.charCodeAt(1))) ? r.substr(1) : r
|
||
}
|
||
function o(e) {
|
||
return e <= 100 ? 27 : e <= 150 ? 18 : e <= 200 ? 15 : e <= 250 ? 12 : e <= 300 ? 9 : e <= 350 ? 8 : e <= 400 ? 7 : e <= 500 ? 6 : e <= 600 ? 5 : e <= 800 ? 4 : e <= 1250 ? 3 : 2
|
||
}
|
||
function c(e) {
|
||
return f.util.isNodejs && "function" == typeof d[e]
|
||
}
|
||
function u(e) {
|
||
return void 0 !== g.globalScope && "object" == typeof g.globalScope.crypto && "object" == typeof g.globalScope.crypto.subtle && "function" == typeof g.globalScope.crypto.subtle[e]
|
||
}
|
||
function l(e) {
|
||
return void 0 !== g.globalScope && "object" == typeof g.globalScope.msCrypto && "object" == typeof g.globalScope.msCrypto.subtle && "function" == typeof g.globalScope.msCrypto.subtle[e]
|
||
}
|
||
function p(e) {
|
||
for (var t = f.util.hexToBytes(e.toString(16)), r = new Uint8Array(t.length), a = 0; a < t.length; ++a)
|
||
r[a] = t.charCodeAt(a);
|
||
return r
|
||
}
|
||
var f = r(0);
|
||
if (r(3),
|
||
r(12),
|
||
r(6),
|
||
r(26),
|
||
r(27),
|
||
r(2),
|
||
r(1),
|
||
void 0 === h)
|
||
var h = f.jsbn.BigInteger;
|
||
var d = f.util.isNodejs ? r(16) : null
|
||
, y = f.asn1
|
||
, g = f.util;
|
||
f.pki = f.pki || {},
|
||
e.exports = f.pki.rsa = f.rsa = f.rsa || {};
|
||
var v = f.pki
|
||
, m = [6, 4, 2, 4, 2, 4, 6, 2]
|
||
, C = {
|
||
name: "PrivateKeyInfo",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "PrivateKeyInfo.version",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "privateKeyVersion"
|
||
}, {
|
||
name: "PrivateKeyInfo.privateKeyAlgorithm",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "AlgorithmIdentifier.algorithm",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.OID,
|
||
constructed: !1,
|
||
capture: "privateKeyOid"
|
||
}]
|
||
}, {
|
||
name: "PrivateKeyInfo",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.OCTETSTRING,
|
||
constructed: !1,
|
||
capture: "privateKey"
|
||
}]
|
||
}
|
||
, E = {
|
||
name: "RSAPrivateKey",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "RSAPrivateKey.version",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "privateKeyVersion"
|
||
}, {
|
||
name: "RSAPrivateKey.modulus",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "privateKeyModulus"
|
||
}, {
|
||
name: "RSAPrivateKey.publicExponent",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "privateKeyPublicExponent"
|
||
}, {
|
||
name: "RSAPrivateKey.privateExponent",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "privateKeyPrivateExponent"
|
||
}, {
|
||
name: "RSAPrivateKey.prime1",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "privateKeyPrime1"
|
||
}, {
|
||
name: "RSAPrivateKey.prime2",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "privateKeyPrime2"
|
||
}, {
|
||
name: "RSAPrivateKey.exponent1",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "privateKeyExponent1"
|
||
}, {
|
||
name: "RSAPrivateKey.exponent2",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "privateKeyExponent2"
|
||
}, {
|
||
name: "RSAPrivateKey.coefficient",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "privateKeyCoefficient"
|
||
}]
|
||
}
|
||
, S = {
|
||
name: "RSAPublicKey",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "RSAPublicKey.modulus",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "publicKeyModulus"
|
||
}, {
|
||
name: "RSAPublicKey.exponent",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "publicKeyExponent"
|
||
}]
|
||
}
|
||
, T = f.pki.rsa.publicKeyValidator = {
|
||
name: "SubjectPublicKeyInfo",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.SEQUENCE,
|
||
constructed: !0,
|
||
captureAsn1: "subjectPublicKeyInfo",
|
||
value: [{
|
||
name: "SubjectPublicKeyInfo.AlgorithmIdentifier",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "AlgorithmIdentifier.algorithm",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.OID,
|
||
constructed: !1,
|
||
capture: "publicKeyOid"
|
||
}]
|
||
}, {
|
||
name: "SubjectPublicKeyInfo.subjectPublicKey",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.BITSTRING,
|
||
constructed: !1,
|
||
value: [{
|
||
name: "SubjectPublicKeyInfo.subjectPublicKey.RSAPublicKey",
|
||
tagClass: y.Class.UNIVERSAL,
|
||
type: y.Type.SEQUENCE,
|
||
constructed: !0,
|
||
optional: !0,
|
||
captureAsn1: "rsaPublicKey"
|
||
}]
|
||
}]
|
||
}
|
||
, I = function(e) {
|
||
var t;
|
||
if (!(e.algorithm in v.oids)) {
|
||
var r = new Error("Unknown message digest algorithm.");
|
||
throw r.algorithm = e.algorithm,
|
||
r
|
||
}
|
||
t = v.oids[e.algorithm];
|
||
var a = y.oidToDer(t).getBytes()
|
||
, n = y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [])
|
||
, i = y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, []);
|
||
i.value.push(y.create(y.Class.UNIVERSAL, y.Type.OID, !1, a)),
|
||
i.value.push(y.create(y.Class.UNIVERSAL, y.Type.NULL, !1, ""));
|
||
var s = y.create(y.Class.UNIVERSAL, y.Type.OCTETSTRING, !1, e.digest().getBytes());
|
||
return n.value.push(i),
|
||
n.value.push(s),
|
||
y.toDer(n).getBytes()
|
||
}
|
||
, b = function(e, t, r) {
|
||
if (r)
|
||
return e.modPow(t.e, t.n);
|
||
if (!t.p || !t.q)
|
||
return e.modPow(t.d, t.n);
|
||
t.dP || (t.dP = t.d.mod(t.p.subtract(h.ONE))),
|
||
t.dQ || (t.dQ = t.d.mod(t.q.subtract(h.ONE))),
|
||
t.qInv || (t.qInv = t.q.modInverse(t.p));
|
||
var a;
|
||
do {
|
||
a = new h(f.util.bytesToHex(f.random.getBytes(t.n.bitLength() / 8)),16)
|
||
} while (a.compareTo(t.n) >= 0 || !a.gcd(t.n).equals(h.ONE));
|
||
e = e.multiply(a.modPow(t.e, t.n)).mod(t.n);
|
||
for (var n = e.mod(t.p).modPow(t.dP, t.p), i = e.mod(t.q).modPow(t.dQ, t.q); n.compareTo(i) < 0; )
|
||
n = n.add(t.p);
|
||
var s = n.subtract(i).multiply(t.qInv).mod(t.p).multiply(t.q).add(i);
|
||
return s = s.multiply(a.modInverse(t.n)).mod(t.n)
|
||
};
|
||
v.rsa.encrypt = function(e, t, r) {
|
||
var n, i = r, s = Math.ceil(t.n.bitLength() / 8);
|
||
!1 !== r && !0 !== r ? (i = 2 === r,
|
||
n = a(e, t, r)) : (n = f.util.createBuffer(),
|
||
n.putBytes(e));
|
||
for (var o = new h(n.toHex(),16), c = b(o, t, i), u = c.toString(16), l = f.util.createBuffer(), p = s - Math.ceil(u.length / 2); p > 0; )
|
||
l.putByte(0),
|
||
--p;
|
||
return l.putBytes(f.util.hexToBytes(u)),
|
||
l.getBytes()
|
||
}
|
||
,
|
||
v.rsa.decrypt = function(e, t, r, a) {
|
||
var i = Math.ceil(t.n.bitLength() / 8);
|
||
if (e.length !== i) {
|
||
var s = new Error("Encrypted message length is invalid.");
|
||
throw s.length = e.length,
|
||
s.expected = i,
|
||
s
|
||
}
|
||
var o = new h(f.util.createBuffer(e).toHex(),16);
|
||
if (o.compareTo(t.n) >= 0)
|
||
throw new Error("Encrypted message is invalid.");
|
||
for (var c = b(o, t, r), u = c.toString(16), l = f.util.createBuffer(), p = i - Math.ceil(u.length / 2); p > 0; )
|
||
l.putByte(0),
|
||
--p;
|
||
return l.putBytes(f.util.hexToBytes(u)),
|
||
!1 !== a ? n(l.getBytes(), t, r) : l.getBytes()
|
||
}
|
||
,
|
||
v.rsa.createKeyPairGenerationState = function(e, t, r) {
|
||
"string" == typeof e && (e = parseInt(e, 10)),
|
||
e = e || 2048,
|
||
r = r || {};
|
||
var a, n = r.prng || f.random, i = {
|
||
nextBytes: function(e) {
|
||
for (var t = n.getBytesSync(e.length), r = 0; r < e.length; ++r)
|
||
e[r] = t.charCodeAt(r)
|
||
}
|
||
}, s = r.algorithm || "PRIMEINC";
|
||
if ("PRIMEINC" !== s)
|
||
throw new Error("Invalid key generation algorithm: " + s);
|
||
return a = {
|
||
algorithm: s,
|
||
state: 0,
|
||
bits: e,
|
||
rng: i,
|
||
eInt: t || 65537,
|
||
e: new h(null),
|
||
p: null,
|
||
q: null,
|
||
qBits: e >> 1,
|
||
pBits: e - (e >> 1),
|
||
pqState: 0,
|
||
num: null,
|
||
keys: null
|
||
},
|
||
a.e.fromInt(a.eInt),
|
||
a
|
||
}
|
||
,
|
||
v.rsa.stepKeyPairGenerationState = function(e, t) {
|
||
"algorithm"in e || (e.algorithm = "PRIMEINC");
|
||
var r = new h(null);
|
||
r.fromInt(30);
|
||
for (var a, n = 0, i = function(e, t) {
|
||
return e | t
|
||
}, s = +new Date, c = 0; null === e.keys && (t <= 0 || c < t); ) {
|
||
if (0 === e.state) {
|
||
var u = null === e.p ? e.pBits : e.qBits
|
||
, l = u - 1;
|
||
0 === e.pqState ? (e.num = new h(u,e.rng),
|
||
e.num.testBit(l) || e.num.bitwiseTo(h.ONE.shiftLeft(l), i, e.num),
|
||
e.num.dAddOffset(31 - e.num.mod(r).byteValue(), 0),
|
||
n = 0,
|
||
++e.pqState) : 1 === e.pqState ? e.num.bitLength() > u ? e.pqState = 0 : e.num.isProbablePrime(o(e.num.bitLength())) ? ++e.pqState : e.num.dAddOffset(m[n++ % 8], 0) : 2 === e.pqState ? e.pqState = 0 === e.num.subtract(h.ONE).gcd(e.e).compareTo(h.ONE) ? 3 : 0 : 3 === e.pqState && (e.pqState = 0,
|
||
null === e.p ? e.p = e.num : e.q = e.num,
|
||
null !== e.p && null !== e.q && ++e.state,
|
||
e.num = null)
|
||
} else if (1 === e.state)
|
||
e.p.compareTo(e.q) < 0 && (e.num = e.p,
|
||
e.p = e.q,
|
||
e.q = e.num),
|
||
++e.state;
|
||
else if (2 === e.state)
|
||
e.p1 = e.p.subtract(h.ONE),
|
||
e.q1 = e.q.subtract(h.ONE),
|
||
e.phi = e.p1.multiply(e.q1),
|
||
++e.state;
|
||
else if (3 === e.state)
|
||
0 === e.phi.gcd(e.e).compareTo(h.ONE) ? ++e.state : (e.p = null,
|
||
e.q = null,
|
||
e.state = 0);
|
||
else if (4 === e.state)
|
||
e.n = e.p.multiply(e.q),
|
||
e.n.bitLength() === e.bits ? ++e.state : (e.q = null,
|
||
e.state = 0);
|
||
else if (5 === e.state) {
|
||
var p = e.e.modInverse(e.phi);
|
||
e.keys = {
|
||
privateKey: v.rsa.setPrivateKey(e.n, e.e, p, e.p, e.q, p.mod(e.p1), p.mod(e.q1), e.q.modInverse(e.p)),
|
||
publicKey: v.rsa.setPublicKey(e.n, e.e)
|
||
}
|
||
}
|
||
a = +new Date,
|
||
c += a - s,
|
||
s = a
|
||
}
|
||
return null !== e.keys
|
||
}
|
||
,
|
||
v.rsa.generateKeyPair = function(e, t, r, a) {
|
||
if (1 === arguments.length ? "object" == typeof e ? (r = e,
|
||
e = void 0) : "function" == typeof e && (a = e,
|
||
e = void 0) : 2 === arguments.length ? "number" == typeof e ? "function" == typeof t ? (a = t,
|
||
t = void 0) : "number" != typeof t && (r = t,
|
||
t = void 0) : (r = e,
|
||
a = t,
|
||
e = void 0,
|
||
t = void 0) : 3 === arguments.length && ("number" == typeof t ? "function" == typeof r && (a = r,
|
||
r = void 0) : (a = r,
|
||
r = t,
|
||
t = void 0)),
|
||
r = r || {},
|
||
void 0 === e && (e = r.bits || 2048),
|
||
void 0 === t && (t = r.e || 65537),
|
||
!f.options.usePureJavaScript && !r.prng && e >= 256 && e <= 16384 && (65537 === t || 3 === t))
|
||
if (a) {
|
||
if (c("generateKeyPair"))
|
||
return d.generateKeyPair("rsa", {
|
||
modulusLength: e,
|
||
publicExponent: t,
|
||
publicKeyEncoding: {
|
||
type: "spki",
|
||
format: "pem"
|
||
},
|
||
privateKeyEncoding: {
|
||
type: "pkcs8",
|
||
format: "pem"
|
||
}
|
||
}, function(e, t, r) {
|
||
if (e)
|
||
return a(e);
|
||
a(null, {
|
||
privateKey: v.privateKeyFromPem(r),
|
||
publicKey: v.publicKeyFromPem(t)
|
||
})
|
||
});
|
||
if (u("generateKey") && u("exportKey"))
|
||
return g.globalScope.crypto.subtle.generateKey({
|
||
name: "RSASSA-PKCS1-v1_5",
|
||
modulusLength: e,
|
||
publicExponent: p(t),
|
||
hash: {
|
||
name: "SHA-256"
|
||
}
|
||
}, !0, ["sign", "verify"]).then(function(e) {
|
||
return g.globalScope.crypto.subtle.exportKey("pkcs8", e.privateKey)
|
||
}).then(void 0, function(e) {
|
||
a(e)
|
||
}).then(function(e) {
|
||
if (e) {
|
||
var t = v.privateKeyFromAsn1(y.fromDer(f.util.createBuffer(e)));
|
||
a(null, {
|
||
privateKey: t,
|
||
publicKey: v.setRsaPublicKey(t.n, t.e)
|
||
})
|
||
}
|
||
});
|
||
if (l("generateKey") && l("exportKey")) {
|
||
var n = g.globalScope.msCrypto.subtle.generateKey({
|
||
name: "RSASSA-PKCS1-v1_5",
|
||
modulusLength: e,
|
||
publicExponent: p(t),
|
||
hash: {
|
||
name: "SHA-256"
|
||
}
|
||
}, !0, ["sign", "verify"]);
|
||
return n.oncomplete = function(e) {
|
||
var t = e.target.result
|
||
, r = g.globalScope.msCrypto.subtle.exportKey("pkcs8", t.privateKey);
|
||
r.oncomplete = function(e) {
|
||
var t = e.target.result
|
||
, r = v.privateKeyFromAsn1(y.fromDer(f.util.createBuffer(t)));
|
||
a(null, {
|
||
privateKey: r,
|
||
publicKey: v.setRsaPublicKey(r.n, r.e)
|
||
})
|
||
}
|
||
,
|
||
r.onerror = function(e) {
|
||
a(e)
|
||
}
|
||
}
|
||
,
|
||
void (n.onerror = function(e) {
|
||
a(e)
|
||
}
|
||
)
|
||
}
|
||
} else if (c("generateKeyPairSync")) {
|
||
var s = d.generateKeyPairSync("rsa", {
|
||
modulusLength: e,
|
||
publicExponent: t,
|
||
publicKeyEncoding: {
|
||
type: "spki",
|
||
format: "pem"
|
||
},
|
||
privateKeyEncoding: {
|
||
type: "pkcs8",
|
||
format: "pem"
|
||
}
|
||
});
|
||
return {
|
||
privateKey: v.privateKeyFromPem(s.privateKey),
|
||
publicKey: v.publicKeyFromPem(s.publicKey)
|
||
}
|
||
}
|
||
var o = v.rsa.createKeyPairGenerationState(e, t, r);
|
||
if (!a)
|
||
return v.rsa.stepKeyPairGenerationState(o, 0),
|
||
o.keys;
|
||
i(o, r, a)
|
||
}
|
||
,
|
||
v.setRsaPublicKey = v.rsa.setPublicKey = function(e, t) {
|
||
var r = {
|
||
n: e,
|
||
e: t
|
||
};
|
||
return r.encrypt = function(e, t, n) {
|
||
if ("string" == typeof t ? t = t.toUpperCase() : void 0 === t && (t = "RSAES-PKCS1-V1_5"),
|
||
"RSAES-PKCS1-V1_5" === t)
|
||
t = {
|
||
encode: function(e, t, r) {
|
||
return a(e, t, 2).getBytes()
|
||
}
|
||
};
|
||
else if ("RSA-OAEP" === t || "RSAES-OAEP" === t)
|
||
t = {
|
||
encode: function(e, t) {
|
||
return f.pkcs1.encode_rsa_oaep(t, e, n)
|
||
}
|
||
};
|
||
else if (-1 !== ["RAW", "NONE", "NULL", null].indexOf(t))
|
||
t = {
|
||
encode: function(e) {
|
||
return e
|
||
}
|
||
};
|
||
else if ("string" == typeof t)
|
||
throw new Error('Unsupported encryption scheme: "' + t + '".');
|
||
var i = t.encode(e, r, !0);
|
||
return v.rsa.encrypt(i, r, !0)
|
||
}
|
||
,
|
||
r.verify = function(e, t, a) {
|
||
"string" == typeof a ? a = a.toUpperCase() : void 0 === a && (a = "RSASSA-PKCS1-V1_5"),
|
||
"RSASSA-PKCS1-V1_5" === a ? a = {
|
||
verify: function(e, t) {
|
||
return t = n(t, r, !0),
|
||
e === y.fromDer(t).value[1].value
|
||
}
|
||
} : "NONE" !== a && "NULL" !== a && null !== a || (a = {
|
||
verify: function(e, t) {
|
||
return t = n(t, r, !0),
|
||
e === t
|
||
}
|
||
});
|
||
var i = v.rsa.decrypt(t, r, !0, !1);
|
||
return a.verify(e, i, r.n.bitLength())
|
||
}
|
||
,
|
||
r
|
||
}
|
||
,
|
||
v.setRsaPrivateKey = v.rsa.setPrivateKey = function(e, t, r, a, i, s, o, c) {
|
||
var u = {
|
||
n: e,
|
||
e: t,
|
||
d: r,
|
||
p: a,
|
||
q: i,
|
||
dP: s,
|
||
dQ: o,
|
||
qInv: c
|
||
};
|
||
return u.decrypt = function(e, t, r) {
|
||
"string" == typeof t ? t = t.toUpperCase() : void 0 === t && (t = "RSAES-PKCS1-V1_5");
|
||
var a = v.rsa.decrypt(e, u, !1, !1);
|
||
if ("RSAES-PKCS1-V1_5" === t)
|
||
t = {
|
||
decode: n
|
||
};
|
||
else if ("RSA-OAEP" === t || "RSAES-OAEP" === t)
|
||
t = {
|
||
decode: function(e, t) {
|
||
return f.pkcs1.decode_rsa_oaep(t, e, r)
|
||
}
|
||
};
|
||
else {
|
||
if (-1 === ["RAW", "NONE", "NULL", null].indexOf(t))
|
||
throw new Error('Unsupported encryption scheme: "' + t + '".');
|
||
t = {
|
||
decode: function(e) {
|
||
return e
|
||
}
|
||
}
|
||
}
|
||
return t.decode(a, u, !1)
|
||
}
|
||
,
|
||
u.sign = function(e, t) {
|
||
var r = !1;
|
||
"string" == typeof t && (t = t.toUpperCase()),
|
||
void 0 === t || "RSASSA-PKCS1-V1_5" === t ? (t = {
|
||
encode: I
|
||
},
|
||
r = 1) : "NONE" !== t && "NULL" !== t && null !== t || (t = {
|
||
encode: function() {
|
||
return e
|
||
}
|
||
},
|
||
r = 1);
|
||
var a = t.encode(e, u.n.bitLength());
|
||
return v.rsa.encrypt(a, u, r)
|
||
}
|
||
,
|
||
u
|
||
}
|
||
,
|
||
v.wrapRsaPrivateKey = function(e) {
|
||
return y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, y.integerToDer(0).getBytes()), y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [y.create(y.Class.UNIVERSAL, y.Type.OID, !1, y.oidToDer(v.oids.rsaEncryption).getBytes()), y.create(y.Class.UNIVERSAL, y.Type.NULL, !1, "")]), y.create(y.Class.UNIVERSAL, y.Type.OCTETSTRING, !1, y.toDer(e).getBytes())])
|
||
}
|
||
,
|
||
v.privateKeyFromAsn1 = function(e) {
|
||
var t = {}
|
||
, r = [];
|
||
if (y.validate(e, C, t, r) && (e = y.fromDer(f.util.createBuffer(t.privateKey))),
|
||
t = {},
|
||
r = [],
|
||
!y.validate(e, E, t, r)) {
|
||
var a = new Error("Cannot read private key. ASN.1 object does not contain an RSAPrivateKey.");
|
||
throw a.errors = r,
|
||
a
|
||
}
|
||
var n, i, s, o, c, u, l, p;
|
||
return n = f.util.createBuffer(t.privateKeyModulus).toHex(),
|
||
i = f.util.createBuffer(t.privateKeyPublicExponent).toHex(),
|
||
s = f.util.createBuffer(t.privateKeyPrivateExponent).toHex(),
|
||
o = f.util.createBuffer(t.privateKeyPrime1).toHex(),
|
||
c = f.util.createBuffer(t.privateKeyPrime2).toHex(),
|
||
u = f.util.createBuffer(t.privateKeyExponent1).toHex(),
|
||
l = f.util.createBuffer(t.privateKeyExponent2).toHex(),
|
||
p = f.util.createBuffer(t.privateKeyCoefficient).toHex(),
|
||
v.setRsaPrivateKey(new h(n,16), new h(i,16), new h(s,16), new h(o,16), new h(c,16), new h(u,16), new h(l,16), new h(p,16))
|
||
}
|
||
,
|
||
v.privateKeyToAsn1 = v.privateKeyToRSAPrivateKey = function(e) {
|
||
return y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, y.integerToDer(0).getBytes()), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.n)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.e)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.d)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.p)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.q)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.dP)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.dQ)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.qInv))])
|
||
}
|
||
,
|
||
v.publicKeyFromAsn1 = function(e) {
|
||
var t = {}
|
||
, r = [];
|
||
if (y.validate(e, T, t, r)) {
|
||
var a = y.derToOid(t.publicKeyOid);
|
||
if (a !== v.oids.rsaEncryption) {
|
||
var n = new Error("Cannot read public key. Unknown OID.");
|
||
throw n.oid = a,
|
||
n
|
||
}
|
||
e = t.rsaPublicKey
|
||
}
|
||
if (r = [],
|
||
!y.validate(e, S, t, r)) {
|
||
var n = new Error("Cannot read public key. ASN.1 object does not contain an RSAPublicKey.");
|
||
throw n.errors = r,
|
||
n
|
||
}
|
||
var i = f.util.createBuffer(t.publicKeyModulus).toHex()
|
||
, s = f.util.createBuffer(t.publicKeyExponent).toHex();
|
||
return v.setRsaPublicKey(new h(i,16), new h(s,16))
|
||
}
|
||
,
|
||
v.publicKeyToAsn1 = v.publicKeyToSubjectPublicKeyInfo = function(e) {
|
||
return y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [y.create(y.Class.UNIVERSAL, y.Type.OID, !1, y.oidToDer(v.oids.rsaEncryption).getBytes()), y.create(y.Class.UNIVERSAL, y.Type.NULL, !1, "")]), y.create(y.Class.UNIVERSAL, y.Type.BITSTRING, !1, [v.publicKeyToRSAPublicKey(e)])])
|
||
}
|
||
,
|
||
v.publicKeyToRSAPublicKey = function(e) {
|
||
return y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.n)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.e))])
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e, t, r) {
|
||
this.data = [],
|
||
null != e && ("number" == typeof e ? this.fromNumber(e, t, r) : null == t && "string" != typeof e ? this.fromString(e, 256) : this.fromString(e, t))
|
||
}
|
||
function n() {
|
||
return new a(null)
|
||
}
|
||
function i(e, t, r, a, n, i) {
|
||
for (; --i >= 0; ) {
|
||
var s = t * this.data[e++] + r.data[a] + n;
|
||
n = Math.floor(s / 67108864),
|
||
r.data[a++] = 67108863 & s
|
||
}
|
||
return n
|
||
}
|
||
function s(e, t, r, a, n, i) {
|
||
for (var s = 32767 & t, o = t >> 15; --i >= 0; ) {
|
||
var c = 32767 & this.data[e]
|
||
, u = this.data[e++] >> 15
|
||
, l = o * c + u * s;
|
||
c = s * c + ((32767 & l) << 15) + r.data[a] + (1073741823 & n),
|
||
n = (c >>> 30) + (l >>> 15) + o * u + (n >>> 30),
|
||
r.data[a++] = 1073741823 & c
|
||
}
|
||
return n
|
||
}
|
||
function o(e, t, r, a, n, i) {
|
||
for (var s = 16383 & t, o = t >> 14; --i >= 0; ) {
|
||
var c = 16383 & this.data[e]
|
||
, u = this.data[e++] >> 14
|
||
, l = o * c + u * s;
|
||
c = s * c + ((16383 & l) << 14) + r.data[a] + n,
|
||
n = (c >> 28) + (l >> 14) + o * u,
|
||
r.data[a++] = 268435455 & c
|
||
}
|
||
return n
|
||
}
|
||
function c(e) {
|
||
return it.charAt(e)
|
||
}
|
||
function u(e, t) {
|
||
var r = st[e.charCodeAt(t)];
|
||
return null == r ? -1 : r
|
||
}
|
||
function l(e) {
|
||
for (var t = this.t - 1; t >= 0; --t)
|
||
e.data[t] = this.data[t];
|
||
e.t = this.t,
|
||
e.s = this.s
|
||
}
|
||
function p(e) {
|
||
this.t = 1,
|
||
this.s = e < 0 ? -1 : 0,
|
||
e > 0 ? this.data[0] = e : e < -1 ? this.data[0] = e + this.DV : this.t = 0
|
||
}
|
||
function f(e) {
|
||
var t = n();
|
||
return t.fromInt(e),
|
||
t
|
||
}
|
||
function h(e, t) {
|
||
var r;
|
||
if (16 == t)
|
||
r = 4;
|
||
else if (8 == t)
|
||
r = 3;
|
||
else if (256 == t)
|
||
r = 8;
|
||
else if (2 == t)
|
||
r = 1;
|
||
else if (32 == t)
|
||
r = 5;
|
||
else {
|
||
if (4 != t)
|
||
return void this.fromRadix(e, t);
|
||
r = 2
|
||
}
|
||
this.t = 0,
|
||
this.s = 0;
|
||
for (var n = e.length, i = !1, s = 0; --n >= 0; ) {
|
||
var o = 8 == r ? 255 & e[n] : u(e, n);
|
||
o < 0 ? "-" == e.charAt(n) && (i = !0) : (i = !1,
|
||
0 == s ? this.data[this.t++] = o : s + r > this.DB ? (this.data[this.t - 1] |= (o & (1 << this.DB - s) - 1) << s,
|
||
this.data[this.t++] = o >> this.DB - s) : this.data[this.t - 1] |= o << s,
|
||
(s += r) >= this.DB && (s -= this.DB))
|
||
}
|
||
8 == r && 0 != (128 & e[0]) && (this.s = -1,
|
||
s > 0 && (this.data[this.t - 1] |= (1 << this.DB - s) - 1 << s)),
|
||
this.clamp(),
|
||
i && a.ZERO.subTo(this, this)
|
||
}
|
||
function d() {
|
||
for (var e = this.s & this.DM; this.t > 0 && this.data[this.t - 1] == e; )
|
||
--this.t
|
||
}
|
||
function y(e) {
|
||
if (this.s < 0)
|
||
return "-" + this.negate().toString(e);
|
||
var t;
|
||
if (16 == e)
|
||
t = 4;
|
||
else if (8 == e)
|
||
t = 3;
|
||
else if (2 == e)
|
||
t = 1;
|
||
else if (32 == e)
|
||
t = 5;
|
||
else {
|
||
if (4 != e)
|
||
return this.toRadix(e);
|
||
t = 2
|
||
}
|
||
var r, a = (1 << t) - 1, n = !1, i = "", s = this.t, o = this.DB - s * this.DB % t;
|
||
if (s-- > 0)
|
||
for (o < this.DB && (r = this.data[s] >> o) > 0 && (n = !0,
|
||
i = c(r)); s >= 0; )
|
||
o < t ? (r = (this.data[s] & (1 << o) - 1) << t - o,
|
||
r |= this.data[--s] >> (o += this.DB - t)) : (r = this.data[s] >> (o -= t) & a,
|
||
o <= 0 && (o += this.DB,
|
||
--s)),
|
||
r > 0 && (n = !0),
|
||
n && (i += c(r));
|
||
return n ? i : "0"
|
||
}
|
||
function g() {
|
||
var e = n();
|
||
return a.ZERO.subTo(this, e),
|
||
e
|
||
}
|
||
function v() {
|
||
return this.s < 0 ? this.negate() : this
|
||
}
|
||
function m(e) {
|
||
var t = this.s - e.s;
|
||
if (0 != t)
|
||
return t;
|
||
var r = this.t;
|
||
if (0 != (t = r - e.t))
|
||
return this.s < 0 ? -t : t;
|
||
for (; --r >= 0; )
|
||
if (0 != (t = this.data[r] - e.data[r]))
|
||
return t;
|
||
return 0
|
||
}
|
||
function C(e) {
|
||
var t, r = 1;
|
||
return 0 != (t = e >>> 16) && (e = t,
|
||
r += 16),
|
||
0 != (t = e >> 8) && (e = t,
|
||
r += 8),
|
||
0 != (t = e >> 4) && (e = t,
|
||
r += 4),
|
||
0 != (t = e >> 2) && (e = t,
|
||
r += 2),
|
||
0 != (t = e >> 1) && (e = t,
|
||
r += 1),
|
||
r
|
||
}
|
||
function E() {
|
||
return this.t <= 0 ? 0 : this.DB * (this.t - 1) + C(this.data[this.t - 1] ^ this.s & this.DM)
|
||
}
|
||
function S(e, t) {
|
||
var r;
|
||
for (r = this.t - 1; r >= 0; --r)
|
||
t.data[r + e] = this.data[r];
|
||
for (r = e - 1; r >= 0; --r)
|
||
t.data[r] = 0;
|
||
t.t = this.t + e,
|
||
t.s = this.s
|
||
}
|
||
function T(e, t) {
|
||
for (var r = e; r < this.t; ++r)
|
||
t.data[r - e] = this.data[r];
|
||
t.t = Math.max(this.t - e, 0),
|
||
t.s = this.s
|
||
}
|
||
function I(e, t) {
|
||
var r, a = e % this.DB, n = this.DB - a, i = (1 << n) - 1, s = Math.floor(e / this.DB), o = this.s << a & this.DM;
|
||
for (r = this.t - 1; r >= 0; --r)
|
||
t.data[r + s + 1] = this.data[r] >> n | o,
|
||
o = (this.data[r] & i) << a;
|
||
for (r = s - 1; r >= 0; --r)
|
||
t.data[r] = 0;
|
||
t.data[s] = o,
|
||
t.t = this.t + s + 1,
|
||
t.s = this.s,
|
||
t.clamp()
|
||
}
|
||
function b(e, t) {
|
||
t.s = this.s;
|
||
var r = Math.floor(e / this.DB);
|
||
if (r >= this.t)
|
||
return void (t.t = 0);
|
||
var a = e % this.DB
|
||
, n = this.DB - a
|
||
, i = (1 << a) - 1;
|
||
t.data[0] = this.data[r] >> a;
|
||
for (var s = r + 1; s < this.t; ++s)
|
||
t.data[s - r - 1] |= (this.data[s] & i) << n,
|
||
t.data[s - r] = this.data[s] >> a;
|
||
a > 0 && (t.data[this.t - r - 1] |= (this.s & i) << n),
|
||
t.t = this.t - r,
|
||
t.clamp()
|
||
}
|
||
function A(e, t) {
|
||
for (var r = 0, a = 0, n = Math.min(e.t, this.t); r < n; )
|
||
a += this.data[r] - e.data[r],
|
||
t.data[r++] = a & this.DM,
|
||
a >>= this.DB;
|
||
if (e.t < this.t) {
|
||
for (a -= e.s; r < this.t; )
|
||
a += this.data[r],
|
||
t.data[r++] = a & this.DM,
|
||
a >>= this.DB;
|
||
a += this.s
|
||
} else {
|
||
for (a += this.s; r < e.t; )
|
||
a -= e.data[r],
|
||
t.data[r++] = a & this.DM,
|
||
a >>= this.DB;
|
||
a -= e.s
|
||
}
|
||
t.s = a < 0 ? -1 : 0,
|
||
a < -1 ? t.data[r++] = this.DV + a : a > 0 && (t.data[r++] = a),
|
||
t.t = r,
|
||
t.clamp()
|
||
}
|
||
function B(e, t) {
|
||
var r = this.abs()
|
||
, n = e.abs()
|
||
, i = r.t;
|
||
for (t.t = i + n.t; --i >= 0; )
|
||
t.data[i] = 0;
|
||
for (i = 0; i < n.t; ++i)
|
||
t.data[i + r.t] = r.am(0, n.data[i], t, i, 0, r.t);
|
||
t.s = 0,
|
||
t.clamp(),
|
||
this.s != e.s && a.ZERO.subTo(t, t)
|
||
}
|
||
function N(e) {
|
||
for (var t = this.abs(), r = e.t = 2 * t.t; --r >= 0; )
|
||
e.data[r] = 0;
|
||
for (r = 0; r < t.t - 1; ++r) {
|
||
var a = t.am(r, t.data[r], e, 2 * r, 0, 1);
|
||
(e.data[r + t.t] += t.am(r + 1, 2 * t.data[r], e, 2 * r + 1, a, t.t - r - 1)) >= t.DV && (e.data[r + t.t] -= t.DV,
|
||
e.data[r + t.t + 1] = 1)
|
||
}
|
||
e.t > 0 && (e.data[e.t - 1] += t.am(r, t.data[r], e, 2 * r, 0, 1)),
|
||
e.s = 0,
|
||
e.clamp()
|
||
}
|
||
function k(e, t, r) {
|
||
var i = e.abs();
|
||
if (!(i.t <= 0)) {
|
||
var s = this.abs();
|
||
if (s.t < i.t)
|
||
return null != t && t.fromInt(0),
|
||
void (null != r && this.copyTo(r));
|
||
null == r && (r = n());
|
||
var o = n()
|
||
, c = this.s
|
||
, u = e.s
|
||
, l = this.DB - C(i.data[i.t - 1]);
|
||
l > 0 ? (i.lShiftTo(l, o),
|
||
s.lShiftTo(l, r)) : (i.copyTo(o),
|
||
s.copyTo(r));
|
||
var p = o.t
|
||
, f = o.data[p - 1];
|
||
if (0 != f) {
|
||
var h = f * (1 << this.F1) + (p > 1 ? o.data[p - 2] >> this.F2 : 0)
|
||
, d = this.FV / h
|
||
, y = (1 << this.F1) / h
|
||
, g = 1 << this.F2
|
||
, v = r.t
|
||
, m = v - p
|
||
, E = null == t ? n() : t;
|
||
for (o.dlShiftTo(m, E),
|
||
r.compareTo(E) >= 0 && (r.data[r.t++] = 1,
|
||
r.subTo(E, r)),
|
||
a.ONE.dlShiftTo(p, E),
|
||
E.subTo(o, o); o.t < p; )
|
||
o.data[o.t++] = 0;
|
||
for (; --m >= 0; ) {
|
||
var S = r.data[--v] == f ? this.DM : Math.floor(r.data[v] * d + (r.data[v - 1] + g) * y);
|
||
if ((r.data[v] += o.am(0, S, r, m, 0, p)) < S)
|
||
for (o.dlShiftTo(m, E),
|
||
r.subTo(E, r); r.data[v] < --S; )
|
||
r.subTo(E, r)
|
||
}
|
||
null != t && (r.drShiftTo(p, t),
|
||
c != u && a.ZERO.subTo(t, t)),
|
||
r.t = p,
|
||
r.clamp(),
|
||
l > 0 && r.rShiftTo(l, r),
|
||
c < 0 && a.ZERO.subTo(r, r)
|
||
}
|
||
}
|
||
}
|
||
function w(e) {
|
||
var t = n();
|
||
return this.abs().divRemTo(e, null, t),
|
||
this.s < 0 && t.compareTo(a.ZERO) > 0 && e.subTo(t, t),
|
||
t
|
||
}
|
||
function R(e) {
|
||
this.m = e
|
||
}
|
||
function _(e) {
|
||
return e.s < 0 || e.compareTo(this.m) >= 0 ? e.mod(this.m) : e
|
||
}
|
||
function L(e) {
|
||
return e
|
||
}
|
||
function U(e) {
|
||
e.divRemTo(this.m, null, e)
|
||
}
|
||
function D(e, t, r) {
|
||
e.multiplyTo(t, r),
|
||
this.reduce(r)
|
||
}
|
||
function P(e, t) {
|
||
e.squareTo(t),
|
||
this.reduce(t)
|
||
}
|
||
function V() {
|
||
if (this.t < 1)
|
||
return 0;
|
||
var e = this.data[0];
|
||
if (0 == (1 & e))
|
||
return 0;
|
||
var t = 3 & e;
|
||
return t = t * (2 - (15 & e) * t) & 15,
|
||
t = t * (2 - (255 & e) * t) & 255,
|
||
t = t * (2 - ((65535 & e) * t & 65535)) & 65535,
|
||
t = t * (2 - e * t % this.DV) % this.DV,
|
||
t > 0 ? this.DV - t : -t
|
||
}
|
||
function O(e) {
|
||
this.m = e,
|
||
this.mp = e.invDigit(),
|
||
this.mpl = 32767 & this.mp,
|
||
this.mph = this.mp >> 15,
|
||
this.um = (1 << e.DB - 15) - 1,
|
||
this.mt2 = 2 * e.t
|
||
}
|
||
function K(e) {
|
||
var t = n();
|
||
return e.abs().dlShiftTo(this.m.t, t),
|
||
t.divRemTo(this.m, null, t),
|
||
e.s < 0 && t.compareTo(a.ZERO) > 0 && this.m.subTo(t, t),
|
||
t
|
||
}
|
||
function x(e) {
|
||
var t = n();
|
||
return e.copyTo(t),
|
||
this.reduce(t),
|
||
t
|
||
}
|
||
function M(e) {
|
||
for (; e.t <= this.mt2; )
|
||
e.data[e.t++] = 0;
|
||
for (var t = 0; t < this.m.t; ++t) {
|
||
var r = 32767 & e.data[t]
|
||
, a = r * this.mpl + ((r * this.mph + (e.data[t] >> 15) * this.mpl & this.um) << 15) & e.DM;
|
||
for (r = t + this.m.t,
|
||
e.data[r] += this.m.am(0, a, e, t, 0, this.m.t); e.data[r] >= e.DV; )
|
||
e.data[r] -= e.DV,
|
||
e.data[++r]++
|
||
}
|
||
e.clamp(),
|
||
e.drShiftTo(this.m.t, e),
|
||
e.compareTo(this.m) >= 0 && e.subTo(this.m, e)
|
||
}
|
||
function F(e, t) {
|
||
e.squareTo(t),
|
||
this.reduce(t)
|
||
}
|
||
function q(e, t, r) {
|
||
e.multiplyTo(t, r),
|
||
this.reduce(r)
|
||
}
|
||
function j() {
|
||
return 0 == (this.t > 0 ? 1 & this.data[0] : this.s)
|
||
}
|
||
function G(e, t) {
|
||
if (e > 4294967295 || e < 1)
|
||
return a.ONE;
|
||
var r = n()
|
||
, i = n()
|
||
, s = t.convert(this)
|
||
, o = C(e) - 1;
|
||
for (s.copyTo(r); --o >= 0; )
|
||
if (t.sqrTo(r, i),
|
||
(e & 1 << o) > 0)
|
||
t.mulTo(i, s, r);
|
||
else {
|
||
var c = r;
|
||
r = i,
|
||
i = c
|
||
}
|
||
return t.revert(r)
|
||
}
|
||
function H(e, t) {
|
||
var r;
|
||
return r = e < 256 || t.isEven() ? new R(t) : new O(t),
|
||
this.exp(e, r)
|
||
}
|
||
function Q() {
|
||
var e = n();
|
||
return this.copyTo(e),
|
||
e
|
||
}
|
||
function z() {
|
||
if (this.s < 0) {
|
||
if (1 == this.t)
|
||
return this.data[0] - this.DV;
|
||
if (0 == this.t)
|
||
return -1
|
||
} else {
|
||
if (1 == this.t)
|
||
return this.data[0];
|
||
if (0 == this.t)
|
||
return 0
|
||
}
|
||
return (this.data[1] & (1 << 32 - this.DB) - 1) << this.DB | this.data[0]
|
||
}
|
||
function W() {
|
||
return 0 == this.t ? this.s : this.data[0] << 24 >> 24
|
||
}
|
||
function Y() {
|
||
return 0 == this.t ? this.s : this.data[0] << 16 >> 16
|
||
}
|
||
function X(e) {
|
||
return Math.floor(Math.LN2 * this.DB / Math.log(e))
|
||
}
|
||
function Z() {
|
||
return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this.data[0] <= 0 ? 0 : 1
|
||
}
|
||
function J(e) {
|
||
if (null == e && (e = 10),
|
||
0 == this.signum() || e < 2 || e > 36)
|
||
return "0";
|
||
var t = this.chunkSize(e)
|
||
, r = Math.pow(e, t)
|
||
, a = f(r)
|
||
, i = n()
|
||
, s = n()
|
||
, o = "";
|
||
for (this.divRemTo(a, i, s); i.signum() > 0; )
|
||
o = (r + s.intValue()).toString(e).substr(1) + o,
|
||
i.divRemTo(a, i, s);
|
||
return s.intValue().toString(e) + o
|
||
}
|
||
function $(e, t) {
|
||
this.fromInt(0),
|
||
null == t && (t = 10);
|
||
for (var r = this.chunkSize(t), n = Math.pow(t, r), i = !1, s = 0, o = 0, c = 0; c < e.length; ++c) {
|
||
var l = u(e, c);
|
||
l < 0 ? "-" == e.charAt(c) && 0 == this.signum() && (i = !0) : (o = t * o + l,
|
||
++s >= r && (this.dMultiply(n),
|
||
this.dAddOffset(o, 0),
|
||
s = 0,
|
||
o = 0))
|
||
}
|
||
s > 0 && (this.dMultiply(Math.pow(t, s)),
|
||
this.dAddOffset(o, 0)),
|
||
i && a.ZERO.subTo(this, this)
|
||
}
|
||
function ee(e, t, r) {
|
||
if ("number" == typeof t)
|
||
if (e < 2)
|
||
this.fromInt(1);
|
||
else
|
||
for (this.fromNumber(e, r),
|
||
this.testBit(e - 1) || this.bitwiseTo(a.ONE.shiftLeft(e - 1), ce, this),
|
||
this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(t); )
|
||
this.dAddOffset(2, 0),
|
||
this.bitLength() > e && this.subTo(a.ONE.shiftLeft(e - 1), this);
|
||
else {
|
||
var n = new Array
|
||
, i = 7 & e;
|
||
n.length = 1 + (e >> 3),
|
||
t.nextBytes(n),
|
||
i > 0 ? n[0] &= (1 << i) - 1 : n[0] = 0,
|
||
this.fromString(n, 256)
|
||
}
|
||
}
|
||
function te() {
|
||
var e = this.t
|
||
, t = new Array;
|
||
t[0] = this.s;
|
||
var r, a = this.DB - e * this.DB % 8, n = 0;
|
||
if (e-- > 0)
|
||
for (a < this.DB && (r = this.data[e] >> a) != (this.s & this.DM) >> a && (t[n++] = r | this.s << this.DB - a); e >= 0; )
|
||
a < 8 ? (r = (this.data[e] & (1 << a) - 1) << 8 - a,
|
||
r |= this.data[--e] >> (a += this.DB - 8)) : (r = this.data[e] >> (a -= 8) & 255,
|
||
a <= 0 && (a += this.DB,
|
||
--e)),
|
||
0 != (128 & r) && (r |= -256),
|
||
0 == n && (128 & this.s) != (128 & r) && ++n,
|
||
(n > 0 || r != this.s) && (t[n++] = r);
|
||
return t
|
||
}
|
||
function re(e) {
|
||
return 0 == this.compareTo(e)
|
||
}
|
||
function ae(e) {
|
||
return this.compareTo(e) < 0 ? this : e
|
||
}
|
||
function ne(e) {
|
||
return this.compareTo(e) > 0 ? this : e
|
||
}
|
||
function ie(e, t, r) {
|
||
var a, n, i = Math.min(e.t, this.t);
|
||
for (a = 0; a < i; ++a)
|
||
r.data[a] = t(this.data[a], e.data[a]);
|
||
if (e.t < this.t) {
|
||
for (n = e.s & this.DM,
|
||
a = i; a < this.t; ++a)
|
||
r.data[a] = t(this.data[a], n);
|
||
r.t = this.t
|
||
} else {
|
||
for (n = this.s & this.DM,
|
||
a = i; a < e.t; ++a)
|
||
r.data[a] = t(n, e.data[a]);
|
||
r.t = e.t
|
||
}
|
||
r.s = t(this.s, e.s),
|
||
r.clamp()
|
||
}
|
||
function se(e, t) {
|
||
return e & t
|
||
}
|
||
function oe(e) {
|
||
var t = n();
|
||
return this.bitwiseTo(e, se, t),
|
||
t
|
||
}
|
||
function ce(e, t) {
|
||
return e | t
|
||
}
|
||
function ue(e) {
|
||
var t = n();
|
||
return this.bitwiseTo(e, ce, t),
|
||
t
|
||
}
|
||
function le(e, t) {
|
||
return e ^ t
|
||
}
|
||
function pe(e) {
|
||
var t = n();
|
||
return this.bitwiseTo(e, le, t),
|
||
t
|
||
}
|
||
function fe(e, t) {
|
||
return e & ~t
|
||
}
|
||
function he(e) {
|
||
var t = n();
|
||
return this.bitwiseTo(e, fe, t),
|
||
t
|
||
}
|
||
function de() {
|
||
for (var e = n(), t = 0; t < this.t; ++t)
|
||
e.data[t] = this.DM & ~this.data[t];
|
||
return e.t = this.t,
|
||
e.s = ~this.s,
|
||
e
|
||
}
|
||
function ye(e) {
|
||
var t = n();
|
||
return e < 0 ? this.rShiftTo(-e, t) : this.lShiftTo(e, t),
|
||
t
|
||
}
|
||
function ge(e) {
|
||
var t = n();
|
||
return e < 0 ? this.lShiftTo(-e, t) : this.rShiftTo(e, t),
|
||
t
|
||
}
|
||
function ve(e) {
|
||
if (0 == e)
|
||
return -1;
|
||
var t = 0;
|
||
return 0 == (65535 & e) && (e >>= 16,
|
||
t += 16),
|
||
0 == (255 & e) && (e >>= 8,
|
||
t += 8),
|
||
0 == (15 & e) && (e >>= 4,
|
||
t += 4),
|
||
0 == (3 & e) && (e >>= 2,
|
||
t += 2),
|
||
0 == (1 & e) && ++t,
|
||
t
|
||
}
|
||
function me() {
|
||
for (var e = 0; e < this.t; ++e)
|
||
if (0 != this.data[e])
|
||
return e * this.DB + ve(this.data[e]);
|
||
return this.s < 0 ? this.t * this.DB : -1
|
||
}
|
||
function Ce(e) {
|
||
for (var t = 0; 0 != e; )
|
||
e &= e - 1,
|
||
++t;
|
||
return t
|
||
}
|
||
function Ee() {
|
||
for (var e = 0, t = this.s & this.DM, r = 0; r < this.t; ++r)
|
||
e += Ce(this.data[r] ^ t);
|
||
return e
|
||
}
|
||
function Se(e) {
|
||
var t = Math.floor(e / this.DB);
|
||
return t >= this.t ? 0 != this.s : 0 != (this.data[t] & 1 << e % this.DB)
|
||
}
|
||
function Te(e, t) {
|
||
var r = a.ONE.shiftLeft(e);
|
||
return this.bitwiseTo(r, t, r),
|
||
r
|
||
}
|
||
function Ie(e) {
|
||
return this.changeBit(e, ce)
|
||
}
|
||
function be(e) {
|
||
return this.changeBit(e, fe)
|
||
}
|
||
function Ae(e) {
|
||
return this.changeBit(e, le)
|
||
}
|
||
function Be(e, t) {
|
||
for (var r = 0, a = 0, n = Math.min(e.t, this.t); r < n; )
|
||
a += this.data[r] + e.data[r],
|
||
t.data[r++] = a & this.DM,
|
||
a >>= this.DB;
|
||
if (e.t < this.t) {
|
||
for (a += e.s; r < this.t; )
|
||
a += this.data[r],
|
||
t.data[r++] = a & this.DM,
|
||
a >>= this.DB;
|
||
a += this.s
|
||
} else {
|
||
for (a += this.s; r < e.t; )
|
||
a += e.data[r],
|
||
t.data[r++] = a & this.DM,
|
||
a >>= this.DB;
|
||
a += e.s
|
||
}
|
||
t.s = a < 0 ? -1 : 0,
|
||
a > 0 ? t.data[r++] = a : a < -1 && (t.data[r++] = this.DV + a),
|
||
t.t = r,
|
||
t.clamp()
|
||
}
|
||
function Ne(e) {
|
||
var t = n();
|
||
return this.addTo(e, t),
|
||
t
|
||
}
|
||
function ke(e) {
|
||
var t = n();
|
||
return this.subTo(e, t),
|
||
t
|
||
}
|
||
function we(e) {
|
||
var t = n();
|
||
return this.multiplyTo(e, t),
|
||
t
|
||
}
|
||
function Re(e) {
|
||
var t = n();
|
||
return this.divRemTo(e, t, null),
|
||
t
|
||
}
|
||
function _e(e) {
|
||
var t = n();
|
||
return this.divRemTo(e, null, t),
|
||
t
|
||
}
|
||
function Le(e) {
|
||
var t = n()
|
||
, r = n();
|
||
return this.divRemTo(e, t, r),
|
||
new Array(t,r)
|
||
}
|
||
function Ue(e) {
|
||
this.data[this.t] = this.am(0, e - 1, this, 0, 0, this.t),
|
||
++this.t,
|
||
this.clamp()
|
||
}
|
||
function De(e, t) {
|
||
if (0 != e) {
|
||
for (; this.t <= t; )
|
||
this.data[this.t++] = 0;
|
||
for (this.data[t] += e; this.data[t] >= this.DV; )
|
||
this.data[t] -= this.DV,
|
||
++t >= this.t && (this.data[this.t++] = 0),
|
||
++this.data[t]
|
||
}
|
||
}
|
||
function Pe() {}
|
||
function Ve(e) {
|
||
return e
|
||
}
|
||
function Oe(e, t, r) {
|
||
e.multiplyTo(t, r)
|
||
}
|
||
function Ke(e, t) {
|
||
e.squareTo(t)
|
||
}
|
||
function xe(e) {
|
||
return this.exp(e, new Pe)
|
||
}
|
||
function Me(e, t, r) {
|
||
var a = Math.min(this.t + e.t, t);
|
||
for (r.s = 0,
|
||
r.t = a; a > 0; )
|
||
r.data[--a] = 0;
|
||
var n;
|
||
for (n = r.t - this.t; a < n; ++a)
|
||
r.data[a + this.t] = this.am(0, e.data[a], r, a, 0, this.t);
|
||
for (n = Math.min(e.t, t); a < n; ++a)
|
||
this.am(0, e.data[a], r, a, 0, t - a);
|
||
r.clamp()
|
||
}
|
||
function Fe(e, t, r) {
|
||
--t;
|
||
var a = r.t = this.t + e.t - t;
|
||
for (r.s = 0; --a >= 0; )
|
||
r.data[a] = 0;
|
||
for (a = Math.max(t - this.t, 0); a < e.t; ++a)
|
||
r.data[this.t + a - t] = this.am(t - a, e.data[a], r, 0, 0, this.t + a - t);
|
||
r.clamp(),
|
||
r.drShiftTo(1, r)
|
||
}
|
||
function qe(e) {
|
||
this.r2 = n(),
|
||
this.q3 = n(),
|
||
a.ONE.dlShiftTo(2 * e.t, this.r2),
|
||
this.mu = this.r2.divide(e),
|
||
this.m = e
|
||
}
|
||
function je(e) {
|
||
if (e.s < 0 || e.t > 2 * this.m.t)
|
||
return e.mod(this.m);
|
||
if (e.compareTo(this.m) < 0)
|
||
return e;
|
||
var t = n();
|
||
return e.copyTo(t),
|
||
this.reduce(t),
|
||
t
|
||
}
|
||
function Ge(e) {
|
||
return e
|
||
}
|
||
function He(e) {
|
||
for (e.drShiftTo(this.m.t - 1, this.r2),
|
||
e.t > this.m.t + 1 && (e.t = this.m.t + 1,
|
||
e.clamp()),
|
||
this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3),
|
||
this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); e.compareTo(this.r2) < 0; )
|
||
e.dAddOffset(1, this.m.t + 1);
|
||
for (e.subTo(this.r2, e); e.compareTo(this.m) >= 0; )
|
||
e.subTo(this.m, e)
|
||
}
|
||
function Qe(e, t) {
|
||
e.squareTo(t),
|
||
this.reduce(t)
|
||
}
|
||
function ze(e, t, r) {
|
||
e.multiplyTo(t, r),
|
||
this.reduce(r)
|
||
}
|
||
function We(e, t) {
|
||
var r, a, i = e.bitLength(), s = f(1);
|
||
if (i <= 0)
|
||
return s;
|
||
r = i < 18 ? 1 : i < 48 ? 3 : i < 144 ? 4 : i < 768 ? 5 : 6,
|
||
a = i < 8 ? new R(t) : t.isEven() ? new qe(t) : new O(t);
|
||
var o = new Array
|
||
, c = 3
|
||
, u = r - 1
|
||
, l = (1 << r) - 1;
|
||
if (o[1] = a.convert(this),
|
||
r > 1) {
|
||
var p = n();
|
||
for (a.sqrTo(o[1], p); c <= l; )
|
||
o[c] = n(),
|
||
a.mulTo(p, o[c - 2], o[c]),
|
||
c += 2
|
||
}
|
||
var h, d, y = e.t - 1, g = !0, v = n();
|
||
for (i = C(e.data[y]) - 1; y >= 0; ) {
|
||
for (i >= u ? h = e.data[y] >> i - u & l : (h = (e.data[y] & (1 << i + 1) - 1) << u - i,
|
||
y > 0 && (h |= e.data[y - 1] >> this.DB + i - u)),
|
||
c = r; 0 == (1 & h); )
|
||
h >>= 1,
|
||
--c;
|
||
if ((i -= c) < 0 && (i += this.DB,
|
||
--y),
|
||
g)
|
||
o[h].copyTo(s),
|
||
g = !1;
|
||
else {
|
||
for (; c > 1; )
|
||
a.sqrTo(s, v),
|
||
a.sqrTo(v, s),
|
||
c -= 2;
|
||
c > 0 ? a.sqrTo(s, v) : (d = s,
|
||
s = v,
|
||
v = d),
|
||
a.mulTo(v, o[h], s)
|
||
}
|
||
for (; y >= 0 && 0 == (e.data[y] & 1 << i); )
|
||
a.sqrTo(s, v),
|
||
d = s,
|
||
s = v,
|
||
v = d,
|
||
--i < 0 && (i = this.DB - 1,
|
||
--y)
|
||
}
|
||
return a.revert(s)
|
||
}
|
||
function Ye(e) {
|
||
var t = this.s < 0 ? this.negate() : this.clone()
|
||
, r = e.s < 0 ? e.negate() : e.clone();
|
||
if (t.compareTo(r) < 0) {
|
||
var a = t;
|
||
t = r,
|
||
r = a
|
||
}
|
||
var n = t.getLowestSetBit()
|
||
, i = r.getLowestSetBit();
|
||
if (i < 0)
|
||
return t;
|
||
for (n < i && (i = n),
|
||
i > 0 && (t.rShiftTo(i, t),
|
||
r.rShiftTo(i, r)); t.signum() > 0; )
|
||
(n = t.getLowestSetBit()) > 0 && t.rShiftTo(n, t),
|
||
(n = r.getLowestSetBit()) > 0 && r.rShiftTo(n, r),
|
||
t.compareTo(r) >= 0 ? (t.subTo(r, t),
|
||
t.rShiftTo(1, t)) : (r.subTo(t, r),
|
||
r.rShiftTo(1, r));
|
||
return i > 0 && r.lShiftTo(i, r),
|
||
r
|
||
}
|
||
function Xe(e) {
|
||
if (e <= 0)
|
||
return 0;
|
||
var t = this.DV % e
|
||
, r = this.s < 0 ? e - 1 : 0;
|
||
if (this.t > 0)
|
||
if (0 == t)
|
||
r = this.data[0] % e;
|
||
else
|
||
for (var a = this.t - 1; a >= 0; --a)
|
||
r = (t * r + this.data[a]) % e;
|
||
return r
|
||
}
|
||
function Ze(e) {
|
||
var t = e.isEven();
|
||
if (this.isEven() && t || 0 == e.signum())
|
||
return a.ZERO;
|
||
for (var r = e.clone(), n = this.clone(), i = f(1), s = f(0), o = f(0), c = f(1); 0 != r.signum(); ) {
|
||
for (; r.isEven(); )
|
||
r.rShiftTo(1, r),
|
||
t ? (i.isEven() && s.isEven() || (i.addTo(this, i),
|
||
s.subTo(e, s)),
|
||
i.rShiftTo(1, i)) : s.isEven() || s.subTo(e, s),
|
||
s.rShiftTo(1, s);
|
||
for (; n.isEven(); )
|
||
n.rShiftTo(1, n),
|
||
t ? (o.isEven() && c.isEven() || (o.addTo(this, o),
|
||
c.subTo(e, c)),
|
||
o.rShiftTo(1, o)) : c.isEven() || c.subTo(e, c),
|
||
c.rShiftTo(1, c);
|
||
r.compareTo(n) >= 0 ? (r.subTo(n, r),
|
||
t && i.subTo(o, i),
|
||
s.subTo(c, s)) : (n.subTo(r, n),
|
||
t && o.subTo(i, o),
|
||
c.subTo(s, c))
|
||
}
|
||
return 0 != n.compareTo(a.ONE) ? a.ZERO : c.compareTo(e) >= 0 ? c.subtract(e) : c.signum() < 0 ? (c.addTo(e, c),
|
||
c.signum() < 0 ? c.add(e) : c) : c
|
||
}
|
||
function Je(e) {
|
||
var t, r = this.abs();
|
||
if (1 == r.t && r.data[0] <= ot[ot.length - 1]) {
|
||
for (t = 0; t < ot.length; ++t)
|
||
if (r.data[0] == ot[t])
|
||
return !0;
|
||
return !1
|
||
}
|
||
if (r.isEven())
|
||
return !1;
|
||
for (t = 1; t < ot.length; ) {
|
||
for (var a = ot[t], n = t + 1; n < ot.length && a < ct; )
|
||
a *= ot[n++];
|
||
for (a = r.modInt(a); t < n; )
|
||
if (a % ot[t++] == 0)
|
||
return !1
|
||
}
|
||
return r.millerRabin(e)
|
||
}
|
||
function $e(e) {
|
||
var t = this.subtract(a.ONE)
|
||
, r = t.getLowestSetBit();
|
||
if (r <= 0)
|
||
return !1;
|
||
for (var n, i = t.shiftRight(r), s = et(), o = 0; o < e; ++o) {
|
||
do {
|
||
n = new a(this.bitLength(),s)
|
||
} while (n.compareTo(a.ONE) <= 0 || n.compareTo(t) >= 0);
|
||
var c = n.modPow(i, this);
|
||
if (0 != c.compareTo(a.ONE) && 0 != c.compareTo(t)) {
|
||
for (var u = 1; u++ < r && 0 != c.compareTo(t); )
|
||
if (c = c.modPowInt(2, this),
|
||
0 == c.compareTo(a.ONE))
|
||
return !1;
|
||
if (0 != c.compareTo(t))
|
||
return !1
|
||
}
|
||
}
|
||
return !0
|
||
}
|
||
function et() {
|
||
return {
|
||
nextBytes: function(e) {
|
||
for (var t = 0; t < e.length; ++t)
|
||
e[t] = Math.floor(256 * Math.random())
|
||
}
|
||
}
|
||
}
|
||
var tt = r(0);
|
||
e.exports = tt.jsbn = tt.jsbn || {};
|
||
var rt;
|
||
tt.jsbn.BigInteger = a,
|
||
"undefined" == typeof navigator ? (a.prototype.am = o,
|
||
rt = 28) : "Microsoft Internet Explorer" == navigator.appName ? (a.prototype.am = s,
|
||
rt = 30) : "Netscape" != navigator.appName ? (a.prototype.am = i,
|
||
rt = 26) : (a.prototype.am = o,
|
||
rt = 28),
|
||
a.prototype.DB = rt,
|
||
a.prototype.DM = (1 << rt) - 1,
|
||
a.prototype.DV = 1 << rt;
|
||
a.prototype.FV = Math.pow(2, 52),
|
||
a.prototype.F1 = 52 - rt,
|
||
a.prototype.F2 = 2 * rt - 52;
|
||
var at, nt, it = "0123456789abcdefghijklmnopqrstuvwxyz", st = new Array;
|
||
for (at = "0".charCodeAt(0),
|
||
nt = 0; nt <= 9; ++nt)
|
||
st[at++] = nt;
|
||
for (at = "a".charCodeAt(0),
|
||
nt = 10; nt < 36; ++nt)
|
||
st[at++] = nt;
|
||
for (at = "A".charCodeAt(0),
|
||
nt = 10; nt < 36; ++nt)
|
||
st[at++] = nt;
|
||
R.prototype.convert = _,
|
||
R.prototype.revert = L,
|
||
R.prototype.reduce = U,
|
||
R.prototype.mulTo = D,
|
||
R.prototype.sqrTo = P,
|
||
O.prototype.convert = K,
|
||
O.prototype.revert = x,
|
||
O.prototype.reduce = M,
|
||
O.prototype.mulTo = q,
|
||
O.prototype.sqrTo = F,
|
||
a.prototype.copyTo = l,
|
||
a.prototype.fromInt = p,
|
||
a.prototype.fromString = h,
|
||
a.prototype.clamp = d,
|
||
a.prototype.dlShiftTo = S,
|
||
a.prototype.drShiftTo = T,
|
||
a.prototype.lShiftTo = I,
|
||
a.prototype.rShiftTo = b,
|
||
a.prototype.subTo = A,
|
||
a.prototype.multiplyTo = B,
|
||
a.prototype.squareTo = N,
|
||
a.prototype.divRemTo = k,
|
||
a.prototype.invDigit = V,
|
||
a.prototype.isEven = j,
|
||
a.prototype.exp = G,
|
||
a.prototype.toString = y,
|
||
a.prototype.negate = g,
|
||
a.prototype.abs = v,
|
||
a.prototype.compareTo = m,
|
||
a.prototype.bitLength = E,
|
||
a.prototype.mod = w,
|
||
a.prototype.modPowInt = H,
|
||
a.ZERO = f(0),
|
||
a.ONE = f(1),
|
||
Pe.prototype.convert = Ve,
|
||
Pe.prototype.revert = Ve,
|
||
Pe.prototype.mulTo = Oe,
|
||
Pe.prototype.sqrTo = Ke,
|
||
qe.prototype.convert = je,
|
||
qe.prototype.revert = Ge,
|
||
qe.prototype.reduce = He,
|
||
qe.prototype.mulTo = ze,
|
||
qe.prototype.sqrTo = Qe;
|
||
var ot = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509]
|
||
, ct = (1 << 26) / ot[ot.length - 1];
|
||
a.prototype.chunkSize = X,
|
||
a.prototype.toRadix = J,
|
||
a.prototype.fromRadix = $,
|
||
a.prototype.fromNumber = ee,
|
||
a.prototype.bitwiseTo = ie,
|
||
a.prototype.changeBit = Te,
|
||
a.prototype.addTo = Be,
|
||
a.prototype.dMultiply = Ue,
|
||
a.prototype.dAddOffset = De,
|
||
a.prototype.multiplyLowerTo = Me,
|
||
a.prototype.multiplyUpperTo = Fe,
|
||
a.prototype.modInt = Xe,
|
||
a.prototype.millerRabin = $e,
|
||
a.prototype.clone = Q,
|
||
a.prototype.intValue = z,
|
||
a.prototype.byteValue = W,
|
||
a.prototype.shortValue = Y,
|
||
a.prototype.signum = Z,
|
||
a.prototype.toByteArray = te,
|
||
a.prototype.equals = re,
|
||
a.prototype.min = ae,
|
||
a.prototype.max = ne,
|
||
a.prototype.and = oe,
|
||
a.prototype.or = ue,
|
||
a.prototype.xor = pe,
|
||
a.prototype.andNot = he,
|
||
a.prototype.not = de,
|
||
a.prototype.shiftLeft = ye,
|
||
a.prototype.shiftRight = ge,
|
||
a.prototype.getLowestSetBit = me,
|
||
a.prototype.bitCount = Ee,
|
||
a.prototype.testBit = Se,
|
||
a.prototype.setBit = Ie,
|
||
a.prototype.clearBit = be,
|
||
a.prototype.flipBit = Ae,
|
||
a.prototype.add = Ne,
|
||
a.prototype.subtract = ke,
|
||
a.prototype.multiply = we,
|
||
a.prototype.divide = Re,
|
||
a.prototype.remainder = _e,
|
||
a.prototype.divideAndRemainder = Le,
|
||
a.prototype.modPow = We,
|
||
a.prototype.modInverse = Ze,
|
||
a.prototype.pow = xe,
|
||
a.prototype.gcd = Ye,
|
||
a.prototype.isProbablePrime = Je
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(1),
|
||
e.exports = a.cipher = a.cipher || {},
|
||
a.cipher.algorithms = a.cipher.algorithms || {},
|
||
a.cipher.createCipher = function(e, t) {
|
||
var r = e;
|
||
if ("string" == typeof r && (r = a.cipher.getAlgorithm(r)) && (r = r()),
|
||
!r)
|
||
throw new Error("Unsupported algorithm: " + e);
|
||
return new a.cipher.BlockCipher({
|
||
algorithm: r,
|
||
key: t,
|
||
decrypt: !1
|
||
})
|
||
}
|
||
,
|
||
a.cipher.createDecipher = function(e, t) {
|
||
var r = e;
|
||
if ("string" == typeof r && (r = a.cipher.getAlgorithm(r)) && (r = r()),
|
||
!r)
|
||
throw new Error("Unsupported algorithm: " + e);
|
||
return new a.cipher.BlockCipher({
|
||
algorithm: r,
|
||
key: t,
|
||
decrypt: !0
|
||
})
|
||
}
|
||
,
|
||
a.cipher.registerAlgorithm = function(e, t) {
|
||
e = e.toUpperCase(),
|
||
a.cipher.algorithms[e] = t
|
||
}
|
||
,
|
||
a.cipher.getAlgorithm = function(e) {
|
||
return e = e.toUpperCase(),
|
||
e in a.cipher.algorithms ? a.cipher.algorithms[e] : null
|
||
}
|
||
;
|
||
var n = a.cipher.BlockCipher = function(e) {
|
||
this.algorithm = e.algorithm,
|
||
this.mode = this.algorithm.mode,
|
||
this.blockSize = this.mode.blockSize,
|
||
this._finish = !1,
|
||
this._input = null,
|
||
this.output = null,
|
||
this._op = e.decrypt ? this.mode.decrypt : this.mode.encrypt,
|
||
this._decrypt = e.decrypt,
|
||
this.algorithm.initialize(e)
|
||
}
|
||
;
|
||
n.prototype.start = function(e) {
|
||
e = e || {};
|
||
var t = {};
|
||
for (var r in e)
|
||
t[r] = e[r];
|
||
t.decrypt = this._decrypt,
|
||
this._finish = !1,
|
||
this._input = a.util.createBuffer(),
|
||
this.output = e.output || a.util.createBuffer(),
|
||
this.mode.start(t)
|
||
}
|
||
,
|
||
n.prototype.update = function(e) {
|
||
for (e && this._input.putBuffer(e); !this._op.call(this.mode, this._input, this.output, this._finish) && !this._finish; )
|
||
;
|
||
this._input.compact()
|
||
}
|
||
,
|
||
n.prototype.finish = function(e) {
|
||
!e || "ECB" !== this.mode.name && "CBC" !== this.mode.name || (this.mode.pad = function(t) {
|
||
return e(this.blockSize, t, !1)
|
||
}
|
||
,
|
||
this.mode.unpad = function(t) {
|
||
return e(this.blockSize, t, !0)
|
||
}
|
||
);
|
||
var t = {};
|
||
return t.decrypt = this._decrypt,
|
||
t.overflow = this._input.length() % this.blockSize,
|
||
!(!this._decrypt && this.mode.pad && !this.mode.pad(this._input, t)) && (this._finish = !0,
|
||
this.update(),
|
||
!(this._decrypt && this.mode.unpad && !this.mode.unpad(this.output, t)) && !(this.mode.afterFinish && !this.mode.afterFinish(this.output, t)))
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
function a() {
|
||
o = String.fromCharCode(128),
|
||
o += i.util.fillString(String.fromCharCode(0), 64),
|
||
c = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9],
|
||
u = [7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21],
|
||
l = new Array(64);
|
||
for (var e = 0; e < 64; ++e)
|
||
l[e] = Math.floor(4294967296 * Math.abs(Math.sin(e + 1)));
|
||
p = !0
|
||
}
|
||
function n(e, t, r) {
|
||
for (var a, n, i, s, o, p, f, h, d = r.length(); d >= 64; ) {
|
||
for (n = e.h0,
|
||
i = e.h1,
|
||
s = e.h2,
|
||
o = e.h3,
|
||
h = 0; h < 16; ++h)
|
||
t[h] = r.getInt32Le(),
|
||
p = o ^ i & (s ^ o),
|
||
a = n + p + l[h] + t[h],
|
||
f = u[h],
|
||
n = o,
|
||
o = s,
|
||
s = i,
|
||
i += a << f | a >>> 32 - f;
|
||
for (; h < 32; ++h)
|
||
p = s ^ o & (i ^ s),
|
||
a = n + p + l[h] + t[c[h]],
|
||
f = u[h],
|
||
n = o,
|
||
o = s,
|
||
s = i,
|
||
i += a << f | a >>> 32 - f;
|
||
for (; h < 48; ++h)
|
||
p = i ^ s ^ o,
|
||
a = n + p + l[h] + t[c[h]],
|
||
f = u[h],
|
||
n = o,
|
||
o = s,
|
||
s = i,
|
||
i += a << f | a >>> 32 - f;
|
||
for (; h < 64; ++h)
|
||
p = s ^ (i | ~o),
|
||
a = n + p + l[h] + t[c[h]],
|
||
f = u[h],
|
||
n = o,
|
||
o = s,
|
||
s = i,
|
||
i += a << f | a >>> 32 - f;
|
||
e.h0 = e.h0 + n | 0,
|
||
e.h1 = e.h1 + i | 0,
|
||
e.h2 = e.h2 + s | 0,
|
||
e.h3 = e.h3 + o | 0,
|
||
d -= 64
|
||
}
|
||
}
|
||
var i = r(0);
|
||
r(4),
|
||
r(1);
|
||
var s = e.exports = i.md5 = i.md5 || {};
|
||
i.md.md5 = i.md.algorithms.md5 = s,
|
||
s.create = function() {
|
||
p || a();
|
||
var e = null
|
||
, t = i.util.createBuffer()
|
||
, r = new Array(16)
|
||
, s = {
|
||
algorithm: "md5",
|
||
blockLength: 64,
|
||
digestLength: 16,
|
||
messageLength: 0,
|
||
fullMessageLength: null,
|
||
messageLengthSize: 8
|
||
};
|
||
return s.start = function() {
|
||
s.messageLength = 0,
|
||
s.fullMessageLength = s.messageLength64 = [];
|
||
for (var r = s.messageLengthSize / 4, a = 0; a < r; ++a)
|
||
s.fullMessageLength.push(0);
|
||
return t = i.util.createBuffer(),
|
||
e = {
|
||
h0: 1732584193,
|
||
h1: 4023233417,
|
||
h2: 2562383102,
|
||
h3: 271733878
|
||
},
|
||
s
|
||
}
|
||
,
|
||
s.start(),
|
||
s.update = function(a, o) {
|
||
"utf8" === o && (a = i.util.encodeUtf8(a));
|
||
var c = a.length;
|
||
s.messageLength += c,
|
||
c = [c / 4294967296 >>> 0, c >>> 0];
|
||
for (var u = s.fullMessageLength.length - 1; u >= 0; --u)
|
||
s.fullMessageLength[u] += c[1],
|
||
c[1] = c[0] + (s.fullMessageLength[u] / 4294967296 >>> 0),
|
||
s.fullMessageLength[u] = s.fullMessageLength[u] >>> 0,
|
||
c[0] = c[1] / 4294967296 >>> 0;
|
||
return t.putBytes(a),
|
||
n(e, r, t),
|
||
(t.read > 2048 || 0 === t.length()) && t.compact(),
|
||
s
|
||
}
|
||
,
|
||
s.digest = function() {
|
||
var a = i.util.createBuffer();
|
||
a.putBytes(t.bytes());
|
||
var c = s.fullMessageLength[s.fullMessageLength.length - 1] + s.messageLengthSize
|
||
, u = c & s.blockLength - 1;
|
||
a.putBytes(o.substr(0, s.blockLength - u));
|
||
for (var l, p = 0, f = s.fullMessageLength.length - 1; f >= 0; --f)
|
||
l = 8 * s.fullMessageLength[f] + p,
|
||
p = l / 4294967296 >>> 0,
|
||
a.putInt32Le(l >>> 0);
|
||
var h = {
|
||
h0: e.h0,
|
||
h1: e.h1,
|
||
h2: e.h2,
|
||
h3: e.h3
|
||
};
|
||
n(h, r, a);
|
||
var d = i.util.createBuffer();
|
||
return d.putInt32Le(h.h0),
|
||
d.putInt32Le(h.h1),
|
||
d.putInt32Le(h.h2),
|
||
d.putInt32Le(h.h3),
|
||
d
|
||
}
|
||
,
|
||
s
|
||
}
|
||
;
|
||
var o = null
|
||
, c = null
|
||
, u = null
|
||
, l = null
|
||
, p = !1
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(8),
|
||
r(4),
|
||
r(1);
|
||
var n, i = a.pkcs5 = a.pkcs5 || {};
|
||
a.util.isNodejs && !a.options.usePureJavaScript && (n = r(16)),
|
||
e.exports = a.pbkdf2 = i.pbkdf2 = function(e, t, r, i, s, o) {
|
||
function c() {
|
||
if (C > f)
|
||
return o(null, m);
|
||
d.start(null, null),
|
||
d.update(t),
|
||
d.update(a.util.int32ToBytes(C)),
|
||
y = v = d.digest().getBytes(),
|
||
E = 2,
|
||
u()
|
||
}
|
||
function u() {
|
||
if (E <= r)
|
||
return d.start(null, null),
|
||
d.update(v),
|
||
g = d.digest().getBytes(),
|
||
y = a.util.xorBytes(y, g, l),
|
||
v = g,
|
||
++E,
|
||
a.util.setImmediate(u);
|
||
m += C < f ? y : y.substr(0, h),
|
||
++C,
|
||
c()
|
||
}
|
||
if ("function" == typeof s && (o = s,
|
||
s = null),
|
||
a.util.isNodejs && !a.options.usePureJavaScript && n.pbkdf2 && (null === s || "object" != typeof s) && (n.pbkdf2Sync.length > 4 || !s || "sha1" === s))
|
||
return "string" != typeof s && (s = "sha1"),
|
||
e = new Buffer(e,"binary"),
|
||
t = new Buffer(t,"binary"),
|
||
o ? 4 === n.pbkdf2Sync.length ? n.pbkdf2(e, t, r, i, function(e, t) {
|
||
if (e)
|
||
return o(e);
|
||
o(null, t.toString("binary"))
|
||
}) : n.pbkdf2(e, t, r, i, s, function(e, t) {
|
||
if (e)
|
||
return o(e);
|
||
o(null, t.toString("binary"))
|
||
}) : 4 === n.pbkdf2Sync.length ? n.pbkdf2Sync(e, t, r, i).toString("binary") : n.pbkdf2Sync(e, t, r, i, s).toString("binary");
|
||
if (void 0 !== s && null !== s || (s = "sha1"),
|
||
"string" == typeof s) {
|
||
if (!(s in a.md.algorithms))
|
||
throw new Error("Unknown hash algorithm: " + s);
|
||
s = a.md[s].create()
|
||
}
|
||
var l = s.digestLength;
|
||
if (i > 4294967295 * l) {
|
||
var p = new Error("Derived key is too long.");
|
||
if (o)
|
||
return o(p);
|
||
throw p
|
||
}
|
||
var f = Math.ceil(i / l)
|
||
, h = i - (f - 1) * l
|
||
, d = a.hmac.create();
|
||
d.start(s, e);
|
||
var y, g, v, m = "";
|
||
if (!o) {
|
||
for (var C = 1; C <= f; ++C) {
|
||
d.start(null, null),
|
||
d.update(t),
|
||
d.update(a.util.int32ToBytes(C)),
|
||
y = v = d.digest().getBytes();
|
||
for (var E = 2; E <= r; ++E)
|
||
d.start(null, null),
|
||
d.update(v),
|
||
g = d.digest().getBytes(),
|
||
y = a.util.xorBytes(y, g, l),
|
||
v = g;
|
||
m += C < f ? y : y.substr(0, h)
|
||
}
|
||
return m
|
||
}
|
||
var E, C = 1;
|
||
c()
|
||
}
|
||
}
|
||
, function(e, t) {}
|
||
, function(e, t, r) {
|
||
function a(e, t) {
|
||
"string" == typeof t && (t = {
|
||
shortName: t
|
||
});
|
||
for (var r, a = null, n = 0; null === a && n < e.attributes.length; ++n)
|
||
r = e.attributes[n],
|
||
t.type && t.type === r.type ? a = r : t.name && t.name === r.name ? a = r : t.shortName && t.shortName === r.shortName && (a = r);
|
||
return a
|
||
}
|
||
function n(e) {
|
||
for (var t, r, a = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []), n = e.attributes, i = 0; i < n.length; ++i) {
|
||
t = n[i];
|
||
var s = t.value
|
||
, o = p.Type.PRINTABLESTRING;
|
||
"valueTagClass"in t && (o = t.valueTagClass) === p.Type.UTF8 && (s = l.util.encodeUtf8(s)),
|
||
r = p.create(p.Class.UNIVERSAL, p.Type.SET, !0, [p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(t.type).getBytes()), p.create(p.Class.UNIVERSAL, o, !1, s)])]),
|
||
a.value.push(r)
|
||
}
|
||
return a
|
||
}
|
||
function i(e) {
|
||
for (var t, r = 0; r < e.length; ++r) {
|
||
if (t = e[r],
|
||
void 0 === t.name && (t.type && t.type in f.oids ? t.name = f.oids[t.type] : t.shortName && t.shortName in d && (t.name = f.oids[d[t.shortName]])),
|
||
void 0 === t.type) {
|
||
if (!(t.name && t.name in f.oids)) {
|
||
var a = new Error("Attribute type not specified.");
|
||
throw a.attribute = t,
|
||
a
|
||
}
|
||
t.type = f.oids[t.name]
|
||
}
|
||
if (void 0 === t.shortName && t.name && t.name in d && (t.shortName = d[t.name]),
|
||
t.type === h.extensionRequest && (t.valueConstructed = !0,
|
||
t.valueTagClass = p.Type.SEQUENCE,
|
||
!t.value && t.extensions)) {
|
||
t.value = [];
|
||
for (var n = 0; n < t.extensions.length; ++n)
|
||
t.value.push(f.certificateExtensionToAsn1(s(t.extensions[n])))
|
||
}
|
||
if (void 0 === t.value) {
|
||
var a = new Error("Attribute value not specified.");
|
||
throw a.attribute = t,
|
||
a
|
||
}
|
||
}
|
||
}
|
||
function s(e, t) {
|
||
if (t = t || {},
|
||
void 0 === e.name && e.id && e.id in f.oids && (e.name = f.oids[e.id]),
|
||
void 0 === e.id) {
|
||
if (!(e.name && e.name in f.oids)) {
|
||
var r = new Error("Extension ID not specified.");
|
||
throw r.extension = e,
|
||
r
|
||
}
|
||
e.id = f.oids[e.name]
|
||
}
|
||
if (void 0 !== e.value)
|
||
return e;
|
||
if ("keyUsage" === e.name) {
|
||
var a = 0
|
||
, i = 0
|
||
, s = 0;
|
||
e.digitalSignature && (i |= 128,
|
||
a = 7),
|
||
e.nonRepudiation && (i |= 64,
|
||
a = 6),
|
||
e.keyEncipherment && (i |= 32,
|
||
a = 5),
|
||
e.dataEncipherment && (i |= 16,
|
||
a = 4),
|
||
e.keyAgreement && (i |= 8,
|
||
a = 3),
|
||
e.keyCertSign && (i |= 4,
|
||
a = 2),
|
||
e.cRLSign && (i |= 2,
|
||
a = 1),
|
||
e.encipherOnly && (i |= 1,
|
||
a = 0),
|
||
e.decipherOnly && (s |= 128,
|
||
a = 7);
|
||
var o = String.fromCharCode(a);
|
||
0 !== s ? o += String.fromCharCode(i) + String.fromCharCode(s) : 0 !== i && (o += String.fromCharCode(i)),
|
||
e.value = p.create(p.Class.UNIVERSAL, p.Type.BITSTRING, !1, o)
|
||
} else if ("basicConstraints" === e.name)
|
||
e.value = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []),
|
||
e.cA && e.value.value.push(p.create(p.Class.UNIVERSAL, p.Type.BOOLEAN, !1, String.fromCharCode(255))),
|
||
"pathLenConstraint"in e && e.value.value.push(p.create(p.Class.UNIVERSAL, p.Type.INTEGER, !1, p.integerToDer(e.pathLenConstraint).getBytes()));
|
||
else if ("extKeyUsage" === e.name) {
|
||
e.value = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []);
|
||
var c = e.value.value;
|
||
for (var u in e)
|
||
!0 === e[u] && (u in h ? c.push(p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(h[u]).getBytes())) : -1 !== u.indexOf(".") && c.push(p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(u).getBytes())))
|
||
} else if ("nsCertType" === e.name) {
|
||
var a = 0
|
||
, i = 0;
|
||
e.client && (i |= 128,
|
||
a = 7),
|
||
e.server && (i |= 64,
|
||
a = 6),
|
||
e.email && (i |= 32,
|
||
a = 5),
|
||
e.objsign && (i |= 16,
|
||
a = 4),
|
||
e.reserved && (i |= 8,
|
||
a = 3),
|
||
e.sslCA && (i |= 4,
|
||
a = 2),
|
||
e.emailCA && (i |= 2,
|
||
a = 1),
|
||
e.objCA && (i |= 1,
|
||
a = 0);
|
||
var o = String.fromCharCode(a);
|
||
0 !== i && (o += String.fromCharCode(i)),
|
||
e.value = p.create(p.Class.UNIVERSAL, p.Type.BITSTRING, !1, o)
|
||
} else if ("subjectAltName" === e.name || "issuerAltName" === e.name) {
|
||
e.value = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []);
|
||
for (var d, y = 0; y < e.altNames.length; ++y) {
|
||
d = e.altNames[y];
|
||
var o = d.value;
|
||
if (7 === d.type && d.ip) {
|
||
if (null === (o = l.util.bytesFromIP(d.ip))) {
|
||
var r = new Error('Extension "ip" value is not a valid IPv4 or IPv6 address.');
|
||
throw r.extension = e,
|
||
r
|
||
}
|
||
} else
|
||
8 === d.type && (o = d.oid ? p.oidToDer(p.oidToDer(d.oid)) : p.oidToDer(o));
|
||
e.value.value.push(p.create(p.Class.CONTEXT_SPECIFIC, d.type, !1, o))
|
||
}
|
||
} else if ("nsComment" === e.name && t.cert) {
|
||
if (!/^[\x00-\x7F]*$/.test(e.comment) || e.comment.length < 1 || e.comment.length > 128)
|
||
throw new Error('Invalid "nsComment" content.');
|
||
e.value = p.create(p.Class.UNIVERSAL, p.Type.IA5STRING, !1, e.comment)
|
||
} else if ("subjectKeyIdentifier" === e.name && t.cert) {
|
||
var g = t.cert.generateSubjectKeyIdentifier();
|
||
e.subjectKeyIdentifier = g.toHex(),
|
||
e.value = p.create(p.Class.UNIVERSAL, p.Type.OCTETSTRING, !1, g.getBytes())
|
||
} else if ("authorityKeyIdentifier" === e.name && t.cert) {
|
||
e.value = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []);
|
||
var c = e.value.value;
|
||
if (e.keyIdentifier) {
|
||
var v = !0 === e.keyIdentifier ? t.cert.generateSubjectKeyIdentifier().getBytes() : e.keyIdentifier;
|
||
c.push(p.create(p.Class.CONTEXT_SPECIFIC, 0, !1, v))
|
||
}
|
||
if (e.authorityCertIssuer) {
|
||
var m = [p.create(p.Class.CONTEXT_SPECIFIC, 4, !0, [n(!0 === e.authorityCertIssuer ? t.cert.issuer : e.authorityCertIssuer)])];
|
||
c.push(p.create(p.Class.CONTEXT_SPECIFIC, 1, !0, m))
|
||
}
|
||
if (e.serialNumber) {
|
||
var C = l.util.hexToBytes(!0 === e.serialNumber ? t.cert.serialNumber : e.serialNumber);
|
||
c.push(p.create(p.Class.CONTEXT_SPECIFIC, 2, !1, C))
|
||
}
|
||
} else if ("cRLDistributionPoints" === e.name) {
|
||
e.value = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []);
|
||
for (var d, c = e.value.value, E = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []), S = p.create(p.Class.CONTEXT_SPECIFIC, 0, !0, []), y = 0; y < e.altNames.length; ++y) {
|
||
d = e.altNames[y];
|
||
var o = d.value;
|
||
if (7 === d.type && d.ip) {
|
||
if (null === (o = l.util.bytesFromIP(d.ip))) {
|
||
var r = new Error('Extension "ip" value is not a valid IPv4 or IPv6 address.');
|
||
throw r.extension = e,
|
||
r
|
||
}
|
||
} else
|
||
8 === d.type && (o = d.oid ? p.oidToDer(p.oidToDer(d.oid)) : p.oidToDer(o));
|
||
S.value.push(p.create(p.Class.CONTEXT_SPECIFIC, d.type, !1, o))
|
||
}
|
||
E.value.push(p.create(p.Class.CONTEXT_SPECIFIC, 0, !0, [S])),
|
||
c.push(E)
|
||
}
|
||
if (void 0 === e.value) {
|
||
var r = new Error("Extension value not specified.");
|
||
throw r.extension = e,
|
||
r
|
||
}
|
||
return e
|
||
}
|
||
function o(e, t) {
|
||
switch (e) {
|
||
case h["RSASSA-PSS"]:
|
||
var r = [];
|
||
return void 0 !== t.hash.algorithmOid && r.push(p.create(p.Class.CONTEXT_SPECIFIC, 0, !0, [p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(t.hash.algorithmOid).getBytes()), p.create(p.Class.UNIVERSAL, p.Type.NULL, !1, "")])])),
|
||
void 0 !== t.mgf.algorithmOid && r.push(p.create(p.Class.CONTEXT_SPECIFIC, 1, !0, [p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(t.mgf.algorithmOid).getBytes()), p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(t.mgf.hash.algorithmOid).getBytes()), p.create(p.Class.UNIVERSAL, p.Type.NULL, !1, "")])])])),
|
||
void 0 !== t.saltLength && r.push(p.create(p.Class.CONTEXT_SPECIFIC, 2, !0, [p.create(p.Class.UNIVERSAL, p.Type.INTEGER, !1, p.integerToDer(t.saltLength).getBytes())])),
|
||
p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, r);
|
||
default:
|
||
return p.create(p.Class.UNIVERSAL, p.Type.NULL, !1, "")
|
||
}
|
||
}
|
||
function c(e) {
|
||
var t = p.create(p.Class.CONTEXT_SPECIFIC, 0, !0, []);
|
||
if (0 === e.attributes.length)
|
||
return t;
|
||
for (var r = e.attributes, a = 0; a < r.length; ++a) {
|
||
var n = r[a]
|
||
, i = n.value
|
||
, s = p.Type.UTF8;
|
||
"valueTagClass"in n && (s = n.valueTagClass),
|
||
s === p.Type.UTF8 && (i = l.util.encodeUtf8(i));
|
||
var o = !1;
|
||
"valueConstructed"in n && (o = n.valueConstructed);
|
||
var c = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(n.type).getBytes()), p.create(p.Class.UNIVERSAL, p.Type.SET, !0, [p.create(p.Class.UNIVERSAL, s, o, i)])]);
|
||
t.value.push(c)
|
||
}
|
||
return t
|
||
}
|
||
function u(e) {
|
||
return e >= S && e < T ? p.create(p.Class.UNIVERSAL, p.Type.UTCTIME, !1, p.dateToUtcTime(e)) : p.create(p.Class.UNIVERSAL, p.Type.GENERALIZEDTIME, !1, p.dateToGeneralizedTime(e))
|
||
}
|
||
var l = r(0);
|
||
r(5),
|
||
r(3),
|
||
r(10),
|
||
r(4),
|
||
r(39),
|
||
r(6),
|
||
r(7),
|
||
r(18),
|
||
r(11),
|
||
r(1);
|
||
var p = l.asn1
|
||
, f = e.exports = l.pki = l.pki || {}
|
||
, h = f.oids
|
||
, d = {};
|
||
d.CN = h.commonName,
|
||
d.commonName = "CN",
|
||
d.C = h.countryName,
|
||
d.countryName = "C",
|
||
d.L = h.localityName,
|
||
d.localityName = "L",
|
||
d.ST = h.stateOrProvinceName,
|
||
d.stateOrProvinceName = "ST",
|
||
d.O = h.organizationName,
|
||
d.organizationName = "O",
|
||
d.OU = h.organizationalUnitName,
|
||
d.organizationalUnitName = "OU",
|
||
d.E = h.emailAddress,
|
||
d.emailAddress = "E";
|
||
var y = l.pki.rsa.publicKeyValidator
|
||
, g = {
|
||
name: "Certificate",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "Certificate.TBSCertificate",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
captureAsn1: "tbsCertificate",
|
||
value: [{
|
||
name: "Certificate.TBSCertificate.version",
|
||
tagClass: p.Class.CONTEXT_SPECIFIC,
|
||
type: 0,
|
||
constructed: !0,
|
||
optional: !0,
|
||
value: [{
|
||
name: "Certificate.TBSCertificate.version.integer",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "certVersion"
|
||
}]
|
||
}, {
|
||
name: "Certificate.TBSCertificate.serialNumber",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "certSerialNumber"
|
||
}, {
|
||
name: "Certificate.TBSCertificate.signature",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "Certificate.TBSCertificate.signature.algorithm",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.OID,
|
||
constructed: !1,
|
||
capture: "certinfoSignatureOid"
|
||
}, {
|
||
name: "Certificate.TBSCertificate.signature.parameters",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
optional: !0,
|
||
captureAsn1: "certinfoSignatureParams"
|
||
}]
|
||
}, {
|
||
name: "Certificate.TBSCertificate.issuer",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
captureAsn1: "certIssuer"
|
||
}, {
|
||
name: "Certificate.TBSCertificate.validity",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "Certificate.TBSCertificate.validity.notBefore (utc)",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.UTCTIME,
|
||
constructed: !1,
|
||
optional: !0,
|
||
capture: "certValidity1UTCTime"
|
||
}, {
|
||
name: "Certificate.TBSCertificate.validity.notBefore (generalized)",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.GENERALIZEDTIME,
|
||
constructed: !1,
|
||
optional: !0,
|
||
capture: "certValidity2GeneralizedTime"
|
||
}, {
|
||
name: "Certificate.TBSCertificate.validity.notAfter (utc)",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.UTCTIME,
|
||
constructed: !1,
|
||
optional: !0,
|
||
capture: "certValidity3UTCTime"
|
||
}, {
|
||
name: "Certificate.TBSCertificate.validity.notAfter (generalized)",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.GENERALIZEDTIME,
|
||
constructed: !1,
|
||
optional: !0,
|
||
capture: "certValidity4GeneralizedTime"
|
||
}]
|
||
}, {
|
||
name: "Certificate.TBSCertificate.subject",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
captureAsn1: "certSubject"
|
||
}, y, {
|
||
name: "Certificate.TBSCertificate.issuerUniqueID",
|
||
tagClass: p.Class.CONTEXT_SPECIFIC,
|
||
type: 1,
|
||
constructed: !0,
|
||
optional: !0,
|
||
value: [{
|
||
name: "Certificate.TBSCertificate.issuerUniqueID.id",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.BITSTRING,
|
||
constructed: !1,
|
||
captureBitStringValue: "certIssuerUniqueId"
|
||
}]
|
||
}, {
|
||
name: "Certificate.TBSCertificate.subjectUniqueID",
|
||
tagClass: p.Class.CONTEXT_SPECIFIC,
|
||
type: 2,
|
||
constructed: !0,
|
||
optional: !0,
|
||
value: [{
|
||
name: "Certificate.TBSCertificate.subjectUniqueID.id",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.BITSTRING,
|
||
constructed: !1,
|
||
captureBitStringValue: "certSubjectUniqueId"
|
||
}]
|
||
}, {
|
||
name: "Certificate.TBSCertificate.extensions",
|
||
tagClass: p.Class.CONTEXT_SPECIFIC,
|
||
type: 3,
|
||
constructed: !0,
|
||
captureAsn1: "certExtensions",
|
||
optional: !0
|
||
}]
|
||
}, {
|
||
name: "Certificate.signatureAlgorithm",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "Certificate.signatureAlgorithm.algorithm",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.OID,
|
||
constructed: !1,
|
||
capture: "certSignatureOid"
|
||
}, {
|
||
name: "Certificate.TBSCertificate.signature.parameters",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
optional: !0,
|
||
captureAsn1: "certSignatureParams"
|
||
}]
|
||
}, {
|
||
name: "Certificate.signatureValue",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.BITSTRING,
|
||
constructed: !1,
|
||
captureBitStringValue: "certSignature"
|
||
}]
|
||
}
|
||
, v = {
|
||
name: "rsapss",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "rsapss.hashAlgorithm",
|
||
tagClass: p.Class.CONTEXT_SPECIFIC,
|
||
type: 0,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "rsapss.hashAlgorithm.AlgorithmIdentifier",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Class.SEQUENCE,
|
||
constructed: !0,
|
||
optional: !0,
|
||
value: [{
|
||
name: "rsapss.hashAlgorithm.AlgorithmIdentifier.algorithm",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.OID,
|
||
constructed: !1,
|
||
capture: "hashOid"
|
||
}]
|
||
}]
|
||
}, {
|
||
name: "rsapss.maskGenAlgorithm",
|
||
tagClass: p.Class.CONTEXT_SPECIFIC,
|
||
type: 1,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Class.SEQUENCE,
|
||
constructed: !0,
|
||
optional: !0,
|
||
value: [{
|
||
name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier.algorithm",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.OID,
|
||
constructed: !1,
|
||
capture: "maskGenOid"
|
||
}, {
|
||
name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier.params",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier.params.algorithm",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.OID,
|
||
constructed: !1,
|
||
capture: "maskGenHashOid"
|
||
}]
|
||
}]
|
||
}]
|
||
}, {
|
||
name: "rsapss.saltLength",
|
||
tagClass: p.Class.CONTEXT_SPECIFIC,
|
||
type: 2,
|
||
optional: !0,
|
||
value: [{
|
||
name: "rsapss.saltLength.saltLength",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Class.INTEGER,
|
||
constructed: !1,
|
||
capture: "saltLength"
|
||
}]
|
||
}, {
|
||
name: "rsapss.trailerField",
|
||
tagClass: p.Class.CONTEXT_SPECIFIC,
|
||
type: 3,
|
||
optional: !0,
|
||
value: [{
|
||
name: "rsapss.trailer.trailer",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Class.INTEGER,
|
||
constructed: !1,
|
||
capture: "trailer"
|
||
}]
|
||
}]
|
||
}
|
||
, m = {
|
||
name: "CertificationRequestInfo",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
captureAsn1: "certificationRequestInfo",
|
||
value: [{
|
||
name: "CertificationRequestInfo.integer",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "certificationRequestInfoVersion"
|
||
}, {
|
||
name: "CertificationRequestInfo.subject",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
captureAsn1: "certificationRequestInfoSubject"
|
||
}, y, {
|
||
name: "CertificationRequestInfo.attributes",
|
||
tagClass: p.Class.CONTEXT_SPECIFIC,
|
||
type: 0,
|
||
constructed: !0,
|
||
optional: !0,
|
||
capture: "certificationRequestInfoAttributes",
|
||
value: [{
|
||
name: "CertificationRequestInfo.attributes",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "CertificationRequestInfo.attributes.type",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.OID,
|
||
constructed: !1
|
||
}, {
|
||
name: "CertificationRequestInfo.attributes.value",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SET,
|
||
constructed: !0
|
||
}]
|
||
}]
|
||
}]
|
||
}
|
||
, C = {
|
||
name: "CertificationRequest",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
captureAsn1: "csr",
|
||
value: [m, {
|
||
name: "CertificationRequest.signatureAlgorithm",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "CertificationRequest.signatureAlgorithm.algorithm",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.OID,
|
||
constructed: !1,
|
||
capture: "csrSignatureOid"
|
||
}, {
|
||
name: "CertificationRequest.signatureAlgorithm.parameters",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
optional: !0,
|
||
captureAsn1: "csrSignatureParams"
|
||
}]
|
||
}, {
|
||
name: "CertificationRequest.signature",
|
||
tagClass: p.Class.UNIVERSAL,
|
||
type: p.Type.BITSTRING,
|
||
constructed: !1,
|
||
captureBitStringValue: "csrSignature"
|
||
}]
|
||
};
|
||
f.RDNAttributesAsArray = function(e, t) {
|
||
for (var r, a, n, i = [], s = 0; s < e.value.length; ++s) {
|
||
r = e.value[s];
|
||
for (var o = 0; o < r.value.length; ++o)
|
||
n = {},
|
||
a = r.value[o],
|
||
n.type = p.derToOid(a.value[0].value),
|
||
n.value = a.value[1].value,
|
||
n.valueTagClass = a.value[1].type,
|
||
n.type in h && (n.name = h[n.type],
|
||
n.name in d && (n.shortName = d[n.name])),
|
||
t && (t.update(n.type),
|
||
t.update(n.value)),
|
||
i.push(n)
|
||
}
|
||
return i
|
||
}
|
||
,
|
||
f.CRIAttributesAsArray = function(e) {
|
||
for (var t = [], r = 0; r < e.length; ++r)
|
||
for (var a = e[r], n = p.derToOid(a.value[0].value), i = a.value[1].value, s = 0; s < i.length; ++s) {
|
||
var o = {};
|
||
if (o.type = n,
|
||
o.value = i[s].value,
|
||
o.valueTagClass = i[s].type,
|
||
o.type in h && (o.name = h[o.type],
|
||
o.name in d && (o.shortName = d[o.name])),
|
||
o.type === h.extensionRequest) {
|
||
o.extensions = [];
|
||
for (var c = 0; c < o.value.length; ++c)
|
||
o.extensions.push(f.certificateExtensionFromAsn1(o.value[c]))
|
||
}
|
||
t.push(o)
|
||
}
|
||
return t
|
||
}
|
||
;
|
||
var E = function(e, t, r) {
|
||
var a = {};
|
||
if (e !== h["RSASSA-PSS"])
|
||
return a;
|
||
r && (a = {
|
||
hash: {
|
||
algorithmOid: h.sha1
|
||
},
|
||
mgf: {
|
||
algorithmOid: h.mgf1,
|
||
hash: {
|
||
algorithmOid: h.sha1
|
||
}
|
||
},
|
||
saltLength: 20
|
||
});
|
||
var n = {}
|
||
, i = [];
|
||
if (!p.validate(t, v, n, i)) {
|
||
var s = new Error("Cannot read RSASSA-PSS parameter block.");
|
||
throw s.errors = i,
|
||
s
|
||
}
|
||
return void 0 !== n.hashOid && (a.hash = a.hash || {},
|
||
a.hash.algorithmOid = p.derToOid(n.hashOid)),
|
||
void 0 !== n.maskGenOid && (a.mgf = a.mgf || {},
|
||
a.mgf.algorithmOid = p.derToOid(n.maskGenOid),
|
||
a.mgf.hash = a.mgf.hash || {},
|
||
a.mgf.hash.algorithmOid = p.derToOid(n.maskGenHashOid)),
|
||
void 0 !== n.saltLength && (a.saltLength = n.saltLength.charCodeAt(0)),
|
||
a
|
||
};
|
||
f.certificateFromPem = function(e, t, r) {
|
||
var a = l.pem.decode(e)[0];
|
||
if ("CERTIFICATE" !== a.type && "X509 CERTIFICATE" !== a.type && "TRUSTED CERTIFICATE" !== a.type) {
|
||
var n = new Error('Could not convert certificate from PEM; PEM header type is not "CERTIFICATE", "X509 CERTIFICATE", or "TRUSTED CERTIFICATE".');
|
||
throw n.headerType = a.type,
|
||
n
|
||
}
|
||
if (a.procType && "ENCRYPTED" === a.procType.type)
|
||
throw new Error("Could not convert certificate from PEM; PEM is encrypted.");
|
||
var i = p.fromDer(a.body, r);
|
||
return f.certificateFromAsn1(i, t)
|
||
}
|
||
,
|
||
f.certificateToPem = function(e, t) {
|
||
var r = {
|
||
type: "CERTIFICATE",
|
||
body: p.toDer(f.certificateToAsn1(e)).getBytes()
|
||
};
|
||
return l.pem.encode(r, {
|
||
maxline: t
|
||
})
|
||
}
|
||
,
|
||
f.publicKeyFromPem = function(e) {
|
||
var t = l.pem.decode(e)[0];
|
||
if ("PUBLIC KEY" !== t.type && "RSA PUBLIC KEY" !== t.type) {
|
||
var r = new Error('Could not convert public key from PEM; PEM header type is not "PUBLIC KEY" or "RSA PUBLIC KEY".');
|
||
throw r.headerType = t.type,
|
||
r
|
||
}
|
||
if (t.procType && "ENCRYPTED" === t.procType.type)
|
||
throw new Error("Could not convert public key from PEM; PEM is encrypted.");
|
||
var a = p.fromDer(t.body);
|
||
return f.publicKeyFromAsn1(a)
|
||
}
|
||
,
|
||
f.publicKeyToPem = function(e, t) {
|
||
var r = {
|
||
type: "PUBLIC KEY",
|
||
body: p.toDer(f.publicKeyToAsn1(e)).getBytes()
|
||
};
|
||
return l.pem.encode(r, {
|
||
maxline: t
|
||
})
|
||
}
|
||
,
|
||
f.publicKeyToRSAPublicKeyPem = function(e, t) {
|
||
var r = {
|
||
type: "RSA PUBLIC KEY",
|
||
body: p.toDer(f.publicKeyToRSAPublicKey(e)).getBytes()
|
||
};
|
||
return l.pem.encode(r, {
|
||
maxline: t
|
||
})
|
||
}
|
||
,
|
||
f.getPublicKeyFingerprint = function(e, t) {
|
||
t = t || {};
|
||
var r, a = t.md || l.md.sha1.create(), n = t.type || "RSAPublicKey";
|
||
switch (n) {
|
||
case "RSAPublicKey":
|
||
r = p.toDer(f.publicKeyToRSAPublicKey(e)).getBytes();
|
||
break;
|
||
case "SubjectPublicKeyInfo":
|
||
r = p.toDer(f.publicKeyToAsn1(e)).getBytes();
|
||
break;
|
||
default:
|
||
throw new Error('Unknown fingerprint type "' + t.type + '".')
|
||
}
|
||
a.start(),
|
||
a.update(r);
|
||
var i = a.digest();
|
||
if ("hex" === t.encoding) {
|
||
var s = i.toHex();
|
||
return t.delimiter ? s.match(/.{2}/g).join(t.delimiter) : s
|
||
}
|
||
if ("binary" === t.encoding)
|
||
return i.getBytes();
|
||
if (t.encoding)
|
||
throw new Error('Unknown encoding "' + t.encoding + '".');
|
||
return i
|
||
}
|
||
,
|
||
f.certificationRequestFromPem = function(e, t, r) {
|
||
var a = l.pem.decode(e)[0];
|
||
if ("CERTIFICATE REQUEST" !== a.type) {
|
||
var n = new Error('Could not convert certification request from PEM; PEM header type is not "CERTIFICATE REQUEST".');
|
||
throw n.headerType = a.type,
|
||
n
|
||
}
|
||
if (a.procType && "ENCRYPTED" === a.procType.type)
|
||
throw new Error("Could not convert certification request from PEM; PEM is encrypted.");
|
||
var i = p.fromDer(a.body, r);
|
||
return f.certificationRequestFromAsn1(i, t)
|
||
}
|
||
,
|
||
f.certificationRequestToPem = function(e, t) {
|
||
var r = {
|
||
type: "CERTIFICATE REQUEST",
|
||
body: p.toDer(f.certificationRequestToAsn1(e)).getBytes()
|
||
};
|
||
return l.pem.encode(r, {
|
||
maxline: t
|
||
})
|
||
}
|
||
,
|
||
f.createCertificate = function() {
|
||
var e = {};
|
||
return e.version = 2,
|
||
e.serialNumber = "00",
|
||
e.signatureOid = null,
|
||
e.signature = null,
|
||
e.siginfo = {},
|
||
e.siginfo.algorithmOid = null,
|
||
e.validity = {},
|
||
e.validity.notBefore = new Date,
|
||
e.validity.notAfter = new Date,
|
||
e.issuer = {},
|
||
e.issuer.getField = function(t) {
|
||
return a(e.issuer, t)
|
||
}
|
||
,
|
||
e.issuer.addField = function(t) {
|
||
i([t]),
|
||
e.issuer.attributes.push(t)
|
||
}
|
||
,
|
||
e.issuer.attributes = [],
|
||
e.issuer.hash = null,
|
||
e.subject = {},
|
||
e.subject.getField = function(t) {
|
||
return a(e.subject, t)
|
||
}
|
||
,
|
||
e.subject.addField = function(t) {
|
||
i([t]),
|
||
e.subject.attributes.push(t)
|
||
}
|
||
,
|
||
e.subject.attributes = [],
|
||
e.subject.hash = null,
|
||
e.extensions = [],
|
||
e.publicKey = null,
|
||
e.md = null,
|
||
e.setSubject = function(t, r) {
|
||
i(t),
|
||
e.subject.attributes = t,
|
||
delete e.subject.uniqueId,
|
||
r && (e.subject.uniqueId = r),
|
||
e.subject.hash = null
|
||
}
|
||
,
|
||
e.setIssuer = function(t, r) {
|
||
i(t),
|
||
e.issuer.attributes = t,
|
||
delete e.issuer.uniqueId,
|
||
r && (e.issuer.uniqueId = r),
|
||
e.issuer.hash = null
|
||
}
|
||
,
|
||
e.setExtensions = function(t) {
|
||
for (var r = 0; r < t.length; ++r)
|
||
s(t[r], {
|
||
cert: e
|
||
});
|
||
e.extensions = t
|
||
}
|
||
,
|
||
e.getExtension = function(t) {
|
||
"string" == typeof t && (t = {
|
||
name: t
|
||
});
|
||
for (var r, a = null, n = 0; null === a && n < e.extensions.length; ++n)
|
||
r = e.extensions[n],
|
||
t.id && r.id === t.id ? a = r : t.name && r.name === t.name && (a = r);
|
||
return a
|
||
}
|
||
,
|
||
e.sign = function(t, r) {
|
||
e.md = r || l.md.sha1.create();
|
||
var a = h[e.md.algorithm + "WithRSAEncryption"];
|
||
if (!a) {
|
||
var n = new Error("Could not compute certificate digest. Unknown message digest algorithm OID.");
|
||
throw n.algorithm = e.md.algorithm,
|
||
n
|
||
}
|
||
e.signatureOid = e.siginfo.algorithmOid = a,
|
||
e.tbsCertificate = f.getTBSCertificate(e);
|
||
var i = p.toDer(e.tbsCertificate);
|
||
e.md.update(i.getBytes()),
|
||
e.signature = t.sign(e.md)
|
||
}
|
||
,
|
||
e.verify = function(t) {
|
||
var r = !1;
|
||
if (!e.issued(t)) {
|
||
var a = t.issuer
|
||
, n = e.subject
|
||
, i = new Error("The parent certificate did not issue the given child certificate; the child certificate's issuer does not match the parent's subject.");
|
||
throw i.expectedIssuer = a.attributes,
|
||
i.actualIssuer = n.attributes,
|
||
i
|
||
}
|
||
var s = t.md;
|
||
if (null === s) {
|
||
if (t.signatureOid in h) {
|
||
switch (h[t.signatureOid]) {
|
||
case "sha1WithRSAEncryption":
|
||
s = l.md.sha1.create();
|
||
break;
|
||
case "md5WithRSAEncryption":
|
||
s = l.md.md5.create();
|
||
break;
|
||
case "sha256WithRSAEncryption":
|
||
s = l.md.sha256.create();
|
||
break;
|
||
case "sha384WithRSAEncryption":
|
||
s = l.md.sha384.create();
|
||
break;
|
||
case "sha512WithRSAEncryption":
|
||
s = l.md.sha512.create();
|
||
break;
|
||
case "RSASSA-PSS":
|
||
s = l.md.sha256.create()
|
||
}
|
||
}
|
||
if (null === s) {
|
||
var i = new Error("Could not compute certificate digest. Unknown signature OID.");
|
||
throw i.signatureOid = t.signatureOid,
|
||
i
|
||
}
|
||
var o = t.tbsCertificate || f.getTBSCertificate(t)
|
||
, c = p.toDer(o);
|
||
s.update(c.getBytes())
|
||
}
|
||
if (null !== s) {
|
||
var u;
|
||
switch (t.signatureOid) {
|
||
case h.sha1WithRSAEncryption:
|
||
u = void 0;
|
||
break;
|
||
case h["RSASSA-PSS"]:
|
||
var d, y;
|
||
if (void 0 === (d = h[t.signatureParameters.mgf.hash.algorithmOid]) || void 0 === l.md[d]) {
|
||
var i = new Error("Unsupported MGF hash function.");
|
||
throw i.oid = t.signatureParameters.mgf.hash.algorithmOid,
|
||
i.name = d,
|
||
i
|
||
}
|
||
if (void 0 === (y = h[t.signatureParameters.mgf.algorithmOid]) || void 0 === l.mgf[y]) {
|
||
var i = new Error("Unsupported MGF function.");
|
||
throw i.oid = t.signatureParameters.mgf.algorithmOid,
|
||
i.name = y,
|
||
i
|
||
}
|
||
if (y = l.mgf[y].create(l.md[d].create()),
|
||
void 0 === (d = h[t.signatureParameters.hash.algorithmOid]) || void 0 === l.md[d])
|
||
throw {
|
||
message: "Unsupported RSASSA-PSS hash function.",
|
||
oid: t.signatureParameters.hash.algorithmOid,
|
||
name: d
|
||
};
|
||
u = l.pss.create(l.md[d].create(), y, t.signatureParameters.saltLength)
|
||
}
|
||
r = e.publicKey.verify(s.digest().getBytes(), t.signature, u)
|
||
}
|
||
return r
|
||
}
|
||
,
|
||
e.isIssuer = function(t) {
|
||
var r = !1
|
||
, a = e.issuer
|
||
, n = t.subject;
|
||
if (a.hash && n.hash)
|
||
r = a.hash === n.hash;
|
||
else if (a.attributes.length === n.attributes.length) {
|
||
r = !0;
|
||
for (var i, s, o = 0; r && o < a.attributes.length; ++o)
|
||
i = a.attributes[o],
|
||
s = n.attributes[o],
|
||
i.type === s.type && i.value === s.value || (r = !1)
|
||
}
|
||
return r
|
||
}
|
||
,
|
||
e.issued = function(t) {
|
||
return t.isIssuer(e)
|
||
}
|
||
,
|
||
e.generateSubjectKeyIdentifier = function() {
|
||
return f.getPublicKeyFingerprint(e.publicKey, {
|
||
type: "RSAPublicKey"
|
||
})
|
||
}
|
||
,
|
||
e.verifySubjectKeyIdentifier = function() {
|
||
for (var t = h.subjectKeyIdentifier, r = 0; r < e.extensions.length; ++r) {
|
||
var a = e.extensions[r];
|
||
if (a.id === t) {
|
||
var n = e.generateSubjectKeyIdentifier().getBytes();
|
||
return l.util.hexToBytes(a.subjectKeyIdentifier) === n
|
||
}
|
||
}
|
||
return !1
|
||
}
|
||
,
|
||
e
|
||
}
|
||
,
|
||
f.certificateFromAsn1 = function(e, t) {
|
||
var r = {}
|
||
, n = [];
|
||
if (!p.validate(e, g, r, n)) {
|
||
var s = new Error("Cannot read X.509 certificate. ASN.1 object is not an X509v3 Certificate.");
|
||
throw s.errors = n,
|
||
s
|
||
}
|
||
var o = p.derToOid(r.publicKeyOid);
|
||
if (o !== f.oids.rsaEncryption)
|
||
throw new Error("Cannot read public key. OID is not RSA.");
|
||
var c = f.createCertificate();
|
||
c.version = r.certVersion ? r.certVersion.charCodeAt(0) : 0;
|
||
var u = l.util.createBuffer(r.certSerialNumber);
|
||
c.serialNumber = u.toHex(),
|
||
c.signatureOid = l.asn1.derToOid(r.certSignatureOid),
|
||
c.signatureParameters = E(c.signatureOid, r.certSignatureParams, !0),
|
||
c.siginfo.algorithmOid = l.asn1.derToOid(r.certinfoSignatureOid),
|
||
c.siginfo.parameters = E(c.siginfo.algorithmOid, r.certinfoSignatureParams, !1),
|
||
c.signature = r.certSignature;
|
||
var d = [];
|
||
if (void 0 !== r.certValidity1UTCTime && d.push(p.utcTimeToDate(r.certValidity1UTCTime)),
|
||
void 0 !== r.certValidity2GeneralizedTime && d.push(p.generalizedTimeToDate(r.certValidity2GeneralizedTime)),
|
||
void 0 !== r.certValidity3UTCTime && d.push(p.utcTimeToDate(r.certValidity3UTCTime)),
|
||
void 0 !== r.certValidity4GeneralizedTime && d.push(p.generalizedTimeToDate(r.certValidity4GeneralizedTime)),
|
||
d.length > 2)
|
||
throw new Error("Cannot read notBefore/notAfter validity times; more than two times were provided in the certificate.");
|
||
if (d.length < 2)
|
||
throw new Error("Cannot read notBefore/notAfter validity times; they were not provided as either UTCTime or GeneralizedTime.");
|
||
if (c.validity.notBefore = d[0],
|
||
c.validity.notAfter = d[1],
|
||
c.tbsCertificate = r.tbsCertificate,
|
||
t) {
|
||
if (c.md = null,
|
||
c.signatureOid in h) {
|
||
var o = h[c.signatureOid];
|
||
switch (o) {
|
||
case "sha1WithRSAEncryption":
|
||
c.md = l.md.sha1.create();
|
||
break;
|
||
case "md5WithRSAEncryption":
|
||
c.md = l.md.md5.create();
|
||
break;
|
||
case "sha256WithRSAEncryption":
|
||
c.md = l.md.sha256.create();
|
||
break;
|
||
case "sha384WithRSAEncryption":
|
||
c.md = l.md.sha384.create();
|
||
break;
|
||
case "sha512WithRSAEncryption":
|
||
c.md = l.md.sha512.create();
|
||
break;
|
||
case "RSASSA-PSS":
|
||
c.md = l.md.sha256.create()
|
||
}
|
||
}
|
||
if (null === c.md) {
|
||
var s = new Error("Could not compute certificate digest. Unknown signature OID.");
|
||
throw s.signatureOid = c.signatureOid,
|
||
s
|
||
}
|
||
var y = p.toDer(c.tbsCertificate);
|
||
c.md.update(y.getBytes())
|
||
}
|
||
var v = l.md.sha1.create();
|
||
c.issuer.getField = function(e) {
|
||
return a(c.issuer, e)
|
||
}
|
||
,
|
||
c.issuer.addField = function(e) {
|
||
i([e]),
|
||
c.issuer.attributes.push(e)
|
||
}
|
||
,
|
||
c.issuer.attributes = f.RDNAttributesAsArray(r.certIssuer, v),
|
||
r.certIssuerUniqueId && (c.issuer.uniqueId = r.certIssuerUniqueId),
|
||
c.issuer.hash = v.digest().toHex();
|
||
var m = l.md.sha1.create();
|
||
return c.subject.getField = function(e) {
|
||
return a(c.subject, e)
|
||
}
|
||
,
|
||
c.subject.addField = function(e) {
|
||
i([e]),
|
||
c.subject.attributes.push(e)
|
||
}
|
||
,
|
||
c.subject.attributes = f.RDNAttributesAsArray(r.certSubject, m),
|
||
r.certSubjectUniqueId && (c.subject.uniqueId = r.certSubjectUniqueId),
|
||
c.subject.hash = m.digest().toHex(),
|
||
r.certExtensions ? c.extensions = f.certificateExtensionsFromAsn1(r.certExtensions) : c.extensions = [],
|
||
c.publicKey = f.publicKeyFromAsn1(r.subjectPublicKeyInfo),
|
||
c
|
||
}
|
||
,
|
||
f.certificateExtensionsFromAsn1 = function(e) {
|
||
for (var t = [], r = 0; r < e.value.length; ++r)
|
||
for (var a = e.value[r], n = 0; n < a.value.length; ++n)
|
||
t.push(f.certificateExtensionFromAsn1(a.value[n]));
|
||
return t
|
||
}
|
||
,
|
||
f.certificateExtensionFromAsn1 = function(e) {
|
||
var t = {};
|
||
if (t.id = p.derToOid(e.value[0].value),
|
||
t.critical = !1,
|
||
e.value[1].type === p.Type.BOOLEAN ? (t.critical = 0 !== e.value[1].value.charCodeAt(0),
|
||
t.value = e.value[2].value) : t.value = e.value[1].value,
|
||
t.id in h)
|
||
if (t.name = h[t.id],
|
||
"keyUsage" === t.name) {
|
||
var r = p.fromDer(t.value)
|
||
, a = 0
|
||
, n = 0;
|
||
r.value.length > 1 && (a = r.value.charCodeAt(1),
|
||
n = r.value.length > 2 ? r.value.charCodeAt(2) : 0),
|
||
t.digitalSignature = 128 == (128 & a),
|
||
t.nonRepudiation = 64 == (64 & a),
|
||
t.keyEncipherment = 32 == (32 & a),
|
||
t.dataEncipherment = 16 == (16 & a),
|
||
t.keyAgreement = 8 == (8 & a),
|
||
t.keyCertSign = 4 == (4 & a),
|
||
t.cRLSign = 2 == (2 & a),
|
||
t.encipherOnly = 1 == (1 & a),
|
||
t.decipherOnly = 128 == (128 & n)
|
||
} else if ("basicConstraints" === t.name) {
|
||
var r = p.fromDer(t.value);
|
||
r.value.length > 0 && r.value[0].type === p.Type.BOOLEAN ? t.cA = 0 !== r.value[0].value.charCodeAt(0) : t.cA = !1;
|
||
var i = null;
|
||
r.value.length > 0 && r.value[0].type === p.Type.INTEGER ? i = r.value[0].value : r.value.length > 1 && (i = r.value[1].value),
|
||
null !== i && (t.pathLenConstraint = p.derToInteger(i))
|
||
} else if ("extKeyUsage" === t.name)
|
||
for (var r = p.fromDer(t.value), s = 0; s < r.value.length; ++s) {
|
||
var o = p.derToOid(r.value[s].value);
|
||
o in h ? t[h[o]] = !0 : t[o] = !0
|
||
}
|
||
else if ("nsCertType" === t.name) {
|
||
var r = p.fromDer(t.value)
|
||
, a = 0;
|
||
r.value.length > 1 && (a = r.value.charCodeAt(1)),
|
||
t.client = 128 == (128 & a),
|
||
t.server = 64 == (64 & a),
|
||
t.email = 32 == (32 & a),
|
||
t.objsign = 16 == (16 & a),
|
||
t.reserved = 8 == (8 & a),
|
||
t.sslCA = 4 == (4 & a),
|
||
t.emailCA = 2 == (2 & a),
|
||
t.objCA = 1 == (1 & a)
|
||
} else if ("subjectAltName" === t.name || "issuerAltName" === t.name) {
|
||
t.altNames = [];
|
||
for (var c, r = p.fromDer(t.value), u = 0; u < r.value.length; ++u) {
|
||
c = r.value[u];
|
||
var f = {
|
||
type: c.type,
|
||
value: c.value
|
||
};
|
||
switch (t.altNames.push(f),
|
||
c.type) {
|
||
case 1:
|
||
case 2:
|
||
case 6:
|
||
break;
|
||
case 7:
|
||
f.ip = l.util.bytesToIP(c.value);
|
||
break;
|
||
case 8:
|
||
f.oid = p.derToOid(c.value)
|
||
}
|
||
}
|
||
} else if ("subjectKeyIdentifier" === t.name) {
|
||
var r = p.fromDer(t.value);
|
||
t.subjectKeyIdentifier = l.util.bytesToHex(r.value)
|
||
}
|
||
return t
|
||
}
|
||
,
|
||
f.certificationRequestFromAsn1 = function(e, t) {
|
||
var r = {}
|
||
, n = [];
|
||
if (!p.validate(e, C, r, n)) {
|
||
var s = new Error("Cannot read PKCS#10 certificate request. ASN.1 object is not a PKCS#10 CertificationRequest.");
|
||
throw s.errors = n,
|
||
s
|
||
}
|
||
var o = p.derToOid(r.publicKeyOid);
|
||
if (o !== f.oids.rsaEncryption)
|
||
throw new Error("Cannot read public key. OID is not RSA.");
|
||
var c = f.createCertificationRequest();
|
||
if (c.version = r.csrVersion ? r.csrVersion.charCodeAt(0) : 0,
|
||
c.signatureOid = l.asn1.derToOid(r.csrSignatureOid),
|
||
c.signatureParameters = E(c.signatureOid, r.csrSignatureParams, !0),
|
||
c.siginfo.algorithmOid = l.asn1.derToOid(r.csrSignatureOid),
|
||
c.siginfo.parameters = E(c.siginfo.algorithmOid, r.csrSignatureParams, !1),
|
||
c.signature = r.csrSignature,
|
||
c.certificationRequestInfo = r.certificationRequestInfo,
|
||
t) {
|
||
if (c.md = null,
|
||
c.signatureOid in h) {
|
||
var o = h[c.signatureOid];
|
||
switch (o) {
|
||
case "sha1WithRSAEncryption":
|
||
c.md = l.md.sha1.create();
|
||
break;
|
||
case "md5WithRSAEncryption":
|
||
c.md = l.md.md5.create();
|
||
break;
|
||
case "sha256WithRSAEncryption":
|
||
c.md = l.md.sha256.create();
|
||
break;
|
||
case "sha384WithRSAEncryption":
|
||
c.md = l.md.sha384.create();
|
||
break;
|
||
case "sha512WithRSAEncryption":
|
||
c.md = l.md.sha512.create();
|
||
break;
|
||
case "RSASSA-PSS":
|
||
c.md = l.md.sha256.create()
|
||
}
|
||
}
|
||
if (null === c.md) {
|
||
var s = new Error("Could not compute certification request digest. Unknown signature OID.");
|
||
throw s.signatureOid = c.signatureOid,
|
||
s
|
||
}
|
||
var u = p.toDer(c.certificationRequestInfo);
|
||
c.md.update(u.getBytes())
|
||
}
|
||
var d = l.md.sha1.create();
|
||
return c.subject.getField = function(e) {
|
||
return a(c.subject, e)
|
||
}
|
||
,
|
||
c.subject.addField = function(e) {
|
||
i([e]),
|
||
c.subject.attributes.push(e)
|
||
}
|
||
,
|
||
c.subject.attributes = f.RDNAttributesAsArray(r.certificationRequestInfoSubject, d),
|
||
c.subject.hash = d.digest().toHex(),
|
||
c.publicKey = f.publicKeyFromAsn1(r.subjectPublicKeyInfo),
|
||
c.getAttribute = function(e) {
|
||
return a(c, e)
|
||
}
|
||
,
|
||
c.addAttribute = function(e) {
|
||
i([e]),
|
||
c.attributes.push(e)
|
||
}
|
||
,
|
||
c.attributes = f.CRIAttributesAsArray(r.certificationRequestInfoAttributes || []),
|
||
c
|
||
}
|
||
,
|
||
f.createCertificationRequest = function() {
|
||
var e = {};
|
||
return e.version = 0,
|
||
e.signatureOid = null,
|
||
e.signature = null,
|
||
e.siginfo = {},
|
||
e.siginfo.algorithmOid = null,
|
||
e.subject = {},
|
||
e.subject.getField = function(t) {
|
||
return a(e.subject, t)
|
||
}
|
||
,
|
||
e.subject.addField = function(t) {
|
||
i([t]),
|
||
e.subject.attributes.push(t)
|
||
}
|
||
,
|
||
e.subject.attributes = [],
|
||
e.subject.hash = null,
|
||
e.publicKey = null,
|
||
e.attributes = [],
|
||
e.getAttribute = function(t) {
|
||
return a(e, t)
|
||
}
|
||
,
|
||
e.addAttribute = function(t) {
|
||
i([t]),
|
||
e.attributes.push(t)
|
||
}
|
||
,
|
||
e.md = null,
|
||
e.setSubject = function(t) {
|
||
i(t),
|
||
e.subject.attributes = t,
|
||
e.subject.hash = null
|
||
}
|
||
,
|
||
e.setAttributes = function(t) {
|
||
i(t),
|
||
e.attributes = t
|
||
}
|
||
,
|
||
e.sign = function(t, r) {
|
||
e.md = r || l.md.sha1.create();
|
||
var a = h[e.md.algorithm + "WithRSAEncryption"];
|
||
if (!a) {
|
||
var n = new Error("Could not compute certification request digest. Unknown message digest algorithm OID.");
|
||
throw n.algorithm = e.md.algorithm,
|
||
n
|
||
}
|
||
e.signatureOid = e.siginfo.algorithmOid = a,
|
||
e.certificationRequestInfo = f.getCertificationRequestInfo(e);
|
||
var i = p.toDer(e.certificationRequestInfo);
|
||
e.md.update(i.getBytes()),
|
||
e.signature = t.sign(e.md)
|
||
}
|
||
,
|
||
e.verify = function() {
|
||
var t = !1
|
||
, r = e.md;
|
||
if (null === r) {
|
||
if (e.signatureOid in h) {
|
||
switch (h[e.signatureOid]) {
|
||
case "sha1WithRSAEncryption":
|
||
r = l.md.sha1.create();
|
||
break;
|
||
case "md5WithRSAEncryption":
|
||
r = l.md.md5.create();
|
||
break;
|
||
case "sha256WithRSAEncryption":
|
||
r = l.md.sha256.create();
|
||
break;
|
||
case "sha384WithRSAEncryption":
|
||
r = l.md.sha384.create();
|
||
break;
|
||
case "sha512WithRSAEncryption":
|
||
r = l.md.sha512.create();
|
||
break;
|
||
case "RSASSA-PSS":
|
||
r = l.md.sha256.create()
|
||
}
|
||
}
|
||
if (null === r) {
|
||
var a = new Error("Could not compute certification request digest. Unknown signature OID.");
|
||
throw a.signatureOid = e.signatureOid,
|
||
a
|
||
}
|
||
var n = e.certificationRequestInfo || f.getCertificationRequestInfo(e)
|
||
, i = p.toDer(n);
|
||
r.update(i.getBytes())
|
||
}
|
||
if (null !== r) {
|
||
var s;
|
||
switch (e.signatureOid) {
|
||
case h.sha1WithRSAEncryption:
|
||
break;
|
||
case h["RSASSA-PSS"]:
|
||
var o, c;
|
||
if (void 0 === (o = h[e.signatureParameters.mgf.hash.algorithmOid]) || void 0 === l.md[o]) {
|
||
var a = new Error("Unsupported MGF hash function.");
|
||
throw a.oid = e.signatureParameters.mgf.hash.algorithmOid,
|
||
a.name = o,
|
||
a
|
||
}
|
||
if (void 0 === (c = h[e.signatureParameters.mgf.algorithmOid]) || void 0 === l.mgf[c]) {
|
||
var a = new Error("Unsupported MGF function.");
|
||
throw a.oid = e.signatureParameters.mgf.algorithmOid,
|
||
a.name = c,
|
||
a
|
||
}
|
||
if (c = l.mgf[c].create(l.md[o].create()),
|
||
void 0 === (o = h[e.signatureParameters.hash.algorithmOid]) || void 0 === l.md[o]) {
|
||
var a = new Error("Unsupported RSASSA-PSS hash function.");
|
||
throw a.oid = e.signatureParameters.hash.algorithmOid,
|
||
a.name = o,
|
||
a
|
||
}
|
||
s = l.pss.create(l.md[o].create(), c, e.signatureParameters.saltLength)
|
||
}
|
||
t = e.publicKey.verify(r.digest().getBytes(), e.signature, s)
|
||
}
|
||
return t
|
||
}
|
||
,
|
||
e
|
||
}
|
||
;
|
||
const S = new Date("1950-01-01T00:00:00Z")
|
||
, T = new Date("2050-01-01T00:00:00Z");
|
||
f.getTBSCertificate = function(e) {
|
||
var t = u(e.validity.notBefore)
|
||
, r = u(e.validity.notAfter)
|
||
, a = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.CONTEXT_SPECIFIC, 0, !0, [p.create(p.Class.UNIVERSAL, p.Type.INTEGER, !1, p.integerToDer(e.version).getBytes())]), p.create(p.Class.UNIVERSAL, p.Type.INTEGER, !1, l.util.hexToBytes(e.serialNumber)), p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(e.siginfo.algorithmOid).getBytes()), o(e.siginfo.algorithmOid, e.siginfo.parameters)]), n(e.issuer), p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [t, r]), n(e.subject), f.publicKeyToAsn1(e.publicKey)]);
|
||
return e.issuer.uniqueId && a.value.push(p.create(p.Class.CONTEXT_SPECIFIC, 1, !0, [p.create(p.Class.UNIVERSAL, p.Type.BITSTRING, !1, String.fromCharCode(0) + e.issuer.uniqueId)])),
|
||
e.subject.uniqueId && a.value.push(p.create(p.Class.CONTEXT_SPECIFIC, 2, !0, [p.create(p.Class.UNIVERSAL, p.Type.BITSTRING, !1, String.fromCharCode(0) + e.subject.uniqueId)])),
|
||
e.extensions.length > 0 && a.value.push(f.certificateExtensionsToAsn1(e.extensions)),
|
||
a
|
||
}
|
||
,
|
||
f.getCertificationRequestInfo = function(e) {
|
||
return p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.INTEGER, !1, p.integerToDer(e.version).getBytes()), n(e.subject), f.publicKeyToAsn1(e.publicKey), c(e)])
|
||
}
|
||
,
|
||
f.distinguishedNameToAsn1 = function(e) {
|
||
return n(e)
|
||
}
|
||
,
|
||
f.certificateToAsn1 = function(e) {
|
||
var t = e.tbsCertificate || f.getTBSCertificate(e);
|
||
return p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [t, p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(e.signatureOid).getBytes()), o(e.signatureOid, e.signatureParameters)]), p.create(p.Class.UNIVERSAL, p.Type.BITSTRING, !1, String.fromCharCode(0) + e.signature)])
|
||
}
|
||
,
|
||
f.certificateExtensionsToAsn1 = function(e) {
|
||
var t = p.create(p.Class.CONTEXT_SPECIFIC, 3, !0, [])
|
||
, r = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []);
|
||
t.value.push(r);
|
||
for (var a = 0; a < e.length; ++a)
|
||
r.value.push(f.certificateExtensionToAsn1(e[a]));
|
||
return t
|
||
}
|
||
,
|
||
f.certificateExtensionToAsn1 = function(e) {
|
||
var t = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []);
|
||
t.value.push(p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(e.id).getBytes())),
|
||
e.critical && t.value.push(p.create(p.Class.UNIVERSAL, p.Type.BOOLEAN, !1, String.fromCharCode(255)));
|
||
var r = e.value;
|
||
return "string" != typeof e.value && (r = p.toDer(r).getBytes()),
|
||
t.value.push(p.create(p.Class.UNIVERSAL, p.Type.OCTETSTRING, !1, r)),
|
||
t
|
||
}
|
||
,
|
||
f.certificationRequestToAsn1 = function(e) {
|
||
var t = e.certificationRequestInfo || f.getCertificationRequestInfo(e);
|
||
return p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [t, p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(e.signatureOid).getBytes()), o(e.signatureOid, e.signatureParameters)]), p.create(p.Class.UNIVERSAL, p.Type.BITSTRING, !1, String.fromCharCode(0) + e.signature)])
|
||
}
|
||
,
|
||
f.createCaStore = function(e) {
|
||
function t(e) {
|
||
return r(e),
|
||
a.certs[e.hash] || null
|
||
}
|
||
function r(e) {
|
||
if (!e.hash) {
|
||
var t = l.md.sha1.create();
|
||
e.attributes = f.RDNAttributesAsArray(n(e), t),
|
||
e.hash = t.digest().toHex()
|
||
}
|
||
}
|
||
var a = {
|
||
certs: {}
|
||
};
|
||
if (a.getIssuer = function(e) {
|
||
return t(e.issuer)
|
||
}
|
||
,
|
||
a.addCertificate = function(e) {
|
||
if ("string" == typeof e && (e = l.pki.certificateFromPem(e)),
|
||
r(e.subject),
|
||
!a.hasCertificate(e))
|
||
if (e.subject.hash in a.certs) {
|
||
var t = a.certs[e.subject.hash];
|
||
l.util.isArray(t) || (t = [t]),
|
||
t.push(e),
|
||
a.certs[e.subject.hash] = t
|
||
} else
|
||
a.certs[e.subject.hash] = e
|
||
}
|
||
,
|
||
a.hasCertificate = function(e) {
|
||
"string" == typeof e && (e = l.pki.certificateFromPem(e));
|
||
var r = t(e.subject);
|
||
if (!r)
|
||
return !1;
|
||
l.util.isArray(r) || (r = [r]);
|
||
for (var a = p.toDer(f.certificateToAsn1(e)).getBytes(), n = 0; n < r.length; ++n) {
|
||
if (a === p.toDer(f.certificateToAsn1(r[n])).getBytes())
|
||
return !0
|
||
}
|
||
return !1
|
||
}
|
||
,
|
||
a.listAllCertificates = function() {
|
||
var e = [];
|
||
for (var t in a.certs)
|
||
if (a.certs.hasOwnProperty(t)) {
|
||
var r = a.certs[t];
|
||
if (l.util.isArray(r))
|
||
for (var n = 0; n < r.length; ++n)
|
||
e.push(r[n]);
|
||
else
|
||
e.push(r)
|
||
}
|
||
return e
|
||
}
|
||
,
|
||
a.removeCertificate = function(e) {
|
||
var n;
|
||
if ("string" == typeof e && (e = l.pki.certificateFromPem(e)),
|
||
r(e.subject),
|
||
!a.hasCertificate(e))
|
||
return null;
|
||
var i = t(e.subject);
|
||
if (!l.util.isArray(i))
|
||
return n = a.certs[e.subject.hash],
|
||
delete a.certs[e.subject.hash],
|
||
n;
|
||
for (var s = p.toDer(f.certificateToAsn1(e)).getBytes(), o = 0; o < i.length; ++o) {
|
||
s === p.toDer(f.certificateToAsn1(i[o])).getBytes() && (n = i[o],
|
||
i.splice(o, 1))
|
||
}
|
||
return 0 === i.length && delete a.certs[e.subject.hash],
|
||
n
|
||
}
|
||
,
|
||
e)
|
||
for (var i = 0; i < e.length; ++i) {
|
||
var s = e[i];
|
||
a.addCertificate(s)
|
||
}
|
||
return a
|
||
}
|
||
,
|
||
f.certificateError = {
|
||
bad_certificate: "forge.pki.BadCertificate",
|
||
unsupported_certificate: "forge.pki.UnsupportedCertificate",
|
||
certificate_revoked: "forge.pki.CertificateRevoked",
|
||
certificate_expired: "forge.pki.CertificateExpired",
|
||
certificate_unknown: "forge.pki.CertificateUnknown",
|
||
unknown_ca: "forge.pki.UnknownCertificateAuthority"
|
||
},
|
||
f.verifyCertificateChain = function(e, t, r) {
|
||
"function" == typeof r && (r = {
|
||
verify: r
|
||
}),
|
||
r = r || {},
|
||
t = t.slice(0);
|
||
var a = t.slice(0)
|
||
, n = r.validityCheckDate;
|
||
void 0 === n && (n = new Date);
|
||
var i = !0
|
||
, s = null
|
||
, o = 0;
|
||
do {
|
||
var c = t.shift()
|
||
, u = null
|
||
, p = !1;
|
||
if (n && (n < c.validity.notBefore || n > c.validity.notAfter) && (s = {
|
||
message: "Certificate is not valid yet or has expired.",
|
||
error: f.certificateError.certificate_expired,
|
||
notBefore: c.validity.notBefore,
|
||
notAfter: c.validity.notAfter,
|
||
now: n
|
||
}),
|
||
null === s) {
|
||
if (u = t[0] || e.getIssuer(c),
|
||
null === u && c.isIssuer(c) && (p = !0,
|
||
u = c),
|
||
u) {
|
||
var h = u;
|
||
l.util.isArray(h) || (h = [h]);
|
||
for (var d = !1; !d && h.length > 0; ) {
|
||
u = h.shift();
|
||
try {
|
||
d = u.verify(c)
|
||
} catch (e) {}
|
||
}
|
||
d || (s = {
|
||
message: "Certificate signature is invalid.",
|
||
error: f.certificateError.bad_certificate
|
||
})
|
||
}
|
||
null !== s || u && !p || e.hasCertificate(c) || (s = {
|
||
message: "Certificate is not trusted.",
|
||
error: f.certificateError.unknown_ca
|
||
})
|
||
}
|
||
if (null === s && u && !c.isIssuer(u) && (s = {
|
||
message: "Certificate issuer is invalid.",
|
||
error: f.certificateError.bad_certificate
|
||
}),
|
||
null === s)
|
||
for (var y = {
|
||
keyUsage: !0,
|
||
basicConstraints: !0
|
||
}, g = 0; null === s && g < c.extensions.length; ++g) {
|
||
var v = c.extensions[g];
|
||
!v.critical || v.name in y || (s = {
|
||
message: "Certificate has an unsupported critical extension.",
|
||
error: f.certificateError.unsupported_certificate
|
||
})
|
||
}
|
||
if (null === s && (!i || 0 === t.length && (!u || p))) {
|
||
var m = c.getExtension("basicConstraints")
|
||
, C = c.getExtension("keyUsage");
|
||
if (null !== C && (C.keyCertSign && null !== m || (s = {
|
||
message: "Certificate keyUsage or basicConstraints conflict or indicate that the certificate is not a CA. If the certificate is the only one in the chain or isn't the first then the certificate must be a valid CA.",
|
||
error: f.certificateError.bad_certificate
|
||
})),
|
||
null !== s || null === m || m.cA || (s = {
|
||
message: "Certificate basicConstraints indicates the certificate is not a CA.",
|
||
error: f.certificateError.bad_certificate
|
||
}),
|
||
null === s && null !== C && "pathLenConstraint"in m) {
|
||
o - 1 > m.pathLenConstraint && (s = {
|
||
message: "Certificate basicConstraints pathLenConstraint violated.",
|
||
error: f.certificateError.bad_certificate
|
||
})
|
||
}
|
||
}
|
||
var E = null === s || s.error
|
||
, S = r.verify ? r.verify(E, o, a) : E;
|
||
if (!0 !== S)
|
||
throw !0 === E && (s = {
|
||
message: "The application rejected the certificate.",
|
||
error: f.certificateError.bad_certificate
|
||
}),
|
||
(S || 0 === S) && ("object" != typeof S || l.util.isArray(S) ? "string" == typeof S && (s.error = S) : (S.message && (s.message = S.message),
|
||
S.error && (s.error = S.error))),
|
||
s;
|
||
s = null,
|
||
i = !1,
|
||
++o
|
||
} while (t.length > 0);
|
||
return !0
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(2),
|
||
r(1),
|
||
(e.exports = a.pss = a.pss || {}).create = function(e) {
|
||
3 === arguments.length && (e = {
|
||
md: arguments[0],
|
||
mgf: arguments[1],
|
||
saltLength: arguments[2]
|
||
});
|
||
var t = e.md
|
||
, r = e.mgf
|
||
, n = t.digestLength
|
||
, i = e.salt || null;
|
||
"string" == typeof i && (i = a.util.createBuffer(i));
|
||
var s;
|
||
if ("saltLength"in e)
|
||
s = e.saltLength;
|
||
else {
|
||
if (null === i)
|
||
throw new Error("Salt length not specified or specific salt not given.");
|
||
s = i.length()
|
||
}
|
||
if (null !== i && i.length() !== s)
|
||
throw new Error("Given salt length does not match length of given salt.");
|
||
var o = e.prng || a.random
|
||
, c = {};
|
||
return c.encode = function(e, c) {
|
||
var u, l = c - 1, p = Math.ceil(l / 8), f = e.digest().getBytes();
|
||
if (p < n + s + 2)
|
||
throw new Error("Message is too long to encrypt.");
|
||
var h;
|
||
h = null === i ? o.getBytesSync(s) : i.bytes();
|
||
var d = new a.util.ByteBuffer;
|
||
d.fillWithByte(0, 8),
|
||
d.putBytes(f),
|
||
d.putBytes(h),
|
||
t.start(),
|
||
t.update(d.getBytes());
|
||
var y = t.digest().getBytes()
|
||
, g = new a.util.ByteBuffer;
|
||
g.fillWithByte(0, p - s - n - 2),
|
||
g.putByte(1),
|
||
g.putBytes(h);
|
||
var v = g.getBytes()
|
||
, m = p - n - 1
|
||
, C = r.generate(y, m)
|
||
, E = "";
|
||
for (u = 0; u < m; u++)
|
||
E += String.fromCharCode(v.charCodeAt(u) ^ C.charCodeAt(u));
|
||
var S = 65280 >> 8 * p - l & 255;
|
||
return (E = String.fromCharCode(E.charCodeAt(0) & ~S) + E.substr(1)) + y + String.fromCharCode(188)
|
||
}
|
||
,
|
||
c.verify = function(e, i, o) {
|
||
var c, u = o - 1, l = Math.ceil(u / 8);
|
||
if (i = i.substr(-l),
|
||
l < n + s + 2)
|
||
throw new Error("Inconsistent parameters to PSS signature verification.");
|
||
if (188 !== i.charCodeAt(l - 1))
|
||
throw new Error("Encoded message does not end in 0xBC.");
|
||
var p = l - n - 1
|
||
, f = i.substr(0, p)
|
||
, h = i.substr(p, n)
|
||
, d = 65280 >> 8 * l - u & 255;
|
||
if (0 != (f.charCodeAt(0) & d))
|
||
throw new Error("Bits beyond keysize not zero as expected.");
|
||
var y = r.generate(h, p)
|
||
, g = "";
|
||
for (c = 0; c < p; c++)
|
||
g += String.fromCharCode(f.charCodeAt(c) ^ y.charCodeAt(c));
|
||
g = String.fromCharCode(g.charCodeAt(0) & ~d) + g.substr(1);
|
||
var v = l - n - s - 2;
|
||
for (c = 0; c < v; c++)
|
||
if (0 !== g.charCodeAt(c))
|
||
throw new Error("Leftmost octets not zero as expected");
|
||
if (1 !== g.charCodeAt(v))
|
||
throw new Error("Inconsistent PSS signature, 0x01 marker not found");
|
||
var m = g.substr(-s)
|
||
, C = new a.util.ByteBuffer;
|
||
return C.fillWithByte(0, 8),
|
||
C.putBytes(e),
|
||
C.putBytes(m),
|
||
t.start(),
|
||
t.update(C.getBytes()),
|
||
h === t.digest().getBytes()
|
||
}
|
||
,
|
||
c
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e) {
|
||
if ("string" == typeof e && (e = s.util.createBuffer(e)),
|
||
s.util.isArray(e) && e.length > 4) {
|
||
var t = e;
|
||
e = s.util.createBuffer();
|
||
for (var r = 0; r < t.length; ++r)
|
||
e.putByte(t[r])
|
||
}
|
||
return s.util.isArray(e) || (e = [e.getInt32(), e.getInt32(), e.getInt32(), e.getInt32()]),
|
||
e
|
||
}
|
||
function n(e) {
|
||
e[e.length - 1] = e[e.length - 1] + 1 & 4294967295
|
||
}
|
||
function i(e) {
|
||
return [e / 4294967296 | 0, 4294967295 & e]
|
||
}
|
||
var s = r(0);
|
||
r(1),
|
||
s.cipher = s.cipher || {};
|
||
var o = e.exports = s.cipher.modes = s.cipher.modes || {};
|
||
o.ecb = function(e) {
|
||
e = e || {},
|
||
this.name = "ECB",
|
||
this.cipher = e.cipher,
|
||
this.blockSize = e.blockSize || 16,
|
||
this._ints = this.blockSize / 4,
|
||
this._inBlock = new Array(this._ints),
|
||
this._outBlock = new Array(this._ints)
|
||
}
|
||
,
|
||
o.ecb.prototype.start = function(e) {}
|
||
,
|
||
o.ecb.prototype.encrypt = function(e, t, r) {
|
||
if (e.length() < this.blockSize && !(r && e.length() > 0))
|
||
return !0;
|
||
for (var a = 0; a < this._ints; ++a)
|
||
this._inBlock[a] = e.getInt32();
|
||
this.cipher.encrypt(this._inBlock, this._outBlock);
|
||
for (var a = 0; a < this._ints; ++a)
|
||
t.putInt32(this._outBlock[a])
|
||
}
|
||
,
|
||
o.ecb.prototype.decrypt = function(e, t, r) {
|
||
if (e.length() < this.blockSize && !(r && e.length() > 0))
|
||
return !0;
|
||
for (var a = 0; a < this._ints; ++a)
|
||
this._inBlock[a] = e.getInt32();
|
||
this.cipher.decrypt(this._inBlock, this._outBlock);
|
||
for (var a = 0; a < this._ints; ++a)
|
||
t.putInt32(this._outBlock[a])
|
||
}
|
||
,
|
||
o.ecb.prototype.pad = function(e, t) {
|
||
var r = e.length() === this.blockSize ? this.blockSize : this.blockSize - e.length();
|
||
return e.fillWithByte(r, r),
|
||
!0
|
||
}
|
||
,
|
||
o.ecb.prototype.unpad = function(e, t) {
|
||
if (t.overflow > 0)
|
||
return !1;
|
||
var r = e.length()
|
||
, a = e.at(r - 1);
|
||
return !(a > this.blockSize << 2) && (e.truncate(a),
|
||
!0)
|
||
}
|
||
,
|
||
o.cbc = function(e) {
|
||
e = e || {},
|
||
this.name = "CBC",
|
||
this.cipher = e.cipher,
|
||
this.blockSize = e.blockSize || 16,
|
||
this._ints = this.blockSize / 4,
|
||
this._inBlock = new Array(this._ints),
|
||
this._outBlock = new Array(this._ints)
|
||
}
|
||
,
|
||
o.cbc.prototype.start = function(e) {
|
||
if (null === e.iv) {
|
||
if (!this._prev)
|
||
throw new Error("Invalid IV parameter.");
|
||
this._iv = this._prev.slice(0)
|
||
} else {
|
||
if (!("iv"in e))
|
||
throw new Error("Invalid IV parameter.");
|
||
this._iv = a(e.iv),
|
||
this._prev = this._iv.slice(0)
|
||
}
|
||
}
|
||
,
|
||
o.cbc.prototype.encrypt = function(e, t, r) {
|
||
if (e.length() < this.blockSize && !(r && e.length() > 0))
|
||
return !0;
|
||
for (var a = 0; a < this._ints; ++a)
|
||
this._inBlock[a] = this._prev[a] ^ e.getInt32();
|
||
this.cipher.encrypt(this._inBlock, this._outBlock);
|
||
for (var a = 0; a < this._ints; ++a)
|
||
t.putInt32(this._outBlock[a]);
|
||
this._prev = this._outBlock
|
||
}
|
||
,
|
||
o.cbc.prototype.decrypt = function(e, t, r) {
|
||
if (e.length() < this.blockSize && !(r && e.length() > 0))
|
||
return !0;
|
||
for (var a = 0; a < this._ints; ++a)
|
||
this._inBlock[a] = e.getInt32();
|
||
this.cipher.decrypt(this._inBlock, this._outBlock);
|
||
for (var a = 0; a < this._ints; ++a)
|
||
t.putInt32(this._prev[a] ^ this._outBlock[a]);
|
||
this._prev = this._inBlock.slice(0)
|
||
}
|
||
,
|
||
o.cbc.prototype.pad = function(e, t) {
|
||
var r = e.length() === this.blockSize ? this.blockSize : this.blockSize - e.length();
|
||
return e.fillWithByte(r, r),
|
||
!0
|
||
}
|
||
,
|
||
o.cbc.prototype.unpad = function(e, t) {
|
||
if (t.overflow > 0)
|
||
return !1;
|
||
var r = e.length()
|
||
, a = e.at(r - 1);
|
||
return !(a > this.blockSize << 2) && (e.truncate(a),
|
||
!0)
|
||
}
|
||
,
|
||
o.cfb = function(e) {
|
||
e = e || {},
|
||
this.name = "CFB",
|
||
this.cipher = e.cipher,
|
||
this.blockSize = e.blockSize || 16,
|
||
this._ints = this.blockSize / 4,
|
||
this._inBlock = null,
|
||
this._outBlock = new Array(this._ints),
|
||
this._partialBlock = new Array(this._ints),
|
||
this._partialOutput = s.util.createBuffer(),
|
||
this._partialBytes = 0
|
||
}
|
||
,
|
||
o.cfb.prototype.start = function(e) {
|
||
if (!("iv"in e))
|
||
throw new Error("Invalid IV parameter.");
|
||
this._iv = a(e.iv),
|
||
this._inBlock = this._iv.slice(0),
|
||
this._partialBytes = 0
|
||
}
|
||
,
|
||
o.cfb.prototype.encrypt = function(e, t, r) {
|
||
var a = e.length();
|
||
if (0 === a)
|
||
return !0;
|
||
if (this.cipher.encrypt(this._inBlock, this._outBlock),
|
||
0 === this._partialBytes && a >= this.blockSize)
|
||
for (var n = 0; n < this._ints; ++n)
|
||
this._inBlock[n] = e.getInt32() ^ this._outBlock[n],
|
||
t.putInt32(this._inBlock[n]);
|
||
else {
|
||
var i = (this.blockSize - a) % this.blockSize;
|
||
i > 0 && (i = this.blockSize - i),
|
||
this._partialOutput.clear();
|
||
for (var n = 0; n < this._ints; ++n)
|
||
this._partialBlock[n] = e.getInt32() ^ this._outBlock[n],
|
||
this._partialOutput.putInt32(this._partialBlock[n]);
|
||
if (i > 0)
|
||
e.read -= this.blockSize;
|
||
else
|
||
for (var n = 0; n < this._ints; ++n)
|
||
this._inBlock[n] = this._partialBlock[n];
|
||
if (this._partialBytes > 0 && this._partialOutput.getBytes(this._partialBytes),
|
||
i > 0 && !r)
|
||
return t.putBytes(this._partialOutput.getBytes(i - this._partialBytes)),
|
||
this._partialBytes = i,
|
||
!0;
|
||
t.putBytes(this._partialOutput.getBytes(a - this._partialBytes)),
|
||
this._partialBytes = 0
|
||
}
|
||
}
|
||
,
|
||
o.cfb.prototype.decrypt = function(e, t, r) {
|
||
var a = e.length();
|
||
if (0 === a)
|
||
return !0;
|
||
if (this.cipher.encrypt(this._inBlock, this._outBlock),
|
||
0 === this._partialBytes && a >= this.blockSize)
|
||
for (var n = 0; n < this._ints; ++n)
|
||
this._inBlock[n] = e.getInt32(),
|
||
t.putInt32(this._inBlock[n] ^ this._outBlock[n]);
|
||
else {
|
||
var i = (this.blockSize - a) % this.blockSize;
|
||
i > 0 && (i = this.blockSize - i),
|
||
this._partialOutput.clear();
|
||
for (var n = 0; n < this._ints; ++n)
|
||
this._partialBlock[n] = e.getInt32(),
|
||
this._partialOutput.putInt32(this._partialBlock[n] ^ this._outBlock[n]);
|
||
if (i > 0)
|
||
e.read -= this.blockSize;
|
||
else
|
||
for (var n = 0; n < this._ints; ++n)
|
||
this._inBlock[n] = this._partialBlock[n];
|
||
if (this._partialBytes > 0 && this._partialOutput.getBytes(this._partialBytes),
|
||
i > 0 && !r)
|
||
return t.putBytes(this._partialOutput.getBytes(i - this._partialBytes)),
|
||
this._partialBytes = i,
|
||
!0;
|
||
t.putBytes(this._partialOutput.getBytes(a - this._partialBytes)),
|
||
this._partialBytes = 0
|
||
}
|
||
}
|
||
,
|
||
o.ofb = function(e) {
|
||
e = e || {},
|
||
this.name = "OFB",
|
||
this.cipher = e.cipher,
|
||
this.blockSize = e.blockSize || 16,
|
||
this._ints = this.blockSize / 4,
|
||
this._inBlock = null,
|
||
this._outBlock = new Array(this._ints),
|
||
this._partialOutput = s.util.createBuffer(),
|
||
this._partialBytes = 0
|
||
}
|
||
,
|
||
o.ofb.prototype.start = function(e) {
|
||
if (!("iv"in e))
|
||
throw new Error("Invalid IV parameter.");
|
||
this._iv = a(e.iv),
|
||
this._inBlock = this._iv.slice(0),
|
||
this._partialBytes = 0
|
||
}
|
||
,
|
||
o.ofb.prototype.encrypt = function(e, t, r) {
|
||
var a = e.length();
|
||
if (0 === e.length())
|
||
return !0;
|
||
if (this.cipher.encrypt(this._inBlock, this._outBlock),
|
||
0 === this._partialBytes && a >= this.blockSize)
|
||
for (var n = 0; n < this._ints; ++n)
|
||
t.putInt32(e.getInt32() ^ this._outBlock[n]),
|
||
this._inBlock[n] = this._outBlock[n];
|
||
else {
|
||
var i = (this.blockSize - a) % this.blockSize;
|
||
i > 0 && (i = this.blockSize - i),
|
||
this._partialOutput.clear();
|
||
for (var n = 0; n < this._ints; ++n)
|
||
this._partialOutput.putInt32(e.getInt32() ^ this._outBlock[n]);
|
||
if (i > 0)
|
||
e.read -= this.blockSize;
|
||
else
|
||
for (var n = 0; n < this._ints; ++n)
|
||
this._inBlock[n] = this._outBlock[n];
|
||
if (this._partialBytes > 0 && this._partialOutput.getBytes(this._partialBytes),
|
||
i > 0 && !r)
|
||
return t.putBytes(this._partialOutput.getBytes(i - this._partialBytes)),
|
||
this._partialBytes = i,
|
||
!0;
|
||
t.putBytes(this._partialOutput.getBytes(a - this._partialBytes)),
|
||
this._partialBytes = 0
|
||
}
|
||
}
|
||
,
|
||
o.ofb.prototype.decrypt = o.ofb.prototype.encrypt,
|
||
o.ctr = function(e) {
|
||
e = e || {},
|
||
this.name = "CTR",
|
||
this.cipher = e.cipher,
|
||
this.blockSize = e.blockSize || 16,
|
||
this._ints = this.blockSize / 4,
|
||
this._inBlock = null,
|
||
this._outBlock = new Array(this._ints),
|
||
this._partialOutput = s.util.createBuffer(),
|
||
this._partialBytes = 0
|
||
}
|
||
,
|
||
o.ctr.prototype.start = function(e) {
|
||
if (!("iv"in e))
|
||
throw new Error("Invalid IV parameter.");
|
||
this._iv = a(e.iv),
|
||
this._inBlock = this._iv.slice(0),
|
||
this._partialBytes = 0
|
||
}
|
||
,
|
||
o.ctr.prototype.encrypt = function(e, t, r) {
|
||
var a = e.length();
|
||
if (0 === a)
|
||
return !0;
|
||
if (this.cipher.encrypt(this._inBlock, this._outBlock),
|
||
0 === this._partialBytes && a >= this.blockSize)
|
||
for (var i = 0; i < this._ints; ++i)
|
||
t.putInt32(e.getInt32() ^ this._outBlock[i]);
|
||
else {
|
||
var s = (this.blockSize - a) % this.blockSize;
|
||
s > 0 && (s = this.blockSize - s),
|
||
this._partialOutput.clear();
|
||
for (var i = 0; i < this._ints; ++i)
|
||
this._partialOutput.putInt32(e.getInt32() ^ this._outBlock[i]);
|
||
if (s > 0 && (e.read -= this.blockSize),
|
||
this._partialBytes > 0 && this._partialOutput.getBytes(this._partialBytes),
|
||
s > 0 && !r)
|
||
return t.putBytes(this._partialOutput.getBytes(s - this._partialBytes)),
|
||
this._partialBytes = s,
|
||
!0;
|
||
t.putBytes(this._partialOutput.getBytes(a - this._partialBytes)),
|
||
this._partialBytes = 0
|
||
}
|
||
n(this._inBlock)
|
||
}
|
||
,
|
||
o.ctr.prototype.decrypt = o.ctr.prototype.encrypt,
|
||
o.gcm = function(e) {
|
||
e = e || {},
|
||
this.name = "GCM",
|
||
this.cipher = e.cipher,
|
||
this.blockSize = e.blockSize || 16,
|
||
this._ints = this.blockSize / 4,
|
||
this._inBlock = new Array(this._ints),
|
||
this._outBlock = new Array(this._ints),
|
||
this._partialOutput = s.util.createBuffer(),
|
||
this._partialBytes = 0,
|
||
this._R = 3774873600
|
||
}
|
||
,
|
||
o.gcm.prototype.start = function(e) {
|
||
if (!("iv"in e))
|
||
throw new Error("Invalid IV parameter.");
|
||
var t = s.util.createBuffer(e.iv);
|
||
this._cipherLength = 0;
|
||
var r;
|
||
if (r = "additionalData"in e ? s.util.createBuffer(e.additionalData) : s.util.createBuffer(),
|
||
this._tagLength = "tagLength"in e ? e.tagLength : 128,
|
||
this._tag = null,
|
||
e.decrypt && (this._tag = s.util.createBuffer(e.tag).getBytes(),
|
||
this._tag.length !== this._tagLength / 8))
|
||
throw new Error("Authentication tag does not match tag length.");
|
||
this._hashBlock = new Array(this._ints),
|
||
this.tag = null,
|
||
this._hashSubkey = new Array(this._ints),
|
||
this.cipher.encrypt([0, 0, 0, 0], this._hashSubkey),
|
||
this.componentBits = 4,
|
||
this._m = this.generateHashTable(this._hashSubkey, this.componentBits);
|
||
var a = t.length();
|
||
if (12 === a)
|
||
this._j0 = [t.getInt32(), t.getInt32(), t.getInt32(), 1];
|
||
else {
|
||
for (this._j0 = [0, 0, 0, 0]; t.length() > 0; )
|
||
this._j0 = this.ghash(this._hashSubkey, this._j0, [t.getInt32(), t.getInt32(), t.getInt32(), t.getInt32()]);
|
||
this._j0 = this.ghash(this._hashSubkey, this._j0, [0, 0].concat(i(8 * a)))
|
||
}
|
||
this._inBlock = this._j0.slice(0),
|
||
n(this._inBlock),
|
||
this._partialBytes = 0,
|
||
r = s.util.createBuffer(r),
|
||
this._aDataLength = i(8 * r.length());
|
||
var o = r.length() % this.blockSize;
|
||
for (o && r.fillWithByte(0, this.blockSize - o),
|
||
this._s = [0, 0, 0, 0]; r.length() > 0; )
|
||
this._s = this.ghash(this._hashSubkey, this._s, [r.getInt32(), r.getInt32(), r.getInt32(), r.getInt32()])
|
||
}
|
||
,
|
||
o.gcm.prototype.encrypt = function(e, t, r) {
|
||
var a = e.length();
|
||
if (0 === a)
|
||
return !0;
|
||
if (this.cipher.encrypt(this._inBlock, this._outBlock),
|
||
0 === this._partialBytes && a >= this.blockSize) {
|
||
for (var i = 0; i < this._ints; ++i)
|
||
t.putInt32(this._outBlock[i] ^= e.getInt32());
|
||
this._cipherLength += this.blockSize
|
||
} else {
|
||
var s = (this.blockSize - a) % this.blockSize;
|
||
s > 0 && (s = this.blockSize - s),
|
||
this._partialOutput.clear();
|
||
for (var i = 0; i < this._ints; ++i)
|
||
this._partialOutput.putInt32(e.getInt32() ^ this._outBlock[i]);
|
||
if (s <= 0 || r) {
|
||
if (r) {
|
||
var o = a % this.blockSize;
|
||
this._cipherLength += o,
|
||
this._partialOutput.truncate(this.blockSize - o)
|
||
} else
|
||
this._cipherLength += this.blockSize;
|
||
for (var i = 0; i < this._ints; ++i)
|
||
this._outBlock[i] = this._partialOutput.getInt32();
|
||
this._partialOutput.read -= this.blockSize
|
||
}
|
||
if (this._partialBytes > 0 && this._partialOutput.getBytes(this._partialBytes),
|
||
s > 0 && !r)
|
||
return e.read -= this.blockSize,
|
||
t.putBytes(this._partialOutput.getBytes(s - this._partialBytes)),
|
||
this._partialBytes = s,
|
||
!0;
|
||
t.putBytes(this._partialOutput.getBytes(a - this._partialBytes)),
|
||
this._partialBytes = 0
|
||
}
|
||
this._s = this.ghash(this._hashSubkey, this._s, this._outBlock),
|
||
n(this._inBlock)
|
||
}
|
||
,
|
||
o.gcm.prototype.decrypt = function(e, t, r) {
|
||
var a = e.length();
|
||
if (a < this.blockSize && !(r && a > 0))
|
||
return !0;
|
||
this.cipher.encrypt(this._inBlock, this._outBlock),
|
||
n(this._inBlock),
|
||
this._hashBlock[0] = e.getInt32(),
|
||
this._hashBlock[1] = e.getInt32(),
|
||
this._hashBlock[2] = e.getInt32(),
|
||
this._hashBlock[3] = e.getInt32(),
|
||
this._s = this.ghash(this._hashSubkey, this._s, this._hashBlock);
|
||
for (var i = 0; i < this._ints; ++i)
|
||
t.putInt32(this._outBlock[i] ^ this._hashBlock[i]);
|
||
a < this.blockSize ? this._cipherLength += a % this.blockSize : this._cipherLength += this.blockSize
|
||
}
|
||
,
|
||
o.gcm.prototype.afterFinish = function(e, t) {
|
||
var r = !0;
|
||
t.decrypt && t.overflow && e.truncate(this.blockSize - t.overflow),
|
||
this.tag = s.util.createBuffer();
|
||
var a = this._aDataLength.concat(i(8 * this._cipherLength));
|
||
this._s = this.ghash(this._hashSubkey, this._s, a);
|
||
var n = [];
|
||
this.cipher.encrypt(this._j0, n);
|
||
for (var o = 0; o < this._ints; ++o)
|
||
this.tag.putInt32(this._s[o] ^ n[o]);
|
||
return this.tag.truncate(this.tag.length() % (this._tagLength / 8)),
|
||
t.decrypt && this.tag.bytes() !== this._tag && (r = !1),
|
||
r
|
||
}
|
||
,
|
||
o.gcm.prototype.multiply = function(e, t) {
|
||
for (var r = [0, 0, 0, 0], a = t.slice(0), n = 0; n < 128; ++n) {
|
||
e[n / 32 | 0] & 1 << 31 - n % 32 && (r[0] ^= a[0],
|
||
r[1] ^= a[1],
|
||
r[2] ^= a[2],
|
||
r[3] ^= a[3]),
|
||
this.pow(a, a)
|
||
}
|
||
return r
|
||
}
|
||
,
|
||
o.gcm.prototype.pow = function(e, t) {
|
||
for (var r = 1 & e[3], a = 3; a > 0; --a)
|
||
t[a] = e[a] >>> 1 | (1 & e[a - 1]) << 31;
|
||
t[0] = e[0] >>> 1,
|
||
r && (t[0] ^= this._R)
|
||
}
|
||
,
|
||
o.gcm.prototype.tableMultiply = function(e) {
|
||
for (var t = [0, 0, 0, 0], r = 0; r < 32; ++r) {
|
||
var a = r / 8 | 0
|
||
, n = e[a] >>> 4 * (7 - r % 8) & 15
|
||
, i = this._m[r][n];
|
||
t[0] ^= i[0],
|
||
t[1] ^= i[1],
|
||
t[2] ^= i[2],
|
||
t[3] ^= i[3]
|
||
}
|
||
return t
|
||
}
|
||
,
|
||
o.gcm.prototype.ghash = function(e, t, r) {
|
||
return t[0] ^= r[0],
|
||
t[1] ^= r[1],
|
||
t[2] ^= r[2],
|
||
t[3] ^= r[3],
|
||
this.tableMultiply(t)
|
||
}
|
||
,
|
||
o.gcm.prototype.generateHashTable = function(e, t) {
|
||
for (var r = 8 / t, a = 4 * r, n = 16 * r, i = new Array(n), s = 0; s < n; ++s) {
|
||
var o = [0, 0, 0, 0]
|
||
, c = s / a | 0
|
||
, u = (a - 1 - s % a) * t;
|
||
o[c] = 1 << t - 1 << u,
|
||
i[s] = this.generateSubHashTable(this.multiply(o, e), t)
|
||
}
|
||
return i
|
||
}
|
||
,
|
||
o.gcm.prototype.generateSubHashTable = function(e, t) {
|
||
var r = 1 << t
|
||
, a = r >>> 1
|
||
, n = new Array(r);
|
||
n[a] = e.slice(0);
|
||
for (var i = a >>> 1; i > 0; )
|
||
this.pow(n[2 * i], n[i] = []),
|
||
i >>= 1;
|
||
for (i = 2; i < a; ) {
|
||
for (var s = 1; s < i; ++s) {
|
||
var o = n[i]
|
||
, c = n[s];
|
||
n[i + s] = [o[0] ^ c[0], o[1] ^ c[1], o[2] ^ c[2], o[3] ^ c[3]]
|
||
}
|
||
i *= 2
|
||
}
|
||
for (n[0] = [0, 0, 0, 0],
|
||
i = a + 1; i < r; ++i) {
|
||
var u = n[i ^ a];
|
||
n[i] = [e[0] ^ u[0], e[1] ^ u[1], e[2] ^ u[2], e[3] ^ u[3]]
|
||
}
|
||
return n
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(3),
|
||
r(8),
|
||
r(14),
|
||
r(7),
|
||
r(21),
|
||
r(2),
|
||
r(9),
|
||
r(1);
|
||
var n = function(e, t, r, n) {
|
||
var i = a.util.createBuffer()
|
||
, s = e.length >> 1
|
||
, o = s + (1 & e.length)
|
||
, c = e.substr(0, o)
|
||
, u = e.substr(s, o)
|
||
, l = a.util.createBuffer()
|
||
, p = a.hmac.create();
|
||
r = t + r;
|
||
var f = Math.ceil(n / 16)
|
||
, h = Math.ceil(n / 20);
|
||
p.start("MD5", c);
|
||
var d = a.util.createBuffer();
|
||
l.putBytes(r);
|
||
for (var y = 0; y < f; ++y)
|
||
p.start(null, null),
|
||
p.update(l.getBytes()),
|
||
l.putBuffer(p.digest()),
|
||
p.start(null, null),
|
||
p.update(l.bytes() + r),
|
||
d.putBuffer(p.digest());
|
||
p.start("SHA1", u);
|
||
var g = a.util.createBuffer();
|
||
l.clear(),
|
||
l.putBytes(r);
|
||
for (var y = 0; y < h; ++y)
|
||
p.start(null, null),
|
||
p.update(l.getBytes()),
|
||
l.putBuffer(p.digest()),
|
||
p.start(null, null),
|
||
p.update(l.bytes() + r),
|
||
g.putBuffer(p.digest());
|
||
return i.putBytes(a.util.xorBytes(d.getBytes(), g.getBytes(), n)),
|
||
i
|
||
}
|
||
, i = function(e, t, r) {
|
||
var n = a.hmac.create();
|
||
n.start("SHA1", e);
|
||
var i = a.util.createBuffer();
|
||
return i.putInt32(t[0]),
|
||
i.putInt32(t[1]),
|
||
i.putByte(r.type),
|
||
i.putByte(r.version.major),
|
||
i.putByte(r.version.minor),
|
||
i.putInt16(r.length),
|
||
i.putBytes(r.fragment.bytes()),
|
||
n.update(i.getBytes()),
|
||
n.digest().getBytes()
|
||
}
|
||
, s = function(e, t, r) {
|
||
var n = !1;
|
||
try {
|
||
var i = e.deflate(t.fragment.getBytes());
|
||
t.fragment = a.util.createBuffer(i),
|
||
t.length = i.length,
|
||
n = !0
|
||
} catch (e) {}
|
||
return n
|
||
}
|
||
, o = function(e, t, r) {
|
||
var n = !1;
|
||
try {
|
||
var i = e.inflate(t.fragment.getBytes());
|
||
t.fragment = a.util.createBuffer(i),
|
||
t.length = i.length,
|
||
n = !0
|
||
} catch (e) {}
|
||
return n
|
||
}
|
||
, c = function(e, t) {
|
||
var r = 0;
|
||
switch (t) {
|
||
case 1:
|
||
r = e.getByte();
|
||
break;
|
||
case 2:
|
||
r = e.getInt16();
|
||
break;
|
||
case 3:
|
||
r = e.getInt24();
|
||
break;
|
||
case 4:
|
||
r = e.getInt32()
|
||
}
|
||
return a.util.createBuffer(e.getBytes(r))
|
||
}
|
||
, u = function(e, t, r) {
|
||
e.putInt(r.length(), t << 3),
|
||
e.putBuffer(r)
|
||
}
|
||
, l = {};
|
||
l.Versions = {
|
||
TLS_1_0: {
|
||
major: 3,
|
||
minor: 1
|
||
},
|
||
TLS_1_1: {
|
||
major: 3,
|
||
minor: 2
|
||
},
|
||
TLS_1_2: {
|
||
major: 3,
|
||
minor: 3
|
||
}
|
||
},
|
||
l.SupportedVersions = [l.Versions.TLS_1_1, l.Versions.TLS_1_0],
|
||
l.Version = l.SupportedVersions[0],
|
||
l.MaxFragment = 15360,
|
||
l.ConnectionEnd = {
|
||
server: 0,
|
||
client: 1
|
||
},
|
||
l.PRFAlgorithm = {
|
||
tls_prf_sha256: 0
|
||
},
|
||
l.BulkCipherAlgorithm = {
|
||
none: null,
|
||
rc4: 0,
|
||
des3: 1,
|
||
aes: 2
|
||
},
|
||
l.CipherType = {
|
||
stream: 0,
|
||
block: 1,
|
||
aead: 2
|
||
},
|
||
l.MACAlgorithm = {
|
||
none: null,
|
||
hmac_md5: 0,
|
||
hmac_sha1: 1,
|
||
hmac_sha256: 2,
|
||
hmac_sha384: 3,
|
||
hmac_sha512: 4
|
||
},
|
||
l.CompressionMethod = {
|
||
none: 0,
|
||
deflate: 1
|
||
},
|
||
l.ContentType = {
|
||
change_cipher_spec: 20,
|
||
alert: 21,
|
||
handshake: 22,
|
||
application_data: 23,
|
||
heartbeat: 24
|
||
},
|
||
l.HandshakeType = {
|
||
hello_request: 0,
|
||
client_hello: 1,
|
||
server_hello: 2,
|
||
certificate: 11,
|
||
server_key_exchange: 12,
|
||
certificate_request: 13,
|
||
server_hello_done: 14,
|
||
certificate_verify: 15,
|
||
client_key_exchange: 16,
|
||
finished: 20
|
||
},
|
||
l.Alert = {},
|
||
l.Alert.Level = {
|
||
warning: 1,
|
||
fatal: 2
|
||
},
|
||
l.Alert.Description = {
|
||
close_notify: 0,
|
||
unexpected_message: 10,
|
||
bad_record_mac: 20,
|
||
decryption_failed: 21,
|
||
record_overflow: 22,
|
||
decompression_failure: 30,
|
||
handshake_failure: 40,
|
||
bad_certificate: 42,
|
||
unsupported_certificate: 43,
|
||
certificate_revoked: 44,
|
||
certificate_expired: 45,
|
||
certificate_unknown: 46,
|
||
illegal_parameter: 47,
|
||
unknown_ca: 48,
|
||
access_denied: 49,
|
||
decode_error: 50,
|
||
decrypt_error: 51,
|
||
export_restriction: 60,
|
||
protocol_version: 70,
|
||
insufficient_security: 71,
|
||
internal_error: 80,
|
||
user_canceled: 90,
|
||
no_renegotiation: 100
|
||
},
|
||
l.HeartbeatMessageType = {
|
||
heartbeat_request: 1,
|
||
heartbeat_response: 2
|
||
},
|
||
l.CipherSuites = {},
|
||
l.getCipherSuite = function(e) {
|
||
var t = null;
|
||
for (var r in l.CipherSuites) {
|
||
var a = l.CipherSuites[r];
|
||
if (a.id[0] === e.charCodeAt(0) && a.id[1] === e.charCodeAt(1)) {
|
||
t = a;
|
||
break
|
||
}
|
||
}
|
||
return t
|
||
}
|
||
,
|
||
l.handleUnexpected = function(e, t) {
|
||
!e.open && e.entity === l.ConnectionEnd.client || e.error(e, {
|
||
message: "Unexpected message. Received TLS record out of order.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.unexpected_message
|
||
}
|
||
})
|
||
}
|
||
,
|
||
l.handleHelloRequest = function(e, t, r) {
|
||
!e.handshaking && e.handshakes > 0 && (l.queue(e, l.createAlert(e, {
|
||
level: l.Alert.Level.warning,
|
||
description: l.Alert.Description.no_renegotiation
|
||
})),
|
||
l.flush(e)),
|
||
e.process()
|
||
}
|
||
,
|
||
l.parseHelloMessage = function(e, t, r) {
|
||
var n = null
|
||
, i = e.entity === l.ConnectionEnd.client;
|
||
if (r < 38)
|
||
e.error(e, {
|
||
message: i ? "Invalid ServerHello message. Message too short." : "Invalid ClientHello message. Message too short.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.illegal_parameter
|
||
}
|
||
});
|
||
else {
|
||
var s = t.fragment
|
||
, o = s.length();
|
||
if (n = {
|
||
version: {
|
||
major: s.getByte(),
|
||
minor: s.getByte()
|
||
},
|
||
random: a.util.createBuffer(s.getBytes(32)),
|
||
session_id: c(s, 1),
|
||
extensions: []
|
||
},
|
||
i ? (n.cipher_suite = s.getBytes(2),
|
||
n.compression_method = s.getByte()) : (n.cipher_suites = c(s, 2),
|
||
n.compression_methods = c(s, 1)),
|
||
(o = r - (o - s.length())) > 0) {
|
||
for (var u = c(s, 2); u.length() > 0; )
|
||
n.extensions.push({
|
||
type: [u.getByte(), u.getByte()],
|
||
data: c(u, 2)
|
||
});
|
||
if (!i)
|
||
for (var p = 0; p < n.extensions.length; ++p) {
|
||
var f = n.extensions[p];
|
||
if (0 === f.type[0] && 0 === f.type[1])
|
||
for (var h = c(f.data, 2); h.length() > 0; ) {
|
||
var d = h.getByte();
|
||
if (0 !== d)
|
||
break;
|
||
e.session.extensions.server_name.serverNameList.push(c(h, 2).getBytes())
|
||
}
|
||
}
|
||
}
|
||
if (e.session.version && (n.version.major !== e.session.version.major || n.version.minor !== e.session.version.minor))
|
||
return e.error(e, {
|
||
message: "TLS version change is disallowed during renegotiation.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.protocol_version
|
||
}
|
||
});
|
||
if (i)
|
||
e.session.cipherSuite = l.getCipherSuite(n.cipher_suite);
|
||
else
|
||
for (var y = a.util.createBuffer(n.cipher_suites.bytes()); y.length() > 0 && (e.session.cipherSuite = l.getCipherSuite(y.getBytes(2)),
|
||
null === e.session.cipherSuite); )
|
||
;
|
||
if (null === e.session.cipherSuite)
|
||
return e.error(e, {
|
||
message: "No cipher suites in common.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.handshake_failure
|
||
},
|
||
cipherSuite: a.util.bytesToHex(n.cipher_suite)
|
||
});
|
||
e.session.compressionMethod = i ? n.compression_method : l.CompressionMethod.none
|
||
}
|
||
return n
|
||
}
|
||
,
|
||
l.createSecurityParameters = function(e, t) {
|
||
var r = e.entity === l.ConnectionEnd.client
|
||
, a = t.random.bytes()
|
||
, n = r ? e.session.sp.client_random : a
|
||
, i = r ? a : l.createRandom().getBytes();
|
||
e.session.sp = {
|
||
entity: e.entity,
|
||
prf_algorithm: l.PRFAlgorithm.tls_prf_sha256,
|
||
bulk_cipher_algorithm: null,
|
||
cipher_type: null,
|
||
enc_key_length: null,
|
||
block_length: null,
|
||
fixed_iv_length: null,
|
||
record_iv_length: null,
|
||
mac_algorithm: null,
|
||
mac_length: null,
|
||
mac_key_length: null,
|
||
compression_algorithm: e.session.compressionMethod,
|
||
pre_master_secret: null,
|
||
master_secret: null,
|
||
client_random: n,
|
||
server_random: i
|
||
}
|
||
}
|
||
,
|
||
l.handleServerHello = function(e, t, r) {
|
||
var a = l.parseHelloMessage(e, t, r);
|
||
if (!e.fail) {
|
||
if (!(a.version.minor <= e.version.minor))
|
||
return e.error(e, {
|
||
message: "Incompatible TLS version.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.protocol_version
|
||
}
|
||
});
|
||
e.version.minor = a.version.minor,
|
||
e.session.version = e.version;
|
||
var n = a.session_id.bytes();
|
||
n.length > 0 && n === e.session.id ? (e.expect = y,
|
||
e.session.resuming = !0,
|
||
e.session.sp.server_random = a.random.bytes()) : (e.expect = p,
|
||
e.session.resuming = !1,
|
||
l.createSecurityParameters(e, a)),
|
||
e.session.id = n,
|
||
e.process()
|
||
}
|
||
}
|
||
,
|
||
l.handleClientHello = function(e, t, r) {
|
||
var n = l.parseHelloMessage(e, t, r);
|
||
if (!e.fail) {
|
||
var i = n.session_id.bytes()
|
||
, s = null;
|
||
if (e.sessionCache && (s = e.sessionCache.getSession(i),
|
||
null === s ? i = "" : (s.version.major !== n.version.major || s.version.minor > n.version.minor) && (s = null,
|
||
i = "")),
|
||
0 === i.length && (i = a.random.getBytes(32)),
|
||
e.session.id = i,
|
||
e.session.clientHelloVersion = n.version,
|
||
e.session.sp = {},
|
||
s)
|
||
e.version = e.session.version = s.version,
|
||
e.session.sp = s.sp;
|
||
else {
|
||
for (var o, c = 1; c < l.SupportedVersions.length && (o = l.SupportedVersions[c],
|
||
!(o.minor <= n.version.minor)); ++c)
|
||
;
|
||
e.version = {
|
||
major: o.major,
|
||
minor: o.minor
|
||
},
|
||
e.session.version = e.version
|
||
}
|
||
null !== s ? (e.expect = T,
|
||
e.session.resuming = !0,
|
||
e.session.sp.client_random = n.random.bytes()) : (e.expect = !1 !== e.verifyClient ? C : E,
|
||
e.session.resuming = !1,
|
||
l.createSecurityParameters(e, n)),
|
||
e.open = !0,
|
||
l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.handshake,
|
||
data: l.createServerHello(e)
|
||
})),
|
||
e.session.resuming ? (l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.change_cipher_spec,
|
||
data: l.createChangeCipherSpec()
|
||
})),
|
||
e.state.pending = l.createConnectionState(e),
|
||
e.state.current.write = e.state.pending.write,
|
||
l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.handshake,
|
||
data: l.createFinished(e)
|
||
}))) : (l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.handshake,
|
||
data: l.createCertificate(e)
|
||
})),
|
||
e.fail || (l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.handshake,
|
||
data: l.createServerKeyExchange(e)
|
||
})),
|
||
!1 !== e.verifyClient && l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.handshake,
|
||
data: l.createCertificateRequest(e)
|
||
})),
|
||
l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.handshake,
|
||
data: l.createServerHelloDone(e)
|
||
})))),
|
||
l.flush(e),
|
||
e.process()
|
||
}
|
||
}
|
||
,
|
||
l.handleCertificate = function(e, t, r) {
|
||
if (r < 3)
|
||
return e.error(e, {
|
||
message: "Invalid Certificate message. Message too short.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.illegal_parameter
|
||
}
|
||
});
|
||
var n, i, s = t.fragment, o = {
|
||
certificate_list: c(s, 3)
|
||
}, u = [];
|
||
try {
|
||
for (; o.certificate_list.length() > 0; )
|
||
n = c(o.certificate_list, 3),
|
||
i = a.asn1.fromDer(n),
|
||
n = a.pki.certificateFromAsn1(i, !0),
|
||
u.push(n)
|
||
} catch (t) {
|
||
return e.error(e, {
|
||
message: "Could not parse certificate list.",
|
||
cause: t,
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.bad_certificate
|
||
}
|
||
})
|
||
}
|
||
var p = e.entity === l.ConnectionEnd.client;
|
||
!p && !0 !== e.verifyClient || 0 !== u.length ? 0 === u.length ? e.expect = p ? f : E : (p ? e.session.serverCertificate = u[0] : e.session.clientCertificate = u[0],
|
||
l.verifyCertificateChain(e, u) && (e.expect = p ? f : E)) : e.error(e, {
|
||
message: p ? "No server certificate provided." : "No client certificate provided.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.illegal_parameter
|
||
}
|
||
}),
|
||
e.process()
|
||
}
|
||
,
|
||
l.handleServerKeyExchange = function(e, t, r) {
|
||
if (r > 0)
|
||
return e.error(e, {
|
||
message: "Invalid key parameters. Only RSA is supported.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.unsupported_certificate
|
||
}
|
||
});
|
||
e.expect = h,
|
||
e.process()
|
||
}
|
||
,
|
||
l.handleClientKeyExchange = function(e, t, r) {
|
||
if (r < 48)
|
||
return e.error(e, {
|
||
message: "Invalid key parameters. Only RSA is supported.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.unsupported_certificate
|
||
}
|
||
});
|
||
var n = t.fragment
|
||
, i = {
|
||
enc_pre_master_secret: c(n, 2).getBytes()
|
||
}
|
||
, s = null;
|
||
if (e.getPrivateKey)
|
||
try {
|
||
s = e.getPrivateKey(e, e.session.serverCertificate),
|
||
s = a.pki.privateKeyFromPem(s)
|
||
} catch (t) {
|
||
e.error(e, {
|
||
message: "Could not get private key.",
|
||
cause: t,
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.internal_error
|
||
}
|
||
})
|
||
}
|
||
if (null === s)
|
||
return e.error(e, {
|
||
message: "No private key set.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.internal_error
|
||
}
|
||
});
|
||
try {
|
||
var o = e.session.sp;
|
||
o.pre_master_secret = s.decrypt(i.enc_pre_master_secret);
|
||
var u = e.session.clientHelloVersion;
|
||
if (u.major !== o.pre_master_secret.charCodeAt(0) || u.minor !== o.pre_master_secret.charCodeAt(1))
|
||
throw new Error("TLS version rollback attack detected.")
|
||
} catch (e) {
|
||
o.pre_master_secret = a.random.getBytes(48)
|
||
}
|
||
e.expect = T,
|
||
null !== e.session.clientCertificate && (e.expect = S),
|
||
e.process()
|
||
}
|
||
,
|
||
l.handleCertificateRequest = function(e, t, r) {
|
||
if (r < 3)
|
||
return e.error(e, {
|
||
message: "Invalid CertificateRequest. Message too short.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.illegal_parameter
|
||
}
|
||
});
|
||
var a = t.fragment
|
||
, n = {
|
||
certificate_types: c(a, 1),
|
||
certificate_authorities: c(a, 2)
|
||
};
|
||
e.session.certificateRequest = n,
|
||
e.expect = d,
|
||
e.process()
|
||
}
|
||
,
|
||
l.handleCertificateVerify = function(e, t, r) {
|
||
if (r < 2)
|
||
return e.error(e, {
|
||
message: "Invalid CertificateVerify. Message too short.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.illegal_parameter
|
||
}
|
||
});
|
||
var n = t.fragment;
|
||
n.read -= 4;
|
||
var i = n.bytes();
|
||
n.read += 4;
|
||
var s = {
|
||
signature: c(n, 2).getBytes()
|
||
}
|
||
, o = a.util.createBuffer();
|
||
o.putBuffer(e.session.md5.digest()),
|
||
o.putBuffer(e.session.sha1.digest()),
|
||
o = o.getBytes();
|
||
try {
|
||
if (!e.session.clientCertificate.publicKey.verify(o, s.signature, "NONE"))
|
||
throw new Error("CertificateVerify signature does not match.");
|
||
e.session.md5.update(i),
|
||
e.session.sha1.update(i)
|
||
} catch (t) {
|
||
return e.error(e, {
|
||
message: "Bad signature in CertificateVerify.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.handshake_failure
|
||
}
|
||
})
|
||
}
|
||
e.expect = T,
|
||
e.process()
|
||
}
|
||
,
|
||
l.handleServerHelloDone = function(e, t, r) {
|
||
if (r > 0)
|
||
return e.error(e, {
|
||
message: "Invalid ServerHelloDone message. Invalid length.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.record_overflow
|
||
}
|
||
});
|
||
if (null === e.serverCertificate) {
|
||
var n = {
|
||
message: "No server certificate provided. Not enough security.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.insufficient_security
|
||
}
|
||
}
|
||
, i = e.verify(e, n.alert.description, 0, []);
|
||
if (!0 !== i)
|
||
return (i || 0 === i) && ("object" != typeof i || a.util.isArray(i) ? "number" == typeof i && (n.alert.description = i) : (i.message && (n.message = i.message),
|
||
i.alert && (n.alert.description = i.alert))),
|
||
e.error(e, n)
|
||
}
|
||
null !== e.session.certificateRequest && (t = l.createRecord(e, {
|
||
type: l.ContentType.handshake,
|
||
data: l.createCertificate(e)
|
||
}),
|
||
l.queue(e, t)),
|
||
t = l.createRecord(e, {
|
||
type: l.ContentType.handshake,
|
||
data: l.createClientKeyExchange(e)
|
||
}),
|
||
l.queue(e, t),
|
||
e.expect = m;
|
||
var s = function(e, t) {
|
||
null !== e.session.certificateRequest && null !== e.session.clientCertificate && l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.handshake,
|
||
data: l.createCertificateVerify(e, t)
|
||
})),
|
||
l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.change_cipher_spec,
|
||
data: l.createChangeCipherSpec()
|
||
})),
|
||
e.state.pending = l.createConnectionState(e),
|
||
e.state.current.write = e.state.pending.write,
|
||
l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.handshake,
|
||
data: l.createFinished(e)
|
||
})),
|
||
e.expect = y,
|
||
l.flush(e),
|
||
e.process()
|
||
};
|
||
if (null === e.session.certificateRequest || null === e.session.clientCertificate)
|
||
return s(e, null);
|
||
l.getClientSignature(e, s)
|
||
}
|
||
,
|
||
l.handleChangeCipherSpec = function(e, t) {
|
||
if (1 !== t.fragment.getByte())
|
||
return e.error(e, {
|
||
message: "Invalid ChangeCipherSpec message received.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.illegal_parameter
|
||
}
|
||
});
|
||
var r = e.entity === l.ConnectionEnd.client;
|
||
(e.session.resuming && r || !e.session.resuming && !r) && (e.state.pending = l.createConnectionState(e)),
|
||
e.state.current.read = e.state.pending.read,
|
||
(!e.session.resuming && r || e.session.resuming && !r) && (e.state.pending = null),
|
||
e.expect = r ? g : I,
|
||
e.process()
|
||
}
|
||
,
|
||
l.handleFinished = function(e, t, r) {
|
||
var i = t.fragment;
|
||
i.read -= 4;
|
||
var s = i.bytes();
|
||
i.read += 4;
|
||
var o = t.fragment.getBytes();
|
||
i = a.util.createBuffer(),
|
||
i.putBuffer(e.session.md5.digest()),
|
||
i.putBuffer(e.session.sha1.digest());
|
||
var c = e.entity === l.ConnectionEnd.client
|
||
, u = c ? "server finished" : "client finished"
|
||
, p = e.session.sp;
|
||
if (i = n(p.master_secret, u, i.getBytes(), 12),
|
||
i.getBytes() !== o)
|
||
return e.error(e, {
|
||
message: "Invalid verify_data in Finished message.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.decrypt_error
|
||
}
|
||
});
|
||
e.session.md5.update(s),
|
||
e.session.sha1.update(s),
|
||
(e.session.resuming && c || !e.session.resuming && !c) && (l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.change_cipher_spec,
|
||
data: l.createChangeCipherSpec()
|
||
})),
|
||
e.state.current.write = e.state.pending.write,
|
||
e.state.pending = null,
|
||
l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.handshake,
|
||
data: l.createFinished(e)
|
||
}))),
|
||
e.expect = c ? v : b,
|
||
e.handshaking = !1,
|
||
++e.handshakes,
|
||
e.peerCertificate = c ? e.session.serverCertificate : e.session.clientCertificate,
|
||
l.flush(e),
|
||
e.isConnected = !0,
|
||
e.connected(e),
|
||
e.process()
|
||
}
|
||
,
|
||
l.handleAlert = function(e, t) {
|
||
var r, a = t.fragment, n = {
|
||
level: a.getByte(),
|
||
description: a.getByte()
|
||
};
|
||
switch (n.description) {
|
||
case l.Alert.Description.close_notify:
|
||
r = "Connection closed.";
|
||
break;
|
||
case l.Alert.Description.unexpected_message:
|
||
r = "Unexpected message.";
|
||
break;
|
||
case l.Alert.Description.bad_record_mac:
|
||
r = "Bad record MAC.";
|
||
break;
|
||
case l.Alert.Description.decryption_failed:
|
||
r = "Decryption failed.";
|
||
break;
|
||
case l.Alert.Description.record_overflow:
|
||
r = "Record overflow.";
|
||
break;
|
||
case l.Alert.Description.decompression_failure:
|
||
r = "Decompression failed.";
|
||
break;
|
||
case l.Alert.Description.handshake_failure:
|
||
r = "Handshake failure.";
|
||
break;
|
||
case l.Alert.Description.bad_certificate:
|
||
r = "Bad certificate.";
|
||
break;
|
||
case l.Alert.Description.unsupported_certificate:
|
||
r = "Unsupported certificate.";
|
||
break;
|
||
case l.Alert.Description.certificate_revoked:
|
||
r = "Certificate revoked.";
|
||
break;
|
||
case l.Alert.Description.certificate_expired:
|
||
r = "Certificate expired.";
|
||
break;
|
||
case l.Alert.Description.certificate_unknown:
|
||
r = "Certificate unknown.";
|
||
break;
|
||
case l.Alert.Description.illegal_parameter:
|
||
r = "Illegal parameter.";
|
||
break;
|
||
case l.Alert.Description.unknown_ca:
|
||
r = "Unknown certificate authority.";
|
||
break;
|
||
case l.Alert.Description.access_denied:
|
||
r = "Access denied.";
|
||
break;
|
||
case l.Alert.Description.decode_error:
|
||
r = "Decode error.";
|
||
break;
|
||
case l.Alert.Description.decrypt_error:
|
||
r = "Decrypt error.";
|
||
break;
|
||
case l.Alert.Description.export_restriction:
|
||
r = "Export restriction.";
|
||
break;
|
||
case l.Alert.Description.protocol_version:
|
||
r = "Unsupported protocol version.";
|
||
break;
|
||
case l.Alert.Description.insufficient_security:
|
||
r = "Insufficient security.";
|
||
break;
|
||
case l.Alert.Description.internal_error:
|
||
r = "Internal error.";
|
||
break;
|
||
case l.Alert.Description.user_canceled:
|
||
r = "User canceled.";
|
||
break;
|
||
case l.Alert.Description.no_renegotiation:
|
||
r = "Renegotiation not supported.";
|
||
break;
|
||
default:
|
||
r = "Unknown error."
|
||
}
|
||
if (n.description === l.Alert.Description.close_notify)
|
||
return e.close();
|
||
e.error(e, {
|
||
message: r,
|
||
send: !1,
|
||
origin: e.entity === l.ConnectionEnd.client ? "server" : "client",
|
||
alert: n
|
||
}),
|
||
e.process()
|
||
}
|
||
,
|
||
l.handleHandshake = function(e, t) {
|
||
var r = t.fragment
|
||
, n = r.getByte()
|
||
, i = r.getInt24();
|
||
if (i > r.length())
|
||
return e.fragmented = t,
|
||
t.fragment = a.util.createBuffer(),
|
||
r.read -= 4,
|
||
e.process();
|
||
e.fragmented = null,
|
||
r.read -= 4;
|
||
var s = r.bytes(i + 4);
|
||
r.read += 4,
|
||
n in x[e.entity][e.expect] ? (e.entity !== l.ConnectionEnd.server || e.open || e.fail || (e.handshaking = !0,
|
||
e.session = {
|
||
version: null,
|
||
extensions: {
|
||
server_name: {
|
||
serverNameList: []
|
||
}
|
||
},
|
||
cipherSuite: null,
|
||
compressionMethod: null,
|
||
serverCertificate: null,
|
||
clientCertificate: null,
|
||
md5: a.md.md5.create(),
|
||
sha1: a.md.sha1.create()
|
||
}),
|
||
n !== l.HandshakeType.hello_request && n !== l.HandshakeType.certificate_verify && n !== l.HandshakeType.finished && (e.session.md5.update(s),
|
||
e.session.sha1.update(s)),
|
||
x[e.entity][e.expect][n](e, t, i)) : l.handleUnexpected(e, t)
|
||
}
|
||
,
|
||
l.handleApplicationData = function(e, t) {
|
||
e.data.putBuffer(t.fragment),
|
||
e.dataReady(e),
|
||
e.process()
|
||
}
|
||
,
|
||
l.handleHeartbeat = function(e, t) {
|
||
var r = t.fragment
|
||
, n = r.getByte()
|
||
, i = r.getInt16()
|
||
, s = r.getBytes(i);
|
||
if (n === l.HeartbeatMessageType.heartbeat_request) {
|
||
if (e.handshaking || i > s.length)
|
||
return e.process();
|
||
l.queue(e, l.createRecord(e, {
|
||
type: l.ContentType.heartbeat,
|
||
data: l.createHeartbeat(l.HeartbeatMessageType.heartbeat_response, s)
|
||
})),
|
||
l.flush(e)
|
||
} else if (n === l.HeartbeatMessageType.heartbeat_response) {
|
||
if (s !== e.expectedHeartbeatPayload)
|
||
return e.process();
|
||
e.heartbeatReceived && e.heartbeatReceived(e, a.util.createBuffer(s))
|
||
}
|
||
e.process()
|
||
}
|
||
;
|
||
var p = 1
|
||
, f = 2
|
||
, h = 3
|
||
, d = 4
|
||
, y = 5
|
||
, g = 6
|
||
, v = 7
|
||
, m = 8
|
||
, C = 1
|
||
, E = 2
|
||
, S = 3
|
||
, T = 4
|
||
, I = 5
|
||
, b = 6
|
||
, A = l.handleUnexpected
|
||
, B = l.handleChangeCipherSpec
|
||
, N = l.handleAlert
|
||
, k = l.handleHandshake
|
||
, w = l.handleApplicationData
|
||
, R = l.handleHeartbeat
|
||
, _ = [];
|
||
_[l.ConnectionEnd.client] = [[A, N, k, A, R], [A, N, k, A, R], [A, N, k, A, R], [A, N, k, A, R], [A, N, k, A, R], [B, N, A, A, R], [A, N, k, A, R], [A, N, k, w, R], [A, N, k, A, R]],
|
||
_[l.ConnectionEnd.server] = [[A, N, k, A, R], [A, N, k, A, R], [A, N, k, A, R], [A, N, k, A, R], [B, N, A, A, R], [A, N, k, A, R], [A, N, k, w, R], [A, N, k, A, R]];
|
||
var L = l.handleHelloRequest
|
||
, U = l.handleServerHello
|
||
, D = l.handleCertificate
|
||
, P = l.handleServerKeyExchange
|
||
, V = l.handleCertificateRequest
|
||
, O = l.handleServerHelloDone
|
||
, K = l.handleFinished
|
||
, x = [];
|
||
x[l.ConnectionEnd.client] = [[A, A, U, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, D, P, V, O, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, A, P, V, O, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, A, A, V, O, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, A, A, A, O, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, K], [L, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A]];
|
||
var M = l.handleClientHello
|
||
, F = l.handleClientKeyExchange
|
||
, q = l.handleCertificateVerify;
|
||
x[l.ConnectionEnd.server] = [[A, M, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A], [A, A, A, A, A, A, A, A, A, A, A, D, A, A, A, A, A, A, A, A, A], [A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, F, A, A, A, A], [A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, q, A, A, A, A, A], [A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A], [A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, K], [A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A], [A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A]],
|
||
l.generateKeys = function(e, t) {
|
||
var r = n
|
||
, a = t.client_random + t.server_random;
|
||
e.session.resuming || (t.master_secret = r(t.pre_master_secret, "master secret", a, 48).bytes(),
|
||
t.pre_master_secret = null),
|
||
a = t.server_random + t.client_random;
|
||
var i = 2 * t.mac_key_length + 2 * t.enc_key_length
|
||
, s = e.version.major === l.Versions.TLS_1_0.major && e.version.minor === l.Versions.TLS_1_0.minor;
|
||
s && (i += 2 * t.fixed_iv_length);
|
||
var o = r(t.master_secret, "key expansion", a, i)
|
||
, c = {
|
||
client_write_MAC_key: o.getBytes(t.mac_key_length),
|
||
server_write_MAC_key: o.getBytes(t.mac_key_length),
|
||
client_write_key: o.getBytes(t.enc_key_length),
|
||
server_write_key: o.getBytes(t.enc_key_length)
|
||
};
|
||
return s && (c.client_write_IV = o.getBytes(t.fixed_iv_length),
|
||
c.server_write_IV = o.getBytes(t.fixed_iv_length)),
|
||
c
|
||
}
|
||
,
|
||
l.createConnectionState = function(e) {
|
||
var t = e.entity === l.ConnectionEnd.client
|
||
, r = function() {
|
||
var e = {
|
||
sequenceNumber: [0, 0],
|
||
macKey: null,
|
||
macLength: 0,
|
||
macFunction: null,
|
||
cipherState: null,
|
||
cipherFunction: function(e) {
|
||
return !0
|
||
},
|
||
compressionState: null,
|
||
compressFunction: function(e) {
|
||
return !0
|
||
},
|
||
updateSequenceNumber: function() {
|
||
4294967295 === e.sequenceNumber[1] ? (e.sequenceNumber[1] = 0,
|
||
++e.sequenceNumber[0]) : ++e.sequenceNumber[1]
|
||
}
|
||
};
|
||
return e
|
||
}
|
||
, a = {
|
||
read: r(),
|
||
write: r()
|
||
};
|
||
if (a.read.update = function(e, t) {
|
||
return a.read.cipherFunction(t, a.read) ? a.read.compressFunction(e, t, a.read) || e.error(e, {
|
||
message: "Could not decompress record.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.decompression_failure
|
||
}
|
||
}) : e.error(e, {
|
||
message: "Could not decrypt record or bad MAC.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.bad_record_mac
|
||
}
|
||
}),
|
||
!e.fail
|
||
}
|
||
,
|
||
a.write.update = function(e, t) {
|
||
return a.write.compressFunction(e, t, a.write) ? a.write.cipherFunction(t, a.write) || e.error(e, {
|
||
message: "Could not encrypt record.",
|
||
send: !1,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.internal_error
|
||
}
|
||
}) : e.error(e, {
|
||
message: "Could not compress record.",
|
||
send: !1,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.internal_error
|
||
}
|
||
}),
|
||
!e.fail
|
||
}
|
||
,
|
||
e.session) {
|
||
var n = e.session.sp;
|
||
switch (e.session.cipherSuite.initSecurityParameters(n),
|
||
n.keys = l.generateKeys(e, n),
|
||
a.read.macKey = t ? n.keys.server_write_MAC_key : n.keys.client_write_MAC_key,
|
||
a.write.macKey = t ? n.keys.client_write_MAC_key : n.keys.server_write_MAC_key,
|
||
e.session.cipherSuite.initConnectionState(a, e, n),
|
||
n.compression_algorithm) {
|
||
case l.CompressionMethod.none:
|
||
break;
|
||
case l.CompressionMethod.deflate:
|
||
a.read.compressFunction = o,
|
||
a.write.compressFunction = s;
|
||
break;
|
||
default:
|
||
throw new Error("Unsupported compression algorithm.")
|
||
}
|
||
}
|
||
return a
|
||
}
|
||
,
|
||
l.createRandom = function() {
|
||
var e = new Date
|
||
, t = +e + 6e4 * e.getTimezoneOffset()
|
||
, r = a.util.createBuffer();
|
||
return r.putInt32(t),
|
||
r.putBytes(a.random.getBytes(28)),
|
||
r
|
||
}
|
||
,
|
||
l.createRecord = function(e, t) {
|
||
return t.data ? {
|
||
type: t.type,
|
||
version: {
|
||
major: e.version.major,
|
||
minor: e.version.minor
|
||
},
|
||
length: t.data.length(),
|
||
fragment: t.data
|
||
} : null
|
||
}
|
||
,
|
||
l.createAlert = function(e, t) {
|
||
var r = a.util.createBuffer();
|
||
return r.putByte(t.level),
|
||
r.putByte(t.description),
|
||
l.createRecord(e, {
|
||
type: l.ContentType.alert,
|
||
data: r
|
||
})
|
||
}
|
||
,
|
||
l.createClientHello = function(e) {
|
||
e.session.clientHelloVersion = {
|
||
major: e.version.major,
|
||
minor: e.version.minor
|
||
};
|
||
for (var t = a.util.createBuffer(), r = 0; r < e.cipherSuites.length; ++r) {
|
||
var n = e.cipherSuites[r];
|
||
t.putByte(n.id[0]),
|
||
t.putByte(n.id[1])
|
||
}
|
||
var i = t.length()
|
||
, s = a.util.createBuffer();
|
||
s.putByte(l.CompressionMethod.none);
|
||
var o = s.length()
|
||
, c = a.util.createBuffer();
|
||
if (e.virtualHost) {
|
||
var p = a.util.createBuffer();
|
||
p.putByte(0),
|
||
p.putByte(0);
|
||
var f = a.util.createBuffer();
|
||
f.putByte(0),
|
||
u(f, 2, a.util.createBuffer(e.virtualHost));
|
||
var h = a.util.createBuffer();
|
||
u(h, 2, f),
|
||
u(p, 2, h),
|
||
c.putBuffer(p)
|
||
}
|
||
var d = c.length();
|
||
d > 0 && (d += 2);
|
||
var y = e.session.id
|
||
, g = y.length + 1 + 2 + 4 + 28 + 2 + i + 1 + o + d
|
||
, v = a.util.createBuffer();
|
||
return v.putByte(l.HandshakeType.client_hello),
|
||
v.putInt24(g),
|
||
v.putByte(e.version.major),
|
||
v.putByte(e.version.minor),
|
||
v.putBytes(e.session.sp.client_random),
|
||
u(v, 1, a.util.createBuffer(y)),
|
||
u(v, 2, t),
|
||
u(v, 1, s),
|
||
d > 0 && u(v, 2, c),
|
||
v
|
||
}
|
||
,
|
||
l.createServerHello = function(e) {
|
||
var t = e.session.id
|
||
, r = t.length + 1 + 2 + 4 + 28 + 2 + 1
|
||
, n = a.util.createBuffer();
|
||
return n.putByte(l.HandshakeType.server_hello),
|
||
n.putInt24(r),
|
||
n.putByte(e.version.major),
|
||
n.putByte(e.version.minor),
|
||
n.putBytes(e.session.sp.server_random),
|
||
u(n, 1, a.util.createBuffer(t)),
|
||
n.putByte(e.session.cipherSuite.id[0]),
|
||
n.putByte(e.session.cipherSuite.id[1]),
|
||
n.putByte(e.session.compressionMethod),
|
||
n
|
||
}
|
||
,
|
||
l.createCertificate = function(e) {
|
||
var t = e.entity === l.ConnectionEnd.client
|
||
, r = null;
|
||
if (e.getCertificate) {
|
||
var n;
|
||
n = t ? e.session.certificateRequest : e.session.extensions.server_name.serverNameList,
|
||
r = e.getCertificate(e, n)
|
||
}
|
||
var i = a.util.createBuffer();
|
||
if (null !== r)
|
||
try {
|
||
a.util.isArray(r) || (r = [r]);
|
||
for (var s = null, o = 0; o < r.length; ++o) {
|
||
var c = a.pem.decode(r[o])[0];
|
||
if ("CERTIFICATE" !== c.type && "X509 CERTIFICATE" !== c.type && "TRUSTED CERTIFICATE" !== c.type) {
|
||
var p = new Error('Could not convert certificate from PEM; PEM header type is not "CERTIFICATE", "X509 CERTIFICATE", or "TRUSTED CERTIFICATE".');
|
||
throw p.headerType = c.type,
|
||
p
|
||
}
|
||
if (c.procType && "ENCRYPTED" === c.procType.type)
|
||
throw new Error("Could not convert certificate from PEM; PEM is encrypted.");
|
||
var f = a.util.createBuffer(c.body);
|
||
null === s && (s = a.asn1.fromDer(f.bytes(), !1));
|
||
var h = a.util.createBuffer();
|
||
u(h, 3, f),
|
||
i.putBuffer(h)
|
||
}
|
||
r = a.pki.certificateFromAsn1(s),
|
||
t ? e.session.clientCertificate = r : e.session.serverCertificate = r
|
||
} catch (t) {
|
||
return e.error(e, {
|
||
message: "Could not send certificate list.",
|
||
cause: t,
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.bad_certificate
|
||
}
|
||
})
|
||
}
|
||
var d = 3 + i.length()
|
||
, y = a.util.createBuffer();
|
||
return y.putByte(l.HandshakeType.certificate),
|
||
y.putInt24(d),
|
||
u(y, 3, i),
|
||
y
|
||
}
|
||
,
|
||
l.createClientKeyExchange = function(e) {
|
||
var t = a.util.createBuffer();
|
||
t.putByte(e.session.clientHelloVersion.major),
|
||
t.putByte(e.session.clientHelloVersion.minor),
|
||
t.putBytes(a.random.getBytes(46));
|
||
var r = e.session.sp;
|
||
r.pre_master_secret = t.getBytes(),
|
||
t = e.session.serverCertificate.publicKey.encrypt(r.pre_master_secret);
|
||
var n = t.length + 2
|
||
, i = a.util.createBuffer();
|
||
return i.putByte(l.HandshakeType.client_key_exchange),
|
||
i.putInt24(n),
|
||
i.putInt16(t.length),
|
||
i.putBytes(t),
|
||
i
|
||
}
|
||
,
|
||
l.createServerKeyExchange = function(e) {
|
||
var t = a.util.createBuffer();
|
||
return t
|
||
}
|
||
,
|
||
l.getClientSignature = function(e, t) {
|
||
var r = a.util.createBuffer();
|
||
r.putBuffer(e.session.md5.digest()),
|
||
r.putBuffer(e.session.sha1.digest()),
|
||
r = r.getBytes(),
|
||
e.getSignature = e.getSignature || function(e, t, r) {
|
||
var n = null;
|
||
if (e.getPrivateKey)
|
||
try {
|
||
n = e.getPrivateKey(e, e.session.clientCertificate),
|
||
n = a.pki.privateKeyFromPem(n)
|
||
} catch (t) {
|
||
e.error(e, {
|
||
message: "Could not get private key.",
|
||
cause: t,
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.internal_error
|
||
}
|
||
})
|
||
}
|
||
null === n ? e.error(e, {
|
||
message: "No private key set.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.internal_error
|
||
}
|
||
}) : t = n.sign(t, null),
|
||
r(e, t)
|
||
}
|
||
,
|
||
e.getSignature(e, r, t)
|
||
}
|
||
,
|
||
l.createCertificateVerify = function(e, t) {
|
||
var r = t.length + 2
|
||
, n = a.util.createBuffer();
|
||
return n.putByte(l.HandshakeType.certificate_verify),
|
||
n.putInt24(r),
|
||
n.putInt16(t.length),
|
||
n.putBytes(t),
|
||
n
|
||
}
|
||
,
|
||
l.createCertificateRequest = function(e) {
|
||
var t = a.util.createBuffer();
|
||
t.putByte(1);
|
||
var r = a.util.createBuffer();
|
||
for (var n in e.caStore.certs) {
|
||
var i = e.caStore.certs[n]
|
||
, s = a.pki.distinguishedNameToAsn1(i.subject)
|
||
, o = a.asn1.toDer(s);
|
||
r.putInt16(o.length()),
|
||
r.putBuffer(o)
|
||
}
|
||
var c = 1 + t.length() + 2 + r.length()
|
||
, p = a.util.createBuffer();
|
||
return p.putByte(l.HandshakeType.certificate_request),
|
||
p.putInt24(c),
|
||
u(p, 1, t),
|
||
u(p, 2, r),
|
||
p
|
||
}
|
||
,
|
||
l.createServerHelloDone = function(e) {
|
||
var t = a.util.createBuffer();
|
||
return t.putByte(l.HandshakeType.server_hello_done),
|
||
t.putInt24(0),
|
||
t
|
||
}
|
||
,
|
||
l.createChangeCipherSpec = function() {
|
||
var e = a.util.createBuffer();
|
||
return e.putByte(1),
|
||
e
|
||
}
|
||
,
|
||
l.createFinished = function(e) {
|
||
var t = a.util.createBuffer();
|
||
t.putBuffer(e.session.md5.digest()),
|
||
t.putBuffer(e.session.sha1.digest());
|
||
var r = e.entity === l.ConnectionEnd.client
|
||
, i = e.session.sp
|
||
, s = n
|
||
, o = r ? "client finished" : "server finished";
|
||
t = s(i.master_secret, o, t.getBytes(), 12);
|
||
var c = a.util.createBuffer();
|
||
return c.putByte(l.HandshakeType.finished),
|
||
c.putInt24(t.length()),
|
||
c.putBuffer(t),
|
||
c
|
||
}
|
||
,
|
||
l.createHeartbeat = function(e, t, r) {
|
||
void 0 === r && (r = t.length);
|
||
var n = a.util.createBuffer();
|
||
n.putByte(e),
|
||
n.putInt16(r),
|
||
n.putBytes(t);
|
||
var i = n.length()
|
||
, s = Math.max(16, i - r - 3);
|
||
return n.putBytes(a.random.getBytes(s)),
|
||
n
|
||
}
|
||
,
|
||
l.queue = function(e, t) {
|
||
if (t && (0 !== t.fragment.length() || t.type !== l.ContentType.handshake && t.type !== l.ContentType.alert && t.type !== l.ContentType.change_cipher_spec)) {
|
||
if (t.type === l.ContentType.handshake) {
|
||
var r = t.fragment.bytes();
|
||
e.session.md5.update(r),
|
||
e.session.sha1.update(r),
|
||
r = null
|
||
}
|
||
var n;
|
||
if (t.fragment.length() <= l.MaxFragment)
|
||
n = [t];
|
||
else {
|
||
n = [];
|
||
for (var i = t.fragment.bytes(); i.length > l.MaxFragment; )
|
||
n.push(l.createRecord(e, {
|
||
type: t.type,
|
||
data: a.util.createBuffer(i.slice(0, l.MaxFragment))
|
||
})),
|
||
i = i.slice(l.MaxFragment);
|
||
i.length > 0 && n.push(l.createRecord(e, {
|
||
type: t.type,
|
||
data: a.util.createBuffer(i)
|
||
}))
|
||
}
|
||
for (var s = 0; s < n.length && !e.fail; ++s) {
|
||
var o = n[s];
|
||
e.state.current.write.update(e, o) && e.records.push(o)
|
||
}
|
||
}
|
||
}
|
||
,
|
||
l.flush = function(e) {
|
||
for (var t = 0; t < e.records.length; ++t) {
|
||
var r = e.records[t];
|
||
e.tlsData.putByte(r.type),
|
||
e.tlsData.putByte(r.version.major),
|
||
e.tlsData.putByte(r.version.minor),
|
||
e.tlsData.putInt16(r.fragment.length()),
|
||
e.tlsData.putBuffer(e.records[t].fragment)
|
||
}
|
||
return e.records = [],
|
||
e.tlsDataReady(e)
|
||
}
|
||
;
|
||
var j = function(e) {
|
||
switch (e) {
|
||
case !0:
|
||
return !0;
|
||
case a.pki.certificateError.bad_certificate:
|
||
return l.Alert.Description.bad_certificate;
|
||
case a.pki.certificateError.unsupported_certificate:
|
||
return l.Alert.Description.unsupported_certificate;
|
||
case a.pki.certificateError.certificate_revoked:
|
||
return l.Alert.Description.certificate_revoked;
|
||
case a.pki.certificateError.certificate_expired:
|
||
return l.Alert.Description.certificate_expired;
|
||
case a.pki.certificateError.certificate_unknown:
|
||
return l.Alert.Description.certificate_unknown;
|
||
case a.pki.certificateError.unknown_ca:
|
||
return l.Alert.Description.unknown_ca;
|
||
default:
|
||
return l.Alert.Description.bad_certificate
|
||
}
|
||
}
|
||
, G = function(e) {
|
||
switch (e) {
|
||
case !0:
|
||
return !0;
|
||
case l.Alert.Description.bad_certificate:
|
||
return a.pki.certificateError.bad_certificate;
|
||
case l.Alert.Description.unsupported_certificate:
|
||
return a.pki.certificateError.unsupported_certificate;
|
||
case l.Alert.Description.certificate_revoked:
|
||
return a.pki.certificateError.certificate_revoked;
|
||
case l.Alert.Description.certificate_expired:
|
||
return a.pki.certificateError.certificate_expired;
|
||
case l.Alert.Description.certificate_unknown:
|
||
return a.pki.certificateError.certificate_unknown;
|
||
case l.Alert.Description.unknown_ca:
|
||
return a.pki.certificateError.unknown_ca;
|
||
default:
|
||
return a.pki.certificateError.bad_certificate
|
||
}
|
||
};
|
||
l.verifyCertificateChain = function(e, t) {
|
||
try {
|
||
var r = {};
|
||
for (var n in e.verifyOptions)
|
||
r[n] = e.verifyOptions[n];
|
||
r.verify = function(t, r, n) {
|
||
var i = (j(t),
|
||
e.verify(e, t, r, n));
|
||
if (!0 !== i) {
|
||
if ("object" == typeof i && !a.util.isArray(i)) {
|
||
var s = new Error("The application rejected the certificate.");
|
||
throw s.send = !0,
|
||
s.alert = {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.bad_certificate
|
||
},
|
||
i.message && (s.message = i.message),
|
||
i.alert && (s.alert.description = i.alert),
|
||
s
|
||
}
|
||
i !== t && (i = G(i))
|
||
}
|
||
return i
|
||
}
|
||
,
|
||
a.pki.verifyCertificateChain(e.caStore, t, r)
|
||
} catch (t) {
|
||
var i = t;
|
||
("object" != typeof i || a.util.isArray(i)) && (i = {
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: j(t)
|
||
}
|
||
}),
|
||
"send"in i || (i.send = !0),
|
||
"alert"in i || (i.alert = {
|
||
level: l.Alert.Level.fatal,
|
||
description: j(i.error)
|
||
}),
|
||
e.error(e, i)
|
||
}
|
||
return !e.fail
|
||
}
|
||
,
|
||
l.createSessionCache = function(e, t) {
|
||
var r = null;
|
||
if (e && e.getSession && e.setSession && e.order)
|
||
r = e;
|
||
else {
|
||
r = {},
|
||
r.cache = e || {},
|
||
r.capacity = Math.max(t || 100, 1),
|
||
r.order = [];
|
||
for (var n in e)
|
||
r.order.length <= t ? r.order.push(n) : delete e[n];
|
||
r.getSession = function(e) {
|
||
var t = null
|
||
, n = null;
|
||
if (e ? n = a.util.bytesToHex(e) : r.order.length > 0 && (n = r.order[0]),
|
||
null !== n && n in r.cache) {
|
||
t = r.cache[n],
|
||
delete r.cache[n];
|
||
for (var i in r.order)
|
||
if (r.order[i] === n) {
|
||
r.order.splice(i, 1);
|
||
break
|
||
}
|
||
}
|
||
return t
|
||
}
|
||
,
|
||
r.setSession = function(e, t) {
|
||
if (r.order.length === r.capacity) {
|
||
var n = r.order.shift();
|
||
delete r.cache[n]
|
||
}
|
||
var n = a.util.bytesToHex(e);
|
||
r.order.push(n),
|
||
r.cache[n] = t
|
||
}
|
||
}
|
||
return r
|
||
}
|
||
,
|
||
l.createConnection = function(e) {
|
||
var t = null;
|
||
t = e.caStore ? a.util.isArray(e.caStore) ? a.pki.createCaStore(e.caStore) : e.caStore : a.pki.createCaStore();
|
||
var r = e.cipherSuites || null;
|
||
if (null === r) {
|
||
r = [];
|
||
for (var n in l.CipherSuites)
|
||
r.push(l.CipherSuites[n])
|
||
}
|
||
var i = e.server ? l.ConnectionEnd.server : l.ConnectionEnd.client
|
||
, s = e.sessionCache ? l.createSessionCache(e.sessionCache) : null
|
||
, o = {
|
||
version: {
|
||
major: l.Version.major,
|
||
minor: l.Version.minor
|
||
},
|
||
entity: i,
|
||
sessionId: e.sessionId,
|
||
caStore: t,
|
||
sessionCache: s,
|
||
cipherSuites: r,
|
||
connected: e.connected,
|
||
virtualHost: e.virtualHost || null,
|
||
verifyClient: e.verifyClient || !1,
|
||
verify: e.verify || function(e, t, r, a) {
|
||
return t
|
||
}
|
||
,
|
||
verifyOptions: e.verifyOptions || {},
|
||
getCertificate: e.getCertificate || null,
|
||
getPrivateKey: e.getPrivateKey || null,
|
||
getSignature: e.getSignature || null,
|
||
input: a.util.createBuffer(),
|
||
tlsData: a.util.createBuffer(),
|
||
data: a.util.createBuffer(),
|
||
tlsDataReady: e.tlsDataReady,
|
||
dataReady: e.dataReady,
|
||
heartbeatReceived: e.heartbeatReceived,
|
||
closed: e.closed,
|
||
error: function(t, r) {
|
||
r.origin = r.origin || (t.entity === l.ConnectionEnd.client ? "client" : "server"),
|
||
r.send && (l.queue(t, l.createAlert(t, r.alert)),
|
||
l.flush(t));
|
||
var a = !1 !== r.fatal;
|
||
a && (t.fail = !0),
|
||
e.error(t, r),
|
||
a && t.close(!1)
|
||
},
|
||
deflate: e.deflate || null,
|
||
inflate: e.inflate || null
|
||
};
|
||
o.reset = function(e) {
|
||
o.version = {
|
||
major: l.Version.major,
|
||
minor: l.Version.minor
|
||
},
|
||
o.record = null,
|
||
o.session = null,
|
||
o.peerCertificate = null,
|
||
o.state = {
|
||
pending: null,
|
||
current: null
|
||
},
|
||
o.expect = (o.entity,
|
||
l.ConnectionEnd.client,
|
||
0),
|
||
o.fragmented = null,
|
||
o.records = [],
|
||
o.open = !1,
|
||
o.handshakes = 0,
|
||
o.handshaking = !1,
|
||
o.isConnected = !1,
|
||
o.fail = !(e || void 0 === e),
|
||
o.input.clear(),
|
||
o.tlsData.clear(),
|
||
o.data.clear(),
|
||
o.state.current = l.createConnectionState(o)
|
||
}
|
||
,
|
||
o.reset();
|
||
var c = function(e, t) {
|
||
var r = t.type - l.ContentType.change_cipher_spec
|
||
, a = _[e.entity][e.expect];
|
||
r in a ? a[r](e, t) : l.handleUnexpected(e, t)
|
||
}
|
||
, u = function(e) {
|
||
var t = 0
|
||
, r = e.input
|
||
, n = r.length();
|
||
if (n < 5)
|
||
t = 5 - n;
|
||
else {
|
||
e.record = {
|
||
type: r.getByte(),
|
||
version: {
|
||
major: r.getByte(),
|
||
minor: r.getByte()
|
||
},
|
||
length: r.getInt16(),
|
||
fragment: a.util.createBuffer(),
|
||
ready: !1
|
||
};
|
||
var i = e.record.version.major === e.version.major;
|
||
i && e.session && e.session.version && (i = e.record.version.minor === e.version.minor),
|
||
i || e.error(e, {
|
||
message: "Incompatible TLS version.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.protocol_version
|
||
}
|
||
})
|
||
}
|
||
return t
|
||
}
|
||
, p = function(e) {
|
||
var t = 0
|
||
, r = e.input
|
||
, a = r.length();
|
||
if (a < e.record.length)
|
||
t = e.record.length - a;
|
||
else {
|
||
e.record.fragment.putBytes(r.getBytes(e.record.length)),
|
||
r.compact();
|
||
e.state.current.read.update(e, e.record) && (null !== e.fragmented && (e.fragmented.type === e.record.type ? (e.fragmented.fragment.putBuffer(e.record.fragment),
|
||
e.record = e.fragmented) : e.error(e, {
|
||
message: "Invalid fragmented record.",
|
||
send: !0,
|
||
alert: {
|
||
level: l.Alert.Level.fatal,
|
||
description: l.Alert.Description.unexpected_message
|
||
}
|
||
})),
|
||
e.record.ready = !0)
|
||
}
|
||
return t
|
||
};
|
||
return o.handshake = function(e) {
|
||
if (o.entity !== l.ConnectionEnd.client)
|
||
o.error(o, {
|
||
message: "Cannot initiate handshake as a server.",
|
||
fatal: !1
|
||
});
|
||
else if (o.handshaking)
|
||
o.error(o, {
|
||
message: "Handshake already in progress.",
|
||
fatal: !1
|
||
});
|
||
else {
|
||
o.fail && !o.open && 0 === o.handshakes && (o.fail = !1),
|
||
o.handshaking = !0,
|
||
e = e || "";
|
||
var t = null;
|
||
e.length > 0 && (o.sessionCache && (t = o.sessionCache.getSession(e)),
|
||
null === t && (e = "")),
|
||
0 === e.length && o.sessionCache && null !== (t = o.sessionCache.getSession()) && (e = t.id),
|
||
o.session = {
|
||
id: e,
|
||
version: null,
|
||
cipherSuite: null,
|
||
compressionMethod: null,
|
||
serverCertificate: null,
|
||
certificateRequest: null,
|
||
clientCertificate: null,
|
||
sp: {},
|
||
md5: a.md.md5.create(),
|
||
sha1: a.md.sha1.create()
|
||
},
|
||
t && (o.version = t.version,
|
||
o.session.sp = t.sp),
|
||
o.session.sp.client_random = l.createRandom().getBytes(),
|
||
o.open = !0,
|
||
l.queue(o, l.createRecord(o, {
|
||
type: l.ContentType.handshake,
|
||
data: l.createClientHello(o)
|
||
})),
|
||
l.flush(o)
|
||
}
|
||
}
|
||
,
|
||
o.process = function(e) {
|
||
var t = 0;
|
||
return e && o.input.putBytes(e),
|
||
o.fail || (null !== o.record && o.record.ready && o.record.fragment.isEmpty() && (o.record = null),
|
||
null === o.record && (t = u(o)),
|
||
o.fail || null === o.record || o.record.ready || (t = p(o)),
|
||
!o.fail && null !== o.record && o.record.ready && c(o, o.record)),
|
||
t
|
||
}
|
||
,
|
||
o.prepare = function(e) {
|
||
return l.queue(o, l.createRecord(o, {
|
||
type: l.ContentType.application_data,
|
||
data: a.util.createBuffer(e)
|
||
})),
|
||
l.flush(o)
|
||
}
|
||
,
|
||
o.prepareHeartbeatRequest = function(e, t) {
|
||
return e instanceof a.util.ByteBuffer && (e = e.bytes()),
|
||
void 0 === t && (t = e.length),
|
||
o.expectedHeartbeatPayload = e,
|
||
l.queue(o, l.createRecord(o, {
|
||
type: l.ContentType.heartbeat,
|
||
data: l.createHeartbeat(l.HeartbeatMessageType.heartbeat_request, e, t)
|
||
})),
|
||
l.flush(o)
|
||
}
|
||
,
|
||
o.close = function(e) {
|
||
if (!o.fail && o.sessionCache && o.session) {
|
||
var t = {
|
||
id: o.session.id,
|
||
version: o.session.version,
|
||
sp: o.session.sp
|
||
};
|
||
t.sp.keys = null,
|
||
o.sessionCache.setSession(t.id, t)
|
||
}
|
||
o.open && (o.open = !1,
|
||
o.input.clear(),
|
||
(o.isConnected || o.handshaking) && (o.isConnected = o.handshaking = !1,
|
||
l.queue(o, l.createAlert(o, {
|
||
level: l.Alert.Level.warning,
|
||
description: l.Alert.Description.close_notify
|
||
})),
|
||
l.flush(o)),
|
||
o.closed(o)),
|
||
o.reset(e)
|
||
}
|
||
,
|
||
o
|
||
}
|
||
,
|
||
e.exports = a.tls = a.tls || {};
|
||
for (var H in l)
|
||
"function" != typeof l[H] && (a.tls[H] = l[H]);
|
||
a.tls.prf_tls1 = n,
|
||
a.tls.hmac_sha1 = i,
|
||
a.tls.createSessionCache = l.createSessionCache,
|
||
a.tls.createConnection = l.createConnection
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(3),
|
||
r(6),
|
||
r(22),
|
||
r(7),
|
||
r(15),
|
||
r(28),
|
||
r(18),
|
||
r(11),
|
||
r(1),
|
||
r(17);
|
||
var n = a.asn1
|
||
, i = e.exports = a.pki = a.pki || {};
|
||
i.pemToDer = function(e) {
|
||
var t = a.pem.decode(e)[0];
|
||
if (t.procType && "ENCRYPTED" === t.procType.type)
|
||
throw new Error("Could not convert PEM to DER; PEM is encrypted.");
|
||
return a.util.createBuffer(t.body)
|
||
}
|
||
,
|
||
i.privateKeyFromPem = function(e) {
|
||
var t = a.pem.decode(e)[0];
|
||
if ("PRIVATE KEY" !== t.type && "RSA PRIVATE KEY" !== t.type) {
|
||
var r = new Error('Could not convert private key from PEM; PEM header type is not "PRIVATE KEY" or "RSA PRIVATE KEY".');
|
||
throw r.headerType = t.type,
|
||
r
|
||
}
|
||
if (t.procType && "ENCRYPTED" === t.procType.type)
|
||
throw new Error("Could not convert private key from PEM; PEM is encrypted.");
|
||
var s = n.fromDer(t.body);
|
||
return i.privateKeyFromAsn1(s)
|
||
}
|
||
,
|
||
i.privateKeyToPem = function(e, t) {
|
||
var r = {
|
||
type: "RSA PRIVATE KEY",
|
||
body: n.toDer(i.privateKeyToAsn1(e)).getBytes()
|
||
};
|
||
return a.pem.encode(r, {
|
||
maxline: t
|
||
})
|
||
}
|
||
,
|
||
i.privateKeyInfoToPem = function(e, t) {
|
||
var r = {
|
||
type: "PRIVATE KEY",
|
||
body: n.toDer(e).getBytes()
|
||
};
|
||
return a.pem.encode(r, {
|
||
maxline: t
|
||
})
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e, t) {
|
||
return e.start().update(t).digest().getBytes()
|
||
}
|
||
function n(e) {
|
||
var t;
|
||
if (e) {
|
||
if (!(t = l.oids[u.derToOid(e)])) {
|
||
var r = new Error("Unsupported PRF OID.");
|
||
throw r.oid = e,
|
||
r.supported = ["hmacWithSHA1", "hmacWithSHA224", "hmacWithSHA256", "hmacWithSHA384", "hmacWithSHA512"],
|
||
r
|
||
}
|
||
} else
|
||
t = "hmacWithSHA1";
|
||
return i(t)
|
||
}
|
||
function i(e) {
|
||
var t = o.md;
|
||
switch (e) {
|
||
case "hmacWithSHA224":
|
||
t = o.md.sha512;
|
||
case "hmacWithSHA1":
|
||
case "hmacWithSHA256":
|
||
case "hmacWithSHA384":
|
||
case "hmacWithSHA512":
|
||
e = e.substr(8).toLowerCase();
|
||
break;
|
||
default:
|
||
var r = new Error("Unsupported PRF algorithm.");
|
||
throw r.algorithm = e,
|
||
r.supported = ["hmacWithSHA1", "hmacWithSHA224", "hmacWithSHA256", "hmacWithSHA384", "hmacWithSHA512"],
|
||
r
|
||
}
|
||
if (!(t && e in t))
|
||
throw new Error("Unknown hash algorithm: " + e);
|
||
return t[e].create()
|
||
}
|
||
function s(e, t, r, a) {
|
||
var n = u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OCTETSTRING, !1, e), u.create(u.Class.UNIVERSAL, u.Type.INTEGER, !1, t.getBytes())]);
|
||
return "hmacWithSHA1" !== a && n.value.push(u.create(u.Class.UNIVERSAL, u.Type.INTEGER, !1, o.util.hexToBytes(r.toString(16))), u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OID, !1, u.oidToDer(l.oids[a]).getBytes()), u.create(u.Class.UNIVERSAL, u.Type.NULL, !1, "")])),
|
||
n
|
||
}
|
||
var o = r(0);
|
||
if (r(5),
|
||
r(3),
|
||
r(10),
|
||
r(4),
|
||
r(6),
|
||
r(15),
|
||
r(7),
|
||
r(2),
|
||
r(25),
|
||
r(11),
|
||
r(1),
|
||
void 0 === c)
|
||
var c = o.jsbn.BigInteger;
|
||
var u = o.asn1
|
||
, l = o.pki = o.pki || {};
|
||
e.exports = l.pbe = o.pbe = o.pbe || {};
|
||
var p = l.oids
|
||
, f = {
|
||
name: "EncryptedPrivateKeyInfo",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "EncryptedPrivateKeyInfo.encryptionAlgorithm",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "AlgorithmIdentifier.algorithm",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.OID,
|
||
constructed: !1,
|
||
capture: "encryptionOid"
|
||
}, {
|
||
name: "AlgorithmIdentifier.parameters",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.SEQUENCE,
|
||
constructed: !0,
|
||
captureAsn1: "encryptionParams"
|
||
}]
|
||
}, {
|
||
name: "EncryptedPrivateKeyInfo.encryptedData",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.OCTETSTRING,
|
||
constructed: !1,
|
||
capture: "encryptedData"
|
||
}]
|
||
}
|
||
, h = {
|
||
name: "PBES2Algorithms",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "PBES2Algorithms.keyDerivationFunc",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "PBES2Algorithms.keyDerivationFunc.oid",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.OID,
|
||
constructed: !1,
|
||
capture: "kdfOid"
|
||
}, {
|
||
name: "PBES2Algorithms.params",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "PBES2Algorithms.params.salt",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.OCTETSTRING,
|
||
constructed: !1,
|
||
capture: "kdfSalt"
|
||
}, {
|
||
name: "PBES2Algorithms.params.iterationCount",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "kdfIterationCount"
|
||
}, {
|
||
name: "PBES2Algorithms.params.keyLength",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.INTEGER,
|
||
constructed: !1,
|
||
optional: !0,
|
||
capture: "keyLength"
|
||
}, {
|
||
name: "PBES2Algorithms.params.prf",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.SEQUENCE,
|
||
constructed: !0,
|
||
optional: !0,
|
||
value: [{
|
||
name: "PBES2Algorithms.params.prf.algorithm",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.OID,
|
||
constructed: !1,
|
||
capture: "prfOid"
|
||
}]
|
||
}]
|
||
}]
|
||
}, {
|
||
name: "PBES2Algorithms.encryptionScheme",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "PBES2Algorithms.encryptionScheme.oid",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.OID,
|
||
constructed: !1,
|
||
capture: "encOid"
|
||
}, {
|
||
name: "PBES2Algorithms.encryptionScheme.iv",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.OCTETSTRING,
|
||
constructed: !1,
|
||
capture: "encIv"
|
||
}]
|
||
}]
|
||
}
|
||
, d = {
|
||
name: "pkcs-12PbeParams",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "pkcs-12PbeParams.salt",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.OCTETSTRING,
|
||
constructed: !1,
|
||
capture: "salt"
|
||
}, {
|
||
name: "pkcs-12PbeParams.iterations",
|
||
tagClass: u.Class.UNIVERSAL,
|
||
type: u.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "iterations"
|
||
}]
|
||
};
|
||
l.encryptPrivateKeyInfo = function(e, t, r) {
|
||
r = r || {},
|
||
r.saltSize = r.saltSize || 8,
|
||
r.count = r.count || 2048,
|
||
r.algorithm = r.algorithm || "aes128",
|
||
r.prfAlgorithm = r.prfAlgorithm || "sha1";
|
||
var a, n, c, f = o.random.getBytesSync(r.saltSize), h = r.count, d = u.integerToDer(h);
|
||
if (0 === r.algorithm.indexOf("aes") || "des" === r.algorithm) {
|
||
var y, g, v;
|
||
switch (r.algorithm) {
|
||
case "aes128":
|
||
a = 16,
|
||
y = 16,
|
||
g = p["aes128-CBC"],
|
||
v = o.aes.createEncryptionCipher;
|
||
break;
|
||
case "aes192":
|
||
a = 24,
|
||
y = 16,
|
||
g = p["aes192-CBC"],
|
||
v = o.aes.createEncryptionCipher;
|
||
break;
|
||
case "aes256":
|
||
a = 32,
|
||
y = 16,
|
||
g = p["aes256-CBC"],
|
||
v = o.aes.createEncryptionCipher;
|
||
break;
|
||
case "des":
|
||
a = 8,
|
||
y = 8,
|
||
g = p.desCBC,
|
||
v = o.des.createEncryptionCipher;
|
||
break;
|
||
default:
|
||
var m = new Error("Cannot encrypt private key. Unknown encryption algorithm.");
|
||
throw m.algorithm = r.algorithm,
|
||
m
|
||
}
|
||
var C = "hmacWith" + r.prfAlgorithm.toUpperCase()
|
||
, E = i(C)
|
||
, S = o.pkcs5.pbkdf2(t, f, h, a, E)
|
||
, T = o.random.getBytesSync(y)
|
||
, I = v(S);
|
||
I.start(T),
|
||
I.update(u.toDer(e)),
|
||
I.finish(),
|
||
c = I.output.getBytes();
|
||
var b = s(f, d, a, C);
|
||
n = u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OID, !1, u.oidToDer(p.pkcs5PBES2).getBytes()), u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OID, !1, u.oidToDer(p.pkcs5PBKDF2).getBytes()), b]), u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OID, !1, u.oidToDer(g).getBytes()), u.create(u.Class.UNIVERSAL, u.Type.OCTETSTRING, !1, T)])])])
|
||
} else {
|
||
if ("3des" !== r.algorithm) {
|
||
var m = new Error("Cannot encrypt private key. Unknown encryption algorithm.");
|
||
throw m.algorithm = r.algorithm,
|
||
m
|
||
}
|
||
a = 24;
|
||
var A = new o.util.ByteBuffer(f)
|
||
, S = l.pbe.generatePkcs12Key(t, A, 1, h, a)
|
||
, T = l.pbe.generatePkcs12Key(t, A, 2, h, a)
|
||
, I = o.des.createEncryptionCipher(S);
|
||
I.start(T),
|
||
I.update(u.toDer(e)),
|
||
I.finish(),
|
||
c = I.output.getBytes(),
|
||
n = u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OID, !1, u.oidToDer(p["pbeWithSHAAnd3-KeyTripleDES-CBC"]).getBytes()), u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OCTETSTRING, !1, f), u.create(u.Class.UNIVERSAL, u.Type.INTEGER, !1, d.getBytes())])])
|
||
}
|
||
return u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [n, u.create(u.Class.UNIVERSAL, u.Type.OCTETSTRING, !1, c)])
|
||
}
|
||
,
|
||
l.decryptPrivateKeyInfo = function(e, t) {
|
||
var r = null
|
||
, a = {}
|
||
, n = [];
|
||
if (!u.validate(e, f, a, n)) {
|
||
var i = new Error("Cannot read encrypted private key. ASN.1 object is not a supported EncryptedPrivateKeyInfo.");
|
||
throw i.errors = n,
|
||
i
|
||
}
|
||
var s = u.derToOid(a.encryptionOid)
|
||
, c = l.pbe.getCipher(s, a.encryptionParams, t)
|
||
, p = o.util.createBuffer(a.encryptedData);
|
||
return c.update(p),
|
||
c.finish() && (r = u.fromDer(c.output)),
|
||
r
|
||
}
|
||
,
|
||
l.encryptedPrivateKeyToPem = function(e, t) {
|
||
var r = {
|
||
type: "ENCRYPTED PRIVATE KEY",
|
||
body: u.toDer(e).getBytes()
|
||
};
|
||
return o.pem.encode(r, {
|
||
maxline: t
|
||
})
|
||
}
|
||
,
|
||
l.encryptedPrivateKeyFromPem = function(e) {
|
||
var t = o.pem.decode(e)[0];
|
||
if ("ENCRYPTED PRIVATE KEY" !== t.type) {
|
||
var r = new Error('Could not convert encrypted private key from PEM; PEM header type is "ENCRYPTED PRIVATE KEY".');
|
||
throw r.headerType = t.type,
|
||
r
|
||
}
|
||
if (t.procType && "ENCRYPTED" === t.procType.type)
|
||
throw new Error("Could not convert encrypted private key from PEM; PEM is encrypted.");
|
||
return u.fromDer(t.body)
|
||
}
|
||
,
|
||
l.encryptRsaPrivateKey = function(e, t, r) {
|
||
if (r = r || {},
|
||
!r.legacy) {
|
||
var a = l.wrapRsaPrivateKey(l.privateKeyToAsn1(e));
|
||
return a = l.encryptPrivateKeyInfo(a, t, r),
|
||
l.encryptedPrivateKeyToPem(a)
|
||
}
|
||
var n, i, s, c;
|
||
switch (r.algorithm) {
|
||
case "aes128":
|
||
n = "AES-128-CBC",
|
||
s = 16,
|
||
i = o.random.getBytesSync(16),
|
||
c = o.aes.createEncryptionCipher;
|
||
break;
|
||
case "aes192":
|
||
n = "AES-192-CBC",
|
||
s = 24,
|
||
i = o.random.getBytesSync(16),
|
||
c = o.aes.createEncryptionCipher;
|
||
break;
|
||
case "aes256":
|
||
n = "AES-256-CBC",
|
||
s = 32,
|
||
i = o.random.getBytesSync(16),
|
||
c = o.aes.createEncryptionCipher;
|
||
break;
|
||
case "3des":
|
||
n = "DES-EDE3-CBC",
|
||
s = 24,
|
||
i = o.random.getBytesSync(8),
|
||
c = o.des.createEncryptionCipher;
|
||
break;
|
||
case "des":
|
||
n = "DES-CBC",
|
||
s = 8,
|
||
i = o.random.getBytesSync(8),
|
||
c = o.des.createEncryptionCipher;
|
||
break;
|
||
default:
|
||
var p = new Error('Could not encrypt RSA private key; unsupported encryption algorithm "' + r.algorithm + '".');
|
||
throw p.algorithm = r.algorithm,
|
||
p
|
||
}
|
||
var f = o.pbe.opensslDeriveBytes(t, i.substr(0, 8), s)
|
||
, h = c(f);
|
||
h.start(i),
|
||
h.update(u.toDer(l.privateKeyToAsn1(e))),
|
||
h.finish();
|
||
var d = {
|
||
type: "RSA PRIVATE KEY",
|
||
procType: {
|
||
version: "4",
|
||
type: "ENCRYPTED"
|
||
},
|
||
dekInfo: {
|
||
algorithm: n,
|
||
parameters: o.util.bytesToHex(i).toUpperCase()
|
||
},
|
||
body: h.output.getBytes()
|
||
};
|
||
return o.pem.encode(d)
|
||
}
|
||
,
|
||
l.decryptRsaPrivateKey = function(e, t) {
|
||
var r = null
|
||
, a = o.pem.decode(e)[0];
|
||
if ("ENCRYPTED PRIVATE KEY" !== a.type && "PRIVATE KEY" !== a.type && "RSA PRIVATE KEY" !== a.type) {
|
||
var n = new Error('Could not convert private key from PEM; PEM header type is not "ENCRYPTED PRIVATE KEY", "PRIVATE KEY", or "RSA PRIVATE KEY".');
|
||
throw n.headerType = n,
|
||
n
|
||
}
|
||
if (a.procType && "ENCRYPTED" === a.procType.type) {
|
||
var i, s;
|
||
switch (a.dekInfo.algorithm) {
|
||
case "DES-CBC":
|
||
i = 8,
|
||
s = o.des.createDecryptionCipher;
|
||
break;
|
||
case "DES-EDE3-CBC":
|
||
i = 24,
|
||
s = o.des.createDecryptionCipher;
|
||
break;
|
||
case "AES-128-CBC":
|
||
i = 16,
|
||
s = o.aes.createDecryptionCipher;
|
||
break;
|
||
case "AES-192-CBC":
|
||
i = 24,
|
||
s = o.aes.createDecryptionCipher;
|
||
break;
|
||
case "AES-256-CBC":
|
||
i = 32,
|
||
s = o.aes.createDecryptionCipher;
|
||
break;
|
||
case "RC2-40-CBC":
|
||
i = 5,
|
||
s = function(e) {
|
||
return o.rc2.createDecryptionCipher(e, 40)
|
||
}
|
||
;
|
||
break;
|
||
case "RC2-64-CBC":
|
||
i = 8,
|
||
s = function(e) {
|
||
return o.rc2.createDecryptionCipher(e, 64)
|
||
}
|
||
;
|
||
break;
|
||
case "RC2-128-CBC":
|
||
i = 16,
|
||
s = function(e) {
|
||
return o.rc2.createDecryptionCipher(e, 128)
|
||
}
|
||
;
|
||
break;
|
||
default:
|
||
var n = new Error('Could not decrypt private key; unsupported encryption algorithm "' + a.dekInfo.algorithm + '".');
|
||
throw n.algorithm = a.dekInfo.algorithm,
|
||
n
|
||
}
|
||
var c = o.util.hexToBytes(a.dekInfo.parameters)
|
||
, p = o.pbe.opensslDeriveBytes(t, c.substr(0, 8), i)
|
||
, f = s(p);
|
||
if (f.start(c),
|
||
f.update(o.util.createBuffer(a.body)),
|
||
!f.finish())
|
||
return r;
|
||
r = f.output.getBytes()
|
||
} else
|
||
r = a.body;
|
||
return r = "ENCRYPTED PRIVATE KEY" === a.type ? l.decryptPrivateKeyInfo(u.fromDer(r), t) : u.fromDer(r),
|
||
null !== r && (r = l.privateKeyFromAsn1(r)),
|
||
r
|
||
}
|
||
,
|
||
l.pbe.generatePkcs12Key = function(e, t, r, a, n, i) {
|
||
var s, c;
|
||
if (void 0 === i || null === i) {
|
||
if (!("sha1"in o.md))
|
||
throw new Error('"sha1" hash algorithm unavailable.');
|
||
i = o.md.sha1.create()
|
||
}
|
||
var u = i.digestLength
|
||
, l = i.blockLength
|
||
, p = new o.util.ByteBuffer
|
||
, f = new o.util.ByteBuffer;
|
||
if (null !== e && void 0 !== e) {
|
||
for (c = 0; c < e.length; c++)
|
||
f.putInt16(e.charCodeAt(c));
|
||
f.putInt16(0)
|
||
}
|
||
var h = f.length()
|
||
, d = t.length()
|
||
, y = new o.util.ByteBuffer;
|
||
y.fillWithByte(r, l);
|
||
var g = l * Math.ceil(d / l)
|
||
, v = new o.util.ByteBuffer;
|
||
for (c = 0; c < g; c++)
|
||
v.putByte(t.at(c % d));
|
||
var m = l * Math.ceil(h / l)
|
||
, C = new o.util.ByteBuffer;
|
||
for (c = 0; c < m; c++)
|
||
C.putByte(f.at(c % h));
|
||
var E = v;
|
||
E.putBuffer(C);
|
||
for (var S = Math.ceil(n / u), T = 1; T <= S; T++) {
|
||
var I = new o.util.ByteBuffer;
|
||
I.putBytes(y.bytes()),
|
||
I.putBytes(E.bytes());
|
||
for (var b = 0; b < a; b++)
|
||
i.start(),
|
||
i.update(I.getBytes()),
|
||
I = i.digest();
|
||
var A = new o.util.ByteBuffer;
|
||
for (c = 0; c < l; c++)
|
||
A.putByte(I.at(c % u));
|
||
var B = Math.ceil(d / l) + Math.ceil(h / l)
|
||
, N = new o.util.ByteBuffer;
|
||
for (s = 0; s < B; s++) {
|
||
var k = new o.util.ByteBuffer(E.getBytes(l))
|
||
, w = 511;
|
||
for (c = A.length() - 1; c >= 0; c--)
|
||
w >>= 8,
|
||
w += A.at(c) + k.at(c),
|
||
k.setAt(c, 255 & w);
|
||
N.putBuffer(k)
|
||
}
|
||
E = N,
|
||
p.putBuffer(I)
|
||
}
|
||
return p.truncate(p.length() - n),
|
||
p
|
||
}
|
||
,
|
||
l.pbe.getCipher = function(e, t, r) {
|
||
switch (e) {
|
||
case l.oids.pkcs5PBES2:
|
||
return l.pbe.getCipherForPBES2(e, t, r);
|
||
case l.oids["pbeWithSHAAnd3-KeyTripleDES-CBC"]:
|
||
case l.oids["pbewithSHAAnd40BitRC2-CBC"]:
|
||
return l.pbe.getCipherForPKCS12PBE(e, t, r);
|
||
default:
|
||
var a = new Error("Cannot read encrypted PBE data block. Unsupported OID.");
|
||
throw a.oid = e,
|
||
a.supportedOids = ["pkcs5PBES2", "pbeWithSHAAnd3-KeyTripleDES-CBC", "pbewithSHAAnd40BitRC2-CBC"],
|
||
a
|
||
}
|
||
}
|
||
,
|
||
l.pbe.getCipherForPBES2 = function(e, t, r) {
|
||
var a = {}
|
||
, i = [];
|
||
if (!u.validate(t, h, a, i)) {
|
||
var s = new Error("Cannot read password-based-encryption algorithm parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo.");
|
||
throw s.errors = i,
|
||
s
|
||
}
|
||
if ((e = u.derToOid(a.kdfOid)) !== l.oids.pkcs5PBKDF2) {
|
||
var s = new Error("Cannot read encrypted private key. Unsupported key derivation function OID.");
|
||
throw s.oid = e,
|
||
s.supportedOids = ["pkcs5PBKDF2"],
|
||
s
|
||
}
|
||
if ((e = u.derToOid(a.encOid)) !== l.oids["aes128-CBC"] && e !== l.oids["aes192-CBC"] && e !== l.oids["aes256-CBC"] && e !== l.oids["des-EDE3-CBC"] && e !== l.oids.desCBC) {
|
||
var s = new Error("Cannot read encrypted private key. Unsupported encryption scheme OID.");
|
||
throw s.oid = e,
|
||
s.supportedOids = ["aes128-CBC", "aes192-CBC", "aes256-CBC", "des-EDE3-CBC", "desCBC"],
|
||
s
|
||
}
|
||
var c = a.kdfSalt
|
||
, p = o.util.createBuffer(a.kdfIterationCount);
|
||
p = p.getInt(p.length() << 3);
|
||
var f, d;
|
||
switch (l.oids[e]) {
|
||
case "aes128-CBC":
|
||
f = 16,
|
||
d = o.aes.createDecryptionCipher;
|
||
break;
|
||
case "aes192-CBC":
|
||
f = 24,
|
||
d = o.aes.createDecryptionCipher;
|
||
break;
|
||
case "aes256-CBC":
|
||
f = 32,
|
||
d = o.aes.createDecryptionCipher;
|
||
break;
|
||
case "des-EDE3-CBC":
|
||
f = 24,
|
||
d = o.des.createDecryptionCipher;
|
||
break;
|
||
case "desCBC":
|
||
f = 8,
|
||
d = o.des.createDecryptionCipher
|
||
}
|
||
var y = n(a.prfOid)
|
||
, g = o.pkcs5.pbkdf2(r, c, p, f, y)
|
||
, v = a.encIv
|
||
, m = d(g);
|
||
return m.start(v),
|
||
m
|
||
}
|
||
,
|
||
l.pbe.getCipherForPKCS12PBE = function(e, t, r) {
|
||
var a = {}
|
||
, i = [];
|
||
if (!u.validate(t, d, a, i)) {
|
||
var s = new Error("Cannot read password-based-encryption algorithm parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo.");
|
||
throw s.errors = i,
|
||
s
|
||
}
|
||
var c = o.util.createBuffer(a.salt)
|
||
, p = o.util.createBuffer(a.iterations);
|
||
p = p.getInt(p.length() << 3);
|
||
var f, h, y;
|
||
switch (e) {
|
||
case l.oids["pbeWithSHAAnd3-KeyTripleDES-CBC"]:
|
||
f = 24,
|
||
h = 8,
|
||
y = o.des.startDecrypting;
|
||
break;
|
||
case l.oids["pbewithSHAAnd40BitRC2-CBC"]:
|
||
f = 5,
|
||
h = 8,
|
||
y = function(e, t) {
|
||
var r = o.rc2.createDecryptionCipher(e, 40);
|
||
return r.start(t, null),
|
||
r
|
||
}
|
||
;
|
||
break;
|
||
default:
|
||
var s = new Error("Cannot read PKCS #12 PBE data block. Unsupported OID.");
|
||
throw s.oid = e,
|
||
s
|
||
}
|
||
var g = n(a.prfOid)
|
||
, v = l.pbe.generatePkcs12Key(r, c, 1, p, f, g);
|
||
return g.start(),
|
||
y(v, l.pbe.generatePkcs12Key(r, c, 2, p, h, g))
|
||
}
|
||
,
|
||
l.pbe.opensslDeriveBytes = function(e, t, r, n) {
|
||
if (void 0 === n || null === n) {
|
||
if (!("md5"in o.md))
|
||
throw new Error('"md5" hash algorithm unavailable.');
|
||
n = o.md.md5.create()
|
||
}
|
||
null === t && (t = "");
|
||
for (var i = [a(n, e + t)], s = 16, c = 1; s < r; ++c,
|
||
s += 16)
|
||
i.push(a(n, i[c - 1] + e + t));
|
||
return i.join("").substr(0, r)
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
function a() {
|
||
o = String.fromCharCode(128),
|
||
o += i.util.fillString(String.fromCharCode(0), 64),
|
||
u = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298],
|
||
c = !0
|
||
}
|
||
function n(e, t, r) {
|
||
for (var a, n, i, s, o, c, l, p, f, h, d, y, g, v, m, C = r.length(); C >= 64; ) {
|
||
for (l = 0; l < 16; ++l)
|
||
t[l] = r.getInt32();
|
||
for (; l < 64; ++l)
|
||
a = t[l - 2],
|
||
a = (a >>> 17 | a << 15) ^ (a >>> 19 | a << 13) ^ a >>> 10,
|
||
n = t[l - 15],
|
||
n = (n >>> 7 | n << 25) ^ (n >>> 18 | n << 14) ^ n >>> 3,
|
||
t[l] = a + t[l - 7] + n + t[l - 16] | 0;
|
||
for (p = e.h0,
|
||
f = e.h1,
|
||
h = e.h2,
|
||
d = e.h3,
|
||
y = e.h4,
|
||
g = e.h5,
|
||
v = e.h6,
|
||
m = e.h7,
|
||
l = 0; l < 64; ++l)
|
||
s = (y >>> 6 | y << 26) ^ (y >>> 11 | y << 21) ^ (y >>> 25 | y << 7),
|
||
o = v ^ y & (g ^ v),
|
||
i = (p >>> 2 | p << 30) ^ (p >>> 13 | p << 19) ^ (p >>> 22 | p << 10),
|
||
c = p & f | h & (p ^ f),
|
||
a = m + s + o + u[l] + t[l],
|
||
n = i + c,
|
||
m = v,
|
||
v = g,
|
||
g = y,
|
||
y = d + a >>> 0,
|
||
d = h,
|
||
h = f,
|
||
f = p,
|
||
p = a + n >>> 0;
|
||
e.h0 = e.h0 + p | 0,
|
||
e.h1 = e.h1 + f | 0,
|
||
e.h2 = e.h2 + h | 0,
|
||
e.h3 = e.h3 + d | 0,
|
||
e.h4 = e.h4 + y | 0,
|
||
e.h5 = e.h5 + g | 0,
|
||
e.h6 = e.h6 + v | 0,
|
||
e.h7 = e.h7 + m | 0,
|
||
C -= 64
|
||
}
|
||
}
|
||
var i = r(0);
|
||
r(4),
|
||
r(1);
|
||
var s = e.exports = i.sha256 = i.sha256 || {};
|
||
i.md.sha256 = i.md.algorithms.sha256 = s,
|
||
s.create = function() {
|
||
c || a();
|
||
var e = null
|
||
, t = i.util.createBuffer()
|
||
, r = new Array(64)
|
||
, s = {
|
||
algorithm: "sha256",
|
||
blockLength: 64,
|
||
digestLength: 32,
|
||
messageLength: 0,
|
||
fullMessageLength: null,
|
||
messageLengthSize: 8
|
||
};
|
||
return s.start = function() {
|
||
s.messageLength = 0,
|
||
s.fullMessageLength = s.messageLength64 = [];
|
||
for (var r = s.messageLengthSize / 4, a = 0; a < r; ++a)
|
||
s.fullMessageLength.push(0);
|
||
return t = i.util.createBuffer(),
|
||
e = {
|
||
h0: 1779033703,
|
||
h1: 3144134277,
|
||
h2: 1013904242,
|
||
h3: 2773480762,
|
||
h4: 1359893119,
|
||
h5: 2600822924,
|
||
h6: 528734635,
|
||
h7: 1541459225
|
||
},
|
||
s
|
||
}
|
||
,
|
||
s.start(),
|
||
s.update = function(a, o) {
|
||
"utf8" === o && (a = i.util.encodeUtf8(a));
|
||
var c = a.length;
|
||
s.messageLength += c,
|
||
c = [c / 4294967296 >>> 0, c >>> 0];
|
||
for (var u = s.fullMessageLength.length - 1; u >= 0; --u)
|
||
s.fullMessageLength[u] += c[1],
|
||
c[1] = c[0] + (s.fullMessageLength[u] / 4294967296 >>> 0),
|
||
s.fullMessageLength[u] = s.fullMessageLength[u] >>> 0,
|
||
c[0] = c[1] / 4294967296 >>> 0;
|
||
return t.putBytes(a),
|
||
n(e, r, t),
|
||
(t.read > 2048 || 0 === t.length()) && t.compact(),
|
||
s
|
||
}
|
||
,
|
||
s.digest = function() {
|
||
var a = i.util.createBuffer();
|
||
a.putBytes(t.bytes());
|
||
var c = s.fullMessageLength[s.fullMessageLength.length - 1] + s.messageLengthSize
|
||
, u = c & s.blockLength - 1;
|
||
a.putBytes(o.substr(0, s.blockLength - u));
|
||
for (var l, p, f = 8 * s.fullMessageLength[0], h = 0; h < s.fullMessageLength.length - 1; ++h)
|
||
l = 8 * s.fullMessageLength[h + 1],
|
||
p = l / 4294967296 >>> 0,
|
||
f += p,
|
||
a.putInt32(f >>> 0),
|
||
f = l >>> 0;
|
||
a.putInt32(f);
|
||
var d = {
|
||
h0: e.h0,
|
||
h1: e.h1,
|
||
h2: e.h2,
|
||
h3: e.h3,
|
||
h4: e.h4,
|
||
h5: e.h5,
|
||
h6: e.h6,
|
||
h7: e.h7
|
||
};
|
||
n(d, r, a);
|
||
var y = i.util.createBuffer();
|
||
return y.putInt32(d.h0),
|
||
y.putInt32(d.h1),
|
||
y.putInt32(d.h2),
|
||
y.putInt32(d.h3),
|
||
y.putInt32(d.h4),
|
||
y.putInt32(d.h5),
|
||
y.putInt32(d.h6),
|
||
y.putInt32(d.h7),
|
||
y
|
||
}
|
||
,
|
||
s
|
||
}
|
||
;
|
||
var o = null
|
||
, c = !1
|
||
, u = null
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(1);
|
||
var n = null;
|
||
!a.util.isNodejs || a.options.usePureJavaScript || process.versions["node-webkit"] || (n = r(16)),
|
||
(e.exports = a.prng = a.prng || {}).create = function(e) {
|
||
function t(e) {
|
||
if (o.pools[0].messageLength >= 32)
|
||
return i(),
|
||
e();
|
||
var t = 32 - o.pools[0].messageLength << 5;
|
||
o.seedFile(t, function(t, r) {
|
||
if (t)
|
||
return e(t);
|
||
o.collect(r),
|
||
i(),
|
||
e()
|
||
})
|
||
}
|
||
function r() {
|
||
if (o.pools[0].messageLength >= 32)
|
||
return i();
|
||
var e = 32 - o.pools[0].messageLength << 5;
|
||
o.collect(o.seedFileSync(e)),
|
||
i()
|
||
}
|
||
function i() {
|
||
o.reseeds = 4294967295 === o.reseeds ? 0 : o.reseeds + 1;
|
||
var e = o.plugin.md.create();
|
||
e.update(o.keyBytes);
|
||
for (var t = 1, r = 0; r < 32; ++r)
|
||
o.reseeds % t == 0 && (e.update(o.pools[r].digest().getBytes()),
|
||
o.pools[r].start()),
|
||
t <<= 1;
|
||
o.keyBytes = e.digest().getBytes(),
|
||
e.start(),
|
||
e.update(o.keyBytes);
|
||
var a = e.digest().getBytes();
|
||
o.key = o.plugin.formatKey(o.keyBytes),
|
||
o.seed = o.plugin.formatSeed(a),
|
||
o.generated = 0
|
||
}
|
||
function s(e) {
|
||
var t = null
|
||
, r = a.util.globalScope
|
||
, n = r.crypto || r.msCrypto;
|
||
n && n.getRandomValues && (t = function(e) {
|
||
return n.getRandomValues(e)
|
||
}
|
||
);
|
||
var i = a.util.createBuffer();
|
||
if (t)
|
||
for (; i.length() < e; ) {
|
||
var s = Math.max(1, Math.min(e - i.length(), 65536) / 4)
|
||
, o = new Uint32Array(Math.floor(s));
|
||
try {
|
||
t(o);
|
||
for (var c = 0; c < o.length; ++c)
|
||
i.putInt32(o[c])
|
||
} catch (e) {
|
||
if (!("undefined" != typeof QuotaExceededError && e instanceof QuotaExceededError))
|
||
throw e
|
||
}
|
||
}
|
||
if (i.length() < e)
|
||
for (var u, l, p, f = Math.floor(65536 * Math.random()); i.length() < e; ) {
|
||
l = 16807 * (65535 & f),
|
||
u = 16807 * (f >> 16),
|
||
l += (32767 & u) << 16,
|
||
l += u >> 15,
|
||
l = (2147483647 & l) + (l >> 31),
|
||
f = 4294967295 & l;
|
||
for (var c = 0; c < 3; ++c)
|
||
p = f >>> (c << 3),
|
||
p ^= Math.floor(256 * Math.random()),
|
||
i.putByte(String.fromCharCode(255 & p))
|
||
}
|
||
return i.getBytes(e)
|
||
}
|
||
for (var o = {
|
||
plugin: e,
|
||
key: null,
|
||
seed: null,
|
||
time: null,
|
||
reseeds: 0,
|
||
generated: 0,
|
||
keyBytes: ""
|
||
}, c = e.md, u = new Array(32), l = 0; l < 32; ++l)
|
||
u[l] = c.create();
|
||
return o.pools = u,
|
||
o.pool = 0,
|
||
o.generate = function(e, r) {
|
||
function n(p) {
|
||
if (p)
|
||
return r(p);
|
||
if (l.length() >= e)
|
||
return r(null, l.getBytes(e));
|
||
if (o.generated > 1048575 && (o.key = null),
|
||
null === o.key)
|
||
return a.util.nextTick(function() {
|
||
t(n)
|
||
});
|
||
var f = i(o.key, o.seed);
|
||
o.generated += f.length,
|
||
l.putBytes(f),
|
||
o.key = c(i(o.key, s(o.seed))),
|
||
o.seed = u(i(o.key, o.seed)),
|
||
a.util.setImmediate(n)
|
||
}
|
||
if (!r)
|
||
return o.generateSync(e);
|
||
var i = o.plugin.cipher
|
||
, s = o.plugin.increment
|
||
, c = o.plugin.formatKey
|
||
, u = o.plugin.formatSeed
|
||
, l = a.util.createBuffer();
|
||
o.key = null,
|
||
n()
|
||
}
|
||
,
|
||
o.generateSync = function(e) {
|
||
var t = o.plugin.cipher
|
||
, n = o.plugin.increment
|
||
, i = o.plugin.formatKey
|
||
, s = o.plugin.formatSeed;
|
||
o.key = null;
|
||
for (var c = a.util.createBuffer(); c.length() < e; ) {
|
||
o.generated > 1048575 && (o.key = null),
|
||
null === o.key && r();
|
||
var u = t(o.key, o.seed);
|
||
o.generated += u.length,
|
||
c.putBytes(u),
|
||
o.key = i(t(o.key, n(o.seed))),
|
||
o.seed = s(t(o.key, o.seed))
|
||
}
|
||
return c.getBytes(e)
|
||
}
|
||
,
|
||
n ? (o.seedFile = function(e, t) {
|
||
n.randomBytes(e, function(e, r) {
|
||
if (e)
|
||
return t(e);
|
||
t(null, r.toString())
|
||
})
|
||
}
|
||
,
|
||
o.seedFileSync = function(e) {
|
||
return n.randomBytes(e).toString()
|
||
}
|
||
) : (o.seedFile = function(e, t) {
|
||
try {
|
||
t(null, s(e))
|
||
} catch (e) {
|
||
t(e)
|
||
}
|
||
}
|
||
,
|
||
o.seedFileSync = s),
|
||
o.collect = function(e) {
|
||
for (var t = e.length, r = 0; r < t; ++r)
|
||
o.pools[o.pool].update(e.substr(r, 1)),
|
||
o.pool = 31 === o.pool ? 0 : o.pool + 1
|
||
}
|
||
,
|
||
o.collectInt = function(e, t) {
|
||
for (var r = "", a = 0; a < t; a += 8)
|
||
r += String.fromCharCode(e >> a & 255);
|
||
o.collect(r)
|
||
}
|
||
,
|
||
o.registerWorker = function(e) {
|
||
if (e === self)
|
||
o.seedFile = function(e, t) {
|
||
function r(e) {
|
||
var a = e.data;
|
||
a.forge && a.forge.prng && (self.removeEventListener("message", r),
|
||
t(a.forge.prng.err, a.forge.prng.bytes))
|
||
}
|
||
self.addEventListener("message", r),
|
||
self.postMessage({
|
||
forge: {
|
||
prng: {
|
||
needed: e
|
||
}
|
||
}
|
||
})
|
||
}
|
||
;
|
||
else {
|
||
var t = function(t) {
|
||
var r = t.data;
|
||
r.forge && r.forge.prng && o.seedFile(r.forge.prng.needed, function(t, r) {
|
||
e.postMessage({
|
||
forge: {
|
||
prng: {
|
||
err: t,
|
||
bytes: r
|
||
}
|
||
}
|
||
})
|
||
})
|
||
};
|
||
e.addEventListener("message", t)
|
||
}
|
||
}
|
||
,
|
||
o
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(1);
|
||
var n = [217, 120, 249, 196, 25, 221, 181, 237, 40, 233, 253, 121, 74, 160, 216, 157, 198, 126, 55, 131, 43, 118, 83, 142, 98, 76, 100, 136, 68, 139, 251, 162, 23, 154, 89, 245, 135, 179, 79, 19, 97, 69, 109, 141, 9, 129, 125, 50, 189, 143, 64, 235, 134, 183, 123, 11, 240, 149, 33, 34, 92, 107, 78, 130, 84, 214, 101, 147, 206, 96, 178, 28, 115, 86, 192, 20, 167, 140, 241, 220, 18, 117, 202, 31, 59, 190, 228, 209, 66, 61, 212, 48, 163, 60, 182, 38, 111, 191, 14, 218, 70, 105, 7, 87, 39, 242, 29, 155, 188, 148, 67, 3, 248, 17, 199, 246, 144, 239, 62, 231, 6, 195, 213, 47, 200, 102, 30, 215, 8, 232, 234, 222, 128, 82, 238, 247, 132, 170, 114, 172, 53, 77, 106, 42, 150, 26, 210, 113, 90, 21, 73, 116, 75, 159, 208, 94, 4, 24, 164, 236, 194, 224, 65, 110, 15, 81, 203, 204, 36, 145, 175, 80, 161, 244, 112, 57, 153, 124, 58, 133, 35, 184, 180, 122, 252, 2, 54, 91, 37, 85, 151, 49, 45, 93, 250, 152, 227, 138, 146, 174, 5, 223, 41, 16, 103, 108, 186, 201, 211, 0, 230, 207, 225, 158, 168, 44, 99, 22, 1, 63, 88, 226, 137, 169, 13, 56, 52, 27, 171, 51, 255, 176, 187, 72, 12, 95, 185, 177, 205, 46, 197, 243, 219, 71, 229, 165, 156, 119, 10, 166, 32, 104, 254, 127, 193, 173]
|
||
, i = [1, 2, 3, 5]
|
||
, s = function(e, t) {
|
||
return e << t & 65535 | (65535 & e) >> 16 - t
|
||
}
|
||
, o = function(e, t) {
|
||
return (65535 & e) >> t | e << 16 - t & 65535
|
||
};
|
||
e.exports = a.rc2 = a.rc2 || {},
|
||
a.rc2.expandKey = function(e, t) {
|
||
"string" == typeof e && (e = a.util.createBuffer(e)),
|
||
t = t || 128;
|
||
var r, i = e, s = e.length(), o = t, c = Math.ceil(o / 8), u = 255 >> (7 & o);
|
||
for (r = s; r < 128; r++)
|
||
i.putByte(n[i.at(r - 1) + i.at(r - s) & 255]);
|
||
for (i.setAt(128 - c, n[i.at(128 - c) & u]),
|
||
r = 127 - c; r >= 0; r--)
|
||
i.setAt(r, n[i.at(r + 1) ^ i.at(r + c)]);
|
||
return i
|
||
}
|
||
;
|
||
var c = function(e, t, r) {
|
||
var n, c, u, l, p = !1, f = null, h = null, d = null, y = [];
|
||
for (e = a.rc2.expandKey(e, t),
|
||
u = 0; u < 64; u++)
|
||
y.push(e.getInt16Le());
|
||
r ? (n = function(e) {
|
||
for (u = 0; u < 4; u++)
|
||
e[u] += y[l] + (e[(u + 3) % 4] & e[(u + 2) % 4]) + (~e[(u + 3) % 4] & e[(u + 1) % 4]),
|
||
e[u] = s(e[u], i[u]),
|
||
l++
|
||
}
|
||
,
|
||
c = function(e) {
|
||
for (u = 0; u < 4; u++)
|
||
e[u] += y[63 & e[(u + 3) % 4]]
|
||
}
|
||
) : (n = function(e) {
|
||
for (u = 3; u >= 0; u--)
|
||
e[u] = o(e[u], i[u]),
|
||
e[u] -= y[l] + (e[(u + 3) % 4] & e[(u + 2) % 4]) + (~e[(u + 3) % 4] & e[(u + 1) % 4]),
|
||
l--
|
||
}
|
||
,
|
||
c = function(e) {
|
||
for (u = 3; u >= 0; u--)
|
||
e[u] -= y[63 & e[(u + 3) % 4]]
|
||
}
|
||
);
|
||
var g = function(e) {
|
||
var t = [];
|
||
for (u = 0; u < 4; u++) {
|
||
var a = f.getInt16Le();
|
||
null !== d && (r ? a ^= d.getInt16Le() : d.putInt16Le(a)),
|
||
t.push(65535 & a)
|
||
}
|
||
l = r ? 0 : 63;
|
||
for (var n = 0; n < e.length; n++)
|
||
for (var i = 0; i < e[n][0]; i++)
|
||
e[n][1](t);
|
||
for (u = 0; u < 4; u++)
|
||
null !== d && (r ? d.putInt16Le(t[u]) : t[u] ^= d.getInt16Le()),
|
||
h.putInt16Le(t[u])
|
||
}
|
||
, v = null;
|
||
return v = {
|
||
start: function(e, t) {
|
||
e && "string" == typeof e && (e = a.util.createBuffer(e)),
|
||
p = !1,
|
||
f = a.util.createBuffer(),
|
||
h = t || new a.util.createBuffer,
|
||
d = e,
|
||
v.output = h
|
||
},
|
||
update: function(e) {
|
||
for (p || f.putBuffer(e); f.length() >= 8; )
|
||
g([[5, n], [1, c], [6, n], [1, c], [5, n]])
|
||
},
|
||
finish: function(e) {
|
||
var t = !0;
|
||
if (r)
|
||
if (e)
|
||
t = e(8, f, !r);
|
||
else {
|
||
var a = 8 === f.length() ? 8 : 8 - f.length();
|
||
f.fillWithByte(a, a)
|
||
}
|
||
if (t && (p = !0,
|
||
v.update()),
|
||
!r && (t = 0 === f.length()))
|
||
if (e)
|
||
t = e(8, h, !r);
|
||
else {
|
||
var n = h.length()
|
||
, i = h.at(n - 1);
|
||
i > n ? t = !1 : h.truncate(i)
|
||
}
|
||
return t
|
||
}
|
||
}
|
||
};
|
||
a.rc2.startEncrypting = function(e, t, r) {
|
||
var n = a.rc2.createEncryptionCipher(e, 128);
|
||
return n.start(t, r),
|
||
n
|
||
}
|
||
,
|
||
a.rc2.createEncryptionCipher = function(e, t) {
|
||
return c(e, t, !0)
|
||
}
|
||
,
|
||
a.rc2.startDecrypting = function(e, t, r) {
|
||
var n = a.rc2.createDecryptionCipher(e, 128);
|
||
return n.start(t, r),
|
||
n
|
||
}
|
||
,
|
||
a.rc2.createDecryptionCipher = function(e, t) {
|
||
return c(e, t, !1)
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e, t, r) {
|
||
r || (r = n.md.sha1.create());
|
||
for (var a = "", i = Math.ceil(t / r.digestLength), s = 0; s < i; ++s) {
|
||
var o = String.fromCharCode(s >> 24 & 255, s >> 16 & 255, s >> 8 & 255, 255 & s);
|
||
r.start(),
|
||
r.update(e + o),
|
||
a += r.digest().getBytes()
|
||
}
|
||
return a.substring(0, t)
|
||
}
|
||
var n = r(0);
|
||
r(1),
|
||
r(2),
|
||
r(9);
|
||
var i = e.exports = n.pkcs1 = n.pkcs1 || {};
|
||
i.encode_rsa_oaep = function(e, t, r) {
|
||
var i, s, o, c;
|
||
"string" == typeof r ? (i = r,
|
||
s = arguments[3] || void 0,
|
||
o = arguments[4] || void 0) : r && (i = r.label || void 0,
|
||
s = r.seed || void 0,
|
||
o = r.md || void 0,
|
||
r.mgf1 && r.mgf1.md && (c = r.mgf1.md)),
|
||
o ? o.start() : o = n.md.sha1.create(),
|
||
c || (c = o);
|
||
var u = Math.ceil(e.n.bitLength() / 8)
|
||
, l = u - 2 * o.digestLength - 2;
|
||
if (t.length > l) {
|
||
var p = new Error("RSAES-OAEP input message length is too long.");
|
||
throw p.length = t.length,
|
||
p.maxLength = l,
|
||
p
|
||
}
|
||
i || (i = ""),
|
||
o.update(i, "raw");
|
||
for (var f = o.digest(), h = "", d = l - t.length, y = 0; y < d; y++)
|
||
h += "\0";
|
||
var g = f.getBytes() + h + "" + t;
|
||
if (s) {
|
||
if (s.length !== o.digestLength) {
|
||
var p = new Error("Invalid RSAES-OAEP seed. The seed length must match the digest length.");
|
||
throw p.seedLength = s.length,
|
||
p.digestLength = o.digestLength,
|
||
p
|
||
}
|
||
} else
|
||
s = n.random.getBytes(o.digestLength);
|
||
var v = a(s, u - o.digestLength - 1, c)
|
||
, m = n.util.xorBytes(g, v, g.length)
|
||
, C = a(m, o.digestLength, c);
|
||
return "\0" + n.util.xorBytes(s, C, s.length) + m
|
||
}
|
||
,
|
||
i.decode_rsa_oaep = function(e, t, r) {
|
||
var i, s, o;
|
||
"string" == typeof r ? (i = r,
|
||
s = arguments[3] || void 0) : r && (i = r.label || void 0,
|
||
s = r.md || void 0,
|
||
r.mgf1 && r.mgf1.md && (o = r.mgf1.md));
|
||
var c = Math.ceil(e.n.bitLength() / 8);
|
||
if (t.length !== c) {
|
||
var u = new Error("RSAES-OAEP encoded message length is invalid.");
|
||
throw u.length = t.length,
|
||
u.expectedLength = c,
|
||
u
|
||
}
|
||
if (void 0 === s ? s = n.md.sha1.create() : s.start(),
|
||
o || (o = s),
|
||
c < 2 * s.digestLength + 2)
|
||
throw new Error("RSAES-OAEP key is too short for the hash function.");
|
||
i || (i = ""),
|
||
s.update(i, "raw");
|
||
for (var l = s.digest().getBytes(), p = t.charAt(0), f = t.substring(1, s.digestLength + 1), h = t.substring(1 + s.digestLength), d = a(h, s.digestLength, o), y = n.util.xorBytes(f, d, f.length), g = a(y, c - s.digestLength - 1, o), v = n.util.xorBytes(h, g, h.length), m = v.substring(0, s.digestLength), u = "\0" !== p, C = 0; C < s.digestLength; ++C)
|
||
u |= l.charAt(C) !== m.charAt(C);
|
||
for (var E = 1, S = s.digestLength, T = s.digestLength; T < v.length; T++) {
|
||
var I = v.charCodeAt(T)
|
||
, b = 1 & I ^ 1;
|
||
u |= I & (E ? 65534 : 0),
|
||
E &= b,
|
||
S += E
|
||
}
|
||
if (u || 1 !== v.charCodeAt(S))
|
||
throw new Error("Invalid RSAES-OAEP padding.");
|
||
return v.substring(S + 1)
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(1),
|
||
r(12),
|
||
r(2),
|
||
function() {
|
||
function t(e, t, a, n) {
|
||
return "workers"in a ? i(e, t, a, n) : r(e, t, a, n)
|
||
}
|
||
function r(e, t, r, a) {
|
||
var i = s(e, t)
|
||
, c = o(i.bitLength());
|
||
"millerRabinTests"in r && (c = r.millerRabinTests);
|
||
var u = 10;
|
||
"maxBlockTime"in r && (u = r.maxBlockTime),
|
||
n(i, e, t, 0, c, u, a)
|
||
}
|
||
function n(e, t, r, i, o, c, u) {
|
||
var p = +new Date;
|
||
do {
|
||
if (e.bitLength() > t && (e = s(t, r)),
|
||
e.isProbablePrime(o))
|
||
return u(null, e);
|
||
e.dAddOffset(l[i++ % 8], 0)
|
||
} while (c < 0 || +new Date - p < c);
|
||
a.util.setImmediate(function() {
|
||
n(e, t, r, i, o, c, u)
|
||
})
|
||
}
|
||
function i(e, t, n, i) {
|
||
function o() {
|
||
function r(r) {
|
||
if (!d) {
|
||
--o;
|
||
var n = r.data;
|
||
if (n.found) {
|
||
for (var l = 0; l < a.length; ++l)
|
||
a[l].terminate();
|
||
return d = !0,
|
||
i(null, new u(n.prime,16))
|
||
}
|
||
c.bitLength() > e && (c = s(e, t));
|
||
var h = c.toString(16);
|
||
r.target.postMessage({
|
||
hex: h,
|
||
workLoad: p
|
||
}),
|
||
c.dAddOffset(f, 0)
|
||
}
|
||
}
|
||
l = Math.max(1, l);
|
||
for (var a = [], n = 0; n < l; ++n)
|
||
a[n] = new Worker(h);
|
||
for (var o = l, n = 0; n < l; ++n)
|
||
a[n].addEventListener("message", r);
|
||
var d = !1
|
||
}
|
||
if ("undefined" == typeof Worker)
|
||
return r(e, t, n, i);
|
||
var c = s(e, t)
|
||
, l = n.workers
|
||
, p = n.workLoad || 100
|
||
, f = 30 * p / 8
|
||
, h = n.workerScript || "forge/prime.worker.js";
|
||
if (-1 === l)
|
||
return a.util.estimateCores(function(e, t) {
|
||
e && (t = 2),
|
||
l = t - 1,
|
||
o()
|
||
});
|
||
o()
|
||
}
|
||
function s(e, t) {
|
||
var r = new u(e,t)
|
||
, a = e - 1;
|
||
return r.testBit(a) || r.bitwiseTo(u.ONE.shiftLeft(a), f, r),
|
||
r.dAddOffset(31 - r.mod(p).byteValue(), 0),
|
||
r
|
||
}
|
||
function o(e) {
|
||
return e <= 100 ? 27 : e <= 150 ? 18 : e <= 200 ? 15 : e <= 250 ? 12 : e <= 300 ? 9 : e <= 350 ? 8 : e <= 400 ? 7 : e <= 500 ? 6 : e <= 600 ? 5 : e <= 800 ? 4 : e <= 1250 ? 3 : 2
|
||
}
|
||
if (a.prime)
|
||
return void (e.exports = a.prime);
|
||
var c = e.exports = a.prime = a.prime || {}
|
||
, u = a.jsbn.BigInteger
|
||
, l = [6, 4, 2, 4, 2, 4, 6, 2]
|
||
, p = new u(null);
|
||
p.fromInt(30);
|
||
var f = function(e, t) {
|
||
return e | t
|
||
};
|
||
c.generateProbablePrime = function(e, r, n) {
|
||
"function" == typeof r && (n = r,
|
||
r = {}),
|
||
r = r || {};
|
||
var i = r.algorithm || "PRIMEINC";
|
||
"string" == typeof i && (i = {
|
||
name: i
|
||
}),
|
||
i.options = i.options || {};
|
||
var s = r.prng || a.random
|
||
, o = {
|
||
nextBytes: function(e) {
|
||
for (var t = s.getBytesSync(e.length), r = 0; r < e.length; ++r)
|
||
e[r] = t.charCodeAt(r)
|
||
}
|
||
};
|
||
if ("PRIMEINC" === i.name)
|
||
return t(e, o, i.options, n);
|
||
throw new Error("Invalid prime generation algorithm: " + i.name)
|
||
}
|
||
}()
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e, t, r, a) {
|
||
for (var n = [], i = 0; i < e.length; i++)
|
||
for (var s = 0; s < e[i].safeBags.length; s++) {
|
||
var o = e[i].safeBags[s];
|
||
void 0 !== a && o.type !== a || (null !== t ? void 0 !== o.attributes[t] && o.attributes[t].indexOf(r) >= 0 && n.push(o) : n.push(o))
|
||
}
|
||
return n
|
||
}
|
||
function n(e) {
|
||
if (e.composed || e.constructed) {
|
||
for (var t = u.util.createBuffer(), r = 0; r < e.value.length; ++r)
|
||
t.putBytes(e.value[r].value);
|
||
e.composed = e.constructed = !1,
|
||
e.value = t.getBytes()
|
||
}
|
||
return e
|
||
}
|
||
function i(e, t, r, a) {
|
||
if (t = l.fromDer(t, r),
|
||
t.tagClass !== l.Class.UNIVERSAL || t.type !== l.Type.SEQUENCE || !0 !== t.constructed)
|
||
throw new Error("PKCS#12 AuthenticatedSafe expected to be a SEQUENCE OF ContentInfo");
|
||
for (var i = 0; i < t.value.length; i++) {
|
||
var c = t.value[i]
|
||
, u = {}
|
||
, f = [];
|
||
if (!l.validate(c, h, u, f)) {
|
||
var d = new Error("Cannot read ContentInfo.");
|
||
throw d.errors = f,
|
||
d
|
||
}
|
||
var y = {
|
||
encrypted: !1
|
||
}
|
||
, g = null
|
||
, v = u.content.value[0];
|
||
switch (l.derToOid(u.contentType)) {
|
||
case p.oids.data:
|
||
if (v.tagClass !== l.Class.UNIVERSAL || v.type !== l.Type.OCTETSTRING)
|
||
throw new Error("PKCS#12 SafeContents Data is not an OCTET STRING.");
|
||
g = n(v).value;
|
||
break;
|
||
case p.oids.encryptedData:
|
||
g = s(v, a),
|
||
y.encrypted = !0;
|
||
break;
|
||
default:
|
||
var d = new Error("Unsupported PKCS#12 contentType.");
|
||
throw d.contentType = l.derToOid(u.contentType),
|
||
d
|
||
}
|
||
y.safeBags = o(g, r, a),
|
||
e.safeContents.push(y)
|
||
}
|
||
}
|
||
function s(e, t) {
|
||
var r = {}
|
||
, a = [];
|
||
if (!l.validate(e, u.pkcs7.asn1.encryptedDataValidator, r, a)) {
|
||
var i = new Error("Cannot read EncryptedContentInfo.");
|
||
throw i.errors = a,
|
||
i
|
||
}
|
||
var s = l.derToOid(r.contentType);
|
||
if (s !== p.oids.data) {
|
||
var i = new Error("PKCS#12 EncryptedContentInfo ContentType is not Data.");
|
||
throw i.oid = s,
|
||
i
|
||
}
|
||
s = l.derToOid(r.encAlgorithm);
|
||
var o = p.pbe.getCipher(s, r.encParameter, t)
|
||
, c = n(r.encryptedContentAsn1)
|
||
, f = u.util.createBuffer(c.value);
|
||
if (o.update(f),
|
||
!o.finish())
|
||
throw new Error("Failed to decrypt PKCS#12 SafeContents.");
|
||
return o.output.getBytes()
|
||
}
|
||
function o(e, t, r) {
|
||
if (!t && 0 === e.length)
|
||
return [];
|
||
if (e = l.fromDer(e, t),
|
||
e.tagClass !== l.Class.UNIVERSAL || e.type !== l.Type.SEQUENCE || !0 !== e.constructed)
|
||
throw new Error("PKCS#12 SafeContents expected to be a SEQUENCE OF SafeBag.");
|
||
for (var a = [], n = 0; n < e.value.length; n++) {
|
||
var i = e.value[n]
|
||
, s = {}
|
||
, o = [];
|
||
if (!l.validate(i, y, s, o)) {
|
||
var u = new Error("Cannot read SafeBag.");
|
||
throw u.errors = o,
|
||
u
|
||
}
|
||
var f = {
|
||
type: l.derToOid(s.bagId),
|
||
attributes: c(s.bagAttributes)
|
||
};
|
||
a.push(f);
|
||
var h, d, g = s.bagValue.value[0];
|
||
switch (f.type) {
|
||
case p.oids.pkcs8ShroudedKeyBag:
|
||
if (null === (g = p.decryptPrivateKeyInfo(g, r)))
|
||
throw new Error("Unable to decrypt PKCS#8 ShroudedKeyBag, wrong password?");
|
||
case p.oids.keyBag:
|
||
try {
|
||
f.key = p.privateKeyFromAsn1(g)
|
||
} catch (e) {
|
||
f.key = null,
|
||
f.asn1 = g
|
||
}
|
||
continue;
|
||
case p.oids.certBag:
|
||
h = v,
|
||
d = function() {
|
||
if (l.derToOid(s.certId) !== p.oids.x509Certificate) {
|
||
var e = new Error("Unsupported certificate type, only X.509 supported.");
|
||
throw e.oid = l.derToOid(s.certId),
|
||
e
|
||
}
|
||
var r = l.fromDer(s.cert, t);
|
||
try {
|
||
f.cert = p.certificateFromAsn1(r, !0)
|
||
} catch (e) {
|
||
f.cert = null,
|
||
f.asn1 = r
|
||
}
|
||
}
|
||
;
|
||
break;
|
||
default:
|
||
var u = new Error("Unsupported PKCS#12 SafeBag type.");
|
||
throw u.oid = f.type,
|
||
u
|
||
}
|
||
if (void 0 !== h && !l.validate(g, h, s, o)) {
|
||
var u = new Error("Cannot read PKCS#12 " + h.name);
|
||
throw u.errors = o,
|
||
u
|
||
}
|
||
d()
|
||
}
|
||
return a
|
||
}
|
||
function c(e) {
|
||
var t = {};
|
||
if (void 0 !== e)
|
||
for (var r = 0; r < e.length; ++r) {
|
||
var a = {}
|
||
, n = [];
|
||
if (!l.validate(e[r], g, a, n)) {
|
||
var i = new Error("Cannot read PKCS#12 BagAttribute.");
|
||
throw i.errors = n,
|
||
i
|
||
}
|
||
var s = l.derToOid(a.oid);
|
||
if (void 0 !== p.oids[s]) {
|
||
t[p.oids[s]] = [];
|
||
for (var o = 0; o < a.values.length; ++o)
|
||
t[p.oids[s]].push(a.values[o].value)
|
||
}
|
||
}
|
||
return t
|
||
}
|
||
var u = r(0);
|
||
r(3),
|
||
r(8),
|
||
r(6),
|
||
r(29),
|
||
r(22),
|
||
r(2),
|
||
r(11),
|
||
r(9),
|
||
r(1),
|
||
r(17);
|
||
var l = u.asn1
|
||
, p = u.pki
|
||
, f = e.exports = u.pkcs12 = u.pkcs12 || {}
|
||
, h = {
|
||
name: "ContentInfo",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "ContentInfo.contentType",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.OID,
|
||
constructed: !1,
|
||
capture: "contentType"
|
||
}, {
|
||
name: "ContentInfo.content",
|
||
tagClass: l.Class.CONTEXT_SPECIFIC,
|
||
constructed: !0,
|
||
captureAsn1: "content"
|
||
}]
|
||
}
|
||
, d = {
|
||
name: "PFX",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "PFX.version",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "version"
|
||
}, h, {
|
||
name: "PFX.macData",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.SEQUENCE,
|
||
constructed: !0,
|
||
optional: !0,
|
||
captureAsn1: "mac",
|
||
value: [{
|
||
name: "PFX.macData.mac",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "PFX.macData.mac.digestAlgorithm",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "PFX.macData.mac.digestAlgorithm.algorithm",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.OID,
|
||
constructed: !1,
|
||
capture: "macAlgorithm"
|
||
}, {
|
||
name: "PFX.macData.mac.digestAlgorithm.parameters",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
captureAsn1: "macAlgorithmParameters"
|
||
}]
|
||
}, {
|
||
name: "PFX.macData.mac.digest",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.OCTETSTRING,
|
||
constructed: !1,
|
||
capture: "macDigest"
|
||
}]
|
||
}, {
|
||
name: "PFX.macData.macSalt",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.OCTETSTRING,
|
||
constructed: !1,
|
||
capture: "macSalt"
|
||
}, {
|
||
name: "PFX.macData.iterations",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.INTEGER,
|
||
constructed: !1,
|
||
optional: !0,
|
||
capture: "macIterations"
|
||
}]
|
||
}]
|
||
}
|
||
, y = {
|
||
name: "SafeBag",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "SafeBag.bagId",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.OID,
|
||
constructed: !1,
|
||
capture: "bagId"
|
||
}, {
|
||
name: "SafeBag.bagValue",
|
||
tagClass: l.Class.CONTEXT_SPECIFIC,
|
||
constructed: !0,
|
||
captureAsn1: "bagValue"
|
||
}, {
|
||
name: "SafeBag.bagAttributes",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.SET,
|
||
constructed: !0,
|
||
optional: !0,
|
||
capture: "bagAttributes"
|
||
}]
|
||
}
|
||
, g = {
|
||
name: "Attribute",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "Attribute.attrId",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.OID,
|
||
constructed: !1,
|
||
capture: "oid"
|
||
}, {
|
||
name: "Attribute.attrValues",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.SET,
|
||
constructed: !0,
|
||
capture: "values"
|
||
}]
|
||
}
|
||
, v = {
|
||
name: "CertBag",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "CertBag.certId",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Type.OID,
|
||
constructed: !1,
|
||
capture: "certId"
|
||
}, {
|
||
name: "CertBag.certValue",
|
||
tagClass: l.Class.CONTEXT_SPECIFIC,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "CertBag.certValue[0]",
|
||
tagClass: l.Class.UNIVERSAL,
|
||
type: l.Class.OCTETSTRING,
|
||
constructed: !1,
|
||
capture: "cert"
|
||
}]
|
||
}]
|
||
};
|
||
f.pkcs12FromAsn1 = function(e, t, r) {
|
||
"string" == typeof t ? (r = t,
|
||
t = !0) : void 0 === t && (t = !0);
|
||
var s = {}
|
||
, o = [];
|
||
if (!l.validate(e, d, s, o)) {
|
||
var c = new Error("Cannot read PKCS#12 PFX. ASN.1 object is not an PKCS#12 PFX.");
|
||
throw c.errors = c,
|
||
c
|
||
}
|
||
var h = {
|
||
version: s.version.charCodeAt(0),
|
||
safeContents: [],
|
||
getBags: function(e) {
|
||
var t, r = {};
|
||
return "localKeyId"in e ? t = e.localKeyId : "localKeyIdHex"in e && (t = u.util.hexToBytes(e.localKeyIdHex)),
|
||
void 0 === t && !("friendlyName"in e) && "bagType"in e && (r[e.bagType] = a(h.safeContents, null, null, e.bagType)),
|
||
void 0 !== t && (r.localKeyId = a(h.safeContents, "localKeyId", t, e.bagType)),
|
||
"friendlyName"in e && (r.friendlyName = a(h.safeContents, "friendlyName", e.friendlyName, e.bagType)),
|
||
r
|
||
},
|
||
getBagsByFriendlyName: function(e, t) {
|
||
return a(h.safeContents, "friendlyName", e, t)
|
||
},
|
||
getBagsByLocalKeyId: function(e, t) {
|
||
return a(h.safeContents, "localKeyId", e, t)
|
||
}
|
||
};
|
||
if (3 !== s.version.charCodeAt(0)) {
|
||
var c = new Error("PKCS#12 PFX of version other than 3 not supported.");
|
||
throw c.version = s.version.charCodeAt(0),
|
||
c
|
||
}
|
||
if (l.derToOid(s.contentType) !== p.oids.data) {
|
||
var c = new Error("Only PKCS#12 PFX in password integrity mode supported.");
|
||
throw c.oid = l.derToOid(s.contentType),
|
||
c
|
||
}
|
||
var y = s.content.value[0];
|
||
if (y.tagClass !== l.Class.UNIVERSAL || y.type !== l.Type.OCTETSTRING)
|
||
throw new Error("PKCS#12 authSafe content data is not an OCTET STRING.");
|
||
if (y = n(y),
|
||
s.mac) {
|
||
var g = null
|
||
, v = 0
|
||
, m = l.derToOid(s.macAlgorithm);
|
||
switch (m) {
|
||
case p.oids.sha1:
|
||
g = u.md.sha1.create(),
|
||
v = 20;
|
||
break;
|
||
case p.oids.sha256:
|
||
g = u.md.sha256.create(),
|
||
v = 32;
|
||
break;
|
||
case p.oids.sha384:
|
||
g = u.md.sha384.create(),
|
||
v = 48;
|
||
break;
|
||
case p.oids.sha512:
|
||
g = u.md.sha512.create(),
|
||
v = 64;
|
||
break;
|
||
case p.oids.md5:
|
||
g = u.md.md5.create(),
|
||
v = 16
|
||
}
|
||
if (null === g)
|
||
throw new Error("PKCS#12 uses unsupported MAC algorithm: " + m);
|
||
var C = new u.util.ByteBuffer(s.macSalt)
|
||
, E = "macIterations"in s ? parseInt(u.util.bytesToHex(s.macIterations), 16) : 1
|
||
, S = f.generateKey(r, C, 3, E, v, g)
|
||
, T = u.hmac.create();
|
||
T.start(g, S),
|
||
T.update(y.value);
|
||
if (T.getMac().getBytes() !== s.macDigest)
|
||
throw new Error("PKCS#12 MAC could not be verified. Invalid password?")
|
||
}
|
||
return i(h, y.value, t, r),
|
||
h
|
||
}
|
||
,
|
||
f.toPkcs12Asn1 = function(e, t, r, a) {
|
||
a = a || {},
|
||
a.saltSize = a.saltSize || 8,
|
||
a.count = a.count || 2048,
|
||
a.algorithm = a.algorithm || a.encAlgorithm || "aes128",
|
||
"useMac"in a || (a.useMac = !0),
|
||
"localKeyId"in a || (a.localKeyId = null),
|
||
"generateLocalKeyId"in a || (a.generateLocalKeyId = !0);
|
||
var n, i = a.localKeyId;
|
||
if (null !== i)
|
||
i = u.util.hexToBytes(i);
|
||
else if (a.generateLocalKeyId)
|
||
if (t) {
|
||
var s = u.util.isArray(t) ? t[0] : t;
|
||
"string" == typeof s && (s = p.certificateFromPem(s));
|
||
var o = u.md.sha1.create();
|
||
o.update(l.toDer(p.certificateToAsn1(s)).getBytes()),
|
||
i = o.digest().getBytes()
|
||
} else
|
||
i = u.random.getBytes(20);
|
||
var c = [];
|
||
null !== i && c.push(l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.localKeyId).getBytes()), l.create(l.Class.UNIVERSAL, l.Type.SET, !0, [l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, i)])])),
|
||
"friendlyName"in a && c.push(l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.friendlyName).getBytes()), l.create(l.Class.UNIVERSAL, l.Type.SET, !0, [l.create(l.Class.UNIVERSAL, l.Type.BMPSTRING, !1, a.friendlyName)])])),
|
||
c.length > 0 && (n = l.create(l.Class.UNIVERSAL, l.Type.SET, !0, c));
|
||
var h = []
|
||
, d = [];
|
||
null !== t && (d = u.util.isArray(t) ? t : [t]);
|
||
for (var y = [], g = 0; g < d.length; ++g) {
|
||
t = d[g],
|
||
"string" == typeof t && (t = p.certificateFromPem(t));
|
||
var v = 0 === g ? n : void 0
|
||
, m = p.certificateToAsn1(t)
|
||
, C = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.certBag).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.x509Certificate).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, l.toDer(m).getBytes())])])]), v]);
|
||
y.push(C)
|
||
}
|
||
if (y.length > 0) {
|
||
var E = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, y)
|
||
, S = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.data).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, l.toDer(E).getBytes())])]);
|
||
h.push(S)
|
||
}
|
||
var T = null;
|
||
if (null !== e) {
|
||
var I = p.wrapRsaPrivateKey(p.privateKeyToAsn1(e));
|
||
T = null === r ? l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.keyBag).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [I]), n]) : l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.pkcs8ShroudedKeyBag).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [p.encryptPrivateKeyInfo(I, r, a)]), n]);
|
||
var b = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [T])
|
||
, A = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.data).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, l.toDer(b).getBytes())])]);
|
||
h.push(A)
|
||
}
|
||
var B, N = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, h);
|
||
if (a.useMac) {
|
||
var o = u.md.sha1.create()
|
||
, k = new u.util.ByteBuffer(u.random.getBytes(a.saltSize))
|
||
, w = a.count
|
||
, e = f.generateKey(r, k, 3, w, 20)
|
||
, R = u.hmac.create();
|
||
R.start(o, e),
|
||
R.update(l.toDer(N).getBytes());
|
||
var _ = R.getMac();
|
||
B = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.sha1).getBytes()), l.create(l.Class.UNIVERSAL, l.Type.NULL, !1, "")]), l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, _.getBytes())]), l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, k.getBytes()), l.create(l.Class.UNIVERSAL, l.Type.INTEGER, !1, l.integerToDer(w).getBytes())])
|
||
}
|
||
return l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.INTEGER, !1, l.integerToDer(3).getBytes()), l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.data).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, l.toDer(N).getBytes())])]), B])
|
||
}
|
||
,
|
||
f.generateKey = u.pbe.generatePkcs12Key
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(3),
|
||
r(1);
|
||
var n = a.asn1
|
||
, i = e.exports = a.pkcs7asn1 = a.pkcs7asn1 || {};
|
||
a.pkcs7 = a.pkcs7 || {},
|
||
a.pkcs7.asn1 = i;
|
||
var s = {
|
||
name: "ContentInfo",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "ContentInfo.ContentType",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.OID,
|
||
constructed: !1,
|
||
capture: "contentType"
|
||
}, {
|
||
name: "ContentInfo.content",
|
||
tagClass: n.Class.CONTEXT_SPECIFIC,
|
||
type: 0,
|
||
constructed: !0,
|
||
optional: !0,
|
||
captureAsn1: "content"
|
||
}]
|
||
};
|
||
i.contentInfoValidator = s;
|
||
var o = {
|
||
name: "EncryptedContentInfo",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "EncryptedContentInfo.contentType",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.OID,
|
||
constructed: !1,
|
||
capture: "contentType"
|
||
}, {
|
||
name: "EncryptedContentInfo.contentEncryptionAlgorithm",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "EncryptedContentInfo.contentEncryptionAlgorithm.algorithm",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.OID,
|
||
constructed: !1,
|
||
capture: "encAlgorithm"
|
||
}, {
|
||
name: "EncryptedContentInfo.contentEncryptionAlgorithm.parameter",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
captureAsn1: "encParameter"
|
||
}]
|
||
}, {
|
||
name: "EncryptedContentInfo.encryptedContent",
|
||
tagClass: n.Class.CONTEXT_SPECIFIC,
|
||
type: 0,
|
||
capture: "encryptedContent",
|
||
captureAsn1: "encryptedContentAsn1"
|
||
}]
|
||
};
|
||
i.envelopedDataValidator = {
|
||
name: "EnvelopedData",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "EnvelopedData.Version",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "version"
|
||
}, {
|
||
name: "EnvelopedData.RecipientInfos",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SET,
|
||
constructed: !0,
|
||
captureAsn1: "recipientInfos"
|
||
}].concat(o)
|
||
},
|
||
i.encryptedDataValidator = {
|
||
name: "EncryptedData",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "EncryptedData.Version",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "version"
|
||
}].concat(o)
|
||
};
|
||
var c = {
|
||
name: "SignerInfo",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "SignerInfo.version",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.INTEGER,
|
||
constructed: !1
|
||
}, {
|
||
name: "SignerInfo.issuerAndSerialNumber",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "SignerInfo.issuerAndSerialNumber.issuer",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
captureAsn1: "issuer"
|
||
}, {
|
||
name: "SignerInfo.issuerAndSerialNumber.serialNumber",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "serial"
|
||
}]
|
||
}, {
|
||
name: "SignerInfo.digestAlgorithm",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "SignerInfo.digestAlgorithm.algorithm",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.OID,
|
||
constructed: !1,
|
||
capture: "digestAlgorithm"
|
||
}, {
|
||
name: "SignerInfo.digestAlgorithm.parameter",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
constructed: !1,
|
||
captureAsn1: "digestParameter",
|
||
optional: !0
|
||
}]
|
||
}, {
|
||
name: "SignerInfo.authenticatedAttributes",
|
||
tagClass: n.Class.CONTEXT_SPECIFIC,
|
||
type: 0,
|
||
constructed: !0,
|
||
optional: !0,
|
||
capture: "authenticatedAttributes"
|
||
}, {
|
||
name: "SignerInfo.digestEncryptionAlgorithm",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
capture: "signatureAlgorithm"
|
||
}, {
|
||
name: "SignerInfo.encryptedDigest",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.OCTETSTRING,
|
||
constructed: !1,
|
||
capture: "signature"
|
||
}, {
|
||
name: "SignerInfo.unauthenticatedAttributes",
|
||
tagClass: n.Class.CONTEXT_SPECIFIC,
|
||
type: 1,
|
||
constructed: !0,
|
||
optional: !0,
|
||
capture: "unauthenticatedAttributes"
|
||
}]
|
||
};
|
||
i.signedDataValidator = {
|
||
name: "SignedData",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "SignedData.Version",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "version"
|
||
}, {
|
||
name: "SignedData.DigestAlgorithms",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SET,
|
||
constructed: !0,
|
||
captureAsn1: "digestAlgorithms"
|
||
}, s, {
|
||
name: "SignedData.Certificates",
|
||
tagClass: n.Class.CONTEXT_SPECIFIC,
|
||
type: 0,
|
||
optional: !0,
|
||
captureAsn1: "certificates"
|
||
}, {
|
||
name: "SignedData.CertificateRevocationLists",
|
||
tagClass: n.Class.CONTEXT_SPECIFIC,
|
||
type: 1,
|
||
optional: !0,
|
||
captureAsn1: "crls"
|
||
}, {
|
||
name: "SignedData.SignerInfos",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SET,
|
||
capture: "signerInfos",
|
||
optional: !0,
|
||
value: [c]
|
||
}]
|
||
},
|
||
i.recipientInfoValidator = {
|
||
name: "RecipientInfo",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "RecipientInfo.version",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "version"
|
||
}, {
|
||
name: "RecipientInfo.issuerAndSerial",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "RecipientInfo.issuerAndSerial.issuer",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
captureAsn1: "issuer"
|
||
}, {
|
||
name: "RecipientInfo.issuerAndSerial.serialNumber",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.INTEGER,
|
||
constructed: !1,
|
||
capture: "serial"
|
||
}]
|
||
}, {
|
||
name: "RecipientInfo.keyEncryptionAlgorithm",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.SEQUENCE,
|
||
constructed: !0,
|
||
value: [{
|
||
name: "RecipientInfo.keyEncryptionAlgorithm.algorithm",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.OID,
|
||
constructed: !1,
|
||
capture: "encAlgorithm"
|
||
}, {
|
||
name: "RecipientInfo.keyEncryptionAlgorithm.parameter",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
constructed: !1,
|
||
captureAsn1: "encParameter"
|
||
}]
|
||
}, {
|
||
name: "RecipientInfo.encryptedKey",
|
||
tagClass: n.Class.UNIVERSAL,
|
||
type: n.Type.OCTETSTRING,
|
||
constructed: !1,
|
||
capture: "encKey"
|
||
}]
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(1),
|
||
a.mgf = a.mgf || {},
|
||
(e.exports = a.mgf.mgf1 = a.mgf1 = a.mgf1 || {}).create = function(e) {
|
||
return {
|
||
generate: function(t, r) {
|
||
for (var n = new a.util.ByteBuffer, i = Math.ceil(r / e.digestLength), s = 0; s < i; s++) {
|
||
var o = new a.util.ByteBuffer;
|
||
o.putInt32(s),
|
||
e.start(),
|
||
e.update(t + o.getBytes()),
|
||
n.putBuffer(e.digest())
|
||
}
|
||
return n.truncate(n.length() - r),
|
||
n.getBytes()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
e.exports = a.debug = a.debug || {},
|
||
a.debug.storage = {},
|
||
a.debug.get = function(e, t) {
|
||
var r;
|
||
return void 0 === e ? r = a.debug.storage : e in a.debug.storage && (r = void 0 === t ? a.debug.storage[e] : a.debug.storage[e][t]),
|
||
r
|
||
}
|
||
,
|
||
a.debug.set = function(e, t, r) {
|
||
e in a.debug.storage || (a.debug.storage[e] = {}),
|
||
a.debug.storage[e][t] = r
|
||
}
|
||
,
|
||
a.debug.clear = function(e, t) {
|
||
void 0 === e ? a.debug.storage = {} : e in a.debug.storage && (void 0 === t ? delete a.debug.storage[e] : delete a.debug.storage[e][t])
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
function a() {
|
||
c = String.fromCharCode(128),
|
||
c += i.util.fillString(String.fromCharCode(0), 128),
|
||
l = [[1116352408, 3609767458], [1899447441, 602891725], [3049323471, 3964484399], [3921009573, 2173295548], [961987163, 4081628472], [1508970993, 3053834265], [2453635748, 2937671579], [2870763221, 3664609560], [3624381080, 2734883394], [310598401, 1164996542], [607225278, 1323610764], [1426881987, 3590304994], [1925078388, 4068182383], [2162078206, 991336113], [2614888103, 633803317], [3248222580, 3479774868], [3835390401, 2666613458], [4022224774, 944711139], [264347078, 2341262773], [604807628, 2007800933], [770255983, 1495990901], [1249150122, 1856431235], [1555081692, 3175218132], [1996064986, 2198950837], [2554220882, 3999719339], [2821834349, 766784016], [2952996808, 2566594879], [3210313671, 3203337956], [3336571891, 1034457026], [3584528711, 2466948901], [113926993, 3758326383], [338241895, 168717936], [666307205, 1188179964], [773529912, 1546045734], [1294757372, 1522805485], [1396182291, 2643833823], [1695183700, 2343527390], [1986661051, 1014477480], [2177026350, 1206759142], [2456956037, 344077627], [2730485921, 1290863460], [2820302411, 3158454273], [3259730800, 3505952657], [3345764771, 106217008], [3516065817, 3606008344], [3600352804, 1432725776], [4094571909, 1467031594], [275423344, 851169720], [430227734, 3100823752], [506948616, 1363258195], [659060556, 3750685593], [883997877, 3785050280], [958139571, 3318307427], [1322822218, 3812723403], [1537002063, 2003034995], [1747873779, 3602036899], [1955562222, 1575990012], [2024104815, 1125592928], [2227730452, 2716904306], [2361852424, 442776044], [2428436474, 593698344], [2756734187, 3733110249], [3204031479, 2999351573], [3329325298, 3815920427], [3391569614, 3928383900], [3515267271, 566280711], [3940187606, 3454069534], [4118630271, 4000239992], [116418474, 1914138554], [174292421, 2731055270], [289380356, 3203993006], [460393269, 320620315], [685471733, 587496836], [852142971, 1086792851], [1017036298, 365543100], [1126000580, 2618297676], [1288033470, 3409855158], [1501505948, 4234509866], [1607167915, 987167468], [1816402316, 1246189591]],
|
||
p = {},
|
||
p["SHA-512"] = [[1779033703, 4089235720], [3144134277, 2227873595], [1013904242, 4271175723], [2773480762, 1595750129], [1359893119, 2917565137], [2600822924, 725511199], [528734635, 4215389547], [1541459225, 327033209]],
|
||
p["SHA-384"] = [[3418070365, 3238371032], [1654270250, 914150663], [2438529370, 812702999], [355462360, 4144912697], [1731405415, 4290775857], [2394180231, 1750603025], [3675008525, 1694076839], [1203062813, 3204075428]],
|
||
p["SHA-512/256"] = [[573645204, 4230739756], [2673172387, 3360449730], [596883563, 1867755857], [2520282905, 1497426621], [2519219938, 2827943907], [3193839141, 1401305490], [721525244, 746961066], [246885852, 2177182882]],
|
||
p["SHA-512/224"] = [[2352822216, 424955298], [1944164710, 2312950998], [502970286, 855612546], [1738396948, 1479516111], [258812777, 2077511080], [2011393907, 79989058], [1067287976, 1780299464], [286451373, 2446758561]],
|
||
u = !0
|
||
}
|
||
function n(e, t, r) {
|
||
for (var a, n, i, s, o, c, u, p, f, h, d, y, g, v, m, C, E, S, T, I, b, A, B, N, k, w, R, _, L, U, D, P, V, O, K, x = r.length(); x >= 128; ) {
|
||
for (L = 0; L < 16; ++L)
|
||
t[L][0] = r.getInt32() >>> 0,
|
||
t[L][1] = r.getInt32() >>> 0;
|
||
for (; L < 80; ++L)
|
||
P = t[L - 2],
|
||
U = P[0],
|
||
D = P[1],
|
||
a = ((U >>> 19 | D << 13) ^ (D >>> 29 | U << 3) ^ U >>> 6) >>> 0,
|
||
n = ((U << 13 | D >>> 19) ^ (D << 3 | U >>> 29) ^ (U << 26 | D >>> 6)) >>> 0,
|
||
O = t[L - 15],
|
||
U = O[0],
|
||
D = O[1],
|
||
i = ((U >>> 1 | D << 31) ^ (U >>> 8 | D << 24) ^ U >>> 7) >>> 0,
|
||
s = ((U << 31 | D >>> 1) ^ (U << 24 | D >>> 8) ^ (U << 25 | D >>> 7)) >>> 0,
|
||
V = t[L - 7],
|
||
K = t[L - 16],
|
||
D = n + V[1] + s + K[1],
|
||
t[L][0] = a + V[0] + i + K[0] + (D / 4294967296 >>> 0) >>> 0,
|
||
t[L][1] = D >>> 0;
|
||
for (g = e[0][0],
|
||
v = e[0][1],
|
||
m = e[1][0],
|
||
C = e[1][1],
|
||
E = e[2][0],
|
||
S = e[2][1],
|
||
T = e[3][0],
|
||
I = e[3][1],
|
||
b = e[4][0],
|
||
A = e[4][1],
|
||
B = e[5][0],
|
||
N = e[5][1],
|
||
k = e[6][0],
|
||
w = e[6][1],
|
||
R = e[7][0],
|
||
_ = e[7][1],
|
||
L = 0; L < 80; ++L)
|
||
u = ((b >>> 14 | A << 18) ^ (b >>> 18 | A << 14) ^ (A >>> 9 | b << 23)) >>> 0,
|
||
p = ((b << 18 | A >>> 14) ^ (b << 14 | A >>> 18) ^ (A << 23 | b >>> 9)) >>> 0,
|
||
f = (k ^ b & (B ^ k)) >>> 0,
|
||
h = (w ^ A & (N ^ w)) >>> 0,
|
||
o = ((g >>> 28 | v << 4) ^ (v >>> 2 | g << 30) ^ (v >>> 7 | g << 25)) >>> 0,
|
||
c = ((g << 4 | v >>> 28) ^ (v << 30 | g >>> 2) ^ (v << 25 | g >>> 7)) >>> 0,
|
||
d = (g & m | E & (g ^ m)) >>> 0,
|
||
y = (v & C | S & (v ^ C)) >>> 0,
|
||
D = _ + p + h + l[L][1] + t[L][1],
|
||
a = R + u + f + l[L][0] + t[L][0] + (D / 4294967296 >>> 0) >>> 0,
|
||
n = D >>> 0,
|
||
D = c + y,
|
||
i = o + d + (D / 4294967296 >>> 0) >>> 0,
|
||
s = D >>> 0,
|
||
R = k,
|
||
_ = w,
|
||
k = B,
|
||
w = N,
|
||
B = b,
|
||
N = A,
|
||
D = I + n,
|
||
b = T + a + (D / 4294967296 >>> 0) >>> 0,
|
||
A = D >>> 0,
|
||
T = E,
|
||
I = S,
|
||
E = m,
|
||
S = C,
|
||
m = g,
|
||
C = v,
|
||
D = n + s,
|
||
g = a + i + (D / 4294967296 >>> 0) >>> 0,
|
||
v = D >>> 0;
|
||
D = e[0][1] + v,
|
||
e[0][0] = e[0][0] + g + (D / 4294967296 >>> 0) >>> 0,
|
||
e[0][1] = D >>> 0,
|
||
D = e[1][1] + C,
|
||
e[1][0] = e[1][0] + m + (D / 4294967296 >>> 0) >>> 0,
|
||
e[1][1] = D >>> 0,
|
||
D = e[2][1] + S,
|
||
e[2][0] = e[2][0] + E + (D / 4294967296 >>> 0) >>> 0,
|
||
e[2][1] = D >>> 0,
|
||
D = e[3][1] + I,
|
||
e[3][0] = e[3][0] + T + (D / 4294967296 >>> 0) >>> 0,
|
||
e[3][1] = D >>> 0,
|
||
D = e[4][1] + A,
|
||
e[4][0] = e[4][0] + b + (D / 4294967296 >>> 0) >>> 0,
|
||
e[4][1] = D >>> 0,
|
||
D = e[5][1] + N,
|
||
e[5][0] = e[5][0] + B + (D / 4294967296 >>> 0) >>> 0,
|
||
e[5][1] = D >>> 0,
|
||
D = e[6][1] + w,
|
||
e[6][0] = e[6][0] + k + (D / 4294967296 >>> 0) >>> 0,
|
||
e[6][1] = D >>> 0,
|
||
D = e[7][1] + _,
|
||
e[7][0] = e[7][0] + R + (D / 4294967296 >>> 0) >>> 0,
|
||
e[7][1] = D >>> 0,
|
||
x -= 128
|
||
}
|
||
}
|
||
var i = r(0);
|
||
r(4),
|
||
r(1);
|
||
var s = e.exports = i.sha512 = i.sha512 || {};
|
||
i.md.sha512 = i.md.algorithms.sha512 = s;
|
||
var o = i.sha384 = i.sha512.sha384 = i.sha512.sha384 || {};
|
||
o.create = function() {
|
||
return s.create("SHA-384")
|
||
}
|
||
,
|
||
i.md.sha384 = i.md.algorithms.sha384 = o,
|
||
i.sha512.sha256 = i.sha512.sha256 || {
|
||
create: function() {
|
||
return s.create("SHA-512/256")
|
||
}
|
||
},
|
||
i.md["sha512/256"] = i.md.algorithms["sha512/256"] = i.sha512.sha256,
|
||
i.sha512.sha224 = i.sha512.sha224 || {
|
||
create: function() {
|
||
return s.create("SHA-512/224")
|
||
}
|
||
},
|
||
i.md["sha512/224"] = i.md.algorithms["sha512/224"] = i.sha512.sha224,
|
||
s.create = function(e) {
|
||
if (u || a(),
|
||
void 0 === e && (e = "SHA-512"),
|
||
!(e in p))
|
||
throw new Error("Invalid SHA-512 algorithm: " + e);
|
||
for (var t = p[e], r = null, s = i.util.createBuffer(), o = new Array(80), l = 0; l < 80; ++l)
|
||
o[l] = new Array(2);
|
||
var f = 64;
|
||
switch (e) {
|
||
case "SHA-384":
|
||
f = 48;
|
||
break;
|
||
case "SHA-512/256":
|
||
f = 32;
|
||
break;
|
||
case "SHA-512/224":
|
||
f = 28
|
||
}
|
||
var h = {
|
||
algorithm: e.replace("-", "").toLowerCase(),
|
||
blockLength: 128,
|
||
digestLength: f,
|
||
messageLength: 0,
|
||
fullMessageLength: null,
|
||
messageLengthSize: 16
|
||
};
|
||
return h.start = function() {
|
||
h.messageLength = 0,
|
||
h.fullMessageLength = h.messageLength128 = [];
|
||
for (var e = h.messageLengthSize / 4, a = 0; a < e; ++a)
|
||
h.fullMessageLength.push(0);
|
||
s = i.util.createBuffer(),
|
||
r = new Array(t.length);
|
||
for (var a = 0; a < t.length; ++a)
|
||
r[a] = t[a].slice(0);
|
||
return h
|
||
}
|
||
,
|
||
h.start(),
|
||
h.update = function(e, t) {
|
||
"utf8" === t && (e = i.util.encodeUtf8(e));
|
||
var a = e.length;
|
||
h.messageLength += a,
|
||
a = [a / 4294967296 >>> 0, a >>> 0];
|
||
for (var c = h.fullMessageLength.length - 1; c >= 0; --c)
|
||
h.fullMessageLength[c] += a[1],
|
||
a[1] = a[0] + (h.fullMessageLength[c] / 4294967296 >>> 0),
|
||
h.fullMessageLength[c] = h.fullMessageLength[c] >>> 0,
|
||
a[0] = a[1] / 4294967296 >>> 0;
|
||
return s.putBytes(e),
|
||
n(r, o, s),
|
||
(s.read > 2048 || 0 === s.length()) && s.compact(),
|
||
h
|
||
}
|
||
,
|
||
h.digest = function() {
|
||
var t = i.util.createBuffer();
|
||
t.putBytes(s.bytes());
|
||
var a = h.fullMessageLength[h.fullMessageLength.length - 1] + h.messageLengthSize
|
||
, u = a & h.blockLength - 1;
|
||
t.putBytes(c.substr(0, h.blockLength - u));
|
||
for (var l, p, f = 8 * h.fullMessageLength[0], d = 0; d < h.fullMessageLength.length - 1; ++d)
|
||
l = 8 * h.fullMessageLength[d + 1],
|
||
p = l / 4294967296 >>> 0,
|
||
f += p,
|
||
t.putInt32(f >>> 0),
|
||
f = l >>> 0;
|
||
t.putInt32(f);
|
||
for (var y = new Array(r.length), d = 0; d < r.length; ++d)
|
||
y[d] = r[d].slice(0);
|
||
n(y, o, t);
|
||
var g, v = i.util.createBuffer();
|
||
g = "SHA-512" === e ? y.length : "SHA-384" === e ? y.length - 2 : y.length - 4;
|
||
for (var d = 0; d < g; ++d)
|
||
v.putInt32(y[d][0]),
|
||
d === g - 1 && "SHA-512/224" === e || v.putInt32(y[d][1]);
|
||
return v
|
||
}
|
||
,
|
||
h
|
||
}
|
||
;
|
||
var c = null
|
||
, u = !1
|
||
, l = null
|
||
, p = null
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(1),
|
||
e.exports = a.log = a.log || {},
|
||
a.log.levels = ["none", "error", "warning", "info", "debug", "verbose", "max"];
|
||
var n = {}
|
||
, i = []
|
||
, s = null;
|
||
a.log.LEVEL_LOCKED = 2,
|
||
a.log.NO_LEVEL_CHECK = 4,
|
||
a.log.INTERPOLATE = 8;
|
||
for (var o = 0; o < a.log.levels.length; ++o) {
|
||
var c = a.log.levels[o];
|
||
n[c] = {
|
||
index: o,
|
||
name: c.toUpperCase()
|
||
}
|
||
}
|
||
a.log.logMessage = function(e) {
|
||
for (var t = n[e.level].index, r = 0; r < i.length; ++r) {
|
||
var s = i[r];
|
||
if (s.flags & a.log.NO_LEVEL_CHECK)
|
||
s.f(e);
|
||
else {
|
||
t <= n[s.level].index && s.f(s, e)
|
||
}
|
||
}
|
||
}
|
||
,
|
||
a.log.prepareStandard = function(e) {
|
||
"standard"in e || (e.standard = n[e.level].name + " [" + e.category + "] " + e.message)
|
||
}
|
||
,
|
||
a.log.prepareFull = function(e) {
|
||
if (!("full"in e)) {
|
||
var t = [e.message];
|
||
t = t.concat([] || e.arguments),
|
||
e.full = a.util.format.apply(this, t)
|
||
}
|
||
}
|
||
,
|
||
a.log.prepareStandardFull = function(e) {
|
||
"standardFull"in e || (a.log.prepareStandard(e),
|
||
e.standardFull = e.standard)
|
||
}
|
||
;
|
||
for (var u = ["error", "warning", "info", "debug", "verbose"], o = 0; o < u.length; ++o)
|
||
!function(e) {
|
||
a.log[e] = function(t, r) {
|
||
var n = Array.prototype.slice.call(arguments).slice(2)
|
||
, i = {
|
||
timestamp: new Date,
|
||
level: e,
|
||
category: t,
|
||
message: r,
|
||
arguments: n
|
||
};
|
||
a.log.logMessage(i)
|
||
}
|
||
}(u[o]);
|
||
if (a.log.makeLogger = function(e) {
|
||
var t = {
|
||
flags: 0,
|
||
f: e
|
||
};
|
||
return a.log.setLevel(t, "none"),
|
||
t
|
||
}
|
||
,
|
||
a.log.setLevel = function(e, t) {
|
||
var r = !1;
|
||
if (e && !(e.flags & a.log.LEVEL_LOCKED))
|
||
for (var n = 0; n < a.log.levels.length; ++n) {
|
||
var i = a.log.levels[n];
|
||
if (t == i) {
|
||
e.level = t,
|
||
r = !0;
|
||
break
|
||
}
|
||
}
|
||
return r
|
||
}
|
||
,
|
||
a.log.lock = function(e, t) {
|
||
void 0 === t || t ? e.flags |= a.log.LEVEL_LOCKED : e.flags &= ~a.log.LEVEL_LOCKED
|
||
}
|
||
,
|
||
a.log.addLogger = function(e) {
|
||
i.push(e)
|
||
}
|
||
,
|
||
"undefined" != typeof console && "log"in console) {
|
||
var l;
|
||
if (console.error && console.warn && console.info && console.debug) {
|
||
var p = {
|
||
error: console.error,
|
||
warning: console.warn,
|
||
info: console.info,
|
||
debug: console.debug,
|
||
verbose: console.debug
|
||
}
|
||
, f = function(e, t) {
|
||
a.log.prepareStandard(t);
|
||
var r = p[t.level]
|
||
, n = [t.standard];
|
||
n = n.concat(t.arguments.slice()),
|
||
r.apply(console, n)
|
||
};
|
||
l = a.log.makeLogger(f)
|
||
} else {
|
||
var f = function(e, t) {
|
||
a.log.prepareStandardFull(t),
|
||
console.log(t.standardFull)
|
||
};
|
||
l = a.log.makeLogger(f)
|
||
}
|
||
a.log.setLevel(l, "debug"),
|
||
a.log.addLogger(l),
|
||
s = l
|
||
} else
|
||
console = {
|
||
log: function() {}
|
||
};
|
||
if (null !== s) {
|
||
var h = a.util.getQueryVariables();
|
||
if ("console.level"in h && a.log.setLevel(s, h["console.level"].slice(-1)[0]),
|
||
"console.lock"in h) {
|
||
"true" == h["console.lock"].slice(-1)[0] && a.log.lock(s)
|
||
}
|
||
}
|
||
a.log.consoleLogger = s
|
||
}
|
||
, function(e, t, r) {
|
||
e.exports = r(35)
|
||
}
|
||
, function(e, t, r) {
|
||
e.exports = r(0),
|
||
r(5),
|
||
r(38),
|
||
r(3),
|
||
r(13),
|
||
r(31),
|
||
r(10),
|
||
r(40),
|
||
r(8),
|
||
r(41),
|
||
r(33),
|
||
r(42),
|
||
r(30),
|
||
r(15),
|
||
r(7),
|
||
r(26),
|
||
r(28),
|
||
r(43),
|
||
r(21),
|
||
r(27),
|
||
r(24),
|
||
r(18),
|
||
r(2),
|
||
r(25),
|
||
r(44),
|
||
r(45),
|
||
r(20),
|
||
r(1)
|
||
}
|
||
, function(e, t) {
|
||
var r;
|
||
r = function() {
|
||
return this
|
||
}();
|
||
try {
|
||
r = r || Function("return this")() || (0,
|
||
eval)("this")
|
||
} catch (e) {
|
||
"object" == typeof window && (r = window)
|
||
}
|
||
e.exports = r
|
||
}
|
||
, function(e, t) {
|
||
function r(e, t) {
|
||
var r = 0
|
||
, a = t.length
|
||
, n = t.charAt(0)
|
||
, i = [0];
|
||
for (r = 0; r < e.length(); ++r) {
|
||
for (var s = 0, o = e.at(r); s < i.length; ++s)
|
||
o += i[s] << 8,
|
||
i[s] = o % a,
|
||
o = o / a | 0;
|
||
for (; o > 0; )
|
||
i.push(o % a),
|
||
o = o / a | 0
|
||
}
|
||
var c = "";
|
||
for (r = 0; 0 === e.at(r) && r < e.length() - 1; ++r)
|
||
c += n;
|
||
for (r = i.length - 1; r >= 0; --r)
|
||
c += t[i[r]];
|
||
return c
|
||
}
|
||
var a = {};
|
||
e.exports = a;
|
||
var n = {};
|
||
a.encode = function(e, t, a) {
|
||
if ("string" != typeof t)
|
||
throw new TypeError('"alphabet" must be a string.');
|
||
if (void 0 !== a && "number" != typeof a)
|
||
throw new TypeError('"maxline" must be a number.');
|
||
var n = "";
|
||
if (e instanceof Uint8Array) {
|
||
var i = 0
|
||
, s = t.length
|
||
, o = t.charAt(0)
|
||
, c = [0];
|
||
for (i = 0; i < e.length; ++i) {
|
||
for (var u = 0, l = e[i]; u < c.length; ++u)
|
||
l += c[u] << 8,
|
||
c[u] = l % s,
|
||
l = l / s | 0;
|
||
for (; l > 0; )
|
||
c.push(l % s),
|
||
l = l / s | 0
|
||
}
|
||
for (i = 0; 0 === e[i] && i < e.length - 1; ++i)
|
||
n += o;
|
||
for (i = c.length - 1; i >= 0; --i)
|
||
n += t[c[i]]
|
||
} else
|
||
n = r(e, t);
|
||
if (a) {
|
||
var p = new RegExp(".{1," + a + "}","g");
|
||
n = n.match(p).join("\r\n")
|
||
}
|
||
return n
|
||
}
|
||
,
|
||
a.decode = function(e, t) {
|
||
if ("string" != typeof e)
|
||
throw new TypeError('"input" must be a string.');
|
||
if ("string" != typeof t)
|
||
throw new TypeError('"alphabet" must be a string.');
|
||
var r = n[t];
|
||
if (!r) {
|
||
r = n[t] = [];
|
||
for (var a = 0; a < t.length; ++a)
|
||
r[t.charCodeAt(a)] = a
|
||
}
|
||
e = e.replace(/\s/g, "");
|
||
for (var i = t.length, s = t.charAt(0), o = [0], a = 0; a < e.length; a++) {
|
||
var c = r[e.charCodeAt(a)];
|
||
if (void 0 === c)
|
||
return;
|
||
for (var u = 0, l = c; u < o.length; ++u)
|
||
l += o[u] * i,
|
||
o[u] = 255 & l,
|
||
l >>= 8;
|
||
for (; l > 0; )
|
||
o.push(255 & l),
|
||
l >>= 8
|
||
}
|
||
for (var p = 0; e[p] === s && p < e.length - 1; ++p)
|
||
o.push(0);
|
||
return "undefined" != typeof Buffer ? Buffer.from(o.reverse()) : new Uint8Array(o.reverse())
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e, t, r) {
|
||
var a = t.entity === u.tls.ConnectionEnd.client;
|
||
e.read.cipherState = {
|
||
init: !1,
|
||
cipher: u.cipher.createDecipher("AES-CBC", a ? r.keys.server_write_key : r.keys.client_write_key),
|
||
iv: a ? r.keys.server_write_IV : r.keys.client_write_IV
|
||
},
|
||
e.write.cipherState = {
|
||
init: !1,
|
||
cipher: u.cipher.createCipher("AES-CBC", a ? r.keys.client_write_key : r.keys.server_write_key),
|
||
iv: a ? r.keys.client_write_IV : r.keys.server_write_IV
|
||
},
|
||
e.read.cipherFunction = o,
|
||
e.write.cipherFunction = n,
|
||
e.read.macLength = e.write.macLength = r.mac_length,
|
||
e.read.macFunction = e.write.macFunction = l.hmac_sha1
|
||
}
|
||
function n(e, t) {
|
||
var r = !1
|
||
, a = t.macFunction(t.macKey, t.sequenceNumber, e);
|
||
e.fragment.putBytes(a),
|
||
t.updateSequenceNumber();
|
||
var n;
|
||
n = e.version.minor === l.Versions.TLS_1_0.minor ? t.cipherState.init ? null : t.cipherState.iv : u.random.getBytesSync(16),
|
||
t.cipherState.init = !0;
|
||
var s = t.cipherState.cipher;
|
||
return s.start({
|
||
iv: n
|
||
}),
|
||
e.version.minor >= l.Versions.TLS_1_1.minor && s.output.putBytes(n),
|
||
s.update(e.fragment),
|
||
s.finish(i) && (e.fragment = s.output,
|
||
e.length = e.fragment.length(),
|
||
r = !0),
|
||
r
|
||
}
|
||
function i(e, t, r) {
|
||
if (!r) {
|
||
var a = e - t.length() % e;
|
||
t.fillWithByte(a - 1, a)
|
||
}
|
||
return !0
|
||
}
|
||
function s(e, t, r) {
|
||
var a = !0;
|
||
if (r) {
|
||
for (var n = t.length(), i = t.last(), s = n - 1 - i; s < n - 1; ++s)
|
||
a = a && t.at(s) == i;
|
||
a && t.truncate(i + 1)
|
||
}
|
||
return a
|
||
}
|
||
function o(e, t) {
|
||
var r, a = !1;
|
||
r = e.version.minor === l.Versions.TLS_1_0.minor ? t.cipherState.init ? null : t.cipherState.iv : e.fragment.getBytes(16),
|
||
t.cipherState.init = !0;
|
||
var n = t.cipherState.cipher;
|
||
n.start({
|
||
iv: r
|
||
}),
|
||
n.update(e.fragment),
|
||
a = n.finish(s);
|
||
var i = t.macLength
|
||
, o = u.random.getBytesSync(i)
|
||
, p = n.output.length();
|
||
p >= i ? (e.fragment = n.output.getBytes(p - i),
|
||
o = n.output.getBytes(i)) : e.fragment = n.output.getBytes(),
|
||
e.fragment = u.util.createBuffer(e.fragment),
|
||
e.length = e.fragment.length();
|
||
var f = t.macFunction(t.macKey, t.sequenceNumber, e);
|
||
return t.updateSequenceNumber(),
|
||
a = c(t.macKey, o, f) && a
|
||
}
|
||
function c(e, t, r) {
|
||
var a = u.hmac.create();
|
||
return a.start("SHA1", e),
|
||
a.update(t),
|
||
t = a.digest().getBytes(),
|
||
a.start(null, null),
|
||
a.update(r),
|
||
r = a.digest().getBytes(),
|
||
t === r
|
||
}
|
||
var u = r(0);
|
||
r(5),
|
||
r(20);
|
||
var l = e.exports = u.tls;
|
||
l.CipherSuites.TLS_RSA_WITH_AES_128_CBC_SHA = {
|
||
id: [0, 47],
|
||
name: "TLS_RSA_WITH_AES_128_CBC_SHA",
|
||
initSecurityParameters: function(e) {
|
||
e.bulk_cipher_algorithm = l.BulkCipherAlgorithm.aes,
|
||
e.cipher_type = l.CipherType.block,
|
||
e.enc_key_length = 16,
|
||
e.block_length = 16,
|
||
e.fixed_iv_length = 16,
|
||
e.record_iv_length = 16,
|
||
e.mac_algorithm = l.MACAlgorithm.hmac_sha1,
|
||
e.mac_length = 20,
|
||
e.mac_key_length = 20
|
||
},
|
||
initConnectionState: a
|
||
},
|
||
l.CipherSuites.TLS_RSA_WITH_AES_256_CBC_SHA = {
|
||
id: [0, 53],
|
||
name: "TLS_RSA_WITH_AES_256_CBC_SHA",
|
||
initSecurityParameters: function(e) {
|
||
e.bulk_cipher_algorithm = l.BulkCipherAlgorithm.aes,
|
||
e.cipher_type = l.CipherType.block,
|
||
e.enc_key_length = 32,
|
||
e.block_length = 16,
|
||
e.fixed_iv_length = 16,
|
||
e.record_iv_length = 16,
|
||
e.mac_algorithm = l.MACAlgorithm.hmac_sha1,
|
||
e.mac_length = 20,
|
||
e.mac_key_length = 20
|
||
},
|
||
initConnectionState: a
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(30),
|
||
e.exports = a.mgf = a.mgf || {},
|
||
a.mgf.mgf1 = a.mgf1
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e) {
|
||
var t = e.message;
|
||
if (t instanceof Uint8Array)
|
||
return t;
|
||
var r = e.encoding;
|
||
if (void 0 === t) {
|
||
if (!e.md)
|
||
throw new TypeError('"options.message" or "options.md" not specified.');
|
||
t = e.md.digest().getBytes(),
|
||
r = "binary"
|
||
}
|
||
if ("string" == typeof t && !r)
|
||
throw new TypeError('"options.encoding" must be "binary" or "utf8".');
|
||
if ("string" == typeof t) {
|
||
if ("undefined" != typeof Buffer)
|
||
return new Buffer(t,r);
|
||
t = new D(t,r)
|
||
} else if (!(t instanceof D))
|
||
throw new TypeError('"options.message" must be a node.js Buffer, a Uint8Array, a forge ByteBuffer, or a string with "options.encoding" specifying its encoding.');
|
||
for (var a = new P(t.length()), n = 0; n < a.length; ++n)
|
||
a[n] = t.at(n);
|
||
return a
|
||
}
|
||
function n(e, t) {
|
||
var r = L.md.sha512.create()
|
||
, a = new D(e);
|
||
r.update(a.getBytes(t), "binary");
|
||
var n = r.digest().getBytes();
|
||
if ("undefined" != typeof Buffer)
|
||
return new Buffer(n,"binary");
|
||
for (var i = new P(V.constants.HASH_BYTE_LENGTH), s = 0; s < 64; ++s)
|
||
i[s] = n.charCodeAt(s);
|
||
return i
|
||
}
|
||
function i(e, t) {
|
||
var r, a = [N(), N(), N(), N()], i = n(t, 32);
|
||
for (i[0] &= 248,
|
||
i[31] &= 127,
|
||
i[31] |= 64,
|
||
T(a, i),
|
||
f(e, a),
|
||
r = 0; r < 32; ++r)
|
||
t[r + 32] = e[r];
|
||
return 0
|
||
}
|
||
function s(e, t, r, a) {
|
||
var i, s, o = new Float64Array(64), l = [N(), N(), N(), N()], p = n(a, 32);
|
||
p[0] &= 248,
|
||
p[31] &= 127,
|
||
p[31] |= 64;
|
||
var h = r + 64;
|
||
for (i = 0; i < r; ++i)
|
||
e[64 + i] = t[i];
|
||
for (i = 0; i < 32; ++i)
|
||
e[32 + i] = p[32 + i];
|
||
var d = n(e.subarray(32), r + 32);
|
||
for (u(d),
|
||
T(l, d),
|
||
f(e, l),
|
||
i = 32; i < 64; ++i)
|
||
e[i] = a[i];
|
||
var y = n(e, r + 64);
|
||
for (u(y),
|
||
i = 32; i < 64; ++i)
|
||
o[i] = 0;
|
||
for (i = 0; i < 32; ++i)
|
||
o[i] = d[i];
|
||
for (i = 0; i < 32; ++i)
|
||
for (s = 0; s < 32; s++)
|
||
o[i + s] += y[i] * p[s];
|
||
return c(e.subarray(32), o),
|
||
h
|
||
}
|
||
function o(e, t, r, a) {
|
||
var i, s = new P(32), o = [N(), N(), N(), N()], c = [N(), N(), N(), N()];
|
||
if (-1,
|
||
r < 64)
|
||
return -1;
|
||
if (d(c, a))
|
||
return -1;
|
||
for (i = 0; i < r; ++i)
|
||
e[i] = t[i];
|
||
for (i = 0; i < 32; ++i)
|
||
e[i + 32] = a[i];
|
||
var p = n(e, r);
|
||
if (u(p),
|
||
S(o, c, p),
|
||
T(c, t.subarray(32)),
|
||
l(o, c),
|
||
f(s, o),
|
||
r -= 64,
|
||
m(t, 0, s, 0)) {
|
||
for (i = 0; i < r; ++i)
|
||
e[i] = 0;
|
||
return -1
|
||
}
|
||
for (i = 0; i < r; ++i)
|
||
e[i] = t[i + 64];
|
||
return r
|
||
}
|
||
function c(e, t) {
|
||
var r, a, n, i;
|
||
for (a = 63; a >= 32; --a) {
|
||
for (r = 0,
|
||
n = a - 32,
|
||
i = a - 12; n < i; ++n)
|
||
t[n] += r - 16 * t[a] * j[n - (a - 32)],
|
||
r = t[n] + 128 >> 8,
|
||
t[n] -= 256 * r;
|
||
t[n] += r,
|
||
t[a] = 0
|
||
}
|
||
for (r = 0,
|
||
n = 0; n < 32; ++n)
|
||
t[n] += r - (t[31] >> 4) * j[n],
|
||
r = t[n] >> 8,
|
||
t[n] &= 255;
|
||
for (n = 0; n < 32; ++n)
|
||
t[n] -= r * j[n];
|
||
for (a = 0; a < 32; ++a)
|
||
t[a + 1] += t[a] >> 8,
|
||
e[a] = 255 & t[a]
|
||
}
|
||
function u(e) {
|
||
for (var t = new Float64Array(64), r = 0; r < 64; ++r)
|
||
t[r] = e[r],
|
||
e[r] = 0;
|
||
c(e, t)
|
||
}
|
||
function l(e, t) {
|
||
var r = N()
|
||
, a = N()
|
||
, n = N()
|
||
, i = N()
|
||
, s = N()
|
||
, o = N()
|
||
, c = N()
|
||
, u = N()
|
||
, l = N();
|
||
w(r, e[1], e[0]),
|
||
w(l, t[1], t[0]),
|
||
_(r, r, l),
|
||
k(a, e[0], e[1]),
|
||
k(l, t[0], t[1]),
|
||
_(a, a, l),
|
||
_(n, e[3], t[3]),
|
||
_(n, n, M),
|
||
_(i, e[2], t[2]),
|
||
k(i, i, i),
|
||
w(s, a, r),
|
||
w(o, i, n),
|
||
k(c, i, n),
|
||
k(u, a, r),
|
||
_(e[0], s, o),
|
||
_(e[1], u, c),
|
||
_(e[2], c, o),
|
||
_(e[3], s, u)
|
||
}
|
||
function p(e, t, r) {
|
||
for (var a = 0; a < 4; ++a)
|
||
B(e[a], t[a], r)
|
||
}
|
||
function f(e, t) {
|
||
var r = N()
|
||
, a = N()
|
||
, n = N();
|
||
b(n, t[2]),
|
||
_(r, t[0], n),
|
||
_(a, t[1], n),
|
||
h(e, a),
|
||
e[31] ^= E(r) << 7
|
||
}
|
||
function h(e, t) {
|
||
var r, a, n, i = N(), s = N();
|
||
for (r = 0; r < 16; ++r)
|
||
s[r] = t[r];
|
||
for (A(s),
|
||
A(s),
|
||
A(s),
|
||
a = 0; a < 2; ++a) {
|
||
for (i[0] = s[0] - 65517,
|
||
r = 1; r < 15; ++r)
|
||
i[r] = s[r] - 65535 - (i[r - 1] >> 16 & 1),
|
||
i[r - 1] &= 65535;
|
||
i[15] = s[15] - 32767 - (i[14] >> 16 & 1),
|
||
n = i[15] >> 16 & 1,
|
||
i[14] &= 65535,
|
||
B(s, i, 1 - n)
|
||
}
|
||
for (r = 0; r < 16; r++)
|
||
e[2 * r] = 255 & s[r],
|
||
e[2 * r + 1] = s[r] >> 8
|
||
}
|
||
function d(e, t) {
|
||
var r = N()
|
||
, a = N()
|
||
, n = N()
|
||
, i = N()
|
||
, s = N()
|
||
, o = N()
|
||
, c = N();
|
||
return I(e[2], K),
|
||
y(e[1], t),
|
||
R(n, e[1]),
|
||
_(i, n, x),
|
||
w(n, n, e[2]),
|
||
k(i, e[2], i),
|
||
R(s, i),
|
||
R(o, s),
|
||
_(c, o, s),
|
||
_(r, c, n),
|
||
_(r, r, i),
|
||
g(r, r),
|
||
_(r, r, n),
|
||
_(r, r, i),
|
||
_(r, r, i),
|
||
_(e[0], r, i),
|
||
R(a, e[0]),
|
||
_(a, a, i),
|
||
v(a, n) && _(e[0], e[0], G),
|
||
R(a, e[0]),
|
||
_(a, a, i),
|
||
v(a, n) ? -1 : (E(e[0]) === t[31] >> 7 && w(e[0], O, e[0]),
|
||
_(e[3], e[0], e[1]),
|
||
0)
|
||
}
|
||
function y(e, t) {
|
||
var r;
|
||
for (r = 0; r < 16; ++r)
|
||
e[r] = t[2 * r] + (t[2 * r + 1] << 8);
|
||
e[15] &= 32767
|
||
}
|
||
function g(e, t) {
|
||
var r, a = N();
|
||
for (r = 0; r < 16; ++r)
|
||
a[r] = t[r];
|
||
for (r = 250; r >= 0; --r)
|
||
R(a, a),
|
||
1 !== r && _(a, a, t);
|
||
for (r = 0; r < 16; ++r)
|
||
e[r] = a[r]
|
||
}
|
||
function v(e, t) {
|
||
var r = new P(32)
|
||
, a = new P(32);
|
||
return h(r, e),
|
||
h(a, t),
|
||
m(r, 0, a, 0)
|
||
}
|
||
function m(e, t, r, a) {
|
||
return C(e, t, r, a, 32)
|
||
}
|
||
function C(e, t, r, a, n) {
|
||
var i, s = 0;
|
||
for (i = 0; i < n; ++i)
|
||
s |= e[t + i] ^ r[a + i];
|
||
return (1 & s - 1 >>> 8) - 1
|
||
}
|
||
function E(e) {
|
||
var t = new P(32);
|
||
return h(t, e),
|
||
1 & t[0]
|
||
}
|
||
function S(e, t, r) {
|
||
var a, n;
|
||
for (I(e[0], O),
|
||
I(e[1], K),
|
||
I(e[2], K),
|
||
I(e[3], O),
|
||
n = 255; n >= 0; --n)
|
||
a = r[n / 8 | 0] >> (7 & n) & 1,
|
||
p(e, t, a),
|
||
l(t, e),
|
||
l(e, e),
|
||
p(e, t, a)
|
||
}
|
||
function T(e, t) {
|
||
var r = [N(), N(), N(), N()];
|
||
I(r[0], F),
|
||
I(r[1], q),
|
||
I(r[2], K),
|
||
_(r[3], F, q),
|
||
S(e, r, t)
|
||
}
|
||
function I(e, t) {
|
||
var r;
|
||
for (r = 0; r < 16; r++)
|
||
e[r] = 0 | t[r]
|
||
}
|
||
function b(e, t) {
|
||
var r, a = N();
|
||
for (r = 0; r < 16; ++r)
|
||
a[r] = t[r];
|
||
for (r = 253; r >= 0; --r)
|
||
R(a, a),
|
||
2 !== r && 4 !== r && _(a, a, t);
|
||
for (r = 0; r < 16; ++r)
|
||
e[r] = a[r]
|
||
}
|
||
function A(e) {
|
||
var t, r, a = 1;
|
||
for (t = 0; t < 16; ++t)
|
||
r = e[t] + a + 65535,
|
||
a = Math.floor(r / 65536),
|
||
e[t] = r - 65536 * a;
|
||
e[0] += a - 1 + 37 * (a - 1)
|
||
}
|
||
function B(e, t, r) {
|
||
for (var a, n = ~(r - 1), i = 0; i < 16; ++i)
|
||
a = n & (e[i] ^ t[i]),
|
||
e[i] ^= a,
|
||
t[i] ^= a
|
||
}
|
||
function N(e) {
|
||
var t, r = new Float64Array(16);
|
||
if (e)
|
||
for (t = 0; t < e.length; ++t)
|
||
r[t] = e[t];
|
||
return r
|
||
}
|
||
function k(e, t, r) {
|
||
for (var a = 0; a < 16; ++a)
|
||
e[a] = t[a] + r[a]
|
||
}
|
||
function w(e, t, r) {
|
||
for (var a = 0; a < 16; ++a)
|
||
e[a] = t[a] - r[a]
|
||
}
|
||
function R(e, t) {
|
||
_(e, t, t)
|
||
}
|
||
function _(e, t, r) {
|
||
var a, n, i = 0, s = 0, o = 0, c = 0, u = 0, l = 0, p = 0, f = 0, h = 0, d = 0, y = 0, g = 0, v = 0, m = 0, C = 0, E = 0, S = 0, T = 0, I = 0, b = 0, A = 0, B = 0, N = 0, k = 0, w = 0, R = 0, _ = 0, L = 0, U = 0, D = 0, P = 0, V = r[0], O = r[1], K = r[2], x = r[3], M = r[4], F = r[5], q = r[6], j = r[7], G = r[8], H = r[9], Q = r[10], z = r[11], W = r[12], Y = r[13], X = r[14], Z = r[15];
|
||
a = t[0],
|
||
i += a * V,
|
||
s += a * O,
|
||
o += a * K,
|
||
c += a * x,
|
||
u += a * M,
|
||
l += a * F,
|
||
p += a * q,
|
||
f += a * j,
|
||
h += a * G,
|
||
d += a * H,
|
||
y += a * Q,
|
||
g += a * z,
|
||
v += a * W,
|
||
m += a * Y,
|
||
C += a * X,
|
||
E += a * Z,
|
||
a = t[1],
|
||
s += a * V,
|
||
o += a * O,
|
||
c += a * K,
|
||
u += a * x,
|
||
l += a * M,
|
||
p += a * F,
|
||
f += a * q,
|
||
h += a * j,
|
||
d += a * G,
|
||
y += a * H,
|
||
g += a * Q,
|
||
v += a * z,
|
||
m += a * W,
|
||
C += a * Y,
|
||
E += a * X,
|
||
S += a * Z,
|
||
a = t[2],
|
||
o += a * V,
|
||
c += a * O,
|
||
u += a * K,
|
||
l += a * x,
|
||
p += a * M,
|
||
f += a * F,
|
||
h += a * q,
|
||
d += a * j,
|
||
y += a * G,
|
||
g += a * H,
|
||
v += a * Q,
|
||
m += a * z,
|
||
C += a * W,
|
||
E += a * Y,
|
||
S += a * X,
|
||
T += a * Z,
|
||
a = t[3],
|
||
c += a * V,
|
||
u += a * O,
|
||
l += a * K,
|
||
p += a * x,
|
||
f += a * M,
|
||
h += a * F,
|
||
d += a * q,
|
||
y += a * j,
|
||
g += a * G,
|
||
v += a * H,
|
||
m += a * Q,
|
||
C += a * z,
|
||
E += a * W,
|
||
S += a * Y,
|
||
T += a * X,
|
||
I += a * Z,
|
||
a = t[4],
|
||
u += a * V,
|
||
l += a * O,
|
||
p += a * K,
|
||
f += a * x,
|
||
h += a * M,
|
||
d += a * F,
|
||
y += a * q,
|
||
g += a * j,
|
||
v += a * G,
|
||
m += a * H,
|
||
C += a * Q,
|
||
E += a * z,
|
||
S += a * W,
|
||
T += a * Y,
|
||
I += a * X,
|
||
b += a * Z,
|
||
a = t[5],
|
||
l += a * V,
|
||
p += a * O,
|
||
f += a * K,
|
||
h += a * x,
|
||
d += a * M,
|
||
y += a * F,
|
||
g += a * q,
|
||
v += a * j,
|
||
m += a * G,
|
||
C += a * H,
|
||
E += a * Q,
|
||
S += a * z,
|
||
T += a * W,
|
||
I += a * Y,
|
||
b += a * X,
|
||
A += a * Z,
|
||
a = t[6],
|
||
p += a * V,
|
||
f += a * O,
|
||
h += a * K,
|
||
d += a * x,
|
||
y += a * M,
|
||
g += a * F,
|
||
v += a * q,
|
||
m += a * j,
|
||
C += a * G,
|
||
E += a * H,
|
||
S += a * Q,
|
||
T += a * z,
|
||
I += a * W,
|
||
b += a * Y,
|
||
A += a * X,
|
||
B += a * Z,
|
||
a = t[7],
|
||
f += a * V,
|
||
h += a * O,
|
||
d += a * K,
|
||
y += a * x,
|
||
g += a * M,
|
||
v += a * F,
|
||
m += a * q,
|
||
C += a * j,
|
||
E += a * G,
|
||
S += a * H,
|
||
T += a * Q,
|
||
I += a * z,
|
||
b += a * W,
|
||
A += a * Y,
|
||
B += a * X,
|
||
N += a * Z,
|
||
a = t[8],
|
||
h += a * V,
|
||
d += a * O,
|
||
y += a * K,
|
||
g += a * x,
|
||
v += a * M,
|
||
m += a * F,
|
||
C += a * q,
|
||
E += a * j,
|
||
S += a * G,
|
||
T += a * H,
|
||
I += a * Q,
|
||
b += a * z,
|
||
A += a * W,
|
||
B += a * Y,
|
||
N += a * X,
|
||
k += a * Z,
|
||
a = t[9],
|
||
d += a * V,
|
||
y += a * O,
|
||
g += a * K,
|
||
v += a * x,
|
||
m += a * M,
|
||
C += a * F,
|
||
E += a * q,
|
||
S += a * j,
|
||
T += a * G,
|
||
I += a * H,
|
||
b += a * Q,
|
||
A += a * z,
|
||
B += a * W,
|
||
N += a * Y,
|
||
k += a * X,
|
||
w += a * Z,
|
||
a = t[10],
|
||
y += a * V,
|
||
g += a * O,
|
||
v += a * K,
|
||
m += a * x,
|
||
C += a * M,
|
||
E += a * F,
|
||
S += a * q,
|
||
T += a * j,
|
||
I += a * G,
|
||
b += a * H,
|
||
A += a * Q,
|
||
B += a * z,
|
||
N += a * W,
|
||
k += a * Y,
|
||
w += a * X,
|
||
R += a * Z,
|
||
a = t[11],
|
||
g += a * V,
|
||
v += a * O,
|
||
m += a * K,
|
||
C += a * x,
|
||
E += a * M,
|
||
S += a * F,
|
||
T += a * q,
|
||
I += a * j,
|
||
b += a * G,
|
||
A += a * H,
|
||
B += a * Q,
|
||
N += a * z;
|
||
k += a * W,
|
||
w += a * Y,
|
||
R += a * X,
|
||
_ += a * Z,
|
||
a = t[12],
|
||
v += a * V,
|
||
m += a * O,
|
||
C += a * K,
|
||
E += a * x,
|
||
S += a * M,
|
||
T += a * F,
|
||
I += a * q,
|
||
b += a * j,
|
||
A += a * G,
|
||
B += a * H,
|
||
N += a * Q,
|
||
k += a * z,
|
||
w += a * W,
|
||
R += a * Y,
|
||
_ += a * X,
|
||
L += a * Z,
|
||
a = t[13],
|
||
m += a * V,
|
||
C += a * O,
|
||
E += a * K,
|
||
S += a * x,
|
||
T += a * M,
|
||
I += a * F,
|
||
b += a * q,
|
||
A += a * j,
|
||
B += a * G,
|
||
N += a * H,
|
||
k += a * Q,
|
||
w += a * z,
|
||
R += a * W,
|
||
_ += a * Y,
|
||
L += a * X,
|
||
U += a * Z,
|
||
a = t[14],
|
||
C += a * V,
|
||
E += a * O,
|
||
S += a * K,
|
||
T += a * x,
|
||
I += a * M,
|
||
b += a * F,
|
||
A += a * q,
|
||
B += a * j,
|
||
N += a * G,
|
||
k += a * H,
|
||
w += a * Q,
|
||
R += a * z,
|
||
_ += a * W,
|
||
L += a * Y,
|
||
U += a * X,
|
||
D += a * Z,
|
||
a = t[15],
|
||
E += a * V,
|
||
S += a * O,
|
||
T += a * K,
|
||
I += a * x,
|
||
b += a * M,
|
||
A += a * F,
|
||
B += a * q,
|
||
N += a * j,
|
||
k += a * G,
|
||
w += a * H,
|
||
R += a * Q,
|
||
_ += a * z,
|
||
L += a * W,
|
||
U += a * Y,
|
||
D += a * X,
|
||
P += a * Z,
|
||
i += 38 * S,
|
||
s += 38 * T,
|
||
o += 38 * I,
|
||
c += 38 * b,
|
||
u += 38 * A,
|
||
l += 38 * B,
|
||
p += 38 * N,
|
||
f += 38 * k,
|
||
h += 38 * w,
|
||
d += 38 * R,
|
||
y += 38 * _,
|
||
g += 38 * L,
|
||
v += 38 * U,
|
||
m += 38 * D,
|
||
C += 38 * P,
|
||
n = 1,
|
||
a = i + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
i = a - 65536 * n,
|
||
a = s + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
s = a - 65536 * n,
|
||
a = o + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
o = a - 65536 * n,
|
||
a = c + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
c = a - 65536 * n,
|
||
a = u + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
u = a - 65536 * n,
|
||
a = l + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
l = a - 65536 * n,
|
||
a = p + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
p = a - 65536 * n,
|
||
a = f + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
f = a - 65536 * n,
|
||
a = h + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
h = a - 65536 * n,
|
||
a = d + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
d = a - 65536 * n,
|
||
a = y + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
y = a - 65536 * n,
|
||
a = g + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
g = a - 65536 * n,
|
||
a = v + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
v = a - 65536 * n,
|
||
a = m + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
m = a - 65536 * n,
|
||
a = C + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
C = a - 65536 * n,
|
||
a = E + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
E = a - 65536 * n,
|
||
i += n - 1 + 37 * (n - 1),
|
||
n = 1,
|
||
a = i + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
i = a - 65536 * n,
|
||
a = s + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
s = a - 65536 * n,
|
||
a = o + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
o = a - 65536 * n,
|
||
a = c + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
c = a - 65536 * n,
|
||
a = u + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
u = a - 65536 * n,
|
||
a = l + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
l = a - 65536 * n,
|
||
a = p + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
p = a - 65536 * n,
|
||
a = f + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
f = a - 65536 * n,
|
||
a = h + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
h = a - 65536 * n,
|
||
a = d + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
d = a - 65536 * n,
|
||
a = y + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
y = a - 65536 * n,
|
||
a = g + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
g = a - 65536 * n,
|
||
a = v + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
v = a - 65536 * n,
|
||
a = m + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
m = a - 65536 * n,
|
||
a = C + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
C = a - 65536 * n,
|
||
a = E + n + 65535,
|
||
n = Math.floor(a / 65536),
|
||
E = a - 65536 * n,
|
||
i += n - 1 + 37 * (n - 1),
|
||
e[0] = i,
|
||
e[1] = s,
|
||
e[2] = o,
|
||
e[3] = c,
|
||
e[4] = u,
|
||
e[5] = l,
|
||
e[6] = p,
|
||
e[7] = f,
|
||
e[8] = h,
|
||
e[9] = d,
|
||
e[10] = y,
|
||
e[11] = g,
|
||
e[12] = v;
|
||
e[13] = m,
|
||
e[14] = C,
|
||
e[15] = E
|
||
}
|
||
var L = r(0);
|
||
if (r(12),
|
||
r(2),
|
||
r(32),
|
||
r(1),
|
||
void 0 === U)
|
||
var U = L.jsbn.BigInteger;
|
||
var D = L.util.ByteBuffer
|
||
, P = "undefined" == typeof Buffer ? Uint8Array : Buffer;
|
||
L.pki = L.pki || {},
|
||
e.exports = L.pki.ed25519 = L.ed25519 = L.ed25519 || {};
|
||
var V = L.ed25519;
|
||
V.constants = {},
|
||
V.constants.PUBLIC_KEY_BYTE_LENGTH = 32,
|
||
V.constants.PRIVATE_KEY_BYTE_LENGTH = 64,
|
||
V.constants.SEED_BYTE_LENGTH = 32,
|
||
V.constants.SIGN_BYTE_LENGTH = 64,
|
||
V.constants.HASH_BYTE_LENGTH = 64,
|
||
V.generateKeyPair = function(e) {
|
||
e = e || {};
|
||
var t = e.seed;
|
||
if (void 0 === t)
|
||
t = L.random.getBytesSync(V.constants.SEED_BYTE_LENGTH);
|
||
else if ("string" == typeof t) {
|
||
if (t.length !== V.constants.SEED_BYTE_LENGTH)
|
||
throw new TypeError('"seed" must be ' + V.constants.SEED_BYTE_LENGTH + " bytes in length.")
|
||
} else if (!(t instanceof Uint8Array))
|
||
throw new TypeError('"seed" must be a node.js Buffer, Uint8Array, or a binary string.');
|
||
t = a({
|
||
message: t,
|
||
encoding: "binary"
|
||
});
|
||
for (var r = new P(V.constants.PUBLIC_KEY_BYTE_LENGTH), n = new P(V.constants.PRIVATE_KEY_BYTE_LENGTH), s = 0; s < 32; ++s)
|
||
n[s] = t[s];
|
||
return i(r, n),
|
||
{
|
||
publicKey: r,
|
||
privateKey: n
|
||
}
|
||
}
|
||
,
|
||
V.publicKeyFromPrivateKey = function(e) {
|
||
e = e || {};
|
||
var t = a({
|
||
message: e.privateKey,
|
||
encoding: "binary"
|
||
});
|
||
if (t.length !== V.constants.PRIVATE_KEY_BYTE_LENGTH)
|
||
throw new TypeError('"options.privateKey" must have a byte length of ' + V.constants.PRIVATE_KEY_BYTE_LENGTH);
|
||
for (var r = new P(V.constants.PUBLIC_KEY_BYTE_LENGTH), n = 0; n < r.length; ++n)
|
||
r[n] = t[32 + n];
|
||
return r
|
||
}
|
||
,
|
||
V.sign = function(e) {
|
||
e = e || {};
|
||
var t = a(e)
|
||
, r = a({
|
||
message: e.privateKey,
|
||
encoding: "binary"
|
||
});
|
||
if (r.length !== V.constants.PRIVATE_KEY_BYTE_LENGTH)
|
||
throw new TypeError('"options.privateKey" must have a byte length of ' + V.constants.PRIVATE_KEY_BYTE_LENGTH);
|
||
var n = new P(V.constants.SIGN_BYTE_LENGTH + t.length);
|
||
s(n, t, t.length, r);
|
||
for (var i = new P(V.constants.SIGN_BYTE_LENGTH), o = 0; o < i.length; ++o)
|
||
i[o] = n[o];
|
||
return i
|
||
}
|
||
,
|
||
V.verify = function(e) {
|
||
e = e || {};
|
||
var t = a(e);
|
||
if (void 0 === e.signature)
|
||
throw new TypeError('"options.signature" must be a node.js Buffer, a Uint8Array, a forge ByteBuffer, or a binary string.');
|
||
var r = a({
|
||
message: e.signature,
|
||
encoding: "binary"
|
||
});
|
||
if (r.length !== V.constants.SIGN_BYTE_LENGTH)
|
||
throw new TypeError('"options.signature" must have a byte length of ' + V.constants.SIGN_BYTE_LENGTH);
|
||
var n = a({
|
||
message: e.publicKey,
|
||
encoding: "binary"
|
||
});
|
||
if (n.length !== V.constants.PUBLIC_KEY_BYTE_LENGTH)
|
||
throw new TypeError('"options.publicKey" must have a byte length of ' + V.constants.PUBLIC_KEY_BYTE_LENGTH);
|
||
var i, s = new P(V.constants.SIGN_BYTE_LENGTH + t.length), c = new P(V.constants.SIGN_BYTE_LENGTH + t.length);
|
||
for (i = 0; i < V.constants.SIGN_BYTE_LENGTH; ++i)
|
||
s[i] = r[i];
|
||
for (i = 0; i < t.length; ++i)
|
||
s[i + V.constants.SIGN_BYTE_LENGTH] = t[i];
|
||
return o(c, s, s.length, n) >= 0
|
||
}
|
||
;
|
||
var O = N()
|
||
, K = N([1])
|
||
, x = N([30883, 4953, 19914, 30187, 55467, 16705, 2637, 112, 59544, 30585, 16505, 36039, 65139, 11119, 27886, 20995])
|
||
, M = N([61785, 9906, 39828, 60374, 45398, 33411, 5274, 224, 53552, 61171, 33010, 6542, 64743, 22239, 55772, 9222])
|
||
, F = N([54554, 36645, 11616, 51542, 42930, 38181, 51040, 26924, 56412, 64982, 57905, 49316, 21502, 52590, 14035, 8553])
|
||
, q = N([26200, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214])
|
||
, j = new Float64Array([237, 211, 245, 92, 26, 99, 18, 88, 214, 156, 247, 162, 222, 249, 222, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16])
|
||
, G = N([41136, 18958, 6951, 50414, 58488, 44335, 6150, 12099, 55207, 15867, 153, 11085, 57099, 20417, 9344, 11139])
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e, t, r, a) {
|
||
e.generate = function(e, i) {
|
||
for (var s = new n.util.ByteBuffer, o = Math.ceil(i / a) + r, c = new n.util.ByteBuffer, u = r; u < o; ++u) {
|
||
c.putInt32(u),
|
||
t.start(),
|
||
t.update(e + c.getBytes());
|
||
var l = t.digest();
|
||
s.putBytes(l.getBytes(a))
|
||
}
|
||
return s.truncate(s.length() - i),
|
||
s.getBytes()
|
||
}
|
||
}
|
||
var n = r(0);
|
||
r(1),
|
||
r(2),
|
||
r(12),
|
||
e.exports = n.kem = n.kem || {};
|
||
var i = n.jsbn.BigInteger;
|
||
n.kem.rsa = {},
|
||
n.kem.rsa.create = function(e, t) {
|
||
t = t || {};
|
||
var r = t.prng || n.random
|
||
, a = {};
|
||
return a.encrypt = function(t, a) {
|
||
var s, o = Math.ceil(t.n.bitLength() / 8);
|
||
do {
|
||
s = new i(n.util.bytesToHex(r.getBytesSync(o)),16).mod(t.n)
|
||
} while (s.compareTo(i.ONE) <= 0);
|
||
s = n.util.hexToBytes(s.toString(16));
|
||
var c = o - s.length;
|
||
return c > 0 && (s = n.util.fillString(String.fromCharCode(0), c) + s),
|
||
{
|
||
encapsulation: t.encrypt(s, "NONE"),
|
||
key: e.generate(s, a)
|
||
}
|
||
}
|
||
,
|
||
a.decrypt = function(t, r, a) {
|
||
var n = t.decrypt(r, "NONE");
|
||
return e.generate(n, a)
|
||
}
|
||
,
|
||
a
|
||
}
|
||
,
|
||
n.kem.kdf1 = function(e, t) {
|
||
a(this, e, 0, t || e.digestLength)
|
||
}
|
||
,
|
||
n.kem.kdf2 = function(e, t) {
|
||
a(this, e, 1, t || e.digestLength)
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
e.exports = r(4),
|
||
r(14),
|
||
r(9),
|
||
r(23),
|
||
r(32)
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e) {
|
||
var t = {}
|
||
, r = [];
|
||
if (!d.validate(e, y.asn1.recipientInfoValidator, t, r)) {
|
||
var a = new Error("Cannot read PKCS#7 RecipientInfo. ASN.1 object is not an PKCS#7 RecipientInfo.");
|
||
throw a.errors = r,
|
||
a
|
||
}
|
||
return {
|
||
version: t.version.charCodeAt(0),
|
||
issuer: h.pki.RDNAttributesAsArray(t.issuer),
|
||
serialNumber: h.util.createBuffer(t.serial).toHex(),
|
||
encryptedContent: {
|
||
algorithm: d.derToOid(t.encAlgorithm),
|
||
parameter: t.encParameter.value,
|
||
content: t.encKey
|
||
}
|
||
}
|
||
}
|
||
function n(e) {
|
||
return d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.INTEGER, !1, d.integerToDer(e.version).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [h.pki.distinguishedNameToAsn1({
|
||
attributes: e.issuer
|
||
}), d.create(d.Class.UNIVERSAL, d.Type.INTEGER, !1, h.util.hexToBytes(e.serialNumber))]), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.encryptedContent.algorithm).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.NULL, !1, "")]), d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, e.encryptedContent.content)])
|
||
}
|
||
function i(e) {
|
||
for (var t = [], r = 0; r < e.length; ++r)
|
||
t.push(a(e[r]));
|
||
return t
|
||
}
|
||
function s(e) {
|
||
for (var t = [], r = 0; r < e.length; ++r)
|
||
t.push(n(e[r]));
|
||
return t
|
||
}
|
||
function o(e) {
|
||
var t = d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.INTEGER, !1, d.integerToDer(e.version).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [h.pki.distinguishedNameToAsn1({
|
||
attributes: e.issuer
|
||
}), d.create(d.Class.UNIVERSAL, d.Type.INTEGER, !1, h.util.hexToBytes(e.serialNumber))]), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.digestAlgorithm).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.NULL, !1, "")])]);
|
||
if (e.authenticatedAttributesAsn1 && t.value.push(e.authenticatedAttributesAsn1),
|
||
t.value.push(d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.signatureAlgorithm).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.NULL, !1, "")])),
|
||
t.value.push(d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, e.signature)),
|
||
e.unauthenticatedAttributes.length > 0) {
|
||
for (var r = d.create(d.Class.CONTEXT_SPECIFIC, 1, !0, []), a = 0; a < e.unauthenticatedAttributes.length; ++a) {
|
||
var n = e.unauthenticatedAttributes[a];
|
||
r.values.push(u(n))
|
||
}
|
||
t.value.push(r)
|
||
}
|
||
return t
|
||
}
|
||
function c(e) {
|
||
for (var t = [], r = 0; r < e.length; ++r)
|
||
t.push(o(e[r]));
|
||
return t
|
||
}
|
||
function u(e) {
|
||
var t;
|
||
if (e.type === h.pki.oids.contentType)
|
||
t = d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.value).getBytes());
|
||
else if (e.type === h.pki.oids.messageDigest)
|
||
t = d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, e.value.bytes());
|
||
else if (e.type === h.pki.oids.signingTime) {
|
||
var r = new Date("1950-01-01T00:00:00Z")
|
||
, a = new Date("2050-01-01T00:00:00Z")
|
||
, n = e.value;
|
||
if ("string" == typeof n) {
|
||
var i = Date.parse(n);
|
||
n = isNaN(i) ? 13 === n.length ? d.utcTimeToDate(n) : d.generalizedTimeToDate(n) : new Date(i)
|
||
}
|
||
t = n >= r && n < a ? d.create(d.Class.UNIVERSAL, d.Type.UTCTIME, !1, d.dateToUtcTime(n)) : d.create(d.Class.UNIVERSAL, d.Type.GENERALIZEDTIME, !1, d.dateToGeneralizedTime(n))
|
||
}
|
||
return d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.type).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.SET, !0, [t])])
|
||
}
|
||
function l(e) {
|
||
return [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(h.pki.oids.data).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.algorithm).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, e.parameter.getBytes())]), d.create(d.Class.CONTEXT_SPECIFIC, 0, !0, [d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, e.content.getBytes())])]
|
||
}
|
||
function p(e, t, r) {
|
||
var a = {}
|
||
, n = [];
|
||
if (!d.validate(t, r, a, n)) {
|
||
var i = new Error("Cannot read PKCS#7 message. ASN.1 object is not a supported PKCS#7 message.");
|
||
throw i.errors = i,
|
||
i
|
||
}
|
||
if (d.derToOid(a.contentType) !== h.pki.oids.data)
|
||
throw new Error("Unsupported PKCS#7 message. Only wrapped ContentType Data supported.");
|
||
if (a.encryptedContent) {
|
||
var s = "";
|
||
if (h.util.isArray(a.encryptedContent))
|
||
for (var o = 0; o < a.encryptedContent.length; ++o) {
|
||
if (a.encryptedContent[o].type !== d.Type.OCTETSTRING)
|
||
throw new Error("Malformed PKCS#7 message, expecting encrypted content constructed of only OCTET STRING objects.");
|
||
s += a.encryptedContent[o].value
|
||
}
|
||
else
|
||
s = a.encryptedContent;
|
||
e.encryptedContent = {
|
||
algorithm: d.derToOid(a.encAlgorithm),
|
||
parameter: h.util.createBuffer(a.encParameter.value),
|
||
content: h.util.createBuffer(s)
|
||
}
|
||
}
|
||
if (a.content) {
|
||
var s = "";
|
||
if (h.util.isArray(a.content))
|
||
for (var o = 0; o < a.content.length; ++o) {
|
||
if (a.content[o].type !== d.Type.OCTETSTRING)
|
||
throw new Error("Malformed PKCS#7 message, expecting content constructed of only OCTET STRING objects.");
|
||
s += a.content[o].value
|
||
}
|
||
else
|
||
s = a.content;
|
||
e.content = h.util.createBuffer(s)
|
||
}
|
||
return e.version = a.version.charCodeAt(0),
|
||
e.rawCapture = a,
|
||
a
|
||
}
|
||
function f(e) {
|
||
if (void 0 === e.encryptedContent.key)
|
||
throw new Error("Symmetric key not available.");
|
||
if (void 0 === e.content) {
|
||
var t;
|
||
switch (e.encryptedContent.algorithm) {
|
||
case h.pki.oids["aes128-CBC"]:
|
||
case h.pki.oids["aes192-CBC"]:
|
||
case h.pki.oids["aes256-CBC"]:
|
||
t = h.aes.createDecryptionCipher(e.encryptedContent.key);
|
||
break;
|
||
case h.pki.oids.desCBC:
|
||
case h.pki.oids["des-EDE3-CBC"]:
|
||
t = h.des.createDecryptionCipher(e.encryptedContent.key);
|
||
break;
|
||
default:
|
||
throw new Error("Unsupported symmetric cipher, OID " + e.encryptedContent.algorithm)
|
||
}
|
||
if (t.start(e.encryptedContent.parameter),
|
||
t.update(e.encryptedContent.content),
|
||
!t.finish())
|
||
throw new Error("Symmetric decryption failed.");
|
||
e.content = t.output
|
||
}
|
||
}
|
||
var h = r(0);
|
||
r(5),
|
||
r(3),
|
||
r(10),
|
||
r(6),
|
||
r(7),
|
||
r(29),
|
||
r(2),
|
||
r(1),
|
||
r(17);
|
||
var d = h.asn1
|
||
, y = e.exports = h.pkcs7 = h.pkcs7 || {};
|
||
y.messageFromPem = function(e) {
|
||
var t = h.pem.decode(e)[0];
|
||
if ("PKCS7" !== t.type) {
|
||
var r = new Error('Could not convert PKCS#7 message from PEM; PEM header type is not "PKCS#7".');
|
||
throw r.headerType = t.type,
|
||
r
|
||
}
|
||
if (t.procType && "ENCRYPTED" === t.procType.type)
|
||
throw new Error("Could not convert PKCS#7 message from PEM; PEM is encrypted.");
|
||
var a = d.fromDer(t.body);
|
||
return y.messageFromAsn1(a)
|
||
}
|
||
,
|
||
y.messageToPem = function(e, t) {
|
||
var r = {
|
||
type: "PKCS7",
|
||
body: d.toDer(e.toAsn1()).getBytes()
|
||
};
|
||
return h.pem.encode(r, {
|
||
maxline: t
|
||
})
|
||
}
|
||
,
|
||
y.messageFromAsn1 = function(e) {
|
||
var t = {}
|
||
, r = [];
|
||
if (!d.validate(e, y.asn1.contentInfoValidator, t, r)) {
|
||
var a = new Error("Cannot read PKCS#7 message. ASN.1 object is not an PKCS#7 ContentInfo.");
|
||
throw a.errors = r,
|
||
a
|
||
}
|
||
var n, i = d.derToOid(t.contentType);
|
||
switch (i) {
|
||
case h.pki.oids.envelopedData:
|
||
n = y.createEnvelopedData();
|
||
break;
|
||
case h.pki.oids.encryptedData:
|
||
n = y.createEncryptedData();
|
||
break;
|
||
case h.pki.oids.signedData:
|
||
n = y.createSignedData();
|
||
break;
|
||
default:
|
||
throw new Error("Cannot read PKCS#7 message. ContentType with OID " + i + " is not (yet) supported.")
|
||
}
|
||
return n.fromAsn1(t.content.value[0]),
|
||
n
|
||
}
|
||
,
|
||
y.createSignedData = function() {
|
||
function e() {
|
||
for (var e = {}, t = 0; t < r.signers.length; ++t) {
|
||
var a = r.signers[t]
|
||
, n = a.digestAlgorithm;
|
||
n in e || (e[n] = h.md[h.pki.oids[n]].create()),
|
||
0 === a.authenticatedAttributes.length ? a.md = e[n] : a.md = h.md[h.pki.oids[n]].create()
|
||
}
|
||
r.digestAlgorithmIdentifiers = [];
|
||
for (var n in e)
|
||
r.digestAlgorithmIdentifiers.push(d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(n).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.NULL, !1, "")]));
|
||
return e
|
||
}
|
||
function t(e) {
|
||
var t;
|
||
if (r.detachedContent ? t = r.detachedContent : (t = r.contentInfo.value[1],
|
||
t = t.value[0]),
|
||
!t)
|
||
throw new Error("Could not sign PKCS#7 message; there is no content to sign.");
|
||
var a = d.derToOid(r.contentInfo.value[0].value)
|
||
, n = d.toDer(t);
|
||
n.getByte(),
|
||
d.getBerValueLength(n),
|
||
n = n.getBytes();
|
||
for (var i in e)
|
||
e[i].start().update(n);
|
||
for (var s = new Date, o = 0; o < r.signers.length; ++o) {
|
||
var l = r.signers[o];
|
||
if (0 === l.authenticatedAttributes.length) {
|
||
if (a !== h.pki.oids.data)
|
||
throw new Error("Invalid signer; authenticatedAttributes must be present when the ContentInfo content type is not PKCS#7 Data.")
|
||
} else {
|
||
l.authenticatedAttributesAsn1 = d.create(d.Class.CONTEXT_SPECIFIC, 0, !0, []);
|
||
for (var p = d.create(d.Class.UNIVERSAL, d.Type.SET, !0, []), f = 0; f < l.authenticatedAttributes.length; ++f) {
|
||
var y = l.authenticatedAttributes[f];
|
||
y.type === h.pki.oids.messageDigest ? y.value = e[l.digestAlgorithm].digest() : y.type === h.pki.oids.signingTime && (y.value || (y.value = s)),
|
||
p.value.push(u(y)),
|
||
l.authenticatedAttributesAsn1.value.push(u(y))
|
||
}
|
||
n = d.toDer(p).getBytes(),
|
||
l.md.start().update(n)
|
||
}
|
||
l.signature = l.key.sign(l.md, "RSASSA-PKCS1-V1_5")
|
||
}
|
||
r.signerInfos = c(r.signers)
|
||
}
|
||
var r = null;
|
||
return r = {
|
||
type: h.pki.oids.signedData,
|
||
version: 1,
|
||
certificates: [],
|
||
crls: [],
|
||
signers: [],
|
||
digestAlgorithmIdentifiers: [],
|
||
contentInfo: null,
|
||
signerInfos: [],
|
||
fromAsn1: function(e) {
|
||
if (p(r, e, y.asn1.signedDataValidator),
|
||
r.certificates = [],
|
||
r.crls = [],
|
||
r.digestAlgorithmIdentifiers = [],
|
||
r.contentInfo = null,
|
||
r.signerInfos = [],
|
||
r.rawCapture.certificates)
|
||
for (var t = r.rawCapture.certificates.value, a = 0; a < t.length; ++a)
|
||
r.certificates.push(h.pki.certificateFromAsn1(t[a]))
|
||
},
|
||
toAsn1: function() {
|
||
r.contentInfo || r.sign();
|
||
for (var e = [], t = 0; t < r.certificates.length; ++t)
|
||
e.push(h.pki.certificateToAsn1(r.certificates[t]));
|
||
var a = []
|
||
, n = d.create(d.Class.CONTEXT_SPECIFIC, 0, !0, [d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.INTEGER, !1, d.integerToDer(r.version).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.SET, !0, r.digestAlgorithmIdentifiers), r.contentInfo])]);
|
||
return e.length > 0 && n.value[0].value.push(d.create(d.Class.CONTEXT_SPECIFIC, 0, !0, e)),
|
||
a.length > 0 && n.value[0].value.push(d.create(d.Class.CONTEXT_SPECIFIC, 1, !0, a)),
|
||
n.value[0].value.push(d.create(d.Class.UNIVERSAL, d.Type.SET, !0, r.signerInfos)),
|
||
d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(r.type).getBytes()), n])
|
||
},
|
||
addSigner: function(e) {
|
||
var t = e.issuer
|
||
, a = e.serialNumber;
|
||
if (e.certificate) {
|
||
var n = e.certificate;
|
||
"string" == typeof n && (n = h.pki.certificateFromPem(n)),
|
||
t = n.issuer.attributes,
|
||
a = n.serialNumber
|
||
}
|
||
var i = e.key;
|
||
if (!i)
|
||
throw new Error("Could not add PKCS#7 signer; no private key specified.");
|
||
"string" == typeof i && (i = h.pki.privateKeyFromPem(i));
|
||
var s = e.digestAlgorithm || h.pki.oids.sha1;
|
||
switch (s) {
|
||
case h.pki.oids.sha1:
|
||
case h.pki.oids.sha256:
|
||
case h.pki.oids.sha384:
|
||
case h.pki.oids.sha512:
|
||
case h.pki.oids.md5:
|
||
break;
|
||
default:
|
||
throw new Error("Could not add PKCS#7 signer; unknown message digest algorithm: " + s)
|
||
}
|
||
var o = e.authenticatedAttributes || [];
|
||
if (o.length > 0) {
|
||
for (var c = !1, u = !1, l = 0; l < o.length; ++l) {
|
||
var p = o[l];
|
||
if (c || p.type !== h.pki.oids.contentType) {
|
||
if (u || p.type !== h.pki.oids.messageDigest)
|
||
;
|
||
else if (u = !0,
|
||
c)
|
||
break
|
||
} else if (c = !0,
|
||
u)
|
||
break
|
||
}
|
||
if (!c || !u)
|
||
throw new Error("Invalid signer.authenticatedAttributes. If signer.authenticatedAttributes is specified, then it must contain at least two attributes, PKCS #9 content-type and PKCS #9 message-digest.")
|
||
}
|
||
r.signers.push({
|
||
key: i,
|
||
version: 1,
|
||
issuer: t,
|
||
serialNumber: a,
|
||
digestAlgorithm: s,
|
||
signatureAlgorithm: h.pki.oids.rsaEncryption,
|
||
signature: null,
|
||
authenticatedAttributes: o,
|
||
unauthenticatedAttributes: []
|
||
})
|
||
},
|
||
sign: function(a) {
|
||
if (a = a || {},
|
||
("object" != typeof r.content || null === r.contentInfo) && (r.contentInfo = d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(h.pki.oids.data).getBytes())]),
|
||
"content"in r)) {
|
||
var n;
|
||
r.content instanceof h.util.ByteBuffer ? n = r.content.bytes() : "string" == typeof r.content && (n = h.util.encodeUtf8(r.content)),
|
||
a.detached ? r.detachedContent = d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, n) : r.contentInfo.value.push(d.create(d.Class.CONTEXT_SPECIFIC, 0, !0, [d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, n)]))
|
||
}
|
||
if (0 !== r.signers.length) {
|
||
t(e())
|
||
}
|
||
},
|
||
verify: function() {
|
||
throw new Error("PKCS#7 signature verification not yet implemented.")
|
||
},
|
||
addCertificate: function(e) {
|
||
"string" == typeof e && (e = h.pki.certificateFromPem(e)),
|
||
r.certificates.push(e)
|
||
},
|
||
addCertificateRevokationList: function(e) {
|
||
throw new Error("PKCS#7 CRL support not yet implemented.")
|
||
}
|
||
}
|
||
}
|
||
,
|
||
y.createEncryptedData = function() {
|
||
var e = null;
|
||
return e = {
|
||
type: h.pki.oids.encryptedData,
|
||
version: 0,
|
||
encryptedContent: {
|
||
algorithm: h.pki.oids["aes256-CBC"]
|
||
},
|
||
fromAsn1: function(t) {
|
||
p(e, t, y.asn1.encryptedDataValidator)
|
||
},
|
||
decrypt: function(t) {
|
||
void 0 !== t && (e.encryptedContent.key = t),
|
||
f(e)
|
||
}
|
||
}
|
||
}
|
||
,
|
||
y.createEnvelopedData = function() {
|
||
var e = null;
|
||
return e = {
|
||
type: h.pki.oids.envelopedData,
|
||
version: 0,
|
||
recipients: [],
|
||
encryptedContent: {
|
||
algorithm: h.pki.oids["aes256-CBC"]
|
||
},
|
||
fromAsn1: function(t) {
|
||
var r = p(e, t, y.asn1.envelopedDataValidator);
|
||
e.recipients = i(r.recipientInfos.value)
|
||
},
|
||
toAsn1: function() {
|
||
return d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.type).getBytes()), d.create(d.Class.CONTEXT_SPECIFIC, 0, !0, [d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.INTEGER, !1, d.integerToDer(e.version).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.SET, !0, s(e.recipients)), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, l(e.encryptedContent))])])])
|
||
},
|
||
findRecipient: function(t) {
|
||
for (var r = t.issuer.attributes, a = 0; a < e.recipients.length; ++a) {
|
||
var n = e.recipients[a]
|
||
, i = n.issuer;
|
||
if (n.serialNumber === t.serialNumber && i.length === r.length) {
|
||
for (var s = !0, o = 0; o < r.length; ++o)
|
||
if (i[o].type !== r[o].type || i[o].value !== r[o].value) {
|
||
s = !1;
|
||
break
|
||
}
|
||
if (s)
|
||
return n
|
||
}
|
||
}
|
||
return null
|
||
},
|
||
decrypt: function(t, r) {
|
||
if (void 0 === e.encryptedContent.key && void 0 !== t && void 0 !== r)
|
||
switch (t.encryptedContent.algorithm) {
|
||
case h.pki.oids.rsaEncryption:
|
||
case h.pki.oids.desCBC:
|
||
var a = r.decrypt(t.encryptedContent.content);
|
||
e.encryptedContent.key = h.util.createBuffer(a);
|
||
break;
|
||
default:
|
||
throw new Error("Unsupported asymmetric cipher, OID " + t.encryptedContent.algorithm)
|
||
}
|
||
f(e)
|
||
},
|
||
addRecipient: function(t) {
|
||
e.recipients.push({
|
||
version: 0,
|
||
issuer: t.issuer.attributes,
|
||
serialNumber: t.serialNumber,
|
||
encryptedContent: {
|
||
algorithm: h.pki.oids.rsaEncryption,
|
||
key: t.publicKey
|
||
}
|
||
})
|
||
},
|
||
encrypt: function(t, r) {
|
||
if (void 0 === e.encryptedContent.content) {
|
||
r = r || e.encryptedContent.algorithm,
|
||
t = t || e.encryptedContent.key;
|
||
var a, n, i;
|
||
switch (r) {
|
||
case h.pki.oids["aes128-CBC"]:
|
||
a = 16,
|
||
n = 16,
|
||
i = h.aes.createEncryptionCipher;
|
||
break;
|
||
case h.pki.oids["aes192-CBC"]:
|
||
a = 24,
|
||
n = 16,
|
||
i = h.aes.createEncryptionCipher;
|
||
break;
|
||
case h.pki.oids["aes256-CBC"]:
|
||
a = 32,
|
||
n = 16,
|
||
i = h.aes.createEncryptionCipher;
|
||
break;
|
||
case h.pki.oids["des-EDE3-CBC"]:
|
||
a = 24,
|
||
n = 8,
|
||
i = h.des.createEncryptionCipher;
|
||
break;
|
||
default:
|
||
throw new Error("Unsupported symmetric cipher, OID " + r)
|
||
}
|
||
if (void 0 === t)
|
||
t = h.util.createBuffer(h.random.getBytes(a));
|
||
else if (t.length() != a)
|
||
throw new Error("Symmetric key has wrong length; got " + t.length() + " bytes, expected " + a + ".");
|
||
e.encryptedContent.algorithm = r,
|
||
e.encryptedContent.key = t,
|
||
e.encryptedContent.parameter = h.util.createBuffer(h.random.getBytes(n));
|
||
var s = i(t);
|
||
if (s.start(e.encryptedContent.parameter.copy()),
|
||
s.update(e.content),
|
||
!s.finish())
|
||
throw new Error("Symmetric encryption failed.");
|
||
e.encryptedContent.content = s.output
|
||
}
|
||
for (var o = 0; o < e.recipients.length; ++o) {
|
||
var c = e.recipients[o];
|
||
if (void 0 === c.encryptedContent.content)
|
||
switch (c.encryptedContent.algorithm) {
|
||
case h.pki.oids.rsaEncryption:
|
||
c.encryptedContent.content = c.encryptedContent.key.encrypt(e.encryptedContent.key.data);
|
||
break;
|
||
default:
|
||
throw new Error("Unsupported asymmetric cipher, OID " + c.encryptedContent.algorithm)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
function a(e, t) {
|
||
var r = t.toString(16);
|
||
r[0] >= "8" && (r = "00" + r);
|
||
var a = s.util.hexToBytes(r);
|
||
e.putInt32(a.length),
|
||
e.putBytes(a)
|
||
}
|
||
function n(e, t) {
|
||
e.putInt32(t.length),
|
||
e.putString(t)
|
||
}
|
||
function i() {
|
||
for (var e = s.md.sha1.create(), t = arguments.length, r = 0; r < t; ++r)
|
||
e.update(arguments[r]);
|
||
return e.digest()
|
||
}
|
||
var s = r(0);
|
||
r(5),
|
||
r(8),
|
||
r(14),
|
||
r(9),
|
||
r(1);
|
||
var o = e.exports = s.ssh = s.ssh || {};
|
||
o.privateKeyToPutty = function(e, t, r) {
|
||
r = r || "",
|
||
t = t || "";
|
||
var o = "" === t ? "none" : "aes256-cbc"
|
||
, c = "PuTTY-User-Key-File-2: ssh-rsa\r\n";
|
||
c += "Encryption: " + o + "\r\n",
|
||
c += "Comment: " + r + "\r\n";
|
||
var u = s.util.createBuffer();
|
||
n(u, "ssh-rsa"),
|
||
a(u, e.e),
|
||
a(u, e.n);
|
||
var l = s.util.encode64(u.bytes(), 64)
|
||
, p = Math.floor(l.length / 66) + 1;
|
||
c += "Public-Lines: " + p + "\r\n",
|
||
c += l;
|
||
var f = s.util.createBuffer();
|
||
a(f, e.d),
|
||
a(f, e.p),
|
||
a(f, e.q),
|
||
a(f, e.qInv);
|
||
var h;
|
||
if (t) {
|
||
var d = f.length() + 16 - 1;
|
||
d -= d % 16;
|
||
var y = i(f.bytes());
|
||
y.truncate(y.length() - d + f.length()),
|
||
f.putBuffer(y);
|
||
var g = s.util.createBuffer();
|
||
g.putBuffer(i("\0\0\0\0", t)),
|
||
g.putBuffer(i("\0\0\0", t));
|
||
var v = s.aes.createEncryptionCipher(g.truncate(8), "CBC");
|
||
v.start(s.util.createBuffer().fillWithByte(0, 16)),
|
||
v.update(f.copy()),
|
||
v.finish();
|
||
var m = v.output;
|
||
m.truncate(16),
|
||
h = s.util.encode64(m.bytes(), 64)
|
||
} else
|
||
h = s.util.encode64(f.bytes(), 64);
|
||
p = Math.floor(h.length / 66) + 1,
|
||
c += "\r\nPrivate-Lines: " + p + "\r\n",
|
||
c += h;
|
||
var C = i("putty-private-key-file-mac-key", t)
|
||
, E = s.util.createBuffer();
|
||
n(E, "ssh-rsa"),
|
||
n(E, o),
|
||
n(E, r),
|
||
E.putInt32(u.length()),
|
||
E.putBuffer(u),
|
||
E.putInt32(f.length()),
|
||
E.putBuffer(f);
|
||
var S = s.hmac.create();
|
||
return S.start("sha1", C),
|
||
S.update(E.bytes()),
|
||
c += "\r\nPrivate-MAC: " + S.digest().toHex() + "\r\n"
|
||
}
|
||
,
|
||
o.publicKeyToOpenSSH = function(e, t) {
|
||
t = t || "";
|
||
var r = s.util.createBuffer();
|
||
return n(r, "ssh-rsa"),
|
||
a(r, e.e),
|
||
a(r, e.n),
|
||
"ssh-rsa " + s.util.encode64(r.bytes()) + " " + t
|
||
}
|
||
,
|
||
o.privateKeyToOpenSSH = function(e, t) {
|
||
return t ? s.pki.encryptRsaPrivateKey(e, t, {
|
||
legacy: !0,
|
||
algorithm: "aes128"
|
||
}) : s.pki.privateKeyToPem(e)
|
||
}
|
||
,
|
||
o.getPublicKeyFingerprint = function(e, t) {
|
||
t = t || {};
|
||
var r = t.md || s.md.md5.create()
|
||
, i = s.util.createBuffer();
|
||
n(i, "ssh-rsa"),
|
||
a(i, e.e),
|
||
a(i, e.n),
|
||
r.start(),
|
||
r.update(i.getBytes());
|
||
var o = r.digest();
|
||
if ("hex" === t.encoding) {
|
||
var c = o.toHex();
|
||
return t.delimiter ? c.match(/.{2}/g).join(t.delimiter) : c
|
||
}
|
||
if ("binary" === t.encoding)
|
||
return o.getBytes();
|
||
if (t.encoding)
|
||
throw new Error('Unknown encoding "' + t.encoding + '".');
|
||
return o
|
||
}
|
||
}
|
||
, function(e, t, r) {
|
||
var a = r(0);
|
||
r(31),
|
||
r(33),
|
||
r(1);
|
||
var n = "forge.task"
|
||
, i = {}
|
||
, s = 0;
|
||
a.debug.set(n, "tasks", i);
|
||
var o = {};
|
||
a.debug.set(n, "queues", o);
|
||
var c = "ready"
|
||
, u = "running"
|
||
, l = "blocked"
|
||
, p = "sleeping"
|
||
, f = "done"
|
||
, h = "error"
|
||
, d = "stop"
|
||
, y = "start"
|
||
, g = {};
|
||
g[c] = {},
|
||
g[c][d] = c,
|
||
g[c][y] = u,
|
||
g[c].cancel = f,
|
||
g[c].fail = h,
|
||
g[u] = {},
|
||
g[u][d] = c,
|
||
g[u][y] = u,
|
||
g[u].block = l,
|
||
g[u].unblock = u,
|
||
g[u].sleep = p,
|
||
g[u].wakeup = u,
|
||
g[u].cancel = f,
|
||
g[u].fail = h,
|
||
g[l] = {},
|
||
g[l][d] = l,
|
||
g[l][y] = l,
|
||
g[l].block = l,
|
||
g[l].unblock = l,
|
||
g[l].sleep = l,
|
||
g[l].wakeup = l,
|
||
g[l].cancel = f,
|
||
g[l].fail = h,
|
||
g[p] = {},
|
||
g[p][d] = p,
|
||
g[p][y] = p,
|
||
g[p].block = p,
|
||
g[p].unblock = p,
|
||
g[p].sleep = p,
|
||
g[p].wakeup = p,
|
||
g[p].cancel = f,
|
||
g[p].fail = h,
|
||
g[f] = {},
|
||
g[f][d] = f,
|
||
g[f][y] = f,
|
||
g[f].block = f,
|
||
g[f].unblock = f,
|
||
g[f].sleep = f,
|
||
g[f].wakeup = f,
|
||
g[f].cancel = f,
|
||
g[f].fail = h,
|
||
g[h] = {},
|
||
g[h][d] = h,
|
||
g[h][y] = h,
|
||
g[h].block = h,
|
||
g[h].unblock = h,
|
||
g[h].sleep = h,
|
||
g[h].wakeup = h,
|
||
g[h].cancel = h,
|
||
g[h].fail = h;
|
||
var v = function(e) {
|
||
this.id = -1,
|
||
this.name = e.name || "?",
|
||
this.parent = e.parent || null,
|
||
this.run = e.run,
|
||
this.subtasks = [],
|
||
this.error = !1,
|
||
this.state = c,
|
||
this.blocks = 0,
|
||
this.timeoutId = null,
|
||
this.swapTime = null,
|
||
this.userData = null,
|
||
this.id = s++,
|
||
i[this.id] = this
|
||
};
|
||
v.prototype.debug = function(e) {
|
||
e = e || "",
|
||
a.log.debug(n, e, "[%s][%s] task:", this.id, this.name, this, "subtasks:", this.subtasks.length, "queue:", o)
|
||
}
|
||
,
|
||
v.prototype.next = function(e, t) {
|
||
"function" == typeof e && (t = e,
|
||
e = this.name);
|
||
var r = new v({
|
||
run: t,
|
||
name: e,
|
||
parent: this
|
||
});
|
||
return r.state = u,
|
||
r.type = this.type,
|
||
r.successCallback = this.successCallback || null,
|
||
r.failureCallback = this.failureCallback || null,
|
||
this.subtasks.push(r),
|
||
this
|
||
}
|
||
,
|
||
v.prototype.parallel = function(e, t) {
|
||
return a.util.isArray(e) && (t = e,
|
||
e = this.name),
|
||
this.next(e, function(r) {
|
||
var n = r;
|
||
n.block(t.length);
|
||
for (var i = 0; i < t.length; i++) {
|
||
var s = e + "__parallel-" + r.id + "-" + i
|
||
, o = i;
|
||
!function(e, r) {
|
||
a.task.start({
|
||
type: e,
|
||
run: function(e) {
|
||
t[r](e)
|
||
},
|
||
success: function(e) {
|
||
n.unblock()
|
||
},
|
||
failure: function(e) {
|
||
n.unblock()
|
||
}
|
||
})
|
||
}(s, o)
|
||
}
|
||
})
|
||
}
|
||
,
|
||
v.prototype.stop = function() {
|
||
this.state = g[this.state][d]
|
||
}
|
||
,
|
||
v.prototype.start = function() {
|
||
this.error = !1,
|
||
this.state = g[this.state][y],
|
||
this.state === u && (this.start = new Date,
|
||
this.run(this),
|
||
C(this, 0))
|
||
}
|
||
,
|
||
v.prototype.block = function(e) {
|
||
e = void 0 === e ? 1 : e,
|
||
this.blocks += e,
|
||
this.blocks > 0 && (this.state = g[this.state].block)
|
||
}
|
||
,
|
||
v.prototype.unblock = function(e) {
|
||
return e = void 0 === e ? 1 : e,
|
||
this.blocks -= e,
|
||
0 === this.blocks && this.state !== f && (this.state = u,
|
||
C(this, 0)),
|
||
this.blocks
|
||
}
|
||
,
|
||
v.prototype.sleep = function(e) {
|
||
e = void 0 === e ? 0 : e,
|
||
this.state = g[this.state].sleep;
|
||
var t = this;
|
||
this.timeoutId = setTimeout(function() {
|
||
t.timeoutId = null,
|
||
t.state = u,
|
||
C(t, 0)
|
||
}, e)
|
||
}
|
||
,
|
||
v.prototype.wait = function(e) {
|
||
e.wait(this)
|
||
}
|
||
,
|
||
v.prototype.wakeup = function() {
|
||
this.state === p && (cancelTimeout(this.timeoutId),
|
||
this.timeoutId = null,
|
||
this.state = u,
|
||
C(this, 0))
|
||
}
|
||
,
|
||
v.prototype.cancel = function() {
|
||
this.state = g[this.state].cancel,
|
||
this.permitsNeeded = 0,
|
||
null !== this.timeoutId && (cancelTimeout(this.timeoutId),
|
||
this.timeoutId = null),
|
||
this.subtasks = []
|
||
}
|
||
,
|
||
v.prototype.fail = function(e) {
|
||
if (this.error = !0,
|
||
E(this, !0),
|
||
e)
|
||
e.error = this.error,
|
||
e.swapTime = this.swapTime,
|
||
e.userData = this.userData,
|
||
C(e, 0);
|
||
else {
|
||
if (null !== this.parent) {
|
||
for (var t = this.parent; null !== t.parent; )
|
||
t.error = this.error,
|
||
t.swapTime = this.swapTime,
|
||
t.userData = this.userData,
|
||
t = t.parent;
|
||
E(t, !0)
|
||
}
|
||
this.failureCallback && this.failureCallback(this)
|
||
}
|
||
}
|
||
;
|
||
var m = function(e) {
|
||
e.error = !1,
|
||
e.state = g[e.state][y],
|
||
setTimeout(function() {
|
||
e.state === u && (e.swapTime = +new Date,
|
||
e.run(e),
|
||
C(e, 0))
|
||
}, 0)
|
||
}
|
||
, C = function(e, t) {
|
||
var r = t > 30 || +new Date - e.swapTime > 20
|
||
, a = function(t) {
|
||
if (t++,
|
||
e.state === u)
|
||
if (r && (e.swapTime = +new Date),
|
||
e.subtasks.length > 0) {
|
||
var a = e.subtasks.shift();
|
||
a.error = e.error,
|
||
a.swapTime = e.swapTime,
|
||
a.userData = e.userData,
|
||
a.run(a),
|
||
a.error || C(a, t)
|
||
} else
|
||
E(e),
|
||
e.error || null !== e.parent && (e.parent.error = e.error,
|
||
e.parent.swapTime = e.swapTime,
|
||
e.parent.userData = e.userData,
|
||
C(e.parent, t))
|
||
};
|
||
r ? setTimeout(a, 0) : a(t)
|
||
}
|
||
, E = function(e, t) {
|
||
e.state = f,
|
||
delete i[e.id],
|
||
null === e.parent && (e.type in o ? 0 === o[e.type].length ? a.log.error(n, "[%s][%s] task queue empty [%s]", e.id, e.name, e.type) : o[e.type][0] !== e ? a.log.error(n, "[%s][%s] task not first in queue [%s]", e.id, e.name, e.type) : (o[e.type].shift(),
|
||
0 === o[e.type].length ? delete o[e.type] : o[e.type][0].start()) : a.log.error(n, "[%s][%s] task queue missing [%s]", e.id, e.name, e.type),
|
||
t || (e.error && e.failureCallback ? e.failureCallback(e) : !e.error && e.successCallback && e.successCallback(e)))
|
||
};
|
||
e.exports = a.task = a.task || {},
|
||
a.task.start = function(e) {
|
||
var t = new v({
|
||
run: e.run,
|
||
name: e.name || "?"
|
||
});
|
||
t.type = e.type,
|
||
t.successCallback = e.success || null,
|
||
t.failureCallback = e.failure || null,
|
||
t.type in o ? o[e.type].push(t) : (o[t.type] = [t],
|
||
m(t))
|
||
}
|
||
,
|
||
a.task.cancel = function(e) {
|
||
e in o && (o[e] = [o[e][0]])
|
||
}
|
||
,
|
||
a.task.createCondition = function() {
|
||
var e = {
|
||
tasks: {}
|
||
};
|
||
return e.wait = function(t) {
|
||
t.id in e.tasks || (t.block(),
|
||
e.tasks[t.id] = t)
|
||
}
|
||
,
|
||
e.notify = function() {
|
||
var t = e.tasks;
|
||
e.tasks = {};
|
||
for (var r in t)
|
||
t[r].unblock()
|
||
}
|
||
,
|
||
e
|
||
}
|
||
}
|
||
])
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
let cacheRegex = null;
|
||
let lastRegex = "";
|
||
let lastFlags = "";
|
||
let regexMatches = [];
|
||
let lastMatchesStr = "";
|
||
let lastMatchesRegex = "";
|
||
let lastMatchesFlags = "";
|
||
const forEachStack = C3.New(C3.ArrayStack);
|
||
function ForEachOrdered_SortInstances(a, b) {
|
||
const va = a[1];
|
||
const vb = b[1];
|
||
if (typeof va === "number" && typeof vb === "number")
|
||
return va - vb;
|
||
else {
|
||
const sa = "" + va;
|
||
const sb = "" + vb;
|
||
if (sa < sb)
|
||
return -1;
|
||
else if (sa > sb)
|
||
return 1;
|
||
else
|
||
return 0
|
||
}
|
||
}
|
||
C3.Plugins.System = class SystemPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
this._loopStack = this._runtime.GetEventSheetManager().GetLoopStack();
|
||
this._eventStack = this._runtime.GetEventSheetManager().GetEventStack();
|
||
this._imagesLoadingTotal = 0;
|
||
this._imagesLoadingComplete = 0;
|
||
this._functionMaps = new Map
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
UpdateRender() {
|
||
this._runtime.UpdateRender()
|
||
}
|
||
Trigger(method) {
|
||
this._runtime.Trigger(method, null, null)
|
||
}
|
||
GetRegex(regex, flags) {
|
||
if (!cacheRegex || regex !== lastRegex || flags !== lastFlags) {
|
||
cacheRegex = new RegExp(regex,flags);
|
||
lastRegex = regex;
|
||
lastFlags = flags
|
||
}
|
||
cacheRegex.lastIndex = 0;
|
||
return cacheRegex
|
||
}
|
||
GetRegexMatches(str, regex, flags) {
|
||
if (str === lastMatchesStr && regex === lastMatchesRegex && flags === lastMatchesFlags)
|
||
return regexMatches;
|
||
const cacheRegex = this.GetRegex(regex, flags);
|
||
regexMatches = str.match(cacheRegex);
|
||
lastMatchesStr = str;
|
||
lastMatchesRegex = regex;
|
||
lastMatchesFlags = flags;
|
||
return regexMatches
|
||
}
|
||
async _LoadTexturesForObjectClasses(layout, objectClasses) {
|
||
if (!objectClasses.length)
|
||
return;
|
||
this._imagesLoadingTotal += objectClasses.length;
|
||
const promises = [];
|
||
for (const oc of objectClasses)
|
||
promises.push(layout.MaybeLoadTexturesFor(oc));
|
||
await C3.PromiseAllWithProgress(promises, ()=>{
|
||
this._imagesLoadingComplete++
|
||
}
|
||
);
|
||
this._imagesLoadingComplete++;
|
||
if (this._imagesLoadingComplete === this._imagesLoadingTotal) {
|
||
this._runtime.Trigger(C3.Plugins.System.Cnds.OnImageLoadingComplete, null, null);
|
||
this._imagesLoadingComplete = 0;
|
||
this._imagesLoadingTotal = 0
|
||
}
|
||
}
|
||
_UnloadTexturesForObjectClasses(layout, objectClasses) {
|
||
for (const oc of objectClasses)
|
||
if (oc.GetInstanceCount() === 0)
|
||
layout.MaybeUnloadTexturesFor(oc)
|
||
}
|
||
_GetForEachStack() {
|
||
return forEachStack
|
||
}
|
||
_Repeat(count) {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const currentEvent = oldFrame.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const loopStack = eventSheetManager.GetLoopStack();
|
||
const loop = loopStack.Push();
|
||
loop.SetEnd(count);
|
||
if (isSolModifierAfterCnds)
|
||
for (let i = 0; i < count && !loop.IsStopped(); ++i) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
loop.SetIndex(i);
|
||
currentEvent.Retrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
else
|
||
for (let i = 0; i < count && !loop.IsStopped(); ++i) {
|
||
loop.SetIndex(i);
|
||
currentEvent.Retrigger(oldFrame, newFrame)
|
||
}
|
||
eventStack.Pop();
|
||
loopStack.Pop();
|
||
return false
|
||
}
|
||
*_DebugRepeat(count) {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const currentEvent = oldFrame.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const loopStack = eventSheetManager.GetLoopStack();
|
||
const loop = loopStack.Push();
|
||
loop.SetEnd(count);
|
||
if (isSolModifierAfterCnds)
|
||
for (let i = 0; i < count && !loop.IsStopped(); ++i) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
loop.SetIndex(i);
|
||
yield*currentEvent.DebugRetrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
else
|
||
for (let i = 0; i < count && !loop.IsStopped(); ++i) {
|
||
loop.SetIndex(i);
|
||
yield*currentEvent.DebugRetrigger(oldFrame, newFrame)
|
||
}
|
||
eventStack.Pop();
|
||
loopStack.Pop();
|
||
return false
|
||
}
|
||
_While() {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const currentEvent = oldFrame.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const loopStack = eventSheetManager.GetLoopStack();
|
||
const loop = loopStack.Push();
|
||
if (isSolModifierAfterCnds)
|
||
for (let i = 0; !loop.IsStopped(); ++i) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
loop.SetIndex(i);
|
||
if (!currentEvent.Retrigger(oldFrame, newFrame))
|
||
loop.Stop();
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
else
|
||
for (let i = 0; !loop.IsStopped(); ++i) {
|
||
loop.SetIndex(i);
|
||
if (!currentEvent.Retrigger(oldFrame, newFrame))
|
||
loop.Stop()
|
||
}
|
||
eventStack.Pop();
|
||
loopStack.Pop();
|
||
return false
|
||
}
|
||
*_DebugWhile() {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const currentEvent = oldFrame.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const loopStack = eventSheetManager.GetLoopStack();
|
||
const loop = loopStack.Push();
|
||
if (isSolModifierAfterCnds)
|
||
for (let i = 0; !loop.IsStopped(); ++i) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
loop.SetIndex(i);
|
||
const ret = yield*currentEvent.DebugRetrigger(oldFrame, newFrame);
|
||
if (!ret)
|
||
loop.Stop();
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
else
|
||
for (let i = 0; !loop.IsStopped(); ++i) {
|
||
loop.SetIndex(i);
|
||
const ret = yield*currentEvent.DebugRetrigger(oldFrame, newFrame);
|
||
if (!ret)
|
||
loop.Stop()
|
||
}
|
||
eventStack.Pop();
|
||
loopStack.Pop();
|
||
return false
|
||
}
|
||
_For(name, start, end) {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const currentEvent = oldFrame.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const loopStack = eventSheetManager.GetLoopStack();
|
||
const loop = loopStack.Push();
|
||
loop.SetName(name);
|
||
loop.SetEnd(end);
|
||
if (end < start)
|
||
if (isSolModifierAfterCnds)
|
||
for (let i = start; i >= end && !loop.IsStopped(); --i) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
loop.SetIndex(i);
|
||
currentEvent.Retrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
else
|
||
for (let i = start; i >= end && !loop.IsStopped(); --i) {
|
||
loop.SetIndex(i);
|
||
currentEvent.Retrigger(oldFrame, newFrame)
|
||
}
|
||
else if (isSolModifierAfterCnds)
|
||
for (let i = start; i <= end && !loop.IsStopped(); ++i) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
loop.SetIndex(i);
|
||
currentEvent.Retrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
else
|
||
for (let i = start; i <= end && !loop.IsStopped(); ++i) {
|
||
loop.SetIndex(i);
|
||
currentEvent.Retrigger(oldFrame, newFrame)
|
||
}
|
||
eventStack.Pop();
|
||
loopStack.Pop();
|
||
return false
|
||
}
|
||
*_DebugFor(name, start, end) {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const currentEvent = oldFrame.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const loopStack = eventSheetManager.GetLoopStack();
|
||
const loop = loopStack.Push();
|
||
loop.SetName(name);
|
||
loop.SetEnd(end);
|
||
if (end < start)
|
||
if (isSolModifierAfterCnds)
|
||
for (let i = start; i >= end && !loop.IsStopped(); --i) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
loop.SetIndex(i);
|
||
yield*currentEvent.DebugRetrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
else
|
||
for (let i = start; i >= end && !loop.IsStopped(); --i) {
|
||
loop.SetIndex(i);
|
||
yield*currentEvent.DebugRetrigger(oldFrame, newFrame)
|
||
}
|
||
else if (isSolModifierAfterCnds)
|
||
for (let i = start; i <= end && !loop.IsStopped(); ++i) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
loop.SetIndex(i);
|
||
yield*currentEvent.DebugRetrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
else
|
||
for (let i = start; i <= end && !loop.IsStopped(); ++i) {
|
||
loop.SetIndex(i);
|
||
yield*currentEvent.DebugRetrigger(oldFrame, newFrame)
|
||
}
|
||
eventStack.Pop();
|
||
loopStack.Pop();
|
||
return false
|
||
}
|
||
_ForEach(objectClass) {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const currentEvent = oldFrame.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const loopStack = eventSheetManager.GetLoopStack();
|
||
const loop = loopStack.Push();
|
||
const isInContainer = objectClass.IsInContainer();
|
||
const sol = objectClass.GetCurrentSol();
|
||
const instances = forEachStack.Push();
|
||
C3.shallowAssignArray(instances, sol.GetInstances());
|
||
loop.SetEnd(instances.length);
|
||
if (isSolModifierAfterCnds)
|
||
for (let i = 0, len = instances.length; i < len && !loop.IsStopped(); ++i) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
const inst = instances[i];
|
||
objectClass.GetCurrentSol().SetSinglePicked(inst);
|
||
if (isInContainer)
|
||
inst.SetSiblingsSinglePicked();
|
||
loop.SetIndex(i);
|
||
currentEvent.Retrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
else {
|
||
sol._SetSelectAll(false);
|
||
const solInstances = sol._GetOwnInstances();
|
||
C3.clearArray(solInstances);
|
||
solInstances.push(null);
|
||
for (let i = 0, len = instances.length; i < len && !loop.IsStopped(); ++i) {
|
||
const inst = instances[i];
|
||
solInstances[0] = inst;
|
||
if (isInContainer)
|
||
inst.SetSiblingsSinglePicked();
|
||
loop.SetIndex(i);
|
||
currentEvent.Retrigger(oldFrame, newFrame)
|
||
}
|
||
}
|
||
eventStack.Pop();
|
||
loopStack.Pop();
|
||
C3.clearArray(instances);
|
||
forEachStack.Pop();
|
||
return false
|
||
}
|
||
*_DebugForEach(objectClass) {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const currentEvent = oldFrame.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const loopStack = eventSheetManager.GetLoopStack();
|
||
const loop = loopStack.Push();
|
||
const isInContainer = objectClass.IsInContainer();
|
||
const sol = objectClass.GetCurrentSol();
|
||
const instances = forEachStack.Push();
|
||
C3.shallowAssignArray(instances, sol.GetInstances());
|
||
loop.SetEnd(instances.length);
|
||
if (isSolModifierAfterCnds)
|
||
for (let i = 0, len = instances.length; i < len && !loop.IsStopped(); ++i) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
const inst = instances[i];
|
||
objectClass.GetCurrentSol().SetSinglePicked(inst);
|
||
if (isInContainer)
|
||
inst.SetSiblingsSinglePicked();
|
||
loop.SetIndex(i);
|
||
yield*currentEvent.DebugRetrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
else {
|
||
sol._SetSelectAll(false);
|
||
const solInstances = sol._GetOwnInstances();
|
||
C3.clearArray(solInstances);
|
||
solInstances.push(null);
|
||
for (let i = 0, len = instances.length; i < len && !loop.IsStopped(); ++i) {
|
||
const inst = instances[i];
|
||
solInstances[0] = inst;
|
||
if (isInContainer)
|
||
inst.SetSiblingsSinglePicked();
|
||
loop.SetIndex(i);
|
||
yield*currentEvent.DebugRetrigger(oldFrame, newFrame)
|
||
}
|
||
}
|
||
eventStack.Pop();
|
||
loopStack.Pop();
|
||
C3.clearArray(instances);
|
||
forEachStack.Pop();
|
||
return false
|
||
}
|
||
_ForEachOrdered(objectClass, order) {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const cnd = eventSheetManager.GetCurrentCondition();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const currentEvent = oldFrame.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const loopStack = eventSheetManager.GetLoopStack();
|
||
const loop = loopStack.Push();
|
||
const isInContainer = objectClass.IsInContainer();
|
||
const sol = objectClass.GetCurrentSol();
|
||
const instancesData = forEachStack.Push();
|
||
C3.clearArray(instancesData);
|
||
const iterInstances = sol.GetInstances();
|
||
loop.SetEnd(iterInstances.length);
|
||
for (let i = 0, len = iterInstances.length; i < len; ++i)
|
||
instancesData.push([iterInstances[i], cnd.ReevaluateParameter(1, i)]);
|
||
instancesData.sort(ForEachOrdered_SortInstances);
|
||
if (order === 1)
|
||
instancesData.reverse();
|
||
if (isSolModifierAfterCnds)
|
||
for (let i = 0, len = instancesData.length; i < len && !loop.IsStopped(); ++i) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
const inst = instancesData[i][0];
|
||
objectClass.GetCurrentSol().SetSinglePicked(inst);
|
||
if (isInContainer)
|
||
inst.SetSiblingsSinglePicked();
|
||
loop.SetIndex(i);
|
||
currentEvent.Retrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
else {
|
||
sol._SetSelectAll(false);
|
||
const solInstances = sol._GetOwnInstances();
|
||
C3.clearArray(solInstances);
|
||
solInstances.push(null);
|
||
for (let i = 0, len = instancesData.length; i < len && !loop.IsStopped(); ++i) {
|
||
const inst = instancesData[i][0];
|
||
solInstances[0] = inst;
|
||
if (isInContainer)
|
||
inst.SetSiblingsSinglePicked();
|
||
loop.SetIndex(i);
|
||
currentEvent.Retrigger(oldFrame, newFrame)
|
||
}
|
||
}
|
||
eventStack.Pop();
|
||
loopStack.Pop();
|
||
C3.clearArray(instancesData);
|
||
forEachStack.Pop();
|
||
return false
|
||
}
|
||
*_DebugForEachOrdered(objectClass, order) {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const cnd = eventSheetManager.GetCurrentCondition();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const currentEvent = oldFrame.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const loopStack = eventSheetManager.GetLoopStack();
|
||
const loop = loopStack.Push();
|
||
const isInContainer = objectClass.IsInContainer();
|
||
const sol = objectClass.GetCurrentSol();
|
||
const instancesData = forEachStack.Push();
|
||
C3.clearArray(instancesData);
|
||
const iterInstances = sol.GetInstances();
|
||
loop.SetEnd(iterInstances.length);
|
||
for (let i = 0, len = iterInstances.length; i < len; ++i)
|
||
instancesData.push([iterInstances[i], cnd.ReevaluateParameter(1, i)]);
|
||
instancesData.sort(ForEachOrdered_SortInstances);
|
||
if (order === 1)
|
||
instancesData.reverse();
|
||
if (isSolModifierAfterCnds)
|
||
for (let i = 0, len = instancesData.length; i < len && !loop.IsStopped(); ++i) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
const inst = instancesData[i][0];
|
||
objectClass.GetCurrentSol().SetSinglePicked(inst);
|
||
if (isInContainer)
|
||
inst.SetSiblingsSinglePicked();
|
||
loop.SetIndex(i);
|
||
yield*currentEvent.DebugRetrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
else {
|
||
sol._SetSelectAll(false);
|
||
const solInstances = sol._GetOwnInstances();
|
||
C3.clearArray(solInstances);
|
||
solInstances.push(null);
|
||
for (let i = 0, len = instancesData.length; i < len && !loop.IsStopped(); ++i) {
|
||
const inst = instancesData[i][0];
|
||
solInstances[0] = inst;
|
||
if (isInContainer)
|
||
inst.SetSiblingsSinglePicked();
|
||
loop.SetIndex(i);
|
||
yield*currentEvent.DebugRetrigger(oldFrame, newFrame)
|
||
}
|
||
}
|
||
eventStack.Pop();
|
||
loopStack.Pop();
|
||
C3.clearArray(instancesData);
|
||
forEachStack.Pop();
|
||
return false
|
||
}
|
||
_GetFunctionMap(name, createIfMissing) {
|
||
let ret = this._functionMaps.get(name);
|
||
if (ret)
|
||
return ret;
|
||
if (!createIfMissing)
|
||
return null;
|
||
ret = {
|
||
defaultFunc: null,
|
||
strMap: new Map
|
||
};
|
||
this._functionMaps.set(name, ret);
|
||
return ret
|
||
}
|
||
_DoCallMappedFunction(eventSheetManager, functionBlock, paramResults, hasAnySolModifiers, solModifiers) {
|
||
functionBlock.GetEventBlock().RunAsMappedFunctionCall(paramResults);
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
*_DebugDoCallMappedFunction(eventSheetManager, functionBlock, paramResults, hasAnySolModifiers, solModifiers) {
|
||
yield*functionBlock.GetEventBlock().DebugRunAsMappedFunctionCall(paramResults);
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.System.Type = class SystemType extends C3.DefendedBase {
|
||
constructor(objectClass) {
|
||
super();
|
||
this._objectClass = objectClass;
|
||
this._runtime = objectClass.GetRuntime();
|
||
this._plugin = objectClass.GetPlugin()
|
||
}
|
||
OnCreate() {}
|
||
Release() {
|
||
this._objectClass = null;
|
||
this._runtime = null;
|
||
this._plugin = null
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.System.Instance = class SystemInstance extends C3.DefendedBase {
|
||
constructor(inst, properties) {
|
||
super();
|
||
this._inst = inst;
|
||
this._objectClass = this._inst.GetObjectClass();
|
||
this._sdkType = this._objectClass.GetSdkType();
|
||
this._runtime = this._inst.GetRuntime()
|
||
}
|
||
Release() {
|
||
this._inst = null;
|
||
this._objectClass = null;
|
||
this._sdkType = null;
|
||
this._runtime = null
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const tmpPickArray = [];
|
||
C3.Plugins.System.Cnds = {
|
||
EveryTick() {
|
||
return true
|
||
},
|
||
OnLayoutStart() {
|
||
return true
|
||
},
|
||
OnLayoutEnd() {
|
||
return true
|
||
},
|
||
OnSuspend() {
|
||
return true
|
||
},
|
||
OnResume() {
|
||
return true
|
||
},
|
||
IsSuspended() {
|
||
return this._runtime.IsSuspended()
|
||
},
|
||
Else() {
|
||
const frame = this._runtime.GetCurrentEventStackFrame();
|
||
if (frame.GetElseBranchRan())
|
||
return false;
|
||
else
|
||
return !frame.GetLastEventTrue()
|
||
},
|
||
TriggerOnce() {
|
||
const cnd = this._runtime.GetCurrentCondition();
|
||
const cndSavedData = cnd.GetSavedDataMap();
|
||
let lastTick = cndSavedData.get("TriggerOnce_lastTick");
|
||
if (typeof lastTick === "undefined") {
|
||
lastTick = -1;
|
||
cndSavedData.set("TriggerOnce_lastTick", -1)
|
||
}
|
||
const curTick = this._runtime.GetTickCount();
|
||
cndSavedData.set("TriggerOnce_lastTick", curTick);
|
||
return this._runtime.IsLayoutFirstTick() || lastTick !== curTick - 1
|
||
},
|
||
Every(seconds) {
|
||
const cnd = this._runtime.GetCurrentCondition();
|
||
const cndSavedData = cnd.GetSavedDataMap();
|
||
const lastTime = cndSavedData.get("Every_lastTime") || 0;
|
||
const curTime = this._runtime.GetGameTime();
|
||
if (!cndSavedData.has("Every_seconds"))
|
||
cndSavedData.set("Every_seconds", seconds);
|
||
const thisSeconds = cndSavedData.get("Every_seconds");
|
||
if (curTime >= lastTime + thisSeconds) {
|
||
cndSavedData.set("Every_lastTime", lastTime + thisSeconds);
|
||
if (curTime >= cndSavedData.get("Every_lastTime") + .04)
|
||
cndSavedData.set("Every_lastTime", curTime);
|
||
cndSavedData.set("Every_seconds", seconds);
|
||
return true
|
||
} else if (curTime < lastTime - .1)
|
||
cndSavedData.set("Every_lastTime", curTime);
|
||
return false
|
||
},
|
||
IsGroupActive(groupName) {
|
||
const eventGroup = this._runtime.GetEventSheetManager().GetEventGroupByName(groupName);
|
||
return eventGroup && eventGroup.IsGroupActive()
|
||
},
|
||
IsPreview() {
|
||
return this._runtime.IsPreview()
|
||
},
|
||
IsMobile() {
|
||
return C3.Platform.IsMobile
|
||
},
|
||
OnLoadFinished() {
|
||
return true
|
||
},
|
||
OnCanvasSnapshot() {
|
||
return true
|
||
},
|
||
EffectsSupported() {
|
||
return true
|
||
},
|
||
OnSaveComplete() {
|
||
return true
|
||
},
|
||
OnSaveFailed() {
|
||
return true
|
||
},
|
||
OnLoadComplete() {
|
||
return true
|
||
},
|
||
OnLoadFailed() {
|
||
return true
|
||
},
|
||
ObjectUIDExists(uid) {
|
||
return !!this._runtime.GetInstanceByUID(uid)
|
||
},
|
||
IsOnPlatform(p) {
|
||
switch (p) {
|
||
case 0:
|
||
return C3.Platform.Context === "browser";
|
||
case 1:
|
||
return C3.Platform.OS === "iOS";
|
||
case 2:
|
||
return C3.Platform.OS === "Android";
|
||
case 8:
|
||
return C3.Platform.Context === "cordova";
|
||
case 9:
|
||
return this._runtime.GetExportType() === "scirra-arcade";
|
||
case 10:
|
||
return C3.Platform.Context === "nwjs";
|
||
case 13:
|
||
return this._runtime.GetExportType() === "windows-uwp";
|
||
default:
|
||
return false
|
||
}
|
||
},
|
||
RegexTest(str, regex, flags) {
|
||
const cacheRegex = this.GetRegex(regex, flags);
|
||
return cacheRegex.test(str)
|
||
},
|
||
Compare(x, cmp, y) {
|
||
return C3.compare(x, cmp, y)
|
||
},
|
||
CompareBetween(x, a, b) {
|
||
return x >= a && x <= b
|
||
},
|
||
CompareVar(ev, cmp, val) {
|
||
return C3.compare(ev.GetValue(), cmp, val)
|
||
},
|
||
CompareBoolVar(ev) {
|
||
return !!ev.GetValue()
|
||
},
|
||
CompareTime(cmp, t) {
|
||
const gameTime = this._runtime.GetGameTime();
|
||
if (cmp === 0) {
|
||
const cnd = this._runtime.GetCurrentCondition();
|
||
const cndSavedData = cnd.GetSavedDataMap();
|
||
if (!cndSavedData.get("CompareTime_executed"))
|
||
if (gameTime >= t) {
|
||
cndSavedData.set("CompareTime_executed", true);
|
||
return true
|
||
}
|
||
return false
|
||
} else
|
||
return C3.compare(gameTime, cmp, t)
|
||
},
|
||
IsNaN(n) {
|
||
return isNaN(n)
|
||
},
|
||
AngleWithin(a1, within, a2) {
|
||
return C3.angleDiff(C3.toRadians(a1), C3.toRadians(a2)) <= C3.toRadians(within)
|
||
},
|
||
IsClockwiseFrom(a1, a2) {
|
||
return C3.angleClockwise(C3.toRadians(a1), C3.toRadians(a2))
|
||
},
|
||
IsBetweenAngles(a, la, ua) {
|
||
let angle = C3.toRadians(a);
|
||
let lower = C3.toRadians(la);
|
||
let upper = C3.toRadians(ua);
|
||
let obtuse = !C3.angleClockwise(upper, lower);
|
||
if (obtuse)
|
||
return !(!C3.angleClockwise(angle, lower) && C3.angleClockwise(angle, upper));
|
||
else
|
||
return C3.angleClockwise(angle, lower) && !C3.angleClockwise(angle, upper)
|
||
},
|
||
IsValueType(v, t) {
|
||
if (typeof v === "number")
|
||
return t === 0;
|
||
else
|
||
return t === 1
|
||
},
|
||
EvaluateExpression(v) {
|
||
return !!v
|
||
},
|
||
PickByComparison(objectClass, exp, cmp, val) {
|
||
if (!objectClass)
|
||
return false;
|
||
const forEachStack = this._GetForEachStack();
|
||
const tempInstances = forEachStack.Push();
|
||
const sol = objectClass.GetCurrentSol();
|
||
C3.shallowAssignArray(tempInstances, sol.GetInstances());
|
||
if (sol.IsSelectAll())
|
||
C3.clearArray(sol._GetOwnElseInstances());
|
||
const cnd = this._runtime.GetCurrentCondition();
|
||
let k = 0;
|
||
for (let i = 0, len = tempInstances.length; i < len; ++i) {
|
||
const inst = tempInstances[i];
|
||
tempInstances[k] = inst;
|
||
exp = cnd.ReevaluateParameter(1, i);
|
||
val = cnd.ReevaluateParameter(3, i);
|
||
if (C3.compare(exp, cmp, val))
|
||
++k;
|
||
else
|
||
sol._PushElseInstance(inst)
|
||
}
|
||
C3.truncateArray(tempInstances, k);
|
||
sol.SetArrayPicked(tempInstances);
|
||
const ret = !!tempInstances.length;
|
||
C3.clearArray(tempInstances);
|
||
forEachStack.Pop();
|
||
objectClass.ApplySolToContainer();
|
||
return ret
|
||
},
|
||
PickByEvaluate(objectClass, exp) {
|
||
if (!objectClass)
|
||
return false;
|
||
const forEachStack = this._GetForEachStack();
|
||
const tempInstances = forEachStack.Push();
|
||
const sol = objectClass.GetCurrentSol();
|
||
C3.shallowAssignArray(tempInstances, sol.GetInstances());
|
||
if (sol.IsSelectAll())
|
||
C3.clearArray(sol._GetOwnElseInstances());
|
||
const cnd = this._runtime.GetCurrentCondition();
|
||
let k = 0;
|
||
for (let i = 0, len = tempInstances.length; i < len; ++i) {
|
||
const inst = tempInstances[i];
|
||
tempInstances[k] = inst;
|
||
exp = cnd.ReevaluateParameter(1, i);
|
||
if (exp)
|
||
++k;
|
||
else
|
||
sol._PushElseInstance(inst)
|
||
}
|
||
C3.truncateArray(tempInstances, k);
|
||
sol.SetArrayPicked(tempInstances);
|
||
const ret = !!tempInstances.length;
|
||
C3.clearArray(tempInstances);
|
||
forEachStack.Pop();
|
||
objectClass.ApplySolToContainer();
|
||
return ret
|
||
},
|
||
PickNth(objectClass, index) {
|
||
if (!objectClass)
|
||
return false;
|
||
const sol = objectClass.GetCurrentSol();
|
||
const instances = sol.GetInstances();
|
||
index = Math.floor(index);
|
||
if (index >= instances.length)
|
||
return false;
|
||
const inst = instances[index];
|
||
sol.PickOne(inst);
|
||
objectClass.ApplySolToContainer();
|
||
return true
|
||
},
|
||
PickRandom(objectClass) {
|
||
if (!objectClass)
|
||
return false;
|
||
const sol = objectClass.GetCurrentSol();
|
||
const instances = sol.GetInstances();
|
||
const index = Math.floor(this._runtime.Random() * instances.length);
|
||
if (index >= instances.length)
|
||
return false;
|
||
const inst = instances[index];
|
||
sol.PickOne(inst);
|
||
objectClass.ApplySolToContainer();
|
||
return true
|
||
},
|
||
PickAll(objectClass) {
|
||
if (!objectClass)
|
||
return false;
|
||
if (!objectClass.GetInstanceCount())
|
||
return false;
|
||
const sol = objectClass.GetCurrentSol();
|
||
sol._SetSelectAll(true);
|
||
objectClass.ApplySolToContainer();
|
||
return true
|
||
},
|
||
PickOverlappingPoint(objectClass, x, y) {
|
||
if (!objectClass)
|
||
return false;
|
||
const sol = objectClass.GetCurrentSol();
|
||
const instances = sol.GetInstances();
|
||
const currentEvent = this._runtime.GetCurrentEvent();
|
||
const isOrBlock = currentEvent.IsOrBlock();
|
||
const isInverted = this._runtime.GetCurrentCondition().IsInverted();
|
||
if (sol.IsSelectAll()) {
|
||
C3.shallowAssignArray(tmpPickArray, instances);
|
||
sol.ClearArrays();
|
||
sol._SetSelectAll(false)
|
||
} else if (isOrBlock) {
|
||
C3.shallowAssignArray(tmpPickArray, sol._GetOwnElseInstances());
|
||
C3.clearArray(sol._GetOwnElseInstances())
|
||
} else {
|
||
C3.shallowAssignArray(tmpPickArray, sol._GetOwnInstances());
|
||
C3.clearArray(sol._GetOwnInstances())
|
||
}
|
||
for (let i = 0, len = tmpPickArray.length; i < len; ++i) {
|
||
const inst = tmpPickArray[i];
|
||
if (C3.xor(inst.GetWorldInfo().ContainsPoint(x, y), isInverted))
|
||
sol._PushInstance(inst);
|
||
else
|
||
sol._PushElseInstance(inst)
|
||
}
|
||
objectClass.ApplySolToContainer();
|
||
return C3.xor(!!sol._GetOwnInstances().length, isInverted)
|
||
},
|
||
PickLastCreated(objectClass) {
|
||
if (!objectClass)
|
||
return false;
|
||
const isFamily = objectClass.IsFamily();
|
||
let pick = null;
|
||
const instancesPendingCreate = this._runtime._GetInstancesPendingCreate();
|
||
for (let i = instancesPendingCreate.length - 1; i >= 0; --i) {
|
||
const inst = instancesPendingCreate[i];
|
||
if (isFamily) {
|
||
if (inst.GetObjectClass().BelongsToFamily(objectClass)) {
|
||
pick = inst;
|
||
break
|
||
}
|
||
} else if (inst.GetObjectClass() === objectClass) {
|
||
pick = inst;
|
||
break
|
||
}
|
||
}
|
||
if (!pick) {
|
||
const instances = objectClass.GetInstances();
|
||
if (instances.length)
|
||
pick = instances[instances.length - 1]
|
||
}
|
||
if (!pick)
|
||
return false;
|
||
const sol = objectClass.GetCurrentSol();
|
||
sol.PickOne(pick);
|
||
objectClass.ApplySolToContainer();
|
||
return true
|
||
},
|
||
Repeat(count) {
|
||
if (this._runtime.IsDebugging())
|
||
return this._DebugRepeat(count);
|
||
else
|
||
return this._Repeat(count)
|
||
},
|
||
While() {
|
||
if (this._runtime.IsDebugging())
|
||
return this._DebugWhile();
|
||
else
|
||
return this._While()
|
||
},
|
||
For(name, start, end) {
|
||
if (this._runtime.IsDebugging())
|
||
return this._DebugFor(name, start, end);
|
||
else
|
||
return this._For(name, start, end)
|
||
},
|
||
ForEach(objectClass) {
|
||
if (this._runtime.IsDebugging())
|
||
return this._DebugForEach(objectClass);
|
||
else
|
||
return this._ForEach(objectClass)
|
||
},
|
||
ForEachOrdered(objectClass, expression, order) {
|
||
if (this._runtime.IsDebugging())
|
||
return this._DebugForEachOrdered(objectClass, order);
|
||
else
|
||
return this._ForEachOrdered(objectClass, order)
|
||
},
|
||
LayerVisible(layer) {
|
||
return layer ? layer.IsVisible() : false
|
||
},
|
||
LayerEmpty(layer) {
|
||
return layer ? !layer.GetInstanceCount() : false
|
||
},
|
||
LayerCmpOpacity(layer, cmp, o) {
|
||
if (!layer)
|
||
return false;
|
||
return C3.compare(layer.GetOpacity() * 100, cmp, o)
|
||
},
|
||
OnImageLoadingComplete() {
|
||
return true
|
||
},
|
||
IsLoadingImages() {
|
||
return this._imagesLoadingTotal > 0
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
function SortZOrderList(a, b) {
|
||
const layerA = a[0];
|
||
const layerB = b[0];
|
||
const diff = layerA - layerB;
|
||
if (diff !== 0)
|
||
return diff;
|
||
const indexA = a[1];
|
||
const indexB = b[1];
|
||
return indexA - indexB
|
||
}
|
||
function SortInstancesByValue(a, b) {
|
||
return a[1] - b[1]
|
||
}
|
||
const tempZOrderList = [];
|
||
const tempInstValues = [];
|
||
const tempRect = C3.New(C3.Rect);
|
||
const tempColor = C3.New(C3.Color);
|
||
C3.Plugins.System.Acts = {
|
||
SetVar(ev, x) {
|
||
ev.SetValue(x)
|
||
},
|
||
AddVar(ev, x) {
|
||
if (ev.IsNumber() && typeof x !== "number")
|
||
x = parseFloat(x);
|
||
ev.SetValue(ev.GetValue() + x)
|
||
},
|
||
SubVar(ev, x) {
|
||
if (!ev.IsNumber())
|
||
return;
|
||
ev.SetValue(ev.GetValue() - x)
|
||
},
|
||
SetBoolVar(ev, x) {
|
||
ev.SetValue(!!x)
|
||
},
|
||
ToggleBoolVar(ev) {
|
||
ev.SetValue(!ev.GetValue())
|
||
},
|
||
ResetGlobals() {
|
||
this._runtime.GetEventSheetManager().ResetAllGlobalsToInitialValue()
|
||
},
|
||
CreateObject(objectClass, layer, x, y) {
|
||
if (!objectClass || !layer)
|
||
return;
|
||
const inst = this._runtime.CreateInstance(objectClass, layer, x, y);
|
||
if (!inst)
|
||
return;
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
eventSheetManager.BlockFlushingInstances(true);
|
||
inst._TriggerOnCreated();
|
||
if (inst.IsInContainer())
|
||
for (const s of inst.siblings())
|
||
s._TriggerOnCreated();
|
||
eventSheetManager.BlockFlushingInstances(false);
|
||
objectClass.GetCurrentSol().SetSinglePicked(inst);
|
||
if (inst.IsInContainer())
|
||
inst.SetSiblingsSinglePicked()
|
||
},
|
||
CreateObjectByName(objectClassName, layer, x, y) {
|
||
if (!objectClassName || !layer)
|
||
return;
|
||
const objectClass = this._runtime.GetObjectClassByName(objectClassName);
|
||
if (!objectClass)
|
||
return;
|
||
C3.Plugins.System.Acts.CreateObject.call(this, objectClass, layer, x, y)
|
||
},
|
||
RecreateInitialObjects(objectClass, x1, y1, x2, y2, sourceLayoutName, sourceLayerParam, offsetX, offsetY) {
|
||
if (!objectClass)
|
||
return;
|
||
let sourceLayout = this._runtime.GetCurrentLayout();
|
||
if (sourceLayoutName) {
|
||
const lookupLayout = this._runtime.GetLayoutManager().GetLayoutByName(sourceLayoutName);
|
||
if (lookupLayout)
|
||
sourceLayout = lookupLayout;
|
||
else
|
||
return
|
||
}
|
||
let sourceLayer = null;
|
||
if (typeof sourceLayerParam !== "number" || sourceLayerParam >= 0) {
|
||
sourceLayer = sourceLayout.GetLayer(sourceLayerParam);
|
||
if (!sourceLayer)
|
||
return
|
||
}
|
||
tempRect.set(x1, y1, x2, y2);
|
||
const allCreatedInstances = sourceLayout.RecreateInitialObjects(objectClass, tempRect, sourceLayer, offsetX, offsetY);
|
||
objectClass.GetCurrentSol().SetArrayPicked(allCreatedInstances);
|
||
objectClass.ApplySolToContainer()
|
||
},
|
||
StopLoop() {
|
||
const loopStack = this._loopStack;
|
||
if (!loopStack.IsInLoop())
|
||
return;
|
||
loopStack.GetCurrent().Stop()
|
||
},
|
||
SetGroupActive(groupName, a) {
|
||
const group = this._runtime.GetEventSheetManager().GetEventGroupByName(groupName);
|
||
if (!group)
|
||
return;
|
||
if (a === 0)
|
||
group.SetGroupActive(false);
|
||
else if (a === 1)
|
||
group.SetGroupActive(true);
|
||
else
|
||
group.SetGroupActive(!group.IsGroupActive())
|
||
},
|
||
SetTimescale(ts) {
|
||
this._runtime.SetTimeScale(ts)
|
||
},
|
||
SetObjectTimescale(objectClass, ts) {
|
||
if (ts < 0)
|
||
ts = 0;
|
||
if (!objectClass)
|
||
return;
|
||
const sol = objectClass.GetCurrentSol();
|
||
const instances = sol.GetInstances();
|
||
for (const inst of instances)
|
||
inst.SetTimeScale(ts)
|
||
},
|
||
RestoreObjectTimescale(objectClass) {
|
||
if (!objectClass)
|
||
return;
|
||
const sol = objectClass.GetCurrentSol();
|
||
const instances = sol.GetInstances();
|
||
for (const inst of instances)
|
||
inst.RestoreTimeScale()
|
||
},
|
||
Wait(seconds) {
|
||
if (seconds < 0)
|
||
return;
|
||
this._runtime.GetEventSheetManager().AddScheduledWait().InitTimer(seconds);
|
||
return true
|
||
},
|
||
WaitForSignal(tag) {
|
||
this._runtime.GetEventSheetManager().AddScheduledWait().InitSignal(tag);
|
||
return true
|
||
},
|
||
WaitForPreviousActions() {
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
eventSheetManager.AddScheduledWait().InitPromise(eventSheetManager.GetPromiseForAllAsyncActions());
|
||
return true
|
||
},
|
||
Signal(tag) {
|
||
const lowerTag = tag.toLowerCase();
|
||
for (const w of this._runtime.GetEventSheetManager().scheduledWaits())
|
||
if (w.IsSignal() && w.GetSignalTag() === lowerTag)
|
||
w.SetSignalled()
|
||
},
|
||
async SnapshotCanvas(format, quality, x, y, width, height) {
|
||
const canvasManager = this._runtime.GetCanvasManager();
|
||
if (!canvasManager)
|
||
return;
|
||
this.UpdateRender();
|
||
await canvasManager.SnapshotCanvas(format === 0 ? "image/png" : "image/jpeg", quality / 100, x, y, width, height);
|
||
await this._runtime.TriggerAsync(C3.Plugins.System.Cnds.OnCanvasSnapshot, null)
|
||
},
|
||
SetCanvasSize(w, h) {
|
||
if (w <= 0 || h <= 0)
|
||
return;
|
||
this._runtime.SetViewportSize(w, h);
|
||
const currentLayout = this._runtime.GetCurrentLayout();
|
||
currentLayout.BoundScrolling();
|
||
for (const layer of currentLayout.GetLayers())
|
||
layer.UpdateViewport();
|
||
const canvasManager = this._runtime.GetCanvasManager();
|
||
if (!canvasManager)
|
||
return;
|
||
if (canvasManager.GetCurrentFullscreenMode() === "off")
|
||
canvasManager.SetSize(canvasManager.GetLastWidth(), canvasManager.GetLastHeight(), true);
|
||
else {
|
||
this._runtime.SetOriginalViewportSize(w, h);
|
||
canvasManager.SetSize(canvasManager.GetLastWidth(), canvasManager.GetLastHeight(), true)
|
||
}
|
||
this._runtime.UpdateRender()
|
||
},
|
||
SetFullscreenQuality(q) {
|
||
const canvasManager = this._runtime.GetCanvasManager();
|
||
if (!canvasManager)
|
||
return;
|
||
if (canvasManager.GetCurrentFullscreenMode() === "off")
|
||
return;
|
||
canvasManager.SetFullscreenScalingQuality(q !== 0 ? "high" : "low");
|
||
canvasManager.SetSize(canvasManager.GetLastWidth(), canvasManager.GetLastHeight(), true)
|
||
},
|
||
SaveState(slot) {
|
||
this._runtime.SaveToSlot(slot)
|
||
},
|
||
LoadState(slot) {
|
||
this._runtime.LoadFromSlot(slot)
|
||
},
|
||
LoadStateJSON(jsonStr) {
|
||
this._runtime.LoadFromJsonString(jsonStr)
|
||
},
|
||
SetHalfFramerateMode(m) {},
|
||
ResetPersisted() {
|
||
for (const layout of this._runtime.GetLayoutManager().GetAllLayouts())
|
||
layout.ResetPersistData()
|
||
},
|
||
SetPixelRounding(m) {
|
||
this._runtime.SetPixelRoundingEnabled(m !== 0)
|
||
},
|
||
SetMinimumFramerate(fps) {
|
||
this._runtime.SetMinimumFramerate(fps)
|
||
},
|
||
SortZOrderByInstVar(objectClass, instVar) {
|
||
if (!objectClass)
|
||
return;
|
||
const sol = objectClass.GetCurrentSol();
|
||
const pickedInstances = sol.GetInstances();
|
||
const zOrderList = tempZOrderList;
|
||
const instValues = tempInstValues;
|
||
const layout = this._runtime.GetCurrentLayout();
|
||
const isFamily = objectClass.IsFamily();
|
||
const familyIndex = objectClass.GetFamilyIndex();
|
||
for (let i = 0, len = pickedInstances.length; i < len; ++i) {
|
||
const inst = pickedInstances[i];
|
||
const wi = inst.GetWorldInfo();
|
||
if (!wi)
|
||
continue;
|
||
let value;
|
||
if (isFamily)
|
||
value = inst.GetInstanceVariableValue(instVar + inst.GetObjectClass().GetFamilyInstanceVariableOffset(familyIndex));
|
||
else
|
||
value = inst.GetInstanceVariableValue(instVar);
|
||
zOrderList.push([wi.GetLayer().GetIndex(), wi.GetZIndex()]);
|
||
instValues.push([inst, value])
|
||
}
|
||
if (!zOrderList.length)
|
||
return;
|
||
zOrderList.sort(SortZOrderList);
|
||
instValues.sort(SortInstancesByValue);
|
||
let anyChanged = false;
|
||
for (let i = 0, len = zOrderList.length; i < len; ++i) {
|
||
const inst = instValues[i][0];
|
||
const layer = layout.GetLayerByIndex(zOrderList[i][0]);
|
||
const toZ = zOrderList[i][1];
|
||
const layerInstances = layer._GetInstances();
|
||
if (layerInstances[toZ] !== inst) {
|
||
layerInstances[toZ] = inst;
|
||
inst.GetWorldInfo()._SetLayer(layer);
|
||
layer.SetZIndicesChanged();
|
||
anyChanged = true
|
||
}
|
||
}
|
||
if (anyChanged)
|
||
this._runtime.UpdateRender();
|
||
C3.clearArray(tempZOrderList);
|
||
C3.clearArray(tempInstValues)
|
||
},
|
||
GoToLayout(layout) {
|
||
if (this._runtime.IsLoading())
|
||
return;
|
||
const layoutManager = this._runtime.GetLayoutManager();
|
||
if (layoutManager.IsPendingChangeMainLayout())
|
||
return;
|
||
layoutManager.ChangeMainLayout(layout)
|
||
},
|
||
GoToLayoutByName(layoutName) {
|
||
if (this._runtime.IsLoading())
|
||
return;
|
||
const layoutManager = this._runtime.GetLayoutManager();
|
||
if (layoutManager.IsPendingChangeMainLayout())
|
||
return;
|
||
const toLayout = layoutManager.GetLayoutByName(layoutName);
|
||
if (toLayout)
|
||
layoutManager.ChangeMainLayout(toLayout)
|
||
},
|
||
NextPrevLayout(prev) {
|
||
if (this._runtime.IsLoading())
|
||
return;
|
||
const layoutManager = this._runtime.GetLayoutManager();
|
||
if (layoutManager.IsPendingChangeMainLayout())
|
||
return;
|
||
const allLayouts = layoutManager.GetAllLayouts();
|
||
const index = allLayouts.indexOf(layoutManager.GetMainRunningLayout());
|
||
if (prev && index === 0)
|
||
return;
|
||
if (!prev && index === allLayouts.length - 1)
|
||
return;
|
||
const toLayout = allLayouts[index + (prev ? -1 : 1)];
|
||
layoutManager.ChangeMainLayout(toLayout)
|
||
},
|
||
RestartLayout() {
|
||
if (this._runtime.IsLoading())
|
||
return;
|
||
const layoutManager = this._runtime.GetLayoutManager();
|
||
if (layoutManager.IsPendingChangeMainLayout())
|
||
return;
|
||
layoutManager.ChangeMainLayout(layoutManager.GetMainRunningLayout());
|
||
this._runtime.GetEventSheetManager().ResetAllGroupsInitialActivation()
|
||
},
|
||
SetLayerVisible(layer, v) {
|
||
if (!layer)
|
||
return;
|
||
layer.SetVisible(v)
|
||
},
|
||
SetLayerOpacity(layer, o) {
|
||
if (!layer)
|
||
return;
|
||
layer.SetOpacity(o / 100)
|
||
},
|
||
SetLayerScale(layer, s) {
|
||
if (!layer)
|
||
return;
|
||
layer.SetOwnScale(s)
|
||
},
|
||
SetLayerScaleRate(layer, r) {
|
||
if (!layer)
|
||
return;
|
||
layer.SetScaleRate(r)
|
||
},
|
||
SetLayerAngle(layer, a) {
|
||
if (!layer)
|
||
return;
|
||
a = C3.clampAngle(C3.toRadians(+a));
|
||
if (layer.GetOwnAngle() === a)
|
||
return;
|
||
layer.SetAngle(a);
|
||
this.UpdateRender()
|
||
},
|
||
SetLayerParallax(layer, px, py) {
|
||
if (!layer)
|
||
return;
|
||
layer.SetParallax(px / 100, py / 100)
|
||
},
|
||
SetLayerZElevation(layer, z) {
|
||
if (!layer)
|
||
return;
|
||
layer.SetZElevation(z)
|
||
},
|
||
SetLayerBackground(layer, rgb) {
|
||
if (!layer)
|
||
return;
|
||
tempColor.setFromRgbValue(rgb);
|
||
tempColor.clamp();
|
||
const layerBgColor = layer.GetBackgroundColor();
|
||
if (layerBgColor.equalsIgnoringAlpha(tempColor))
|
||
return;
|
||
layerBgColor.copyRgb(tempColor);
|
||
this.UpdateRender()
|
||
},
|
||
SetLayerTransparent(layer, t) {
|
||
if (!layer)
|
||
return;
|
||
t = !!t;
|
||
if (layer.IsTransparent() === t)
|
||
return;
|
||
layer.SetTransparent(t);
|
||
this.UpdateRender()
|
||
},
|
||
SetLayerBlendMode(layer, bm) {
|
||
if (!layer)
|
||
return;
|
||
if (layer.GetBlendMode() === bm)
|
||
return;
|
||
layer.SetBlendMode(bm);
|
||
this.UpdateRender()
|
||
},
|
||
SetLayerEffectEnabled(layer, enabled, effectName) {
|
||
if (!layer)
|
||
return;
|
||
const effectList = layer.GetEffectList();
|
||
const effectType = effectList.GetEffectTypeByName(effectName);
|
||
if (!effectType)
|
||
return;
|
||
const e = enabled === 1;
|
||
if (effectType.IsActive() === e)
|
||
return;
|
||
effectType.SetActive(e);
|
||
effectList.UpdateActiveEffects();
|
||
this._runtime.UpdateRender()
|
||
},
|
||
SetLayerEffectParam(layer, effectName, paramIndex, value) {
|
||
if (!layer)
|
||
return;
|
||
const effectList = layer.GetEffectList();
|
||
const effectType = effectList.GetEffectTypeByName(effectName);
|
||
if (!effectType)
|
||
return;
|
||
const effectTypeIndex = effectType.GetIndex();
|
||
const paramsArr = effectList.GetEffectParametersForIndex(effectTypeIndex);
|
||
paramIndex = Math.floor(paramIndex);
|
||
if (paramIndex < 0 || paramIndex >= paramsArr.length)
|
||
return;
|
||
const paramType = effectType.GetShaderProgram().GetParameterType(paramIndex);
|
||
if (paramType === "color") {
|
||
tempColor.setFromRgbValue(value);
|
||
const curColor = paramsArr[paramIndex];
|
||
if (tempColor.equalsIgnoringAlpha(curColor))
|
||
return;
|
||
curColor.copyRgb(tempColor)
|
||
} else {
|
||
if (paramType === "percent")
|
||
value /= 100;
|
||
if (paramsArr[paramIndex] === value)
|
||
return;
|
||
paramsArr[paramIndex] = value
|
||
}
|
||
if (effectType.IsActive())
|
||
this._runtime.UpdateRender()
|
||
},
|
||
SetLayerForceOwnTexture(layer, f) {
|
||
if (!layer)
|
||
return;
|
||
f = !!f;
|
||
if (layer.IsForceOwnTexture() === f)
|
||
return;
|
||
layer.SetForceOwnTexture(f);
|
||
this.UpdateRender()
|
||
},
|
||
SetLayoutScale(s) {
|
||
const layout = this._runtime.GetCurrentLayout();
|
||
if (layout.GetScale() === s)
|
||
return;
|
||
layout.SetScale(s);
|
||
this.UpdateRender()
|
||
},
|
||
SetLayoutAngle(a) {
|
||
a = C3.clampAngle(C3.toRadians(+a));
|
||
const layout = this._runtime.GetCurrentLayout();
|
||
if (layout.GetAngle() === a)
|
||
return;
|
||
layout.SetAngle(a);
|
||
this.UpdateRender()
|
||
},
|
||
SetLayoutEffectEnabled(enabled, effectName) {
|
||
const layout = this._runtime.GetCurrentLayout();
|
||
const effectList = layout.GetEffectList();
|
||
const effectType = effectList.GetEffectTypeByName(effectName);
|
||
if (!effectType)
|
||
return;
|
||
const e = enabled === 1;
|
||
if (effectType.IsActive() === e)
|
||
return;
|
||
effectType.SetActive(e);
|
||
effectList.UpdateActiveEffects();
|
||
this._runtime.UpdateRender()
|
||
},
|
||
SetLayoutEffectParam(effectName, paramIndex, value) {
|
||
const layout = this._runtime.GetCurrentLayout();
|
||
const effectList = layout.GetEffectList();
|
||
const effectType = effectList.GetEffectTypeByName(effectName);
|
||
if (!effectType)
|
||
return;
|
||
const effectTypeIndex = effectType.GetIndex();
|
||
const paramsArr = effectList.GetEffectParametersForIndex(effectTypeIndex);
|
||
paramIndex = Math.floor(paramIndex);
|
||
if (paramIndex < 0 || paramIndex >= paramsArr.length)
|
||
return;
|
||
const paramType = effectType.GetShaderProgram().GetParameterType(paramIndex);
|
||
if (paramType === "color") {
|
||
tempColor.setFromRgbValue(value);
|
||
const curColor = paramsArr[paramIndex];
|
||
if (tempColor.equalsIgnoringAlpha(curColor))
|
||
return;
|
||
curColor.copyRgb(tempColor)
|
||
} else {
|
||
if (paramType === "percent")
|
||
value /= 100;
|
||
if (paramsArr[paramIndex] === value)
|
||
return;
|
||
paramsArr[paramIndex] = value
|
||
}
|
||
if (effectType.IsActive())
|
||
this._runtime.UpdateRender()
|
||
},
|
||
ScrollX(x) {
|
||
const layout = this._runtime.GetCurrentLayout();
|
||
layout.SetScrollX(x)
|
||
},
|
||
ScrollY(y) {
|
||
const layout = this._runtime.GetCurrentLayout();
|
||
layout.SetScrollY(y)
|
||
},
|
||
Scroll(x, y) {
|
||
const layout = this._runtime.GetCurrentLayout();
|
||
layout.SetScrollX(x);
|
||
layout.SetScrollY(y)
|
||
},
|
||
ScrollToObject(objectClass) {
|
||
if (!objectClass)
|
||
return;
|
||
const inst = objectClass.GetFirstPicked();
|
||
if (!inst)
|
||
return;
|
||
const wi = inst.GetWorldInfo();
|
||
if (!wi)
|
||
return;
|
||
const layout = this._runtime.GetCurrentLayout();
|
||
layout.SetScrollX(wi.GetX());
|
||
layout.SetScrollY(wi.GetY())
|
||
},
|
||
async LoadObjectTextures(objectClass) {
|
||
const layout = this._runtime.GetMainRunningLayout();
|
||
if (!layout || !objectClass || this._runtime.IsLoading())
|
||
return;
|
||
const objectClasses = objectClass.IsFamily() ? objectClass.GetFamilyMembers() : [objectClass];
|
||
await this._LoadTexturesForObjectClasses(layout, objectClasses)
|
||
},
|
||
async LoadObjectTexturesByName(objectClassName) {
|
||
await C3.Plugins.System.Acts.LoadObjectTextures.call(this, this._runtime.GetObjectClassByName(objectClassName))
|
||
},
|
||
UnloadObjectTextures(objectClass) {
|
||
const layout = this._runtime.GetMainRunningLayout();
|
||
if (!layout || !objectClass)
|
||
return;
|
||
const objectClasses = objectClass.IsFamily() ? objectClass.GetFamilyMembers() : [objectClass];
|
||
this._UnloadTexturesForObjectClasses(layout, objectClasses)
|
||
},
|
||
UnloadObjectTexturesByName(objectClassName) {
|
||
C3.Plugins.System.Acts.UnloadObjectTexturesByName.call(this, this._runtime.GetObjectClassByName(objectClassName))
|
||
},
|
||
UnloadUnusedTextures() {
|
||
const layout = this._runtime.GetMainRunningLayout();
|
||
if (!layout)
|
||
return;
|
||
const objectClasses = layout._GetTextureLoadedObjectTypes();
|
||
this._UnloadTexturesForObjectClasses(layout, objectClasses)
|
||
},
|
||
async LoadLayoutTextures(loadLayout) {
|
||
const curLayout = this._runtime.GetMainRunningLayout();
|
||
if (!loadLayout || !curLayout || this._runtime.IsLoading())
|
||
return;
|
||
await this._LoadTexturesForObjectClasses(curLayout, loadLayout._GetInitialObjectClasses())
|
||
},
|
||
async LoadLayoutTexturesByName(layoutName) {
|
||
const curLayout = this._runtime.GetMainRunningLayout();
|
||
const loadLayout = this._runtime.GetLayoutManager().GetLayoutByName(layoutName);
|
||
if (!loadLayout || !curLayout || this._runtime.IsLoading())
|
||
return;
|
||
await this._LoadTexturesForObjectClasses(curLayout, loadLayout._GetInitialObjectClasses())
|
||
},
|
||
SetFunctionReturnValue(v) {
|
||
const frame = this._eventStack.GetCurrentExpFuncStackFrame();
|
||
if (!frame)
|
||
return;
|
||
switch (frame.GetFunctionReturnType()) {
|
||
case 1:
|
||
if (typeof v === "number")
|
||
frame.SetFunctionReturnValue(v);
|
||
break;
|
||
case 2:
|
||
if (typeof v === "string")
|
||
frame.SetFunctionReturnValue(v);
|
||
break;
|
||
case 3:
|
||
frame.SetFunctionReturnValue(v);
|
||
break
|
||
}
|
||
},
|
||
MapFunction(name, str, functionBlock) {
|
||
const mapEntry = this._GetFunctionMap(name.toLowerCase(), true);
|
||
const strMap = mapEntry.strMap;
|
||
const lowerStr = str.toLowerCase();
|
||
if (strMap.has(lowerStr))
|
||
console.warn(`[Construct 3] Function map '${name}' string '${str}' already in map; overwriting entry`);
|
||
const firstFunctionBlock = C3.first(strMap.values()) || mapEntry.defaultFunc;
|
||
if (firstFunctionBlock) {
|
||
const firstReturnsValue = firstFunctionBlock.GetReturnType() !== 0;
|
||
const curReturnsValue = functionBlock.GetReturnType() !== 0;
|
||
if (firstReturnsValue !== curReturnsValue) {
|
||
console.error(`[Construct 3] Function map '${name}' string '${str}' function return type not compatible with other functions in the map; entry ignored`);
|
||
return
|
||
}
|
||
}
|
||
strMap.set(lowerStr, functionBlock)
|
||
},
|
||
MapFunctionDefault(name, functionBlock) {
|
||
const mapEntry = this._GetFunctionMap(name.toLowerCase(), true);
|
||
if (mapEntry.defaultFunc)
|
||
console.warn(`[Construct 3] Function map '${name}' already has a default; overwriting entry`);
|
||
const firstFunctionBlock = C3.first(mapEntry.strMap.values()) || mapEntry.defaultFunc;
|
||
if (firstFunctionBlock) {
|
||
const firstReturnsValue = firstFunctionBlock.GetReturnType() !== 0;
|
||
const curReturnsValue = functionBlock.GetReturnType() !== 0;
|
||
if (firstReturnsValue !== curReturnsValue) {
|
||
console.error(`[Construct 3] Function map '${name}' default: function return type not compatible with other functions in the map; entry ignored`);
|
||
return
|
||
}
|
||
}
|
||
mapEntry.defaultFunc = functionBlock
|
||
},
|
||
CallMappedFunction(name, str, forwardParams) {
|
||
forwardParams = Math.floor(forwardParams);
|
||
const mapEntry = this._GetFunctionMap(name.toLowerCase(), false);
|
||
if (!mapEntry) {
|
||
console.warn(`[Construct 3] Call mapped function: map name '${name}' not found; call ignored`);
|
||
return
|
||
}
|
||
let functionBlock = mapEntry.strMap.get(str.toLowerCase());
|
||
if (!functionBlock)
|
||
if (mapEntry.defaultFunc) {
|
||
functionBlock = mapEntry.defaultFunc;
|
||
forwardParams = 0
|
||
} else {
|
||
console.warn(`[Construct 3] Call mapped function: no function associated with map '${name}' string '${str}'; call ignored (consider setting a default)`);
|
||
return
|
||
}
|
||
if (!functionBlock.IsEnabled())
|
||
return;
|
||
if (functionBlock.GetReturnType() !== 0) {
|
||
console.warn(`[Construct 3] Call mapped function: map '${name}' string '${str}' has a return type so cannot be called`);
|
||
return
|
||
}
|
||
const runtime = this._runtime;
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
const currentEvent = eventSheetManager.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiersIncludingParents();
|
||
const hasAnySolModifiers = solModifiers.length > 0;
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PushCleanSol(solModifiers);
|
||
const paramResults = [];
|
||
const callerFunctionBlock = eventSheetManager.FindFirstFunctionBlockParent(currentEvent);
|
||
if (callerFunctionBlock) {
|
||
const callerParameters = callerFunctionBlock.GetFunctionParameters();
|
||
for (let i = forwardParams, len = callerParameters.length; i < len; ++i)
|
||
paramResults.push(callerParameters[i].GetValue())
|
||
}
|
||
const calleeParameters = functionBlock.GetFunctionParameters();
|
||
for (let i = paramResults.length, len = calleeParameters.length; i < len; ++i)
|
||
paramResults.push(calleeParameters[i].GetInitialValue());
|
||
if (runtime.IsDebugging())
|
||
return this._DebugDoCallMappedFunction(eventSheetManager, functionBlock, paramResults, hasAnySolModifiers, solModifiers);
|
||
else
|
||
return this._DoCallMappedFunction(eventSheetManager, functionBlock, paramResults, hasAnySolModifiers, solModifiers)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.System.Exps = {
|
||
int: function(x) {
|
||
if (typeof x === "string") {
|
||
x = parseInt(x, 10);
|
||
if (isNaN(x))
|
||
x = 0
|
||
}
|
||
return Math.floor(x)
|
||
},
|
||
float: function(x) {
|
||
if (typeof x === "string") {
|
||
x = parseFloat(x);
|
||
if (isNaN(x))
|
||
x = 0
|
||
}
|
||
return x
|
||
},
|
||
str(x) {
|
||
return x.toString()
|
||
},
|
||
len(x) {
|
||
if (typeof x === "string")
|
||
return x.length;
|
||
else
|
||
return 0
|
||
},
|
||
random(a, b) {
|
||
if (typeof b === "undefined")
|
||
return this._runtime.Random() * a;
|
||
else
|
||
return this._runtime.Random() * (b - a) + a
|
||
},
|
||
choose(...args) {
|
||
const index = Math.floor(this._runtime.Random() * args.length);
|
||
return args[index]
|
||
},
|
||
pi() {
|
||
return Math.PI
|
||
},
|
||
infinity() {
|
||
return Infinity
|
||
},
|
||
sqrt(v) {
|
||
return Math.sqrt(v)
|
||
},
|
||
abs(v) {
|
||
return Math.abs(v)
|
||
},
|
||
round(v) {
|
||
return Math.round(v)
|
||
},
|
||
floor(v) {
|
||
return Math.floor(v)
|
||
},
|
||
ceil(v) {
|
||
return Math.ceil(v)
|
||
},
|
||
sign(v) {
|
||
return Math.sign(v)
|
||
},
|
||
sin(x) {
|
||
return Math.sin(C3.toRadians(x))
|
||
},
|
||
cos(x) {
|
||
return Math.cos(C3.toRadians(x))
|
||
},
|
||
tan(x) {
|
||
return Math.tan(C3.toRadians(x))
|
||
},
|
||
asin(x) {
|
||
return C3.toDegrees(Math.asin(x))
|
||
},
|
||
acos(x) {
|
||
return C3.toDegrees(Math.acos(x))
|
||
},
|
||
atan(x) {
|
||
return C3.toDegrees(Math.atan(x))
|
||
},
|
||
exp(x) {
|
||
return Math.exp(x)
|
||
},
|
||
ln(x) {
|
||
return Math.log(x)
|
||
},
|
||
log10(x) {
|
||
return Math.log(x) / Math.LN10
|
||
},
|
||
max(...args) {
|
||
let ret = args[0];
|
||
if (typeof ret !== "number")
|
||
ret = 0;
|
||
for (let i = 1, len = args.length; i < len; ++i) {
|
||
let n = args[i];
|
||
if (typeof n !== "number")
|
||
continue;
|
||
if (ret < n)
|
||
ret = n
|
||
}
|
||
return ret
|
||
},
|
||
min(...args) {
|
||
let ret = args[0];
|
||
if (typeof ret !== "number")
|
||
ret = 0;
|
||
for (let i = 1, len = args.length; i < len; ++i) {
|
||
let n = args[i];
|
||
if (typeof n !== "number")
|
||
continue;
|
||
if (ret > n)
|
||
ret = n
|
||
}
|
||
return ret
|
||
},
|
||
clamp(x, l, u) {
|
||
return C3.clamp(x, l, u)
|
||
},
|
||
distance(x1, y1, x2, y2) {
|
||
return C3.distanceTo(x1, y1, x2, y2)
|
||
},
|
||
angle(x1, y1, x2, y2) {
|
||
return C3.toDegrees(C3.angleTo(x1, y1, x2, y2))
|
||
},
|
||
lerp(a, b, x) {
|
||
return C3.lerp(a, b, x)
|
||
},
|
||
unlerp(a, b, y) {
|
||
return C3.unlerp(a, b, y)
|
||
},
|
||
qarp(a, b, c, x) {
|
||
return C3.qarp(a, b, c, x)
|
||
},
|
||
cubic(a, b, c, d, x) {
|
||
return C3.cubic(a, b, c, d, x)
|
||
},
|
||
cosp(a, b, x) {
|
||
return C3.cosp(a, b, x)
|
||
},
|
||
anglediff(a, b) {
|
||
return C3.toDegrees(C3.angleDiff(C3.toRadians(a), C3.toRadians(b)))
|
||
},
|
||
anglelerp(a, b, x) {
|
||
return C3.toDegrees(C3.angleLerp(C3.toRadians(a), C3.toRadians(b), x))
|
||
},
|
||
anglerotate(a, b, c) {
|
||
return C3.toDegrees(C3.angleRotate(C3.toRadians(a), C3.toRadians(b), C3.toRadians(c)))
|
||
},
|
||
setbit(n, b, v) {
|
||
n = n | 0;
|
||
b = b | 0;
|
||
v = v !== 0 ? 1 : 0;
|
||
return n & ~(1 << b) | v << b
|
||
},
|
||
togglebit(n, b) {
|
||
n = n | 0;
|
||
b = b | 0;
|
||
return n ^ 1 << b
|
||
},
|
||
getbit(n, b) {
|
||
n = n | 0;
|
||
b = b | 0;
|
||
return n & 1 << b ? 1 : 0
|
||
},
|
||
newline() {
|
||
return "\n"
|
||
},
|
||
uppercase(s) {
|
||
return typeof s === "string" ? s.toUpperCase() : ""
|
||
},
|
||
lowercase(s) {
|
||
return typeof s === "string" ? s.toLowerCase() : ""
|
||
},
|
||
left(text, n) {
|
||
return typeof text === "string" ? text.substr(0, n) : ""
|
||
},
|
||
mid(text, index, count) {
|
||
if (typeof text !== "string")
|
||
return "";
|
||
if (count < 0)
|
||
return text.substr(index);
|
||
else
|
||
return text.substr(index, count)
|
||
},
|
||
right(text, n) {
|
||
return typeof text === "string" ? text.substr(text.length - n) : ""
|
||
},
|
||
trim(text) {
|
||
return typeof text === "string" ? text.trim() : ""
|
||
},
|
||
tokenat(text, index, sep) {
|
||
if (typeof text !== "string" || typeof sep !== "string")
|
||
return "";
|
||
let arr = text.split(sep);
|
||
index = Math.floor(index);
|
||
if (index < 0 || index >= arr.length)
|
||
return "";
|
||
return arr[index]
|
||
},
|
||
tokencount(text, sep) {
|
||
if (typeof text !== "string" || typeof sep !== "string" || !text.length)
|
||
return 0;
|
||
return text.split(sep).length
|
||
},
|
||
find(text, searchStr) {
|
||
if (typeof text === "string" && typeof searchStr === "string")
|
||
return text.search(new RegExp(C3.EscapeRegex(searchStr),"i"));
|
||
else
|
||
return -1
|
||
},
|
||
findcase(text, searchStr) {
|
||
if (typeof text === "string" && typeof searchStr === "string")
|
||
return text.search(new RegExp(C3.EscapeRegex(searchStr),""));
|
||
else
|
||
return -1
|
||
},
|
||
replace(text, find, replace) {
|
||
if (typeof text === "string" && typeof find === "string" && typeof replace === "string")
|
||
return text.replace(new RegExp(C3.EscapeRegex(find),"gi"), replace);
|
||
else
|
||
return typeof text === "string" ? text : ""
|
||
},
|
||
regexsearch(text, regex, flags) {
|
||
const cacheRegex = this.GetRegex(regex, flags);
|
||
return text ? text.search(cacheRegex) : -1
|
||
},
|
||
regexreplace(text, regex, flags, replace) {
|
||
const cacheRegex = this.GetRegex(regex, flags);
|
||
return text ? text.replace(cacheRegex, replace) : ""
|
||
},
|
||
regexmatchcount(text, regex, flags) {
|
||
const matches = this.GetRegexMatches(text.toString(), regex, flags);
|
||
return matches ? matches.length : 0
|
||
},
|
||
regexmatchat(text, regex, flags, index) {
|
||
index = Math.floor(index);
|
||
const matches = this.GetRegexMatches(text.toString(), regex, flags);
|
||
if (!matches || index < 0 || index >= matches.length)
|
||
return "";
|
||
else
|
||
return matches[index]
|
||
},
|
||
zeropad(n, d) {
|
||
let s = n < 0 ? "-" : "";
|
||
if (n < 0)
|
||
n = -n;
|
||
const zeroes = d - n.toString().length;
|
||
s += "0".repeat(Math.max(zeroes, 0));
|
||
return s + n.toString()
|
||
},
|
||
urlencode(s) {
|
||
return encodeURIComponent(s)
|
||
},
|
||
urldecode(s) {
|
||
return decodeURIComponent(s)
|
||
},
|
||
dt() {
|
||
return this._runtime._GetDtFast()
|
||
},
|
||
timescale() {
|
||
return this._runtime.GetTimeScale()
|
||
},
|
||
wallclocktime() {
|
||
return (Date.now() - this._runtime.GetStartTime()) / 1E3
|
||
},
|
||
unixtime() {
|
||
return Date.now()
|
||
},
|
||
time() {
|
||
return this._runtime.GetGameTime()
|
||
},
|
||
tickcount() {
|
||
return this._runtime.GetTickCount()
|
||
},
|
||
objectcount() {
|
||
return this._runtime.GetObjectCount()
|
||
},
|
||
fps() {
|
||
return this._runtime.GetFPS()
|
||
},
|
||
cpuutilisation() {
|
||
return this._runtime.GetMainThreadTime()
|
||
},
|
||
gpuutilisation() {
|
||
return this._runtime.GetGPUUtilisation()
|
||
},
|
||
windowwidth() {
|
||
return this._runtime.GetCanvasManager().GetDeviceWidth()
|
||
},
|
||
windowheight() {
|
||
return this._runtime.GetCanvasManager().GetDeviceHeight()
|
||
},
|
||
originalwindowwidth() {
|
||
return this._runtime.GetOriginalViewportWidth()
|
||
},
|
||
originalwindowheight() {
|
||
return this._runtime.GetOriginalViewportHeight()
|
||
},
|
||
originalviewportwidth() {
|
||
return this._runtime.GetOriginalViewportWidth()
|
||
},
|
||
originalviewportheight() {
|
||
return this._runtime.GetOriginalViewportHeight()
|
||
},
|
||
scrollx() {
|
||
return this._runtime.GetCurrentLayout().GetScrollX()
|
||
},
|
||
scrolly() {
|
||
return this._runtime.GetCurrentLayout().GetScrollY()
|
||
},
|
||
layoutname() {
|
||
return this._runtime.GetCurrentLayout().GetName()
|
||
},
|
||
layoutscale() {
|
||
return this._runtime.GetCurrentLayout().GetScale()
|
||
},
|
||
layoutangle() {
|
||
return C3.toDegrees(this._runtime.GetCurrentLayout().GetAngle())
|
||
},
|
||
layoutwidth() {
|
||
return this._runtime.GetCurrentLayout().GetWidth()
|
||
},
|
||
layoutheight() {
|
||
return this._runtime.GetCurrentLayout().GetHeight()
|
||
},
|
||
viewportleft(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetViewport().getLeft() : 0
|
||
},
|
||
viewporttop(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetViewport().getTop() : 0
|
||
},
|
||
viewportright(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetViewport().getRight() : 0
|
||
},
|
||
viewportbottom(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetViewport().getBottom() : 0
|
||
},
|
||
viewportwidth(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetViewport().width() : 0
|
||
},
|
||
viewportheight(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetViewport().height() : 0
|
||
},
|
||
canvastolayerx(layerParam, x, y) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.CanvasCssToLayer(x, y)[0] : 0
|
||
},
|
||
canvastolayery(layerParam, x, y) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.CanvasCssToLayer(x, y)[1] : 0
|
||
},
|
||
layertocanvasx(layerParam, x, y) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.LayerToCanvasCss(x, y)[0] : 0
|
||
},
|
||
layertocanvasy(layerParam, x, y) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.LayerToCanvasCss(x, y)[1] : 0
|
||
},
|
||
layerscale(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetOwnScale() : 0
|
||
},
|
||
layerangle(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? C3.toDegrees(layer.GetOwnAngle()) : 0
|
||
},
|
||
layeropacity(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetOpacity() * 100 : 0
|
||
},
|
||
layerscalerate(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetScaleRate() : 0
|
||
},
|
||
layerparallaxx(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetParallaxX() * 100 : 0
|
||
},
|
||
layerparallaxy(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetParallaxY() * 100 : 0
|
||
},
|
||
layerzelevation(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetZElevation() : 0
|
||
},
|
||
layerindex(layerParam) {
|
||
const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam);
|
||
return layer ? layer.GetIndex() : -1
|
||
},
|
||
canvassnapshot() {
|
||
const canvasManager = this._runtime.GetCanvasManager();
|
||
if (!canvasManager)
|
||
return "";
|
||
return canvasManager.GetCanvasSnapshotUrl()
|
||
},
|
||
loopindex(name) {
|
||
const loopStack = this._loopStack;
|
||
if (!loopStack.IsInLoop())
|
||
return 0;
|
||
if (name) {
|
||
const loop = loopStack.FindByName(name);
|
||
return loop ? loop.GetIndex() : 0
|
||
} else
|
||
return loopStack.GetCurrent().GetIndex()
|
||
},
|
||
savestatejson() {
|
||
return this._runtime.GetLastSaveJsonString()
|
||
},
|
||
callmapped(name, str, ...paramResults) {
|
||
const mapEntry = this._GetFunctionMap(name.toLowerCase(), false);
|
||
if (!mapEntry) {
|
||
console.warn(`[Construct 3] Call mapped function: map name '${name}' not found; returning 0`);
|
||
return 0
|
||
}
|
||
let functionBlock = mapEntry.strMap.get(str.toLowerCase());
|
||
if (!functionBlock)
|
||
if (mapEntry.defaultFunc)
|
||
functionBlock = mapEntry.defaultFunc;
|
||
else {
|
||
console.warn(`[Construct 3] Call mapped function: no function associated with map '${name}' string '${str}'; returning 0 (consider setting a default)`);
|
||
return 0
|
||
}
|
||
const returnType = functionBlock.GetReturnType();
|
||
const defaultReturnValue = functionBlock.GetDefaultReturnValue();
|
||
if (returnType === 0) {
|
||
console.warn(`[Construct 3] Call mapped function: map '${name}' string '${str}' has no return type so cannot be called from an expression; returning 0`);
|
||
return 0
|
||
}
|
||
if (!functionBlock.IsEnabled())
|
||
return defaultReturnValue;
|
||
const runtime = this._runtime;
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
const currentEvent = eventSheetManager.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiersIncludingParents();
|
||
const hasAnySolModifiers = solModifiers.length > 0;
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PushCleanSol(solModifiers);
|
||
const calleeParameters = functionBlock.GetFunctionParameters();
|
||
for (let i = paramResults.length, len = calleeParameters.length; i < len; ++i)
|
||
paramResults.push(calleeParameters[i].GetInitialValue());
|
||
const callEventBlock = functionBlock.GetEventBlock();
|
||
const returnValue = callEventBlock.RunAsExpressionFunctionCall(callEventBlock.GetSolModifiersIncludingParents(), returnType, defaultReturnValue, ...paramResults);
|
||
if (hasAnySolModifiers)
|
||
eventSheetManager.PopSol(solModifiers);
|
||
return returnValue
|
||
},
|
||
loadingprogress() {
|
||
return this._runtime.GetAssetManager().GetLoadProgress()
|
||
},
|
||
imageloadingprogress() {
|
||
if (this._imagesLoadingTotal === 0)
|
||
return 1;
|
||
return this._imagesLoadingComplete / this._imagesLoadingTotal
|
||
},
|
||
renderer() {
|
||
return "webgl"
|
||
},
|
||
rendererdetail() {
|
||
return this._runtime.GetWebGLRenderer().GetUnmaskedRenderer()
|
||
},
|
||
imagememoryusage() {
|
||
let ret = this._runtime.GetWebGLRenderer().GetEstimatedTextureMemoryUsage();
|
||
return Math.round(100 * ret / (1024 * 1024)) / 100
|
||
},
|
||
rgb(r, g, b) {
|
||
return C3.PackRGB(r, g, b)
|
||
},
|
||
rgbex(r, g, b) {
|
||
return C3.PackRGBEx(r / 100, g / 100, b / 100)
|
||
},
|
||
rgba(r, g, b, a) {
|
||
return C3.PackRGBAEx(r / 100, g / 100, b / 100, a / 100)
|
||
},
|
||
rgbex255(r, g, b) {
|
||
return C3.PackRGBEx(r / 255, g / 255, b / 255)
|
||
},
|
||
rgba255(r, g, b, a) {
|
||
return C3.PackRGBAEx(r / 255, g / 255, b / 255, a / 255)
|
||
},
|
||
projectname() {
|
||
return this._runtime.GetProjectName()
|
||
},
|
||
projectversion() {
|
||
return this._runtime.GetProjectVersion()
|
||
},
|
||
currenteventsheetname() {
|
||
return this._runtime.GetCurrentEvent().GetEventSheet().GetName()
|
||
},
|
||
currenteventnumber() {
|
||
return this._runtime.GetCurrentEvent().GetDisplayNumber()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Spritefont2 = class SpriteFontPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Spritefont2.Type = class SpriteFontType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass);
|
||
this._spriteFont = C3.New(self.SpriteFont)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {
|
||
this.GetImageInfo().LoadAsset(this._runtime)
|
||
}
|
||
LoadTextures(renderer) {
|
||
return this.GetImageInfo().LoadStaticTexture(renderer, {
|
||
sampling: this._runtime.GetSampling()
|
||
})
|
||
}
|
||
ReleaseTextures() {
|
||
this.GetImageInfo().ReleaseTexture()
|
||
}
|
||
GetSpriteFont() {
|
||
return this._spriteFont
|
||
}
|
||
UpdateSettings(characterWidth, characterHeight, characterSet, spacingData) {
|
||
const imageInfo = this.GetImageInfo();
|
||
const sf = this._spriteFont;
|
||
sf.SetWidth(imageInfo.GetWidth());
|
||
sf.SetHeight(imageInfo.GetHeight());
|
||
sf.SetCharacterWidth(characterWidth);
|
||
sf.SetCharacterHeight(characterHeight);
|
||
sf.SetCharacterSet(characterSet);
|
||
sf.SetSpacingData(spacingData);
|
||
sf.UpdateCharacterMap()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const TEXT = 0;
|
||
const ENABLE_BBCODE = 1;
|
||
const CHARACTER_WIDTH = 2;
|
||
const CHARACTER_HEIGHT = 3;
|
||
const CHARACTER_SET = 4;
|
||
const SPACING_DATA = 5;
|
||
const SCALE = 6;
|
||
const CHARACTER_SPACING = 7;
|
||
const LINE_HEIGHT = 8;
|
||
const HORIZONTAL_ALIGNMENT = 9;
|
||
const VERTICAL_ALIGNMENT = 10;
|
||
const WRAPPING = 11;
|
||
const INITIALLY_VISIBLE = 12;
|
||
const ORIGIN = 13;
|
||
const HORIZONTAL_ALIGNMENTS = ["left", "center", "right"];
|
||
const VERTICAL_ALIGNMENTS = ["top", "center", "bottom"];
|
||
const WORD_WRAP = 0;
|
||
const CHARACTER_WRAP = 1;
|
||
C3.Plugins.Spritefont2.Instance = class SpriteFontInstance extends C3.SDKWorldInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
this._text = "";
|
||
this._enableBBcode = true;
|
||
this._characterWidth = 16;
|
||
this._characterHeight = 16;
|
||
this._characterSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@\u00b0+=*$\u00a3\u20ac<>";
|
||
let spacingData = "";
|
||
this._characterScale = 1;
|
||
this._characterSpacing = 0;
|
||
this._lineHeight = 0;
|
||
this._horizontalAlign = 0;
|
||
this._verticalAlign = 0;
|
||
this._wrapByWord = true;
|
||
this._spriteFontText = null;
|
||
this._typewriterStartTime = -1;
|
||
this._typewriterEndTime = -1;
|
||
this._typewriterLength = 0;
|
||
if (properties) {
|
||
this._text = properties[0];
|
||
this._enableBBcode = properties[1];
|
||
this._characterWidth = properties[2];
|
||
this._characterHeight = properties[3];
|
||
this._characterSet = properties[4];
|
||
spacingData = properties[5];
|
||
this._characterScale = properties[6];
|
||
this._characterSpacing = properties[7];
|
||
this._lineHeight = properties[8];
|
||
this._horizontalAlign = properties[9];
|
||
this._verticalAlign = properties[10];
|
||
this._wrapByWord = properties[11] === 0;
|
||
const wi = this.GetWorldInfo();
|
||
wi.SetVisible(properties[12])
|
||
}
|
||
this._sdkType.UpdateSettings(this._characterWidth, this._characterHeight, this._characterSet, spacingData);
|
||
this._spriteFontText = C3.New(self.SpriteFontText, this._sdkType.GetSpriteFont());
|
||
const wi = this.GetWorldInfo();
|
||
this._spriteFontText.SetSize(wi.GetWidth(), wi.GetHeight());
|
||
this._UpdateSettings()
|
||
}
|
||
Release() {
|
||
this._CancelTypewriter();
|
||
this._spriteFontText.Release();
|
||
this._spriteFontText = null;
|
||
super.Release()
|
||
}
|
||
_UpdateSettings() {
|
||
const sft = this._spriteFontText;
|
||
if (!sft)
|
||
return;
|
||
sft.SetBBCodeEnabled(this._enableBBcode);
|
||
sft.SetText(this._text);
|
||
sft.SetWordWrapMode(this._wrapByWord ? "word" : "character");
|
||
sft.SetHorizontalAlign(HORIZONTAL_ALIGNMENTS[this._horizontalAlign]);
|
||
sft.SetVerticalAlign(VERTICAL_ALIGNMENTS[this._verticalAlign]);
|
||
sft.SetSpacing(this._characterSpacing);
|
||
sft.SetLineHeight(this._lineHeight)
|
||
}
|
||
Draw(renderer) {
|
||
const imageInfo = this._objectClass.GetImageInfo();
|
||
const texture = imageInfo.GetTexture();
|
||
if (!texture)
|
||
return;
|
||
renderer.SetTexture(texture);
|
||
const wi = this.GetWorldInfo();
|
||
let q = wi.GetBoundingQuad();
|
||
const sft = this._spriteFontText;
|
||
sft.SetScale(this._characterScale * wi.GetSceneGraphScale());
|
||
if (this._runtime.IsPixelRoundingEnabled())
|
||
q = wi.PixelRoundQuad(q);
|
||
sft.SetSize(wi.GetWidth(), wi.GetHeight());
|
||
sft.GetSpriteFont().SetTexRect(imageInfo.GetTexRect());
|
||
sft.SetColor(wi.GetUnpremultipliedColor());
|
||
sft.Draw(renderer, q.getTlx(), q.getTly(), wi.GetAngle())
|
||
}
|
||
SaveToJson() {
|
||
const ret = {
|
||
"t": this._text,
|
||
"ebbc": this._enableBBcode,
|
||
"csc": this._characterScale,
|
||
"csp": this._characterSpacing,
|
||
"lh": this._lineHeight,
|
||
"ha": this._horizontalAlign,
|
||
"va": this._verticalAlign,
|
||
"w": this._wrapByWord,
|
||
"cw": this._sdkType.GetSpriteFont().GetCharacterWidth(),
|
||
"ch": this._sdkType.GetSpriteFont().GetCharacterHeight(),
|
||
"cs": this._sdkType.GetSpriteFont().GetCharacterSet(),
|
||
"sd": this._sdkType.GetSpriteFont().GetSpacingData()
|
||
};
|
||
if (this._typewriterEndTime !== -1)
|
||
ret["tw"] = {
|
||
"st": this._typewriterStartTime,
|
||
"en": this._typewriterEndTime,
|
||
"l": this._typewriterLength
|
||
};
|
||
return ret
|
||
}
|
||
LoadFromJson(o) {
|
||
this._CancelTypewriter();
|
||
this._text = o["t"];
|
||
this._enableBBcode = o["ebbc"];
|
||
this._characterScale = o["csc"];
|
||
this._characterSpacing = o["csp"];
|
||
this._lineHeight = o["lh"];
|
||
this._horizontalAlign = o["ha"];
|
||
this._verticalAlign = o["va"];
|
||
this._wrapByWord = o["w"];
|
||
if (o.hasOwnProperty("tw")) {
|
||
const tw = o["tw"];
|
||
this._typewriterStartTime = tw["st"];
|
||
this._typewriterEndTime = tw["en"];
|
||
this._typewriterLength = o["l"]
|
||
}
|
||
const spriteFont = this._sdkType.GetSpriteFont();
|
||
spriteFont.SetCharacterWidth(o["cw"]);
|
||
spriteFont.SetCharacterHeight(o["ch"]);
|
||
spriteFont.SetCharacterSet(o["cs"]);
|
||
spriteFont.SetSpacingData(o["sd"]);
|
||
this._UpdateSettings();
|
||
if (this._typewriterEndTime !== -1)
|
||
this._StartTicking()
|
||
}
|
||
GetPropertyValueByIndex(index) {
|
||
switch (index) {
|
||
case TEXT:
|
||
return this._text;
|
||
case ENABLE_BBCODE:
|
||
return this._enableBBcode;
|
||
case CHARACTER_WIDTH:
|
||
return this._sdkType.GetSpriteFont().GetCharacterWidth();
|
||
case CHARACTER_HEIGHT:
|
||
return this._sdkType.GetSpriteFont().GetCharacterHeight();
|
||
case CHARACTER_SET:
|
||
return this._sdkType.GetSpriteFont().GetCharacterSet();
|
||
case SPACING_DATA:
|
||
return this._sdkType.GetSpriteFont().GetSpacingData();
|
||
case SCALE:
|
||
return this._characterScale;
|
||
case CHARACTER_SPACING:
|
||
return this._characterSpacing;
|
||
case LINE_HEIGHT:
|
||
return this._lineHeight;
|
||
case HORIZONTAL_ALIGNMENT:
|
||
return this._horizontalAlign;
|
||
case VERTICAL_ALIGNMENT:
|
||
return this._verticalAlign;
|
||
case WRAPPING:
|
||
return this._wrapByWord ? CHARACTER_WRAP : WORD_WRAP
|
||
}
|
||
}
|
||
SetPropertyValueByIndex(index, value) {
|
||
switch (index) {
|
||
case TEXT:
|
||
if (this._text === value)
|
||
return;
|
||
this._text = value;
|
||
this._UpdateSettings();
|
||
break;
|
||
case ENABLE_BBCODE:
|
||
if (this._enableBBcode === !!value)
|
||
return;
|
||
this._enableBBcode = !!value;
|
||
this._UpdateSettings();
|
||
break;
|
||
case CHARACTER_WIDTH:
|
||
this._sdkType.GetSpriteFont().SetCharacterWidth(value);
|
||
break;
|
||
case CHARACTER_HEIGHT:
|
||
this._sdkType.GetSpriteFont().SetCharacterHeight(value);
|
||
break;
|
||
case CHARACTER_SET:
|
||
this._sdkType.GetSpriteFont().SetCharacterSet(value);
|
||
break;
|
||
case SPACING_DATA:
|
||
this._sdkType.GetSpriteFont().SetSpacingData(value);
|
||
break;
|
||
case SCALE:
|
||
if (this._characterScale === value)
|
||
return;
|
||
this._characterScale = value;
|
||
this._UpdateSettings();
|
||
break;
|
||
case CHARACTER_SPACING:
|
||
if (this._characterSpacing === value)
|
||
return;
|
||
this._characterSpacing = value;
|
||
this._UpdateSettings();
|
||
break;
|
||
case LINE_HEIGHT:
|
||
if (this._lineHeight === value)
|
||
return;
|
||
this._lineHeight = value;
|
||
this._UpdateSettings();
|
||
break;
|
||
case HORIZONTAL_ALIGNMENT:
|
||
if (this._horizontalAlign === value)
|
||
return;
|
||
this._horizontalAlign = value;
|
||
this._UpdateSettings();
|
||
break;
|
||
case VERTICAL_ALIGNMENT:
|
||
if (this._verticalAlign === value)
|
||
return;
|
||
this._verticalAlign = value;
|
||
this._UpdateSettings();
|
||
break;
|
||
case WRAPPING:
|
||
if (this._wrapByWord === (value === WORD_WRAP))
|
||
return;
|
||
this._wrapByWord = value === WORD_WRAP;
|
||
this._UpdateSettings();
|
||
break
|
||
}
|
||
}
|
||
_SetText(text) {
|
||
if (this._text === text)
|
||
return;
|
||
this._text = text;
|
||
this._spriteFontText.SetText(text);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
GetText() {
|
||
return this._text
|
||
}
|
||
_StartTypewriter(text, duration) {
|
||
this._SetText(text);
|
||
this._typewriterStartTime = this._runtime.GetWallTime();
|
||
this._typewriterEndTime = this._typewriterStartTime + duration / this.GetInstance().GetActiveTimeScale();
|
||
this._typewriterLength = C3.BBString.StripAnyTags(text).length;
|
||
this._spriteFontText.SetDrawMaxCharacterCount(0);
|
||
this._StartTicking()
|
||
}
|
||
_CancelTypewriter() {
|
||
this._typewriterStartTime = -1;
|
||
this._typewriterEndTime = -1;
|
||
this._typewriterLength = 0;
|
||
this._spriteFontText.SetDrawMaxCharacterCount(-1);
|
||
this._StopTicking()
|
||
}
|
||
_FinishTypewriter() {
|
||
if (this._typewriterEndTime === -1)
|
||
return;
|
||
this._CancelTypewriter();
|
||
this.Trigger(C3.Plugins.Spritefont2.Cnds.OnTypewriterTextFinished);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_SetScale(s) {
|
||
if (this._characterScale === s)
|
||
return;
|
||
this._characterScale = s;
|
||
this._spriteFontText.SetScale(this._characterScale);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_GetScale() {
|
||
return this._characterScale
|
||
}
|
||
_SetCharacterSpacing(s) {
|
||
if (this._characterSpacing === s)
|
||
return;
|
||
this._characterSpacing = s;
|
||
this._spriteFontText.SetSpacing(this._characterSpacing);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_GetCharacterSpacing() {
|
||
return this._characterSpacing
|
||
}
|
||
_SetLineHeight(h) {
|
||
if (this._lineHeight === h)
|
||
return;
|
||
this._lineHeight = h;
|
||
this._spriteFontText.SetLineHeight(this._lineHeight);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_GetLineHeight() {
|
||
return this._lineHeight
|
||
}
|
||
_SetHAlign(h) {
|
||
if (this._horizontalAlign === h)
|
||
return;
|
||
this._horizontalAlign = h;
|
||
this._UpdateSettings();
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_GetHAlign() {
|
||
return this._horizontalAlign
|
||
}
|
||
_SetVAlign(v) {
|
||
if (this._verticalAlign === v)
|
||
return;
|
||
this._verticalAlign = v;
|
||
this._UpdateSettings();
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_GetVAlign() {
|
||
return this._verticalAlign
|
||
}
|
||
_SetWrapByWord(w) {
|
||
w = !!w;
|
||
if (this._wrapByWord === w)
|
||
return;
|
||
this._wrapByWord = w;
|
||
this._UpdateSettings();
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_IsWrapByWord() {
|
||
return this._wrapByWord
|
||
}
|
||
Tick() {
|
||
const wallTime = this._runtime.GetWallTime();
|
||
if (wallTime >= this._typewriterEndTime) {
|
||
this._CancelTypewriter();
|
||
this.Trigger(C3.Plugins.Spritefont2.Cnds.OnTypewriterTextFinished);
|
||
this._runtime.UpdateRender()
|
||
} else {
|
||
let displayLength = C3.relerp(this._typewriterStartTime, this._typewriterEndTime, wallTime, 0, this._typewriterLength);
|
||
displayLength = Math.floor(displayLength);
|
||
if (displayLength !== this._spriteFontText.GetDrawMaxCharacterCount()) {
|
||
this._spriteFontText.SetDrawMaxCharacterCount(displayLength);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
}
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "plugins.spritefont2";
|
||
return [{
|
||
title: prefix + ".name",
|
||
properties: [{
|
||
name: prefix + ".properties.text.name",
|
||
value: this._text,
|
||
onedit: v=>this._SetText(v)
|
||
}]
|
||
}]
|
||
}
|
||
GetScriptInterfaceClass() {
|
||
return self.ISpriteFontInstance
|
||
}
|
||
}
|
||
;
|
||
const map = new WeakMap;
|
||
const SCRIPT_HORIZONTAL_ALIGNMENTS = new Map([["left", 0], ["center", 1], ["right", 2]]);
|
||
const SCRIPT_VERTICAL_ALIGNMENTS = new Map([["top", 0], ["center", 1], ["bottom", 2]]);
|
||
const SCRIPT_WRAP_MODES = new Map([["word", true], ["character", false]]);
|
||
self.ISpriteFontInstance = class ISpriteFontInstance extends self.IWorldInstance {
|
||
constructor() {
|
||
super();
|
||
map.set(this, self.IInstance._GetInitInst().GetSdkInstance())
|
||
}
|
||
get text() {
|
||
return map.get(this).GetText()
|
||
}
|
||
set text(str) {
|
||
const inst = map.get(this);
|
||
inst._CancelTypewriter();
|
||
inst._SetText(str)
|
||
}
|
||
typewriterText(str, duration) {
|
||
const inst = map.get(this);
|
||
inst._CancelTypewriter();
|
||
inst._StartTypewriter(str, duration)
|
||
}
|
||
typewriterFinish() {
|
||
map.get(this)._FinishTypewriter()
|
||
}
|
||
set characterScale(s) {
|
||
map.get(this)._SetScale(s)
|
||
}
|
||
get characterScale() {
|
||
return map.get(this)._GetScale()
|
||
}
|
||
set characterSpacing(s) {
|
||
map.get(this)._SetCharacterSpacing(s)
|
||
}
|
||
get characterSpacing() {
|
||
return map.get(this)._GetCharacterSpacing()
|
||
}
|
||
set lineHeight(lho) {
|
||
map.get(this)._SetLineHeight(lho)
|
||
}
|
||
get lineHeight() {
|
||
return map.get(this)._GetLineHeight()
|
||
}
|
||
set horizontalAlign(str) {
|
||
const h = SCRIPT_HORIZONTAL_ALIGNMENTS.get(str);
|
||
if (typeof h === "undefined")
|
||
throw new Error("invalid mode");
|
||
map.get(this)._SetHAlign(h)
|
||
}
|
||
get horizontalAlign() {
|
||
return HORIZONTAL_ALIGNMENTS[map.get(this)._GetHAlign()]
|
||
}
|
||
set verticalAlign(str) {
|
||
const v = SCRIPT_VERTICAL_ALIGNMENTS.get(str);
|
||
if (typeof v === "undefined")
|
||
throw new Error("invalid mode");
|
||
map.get(this)._SetVAlign(v)
|
||
}
|
||
get verticalAlign() {
|
||
return VERTICAL_ALIGNMENTS[map.get(this)._GetVAlign()]
|
||
}
|
||
set wordWrapMode(str) {
|
||
const isWrapByWord = SCRIPT_WRAP_MODES.get(str);
|
||
if (typeof isWrapByWord === "undefined")
|
||
throw new Error("invalid mode");
|
||
map.get(this)._SetWrapByWord(isWrapByWord)
|
||
}
|
||
get wordWrapMode() {
|
||
return map.get(this)._IsWrapByWord() ? "word" : "character"
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Spritefont2.Cnds = {
|
||
CompareText(text, caseSensitive) {
|
||
if (caseSensitive)
|
||
return this._text === text;
|
||
else
|
||
return C3.equalsNoCase(this._text, text)
|
||
},
|
||
IsRunningTypewriterText() {
|
||
return this._typewriterEndTime !== -1
|
||
},
|
||
OnTypewriterTextFinished() {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Spritefont2.Acts = {
|
||
SetText(param) {
|
||
this._CancelTypewriter();
|
||
if (typeof param === "number" && param < 1E9)
|
||
param = Math.round(param * 1E10) / 1E10;
|
||
this._SetText(param.toString())
|
||
},
|
||
AppendText(param) {
|
||
this._CancelTypewriter();
|
||
if (typeof param === "number" && param < 1E9)
|
||
param = Math.round(param * 1E10) / 1E10;
|
||
param = param.toString();
|
||
if (!param)
|
||
return;
|
||
this._SetText(this._text + param)
|
||
},
|
||
TypewriterText(param, duration) {
|
||
this._CancelTypewriter();
|
||
if (typeof param === "number" && param < 1E9)
|
||
param = Math.round(param * 1E10) / 1E10;
|
||
this._StartTypewriter(param.toString(), duration)
|
||
},
|
||
TypewriterFinish() {
|
||
this._FinishTypewriter()
|
||
},
|
||
SetScale(s) {
|
||
this._SetScale(s)
|
||
},
|
||
SetCharacterSpacing(s) {
|
||
this._SetCharacterSpacing(s)
|
||
},
|
||
SetLineHeight(h) {
|
||
this._SetLineHeight(h)
|
||
},
|
||
SetCharacterWidth(chars, width) {
|
||
let didAnyChange = false;
|
||
const spriteFont = this._sdkType.GetSpriteFont();
|
||
for (const ch of chars)
|
||
if (ch === " ") {
|
||
spriteFont.SetSpaceWidth(width);
|
||
didAnyChange = true
|
||
} else {
|
||
const sfc = spriteFont.GetCharacter(ch);
|
||
if (sfc) {
|
||
sfc.SetDisplayWidth(width);
|
||
didAnyChange = true
|
||
}
|
||
}
|
||
if (didAnyChange)
|
||
spriteFont.SetCharacterWidthsChanged();
|
||
this._runtime.UpdateRender()
|
||
},
|
||
SetEffect(effect) {
|
||
this.GetWorldInfo().SetBlendMode(effect);
|
||
this._runtime.UpdateRender()
|
||
},
|
||
SetHAlign(h) {
|
||
this._SetHAlign(h)
|
||
},
|
||
SetVAlign(v) {
|
||
this._SetVAlign(v)
|
||
},
|
||
SetWrapping(w) {
|
||
this._SetWrapByWord(w === 0)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Spritefont2.Exps = {
|
||
CharacterWidth(ch) {
|
||
const sfc = this._sdkType.GetSpriteFont().GetCharacter(ch);
|
||
if (sfc)
|
||
return sfc.GetDisplayWidth();
|
||
else
|
||
return this._sdkType.GetSpriteFont().GetCharacterWidth()
|
||
},
|
||
CharacterHeight() {
|
||
return this._characterHeight
|
||
},
|
||
CharacterScale() {
|
||
return this._characterScale
|
||
},
|
||
CharacterSpacing() {
|
||
return this._characterSpacing
|
||
},
|
||
LineHeight() {
|
||
return this._lineHeight
|
||
},
|
||
Text() {
|
||
return this._text
|
||
},
|
||
PlainText() {
|
||
if (this._enableBBcode)
|
||
return C3.BBString.StripAnyTags(this._text);
|
||
else
|
||
return this._text
|
||
},
|
||
TextWidth() {
|
||
const wi = this.GetWorldInfo();
|
||
this._spriteFontText.SetSize(wi.GetWidth(), wi.GetHeight());
|
||
return this._spriteFontText.GetTextWidth()
|
||
},
|
||
TextHeight() {
|
||
const wi = this.GetWorldInfo();
|
||
this._spriteFontText.SetSize(wi.GetWidth(), wi.GetHeight());
|
||
return this._spriteFontText.GetTextHeight()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
self.SpriteFontCharacter = class SpriteFontCharacter {
|
||
constructor(spriteFont, char, x, y) {
|
||
let charWidth = spriteFont.GetCharacterWidth();
|
||
let charHeight = spriteFont.GetCharacterHeight();
|
||
this._spriteFont = spriteFont;
|
||
this._char = char;
|
||
this._pxRect = new C3.Rect(x,y,x + charWidth,y + charHeight);
|
||
this._texRect = new C3.Rect;
|
||
this._displayWidth = -1;
|
||
this._UpdateTexRect()
|
||
}
|
||
Release() {
|
||
this._spriteFont = null;
|
||
this._pxRect = null;
|
||
this._texRect = null
|
||
}
|
||
_UpdateTexRect() {
|
||
let w = this._spriteFont.GetWidth();
|
||
let h = this._spriteFont.GetHeight();
|
||
this._texRect.copy(this._pxRect);
|
||
this._texRect.divide(w, h);
|
||
this._texRect.lerpInto(this._spriteFont.GetTexRect())
|
||
}
|
||
GetSpriteFont() {
|
||
return this._spriteFont
|
||
}
|
||
GetChar() {
|
||
return this._char
|
||
}
|
||
GetTexRect() {
|
||
return this._texRect
|
||
}
|
||
SetDisplayWidth(w) {
|
||
this._displayWidth = w
|
||
}
|
||
GetDisplayWidth() {
|
||
if (this._displayWidth < 0)
|
||
return this._spriteFont.GetCharacterWidth();
|
||
else
|
||
return this._displayWidth
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const tmpRect = new C3.Rect;
|
||
const tmpQuad = new C3.Quad;
|
||
const tmpColor = new C3.Color;
|
||
const VALID_HORIZ_ALIGNMENTS = new Set(["left", "center", "right"]);
|
||
const VALID_VERT_ALIGNMENTS = new Set(["top", "center", "bottom"]);
|
||
const VALID_WORD_WRAP_MODES = new Set(["word", "character"]);
|
||
self.SpriteFontText = class SpriteFontText {
|
||
constructor(spriteFont) {
|
||
this._spriteFont = spriteFont;
|
||
this._cssWidth = 0;
|
||
this._cssHeight = 0;
|
||
this._text = "";
|
||
this._isBBcodeEnabled = false;
|
||
this._bbString = null;
|
||
this._wrappedText = C3.New(C3.WordWrap);
|
||
this._wrapMode = "word";
|
||
this._wrapChanged = false;
|
||
this._horizontalAlign = "left";
|
||
this._verticalAlign = "top";
|
||
this._scale = 1;
|
||
this._spacing = 0;
|
||
this._lineHeight = 0;
|
||
this._color = C3.New(C3.Color);
|
||
this._drawMaxCharCount = -1;
|
||
this._drawCharCount = 0;
|
||
this._measureTextCallback = (str,styles)=>this._MeasureText(str, styles);
|
||
this._spriteFont._AddSpriteFontText(this)
|
||
}
|
||
Release() {
|
||
this._spriteFont._RemoveSpriteFontText(this);
|
||
this._color = null;
|
||
this._measureTextCallback = null;
|
||
this._wrappedText.Clear();
|
||
this._wrappedText = null;
|
||
this._spriteFont = null;
|
||
this._bbString = null
|
||
}
|
||
_MeasureText(str, styles) {
|
||
const scaleStyle = this._GetStyleTag(styles, "scale");
|
||
const scale = scaleStyle ? parseFloat(scaleStyle.param) : this._scale;
|
||
const scaleXStyle = this._GetStyleTag(styles, "scalex");
|
||
const scaleX = (scaleXStyle ? parseFloat(scaleXStyle.param) : 1) * scale;
|
||
const scaleYStyle = this._GetStyleTag(styles, "scaley");
|
||
const scaleY = (scaleYStyle ? parseFloat(scaleYStyle.param) : 1) * scale;
|
||
const lineTotalHeight = this._spriteFont.GetCharacterHeight() * scaleY + this._lineHeight;
|
||
const spriteFont = this.GetSpriteFont();
|
||
const defaultCharWidth = spriteFont.GetCharacterWidth() * scaleX;
|
||
const spacing = this.GetSpacing();
|
||
if (spriteFont.HasAnyCustomWidths()) {
|
||
let strLen = 0;
|
||
let totalWidth = 0;
|
||
for (const ch of str) {
|
||
let charWidth = defaultCharWidth;
|
||
const sfc = spriteFont.GetCharacter(ch);
|
||
if (sfc)
|
||
charWidth = sfc.GetDisplayWidth() * scaleX;
|
||
else if (ch === " ")
|
||
charWidth = spriteFont.GetSpaceWidth() * scaleX;
|
||
totalWidth += charWidth;
|
||
++strLen
|
||
}
|
||
return {
|
||
width: totalWidth + strLen * spacing,
|
||
height: lineTotalHeight
|
||
}
|
||
} else {
|
||
const strLen = [...str].length;
|
||
const spaceCount = Math.max(strLen, 0);
|
||
return {
|
||
width: defaultCharWidth * strLen + spaceCount * spacing,
|
||
height: lineTotalHeight
|
||
}
|
||
}
|
||
}
|
||
_SetWrapChanged() {
|
||
this._wrapChanged = true;
|
||
this._wrappedText.Clear()
|
||
}
|
||
SetSize(cssWidth, cssHeight) {
|
||
if (cssWidth <= 0 || cssHeight <= 0)
|
||
return;
|
||
if (this._cssWidth === cssWidth && this._cssHeight === cssHeight)
|
||
return;
|
||
if (this._cssWidth !== cssWidth)
|
||
this._SetWrapChanged();
|
||
this._cssWidth = cssWidth;
|
||
this._cssHeight = cssHeight
|
||
}
|
||
SetDrawMaxCharacterCount(n) {
|
||
this._drawMaxCharCount = Math.floor(n)
|
||
}
|
||
GetDrawMaxCharacterCount() {
|
||
return this._drawMaxCharCount
|
||
}
|
||
_GetStyleTag(styles, tag) {
|
||
for (let i = styles.length - 1; i >= 0; --i) {
|
||
const s = styles[i];
|
||
if (s.tag === tag)
|
||
return s
|
||
}
|
||
return null
|
||
}
|
||
_HasStyleTag(styles, tag) {
|
||
return !!this._GetStyleTag(styles, tag)
|
||
}
|
||
_MaybeWrapText() {
|
||
if (!this._wrapChanged)
|
||
return;
|
||
if (this._isBBcodeEnabled && (!this._bbString || this._bbString.toString() !== this._text))
|
||
this._bbString = new C3.BBString(this._text,{
|
||
noEscape: true
|
||
});
|
||
const endOfLineMargin = -this.GetSpacing();
|
||
this._wrappedText.WordWrap(this._isBBcodeEnabled ? this._bbString.toFragmentList() : this._text, this._measureTextCallback, this._cssWidth, this._wrapMode, endOfLineMargin);
|
||
this._wrapChanged = false
|
||
}
|
||
Draw(renderer, offX, offY, angle) {
|
||
this._MaybeWrapText();
|
||
this._drawCharCount = 0;
|
||
let penY = 0;
|
||
const lineSpaceHeight = this._lineHeight;
|
||
const lines = C3.cloneArray(this._wrappedText.GetLines());
|
||
const sin_a = Math.sin(angle);
|
||
const cos_a = Math.cos(angle);
|
||
const linesTotalHeight = lines.reduce((a,v)=>a + v.height, 0) - lineSpaceHeight;
|
||
if (this._verticalAlign === "center")
|
||
penY = Math.max(Math.floor(this._cssHeight / 2 - linesTotalHeight / 2), 0);
|
||
else if (this._verticalAlign === "bottom")
|
||
penY = Math.floor(this._cssHeight - linesTotalHeight);
|
||
for (let i = 0, len = lines.length; i < len; ++i) {
|
||
const line = lines[i];
|
||
const curLineTextHeight = line.height;
|
||
if (i > 0 && penY > this._cssHeight - (curLineTextHeight - lineSpaceHeight))
|
||
break;
|
||
if (penY >= 0)
|
||
this._DrawLine(renderer, line, offX, offY, penY, sin_a, cos_a);
|
||
penY += curLineTextHeight
|
||
}
|
||
}
|
||
_DrawLine(renderer, line, offX, offY, penY, sin_a, cos_a) {
|
||
const lineHeight = line.height;
|
||
let penX = 0;
|
||
if (this._horizontalAlign === "center")
|
||
penX = Math.max(Math.floor((this._cssWidth - line.width) / 2), 0);
|
||
else if (this._horizontalAlign === "right")
|
||
penX = Math.max(Math.floor(this._cssWidth - line.width), 0);
|
||
for (const frag of line.fragments) {
|
||
this._DrawFragment(renderer, frag, offX, offY, penX, penY, sin_a, cos_a, lineHeight);
|
||
penX += frag.width
|
||
}
|
||
}
|
||
_DrawFragment(renderer, frag, offX, offY, penX, penY, sin_a, cos_a, lineHeight) {
|
||
let text = frag.text;
|
||
let fragWidth = frag.width;
|
||
const styles = frag.styles;
|
||
if (this._drawMaxCharCount !== -1) {
|
||
if (this._drawCharCount >= this._drawMaxCharCount)
|
||
return;
|
||
if (this._drawCharCount + text.length > this._drawMaxCharCount) {
|
||
text = text.substr(0, this._drawMaxCharCount - this._drawCharCount);
|
||
fragWidth = this._MeasureText(text, styles).width
|
||
}
|
||
this._drawCharCount += text.length
|
||
}
|
||
const backgroundStyle = this._GetStyleTag(styles, "background");
|
||
if (C3.IsStringAllWhitespace(text) && !backgroundStyle || this._HasStyleTag(styles, "hide"))
|
||
return;
|
||
const scaleStyle = this._GetStyleTag(styles, "scale");
|
||
const scale = scaleStyle ? parseFloat(scaleStyle.param) : this._scale;
|
||
const scaleXStyle = this._GetStyleTag(styles, "scalex");
|
||
const scaleX = (scaleXStyle ? parseFloat(scaleXStyle.param) : 1) * scale;
|
||
const scaleYStyle = this._GetStyleTag(styles, "scaley");
|
||
const scaleY = (scaleYStyle ? parseFloat(scaleYStyle.param) : 1) * scale;
|
||
const charHeight = this._spriteFont.GetCharacterHeight() * scaleY;
|
||
const lineSpaceHeight = this._lineHeight;
|
||
penY += lineHeight - lineSpaceHeight - charHeight;
|
||
const offsetXStyle = this._GetStyleTag(styles, "offsetx");
|
||
penX += offsetXStyle ? parseFloat(offsetXStyle.param) : 0;
|
||
const offsetYStyle = this._GetStyleTag(styles, "offsety");
|
||
penY += offsetYStyle ? parseFloat(offsetYStyle.param) : 0;
|
||
if (backgroundStyle) {
|
||
renderer.SetColorFillMode();
|
||
tmpColor.parseString(backgroundStyle.param);
|
||
tmpColor.setA(1);
|
||
renderer.SetColor(tmpColor);
|
||
tmpRect.set(penX, penY, penX + fragWidth, penY + charHeight);
|
||
if (tmpRect.getRight() > this._cssWidth)
|
||
tmpRect.setRight(this._cssWidth);
|
||
tmpQuad.setFromRotatedRectPrecalc(tmpRect, sin_a, cos_a);
|
||
tmpQuad.offset(offX, offY);
|
||
renderer.Quad(tmpQuad);
|
||
renderer.SetTextureFillMode()
|
||
}
|
||
const colorStyle = this._GetStyleTag(styles, "color");
|
||
if (colorStyle) {
|
||
tmpColor.parseString(colorStyle.param);
|
||
tmpColor.setA(this._color.getA())
|
||
} else
|
||
tmpColor.copy(this._color);
|
||
const opacityStyle = this._GetStyleTag(styles, "opacity");
|
||
if (opacityStyle)
|
||
tmpColor.setA(tmpColor.getA() * parseFloat(opacityStyle.param) / 100);
|
||
tmpColor.premultiply();
|
||
renderer.SetColor(tmpColor);
|
||
const drawCharWidth = this._spriteFont.GetCharacterWidth() * scaleX;
|
||
const endOfLineMargin = Math.abs(this.GetSpacing());
|
||
for (const ch of text) {
|
||
const sfc = this._spriteFont.GetCharacter(ch);
|
||
if (sfc) {
|
||
const layoutCharWidth = sfc.GetDisplayWidth() * scaleX;
|
||
if (penX + layoutCharWidth > this._cssWidth + endOfLineMargin + 1E-5)
|
||
return;
|
||
tmpRect.set(penX, penY, penX + drawCharWidth, penY + charHeight);
|
||
tmpQuad.setFromRotatedRectPrecalc(tmpRect, sin_a, cos_a);
|
||
tmpQuad.offset(offX, offY);
|
||
renderer.Quad3(tmpQuad, sfc.GetTexRect());
|
||
penX += layoutCharWidth + this._spacing
|
||
} else
|
||
penX += this._spriteFont.GetSpaceWidth() * scaleX + this._spacing
|
||
}
|
||
}
|
||
GetSpriteFont() {
|
||
return this._spriteFont
|
||
}
|
||
SetBBCodeEnabled(e) {
|
||
e = !!e;
|
||
if (this._isBBcodeEnabled === e)
|
||
return;
|
||
this._isBBcodeEnabled = e;
|
||
this._SetWrapChanged()
|
||
}
|
||
IsBBCodeEnabled() {
|
||
return this._isBBcodeEnabled
|
||
}
|
||
SetText(text) {
|
||
if (this._text === text)
|
||
return;
|
||
this._text = text;
|
||
this._SetWrapChanged()
|
||
}
|
||
SetWordWrapMode(w) {
|
||
if (!VALID_WORD_WRAP_MODES.has(w))
|
||
throw new Error("invalid word wrap mode");
|
||
if (this._wrapMode === w)
|
||
return;
|
||
this._wrapMode = w;
|
||
this._SetWrapChanged()
|
||
}
|
||
SetHorizontalAlign(a) {
|
||
if (!VALID_HORIZ_ALIGNMENTS.has(a))
|
||
throw new Error("invalid alignment");
|
||
this._horizontalAlign = a
|
||
}
|
||
SetVerticalAlign(a) {
|
||
if (!VALID_VERT_ALIGNMENTS.has(a))
|
||
throw new Error("invalid alignment");
|
||
this._verticalAlign = a
|
||
}
|
||
SetScale(s) {
|
||
if (this._scale === s)
|
||
return;
|
||
this._scale = s;
|
||
this._SetWrapChanged()
|
||
}
|
||
GetScale() {
|
||
return this._scale
|
||
}
|
||
SetSpacing(s) {
|
||
if (this._spacing === s)
|
||
return;
|
||
this._spacing = s;
|
||
this._SetWrapChanged()
|
||
}
|
||
GetSpacing() {
|
||
return this._spacing
|
||
}
|
||
SetLineHeight(h) {
|
||
this._lineHeight = h;
|
||
this._SetWrapChanged()
|
||
}
|
||
GetLineHeight() {
|
||
return this._lineHeight
|
||
}
|
||
SetOpacity(o) {
|
||
o = C3.clamp(o, 0, 1);
|
||
this._color.a = o
|
||
}
|
||
SetColor(c) {
|
||
if (this._color.equals(c))
|
||
return;
|
||
this._color.copy(c)
|
||
}
|
||
GetColor() {
|
||
return this._color
|
||
}
|
||
GetTextWidth() {
|
||
this._MaybeWrapText();
|
||
return this._wrappedText.GetMaxLineWidth()
|
||
}
|
||
GetTextHeight() {
|
||
this._MaybeWrapText();
|
||
const lineTextHeight = this._spriteFont.GetCharacterHeight() * this._scale;
|
||
const lineSpaceHeight = this._lineHeight;
|
||
const lineTotalHeight = lineTextHeight + lineSpaceHeight;
|
||
return this._wrappedText.GetLineCount() * lineTotalHeight - lineSpaceHeight
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const SpriteFontText = self.SpriteFontText;
|
||
const DEFAULT_SPRITEFONT_OPTS = {
|
||
width: 256,
|
||
height: 256,
|
||
characterWidth: 16,
|
||
characterHeight: 16,
|
||
characterSet: ""
|
||
};
|
||
self.SpriteFont = class SpriteFont {
|
||
constructor(opts) {
|
||
opts = Object.assign({}, DEFAULT_SPRITEFONT_OPTS, opts);
|
||
if (opts.width <= 0 || opts.height <= 0 || opts.characterWidth <= 0 || opts.characterHeight <= 0)
|
||
throw new Error("invalid size");
|
||
this._width = opts.width;
|
||
this._height = opts.height;
|
||
this._characterWidth = opts.characterWidth;
|
||
this._characterHeight = opts.characterHeight;
|
||
this._characterSet = opts.characterSet;
|
||
this._spacingData = "";
|
||
this._spacingParsed = null;
|
||
this._hasAnyCustomWidths = false;
|
||
this._spaceWidth = -1;
|
||
this._texRect = new C3.Rect(0,0,1,1);
|
||
this._characterMap = new Map;
|
||
this._mapChanged = true;
|
||
this._allTexts = new Set
|
||
}
|
||
Release() {
|
||
this._texRect = null;
|
||
this._ReleaseCharacters();
|
||
this._characterMap = null;
|
||
if (this._allTexts)
|
||
this._allTexts.clear();
|
||
this._allTexts = null
|
||
}
|
||
_ReleaseCharacters() {
|
||
for (let c of this._characterMap.values())
|
||
c.Release();
|
||
this._characterMap.clear()
|
||
}
|
||
_AddSpriteFontText(sft) {
|
||
this._allTexts.add(sft)
|
||
}
|
||
_RemoveSpriteFontText(sft) {
|
||
this._allTexts.delete(sft)
|
||
}
|
||
UpdateCharacterMap() {
|
||
if (!this._mapChanged)
|
||
return;
|
||
this._ReleaseCharacters();
|
||
let charSetArr = [...this._characterSet];
|
||
let cols = Math.floor(this._width / this._characterWidth);
|
||
let rows = Math.floor(this._height / this._characterHeight);
|
||
let last = cols * rows;
|
||
for (let i = 0, len = charSetArr.length; i < len; ++i) {
|
||
if (i >= last)
|
||
break;
|
||
let x = i % cols;
|
||
let y = Math.floor(i / cols);
|
||
let char = charSetArr[i];
|
||
this._characterMap.set(char, C3.New(self.SpriteFontCharacter, this, char, x * this._characterWidth, y * this._characterHeight))
|
||
}
|
||
this._hasAnyCustomWidths = false;
|
||
this._spaceWidth = -1;
|
||
if (Array.isArray(this._spacingParsed))
|
||
for (let entry of this._spacingParsed) {
|
||
if (!Array.isArray(entry))
|
||
continue;
|
||
if (entry.length !== 2)
|
||
continue;
|
||
let charWidth = entry[0];
|
||
let str = entry[1];
|
||
if (typeof charWidth !== "number" || !isFinite(charWidth) || typeof str !== "string")
|
||
continue;
|
||
if (charWidth === this._characterWidth)
|
||
continue;
|
||
for (let ch of str) {
|
||
let sfc = this._characterMap.get(ch);
|
||
if (sfc) {
|
||
sfc.SetDisplayWidth(charWidth);
|
||
this._hasAnyCustomWidths = true
|
||
} else if (ch === " ") {
|
||
this._spaceWidth = charWidth;
|
||
this._hasAnyCustomWidths = true
|
||
}
|
||
}
|
||
}
|
||
this._mapChanged = false;
|
||
for (let sft of this._allTexts)
|
||
sft._SetWrapChanged()
|
||
}
|
||
SetCharacterWidthsChanged() {
|
||
this._hasAnyCustomWidths = true;
|
||
for (const sft of this._allTexts)
|
||
sft._SetWrapChanged()
|
||
}
|
||
GetCharacter(ch) {
|
||
this.UpdateCharacterMap();
|
||
return this._characterMap.get(ch) || null
|
||
}
|
||
HasAnyCustomWidths() {
|
||
return this._hasAnyCustomWidths
|
||
}
|
||
SetWidth(w) {
|
||
w = Math.floor(w);
|
||
if (w <= 0)
|
||
throw new Error("invalid size");
|
||
if (this._width === w)
|
||
return;
|
||
this._width = w;
|
||
this._mapChanged = true
|
||
}
|
||
GetWidth() {
|
||
return this._width
|
||
}
|
||
SetHeight(h) {
|
||
h = Math.floor(h);
|
||
if (h <= 0)
|
||
throw new Error("invalid size");
|
||
if (this._height === h)
|
||
return;
|
||
this._height = h;
|
||
this._mapChanged = true
|
||
}
|
||
GetHeight() {
|
||
return this._height
|
||
}
|
||
SetTexRect(rc) {
|
||
if (this._texRect.equals(rc))
|
||
return;
|
||
this._texRect.copy(rc);
|
||
for (const sfc of this._characterMap.values())
|
||
sfc._UpdateTexRect()
|
||
}
|
||
GetTexRect() {
|
||
return this._texRect
|
||
}
|
||
SetCharacterWidth(w) {
|
||
w = Math.floor(w);
|
||
if (w <= 0)
|
||
throw new Error("invalid size");
|
||
if (this._characterWidth === w)
|
||
return;
|
||
this._characterWidth = w;
|
||
this._mapChanged = true
|
||
}
|
||
GetCharacterWidth() {
|
||
return this._characterWidth
|
||
}
|
||
SetCharacterHeight(h) {
|
||
h = Math.floor(h);
|
||
if (h <= 0)
|
||
throw new Error("invalid size");
|
||
if (this._characterHeight === h)
|
||
return;
|
||
this._characterHeight = h;
|
||
this._mapChanged = true
|
||
}
|
||
GetCharacterHeight() {
|
||
return this._characterHeight
|
||
}
|
||
SetCharacterSet(s) {
|
||
if (this._characterSet === s)
|
||
return;
|
||
this._characterSet = s;
|
||
this._mapChanged = true
|
||
}
|
||
GetCharacterSet() {
|
||
return this._characterSet
|
||
}
|
||
SetSpacingData(s) {
|
||
if (this._spacingData === s)
|
||
return;
|
||
this._spacingData = s;
|
||
this._mapChanged = true;
|
||
this._spacingParsed = null;
|
||
if (this._spacingData.length)
|
||
try {
|
||
this._spacingParsed = JSON.parse(this._spacingData)
|
||
} catch (e) {
|
||
this._spacingParsed = null
|
||
}
|
||
}
|
||
GetSpacingData() {
|
||
return this._spacingData
|
||
}
|
||
SetSpaceWidth(w) {
|
||
if (w < 0)
|
||
w = -1;
|
||
if (this._spaceWidth === w)
|
||
return;
|
||
this._spaceWidth = w;
|
||
if (this._spaceWidth >= 0)
|
||
this._hasAnyCustomWidths = true
|
||
}
|
||
GetSpaceWidth() {
|
||
if (this._spaceWidth < 0)
|
||
return this._characterWidth;
|
||
else
|
||
return this._spaceWidth
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Sprite = class SpritePlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Sprite.Type = class SpriteType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass);
|
||
this._animations = objectClass.GetAnimations()
|
||
}
|
||
Release() {
|
||
C3.clearArray(this._animations);
|
||
super.Release()
|
||
}
|
||
OnCreate() {
|
||
for (const a of this._animations)
|
||
a.LoadAllAssets(this._runtime)
|
||
}
|
||
LoadTextures(renderer) {
|
||
const opts = {
|
||
sampling: this._runtime.GetSampling()
|
||
};
|
||
return Promise.all(this._animations.map(a=>a.LoadAllTextures(renderer, opts)))
|
||
}
|
||
ReleaseTextures() {
|
||
for (const a of this._animations)
|
||
a.ReleaseAllTextures()
|
||
}
|
||
OnDynamicTextureLoadComplete() {
|
||
this._UpdateAllCurrentTexture()
|
||
}
|
||
_UpdateAllCurrentTexture() {
|
||
for (const inst of this._objectClass.instancesIncludingPendingCreate())
|
||
inst.GetSdkInstance()._UpdateCurrentTexture()
|
||
}
|
||
FinishCondition(doPick) {
|
||
C3.Plugins.Sprite._FinishCondition(this, doPick)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const INITIALLY_VISIBLE = 0;
|
||
const INITIAL_ANIMATION = 1;
|
||
const INITIAL_FRAME = 2;
|
||
const ENABLE_COLLISIONS = 3;
|
||
const tempRect = C3.New(C3.Rect);
|
||
const tempQuad = C3.New(C3.Quad);
|
||
const tempVec2 = C3.New(C3.Vector2);
|
||
const FLAG_PLAYING_FORWARDS = 1 << 0;
|
||
const FLAG_ANIMATION_PLAYING = 1 << 1;
|
||
const FLAG_ANIMATION_TRIGGER = 1 << 2;
|
||
C3.Plugins.Sprite.Instance = class SpriteInstance extends C3.SDKWorldInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
let initiallyVisible = true;
|
||
let initialAnimation = "";
|
||
let initialFrame = 0;
|
||
let collisionEnabled = true;
|
||
if (properties) {
|
||
initiallyVisible = !!properties[INITIALLY_VISIBLE];
|
||
initialAnimation = properties[INITIAL_ANIMATION];
|
||
initialFrame = properties[INITIAL_FRAME];
|
||
collisionEnabled = properties[ENABLE_COLLISIONS]
|
||
}
|
||
this._currentAnimation = this._objectClass.GetAnimationByName(initialAnimation) || this._objectClass.GetAnimations()[0];
|
||
this._currentFrameIndex = C3.clamp(initialFrame, 0, this._currentAnimation.GetFrameCount() - 1);
|
||
this._currentAnimationFrame = this._currentAnimation.GetFrameAt(this._currentFrameIndex);
|
||
const initialImageInfo = this._currentAnimationFrame.GetImageInfo();
|
||
this._currentTexture = initialImageInfo.GetTexture();
|
||
this._currentRcTex = initialImageInfo.GetTexRect();
|
||
this.HandleWebGLContextLoss();
|
||
inst.SetFlag(FLAG_ANIMATION_PLAYING, true);
|
||
inst.SetFlag(FLAG_PLAYING_FORWARDS, this._currentAnimation.GetSpeed() >= 0);
|
||
this._currentAnimationSpeed = Math.abs(this._currentAnimation.GetSpeed());
|
||
this._currentAnimationRepeatTo = this._currentAnimation.GetRepeatTo();
|
||
this._animationTimer = C3.New(C3.KahanSum);
|
||
this._frameStartTime = 0;
|
||
this._animationRepeats = 0;
|
||
this._animTriggerName = "";
|
||
this._changeAnimFrameIndex = -1;
|
||
this._changeAnimationName = "";
|
||
this._changeAnimationFrom = 0;
|
||
const wi = this.GetWorldInfo();
|
||
this._bquadRef = wi.GetBoundingQuad();
|
||
wi.SetVisible(initiallyVisible);
|
||
wi.SetCollisionEnabled(collisionEnabled);
|
||
wi.SetOriginX(this._currentAnimationFrame.GetOriginX());
|
||
wi.SetOriginY(this._currentAnimationFrame.GetOriginY());
|
||
wi.SetSourceCollisionPoly(this._currentAnimationFrame.GetCollisionPoly());
|
||
wi.SetBboxChanged();
|
||
if ((this._objectClass.GetAnimationCount() !== 1 || this._objectClass.GetAnimations()[0].GetFrameCount() !== 1) && this._currentAnimationSpeed !== 0)
|
||
this._StartTicking()
|
||
}
|
||
Release() {
|
||
this._currentAnimation = null;
|
||
this._currentAnimationFrame = null;
|
||
this._currentTexture = null;
|
||
this._animationTimer = null;
|
||
super.Release()
|
||
}
|
||
GetCurrentImageInfo() {
|
||
return this._currentAnimationFrame.GetImageInfo()
|
||
}
|
||
OnWebGLContextLost() {
|
||
this._currentTexture = null
|
||
}
|
||
OnWebGLContextRestored() {
|
||
this._UpdateCurrentTexture()
|
||
}
|
||
Draw(renderer) {
|
||
const texture = this._currentTexture;
|
||
if (texture === null)
|
||
return;
|
||
renderer.SetTexture(texture);
|
||
const wi = this.GetWorldInfo();
|
||
if (wi.HasMesh())
|
||
this._DrawMesh(wi, renderer);
|
||
else
|
||
this._DrawStandard(wi, renderer)
|
||
}
|
||
_DrawStandard(wi, renderer) {
|
||
let quad = this._bquadRef;
|
||
if (this._runtime.IsPixelRoundingEnabled())
|
||
quad = wi.PixelRoundQuad(quad);
|
||
renderer.Quad3(quad, this._currentRcTex)
|
||
}
|
||
_DrawMesh(wi, renderer) {
|
||
const transformedMesh = wi.GetTransformedMesh();
|
||
if (wi.IsMeshChanged()) {
|
||
wi.CalculateBbox(tempRect, tempQuad, false);
|
||
let quad = tempQuad;
|
||
if (this._runtime.IsPixelRoundingEnabled())
|
||
quad = wi.PixelRoundQuad(quad);
|
||
transformedMesh.CalculateTransformedMesh(wi.GetSourceMesh(), quad, this._currentRcTex);
|
||
wi.SetMeshChanged(false)
|
||
}
|
||
transformedMesh.Draw(renderer)
|
||
}
|
||
GetAnimationTime() {
|
||
return this._animationTimer.Get()
|
||
}
|
||
IsAnimationPlaying() {
|
||
return this._inst.GetFlag(FLAG_ANIMATION_PLAYING)
|
||
}
|
||
SetAnimationPlaying(e) {
|
||
this._inst.SetFlag(FLAG_ANIMATION_PLAYING, e)
|
||
}
|
||
IsPlayingForwards() {
|
||
return this._inst.GetFlag(FLAG_PLAYING_FORWARDS)
|
||
}
|
||
SetPlayingForwards(e) {
|
||
this._inst.SetFlag(FLAG_PLAYING_FORWARDS, e)
|
||
}
|
||
IsInAnimationTrigger() {
|
||
return this._inst.GetFlag(FLAG_ANIMATION_TRIGGER)
|
||
}
|
||
SetInAnimationTrigger(e) {
|
||
this._inst.SetFlag(FLAG_ANIMATION_TRIGGER, e)
|
||
}
|
||
Tick() {
|
||
if (this._changeAnimationName)
|
||
this._DoChangeAnimation();
|
||
if (this._changeAnimFrameIndex >= 0)
|
||
this._DoChangeAnimFrame();
|
||
const currentAnimationSpeed = this._currentAnimationSpeed;
|
||
if (!this.IsAnimationPlaying() || currentAnimationSpeed === 0) {
|
||
this._StopTicking();
|
||
return
|
||
}
|
||
const dt = this._runtime.GetDt(this._inst);
|
||
this._animationTimer.Add(dt);
|
||
const now = this.GetAnimationTime();
|
||
const prevFrame = this._currentAnimationFrame;
|
||
const currentFrameTime = prevFrame.GetDuration() / currentAnimationSpeed;
|
||
if (now < this._frameStartTime + currentFrameTime)
|
||
return;
|
||
const currentAnimation = this._currentAnimation;
|
||
const repeatTo = this._currentAnimationRepeatTo;
|
||
const frameCount = currentAnimation.GetFrameCount();
|
||
const repeatCount = currentAnimation.GetRepeatCount();
|
||
const isLooping = currentAnimation.IsLooping();
|
||
const isPingPong = currentAnimation.IsPingPong();
|
||
if (this.IsPlayingForwards())
|
||
this._currentFrameIndex++;
|
||
else
|
||
this._currentFrameIndex--;
|
||
this._frameStartTime += currentFrameTime;
|
||
if (this._currentFrameIndex >= frameCount)
|
||
if (isPingPong) {
|
||
this.SetPlayingForwards(false);
|
||
this._currentFrameIndex = frameCount - 2
|
||
} else if (isLooping)
|
||
this._currentFrameIndex = repeatTo;
|
||
else {
|
||
this._animationRepeats++;
|
||
if (this._animationRepeats >= repeatCount)
|
||
this._FinishAnimation(false);
|
||
else
|
||
this._currentFrameIndex = repeatTo
|
||
}
|
||
if (this._currentFrameIndex < 0)
|
||
if (isPingPong) {
|
||
this._currentFrameIndex = 1;
|
||
this.SetPlayingForwards(true);
|
||
if (!isLooping) {
|
||
this._animationRepeats++;
|
||
if (this._animationRepeats >= repeatCount)
|
||
this._FinishAnimation(true)
|
||
}
|
||
} else if (isLooping)
|
||
this._currentFrameIndex = repeatTo;
|
||
else {
|
||
this._animationRepeats++;
|
||
if (this._animationRepeats >= repeatCount)
|
||
this._FinishAnimation(true);
|
||
else
|
||
this._currentFrameIndex = repeatTo
|
||
}
|
||
this._currentFrameIndex = C3.clamp(this._currentFrameIndex, 0, frameCount - 1);
|
||
const nextFrame = currentAnimation.GetFrameAt(this._currentFrameIndex);
|
||
if (now > this._frameStartTime + nextFrame.GetDuration() / currentAnimationSpeed)
|
||
this._frameStartTime = now;
|
||
this._OnFrameChanged(prevFrame, nextFrame)
|
||
}
|
||
_FinishAnimation(reverse) {
|
||
this._currentFrameIndex = reverse ? 0 : this._currentAnimation.GetFrameCount() - 1;
|
||
this.SetAnimationPlaying(false);
|
||
this._animTriggerName = this._currentAnimation.GetName();
|
||
this.SetInAnimationTrigger(true);
|
||
this.Trigger(C3.Plugins.Sprite.Cnds.OnAnyAnimFinished);
|
||
this.Trigger(C3.Plugins.Sprite.Cnds.OnAnimFinished);
|
||
this.SetInAnimationTrigger(false);
|
||
this._animationRepeats = 0
|
||
}
|
||
_OnFrameChanged(prevFrame, nextFrame) {
|
||
if (prevFrame === nextFrame)
|
||
return;
|
||
const wi = this.GetWorldInfo();
|
||
const prevImage = prevFrame.GetImageInfo();
|
||
const nextImage = nextFrame.GetImageInfo();
|
||
const oldW = prevImage.GetWidth();
|
||
const oldH = prevImage.GetHeight();
|
||
const newW = nextImage.GetWidth();
|
||
const newH = nextImage.GetHeight();
|
||
if (oldW !== newW)
|
||
wi.SetWidth(wi.GetWidth() * (newW / oldW));
|
||
if (oldH !== newH)
|
||
wi.SetHeight(wi.GetHeight() * (newH / oldH));
|
||
wi.SetOriginX(nextFrame.GetOriginX());
|
||
wi.SetOriginY(nextFrame.GetOriginY());
|
||
wi.SetSourceCollisionPoly(nextFrame.GetCollisionPoly());
|
||
wi.SetBboxChanged();
|
||
this._currentAnimationFrame = nextFrame;
|
||
this._currentTexture = nextImage.GetTexture();
|
||
this._currentRcTex = nextImage.GetTexRect();
|
||
const behaviorInstances = this.GetInstance().GetBehaviorInstances();
|
||
for (let i = 0, len = behaviorInstances.length; i < len; ++i)
|
||
behaviorInstances[i].OnSpriteFrameChanged(prevFrame, nextFrame);
|
||
this.Trigger(C3.Plugins.Sprite.Cnds.OnFrameChanged);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_StartAnim(from) {
|
||
this.SetAnimationPlaying(true);
|
||
this._frameStartTime = this.GetAnimationTime();
|
||
if (from === 1 && this._currentFrameIndex !== 0) {
|
||
this._changeAnimFrameIndex = 0;
|
||
if (!this.IsInAnimationTrigger())
|
||
this._DoChangeAnimFrame()
|
||
}
|
||
this._StartTicking()
|
||
}
|
||
_SetAnim(animName, from) {
|
||
this._changeAnimationName = animName;
|
||
this._changeAnimationFrom = from;
|
||
this._StartTicking();
|
||
if (!this.IsInAnimationTrigger())
|
||
this._DoChangeAnimation()
|
||
}
|
||
_GetCurrentAnimationName() {
|
||
if (this._changeAnimationName)
|
||
return this._changeAnimationName;
|
||
else
|
||
return this._currentAnimation.GetName()
|
||
}
|
||
_SetAnimFrame(frameNum) {
|
||
if (!isFinite(frameNum))
|
||
return;
|
||
this._changeAnimFrameIndex = frameNum;
|
||
if (!this.IsInAnimationTrigger())
|
||
this._DoChangeAnimFrame()
|
||
}
|
||
_GetAnimFrame() {
|
||
return this._currentFrameIndex
|
||
}
|
||
_SetAnimSpeed(s) {
|
||
this._currentAnimationSpeed = Math.abs(s);
|
||
this.SetPlayingForwards(s >= 0);
|
||
if (this._currentAnimationSpeed > 0)
|
||
this._StartTicking()
|
||
}
|
||
_GetAnimSpeed() {
|
||
return this.IsPlayingForwards() ? this._currentAnimationSpeed : -this._currentAnimationSpeed
|
||
}
|
||
_SetAnimRepeatToFrame(f) {
|
||
f = C3.clamp(Math.floor(f), 0, this._currentAnimation.GetFrameCount() - 1);
|
||
this._currentAnimationRepeatTo = f
|
||
}
|
||
_GetAnimRepeatToFrame() {
|
||
return this._currentAnimationRepeatTo
|
||
}
|
||
_DoChangeAnimation() {
|
||
const prevFrame = this._currentAnimationFrame;
|
||
const animation = this._objectClass.GetAnimationByName(this._changeAnimationName);
|
||
this._changeAnimationName = "";
|
||
if (!animation)
|
||
return;
|
||
if (animation === this._currentAnimation && this.IsAnimationPlaying())
|
||
return;
|
||
this._currentAnimation = animation;
|
||
this.SetPlayingForwards(animation.GetSpeed() >= 0);
|
||
this._currentAnimationSpeed = Math.abs(animation.GetSpeed());
|
||
this._currentAnimationRepeatTo = animation.GetRepeatTo();
|
||
this._currentFrameIndex = C3.clamp(this._currentFrameIndex, 0, this._currentAnimation.GetFrameCount() - 1);
|
||
if (this._changeAnimationFrom === 1)
|
||
this._currentFrameIndex = 0;
|
||
this.SetAnimationPlaying(true);
|
||
this._frameStartTime = this.GetAnimationTime();
|
||
const nextFrame = this._currentAnimation.GetFrameAt(this._currentFrameIndex);
|
||
this._OnFrameChanged(prevFrame, nextFrame)
|
||
}
|
||
_DoChangeAnimFrame() {
|
||
const prevFrame = this._currentAnimationFrame;
|
||
const prevFrameIndex = this._currentFrameIndex;
|
||
this._currentFrameIndex = C3.clamp(Math.floor(this._changeAnimFrameIndex), 0, this._currentAnimation.GetFrameCount() - 1);
|
||
this._changeAnimFrameIndex = -1;
|
||
if (prevFrameIndex === this._currentFrameIndex)
|
||
return;
|
||
const nextFrame = this._currentAnimation.GetFrameAt(this._currentFrameIndex);
|
||
this._OnFrameChanged(prevFrame, nextFrame);
|
||
this._frameStartTime = this.GetAnimationTime()
|
||
}
|
||
_UpdateCurrentTexture() {
|
||
const curImageInfo = this._currentAnimationFrame.GetImageInfo();
|
||
this._currentTexture = curImageInfo.GetTexture();
|
||
this._currentRcTex = curImageInfo.GetTexRect();
|
||
this.GetWorldInfo().SetMeshChanged(true)
|
||
}
|
||
GetImagePointCount() {
|
||
return this._currentAnimationFrame.GetImagePointCount()
|
||
}
|
||
GetImagePoint(nameOrIndex) {
|
||
const frame = this._currentAnimationFrame;
|
||
const wi = this.GetWorldInfo();
|
||
let ip = null;
|
||
if (typeof nameOrIndex === "string")
|
||
ip = frame.GetImagePointByName(nameOrIndex);
|
||
else if (typeof nameOrIndex === "number")
|
||
ip = frame.GetImagePointByIndex(nameOrIndex - 1);
|
||
else
|
||
throw new TypeError("expected string or number");
|
||
if (!ip)
|
||
return [wi.GetX(), wi.GetY()];
|
||
tempVec2.copy(ip.GetVec2());
|
||
if (wi.HasMesh()) {
|
||
const [tx,ty] = wi.GetSourceMesh().TransformPoint(tempVec2.getX(), tempVec2.getY());
|
||
tempVec2.set(tx, ty)
|
||
}
|
||
tempVec2.offset(-frame.GetOriginX(), -frame.GetOriginY());
|
||
tempVec2.scale(wi.GetWidth(), wi.GetHeight());
|
||
tempVec2.rotate(wi.GetAngle());
|
||
tempVec2.offset(wi.GetX(), wi.GetY());
|
||
return [tempVec2.getX(), tempVec2.getY()]
|
||
}
|
||
GetCollisionPolyPointCount() {
|
||
return this.GetWorldInfo().GetTransformedCollisionPoly().pointCount()
|
||
}
|
||
GetCollisionPolyPoint(index) {
|
||
index = Math.floor(index);
|
||
const wi = this.GetWorldInfo();
|
||
const poly = wi.GetTransformedCollisionPoly();
|
||
const pointCount = poly.pointCount();
|
||
if (index === pointCount)
|
||
index = 0;
|
||
if (index < 0 || index >= pointCount)
|
||
return [0, 0];
|
||
const pointsArr = poly.pointsArr();
|
||
return [pointsArr[index * 2 + 0] + wi.GetX(), pointsArr[index * 2 + 1] + wi.GetY()]
|
||
}
|
||
GetDebuggerProperties() {
|
||
const Acts = C3.Plugins.Sprite.Acts;
|
||
const prefix = "plugins.sprite.debugger.animation-properties";
|
||
return [{
|
||
title: prefix + ".title",
|
||
properties: [{
|
||
name: prefix + ".current-animation",
|
||
value: this._currentAnimation.GetName(),
|
||
onedit: v=>this.CallAction(Acts.SetAnim, v, 0)
|
||
}, {
|
||
name: prefix + ".current-frame",
|
||
value: this._currentFrameIndex,
|
||
onedit: v=>this.CallAction(Acts.SetAnimFrame, v)
|
||
}, {
|
||
name: prefix + ".is-playing",
|
||
value: this.IsAnimationPlaying(),
|
||
onedit: v=>v ? this.CallAction(Acts.StartAnim, 0) : this.CallAction(Acts.StopAnim)
|
||
}, {
|
||
name: prefix + ".speed",
|
||
value: this._currentAnimationSpeed,
|
||
onedit: v=>this.CallAction(Acts.SetAnimSpeed, v)
|
||
}, {
|
||
name: prefix + ".repeats",
|
||
value: this._animationRepeats,
|
||
onedit: v=>this._animationRepeats = v
|
||
}]
|
||
}]
|
||
}
|
||
SaveToJson() {
|
||
const o = {
|
||
"a": this._currentAnimation.GetSID()
|
||
};
|
||
if (this._frameStartTime !== 0)
|
||
o["fs"] = this._frameStartTime;
|
||
const animTime = this.GetAnimationTime();
|
||
if (animTime !== 0)
|
||
o["at"] = animTime;
|
||
if (this._currentFrameIndex !== 0)
|
||
o["f"] = this._currentFrameIndex;
|
||
if (this._currentAnimationSpeed !== 0)
|
||
o["cas"] = this._currentAnimationSpeed;
|
||
if (this._animationRepeats !== 1)
|
||
o["ar"] = this._animationRepeats;
|
||
if (this._currentAnimationRepeatTo !== 0)
|
||
o["rt"] = this._currentAnimationRepeatTo;
|
||
if (!this.IsAnimationPlaying())
|
||
o["ap"] = this.IsAnimationPlaying();
|
||
if (!this.IsPlayingForwards())
|
||
o["af"] = this.IsPlayingForwards();
|
||
const wi = this.GetWorldInfo();
|
||
if (wi.IsCollisionEnabled())
|
||
o["ce"] = wi.IsCollisionEnabled();
|
||
return o
|
||
}
|
||
LoadFromJson(o) {
|
||
const anim = this.GetObjectClass().GetAnimationBySID(o["a"]);
|
||
if (anim)
|
||
this._currentAnimation = anim;
|
||
this._frameStartTime = o.hasOwnProperty("fs") ? o["fs"] : 0;
|
||
this._animationTimer.Set(o.hasOwnProperty("at") ? o["at"] : 0);
|
||
const frameIndex = o.hasOwnProperty("f") ? o["f"] : 0;
|
||
this._currentFrameIndex = C3.clamp(frameIndex, 0, this._currentAnimation.GetFrameCount() - 1);
|
||
this._currentAnimationSpeed = o.hasOwnProperty("cas") ? o["cas"] : 0;
|
||
this._animationRepeats = o.hasOwnProperty("ar") ? o["ar"] : 1;
|
||
const repeatToIndex = o.hasOwnProperty("rt") ? o["rt"] : 0;
|
||
this._currentAnimationRepeatTo = C3.clamp(repeatToIndex, 0, this._currentAnimation.GetFrameCount() - 1);
|
||
this.SetAnimationPlaying(o.hasOwnProperty("ap") ? !!o["ap"] : true);
|
||
this.SetPlayingForwards(o.hasOwnProperty("af") ? !!o["af"] : true);
|
||
const nextFrame = this._currentAnimation.GetFrameAt(this._currentFrameIndex);
|
||
this._currentAnimationFrame = nextFrame;
|
||
this._UpdateCurrentTexture();
|
||
const wi = this.GetWorldInfo();
|
||
wi.SetOriginX(nextFrame.GetOriginX());
|
||
wi.SetOriginY(nextFrame.GetOriginY());
|
||
wi.SetSourceCollisionPoly(nextFrame.GetCollisionPoly());
|
||
wi.SetCollisionEnabled(!!o["ce"])
|
||
}
|
||
GetPropertyValueByIndex(index) {
|
||
const wi = this.GetWorldInfo();
|
||
switch (index) {
|
||
case ENABLE_COLLISIONS:
|
||
return wi.IsCollisionEnabled();
|
||
case INITIAL_FRAME:
|
||
return C3.clamp(this._currentFrameIndex, 0, this._currentAnimation.GetFrameCount() - 1)
|
||
}
|
||
}
|
||
SetPropertyValueByIndex(index, value) {
|
||
const wi = this.GetWorldInfo();
|
||
switch (index) {
|
||
case ENABLE_COLLISIONS:
|
||
wi.SetCollisionEnabled(!!value);
|
||
break;
|
||
case INITIAL_FRAME:
|
||
this.SetAnimationPlaying(false);
|
||
const totalFrames = this._currentAnimation.GetFrameCount() - 1;
|
||
const nextIndex = value = C3.clamp(value, 0, totalFrames);
|
||
const prevFrame = this._currentAnimation.GetFrameAt(this._currentFrameIndex);
|
||
const nextFrame = this._currentAnimation.GetFrameAt(nextIndex);
|
||
this._OnFrameChanged(prevFrame, nextFrame);
|
||
this._currentFrameIndex = C3.clamp(nextIndex, 0, totalFrames);
|
||
break
|
||
}
|
||
}
|
||
GetScriptInterfaceClass() {
|
||
return self.ISpriteInstance
|
||
}
|
||
}
|
||
;
|
||
const map = new WeakMap;
|
||
const ANIM_FROM_MODES = new Map([["current-frame", 0], ["beginning", 1]]);
|
||
self.ISpriteInstance = class ISpriteInstance extends self.IWorldInstance {
|
||
constructor() {
|
||
super();
|
||
map.set(this, self.IInstance._GetInitInst().GetSdkInstance())
|
||
}
|
||
getImagePointCount() {
|
||
return map.get(this).GetImagePointCount()
|
||
}
|
||
getImagePointX(nameOrIndex) {
|
||
if (typeof nameOrIndex !== "string" && typeof nameOrIndex !== "number")
|
||
throw new TypeError("expected string or number");
|
||
return map.get(this).GetImagePoint(nameOrIndex)[0]
|
||
}
|
||
getImagePointY(nameOrIndex) {
|
||
if (typeof nameOrIndex !== "string" && typeof nameOrIndex !== "number")
|
||
throw new TypeError("expected string or number");
|
||
return map.get(this).GetImagePoint(nameOrIndex)[1]
|
||
}
|
||
getImagePoint(nameOrIndex) {
|
||
if (typeof nameOrIndex !== "string" && typeof nameOrIndex !== "number")
|
||
throw new TypeError("expected string or number");
|
||
return map.get(this).GetImagePoint(nameOrIndex)
|
||
}
|
||
getPolyPointCount() {
|
||
return map.get(this).GetCollisionPolyPointCount()
|
||
}
|
||
getPolyPointX(index) {
|
||
return map.get(this).GetCollisionPolyPoint(index)[0]
|
||
}
|
||
getPolyPointY(index) {
|
||
return map.get(this).GetCollisionPolyPoint(index)[1]
|
||
}
|
||
getPolyPoint(index) {
|
||
return map.get(this).GetCollisionPolyPoint(index)
|
||
}
|
||
stopAnimation() {
|
||
map.get(this).SetAnimationPlaying(false)
|
||
}
|
||
startAnimation(from="current-frame") {
|
||
const f = ANIM_FROM_MODES.get(from);
|
||
if (typeof f === "undefined")
|
||
throw new Error("invalid mode");
|
||
map.get(this)._StartAnim(f)
|
||
}
|
||
setAnimation(name, from="beginning") {
|
||
const f = ANIM_FROM_MODES.get(from);
|
||
if (typeof f === "undefined")
|
||
throw new Error("invalid mode");
|
||
map.get(this)._SetAnim(name, f)
|
||
}
|
||
get animationName() {
|
||
return map.get(this)._GetCurrentAnimationName()
|
||
}
|
||
set animationFrame(frameIndex) {
|
||
map.get(this)._SetAnimFrame(frameIndex)
|
||
}
|
||
get animationFrame() {
|
||
return map.get(this)._GetAnimFrame()
|
||
}
|
||
set animationSpeed(s) {
|
||
map.get(this)._SetAnimSpeed(s)
|
||
}
|
||
get animationSpeed() {
|
||
return map.get(this)._GetAnimSpeed()
|
||
}
|
||
set animationRepeatToFrame(f) {
|
||
map.get(this)._SetAnimRepeatToFrame(f)
|
||
}
|
||
get animationRepeatToFrame() {
|
||
return map.get(this)._GetAnimRepeatToFrame()
|
||
}
|
||
get imageWidth() {
|
||
return map.get(this).GetCurrentImageInfo().GetWidth()
|
||
}
|
||
get imageHeight() {
|
||
return map.get(this).GetCurrentImageInfo().GetHeight()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const tempRect = C3.New(C3.Rect);
|
||
const tempCandidates1 = [];
|
||
const tempCandidates2 = [];
|
||
let needsCollisionFinish = false;
|
||
let rPickType = null;
|
||
let rPickFromElseInstances = false;
|
||
const rToPick = new Set;
|
||
function CollMemory_Add(collMemory, a, b, tickCount) {
|
||
const a_uid = a.GetUID();
|
||
const b_uid = b.GetUID();
|
||
if (a_uid < b_uid)
|
||
collMemory.Set(a, b, tickCount);
|
||
else
|
||
collMemory.Set(b, a, tickCount)
|
||
}
|
||
function CollMemory_Remove(collMemory, a, b) {
|
||
const a_uid = a.GetUID();
|
||
const b_uid = b.GetUID();
|
||
if (a_uid < b_uid)
|
||
collMemory.Delete(a, b);
|
||
else
|
||
collMemory.Delete(b, a)
|
||
}
|
||
function CollMemory_RemoveInstance(collMemory, inst) {
|
||
collMemory.DeleteEither(inst)
|
||
}
|
||
function CollMemory_Get(collMemory, a, b) {
|
||
const a_uid = a.GetUID();
|
||
const b_uid = b.GetUID();
|
||
if (a_uid < b_uid)
|
||
return collMemory.Get(a, b);
|
||
else
|
||
return collMemory.Get(b, a)
|
||
}
|
||
function DoOverlapCondition(sdkInst, rtype, offX, offY) {
|
||
if (!rtype)
|
||
return false;
|
||
const inst = sdkInst.GetInstance();
|
||
const hasOffset = offX !== 0 || offY !== 0;
|
||
const wi = inst.GetWorldInfo();
|
||
const runtime = inst.GetRuntime();
|
||
const collisionEngine = runtime.GetCollisionEngine();
|
||
const cnd = runtime.GetCurrentCondition();
|
||
const isOrBlock = cnd.GetEventBlock().IsOrBlock();
|
||
const ltype = cnd.GetObjectClass();
|
||
const isInverted = cnd.IsInverted();
|
||
const rsol = rtype.GetCurrentSol();
|
||
const isDifferentTypes = ltype !== rtype;
|
||
rPickType = rtype;
|
||
needsCollisionFinish = isDifferentTypes && !isInverted;
|
||
rPickFromElseInstances = false;
|
||
let rinstances;
|
||
let oldX = 0;
|
||
let oldY = 0;
|
||
let ret = false;
|
||
if (rsol.IsSelectAll()) {
|
||
tempRect.copy(wi.GetBoundingBox());
|
||
tempRect.offset(offX, offY);
|
||
collisionEngine.GetCollisionCandidates(wi.GetLayer(), rtype, tempRect, tempCandidates2);
|
||
rinstances = tempCandidates2
|
||
} else if (isOrBlock)
|
||
if (runtime.IsCurrentConditionFirst() && !rsol._GetOwnElseInstances().length && rsol._GetOwnInstances().length)
|
||
rinstances = rsol._GetOwnInstances();
|
||
else {
|
||
rinstances = rsol._GetOwnElseInstances();
|
||
rPickFromElseInstances = true
|
||
}
|
||
else
|
||
rinstances = rsol._GetOwnInstances();
|
||
if (hasOffset) {
|
||
oldX = wi.GetX();
|
||
oldY = wi.GetY();
|
||
wi.OffsetXY(offX, offY);
|
||
wi.SetBboxChanged()
|
||
}
|
||
for (const rinst of rinstances)
|
||
if (collisionEngine.TestOverlap(inst, rinst)) {
|
||
ret = true;
|
||
if (isInverted)
|
||
break;
|
||
if (isDifferentTypes)
|
||
rToPick.add(rinst)
|
||
}
|
||
if (hasOffset) {
|
||
wi.SetXY(oldX, oldY);
|
||
wi.SetBboxChanged()
|
||
}
|
||
C3.clearArray(tempCandidates2);
|
||
return ret
|
||
}
|
||
function FinishCollisionConditionPicking(type) {
|
||
const isOrBlock = type.GetRuntime().GetCurrentEvent().IsOrBlock();
|
||
const sol = rPickType.GetCurrentSol();
|
||
const solInstances = sol._GetOwnInstances();
|
||
const solElseInstances = sol._GetOwnElseInstances();
|
||
if (sol.IsSelectAll()) {
|
||
sol.SetSetPicked(rToPick);
|
||
if (isOrBlock) {
|
||
C3.clearArray(solElseInstances);
|
||
sol.AddElseInstances(rToPick, rPickType.GetInstances())
|
||
}
|
||
} else if (isOrBlock)
|
||
if (rPickFromElseInstances)
|
||
sol.TransferElseInstancesToOwn(rToPick);
|
||
else {
|
||
sol.AddElseInstances(rToPick, solInstances);
|
||
sol.SetSetPicked(rToPick)
|
||
}
|
||
else
|
||
sol.SetSetPicked(rToPick);
|
||
rPickType.ApplySolToContainer()
|
||
}
|
||
C3.Plugins.Sprite._FinishCondition = function(type, doPick) {
|
||
if (!needsCollisionFinish)
|
||
return;
|
||
if (doPick)
|
||
FinishCollisionConditionPicking(type);
|
||
rToPick.clear();
|
||
rPickType = null;
|
||
needsCollisionFinish = false
|
||
}
|
||
;
|
||
C3.Plugins.Sprite.Cnds = {
|
||
OnCollision(rtype) {
|
||
if (this._runtime.IsDebugging())
|
||
return C3.Plugins.Sprite.Cnds.DebugOnCollision.call(this, rtype);
|
||
if (!rtype)
|
||
return false;
|
||
const runtime = this._runtime;
|
||
const collisionEngine = runtime.GetCollisionEngine();
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const cnd = eventSheetManager.GetCurrentCondition();
|
||
const ltype = cnd.GetObjectClass();
|
||
const savedData = cnd.GetSavedDataMap();
|
||
const unsavedData = cnd.GetUnsavedDataMap();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const tickCount = runtime.GetTickCount();
|
||
const lastTickCount = tickCount - 1;
|
||
const currentEvent = oldFrame.GetCurrentEvent();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
let collMemory = savedData.get("collmemory");
|
||
if (!collMemory) {
|
||
collMemory = C3.New(C3.PairMap);
|
||
savedData.set("collmemory", collMemory)
|
||
}
|
||
if (!unsavedData.get("spriteCreatedDestroyCallback")) {
|
||
unsavedData.set("spriteCreatedDestroyCallback", true);
|
||
runtime.Dispatcher().addEventListener("instancedestroy", e=>CollMemory_RemoveInstance(collMemory, e.instance))
|
||
}
|
||
const lsol = ltype.GetCurrentSol();
|
||
const rsol = rtype.GetCurrentSol();
|
||
const linstances = lsol.GetInstances();
|
||
let rinstances = null;
|
||
for (let l = 0; l < linstances.length; ++l) {
|
||
const linst = linstances[l];
|
||
if (rsol.IsSelectAll()) {
|
||
collisionEngine.GetCollisionCandidates(linst.GetWorldInfo().GetLayer(), rtype, linst.GetWorldInfo().GetBoundingBox(), tempCandidates1);
|
||
rinstances = tempCandidates1;
|
||
collisionEngine.AddRegisteredCollisionCandidates(linst, rtype, rinstances)
|
||
} else
|
||
rinstances = rsol.GetInstances();
|
||
for (let r = 0; r < rinstances.length; ++r) {
|
||
const rinst = rinstances[r];
|
||
if (collisionEngine.TestOverlap(linst, rinst) || collisionEngine.CheckRegisteredCollision(linst, rinst)) {
|
||
const entry = CollMemory_Get(collMemory, linst, rinst);
|
||
let entryExists = false;
|
||
let lastCollTickCount = -2;
|
||
if (typeof entry === "number") {
|
||
entryExists = true;
|
||
lastCollTickCount = entry
|
||
}
|
||
const shouldRun = !entryExists || lastCollTickCount < lastTickCount;
|
||
CollMemory_Add(collMemory, linst, rinst, tickCount);
|
||
if (shouldRun) {
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
const curlsol = ltype.GetCurrentSol();
|
||
const currsol = rtype.GetCurrentSol();
|
||
curlsol._SetSelectAll(false);
|
||
currsol._SetSelectAll(false);
|
||
if (ltype === rtype) {
|
||
const solInstances = curlsol._GetOwnInstances();
|
||
C3.clearArray(solInstances);
|
||
solInstances.push(linst);
|
||
solInstances.push(rinst);
|
||
ltype.ApplySolToContainer()
|
||
} else {
|
||
const lsolInstances = curlsol._GetOwnInstances();
|
||
const rsolInstances = currsol._GetOwnInstances();
|
||
C3.clearArray(lsolInstances);
|
||
C3.clearArray(rsolInstances);
|
||
lsolInstances.push(linst);
|
||
rsolInstances.push(rinst);
|
||
ltype.ApplySolToContainer();
|
||
rtype.ApplySolToContainer()
|
||
}
|
||
currentEvent.Retrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
} else
|
||
CollMemory_Remove(collMemory, linst, rinst)
|
||
}
|
||
C3.clearArray(tempCandidates1)
|
||
}
|
||
eventStack.Pop();
|
||
return false
|
||
},
|
||
*DebugOnCollision(rtype) {
|
||
if (!rtype)
|
||
return false;
|
||
const runtime = this._runtime;
|
||
const collisionEngine = runtime.GetCollisionEngine();
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
const eventStack = eventSheetManager.GetEventStack();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const tickCount = runtime.GetTickCount();
|
||
const lastTickCount = tickCount - 1;
|
||
const currentEvent = oldFrame.GetCurrentEvent();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const cnd = eventSheetManager.GetCurrentCondition();
|
||
const ltype = cnd.GetObjectClass();
|
||
const savedData = cnd.GetSavedDataMap();
|
||
const unsavedData = cnd.GetUnsavedDataMap();
|
||
let collMemory = savedData.get("collmemory");
|
||
if (!collMemory) {
|
||
collMemory = C3.New(C3.PairMap);
|
||
savedData.set("collmemory", collMemory)
|
||
}
|
||
if (!unsavedData.get("spriteCreatedDestroyCallback")) {
|
||
unsavedData.set("spriteCreatedDestroyCallback", true);
|
||
runtime.Dispatcher().addEventListener("instancedestroy", e=>CollMemory_RemoveInstance(collMemory, e.instance))
|
||
}
|
||
const lsol = ltype.GetCurrentSol();
|
||
const rsol = rtype.GetCurrentSol();
|
||
const linstances = lsol.GetInstances();
|
||
let rinstances = null;
|
||
for (let l = 0; l < linstances.length; ++l) {
|
||
const linst = linstances[l];
|
||
if (rsol.IsSelectAll()) {
|
||
collisionEngine.GetCollisionCandidates(linst.GetWorldInfo().GetLayer(), rtype, linst.GetWorldInfo().GetBoundingBox(), tempCandidates1);
|
||
rinstances = tempCandidates1;
|
||
collisionEngine.AddRegisteredCollisionCandidates(linst, rtype, rinstances)
|
||
} else
|
||
rinstances = rsol.GetInstances();
|
||
for (let r = 0; r < rinstances.length; ++r) {
|
||
const rinst = rinstances[r];
|
||
if (collisionEngine.TestOverlap(linst, rinst) || collisionEngine.CheckRegisteredCollision(linst, rinst)) {
|
||
const entry = CollMemory_Get(collMemory, linst, rinst);
|
||
let entryExists = false;
|
||
let lastCollTickCount = -2;
|
||
if (typeof entry === "number") {
|
||
entryExists = true;
|
||
lastCollTickCount = entry
|
||
}
|
||
const shouldRun = !entryExists || lastCollTickCount < lastTickCount;
|
||
CollMemory_Add(collMemory, linst, rinst, tickCount);
|
||
if (shouldRun) {
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
const curlsol = ltype.GetCurrentSol();
|
||
const currsol = rtype.GetCurrentSol();
|
||
curlsol._SetSelectAll(false);
|
||
currsol._SetSelectAll(false);
|
||
if (ltype === rtype) {
|
||
const solInstances = curlsol._GetOwnInstances();
|
||
C3.clearArray(solInstances);
|
||
solInstances.push(linst);
|
||
solInstances.push(rinst);
|
||
ltype.ApplySolToContainer()
|
||
} else {
|
||
const lsolInstances = curlsol._GetOwnInstances();
|
||
const rsolInstances = currsol._GetOwnInstances();
|
||
C3.clearArray(lsolInstances);
|
||
C3.clearArray(rsolInstances);
|
||
lsolInstances.push(linst);
|
||
rsolInstances.push(rinst);
|
||
ltype.ApplySolToContainer();
|
||
rtype.ApplySolToContainer()
|
||
}
|
||
yield*currentEvent.DebugRetrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
} else
|
||
CollMemory_Remove(collMemory, linst, rinst)
|
||
}
|
||
C3.clearArray(tempCandidates1)
|
||
}
|
||
eventStack.Pop();
|
||
return false
|
||
},
|
||
IsOverlapping(rtype) {
|
||
return DoOverlapCondition(this, rtype, 0, 0)
|
||
},
|
||
IsOverlappingOffset(rtype, offX, offY) {
|
||
return DoOverlapCondition(this, rtype, offX, offY)
|
||
},
|
||
IsAnimPlaying(animName) {
|
||
return C3.equalsNoCase(this._GetCurrentAnimationName(), animName)
|
||
},
|
||
CompareFrame(cmp, frameNum) {
|
||
return C3.compare(this._currentFrameIndex, cmp, frameNum)
|
||
},
|
||
CompareAnimSpeed(cmp, x) {
|
||
return C3.compare(this._GetAnimSpeed(), cmp, x)
|
||
},
|
||
OnAnimFinished(animName) {
|
||
return C3.equalsNoCase(this._animTriggerName, animName)
|
||
},
|
||
OnAnyAnimFinished() {
|
||
return true
|
||
},
|
||
OnFrameChanged() {
|
||
return true
|
||
},
|
||
IsMirrored() {
|
||
return this.GetWorldInfo().GetWidth() < 0
|
||
},
|
||
IsFlipped() {
|
||
return this.GetWorldInfo().GetHeight() < 0
|
||
},
|
||
OnURLLoaded() {
|
||
return true
|
||
},
|
||
OnURLFailed() {
|
||
return true
|
||
},
|
||
IsCollisionEnabled() {
|
||
return this.GetWorldInfo().IsCollisionEnabled()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Sprite.Acts = {
|
||
Spawn(objectClass, layer, imgPt) {
|
||
if (!objectClass || !layer)
|
||
return;
|
||
const [imgPtX,imgPtY] = this.GetImagePoint(imgPt);
|
||
const inst = this._runtime.CreateInstance(objectClass, layer, imgPtX, imgPtY);
|
||
if (!inst)
|
||
return;
|
||
if (objectClass.GetPlugin().IsRotatable()) {
|
||
const instWi = inst.GetWorldInfo();
|
||
instWi.SetAngle(this.GetWorldInfo().GetAngle());
|
||
instWi.SetBboxChanged()
|
||
}
|
||
const eventSheetManager = this._runtime.GetEventSheetManager();
|
||
eventSheetManager.BlockFlushingInstances(true);
|
||
inst._TriggerOnCreated();
|
||
if (inst.IsInContainer())
|
||
for (const s of inst.siblings())
|
||
s._TriggerOnCreated();
|
||
eventSheetManager.BlockFlushingInstances(false);
|
||
const act = this._runtime.GetCurrentAction();
|
||
const actData = act.GetSavedDataMap();
|
||
let resetSol = false;
|
||
if (!actData.has("Spawn_LastExec") || actData.get("Spawn_LastExec") < this._runtime.GetExecCount()) {
|
||
resetSol = true;
|
||
actData.set("Spawn_LastExec", this._runtime.GetExecCount())
|
||
}
|
||
if (objectClass !== this.GetObjectClass()) {
|
||
const sol = objectClass.GetCurrentSol();
|
||
sol._SetSelectAll(false);
|
||
const solInstances = sol._GetOwnInstances();
|
||
if (resetSol) {
|
||
C3.clearArray(solInstances);
|
||
solInstances.push(inst)
|
||
} else
|
||
solInstances.push(inst);
|
||
if (inst.IsInContainer())
|
||
for (const s of inst.siblings()) {
|
||
const sol2 = s.GetObjectClass().GetCurrentSol();
|
||
if (resetSol)
|
||
sol2.SetSinglePicked(s);
|
||
else {
|
||
sol2._SetSelectAll(false);
|
||
sol2._PushInstance(s)
|
||
}
|
||
}
|
||
}
|
||
},
|
||
StopAnim() {
|
||
this.SetAnimationPlaying(false)
|
||
},
|
||
StartAnim(from) {
|
||
this._StartAnim(from)
|
||
},
|
||
SetAnim(animName, from) {
|
||
this._SetAnim(animName, from)
|
||
},
|
||
SetAnimFrame(frameNum) {
|
||
this._SetAnimFrame(frameNum)
|
||
},
|
||
SetAnimSpeed(s) {
|
||
this._SetAnimSpeed(s)
|
||
},
|
||
SetAnimRepeatToFrame(f) {
|
||
this._SetAnimRepeatToFrame(f)
|
||
},
|
||
SetMirrored(m) {
|
||
const wi = this.GetWorldInfo();
|
||
const oldW = wi.GetWidth();
|
||
const newW = Math.abs(oldW) * (m === 0 ? -1 : 1);
|
||
if (oldW === newW)
|
||
return;
|
||
wi.SetWidth(newW);
|
||
wi.SetBboxChanged()
|
||
},
|
||
SetFlipped(f) {
|
||
const wi = this.GetWorldInfo();
|
||
const oldH = wi.GetHeight();
|
||
const newH = Math.abs(oldH) * (f === 0 ? -1 : 1);
|
||
if (oldH === newH)
|
||
return;
|
||
wi.SetHeight(newH);
|
||
wi.SetBboxChanged()
|
||
},
|
||
SetScale(s) {
|
||
const frame = this._currentAnimationFrame;
|
||
const imageInfo = frame.GetImageInfo();
|
||
const wi = this.GetWorldInfo();
|
||
const mirrorFactor = wi.GetWidth() < 0 ? -1 : 1;
|
||
const flipFactor = wi.GetHeight() < 0 ? -1 : 1;
|
||
const newWidth = imageInfo.GetWidth() * s * mirrorFactor;
|
||
const newHeight = imageInfo.GetHeight() * s * flipFactor;
|
||
if (wi.GetWidth() !== newWidth || wi.GetHeight() !== newHeight) {
|
||
wi.SetSize(newWidth, newHeight);
|
||
wi.SetBboxChanged()
|
||
}
|
||
},
|
||
async LoadURL(url, resize, crossOrigin) {
|
||
const curAnimFrame = this._currentAnimationFrame;
|
||
const curImageInfo = curAnimFrame.GetImageInfo();
|
||
const wi = this.GetWorldInfo();
|
||
const runtime = this._runtime;
|
||
if (curImageInfo.GetURL() === url) {
|
||
if (resize === 0) {
|
||
wi.SetSize(curImageInfo.GetWidth(), curImageInfo.GetHeight());
|
||
wi.SetBboxChanged()
|
||
}
|
||
this.Trigger(C3.Plugins.Sprite.Cnds.OnURLLoaded);
|
||
return
|
||
}
|
||
const imageInfo = C3.New(C3.ImageInfo);
|
||
await imageInfo.LoadDynamicAsset(runtime, url);
|
||
if (!imageInfo.IsLoaded()) {
|
||
this.Trigger(C3.Plugins.Sprite.Cnds.OnURLFailed);
|
||
return
|
||
}
|
||
await imageInfo.LoadStaticTexture(runtime.GetWebGLRenderer(), {
|
||
sampling: this._runtime.GetSampling()
|
||
});
|
||
curImageInfo.ReplaceWith(imageInfo);
|
||
this._sdkType._UpdateAllCurrentTexture();
|
||
if (!this.WasReleased() && resize === 0) {
|
||
wi.SetSize(curImageInfo.GetWidth(), curImageInfo.GetHeight());
|
||
wi.SetBboxChanged()
|
||
}
|
||
runtime.UpdateRender();
|
||
if (!this.WasReleased())
|
||
await this.TriggerAsync(C3.Plugins.Sprite.Cnds.OnURLLoaded)
|
||
},
|
||
SetCollisions(e) {
|
||
this.GetWorldInfo().SetCollisionEnabled(e)
|
||
},
|
||
SetSolidCollisionFilter(mode, tags) {
|
||
this.GetWorldInfo().SetSolidCollisionFilter(mode === 0, tags)
|
||
},
|
||
SetEffect(effect) {
|
||
this.GetWorldInfo().SetBlendMode(effect);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Sprite.Exps = {
|
||
AnimationFrame() {
|
||
return this._currentFrameIndex
|
||
},
|
||
AnimationFrameCount() {
|
||
return this._currentAnimation.GetFrameCount()
|
||
},
|
||
AnimationName() {
|
||
return this._currentAnimation.GetName()
|
||
},
|
||
AnimationSpeed() {
|
||
return this._GetAnimSpeed()
|
||
},
|
||
OriginalAnimationSpeed() {
|
||
return this._currentAnimation.GetSpeed()
|
||
},
|
||
ImagePointX(imgpt) {
|
||
return this.GetImagePoint(imgpt)[0]
|
||
},
|
||
ImagePointY(imgpt) {
|
||
return this.GetImagePoint(imgpt)[1]
|
||
},
|
||
ImagePointCount() {
|
||
return this.GetImagePointCount()
|
||
},
|
||
ImageWidth() {
|
||
return this.GetCurrentImageInfo().GetWidth()
|
||
},
|
||
ImageHeight() {
|
||
return this.GetCurrentImageInfo().GetHeight()
|
||
},
|
||
PolyPointXAt(i) {
|
||
return this.GetCollisionPolyPoint(i)[0]
|
||
},
|
||
PolyPointYAt(i) {
|
||
return this.GetCollisionPolyPoint(i)[1]
|
||
},
|
||
PolyPointCount() {
|
||
return this.GetCollisionPolyPointCount()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.NinePatch = class NinePatchPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.NinePatch.Type = class NinePatchType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass);
|
||
this._textureSet = null;
|
||
this._drawable = null
|
||
}
|
||
Release() {
|
||
this.ReleaseTextures();
|
||
super.Release()
|
||
}
|
||
OnCreate() {
|
||
this.GetImageInfo().LoadAsset(this._runtime)
|
||
}
|
||
async LoadTextures(renderer) {
|
||
const imageInfo = this.GetImageInfo();
|
||
this._drawable = await imageInfo.ExtractImageToCanvas()
|
||
}
|
||
CreatePatch(lm, rm, tm, bm) {
|
||
if (this._textureSet || !this._drawable)
|
||
return;
|
||
this._textureSet = new self.NinePatchTextureSet(this);
|
||
this._textureSet.CreateTextures(this._drawable, lm, rm, tm, bm)
|
||
}
|
||
ReleaseTextures() {
|
||
if (this._textureSet) {
|
||
this._textureSet.Release();
|
||
this._textureSet = null
|
||
}
|
||
}
|
||
GetTextureSet() {
|
||
return this._textureSet
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const LEFT_MARGIN = 0;
|
||
const RIGHT_MARGIN = 1;
|
||
const TOP_MARGIN = 2;
|
||
const BOTTOM_MARGIN = 3;
|
||
const EDGES = 4;
|
||
const FILL = 5;
|
||
const INITIALLY_VISIBLE = 6;
|
||
const ORIGIN = 7;
|
||
const SEAMS = 8;
|
||
const tempRect = C3.New(C3.Rect);
|
||
const tempQuad = C3.New(C3.Quad);
|
||
C3.Plugins.NinePatch.Instance = class NinePatchInstance extends C3.SDKWorldInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
this._leftMargin = 16;
|
||
this._rightMargin = 16;
|
||
this._topMargin = 16;
|
||
this._bottomMargin = 16;
|
||
this._edges = 1;
|
||
this._fill = 1;
|
||
this._isSeamless = true;
|
||
if (properties) {
|
||
this._leftMargin = properties[LEFT_MARGIN];
|
||
this._rightMargin = properties[RIGHT_MARGIN];
|
||
this._topMargin = properties[TOP_MARGIN];
|
||
this._bottomMargin = properties[BOTTOM_MARGIN];
|
||
this._edges = properties[EDGES];
|
||
this._fill = properties[FILL];
|
||
this._isSeamless = !!properties[SEAMS];
|
||
this.GetWorldInfo().SetVisible(!!properties[INITIALLY_VISIBLE])
|
||
}
|
||
this._sdkType.CreatePatch(this._leftMargin, this._rightMargin, this._topMargin, this._bottomMargin)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
Draw(renderer) {
|
||
let textureSet = this._sdkType.GetTextureSet();
|
||
if (!textureSet) {
|
||
this._sdkType.CreatePatch(this._leftMargin, this._rightMargin, this._topMargin, this._bottomMargin);
|
||
textureSet = this._sdkType.GetTextureSet();
|
||
if (!textureSet)
|
||
return
|
||
}
|
||
const wi = this.GetWorldInfo();
|
||
const lm = this._leftMargin;
|
||
const rm = this._rightMargin;
|
||
const tm = this._topMargin;
|
||
const bm = this._bottomMargin;
|
||
const iw = textureSet.GetImageWidth();
|
||
const ih = textureSet.GetImageHeight();
|
||
const re = iw - rm;
|
||
const be = ih - bm;
|
||
const bquad = wi.GetBoundingQuad();
|
||
const myx = bquad.getTlx();
|
||
const myy = bquad.getTly();
|
||
const myw = wi.GetWidth();
|
||
const myh = wi.GetHeight();
|
||
const s = this._isSeamless ? 1 : 0;
|
||
const edges = this._edges;
|
||
const fill = this._fill;
|
||
if (lm > 0 && tm > 0)
|
||
this._DrawPatch(renderer, textureSet.GetTexture(), 0, 0, lm + s, tm + s, myx, myy, lm + s, tm + s);
|
||
if (rm > 0 && tm > 0)
|
||
this._DrawPatch(renderer, textureSet.GetTexture(), re - s, 0, rm + s, tm + s, myx + myw - rm - s, myy, rm + s, tm + s);
|
||
if (rm > 0 && bm > 0)
|
||
this._DrawPatch(renderer, textureSet.GetTexture(), re - s, be - s, rm + s, bm + s, myx + myw - rm - s, myy + myh - bm - s, rm + s, bm + s);
|
||
if (lm > 0 && bm > 0)
|
||
this._DrawPatch(renderer, textureSet.GetTexture(), 0, be - s, lm + s, bm + s, myx, myy + myh - bm - s, lm + s, bm + s);
|
||
if (edges === 0) {
|
||
const off = fill === 2 ? 0 : s;
|
||
if (lm > 0 && be > tm)
|
||
this._TilePatch(renderer, textureSet.GetLeftTexture(), myx, myy + tm, lm + off, myh - tm - bm, 0, 0);
|
||
if (rm > 0 && be > tm)
|
||
this._TilePatch(renderer, textureSet.GetRightTexture(), myx + myw - rm - off, myy + tm, rm + off, myh - tm - bm, off, 0);
|
||
if (tm > 0 && re > lm)
|
||
this._TilePatch(renderer, textureSet.GetTopTexture(), myx + lm, myy, myw - lm - rm, tm + off, 0, 0);
|
||
if (bm > 0 && re > lm)
|
||
this._TilePatch(renderer, textureSet.GetBottomTexture(), myx + lm, myy + myh - bm - off, myw - lm - rm, bm + off, 0, off)
|
||
} else if (edges === 1) {
|
||
if (lm > 0 && be > tm)
|
||
this._DrawPatch(renderer, textureSet.GetTexture(), 0, tm, lm, be - tm, myx, myy + tm, lm, myh - tm - bm);
|
||
if (rm > 0 && be > tm)
|
||
this._DrawPatch(renderer, textureSet.GetTexture(), re, tm, rm, be - tm, myx + myw - rm, myy + tm, rm, myh - tm - bm);
|
||
if (tm > 0 && re > lm)
|
||
this._DrawPatch(renderer, textureSet.GetTexture(), lm, 0, re - lm, tm, myx + lm, myy, myw - lm - rm, tm);
|
||
if (bm > 0 && re > lm)
|
||
this._DrawPatch(renderer, textureSet.GetTexture(), lm, be, re - lm, bm, myx + lm, myy + myh - bm, myw - lm - rm, bm)
|
||
}
|
||
if (be > tm && re > lm)
|
||
if (fill === 0)
|
||
this._TilePatch(renderer, textureSet.GetFillTexture(), myx + lm, myy + tm, myw - lm - rm, myh - tm - bm, 0, 0);
|
||
else if (fill === 1)
|
||
this._DrawPatch(renderer, textureSet.GetTexture(), lm, tm, re - lm, be - tm, myx + lm, myy + tm, myw - lm - rm, myh - tm - bm)
|
||
}
|
||
_DrawPatch(renderer, tex, sx, sy, sw, sh, dx, dy, dw, dh) {
|
||
const texW = tex.GetWidth();
|
||
const texH = tex.GetHeight();
|
||
renderer.SetTexture(tex);
|
||
const wi = this.GetWorldInfo();
|
||
const bquad = wi.GetBoundingQuad();
|
||
const offX = bquad.getTlx();
|
||
const offY = bquad.getTly();
|
||
tempRect.set(dx, dy, dx + dw, dy + dh);
|
||
tempRect.offset(-offX, -offY);
|
||
tempQuad.setFromRotatedRect(tempRect, wi.GetAngle());
|
||
tempQuad.offset(offX, offY);
|
||
tempRect.set(sx / texW, sy / texH, (sx + sw) / texW, (sy + sh) / texH);
|
||
renderer.Quad3(tempQuad, tempRect)
|
||
}
|
||
_TilePatch(renderer, tex, dx, dy, dw, dh, ox, oy) {
|
||
const texW = tex.GetWidth();
|
||
const texH = tex.GetHeight();
|
||
renderer.SetTexture(tex);
|
||
const wi = this.GetWorldInfo();
|
||
const bquad = wi.GetBoundingQuad();
|
||
const offX = bquad.getTlx();
|
||
const offY = bquad.getTly();
|
||
tempRect.set(dx, dy, dx + dw, dy + dh);
|
||
tempRect.offset(-offX, -offY);
|
||
tempQuad.setFromRotatedRect(tempRect, wi.GetAngle());
|
||
tempQuad.offset(offX, offY);
|
||
tempRect.set(-ox / texW, -oy / texH, (dw - ox) / texW, (dh - oy) / texH);
|
||
renderer.Quad3(tempQuad, tempRect)
|
||
}
|
||
GetCurrentImageInfo() {
|
||
this._objectClass.GetImageInfo()
|
||
}
|
||
GetPropertyValueByIndex(index) {}
|
||
SetPropertyValueByIndex(index, value) {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.NinePatch.Cnds = {}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.NinePatch.Acts = {
|
||
SetEffect(effect) {
|
||
this.GetWorldInfo().SetBlendMode(effect);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.NinePatch.Exps = {}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
function CloneDrawable(drawable) {
|
||
const canvas = C3.CreateCanvas(drawable.width, drawable.height);
|
||
const ctx = canvas.getContext("2d");
|
||
ctx.drawImage(drawable, 0, 0);
|
||
return canvas
|
||
}
|
||
self.NinePatchTextureSet = class NinePatchTextureSet {
|
||
constructor(sdkType) {
|
||
this._sdkType = sdkType;
|
||
this._runtime = this._sdkType.GetRuntime();
|
||
this._texture = null;
|
||
this._fillTexture = null;
|
||
this._leftTexture = null;
|
||
this._rightTexture = null;
|
||
this._topTexture = null;
|
||
this._bottomTexture = null;
|
||
this._imageWidth = 0;
|
||
this._imageHeight = 0;
|
||
this._renderer = this._runtime.GetWebGLRenderer();
|
||
this._isLoading = false;
|
||
this._wasReleased = false
|
||
}
|
||
Release() {
|
||
if (!this._renderer.IsContextLost()) {
|
||
this._renderer.DeleteTexture(this._texture);
|
||
this._renderer.DeleteTexture(this._fillTexture);
|
||
this._renderer.DeleteTexture(this._leftTexture);
|
||
this._renderer.DeleteTexture(this._rightTexture);
|
||
this._renderer.DeleteTexture(this._topTexture);
|
||
this._renderer.DeleteTexture(this._bottomTexture)
|
||
}
|
||
this._texture = null;
|
||
this._fillTexture = null;
|
||
this._leftTexture = null;
|
||
this._rightTexture = null;
|
||
this._topTexture = null;
|
||
this._bottomTexture = null;
|
||
this._sdkType = null;
|
||
this._renderer = null;
|
||
this._wasReleased = true
|
||
}
|
||
WasReleased() {
|
||
return this._wasReleased
|
||
}
|
||
CreateTextures(drawable, lm, rm, tm, bm) {
|
||
this._SliceImage(drawable, lm, rm, tm, bm)
|
||
}
|
||
HasCreatedTextures() {
|
||
return !!this._texture
|
||
}
|
||
_SliceImage(drawable, lm, rm, tm, bm) {
|
||
if (this._wasReleased)
|
||
return;
|
||
const iw = drawable.width;
|
||
const ih = drawable.height;
|
||
this._imageWidth = iw;
|
||
this._imageHeight = ih;
|
||
const re = iw - rm;
|
||
const be = ih - bm;
|
||
const sampling = this._runtime.GetSampling();
|
||
this._texture = this._renderer.CreateStaticTexture(CloneDrawable(drawable), {
|
||
sampling
|
||
});
|
||
if (re > lm && be > tm)
|
||
this._fillTexture = this._renderer.CreateStaticTexture(this._SliceSubImage(CloneDrawable(drawable), lm, tm, re, be), {
|
||
wrapX: "repeat",
|
||
wrapY: "repeat",
|
||
sampling
|
||
});
|
||
if (lm > 0 && be > tm)
|
||
this._leftTexture = this._renderer.CreateStaticTexture(this._SliceSubImage(CloneDrawable(drawable), 0, tm, lm, be), {
|
||
wrapY: "repeat",
|
||
sampling
|
||
});
|
||
if (rm > 0 && be > tm)
|
||
this._rightTexture = this._renderer.CreateStaticTexture(this._SliceSubImage(CloneDrawable(drawable), re, tm, iw, be), {
|
||
wrapY: "repeat",
|
||
sampling
|
||
});
|
||
if (tm > 0 && re > lm)
|
||
this._topTexture = this._renderer.CreateStaticTexture(this._SliceSubImage(CloneDrawable(drawable), lm, 0, re, tm), {
|
||
wrapX: "repeat",
|
||
sampling
|
||
});
|
||
if (bm > 0 && re > lm)
|
||
this._bottomTexture = this._renderer.CreateStaticTexture(this._SliceSubImage(CloneDrawable(drawable), lm, be, re, ih), {
|
||
wrapX: "repeat",
|
||
sampling
|
||
})
|
||
}
|
||
_SliceSubImage(drawable, x1, y1, x2, y2) {
|
||
const w = x2 - x1;
|
||
const h = y2 - y1;
|
||
const tmpCanvas = C3.CreateCanvas(w, h);
|
||
const tmpCtx = tmpCanvas.getContext("2d");
|
||
tmpCtx.drawImage(drawable, x1, y1, w, h, 0, 0, w, h);
|
||
return tmpCanvas
|
||
}
|
||
GetImageWidth() {
|
||
return this._imageWidth
|
||
}
|
||
GetImageHeight() {
|
||
return this._imageHeight
|
||
}
|
||
GetTexture() {
|
||
return this._texture
|
||
}
|
||
GetFillTexture() {
|
||
return this._fillTexture
|
||
}
|
||
GetLeftTexture() {
|
||
return this._leftTexture
|
||
}
|
||
GetRightTexture() {
|
||
return this._rightTexture
|
||
}
|
||
GetTopTexture() {
|
||
return this._topTexture
|
||
}
|
||
GetBottomTexture() {
|
||
return this._bottomTexture
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Arr = class ArrayPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Arr.Type = class ArrayType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const IInstance = self.IInstance;
|
||
function ResizeArray(arr, len, data) {
|
||
if (len < arr.length)
|
||
C3.truncateArray(arr, len);
|
||
else if (len > arr.length)
|
||
if (typeof data === "function")
|
||
for (let i = arr.length; i < len; ++i)
|
||
arr.push(data());
|
||
else
|
||
for (let i = arr.length; i < len; ++i)
|
||
arr.push(data)
|
||
}
|
||
C3.Plugins.Arr.Instance = class ArrayInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
this._cx = 10;
|
||
this._cy = 1;
|
||
this._cz = 1;
|
||
this._arr = null;
|
||
this._forX = [];
|
||
this._forY = [];
|
||
this._forZ = [];
|
||
this._forDepth = -1;
|
||
if (properties) {
|
||
this._cx = properties[0];
|
||
this._cy = properties[1];
|
||
this._cz = properties[2]
|
||
}
|
||
this._arr = C3.MakeFilledArray(this._cx, ()=>C3.MakeFilledArray(this._cy, ()=>C3.MakeFilledArray(this._cz, 0)))
|
||
}
|
||
Release() {
|
||
this._arr = null;
|
||
super.Release()
|
||
}
|
||
At(x, y, z) {
|
||
x = Math.floor(x);
|
||
y = Math.floor(y);
|
||
z = Math.floor(z);
|
||
if (x >= 0 && x < this._cx && y >= 0 && y < this._cy && z >= 0 && z < this._cz)
|
||
return this._arr[x][y][z];
|
||
else
|
||
return 0
|
||
}
|
||
Set(x, y, z, val) {
|
||
x = Math.floor(x);
|
||
y = Math.floor(y);
|
||
z = Math.floor(z);
|
||
if (x >= 0 && x < this._cx && y >= 0 && y < this._cy && z >= 0 && z < this._cz)
|
||
this._arr[x][y][z] = val
|
||
}
|
||
SetSize(w, h, d) {
|
||
w = Math.floor(w);
|
||
h = Math.floor(h);
|
||
d = Math.floor(d);
|
||
if (w < 0)
|
||
w = 0;
|
||
if (h < 0)
|
||
h = 0;
|
||
if (d < 0)
|
||
d = 0;
|
||
if (this._cx === w && this._cy === h && this._cz === d)
|
||
return;
|
||
this._cx = w;
|
||
this._cy = h;
|
||
this._cz = d;
|
||
const arr = this._arr;
|
||
ResizeArray(arr, w, ()=>C3.MakeFilledArray(h, ()=>C3.MakeFilledArray(d, 0)));
|
||
for (let x = 0; x < w; ++x) {
|
||
ResizeArray(arr[x], h, ()=>C3.MakeFilledArray(d, 0));
|
||
for (let y = 0; y < h; ++y)
|
||
ResizeArray(arr[x][y], d, 0)
|
||
}
|
||
}
|
||
GetWidth() {
|
||
return this._cx
|
||
}
|
||
GetHeight() {
|
||
return this._cy
|
||
}
|
||
GetDepth() {
|
||
return this._cz
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "plugins.arr.debugger";
|
||
const propsPrefix = "plugins.arr.properties";
|
||
const ret = [{
|
||
title: prefix + ".array-properties.title",
|
||
properties: [{
|
||
name: propsPrefix + ".width.name",
|
||
value: this._cx,
|
||
onedit: v=>this.SetSize(v, this._cy, this._cz)
|
||
}, {
|
||
name: propsPrefix + ".height.name",
|
||
value: this._cy,
|
||
onedit: v=>this.SetSize(this._cx, v, this._cz)
|
||
}, {
|
||
name: propsPrefix + ".depth.name",
|
||
value: this._cz,
|
||
onedit: v=>this.SetSize(this._cx, this._cy, v)
|
||
}, {
|
||
name: propsPrefix + ".elements.name",
|
||
value: this._cx * this._cy * this._cz
|
||
}]
|
||
}];
|
||
const dataProps = [];
|
||
if (this._cy === 1 && this._cz === 1)
|
||
for (let x = 0; x < this._cx; ++x)
|
||
dataProps.push({
|
||
name: "$" + x,
|
||
value: this._arr[x][0][0],
|
||
onedit: v=>this._arr[x][0][0] = v
|
||
});
|
||
else
|
||
for (let x = 0; x < this._cx; ++x)
|
||
dataProps.push({
|
||
name: "$" + x,
|
||
value: this._arr[x].toString()
|
||
});
|
||
if (dataProps.length)
|
||
ret.push({
|
||
title: prefix + ".array-data.title",
|
||
properties: dataProps
|
||
});
|
||
return ret
|
||
}
|
||
GetAsJsonString() {
|
||
return JSON.stringify({
|
||
"c2array": true,
|
||
"size": [this._cx, this._cy, this._cz],
|
||
"data": this._arr
|
||
})
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"size": [this._cx, this._cy, this._cz],
|
||
"data": this._arr
|
||
}
|
||
}
|
||
LoadFromJson(o) {
|
||
const sz = o["size"];
|
||
this._cx = sz[0];
|
||
this._cy = sz[1];
|
||
this._cz = sz[2];
|
||
this._arr = o["data"]
|
||
}
|
||
_GetForX() {
|
||
if (this._forDepth >= 0 && this._forDepth < this._forX.length)
|
||
return this._forX[this._forDepth];
|
||
else
|
||
return 0
|
||
}
|
||
_GetForY() {
|
||
if (this._forDepth >= 0 && this._forDepth < this._forY.length)
|
||
return this._forY[this._forDepth];
|
||
else
|
||
return 0
|
||
}
|
||
_GetForZ() {
|
||
if (this._forDepth >= 0 && this._forDepth < this._forZ.length)
|
||
return this._forZ[this._forDepth];
|
||
else
|
||
return 0
|
||
}
|
||
GetScriptInterfaceClass() {
|
||
return self.IArrayInstance
|
||
}
|
||
}
|
||
;
|
||
const map = new WeakMap;
|
||
self.IArrayInstance = class IArrayInstance extends IInstance {
|
||
constructor() {
|
||
super();
|
||
map.set(this, IInstance._GetInitInst().GetSdkInstance())
|
||
}
|
||
get width() {
|
||
return map.get(this).GetWidth()
|
||
}
|
||
get height() {
|
||
return map.get(this).GetHeight()
|
||
}
|
||
get depth() {
|
||
return map.get(this).GetDepth()
|
||
}
|
||
setSize(w, h=1, d=1) {
|
||
map.get(this).SetSize(w, h, d)
|
||
}
|
||
getAt(x, y=0, z=0) {
|
||
return map.get(this).At(x, y, z)
|
||
}
|
||
setAt(val, x, y=0, z=0) {
|
||
if (typeof val !== "number" && typeof val !== "string")
|
||
throw new TypeError("invalid type");
|
||
map.get(this).Set(x, y, z, val)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
function DoForEachTrigger(eventSheetManager, currentEvent, solModifiers, oldFrame, newFrame) {
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
currentEvent.Retrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
C3.Plugins.Arr.Cnds = {
|
||
CompareX(x, cmp, val) {
|
||
return C3.compare(this.At(x, 0, 0), cmp, val)
|
||
},
|
||
CompareXY(x, y, cmp, val) {
|
||
return C3.compare(this.At(x, y, 0), cmp, val)
|
||
},
|
||
CompareXYZ(x, y, z, cmp, val) {
|
||
return C3.compare(this.At(x, y, z), cmp, val)
|
||
},
|
||
ArrForEach(dims) {
|
||
const runtime = this._runtime;
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
const currentEvent = runtime.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
const eventStack = runtime.GetEventStack();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const forDepth = ++this._forDepth;
|
||
const forX = this._forX;
|
||
const forY = this._forY;
|
||
const forZ = this._forZ;
|
||
const cx = this._cx;
|
||
const cy = this._cy;
|
||
const cz = this._cz;
|
||
if (forDepth === this._forX.length) {
|
||
forX.push(0);
|
||
forY.push(0);
|
||
forZ.push(0)
|
||
} else {
|
||
forX[forDepth] = 0;
|
||
forY[forDepth] = 0;
|
||
forZ[forDepth] = 0
|
||
}
|
||
runtime.SetDebuggingEnabled(false);
|
||
if (dims === 0)
|
||
for (let x = 0; x < cx; ++x)
|
||
for (let y = 0; y < cy; ++y)
|
||
for (let z = 0; z < cz; ++z) {
|
||
forX[forDepth] = x;
|
||
forY[forDepth] = y;
|
||
forZ[forDepth] = z;
|
||
DoForEachTrigger(eventSheetManager, currentEvent, solModifiers, oldFrame, newFrame)
|
||
}
|
||
else if (dims === 1)
|
||
for (let x = 0; x < cx; ++x)
|
||
for (let y = 0; y < cy; ++y) {
|
||
forX[forDepth] = x;
|
||
forY[forDepth] = y;
|
||
DoForEachTrigger(eventSheetManager, currentEvent, solModifiers, oldFrame, newFrame)
|
||
}
|
||
else
|
||
for (let x = 0; x < cx; ++x) {
|
||
forX[forDepth] = x;
|
||
DoForEachTrigger(eventSheetManager, currentEvent, solModifiers, oldFrame, newFrame)
|
||
}
|
||
runtime.SetDebuggingEnabled(true);
|
||
this._forDepth--;
|
||
eventStack.Pop();
|
||
return false
|
||
},
|
||
CompareCurrent(cmp, val) {
|
||
return C3.compare(this.At(this._GetForX(), this._GetForY(), this._GetForZ()), cmp, val)
|
||
},
|
||
Contains(val) {
|
||
const cx = this._cx;
|
||
const cy = this._cy;
|
||
const cz = this._cz;
|
||
const arr = this._arr;
|
||
for (let x = 0; x < cx; ++x)
|
||
for (let y = 0; y < cy; ++y)
|
||
for (let z = 0; z < cz; ++z)
|
||
if (arr[x][y][z] === val)
|
||
return true;
|
||
return false
|
||
},
|
||
IsEmpty() {
|
||
return this._cx === 0 || this._cy === 0 || this._cz === 0
|
||
},
|
||
CompareSize(axis, cmp, val) {
|
||
let s = 0;
|
||
switch (axis) {
|
||
case 0:
|
||
s = this._cx;
|
||
break;
|
||
case 1:
|
||
s = this._cy;
|
||
break;
|
||
case 2:
|
||
s = this._cz;
|
||
break
|
||
}
|
||
return C3.compare(s, cmp, val)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
function CompareValues(va, vb) {
|
||
if (typeof va === "number" && typeof vb === "number")
|
||
return va - vb;
|
||
else {
|
||
const sa = va.toString();
|
||
const sb = vb.toString();
|
||
if (sa < sb)
|
||
return -1;
|
||
else if (sa > sb)
|
||
return 1;
|
||
else
|
||
return 0
|
||
}
|
||
}
|
||
C3.Plugins.Arr.Acts = {
|
||
Clear(v) {
|
||
const cx = this._cx;
|
||
const cy = this._cy;
|
||
const cz = this._cz;
|
||
const arr = this._arr;
|
||
for (let x = 0; x < cx; ++x)
|
||
for (let y = 0; y < cy; ++y)
|
||
for (let z = 0; z < cz; ++z)
|
||
arr[x][y][z] = v
|
||
},
|
||
SetSize(w, h, d) {
|
||
this.SetSize(w, h, d)
|
||
},
|
||
SetX(x, val) {
|
||
this.Set(x, 0, 0, val)
|
||
},
|
||
SetXY(x, y, val) {
|
||
this.Set(x, y, 0, val)
|
||
},
|
||
SetXYZ(x, y, z, val) {
|
||
this.Set(x, y, z, val)
|
||
},
|
||
Push(where, value, axis) {
|
||
const cx = this._cx;
|
||
const cy = this._cy;
|
||
const cz = this._cz;
|
||
const arr = this._arr;
|
||
if (axis === 0) {
|
||
const add = C3.MakeFilledArray(cy, ()=>C3.MakeFilledArray(cz, value));
|
||
if (where === 0)
|
||
arr.push(add);
|
||
else
|
||
arr.unshift(add);
|
||
this._cx++
|
||
} else if (axis === 1) {
|
||
for (let x = 0; x < cx; ++x) {
|
||
const add = C3.MakeFilledArray(cz, value);
|
||
if (where === 0)
|
||
arr[x].push(add);
|
||
else
|
||
arr[x].unshift(add)
|
||
}
|
||
this._cy++
|
||
} else {
|
||
for (let x = 0; x < cx; ++x)
|
||
for (let y = 0; y < cy; ++y)
|
||
if (where === 0)
|
||
arr[x][y].push(value);
|
||
else
|
||
arr[x][y].unshift(value);
|
||
this._cz++
|
||
}
|
||
},
|
||
Pop(where, axis) {
|
||
const cx = this._cx;
|
||
const cy = this._cy;
|
||
const cz = this._cz;
|
||
const arr = this._arr;
|
||
if (axis === 0) {
|
||
if (cx === 0)
|
||
return;
|
||
if (where === 0)
|
||
arr.pop();
|
||
else
|
||
arr.shift();
|
||
this._cx--
|
||
} else if (axis === 1) {
|
||
if (cy === 0)
|
||
return;
|
||
for (let x = 0; x < cx; ++x)
|
||
if (where === 0)
|
||
arr[x].pop();
|
||
else
|
||
arr[x].shift();
|
||
this._cy--
|
||
} else {
|
||
if (cz === 0)
|
||
return;
|
||
for (let x = 0; x < cx; ++x)
|
||
for (let y = 0; y < cy; ++y)
|
||
if (where === 0)
|
||
arr[x][y].pop();
|
||
else
|
||
arr[x][y].shift();
|
||
this._cz--
|
||
}
|
||
},
|
||
Reverse(axis) {
|
||
const cx = this._cx;
|
||
const cy = this._cy;
|
||
const cz = this._cz;
|
||
const arr = this._arr;
|
||
if (cx === 0 || cy === 0 || cz === 0)
|
||
return;
|
||
if (axis === 0)
|
||
arr.reverse();
|
||
else if (axis === 1)
|
||
for (let x = 0; x < cx; ++x)
|
||
arr[x].reverse();
|
||
else
|
||
for (let x = 0; x < cx; ++x)
|
||
for (let y = 0; y < cy; ++y)
|
||
arr[x][y].reverse()
|
||
},
|
||
Sort(axis) {
|
||
const cx = this._cx;
|
||
const cy = this._cy;
|
||
const cz = this._cz;
|
||
const arr = this._arr;
|
||
if (cx === 0 || cy === 0 || cz === 0)
|
||
return;
|
||
if (axis === 0)
|
||
arr.sort((a,b)=>CompareValues(a[0][0], b[0][0]));
|
||
else if (axis === 1)
|
||
for (let x = 0; x < cx; ++x)
|
||
arr[x].sort((a,b)=>CompareValues(a[0], b[0]));
|
||
else
|
||
for (let x = 0; x < cx; ++x)
|
||
for (let y = 0; y < cy; ++y)
|
||
arr[x][y].sort(CompareValues)
|
||
},
|
||
Delete(index, axis) {
|
||
index = Math.floor(index);
|
||
if (index < 0)
|
||
return;
|
||
const cx = this._cx;
|
||
const cy = this._cy;
|
||
const cz = this._cz;
|
||
const arr = this._arr;
|
||
if (axis === 0) {
|
||
if (index >= cx)
|
||
return;
|
||
arr.splice(index, 1);
|
||
this._cx--
|
||
} else if (axis === 1) {
|
||
if (index >= cy)
|
||
return;
|
||
for (let x = 0; x < cx; ++x)
|
||
arr[x].splice(index, 1);
|
||
this._cy--
|
||
} else {
|
||
if (index >= cz)
|
||
return;
|
||
for (let x = 0; x < cx; ++x)
|
||
for (let y = 0; y < cy; ++y)
|
||
arr[x][y].splice(index, 1);
|
||
this._cz--
|
||
}
|
||
},
|
||
Insert(value, index, axis) {
|
||
index = Math.floor(index);
|
||
if (index < 0)
|
||
return;
|
||
const cx = this._cx;
|
||
const cy = this._cy;
|
||
const cz = this._cz;
|
||
const arr = this._arr;
|
||
if (axis === 0) {
|
||
if (index > cx)
|
||
return;
|
||
arr.splice(index, 0, C3.MakeFilledArray(cy, ()=>C3.MakeFilledArray(cz, value)));
|
||
this._cx++
|
||
} else if (axis === 1) {
|
||
if (index > cy)
|
||
return;
|
||
for (let x = 0; x < cx; ++x)
|
||
arr[x].splice(index, 0, C3.MakeFilledArray(cz, value));
|
||
this._cy++
|
||
} else {
|
||
if (index > cz)
|
||
return;
|
||
for (let x = 0; x < cx; ++x)
|
||
for (let y = 0; y < cy; ++y)
|
||
arr[x][y].splice(index, 0, value);
|
||
this._cz++
|
||
}
|
||
},
|
||
JSONLoad(json) {
|
||
let o = null;
|
||
try {
|
||
o = JSON.parse(json)
|
||
} catch (err) {
|
||
console.error("[Construct 3] Failed to parse JSON: ", err);
|
||
return
|
||
}
|
||
if (!o["c2array"])
|
||
return;
|
||
const sz = o["size"];
|
||
this._cx = sz[0];
|
||
this._cy = sz[1];
|
||
this._cz = sz[2];
|
||
this._arr = o["data"]
|
||
},
|
||
JSONDownload(filename) {
|
||
const url = URL.createObjectURL(new Blob([this.GetAsJsonString()],{
|
||
type: "application/json"
|
||
}));
|
||
this._runtime.InvokeDownload(url, filename)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Arr.Exps = {
|
||
At(x, y, z) {
|
||
return this.At(x, y || 0, z || 0)
|
||
},
|
||
Width() {
|
||
return this._cx
|
||
},
|
||
Height() {
|
||
return this._cy
|
||
},
|
||
Depth() {
|
||
return this._cz
|
||
},
|
||
CurX() {
|
||
return this._GetForX()
|
||
},
|
||
CurY() {
|
||
return this._GetForY()
|
||
},
|
||
CurZ() {
|
||
return this._GetForZ()
|
||
},
|
||
CurValue() {
|
||
return this.At(this._GetForX(), this._GetForY(), this._GetForZ())
|
||
},
|
||
Front() {
|
||
return this.At(0, 0, 0)
|
||
},
|
||
Back() {
|
||
return this.At(this._cx - 1, 0, 0)
|
||
},
|
||
IndexOf(v) {
|
||
const arr = this._arr;
|
||
for (let x = 0, len = this._cx; x < len; ++x)
|
||
if (arr[x][0][0] === v)
|
||
return x;
|
||
return -1
|
||
},
|
||
LastIndexOf(v) {
|
||
const arr = this._arr;
|
||
for (let x = this._cx - 1; x >= 0; --x)
|
||
if (arr[x][0][0] === v)
|
||
return x;
|
||
return -1
|
||
},
|
||
AsJSON() {
|
||
return this.GetAsJsonString()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.AJAX = class AJAXPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.AJAX.Type = class AJAXType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.AJAX.Instance = class AJAXInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
this._lastData = "";
|
||
this._curTag = "";
|
||
this._progress = 0;
|
||
this._timeout = -1;
|
||
this._nextRequestHeaders = new Map;
|
||
this._nextReponseBinaryData = null;
|
||
this._nextRequestOverrideMimeType = "";
|
||
this._nwjsFs = null;
|
||
this._nwjsPath = null;
|
||
this._nwjsAppFolder = null;
|
||
this._isNWjs = this._runtime.GetExportType() === "nwjs";
|
||
if (this._isNWjs) {
|
||
this._nwjsFs = require("fs");
|
||
this._nwjsPath = require("path");
|
||
const process = self["process"] || nw["process"];
|
||
this._nwjsAppFolder = this._nwjsPath["dirname"](process["execPath"]) + "\\"
|
||
}
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
async _TriggerError(tag, url, err) {
|
||
console.error(`[Construct 3] AJAX request to '${url}' (tag '${tag}') failed: `, err);
|
||
this._curTag = tag;
|
||
await this.TriggerAsync(C3.Plugins.AJAX.Cnds.OnAnyError);
|
||
await this.TriggerAsync(C3.Plugins.AJAX.Cnds.OnError)
|
||
}
|
||
async _TriggerComplete(tag) {
|
||
this._curTag = tag;
|
||
await this.TriggerAsync(C3.Plugins.AJAX.Cnds.OnAnyComplete);
|
||
await this.TriggerAsync(C3.Plugins.AJAX.Cnds.OnComplete)
|
||
}
|
||
async _OnProgress(tag, e) {
|
||
if (!e["lengthComputable"])
|
||
return;
|
||
this._progress = e["loaded"] / e["total"];
|
||
this._curTag = tag;
|
||
await this.TriggerAsync(C3.Plugins.AJAX.Cnds.OnProgress)
|
||
}
|
||
_OnError(tag, url, err) {
|
||
if (!this._isNWjs) {
|
||
this._TriggerError(tag, url, err);
|
||
return
|
||
}
|
||
const fs = this._nwjsFs;
|
||
const filePath = this._nwjsAppFolder + url;
|
||
if (fs["existsSync"](filePath))
|
||
fs["readFile"](filePath, {
|
||
"encoding": "utf8"
|
||
}, (err2,data)=>{
|
||
if (err2)
|
||
this._TriggerError(tag, url, err2);
|
||
else {
|
||
this._lastData = data.replace(/\r\n/g, "\n");
|
||
this._TriggerComplete(tag)
|
||
}
|
||
}
|
||
);
|
||
else
|
||
this._TriggerError(tag, url, err)
|
||
}
|
||
async _DoCordovaRequest(tag, file) {
|
||
const assetManager = this._runtime.GetAssetManager();
|
||
const binaryData = this._nextReponseBinaryData;
|
||
this._nextReponseBinaryData = null;
|
||
try {
|
||
if (binaryData) {
|
||
const buffer = await assetManager.CordovaFetchLocalFileAsArrayBuffer(file);
|
||
binaryData.SetArrayBufferTransfer(buffer);
|
||
this._lastData = "";
|
||
this._TriggerComplete(tag)
|
||
} else {
|
||
const data = await assetManager.CordovaFetchLocalFileAsText(file);
|
||
this._lastData = data.replace(/\r\n/g, "\n");
|
||
this._TriggerComplete(tag)
|
||
}
|
||
} catch (err) {
|
||
this._TriggerError(tag, file, err)
|
||
}
|
||
}
|
||
_DoRequest(tag, url, method, data) {
|
||
return new Promise(resolve=>{
|
||
const errorFunc = err=>{
|
||
this._OnError(tag, url, err);
|
||
resolve()
|
||
}
|
||
;
|
||
const binaryData = this._nextReponseBinaryData;
|
||
this._nextReponseBinaryData = null;
|
||
try {
|
||
const request = new XMLHttpRequest;
|
||
request.onreadystatechange = ()=>{
|
||
if (request.readyState === 4) {
|
||
if (binaryData)
|
||
this._lastData = "";
|
||
else
|
||
this._lastData = (request.responseText || "").replace(/\r\n/g, "\n");
|
||
if (request.status >= 400)
|
||
this._TriggerError(tag, url, request.status + request.statusText);
|
||
else {
|
||
const hasData = this._lastData.length || binaryData && request.response instanceof ArrayBuffer;
|
||
if ((!this._isNWjs || hasData) && !(!this._isNWjs && request.status === 0 && !hasData)) {
|
||
if (binaryData)
|
||
binaryData.SetArrayBufferTransfer(request.response);
|
||
this._TriggerComplete(tag)
|
||
}
|
||
}
|
||
resolve()
|
||
}
|
||
}
|
||
;
|
||
request.onerror = errorFunc;
|
||
request.ontimeout = errorFunc;
|
||
request.onabort = errorFunc;
|
||
request["onprogress"] = e=>this._OnProgress(tag, e);
|
||
request.open(method, url);
|
||
if (this._timeout >= 0 && typeof request["timeout"] !== "undefined")
|
||
request["timeout"] = this._timeout;
|
||
request.responseType = binaryData ? "arraybuffer" : "text";
|
||
if (data && !this._nextRequestHeaders.has("Content-Type"))
|
||
if (typeof data !== "string")
|
||
request["setRequestHeader"]("Content-Type", "application/octet-stream");
|
||
else
|
||
request["setRequestHeader"]("Content-Type", "application/x-www-form-urlencoded");
|
||
for (const [header,value] of this._nextRequestHeaders)
|
||
try {
|
||
request["setRequestHeader"](header, value)
|
||
} catch (err) {
|
||
console.error(`[Construct 3] AJAX: Failed to set header '${header}: ${value}': `, err)
|
||
}
|
||
this._nextRequestHeaders.clear();
|
||
if (this._nextRequestOverrideMimeType) {
|
||
try {
|
||
request["overrideMimeType"](this._nextRequestOverrideMimeType)
|
||
} catch (err) {
|
||
console.error(`[Construct 3] AJAX: failed to override MIME type: `, err)
|
||
}
|
||
this._nextRequestOverrideMimeType = ""
|
||
}
|
||
if (data)
|
||
request.send(data);
|
||
else
|
||
request.send()
|
||
} catch (err) {
|
||
errorFunc(err)
|
||
}
|
||
}
|
||
)
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "plugins.ajax.debugger";
|
||
return [{
|
||
title: prefix + ".title",
|
||
properties: [{
|
||
name: prefix + ".last-data",
|
||
value: this._lastData
|
||
}]
|
||
}]
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"lastData": this._lastData
|
||
}
|
||
}
|
||
LoadFromJson(o) {
|
||
this._lastData = o["lastData"];
|
||
this._curTag = "";
|
||
this._progress = 0
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.AJAX.Cnds = {
|
||
OnComplete(tag) {
|
||
return C3.equalsNoCase(this._curTag, tag)
|
||
},
|
||
OnAnyComplete() {
|
||
return true
|
||
},
|
||
OnError(tag) {
|
||
return C3.equalsNoCase(this._curTag, tag)
|
||
},
|
||
OnAnyError() {
|
||
return true
|
||
},
|
||
OnProgress(tag) {
|
||
return C3.equalsNoCase(this._curTag, tag)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.AJAX.Acts = {
|
||
async Request(tag, url) {
|
||
if (this._runtime.IsCordova() && C3.IsRelativeURL(url) && location.protocol === "file:")
|
||
await this._DoCordovaRequest(tag, url);
|
||
else if (this._runtime.IsPreview() && C3.IsRelativeURL(url)) {
|
||
const localurl = this._runtime.GetAssetManager().GetLocalUrlAsBlobUrl(url.toLowerCase());
|
||
await this._DoRequest(tag, localurl, "GET", null)
|
||
} else
|
||
await this._DoRequest(tag, url, "GET", null)
|
||
},
|
||
async RequestFile(tag, file) {
|
||
if (this._runtime.IsCordova() && location.protocol === "file:")
|
||
await this._DoCordovaRequest(tag, file);
|
||
else
|
||
await this._DoRequest(tag, this._runtime.GetAssetManager().GetLocalUrlAsBlobUrl(file), "GET", null)
|
||
},
|
||
async Post(tag, url, data, method) {
|
||
await this._DoRequest(tag, url, method, data)
|
||
},
|
||
async PostBinary(tag, url, objectClass, method) {
|
||
if (!objectClass)
|
||
return;
|
||
const target = objectClass.GetFirstPicked(this._inst);
|
||
if (!target)
|
||
return;
|
||
const sdkInst = target.GetSdkInstance();
|
||
const buffer = sdkInst.GetArrayBufferReadOnly();
|
||
await this._DoRequest(tag, url, method, buffer)
|
||
},
|
||
SetTimeout(t) {
|
||
this._timeout = t * 1E3
|
||
},
|
||
SetHeader(n, v) {
|
||
this._nextRequestHeaders.set(n, v)
|
||
},
|
||
SetResponseBinary(objectClass) {
|
||
if (!objectClass)
|
||
return;
|
||
const inst = objectClass.GetFirstPicked(this._inst);
|
||
if (!inst)
|
||
return;
|
||
this._nextReponseBinaryData = inst.GetSdkInstance()
|
||
},
|
||
OverrideMIMEType(m) {
|
||
this._nextRequestOverrideMimeType = m
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.AJAX.Exps = {
|
||
LastData() {
|
||
return this._lastData
|
||
},
|
||
Progress() {
|
||
return this._progress
|
||
},
|
||
Tag() {
|
||
return this._curTag
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Json = class JSONPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Json.Type = class JSONType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const IInstance = self.IInstance;
|
||
C3.Plugins.Json.Instance = class JSONInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
this._valueCache = [null, null];
|
||
this._locationCache = [null, null];
|
||
this._data = {};
|
||
this._path = [];
|
||
this._currentKey = "";
|
||
this._currentValue = 0
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
_InvalidateValueCache() {
|
||
this._valueCache[0] = null;
|
||
this._valueCache[1] = null
|
||
}
|
||
_HasValueCache(arr) {
|
||
if (arr === null || this._valueCache[0] === null)
|
||
return false;
|
||
return this._valueCache[0] === arr || C3.arraysEqual(this._valueCache[0], arr)
|
||
}
|
||
_GetValueCache() {
|
||
return this._valueCache[1]
|
||
}
|
||
_UpdateValueCache(str, value) {
|
||
this._valueCache[0] = str;
|
||
this._valueCache[1] = value
|
||
}
|
||
_InvalidateLocationCache() {
|
||
this._locationCache[0] = null;
|
||
this._locationCache[1] = null
|
||
}
|
||
_HasLocationCache(str) {
|
||
return this._locationCache[0] === str
|
||
}
|
||
_GetLocationCache() {
|
||
return this._locationCache[1]
|
||
}
|
||
_UpdateLocationCache(str, value) {
|
||
this._locationCache[0] = str;
|
||
this._locationCache[1] = value
|
||
}
|
||
_SetData(obj) {
|
||
this._data = obj;
|
||
this._InvalidateValueCache()
|
||
}
|
||
_GetData() {
|
||
return this._data
|
||
}
|
||
_SetPath(str) {
|
||
this._path = this._ParsePathUnsafe(str);
|
||
this._InvalidateLocationCache()
|
||
}
|
||
_ParsePath(str) {
|
||
return C3.cloneArray(this._ParsePathUnsafe(str))
|
||
}
|
||
_ParsePathUnsafe(str) {
|
||
const buffer = [];
|
||
let escaped = false;
|
||
let parts;
|
||
if (this._HasLocationCache(str))
|
||
return this._GetLocationCache();
|
||
if (str[0] === ".") {
|
||
parts = C3.cloneArray(this._path);
|
||
str = str.slice(1)
|
||
} else
|
||
parts = [];
|
||
for (const c of str)
|
||
if (escaped) {
|
||
buffer.push(c);
|
||
escaped = false
|
||
} else if (c === "\\")
|
||
escaped = true;
|
||
else if (c === ".") {
|
||
parts.push(buffer.join(""));
|
||
C3.clearArray(buffer)
|
||
} else
|
||
buffer.push(c);
|
||
if (buffer.length !== 0)
|
||
parts.push(buffer.join(""));
|
||
this._UpdateLocationCache(str, parts);
|
||
return parts
|
||
}
|
||
_GetValueAtFullPath(path, lazyCreate) {
|
||
if (this._HasValueCache(path))
|
||
return this._GetValueCache();
|
||
let result = this._data;
|
||
for (const part of path)
|
||
if (Array.isArray(result)) {
|
||
const index = parseInt(part, 10);
|
||
if (index < 0 || index >= result.length || !isFinite(index)) {
|
||
result = null;
|
||
break
|
||
}
|
||
result = result[index]
|
||
} else if (typeof result === "object" && result !== null)
|
||
if (result.hasOwnProperty(part))
|
||
result = result[part];
|
||
else if (lazyCreate) {
|
||
const o = {};
|
||
result[part] = o;
|
||
result = o
|
||
} else {
|
||
result = null;
|
||
break
|
||
}
|
||
else {
|
||
result = null;
|
||
break
|
||
}
|
||
this._UpdateValueCache(path, result);
|
||
return result
|
||
}
|
||
_GetValue(str) {
|
||
const path = this._ParsePath(str);
|
||
if (!path.length)
|
||
return this._data;
|
||
const key = path.pop();
|
||
const obj = this._GetValueAtFullPath(path, false);
|
||
if (Array.isArray(obj)) {
|
||
const index = parseInt(key, 10);
|
||
return index >= 0 && index < obj.length ? obj[index] : null
|
||
} else if (typeof obj === "object" && obj !== null)
|
||
return obj.hasOwnProperty(key) ? obj[key] : null;
|
||
else
|
||
return null
|
||
}
|
||
_JSONTypeOf(val) {
|
||
if (val === null)
|
||
return "null";
|
||
else if (Array.isArray(val))
|
||
return "array";
|
||
else
|
||
return typeof val
|
||
}
|
||
_GetTypeOf(str) {
|
||
const val = this._GetValue(str);
|
||
return this._JSONTypeOf(val)
|
||
}
|
||
_ToSafeValue(value) {
|
||
const type = typeof value;
|
||
if (type === "number" || type === "string")
|
||
return value;
|
||
else if (type === "boolean")
|
||
return value ? 1 : 0;
|
||
else
|
||
return 0
|
||
}
|
||
_GetSafeValue(str) {
|
||
return this._ToSafeValue(this._GetValue(str))
|
||
}
|
||
_HasKey(str) {
|
||
const path = this._ParsePath(str);
|
||
if (!path.length)
|
||
return false;
|
||
const key = path.pop();
|
||
const obj = this._GetValueAtFullPath(path, false);
|
||
if (Array.isArray(obj)) {
|
||
const index = parseInt(key, 10);
|
||
return index >= 0 && index < obj.length
|
||
} else if (typeof obj === "object" && obj !== null)
|
||
return obj.hasOwnProperty(key);
|
||
else
|
||
return false
|
||
}
|
||
_SetValue(str, value) {
|
||
const path = this._ParsePath(str);
|
||
if (!path.length)
|
||
return false;
|
||
if (this._HasValueCache(path))
|
||
this._InvalidateValueCache();
|
||
const key = path.pop();
|
||
const obj = this._GetValueAtFullPath(path, true);
|
||
if (Array.isArray(obj)) {
|
||
const index = parseInt(key, 10);
|
||
if (!isFinite(index) || index < 0 || index >= obj.length)
|
||
return false;
|
||
obj[index] = value;
|
||
return true
|
||
} else if (typeof obj === "object" && obj !== null) {
|
||
obj[key] = value;
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
_DeleteKey(str) {
|
||
const path = this._ParsePath(str);
|
||
if (!path.length)
|
||
return false;
|
||
if (this._HasValueCache(path))
|
||
this._InvalidateValueCache();
|
||
const key = path.pop();
|
||
const obj = this._GetValueAtFullPath(path, false);
|
||
if (Array.isArray(obj))
|
||
return false;
|
||
else if (typeof obj === "object" && obj !== null) {
|
||
delete obj[key];
|
||
return true
|
||
} else
|
||
return false
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"path": this._path,
|
||
"data": this._data
|
||
}
|
||
}
|
||
LoadFromJson(o) {
|
||
this._InvalidateValueCache();
|
||
this._InvalidateLocationCache();
|
||
this._path = o["path"];
|
||
this._data = o["data"]
|
||
}
|
||
_SanitizeValue(val) {
|
||
const type = typeof val;
|
||
if (type === "number") {
|
||
if (!isFinite(val))
|
||
return 0;
|
||
return val
|
||
}
|
||
if (typeof val == "object")
|
||
return JSON.stringify(val);
|
||
return val + ""
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "plugins.json.debugger";
|
||
let topLevelData;
|
||
try {
|
||
topLevelData = this._SanitizeValue(this._data)
|
||
} catch (e) {
|
||
topLevelData = '"invalid"'
|
||
}
|
||
return [{
|
||
title: prefix + ".title",
|
||
properties: [{
|
||
name: prefix + ".data",
|
||
value: topLevelData,
|
||
onedit: v=>{
|
||
try {
|
||
const n = JSON.parse(v);
|
||
this._SetData(n)
|
||
} catch (e) {}
|
||
}
|
||
}, {
|
||
name: prefix + ".path",
|
||
value: this._path.map(seg=>seg.replace(/\./g, "\\.")).join(".")
|
||
}]
|
||
}]
|
||
}
|
||
GetScriptInterfaceClass() {
|
||
return self.IJSONInstance
|
||
}
|
||
}
|
||
;
|
||
const map = new WeakMap;
|
||
self.IJSONInstance = class IJSONInstance extends IInstance {
|
||
constructor() {
|
||
super();
|
||
map.set(this, IInstance._GetInitInst().GetSdkInstance())
|
||
}
|
||
getJsonDataCopy() {
|
||
const data = map.get(this)._GetData();
|
||
return JSON.parse(JSON.stringify(data))
|
||
}
|
||
setJsonDataCopy(o) {
|
||
try {
|
||
const o2 = JSON.parse(JSON.stringify(o));
|
||
map.get(this)._SetData(o2)
|
||
} catch (err) {
|
||
console.error("[JSON plugin] setJsonData: object is not valid JSON: ", err);
|
||
throw err;
|
||
}
|
||
}
|
||
setJsonString(str) {
|
||
try {
|
||
const o = JSON.parse(str);
|
||
map.get(this)._SetData(o)
|
||
} catch (err) {
|
||
console.error("[JSON plugin] setJsonString: string is not valid JSON: ", err);
|
||
throw err;
|
||
}
|
||
}
|
||
toCompactString() {
|
||
return JSON.stringify(map.get(this)._GetData())
|
||
}
|
||
toBeautifiedString() {
|
||
return JSON.stringify(map.get(this)._GetData(), null, 4)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const JSON_TYPES = ["null", "boolean", "number", "string", "object", "array"];
|
||
C3.Plugins.Json.Cnds = {
|
||
HasKey(str) {
|
||
return this._HasKey(str)
|
||
},
|
||
CompareType(str, typeIndex) {
|
||
return this._GetTypeOf(str) === JSON_TYPES[typeIndex]
|
||
},
|
||
CompareValue(str, cmp, value) {
|
||
return C3.compare(this._GetSafeValue(str), cmp, value)
|
||
},
|
||
IsBooleanSet(str) {
|
||
return this._GetValue(str) === true
|
||
},
|
||
ForEach(str) {
|
||
const value = this._GetValue(str);
|
||
if (typeof value !== "object" || value === null)
|
||
return false;
|
||
const runtime = this._runtime;
|
||
const eventSheetManager = runtime.GetEventSheetManager();
|
||
const currentEvent = runtime.GetCurrentEvent();
|
||
const solModifiers = currentEvent.GetSolModifiers();
|
||
const eventStack = runtime.GetEventStack();
|
||
const oldFrame = eventStack.GetCurrentStackFrame();
|
||
const newFrame = eventStack.Push(currentEvent);
|
||
const oldPath = this._path;
|
||
const oldKey = this._currentKey;
|
||
const oldValue = this._currentValue;
|
||
const subPath = this._ParsePathUnsafe(str);
|
||
runtime.SetDebuggingEnabled(false);
|
||
for (const [k,v] of Object.entries(value)) {
|
||
this._path = C3.cloneArray(subPath);
|
||
this._path.push(k);
|
||
this._currentKey = k;
|
||
this._currentValue = v;
|
||
eventSheetManager.PushCopySol(solModifiers);
|
||
currentEvent.Retrigger(oldFrame, newFrame);
|
||
eventSheetManager.PopSol(solModifiers)
|
||
}
|
||
runtime.SetDebuggingEnabled(true);
|
||
this._path = oldPath;
|
||
this._currentKey = oldKey;
|
||
this._currentValue = oldValue;
|
||
eventStack.Pop();
|
||
return false
|
||
},
|
||
OnParseError() {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Json.Acts = {
|
||
Parse(str) {
|
||
try {
|
||
this._SetData(JSON.parse(str))
|
||
} catch (err) {
|
||
console.warn("[JSON plugin] Failed to parse JSON data: ", err);
|
||
this._SetData({});
|
||
this.Trigger(C3.Plugins.Json.Cnds.OnParseError)
|
||
}
|
||
},
|
||
SetPath(str) {
|
||
this._SetPath(str)
|
||
},
|
||
SetValue(str, value) {
|
||
this._SetValue(str, value)
|
||
},
|
||
SetArray(str, size) {
|
||
let value = this._GetValue(str);
|
||
if (Array.isArray(value))
|
||
C3.resizeArray(value, size, 0);
|
||
else {
|
||
value = [];
|
||
C3.extendArray(value, size, 0);
|
||
this._SetValue(str, value)
|
||
}
|
||
},
|
||
SetObject(str) {
|
||
this._SetValue(str, {})
|
||
},
|
||
SetJSON(location, value) {
|
||
let obj = null;
|
||
try {
|
||
obj = JSON.parse(value)
|
||
} catch (err) {
|
||
console.warn("[JSON plugin] Failed to parse JSON data: ", err);
|
||
this.Trigger(C3.Plugins.Json.Cnds.OnParseError)
|
||
}
|
||
this._SetValue(location, obj)
|
||
},
|
||
SetNull(str) {
|
||
this._SetValue(str, null)
|
||
},
|
||
SetBoolean(str, value) {
|
||
this._SetValue(str, value !== 0)
|
||
},
|
||
ToggleBoolean(str) {
|
||
const value = this._GetValue(str);
|
||
if (typeof value === "boolean")
|
||
this._SetValue(str, !value)
|
||
},
|
||
AddTo(str, inc) {
|
||
const value = this._GetValue(str);
|
||
if (typeof value === "number")
|
||
this._SetValue(str, value + inc)
|
||
},
|
||
SubtractFrom(str, dec) {
|
||
const value = this._GetValue(str);
|
||
if (typeof value === "number")
|
||
this._SetValue(str, value - dec)
|
||
},
|
||
DeleteKey(str) {
|
||
this._DeleteKey(str)
|
||
},
|
||
PushValue(side, str, value) {
|
||
const parent = this._GetValue(str);
|
||
if (Array.isArray(parent))
|
||
side === 0 ? parent.push(value) : parent.unshift(value)
|
||
},
|
||
PopValue(side, str) {
|
||
const parent = this._GetValue(str);
|
||
if (Array.isArray(parent))
|
||
side === 0 ? parent.pop() : parent.shift()
|
||
},
|
||
InsertValue(value, str, index) {
|
||
const parent = this._GetValue(str);
|
||
if (Array.isArray(parent))
|
||
parent.splice(index, 0, value)
|
||
},
|
||
RemoveValues(count, str, index) {
|
||
const parent = this._GetValue(str);
|
||
if (Array.isArray(parent))
|
||
parent.splice(index, count)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Json.Exps = {
|
||
ToCompactString() {
|
||
try {
|
||
return JSON.stringify(this._data)
|
||
} catch (err) {
|
||
return ""
|
||
}
|
||
},
|
||
ToBeautifiedString() {
|
||
try {
|
||
return JSON.stringify(this._data, null, 4)
|
||
} catch (err) {
|
||
return ""
|
||
}
|
||
},
|
||
Get(str) {
|
||
return this._GetSafeValue(str)
|
||
},
|
||
GetAsCompactString(str) {
|
||
const value = this._GetValue(str);
|
||
return JSON.stringify(value)
|
||
},
|
||
GetAsBeautifiedString(str) {
|
||
const value = this._GetValue(str);
|
||
return JSON.stringify(value, null, 4)
|
||
},
|
||
Front(str) {
|
||
const parent = this._GetValue(str);
|
||
if (Array.isArray(parent)) {
|
||
const value = parent[0];
|
||
return this._ToSafeValue(value)
|
||
} else
|
||
return -1
|
||
},
|
||
Back(str) {
|
||
const parent = this._GetValue(str);
|
||
if (Array.isArray(parent)) {
|
||
const value = parent[parent.length - 1];
|
||
return this._ToSafeValue(value)
|
||
} else
|
||
return -1
|
||
},
|
||
Type(str) {
|
||
return this._GetTypeOf(str)
|
||
},
|
||
ArraySize(str) {
|
||
const value = this._GetValue(str);
|
||
if (Array.isArray(value))
|
||
return value.length;
|
||
else
|
||
return -1
|
||
},
|
||
Path() {
|
||
return this._path.map(seg=>seg.replace(/\./g, "\\.")).join(".")
|
||
},
|
||
CurrentKey() {
|
||
return this._currentKey
|
||
},
|
||
CurrentValue() {
|
||
return this._ToSafeValue(this._currentValue)
|
||
},
|
||
CurrentType() {
|
||
return this._JSONTypeOf(this._currentValue)
|
||
}
|
||
}
|
||
}
|
||
;"use strict";
|
||
{
|
||
C3.Plugins.aekiro_proui = class aekiro_prouiSingleGlobalPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.aekiro_proui.Type = class aekiro_prouiSingleGlobalType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
var C3 = self.C3;
|
||
C3.Plugins.aekiro_proui.Instance = class aekiro_prouiSingleGlobalInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
this.ignoreInput = false;
|
||
this.goManager = globalThis.aekiro_goManager;
|
||
this.goManager.init(this.GetRuntime());
|
||
this.lastLayout = null;
|
||
this.GetRuntime().Dispatcher().addEventListener("beforelayoutchange", ()=>{
|
||
this.goManager.isInit = false;
|
||
}
|
||
);
|
||
}
|
||
Initialise() {
|
||
this.goManager.gos = {};
|
||
this.goManager.registerGameObjects();
|
||
this.goManager.cleanSceneGraph();
|
||
this.goManager.createSceneGraph();
|
||
this.goManager.isInit = true;
|
||
}
|
||
setUIAudioVolume(volume) {
|
||
var list = [C3.Behaviors.aekiro_button, C3.Behaviors.aekiro_checkbox, C3.Behaviors.aekiro_radiobutton, C3.Behaviors.aekiro_dialog];
|
||
var behaviorBase, insts, audioSources;
|
||
for (var i = 0, l = list.length; i < l; i++) {
|
||
behaviorBase = this.GetRuntime()._pluginManager._behaviorsByCtor.get(list[i]);
|
||
if (!behaviorBase)
|
||
continue;
|
||
insts = behaviorBase.GetInstances();
|
||
for (var j = 0, m = insts.length; j < m; j++) {
|
||
audioSources = insts[j].GetUnsavedDataMap().audioSources;
|
||
if (!audioSources)
|
||
continue;
|
||
for (var key in audioSources) {
|
||
audioSources[key].setVolume(volume);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
isTypeValid(inst, types) {
|
||
var ctr = inst.GetPlugin().constructor;
|
||
for (var i = 0, l = types.length; i < l; i++) {
|
||
if (ctr == types[i]) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {};
|
||
}
|
||
LoadFromJson(o) {}
|
||
}
|
||
;
|
||
}
|
||
var Tween = globalThis["TWEEN"];
|
||
globalThis.Aekiro = {};
|
||
globalThis.AudioSource = class AudioSource {
|
||
constructor(opts, runtime) {
|
||
this.runtime = runtime;
|
||
this.parseConfig(opts);
|
||
if (C3.Plugins.Audio) {
|
||
this.act_PlayByName = C3.Plugins.Audio.Acts.PlayByName;
|
||
}
|
||
}
|
||
parseConfig(opts) {
|
||
opts = opts.split(";");
|
||
this.fileName = opts[0];
|
||
this.volume = parseInt(opts[1]);
|
||
if (!this.volume)
|
||
this.volume = 0;
|
||
}
|
||
getAudioSdkInstance() {
|
||
if (!this.audio) {
|
||
var plugin = this.runtime.GetSingleGlobalObjectClassByCtor(C3.Plugins.Audio);
|
||
if (plugin) {
|
||
this.audio = plugin.GetSingleGlobalInstance().GetSdkInstance();
|
||
}
|
||
}
|
||
return this.audio;
|
||
}
|
||
setVolume(v) {
|
||
this.volume = v;
|
||
}
|
||
play() {
|
||
if (!this.fileName)
|
||
return;
|
||
var audio = this.getAudioSdkInstance();
|
||
if (!audio) {
|
||
console.error("ProUI: Please add the Audio plugin to the project.");
|
||
return;
|
||
}
|
||
this.act_PlayByName.call(audio, 0, this.fileName, 0, this.volume, "sound");
|
||
}
|
||
}
|
||
;
|
||
globalThis.EventManager = class EventManager {
|
||
constructor(inst) {
|
||
this.map = {};
|
||
this.inst = inst;
|
||
}
|
||
on(eventName, callback, options) {
|
||
if (!this.map[eventName]) {
|
||
this.map[eventName] = [];
|
||
}
|
||
var once = false;
|
||
if (options) {
|
||
once = options["once"];
|
||
}
|
||
var listener = {
|
||
"callback": callback,
|
||
"once": once,
|
||
"eventName": eventName
|
||
};
|
||
this.map[eventName].push(listener);
|
||
return listener;
|
||
}
|
||
emit(eventName, options) {
|
||
options = options || {};
|
||
var listeners = this.map[eventName];
|
||
var listener;
|
||
if (listeners) {
|
||
for (var i = 0, l = listeners.length; i < l; i++) {
|
||
listener = listeners[i];
|
||
listener["callback"](options["args"]);
|
||
if (listener["once"]) {
|
||
this.removeListener(listener);
|
||
l = listeners.length;
|
||
i--;
|
||
}
|
||
}
|
||
}
|
||
if (options["propagate"] == undefined)
|
||
options["propagate"] = true;
|
||
if (options["bubble"] == undefined)
|
||
options["bubble"] = true;
|
||
var options2 = Object.assign({}, options);
|
||
options2["propagate"] = false;
|
||
if (options["bubble"] === true && this.inst) {
|
||
var go = this.inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (go.parent) {
|
||
go.parent.GetUnsavedDataMap().aekiro_gameobject.eventManager.emit(eventName, options2);
|
||
}
|
||
}
|
||
options2 = Object.assign({}, options);
|
||
options2["bubble"] = false;
|
||
if (options["propagate"] === true && this.inst) {
|
||
var go = this.inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
var children = go.children;
|
||
for (var i = 0, l = children.length; i < l; i++) {
|
||
children[i].GetUnsavedDataMap().aekiro_gameobject.eventManager.emit(eventName, options);
|
||
}
|
||
}
|
||
}
|
||
removeListener(listener) {
|
||
var listeners = this.map[listener["eventName"]];
|
||
var index = listeners.indexOf(listener);
|
||
listeners.splice(index, 1);
|
||
}
|
||
}
|
||
;
|
||
globalThis.aekiro_goManager = {
|
||
gos: {},
|
||
haltNext: false,
|
||
isRegistering: false,
|
||
eventManager: new globalThis.EventManager(),
|
||
lastLayout: 0,
|
||
init: function(runtime) {
|
||
if (this.runtime)
|
||
return;
|
||
this.runtime = runtime;
|
||
this.runtime.Dispatcher().addEventListener("instancedestroy", function(e) {
|
||
var go = e.instance.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (go) {
|
||
go.Release2();
|
||
}
|
||
});
|
||
},
|
||
clean: function() {
|
||
var key;
|
||
for (key in this.gos) {
|
||
if (this.gos[key].IsDestroyed()) {
|
||
this.removeGO(key);
|
||
}
|
||
}
|
||
},
|
||
addGO: function(inst) {
|
||
if (!inst)
|
||
return;
|
||
if (this.haltNext)
|
||
return;
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (!aekiro_gameobject.name) {
|
||
aekiro_gameobject.name = "o" + inst.GetUID();
|
||
}
|
||
var name = aekiro_gameobject.name;
|
||
if (this.gos.hasOwnProperty(name)) {
|
||
console.error("Aekiro Hierarchy: GameObject already exist with name: %s !", name);
|
||
aekiro_gameobject.name = "o" + inst.GetUID();
|
||
name = aekiro_gameobject.name;
|
||
}
|
||
this.gos[name] = inst;
|
||
},
|
||
removeGO: function(name) {
|
||
delete this.gos[name];
|
||
},
|
||
setGoName: function(oldName, newName) {
|
||
if (!this.gos[oldName]) {
|
||
throw new Error("ProUI-goManager.setGoName() : game object to be renamed not found");
|
||
}
|
||
if (this.gos.hasOwnProperty(newName)) {
|
||
throw new Error("ProUI-goManager.setGoName() : game object already exist with name: " + name);
|
||
}
|
||
this.gos[newName] = this.gos[oldName];
|
||
this.removeGO(oldName);
|
||
},
|
||
getName: function(inst) {
|
||
var key;
|
||
for (key in this.gos) {
|
||
if (this.gos[key] == inst) {
|
||
return key;
|
||
}
|
||
}
|
||
return false;
|
||
},
|
||
removeGO2: function(inst) {
|
||
var key;
|
||
for (key in this.gos) {
|
||
if (this.gos[key] == inst) {
|
||
this.removeGO(key);
|
||
}
|
||
}
|
||
},
|
||
createInstance: function(objectClass, layer, x, y) {
|
||
var inst = this.runtime.CreateInstance(this.runtime.GetObjectClassByName(objectClass), layer, x, y);
|
||
const b = this.runtime.GetEventSheetManager();
|
||
b.BlockFlushingInstances(!0);
|
||
b.BlockFlushingInstances(!1);
|
||
return inst;
|
||
},
|
||
clone: function(template, name, parent, layer, x, y, onNodeCreated) {
|
||
if (this.gos[name]) {
|
||
console.error("Aekiro GameObject: GameObject already exist with name: %s !", name);
|
||
return;
|
||
}
|
||
if (typeof parent === 'string') {
|
||
parent = this.gos[parent];
|
||
}
|
||
if (parent) {
|
||
var wp = parent.GetWorldInfo();
|
||
var res = this.globalToLocal3(x, y, 0, wp.GetX(), wp.GetY(), wp.GetAngle());
|
||
x = res.x;
|
||
y = res.y;
|
||
}
|
||
var inst = this._clone(template, name, parent, layer, x, y, onNodeCreated);
|
||
inst.GetUnsavedDataMap().aekiro_gameobject.children_update();
|
||
inst.GetUnsavedDataMap().aekiro_gameobject.updateZindex();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
aekiro_gameobject.eventManager.emit("cloned");
|
||
return inst;
|
||
},
|
||
_clone: function(t_node, name, parent, layer, x, y, onNodeCreated) {
|
||
this.haltNext = true;
|
||
var inst = this.createInstance(t_node.type, layer);
|
||
this.haltNext = false;
|
||
var b;
|
||
try {
|
||
b = JSON.parse(t_node.json);
|
||
} catch (a) {
|
||
return void console.error("Failed to load from JSON string: ", a);
|
||
}
|
||
inst.LoadFromJson(b, !0);
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
inst.GetUnsavedDataMap().zindex = t_node.zindex;
|
||
inst.GetSdkInstance().CallAction(aekiro_gameobject.acts.MoveToLayer, layer);
|
||
aekiro_gameobject.name = "";
|
||
aekiro_gameobject.parentName = "";
|
||
if (name)
|
||
aekiro_gameobject.name = name;
|
||
this.addGO(inst);
|
||
if (parent) {
|
||
parent.GetUnsavedDataMap().aekiro_gameobject.children_add(inst);
|
||
}
|
||
var wi = inst.GetWorldInfo();
|
||
wi.SetX(x, true);
|
||
wi.SetY(y, true);
|
||
wi.SetBboxChanged();
|
||
if (onNodeCreated)
|
||
onNodeCreated(inst);
|
||
inst._TriggerOnCreated();
|
||
var child;
|
||
for (var i = 0, l = t_node.children.length; i < l; i++) {
|
||
child = t_node.children[i];
|
||
this._clone(child, null, inst, layer, child.x, child.y, onNodeCreated);
|
||
}
|
||
return inst;
|
||
},
|
||
globalToLocal3: function(x, y, a, p_x, p_y, p_angle) {
|
||
var res = {};
|
||
res.x = (x - p_x) * Math.cos(p_angle) + (y - p_y) * Math.sin(p_angle);
|
||
res.y = -(x - p_x) * Math.sin(p_angle) + (y - p_y) * Math.cos(p_angle);
|
||
res.angle = a - p_angle;
|
||
return res;
|
||
},
|
||
registerGameObjects: function() {
|
||
var aekiro_gameobjectBehaviorBase = this.runtime._pluginManager._behaviorsByCtor.get(C3.Behaviors.aekiro_gameobject);
|
||
if (!aekiro_gameobjectBehaviorBase)
|
||
return;
|
||
var insts = aekiro_gameobjectBehaviorBase.GetInstances();
|
||
var l = insts.length;
|
||
for (var i = 0; i < l; i++) {
|
||
if (!insts[i].IsDestroyed()) {
|
||
this.addGO(insts[i]);
|
||
}
|
||
}
|
||
},
|
||
createSceneGraph: function() {
|
||
var key, go, aekiro_gameobject;
|
||
var parentSameLayer = {};
|
||
for (key in this.gos) {
|
||
go = this.gos[key];
|
||
aekiro_gameobject = go.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (aekiro_gameobject.parentName && this.gos[aekiro_gameobject.parentName]) {
|
||
this.gos[aekiro_gameobject.parentName].GetUnsavedDataMap().aekiro_gameobject.children_add(go);
|
||
}
|
||
if (aekiro_gameobject.parentSameLayer) {
|
||
parentSameLayer[key] = go;
|
||
}
|
||
}
|
||
for (key in parentSameLayer) {
|
||
go = parentSameLayer[key];
|
||
aekiro_gameobject = go.GetUnsavedDataMap().aekiro_gameobject;
|
||
aekiro_gameobject.children_addFromLayer(aekiro_gameobject.GetWorldInfo().GetLayer());
|
||
}
|
||
for (key in this.gos) {
|
||
this.gos[key].GetUnsavedDataMap().aekiro_gameobject.children_update();
|
||
}
|
||
this.eventManager.emit("childrenRegistred");
|
||
},
|
||
cleanSceneGraph: function() {
|
||
var key, inst;
|
||
for (key in this.gos) {
|
||
inst = this.gos[key];
|
||
inst.GetUnsavedDataMap().aekiro_gameobject.removeFromParent();
|
||
}
|
||
}
|
||
};
|
||
globalThis.Aekiro.button = class aekiro_button extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
}
|
||
button_constructor() {
|
||
this.proui = this.GetRuntime().GetSingleGlobalObjectClassByCtor(C3.Plugins.aekiro_proui);
|
||
if (this.proui) {
|
||
this.proui = this.proui.GetSingleGlobalInstance().GetSdkInstance();
|
||
}
|
||
this.proui.isTypeValid(this.GetObjectInstance(), [C3.Plugins.Sprite, C3.Plugins.NinePatch, C3.Plugins.TiledBg], "Pro UI: Button behavior is only applicable to Sprite, 9-patch or tiled backgrounds objects.");
|
||
this.inst = this.GetObjectInstance();
|
||
this.wi = this.inst.GetWorldInfo();
|
||
this.goManager = globalThis.aekiro_goManager;
|
||
this.scrollViews = globalThis.aekiro_scrollViewManager.scrollViews;
|
||
this.aekiro_dialogManager = globalThis.aekiro_dialogManager;
|
||
this.GetObjectInstance().GetUnsavedDataMap().aekiro_button = this;
|
||
this.isInstanceOfSprite = this.GetObjectInstance().GetPlugin().constructor == C3.Plugins.Sprite;
|
||
this.STATES = {
|
||
NORMAL: 0,
|
||
HOVER: 1,
|
||
CLICKED: 2,
|
||
DISABLED: 3,
|
||
FOCUSED: 4
|
||
};
|
||
this.isOnMobile = C3.Platform.IsMobile;
|
||
this.isTouchStarted = false;
|
||
this.isMouseEnter = false;
|
||
this.isFocused = false;
|
||
this.callbacks = [];
|
||
this.frameAnim = [];
|
||
this.initProps = {
|
||
animationFrame: null,
|
||
animationName: null,
|
||
color: null
|
||
};
|
||
}
|
||
PostCreate() {
|
||
this.aekiro_gameobject = this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject;
|
||
this.sdkInstance = this.GetObjectInstance().GetSdkInstance();
|
||
this.sdkInstance_callAction = this.sdkInstance.CallAction;
|
||
this.sdkInstance_callExpression = this.sdkInstance.CallExpression;
|
||
this.sdkInstance_acts = this.GetObjectInstance().GetPlugin().constructor.Acts;
|
||
this.sdkInstance_exps = this.GetObjectInstance().GetPlugin().constructor.Exps;
|
||
this.onPropsLoaded();
|
||
this.updateViewTick();
|
||
}
|
||
onPropsLoaded() {
|
||
this.useStates = true;
|
||
if (!this.isInstanceOfSprite || (this.frame_normal == "" && this.frame_hover == "" && this.frame_clicked == "" && this.frame_disabled == "")) {
|
||
this.useStates = false;
|
||
}
|
||
this.state = this.isEnabled ? this.STATES.NORMAL : this.STATES.DISABLED;
|
||
this.setInitProps();
|
||
this.initSounds();
|
||
this.initFrameAnim();
|
||
this.initAnimations();
|
||
this.initColors();
|
||
}
|
||
onInitPropsLoaded() {
|
||
var t = this.initProps.color;
|
||
this.initProps.color = new C3.Color();
|
||
this.initProps.color.setFromJSON(t);
|
||
}
|
||
updateView() {
|
||
this.setFrameAnim(this.state);
|
||
this.setColor(this.state);
|
||
}
|
||
updateViewTick() {
|
||
this.updateV = true;
|
||
this._StartTicking();
|
||
}
|
||
setEnabled(isEnabled) {
|
||
if (this.isEnabled == isEnabled)
|
||
return;
|
||
this.isEnabled = isEnabled;
|
||
this.state = isEnabled ? this.STATES.NORMAL : this.STATES.DISABLED;
|
||
this.setFrameAnim(this.state);
|
||
this.setColor(this.state);
|
||
}
|
||
parseFrameAnim(frameAnim, defaults) {
|
||
if (frameAnim == undefined)
|
||
frameAnim = "";
|
||
frameAnim = frameAnim.split('/');
|
||
var frame, anim;
|
||
if (isNaN(parseInt(frameAnim[0]))) {
|
||
anim = frameAnim[0];
|
||
frame = parseInt(frameAnim[1])
|
||
} else {
|
||
anim = frameAnim[1];
|
||
frame = parseInt(frameAnim[0]);
|
||
}
|
||
if (isNaN(frame)) {
|
||
frame = defaults ? defaults["f"] : this.initProps.animationFrame;
|
||
}
|
||
if (!isNaN(anim) || !anim) {
|
||
anim = defaults ? defaults["a"] : this.initProps.animationName;
|
||
}
|
||
var res = {
|
||
"f": frame,
|
||
"a": anim
|
||
};
|
||
return res;
|
||
}
|
||
parseColor(color, defaultColor) {
|
||
if (color) {
|
||
color = color.split(",");
|
||
color = new C3.Color(color[0] / 255,color[1] / 255,color[2] / 255,1);
|
||
} else {
|
||
if (defaultColor !== undefined) {
|
||
color = defaultColor;
|
||
} else {
|
||
color = this.initProps.color;
|
||
}
|
||
}
|
||
return color;
|
||
}
|
||
initSounds() {
|
||
var map = this.GetObjectInstance().GetUnsavedDataMap();
|
||
if (!map.audioSources) {
|
||
map.audioSources = {};
|
||
}
|
||
var AudioSource = globalThis.AudioSource;
|
||
this.audioSources = map.audioSources;
|
||
this.audioSources.click = new AudioSource(this.clickSound,this.GetRuntime());
|
||
this.audioSources.hover = new AudioSource(this.hoverSound,this.GetRuntime());
|
||
this.audioSources.focus = new AudioSource(this.focusSound,this.GetRuntime());
|
||
}
|
||
initColors() {
|
||
this.colors = [];
|
||
this.colors[this.STATES.NORMAL] = this.parseColor(this.color_normal);
|
||
this.colors[this.STATES.HOVER] = this.parseColor(this.color_hover, null);
|
||
this.colors[this.STATES.CLICKED] = this.parseColor(this.color_clicked, null);
|
||
this.colors[this.STATES.DISABLED] = this.parseColor(this.color_disabled);
|
||
this.colors[this.STATES.FOCUSED] = this.parseColor(this.color_focus, null);
|
||
}
|
||
setColor(state) {
|
||
var color;
|
||
if (this.isFocused) {
|
||
if (this.state == this.STATES.NORMAL) {
|
||
color = this.colors[this.STATES.FOCUSED] || this.colors[this.STATES.NORMAL];
|
||
} else {
|
||
color = this.colors[state] || this.colors[this.STATES.FOCUSED];
|
||
if (!this.colors[state] && !this.colors[this.STATES.FOCUSED]) {
|
||
color = this.colors[this.STATES.NORMAL];
|
||
}
|
||
}
|
||
} else {
|
||
color = this.colors[state];
|
||
}
|
||
if (color) {
|
||
this.wi.SetUnpremultipliedColor(color);
|
||
this.wi.SetBboxChanged();
|
||
}
|
||
}
|
||
setInitProps() {
|
||
if (this.isInstanceOfSprite) {
|
||
this.initProps.animationFrame = this.initProps.animationFrame === null ? this.sdkInstance.CallExpression(this.sdkInstance_exps.AnimationFrame) : this.initProps.animationFrame;
|
||
this.initProps.animationName = this.initProps.animationName || this.sdkInstance.CallExpression(this.sdkInstance_exps.AnimationName);
|
||
}
|
||
this.initProps.color = this.initProps.color || this.wi.GetUnpremultipliedColor();
|
||
}
|
||
initFrameAnim() {
|
||
if (!this.useStates)
|
||
return;
|
||
this.frameAnim[this.STATES.NORMAL] = this.parseFrameAnim(this.frame_normal);
|
||
this.frameAnim[this.STATES.HOVER] = this.parseFrameAnim(this.frame_hover, {
|
||
"f": null,
|
||
"a": null
|
||
});
|
||
this.frameAnim[this.STATES.CLICKED] = this.parseFrameAnim(this.frame_clicked, {
|
||
"f": null,
|
||
"a": null
|
||
});
|
||
this.frameAnim[this.STATES.DISABLED] = this.parseFrameAnim(this.frame_disabled);
|
||
this.frameAnim[this.STATES.FOCUSED] = this.parseFrameAnim(this.frame_focus, {
|
||
"f": null,
|
||
"a": null
|
||
});
|
||
}
|
||
setFrameAnim(state) {
|
||
if (!this.useStates) {
|
||
return;
|
||
}
|
||
var frame, anim;
|
||
if (this.isFocused) {
|
||
if (this.state == this.STATES.NORMAL) {
|
||
frame = (this.frameAnim[this.STATES.FOCUSED]["f"] === null) ? this.frameAnim[this.STATES.NORMAL]["f"] : this.frameAnim[this.STATES.FOCUSED]["f"];
|
||
anim = this.frameAnim[this.STATES.FOCUSED]["a"] || this.frameAnim[this.STATES.NORMAL]["a"];
|
||
} else {
|
||
if (this.frameAnim[state]["f"] == null && !this.frameAnim[state]["a"]) {
|
||
frame = this.frameAnim[this.STATES.NORMAL]["f"];
|
||
anim = this.frameAnim[this.STATES.NORMAL]["a"];
|
||
} else {
|
||
frame = (this.frameAnim[state]["f"] === null) ? this.frameAnim[this.STATES.FOCUSED]["f"] : this.frameAnim[state]["f"];
|
||
anim = this.frameAnim[state]["a"] || this.frameAnim[this.STATES.FOCUSED]["a"];
|
||
}
|
||
}
|
||
} else {
|
||
frame = this.frameAnim[state]["f"];
|
||
anim = this.frameAnim[state]["a"];
|
||
}
|
||
if (anim) {
|
||
this.sdkInstance.CallAction(this.sdkInstance_acts.SetAnim, anim, 0);
|
||
}
|
||
if (frame !== null) {
|
||
this.sdkInstance.CallAction(this.sdkInstance_acts.SetAnimFrame, frame, 0);
|
||
}
|
||
}
|
||
initAnimations() {
|
||
this.currentDelta = {
|
||
x: 0,
|
||
y: 0,
|
||
width: 0,
|
||
height: 0
|
||
};
|
||
this.targetDelta = {
|
||
x: 0,
|
||
y: 0,
|
||
width: 0,
|
||
height: 0
|
||
};
|
||
this.tween = new Tween["Tween"](this.currentDelta);
|
||
}
|
||
setAnimations(type) {
|
||
this.prev = {
|
||
x: this.currentDelta.x,
|
||
y: this.currentDelta.y,
|
||
width: this.currentDelta.width,
|
||
height: this.currentDelta.height
|
||
};
|
||
if (type == 1) {
|
||
this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"])["to"](this.targetDelta, 200);
|
||
} else if (type == 2) {
|
||
this.tween["easing"](Tween["Easing"]["Elastic"]["Out"])["to"](this.targetDelta, 500);
|
||
} else if (type == 3) {
|
||
this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"])["to"](this.targetDelta, 100);
|
||
} else if (type == 4) {
|
||
this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"])["to"](this.targetDelta, 100);
|
||
} else if (type == 5) {
|
||
this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"])["to"](this.targetDelta, 100);
|
||
} else if (type == 6) {
|
||
this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"])["to"](this.targetDelta, 100);
|
||
}
|
||
}
|
||
getTargetDelta(type, state) {
|
||
var wi = this.wi;
|
||
var t = {
|
||
x: 0,
|
||
y: 0,
|
||
width: 0,
|
||
height: 0
|
||
};
|
||
var f = 0.1;
|
||
if (state == "click") {
|
||
f = this.clickAnimationFactor;
|
||
} else if (state == "hover") {
|
||
f = this.hoverAnimationFactor;
|
||
} else if (state == "focus") {
|
||
f = this.focusAnimationFactor;
|
||
}
|
||
if (type == 1 || type == 2) {
|
||
t.width = wi.GetWidth() * f;
|
||
t.height = wi.GetHeight() * f;
|
||
} else if (type == 3) {
|
||
t.y = wi.GetHeight() * f;
|
||
} else if (type == 4) {
|
||
t.y = -wi.GetHeight() * f;
|
||
} else if (type == 5) {
|
||
t.x = -wi.GetWidth() * f;
|
||
} else if (type == 6) {
|
||
t.x = wi.GetWidth() * f;
|
||
}
|
||
return t;
|
||
}
|
||
OnAnyInputDown(x, y) {
|
||
if (this.wi.ContainsPoint(x, y)) {
|
||
this.OnInputDown(x, y);
|
||
}
|
||
}
|
||
OnAnyInputMove(x, y) {
|
||
if (this.isOnMobile)
|
||
return;
|
||
if (this.wi.ContainsPoint(x, y)) {
|
||
if (!this.isMouseEnter) {
|
||
this.OnMouseEnter(x, y);
|
||
}
|
||
} else {
|
||
if (this.isMouseEnter) {
|
||
this.OnMouseLeave();
|
||
}
|
||
}
|
||
}
|
||
setFocused(isFocused) {
|
||
if (!this.isEnabled)
|
||
return;
|
||
if (isFocused == this.isFocused)
|
||
return;
|
||
this.isFocused = isFocused;
|
||
if (isFocused) {
|
||
this.setFrameAnim(this.state);
|
||
this.setColor(this.state);
|
||
this.audioSources.focus.play();
|
||
if (this.focusAnimation > 0) {
|
||
this.tween["stop"]();
|
||
this.targetDelta_focus = this.getTargetDelta(this.focusAnimation, "focus");
|
||
this.targetDelta.width += this.targetDelta_focus.width;
|
||
this.targetDelta.height += this.targetDelta_focus.height;
|
||
this.targetDelta.x += this.targetDelta_focus.x;
|
||
this.targetDelta.y += this.targetDelta_focus.y;
|
||
this.setAnimations(this.focusAnimation);
|
||
;this._StartTicking();
|
||
this.tween["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
}
|
||
if (this.OnFocusedC)
|
||
this.OnFocusedC();
|
||
} else {
|
||
this.setFrameAnim(this.STATES.NORMAL);
|
||
this.setColor(this.STATES.NORMAL);
|
||
this.setFrameAnim(this.state);
|
||
this.setColor(this.state);
|
||
if (this.focusAnimation > 0) {
|
||
this.tween["stop"]();
|
||
this.targetDelta.width -= this.targetDelta_focus.width;
|
||
this.targetDelta.height -= this.targetDelta_focus.height;
|
||
this.targetDelta.x -= this.targetDelta_focus.x;
|
||
this.targetDelta.y -= this.targetDelta_focus.y;
|
||
this.setAnimations(this.focusAnimation);
|
||
this._StartTicking();
|
||
this.tween["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
}
|
||
if (this.OnUnFocusedC)
|
||
this.OnUnFocusedC();
|
||
}
|
||
}
|
||
OnMouseEnter(x, y) {
|
||
if (!this.isClickable(x, y))
|
||
return;
|
||
if (this.isTouchStarted)
|
||
return;
|
||
this.isMouseEnter = true;
|
||
this.state = this.STATES.HOVER;
|
||
this.setFrameAnim(this.state);
|
||
this.setColor(this.state);
|
||
this.audioSources.hover.play();
|
||
if (this.OnMouseEnterC)
|
||
this.OnMouseEnterC();
|
||
if (this.hoverAnimation > 0) {
|
||
var wi = this.wi;
|
||
this.tween["stop"]();
|
||
this.targetDelta_hover = this.getTargetDelta(this.hoverAnimation, "hover");
|
||
this.targetDelta.width += this.targetDelta_hover.width;
|
||
this.targetDelta.height += this.targetDelta_hover.height;
|
||
this.targetDelta.x += this.targetDelta_hover.x;
|
||
this.targetDelta.y += this.targetDelta_hover.y;
|
||
this.setAnimations(this.hoverAnimation);
|
||
this._StartTicking();
|
||
this.tween["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
}
|
||
}
|
||
async OnInputDown(x, y) {
|
||
var res = await this.isOnMovingScrollView();
|
||
if (res)
|
||
return;
|
||
if (!this.isClickable(x, y) || this.isTouchStarted)
|
||
return;
|
||
this.isTouchStarted = true;
|
||
if (this.clickAnimation > 0) {
|
||
this.tween["stop"]();
|
||
this.targetDelta_click = this.getTargetDelta(this.clickAnimation, "click");
|
||
this.targetDelta.width += this.targetDelta_click.width;
|
||
this.targetDelta.height += this.targetDelta_click.height;
|
||
this.targetDelta.x += this.targetDelta_click.x;
|
||
this.targetDelta.y += this.targetDelta_click.y;
|
||
this.setAnimations(this.clickAnimation);
|
||
this._StartTicking();
|
||
this.tween["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
}
|
||
if (!this.isFocused && this.focusAnimation > 0) {
|
||
this.tween["stop"]();
|
||
this.targetDelta_focus = this.getTargetDelta(this.focusAnimation, "focus");
|
||
this.targetDelta.width += this.targetDelta_focus.width;
|
||
this.targetDelta.height += this.targetDelta_focus.height;
|
||
this.targetDelta.x += this.targetDelta_focus.x;
|
||
this.targetDelta.y += this.targetDelta_focus.y;
|
||
this.setAnimations(this.focusAnimation);
|
||
this._StartTicking();
|
||
this.tween["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
}
|
||
if (!this.isFocused) {
|
||
if (this.OnFocusedC)
|
||
this.OnFocusedC();
|
||
}
|
||
this.isFocused = true;
|
||
this.state = this.STATES.CLICKED;
|
||
this.setFrameAnim(this.state);
|
||
this.setColor(this.state);
|
||
this.audioSources.click.play();
|
||
}
|
||
OnAnyInputUp(x, y) {
|
||
if (!this.isTouchStarted)
|
||
return;
|
||
this.isTouchStarted = false;
|
||
if (this.clickAnimation > 0 && this.state != this.STATES.NORMAL) {
|
||
this.tween["stop"]();
|
||
this.targetDelta.width -= this.targetDelta_click.width;
|
||
this.targetDelta.height -= this.targetDelta_click.height;
|
||
this.targetDelta.x -= this.targetDelta_click.x;
|
||
this.targetDelta.y -= this.targetDelta_click.y;
|
||
this.setAnimations(this.clickAnimation);
|
||
this._StartTicking();
|
||
this.tween["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
}
|
||
if (this.wi.ContainsPoint(x, y)) {
|
||
if (this.isOnMobile) {
|
||
this.state = this.STATES.NORMAL;
|
||
} else {
|
||
this.state = this.STATES.HOVER;
|
||
}
|
||
this.Callbacks();
|
||
} else {
|
||
this.state = this.STATES.NORMAL;
|
||
}
|
||
this.setFrameAnim(this.state);
|
||
this.setColor(this.state);
|
||
}
|
||
Callbacks() {
|
||
for (var i = 0, l = this.callbacks.length; i < l; i++) {
|
||
this.callbacks[i]();
|
||
}
|
||
if (this.OnAnyInputUpC)
|
||
this.OnAnyInputUpC();
|
||
}
|
||
OnMouseLeave() {
|
||
this.isMouseEnter = false;
|
||
if (this.state != this.STATES.DISABLED) {
|
||
this.state = this.STATES.NORMAL;
|
||
}
|
||
this.setFrameAnim(this.state);
|
||
this.setColor(this.state);
|
||
if (this.hoverAnimation > 0) {
|
||
this.targetDelta.width -= this.targetDelta_hover.width;
|
||
this.targetDelta.height -= this.targetDelta_hover.height;
|
||
this.targetDelta.x -= this.targetDelta_hover.x;
|
||
this.targetDelta.y -= this.targetDelta_hover.y;
|
||
}
|
||
if (this.clickAnimation > 0 && this.isTouchStarted) {
|
||
this.targetDelta.width -= this.targetDelta_click.width;
|
||
this.targetDelta.height -= this.targetDelta_click.height;
|
||
this.targetDelta.x -= this.targetDelta_click.x;
|
||
this.targetDelta.y -= this.targetDelta_click.y;
|
||
}
|
||
if (this.hoverAnimation > 0 || (this.clickAnimation > 0 && this.isTouchStarted)) {
|
||
this.tween["stop"]();
|
||
this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"])["to"](this.targetDelta, 100);
|
||
this._StartTicking();
|
||
this.tween["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
}
|
||
if (this.OnMouseLeaveC)
|
||
this.OnMouseLeaveC();
|
||
}
|
||
setIgnoreInput(state) {
|
||
this.ignoreInput = state;
|
||
}
|
||
Tick() {
|
||
if (this.updateV) {
|
||
this.updateView();
|
||
this._StopTicking();
|
||
this.updateV = false;
|
||
return;
|
||
}
|
||
if (this.isTweenPlaying) {
|
||
this.isTweenPlaying = false;
|
||
}
|
||
if (this.tween["isPlaying"]) {
|
||
this.tween["update"](this.GetRuntime().GetWallTime() * 1000);
|
||
this.isTweenPlaying = true;
|
||
}
|
||
if (this.isTweenPlaying) {
|
||
var wi = this.wi;
|
||
this.wi.OffsetXY(this.currentDelta.x - this.prev.x, this.currentDelta.y - this.prev.y);
|
||
this.wi.SetSize(wi.GetWidth() + this.currentDelta.width - this.prev.width, wi.GetHeight() + this.currentDelta.height - this.prev.height);
|
||
this.wi.SetBboxChanged();
|
||
this.prev = {
|
||
x: this.currentDelta.x,
|
||
y: this.currentDelta.y,
|
||
width: this.currentDelta.width,
|
||
height: this.currentDelta.height
|
||
};
|
||
} else {
|
||
this._StopTicking();
|
||
}
|
||
}
|
||
isClickable(x, y) {
|
||
if (x === undefined || y === undefined) {
|
||
x = this.wi.GetBoundingBox().getLeft() + 10;
|
||
y = this.wi.GetBoundingBox().getTop() + 10;
|
||
}
|
||
if (this.ignoreInput === 1 || this.proui.ignoreInput) {
|
||
return false;
|
||
}
|
||
var isVisible = (this.wi.GetLayer().IsVisible() && this.wi.IsVisible());
|
||
var isInsideScrollView = this.isInsideScrollView(x, y);
|
||
var isUnder = false;
|
||
if (this.ignoreInput === 2 && this.aekiro_dialogManager) {
|
||
isUnder = this.aekiro_dialogManager.isInstanceUnder(this.wi.GetLayer().GetIndex());
|
||
}
|
||
return this.isEnabled && isVisible && !isUnder && isInsideScrollView;
|
||
}
|
||
isInsideScrollView(x, y) {
|
||
var insideScrollView = true;
|
||
var scrollView = this.scrollViews["l" + this.inst.GetWorldInfo().GetLayer().GetIndex()];
|
||
if (scrollView) {
|
||
insideScrollView = scrollView.GetWorldInfo().ContainsPoint(x, y);
|
||
}
|
||
return insideScrollView;
|
||
}
|
||
isOnMovingScrollView() {
|
||
var scrollView = this.scrollViews["l" + this.inst.GetWorldInfo().GetLayer().GetIndex()];
|
||
if (scrollView) {
|
||
return new Promise(resolve=>{
|
||
setTimeout(()=>{
|
||
if (scrollView.GetUnsavedDataMap().aekiro_scrollView.isMoving()) {
|
||
console.log("moving");
|
||
resolve(true);
|
||
} else {
|
||
resolve(false);
|
||
}
|
||
}
|
||
, 10);
|
||
}
|
||
);
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
}
|
||
;
|
||
globalThis.Aekiro.button.Cnds = {
|
||
OnMouseEnter() {
|
||
return true;
|
||
},
|
||
OnMouseLeave() {
|
||
return true;
|
||
},
|
||
IsEnabled() {
|
||
return this.isEnabled;
|
||
},
|
||
IsClickable() {
|
||
return this.isClickable();
|
||
},
|
||
OnFocused() {
|
||
return true;
|
||
},
|
||
OnUnFocused() {
|
||
return true;
|
||
},
|
||
IsFocused() {
|
||
return this.isFocused;
|
||
},
|
||
OnClicked() {
|
||
return true;
|
||
}
|
||
};
|
||
globalThis.Aekiro.button.Acts = {
|
||
setEnabled(isEnabled) {
|
||
this.setEnabled(isEnabled);
|
||
},
|
||
SetFocused(v) {
|
||
this.setFocused(v);
|
||
},
|
||
SetIgnoreInput(s) {
|
||
this.setIgnoreInput(s);
|
||
},
|
||
SetClickSoundVolume(v) {
|
||
this.audioSources.click.setVolume(v);
|
||
},
|
||
SetHoverSoundVolume(v) {
|
||
this.audioSources.hover.setVolume(v);
|
||
},
|
||
SimulateClick() {
|
||
if (this.isTouchStarted)
|
||
return;
|
||
var x = this.wi.GetBoundingBox().getLeft() + 10;
|
||
var y = this.wi.GetBoundingBox().getTop() + 10;
|
||
this.OnInputDown(x, y);
|
||
setTimeout(()=>{
|
||
x = this.wi.GetBoundingBox().getLeft() - 50;
|
||
y = this.wi.GetBoundingBox().getTop() - 50;
|
||
this.OnAnyInputUp(x, y);
|
||
this.Callbacks();
|
||
}
|
||
, 100);
|
||
},
|
||
setNormalFrame(v) {
|
||
this.frame_normal = v;
|
||
this.initFrameAnim();
|
||
this.setFrameAnim(this.state);
|
||
},
|
||
setHoverFrame(v) {
|
||
this.frame_hover = v;
|
||
this.initFrameAnim();
|
||
},
|
||
setClickedFrame(v) {
|
||
this.frame_clicked = v;
|
||
this.initFrameAnim();
|
||
},
|
||
setDisabledFrame(v) {
|
||
this.frame_disabled = v;
|
||
this.initFrameAnim();
|
||
},
|
||
setFocusFrame(v) {
|
||
this.frame_focus = v;
|
||
this.initFrameAnim();
|
||
},
|
||
setClickAnimation(v) {
|
||
this.clickAnimation = v;
|
||
this.initAnimations();
|
||
},
|
||
setHoverAnimation(v) {
|
||
this.hoverAnimation = v;
|
||
this.initAnimations();
|
||
},
|
||
setFocusAnimation(v) {
|
||
this.focusAnimation = v;
|
||
this.initAnimations();
|
||
},
|
||
setNormalColor(v) {
|
||
this.color_normal = v;
|
||
this.initColors();
|
||
},
|
||
setHoverColor(v) {
|
||
this.color_hover = v;
|
||
this.initColors();
|
||
},
|
||
setClickedColor(v) {
|
||
this.color_clicked = v;
|
||
this.initColors();
|
||
},
|
||
setFocusColor(v) {
|
||
this.color_focus = v;
|
||
this.initColors();
|
||
}
|
||
};
|
||
globalThis.Aekiro.checkbox = class aekiro_checkbox extends globalThis.Aekiro.button {
|
||
constructor(behInst, properties) {
|
||
super(behInst, properties);
|
||
}
|
||
checkbox_constructor() {
|
||
this.button_constructor();
|
||
this.frameAnim = [[], []];
|
||
}
|
||
initFrameAnim() {
|
||
this.useStates = true;
|
||
if (!this.isInstanceOfSprite || (this.frame_normal == "" && this.frame_hover == "" && this.frame_disabled == "")) {
|
||
this.useStates = false;
|
||
return;
|
||
}
|
||
this.cur_AnimationFrame = this.sdkInstance.CallExpression(this.sdkInstance_exps.AnimationFrame);
|
||
this.cur_AnimationName = this.sdkInstance.CallExpression(this.sdkInstance_exps.AnimationName);
|
||
var f = this.frame_normal.split(',');
|
||
this.frameAnim[0][this.STATES.NORMAL] = this.parseFrameAnim(f[0]);
|
||
this.frameAnim[1][this.STATES.NORMAL] = this.parseFrameAnim(f[1]);
|
||
f = this.frame_hover.split(',');
|
||
this.frameAnim[0][this.STATES.HOVER] = this.parseFrameAnim(f[0], {
|
||
"f": null,
|
||
"a": null
|
||
});
|
||
this.frameAnim[1][this.STATES.HOVER] = this.parseFrameAnim(f[1], {
|
||
"f": null,
|
||
"a": null
|
||
});
|
||
f = this.frame_disabled.split(',');
|
||
this.frameAnim[0][this.STATES.DISABLED] = this.parseFrameAnim(f[0]);
|
||
this.frameAnim[1][this.STATES.DISABLED] = this.parseFrameAnim(f[1]);
|
||
f = this.frame_focus.split(',');
|
||
this.frameAnim[0][this.STATES.FOCUSED] = this.parseFrameAnim(f[0], {
|
||
"f": null,
|
||
"a": null
|
||
});
|
||
this.frameAnim[1][this.STATES.FOCUSED] = this.parseFrameAnim(f[1], {
|
||
"f": null,
|
||
"a": null
|
||
});
|
||
}
|
||
setFrameAnim(state) {
|
||
if (!this.useStates) {
|
||
return;
|
||
}
|
||
if (state == this.STATES.CLICKED)
|
||
state = this.STATES.NORMAL;
|
||
var v = this.value ? 1 : 0;
|
||
var frame, anim;
|
||
if (this.isFocused) {
|
||
if (this.state == this.STATES.NORMAL) {
|
||
frame = (this.frameAnim[v][this.STATES.FOCUSED]["f"] === null) ? this.frameAnim[v][this.STATES.NORMAL]["f"] : this.frameAnim[v][this.STATES.FOCUSED]["f"];
|
||
anim = this.frameAnim[v][this.STATES.FOCUSED]["a"] || this.frameAnim[v][this.STATES.NORMAL]["a"];
|
||
} else {
|
||
if (this.frameAnim[v][state]["f"] == null && !this.frameAnim[v][state]["a"]) {
|
||
frame = this.frameAnim[v][this.STATES.NORMAL]["f"];
|
||
anim = this.frameAnim[v][this.STATES.NORMAL]["a"];
|
||
} else {
|
||
frame = (this.frameAnim[v][state]["f"] === null) ? this.frameAnim[v][this.STATES.FOCUSED]["f"] : this.frameAnim[v][state]["f"];
|
||
anim = this.frameAnim[v][state]["a"] || this.frameAnim[v][this.STATES.FOCUSED]["a"];
|
||
}
|
||
}
|
||
} else {
|
||
frame = this.frameAnim[v][state]["f"];
|
||
anim = this.frameAnim[v][state]["a"];
|
||
}
|
||
if (anim) {
|
||
this.sdkInstance.CallAction(this.sdkInstance_acts.SetAnim, anim, 0);
|
||
}
|
||
if (frame !== null) {
|
||
this.sdkInstance.CallAction(this.sdkInstance_acts.SetAnimFrame, frame, 0);
|
||
}
|
||
}
|
||
initColors() {
|
||
this.cur_color = this.wi.GetUnpremultipliedColor();
|
||
this.colors = [[], []];
|
||
var c;
|
||
c = this.color_normal.split(';');
|
||
this.colors[0][this.STATES.NORMAL] = this.parseColor(c[0]);
|
||
this.colors[1][this.STATES.NORMAL] = this.parseColor(c[1], this.colors[0][this.STATES.NORMAL]);
|
||
c = this.color_hover.split(';');
|
||
this.colors[0][this.STATES.HOVER] = this.parseColor(c[0], null);
|
||
this.colors[1][this.STATES.HOVER] = this.parseColor(c[1], this.colors[0][this.STATES.HOVER]);
|
||
c = this.color_clicked.split(';');
|
||
this.colors[0][this.STATES.CLICKED] = this.parseColor(c[0], null);
|
||
this.colors[1][this.STATES.CLICKED] = this.parseColor(c[1], this.colors[0][this.STATES.CLICKED]);
|
||
c = this.color_disabled.split(';');
|
||
this.colors[0][this.STATES.DISABLED] = this.parseColor(c[0]);
|
||
this.colors[1][this.STATES.DISABLED] = this.parseColor(c[1]),
|
||
this.colors[0][this.STATES.DISABLED];
|
||
c = this.color_focus.split(';');
|
||
this.colors[0][this.STATES.FOCUSED] = this.parseColor(c[0], null);
|
||
this.colors[1][this.STATES.FOCUSED] = this.parseColor(c[1], this.colors[0][this.STATES.FOCUSED]);
|
||
}
|
||
setColor(state) {
|
||
var v = this.value ? 1 : 0;
|
||
var color;
|
||
if (this.isFocused) {
|
||
if (this.state == this.STATES.NORMAL) {
|
||
color = this.colors[v][this.STATES.FOCUSED] || this.colors[v][this.STATES.NORMAL];
|
||
} else {
|
||
color = this.colors[v][state] || this.colors[v][this.STATES.FOCUSED];
|
||
if (!this.colors[v][state] && !this.colors[v][this.STATES.FOCUSED]) {
|
||
color = this.colors[v][this.STATES.NORMAL];
|
||
}
|
||
}
|
||
} else {
|
||
color = this.colors[v][state];
|
||
}
|
||
if (color) {
|
||
this.wi.SetUnpremultipliedColor(color);
|
||
this.wi.SetBboxChanged();
|
||
}
|
||
}
|
||
isValueValid(value) {
|
||
if (value == null || value === "") {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
setValue(value) {
|
||
value = !!value;
|
||
value = value ? 1 : 0;
|
||
if (this.value != value) {
|
||
this.value = value;
|
||
this.setFrameAnim(this.state);
|
||
this.setColor(this.state);
|
||
}
|
||
}
|
||
}
|
||
;
|
||
globalThis.aekiro_scrollViewManager = {
|
||
scrollViews: {},
|
||
add: function(inst) {
|
||
this.scrollViews["l" + inst.GetWorldInfo().GetLayer().GetIndex()] = inst;
|
||
},
|
||
remove: function(inst) {
|
||
for (var key in this.scrollViews) {
|
||
if (this.scrollViews[key] == inst) {
|
||
delete this.scrollViews[key];
|
||
}
|
||
}
|
||
},
|
||
isOverlaped: function(inst, x, y) {
|
||
var n = inst.GetRuntime().GetMainRunningLayout().GetLayerCount();
|
||
var scrollView;
|
||
var isOverlaped = false;
|
||
for (var i = inst.GetWorldInfo().GetLayer().GetIndex() + 1, l = n; i < l; i++) {
|
||
scrollView = this.scrollViews["l" + i];
|
||
if (scrollView) {
|
||
if (!scrollView.GetWorldInfo().GetLayer().IsVisible()) {
|
||
continue;
|
||
}
|
||
if (scrollView.GetWorldInfo().ContainsPoint(x, y)) {
|
||
isOverlaped = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return isOverlaped;
|
||
}
|
||
};
|
||
globalThis.aekiro_dialogManager = {
|
||
currentDialogs: [],
|
||
addDialog: function(inst) {
|
||
this.currentDialogs.push(inst);
|
||
},
|
||
removeDialog: function(inst) {
|
||
var i = this.currentDialogs.indexOf(inst);
|
||
if (i != -1) {
|
||
this.currentDialogs.splice(i, 1);
|
||
}
|
||
},
|
||
isDialogOpened: function() {
|
||
return this.currentDialogs.length;
|
||
},
|
||
isModalDialogOpened: function() {
|
||
for (var i = 0; i < this.currentDialogs.length; i++) {
|
||
if (this.currentDialogs[i].GetUnsavedDataMap().aekiro_dialog.isModal) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
},
|
||
isInstanceUnder: function(layerIndex) {
|
||
for (var i = 0, l = this.currentDialogs.length; i < l; i++) {
|
||
if (layerIndex < this.currentDialogs[i].GetWorldInfo().GetLayer().GetIndex()) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
};
|
||
"use strict";
|
||
{
|
||
C3.Plugins.aekiro_proui.Cnds = {
|
||
IsDialogOpened() {
|
||
return globalThis.aekiro_dialogManager.isDialogOpened();
|
||
},
|
||
OnAnyButtonClicked() {
|
||
return true;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.aekiro_proui.Acts = {
|
||
SetInputIgnored(state) {
|
||
this.ignoreInput = state;
|
||
},
|
||
Clone(json, layer, x, y, name, parentName) {
|
||
json = JSON.parse(json);
|
||
var inst = this.aekiro_goManager.clone(json, name, parentName, layer, x, y);
|
||
inst.GetUnsavedDataMap().aekiro_gameobject.updateZindex();
|
||
},
|
||
SetUIAudioVolume(v) {
|
||
this.setUIAudioVolume(v);
|
||
},
|
||
Init() {
|
||
this.Initialise();
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.aekiro_proui.Exps = {};
|
||
}
|
||
'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Touch = class TouchPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Touch.Type = class TouchType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
GetScriptInterfaceClass() {
|
||
return self.ITouchObjectType
|
||
}
|
||
}
|
||
;
|
||
let touchObjectType = null;
|
||
function GetTouchSdkInstance() {
|
||
return touchObjectType.GetSingleGlobalInstance().GetSdkInstance()
|
||
}
|
||
self.ITouchObjectType = class ITouchObjectType extends self.IObjectClass {
|
||
constructor(objectType) {
|
||
super(objectType);
|
||
touchObjectType = objectType;
|
||
objectType.GetRuntime()._GetCommonScriptInterfaces().touch = this
|
||
}
|
||
requestPermission(type) {
|
||
const touchInst = GetTouchSdkInstance();
|
||
if (type === "orientation")
|
||
return touchInst._RequestPermission(0);
|
||
else if (type === "motion")
|
||
return touchInst._RequestPermission(1);
|
||
else
|
||
throw new Error("invalid type");
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const DOM_COMPONENT_ID = "touch";
|
||
C3.Plugins.Touch.Instance = class TouchInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst, DOM_COMPONENT_ID);
|
||
this._touches = new Map;
|
||
this._useMouseInput = false;
|
||
this._isMouseDown = false;
|
||
this._orientCompassHeading = 0;
|
||
this._orientAlpha = 0;
|
||
this._orientBeta = 0;
|
||
this._orientGamma = 0;
|
||
this._accX = 0;
|
||
this._accY = 0;
|
||
this._accZ = 0;
|
||
this._accWithGX = 0;
|
||
this._accWithGY = 0;
|
||
this._accWithGZ = 0;
|
||
this._triggerIndex = 0;
|
||
this._triggerId = 0;
|
||
this._triggerPermission = 0;
|
||
this._curTouchX = 0;
|
||
this._curTouchY = 0;
|
||
this._getTouchIndex = 0;
|
||
this._permissionPromises = [];
|
||
if (properties)
|
||
this._useMouseInput = properties[0];
|
||
this.AddDOMMessageHandler("permission-result", e=>this._OnPermissionResult(e));
|
||
const rt = this.GetRuntime().Dispatcher();
|
||
this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "pointerdown", e=>this._OnPointerDown(e.data)),C3.Disposable.From(rt, "pointermove", e=>this._OnPointerMove(e.data)),C3.Disposable.From(rt, "pointerup", e=>this._OnPointerUp(e.data, false)),C3.Disposable.From(rt, "pointercancel", e=>this._OnPointerUp(e.data, true)),C3.Disposable.From(rt, "deviceorientation", e=>this._OnDeviceOrientation(e.data)),C3.Disposable.From(rt, "deviceorientationabsolute", e=>this._OnDeviceOrientationAbsolute(e.data)),C3.Disposable.From(rt, "devicemotion", e=>this._OnDeviceMotion(e.data)),C3.Disposable.From(rt, "tick2", e=>this._OnTick2()))
|
||
}
|
||
Release() {
|
||
this._touches.clear();
|
||
super.Release()
|
||
}
|
||
_OnPointerDown(e) {
|
||
if (e["pointerType"] === "mouse")
|
||
if (this._useMouseInput)
|
||
this._isMouseDown = true;
|
||
else
|
||
return;
|
||
const pointerId = e["pointerId"];
|
||
if (this._touches.has(pointerId))
|
||
return;
|
||
const x = e["pageX"] - this._runtime.GetCanvasClientX();
|
||
const y = e["pageY"] - this._runtime.GetCanvasClientY();
|
||
const nowTime = e["timeStamp"];
|
||
const index = this._touches.size;
|
||
this._triggerIndex = index;
|
||
this._triggerId = pointerId;
|
||
const touchInfo = C3.New(C3.Plugins.Touch.TouchInfo);
|
||
touchInfo.Init(nowTime, x, y, pointerId, index);
|
||
this._touches.set(pointerId, touchInfo);
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnNthTouchStart);
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnTouchStart);
|
||
this._curTouchX = x;
|
||
this._curTouchY = y;
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnTouchObject)
|
||
}
|
||
_OnPointerMove(e) {
|
||
if (e["pointerType"] === "mouse" && !this._isMouseDown)
|
||
return;
|
||
const touchInfo = this._touches.get(e["pointerId"]);
|
||
if (!touchInfo)
|
||
return;
|
||
const nowTime = e["timeStamp"];
|
||
if (nowTime - touchInfo.GetTime() < 2)
|
||
return;
|
||
const x = e["pageX"] - this._runtime.GetCanvasClientX();
|
||
const y = e["pageY"] - this._runtime.GetCanvasClientY();
|
||
touchInfo.Update(nowTime, x, y, e["width"], e["height"], e["pressure"])
|
||
}
|
||
_OnPointerUp(e, isCancel) {
|
||
if (e["pointerType"] === "mouse")
|
||
if (this._isMouseDown)
|
||
this._isMouseDown = false;
|
||
else
|
||
return;
|
||
const nowTime = e["timeStamp"];
|
||
const pointerId = e["pointerId"];
|
||
const touchInfo = this._touches.get(pointerId);
|
||
if (!touchInfo)
|
||
return;
|
||
this._triggerIndex = touchInfo.GetStartIndex();
|
||
this._triggerId = touchInfo.GetId();
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnNthTouchEnd);
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnTouchEnd);
|
||
if (!isCancel) {
|
||
const tap = touchInfo.ShouldTriggerTap(nowTime);
|
||
if (tap === "single-tap") {
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnTapGesture);
|
||
this._curTouchX = touchInfo.GetX();
|
||
this._curTouchY = touchInfo.GetY();
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnTapGestureObject)
|
||
} else if (tap === "double-tap") {
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnDoubleTapGesture);
|
||
this._curTouchX = touchInfo.GetX();
|
||
this._curTouchY = touchInfo.GetY();
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnDoubleTapGestureObject)
|
||
}
|
||
}
|
||
touchInfo.Release();
|
||
this._touches.delete(pointerId)
|
||
}
|
||
_RequestPermission(type) {
|
||
this._PostToDOMMaybeSync("request-permission", {
|
||
"type": type
|
||
});
|
||
return new Promise((resolve,reject)=>{
|
||
this._permissionPromises.push({
|
||
type,
|
||
resolve,
|
||
reject
|
||
})
|
||
}
|
||
)
|
||
}
|
||
_OnPermissionResult(e) {
|
||
const isGranted = e["result"];
|
||
const type = e["type"];
|
||
this._triggerPermission = type;
|
||
const toResolve = this._permissionPromises.filter(o=>o.type === type);
|
||
for (const o of toResolve)
|
||
o.resolve(isGranted ? "granted" : "denied");
|
||
this._permissionPromises = this._permissionPromises.filter(o=>o.type !== type);
|
||
if (isGranted) {
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnPermissionGranted);
|
||
if (type === 0)
|
||
this._runtime.RequestDeviceOrientationEvent();
|
||
else
|
||
this._runtime.RequestDeviceMotionEvent()
|
||
} else
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnPermissionDenied)
|
||
}
|
||
_OnDeviceOrientation(e) {
|
||
if (typeof e["webkitCompassHeading"] === "number")
|
||
this._orientCompassHeading = e["webkitCompassHeading"];
|
||
else if (e["absolute"])
|
||
this._orientCompassHeading = e["alpha"];
|
||
this._orientAlpha = e["alpha"];
|
||
this._orientBeta = e["beta"];
|
||
this._orientGamma = e["gamma"]
|
||
}
|
||
_OnDeviceOrientationAbsolute(e) {
|
||
this._orientCompassHeading = e["alpha"]
|
||
}
|
||
_OnDeviceMotion(e) {
|
||
const acc = e["acceleration"];
|
||
if (acc) {
|
||
this._accX = acc["x"];
|
||
this._accY = acc["y"];
|
||
this._accZ = acc["z"]
|
||
}
|
||
const withG = e["accelerationIncludingGravity"];
|
||
if (withG) {
|
||
this._accWithGX = withG["x"];
|
||
this._accWithGY = withG["y"];
|
||
this._accWithGZ = withG["z"]
|
||
}
|
||
}
|
||
_OnTick2() {
|
||
const nowTime = performance.now();
|
||
let index = 0;
|
||
for (const touchInfo of this._touches.values()) {
|
||
if (touchInfo.GetTime() <= nowTime - 50)
|
||
touchInfo._SetLastTime(nowTime);
|
||
if (touchInfo.ShouldTriggerHold(nowTime)) {
|
||
this._triggerIndex = touchInfo.GetStartIndex();
|
||
this._triggerId = touchInfo.GetId();
|
||
this._getTouchIndex = index;
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnHoldGesture);
|
||
this._curTouchX = touchInfo.GetX();
|
||
this._curTouchY = touchInfo.GetY();
|
||
this.Trigger(C3.Plugins.Touch.Cnds.OnHoldGestureObject);
|
||
this._getTouchIndex = 0
|
||
}
|
||
++index
|
||
}
|
||
}
|
||
_GetTouchByIndex(index) {
|
||
index = Math.floor(index);
|
||
for (const touchInfo of this._touches.values()) {
|
||
if (index === 0)
|
||
return touchInfo;
|
||
--index
|
||
}
|
||
return null
|
||
}
|
||
_IsClientPosOnCanvas(touchX, touchY) {
|
||
return touchX >= 0 && touchY >= 0 && touchX < this._runtime.GetCanvasCssWidth() && touchY < this._runtime.GetCanvasCssHeight()
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "plugins.touch.debugger";
|
||
return [{
|
||
title: prefix + ".touches",
|
||
properties: [...this._touches.values()].map(ti=>({
|
||
name: "$" + ti.GetId(),
|
||
value: ti.GetX() + ", " + ti.GetY()
|
||
}))
|
||
}]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const tempArr = [];
|
||
C3.Plugins.Touch.Cnds = {
|
||
OnTouchStart() {
|
||
return true
|
||
},
|
||
OnTouchEnd() {
|
||
return true
|
||
},
|
||
IsInTouch() {
|
||
return this._touches.size > 0
|
||
},
|
||
OnTouchObject(objectClass) {
|
||
if (!objectClass)
|
||
return false;
|
||
if (!this._IsClientPosOnCanvas(this._curTouchX, this._curTouchY))
|
||
return false;
|
||
return this._runtime.GetCollisionEngine().TestAndSelectCanvasPointOverlap(objectClass, this._curTouchX, this._curTouchY, false)
|
||
},
|
||
IsTouchingObject(objectClass) {
|
||
if (!objectClass)
|
||
return false;
|
||
const sol = objectClass.GetCurrentSol();
|
||
const instances = sol.GetInstances();
|
||
for (const inst of instances) {
|
||
const wi = inst.GetWorldInfo();
|
||
const layer = wi.GetLayer();
|
||
for (const touchInfo of this._touches.values()) {
|
||
if (!this._IsClientPosOnCanvas(touchInfo.GetX(), touchInfo.GetY()))
|
||
continue;
|
||
const [px,py] = layer.CanvasCssToLayer(touchInfo.GetX(), touchInfo.GetY(), wi.GetTotalZElevation());
|
||
if (wi.ContainsPoint(px, py)) {
|
||
tempArr.push(inst);
|
||
break
|
||
}
|
||
}
|
||
}
|
||
if (tempArr.length) {
|
||
sol.SetArrayPicked(tempArr);
|
||
objectClass.ApplySolToContainer();
|
||
C3.clearArray(tempArr);
|
||
return true
|
||
} else
|
||
return false
|
||
},
|
||
CompareTouchSpeed(index, cmp, s) {
|
||
const touchInfo = this._GetTouchByIndex(index);
|
||
if (!touchInfo)
|
||
return false;
|
||
return C3.compare(touchInfo.GetSpeed(), cmp, s)
|
||
},
|
||
OrientationSupported() {
|
||
return true
|
||
},
|
||
MotionSupported() {
|
||
return true
|
||
},
|
||
CompareOrientation(orientation, cmp, a) {
|
||
this._runtime.RequestDeviceOrientationEvent();
|
||
let v = 0;
|
||
if (orientation === 0)
|
||
v = this._orientAlpha;
|
||
else if (orientation === 1)
|
||
v = this._orientBeta;
|
||
else
|
||
v = this._orientGamma;
|
||
return C3.compare(v, cmp, a)
|
||
},
|
||
CompareAcceleration(a, cmp, x) {
|
||
this._runtime.RequestDeviceMotionEvent();
|
||
let v = 0;
|
||
if (a === 0)
|
||
v = this._accWithGX;
|
||
else if (a === 1)
|
||
v = this._accWithGY;
|
||
else if (a === 2)
|
||
v = this._accWithGZ;
|
||
else if (a === 3)
|
||
v = this._accX;
|
||
else if (a === 4)
|
||
v = this._accY;
|
||
else
|
||
v = this._accZ;
|
||
return C3.compare(v, cmp, x)
|
||
},
|
||
OnNthTouchStart(index) {
|
||
index = Math.floor(index);
|
||
return index === this._triggerIndex
|
||
},
|
||
OnNthTouchEnd(index) {
|
||
index = Math.floor(index);
|
||
return index === this._triggerIndex
|
||
},
|
||
HasNthTouch(index) {
|
||
index = Math.floor(index);
|
||
return this._touches.size >= index + 1
|
||
},
|
||
OnHoldGesture() {
|
||
return true
|
||
},
|
||
OnTapGesture() {
|
||
return true
|
||
},
|
||
OnDoubleTapGesture() {
|
||
return true
|
||
},
|
||
OnHoldGestureObject(objectClass) {
|
||
if (!objectClass)
|
||
return false;
|
||
if (!this._IsClientPosOnCanvas(this._curTouchX, this._curTouchY))
|
||
return false;
|
||
return this._runtime.GetCollisionEngine().TestAndSelectCanvasPointOverlap(objectClass, this._curTouchX, this._curTouchY, false)
|
||
},
|
||
OnTapGestureObject(objectClass) {
|
||
if (!objectClass)
|
||
return false;
|
||
if (!this._IsClientPosOnCanvas(this._curTouchX, this._curTouchY))
|
||
return false;
|
||
return this._runtime.GetCollisionEngine().TestAndSelectCanvasPointOverlap(objectClass, this._curTouchX, this._curTouchY, false)
|
||
},
|
||
OnDoubleTapGestureObject(objectClass) {
|
||
if (!objectClass)
|
||
return false;
|
||
if (!this._IsClientPosOnCanvas(this._curTouchX, this._curTouchY))
|
||
return false;
|
||
return this._runtime.GetCollisionEngine().TestAndSelectCanvasPointOverlap(objectClass, this._curTouchX, this._curTouchY, false)
|
||
},
|
||
OnPermissionGranted(type) {
|
||
return this._triggerPermission === type
|
||
},
|
||
OnPermissionDenied(type) {
|
||
return this._triggerPermission === type
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Touch.Acts = {
|
||
RequestPermission(type) {
|
||
this._RequestPermission(type)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Touch.Exps = {
|
||
TouchCount() {
|
||
return this._touches.size
|
||
},
|
||
X(layerParam) {
|
||
const touchInfo = this._GetTouchByIndex(this._getTouchIndex);
|
||
if (!touchInfo)
|
||
return 0;
|
||
return touchInfo.GetPositionForLayer(this._runtime.GetCurrentLayout(), layerParam, true)
|
||
},
|
||
Y(layerParam) {
|
||
const touchInfo = this._GetTouchByIndex(this._getTouchIndex);
|
||
if (!touchInfo)
|
||
return 0;
|
||
return touchInfo.GetPositionForLayer(this._runtime.GetCurrentLayout(), layerParam, false)
|
||
},
|
||
XAt(index, layerParam) {
|
||
const touchInfo = this._GetTouchByIndex(index);
|
||
if (!touchInfo)
|
||
return 0;
|
||
return touchInfo.GetPositionForLayer(this._runtime.GetCurrentLayout(), layerParam, true)
|
||
},
|
||
YAt(index, layerParam) {
|
||
const touchInfo = this._GetTouchByIndex(index);
|
||
if (!touchInfo)
|
||
return 0;
|
||
return touchInfo.GetPositionForLayer(this._runtime.GetCurrentLayout(), layerParam, false)
|
||
},
|
||
XForID(id, layerParam) {
|
||
const touchInfo = this._touches.get(id);
|
||
if (!touchInfo)
|
||
return 0;
|
||
return touchInfo.GetPositionForLayer(this._runtime.GetCurrentLayout(), layerParam, true)
|
||
},
|
||
YForID(id, layerParam) {
|
||
const touchInfo = this._touches.get(id);
|
||
if (!touchInfo)
|
||
return 0;
|
||
return touchInfo.GetPositionForLayer(this._runtime.GetCurrentLayout(), layerParam, false)
|
||
},
|
||
AbsoluteX() {
|
||
const touchInfo = this._GetTouchByIndex(0);
|
||
if (touchInfo)
|
||
return touchInfo.GetX();
|
||
else
|
||
return 0
|
||
},
|
||
AbsoluteY() {
|
||
const touchInfo = this._GetTouchByIndex(0);
|
||
if (touchInfo)
|
||
return touchInfo.GetY();
|
||
else
|
||
return 0
|
||
},
|
||
AbsoluteXAt(index) {
|
||
const touchInfo = this._GetTouchByIndex(index);
|
||
if (touchInfo)
|
||
return touchInfo.GetX();
|
||
else
|
||
return 0
|
||
},
|
||
AbsoluteYAt(index) {
|
||
const touchInfo = this._GetTouchByIndex(index);
|
||
if (touchInfo)
|
||
return touchInfo.GetY();
|
||
else
|
||
return 0
|
||
},
|
||
AbsoluteXForID(id) {
|
||
const touchInfo = this._touches.get(id);
|
||
if (touchInfo)
|
||
return touchInfo.GetX();
|
||
else
|
||
return 0
|
||
},
|
||
AbsoluteYForID(id) {
|
||
const touchInfo = this._touches.get(id);
|
||
if (touchInfo)
|
||
return touchInfo.GetY();
|
||
else
|
||
return 0
|
||
},
|
||
SpeedAt(index) {
|
||
const touchInfo = this._GetTouchByIndex(index);
|
||
if (touchInfo)
|
||
return touchInfo.GetSpeed();
|
||
else
|
||
return 0
|
||
},
|
||
SpeedForID(id) {
|
||
const touchInfo = this._touches.get(id);
|
||
if (touchInfo)
|
||
return touchInfo.GetSpeed();
|
||
else
|
||
return 0
|
||
},
|
||
AngleAt(index) {
|
||
const touchInfo = this._GetTouchByIndex(index);
|
||
if (touchInfo)
|
||
return C3.toDegrees(touchInfo.GetAngle());
|
||
else
|
||
return 0
|
||
},
|
||
AngleForID(id) {
|
||
const touchInfo = this._touches.get(id);
|
||
if (touchInfo)
|
||
return C3.toDegrees(touchInfo.GetAngle());
|
||
else
|
||
return 0
|
||
},
|
||
CompassHeading() {
|
||
this._runtime.RequestDeviceOrientationEvent();
|
||
return this._orientCompassHeading
|
||
},
|
||
Alpha() {
|
||
this._runtime.RequestDeviceOrientationEvent();
|
||
return this._orientAlpha
|
||
},
|
||
Beta() {
|
||
this._runtime.RequestDeviceOrientationEvent();
|
||
return this._orientBeta
|
||
},
|
||
Gamma() {
|
||
this._runtime.RequestDeviceOrientationEvent();
|
||
return this._orientGamma
|
||
},
|
||
AccelerationXWithG() {
|
||
this._runtime.RequestDeviceMotionEvent();
|
||
return this._accWithGX
|
||
},
|
||
AccelerationYWithG() {
|
||
this._runtime.RequestDeviceMotionEvent();
|
||
return this._accWithGY
|
||
},
|
||
AccelerationZWithG() {
|
||
this._runtime.RequestDeviceMotionEvent();
|
||
return this._accWithGZ
|
||
},
|
||
AccelerationX() {
|
||
this._runtime.RequestDeviceMotionEvent();
|
||
return this._accX
|
||
},
|
||
AccelerationY() {
|
||
this._runtime.RequestDeviceMotionEvent();
|
||
return this._accY
|
||
},
|
||
AccelerationZ() {
|
||
this._runtime.RequestDeviceMotionEvent();
|
||
return this._accZ
|
||
},
|
||
TouchIndex() {
|
||
return this._triggerIndex
|
||
},
|
||
TouchID() {
|
||
return this._triggerId
|
||
},
|
||
WidthForID(id) {
|
||
const touchInfo = this._touches.get(id);
|
||
if (touchInfo)
|
||
return touchInfo.GetWidth();
|
||
else
|
||
return 0
|
||
},
|
||
HeightForID(id) {
|
||
const touchInfo = this._touches.get(id);
|
||
if (touchInfo)
|
||
return touchInfo.GetHeight();
|
||
else
|
||
return 0
|
||
},
|
||
PressureForID(id) {
|
||
const touchInfo = this._touches.get(id);
|
||
if (touchInfo)
|
||
return touchInfo.GetPressure();
|
||
else
|
||
return 0
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const GESTURE_HOLD_THRESHOLD = 15;
|
||
const GESTURE_HOLD_TIMEOUT = 500;
|
||
const GESTURE_TAP_TIMEOUT = 333;
|
||
const GESTURE_DOUBLETAP_THRESHOLD = 25;
|
||
let lastTapX = -1E3;
|
||
let lastTapY = -1E3;
|
||
let lastTapTime = -1E4;
|
||
C3.Plugins.Touch.TouchInfo = class TouchInfo extends C3.DefendedBase {
|
||
constructor() {
|
||
super();
|
||
this._pointerId = 0;
|
||
this._startIndex = 0;
|
||
this._startTime = 0;
|
||
this._time = 0;
|
||
this._lastTime = 0;
|
||
this._startX = 0;
|
||
this._startY = 0;
|
||
this._x = 0;
|
||
this._y = 0;
|
||
this._lastX = 0;
|
||
this._lastY = 0;
|
||
this._width = 0;
|
||
this._height = 0;
|
||
this._pressure = 0;
|
||
this._hasTriggeredHold = false;
|
||
this._isTooFarForHold = false
|
||
}
|
||
Release() {}
|
||
Init(nowTime, x, y, id, index) {
|
||
this._pointerId = id;
|
||
this._startIndex = index;
|
||
this._time = nowTime;
|
||
this._lastTime = nowTime;
|
||
this._startTime = nowTime;
|
||
this._startX = x;
|
||
this._startY = y;
|
||
this._x = x;
|
||
this._y = y;
|
||
this._lastX = x;
|
||
this._lastY = y
|
||
}
|
||
Update(nowTime, x, y, width, height, pressure) {
|
||
this._lastTime = this._time;
|
||
this._time = nowTime;
|
||
this._lastX = this._x;
|
||
this._lastY = this._y;
|
||
this._x = x;
|
||
this._y = y;
|
||
this._width = width;
|
||
this._height = height;
|
||
this._pressure = pressure;
|
||
if (!this._isTooFarForHold && C3.distanceTo(this._startX, this._startY, this._x, this._y) >= GESTURE_HOLD_THRESHOLD)
|
||
this._isTooFarForHold = true
|
||
}
|
||
GetId() {
|
||
return this._pointerId
|
||
}
|
||
GetStartIndex() {
|
||
return this._startIndex
|
||
}
|
||
GetTime() {
|
||
return this._time
|
||
}
|
||
_SetLastTime(t) {
|
||
this._lastTime = t
|
||
}
|
||
GetX() {
|
||
return this._x
|
||
}
|
||
GetY() {
|
||
return this._y
|
||
}
|
||
GetSpeed() {
|
||
const dist = C3.distanceTo(this._x, this._y, this._lastX, this._lastY);
|
||
const dt = (this._time - this._lastTime) / 1E3;
|
||
if (dt > 0)
|
||
return dist / dt;
|
||
else
|
||
return 0
|
||
}
|
||
GetAngle() {
|
||
return C3.angleTo(this._lastX, this._lastY, this._x, this._y)
|
||
}
|
||
GetWidth() {
|
||
return this._width
|
||
}
|
||
GetHeight() {
|
||
return this._height
|
||
}
|
||
GetPressure() {
|
||
return this._pressure
|
||
}
|
||
ShouldTriggerHold(nowTime) {
|
||
if (this._hasTriggeredHold)
|
||
return false;
|
||
if (nowTime - this._startTime >= GESTURE_HOLD_TIMEOUT && !this._isTooFarForHold && C3.distanceTo(this._startX, this._startY, this._x, this._y) < GESTURE_HOLD_THRESHOLD) {
|
||
this._hasTriggeredHold = true;
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
ShouldTriggerTap(nowTime) {
|
||
if (this._hasTriggeredHold)
|
||
return "";
|
||
if (nowTime - this._startTime <= GESTURE_TAP_TIMEOUT && !this._isTooFarForHold && C3.distanceTo(this._startX, this._startY, this._x, this._y) < GESTURE_HOLD_THRESHOLD)
|
||
if (nowTime - lastTapTime <= GESTURE_TAP_TIMEOUT * 2 && C3.distanceTo(lastTapX, lastTapY, this._x, this._y) < GESTURE_DOUBLETAP_THRESHOLD) {
|
||
lastTapX = -1E3;
|
||
lastTapY = -1E3;
|
||
lastTapTime = -1E4;
|
||
return "double-tap"
|
||
} else {
|
||
lastTapX = this._x;
|
||
lastTapY = this._y;
|
||
lastTapTime = nowTime;
|
||
return "single-tap"
|
||
}
|
||
return ""
|
||
}
|
||
GetPositionForLayer(layout, layerNameOrNumber, getx) {
|
||
if (typeof layerNameOrNumber === "undefined") {
|
||
const layer = layout.GetLayerByIndex(0);
|
||
return layer.CanvasCssToLayer_DefaultTransform(this._x, this._y)[getx ? 0 : 1]
|
||
} else {
|
||
const layer = layout.GetLayer(layerNameOrNumber);
|
||
if (layer)
|
||
return layer.CanvasCssToLayer(this._x, this._y)[getx ? 0 : 1];
|
||
else
|
||
return 0
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Mouse = class MousePlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Mouse.Type = class MouseType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
GetScriptInterfaceClass() {
|
||
return self.IMouseObjectType
|
||
}
|
||
}
|
||
;
|
||
let mouseObjectType = null;
|
||
function GetMouseSdkInstance() {
|
||
return mouseObjectType.GetSingleGlobalInstance().GetSdkInstance()
|
||
}
|
||
self.IMouseObjectType = class IMouseObjectType extends self.IObjectClass {
|
||
constructor(objectType) {
|
||
super(objectType);
|
||
mouseObjectType = objectType;
|
||
objectType.GetRuntime()._GetCommonScriptInterfaces().mouse = this
|
||
}
|
||
getMouseX(layerNameOrNumber) {
|
||
return GetMouseSdkInstance().GetMousePositionForLayer(layerNameOrNumber)[0]
|
||
}
|
||
getMouseY(layerNameOrNumber) {
|
||
return GetMouseSdkInstance().GetMousePositionForLayer(layerNameOrNumber)[1]
|
||
}
|
||
getMousePosition(layerNameOrNumber) {
|
||
return GetMouseSdkInstance().GetMousePositionForLayer(layerNameOrNumber)
|
||
}
|
||
isMouseButtonDown(button) {
|
||
return GetMouseSdkInstance().IsMouseButtonDown(button)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const DOM_COMPONENT_ID = "mouse";
|
||
C3.Plugins.Mouse.Instance = class MouseInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst, DOM_COMPONENT_ID);
|
||
this._buttonMap = [false, false, false];
|
||
this._mouseXcanvas = 0;
|
||
this._mouseYcanvas = 0;
|
||
this._triggerButton = 0;
|
||
this._triggerType = 0;
|
||
this._triggerDir = 0;
|
||
const rt = this.GetRuntime().Dispatcher();
|
||
this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "pointermove", e=>this._OnPointerMove(e.data)),C3.Disposable.From(rt, "pointerdown", e=>this._OnPointerDown(e.data)),C3.Disposable.From(rt, "pointerup", e=>this._OnPointerUp(e.data)),C3.Disposable.From(rt, "dblclick", e=>this._OnDoubleClick(e.data)),C3.Disposable.From(rt, "wheel", e=>this._OnMouseWheel(e.data)),C3.Disposable.From(rt, "window-blur", ()=>this._OnWindowBlur()))
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
_OnPointerDown(e) {
|
||
if (e["pointerType"] !== "mouse")
|
||
return;
|
||
this._mouseXcanvas = e["pageX"] - this._runtime.GetCanvasClientX();
|
||
this._mouseYcanvas = e["pageY"] - this._runtime.GetCanvasClientY();
|
||
this._CheckButtonChanges(e["lastButtons"], e["buttons"])
|
||
}
|
||
_OnPointerMove(e) {
|
||
if (e["pointerType"] !== "mouse")
|
||
return;
|
||
this._mouseXcanvas = e["pageX"] - this._runtime.GetCanvasClientX();
|
||
this._mouseYcanvas = e["pageY"] - this._runtime.GetCanvasClientY();
|
||
this._CheckButtonChanges(e["lastButtons"], e["buttons"])
|
||
}
|
||
_OnPointerUp(e) {
|
||
if (e["pointerType"] !== "mouse")
|
||
return;
|
||
this._CheckButtonChanges(e["lastButtons"], e["buttons"])
|
||
}
|
||
_CheckButtonChanges(lastButtons, buttons) {
|
||
this._CheckButtonChange(lastButtons, buttons, 1, 0);
|
||
this._CheckButtonChange(lastButtons, buttons, 4, 1);
|
||
this._CheckButtonChange(lastButtons, buttons, 2, 2)
|
||
}
|
||
_CheckButtonChange(lastButtons, buttons, checkButtonFlag, resultButton) {
|
||
if (!(lastButtons & checkButtonFlag) && buttons & checkButtonFlag)
|
||
this._OnMouseDown(resultButton);
|
||
else if (lastButtons & checkButtonFlag && !(buttons & checkButtonFlag))
|
||
this._OnMouseUp(resultButton)
|
||
}
|
||
_OnMouseDown(button) {
|
||
this._buttonMap[button] = true;
|
||
this.Trigger(C3.Plugins.Mouse.Cnds.OnAnyClick);
|
||
this._triggerButton = button;
|
||
this._triggerType = 0;
|
||
this.Trigger(C3.Plugins.Mouse.Cnds.OnClick);
|
||
this.Trigger(C3.Plugins.Mouse.Cnds.OnObjectClicked)
|
||
}
|
||
_OnMouseUp(button) {
|
||
if (!this._buttonMap[button])
|
||
return;
|
||
this._buttonMap[button] = false;
|
||
this._triggerButton = button;
|
||
this.Trigger(C3.Plugins.Mouse.Cnds.OnRelease)
|
||
}
|
||
_OnDoubleClick(e) {
|
||
this._triggerButton = e["button"];
|
||
this._triggerType = 1;
|
||
this.Trigger(C3.Plugins.Mouse.Cnds.OnClick);
|
||
this.Trigger(C3.Plugins.Mouse.Cnds.OnObjectClicked)
|
||
}
|
||
_OnMouseWheel(e) {
|
||
this._triggerDir = e["deltaY"] < 0 ? 1 : 0;
|
||
this.Trigger(C3.Plugins.Mouse.Cnds.OnWheel)
|
||
}
|
||
_OnWindowBlur() {
|
||
for (let i = 0, len = this._buttonMap.length; i < len; ++i) {
|
||
if (!this._buttonMap[i])
|
||
return;
|
||
this._buttonMap[i] = false;
|
||
this._triggerButton = i;
|
||
this.Trigger(C3.Plugins.Mouse.Cnds.OnRelease)
|
||
}
|
||
}
|
||
GetMousePositionForLayer(layerNameOrNumber) {
|
||
const layout = this._runtime.GetMainRunningLayout();
|
||
const x = this._mouseXcanvas;
|
||
const y = this._mouseYcanvas;
|
||
if (typeof layerNameOrNumber === "undefined") {
|
||
const layer = layout.GetLayerByIndex(0);
|
||
return layer.CanvasCssToLayer_DefaultTransform(x, y)
|
||
} else {
|
||
const layer = layout.GetLayer(layerNameOrNumber);
|
||
if (layer)
|
||
return layer.CanvasCssToLayer(x, y);
|
||
else
|
||
return [0, 0]
|
||
}
|
||
}
|
||
IsMouseButtonDown(button) {
|
||
button = Math.floor(button);
|
||
return !!this._buttonMap[button]
|
||
}
|
||
_IsMouseOverCanvas() {
|
||
return this._mouseXcanvas >= 0 && this._mouseYcanvas >= 0 && this._mouseXcanvas < this._runtime.GetCanvasCssWidth() && this._mouseYcanvas < this._runtime.GetCanvasCssHeight()
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "plugins.mouse";
|
||
return [{
|
||
title: prefix + ".name",
|
||
properties: [{
|
||
name: prefix + ".debugger.absolute-position",
|
||
value: this._mouseXcanvas + "," + this._mouseYcanvas
|
||
}, {
|
||
name: prefix + ".debugger.left-button",
|
||
value: this._buttonMap[0]
|
||
}, {
|
||
name: prefix + ".debugger.middle-button",
|
||
value: this._buttonMap[1]
|
||
}, {
|
||
name: prefix + ".debugger.right-button",
|
||
value: this._buttonMap[2]
|
||
}]
|
||
}, {
|
||
title: prefix + ".debugger.position-on-each-layer",
|
||
properties: this._runtime.GetMainRunningLayout().GetLayers().map(layer=>({
|
||
name: "$" + layer.GetName(),
|
||
value: layer.CanvasCssToLayer(this._mouseXcanvas, this._mouseYcanvas).join(", ")
|
||
}))
|
||
}]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Mouse.Cnds = {
|
||
OnClick(button, type) {
|
||
return this._triggerButton === button && this._triggerType === type
|
||
},
|
||
OnAnyClick() {
|
||
return true
|
||
},
|
||
IsButtonDown(button) {
|
||
return this._buttonMap[button]
|
||
},
|
||
OnRelease(button) {
|
||
return this._triggerButton === button
|
||
},
|
||
IsOverObject(objectClass) {
|
||
if (!this._IsMouseOverCanvas())
|
||
return false;
|
||
const cnd = this._runtime.GetCurrentCondition();
|
||
const isInverted = cnd.IsInverted();
|
||
const mx = this._mouseXcanvas;
|
||
const my = this._mouseYcanvas;
|
||
return C3.xor(this._runtime.GetCollisionEngine().TestAndSelectCanvasPointOverlap(objectClass, mx, my, isInverted), isInverted)
|
||
},
|
||
OnObjectClicked(button, type, objectClass) {
|
||
if (button !== this._triggerButton || type !== this._triggerType)
|
||
return false;
|
||
if (!this._IsMouseOverCanvas())
|
||
return false;
|
||
const mx = this._mouseXcanvas;
|
||
const my = this._mouseYcanvas;
|
||
return this._runtime.GetCollisionEngine().TestAndSelectCanvasPointOverlap(objectClass, mx, my, false)
|
||
},
|
||
OnWheel(dir) {
|
||
return this._triggerDir === dir
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
let lastSetCursor = null;
|
||
const CURSOR_STYLES = ["auto", "pointer", "text", "crosshair", "move", "help", "wait", "none"];
|
||
C3.Plugins.Mouse.Acts = {
|
||
SetCursor(c) {
|
||
const cursorStyle = CURSOR_STYLES[c];
|
||
if (lastSetCursor === cursorStyle)
|
||
return;
|
||
lastSetCursor = cursorStyle;
|
||
this.PostToDOM("cursor", cursorStyle)
|
||
},
|
||
SetCursorSprite(objectClass) {
|
||
if (C3.Platform.IsMobile || !objectClass)
|
||
return;
|
||
const inst = objectClass.GetFirstPicked();
|
||
if (!inst)
|
||
return;
|
||
const wi = inst.GetWorldInfo();
|
||
const imageInfo = inst.GetCurrentImageInfo();
|
||
if (!wi || !imageInfo)
|
||
return;
|
||
if (lastSetCursor === imageInfo)
|
||
return;
|
||
lastSetCursor = imageInfo;
|
||
imageInfo.ExtractImageToCanvas().then(canvas=>C3.CanvasToBlob(canvas)).then(blob=>{
|
||
const url = URL.createObjectURL(blob);
|
||
const cursorStyle = `url(${url}) ${Math.round(wi.GetOriginX() * imageInfo.GetWidth())} ${Math.round(wi.GetOriginY() * imageInfo.GetHeight())}, auto`;
|
||
this.PostToDOM("cursor", "");
|
||
this.PostToDOM("cursor", cursorStyle)
|
||
}
|
||
)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Mouse.Exps = {
|
||
X(layerParam) {
|
||
return this.GetMousePositionForLayer(layerParam)[0]
|
||
},
|
||
Y(layerParam) {
|
||
return this.GetMousePositionForLayer(layerParam)[1]
|
||
},
|
||
AbsoluteX() {
|
||
return this._mouseXcanvas
|
||
},
|
||
AbsoluteY() {
|
||
return this._mouseYcanvas
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Keyboard = class KeyboardPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Keyboard.Type = class KeyboardType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
GetScriptInterfaceClass() {
|
||
return self.IKeyboardObjectType
|
||
}
|
||
}
|
||
;
|
||
let keyboardObjectType = null;
|
||
function GetKeyboardSdkInstance() {
|
||
return keyboardObjectType.GetSingleGlobalInstance().GetSdkInstance()
|
||
}
|
||
self.IKeyboardObjectType = class IKeyboardObjectType extends self.IObjectClass {
|
||
constructor(objectType) {
|
||
super(objectType);
|
||
keyboardObjectType = objectType;
|
||
objectType.GetRuntime()._GetCommonScriptInterfaces().keyboard = this
|
||
}
|
||
isKeyDown(keyOrCode) {
|
||
const keyboardInst = GetKeyboardSdkInstance();
|
||
if (typeof keyOrCode === "string")
|
||
return keyboardInst.IsKeyDown(keyOrCode);
|
||
else if (typeof keyOrCode === "number")
|
||
return keyboardInst.IsKeyCodeDown(keyOrCode);
|
||
else
|
||
throw new TypeError("expected string or number");
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Keyboard.Instance = class KeyboardInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
this._keysDownByString = new Set;
|
||
this._keysDownByWhich = new Set;
|
||
this._triggerWhich = 0;
|
||
this._triggerString = "";
|
||
this._triggerTypedKey = "";
|
||
const rt = this.GetRuntime().Dispatcher();
|
||
this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "keydown", e=>this._OnKeyDown(e.data)),C3.Disposable.From(rt, "keyup", e=>this._OnKeyUp(e.data)),C3.Disposable.From(rt, "window-blur", ()=>this._OnWindowBlur()))
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
_OnKeyDown(e) {
|
||
const which = e["which"];
|
||
const keyString = e["code"] || which.toString();
|
||
const typedKey = e["key"];
|
||
if (this._keysDownByString.has(keyString))
|
||
return;
|
||
this._keysDownByString.add(keyString);
|
||
this._keysDownByWhich.add(which);
|
||
this._triggerString = keyString;
|
||
this._triggerWhich = which;
|
||
this._triggerTypedKey = typedKey;
|
||
this.Trigger(C3.Plugins.Keyboard.Cnds.OnAnyKey);
|
||
this.Trigger(C3.Plugins.Keyboard.Cnds.OnKey);
|
||
this.Trigger(C3.Plugins.Keyboard.Cnds.OnLeftRightKeyPressed);
|
||
this.Trigger(C3.Plugins.Keyboard.Cnds.OnKeyCode)
|
||
}
|
||
_OnKeyUp(e) {
|
||
const which = e["which"];
|
||
const keyString = e["code"] || which.toString();
|
||
const typedKey = e["key"];
|
||
this._keysDownByString.delete(keyString);
|
||
this._keysDownByWhich.delete(which);
|
||
this._triggerString = keyString;
|
||
this._triggerWhich = which;
|
||
this._triggerTypedKey = typedKey;
|
||
this.Trigger(C3.Plugins.Keyboard.Cnds.OnAnyKeyReleased);
|
||
this.Trigger(C3.Plugins.Keyboard.Cnds.OnKeyReleased);
|
||
this.Trigger(C3.Plugins.Keyboard.Cnds.OnLeftRightKeyReleased);
|
||
this.Trigger(C3.Plugins.Keyboard.Cnds.OnKeyCodeReleased)
|
||
}
|
||
_OnWindowBlur() {
|
||
for (const which of this._keysDownByWhich) {
|
||
this._keysDownByWhich.delete(which);
|
||
this._triggerWhich = which;
|
||
this.Trigger(C3.Plugins.Keyboard.Cnds.OnAnyKeyReleased);
|
||
this.Trigger(C3.Plugins.Keyboard.Cnds.OnKeyReleased);
|
||
this.Trigger(C3.Plugins.Keyboard.Cnds.OnKeyCodeReleased)
|
||
}
|
||
this._keysDownByString.clear()
|
||
}
|
||
IsKeyDown(str) {
|
||
return this._keysDownByString.has(str)
|
||
}
|
||
IsKeyCodeDown(which) {
|
||
return this._keysDownByWhich.has(which)
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"tk": this._triggerWhich,
|
||
"tkk": this._triggerTypedKey
|
||
}
|
||
}
|
||
LoadFromJson(o) {
|
||
this._triggerWhich = o["tk"];
|
||
if (o.hasOwnProperty("tkk"))
|
||
this._triggerTypedKey = o["tkk"]
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "plugins.keyboard";
|
||
return [{
|
||
title: prefix + ".name",
|
||
properties: [{
|
||
name: prefix + ".debugger.last-key-code",
|
||
value: this._triggerWhich
|
||
}, {
|
||
name: prefix + ".debugger.last-key-string",
|
||
value: C3.Plugins.Keyboard.Exps.StringFromKeyCode(this._triggerWhich)
|
||
}, {
|
||
name: prefix + ".debugger.last-typed-key",
|
||
value: this._triggerTypedKey
|
||
}]
|
||
}]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const LEFTRIGHT_KEY_STRINGS = ["ShiftLeft", "ShiftRight", "ControlLeft", "ControlRight", "AltLeft", "AltRight", "MetaLeft", "MetaRight"];
|
||
C3.Plugins.Keyboard.Cnds = {
|
||
IsKeyDown(which) {
|
||
return this._keysDownByWhich.has(which)
|
||
},
|
||
OnKey(which) {
|
||
return this._triggerWhich === which
|
||
},
|
||
OnAnyKey() {
|
||
return true
|
||
},
|
||
OnAnyKeyReleased() {
|
||
return true
|
||
},
|
||
OnKeyReleased(which) {
|
||
return this._triggerWhich === which
|
||
},
|
||
IsKeyCodeDown(which) {
|
||
which = Math.floor(which);
|
||
return this._keysDownByWhich.has(which)
|
||
},
|
||
OnKeyCode(which) {
|
||
return this._triggerWhich === which
|
||
},
|
||
OnKeyCodeReleased(which) {
|
||
return this._triggerWhich === which
|
||
},
|
||
OnLeftRightKeyPressed(index) {
|
||
const keyString = LEFTRIGHT_KEY_STRINGS[index];
|
||
return this._triggerString === keyString
|
||
},
|
||
OnLeftRightKeyReleased(index) {
|
||
const keyString = LEFTRIGHT_KEY_STRINGS[index];
|
||
return this._triggerString === keyString
|
||
},
|
||
IsLeftRightKeyDown(index) {
|
||
const keyString = LEFTRIGHT_KEY_STRINGS[index];
|
||
return this._keysDownByString.has(keyString)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Keyboard.Acts = {}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
function StringFromCharCode(kc) {
|
||
kc = Math.floor(kc);
|
||
switch (kc) {
|
||
case 8:
|
||
return "backspace";
|
||
case 9:
|
||
return "tab";
|
||
case 13:
|
||
return "enter";
|
||
case 16:
|
||
return "shift";
|
||
case 17:
|
||
return "control";
|
||
case 18:
|
||
return "alt";
|
||
case 19:
|
||
return "pause";
|
||
case 20:
|
||
return "capslock";
|
||
case 27:
|
||
return "esc";
|
||
case 33:
|
||
return "pageup";
|
||
case 34:
|
||
return "pagedown";
|
||
case 35:
|
||
return "end";
|
||
case 36:
|
||
return "home";
|
||
case 37:
|
||
return "\u2190";
|
||
case 38:
|
||
return "\u2191";
|
||
case 39:
|
||
return "\u2192";
|
||
case 40:
|
||
return "\u2193";
|
||
case 45:
|
||
return "insert";
|
||
case 46:
|
||
return "del";
|
||
case 91:
|
||
return "left window key";
|
||
case 92:
|
||
return "right window key";
|
||
case 93:
|
||
return "select";
|
||
case 96:
|
||
return "numpad 0";
|
||
case 97:
|
||
return "numpad 1";
|
||
case 98:
|
||
return "numpad 2";
|
||
case 99:
|
||
return "numpad 3";
|
||
case 100:
|
||
return "numpad 4";
|
||
case 101:
|
||
return "numpad 5";
|
||
case 102:
|
||
return "numpad 6";
|
||
case 103:
|
||
return "numpad 7";
|
||
case 104:
|
||
return "numpad 8";
|
||
case 105:
|
||
return "numpad 9";
|
||
case 106:
|
||
return "numpad *";
|
||
case 107:
|
||
return "numpad +";
|
||
case 109:
|
||
return "numpad -";
|
||
case 110:
|
||
return "numpad .";
|
||
case 111:
|
||
return "numpad /";
|
||
case 112:
|
||
return "F1";
|
||
case 113:
|
||
return "F2";
|
||
case 114:
|
||
return "F3";
|
||
case 115:
|
||
return "F4";
|
||
case 116:
|
||
return "F5";
|
||
case 117:
|
||
return "F6";
|
||
case 118:
|
||
return "F7";
|
||
case 119:
|
||
return "F8";
|
||
case 120:
|
||
return "F9";
|
||
case 121:
|
||
return "F10";
|
||
case 122:
|
||
return "F11";
|
||
case 123:
|
||
return "F12";
|
||
case 144:
|
||
return "numlock";
|
||
case 145:
|
||
return "scroll lock";
|
||
case 186:
|
||
return ";";
|
||
case 187:
|
||
return "=";
|
||
case 188:
|
||
return ",";
|
||
case 189:
|
||
return "-";
|
||
case 190:
|
||
return ".";
|
||
case 191:
|
||
return "/";
|
||
case 192:
|
||
return "'";
|
||
case 219:
|
||
return "[";
|
||
case 220:
|
||
return "\\";
|
||
case 221:
|
||
return "]";
|
||
case 222:
|
||
return "#";
|
||
case 223:
|
||
return "`";
|
||
default:
|
||
return String.fromCharCode(kc)
|
||
}
|
||
}
|
||
C3.Plugins.Keyboard.Exps = {
|
||
LastKeyCode() {
|
||
return this._triggerWhich
|
||
},
|
||
StringFromKeyCode(kc) {
|
||
return StringFromCharCode(kc)
|
||
},
|
||
TypedKey() {
|
||
return this._triggerTypedKey
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Browser = class BrowserPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Browser.Type = class BrowserType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const DOM_COMPONENT_ID = "browser";
|
||
C3.Plugins.Browser.Instance = class BrowserInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst, DOM_COMPONENT_ID);
|
||
this._initLocationStr = "";
|
||
this._isOnline = false;
|
||
this._referrer = "";
|
||
this._docTitle = "";
|
||
this._isCookieEnabled = false;
|
||
this._screenWidth = 0;
|
||
this._screenHeight = 0;
|
||
this._windowOuterWidth = 0;
|
||
this._windowOuterHeight = 0;
|
||
this._isScirraArcade = false;
|
||
this.AddDOMMessageHandlers([["online-state", e=>this._OnOnlineStateChanged(e)], ["backbutton", ()=>this._OnBackButton()], ["sw-message", e=>this._OnSWMessage(e)], ["hashchange", e=>this._OnHashChange(e)]]);
|
||
const rt = this.GetRuntime().Dispatcher();
|
||
this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "afterfirstlayoutstart", ()=>this._OnAfterFirstLayoutStart()),C3.Disposable.From(rt, "window-resize", ()=>this._OnWindowResize()),C3.Disposable.From(rt, "suspend", ()=>this._OnSuspend()),C3.Disposable.From(rt, "resume", ()=>this._OnResume()));
|
||
this._runtime.AddLoadPromise(this.PostToDOMAsync("get-initial-state", {
|
||
"exportType": this._runtime.GetExportType()
|
||
}).then(data=>{
|
||
this._initLocationStr = data["location"];
|
||
this._isOnline = data["isOnline"];
|
||
this._referrer = data["referrer"];
|
||
this._docTitle = data["title"];
|
||
this._isCookieEnabled = data["isCookieEnabled"];
|
||
this._screenWidth = data["screenWidth"];
|
||
this._screenHeight = data["screenHeight"];
|
||
this._windowOuterWidth = data["windowOuterWidth"];
|
||
this._windowOuterHeight = data["windowOuterHeight"];
|
||
this._isScirraArcade = data["isScirraArcade"]
|
||
}
|
||
))
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
_OnAfterFirstLayoutStart() {
|
||
this.PostToDOM("ready-for-sw-messages")
|
||
}
|
||
async _OnOnlineStateChanged(e) {
|
||
const isOnline = !!e["isOnline"];
|
||
if (this._isOnline === isOnline)
|
||
return;
|
||
this._isOnline = isOnline;
|
||
if (this._isOnline)
|
||
await this.TriggerAsync(C3.Plugins.Browser.Cnds.OnOnline);
|
||
else
|
||
await this.TriggerAsync(C3.Plugins.Browser.Cnds.OnOffline)
|
||
}
|
||
async _OnWindowResize() {
|
||
await this.TriggerAsync(C3.Plugins.Browser.Cnds.OnResize)
|
||
}
|
||
_OnSuspend() {
|
||
this.Trigger(C3.Plugins.Browser.Cnds.OnPageHidden)
|
||
}
|
||
_OnResume() {
|
||
this.Trigger(C3.Plugins.Browser.Cnds.OnPageVisible)
|
||
}
|
||
async _OnBackButton() {
|
||
await this.TriggerAsync(C3.Plugins.Browser.Cnds.OnBackButton)
|
||
}
|
||
_OnSWMessage(e) {
|
||
const messageType = e["type"];
|
||
if (messageType === "downloading-update")
|
||
this.Trigger(C3.Plugins.Browser.Cnds.OnUpdateFound);
|
||
else if (messageType === "update-ready" || messageType === "update-pending")
|
||
this.Trigger(C3.Plugins.Browser.Cnds.OnUpdateReady);
|
||
else if (messageType === "offline-ready")
|
||
this.Trigger(C3.Plugins.Browser.Cnds.OnOfflineReady)
|
||
}
|
||
_OnHashChange(e) {
|
||
this._initLocationStr = e["location"];
|
||
this.Trigger(C3.Plugins.Browser.Cnds.OnHashChange)
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "plugins.browser.debugger";
|
||
return [{
|
||
title: "plugins.browser.name",
|
||
properties: [{
|
||
name: prefix + ".user-agent",
|
||
value: navigator.userAgent
|
||
}, {
|
||
name: prefix + ".is-online",
|
||
value: this._isOnline
|
||
}, {
|
||
name: prefix + ".is-fullscreen",
|
||
value: this._runtime.GetCanvasManager().IsDocumentFullscreen()
|
||
}]
|
||
}]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Browser.Cnds = {
|
||
IsOnline() {
|
||
return this._isOnline
|
||
},
|
||
OnOnline() {
|
||
return true
|
||
},
|
||
OnOffline() {
|
||
return true
|
||
},
|
||
OnResize() {
|
||
return true
|
||
},
|
||
CookiesEnabled() {
|
||
return this._isCookieEnabled
|
||
},
|
||
IsFullscreen() {
|
||
return this._runtime.GetCanvasManager().IsDocumentFullscreen()
|
||
},
|
||
OnBackButton() {
|
||
return true
|
||
},
|
||
IsPortraitLandscape(p) {
|
||
const lastInnerWidth = this._runtime.GetCanvasManager().GetLastWidth();
|
||
const lastInnerHeight = this._runtime.GetCanvasManager().GetLastHeight();
|
||
const current = lastInnerWidth <= lastInnerHeight ? 0 : 1;
|
||
return current === p
|
||
},
|
||
OnUpdateFound() {
|
||
return true
|
||
},
|
||
OnUpdateReady() {
|
||
return true
|
||
},
|
||
OnOfflineReady() {
|
||
return true
|
||
},
|
||
OnHashChange() {
|
||
return true
|
||
},
|
||
PageVisible() {
|
||
return !this._runtime.IsSuspended()
|
||
},
|
||
OnPageHidden() {
|
||
return true
|
||
},
|
||
OnPageVisible() {
|
||
return true
|
||
},
|
||
HasJava() {
|
||
return false
|
||
},
|
||
IsDownloadingUpdate() {
|
||
return false
|
||
},
|
||
OnMenuButton() {
|
||
return false
|
||
},
|
||
OnSearchButton() {
|
||
return false
|
||
},
|
||
IsMetered() {
|
||
return false
|
||
},
|
||
IsCharging() {
|
||
return true
|
||
},
|
||
SupportsFullscreen() {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const ORIENTATIONS = ["portrait", "landscape", "portrait-primary", "portrait-secondary", "landscape-primary", "landscape-secondary"];
|
||
C3.Plugins.Browser.Acts = {
|
||
Alert(message) {
|
||
this.PostToDOM("alert", {
|
||
"message": message.toString()
|
||
})
|
||
},
|
||
Close() {
|
||
if (this._isScirraArcade)
|
||
return;
|
||
if (this._runtime.IsDebug())
|
||
self.C3Debugger.CloseWindow();
|
||
else
|
||
this.PostToDOM("close")
|
||
},
|
||
Focus() {
|
||
this.PostToDOM("set-focus", {
|
||
"isFocus": true
|
||
})
|
||
},
|
||
Blur() {
|
||
this.PostToDOM("set-focus", {
|
||
"isFocus": false
|
||
})
|
||
},
|
||
GoBack() {
|
||
if (this._isScirraArcade)
|
||
return;
|
||
this.PostToDOM("navigate", {
|
||
"type": "back"
|
||
})
|
||
},
|
||
GoForward() {
|
||
if (this._isScirraArcade)
|
||
return;
|
||
this.PostToDOM("navigate", {
|
||
"type": "forward"
|
||
})
|
||
},
|
||
GoHome() {
|
||
if (this._isScirraArcade)
|
||
return;
|
||
this.PostToDOM("navigate", {
|
||
"type": "home"
|
||
})
|
||
},
|
||
Reload() {
|
||
if (this._isScirraArcade)
|
||
return;
|
||
if (this._runtime.IsDebug())
|
||
this._runtime.PostToDebugger({
|
||
"type": "reload"
|
||
});
|
||
else
|
||
this.PostToDOM("navigate", {
|
||
"type": "reload"
|
||
})
|
||
},
|
||
GoToURL(url, target) {
|
||
this._PostToDOMMaybeSync("navigate", {
|
||
"type": "url",
|
||
"url": "?"+url,
|
||
"target": target,
|
||
"exportType": this._runtime.GetExportType()
|
||
})
|
||
},
|
||
GoToURLWindow(url, tag) {
|
||
this._PostToDOMMaybeSync("navigate", {
|
||
"type": "new-window",
|
||
"url": url,
|
||
"tag": tag,
|
||
"exportType": this._runtime.GetExportType()
|
||
})
|
||
},
|
||
RequestFullScreen(mode, navUi) {
|
||
if (mode >= 2)
|
||
mode += 1;
|
||
if (mode === 6)
|
||
mode = 2;
|
||
if (mode === 1)
|
||
mode = 0;
|
||
const modeStr = C3.CanvasManager._FullscreenModeNumberToString(mode);
|
||
this._runtime.GetCanvasManager().SetDocumentFullscreenMode(modeStr);
|
||
this._PostToDOMMaybeSync("request-fullscreen", {
|
||
"navUI": navUi
|
||
})
|
||
},
|
||
CancelFullScreen() {
|
||
this._PostToDOMMaybeSync("exit-fullscreen")
|
||
},
|
||
Vibrate(pattern) {
|
||
const arr = pattern.split(",");
|
||
for (let i = 0, len = arr.length; i < len; ++i)
|
||
arr[i] = parseInt(arr[i], 10);
|
||
this._PostToDOMMaybeSync("vibrate", {
|
||
"pattern": arr
|
||
})
|
||
},
|
||
async InvokeDownload(url, filename) {
|
||
if (!filename)
|
||
return;
|
||
const urlToDownload = await this._runtime.GetAssetManager().GetProjectFileUrl(url);
|
||
this._runtime.InvokeDownload(urlToDownload, filename)
|
||
},
|
||
InvokeDownloadString(str, mimeType, filename) {
|
||
if (!filename)
|
||
return;
|
||
const dataUri = `data:${mimeType},${encodeURIComponent(str)}`;
|
||
this._runtime.InvokeDownload(dataUri, filename)
|
||
},
|
||
ConsoleLog(type, msg) {
|
||
msg = msg.toString();
|
||
if (type === 0)
|
||
console.log(msg);
|
||
else if (type === 1)
|
||
console.warn(msg);
|
||
else if (type === 2)
|
||
console.error(msg)
|
||
},
|
||
ConsoleGroup(name) {
|
||
console.group(name)
|
||
},
|
||
ConsoleGroupEnd() {
|
||
console.groupEnd()
|
||
},
|
||
ExecJs(jsStr) {
|
||
try {
|
||
console.log("--fx--eval--", jsStr);
|
||
// eval(jsStr)
|
||
} catch (err) {
|
||
console.error("Error executing JavaScript: ", err)
|
||
}
|
||
},
|
||
LockOrientation(o) {
|
||
o = Math.floor(o);
|
||
if (o < 0 || o >= ORIENTATIONS.length)
|
||
return;
|
||
const orientation = ORIENTATIONS[o];
|
||
this._PostToDOMMaybeSync("lock-orientation", {
|
||
"orientation": orientation
|
||
})
|
||
},
|
||
UnlockOrientation() {
|
||
this._PostToDOMMaybeSync("unlock-orientation")
|
||
},
|
||
LoadStyleSheet(url) {
|
||
this._runtime.GetAssetManager().LoadStyleSheet(url)
|
||
},
|
||
SetHash(h) {
|
||
this.PostToDOM("set-hash", {
|
||
"hash": h
|
||
})
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Browser.Exps = {
|
||
URL() {
|
||
if (this._runtime.IsInWorker())
|
||
return this._initLocationStr;
|
||
else
|
||
return location.toString()
|
||
},
|
||
Protocol() {
|
||
if (this._runtime.IsInWorker())
|
||
return (new URL(this._initLocationStr)).protocol;
|
||
else
|
||
return location.protocol
|
||
},
|
||
Domain() {
|
||
return "games-online.io";
|
||
console.log("--fx--host--", location.hostname);
|
||
console.log("--fx--host--", (new URL(this._initLocationStr)).hostname);
|
||
if (this._runtime.IsInWorker())
|
||
return (new URL(this._initLocationStr)).hostname;
|
||
else
|
||
return location.hostname
|
||
},
|
||
Port() {
|
||
if (this._runtime.IsInWorker())
|
||
return (new URL(this._initLocationStr)).port;
|
||
else
|
||
return location.port
|
||
},
|
||
PathName() {
|
||
if (this._runtime.IsInWorker())
|
||
return (new URL(this._initLocationStr)).pathname;
|
||
else
|
||
return location.pathname
|
||
},
|
||
Hash() {
|
||
if (this._runtime.IsInWorker())
|
||
return (new URL(this._initLocationStr)).hash;
|
||
else
|
||
return location.hash
|
||
},
|
||
QueryString() {
|
||
if (this._runtime.IsInWorker())
|
||
return (new URL(this._initLocationStr)).search;
|
||
else
|
||
return location.search
|
||
},
|
||
QueryParam(param) {
|
||
const search = this._runtime.IsInWorker() ? (new URL(this._initLocationStr)).search : location.search;
|
||
const match = RegExp("[?&]" + param + "=([^&]*)").exec(search);
|
||
if (match)
|
||
return decodeURIComponent(match[1].replace(/\+/g, " "));
|
||
else
|
||
return ""
|
||
},
|
||
Referrer() {
|
||
return this._referrer
|
||
},
|
||
Title() {
|
||
return this._docTitle
|
||
},
|
||
Language() {
|
||
return navigator.language
|
||
},
|
||
Platform() {
|
||
return navigator.platform
|
||
},
|
||
UserAgent() {
|
||
return navigator.userAgent
|
||
},
|
||
ExecJS(jsStr) {
|
||
let result = 0;
|
||
try {
|
||
result = eval(jsStr)
|
||
} catch (err) {
|
||
console.error("Error executing JavaScript: ", err)
|
||
}
|
||
if (typeof result === "number" || typeof result === "string")
|
||
return result;
|
||
if (typeof result === "boolean")
|
||
return result ? 1 : 0;
|
||
else
|
||
return 0
|
||
},
|
||
Name() {
|
||
return navigator.appName
|
||
},
|
||
Version() {
|
||
return navigator.appVersion
|
||
},
|
||
Product() {
|
||
return navigator.product
|
||
},
|
||
Vendor() {
|
||
return navigator.vendor
|
||
},
|
||
BatteryLevel() {
|
||
return 1
|
||
},
|
||
BatteryTimeLeft() {
|
||
return Infinity
|
||
},
|
||
Bandwidth() {
|
||
const connection = navigator["connection"];
|
||
if (connection)
|
||
return connection["downlink"] || connection["downlinkMax"] || connection["bandwidth"] || Infinity;
|
||
else
|
||
return Infinity
|
||
},
|
||
ConnectionType() {
|
||
const connection = navigator["connection"];
|
||
if (connection)
|
||
return connection["type"] || "unknown";
|
||
else
|
||
return "unknown"
|
||
},
|
||
DevicePixelRatio() {
|
||
return self.devicePixelRatio
|
||
},
|
||
ScreenWidth() {
|
||
return this._screenWidth
|
||
},
|
||
ScreenHeight() {
|
||
return this._screenHeight
|
||
},
|
||
WindowInnerWidth() {
|
||
return this._runtime.GetCanvasManager().GetLastWidth()
|
||
},
|
||
WindowInnerHeight() {
|
||
return this._runtime.GetCanvasManager().GetLastHeight()
|
||
},
|
||
WindowOuterWidth() {
|
||
return this._windowOuterWidth
|
||
},
|
||
WindowOuterHeight() {
|
||
return this._windowOuterWidth
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.TiledBg = class TiledBgPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
function WrapModeToStr(wrapMode) {
|
||
switch (wrapMode) {
|
||
case 0:
|
||
return "clamp-to-edge";
|
||
case 1:
|
||
return "repeat";
|
||
case 2:
|
||
return "mirror-repeat"
|
||
}
|
||
return "repeat"
|
||
}
|
||
C3.Plugins.TiledBg.Type = class TiledBgType extends C3.SDKTypeBase {
|
||
constructor(objectClass, exportData) {
|
||
super(objectClass);
|
||
this._wrapX = "repeat";
|
||
this._wrapY = "repeat";
|
||
if (exportData) {
|
||
this._wrapX = WrapModeToStr(exportData[0]);
|
||
this._wrapY = WrapModeToStr(exportData[1])
|
||
}
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {
|
||
this.GetImageInfo().LoadAsset(this._runtime)
|
||
}
|
||
LoadTextures(renderer) {
|
||
return this.GetImageInfo().LoadStaticTexture(renderer, {
|
||
sampling: this._runtime.GetSampling(),
|
||
wrapX: this._wrapX,
|
||
wrapY: this._wrapY
|
||
})
|
||
}
|
||
ReleaseTextures() {
|
||
this.GetImageInfo().ReleaseTexture()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const INITIALLY_VISIBLE = 0;
|
||
const ORIGIN = 1;
|
||
const IMAGE_OFFSET_X = 4;
|
||
const IMAGE_OFFSET_Y = 5;
|
||
const IMAGE_SCALE_X = 6;
|
||
const IMAGE_SCALE_Y = 7;
|
||
const IMAGE_ANGLE = 8;
|
||
const tempRect = C3.New(C3.Rect);
|
||
const tempQuad = C3.New(C3.Quad);
|
||
const rcTex = C3.New(C3.Rect);
|
||
const qTex = C3.New(C3.Quad);
|
||
C3.Plugins.TiledBg.Instance = class TiledBgInstance extends C3.SDKWorldInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
this._imageOffsetX = 0;
|
||
this._imageOffsetY = 0;
|
||
this._imageScaleX = 1;
|
||
this._imageScaleY = 1;
|
||
this._imageAngle = 0;
|
||
this._ownImageInfo = null;
|
||
if (properties) {
|
||
this.GetWorldInfo().SetVisible(!!properties[INITIALLY_VISIBLE]);
|
||
this._imageOffsetX = properties[IMAGE_OFFSET_X];
|
||
this._imageOffsetY = properties[IMAGE_OFFSET_Y];
|
||
this._imageScaleX = properties[IMAGE_SCALE_X];
|
||
this._imageScaleY = properties[IMAGE_SCALE_Y];
|
||
this._imageAngle = C3.toRadians(properties[IMAGE_ANGLE])
|
||
}
|
||
}
|
||
Release() {
|
||
this._ReleaseOwnImage();
|
||
super.Release()
|
||
}
|
||
_ReleaseOwnImage() {
|
||
if (this._ownImageInfo) {
|
||
this._ownImageInfo.Release();
|
||
this._ownImageInfo = null
|
||
}
|
||
}
|
||
Draw(renderer) {
|
||
const imageInfo = this.GetCurrentImageInfo();
|
||
const texture = imageInfo.GetTexture();
|
||
if (texture === null)
|
||
return;
|
||
renderer.SetTexture(texture);
|
||
const imageWidth = imageInfo.GetWidth();
|
||
const imageHeight = imageInfo.GetHeight();
|
||
const imageOffsetX = this._imageOffsetX / imageWidth;
|
||
const imageOffsetY = this._imageOffsetY / imageHeight;
|
||
const wi = this.GetWorldInfo();
|
||
rcTex.set(0, 0, wi.GetWidth() / (imageWidth * this._imageScaleX), wi.GetHeight() / (imageHeight * this._imageScaleY));
|
||
rcTex.offset(-imageOffsetX, -imageOffsetY);
|
||
if (wi.HasMesh())
|
||
this._DrawMesh(wi, renderer);
|
||
else
|
||
this._DrawStandard(wi, renderer)
|
||
}
|
||
_DrawStandard(wi, renderer) {
|
||
let quad = wi.GetBoundingQuad();
|
||
if (this._runtime.IsPixelRoundingEnabled())
|
||
quad = wi.PixelRoundQuad(quad);
|
||
if (this._imageAngle === 0)
|
||
renderer.Quad3(quad, rcTex);
|
||
else {
|
||
qTex.setFromRotatedRect(rcTex, -this._imageAngle);
|
||
renderer.Quad4(quad, qTex)
|
||
}
|
||
}
|
||
_DrawMesh(wi, renderer) {
|
||
const transformedMesh = wi.GetTransformedMesh();
|
||
if (wi.IsMeshChanged()) {
|
||
wi.CalculateBbox(tempRect, tempQuad, false);
|
||
let quad = tempQuad;
|
||
if (this._runtime.IsPixelRoundingEnabled())
|
||
quad = wi.PixelRoundQuad(quad);
|
||
let texCoords = rcTex;
|
||
if (this._imageAngle !== 0) {
|
||
qTex.setFromRotatedRect(rcTex, -this._imageAngle);
|
||
texCoords = qTex
|
||
}
|
||
transformedMesh.CalculateTransformedMesh(wi.GetSourceMesh(), quad, texCoords);
|
||
wi.SetMeshChanged(false)
|
||
}
|
||
transformedMesh.Draw(renderer)
|
||
}
|
||
GetCurrentImageInfo() {
|
||
return this._ownImageInfo || this._objectClass.GetImageInfo()
|
||
}
|
||
_SetMeshChanged() {
|
||
this.GetWorldInfo().SetMeshChanged(true)
|
||
}
|
||
_SetImageOffsetX(x) {
|
||
if (this._imageOffsetX === x)
|
||
return;
|
||
this._imageOffsetX = x;
|
||
this._runtime.UpdateRender();
|
||
this._SetMeshChanged()
|
||
}
|
||
_GetImageOffsetX() {
|
||
return this._imageOffsetX
|
||
}
|
||
_SetImageOffsetY(y) {
|
||
if (this._imageOffsetY === y)
|
||
return;
|
||
this._imageOffsetY = y;
|
||
this._runtime.UpdateRender();
|
||
this._SetMeshChanged()
|
||
}
|
||
_GetImageOffsetY() {
|
||
return this._imageOffsetY
|
||
}
|
||
_SetImageScaleX(x) {
|
||
if (this._imageScaleX === x)
|
||
return;
|
||
this._imageScaleX = x;
|
||
this._runtime.UpdateRender();
|
||
this._SetMeshChanged()
|
||
}
|
||
_GetImageScaleX() {
|
||
return this._imageScaleX
|
||
}
|
||
_SetImageScaleY(y) {
|
||
if (this._imageScaleY === y)
|
||
return;
|
||
this._imageScaleY = y;
|
||
this._runtime.UpdateRender();
|
||
this._SetMeshChanged()
|
||
}
|
||
_GetImageScaleY() {
|
||
return this._imageScaleY
|
||
}
|
||
_SetImageAngle(a) {
|
||
if (this._imageAngle === a)
|
||
return;
|
||
this._imageAngle = a;
|
||
this._runtime.UpdateRender();
|
||
this._SetMeshChanged()
|
||
}
|
||
_GetImageAngle() {
|
||
return this._imageAngle
|
||
}
|
||
GetPropertyValueByIndex(index) {
|
||
switch (index) {
|
||
case IMAGE_OFFSET_X:
|
||
return this._GetImageOffsetX();
|
||
case IMAGE_OFFSET_Y:
|
||
return this._GetImageOffsetY();
|
||
case IMAGE_SCALE_X:
|
||
return this._GetImageScaleX();
|
||
case IMAGE_SCALE_Y:
|
||
return this._GetImageScaleY();
|
||
case IMAGE_ANGLE:
|
||
return this._GetImageAngle()
|
||
}
|
||
}
|
||
SetPropertyValueByIndex(index, value) {
|
||
switch (index) {
|
||
case IMAGE_OFFSET_X:
|
||
this._SetImageOffsetX(value);
|
||
break;
|
||
case IMAGE_OFFSET_Y:
|
||
this._SetImageOffsetY(value);
|
||
break;
|
||
case IMAGE_SCALE_X:
|
||
this._SetImageScaleX(value);
|
||
break;
|
||
case IMAGE_SCALE_Y:
|
||
this._SetImageScaleY(value);
|
||
break;
|
||
case IMAGE_ANGLE:
|
||
this._SetImageAngle(value);
|
||
break
|
||
}
|
||
}
|
||
GetScriptInterfaceClass() {
|
||
return self.ITiledBackgroundInstance
|
||
}
|
||
}
|
||
;
|
||
const map = new WeakMap;
|
||
self.ITiledBackgroundInstance = class ITiledBackgroundInstance extends self.IWorldInstance {
|
||
constructor() {
|
||
super();
|
||
map.set(this, self.IInstance._GetInitInst().GetSdkInstance())
|
||
}
|
||
set imageOffsetX(x) {
|
||
map.get(this)._SetImageOffsetX(x)
|
||
}
|
||
get imageOffsetX() {
|
||
return map.get(this)._GetImageOffsetX()
|
||
}
|
||
set imageOffsetY(y) {
|
||
map.get(this)._SetImageOffsetY(y)
|
||
}
|
||
get imageOffsetY() {
|
||
return map.get(this)._GetImageOffsetY()
|
||
}
|
||
set imageScaleX(x) {
|
||
map.get(this)._SetImageScaleX(x)
|
||
}
|
||
get imageScaleX() {
|
||
return map.get(this)._GetImageScaleX()
|
||
}
|
||
set imageScaleY(y) {
|
||
map.get(this)._SetImageScaleY(y)
|
||
}
|
||
get imageScaleY() {
|
||
return map.get(this)._GetImageScaleY()
|
||
}
|
||
set imageAngle(a) {
|
||
map.get(this)._SetImageAngle(a)
|
||
}
|
||
get imageAngle() {
|
||
return map.get(this)._GetImageAngle()
|
||
}
|
||
set imageAngleDegrees(a) {
|
||
map.get(this)._SetImageAngle(C3.toRadians(a))
|
||
}
|
||
get imageAngleDegrees() {
|
||
return C3.toDegrees(map.get(this)._GetImageAngle())
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.TiledBg.Cnds = {
|
||
OnURLLoaded() {
|
||
return true
|
||
},
|
||
OnURLFailed() {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.TiledBg.Acts = {
|
||
SetImageOffsetX(x) {
|
||
this._SetImageOffsetX(x)
|
||
},
|
||
SetImageOffsetY(y) {
|
||
this._SetImageOffsetY(y)
|
||
},
|
||
SetImageScaleX(x) {
|
||
this._SetImageScaleX(x / 100)
|
||
},
|
||
SetImageScaleY(y) {
|
||
this._SetImageScaleY(y / 100)
|
||
},
|
||
SetImageAngle(a) {
|
||
this._SetImageAngle(C3.toRadians(a))
|
||
},
|
||
SetEffect(effect) {
|
||
this.GetWorldInfo().SetBlendMode(effect);
|
||
this._runtime.UpdateRender()
|
||
},
|
||
async LoadURL(url, crossOrigin) {
|
||
if (this._ownImageInfo && this._ownImageInfo.GetURL() === url)
|
||
return;
|
||
const runtime = this._runtime;
|
||
const imageInfo = C3.New(C3.ImageInfo);
|
||
await imageInfo.LoadDynamicAsset(runtime, url);
|
||
if (!imageInfo.IsLoaded()) {
|
||
this.Trigger(C3.Plugins.TiledBg.Cnds.OnURLFailed);
|
||
return
|
||
}
|
||
if (this.WasReleased()) {
|
||
imageInfo.Release();
|
||
return null
|
||
}
|
||
const texture = await imageInfo.LoadStaticTexture(runtime.GetWebGLRenderer(), {
|
||
sampling: this._runtime.GetSampling(),
|
||
wrapX: "repeat",
|
||
wrapY: "repeat"
|
||
});
|
||
if (!texture)
|
||
return;
|
||
if (this.WasReleased()) {
|
||
imageInfo.Release();
|
||
return
|
||
}
|
||
this._ReleaseOwnImage();
|
||
this._ownImageInfo = imageInfo;
|
||
runtime.UpdateRender();
|
||
await this.TriggerAsync(C3.Plugins.TiledBg.Cnds.OnURLLoaded)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.TiledBg.Exps = {
|
||
ImageWidth() {
|
||
return this.GetCurrentImageInfo().GetWidth()
|
||
},
|
||
ImageHeight() {
|
||
return this.GetCurrentImageInfo().GetHeight()
|
||
},
|
||
ImageOffsetX() {
|
||
return this._imageOffsetX
|
||
},
|
||
ImageOffsetY() {
|
||
return this._imageOffsetY
|
||
},
|
||
ImageScaleX() {
|
||
return this._imageScaleX * 100
|
||
},
|
||
ImageScaleY() {
|
||
return this._imageScaleY * 100
|
||
},
|
||
ImageAngle() {
|
||
return C3.toDegrees(this._imageAngle)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.DrawingCanvas = class DrawingCanvasPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.DrawingCanvas.Type = class DrawingCanvasType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const INITIALLY_VISIBLE = 0;
|
||
const ORIGIN = 1;
|
||
const MULTISAMPLING = 2;
|
||
const tempColor = C3.New(C3.Color);
|
||
let drawDepth = 0;
|
||
C3.Plugins.DrawingCanvas.Instance = class DrawingCanvasInstance extends C3.SDKWorldInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
this._renderTarget = null;
|
||
this._rcTex = C3.New(C3.Rect);
|
||
this._multisampling = 0;
|
||
this._texRenderTarget = null;
|
||
this._drawCommands = [];
|
||
this._currentPoly = [];
|
||
this._drawBlendMode = 0;
|
||
this._drawScale = 1;
|
||
this._texScale = 1;
|
||
this._lineDashTexture = null;
|
||
this._savedImageUrl = "";
|
||
this._snapshot = null;
|
||
this._tempRect = C3.New(C3.Rect);
|
||
this._tempQuad = C3.New(C3.Quad);
|
||
if (properties) {
|
||
this.GetWorldInfo().SetVisible(!!properties[INITIALLY_VISIBLE]);
|
||
this._multisampling = [0, 2, 4, 8][properties[MULTISAMPLING]]
|
||
}
|
||
const renderer = this._runtime.GetWebGLRenderer();
|
||
this._SetDrawingBlendMode(0);
|
||
if (renderer.GetWebGLVersionNumber() < 2)
|
||
this._multisampling = 0;
|
||
this._StartTicking2()
|
||
}
|
||
Release() {
|
||
if (this._renderTarget) {
|
||
this._renderTarget.GetWebGLRenderer().DeleteRenderTarget(this._renderTarget);
|
||
this._renderTarget = null
|
||
}
|
||
if (this._texRenderTarget) {
|
||
this._texRenderTarget.GetWebGLRenderer().DeleteRenderTarget(this._texRenderTarget);
|
||
this._texRenderTarget = null
|
||
}
|
||
C3.clearArray(this._drawCommands);
|
||
super.Release()
|
||
}
|
||
_ClonePoly() {
|
||
return this._currentPoly.map(p=>p.slice(0))
|
||
}
|
||
_GetLineDashTexture() {
|
||
this._MaybeCreateLineDashTexture();
|
||
return this._lineDashTexture
|
||
}
|
||
_MaybeCreateLineDashTexture() {
|
||
if (this._lineDashTexture)
|
||
return;
|
||
const canvas = C3.CreateCanvas(512, 8);
|
||
const ctx = canvas.getContext("2d");
|
||
ctx.clearRect(0, 0, 512, 8);
|
||
ctx.fillStyle = "white";
|
||
ctx.fillRect(0, 0, 256, 8);
|
||
this._lineDashTexture = this._runtime.GetWebGLRenderer().CreateStaticTexture(canvas, {
|
||
wrapX: "repeat",
|
||
sampling: this._runtime.GetSampling()
|
||
})
|
||
}
|
||
_SetDrawingBlendMode(bm) {
|
||
this._drawBlendMode = bm
|
||
}
|
||
_ApplyCurrentDrawingBlendMode(renderer) {
|
||
renderer.SetBlendMode(this._drawBlendMode)
|
||
}
|
||
_AddDrawCommand(cmd) {
|
||
this._drawCommands.push(cmd);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
_UpdateRenderTargetSize(renderer, rtWidth, rtHeight) {
|
||
if (this._renderTarget)
|
||
renderer.DeleteRenderTarget(this._renderTarget);
|
||
this._renderTarget = renderer.CreateRenderTarget({
|
||
width: rtWidth,
|
||
height: rtHeight,
|
||
sampling: this._runtime.GetSampling(),
|
||
readback: this._multisampling === 0,
|
||
multisampling: this._multisampling
|
||
});
|
||
if (this._multisampling > 0) {
|
||
if (this._texRenderTarget)
|
||
renderer.DeleteRenderTarget(this._texRenderTarget);
|
||
this._texRenderTarget = renderer.CreateRenderTarget({
|
||
width: rtWidth,
|
||
height: rtHeight,
|
||
sampling: this._runtime.GetSampling(),
|
||
readback: true
|
||
})
|
||
}
|
||
renderer.SetTexture(null)
|
||
}
|
||
_GetRenderTarget() {
|
||
return this._renderTarget
|
||
}
|
||
_GetTexRenderTarget() {
|
||
return this._texRenderTarget
|
||
}
|
||
GetMultisampling() {
|
||
return this._multisampling
|
||
}
|
||
_SetRenderTargetDeviceTransform(renderer) {
|
||
this._runtime.GetCanvasManager().SetDeviceTransform(renderer, this._renderTarget.GetWidth(), this._renderTarget.GetHeight())
|
||
}
|
||
HasAnyDrawingCommandInQueue() {
|
||
return this._drawCommands.some(c=>!(c instanceof C3.Plugins.DrawingCanvas.DrawCommand.SaveImage))
|
||
}
|
||
Tick2() {
|
||
const renderer = this._runtime.GetWebGLRenderer();
|
||
const wi = this.GetWorldInfo();
|
||
const layer = wi.GetLayer();
|
||
const layout = layer.GetLayout();
|
||
const tempQuad = this._tempQuad;
|
||
const tempRect = this._tempRect;
|
||
++drawDepth;
|
||
const angle = wi.GetAngle();
|
||
const layerAngle = layer.GetOwnAngle();
|
||
const layoutAngle = layout.GetAngle();
|
||
if (angle !== 0 || layerAngle !== 0 || layoutAngle !== 0) {
|
||
layout.SetAngle(0);
|
||
layer.SetAngle(0);
|
||
wi.SetAngle(0);
|
||
wi.SetBboxChanged()
|
||
}
|
||
const quad = wi.GetBoundingQuad();
|
||
const [dl,dt] = layer.LayerToDrawSurface(quad.getTlx(), quad.getTly());
|
||
const [dr,db] = layer.LayerToDrawSurface(quad.getBrx(), quad.getBry());
|
||
const offX = dl - Math.round(dl);
|
||
const offY = dt - Math.round(dt);
|
||
tempRect.set(dl, dt, dr, db);
|
||
tempRect.offset(-offX, -offY);
|
||
tempRect.normalize();
|
||
tempQuad.setFromRect(tempRect);
|
||
if (angle !== 0 || layerAngle !== 0 || layoutAngle !== 0) {
|
||
layout.SetAngle(layoutAngle);
|
||
layer.SetAngle(layerAngle);
|
||
wi.SetAngle(angle);
|
||
wi.SetBboxChanged()
|
||
}
|
||
let rtWidth = Math.ceil(tempRect.width());
|
||
let rtHeight = Math.ceil(tempRect.height());
|
||
this._rcTex.set(0, 1, tempRect.width() / rtWidth, 1 - tempRect.height() / rtHeight);
|
||
const maxTextureSize = renderer.GetMaxTextureSize();
|
||
const maxRtDim = Math.max(rtWidth, rtHeight);
|
||
if (maxRtDim > maxTextureSize) {
|
||
this._texScale = maxTextureSize / maxRtDim;
|
||
rtWidth = Math.round(rtWidth * this._texScale);
|
||
rtHeight = Math.round(rtHeight * this._texScale)
|
||
} else
|
||
this._texScale = 1;
|
||
if (rtWidth <= 0 || rtHeight <= 0) {
|
||
--drawDepth;
|
||
return
|
||
}
|
||
this._drawScale = tempRect.width() / wi.GetWidth();
|
||
const drawScale = this._drawScale * this._texScale;
|
||
const didRenderTargetChange = !this._renderTarget || this._renderTarget.GetWidth() !== rtWidth || this._renderTarget.GetHeight() !== rtHeight;
|
||
if (didRenderTargetChange)
|
||
this.Trigger(C3.Plugins.DrawingCanvas.Cnds.OnResolutionChanged);
|
||
if (this._drawCommands.length > 0 || !this._renderTarget) {
|
||
if (!this._renderTarget || didRenderTargetChange && this.HasAnyDrawingCommandInQueue())
|
||
this._UpdateRenderTargetSize(renderer, rtWidth, rtHeight);
|
||
renderer.SetRenderTarget(this._renderTarget);
|
||
this._SetRenderTargetDeviceTransform(renderer);
|
||
this._ApplyCurrentDrawingBlendMode(renderer);
|
||
for (const dc of this._drawCommands)
|
||
dc.Do(renderer, drawScale, this);
|
||
C3.clearArray(this._drawCommands);
|
||
renderer.SetAlphaBlend();
|
||
if (this._multisampling > 0) {
|
||
renderer.SetRenderTarget(this._texRenderTarget);
|
||
renderer.CopyRenderTarget(this._renderTarget, "crop")
|
||
}
|
||
}
|
||
--drawDepth
|
||
}
|
||
Draw(renderer) {
|
||
const wi = this.GetWorldInfo();
|
||
const layer = wi.GetLayer();
|
||
const canvasManager = this._runtime.GetCanvasManager();
|
||
const lastRenderTarget = renderer.GetRenderTarget();
|
||
let quad = this._tempQuad;
|
||
if (!this._renderTarget)
|
||
return;
|
||
renderer.SetTextureFillMode();
|
||
renderer.SetBlendMode(wi.GetBlendMode());
|
||
renderer.SetColor(wi.GetPremultipliedColor());
|
||
if (this._multisampling === 0)
|
||
renderer.SetTexture(this._renderTarget.GetTexture());
|
||
else
|
||
renderer.SetTexture(this._texRenderTarget.GetTexture());
|
||
let didChangeTransform = false;
|
||
if (drawDepth > 0) {
|
||
canvasManager.SetDeviceTransform(renderer, lastRenderTarget.GetWidth(), lastRenderTarget.GetHeight());
|
||
didChangeTransform = true
|
||
} else if (wi.GetAngle() === 0 && wi.GetLayer().GetAngle() === 0) {
|
||
canvasManager.SetDeviceTransform(renderer);
|
||
didChangeTransform = true
|
||
} else
|
||
quad = wi.GetBoundingQuad();
|
||
renderer.Quad3(quad, this._rcTex);
|
||
if (didChangeTransform)
|
||
layer._SetTransform(renderer)
|
||
}
|
||
GetSnapshotPixel(x, y) {
|
||
if (!this._snapshot)
|
||
return [0, 0, 0, 0];
|
||
const width = this._snapshot.width;
|
||
const height = this._snapshot.height;
|
||
x = Math.floor(x);
|
||
y = height - 1 - Math.floor(y);
|
||
if (x < 0 || y < 0 || x >= width || y >= height)
|
||
return [0, 0, 0, 0];
|
||
const data = this._snapshot.data;
|
||
const ptr = y * width * 4 + x * 4;
|
||
let r = data[ptr] / 255;
|
||
let g = data[ptr + 1] / 255;
|
||
let b = data[ptr + 2] / 255;
|
||
let a = data[ptr + 3] / 255;
|
||
if (a !== 0) {
|
||
r /= a;
|
||
g /= a;
|
||
b /= a
|
||
}
|
||
return [r * 100, g * 100, b * 100, a * 100]
|
||
}
|
||
SetSnapshotPixel(x, y, rgb) {
|
||
if (!this._snapshot)
|
||
return [0, 0, 0, 0];
|
||
tempColor.setFromRgbValue(rgb);
|
||
tempColor.premultiply();
|
||
const width = this._snapshot.width;
|
||
const height = this._snapshot.height;
|
||
x = Math.floor(x);
|
||
y = height - 1 - Math.floor(y);
|
||
if (x < 0 || y < 0 || x >= width || y >= height)
|
||
return;
|
||
const data = this._snapshot.data;
|
||
const ptr = y * width * 4 + x * 4;
|
||
data[ptr] = Math.floor(tempColor.getR() * 255);
|
||
data[ptr + 1] = Math.floor(tempColor.getG() * 255);
|
||
data[ptr + 2] = Math.floor(tempColor.getB() * 255);
|
||
data[ptr + 3] = Math.floor(tempColor.getA() * 255)
|
||
}
|
||
GetImagePixelData() {
|
||
return new Promise(resolve=>{
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.SaveImage(async imageData=>{
|
||
const imgDataBuffer = imageData.data.buffer;
|
||
const width = imageData.width;
|
||
const height = imageData.height;
|
||
const processedBuffer = await this._runtime.AddJob("ProcessImageData", {
|
||
"buffer": imgDataBuffer,
|
||
"width": width,
|
||
"height": height,
|
||
"unpremultiply": true,
|
||
"flipY": true
|
||
}, [imgDataBuffer]);
|
||
resolve(new ImageData(new Uint8ClampedArray(processedBuffer),width,height))
|
||
}
|
||
))
|
||
}
|
||
)
|
||
}
|
||
LoadImagePixelData(imageData, premultiplyAlpha, flipY) {
|
||
if (!this._renderTarget)
|
||
throw new Error("canvas not yet ready");
|
||
if (imageData.width !== this._renderTarget.GetWidth() || imageData.height !== this._renderTarget.GetHeight())
|
||
throw new Error(`wrong size ImageData: expected ${this._renderTarget.GetWidth()} x ${this._renderTarget.GetHeight()}, got ${imageData.width} x ${imageData.height}`);
|
||
C3.clearArray(this._drawCommands);
|
||
const renderer = this._runtime.GetWebGLRenderer();
|
||
if (this._texRenderTarget) {
|
||
const lastRenderTarget = renderer.GetRenderTarget();
|
||
const texture = this._texRenderTarget.GetTexture();
|
||
renderer.UpdateTexture(imageData, texture, {
|
||
premultiplyAlpha: !!premultiplyAlpha,
|
||
flipY: !!flipY
|
||
});
|
||
renderer.SetRenderTarget(this._renderTarget);
|
||
renderer.CopyRenderTarget(this._texRenderTarget, "crop");
|
||
renderer.SetRenderTarget(lastRenderTarget)
|
||
} else {
|
||
const texture = this._renderTarget.GetTexture();
|
||
renderer.UpdateTexture(imageData, texture, {
|
||
premultiplyAlpha: !!premultiplyAlpha,
|
||
flipY: !!flipY
|
||
})
|
||
}
|
||
this._runtime.UpdateRender()
|
||
}
|
||
GetScriptInterfaceClass() {
|
||
return self.IDrawingCanvasInstance
|
||
}
|
||
}
|
||
;
|
||
const map = new WeakMap;
|
||
self.IDrawingCanvasInstance = class IDrawingCanvasInstance extends self.IWorldInstance {
|
||
constructor() {
|
||
super();
|
||
map.set(this, self.IInstance._GetInitInst().GetSdkInstance())
|
||
}
|
||
getImagePixelData() {
|
||
return map.get(this).GetImagePixelData()
|
||
}
|
||
loadImagePixelData(imageData, premultiplyAlpha=false) {
|
||
map.get(this).LoadImagePixelData(imageData, premultiplyAlpha, true)
|
||
}
|
||
get surfaceDeviceWidth() {
|
||
const rt = map.get(this)._GetRenderTarget();
|
||
if (!rt)
|
||
throw new Error("canvas not yet ready");
|
||
return rt.GetWidth()
|
||
}
|
||
get surfaceDeviceHeight() {
|
||
const rt = map.get(this)._GetRenderTarget();
|
||
if (!rt)
|
||
throw new Error("canvas not yet ready");
|
||
return rt.GetHeight()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.DrawingCanvas.Cnds = {
|
||
OnSavedImage() {
|
||
return true
|
||
},
|
||
OnSnapshot() {
|
||
return true
|
||
},
|
||
OnResolutionChanged() {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
function SortByInstanceZIndex(a, b) {
|
||
return a.GetWorldInfo().GetZIndex() - b.GetWorldInfo().GetZIndex()
|
||
}
|
||
C3.Plugins.DrawingCanvas.Acts = {
|
||
SetEffect(effect) {
|
||
this.GetWorldInfo().SetBlendMode(effect);
|
||
this._runtime.UpdateRender()
|
||
},
|
||
ClearCanvas(rgb) {
|
||
C3.clearArray(this._drawCommands);
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.ClearCanvas(rgb))
|
||
},
|
||
ClearRect(left, top, right, bottom, rgb) {
|
||
if (left === right || top === bottom)
|
||
return;
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.ClearRect(left,top,right,bottom,rgb))
|
||
},
|
||
FillRect(left, top, right, bottom, rgb) {
|
||
if (left === right || top === bottom)
|
||
return;
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.FillRect(left,top,right,bottom,rgb))
|
||
},
|
||
FillLinearGradient(left, top, right, bottom, rgb1, rgb2, dir) {
|
||
if (left === right || top === bottom)
|
||
return;
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.FillLinearGradient(left,top,right,bottom,rgb1,rgb2,dir))
|
||
},
|
||
FillEllipse(x, y, radiusX, radiusY, rgb, edge) {
|
||
if (radiusX <= 0 || radiusY <= 0)
|
||
return;
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.FillEllipse(x,y,radiusX,radiusY,rgb,edge !== 0))
|
||
},
|
||
OutlineEllipse(x, y, radiusX, radiusY, rgb, thickness, edge) {
|
||
if (radiusX <= 0 || radiusY <= 0 || thickness <= 0)
|
||
return;
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.OutlineEllipse(x,y,radiusX,radiusY,rgb,thickness,edge !== 0))
|
||
},
|
||
OutlineRect(left, top, right, bottom, rgb, thickness) {
|
||
if (left === right || top === bottom || thickness <= 0)
|
||
return;
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.OutlineRect(left,top,right,bottom,rgb,thickness))
|
||
},
|
||
Line(x1, y1, x2, y2, rgb, thickness, cap) {
|
||
if (x1 === x2 && y1 === y2 || thickness <= 0)
|
||
return;
|
||
const capStr = cap === 0 ? "butt" : "square";
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.Line(x1,y1,x2,y2,rgb,thickness,capStr))
|
||
},
|
||
LineDashed(x1, y1, x2, y2, rgb, thickness, dashLength, cap) {
|
||
if (x1 === x2 && y1 === y2 || thickness <= 0 || dashLength <= 0)
|
||
return;
|
||
const capStr = cap === 0 ? "butt" : "square";
|
||
const dashTex = this._GetLineDashTexture();
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.LineDashed(x1,y1,x2,y2,rgb,thickness,dashLength,dashTex,capStr))
|
||
},
|
||
AddPolyPoint(x, y) {
|
||
this._currentPoly.push([x, y])
|
||
},
|
||
ResetPoly() {
|
||
C3.clearArray(this._currentPoly)
|
||
},
|
||
LinePoly(rgb, thickness, cap) {
|
||
if (this._currentPoly.length < 2 || thickness <= 0)
|
||
return;
|
||
const capStr = cap === 0 ? "butt" : "square";
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.LinePoly(this._ClonePoly(),rgb,thickness,capStr))
|
||
},
|
||
LineDashedPoly(rgb, thickness, dashLength, cap) {
|
||
if (this._currentPoly.length < 2 || thickness <= 0 || dashLength <= 0)
|
||
return;
|
||
const capStr = cap === 0 ? "butt" : "square";
|
||
const dashTex = this._GetLineDashTexture();
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.LineDashedPoly(this._ClonePoly(),rgb,thickness,dashLength,dashTex,capStr))
|
||
},
|
||
FillPoly(rgb) {
|
||
if (this._currentPoly.length < 3)
|
||
return;
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.FillPoly(this._ClonePoly(),rgb))
|
||
},
|
||
SetDrawBlend(blendMode) {
|
||
if (blendMode >= 2)
|
||
blendMode++;
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.SetDrawBlend(blendMode))
|
||
},
|
||
PasteObject(objectClass, includeFx) {
|
||
if (!objectClass)
|
||
return;
|
||
const myWi = this.GetWorldInfo();
|
||
const myBbox = myWi.GetBoundingBox();
|
||
const myQuad = myWi.GetBoundingQuad();
|
||
const instances = objectClass.GetCurrentSol().GetInstances().filter(inst=>{
|
||
const instWi = inst.GetWorldInfo();
|
||
return instWi && myBbox.intersectsRect(instWi.GetBoundingBox()) && (myWi.GetAngle() === 0 || myQuad.intersectsQuad(instWi.GetBoundingQuad()))
|
||
}
|
||
);
|
||
if (instances.length === 0)
|
||
return;
|
||
instances.sort(SortByInstanceZIndex);
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.DrawInstances(instances,includeFx !== 0,myWi))
|
||
},
|
||
SaveImage(format, quality, x, y, width, height) {
|
||
const formatStr = format === 0 ? "image/png" : "image/jpeg";
|
||
quality /= 100;
|
||
const areaRect = C3.New(C3.Rect);
|
||
areaRect.setWH(x, y, width, height);
|
||
return new Promise(resolve=>{
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.SaveImage(async imageData=>{
|
||
const imgDataBuffer = imageData.data.buffer;
|
||
const width = imageData.width;
|
||
const height = imageData.height;
|
||
const processedBuffer = await this._runtime.AddJob("ProcessImageData", {
|
||
"buffer": imgDataBuffer,
|
||
"width": width,
|
||
"height": height,
|
||
"unpremultiply": true,
|
||
"flipY": !C3.Supports.ImageBitmapOptions
|
||
}, [imgDataBuffer]);
|
||
imageData = new ImageData(new Uint8ClampedArray(processedBuffer),width,height);
|
||
let blob;
|
||
if (C3.Supports.ImageBitmapOptions) {
|
||
const imageBitmap = await createImageBitmap(imageData, {
|
||
"premultiplyAlpha": "none",
|
||
"imageOrientation": "flipY"
|
||
});
|
||
blob = await C3.DrawableToBlob(imageBitmap, formatStr, quality)
|
||
} else
|
||
blob = await C3.ImageDataToBlob(imageData, formatStr, quality);
|
||
if (this._savedImageUrl)
|
||
URL.revokeObjectURL(this._savedImageUrl);
|
||
this._savedImageUrl = URL.createObjectURL(blob);
|
||
this.Trigger(C3.Plugins.DrawingCanvas.Cnds.OnSavedImage);
|
||
resolve()
|
||
}
|
||
,areaRect))
|
||
}
|
||
)
|
||
},
|
||
SaveSnapshot() {
|
||
return new Promise(resolve=>{
|
||
this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.SaveImage(imageData=>{
|
||
this._snapshot = imageData;
|
||
this.Trigger(C3.Plugins.DrawingCanvas.Cnds.OnSnapshot);
|
||
resolve()
|
||
}
|
||
))
|
||
}
|
||
)
|
||
},
|
||
ClearSnapshot() {
|
||
this._snapshot = null
|
||
},
|
||
SnapshotSetPixel(x, y, rgb) {
|
||
this.SetSnapshotPixel(x, y, rgb)
|
||
},
|
||
LoadSnapshot() {
|
||
if (!this._snapshot || !this._renderTarget)
|
||
return;
|
||
if (this._snapshot.width !== this._renderTarget.GetWidth() || this._snapshot.height !== this._renderTarget.GetHeight())
|
||
return;
|
||
this.LoadImagePixelData(this._snapshot, false)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.DrawingCanvas.Exps = {
|
||
SavedImageURL() {
|
||
return this._savedImageUrl
|
||
},
|
||
SnapshotRedAt(x, y) {
|
||
return this.GetSnapshotPixel(x, y)[0]
|
||
},
|
||
SnapshotGreenAt(x, y) {
|
||
return this.GetSnapshotPixel(x, y)[1]
|
||
},
|
||
SnapshotBlueAt(x, y) {
|
||
return this.GetSnapshotPixel(x, y)[2]
|
||
},
|
||
SnapshotAlphaAt(x, y) {
|
||
return this.GetSnapshotPixel(x, y)[3]
|
||
},
|
||
SnapshotWidth() {
|
||
return this._snapshot ? this._snapshot.width : 0
|
||
},
|
||
SnapshotHeight() {
|
||
return this._snapshot ? this._snapshot.height : 0
|
||
},
|
||
PixelScale() {
|
||
return 1 / (this._drawScale * this._texScale)
|
||
},
|
||
SurfaceDeviceWidth() {
|
||
const rt = this._GetRenderTarget();
|
||
return rt ? rt.GetWidth() : 0
|
||
},
|
||
SurfaceDeviceHeight() {
|
||
const rt = this._GetRenderTarget();
|
||
return rt ? rt.GetHeight() : 0
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const tempQuad = C3.New(C3.Quad);
|
||
const tempUvQuad = C3.New(C3.Quad);
|
||
const tempVector2 = C3.New(C3.Vector2);
|
||
C3.Plugins.DrawingCanvas.DrawCommand = class DrawCommand {
|
||
constructor() {}
|
||
Do(renderer) {
|
||
throw new Error("required override");
|
||
}
|
||
}
|
||
;
|
||
const DrawCommand = C3.Plugins.DrawingCanvas.DrawCommand;
|
||
DrawCommand.SaveImage = class SaveImageCommand extends DrawCommand {
|
||
constructor(callback, areaRect) {
|
||
super();
|
||
this._callback = callback;
|
||
this._areaRect = areaRect
|
||
}
|
||
Do(renderer, scale, canvasInst) {
|
||
let readRenderTarget = renderer.GetRenderTarget();
|
||
if (readRenderTarget.GetMultisampling() > 0) {
|
||
const texRenderTarget = canvasInst._GetTexRenderTarget();
|
||
renderer.SetRenderTarget(texRenderTarget);
|
||
renderer.CopyRenderTarget(readRenderTarget, "crop");
|
||
renderer.SetRenderTarget(readRenderTarget);
|
||
readRenderTarget = texRenderTarget
|
||
}
|
||
renderer.ReadBackRenderTargetToImageData(readRenderTarget, false, this._areaRect).then(this._callback)
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.ClearCanvas = class ClearCanvasCommand extends DrawCommand {
|
||
constructor(rgb) {
|
||
super();
|
||
this._color = C3.New(C3.Color);
|
||
this._color.setFromRgbValue(rgb);
|
||
this._color.premultiply()
|
||
}
|
||
Do(renderer) {
|
||
renderer.Clear(this._color)
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.ClearRect = class ClearRectCommand extends DrawCommand {
|
||
constructor(left, top, right, bottom, rgb) {
|
||
super();
|
||
this._rect = C3.New(C3.Rect);
|
||
this._rect.set(left, top, right, bottom);
|
||
this._color = C3.New(C3.Color);
|
||
this._color.setFromRgbValue(rgb);
|
||
this._color.premultiply()
|
||
}
|
||
Do(renderer, scale, inst) {
|
||
const rtHeight = inst._GetRenderTarget().GetHeight();
|
||
this._rect.multiply(scale, scale);
|
||
this._rect.shuntY(rtHeight);
|
||
renderer.ClearRect3(this._rect, this._color)
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.FillRect = class FillRectCommand extends DrawCommand {
|
||
constructor(left, top, right, bottom, rgb) {
|
||
super();
|
||
this._rect = C3.New(C3.Rect);
|
||
this._rect.set(left, top, right, bottom);
|
||
this._color = C3.New(C3.Color);
|
||
this._color.setFromRgbValue(rgb);
|
||
this._color.premultiply()
|
||
}
|
||
Do(renderer, scale) {
|
||
renderer.SetColorFillMode();
|
||
renderer.SetColor(this._color);
|
||
this._rect.multiply(scale, scale);
|
||
renderer.Rect(this._rect)
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.FillLinearGradient = class FillLinearGradientCommand extends DrawCommand {
|
||
constructor(left, top, right, bottom, rgb1, rgb2, dir) {
|
||
super();
|
||
this._rect = C3.New(C3.Rect);
|
||
this._rect.set(left, top, right, bottom);
|
||
this._color1 = C3.New(C3.Color);
|
||
this._color1.setFromRgbValue(rgb1);
|
||
this._color2 = C3.New(C3.Color);
|
||
this._color2.setFromRgbValue(rgb2);
|
||
this._dir = dir
|
||
}
|
||
Do(renderer, scale) {
|
||
renderer.SetLinearGradientFillMode();
|
||
renderer.SetColor(this._color1);
|
||
renderer.SetGradientColor(this._color2);
|
||
this._rect.multiply(scale, scale);
|
||
tempQuad.setFromRect(this._rect);
|
||
if (this._dir === 0)
|
||
tempUvQuad.set(0, 0, 1, 0, 1, 1, 0, 1);
|
||
else
|
||
tempUvQuad.set(0, 1, 0, 0, 1, 0, 1, 1);
|
||
renderer.Quad4(tempQuad, tempUvQuad)
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.FillEllipse = class FillEllipseCommand extends DrawCommand {
|
||
constructor(x, y, radiusX, radiusY, rgb, isSmooth) {
|
||
super();
|
||
this._rect = C3.New(C3.Rect);
|
||
this._rect.set(x - radiusX, y - radiusY, x + radiusX, y + radiusY);
|
||
this._color = C3.New(C3.Color);
|
||
this._color.setFromRgbValue(rgb);
|
||
this._color.premultiply();
|
||
this._isSmooth = isSmooth
|
||
}
|
||
Do(renderer, scale) {
|
||
this._rect.multiply(scale, scale);
|
||
if (this._isSmooth) {
|
||
renderer.SetSmoothEllipseFillMode();
|
||
renderer.SetColor(this._color);
|
||
this._rect.inflate(.5, .5);
|
||
renderer.SetEllipseParams(1 / this._rect.width(), 1 / this._rect.height());
|
||
renderer.Rect(this._rect)
|
||
} else {
|
||
renderer.SetHardEllipseFillMode();
|
||
renderer.SetColor(this._color);
|
||
renderer.Rect(this._rect)
|
||
}
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.OutlineEllipse = class OutlinellipseCommand extends DrawCommand {
|
||
constructor(x, y, radiusX, radiusY, rgb, thickness, isSmooth) {
|
||
super();
|
||
this._rect = C3.New(C3.Rect);
|
||
this._rect.set(x - radiusX, y - radiusY, x + radiusX, y + radiusY);
|
||
this._color = C3.New(C3.Color);
|
||
this._color.setFromRgbValue(rgb);
|
||
this._color.premultiply();
|
||
this._thickness = thickness;
|
||
this._isSmooth = isSmooth
|
||
}
|
||
Do(renderer, scale) {
|
||
this._rect.multiply(scale, scale);
|
||
if (this._isSmooth) {
|
||
renderer.SetSmoothEllipseOutlineMode();
|
||
renderer.SetColor(this._color);
|
||
this._rect.inflate(.5, .5);
|
||
renderer.SetEllipseParams(1 / this._rect.width(), 1 / this._rect.height(), this._thickness * scale);
|
||
renderer.Rect(this._rect)
|
||
} else {
|
||
renderer.SetHardEllipseOutlineMode();
|
||
renderer.SetEllipseParams(1 / this._rect.width(), 1 / this._rect.height(), this._thickness * scale);
|
||
renderer.SetColor(this._color);
|
||
renderer.Rect(this._rect)
|
||
}
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.OutlineRect = class OutlineRectCommand extends DrawCommand {
|
||
constructor(left, top, right, bottom, rgb, thickness) {
|
||
super();
|
||
this._rect = C3.New(C3.Rect);
|
||
this._rect.set(left, top, right, bottom);
|
||
this._color = C3.New(C3.Color);
|
||
this._color.setFromRgbValue(rgb);
|
||
this._color.premultiply();
|
||
this._thickness = thickness
|
||
}
|
||
Do(renderer, scale) {
|
||
renderer.SetColorFillMode();
|
||
renderer.SetColor(this._color);
|
||
renderer.PushLineCapZag();
|
||
renderer.PushLineWidth(this._thickness * scale);
|
||
this._rect.multiply(scale, scale);
|
||
renderer.LineRect2(this._rect);
|
||
renderer.PopLineCap();
|
||
renderer.PopLineWidth()
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.Line = class LineCommand extends DrawCommand {
|
||
constructor(x1, y1, x2, y2, rgb, thickness, cap) {
|
||
super();
|
||
this._rect = C3.New(C3.Rect);
|
||
this._rect.set(x1, y1, x2, y2);
|
||
this._color = C3.New(C3.Color);
|
||
this._color.setFromRgbValue(rgb);
|
||
this._color.premultiply();
|
||
this._thickness = thickness;
|
||
this._cap = cap
|
||
}
|
||
Do(renderer, scale) {
|
||
renderer.SetColorFillMode();
|
||
renderer.SetColor(this._color);
|
||
renderer.PushLineCap(this._cap);
|
||
renderer.PushLineWidth(this._thickness * scale);
|
||
const rc = this._rect;
|
||
rc.multiply(scale, scale);
|
||
renderer.Line(rc.getLeft(), rc.getTop(), rc.getRight(), rc.getBottom());
|
||
renderer.PopLineCap();
|
||
renderer.PopLineWidth()
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.LinePoly = class LinePolyCommand extends DrawCommand {
|
||
constructor(poly, rgb, thickness, cap) {
|
||
super();
|
||
this._poly = poly;
|
||
this._color = C3.New(C3.Color);
|
||
this._color.setFromRgbValue(rgb);
|
||
this._color.premultiply();
|
||
this._thickness = thickness;
|
||
this._cap = cap
|
||
}
|
||
Do(renderer, scale) {
|
||
renderer.SetColorFillMode();
|
||
renderer.SetColor(this._color);
|
||
renderer.PushLineCap(this._cap);
|
||
renderer.PushLineWidth(this._thickness * scale);
|
||
const poly = this._poly;
|
||
for (let i = 0, len = poly.length; i < len; ++i) {
|
||
const j = (i + 1) % len;
|
||
const x1 = poly[i][0] * scale;
|
||
const y1 = poly[i][1] * scale;
|
||
const x2 = poly[j][0] * scale;
|
||
const y2 = poly[j][1] * scale;
|
||
renderer.Line(x1, y1, x2, y2)
|
||
}
|
||
renderer.PopLineCap();
|
||
renderer.PopLineWidth()
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.LineDashed = class LineDashedCommand extends DrawCommand {
|
||
constructor(x1, y1, x2, y2, rgb, thickness, dashLength, dashTex, cap) {
|
||
super();
|
||
this._rect = C3.New(C3.Rect);
|
||
this._rect.set(x1, y1, x2, y2);
|
||
this._color = C3.New(C3.Color);
|
||
this._color.setFromRgbValue(rgb);
|
||
this._color.premultiply();
|
||
this._thickness = thickness;
|
||
this._dashLength = dashLength;
|
||
this._dashTex = dashTex;
|
||
this._cap = cap
|
||
}
|
||
Do(renderer, scale) {
|
||
renderer.SetTextureFillMode();
|
||
renderer.SetTexture(this._dashTex);
|
||
renderer.SetColor(this._color);
|
||
renderer.PushLineCap(this._cap);
|
||
renderer.PushLineWidth(this._thickness * scale);
|
||
const rc = this._rect;
|
||
const numDashes = C3.distanceTo(rc.getLeft(), rc.getTop(), rc.getRight(), rc.getBottom()) / (this._dashLength * 2);
|
||
rc.multiply(scale, scale);
|
||
renderer.TexturedLine(rc.getLeft(), rc.getTop(), rc.getRight(), rc.getBottom(), 0, numDashes);
|
||
renderer.PopLineCap();
|
||
renderer.PopLineWidth()
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.LineDashedPoly = class LineDashedPolyCommand extends DrawCommand {
|
||
constructor(poly, rgb, thickness, dashLength, dashTex, cap) {
|
||
super();
|
||
this._poly = poly;
|
||
this._color = C3.New(C3.Color);
|
||
this._color.setFromRgbValue(rgb);
|
||
this._color.premultiply();
|
||
this._thickness = thickness;
|
||
this._dashLength = dashLength;
|
||
this._dashTex = dashTex;
|
||
this._cap = cap
|
||
}
|
||
Do(renderer, scale) {
|
||
renderer.SetTextureFillMode();
|
||
renderer.SetTexture(this._dashTex);
|
||
renderer.SetColor(this._color);
|
||
renderer.PushLineCap(this._cap);
|
||
renderer.PushLineWidth(this._thickness * scale);
|
||
let u = 0;
|
||
const poly = this._poly;
|
||
for (let i = 0, len = poly.length; i < len; ++i) {
|
||
const j = (i + 1) % len;
|
||
const x1 = poly[i][0];
|
||
const y1 = poly[i][1];
|
||
const x2 = poly[j][0];
|
||
const y2 = poly[j][1];
|
||
const v = u + C3.distanceTo(x1, y1, x2, y2) / (this._dashLength * 2);
|
||
renderer.TexturedLine(x1 * scale, y1 * scale, x2 * scale, y2 * scale, u, v);
|
||
u = v - Math.floor(v)
|
||
}
|
||
renderer.PopLineCap();
|
||
renderer.PopLineWidth()
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.FillPoly = class FillPolyCommand extends DrawCommand {
|
||
constructor(poly, rgb) {
|
||
super();
|
||
this._poly = poly;
|
||
this._color = C3.New(C3.Color);
|
||
this._color.setFromRgbValue(rgb);
|
||
this._color.premultiply()
|
||
}
|
||
Do(renderer, scale) {
|
||
renderer.SetColorFillMode();
|
||
renderer.SetColor(this._color);
|
||
const poly = this._poly;
|
||
for (let i = 0, len = poly.length; i < len; ++i) {
|
||
const p = poly[i];
|
||
p[0] *= scale;
|
||
p[1] *= scale
|
||
}
|
||
const polyDecomp = self.polyDecomp;
|
||
if (!polyDecomp.isSimple(poly))
|
||
return;
|
||
polyDecomp.makeCCW(poly);
|
||
polyDecomp.removeCollinearPoints(poly, C3.toRadians(.1));
|
||
const convexPolygons = polyDecomp.quickDecomp(poly);
|
||
for (const convexPoly of convexPolygons)
|
||
renderer.ConvexPoly(convexPoly.flat())
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.SetDrawBlend = class SetDrawBlend extends DrawCommand {
|
||
constructor(bm) {
|
||
super();
|
||
this._blendIndex = bm
|
||
}
|
||
Do(renderer, scale, canvasInst) {
|
||
canvasInst._SetDrawingBlendMode(this._blendIndex);
|
||
canvasInst._ApplyCurrentDrawingBlendMode(renderer)
|
||
}
|
||
}
|
||
;
|
||
DrawCommand.DrawInstances = class DrawInstancesCommand extends DrawCommand {
|
||
constructor(instances, includeFx, canvasWi) {
|
||
super();
|
||
this._includeFx = includeFx;
|
||
this._instances = instances.map(inst=>this._SaveInstanceState(inst, canvasWi))
|
||
}
|
||
_SaveInstanceState(inst, canvasWi) {
|
||
const canvasAngle = canvasWi.GetAngle();
|
||
const canvasLayer = canvasWi.GetLayer();
|
||
const instWi = inst.GetWorldInfo();
|
||
const instLayer = instWi.GetLayer();
|
||
const oldX = instWi.GetX();
|
||
const oldY = instWi.GetY();
|
||
const oldWidth = instWi.GetWidth();
|
||
const oldHeight = instWi.GetHeight();
|
||
const oldAngle = instWi.GetAngle();
|
||
const areLayerTransformsCompatible = canvasLayer.IsTransformCompatibleWith(instLayer);
|
||
if (!areLayerTransformsCompatible) {
|
||
const [dsx,dsy] = instLayer.LayerToDrawSurface(oldX, oldY);
|
||
const [tx,ty] = canvasLayer.DrawSurfaceToLayer(dsx, dsy);
|
||
instWi.SetXY(tx, ty);
|
||
const scaleFactor = instLayer.GetNormalScale() / canvasLayer.GetNormalScale();
|
||
instWi.SetSize(oldWidth * scaleFactor, oldHeight * scaleFactor);
|
||
const angleOffset = canvasLayer.GetOwnAngle() - instLayer.GetOwnAngle();
|
||
instWi.OffsetAngle(angleOffset)
|
||
}
|
||
if (canvasAngle !== 0) {
|
||
const canvasQuad = canvasWi.GetBoundingQuad();
|
||
const canvasMidX = canvasQuad.midX();
|
||
const canvasMidY = canvasQuad.midY();
|
||
const sinA = -canvasWi.GetSinAngle();
|
||
const cosA = canvasWi.GetCosAngle();
|
||
tempVector2.set(oldX, oldY);
|
||
tempVector2.offset(-canvasMidX, -canvasMidY);
|
||
tempVector2.rotatePrecalc(sinA, cosA);
|
||
tempVector2.offset(canvasMidX, canvasMidY);
|
||
instWi.SetXY(tempVector2.getX(), tempVector2.getY());
|
||
instWi.OffsetAngle(-canvasAngle)
|
||
}
|
||
if (canvasAngle !== 0 || !areLayerTransformsCompatible)
|
||
instWi.SetBboxChanged();
|
||
const ret = [inst, inst.SaveToJson("visual-state")];
|
||
if (canvasAngle !== 0 || !areLayerTransformsCompatible) {
|
||
instWi.SetXY(oldX, oldY);
|
||
instWi.SetSize(oldWidth, oldHeight);
|
||
instWi.SetAngle(oldAngle);
|
||
instWi.SetBboxChanged()
|
||
}
|
||
return ret
|
||
}
|
||
Do(renderer, scale, canvasInst) {
|
||
const canvasManager = canvasInst.GetRuntime().GetCanvasManager();
|
||
const layer = canvasInst.GetWorldInfo().GetLayer();
|
||
const viewport = layer.GetViewport();
|
||
const canvasBbox = canvasInst.GetWorldInfo().GetBoundingBox();
|
||
const renderTarget = canvasInst._GetRenderTarget();
|
||
const isMultisamplng = canvasInst.GetMultisampling() > 0;
|
||
const includeFx = this._includeFx;
|
||
const viewOffX = (viewport.width() - canvasBbox.width()) / -2;
|
||
const viewOffY = (viewport.height() - canvasBbox.height()) / -2;
|
||
const [canvasDeviceLeft,canvasDeviceTop] = layer.LayerToDrawSurface(canvasBbox.getLeft(), canvasBbox.getTop());
|
||
canvasManager.SetDeviceTransformOffset(canvasDeviceLeft, canvasDeviceTop);
|
||
const canvasOffX = canvasBbox.getLeft() - viewport.getLeft();
|
||
const canvasOffY = canvasBbox.getTop() - viewport.getTop();
|
||
const offX = viewOffX + canvasOffX;
|
||
const offY = viewOffY + canvasOffY;
|
||
layer._SetTransform(renderer, offX, offY);
|
||
for (let i = 0, len = this._instances.length; i < len; ++i) {
|
||
const info = this._instances[i];
|
||
const inst = info[0];
|
||
const instState = info[1];
|
||
if (inst.IsDestroyed())
|
||
continue;
|
||
const wi = inst.GetWorldInfo();
|
||
const bbox = wi.GetBoundingBox();
|
||
const oldState = inst.SaveToJson("visual-state");
|
||
inst.LoadFromJson(instState, "visual-state");
|
||
wi.GetBoundingBox();
|
||
if (includeFx && wi.HasAnyActiveEffect() && (!isMultisamplng || !wi.GetInstanceEffectList().HasAnyActiveBackgroundBlendingEffect())) {
|
||
bbox.offset(-offX, -offY);
|
||
const opts = {
|
||
preTransform: ()=>layer._SetTransform(renderer, offX, offY)
|
||
};
|
||
if (layer._DrawInstanceWithEffects(inst, wi, renderer, renderTarget, opts))
|
||
layer._SetTransform(renderer, offX, offY);
|
||
wi.SetBboxChanged();
|
||
wi.GetBoundingBox()
|
||
} else
|
||
layer._DrawInstance(inst, wi, renderer);
|
||
inst.LoadFromJson(oldState, "visual-state")
|
||
}
|
||
canvasManager.SetDeviceTransformOffset(0, 0);
|
||
canvasInst._SetRenderTargetDeviceTransform(renderer);
|
||
canvasInst._ApplyCurrentDrawingBlendMode(renderer)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Audio = class AudioPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Audio.Type = class AudioType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
GetScriptInterfaceClass() {
|
||
return self.IAudioObjectType
|
||
}
|
||
}
|
||
;
|
||
function GetAudioDOMInterface() {
|
||
if (self["C3Audio_DOMInterface"])
|
||
return self["C3Audio_DOMInterface"];
|
||
else
|
||
throw new Error("audio scripting API cannot be used here - make sure the project is using DOM mode, not worker mode");
|
||
}
|
||
self.IAudioObjectType = class IAudioObjectType extends self.IObjectClass {
|
||
constructor(objectType) {
|
||
super(objectType)
|
||
}
|
||
get audioContext() {
|
||
return GetAudioDOMInterface().GetAudioContext()
|
||
}
|
||
get destinationNode() {
|
||
return GetAudioDOMInterface().GetDestinationNode()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const DOM_COMPONENT_ID = "audio";
|
||
const LATENCY_HINTS = ["interactive", "balanced", "playback"];
|
||
C3.Plugins.Audio.Instance = class AudioInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst, DOM_COMPONENT_ID);
|
||
this._nextPlayTime = 0;
|
||
this._triggerTag = "";
|
||
this._timeScaleMode = 0;
|
||
this._saveLoadMode = 0;
|
||
this._playInBackground = false;
|
||
this._panningModel = 1;
|
||
this._distanceModel = 1;
|
||
this._listenerX = this._runtime.GetViewportWidth() / 2;
|
||
this._listenerY = this._runtime.GetViewportHeight() / 2;
|
||
this._listenerZ = -600;
|
||
this._referenceDistance = 600;
|
||
this._maxDistance = 1E4;
|
||
this._rolloffFactor = 1;
|
||
this._listenerInst = null;
|
||
this._loadListenerUid = -1;
|
||
this._masterVolume = 1;
|
||
this._isSilent = false;
|
||
this._sampleRate = 0;
|
||
this._effectCount = new Map;
|
||
this._preloadTotal = 0;
|
||
this._preloadCount = 0;
|
||
this._remoteUrls = new Map;
|
||
let latencyHint = "interactive";
|
||
if (properties) {
|
||
this._timeScaleMode = properties[0];
|
||
this._saveLoadMode = properties[1];
|
||
this._playInBackground = properties[2];
|
||
latencyHint = LATENCY_HINTS[properties[3]];
|
||
this._panningModel = properties[4];
|
||
this._distanceModel = properties[5];
|
||
this._listenerZ = -properties[6];
|
||
this._referenceDistance = properties[7];
|
||
this._maxDistance = properties[8];
|
||
this._rolloffFactor = properties[9]
|
||
}
|
||
this._lastAIState = [];
|
||
this._lastFxState = [];
|
||
this._lastAnalysersData = [];
|
||
this.AddDOMMessageHandlers([["state", e=>this._OnUpdateState(e)], ["fxstate", e=>this._OnUpdateFxState(e)], ["trigger", e=>this._OnTrigger(e)]]);
|
||
const rt = this.GetRuntime().Dispatcher();
|
||
this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "instancedestroy", e=>this._OnInstanceDestroyed(e.instance)),C3.Disposable.From(rt, "afterload", ()=>this._OnAfterLoad()),C3.Disposable.From(rt, "suspend", ()=>this._OnSuspend()),C3.Disposable.From(rt, "resume", ()=>this._OnResume()));
|
||
this._runtime.AddLoadPromise(this.PostToDOMAsync("create-audio-context", {
|
||
"preloadList": this._runtime.GetAssetManager().GetAudioToPreload().map(o=>({
|
||
"originalUrl": o.originalUrl,
|
||
"url": o.url,
|
||
"type": o.type,
|
||
"fileSize": o.fileSize
|
||
})),
|
||
"isiOSCordova": this._runtime.IsiOSCordova(),
|
||
"timeScaleMode": this._timeScaleMode,
|
||
"latencyHint": latencyHint,
|
||
"panningModel": this._panningModel,
|
||
"distanceModel": this._distanceModel,
|
||
"refDistance": this._referenceDistance,
|
||
"maxDistance": this._maxDistance,
|
||
"rolloffFactor": this._rolloffFactor,
|
||
"listenerPos": [this._listenerX, this._listenerY, this._listenerZ]
|
||
}).then(info=>{
|
||
this._sampleRate = info["sampleRate"]
|
||
}
|
||
));
|
||
this._StartTicking()
|
||
}
|
||
Release() {
|
||
this._listenerInst = null;
|
||
super.Release()
|
||
}
|
||
_OnInstanceDestroyed(inst) {
|
||
if (this._listenerInst === inst)
|
||
this._listenerInst = null
|
||
}
|
||
DbToLinearNoCap(x) {
|
||
return Math.pow(10, x / 20)
|
||
}
|
||
DbToLinear(x) {
|
||
const v = this.DbToLinearNoCap(x);
|
||
if (!isFinite(v))
|
||
return 0;
|
||
return Math.max(Math.min(v, 1), 0)
|
||
}
|
||
LinearToDbNoCap(x) {
|
||
return Math.log(x) / Math.log(10) * 20
|
||
}
|
||
LinearToDb(x) {
|
||
return this.LinearToDbNoCap(Math.max(Math.min(x, 1), 0))
|
||
}
|
||
_OnSuspend() {
|
||
if (this._playInBackground)
|
||
return;
|
||
this.PostToDOM("set-suspended", {
|
||
"isSuspended": true
|
||
})
|
||
}
|
||
_OnResume() {
|
||
if (this._playInBackground)
|
||
return;
|
||
this.PostToDOM("set-suspended", {
|
||
"isSuspended": false
|
||
})
|
||
}
|
||
_OnUpdateState(e) {
|
||
const tickCount = e["tickCount"];
|
||
const preservePlaceholders = this._lastAIState.filter(ai=>ai.hasOwnProperty("placeholder") && (ai["placeholder"] > tickCount || ai["placeholder"] === -1));
|
||
this._lastAIState = e["audioInstances"];
|
||
this._lastAnalysersData = e["analysers"];
|
||
if (preservePlaceholders.length > 0)
|
||
C3.appendArray(this._lastAIState, preservePlaceholders)
|
||
}
|
||
_OnUpdateFxState(e) {
|
||
this._lastFxState = e["fxstate"]
|
||
}
|
||
_GetFirstAudioStateByTag(tag) {
|
||
for (const a of this._lastAIState)
|
||
if (C3.equalsNoCase(a["tag"], tag))
|
||
return a;
|
||
return null
|
||
}
|
||
_IsTagPlaying(tag) {
|
||
return this._lastAIState.some(ai=>C3.equalsNoCase(tag, ai["tag"]) && ai["isPlaying"])
|
||
}
|
||
_MaybeMarkAsPlaying(tag, isMusic, isLooping, vol) {
|
||
if (this._IsTagPlaying(tag))
|
||
return null;
|
||
const state = {
|
||
"tag": tag,
|
||
"duration": 0,
|
||
"volume": vol,
|
||
"isPlaying": true,
|
||
"playbackTime": 0,
|
||
"playbackRate": 1,
|
||
"uid": -1,
|
||
"bufferOriginalUrl": "",
|
||
"bufferUrl": "",
|
||
"bufferType": "",
|
||
"isMusic": isMusic,
|
||
"isLooping": isLooping,
|
||
"isMuted": false,
|
||
"resumePosition": 0,
|
||
"pan": null,
|
||
"placeholder": -1
|
||
};
|
||
this._lastAIState.push(state);
|
||
return state
|
||
}
|
||
async _OnTrigger(e) {
|
||
const type = e["type"];
|
||
this._triggerTag = e["tag"];
|
||
const aiId = e["aiid"];
|
||
if (type === "ended") {
|
||
for (const aiState of this._lastAIState)
|
||
if (aiState["aiid"] === aiId) {
|
||
aiState["isPlaying"] = false;
|
||
break
|
||
}
|
||
await this.TriggerAsync(C3.Plugins.Audio.Cnds.OnEnded)
|
||
} else if (type === "fade-ended")
|
||
await this.TriggerAsync(C3.Plugins.Audio.Cnds.OnFadeEnded)
|
||
}
|
||
Tick() {
|
||
const o = {
|
||
"timeScale": this._runtime.GetTimeScale(),
|
||
"gameTime": this._runtime.GetGameTime(),
|
||
"instPans": this.GetInstancePans(),
|
||
"tickCount": this._runtime.GetTickCountNoSave()
|
||
};
|
||
if (this._listenerInst) {
|
||
const wi = this._listenerInst.GetWorldInfo();
|
||
this._listenerX = wi.GetX();
|
||
this._listenerY = wi.GetY();
|
||
o["listenerPos"] = [this._listenerX, this._listenerY, this._listenerZ]
|
||
}
|
||
this.PostToDOM("tick", o)
|
||
}
|
||
rotatePtAround(px, py, a, ox, oy) {
|
||
if (a === 0)
|
||
return [px, py];
|
||
const sin_a = Math.sin(a);
|
||
const cos_a = Math.cos(a);
|
||
px -= ox;
|
||
py -= oy;
|
||
const left_sin_a = px * sin_a;
|
||
const top_sin_a = py * sin_a;
|
||
const left_cos_a = px * cos_a;
|
||
const top_cos_a = py * cos_a;
|
||
px = left_cos_a - top_sin_a;
|
||
py = top_cos_a + left_sin_a;
|
||
px += ox;
|
||
py += oy;
|
||
return [px, py]
|
||
}
|
||
GetInstancePans() {
|
||
return this._lastAIState.filter(ai=>ai["uid"] !== -1).map(ai=>this._runtime.GetInstanceByUID(ai["uid"])).filter(inst=>inst).map(inst=>{
|
||
const wi = inst.GetWorldInfo();
|
||
const layerAngle = wi.GetLayer().GetAngle();
|
||
const [x,y] = this.rotatePtAround(wi.GetX(), wi.GetY(), -layerAngle, this._listenerX, this._listenerY);
|
||
return {
|
||
"uid": inst.GetUID(),
|
||
"x": x,
|
||
"y": y,
|
||
"angle": wi.GetAngle() - layerAngle
|
||
}
|
||
}
|
||
)
|
||
}
|
||
GetAnalyserData(tag, index) {
|
||
for (const o of this._lastAnalysersData)
|
||
if (o.index === index && C3.equalsNoCase(o.tag, tag))
|
||
return o;
|
||
return null
|
||
}
|
||
_IncrementEffectCount(tag) {
|
||
this._effectCount.set(tag, (this._effectCount.get(tag) || 0) + 1)
|
||
}
|
||
_ShouldSave(ai) {
|
||
if (ai.hasOwnProperty("placeholder"))
|
||
return false;
|
||
if (this._saveLoadMode === 3)
|
||
return false;
|
||
else if (ai["isMusic"] && this._saveLoadMode === 1)
|
||
return false;
|
||
else if (!ai["isMusic"] && this._saveLoadMode === 2)
|
||
return false;
|
||
else
|
||
return true
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"isSilent": this._isSilent,
|
||
"masterVolume": this._masterVolume,
|
||
"listenerZ": this._listenerZ,
|
||
"listenerUid": this._listenerInst ? this._listenerInst.GetUID() : -1,
|
||
"remoteUrls": [...this._remoteUrls.entries()],
|
||
"playing": this._lastAIState.filter(ai=>this._ShouldSave(ai)),
|
||
"effects": this._lastFxState,
|
||
"analysers": this._lastAnalysersData
|
||
}
|
||
}
|
||
LoadFromJson(o) {
|
||
this._isSilent = o["isSilent"];
|
||
this._masterVolume = o["masterVolume"];
|
||
this._listenerZ = o["listenerZ"];
|
||
this._listenerInst = null;
|
||
this._loadListenerUid = o["listenerUid"];
|
||
this._remoteUrls.clear();
|
||
if (o["remoteUrls"])
|
||
for (const [k,v] of o["remoteUrls"])
|
||
this._remoteUrls.set(k, v);
|
||
this._lastAIState = o["playing"];
|
||
this._lastFxState = o["effects"];
|
||
this._lastAnalysersData = o["analysers"]
|
||
}
|
||
_OnAfterLoad() {
|
||
if (this._loadListenerUid !== -1) {
|
||
this._listenerInst = this._runtime.GetInstanceByUID(this._loadListenerUid);
|
||
this._loadListenerUid = -1;
|
||
if (this._listenerInst) {
|
||
const wi = this._listenerInst.GetWorldInfo();
|
||
this._listenerX = wi.GetX();
|
||
this._listenerY = wi.GetY()
|
||
}
|
||
}
|
||
for (const ai of this._lastAIState) {
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(ai["bufferOriginalUrl"]);
|
||
if (info) {
|
||
ai["bufferUrl"] = info.url;
|
||
ai["bufferType"] = info.type
|
||
} else
|
||
ai["bufferUrl"] = null
|
||
}
|
||
for (const fxChainData of Object.values(this._lastFxState))
|
||
for (const fxData of fxChainData)
|
||
if (fxData.hasOwnProperty("bufferOriginalUrl")) {
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(fxData["bufferOriginalUrl"]);
|
||
if (info) {
|
||
fxData["bufferUrl"] = info.url;
|
||
fxData["bufferType"] = info.type
|
||
}
|
||
}
|
||
this.PostToDOM("load-state", {
|
||
"saveLoadMode": this._saveLoadMode,
|
||
"timeScale": this._runtime.GetTimeScale(),
|
||
"gameTime": this._runtime.GetGameTime(),
|
||
"listenerPos": [this._listenerX, this._listenerY, this._listenerZ],
|
||
"isSilent": this._isSilent,
|
||
"masterVolume": this._masterVolume,
|
||
"playing": this._lastAIState.filter(ai=>ai["bufferUrl"] !== null),
|
||
"effects": this._lastFxState
|
||
})
|
||
}
|
||
GetDebuggerProperties() {
|
||
const fxProps = [];
|
||
for (const [tag,fxChainData] of Object.entries(this._lastFxState))
|
||
fxProps.push({
|
||
name: "$" + tag,
|
||
value: fxChainData.map(d=>d["type"]).join(", ")
|
||
});
|
||
const prefix = "plugins.audio.debugger";
|
||
return [{
|
||
title: prefix + ".tag-effects",
|
||
properties: fxProps
|
||
}, {
|
||
title: prefix + ".currently-playing",
|
||
properties: [{
|
||
name: prefix + ".currently-playing-count",
|
||
value: this._lastAIState.length
|
||
}, ...this._lastAIState.map((s,index)=>({
|
||
name: "$#" + index,
|
||
value: `${s["bufferOriginalUrl"]} ("${s["tag"]}") ${Math.round(s["playbackTime"] * 10) / 10} / ${Math.round(s["duration"] * 10) / 10}`
|
||
}))]
|
||
}]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Audio.Cnds = {
|
||
OnEnded(tag) {
|
||
return C3.equalsNoCase(this._triggerTag, tag)
|
||
},
|
||
OnFadeEnded(tag) {
|
||
return C3.equalsNoCase(this._triggerTag, tag)
|
||
},
|
||
PreloadsComplete() {
|
||
return this._preloadCount === this._preloadTotal
|
||
},
|
||
AdvancedAudioSupported() {
|
||
return true
|
||
},
|
||
IsSilent() {
|
||
return this._isSilent
|
||
},
|
||
IsAnyPlaying() {
|
||
for (const ai of this._lastAIState)
|
||
if (ai["isPlaying"])
|
||
return true;
|
||
return false
|
||
},
|
||
IsTagPlaying(tag) {
|
||
return this._IsTagPlaying(tag)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const FILTER_TYPES = ["lowpass", "highpass", "bandpass", "lowshelf", "highshelf", "peaking", "notch", "allpass"];
|
||
C3.Plugins.Audio.Acts = {
|
||
async Play(file, looping, vol, tag) {
|
||
if (this._isSilent)
|
||
return;
|
||
const isMusic = file[1];
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(file[0]);
|
||
if (!info)
|
||
return;
|
||
const nextPlayTime = this._nextPlayTime;
|
||
this._nextPlayTime = 0;
|
||
const state = this._MaybeMarkAsPlaying(tag.toLowerCase(), isMusic, looping !== 0, this.DbToLinear(vol));
|
||
try {
|
||
await this.PostToDOMAsync("play", {
|
||
"originalUrl": file[0],
|
||
"url": info.url,
|
||
"type": info.type,
|
||
"isMusic": isMusic,
|
||
"tag": tag.toLowerCase(),
|
||
"isLooping": looping !== 0,
|
||
"vol": this.DbToLinear(vol),
|
||
"pos": 0,
|
||
"off": nextPlayTime,
|
||
"trueClock": !!self["C3_GetAudioContextCurrentTime"]
|
||
})
|
||
} finally {
|
||
if (state)
|
||
state["placeholder"] = this._runtime.GetTickCountNoSave()
|
||
}
|
||
},
|
||
async PlayAtPosition(file, looping, vol, x, y, angle, innerAngle, outerAngle, outerGain, tag) {
|
||
if (this._isSilent)
|
||
return;
|
||
const isMusic = file[1];
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(file[0]);
|
||
if (!info)
|
||
return;
|
||
const nextPlayTime = this._nextPlayTime;
|
||
this._nextPlayTime = 0;
|
||
const state = this._MaybeMarkAsPlaying(tag.toLowerCase(), isMusic, looping !== 0, this.DbToLinear(vol));
|
||
try {
|
||
await this.PostToDOMAsync("play", {
|
||
"originalUrl": file[0],
|
||
"url": info.url,
|
||
"type": info.type,
|
||
"isMusic": isMusic,
|
||
"tag": tag.toLowerCase(),
|
||
"isLooping": looping !== 0,
|
||
"vol": this.DbToLinear(vol),
|
||
"pos": 0,
|
||
"off": nextPlayTime,
|
||
"trueClock": !!self["C3_GetAudioContextCurrentTime"],
|
||
"panning": {
|
||
"x": x,
|
||
"y": y,
|
||
"angle": C3.toRadians(angle),
|
||
"innerAngle": C3.toRadians(innerAngle),
|
||
"outerAngle": C3.toRadians(outerAngle),
|
||
"outerGain": this.DbToLinear(outerGain)
|
||
}
|
||
})
|
||
} finally {
|
||
if (state)
|
||
state["placeholder"] = this._runtime.GetTickCountNoSave()
|
||
}
|
||
},
|
||
async PlayAtObject(file, looping, vol, objectClass, innerAngle, outerAngle, outerGain, tag) {
|
||
if (this._isSilent)
|
||
return;
|
||
if (!objectClass)
|
||
return;
|
||
const inst = objectClass.GetFirstPicked();
|
||
if (!inst || !inst.GetWorldInfo())
|
||
return;
|
||
const wi = inst.GetWorldInfo();
|
||
const layerAngle = wi.GetLayer().GetAngle();
|
||
const [x,y] = this.rotatePtAround(wi.GetX(), wi.GetY(), -layerAngle, this._listenerX, this._listenerY);
|
||
const isMusic = file[1];
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(file[0]);
|
||
if (!info)
|
||
return;
|
||
const nextPlayTime = this._nextPlayTime;
|
||
this._nextPlayTime = 0;
|
||
const state = this._MaybeMarkAsPlaying(tag.toLowerCase(), isMusic, looping !== 0, this.DbToLinear(vol));
|
||
try {
|
||
await this.PostToDOMAsync("play", {
|
||
"originalUrl": file[0],
|
||
"url": info.url,
|
||
"type": info.type,
|
||
"isMusic": isMusic,
|
||
"tag": tag.toLowerCase(),
|
||
"isLooping": looping !== 0,
|
||
"vol": this.DbToLinear(vol),
|
||
"pos": 0,
|
||
"off": nextPlayTime,
|
||
"trueClock": !!self["C3_GetAudioContextCurrentTime"],
|
||
"panning": {
|
||
"x": x,
|
||
"y": y,
|
||
"angle": wi.GetAngle() - layerAngle,
|
||
"innerAngle": C3.toRadians(innerAngle),
|
||
"outerAngle": C3.toRadians(outerAngle),
|
||
"outerGain": this.DbToLinear(outerGain),
|
||
"uid": inst.GetUID()
|
||
}
|
||
})
|
||
} finally {
|
||
if (state)
|
||
state["placeholder"] = this._runtime.GetTickCountNoSave()
|
||
}
|
||
},
|
||
async PlayByName(folder, filename, looping, vol, tag) {
|
||
if (this._isSilent)
|
||
return;
|
||
const isMusic = folder === 1;
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(filename) || this._remoteUrls.get(filename.toLowerCase());
|
||
if (!info)
|
||
return;
|
||
const nextPlayTime = this._nextPlayTime;
|
||
this._nextPlayTime = 0;
|
||
const state = this._MaybeMarkAsPlaying(tag.toLowerCase(), isMusic, looping !== 0, this.DbToLinear(vol));
|
||
try {
|
||
await this.PostToDOMAsync("play", {
|
||
"originalUrl": filename,
|
||
"url": info.url,
|
||
"type": info.type,
|
||
"isMusic": isMusic,
|
||
"tag": tag.toLowerCase(),
|
||
"isLooping": looping !== 0,
|
||
"vol": this.DbToLinear(vol),
|
||
"pos": 0,
|
||
"off": nextPlayTime,
|
||
"trueClock": !!self["C3_GetAudioContextCurrentTime"]
|
||
})
|
||
} finally {
|
||
if (state)
|
||
state["placeholder"] = this._runtime.GetTickCountNoSave()
|
||
}
|
||
},
|
||
async PlayAtPositionByName(folder, filename, looping, vol, x, y, angle, innerAngle, outerAngle, outerGain, tag) {
|
||
if (this._isSilent)
|
||
return;
|
||
const isMusic = folder === 1;
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(filename) || this._remoteUrls.get(filename.toLowerCase());
|
||
if (!info)
|
||
return;
|
||
const nextPlayTime = this._nextPlayTime;
|
||
this._nextPlayTime = 0;
|
||
const state = this._MaybeMarkAsPlaying(tag.toLowerCase(), isMusic, looping !== 0, this.DbToLinear(vol));
|
||
try {
|
||
await this.PostToDOMAsync("play", {
|
||
"originalUrl": filename,
|
||
"url": info.url,
|
||
"type": info.type,
|
||
"isMusic": isMusic,
|
||
"tag": tag.toLowerCase(),
|
||
"isLooping": looping !== 0,
|
||
"vol": this.DbToLinear(vol),
|
||
"pos": 0,
|
||
"off": nextPlayTime,
|
||
"trueClock": !!self["C3_GetAudioContextCurrentTime"],
|
||
"panning": {
|
||
"x": x,
|
||
"y": y,
|
||
"angle": C3.toRadians(angle),
|
||
"innerAngle": C3.toRadians(innerAngle),
|
||
"outerAngle": C3.toRadians(outerAngle),
|
||
"outerGain": this.DbToLinear(outerGain)
|
||
}
|
||
})
|
||
} finally {
|
||
if (state)
|
||
state["placeholder"] = this._runtime.GetTickCountNoSave()
|
||
}
|
||
},
|
||
async PlayAtObjectByName(folder, filename, looping, vol, objectClass, innerAngle, outerAngle, outerGain, tag) {
|
||
if (this._isSilent)
|
||
return;
|
||
if (this._isSilent)
|
||
return;
|
||
if (!objectClass)
|
||
return;
|
||
const inst = objectClass.GetFirstPicked();
|
||
if (!inst || !inst.GetWorldInfo())
|
||
return;
|
||
const wi = inst.GetWorldInfo();
|
||
const layerAngle = wi.GetLayer().GetAngle();
|
||
const [x,y] = this.rotatePtAround(wi.GetX(), wi.GetY(), -layerAngle, this._listenerX, this._listenerY);
|
||
const isMusic = folder === 1;
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(filename) || this._remoteUrls.get(filename.toLowerCase());
|
||
if (!info)
|
||
return;
|
||
const nextPlayTime = this._nextPlayTime;
|
||
this._nextPlayTime = 0;
|
||
const state = this._MaybeMarkAsPlaying(tag.toLowerCase(), isMusic, looping !== 0, this.DbToLinear(vol));
|
||
try {
|
||
await this.PostToDOMAsync("play", {
|
||
"originalUrl": filename,
|
||
"url": info.url,
|
||
"type": info.type,
|
||
"isMusic": isMusic,
|
||
"tag": tag.toLowerCase(),
|
||
"isLooping": looping !== 0,
|
||
"vol": this.DbToLinear(vol),
|
||
"pos": 0,
|
||
"off": nextPlayTime,
|
||
"trueClock": !!self["C3_GetAudioContextCurrentTime"],
|
||
"panning": {
|
||
"x": x,
|
||
"y": y,
|
||
"angle": wi.GetAngle() - layerAngle,
|
||
"innerAngle": C3.toRadians(innerAngle),
|
||
"outerAngle": C3.toRadians(outerAngle),
|
||
"outerGain": this.DbToLinear(outerGain),
|
||
"uid": inst.GetUID()
|
||
}
|
||
})
|
||
} finally {
|
||
if (state)
|
||
state["placeholder"] = this._runtime.GetTickCountNoSave()
|
||
}
|
||
},
|
||
SetLooping(tag, looping) {
|
||
this.PostToDOM("set-looping", {
|
||
"tag": tag.toLowerCase(),
|
||
"isLooping": looping === 0
|
||
})
|
||
},
|
||
SetMuted(tag, muted) {
|
||
this.PostToDOM("set-muted", {
|
||
"tag": tag.toLowerCase(),
|
||
"isMuted": muted === 0
|
||
})
|
||
},
|
||
SetVolume(tag, vol) {
|
||
this.PostToDOM("set-volume", {
|
||
"tag": tag.toLowerCase(),
|
||
"vol": this.DbToLinear(vol)
|
||
})
|
||
},
|
||
FadeVolume(tag, vol, duration, ending) {
|
||
this.PostToDOM("fade-volume", {
|
||
"tag": tag.toLowerCase(),
|
||
"vol": this.DbToLinear(vol),
|
||
"duration": duration,
|
||
"stopOnEnd": ending === 0
|
||
})
|
||
},
|
||
async Preload(file) {
|
||
const isMusic = file[1];
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(file[0]);
|
||
if (!info)
|
||
return;
|
||
this._preloadTotal++;
|
||
await this.PostToDOMAsync("preload", {
|
||
"originalUrl": file[0],
|
||
"url": info.url,
|
||
"type": info.type,
|
||
"isMusic": isMusic
|
||
});
|
||
this._preloadCount++
|
||
},
|
||
async PreloadByName(folder, filename) {
|
||
const isMusic = folder === 1;
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(filename) || this._remoteUrls.get(filename.toLowerCase());
|
||
if (!info)
|
||
return;
|
||
this._preloadTotal++;
|
||
await this.PostToDOMAsync("preload", {
|
||
"originalUrl": filename,
|
||
"url": info.url,
|
||
"type": info.type,
|
||
"isMusic": isMusic
|
||
});
|
||
this._preloadCount++
|
||
},
|
||
SetPlaybackRate(tag, rate) {
|
||
this.PostToDOM("set-playback-rate", {
|
||
"tag": tag.toLowerCase(),
|
||
"rate": Math.max(rate, 0)
|
||
})
|
||
},
|
||
Stop(tag) {
|
||
this.PostToDOM("stop", {
|
||
"tag": tag.toLowerCase()
|
||
})
|
||
},
|
||
StopAll() {
|
||
this.PostToDOM("stop-all")
|
||
},
|
||
SetPaused(tag, state) {
|
||
this.PostToDOM("set-paused", {
|
||
"tag": tag.toLowerCase(),
|
||
"paused": state === 0
|
||
})
|
||
},
|
||
Seek(tag, pos) {
|
||
this.PostToDOM("seek", {
|
||
"tag": tag.toLowerCase(),
|
||
"pos": pos
|
||
})
|
||
},
|
||
SetSilent(s) {
|
||
if (s === 2)
|
||
s = this._isSilent ? 1 : 0;
|
||
s = s === 0;
|
||
if (this._isSilent === s)
|
||
return;
|
||
this._isSilent = s;
|
||
this.PostToDOM("set-silent", {
|
||
"isSilent": s
|
||
})
|
||
},
|
||
SetMasterVolume(vol) {
|
||
const mv = this.DbToLinear(vol);
|
||
if (this._masterVolume === mv)
|
||
return;
|
||
this._masterVolume = mv;
|
||
this.PostToDOM("set-master-volume", {
|
||
"vol": mv
|
||
})
|
||
},
|
||
AddFilterEffect(tag, type, freq, detune, q, gain, mix) {
|
||
tag = tag.toLowerCase();
|
||
const typeStr = FILTER_TYPES[type];
|
||
this._IncrementEffectCount(tag);
|
||
this.PostToDOM("add-effect", {
|
||
"type": "filter",
|
||
"tag": tag,
|
||
"params": [typeStr, freq, detune, q, gain, C3.clamp(mix / 100, 0, 1)]
|
||
})
|
||
},
|
||
AddDelayEffect(tag, delay, gain, mix) {
|
||
tag = tag.toLowerCase();
|
||
this._IncrementEffectCount(tag);
|
||
this.PostToDOM("add-effect", {
|
||
"type": "delay",
|
||
"tag": tag,
|
||
"params": [delay, this.DbToLinear(gain), C3.clamp(mix / 100, 0, 1)]
|
||
})
|
||
},
|
||
AddFlangerEffect(tag, delay, modulation, freq, feedback, mix) {
|
||
tag = tag.toLowerCase();
|
||
this._IncrementEffectCount(tag);
|
||
this.PostToDOM("add-effect", {
|
||
"type": "flanger",
|
||
"tag": tag,
|
||
"params": [delay / 1E3, modulation / 1E3, freq, feedback / 100, C3.clamp(mix / 100, 0, 1)]
|
||
})
|
||
},
|
||
AddPhaserEffect(tag, freq, detune, q, mod, modfreq, mix) {
|
||
tag = tag.toLowerCase();
|
||
this._IncrementEffectCount(tag);
|
||
this.PostToDOM("add-effect", {
|
||
"type": "phaser",
|
||
"tag": tag,
|
||
"params": [freq, detune, q, mod, modfreq, C3.clamp(mix / 100, 0, 1)]
|
||
})
|
||
},
|
||
AddConvolutionEffect(tag, file, norm, mix) {
|
||
tag = tag.toLowerCase();
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(file[0]);
|
||
if (!info)
|
||
return;
|
||
this._IncrementEffectCount(tag);
|
||
this.PostToDOM("add-effect", {
|
||
"type": "convolution",
|
||
"tag": tag,
|
||
"bufferOriginalUrl": file[0],
|
||
"bufferUrl": info.url,
|
||
"bufferType": info.type,
|
||
"params": [norm === 0, C3.clamp(mix / 100, 0, 1)]
|
||
})
|
||
},
|
||
AddGainEffect(tag, g) {
|
||
tag = tag.toLowerCase();
|
||
this._IncrementEffectCount(tag);
|
||
this.PostToDOM("add-effect", {
|
||
"type": "gain",
|
||
"tag": tag,
|
||
"params": [this.DbToLinear(g)]
|
||
})
|
||
},
|
||
AddMuteEffect(tag) {
|
||
tag = tag.toLowerCase();
|
||
this._IncrementEffectCount(tag);
|
||
this.PostToDOM("add-effect", {
|
||
"type": "gain",
|
||
"tag": tag,
|
||
"params": [0]
|
||
})
|
||
},
|
||
AddTremoloEffect(tag, freq, mix) {
|
||
tag = tag.toLowerCase();
|
||
this._IncrementEffectCount(tag);
|
||
this.PostToDOM("add-effect", {
|
||
"type": "tremolo",
|
||
"tag": tag,
|
||
"params": [freq, C3.clamp(mix / 100, 0, 1)]
|
||
})
|
||
},
|
||
AddRingModEffect(tag, freq, mix) {
|
||
tag = tag.toLowerCase();
|
||
this._IncrementEffectCount(tag);
|
||
this.PostToDOM("add-effect", {
|
||
"type": "ringmod",
|
||
"tag": tag,
|
||
"params": [freq, C3.clamp(mix / 100, 0, 1)]
|
||
})
|
||
},
|
||
AddDistortionEffect(tag, threshold, headroom, drive, makeupgain, mix) {
|
||
tag = tag.toLowerCase();
|
||
this._IncrementEffectCount(tag);
|
||
this.PostToDOM("add-effect", {
|
||
"type": "distortion",
|
||
"tag": tag,
|
||
"params": [this.DbToLinearNoCap(threshold), this.DbToLinearNoCap(headroom), drive, this.DbToLinearNoCap(makeupgain), C3.clamp(mix / 100, 0, 1)]
|
||
})
|
||
},
|
||
AddCompressorEffect(tag, threshold, knee, ratio, attack, release) {
|
||
tag = tag.toLowerCase();
|
||
this._IncrementEffectCount(tag);
|
||
this.PostToDOM("add-effect", {
|
||
"type": "compressor",
|
||
"tag": tag,
|
||
"params": [threshold, knee, ratio, attack / 1E3, release / 1E3]
|
||
})
|
||
},
|
||
AddAnalyserEffect(tag, fftSize, smoothing) {
|
||
tag = tag.toLowerCase();
|
||
this._IncrementEffectCount(tag);
|
||
this.PostToDOM("add-effect", {
|
||
"type": "analyser",
|
||
"tag": tag,
|
||
"params": [fftSize, smoothing]
|
||
})
|
||
},
|
||
RemoveEffects(tag) {
|
||
tag = tag.toLowerCase();
|
||
this._effectCount.set(tag, 0);
|
||
this.PostToDOM("remove-effects", {
|
||
"tag": tag
|
||
});
|
||
this._lastFxState = {}
|
||
},
|
||
SetEffectParameter(tag, index, param, value, ramp, time) {
|
||
this.PostToDOM("set-effect-param", {
|
||
"tag": tag.toLowerCase(),
|
||
"index": Math.floor(index),
|
||
"param": param,
|
||
"value": value,
|
||
"ramp": ramp,
|
||
"time": time
|
||
})
|
||
},
|
||
SetListenerObject(objectClass) {
|
||
if (!objectClass)
|
||
return;
|
||
const inst = objectClass.GetFirstPicked();
|
||
if (!inst || !inst.GetWorldInfo())
|
||
return;
|
||
this._listenerInst = inst
|
||
},
|
||
SetListenerZ(z) {
|
||
this._listenerZ = z
|
||
},
|
||
ScheduleNextPlay(t) {
|
||
this._nextPlayTime = Math.max(t, 0)
|
||
},
|
||
UnloadAudio(file) {
|
||
const isMusic = file[1];
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(file[0]);
|
||
if (!info)
|
||
return;
|
||
this.PostToDOM("unload", {
|
||
"url": info.url,
|
||
"type": info.type,
|
||
"isMusic": isMusic
|
||
})
|
||
},
|
||
UnloadAudioByName(folder, filename) {
|
||
const isMusic = folder === 1;
|
||
const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(filename) || this._remoteUrls.get(filename.toLowerCase());
|
||
if (!info)
|
||
return;
|
||
this.PostToDOM("unload", {
|
||
"url": info.url,
|
||
"type": info.type,
|
||
"isMusic": isMusic
|
||
})
|
||
},
|
||
UnloadAll() {
|
||
this.PostToDOM("unload-all")
|
||
},
|
||
AddRemoteURL(url, type, name) {
|
||
this._remoteUrls.set(name.toLowerCase(), {
|
||
url,
|
||
type
|
||
})
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.Audio.Exps = {
|
||
Duration(tag) {
|
||
const a = this._GetFirstAudioStateByTag(tag);
|
||
return a ? a["duration"] : 0
|
||
},
|
||
PlaybackTime(tag) {
|
||
const a = this._GetFirstAudioStateByTag(tag);
|
||
return a ? a["playbackTime"] : 0
|
||
},
|
||
PlaybackRate(tag) {
|
||
const a = this._GetFirstAudioStateByTag(tag);
|
||
return a ? a["playbackRate"] : 0
|
||
},
|
||
Volume(tag) {
|
||
const a = this._GetFirstAudioStateByTag(tag);
|
||
return a ? this.LinearToDb(a["volume"]) : 0
|
||
},
|
||
MasterVolume() {
|
||
return this.LinearToDb(this._masterVolume)
|
||
},
|
||
EffectCount(tag) {
|
||
return this._effectCount.get(tag.toLowerCase()) || 0
|
||
},
|
||
AnalyserFreqBinCount(tag, index) {
|
||
const o = this.GetAnalyserData(tag, Math.floor(index));
|
||
return o ? o["binCount"] : 0
|
||
},
|
||
AnalyserFreqBinAt(tag, index, bin) {
|
||
const o = this.GetAnalyserData(tag, Math.floor(index));
|
||
if (!o)
|
||
return 0;
|
||
bin = Math.floor(bin);
|
||
if (bin < 0 || bin >= o["binCount"])
|
||
return 0;
|
||
return o["freqBins"][bin]
|
||
},
|
||
AnalyserPeakLevel(tag, index) {
|
||
const o = this.GetAnalyserData(tag, Math.floor(index));
|
||
return o ? o["peak"] : 0
|
||
},
|
||
AnalyserRMSLevel(tag, index) {
|
||
const o = this.GetAnalyserData(tag, Math.floor(index));
|
||
return o ? o["rms"] : 0
|
||
},
|
||
SampleRate() {
|
||
return this._sampleRate
|
||
},
|
||
CurrentTime() {
|
||
if (self["C3_GetAudioContextCurrentTime"])
|
||
return self["C3_GetAudioContextCurrentTime"]();
|
||
else
|
||
return performance.now() / 1E3
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.LocalStorage = class LocalStoragePlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.LocalStorage.Type = class LocalStorageType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.LocalStorage.Instance = class LocalStorageInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
this._currentKey = "";
|
||
this._lastValue = "";
|
||
this._keyNamesList = [];
|
||
this._errorMessage = "";
|
||
this._pendingGets = 0;
|
||
this._pendingSets = 0;
|
||
this._storage = this._runtime._GetProjectStorage();
|
||
this._debugCache = new Map;
|
||
this._isLoadingDebugCache = false
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
async _TriggerStorageError(err) {
|
||
this._errorMessage = this._GetErrorString(err);
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnError)
|
||
}
|
||
_GetErrorString(err) {
|
||
if (!err)
|
||
return "unknown error";
|
||
else if (typeof err === "string")
|
||
return err;
|
||
else if (typeof err.message === "string")
|
||
return err.message;
|
||
else if (typeof err.name === "string")
|
||
return err.name;
|
||
else if (typeof err.data === "string")
|
||
return err.data;
|
||
else
|
||
return "unknown error"
|
||
}
|
||
GetDebuggerProperties() {
|
||
if (!this._isLoadingDebugCache)
|
||
this._DebugCacheStorage();
|
||
return [{
|
||
title: "plugins.localstorage.name",
|
||
properties: [...this._debugCache.entries()].map(entry=>({
|
||
name: "$" + entry[0],
|
||
value: entry[1],
|
||
onedit: v=>this._storage.setItem(entry[0], v)
|
||
}))
|
||
}]
|
||
}
|
||
async _DebugCacheStorage() {
|
||
this._isLoadingDebugCache = true;
|
||
try {
|
||
const keyList = await this._storage.keys();
|
||
keyList.sort((a,b)=>{
|
||
const la = a.toLowerCase();
|
||
const lb = b.toLowerCase();
|
||
if (la < lb)
|
||
return -1;
|
||
else if (lb < la)
|
||
return 1;
|
||
else
|
||
return 0
|
||
}
|
||
);
|
||
const values = await Promise.all(keyList.map(key=>this._storage.getItem(key)));
|
||
this._debugCache.clear();
|
||
for (let i = 0, len = keyList.length; i < len; ++i)
|
||
this._debugCache.set(keyList[i], values[i])
|
||
} catch (err) {
|
||
console.warn("[C3 debugger] Error displaying local storage: ", err)
|
||
} finally {
|
||
this._isLoadingDebugCache = false
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.LocalStorage.Cnds = {
|
||
OnItemSet(key) {
|
||
return this._currentKey === key
|
||
},
|
||
OnAnyItemSet() {
|
||
return true
|
||
},
|
||
OnItemGet(key) {
|
||
return this._currentKey === key
|
||
},
|
||
OnAnyItemGet() {
|
||
return true
|
||
},
|
||
OnItemRemoved(key) {
|
||
return this._currentKey === key
|
||
},
|
||
OnAnyItemRemoved() {
|
||
return true
|
||
},
|
||
OnCleared() {
|
||
return true
|
||
},
|
||
OnAllKeyNamesLoaded() {
|
||
return true
|
||
},
|
||
OnError() {
|
||
return true
|
||
},
|
||
OnItemExists(key) {
|
||
return this._currentKey === key
|
||
},
|
||
OnItemMissing(key) {
|
||
return this._currentKey === key
|
||
},
|
||
CompareKey(cmp, key) {
|
||
return C3.compare(this._currentKey, cmp, key)
|
||
},
|
||
CompareValue(cmp, v) {
|
||
return C3.compare(this._lastValue, cmp, v)
|
||
},
|
||
IsProcessingSets() {
|
||
return this._pendingSets > 0
|
||
},
|
||
IsProcessingGets() {
|
||
return this._pendingGets > 0
|
||
},
|
||
OnAllSetsComplete() {
|
||
return true
|
||
},
|
||
OnAllGetsComplete() {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
function IsExpressionType(x) {
|
||
return typeof x === "string" || typeof x === "number"
|
||
}
|
||
C3.Plugins.LocalStorage.Acts = {
|
||
async SetItem(key, value) {
|
||
this._pendingSets++;
|
||
try {
|
||
const valueSet = await this._storage.setItem(key, value);
|
||
await this.ScheduleTriggers(async()=>{
|
||
this._currentKey = key;
|
||
this._lastValue = valueSet;
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAnyItemSet);
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemSet)
|
||
}
|
||
)
|
||
} catch (err) {
|
||
await this._TriggerStorageError(err)
|
||
} finally {
|
||
this._pendingSets--;
|
||
if (this._pendingSets === 0)
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAllSetsComplete)
|
||
}
|
||
},
|
||
async SetBinaryItem(key, objectClass) {
|
||
if (!objectClass)
|
||
return;
|
||
const inst = objectClass.GetFirstPicked(this._inst);
|
||
if (!inst)
|
||
return;
|
||
const sdkInst = inst.GetSdkInstance();
|
||
if (!sdkInst)
|
||
return;
|
||
const buffer = sdkInst.GetArrayBufferReadOnly();
|
||
this._pendingSets++;
|
||
try {
|
||
await this._storage.setItem(key, buffer);
|
||
await this.ScheduleTriggers(async()=>{
|
||
this._currentKey = key;
|
||
this._lastValue = "";
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAnyItemSet);
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemSet)
|
||
}
|
||
)
|
||
} catch (err) {
|
||
await this._TriggerStorageError(err)
|
||
} finally {
|
||
this._pendingSets--;
|
||
if (this._pendingSets === 0)
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAllSetsComplete)
|
||
}
|
||
},
|
||
async GetItem(key) {
|
||
this._pendingGets++;
|
||
try {
|
||
const value = await this._storage.getItem(key);
|
||
await this.ScheduleTriggers(async()=>{
|
||
this._currentKey = key;
|
||
this._lastValue = IsExpressionType(value) ? value : "";
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAnyItemGet);
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemGet)
|
||
}
|
||
)
|
||
} catch (err) {
|
||
await this._TriggerStorageError(err)
|
||
} finally {
|
||
this._pendingGets--;
|
||
if (this._pendingGets === 0)
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAllGetsComplete)
|
||
}
|
||
},
|
||
async GetBinaryItem(key, objectClass) {
|
||
if (!objectClass)
|
||
return;
|
||
const inst = objectClass.GetFirstPicked(this._inst);
|
||
if (!inst)
|
||
return;
|
||
const sdkInst = inst.GetSdkInstance();
|
||
this._pendingGets++;
|
||
try {
|
||
let value = await this._storage.getItem(key);
|
||
value = value instanceof ArrayBuffer ? value : new ArrayBuffer(0);
|
||
await this.ScheduleTriggers(async()=>{
|
||
this._lastValue = "";
|
||
this._currentKey = key;
|
||
sdkInst.SetArrayBufferTransfer(value);
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAnyItemGet);
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemGet)
|
||
}
|
||
)
|
||
} catch (err) {
|
||
await this._TriggerStorageError(err)
|
||
} finally {
|
||
this._pendingGets--;
|
||
if (this._pendingGets === 0)
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAllGetsComplete)
|
||
}
|
||
},
|
||
async CheckItemExists(key) {
|
||
try {
|
||
const value = await this._storage.getItem(key);
|
||
await this.ScheduleTriggers(async()=>{
|
||
this._currentKey = key;
|
||
if (typeof value === "undefined" || value === null) {
|
||
this._lastValue = "";
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemMissing)
|
||
} else {
|
||
this._lastValue = IsExpressionType(value) ? value : "";
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemExists)
|
||
}
|
||
}
|
||
)
|
||
} catch (err) {
|
||
await this._TriggerStorageError(err)
|
||
}
|
||
},
|
||
async RemoveItem(key) {
|
||
try {
|
||
await this._storage.removeItem(key);
|
||
await this.ScheduleTriggers(async()=>{
|
||
this._currentKey = key;
|
||
this._lastValue = "";
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAnyItemRemoved);
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemRemoved)
|
||
}
|
||
)
|
||
} catch (err) {
|
||
await this._TriggerStorageError(err)
|
||
}
|
||
},
|
||
async ClearStorage() {
|
||
try {
|
||
await this._storage.clear();
|
||
await this.ScheduleTriggers(async()=>{
|
||
this._currentKey = "";
|
||
this._lastValue = "";
|
||
C3.clearArray(this._keyNamesList);
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnCleared)
|
||
}
|
||
)
|
||
} catch (err) {
|
||
await this._TriggerStorageError(err)
|
||
}
|
||
},
|
||
async GetAllKeyNames() {
|
||
try {
|
||
const keyList = await this._storage.keys();
|
||
await this.ScheduleTriggers(async()=>{
|
||
this._keyNamesList = keyList;
|
||
await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAllKeyNamesLoaded)
|
||
}
|
||
)
|
||
} catch (err) {
|
||
await this._TriggerStorageError(err)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.LocalStorage.Exps = {
|
||
ItemValue() {
|
||
return this._lastValue
|
||
},
|
||
Key() {
|
||
return this._currentKey
|
||
},
|
||
KeyCount() {
|
||
return this._keyNamesList.length
|
||
},
|
||
KeyAt(i) {
|
||
i = Math.floor(i);
|
||
if (i < 0 || i >= this._keyNamesList.length)
|
||
return "";
|
||
return this._keyNamesList[i]
|
||
},
|
||
ErrorMessage() {
|
||
return this._errorMessage
|
||
}
|
||
}
|
||
}
|
||
;"use strict";
|
||
function rstr_md5(s) {
|
||
return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
|
||
}
|
||
function rstr_hmac_md5(key, data) {
|
||
var bkey = rstr2binl(key);
|
||
if (bkey.length > 16)
|
||
bkey = binl_md5(bkey, key.length * 8);
|
||
var ipad = Array(16)
|
||
, opad = Array(16);
|
||
for (var i = 0; i < 16; i++) {
|
||
ipad[i] = bkey[i] ^ 0x36363636;
|
||
opad[i] = bkey[i] ^ 0x5C5C5C5C;
|
||
}
|
||
var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
|
||
return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
|
||
}
|
||
function rstr2any(input, encoding) {
|
||
var divisor = encoding.length;
|
||
var i, j, q, x, quotient;
|
||
var dividend = Array(Math.ceil(input.length / 2));
|
||
for (i = 0; i < dividend.length; i++) {
|
||
dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
|
||
}
|
||
var full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
|
||
var remainders = Array(full_length);
|
||
for (j = 0; j < full_length; j++) {
|
||
quotient = Array();
|
||
x = 0;
|
||
for (i = 0; i < dividend.length; i++) {
|
||
x = (x << 16) + dividend[i];
|
||
q = Math.floor(x / divisor);
|
||
x -= q * divisor;
|
||
if (quotient.length > 0 || q > 0)
|
||
quotient[quotient.length] = q;
|
||
}
|
||
remainders[j] = x;
|
||
dividend = quotient;
|
||
}
|
||
var output = "";
|
||
for (i = remainders.length - 1; i >= 0; i--)
|
||
output += encoding.charAt(remainders[i]);
|
||
return output;
|
||
}
|
||
function str2rstr_utf8(input) {
|
||
var output = "";
|
||
var i = -1;
|
||
var x, y;
|
||
while (++i < input.length) {
|
||
x = input.charCodeAt(i);
|
||
y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
|
||
if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
|
||
x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
|
||
i++;
|
||
}
|
||
if (x <= 0x7F)
|
||
output += String.fromCharCode(x);
|
||
else if (x <= 0x7FF)
|
||
output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F), 0x80 | (x & 0x3F));
|
||
else if (x <= 0xFFFF)
|
||
output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), 0x80 | ((x >>> 6) & 0x3F), 0x80 | (x & 0x3F));
|
||
else if (x <= 0x1FFFFF)
|
||
output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), 0x80 | ((x >>> 12) & 0x3F), 0x80 | ((x >>> 6) & 0x3F), 0x80 | (x & 0x3F));
|
||
}
|
||
return output;
|
||
}
|
||
function str2rstr_utf16le(input) {
|
||
var output = "";
|
||
for (var i = 0; i < input.length; i++)
|
||
output += String.fromCharCode(input.charCodeAt(i) & 0xFF, (input.charCodeAt(i) >>> 8) & 0xFF);
|
||
return output;
|
||
}
|
||
function str2rstr_utf16be(input) {
|
||
var output = "";
|
||
for (var i = 0; i < input.length; i++)
|
||
output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF, input.charCodeAt(i) & 0xFF);
|
||
return output;
|
||
}
|
||
function rstr2binl(input) {
|
||
var output = Array(input.length >> 2);
|
||
for (var i = 0; i < output.length; i++)
|
||
output[i] = 0;
|
||
for (var i = 0; i < input.length * 8; i += 8)
|
||
output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
|
||
return output;
|
||
}
|
||
function binl2rstr(input) {
|
||
var output = "";
|
||
for (var i = 0; i < input.length * 32; i += 8)
|
||
output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
|
||
return output;
|
||
}
|
||
function binl_md5(x, len) {
|
||
x[len >> 5] |= 0x80 << ((len) % 32);
|
||
x[(((len + 64) >>> 9) << 4) + 14] = len;
|
||
var a = 1732584193;
|
||
var b = -271733879;
|
||
var c = -1732584194;
|
||
var d = 271733878;
|
||
for (var i = 0; i < x.length; i += 16) {
|
||
var olda = a;
|
||
var oldb = b;
|
||
var oldc = c;
|
||
var oldd = d;
|
||
a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
|
||
d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
|
||
c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
|
||
b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
|
||
a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
|
||
d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
|
||
c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
|
||
b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
|
||
a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
|
||
d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
|
||
c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
|
||
b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
|
||
a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
|
||
d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
|
||
c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
|
||
b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
|
||
a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
|
||
d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
|
||
c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
|
||
b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
|
||
a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
|
||
d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
|
||
c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
|
||
b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
|
||
a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
|
||
d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
|
||
c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
|
||
b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
|
||
a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
|
||
d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
|
||
c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
|
||
b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
|
||
a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
|
||
d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
|
||
c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
|
||
b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
|
||
a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
|
||
d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
|
||
c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
|
||
b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
|
||
a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
|
||
d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
|
||
c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
|
||
b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
|
||
a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
|
||
d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
|
||
c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
|
||
b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
|
||
a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
|
||
d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
|
||
c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
|
||
b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
|
||
a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
|
||
d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
|
||
c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
|
||
b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
|
||
a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
|
||
d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
|
||
c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
|
||
b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
|
||
a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
|
||
d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
|
||
c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
|
||
b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
|
||
a = safe_add(a, olda);
|
||
b = safe_add(b, oldb);
|
||
c = safe_add(c, oldc);
|
||
d = safe_add(d, oldd);
|
||
}
|
||
return Array(a, b, c, d);
|
||
}
|
||
function md5_cmn(q, a, b, x, s, t) {
|
||
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
|
||
}
|
||
function md5_ff(a, b, c, d, x, s, t) {
|
||
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
|
||
}
|
||
function md5_gg(a, b, c, d, x, s, t) {
|
||
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
|
||
}
|
||
function md5_hh(a, b, c, d, x, s, t) {
|
||
return md5_cmn(b ^ c ^ d, a, b, x, s, t);
|
||
}
|
||
function md5_ii(a, b, c, d, x, s, t) {
|
||
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
|
||
}
|
||
function safe_add(x, y) {
|
||
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
|
||
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
||
return (msw << 16) | (lsw & 0xFFFF);
|
||
}
|
||
function bit_rol(num, cnt) {
|
||
return (num << cnt) | (num >>> (32 - cnt));
|
||
}
|
||
function rstr_sha1(s) {
|
||
return binb2rstr(binb_sha1(rstr2binb(s), s.length * 8));
|
||
}
|
||
function rstr_hmac_sha1(key, data) {
|
||
var bkey = rstr2binb(key);
|
||
if (bkey.length > 16)
|
||
bkey = binb_sha1(bkey, key.length * 8);
|
||
var ipad = Array(16)
|
||
, opad = Array(16);
|
||
for (var i = 0; i < 16; i++) {
|
||
ipad[i] = bkey[i] ^ 0x36363636;
|
||
opad[i] = bkey[i] ^ 0x5C5C5C5C;
|
||
}
|
||
var hash = binb_sha1(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
|
||
return binb2rstr(binb_sha1(opad.concat(hash), 512 + 160));
|
||
}
|
||
function rstr2binb(input) {
|
||
var output = Array(input.length >> 2);
|
||
for (var i = 0; i < output.length; i++)
|
||
output[i] = 0;
|
||
for (var i = 0; i < input.length * 8; i += 8)
|
||
output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
|
||
return output;
|
||
}
|
||
function binb2rstr(input) {
|
||
var output = "";
|
||
for (var i = 0; i < input.length * 32; i += 8)
|
||
output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
|
||
return output;
|
||
}
|
||
function binb_sha1(x, len) {
|
||
x[len >> 5] |= 0x80 << (24 - len % 32);
|
||
x[((len + 64 >> 9) << 4) + 15] = len;
|
||
var w = Array(80);
|
||
var a = 1732584193;
|
||
var b = -271733879;
|
||
var c = -1732584194;
|
||
var d = 271733878;
|
||
var e = -1009589776;
|
||
for (var i = 0; i < x.length; i += 16) {
|
||
var olda = a;
|
||
var oldb = b;
|
||
var oldc = c;
|
||
var oldd = d;
|
||
var olde = e;
|
||
for (var j = 0; j < 80; j++) {
|
||
if (j < 16)
|
||
w[j] = x[i + j];
|
||
else
|
||
w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
|
||
var t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));
|
||
e = d;
|
||
d = c;
|
||
c = bit_rol(b, 30);
|
||
b = a;
|
||
a = t;
|
||
}
|
||
a = safe_add(a, olda);
|
||
b = safe_add(b, oldb);
|
||
c = safe_add(c, oldc);
|
||
d = safe_add(d, oldd);
|
||
e = safe_add(e, olde);
|
||
}
|
||
return Array(a, b, c, d, e);
|
||
}
|
||
function sha1_ft(t, b, c, d) {
|
||
if (t < 20)
|
||
return (b & c) | ((~b) & d);
|
||
if (t < 40)
|
||
return b ^ c ^ d;
|
||
if (t < 60)
|
||
return (b & c) | (b & d) | (c & d);
|
||
return b ^ c ^ d;
|
||
}
|
||
function sha1_kt(t) {
|
||
return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514;
|
||
}
|
||
function rstr_sha256(s) {
|
||
return binb2rstr(binb_sha256(rstr2binb(s), s.length * 8));
|
||
}
|
||
function rstr_hmac_sha256(key, data) {
|
||
var bkey = rstr2binb(key);
|
||
if (bkey.length > 16)
|
||
bkey = binb_sha256(bkey, key.length * 8);
|
||
var ipad = Array(16)
|
||
, opad = Array(16);
|
||
for (var i = 0; i < 16; i++) {
|
||
ipad[i] = bkey[i] ^ 0x36363636;
|
||
opad[i] = bkey[i] ^ 0x5C5C5C5C;
|
||
}
|
||
var hash = binb_sha256(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
|
||
return binb2rstr(binb_sha256(opad.concat(hash), 512 + 256));
|
||
}
|
||
function sha256_S(X, n) {
|
||
return (X >>> n) | (X << (32 - n));
|
||
}
|
||
function sha256_R(X, n) {
|
||
return (X >>> n);
|
||
}
|
||
function sha256_Ch(x, y, z) {
|
||
return ((x & y) ^ ((~x) & z));
|
||
}
|
||
function sha256_Maj(x, y, z) {
|
||
return ((x & y) ^ (x & z) ^ (y & z));
|
||
}
|
||
function sha256_Sigma0256(x) {
|
||
return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
|
||
}
|
||
function sha256_Sigma1256(x) {
|
||
return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
|
||
}
|
||
function sha256_Gamma0256(x) {
|
||
return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
|
||
}
|
||
function sha256_Gamma1256(x) {
|
||
return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
|
||
}
|
||
function sha256_Sigma0512(x) {
|
||
return (sha256_S(x, 28) ^ sha256_S(x, 34) ^ sha256_S(x, 39));
|
||
}
|
||
function sha256_Sigma1512(x) {
|
||
return (sha256_S(x, 14) ^ sha256_S(x, 18) ^ sha256_S(x, 41));
|
||
}
|
||
function sha256_Gamma0512(x) {
|
||
return (sha256_S(x, 1) ^ sha256_S(x, 8) ^ sha256_R(x, 7));
|
||
}
|
||
function sha256_Gamma1512(x) {
|
||
return (sha256_S(x, 19) ^ sha256_S(x, 61) ^ sha256_R(x, 6));
|
||
}
|
||
var sha256_K = new Array(1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998);
|
||
function binb_sha256(m, l) {
|
||
var HASH = new Array(1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225);
|
||
var W = new Array(64);
|
||
var a, b, c, d, e, f, g, h;
|
||
var i, j, T1, T2;
|
||
m[l >> 5] |= 0x80 << (24 - l % 32);
|
||
m[((l + 64 >> 9) << 4) + 15] = l;
|
||
for (i = 0; i < m.length; i += 16) {
|
||
a = HASH[0];
|
||
b = HASH[1];
|
||
c = HASH[2];
|
||
d = HASH[3];
|
||
e = HASH[4];
|
||
f = HASH[5];
|
||
g = HASH[6];
|
||
h = HASH[7];
|
||
for (j = 0; j < 64; j++) {
|
||
if (j < 16)
|
||
W[j] = m[j + i];
|
||
else
|
||
W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]), sha256_Gamma0256(W[j - 15])), W[j - 16]);
|
||
T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)), sha256_K[j]), W[j]);
|
||
T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
|
||
h = g;
|
||
g = f;
|
||
f = e;
|
||
e = safe_add(d, T1);
|
||
d = c;
|
||
c = b;
|
||
b = a;
|
||
a = safe_add(T1, T2);
|
||
}
|
||
HASH[0] = safe_add(a, HASH[0]);
|
||
HASH[1] = safe_add(b, HASH[1]);
|
||
HASH[2] = safe_add(c, HASH[2]);
|
||
HASH[3] = safe_add(d, HASH[3]);
|
||
HASH[4] = safe_add(e, HASH[4]);
|
||
HASH[5] = safe_add(f, HASH[5]);
|
||
HASH[6] = safe_add(g, HASH[6]);
|
||
HASH[7] = safe_add(h, HASH[7]);
|
||
}
|
||
return HASH;
|
||
}
|
||
{
|
||
C3.Plugins.CBhash = class CBhashPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.CBhash.Type = class CBhashType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.CBhash.Instance = class CBhashInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
this._testProperty = 0;
|
||
this.lastResult = "";
|
||
this.hexcase = 0;
|
||
this.b64pad = " ";
|
||
if (properties) {}
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {};
|
||
}
|
||
LoadFromJson(o) {}
|
||
hex_md5(s) {
|
||
return this.rstr2hex(rstr_md5(str2rstr_utf8(s)));
|
||
}
|
||
b64_md5(s) {
|
||
return this.rstr2b64(rstr_md5(str2rstr_utf8(s)));
|
||
}
|
||
any_md5(s, e) {
|
||
return rstr2any(rstr_md5(str2rstr_utf8(s)), e);
|
||
}
|
||
hex_hmac_md5(k, d) {
|
||
return this.rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)));
|
||
}
|
||
b64_hmac_md5(k, d) {
|
||
return this.rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)));
|
||
}
|
||
any_hmac_md5(k, d, e) {
|
||
return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e);
|
||
}
|
||
hex_sha1(s) {
|
||
return this.rstr2hex(rstr_sha1(str2rstr_utf8(s)));
|
||
}
|
||
b64_sha1(s) {
|
||
return this.rstr2b64(rstr_sha1(str2rstr_utf8(s)));
|
||
}
|
||
any_sha1(s, e) {
|
||
return rstr2any(rstr_sha1(str2rstr_utf8(s)), e);
|
||
}
|
||
hex_hmac_sha1(k, d) {
|
||
return this.rstr2hex(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d)));
|
||
}
|
||
b64_hmac_sha1(k, d) {
|
||
return this.rstr2b64(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d)));
|
||
}
|
||
any_hmac_sha1(k, d, e) {
|
||
return rstr2any(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d)), e);
|
||
}
|
||
hex_sha256(s) {
|
||
return this.rstr2hex(rstr_sha256(str2rstr_utf8(s)));
|
||
}
|
||
b64_sha256(s) {
|
||
return this.rstr2b64(rstr_sha256(str2rstr_utf8(s)));
|
||
}
|
||
any_sha256(s, e) {
|
||
return rstr2any(rstr_sha256(str2rstr_utf8(s)), e);
|
||
}
|
||
hex_hmac_sha256(k, d) {
|
||
return this.rstr2hex(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d)));
|
||
}
|
||
b64_hmac_sha256(k, d) {
|
||
return this.rstr2b64(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d)));
|
||
}
|
||
any_hmac_sha256(k, d, e) {
|
||
return rstr2any(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d)), e);
|
||
}
|
||
rstr2hex(input) {
|
||
try {
|
||
this.hexcase
|
||
} catch (e) {
|
||
this.hexcase = 0;
|
||
}
|
||
var hex_tab = this.hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
|
||
var output = "";
|
||
var x;
|
||
for (var i = 0; i < input.length; i++) {
|
||
x = input.charCodeAt(i);
|
||
output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
|
||
}
|
||
return output;
|
||
}
|
||
rstr2b64(input) {
|
||
try {
|
||
this.b64pad
|
||
} catch (e) {
|
||
this.b64pad = '';
|
||
}
|
||
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||
var output = "";
|
||
var len = input.length;
|
||
for (var i = 0; i < len; i += 3) {
|
||
var triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
|
||
for (var j = 0; j < 4; j++) {
|
||
if (i * 8 + j * 6 > input.length * 8)
|
||
output += this.b64pad;
|
||
else
|
||
output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
|
||
}
|
||
}
|
||
return output;
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.CBhash.Cnds = {
|
||
OnHashed() {
|
||
return true;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.CBhash.Acts = {
|
||
set_hexoutput(format) {
|
||
if (format == 0)
|
||
this.hexcase = 0;
|
||
else
|
||
this.hexcase = 1;
|
||
},
|
||
set_bpad(charac) {
|
||
this.b64pad = charac;
|
||
},
|
||
MD5_hash(string, format) {
|
||
var outF = format;
|
||
if (outF == 0)
|
||
this.lastResult = this.hex_md5(string);
|
||
else
|
||
this.lastResult = this.b64_md5(string);
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
MD5_pass(string, encoding) {
|
||
this.lastResult = this.any_md5(string, encoding);
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMAC_hash(key, data, Format) {
|
||
if (Format == 0)
|
||
this.lastResult = this.hex_hmac_md5(key, data);
|
||
else
|
||
this.lastResult = this.b64_hmac_md5(key, data);
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMAC_pass(key, data, charString) {
|
||
this.lastResult = this.any_hmac_md5(key, data, charString);
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
SHA1_hash(string, format) {
|
||
var outF = format;
|
||
if (outF == 0)
|
||
this.lastResult = this.hex_sha1(string);
|
||
else
|
||
this.lastResult = this.b64_sha1(string);
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
SHA1_pass(string, encoding) {
|
||
this.lastResult = this.any_sha1(string, encoding);
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACSHA1_hash(key, data, Format) {
|
||
if (Format == 0)
|
||
this.lastResult = this.hex_hmac_sha1(key, data);
|
||
else
|
||
this.lastResult = this.b64_hmac_sha1(key, data);
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACSHA1_pass(key, data, charString) {
|
||
this.lastResult = this.any_hmac_sha1(key, data, charString);
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
SHA256_hash(string, format) {
|
||
var outF = format;
|
||
if (outF == 0)
|
||
this.lastResult = this.hex_sha256(string);
|
||
else
|
||
this.lastResult = this.b64_sha256(string);
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
SHA256_pass(string, encoding) {
|
||
this.lastResult = this.any_sha256(string, encoding);
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACSHA256_hash(key, data, Format) {
|
||
if (Format == 0)
|
||
this.lastResult = this.hex_hmac_sha256(key, data);
|
||
else
|
||
this.lastResult = this.b64_hmac_sha256(key, data);
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACSHA256_pass(key, data, charString) {
|
||
this.lastResult = this.any_hmac_sha256(key, data, charString);
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.CBhash.Exps = {
|
||
get_lastResult() {
|
||
return (this.lastResult);
|
||
},
|
||
MD5(data) {
|
||
return (this.hex_md5(data));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
MD5B(data) {
|
||
return (this.b64_md5(data));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
MD5pass(data, charstring) {
|
||
return (this.any_md5(data, charstring));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACMD5(key, data) {
|
||
return (this.hex_hmac_md5(key, data));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACMD5B(key, data) {
|
||
return (this.b64_hmac_md5(key, data));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACMD5pass(key, data, charstring) {
|
||
return (this.any_hmac_md5(key, data, charstring));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
SHA1(data) {
|
||
return (this.hex_sha1(data));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
SHA1B(data) {
|
||
return (this.b64_sha1(data));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
SHA1pass(data, charstring) {
|
||
return (this.any_sha1(data, charstring));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACSHA1(key, data) {
|
||
return (this.hex_hmac_sha1(key, data));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACSHA1B(key, data) {
|
||
return (this.b64_hmac_sha1(key, data));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACSHA1pass(key, data, charstring) {
|
||
return (this.any_hmac_sha1(key, data, charstring));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
SHA256(data) {
|
||
return (this.hex_sha256(data));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
SHA256B(data) {
|
||
return (this.b64_sha256(data));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
SHA256pass(data, charstring) {
|
||
return (this.any_sha256(data, charstring));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACSHA256(key, data) {
|
||
return (this.hex_hmac_sha256(key, data));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACSHA256B(key, data) {
|
||
return (this.b64_hmac_sha256(key, data));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
},
|
||
HMACSHA256pass(key, data, charstring) {
|
||
return (this.any_hmac_sha256(key, data, charstring));
|
||
this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed);
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.Sparsha_copyclip = class copyclipPlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.Sparsha_copyclip.Type = class copyclipType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
var textToCopy = "";
|
||
if (typeof document != "undefined")
|
||
var Input = document.createElement("input");
|
||
var onCopy = 0;
|
||
var errorClipboard = "";
|
||
var onErrorCopy = 0;
|
||
var onGet = 0;
|
||
var onErrorGet = 0;
|
||
var GetText = "";
|
||
{
|
||
C3.Plugins.Sparsha_copyclip.Instance = class copyclipInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
if (properties) {}
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {};
|
||
}
|
||
LoadFromJson(o) {}
|
||
GetDebuggerProperties() {
|
||
return [{
|
||
title: "copyclip",
|
||
properties: []
|
||
}];
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.Sparsha_copyclip.Cnds = {
|
||
OnCopy() {
|
||
if (onCopy == 1) {
|
||
onCopy = 0;
|
||
return true;
|
||
} else
|
||
return false;
|
||
},
|
||
OnGet() {
|
||
if (onGet == 1) {
|
||
onGet = 0;
|
||
return true;
|
||
} else
|
||
return false;
|
||
},
|
||
OnCopyError() {
|
||
if (onErrorCopy == 1) {
|
||
onErrorCopy = 0;
|
||
return true;
|
||
} else
|
||
return false;
|
||
},
|
||
OnGetError() {
|
||
if (onErrorGet == 1) {
|
||
onErrorGet = 0;
|
||
return true;
|
||
} else
|
||
return false;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.Sparsha_copyclip.Acts = {
|
||
Copy(Text, buttonId) {
|
||
textToCopy = Text;
|
||
Input.id = "Texty";
|
||
Input.value = textToCopy;
|
||
document.getElementById(buttonId).onclick = function() {
|
||
doCopy();
|
||
}
|
||
;
|
||
function doCopy() {
|
||
Input = document.createElement("input");
|
||
Input.id = "Texty";
|
||
Input.value = textToCopy;
|
||
document.getElementsByTagName('body')[0].appendChild(Input);
|
||
var copyText = document.getElementById("Texty");
|
||
copyText.select();
|
||
copyText.setSelectionRange(0, 99999);
|
||
document.execCommand("copy");
|
||
Input.remove();
|
||
}
|
||
},
|
||
async ApiCopy(Text) {
|
||
window.focus();
|
||
await navigator.clipboard.writeText(Text).then(()=>{
|
||
onCopy = 1;
|
||
}
|
||
).catch(err=>{
|
||
errorClipboard = err.message;
|
||
onErrorCopy = 1;
|
||
console.log("--Error Report----------------")
|
||
console.error("error: ", errorClipboard);
|
||
console.log("------------------------------")
|
||
}
|
||
);
|
||
},
|
||
async ApiGet() {
|
||
window.focus();
|
||
await navigator.clipboard.readText().then(Text=>{
|
||
GetText = Text;
|
||
onGet = 1;
|
||
}
|
||
).catch(err=>{
|
||
errorClipboard = err.message;
|
||
onErrorGet = 1;
|
||
console.log("--Error Report----------------")
|
||
console.error("error: ", errorClipboard);
|
||
console.log("------------------------------")
|
||
}
|
||
);
|
||
},
|
||
ClearError() {
|
||
errorClipboard = "";
|
||
onErrorCopy = 0;
|
||
onErrorGet = 0;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.Sparsha_copyclip.Exps = {
|
||
clipboardData() {
|
||
return GetText;
|
||
},
|
||
error() {
|
||
return errorClipboard;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.Massive_Cube_Forge = class ForgePlugin extends C3.SDKPluginBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.Massive_Cube_Forge.Type = class ForgeType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.Massive_Cube_Forge.Instance = class ForgeInstance extends C3.SDKInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst);
|
||
this.ky = undefined;
|
||
this.iv = undefined;
|
||
this.kyIsLongEnough = false;
|
||
this.IVIsLongEnough = false;
|
||
this.result = "";
|
||
if (properties) {}
|
||
this.cipher = undefined;
|
||
this.decipher = undefined;
|
||
this.forg = new globalThis["forge"];
|
||
this.encb64 = function(str) {
|
||
return this.forg.util.encode64(str);
|
||
}
|
||
this.decb64 = function(str) {
|
||
return this.forg.util.decode64(str);
|
||
}
|
||
this.psrand = function(lng) {
|
||
var bytes = this.forg.random.getBytesSync(lng);
|
||
return this.forg.util.bytesToHex(bytes);
|
||
}
|
||
this.sha1 = function(data, _this) {
|
||
var md = _this.forg.md.sha1.create();
|
||
md.update(data);
|
||
return md.digest().toHex();
|
||
}
|
||
this.sha256 = function(data, _this) {
|
||
var md = _this.forg.md.sha256.create();
|
||
md.update(data);
|
||
return md.digest().toHex();
|
||
}
|
||
this.sha384 = function(data, _this) {
|
||
var md = _this.forg.md.sha384.create();
|
||
md.update(data);
|
||
return md.digest().toHex();
|
||
}
|
||
this.sha512 = function(data, _this) {
|
||
var md = _this.forg.md.sha512.create();
|
||
md.update(data);
|
||
return md.digest().toHex();
|
||
}
|
||
this.md5 = function(data, _this) {
|
||
var md = _this.forg.md.md5.create();
|
||
md.update(data);
|
||
return md.digest().toHex();
|
||
}
|
||
this.clKAiV = function(_this) {
|
||
_this.ky = "";
|
||
_this.iv = "";
|
||
}
|
||
this.getTypeIDStr = function(id) {
|
||
switch (id) {
|
||
case 0:
|
||
return "AES-ECB";
|
||
break;
|
||
case 1:
|
||
return "AES-CBC";
|
||
break;
|
||
case 2:
|
||
return "AES-CFB";
|
||
break;
|
||
case 3:
|
||
return "AES-OFB";
|
||
break;
|
||
case 4:
|
||
return "AES-GCM";
|
||
break;
|
||
case 5:
|
||
return "3DES-ECB";
|
||
break;
|
||
case 6:
|
||
return "3DES-CBC";
|
||
break;
|
||
case 7:
|
||
return "DES-ECB";
|
||
break;
|
||
case 8:
|
||
return "DES-CBC";
|
||
break;
|
||
default:
|
||
return "AES-ECB";
|
||
}
|
||
}
|
||
this.encr = function(type, _this, text) {
|
||
var plaintext = text.toString();
|
||
var ky = _this.ky;
|
||
var objiv = {};
|
||
objiv["iv"] = _this.iv;
|
||
var cipher = _this.forg.cipher.createCipher(_this.getTypeIDStr(type), ky);
|
||
cipher.start(objiv);
|
||
cipher.update(_this.forg.util.createBuffer(plaintext));
|
||
cipher.finish();
|
||
var encrypted = cipher.output;
|
||
_this.result = _this.forg.util.encode64(encrypted.data);
|
||
}
|
||
this.decr = function(type, _this, text) {
|
||
var plaintext = text.toString();
|
||
var ky = _this.ky;
|
||
var objiv = {};
|
||
objiv["iv"] = _this.iv;
|
||
var decodedB64 = _this.forg.util.decode64(plaintext);
|
||
var input = _this.forg.util.createBuffer(decodedB64, 'binary');
|
||
input.getBytes(decodedB64);
|
||
var decipher = _this.forg.cipher.createDecipher(_this.getTypeIDStr(type), ky);
|
||
decipher.start(objiv);
|
||
decipher.update(input);
|
||
var result = decipher.finish();
|
||
_this.result = decipher.output.data;
|
||
}
|
||
this.setky = function(ky, _this) {
|
||
if ((ky.length == 16) || (ky.length == 24) || (ky.length == 32)) {
|
||
_this.ky = ky;
|
||
_this.kyIsLongEnough = true;
|
||
} else {
|
||
_this.kyIsLongEnough = false;
|
||
console.warn("ky is not 16, 24 or 32 chars long!");
|
||
}
|
||
}
|
||
this.setIV = function(iv, _this) {
|
||
if (iv.length > 0) {
|
||
_this.iv = iv;
|
||
_this.IVIsLongEnough = true;
|
||
} else {
|
||
_this.IVIsLongEnough = false;
|
||
_this.iv = "";
|
||
console.warn("iv is not long enough!");
|
||
}
|
||
}
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {};
|
||
}
|
||
LoadFromJson(o) {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.Massive_Cube_Forge.Cnds = {};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.Massive_Cube_Forge.Acts = {
|
||
setKey(key) {
|
||
this.setky(key, this);
|
||
},
|
||
setIV(iv) {
|
||
this.setIV(iv, this);
|
||
},
|
||
encrypt(type, text) {
|
||
this.encr(type, this, text);
|
||
},
|
||
decrypt(type, text) {
|
||
this.decr(type, this, text);
|
||
},
|
||
clKyAIV() {
|
||
this.clKAiV(this);
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Plugins.Massive_Cube_Forge.Exps = {
|
||
getresult() {
|
||
return this.result;
|
||
},
|
||
getSHA1(data) {
|
||
return this.sha1(data, this);
|
||
},
|
||
getSHA256(data) {
|
||
return this.sha256(data, this);
|
||
},
|
||
getSHA384(data) {
|
||
return this.sha384(data, this);
|
||
},
|
||
getSHA512(data) {
|
||
return this.sha512(data, this);
|
||
},
|
||
MD5(data) {
|
||
return this.md5(data, this);
|
||
},
|
||
getrandomvalues(lng) {
|
||
return this.psrand(lng);
|
||
},
|
||
encodeb64(str) {
|
||
return this.encb64(str);
|
||
},
|
||
decodeb64(str) {
|
||
return this.decb64(str);
|
||
}
|
||
};
|
||
}
|
||
'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const DOM_COMPONENT_ID = "text-input";
|
||
C3.Plugins.TextBox = class TextInputPlugin extends C3.SDKDOMPluginBase {
|
||
constructor(opts) {
|
||
super(opts, DOM_COMPONENT_ID);
|
||
this.AddElementMessageHandler("click", (sdkInst,e)=>sdkInst._OnClick(e));
|
||
this.AddElementMessageHandler("dblclick", (sdkInst,e)=>sdkInst._OnDoubleClick(e));
|
||
this.AddElementMessageHandler("change", (sdkInst,e)=>sdkInst._OnChange(e))
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.TextBox.Type = class TextInputType extends C3.SDKTypeBase {
|
||
constructor(objectClass) {
|
||
super(objectClass)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const TEXT = 0;
|
||
const PLACEHOLDER = 1;
|
||
const TOOLTIP = 2;
|
||
const INITIALLY_VISIBLE = 3;
|
||
const ENABLE = 4;
|
||
const READ_ONLY = 5;
|
||
const SPELL_CHECK = 6;
|
||
const TYPE = 7;
|
||
const AUTO_FONT_SIZE = 8;
|
||
const ID = 9;
|
||
const DOM_COMPONENT_ID = "text-input";
|
||
const elemTypes = ["text", "password", "email", "number", "tel", "url", "textarea", "search"];
|
||
C3.Plugins.TextBox.Instance = class TextInputInstance extends C3.SDKDOMInstanceBase {
|
||
constructor(inst, properties) {
|
||
super(inst, DOM_COMPONENT_ID);
|
||
this._text = "";
|
||
this._placeholder = "";
|
||
this._title = "";
|
||
this._isEnabled = true;
|
||
this._isReadOnly = false;
|
||
this._spellCheck = false;
|
||
this._type = "text";
|
||
this._autoFontSize = true;
|
||
this._maxLength = -1;
|
||
this._id = "";
|
||
if (properties) {
|
||
this._text = properties[TEXT];
|
||
this._placeholder = properties[PLACEHOLDER];
|
||
this._title = properties[TOOLTIP];
|
||
this.GetWorldInfo().SetVisible(properties[INITIALLY_VISIBLE]);
|
||
this._isEnabled = properties[ENABLE];
|
||
this._isReadOnly = properties[READ_ONLY];
|
||
this._spellCheck = properties[SPELL_CHECK];
|
||
this._type = elemTypes[properties[TYPE]];
|
||
this._autoFontSize = properties[AUTO_FONT_SIZE];
|
||
this._id = properties[ID]
|
||
}
|
||
this.CreateElement({
|
||
"type": this._type,
|
||
"id": this._id
|
||
})
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
GetElementState() {
|
||
return {
|
||
"text": this._text,
|
||
"placeholder": this._placeholder,
|
||
"title": this._title,
|
||
"isEnabled": this._isEnabled,
|
||
"isReadOnly": this._isReadOnly,
|
||
"spellCheck": this._spellCheck,
|
||
"maxLength": this._maxLength
|
||
}
|
||
}
|
||
async _OnClick(e) {
|
||
this.GetScriptInterface().dispatchEvent(C3.New(C3.Event, "click", true));
|
||
await this.TriggerAsync(C3.Plugins.TextBox.Cnds.OnClicked)
|
||
}
|
||
async _OnDoubleClick(e) {
|
||
this.GetScriptInterface().dispatchEvent(C3.New(C3.Event, "dblclick", true));
|
||
await this.TriggerAsync(C3.Plugins.TextBox.Cnds.OnDoubleClicked)
|
||
}
|
||
async _OnChange(e) {
|
||
this._text = e["text"];
|
||
this.GetScriptInterface().dispatchEvent(C3.New(C3.Event, "change", true));
|
||
await this.TriggerAsync(C3.Plugins.TextBox.Cnds.OnTextChanged)
|
||
}
|
||
_SetText(text) {
|
||
if (this._text === text)
|
||
return;
|
||
this._text = text;
|
||
this.UpdateElementState()
|
||
}
|
||
_GetText() {
|
||
return this._text
|
||
}
|
||
_SetPlaceholder(placeholder) {
|
||
if (this._placeholder === placeholder)
|
||
return;
|
||
this._placeholder = placeholder;
|
||
this.UpdateElementState()
|
||
}
|
||
_GetPlaceholder() {
|
||
return this._placeholder
|
||
}
|
||
_SetTooltip(title) {
|
||
if (this._title === title)
|
||
return;
|
||
this._title = title;
|
||
this.UpdateElementState()
|
||
}
|
||
_GetTooltip() {
|
||
return this._title
|
||
}
|
||
_SetEnabled(e) {
|
||
e = !!e;
|
||
if (this._isEnabled === e)
|
||
return;
|
||
this._isEnabled = e;
|
||
this.UpdateElementState()
|
||
}
|
||
_IsEnabled() {
|
||
return this._isEnabled
|
||
}
|
||
_SetReadOnly(r) {
|
||
r = !!r;
|
||
if (this._isReadOnly === r)
|
||
return;
|
||
this._isReadOnly = r;
|
||
this.UpdateElementState()
|
||
}
|
||
_IsReadOnly() {
|
||
return this._isReadOnly
|
||
}
|
||
_SetMaxLength(l) {
|
||
l = Math.max(+l, -1);
|
||
if (this._maxLength === l)
|
||
return;
|
||
this._maxLength = l;
|
||
this.UpdateElementState()
|
||
}
|
||
_GetMaxLength() {
|
||
return this._maxLength
|
||
}
|
||
_ScrollToBottom() {
|
||
this.PostToDOMElement("scroll-to-bottom")
|
||
}
|
||
Draw(renderer) {}
|
||
SaveToJson() {
|
||
return {
|
||
"t": this._text,
|
||
"p": this._placeholder,
|
||
"ti": this._title,
|
||
"e": this._isEnabled,
|
||
"r": this._isReadOnly,
|
||
"sp": this._spellCheck,
|
||
"ml": this._maxLength,
|
||
"type": this._type,
|
||
"id": this._id
|
||
}
|
||
}
|
||
LoadFromJson(o) {
|
||
this._text = o["t"];
|
||
this._placeholder = o["p"];
|
||
this._title = o["ti"];
|
||
this._isEnabled = o["e"];
|
||
this._isReadOnly = o["r"];
|
||
this._spellCheck = o["sp"];
|
||
this._maxLength = o.hasOwnProperty("ml") ? o["ml"] : -1;
|
||
this._type = o["type"];
|
||
this._id = o["id"];
|
||
this.UpdateElementState()
|
||
}
|
||
GetPropertyValueByIndex(index) {
|
||
switch (index) {
|
||
case TEXT:
|
||
return this._text;
|
||
case PLACEHOLDER:
|
||
return this._placeholder;
|
||
case TOOLTIP:
|
||
return this._title;
|
||
case ENABLE:
|
||
return this._isEnabled;
|
||
case READ_ONLY:
|
||
return this._isReadOnly;
|
||
case SPELL_CHECK:
|
||
return this._spellCheck;
|
||
case AUTO_FONT_SIZE:
|
||
return this._autoFontSize;
|
||
case ID:
|
||
return this._id
|
||
}
|
||
}
|
||
SetPropertyValueByIndex(index, value) {
|
||
switch (index) {
|
||
case TEXT:
|
||
if (this._text === value)
|
||
return;
|
||
this._text = value;
|
||
this.UpdateElementState();
|
||
break;
|
||
case PLACEHOLDER:
|
||
if (this._placeholder === value)
|
||
return;
|
||
this._placeholder = value;
|
||
this.UpdateElementState();
|
||
break;
|
||
case TOOLTIP:
|
||
if (this._title === value)
|
||
return;
|
||
this._title = value;
|
||
this.UpdateElementState();
|
||
break;
|
||
case ENABLE:
|
||
if (this._isEnabled === !!value)
|
||
return;
|
||
this._isEnabled = !!value;
|
||
this.UpdateElementState();
|
||
break;
|
||
case READ_ONLY:
|
||
if (this._isReadOnly === !!value)
|
||
return;
|
||
this._isReadOnly = !!value;
|
||
this.UpdateElementState();
|
||
break;
|
||
case SPELL_CHECK:
|
||
if (this._spellCheck === !!value)
|
||
return;
|
||
this._spellCheck = !!value;
|
||
this.UpdateElementState();
|
||
break;
|
||
case AUTO_FONT_SIZE:
|
||
this._autoFontSize = !!value;
|
||
break;
|
||
case ID:
|
||
if (this._id === value)
|
||
return;
|
||
this._id = value;
|
||
this.UpdateElementState();
|
||
break
|
||
}
|
||
}
|
||
GetDebuggerProperties() {
|
||
const Acts = C3.Plugins.TextBox.Acts;
|
||
const prefix = "plugins.textbox";
|
||
return [{
|
||
title: prefix + ".name",
|
||
properties: [{
|
||
name: prefix + ".properties.text.name",
|
||
value: this._text,
|
||
onedit: v=>this.CallAction(Acts.SetText, v)
|
||
}, {
|
||
name: prefix + ".properties.enabled.name",
|
||
value: this._isEnabled,
|
||
onedit: v=>this.CallAction(Acts.SetEnabled, v)
|
||
}, {
|
||
name: prefix + ".properties.read-only.name",
|
||
value: this._isReadOnly,
|
||
onedit: v=>this.CallAction(Acts.SetReadOnly, v)
|
||
}]
|
||
}]
|
||
}
|
||
GetScriptInterfaceClass() {
|
||
return self.ITextInputInstance
|
||
}
|
||
}
|
||
;
|
||
const map = new WeakMap;
|
||
self.ITextInputInstance = class ITextInputInstance extends self.IDOMInstance {
|
||
constructor() {
|
||
super();
|
||
map.set(this, self.IInstance._GetInitInst().GetSdkInstance())
|
||
}
|
||
set text(str) {
|
||
map.get(this)._SetText(str)
|
||
}
|
||
get text() {
|
||
return map.get(this)._GetText()
|
||
}
|
||
set placeholder(str) {
|
||
map.get(this)._SetPlaceholder(str)
|
||
}
|
||
get placeholder() {
|
||
return map.get(this)._GetPlaceholder()
|
||
}
|
||
set tooltip(str) {
|
||
map.get(this)._SetTooltip(str)
|
||
}
|
||
get tooltip() {
|
||
return map.get(this)._GetTooltip()
|
||
}
|
||
set isEnabled(e) {
|
||
map.get(this)._SetEnabled(e)
|
||
}
|
||
get isEnabled() {
|
||
return map.get(this)._IsEnabled()
|
||
}
|
||
set isReadOnly(r) {
|
||
map.get(this)._SetReadOnly(r)
|
||
}
|
||
get isReadOnly() {
|
||
return map.get(this)._IsReadOnly()
|
||
}
|
||
set maxLength(l) {
|
||
map.get(this)._SetMaxLength(l)
|
||
}
|
||
get maxLength() {
|
||
return map.get(this)._GetMaxLength()
|
||
}
|
||
scrollToBottom() {
|
||
map.get(this)._ScrollToBottom()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.TextBox.Cnds = {
|
||
CompareText(text, case_) {
|
||
if (case_ === 0)
|
||
return C3.equalsNoCase(this._text, text);
|
||
else
|
||
return this._text === text
|
||
},
|
||
OnTextChanged() {
|
||
return true
|
||
},
|
||
OnClicked() {
|
||
return true
|
||
},
|
||
OnDoubleClicked() {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.TextBox.Acts = {
|
||
SetText(text) {
|
||
this._SetText(text)
|
||
},
|
||
AppendText(text) {
|
||
if (!text)
|
||
return;
|
||
this._SetText(this._GetText() + text)
|
||
},
|
||
SetPlaceholder(placeholder) {
|
||
this._SetPlaceholder(placeholder)
|
||
},
|
||
SetTooltip(title) {
|
||
this._SetTooltip(title)
|
||
},
|
||
SetReadOnly(r) {
|
||
this._SetReadOnly(r === 0)
|
||
},
|
||
ScrollToBottom() {
|
||
this._ScrollToBottom()
|
||
},
|
||
SetMaxLength(l) {
|
||
this._SetMaxLength(l)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Plugins.TextBox.Exps = {
|
||
Text() {
|
||
return this._GetText()
|
||
},
|
||
MaxLength() {
|
||
return this._GetMaxLength()
|
||
}
|
||
}
|
||
}
|
||
;"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gameobject = class MyBehavior extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gameobject.Type = class MyBehaviorType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gameobject.Instance = class MyBehaviorInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
if (properties) {
|
||
this.name = properties[0];
|
||
this.parentName = properties[1];
|
||
this.parentSameLayer = properties[2];
|
||
}
|
||
this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject = this;
|
||
this.inst = this.GetObjectInstance();
|
||
this.wi = this.GetWorldInfo();
|
||
this.acts = this.GetObjectInstance().GetPlugin().constructor.Acts;
|
||
this.eventManager = new EventManager(this.inst);
|
||
this.goManager = globalThis["aekiro_goManager"];
|
||
this.userName = this.name ? this.name : null;
|
||
this.areChildrenRegistred = false;
|
||
this.children = [];
|
||
this.parent = null;
|
||
this.local = {
|
||
x: this.wi.GetX(),
|
||
y: this.wi.GetY(),
|
||
angle: this.wi.GetAngle(),
|
||
_sinA: Math.sin(this.wi.GetAngle()),
|
||
_cosA: Math.cos(this.wi.GetAngle())
|
||
};
|
||
this.overrideWorldInfo();
|
||
this.prev = {
|
||
x: this.wi.GetX(),
|
||
y: this.wi.GetY(),
|
||
angle: this.wi.GetAngle(),
|
||
width: this.wi.GetWidth(),
|
||
height: this.wi.GetHeight()
|
||
};
|
||
if (this.goManager.isInit) {
|
||
this.name = "";
|
||
this.parentName = "";
|
||
}
|
||
this.goManager.addGO(this.inst);
|
||
}
|
||
PostCreate() {}
|
||
overrideWorldInfo() {
|
||
if (this.isWorldInfoOverrided)
|
||
return;
|
||
this.isWorldInfoOverrided = true;
|
||
var inst = this.GetObjectInstance();
|
||
var wi = inst.GetWorldInfo();
|
||
wi.SetX_old = wi.SetX;
|
||
wi.SetX = function(x, isLocal) {
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (!aekiro_gameobject)
|
||
return;
|
||
if (isLocal && aekiro_gameobject.parent) {
|
||
aekiro_gameobject.local.x = x;
|
||
aekiro_gameobject.updateGlobals();
|
||
} else {
|
||
this.SetX_old(x);
|
||
aekiro_gameobject.updateLocals();
|
||
}
|
||
aekiro_gameobject.children_update();
|
||
}
|
||
;
|
||
wi.SetY_old = wi.SetY;
|
||
wi.SetY = function(y, isLocal) {
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (!aekiro_gameobject)
|
||
return;
|
||
if (isLocal && aekiro_gameobject.parent) {
|
||
aekiro_gameobject.local.y = y;
|
||
aekiro_gameobject.updateGlobals();
|
||
} else {
|
||
this.SetY_old(y);
|
||
aekiro_gameobject.updateLocals();
|
||
}
|
||
aekiro_gameobject.children_update();
|
||
}
|
||
;
|
||
wi.SetXY_old = wi.SetXY;
|
||
wi.SetXY = function(x, y, isLocal) {
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (!aekiro_gameobject)
|
||
return;
|
||
if (isLocal && aekiro_gameobject.parent) {
|
||
aekiro_gameobject.local.x = x;
|
||
aekiro_gameobject.local.y = y;
|
||
aekiro_gameobject.updateGlobals();
|
||
} else {
|
||
this.SetXY_old(x, y);
|
||
aekiro_gameobject.updateLocals();
|
||
}
|
||
aekiro_gameobject.children_update();
|
||
}
|
||
;
|
||
wi.OffsetX_old = wi.OffsetX;
|
||
wi.OffsetX = function(x, isLocal) {
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (!aekiro_gameobject)
|
||
return;
|
||
if (isLocal && aekiro_gameobject.parent) {
|
||
aekiro_gameobject.local.x += x;
|
||
aekiro_gameobject.updateGlobals();
|
||
} else {
|
||
this.OffsetX_old(x);
|
||
aekiro_gameobject.updateLocals();
|
||
}
|
||
aekiro_gameobject.children_update();
|
||
}
|
||
;
|
||
wi.OffsetY_old = wi.OffsetY;
|
||
wi.OffsetY = function(y, isLocal) {
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (!aekiro_gameobject)
|
||
return;
|
||
if (isLocal && aekiro_gameobject.parent) {
|
||
aekiro_gameobject.local.y += y;
|
||
aekiro_gameobject.updateGlobals();
|
||
} else {
|
||
this.OffsetY_old(y);
|
||
aekiro_gameobject.updateLocals();
|
||
}
|
||
aekiro_gameobject.children_update();
|
||
}
|
||
;
|
||
wi.OffsetXY_old = wi.OffsetXY;
|
||
wi.OffsetXY = function(x, y, isLocal) {
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (!aekiro_gameobject)
|
||
return;
|
||
if (isLocal && aekiro_gameobject.parent) {
|
||
aekiro_gameobject.local.x += x;
|
||
aekiro_gameobject.local.y += y;
|
||
aekiro_gameobject.updateGlobals();
|
||
} else {
|
||
this.OffsetXY_old(x, y);
|
||
aekiro_gameobject.updateLocals();
|
||
}
|
||
aekiro_gameobject.children_update();
|
||
}
|
||
;
|
||
wi.SetAngle_old = wi.SetAngle;
|
||
wi.SetAngle = function(angle, isLocal) {
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (!aekiro_gameobject)
|
||
return;
|
||
if (isLocal && aekiro_gameobject.parent) {
|
||
aekiro_gameobject.local.angle = angle;
|
||
aekiro_gameobject.local._sinA = Math.sin(angle);
|
||
aekiro_gameobject.local._cosA = Math.cos(angle);
|
||
aekiro_gameobject.updateGlobals();
|
||
} else {
|
||
this.SetAngle_old(angle);
|
||
aekiro_gameobject.updateLocals();
|
||
}
|
||
aekiro_gameobject.children_update();
|
||
}
|
||
;
|
||
wi.GetX_old = wi.GetX;
|
||
wi.GetX = function(isLocal) {
|
||
if (isLocal) {
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (aekiro_gameobject.parent) {
|
||
return aekiro_gameobject.local.x;
|
||
}
|
||
}
|
||
return this.GetX_old();
|
||
}
|
||
;
|
||
wi.GetY_old = wi.GetY;
|
||
wi.GetY = function(isLocal) {
|
||
if (isLocal) {
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (aekiro_gameobject.parent) {
|
||
return aekiro_gameobject.local.y;
|
||
}
|
||
}
|
||
return this.GetY_old();
|
||
}
|
||
;
|
||
wi.GetAngle_old = wi.GetAngle;
|
||
wi.GetAngle = function(isLocal) {
|
||
if (isLocal) {
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (aekiro_gameobject.parent) {
|
||
return aekiro_gameobject.local.angle;
|
||
}
|
||
}
|
||
return this.GetAngle_old();
|
||
}
|
||
;
|
||
wi.GetCosAngle_old = wi.GetCosAngle;
|
||
wi.GetCosAngle = function(isLocal) {
|
||
if (isLocal) {
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (aekiro_gameobject.parent) {
|
||
return aekiro_gameobject.local._cosA;
|
||
}
|
||
}
|
||
return this.GetCosAngle_old();
|
||
}
|
||
;
|
||
wi.GetSinAngle_old = wi.GetSinAngle;
|
||
wi.GetSinAngle = function(isLocal) {
|
||
if (isLocal) {
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (aekiro_gameobject.parent) {
|
||
return aekiro_gameobject.local._sinA;
|
||
}
|
||
}
|
||
return this.GetSinAngle_old();
|
||
}
|
||
;
|
||
wi.SetWidth_old = wi.SetWidth;
|
||
wi.SetWidth = function(w, onlyNode) {
|
||
if (onlyNode) {
|
||
this.SetWidth_old(w);
|
||
return;
|
||
}
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
w = w == 0 ? 0.1 : w;
|
||
var f = w / this.GetWidth();
|
||
this.SetWidth_old(w);
|
||
var c = aekiro_gameobject.children;
|
||
var l = c.length;
|
||
for (var i = 0, l; i < l; i++) {
|
||
wi = c[i].GetWorldInfo();
|
||
wi.SetX(wi.GetX(true) * f, true);
|
||
wi.SetWidth(wi.GetWidth() * f);
|
||
wi.SetBboxChanged();
|
||
}
|
||
}
|
||
;
|
||
wi.SetHeight_old = wi.SetHeight;
|
||
wi.SetHeight = function(h, onlyNode) {
|
||
if (onlyNode) {
|
||
this.SetHeight_old(h);
|
||
return;
|
||
}
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
h = h == 0 ? 0.1 : h;
|
||
var f = h / this.GetHeight();
|
||
this.SetHeight_old(h);
|
||
var c = aekiro_gameobject.children;
|
||
var l = c.length;
|
||
for (var i = 0, l; i < l; i++) {
|
||
wi = c[i].GetWorldInfo();
|
||
wi.SetY(wi.GetY(true) * f, true);
|
||
wi.SetHeight(wi.GetHeight() * f);
|
||
wi.SetBboxChanged();
|
||
}
|
||
}
|
||
;
|
||
wi.SetSize_old = wi.SetSize;
|
||
wi.SetSize = function(w, h, onlyNode) {
|
||
if (onlyNode) {
|
||
this.SetSize_old(w, h);
|
||
return;
|
||
}
|
||
var inst = this.GetInstance();
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
w = w == 0 ? 0.1 : w;
|
||
h = h == 0 ? 0.1 : h;
|
||
var fw = h / this.GetHeight();
|
||
var fh = w / this.GetWidth();
|
||
this.SetSize_old(w, h);
|
||
var c = aekiro_gameobject.children;
|
||
var l = c.length;
|
||
for (var i = 0, l; i < l; i++) {
|
||
wi = c[i].GetWorldInfo();
|
||
wi.SetX(wi.GetX(true) * fw, true);
|
||
wi.SetY(wi.GetY(true) * fh, true);
|
||
wi.SetSize(wi.GetWidth() * fw, wi.GetHeight() * fh);
|
||
wi.SetBboxChanged();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
children_update() {
|
||
if (!this.children.length) {
|
||
return;
|
||
}
|
||
var inst, wi, l = this.children.length;
|
||
for (var i = 0; i < l; i++) {
|
||
inst = this.children[i];
|
||
wi = inst.GetWorldInfo();
|
||
wi.SetXY(wi.GetX(true), wi.GetY(true), true);
|
||
wi.SetAngle(wi.GetAngle(true), true);
|
||
wi.SetBboxChanged();
|
||
}
|
||
}
|
||
children_add(inst) {
|
||
var name, aekiro_gameobject;
|
||
if (typeof inst === 'string') {
|
||
name = inst;
|
||
inst = null;
|
||
} else {
|
||
aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (!aekiro_gameobject) {
|
||
console.error("Aekiro GameObject: You're adding a child (uid=%s) without a gameobject behavior on it.", inst.GetUID());
|
||
return;
|
||
}
|
||
name = aekiro_gameobject.name;
|
||
}
|
||
inst = this.goManager.gos[name];
|
||
if (inst == this.GetObjectInstance()) {
|
||
return;
|
||
}
|
||
if (!inst) {
|
||
console.error("Aekiro GameObject: Object of name : %s not found !", name);
|
||
return;
|
||
}
|
||
if (name == this.parentName) {
|
||
console.error("Aekiro GameObject: Cannot add %s as a child of %s, because %s is its parent !", name, this.name, name);
|
||
return;
|
||
}
|
||
if (this.children.indexOf(inst) > -1) {
|
||
console.warn("Aekiro GameObject: Object %s already have a child named %s !", this.name, name);
|
||
return;
|
||
}
|
||
aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
aekiro_gameobject.removeFromParent();
|
||
aekiro_gameobject.parentName = this.name;
|
||
aekiro_gameobject.parent = this.GetObjectInstance();
|
||
var res = this.globalToLocal(inst, this.GetObjectInstance());
|
||
aekiro_gameobject.local.x = res.x;
|
||
aekiro_gameobject.local.y = res.y;
|
||
aekiro_gameobject.local.angle = res.angle;
|
||
this.children.push(inst);
|
||
this.eventManager.emit("childrenAdded", {
|
||
"args": inst,
|
||
"propagate": false
|
||
});
|
||
}
|
||
setName(name) {
|
||
try {
|
||
this.goManager.setGoName(this.name, name);
|
||
} catch (e) {
|
||
console.error(e);
|
||
return;
|
||
}
|
||
this.name = name;
|
||
const l = this.children.length;
|
||
for (var i = 0; i < l; i++) {
|
||
this.children[i].GetUnsavedDataMap().aekiro_gameobject.parentName = name;
|
||
}
|
||
}
|
||
updateLocals() {
|
||
var parent = this.parent_get();
|
||
if (!parent)
|
||
return;
|
||
if (this.GetObjectInstance() === null)
|
||
return;
|
||
var res = this.globalToLocal(this.GetObjectInstance(), parent);
|
||
this.local.x = res.x;
|
||
this.local.y = res.y;
|
||
this.local.angle = res.angle;
|
||
}
|
||
updateGlobals() {
|
||
var parent = this.parent_get();
|
||
if (!parent)
|
||
return;
|
||
var res = this.localToGlobal(this.GetObjectInstance(), parent);
|
||
this.wi.SetXY_old(res.x, res.y);
|
||
this.wi.SetAngle_old(res.angle);
|
||
}
|
||
children_addFromLayer(layer) {
|
||
var insts = layer._instances;
|
||
var myInst = this.GetObjectInstance();
|
||
var inst, aekiro_gameobject;
|
||
for (var i = 0, l = insts.length; i < l; i++) {
|
||
inst = insts[i];
|
||
aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (inst != myInst && aekiro_gameobject && aekiro_gameobject.parentName == "") {
|
||
this.children_add(inst);
|
||
}
|
||
}
|
||
}
|
||
children_addFromType(type) {
|
||
var insts = type.GetCurrentSol().GetInstances();
|
||
for (var i = 0, l = insts.length; i < l; i++) {
|
||
this.children_add(insts[i]);
|
||
}
|
||
}
|
||
children_remove(inst) {
|
||
var index = -1;
|
||
if (typeof inst === 'string') {
|
||
for (var i = 0, l = this.children.length; i < l; i++) {
|
||
if (this.children[i].GetUnsavedDataMap().aekiro_gameobject.name == inst) {
|
||
index = i;
|
||
break;
|
||
}
|
||
}
|
||
} else {
|
||
index = this.children.indexOf(inst);
|
||
}
|
||
if (index != -1) {
|
||
var aekiro_gameobject = this.children[index].GetUnsavedDataMap().aekiro_gameobject;
|
||
aekiro_gameobject.parent = null;
|
||
this.children.splice(index, 1);
|
||
}
|
||
}
|
||
children_removeFromType(type) {
|
||
var insts = type.GetCurrentSol().GetInstances();
|
||
for (var i = 0, l = insts.length; i < l; i++) {
|
||
this.children_remove(insts[i]);
|
||
}
|
||
}
|
||
removeAllChildren() {
|
||
if (!this.children.length)
|
||
return;
|
||
var aekiro_gameobject;
|
||
var l = this.children.length;
|
||
for (var i = 0; i < l; i++) {
|
||
aekiro_gameobject = this.children[i].GetUnsavedDataMap().aekiro_gameobject;
|
||
aekiro_gameobject.parent = null;
|
||
}
|
||
this.children.length = 0;
|
||
}
|
||
removeFromParent() {
|
||
var parent = this.parent;
|
||
var inst = this.GetObjectInstance();
|
||
if (parent) {
|
||
var aekiro_gameobject = parent.GetUnsavedDataMap().aekiro_gameobject;
|
||
if (aekiro_gameobject) {
|
||
aekiro_gameobject.children_remove(inst);
|
||
}
|
||
}
|
||
}
|
||
destroyHierarchy() {
|
||
var runtime = this.GetRuntime();
|
||
runtime.DestroyInstance(this.GetObjectInstance());
|
||
for (var i = 0, l = this.children.length; i < l; i++) {
|
||
this.children[i].GetUnsavedDataMap().aekiro_gameobject.destroyHierarchy()
|
||
}
|
||
this.children.length = 0;
|
||
}
|
||
parent_get() {
|
||
if (!this.parent && this.parentName && this.name) {
|
||
this.parent = this.goManager.gos[this.parentName];
|
||
}
|
||
return this.parent;
|
||
}
|
||
getTemplate(node) {
|
||
if (!node) {
|
||
node = this._inst;
|
||
}
|
||
var template = {
|
||
type: node.GetObjectClass().GetName(),
|
||
x: node.GetWorldInfo().GetX(true),
|
||
y: node.GetWorldInfo().GetY(true),
|
||
zindex: node.GetWorldInfo().GetZIndex() + node.GetWorldInfo().GetLayer().GetIndex() * 100,
|
||
json: JSON.stringify(node.SaveToJson(!0)),
|
||
children: []
|
||
};
|
||
var children = node.GetUnsavedDataMap().aekiro_gameobject.children;
|
||
for (var i = 0, l = children.length; i < l; i++) {
|
||
template.children.push(this.getTemplate(children[i]));
|
||
}
|
||
return template;
|
||
}
|
||
hierarchyToArray(node, ar) {
|
||
if (!node) {
|
||
node = this.GetObjectInstance();
|
||
}
|
||
if (!ar) {
|
||
ar = [];
|
||
}
|
||
ar.push(node);
|
||
var children = node.GetUnsavedDataMap().aekiro_gameobject.children;
|
||
for (var i = 0, l = children.length; i < l; i++) {
|
||
this.hierarchyToArray(children[i], ar);
|
||
}
|
||
return ar;
|
||
}
|
||
updateZindex() {
|
||
var children = this.hierarchyToArray();
|
||
children.sort(function(a, b) {
|
||
return a.GetUnsavedDataMap().zindex - b.GetUnsavedDataMap().zindex;
|
||
});
|
||
var layer = children[0].GetWorldInfo().GetLayer();
|
||
for (var i = 1, l = children.length; i < l; i++) {
|
||
layer.MoveInstanceAdjacent(children[i], children[i - 1], true);
|
||
}
|
||
this.GetRuntime().UpdateRender();
|
||
}
|
||
moveToTop() {
|
||
var children = this.hierarchyToArray();
|
||
children.sort(function(a, b) {
|
||
return a.GetWorldInfo().GetZIndex() - b.GetWorldInfo().GetZIndex();
|
||
});
|
||
for (var i = 0, l = children.length; i < l; i++) {
|
||
children[i].GetSdkInstance().CallAction(this.acts.MoveToTop);
|
||
}
|
||
this.GetRuntime().UpdateRender();
|
||
}
|
||
moveToBottom() {
|
||
var children = this.hierarchyToArray();
|
||
children.sort(function(a, b) {
|
||
return b.GetWorldInfo().GetZIndex() - a.GetWorldInfo().GetZIndex();
|
||
});
|
||
for (var i = 0, l = children.length; i < l; i++) {
|
||
children[i].GetSdkInstance().CallAction(this.acts.MoveToBottom);
|
||
}
|
||
this.GetRuntime().UpdateRender();
|
||
}
|
||
setTimeScale(s) {
|
||
var children = this.hierarchyToArray();
|
||
for (var i = 1, l = children.length; i < l; i++) {
|
||
children[i].SetTimeScale(s);
|
||
}
|
||
}
|
||
Tick() {}
|
||
Release() {}
|
||
Release2() {
|
||
this.goManager.removeGO(this.name);
|
||
this.removeFromParent();
|
||
for (var i = 0, l = this.children.length; i < l; i++) {
|
||
this.children_remove(this.children[i]);
|
||
}
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"name": this.name,
|
||
"parentName": this.parentName,
|
||
"parentSameLayer": this.parentSameLayer,
|
||
"global_x": this.wi.GetX(),
|
||
"global_y": this.wi.GetY()
|
||
};
|
||
}
|
||
LoadFromJson(o) {
|
||
this.name = o["name"];
|
||
this.parentName = o["parentName"];
|
||
this.parentSameLayer = o["parentSameLayer"];
|
||
this.wi.SetXY(o["global_x"], o["global_y"]);
|
||
this.wi.SetBboxChanged();
|
||
}
|
||
GetDebuggerProperties() {
|
||
var children = [];
|
||
for (var i = 0, l = this.children.length; i < l; i++) {
|
||
children.push(this.children[i].GetUnsavedDataMap().aekiro_gameobject.name);
|
||
}
|
||
var children_str = JSON.stringify(children, null, "\t");
|
||
return [{
|
||
title: "aekiro_gameobject",
|
||
properties: [{
|
||
name: "name",
|
||
value: this.name
|
||
}, {
|
||
name: "parentName",
|
||
value: this.parentName
|
||
}, {
|
||
name: "children",
|
||
value: children_str
|
||
}, {
|
||
name: "local_x",
|
||
value: this.local.x
|
||
}, {
|
||
name: "local_y",
|
||
value: this.local.y
|
||
}, {
|
||
name: "local_angle",
|
||
value: this.local.angle
|
||
}]
|
||
}];
|
||
}
|
||
applyActionToHierarchy(action, v) {
|
||
if (!action)
|
||
return;
|
||
this.GetObjectInstance().GetSdkInstance().CallAction(action, v);
|
||
var h = this.children;
|
||
var l = h.length;
|
||
for (var i = 0; i < l; i++) {
|
||
h[i].GetUnsavedDataMap().aekiro_gameobject.applyActionToHierarchy(action, v);
|
||
}
|
||
}
|
||
SetBlendMode(bm) {
|
||
this.wi.SetBlendMode(bm);
|
||
var h = this.children;
|
||
for (var i = 0, l = h.length; i < l; i++) {
|
||
h[i].GetWorldInfo().SetBlendMode(bm);
|
||
}
|
||
}
|
||
globalToLocal(inst, parent_inst) {
|
||
var wip = parent_inst.GetWorldInfo();
|
||
return this.globalToLocal2(inst, wip.GetX(), wip.GetY(), wip.GetAngle());
|
||
}
|
||
globalToLocal2(inst, p_x, p_y, p_angle) {
|
||
var res = {};
|
||
var wi = inst.GetWorldInfo();
|
||
res.x = (wi.GetX() - p_x) * Math.cos(p_angle) + (wi.GetY() - p_y) * Math.sin(p_angle);
|
||
res.y = -(wi.GetX() - p_x) * Math.sin(p_angle) + (wi.GetY() - p_y) * Math.cos(p_angle);
|
||
res.angle = wi.GetAngle() - p_angle;
|
||
return res;
|
||
}
|
||
localToGlobal(inst, parent_inst) {
|
||
var wip = parent_inst.GetWorldInfo();
|
||
return this.localToGlobal2(inst, wip.GetX(), wip.GetY(), wip.GetAngle());
|
||
}
|
||
localToGlobal2(inst, p_x, p_y, p_angle) {
|
||
var res = {};
|
||
var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject;
|
||
res.x = p_x + aekiro_gameobject.local.x * Math.cos(p_angle) - aekiro_gameobject.local.y * Math.sin(p_angle);
|
||
res.y = p_y + aekiro_gameobject.local.x * Math.sin(p_angle) + aekiro_gameobject.local.y * Math.cos(p_angle);
|
||
res.angle = p_angle + aekiro_gameobject.local.angle;
|
||
return res;
|
||
}
|
||
localToGlobal_x() {
|
||
var parent = this.parent_get();
|
||
if (parent) {
|
||
var wp = parent.GetWorldInfo();
|
||
var x = wp.GetX() + this.local.x * Math.cos(wp.GetAngle()) - this.local.y * Math.sin(wp.GetAngle());
|
||
return x;
|
||
} else {
|
||
return wp.GetX();
|
||
}
|
||
}
|
||
localToGlobal_y() {
|
||
var parent = this.parent_get();
|
||
if (parent) {
|
||
var wp = parent.GetWorldInfo();
|
||
var y = wp.GetY("g") + this.local.x * Math.sin(wp.GetAngle("g")) + this.local.y * Math.cos(wp.GetAngle("g"));
|
||
return y;
|
||
} else {
|
||
return this.local.y;
|
||
}
|
||
}
|
||
localToGlobal_angle() {
|
||
var parent = this.parent_get();
|
||
if (parent) {
|
||
var wp = parent.GetWorldInfo();
|
||
var angle = wp.GetAngle("g") + this.local.angle;
|
||
return angle;
|
||
} else {
|
||
return this.local.angle;
|
||
}
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gameobject.Cnds = {
|
||
IsName(name) {
|
||
return name == this.name;
|
||
},
|
||
IsParentName(name) {
|
||
return name == this.parentName;
|
||
},
|
||
OnCloned() {
|
||
return true;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gameobject.Acts = {
|
||
Clone(layer, x, y, name, parentName) {
|
||
var template = this.getTemplate();
|
||
var inst = aekiro_goManager.clone(template, name, parentName, layer, x, y);
|
||
inst.GetUnsavedDataMap().aekiro_gameobject.updateZindex();
|
||
},
|
||
SetName(name) {
|
||
this.setName(name);
|
||
},
|
||
AddChildrenFromLayer(layer) {
|
||
this.children_addFromLayer(layer);
|
||
},
|
||
AddChildrenFromType(type) {
|
||
this.children_addFromType(type);
|
||
},
|
||
AddChildByName(name) {
|
||
this.children_add(name);
|
||
},
|
||
RemoveChildByName(name) {
|
||
this.children_remove(name);
|
||
},
|
||
RemoveChildByType(type) {
|
||
this.children_removeFromType(type);
|
||
},
|
||
RemoveFromParent() {
|
||
this.removeFromParent();
|
||
},
|
||
RemoveAllchildren() {
|
||
this.removeAllChildren();
|
||
},
|
||
SetOpacity(v) {
|
||
this.applyActionToHierarchy(this.acts.SetOpacity, v);
|
||
},
|
||
SetVisible(v) {
|
||
this.applyActionToHierarchy(this.acts.SetVisible, v);
|
||
},
|
||
SetColor(v) {
|
||
this.applyActionToHierarchy(this.acts.SetDefaultColor, v);
|
||
},
|
||
SetMirrored(v) {
|
||
this.applyActionToHierarchy(this.acts.SetMirrored, v);
|
||
},
|
||
SetFlipped(v) {
|
||
this.applyActionToHierarchy(this.acts.SetFlipped, v);
|
||
},
|
||
MoveToLayer(v) {
|
||
this.applyActionToHierarchy(this.acts.MoveToLayer, v);
|
||
},
|
||
MoveToTop() {
|
||
this.moveToTop();
|
||
},
|
||
MoveToBottom() {
|
||
this.moveToBottom();
|
||
},
|
||
SetZElevation(v) {
|
||
this.applyActionToHierarchy(this.acts.SetZElevation, v);
|
||
},
|
||
SetEffect(v) {
|
||
this.SetBlendMode(v);
|
||
},
|
||
SetWidth(v) {
|
||
this.wi.SetWidth(v, true);
|
||
this.wi.SetBboxChanged();
|
||
},
|
||
SetHeight(v) {
|
||
this.wi.SetHeight(v, true);
|
||
this.wi.SetBboxChanged();
|
||
},
|
||
Destroy() {
|
||
this.destroyHierarchy();
|
||
},
|
||
SetLocalX(v) {
|
||
this.wi.SetX(v, true);
|
||
this.wi.SetBboxChanged();
|
||
},
|
||
SetLocalY(v) {
|
||
this.wi.SetY(v, true);
|
||
this.wi.SetBboxChanged();
|
||
},
|
||
SetLocalAngle(v) {
|
||
this.wi.SetAngle(v, true);
|
||
this.wi.SetBboxChanged();
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gameobject.Exps = {
|
||
name() {
|
||
return this.name;
|
||
},
|
||
parent() {
|
||
return this.parentName;
|
||
},
|
||
asjson() {
|
||
var t = this.getTemplate();
|
||
return JSON.stringify(t);
|
||
},
|
||
globalX() {
|
||
return this.GetObjectInstance().GetWorldInfo().GetX_old();
|
||
},
|
||
globalY() {
|
||
return this.GetObjectInstance().GetWorldInfo().GetY_old();
|
||
},
|
||
globalAngle() {
|
||
return this.GetObjectInstance().GetWorldInfo().GetAngle_old();
|
||
},
|
||
localX() {
|
||
return this.wi.GetX(true);
|
||
},
|
||
localY() {
|
||
return this.wi.GetY(true);
|
||
},
|
||
localAngle() {
|
||
return this.wi.GetAngle(true);
|
||
}
|
||
};
|
||
}
|
||
'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.MoveTo = class MoveToBehavior extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.MoveTo.Type = class MoveToType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const IBehaviorInstance = self.IBehaviorInstance;
|
||
const PROP_MAX_SPEED = 0;
|
||
const PROP_ACCELERATION = 1;
|
||
const PROP_DECELERATION = 2;
|
||
const PROP_ROTATE_SPEED = 3;
|
||
const PROP_SET_ANGLE = 4;
|
||
const PROP_STOP_ON_SOLIDS = 5;
|
||
const PROP_ENABLED = 6;
|
||
C3.Behaviors.MoveTo.Instance = class MoveToInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
this._maxSpeed = 200;
|
||
this._acc = 600;
|
||
this._dec = 600;
|
||
this._rotateSpeed = 0;
|
||
this._setAngle = true;
|
||
this._stopOnSolids = false;
|
||
this._isEnabled = true;
|
||
this._speed = 0;
|
||
this._movingAngle = this.GetWorldInfo().GetAngle();
|
||
this._waypoints = [];
|
||
if (properties) {
|
||
this._maxSpeed = properties[PROP_MAX_SPEED];
|
||
this._acc = properties[PROP_ACCELERATION];
|
||
this._dec = properties[PROP_DECELERATION];
|
||
this._rotateSpeed = C3.toRadians(properties[PROP_ROTATE_SPEED]);
|
||
this._setAngle = properties[PROP_SET_ANGLE];
|
||
this._stopOnSolids = properties[PROP_STOP_ON_SOLIDS];
|
||
this._isEnabled = properties[PROP_ENABLED]
|
||
}
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"ms": this._maxSpeed,
|
||
"acc": this._acc,
|
||
"dec": this._dec,
|
||
"rs": this._rotateSpeed,
|
||
"sa": this._setAngle,
|
||
"sos": this._stopOnSolids,
|
||
"s": this._speed,
|
||
"ma": this._movingAngle,
|
||
"wp": this._waypoints.map(p=>({
|
||
"x": p.x,
|
||
"y": p.y
|
||
})),
|
||
"e": this._isEnabled
|
||
}
|
||
}
|
||
LoadFromJson(o) {
|
||
this._maxSpeed = o["ms"];
|
||
this._acc = o["acc"];
|
||
this._dec = o["dec"];
|
||
this._rotateSpeed = o["rs"];
|
||
this._setAngle = o["sa"];
|
||
this._stopOnSolids = o["sos"];
|
||
this._speed = o["s"];
|
||
this._movingAngle = o["ma"];
|
||
this._waypoints = o["wp"].map(p=>({
|
||
x: p["x"],
|
||
y: p["y"]
|
||
}));
|
||
this._SetEnabled(o["e"]);
|
||
if (this._isEnabled && this._waypoints.length > 0)
|
||
this._StartTicking()
|
||
}
|
||
_AddWaypoint(x, y, isDirect) {
|
||
if (isDirect)
|
||
C3.clearArray(this._waypoints);
|
||
this._waypoints.push({
|
||
x,
|
||
y
|
||
});
|
||
if (this._isEnabled)
|
||
this._StartTicking()
|
||
}
|
||
_GetWaypointCount() {
|
||
return this._waypoints.length
|
||
}
|
||
_GetWaypointXAt(i) {
|
||
i = Math.floor(i);
|
||
if (i < 0 || i >= this._waypoints.length)
|
||
return 0;
|
||
return this._waypoints[i].x
|
||
}
|
||
_GetWaypointYAt(i) {
|
||
i = Math.floor(i);
|
||
if (i < 0 || i >= this._waypoints.length)
|
||
return 0;
|
||
return this._waypoints[i].y
|
||
}
|
||
_IsMoving() {
|
||
return this._waypoints.length > 0
|
||
}
|
||
_Stop() {
|
||
C3.clearArray(this._waypoints);
|
||
this._speed = 0;
|
||
this._StopTicking()
|
||
}
|
||
_GetTargetX() {
|
||
if (this._waypoints.length > 0)
|
||
return this._waypoints[0].x;
|
||
else
|
||
return 0
|
||
}
|
||
_GetTargetY() {
|
||
if (this._waypoints.length > 0)
|
||
return this._waypoints[0].y;
|
||
else
|
||
return 0
|
||
}
|
||
_SetSpeed(s) {
|
||
if (!this._IsMoving())
|
||
return;
|
||
this._speed = Math.min(s, this._maxSpeed)
|
||
}
|
||
_GetSpeed() {
|
||
return this._speed
|
||
}
|
||
_SetMaxSpeed(ms) {
|
||
this._maxSpeed = Math.max(ms, 0);
|
||
this._SetSpeed(this._speed)
|
||
}
|
||
_GetMaxSpeed() {
|
||
return this._maxSpeed
|
||
}
|
||
_IsRotationEnabled() {
|
||
return this._rotateSpeed !== 0
|
||
}
|
||
Tick() {
|
||
if (!this._isEnabled || !this._IsMoving())
|
||
return;
|
||
const dt = this._runtime.GetDt(this._inst);
|
||
const wi = this._inst.GetWorldInfo();
|
||
const startX = wi.GetX();
|
||
const startY = wi.GetY();
|
||
const startAngle = wi.GetAngle();
|
||
let curSpeed = this._speed;
|
||
let maxSpeed = this._maxSpeed;
|
||
const acc = this._acc;
|
||
const dec = this._dec;
|
||
const targetX = this._GetTargetX();
|
||
const targetY = this._GetTargetY();
|
||
const angleToTarget = C3.angleTo(startX, startY, targetX, targetY);
|
||
let isWithinStoppingDistance = false;
|
||
if (dec > 0 && this._waypoints.length === 1) {
|
||
const stoppingDist = .5 * curSpeed * curSpeed / dec * 1.0001;
|
||
isWithinStoppingDistance = C3.distanceSquared(startX, startY, targetX, targetY) <= stoppingDist * stoppingDist;
|
||
if (isWithinStoppingDistance) {
|
||
const remainingDist = C3.distanceTo(startX, startY, targetX, targetY);
|
||
curSpeed = Math.sqrt(2 * dec * remainingDist);
|
||
maxSpeed = curSpeed;
|
||
this._speed = curSpeed
|
||
}
|
||
}
|
||
if (this._IsRotationEnabled()) {
|
||
const da = C3.angleDiff(this._movingAngle, angleToTarget);
|
||
if (da > Number.EPSILON) {
|
||
const t = da / this._rotateSpeed;
|
||
const dist = C3.distanceTo(wi.GetX(), wi.GetY(), targetX, targetY);
|
||
const r = dist / (2 * Math.sin(da));
|
||
const curveDist = r * da;
|
||
maxSpeed = Math.min(maxSpeed, C3.clamp(curveDist / t, 0, this._maxSpeed))
|
||
}
|
||
}
|
||
let curAcc = isWithinStoppingDistance ? -dec : acc;
|
||
const stepDist = Math.min(curSpeed * dt + .5 * curAcc * dt * dt, maxSpeed * dt);
|
||
if (isWithinStoppingDistance) {
|
||
if (dec > 0) {
|
||
this._speed = Math.max(this._speed - dec * dt, 0);
|
||
if (this._speed === 0) {
|
||
this._OnArrived(wi, targetX, targetY);
|
||
return
|
||
}
|
||
}
|
||
} else if (acc === 0)
|
||
this._speed = maxSpeed;
|
||
else
|
||
this._speed = Math.min(this._speed + acc * dt, maxSpeed);
|
||
if (C3.distanceSquared(wi.GetX(), wi.GetY(), targetX, targetY) <= stepDist * stepDist) {
|
||
this._OnArrived(wi, targetX, targetY);
|
||
return
|
||
}
|
||
if (this._IsRotationEnabled())
|
||
this._movingAngle = C3.angleRotate(this._movingAngle, angleToTarget, this._rotateSpeed * dt);
|
||
else
|
||
this._movingAngle = angleToTarget;
|
||
wi.OffsetXY(Math.cos(this._movingAngle) * stepDist, Math.sin(this._movingAngle) * stepDist);
|
||
if (this._setAngle)
|
||
wi.SetAngle(this._movingAngle);
|
||
wi.SetBboxChanged();
|
||
this._CheckSolidCollision(startX, startY, startAngle)
|
||
}
|
||
_OnArrived(wi, targetX, targetY) {
|
||
wi.SetXY(targetX, targetY);
|
||
wi.SetBboxChanged();
|
||
this._waypoints.shift();
|
||
if (this._waypoints.length === 0) {
|
||
this._speed = 0;
|
||
this._StopTicking()
|
||
}
|
||
this.GetScriptInterface().dispatchEvent(C3.New(C3.Event, "arrived"));
|
||
this.Trigger(C3.Behaviors.MoveTo.Cnds.OnArrived)
|
||
}
|
||
_CheckSolidCollision(startX, startY, startAngle) {
|
||
const collisionEngine = this._runtime.GetCollisionEngine();
|
||
if (this._stopOnSolids && collisionEngine.TestOverlapSolid(this._inst)) {
|
||
this._Stop();
|
||
const wi = this._inst.GetWorldInfo();
|
||
const x = wi.GetX();
|
||
const y = wi.GetY();
|
||
const a = C3.angleTo(x, y, startX, startY);
|
||
const dist = C3.distanceTo(x, y, startX, startY);
|
||
if (!collisionEngine.PushOutSolid(this._inst, Math.cos(a), Math.sin(a), Math.max(dist, 1))) {
|
||
wi.SetXY(startX, startY);
|
||
wi.SetAngle(startAngle);
|
||
wi.SetBboxChanged()
|
||
}
|
||
this.GetScriptInterface().dispatchEvent(C3.New(C3.Event, "hitsolid"));
|
||
this.Trigger(C3.Behaviors.MoveTo.Cnds.OnHitSolid)
|
||
}
|
||
}
|
||
_IsSetAngle() {
|
||
return this._setAngle
|
||
}
|
||
_SetSetAngle(a) {
|
||
this._setAngle = !!a
|
||
}
|
||
_SetAngleOfMotion(a) {
|
||
this._movingAngle = a;
|
||
if (this._isEnabled && this._setAngle && !this._IsMoving()) {
|
||
const wi = this.GetWorldInfo();
|
||
wi.SetAngle(this._movingAngle);
|
||
wi.SetBboxChanged()
|
||
}
|
||
}
|
||
_GetAngleOfMotion() {
|
||
return this._movingAngle
|
||
}
|
||
_SetAcceleration(a) {
|
||
this._acc = Math.max(a, 0)
|
||
}
|
||
_GetAcceleration() {
|
||
return this._acc
|
||
}
|
||
_SetDeceleration(d) {
|
||
this._dec = Math.max(d, 0)
|
||
}
|
||
_GetDeceleration() {
|
||
return this._dec
|
||
}
|
||
_SetRotateSpeed(r) {
|
||
this._rotateSpeed = Math.max(r, 0)
|
||
}
|
||
_GetRotateSpeed() {
|
||
return this._rotateSpeed
|
||
}
|
||
_SetStopOnSolids(e) {
|
||
this._stopOnSolids = !!e
|
||
}
|
||
_IsStopOnSolids() {
|
||
return this._stopOnSolids
|
||
}
|
||
_SetEnabled(e) {
|
||
e = !!e;
|
||
if (this._isEnabled === e)
|
||
return;
|
||
this._isEnabled = e;
|
||
if (this._isEnabled && this._IsMoving())
|
||
this._StartTicking();
|
||
else
|
||
this._StopTicking()
|
||
}
|
||
_IsEnabled() {
|
||
return this._isEnabled
|
||
}
|
||
GetPropertyValueByIndex(index) {
|
||
switch (index) {
|
||
case PROP_MAX_SPEED:
|
||
return this._GetMaxSpeed();
|
||
case PROP_ACCELERATION:
|
||
return this._GetAcceleration();
|
||
case PROP_DECELERATION:
|
||
return this._GetDeceleration();
|
||
case PROP_ROTATE_SPEED:
|
||
return C3.toDegrees(this._GetRotateSpeed());
|
||
case PROP_SET_ANGLE:
|
||
return this._IsSetAngle();
|
||
case PROP_STOP_ON_SOLIDS:
|
||
return this._IsStopOnSolids();
|
||
case PROP_ENABLED:
|
||
return this._IsEnabled()
|
||
}
|
||
}
|
||
SetPropertyValueByIndex(index, value) {
|
||
switch (index) {
|
||
case PROP_MAX_SPEED:
|
||
this._SetMaxSpeed(value);
|
||
break;
|
||
case PROP_ACCELERATION:
|
||
this._SetAcceleration(value);
|
||
break;
|
||
case PROP_DECELERATION:
|
||
this._SetDeceleration(value);
|
||
break;
|
||
case PROP_ROTATE_SPEED:
|
||
this._SetRotateSpeed(C3.toRadians(value));
|
||
break;
|
||
case PROP_SET_ANGLE:
|
||
this._SetSetAngle(value);
|
||
break;
|
||
case PROP_STOP_ON_SOLIDS:
|
||
this._SetStopOnSolids(value);
|
||
break;
|
||
case PROP_ENABLED:
|
||
this._SetEnabled(value);
|
||
break
|
||
}
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "behaviors.moveto";
|
||
return [{
|
||
title: "$" + this.GetBehaviorType().GetName(),
|
||
properties: [{
|
||
name: prefix + ".debugger.speed",
|
||
value: this._GetSpeed(),
|
||
onedit: v=>this._SetSpeed(v)
|
||
}, {
|
||
name: prefix + ".debugger.angle-of-motion",
|
||
value: C3.toDegrees(this._GetAngleOfMotion()),
|
||
onedit: v=>this._movingAngle = C3.toRadians(v)
|
||
}, {
|
||
name: prefix + ".debugger.target-x",
|
||
value: this._GetTargetX()
|
||
}, {
|
||
name: prefix + ".debugger.target-y",
|
||
value: this._GetTargetY()
|
||
}, {
|
||
name: prefix + ".debugger.waypoint-count",
|
||
value: this._GetWaypointCount()
|
||
}, {
|
||
name: prefix + ".properties.max-speed.name",
|
||
value: this._GetMaxSpeed(),
|
||
onedit: v=>this._SetMaxSpeed(v)
|
||
}, {
|
||
name: prefix + ".properties.acceleration.name",
|
||
value: this._GetAcceleration(),
|
||
onedit: v=>this._SetAcceleration(v)
|
||
}, {
|
||
name: prefix + ".properties.deceleration.name",
|
||
value: this._GetDeceleration(),
|
||
onedit: v=>this._SetDeceleration(v)
|
||
}, {
|
||
name: prefix + ".properties.rotate-speed.name",
|
||
value: C3.toDegrees(this._GetRotateSpeed()),
|
||
onedit: v=>this._SetRotateSpeed(C3.toRadians(v))
|
||
}, {
|
||
name: prefix + ".properties.enabled.name",
|
||
value: this._IsEnabled(),
|
||
onedit: v=>this._SetEnabled(v)
|
||
}]
|
||
}]
|
||
}
|
||
GetScriptInterfaceClass() {
|
||
return self.IMoveToBehaviorInstance
|
||
}
|
||
}
|
||
;
|
||
const map = new WeakMap;
|
||
self.IMoveToBehaviorInstance = class IMoveToBehaviorInstance extends IBehaviorInstance {
|
||
constructor() {
|
||
super();
|
||
map.set(this, IBehaviorInstance._GetInitInst().GetSdkInstance())
|
||
}
|
||
moveToPosition(x, y, isDirect=true) {
|
||
map.get(this)._AddWaypoint(x, y, !!isDirect)
|
||
}
|
||
getTargetX() {
|
||
return map.get(this)._GetTargetX()
|
||
}
|
||
getTargetY() {
|
||
return map.get(this)._GetTargetY()
|
||
}
|
||
getTargetPosition() {
|
||
const b = map.get(this);
|
||
return [b._GetTargetX(), b._GetTargetY()]
|
||
}
|
||
getWaypointCount() {
|
||
return map.get(this)._GetWaypointCount()
|
||
}
|
||
getWaypointX(i) {
|
||
return map.get(this)._GetWaypointXAt(+i)
|
||
}
|
||
getWaypointY(i) {
|
||
return map.get(this)._GetWaypointYAt(+i)
|
||
}
|
||
getWaypoint(i) {
|
||
i = +i;
|
||
const b = map.get(this);
|
||
return [b._GetWaypointXAt(i), b._GetWaypointYAt(i)]
|
||
}
|
||
stop() {
|
||
map.get(this)._Stop()
|
||
}
|
||
get isMoving() {
|
||
return map.get(this)._IsMoving()
|
||
}
|
||
get speed() {
|
||
return map.get(this)._GetSpeed()
|
||
}
|
||
set speed(s) {
|
||
map.get(this)._SetSpeed(s)
|
||
}
|
||
get maxSpeed() {
|
||
return map.get(this)._GetMaxSpeed()
|
||
}
|
||
set maxSpeed(ms) {
|
||
map.get(this)._SetMaxSpeed(ms)
|
||
}
|
||
get acceleration() {
|
||
return map.get(this)._GetAcceleration()
|
||
}
|
||
set acceleration(a) {
|
||
map.get(this)._SetAcceleration(a)
|
||
}
|
||
get deceleration() {
|
||
return map.get(this)._GetDeceleration()
|
||
}
|
||
set deceleration(d) {
|
||
map.get(this)._SetDeceleration(d)
|
||
}
|
||
get angleOfMotion() {
|
||
return map.get(this)._GetAngleOfMotion()
|
||
}
|
||
set angleOfMotion(a) {
|
||
map.get(this)._SetAngleOfMotion(a)
|
||
}
|
||
get rotateSpeed() {
|
||
return map.get(this)._GetRotateSpeed()
|
||
}
|
||
set rotateSpeed(r) {
|
||
map.get(this)._SetRotateSpeed(r)
|
||
}
|
||
get isStopOnSolids() {
|
||
return map.get(this)._IsStopOnSolids()
|
||
}
|
||
set isStopOnSolids(e) {
|
||
map.get(this)._SetStopOnSolids(e)
|
||
}
|
||
get isEnabled() {
|
||
return map.get(this)._IsEnabled()
|
||
}
|
||
set isEnabled(e) {
|
||
map.get(this)._SetEnabled(e)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.MoveTo.Cnds = {
|
||
IsMoving() {
|
||
return this._IsMoving()
|
||
},
|
||
CompareSpeed(cmp, s) {
|
||
return C3.compare(this._GetSpeed(), cmp, s)
|
||
},
|
||
IsEnabled() {
|
||
return this._IsEnabled()
|
||
},
|
||
OnArrived() {
|
||
return true
|
||
},
|
||
OnHitSolid() {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.MoveTo.Acts = {
|
||
MoveToPosition(x, y, mode) {
|
||
this._AddWaypoint(x, y, mode === 0)
|
||
},
|
||
MoveToObject(objectClass, imgPt, mode) {
|
||
if (!objectClass)
|
||
return;
|
||
const inst = objectClass.GetPairedInstance(this._inst);
|
||
if (!inst || !inst.GetWorldInfo())
|
||
return;
|
||
const [x,y] = inst.GetImagePoint(imgPt);
|
||
this._AddWaypoint(x, y, mode === 0)
|
||
},
|
||
MoveAlongPathfindingPath(mode) {
|
||
const behInst = this._inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.Pathfinding);
|
||
if (!behInst)
|
||
return;
|
||
const path = behInst._GetPath();
|
||
if (path.length === 0)
|
||
return;
|
||
for (let i = 0, len = path.length; i < len; ++i) {
|
||
const n = path[i];
|
||
this._AddWaypoint(n.x, n.y, i === 0 && mode === 0)
|
||
}
|
||
},
|
||
MoveAlongTimeline(timeline, trackId, mode) {
|
||
let trackState = null;
|
||
if (trackId)
|
||
trackState = timeline.GetTrackById(trackId);
|
||
else
|
||
trackState = C3.first(timeline.GetTracks());
|
||
if (!trackState)
|
||
return;
|
||
const xTrack = trackState.GetPropertyTrack("offsetX");
|
||
const yTrack = trackState.GetPropertyTrack("offsetY");
|
||
if (!xTrack || !yTrack)
|
||
return;
|
||
const xPositions = [...xTrack.GetPropertyKeyframeValues()];
|
||
const yPositions = [...yTrack.GetPropertyKeyframeValues()];
|
||
if (xPositions.length === 0 || yPositions.length === 0)
|
||
return;
|
||
let xOrigin = 0;
|
||
let yOrigin = 0;
|
||
const wi = this._inst.GetWorldInfo();
|
||
if (xTrack.GetResultMode() === "relative")
|
||
xOrigin = wi.GetX();
|
||
if (yTrack.GetResultMode() === "relative")
|
||
yOrigin = wi.GetY();
|
||
for (let i = 0, len = Math.min(xPositions.length, yPositions.length); i < len; ++i) {
|
||
const x = xPositions[i] + xOrigin;
|
||
const y = yPositions[i] + yOrigin;
|
||
this._AddWaypoint(x, y, i === 0 && mode === 0)
|
||
}
|
||
},
|
||
MoveAlongTimelineByName(timelineName, trackId, mode) {
|
||
const timeline = this._runtime.GetTimelineManager().GetTimelineByName(timelineName);
|
||
if (!timeline)
|
||
return;
|
||
C3.Behaviors.MoveTo.Acts.MoveAlongTimeline.call(this, timeline, trackId, mode)
|
||
},
|
||
Stop() {
|
||
this._Stop()
|
||
},
|
||
SetMovingAngle(a) {
|
||
this._SetAngleOfMotion(C3.toRadians(a))
|
||
},
|
||
SetSpeed(s) {
|
||
this._SetSpeed(s)
|
||
},
|
||
SetMaxSpeed(ms) {
|
||
this._SetMaxSpeed(ms)
|
||
},
|
||
SetAcceleration(a) {
|
||
this._SetAcceleration(a)
|
||
},
|
||
SetDeceleration(d) {
|
||
this._SetDeceleration(d)
|
||
},
|
||
SetRotateSpeed(r) {
|
||
this._SetRotateSpeed(C3.toRadians(r))
|
||
},
|
||
SetStopOnSolids(e) {
|
||
this._SetStopOnSolids(e)
|
||
},
|
||
SetEnabled(e) {
|
||
this._SetEnabled(e)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.MoveTo.Exps = {
|
||
Speed() {
|
||
return this._GetSpeed()
|
||
},
|
||
MaxSpeed() {
|
||
return this._GetMaxSpeed()
|
||
},
|
||
Acceleration() {
|
||
return this._GetAcceleration()
|
||
},
|
||
Deceleration() {
|
||
return this._GetDeceleration()
|
||
},
|
||
MovingAngle() {
|
||
return C3.toDegrees(this._GetAngleOfMotion())
|
||
},
|
||
RotateSpeed() {
|
||
return C3.toDegrees(this._GetRotateSpeed())
|
||
},
|
||
TargetX() {
|
||
return this._GetTargetX()
|
||
},
|
||
TargetY() {
|
||
return this._GetTargetY()
|
||
},
|
||
WaypointCount() {
|
||
return this._GetWaypointCount()
|
||
},
|
||
WaypointXAt(i) {
|
||
return this._GetWaypointXAt(i)
|
||
},
|
||
WaypointYAt(i) {
|
||
return this._GetWaypointYAt(i)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Fade = class FadeBehavior extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Fade.Type = class FadeType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const FADE_IN_TIME = 0;
|
||
const WAIT_TIME = 1;
|
||
const FADE_OUT_TIME = 2;
|
||
const DESTROY = 3;
|
||
const ACTIVE_AT_START = 4;
|
||
C3.Behaviors.Fade.Instance = class FadeInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
this._fadeInTime = 0;
|
||
this._waitTime = 0;
|
||
this._fadeOutTime = 0;
|
||
this._destroy = true;
|
||
this._activeAtStart = true;
|
||
this._setMaxOpacity = false;
|
||
this._stage = 0;
|
||
this._stageTime = C3.New(C3.KahanSum);
|
||
this._maxOpacity = this._inst.GetWorldInfo().GetOpacity() || 1;
|
||
if (properties) {
|
||
this._fadeInTime = properties[FADE_IN_TIME];
|
||
this._waitTime = properties[WAIT_TIME];
|
||
this._fadeOutTime = properties[FADE_OUT_TIME];
|
||
this._destroy = !!properties[DESTROY];
|
||
this._activeAtStart = !!properties[ACTIVE_AT_START];
|
||
this._stage = this._activeAtStart ? 0 : 3
|
||
}
|
||
if (this._activeAtStart)
|
||
if (this._fadeInTime === 0) {
|
||
this._stage = 1;
|
||
if (this._waitTime === 0)
|
||
this._stage = 2
|
||
} else {
|
||
this._inst.GetWorldInfo().SetOpacity(0);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
this._StartTicking()
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"fit": this._fadeInTime,
|
||
"wt": this._waitTime,
|
||
"fot": this._fadeOutTime,
|
||
"d": this._destroy,
|
||
"s": this._stage,
|
||
"st": this._stageTime.Get(),
|
||
"mo": this._maxOpacity
|
||
}
|
||
}
|
||
LoadFromJson(o) {
|
||
this._fadeInTime = o["fit"];
|
||
this._waitTime = o["wt"];
|
||
this._fadeOutTime = o["fot"];
|
||
this._destroy = o["d"];
|
||
this._stage = o["s"];
|
||
this._stageTime.Set(o["st"]);
|
||
this._maxOpacity = o["mo"]
|
||
}
|
||
Tick() {
|
||
const dt = this._runtime.GetDt(this._inst);
|
||
this._stageTime.Add(dt);
|
||
const wi = this._inst.GetWorldInfo();
|
||
if (this._stage === 0) {
|
||
wi.SetOpacity(this._stageTime.Get() / this._fadeInTime * this._maxOpacity);
|
||
this._runtime.UpdateRender();
|
||
if (wi.GetOpacity() >= this._maxOpacity) {
|
||
wi.SetOpacity(this._maxOpacity);
|
||
this._stage = 1;
|
||
this._stageTime.Reset();
|
||
this.Trigger(C3.Behaviors.Fade.Cnds.OnFadeInEnd)
|
||
}
|
||
}
|
||
if (this._stage === 1)
|
||
if (this._stageTime.Get() >= this._waitTime) {
|
||
this._stage = 2;
|
||
this._stageTime.Reset();
|
||
this.Trigger(C3.Behaviors.Fade.Cnds.OnWaitEnd)
|
||
}
|
||
if (this._stage === 2)
|
||
if (this._fadeOutTime !== 0) {
|
||
wi.SetOpacity(this._maxOpacity - this._stageTime.Get() / this._fadeOutTime * this._maxOpacity);
|
||
this._runtime.UpdateRender();
|
||
if (wi.GetOpacity() <= 0) {
|
||
this._stage = 3;
|
||
this._stageTime.Reset();
|
||
this.Trigger(C3.Behaviors.Fade.Cnds.OnFadeOutEnd);
|
||
if (this._destroy)
|
||
this._runtime.DestroyInstance(this._inst)
|
||
}
|
||
}
|
||
}
|
||
Start() {
|
||
this._stage = 0;
|
||
this._stageTime.Reset();
|
||
if (this._fadeInTime === 0) {
|
||
this._stage = 1;
|
||
if (this._waitTime === 0)
|
||
this._stage = 2
|
||
} else {
|
||
this._inst.GetWorldInfo().SetOpacity(0);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
}
|
||
GetPropertyValueByIndex(index) {
|
||
switch (index) {
|
||
case FADE_IN_TIME:
|
||
return this._fadeInTime;
|
||
case WAIT_TIME:
|
||
return this._waitTime;
|
||
case FADE_OUT_TIME:
|
||
return this._fadeOutTime;
|
||
case DESTROY:
|
||
return this._destroy
|
||
}
|
||
}
|
||
SetPropertyValueByIndex(index, value) {
|
||
switch (index) {
|
||
case FADE_IN_TIME:
|
||
this._fadeInTime = value;
|
||
break;
|
||
case WAIT_TIME:
|
||
this._waitTime = value;
|
||
break;
|
||
case FADE_OUT_TIME:
|
||
this._fadeOutTime = value;
|
||
break;
|
||
case DESTROY:
|
||
this._destroy = !!value;
|
||
break
|
||
}
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "behaviors.fade";
|
||
return [{
|
||
title: "$" + this.GetBehaviorType().GetName(),
|
||
properties: [{
|
||
name: prefix + ".properties.fade-in-time.name",
|
||
value: this._fadeInTime,
|
||
onedit: v=>this._fadeInTime = v
|
||
}, {
|
||
name: prefix + ".properties.wait-time.name",
|
||
value: this._waitTime,
|
||
onedit: v=>this._waitTime = v
|
||
}, {
|
||
name: prefix + ".properties.fade-out-time.name",
|
||
value: this._fadeOutTime,
|
||
onedit: v=>this._fadeOutTime = v
|
||
}, {
|
||
name: prefix + ".debugger.stage",
|
||
value: [prefix + ".debugger." + ["fade-in", "wait", "fade-out", "done"][this._stage]]
|
||
}]
|
||
}]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Fade.Cnds = {
|
||
OnFadeOutEnd() {
|
||
return true
|
||
},
|
||
OnFadeInEnd() {
|
||
return true
|
||
},
|
||
OnWaitEnd() {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Fade.Acts = {
|
||
StartFade() {
|
||
if (!this._activeAtStart && !this._setMaxOpacity) {
|
||
this._maxOpacity = this._inst.GetWorldInfo().GetOpacity() || 1;
|
||
this._setMaxOpacity = true
|
||
}
|
||
if (this._stage === 3)
|
||
this.Start()
|
||
},
|
||
RestartFade() {
|
||
this.Start()
|
||
},
|
||
SetFadeInTime(t) {
|
||
if (t < 0)
|
||
t = 0;
|
||
this._fadeInTime = t
|
||
},
|
||
SetWaitTime(t) {
|
||
if (t < 0)
|
||
t = 0;
|
||
this._waitTime = t
|
||
},
|
||
SetFadeOutTime(t) {
|
||
if (t < 0)
|
||
t = 0;
|
||
this._fadeOutTime = t
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Fade.Exps = {
|
||
FadeInTime() {
|
||
return this._fadeInTime
|
||
},
|
||
WaitTime() {
|
||
return this._waitTime
|
||
},
|
||
FadeOutTime() {
|
||
return this._fadeOutTime
|
||
}
|
||
}
|
||
}
|
||
;"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gridviewbind = class aekiro_gridviewbindBehavior extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gridviewbind.Type = class aekiro_gridviewbindType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gridviewbind.Instance = class aekiro_bindInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
this.GetObjectInstance().GetUnsavedDataMap().aekiro_gridviewbind = this;
|
||
this.index = -1;
|
||
this.gridView = null;
|
||
this.value = 0;
|
||
}
|
||
setValue(value) {
|
||
this.value = value;
|
||
}
|
||
triggerOnGridViewRender() {
|
||
this.Trigger(C3.Behaviors.aekiro_gridviewbind.Cnds.OnGridViewRender);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {};
|
||
}
|
||
LoadFromJson(o) {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gridviewbind.Cnds = {
|
||
IsIndex(index) {
|
||
return (index == this.index);
|
||
},
|
||
OnGridViewRender() {
|
||
return true;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gridviewbind.Acts = {};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gridviewbind.Exps = {
|
||
index() {
|
||
return this.index;
|
||
},
|
||
get(key) {
|
||
var v = self["_"]["get"](this.value, key);
|
||
if (v == undefined) {
|
||
return "";
|
||
} else {
|
||
return v;
|
||
}
|
||
}
|
||
};
|
||
}
|
||
'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Pin = class PinBehavior extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Pin.Type = class PinType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Pin.Instance = class PinInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
this._pinInst = null;
|
||
this._pinUid = -1;
|
||
this._mode = "";
|
||
this._propSet = new Set;
|
||
this._pinDist = 0;
|
||
this._pinAngle = 0;
|
||
this._pinImagePoint = 0;
|
||
this._dx = 0;
|
||
this._dy = 0;
|
||
this._dWidth = 0;
|
||
this._dHeight = 0;
|
||
this._dAngle = 0;
|
||
this._dz = 0;
|
||
this._lastKnownAngle = 0;
|
||
this._destroy = false;
|
||
if (properties)
|
||
this._destroy = properties[0];
|
||
const rt = this._runtime.Dispatcher();
|
||
this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "instancedestroy", e=>this._OnInstanceDestroyed(e.instance)),C3.Disposable.From(rt, "afterload", e=>this._OnAfterLoad()))
|
||
}
|
||
Release() {
|
||
this._pinInst = null;
|
||
super.Release()
|
||
}
|
||
_SetPinInst(inst) {
|
||
if (inst) {
|
||
this._pinInst = inst;
|
||
this._StartTicking2()
|
||
} else {
|
||
this._pinInst = null;
|
||
this._StopTicking2()
|
||
}
|
||
}
|
||
_Pin(objectClass, mode, propList) {
|
||
if (!objectClass)
|
||
return;
|
||
const otherInst = objectClass.GetFirstPicked(this._inst);
|
||
if (!otherInst)
|
||
return;
|
||
this._mode = mode;
|
||
this._SetPinInst(otherInst);
|
||
const myWi = this._inst.GetWorldInfo();
|
||
const otherWi = otherInst.GetWorldInfo();
|
||
if (this._mode === "properties") {
|
||
const propSet = this._propSet;
|
||
propSet.clear();
|
||
for (const p of propList)
|
||
propSet.add(p);
|
||
this._dx = myWi.GetX() - otherWi.GetX();
|
||
this._dy = myWi.GetY() - otherWi.GetY();
|
||
this._dAngle = myWi.GetAngle() - otherWi.GetAngle();
|
||
this._lastKnownAngle = myWi.GetAngle();
|
||
this._dz = myWi.GetZElevation() - otherWi.GetZElevation();
|
||
if (propSet.has("x") && propSet.has("y")) {
|
||
this._pinAngle = C3.angleTo(otherWi.GetX(), otherWi.GetY(), myWi.GetX(), myWi.GetY()) - otherWi.GetAngle();
|
||
this._pinDist = C3.distanceTo(otherWi.GetX(), otherWi.GetY(), myWi.GetX(), myWi.GetY())
|
||
}
|
||
if (propSet.has("width-abs"))
|
||
this._dWidth = myWi.GetWidth() - otherWi.GetWidth();
|
||
else if (propSet.has("width-scale"))
|
||
this._dWidth = myWi.GetWidth() / otherWi.GetWidth();
|
||
if (propSet.has("height-abs"))
|
||
this._dHeight = myWi.GetHeight() - otherWi.GetHeight();
|
||
else if (propSet.has("height-scale"))
|
||
this._dHeight = myWi.GetHeight() / otherWi.GetHeight()
|
||
} else
|
||
this._pinDist = C3.distanceTo(otherWi.GetX(), otherWi.GetY(), myWi.GetX(), myWi.GetY())
|
||
}
|
||
SaveToJson() {
|
||
const propSet = this._propSet;
|
||
const mode = this._mode;
|
||
const ret = {
|
||
"uid": this._pinInst ? this._pinInst.GetUID() : -1,
|
||
"m": mode
|
||
};
|
||
if (mode === "rope" || mode === "bar")
|
||
ret["pd"] = this._pinDist;
|
||
else if (mode === "properties") {
|
||
ret["ps"] = [...this._propSet];
|
||
if (propSet.has("imagepoint"))
|
||
ret["ip"] = this._pinImagePoint;
|
||
else if (propSet.has("x") && propSet.has("y")) {
|
||
ret["pa"] = this._pinAngle;
|
||
ret["pd"] = this._pinDist
|
||
} else {
|
||
if (propSet.has("x"))
|
||
ret["dx"] = this._dx;
|
||
if (propSet.has("y"))
|
||
ret["dy"] = this._dy
|
||
}
|
||
if (propSet.has("angle")) {
|
||
ret["da"] = this._dAngle;
|
||
ret["lka"] = this._lastKnownAngle
|
||
}
|
||
if (propSet.has("width-abs") || propSet.has("width-scale"))
|
||
ret["dw"] = this._dWidth;
|
||
if (propSet.has("height-abs") || propSet.has("height-scale"))
|
||
ret["dh"] = this._dHeight;
|
||
if (propSet.has("z"))
|
||
ret["dz"] = this._dz
|
||
}
|
||
return ret
|
||
}
|
||
LoadFromJson(o) {
|
||
const mode = o["m"];
|
||
const propSet = this._propSet;
|
||
propSet.clear();
|
||
this._pinUid = o["uid"];
|
||
if (typeof mode === "number") {
|
||
this._LoadFromJson_Legacy(o);
|
||
return
|
||
}
|
||
this._mode = mode;
|
||
if (mode === "rope" || mode === "bar")
|
||
this._pinDist = o["pd"];
|
||
else if (mode === "properties") {
|
||
for (const p of o["ps"])
|
||
propSet.add(p);
|
||
if (propSet.has("imagepoint"))
|
||
this._pinImagePoint = o["ip"];
|
||
else if (propSet.has("x") && propSet.has("y")) {
|
||
this._pinAngle = o["pa"];
|
||
this._pinDist = o["pd"]
|
||
} else {
|
||
if (propSet.has("x"))
|
||
this._dx = o["dx"];
|
||
if (propSet.has("y"))
|
||
this._dy = o["dy"]
|
||
}
|
||
if (propSet.has("angle")) {
|
||
this._dAngle = o["da"];
|
||
this._lastKnownAngle = o["lka"] || 0
|
||
}
|
||
if (propSet.has("width-abs") || propSet.has("width-scale"))
|
||
this._dWidth = o["dw"];
|
||
if (propSet.has("height-abs") || propSet.has("height-scale"))
|
||
this._dHeight = o["dh"];
|
||
if (propSet.has("z"))
|
||
this._dz = o["dz"]
|
||
}
|
||
}
|
||
_LoadFromJson_Legacy(o) {
|
||
const propSet = this._propSet;
|
||
const myStartAngle = o["msa"];
|
||
const theirStartAngle = o["tsa"];
|
||
const pinAngle = o["pa"];
|
||
const pinDist = o["pd"];
|
||
const mode = o["m"];
|
||
switch (mode) {
|
||
case 0:
|
||
this._mode = "properties";
|
||
propSet.add("x").add("y").add("angle");
|
||
this._pinAngle = pinAngle;
|
||
this._pinDist = pinDist;
|
||
this._dAngle = myStartAngle - theirStartAngle;
|
||
this._lastKnownAngle = o["lka"];
|
||
break;
|
||
case 1:
|
||
this._mode = "properties";
|
||
propSet.add("x").add("y");
|
||
this._pinAngle = pinAngle;
|
||
this._pinDist = pinDist;
|
||
break;
|
||
case 2:
|
||
this._mode = "properties";
|
||
propSet.add("angle");
|
||
this._dAngle = myStartAngle - theirStartAngle;
|
||
this._lastKnownAngle = o["lka"];
|
||
break;
|
||
case 3:
|
||
this._mode = "rope";
|
||
this._pinDist = o["pd"];
|
||
break;
|
||
case 4:
|
||
this._mode = "bar";
|
||
this._pinDist = o["pd"];
|
||
break
|
||
}
|
||
}
|
||
_OnAfterLoad() {
|
||
if (this._pinUid === -1)
|
||
this._SetPinInst(null);
|
||
else {
|
||
this._SetPinInst(this._runtime.GetInstanceByUID(this._pinUid));
|
||
this._pinUid = -1
|
||
}
|
||
}
|
||
_OnInstanceDestroyed(inst) {
|
||
if (this._pinInst === inst) {
|
||
this._SetPinInst(null);
|
||
if (this._destroy)
|
||
this._runtime.DestroyInstance(this._inst)
|
||
}
|
||
}
|
||
Tick2() {
|
||
const pinInst = this._pinInst;
|
||
if (!pinInst)
|
||
return;
|
||
const pinWi = pinInst.GetWorldInfo();
|
||
const myInst = this._inst;
|
||
const myWi = myInst.GetWorldInfo();
|
||
const mode = this._mode;
|
||
let bboxChanged = false;
|
||
if (mode === "rope" || mode === "bar") {
|
||
const dist = C3.distanceTo(myWi.GetX(), myWi.GetY(), pinWi.GetX(), pinWi.GetY());
|
||
if (dist > this._pinDist || mode === "bar" && dist < this._pinDist) {
|
||
const a = C3.angleTo(pinWi.GetX(), pinWi.GetY(), myWi.GetX(), myWi.GetY());
|
||
myWi.SetXY(pinWi.GetX() + Math.cos(a) * this._pinDist, pinWi.GetY() + Math.sin(a) * this._pinDist);
|
||
bboxChanged = true
|
||
}
|
||
} else {
|
||
const propSet = this._propSet;
|
||
let v = 0;
|
||
if (propSet.has("imagepoint")) {
|
||
const [newX,newY] = pinInst.GetImagePoint(this._pinImagePoint);
|
||
if (!myWi.EqualsXY(newX, newY)) {
|
||
myWi.SetXY(newX, newY);
|
||
bboxChanged = true
|
||
}
|
||
} else if (propSet.has("x") && propSet.has("y")) {
|
||
const newX = pinWi.GetX() + Math.cos(pinWi.GetAngle() + this._pinAngle) * this._pinDist;
|
||
const newY = pinWi.GetY() + Math.sin(pinWi.GetAngle() + this._pinAngle) * this._pinDist;
|
||
if (!myWi.EqualsXY(newX, newY)) {
|
||
myWi.SetXY(newX, newY);
|
||
bboxChanged = true
|
||
}
|
||
} else {
|
||
v = pinWi.GetX() + this._dx;
|
||
if (propSet.has("x") && v !== myWi.GetX()) {
|
||
myWi.SetX(v);
|
||
bboxChanged = true
|
||
}
|
||
v = pinWi.GetY() + this._dy;
|
||
if (propSet.has("y") && v !== myWi.GetY()) {
|
||
myWi.SetY(v);
|
||
bboxChanged = true
|
||
}
|
||
}
|
||
if (propSet.has("angle")) {
|
||
if (this._lastKnownAngle !== myWi.GetAngle())
|
||
this._dAngle = C3.clampAngle(this._dAngle + (myWi.GetAngle() - this._lastKnownAngle));
|
||
v = C3.clampAngle(pinWi.GetAngle() + this._dAngle);
|
||
if (v !== myWi.GetAngle()) {
|
||
myWi.SetAngle(v);
|
||
bboxChanged = true
|
||
}
|
||
this._lastKnownAngle = myWi.GetAngle()
|
||
}
|
||
if (propSet.has("width-abs")) {
|
||
v = pinWi.GetWidth() + this._dWidth;
|
||
if (v !== myWi.GetWidth()) {
|
||
myWi.SetWidth(v);
|
||
bboxChanged = true
|
||
}
|
||
}
|
||
if (propSet.has("width-scale")) {
|
||
v = pinWi.GetWidth() * this._dWidth;
|
||
if (v !== myWi.GetWidth()) {
|
||
myWi.SetWidth(v);
|
||
bboxChanged = true
|
||
}
|
||
}
|
||
if (propSet.has("height-abs")) {
|
||
v = pinWi.GetHeight() + this._dHeight;
|
||
if (v !== myWi.GetHeight()) {
|
||
myWi.SetHeight(v);
|
||
bboxChanged = true
|
||
}
|
||
}
|
||
if (propSet.has("height-scale")) {
|
||
v = pinWi.GetHeight() * this._dHeight;
|
||
if (v !== myWi.GetHeight()) {
|
||
myWi.SetHeight(v);
|
||
bboxChanged = true
|
||
}
|
||
}
|
||
if (propSet.has("z")) {
|
||
v = pinWi.GetZElevation() + this._dz;
|
||
if (v !== myWi.GetZElevation()) {
|
||
myWi.SetZElevation(v);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
}
|
||
}
|
||
if (bboxChanged)
|
||
myWi.SetBboxChanged()
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "behaviors.pin.debugger";
|
||
return [{
|
||
title: "$" + this.GetBehaviorType().GetName(),
|
||
properties: [{
|
||
name: prefix + ".is-pinned",
|
||
value: !!this._pinInst
|
||
}, {
|
||
name: prefix + ".pinned-uid",
|
||
value: this._pinInst ? this._pinInst.GetUID() : 0
|
||
}]
|
||
}]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Pin.Cnds = {
|
||
IsPinned() {
|
||
return !!this._pinInst
|
||
},
|
||
WillDestroy() {
|
||
return this._destroy
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Pin.Acts = {
|
||
PinByDistance(objectClass, mode) {
|
||
this._Pin(objectClass, mode === 0 ? "rope" : "bar")
|
||
},
|
||
PinByProperties(objectClass, ex, ey, ea, ew, eh, ez) {
|
||
const propList = [];
|
||
if (ex)
|
||
propList.push("x");
|
||
if (ey)
|
||
propList.push("y");
|
||
if (ea)
|
||
propList.push("angle");
|
||
if (ez)
|
||
propList.push("z");
|
||
if (ew === 1)
|
||
propList.push("width-abs");
|
||
else if (ew === 2)
|
||
propList.push("width-scale");
|
||
if (eh === 1)
|
||
propList.push("height-abs");
|
||
else if (eh === 2)
|
||
propList.push("height-scale");
|
||
if (propList.length === 0)
|
||
return;
|
||
this._Pin(objectClass, "properties", propList)
|
||
},
|
||
PinByImagePoint(objectClass, imgPt, ea, ew, eh, ez) {
|
||
const propList = ["imagepoint"];
|
||
if (ea)
|
||
propList.push("angle");
|
||
if (ez)
|
||
propList.push("z");
|
||
if (ew === 1)
|
||
propList.push("width-abs");
|
||
else if (ew === 2)
|
||
propList.push("width-scale");
|
||
if (eh === 1)
|
||
propList.push("height-abs");
|
||
else if (eh === 2)
|
||
propList.push("height-scale");
|
||
this._pinImagePoint = imgPt;
|
||
this._Pin(objectClass, "properties", propList)
|
||
},
|
||
SetPinDistance(d) {
|
||
if (this._mode === "rope" || this._mode === "bar")
|
||
this._pinDist = Math.max(d, 0)
|
||
},
|
||
SetDestroy(d) {
|
||
this._destroy = d
|
||
},
|
||
Unpin() {
|
||
this._SetPinInst(null);
|
||
this._mode = "";
|
||
this._propSet.clear();
|
||
this._pinImagePoint = ""
|
||
},
|
||
Pin(objectClass, mode) {
|
||
switch (mode) {
|
||
case 0:
|
||
this._Pin(objectClass, "properties", ["x", "y", "angle"]);
|
||
break;
|
||
case 1:
|
||
this._Pin(objectClass, "properties", ["x", "y"]);
|
||
break;
|
||
case 2:
|
||
this._Pin(objectClass, "properties", ["angle"]);
|
||
break;
|
||
case 3:
|
||
this._Pin(objectClass, "rope");
|
||
break;
|
||
case 4:
|
||
this._Pin(objectClass, "bar");
|
||
break
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Pin.Exps = {
|
||
PinnedUID() {
|
||
return this._pinInst ? this._pinInst.GetUID() : -1
|
||
}
|
||
}
|
||
}
|
||
;"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_button = class aekiro_buttonBehavior extends C3.SDKBehaviorBase {
|
||
constructor(a) {
|
||
super(a);
|
||
const b = this._runtime.Dispatcher();
|
||
this._disposables = new C3.CompositeDisposable(C3.Disposable.From(b, "pointerdown", (a)=>this._OnPointerDown(a.data)),C3.Disposable.From(b, "pointermove", (a)=>this._OnPointerMove(a.data)),C3.Disposable.From(b, "pointerup", (a)=>this._OnPointerUp(a.data, !1)),C3.Disposable.From(b, "pointercancel", (a)=>this._OnPointerUp(a.data, !0)))
|
||
}
|
||
Release() {
|
||
this._disposables.Release(),
|
||
this._disposables = null,
|
||
super.Release();
|
||
}
|
||
_OnPointerDown(a) {
|
||
this._OnInputDown(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
_OnPointerMove(a) {
|
||
this._OnInputMove(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
_OnPointerUp(a) {
|
||
this._OnInputUp(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
async _OnInputDown(source, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_button);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnAnyInputDown)
|
||
await beh.OnAnyInputDown(x, y, source);
|
||
}
|
||
}
|
||
_OnInputMove(source, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_button);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnAnyInputMove)
|
||
beh.OnAnyInputMove(x, y, source);
|
||
}
|
||
}
|
||
async _OnInputUp(a, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_button);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnAnyInputUp)
|
||
await beh.OnAnyInputUp(x, y);
|
||
}
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_button.Type = class aekiro_buttonType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_button.Instance = class aekiro_buttonInstance extends Aekiro.button {
|
||
constructor(behInst, properties) {
|
||
super(behInst, properties);
|
||
this.isEnabled = properties[0];
|
||
this.frame_normal = properties[1];
|
||
this.frame_hover = properties[2];
|
||
this.frame_clicked = properties[3];
|
||
this.frame_disabled = properties[4];
|
||
this.frame_focus = properties[5];
|
||
this.clickSound = properties[6];
|
||
this.hoverSound = properties[7];
|
||
this.focusSound = properties[8];
|
||
this.clickAnimation = properties[9];
|
||
this.hoverAnimation = properties[10];
|
||
this.focusAnimation = properties[11];
|
||
this.color_normal = properties[12];
|
||
this.color_hover = properties[13];
|
||
this.color_clicked = properties[14];
|
||
this.color_disabled = properties[15];
|
||
this.color_focus = properties[16];
|
||
this.clickAnimationFactor = properties[17];
|
||
this.hoverAnimationFactor = properties[18];
|
||
this.focusAnimationFactor = properties[19];
|
||
this.ignoreInput = properties[20];
|
||
this.button_constructor();
|
||
}
|
||
OnAnyInputUpC() {
|
||
this.Trigger(C3.Behaviors.aekiro_button.Cnds.OnClicked);
|
||
this.proui.Trigger(C3.Plugins.aekiro_proui.Cnds.OnAnyButtonClicked);
|
||
}
|
||
OnMouseEnterC() {
|
||
this.Trigger(C3.Behaviors.aekiro_button.Cnds.OnMouseEnter);
|
||
}
|
||
OnMouseLeaveC() {
|
||
this.Trigger(C3.Behaviors.aekiro_button.Cnds.OnMouseLeave);
|
||
}
|
||
OnFocusedC() {
|
||
this.Trigger(C3.Behaviors.aekiro_button.Cnds.OnFocused);
|
||
}
|
||
OnUnFocusedC() {
|
||
this.Trigger(C3.Behaviors.aekiro_button.Cnds.OnUnFocused);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"isEnabled": this.isEnabled,
|
||
"frame_normal": this.frame_normal,
|
||
"frame_hover": this.frame_hover,
|
||
"frame_clicked": this.frame_clicked,
|
||
"frame_disabled": this.frame_disabled,
|
||
"frame_focus": this.frame_focus,
|
||
"clickSound": this.clickSound,
|
||
"hoverSound": this.hoverSound,
|
||
"focusSound": this.focusSound,
|
||
"clickAnimation": this.clickAnimation,
|
||
"hoverAnimation": this.hoverAnimation,
|
||
"focusAnimation": this.focusAnimation,
|
||
"color_normal": this.color_normal,
|
||
"color_hover": this.color_hover,
|
||
"color_clicked": this.color_clicked,
|
||
"color_disabled": this.color_disabled,
|
||
"color_focus": this.color_focus,
|
||
"ignoreInput": this.ignoreInput,
|
||
"initProps": this.initProps
|
||
};
|
||
}
|
||
LoadFromJson(o) {
|
||
this.isEnabled = o["isEnabled"];
|
||
this.frame_normal = o["frame_normal"];
|
||
this.frame_hover = o["frame_hover"];
|
||
this.frame_clicked = o["frame_clicked"];
|
||
this.frame_disabled = o["frame_disabled"];
|
||
this.frame_focus = o["frame_focus"];
|
||
this.clickSound = o["clickSound"];
|
||
this.hoverSound = o["hoverSound"];
|
||
this.focusSound = o["focusSound"];
|
||
this.clickAnimation = o["clickAnimation"];
|
||
this.hoverAnimation = o["hoverAnimation"];
|
||
this.focusAnimation = o["focusAnimation"];
|
||
this.color_normal = o["color_normal"];
|
||
this.color_hover = o["color_hover"];
|
||
this.color_clicked = o["color_clicked"];
|
||
this.color_disabled = o["color_disabled"];
|
||
this.color_focus = o["color_focus"];
|
||
this.ignoreInput = o["ignoreInput"];
|
||
this.initProps = o["initProps"];
|
||
this.onInitPropsLoaded();
|
||
this.onPropsLoaded();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_button.Cnds = {};
|
||
Object.assign(C3.Behaviors.aekiro_button.Cnds, Aekiro.button.Cnds);
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_button.Acts = {};
|
||
Object.assign(C3.Behaviors.aekiro_button.Acts, Aekiro.button.Acts);
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_button.Exps = {};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_checkbox = class aekiro_checkboxBehavior extends C3.SDKBehaviorBase {
|
||
constructor(a) {
|
||
super(a);
|
||
const b = this._runtime.Dispatcher();
|
||
this._disposables = new C3.CompositeDisposable(C3.Disposable.From(b, "pointerdown", (a)=>this._OnPointerDown(a.data)),C3.Disposable.From(b, "pointermove", (a)=>this._OnPointerMove(a.data)),C3.Disposable.From(b, "pointerup", (a)=>this._OnPointerUp(a.data, !1)),C3.Disposable.From(b, "pointercancel", (a)=>this._OnPointerUp(a.data, !0)))
|
||
}
|
||
Release() {
|
||
this._disposables.Release(),
|
||
this._disposables = null,
|
||
super.Release()
|
||
}
|
||
_OnPointerDown(a) {
|
||
this._OnInputDown(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
_OnPointerMove(a) {
|
||
this._OnInputMove(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
_OnPointerUp(a) {
|
||
this._OnInputUp(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
async _OnInputDown(source, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_checkbox);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnAnyInputDown)
|
||
await beh.OnAnyInputDown(x, y, source);
|
||
}
|
||
}
|
||
_OnInputMove(source, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_checkbox);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnAnyInputMove)
|
||
beh.OnAnyInputMove(x, y, source);
|
||
}
|
||
}
|
||
async _OnInputUp(a, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_checkbox);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnAnyInputUp)
|
||
await beh.OnAnyInputUp(x, y);
|
||
}
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_checkbox.Type = class aekiro_checkboxType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_checkbox.Instance = class aekiro_checkboxInstance extends Aekiro.checkbox {
|
||
constructor(behInst, properties) {
|
||
super(behInst, properties);
|
||
this.isEnabled = properties[0];
|
||
this.value = properties[1];
|
||
this.frame_normal = properties[2];
|
||
this.frame_hover = properties[3];
|
||
this.frame_disabled = properties[4];
|
||
this.frame_focus = properties[5];
|
||
this.clickSound = properties[6];
|
||
this.hoverSound = properties[7];
|
||
this.focusSound = properties[8];
|
||
this.clickAnimation = properties[9];
|
||
this.hoverAnimation = properties[10];
|
||
this.focusAnimation = properties[11];
|
||
this.color_normal = properties[12];
|
||
this.color_hover = properties[13];
|
||
this.color_clicked = properties[14];
|
||
this.color_disabled = properties[15];
|
||
this.color_focus = properties[16];
|
||
this.clickAnimationFactor = properties[17];
|
||
this.hoverAnimationFactor = properties[18];
|
||
this.focusAnimationFactor = properties[19];
|
||
this.ignoreInput = properties[20];
|
||
this.checkbox_constructor();
|
||
}
|
||
OnAnyInputUpC() {
|
||
this.setValue(1 - this.value);
|
||
this.Trigger(C3.Behaviors.aekiro_checkbox.Cnds.OnClicked);
|
||
}
|
||
OnMouseEnterC() {
|
||
this.Trigger(C3.Behaviors.aekiro_checkbox.Cnds.OnMouseEnter);
|
||
}
|
||
OnMouseLeaveC() {
|
||
this.Trigger(C3.Behaviors.aekiro_checkbox.Cnds.OnMouseLeave);
|
||
}
|
||
OnFocusedC() {
|
||
this.Trigger(C3.Behaviors.aekiro_checkbox.Cnds.OnFocused);
|
||
}
|
||
OnUnFocusedC() {
|
||
this.Trigger(C3.Behaviors.aekiro_checkbox.Cnds.OnUnFocused);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"isEnabled": this.isEnabled,
|
||
"value": this.value,
|
||
"frame_normal": this.frame_normal,
|
||
"frame_hover": this.frame_hover,
|
||
"frame_disabled": this.frame_disabled,
|
||
"frame_focus": this.frame_focus,
|
||
"clickSound": this.clickSound,
|
||
"hoverSound": this.hoverSound,
|
||
"focusSound": this.focusSound,
|
||
"clickAnimation": this.clickAnimation,
|
||
"hoverAnimation": this.hoverAnimation,
|
||
"focusAnimation": this.focusAnimation,
|
||
"color_normal": this.color_normal,
|
||
"color_hover": this.color_hover,
|
||
"color_clicked": this.color_clicked,
|
||
"color_disabled": this.color_disabled,
|
||
"color_focus": this.color_focus,
|
||
"ignoreInput": this.ignoreInput,
|
||
"initProps": this.initProps
|
||
};
|
||
}
|
||
LoadFromJson(o) {
|
||
this.isEnabled = o["isEnabled"];
|
||
this.value = o["value"];
|
||
this.frame_normal = o["frame_normal"];
|
||
this.frame_hover = o["frame_hover"];
|
||
this.frame_disabled = o["frame_disabled"];
|
||
this.frame_focus = o["frame_focus"];
|
||
this.clickSound = o["clickSound"];
|
||
this.hoverSound = o["hoverSound"];
|
||
this.focusSound = o["focusSound"];
|
||
this.clickAnimation = o["clickAnimation"];
|
||
this.hoverAnimation = o["hoverAnimation"];
|
||
this.focusAnimation = o["focusAnimation"];
|
||
this.color_normal = o["color_normal"];
|
||
this.color_hover = o["color_hover"];
|
||
this.color_clicked = o["color_clicked"];
|
||
this.color_disabled = o["color_disabled"];
|
||
this.color_focus = o["color_focus"];
|
||
this.ignoreInput = o["ignoreInput"];
|
||
this.initProps = o["initProps"];
|
||
this.onInitPropsLoaded();
|
||
this.onPropsLoaded();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_checkbox.Cnds = {
|
||
IsChecked() {
|
||
return this.value;
|
||
}
|
||
};
|
||
Object.assign(C3.Behaviors.aekiro_checkbox.Cnds, Aekiro.button.Cnds);
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_checkbox.Acts = {
|
||
setValue(value) {
|
||
this.setValue(value);
|
||
},
|
||
SetIgnoreInput(s) {
|
||
this.setIgnoreInput(s);
|
||
},
|
||
SetClickSoundVolume(v) {
|
||
this.audioSources.click.setVolume(v);
|
||
},
|
||
SetHoverSoundVolume(v) {
|
||
this.audioSources.hover.setVolume(v);
|
||
}
|
||
};
|
||
Object.assign(C3.Behaviors.aekiro_checkbox.Acts, Aekiro.button.Acts);
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_checkbox.Exps = {
|
||
value() {
|
||
return this.value;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_radiobutton = class aekiro_radiobuttonBehavior extends C3.SDKBehaviorBase {
|
||
constructor(a) {
|
||
super(a);
|
||
const b = this._runtime.Dispatcher();
|
||
this._disposables = new C3.CompositeDisposable(C3.Disposable.From(b, "pointerdown", (a)=>this._OnPointerDown(a.data)),C3.Disposable.From(b, "pointermove", (a)=>this._OnPointerMove(a.data)),C3.Disposable.From(b, "pointerup", (a)=>this._OnPointerUp(a.data, !1)),C3.Disposable.From(b, "pointercancel", (a)=>this._OnPointerUp(a.data, !0)));
|
||
}
|
||
Release() {
|
||
this._disposables.Release(),
|
||
this._disposables = null,
|
||
super.Release()
|
||
}
|
||
_OnPointerDown(a) {
|
||
this._OnInputDown(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
_OnPointerMove(a) {
|
||
this._OnInputMove(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
_OnPointerUp(a) {
|
||
this._OnInputUp(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
async _OnInputDown(source, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_radiobutton);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnAnyInputDown)
|
||
await beh.OnAnyInputDown(x, y, source);
|
||
}
|
||
}
|
||
_OnInputMove(source, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_radiobutton);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnAnyInputMove)
|
||
beh.OnAnyInputMove(x, y, source);
|
||
}
|
||
}
|
||
async _OnInputUp(a, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_radiobutton);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnAnyInputUp)
|
||
await beh.OnAnyInputUp(x, y);
|
||
}
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_radiobutton.Type = class aekiro_radiobuttonType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_radiobutton.Instance = class aekiro_radiobuttonInstance extends globalThis.Aekiro.checkbox {
|
||
constructor(behInst, properties) {
|
||
super(behInst, properties);
|
||
this.isEnabled = properties[0];
|
||
this.name = properties[1];
|
||
this.frame_normal = properties[2];
|
||
this.frame_hover = properties[3];
|
||
this.frame_disabled = properties[4];
|
||
this.frame_focus = properties[5];
|
||
this.clickSound = properties[6];
|
||
this.hoverSound = properties[7];
|
||
this.focusSound = properties[8];
|
||
this.clickAnimation = properties[9];
|
||
this.hoverAnimation = properties[10];
|
||
this.focusAnimation = properties[11];
|
||
this.color_normal = properties[12];
|
||
this.color_hover = properties[13];
|
||
this.color_clicked = properties[14];
|
||
this.color_disabled = properties[15];
|
||
this.color_focus = properties[16];
|
||
this.clickAnimationFactor = properties[17];
|
||
this.hoverAnimationFactor = properties[18];
|
||
this.focusAnimationFactor = properties[19];
|
||
this.ignoreInput = properties[17];
|
||
this.GetObjectInstance().GetUnsavedDataMap().aekiro_radiobutton = this;
|
||
this.checkbox_constructor();
|
||
}
|
||
init() {
|
||
if (!this.aekiro_gameobject) {
|
||
return;
|
||
}
|
||
this.radioGroup = this.aekiro_gameobject.parent_get();
|
||
if (!this.radioGroup) {
|
||
console.error("ProUI-Radiobutton uid=%s: Radiogroup not found.", this.inst.GetUID());
|
||
return;
|
||
}
|
||
if (!this.radioGroup.GetUnsavedDataMap().aekiro_radiogroup) {
|
||
console.error("ProUI-Radiobutton uid=%s: Radiogroup needs to have a Radiogroup behavior.", this.inst.GetUID());
|
||
return;
|
||
}
|
||
this.radioGroup = this.radioGroup.GetUnsavedDataMap().aekiro_radiogroup;
|
||
}
|
||
GetRadioGroup() {
|
||
var p = this.aekiro_gameobject.parent_get();
|
||
if (p) {
|
||
return p.GetUnsavedDataMap().aekiro_radiogroup;
|
||
}
|
||
return null;
|
||
}
|
||
setEnabled(isEnabled) {
|
||
super.setEnabled(isEnabled);
|
||
var radioGroup = this.GetRadioGroup();
|
||
if (isEnabled && radioGroup) {
|
||
radioGroup.isEnabled = isEnabled;
|
||
}
|
||
}
|
||
OnAnyInputUpC() {
|
||
var radioGroup = this.GetRadioGroup();
|
||
if (radioGroup) {
|
||
radioGroup.setValue(this.name);
|
||
}
|
||
this.Trigger(C3.Behaviors.aekiro_radiobutton.Cnds.OnClicked);
|
||
}
|
||
OnMouseEnterC() {
|
||
this.Trigger(C3.Behaviors.aekiro_radiobutton.Cnds.OnMouseEnter);
|
||
}
|
||
OnMouseLeaveC() {
|
||
this.Trigger(C3.Behaviors.aekiro_radiobutton.Cnds.OnMouseLeave);
|
||
}
|
||
OnFocusedC() {
|
||
this.Trigger(C3.Behaviors.aekiro_radiobutton.Cnds.OnFocused);
|
||
}
|
||
OnUnFocusedC() {
|
||
this.Trigger(C3.Behaviors.aekiro_radiobutton.Cnds.OnUnFocused);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"isEnabled": this.isEnabled,
|
||
"name": this.name,
|
||
"frame_normal": this.frame_normal,
|
||
"frame_hover": this.frame_hover,
|
||
"frame_disabled": this.frame_disabled,
|
||
"frame_focus": this.frame_focus,
|
||
"clickSound": this.clickSound,
|
||
"hoverSound": this.hoverSound,
|
||
"focusSound": this.focusSound,
|
||
"clickAnimation": this.clickAnimation,
|
||
"hoverAnimation": this.hoverAnimation,
|
||
"focusAnimation": this.focusAnimation,
|
||
"color_normal": this.color_normal,
|
||
"color_hover": this.color_hover,
|
||
"color_clicked": this.color_clicked,
|
||
"color_disabled": this.color_disabled,
|
||
"color_focus": this.color_focus,
|
||
"ignoreInput": this.ignoreInput,
|
||
"initProps": this.initProps
|
||
};
|
||
}
|
||
LoadFromJson(o) {
|
||
this.isEnabled = o["isEnabled"];
|
||
this.name = o["name"];
|
||
this.frame_normal = o["frame_normal"];
|
||
this.frame_hover = o["frame_hover"];
|
||
this.frame_disabled = o["frame_disabled"];
|
||
this.frame_focus = o["frame_focus"];
|
||
this.clickSound = o["clickSound"];
|
||
this.hoverSound = o["hoverSound"];
|
||
this.focusSound = o["focusSound"];
|
||
this.clickAnimation = o["clickAnimation"];
|
||
this.hoverAnimation = o["hoverAnimation"];
|
||
this.focusAnimation = o["focusAnimation"];
|
||
this.color_normal = o["color_normal"];
|
||
this.color_hover = o["color_hover"];
|
||
this.color_clicked = o["color_clicked"];
|
||
this.color_disabled = o["color_disabled"];
|
||
this.color_focus = o["color_focus"];
|
||
this.ignoreInput = o["ignoreInput"];
|
||
this.initProps = o["initProps"];
|
||
this.onInitPropsLoaded();
|
||
this.onPropsLoaded();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_radiobutton.Cnds = {};
|
||
Object.assign(C3.Behaviors.aekiro_radiobutton.Cnds, globalThis.Aekiro.button.Cnds);
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_radiobutton.Acts = {
|
||
SetIgnoreInput(s) {
|
||
this.setIgnoreInput(s);
|
||
},
|
||
SetClickSoundVolume(v) {
|
||
this.audioSources.click.setVolume(v);
|
||
},
|
||
SetHoverSoundVolume(v) {
|
||
this.audioSources.hover.setVolume(v);
|
||
},
|
||
SetName(v) {
|
||
this.name = v;
|
||
}
|
||
};
|
||
Object.assign(C3.Behaviors.aekiro_radiobutton.Acts, globalThis.Aekiro.button.Acts);
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_radiobutton.Exps = {
|
||
name() {
|
||
return this.name;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_progress = class aekiro_progressBehavior extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_progress.Type = class aekiro_progressType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
var Tween = globalThis["TWEEN"];
|
||
C3.Behaviors.aekiro_progress.Instance = class aekiro_progressInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
if (properties) {
|
||
this.maxValue = properties[0];
|
||
this.value = C3.clamp(properties[1], 0, this.maxValue);
|
||
this.animation = properties[2];
|
||
}
|
||
this.inst = this.GetObjectInstance();
|
||
this.wi = this.GetWorldInfo();
|
||
this.goManager = globalThis.aekiro_goManager;
|
||
this.aekiro_dialogManager = globalThis.aekiro_dialogManager;
|
||
this.goManager.eventManager.on("childrenRegistred", ()=>this.init(), {
|
||
"once": true
|
||
});
|
||
}
|
||
PostCreate() {
|
||
this.aekiro_gameobject = this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject;
|
||
if (this.aekiro_gameobject) {
|
||
this.aekiro_gameobject.eventManager.on("cloned", ()=>this.init(), {
|
||
"once": true
|
||
});
|
||
}
|
||
}
|
||
init() {
|
||
var wi = this.wi;
|
||
this.initWidth = wi.GetWidth();
|
||
this.transf = {
|
||
width: wi.GetWidth()
|
||
};
|
||
this.tween = new Tween["Tween"](this.transf);
|
||
if (this.animation == 1) {
|
||
this.tween["easing"](Tween["Easing"]["Linear"]["None"]);
|
||
} else if (this.animation == 2) {
|
||
this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"]);
|
||
}
|
||
this.updateView();
|
||
}
|
||
onInitPropsLoaded() {
|
||
var wi = this.wi;
|
||
wi.SetWidth(this.initWidth, true);
|
||
}
|
||
isValueValid(value) {
|
||
if (value == null || isNaN(value) || value === "") {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
setMaxValue(v) {
|
||
this.maxValue = v;
|
||
this.value = C3.clamp(this.value, 0, this.maxValue);
|
||
this.updateView();
|
||
}
|
||
setValue(value) {
|
||
if (!this.isValueValid(value)) {
|
||
return false;
|
||
}
|
||
value = C3.clamp(value, 0, this.maxValue);
|
||
if (this.value != value) {
|
||
this.value = value;
|
||
this.updateView();
|
||
}
|
||
}
|
||
updateView() {
|
||
var targetProp = 0;
|
||
var progress = this.value / this.maxValue;
|
||
targetProp = progress * this.initWidth;
|
||
if (this.animation) {
|
||
var wi = this.wi;
|
||
this.transf.width = wi.GetWidth();
|
||
this.tween["to"]({
|
||
width: targetProp
|
||
}, 500)["start"]();
|
||
this._StartTicking();
|
||
this.tween["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
} else {
|
||
this.wi.SetWidth(targetProp, true);
|
||
this.wi.SetBboxChanged();
|
||
if (this.tween["isPlaying"]) {
|
||
this.tween["stop"]();
|
||
this.isTweenPlaying = false;
|
||
}
|
||
}
|
||
}
|
||
Tick() {
|
||
if (this.isTweenPlaying) {
|
||
this.isTweenPlaying = false;
|
||
}
|
||
if (this.tween["isPlaying"]) {
|
||
this.tween["update"](this.GetRuntime().GetWallTime() * 1000);
|
||
this.isTweenPlaying = true;
|
||
}
|
||
if (this.isTweenPlaying) {
|
||
this.wi.SetWidth(this.transf.width, true);
|
||
this.wi.SetBboxChanged();
|
||
} else {
|
||
this._StopTicking();
|
||
}
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"maxValue": this.maxValue,
|
||
"value": this.value,
|
||
"animation": this.animation,
|
||
"initWidth": this.initWidth
|
||
}
|
||
}
|
||
LoadFromJson(o) {
|
||
this.maxValue = o["maxValue"];
|
||
this.value = o["value"];
|
||
this.animation = o["animation"];
|
||
this.initWidth = o["initWidth"];
|
||
this.onInitPropsLoaded();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_progress.Cnds = {};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_progress.Acts = {
|
||
setValue(value, animation) {
|
||
this.animation = animation;
|
||
this.setValue(value);
|
||
},
|
||
SetMaxValue(v) {
|
||
this.setMaxValue(v);
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_progress.Exps = {
|
||
value() {
|
||
return this.value;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.mcube_rexspline = class MCRexSpline extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.mcube_rexspline.Type = class MCRexSplineType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.mcube_rexspline.Instance = class MCRexSplineInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
this._myProperty = 0;
|
||
if (properties) {
|
||
this._myProperty = properties[0];
|
||
this.enabled = (properties[0] === 1);
|
||
this.speed = properties[1];
|
||
this.setAngle = (properties[2] !== 0);
|
||
this.isLooping = (properties[3] === 1);
|
||
this.tension = properties[4];
|
||
}
|
||
if (!this.recycled) {
|
||
this.points = [];
|
||
this.curSeg = {
|
||
ptr: -1,
|
||
t: 1,
|
||
p0: null,
|
||
p1: null,
|
||
p2: null,
|
||
p3: null,
|
||
dist: 0,
|
||
preX: 0,
|
||
preY: 0
|
||
};
|
||
}
|
||
this.traveledDist = 0;
|
||
this.movingAngle = 0;
|
||
this.is_moving = false;
|
||
this.is_my_call = false;
|
||
this.lastTick = null;
|
||
this.LASTU;
|
||
this.LASTUU;
|
||
this.LASTUUU;
|
||
this.wi = this._inst.GetWorldInfo();
|
||
this._StartTicking();
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {};
|
||
}
|
||
LoadFromJson(o) {}
|
||
Tick() {
|
||
if (!this.enabled || !this.is_moving) {
|
||
return;
|
||
} else {
|
||
const dt = this._runtime.GetDt(this._inst);
|
||
this.move(dt);
|
||
}
|
||
}
|
||
move(dt) {
|
||
if (dt == null)
|
||
dt = this._runtime.GetDt(this._inst);
|
||
if ((dt === 0) || (this.speed == 0))
|
||
return;
|
||
var tickMovingDist = this.speed * dt;
|
||
var tMD2 = tickMovingDist * tickMovingDist;
|
||
var sTickMovingDist = tickMovingDist / 20;
|
||
var segDist = null, t;
|
||
var x0 = this.wi._x
|
||
, y0 = this.wi._y;
|
||
var seg, nx, ny, dist, dist2, i = 0;
|
||
var preX, preY, preDist2, preSegT;
|
||
while (1) {
|
||
seg = this.getSeg();
|
||
if (seg == null)
|
||
break;
|
||
if (seg.dist === 0)
|
||
continue;
|
||
if (segDist !== seg.dist) {
|
||
segDist = seg.dist
|
||
t = (sTickMovingDist / segDist);
|
||
if (t > 0.5)
|
||
t = 0.5;
|
||
}
|
||
seg.t += t;
|
||
i++;
|
||
if (seg.t >= 1) {
|
||
seg.t = 1;
|
||
nx = seg.p2[0];
|
||
ny = seg.p2[1];
|
||
} else {
|
||
nx = this.interpolate(seg, 0, this.tension);
|
||
ny = this.interpolate(seg, 1, this.tension);
|
||
}
|
||
dist2 = this.distance2(x0, y0, nx, ny);
|
||
if (dist2 >= tMD2) {
|
||
if (Math.abs(preDist2 - tMD2) < Math.abs(dist2 - tMD2)) {
|
||
nx = preX;
|
||
ny = preY;
|
||
dist2 = preDist2;
|
||
seg.t = preSegT;
|
||
}
|
||
dist = Math.sqrt(dist2);
|
||
this.traveledDist += dist;
|
||
this.wi.SetX(nx);
|
||
this.wi.SetY(ny);
|
||
break;
|
||
} else {
|
||
preX = nx;
|
||
preY = ny;
|
||
preDist2 = dist2;
|
||
preSegT = (seg.t === 1) ? 0 : seg.t;
|
||
}
|
||
}
|
||
if ((x0 === this.wi._x) && (y0 === this.wi._y)) {} else {
|
||
this.movingAngle = C3.angleTo(x0, y0, this.wi._x, this.wi._y);
|
||
}
|
||
if (this.setAngle) {
|
||
if (this.is_moving) {
|
||
this.wi.SetAngle(this.movingAngle);
|
||
}
|
||
}
|
||
if (this.speed !== 0) {
|
||
this.wi.SetBboxChanged();
|
||
if (seg == null) {
|
||
this.onReachLastPoint();
|
||
} else {
|
||
seg.preX = nx;
|
||
seg.preY = ny;
|
||
}
|
||
}
|
||
}
|
||
start() {
|
||
this.curSeg.ptr = -1;
|
||
this.curSeg.t = 1;
|
||
this.traveledDist = 0;
|
||
this.is_moving = true;
|
||
var seg = this.getSeg();
|
||
if (seg === null)
|
||
this.onReachLastPoint();
|
||
}
|
||
onReachLastPoint() {
|
||
if (!this.is_moving)
|
||
return;
|
||
this.is_moving = false;
|
||
this.is_my_call = true;
|
||
this.Trigger(C3.Behaviors.mcube_rexspline.Cnds.OnHitTarget, this.wi);
|
||
this.is_my_call = false;
|
||
}
|
||
hitPoint() {
|
||
this.is_my_call = true;
|
||
this.Trigger(C3.Behaviors.mcube_rexspline.Cnds.OnHitAnyPoint, this.wi);
|
||
this.is_my_call = false;
|
||
}
|
||
wrapIndex(idx) {
|
||
if (this.isLooping) {
|
||
var cnt = this.points.length;
|
||
idx = idx % cnt;
|
||
if (idx < 0)
|
||
idx = cnt + idx;
|
||
}
|
||
return idx;
|
||
}
|
||
getSeg() {
|
||
if (this.curSeg.t === 1) {
|
||
this.curSeg.ptr = this.wrapIndex(this.curSeg.ptr + 1);
|
||
var ptr1 = this.curSeg.ptr;
|
||
var ptr2 = this.wrapIndex(ptr1 + 1);
|
||
if (ptr2 >= this.points.length)
|
||
return null;
|
||
var ptr0 = this.wrapIndex(ptr1 - 1);
|
||
var ptr3 = this.wrapIndex(ptr2 + 1);
|
||
this.curSeg.p0 = this.points[ptr0];
|
||
this.curSeg.p1 = this.points[ptr1];
|
||
this.curSeg.p2 = this.points[ptr2];
|
||
this.curSeg.p3 = this.points[ptr3];
|
||
this.curSeg.dist = C3.distanceTo(this.curSeg.p1[0], this.curSeg.p1[1], this.curSeg.p2[0], this.curSeg.p2[1]);
|
||
this.curSeg.t = 0;
|
||
this.curSeg.preX = this.curSeg.p1[0];
|
||
this.curSeg.preY = this.curSeg.p1[1];
|
||
this.hitPoint();
|
||
}
|
||
return this.curSeg;
|
||
}
|
||
interpolate(seg, i, tension) {
|
||
var p1 = seg.p1[i];
|
||
var p2 = seg.p2[i];
|
||
var t = seg.t;
|
||
var p0 = (seg.p0) ? seg.p0[i] : p1 + (p1 - p2);
|
||
var p3 = (seg.p3) ? seg.p3[i] : p2 + (p2 - p1);
|
||
var u, uu, uuu;
|
||
if (t === this.LASTU) {
|
||
u = this.LASTU;
|
||
uu = this.LASTUU;
|
||
uuu = this.LASTUUU;
|
||
} else {
|
||
this.LASTU = u = t;
|
||
this.LASTUU = uu = u * u;
|
||
this.LASTUUU = uuu = uu * u;
|
||
}
|
||
return (-tension * u + 2 * tension * uu - tension * uuu) * p0 + (+1 + (tension - 3) * uu + (2 - tension) * uuu) * p1 + (+tension * u + (3 - 2 * tension) * uu + (tension - 2) * uuu) * p2 + (-tension * uu + tension * uuu) * p3;
|
||
}
|
||
din(d, default_value) {
|
||
var o;
|
||
if (d === true)
|
||
o = 1;
|
||
else if (d === false)
|
||
o = 0;
|
||
else if (d == null) {
|
||
if (default_value != null)
|
||
o = default_value;
|
||
else
|
||
o = 0;
|
||
} else if (typeof (d) == "object")
|
||
o = JSON.stringify(d);
|
||
else
|
||
o = d;
|
||
return o;
|
||
}
|
||
distance2(x0, y0, x1, y1) {
|
||
var dx = (x1 - x0);
|
||
var dy = (y1 - y0);
|
||
return dx * dx + dy * dy;
|
||
}
|
||
isTickChanged() {
|
||
var curTick = this._runtime.GetTickCount();
|
||
var tickChanged = (this.lastTick != curTick);
|
||
this.lastTick = curTick;
|
||
return tickChanged;
|
||
}
|
||
getMovingAngle(ret) {
|
||
if (this.isTickChanged()) {
|
||
return to_clamped_degrees(this.movingAngle);
|
||
}
|
||
}
|
||
}
|
||
;
|
||
}
|
||
var clamp_angle_degrees = function(a) {
|
||
a %= 360;
|
||
if (a < 0)
|
||
a += 360;
|
||
return a;
|
||
};
|
||
var to_degrees = function(x) {
|
||
return x * (180.0 / Math.PI);
|
||
};
|
||
var to_clamped_degrees = function(x) {
|
||
return clamp_angle_degrees(to_degrees(x));
|
||
};
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.mcube_rexspline.Cnds = {
|
||
OnHitTarget() {
|
||
return (this.is_my_call);
|
||
},
|
||
OnHitAnyPoint() {
|
||
return (this.is_my_call);
|
||
},
|
||
IsMoving() {
|
||
return (this.enabled && this.is_moving);
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.mcube_rexspline.Acts = {
|
||
SetEnabled(en) {
|
||
this.enabled = (en === 1);
|
||
},
|
||
SetAngleEnabled(en) {
|
||
this.setAngle = (en === 1);
|
||
},
|
||
AddPoint(x, y) {
|
||
this.points.push([x, y]);
|
||
},
|
||
ResetPoint(i, x, y) {
|
||
if (this.is_moving) {
|
||
var idxp1 = this.curSeg.ptr;
|
||
var idxp2 = this.curSeg.ptr + 1;
|
||
if ((idxp1 === i) || (idxp2 === i))
|
||
return;
|
||
}
|
||
if (i < 0) {
|
||
this.points.unshift([x, y]);
|
||
} else if (i < this.points.length) {
|
||
var p = this.points[i];
|
||
p[0] = x;
|
||
p[1] = y;
|
||
} else {
|
||
this.points.push([x, y]);
|
||
}
|
||
},
|
||
CleanAll() {
|
||
this.points.length = 0;
|
||
this.is_moving = false;
|
||
},
|
||
Start() {
|
||
this.start();
|
||
},
|
||
Stop() {
|
||
this.is_moving = false;
|
||
},
|
||
SetSpeed(spd) {
|
||
this.speed = spd;
|
||
},
|
||
SetLooping(en) {
|
||
this.isLooping = (en === 1);
|
||
},
|
||
SetTension(tension) {
|
||
this.tension = tension;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.mcube_rexspline.Exps = {
|
||
Speed() {
|
||
return (this.speed);
|
||
},
|
||
Tension() {
|
||
return (this.tension);
|
||
},
|
||
AngleOfMotion() {
|
||
if (typeof this.movingAngle != "undefined") {
|
||
return (this.getMovingAngle());
|
||
} else {
|
||
return 0;
|
||
}
|
||
},
|
||
Point(idx, part) {
|
||
var val = this.points;
|
||
if (idx != null)
|
||
val = val[idx];
|
||
if ((val != null) && (part != null)) {
|
||
if ((part === 0) || (part === "x") || (part === "X"))
|
||
val = val[0];
|
||
else if ((part === 1) || (part === "y") || (part === "Y"))
|
||
val = val[1];
|
||
}
|
||
return (din(val));
|
||
},
|
||
CurSegP0(part) {
|
||
var val = this.curSeg.ptr;
|
||
if (part != null) {
|
||
val = this.points[val];
|
||
if (val != null) {
|
||
if ((part === 0) || (part === "x") || (part === "X"))
|
||
val = val[0];
|
||
else if ((part === 1) || (part === "y") || (part === "Y"))
|
||
val = val[1];
|
||
} else
|
||
val = 0;
|
||
}
|
||
return (val);
|
||
},
|
||
CurSegP1(part) {
|
||
var val = this.wrapIndex(this.curSeg.ptr + 1);
|
||
if (part != null) {
|
||
val = this.points[val];
|
||
if (val != null) {
|
||
if ((part === 0) || (part === "x") || (part === "X"))
|
||
val = val[0];
|
||
else if ((part === 1) || (part === "y") || (part === "Y"))
|
||
val = val[1];
|
||
} else
|
||
val = 0;
|
||
}
|
||
return (val);
|
||
},
|
||
PointsCount() {
|
||
return (this.points.length);
|
||
},
|
||
TraveledDistance() {
|
||
return (this.traveledDist);
|
||
}
|
||
};
|
||
}
|
||
'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Timer = class TimerBehavior extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Timer.Type = class TimerType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Timer.SingleTimer = class SingleTimer {
|
||
constructor(current, total, duration, isRegular) {
|
||
this._current = C3.New(C3.KahanSum);
|
||
this._current.Set(current || 0);
|
||
this._total = C3.New(C3.KahanSum);
|
||
this._total.Set(total || 0);
|
||
this._duration = duration || 0;
|
||
this._isRegular = !!isRegular;
|
||
this._isPaused = false
|
||
}
|
||
GetCurrentTime() {
|
||
return this._current.Get()
|
||
}
|
||
GetTotalTime() {
|
||
return this._total.Get()
|
||
}
|
||
GetDuration() {
|
||
return this._duration
|
||
}
|
||
SetPaused(p) {
|
||
this._isPaused = !!p
|
||
}
|
||
IsPaused() {
|
||
return this._isPaused
|
||
}
|
||
Add(t) {
|
||
this._current.Add(t);
|
||
this._total.Add(t)
|
||
}
|
||
HasFinished() {
|
||
return this._current.Get() >= this._duration
|
||
}
|
||
Update() {
|
||
if (this.HasFinished())
|
||
if (this._isRegular)
|
||
this._current.Subtract(this._duration);
|
||
else
|
||
return true;
|
||
return false
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"c": this._current.Get(),
|
||
"t": this._total.Get(),
|
||
"d": this._duration,
|
||
"r": this._isRegular,
|
||
"p": this._isPaused
|
||
}
|
||
}
|
||
LoadFromJson(o) {
|
||
this._current.Set(o["c"]);
|
||
this._total.Set(o["t"]);
|
||
this._duration = o["d"];
|
||
this._isRegular = !!o["r"];
|
||
this._isPaused = !!o["p"]
|
||
}
|
||
}
|
||
;
|
||
C3.Behaviors.Timer.Instance = class TimerInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
this._timers = new Map
|
||
}
|
||
Release() {
|
||
this._timers.clear();
|
||
super.Release()
|
||
}
|
||
_UpdateTickState() {
|
||
if (this._timers.size > 0) {
|
||
this._StartTicking();
|
||
this._StartTicking2()
|
||
} else {
|
||
this._StopTicking();
|
||
this._StopTicking2()
|
||
}
|
||
}
|
||
SaveToJson() {
|
||
const ret = {};
|
||
for (const [name,timer] of this._timers.entries())
|
||
ret[name] = timer.SaveToJson();
|
||
return ret
|
||
}
|
||
LoadFromJson(o) {
|
||
this._timers.clear();
|
||
for (const [name,data] of Object.entries(o)) {
|
||
const timer = new C3.Behaviors.Timer.SingleTimer;
|
||
timer.LoadFromJson(data);
|
||
this._timers.set(name, timer)
|
||
}
|
||
this._UpdateTickState()
|
||
}
|
||
Tick() {
|
||
const dt = this._runtime.GetDt(this._inst);
|
||
for (const timer of this._timers.values())
|
||
if (!timer.IsPaused())
|
||
timer.Add(dt)
|
||
}
|
||
Tick2() {
|
||
for (const [name,timer] of this._timers.entries()) {
|
||
const shouldDelete = timer.Update();
|
||
if (shouldDelete)
|
||
this._timers.delete(name)
|
||
}
|
||
}
|
||
GetDebuggerProperties() {
|
||
return [{
|
||
title: "behaviors.timer.debugger.timers",
|
||
properties: [...this._timers.entries()].map(entry=>({
|
||
name: "$" + entry[0],
|
||
value: `${Math.round(entry[1].GetCurrentTime() * 10) / 10} / ${Math.round(entry[1].GetDuration() * 10) / 10}`
|
||
}))
|
||
}]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Timer.Cnds = {
|
||
OnTimer(name) {
|
||
const timer = this._timers.get(name.toLowerCase());
|
||
if (!timer)
|
||
return false;
|
||
return timer.HasFinished()
|
||
},
|
||
IsTimerRunning(name) {
|
||
return this._timers.has(name.toLowerCase())
|
||
},
|
||
IsTimerPaused(name) {
|
||
const timer = this._timers.get(name.toLowerCase());
|
||
return timer && timer.IsPaused()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Timer.Acts = {
|
||
StartTimer(duration, type, name) {
|
||
const timer = new C3.Behaviors.Timer.SingleTimer(0,0,duration,type === 1);
|
||
this._timers.set(name.toLowerCase(), timer);
|
||
this._UpdateTickState()
|
||
},
|
||
StopTimer(name) {
|
||
this._timers.delete(name.toLowerCase());
|
||
this._UpdateTickState()
|
||
},
|
||
PauseResumeTimer(name, state) {
|
||
const timer = this._timers.get(name.toLowerCase());
|
||
if (timer)
|
||
timer.SetPaused(state === 0)
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Timer.Exps = {
|
||
CurrentTime(name) {
|
||
const timer = this._timers.get(name.toLowerCase());
|
||
if (!timer)
|
||
return 0;
|
||
return timer.GetCurrentTime()
|
||
},
|
||
TotalTime(name) {
|
||
const timer = this._timers.get(name.toLowerCase());
|
||
if (!timer)
|
||
return 0;
|
||
return timer.GetTotalTime()
|
||
},
|
||
Duration(name) {
|
||
const timer = this._timers.get(name.toLowerCase());
|
||
if (!timer)
|
||
return 0;
|
||
return timer.GetDuration()
|
||
}
|
||
}
|
||
}
|
||
;"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_radiogroup = class aekiro_radiogroupBehavior extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_radiogroup.Type = class aekiro_radiogroupType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_radiogroup.Instance = class aekiro_radiogroupInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
this.value = properties[0];
|
||
this.GetObjectInstance().GetUnsavedDataMap().aekiro_radiogroup = this;
|
||
this.radioButtons = [];
|
||
this.isEnabled = true;
|
||
this.goManager = globalThis.aekiro_goManager;
|
||
this.goManager.eventManager.on("childrenRegistred", ()=>this.init(), {
|
||
"once": true
|
||
});
|
||
}
|
||
PostCreate() {
|
||
this.aekiro_gameobject = this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject;
|
||
if (this.aekiro_gameobject) {
|
||
this.aekiro_gameobject.eventManager.on("cloned", ()=>this.init(), {
|
||
"once": true
|
||
});
|
||
}
|
||
}
|
||
GetRadioButtons() {
|
||
return this.aekiro_gameobject.children;
|
||
}
|
||
init() {
|
||
if (!this.aekiro_gameobject) {
|
||
return;
|
||
}
|
||
this.radioButtons = this.GetRadioButtons();
|
||
var b;
|
||
var l = this.radioButtons.length;
|
||
for (var i = 0; i < l; i++) {
|
||
b = this.radioButtons[i].GetUnsavedDataMap().aekiro_radiobutton;
|
||
b.init();
|
||
}
|
||
this.updateView();
|
||
}
|
||
isValueValid(value) {
|
||
var b;
|
||
var radioButtons = this.GetRadioButtons();
|
||
for (var i = 0; i < radioButtons.length; i++) {
|
||
b = radioButtons[i].GetUnsavedDataMap().aekiro_radiobutton;
|
||
if (b.name == value) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
setValue(value) {
|
||
if (!this.isValueValid(value)) {
|
||
return false;
|
||
}
|
||
var radioButtons = this.GetRadioButtons();
|
||
var b, l = radioButtons.length;
|
||
for (var i = 0; i < l; i++) {
|
||
b = radioButtons[i].GetUnsavedDataMap().aekiro_radiobutton;
|
||
if (b.name == value) {
|
||
this.value = value;
|
||
b.setValue(1);
|
||
} else {
|
||
b.setValue(0);
|
||
}
|
||
}
|
||
}
|
||
updateView() {
|
||
var areAllDisabled = true;
|
||
var radioButtons = this.GetRadioButtons();
|
||
for (var i = 0; i < radioButtons.length; i++) {
|
||
var b = radioButtons[i].GetUnsavedDataMap().aekiro_radiobutton;
|
||
if (b.name == this.value) {
|
||
b.setValue(1);
|
||
} else {
|
||
b.setValue(0);
|
||
}
|
||
if (b.isEnabled) {
|
||
areAllDisabled = false;
|
||
}
|
||
}
|
||
if (areAllDisabled) {
|
||
this.isEnabled = false;
|
||
}
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"value": this.value,
|
||
};
|
||
}
|
||
LoadFromJson(o) {
|
||
this.value = o["value"];
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_radiogroup.Cnds = {
|
||
IsEnabled() {
|
||
return this.isEnabled;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_radiogroup.Acts = {
|
||
setValue(value) {
|
||
this.setValue(value);
|
||
},
|
||
setEnabled(isEnabled) {
|
||
this.isEnabled = isEnabled;
|
||
for (var i = 0, l = this.radioButtons.length; i < l; i++) {
|
||
this.radioButtons[i].GetUnsavedDataMap().aekiro_radiobutton.setEnabled(isEnabled);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_radiogroup.Exps = {
|
||
value() {
|
||
return this.value;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gridView = class aekiro_gridViewBehavior extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gridView.Type = class aekiro_gridViewType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gridView.Instance = class aekiro_gridViewInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
this.proui = this.GetRuntime().GetSingleGlobalObjectClassByCtor(C3.Plugins.aekiro_proui);
|
||
if (this.proui) {
|
||
this.proui = this.proui.GetSingleGlobalInstance().GetSdkInstance();
|
||
}
|
||
if (properties) {
|
||
this.itemName = properties[0];
|
||
this.columns = properties[1];
|
||
this.rows = properties[2];
|
||
this.vspace = properties[3];
|
||
this.hspace = properties[4];
|
||
this.VPadding = properties[5];
|
||
this.HPadding = properties[6];
|
||
}
|
||
this.GetObjectInstance().GetUnsavedDataMap().aekiro_gridview = this;
|
||
this.inst = this.GetObjectInstance();
|
||
this.wi = this.GetWorldInfo();
|
||
this.acts = this.GetObjectInstance().GetPlugin().constructor.Acts;
|
||
this.goManager = globalThis["aekiro_goManager"];
|
||
this.template = {};
|
||
this.isTemplateSet = false;
|
||
this.value = [];
|
||
this.items = [];
|
||
this.it_column = 0;
|
||
this.it_row = 0;
|
||
this.goManager.eventManager.on("childrenRegistred", ()=>{
|
||
var children = this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject.children;
|
||
for (var i = 0, l = children.length; i < l; i++) {
|
||
this.items.push(children[i]);
|
||
}
|
||
}
|
||
, {
|
||
"once": true
|
||
});
|
||
}
|
||
PostCreate() {
|
||
this.aekiro_gameobject = this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject;
|
||
}
|
||
setItemTemplate() {
|
||
if (this.isTemplateSet) {
|
||
return;
|
||
}
|
||
var item = this.goManager.gos[this.itemName];
|
||
if (!item) {
|
||
throw new Error("ProUI-GRIDVIEW: Grid item not found, please check the grid item's name");
|
||
return;
|
||
}
|
||
this.proui.isTypeValid(this.GetObjectInstance(), [C3.Plugins.Sprite, C3.Plugins.NinePatch, C3.Plugins.TiledBg], "ProUI-GRIDVIEW: Grid item can only be Sprite, 9-patch or tiled backgrounds objects.");
|
||
var go = item.GetUnsavedDataMap().aekiro_gameobject;
|
||
this.template = go.getTemplate();
|
||
go.destroyHierarchy();
|
||
this.isTemplateSet = true;
|
||
}
|
||
build() {
|
||
if (this.rows <= 0 && this.columns <= 0) {
|
||
console.error("ProUI-GRIDVIEW: max rows and max columns can't be both -1 or 0");
|
||
return;
|
||
}
|
||
this.setItemTemplate();
|
||
var diff = this.value.length - this.items.length;
|
||
var item, l;
|
||
if (diff > 0) {
|
||
l = this.value.length;
|
||
for (var i = this.items.length; i < l; i++) {
|
||
item = this.add(i);
|
||
if (!this.nextRowColumn()) {
|
||
break;
|
||
}
|
||
}
|
||
} else if (diff < 0) {
|
||
l = this.items.length;
|
||
for (var i = this.value.length; i < l; i++) {
|
||
this.items[i].GetUnsavedDataMap().aekiro_gameobject.destroyHierarchy();
|
||
if (!this.previousRowColumn()) {
|
||
break;
|
||
}
|
||
}
|
||
this.items.splice(this.value.length, -diff);
|
||
}
|
||
this.resize();
|
||
l = this.value.length;
|
||
for (var i = 0; i < l; i++) {
|
||
this.mapData(this.items[i], this.value[i], i);
|
||
}
|
||
var self = this;
|
||
setTimeout(function() {
|
||
self.Trigger(C3.Behaviors.aekiro_gridView.Cnds.OnRender);
|
||
}, 0);
|
||
}
|
||
add(itemIndex) {
|
||
var self = this;
|
||
var item = this.goManager.clone(this.template, null, this.inst, this.wi.GetLayer(), 0, 0);
|
||
var wi = item.GetWorldInfo();
|
||
var offsetX = wi.GetX() - wi.GetBoundingBox().getLeft();
|
||
var offsetY = wi.GetY() - wi.GetBoundingBox().getTop();
|
||
wi.SetX(this.wi.GetBoundingBox().getLeft() + offsetX + (this.vspace + wi.GetWidth()) * this.it_column + this.HPadding);
|
||
wi.SetY(this.wi.GetBoundingBox().getTop() + offsetY + (this.hspace + wi.GetHeight()) * this.it_row + this.VPadding);
|
||
wi.SetBboxChanged();
|
||
this.items.push(item);
|
||
return item;
|
||
}
|
||
clear() {
|
||
this.setItemTemplate();
|
||
var items = this.items;
|
||
for (var i = 0, l = this.items.length; i < l; i++) {
|
||
items[i].GetUnsavedDataMap().aekiro_gameobject.destroyHierarchy();
|
||
}
|
||
items.length = 0;
|
||
this.it_column = 0;
|
||
this.it_row = 0;
|
||
this.value = [];
|
||
this.resize();
|
||
}
|
||
resize() {
|
||
var wi = this.wi;
|
||
var prevBboxTop = wi.GetBoundingBox().getTop();
|
||
var prevBboxLeft = wi.GetBoundingBox().getLeft();
|
||
var prevX = wi.GetX();
|
||
var prevY = wi.GetY();
|
||
if (this.value.length == 0) {
|
||
wi.SetWidth(5, true);
|
||
wi.SetHeight(5, true);
|
||
wi.SetBboxChanged();
|
||
wi.SetX(prevBboxLeft + (wi.GetX() - wi.GetBoundingBox().getLeft()));
|
||
wi.SetY(prevBboxTop + (wi.GetY() - wi.GetBoundingBox().getTop()));
|
||
wi.SetBboxChanged();
|
||
return;
|
||
}
|
||
var row = Math.ceil(this.value.length / this.columns);
|
||
var column = Math.ceil(this.value.length / this.rows);
|
||
if (this.rows < 0) {
|
||
column = this.columns;
|
||
if (this.value.length < this.columns) {
|
||
column = this.value.length;
|
||
}
|
||
} else if (this.columns < 0) {
|
||
row = this.rows;
|
||
if (this.value.length < this.rows) {
|
||
row = this.value.length;
|
||
}
|
||
} else {
|
||
column = this.columns;
|
||
row = this.rows;
|
||
}
|
||
var itemWidth = this.items[0].GetWorldInfo().GetWidth();
|
||
var itemHeight = this.items[0].GetWorldInfo().GetHeight();
|
||
wi.SetWidth(itemWidth * column + this.vspace * (column - 1) + 2 * this.HPadding, true);
|
||
wi.SetHeight(itemHeight * row + this.hspace * (row - 1) + 2 * this.VPadding, true);
|
||
wi.SetBboxChanged();
|
||
if (wi.GetX() != prevX || wi.GetX() != prevY) {
|
||
return;
|
||
}
|
||
wi.SetX(prevBboxLeft + (wi.GetX() - wi.GetBoundingBox().getLeft()));
|
||
wi.SetY(prevBboxTop + (wi.GetY() - wi.GetBoundingBox().getTop()));
|
||
wi.SetBboxChanged();
|
||
}
|
||
mapData(inst, data, index) {
|
||
var binder = inst.GetUnsavedDataMap().aekiro_gridviewbind;
|
||
if (binder && this.isObject(data)) {
|
||
binder.index = index;
|
||
binder.setValue(data);
|
||
binder.gridView = this;
|
||
binder.triggerOnGridViewRender();
|
||
}
|
||
var children = inst.GetUnsavedDataMap().aekiro_gameobject.children;
|
||
for (var i = 0, l = children.length; i < l; i++) {
|
||
this.mapData(children[i], data, index);
|
||
}
|
||
}
|
||
item_setKey(i, key, value) {
|
||
self["_"]["set"](this.value[i], key, value);
|
||
}
|
||
nextRowColumn() {
|
||
if (this.rows < 0) {
|
||
this.it_column++;
|
||
if (this.it_column == this.columns) {
|
||
this.it_column = 0;
|
||
this.it_row++;
|
||
}
|
||
} else if (this.columns < 0) {
|
||
this.it_row++;
|
||
if (this.it_row == this.rows) {
|
||
this.it_row = 0;
|
||
this.it_column++;
|
||
}
|
||
} else {
|
||
this.it_column++;
|
||
if (this.it_column == this.columns) {
|
||
this.it_column = 0;
|
||
this.it_row++;
|
||
}
|
||
if (this.it_row == this.rows)
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
previousRowColumn() {
|
||
if (this.rows < 0) {
|
||
this.it_column--;
|
||
if (this.it_column < 0) {
|
||
this.it_column = this.columns - 1;
|
||
this.it_row--;
|
||
}
|
||
} else if (this.columns < 0) {
|
||
this.it_row--;
|
||
if (this.it_row < 0) {
|
||
this.it_row = this.rows - 1;
|
||
this.it_column--;
|
||
}
|
||
} else {
|
||
this.it_column--;
|
||
if (this.it_column < 0) {
|
||
this.it_column = this.columns - 1;
|
||
this.it_row--;
|
||
}
|
||
if (this.it_row == 0)
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
isObject(a) {
|
||
return (!!a) && (a.constructor === Object);
|
||
}
|
||
isArray(a) {
|
||
return (!!a) && (a.constructor === Array);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"itemName": this.itemName,
|
||
"columns": this.columns,
|
||
"rows": this.rows,
|
||
"vspace": this.vspace,
|
||
"hspace": this.hspace,
|
||
"VPadding": this.VPadding,
|
||
"HPadding": this.HPadding,
|
||
"template": this.template,
|
||
"isTemplateSet": this.isTemplateSet,
|
||
"value": this.value,
|
||
"it_column": this.it_column,
|
||
"it_row": this.it_row
|
||
};
|
||
}
|
||
LoadFromJson(o) {
|
||
this.itemName = o["itemName"];
|
||
this.columns = o["columns"];
|
||
this.rows = o["rows"];
|
||
this.vspace = o["vspace"];
|
||
this.hspace = o["hspace"];
|
||
this.VPadding = o["VPadding"];
|
||
this.HPadding = o["HPadding"];
|
||
this.template = o["template"];
|
||
this.isTemplateSet = o["isTemplateSet"];
|
||
this.value = o["value"];
|
||
this.it_column = o["it_column"];
|
||
this.it_row = o["it_row"];
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gridView.Cnds = {
|
||
OnRender() {
|
||
return true;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gridView.Acts = {
|
||
SetDataByJsonString(data) {
|
||
try {
|
||
data = JSON.parse(data);
|
||
} catch (e) {
|
||
console.error("ProUI-GRIDVIEW: json parse error !");
|
||
return;
|
||
}
|
||
if (!this.isArray(data)) {
|
||
console.error("ProUI-GRIDVIEW: json is not an array !");
|
||
return;
|
||
}
|
||
this.value = data;
|
||
this.build();
|
||
},
|
||
SetDataByJsonObject(jsonObject, root) {
|
||
var data = jsonObject.GetFirstPicked().GetSdkInstance()._data;
|
||
if (root) {
|
||
data = data[root];
|
||
}
|
||
if (data && !this.isArray(data)) {
|
||
console.error("ProUI-GRIDVIEW: json is not an array !");
|
||
return;
|
||
}
|
||
this.value = data;
|
||
this.build();
|
||
},
|
||
Clear() {
|
||
this.clear();
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_gridView.Acts = {
|
||
SetDataByJsonString(data) {
|
||
try {
|
||
data = JSON.parse(data);
|
||
} catch (e) {
|
||
console.error("ProUI-GRIDVIEW: json parse error !");
|
||
return;
|
||
}
|
||
if (!this.isArray(data)) {
|
||
console.error("ProUI-GRIDVIEW: json is not an array !");
|
||
return;
|
||
}
|
||
this.value = data;
|
||
this.build();
|
||
},
|
||
SetDataByJsonObject(jsonObject) {
|
||
var data = jsonObject.GetFirstPicked().GetSdkInstance()._data;
|
||
if (!this.isArray(data)) {
|
||
console.error("ProUI-GRIDVIEW: json is not an array !");
|
||
return;
|
||
}
|
||
this.value = data;
|
||
this.build();
|
||
},
|
||
Clear() {
|
||
this.clear();
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_scrollView = class aekiro_scrollViewBehavior extends C3.SDKBehaviorBase {
|
||
constructor(a) {
|
||
super(a);
|
||
const b = this._runtime.Dispatcher();
|
||
this._disposables = new C3.CompositeDisposable(C3.Disposable.From(b, "pointerdown", (a)=>this._OnPointerDown(a.data)),C3.Disposable.From(b, "pointermove", (a)=>this._OnPointerMove(a.data)),C3.Disposable.From(b, "pointerup", (a)=>this._OnPointerUp(a.data, !1)),C3.Disposable.From(b, "pointercancel", (a)=>this._OnPointerUp(a.data, !0))),
|
||
C3.Disposable.From(b, "wheel", (a)=>this._OnMouseWheel(a.data))
|
||
}
|
||
Release() {
|
||
this._disposables.Release(),
|
||
this._disposables = null,
|
||
super.Release()
|
||
}
|
||
_OnPointerDown(a) {
|
||
this._OnInputDown(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
_OnPointerMove(a) {
|
||
this._OnInputMove(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
_OnPointerUp(a) {
|
||
this._OnInputUp(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
_OnMouseWheel(a) {
|
||
this._OnMouseWheel2(a["deltaY"], a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
async _OnInputDown(source, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_scrollView);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnAnyInputDown)
|
||
await beh.OnAnyInputDown(x, y, source);
|
||
}
|
||
}
|
||
_OnInputMove(source, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_scrollView);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnAnyInputMove)
|
||
beh.OnAnyInputMove(x, y, source);
|
||
}
|
||
}
|
||
async _OnInputUp(a, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_scrollView);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnAnyInputUp)
|
||
await beh.OnAnyInputUp(x, y);
|
||
}
|
||
}
|
||
_OnMouseWheel2(a, b, c) {
|
||
const insts = this.GetInstances();
|
||
for (const inst of insts) {
|
||
const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_scrollView);
|
||
const wi = inst.GetWorldInfo()
|
||
, layer = wi.GetLayer()
|
||
, [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation());
|
||
if (beh.OnMouseWheel)
|
||
beh.OnMouseWheel(x, y, a);
|
||
}
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_scrollView.Type = class aekiro_scrollView2Type extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_scrollView.Instance = class aekiro_scrollViewInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
this.proui = this.GetRuntime().GetSingleGlobalObjectClassByCtor(C3.Plugins.aekiro_proui);
|
||
if (this.proui) {
|
||
this.proui = this.proui.GetSingleGlobalInstance().GetSdkInstance();
|
||
}
|
||
this._SetVisible = this.GetObjectInstance().GetPlugin().constructor.Acts.SetVisible;
|
||
this.runtime = this.GetRuntime();
|
||
this.aekiro_scrollViewManager = globalThis.aekiro_scrollViewManager;
|
||
this.aekiro_scrollViewManager.add(this.GetObjectInstance());
|
||
this.aekiro_dialogManager = globalThis.aekiro_dialogManager;
|
||
this.goManager = globalThis.aekiro_goManager;
|
||
this.GetObjectInstance().GetUnsavedDataMap().aekiro_scrollView = this;
|
||
this.inst = this.GetObjectInstance();
|
||
this.wi = this.GetWorldInfo();
|
||
if (properties) {
|
||
this.isEnabled = properties[0];
|
||
this.direction = properties[1];
|
||
this.isSwipeScrollEnabled = properties[2];
|
||
this.isMouseScroll = properties[3];
|
||
this.inertia = properties[4];
|
||
this.movement = properties[5];
|
||
this.contentUID = properties[6];
|
||
this.vSliderUID = properties[7];
|
||
this.vScrollBarUID = properties[8];
|
||
this.hSliderUID = properties[9];
|
||
this.hScrollBarUID = properties[10];
|
||
}
|
||
if (!this.inertia) {
|
||
this.movement = 0;
|
||
}
|
||
this.elasticF = 1;
|
||
if (this.movement) {
|
||
this.elasticF = 0.4;
|
||
}
|
||
this.onTouchStarted = false;
|
||
this.isTouchMoving = false;
|
||
this.onSliderTouchStarted = false;
|
||
this.onvSliderTouchStarted = false;
|
||
this.onhSliderTouchStarted = false;
|
||
this.content = null;
|
||
this.vSlider = null;
|
||
this.vScrollBar = null;
|
||
this.hSlider = null;
|
||
this.hScrollBar = null;
|
||
this.isInit = false;
|
||
this.isContentScrollableV = true;
|
||
this.isContentScrollableH = true;
|
||
this.scroll = {
|
||
isIdle: true,
|
||
offsetX: 0,
|
||
offestY: 0,
|
||
scrollRatio: 0,
|
||
decelerationVelocityX: 0,
|
||
decelerationVelocityY: 0,
|
||
scrollToTargetY: null,
|
||
scrollToTargetX: null,
|
||
scrollToX: false,
|
||
scrollToY: false,
|
||
scrollToSmooth: 0.3
|
||
};
|
||
this.goManager.eventManager.on("childrenRegistred", ()=>{
|
||
this.init();
|
||
}
|
||
, {
|
||
"once": true
|
||
});
|
||
this.SetForceOwnTextureListener = this.goManager.eventManager.on("childrenRegistred", ()=>{
|
||
this.wi.GetLayer().SetForceOwnTexture(true);
|
||
}
|
||
);
|
||
}
|
||
init() {
|
||
if (this.isInit) {
|
||
return;
|
||
}
|
||
this.isVScrollEnabled = (this.direction == 0) || (this.direction == 2);
|
||
this.isHScrollEnabled = (this.direction == 1) || (this.direction == 2);
|
||
this.prevSelfLayerVisible = this.wi.GetLayer().IsVisible();
|
||
try {
|
||
this.vSlider = this.getPart(this.vSliderUID, "vertical slider");
|
||
this.vScrollBar = this.getPart(this.vScrollBarUID, "vertical scrollbar");
|
||
this.hSlider = this.getPart(this.hSliderUID, "horizontal slider");
|
||
this.hScrollBar = this.getPart(this.hScrollBarUID, "horizontal scrollbar");
|
||
this.content = this.getPart(this.contentUID, "content", true);
|
||
var contentWi = this.content.GetWorldInfo();
|
||
this.contentWi = this.content.GetWorldInfo();
|
||
} catch (e) {
|
||
console.error(e)
|
||
this.isEnabled = false;
|
||
return;
|
||
}
|
||
this.content.GetUnsavedDataMap().aekiro_scrollView = this;
|
||
this.contentWi.SetHeight_old2 = this.contentWi.SetHeight;
|
||
this.contentWi.SetHeight = function(v, onlyNode) {
|
||
this.SetHeight_old2(v, onlyNode);
|
||
this.GetInstance().GetUnsavedDataMap().aekiro_scrollView.OnSizeChanged();
|
||
}
|
||
;
|
||
this.contentWi.SetWidth_old2 = this.contentWi.SetWidth;
|
||
this.contentWi.SetWidth = function(v, onlyNode) {
|
||
this.SetWidth_old2(v, onlyNode);
|
||
this.GetInstance().GetUnsavedDataMap().aekiro_scrollView.OnSizeChanged();
|
||
}
|
||
;
|
||
this.content.GetUnsavedDataMap().aekiro_gameobject.eventManager.on("childrenAdded", function(inst) {
|
||
if (inst) {
|
||
inst.GetUnsavedDataMap().aekiro_gameobject.applyActionToHierarchy(inst.GetUnsavedDataMap().aekiro_gameobject.acts.SetEffect, 9);
|
||
}
|
||
});
|
||
if (contentWi.GetHeight(true) <= this.wi.GetHeight(true)) {
|
||
this.isContentScrollableV = false;
|
||
}
|
||
if (contentWi.GetWidth(true) <= this.wi.GetWidth(true)) {
|
||
this.isContentScrollableH = false;
|
||
}
|
||
contentWi.SetX(this.wi.GetBoundingBox().getLeft() + (contentWi.GetX() - contentWi.GetBoundingBox().getLeft()));
|
||
contentWi.SetY(this.wi.GetBoundingBox().getTop() + (contentWi.GetY() - contentWi.GetBoundingBox().getTop()));
|
||
contentWi.SetBboxChanged();
|
||
this.wi.GetLayer().SetForceOwnTexture(true);
|
||
this.GetRuntime().UpdateRender();
|
||
this.content.GetUnsavedDataMap().aekiro_gameobject.applyActionToHierarchy(this.content.GetUnsavedDataMap().aekiro_gameobject.acts.SetEffect, 9);
|
||
if (this.hSlider && this.hScrollBar) {
|
||
this.hSliderWi = this.hSlider.GetWorldInfo();
|
||
this.hScrollBarWi = this.hScrollBar.GetWorldInfo();
|
||
var x = this.hScrollBarWi.GetBoundingBox().getLeft() + (this.hSliderWi.GetX() - this.hSliderWi.GetBoundingBox().getLeft());
|
||
this.hSliderWi.SetX(x);
|
||
this.hSliderWi.SetBboxChanged();
|
||
this.hScrollBar.GetSdkInstance().CallAction(this.hScrollBar.GetPlugin().constructor.Acts.MoveToTop);
|
||
this.hSlider.GetSdkInstance().CallAction(this.hSlider.GetPlugin().constructor.Acts.MoveToTop);
|
||
}
|
||
if (this.vSlider && this.vScrollBar) {
|
||
this.vSliderWi = this.vSlider.GetWorldInfo();
|
||
this.vScrollBarWi = this.vScrollBar.GetWorldInfo();
|
||
var y = this.vScrollBarWi.GetBoundingBox().getTop() + (this.vSliderWi.GetY() - this.vSliderWi.GetBoundingBox().getTop());
|
||
this.vSliderWi.SetY(y);
|
||
this.vSliderWi.SetBboxChanged();
|
||
this.vScrollBar.GetSdkInstance().CallAction(this.vScrollBar.GetPlugin().constructor.Acts.MoveToTop);
|
||
this.vSlider.GetSdkInstance().CallAction(this.vSlider.GetPlugin().constructor.Acts.MoveToTop);
|
||
}
|
||
this.isInit = true;
|
||
this._StartTicking();
|
||
}
|
||
getPart(name, errorLabel, isRequired) {
|
||
if (!name && !isRequired)
|
||
return;
|
||
var invalidName = false;
|
||
var p = this.goManager.gos[name];
|
||
if (p) {
|
||
if (!this.proui.isTypeValid(p, [C3.Plugins.Sprite, C3.Plugins.NinePatch, C3.Plugins.TiledBg])) {
|
||
throw new Error("ProUI-ScrollView-UID = " + this.GetObjectInstance().GetUID() + " : The " + errorLabel + " of the scrollView can only be a Sprite, TiledBackground Or 9-patch object.");
|
||
}
|
||
return p;
|
||
} else {
|
||
invalidName = true;
|
||
}
|
||
if (!name && isRequired) {
|
||
invalidName = true;
|
||
}
|
||
if (invalidName) {
|
||
throw new Error("ProUI-ScrollView: " + errorLabel + " not found, please check its name");
|
||
}
|
||
return;
|
||
}
|
||
PostCreate() {
|
||
this.sdkInstance_callAction = this.GetObjectInstance().GetSdkInstance().CallAction;
|
||
this.sdkInstance_acts = this.GetObjectInstance().GetPlugin().constructor.Acts;
|
||
}
|
||
OnMouseWheel(x, y, deltaY) {
|
||
if (this.isEnabled && this.isVScrollEnabled && this.isContentScrollableV && this.isMouseScroll && this.isInteractible(x, y) && this.wi.ContainsPoint(x, y)) {
|
||
this.scroll.scrollToX = false;
|
||
this.scroll.scrollToY = false;
|
||
this.scroll.isIdle = false;
|
||
this._StartTicking();
|
||
this.onWheelStarted = true;
|
||
var dir = (deltaY > 0 ? -1 : 1);
|
||
if (this.inertia) {
|
||
this.scroll.decelerationVelocityY = dir * 650;
|
||
} else {
|
||
this.contentWi.OffsetY(30 * dir);
|
||
}
|
||
this.scroll.decelerationVelocityX = 0;
|
||
}
|
||
}
|
||
isInteractible(x, y) {
|
||
if (this.proui.ignoreInput) {
|
||
return false;
|
||
}
|
||
var isUnder = false;
|
||
if (this.aekiro_dialogManager) {
|
||
isUnder = this.aekiro_dialogManager.isInstanceUnder(this.wi.GetLayer().GetIndex());
|
||
}
|
||
var isOverlaped = this.aekiro_scrollViewManager.isOverlaped(this.GetObjectInstance(), x, y);
|
||
return !isUnder && !isOverlaped;
|
||
}
|
||
OnAnyInputDown(x, y) {
|
||
if (!this.isEnabled || !this.isInteractible(x, y)) {
|
||
return;
|
||
}
|
||
if (this.wi.ContainsPoint(x, y)) {
|
||
this.OnInputDown(x, y);
|
||
}
|
||
if (this.vSlider && this.vScrollBar && this.isVScrollEnabled && this.isContentScrollableV && this.vSliderWi.ContainsPoint(x, y)) {
|
||
this.OnSliderTouchStart("v", x, y);
|
||
}
|
||
if (this.hSlider && this.hScrollBar && this.isHScrollEnabled && this.isContentScrollableH && this.hSliderWi.ContainsPoint(x, y)) {
|
||
this.OnSliderTouchStart("h", x, y);
|
||
}
|
||
}
|
||
OnInputDown(x, y) {
|
||
if (!this.isEnabled || !this.isSwipeScrollEnabled) {
|
||
return;
|
||
}
|
||
this.onTouchStarted = true;
|
||
this.scroll.startTime = Date.now();
|
||
if (this.isVScrollEnabled && this.isContentScrollableV) {
|
||
this.scroll.offsetY = y - this.contentWi.GetY();
|
||
this.scroll.touchStartY = y;
|
||
this.scroll.isIdle = false;
|
||
this._StartTicking();
|
||
this.scroll.scrollToX = false;
|
||
this.scroll.scrollToY = false;
|
||
}
|
||
if (this.isHScrollEnabled && this.isContentScrollableH) {
|
||
this.scroll.offsetX = x - this.contentWi.GetX();
|
||
this.scroll.touchStartX = x;
|
||
this.scroll.isIdle = false;
|
||
this._StartTicking();
|
||
this.scroll.scrollToX = false;
|
||
this.scroll.scrollToY = false;
|
||
}
|
||
this.touchX = x;
|
||
this.touchY = y;
|
||
this.scroll.decelerationVelocityX = 0;
|
||
this.scroll.decelerationVelocityY = 0;
|
||
}
|
||
OnSliderTouchStart(type, x, y) {
|
||
if (type == "v") {
|
||
this.scroll.offsetY = y - this.vSliderWi.GetY();
|
||
this.onvSliderTouchStarted = true;
|
||
} else {
|
||
this.scroll.offsetX = x - this.hSliderWi.GetX();
|
||
this.onhSliderTouchStarted = true;
|
||
}
|
||
this.onSliderTouchStarted = true;
|
||
this.scroll.isIdle = true;
|
||
this._StopTicking();
|
||
this.boundContent();
|
||
this.scroll.scrollToX = false;
|
||
this.scroll.scrollToY = false;
|
||
this.scroll.decelerationVelocityX = 0;
|
||
this.scroll.decelerationVelocityY = 0;
|
||
}
|
||
OnAnyInputUp(x, y) {
|
||
if (!this.isEnabled) {
|
||
return;
|
||
}
|
||
if (this.onTouchStarted) {
|
||
this.OnInputUp(x, y);
|
||
}
|
||
this.onTouchStarted = false;
|
||
this.onSliderTouchStarted = false;
|
||
this.onvSliderTouchStarted = false;
|
||
this.onhSliderTouchStarted = false;
|
||
}
|
||
OnInputUp(x, y) {
|
||
this.scroll.elapsedTime = (Date.now() - this.scroll.startTime) / 1000;
|
||
if (this.isSwipeScrollEnabled && this.inertia) {
|
||
if (this.isHScrollEnabled && this.isContentScrollableH) {
|
||
this.scroll.decelerationVelocityX = (x - this.scroll.touchStartX) / this.scroll.elapsedTime;
|
||
if (Math.abs(this.scroll.decelerationVelocityX) < 100) {
|
||
this.scroll.decelerationVelocityX = 0;
|
||
}
|
||
}
|
||
if (this.isVScrollEnabled && this.isContentScrollableV) {
|
||
this.scroll.decelerationVelocityY = (y - this.scroll.touchStartY) / this.scroll.elapsedTime;
|
||
if (Math.abs(this.scroll.decelerationVelocityY) < 100) {
|
||
this.scroll.decelerationVelocityY = 0;
|
||
}
|
||
}
|
||
}
|
||
this.isTouchMoving = false;
|
||
}
|
||
OnAnyInputMove(x, y, source) {
|
||
if (this.onTouchStarted) {
|
||
this.isTouchMoving = true;
|
||
this.touchX = x;
|
||
this.touchY = y;
|
||
}
|
||
if (this.onvSliderTouchStarted && this.isVScrollEnabled && this.isContentScrollableV) {
|
||
var newy = y - this.scroll.offsetY;
|
||
this.vSliderWi.SetY(C3.clamp(newy, this.vScrollBarWi.GetBoundingBox().getTop() + (this.vSliderWi.GetY() - this.vSliderWi.GetBoundingBox().getTop()), this.vScrollBarWi.GetBoundingBox().getBottom() - (this.vSliderWi.GetBoundingBox().getBottom() - this.vSliderWi.GetY())));
|
||
this.vSliderWi.SetBboxChanged();
|
||
this.contentWi.SetY(this.wi.GetBoundingBox().getTop() + (this.contentWi.GetY() - this.contentWi.GetBoundingBox().getTop()) - ((this.vSliderWi.GetBoundingBox().getTop() - this.vScrollBarWi.GetBoundingBox().getTop()) / (this.vScrollBarWi.GetHeight(true) - this.vSliderWi.GetHeight(true))) * (this.contentWi.GetHeight(true) - this.wi.GetHeight(true)));
|
||
this.contentWi.SetBboxChanged();
|
||
}
|
||
if (this.onhSliderTouchStarted && this.isHScrollEnabled && this.isContentScrollableH) {
|
||
var newx = x - this.scroll.offsetX;
|
||
this.hSliderWi.SetX(C3.clamp(newx, this.hScrollBarWi.GetBoundingBox().getLeft() + (this.hSliderWi.GetX() - this.hSliderWi.GetBoundingBox().getLeft()), this.hScrollBarWi.GetBoundingBox().getRight() - (this.hSliderWi.GetBoundingBox().getRight() - this.hSliderWi.GetX())));
|
||
this.hSliderWi.SetBboxChanged();
|
||
this.contentWi.SetX(this.wi.GetBoundingBox().getLeft() + (this.contentWi.GetX() - this.contentWi.GetBoundingBox().getLeft()) - ((this.hSliderWi.GetBoundingBox().getLeft() - this.hScrollBarWi.GetBoundingBox().getLeft()) / (this.hScrollBarWi.GetWidth(true) - this.hSliderWi.GetWidth(true))) * (this.contentWi.GetWidth(true) - this.wi.GetWidth(true)));
|
||
this.contentWi.SetBboxChanged();
|
||
}
|
||
}
|
||
boundContent() {
|
||
if (this.contentWi.GetHeight(true) <= this.wi.GetHeight(true)) {
|
||
this.contentWi.SetY(this.wi.GetBoundingBox().getTop() + (this.contentWi.GetY() - this.contentWi.GetBoundingBox().getTop()));
|
||
} else {
|
||
var diff_topY = this.contentWi.GetBoundingBox().getTop() - this.wi.GetBoundingBox().getTop();
|
||
var diff_bottomY = this.wi.GetBoundingBox().getBottom() - this.contentWi.GetBoundingBox().getBottom();
|
||
if (diff_topY > 0 || diff_bottomY > 0) {
|
||
this.contentWi.SetY(C3.clamp(this.contentWi.GetY(), this.contentWi.GetY() + diff_bottomY, this.contentWi.GetY() - diff_topY));
|
||
}
|
||
}
|
||
if (this.contentWi.GetWidth(true) <= this.wi.GetWidth(true)) {
|
||
this.contentWi.SetX(this.wi.GetBoundingBox().getLeft() + (this.contentWi.GetX() - this.contentWi.GetBoundingBox().getLeft()));
|
||
} else {
|
||
var diff_rightX = this.wi.GetBoundingBox().getRight() - this.contentWi.GetBoundingBox().getRight();
|
||
var diff_leftX = this.contentWi.GetBoundingBox().getLeft() - this.wi.GetBoundingBox().getLeft();
|
||
if (diff_rightX > 0 || diff_leftX > 0) {
|
||
this.contentWi.SetX(C3.clamp(this.contentWi.GetX(), this.contentWi.GetX() + diff_rightX, this.contentWi.GetX() - diff_leftX));
|
||
}
|
||
}
|
||
this.contentWi.SetBboxChanged();
|
||
}
|
||
boundContentX(elasticF) {
|
||
if (this.isHScrollEnabled) {
|
||
var isOutOfBound;
|
||
this.contentWi.SetBboxChanged();
|
||
if (this.contentWi.GetWidth(true) <= this.wi.GetWidth(true)) {
|
||
this.contentWi.SetX(this.wi.GetBoundingBox().getLeft() + (this.contentWi.GetX() - this.contentWi.GetBoundingBox().getLeft()));
|
||
isOutOfBound = true;
|
||
} else {
|
||
var diff_rightX = this.wi.GetBoundingBox().getRight() - this.contentWi.GetBoundingBox().getRight();
|
||
var diff_leftX = this.contentWi.GetBoundingBox().getLeft() - this.wi.GetBoundingBox().getLeft();
|
||
isOutOfBound = diff_rightX > 0 || diff_leftX > 0;
|
||
if (isOutOfBound) {
|
||
if (elasticF && this.elasticF != 1) {
|
||
this.contentWi.SetX(C3.clamp(this.contentWi.GetX(), C3.lerp(this.contentWi.GetX(), this.contentWi.GetX() + diff_rightX, this.elasticF), C3.lerp(this.contentWi.GetX(), this.contentWi.GetX() - diff_leftX, this.elasticF)));
|
||
} else {
|
||
this.contentWi.SetX(C3.clamp(this.contentWi.GetX(), this.contentWi.GetX() + diff_rightX, this.contentWi.GetX() - diff_leftX));
|
||
}
|
||
}
|
||
}
|
||
this.contentWi.SetBboxChanged();
|
||
return isOutOfBound;
|
||
}
|
||
}
|
||
boundContentY(elasticF) {
|
||
if (this.isVScrollEnabled) {
|
||
var isOutOfBound;
|
||
this.contentWi.SetBboxChanged();
|
||
if (this.contentWi.GetHeight(true) <= this.wi.GetHeight(true)) {
|
||
this.contentWi.SetY(this.wi.GetBoundingBox().getTop() + (this.contentWi.GetY() - this.contentWi.GetBoundingBox().getTop()));
|
||
isOutOfBound = true;
|
||
} else {
|
||
var diff_topY = this.contentWi.GetBoundingBox().getTop() - this.wi.GetBoundingBox().getTop();
|
||
var diff_bottomY = this.wi.GetBoundingBox().getBottom() - this.contentWi.GetBoundingBox().getBottom();
|
||
isOutOfBound = diff_topY > 0 || diff_bottomY > 0;
|
||
if (isOutOfBound) {
|
||
if (elasticF && this.elasticF != 1) {
|
||
this.contentWi.SetY(C3.clamp(this.contentWi.GetY(), C3.lerp(this.contentWi.GetY(), this.contentWi.GetY() + diff_bottomY, this.elasticF), C3.lerp(this.contentWi.GetY(), this.contentWi.GetY() - diff_topY, this.elasticF)));
|
||
} else {
|
||
this.contentWi.SetY(C3.clamp(this.contentWi.GetY(), this.contentWi.GetY() + diff_bottomY, this.contentWi.GetY() - diff_topY));
|
||
}
|
||
}
|
||
}
|
||
this.contentWi.SetBboxChanged();
|
||
return isOutOfBound;
|
||
}
|
||
}
|
||
scrollTo(targetX, targetY, targetType, smooth) {
|
||
if (!this.isEnabled)
|
||
return;
|
||
this.scroll.scrollToSmooth = smooth;
|
||
this.scroll.scrollToTargetY = null;
|
||
this.scroll.scrollToTargetX = null;
|
||
this.scroll.scrollToX = false;
|
||
this.scroll.scrollToY = false;
|
||
this.onScrollToStarted = false;
|
||
if (this.isVScrollEnabled && this.isContentScrollableV) {
|
||
var viewportCenterY = (this.wi.GetBoundingBox().getTop() + this.wi.GetBoundingBox().getBottom()) / 2;
|
||
if (targetType) {
|
||
targetY = C3.clamp(targetY, 0, 1);
|
||
targetY = this.contentWi.GetBoundingBox().getTop() + targetY * this.contentWi.GetHeight(true);
|
||
}
|
||
this.scroll.scrollToTargetY = this.contentWi.GetY() + (viewportCenterY - targetY);
|
||
this.scroll.scrollToY = true;
|
||
this.scroll.isIdle = false;
|
||
this._StartTicking();
|
||
this.onScrollToStarted = true;
|
||
}
|
||
if (this.isHScrollEnabled && this.isContentScrollableH) {
|
||
var viewportCenterX = (this.wi.GetBoundingBox().getLeft() + this.wi.GetBoundingBox().getRight()) / 2;
|
||
if (targetType) {
|
||
targetX = C3.clamp(targetX, 0, 1);
|
||
targetX = this.contentWi.GetBoundingBox().getLeft() + targetX * this.contentWi.GetWidth(true);
|
||
}
|
||
this.scroll.scrollToTargetX = this.contentWi.GetX() + (viewportCenterX - targetX);
|
||
this.scroll.scrollToX = true;
|
||
this.scroll.isIdle = false;
|
||
this._StartTicking();
|
||
this.onScrollToStarted = true;
|
||
}
|
||
this.contentWi.SetBboxChanged();
|
||
}
|
||
scrollBy(distanceX, distanceY, targetType, smooth) {
|
||
if (!this.isEnabled)
|
||
return;
|
||
this.scroll.scrollToSmooth = smooth;
|
||
this.scroll.scrollToTargetY = null;
|
||
this.scroll.scrollToTargetX = null;
|
||
this.scroll.scrollToX = false;
|
||
this.scroll.scrollToY = false;
|
||
this.onScrollToStarted = false;
|
||
this.boundContent();
|
||
if (this.isVScrollEnabled && this.isContentScrollableV) {
|
||
if (targetType) {
|
||
distanceY = C3.clamp(distanceY, -1, 1);
|
||
distanceY = distanceY * this.contentWi.GetHeight(true);
|
||
}
|
||
this.scroll.scrollToTargetY = this.contentWi.GetY() - distanceY;
|
||
this.scroll.scrollToY = true;
|
||
this.scroll.isIdle = false;
|
||
this._StartTicking();
|
||
this.onScrollToStarted = true;
|
||
}
|
||
if (this.isHScrollEnabled && this.isContentScrollableH) {
|
||
if (targetType) {
|
||
distanceX = C3.clamp(distanceX, -1, 1);
|
||
distanceX = distanceX * this.contentWi.GetWidth(true);
|
||
}
|
||
this.scroll.scrollToTargetX = this.contentWi.GetX() - distanceX;
|
||
this.scroll.scrollToX = true;
|
||
this.scroll.isIdle = false;
|
||
this._StartTicking();
|
||
this.onScrollToStarted = true;
|
||
}
|
||
this.contentWi.SetBboxChanged();
|
||
}
|
||
boundSlider(slider) {
|
||
if (slider == "v" && this.vSlider && this.vScrollBar) {
|
||
var sy = this.vScrollBarWi.GetBoundingBox().getTop() + (this.vSliderWi.GetY() - this.vSliderWi.GetBoundingBox().getTop()) + (this.vScrollBarWi.GetHeight(true) - this.vSliderWi.GetHeight(true)) * ((this.contentWi.GetBoundingBox().getTop() - this.wi.GetBoundingBox().getTop()) / (this.wi.GetHeight(true) - this.contentWi.GetHeight(true)));
|
||
sy = C3.clamp(sy, this.vScrollBarWi.GetBoundingBox().getTop() + (this.vSliderWi.GetY() - this.vSliderWi.GetBoundingBox().getTop()), this.vScrollBarWi.GetBoundingBox().getBottom() - (this.vSliderWi.GetBoundingBox().getBottom() - this.vSliderWi.GetY()));
|
||
this.vSliderWi.SetY(sy);
|
||
this.vSliderWi.SetBboxChanged();
|
||
}
|
||
if (slider == "h" && this.hSlider && this.hScrollBar) {
|
||
var sx = this.hScrollBarWi.GetBoundingBox().getLeft() + (this.hSliderWi.GetX() - this.hSliderWi.GetBoundingBox().getLeft()) + (this.hScrollBarWi.GetWidth(true) - this.hSliderWi.GetWidth(true)) * ((this.contentWi.GetBoundingBox().getLeft() - this.wi.GetBoundingBox().getLeft()) / (this.wi.GetWidth(true) - this.contentWi.GetWidth(true)));
|
||
sx = C3.clamp(sx, this.hScrollBarWi.GetBoundingBox().getLeft() + (this.hSliderWi.GetX() - this.hSliderWi.GetBoundingBox().getLeft()), this.hScrollBarWi.GetBoundingBox().getRight() - (this.hSliderWi.GetBoundingBox().getRight() - this.hSliderWi.GetX()));
|
||
this.hSliderWi.SetX(sx);
|
||
this.hSliderWi.SetBboxChanged();
|
||
}
|
||
}
|
||
postGridviewUpdate() {
|
||
var parts = [this.vScrollBar, this.vSlider, this.hScrollBar, this.hSlider];
|
||
for (var i = 0, l = parts.length; i < l; i++) {
|
||
if (parts[i]) {
|
||
parts[i].GetSdkInstance().CallAction(parts[i].GetPlugin().constructor.Acts.MoveToTop);
|
||
}
|
||
}
|
||
}
|
||
OnSizeChanged() {
|
||
this.contentWi.SetBboxChanged();
|
||
this.boundContent();
|
||
this.boundSlider("v");
|
||
this.boundSlider("h");
|
||
this.isContentScrollableV = true;
|
||
this.isContentScrollableH = true;
|
||
if (this.contentWi.GetHeight(true) <= this.wi.GetHeight(true)) {
|
||
this.isContentScrollableV = false;
|
||
}
|
||
if (this.contentWi.GetWidth(true) <= this.wi.GetWidth(true)) {
|
||
this.isContentScrollableH = false;
|
||
}
|
||
}
|
||
isMoving() {
|
||
return this.isTouchMoving;
|
||
}
|
||
Tick() {
|
||
if (this.scroll.isIdle || !this.content || !this.isEnabled) {
|
||
this._StopTicking();
|
||
}
|
||
if (this.onTouchStarted && this.isSwipeScrollEnabled && !this.onSliderTouchStarted) {
|
||
if (this.isHScrollEnabled && this.isContentScrollableH) {
|
||
this.contentWi.SetX(this.touchX - this.scroll.offsetX);
|
||
}
|
||
if (this.isVScrollEnabled && this.isContentScrollableV) {
|
||
this.contentWi.SetY(this.touchY - this.scroll.offsetY);
|
||
}
|
||
this.contentWi.SetBboxChanged();
|
||
}
|
||
if (this.inertia) {
|
||
if (this.isHScrollEnabled && Math.abs(this.scroll.decelerationVelocityX) > 1) {
|
||
this.contentWi.OffsetX(this.scroll.decelerationVelocityX * this.runtime.GetDt(this.content));
|
||
this.scroll.decelerationVelocityX *= 0.95;
|
||
this.contentWi.SetBboxChanged();
|
||
}
|
||
if (this.isVScrollEnabled && Math.abs(this.scroll.decelerationVelocityY) > 1) {
|
||
this.contentWi.OffsetY(this.scroll.decelerationVelocityY * this.runtime.GetDt(this.content));
|
||
this.scroll.decelerationVelocityY *= 0.95;
|
||
this.contentWi.SetBboxChanged();
|
||
}
|
||
}
|
||
if (this.scroll.scrollToY && this.scroll.scrollToTargetY != null && this.isVScrollEnabled && this.isContentScrollableV && !this.onSliderTouchStarted) {
|
||
this.contentWi.SetY(C3.lerp(this.contentWi.GetY(), this.scroll.scrollToTargetY, this.scroll.scrollToSmooth));
|
||
if (this.boundContentY()) {
|
||
this.scroll.scrollToY = false;
|
||
this.boundContentY();
|
||
} else if (Math.abs(this.contentWi.GetY() - this.scroll.scrollToTargetY) < 1) {
|
||
this.contentWi.SetY(this.scroll.scrollToTargetY);
|
||
this.contentWi.SetBboxChanged();
|
||
this.scroll.scrollToY = false;
|
||
}
|
||
}
|
||
if (this.scroll.scrollToX && this.scroll.scrollToTargetX != null && this.isHScrollEnabled && this.isContentScrollableH && !this.onSliderTouchStarted) {
|
||
this.contentWi.SetX(C3.lerp(this.contentWi.GetX(), this.scroll.scrollToTargetX, this.scroll.scrollToSmooth));
|
||
if (this.boundContentX()) {
|
||
this.scroll.scrollToX = false;
|
||
this.boundContentX();
|
||
} else if (Math.abs(this.contentWi.GetX() - this.scroll.scrollToTargetX) < 1) {
|
||
this.contentWi.SetX(this.scroll.scrollToTargetX);
|
||
this.contentWi.SetBboxChanged();
|
||
this.scroll.scrollToX = false;
|
||
}
|
||
}
|
||
if (this.onScrollToStarted && !this.scroll.scrollToX && !this.scroll.scrollToY) {
|
||
this.scroll.isIdle = true;
|
||
this.onScrollToStarted = false;
|
||
}
|
||
if (this.isVScrollEnabled && this.isContentScrollableV) {
|
||
this.boundSlider("v");
|
||
}
|
||
if (this.isHScrollEnabled && this.isContentScrollableH) {
|
||
this.boundSlider("h");
|
||
}
|
||
if (this.isVScrollEnabled && !this.scroll.scrollToY) {
|
||
this.boundContentY(true);
|
||
}
|
||
if (this.isHScrollEnabled && !this.scroll.scrollToX) {
|
||
this.boundContentX(true);
|
||
}
|
||
if (!this.onTouchStarted && Math.abs(this.scroll.decelerationVelocityX) <= 1 && Math.abs(this.scroll.decelerationVelocityY) <= 1 && !this.scroll.scrollToX && !this.scroll.scrollToY) {
|
||
this.scroll.isIdle = true;
|
||
this.boundContent();
|
||
}
|
||
}
|
||
Release() {
|
||
this.aekiro_scrollViewManager.remove(this.GetObjectInstance());
|
||
this.goManager.eventManager.removeListener(this.SetForceOwnTextureListener);
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"isEnabled": this.isEnabled,
|
||
"direction": this.direction,
|
||
"isSwipeScrollEnabled": this.isSwipeScrollEnabled,
|
||
"isMouseScroll": this.isMouseScroll,
|
||
"inertia": this.inertia,
|
||
"movement": this.movement,
|
||
"contentUID": this.contentUID,
|
||
"vSliderUID": this.vSliderUID,
|
||
"vScrollBarUID": this.vScrollBarUID,
|
||
"hSliderUID": this.hSliderUID,
|
||
"hScrollBarUID": this.hScrollBarUID
|
||
};
|
||
}
|
||
LoadFromJson(o) {
|
||
this.isEnabled = o["isEnabled"];
|
||
this.direction = o["direction"];
|
||
this.isSwipeScrollEnabled = o["isSwipeScrollEnabled"];
|
||
this.isMouseScroll = o["isMouseScroll"];
|
||
this.inertia = o["inertia"];
|
||
this.movement = o["movement"];
|
||
this.contentUID = o["contentUID"];
|
||
this.vSliderUID = o["vSliderUID"];
|
||
this.vScrollBarUID = o["vScrollBarUID"];
|
||
this.hSliderUID = o["hSliderUID"];
|
||
this.hScrollBarUID = o["hScrollBarUID"];
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_scrollView.Cnds = {};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_scrollView.Acts = {
|
||
ScrollTo(targetX, targetY, targetType, smooth) {
|
||
this.scrollTo(targetX, targetY, targetType, smooth);
|
||
},
|
||
ScrollBy(distanceX, distanceY, targetType, smooth) {
|
||
this.scrollBy(distanceX, distanceY, targetType, smooth);
|
||
},
|
||
setEnabled(isEnabled) {
|
||
this.isEnabled = isEnabled;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_scrollView.Exps = {};
|
||
}
|
||
'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.DragnDrop = class DragnDropBehavior extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
const rt = this._runtime.Dispatcher();
|
||
this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "pointerdown", e=>this._OnPointerDown(e.data)),C3.Disposable.From(rt, "pointermove", e=>this._OnPointerMove(e.data)),C3.Disposable.From(rt, "pointerup", e=>this._OnPointerUp(e.data, false)),C3.Disposable.From(rt, "pointercancel", e=>this._OnPointerUp(e.data, true)))
|
||
}
|
||
Release() {
|
||
this._disposables.Release();
|
||
this._disposables = null;
|
||
super.Release()
|
||
}
|
||
_OnPointerDown(e) {
|
||
this._OnInputDown(e["pointerId"].toString(), e["pageX"] - this._runtime.GetCanvasClientX(), e["pageY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
_OnPointerMove(e) {
|
||
this._OnInputMove(e["pointerId"].toString(), e["pageX"] - this._runtime.GetCanvasClientX(), e["pageY"] - this._runtime.GetCanvasClientY())
|
||
}
|
||
_OnPointerUp(e, isCancel) {
|
||
this._OnInputUp(e["pointerId"].toString())
|
||
}
|
||
async _OnInputDown(src, clientX, clientY) {
|
||
const myInstances = this.GetInstances();
|
||
let topMost = null;
|
||
let topBehInst = null;
|
||
let topX = 0;
|
||
let topY = 0;
|
||
for (const inst of myInstances) {
|
||
const behInst = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.DragnDrop);
|
||
if (!behInst.IsEnabled() || behInst.IsDragging())
|
||
continue;
|
||
const wi = inst.GetWorldInfo();
|
||
const layer = wi.GetLayer();
|
||
const [lx,ly] = layer.CanvasCssToLayer(clientX, clientY, wi.GetTotalZElevation());
|
||
if (!wi.ContainsPoint(lx, ly))
|
||
continue;
|
||
if (!topMost) {
|
||
topMost = inst;
|
||
topBehInst = behInst;
|
||
topX = lx;
|
||
topY = ly;
|
||
continue
|
||
}
|
||
const topWi = topMost.GetWorldInfo();
|
||
if (layer.GetIndex() > topWi.GetLayer().GetIndex() || layer.GetIndex() === topWi.GetLayer().GetIndex() && wi.GetZIndex() > topWi.GetZIndex()) {
|
||
topMost = inst;
|
||
topBehInst = behInst;
|
||
topX = lx;
|
||
topY = ly
|
||
}
|
||
}
|
||
if (topMost)
|
||
await topBehInst._OnDown(src, topX, topY)
|
||
}
|
||
_OnInputMove(src, clientX, clientY) {
|
||
const myInstances = this.GetInstances();
|
||
for (const inst of myInstances) {
|
||
const behInst = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.DragnDrop);
|
||
if (!behInst.IsEnabled() || !behInst.IsDragging() || behInst.IsDragging() && behInst.GetDragSource() !== src)
|
||
continue;
|
||
const wi = inst.GetWorldInfo();
|
||
const layer = wi.GetLayer();
|
||
const [lx,ly] = layer.CanvasCssToLayer(clientX, clientY, wi.GetTotalZElevation());
|
||
behInst._OnMove(lx, ly)
|
||
}
|
||
}
|
||
async _OnInputUp(src) {
|
||
const myInstances = this.GetInstances();
|
||
for (const inst of myInstances) {
|
||
const behInst = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.DragnDrop);
|
||
if (behInst.IsDragging() && behInst.GetDragSource() === src)
|
||
await behInst._OnUp()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.DragnDrop.Type = class DragnDropType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
const AXES = 0;
|
||
const ENABLE = 1;
|
||
C3.Behaviors.DragnDrop.Instance = class DragnDropInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
this._isDragging = false;
|
||
this._dx = 0;
|
||
this._dy = 0;
|
||
this._dragSource = "<none>";
|
||
this._axes = 0;
|
||
this._isEnabled = true;
|
||
if (properties) {
|
||
this._axes = properties[AXES];
|
||
this._isEnabled = properties[ENABLE]
|
||
}
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"a": this._axes,
|
||
"e": this._isEnabled
|
||
}
|
||
}
|
||
LoadFromJson(o) {
|
||
this._axes = o["a"];
|
||
this._isEnabled = o["e"];
|
||
this._isDragging = false
|
||
}
|
||
IsEnabled() {
|
||
return this._isEnabled
|
||
}
|
||
IsDragging() {
|
||
return this._isDragging
|
||
}
|
||
GetDragSource() {
|
||
return this._dragSource
|
||
}
|
||
async _OnDown(src, x, y) {
|
||
const wi = this.GetWorldInfo();
|
||
this._dx = x - wi.GetX();
|
||
this._dy = y - wi.GetY();
|
||
this._isDragging = true;
|
||
this._dragSource = src;
|
||
await this.TriggerAsync(C3.Behaviors.DragnDrop.Cnds.OnDragStart)
|
||
}
|
||
_OnMove(x, y) {
|
||
const wi = this.GetWorldInfo();
|
||
const newX = x - this._dx;
|
||
const newY = y - this._dy;
|
||
if (this._axes === 0) {
|
||
if (wi.GetX() !== newX || wi.GetY() !== newY) {
|
||
wi.SetXY(newX, newY);
|
||
wi.SetBboxChanged()
|
||
}
|
||
} else if (this._axes === 1) {
|
||
if (wi.GetX() !== newX) {
|
||
wi.SetX(newX);
|
||
wi.SetBboxChanged()
|
||
}
|
||
} else if (this._axes === 2)
|
||
if (wi.GetY() !== newY) {
|
||
wi.SetY(newY);
|
||
wi.SetBboxChanged()
|
||
}
|
||
}
|
||
async _OnUp() {
|
||
this._isDragging = false;
|
||
await this.TriggerAsync(C3.Behaviors.DragnDrop.Cnds.OnDrop)
|
||
}
|
||
GetPropertyValueByIndex(index) {
|
||
switch (index) {
|
||
case AXES:
|
||
return this._axes;
|
||
case ENABLE:
|
||
return this._isEnabled
|
||
}
|
||
}
|
||
SetPropertyValueByIndex(index, value) {
|
||
switch (index) {
|
||
case AXES:
|
||
this._axes = value;
|
||
break;
|
||
case ENABLE:
|
||
this._isEnabled = !!value;
|
||
break
|
||
}
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "behaviors.dragndrop";
|
||
return [{
|
||
title: "$" + this.GetBehaviorType().GetName(),
|
||
properties: [{
|
||
name: prefix + ".debugger.is-dragging",
|
||
value: this._isDragging
|
||
}, {
|
||
name: prefix + ".properties.enabled.name",
|
||
value: this._isEnabled,
|
||
onedit: v=>this._isEnabled = v
|
||
}]
|
||
}]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.DragnDrop.Cnds = {
|
||
IsDragging() {
|
||
return this._isDragging
|
||
},
|
||
OnDragStart() {
|
||
return true
|
||
},
|
||
OnDrop() {
|
||
return true
|
||
},
|
||
IsEnabled() {
|
||
return this._isEnabled
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.DragnDrop.Acts = {
|
||
SetEnabled(e) {
|
||
this._isEnabled = !!e;
|
||
if (!this._isEnabled)
|
||
this._isDragging = false
|
||
},
|
||
SetAxes(a) {
|
||
this._axes = a
|
||
},
|
||
Drop() {
|
||
if (this._isDragging)
|
||
this._OnUp()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.DragnDrop.Exps = {}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Flash = class FlashBehavior extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Flash.Type = class FlashType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType)
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Flash.Instance = class FlashInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
this._onTime = 0;
|
||
this._offTime = 0;
|
||
this._stage = 0;
|
||
this._stageTimeLeft = 0;
|
||
this._timeLeft = 0;
|
||
this._StartTicking()
|
||
}
|
||
Release() {
|
||
super.Release()
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"on": this._onTime,
|
||
"off": this._offTime,
|
||
"s": this._stage,
|
||
"stl": this._stageTimeLeft,
|
||
"tl": this._timeLeft
|
||
}
|
||
}
|
||
LoadFromJson(o) {
|
||
this._onTime = o["on"];
|
||
this._offTime = o["off"];
|
||
this._stage = o["s"];
|
||
this._stageTimeLeft = o["stl"];
|
||
this._timeLeft = o["tl"] === null ? Infinity : o["tl"]
|
||
}
|
||
Tick() {
|
||
if (this._timeLeft <= 0)
|
||
return;
|
||
const dt = this._runtime.GetDt(this._inst);
|
||
this._timeLeft -= dt;
|
||
if (this._timeLeft <= 0) {
|
||
this._timeLeft = 0;
|
||
this._inst.GetWorldInfo().SetVisible(true);
|
||
this._runtime.UpdateRender();
|
||
return this.DebugTrigger(C3.Behaviors.Flash.Cnds.OnFlashEnded)
|
||
}
|
||
this._stageTimeLeft -= dt;
|
||
if (this._stageTimeLeft <= 0) {
|
||
if (this._stage === 0) {
|
||
this._inst.GetWorldInfo().SetVisible(false);
|
||
this._stage = 1;
|
||
this._stageTimeLeft += this._offTime
|
||
} else {
|
||
this._inst.GetWorldInfo().SetVisible(true);
|
||
this._stage = 0;
|
||
this._stageTimeLeft += this._onTime
|
||
}
|
||
this._runtime.UpdateRender()
|
||
}
|
||
}
|
||
GetDebuggerProperties() {
|
||
const prefix = "behaviors.flash.debugger";
|
||
return [{
|
||
title: "$" + this.GetBehaviorType().GetName(),
|
||
properties: [{
|
||
name: prefix + ".on-time",
|
||
value: this._onTime,
|
||
onedit: v=>this._onTime = v
|
||
}, {
|
||
name: prefix + ".off-time",
|
||
value: this._offTime,
|
||
onedit: v=>this._offTime = v
|
||
}, {
|
||
name: prefix + ".is-flashing",
|
||
value: this._timeLeft > 0
|
||
}, {
|
||
name: prefix + ".time-left",
|
||
value: this._timeLeft
|
||
}]
|
||
}]
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Flash.Cnds = {
|
||
IsFlashing() {
|
||
return this._timeLeft > 0
|
||
},
|
||
OnFlashEnded() {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Flash.Acts = {
|
||
Flash(on, off, dur) {
|
||
this._onTime = on;
|
||
this._offTime = off;
|
||
this._stage = 1;
|
||
this._stageTimeLeft = off;
|
||
this._timeLeft = dur;
|
||
this._inst.GetWorldInfo().SetVisible(false);
|
||
this._runtime.UpdateRender()
|
||
},
|
||
StopFlashing() {
|
||
this._timeLeft = 0;
|
||
this._inst.GetWorldInfo().SetVisible(true);
|
||
this._runtime.UpdateRender()
|
||
}
|
||
}
|
||
}
|
||
;'use strict';
|
||
{
|
||
const C3 = self.C3;
|
||
C3.Behaviors.Flash.Exps = {}
|
||
}
|
||
;"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_dialog = class aekiro_dialogBehavior extends C3.SDKBehaviorBase {
|
||
constructor(opts) {
|
||
super(opts);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_dialog.Type = class aekiro_dialogType extends C3.SDKBehaviorTypeBase {
|
||
constructor(behaviorType) {
|
||
super(behaviorType);
|
||
}
|
||
Release() {
|
||
super.Release();
|
||
}
|
||
OnCreate() {}
|
||
}
|
||
;
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_dialog.Instance = class aekiro_dialogInstance extends C3.SDKBehaviorInstanceBase {
|
||
constructor(behInst, properties) {
|
||
super(behInst);
|
||
if (properties) {
|
||
this.openAnimation = properties[0];
|
||
this.openAnimTweenFunction = properties[1];
|
||
this.openAnimDuration = properties[2];
|
||
this.openSound = properties[3];
|
||
this.closeAnimation = properties[4];
|
||
this.closeAnimTweenFunction = properties[5];
|
||
this.closeAnimDuration = properties[6];
|
||
this.closeSound = properties[7];
|
||
this.closeButtonUID = properties[8];
|
||
this.isModal = properties[9];
|
||
}
|
||
this.proui = this.GetRuntime().GetSingleGlobalObjectClassByCtor(C3.Plugins.aekiro_proui);
|
||
if (this.proui) {
|
||
this.proui = this.proui.GetSingleGlobalInstance().GetSdkInstance();
|
||
}
|
||
this.GetObjectInstance().GetUnsavedDataMap().aekiro_dialog = this;
|
||
this.wi = this.GetWorldInfo();
|
||
this.inst = this.GetObjectInstance();
|
||
this.aekiro_dialogManager = globalThis["aekiro_dialogManager"];
|
||
this.goManager = globalThis["aekiro_goManager"];
|
||
this.isInit = false;
|
||
this.isOpen = false;
|
||
this.tween = new self["TWEEN"]["Tween"]();
|
||
this.tween_opacity = new self["TWEEN"]["Tween"]();
|
||
this.tweenObject = {};
|
||
this.reverseTweenObject = {};
|
||
this.tweenFunctions = [self["TWEEN"]["Easing"]["Linear"]["None"], self["TWEEN"]["Easing"]["Quadratic"]["Out"], self["TWEEN"]["Easing"]["Quartic"]["Out"], self["TWEEN"]["Easing"]["Exponential"]["Out"], self["TWEEN"]["Easing"]["Circular"]["Out"], self["TWEEN"]["Easing"]["Back"]["Out"], self["TWEEN"]["Easing"]["Elastic"]["Out"], self["TWEEN"]["Easing"]["Bounce"]["Out"]];
|
||
this.goManager.eventManager.on("childrenRegistred", ()=>{
|
||
this.setCloseButton();
|
||
this.onCreateInit();
|
||
}
|
||
, {
|
||
"once": true
|
||
});
|
||
}
|
||
PostCreate() {
|
||
this.aekiro_gameobject = this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject;
|
||
}
|
||
onCreateInit() {
|
||
var map = this.GetObjectInstance().GetUnsavedDataMap();
|
||
if (!map.audioSources) {
|
||
map.audioSources = {};
|
||
}
|
||
this.audioSources = map.audioSources;
|
||
this.audioSources.open = new AudioSource(this.openSound,this.GetRuntime());
|
||
this.audioSources.close = new AudioSource(this.closeSound,this.GetRuntime());
|
||
this.setVisible(false);
|
||
this.wi.SetX(this.wi.GetLayer().GetViewport().getLeft());
|
||
this.wi.SetBboxChanged();
|
||
this.isInit = true;
|
||
}
|
||
setCloseButton() {
|
||
if (!this.closeButtonUID)
|
||
return;
|
||
this.closeButton = this.goManager.gos[this.closeButtonUID];
|
||
if (!this.closeButton) {
|
||
console.error("ProUI-Dialog: Close button not found; Please check its name !");
|
||
return;
|
||
}
|
||
if (!this.closeButton.GetUnsavedDataMap().aekiro_button) {
|
||
console.error("ProUI-Dialog: The close button needs to have a button behavior !");
|
||
return;
|
||
}
|
||
var self = this;
|
||
this.closeButton.GetUnsavedDataMap().aekiro_button.callbacks.push(function() {
|
||
self.close();
|
||
});
|
||
}
|
||
SetOwnScale(scale) {
|
||
var layers = this.getOutLayers();
|
||
layers.push(this.wi.GetLayer());
|
||
for (var i = 0, l = layers.length; i < l; i++) {
|
||
layers[i].SetOwnScale(scale);
|
||
}
|
||
}
|
||
SetOpacity(opacity) {
|
||
var layers = this.getOutLayers();
|
||
layers.push(this.wi.GetLayer());
|
||
for (var i = 0, l = layers.length; i < l; i++) {
|
||
layers[i].SetOpacity(opacity);
|
||
}
|
||
}
|
||
setVisible(isVisible) {
|
||
var layers = this.getOutLayers();
|
||
layers.push(this.wi.GetLayer());
|
||
for (var i = 0, l = layers.length; i < l; i++) {
|
||
layers[i].SetVisible(isVisible);
|
||
}
|
||
}
|
||
getOutLayers() {
|
||
var mylayer = this.wi.GetLayer();
|
||
var insts = this.aekiro_gameobject.hierarchyToArray();
|
||
var layers = [];
|
||
var layer;
|
||
for (var i = 0, l = insts.length; i < l; i++) {
|
||
layer = insts[i].GetWorldInfo().GetLayer();
|
||
if (layer != mylayer && layers.indexOf(layer) == -1) {
|
||
layers.push(layer);
|
||
}
|
||
}
|
||
return layers;
|
||
}
|
||
setInitialState(targetX, targetY, center) {
|
||
var initX, initY;
|
||
var viewport = this.wi.GetLayer().GetViewport();
|
||
if (this.openAnimation == 0 || this.openAnimation == 5 || this.openAnimation == 6) {
|
||
initX = targetX;
|
||
initY = targetY;
|
||
if (center) {
|
||
initY = (viewport.getTop() + viewport.getBottom()) / 2;
|
||
initX = (viewport.getLeft() + viewport.getRight()) / 2;
|
||
}
|
||
if (this.openAnimation == 5 || this.openAnimation == 6) {
|
||
if (this.openAnimation == 5) {
|
||
this.wi.GetLayer().SetOwnScale(2);
|
||
} else {
|
||
this.wi.GetLayer().SetOwnScale(0.2);
|
||
}
|
||
this.wi.GetLayer().SetOpacity(0);
|
||
}
|
||
} else if (this.openAnimation == 1) {
|
||
initY = viewport.getTop() - this.wi.GetHeight() / 2 - 100;
|
||
if (center) {
|
||
initX = (viewport.getLeft() + viewport.getRight()) / 2;
|
||
} else {
|
||
initX = targetX;
|
||
}
|
||
} else if (this.openAnimation == 2) {
|
||
initY = viewport.getBottom() + this.wi.GetHeight() / 2 + 100;
|
||
if (center) {
|
||
initX = (viewport.getLeft() + viewport.getRight()) / 2;
|
||
} else {
|
||
initX = targetX;
|
||
}
|
||
} else if (this.openAnimation == 3) {
|
||
initX = viewport.getRight() + this.wi.GetWidth() / 2 + 100;
|
||
if (center) {
|
||
initY = (viewport.getTop() + viewport.getBottom()) / 2;
|
||
} else {
|
||
initY = targetY;
|
||
}
|
||
} else if (this.openAnimation == 4) {
|
||
initX = viewport.getLeft() - this.wi.GetWidth() / 2 - 100;
|
||
if (center) {
|
||
initY = (viewport.getTop() + viewport.getBottom()) / 2;
|
||
} else {
|
||
initY = targetY;
|
||
}
|
||
}
|
||
this.wi.SetX(initX);
|
||
this.wi.SetY(initY);
|
||
this.wi.SetBboxChanged();
|
||
}
|
||
open(_targetX, _targetY, center) {
|
||
if (this.isOpen) {
|
||
return;
|
||
}
|
||
if (this.aekiro_dialogManager.isModalDialogOpened()) {
|
||
console.log("ProUI-Dialog: Can not open dialog because modal dialog is already opened");
|
||
return;
|
||
}
|
||
if (!this.isOpen && this.tween["isPlaying"]) {
|
||
this.tween["stop"]();
|
||
}
|
||
this.postClose();
|
||
this.aekiro_dialogManager.addDialog(this.GetObjectInstance());
|
||
this.isOpen = true;
|
||
this.Trigger(C3.Behaviors.aekiro_dialog.Cnds.onDialogOpened);
|
||
if (this.GetRuntime().GetTimeScale() != 1) {
|
||
this.aekiro_gameobject.setTimeScale(1);
|
||
}
|
||
this.setInitialState(_targetX, _targetY, center);
|
||
this.setVisible(true);
|
||
var targetX = _targetX;
|
||
var targetY = _targetY;
|
||
var viewport = this.wi.GetLayer().GetViewport();
|
||
if (center) {
|
||
targetX = (viewport.getLeft() + viewport.getRight()) / 2;
|
||
targetY = (viewport.getTop() + viewport.getBottom()) / 2;
|
||
}
|
||
if (this.openAnimDuration == 0) {
|
||
this.openAnimation = 0;
|
||
}
|
||
this.isScaleAnimation = false;
|
||
this.tweenObject.x = this.wi.GetX();
|
||
this.tweenObject.y = this.wi.GetY();
|
||
this.tweenObject.scale = this.wi.GetLayer().GetOwnScale();
|
||
this.tweenObject.opacity = this.wi.GetLayer().GetOpacity();
|
||
this.tween["setObject"](this.tweenObject);
|
||
this.tween["easing"](this.tweenFunctions[this.openAnimTweenFunction]);
|
||
this.tween["onComplete"](this.postOpen, this);
|
||
if (this.openAnimation == 1 || this.openAnimation == 2) {
|
||
this.tween["to"]({
|
||
y: targetY
|
||
}, this.openAnimDuration);
|
||
this.reverseTweenObject.y = this.wi.GetY();
|
||
} else if (this.openAnimation == 3 || this.openAnimation == 4) {
|
||
this.tween["to"]({
|
||
x: targetX
|
||
}, this.openAnimDuration);
|
||
this.reverseTweenObject.x = this.wi.GetX();
|
||
} else if (this.openAnimation == 5 || this.openAnimation == 6) {
|
||
this.tween["to"]({
|
||
scale: 1
|
||
}, this.openAnimDuration);
|
||
this.reverseTweenObject.scale = this.wi.GetLayer().GetOwnScale();
|
||
this.tween_opacity["setObject"](this.tweenObject);
|
||
this.tween_opacity["to"]({
|
||
opacity: 1
|
||
}, 300);
|
||
this.tween_opacity["easing"](self["TWEEN"]["Easing"]["Quartic"]["Out"]);
|
||
this.isScaleAnimation = true;
|
||
this.outLayers = this.getOutLayers();
|
||
}
|
||
if (this.openAnimation > 0) {
|
||
this.tween["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
this._StartTicking();
|
||
if (this.openAnimation == 5 || this.openAnimation == 6) {
|
||
this.tween_opacity["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
}
|
||
} else {
|
||
this.wi.SetXY(targetX, targetY);
|
||
this.wi.SetBboxChanged();
|
||
}
|
||
this.audioSources.open.play();
|
||
}
|
||
postOpen() {}
|
||
getCloseTargetPosition() {
|
||
var viewport = this.wi.GetLayer().GetViewport();
|
||
var X = this.wi.GetX();
|
||
var Y = this.wi.GetY();
|
||
if (this.closeAnimation == 2) {
|
||
Y = viewport.getBottom() + this.wi.GetHeight() / 2 + 100;
|
||
} else if (this.closeAnimation == 3) {
|
||
Y = viewport.getTop() - this.wi.GetHeight() / 2 - 100;
|
||
} else if (this.closeAnimation == 4) {
|
||
X = viewport.getLeft() - this.wi.GetWidth() / 2 - 100;
|
||
} else if (this.closeAnimation == 5) {
|
||
X = viewport.getRight() + this.wi.GetWidth() / 2 + 100;
|
||
}
|
||
return {
|
||
x: X,
|
||
y: Y
|
||
};
|
||
}
|
||
close() {
|
||
if (!this.isOpen || this.tween["isPlaying"]) {
|
||
return;
|
||
}
|
||
this.isOpen = false;
|
||
this.aekiro_dialogManager.removeDialog(this.GetObjectInstance());
|
||
this.Trigger(C3.Behaviors.aekiro_dialog.Cnds.onDialogClosed);
|
||
var target = this.getCloseTargetPosition();
|
||
var targetX = target.x;
|
||
var targetY = target.y;
|
||
if (this.closeAnimDuration == 0) {
|
||
this.closeAnimation = 0;
|
||
}
|
||
this.isScaleAnimation = false;
|
||
this.tweenObject.x = this.wi.GetX();
|
||
this.tweenObject.y = this.wi.GetY();
|
||
this.tweenObject.scale = this.wi.GetLayer().GetOwnScale();
|
||
this.tweenObject.opacity = this.wi.GetLayer().GetOpacity();
|
||
this.tween["setObject"](this.tweenObject);
|
||
this.tween["easing"](this.tweenFunctions[this.closeAnimTweenFunction]);
|
||
this.tween["onComplete"](this.postClose, this);
|
||
if (this.closeAnimation == 2 || this.closeAnimation == 3) {
|
||
this.tween["to"]({
|
||
y: targetY
|
||
}, this.closeAnimDuration);
|
||
} else if (this.closeAnimation == 4 || this.closeAnimation == 5) {
|
||
this.tween["to"]({
|
||
x: targetX
|
||
}, this.closeAnimDuration);
|
||
} else if (this.closeAnimation == 6 || this.closeAnimation == 7) {
|
||
if (this.closeAnimation == 6) {
|
||
this.tween["to"]({
|
||
scale: 0.2
|
||
}, this.closeAnimDuration);
|
||
} else {
|
||
this.tween["to"]({
|
||
scale: 2
|
||
}, this.closeAnimDuration);
|
||
}
|
||
this.tween_opacity["setObject"](this.tweenObject);
|
||
this.tween_opacity["to"]({
|
||
opacity: 0
|
||
}, 300);
|
||
this.tween_opacity["easing"](self["TWEEN"]["Easing"]["Quartic"]["Out"]);
|
||
this.isScaleAnimation = true;
|
||
this.outLayers = this.getOutLayers();
|
||
} else if (this.closeAnimation == 1) {
|
||
this.tween["to"](this.reverseTweenObject, this.openAnimDuration);
|
||
if (this.openAnimation == 5 || this.openAnimation == 6) {
|
||
this.isScaleAnimation = true;
|
||
this.tween_opacity["to"]({
|
||
opacity: 0
|
||
}, 300);
|
||
}
|
||
}
|
||
if (this.closeAnimation == 0 || (this.openAnimation == 0 && this.closeAnimation == 1)) {
|
||
this.postClose();
|
||
} else if (this.closeAnimation == 1) {
|
||
if (this.openAnimation == 5 || this.openAnimation == 6) {
|
||
this.tween_opacity["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
}
|
||
this.tween["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
this._StartTicking();
|
||
} else {
|
||
this.tween["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
if (this.closeAnimation == 6 || this.closeAnimation == 7) {
|
||
this.tween_opacity["start"](this.GetRuntime().GetWallTime() * 1000);
|
||
}
|
||
this._StartTicking();
|
||
}
|
||
this.audioSources.close.play();
|
||
}
|
||
postClose() {
|
||
var layer = this.wi.GetLayer();
|
||
var viewport = layer.GetViewport();
|
||
this.SetOwnScale(1);
|
||
this.SetOpacity(1);
|
||
this.setVisible(false);
|
||
var x = (viewport.getLeft() + viewport.getRight()) / 2;
|
||
var y = viewport.getTop() - this.wi.GetHeight() / 2 - 100;
|
||
this.wi.SetX(x);
|
||
this.wi.SetY(y);
|
||
this.wi.SetBboxChanged();
|
||
this._StopTicking();
|
||
}
|
||
Tick() {
|
||
var layer;
|
||
if (this.tween["isPlaying"]) {
|
||
this.tween["update"](this.GetRuntime().GetWallTime() * 1000);
|
||
if (this.isScaleAnimation) {
|
||
layer = this.wi.GetLayer();
|
||
layer.SetOwnScale(this.tweenObject.scale);
|
||
for (var i = 0, l = this.outLayers.length; i < l; i++) {
|
||
this.outLayers[i].SetOwnScale(this.tweenObject.scale);
|
||
}
|
||
} else {
|
||
this.wi.SetXY(this.tweenObject.x, this.tweenObject.y);
|
||
this.wi.SetBboxChanged();
|
||
}
|
||
}
|
||
if (this.tween_opacity["isPlaying"]) {
|
||
this.tween_opacity["update"](this.GetRuntime().GetWallTime() * 1000);
|
||
layer.SetOpacity(this.tweenObject.opacity);
|
||
for (var i = 0, l = this.outLayers.length; i < l; i++) {
|
||
this.outLayers[i].SetOpacity(this.tweenObject.opacity);
|
||
}
|
||
}
|
||
if (!this.tween["isPlaying"]) {
|
||
this._StopTicking();
|
||
}
|
||
}
|
||
Release() {
|
||
this.aekiro_dialogManager.removeDialog(this.GetObjectInstance());
|
||
super.Release();
|
||
}
|
||
SaveToJson() {
|
||
return {
|
||
"openAnimation": this.openAnimation,
|
||
"openAnimTweenFunction": this.openAnimTweenFunction,
|
||
"openAnimDuration": this.openAnimDuration,
|
||
"openSound": this.openSound,
|
||
"closeAnimation": this.closeAnimation,
|
||
"closeAnimTweenFunction": this.closeAnimTweenFunction,
|
||
"closeAnimDuration": this.closeAnimDuration,
|
||
"closeSound": this.closeSound,
|
||
"closeButtonUID": this.closeButtonUID,
|
||
"isModal": this.isModal
|
||
};
|
||
}
|
||
LoadFromJson(o) {
|
||
this.openAnimation = o["openAnimation"];
|
||
this.openAnimTweenFunction = o["openAnimTweenFunction"];
|
||
this.openAnimDuration = o["openAnimDuration"];
|
||
this.openSound = o["openSound"];
|
||
this.closeAnimation = o["closeAnimation"];
|
||
this.closeAnimTweenFunction = o["closeAnimTweenFunction"];
|
||
this.closeAnimDuration = o["closeAnimDuration"];
|
||
this.closeSound = o["closeSound"];
|
||
this.closeButtonUID = o["closeButtonUID"];
|
||
this.isModal = o["isModal"];
|
||
}
|
||
}
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_dialog.Cnds = {
|
||
onDialogOpened() {
|
||
return true;
|
||
},
|
||
onDialogClosed() {
|
||
return true;
|
||
},
|
||
isOpened() {
|
||
return this.isOpen;
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_dialog.Acts = {
|
||
Open(targetX, targetY, isCentered) {
|
||
this.open(targetX, targetY, isCentered);
|
||
},
|
||
Close() {
|
||
this.close();
|
||
},
|
||
SetOpenSoundVolume(v) {
|
||
this.audioSources.open.setVolume(v);
|
||
},
|
||
SetCloseSoundVolume(v) {
|
||
this.audioSources.close.setVolume(v);
|
||
}
|
||
};
|
||
}
|
||
"use strict";
|
||
{
|
||
C3.Behaviors.aekiro_dialog.Exps = {};
|
||
}
|
||
"use strict"
|
||
{
|
||
const C3 = self.C3;
|
||
self.C3_GetObjectRefTable = function() {
|
||
return [C3.Plugins.Spritefont2, C3.Behaviors.aekiro_gameobject, C3.Behaviors.MoveTo, C3.Behaviors.Fade, C3.Behaviors.aekiro_gridviewbind, C3.Behaviors.Pin, C3.Plugins.Sprite, C3.Behaviors.aekiro_button, C3.Behaviors.aekiro_checkbox, C3.Behaviors.aekiro_radiobutton, C3.Plugins.NinePatch, C3.Plugins.Arr, C3.Plugins.AJAX, C3.Plugins.Json, C3.Plugins.aekiro_proui, C3.Behaviors.aekiro_progress, C3.Behaviors.mcube_rexspline, C3.Behaviors.Timer, C3.Plugins.Touch, C3.Plugins.Mouse, C3.Plugins.Keyboard, C3.Plugins.Browser, C3.Behaviors.aekiro_radiogroup, C3.Behaviors.aekiro_gridView, C3.Behaviors.aekiro_scrollView, C3.Plugins.TiledBg, C3.Behaviors.DragnDrop, C3.Plugins.DrawingCanvas, C3.Behaviors.Flash, C3.Plugins.Audio, C3.Plugins.LocalStorage, C3.Plugins.CBhash, C3.Behaviors.aekiro_dialog, C3.Plugins.Sparsha_copyclip, C3.Plugins.Massive_Cube_Forge, C3.Plugins.TextBox, C3.Plugins.System.Cnds.OnLayoutStart, C3.Plugins.System.Acts.SetTimescale, C3.Plugins.aekiro_proui.Acts.Init, C3.Plugins.Spritefont2.Acts.SetText, C3.Plugins.Audio.Acts.StopAll, C3.ScriptsInEvents.Egame_Event1_Act5, C3.Plugins.Arr.Acts.SetX, C3.Plugins.Json.Acts.Parse, C3.Behaviors.aekiro_gridView.Acts.Clear, C3.Plugins.AJAX.Acts.RequestFile, C3.Plugins.System.Acts.MapFunction, C3.Plugins.System.Acts.SetLayerVisible, C3.Plugins.System.Acts.SetVar, C3.Plugins.Sprite.Acts.Destroy, C3.Plugins.DrawingCanvas.Acts.ClearCanvas, C3.Plugins.System.Exps.rgba, C3.Plugins.DrawingCanvas.Acts.PasteObject, C3.Plugins.Spritefont2.Acts.Destroy, C3.Plugins.System.Cnds.Compare, C3.Plugins.Audio.Acts.Play, C3.Plugins.System.Cnds.Else, C3.Plugins.System.Cnds.For, C3.Plugins.System.Exps.loopindex, C3.Plugins.System.Acts.CreateObject, C3.Plugins.System.Exps.int, C3.Plugins.System.Exps.tokenat, C3.Plugins.Sprite.Exps.Width, C3.Plugins.Sprite.Acts.SetInstanceVar, C3.Plugins.Sprite.Acts.SetAnimFrame, C3.Plugins.Sprite.Acts.MoveToTop, C3.Plugins.Spritefont2.Acts.MoveToTop, C3.Plugins.Sprite.Acts.AddChild, C3.Plugins.Sprite.Acts.SetPos, C3.Plugins.Arr.Exps.At, C3.Plugins.System.Cnds.IsGroupActive, C3.Plugins.System.Exps.random, C3.Plugins.System.Exps.tokencount, C3.Plugins.Json.Exps.Get, C3.Plugins.System.Acts.CreateObjectByName, C3.ScriptsInEvents.Egame_Event16_Act9, C3.Plugins.Sprite.Acts.SetOpacity, C3.Behaviors.aekiro_progress.Acts.SetMaxValue, C3.Behaviors.aekiro_progress.Acts.setValue, C3.Plugins.Sprite.Cnds.OnAnimFinished, C3.Plugins.Sprite.Acts.SetAnim, C3.Behaviors.mcube_rexspline.Cnds.OnHitTarget, C3.Behaviors.Timer.Cnds.OnTimer, C3.Plugins.Sprite.Cnds.OnDestroyed, C3.Plugins.Sprite.Acts.Spawn, C3.Behaviors.MoveTo.Acts.MoveToPosition, C3.Plugins.Spritefont2.Exps.X, C3.Plugins.Spritefont2.Exps.Y, C3.Plugins.System.Acts.AddVar, C3.Plugins.Sprite.Cnds.OnAnyAnimFinished, C3.Plugins.Touch.Cnds.OnTouchObject, C3.Plugins.Sprite.Cnds.IsBoolInstanceVarSet, C3.Plugins.System.Cnds.LayerVisible, C3.Plugins.Sprite.Acts.SetPosToObject, C3.Plugins.Sprite.Acts.StartAnim, C3.Plugins.Audio.Acts.PlayByName, C3.Plugins.System.Exps.choose, C3.Plugins.Mouse.Cnds.IsOverObject, C3.Plugins.Touch.Cnds.OnTapGestureObject, C3.Behaviors.aekiro_radiobutton.Cnds.OnClicked, C3.Behaviors.aekiro_gameobject.Cnds.IsName, C3.Plugins.Json.Exps.ArraySize, C3.Plugins.System.Cnds.PickAll, C3.Plugins.Sprite.Acts.SetEffectParam, C3.ScriptsInEvents.Egame_Event65_Act1, C3.Plugins.System.Acts.SetFunctionReturnValue, C3.Plugins.System.Exps.len, C3.ScriptsInEvents.Egame_Event67_Act3, C3.Plugins.System.Cnds.Repeat, C3.Plugins.System.Exps.left, C3.Plugins.System.Exps.right, C3.Plugins.Arr.Cnds.CompareXY, C3.Plugins.Arr.Acts.SetXY, C3.Plugins.Sprite.Cnds.PickByUID, C3.Plugins.Spritefont2.Acts.AppendText, C3.Plugins.NinePatch.Acts.SetSize, C3.Plugins.Spritefont2.Exps.TextWidth, C3.Plugins.Spritefont2.Exps.TextHeight, C3.Plugins.NinePatch.Acts.SetPosToObject, C3.Plugins.NinePatch.Acts.SetY, C3.Plugins.NinePatch.Exps.Y, C3.Plugins.NinePatch.Exps.Height, C3.Plugins.System.Exps.viewportheight, C3.Plugins.Spritefont2.Acts.SetPos, C3.Plugins.NinePatch.Exps.X, C3.Plugins.Sprite.Exps.AnimationFrame, C3.Plugins.NinePatch.Acts.MoveToTop, C3.Plugins.System.Cnds.CompareBoolVar, C3.Behaviors.Timer.Acts.StopTimer, C3.Behaviors.Timer.Acts.StartTimer, C3.Plugins.Spritefont2.Acts.SetY, C3.Plugins.Json.Acts.PushValue, C3.Plugins.Json.Acts.SetJSON, C3.Plugins.Json.Exps.GetAsCompactString, C3.Behaviors.aekiro_gridView.Acts.SetDataByJsonObject, C3.Plugins.System.Cnds.ForEach, C3.Plugins.NinePatch.Cnds.CompareInstanceVar, C3.Behaviors.aekiro_gameobject.Cnds.IsParentName, C3.Behaviors.aekiro_gameobject.Exps.parent, C3.Plugins.Sprite.Acts.SetVisible, C3.Plugins.Sprite.Cnds.IsVisible, C3.Plugins.Sprite.Cnds.CompareInstanceVar, C3.Plugins.Sprite.Acts.SetDefaultColor, C3.Behaviors.aekiro_button.Acts.setNormalColor, C3.Plugins.System.Exps.rgbex255, C3.ScriptsInEvents.Egame_Event193_Act1, C3.Plugins.Spritefont2.Acts.SetX, C3.Plugins.Sprite.Acts.SetX, C3.Plugins.Sprite.Exps.LayerName, C3.Behaviors.mcube_rexspline.Acts.AddPoint, C3.Behaviors.mcube_rexspline.Acts.Start, C3.Plugins.Arr.Cnds.ArrForEach, C3.Plugins.Arr.Cnds.CompareCurrent, C3.Plugins.Arr.Exps.CurX, C3.Plugins.System.Acts.WaitForPreviousActions, C3.Plugins.Json.Cnds.ForEach, C3.Plugins.Arr.Cnds.CompareX, C3.Plugins.Json.Exps.CurrentKey, C3.Behaviors.aekiro_gridviewbind.Cnds.OnGridViewRender, C3.Behaviors.aekiro_gridviewbind.Exps.get, C3.Behaviors.aekiro_button.Cnds.OnMouseEnter, C3.Plugins.Sprite.Exps.UID, C3.Behaviors.aekiro_button.Cnds.OnMouseLeave, C3.Plugins.Sprite.Acts.SubInstanceVar, C3.Plugins.Sprite.Acts.SetBoolInstanceVar, C3.Plugins.System.Cnds.CompareVar, C3.Plugins.Sprite.Exps.X, C3.Plugins.Sprite.Exps.Y, C3.Plugins.LocalStorage.Acts.SetItem, C3.Plugins.Massive_Cube_Forge.Exps.encodeb64, C3.Plugins.Arr.Exps.AsJSON, C3.Plugins.Sprite.Cnds.PickInstVarHiLow, C3.Behaviors.Pin.Acts.PinByProperties, C3.Plugins.Arr.Exps.Width, C3.Plugins.System.Acts.CallMappedFunction, C3.Behaviors.aekiro_button.Cnds.OnClicked, C3.Plugins.Sprite.Acts.SetY, C3.Plugins.Sprite.Acts.AddInstanceVar, C3.Plugins.NinePatch.Exps.Width, C3.Behaviors.aekiro_scrollView.Acts.ScrollBy, C3.Plugins.NinePatch.Acts.SetInstanceVar, C3.Plugins.System.Exps.callmapped, C3.Behaviors.aekiro_gridView.Cnds.OnRender, C3.Plugins.Arr.Acts.Clear, C3.Plugins.Spritefont2.Acts.SetScale, C3.Plugins.AJAX.Cnds.OnComplete, C3.Plugins.AJAX.Exps.LastData, C3.Plugins.Sprite.Cnds.IsOverlapping, C3.Behaviors.MoveTo.Cnds.IsMoving, C3.Plugins.System.Cnds.CompareBetween, C3.Behaviors.aekiro_checkbox.Cnds.OnClicked, C3.Behaviors.aekiro_checkbox.Cnds.IsChecked, C3.Plugins.Audio.Cnds.IsTagPlaying, C3.Plugins.Audio.Acts.SetPaused, C3.Behaviors.aekiro_dialog.Acts.Open, C3.Behaviors.aekiro_dialog.Acts.Close, C3.Behaviors.Fade.Acts.RestartFade, C3.Plugins.System.Acts.ResetGlobals, C3.Plugins.System.Acts.RestartLayout, C3.Plugins.TextBox.Cnds.CompareText, C3.Plugins.Massive_Cube_Forge.Exps.decodeb64, C3.Plugins.TextBox.Exps.Text, C3.Plugins.LocalStorage.Acts.GetItem, C3.Plugins.System.Cnds.Every, C3.Plugins.LocalStorage.Cnds.OnItemGet, C3.Plugins.Sparsha_copyclip.Acts.ApiCopy, C3.Plugins.LocalStorage.Exps.ItemValue, C3.Behaviors.aekiro_dialog.Cnds.onDialogOpened, C3.Plugins.CBhash.Cnds.OnHashed, C3.Plugins.Browser.Exps.Domain, C3.Plugins.Massive_Cube_Forge.Exps.MD5, C3.Plugins.LocalStorage.Acts.CheckItemExists, C3.Plugins.Browser.Acts.GoToURL, C3.Plugins.LocalStorage.Cnds.OnItemMissing, C3.ScriptsInEvents.Eloading_Event5_Act1, C3.Plugins.System.Acts.GoToLayout, C3.Plugins.LocalStorage.Cnds.OnItemExists, C3.Plugins.Arr.Acts.JSONLoad, C3.ScriptsInEvents.Eloaddata_Event3_Act19];
|
||
}
|
||
;
|
||
self.C3_JsPropNameTable = [{
|
||
Monster_Name_Sf: 0
|
||
}, {
|
||
HP_Monster: 0
|
||
}, {
|
||
MapName_Sf: 0
|
||
}, {
|
||
RequireMonster_Sf: 0
|
||
}, {
|
||
GameObject: 0
|
||
}, {
|
||
CoinShop_sf: 0
|
||
}, {
|
||
CoinTotal_sf: 0
|
||
}, {
|
||
DPS_sf: 0
|
||
}, {
|
||
General_Sf: 0
|
||
}, {
|
||
MoveTo: 0
|
||
}, {
|
||
Fade: 0
|
||
}, {
|
||
GoldDrop_Sf: 0
|
||
}, {
|
||
GridViewDataBind: 0
|
||
}, {
|
||
HIRE_Sf: 0
|
||
}, {
|
||
TimeBoss_Sf: 0
|
||
}, {
|
||
Pin: 0
|
||
}, {
|
||
HeroDescriptionDialog_sf: 0
|
||
}, {
|
||
HeroLevel_sf: 0
|
||
}, {
|
||
CoinTop_img: 0
|
||
}, {
|
||
music: 0
|
||
}, {
|
||
NextMap_Btn: 0
|
||
}, {
|
||
Setting_Icon: 0
|
||
}, {
|
||
Skull_Icon: 0
|
||
}, {
|
||
Sound_Icon: 0
|
||
}, {
|
||
pos: 0
|
||
}, {
|
||
posJSON: 0
|
||
}, {
|
||
idHero: 0
|
||
}, {
|
||
Bought: 0
|
||
}, {
|
||
requireLevel: 0
|
||
}, {
|
||
cost: 0
|
||
}, {
|
||
requireSkillUpdate: 0
|
||
}, {
|
||
description: 0
|
||
}, {
|
||
idSkill: 0
|
||
}, {
|
||
upgradeFunction: 0
|
||
}, {
|
||
nameSkill: 0
|
||
}, {
|
||
paramUpgrade: 0
|
||
}, {
|
||
Button: 0
|
||
}, {
|
||
Upgrade_Icon: 0
|
||
}, {
|
||
Achivement_Icon: 0
|
||
}, {
|
||
BorderLeft_Btn: 0
|
||
}, {
|
||
Checkbox: 0
|
||
}, {
|
||
CheckBoxSound_Btn: 0
|
||
}, {
|
||
RadioButton: 0
|
||
}, {
|
||
Tab_Btn: 0
|
||
}, {
|
||
bgMap: 0
|
||
}, {
|
||
BorderGamePad: 0
|
||
}, {
|
||
BorderGamePad2: 0
|
||
}, {
|
||
borderHudTop: 0
|
||
}, {
|
||
level: 0
|
||
}, {
|
||
id: 0
|
||
}, {
|
||
baseDPS: 0
|
||
}, {
|
||
baseClick: 0
|
||
}, {
|
||
baseCost: 0
|
||
}, {
|
||
costFormula: 0
|
||
}, {
|
||
hero: 0
|
||
}, {
|
||
HeroName_sf: 0
|
||
}, {
|
||
currentCost: 0
|
||
}, {
|
||
idHeroJSON: 0
|
||
}, {
|
||
BuyHero_Btn: 0
|
||
}, {
|
||
BgCharacter: 0
|
||
}, {
|
||
Array_Hero: 0
|
||
}, {
|
||
Array_SkillUpgrade: 0
|
||
}, {
|
||
Array_UI_Upgrade: 0
|
||
}, {
|
||
AJAX: 0
|
||
}, {
|
||
JSON: 0
|
||
}, {
|
||
JSON_All: 0
|
||
}, {
|
||
JSON_HeroShop: 0
|
||
}, {
|
||
JSON_Achievement: 0
|
||
}, {
|
||
Array_DataSave: 0
|
||
}, {
|
||
dead: 0
|
||
}, {
|
||
killed: 0
|
||
}, {
|
||
Boss: 0
|
||
}, {
|
||
monster1: 0
|
||
}, {
|
||
monster10: 0
|
||
}, {
|
||
monster11: 0
|
||
}, {
|
||
monster12: 0
|
||
}, {
|
||
monster13: 0
|
||
}, {
|
||
monster14: 0
|
||
}, {
|
||
monster15: 0
|
||
}, {
|
||
monster16: 0
|
||
}, {
|
||
monster17: 0
|
||
}, {
|
||
monster18: 0
|
||
}, {
|
||
monster19: 0
|
||
}, {
|
||
monster2: 0
|
||
}, {
|
||
monster20: 0
|
||
}, {
|
||
monster21: 0
|
||
}, {
|
||
monster22: 0
|
||
}, {
|
||
monster23: 0
|
||
}, {
|
||
monster24: 0
|
||
}, {
|
||
monster25: 0
|
||
}, {
|
||
monster26: 0
|
||
}, {
|
||
monster27: 0
|
||
}, {
|
||
monster28: 0
|
||
}, {
|
||
monster29: 0
|
||
}, {
|
||
monster3: 0
|
||
}, {
|
||
monster30: 0
|
||
}, {
|
||
monster31: 0
|
||
}, {
|
||
monster32: 0
|
||
}, {
|
||
monster33: 0
|
||
}, {
|
||
monster34: 0
|
||
}, {
|
||
monster35: 0
|
||
}, {
|
||
monster36: 0
|
||
}, {
|
||
monster37: 0
|
||
}, {
|
||
monster38: 0
|
||
}, {
|
||
monster39: 0
|
||
}, {
|
||
monster4: 0
|
||
}, {
|
||
monster40: 0
|
||
}, {
|
||
monster41: 0
|
||
}, {
|
||
monster42: 0
|
||
}, {
|
||
monster43: 0
|
||
}, {
|
||
monster44: 0
|
||
}, {
|
||
monster45: 0
|
||
}, {
|
||
monster46: 0
|
||
}, {
|
||
monster47: 0
|
||
}, {
|
||
monster48: 0
|
||
}, {
|
||
monster49: 0
|
||
}, {
|
||
monster5: 0
|
||
}, {
|
||
monster50: 0
|
||
}, {
|
||
monster51: 0
|
||
}, {
|
||
monster52: 0
|
||
}, {
|
||
monster53: 0
|
||
}, {
|
||
monster54: 0
|
||
}, {
|
||
monster55: 0
|
||
}, {
|
||
monster56: 0
|
||
}, {
|
||
monster57: 0
|
||
}, {
|
||
monster58: 0
|
||
}, {
|
||
monster59: 0
|
||
}, {
|
||
monster6: 0
|
||
}, {
|
||
monster60: 0
|
||
}, {
|
||
monster61: 0
|
||
}, {
|
||
monster62: 0
|
||
}, {
|
||
monster63: 0
|
||
}, {
|
||
monster64: 0
|
||
}, {
|
||
monster65: 0
|
||
}, {
|
||
monster66: 0
|
||
}, {
|
||
monster67: 0
|
||
}, {
|
||
monster68: 0
|
||
}, {
|
||
monster69: 0
|
||
}, {
|
||
monster7: 0
|
||
}, {
|
||
monster70: 0
|
||
}, {
|
||
monster71: 0
|
||
}, {
|
||
monster72: 0
|
||
}, {
|
||
monster73: 0
|
||
}, {
|
||
monster74: 0
|
||
}, {
|
||
monster75: 0
|
||
}, {
|
||
monster76: 0
|
||
}, {
|
||
monster77: 0
|
||
}, {
|
||
monster78: 0
|
||
}, {
|
||
monster79: 0
|
||
}, {
|
||
monster8: 0
|
||
}, {
|
||
monster80: 0
|
||
}, {
|
||
monster81: 0
|
||
}, {
|
||
monster82: 0
|
||
}, {
|
||
monster83: 0
|
||
}, {
|
||
monster84: 0
|
||
}, {
|
||
monster85: 0
|
||
}, {
|
||
monster9: 0
|
||
}, {
|
||
template: 0
|
||
}, {
|
||
ProUI: 0
|
||
}, {
|
||
up: 0
|
||
}, {
|
||
Up_Scroll: 0
|
||
}, {
|
||
Bar_Scroll: 0
|
||
}, {
|
||
Bar_Btn: 0
|
||
}, {
|
||
TopHP_monster: 0
|
||
}, {
|
||
borderHP: 0
|
||
}, {
|
||
curValue: 0
|
||
}, {
|
||
maxHP: 0
|
||
}, {
|
||
isBoss: 0
|
||
}, {
|
||
Gold: 0
|
||
}, {
|
||
baseSize: 0
|
||
}, {
|
||
dieSound: 0
|
||
}, {
|
||
Progress: 0
|
||
}, {
|
||
barGreen: 0
|
||
}, {
|
||
UpLevel_Eff: 0
|
||
}, {
|
||
Critical_Click: 0
|
||
}, {
|
||
coinValue: 0
|
||
}, {
|
||
Spline: 0
|
||
}, {
|
||
Timer: 0
|
||
}, {
|
||
CoinDrop: 0
|
||
}, {
|
||
Mapmini_Bg: 0
|
||
}, {
|
||
MapBorder_btn: 0
|
||
}, {
|
||
levelMap: 0
|
||
}, {
|
||
MapLv_Btn: 0
|
||
}, {
|
||
MapLevel_Sf: 0
|
||
}, {
|
||
Prevent: 0
|
||
}, {
|
||
Touch: 0
|
||
}, {
|
||
Mouse: 0
|
||
}, {
|
||
Keyboard: 0
|
||
}, {
|
||
Browser: 0
|
||
}, {
|
||
RadioGroup: 0
|
||
}, {
|
||
MapBtn_RadioGroup: 0
|
||
}, {
|
||
ClickDmg_sf: 0
|
||
}, {
|
||
DmgFly_Sf: 0
|
||
}, {
|
||
CoinShop_img: 0
|
||
}, {
|
||
TabBtn_RadioGroup: 0
|
||
}, {
|
||
GridView: 0
|
||
}, {
|
||
GridViewachivement: 0
|
||
}, {
|
||
ScrollView: 0
|
||
}, {
|
||
GridViewShop: 0
|
||
}, {
|
||
Check_Icon: 0
|
||
}, {
|
||
NewMap_Icon: 0
|
||
}, {
|
||
ToolTip: 0
|
||
}, {
|
||
DialogHero: 0
|
||
}, {
|
||
GridViewMap: 0
|
||
}, {
|
||
FadeBuyBtn: 0
|
||
}, {
|
||
DragDrop: 0
|
||
}, {
|
||
TestWidth: 0
|
||
}, {
|
||
DialogSkill: 0
|
||
}, {
|
||
SkillDescriptionDialog_sf: 0
|
||
}, {
|
||
Clock_Icon: 0
|
||
}, {
|
||
JSON2: 0
|
||
}, {
|
||
MapBtnPanel: 0
|
||
}, {
|
||
DrawingCanvas: 0
|
||
}, {
|
||
Flash: 0
|
||
}, {
|
||
CompleteArea_sf: 0
|
||
}, {
|
||
SkillUpgrade_sf: 0
|
||
}, {
|
||
Audio: 0
|
||
}, {
|
||
EnterMap_Sf: 0
|
||
}, {
|
||
Achivement_sf: 0
|
||
}, {
|
||
Array_Achievement: 0
|
||
}, {
|
||
BgAchivement: 0
|
||
}, {
|
||
DialogAchievement: 0
|
||
}, {
|
||
AchievementDecription_sf: 0
|
||
}, {
|
||
Array_Map_Pos: 0
|
||
}, {
|
||
LocalStorage: 0
|
||
}, {
|
||
CBHash: 0
|
||
}, {
|
||
Setting_Btn: 0
|
||
}, {
|
||
Dialog: 0
|
||
}, {
|
||
Setting_Dialog: 0
|
||
}, {
|
||
CloseIcon: 0
|
||
}, {
|
||
GameSettingBottomtxt: 0
|
||
}, {
|
||
Copyclip: 0
|
||
}, {
|
||
Forge: 0
|
||
}, {
|
||
InputImport: 0
|
||
}, {
|
||
TestSprite: 0
|
||
}, {
|
||
MapBG: 0
|
||
}, {
|
||
Monster_fml: 0
|
||
}, {
|
||
Btn_fml: 0
|
||
}, {
|
||
MapBtn_fml: 0
|
||
}, {
|
||
Family1: 0
|
||
}, {
|
||
MapMember: 0
|
||
}, {
|
||
monsterKilledInMap: 0
|
||
}, {
|
||
requireMonster: 0
|
||
}, {
|
||
st1: 0
|
||
}, {
|
||
urlHome: 0
|
||
}, {
|
||
posMonster: 0
|
||
}, {
|
||
spacingMapBtn: 0
|
||
}, {
|
||
widthCoinTop: 0
|
||
}, {
|
||
posCoinTotal: 0
|
||
}, {
|
||
posDialogHeroX: 0
|
||
}, {
|
||
posCenterMapBtn: 0
|
||
}, {
|
||
posBtnMap: 0
|
||
}, {
|
||
posBtnBuyHero: 0
|
||
}, {
|
||
maxIdMonster: 0
|
||
}, {
|
||
clickPerSecond: 0
|
||
}, {
|
||
timeBoss: 0
|
||
}, {
|
||
currentDPS: 0
|
||
}, {
|
||
hasNewLevel: 0
|
||
}, {
|
||
stringMonster: 0
|
||
}, {
|
||
bossId: 0
|
||
}, {
|
||
widthCoinShopHero: 0
|
||
}, {
|
||
coinImgWidth: 0
|
||
}, {
|
||
COIN_DISSAPEAR: 0
|
||
}, {
|
||
currentMap: 0
|
||
}, {
|
||
soundOn: 0
|
||
}, {
|
||
soundEffect: 0
|
||
}, {
|
||
clickDamage: 0
|
||
}, {
|
||
clickMultiplier: 0
|
||
}, {
|
||
allDpsMultiplier: 0
|
||
}, {
|
||
goldMultiplier: 0
|
||
}, {
|
||
abaddonMultiplier: 0
|
||
}, {
|
||
clickDpsPercent: 0
|
||
}, {
|
||
reachedMap: 0
|
||
}, {
|
||
totalClick: 0
|
||
}, {
|
||
currentCoin: 0
|
||
}, {
|
||
totalGoldReceive: 0
|
||
}, {
|
||
CurrentHero: 0
|
||
}, {
|
||
totalKills: 0
|
||
}, {
|
||
totalBossKills: 0
|
||
}, {
|
||
totalUpgrades: 0
|
||
}, {
|
||
totalHeroLevels: 0
|
||
}, {
|
||
mostClicksPerSecond: 0
|
||
}, {
|
||
idMonster: 0
|
||
}, {
|
||
hpMonster: 0
|
||
}, {
|
||
levelMonster: 0
|
||
}, {
|
||
baseLife: 0
|
||
}, {
|
||
lengthNumber: 0
|
||
}, {
|
||
offsetNumber: 0
|
||
}, {
|
||
remainNumber: 0
|
||
}, {
|
||
returnString: 0
|
||
}, {
|
||
startString: 0
|
||
}, {
|
||
numberFormat: 0
|
||
}, {
|
||
lengthLimit: 0
|
||
}, {
|
||
numberCoin: 0
|
||
}, {
|
||
returnCost: 0
|
||
}, {
|
||
factorMultiply: 0
|
||
}, {
|
||
valueIncrease: 0
|
||
}, {
|
||
param: 0
|
||
}, {
|
||
baseAttack: 0
|
||
}, {
|
||
NameHero: 0
|
||
}, {
|
||
NameSkill2: 0
|
||
}, {
|
||
Description: 0
|
||
}, {
|
||
price: 0
|
||
}, {
|
||
requireSkill: 0
|
||
}, {
|
||
uidSkillIcon: 0
|
||
}, {
|
||
PosY: 0
|
||
}, {
|
||
NameAchieve: 0
|
||
}, {
|
||
uidAchiIcon: 0
|
||
}, {
|
||
currentLevel: 0
|
||
}, {
|
||
baseDps: 0
|
||
}, {
|
||
idHeroJS: 0
|
||
}, {
|
||
shouldShow: 0
|
||
}, {
|
||
stringCoin: 0
|
||
}, {
|
||
direction: 0
|
||
}, {
|
||
distanceMove: 0
|
||
}, {
|
||
dmg: 0
|
||
}, {
|
||
Parameter0: 0
|
||
}, {
|
||
Parameter1: 0
|
||
}, {
|
||
Parameter2: 0
|
||
}, {
|
||
func: 0
|
||
}, {
|
||
mapOneZone: 0
|
||
}, {
|
||
directionCoin: 0
|
||
}, {
|
||
spacing: 0
|
||
}, {
|
||
newMap: 0
|
||
}, {
|
||
tempDPS: 0
|
||
}, {
|
||
FunctionCall: 0
|
||
}, {
|
||
mapFunction: 0
|
||
}, {
|
||
WidthTotal: 0
|
||
}, {
|
||
idUpgrade: 0
|
||
}, {
|
||
testValueNumpad: 0
|
||
}, {
|
||
testValue3: 0
|
||
}, {
|
||
testValueUp: 0
|
||
}, {
|
||
st2: 0
|
||
}, {
|
||
stringDomain: 0
|
||
}, {
|
||
st3: 0
|
||
}, {
|
||
stringData: 0
|
||
}];
|
||
}
|
||
"use strict";
|
||
{
|
||
const C3 = self.C3;
|
||
function unaryminus(n) {
|
||
return (typeof n === "number" ? -n : n);
|
||
}
|
||
function bothNumbers(a, b) {
|
||
return typeof a === "number" && typeof b === "number";
|
||
}
|
||
function add(l, r) {
|
||
if (bothNumbers(l, r))
|
||
return l + r;
|
||
else
|
||
return l;
|
||
}
|
||
function subtract(l, r) {
|
||
if (bothNumbers(l, r))
|
||
return l - r;
|
||
else
|
||
return l;
|
||
}
|
||
function multiply(l, r) {
|
||
if (bothNumbers(l, r))
|
||
return l * r;
|
||
else
|
||
return l;
|
||
}
|
||
function divide(l, r) {
|
||
if (bothNumbers(l, r))
|
||
return l / r;
|
||
else
|
||
return l;
|
||
}
|
||
function mod(l, r) {
|
||
if (bothNumbers(l, r))
|
||
return l % r;
|
||
else
|
||
return l;
|
||
}
|
||
function pow(l, r) {
|
||
if (bothNumbers(l, r))
|
||
return Math.pow(l, r);
|
||
else
|
||
return l;
|
||
}
|
||
function and(l, r) {
|
||
if (typeof l === "string" || typeof r === "string") {
|
||
let lstr, rstr;
|
||
if (typeof l === "number")
|
||
lstr = (Math.round(l * 1e10) / 1e10).toString();
|
||
else
|
||
lstr = l;
|
||
if (typeof r === "number")
|
||
rstr = (Math.round(r * 1e10) / 1e10).toString();
|
||
else
|
||
rstr = r;
|
||
return lstr + rstr;
|
||
} else {
|
||
return (l && r ? 1 : 0);
|
||
}
|
||
}
|
||
function or(l, r) {
|
||
if (bothNumbers(l, r))
|
||
return (l || r ? 1 : 0);
|
||
else
|
||
return l;
|
||
}
|
||
self.C3_ExpressionFuncs = [()=>1, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>(f0(Math.floor((f1() * v2.GetValue()))) + " Click Damage");
|
||
}
|
||
, ()=>0, ()=>"870, 384", ()=>2, ()=>"872, 378", ()=>3, ()=>"855, 375", ()=>4, ()=>"857, 381", ()=>5, ()=>"876, 378", ()=>6, ()=>"893, 417", ()=>7, ()=>"898, 410", ()=>8, ()=>"898, 412", ()=>9, ()=>"895, 415", ()=>10, ()=>11, ()=>"820, 358", ()=>12, ()=>13, ()=>"823, 362", ()=>14, ()=>15, ()=>16, ()=>"849, 574", ()=>17, ()=>"854, 565", ()=>18, ()=>19, ()=>20, ()=>21, ()=>"850, 473", ()=>22, ()=>23, ()=>24, ()=>25, ()=>26, ()=>"868, 332", ()=>27, ()=>28, ()=>"863, 327", ()=>29, ()=>30, ()=>31, ()=>"853, 456", ()=>32, ()=>"860, 457", ()=>33, ()=>34, ()=>35, ()=>36, ()=>"847, 395", ()=>37, ()=>38, ()=>39, ()=>40, ()=>41, ()=>"857, 385", ()=>42, ()=>43, ()=>44, ()=>45, ()=>"[]", ()=>"data", ()=>"", ()=>"heroCostFormula1", ()=>"skill", ()=>"upgradeClickPercent", ()=>"upgradeHeroPercent", ()=>"upgradeEveryonePercent", ()=>"upgradeGoldFoundPercent", ()=>"upgradeAbaddon", ()=>"Import", p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
return ()=>f0(0, 0, 0, 0);
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>v0.GetValue();
|
||
}
|
||
, ()=>"bg", ()=>"RequireMonster", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>and(and(v0.GetValue(), "/"), v1.GetValue());
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
return ()=>f0();
|
||
}
|
||
, ()=>"HUD", p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
const v3 = p._GetNode(3).GetVar();
|
||
const f4 = p._GetNode(4).GetBoundMethod();
|
||
const n5 = p._GetNode(5);
|
||
const v6 = p._GetNode(6).GetVar();
|
||
return ()=>(f0(f1(v2.GetValue(), 0, ",")) - ((v3.GetValue() - f4()) * (n5.ExpObject() + v6.GetValue())));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>f0(f1(v2.GetValue(), 1, ","));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(((v0.GetValue() - 1) % 45) + 1);
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
const n2 = p._GetNode(2);
|
||
const v3 = p._GetNode(3).GetVar();
|
||
return ()=>f0(f1(n2.ExpObject((((v3.GetValue() - 1) % 45) + 1)), 0, ","));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
const n2 = p._GetNode(2);
|
||
const v3 = p._GetNode(3).GetVar();
|
||
return ()=>f0(f1(n2.ExpObject((((v3.GetValue() - 1) % 45) + 1)), 1, ","));
|
||
}
|
||
, ()=>"ANIMATION_HANDLE", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() % 5);
|
||
}
|
||
, ()=>"TimerBoss", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>and(v0.GetValue(), " sec");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const f2 = p._GetNode(2).GetBoundMethod();
|
||
const f3 = p._GetNode(3).GetBoundMethod();
|
||
const v4 = p._GetNode(4).GetVar();
|
||
return ()=>f0(v1.GetValue(), Math.floor(f2(f3(v4.GetValue(), ","))), ",");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const f2 = p._GetNode(2).GetBoundMethod();
|
||
const v3 = p._GetNode(3).GetVar();
|
||
const v4 = p._GetNode(4).GetVar();
|
||
return ()=>((((v0.GetValue()) > (v1.GetValue()) ? 1 : 0)) ? (Math.floor(f2(v3.GetValue()))) : (v4.GetValue()));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>((((v0.GetValue()) === (1) ? 1 : 0)) ? (v1.GetValue()) : (v2.GetValue()));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>n0.ExpObject((and("monsters.", v1.GetValue()) + ".baseLife"));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>((((v0.GetValue()) <= (0) ? 1 : 0)) ? (10) : (v1.GetValue()));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>and("monster", v0.GetValue());
|
||
}
|
||
, ()=>"Game", p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>f0(f1(v2.GetValue(), 0, ","));
|
||
}
|
||
, ()=>100, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>n0.ExpObject((and("monsters.", v1.GetValue()) + ".baseSize"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>n0.ExpObject((and("monsters.", v1.GetValue()) + ".dieSoundId"));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>Math.ceil(((v0.GetValue() / 15) * v1.GetValue()));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
const n2 = p._GetNode(2);
|
||
return ()=>((((n0.ExpInstVar()) === (0) ? 1 : 0)) ? ("Dead") : ((f1(Math.floor(n2.ExpInstVar())) + " HP")));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>and(and(n0.ExpObject((and("monsters.", v1.GetValue()) + ".name")), ", Lvl "), v2.GetValue());
|
||
}
|
||
, ()=>"dmg", ()=>"idle", ()=>"died", ()=>"Drop", ()=>"Effect", p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(and("+ ", Math.floor(n0.ExpInstVar())) + " Gold");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject();
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(n0.ExpObject() - 50);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpInstVar();
|
||
}
|
||
, ()=>"gold", ()=>"totalGold", ()=>"effect", ()=>"TOUCH_CTRL", ()=>"Setting", p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>Math.floor((f0() * v1.GetValue()));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>(f0() * v1.GetValue());
|
||
}
|
||
, ()=>"totalClicks", p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
return ()=>and("hit", f0(1, 2, 3));
|
||
}
|
||
, ()=>"TAB_HANDLE", ()=>"TabAchivements", ()=>"AchivementTab", ()=>"HeroTab", ()=>"BarScroll", ()=>"SubHeroTab", p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject("");
|
||
}
|
||
, ()=>"HEALTH_BAR", ()=>"AdjustHSL", p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>((n0.ExpObject() / 139) * 30);
|
||
}
|
||
, ()=>"FUNCTION", ()=>"FORMAT", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>Math.floor(v0.GetValue());
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>f0((v1.GetValue()).toString());
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>Math.floor((v0.GetValue() / 3));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>f0(v1.GetValue(), (v2.GetValue() % 3));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
const v3 = p._GetNode(3).GetVar();
|
||
return ()=>f0(v1.GetValue(), (v2.GetValue() - (v3.GetValue() % 3)));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>f0(v1.GetValue());
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>((v0.GetValue() + ",") + f1(v2.GetValue(), 3));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>f0(v1.GetValue(), (v2.GetValue() - 3));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() + "K");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() + "M");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() + "B");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() + "T");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() + "q");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() + "Q");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() + "s");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() + "S");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(Math.floor(((v0.GetValue() - 1) / 3)) + 1);
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
const v3 = p._GetNode(3).GetVar();
|
||
return ()=>f0(v1.GetValue(), (((((v2.GetValue() % 3)) === (0) ? 1 : 0)) ? (3) : ((v3.GetValue() % 3))));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
const v3 = p._GetNode(3).GetVar();
|
||
const v4 = p._GetNode(4).GetVar();
|
||
return ()=>f0(v1.GetValue(), (((((v2.GetValue() - (v3.GetValue() % 3))) === (0) ? 1 : 0)) ? (3) : ((v4.GetValue() % 3))));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue()).toString();
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
const v3 = p._GetNode(3).GetVar();
|
||
const v4 = p._GetNode(4).GetVar();
|
||
return ()=>(f0(v1.GetValue(), ((((v2.GetValue()) < (3) ? 1 : 0)) ? (v3.GetValue()) : (3))) + v4.GetValue());
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
const v3 = p._GetNode(3).GetVar();
|
||
const v4 = p._GetNode(4).GetVar();
|
||
return ()=>((f0(v1.GetValue(), ((((v2.GetValue()) < (3) ? 1 : 0)) ? (v3.GetValue()) : (3))) + ",") + v4.GetValue());
|
||
}
|
||
, ()=>"FORMULAR", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
const v3 = p._GetNode(3).GetVar();
|
||
return ()=>Math.floor(((v0.GetValue() + v1.GetValue()) * Math.pow(v2.GetValue(), v3.GetValue())));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>Math.floor((20 * Math.pow(v0.GetValue(), v1.GetValue())));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>Math.floor((v0.GetValue() * Math.pow(v1.GetValue(), v2.GetValue())));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>(v0.GetValue() * (1 + (v1.GetValue() / 100)));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>f0(v1.GetValue(), 0, ",");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>f0(v1.GetValue(), 1, ",");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const n2 = p._GetNode(2);
|
||
const v3 = p._GetNode(3).GetVar();
|
||
return ()=>((((n0.ExpObject(v1.GetValue(), 2)) <= (0) ? 1 : 0)) ? (1) : (n2.ExpObject(v3.GetValue(), 2)));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const n2 = p._GetNode(2);
|
||
const v3 = p._GetNode(3).GetVar();
|
||
const v4 = p._GetNode(4).GetVar();
|
||
return ()=>add(n0.ExpObject(v1.GetValue(), 2), multiply(n2.ExpObject(v3.GetValue(), 2), (v4.GetValue() / 100)));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>(v0.GetValue() * v1.GetValue());
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
const v3 = p._GetNode(3).GetVar();
|
||
return ()=>(Math.floor((v0.GetValue() + v1.GetValue())) * Math.pow(v2.GetValue(), v3.GetValue()));
|
||
}
|
||
, ()=>"DIALOG", p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
return ()=>n0.ExpObject((and("heroes.", n1.ExpInstVar()) + ".name"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(("[scale=0.5]" + n0.ExpInstVar()) + "[/scale]");
|
||
}
|
||
, ()=>"\n", p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const n1 = p._GetNode(1);
|
||
return ()=>(("[color=#FFFB59 ] Cost " + f0(n1.ExpInstVar())) + " Gold[/color]");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const n1 = p._GetNode(1);
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>f0(n1.ExpObject((and("heroes.", v2.GetValue()) + ".baseClickDamage")));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>n0.ExpObject((and("heroes.", v1.GetValue()) + ".description"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
return ()=>n0.ExpObject(n1.ExpInstVar());
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const n1 = p._GetNode(1);
|
||
const n2 = p._GetNode(2);
|
||
return ()=>(and((("[color=#F42D20] Requires " + v0.GetValue()) + "'s upgrade: "), n1.ExpObject((and("upgrades.", n2.ExpInstVar()) + ".name"))) + "[/color]");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(and("[color=#F42D20] Requires hero level: ", n0.ExpInstVar()) + "[/color]");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const n1 = p._GetNode(1);
|
||
return ()=>(((("Increases [color=#33F178] " + v0.GetValue()) + "[/color]'s Click Damage by [color=#33F178] ") + n1.ExpInstVar()) + "[/color] %.");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
const n2 = p._GetNode(2);
|
||
return ()=>(((("Increases [color=#33F178] " + v0.GetValue()) + "[/color]'s DPS by [color=#33F178]") + f1(n2.ExpInstVar(), 1, ",")) + "[/color] %.");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(("[color=#999999]" + n0.ExpInstVar()) + "[/color]");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(n0.ExpObject() + 20);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
const f2 = p._GetNode(2).GetBoundMethod();
|
||
const f3 = p._GetNode(3).GetBoundMethod();
|
||
const n4 = p._GetNode(4);
|
||
const n5 = p._GetNode(5);
|
||
return ()=>(((((n0.ExpObject() + n1.ExpObject())) > (f2(0)) ? 1 : 0)) ? ((f3(0) - n4.ExpObject())) : (n5.ExpObject()));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(n0.ExpObject() + 10);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
return ()=>n0.ExpObject((and("achievements.", n1.ExpObject()) + ".name"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
return ()=>n0.ExpObject((and("achievements.", n1.ExpObject()) + ".description"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
return ()=>n0.ExpObject((and("achievements.", n1.ExpObject()) + ".checkParams"));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(("[scale=0.5]" + v0.GetValue()) + "[/scale]");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
const f3 = p._GetNode(3).GetBoundMethod();
|
||
const v4 = p._GetNode(4).GetVar();
|
||
return ()=>((f0(v1.GetValue(), 0, "%1") + v2.GetValue()) + f3(v4.GetValue(), 1, "%1"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(n0.ExpObject() + 50);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>n0.ExpObject((and("heroes.", v1.GetValue()) + ".name"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>n0.ExpObject(v1.GetValue());
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const n1 = p._GetNode(1);
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>f0(n1.ExpObject((and("heroes.", v2.GetValue()) + ".baseAttack")));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(and("[color=#00ff00]Click Damage: ", (v0.GetValue() + 1)) + "[/color]");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>and("Current Level:\n Click Damage: ", ((v0.GetValue() * v1.GetValue()) + 1));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>(and("[color=#00ff00]Next Level:[/color]\n[color=#00ff00] Click Damage: ", ((v0.GetValue() * (v1.GetValue() + 1)) + 1)) + "[/color]");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>(("[color=#00ff00]DPS: " + f0(Math.floor(v1.GetValue()))) + "[/color]");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>("Current Level:\n DPS: " + f0(Math.floor((v1.GetValue() * v2.GetValue()))));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>(("[color=#00ff00]Next Level:[/color]\n[color=#00ff00] DPS: " + f0(Math.floor((v1.GetValue() * (v2.GetValue() + 1))))) + "[/color]");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(("[color=#999999]" + v0.GetValue()) + "[/color]");
|
||
}
|
||
, ()=>"hideHero", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const n1 = p._GetNode(1);
|
||
const f2 = p._GetNode(2).GetBoundMethod();
|
||
const f3 = p._GetNode(3).GetBoundMethod();
|
||
const n4 = p._GetNode(4);
|
||
const v5 = p._GetNode(5).GetVar();
|
||
return ()=>(((((v0.GetValue() + n1.ExpObject())) > (f2(0)) ? 1 : 0)) ? ((f3(0) - n4.ExpObject())) : (v5.GetValue()));
|
||
}
|
||
, ()=>"CHECK_COIN", p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>n0.ExpObject((and("heroes.", v1.GetValue()) + ".baseCost"));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() + 1);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>and(".", (n0.ExpObject(".") - 1));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>n0.ExpObject(and("heroes.", v1.GetValue()));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpBehavior();
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
return ()=>f0(20, 20, 20, 255);
|
||
}
|
||
, ()=>"48, 48, 48", p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
return ()=>f0(255, 255, 255);
|
||
}
|
||
, ()=>"255,255,255", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const n1 = p._GetNode(1);
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>(v0.GetValue() + (((n1.ExpObject() + v2.GetValue()) + 5) / 2));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const n1 = p._GetNode(1);
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>(v0.GetValue() - (((n1.ExpObject() + v2.GetValue()) + 5) / 2));
|
||
}
|
||
, ()=>"EFFECT", p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
return ()=>f0(50, 90);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>(n0.ExpObject() + (v1.GetValue() * v2.GetValue()));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
return ()=>(n0.ExpObject() - f1(30, 50));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>(n0.ExpObject() + ((v1.GetValue() * v2.GetValue()) * 2));
|
||
}
|
||
, ()=>12345, ()=>"ACHIEVEMENT", p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
return ()=>n0.ExpObject(and("achievements.", n1.ExpObject()));
|
||
}
|
||
, ()=>"achievements", p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(".checkFunction");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const n1 = p._GetNode(1);
|
||
return ()=>f0(n1.ExpObject(".checkParams"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(".id");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const n1 = p._GetNode(1);
|
||
return ()=>f0(n1.ExpObject());
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
return ()=>n0.ExpObject(("achievements." + n1.ExpObject()));
|
||
}
|
||
, ()=>388, ()=>132, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
return ()=>and("ACHIEVEMENT: ", n0.ExpObject((("achievements." + n1.ExpObject()) + ".name")));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(10 * v0.GetValue());
|
||
}
|
||
, ()=>"highestFinishedZone", ()=>"10", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(25 * v0.GetValue());
|
||
}
|
||
, ()=>"25", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(50 * v0.GetValue());
|
||
}
|
||
, ()=>"50", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(100 * v0.GetValue());
|
||
}
|
||
, ()=>"100", ()=>1000, ()=>10000, ()=>50000, ()=>100000, ()=>1000000, ()=>1000000000, ()=>100000000000000, ()=>1000000000000000000, ()=>"totalBossKills", ()=>"totalKills", ()=>500000, ()=>5000000000, ()=>50000000000000, ()=>500000000000000000, ()=>"totalUpgrades", ()=>50, ()=>75, ()=>83, ()=>"maxDps", ()=>1000000000000, ()=>1000000000000000, ()=>"totalHeroLevels", ()=>"mostClicksPerSecond", p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpBehavior("id");
|
||
}
|
||
, ()=>-1000, ()=>"OTHER", p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
return ()=>((((n0.ExpInstVar()) <= (0) ? 1 : 0)) ? (0) : (n1.ExpInstVar()));
|
||
}
|
||
, ()=>"Fly", p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(and("Sound (", n0.ExpInstVar()) + ")");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
return ()=>f0(1, (-1));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
return ()=>f0(20, 60);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
return ()=>(n0.ExpObject() - f1(50, 90));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
return ()=>(n0.ExpObject() + f1(30, 80));
|
||
}
|
||
, ()=>861, ()=>265, ()=>"staticData", p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const n1 = p._GetNode(1);
|
||
const n2 = p._GetNode(2);
|
||
const n3 = p._GetNode(3);
|
||
const n4 = p._GetNode(4);
|
||
return ()=>f0(((((((n1.ExpObject() + "||") + n2.ExpObject()) + "||") + n3.ExpObject()) + "||") + n4.ExpObject()));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>((n0.ExpObject() + n1.ExpObject()) + v2.GetValue());
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(n0.ExpInstVar_Family() + 1);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(n0.ExpObject() - 1);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
return ()=>n0.ExpObject(f1(), 1);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
const n2 = p._GetNode(2);
|
||
const f3 = p._GetNode(3).GetBoundMethod();
|
||
const n4 = p._GetNode(4);
|
||
const f5 = p._GetNode(5).GetBoundMethod();
|
||
return ()=>multiply(n0.ExpObject(f1(), 1), ((((n2.ExpObject(f3(), 2)) <= (0) ? 1 : 0)) ? (1) : (n4.ExpObject(f5(), 2))));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>(f0(Math.floor(v1.GetValue())) + " DPS");
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>(v0.GetValue() + Math.floor((v1.GetValue() * (v2.GetValue() / 100))));
|
||
}
|
||
, ()=>"SHOP_HANDLE", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const n1 = p._GetNode(1);
|
||
return ()=>(v0.GetValue() - n1.ExpInstVar());
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(n0.ExpObject() + 30);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
const n2 = p._GetNode(2);
|
||
return ()=>add(n0.ExpObject(n1.ExpInstVar(), 1), n2.ExpInstVar());
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
return ()=>(n0.ExpObject() - (n1.ExpObject() / 2));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>(v0.GetValue() * ((100 + v1.GetValue()) / 100));
|
||
}
|
||
, ()=>411, ()=>103, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>(("Gained " + n0.ExpInstVar()) + "!");
|
||
}
|
||
, ()=>-0.1, ()=>0.1, ()=>"GRIDVIEW_CTRL", ()=>"SHOP", p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const n1 = p._GetNode(1);
|
||
const n2 = p._GetNode(2);
|
||
const n3 = p._GetNode(3);
|
||
const n4 = p._GetNode(4);
|
||
const n5 = p._GetNode(5);
|
||
return ()=>f0("", n1.ExpBehavior("costFormula"), n2.ExpBehavior("id"), n3.ExpObject(n4.ExpBehavior("id")), n5.ExpBehavior("baseCost"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
return ()=>n0.ExpObject(n1.ExpBehavior("id"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpBehavior("baseClickDamage");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpBehavior("baseAttack");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpBehavior("baseCost");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpBehavior("costFormula");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpBehavior("name");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
return ()=>((((n0.ExpObject(n1.ExpBehavior("id"), 0)) > (0) ? 1 : 0)) ? ("LVL UP ") : ("HIRE"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
const n2 = p._GetNode(2);
|
||
const n3 = p._GetNode(3);
|
||
return ()=>((((n0.ExpObject(n1.ExpBehavior("id"), 0)) > (0) ? 1 : 0)) ? (and("Lvl ", n2.ExpObject(n3.ExpBehavior("id"), 0))) : (""));
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
const n2 = p._GetNode(2);
|
||
const n3 = p._GetNode(3);
|
||
const n4 = p._GetNode(4);
|
||
const n5 = p._GetNode(5);
|
||
const n6 = p._GetNode(6);
|
||
return ()=>f0(f1("", n2.ExpInstVar(), n3.ExpInstVar(), n4.ExpObject(n5.ExpInstVar()), n6.ExpInstVar()));
|
||
}
|
||
, ()=>0.6, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>((n0.ExpObject() + v1.GetValue()) + 5);
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>(v0.GetValue() - (v1.GetValue() / 2));
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>(v0.GetValue() + (v1.GetValue() / 2));
|
||
}
|
||
, ()=>"upgrades", p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(".heroId");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>add(n0.ExpObject(v1.GetValue()), 1);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(".iconId");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(".cost");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(".upgradeFunction");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(".upgradeParams");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(".name");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(".upgradeRequired");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(".heroLevelRequired");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(".description");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
return ()=>n0.ExpObject(and("heroes.", (f1() + 1)));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>and(and(n0.ExpObject((and("zones.", ((Math.floor(((v1.GetValue() - 1) / 5)) % 9) + 1)) + ".name")), " Lvl "), v2.GetValue());
|
||
}
|
||
, ()=>853, ()=>290, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>and((and("Entering ", n0.ExpObject((and("zones.", ((Math.floor(((v1.GetValue() - 1) / 5)) % 9) + 1)) + ".name"))) + " Lvl "), v2.GetValue());
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>n0.ExpObject((and("zones.", ((Math.floor(((v1.GetValue() - 1) / 5)) % 9) + 1)) + ".bossId"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>n0.ExpObject((and("zones.", ((Math.floor(((v1.GetValue() - 1) / 5)) % 9) + 1)) + ".monsterIds"));
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>subtract(n0.ExpObject((and("zones.", ((Math.floor(((v1.GetValue() - 1) / 5)) % 9) + 1)) + ".background")), 1);
|
||
}
|
||
, ()=>"MAP_CTRL", p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
const f2 = p._GetNode(2).GetBoundMethod();
|
||
const f3 = p._GetNode(3).GetBoundMethod();
|
||
const v4 = p._GetNode(4).GetVar();
|
||
return ()=>(n0.ExpObject() + ((-n1.ExpObject()) + f2(f3(v4.GetValue(), 0, ","))));
|
||
}
|
||
, ()=>"MapBack", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() - 5);
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() + 5);
|
||
}
|
||
, ()=>"MapNext", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() - 10);
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() + 10);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
const n1 = p._GetNode(1);
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>((n0.ExpObject() - n1.ExpObject()) - v2.GetValue());
|
||
}
|
||
, ()=>"SETTING", ()=>"MusicBtn", ()=>"EffSoundBtn", ()=>"SettingBtn", ()=>"CloseSettingBtn", ()=>"SaveBtn", ()=>"Game saved!", ()=>"ResetBtn", ()=>"Game reset!", ()=>"ImportBtn", ()=>"ImportDataBtn", ()=>"ExportBtn", ()=>"TICK", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() / 10);
|
||
}
|
||
, p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
return ()=>(v0.GetValue() - 0.1);
|
||
}
|
||
, ()=>"Game data copied to Clipboard. Paste it in a notepad to save!", p=>{
|
||
const v0 = p._GetNode(0).GetVar();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
const v2 = p._GetNode(2).GetVar();
|
||
return ()=>((v0.GetValue() + v1.GetValue()) + v2.GetValue());
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
return ()=>f0(f1(), "||");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const f1 = p._GetNode(1).GetBoundMethod();
|
||
return ()=>f0(f1());
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>f0(v1.GetValue(), 0, "||");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>f0(v1.GetValue(), 1, "||");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>f0(v1.GetValue(), 2, "||");
|
||
}
|
||
, p=>{
|
||
const f0 = p._GetNode(0).GetBoundMethod();
|
||
const v1 = p._GetNode(1).GetVar();
|
||
return ()=>f0(v1.GetValue(), 3, "||");
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(0);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(1);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(2);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(3);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(4);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(5);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(6);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(7);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(8);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(9);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(10);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(11);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(12);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(13);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(14);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(15);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(16);
|
||
}
|
||
, p=>{
|
||
const n0 = p._GetNode(0);
|
||
return ()=>n0.ExpObject(17);
|
||
}
|
||
];
|
||
}
|
||
"use strict";
|
||
{
|
||
const scriptsInEvents = {
|
||
async Egame_Event1_Act5(runtime, localVars) {
|
||
Hideloading();
|
||
},
|
||
async Egame_Event16_Act9(runtime, localVars) {
|
||
localVars.hpMonster = monsterLifeFormula1(localVars.levelMonster, localVars.baseLife, localVars.isBoss)
|
||
},
|
||
async Egame_Event65_Act1(runtime, localVars) {
|
||
localVars.returnString = format_number_limit(localVars.numberFormat, 5);
|
||
},
|
||
async Egame_Event67_Act3(runtime, localVars) {
|
||
localVars.star = runtime.globalVars.currentCoin.toLocaleString('fullwide', {
|
||
useGrouping: false
|
||
});
|
||
},
|
||
async Egame_Event193_Act1(runtime, localVars) {
|
||
localVars.stringCoin = format_number_limit(runtime.globalVars.currentCoin, 15);
|
||
},
|
||
async Eloading_Event5_Act1(runtime, localVars) {
|
||
Hideloading();
|
||
},
|
||
async Eloaddata_Event3_Act19(runtime, localVars) {
|
||
Hideloading();
|
||
}
|
||
};
|
||
self.C3.ScriptsInEvents = scriptsInEvents;
|
||
}
|
||
function monsterLifeFormula1(levelMonster, baseLife, isBoss) {
|
||
var hpCalculation;
|
||
var levelFactor;
|
||
levelFactor = 0;
|
||
if (isBoss) {
|
||
levelFactor = Math.pow(1.6, levelMonster - 1);
|
||
hpCalculation = 10 * (baseLife * levelFactor) + (levelMonster - 1) * 10;
|
||
} else {
|
||
levelFactor = Math.pow(1.6, levelMonster - 1);
|
||
hpCalculation = baseLife * levelFactor + (levelMonster - 1) * 10;
|
||
}
|
||
return Math.ceil(hpCalculation);
|
||
}
|
||
function upgradeClickPercent(clickPercent) {
|
||
var a = clickPercent;
|
||
this.clickMultiplier = this.clickMultiplier * (1 + a / 100);
|
||
}
|
||
let array_number_view = ["", "K", "M", "B", "T", "q", "Q", "s", "S", "O", "N", "d", "U", "D", "Z"]
|
||
function format_number_limit(value_input, limit) {
|
||
var number_input = Math.floor(value_input).toLocaleString('fullwide', {
|
||
useGrouping: false
|
||
});
|
||
var show_length_number = number_input.length;
|
||
var count_unit = 0;
|
||
while (show_length_number > limit) {
|
||
show_length_number = show_length_number - 3;
|
||
count_unit = count_unit + 1;
|
||
}
|
||
var returnvalue = format_number(number_input.substring(0, show_length_number)) + array_number_view[count_unit];
|
||
return returnvalue;
|
||
}
|
||
function format_number(num) {
|
||
return num.replace(/(?<!\..*)(\d)(?=(?:\d{3})+(?:\.|$))/g, '$1,')
|
||
}
|