phaser4-rex-plugins
Version:
662 lines (619 loc) • 18.6 kB
text/typescript
/**
* 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.
*/
import { CubismIdHandle } from '../id/cubismid';
import { CubismFramework } from '../live2dcubismframework';
import { CubismVector2 } from '../math/cubismvector2';
import { CubismJson } from '../utils/cubismjson';
// JSON keys
const Position = 'Position';
const X = 'X';
const Y = 'Y';
const Angle = 'Angle';
const Type = 'Type';
const Id = 'Id';
// Meta
const Meta = 'Meta';
const EffectiveForces = 'EffectiveForces';
const TotalInputCount = 'TotalInputCount';
const TotalOutputCount = 'TotalOutputCount';
const PhysicsSettingCount = 'PhysicsSettingCount';
const Gravity = 'Gravity';
const Wind = 'Wind';
const VertexCount = 'VertexCount';
const Fps = 'Fps';
// PhysicsSettings
const PhysicsSettings = 'PhysicsSettings';
const Normalization = 'Normalization';
const Minimum = 'Minimum';
const Maximum = 'Maximum';
const Default = 'Default';
const Reflect = 'Reflect';
const Weight = 'Weight';
// Input
const Input = 'Input';
const Source = 'Source';
// Output
const Output = 'Output';
const Scale = 'Scale';
const VertexIndex = 'VertexIndex';
const Destination = 'Destination';
// Particle
const Vertices = 'Vertices';
const Mobility = 'Mobility';
const Delay = 'Delay';
const Radius = 'Radius';
const Acceleration = 'Acceleration';
/**
* physics3.jsonのコンテナ。
*/
export class CubismPhysicsJson {
/**
* コンストラクタ
* @param buffer physics3.jsonが読み込まれているバッファ
* @param size バッファのサイズ
*/
public constructor(buffer: ArrayBuffer, size: number) {
this._json = CubismJson.create(buffer, size);
}
/**
* デストラクタ相当の処理
*/
public release(): void {
CubismJson.delete(this._json);
}
/**
* 重力の取得
* @return 重力
*/
public getGravity(): CubismVector2 {
const ret: CubismVector2 = new CubismVector2(0, 0);
ret.x = this._json
.getRoot()
.getValueByString(Meta)
.getValueByString(EffectiveForces)
.getValueByString(Gravity)
.getValueByString(X)
.toFloat();
ret.y = this._json
.getRoot()
.getValueByString(Meta)
.getValueByString(EffectiveForces)
.getValueByString(Gravity)
.getValueByString(Y)
.toFloat();
return ret;
}
/**
* 風の取得
* @return 風
*/
public getWind(): CubismVector2 {
const ret: CubismVector2 = new CubismVector2(0, 0);
ret.x = this._json
.getRoot()
.getValueByString(Meta)
.getValueByString(EffectiveForces)
.getValueByString(Wind)
.getValueByString(X)
.toFloat();
ret.y = this._json
.getRoot()
.getValueByString(Meta)
.getValueByString(EffectiveForces)
.getValueByString(Wind)
.getValueByString(Y)
.toFloat();
return ret;
}
/**
* 物理演算設定FPSの取得
* @return 物理演算設定FPS
*/
public getFps(): number {
return this._json
.getRoot()
.getValueByString(Meta)
.getValueByString(Fps)
.toFloat(0.0);
}
/**
* 物理店の管理の個数の取得
* @return 物理店の管理の個数
*/
public getSubRigCount(): number {
return this._json
.getRoot()
.getValueByString(Meta)
.getValueByString(PhysicsSettingCount)
.toInt();
}
/**
* 入力の総合計の取得
* @return 入力の総合計
*/
public getTotalInputCount(): number {
return this._json
.getRoot()
.getValueByString(Meta)
.getValueByString(TotalInputCount)
.toInt();
}
/**
* 出力の総合計の取得
* @return 出力の総合計
*/
public getTotalOutputCount(): number {
return this._json
.getRoot()
.getValueByString(Meta)
.getValueByString(TotalOutputCount)
.toInt();
}
/**
* 物理点の個数の取得
* @return 物理点の個数
*/
public getVertexCount(): number {
return this._json
.getRoot()
.getValueByString(Meta)
.getValueByString(VertexCount)
.toInt();
}
/**
* 正規化された位置の最小値の取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @return 正規化された位置の最小値
*/
public getNormalizationPositionMinimumValue(
physicsSettingIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Normalization)
.getValueByString(Position)
.getValueByString(Minimum)
.toFloat();
}
/**
* 正規化された位置の最大値の取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @return 正規化された位置の最大値
*/
public getNormalizationPositionMaximumValue(
physicsSettingIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Normalization)
.getValueByString(Position)
.getValueByString(Maximum)
.toFloat();
}
/**
* 正規化された位置のデフォルト値の取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @return 正規化された位置のデフォルト値
*/
public getNormalizationPositionDefaultValue(
physicsSettingIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Normalization)
.getValueByString(Position)
.getValueByString(Default)
.toFloat();
}
/**
* 正規化された角度の最小値の取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @return 正規化された角度の最小値
*/
public getNormalizationAngleMinimumValue(
physicsSettingIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Normalization)
.getValueByString(Angle)
.getValueByString(Minimum)
.toFloat();
}
/**
* 正規化された角度の最大値の取得
* @param physicsSettingIndex
* @return 正規化された角度の最大値
*/
public getNormalizationAngleMaximumValue(
physicsSettingIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Normalization)
.getValueByString(Angle)
.getValueByString(Maximum)
.toFloat();
}
/**
* 正規化された角度のデフォルト値の取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @return 正規化された角度のデフォルト値
*/
public getNormalizationAngleDefaultValue(
physicsSettingIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Normalization)
.getValueByString(Angle)
.getValueByString(Default)
.toFloat();
}
/**
* 入力の個数の取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @return 入力の個数
*/
public getInputCount(physicsSettingIndex: number): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Input)
.getVector()
.getSize();
}
/**
* 入力の重みの取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param inputIndex 入力のインデックス
* @return 入力の重み
*/
public getInputWeight(
physicsSettingIndex: number,
inputIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Input)
.getValueByIndex(inputIndex)
.getValueByString(Weight)
.toFloat();
}
/**
* 入力の反転の取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param inputIndex 入力のインデックス
* @return 入力の反転
*/
public getInputReflect(
physicsSettingIndex: number,
inputIndex: number
): boolean {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Input)
.getValueByIndex(inputIndex)
.getValueByString(Reflect)
.toBoolean();
}
/**
* 入力の種類の取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param inputIndex 入力のインデックス
* @return 入力の種類
*/
public getInputType(physicsSettingIndex: number, inputIndex: number): string {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Input)
.getValueByIndex(inputIndex)
.getValueByString(Type)
.getRawString();
}
/**
* 入力元のIDの取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param inputIndex 入力のインデックス
* @return 入力元のID
*/
public getInputSourceId(
physicsSettingIndex: number,
inputIndex: number
): CubismIdHandle {
return CubismFramework.getIdManager().getId(
this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Input)
.getValueByIndex(inputIndex)
.getValueByString(Source)
.getValueByString(Id)
.getRawString()
);
}
/**
* 出力の個数の取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @return 出力の個数
*/
public getOutputCount(physicsSettingIndex: number): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Output)
.getVector()
.getSize();
}
/**
* 出力の物理点のインデックスの取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param outputIndex 出力のインデックス
* @return 出力の物理点のインデックス
*/
public getOutputVertexIndex(
physicsSettingIndex: number,
outputIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Output)
.getValueByIndex(outputIndex)
.getValueByString(VertexIndex)
.toInt();
}
/**
* 出力の角度のスケールを取得する
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param outputIndex 出力のインデックス
* @return 出力の角度のスケール
*/
public getOutputAngleScale(
physicsSettingIndex: number,
outputIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Output)
.getValueByIndex(outputIndex)
.getValueByString(Scale)
.toFloat();
}
/**
* 出力の重みの取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param outputIndex 出力のインデックス
* @return 出力の重み
*/
public getOutputWeight(
physicsSettingIndex: number,
outputIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Output)
.getValueByIndex(outputIndex)
.getValueByString(Weight)
.toFloat();
}
/**
* 出力先のIDの取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param outputIndex 出力のインデックス
* @return 出力先のID
*/
public getOutputDestinationId(
physicsSettingIndex: number,
outputIndex: number
): CubismIdHandle {
return CubismFramework.getIdManager().getId(
this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Output)
.getValueByIndex(outputIndex)
.getValueByString(Destination)
.getValueByString(Id)
.getRawString()
);
}
/**
* 出力の種類の取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param outputIndex 出力のインデックス
* @return 出力の種類
*/
public getOutputType(
physicsSettingIndex: number,
outputIndex: number
): string {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Output)
.getValueByIndex(outputIndex)
.getValueByString(Type)
.getRawString();
}
/**
* 出力の反転の取得
* @param physicsSettingIndex 物理演算のインデックス
* @param outputIndex 出力のインデックス
* @return 出力の反転
*/
public getOutputReflect(
physicsSettingIndex: number,
outputIndex: number
): boolean {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Output)
.getValueByIndex(outputIndex)
.getValueByString(Reflect)
.toBoolean();
}
/**
* 物理点の個数の取得
* @param physicsSettingIndex 物理演算男設定のインデックス
* @return 物理点の個数
*/
public getParticleCount(physicsSettingIndex: number): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Vertices)
.getVector()
.getSize();
}
/**
* 物理点の動きやすさの取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param vertexIndex 物理点のインデックス
* @return 物理点の動きやすさ
*/
public getParticleMobility(
physicsSettingIndex: number,
vertexIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Vertices)
.getValueByIndex(vertexIndex)
.getValueByString(Mobility)
.toFloat();
}
/**
* 物理点の遅れの取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param vertexIndex 物理点のインデックス
* @return 物理点の遅れ
*/
public getParticleDelay(
physicsSettingIndex: number,
vertexIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Vertices)
.getValueByIndex(vertexIndex)
.getValueByString(Delay)
.toFloat();
}
/**
* 物理点の加速度の取得
* @param physicsSettingIndex 物理演算の設定
* @param vertexIndex 物理点のインデックス
* @return 物理点の加速度
*/
public getParticleAcceleration(
physicsSettingIndex: number,
vertexIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Vertices)
.getValueByIndex(vertexIndex)
.getValueByString(Acceleration)
.toFloat();
}
/**
* 物理点の距離の取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param vertexIndex 物理点のインデックス
* @return 物理点の距離
*/
public getParticleRadius(
physicsSettingIndex: number,
vertexIndex: number
): number {
return this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Vertices)
.getValueByIndex(vertexIndex)
.getValueByString(Radius)
.toFloat();
}
/**
* 物理点の位置の取得
* @param physicsSettingIndex 物理演算の設定のインデックス
* @param vertexInde 物理点のインデックス
* @return 物理点の位置
*/
public getParticlePosition(
physicsSettingIndex: number,
vertexIndex: number
): CubismVector2 {
const ret: CubismVector2 = new CubismVector2(0, 0);
ret.x = this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Vertices)
.getValueByIndex(vertexIndex)
.getValueByString(Position)
.getValueByString(X)
.toFloat();
ret.y = this._json
.getRoot()
.getValueByString(PhysicsSettings)
.getValueByIndex(physicsSettingIndex)
.getValueByString(Vertices)
.getValueByIndex(vertexIndex)
.getValueByString(Position)
.getValueByString(Y)
.toFloat();
return ret;
}
_json: CubismJson; // physics3.jsonデータ
}
// Namespace definition for compatibility.
import * as $ from './cubismphysicsjson';
// eslint-disable-next-line @typescript-eslint/no-namespace
export namespace Live2DCubismFramework {
export const CubismPhysicsJson = $.CubismPhysicsJson;
export type CubismPhysicsJson = $.CubismPhysicsJson;
}