phaser4-rex-plugins
Version:
298 lines • 9.84 kB
JavaScript
"use strict";
/**
* Copyright(c) Live2D Inc. All rights reserved.
*
* Use of this source code is governed by the Live2D Open Software license
* that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
*/
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
var cubismvector2_1 = require("./cubismvector2");
/**
* 数値計算などに使用するユーティリティクラス
*/
var CubismMath = /** @class */ (function () {
/**
* コンストラクタ
*/
function CubismMath() {
}
/**
* 第一引数の値を最小値と最大値の範囲に収めた値を返す
*
* @param value 収められる値
* @param min 範囲の最小値
* @param max 範囲の最大値
* @return 最小値と最大値の範囲に収めた値
*/
CubismMath.range = function (value, min, max) {
if (value < min) {
value = min;
}
else if (value > max) {
value = max;
}
return value;
};
/**
* サイン関数の値を求める
*
* @param x 角度値(ラジアン)
* @return サイン関数sin(x)の値
*/
CubismMath.sin = function (x) {
return Math.sin(x);
};
/**
* コサイン関数の値を求める
*
* @param x 角度値(ラジアン)
* @return コサイン関数cos(x)の値
*/
CubismMath.cos = function (x) {
return Math.cos(x);
};
/**
* 値の絶対値を求める
*
* @param x 絶対値を求める値
* @return 値の絶対値
*/
CubismMath.abs = function (x) {
return Math.abs(x);
};
/**
* 平方根(ルート)を求める
* @param x -> 平方根を求める値
* @return 値の平方根
*/
CubismMath.sqrt = function (x) {
return Math.sqrt(x);
};
/**
* 立方根を求める
* @param x -> 立方根を求める値
* @return 値の立方根
*/
CubismMath.cbrt = function (x) {
if (x === 0) {
return x;
}
var cx = x;
var isNegativeNumber = cx < 0;
if (isNegativeNumber) {
cx = -cx;
}
var ret;
if (cx === Infinity) {
ret = Infinity;
}
else {
ret = Math.exp(Math.log(cx) / 3);
ret = (cx / (ret * ret) + 2 * ret) / 3;
}
return isNegativeNumber ? -ret : ret;
};
/**
* イージング処理されたサインを求める
* フェードイン・アウト時のイージングに利用できる
*
* @param value イージングを行う値
* @return イージング処理されたサイン値
*/
CubismMath.getEasingSine = function (value) {
if (value < 0.0) {
return 0.0;
}
else if (value > 1.0) {
return 1.0;
}
return 0.5 - 0.5 * this.cos(value * Math.PI);
};
/**
* 大きい方の値を返す
*
* @param left 左辺の値
* @param right 右辺の値
* @return 大きい方の値
*/
CubismMath.max = function (left, right) {
return left > right ? left : right;
};
/**
* 小さい方の値を返す
*
* @param left 左辺の値
* @param right 右辺の値
* @return 小さい方の値
*/
CubismMath.min = function (left, right) {
return left > right ? right : left;
};
/**
* 角度値をラジアン値に変換する
*
* @param degrees 角度値
* @return 角度値から変換したラジアン値
*/
CubismMath.degreesToRadian = function (degrees) {
return (degrees / 180.0) * Math.PI;
};
/**
* ラジアン値を角度値に変換する
*
* @param radian ラジアン値
* @return ラジアン値から変換した角度値
*/
CubismMath.radianToDegrees = function (radian) {
return (radian * 180.0) / Math.PI;
};
/**
* 2つのベクトルからラジアン値を求める
*
* @param from 始点ベクトル
* @param to 終点ベクトル
* @return ラジアン値から求めた方向ベクトル
*/
CubismMath.directionToRadian = function (from, to) {
var q1 = Math.atan2(to.y, to.x);
var q2 = Math.atan2(from.y, from.x);
var ret = q1 - q2;
while (ret < -Math.PI) {
ret += Math.PI * 2.0;
}
while (ret > Math.PI) {
ret -= Math.PI * 2.0;
}
return ret;
};
/**
* 2つのベクトルから角度値を求める
*
* @param from 始点ベクトル
* @param to 終点ベクトル
* @return 角度値から求めた方向ベクトル
*/
CubismMath.directionToDegrees = function (from, to) {
var radian = this.directionToRadian(from, to);
var degree = this.radianToDegrees(radian);
if (to.x - from.x > 0.0) {
degree = -degree;
}
return degree;
};
/**
* ラジアン値を方向ベクトルに変換する。
*
* @param totalAngle ラジアン値
* @return ラジアン値から変換した方向ベクトル
*/
CubismMath.radianToDirection = function (totalAngle) {
var ret = new cubismvector2_1.CubismVector2();
ret.x = this.sin(totalAngle);
ret.y = this.cos(totalAngle);
return ret;
};
/**
* 三次方程式の三次項の係数が0になったときに補欠的に二次方程式の解をもとめる。
* a * x^2 + b * x + c = 0
*
* @param a -> 二次項の係数値
* @param b -> 一次項の係数値
* @param c -> 定数項の値
* @return 二次方程式の解
*/
CubismMath.quadraticEquation = function (a, b, c) {
if (this.abs(a) < CubismMath.Epsilon) {
if (this.abs(b) < CubismMath.Epsilon) {
return -c;
}
return -c / b;
}
return -(b + this.sqrt(b * b - 4.0 * a * c)) / (2.0 * a);
};
/**
* カルダノの公式によってベジェのt値に該当する3次方程式の解を求める。
* 重解になったときには0.0~1.0の値になる解を返す。
*
* a * x^3 + b * x^2 + c * x + d = 0
*
* @param a -> 三次項の係数値
* @param b -> 二次項の係数値
* @param c -> 一次項の係数値
* @param d -> 定数項の値
* @return 0.0~1.0の間にある解
*/
CubismMath.cardanoAlgorithmForBezier = function (a, b, c, d) {
if (this.sqrt(a) < CubismMath.Epsilon) {
return this.range(this.quadraticEquation(b, c, d), 0.0, 1.0);
}
var ba = b / a;
var ca = c / a;
var da = d / a;
var p = (3.0 * ca - ba * ba) / 3.0;
var p3 = p / 3.0;
var q = (2.0 * ba * ba * ba - 9.0 * ba * ca + 27.0 * da) / 27.0;
var q2 = q / 2.0;
var discriminant = q2 * q2 + p3 * p3 * p3;
var center = 0.5;
var threshold = center + 0.01;
if (discriminant < 0.0) {
var mp3 = -p / 3.0;
var mp33 = mp3 * mp3 * mp3;
var r = this.sqrt(mp33);
var t = -q / (2.0 * r);
var cosphi = this.range(t, -1.0, 1.0);
var phi = Math.acos(cosphi);
var crtr = this.cbrt(r);
var t1 = 2.0 * crtr;
var root1_1 = t1 * this.cos(phi / 3.0) - ba / 3.0;
if (this.abs(root1_1 - center) < threshold) {
return this.range(root1_1, 0.0, 1.0);
}
var root2 = t1 * this.cos((phi + 2.0 * Math.PI) / 3.0) - ba / 3.0;
if (this.abs(root2 - center) < threshold) {
return this.range(root2, 0.0, 1.0);
}
var root3 = t1 * this.cos((phi + 4.0 * Math.PI) / 3.0) - ba / 3.0;
return this.range(root3, 0.0, 1.0);
}
if (discriminant == 0.0) {
var u1_1;
if (q2 < 0.0) {
u1_1 = this.cbrt(-q2);
}
else {
u1_1 = -this.cbrt(q2);
}
var root1_2 = 2.0 * u1_1 - ba / 3.0;
if (this.abs(root1_2 - center) < threshold) {
return this.range(root1_2, 0.0, 1.0);
}
var root2 = -u1_1 - ba / 3.0;
return this.range(root2, 0.0, 1.0);
}
var sd = this.sqrt(discriminant);
var u1 = this.cbrt(sd - q2);
var v1 = this.cbrt(sd + q2);
var root1 = u1 - v1 - ba / 3.0;
return this.range(root1, 0.0, 1.0);
};
CubismMath.Epsilon = 0.00001;
return CubismMath;
}());
exports.CubismMath = CubismMath;
// Namespace definition for compatibility.
var $ = __importStar(require("./cubismmath"));
// eslint-disable-next-line @typescript-eslint/no-namespace
var Live2DCubismFramework;
(function (Live2DCubismFramework) {
Live2DCubismFramework.CubismMath = $.CubismMath;
})(Live2DCubismFramework = exports.Live2DCubismFramework || (exports.Live2DCubismFramework = {}));
//# sourceMappingURL=cubismmath.js.map