{"version":3,"file":"index.umd.cjs","sources":["../../../../Framework/src/type/csmvector.ts","../../../../Framework/src/type/csmstring.ts","../../../../Framework/src/id/cubismid.ts","../../../../Framework/src/id/cubismidmanager.ts","../../../../Framework/src/math/cubismmatrix44.ts","../../../../Framework/src/type/csmrectf.ts","../../../../Framework/src/rendering/cubismrenderer.ts","../../../../Framework/src/utils/cubismdebug.ts","../../../../Framework/src/type/csmmap.ts","../../../../Framework/src/utils/cubismjsonextension.ts","../../../../Framework/src/utils/cubismjson.ts","../../../../Framework/src/live2dcubismframework.ts","../src/lappdefine.ts","../src/lappglmanager.ts","../../../../Framework/src/cubismdefaultparameterid.ts","../../../../Framework/src/icubismmodelsetting.ts","../../../../Framework/src/cubismmodelsettingjson.ts","../../../../Framework/src/effect/cubismbreath.ts","../../../../Framework/src/effect/cubismeyeblink.ts","../../../../Framework/src/effect/cubismpose.ts","../../../../Framework/src/math/cubismmodelmatrix.ts","../../../../Framework/src/math/cubismvector2.ts","../../../../Framework/src/math/cubismmath.ts","../../../../Framework/src/math/cubismtargetpoint.ts","../../../../Framework/src/motion/acubismmotion.ts","../../../../Framework/src/motion/cubismexpressionmotion.ts","../../../../Framework/src/motion/cubismmotionqueueentry.ts","../../../../Framework/src/motion/cubismmotionqueuemanager.ts","../../../../Framework/src/motion/cubismexpressionmotionmanager.ts","../../../../Framework/src/motion/cubismmotioninternal.ts","../../../../Framework/src/motion/cubismmotionjson.ts","../../../../Framework/src/motion/cubismmotion.ts","../../../../Framework/src/motion/cubismmotionmanager.ts","../../../../Framework/src/physics/cubismphysicsinternal.ts","../../../../Framework/src/physics/cubismphysicsjson.ts","../../../../Framework/src/physics/cubismphysics.ts","../../../../Framework/src/rendering/cubismclippingmanager.ts","../../../../Framework/src/rendering/cubismshader_webgl.ts","../../../../Framework/src/rendering/cubismrenderer_webgl.ts","../../../../Framework/src/model/cubismmodel.ts","../../../../Framework/src/model/cubismmoc.ts","../../../../Framework/src/model/cubismmodeluserdatajson.ts","../../../../Framework/src/model/cubismmodeluserdata.ts","../../../../Framework/src/model/cubismusermodel.ts","../src/lapppal.ts","../src/lappwavfilehandler.ts","../src/lappmodel.ts","../src/lapplive2dmanager.ts","../src/lapptexturemanager.ts","../../../../Framework/src/math/cubismviewmatrix.ts","../src/lappsprite.ts","../src/touchmanager.ts","../src/lappview.ts","../src/lappmessagebox.ts","../src/lappdelegate.ts","../src/index.ts"],"sourcesContent":["/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\n/**\n * ベクター型（可変配列型）\n */\nexport class csmVector<T> {\n  /**\n   * 引数付きコンストラクタ\n   * @param iniitalCapacity 初期化後のキャパシティ。データサイズは_capacity * sizeof(T)\n   * @param zeroClear trueなら初期化時に確保した領域を0で埋める\n   */\n  constructor(initialCapacity = 0) {\n    if (initialCapacity < 1) {\n      this._ptr = [];\n      this._capacity = 0;\n      this._size = 0;\n    } else {\n      this._ptr = new Array(initialCapacity);\n      this._capacity = initialCapacity;\n      this._size = 0;\n    }\n  }\n\n  /**\n   * インデックスで指定した要素を返す\n   */\n  public at(index: number): T {\n    return this._ptr[index];\n  }\n\n  /**\n   * 要素をセット\n   * @param index 要素をセットするインデックス\n   * @param value セットする要素\n   */\n  public set(index: number, value: T): void {\n    this._ptr[index] = value;\n  }\n\n  /**\n   * コンテナを取得する\n   */\n  public get(offset = 0): T[] {\n    const ret: T[] = new Array<T>();\n    for (let i = offset; i < this._size; i++) {\n      ret.push(this._ptr[i]);\n    }\n    return ret;\n  }\n\n  /**\n   * pushBack処理、コンテナに新たな要素を追加する\n   * @param value PushBack処理で追加する値\n   */\n  public pushBack(value: T): void {\n    if (this._size >= this._capacity) {\n      this.prepareCapacity(\n        this._capacity == 0 ? csmVector.DefaultSize : this._capacity * 2\n      );\n    }\n\n    this._ptr[this._size++] = value;\n  }\n\n  /**\n   * コンテナの全要素を解放する\n   */\n  public clear(): void {\n    this._ptr.length = 0;\n    this._size = 0;\n  }\n\n  /**\n   * コンテナの要素数を返す\n   * @return コンテナの要素数\n   */\n  public getSize(): number {\n    return this._size;\n  }\n\n  /**\n   * コンテナの全要素に対して代入処理を行う\n   * @param newSize 代入処理後のサイズ\n   * @param value 要素に代入する値\n   */\n  public assign(newSize: number, value: T): void {\n    const curSize = this._size;\n\n    if (curSize < newSize) {\n      this.prepareCapacity(newSize); // capacity更新\n    }\n\n    for (let i = 0; i < newSize; i++) {\n      this._ptr[i] = value;\n    }\n\n    this._size = newSize;\n  }\n\n  /**\n   * サイズ変更\n   */\n  public resize(newSize: number, value: T = null): void {\n    this.updateSize(newSize, value, true);\n  }\n\n  /**\n   * サイズ変更\n   */\n  public updateSize(\n    newSize: number,\n    value: any = null,\n    callPlacementNew = true\n  ): void {\n    const curSize: number = this._size;\n\n    if (curSize < newSize) {\n      this.prepareCapacity(newSize); // capacity更新\n\n      if (callPlacementNew) {\n        for (let i: number = this._size; i < newSize; i++) {\n          if (typeof value == 'function') {\n            // new\n            this._ptr[i] = JSON.parse(JSON.stringify(new value()));\n          } // プリミティブ型なので値渡し\n          else {\n            this._ptr[i] = value;\n          }\n        }\n      } else {\n        for (let i: number = this._size; i < newSize; i++) {\n          this._ptr[i] = value;\n        }\n      }\n    } else {\n      // newSize <= this._size\n      //---\n      const sub = this._size - newSize;\n      this._ptr.splice(this._size - sub, sub); // 不要なので破棄する\n    }\n    this._size = newSize;\n  }\n\n  /**\n   * コンテナにコンテナ要素を挿入する\n   * @param position 挿入する位置\n   * @param begin 挿入するコンテナの開始位置\n   * @param end 挿入するコンテナの終端位置\n   */\n  public insert(\n    position: iterator<T>,\n    begin: iterator<T>,\n    end: iterator<T>\n  ): void {\n    let dstSi: number = position._index;\n    const srcSi: number = begin._index;\n    const srcEi: number = end._index;\n\n    const addCount: number = srcEi - srcSi;\n\n    this.prepareCapacity(this._size + addCount);\n\n    // 挿入用の既存データをシフトして隙間を作る\n    const addSize = this._size - dstSi;\n    if (addSize > 0) {\n      for (let i = 0; i < addSize; i++) {\n        this._ptr.splice(dstSi + i, 0, null);\n      }\n    }\n\n    for (let i: number = srcSi; i < srcEi; i++, dstSi++) {\n      this._ptr[dstSi] = begin._vector._ptr[i];\n    }\n\n    this._size = this._size + addCount;\n  }\n\n  /**\n   * コンテナからインデックスで指定した要素を削除する\n   * @param index インデックス値\n   * @return true 削除実行\n   * @return false 削除範囲外\n   */\n  public remove(index: number): boolean {\n    if (index < 0 || this._size <= index) {\n      return false; // 削除範囲外\n    }\n\n    this._ptr.splice(index, 1);\n    --this._size;\n\n    return true;\n  }\n\n  /**\n   * コンテナから要素を削除して他の要素をシフトする\n   * @param ite 削除する要素\n   */\n  public erase(ite: iterator<T>): iterator<T> {\n    const index: number = ite._index;\n    if (index < 0 || this._size <= index) {\n      return ite; // 削除範囲外\n    }\n\n    // 削除\n    this._ptr.splice(index, 1);\n    --this._size;\n\n    const ite2: iterator<T> = new iterator<T>(this, index); // 終了\n    return ite2;\n  }\n\n  /**\n   * コンテナのキャパシティを確保する\n   * @param newSize 新たなキャパシティ。引数の値が現在のサイズ未満の場合は何もしない.\n   */\n  public prepareCapacity(newSize: number): void {\n    if (newSize > this._capacity) {\n      if (this._capacity == 0) {\n        this._ptr = new Array(newSize);\n        this._capacity = newSize;\n      } else {\n        this._ptr.length = newSize;\n        this._capacity = newSize;\n      }\n    }\n  }\n\n  /**\n   * コンテナの先頭要素を返す\n   */\n  public begin(): iterator<T> {\n    const ite: iterator<T> =\n      this._size == 0 ? this.end() : new iterator<T>(this, 0);\n    return ite;\n  }\n\n  /**\n   * コンテナの終端要素を返す\n   */\n  public end(): iterator<T> {\n    const ite: iterator<T> = new iterator<T>(this, this._size);\n    return ite;\n  }\n\n  public getOffset(offset: number): csmVector<T> {\n    const newVector = new csmVector<T>();\n    newVector._ptr = this.get(offset);\n    newVector._size = this.get(offset).length;\n    newVector._capacity = this.get(offset).length;\n\n    return newVector;\n  }\n\n  _ptr: T[]; // コンテナの先頭アドレス\n  _size: number; // コンテナの要素数\n  _capacity: number; // コンテナのキャパシティ\n\n  static readonly DefaultSize = 10; // コンテナ初期化のデフォルトサイズ\n}\n\nexport class iterator<T> {\n  /**\n   * コンストラクタ\n   */\n  public constructor(v?: csmVector<T>, index?: number) {\n    this._vector = v != undefined ? v : null;\n    this._index = index != undefined ? index : 0;\n  }\n\n  /**\n   * 代入\n   */\n  public set(ite: iterator<T>): iterator<T> {\n    this._index = ite._index;\n    this._vector = ite._vector;\n    return this;\n  }\n\n  /**\n   * 前置き++演算\n   */\n  public preIncrement(): iterator<T> {\n    ++this._index;\n    return this;\n  }\n\n  /**\n   * 前置き--演算\n   */\n  public preDecrement(): iterator<T> {\n    --this._index;\n    return this;\n  }\n\n  /**\n   * 後置き++演算子\n   */\n  public increment(): iterator<T> {\n    const iteold = new iterator<T>(this._vector, this._index++); // 古い値を保存\n    return iteold;\n  }\n\n  /**\n   * 後置き--演算子\n   */\n  public decrement(): iterator<T> {\n    const iteold = new iterator<T>(this._vector, this._index--); // 古い値を保存\n    return iteold;\n  }\n\n  /**\n   * ptr\n   */\n  public ptr(): T {\n    return this._vector._ptr[this._index];\n  }\n\n  /**\n   * =演算子のオーバーロード\n   */\n  public substitution(ite: iterator<T>): iterator<T> {\n    this._index = ite._index;\n    this._vector = ite._vector;\n    return this;\n  }\n\n  /**\n   * !=演算子のオーバーロード\n   */\n  public notEqual(ite: iterator<T>): boolean {\n    return this._index != ite._index || this._vector != ite._vector;\n  }\n\n  _index: number; // コンテナのインデックス値\n  _vector: csmVector<T>; // コンテナ\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './csmvector';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const csmVector = $.csmVector;\n  export type csmVector<T> = $.csmVector<T>;\n  export const iterator = $.iterator;\n  export type iterator<T> = $.iterator<T>;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\n/**\n * 文字列クラス。\n */\nexport class csmString {\n  /**\n   * 文字列を後方に追加する\n   *\n   * @param c 追加する文字列\n   * @return 更新された文字列\n   */\n  public append(c: string, length?: number): csmString {\n    this.s += length !== undefined ? c.substr(0, length) : c;\n\n    return this;\n  }\n\n  /**\n   * 文字サイズを拡張して文字を埋める\n   * @param length    拡張する文字数\n   * @param v         埋める文字\n   * @return 更新された文字列\n   */\n  public expansion(length: number, v: string): csmString {\n    for (let i = 0; i < length; i++) {\n      this.append(v);\n    }\n\n    return this;\n  }\n\n  /**\n   * 文字列の長さをバイト数で取得する\n   */\n  public getBytes(): number {\n    return encodeURIComponent(this.s).replace(/%../g, 'x').length;\n  }\n\n  /**\n   * 文字列の長さを返す\n   */\n  public getLength(): number {\n    return this.s.length;\n  }\n\n  /**\n   * 文字列比較 <\n   * @param s 比較する文字列\n   * @return true:    比較する文字列より小さい\n   * @return false:   比較する文字列より大きい\n   */\n  public isLess(s: csmString): boolean {\n    return this.s < s.s;\n  }\n\n  /**\n   * 文字列比較 >\n   * @param s 比較する文字列\n   * @return true:    比較する文字列より大きい\n   * @return false:   比較する文字列より小さい\n   */\n  public isGreat(s: csmString): boolean {\n    return this.s > s.s;\n  }\n\n  /**\n   * 文字列比較 ==\n   * @param s 比較する文字列\n   * @return true:    比較する文字列と等しい\n   * @return false:   比較する文字列と異なる\n   */\n  public isEqual(s: string): boolean {\n    return this.s == s;\n  }\n\n  /**\n   * 文字列が空かどうか\n   * @return true: 空の文字列\n   * @return false: 値が設定されている\n   */\n  public isEmpty(): boolean {\n    return this.s.length == 0;\n  }\n\n  /**\n   * 引数付きコンストラクタ\n   */\n  public constructor(s: string) {\n    this.s = s;\n  }\n\n  s: string;\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './csmstring';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const csmString = $.csmString;\n  export type csmString = $.csmString;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { csmString } from '../type/csmstring';\n\n/**\n * パラメータ名・パーツ名・Drawable名を保持\n *\n * パラメータ名・パーツ名・Drawable名を保持するクラス。\n *\n * @note 指定したID文字列からCubismIdを取得する際はこのクラスの生成メソッドを呼ばず、\n *       CubismIdManager().getId(id)を使用してください\n */\nexport class CubismId {\n  /**\n   * 内部で使用するCubismIdクラス生成メソッド\n   *\n   * @param id ID文字列\n   * @returns CubismId\n   * @note 指定したID文字列からCubismIdを取得する際は\n   *       CubismIdManager().getId(id)を使用してください\n   */\n  public static createIdInternal(id: string | csmString) {\n    return new CubismId(id);\n  }\n\n  /**\n   * ID名を取得する\n   */\n  public getString(): csmString {\n    return this._id;\n  }\n\n  /**\n   * idを比較\n   * @param c 比較するid\n   * @return 同じならばtrue,異なっていればfalseを返す\n   */\n  public isEqual(c: string | csmString | CubismId): boolean {\n    if (typeof c === 'string') {\n      return this._id.isEqual(c);\n    } else if (c instanceof csmString) {\n      return this._id.isEqual(c.s);\n    } else if (c instanceof CubismId) {\n      return this._id.isEqual(c._id.s);\n    }\n    return false;\n  }\n\n  /**\n   * idを比較\n   * @param c 比較するid\n   * @return 同じならばtrue,異なっていればfalseを返す\n   */\n  public isNotEqual(c: string | csmString | CubismId): boolean {\n    if (typeof c == 'string') {\n      return !this._id.isEqual(c);\n    } else if (c instanceof csmString) {\n      return !this._id.isEqual(c.s);\n    } else if (c instanceof CubismId) {\n      return !this._id.isEqual(c._id.s);\n    }\n    return false;\n  }\n\n  /**\n   * プライベートコンストラクタ\n   *\n   * @note ユーザーによる生成は許可しません\n   */\n  private constructor(id: string | csmString) {\n    if (typeof id === 'string') {\n      this._id = new csmString(id);\n      return;\n    }\n\n    this._id = id;\n  }\n\n  private _id: csmString; // ID名\n}\n\nexport declare type CubismIdHandle = CubismId;\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismid';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismId = $.CubismId;\n  export type CubismId = $.CubismId;\n  export type CubismIdHandle = $.CubismIdHandle;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { csmString } from '../type/csmstring';\nimport { csmVector } from '../type/csmvector';\nimport { CubismId } from './cubismid';\n\n/**\n * ID名の管理\n *\n * ID名を管理する。\n */\nexport class CubismIdManager {\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    this._ids = new csmVector<CubismId>();\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    for (let i = 0; i < this._ids.getSize(); ++i) {\n      this._ids.set(i, void 0);\n    }\n    this._ids = null;\n  }\n\n  /**\n   * ID名をリストから登録\n   *\n   * @param ids ID名リスト\n   * @param count IDの個数\n   */\n  public registerIds(ids: string[] | csmString[]): void {\n    for (let i = 0; i < ids.length; i++) {\n      this.registerId(ids[i]);\n    }\n  }\n\n  /**\n   * ID名を登録\n   *\n   * @param id ID名\n   */\n  public registerId(id: string | csmString): CubismId {\n    let result: CubismId = null;\n\n    if ('string' == typeof id) {\n      if ((result = this.findId(id)) != null) {\n        return result;\n      }\n\n      result = CubismId.createIdInternal(id);\n      this._ids.pushBack(result);\n    } else {\n      return this.registerId(id.s);\n    }\n\n    return result;\n  }\n\n  /**\n   * ID名からIDを取得する\n   *\n   * @param id ID名\n   */\n  public getId(id: csmString | string): CubismId {\n    return this.registerId(id);\n  }\n\n  /**\n   * ID名からIDの確認\n   *\n   * @return true 存在する\n   * @return false 存在しない\n   */\n  public isExist(id: csmString | string): boolean {\n    if ('string' == typeof id) {\n      return this.findId(id) != null;\n    }\n    return this.isExist(id.s);\n  }\n\n  /**\n   * ID名からIDを検索する。\n   *\n   * @param id ID名\n   * @return 登録されているID。なければNULL。\n   */\n  private findId(id: string): CubismId {\n    for (let i = 0; i < this._ids.getSize(); ++i) {\n      if (this._ids.at(i).getString().isEqual(id)) {\n        return this._ids.at(i);\n      }\n    }\n\n    return null;\n  }\n\n  private _ids: csmVector<CubismId>; // 登録されているIDのリスト\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismidmanager';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismIdManager = $.CubismIdManager;\n  export type CubismIdManager = $.CubismIdManager;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\n/**\n * 4x4の行列\n *\n * 4x4行列の便利クラス。\n */\nexport class CubismMatrix44 {\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    this._tr = new Float32Array(16); // 4 * 4のサイズ\n    this.loadIdentity();\n  }\n\n  /**\n   * 受け取った２つの行列の乗算を行う。\n   *\n   * @param a 行列a\n   * @param b 行列b\n   * @return 乗算結果の行列\n   */\n  public static multiply(\n    a: Float32Array,\n    b: Float32Array,\n    dst: Float32Array\n  ): void {\n    const c: Float32Array = new Float32Array([\n      0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n      0.0\n    ]);\n\n    const n = 4;\n\n    for (let i = 0; i < n; ++i) {\n      for (let j = 0; j < n; ++j) {\n        for (let k = 0; k < n; ++k) {\n          c[j + i * 4] += a[k + i * 4] * b[j + k * 4];\n        }\n      }\n    }\n\n    for (let i = 0; i < 16; ++i) {\n      dst[i] = c[i];\n    }\n  }\n\n  /**\n   * 単位行列に初期化する\n   */\n  public loadIdentity(): void {\n    const c: Float32Array = new Float32Array([\n      1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0,\n      1.0\n    ]);\n\n    this.setMatrix(c);\n  }\n\n  /**\n   * 行列を設定\n   *\n   * @param tr 16個の浮動小数点数で表される4x4の行列\n   */\n  public setMatrix(tr: Float32Array): void {\n    for (let i = 0; i < 16; ++i) {\n      this._tr[i] = tr[i];\n    }\n  }\n\n  /**\n   * 行列を浮動小数点数の配列で取得\n   *\n   * @return 16個の浮動小数点数で表される4x4の行列\n   */\n  public getArray(): Float32Array {\n    return this._tr;\n  }\n\n  /**\n   * X軸の拡大率を取得\n   * @return X軸の拡大率\n   */\n  public getScaleX(): number {\n    return this._tr[0];\n  }\n\n  /**\n   * Y軸の拡大率を取得する\n   *\n   * @return Y軸の拡大率\n   */\n  public getScaleY(): number {\n    return this._tr[5];\n  }\n\n  /**\n   * X軸の移動量を取得\n   * @return X軸の移動量\n   */\n  public getTranslateX(): number {\n    return this._tr[12];\n  }\n\n  /**\n   * Y軸の移動量を取得\n   * @return Y軸の移動量\n   */\n  public getTranslateY(): number {\n    return this._tr[13];\n  }\n\n  /**\n   * X軸の値を現在の行列で計算\n   *\n   * @param src X軸の値\n   * @return 現在の行列で計算されたX軸の値\n   */\n  public transformX(src: number): number {\n    return this._tr[0] * src + this._tr[12];\n  }\n\n  /**\n   * Y軸の値を現在の行列で計算\n   *\n   * @param src Y軸の値\n   * @return 現在の行列で計算されたY軸の値\n   */\n  public transformY(src: number): number {\n    return this._tr[5] * src + this._tr[13];\n  }\n\n  /**\n   * X軸の値を現在の行列で逆計算\n   */\n  public invertTransformX(src: number): number {\n    return (src - this._tr[12]) / this._tr[0];\n  }\n\n  /**\n   * Y軸の値を現在の行列で逆計算\n   */\n  public invertTransformY(src: number): number {\n    return (src - this._tr[13]) / this._tr[5];\n  }\n\n  /**\n   * 現在の行列の位置を起点にして移動\n   *\n   * 現在の行列の位置を起点にして相対的に移動する。\n   *\n   * @param x X軸の移動量\n   * @param y Y軸の移動量\n   */\n  public translateRelative(x: number, y: number): void {\n    const tr1: Float32Array = new Float32Array([\n      1.0,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      1.0,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      1.0,\n      0.0,\n      x,\n      y,\n      0.0,\n      1.0\n    ]);\n\n    CubismMatrix44.multiply(tr1, this._tr, this._tr);\n  }\n\n  /**\n   * 現在の行列の位置を移動\n   *\n   * 現在の行列の位置を指定した位置へ移動する\n   *\n   * @param x X軸の移動量\n   * @param y y軸の移動量\n   */\n  public translate(x: number, y: number): void {\n    this._tr[12] = x;\n    this._tr[13] = y;\n  }\n\n  /**\n   * 現在の行列のX軸の位置を指定した位置へ移動する\n   *\n   * @param x X軸の移動量\n   */\n  public translateX(x: number): void {\n    this._tr[12] = x;\n  }\n\n  /**\n   * 現在の行列のY軸の位置を指定した位置へ移動する\n   *\n   * @param y Y軸の移動量\n   */\n  public translateY(y: number): void {\n    this._tr[13] = y;\n  }\n\n  /**\n   * 現在の行列の拡大率を相対的に設定する\n   *\n   * @param x X軸の拡大率\n   * @param y Y軸の拡大率\n   */\n  public scaleRelative(x: number, y: number): void {\n    const tr1: Float32Array = new Float32Array([\n      x,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      y,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      1.0,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      1.0\n    ]);\n\n    CubismMatrix44.multiply(tr1, this._tr, this._tr);\n  }\n\n  /**\n   * 現在の行列の拡大率を指定した倍率に設定する\n   *\n   * @param x X軸の拡大率\n   * @param y Y軸の拡大率\n   */\n  public scale(x: number, y: number): void {\n    this._tr[0] = x;\n    this._tr[5] = y;\n  }\n\n  /**\n   * 引数で与えられた行列にこの行列を乗算する。\n   * (引数で与えられた行列) * (この行列)\n   *\n   * @note 関数名と実際の計算内容に乖離があるため、今後計算順が修正される可能性があります。\n   * @param m 行列\n   */\n  public multiplyByMatrix(m: CubismMatrix44): void {\n    CubismMatrix44.multiply(m.getArray(), this._tr, this._tr);\n  }\n\n  /**\n   * オブジェクトのコピーを生成する\n   */\n  public clone(): CubismMatrix44 {\n    const cloneMatrix: CubismMatrix44 = new CubismMatrix44();\n\n    for (let i = 0; i < this._tr.length; i++) {\n      cloneMatrix._tr[i] = this._tr[i];\n    }\n\n    return cloneMatrix;\n  }\n\n  protected _tr: Float32Array; // 4x4行列データ\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmatrix44';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismMatrix44 = $.CubismMatrix44;\n  export type CubismMatrix44 = $.CubismMatrix44;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\n/**\n * 矩形形状（座標・長さはfloat値）を定義するクラス\n */\nexport class csmRect {\n  /**\n   * コンストラクタ\n   * @param x 左端X座標\n   * @param y 上端Y座標\n   * @param w 幅\n   * @param h 高さ\n   */\n  public constructor(x?: number, y?: number, w?: number, h?: number) {\n    this.x = x;\n    this.y = y;\n    this.width = w;\n    this.height = h;\n  }\n\n  /**\n   * 矩形中央のX座標を取得する\n   */\n  public getCenterX(): number {\n    return this.x + 0.5 * this.width;\n  }\n\n  /**\n   * 矩形中央のY座標を取得する\n   */\n  public getCenterY(): number {\n    return this.y + 0.5 * this.height;\n  }\n\n  /**\n   * 右側のX座標を取得する\n   */\n  public getRight(): number {\n    return this.x + this.width;\n  }\n\n  /**\n   * 下端のY座標を取得する\n   */\n  public getBottom(): number {\n    return this.y + this.height;\n  }\n\n  /**\n   * 矩形に値をセットする\n   * @param r 矩形のインスタンス\n   */\n  public setRect(r: csmRect): void {\n    this.x = r.x;\n    this.y = r.y;\n    this.width = r.width;\n    this.height = r.height;\n  }\n\n  /**\n   * 矩形中央を軸にして縦横を拡縮する\n   * @param w 幅方向に拡縮する量\n   * @param h 高さ方向に拡縮する量\n   */\n  public expand(w: number, h: number) {\n    this.x -= w;\n    this.y -= h;\n    this.width += w * 2.0;\n    this.height += h * 2.0;\n  }\n\n  public x: number; // 左端X座標\n  public y: number; // 上端Y座標\n  public width: number; // 幅\n  public height: number; // 高さ\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './csmrectf';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const csmRect = $.csmRect;\n  export type csmRect = $.csmRect;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismMatrix44 } from '../math/cubismmatrix44';\nimport { CubismModel } from '../model/cubismmodel';\nimport { csmRect } from '../type/csmrectf';\nimport { ICubismClippingManager } from './cubismclippingmanager';\n\n/**\n * モデル描画を処理するレンダラ\n *\n * サブクラスに環境依存の描画命令を記述する。\n */\nexport abstract class CubismRenderer {\n  /**\n   * レンダラのインスタンスを生成して取得する\n   *\n   * @return レンダラのインスタンス\n   */\n  public static create(): CubismRenderer {\n    return null;\n  }\n\n  /**\n   * レンダラのインスタンスを解放する\n   */\n  public static delete(renderer: CubismRenderer): void {\n    renderer = null;\n  }\n\n  /**\n   * レンダラの初期化処理を実行する\n   * 引数に渡したモデルからレンダラの初期化処理に必要な情報を取り出すことができる\n   * @param model モデルのインスタンス\n   */\n  public initialize(model: CubismModel): void {\n    this._model = model;\n  }\n\n  /**\n   * モデルを描画する\n   */\n  public drawModel(): void {\n    if (this.getModel() == null) return;\n\n    this.saveProfile();\n\n    this.doDrawModel();\n\n    this.restoreProfile();\n  }\n\n  /**\n   * Model-View-Projection 行列をセットする\n   * 配列は複製されるので、元の配列は外で破棄して良い\n   * @param matrix44 Model-View-Projection 行列\n   */\n  public setMvpMatrix(matrix44: CubismMatrix44): void {\n    this._mvpMatrix4x4.setMatrix(matrix44.getArray());\n  }\n\n  /**\n   * Model-View-Projection 行列を取得する\n   * @return Model-View-Projection 行列\n   */\n  public getMvpMatrix(): CubismMatrix44 {\n    return this._mvpMatrix4x4;\n  }\n\n  /**\n   * モデルの色をセットする\n   * 各色0.0~1.0の間で指定する（1.0が標準の状態）\n   * @param red 赤チャンネルの値\n   * @param green 緑チャンネルの値\n   * @param blue 青チャンネルの値\n   * @param alpha αチャンネルの値\n   */\n  public setModelColor(\n    red: number,\n    green: number,\n    blue: number,\n    alpha: number\n  ): void {\n    if (red < 0.0) {\n      red = 0.0;\n    } else if (red > 1.0) {\n      red = 1.0;\n    }\n\n    if (green < 0.0) {\n      green = 0.0;\n    } else if (green > 1.0) {\n      green = 1.0;\n    }\n\n    if (blue < 0.0) {\n      blue = 0.0;\n    } else if (blue > 1.0) {\n      blue = 1.0;\n    }\n\n    if (alpha < 0.0) {\n      alpha = 0.0;\n    } else if (alpha > 1.0) {\n      alpha = 1.0;\n    }\n\n    this._modelColor.r = red;\n    this._modelColor.g = green;\n    this._modelColor.b = blue;\n    this._modelColor.a = alpha;\n  }\n\n  /**\n   * モデルの色を取得する\n   * 各色0.0~1.0の間で指定する(1.0が標準の状態)\n   *\n   * @return RGBAのカラー情報\n   */\n  public getModelColor(): CubismTextureColor {\n    return JSON.parse(JSON.stringify(this._modelColor));\n  }\n\n  /**\n   * 透明度を考慮したモデルの色を計算する。\n   *\n   * @param opacity 透明度\n   *\n   * @return RGBAのカラー情報\n   */\n  getModelColorWithOpacity(opacity: number): CubismTextureColor {\n    const modelColorRGBA: CubismTextureColor = this.getModelColor();\n    modelColorRGBA.a *= opacity;\n    if (this.isPremultipliedAlpha()) {\n      modelColorRGBA.r *= modelColorRGBA.a;\n      modelColorRGBA.g *= modelColorRGBA.a;\n      modelColorRGBA.b *= modelColorRGBA.a;\n    }\n    return modelColorRGBA;\n  }\n\n  /**\n   * 乗算済みαの有効・無効をセットする\n   * 有効にするならtrue、無効にするならfalseをセットする\n   */\n  public setIsPremultipliedAlpha(enable: boolean): void {\n    this._isPremultipliedAlpha = enable;\n  }\n\n  /**\n   * 乗算済みαの有効・無効を取得する\n   * @return true 乗算済みのα有効\n   * @return false 乗算済みのα無効\n   */\n  public isPremultipliedAlpha(): boolean {\n    return this._isPremultipliedAlpha;\n  }\n\n  /**\n   * カリング（片面描画）の有効・無効をセットする。\n   * 有効にするならtrue、無効にするならfalseをセットする\n   */\n  public setIsCulling(culling: boolean): void {\n    this._isCulling = culling;\n  }\n\n  /**\n   * カリング（片面描画）の有効・無効を取得する。\n   * @return true カリング有効\n   * @return false カリング無効\n   */\n  public isCulling(): boolean {\n    return this._isCulling;\n  }\n\n  /**\n   * テクスチャの異方性フィルタリングのパラメータをセットする\n   * パラメータ値の影響度はレンダラの実装に依存する\n   * @param n パラメータの値\n   */\n  public setAnisotropy(n: number): void {\n    this._anisotropy = n;\n  }\n\n  /**\n   * テクスチャの異方性フィルタリングのパラメータをセットする\n   * @return 異方性フィルタリングのパラメータ\n   */\n  public getAnisotropy(): number {\n    return this._anisotropy;\n  }\n\n  /**\n   * レンダリングするモデルを取得する\n   * @return レンダリングするモデル\n   */\n  public getModel(): CubismModel {\n    return this._model;\n  }\n\n  /**\n   * マスク描画の方式を変更する。\n   * falseの場合、マスクを1枚のテクスチャに分割してレンダリングする（デフォルト）\n   * 高速だが、マスク個数の上限が36に限定され、質も荒くなる\n   * trueの場合、パーツ描画の前にその都度必要なマスクを描き直す\n   * レンダリング品質は高いが描画処理負荷は増す\n   * @param high 高精細マスクに切り替えるか？\n   */\n  public useHighPrecisionMask(high: boolean): void {\n    this._useHighPrecisionMask = high;\n  }\n\n  /**\n   * マスクの描画方式を取得する\n   * @return true 高精細方式\n   * @return false デフォルト\n   */\n  public isUsingHighPrecisionMask(): boolean {\n    return this._useHighPrecisionMask;\n  }\n\n  /**\n   * コンストラクタ\n   */\n  protected constructor() {\n    this._isCulling = false;\n    this._isPremultipliedAlpha = false;\n    this._anisotropy = 0.0;\n    this._model = null;\n    this._modelColor = new CubismTextureColor();\n    this._useHighPrecisionMask = false;\n\n    // 単位行列に初期化\n    this._mvpMatrix4x4 = new CubismMatrix44();\n    this._mvpMatrix4x4.loadIdentity();\n  }\n\n  /**\n   * モデル描画の実装\n   */\n  public abstract doDrawModel(): void;\n\n  /**\n   * モデル描画直前のレンダラのステートを保持する\n   */\n  protected abstract saveProfile(): void;\n\n  /**\n   * モデル描画直前のレンダラのステートを復帰する\n   */\n  protected abstract restoreProfile(): void;\n\n  /**\n   * レンダラが保持する静的なリソースを開放する\n   */\n  public static staticRelease: any;\n\n  protected _mvpMatrix4x4: CubismMatrix44; // Model-View-Projection 行列\n  protected _modelColor: CubismTextureColor; // モデル自体のカラー（RGBA）\n  protected _isCulling: boolean; // カリングが有効ならtrue\n  protected _isPremultipliedAlpha: boolean; // 乗算済みαならtrue\n  protected _anisotropy: any; // テクスチャの異方性フィルタリングのパラメータ\n  protected _model: CubismModel; // レンダリング対象のモデル\n  protected _useHighPrecisionMask: boolean; // falseの場合、マスクを纏めて描画する trueの場合、マスクはパーツ描画ごとに書き直す\n}\n\nexport enum CubismBlendMode {\n  CubismBlendMode_Normal = 0, // 通常\n  CubismBlendMode_Additive = 1, // 加算\n  CubismBlendMode_Multiplicative = 2 // 乗算\n}\n\n/**\n * テクスチャの色をRGBAで扱うためのクラス\n */\nexport class CubismTextureColor {\n  /**\n   * コンストラクタ\n   */\n  constructor(r = 1.0, g = 1.0, b = 1.0, a = 1.0) {\n    this.r = r;\n    this.g = g;\n    this.b = b;\n    this.a = a;\n  }\n\n  r: number; // 赤チャンネル\n  g: number; // 緑チャンネル\n  b: number; // 青チャンネル\n  a: number; // αチャンネル\n}\n\n/**\n * クリッピングマスクのコンテキスト\n */\nexport abstract class CubismClippingContext {\n  /**\n   * 引数付きコンストラクタ\n   */\n  public constructor(clippingDrawableIndices: Int32Array, clipCount: number) {\n    // クリップしている（＝マスク用の）Drawableのインデックスリスト\n    this._clippingIdList = clippingDrawableIndices;\n\n    // マスクの数\n    this._clippingIdCount = clipCount;\n\n    this._allClippedDrawRect = new csmRect();\n    this._layoutBounds = new csmRect();\n\n    this._clippedDrawableIndexList = [];\n\n    this._matrixForMask = new CubismMatrix44();\n    this._matrixForDraw = new CubismMatrix44();\n\n    this._bufferIndex = 0;\n  }\n\n  /**\n   * このマスクを管理するマネージャのインスタンスを取得する\n   * @return クリッピングマネージャのインスタンス\n   */\n  public abstract getClippingManager(): ICubismClippingManager;\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    if (this._layoutBounds != null) {\n      this._layoutBounds = null;\n    }\n\n    if (this._allClippedDrawRect != null) {\n      this._allClippedDrawRect = null;\n    }\n\n    if (this._clippedDrawableIndexList != null) {\n      this._clippedDrawableIndexList = null;\n    }\n  }\n\n  /**\n   * このマスクにクリップされる描画オブジェクトを追加する\n   *\n   * @param drawableIndex クリッピング対象に追加する描画オブジェクトのインデックス\n   */\n  public addClippedDrawable(drawableIndex: number) {\n    this._clippedDrawableIndexList.push(drawableIndex);\n  }\n\n  public _isUsing: boolean; // 現在の描画状態でマスクの準備が必要ならtrue\n  public readonly _clippingIdList: Int32Array; // クリッピングマスクのIDリスト\n  public _clippingIdCount: number; // クリッピングマスクの数\n  public _layoutChannelIndex: number; // RGBAのいずれのチャンネルにこのクリップを配置するか（0:R, 1:G, 2:B, 3:A）\n  public _layoutBounds: csmRect; // マスク用チャンネルのどの領域にマスクを入れるか（View座標-1~1, UVは0~1に直す）\n  public _allClippedDrawRect: csmRect; // このクリッピングで、クリッピングされるすべての描画オブジェクトの囲み矩形（毎回更新）\n  public _matrixForMask: CubismMatrix44; // マスクの位置計算結果を保持する行列\n  public _matrixForDraw: CubismMatrix44; // 描画オブジェクトの位置計算結果を保持する行列\n  public _clippedDrawableIndexList: number[]; // このマスクにクリップされる描画オブジェクトのリスト\n  public _bufferIndex: number; // このマスクが割り当てられるレンダーテクスチャ（フレームバッファ）やカラーバッファのインデックス\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismrenderer';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismBlendMode = $.CubismBlendMode;\n  export type CubismBlendMode = $.CubismBlendMode;\n  export const CubismRenderer = $.CubismRenderer;\n  export type CubismRenderer = $.CubismRenderer;\n  export const CubismTextureColor = $.CubismTextureColor;\n  export type CubismTextureColor = $.CubismTextureColor;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport {\n  CSM_LOG_LEVEL,\n  CSM_LOG_LEVEL_DEBUG,\n  CSM_LOG_LEVEL_ERROR,\n  CSM_LOG_LEVEL_INFO,\n  CSM_LOG_LEVEL_VERBOSE,\n  CSM_LOG_LEVEL_WARNING\n} from '../cubismframeworkconfig';\nimport { CubismFramework, LogLevel } from '../live2dcubismframework';\n\nexport const CubismLogPrint = (level: LogLevel, fmt: string, args: any[]) => {\n  CubismDebug.print(level, '[CSM]' + fmt, args);\n};\n\nexport const CubismLogPrintIn = (level: LogLevel, fmt: string, args: any[]) => {\n  CubismLogPrint(level, fmt + '\\n', args);\n};\n\nexport const CSM_ASSERT = (expr: any) => {\n  console.assert(expr);\n};\n\nexport let CubismLogVerbose: (fmt: string, ...args: any[]) => void;\nexport let CubismLogDebug: (fmt: string, ...args: any[]) => void;\nexport let CubismLogInfo: (fmt: string, ...args: any[]) => void;\nexport let CubismLogWarning: (fmt: string, ...args: any[]) => void;\nexport let CubismLogError: (fmt: string, ...args: any[]) => void;\n\nif (CSM_LOG_LEVEL <= CSM_LOG_LEVEL_VERBOSE) {\n  CubismLogVerbose = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Verbose, '[V]' + fmt, args);\n  };\n\n  CubismLogDebug = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Debug, '[D]' + fmt, args);\n  };\n\n  CubismLogInfo = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Info, '[I]' + fmt, args);\n  };\n\n  CubismLogWarning = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Warning, '[W]' + fmt, args);\n  };\n\n  CubismLogError = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Error, '[E]' + fmt, args);\n  };\n} else if (CSM_LOG_LEVEL == CSM_LOG_LEVEL_DEBUG) {\n  CubismLogDebug = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Debug, '[D]' + fmt, args);\n  };\n\n  CubismLogInfo = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Info, '[I]' + fmt, args);\n  };\n\n  CubismLogWarning = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Warning, '[W]' + fmt, args);\n  };\n\n  CubismLogError = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Error, '[E]' + fmt, args);\n  };\n} else if (CSM_LOG_LEVEL == CSM_LOG_LEVEL_INFO) {\n  CubismLogInfo = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Info, '[I]' + fmt, args);\n  };\n\n  CubismLogWarning = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Warning, '[W]' + fmt, args);\n  };\n\n  CubismLogError = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Error, '[E]' + fmt, args);\n  };\n} else if (CSM_LOG_LEVEL == CSM_LOG_LEVEL_WARNING) {\n  CubismLogWarning = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Warning, '[W]' + fmt, args);\n  };\n\n  CubismLogError = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Error, '[E]' + fmt, args);\n  };\n} else if (CSM_LOG_LEVEL == CSM_LOG_LEVEL_ERROR) {\n  CubismLogError = (fmt: string, ...args: any[]) => {\n    CubismLogPrintIn(LogLevel.LogLevel_Error, '[E]' + fmt, args);\n  };\n}\n\n/**\n * デバッグ用のユーティリティクラス。\n * ログの出力、バイトのダンプなど\n */\nexport class CubismDebug {\n  /**\n   * ログを出力する。第一引数にログレベルを設定する。\n   * CubismFramework.initialize()時にオプションで設定されたログ出力レベルを下回る場合はログに出さない。\n   *\n   * @param logLevel ログレベルの設定\n   * @param format 書式付き文字列\n   * @param args 可変長引数\n   */\n  public static print(logLevel: LogLevel, format: string, args?: any[]): void {\n    // オプションで設定されたログ出力レベルを下回る場合はログに出さない\n    if (logLevel < CubismFramework.getLoggingLevel()) {\n      return;\n    }\n\n    const logPrint: Live2DCubismCore.csmLogFunction =\n      CubismFramework.coreLogFunction;\n\n    if (!logPrint) return;\n\n    const buffer: string = format.replace(/\\{(\\d+)\\}/g, (m, k) => {\n      return args[k];\n    });\n    logPrint(buffer);\n  }\n\n  /**\n   * データから指定した長さだけダンプ出力する。\n   * CubismFramework.initialize()時にオプションで設定されたログ出力レベルを下回る場合はログに出さない。\n   *\n   * @param logLevel ログレベルの設定\n   * @param data ダンプするデータ\n   * @param length ダンプする長さ\n   */\n  public static dumpBytes(\n    logLevel: LogLevel,\n    data: Uint8Array,\n    length: number\n  ): void {\n    for (let i = 0; i < length; i++) {\n      if (i % 16 == 0 && i > 0) this.print(logLevel, '\\n');\n      else if (i % 8 == 0 && i > 0) this.print(logLevel, '  ');\n      this.print(logLevel, '{0} ', [data[i] & 0xff]);\n    }\n\n    this.print(logLevel, '\\n');\n  }\n\n  /**\n   * private コンストラクタ\n   */\n  private constructor() {}\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismdebug';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismDebug = $.CubismDebug;\n  export type CubismDebug = $.CubismDebug;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismLogDebug } from '../utils/cubismdebug';\n\n/**\n * Key-Valueのペアを定義するクラス\n * csmMapクラスの内部データで使用する。\n */\nexport class csmPair<_KeyT, _ValT> {\n  /**\n   * コンストラクタ\n   * @param key Keyとしてセットする値\n   * @param value Valueとしてセットする値\n   */\n  public constructor(key?: _KeyT, value?: _ValT) {\n    this.first = key == undefined ? null : key;\n\n    this.second = value == undefined ? null : value;\n  }\n\n  public first: _KeyT; // keyとして用いる変数\n  public second: _ValT; // valueとして用いる変数\n}\n\n/**\n * マップ型\n */\nexport class csmMap<_KeyT, _ValT> {\n  /**\n   * 引数付きコンストラクタ\n   * @param size 初期化時点で確保するサイズ\n   */\n  public constructor(size?: number) {\n    if (size != undefined) {\n      if (size < 1) {\n        this._keyValues = [];\n        this._dummyValue = null;\n        this._size = 0;\n      } else {\n        this._keyValues = new Array(size);\n        this._size = size;\n      }\n    } else {\n      this._keyValues = [];\n      this._dummyValue = null;\n      this._size = 0;\n    }\n  }\n\n  /**\n   * デストラクタ\n   */\n  public release() {\n    this.clear();\n  }\n\n  /**\n   * キーを追加する\n   * @param key 新たに追加するキー\n   */\n  public appendKey(key: _KeyT): void {\n    // 新しくKey/Valueのペアを作る\n    this.prepareCapacity(this._size + 1, false); // 1つ以上入る隙間を作る\n    // 新しいkey/valueのインデックスは_size\n\n    this._keyValues[this._size] = new csmPair<_KeyT, _ValT>(key);\n    this._size += 1;\n  }\n\n  /**\n   * 添字演算子[key]のオーバーロード(get)\n   * @param key 添字から特定されるValue値\n   */\n  public getValue(key: _KeyT): _ValT {\n    let found = -1;\n\n    for (let i = 0; i < this._size; i++) {\n      if (this._keyValues[i].first == key) {\n        found = i;\n        break;\n      }\n    }\n\n    if (found >= 0) {\n      return this._keyValues[found].second;\n    } else {\n      this.appendKey(key); // 新規キーを追加\n      return this._keyValues[this._size - 1].second;\n    }\n  }\n\n  /**\n   * 添字演算子[key]のオーバーロード(set)\n   * @param key 添字から特定されるValue値\n   * @param value 代入するValue値\n   */\n  public setValue(key: _KeyT, value: _ValT): void {\n    let found = -1;\n\n    for (let i = 0; i < this._size; i++) {\n      if (this._keyValues[i].first == key) {\n        found = i;\n        break;\n      }\n    }\n\n    if (found >= 0) {\n      this._keyValues[found].second = value;\n    } else {\n      this.appendKey(key); // 新規キーを追加\n      this._keyValues[this._size - 1].second = value;\n    }\n  }\n\n  /**\n   * 引数で渡したKeyを持つ要素が存在するか\n   * @param key 存在を確認するkey\n   * @return true 引数で渡したkeyを持つ要素が存在する\n   * @return false 引数で渡したkeyを持つ要素が存在しない\n   */\n  public isExist(key: _KeyT): boolean {\n    for (let i = 0; i < this._size; i++) {\n      if (this._keyValues[i].first == key) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * keyValueのポインタを全て解放する\n   */\n  public clear(): void {\n    this._keyValues = void 0;\n    this._keyValues = null;\n    this._keyValues = [];\n\n    this._size = 0;\n  }\n\n  /**\n   * コンテナのサイズを取得する\n   *\n   * @return コンテナのサイズ\n   */\n  public getSize(): number {\n    return this._size;\n  }\n\n  /**\n   * コンテナのキャパシティを確保する\n   * @param newSize 新たなキャパシティ。引数の値が現在のサイズ未満の場合は何もしない。\n   * @param fitToSize trueなら指定したサイズに合わせる。falseならサイズを2倍確保しておく。\n   */\n  public prepareCapacity(newSize: number, fitToSize: boolean): void {\n    if (newSize > this._keyValues.length) {\n      if (this._keyValues.length == 0) {\n        if (!fitToSize && newSize < csmMap.DefaultSize)\n          newSize = csmMap.DefaultSize;\n        this._keyValues.length = newSize;\n      } else {\n        if (!fitToSize && newSize < this._keyValues.length * 2)\n          newSize = this._keyValues.length * 2;\n        this._keyValues.length = newSize;\n      }\n    }\n  }\n\n  /**\n   * コンテナの先頭要素を返す\n   */\n  public begin(): iterator<_KeyT, _ValT> {\n    const ite: iterator<_KeyT, _ValT> = new iterator<_KeyT, _ValT>(this, 0);\n    return ite;\n  }\n\n  /**\n   * コンテナの終端要素を返す\n   */\n  public end(): iterator<_KeyT, _ValT> {\n    const ite: iterator<_KeyT, _ValT> = new iterator<_KeyT, _ValT>(\n      this,\n      this._size\n    ); // 終了\n    return ite;\n  }\n\n  /**\n   * コンテナから要素を削除する\n   *\n   * @param ite 削除する要素\n   */\n  public erase(ite: iterator<_KeyT, _ValT>): iterator<_KeyT, _ValT> {\n    const index: number = ite._index;\n    if (index < 0 || this._size <= index) {\n      return ite; // 削除範囲外\n    }\n\n    // 削除\n    this._keyValues.splice(index, 1);\n    --this._size;\n\n    const ite2: iterator<_KeyT, _ValT> = new iterator<_KeyT, _ValT>(\n      this,\n      index\n    ); // 終了\n    return ite2;\n  }\n\n  /**\n   * コンテナの値を32ビット符号付き整数型でダンプする\n   */\n  public dumpAsInt() {\n    for (let i = 0; i < this._size; i++) {\n      CubismLogDebug('{0} ,', this._keyValues[i]);\n      CubismLogDebug('\\n');\n    }\n  }\n\n  public static readonly DefaultSize = 10; // コンテナの初期化のデフォルトサイズ\n  public _keyValues: csmPair<_KeyT, _ValT>[]; // key-valueペアの配列\n  public _dummyValue: _ValT; // 空の値を返す為のダミー\n  public _size: number; // コンテナの要素数\n}\n\n/**\n * csmMap<T>のイテレータ\n */\nexport class iterator<_KeyT, _ValT> {\n  /**\n   * コンストラクタ\n   */\n  constructor(v?: csmMap<_KeyT, _ValT>, idx?: number) {\n    this._map = v != undefined ? v : new csmMap<_KeyT, _ValT>();\n\n    this._index = idx != undefined ? idx : 0;\n  }\n\n  /**\n   * =演算子のオーバーロード\n   */\n  public set(ite: iterator<_KeyT, _ValT>): iterator<_KeyT, _ValT> {\n    this._index = ite._index;\n    this._map = ite._map;\n    return this;\n  }\n\n  /**\n   * 前置き++演算子のオーバーロード\n   */\n  public preIncrement(): iterator<_KeyT, _ValT> {\n    ++this._index;\n    return this;\n  }\n\n  /**\n   * 前置き--演算子のオーバーロード\n   */\n  public preDecrement(): iterator<_KeyT, _ValT> {\n    --this._index;\n    return this;\n  }\n\n  /**\n   * 後置き++演算子のオーバーロード\n   */\n  public increment(): iterator<_KeyT, _ValT> {\n    const iteold = new iterator<_KeyT, _ValT>(this._map, this._index++); // 古い値を保存\n    return iteold;\n  }\n\n  /**\n   * 後置き--演算子のオーバーロード\n   */\n  public decrement(): iterator<_KeyT, _ValT> {\n    const iteold = new iterator<_KeyT, _ValT>(this._map, this._index); // 古い値を保存\n    this._map = iteold._map;\n    this._index = iteold._index;\n    return this;\n  }\n\n  /**\n   * *演算子のオーバーロード\n   */\n  public ptr(): csmPair<_KeyT, _ValT> {\n    return this._map._keyValues[this._index];\n  }\n\n  /**\n   * !=演算\n   */\n  public notEqual(ite: iterator<_KeyT, _ValT>): boolean {\n    return this._index != ite._index || this._map != ite._map;\n  }\n\n  _index: number; // コンテナのインデックス値\n  _map: csmMap<_KeyT, _ValT>; // コンテナ\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './csmmap';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const csmMap = $.csmMap;\n  export type csmMap<K, V> = $.csmMap<K, V>;\n  export const csmPair = $.csmPair;\n  export type csmPair<K, V> = $.csmPair<K, V>;\n  export const iterator = $.iterator;\n  export type iterator<K, V> = $.iterator<K, V>;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport {\n  JsonArray,\n  JsonBoolean,\n  JsonFloat,\n  JsonMap,\n  JsonNullvalue,\n  JsonString,\n  Value\n} from './cubismjson';\n\n/**\n * CubismJsonで実装されているJsonパーサを使用せず、\n * TypeScript標準のJsonパーサなどを使用し出力された結果を\n * Cubism SDKで定義されているJSONエレメントの要素に\n * 置き換える処理をするクラス。\n */\nexport class CubismJsonExtension {\n  static parseJsonObject(obj: Value, map: JsonMap) {\n    Object.keys(obj).forEach((key) => {\n      if (typeof obj[key] == 'boolean') {\n        const convValue = Boolean(obj[key]);\n        map.put(key, new JsonBoolean(convValue));\n      } else if (typeof obj[key] == 'string') {\n        const convValue = String(obj[key]);\n        map.put(key, new JsonString(convValue));\n      } else if (typeof obj[key] == 'number') {\n        const convValue = Number(obj[key]);\n        map.put(key, new JsonFloat(convValue));\n      } else if (obj[key] instanceof Array) {\n        map.put(key, CubismJsonExtension.parseJsonArray(obj[key]));\n      } else if (obj[key] instanceof Object) {\n        map.put(\n          key,\n          CubismJsonExtension.parseJsonObject(obj[key], new JsonMap())\n        );\n      } else if (obj[key] == null) {\n        map.put(key, new JsonNullvalue());\n      } else {\n        // どれにも当てはまらない場合でも処理する\n        map.put(key, obj[key]);\n      }\n    });\n    return map;\n  }\n\n  protected static parseJsonArray(obj: Value) {\n    const arr = new JsonArray();\n    Object.keys(obj).forEach((key) => {\n      const convKey = Number(key);\n      if (typeof convKey == 'number') {\n        if (typeof obj[key] == 'boolean') {\n          const convValue = Boolean(obj[key]);\n          arr.add(new JsonBoolean(convValue));\n        } else if (typeof obj[key] == 'string') {\n          const convValue = String(obj[key]);\n          arr.add(new JsonString(convValue));\n        } else if (typeof obj[key] == 'number') {\n          const convValue = Number(obj[key]);\n          arr.add(new JsonFloat(convValue));\n        } else if (obj[key] instanceof Array) {\n          arr.add(this.parseJsonArray(obj[key]));\n        } else if (obj[key] instanceof Object) {\n          arr.add(this.parseJsonObject(obj[key], new JsonMap()));\n        } else if (obj[key] == null) {\n          arr.add(new JsonNullvalue());\n        } else {\n          // どれにも当てはまらない場合でも処理する\n          arr.add(obj[key]);\n        }\n      } else if (obj[key] instanceof Array) {\n        arr.add(this.parseJsonArray(obj[key]));\n      } else if (obj[key] instanceof Object) {\n        arr.add(this.parseJsonObject(obj[key], new JsonMap()));\n      } else if (obj[key] == null) {\n        arr.add(new JsonNullvalue());\n      } else {\n        const convValue = Array(obj[key]);\n        // 配列ともObjectとも判定できなかった場合でも処理する\n        for (let i = 0; i < convValue.length; i++) {\n          arr.add(convValue[i]);\n        }\n      }\n    });\n    return arr;\n  }\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { strtod } from '../live2dcubismframework';\nimport { csmMap, iterator as csmMap_iterator } from '../type/csmmap';\nimport { csmString } from '../type/csmstring';\nimport { csmVector, iterator as csmVector_iterator } from '../type/csmvector';\nimport { CubismLogInfo } from './cubismdebug';\n\n// StaticInitializeNotForClientCall()で初期化する\nconst CSM_JSON_ERROR_TYPE_MISMATCH = 'Error: type mismatch';\nconst CSM_JSON_ERROR_INDEX_OF_BOUNDS = 'Error: index out of bounds';\n\n/**\n * パースしたJSONエレメントの要素の基底クラス。\n */\nexport abstract class Value {\n  /**\n   * コンストラクタ\n   */\n  public constructor() {}\n\n  /**\n   * 要素を文字列型で返す(csmString型)\n   */\n  public abstract getString(defaultValue?: string, indent?: string): string;\n\n  /**\n   * 要素を文字列型で返す(string)\n   */\n  public getRawString(defaultValue?: string, indent?: string): string {\n    return this.getString(defaultValue, indent);\n  }\n\n  /**\n   * 要素を数値型で返す(number)\n   */\n  public toInt(defaultValue = 0): number {\n    return defaultValue;\n  }\n\n  /**\n   * 要素を数値型で返す(number)\n   */\n  public toFloat(defaultValue = 0): number {\n    return defaultValue;\n  }\n\n  /**\n   * 要素を真偽値で返す(boolean)\n   */\n  public toBoolean(defaultValue = false): boolean {\n    return defaultValue;\n  }\n\n  /**\n   * サイズを返す\n   */\n  public getSize(): number {\n    return 0;\n  }\n\n  /**\n   * 要素を配列で返す(Value[])\n   */\n  public getArray(defaultValue: Value[] = null): Value[] {\n    return defaultValue;\n  }\n\n  /**\n   * 要素をコンテナで返す(array)\n   */\n  public getVector(defaultValue = new csmVector<Value>()): csmVector<Value> {\n    return defaultValue;\n  }\n\n  /**\n   * 要素をマップで返す(csmMap<csmString, Value>)\n   */\n  public getMap(defaultValue?: csmMap<string, Value>): csmMap<string, Value> {\n    return defaultValue;\n  }\n\n  /**\n   * 添字演算子[index]\n   */\n  public getValueByIndex(index: number): Value {\n    return Value.errorValue.setErrorNotForClientCall(\n      CSM_JSON_ERROR_TYPE_MISMATCH\n    );\n  }\n\n  /**\n   * 添字演算子[string | csmString]\n   */\n  public getValueByString(s: string | csmString): Value {\n    return Value.nullValue.setErrorNotForClientCall(\n      CSM_JSON_ERROR_TYPE_MISMATCH\n    );\n  }\n\n  /**\n   * マップのキー一覧をコンテナで返す\n   *\n   * @return マップのキーの一覧\n   */\n  public getKeys(): csmVector<string> {\n    return Value.dummyKeys;\n  }\n\n  /**\n   * Valueの種類がエラー値ならtrue\n   */\n  public isError(): boolean {\n    return false;\n  }\n\n  /**\n   * Valueの種類がnullならtrue\n   */\n  public isNull(): boolean {\n    return false;\n  }\n\n  /**\n   * Valueの種類が真偽値ならtrue\n   */\n  public isBool(): boolean {\n    return false;\n  }\n\n  /**\n   * Valueの種類が数値型ならtrue\n   */\n  public isFloat(): boolean {\n    return false;\n  }\n\n  /**\n   * Valueの種類が文字列ならtrue\n   */\n  public isString(): boolean {\n    return false;\n  }\n\n  /**\n   * Valueの種類が配列ならtrue\n   */\n  public isArray(): boolean {\n    return false;\n  }\n\n  /**\n   * Valueの種類がマップ型ならtrue\n   */\n  public isMap(): boolean {\n    return false;\n  }\n\n  /**\n   * 引数の値と等しければtrue\n   */\n  public equals(value: csmString): boolean;\n  public equals(value: string): boolean;\n  public equals(value: number): boolean;\n  public equals(value: boolean): boolean;\n  public equals(value: any): boolean {\n    return false;\n  }\n\n  /**\n   * Valueの値が静的ならtrue、静的なら解放しない\n   */\n  public isStatic(): boolean {\n    return false;\n  }\n\n  /**\n   * Valueにエラー値をセットする\n   */\n  public setErrorNotForClientCall(errorStr: string): Value {\n    return JsonError.errorValue;\n  }\n\n  /**\n   * 初期化用メソッド\n   */\n  public static staticInitializeNotForClientCall(): void {\n    JsonBoolean.trueValue = new JsonBoolean(true);\n    JsonBoolean.falseValue = new JsonBoolean(false);\n    Value.errorValue = new JsonError('ERROR', true);\n    Value.nullValue = new JsonNullvalue();\n    Value.dummyKeys = new csmVector<string>();\n  }\n\n  /**\n   * リリース用メソッド\n   */\n  public static staticReleaseNotForClientCall(): void {\n    JsonBoolean.trueValue = null;\n    JsonBoolean.falseValue = null;\n    Value.errorValue = null;\n    Value.nullValue = null;\n    Value.dummyKeys = null;\n  }\n\n  protected _stringBuffer: string; // 文字列バッファ\n\n  private static dummyKeys: csmVector<string>; // ダミーキー\n\n  public static errorValue: Value; // 一時的な返り値として返すエラー。 CubismFramework::Disposeするまではdeleteしない\n  public static nullValue: Value; // 一時的な返り値として返すNULL。   CubismFramework::Disposeするまではdeleteしない\n\n  [key: string]: any; // 明示的に連想配列をany型で指定\n}\n\n/**\n * Ascii文字のみ対応した最小限の軽量JSONパーサ。\n * 仕様はJSONのサブセットとなる。\n * 設定ファイル(model3.json)などのロード用\n *\n * [未対応項目]\n * ・日本語などの非ASCII文字\n * ・eによる指数表現\n */\nexport class CubismJson {\n  /**\n   * コンストラクタ\n   */\n  public constructor(buffer?: ArrayBuffer, length?: number) {\n    this._error = null;\n    this._lineCount = 0;\n    this._root = null;\n\n    if (buffer != undefined) {\n      this.parseBytes(buffer, length, this._parseCallback);\n    }\n  }\n\n  /**\n   * バイトデータから直接ロードしてパースする\n   *\n   * @param buffer バッファ\n   * @param size バッファサイズ\n   * @return CubismJsonクラスのインスタンス。失敗したらNULL\n   */\n  public static create(buffer: ArrayBuffer, size: number) {\n    const json = new CubismJson();\n    const succeeded: boolean = json.parseBytes(\n      buffer,\n      size,\n      json._parseCallback\n    );\n\n    if (!succeeded) {\n      CubismJson.delete(json);\n      return null;\n    } else {\n      return json;\n    }\n  }\n\n  /**\n   * パースしたJSONオブジェクトの解放処理\n   *\n   * @param instance CubismJsonクラスのインスタンス\n   */\n  public static delete(instance: CubismJson) {\n    instance = null;\n  }\n\n  /**\n   * パースしたJSONのルート要素を返す\n   */\n  public getRoot(): Value {\n    return this._root;\n  }\n\n  /**\n   *  UnicodeのバイナリをStringに変換\n   *\n   * @param buffer 変換するバイナリデータ\n   * @return 変換後の文字列\n   */\n  public static arrayBufferToString(buffer: ArrayBuffer): string {\n    const uint8Array: Uint8Array = new Uint8Array(buffer);\n    let str = '';\n\n    for (let i = 0, len: number = uint8Array.length; i < len; ++i) {\n      str += '%' + this.pad(uint8Array[i].toString(16));\n    }\n\n    str = decodeURIComponent(str);\n    return str;\n  }\n\n  /**\n   * エンコード、パディング\n   */\n  private static pad(n: string): string {\n    return n.length < 2 ? '0' + n : n;\n  }\n\n  /**\n   * JSONのパースを実行する\n   * @param buffer    パース対象のデータバイト\n   * @param size      データバイトのサイズ\n   * return true : 成功\n   * return false: 失敗\n   */\n  public parseBytes(\n    buffer: ArrayBuffer,\n    size: number,\n    parseCallback?: parseJsonObject\n  ): boolean {\n    const endPos: number[] = new Array<number>(1); // 参照渡しにするため配列\n    const decodeBuffer: string = CubismJson.arrayBufferToString(buffer);\n\n    if (parseCallback == undefined) {\n      this._root = this.parseValue(decodeBuffer, size, 0, endPos);\n    } else {\n      // TypeScript標準のJSONパーサを使う\n      this._root = parseCallback(JSON.parse(decodeBuffer), new JsonMap());\n    }\n\n    if (this._error) {\n      let strbuf = '\\0';\n      strbuf = 'Json parse error : @line ' + (this._lineCount + 1) + '\\n';\n      this._root = new JsonString(strbuf);\n\n      CubismLogInfo('{0}', this._root.getRawString());\n      return false;\n    } else if (this._root == null) {\n      this._root = new JsonError(new csmString(this._error), false); // rootは解放されるのでエラーオブジェクトを別途作成する\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * パース時のエラー値を返す\n   */\n  public getParseError(): string {\n    return this._error;\n  }\n\n  /**\n   * ルート要素の次の要素がファイルの終端だったらtrueを返す\n   */\n  public checkEndOfFile(): boolean {\n    return this._root.getArray()[1].equals('EOF');\n  }\n\n  /**\n   * JSONエレメントからValue(float,String,Value*,Array,null,true,false)をパースする\n   * エレメントの書式に応じて内部でParseString(), ParseObject(), ParseArray()を呼ぶ\n   *\n   * @param   buffer      JSONエレメントのバッファ\n   * @param   length      パースする長さ\n   * @param   begin       パースを開始する位置\n   * @param   outEndPos   パース終了時の位置\n   * @return      パースから取得したValueオブジェクト\n   */\n  protected parseValue(\n    buffer: string,\n    length: number,\n    begin: number,\n    outEndPos: number[]\n  ) {\n    if (this._error) return null;\n\n    let o: Value = null;\n    let i: number = begin;\n    let f: number;\n\n    for (; i < length; i++) {\n      const c: string = buffer[i];\n      switch (c) {\n        case '-':\n        case '.':\n        case '0':\n        case '1':\n        case '2':\n        case '3':\n        case '4':\n        case '5':\n        case '6':\n        case '7':\n        case '8':\n        case '9': {\n          const afterString: string[] = new Array(1); // 参照渡しにするため\n          f = strtod(buffer.slice(i), afterString);\n          outEndPos[0] = buffer.indexOf(afterString[0]);\n          return new JsonFloat(f);\n        }\n        case '\"':\n          return new JsonString(\n            this.parseString(buffer, length, i + 1, outEndPos)\n          ); // \\\"の次の文字から\n        case '[':\n          o = this.parseArray(buffer, length, i + 1, outEndPos);\n          return o;\n        case '{':\n          o = this.parseObject(buffer, length, i + 1, outEndPos);\n          return o;\n        case 'n': // null以外にない\n          if (i + 3 < length) {\n            o = new JsonNullvalue(); // 解放できるようにする\n            outEndPos[0] = i + 4;\n          } else {\n            this._error = 'parse null';\n          }\n          return o;\n        case 't': // true以外にない\n          if (i + 3 < length) {\n            o = JsonBoolean.trueValue;\n            outEndPos[0] = i + 4;\n          } else {\n            this._error = 'parse true';\n          }\n          return o;\n        case 'f': // false以外にない\n          if (i + 4 < length) {\n            o = JsonBoolean.falseValue;\n            outEndPos[0] = i + 5;\n          } else {\n            this._error = \"illegal ',' position\";\n          }\n          return o;\n        case ',': // Array separator\n          this._error = \"illegal ',' position\";\n          return null;\n        case ']': // 不正な｝だがスキップする。配列の最後に不要な , があると思われる\n          outEndPos[0] = i; // 同じ文字を再処理\n          return null;\n        case '\\n':\n          this._lineCount++;\n        // falls through\n        case ' ':\n        case '\\t':\n        case '\\r':\n        default:\n          // スキップ\n          break;\n      }\n    }\n\n    this._error = 'illegal end of value';\n    return null;\n  }\n\n  /**\n   * 次の「\"」までの文字列をパースする。\n   *\n   * @param   string  ->  パース対象の文字列\n   * @param   length  ->  パースする長さ\n   * @param   begin   ->  パースを開始する位置\n   * @param  outEndPos   ->  パース終了時の位置\n   * @return      パースした文F字列要素\n   */\n  protected parseString(\n    string: string,\n    length: number,\n    begin: number,\n    outEndPos: number[]\n  ): string {\n    if (this._error) {\n      return null;\n    }\n\n    if (!string) {\n      this._error = 'string is null';\n      return null;\n    }\n\n    let i = begin;\n    let c: string, c2: string;\n    const ret: csmString = new csmString('');\n    let bufStart: number = begin; // sbufに登録されていない文字の開始位置\n\n    for (; i < length; i++) {\n      c = string[i];\n\n      switch (c) {\n        case '\"': {\n          // 終端の”、エスケープ文字は別に処理されるのでここに来ない\n          outEndPos[0] = i + 1; // ”の次の文字\n          ret.append(string.slice(bufStart), i - bufStart); // 前の文字までを登録する\n          return ret.s;\n        }\n        // falls through\n        case '//': {\n          // エスケープの場合\n          i++; // ２文字をセットで扱う\n\n          if (i - 1 > bufStart) {\n            ret.append(string.slice(bufStart), i - bufStart); // 前の文字までを登録する\n          }\n          bufStart = i + 1; // エスケープ（２文字)の次の文字から\n\n          if (i < length) {\n            c2 = string[i];\n\n            switch (c2) {\n              case '\\\\':\n                ret.expansion(1, '\\\\');\n                break;\n              case '\"':\n                ret.expansion(1, '\"');\n                break;\n              case '/':\n                ret.expansion(1, '/');\n                break;\n              case 'b':\n                ret.expansion(1, '\\b');\n                break;\n              case 'f':\n                ret.expansion(1, '\\f');\n                break;\n              case 'n':\n                ret.expansion(1, '\\n');\n                break;\n              case 'r':\n                ret.expansion(1, '\\r');\n                break;\n              case 't':\n                ret.expansion(1, '\\t');\n                break;\n              case 'u':\n                this._error = 'parse string/unicord escape not supported';\n                break;\n              default:\n                break;\n            }\n          } else {\n            this._error = 'parse string/escape error';\n          }\n        }\n        // falls through\n        default: {\n          break;\n        }\n      }\n    }\n\n    this._error = 'parse string/illegal end';\n    return null;\n  }\n\n  /**\n   * JSONのオブジェクトエレメントをパースしてValueオブジェクトを返す\n   *\n   * @param buffer    JSONエレメントのバッファ\n   * @param length    パースする長さ\n   * @param begin     パースを開始する位置\n   * @param outEndPos パース終了時の位置\n   * @return パースから取得したValueオブジェクト\n   */\n  protected parseObject(\n    buffer: string,\n    length: number,\n    begin: number,\n    outEndPos: number[]\n  ): Value {\n    if (this._error) {\n      return null;\n    }\n\n    if (!buffer) {\n      this._error = 'buffer is null';\n      return null;\n    }\n\n    const ret: JsonMap = new JsonMap();\n\n    // Key: Value\n    let key = '';\n    let i: number = begin;\n    let c = '';\n    const localRetEndPos2: number[] = Array(1);\n    let ok = false;\n\n    // , が続く限りループ\n    for (; i < length; i++) {\n      FOR_LOOP: for (; i < length; i++) {\n        c = buffer[i];\n\n        switch (c) {\n          case '\"':\n            key = this.parseString(buffer, length, i + 1, localRetEndPos2);\n            if (this._error) {\n              return null;\n            }\n\n            i = localRetEndPos2[0];\n            ok = true;\n            break FOR_LOOP; //-- loopから出る\n          case '}': // 閉じカッコ\n            outEndPos[0] = i + 1;\n            return ret; // 空\n          case ':':\n            this._error = \"illegal ':' position\";\n            break;\n          case '\\n':\n            this._lineCount++;\n          // falls through\n          default:\n            break; // スキップする文字\n        }\n      }\n      if (!ok) {\n        this._error = 'key not found';\n        return null;\n      }\n\n      ok = false;\n\n      // : をチェック\n      FOR_LOOP2: for (; i < length; i++) {\n        c = buffer[i];\n\n        switch (c) {\n          case ':':\n            ok = true;\n            i++;\n            break FOR_LOOP2;\n          case '}':\n            this._error = \"illegal '}' position\";\n            break;\n          // falls through\n          case '\\n':\n            this._lineCount++;\n          // case ' ': case '\\t' : case '\\r':\n          // falls through\n          default:\n            break; // スキップする文字\n        }\n      }\n\n      if (!ok) {\n        this._error = \"':' not found\";\n        return null;\n      }\n\n      // 値をチェック\n      const value: Value = this.parseValue(buffer, length, i, localRetEndPos2);\n      if (this._error) {\n        return null;\n      }\n\n      i = localRetEndPos2[0];\n\n      // ret.put(key, value);\n      ret.put(key, value);\n\n      FOR_LOOP3: for (; i < length; i++) {\n        c = buffer[i];\n\n        switch (c) {\n          case ',':\n            break FOR_LOOP3;\n          case '}':\n            outEndPos[0] = i + 1;\n            return ret; // 正常終了\n          case '\\n':\n            this._lineCount++;\n          // falls through\n          default:\n            break; // スキップ\n        }\n      }\n    }\n\n    this._error = 'illegal end of perseObject';\n    return null;\n  }\n\n  /**\n   * 次の「\"」までの文字列をパースする。\n   * @param buffer    JSONエレメントのバッファ\n   * @param length    パースする長さ\n   * @param begin     パースを開始する位置\n   * @param outEndPos パース終了時の位置\n   * @return パースから取得したValueオブジェクト\n   */\n  protected parseArray(\n    buffer: string,\n    length: number,\n    begin: number,\n    outEndPos: number[]\n  ): Value {\n    if (this._error) {\n      return null;\n    }\n\n    if (!buffer) {\n      this._error = 'buffer is null';\n      return null;\n    }\n\n    let ret: JsonArray = new JsonArray();\n\n    // key : value\n    let i: number = begin;\n    let c: string;\n    const localRetEndpos2: number[] = new Array(1);\n\n    // , が続く限りループ\n    for (; i < length; i++) {\n      // : をチェック\n      const value: Value = this.parseValue(buffer, length, i, localRetEndpos2);\n\n      if (this._error) {\n        return null;\n      }\n      i = localRetEndpos2[0];\n\n      if (value) {\n        ret.add(value);\n      }\n\n      // FOR_LOOP3:\n      // boolean breakflag = false;\n      FOR_LOOP: for (; i < length; i++) {\n        c = buffer[i];\n\n        switch (c) {\n          case ',':\n            // breakflag = true;\n            // break; // 次のKEY, VAlUEへ\n            break FOR_LOOP;\n          case ']':\n            outEndPos[0] = i + 1;\n            return ret; // 終了\n          case '\\n':\n            ++this._lineCount;\n          //case ' ': case '\\t': case '\\r':\n          // falls through\n          default:\n            break; // スキップ\n        }\n      }\n    }\n\n    ret = void 0;\n    this._error = 'illegal end of parseObject';\n    return null;\n  }\n\n  _parseCallback: parseJsonObject = CubismJsonExtension.parseJsonObject; // パース時に使う処理のコールバック関数\n\n  _error: string; // パース時のエラー\n  _lineCount: number; // エラー報告に用いる行数カウント\n  _root: Value; // パースされたルート要素\n}\n\ninterface parseJsonObject {\n  (obj: Value, map: JsonMap): JsonMap;\n}\n\n/**\n * パースしたJSONの要素をfloat値として扱う\n */\nexport class JsonFloat extends Value {\n  /**\n   * コンストラクタ\n   */\n  constructor(v: number) {\n    super();\n\n    this._value = v;\n  }\n\n  /**\n   * Valueの種類が数値型ならtrue\n   */\n  public isFloat(): boolean {\n    return true;\n  }\n\n  /**\n   * 要素を文字列で返す(csmString型)\n   */\n  public getString(defaultValue: string, indent: string): string {\n    const strbuf = '\\0';\n    this._value = parseFloat(strbuf);\n    this._stringBuffer = strbuf;\n\n    return this._stringBuffer;\n  }\n\n  /**\n   * 要素を数値型で返す(number)\n   */\n  public toInt(defaultValue = 0): number {\n    return parseInt(this._value.toString());\n  }\n\n  /**\n   * 要素を数値型で返す(number)\n   */\n  public toFloat(defaultValue = 0.0): number {\n    return this._value;\n  }\n\n  /**\n   * 引数の値と等しければtrue\n   */\n  public equals(value: csmString): boolean;\n  public equals(value: string): boolean;\n  public equals(value: number): boolean;\n  public equals(value: boolean): boolean;\n  public equals(value: any): boolean {\n    if ('number' === typeof value) {\n      // int\n      if (Math.round(value)) {\n        return false;\n      }\n      // float\n      else {\n        return value == this._value;\n      }\n    }\n    return false;\n  }\n\n  private _value: number; // JSON要素の値\n}\n\n/**\n * パースしたJSONの要素を真偽値として扱う\n */\nexport class JsonBoolean extends Value {\n  /**\n   * Valueの種類が真偽値ならtrue\n   */\n  public isBool(): boolean {\n    return true;\n  }\n\n  /**\n   * 要素を真偽値で返す(boolean)\n   */\n  public toBoolean(defaultValue = false): boolean {\n    return this._boolValue;\n  }\n\n  /**\n   * 要素を文字列で返す(csmString型)\n   */\n  public getString(defaultValue: string, indent: string): string {\n    this._stringBuffer = this._boolValue ? 'true' : 'false';\n\n    return this._stringBuffer;\n  }\n\n  /**\n   * 引数の値と等しければtrue\n   */\n  public equals(value: csmString): boolean;\n  public equals(value: string): boolean;\n  public equals(value: number): boolean;\n  public equals(value: boolean): boolean;\n  public equals(value: any): boolean {\n    if ('boolean' === typeof value) {\n      return value == this._boolValue;\n    }\n    return false;\n  }\n\n  /**\n   * Valueの値が静的ならtrue, 静的なら解放しない\n   */\n  public isStatic(): boolean {\n    return true;\n  }\n\n  /**\n   * 引数付きコンストラクタ\n   */\n  public constructor(v: boolean) {\n    super();\n\n    this._boolValue = v;\n  }\n\n  static trueValue: JsonBoolean; // true\n  static falseValue: JsonBoolean; // false\n\n  private _boolValue: boolean; // JSON要素の値\n}\n\n/**\n * パースしたJSONの要素を文字列として扱う\n */\nexport class JsonString extends Value {\n  /**\n   * 引数付きコンストラクタ\n   */\n  public constructor(s: string);\n  public constructor(s: csmString);\n  public constructor(s: any) {\n    super();\n\n    if ('string' === typeof s) {\n      this._stringBuffer = s;\n    }\n\n    if (s instanceof csmString) {\n      this._stringBuffer = s.s;\n    }\n  }\n\n  /**\n   * Valueの種類が文字列ならtrue\n   */\n  public isString(): boolean {\n    return true;\n  }\n\n  /**\n   * 要素を文字列で返す(csmString型)\n   */\n  public getString(defaultValue: string, indent: string): string {\n    return this._stringBuffer;\n  }\n\n  /**\n   * 引数の値と等しければtrue\n   */\n  public equals(value: csmString): boolean;\n  public equals(value: string): boolean;\n  public equals(value: number): boolean;\n  public equals(value: boolean): boolean;\n  public equals(value: any): boolean {\n    if ('string' === typeof value) {\n      return this._stringBuffer == value;\n    }\n\n    if (value instanceof csmString) {\n      return this._stringBuffer == value.s;\n    }\n\n    return false;\n  }\n}\n\n/**\n * JSONパース時のエラー結果。文字列型のようにふるまう\n */\nexport class JsonError extends JsonString {\n  /**\n   * Valueの値が静的ならtrue、静的なら解放しない\n   */\n  public isStatic(): boolean {\n    return this._isStatic;\n  }\n\n  /**\n   * エラー情報をセットする\n   */\n  public setErrorNotForClientCall(s: string): Value {\n    this._stringBuffer = s;\n    return this;\n  }\n\n  /**\n   * 引数付きコンストラクタ\n   */\n  public constructor(s: csmString | string, isStatic: boolean) {\n    if ('string' === typeof s) {\n      super(s);\n    } else {\n      super(s);\n    }\n    this._isStatic = isStatic;\n  }\n\n  /**\n   * Valueの種類がエラー値ならtrue\n   */\n  public isError(): boolean {\n    return true;\n  }\n\n  protected _isStatic: boolean; // 静的なValueかどうか\n}\n\n/**\n * パースしたJSONの要素をNULL値として持つ\n */\nexport class JsonNullvalue extends Value {\n  /**\n   * Valueの種類がNULL値ならtrue\n   */\n  public isNull(): boolean {\n    return true;\n  }\n\n  /**\n   * 要素を文字列で返す(csmString型)\n   */\n  public getString(defaultValue: string, indent: string): string {\n    return this._stringBuffer;\n  }\n\n  /**\n   * Valueの値が静的ならtrue, 静的なら解放しない\n   */\n  public isStatic(): boolean {\n    return true;\n  }\n\n  /**\n   * Valueにエラー値をセットする\n   */\n  public setErrorNotForClientCall(s: string): Value {\n    this._stringBuffer = s;\n    return JsonError.nullValue;\n  }\n\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    super();\n\n    this._stringBuffer = 'NullValue';\n  }\n}\n\n/**\n * パースしたJSONの要素を配列として持つ\n */\nexport class JsonArray extends Value {\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    super();\n    this._array = new csmVector<Value>();\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    for (\n      let ite: csmVector_iterator<Value> = this._array.begin();\n      ite.notEqual(this._array.end());\n      ite.preIncrement()\n    ) {\n      let v: Value = ite.ptr();\n\n      if (v && !v.isStatic()) {\n        v = void 0;\n        v = null;\n      }\n    }\n  }\n\n  /**\n   * Valueの種類が配列ならtrue\n   */\n  public isArray(): boolean {\n    return true;\n  }\n\n  /**\n   * 添字演算子[index]\n   */\n  public getValueByIndex(index: number): Value {\n    if (index < 0 || this._array.getSize() <= index) {\n      return Value.errorValue.setErrorNotForClientCall(\n        CSM_JSON_ERROR_INDEX_OF_BOUNDS\n      );\n    }\n\n    const v: Value = this._array.at(index);\n\n    if (v == null) {\n      return Value.nullValue;\n    }\n\n    return v;\n  }\n\n  /**\n   * 添字演算子[string | csmString]\n   */\n  public getValueByString(s: string | csmString): Value {\n    return Value.errorValue.setErrorNotForClientCall(\n      CSM_JSON_ERROR_TYPE_MISMATCH\n    );\n  }\n\n  /**\n   * 要素を文字列で返す(csmString型)\n   */\n  public getString(defaultValue: string, indent: string): string {\n    const stringBuffer: string = indent + '[\\n';\n\n    for (\n      let ite: csmVector_iterator<Value> = this._array.begin();\n      ite.notEqual(this._array.end());\n      ite.increment()\n    ) {\n      const v: Value = ite.ptr();\n      this._stringBuffer += indent + '' + v.getString(indent + ' ') + '\\n';\n    }\n\n    this._stringBuffer = stringBuffer + indent + ']\\n';\n\n    return this._stringBuffer;\n  }\n\n  /**\n   * 配列要素を追加する\n   * @param v 追加する要素\n   */\n  public add(v: Value): void {\n    this._array.pushBack(v);\n  }\n\n  /**\n   * 要素をコンテナで返す(csmVector<Value>)\n   */\n  public getVector(defaultValue: csmVector<Value> = null): csmVector<Value> {\n    return this._array;\n  }\n\n  /**\n   * 要素の数を返す\n   */\n  public getSize(): number {\n    return this._array.getSize();\n  }\n\n  private _array: csmVector<Value>; // JSON要素の値\n}\n\n/**\n * パースしたJSONの要素をマップとして持つ\n */\nexport class JsonMap extends Value {\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    super();\n    this._map = new csmMap<string, Value>();\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    const ite: csmMap_iterator<string, Value> = this._map.begin();\n\n    while (ite.notEqual(this._map.end())) {\n      let v: Value = ite.ptr().second;\n\n      if (v && !v.isStatic()) {\n        v = void 0;\n        v = null;\n      }\n\n      ite.preIncrement();\n    }\n  }\n\n  /**\n   * Valueの値がMap型ならtrue\n   */\n  public isMap(): boolean {\n    return true;\n  }\n\n  /**\n   * 添字演算子[string | csmString]\n   */\n  public getValueByString(s: string | csmString): Value {\n    if (s instanceof csmString) {\n      const ret: Value = this._map.getValue(s.s);\n      if (ret == null) {\n        return Value.nullValue;\n      }\n      return ret;\n    }\n\n    for (\n      let iter: csmMap_iterator<string, Value> = this._map.begin();\n      iter.notEqual(this._map.end());\n      iter.preIncrement()\n    ) {\n      if (iter.ptr().first == s) {\n        if (iter.ptr().second == null) {\n          return Value.nullValue;\n        }\n        return iter.ptr().second;\n      }\n    }\n\n    return Value.nullValue;\n  }\n\n  /**\n   * 添字演算子[index]\n   */\n  public getValueByIndex(index: number): Value {\n    return Value.errorValue.setErrorNotForClientCall(\n      CSM_JSON_ERROR_TYPE_MISMATCH\n    );\n  }\n\n  /**\n   * 要素を文字列で返す(csmString型)\n   */\n  public getString(defaultValue: string, indent: string) {\n    this._stringBuffer = indent + '{\\n';\n\n    const ite: csmMap_iterator<string, Value> = this._map.begin();\n    while (ite.notEqual(this._map.end())) {\n      const key = ite.ptr().first;\n      const v: Value = ite.ptr().second;\n\n      this._stringBuffer +=\n        indent + ' ' + key + ' : ' + v.getString(indent + '   ') + ' \\n';\n      ite.preIncrement();\n    }\n\n    this._stringBuffer += indent + '}\\n';\n\n    return this._stringBuffer;\n  }\n\n  /**\n   * 要素をMap型で返す\n   */\n  public getMap(defaultValue?: csmMap<string, Value>): csmMap<string, Value> {\n    return this._map;\n  }\n\n  /**\n   * Mapに要素を追加する\n   */\n  public put(key: string, v: Value): void {\n    this._map.setValue(key, v);\n  }\n\n  /**\n   * Mapからキーのリストを取得する\n   */\n  public getKeys(): csmVector<string> {\n    if (!this._keys) {\n      this._keys = new csmVector<string>();\n\n      const ite: csmMap_iterator<string, Value> = this._map.begin();\n\n      while (ite.notEqual(this._map.end())) {\n        const key: string = ite.ptr().first;\n        this._keys.pushBack(key);\n        ite.preIncrement();\n      }\n    }\n    return this._keys;\n  }\n\n  /**\n   * Mapの要素数を取得する\n   */\n  public getSize(): number {\n    return this._keys.getSize();\n  }\n\n  private _map: csmMap<string, Value>; // JSON要素の値\n  private _keys: csmVector<string>; // JSON要素の値\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismjson';\nimport { CubismJsonExtension } from './cubismjsonextension';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismJson = $.CubismJson;\n  export type CubismJson = $.CubismJson;\n  export const JsonArray = $.JsonArray;\n  export type JsonArray = $.JsonArray;\n  export const JsonBoolean = $.JsonBoolean;\n  export type JsonBoolean = $.JsonBoolean;\n  export const JsonError = $.JsonError;\n  export type JsonError = $.JsonError;\n  export const JsonFloat = $.JsonFloat;\n  export type JsonFloat = $.JsonFloat;\n  export const JsonMap = $.JsonMap;\n  export type JsonMap = $.JsonMap;\n  export const JsonNullvalue = $.JsonNullvalue;\n  export type JsonNullvalue = $.JsonNullvalue;\n  export const JsonString = $.JsonString;\n  export type JsonString = $.JsonString;\n  export const Value = $.Value;\n  export type Value = $.Value;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdManager } from './id/cubismidmanager';\nimport { CubismRenderer } from './rendering/cubismrenderer';\nimport {\n  CSM_ASSERT,\n  CubismLogInfo,\n  CubismLogWarning\n} from './utils/cubismdebug';\nimport { Value } from './utils/cubismjson';\n\nexport function strtod(s: string, endPtr: string[]): number {\n  let index = 0;\n  for (let i = 1; ; i++) {\n    const testC: string = s.slice(i - 1, i);\n\n    // 指数・マイナスの可能性があるのでスキップする\n    if (testC == 'e' || testC == '-' || testC == 'E') {\n      continue;\n    } // 文字列の範囲を広げていく\n\n    const test: string = s.substring(0, i);\n    const number = Number(test);\n    if (isNaN(number)) {\n      // 数値として認識できなくなったので終了\n      break;\n    } // 最後に数値としてできたindexを格納しておく\n\n    index = i;\n  }\n  let d = parseFloat(s); // パースした数値\n\n  if (isNaN(d)) {\n    // 数値として認識できなくなったので終了\n    d = NaN;\n  }\n\n  endPtr[0] = s.slice(index); // 後続の文字列\n  return d;\n}\n\n// ファイルスコープの変数を初期化\n\nlet s_isStarted = false;\nlet s_isInitialized = false;\nlet s_option: Option = null;\nlet s_cubismIdManager: CubismIdManager = null;\n\n/**\n * Framework内で使う定数の宣言\n */\nexport const Constant = Object.freeze<Record<string, number>>({\n  vertexOffset: 0, // メッシュ頂点のオフセット値\n  vertexStep: 2 // メッシュ頂点のステップ値\n});\n\nexport function csmDelete<T>(address: T): void {\n  if (!address) {\n    return;\n  }\n\n  address = void 0;\n}\n\n/**\n * Live2D Cubism SDK Original Workflow SDKのエントリポイント\n * 利用開始時はCubismFramework.initialize()を呼び、CubismFramework.dispose()で終了する。\n */\nexport class CubismFramework {\n  /**\n   * Cubism FrameworkのAPIを使用可能にする。\n   *  APIを実行する前に必ずこの関数を実行すること。\n   *  一度準備が完了して以降は、再び実行しても内部処理がスキップされます。\n   *\n   * @param    option      Optionクラスのインスタンス\n   *\n   * @return   準備処理が完了したらtrueが返ります。\n   */\n  public static startUp(option: Option = null): boolean {\n    if (s_isStarted) {\n      CubismLogInfo('CubismFramework.startUp() is already done.');\n      return s_isStarted;\n    }\n\n    s_option = option;\n\n    if (s_option != null) {\n      Live2DCubismCore.Logging.csmSetLogFunction(s_option.logFunction);\n    }\n\n    s_isStarted = true;\n\n    // Live2D Cubism Coreバージョン情報を表示\n    if (s_isStarted) {\n      const version: number = Live2DCubismCore.Version.csmGetVersion();\n      const major: number = (version & 0xff000000) >> 24;\n      const minor: number = (version & 0x00ff0000) >> 16;\n      const patch: number = version & 0x0000ffff;\n      const versionNumber: number = version;\n\n      CubismLogInfo(\n        `Live2D Cubism Core version: {0}.{1}.{2} ({3})`,\n        ('00' + major).slice(-2),\n        ('00' + minor).slice(-2),\n        ('0000' + patch).slice(-4),\n        versionNumber\n      );\n    }\n\n    CubismLogInfo('CubismFramework.startUp() is complete.');\n\n    return s_isStarted;\n  }\n\n  /**\n   * StartUp()で初期化したCubismFrameworkの各パラメータをクリアします。\n   * Dispose()したCubismFrameworkを再利用する際に利用してください。\n   */\n  public static cleanUp(): void {\n    s_isStarted = false;\n    s_isInitialized = false;\n    s_option = null;\n    s_cubismIdManager = null;\n  }\n\n  /**\n   * Cubism Framework内のリソースを初期化してモデルを表示可能な状態にします。<br>\n   *     再度Initialize()するには先にDispose()を実行する必要があります。\n   *\n   * @param memorySize 初期化時メモリ量 [byte(s)]\n   *    複数モデル表示時などにモデルが更新されない際に使用してください。\n   *    指定する際は必ず1024*1024*16 byte(16MB)以上の値を指定してください。\n   *    それ以外はすべて1024*1024*16 byteに丸めます。\n   */\n  public static initialize(memorySize = 0): void {\n    CSM_ASSERT(s_isStarted);\n    if (!s_isStarted) {\n      CubismLogWarning('CubismFramework is not started.');\n      return;\n    }\n\n    // --- s_isInitializedによる連続初期化ガード ---\n    // 連続してリソース確保が行われないようにする。\n    // 再度Initialize()するには先にDispose()を実行する必要がある。\n    if (s_isInitialized) {\n      CubismLogWarning(\n        'CubismFramework.initialize() skipped, already initialized.'\n      );\n      return;\n    }\n\n    //---- static 初期化 ----\n    Value.staticInitializeNotForClientCall();\n\n    s_cubismIdManager = new CubismIdManager();\n\n    // --- HACK: 初期化時メモリ量の拡張(単位byte) ---\n    // 複数モデル表示時などにモデルが更新されない際に使用してください。\n    // 指定する際は必ず1024*1024*16 byte(16MB)以上の値を指定してください。\n    // それ以外はすべて1024*1024*16 byteに丸めます。\n    Live2DCubismCore.Memory.initializeAmountOfMemory(memorySize);\n\n    s_isInitialized = true;\n\n    CubismLogInfo('CubismFramework.initialize() is complete.');\n  }\n\n  /**\n   * Cubism Framework内の全てのリソースを解放します。\n   *      ただし、外部で確保されたリソースについては解放しません。\n   *      外部で適切に破棄する必要があります。\n   */\n  public static dispose(): void {\n    CSM_ASSERT(s_isStarted);\n    if (!s_isStarted) {\n      CubismLogWarning('CubismFramework is not started.');\n      return;\n    }\n\n    // --- s_isInitializedによる未初期化解放ガード ---\n    // dispose()するには先にinitialize()を実行する必要がある。\n    if (!s_isInitialized) {\n      // false...リソース未確保の場合\n      CubismLogWarning('CubismFramework.dispose() skipped, not initialized.');\n      return;\n    }\n\n    Value.staticReleaseNotForClientCall();\n\n    s_cubismIdManager.release();\n    s_cubismIdManager = null;\n\n    // レンダラの静的リソース（シェーダプログラム他）を解放する\n    CubismRenderer.staticRelease();\n\n    s_isInitialized = false;\n\n    CubismLogInfo('CubismFramework.dispose() is complete.');\n  }\n\n  /**\n   * Cubism FrameworkのAPIを使用する準備が完了したかどうか\n   * @return APIを使用する準備が完了していればtrueが返ります。\n   */\n  public static isStarted(): boolean {\n    return s_isStarted;\n  }\n\n  /**\n   * Cubism Frameworkのリソース初期化がすでに行われているかどうか\n   * @return リソース確保が完了していればtrueが返ります\n   */\n  public static isInitialized(): boolean {\n    return s_isInitialized;\n  }\n\n  /**\n   * Core APIにバインドしたログ関数を実行する\n   *\n   * @praram message ログメッセージ\n   */\n  public static coreLogFunction(message: string): void {\n    // Return if logging not possible.\n    if (!Live2DCubismCore.Logging.csmGetLogFunction()) {\n      return;\n    }\n\n    Live2DCubismCore.Logging.csmGetLogFunction()(message);\n  }\n\n  /**\n   * 現在のログ出力レベル設定の値を返す。\n   *\n   * @return  現在のログ出力レベル設定の値\n   */\n  public static getLoggingLevel(): LogLevel {\n    if (s_option != null) {\n      return s_option.loggingLevel;\n    }\n    return LogLevel.LogLevel_Off;\n  }\n\n  /**\n   * IDマネージャのインスタンスを取得する\n   * @return CubismManagerクラスのインスタンス\n   */\n  public static getIdManager(): CubismIdManager {\n    return s_cubismIdManager;\n  }\n\n  /**\n   * 静的クラスとして使用する\n   * インスタンス化させない\n   */\n  private constructor() {}\n}\n\nexport class Option {\n  logFunction: Live2DCubismCore.csmLogFunction; // ログ出力の関数オブジェクト\n  loggingLevel: LogLevel; // ログ出力レベルの設定\n}\n\n/**\n * ログ出力のレベル\n */\nexport enum LogLevel {\n  LogLevel_Verbose = 0, // 詳細ログ\n  LogLevel_Debug, // デバッグログ\n  LogLevel_Info, // Infoログ\n  LogLevel_Warning, // 警告ログ\n  LogLevel_Error, // エラーログ\n  LogLevel_Off // ログ出力無効\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './live2dcubismframework';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const Constant = $.Constant;\n  export const csmDelete = $.csmDelete;\n  export const CubismFramework = $.CubismFramework;\n  export type CubismFramework = $.CubismFramework;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { LogLevel } from '@framework/live2dcubismframework'\n\n/**\n * Sample Appで使用する定数\n */\n\ninterface ILAppDefine {\n\n  // Canvas width and height pixel values, or dynamic screen size ('auto').\n  CanvasSize: { width: number, height: number } | 'auto'\n\n  // 消息框\n  MessageBoxId: string\n  MessageStyle: Record<string, any>\n\n  // 画面\n  ViewScale : number\n  ViewMaxScale : number\n  ViewMinScale : number\n\n  ViewLogicalLeft : number\n  ViewLogicalRight : number\n  ViewLogicalBottom : number\n  ViewLogicalTop : number\n\n  ViewLogicalMaxLeft : number\n  ViewLogicalMaxRight : number\n  ViewLogicalMaxBottom : number\n  ViewLogicalMaxTop : number\n\n  // 相対パス\n  ResourcesPath: string\n\n  BackImageName: string\n\n  // 外部定義ファイル（json）と合わせる\n  MotionGroupIdle: string // アイドリング\n\n  MotionGroupTapBody: string // 体をタップしたとき\n\n  // 外部定義ファイル（json）と合わせる\n  HitAreaNameHead: string\n  HitAreaNameBody: string\n\n  // モーションの優先度定数\n  PriorityNone: 0\n  PriorityIdle: 1\n  PriorityNormal: 2\n  PriorityForce: 3\n\n  // MOC3の一貫性検証オプション\n  MOCConsistencyValidationEnable: boolean\n\n  // デバッグ用ログの表示オプション\n  DebugLogEnable: boolean\n  DebugTouchLogEnable: boolean\n\n  // Frameworkから出力するログのレベル設定\n  CubismLoggingLevel: LogLevel\n\n  // デフォルトのレンダーターゲットサイズ\n  RenderTargetWidth: number\n  RenderTargetHeight: number\n}\n\n// Canvas width and height pixel values, or dynamic screen size ('auto').\nconst config: ILAppDefine = {\n  CanvasSize: 'auto',\n\n  MessageBoxId: 'live2d-message-box',\n  MessageStyle: {},\n\n  // 画面\n  ViewScale: 1.0,\n  ViewMaxScale: 2.0,\n  ViewMinScale: 0.8,\n\n  ViewLogicalLeft: -1.0,\n  ViewLogicalRight: 1.0,\n  ViewLogicalBottom: -1.0,\n  ViewLogicalTop: 1.0,\n\n  ViewLogicalMaxLeft: -2.0,\n  ViewLogicalMaxRight: 2.0,\n  ViewLogicalMaxBottom: -2.0,\n  ViewLogicalMaxTop: 2.0,\n\n  // 相対パス\n  ResourcesPath: '../../Resources/',\n\n  BackImageName: '',\n\n  // 外部定義ファイル（json）と合わせる\n  MotionGroupIdle: 'Idle', // アイドリング\n  MotionGroupTapBody: 'TapBody', // 体をタップしたとき\n\n  // 外部定義ファイル（json）と合わせる\n  HitAreaNameHead: 'Head',\n  HitAreaNameBody: 'Body',\n\n  // モーションの優先度定数\n  PriorityNone: 0,\n  PriorityIdle: 1,\n  PriorityNormal: 2,\n  PriorityForce: 3,\n\n  // MOC3の一貫性検証オプション\n  MOCConsistencyValidationEnable: true,\n\n  // デバッグ用ログの表示オプション\n  DebugLogEnable: true,\n  DebugTouchLogEnable: false,\n\n  // Frameworkから出力するログのレベル設定\n  CubismLoggingLevel: LogLevel.LogLevel_Verbose,\n\n  // デフォルトのレンダーターゲットサイズ\n  RenderTargetWidth: 1900,\n  RenderTargetHeight: 1000,\n}\n\nexport default config","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nexport let canvas: HTMLCanvasElement = null;\nexport let gl: WebGLRenderingContext = null;\nexport let s_instance: LAppGlManager = null;\n\n/**\n * Cubism SDKのサンプルで使用するWebGLを管理するクラス\n */\nexport class LAppGlManager {\n  /**\n   * クラスのインスタンス（シングルトン）を返す。\n   * インスタンスが生成されていない場合は内部でインスタンスを生成する。\n   *\n   * @return クラスのインスタンス\n   */\n  public static getInstance(create: boolean = true): LAppGlManager {\n    if (create && s_instance == null) {\n      s_instance = new LAppGlManager();\n    }\n\n    return s_instance;\n  }\n\n  /**\n   * クラスのインスタンス（シングルトン）を解放する。\n   */\n  public static releaseInstance(): void {\n    if (s_instance != null) {\n      s_instance.release();\n    }\n\n    s_instance = null;\n  }\n\n  constructor() {\n    // キャンバスの作成\n    canvas = document.createElement('canvas');\n    canvas.id = 'live2d_canvas';\n\n    // glコンテキストを初期化\n    // @ts-ignore\n    gl = canvas.getContext('webgl2');\n\n    if (!gl) {\n      // gl初期化失敗\n      alert('Cannot initialize WebGL. This browser does not support.');\n      gl = null;\n\n      document.body.innerHTML =\n        'This browser does not support the <code>&lt;canvas&gt;</code> element.';\n    }\n  }\n\n  /**\n   * 解放する。\n   */\n  public release(): void {\n    document.getElementById('live2d_canvas').remove();\n  }\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\n/**\n * @brief パラメータIDのデフォルト値を保持する定数<br>\n *         デフォルト値の仕様は以下のマニュアルに基づく<br>\n *         https://docs.live2d.com/cubism-editor-manual/standard-parametor-list/\n */\nexport const CubismDefaultParameterId = Object.freeze<Record<string, string>>({\n  // パーツID\n  HitAreaPrefix: 'HitArea',\n  HitAreaHead: 'Head',\n  HitAreaBody: 'Body',\n  PartsIdCore: 'Parts01Core',\n  PartsArmPrefix: 'Parts01Arm_',\n  PartsArmLPrefix: 'Parts01ArmL_',\n  PartsArmRPrefix: 'Parts01ArmR_',\n  // パラメータID\n  ParamAngleX: 'ParamAngleX',\n  ParamAngleY: 'ParamAngleY',\n  ParamAngleZ: 'ParamAngleZ',\n  ParamEyeLOpen: 'ParamEyeLOpen',\n  ParamEyeLSmile: 'ParamEyeLSmile',\n  ParamEyeROpen: 'ParamEyeROpen',\n  ParamEyeRSmile: 'ParamEyeRSmile',\n  ParamEyeBallX: 'ParamEyeBallX',\n  ParamEyeBallY: 'ParamEyeBallY',\n  ParamEyeBallForm: 'ParamEyeBallForm',\n  ParamBrowLY: 'ParamBrowLY',\n  ParamBrowRY: 'ParamBrowRY',\n  ParamBrowLX: 'ParamBrowLX',\n  ParamBrowRX: 'ParamBrowRX',\n  ParamBrowLAngle: 'ParamBrowLAngle',\n  ParamBrowRAngle: 'ParamBrowRAngle',\n  ParamBrowLForm: 'ParamBrowLForm',\n  ParamBrowRForm: 'ParamBrowRForm',\n  ParamMouthForm: 'ParamMouthForm',\n  ParamMouthOpenY: 'ParamMouthOpenY',\n  ParamCheek: 'ParamCheek',\n  ParamBodyAngleX: 'ParamBodyAngleX',\n  ParamBodyAngleY: 'ParamBodyAngleY',\n  ParamBodyAngleZ: 'ParamBodyAngleZ',\n  ParamBreath: 'ParamBreath',\n  ParamArmLA: 'ParamArmLA',\n  ParamArmRA: 'ParamArmRA',\n  ParamArmLB: 'ParamArmLB',\n  ParamArmRB: 'ParamArmRB',\n  ParamHandL: 'ParamHandL',\n  ParamHandR: 'ParamHandR',\n  ParamHairFront: 'ParamHairFront',\n  ParamHairSide: 'ParamHairSide',\n  ParamHairBack: 'ParamHairBack',\n  ParamHairFluffy: 'ParamHairFluffy',\n  ParamShoulderY: 'ParamShoulderY',\n  ParamBustX: 'ParamBustX',\n  ParamBustY: 'ParamBustY',\n  ParamBaseX: 'ParamBaseX',\n  ParamBaseY: 'ParamBaseY',\n  ParamNONE: 'NONE:'\n});\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismdefaultparameterid';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const HitAreaBody = $.CubismDefaultParameterId.HitAreaBody;\n  export const HitAreaHead = $.CubismDefaultParameterId.HitAreaHead;\n  export const HitAreaPrefix = $.CubismDefaultParameterId.HitAreaPrefix;\n  export const ParamAngleX = $.CubismDefaultParameterId.ParamAngleX;\n  export const ParamAngleY = $.CubismDefaultParameterId.ParamAngleY;\n  export const ParamAngleZ = $.CubismDefaultParameterId.ParamAngleZ;\n  export const ParamArmLA = $.CubismDefaultParameterId.ParamArmLA;\n  export const ParamArmLB = $.CubismDefaultParameterId.ParamArmLB;\n  export const ParamArmRA = $.CubismDefaultParameterId.ParamArmRA;\n  export const ParamArmRB = $.CubismDefaultParameterId.ParamArmRB;\n  export const ParamBaseX = $.CubismDefaultParameterId.ParamBaseX;\n  export const ParamBaseY = $.CubismDefaultParameterId.ParamBaseY;\n  export const ParamBodyAngleX = $.CubismDefaultParameterId.ParamBodyAngleX;\n  export const ParamBodyAngleY = $.CubismDefaultParameterId.ParamBodyAngleY;\n  export const ParamBodyAngleZ = $.CubismDefaultParameterId.ParamBodyAngleZ;\n  export const ParamBreath = $.CubismDefaultParameterId.ParamBreath;\n  export const ParamBrowLAngle = $.CubismDefaultParameterId.ParamBrowLAngle;\n  export const ParamBrowLForm = $.CubismDefaultParameterId.ParamBrowLForm;\n  export const ParamBrowLX = $.CubismDefaultParameterId.ParamBrowLX;\n  export const ParamBrowLY = $.CubismDefaultParameterId.ParamBrowLY;\n  export const ParamBrowRAngle = $.CubismDefaultParameterId.ParamBrowRAngle;\n  export const ParamBrowRForm = $.CubismDefaultParameterId.ParamBrowRForm;\n  export const ParamBrowRX = $.CubismDefaultParameterId.ParamBrowRX;\n  export const ParamBrowRY = $.CubismDefaultParameterId.ParamBrowRY;\n  export const ParamBustX = $.CubismDefaultParameterId.ParamBustX;\n  export const ParamBustY = $.CubismDefaultParameterId.ParamBustY;\n  export const ParamCheek = $.CubismDefaultParameterId.ParamCheek;\n  export const ParamEyeBallForm = $.CubismDefaultParameterId.ParamEyeBallForm;\n  export const ParamEyeBallX = $.CubismDefaultParameterId.ParamEyeBallX;\n  export const ParamEyeBallY = $.CubismDefaultParameterId.ParamEyeBallY;\n  export const ParamEyeLOpen = $.CubismDefaultParameterId.ParamEyeLOpen;\n  export const ParamEyeLSmile = $.CubismDefaultParameterId.ParamEyeLSmile;\n  export const ParamEyeROpen = $.CubismDefaultParameterId.ParamEyeROpen;\n  export const ParamEyeRSmile = $.CubismDefaultParameterId.ParamEyeRSmile;\n  export const ParamHairBack = $.CubismDefaultParameterId.ParamHairBack;\n  export const ParamHairFluffy = $.CubismDefaultParameterId.ParamHairFluffy;\n  export const ParamHairFront = $.CubismDefaultParameterId.ParamHairFront;\n  export const ParamHairSide = $.CubismDefaultParameterId.ParamHairSide;\n  export const ParamHandL = $.CubismDefaultParameterId.ParamHandL;\n  export const ParamHandR = $.CubismDefaultParameterId.ParamHandR;\n  export const ParamMouthForm = $.CubismDefaultParameterId.ParamMouthForm;\n  export const ParamMouthOpenY = $.CubismDefaultParameterId.ParamMouthOpenY;\n  export const ParamNONE = $.CubismDefaultParameterId.ParamNONE;\n  export const ParamShoulderY = $.CubismDefaultParameterId.ParamShoulderY;\n  export const PartsArmLPrefix = $.CubismDefaultParameterId.PartsArmLPrefix;\n  export const PartsArmPrefix = $.CubismDefaultParameterId.PartsArmPrefix;\n  export const PartsArmRPrefix = $.CubismDefaultParameterId.PartsArmRPrefix;\n  export const PartsIdCore = $.CubismDefaultParameterId.PartsIdCore;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdHandle } from './id/cubismid';\nimport { csmMap } from './type/csmmap';\n\n/**\n * モデル設定情報を取り扱う関数を宣言した純粋仮想クラス。\n *\n * このクラスを継承することで、モデル設定情報を取り扱うクラスになる。\n */\nexport abstract class ICubismModelSetting {\n  /**\n   * Mocファイルの名前を取得する\n   * @return Mocファイルの名前\n   */\n  public abstract getModelFileName(): string;\n\n  /**\n   * モデルが使用するテクスチャの数を取得する\n   * テクスチャの数\n   */\n  public abstract getTextureCount(): number;\n\n  /**\n   * テクスチャが配置されたディレクトリの名前を取得する\n   * @return テクスチャが配置されたディレクトリの名前\n   */\n  public abstract getTextureDirectory(): string;\n\n  /**\n   * モデルが使用するテクスチャの名前を取得する\n   * @param index 配列のインデックス値\n   * @return テクスチャの名前\n   */\n  public abstract getTextureFileName(index: number): string;\n\n  /**\n   * モデルに設定された当たり判定の数を取得する\n   * @return モデルに設定された当たり判定の数\n   */\n  public abstract getHitAreasCount(): number;\n\n  /**\n   * 当たり判定に設定されたIDを取得する\n   *\n   * @param index 配列のindex\n   * @return 当たり判定に設定されたID\n   */\n  public abstract getHitAreaId(index: number): CubismIdHandle;\n\n  /**\n   * 当たり判定に設定された名前を取得する\n   * @param index 配列のインデックス値\n   * @return 当たり判定に設定された名前\n   */\n  public abstract getHitAreaName(index: number): string;\n\n  /**\n   * 物理演算設定ファイルの名前を取得する\n   * @return 物理演算設定ファイルの名前\n   */\n  public abstract getPhysicsFileName(): string;\n\n  /**\n   * パーツ切り替え設定ファイルの名前を取得する\n   * @return パーツ切り替え設定ファイルの名前\n   */\n  public abstract getPoseFileName(): string;\n\n  /**\n   * 表情設定ファイルの数を取得する\n   * @return 表情設定ファイルの数\n   */\n  public abstract getExpressionCount(): number;\n\n  /**\n   * 表情設定ファイルを識別する名前（別名）を取得する\n   * @param index 配列のインデックス値\n   * @return 表情の名前\n   */\n  public abstract getExpressionName(index: number): string;\n\n  /**\n   * 表情設定ファイルの名前を取得する\n   * @param index 配列のインデックス値\n   * @return 表情設定ファイルの名前\n   */\n  public abstract getExpressionFileName(index: number): string;\n\n  /**\n   * モーショングループの数を取得する\n   * @return モーショングループの数\n   */\n  public abstract getMotionGroupCount(): number;\n\n  /**\n   * モーショングループの名前を取得する\n   * @param index 配列のインデックス値\n   * @return モーショングループの名前\n   */\n  public abstract getMotionGroupName(index: number): string;\n\n  /**\n   * モーショングループに含まれるモーションの数を取得する\n   * @param groupName モーショングループの名前\n   * @return モーショングループの数\n   */\n  public abstract getMotionCount(groupName: string): number;\n\n  /**\n   * グループ名とインデックス値からモーションファイル名を取得する\n   * @param groupName モーショングループの名前\n   * @param index     配列のインデックス値\n   * @return モーションファイルの名前\n   */\n  public abstract getMotionFileName(groupName: string, index: number): string;\n\n  /**\n   * モーションに対応するサウンドファイルの名前を取得する\n   * @param groupName モーショングループの名前\n   * @param index 配列のインデックス値\n   * @return サウンドファイルの名前\n   */\n  public abstract getMotionSoundFileName(\n    groupName: string,\n    index: number\n  ): string;\n\n  /**\n   * モーション開始時のフェードイン処理時間を取得する\n   * @param groupName モーショングループの名前\n   * @param index 配列のインデックス値\n   * @return フェードイン処理時間[秒]\n   */\n  public abstract getMotionFadeInTimeValue(\n    groupName: string,\n    index: number\n  ): number;\n\n  /**\n   * モーション終了時のフェードアウト処理時間を取得する\n   * @param groupName モーショングループの名前\n   * @param index 配列のインデックス値\n   * @return フェードアウト処理時間[秒]\n   */\n  public abstract getMotionFadeOutTimeValue(\n    groupName: string,\n    index: number\n  ): number;\n\n  /**\n   * ユーザーデータのファイル名を取得する\n   * @return ユーザーデータのファイル名\n   */\n  public abstract getUserDataFile(): string;\n\n  /**\n   * レイアウト情報を取得する\n   * @param outLayoutMap csmMapクラスのインスタンス\n   * @return true レイアウト情報が存在する\n   * @return false レイアウト情報が存在しない\n   */\n  public abstract getLayoutMap(outLayoutMap: csmMap<string, number>): boolean;\n\n  /**\n   * 目パチに関連付けられたパラメータの数を取得する\n   * @return 目パチに関連付けられたパラメータの数\n   */\n  public abstract getEyeBlinkParameterCount(): number;\n\n  /**\n   * 目パチに関連付けられたパラメータのIDを取得する\n   * @param index 配列のインデックス値\n   * @return パラメータID\n   */\n  public abstract getEyeBlinkParameterId(index: number): CubismIdHandle;\n\n  /**\n   * リップシンクに関連付けられたパラメータの数を取得する\n   * @return リップシンクに関連付けられたパラメータの数\n   */\n  public abstract getLipSyncParameterCount(): number;\n\n  /**\n   * リップシンクに関連付けられたパラメータの数を取得する\n   * @param index 配列のインデックス値\n   * @return パラメータID\n   */\n  public abstract getLipSyncParameterId(index: number): CubismIdHandle;\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './icubismmodelsetting';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const ICubismModelSetting = $.ICubismModelSetting;\n  export type ICubismModelSetting = $.ICubismModelSetting;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { ICubismModelSetting } from './icubismmodelsetting';\nimport { CubismIdHandle } from './id/cubismid';\nimport { CubismFramework } from './live2dcubismframework';\nimport { csmMap, iterator } from './type/csmmap';\nimport { csmVector } from './type/csmvector';\nimport { CubismJson, Value } from './utils/cubismjson';\n\n/**\n * Model3Jsonのキー文字列\n */\n\n// JSON Keys\nconst Version = 'Version';\nconst FileReferences = 'FileReferences';\nconst Groups = 'Groups';\nconst Layout = 'Layout';\nconst HitAreas = 'HitAreas';\n\nconst Moc = 'Moc';\nconst Textures = 'Textures';\nconst Physics = 'Physics';\nconst Pose = 'Pose';\nconst Expressions = 'Expressions';\nconst Motions = 'Motions';\n\nconst UserData = 'UserData';\nconst Name = 'Name';\nconst FilePath = 'File';\nconst Id = 'Id';\nconst Ids = 'Ids';\nconst Target = 'Target';\n\n// Motions\nconst Idle = 'Idle';\nconst TapBody = 'TapBody';\nconst PinchIn = 'PinchIn';\nconst PinchOut = 'PinchOut';\nconst Shake = 'Shake';\nconst FlickHead = 'FlickHead';\nconst Parameter = 'Parameter';\n\nconst SoundPath = 'Sound';\nconst FadeInTime = 'FadeInTime';\nconst FadeOutTime = 'FadeOutTime';\n\n// Layout\nconst CenterX = 'CenterX';\nconst CenterY = 'CenterY';\nconst X = 'X';\nconst Y = 'Y';\nconst Width = 'Width';\nconst Height = 'Height';\n\nconst LipSync = 'LipSync';\nconst EyeBlink = 'EyeBlink';\n\nconst InitParameter = 'init_param';\nconst InitPartsVisible = 'init_parts_visible';\nconst Val = 'val';\n\nenum FrequestNode {\n  FrequestNode_Groups, // getRoot().getValueByString(Groups)\n  FrequestNode_Moc, // getRoot().getValueByString(FileReferences).getValueByString(Moc)\n  FrequestNode_Motions, // getRoot().getValueByString(FileReferences).getValueByString(Motions)\n  FrequestNode_Expressions, // getRoot().getValueByString(FileReferences).getValueByString(Expressions)\n  FrequestNode_Textures, // getRoot().getValueByString(FileReferences).getValueByString(Textures)\n  FrequestNode_Physics, // getRoot().getValueByString(FileReferences).getValueByString(Physics)\n  FrequestNode_Pose, // getRoot().getValueByString(FileReferences).getValueByString(Pose)\n  FrequestNode_HitAreas // getRoot().getValueByString(HitAreas)\n}\n\n/**\n * Model3Jsonパーサー\n *\n * model3.jsonファイルをパースして値を取得する\n */\nexport class CubismModelSettingJson extends ICubismModelSetting {\n  /**\n   * 引数付きコンストラクタ\n   *\n   * @param buffer    Model3Jsonをバイト配列として読み込んだデータバッファ\n   * @param size      Model3Jsonのデータサイズ\n   */\n  public constructor(buffer: ArrayBuffer, size: number) {\n    super();\n    this._json = CubismJson.create(buffer, size);\n\n    if (this.getJson()) {\n      this._jsonValue = new csmVector<Value>();\n\n      // 順番はenum FrequestNodeと一致させる\n      this._jsonValue.pushBack(\n        this.getJson().getRoot().getValueByString(Groups)\n      );\n      this._jsonValue.pushBack(\n        this.getJson()\n          .getRoot()\n          .getValueByString(FileReferences)\n          .getValueByString(Moc)\n      );\n      this._jsonValue.pushBack(\n        this.getJson()\n          .getRoot()\n          .getValueByString(FileReferences)\n          .getValueByString(Motions)\n      );\n      this._jsonValue.pushBack(\n        this.getJson()\n          .getRoot()\n          .getValueByString(FileReferences)\n          .getValueByString(Expressions)\n      );\n      this._jsonValue.pushBack(\n        this.getJson()\n          .getRoot()\n          .getValueByString(FileReferences)\n          .getValueByString(Textures)\n      );\n      this._jsonValue.pushBack(\n        this.getJson()\n          .getRoot()\n          .getValueByString(FileReferences)\n          .getValueByString(Physics)\n      );\n      this._jsonValue.pushBack(\n        this.getJson()\n          .getRoot()\n          .getValueByString(FileReferences)\n          .getValueByString(Pose)\n      );\n      this._jsonValue.pushBack(\n        this.getJson().getRoot().getValueByString(HitAreas)\n      );\n    }\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    CubismJson.delete(this._json);\n\n    this._jsonValue = null;\n  }\n\n  /**\n   * CubismJsonオブジェクトを取得する\n   *\n   * @return CubismJson\n   */\n  public getJson(): CubismJson {\n    return this._json;\n  }\n\n  /**\n   * Mocファイルの名前を取得する\n   * @return Mocファイルの名前\n   */\n  public getModelFileName(): string {\n    if (!this.isExistModelFile()) {\n      return '';\n    }\n    return this._jsonValue.at(FrequestNode.FrequestNode_Moc).getRawString();\n  }\n\n  /**\n   * モデルが使用するテクスチャの数を取得する\n   * テクスチャの数\n   */\n  public getTextureCount(): number {\n    if (!this.isExistTextureFiles()) {\n      return 0;\n    }\n\n    return this._jsonValue.at(FrequestNode.FrequestNode_Textures).getSize();\n  }\n\n  /**\n   * テクスチャが配置されたディレクトリの名前を取得する\n   * @return テクスチャが配置されたディレクトリの名前\n   */\n  public getTextureDirectory(): string {\n    const texturePath = this._jsonValue\n      .at(FrequestNode.FrequestNode_Textures)\n      .getValueByIndex(0)\n      .getRawString();\n\n    const pathArray = texturePath.split('/');\n    // 最後の要素はテクスチャ名なので不要\n    const arrayLength = pathArray.length - 1;\n    let textureDirectoryStr = '';\n\n    // 分割したパスを結合\n    for (let i = 0; i < arrayLength; i++) {\n      textureDirectoryStr += pathArray[i];\n      if (i < arrayLength - 1) {\n        textureDirectoryStr += '/';\n      }\n    }\n\n    return textureDirectoryStr;\n  }\n\n  /**\n   * モデルが使用するテクスチャの名前を取得する\n   * @param index 配列のインデックス値\n   * @return テクスチャの名前\n   */\n  public getTextureFileName(index: number): string {\n    return this._jsonValue\n      .at(FrequestNode.FrequestNode_Textures)\n      .getValueByIndex(index)\n      .getRawString();\n  }\n\n  /**\n   * モデルに設定された当たり判定の数を取得する\n   * @return モデルに設定された当たり判定の数\n   */\n  public getHitAreasCount(): number {\n    if (!this.isExistHitAreas()) {\n      return 0;\n    }\n\n    return this._jsonValue.at(FrequestNode.FrequestNode_HitAreas).getSize();\n  }\n\n  /**\n   * 当たり判定に設定されたIDを取得する\n   *\n   * @param index 配列のindex\n   * @return 当たり判定に設定されたID\n   */\n  public getHitAreaId(index: number): CubismIdHandle {\n    return CubismFramework.getIdManager().getId(\n      this._jsonValue\n        .at(FrequestNode.FrequestNode_HitAreas)\n        .getValueByIndex(index)\n        .getValueByString(Id)\n        .getRawString()\n    );\n  }\n\n  /**\n   * 当たり判定に設定された名前を取得する\n   * @param index 配列のインデックス値\n   * @return 当たり判定に設定された名前\n   */\n  public getHitAreaName(index: number): string {\n    return this._jsonValue\n      .at(FrequestNode.FrequestNode_HitAreas)\n      .getValueByIndex(index)\n      .getValueByString(Name)\n      .getRawString();\n  }\n\n  /**\n   * 物理演算設定ファイルの名前を取得する\n   * @return 物理演算設定ファイルの名前\n   */\n  public getPhysicsFileName(): string {\n    if (!this.isExistPhysicsFile()) {\n      return '';\n    }\n\n    return this._jsonValue.at(FrequestNode.FrequestNode_Physics).getRawString();\n  }\n\n  /**\n   * パーツ切り替え設定ファイルの名前を取得する\n   * @return パーツ切り替え設定ファイルの名前\n   */\n  public getPoseFileName(): string {\n    if (!this.isExistPoseFile()) {\n      return '';\n    }\n\n    return this._jsonValue.at(FrequestNode.FrequestNode_Pose).getRawString();\n  }\n\n  /**\n   * 表情設定ファイルの数を取得する\n   * @return 表情設定ファイルの数\n   */\n  public getExpressionCount(): number {\n    if (!this.isExistExpressionFile()) {\n      return 0;\n    }\n\n    return this._jsonValue.at(FrequestNode.FrequestNode_Expressions).getSize();\n  }\n\n  /**\n   * 表情設定ファイルを識別する名前（別名）を取得する\n   * @param index 配列のインデックス値\n   * @return 表情の名前\n   */\n  public getExpressionName(index: number): string {\n    return this._jsonValue\n      .at(FrequestNode.FrequestNode_Expressions)\n      .getValueByIndex(index)\n      .getValueByString(Name)\n      .getRawString();\n  }\n\n  /**\n   * 表情設定ファイルの名前を取得する\n   * @param index 配列のインデックス値\n   * @return 表情設定ファイルの名前\n   */\n  public getExpressionFileName(index: number): string {\n    return this._jsonValue\n      .at(FrequestNode.FrequestNode_Expressions)\n      .getValueByIndex(index)\n      .getValueByString(FilePath)\n      .getRawString();\n  }\n\n  /**\n   * モーショングループの数を取得する\n   * @return モーショングループの数\n   */\n  public getMotionGroupCount(): number {\n    if (!this.isExistMotionGroups()) {\n      return 0;\n    }\n\n    return this._jsonValue\n      .at(FrequestNode.FrequestNode_Motions)\n      .getKeys()\n      .getSize();\n  }\n\n  /**\n   * モーショングループの名前を取得する\n   * @param index 配列のインデックス値\n   * @return モーショングループの名前\n   */\n  public getMotionGroupName(index: number): string {\n    if (!this.isExistMotionGroups()) {\n      return null;\n    }\n\n    return this._jsonValue\n      .at(FrequestNode.FrequestNode_Motions)\n      .getKeys()\n      .at(index);\n  }\n\n  /**\n   * モーショングループに含まれるモーションの数を取得する\n   * @param groupName モーショングループの名前\n   * @return モーショングループの数\n   */\n  public getMotionCount(groupName: string): number {\n    if (!this.isExistMotionGroupName(groupName)) {\n      return 0;\n    }\n\n    return this._jsonValue\n      .at(FrequestNode.FrequestNode_Motions)\n      .getValueByString(groupName)\n      .getSize();\n  }\n\n  /**\n   * グループ名とインデックス値からモーションファイル名を取得する\n   * @param groupName モーショングループの名前\n   * @param index     配列のインデックス値\n   * @return モーションファイルの名前\n   */\n  public getMotionFileName(groupName: string, index: number): string {\n    if (!this.isExistMotionGroupName(groupName)) {\n      return '';\n    }\n\n    return this._jsonValue\n      .at(FrequestNode.FrequestNode_Motions)\n      .getValueByString(groupName)\n      .getValueByIndex(index)\n      .getValueByString(FilePath)\n      .getRawString();\n  }\n\n  /**\n   * モーションに対応するサウンドファイルの名前を取得する\n   * @param groupName モーショングループの名前\n   * @param index 配列のインデックス値\n   * @return サウンドファイルの名前\n   */\n  public getMotionSoundFileName(groupName: string, index: number): string {\n    if (!this.isExistMotionSoundFile(groupName, index)) {\n      return '';\n    }\n\n    return this._jsonValue\n      .at(FrequestNode.FrequestNode_Motions)\n      .getValueByString(groupName)\n      .getValueByIndex(index)\n      .getValueByString(SoundPath)\n      .getRawString();\n  }\n\n  /**\n   * モーション開始時のフェードイン処理時間を取得する\n   * @param groupName モーショングループの名前\n   * @param index 配列のインデックス値\n   * @return フェードイン処理時間[秒]\n   */\n  public getMotionFadeInTimeValue(groupName: string, index: number): number {\n    if (!this.isExistMotionFadeIn(groupName, index)) {\n      return -1.0;\n    }\n\n    return this._jsonValue\n      .at(FrequestNode.FrequestNode_Motions)\n      .getValueByString(groupName)\n      .getValueByIndex(index)\n      .getValueByString(FadeInTime)\n      .toFloat();\n  }\n\n  /**\n   * モーション終了時のフェードアウト処理時間を取得する\n   * @param groupName モーショングループの名前\n   * @param index 配列のインデックス値\n   * @return フェードアウト処理時間[秒]\n   */\n  public getMotionFadeOutTimeValue(groupName: string, index: number): number {\n    if (!this.isExistMotionFadeOut(groupName, index)) {\n      return -1.0;\n    }\n\n    return this._jsonValue\n      .at(FrequestNode.FrequestNode_Motions)\n      .getValueByString(groupName)\n      .getValueByIndex(index)\n      .getValueByString(FadeOutTime)\n      .toFloat();\n  }\n\n  /**\n   * ユーザーデータのファイル名を取得する\n   * @return ユーザーデータのファイル名\n   */\n  public getUserDataFile(): string {\n    if (!this.isExistUserDataFile()) {\n      return '';\n    }\n\n    return this.getJson()\n      .getRoot()\n      .getValueByString(FileReferences)\n      .getValueByString(UserData)\n      .getRawString();\n  }\n\n  /**\n   * レイアウト情報を取得する\n   * @param outLayoutMap csmMapクラスのインスタンス\n   * @return true レイアウト情報が存在する\n   * @return false レイアウト情報が存在しない\n   */\n  public getLayoutMap(outLayoutMap: csmMap<string, number>): boolean {\n    // 存在しない要素にアクセスするとエラーになるためValueがnullの場合はnullを代入する\n    const map: csmMap<string, Value> = this.getJson()\n      .getRoot()\n      .getValueByString(Layout)\n      .getMap();\n\n    if (map == null) {\n      return false;\n    }\n\n    let ret = false;\n\n    for (\n      const ite: iterator<string, Value> = map.begin();\n      ite.notEqual(map.end());\n      ite.preIncrement()\n    ) {\n      outLayoutMap.setValue(ite.ptr().first, ite.ptr().second.toFloat());\n      ret = true;\n    }\n\n    return ret;\n  }\n\n  /**\n   * 目パチに関連付けられたパラメータの数を取得する\n   * @return 目パチに関連付けられたパラメータの数\n   */\n  public getEyeBlinkParameterCount(): number {\n    if (!this.isExistEyeBlinkParameters()) {\n      return 0;\n    }\n\n    let num = 0;\n    for (\n      let i = 0;\n      i < this._jsonValue.at(FrequestNode.FrequestNode_Groups).getSize();\n      i++\n    ) {\n      const refI: Value = this._jsonValue\n        .at(FrequestNode.FrequestNode_Groups)\n        .getValueByIndex(i);\n      if (refI.isNull() || refI.isError()) {\n        continue;\n      }\n\n      if (refI.getValueByString(Name).getRawString() == EyeBlink) {\n        num = refI.getValueByString(Ids).getVector().getSize();\n        break;\n      }\n    }\n\n    return num;\n  }\n\n  /**\n   * 目パチに関連付けられたパラメータのIDを取得する\n   * @param index 配列のインデックス値\n   * @return パラメータID\n   */\n  public getEyeBlinkParameterId(index: number): CubismIdHandle {\n    if (!this.isExistEyeBlinkParameters()) {\n      return null;\n    }\n\n    for (\n      let i = 0;\n      i < this._jsonValue.at(FrequestNode.FrequestNode_Groups).getSize();\n      i++\n    ) {\n      const refI: Value = this._jsonValue\n        .at(FrequestNode.FrequestNode_Groups)\n        .getValueByIndex(i);\n      if (refI.isNull() || refI.isError()) {\n        continue;\n      }\n\n      if (refI.getValueByString(Name).getRawString() == EyeBlink) {\n        return CubismFramework.getIdManager().getId(\n          refI.getValueByString(Ids).getValueByIndex(index).getRawString()\n        );\n      }\n    }\n    return null;\n  }\n\n  /**\n   * リップシンクに関連付けられたパラメータの数を取得する\n   * @return リップシンクに関連付けられたパラメータの数\n   */\n  public getLipSyncParameterCount(): number {\n    if (!this.isExistLipSyncParameters()) {\n      return 0;\n    }\n\n    let num = 0;\n    for (\n      let i = 0;\n      i < this._jsonValue.at(FrequestNode.FrequestNode_Groups).getSize();\n      i++\n    ) {\n      const refI: Value = this._jsonValue\n        .at(FrequestNode.FrequestNode_Groups)\n        .getValueByIndex(i);\n      if (refI.isNull() || refI.isError()) {\n        continue;\n      }\n\n      if (refI.getValueByString(Name).getRawString() == LipSync) {\n        num = refI.getValueByString(Ids).getVector().getSize();\n        break;\n      }\n    }\n\n    return num;\n  }\n\n  /**\n   * リップシンクに関連付けられたパラメータの数を取得する\n   * @param index 配列のインデックス値\n   * @return パラメータID\n   */\n  public getLipSyncParameterId(index: number): CubismIdHandle {\n    if (!this.isExistLipSyncParameters()) {\n      return null;\n    }\n\n    for (\n      let i = 0;\n      i < this._jsonValue.at(FrequestNode.FrequestNode_Groups).getSize();\n      i++\n    ) {\n      const refI: Value = this._jsonValue\n        .at(FrequestNode.FrequestNode_Groups)\n        .getValueByIndex(i);\n      if (refI.isNull() || refI.isError()) {\n        continue;\n      }\n\n      if (refI.getValueByString(Name).getRawString() == LipSync) {\n        return CubismFramework.getIdManager().getId(\n          refI.getValueByString(Ids).getValueByIndex(index).getRawString()\n        );\n      }\n    }\n    return null;\n  }\n\n  /**\n   * モデルファイルのキーが存在するかどうかを確認する\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistModelFile(): boolean {\n    const node: Value = this._jsonValue.at(FrequestNode.FrequestNode_Moc);\n    return !node.isNull() && !node.isError();\n  }\n\n  /**\n   * テクスチャファイルのキーが存在するかどうかを確認する\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistTextureFiles(): boolean {\n    const node: Value = this._jsonValue.at(FrequestNode.FrequestNode_Textures);\n    return !node.isNull() && !node.isError();\n  }\n\n  /**\n   * 当たり判定のキーが存在するかどうかを確認する\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistHitAreas(): boolean {\n    const node: Value = this._jsonValue.at(FrequestNode.FrequestNode_HitAreas);\n    return !node.isNull() && !node.isError();\n  }\n\n  /**\n   * 物理演算ファイルのキーが存在するかどうかを確認する\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistPhysicsFile(): boolean {\n    const node: Value = this._jsonValue.at(FrequestNode.FrequestNode_Physics);\n    return !node.isNull() && !node.isError();\n  }\n\n  /**\n   * ポーズ設定ファイルのキーが存在するかどうかを確認する\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistPoseFile(): boolean {\n    const node: Value = this._jsonValue.at(FrequestNode.FrequestNode_Pose);\n    return !node.isNull() && !node.isError();\n  }\n\n  /**\n   * 表情設定ファイルのキーが存在するかどうかを確認する\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistExpressionFile(): boolean {\n    const node: Value = this._jsonValue.at(\n      FrequestNode.FrequestNode_Expressions\n    );\n    return !node.isNull() && !node.isError();\n  }\n\n  /**\n   * モーショングループのキーが存在するかどうかを確認する\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistMotionGroups(): boolean {\n    const node: Value = this._jsonValue.at(FrequestNode.FrequestNode_Motions);\n    return !node.isNull() && !node.isError();\n  }\n\n  /**\n   * 引数で指定したモーショングループのキーが存在するかどうかを確認する\n   * @param groupName  グループ名\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistMotionGroupName(groupName: string): boolean {\n    const node: Value = this._jsonValue\n      .at(FrequestNode.FrequestNode_Motions)\n      .getValueByString(groupName);\n    return !node.isNull() && !node.isError();\n  }\n\n  /**\n   * 引数で指定したモーションに対応するサウンドファイルのキーが存在するかどうかを確認する\n   * @param groupName  グループ名\n   * @param index 配列のインデックス値\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistMotionSoundFile(groupName: string, index: number): boolean {\n    const node: Value = this._jsonValue\n      .at(FrequestNode.FrequestNode_Motions)\n      .getValueByString(groupName)\n      .getValueByIndex(index)\n      .getValueByString(SoundPath);\n    return !node.isNull() && !node.isError();\n  }\n\n  /**\n   * 引数で指定したモーションに対応するフェードイン時間のキーが存在するかどうかを確認する\n   * @param groupName  グループ名\n   * @param index 配列のインデックス値\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistMotionFadeIn(groupName: string, index: number): boolean {\n    const node: Value = this._jsonValue\n      .at(FrequestNode.FrequestNode_Motions)\n      .getValueByString(groupName)\n      .getValueByIndex(index)\n      .getValueByString(FadeInTime);\n    return !node.isNull() && !node.isError();\n  }\n\n  /**\n   * 引数で指定したモーションに対応するフェードアウト時間のキーが存在するかどうかを確認する\n   * @param groupName  グループ名\n   * @param index 配列のインデックス値\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistMotionFadeOut(groupName: string, index: number): boolean {\n    const node: Value = this._jsonValue\n      .at(FrequestNode.FrequestNode_Motions)\n      .getValueByString(groupName)\n      .getValueByIndex(index)\n      .getValueByString(FadeOutTime);\n    return !node.isNull() && !node.isError();\n  }\n\n  /**\n   * UserDataのファイル名が存在するかどうかを確認する\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistUserDataFile(): boolean {\n    const node: Value = this.getJson()\n      .getRoot()\n      .getValueByString(FileReferences)\n      .getValueByString(UserData);\n    return !node.isNull() && !node.isError();\n  }\n\n  /**\n   * 目ぱちに対応付けられたパラメータが存在するかどうかを確認する\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistEyeBlinkParameters(): boolean {\n    if (\n      this._jsonValue.at(FrequestNode.FrequestNode_Groups).isNull() ||\n      this._jsonValue.at(FrequestNode.FrequestNode_Groups).isError()\n    ) {\n      return false;\n    }\n\n    for (\n      let i = 0;\n      i < this._jsonValue.at(FrequestNode.FrequestNode_Groups).getSize();\n      ++i\n    ) {\n      if (\n        this._jsonValue\n          .at(FrequestNode.FrequestNode_Groups)\n          .getValueByIndex(i)\n          .getValueByString(Name)\n          .getRawString() == EyeBlink\n      ) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * リップシンクに対応付けられたパラメータが存在するかどうかを確認する\n   * @return true キーが存在する\n   * @return false キーが存在しない\n   */\n  private isExistLipSyncParameters(): boolean {\n    if (\n      this._jsonValue.at(FrequestNode.FrequestNode_Groups).isNull() ||\n      this._jsonValue.at(FrequestNode.FrequestNode_Groups).isError()\n    ) {\n      return false;\n    }\n    for (\n      let i = 0;\n      i < this._jsonValue.at(FrequestNode.FrequestNode_Groups).getSize();\n      ++i\n    ) {\n      if (\n        this._jsonValue\n          .at(FrequestNode.FrequestNode_Groups)\n          .getValueByIndex(i)\n          .getValueByString(Name)\n          .getRawString() == LipSync\n      ) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private _json: CubismJson;\n  private _jsonValue: csmVector<Value>;\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmodelsettingjson';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismModelSettingJson = $.CubismModelSettingJson;\n  export type CubismModelSettingJson = $.CubismModelSettingJson;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdHandle } from '../id/cubismid';\nimport { CubismModel } from '../model/cubismmodel';\nimport { csmVector } from '../type/csmvector';\n\n/**\n * 呼吸機能\n *\n * 呼吸機能を提供する。\n */\nexport class CubismBreath {\n  /**\n   * インスタンスの作成\n   */\n  public static create(): CubismBreath {\n    return new CubismBreath();\n  }\n\n  /**\n   * インスタンスの破棄\n   * @param instance 対象のCubismBreath\n   */\n  public static delete(instance: CubismBreath): void {\n    if (instance != null) {\n      instance = null;\n    }\n  }\n\n  /**\n   * 呼吸のパラメータの紐づけ\n   * @param breathParameters 呼吸を紐づけたいパラメータのリスト\n   */\n  public setParameters(breathParameters: csmVector<BreathParameterData>): void {\n    this._breathParameters = breathParameters;\n  }\n\n  /**\n   * 呼吸に紐づいているパラメータの取得\n   * @return 呼吸に紐づいているパラメータのリスト\n   */\n  public getParameters(): csmVector<BreathParameterData> {\n    return this._breathParameters;\n  }\n\n  /**\n   * モデルのパラメータの更新\n   * @param model 対象のモデル\n   * @param deltaTimeSeconds デルタ時間[秒]\n   */\n  public updateParameters(model: CubismModel, deltaTimeSeconds: number): void {\n    this._currentTime += deltaTimeSeconds;\n\n    const t: number = this._currentTime * 2.0 * 3.14159;\n\n    for (let i = 0; i < this._breathParameters.getSize(); ++i) {\n      const data: BreathParameterData = this._breathParameters.at(i);\n\n      model.addParameterValueById(\n        data.parameterId,\n        data.offset + data.peak * Math.sin(t / data.cycle),\n        data.weight\n      );\n    }\n  }\n\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    this._currentTime = 0.0;\n  }\n\n  _breathParameters: csmVector<BreathParameterData>; // 呼吸にひもづいているパラメータのリスト\n  _currentTime: number; // 積算時間[秒]\n}\n\n/**\n * 呼吸のパラメータ情報\n */\nexport class BreathParameterData {\n  /**\n   * コンストラクタ\n   * @param parameterId   呼吸をひもづけるパラメータID\n   * @param offset        呼吸を正弦波としたときの、波のオフセット\n   * @param peak          呼吸を正弦波としたときの、波の高さ\n   * @param cycle         呼吸を正弦波としたときの、波の周期\n   * @param weight        パラメータへの重み\n   */\n  constructor(\n    parameterId?: CubismIdHandle,\n    offset?: number,\n    peak?: number,\n    cycle?: number,\n    weight?: number\n  ) {\n    this.parameterId = parameterId == undefined ? null : parameterId;\n    this.offset = offset == undefined ? 0.0 : offset;\n    this.peak = peak == undefined ? 0.0 : peak;\n    this.cycle = cycle == undefined ? 0.0 : cycle;\n    this.weight = weight == undefined ? 0.0 : weight;\n  }\n\n  parameterId: CubismIdHandle; // 呼吸をひもづけるパラメータID\\\n  offset: number; // 呼吸を正弦波としたときの、波のオフセット\n  peak: number; // 呼吸を正弦波としたときの、波の高さ\n  cycle: number; // 呼吸を正弦波としたときの、波の周期\n  weight: number; // パラメータへの重み\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismbreath';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const BreathParameterData = $.BreathParameterData;\n  export type BreathParameterData = $.BreathParameterData;\n  export const CubismBreath = $.CubismBreath;\n  export type CubismBreath = $.CubismBreath;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { ICubismModelSetting } from '../icubismmodelsetting';\nimport { CubismIdHandle } from '../id/cubismid';\nimport { CubismModel } from '../model/cubismmodel';\nimport { csmVector } from '../type/csmvector';\n\n/**\n * 自動まばたき機能\n *\n * 自動まばたき機能を提供する。\n */\nexport class CubismEyeBlink {\n  /**\n   * インスタンスを作成する\n   * @param modelSetting モデルの設定情報\n   * @return 作成されたインスタンス\n   * @note 引数がNULLの場合、パラメータIDが設定されていない空のインスタンスを作成する。\n   */\n  public static create(\n    modelSetting: ICubismModelSetting = null\n  ): CubismEyeBlink {\n    return new CubismEyeBlink(modelSetting);\n  }\n\n  /**\n   * インスタンスの破棄\n   * @param eyeBlink 対象のCubismEyeBlink\n   */\n  public static delete(eyeBlink: CubismEyeBlink): void {\n    if (eyeBlink != null) {\n      eyeBlink = null;\n    }\n  }\n\n  /**\n   * まばたきの間隔の設定\n   * @param blinkingInterval まばたきの間隔の時間[秒]\n   */\n  public setBlinkingInterval(blinkingInterval: number): void {\n    this._blinkingIntervalSeconds = blinkingInterval;\n  }\n\n  /**\n   * まばたきのモーションの詳細設定\n   * @param closing   まぶたを閉じる動作の所要時間[秒]\n   * @param closed    まぶたを閉じている動作の所要時間[秒]\n   * @param opening   まぶたを開く動作の所要時間[秒]\n   */\n  public setBlinkingSetting(\n    closing: number,\n    closed: number,\n    opening: number\n  ): void {\n    this._closingSeconds = closing;\n    this._closedSeconds = closed;\n    this._openingSeconds = opening;\n  }\n\n  /**\n   * まばたきさせるパラメータIDのリストの設定\n   * @param parameterIds パラメータのIDのリスト\n   */\n  public setParameterIds(parameterIds: csmVector<CubismIdHandle>): void {\n    this._parameterIds = parameterIds;\n  }\n\n  /**\n   * まばたきさせるパラメータIDのリストの取得\n   * @return パラメータIDのリスト\n   */\n  public getParameterIds(): csmVector<CubismIdHandle> {\n    return this._parameterIds;\n  }\n\n  /**\n   * モデルのパラメータの更新\n   * @param model 対象のモデル\n   * @param deltaTimeSeconds デルタ時間[秒]\n   */\n  public updateParameters(model: CubismModel, deltaTimeSeconds: number): void {\n    this._userTimeSeconds += deltaTimeSeconds;\n    let parameterValue: number;\n    let t = 0.0;\n    const blinkingState: EyeState = this._blinkingState;\n\n    switch (blinkingState) {\n      case EyeState.EyeState_Closing:\n        t =\n          (this._userTimeSeconds - this._stateStartTimeSeconds) /\n          this._closingSeconds;\n\n        if (t >= 1.0) {\n          t = 1.0;\n          this._blinkingState = EyeState.EyeState_Closed;\n          this._stateStartTimeSeconds = this._userTimeSeconds;\n        }\n\n        parameterValue = 1.0 - t;\n\n        break;\n      case EyeState.EyeState_Closed:\n        t =\n          (this._userTimeSeconds - this._stateStartTimeSeconds) /\n          this._closedSeconds;\n\n        if (t >= 1.0) {\n          this._blinkingState = EyeState.EyeState_Opening;\n          this._stateStartTimeSeconds = this._userTimeSeconds;\n        }\n\n        parameterValue = 0.0;\n\n        break;\n      case EyeState.EyeState_Opening:\n        t =\n          (this._userTimeSeconds - this._stateStartTimeSeconds) /\n          this._openingSeconds;\n\n        if (t >= 1.0) {\n          t = 1.0;\n          this._blinkingState = EyeState.EyeState_Interval;\n          this._nextBlinkingTime = this.determinNextBlinkingTiming();\n        }\n\n        parameterValue = t;\n\n        break;\n      case EyeState.EyeState_Interval:\n        if (this._nextBlinkingTime < this._userTimeSeconds) {\n          this._blinkingState = EyeState.EyeState_Closing;\n          this._stateStartTimeSeconds = this._userTimeSeconds;\n        }\n\n        parameterValue = 1.0;\n\n        break;\n      case EyeState.EyeState_First:\n      default:\n        this._blinkingState = EyeState.EyeState_Interval;\n        this._nextBlinkingTime = this.determinNextBlinkingTiming();\n\n        parameterValue = 1.0;\n        break;\n    }\n\n    if (!CubismEyeBlink.CloseIfZero) {\n      parameterValue = -parameterValue;\n    }\n\n    for (let i = 0; i < this._parameterIds.getSize(); ++i) {\n      model.setParameterValueById(this._parameterIds.at(i), parameterValue);\n    }\n  }\n\n  /**\n   * コンストラクタ\n   * @param modelSetting モデルの設定情報\n   */\n  public constructor(modelSetting: ICubismModelSetting) {\n    this._blinkingState = EyeState.EyeState_First;\n    this._nextBlinkingTime = 0.0;\n    this._stateStartTimeSeconds = 0.0;\n    this._blinkingIntervalSeconds = 4.0;\n    this._closingSeconds = 0.1;\n    this._closedSeconds = 0.05;\n    this._openingSeconds = 0.15;\n    this._userTimeSeconds = 0.0;\n    this._parameterIds = new csmVector<CubismIdHandle>();\n\n    if (modelSetting == null) {\n      return;\n    }\n\n    for (let i = 0; i < modelSetting.getEyeBlinkParameterCount(); ++i) {\n      this._parameterIds.pushBack(modelSetting.getEyeBlinkParameterId(i));\n    }\n  }\n\n  /**\n   * 次の瞬きのタイミングの決定\n   *\n   * @return 次のまばたきを行う時刻[秒]\n   */\n  public determinNextBlinkingTiming(): number {\n    const r: number = Math.random();\n    return (\n      this._userTimeSeconds + r * (2.0 * this._blinkingIntervalSeconds - 1.0)\n    );\n  }\n\n  _blinkingState: number; // 現在の状態\n  _parameterIds: csmVector<CubismIdHandle>; // 操作対象のパラメータのIDのリスト\n  _nextBlinkingTime: number; // 次のまばたきの時刻[秒]\n  _stateStartTimeSeconds: number; // 現在の状態が開始した時刻[秒]\n  _blinkingIntervalSeconds: number; // まばたきの間隔[秒]\n  _closingSeconds: number; // まぶたを閉じる動作の所要時間[秒]\n  _closedSeconds: number; // まぶたを閉じている動作の所要時間[秒]\n  _openingSeconds: number; // まぶたを開く動作の所要時間[秒]\n  _userTimeSeconds: number; // デルタ時間の積算値[秒]\n\n  /**\n   * IDで指定された目のパラメータが、0のときに閉じるなら true 、1の時に閉じるなら false 。\n   */\n  static readonly CloseIfZero: boolean = true;\n}\n\n/**\n * まばたきの状態\n *\n * まばたきの状態を表す列挙型\n */\nexport enum EyeState {\n  EyeState_First = 0, // 初期状態\n  EyeState_Interval, // まばたきしていない状態\n  EyeState_Closing, // まぶたが閉じていく途中の状態\n  EyeState_Closed, // まぶたが閉じている状態\n  EyeState_Opening // まぶたが開いていく途中の状態\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismeyeblink';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismEyeBlink = $.CubismEyeBlink;\n  export type CubismEyeBlink = $.CubismEyeBlink;\n  export const EyeState = $.EyeState;\n  export type EyeState = $.EyeState;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdHandle } from '../id/cubismid';\nimport { CubismFramework } from '../live2dcubismframework';\nimport { CubismModel } from '../model/cubismmodel';\nimport { csmVector, iterator } from '../type/csmvector';\nimport { CubismJson, Value } from '../utils/cubismjson';\n\nconst Epsilon = 0.001;\nconst DefaultFadeInSeconds = 0.5;\n\n// Pose.jsonのタグ\nconst FadeIn = 'FadeInTime';\nconst Link = 'Link';\nconst Groups = 'Groups';\nconst Id = 'Id';\n\n/**\n * パーツの不透明度の設定\n *\n * パーツの不透明度の管理と設定を行う。\n */\nexport class CubismPose {\n  /**\n   * インスタンスの作成\n   * @param pose3json pose3.jsonのデータ\n   * @param size pose3.jsonのデータのサイズ[byte]\n   * @return 作成されたインスタンス\n   */\n  public static create(pose3json: ArrayBuffer, size: number): CubismPose {\n    const json: CubismJson = CubismJson.create(pose3json, size);\n    if (!json) {\n      return null;\n    }\n\n    const ret: CubismPose = new CubismPose();\n    const root: Value = json.getRoot();\n\n    // フェード時間の指定\n    if (!root.getValueByString(FadeIn).isNull()) {\n      ret._fadeTimeSeconds = root\n        .getValueByString(FadeIn)\n        .toFloat(DefaultFadeInSeconds);\n\n      if (ret._fadeTimeSeconds <= 0.0) {\n        ret._fadeTimeSeconds = DefaultFadeInSeconds;\n      }\n    }\n\n    // パーツグループ\n    const poseListInfo: Value = root.getValueByString(Groups);\n    const poseCount: number = poseListInfo.getSize();\n\n    for (let poseIndex = 0; poseIndex < poseCount; ++poseIndex) {\n      const idListInfo: Value = poseListInfo.getValueByIndex(poseIndex);\n      const idCount: number = idListInfo.getSize();\n      let groupCount = 0;\n\n      for (let groupIndex = 0; groupIndex < idCount; ++groupIndex) {\n        const partInfo: Value = idListInfo.getValueByIndex(groupIndex);\n        const partData: PartData = new PartData();\n        const parameterId: CubismIdHandle =\n          CubismFramework.getIdManager().getId(\n            partInfo.getValueByString(Id).getRawString()\n          );\n\n        partData.partId = parameterId;\n\n        // リンクするパーツの設定\n        if (!partInfo.getValueByString(Link).isNull()) {\n          const linkListInfo: Value = partInfo.getValueByString(Link);\n          const linkCount: number = linkListInfo.getSize();\n\n          for (let linkIndex = 0; linkIndex < linkCount; ++linkIndex) {\n            const linkPart: PartData = new PartData();\n            const linkId: CubismIdHandle = CubismFramework.getIdManager().getId(\n              linkListInfo.getValueByIndex(linkIndex).getString()\n            );\n\n            linkPart.partId = linkId;\n\n            partData.link.pushBack(linkPart);\n          }\n        }\n\n        ret._partGroups.pushBack(partData.clone());\n\n        ++groupCount;\n      }\n\n      ret._partGroupCounts.pushBack(groupCount);\n    }\n\n    CubismJson.delete(json);\n\n    return ret;\n  }\n\n  /**\n   * インスタンスを破棄する\n   * @param pose 対象のCubismPose\n   */\n  public static delete(pose: CubismPose): void {\n    if (pose != null) {\n      pose = null;\n    }\n  }\n\n  /**\n   * モデルのパラメータの更新\n   * @param model 対象のモデル\n   * @param deltaTimeSeconds デルタ時間[秒]\n   */\n  public updateParameters(model: CubismModel, deltaTimeSeconds: number): void {\n    // 前回のモデルと同じでない場合は初期化が必要\n    if (model != this._lastModel) {\n      // パラメータインデックスの初期化\n      this.reset(model);\n    }\n\n    this._lastModel = model;\n\n    // 設定から時間を変更すると、経過時間がマイナスになる事があるので、経過時間0として対応\n    if (deltaTimeSeconds < 0.0) {\n      deltaTimeSeconds = 0.0;\n    }\n\n    let beginIndex = 0;\n\n    for (let i = 0; i < this._partGroupCounts.getSize(); i++) {\n      const partGroupCount: number = this._partGroupCounts.at(i);\n\n      this.doFade(model, deltaTimeSeconds, beginIndex, partGroupCount);\n\n      beginIndex += partGroupCount;\n    }\n\n    this.copyPartOpacities(model);\n  }\n\n  /**\n   * 表示を初期化\n   * @param model 対象のモデル\n   * @note 不透明度の初期値が0でないパラメータは、不透明度を１に設定する\n   */\n  public reset(model: CubismModel): void {\n    let beginIndex = 0;\n\n    for (let i = 0; i < this._partGroupCounts.getSize(); ++i) {\n      const groupCount: number = this._partGroupCounts.at(i);\n\n      for (let j: number = beginIndex; j < beginIndex + groupCount; ++j) {\n        this._partGroups.at(j).initialize(model);\n\n        const partsIndex: number = this._partGroups.at(j).partIndex;\n        const paramIndex: number = this._partGroups.at(j).parameterIndex;\n\n        if (partsIndex < 0) {\n          continue;\n        }\n\n        model.setPartOpacityByIndex(partsIndex, j == beginIndex ? 1.0 : 0.0);\n        model.setParameterValueByIndex(paramIndex, j == beginIndex ? 1.0 : 0.0);\n\n        for (let k = 0; k < this._partGroups.at(j).link.getSize(); ++k) {\n          this._partGroups.at(j).link.at(k).initialize(model);\n        }\n      }\n\n      beginIndex += groupCount;\n    }\n  }\n\n  /**\n   * パーツの不透明度をコピー\n   *\n   * @param model 対象のモデル\n   */\n  public copyPartOpacities(model: CubismModel): void {\n    for (\n      let groupIndex = 0;\n      groupIndex < this._partGroups.getSize();\n      ++groupIndex\n    ) {\n      const partData: PartData = this._partGroups.at(groupIndex);\n\n      if (partData.link.getSize() == 0) {\n        continue; // 連動するパラメータはない\n      }\n\n      const partIndex: number = this._partGroups.at(groupIndex).partIndex;\n      const opacity: number = model.getPartOpacityByIndex(partIndex);\n\n      for (\n        let linkIndex = 0;\n        linkIndex < partData.link.getSize();\n        ++linkIndex\n      ) {\n        const linkPart: PartData = partData.link.at(linkIndex);\n        const linkPartIndex: number = linkPart.partIndex;\n\n        if (linkPartIndex < 0) {\n          continue;\n        }\n\n        model.setPartOpacityByIndex(linkPartIndex, opacity);\n      }\n    }\n  }\n\n  /**\n   * パーツのフェード操作を行う。\n   * @param model 対象のモデル\n   * @param deltaTimeSeconds デルタ時間[秒]\n   * @param beginIndex フェード操作を行うパーツグループの先頭インデックス\n   * @param partGroupCount フェード操作を行うパーツグループの個数\n   */\n  public doFade(\n    model: CubismModel,\n    deltaTimeSeconds: number,\n    beginIndex: number,\n    partGroupCount: number\n  ): void {\n    let visiblePartIndex = -1;\n    let newOpacity = 1.0;\n\n    const phi = 0.5;\n    const backOpacityThreshold = 0.15;\n\n    // 現在、表示状態になっているパーツを取得\n    for (let i: number = beginIndex; i < beginIndex + partGroupCount; ++i) {\n      const partIndex: number = this._partGroups.at(i).partIndex;\n      const paramIndex: number = this._partGroups.at(i).parameterIndex;\n\n      if (model.getParameterValueByIndex(paramIndex) > Epsilon) {\n        if (visiblePartIndex >= 0) {\n          break;\n        }\n\n        visiblePartIndex = i;\n        newOpacity = model.getPartOpacityByIndex(partIndex);\n\n        // 新しい不透明度を計算\n        newOpacity += deltaTimeSeconds / this._fadeTimeSeconds;\n\n        if (newOpacity > 1.0) {\n          newOpacity = 1.0;\n        }\n      }\n    }\n\n    if (visiblePartIndex < 0) {\n      visiblePartIndex = 0;\n      newOpacity = 1.0;\n    }\n\n    // 表示パーツ、非表示パーツの不透明度を設定する\n    for (let i: number = beginIndex; i < beginIndex + partGroupCount; ++i) {\n      const partsIndex: number = this._partGroups.at(i).partIndex;\n\n      // 表示パーツの設定\n      if (visiblePartIndex == i) {\n        model.setPartOpacityByIndex(partsIndex, newOpacity); // 先に設定\n      }\n      // 非表示パーツの設定\n      else {\n        let opacity: number = model.getPartOpacityByIndex(partsIndex);\n        let a1: number; // 計算によって求められる不透明度\n\n        if (newOpacity < phi) {\n          a1 = (newOpacity * (phi - 1)) / phi + 1.0; // (0,1),(phi,phi)を通る直線式\n        } else {\n          a1 = ((1 - newOpacity) * phi) / (1.0 - phi); // (1,0),(phi,phi)を通る直線式\n        }\n\n        // 背景の見える割合を制限する場合\n        const backOpacity: number = (1.0 - a1) * (1.0 - newOpacity);\n\n        if (backOpacity > backOpacityThreshold) {\n          a1 = 1.0 - backOpacityThreshold / (1.0 - newOpacity);\n        }\n\n        if (opacity > a1) {\n          opacity = a1; // 計算の不透明度よりも大きければ（濃ければ）不透明度を上げる\n        }\n\n        model.setPartOpacityByIndex(partsIndex, opacity);\n      }\n    }\n  }\n\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    this._fadeTimeSeconds = DefaultFadeInSeconds;\n    this._lastModel = null;\n    this._partGroups = new csmVector<PartData>();\n    this._partGroupCounts = new csmVector<number>();\n  }\n\n  _partGroups: csmVector<PartData>; // パーツグループ\n  _partGroupCounts: csmVector<number>; // それぞれのパーツグループの個数\n  _fadeTimeSeconds: number; // フェード時間[秒]\n  _lastModel: CubismModel; // 前回操作したモデル\n}\n\n/**\n * パーツにまつわるデータを管理\n */\nexport class PartData {\n  /**\n   * コンストラクタ\n   */\n  constructor(v?: PartData) {\n    this.parameterIndex = 0;\n    this.partIndex = 0;\n    this.link = new csmVector<PartData>();\n\n    if (v != undefined) {\n      this.partId = v.partId;\n\n      for (\n        const ite: iterator<PartData> = v.link.begin();\n        ite.notEqual(v.link.end());\n        ite.preIncrement()\n      ) {\n        this.link.pushBack(ite.ptr().clone());\n      }\n    }\n  }\n\n  /**\n   * =演算子のオーバーロード\n   */\n  public assignment(v: PartData): PartData {\n    this.partId = v.partId;\n\n    for (\n      const ite: iterator<PartData> = v.link.begin();\n      ite.notEqual(v.link.end());\n      ite.preIncrement()\n    ) {\n      this.link.pushBack(ite.ptr().clone());\n    }\n\n    return this;\n  }\n\n  /**\n   * 初期化\n   * @param model 初期化に使用するモデル\n   */\n  public initialize(model: CubismModel): void {\n    this.parameterIndex = model.getParameterIndex(this.partId);\n    this.partIndex = model.getPartIndex(this.partId);\n\n    model.setParameterValueByIndex(this.parameterIndex, 1);\n  }\n\n  /**\n   * オブジェクトのコピーを生成する\n   */\n  public clone(): PartData {\n    const clonePartData: PartData = new PartData();\n\n    clonePartData.partId = this.partId;\n    clonePartData.parameterIndex = this.parameterIndex;\n    clonePartData.partIndex = this.partIndex;\n    clonePartData.link = new csmVector<PartData>();\n\n    for (\n      let ite: iterator<PartData> = this.link.begin();\n      ite.notEqual(this.link.end());\n      ite.increment()\n    ) {\n      clonePartData.link.pushBack(ite.ptr().clone());\n    }\n\n    return clonePartData;\n  }\n\n  partId: CubismIdHandle; // パーツID\n  parameterIndex: number; // パラメータのインデックス\n  partIndex: number; // パーツのインデックス\n  link: csmVector<PartData>; // 連動するパラメータ\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismpose';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismPose = $.CubismPose;\n  export type CubismPose = $.CubismPose;\n  export const PartData = $.PartData;\n  export type PartData = $.PartData;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { csmMap, iterator } from '../type/csmmap';\nimport { CubismMatrix44 } from './cubismmatrix44';\n\n/**\n * モデル座標設定用の4x4行列\n *\n * モデル座標設定用の4x4行列クラス\n */\nexport class CubismModelMatrix extends CubismMatrix44 {\n  /**\n   * コンストラクタ\n   *\n   * @param w 横幅\n   * @param h 縦幅\n   */\n  constructor(w?: number, h?: number) {\n    super();\n\n    this._width = w !== undefined ? w : 0.0;\n    this._height = h !== undefined ? h : 0.0;\n\n    this.setHeight(2.0);\n  }\n\n  /**\n   * 横幅を設定\n   *\n   * @param w 横幅\n   */\n  public setWidth(w: number): void {\n    const scaleX: number = w / this._width;\n    const scaleY: number = scaleX;\n    this.scale(scaleX, scaleY);\n  }\n\n  /**\n   * 縦幅を設定\n   * @param h 縦幅\n   */\n  public setHeight(h: number): void {\n    const scaleX: number = h / this._height;\n    const scaleY: number = scaleX;\n    this.scale(scaleX, scaleY);\n  }\n\n  /**\n   * 位置を設定\n   *\n   * @param x X軸の位置\n   * @param y Y軸の位置\n   */\n  public setPosition(x: number, y: number): void {\n    this.translate(x, y);\n  }\n\n  /**\n   * 中心位置を設定\n   *\n   * @param x X軸の中心位置\n   * @param y Y軸の中心位置\n   *\n   * @note widthかheightを設定したあとでないと、拡大率が正しく取得できないためずれる。\n   */\n  public setCenterPosition(x: number, y: number) {\n    this.centerX(x);\n    this.centerY(y);\n  }\n\n  /**\n   * 上辺の位置を設定する\n   *\n   * @param y 上辺のY軸位置\n   */\n  public top(y: number): void {\n    this.setY(y);\n  }\n\n  /**\n   * 下辺の位置を設定する\n   *\n   * @param y 下辺のY軸位置\n   */\n  public bottom(y: number) {\n    const h: number = this._height * this.getScaleY();\n\n    this.translateY(y - h);\n  }\n\n  /**\n   * 左辺の位置を設定\n   *\n   * @param x 左辺のX軸位置\n   */\n  public left(x: number): void {\n    this.setX(x);\n  }\n\n  /**\n   * 右辺の位置を設定\n   *\n   * @param x 右辺のX軸位置\n   */\n  public right(x: number): void {\n    const w = this._width * this.getScaleX();\n\n    this.translateX(x - w);\n  }\n\n  /**\n   * X軸の中心位置を設定\n   *\n   * @param x X軸の中心位置\n   */\n  public centerX(x: number): void {\n    const w = this._width * this.getScaleX();\n\n    this.translateX(x - w / 2.0);\n  }\n\n  /**\n   * X軸の位置を設定\n   *\n   * @param x X軸の位置\n   */\n  public setX(x: number): void {\n    this.translateX(x);\n  }\n\n  /**\n   * Y軸の中心位置を設定\n   *\n   * @param y Y軸の中心位置\n   */\n  public centerY(y: number): void {\n    const h: number = this._height * this.getScaleY();\n\n    this.translateY(y - h / 2.0);\n  }\n\n  /**\n   * Y軸の位置を設定する\n   *\n   * @param y Y軸の位置\n   */\n  public setY(y: number): void {\n    this.translateY(y);\n  }\n\n  /**\n   * レイアウト情報から位置を設定\n   *\n   * @param layout レイアウト情報\n   */\n  public setupFromLayout(layout: csmMap<string, number>): void {\n    const keyWidth = 'width';\n    const keyHeight = 'height';\n    const keyX = 'x';\n    const keyY = 'y';\n    const keyCenterX = 'center_x';\n    const keyCenterY = 'center_y';\n    const keyTop = 'top';\n    const keyBottom = 'bottom';\n    const keyLeft = 'left';\n    const keyRight = 'right';\n\n    for (\n      const ite: iterator<string, number> = layout.begin();\n      ite.notEqual(layout.end());\n      ite.preIncrement()\n    ) {\n      const key: string = ite.ptr().first;\n      const value: number = ite.ptr().second;\n\n      if (key == keyWidth) {\n        this.setWidth(value);\n      } else if (key == keyHeight) {\n        this.setHeight(value);\n      }\n    }\n\n    for (\n      const ite: iterator<string, number> = layout.begin();\n      ite.notEqual(layout.end());\n      ite.preIncrement()\n    ) {\n      const key: string = ite.ptr().first;\n      const value: number = ite.ptr().second;\n\n      if (key == keyX) {\n        this.setX(value);\n      } else if (key == keyY) {\n        this.setY(value);\n      } else if (key == keyCenterX) {\n        this.centerX(value);\n      } else if (key == keyCenterY) {\n        this.centerY(value);\n      } else if (key == keyTop) {\n        this.top(value);\n      } else if (key == keyBottom) {\n        this.bottom(value);\n      } else if (key == keyLeft) {\n        this.left(value);\n      } else if (key == keyRight) {\n        this.right(value);\n      }\n    }\n  }\n\n  private _width: number; // 横幅\n  private _height: number; // 縦幅\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmodelmatrix';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismModelMatrix = $.CubismModelMatrix;\n  export type CubismModelMatrix = $.CubismModelMatrix;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\n/**\n * 2次元ベクトル型\n *\n * 2次元ベクトル型の機能を提供する。\n */\nexport class CubismVector2 {\n  /**\n   * コンストラクタ\n   */\n  public constructor(\n    public x?: number,\n    public y?: number\n  ) {\n    this.x = x == undefined ? 0.0 : x;\n\n    this.y = y == undefined ? 0.0 : y;\n  }\n\n  /**\n   * ベクトルの加算\n   *\n   * @param vector2 加算するベクトル値\n   * @return 加算結果 ベクトル値\n   */\n  public add(vector2: CubismVector2): CubismVector2 {\n    const ret: CubismVector2 = new CubismVector2(0.0, 0.0);\n    ret.x = this.x + vector2.x;\n    ret.y = this.y + vector2.y;\n    return ret;\n  }\n\n  /**\n   * ベクトルの減算\n   *\n   * @param vector2 減算するベクトル値\n   * @return 減算結果 ベクトル値\n   */\n  public substract(vector2: CubismVector2): CubismVector2 {\n    const ret: CubismVector2 = new CubismVector2(0.0, 0.0);\n    ret.x = this.x - vector2.x;\n    ret.y = this.y - vector2.y;\n    return ret;\n  }\n\n  /**\n   * ベクトルの乗算\n   *\n   * @param vector2 乗算するベクトル値\n   * @return 乗算結果 ベクトル値\n   */\n  public multiply(vector2: CubismVector2): CubismVector2 {\n    const ret: CubismVector2 = new CubismVector2(0.0, 0.0);\n    ret.x = this.x * vector2.x;\n    ret.y = this.y * vector2.y;\n    return ret;\n  }\n\n  /**\n   * ベクトルの乗算(スカラー)\n   *\n   * @param scalar 乗算するスカラー値\n   * @return 乗算結果 ベクトル値\n   */\n  public multiplyByScaler(scalar: number): CubismVector2 {\n    return this.multiply(new CubismVector2(scalar, scalar));\n  }\n\n  /**\n   * ベクトルの除算\n   *\n   * @param vector2 除算するベクトル値\n   * @return 除算結果 ベクトル値\n   */\n  public division(vector2: CubismVector2): CubismVector2 {\n    const ret: CubismVector2 = new CubismVector2(0.0, 0.0);\n    ret.x = this.x / vector2.x;\n    ret.y = this.y / vector2.y;\n    return ret;\n  }\n\n  /**\n   * ベクトルの除算(スカラー)\n   *\n   * @param scalar 除算するスカラー値\n   * @return 除算結果 ベクトル値\n   */\n  public divisionByScalar(scalar: number): CubismVector2 {\n    return this.division(new CubismVector2(scalar, scalar));\n  }\n\n  /**\n   * ベクトルの長さを取得する\n   *\n   * @return ベクトルの長さ\n   */\n  public getLength(): number {\n    return Math.sqrt(this.x * this.x + this.y * this.y);\n  }\n\n  /**\n   * ベクトルの距離の取得\n   *\n   * @param a 点\n   * @return ベクトルの距離\n   */\n  public getDistanceWith(a: CubismVector2): number {\n    return Math.sqrt(\n      (this.x - a.x) * (this.x - a.x) + (this.y - a.y) * (this.y - a.y)\n    );\n  }\n\n  /**\n   * ドット積の計算\n   *\n   * @param a 値\n   * @return 結果\n   */\n  public dot(a: CubismVector2): number {\n    return this.x * a.x + this.y * a.y;\n  }\n\n  /**\n   * 正規化の適用\n   */\n  public normalize(): void {\n    const length: number = Math.pow(this.x * this.x + this.y * this.y, 0.5);\n\n    this.x = this.x / length;\n    this.y = this.y / length;\n  }\n\n  /**\n   * 等しさの確認（等しいか？）\n   *\n   * 値が等しいか？\n   *\n   * @param rhs 確認する値\n   * @return true 値は等しい\n   * @return false 値は等しくない\n   */\n  public isEqual(rhs: CubismVector2): boolean {\n    return this.x == rhs.x && this.y == rhs.y;\n  }\n\n  /**\n   * 等しさの確認（等しくないか？）\n   *\n   * 値が等しくないか？\n   *\n   * @param rhs 確認する値\n   * @return true 値は等しくない\n   * @return false 値は等しい\n   */\n  public isNotEqual(rhs: CubismVector2): boolean {\n    return !this.isEqual(rhs);\n  }\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismvector2';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismVector2 = $.CubismVector2;\n  export type CubismVector2 = $.CubismVector2;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismVector2 } from './cubismvector2';\n\n/**\n * 数値計算などに使用するユーティリティクラス\n */\nexport class CubismMath {\n  static readonly Epsilon: number = 0.00001;\n\n  /**\n   * 第一引数の値を最小値と最大値の範囲に収めた値を返す\n   *\n   * @param value 収められる値\n   * @param min   範囲の最小値\n   * @param max   範囲の最大値\n   * @return 最小値と最大値の範囲に収めた値\n   */\n  static range(value: number, min: number, max: number): number {\n    if (value < min) {\n      value = min;\n    } else if (value > max) {\n      value = max;\n    }\n\n    return value;\n  }\n\n  /**\n   * サイン関数の値を求める\n   *\n   * @param x 角度値（ラジアン）\n   * @return サイン関数sin(x)の値\n   */\n  static sin(x: number): number {\n    return Math.sin(x);\n  }\n\n  /**\n   * コサイン関数の値を求める\n   *\n   * @param x 角度値(ラジアン)\n   * @return コサイン関数cos(x)の値\n   */\n  static cos(x: number): number {\n    return Math.cos(x);\n  }\n\n  /**\n   * 値の絶対値を求める\n   *\n   * @param x 絶対値を求める値\n   * @return 値の絶対値\n   */\n  static abs(x: number): number {\n    return Math.abs(x);\n  }\n\n  /**\n   * 平方根(ルート)を求める\n   * @param x -> 平方根を求める値\n   * @return 値の平方根\n   */\n  static sqrt(x: number): number {\n    return Math.sqrt(x);\n  }\n\n  /**\n   * 立方根を求める\n   * @param x -> 立方根を求める値\n   * @return 値の立方根\n   */\n  static cbrt(x: number): number {\n    if (x === 0) {\n      return x;\n    }\n\n    let cx: number = x;\n    const isNegativeNumber: boolean = cx < 0;\n\n    if (isNegativeNumber) {\n      cx = -cx;\n    }\n\n    let ret: number;\n    if (cx === Infinity) {\n      ret = Infinity;\n    } else {\n      ret = Math.exp(Math.log(cx) / 3);\n      ret = (cx / (ret * ret) + 2 * ret) / 3;\n    }\n    return isNegativeNumber ? -ret : ret;\n  }\n\n  /**\n   * イージング処理されたサインを求める\n   * フェードイン・アウト時のイージングに利用できる\n   *\n   * @param value イージングを行う値\n   * @return イージング処理されたサイン値\n   */\n  static getEasingSine(value: number): number {\n    if (value < 0.0) {\n      return 0.0;\n    } else if (value > 1.0) {\n      return 1.0;\n    }\n\n    return 0.5 - 0.5 * this.cos(value * Math.PI);\n  }\n\n  /**\n   * 大きい方の値を返す\n   *\n   * @param left 左辺の値\n   * @param right 右辺の値\n   * @return 大きい方の値\n   */\n  static max(left: number, right: number): number {\n    return left > right ? left : right;\n  }\n\n  /**\n   * 小さい方の値を返す\n   *\n   * @param left  左辺の値\n   * @param right 右辺の値\n   * @return 小さい方の値\n   */\n  static min(left: number, right: number): number {\n    return left > right ? right : left;\n  }\n\n  /**\n   * 角度値をラジアン値に変換する\n   *\n   * @param degrees   角度値\n   * @return 角度値から変換したラジアン値\n   */\n  static degreesToRadian(degrees: number): number {\n    return (degrees / 180.0) * Math.PI;\n  }\n\n  /**\n   * ラジアン値を角度値に変換する\n   *\n   * @param radian    ラジアン値\n   * @return ラジアン値から変換した角度値\n   */\n  static radianToDegrees(radian: number): number {\n    return (radian * 180.0) / Math.PI;\n  }\n\n  /**\n   * ２つのベクトルからラジアン値を求める\n   *\n   * @param from  始点ベクトル\n   * @param to    終点ベクトル\n   * @return ラジアン値から求めた方向ベクトル\n   */\n  static directionToRadian(from: CubismVector2, to: CubismVector2): number {\n    const q1: number = Math.atan2(to.y, to.x);\n    const q2: number = Math.atan2(from.y, from.x);\n\n    let ret: number = q1 - q2;\n\n    while (ret < -Math.PI) {\n      ret += Math.PI * 2.0;\n    }\n\n    while (ret > Math.PI) {\n      ret -= Math.PI * 2.0;\n    }\n\n    return ret;\n  }\n\n  /**\n   * ２つのベクトルから角度値を求める\n   *\n   * @param from  始点ベクトル\n   * @param to    終点ベクトル\n   * @return 角度値から求めた方向ベクトル\n   */\n  static directionToDegrees(from: CubismVector2, to: CubismVector2): number {\n    const radian: number = this.directionToRadian(from, to);\n    let degree: number = this.radianToDegrees(radian);\n\n    if (to.x - from.x > 0.0) {\n      degree = -degree;\n    }\n\n    return degree;\n  }\n\n  /**\n   * ラジアン値を方向ベクトルに変換する。\n   *\n   * @param totalAngle    ラジアン値\n   * @return ラジアン値から変換した方向ベクトル\n   */\n\n  static radianToDirection(totalAngle: number): CubismVector2 {\n    const ret: CubismVector2 = new CubismVector2();\n\n    ret.x = this.sin(totalAngle);\n    ret.y = this.cos(totalAngle);\n\n    return ret;\n  }\n\n  /**\n   * 三次方程式の三次項の係数が0になったときに補欠的に二次方程式の解をもとめる。\n   * a * x^2 + b * x + c = 0\n   *\n   * @param   a -> 二次項の係数値\n   * @param   b -> 一次項の係数値\n   * @param   c -> 定数項の値\n   * @return  二次方程式の解\n   */\n  static quadraticEquation(a: number, b: number, c: number): number {\n    if (this.abs(a) < CubismMath.Epsilon) {\n      if (this.abs(b) < CubismMath.Epsilon) {\n        return -c;\n      }\n      return -c / b;\n    }\n\n    return -(b + this.sqrt(b * b - 4.0 * a * c)) / (2.0 * a);\n  }\n\n  /**\n   * カルダノの公式によってベジェのt値に該当する３次方程式の解を求める。\n   * 重解になったときには0.0～1.0の値になる解を返す。\n   *\n   * a * x^3 + b * x^2 + c * x + d = 0\n   *\n   * @param   a -> 三次項の係数値\n   * @param   b -> 二次項の係数値\n   * @param   c -> 一次項の係数値\n   * @param   d -> 定数項の値\n   * @return  0.0～1.0の間にある解\n   */\n  static cardanoAlgorithmForBezier(\n    a: number,\n    b: number,\n    c: number,\n    d: number\n  ): number {\n    if (this.sqrt(a) < CubismMath.Epsilon) {\n      return this.range(this.quadraticEquation(b, c, d), 0.0, 1.0);\n    }\n\n    const ba: number = b / a;\n    const ca: number = c / a;\n    const da: number = d / a;\n\n    const p: number = (3.0 * ca - ba * ba) / 3.0;\n    const p3: number = p / 3.0;\n    const q: number = (2.0 * ba * ba * ba - 9.0 * ba * ca + 27.0 * da) / 27.0;\n    const q2: number = q / 2.0;\n    const discriminant: number = q2 * q2 + p3 * p3 * p3;\n\n    const center = 0.5;\n    const threshold: number = center + 0.01;\n\n    if (discriminant < 0.0) {\n      const mp3: number = -p / 3.0;\n      const mp33: number = mp3 * mp3 * mp3;\n      const r: number = this.sqrt(mp33);\n      const t: number = -q / (2.0 * r);\n      const cosphi: number = this.range(t, -1.0, 1.0);\n      const phi: number = Math.acos(cosphi);\n      const crtr: number = this.cbrt(r);\n      const t1: number = 2.0 * crtr;\n\n      const root1: number = t1 * this.cos(phi / 3.0) - ba / 3.0;\n      if (this.abs(root1 - center) < threshold) {\n        return this.range(root1, 0.0, 1.0);\n      }\n\n      const root2: number =\n        t1 * this.cos((phi + 2.0 * Math.PI) / 3.0) - ba / 3.0;\n      if (this.abs(root2 - center) < threshold) {\n        return this.range(root2, 0.0, 1.0);\n      }\n\n      const root3: number =\n        t1 * this.cos((phi + 4.0 * Math.PI) / 3.0) - ba / 3.0;\n      return this.range(root3, 0.0, 1.0);\n    }\n\n    if (discriminant == 0.0) {\n      let u1: number;\n      if (q2 < 0.0) {\n        u1 = this.cbrt(-q2);\n      } else {\n        u1 = -this.cbrt(q2);\n      }\n\n      const root1: number = 2.0 * u1 - ba / 3.0;\n      if (this.abs(root1 - center) < threshold) {\n        return this.range(root1, 0.0, 1.0);\n      }\n\n      const root2: number = -u1 - ba / 3.0;\n      return this.range(root2, 0.0, 1.0);\n    }\n\n    const sd: number = this.sqrt(discriminant);\n    const u1: number = this.cbrt(sd - q2);\n    const v1: number = this.cbrt(sd + q2);\n    const root1: number = u1 - v1 - ba / 3.0;\n    return this.range(root1, 0.0, 1.0);\n  }\n\n  /**\n   * 浮動小数点の余りを求める。\n   *\n   * @param dividend 被除数（割られる値）\n   * @param divisor 除数（割る値）\n   * @returns 余り\n   */\n  static mod(dividend: number, divisor: number): number {\n    if (\n      !isFinite(dividend) ||\n      divisor === 0 ||\n      isNaN(dividend) ||\n      isNaN(divisor)\n    ) {\n      console.warn(\n        `divided: ${dividend}, divisor: ${divisor} mod() returns 'NaN'.`\n      );\n      return NaN;\n    }\n\n    // 絶対値に変換する。\n    const absDividend = Math.abs(dividend);\n    const absDivisor = Math.abs(divisor);\n\n    // 絶対値で割り算する。\n    let result =\n      absDividend - Math.floor(absDividend / absDivisor) * absDivisor;\n\n    // 符号を被除数のものに指定する。\n    result *= Math.sign(dividend);\n    return result;\n  }\n\n  /**\n   * コンストラクタ\n   */\n  private constructor() {}\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmath';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismMath = $.CubismMath;\n  export type CubismMath = $.CubismMath;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismMath } from './cubismmath';\n\nconst FrameRate = 30;\nconst Epsilon = 0.01;\n\n/**\n * 顔の向きの制御機能\n *\n * 顔の向きの制御機能を提供するクラス。\n */\nexport class CubismTargetPoint {\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    this._faceTargetX = 0.0;\n    this._faceTargetY = 0.0;\n    this._faceX = 0.0;\n    this._faceY = 0.0;\n    this._faceVX = 0.0;\n    this._faceVY = 0.0;\n    this._lastTimeSeconds = 0.0;\n    this._userTimeSeconds = 0.0;\n  }\n\n  /**\n   * 更新処理\n   */\n  public update(deltaTimeSeconds: number): void {\n    // デルタ時間を加算する\n    this._userTimeSeconds += deltaTimeSeconds;\n\n    // 首を中央から左右に振るときの平均的な速さは 秒速度。加速・減速を考慮して、その２倍を最高速度とする\n    // 顔の振り具合を、中央（0.0）から、左右は（+-1.0）とする\n    const faceParamMaxV: number = 40.0 / 10.0; // 7.5秒間に40分移動(5.3/sc)\n    const maxV: number = (faceParamMaxV * 1.0) / FrameRate; // 1frameあたりに変化できる速度の上限\n\n    if (this._lastTimeSeconds == 0.0) {\n      this._lastTimeSeconds = this._userTimeSeconds;\n      return;\n    }\n\n    const deltaTimeWeight: number =\n      (this._userTimeSeconds - this._lastTimeSeconds) * FrameRate;\n    this._lastTimeSeconds = this._userTimeSeconds;\n\n    // 最高速度になるまでの時間を\n    const timeToMaxSpeed = 0.15;\n    const frameToMaxSpeed: number = timeToMaxSpeed * FrameRate; // sec * frame/sec\n    const maxA: number = (deltaTimeWeight * maxV) / frameToMaxSpeed; // 1frameあたりの加速度\n\n    // 目指す向きは、（dx, dy）方向のベクトルとなる\n    const dx: number = this._faceTargetX - this._faceX;\n    const dy: number = this._faceTargetY - this._faceY;\n\n    if (CubismMath.abs(dx) <= Epsilon && CubismMath.abs(dy) <= Epsilon) {\n      return; // 変化なし\n    }\n\n    // 速度の最大よりも大きい場合は、速度を落とす\n    const d: number = CubismMath.sqrt(dx * dx + dy * dy);\n\n    // 進行方向の最大速度ベクトル\n    const vx: number = (maxV * dx) / d;\n    const vy: number = (maxV * dy) / d;\n\n    // 現在の速度から、新規速度への変化（加速度）を求める\n    let ax: number = vx - this._faceVX;\n    let ay: number = vy - this._faceVY;\n\n    const a: number = CubismMath.sqrt(ax * ax + ay * ay);\n\n    // 加速のとき\n    if (a < -maxA || a > maxA) {\n      ax *= maxA / a;\n      ay *= maxA / a;\n    }\n\n    // 加速度を元の速度に足して、新速度とする\n    this._faceVX += ax;\n    this._faceVY += ay;\n\n    // 目的の方向に近づいたとき、滑らかに減速するための処理\n    // 設定された加速度で止まる事の出来る距離と速度の関係から\n    // 現在とりうる最高速度を計算し、それ以上の時は速度を落とす\n    // ※本来、人間は筋力で力（加速度）を調整できるため、より自由度が高いが、簡単な処理で済ませている\n    {\n      // 加速度、速度、距離の関係式。\n      //            2  6           2               3\n      //      sqrt(a  t  + 16 a h t  - 8 a h) - a t\n      // v = --------------------------------------\n      //                    2\n      //                 4 t  - 2\n      // (t=1)\n      // \t時刻tは、あらかじめ加速度、速度を1/60(フレームレート、単位なし)で\n      // \t考えているので、t＝１として消してよい（※未検証）\n\n      const maxV: number =\n        0.5 *\n        (CubismMath.sqrt(maxA * maxA + 16.0 * maxA * d - 8.0 * maxA * d) -\n          maxA);\n      const curV: number = CubismMath.sqrt(\n        this._faceVX * this._faceVX + this._faceVY * this._faceVY\n      );\n\n      if (curV > maxV) {\n        // 現在の速度 > 最高速度のとき、最高速度まで減速\n        this._faceVX *= maxV / curV;\n        this._faceVY *= maxV / curV;\n      }\n    }\n\n    this._faceX += this._faceVX;\n    this._faceY += this._faceVY;\n  }\n\n  /**\n   * X軸の顔の向きの値を取得\n   *\n   * @return X軸の顔の向きの値（-1.0 ~ 1.0）\n   */\n  public getX(): number {\n    return this._faceX;\n  }\n\n  /**\n   * Y軸の顔の向きの値を取得\n   *\n   * @return Y軸の顔の向きの値（-1.0 ~ 1.0）\n   */\n  public getY(): number {\n    return this._faceY;\n  }\n\n  /**\n   * 顔の向きの目標値を設定\n   *\n   * @param x X軸の顔の向きの値（-1.0 ~ 1.0）\n   * @param y Y軸の顔の向きの値（-1.0 ~ 1.0）\n   */\n  public set(x: number, y: number): void {\n    this._faceTargetX = x;\n    this._faceTargetY = y;\n  }\n\n  private _faceTargetX: number; // 顔の向きのX目標値（この値に近づいていく）\n  private _faceTargetY: number; // 顔の向きのY目標値（この値に近づいていく）\n  private _faceX: number; // 顔の向きX（-1.0 ~ 1.0）\n  private _faceY: number; // 顔の向きY（-1.0 ~ 1.0）\n  private _faceVX: number; // 顔の向きの変化速度X\n  private _faceVY: number; // 顔の向きの変化速度Y\n  private _lastTimeSeconds: number; // 最後の実行時間[秒]\n  private _userTimeSeconds: number; // デルタ時間の積算値[秒]\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismtargetpoint';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismTargetPoint = $.CubismTargetPoint;\n  export type CubismTargetPoint = $.CubismTargetPoint;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismMath } from '../math/cubismmath';\nimport { CubismModel } from '../model/cubismmodel';\nimport { csmString } from '../type/csmstring';\nimport { csmVector } from '../type/csmvector';\nimport { CSM_ASSERT, CubismDebug } from '../utils/cubismdebug';\nimport { CubismMotionQueueEntry } from './cubismmotionqueueentry';\n\n/** モーション再生終了コールバック関数定義 */\nexport type FinishedMotionCallback = (self: ACubismMotion) => void;\n\n/**\n * モーションの抽象基底クラス\n *\n * モーションの抽象基底クラス。MotionQueueManagerによってモーションの再生を管理する。\n */\nexport abstract class ACubismMotion {\n  /**\n   * インスタンスの破棄\n   */\n  public static delete(motion: ACubismMotion): void {\n    motion.release();\n    motion = null;\n  }\n\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    this._fadeInSeconds = -1.0;\n    this._fadeOutSeconds = -1.0;\n    this._weight = 1.0;\n    this._offsetSeconds = 0.0; // 再生の開始時刻\n    this._firedEventValues = new csmVector<csmString>();\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    this._weight = 0.0;\n  }\n\n  /**\n   * モデルのパラメータ\n   * @param model 対象のモデル\n   * @param motionQueueEntry CubismMotionQueueManagerで管理されているモーション\n   * @param userTimeSeconds デルタ時間の積算値[秒]\n   */\n  public updateParameters(\n    model: CubismModel,\n    motionQueueEntry: CubismMotionQueueEntry,\n    userTimeSeconds: number\n  ): void {\n    if (!motionQueueEntry.isAvailable() || motionQueueEntry.isFinished()) {\n      return;\n    }\n\n    this.setupMotionQueueEntry(motionQueueEntry, userTimeSeconds);\n\n    const fadeWeight = this.updateFadeWeight(motionQueueEntry, userTimeSeconds);\n\n    //---- 全てのパラメータIDをループする ----\n    this.doUpdateParameters(\n      model,\n      userTimeSeconds,\n      fadeWeight,\n      motionQueueEntry\n    );\n\n    // 後処理\n    // 終了時刻を過ぎたら終了フラグを立てる(CubismMotionQueueManager)\n    if (\n      motionQueueEntry.getEndTime() > 0 &&\n      motionQueueEntry.getEndTime() < userTimeSeconds\n    ) {\n      motionQueueEntry.setIsFinished(true); // 終了\n    }\n  }\n\n  /**\n   * @brief モデルの再生開始処理\n   *\n   * モーションの再生を開始するためのセットアップを行う。\n   *\n   * @param[in]   motionQueueEntry    CubismMotionQueueManagerで管理されているモーション\n   * @param[in]   userTimeSeconds     デルタ時間の積算値[秒]\n   */\n  public setupMotionQueueEntry(\n    motionQueueEntry: CubismMotionQueueEntry,\n    userTimeSeconds: number\n  ) {\n    if (motionQueueEntry == null || motionQueueEntry.isStarted()) {\n      return;\n    }\n\n    if (!motionQueueEntry.isAvailable()) {\n      return;\n    }\n\n    motionQueueEntry.setIsStarted(true);\n    motionQueueEntry.setStartTime(userTimeSeconds - this._offsetSeconds); // モーションの開始時刻を記録\n    motionQueueEntry.setFadeInStartTime(userTimeSeconds); // フェードインの開始時刻\n\n    const duration = this.getDuration();\n\n    if (motionQueueEntry.getEndTime() < 0.0) {\n      // 開始していないうちに終了設定している場合がある\n      motionQueueEntry.setEndTime(\n        duration <= 0.0 ? -1 : motionQueueEntry.getStartTime() + duration\n      );\n      // duration == -1 の場合はループする\n    }\n  }\n\n  /**\n   * @brief モデルのウェイト更新\n   *\n   * モーションのウェイトを更新する。\n   *\n   * @param[in]   motionQueueEntry    CubismMotionQueueManagerで管理されているモーション\n   * @param[in]   userTimeSeconds     デルタ時間の積算値[秒]\n   */\n  public updateFadeWeight(\n    motionQueueEntry: CubismMotionQueueEntry,\n    userTimeSeconds: number\n  ): number {\n    if (motionQueueEntry == null) {\n      CubismDebug.print(LogLevel.LogLevel_Error, 'motionQueueEntry is null.');\n    }\n\n    let fadeWeight: number = this._weight; // 現在の値と掛け合わせる割合\n\n    //---- フェードイン・アウトの処理 ----\n    // 単純なサイン関数でイージングする\n    const fadeIn: number =\n      this._fadeInSeconds == 0.0\n        ? 1.0\n        : CubismMath.getEasingSine(\n            (userTimeSeconds - motionQueueEntry.getFadeInStartTime()) /\n              this._fadeInSeconds\n          );\n\n    const fadeOut: number =\n      this._fadeOutSeconds == 0.0 || motionQueueEntry.getEndTime() < 0.0\n        ? 1.0\n        : CubismMath.getEasingSine(\n            (motionQueueEntry.getEndTime() - userTimeSeconds) /\n              this._fadeOutSeconds\n          );\n\n    fadeWeight = fadeWeight * fadeIn * fadeOut;\n\n    motionQueueEntry.setState(userTimeSeconds, fadeWeight);\n\n    CSM_ASSERT(0.0 <= fadeWeight && fadeWeight <= 1.0);\n\n    return fadeWeight;\n  }\n\n  /**\n   * フェードインの時間を設定する\n   * @param fadeInSeconds フェードインにかかる時間[秒]\n   */\n  public setFadeInTime(fadeInSeconds: number): void {\n    this._fadeInSeconds = fadeInSeconds;\n  }\n\n  /**\n   * フェードアウトの時間を設定する\n   * @param fadeOutSeconds フェードアウトにかかる時間[秒]\n   */\n  public setFadeOutTime(fadeOutSeconds: number): void {\n    this._fadeOutSeconds = fadeOutSeconds;\n  }\n\n  /**\n   * フェードアウトにかかる時間の取得\n   * @return フェードアウトにかかる時間[秒]\n   */\n  public getFadeOutTime(): number {\n    return this._fadeOutSeconds;\n  }\n\n  /**\n   * フェードインにかかる時間の取得\n   * @return フェードインにかかる時間[秒]\n   */\n  public getFadeInTime(): number {\n    return this._fadeInSeconds;\n  }\n\n  /**\n   * モーション適用の重みの設定\n   * @param weight 重み（0.0 - 1.0）\n   */\n  public setWeight(weight: number): void {\n    this._weight = weight;\n  }\n\n  /**\n   * モーション適用の重みの取得\n   * @return 重み（0.0 - 1.0）\n   */\n  public getWeight(): number {\n    return this._weight;\n  }\n\n  /**\n   * モーションの長さの取得\n   * @return モーションの長さ[秒]\n   *\n   * @note ループの時は「-1」。\n   *       ループでない場合は、オーバーライドする。\n   *       正の値の時は取得される時間で終了する。\n   *       「-1」の時は外部から停止命令がない限り終わらない処理となる。\n   */\n  public getDuration(): number {\n    return -1.0;\n  }\n\n  /**\n   * モーションのループ1回分の長さの取得\n   * @return モーションのループ一回分の長さ[秒]\n   *\n   * @note ループしない場合は、getDuration()と同じ値を返す\n   *       ループ一回分の長さが定義できない場合(プログラム的に動き続けるサブクラスなど)の場合は「-1」を返す\n   */\n  public getLoopDuration(): number {\n    return -1.0;\n  }\n\n  /**\n   * モーション再生の開始時刻の設定\n   * @param offsetSeconds モーション再生の開始時刻[秒]\n   */\n  public setOffsetTime(offsetSeconds: number): void {\n    this._offsetSeconds = offsetSeconds;\n  }\n\n  /**\n   * モデルのパラメータ更新\n   *\n   * イベント発火のチェック。\n   * 入力する時間は呼ばれるモーションタイミングを０とした秒数で行う。\n   *\n   * @param beforeCheckTimeSeconds 前回のイベントチェック時間[秒]\n   * @param motionTimeSeconds 今回の再生時間[秒]\n   */\n  public getFiredEvent(\n    beforeCheckTimeSeconds: number,\n    motionTimeSeconds: number\n  ): csmVector<csmString> {\n    return this._firedEventValues;\n  }\n\n  /**\n   * モーションを更新して、モデルにパラメータ値を反映する\n   * @param model 対象のモデル\n   * @param userTimeSeconds デルタ時間の積算値[秒]\n   * @param weight モーションの重み\n   * @param motionQueueEntry CubismMotionQueueManagerで管理されているモーション\n   * @return true モデルへパラメータ値の反映あり\n   * @return false モデルへのパラメータ値の反映なし（モーションの変化なし）\n   */\n  public abstract doUpdateParameters(\n    model: CubismModel,\n    userTimeSeconds: number,\n    weight: number,\n    motionQueueEntry: CubismMotionQueueEntry\n  ): void;\n\n  /**\n   * モーション再生終了コールバックの登録\n   *\n   * モーション再生終了コールバックを登録する。\n   * isFinishedフラグを設定するタイミングで呼び出される。\n   * 以下の状態の際には呼び出されない:\n   *   1. 再生中のモーションが「ループ」として設定されているとき\n   *   2. コールバックが登録されていない時\n   *\n   * @param onFinishedMotionHandler モーション再生終了コールバック関数\n   */\n  public setFinishedMotionHandler = (\n    onFinishedMotionHandler: FinishedMotionCallback\n  ) => (this._onFinishedMotion = onFinishedMotionHandler);\n\n  /**\n   * モーション再生終了コールバックの取得\n   *\n   * モーション再生終了コールバックを取得する。\n   *\n   * @return 登録されているモーション再生終了コールバック関数\n   */\n  public getFinishedMotionHandler = () => this._onFinishedMotion;\n\n  /**\n   * 透明度のカーブが存在するかどうかを確認する\n   *\n   * @returns true  -> キーが存在する\n   *          false -> キーが存在しない\n   */\n  public isExistModelOpacity(): boolean {\n    return false;\n  }\n\n  /**\n   * 透明度のカーブのインデックスを返す\n   *\n   * @returns success:透明度のカーブのインデックス\n   */\n  public getModelOpacityIndex(): number {\n    return -1;\n  }\n\n  /**\n   * 透明度のIdを返す\n   *\n   * @param index モーションカーブのインデックス\n   * @returns success:透明度のId\n   */\n  public getModelOpacityId(index: number): CubismIdHandle {\n    return null;\n  }\n\n  /**\n   * 指定時間の透明度の値を返す\n   *\n   * @returns success:モーションの現在時間におけるOpacityの値\n   *\n   * @note  更新後の値を取るにはUpdateParameters() の後に呼び出す。\n   */\n  protected getModelOpacityValue(): number {\n    return 1.0;\n  }\n\n  public _fadeInSeconds: number; // フェードインにかかる時間[秒]\n  public _fadeOutSeconds: number; // フェードアウトにかかる時間[秒]\n  public _weight: number; // モーションの重み\n  public _offsetSeconds: number; // モーション再生の開始時間[秒]\n\n  public _firedEventValues: csmVector<csmString>;\n\n  // モーション再生終了コールバック関数\n  public _onFinishedMotion?: FinishedMotionCallback;\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './acubismmotion';\nimport { CubismIdHandle } from '../id/cubismid';\nimport { LogLevel } from '../live2dcubismframework';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const ACubismMotion = $.ACubismMotion;\n  export type ACubismMotion = $.ACubismMotion;\n  export type FinishedMotionCallback = $.FinishedMotionCallback;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdHandle } from '../id/cubismid';\nimport { CubismFramework } from '../live2dcubismframework';\nimport { CubismModel } from '../model/cubismmodel';\nimport { csmVector } from '../type/csmvector';\nimport { CubismJson, Value } from '../utils/cubismjson';\nimport { ACubismMotion } from './acubismmotion';\nimport { CubismMotionQueueEntry } from './cubismmotionqueueentry';\n\n// exp3.jsonのキーとデフォルト\nconst ExpressionKeyFadeIn = 'FadeInTime';\nconst ExpressionKeyFadeOut = 'FadeOutTime';\nconst ExpressionKeyParameters = 'Parameters';\nconst ExpressionKeyId = 'Id';\nconst ExpressionKeyValue = 'Value';\nconst ExpressionKeyBlend = 'Blend';\nconst BlendValueAdd = 'Add';\nconst BlendValueMultiply = 'Multiply';\nconst BlendValueOverwrite = 'Overwrite';\nconst DefaultFadeTime = 1.0;\n\n/**\n * 表情のモーション\n *\n * 表情のモーションクラス。\n */\nexport class CubismExpressionMotion extends ACubismMotion {\n  static readonly DefaultAdditiveValue = 0.0; // 加算適用の初期値\n  static readonly DefaultMultiplyValue = 1.0; // 乗算適用の初期値\n\n  /**\n   * インスタンスを作成する。\n   * @param buffer expファイルが読み込まれているバッファ\n   * @param size バッファのサイズ\n   * @return 作成されたインスタンス\n   */\n  public static create(\n    buffer: ArrayBuffer,\n    size: number\n  ): CubismExpressionMotion {\n    const expression: CubismExpressionMotion = new CubismExpressionMotion();\n    expression.parse(buffer, size);\n    return expression;\n  }\n\n  /**\n   * モデルのパラメータの更新の実行\n   * @param model 対象のモデル\n   * @param userTimeSeconds デルタ時間の積算値[秒]\n   * @param weight モーションの重み\n   * @param motionQueueEntry CubismMotionQueueManagerで管理されているモーション\n   */\n  public doUpdateParameters(\n    model: CubismModel,\n    userTimeSeconds: number,\n    weight: number,\n    motionQueueEntry: CubismMotionQueueEntry\n  ): void {\n    for (let i = 0; i < this._parameters.getSize(); ++i) {\n      const parameter: ExpressionParameter = this._parameters.at(i);\n\n      switch (parameter.blendType) {\n        case ExpressionBlendType.Additive: {\n          model.addParameterValueById(\n            parameter.parameterId,\n            parameter.value,\n            weight\n          );\n          break;\n        }\n        case ExpressionBlendType.Multiply: {\n          model.multiplyParameterValueById(\n            parameter.parameterId,\n            parameter.value,\n            weight\n          );\n          break;\n        }\n        case ExpressionBlendType.Overwrite: {\n          model.setParameterValueById(\n            parameter.parameterId,\n            parameter.value,\n            weight\n          );\n          break;\n        }\n        default:\n          // 仕様にない値を設定した時はすでに加算モードになっている\n          break;\n      }\n    }\n  }\n\n  /**\n   * @brief 表情によるモデルのパラメータの計算\n   *\n   * モデルの表情に関するパラメータを計算する。\n   *\n   * @param[in]   model                        対象のモデル\n   * @param[in]   userTimeSeconds              デルタ時間の積算値[秒]\n   * @param[in]   motionQueueEntry             CubismMotionQueueManagerで管理されているモーション\n   * @param[in]   expressionParameterValues    モデルに適用する各パラメータの値\n   * @param[in]   expressionIndex              表情のインデックス\n   * @param[in]   fadeWeight                   表情のウェイト\n   */\n  public calculateExpressionParameters(\n    model: CubismModel,\n    userTimeSeconds: number,\n    motionQueueEntry: CubismMotionQueueEntry,\n    expressionParameterValues: csmVector<ExpressionParameterValue>,\n    expressionIndex: number,\n    fadeWeight: number\n  ) {\n    if (motionQueueEntry == null || expressionParameterValues == null) {\n      return;\n    }\n\n    if (!motionQueueEntry.isAvailable()) {\n      return;\n    }\n\n    // CubismExpressionMotion._fadeWeight は廃止予定です。\n    // 互換性のために処理は残りますが、実際には使用しておりません。\n    this._fadeWeight = this.updateFadeWeight(motionQueueEntry, userTimeSeconds);\n\n    // モデルに適用する値を計算\n    for (let i = 0; i < expressionParameterValues.getSize(); ++i) {\n      const expressionParameterValue = expressionParameterValues.at(i);\n\n      if (expressionParameterValue.parameterId == null) {\n        continue;\n      }\n\n      const currentParameterValue = (expressionParameterValue.overwriteValue =\n        model.getParameterValueById(expressionParameterValue.parameterId));\n\n      const expressionParameters = this.getExpressionParameters();\n      let parameterIndex = -1;\n      for (let j = 0; j < expressionParameters.getSize(); ++j) {\n        if (\n          expressionParameterValue.parameterId !=\n          expressionParameters.at(j).parameterId\n        ) {\n          continue;\n        }\n\n        parameterIndex = j;\n\n        break;\n      }\n\n      // 再生中のExpressionが参照していないパラメータは初期値を適用\n      if (parameterIndex < 0) {\n        if (expressionIndex == 0) {\n          expressionParameterValue.additiveValue =\n            CubismExpressionMotion.DefaultAdditiveValue;\n          expressionParameterValue.multiplyValue =\n            CubismExpressionMotion.DefaultMultiplyValue;\n          expressionParameterValue.overwriteValue = currentParameterValue;\n        } else {\n          expressionParameterValue.additiveValue = this.calculateValue(\n            expressionParameterValue.additiveValue,\n            CubismExpressionMotion.DefaultAdditiveValue,\n            fadeWeight\n          );\n          expressionParameterValue.multiplyValue = this.calculateValue(\n            expressionParameterValue.multiplyValue,\n            CubismExpressionMotion.DefaultMultiplyValue,\n            fadeWeight\n          );\n          expressionParameterValue.overwriteValue = this.calculateValue(\n            expressionParameterValue.overwriteValue,\n            currentParameterValue,\n            fadeWeight\n          );\n        }\n        continue;\n      }\n\n      // 値を計算\n      const value = expressionParameters.at(parameterIndex).value;\n      let newAdditiveValue, newMultiplyValue, newOverwriteValue;\n      switch (expressionParameters.at(parameterIndex).blendType) {\n        case ExpressionBlendType.Additive:\n          newAdditiveValue = value;\n          newMultiplyValue = CubismExpressionMotion.DefaultMultiplyValue;\n          newOverwriteValue = currentParameterValue;\n          break;\n\n        case ExpressionBlendType.Multiply:\n          newAdditiveValue = CubismExpressionMotion.DefaultAdditiveValue;\n          newMultiplyValue = value;\n          newOverwriteValue = currentParameterValue;\n          break;\n\n        case ExpressionBlendType.Overwrite:\n          newAdditiveValue = CubismExpressionMotion.DefaultAdditiveValue;\n          newMultiplyValue = CubismExpressionMotion.DefaultMultiplyValue;\n          newOverwriteValue = value;\n          break;\n\n        default:\n          return;\n      }\n\n      if (expressionIndex == 0) {\n        expressionParameterValue.additiveValue = newAdditiveValue;\n        expressionParameterValue.multiplyValue = newMultiplyValue;\n        expressionParameterValue.overwriteValue = newOverwriteValue;\n      } else {\n        expressionParameterValue.additiveValue =\n          expressionParameterValue.additiveValue * (1.0 - fadeWeight) +\n          newAdditiveValue * fadeWeight;\n        expressionParameterValue.multiplyValue =\n          expressionParameterValue.multiplyValue * (1.0 - fadeWeight) +\n          newMultiplyValue * fadeWeight;\n        expressionParameterValue.overwriteValue =\n          expressionParameterValue.overwriteValue * (1.0 - fadeWeight) +\n          newOverwriteValue * fadeWeight;\n      }\n    }\n  }\n\n  /**\n   * @brief 表情が参照しているパラメータを取得\n   *\n   * 表情が参照しているパラメータを取得する\n   *\n   * @return 表情パラメータ\n   */\n  public getExpressionParameters() {\n    return this._parameters;\n  }\n\n  /**\n   * @brief 表情のフェードの値を取得\n   *\n   * 現在の表情のフェードのウェイト値を取得する\n   *\n   * @returns 表情のフェードのウェイト値\n   *\n   * @deprecated CubismExpressionMotion.fadeWeightが削除予定のため非推奨。\n   * CubismExpressionMotionManager.getFadeWeight(index: number): number を使用してください。\n   * @see CubismExpressionMotionManager#getFadeWeight(index: number)\n   */\n  public getFadeWeight() {\n    return this._fadeWeight;\n  }\n\n  protected parse(buffer: ArrayBuffer, size: number) {\n    const json: CubismJson = CubismJson.create(buffer, size);\n    if (!json) {\n      return;\n    }\n\n    const root: Value = json.getRoot();\n\n    this.setFadeInTime(\n      root.getValueByString(ExpressionKeyFadeIn).toFloat(DefaultFadeTime)\n    ); // フェードイン\n    this.setFadeOutTime(\n      root.getValueByString(ExpressionKeyFadeOut).toFloat(DefaultFadeTime)\n    ); // フェードアウト\n\n    // 各パラメータについて\n    const parameterCount = root\n      .getValueByString(ExpressionKeyParameters)\n      .getSize();\n    this._parameters.prepareCapacity(parameterCount);\n\n    for (let i = 0; i < parameterCount; ++i) {\n      const param: Value = root\n        .getValueByString(ExpressionKeyParameters)\n        .getValueByIndex(i);\n      const parameterId: CubismIdHandle = CubismFramework.getIdManager().getId(\n        param.getValueByString(ExpressionKeyId).getRawString()\n      ); // パラメータID\n\n      const value: number = param\n        .getValueByString(ExpressionKeyValue)\n        .toFloat(); // 値\n\n      // 計算方法の設定\n      let blendType: ExpressionBlendType;\n\n      if (\n        param.getValueByString(ExpressionKeyBlend).isNull() ||\n        param.getValueByString(ExpressionKeyBlend).getString() == BlendValueAdd\n      ) {\n        blendType = ExpressionBlendType.Additive;\n      } else if (\n        param.getValueByString(ExpressionKeyBlend).getString() ==\n        BlendValueMultiply\n      ) {\n        blendType = ExpressionBlendType.Multiply;\n      } else if (\n        param.getValueByString(ExpressionKeyBlend).getString() ==\n        BlendValueOverwrite\n      ) {\n        blendType = ExpressionBlendType.Overwrite;\n      } else {\n        // その他 仕様にない値を設定した時は加算モードにすることで復旧\n        blendType = ExpressionBlendType.Additive;\n      }\n\n      // 設定オブジェクトを作成してリストに追加する\n      const item: ExpressionParameter = new ExpressionParameter();\n\n      item.parameterId = parameterId;\n      item.blendType = blendType;\n      item.value = value;\n\n      this._parameters.pushBack(item);\n    }\n\n    CubismJson.delete(json); // JSONデータは不要になったら削除する\n  }\n\n  /**\n   * @brief ブレンド計算\n   *\n   * 入力された値でブレンド計算をする。\n   *\n   * @param source 現在の値\n   * @param destination 適用する値\n   * @param weight ウェイト\n   * @returns 計算結果\n   */\n  public calculateValue(\n    source: number,\n    destination: number,\n    fadeWeight: number\n  ): number {\n    return source * (1.0 - fadeWeight) + destination * fadeWeight;\n  }\n\n  /**\n   * コンストラクタ\n   */\n  protected constructor() {\n    super();\n    this._parameters = new csmVector<ExpressionParameter>();\n    this._fadeWeight = 0.0;\n  }\n\n  private _parameters: csmVector<ExpressionParameter>; // 表情のパラメータ情報リスト\n\n  /**\n   * 表情の現在のウェイト\n   *\n   * @deprecated 不具合を引き起こす要因となるため非推奨。\n   */\n  private _fadeWeight: number;\n}\n\n/**\n * 表情パラメータ値の計算方式\n */\nexport enum ExpressionBlendType {\n  Additive = 0, // 加算\n  Multiply = 1, // 乗算\n  Overwrite = 2 // 上書き\n}\n\n/**\n * 表情のパラメータ情報\n */\nexport class ExpressionParameter {\n  parameterId: CubismIdHandle; // パラメータID\n  blendType: ExpressionBlendType; // パラメータの演算種類\n  value: number; // 値\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismexpressionmotion';\nimport { ExpressionParameterValue } from './cubismexpressionmotionmanager';\nimport { CubismDefaultParameterId } from '../cubismdefaultparameterid';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismExpressionMotion = $.CubismExpressionMotion;\n  export type CubismExpressionMotion = $.CubismExpressionMotion;\n  export const ExpressionBlendType = $.ExpressionBlendType;\n  export type ExpressionBlendType = $.ExpressionBlendType;\n  export const ExpressionParameter = $.ExpressionParameter;\n  export type ExpressionParameter = $.ExpressionParameter;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { ACubismMotion } from './acubismmotion';\nimport { CubismMotionQueueEntryHandle } from './cubismmotionqueuemanager';\n\n/**\n * CubismMotionQueueManagerで再生している各モーションの管理クラス。\n */\nexport class CubismMotionQueueEntry {\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    this._autoDelete = false;\n    this._motion = null;\n    this._available = true;\n    this._finished = false;\n    this._started = false;\n    this._startTimeSeconds = -1.0;\n    this._fadeInStartTimeSeconds = 0.0;\n    this._endTimeSeconds = -1.0;\n    this._stateTimeSeconds = 0.0;\n    this._stateWeight = 0.0;\n    this._lastEventCheckSeconds = 0.0;\n    this._motionQueueEntryHandle = this;\n    this._fadeOutSeconds = 0.0;\n    this._isTriggeredFadeOut = false;\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    if (this._autoDelete && this._motion) {\n      ACubismMotion.delete(this._motion); //\n    }\n  }\n\n  /**\n   * フェードアウト時間と開始判定の設定\n   * @param fadeOutSeconds フェードアウトにかかる時間[秒]\n   */\n  public setFadeOut(fadeOutSeconds: number): void {\n    this._fadeOutSeconds = fadeOutSeconds;\n    this._isTriggeredFadeOut = true;\n  }\n\n  /**\n   * フェードアウトの開始\n   * @param fadeOutSeconds フェードアウトにかかる時間[秒]\n   * @param userTimeSeconds デルタ時間の積算値[秒]\n   */\n  public startFadeOut(fadeOutSeconds: number, userTimeSeconds: number): void {\n    const newEndTimeSeconds: number = userTimeSeconds + fadeOutSeconds;\n    this._isTriggeredFadeOut = true;\n\n    if (\n      this._endTimeSeconds < 0.0 ||\n      newEndTimeSeconds < this._endTimeSeconds\n    ) {\n      this._endTimeSeconds = newEndTimeSeconds;\n    }\n  }\n\n  /**\n   * モーションの終了の確認\n   *\n   * @return true モーションが終了した\n   * @return false 終了していない\n   */\n  public isFinished(): boolean {\n    return this._finished;\n  }\n\n  /**\n   * モーションの開始の確認\n   * @return true モーションが開始した\n   * @return false 開始していない\n   */\n  public isStarted(): boolean {\n    return this._started;\n  }\n\n  /**\n   * モーションの開始時刻の取得\n   * @return モーションの開始時刻[秒]\n   */\n  public getStartTime(): number {\n    return this._startTimeSeconds;\n  }\n\n  /**\n   * フェードインの開始時刻の取得\n   * @return フェードインの開始時刻[秒]\n   */\n  public getFadeInStartTime(): number {\n    return this._fadeInStartTimeSeconds;\n  }\n\n  /**\n   * フェードインの終了時刻の取得\n   * @return フェードインの終了時刻の取得\n   */\n  public getEndTime(): number {\n    return this._endTimeSeconds;\n  }\n\n  /**\n   * モーションの開始時刻の設定\n   * @param startTime モーションの開始時刻\n   */\n  public setStartTime(startTime: number): void {\n    this._startTimeSeconds = startTime;\n  }\n\n  /**\n   * フェードインの開始時刻の設定\n   * @param startTime フェードインの開始時刻[秒]\n   */\n  public setFadeInStartTime(startTime: number): void {\n    this._fadeInStartTimeSeconds = startTime;\n  }\n\n  /**\n   * フェードインの終了時刻の設定\n   * @param endTime フェードインの終了時刻[秒]\n   */\n  public setEndTime(endTime: number): void {\n    this._endTimeSeconds = endTime;\n  }\n\n  /**\n   * モーションの終了の設定\n   * @param f trueならモーションの終了\n   */\n  public setIsFinished(f: boolean): void {\n    this._finished = f;\n  }\n\n  /**\n   * モーション開始の設定\n   * @param f trueならモーションの開始\n   */\n  public setIsStarted(f: boolean): void {\n    this._started = f;\n  }\n\n  /**\n   * モーションの有効性の確認\n   * @return true モーションは有効\n   * @return false モーションは無効\n   */\n  public isAvailable(): boolean {\n    return this._available;\n  }\n\n  /**\n   * モーションの有効性の設定\n   * @param v trueならモーションは有効\n   */\n  public setIsAvailable(v: boolean): void {\n    this._available = v;\n  }\n\n  /**\n   * モーションの状態の設定\n   * @param timeSeconds 現在時刻[秒]\n   * @param weight モーション尾重み\n   */\n  public setState(timeSeconds: number, weight: number): void {\n    this._stateTimeSeconds = timeSeconds;\n    this._stateWeight = weight;\n  }\n\n  /**\n   * モーションの現在時刻の取得\n   * @return モーションの現在時刻[秒]\n   */\n  public getStateTime(): number {\n    return this._stateTimeSeconds;\n  }\n\n  /**\n   * モーションの重みの取得\n   * @return モーションの重み\n   */\n  public getStateWeight(): number {\n    return this._stateWeight;\n  }\n\n  /**\n   * 最後にイベントの発火をチェックした時間を取得\n   *\n   * @return 最後にイベントの発火をチェックした時間[秒]\n   */\n  public getLastCheckEventSeconds(): number {\n    return this._lastEventCheckSeconds;\n  }\n\n  /**\n   * 最後にイベントをチェックした時間を設定\n   * @param checkSeconds 最後にイベントをチェックした時間[秒]\n   */\n  public setLastCheckEventSeconds(checkSeconds: number): void {\n    this._lastEventCheckSeconds = checkSeconds;\n  }\n\n  /**\n   * フェードアウト開始判定の取得\n   * @return フェードアウト開始するかどうか\n   */\n  public isTriggeredFadeOut(): boolean {\n    return this._isTriggeredFadeOut;\n  }\n\n  /**\n   * フェードアウト時間の取得\n   * @return フェードアウト時間[秒]\n   */\n  public getFadeOutSeconds(): number {\n    return this._fadeOutSeconds;\n  }\n\n  /**\n   * モーションの取得\n   *\n   * @return モーション\n   */\n  public getCubismMotion(): ACubismMotion {\n    return this._motion;\n  }\n\n  _autoDelete: boolean; // 自動削除\n  _motion: ACubismMotion; // モーション\n\n  _available: boolean; // 有効化フラグ\n  _finished: boolean; // 終了フラグ\n  _started: boolean; // 開始フラグ\n  _startTimeSeconds: number; // モーション再生開始時刻[秒]\n  _fadeInStartTimeSeconds: number; // フェードイン開始時刻（ループの時は初回のみ）[秒]\n  _endTimeSeconds: number; // 終了予定時刻[秒]\n  _stateTimeSeconds: number; // 時刻の状態[秒]\n  _stateWeight: number; // 重みの状態\n  _lastEventCheckSeconds: number; // 最終のMotion側のチェックした時間\n  private _fadeOutSeconds: number; // フェードアウト時間[秒]\n  private _isTriggeredFadeOut: boolean; // フェードアウト開始フラグ\n\n  _motionQueueEntryHandle: CubismMotionQueueEntryHandle; // インスタンスごとに一意の値を持つ識別番号\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmotionqueueentry';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismMotionQueueEntry = $.CubismMotionQueueEntry;\n  export type CubismMotionQueueEntry = $.CubismMotionQueueEntry;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { ACubismMotion } from './acubismmotion';\nimport { CubismMotionQueueEntry } from './cubismmotionqueueentry';\nimport { csmVector, iterator } from '../type/csmvector';\nimport { CubismModel } from '../model/cubismmodel';\nimport { csmString } from '../type/csmstring';\n\n/**\n * モーション再生の管理\n *\n * モーション再生の管理用クラス。CubismMotionモーションなどACubismMotionのサブクラスを再生するために使用する。\n *\n * @note 再生中に別のモーションが StartMotion()された場合は、新しいモーションに滑らかに変化し旧モーションは中断する。\n *       表情用モーション、体用モーションなどを分けてモーション化した場合など、\n *       複数のモーションを同時に再生させる場合は、複数のCubismMotionQueueManagerインスタンスを使用する。\n */\nexport class CubismMotionQueueManager {\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    this._userTimeSeconds = 0.0;\n    this._eventCallBack = null;\n    this._eventCustomData = null;\n    this._motions = new csmVector<CubismMotionQueueEntry>();\n  }\n\n  /**\n   * デストラクタ\n   */\n  public release(): void {\n    for (let i = 0; i < this._motions.getSize(); ++i) {\n      if (this._motions.at(i)) {\n        this._motions.at(i).release();\n        this._motions.set(i, null);\n      }\n    }\n\n    this._motions = null;\n  }\n\n  /**\n   * 指定したモーションの開始\n   *\n   * 指定したモーションを開始する。同じタイプのモーションが既にある場合は、既存のモーションに終了フラグを立て、フェードアウトを開始させる。\n   *\n   * @param   motion          開始するモーション\n   * @param   autoDelete      再生が終了したモーションのインスタンスを削除するなら true\n   * @param   userTimeSeconds Deprecated: デルタ時間の積算値[秒] 関数内で参照していないため使用は非推奨。\n   * @return                      開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するIsFinished()の引数で使用する。開始できない時は「-1」\n   */\n  public startMotion(\n    motion: ACubismMotion,\n    autoDelete: boolean,\n    userTimeSeconds?: number\n  ): CubismMotionQueueEntryHandle {\n    if (motion == null) {\n      return InvalidMotionQueueEntryHandleValue;\n    }\n\n    let motionQueueEntry: CubismMotionQueueEntry = null;\n\n    // 既にモーションがあれば終了フラグを立てる\n    for (let i = 0; i < this._motions.getSize(); ++i) {\n      motionQueueEntry = this._motions.at(i);\n      if (motionQueueEntry == null) {\n        continue;\n      }\n\n      motionQueueEntry.setFadeOut(motionQueueEntry._motion.getFadeOutTime()); // フェードアウト設定\n    }\n\n    motionQueueEntry = new CubismMotionQueueEntry(); // 終了時に破棄する\n    motionQueueEntry._autoDelete = autoDelete;\n    motionQueueEntry._motion = motion;\n\n    this._motions.pushBack(motionQueueEntry);\n\n    return motionQueueEntry._motionQueueEntryHandle;\n  }\n\n  /**\n   * 全てのモーションの終了の確認\n   * @return true 全て終了している\n   * @return false 終了していない\n   */\n  public isFinished(): boolean {\n    // ------- 処理を行う -------\n    // 既にモーションがあれば終了フラグを立てる\n\n    for (\n      let ite: iterator<CubismMotionQueueEntry> = this._motions.begin();\n      ite.notEqual(this._motions.end());\n\n    ) {\n      let motionQueueEntry: CubismMotionQueueEntry = ite.ptr();\n\n      if (motionQueueEntry == null) {\n        ite = this._motions.erase(ite); // 削除\n        continue;\n      }\n\n      const motion: ACubismMotion = motionQueueEntry._motion;\n\n      if (motion == null) {\n        motionQueueEntry.release();\n        motionQueueEntry = null;\n        ite = this._motions.erase(ite); // 削除\n        continue;\n      }\n\n      // ----- 終了済みの処理があれば削除する ------\n      if (!motionQueueEntry.isFinished()) {\n        return false;\n      } else {\n        ite.preIncrement();\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * 指定したモーションの終了の確認\n   * @param motionQueueEntryNumber モーションの識別番号\n   * @return true 全て終了している\n   * @return false 終了していない\n   */\n  public isFinishedByHandle(\n    motionQueueEntryNumber: CubismMotionQueueEntryHandle\n  ): boolean {\n    for (\n      let ite: iterator<CubismMotionQueueEntry> = this._motions.begin();\n      ite.notEqual(this._motions.end());\n      ite.increment()\n    ) {\n      const motionQueueEntry: CubismMotionQueueEntry = ite.ptr();\n\n      if (motionQueueEntry == null) {\n        continue;\n      }\n\n      if (\n        motionQueueEntry._motionQueueEntryHandle == motionQueueEntryNumber &&\n        !motionQueueEntry.isFinished()\n      ) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * 全てのモーションを停止する\n   */\n  public stopAllMotions(): void {\n    // ------- 処理を行う -------\n    // 既にモーションがあれば終了フラグを立てる\n\n    for (\n      let ite: iterator<CubismMotionQueueEntry> = this._motions.begin();\n      ite.notEqual(this._motions.end());\n\n    ) {\n      let motionQueueEntry: CubismMotionQueueEntry = ite.ptr();\n\n      if (motionQueueEntry == null) {\n        ite = this._motions.erase(ite);\n\n        continue;\n      }\n\n      // ----- 終了済みの処理があれば削除する ------\n      motionQueueEntry.release();\n      motionQueueEntry = null;\n      ite = this._motions.erase(ite); // 削除\n    }\n  }\n\n  /**\n   * @brief CubismMotionQueueEntryの配列の取得\n   *\n   * CubismMotionQueueEntryの配列を取得する。\n   *\n   * @return  CubismMotionQueueEntryの配列へのポインタ\n   * @retval  NULL   見つからなかった\n   */\n  public getCubismMotionQueueEntries(): csmVector<CubismMotionQueueEntry> {\n    return this._motions;\n  }\n\n  /**\n   * 指定したCubismMotionQueueEntryの取得\n\n   * @param   motionQueueEntryNumber  モーションの識別番号\n   * @return  指定したCubismMotionQueueEntry\n   * @return  null   見つからなかった\n   */\n  public getCubismMotionQueueEntry(\n    motionQueueEntryNumber: any\n  ): CubismMotionQueueEntry {\n    //------- 処理を行う -------\n    for (\n      let ite: iterator<CubismMotionQueueEntry> = this._motions.begin();\n      ite.notEqual(this._motions.end());\n      ite.preIncrement()\n    ) {\n      const motionQueueEntry: CubismMotionQueueEntry = ite.ptr();\n\n      if (motionQueueEntry == null) {\n        continue;\n      }\n\n      if (motionQueueEntry._motionQueueEntryHandle == motionQueueEntryNumber) {\n        return motionQueueEntry;\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * イベントを受け取るCallbackの登録\n   *\n   * @param callback コールバック関数\n   * @param customData コールバックに返されるデータ\n   */\n  public setEventCallback(\n    callback: CubismMotionEventFunction,\n    customData: any = null\n  ): void {\n    this._eventCallBack = callback;\n    this._eventCustomData = customData;\n  }\n\n  /**\n   * モーションを更新して、モデルにパラメータ値を反映する。\n   *\n   * @param   model   対象のモデル\n   * @param   userTimeSeconds   デルタ時間の積算値[秒]\n   * @return  true    モデルへパラメータ値の反映あり\n   * @return  false   モデルへパラメータ値の反映なし(モーションの変化なし)\n   */\n  public doUpdateMotion(model: CubismModel, userTimeSeconds: number): boolean {\n    let updated = false;\n\n    // ------- 処理を行う --------\n    // 既にモーションがあれば終了フラグを立てる\n\n    for (\n      let ite: iterator<CubismMotionQueueEntry> = this._motions.begin();\n      ite.notEqual(this._motions.end());\n\n    ) {\n      let motionQueueEntry: CubismMotionQueueEntry = ite.ptr();\n\n      if (motionQueueEntry == null) {\n        ite = this._motions.erase(ite); // 削除\n        continue;\n      }\n\n      const motion: ACubismMotion = motionQueueEntry._motion;\n\n      if (motion == null) {\n        motionQueueEntry.release();\n        motionQueueEntry = null;\n        ite = this._motions.erase(ite); // 削除\n\n        continue;\n      }\n\n      // ------ 値を反映する ------\n      motion.updateParameters(model, motionQueueEntry, userTimeSeconds);\n      updated = true;\n\n      // ------ ユーザトリガーイベントを検査する ----\n      const firedList: csmVector<csmString> = motion.getFiredEvent(\n        motionQueueEntry.getLastCheckEventSeconds() -\n          motionQueueEntry.getStartTime(),\n        userTimeSeconds - motionQueueEntry.getStartTime()\n      );\n\n      for (let i = 0; i < firedList.getSize(); ++i) {\n        this._eventCallBack(this, firedList.at(i), this._eventCustomData);\n      }\n\n      motionQueueEntry.setLastCheckEventSeconds(userTimeSeconds);\n\n      // ------ 終了済みの処理があれば削除する ------\n      if (motionQueueEntry.isFinished()) {\n        motionQueueEntry.release();\n        motionQueueEntry = null;\n        ite = this._motions.erase(ite); // 削除\n      } else {\n        if (motionQueueEntry.isTriggeredFadeOut()) {\n          motionQueueEntry.startFadeOut(\n            motionQueueEntry.getFadeOutSeconds(),\n            userTimeSeconds\n          );\n        }\n        ite.preIncrement();\n      }\n    }\n\n    return updated;\n  }\n  _userTimeSeconds: number; // デルタ時間の積算値[秒]\n\n  _motions: csmVector<CubismMotionQueueEntry>; // モーション\n  _eventCallBack: CubismMotionEventFunction; // コールバック関数\n  _eventCustomData: any; // コールバックに戻されるデータ\n}\n\n/**\n * イベントのコールバック関数を定義\n *\n * イベントのコールバックに登録できる関数の型情報\n * @param caller        発火したイベントを再生させたCubismMotionQueueManager\n * @param eventValue    発火したイベントの文字列データ\n * @param customData   コールバックに返される登録時に指定されたデータ\n */\nexport interface CubismMotionEventFunction {\n  (\n    caller: CubismMotionQueueManager,\n    eventValue: csmString,\n    customData: any\n  ): void;\n}\n\n/**\n * モーションの識別番号\n *\n * モーションの識別番号の定義\n */\nexport declare type CubismMotionQueueEntryHandle = any;\nexport const InvalidMotionQueueEntryHandleValue: CubismMotionQueueEntryHandle =\n  -1;\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmotionqueuemanager';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismMotionQueueManager = $.CubismMotionQueueManager;\n  export type CubismMotionQueueManager = $.CubismMotionQueueManager;\n  export const InvalidMotionQueueEntryHandleValue =\n    $.InvalidMotionQueueEntryHandleValue;\n  export type CubismMotionQueueEntryHandle = $.CubismMotionQueueEntryHandle;\n  export type CubismMotionEventFunction = $.CubismMotionEventFunction;\n}\n","import { CubismId, CubismIdHandle } from '../id/cubismid';\nimport { LogLevel, csmDelete } from '../live2dcubismframework';\nimport { CubismModel } from '../model/cubismmodel';\nimport { csmVector, iterator } from '../type/csmvector';\nimport { ACubismMotion } from './acubismmotion';\nimport { CubismExpressionMotion } from './cubismexpressionmotion';\nimport { CubismMotionQueueEntry } from './cubismmotionqueueentry';\nimport {\n  CubismMotionQueueEntryHandle,\n  CubismMotionQueueManager\n} from './cubismmotionqueuemanager';\n\n/**\n * @brief パラメータに適用する表情の値を持たせる構造体\n */\nexport class ExpressionParameterValue {\n  parameterId: CubismIdHandle; // パラメーターID\n  additiveValue: number; // 加算値\n  multiplyValue: number; // 乗算値\n  overwriteValue: number; // 上書き値\n}\n\n/**\n * @brief 表情モーションの管理\n *\n * 表情モーションの管理をおこなうクラス。\n */\nexport class CubismExpressionMotionManager extends CubismMotionQueueManager {\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    super();\n    this._currentPriority = 0;\n    this._reservePriority = 0;\n    this._expressionParameterValues = new csmVector<ExpressionParameterValue>();\n    this._fadeWeights = new csmVector<number>();\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    if (this._expressionParameterValues) {\n      csmDelete(this._expressionParameterValues);\n      this._expressionParameterValues = null;\n    }\n\n    if (this._fadeWeights) {\n      csmDelete(this._fadeWeights);\n      this._fadeWeights = null;\n    }\n  }\n\n  /**\n   * @brief 再生中のモーションの優先度の取得\n   *\n   * 再生中のモーションの優先度を取得する。\n   *\n   * @returns モーションの優先度\n   */\n  public getCurrentPriority(): number {\n    return this._currentPriority;\n  }\n\n  /**\n   * @brief 予約中のモーションの優先度の取得\n   *\n   * 予約中のモーションの優先度を取得する。\n   *\n   * @return  モーションの優先度\n   */\n  public getReservePriority(): number {\n    return this._reservePriority;\n  }\n\n  /**\n   * @brief 再生中のモーションのウェイトを取得する。\n   *\n   * @param[in]    index    表情のインデックス\n   * @returns               表情モーションのウェイト\n   */\n  public getFadeWeight(index: number): number {\n    return this._fadeWeights.at(index);\n  }\n\n  /**\n   * @brief 予約中のモーションの優先度の設定\n   *\n   * 予約中のモーションの優先度を設定する。\n   *\n   * @param[in]   priority     優先度\n   */\n  public setReservePriority(priority: number) {\n    this._reservePriority = priority;\n  }\n\n  /**\n   * @brief 優先度を設定してモーションの開始\n   *\n   * 優先度を設定してモーションを開始する。\n   *\n   * @param[in]   motion          モーション\n   * @param[in]   autoDelete      再生が終了したモーションのインスタンスを削除するならtrue\n   * @param[in]   priority        優先度\n   * @return                      開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するIsFinished()の引数で使用する。開始できない時は「-1」\n   */\n  public startMotionPriority(\n    motion: ACubismMotion,\n    autoDelete: boolean,\n    priority: number\n  ): CubismMotionQueueEntryHandle {\n    if (priority == this.getReservePriority()) {\n      this.setReservePriority(0);\n    }\n    this._currentPriority = priority;\n\n    this._fadeWeights.pushBack(0.0);\n\n    return this.startMotion(motion, autoDelete);\n  }\n\n  /**\n   * @brief モーションの更新\n   *\n   * モーションを更新して、モデルにパラメータ値を反映する。\n   *\n   * @param[in]   model   対象のモデル\n   * @param[in]   deltaTimeSeconds    デルタ時間[秒]\n   * @retval  true    更新されている\n   * @retval  false   更新されていない\n   */\n  public updateMotion(model: CubismModel, deltaTimeSeconds: number): boolean {\n    this._userTimeSeconds += deltaTimeSeconds;\n    let updated = false;\n    const motions = this.getCubismMotionQueueEntries();\n\n    let expressionWeight = 0.0;\n    let expressionIndex = 0;\n\n    // ------- 処理を行う --------\n    // 既にモーションがあれば終了フラグを立てる\n    for (\n      let ite: iterator<CubismMotionQueueEntry> = this._motions.begin();\n      ite.notEqual(this._motions.end());\n\n    ) {\n      const motionQueueEntry = ite.ptr();\n\n      if (motionQueueEntry == null) {\n        ite = motions.erase(ite); //削除\n        continue;\n      }\n\n      const expressionMotion = <CubismExpressionMotion>(\n        motionQueueEntry.getCubismMotion()\n      );\n\n      if (expressionMotion == null) {\n        csmDelete(motionQueueEntry);\n        ite = motions.erase(ite); //削除\n        continue;\n      }\n\n      const expressionParameters = expressionMotion.getExpressionParameters();\n\n      if (motionQueueEntry.isAvailable()) {\n        // 再生中のExpressionが参照しているパラメータをすべてリストアップ\n        for (let i = 0; i < expressionParameters.getSize(); ++i) {\n          if (expressionParameters.at(i).parameterId == null) {\n            continue;\n          }\n\n          let index = -1;\n          // リストにパラメータIDが存在するか検索\n          for (let j = 0; j < this._expressionParameterValues.getSize(); ++j) {\n            if (\n              this._expressionParameterValues.at(j).parameterId !=\n              expressionParameters.at(i).parameterId\n            ) {\n              continue;\n            }\n\n            index = j;\n            break;\n          }\n\n          if (index >= 0) {\n            continue;\n          }\n\n          // パラメータがリストに存在しないなら新規追加\n          const item: ExpressionParameterValue = new ExpressionParameterValue();\n          item.parameterId = expressionParameters.at(i).parameterId;\n          item.additiveValue = CubismExpressionMotion.DefaultAdditiveValue;\n          item.multiplyValue = CubismExpressionMotion.DefaultMultiplyValue;\n          item.overwriteValue = model.getParameterValueById(item.parameterId);\n          this._expressionParameterValues.pushBack(item);\n        }\n      }\n\n      // ------ 値を計算する ------\n      expressionMotion.setupMotionQueueEntry(\n        motionQueueEntry,\n        this._userTimeSeconds\n      );\n      this._fadeWeights.set(\n        expressionIndex,\n        expressionMotion.updateFadeWeight(\n          motionQueueEntry,\n          this._userTimeSeconds\n        )\n      );\n      expressionMotion.calculateExpressionParameters(\n        model,\n        this._userTimeSeconds,\n        motionQueueEntry,\n        this._expressionParameterValues,\n        expressionIndex,\n        this._fadeWeights.at(expressionIndex)\n      );\n\n      expressionWeight +=\n        expressionMotion.getFadeInTime() == 0.0\n          ? 1.0\n          : CubismMath.getEasingSine(\n              (this._userTimeSeconds - motionQueueEntry.getFadeInStartTime()) /\n                expressionMotion.getFadeInTime()\n            );\n\n      updated = true;\n\n      if (motionQueueEntry.isTriggeredFadeOut()) {\n        // フェードアウト開始\n        motionQueueEntry.startFadeOut(\n          motionQueueEntry.getFadeOutSeconds(),\n          this._userTimeSeconds\n        );\n      }\n\n      ite.preIncrement();\n      ++expressionIndex;\n    }\n\n    // ----- 最新のExpressionのフェードが完了していればそれ以前を削除する ------\n    if (motions.getSize() > 1) {\n      const expressionMotion = <CubismExpressionMotion>(\n        motions.at(motions.getSize() - 1).getCubismMotion()\n      );\n      const latestFadeWeight: number = this._fadeWeights.at(\n        this._fadeWeights.getSize() - 1\n      );\n      if (latestFadeWeight >= 1.0) {\n        // 配列の最後の要素は削除しない\n        for (let i = motions.getSize() - 2; i >= 0; --i) {\n          const motionQueueEntry = motions.at(i);\n          csmDelete(motionQueueEntry);\n          motions.remove(i);\n          this._fadeWeights.remove(i);\n        }\n      }\n    }\n\n    if (expressionWeight > 1.0) {\n      expressionWeight = 1.0;\n    }\n\n    // モデルに各値を適用\n    for (let i = 0; i < this._expressionParameterValues.getSize(); ++i) {\n      const expressionParameterValue = this._expressionParameterValues.at(i);\n      model.setParameterValueById(\n        expressionParameterValue.parameterId,\n        (expressionParameterValue.overwriteValue +\n          expressionParameterValue.additiveValue) *\n          expressionParameterValue.multiplyValue,\n        expressionWeight\n      );\n\n      expressionParameterValue.additiveValue =\n        CubismExpressionMotion.DefaultAdditiveValue;\n      expressionParameterValue.multiplyValue =\n        CubismExpressionMotion.DefaultMultiplyValue;\n    }\n\n    return updated;\n  }\n\n  private _expressionParameterValues: csmVector<ExpressionParameterValue>; ///< モデルに適用する各パラメータの値\n  private _fadeWeights: csmVector<number>; ///< 再生中の表情のウェイト\n  private _currentPriority: number; ///< 現在再生中のモーションの優先度\n  private _reservePriority: number; ///< 再生予定のモーションの優先度。再生中は0になる。モーションファイルを別スレッドで読み込むときの機能。\n  private _startExpressionTime: number; ///< 表情の再生開始時刻\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismexpressionmotionmanager';\nimport { CubismMath } from '../math/cubismmath';\nimport { CubismDebug, CubismLogError } from '../utils/cubismdebug';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismExpressionMotionManager = $.CubismExpressionMotionManager;\n  export type CubismExpressionMotionManager = $.CubismExpressionMotionManager;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdHandle } from '../id/cubismid';\nimport { csmString } from '../type/csmstring';\nimport { csmVector } from '../type/csmvector';\n\n/**\n * @brief モーションカーブの種類\n *\n * モーションカーブの種類。\n */\nexport enum CubismMotionCurveTarget {\n  CubismMotionCurveTarget_Model, // モデルに対して\n  CubismMotionCurveTarget_Parameter, // パラメータに対して\n  CubismMotionCurveTarget_PartOpacity // パーツの不透明度に対して\n}\n\n/**\n * @brief モーションカーブのセグメントの種類\n *\n * モーションカーブのセグメントの種類。\n */\nexport enum CubismMotionSegmentType {\n  CubismMotionSegmentType_Linear = 0, // リニア\n  CubismMotionSegmentType_Bezier = 1, // ベジェ曲線\n  CubismMotionSegmentType_Stepped = 2, // ステップ\n  CubismMotionSegmentType_InverseStepped = 3 // インバースステップ\n}\n\n/**\n * @brief モーションカーブの制御点\n *\n * モーションカーブの制御点。\n */\nexport class CubismMotionPoint {\n  time = 0.0; // 時間[秒]\n  value = 0.0; // 値\n}\n\n/**\n * モーションカーブのセグメントの評価関数\n *\n * @param   points      モーションカーブの制御点リスト\n * @param   time        評価する時間[秒]\n */\nexport interface csmMotionSegmentEvaluationFunction {\n  (points: CubismMotionPoint[], time: number): number;\n}\n\n/**\n * @brief モーションカーブのセグメント\n *\n * モーションカーブのセグメント。\n */\nexport class CubismMotionSegment {\n  /**\n   * @brief コンストラクタ\n   *\n   * コンストラクタ。\n   */\n  public constructor() {\n    this.evaluate = null;\n    this.basePointIndex = 0;\n    this.segmentType = 0;\n  }\n\n  evaluate: csmMotionSegmentEvaluationFunction; // 使用する評価関数\n  basePointIndex: number; // 最初のセグメントへのインデックス\n  segmentType: number; // セグメントの種類\n}\n\n/**\n * @brief モーションカーブ\n *\n * モーションカーブ。\n */\nexport class CubismMotionCurve {\n  public constructor() {\n    this.type = CubismMotionCurveTarget.CubismMotionCurveTarget_Model;\n    this.segmentCount = 0;\n    this.baseSegmentIndex = 0;\n    this.fadeInTime = 0.0;\n    this.fadeOutTime = 0.0;\n  }\n\n  type: CubismMotionCurveTarget; // カーブの種類\n  id: CubismIdHandle; // カーブのID\n  segmentCount: number; // セグメントの個数\n  baseSegmentIndex: number; // 最初のセグメントのインデックス\n  fadeInTime: number; // フェードインにかかる時間[秒]\n  fadeOutTime: number; // フェードアウトにかかる時間[秒]\n}\n\n/**\n * イベント。\n */\nexport class CubismMotionEvent {\n  fireTime = 0.0;\n  value: csmString;\n}\n\n/**\n * @brief モーションデータ\n *\n * モーションデータ。\n */\nexport class CubismMotionData {\n  public constructor() {\n    this.duration = 0.0;\n    this.loop = false;\n    this.curveCount = 0;\n    this.eventCount = 0;\n    this.fps = 0.0;\n\n    this.curves = new csmVector<CubismMotionCurve>();\n    this.segments = new csmVector<CubismMotionSegment>();\n    this.points = new csmVector<CubismMotionPoint>();\n    this.events = new csmVector<CubismMotionEvent>();\n  }\n\n  duration: number; // モーションの長さ[秒]\n  loop: boolean; // ループするかどうか\n  curveCount: number; // カーブの個数\n  eventCount: number; // UserDataの個数\n  fps: number; // フレームレート\n  curves: csmVector<CubismMotionCurve>; // カーブのリスト\n  segments: csmVector<CubismMotionSegment>; // セグメントのリスト\n  points: csmVector<CubismMotionPoint>; // ポイントのリスト\n  events: csmVector<CubismMotionEvent>; // イベントのリスト\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmotioninternal';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismMotionCurve = $.CubismMotionCurve;\n  export type CubismMotionCurve = $.CubismMotionCurve;\n  export const CubismMotionCurveTarget = $.CubismMotionCurveTarget;\n  export type CubismMotionCurveTarget = $.CubismMotionCurveTarget;\n  export const CubismMotionData = $.CubismMotionData;\n  export type CubismMotionData = $.CubismMotionData;\n  export const CubismMotionEvent = $.CubismMotionEvent;\n  export type CubismMotionEvent = $.CubismMotionEvent;\n  export const CubismMotionPoint = $.CubismMotionPoint;\n  export type CubismMotionPoint = $.CubismMotionPoint;\n  export const CubismMotionSegment = $.CubismMotionSegment;\n  export type CubismMotionSegment = $.CubismMotionSegment;\n  export const CubismMotionSegmentType = $.CubismMotionSegmentType;\n  export type CubismMotionSegmentType = $.CubismMotionSegmentType;\n  export type csmMotionSegmentEvaluationFunction =\n    $.csmMotionSegmentEvaluationFunction;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdHandle } from '../id/cubismid';\nimport { CubismFramework } from '../live2dcubismframework';\nimport { csmString } from '../type/csmstring';\nimport { CubismJson, JsonMap } from '../utils/cubismjson';\n\n// JSON keys\nconst Meta = 'Meta';\nconst Duration = 'Duration';\nconst Loop = 'Loop';\nconst AreBeziersRestricted = 'AreBeziersRestricted';\nconst CurveCount = 'CurveCount';\nconst Fps = 'Fps';\nconst TotalSegmentCount = 'TotalSegmentCount';\nconst TotalPointCount = 'TotalPointCount';\nconst Curves = 'Curves';\nconst Target = 'Target';\nconst Id = 'Id';\nconst FadeInTime = 'FadeInTime';\nconst FadeOutTime = 'FadeOutTime';\nconst Segments = 'Segments';\nconst UserData = 'UserData';\nconst UserDataCount = 'UserDataCount';\nconst TotalUserDataSize = 'TotalUserDataSize';\nconst Time = 'Time';\nconst Value = 'Value';\n\n/**\n * motion3.jsonのコンテナ。\n */\nexport class CubismMotionJson {\n  /**\n   * コンストラクタ\n   * @param buffer motion3.jsonが読み込まれているバッファ\n   * @param size バッファのサイズ\n   */\n  public constructor(buffer: ArrayBuffer, size: number) {\n    this._json = CubismJson.create(buffer, size);\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    CubismJson.delete(this._json);\n  }\n\n  /**\n   * モーションの長さを取得する\n   * @return モーションの長さ[秒]\n   */\n  public getMotionDuration(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(Duration)\n      .toFloat();\n  }\n\n  /**\n   * モーションのループ情報の取得\n   * @return true ループする\n   * @return false ループしない\n   */\n  public isMotionLoop(): boolean {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(Loop)\n      .toBoolean();\n  }\n\n  public getEvaluationOptionFlag(flagType: EvaluationOptionFlag): boolean {\n    if (\n      EvaluationOptionFlag.EvaluationOptionFlag_AreBeziersRistricted == flagType\n    ) {\n      return this._json\n        .getRoot()\n        .getValueByString(Meta)\n        .getValueByString(AreBeziersRestricted)\n        .toBoolean();\n    }\n\n    return false;\n  }\n\n  /**\n   * モーションカーブの個数の取得\n   * @return モーションカーブの個数\n   */\n  public getMotionCurveCount(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(CurveCount)\n      .toInt();\n  }\n\n  /**\n   * モーションのフレームレートの取得\n   * @return フレームレート[FPS]\n   */\n  public getMotionFps(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(Fps)\n      .toFloat();\n  }\n\n  /**\n   * モーションのセグメントの総合計の取得\n   * @return モーションのセグメントの取得\n   */\n  public getMotionTotalSegmentCount(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(TotalSegmentCount)\n      .toInt();\n  }\n\n  /**\n   * モーションのカーブの制御店の総合計の取得\n   * @return モーションのカーブの制御点の総合計\n   */\n  public getMotionTotalPointCount(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(TotalPointCount)\n      .toInt();\n  }\n\n  /**\n   * モーションのフェードイン時間の存在\n   * @return true 存在する\n   * @return false 存在しない\n   */\n  public isExistMotionFadeInTime(): boolean {\n    return !this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(FadeInTime)\n      .isNull();\n  }\n\n  /**\n   * モーションのフェードアウト時間の存在\n   * @return true 存在する\n   * @return false 存在しない\n   */\n  public isExistMotionFadeOutTime(): boolean {\n    return !this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(FadeOutTime)\n      .isNull();\n  }\n\n  /**\n   * モーションのフェードイン時間の取得\n   * @return フェードイン時間[秒]\n   */\n  public getMotionFadeInTime(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(FadeInTime)\n      .toFloat();\n  }\n\n  /**\n   * モーションのフェードアウト時間の取得\n   * @return フェードアウト時間[秒]\n   */\n  public getMotionFadeOutTime(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(FadeOutTime)\n      .toFloat();\n  }\n\n  /**\n   * モーションのカーブの種類の取得\n   * @param curveIndex カーブのインデックス\n   * @return カーブの種類\n   */\n  public getMotionCurveTarget(curveIndex: number): string {\n    return this._json\n      .getRoot()\n      .getValueByString(Curves)\n      .getValueByIndex(curveIndex)\n      .getValueByString(Target)\n      .getRawString();\n  }\n\n  /**\n   * モーションのカーブのIDの取得\n   * @param curveIndex カーブのインデックス\n   * @return カーブのID\n   */\n  public getMotionCurveId(curveIndex: number): CubismIdHandle {\n    return CubismFramework.getIdManager().getId(\n      this._json\n        .getRoot()\n        .getValueByString(Curves)\n        .getValueByIndex(curveIndex)\n        .getValueByString(Id)\n        .getRawString()\n    );\n  }\n\n  /**\n   * モーションのカーブのフェードイン時間の存在\n   * @param curveIndex カーブのインデックス\n   * @return true 存在する\n   * @return false 存在しない\n   */\n  public isExistMotionCurveFadeInTime(curveIndex: number): boolean {\n    return !this._json\n      .getRoot()\n      .getValueByString(Curves)\n      .getValueByIndex(curveIndex)\n      .getValueByString(FadeInTime)\n      .isNull();\n  }\n\n  /**\n   * モーションのカーブのフェードアウト時間の存在\n   * @param curveIndex カーブのインデックス\n   * @return true 存在する\n   * @return false 存在しない\n   */\n  public isExistMotionCurveFadeOutTime(curveIndex: number): boolean {\n    return !this._json\n      .getRoot()\n      .getValueByString(Curves)\n      .getValueByIndex(curveIndex)\n      .getValueByString(FadeOutTime)\n      .isNull();\n  }\n\n  /**\n   * モーションのカーブのフェードイン時間の取得\n   * @param curveIndex カーブのインデックス\n   * @return フェードイン時間[秒]\n   */\n  public getMotionCurveFadeInTime(curveIndex: number): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Curves)\n      .getValueByIndex(curveIndex)\n      .getValueByString(FadeInTime)\n      .toFloat();\n  }\n\n  /**\n   * モーションのカーブのフェードアウト時間の取得\n   * @param curveIndex カーブのインデックス\n   * @return フェードアウト時間[秒]\n   */\n  public getMotionCurveFadeOutTime(curveIndex: number): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Curves)\n      .getValueByIndex(curveIndex)\n      .getValueByString(FadeOutTime)\n      .toFloat();\n  }\n\n  /**\n   * モーションのカーブのセグメントの個数を取得する\n   * @param curveIndex カーブのインデックス\n   * @return モーションのカーブのセグメントの個数\n   */\n  public getMotionCurveSegmentCount(curveIndex: number): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Curves)\n      .getValueByIndex(curveIndex)\n      .getValueByString(Segments)\n      .getVector()\n      .getSize();\n  }\n\n  /**\n   * モーションのカーブのセグメントの値の取得\n   * @param curveIndex カーブのインデックス\n   * @param segmentIndex セグメントのインデックス\n   * @return セグメントの値\n   */\n  public getMotionCurveSegment(\n    curveIndex: number,\n    segmentIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Curves)\n      .getValueByIndex(curveIndex)\n      .getValueByString(Segments)\n      .getValueByIndex(segmentIndex)\n      .toFloat();\n  }\n\n  /**\n   * イベントの個数の取得\n   * @return イベントの個数\n   */\n  public getEventCount(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(UserDataCount)\n      .toInt();\n  }\n\n  /**\n   *  イベントの総文字数の取得\n   * @return イベントの総文字数\n   */\n  public getTotalEventValueSize(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(TotalUserDataSize)\n      .toInt();\n  }\n\n  /**\n   * イベントの時間の取得\n   * @param userDataIndex イベントのインデックス\n   * @return イベントの時間[秒]\n   */\n  public getEventTime(userDataIndex: number): number {\n    return this._json\n      .getRoot()\n      .getValueByString(UserData)\n      .getValueByIndex(userDataIndex)\n      .getValueByString(Time)\n      .toFloat();\n  }\n\n  /**\n   * イベントの取得\n   * @param userDataIndex イベントのインデックス\n   * @return イベントの文字列\n   */\n  public getEventValue(userDataIndex: number): csmString {\n    return new csmString(\n      this._json\n        .getRoot()\n        .getValueByString(UserData)\n        .getValueByIndex(userDataIndex)\n        .getValueByString(Value)\n        .getRawString()\n    );\n  }\n\n  _json: CubismJson; // motion3.jsonのデータ\n}\n\n/**\n * @brief ベジェカーブの解釈方法のフラグタイプ\n */\nexport enum EvaluationOptionFlag {\n  EvaluationOptionFlag_AreBeziersRistricted = 0 ///< ベジェハンドルの規制状態\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmotionjson';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismMotionJson = $.CubismMotionJson;\n  export type CubismMotionJson = $.CubismMotionJson;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdHandle } from '../id/cubismid';\nimport { CubismFramework } from '../live2dcubismframework';\nimport { CubismMath } from '../math/cubismmath';\nimport { CubismModel } from '../model/cubismmodel';\nimport { csmString } from '../type/csmstring';\nimport { csmVector } from '../type/csmvector';\nimport {\n  CSM_ASSERT,\n  CubismLogDebug,\n  CubismLogWarning\n} from '../utils/cubismdebug';\nimport { ACubismMotion, FinishedMotionCallback } from './acubismmotion';\nimport {\n  CubismMotionCurve,\n  CubismMotionCurveTarget,\n  CubismMotionData,\n  CubismMotionEvent,\n  CubismMotionPoint,\n  CubismMotionSegment,\n  CubismMotionSegmentType\n} from './cubismmotioninternal';\nimport { CubismMotionJson, EvaluationOptionFlag } from './cubismmotionjson';\nimport { CubismMotionQueueEntry } from './cubismmotionqueueentry';\n\nconst EffectNameEyeBlink = 'EyeBlink';\nconst EffectNameLipSync = 'LipSync';\nconst TargetNameModel = 'Model';\nconst TargetNameParameter = 'Parameter';\nconst TargetNamePartOpacity = 'PartOpacity';\n\n// Id\nconst IdNameOpacity = 'Opacity';\n\n/**\n * Cubism SDK R2 以前のモーションを再現させるなら true 、アニメータのモーションを正しく再現するなら false 。\n */\nconst UseOldBeziersCurveMotion = false;\n\nfunction lerpPoints(\n  a: CubismMotionPoint,\n  b: CubismMotionPoint,\n  t: number\n): CubismMotionPoint {\n  const result: CubismMotionPoint = new CubismMotionPoint();\n\n  result.time = a.time + (b.time - a.time) * t;\n  result.value = a.value + (b.value - a.value) * t;\n\n  return result;\n}\n\nfunction linearEvaluate(points: CubismMotionPoint[], time: number): number {\n  let t: number = (time - points[0].time) / (points[1].time - points[0].time);\n\n  if (t < 0.0) {\n    t = 0.0;\n  }\n\n  return points[0].value + (points[1].value - points[0].value) * t;\n}\n\nfunction bezierEvaluate(points: CubismMotionPoint[], time: number): number {\n  let t: number = (time - points[0].time) / (points[3].time - points[0].time);\n\n  if (t < 0.0) {\n    t = 0.0;\n  }\n\n  const p01: CubismMotionPoint = lerpPoints(points[0], points[1], t);\n  const p12: CubismMotionPoint = lerpPoints(points[1], points[2], t);\n  const p23: CubismMotionPoint = lerpPoints(points[2], points[3], t);\n\n  const p012: CubismMotionPoint = lerpPoints(p01, p12, t);\n  const p123: CubismMotionPoint = lerpPoints(p12, p23, t);\n\n  return lerpPoints(p012, p123, t).value;\n}\n\nfunction bezierEvaluateBinarySearch(\n  points: CubismMotionPoint[],\n  time: number\n): number {\n  const xError = 0.01;\n\n  const x: number = time;\n  let x1: number = points[0].time;\n  let x2: number = points[3].time;\n  let cx1: number = points[1].time;\n  let cx2: number = points[2].time;\n\n  let ta = 0.0;\n  let tb = 1.0;\n  let t = 0.0;\n  let i = 0;\n\n  for (let var33 = true; i < 20; ++i) {\n    if (x < x1 + xError) {\n      t = ta;\n      break;\n    }\n\n    if (x2 - xError < x) {\n      t = tb;\n      break;\n    }\n\n    let centerx: number = (cx1 + cx2) * 0.5;\n    cx1 = (x1 + cx1) * 0.5;\n    cx2 = (x2 + cx2) * 0.5;\n    const ctrlx12: number = (cx1 + centerx) * 0.5;\n    const ctrlx21: number = (cx2 + centerx) * 0.5;\n    centerx = (ctrlx12 + ctrlx21) * 0.5;\n    if (x < centerx) {\n      tb = (ta + tb) * 0.5;\n      if (centerx - xError < x) {\n        t = tb;\n        break;\n      }\n\n      x2 = centerx;\n      cx2 = ctrlx12;\n    } else {\n      ta = (ta + tb) * 0.5;\n      if (x < centerx + xError) {\n        t = ta;\n        break;\n      }\n\n      x1 = centerx;\n      cx1 = ctrlx21;\n    }\n  }\n\n  if (i == 20) {\n    t = (ta + tb) * 0.5;\n  }\n\n  if (t < 0.0) {\n    t = 0.0;\n  }\n  if (t > 1.0) {\n    t = 1.0;\n  }\n\n  const p01: CubismMotionPoint = lerpPoints(points[0], points[1], t);\n  const p12: CubismMotionPoint = lerpPoints(points[1], points[2], t);\n  const p23: CubismMotionPoint = lerpPoints(points[2], points[3], t);\n\n  const p012: CubismMotionPoint = lerpPoints(p01, p12, t);\n  const p123: CubismMotionPoint = lerpPoints(p12, p23, t);\n\n  return lerpPoints(p012, p123, t).value;\n}\n\nfunction bezierEvaluateCardanoInterpretation(\n  points: CubismMotionPoint[],\n  time: number\n): number {\n  const x: number = time;\n  const x1: number = points[0].time;\n  const x2: number = points[3].time;\n  const cx1: number = points[1].time;\n  const cx2: number = points[2].time;\n\n  const a: number = x2 - 3.0 * cx2 + 3.0 * cx1 - x1;\n  const b: number = 3.0 * cx2 - 6.0 * cx1 + 3.0 * x1;\n  const c: number = 3.0 * cx1 - 3.0 * x1;\n  const d: number = x1 - x;\n\n  const t: number = CubismMath.cardanoAlgorithmForBezier(a, b, c, d);\n\n  const p01: CubismMotionPoint = lerpPoints(points[0], points[1], t);\n  const p12: CubismMotionPoint = lerpPoints(points[1], points[2], t);\n  const p23: CubismMotionPoint = lerpPoints(points[2], points[3], t);\n\n  const p012: CubismMotionPoint = lerpPoints(p01, p12, t);\n  const p123: CubismMotionPoint = lerpPoints(p12, p23, t);\n\n  return lerpPoints(p012, p123, t).value;\n}\n\nfunction steppedEvaluate(points: CubismMotionPoint[], time: number): number {\n  return points[0].value;\n}\n\nfunction inverseSteppedEvaluate(\n  points: CubismMotionPoint[],\n  time: number\n): number {\n  return points[1].value;\n}\n\nfunction evaluateCurve(\n  motionData: CubismMotionData,\n  index: number,\n  time: number\n): number {\n  // Find segment to evaluate.\n  const curve: CubismMotionCurve = motionData.curves.at(index);\n\n  let target = -1;\n  const totalSegmentCount: number = curve.baseSegmentIndex + curve.segmentCount;\n  let pointPosition = 0;\n  for (let i: number = curve.baseSegmentIndex; i < totalSegmentCount; ++i) {\n    // Get first point of next segment.\n    pointPosition =\n      motionData.segments.at(i).basePointIndex +\n      ((motionData.segments.at(i).segmentType as CubismMotionSegmentType) ==\n      CubismMotionSegmentType.CubismMotionSegmentType_Bezier\n        ? 3\n        : 1);\n\n    // Break if time lies within current segment.\n    if (motionData.points.at(pointPosition).time > time) {\n      target = i;\n      break;\n    }\n  }\n\n  if (target == -1) {\n    return motionData.points.at(pointPosition).value;\n  }\n\n  const segment: CubismMotionSegment = motionData.segments.at(target);\n\n  return segment.evaluate(motionData.points.get(segment.basePointIndex), time);\n}\n\n/**\n * モーションクラス\n *\n * モーションのクラス。\n */\nexport class CubismMotion extends ACubismMotion {\n  /**\n   * インスタンスを作成する\n   *\n   * @param buffer motion3.jsonが読み込まれているバッファ\n   * @param size バッファのサイズ\n   * @param onFinishedMotionHandler モーション再生終了時に呼び出されるコールバック関数\n   * @return 作成されたインスタンス\n   */\n  public static create(\n    buffer: ArrayBuffer,\n    size: number,\n    onFinishedMotionHandler?: FinishedMotionCallback\n  ): CubismMotion {\n    const ret = new CubismMotion();\n\n    ret.parse(buffer, size);\n    ret._sourceFrameRate = ret._motionData.fps;\n    ret._loopDurationSeconds = ret._motionData.duration;\n    ret._onFinishedMotion = onFinishedMotionHandler;\n\n    // NOTE: Editorではループありのモーション書き出しは非対応\n    // ret->_loop = (ret->_motionData->Loop > 0);\n    return ret;\n  }\n\n  /**\n   * モデルのパラメータの更新の実行\n   * @param model             対象のモデル\n   * @param userTimeSeconds   現在の時刻[秒]\n   * @param fadeWeight        モーションの重み\n   * @param motionQueueEntry  CubismMotionQueueManagerで管理されているモーション\n   */\n  public doUpdateParameters(\n    model: CubismModel,\n    userTimeSeconds: number,\n    fadeWeight: number,\n    motionQueueEntry: CubismMotionQueueEntry\n  ): void {\n    if (this._modelCurveIdEyeBlink == null) {\n      this._modelCurveIdEyeBlink =\n        CubismFramework.getIdManager().getId(EffectNameEyeBlink);\n    }\n\n    if (this._modelCurveIdLipSync == null) {\n      this._modelCurveIdLipSync =\n        CubismFramework.getIdManager().getId(EffectNameLipSync);\n    }\n\n    if (this._modelCurveIdOpacity == null) {\n      this._modelCurveIdOpacity =\n        CubismFramework.getIdManager().getId(IdNameOpacity);\n    }\n\n    let timeOffsetSeconds: number =\n      userTimeSeconds - motionQueueEntry.getStartTime();\n\n    if (timeOffsetSeconds < 0.0) {\n      timeOffsetSeconds = 0.0; // エラー回避\n    }\n\n    let lipSyncValue: number = Number.MAX_VALUE;\n    let eyeBlinkValue: number = Number.MAX_VALUE;\n\n    //まばたき、リップシンクのうちモーションの適用を検出するためのビット（maxFlagCount個まで\n    const maxTargetSize = 64;\n    let lipSyncFlags = 0;\n    let eyeBlinkFlags = 0;\n\n    //瞬き、リップシンクのターゲット数が上限を超えている場合\n    if (this._eyeBlinkParameterIds.getSize() > maxTargetSize) {\n      CubismLogDebug(\n        'too many eye blink targets : {0}',\n        this._eyeBlinkParameterIds.getSize()\n      );\n    }\n    if (this._lipSyncParameterIds.getSize() > maxTargetSize) {\n      CubismLogDebug(\n        'too many lip sync targets : {0}',\n        this._lipSyncParameterIds.getSize()\n      );\n    }\n\n    const tmpFadeIn: number =\n      this._fadeInSeconds <= 0.0\n        ? 1.0\n        : CubismMath.getEasingSine(\n            (userTimeSeconds - motionQueueEntry.getFadeInStartTime()) /\n              this._fadeInSeconds\n          );\n\n    const tmpFadeOut: number =\n      this._fadeOutSeconds <= 0.0 || motionQueueEntry.getEndTime() < 0.0\n        ? 1.0\n        : CubismMath.getEasingSine(\n            (motionQueueEntry.getEndTime() - userTimeSeconds) /\n              this._fadeOutSeconds\n          );\n    let value: number;\n    let c: number, parameterIndex: number;\n\n    // 'Repeat' time as necessary.\n    let time: number = timeOffsetSeconds;\n\n    if (this._isLoop) {\n      while (time > this._motionData.duration) {\n        time -= this._motionData.duration;\n      }\n    }\n\n    const curves: csmVector<CubismMotionCurve> = this._motionData.curves;\n\n    // Evaluate model curves.\n    for (\n      c = 0;\n      c < this._motionData.curveCount &&\n      curves.at(c).type ==\n        CubismMotionCurveTarget.CubismMotionCurveTarget_Model;\n      ++c\n    ) {\n      // Evaluate curve and call handler.\n      value = evaluateCurve(this._motionData, c, time);\n\n      if (curves.at(c).id == this._modelCurveIdEyeBlink) {\n        eyeBlinkValue = value;\n      } else if (curves.at(c).id == this._modelCurveIdLipSync) {\n        lipSyncValue = value;\n      } else if (curves.at(c).id == this._modelCurveIdOpacity) {\n        this._modelOpacity = value;\n        model.setModelOapcity(this.getModelOpacityValue());\n      }\n    }\n\n    let parameterMotionCurveCount = 0;\n\n    for (\n      ;\n      c < this._motionData.curveCount &&\n      curves.at(c).type ==\n        CubismMotionCurveTarget.CubismMotionCurveTarget_Parameter;\n      ++c\n    ) {\n      parameterMotionCurveCount++;\n\n      // Find parameter index.\n      parameterIndex = model.getParameterIndex(curves.at(c).id);\n\n      // Skip curve evaluation if no value in sink.\n      if (parameterIndex == -1) {\n        continue;\n      }\n\n      const sourceValue: number =\n        model.getParameterValueByIndex(parameterIndex);\n\n      // Evaluate curve and apply value.\n      value = evaluateCurve(this._motionData, c, time);\n\n      if (eyeBlinkValue != Number.MAX_VALUE) {\n        for (\n          let i = 0;\n          i < this._eyeBlinkParameterIds.getSize() && i < maxTargetSize;\n          ++i\n        ) {\n          if (this._eyeBlinkParameterIds.at(i) == curves.at(c).id) {\n            value *= eyeBlinkValue;\n            eyeBlinkFlags |= 1 << i;\n            break;\n          }\n        }\n      }\n\n      if (lipSyncValue != Number.MAX_VALUE) {\n        for (\n          let i = 0;\n          i < this._lipSyncParameterIds.getSize() && i < maxTargetSize;\n          ++i\n        ) {\n          if (this._lipSyncParameterIds.at(i) == curves.at(c).id) {\n            value += lipSyncValue;\n            lipSyncFlags |= 1 << i;\n            break;\n          }\n        }\n      }\n\n      let v: number;\n\n      // パラメータごとのフェード\n      if (curves.at(c).fadeInTime < 0.0 && curves.at(c).fadeOutTime < 0.0) {\n        // モーションのフェードを適用\n        v = sourceValue + (value - sourceValue) * fadeWeight;\n      } else {\n        // パラメータに対してフェードインかフェードアウトが設定してある場合はそちらを適用\n        let fin: number;\n        let fout: number;\n\n        if (curves.at(c).fadeInTime < 0.0) {\n          fin = tmpFadeIn;\n        } else {\n          fin =\n            curves.at(c).fadeInTime == 0.0\n              ? 1.0\n              : CubismMath.getEasingSine(\n                  (userTimeSeconds - motionQueueEntry.getFadeInStartTime()) /\n                    curves.at(c).fadeInTime\n                );\n        }\n\n        if (curves.at(c).fadeOutTime < 0.0) {\n          fout = tmpFadeOut;\n        } else {\n          fout =\n            curves.at(c).fadeOutTime == 0.0 ||\n            motionQueueEntry.getEndTime() < 0.0\n              ? 1.0\n              : CubismMath.getEasingSine(\n                  (motionQueueEntry.getEndTime() - userTimeSeconds) /\n                    curves.at(c).fadeOutTime\n                );\n        }\n\n        const paramWeight: number = this._weight * fin * fout;\n\n        // パラメータごとのフェードを適用\n        v = sourceValue + (value - sourceValue) * paramWeight;\n      }\n\n      model.setParameterValueByIndex(parameterIndex, v, 1.0);\n    }\n\n    {\n      if (eyeBlinkValue != Number.MAX_VALUE) {\n        for (\n          let i = 0;\n          i < this._eyeBlinkParameterIds.getSize() && i < maxTargetSize;\n          ++i\n        ) {\n          const sourceValue: number = model.getParameterValueById(\n            this._eyeBlinkParameterIds.at(i)\n          );\n\n          // モーションでの上書きがあった時にはまばたきは適用しない\n          if ((eyeBlinkFlags >> i) & 0x01) {\n            continue;\n          }\n\n          const v: number =\n            sourceValue + (eyeBlinkValue - sourceValue) * fadeWeight;\n\n          model.setParameterValueById(this._eyeBlinkParameterIds.at(i), v);\n        }\n      }\n\n      if (lipSyncValue != Number.MAX_VALUE) {\n        for (\n          let i = 0;\n          i < this._lipSyncParameterIds.getSize() && i < maxTargetSize;\n          ++i\n        ) {\n          const sourceValue: number = model.getParameterValueById(\n            this._lipSyncParameterIds.at(i)\n          );\n\n          // モーションでの上書きがあった時にはリップシンクは適用しない\n          if ((lipSyncFlags >> i) & 0x01) {\n            continue;\n          }\n\n          const v: number =\n            sourceValue + (lipSyncValue - sourceValue) * fadeWeight;\n\n          model.setParameterValueById(this._lipSyncParameterIds.at(i), v);\n        }\n      }\n    }\n\n    for (\n      ;\n      c < this._motionData.curveCount &&\n      curves.at(c).type ==\n        CubismMotionCurveTarget.CubismMotionCurveTarget_PartOpacity;\n      ++c\n    ) {\n      // Find parameter index.\n      parameterIndex = model.getParameterIndex(curves.at(c).id);\n\n      // Skip curve evaluation if no value in sink.\n      if (parameterIndex == -1) {\n        continue;\n      }\n\n      // Evaluate curve and apply value.\n      value = evaluateCurve(this._motionData, c, time);\n\n      model.setParameterValueByIndex(parameterIndex, value);\n    }\n\n    if (timeOffsetSeconds >= this._motionData.duration) {\n      if (this._isLoop) {\n        motionQueueEntry.setStartTime(userTimeSeconds); // 最初の状態へ\n        if (this._isLoopFadeIn) {\n          // ループ内でループ用フェードインが有効の時は、フェードイン設定し直し\n          motionQueueEntry.setFadeInStartTime(userTimeSeconds);\n        }\n      } else {\n        if (this._onFinishedMotion) {\n          this._onFinishedMotion(this);\n        }\n\n        motionQueueEntry.setIsFinished(true);\n      }\n    }\n    this._lastWeight = fadeWeight;\n  }\n\n  /**\n   * ループ情報の設定\n   * @param loop ループ情報\n   */\n  public setIsLoop(loop: boolean): void {\n    this._isLoop = loop;\n  }\n\n  /**\n   * ループ情報の取得\n   * @return true ループする\n   * @return false ループしない\n   */\n  public isLoop(): boolean {\n    return this._isLoop;\n  }\n\n  /**\n   * ループ時のフェードイン情報の設定\n   * @param loopFadeIn  ループ時のフェードイン情報\n   */\n  public setIsLoopFadeIn(loopFadeIn: boolean): void {\n    this._isLoopFadeIn = loopFadeIn;\n  }\n\n  /**\n   * ループ時のフェードイン情報の取得\n   *\n   * @return  true    する\n   * @return  false   しない\n   */\n  public isLoopFadeIn(): boolean {\n    return this._isLoopFadeIn;\n  }\n\n  /**\n   * モーションの長さを取得する。\n   *\n   * @return  モーションの長さ[秒]\n   */\n  public getDuration(): number {\n    return this._isLoop ? -1.0 : this._loopDurationSeconds;\n  }\n\n  /**\n   * モーションのループ時の長さを取得する。\n   *\n   * @return  モーションのループ時の長さ[秒]\n   */\n  public getLoopDuration(): number {\n    return this._loopDurationSeconds;\n  }\n\n  /**\n   * パラメータに対するフェードインの時間を設定する。\n   *\n   * @param parameterId     パラメータID\n   * @param value           フェードインにかかる時間[秒]\n   */\n  public setParameterFadeInTime(\n    parameterId: CubismIdHandle,\n    value: number\n  ): void {\n    const curves: csmVector<CubismMotionCurve> = this._motionData.curves;\n\n    for (let i = 0; i < this._motionData.curveCount; ++i) {\n      if (parameterId == curves.at(i).id) {\n        curves.at(i).fadeInTime = value;\n        return;\n      }\n    }\n  }\n\n  /**\n   * パラメータに対するフェードアウトの時間の設定\n   * @param parameterId     パラメータID\n   * @param value           フェードアウトにかかる時間[秒]\n   */\n  public setParameterFadeOutTime(\n    parameterId: CubismIdHandle,\n    value: number\n  ): void {\n    const curves: csmVector<CubismMotionCurve> = this._motionData.curves;\n\n    for (let i = 0; i < this._motionData.curveCount; ++i) {\n      if (parameterId == curves.at(i).id) {\n        curves.at(i).fadeOutTime = value;\n        return;\n      }\n    }\n  }\n\n  /**\n   * パラメータに対するフェードインの時間の取得\n   * @param    parameterId     パラメータID\n   * @return   フェードインにかかる時間[秒]\n   */\n  public getParameterFadeInTime(parameterId: CubismIdHandle): number {\n    const curves: csmVector<CubismMotionCurve> = this._motionData.curves;\n\n    for (let i = 0; i < this._motionData.curveCount; ++i) {\n      if (parameterId == curves.at(i).id) {\n        return curves.at(i).fadeInTime;\n      }\n    }\n\n    return -1;\n  }\n\n  /**\n   * パラメータに対するフェードアウトの時間を取得\n   *\n   * @param   parameterId     パラメータID\n   * @return   フェードアウトにかかる時間[秒]\n   */\n  public getParameterFadeOutTime(parameterId: CubismIdHandle): number {\n    const curves: csmVector<CubismMotionCurve> = this._motionData.curves;\n\n    for (let i = 0; i < this._motionData.curveCount; ++i) {\n      if (parameterId == curves.at(i).id) {\n        return curves.at(i).fadeOutTime;\n      }\n    }\n\n    return -1;\n  }\n\n  /**\n   * 自動エフェクトがかかっているパラメータIDリストの設定\n   * @param eyeBlinkParameterIds    自動まばたきがかかっているパラメータIDのリスト\n   * @param lipSyncParameterIds     リップシンクがかかっているパラメータIDのリスト\n   */\n  public setEffectIds(\n    eyeBlinkParameterIds: csmVector<CubismIdHandle>,\n    lipSyncParameterIds: csmVector<CubismIdHandle>\n  ): void {\n    this._eyeBlinkParameterIds = eyeBlinkParameterIds;\n    this._lipSyncParameterIds = lipSyncParameterIds;\n  }\n\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    super();\n    this._sourceFrameRate = 30.0;\n    this._loopDurationSeconds = -1.0;\n    this._isLoop = false; // trueから false へデフォルトを変更\n    this._isLoopFadeIn = true; // ループ時にフェードインが有効かどうかのフラグ\n    this._lastWeight = 0.0;\n    this._motionData = null;\n    this._modelCurveIdEyeBlink = null;\n    this._modelCurveIdLipSync = null;\n    this._modelCurveIdOpacity = null;\n    this._eyeBlinkParameterIds = null;\n    this._lipSyncParameterIds = null;\n    this._modelOpacity = 1.0;\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    this._motionData = void 0;\n    this._motionData = null;\n  }\n\n  /**\n   * motion3.jsonをパースする。\n   *\n   * @param motionJson  motion3.jsonが読み込まれているバッファ\n   * @param size        バッファのサイズ\n   */\n  public parse(motionJson: ArrayBuffer, size: number): void {\n    this._motionData = new CubismMotionData();\n\n    let json: CubismMotionJson = new CubismMotionJson(motionJson, size);\n\n    if (!json) {\n      json.release();\n      json = void 0;\n      return;\n    }\n\n    this._motionData.duration = json.getMotionDuration();\n    this._motionData.loop = json.isMotionLoop();\n    this._motionData.curveCount = json.getMotionCurveCount();\n    this._motionData.fps = json.getMotionFps();\n    this._motionData.eventCount = json.getEventCount();\n\n    const areBeziersRestructed: boolean = json.getEvaluationOptionFlag(\n      EvaluationOptionFlag.EvaluationOptionFlag_AreBeziersRistricted\n    );\n\n    if (json.isExistMotionFadeInTime()) {\n      this._fadeInSeconds =\n        json.getMotionFadeInTime() < 0.0 ? 1.0 : json.getMotionFadeInTime();\n    } else {\n      this._fadeInSeconds = 1.0;\n    }\n\n    if (json.isExistMotionFadeOutTime()) {\n      this._fadeOutSeconds =\n        json.getMotionFadeOutTime() < 0.0 ? 1.0 : json.getMotionFadeOutTime();\n    } else {\n      this._fadeOutSeconds = 1.0;\n    }\n\n    this._motionData.curves.updateSize(\n      this._motionData.curveCount,\n      CubismMotionCurve,\n      true\n    );\n    this._motionData.segments.updateSize(\n      json.getMotionTotalSegmentCount(),\n      CubismMotionSegment,\n      true\n    );\n    this._motionData.points.updateSize(\n      json.getMotionTotalPointCount(),\n      CubismMotionPoint,\n      true\n    );\n    this._motionData.events.updateSize(\n      this._motionData.eventCount,\n      CubismMotionEvent,\n      true\n    );\n\n    let totalPointCount = 0;\n    let totalSegmentCount = 0;\n\n    // Curves\n    for (\n      let curveCount = 0;\n      curveCount < this._motionData.curveCount;\n      ++curveCount\n    ) {\n      if (json.getMotionCurveTarget(curveCount) == TargetNameModel) {\n        this._motionData.curves.at(curveCount).type =\n          CubismMotionCurveTarget.CubismMotionCurveTarget_Model;\n      } else if (json.getMotionCurveTarget(curveCount) == TargetNameParameter) {\n        this._motionData.curves.at(curveCount).type =\n          CubismMotionCurveTarget.CubismMotionCurveTarget_Parameter;\n      } else if (\n        json.getMotionCurveTarget(curveCount) == TargetNamePartOpacity\n      ) {\n        this._motionData.curves.at(curveCount).type =\n          CubismMotionCurveTarget.CubismMotionCurveTarget_PartOpacity;\n      } else {\n        CubismLogWarning(\n          'Warning : Unable to get segment type from Curve! The number of \"CurveCount\" may be incorrect!'\n        );\n      }\n\n      this._motionData.curves.at(curveCount).id =\n        json.getMotionCurveId(curveCount);\n\n      this._motionData.curves.at(curveCount).baseSegmentIndex =\n        totalSegmentCount;\n\n      this._motionData.curves.at(curveCount).fadeInTime =\n        json.isExistMotionCurveFadeInTime(curveCount)\n          ? json.getMotionCurveFadeInTime(curveCount)\n          : -1.0;\n      this._motionData.curves.at(curveCount).fadeOutTime =\n        json.isExistMotionCurveFadeOutTime(curveCount)\n          ? json.getMotionCurveFadeOutTime(curveCount)\n          : -1.0;\n\n      // Segments\n      for (\n        let segmentPosition = 0;\n        segmentPosition < json.getMotionCurveSegmentCount(curveCount);\n\n      ) {\n        if (segmentPosition == 0) {\n          this._motionData.segments.at(totalSegmentCount).basePointIndex =\n            totalPointCount;\n\n          this._motionData.points.at(totalPointCount).time =\n            json.getMotionCurveSegment(curveCount, segmentPosition);\n          this._motionData.points.at(totalPointCount).value =\n            json.getMotionCurveSegment(curveCount, segmentPosition + 1);\n\n          totalPointCount += 1;\n          segmentPosition += 2;\n        } else {\n          this._motionData.segments.at(totalSegmentCount).basePointIndex =\n            totalPointCount - 1;\n        }\n\n        const segment: number = json.getMotionCurveSegment(\n          curveCount,\n          segmentPosition\n        );\n\n        const segmentType: CubismMotionSegmentType = segment;\n        switch (segmentType) {\n          case CubismMotionSegmentType.CubismMotionSegmentType_Linear: {\n            this._motionData.segments.at(totalSegmentCount).segmentType =\n              CubismMotionSegmentType.CubismMotionSegmentType_Linear;\n            this._motionData.segments.at(totalSegmentCount).evaluate =\n              linearEvaluate;\n\n            this._motionData.points.at(totalPointCount).time =\n              json.getMotionCurveSegment(curveCount, segmentPosition + 1);\n            this._motionData.points.at(totalPointCount).value =\n              json.getMotionCurveSegment(curveCount, segmentPosition + 2);\n\n            totalPointCount += 1;\n            segmentPosition += 3;\n\n            break;\n          }\n          case CubismMotionSegmentType.CubismMotionSegmentType_Bezier: {\n            this._motionData.segments.at(totalSegmentCount).segmentType =\n              CubismMotionSegmentType.CubismMotionSegmentType_Bezier;\n\n            if (areBeziersRestructed || UseOldBeziersCurveMotion) {\n              this._motionData.segments.at(totalSegmentCount).evaluate =\n                bezierEvaluate;\n            } else {\n              this._motionData.segments.at(totalSegmentCount).evaluate =\n                bezierEvaluateCardanoInterpretation;\n            }\n\n            this._motionData.points.at(totalPointCount).time =\n              json.getMotionCurveSegment(curveCount, segmentPosition + 1);\n            this._motionData.points.at(totalPointCount).value =\n              json.getMotionCurveSegment(curveCount, segmentPosition + 2);\n\n            this._motionData.points.at(totalPointCount + 1).time =\n              json.getMotionCurveSegment(curveCount, segmentPosition + 3);\n            this._motionData.points.at(totalPointCount + 1).value =\n              json.getMotionCurveSegment(curveCount, segmentPosition + 4);\n\n            this._motionData.points.at(totalPointCount + 2).time =\n              json.getMotionCurveSegment(curveCount, segmentPosition + 5);\n            this._motionData.points.at(totalPointCount + 2).value =\n              json.getMotionCurveSegment(curveCount, segmentPosition + 6);\n\n            totalPointCount += 3;\n            segmentPosition += 7;\n\n            break;\n          }\n\n          case CubismMotionSegmentType.CubismMotionSegmentType_Stepped: {\n            this._motionData.segments.at(totalSegmentCount).segmentType =\n              CubismMotionSegmentType.CubismMotionSegmentType_Stepped;\n            this._motionData.segments.at(totalSegmentCount).evaluate =\n              steppedEvaluate;\n\n            this._motionData.points.at(totalPointCount).time =\n              json.getMotionCurveSegment(curveCount, segmentPosition + 1);\n            this._motionData.points.at(totalPointCount).value =\n              json.getMotionCurveSegment(curveCount, segmentPosition + 2);\n\n            totalPointCount += 1;\n            segmentPosition += 3;\n\n            break;\n          }\n\n          case CubismMotionSegmentType.CubismMotionSegmentType_InverseStepped: {\n            this._motionData.segments.at(totalSegmentCount).segmentType =\n              CubismMotionSegmentType.CubismMotionSegmentType_InverseStepped;\n            this._motionData.segments.at(totalSegmentCount).evaluate =\n              inverseSteppedEvaluate;\n\n            this._motionData.points.at(totalPointCount).time =\n              json.getMotionCurveSegment(curveCount, segmentPosition + 1);\n            this._motionData.points.at(totalPointCount).value =\n              json.getMotionCurveSegment(curveCount, segmentPosition + 2);\n\n            totalPointCount += 1;\n            segmentPosition += 3;\n\n            break;\n          }\n          default: {\n            CSM_ASSERT(0);\n            break;\n          }\n        }\n\n        ++this._motionData.curves.at(curveCount).segmentCount;\n        ++totalSegmentCount;\n      }\n    }\n\n    for (\n      let userdatacount = 0;\n      userdatacount < json.getEventCount();\n      ++userdatacount\n    ) {\n      this._motionData.events.at(userdatacount).fireTime =\n        json.getEventTime(userdatacount);\n      this._motionData.events.at(userdatacount).value =\n        json.getEventValue(userdatacount);\n    }\n\n    json.release();\n    json = void 0;\n    json = null;\n  }\n\n  /**\n   * モデルのパラメータ更新\n   *\n   * イベント発火のチェック。\n   * 入力する時間は呼ばれるモーションタイミングを０とした秒数で行う。\n   *\n   * @param beforeCheckTimeSeconds   前回のイベントチェック時間[秒]\n   * @param motionTimeSeconds        今回の再生時間[秒]\n   */\n  public getFiredEvent(\n    beforeCheckTimeSeconds: number,\n    motionTimeSeconds: number\n  ): csmVector<csmString> {\n    this._firedEventValues.updateSize(0);\n\n    // イベントの発火チェック\n    for (let u = 0; u < this._motionData.eventCount; ++u) {\n      if (\n        this._motionData.events.at(u).fireTime > beforeCheckTimeSeconds &&\n        this._motionData.events.at(u).fireTime <= motionTimeSeconds\n      ) {\n        this._firedEventValues.pushBack(\n          new csmString(this._motionData.events.at(u).value.s)\n        );\n      }\n    }\n\n    return this._firedEventValues;\n  }\n\n  /**\n   * 透明度のカーブが存在するかどうかを確認する\n   *\n   * @returns true  -> キーが存在する\n   *          false -> キーが存在しない\n   */\n  public isExistModelOpacity(): boolean {\n    for (let i = 0; i < this._motionData.curveCount; i++) {\n      const curve: CubismMotionCurve = this._motionData.curves.at(i);\n\n      if (curve.type != CubismMotionCurveTarget.CubismMotionCurveTarget_Model) {\n        continue;\n      }\n\n      if (curve.id.getString().s.localeCompare(IdNameOpacity) == 0) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * 透明度のカーブのインデックスを返す\n   *\n   * @returns success:透明度のカーブのインデックス\n   */\n  public getModelOpacityIndex(): number {\n    if (this.isExistModelOpacity()) {\n      for (let i = 0; i < this._motionData.curveCount; i++) {\n        const curve: CubismMotionCurve = this._motionData.curves.at(i);\n\n        if (\n          curve.type != CubismMotionCurveTarget.CubismMotionCurveTarget_Model\n        ) {\n          continue;\n        }\n\n        if (curve.id.getString().s.localeCompare(IdNameOpacity) == 0) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * 透明度のIdを返す\n   *\n   * @param index モーションカーブのインデックス\n   * @returns success:透明度のカーブのインデックス\n   */\n  public getModelOpacityId(index: number): CubismIdHandle {\n    if (index != -1) {\n      const curve: CubismMotionCurve = this._motionData.curves.at(index);\n\n      if (curve.type == CubismMotionCurveTarget.CubismMotionCurveTarget_Model) {\n        if (curve.id.getString().s.localeCompare(IdNameOpacity) == 0) {\n          return CubismFramework.getIdManager().getId(curve.id.getString().s);\n        }\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * 現在時間の透明度の値を返す\n   *\n   * @returns success:モーションの当該時間におけるOpacityの値\n   */\n  public getModelOpacityValue(): number {\n    return this._modelOpacity;\n  }\n\n  public _sourceFrameRate: number; // ロードしたファイルのFPS。記述が無ければデフォルト値15fpsとなる\n  public _loopDurationSeconds: number; // mtnファイルで定義される一連のモーションの長さ\n  public _isLoop: boolean; // ループするか?\n  public _isLoopFadeIn: boolean; // ループ時にフェードインが有効かどうかのフラグ。初期値では有効。\n  public _lastWeight: number; // 最後に設定された重み\n\n  public _motionData: CubismMotionData; // 実際のモーションデータ本体\n\n  public _eyeBlinkParameterIds: csmVector<CubismIdHandle>; // 自動まばたきを適用するパラメータIDハンドルのリスト。  モデル（モデルセッティング）とパラメータを対応付ける。\n  public _lipSyncParameterIds: csmVector<CubismIdHandle>; // リップシンクを適用するパラメータIDハンドルのリスト。  モデル（モデルセッティング）とパラメータを対応付ける。\n\n  public _modelCurveIdEyeBlink: CubismIdHandle; // モデルが持つ自動まばたき用パラメータIDのハンドル。  モデルとモーションを対応付ける。\n  public _modelCurveIdLipSync: CubismIdHandle; // モデルが持つリップシンク用パラメータIDのハンドル。  モデルとモーションを対応付ける。\n  public _modelCurveIdOpacity: CubismIdHandle; // モデルが持つ不透明度用パラメータIDのハンドル。  モデルとモーションを対応付ける。\n\n  public _modelOpacity: number; // モーションから取得した不透明度\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmotion';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismMotion = $.CubismMotion;\n  export type CubismMotion = $.CubismMotion;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismModel } from '../model/cubismmodel';\nimport { ACubismMotion } from './acubismmotion';\nimport {\n  CubismMotionQueueEntryHandle,\n  CubismMotionQueueManager\n} from './cubismmotionqueuemanager';\n\n/**\n * モーションの管理\n *\n * モーションの管理を行うクラス\n */\nexport class CubismMotionManager extends CubismMotionQueueManager {\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    super();\n    this._currentPriority = 0;\n    this._reservePriority = 0;\n  }\n\n  /**\n   * 再生中のモーションの優先度の取得\n   * @return  モーションの優先度\n   */\n  public getCurrentPriority(): number {\n    return this._currentPriority;\n  }\n\n  /**\n   * 予約中のモーションの優先度を取得する。\n   * @return  モーションの優先度\n   */\n  public getReservePriority(): number {\n    return this._reservePriority;\n  }\n\n  /**\n   * 予約中のモーションの優先度を設定する。\n   * @param   val     優先度\n   */\n  public setReservePriority(val: number): void {\n    this._reservePriority = val;\n  }\n\n  /**\n   * 優先度を設定してモーションを開始する。\n   *\n   * @param motion          モーション\n   * @param autoDelete      再生が狩猟したモーションのインスタンスを削除するならtrue\n   * @param priority        優先度\n   * @return                開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するIsFinished()の引数で使用する。開始できない時は「-1」\n   */\n  public startMotionPriority(\n    motion: ACubismMotion,\n    autoDelete: boolean,\n    priority: number\n  ): CubismMotionQueueEntryHandle {\n    if (priority == this._reservePriority) {\n      this._reservePriority = 0; // 予約を解除\n    }\n\n    this._currentPriority = priority; // 再生中モーションの優先度を設定\n\n    return super.startMotion(motion, autoDelete);\n  }\n\n  /**\n   * モーションを更新して、モデルにパラメータ値を反映する。\n   *\n   * @param model   対象のモデル\n   * @param deltaTimeSeconds    デルタ時間[秒]\n   * @return  true    更新されている\n   * @return  false   更新されていない\n   */\n  public updateMotion(model: CubismModel, deltaTimeSeconds: number): boolean {\n    this._userTimeSeconds += deltaTimeSeconds;\n\n    const updated: boolean = super.doUpdateMotion(model, this._userTimeSeconds);\n\n    if (this.isFinished()) {\n      this._currentPriority = 0; // 再生中のモーションの優先度を解除\n    }\n\n    return updated;\n  }\n\n  /**\n   * モーションを予約する。\n   *\n   * @param   priority    優先度\n   * @return  true    予約できた\n   * @return  false   予約できなかった\n   */\n  public reserveMotion(priority: number): boolean {\n    if (\n      priority <= this._reservePriority ||\n      priority <= this._currentPriority\n    ) {\n      return false;\n    }\n\n    this._reservePriority = priority;\n\n    return true;\n  }\n\n  _currentPriority: number; // 現在再生中のモーションの優先度\n  _reservePriority: number; // 再生予定のモーションの優先度。再生中は0になる。モーションファイルを別スレッドで読み込むときの機能。\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmotionmanager';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismMotionManager = $.CubismMotionManager;\n  export type CubismMotionManager = $.CubismMotionManager;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdHandle } from '../id/cubismid';\nimport { CubismVector2 } from '../math/cubismvector2';\nimport { csmVector } from '../type/csmvector';\n\n/**\n * 物理演算の適用先の種類\n */\nexport enum CubismPhysicsTargetType {\n  CubismPhysicsTargetType_Parameter // パラメータに対して適用\n}\n\n/**\n * 物理演算の入力の種類\n */\nexport enum CubismPhysicsSource {\n  CubismPhysicsSource_X, // X軸の位置から\n  CubismPhysicsSource_Y, // Y軸の位置から\n  CubismPhysicsSource_Angle // 角度から\n}\n\n/**\n * @brief 物理演算で使用する外部の力\n *\n * 物理演算で使用する外部の力。\n */\nexport class PhysicsJsonEffectiveForces {\n  constructor() {\n    this.gravity = new CubismVector2(0, 0);\n    this.wind = new CubismVector2(0, 0);\n  }\n  gravity: CubismVector2; // 重力\n  wind: CubismVector2; // 風\n}\n\n/**\n * 物理演算のパラメータ情報\n */\nexport class CubismPhysicsParameter {\n  id: CubismIdHandle; // パラメータ\n  targetType: CubismPhysicsTargetType; // 適用先の種類\n}\n\n/**\n * 物理演算の正規化情報\n */\nexport class CubismPhysicsNormalization {\n  minimum: number; // 最大値\n  maximum: number; // 最小値\n  defalut: number; // デフォルト値\n}\n\n/**\n * 物理演算の演算委使用する物理点の情報\n */\nexport class CubismPhysicsParticle {\n  constructor() {\n    this.initialPosition = new CubismVector2(0, 0);\n    this.position = new CubismVector2(0, 0);\n    this.lastPosition = new CubismVector2(0, 0);\n    this.lastGravity = new CubismVector2(0, 0);\n    this.force = new CubismVector2(0, 0);\n    this.velocity = new CubismVector2(0, 0);\n  }\n\n  initialPosition: CubismVector2; // 初期位置\n  mobility: number; // 動きやすさ\n  delay: number; // 遅れ\n  acceleration: number; // 加速度\n  radius: number; // 距離\n  position: CubismVector2; // 現在の位置\n  lastPosition: CubismVector2; // 最後の位置\n  lastGravity: CubismVector2; // 最後の重力\n  force: CubismVector2; // 現在かかっている力\n  velocity: CubismVector2; // 現在の速度\n}\n\n/**\n * 物理演算の物理点の管理\n */\nexport class CubismPhysicsSubRig {\n  constructor() {\n    this.normalizationPosition = new CubismPhysicsNormalization();\n    this.normalizationAngle = new CubismPhysicsNormalization();\n  }\n  inputCount: number; // 入力の個数\n  outputCount: number; // 出力の個数\n  particleCount: number; // 物理点の個数\n  baseInputIndex: number; // 入力の最初のインデックス\n  baseOutputIndex: number; // 出力の最初のインデックス\n  baseParticleIndex: number; // 物理点の最初のインデックス\n  normalizationPosition: CubismPhysicsNormalization; // 正規化された位置\n  normalizationAngle: CubismPhysicsNormalization; // 正規化された角度\n}\n\n/**\n * 正規化されたパラメータの取得関数の宣言\n * @param targetTranslation     // 演算結果の移動値\n * @param targetAngle           // 演算結果の角度\n * @param value                 // パラメータの値\n * @param parameterMinimunValue // パラメータの最小値\n * @param parameterMaximumValue // パラメータの最大値\n * @param parameterDefaultValue // パラメータのデフォルト値\n * @param normalizationPosition // 正規化された位置\n * @param normalizationAngle    // 正規化された角度\n * @param isInverted            // 値が反転されているか？\n * @param weight                // 重み\n */\nexport interface normalizedPhysicsParameterValueGetter {\n  (\n    targetTranslation: CubismVector2,\n    targetAngle: { angle: number },\n    value: number,\n    parameterMinimunValue: number,\n    parameterMaximumValue: number,\n    parameterDefaultValue: number,\n    normalizationPosition: CubismPhysicsNormalization,\n    normalizationAngle: CubismPhysicsNormalization,\n    isInverted: boolean,\n    weight: number\n  ): void;\n}\n\n/**\n * 物理演算の値の取得関数の宣言\n * @param translation 移動値\n * @param particles 物理点のリスト\n * @param isInverted 値が反映されているか\n * @param parentGravity 重力\n * @return 値\n */\nexport interface physicsValueGetter {\n  (\n    translation: CubismVector2,\n    particles: CubismPhysicsParticle[],\n    particleIndex: number,\n    isInverted: boolean,\n    parentGravity: CubismVector2\n  ): number;\n}\n\n/**\n * 物理演算のスケールの取得関数の宣言\n * @param translationScale 移動値のスケール\n * @param angleScale    角度のスケール\n * @return スケール値\n */\nexport interface physicsScaleGetter {\n  (translationScale: CubismVector2, angleScale: number): number;\n}\n\n/**\n * 物理演算の入力情報\n */\nexport class CubismPhysicsInput {\n  constructor() {\n    this.source = new CubismPhysicsParameter();\n  }\n  source: CubismPhysicsParameter; // 入力元のパラメータ\n  sourceParameterIndex: number; // 入力元のパラメータのインデックス\n  weight: number; // 重み\n  type: number; // 入力の種類\n  reflect: boolean; // 値が反転されているかどうか\n  getNormalizedParameterValue: normalizedPhysicsParameterValueGetter; // 正規化されたパラメータ値の取得関数\n}\n\n/**\n * @brief 物理演算の出力情報\n *\n * 物理演算の出力情報。\n */\nexport class CubismPhysicsOutput {\n  constructor() {\n    this.destination = new CubismPhysicsParameter();\n    this.translationScale = new CubismVector2(0, 0);\n  }\n\n  destination: CubismPhysicsParameter; // 出力先のパラメータ\n  destinationParameterIndex: number; // 出力先のパラメータのインデックス\n  vertexIndex: number; // 振り子のインデックス\n  translationScale: CubismVector2; // 移動値のスケール\n  angleScale: number; // 角度のスケール\n  weight: number; // 重み\n  type: CubismPhysicsSource; // 出力の種類\n  reflect: boolean; // 値が反転されているかどうか\n  valueBelowMinimum: number; // 最小値を下回った時の値\n  valueExceededMaximum: number; // 最大値をこえた時の値\n  getValue: physicsValueGetter; // 物理演算の値の取得関数\n  getScale: physicsScaleGetter; // 物理演算のスケール値の取得関数\n}\n\n/**\n * @brief 物理演算のデータ\n *\n * 物理演算のデータ。\n */\nexport class CubismPhysicsRig {\n  constructor() {\n    this.settings = new csmVector<CubismPhysicsSubRig>();\n    this.inputs = new csmVector<CubismPhysicsInput>();\n    this.outputs = new csmVector<CubismPhysicsOutput>();\n    this.particles = new csmVector<CubismPhysicsParticle>();\n    this.gravity = new CubismVector2(0, 0);\n    this.wind = new CubismVector2(0, 0);\n    this.fps = 0.0;\n  }\n\n  subRigCount: number; // 物理演算の物理点の個数\n  settings: csmVector<CubismPhysicsSubRig>; // 物理演算の物理点の管理のリスト\n  inputs: csmVector<CubismPhysicsInput>; // 物理演算の入力のリスト\n  outputs: csmVector<CubismPhysicsOutput>; // 物理演算の出力のリスト\n  particles: csmVector<CubismPhysicsParticle>; // 物理演算の物理点のリスト\n  gravity: CubismVector2; // 重力\n  wind: CubismVector2; // 風\n  fps: number; //物理演算動作FPS\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismphysicsinternal';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismPhysicsInput = $.CubismPhysicsInput;\n  export type CubismPhysicsInput = $.CubismPhysicsInput;\n  export const CubismPhysicsNormalization = $.CubismPhysicsNormalization;\n  export type CubismPhysicsNormalization = $.CubismPhysicsNormalization;\n  export const CubismPhysicsOutput = $.CubismPhysicsOutput;\n  export type CubismPhysicsOutput = $.CubismPhysicsOutput;\n  export const CubismPhysicsParameter = $.CubismPhysicsParameter;\n  export type CubismPhysicsParameter = $.CubismPhysicsParameter;\n  export const CubismPhysicsParticle = $.CubismPhysicsParticle;\n  export type CubismPhysicsParticle = $.CubismPhysicsParticle;\n  export const CubismPhysicsRig = $.CubismPhysicsRig;\n  export type CubismPhysicsRig = $.CubismPhysicsRig;\n  export const CubismPhysicsSource = $.CubismPhysicsSource;\n  export type CubismPhysicsSource = $.CubismPhysicsSource;\n  export const CubismPhysicsSubRig = $.CubismPhysicsSubRig;\n  export type CubismPhysicsSubRig = $.CubismPhysicsSubRig;\n  export const CubismPhysicsTargetType = $.CubismPhysicsTargetType;\n  export type CubismPhysicsTargetType = $.CubismPhysicsTargetType;\n  export const PhysicsJsonEffectiveForces = $.PhysicsJsonEffectiveForces;\n  export type PhysicsJsonEffectiveForces = $.PhysicsJsonEffectiveForces;\n  export type normalizedPhysicsParameterValueGetter =\n    $.normalizedPhysicsParameterValueGetter;\n  export type physicsScaleGetter = $.physicsScaleGetter;\n  export type physicsValueGetter = $.physicsValueGetter;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdHandle } from '../id/cubismid';\nimport { CubismFramework } from '../live2dcubismframework';\nimport { CubismVector2 } from '../math/cubismvector2';\nimport { CubismJson } from '../utils/cubismjson';\n\n// JSON keys\nconst Position = 'Position';\nconst X = 'X';\nconst Y = 'Y';\nconst Angle = 'Angle';\nconst Type = 'Type';\nconst Id = 'Id';\n\n// Meta\nconst Meta = 'Meta';\nconst EffectiveForces = 'EffectiveForces';\nconst TotalInputCount = 'TotalInputCount';\nconst TotalOutputCount = 'TotalOutputCount';\nconst PhysicsSettingCount = 'PhysicsSettingCount';\nconst Gravity = 'Gravity';\nconst Wind = 'Wind';\nconst VertexCount = 'VertexCount';\nconst Fps = 'Fps';\n\n// PhysicsSettings\nconst PhysicsSettings = 'PhysicsSettings';\nconst Normalization = 'Normalization';\nconst Minimum = 'Minimum';\nconst Maximum = 'Maximum';\nconst Default = 'Default';\nconst Reflect = 'Reflect';\nconst Weight = 'Weight';\n\n// Input\nconst Input = 'Input';\nconst Source = 'Source';\n\n// Output\nconst Output = 'Output';\nconst Scale = 'Scale';\nconst VertexIndex = 'VertexIndex';\nconst Destination = 'Destination';\n\n// Particle\nconst Vertices = 'Vertices';\nconst Mobility = 'Mobility';\nconst Delay = 'Delay';\nconst Radius = 'Radius';\nconst Acceleration = 'Acceleration';\n\n/**\n * physics3.jsonのコンテナ。\n */\nexport class CubismPhysicsJson {\n  /**\n   * コンストラクタ\n   * @param buffer physics3.jsonが読み込まれているバッファ\n   * @param size バッファのサイズ\n   */\n  public constructor(buffer: ArrayBuffer, size: number) {\n    this._json = CubismJson.create(buffer, size);\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    CubismJson.delete(this._json);\n  }\n\n  /**\n   * 重力の取得\n   * @return 重力\n   */\n  public getGravity(): CubismVector2 {\n    const ret: CubismVector2 = new CubismVector2(0, 0);\n    ret.x = this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(EffectiveForces)\n      .getValueByString(Gravity)\n      .getValueByString(X)\n      .toFloat();\n    ret.y = this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(EffectiveForces)\n      .getValueByString(Gravity)\n      .getValueByString(Y)\n      .toFloat();\n    return ret;\n  }\n\n  /**\n   * 風の取得\n   * @return 風\n   */\n  public getWind(): CubismVector2 {\n    const ret: CubismVector2 = new CubismVector2(0, 0);\n    ret.x = this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(EffectiveForces)\n      .getValueByString(Wind)\n      .getValueByString(X)\n      .toFloat();\n    ret.y = this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(EffectiveForces)\n      .getValueByString(Wind)\n      .getValueByString(Y)\n      .toFloat();\n    return ret;\n  }\n\n  /**\n   * 物理演算設定FPSの取得\n   * @return 物理演算設定FPS\n   */\n  public getFps(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(Fps)\n      .toFloat(0.0);\n  }\n\n  /**\n   * 物理店の管理の個数の取得\n   * @return 物理店の管理の個数\n   */\n  public getSubRigCount(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(PhysicsSettingCount)\n      .toInt();\n  }\n\n  /**\n   * 入力の総合計の取得\n   * @return 入力の総合計\n   */\n  public getTotalInputCount(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(TotalInputCount)\n      .toInt();\n  }\n\n  /**\n   * 出力の総合計の取得\n   * @return 出力の総合計\n   */\n  public getTotalOutputCount(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(TotalOutputCount)\n      .toInt();\n  }\n\n  /**\n   * 物理点の個数の取得\n   * @return 物理点の個数\n   */\n  public getVertexCount(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(VertexCount)\n      .toInt();\n  }\n\n  /**\n   * 正規化された位置の最小値の取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @return 正規化された位置の最小値\n   */\n  public getNormalizationPositionMinimumValue(\n    physicsSettingIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Normalization)\n      .getValueByString(Position)\n      .getValueByString(Minimum)\n      .toFloat();\n  }\n\n  /**\n   * 正規化された位置の最大値の取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @return 正規化された位置の最大値\n   */\n  public getNormalizationPositionMaximumValue(\n    physicsSettingIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Normalization)\n      .getValueByString(Position)\n      .getValueByString(Maximum)\n      .toFloat();\n  }\n\n  /**\n   * 正規化された位置のデフォルト値の取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @return 正規化された位置のデフォルト値\n   */\n  public getNormalizationPositionDefaultValue(\n    physicsSettingIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Normalization)\n      .getValueByString(Position)\n      .getValueByString(Default)\n      .toFloat();\n  }\n\n  /**\n   * 正規化された角度の最小値の取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @return 正規化された角度の最小値\n   */\n  public getNormalizationAngleMinimumValue(\n    physicsSettingIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Normalization)\n      .getValueByString(Angle)\n      .getValueByString(Minimum)\n      .toFloat();\n  }\n\n  /**\n   * 正規化された角度の最大値の取得\n   * @param physicsSettingIndex\n   * @return 正規化された角度の最大値\n   */\n  public getNormalizationAngleMaximumValue(\n    physicsSettingIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Normalization)\n      .getValueByString(Angle)\n      .getValueByString(Maximum)\n      .toFloat();\n  }\n\n  /**\n   * 正規化された角度のデフォルト値の取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @return 正規化された角度のデフォルト値\n   */\n  public getNormalizationAngleDefaultValue(\n    physicsSettingIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Normalization)\n      .getValueByString(Angle)\n      .getValueByString(Default)\n      .toFloat();\n  }\n\n  /**\n   * 入力の個数の取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @return 入力の個数\n   */\n  public getInputCount(physicsSettingIndex: number): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Input)\n      .getVector()\n      .getSize();\n  }\n\n  /**\n   * 入力の重みの取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param inputIndex 入力のインデックス\n   * @return 入力の重み\n   */\n  public getInputWeight(\n    physicsSettingIndex: number,\n    inputIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Input)\n      .getValueByIndex(inputIndex)\n      .getValueByString(Weight)\n      .toFloat();\n  }\n\n  /**\n   * 入力の反転の取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param inputIndex 入力のインデックス\n   * @return 入力の反転\n   */\n  public getInputReflect(\n    physicsSettingIndex: number,\n    inputIndex: number\n  ): boolean {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Input)\n      .getValueByIndex(inputIndex)\n      .getValueByString(Reflect)\n      .toBoolean();\n  }\n\n  /**\n   * 入力の種類の取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param inputIndex 入力のインデックス\n   * @return 入力の種類\n   */\n  public getInputType(physicsSettingIndex: number, inputIndex: number): string {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Input)\n      .getValueByIndex(inputIndex)\n      .getValueByString(Type)\n      .getRawString();\n  }\n\n  /**\n   * 入力元のIDの取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param inputIndex 入力のインデックス\n   * @return 入力元のID\n   */\n  public getInputSourceId(\n    physicsSettingIndex: number,\n    inputIndex: number\n  ): CubismIdHandle {\n    return CubismFramework.getIdManager().getId(\n      this._json\n        .getRoot()\n        .getValueByString(PhysicsSettings)\n        .getValueByIndex(physicsSettingIndex)\n        .getValueByString(Input)\n        .getValueByIndex(inputIndex)\n        .getValueByString(Source)\n        .getValueByString(Id)\n        .getRawString()\n    );\n  }\n\n  /**\n   * 出力の個数の取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @return 出力の個数\n   */\n  public getOutputCount(physicsSettingIndex: number): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Output)\n      .getVector()\n      .getSize();\n  }\n\n  /**\n   * 出力の物理点のインデックスの取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param outputIndex 出力のインデックス\n   * @return 出力の物理点のインデックス\n   */\n  public getOutputVertexIndex(\n    physicsSettingIndex: number,\n    outputIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Output)\n      .getValueByIndex(outputIndex)\n      .getValueByString(VertexIndex)\n      .toInt();\n  }\n\n  /**\n   * 出力の角度のスケールを取得する\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param outputIndex 出力のインデックス\n   * @return 出力の角度のスケール\n   */\n  public getOutputAngleScale(\n    physicsSettingIndex: number,\n    outputIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Output)\n      .getValueByIndex(outputIndex)\n      .getValueByString(Scale)\n      .toFloat();\n  }\n\n  /**\n   * 出力の重みの取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param outputIndex 出力のインデックス\n   * @return 出力の重み\n   */\n  public getOutputWeight(\n    physicsSettingIndex: number,\n    outputIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Output)\n      .getValueByIndex(outputIndex)\n      .getValueByString(Weight)\n      .toFloat();\n  }\n\n  /**\n   * 出力先のIDの取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param outputIndex 出力のインデックス\n   * @return 出力先のID\n   */\n  public getOutputDestinationId(\n    physicsSettingIndex: number,\n    outputIndex: number\n  ): CubismIdHandle {\n    return CubismFramework.getIdManager().getId(\n      this._json\n        .getRoot()\n        .getValueByString(PhysicsSettings)\n        .getValueByIndex(physicsSettingIndex)\n        .getValueByString(Output)\n        .getValueByIndex(outputIndex)\n        .getValueByString(Destination)\n        .getValueByString(Id)\n        .getRawString()\n    );\n  }\n\n  /**\n   * 出力の種類の取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param outputIndex 出力のインデックス\n   * @return 出力の種類\n   */\n  public getOutputType(\n    physicsSettingIndex: number,\n    outputIndex: number\n  ): string {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Output)\n      .getValueByIndex(outputIndex)\n      .getValueByString(Type)\n      .getRawString();\n  }\n\n  /**\n   * 出力の反転の取得\n   * @param physicsSettingIndex 物理演算のインデックス\n   * @param outputIndex 出力のインデックス\n   * @return 出力の反転\n   */\n  public getOutputReflect(\n    physicsSettingIndex: number,\n    outputIndex: number\n  ): boolean {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Output)\n      .getValueByIndex(outputIndex)\n      .getValueByString(Reflect)\n      .toBoolean();\n  }\n\n  /**\n   * 物理点の個数の取得\n   * @param physicsSettingIndex 物理演算男設定のインデックス\n   * @return 物理点の個数\n   */\n  public getParticleCount(physicsSettingIndex: number): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Vertices)\n      .getVector()\n      .getSize();\n  }\n\n  /**\n   * 物理点の動きやすさの取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param vertexIndex 物理点のインデックス\n   * @return 物理点の動きやすさ\n   */\n  public getParticleMobility(\n    physicsSettingIndex: number,\n    vertexIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Vertices)\n      .getValueByIndex(vertexIndex)\n      .getValueByString(Mobility)\n      .toFloat();\n  }\n\n  /**\n   * 物理点の遅れの取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param vertexIndex 物理点のインデックス\n   * @return 物理点の遅れ\n   */\n  public getParticleDelay(\n    physicsSettingIndex: number,\n    vertexIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Vertices)\n      .getValueByIndex(vertexIndex)\n      .getValueByString(Delay)\n      .toFloat();\n  }\n\n  /**\n   * 物理点の加速度の取得\n   * @param physicsSettingIndex 物理演算の設定\n   * @param vertexIndex 物理点のインデックス\n   * @return 物理点の加速度\n   */\n  public getParticleAcceleration(\n    physicsSettingIndex: number,\n    vertexIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Vertices)\n      .getValueByIndex(vertexIndex)\n      .getValueByString(Acceleration)\n      .toFloat();\n  }\n\n  /**\n   * 物理点の距離の取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param vertexIndex 物理点のインデックス\n   * @return 物理点の距離\n   */\n  public getParticleRadius(\n    physicsSettingIndex: number,\n    vertexIndex: number\n  ): number {\n    return this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Vertices)\n      .getValueByIndex(vertexIndex)\n      .getValueByString(Radius)\n      .toFloat();\n  }\n\n  /**\n   * 物理点の位置の取得\n   * @param physicsSettingIndex 物理演算の設定のインデックス\n   * @param vertexInde 物理点のインデックス\n   * @return 物理点の位置\n   */\n  public getParticlePosition(\n    physicsSettingIndex: number,\n    vertexIndex: number\n  ): CubismVector2 {\n    const ret: CubismVector2 = new CubismVector2(0, 0);\n    ret.x = this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Vertices)\n      .getValueByIndex(vertexIndex)\n      .getValueByString(Position)\n      .getValueByString(X)\n      .toFloat();\n    ret.y = this._json\n      .getRoot()\n      .getValueByString(PhysicsSettings)\n      .getValueByIndex(physicsSettingIndex)\n      .getValueByString(Vertices)\n      .getValueByIndex(vertexIndex)\n      .getValueByString(Position)\n      .getValueByString(Y)\n      .toFloat();\n    return ret;\n  }\n\n  _json: CubismJson; // physics3.jsonデータ\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismphysicsjson';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismPhysicsJson = $.CubismPhysicsJson;\n  export type CubismPhysicsJson = $.CubismPhysicsJson;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismMath } from '../math/cubismmath';\nimport { CubismVector2 } from '../math/cubismvector2';\nimport { csmVector } from '../type/csmvector';\nimport { CubismModel } from '../model/cubismmodel';\nimport {\n  CubismPhysicsInput,\n  CubismPhysicsNormalization,\n  CubismPhysicsOutput,\n  CubismPhysicsParticle,\n  CubismPhysicsRig,\n  CubismPhysicsSource,\n  CubismPhysicsSubRig,\n  CubismPhysicsTargetType\n} from './cubismphysicsinternal';\nimport { CubismPhysicsJson } from './cubismphysicsjson';\n\n// physics types tags.\nconst PhysicsTypeTagX = 'X';\nconst PhysicsTypeTagY = 'Y';\nconst PhysicsTypeTagAngle = 'Angle';\n\n// Constant of air resistance.\nconst AirResistance = 5.0;\n\n// Constant of maximum weight of input and output ratio.\nconst MaximumWeight = 100.0;\n\n// Constant of threshold of movement.\nconst MovementThreshold = 0.001;\n\n// Constant of maximum allowed delta time\nconst MaxDeltaTime = 5.0;\n\n/**\n * 物理演算クラス\n */\nexport class CubismPhysics {\n  /**\n   * インスタンスの作成\n   * @param buffer    physics3.jsonが読み込まれているバッファ\n   * @param size      バッファのサイズ\n   * @return 作成されたインスタンス\n   */\n  public static create(buffer: ArrayBuffer, size: number): CubismPhysics {\n    const ret: CubismPhysics = new CubismPhysics();\n\n    ret.parse(buffer, size);\n    ret._physicsRig.gravity.y = 0;\n\n    return ret;\n  }\n\n  /**\n   * インスタンスを破棄する\n   * @param physics 破棄するインスタンス\n   */\n  public static delete(physics: CubismPhysics): void {\n    if (physics != null) {\n      physics.release();\n      physics = null;\n    }\n  }\n\n  /**\n   * physics3.jsonをパースする。\n   * @param physicsJson physics3.jsonが読み込まれているバッファ\n   * @param size バッファのサイズ\n   */\n  public parse(physicsJson: ArrayBuffer, size: number): void {\n    this._physicsRig = new CubismPhysicsRig();\n\n    let json: CubismPhysicsJson = new CubismPhysicsJson(physicsJson, size);\n\n    this._physicsRig.gravity = json.getGravity();\n    this._physicsRig.wind = json.getWind();\n    this._physicsRig.subRigCount = json.getSubRigCount();\n\n    this._physicsRig.fps = json.getFps();\n\n    this._physicsRig.settings.updateSize(\n      this._physicsRig.subRigCount,\n      CubismPhysicsSubRig,\n      true\n    );\n    this._physicsRig.inputs.updateSize(\n      json.getTotalInputCount(),\n      CubismPhysicsInput,\n      true\n    );\n    this._physicsRig.outputs.updateSize(\n      json.getTotalOutputCount(),\n      CubismPhysicsOutput,\n      true\n    );\n    this._physicsRig.particles.updateSize(\n      json.getVertexCount(),\n      CubismPhysicsParticle,\n      true\n    );\n\n    this._currentRigOutputs.clear();\n    this._previousRigOutputs.clear();\n\n    let inputIndex = 0,\n      outputIndex = 0,\n      particleIndex = 0;\n\n    for (let i = 0; i < this._physicsRig.settings.getSize(); ++i) {\n      this._physicsRig.settings.at(i).normalizationPosition.minimum =\n        json.getNormalizationPositionMinimumValue(i);\n      this._physicsRig.settings.at(i).normalizationPosition.maximum =\n        json.getNormalizationPositionMaximumValue(i);\n      this._physicsRig.settings.at(i).normalizationPosition.defalut =\n        json.getNormalizationPositionDefaultValue(i);\n\n      this._physicsRig.settings.at(i).normalizationAngle.minimum =\n        json.getNormalizationAngleMinimumValue(i);\n      this._physicsRig.settings.at(i).normalizationAngle.maximum =\n        json.getNormalizationAngleMaximumValue(i);\n      this._physicsRig.settings.at(i).normalizationAngle.defalut =\n        json.getNormalizationAngleDefaultValue(i);\n\n      // Input\n      this._physicsRig.settings.at(i).inputCount = json.getInputCount(i);\n      this._physicsRig.settings.at(i).baseInputIndex = inputIndex;\n\n      for (let j = 0; j < this._physicsRig.settings.at(i).inputCount; ++j) {\n        this._physicsRig.inputs.at(inputIndex + j).sourceParameterIndex = -1;\n        this._physicsRig.inputs.at(inputIndex + j).weight = json.getInputWeight(\n          i,\n          j\n        );\n        this._physicsRig.inputs.at(inputIndex + j).reflect =\n          json.getInputReflect(i, j);\n\n        if (json.getInputType(i, j) == PhysicsTypeTagX) {\n          this._physicsRig.inputs.at(inputIndex + j).type =\n            CubismPhysicsSource.CubismPhysicsSource_X;\n          this._physicsRig.inputs.at(\n            inputIndex + j\n          ).getNormalizedParameterValue =\n            getInputTranslationXFromNormalizedParameterValue;\n        } else if (json.getInputType(i, j) == PhysicsTypeTagY) {\n          this._physicsRig.inputs.at(inputIndex + j).type =\n            CubismPhysicsSource.CubismPhysicsSource_Y;\n          this._physicsRig.inputs.at(\n            inputIndex + j\n          ).getNormalizedParameterValue =\n            getInputTranslationYFromNormalizedParamterValue;\n        } else if (json.getInputType(i, j) == PhysicsTypeTagAngle) {\n          this._physicsRig.inputs.at(inputIndex + j).type =\n            CubismPhysicsSource.CubismPhysicsSource_Angle;\n          this._physicsRig.inputs.at(\n            inputIndex + j\n          ).getNormalizedParameterValue =\n            getInputAngleFromNormalizedParameterValue;\n        }\n\n        this._physicsRig.inputs.at(inputIndex + j).source.targetType =\n          CubismPhysicsTargetType.CubismPhysicsTargetType_Parameter;\n        this._physicsRig.inputs.at(inputIndex + j).source.id =\n          json.getInputSourceId(i, j);\n      }\n      inputIndex += this._physicsRig.settings.at(i).inputCount;\n\n      // Output\n      this._physicsRig.settings.at(i).outputCount = json.getOutputCount(i);\n      this._physicsRig.settings.at(i).baseOutputIndex = outputIndex;\n\n      const currentRigOutput = new PhysicsOutput();\n      currentRigOutput.outputs.resize(\n        this._physicsRig.settings.at(i).outputCount\n      );\n\n      const previousRigOutput = new PhysicsOutput();\n      previousRigOutput.outputs.resize(\n        this._physicsRig.settings.at(i).outputCount\n      );\n\n      for (let j = 0; j < this._physicsRig.settings.at(i).outputCount; ++j) {\n        // initialize\n        currentRigOutput.outputs.set(j, 0.0);\n        previousRigOutput.outputs.set(j, 0.0);\n\n        this._physicsRig.outputs.at(outputIndex + j).destinationParameterIndex =\n          -1;\n        this._physicsRig.outputs.at(outputIndex + j).vertexIndex =\n          json.getOutputVertexIndex(i, j);\n        this._physicsRig.outputs.at(outputIndex + j).angleScale =\n          json.getOutputAngleScale(i, j);\n        this._physicsRig.outputs.at(outputIndex + j).weight =\n          json.getOutputWeight(i, j);\n        this._physicsRig.outputs.at(outputIndex + j).destination.targetType =\n          CubismPhysicsTargetType.CubismPhysicsTargetType_Parameter;\n\n        this._physicsRig.outputs.at(outputIndex + j).destination.id =\n          json.getOutputDestinationId(i, j);\n\n        if (json.getOutputType(i, j) == PhysicsTypeTagX) {\n          this._physicsRig.outputs.at(outputIndex + j).type =\n            CubismPhysicsSource.CubismPhysicsSource_X;\n          this._physicsRig.outputs.at(outputIndex + j).getValue =\n            getOutputTranslationX;\n          this._physicsRig.outputs.at(outputIndex + j).getScale =\n            getOutputScaleTranslationX;\n        } else if (json.getOutputType(i, j) == PhysicsTypeTagY) {\n          this._physicsRig.outputs.at(outputIndex + j).type =\n            CubismPhysicsSource.CubismPhysicsSource_Y;\n          this._physicsRig.outputs.at(outputIndex + j).getValue =\n            getOutputTranslationY;\n          this._physicsRig.outputs.at(outputIndex + j).getScale =\n            getOutputScaleTranslationY;\n        } else if (json.getOutputType(i, j) == PhysicsTypeTagAngle) {\n          this._physicsRig.outputs.at(outputIndex + j).type =\n            CubismPhysicsSource.CubismPhysicsSource_Angle;\n          this._physicsRig.outputs.at(outputIndex + j).getValue =\n            getOutputAngle;\n          this._physicsRig.outputs.at(outputIndex + j).getScale =\n            getOutputScaleAngle;\n        }\n\n        this._physicsRig.outputs.at(outputIndex + j).reflect =\n          json.getOutputReflect(i, j);\n      }\n\n      this._currentRigOutputs.pushBack(currentRigOutput);\n      this._previousRigOutputs.pushBack(previousRigOutput);\n\n      outputIndex += this._physicsRig.settings.at(i).outputCount;\n\n      // Particle\n      this._physicsRig.settings.at(i).particleCount = json.getParticleCount(i);\n      this._physicsRig.settings.at(i).baseParticleIndex = particleIndex;\n\n      for (let j = 0; j < this._physicsRig.settings.at(i).particleCount; ++j) {\n        this._physicsRig.particles.at(particleIndex + j).mobility =\n          json.getParticleMobility(i, j);\n        this._physicsRig.particles.at(particleIndex + j).delay =\n          json.getParticleDelay(i, j);\n        this._physicsRig.particles.at(particleIndex + j).acceleration =\n          json.getParticleAcceleration(i, j);\n        this._physicsRig.particles.at(particleIndex + j).radius =\n          json.getParticleRadius(i, j);\n        this._physicsRig.particles.at(particleIndex + j).position =\n          json.getParticlePosition(i, j);\n      }\n\n      particleIndex += this._physicsRig.settings.at(i).particleCount;\n    }\n\n    this.initialize();\n\n    json.release();\n    json = void 0;\n    json = null;\n  }\n\n  /**\n   * 現在のパラメータ値で物理演算が安定化する状態を演算する。\n   * @param model 物理演算の結果を適用するモデル\n   */\n  public stabilization(model: CubismModel): void {\n    let totalAngle: { angle: number };\n    let weight: number;\n    let radAngle: number;\n    let outputValue: number;\n    const totalTranslation: CubismVector2 = new CubismVector2();\n    let currentSetting: CubismPhysicsSubRig;\n    let currentInputs: CubismPhysicsInput[];\n    let currentOutputs: CubismPhysicsOutput[];\n    let currentParticles: CubismPhysicsParticle[];\n\n    const parameterValues: Float32Array = model.getModel().parameters.values;\n    const parameterMaximumValues: Float32Array =\n      model.getModel().parameters.maximumValues;\n    const parameterMinimumValues: Float32Array =\n      model.getModel().parameters.minimumValues;\n    const parameterDefaultValues: Float32Array =\n      model.getModel().parameters.defaultValues;\n\n    if ((this._parameterCaches?.length ?? 0) < model.getParameterCount()) {\n      this._parameterCaches = new Float32Array(model.getParameterCount());\n    }\n\n    if ((this._parameterInputCaches?.length ?? 0) < model.getParameterCount()) {\n      this._parameterInputCaches = new Float32Array(model.getParameterCount());\n    }\n\n    for (let j = 0; j < model.getParameterCount(); ++j) {\n      this._parameterCaches[j] = parameterValues[j];\n      this._parameterInputCaches[j] = parameterValues[j];\n    }\n\n    for (\n      let settingIndex = 0;\n      settingIndex < this._physicsRig.subRigCount;\n      ++settingIndex\n    ) {\n      totalAngle = { angle: 0.0 };\n      totalTranslation.x = 0.0;\n      totalTranslation.y = 0.0;\n      currentSetting = this._physicsRig.settings.at(settingIndex);\n      currentInputs = this._physicsRig.inputs.get(\n        currentSetting.baseInputIndex\n      );\n      currentOutputs = this._physicsRig.outputs.get(\n        currentSetting.baseOutputIndex\n      );\n      currentParticles = this._physicsRig.particles.get(\n        currentSetting.baseParticleIndex\n      );\n\n      // Load input parameters\n      for (let i = 0; i < currentSetting.inputCount; ++i) {\n        weight = currentInputs[i].weight / MaximumWeight;\n\n        if (currentInputs[i].sourceParameterIndex == -1) {\n          currentInputs[i].sourceParameterIndex = model.getParameterIndex(\n            currentInputs[i].source.id\n          );\n        }\n\n        currentInputs[i].getNormalizedParameterValue(\n          totalTranslation,\n          totalAngle,\n          parameterValues[currentInputs[i].sourceParameterIndex],\n          parameterMinimumValues[currentInputs[i].sourceParameterIndex],\n          parameterMaximumValues[currentInputs[i].sourceParameterIndex],\n          parameterDefaultValues[currentInputs[i].sourceParameterIndex],\n          currentSetting.normalizationPosition,\n          currentSetting.normalizationAngle,\n          currentInputs[i].reflect,\n          weight\n        );\n\n        this._parameterCaches[currentInputs[i].sourceParameterIndex] =\n          parameterValues[currentInputs[i].sourceParameterIndex];\n      }\n\n      radAngle = CubismMath.degreesToRadian(-totalAngle.angle);\n\n      totalTranslation.x =\n        totalTranslation.x * CubismMath.cos(radAngle) -\n        totalTranslation.y * CubismMath.sin(radAngle);\n      totalTranslation.y =\n        totalTranslation.x * CubismMath.sin(radAngle) +\n        totalTranslation.y * CubismMath.cos(radAngle);\n\n      // Calculate particles position.\n      updateParticlesForStabilization(\n        currentParticles,\n        currentSetting.particleCount,\n        totalTranslation,\n        totalAngle.angle,\n        this._options.wind,\n        MovementThreshold * currentSetting.normalizationPosition.maximum\n      );\n\n      // Update output parameters.\n      for (let i = 0; i < currentSetting.outputCount; ++i) {\n        const particleIndex = currentOutputs[i].vertexIndex;\n\n        if (currentOutputs[i].destinationParameterIndex == -1) {\n          currentOutputs[i].destinationParameterIndex = model.getParameterIndex(\n            currentOutputs[i].destination.id\n          );\n        }\n\n        if (\n          particleIndex < 1 ||\n          particleIndex >= currentSetting.particleCount\n        ) {\n          continue;\n        }\n\n        let translation: CubismVector2 = new CubismVector2();\n        translation = currentParticles[particleIndex].position.substract(\n          currentParticles[particleIndex - 1].position\n        );\n\n        outputValue = currentOutputs[i].getValue(\n          translation,\n          currentParticles,\n          particleIndex,\n          currentOutputs[i].reflect,\n          this._options.gravity\n        );\n\n        this._currentRigOutputs.at(settingIndex).outputs.set(i, outputValue);\n        this._previousRigOutputs.at(settingIndex).outputs.set(i, outputValue);\n\n        const destinationParameterIndex: number =\n          currentOutputs[i].destinationParameterIndex;\n\n        const outParameterCaches: Float32Array =\n          !Float32Array.prototype.slice && 'subarray' in Float32Array.prototype\n            ? JSON.parse(\n                JSON.stringify(\n                  parameterValues.subarray(destinationParameterIndex)\n                )\n              ) // 値渡しするため、JSON.parse, JSON.stringify\n            : parameterValues.slice(destinationParameterIndex);\n\n        updateOutputParameterValue(\n          outParameterCaches,\n          parameterMinimumValues[destinationParameterIndex],\n          parameterMaximumValues[destinationParameterIndex],\n          outputValue,\n          currentOutputs[i]\n        );\n\n        // 値を反映\n        for (\n          let offset: number = destinationParameterIndex, outParamIndex = 0;\n          offset < this._parameterCaches.length;\n          offset++, outParamIndex++\n        ) {\n          parameterValues[offset] = this._parameterCaches[offset] =\n            outParameterCaches[outParamIndex];\n        }\n      }\n    }\n  }\n\n  /**\n   * 物理演算の評価\n   *\n   * Pendulum interpolation weights\n   *\n   * 振り子の計算結果は保存され、パラメータへの出力は保存された前回の結果で補間されます。\n   * The result of the pendulum calculation is saved and\n   * the output to the parameters is interpolated with the saved previous result of the pendulum calculation.\n   *\n   * 図で示すと[1]と[2]で補間されます。\n   * The figure shows the interpolation between [1] and [2].\n   *\n   * 補間の重みは最新の振り子計算タイミングと次回のタイミングの間で見た現在時間で決定する。\n   * The weight of the interpolation are determined by the current time seen between\n   * the latest pendulum calculation timing and the next timing.\n   *\n   * 図で示すと[2]と[4]の間でみた(3)の位置の重みになる。\n   * Figure shows the weight of position (3) as seen between [2] and [4].\n   *\n   * 解釈として振り子計算のタイミングと重み計算のタイミングがズレる。\n   * As an interpretation, the pendulum calculation and weights are misaligned.\n   *\n   * physics3.jsonにFPS情報が存在しない場合は常に前の振り子状態で設定される。\n   * If there is no FPS information in physics3.json, it is always set in the previous pendulum state.\n   *\n   * この仕様は補間範囲を逸脱したことが原因の震えたような見た目を回避を目的にしている。\n   * The purpose of this specification is to avoid the quivering appearance caused by deviations from the interpolation range.\n   *\n   * ------------ time -------------->\n   *\n   *                 |+++++|------| <- weight\n   * ==[1]====#=====[2]---(3)----(4)\n   *          ^ output contents\n   *\n   * 1:_previousRigOutputs\n   * 2:_currentRigOutputs\n   * 3:_currentRemainTime (now rendering)\n   * 4:next particles timing\n   * @param model 物理演算の結果を適用するモデル\n   * @param deltaTimeSeconds デルタ時間[秒]\n   */\n  public evaluate(model: CubismModel, deltaTimeSeconds: number): void {\n    let totalAngle: { angle: number };\n    let weight: number;\n    let radAngle: number;\n    let outputValue: number;\n    const totalTranslation: CubismVector2 = new CubismVector2();\n    let currentSetting: CubismPhysicsSubRig;\n    let currentInputs: CubismPhysicsInput[];\n    let currentOutputs: CubismPhysicsOutput[];\n    let currentParticles: CubismPhysicsParticle[];\n\n    if (0.0 >= deltaTimeSeconds) {\n      return;\n    }\n\n    const parameterValues: Float32Array = model.getModel().parameters.values;\n    const parameterMaximumValues: Float32Array =\n      model.getModel().parameters.maximumValues;\n    const parameterMinimumValues: Float32Array =\n      model.getModel().parameters.minimumValues;\n    const parameterDefaultValues: Float32Array =\n      model.getModel().parameters.defaultValues;\n\n    let physicsDeltaTime: number;\n    this._currentRemainTime += deltaTimeSeconds;\n    if (this._currentRemainTime > MaxDeltaTime) {\n      this._currentRemainTime = 0.0;\n    }\n\n    if ((this._parameterCaches?.length ?? 0) < model.getParameterCount()) {\n      this._parameterCaches = new Float32Array(model.getParameterCount());\n    }\n\n    if ((this._parameterInputCaches?.length ?? 0) < model.getParameterCount()) {\n      this._parameterInputCaches = new Float32Array(model.getParameterCount());\n      for (let j = 0; j < model.getParameterCount(); ++j) {\n        this._parameterInputCaches[j] = parameterValues[j];\n      }\n    }\n\n    if (this._physicsRig.fps > 0.0) {\n      physicsDeltaTime = 1.0 / this._physicsRig.fps;\n    } else {\n      physicsDeltaTime = deltaTimeSeconds;\n    }\n\n    while (this._currentRemainTime >= physicsDeltaTime) {\n      // copyRigOutputs _currentRigOutputs to _previousRigOutputs\n      for (\n        let settingIndex = 0;\n        settingIndex < this._physicsRig.subRigCount;\n        ++settingIndex\n      ) {\n        currentSetting = this._physicsRig.settings.at(settingIndex);\n        currentOutputs = this._physicsRig.outputs.get(\n          currentSetting.baseOutputIndex\n        );\n        for (let i = 0; i < currentSetting.outputCount; ++i) {\n          this._previousRigOutputs\n            .at(settingIndex)\n            .outputs.set(\n              i,\n              this._currentRigOutputs.at(settingIndex).outputs.at(i)\n            );\n        }\n      }\n\n      // 入力キャッシュとパラメータで線形補間してUpdateParticlesするタイミングでの入力を計算する。\n      // Calculate the input at the timing to UpdateParticles by linear interpolation with the _parameterInputCache and parameterValue.\n      // _parameterCacheはグループ間での値の伝搬の役割があるので_parameterInputCacheとの分離が必要。\n      // _parameterCache needs to be separated from _parameterInputCache because of its role in propagating values between groups.\n      const inputWeight = physicsDeltaTime / this._currentRemainTime;\n      for (let j = 0; j < model.getParameterCount(); ++j) {\n        this._parameterCaches[j] =\n          this._parameterInputCaches[j] * (1.0 - inputWeight) +\n          parameterValues[j] * inputWeight;\n        this._parameterInputCaches[j] = this._parameterCaches[j];\n      }\n\n      for (\n        let settingIndex = 0;\n        settingIndex < this._physicsRig.subRigCount;\n        ++settingIndex\n      ) {\n        totalAngle = { angle: 0.0 };\n        totalTranslation.x = 0.0;\n        totalTranslation.y = 0.0;\n        currentSetting = this._physicsRig.settings.at(settingIndex);\n        currentInputs = this._physicsRig.inputs.get(\n          currentSetting.baseInputIndex\n        );\n        currentOutputs = this._physicsRig.outputs.get(\n          currentSetting.baseOutputIndex\n        );\n        currentParticles = this._physicsRig.particles.get(\n          currentSetting.baseParticleIndex\n        );\n\n        // Load input parameters\n        for (let i = 0; i < currentSetting.inputCount; ++i) {\n          weight = currentInputs[i].weight / MaximumWeight;\n\n          if (currentInputs[i].sourceParameterIndex == -1) {\n            currentInputs[i].sourceParameterIndex = model.getParameterIndex(\n              currentInputs[i].source.id\n            );\n          }\n\n          currentInputs[i].getNormalizedParameterValue(\n            totalTranslation,\n            totalAngle,\n            this._parameterCaches[currentInputs[i].sourceParameterIndex],\n            parameterMinimumValues[currentInputs[i].sourceParameterIndex],\n            parameterMaximumValues[currentInputs[i].sourceParameterIndex],\n            parameterDefaultValues[currentInputs[i].sourceParameterIndex],\n            currentSetting.normalizationPosition,\n            currentSetting.normalizationAngle,\n            currentInputs[i].reflect,\n            weight\n          );\n        }\n\n        radAngle = CubismMath.degreesToRadian(-totalAngle.angle);\n\n        totalTranslation.x =\n          totalTranslation.x * CubismMath.cos(radAngle) -\n          totalTranslation.y * CubismMath.sin(radAngle);\n        totalTranslation.y =\n          totalTranslation.x * CubismMath.sin(radAngle) +\n          totalTranslation.y * CubismMath.cos(radAngle);\n\n        // Calculate particles position.\n        updateParticles(\n          currentParticles,\n          currentSetting.particleCount,\n          totalTranslation,\n          totalAngle.angle,\n          this._options.wind,\n          MovementThreshold * currentSetting.normalizationPosition.maximum,\n          physicsDeltaTime,\n          AirResistance\n        );\n\n        // Update output parameters.\n        for (let i = 0; i < currentSetting.outputCount; ++i) {\n          const particleIndex = currentOutputs[i].vertexIndex;\n\n          if (currentOutputs[i].destinationParameterIndex == -1) {\n            currentOutputs[i].destinationParameterIndex =\n              model.getParameterIndex(currentOutputs[i].destination.id);\n          }\n\n          if (\n            particleIndex < 1 ||\n            particleIndex >= currentSetting.particleCount\n          ) {\n            continue;\n          }\n\n          const translation: CubismVector2 = new CubismVector2();\n          translation.x =\n            currentParticles[particleIndex].position.x -\n            currentParticles[particleIndex - 1].position.x;\n          translation.y =\n            currentParticles[particleIndex].position.y -\n            currentParticles[particleIndex - 1].position.y;\n\n          outputValue = currentOutputs[i].getValue(\n            translation,\n            currentParticles,\n            particleIndex,\n            currentOutputs[i].reflect,\n            this._options.gravity\n          );\n\n          this._currentRigOutputs.at(settingIndex).outputs.set(i, outputValue);\n\n          const destinationParameterIndex: number =\n            currentOutputs[i].destinationParameterIndex;\n          const outParameterCaches: Float32Array =\n            !Float32Array.prototype.slice &&\n            'subarray' in Float32Array.prototype\n              ? JSON.parse(\n                  JSON.stringify(\n                    this._parameterCaches.subarray(destinationParameterIndex)\n                  )\n                ) // 値渡しするため、JSON.parse, JSON.stringify\n              : this._parameterCaches.slice(destinationParameterIndex);\n\n          updateOutputParameterValue(\n            outParameterCaches,\n            parameterMinimumValues[destinationParameterIndex],\n            parameterMaximumValues[destinationParameterIndex],\n            outputValue,\n            currentOutputs[i]\n          );\n\n          // 値を反映\n          for (\n            let offset: number = destinationParameterIndex, outParamIndex = 0;\n            offset < this._parameterCaches.length;\n            offset++, outParamIndex++\n          ) {\n            this._parameterCaches[offset] = outParameterCaches[outParamIndex];\n          }\n        }\n      }\n      this._currentRemainTime -= physicsDeltaTime;\n    }\n\n    const alpha: number = this._currentRemainTime / physicsDeltaTime;\n    this.interpolate(model, alpha);\n  }\n\n  /**\n   * 物理演算結果の適用\n   * 振り子演算の最新の結果と一つ前の結果から指定した重みで適用する。\n   * @param model 物理演算の結果を適用するモデル\n   * @param weight 最新結果の重み\n   */\n  public interpolate(model: CubismModel, weight: number): void {\n    let currentOutputs: CubismPhysicsOutput[];\n    let currentSetting: CubismPhysicsSubRig;\n    const parameterValues: Float32Array = model.getModel().parameters.values;\n    const parameterMaximumValues: Float32Array =\n      model.getModel().parameters.maximumValues;\n    const parameterMinimumValues: Float32Array =\n      model.getModel().parameters.minimumValues;\n\n    for (\n      let settingIndex = 0;\n      settingIndex < this._physicsRig.subRigCount;\n      ++settingIndex\n    ) {\n      currentSetting = this._physicsRig.settings.at(settingIndex);\n      currentOutputs = this._physicsRig.outputs.get(\n        currentSetting.baseOutputIndex\n      );\n\n      // Load input parameters.\n      for (let i = 0; i < currentSetting.outputCount; ++i) {\n        if (currentOutputs[i].destinationParameterIndex == -1) {\n          continue;\n        }\n\n        const destinationParameterIndex: number =\n          currentOutputs[i].destinationParameterIndex;\n        const outParameterValues: Float32Array =\n          !Float32Array.prototype.slice && 'subarray' in Float32Array.prototype\n            ? JSON.parse(\n                JSON.stringify(\n                  parameterValues.subarray(destinationParameterIndex)\n                )\n              ) // 値渡しするため、JSON.parse, JSON.stringify\n            : parameterValues.slice(destinationParameterIndex);\n\n        updateOutputParameterValue(\n          outParameterValues,\n          parameterMinimumValues[destinationParameterIndex],\n          parameterMaximumValues[destinationParameterIndex],\n          this._previousRigOutputs.at(settingIndex).outputs.at(i) *\n            (1 - weight) +\n            this._currentRigOutputs.at(settingIndex).outputs.at(i) * weight,\n          currentOutputs[i]\n        );\n\n        // 値を反映\n        for (\n          let offset: number = destinationParameterIndex, outParamIndex = 0;\n          offset < parameterValues.length;\n          offset++, outParamIndex++\n        ) {\n          parameterValues[offset] = outParameterValues[outParamIndex];\n        }\n      }\n    }\n  }\n\n  /**\n   * オプションの設定\n   * @param options オプション\n   */\n  public setOptions(options: Options): void {\n    this._options = options;\n  }\n\n  /**\n   * オプションの取得\n   * @return オプション\n   */\n  public getOption(): Options {\n    return this._options;\n  }\n\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    this._physicsRig = null;\n\n    // set default options\n    this._options = new Options();\n    this._options.gravity.y = -1.0;\n    this._options.gravity.x = 0.0;\n    this._options.wind.x = 0.0;\n    this._options.wind.y = 0.0;\n    this._currentRigOutputs = new csmVector<PhysicsOutput>();\n    this._previousRigOutputs = new csmVector<PhysicsOutput>();\n    this._currentRemainTime = 0.0;\n    this._parameterCaches = null;\n    this._parameterInputCaches = null;\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    this._physicsRig = void 0;\n    this._physicsRig = null;\n  }\n\n  /**\n   * 初期化する\n   */\n  public initialize(): void {\n    let strand: CubismPhysicsParticle[];\n    let currentSetting: CubismPhysicsSubRig;\n    let radius: CubismVector2;\n\n    for (\n      let settingIndex = 0;\n      settingIndex < this._physicsRig.subRigCount;\n      ++settingIndex\n    ) {\n      currentSetting = this._physicsRig.settings.at(settingIndex);\n      strand = this._physicsRig.particles.get(currentSetting.baseParticleIndex);\n\n      // Initialize the top of particle.\n      strand[0].initialPosition = new CubismVector2(0.0, 0.0);\n      strand[0].lastPosition = new CubismVector2(\n        strand[0].initialPosition.x,\n        strand[0].initialPosition.y\n      );\n      strand[0].lastGravity = new CubismVector2(0.0, -1.0);\n      strand[0].lastGravity.y *= -1.0;\n      strand[0].velocity = new CubismVector2(0.0, 0.0);\n      strand[0].force = new CubismVector2(0.0, 0.0);\n\n      // Initialize particles.\n      for (let i = 1; i < currentSetting.particleCount; ++i) {\n        radius = new CubismVector2(0.0, 0.0);\n        radius.y = strand[i].radius;\n        strand[i].initialPosition = new CubismVector2(\n          strand[i - 1].initialPosition.x + radius.x,\n          strand[i - 1].initialPosition.y + radius.y\n        );\n        strand[i].position = new CubismVector2(\n          strand[i].initialPosition.x,\n          strand[i].initialPosition.y\n        );\n        strand[i].lastPosition = new CubismVector2(\n          strand[i].initialPosition.x,\n          strand[i].initialPosition.y\n        );\n        strand[i].lastGravity = new CubismVector2(0.0, -1.0);\n        strand[i].lastGravity.y *= -1.0;\n        strand[i].velocity = new CubismVector2(0.0, 0.0);\n        strand[i].force = new CubismVector2(0.0, 0.0);\n      }\n    }\n  }\n\n  _physicsRig: CubismPhysicsRig; // 物理演算のデータ\n  _options: Options; // オプション\n\n  _currentRigOutputs: csmVector<PhysicsOutput>; ///< 最新の振り子計算の結果\n  _previousRigOutputs: csmVector<PhysicsOutput>; ///< 一つ前の振り子計算の結果\n\n  _currentRemainTime: number; ///< 物理演算が処理していない時間\n\n  _parameterCaches: Float32Array; ///< Evaluateで利用するパラメータのキャッシュ\n  _parameterInputCaches: Float32Array; ///< UpdateParticlesが動くときの入力をキャッシュ\n}\n\n/**\n * 物理演算のオプション\n */\nexport class Options {\n  constructor() {\n    this.gravity = new CubismVector2(0, 0);\n    this.wind = new CubismVector2(0, 0);\n  }\n\n  gravity: CubismVector2; // 重力方向\n  wind: CubismVector2; // 風の方向\n}\n\n/**\n * パラメータに適用する前の物理演算の出力結果\n */\nexport class PhysicsOutput {\n  constructor() {\n    this.outputs = new csmVector<number>(0);\n  }\n\n  outputs: csmVector<number>; // 物理演算出力結果\n}\n\n/**\n * Gets sign.\n *\n * @param value Evaluation target value.\n *\n * @return Sign of value.\n */\nfunction sign(value: number): number {\n  let ret = 0;\n\n  if (value > 0.0) {\n    ret = 1;\n  } else if (value < 0.0) {\n    ret = -1;\n  }\n\n  return ret;\n}\n\nfunction getInputTranslationXFromNormalizedParameterValue(\n  targetTranslation: CubismVector2,\n  targetAngle: { angle: number },\n  value: number,\n  parameterMinimumValue: number,\n  parameterMaximumValue: number,\n  parameterDefaultValue: number,\n  normalizationPosition: CubismPhysicsNormalization,\n  normalizationAngle: CubismPhysicsNormalization,\n  isInverted: boolean,\n  weight: number\n): void {\n  targetTranslation.x +=\n    normalizeParameterValue(\n      value,\n      parameterMinimumValue,\n      parameterMaximumValue,\n      parameterDefaultValue,\n      normalizationPosition.minimum,\n      normalizationPosition.maximum,\n      normalizationPosition.defalut,\n      isInverted\n    ) * weight;\n}\n\nfunction getInputTranslationYFromNormalizedParamterValue(\n  targetTranslation: CubismVector2,\n  targetAngle: { angle: number },\n  value: number,\n  parameterMinimumValue: number,\n  parameterMaximumValue: number,\n  parameterDefaultValue: number,\n  normalizationPosition: CubismPhysicsNormalization,\n  normalizationAngle: CubismPhysicsNormalization,\n  isInverted: boolean,\n  weight: number\n): void {\n  targetTranslation.y +=\n    normalizeParameterValue(\n      value,\n      parameterMinimumValue,\n      parameterMaximumValue,\n      parameterDefaultValue,\n      normalizationPosition.minimum,\n      normalizationPosition.maximum,\n      normalizationPosition.defalut,\n      isInverted\n    ) * weight;\n}\n\nfunction getInputAngleFromNormalizedParameterValue(\n  targetTranslation: CubismVector2,\n  targetAngle: { angle: number },\n  value: number,\n  parameterMinimumValue: number,\n  parameterMaximumValue: number,\n  parameterDefaultValue: number,\n  normalizaitionPosition: CubismPhysicsNormalization,\n  normalizationAngle: CubismPhysicsNormalization,\n  isInverted: boolean,\n  weight: number\n): void {\n  targetAngle.angle +=\n    normalizeParameterValue(\n      value,\n      parameterMinimumValue,\n      parameterMaximumValue,\n      parameterDefaultValue,\n      normalizationAngle.minimum,\n      normalizationAngle.maximum,\n      normalizationAngle.defalut,\n      isInverted\n    ) * weight;\n}\n\nfunction getOutputTranslationX(\n  translation: CubismVector2,\n  particles: CubismPhysicsParticle[],\n  particleIndex: number,\n  isInverted: boolean,\n  parentGravity: CubismVector2\n): number {\n  let outputValue: number = translation.x;\n\n  if (isInverted) {\n    outputValue *= -1.0;\n  }\n\n  return outputValue;\n}\n\nfunction getOutputTranslationY(\n  translation: CubismVector2,\n  particles: CubismPhysicsParticle[],\n  particleIndex: number,\n  isInverted: boolean,\n  parentGravity: CubismVector2\n): number {\n  let outputValue: number = translation.y;\n\n  if (isInverted) {\n    outputValue *= -1.0;\n  }\n  return outputValue;\n}\n\nfunction getOutputAngle(\n  translation: CubismVector2,\n  particles: CubismPhysicsParticle[],\n  particleIndex: number,\n  isInverted: boolean,\n  parentGravity: CubismVector2\n): number {\n  let outputValue: number;\n\n  if (particleIndex >= 2) {\n    parentGravity = particles[particleIndex - 1].position.substract(\n      particles[particleIndex - 2].position\n    );\n  } else {\n    parentGravity = parentGravity.multiplyByScaler(-1.0);\n  }\n\n  outputValue = CubismMath.directionToRadian(parentGravity, translation);\n\n  if (isInverted) {\n    outputValue *= -1.0;\n  }\n\n  return outputValue;\n}\n\nfunction getRangeValue(min: number, max: number): number {\n  const maxValue: number = CubismMath.max(min, max);\n  const minValue: number = CubismMath.min(min, max);\n\n  return CubismMath.abs(maxValue - minValue);\n}\n\nfunction getDefaultValue(min: number, max: number): number {\n  const minValue: number = CubismMath.min(min, max);\n  return minValue + getRangeValue(min, max) / 2.0;\n}\n\nfunction getOutputScaleTranslationX(\n  translationScale: CubismVector2,\n  angleScale: number\n): number {\n  return JSON.parse(JSON.stringify(translationScale.x));\n}\n\nfunction getOutputScaleTranslationY(\n  translationScale: CubismVector2,\n  angleScale: number\n): number {\n  return JSON.parse(JSON.stringify(translationScale.y));\n}\n\nfunction getOutputScaleAngle(\n  translationScale: CubismVector2,\n  angleScale: number\n): number {\n  return JSON.parse(JSON.stringify(angleScale));\n}\n\n/**\n * Updates particles.\n *\n * @param strand                Target array of particle.\n * @param strandCount           Count of particle.\n * @param totalTranslation      Total translation value.\n * @param totalAngle            Total angle.\n * @param windDirection         Direction of Wind.\n * @param thresholdValue        Threshold of movement.\n * @param deltaTimeSeconds      Delta time.\n * @param airResistance         Air resistance.\n */\nfunction updateParticles(\n  strand: CubismPhysicsParticle[],\n  strandCount: number,\n  totalTranslation: CubismVector2,\n  totalAngle: number,\n  windDirection: CubismVector2,\n  thresholdValue: number,\n  deltaTimeSeconds: number,\n  airResistance: number\n) {\n  let delay: number;\n  let radian: number;\n  let direction: CubismVector2 = new CubismVector2(0.0, 0.0);\n  let velocity: CubismVector2 = new CubismVector2(0.0, 0.0);\n  let force: CubismVector2 = new CubismVector2(0.0, 0.0);\n  let newDirection: CubismVector2 = new CubismVector2(0.0, 0.0);\n\n  strand[0].position = new CubismVector2(\n    totalTranslation.x,\n    totalTranslation.y\n  );\n\n  const totalRadian: number = CubismMath.degreesToRadian(totalAngle);\n  const currentGravity: CubismVector2 =\n    CubismMath.radianToDirection(totalRadian);\n  currentGravity.normalize();\n\n  for (let i = 1; i < strandCount; ++i) {\n    strand[i].force = currentGravity\n      .multiplyByScaler(strand[i].acceleration)\n      .add(windDirection);\n\n    strand[i].lastPosition = new CubismVector2(\n      strand[i].position.x,\n      strand[i].position.y\n    );\n\n    delay = strand[i].delay * deltaTimeSeconds * 30.0;\n\n    direction = strand[i].position.substract(strand[i - 1].position);\n\n    radian =\n      CubismMath.directionToRadian(strand[i].lastGravity, currentGravity) /\n      airResistance;\n\n    direction.x =\n      CubismMath.cos(radian) * direction.x -\n      direction.y * CubismMath.sin(radian);\n    direction.y =\n      CubismMath.sin(radian) * direction.x +\n      direction.y * CubismMath.cos(radian);\n\n    strand[i].position = strand[i - 1].position.add(direction);\n\n    velocity = strand[i].velocity.multiplyByScaler(delay);\n    force = strand[i].force.multiplyByScaler(delay).multiplyByScaler(delay);\n\n    strand[i].position = strand[i].position.add(velocity).add(force);\n\n    newDirection = strand[i].position.substract(strand[i - 1].position);\n    newDirection.normalize();\n\n    strand[i].position = strand[i - 1].position.add(\n      newDirection.multiplyByScaler(strand[i].radius)\n    );\n\n    if (CubismMath.abs(strand[i].position.x) < thresholdValue) {\n      strand[i].position.x = 0.0;\n    }\n\n    if (delay != 0.0) {\n      strand[i].velocity = strand[i].position.substract(strand[i].lastPosition);\n      strand[i].velocity = strand[i].velocity.divisionByScalar(delay);\n      strand[i].velocity = strand[i].velocity.multiplyByScaler(\n        strand[i].mobility\n      );\n    }\n\n    strand[i].force = new CubismVector2(0.0, 0.0);\n    strand[i].lastGravity = new CubismVector2(\n      currentGravity.x,\n      currentGravity.y\n    );\n  }\n}\n\n/**\n * Updates particles for stabilization.\n *\n * @param strand                Target array of particle.\n * @param strandCount           Count of particle.\n * @param totalTranslation      Total translation value.\n * @param totalAngle            Total angle.\n * @param windDirection         Direction of Wind.\n * @param thresholdValue        Threshold of movement.\n */\nfunction updateParticlesForStabilization(\n  strand: CubismPhysicsParticle[],\n  strandCount: number,\n  totalTranslation: CubismVector2,\n  totalAngle: number,\n  windDirection: CubismVector2,\n  thresholdValue: number\n) {\n  let force: CubismVector2 = new CubismVector2(0.0, 0.0);\n\n  strand[0].position = new CubismVector2(\n    totalTranslation.x,\n    totalTranslation.y\n  );\n\n  const totalRadian: number = CubismMath.degreesToRadian(totalAngle);\n  const currentGravity: CubismVector2 =\n    CubismMath.radianToDirection(totalRadian);\n  currentGravity.normalize();\n\n  for (let i = 1; i < strandCount; ++i) {\n    strand[i].force = currentGravity\n      .multiplyByScaler(strand[i].acceleration)\n      .add(windDirection);\n\n    strand[i].lastPosition = new CubismVector2(\n      strand[i].position.x,\n      strand[i].position.y\n    );\n\n    strand[i].velocity = new CubismVector2(0.0, 0.0);\n    force = strand[i].force;\n    force.normalize();\n\n    force = force.multiplyByScaler(strand[i].radius);\n    strand[i].position = strand[i - 1].position.add(force);\n\n    if (CubismMath.abs(strand[i].position.x) < thresholdValue) {\n      strand[i].position.x = 0.0;\n    }\n\n    strand[i].force = new CubismVector2(0.0, 0.0);\n    strand[i].lastGravity = new CubismVector2(\n      currentGravity.x,\n      currentGravity.y\n    );\n  }\n}\n\n/**\n * Updates output parameter value.\n * @param parameterValue            Target parameter value.\n * @param parameterValueMinimum     Minimum of parameter value.\n * @param parameterValueMaximum     Maximum of parameter value.\n * @param translation               Translation value.\n */\nfunction updateOutputParameterValue(\n  parameterValue: Float32Array,\n  parameterValueMinimum: number,\n  parameterValueMaximum: number,\n  translation: number,\n  output: CubismPhysicsOutput\n): void {\n  let value: number;\n  const outputScale: number = output.getScale(\n    output.translationScale,\n    output.angleScale\n  );\n\n  value = translation * outputScale;\n\n  if (value < parameterValueMinimum) {\n    if (value < output.valueBelowMinimum) {\n      output.valueBelowMinimum = value;\n    }\n\n    value = parameterValueMinimum;\n  } else if (value > parameterValueMaximum) {\n    if (value > output.valueExceededMaximum) {\n      output.valueExceededMaximum = value;\n    }\n\n    value = parameterValueMaximum;\n  }\n\n  const weight: number = output.weight / MaximumWeight;\n\n  if (weight >= 1.0) {\n    parameterValue[0] = value;\n  } else {\n    value = parameterValue[0] * (1.0 - weight) + value * weight;\n    parameterValue[0] = value;\n  }\n}\n\nfunction normalizeParameterValue(\n  value: number,\n  parameterMinimum: number,\n  parameterMaximum: number,\n  parameterDefault: number,\n  normalizedMinimum: number,\n  normalizedMaximum: number,\n  normalizedDefault: number,\n  isInverted: boolean\n) {\n  let result = 0.0;\n\n  const maxValue: number = CubismMath.max(parameterMaximum, parameterMinimum);\n\n  if (maxValue < value) {\n    value = maxValue;\n  }\n\n  const minValue: number = CubismMath.min(parameterMaximum, parameterMinimum);\n\n  if (minValue > value) {\n    value = minValue;\n  }\n\n  const minNormValue: number = CubismMath.min(\n    normalizedMinimum,\n    normalizedMaximum\n  );\n  const maxNormValue: number = CubismMath.max(\n    normalizedMinimum,\n    normalizedMaximum\n  );\n  const middleNormValue: number = normalizedDefault;\n\n  const middleValue: number = getDefaultValue(minValue, maxValue);\n  const paramValue: number = value - middleValue;\n\n  switch (sign(paramValue)) {\n    case 1: {\n      const nLength: number = maxNormValue - middleNormValue;\n      const pLength: number = maxValue - middleValue;\n\n      if (pLength != 0.0) {\n        result = paramValue * (nLength / pLength);\n        result += middleNormValue;\n      }\n\n      break;\n    }\n    case -1: {\n      const nLength: number = minNormValue - middleNormValue;\n      const pLength: number = minValue - middleValue;\n\n      if (pLength != 0.0) {\n        result = paramValue * (nLength / pLength);\n        result += middleNormValue;\n      }\n\n      break;\n    }\n    case 0: {\n      result = middleNormValue;\n\n      break;\n    }\n    default: {\n      break;\n    }\n  }\n\n  return isInverted ? result : result * -1.0;\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismphysics';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismPhysics = $.CubismPhysics;\n  export type CubismPhysics = $.CubismPhysics;\n  export const Options = $.Options;\n  export type Options = $.Options;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { Constant } from '../live2dcubismframework';\nimport { csmVector } from '../type/csmvector';\nimport { csmRect } from '../type/csmrectf';\nimport { CubismMatrix44 } from '../math/cubismmatrix44';\nimport { CubismModel } from '../model/cubismmodel';\nimport { CubismClippingContext, CubismTextureColor } from './cubismrenderer';\nimport { CubismLogError, CubismLogWarning } from '../utils/cubismdebug';\n\nconst ColorChannelCount = 4; // 実験時に1チャンネルの場合は1、RGBだけの場合は3、アルファも含める場合は4\nconst ClippingMaskMaxCountOnDefault = 36; // 通常のフレームバッファ一枚あたりのマスク最大数\nconst ClippingMaskMaxCountOnMultiRenderTexture = 32; // フレームバッファが2枚以上ある場合のフレームバッファ一枚あたりのマスク最大数\n\nexport type ClippingContextConstructor<\n  T_ClippingContext extends CubismClippingContext\n> = new (\n  manager: CubismClippingManager<T_ClippingContext>,\n  drawableMasks: Int32Array,\n  drawableMaskCounts: number\n) => T_ClippingContext;\n\nexport interface ICubismClippingManager {\n  getClippingMaskBufferSize(): number;\n}\n\nexport abstract class CubismClippingManager<\n  T_ClippingContext extends CubismClippingContext\n> implements ICubismClippingManager\n{\n  /**\n   * コンストラクタ\n   */\n  public constructor(\n    clippingContextFactory: ClippingContextConstructor<T_ClippingContext>\n  ) {\n    this._renderTextureCount = 0;\n    this._clippingMaskBufferSize = 256;\n    this._clippingContextListForMask = new csmVector<T_ClippingContext>();\n    this._clippingContextListForDraw = new csmVector<T_ClippingContext>();\n    this._channelColors = new csmVector<CubismTextureColor>();\n    this._tmpBoundsOnModel = new csmRect();\n    this._tmpMatrix = new CubismMatrix44();\n    this._tmpMatrixForMask = new CubismMatrix44();\n    this._tmpMatrixForDraw = new CubismMatrix44();\n\n    this._clippingContexttConstructor = clippingContextFactory;\n\n    let tmp: CubismTextureColor = new CubismTextureColor();\n    tmp.r = 1.0;\n    tmp.g = 0.0;\n    tmp.b = 0.0;\n    tmp.a = 0.0;\n    this._channelColors.pushBack(tmp);\n\n    tmp = new CubismTextureColor();\n    tmp.r = 0.0;\n    tmp.g = 1.0;\n    tmp.b = 0.0;\n    tmp.a = 0.0;\n    this._channelColors.pushBack(tmp);\n\n    tmp = new CubismTextureColor();\n    tmp.r = 0.0;\n    tmp.g = 0.0;\n    tmp.b = 1.0;\n    tmp.a = 0.0;\n    this._channelColors.pushBack(tmp);\n\n    tmp = new CubismTextureColor();\n    tmp.r = 0.0;\n    tmp.g = 0.0;\n    tmp.b = 0.0;\n    tmp.a = 1.0;\n    this._channelColors.pushBack(tmp);\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    for (let i = 0; i < this._clippingContextListForMask.getSize(); i++) {\n      if (this._clippingContextListForMask.at(i)) {\n        this._clippingContextListForMask.at(i).release();\n        this._clippingContextListForMask.set(i, void 0);\n      }\n      this._clippingContextListForMask.set(i, null);\n    }\n    this._clippingContextListForMask = null;\n\n    // _clippingContextListForDrawは_clippingContextListForMaskにあるインスタンスを指している。上記の処理により要素ごとのDELETEは不要。\n    for (let i = 0; i < this._clippingContextListForDraw.getSize(); i++) {\n      this._clippingContextListForDraw.set(i, null);\n    }\n    this._clippingContextListForDraw = null;\n\n    for (let i = 0; i < this._channelColors.getSize(); i++) {\n      this._channelColors.set(i, null);\n    }\n\n    this._channelColors = null;\n\n    if (this._clearedFrameBufferFlags != null) {\n      this._clearedFrameBufferFlags.clear();\n    }\n    this._clearedFrameBufferFlags = null;\n  }\n\n  /**\n   * マネージャの初期化処理\n   * クリッピングマスクを使う描画オブジェクトの登録を行う\n   * @param model モデルのインスタンス\n   * @param renderTextureCount バッファの生成数\n   */\n  public initialize(model: CubismModel, renderTextureCount: number): void {\n    // レンダーテクスチャの合計枚数の設定\n    // 1以上の整数でない場合はそれぞれ警告を出す\n    if (renderTextureCount % 1 != 0) {\n      CubismLogWarning(\n        'The number of render textures must be specified as an integer. The decimal point is rounded down and corrected to an integer.'\n      );\n      // 小数点以下を除去\n      renderTextureCount = ~~renderTextureCount;\n    }\n    if (renderTextureCount < 1) {\n      CubismLogWarning(\n        'The number of render textures must be an integer greater than or equal to 1. Set the number of render textures to 1.'\n      );\n    }\n    // 負の値が使われている場合は強制的に1枚と設定する\n    this._renderTextureCount = renderTextureCount < 1 ? 1 : renderTextureCount;\n\n    this._clearedFrameBufferFlags = new csmVector<boolean>(\n      this._renderTextureCount\n    );\n\n    // クリッピングマスクを使う描画オブジェクトをすべて登録する\n    // クリッピングマスクは、通常数個程度に限定して使うものとする\n    for (let i = 0; i < model.getDrawableCount(); i++) {\n      if (model.getDrawableMaskCounts()[i] <= 0) {\n        // クリッピングマスクが使用されていないアートメッシュ（多くの場合使用しない）\n        this._clippingContextListForDraw.pushBack(null);\n        continue;\n      }\n\n      // 既にあるClipContextと同じかチェックする\n      let clippingContext: T_ClippingContext = this.findSameClip(\n        model.getDrawableMasks()[i],\n        model.getDrawableMaskCounts()[i]\n      );\n      if (clippingContext == null) {\n        // 同一のマスクが存在していない場合は生成する\n\n        clippingContext = new this._clippingContexttConstructor(\n          this,\n          model.getDrawableMasks()[i],\n          model.getDrawableMaskCounts()[i]\n        );\n        this._clippingContextListForMask.pushBack(clippingContext);\n      }\n\n      clippingContext.addClippedDrawable(i);\n\n      this._clippingContextListForDraw.pushBack(clippingContext);\n    }\n  }\n\n  /**\n   * 既にマスクを作っているかを確認\n   * 作っている様であれば該当するクリッピングマスクのインスタンスを返す\n   * 作っていなければNULLを返す\n   * @param drawableMasks 描画オブジェクトをマスクする描画オブジェクトのリスト\n   * @param drawableMaskCounts 描画オブジェクトをマスクする描画オブジェクトの数\n   * @return 該当するクリッピングマスクが存在すればインスタンスを返し、なければNULLを返す\n   */\n  public findSameClip(\n    drawableMasks: Int32Array,\n    drawableMaskCounts: number\n  ): T_ClippingContext {\n    // 作成済みClippingContextと一致するか確認\n    for (let i = 0; i < this._clippingContextListForMask.getSize(); i++) {\n      const clippingContext: T_ClippingContext =\n        this._clippingContextListForMask.at(i);\n      const count: number = clippingContext._clippingIdCount;\n\n      // 個数が違う場合は別物\n      if (count != drawableMaskCounts) {\n        continue;\n      }\n\n      let sameCount = 0;\n\n      // 同じIDを持つか確認。配列の数が同じなので、一致した個数が同じなら同じ物を持つとする\n      for (let j = 0; j < count; j++) {\n        const clipId: number = clippingContext._clippingIdList[j];\n\n        for (let k = 0; k < count; k++) {\n          if (drawableMasks[k] == clipId) {\n            sameCount++;\n            break;\n          }\n        }\n      }\n\n      if (sameCount == count) {\n        return clippingContext;\n      }\n    }\n\n    return null; // 見つからなかった\n  }\n\n  /**\n   * 高精細マスク処理用の行列を計算する\n   * @param model モデルのインスタンス\n   * @param isRightHanded 処理が右手系であるか\n   */\n  public setupMatrixForHighPrecision(\n    model: CubismModel,\n    isRightHanded: boolean\n  ): void {\n    // 全てのクリッピングを用意する\n    // 同じクリップ（複数の場合はまとめて一つのクリップ）を使う場合は1度だけ設定する\n    let usingClipCount = 0;\n    for (\n      let clipIndex = 0;\n      clipIndex < this._clippingContextListForMask.getSize();\n      clipIndex++\n    ) {\n      // １つのクリッピングマスクに関して\n      const cc: T_ClippingContext =\n        this._clippingContextListForMask.at(clipIndex);\n\n      // このクリップを利用する描画オブジェクト群全体を囲む矩形を計算\n      this.calcClippedDrawTotalBounds(model, cc);\n\n      if (cc._isUsing) {\n        usingClipCount++; // 使用中としてカウント\n      }\n    }\n\n    // マスク行列作成処理\n    if (usingClipCount > 0) {\n      this.setupLayoutBounds(0);\n\n      // サイズがレンダーテクスチャの枚数と合わない場合は合わせる\n      if (this._clearedFrameBufferFlags.getSize() != this._renderTextureCount) {\n        this._clearedFrameBufferFlags.clear();\n        for (let i = 0; i < this._renderTextureCount; i++) {\n          this._clearedFrameBufferFlags.pushBack(false);\n        }\n      } else {\n        // マスクのクリアフラグを毎フレーム開始時に初期化\n        for (let i = 0; i < this._renderTextureCount; i++) {\n          this._clearedFrameBufferFlags.set(i, false);\n        }\n      }\n\n      // 実際にマスクを生成する\n      // 全てのマスクをどの様にレイアウトして描くかを決定し、ClipContext , ClippedDrawContext に記憶する\n      for (\n        let clipIndex = 0;\n        clipIndex < this._clippingContextListForMask.getSize();\n        clipIndex++\n      ) {\n        // --- 実際に１つのマスクを描く ---\n        const clipContext: T_ClippingContext =\n          this._clippingContextListForMask.at(clipIndex);\n        const allClippedDrawRect: csmRect = clipContext._allClippedDrawRect; //このマスクを使う、全ての描画オブジェクトの論理座標上の囲み矩形\n        const layoutBoundsOnTex01 = clipContext._layoutBounds; //この中にマスクを収める\n        const margin = 0.05;\n        let scaleX = 0.0;\n        let scaleY = 0.0;\n        const ppu: number = model.getPixelsPerUnit();\n        const maskPixelSize: number = clipContext\n          .getClippingManager()\n          .getClippingMaskBufferSize();\n        const physicalMaskWidth: number =\n          layoutBoundsOnTex01.width * maskPixelSize;\n        const physicalMaskHeight: number =\n          layoutBoundsOnTex01.height * maskPixelSize;\n\n        this._tmpBoundsOnModel.setRect(allClippedDrawRect);\n        if (this._tmpBoundsOnModel.width * ppu > physicalMaskWidth) {\n          this._tmpBoundsOnModel.expand(allClippedDrawRect.width * margin, 0.0);\n          scaleX = layoutBoundsOnTex01.width / this._tmpBoundsOnModel.width;\n        } else {\n          scaleX = ppu / physicalMaskWidth;\n        }\n\n        if (this._tmpBoundsOnModel.height * ppu > physicalMaskHeight) {\n          this._tmpBoundsOnModel.expand(\n            0.0,\n            allClippedDrawRect.height * margin\n          );\n          scaleY = layoutBoundsOnTex01.height / this._tmpBoundsOnModel.height;\n        } else {\n          scaleY = ppu / physicalMaskHeight;\n        }\n\n        // マスク生成時に使う行列を求める\n        this.createMatrixForMask(\n          isRightHanded,\n          layoutBoundsOnTex01,\n          scaleX,\n          scaleY\n        );\n\n        clipContext._matrixForMask.setMatrix(this._tmpMatrixForMask.getArray());\n        clipContext._matrixForDraw.setMatrix(this._tmpMatrixForDraw.getArray());\n      }\n    }\n  }\n\n  /**\n   * マスク作成・描画用の行列を作成する。\n   * @param isRightHanded 座標を右手系として扱うかを指定\n   * @param layoutBoundsOnTex01 マスクを収める領域\n   * @param scaleX 描画オブジェクトの伸縮率\n   * @param scaleY 描画オブジェクトの伸縮率\n   */\n  public createMatrixForMask(\n    isRightHanded: boolean,\n    layoutBoundsOnTex01: csmRect,\n    scaleX: number,\n    scaleY: number\n  ): void {\n    this._tmpMatrix.loadIdentity();\n    {\n      // Layout0..1 を -1..1に変換\n      this._tmpMatrix.translateRelative(-1.0, -1.0);\n      this._tmpMatrix.scaleRelative(2.0, 2.0);\n    }\n    {\n      // view to Layout0..1\n      this._tmpMatrix.translateRelative(\n        layoutBoundsOnTex01.x,\n        layoutBoundsOnTex01.y\n      ); //new = [translate]\n      this._tmpMatrix.scaleRelative(scaleX, scaleY); //new = [translate][scale]\n      this._tmpMatrix.translateRelative(\n        -this._tmpBoundsOnModel.x,\n        -this._tmpBoundsOnModel.y\n      ); //new = [translate][scale][translate]\n    }\n    // tmpMatrixForMask が計算結果\n    this._tmpMatrixForMask.setMatrix(this._tmpMatrix.getArray());\n\n    this._tmpMatrix.loadIdentity();\n    {\n      this._tmpMatrix.translateRelative(\n        layoutBoundsOnTex01.x,\n        layoutBoundsOnTex01.y * (isRightHanded ? -1.0 : 1.0)\n      ); //new = [translate]\n      this._tmpMatrix.scaleRelative(\n        scaleX,\n        scaleY * (isRightHanded ? -1.0 : 1.0)\n      ); //new = [translate][scale]\n      this._tmpMatrix.translateRelative(\n        -this._tmpBoundsOnModel.x,\n        -this._tmpBoundsOnModel.y\n      ); //new = [translate][scale][translate]\n    }\n\n    this._tmpMatrixForDraw.setMatrix(this._tmpMatrix.getArray());\n  }\n\n  /**\n   * クリッピングコンテキストを配置するレイアウト\n   * 指定された数のレンダーテクスチャを極力いっぱいに使ってマスクをレイアウトする\n   * マスクグループの数が4以下ならRGBA各チャンネルに一つずつマスクを配置し、5以上6以下ならRGBAを2,2,1,1と配置する。\n   *\n   * @param usingClipCount 配置するクリッピングコンテキストの数\n   */\n  public setupLayoutBounds(usingClipCount: number): void {\n    const useClippingMaskMaxCount =\n      this._renderTextureCount <= 1\n        ? ClippingMaskMaxCountOnDefault\n        : ClippingMaskMaxCountOnMultiRenderTexture * this._renderTextureCount;\n\n    if (usingClipCount <= 0 || usingClipCount > useClippingMaskMaxCount) {\n      if (usingClipCount > useClippingMaskMaxCount) {\n        // マスクの制限数の警告を出す\n        CubismLogError(\n          'not supported mask count : {0}\\n[Details] render texture count : {1}, mask count : {2}',\n          usingClipCount - useClippingMaskMaxCount,\n          this._renderTextureCount,\n          usingClipCount\n        );\n      }\n      // この場合は一つのマスクターゲットを毎回クリアして使用する\n      for (\n        let index = 0;\n        index < this._clippingContextListForMask.getSize();\n        index++\n      ) {\n        const clipContext: T_ClippingContext =\n          this._clippingContextListForMask.at(index);\n        clipContext._layoutChannelIndex = 0; // どうせ毎回消すので固定\n        clipContext._layoutBounds.x = 0.0;\n        clipContext._layoutBounds.y = 0.0;\n        clipContext._layoutBounds.width = 1.0;\n        clipContext._layoutBounds.height = 1.0;\n        clipContext._bufferIndex = 0;\n      }\n      return;\n    }\n\n    // レンダーテクスチャが1枚なら9分割する（最大36枚）\n    const layoutCountMaxValue = this._renderTextureCount <= 1 ? 9 : 8;\n\n    // 指定された数のレンダーテクスチャを極力いっぱいに使ってマスクをレイアウトする（デフォルトなら1）。\n    // マスクグループの数が4以下ならRGBA各チャンネルに1つずつマスクを配置し、5以上6以下ならRGBAを2,2,1,1と配置する。\n    let countPerSheetDiv: number = usingClipCount / this._renderTextureCount; // レンダーテクスチャ1枚あたり何枚割り当てるか。\n    const reduceLayoutTextureCount: number =\n      usingClipCount % this._renderTextureCount; // レイアウトの数を1枚減らすレンダーテクスチャの数（この数だけのレンダーテクスチャが対象）。\n\n    // 1枚に割り当てるマスクの分割数を取りたいため、小数点は切り上げる\n    countPerSheetDiv = Math.ceil(countPerSheetDiv);\n\n    // RGBAを順番に使っていく\n    let divCount: number = countPerSheetDiv / ColorChannelCount; // 1チャンネルに配置する基本のマスク\n    const modCount: number = countPerSheetDiv % ColorChannelCount; // 余り、この番号のチャンネルまでに一つずつ配分する（インデックスではない）\n\n    // 小数点は切り捨てる\n    divCount = ~~divCount;\n\n    // RGBAそれぞれのチャンネルを用意していく（0:R, 1:G, 2:B, 3:A）\n    let curClipIndex = 0; // 順番に設定していく\n\n    for (\n      let renderTextureIndex = 0;\n      renderTextureIndex < this._renderTextureCount;\n      renderTextureIndex++\n    ) {\n      for (\n        let channelIndex = 0;\n        channelIndex < ColorChannelCount;\n        channelIndex++\n      ) {\n        // このチャンネルにレイアウトする数\n        // NOTE: レイアウト数 = 1チャンネルに配置する基本のマスク + 余りのマスクを置くチャンネルなら1つ追加\n        let layoutCount: number = divCount + (channelIndex < modCount ? 1 : 0);\n\n        // レイアウトの数を1枚減らす場合にそれを行うチャンネルを決定\n        // divが0の時は正常なインデックスの範囲内になるように調整\n        const checkChannelIndex = modCount + (divCount < 1 ? -1 : 0);\n\n        // 今回が対象のチャンネルかつ、レイアウトの数を1枚減らすレンダーテクスチャが存在する場合\n        if (channelIndex == checkChannelIndex && reduceLayoutTextureCount > 0) {\n          // 現在のレンダーテクスチャが、対象のレンダーテクスチャであればレイアウトの数を1枚減らす。\n          layoutCount -= !(renderTextureIndex < reduceLayoutTextureCount)\n            ? 1\n            : 0;\n        }\n\n        // 分割方法を決定する\n        if (layoutCount == 0) {\n          // 何もしない\n        } else if (layoutCount == 1) {\n          // 全てをそのまま使う\n          const clipContext: T_ClippingContext =\n            this._clippingContextListForMask.at(curClipIndex++);\n          clipContext._layoutChannelIndex = channelIndex;\n          clipContext._layoutBounds.x = 0.0;\n          clipContext._layoutBounds.y = 0.0;\n          clipContext._layoutBounds.width = 1.0;\n          clipContext._layoutBounds.height = 1.0;\n          clipContext._bufferIndex = renderTextureIndex;\n        } else if (layoutCount == 2) {\n          for (let i = 0; i < layoutCount; i++) {\n            let xpos: number = i % 2;\n\n            // 小数点は切り捨てる\n            xpos = ~~xpos;\n\n            const cc: T_ClippingContext = this._clippingContextListForMask.at(\n              curClipIndex++\n            );\n            cc._layoutChannelIndex = channelIndex;\n\n            // UVを2つに分解して使う\n            cc._layoutBounds.x = xpos * 0.5;\n            cc._layoutBounds.y = 0.0;\n            cc._layoutBounds.width = 0.5;\n            cc._layoutBounds.height = 1.0;\n            cc._bufferIndex = renderTextureIndex;\n          }\n        } else if (layoutCount <= 4) {\n          // 4分割して使う\n          for (let i = 0; i < layoutCount; i++) {\n            let xpos: number = i % 2;\n            let ypos: number = i / 2;\n\n            // 小数点は切り捨てる\n            xpos = ~~xpos;\n            ypos = ~~ypos;\n\n            const cc = this._clippingContextListForMask.at(curClipIndex++);\n            cc._layoutChannelIndex = channelIndex;\n\n            cc._layoutBounds.x = xpos * 0.5;\n            cc._layoutBounds.y = ypos * 0.5;\n            cc._layoutBounds.width = 0.5;\n            cc._layoutBounds.height = 0.5;\n            cc._bufferIndex = renderTextureIndex;\n          }\n        } else if (layoutCount <= layoutCountMaxValue) {\n          // 9分割して使う\n          for (let i = 0; i < layoutCount; i++) {\n            let xpos = i % 3;\n            let ypos = i / 3;\n\n            // 小数点は切り捨てる\n            xpos = ~~xpos;\n            ypos = ~~ypos;\n\n            const cc: T_ClippingContext = this._clippingContextListForMask.at(\n              curClipIndex++\n            );\n            cc._layoutChannelIndex = channelIndex;\n\n            cc._layoutBounds.x = xpos / 3.0;\n            cc._layoutBounds.y = ypos / 3.0;\n            cc._layoutBounds.width = 1.0 / 3.0;\n            cc._layoutBounds.height = 1.0 / 3.0;\n            cc._bufferIndex = renderTextureIndex;\n          }\n        } else {\n          // マスクの制限枚数を超えた場合の処理\n          CubismLogError(\n            'not supported mask count : {0}\\n[Details] render texture count : {1}, mask count : {2}',\n            usingClipCount - useClippingMaskMaxCount,\n            this._renderTextureCount,\n            usingClipCount\n          );\n\n          // SetupShaderProgramでオーバーアクセスが発生するので仮で数値を入れる\n          // もちろん描画結果は正しいものではなくなる\n          for (let index = 0; index < layoutCount; index++) {\n            const cc: T_ClippingContext = this._clippingContextListForMask.at(\n              curClipIndex++\n            );\n\n            cc._layoutChannelIndex = 0;\n\n            cc._layoutBounds.x = 0.0;\n            cc._layoutBounds.y = 0.0;\n            cc._layoutBounds.width = 1.0;\n            cc._layoutBounds.height = 1.0;\n            cc._bufferIndex = 0;\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * マスクされる描画オブジェクト群全体を囲む矩形（モデル座標系）を計算する\n   * @param model モデルのインスタンス\n   * @param clippingContext クリッピングマスクのコンテキスト\n   */\n  public calcClippedDrawTotalBounds(\n    model: CubismModel,\n    clippingContext: T_ClippingContext\n  ): void {\n    // 被クリッピングマスク（マスクされる描画オブジェクト）の全体の矩形\n    let clippedDrawTotalMinX: number = Number.MAX_VALUE;\n    let clippedDrawTotalMinY: number = Number.MAX_VALUE;\n    let clippedDrawTotalMaxX: number = Number.MIN_VALUE;\n    let clippedDrawTotalMaxY: number = Number.MIN_VALUE;\n\n    // このマスクが実際に必要か判定する\n    // このクリッピングを利用する「描画オブジェクト」がひとつでも使用可能であればマスクを生成する必要がある\n    const clippedDrawCount: number =\n      clippingContext._clippedDrawableIndexList.length;\n\n    for (\n      let clippedDrawableIndex = 0;\n      clippedDrawableIndex < clippedDrawCount;\n      clippedDrawableIndex++\n    ) {\n      // マスクを使用する描画オブジェクトの描画される矩形を求める\n      const drawableIndex: number =\n        clippingContext._clippedDrawableIndexList[clippedDrawableIndex];\n\n      const drawableVertexCount: number =\n        model.getDrawableVertexCount(drawableIndex);\n      const drawableVertexes: Float32Array =\n        model.getDrawableVertices(drawableIndex);\n\n      let minX: number = Number.MAX_VALUE;\n      let minY: number = Number.MAX_VALUE;\n      let maxX: number = -Number.MAX_VALUE;\n      let maxY: number = -Number.MAX_VALUE;\n\n      const loop: number = drawableVertexCount * Constant.vertexStep;\n      for (\n        let pi: number = Constant.vertexOffset;\n        pi < loop;\n        pi += Constant.vertexStep\n      ) {\n        const x: number = drawableVertexes[pi];\n        const y: number = drawableVertexes[pi + 1];\n\n        if (x < minX) {\n          minX = x;\n        }\n        if (x > maxX) {\n          maxX = x;\n        }\n        if (y < minY) {\n          minY = y;\n        }\n        if (y > maxY) {\n          maxY = y;\n        }\n      }\n\n      // 有効な点が一つも取れなかったのでスキップ\n      if (minX == Number.MAX_VALUE) {\n        continue;\n      }\n\n      // 全体の矩形に反映\n      if (minX < clippedDrawTotalMinX) {\n        clippedDrawTotalMinX = minX;\n      }\n      if (minY < clippedDrawTotalMinY) {\n        clippedDrawTotalMinY = minY;\n      }\n      if (maxX > clippedDrawTotalMaxX) {\n        clippedDrawTotalMaxX = maxX;\n      }\n      if (maxY > clippedDrawTotalMaxY) {\n        clippedDrawTotalMaxY = maxY;\n      }\n\n      if (clippedDrawTotalMinX == Number.MAX_VALUE) {\n        clippingContext._allClippedDrawRect.x = 0.0;\n        clippingContext._allClippedDrawRect.y = 0.0;\n        clippingContext._allClippedDrawRect.width = 0.0;\n        clippingContext._allClippedDrawRect.height = 0.0;\n        clippingContext._isUsing = false;\n      } else {\n        clippingContext._isUsing = true;\n        const w: number = clippedDrawTotalMaxX - clippedDrawTotalMinX;\n        const h: number = clippedDrawTotalMaxY - clippedDrawTotalMinY;\n        clippingContext._allClippedDrawRect.x = clippedDrawTotalMinX;\n        clippingContext._allClippedDrawRect.y = clippedDrawTotalMinY;\n        clippingContext._allClippedDrawRect.width = w;\n        clippingContext._allClippedDrawRect.height = h;\n      }\n    }\n  }\n\n  /**\n   * 画面描画に使用するクリッピングマスクのリストを取得する\n   * @return 画面描画に使用するクリッピングマスクのリスト\n   */\n  public getClippingContextListForDraw(): csmVector<T_ClippingContext> {\n    return this._clippingContextListForDraw;\n  }\n\n  /**\n   * クリッピングマスクバッファのサイズを取得する\n   * @return クリッピングマスクバッファのサイズ\n   */\n  public getClippingMaskBufferSize(): number {\n    return this._clippingMaskBufferSize;\n  }\n\n  /**\n   * このバッファのレンダーテクスチャの枚数を取得する\n   * @return このバッファのレンダーテクスチャの枚数\n   */\n  public getRenderTextureCount(): number {\n    return this._renderTextureCount;\n  }\n\n  /**\n   * カラーチャンネル（RGBA）のフラグを取得する\n   * @param channelNo カラーチャンネル（RGBA）の番号（0:R, 1:G, 2:B, 3:A）\n   */\n  public getChannelFlagAsColor(channelNo: number): CubismTextureColor {\n    return this._channelColors.at(channelNo);\n  }\n\n  /**\n   * クリッピングマスクバッファのサイズを設定する\n   * @param size クリッピングマスクバッファのサイズ\n   */\n  public setClippingMaskBufferSize(size: number): void {\n    this._clippingMaskBufferSize = size;\n  }\n\n  protected _clearedFrameBufferFlags: csmVector<boolean>; //マスクのクリアフラグの配列\n\n  protected _channelColors: csmVector<CubismTextureColor>;\n  protected _clippingContextListForMask: csmVector<T_ClippingContext>; // マスク用クリッピングコンテキストのリスト\n  protected _clippingContextListForDraw: csmVector<T_ClippingContext>; // 描画用クリッピングコンテキストのリスト\n  protected _clippingMaskBufferSize: number; // クリッピングマスクのバッファサイズ（初期値:256）\n  protected _renderTextureCount: number; // 生成するレンダーテクスチャの枚数\n\n  protected _tmpMatrix: CubismMatrix44; // マスク計算用の行列\n  protected _tmpMatrixForMask: CubismMatrix44; // マスク計算用の行列\n  protected _tmpMatrixForDraw: CubismMatrix44; // マスク計算用の行列\n  protected _tmpBoundsOnModel: csmRect; // マスク配置計算用の矩形\n\n  protected _clippingContexttConstructor: ClippingContextConstructor<T_ClippingContext>;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismMatrix44 } from '../math/cubismmatrix44';\nimport { CubismModel } from '../model/cubismmodel';\nimport { csmRect } from '../type/csmrectf';\nimport { csmVector } from '../type/csmvector';\nimport { CubismLogError } from '../utils/cubismdebug';\nimport { CubismBlendMode, CubismTextureColor } from './cubismrenderer';\nimport { CubismRenderer_WebGL } from './cubismrenderer_webgl';\n\nlet s_instance: CubismShader_WebGL;\nconst ShaderCount = 10; // シェーダーの数 = マスク生成用 + (通常用 + 加算 + 乗算) * (マスク無の乗算済アルファ対応版 + マスク有の乗算済アルファ対応版 + マスク有反転の乗算済アルファ対応版)\n\n/**\n * WebGL用のシェーダープログラムを生成・破棄するクラス\n * シングルトンなクラスであり、CubismShader_WebGL.getInstanceからアクセスする。\n */\nexport class CubismShader_WebGL {\n  /**\n   * インスタンスを取得する（シングルトン）\n   * @return インスタンス\n   */\n  public static getInstance(): CubismShader_WebGL {\n    if (s_instance == null) {\n      s_instance = new CubismShader_WebGL();\n\n      return s_instance;\n    }\n    return s_instance;\n  }\n\n  /**\n   * インスタンスを開放する（シングルトン）\n   */\n  public static deleteInstance(): void {\n    if (s_instance) {\n      s_instance.release();\n      s_instance = null;\n    }\n  }\n\n  /**\n   * privateなコンストラクタ\n   */\n  private constructor() {\n    this._shaderSets = new csmVector<CubismShaderSet>();\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    this.releaseShaderProgram();\n  }\n\n  /**\n   * 描画用のシェーダプログラムの一連のセットアップを実行する\n   * @param renderer レンダラー\n   * @param model 描画対象のモデル\n   * @param index 描画対象のメッシュのインデックス\n   */\n  public setupShaderProgramForDraw(\n    renderer: CubismRenderer_WebGL,\n    model: Readonly<CubismModel>,\n    index: number\n  ): void {\n    if (!renderer.isPremultipliedAlpha()) {\n      CubismLogError('NoPremultipliedAlpha is not allowed');\n    }\n\n    if (this._shaderSets.getSize() == 0) {\n      this.generateShaders();\n    }\n\n    // Blending\n    let srcColor: number;\n    let dstColor: number;\n    let srcAlpha: number;\n    let dstAlpha: number;\n\n    // _shaderSets用のオフセット計算\n    const masked: boolean = renderer.getClippingContextBufferForDraw() != null; // この描画オブジェクトはマスク対象か\n    const invertedMask: boolean = model.getDrawableInvertedMaskBit(index);\n    const offset: number = masked ? (invertedMask ? 2 : 1) : 0;\n\n    let shaderSet: CubismShaderSet;\n    switch (model.getDrawableBlendMode(index)) {\n      case CubismBlendMode.CubismBlendMode_Normal:\n      default:\n        shaderSet = this._shaderSets.at(\n          ShaderNames.ShaderNames_NormalPremultipliedAlpha + offset\n        );\n        srcColor = this.gl.ONE;\n        dstColor = this.gl.ONE_MINUS_SRC_ALPHA;\n        srcAlpha = this.gl.ONE;\n        dstAlpha = this.gl.ONE_MINUS_SRC_ALPHA;\n        break;\n\n      case CubismBlendMode.CubismBlendMode_Additive:\n        shaderSet = this._shaderSets.at(\n          ShaderNames.ShaderNames_AddPremultipliedAlpha + offset\n        );\n        srcColor = this.gl.ONE;\n        dstColor = this.gl.ONE;\n        srcAlpha = this.gl.ZERO;\n        dstAlpha = this.gl.ONE;\n        break;\n\n      case CubismBlendMode.CubismBlendMode_Multiplicative:\n        shaderSet = this._shaderSets.at(\n          ShaderNames.ShaderNames_MultPremultipliedAlpha + offset\n        );\n        srcColor = this.gl.DST_COLOR;\n        dstColor = this.gl.ONE_MINUS_SRC_ALPHA;\n        srcAlpha = this.gl.ZERO;\n        dstAlpha = this.gl.ONE;\n        break;\n    }\n\n    this.gl.useProgram(shaderSet.shaderProgram);\n\n    // 頂点配列の設定\n    if (renderer._bufferData.vertex == null) {\n      renderer._bufferData.vertex = this.gl.createBuffer();\n    }\n    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, renderer._bufferData.vertex);\n\n    // 頂点配列の設定\n    const vertexArray: Float32Array = model.getDrawableVertices(index);\n    this.gl.bufferData(this.gl.ARRAY_BUFFER, vertexArray, this.gl.DYNAMIC_DRAW);\n    this.gl.enableVertexAttribArray(shaderSet.attributePositionLocation);\n    this.gl.vertexAttribPointer(\n      shaderSet.attributePositionLocation,\n      2,\n      this.gl.FLOAT,\n      false,\n      0,\n      0\n    );\n\n    // テクスチャ頂点の設定\n    if (renderer._bufferData.uv == null) {\n      renderer._bufferData.uv = this.gl.createBuffer();\n    }\n    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, renderer._bufferData.uv);\n    const uvArray: Float32Array = model.getDrawableVertexUvs(index);\n    this.gl.bufferData(this.gl.ARRAY_BUFFER, uvArray, this.gl.DYNAMIC_DRAW);\n    this.gl.enableVertexAttribArray(shaderSet.attributeTexCoordLocation);\n    this.gl.vertexAttribPointer(\n      shaderSet.attributeTexCoordLocation,\n      2,\n      this.gl.FLOAT,\n      false,\n      0,\n      0\n    );\n\n    if (masked) {\n      this.gl.activeTexture(this.gl.TEXTURE1);\n\n      // frameBufferに書かれたテクスチャ\n      const tex: WebGLTexture = renderer\n        .getClippingContextBufferForDraw()\n        .getClippingManager()\n        .getColorBuffer()\n        .at(renderer.getClippingContextBufferForDraw()._bufferIndex);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, tex);\n      this.gl.uniform1i(shaderSet.samplerTexture1Location, 1);\n\n      // view座標をClippingContextの座標に変換するための行列を設定\n      this.gl.uniformMatrix4fv(\n        shaderSet.uniformClipMatrixLocation,\n        false,\n        renderer.getClippingContextBufferForDraw()._matrixForDraw.getArray()\n      );\n\n      // 使用するカラーチャンネルを設定\n      const channelIndex: number =\n        renderer.getClippingContextBufferForDraw()._layoutChannelIndex;\n      const colorChannel: CubismTextureColor = renderer\n        .getClippingContextBufferForDraw()\n        .getClippingManager()\n        .getChannelFlagAsColor(channelIndex);\n      this.gl.uniform4f(\n        shaderSet.uniformChannelFlagLocation,\n        colorChannel.r,\n        colorChannel.g,\n        colorChannel.b,\n        colorChannel.a\n      );\n    }\n\n    // テクスチャ設定\n    const textureNo: number = model.getDrawableTextureIndex(index);\n    const textureId: WebGLTexture = renderer\n      .getBindedTextures()\n      .getValue(textureNo);\n    this.gl.activeTexture(this.gl.TEXTURE0);\n    this.gl.bindTexture(this.gl.TEXTURE_2D, textureId);\n    this.gl.uniform1i(shaderSet.samplerTexture0Location, 0);\n\n    //座標変換\n    const matrix4x4: CubismMatrix44 = renderer.getMvpMatrix();\n    this.gl.uniformMatrix4fv(\n      shaderSet.uniformMatrixLocation,\n      false,\n      matrix4x4.getArray()\n    );\n\n    //ベース色の取得\n    const baseColor: CubismTextureColor = renderer.getModelColorWithOpacity(\n      model.getDrawableOpacity(index)\n    );\n    const multiplyColor: CubismTextureColor = model.getMultiplyColor(index);\n    const screenColor: CubismTextureColor = model.getScreenColor(index);\n\n    this.gl.uniform4f(\n      shaderSet.uniformBaseColorLocation,\n      baseColor.r,\n      baseColor.g,\n      baseColor.b,\n      baseColor.a\n    );\n\n    this.gl.uniform4f(\n      shaderSet.uniformMultiplyColorLocation,\n      multiplyColor.r,\n      multiplyColor.g,\n      multiplyColor.b,\n      multiplyColor.a\n    );\n\n    this.gl.uniform4f(\n      shaderSet.uniformScreenColorLocation,\n      screenColor.r,\n      screenColor.g,\n      screenColor.b,\n      screenColor.a\n    );\n\n    // IBOを作成し、データを転送\n    if (renderer._bufferData.index == null) {\n      renderer._bufferData.index = this.gl.createBuffer();\n    }\n    const indexArray: Uint16Array = model.getDrawableVertexIndices(index);\n\n    this.gl.bindBuffer(\n      this.gl.ELEMENT_ARRAY_BUFFER,\n      renderer._bufferData.index\n    );\n    this.gl.bufferData(\n      this.gl.ELEMENT_ARRAY_BUFFER,\n      indexArray,\n      this.gl.DYNAMIC_DRAW\n    );\n\n    this.gl.blendFuncSeparate(srcColor, dstColor, srcAlpha, dstAlpha);\n  }\n\n  /**\n   * マスク用のシェーダプログラムの一連のセットアップを実行する\n   * @param renderer レンダラー\n   * @param model 描画対象のモデル\n   * @param index 描画対象のメッシュのインデックス\n   */\n  public setupShaderProgramForMask(\n    renderer: CubismRenderer_WebGL,\n    model: Readonly<CubismModel>,\n    index: number\n  ): void {\n    if (!renderer.isPremultipliedAlpha()) {\n      CubismLogError('NoPremultipliedAlpha is not allowed');\n    }\n\n    if (this._shaderSets.getSize() == 0) {\n      this.generateShaders();\n    }\n\n    const shaderSet: CubismShaderSet = this._shaderSets.at(\n      ShaderNames.ShaderNames_SetupMask\n    );\n    this.gl.useProgram(shaderSet.shaderProgram);\n\n    // 頂点配列の設定\n    if (renderer._bufferData.vertex == null) {\n      renderer._bufferData.vertex = this.gl.createBuffer();\n    }\n    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, renderer._bufferData.vertex);\n    const vertexArray: Float32Array = model.getDrawableVertices(index);\n    this.gl.bufferData(this.gl.ARRAY_BUFFER, vertexArray, this.gl.DYNAMIC_DRAW);\n    this.gl.enableVertexAttribArray(shaderSet.attributePositionLocation);\n    this.gl.vertexAttribPointer(\n      shaderSet.attributePositionLocation,\n      2,\n      this.gl.FLOAT,\n      false,\n      0,\n      0\n    );\n\n    //テクスチャ設定\n    if (renderer._bufferData.uv == null) {\n      renderer._bufferData.uv = this.gl.createBuffer();\n    }\n    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, renderer._bufferData.uv);\n    const textureNo: number = model.getDrawableTextureIndex(index);\n    const textureId: WebGLTexture = renderer\n      .getBindedTextures()\n      .getValue(textureNo);\n    this.gl.activeTexture(this.gl.TEXTURE0);\n    this.gl.bindTexture(this.gl.TEXTURE_2D, textureId);\n    this.gl.uniform1i(shaderSet.samplerTexture0Location, 0);\n\n    // テクスチャ頂点の設定\n    if (renderer._bufferData.uv == null) {\n      renderer._bufferData.uv = this.gl.createBuffer();\n    }\n    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, renderer._bufferData.uv);\n    const uvArray: Float32Array = model.getDrawableVertexUvs(index);\n    this.gl.bufferData(this.gl.ARRAY_BUFFER, uvArray, this.gl.DYNAMIC_DRAW);\n    this.gl.enableVertexAttribArray(shaderSet.attributeTexCoordLocation);\n    this.gl.vertexAttribPointer(\n      shaderSet.attributeTexCoordLocation,\n      2,\n      this.gl.FLOAT,\n      false,\n      0,\n      0\n    );\n\n    // チャンネル\n    const context = renderer.getClippingContextBufferForMask();\n    const channelIndex: number =\n      renderer.getClippingContextBufferForMask()._layoutChannelIndex;\n    const colorChannel: CubismTextureColor = renderer\n      .getClippingContextBufferForMask()\n      .getClippingManager()\n      .getChannelFlagAsColor(channelIndex);\n    this.gl.uniform4f(\n      shaderSet.uniformChannelFlagLocation,\n      colorChannel.r,\n      colorChannel.g,\n      colorChannel.b,\n      colorChannel.a\n    );\n\n    this.gl.uniformMatrix4fv(\n      shaderSet.uniformClipMatrixLocation,\n      false,\n      renderer.getClippingContextBufferForMask()._matrixForMask.getArray()\n    );\n\n    const rect: csmRect =\n      renderer.getClippingContextBufferForMask()._layoutBounds;\n\n    this.gl.uniform4f(\n      shaderSet.uniformBaseColorLocation,\n      rect.x * 2.0 - 1.0,\n      rect.y * 2.0 - 1.0,\n      rect.getRight() * 2.0 - 1.0,\n      rect.getBottom() * 2.0 - 1.0\n    );\n\n    const multiplyColor: CubismTextureColor = model.getMultiplyColor(index);\n    const screenColor: CubismTextureColor = model.getScreenColor(index);\n\n    this.gl.uniform4f(\n      shaderSet.uniformMultiplyColorLocation,\n      multiplyColor.r,\n      multiplyColor.g,\n      multiplyColor.b,\n      multiplyColor.a\n    );\n\n    this.gl.uniform4f(\n      shaderSet.uniformScreenColorLocation,\n      screenColor.r,\n      screenColor.g,\n      screenColor.b,\n      screenColor.a\n    );\n\n    // Blending\n    const srcColor: number = this.gl.ZERO;\n    const dstColor: number = this.gl.ONE_MINUS_SRC_COLOR;\n    const srcAlpha: number = this.gl.ZERO;\n    const dstAlpha: number = this.gl.ONE_MINUS_SRC_ALPHA;\n\n    // IBOを作成し、データを転送\n    if (renderer._bufferData.index == null) {\n      renderer._bufferData.index = this.gl.createBuffer();\n    }\n    const indexArray: Uint16Array = model.getDrawableVertexIndices(index);\n\n    this.gl.bindBuffer(\n      this.gl.ELEMENT_ARRAY_BUFFER,\n      renderer._bufferData.index\n    );\n    this.gl.bufferData(\n      this.gl.ELEMENT_ARRAY_BUFFER,\n      indexArray,\n      this.gl.DYNAMIC_DRAW\n    );\n\n    this.gl.blendFuncSeparate(srcColor, dstColor, srcAlpha, dstAlpha);\n  }\n\n  /**\n   * シェーダープログラムを解放する\n   */\n  public releaseShaderProgram(): void {\n    for (let i = 0; i < this._shaderSets.getSize(); i++) {\n      this.gl.deleteProgram(this._shaderSets.at(i).shaderProgram);\n      this._shaderSets.at(i).shaderProgram = 0;\n      this._shaderSets.set(i, void 0);\n      this._shaderSets.set(i, null);\n    }\n  }\n\n  /**\n   * シェーダープログラムを初期化する\n   * @param vertShaderSrc 頂点シェーダのソース\n   * @param fragShaderSrc フラグメントシェーダのソース\n   */\n  public generateShaders(): void {\n    for (let i = 0; i < ShaderCount; i++) {\n      this._shaderSets.pushBack(new CubismShaderSet());\n    }\n\n    this._shaderSets.at(0).shaderProgram = this.loadShaderProgram(\n      vertexShaderSrcSetupMask,\n      fragmentShaderSrcsetupMask\n    );\n\n    this._shaderSets.at(1).shaderProgram = this.loadShaderProgram(\n      vertexShaderSrc,\n      fragmentShaderSrcPremultipliedAlpha\n    );\n    this._shaderSets.at(2).shaderProgram = this.loadShaderProgram(\n      vertexShaderSrcMasked,\n      fragmentShaderSrcMaskPremultipliedAlpha\n    );\n    this._shaderSets.at(3).shaderProgram = this.loadShaderProgram(\n      vertexShaderSrcMasked,\n      fragmentShaderSrcMaskInvertedPremultipliedAlpha\n    );\n\n    // 加算も通常と同じシェーダーを利用する\n    this._shaderSets.at(4).shaderProgram = this._shaderSets.at(1).shaderProgram;\n    this._shaderSets.at(5).shaderProgram = this._shaderSets.at(2).shaderProgram;\n    this._shaderSets.at(6).shaderProgram = this._shaderSets.at(3).shaderProgram;\n\n    // 乗算も通常と同じシェーダーを利用する\n    this._shaderSets.at(7).shaderProgram = this._shaderSets.at(1).shaderProgram;\n    this._shaderSets.at(8).shaderProgram = this._shaderSets.at(2).shaderProgram;\n    this._shaderSets.at(9).shaderProgram = this._shaderSets.at(3).shaderProgram;\n\n    // SetupMask\n    this._shaderSets.at(0).attributePositionLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(0).shaderProgram,\n        'a_position'\n      );\n    this._shaderSets.at(0).attributeTexCoordLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(0).shaderProgram,\n        'a_texCoord'\n      );\n    this._shaderSets.at(0).samplerTexture0Location = this.gl.getUniformLocation(\n      this._shaderSets.at(0).shaderProgram,\n      's_texture0'\n    );\n    this._shaderSets.at(0).uniformClipMatrixLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(0).shaderProgram,\n        'u_clipMatrix'\n      );\n    this._shaderSets.at(0).uniformChannelFlagLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(0).shaderProgram,\n        'u_channelFlag'\n      );\n    this._shaderSets.at(0).uniformBaseColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(0).shaderProgram,\n        'u_baseColor'\n      );\n    this._shaderSets.at(0).uniformMultiplyColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(0).shaderProgram,\n        'u_multiplyColor'\n      );\n    this._shaderSets.at(0).uniformScreenColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(0).shaderProgram,\n        'u_screenColor'\n      );\n\n    // 通常（PremultipliedAlpha）\n    this._shaderSets.at(1).attributePositionLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(1).shaderProgram,\n        'a_position'\n      );\n    this._shaderSets.at(1).attributeTexCoordLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(1).shaderProgram,\n        'a_texCoord'\n      );\n    this._shaderSets.at(1).samplerTexture0Location = this.gl.getUniformLocation(\n      this._shaderSets.at(1).shaderProgram,\n      's_texture0'\n    );\n    this._shaderSets.at(1).uniformMatrixLocation = this.gl.getUniformLocation(\n      this._shaderSets.at(1).shaderProgram,\n      'u_matrix'\n    );\n    this._shaderSets.at(1).uniformBaseColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(1).shaderProgram,\n        'u_baseColor'\n      );\n    this._shaderSets.at(1).uniformMultiplyColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(1).shaderProgram,\n        'u_multiplyColor'\n      );\n    this._shaderSets.at(1).uniformScreenColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(1).shaderProgram,\n        'u_screenColor'\n      );\n\n    // 通常（クリッピング、PremultipliedAlpha）\n    this._shaderSets.at(2).attributePositionLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(2).shaderProgram,\n        'a_position'\n      );\n    this._shaderSets.at(2).attributeTexCoordLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(2).shaderProgram,\n        'a_texCoord'\n      );\n    this._shaderSets.at(2).samplerTexture0Location = this.gl.getUniformLocation(\n      this._shaderSets.at(2).shaderProgram,\n      's_texture0'\n    );\n    this._shaderSets.at(2).samplerTexture1Location = this.gl.getUniformLocation(\n      this._shaderSets.at(2).shaderProgram,\n      's_texture1'\n    );\n    this._shaderSets.at(2).uniformMatrixLocation = this.gl.getUniformLocation(\n      this._shaderSets.at(2).shaderProgram,\n      'u_matrix'\n    );\n    this._shaderSets.at(2).uniformClipMatrixLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(2).shaderProgram,\n        'u_clipMatrix'\n      );\n    this._shaderSets.at(2).uniformChannelFlagLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(2).shaderProgram,\n        'u_channelFlag'\n      );\n    this._shaderSets.at(2).uniformBaseColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(2).shaderProgram,\n        'u_baseColor'\n      );\n    this._shaderSets.at(2).uniformMultiplyColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(2).shaderProgram,\n        'u_multiplyColor'\n      );\n    this._shaderSets.at(2).uniformScreenColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(2).shaderProgram,\n        'u_screenColor'\n      );\n\n    // 通常（クリッピング・反転, PremultipliedAlpha）\n    this._shaderSets.at(3).attributePositionLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(3).shaderProgram,\n        'a_position'\n      );\n    this._shaderSets.at(3).attributeTexCoordLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(3).shaderProgram,\n        'a_texCoord'\n      );\n    this._shaderSets.at(3).samplerTexture0Location = this.gl.getUniformLocation(\n      this._shaderSets.at(3).shaderProgram,\n      's_texture0'\n    );\n    this._shaderSets.at(3).samplerTexture1Location = this.gl.getUniformLocation(\n      this._shaderSets.at(3).shaderProgram,\n      's_texture1'\n    );\n    this._shaderSets.at(3).uniformMatrixLocation = this.gl.getUniformLocation(\n      this._shaderSets.at(3).shaderProgram,\n      'u_matrix'\n    );\n    this._shaderSets.at(3).uniformClipMatrixLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(3).shaderProgram,\n        'u_clipMatrix'\n      );\n    this._shaderSets.at(3).uniformChannelFlagLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(3).shaderProgram,\n        'u_channelFlag'\n      );\n    this._shaderSets.at(3).uniformBaseColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(3).shaderProgram,\n        'u_baseColor'\n      );\n    this._shaderSets.at(3).uniformMultiplyColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(3).shaderProgram,\n        'u_multiplyColor'\n      );\n    this._shaderSets.at(3).uniformScreenColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(3).shaderProgram,\n        'u_screenColor'\n      );\n\n    // 加算（PremultipliedAlpha）\n    this._shaderSets.at(4).attributePositionLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(4).shaderProgram,\n        'a_position'\n      );\n    this._shaderSets.at(4).attributeTexCoordLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(4).shaderProgram,\n        'a_texCoord'\n      );\n    this._shaderSets.at(4).samplerTexture0Location = this.gl.getUniformLocation(\n      this._shaderSets.at(4).shaderProgram,\n      's_texture0'\n    );\n    this._shaderSets.at(4).uniformMatrixLocation = this.gl.getUniformLocation(\n      this._shaderSets.at(4).shaderProgram,\n      'u_matrix'\n    );\n    this._shaderSets.at(4).uniformBaseColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(4).shaderProgram,\n        'u_baseColor'\n      );\n    this._shaderSets.at(4).uniformMultiplyColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(4).shaderProgram,\n        'u_multiplyColor'\n      );\n    this._shaderSets.at(4).uniformScreenColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(4).shaderProgram,\n        'u_screenColor'\n      );\n\n    // 加算（クリッピング、PremultipliedAlpha）\n    this._shaderSets.at(5).attributePositionLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(5).shaderProgram,\n        'a_position'\n      );\n    this._shaderSets.at(5).attributeTexCoordLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(5).shaderProgram,\n        'a_texCoord'\n      );\n    this._shaderSets.at(5).samplerTexture0Location = this.gl.getUniformLocation(\n      this._shaderSets.at(5).shaderProgram,\n      's_texture0'\n    );\n    this._shaderSets.at(5).samplerTexture1Location = this.gl.getUniformLocation(\n      this._shaderSets.at(5).shaderProgram,\n      's_texture1'\n    );\n    this._shaderSets.at(5).uniformMatrixLocation = this.gl.getUniformLocation(\n      this._shaderSets.at(5).shaderProgram,\n      'u_matrix'\n    );\n    this._shaderSets.at(5).uniformClipMatrixLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(5).shaderProgram,\n        'u_clipMatrix'\n      );\n    this._shaderSets.at(5).uniformChannelFlagLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(5).shaderProgram,\n        'u_channelFlag'\n      );\n    this._shaderSets.at(5).uniformBaseColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(5).shaderProgram,\n        'u_baseColor'\n      );\n    this._shaderSets.at(5).uniformMultiplyColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(5).shaderProgram,\n        'u_multiplyColor'\n      );\n    this._shaderSets.at(5).uniformScreenColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(5).shaderProgram,\n        'u_screenColor'\n      );\n\n    // 加算（クリッピング・反転、PremultipliedAlpha）\n    this._shaderSets.at(6).attributePositionLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(6).shaderProgram,\n        'a_position'\n      );\n    this._shaderSets.at(6).attributeTexCoordLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(6).shaderProgram,\n        'a_texCoord'\n      );\n    this._shaderSets.at(6).samplerTexture0Location = this.gl.getUniformLocation(\n      this._shaderSets.at(6).shaderProgram,\n      's_texture0'\n    );\n    this._shaderSets.at(6).samplerTexture1Location = this.gl.getUniformLocation(\n      this._shaderSets.at(6).shaderProgram,\n      's_texture1'\n    );\n    this._shaderSets.at(6).uniformMatrixLocation = this.gl.getUniformLocation(\n      this._shaderSets.at(6).shaderProgram,\n      'u_matrix'\n    );\n    this._shaderSets.at(6).uniformClipMatrixLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(6).shaderProgram,\n        'u_clipMatrix'\n      );\n    this._shaderSets.at(6).uniformChannelFlagLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(6).shaderProgram,\n        'u_channelFlag'\n      );\n    this._shaderSets.at(6).uniformBaseColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(6).shaderProgram,\n        'u_baseColor'\n      );\n    this._shaderSets.at(6).uniformMultiplyColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(6).shaderProgram,\n        'u_multiplyColor'\n      );\n    this._shaderSets.at(6).uniformScreenColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(6).shaderProgram,\n        'u_screenColor'\n      );\n\n    // 乗算（PremultipliedAlpha）\n    this._shaderSets.at(7).attributePositionLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(7).shaderProgram,\n        'a_position'\n      );\n    this._shaderSets.at(7).attributeTexCoordLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(7).shaderProgram,\n        'a_texCoord'\n      );\n    this._shaderSets.at(7).samplerTexture0Location = this.gl.getUniformLocation(\n      this._shaderSets.at(7).shaderProgram,\n      's_texture0'\n    );\n    this._shaderSets.at(7).uniformMatrixLocation = this.gl.getUniformLocation(\n      this._shaderSets.at(7).shaderProgram,\n      'u_matrix'\n    );\n    this._shaderSets.at(7).uniformBaseColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(7).shaderProgram,\n        'u_baseColor'\n      );\n    this._shaderSets.at(7).uniformMultiplyColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(7).shaderProgram,\n        'u_multiplyColor'\n      );\n    this._shaderSets.at(7).uniformScreenColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(7).shaderProgram,\n        'u_screenColor'\n      );\n\n    // 乗算（クリッピング、PremultipliedAlpha）\n    this._shaderSets.at(8).attributePositionLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(8).shaderProgram,\n        'a_position'\n      );\n    this._shaderSets.at(8).attributeTexCoordLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(8).shaderProgram,\n        'a_texCoord'\n      );\n    this._shaderSets.at(8).samplerTexture0Location = this.gl.getUniformLocation(\n      this._shaderSets.at(8).shaderProgram,\n      's_texture0'\n    );\n    this._shaderSets.at(8).samplerTexture1Location = this.gl.getUniformLocation(\n      this._shaderSets.at(8).shaderProgram,\n      's_texture1'\n    );\n    this._shaderSets.at(8).uniformMatrixLocation = this.gl.getUniformLocation(\n      this._shaderSets.at(8).shaderProgram,\n      'u_matrix'\n    );\n    this._shaderSets.at(8).uniformClipMatrixLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(8).shaderProgram,\n        'u_clipMatrix'\n      );\n    this._shaderSets.at(8).uniformChannelFlagLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(8).shaderProgram,\n        'u_channelFlag'\n      );\n    this._shaderSets.at(8).uniformBaseColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(8).shaderProgram,\n        'u_baseColor'\n      );\n    this._shaderSets.at(8).uniformMultiplyColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(8).shaderProgram,\n        'u_multiplyColor'\n      );\n    this._shaderSets.at(8).uniformScreenColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(8).shaderProgram,\n        'u_screenColor'\n      );\n\n    // 乗算（クリッピング・反転、PremultipliedAlpha）\n    this._shaderSets.at(9).attributePositionLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(9).shaderProgram,\n        'a_position'\n      );\n    this._shaderSets.at(9).attributeTexCoordLocation =\n      this.gl.getAttribLocation(\n        this._shaderSets.at(9).shaderProgram,\n        'a_texCoord'\n      );\n    this._shaderSets.at(9).samplerTexture0Location = this.gl.getUniformLocation(\n      this._shaderSets.at(9).shaderProgram,\n      's_texture0'\n    );\n    this._shaderSets.at(9).samplerTexture1Location = this.gl.getUniformLocation(\n      this._shaderSets.at(9).shaderProgram,\n      's_texture1'\n    );\n    this._shaderSets.at(9).uniformMatrixLocation = this.gl.getUniformLocation(\n      this._shaderSets.at(9).shaderProgram,\n      'u_matrix'\n    );\n    this._shaderSets.at(9).uniformClipMatrixLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(9).shaderProgram,\n        'u_clipMatrix'\n      );\n    this._shaderSets.at(9).uniformChannelFlagLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(9).shaderProgram,\n        'u_channelFlag'\n      );\n    this._shaderSets.at(9).uniformBaseColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(9).shaderProgram,\n        'u_baseColor'\n      );\n    this._shaderSets.at(9).uniformMultiplyColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(9).shaderProgram,\n        'u_multiplyColor'\n      );\n    this._shaderSets.at(9).uniformScreenColorLocation =\n      this.gl.getUniformLocation(\n        this._shaderSets.at(9).shaderProgram,\n        'u_screenColor'\n      );\n  }\n\n  /**\n   * シェーダプログラムをロードしてアドレスを返す\n   * @param vertexShaderSource    頂点シェーダのソース\n   * @param fragmentShaderSource  フラグメントシェーダのソース\n   * @return シェーダプログラムのアドレス\n   */\n  public loadShaderProgram(\n    vertexShaderSource: string,\n    fragmentShaderSource: string\n  ): WebGLProgram {\n    // Create Shader Program\n    let shaderProgram: WebGLProgram = this.gl.createProgram();\n\n    let vertShader = this.compileShaderSource(\n      this.gl.VERTEX_SHADER,\n      vertexShaderSource\n    );\n\n    if (!vertShader) {\n      CubismLogError('Vertex shader compile error!');\n      return 0;\n    }\n\n    let fragShader = this.compileShaderSource(\n      this.gl.FRAGMENT_SHADER,\n      fragmentShaderSource\n    );\n    if (!fragShader) {\n      CubismLogError('Vertex shader compile error!');\n      return 0;\n    }\n\n    // Attach vertex shader to program\n    this.gl.attachShader(shaderProgram, vertShader);\n\n    // Attach fragment shader to program\n    this.gl.attachShader(shaderProgram, fragShader);\n\n    // link program\n    this.gl.linkProgram(shaderProgram);\n    const linkStatus = this.gl.getProgramParameter(\n      shaderProgram,\n      this.gl.LINK_STATUS\n    );\n\n    // リンクに失敗したらシェーダーを削除\n    if (!linkStatus) {\n      CubismLogError('Failed to link program: {0}', shaderProgram);\n\n      this.gl.deleteShader(vertShader);\n      vertShader = 0;\n\n      this.gl.deleteShader(fragShader);\n      fragShader = 0;\n\n      if (shaderProgram) {\n        this.gl.deleteProgram(shaderProgram);\n        shaderProgram = 0;\n      }\n\n      return 0;\n    }\n\n    // Release vertex and fragment shaders.\n    this.gl.deleteShader(vertShader);\n    this.gl.deleteShader(fragShader);\n\n    return shaderProgram;\n  }\n\n  /**\n   * シェーダープログラムをコンパイルする\n   * @param shaderType シェーダタイプ(Vertex/Fragment)\n   * @param shaderSource シェーダソースコード\n   *\n   * @return コンパイルされたシェーダープログラム\n   */\n  public compileShaderSource(\n    shaderType: GLenum,\n    shaderSource: string\n  ): WebGLProgram {\n    const source: string = shaderSource;\n\n    const shader: WebGLProgram = this.gl.createShader(shaderType);\n    this.gl.shaderSource(shader, source);\n    this.gl.compileShader(shader);\n\n    if (!shader) {\n      const log: string = this.gl.getShaderInfoLog(shader);\n      CubismLogError('Shader compile log: {0} ', log);\n    }\n\n    const status: any = this.gl.getShaderParameter(\n      shader,\n      this.gl.COMPILE_STATUS\n    );\n    if (!status) {\n      this.gl.deleteShader(shader);\n      return null;\n    }\n\n    return shader;\n  }\n\n  public setGl(gl: WebGLRenderingContext): void {\n    this.gl = gl;\n  }\n\n  _shaderSets: csmVector<CubismShaderSet>; // ロードしたシェーダープログラムを保持する変数\n  gl: WebGLRenderingContext; // webglコンテキスト\n}\n\n/**\n * CubismShader_WebGLのインナークラス\n */\nexport class CubismShaderSet {\n  shaderProgram: WebGLProgram; // シェーダープログラムのアドレス\n  attributePositionLocation: GLuint; // シェーダープログラムに渡す変数のアドレス（Position）\n  attributeTexCoordLocation: GLuint; // シェーダープログラムに渡す変数のアドレス（TexCoord）\n  uniformMatrixLocation: WebGLUniformLocation; // シェーダープログラムに渡す変数のアドレス（Matrix）\n  uniformClipMatrixLocation: WebGLUniformLocation; // シェーダープログラムに渡す変数のアドレス（ClipMatrix）\n  samplerTexture0Location: WebGLUniformLocation; // シェーダープログラムに渡す変数のアドレス（Texture0）\n  samplerTexture1Location: WebGLUniformLocation; // シェーダープログラムに渡す変数のアドレス（Texture1）\n  uniformBaseColorLocation: WebGLUniformLocation; // シェーダープログラムに渡す変数のアドレス（BaseColor）\n  uniformChannelFlagLocation: WebGLUniformLocation; // シェーダープログラムに渡す変数のアドレス（ChannelFlag）\n  uniformMultiplyColorLocation: WebGLUniformLocation; // シェーダープログラムに渡す変数のアドレス（MultiplyColor）\n  uniformScreenColorLocation: WebGLUniformLocation; // シェーダープログラムに渡す変数のアドレス（ScreenColor）\n}\n\nexport enum ShaderNames {\n  // SetupMask\n  ShaderNames_SetupMask,\n\n  // Normal\n  ShaderNames_NormalPremultipliedAlpha,\n  ShaderNames_NormalMaskedPremultipliedAlpha,\n  ShaderNames_NomralMaskedInvertedPremultipliedAlpha,\n\n  // Add\n  ShaderNames_AddPremultipliedAlpha,\n  ShaderNames_AddMaskedPremultipliedAlpha,\n  ShaderNames_AddMaskedPremultipliedAlphaInverted,\n\n  // Mult\n  ShaderNames_MultPremultipliedAlpha,\n  ShaderNames_MultMaskedPremultipliedAlpha,\n  ShaderNames_MultMaskedPremultipliedAlphaInverted\n}\n\nexport const vertexShaderSrcSetupMask =\n  'attribute vec4     a_position;' +\n  'attribute vec2     a_texCoord;' +\n  'varying vec2       v_texCoord;' +\n  'varying vec4       v_myPos;' +\n  'uniform mat4       u_clipMatrix;' +\n  'void main()' +\n  '{' +\n  '   gl_Position = u_clipMatrix * a_position;' +\n  '   v_myPos = u_clipMatrix * a_position;' +\n  '   v_texCoord = a_texCoord;' +\n  '   v_texCoord.y = 1.0 - v_texCoord.y;' +\n  '}';\n\nexport const fragmentShaderSrcsetupMask =\n  'precision mediump float;' +\n  'varying vec2       v_texCoord;' +\n  'varying vec4       v_myPos;' +\n  'uniform vec4       u_baseColor;' +\n  'uniform vec4       u_channelFlag;' +\n  'uniform sampler2D  s_texture0;' +\n  'void main()' +\n  '{' +\n  '   float isInside = ' +\n  '       step(u_baseColor.x, v_myPos.x/v_myPos.w)' +\n  '       * step(u_baseColor.y, v_myPos.y/v_myPos.w)' +\n  '       * step(v_myPos.x/v_myPos.w, u_baseColor.z)' +\n  '       * step(v_myPos.y/v_myPos.w, u_baseColor.w);' +\n  '   gl_FragColor = u_channelFlag * texture2D(s_texture0, v_texCoord).a * isInside;' +\n  '}';\n\n//----- バーテックスシェーダプログラム -----\n// Normal & Add & Mult 共通\nexport const vertexShaderSrc =\n  'attribute vec4     a_position;' + //v.vertex\n  'attribute vec2     a_texCoord;' + //v.texcoord\n  'varying vec2       v_texCoord;' + //v2f.texcoord\n  'uniform mat4       u_matrix;' +\n  'void main()' +\n  '{' +\n  '   gl_Position = u_matrix * a_position;' +\n  '   v_texCoord = a_texCoord;' +\n  '   v_texCoord.y = 1.0 - v_texCoord.y;' +\n  '}';\n\n// Normal & Add & Mult 共通（クリッピングされたものの描画用）\nexport const vertexShaderSrcMasked =\n  'attribute vec4     a_position;' +\n  'attribute vec2     a_texCoord;' +\n  'varying vec2       v_texCoord;' +\n  'varying vec4       v_clipPos;' +\n  'uniform mat4       u_matrix;' +\n  'uniform mat4       u_clipMatrix;' +\n  'void main()' +\n  '{' +\n  '   gl_Position = u_matrix * a_position;' +\n  '   v_clipPos = u_clipMatrix * a_position;' +\n  '   v_texCoord = a_texCoord;' +\n  '   v_texCoord.y = 1.0 - v_texCoord.y;' +\n  '}';\n\n//----- フラグメントシェーダプログラム -----\n// Normal & Add & Mult 共通 （PremultipliedAlpha）\nexport const fragmentShaderSrcPremultipliedAlpha =\n  'precision mediump float;' +\n  'varying vec2       v_texCoord;' + //v2f.texcoord\n  'uniform vec4       u_baseColor;' +\n  'uniform sampler2D  s_texture0;' + //_MainTex\n  'uniform vec4       u_multiplyColor;' +\n  'uniform vec4       u_screenColor;' +\n  'void main()' +\n  '{' +\n  '   vec4 texColor = texture2D(s_texture0, v_texCoord);' +\n  '   texColor.rgb = texColor.rgb * u_multiplyColor.rgb;' +\n  '   texColor.rgb = (texColor.rgb + u_screenColor.rgb * texColor.a) - (texColor.rgb * u_screenColor.rgb);' +\n  '   vec4 color = texColor * u_baseColor;' +\n  '   gl_FragColor = vec4(color.rgb, color.a);' +\n  '}';\n\n// Normal （クリッピングされたものの描画用、PremultipliedAlpha兼用）\nexport const fragmentShaderSrcMaskPremultipliedAlpha =\n  'precision mediump float;' +\n  'varying vec2       v_texCoord;' +\n  'varying vec4       v_clipPos;' +\n  'uniform vec4       u_baseColor;' +\n  'uniform vec4       u_channelFlag;' +\n  'uniform sampler2D  s_texture0;' +\n  'uniform sampler2D  s_texture1;' +\n  'uniform vec4       u_multiplyColor;' +\n  'uniform vec4       u_screenColor;' +\n  'void main()' +\n  '{' +\n  '   vec4 texColor = texture2D(s_texture0, v_texCoord);' +\n  '   texColor.rgb = texColor.rgb * u_multiplyColor.rgb;' +\n  '   texColor.rgb = (texColor.rgb + u_screenColor.rgb * texColor.a) - (texColor.rgb * u_screenColor.rgb);' +\n  '   vec4 col_formask = texColor * u_baseColor;' +\n  '   vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;' +\n  '   float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;' +\n  '   col_formask = col_formask * maskVal;' +\n  '   gl_FragColor = col_formask;' +\n  '}';\n\n// Normal & Add & Mult 共通（クリッピングされて反転使用の描画用、PremultipliedAlphaの場合）\nexport const fragmentShaderSrcMaskInvertedPremultipliedAlpha =\n  'precision mediump float;' +\n  'varying vec2      v_texCoord;' +\n  'varying vec4      v_clipPos;' +\n  'uniform sampler2D s_texture0;' +\n  'uniform sampler2D s_texture1;' +\n  'uniform vec4      u_channelFlag;' +\n  'uniform vec4      u_baseColor;' +\n  'uniform vec4      u_multiplyColor;' +\n  'uniform vec4      u_screenColor;' +\n  'void main()' +\n  '{' +\n  '   vec4 texColor = texture2D(s_texture0, v_texCoord);' +\n  '   texColor.rgb = texColor.rgb * u_multiplyColor.rgb;' +\n  '   texColor.rgb = (texColor.rgb + u_screenColor.rgb * texColor.a) - (texColor.rgb * u_screenColor.rgb);' +\n  '   vec4 col_formask = texColor * u_baseColor;' +\n  '   vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;' +\n  '   float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;' +\n  '   col_formask = col_formask * (1.0 - maskVal);' +\n  '   gl_FragColor = col_formask;' +\n  '}';\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismshader_webgl';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismShaderSet = $.CubismShaderSet;\n  export type CubismShaderSet = $.CubismShaderSet;\n  export const CubismShader_WebGL = $.CubismShader_WebGL;\n  export type CubismShader_WebGL = $.CubismShader_WebGL;\n  export const ShaderNames = $.ShaderNames;\n  export type ShaderNames = $.ShaderNames;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismModel } from '../model/cubismmodel';\nimport { csmMap } from '../type/csmmap';\nimport { csmRect } from '../type/csmrectf';\nimport { csmVector } from '../type/csmvector';\nimport { CubismLogError } from '../utils/cubismdebug';\nimport { CubismClippingManager } from './cubismclippingmanager';\nimport { CubismClippingContext, CubismRenderer } from './cubismrenderer';\nimport { CubismShader_WebGL } from './cubismshader_webgl';\n\nlet s_viewport: number[];\nlet s_fbo: WebGLFramebuffer;\n\n/**\n * クリッピングマスクの処理を実行するクラス\n */\nexport class CubismClippingManager_WebGL extends CubismClippingManager<CubismClippingContext_WebGL> {\n  /**\n   * テンポラリのレンダーテクスチャのアドレスを取得する\n   * FrameBufferObjectが存在しない場合、新しく生成する\n   *\n   * @return レンダーテクスチャの配列\n   */\n  public getMaskRenderTexture(): csmVector<WebGLFramebuffer> {\n    // テンポラリのRenderTextureを取得する\n    if (this._maskTexture && this._maskTexture.textures != null) {\n      // 前回使ったものを返す\n      this._maskTexture.frameNo = this._currentFrameNo;\n    } else {\n      // FrameBufferObjectが存在しない場合、新しく生成する\n      if (this._maskRenderTextures != null) {\n        this._maskRenderTextures.clear();\n      }\n      this._maskRenderTextures = new csmVector<WebGLFramebuffer>();\n\n      // ColorBufferObjectが存在しない場合、新しく生成する\n      if (this._maskColorBuffers != null) {\n        this._maskColorBuffers.clear();\n      }\n      this._maskColorBuffers = new csmVector<WebGLTexture>();\n\n      // クリッピングバッファサイズを取得\n      const size: number = this._clippingMaskBufferSize;\n\n      for (let index = 0; index < this._renderTextureCount; index++) {\n        this._maskColorBuffers.pushBack(this.gl.createTexture()); // 直接代入\n        this.gl.bindTexture(\n          this.gl.TEXTURE_2D,\n          this._maskColorBuffers.at(index)\n        );\n        this.gl.texImage2D(\n          this.gl.TEXTURE_2D,\n          0,\n          this.gl.RGBA,\n          size,\n          size,\n          0,\n          this.gl.RGBA,\n          this.gl.UNSIGNED_BYTE,\n          null\n        );\n        this.gl.texParameteri(\n          this.gl.TEXTURE_2D,\n          this.gl.TEXTURE_WRAP_S,\n          this.gl.CLAMP_TO_EDGE\n        );\n        this.gl.texParameteri(\n          this.gl.TEXTURE_2D,\n          this.gl.TEXTURE_WRAP_T,\n          this.gl.CLAMP_TO_EDGE\n        );\n        this.gl.texParameteri(\n          this.gl.TEXTURE_2D,\n          this.gl.TEXTURE_MIN_FILTER,\n          this.gl.LINEAR\n        );\n        this.gl.texParameteri(\n          this.gl.TEXTURE_2D,\n          this.gl.TEXTURE_MAG_FILTER,\n          this.gl.LINEAR\n        );\n        this.gl.bindTexture(this.gl.TEXTURE_2D, null);\n\n        this._maskRenderTextures.pushBack(this.gl.createFramebuffer());\n        this.gl.bindFramebuffer(\n          this.gl.FRAMEBUFFER,\n          this._maskRenderTextures.at(index)\n        );\n        this.gl.framebufferTexture2D(\n          this.gl.FRAMEBUFFER,\n          this.gl.COLOR_ATTACHMENT0,\n          this.gl.TEXTURE_2D,\n          this._maskColorBuffers.at(index),\n          0\n        );\n      }\n      this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, s_fbo);\n\n      this._maskTexture = new CubismRenderTextureResource(\n        this._currentFrameNo,\n        this._maskRenderTextures\n      );\n    }\n\n    return this._maskTexture.textures;\n  }\n\n  /**\n   * WebGLレンダリングコンテキストを設定する\n   * @param gl WebGLレンダリングコンテキスト\n   */\n  public setGL(gl: WebGLRenderingContext): void {\n    this.gl = gl;\n  }\n\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    super(CubismClippingContext_WebGL);\n  }\n\n  /**\n   * クリッピングコンテキストを作成する。モデル描画時に実行する。\n   * @param model モデルのインスタンス\n   * @param renderer レンダラのインスタンス\n   */\n  public setupClippingContext(\n    model: CubismModel,\n    renderer: CubismRenderer_WebGL\n  ): void {\n    this._currentFrameNo++;\n\n    // 全てのクリッピングを用意する\n    // 同じクリップ（複数の場合はまとめて一つのクリップ）を使う場合は1度だけ設定する\n    let usingClipCount = 0;\n    for (\n      let clipIndex = 0;\n      clipIndex < this._clippingContextListForMask.getSize();\n      clipIndex++\n    ) {\n      // 1つのクリッピングマスクに関して\n      const cc: CubismClippingContext_WebGL =\n        this._clippingContextListForMask.at(clipIndex);\n\n      // このクリップを利用する描画オブジェクト群全体を囲む矩形を計算\n      this.calcClippedDrawTotalBounds(model, cc);\n\n      if (cc._isUsing) {\n        usingClipCount++; // 使用中としてカウント\n      }\n    }\n\n    // マスク作成処理\n    if (usingClipCount > 0) {\n      // 生成したFrameBufferと同じサイズでビューポートを設定\n      this.gl.viewport(\n        0,\n        0,\n        this._clippingMaskBufferSize,\n        this._clippingMaskBufferSize\n      );\n\n      // 後の計算のためにインデックスの最初をセット\n      this._currentMaskRenderTexture = this.getMaskRenderTexture().at(0);\n\n      renderer.preDraw(); // バッファをクリアする\n\n      this.setupLayoutBounds(usingClipCount);\n\n      // ---------- マスク描画処理 ----------\n      // マスク用RenderTextureをactiveにセット\n      this.gl.bindFramebuffer(\n        this.gl.FRAMEBUFFER,\n        this._currentMaskRenderTexture\n      );\n\n      // サイズがレンダーテクスチャの枚数と合わない場合は合わせる\n      if (this._clearedFrameBufferFlags.getSize() != this._renderTextureCount) {\n        this._clearedFrameBufferFlags.clear();\n        this._clearedFrameBufferFlags = new csmVector<boolean>(\n          this._renderTextureCount\n        );\n      }\n\n      // マスクのクリアフラグを毎フレーム開始時に初期化\n      for (\n        let index = 0;\n        index < this._clearedFrameBufferFlags.getSize();\n        index++\n      ) {\n        this._clearedFrameBufferFlags.set(index, false);\n      }\n\n      // 実際にマスクを生成する\n      // 全てのマスクをどのようにレイアウトして描くかを決定し、ClipContext, ClippedDrawContextに記憶する\n      for (\n        let clipIndex = 0;\n        clipIndex < this._clippingContextListForMask.getSize();\n        clipIndex++\n      ) {\n        // --- 実際に1つのマスクを描く ---\n        const clipContext: CubismClippingContext_WebGL =\n          this._clippingContextListForMask.at(clipIndex);\n        const allClipedDrawRect: csmRect = clipContext._allClippedDrawRect; // このマスクを使う、すべての描画オブジェクトの論理座標上の囲み矩形\n        const layoutBoundsOnTex01: csmRect = clipContext._layoutBounds; // この中にマスクを収める\n        const margin = 0.05; // モデル座標上の矩形を、適宜マージンを付けて使う\n        let scaleX = 0;\n        let scaleY = 0;\n\n        // clipContextに設定したレンダーテクスチャをインデックスで取得\n        const clipContextRenderTexture = this.getMaskRenderTexture().at(\n          clipContext._bufferIndex\n        );\n\n        // 現在のレンダーテクスチャがclipContextのものと異なる場合\n        if (this._currentMaskRenderTexture != clipContextRenderTexture) {\n          this._currentMaskRenderTexture = clipContextRenderTexture;\n          renderer.preDraw(); // バッファをクリアする\n          // マスク用RenderTextureをactiveにセット\n          this.gl.bindFramebuffer(\n            this.gl.FRAMEBUFFER,\n            this._currentMaskRenderTexture\n          );\n        }\n\n        this._tmpBoundsOnModel.setRect(allClipedDrawRect);\n        this._tmpBoundsOnModel.expand(\n          allClipedDrawRect.width * margin,\n          allClipedDrawRect.height * margin\n        );\n        //########## 本来は割り当てられた領域の全体を使わず必要最低限のサイズがよい\n\n        // シェーダ用の計算式を求める。回転を考慮しない場合は以下のとおり\n        // movePeriod' = movePeriod * scaleX + offX\t\t  [[ movePeriod' = (movePeriod - tmpBoundsOnModel.movePeriod)*scale + layoutBoundsOnTex01.movePeriod ]]\n        scaleX = layoutBoundsOnTex01.width / this._tmpBoundsOnModel.width;\n        scaleY = layoutBoundsOnTex01.height / this._tmpBoundsOnModel.height;\n\n        // マスク生成時に使う行列を求める\n        {\n          // シェーダに渡す行列を求める <<<<<<<<<<<<<<<<<<<<<<<< 要最適化（逆順に計算すればシンプルにできる）\n          this._tmpMatrix.loadIdentity();\n          {\n            // layout0..1 を -1..1に変換\n            this._tmpMatrix.translateRelative(-1.0, -1.0);\n            this._tmpMatrix.scaleRelative(2.0, 2.0);\n          }\n          {\n            // view to layout0..1\n            this._tmpMatrix.translateRelative(\n              layoutBoundsOnTex01.x,\n              layoutBoundsOnTex01.y\n            );\n            this._tmpMatrix.scaleRelative(scaleX, scaleY); // new = [translate][scale]\n            this._tmpMatrix.translateRelative(\n              -this._tmpBoundsOnModel.x,\n              -this._tmpBoundsOnModel.y\n            );\n            // new = [translate][scale][translate]\n          }\n          // tmpMatrixForMaskが計算結果\n          this._tmpMatrixForMask.setMatrix(this._tmpMatrix.getArray());\n        }\n\n        //--------- draw時の mask 参照用行列を計算\n        {\n          // シェーダに渡す行列を求める <<<<<<<<<<<<<<<<<<<<<<<< 要最適化（逆順に計算すればシンプルにできる）\n          this._tmpMatrix.loadIdentity();\n          {\n            this._tmpMatrix.translateRelative(\n              layoutBoundsOnTex01.x,\n              layoutBoundsOnTex01.y\n            );\n            this._tmpMatrix.scaleRelative(scaleX, scaleY); // new = [translate][scale]\n            this._tmpMatrix.translateRelative(\n              -this._tmpBoundsOnModel.x,\n              -this._tmpBoundsOnModel.y\n            );\n            // new = [translate][scale][translate]\n          }\n          this._tmpMatrixForDraw.setMatrix(this._tmpMatrix.getArray());\n        }\n        clipContext._matrixForMask.setMatrix(this._tmpMatrixForMask.getArray());\n        clipContext._matrixForDraw.setMatrix(this._tmpMatrixForDraw.getArray());\n\n        const clipDrawCount: number = clipContext._clippingIdCount;\n        for (let i = 0; i < clipDrawCount; i++) {\n          const clipDrawIndex: number = clipContext._clippingIdList[i];\n\n          // 頂点情報が更新されておらず、信頼性がない場合は描画をパスする\n          if (\n            !model.getDrawableDynamicFlagVertexPositionsDidChange(clipDrawIndex)\n          ) {\n            continue;\n          }\n\n          renderer.setIsCulling(\n            model.getDrawableCulling(clipDrawIndex) != false\n          );\n\n          // マスクがクリアされていないなら処理する\n          if (!this._clearedFrameBufferFlags.at(clipContext._bufferIndex)) {\n            // マスクをクリアする\n            // (仮仕様) 1が無効（描かれない）領域、0が有効（描かれる）領域。（シェーダーCd*Csで0に近い値をかけてマスクを作る。1をかけると何も起こらない）\n            this.gl.clearColor(1.0, 1.0, 1.0, 1.0);\n            this.gl.clear(this.gl.COLOR_BUFFER_BIT);\n            this._clearedFrameBufferFlags.set(clipContext._bufferIndex, true);\n          }\n\n          // 今回専用の変換を適用して描く\n          // チャンネルも切り替える必要がある(A,R,G,B)\n          renderer.setClippingContextBufferForMask(clipContext);\n\n          renderer.drawMeshWebGL(model, clipDrawIndex);\n        }\n      }\n\n      // --- 後処理 ---\n      this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, s_fbo); // 描画対象を戻す\n      renderer.setClippingContextBufferForMask(null);\n\n      this.gl.viewport(\n        s_viewport[0],\n        s_viewport[1],\n        s_viewport[2],\n        s_viewport[3]\n      );\n    }\n  }\n\n  /**\n   * カラーバッファを取得する\n   * @return カラーバッファ\n   */\n  public getColorBuffer(): csmVector<WebGLTexture> {\n    return this._maskColorBuffers;\n  }\n\n  /**\n   * マスクの合計数をカウント\n   * @returns\n   */\n  public getClippingMaskCount(): number {\n    return this._clippingContextListForMask.getSize();\n  }\n\n  public _currentMaskRenderTexture: WebGLFramebuffer; // マスク用レンダーテクスチャのアドレス\n  public _maskRenderTextures: csmVector<WebGLFramebuffer>; // レンダーテクスチャのリスト\n  public _maskColorBuffers: csmVector<WebGLTexture>; // マスク用カラーバッファーのアドレスのリスト\n  public _currentFrameNo: number; // マスクテクスチャに与えるフレーム番号\n\n  public _maskTexture: CubismRenderTextureResource; // マスク用のテクスチャリソースのリスト\n\n  gl: WebGLRenderingContext; // WebGLレンダリングコンテキスト\n}\n\n/**\n * レンダーテクスチャのリソースを定義する構造体\n * クリッピングマスクで使用する\n */\nexport class CubismRenderTextureResource {\n  /**\n   * 引数付きコンストラクタ\n   * @param frameNo レンダラーのフレーム番号\n   * @param texture テクスチャのアドレス\n   */\n  public constructor(frameNo: number, texture: csmVector<WebGLFramebuffer>) {\n    this.frameNo = frameNo;\n    this.textures = texture;\n  }\n\n  public frameNo: number; // レンダラのフレーム番号\n  public textures: csmVector<WebGLFramebuffer>; // テクスチャのアドレス\n}\n\n/**\n * クリッピングマスクのコンテキスト\n */\nexport class CubismClippingContext_WebGL extends CubismClippingContext {\n  /**\n   * 引数付きコンストラクタ\n   */\n  public constructor(\n    manager: CubismClippingManager_WebGL,\n    clippingDrawableIndices: Int32Array,\n    clipCount: number\n  ) {\n    super(clippingDrawableIndices, clipCount);\n    this._owner = manager;\n  }\n\n  /**\n   * このマスクを管理するマネージャのインスタンスを取得する\n   * @return クリッピングマネージャのインスタンス\n   */\n  public getClippingManager(): CubismClippingManager_WebGL {\n    return this._owner;\n  }\n\n  public setGl(gl: WebGLRenderingContext): void {\n    this._owner.setGL(gl);\n  }\n\n  private _owner: CubismClippingManager_WebGL; // このマスクを管理しているマネージャのインスタンス\n}\n\nexport class CubismRendererProfile_WebGL {\n  private setGlEnable(index: GLenum, enabled: GLboolean): void {\n    if (enabled) this.gl.enable(index);\n    else this.gl.disable(index);\n  }\n\n  private setGlEnableVertexAttribArray(\n    index: GLuint,\n    enabled: GLboolean\n  ): void {\n    if (enabled) this.gl.enableVertexAttribArray(index);\n    else this.gl.disableVertexAttribArray(index);\n  }\n\n  public save(): void {\n    if (this.gl == null) {\n      CubismLogError(\n        \"'gl' is null. WebGLRenderingContext is required.\\nPlease call 'CubimRenderer_WebGL.startUp' function.\"\n      );\n      return;\n    }\n    //-- push state --\n    this._lastArrayBufferBinding = this.gl.getParameter(\n      this.gl.ARRAY_BUFFER_BINDING\n    );\n    this._lastElementArrayBufferBinding = this.gl.getParameter(\n      this.gl.ELEMENT_ARRAY_BUFFER_BINDING\n    );\n    this._lastProgram = this.gl.getParameter(this.gl.CURRENT_PROGRAM);\n\n    this._lastActiveTexture = this.gl.getParameter(this.gl.ACTIVE_TEXTURE);\n    this.gl.activeTexture(this.gl.TEXTURE1); //テクスチャユニット1をアクティブに（以後の設定対象とする）\n    this._lastTexture1Binding2D = this.gl.getParameter(\n      this.gl.TEXTURE_BINDING_2D\n    );\n\n    this.gl.activeTexture(this.gl.TEXTURE0); //テクスチャユニット0をアクティブに（以後の設定対象とする）\n    this._lastTexture0Binding2D = this.gl.getParameter(\n      this.gl.TEXTURE_BINDING_2D\n    );\n\n    this._lastVertexAttribArrayEnabled[0] = this.gl.getVertexAttrib(\n      0,\n      this.gl.VERTEX_ATTRIB_ARRAY_ENABLED\n    );\n    this._lastVertexAttribArrayEnabled[1] = this.gl.getVertexAttrib(\n      1,\n      this.gl.VERTEX_ATTRIB_ARRAY_ENABLED\n    );\n    this._lastVertexAttribArrayEnabled[2] = this.gl.getVertexAttrib(\n      2,\n      this.gl.VERTEX_ATTRIB_ARRAY_ENABLED\n    );\n    this._lastVertexAttribArrayEnabled[3] = this.gl.getVertexAttrib(\n      3,\n      this.gl.VERTEX_ATTRIB_ARRAY_ENABLED\n    );\n\n    this._lastScissorTest = this.gl.isEnabled(this.gl.SCISSOR_TEST);\n    this._lastStencilTest = this.gl.isEnabled(this.gl.STENCIL_TEST);\n    this._lastDepthTest = this.gl.isEnabled(this.gl.DEPTH_TEST);\n    this._lastCullFace = this.gl.isEnabled(this.gl.CULL_FACE);\n    this._lastBlend = this.gl.isEnabled(this.gl.BLEND);\n\n    this._lastFrontFace = this.gl.getParameter(this.gl.FRONT_FACE);\n\n    this._lastColorMask = this.gl.getParameter(this.gl.COLOR_WRITEMASK);\n\n    // backup blending\n    this._lastBlending[0] = this.gl.getParameter(this.gl.BLEND_SRC_RGB);\n    this._lastBlending[1] = this.gl.getParameter(this.gl.BLEND_DST_RGB);\n    this._lastBlending[2] = this.gl.getParameter(this.gl.BLEND_SRC_ALPHA);\n    this._lastBlending[3] = this.gl.getParameter(this.gl.BLEND_DST_ALPHA);\n\n    // モデル描画直前のFBOとビューポートを保存\n    this._lastFBO = this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING);\n    this._lastViewport = this.gl.getParameter(this.gl.VIEWPORT);\n  }\n\n  public restore(): void {\n    if (this.gl == null) {\n      CubismLogError(\n        \"'gl' is null. WebGLRenderingContext is required.\\nPlease call 'CubimRenderer_WebGL.startUp' function.\"\n      );\n      return;\n    }\n    this.gl.useProgram(this._lastProgram);\n\n    this.setGlEnableVertexAttribArray(0, this._lastVertexAttribArrayEnabled[0]);\n    this.setGlEnableVertexAttribArray(1, this._lastVertexAttribArrayEnabled[1]);\n    this.setGlEnableVertexAttribArray(2, this._lastVertexAttribArrayEnabled[2]);\n    this.setGlEnableVertexAttribArray(3, this._lastVertexAttribArrayEnabled[3]);\n\n    this.setGlEnable(this.gl.SCISSOR_TEST, this._lastScissorTest);\n    this.setGlEnable(this.gl.STENCIL_TEST, this._lastStencilTest);\n    this.setGlEnable(this.gl.DEPTH_TEST, this._lastDepthTest);\n    this.setGlEnable(this.gl.CULL_FACE, this._lastCullFace);\n    this.setGlEnable(this.gl.BLEND, this._lastBlend);\n\n    this.gl.frontFace(this._lastFrontFace);\n\n    this.gl.colorMask(\n      this._lastColorMask[0],\n      this._lastColorMask[1],\n      this._lastColorMask[2],\n      this._lastColorMask[3]\n    );\n\n    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this._lastArrayBufferBinding); //前にバッファがバインドされていたら破棄する必要がある\n    this.gl.bindBuffer(\n      this.gl.ELEMENT_ARRAY_BUFFER,\n      this._lastElementArrayBufferBinding\n    );\n\n    this.gl.activeTexture(this.gl.TEXTURE1); //テクスチャユニット1を復元\n    this.gl.bindTexture(this.gl.TEXTURE_2D, this._lastTexture1Binding2D);\n\n    this.gl.activeTexture(this.gl.TEXTURE0); //テクスチャユニット0を復元\n    this.gl.bindTexture(this.gl.TEXTURE_2D, this._lastTexture0Binding2D);\n\n    this.gl.activeTexture(this._lastActiveTexture);\n\n    this.gl.blendFuncSeparate(\n      this._lastBlending[0],\n      this._lastBlending[1],\n      this._lastBlending[2],\n      this._lastBlending[3]\n    );\n  }\n\n  public setGl(gl: WebGLRenderingContext): void {\n    this.gl = gl;\n  }\n\n  constructor() {\n    this._lastVertexAttribArrayEnabled = new Array<GLboolean>(4);\n    this._lastColorMask = new Array<GLboolean>(4);\n    this._lastBlending = new Array<GLint>(4);\n    this._lastViewport = new Array<GLint>(4);\n  }\n\n  private _lastArrayBufferBinding: GLint; ///< モデル描画直前の頂点バッファ\n  private _lastElementArrayBufferBinding: GLint; ///< モデル描画直前のElementバッファ\n  private _lastProgram: GLint; ///< モデル描画直前のシェーダプログラムバッファ\n  private _lastActiveTexture: GLint; ///< モデル描画直前のアクティブなテクスチャ\n  private _lastTexture0Binding2D: GLint; ///< モデル描画直前のテクスチャユニット0\n  private _lastTexture1Binding2D: GLint; ///< モデル描画直前のテクスチャユニット1\n  private _lastVertexAttribArrayEnabled: GLboolean[]; ///< モデル描画直前のテクスチャユニット1\n  private _lastScissorTest: GLboolean; ///< モデル描画直前のGL_VERTEX_ATTRIB_ARRAY_ENABLEDパラメータ\n  private _lastBlend: GLboolean; ///< モデル描画直前のGL_SCISSOR_TESTパラメータ\n  private _lastStencilTest: GLboolean; ///< モデル描画直前のGL_STENCIL_TESTパラメータ\n  private _lastDepthTest: GLboolean; ///< モデル描画直前のGL_DEPTH_TESTパラメータ\n  private _lastCullFace: GLboolean; ///< モデル描画直前のGL_CULL_FACEパラメータ\n  private _lastFrontFace: GLint; ///< モデル描画直前のGL_CULL_FACEパラメータ\n  private _lastColorMask: GLboolean[]; ///< モデル描画直前のGL_COLOR_WRITEMASKパラメータ\n  private _lastBlending: GLint[]; ///< モデル描画直前のカラーブレンディングパラメータ\n  private _lastFBO: GLint; ///< モデル描画直前のフレームバッファ\n  private _lastViewport: GLint[]; ///< モデル描画直前のビューポート\n\n  gl: WebGLRenderingContext;\n}\n\n/**\n * WebGL用の描画命令を実装したクラス\n */\nexport class CubismRenderer_WebGL extends CubismRenderer {\n  /**\n   * レンダラの初期化処理を実行する\n   * 引数に渡したモデルからレンダラの初期化処理に必要な情報を取り出すことができる\n   *\n   * @param model モデルのインスタンス\n   * @param maskBufferCount バッファの生成数\n   */\n  public initialize(model: CubismModel, maskBufferCount = 1): void {\n    if (model.isUsingMasking()) {\n      this._clippingManager = new CubismClippingManager_WebGL(); // クリッピングマスク・バッファ前処理方式を初期化\n      this._clippingManager.initialize(model, maskBufferCount);\n    }\n\n    this._sortedDrawableIndexList.resize(model.getDrawableCount(), 0);\n\n    super.initialize(model); // 親クラスの処理を呼ぶ\n  }\n\n  /**\n   * WebGLテクスチャのバインド処理\n   * CubismRendererにテクスチャを設定し、CubismRenderer内でその画像を参照するためのIndex値を戻り値とする\n   * @param modelTextureNo セットするモデルテクスチャの番号\n   * @param glTextureNo WebGLテクスチャの番号\n   */\n  public bindTexture(modelTextureNo: number, glTexture: WebGLTexture): void {\n    this._textures.setValue(modelTextureNo, glTexture);\n  }\n\n  /**\n   * WebGLにバインドされたテクスチャのリストを取得する\n   * @return テクスチャのリスト\n   */\n  public getBindedTextures(): csmMap<number, WebGLTexture> {\n    return this._textures;\n  }\n\n  /**\n   * クリッピングマスクバッファのサイズを設定する\n   * マスク用のFrameBufferを破棄、再作成する為処理コストは高い\n   * @param size クリッピングマスクバッファのサイズ\n   */\n  public setClippingMaskBufferSize(size: number) {\n    // クリッピングマスクを利用しない場合は早期リターン\n    if (!this._model.isUsingMasking()) {\n      return;\n    }\n\n    // インスタンス破棄前にレンダーテクスチャの数を保存\n    const renderTextureCount: number =\n      this._clippingManager.getRenderTextureCount();\n\n    // FrameBufferのサイズを変更するためにインスタンスを破棄・再作成する\n    this._clippingManager.release();\n    this._clippingManager = void 0;\n    this._clippingManager = null;\n\n    this._clippingManager = new CubismClippingManager_WebGL();\n\n    this._clippingManager.setClippingMaskBufferSize(size);\n\n    this._clippingManager.initialize(\n      this.getModel(),\n      renderTextureCount // インスタンス破棄前に保存したレンダーテクスチャの数\n    );\n  }\n\n  /**\n   * クリッピングマスクバッファのサイズを取得する\n   * @return クリッピングマスクバッファのサイズ\n   */\n  public getClippingMaskBufferSize(): number {\n    return this._model.isUsingMasking()\n      ? this._clippingManager.getClippingMaskBufferSize()\n      : -1;\n  }\n\n  /**\n   * レンダーテクスチャの枚数を取得する\n   * @return レンダーテクスチャの枚数\n   */\n  public getRenderTextureCount(): number {\n    return this._model.isUsingMasking()\n      ? this._clippingManager.getRenderTextureCount()\n      : -1;\n  }\n\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    super();\n    this._clippingContextBufferForMask = null;\n    this._clippingContextBufferForDraw = null;\n    this._rendererProfile = new CubismRendererProfile_WebGL();\n    this.firstDraw = true;\n    this._textures = new csmMap<number, number>();\n    this._sortedDrawableIndexList = new csmVector<number>();\n    this._bufferData = {\n      vertex: (WebGLBuffer = null),\n      uv: (WebGLBuffer = null),\n      index: (WebGLBuffer = null)\n    };\n\n    // テクスチャ対応マップの容量を確保しておく\n    this._textures.prepareCapacity(32, true);\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    if (this._clippingManager) {\n      this._clippingManager.release();\n      this._clippingManager = void 0;\n      this._clippingManager = null;\n    }\n\n    if (this.gl == null) {\n      return;\n    }\n    this.gl.deleteBuffer(this._bufferData.vertex);\n    this._bufferData.vertex = null;\n    this.gl.deleteBuffer(this._bufferData.uv);\n    this._bufferData.uv = null;\n    this.gl.deleteBuffer(this._bufferData.index);\n    this._bufferData.index = null;\n    this._bufferData = null;\n\n    this._textures = null;\n  }\n\n  /**\n   * モデルを描画する実際の処理\n   */\n  public doDrawModel(): void {\n    if (this.gl == null) {\n      CubismLogError(\n        \"'gl' is null. WebGLRenderingContext is required.\\nPlease call 'CubimRenderer_WebGL.startUp' function.\"\n      );\n      return;\n    }\n\n    //------------ クリッピングマスク・バッファ前処理方式の場合 ------------\n    if (this._clippingManager != null) {\n      this.preDraw();\n\n      if (this.isUsingHighPrecisionMask()) {\n        this._clippingManager.setupMatrixForHighPrecision(\n          this.getModel(),\n          false\n        );\n      } else {\n        this._clippingManager.setupClippingContext(this.getModel(), this);\n      }\n    }\n\n    // 上記クリッピング処理内でも一度PreDrawを呼ぶので注意!!\n    this.preDraw();\n\n    const drawableCount: number = this.getModel().getDrawableCount();\n    const renderOrder: Int32Array = this.getModel().getDrawableRenderOrders();\n\n    // インデックスを描画順でソート\n    for (let i = 0; i < drawableCount; ++i) {\n      const order: number = renderOrder[i];\n      this._sortedDrawableIndexList.set(order, i);\n    }\n\n    // 描画\n    for (let i = 0; i < drawableCount; ++i) {\n      const drawableIndex: number = this._sortedDrawableIndexList.at(i);\n\n      // Drawableが表示状態でなければ処理をパスする\n      if (!this.getModel().getDrawableDynamicFlagIsVisible(drawableIndex)) {\n        continue;\n      }\n\n      const clipContext =\n        this._clippingManager != null\n          ? this._clippingManager\n              .getClippingContextListForDraw()\n              .at(drawableIndex)\n          : null;\n\n      if (clipContext != null && this.isUsingHighPrecisionMask()) {\n        // 描くことになっていた\n        if (clipContext._isUsing) {\n          // 生成したFrameBufferと同じサイズでビューポートを設定\n          this.gl.viewport(\n            0,\n            0,\n            this._clippingManager.getClippingMaskBufferSize(),\n            this._clippingManager.getClippingMaskBufferSize()\n          );\n\n          this.preDraw(); // バッファをクリアする\n\n          // ---------- マスク描画処理 ----------\n          // マスク用RenderTextureをactiveにセット\n          this.gl.bindFramebuffer(\n            this.gl.FRAMEBUFFER,\n            clipContext\n              .getClippingManager()\n              .getMaskRenderTexture()\n              .at(clipContext._bufferIndex)\n          );\n\n          // マスクをクリアする\n          // (仮仕様) 1が無効（描かれない）領域、0が有効（描かれる）領域。（シェーダーCd*Csで0に近い値をかけてマスクを作る。1をかけると何も起こらない）\n          this.gl.clearColor(1.0, 1.0, 1.0, 1.0);\n          this.gl.clear(this.gl.COLOR_BUFFER_BIT);\n        }\n\n        {\n          const clipDrawCount: number = clipContext._clippingIdCount;\n\n          for (let index = 0; index < clipDrawCount; index++) {\n            const clipDrawIndex: number = clipContext._clippingIdList[index];\n\n            // 頂点情報が更新されておらず、信頼性がない場合は描画をパスする\n            if (\n              !this._model.getDrawableDynamicFlagVertexPositionsDidChange(\n                clipDrawIndex\n              )\n            ) {\n              continue;\n            }\n\n            this.setIsCulling(\n              this._model.getDrawableCulling(clipDrawIndex) != false\n            );\n\n            // 今回専用の変換を適用して描く\n            // チャンネルも切り替える必要がある(A,R,G,B)\n            this.setClippingContextBufferForMask(clipContext);\n\n            this.drawMeshWebGL(this._model, clipDrawIndex);\n          }\n        }\n\n        {\n          // --- 後処理 ---\n          this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, s_fbo); // 描画対象を戻す\n          this.setClippingContextBufferForMask(null);\n\n          this.gl.viewport(\n            s_viewport[0],\n            s_viewport[1],\n            s_viewport[2],\n            s_viewport[3]\n          );\n\n          this.preDraw(); // バッファをクリアする\n        }\n      }\n\n      // クリッピングマスクをセットする\n      this.setClippingContextBufferForDraw(clipContext);\n\n      this.setIsCulling(this.getModel().getDrawableCulling(drawableIndex));\n\n      this.drawMeshWebGL(this._model, drawableIndex);\n    }\n  }\n\n  /**\n   * 描画オブジェクト（アートメッシュ）を描画する。\n   * @param model 描画対象のモデル\n   * @param index 描画対象のメッシュのインデックス\n   */\n  public drawMeshWebGL(model: Readonly<CubismModel>, index: number): void {\n    // 裏面描画の有効・無効\n    if (this.isCulling()) {\n      this.gl.enable(this.gl.CULL_FACE);\n    } else {\n      this.gl.disable(this.gl.CULL_FACE);\n    }\n\n    this.gl.frontFace(this.gl.CCW); // Cubism SDK OpenGLはマスク・アートメッシュ共にCCWが表面\n\n    if (this.isGeneratingMask()) {\n      CubismShader_WebGL.getInstance().setupShaderProgramForMask(\n        this,\n        model,\n        index\n      );\n    } else {\n      CubismShader_WebGL.getInstance().setupShaderProgramForDraw(\n        this,\n        model,\n        index\n      );\n    }\n\n    {\n      const indexCount: number = model.getDrawableVertexIndexCount(index);\n      this.gl.drawElements(\n        this.gl.TRIANGLES,\n        indexCount,\n        this.gl.UNSIGNED_SHORT,\n        0\n      );\n    }\n\n    // 後処理\n    this.gl.useProgram(null);\n    this.setClippingContextBufferForDraw(null);\n    this.setClippingContextBufferForMask(null);\n  }\n\n  protected saveProfile(): void {\n    this._rendererProfile.save();\n  }\n\n  protected restoreProfile(): void {\n    this._rendererProfile.restore();\n  }\n\n  /**\n   * レンダラが保持する静的なリソースを解放する\n   * WebGLの静的なシェーダープログラムを解放する\n   */\n  public static doStaticRelease(): void {\n    CubismShader_WebGL.deleteInstance();\n  }\n\n  /**\n   * レンダーステートを設定する\n   * @param fbo アプリケーション側で指定しているフレームバッファ\n   * @param viewport ビューポート\n   */\n  public setRenderState(fbo: WebGLFramebuffer, viewport: number[]): void {\n    s_fbo = fbo;\n    s_viewport = viewport;\n  }\n\n  /**\n   * 描画開始時の追加処理\n   * モデルを描画する前にクリッピングマスクに必要な処理を実装している\n   */\n  public preDraw(): void {\n    if (this.firstDraw) {\n      this.firstDraw = false;\n    }\n\n    this.gl.disable(this.gl.SCISSOR_TEST);\n    this.gl.disable(this.gl.STENCIL_TEST);\n    this.gl.disable(this.gl.DEPTH_TEST);\n\n    // カリング（1.0beta3）\n    this.gl.frontFace(this.gl.CW);\n\n    this.gl.enable(this.gl.BLEND);\n    this.gl.colorMask(true, true, true, true);\n\n    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, null); // 前にバッファがバインドされていたら破棄する必要がある\n    this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, null);\n\n    // 異方性フィルタリングを適用する\n    if (this.getAnisotropy() > 0.0 && this._extension) {\n      for (let i = 0; i < this._textures.getSize(); ++i) {\n        this.gl.bindTexture(this.gl.TEXTURE_2D, this._textures.getValue(i));\n        this.gl.texParameterf(\n          this.gl.TEXTURE_2D,\n          this._extension.TEXTURE_MAX_ANISOTROPY_EXT,\n          this.getAnisotropy()\n        );\n      }\n    }\n  }\n\n  /**\n   * マスクテクスチャに描画するクリッピングコンテキストをセットする\n   */\n  public setClippingContextBufferForMask(clip: CubismClippingContext_WebGL) {\n    this._clippingContextBufferForMask = clip;\n  }\n\n  /**\n   * マスクテクスチャに描画するクリッピングコンテキストを取得する\n   * @return マスクテクスチャに描画するクリッピングコンテキスト\n   */\n  public getClippingContextBufferForMask(): CubismClippingContext_WebGL {\n    return this._clippingContextBufferForMask;\n  }\n\n  /**\n   * 画面上に描画するクリッピングコンテキストをセットする\n   */\n  public setClippingContextBufferForDraw(\n    clip: CubismClippingContext_WebGL\n  ): void {\n    this._clippingContextBufferForDraw = clip;\n  }\n\n  /**\n   * 画面上に描画するクリッピングコンテキストを取得する\n   * @return 画面上に描画するクリッピングコンテキスト\n   */\n  public getClippingContextBufferForDraw(): CubismClippingContext_WebGL {\n    return this._clippingContextBufferForDraw;\n  }\n\n  /**\n   * マスク生成時かを判定する\n   * @returns 判定値\n   */\n  public isGeneratingMask() {\n    return this.getClippingContextBufferForMask() != null;\n  }\n\n  /**\n   * glの設定\n   */\n  public startUp(gl: WebGLRenderingContext): void {\n    this.gl = gl;\n\n    if (this._clippingManager) {\n      this._clippingManager.setGL(gl);\n    }\n\n    CubismShader_WebGL.getInstance().setGl(gl);\n    this._rendererProfile.setGl(gl);\n\n    // 異方性フィルタリングが使用できるかチェック\n    this._extension =\n      this.gl.getExtension('EXT_texture_filter_anisotropic') ||\n      this.gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic') ||\n      this.gl.getExtension('MOZ_EXT_texture_filter_anisotropic');\n  }\n\n  _textures: csmMap<number, WebGLTexture>; // モデルが参照するテクスチャとレンダラでバインドしているテクスチャとのマップ\n  _sortedDrawableIndexList: csmVector<number>; // 描画オブジェクトのインデックスを描画順に並べたリスト\n  _clippingManager: CubismClippingManager_WebGL; // クリッピングマスク管理オブジェクト\n  _clippingContextBufferForMask: CubismClippingContext_WebGL; // マスクテクスチャに描画するためのクリッピングコンテキスト\n  _clippingContextBufferForDraw: CubismClippingContext_WebGL; // 画面上描画するためのクリッピングコンテキスト\n  _rendererProfile: CubismRendererProfile_WebGL;\n  firstDraw: boolean;\n  _bufferData: {\n    vertex: WebGLBuffer;\n    uv: WebGLBuffer;\n    index: WebGLBuffer;\n  }; // 頂点バッファデータ\n  _extension: any; // 拡張機能\n  gl: WebGLRenderingContext; // webglコンテキスト\n}\n\n/**\n * レンダラが保持する静的なリソースを開放する\n */\nCubismRenderer.staticRelease = (): void => {\n  CubismRenderer_WebGL.doStaticRelease();\n};\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismrenderer_webgl';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismClippingContext = $.CubismClippingContext_WebGL;\n  export type CubismClippingContext = $.CubismClippingContext_WebGL;\n  export const CubismClippingManager_WebGL = $.CubismClippingManager_WebGL;\n  export type CubismClippingManager_WebGL = $.CubismClippingManager_WebGL;\n  export const CubismRenderTextureResource = $.CubismRenderTextureResource;\n  export type CubismRenderTextureResource = $.CubismRenderTextureResource;\n  export const CubismRenderer_WebGL = $.CubismRenderer_WebGL;\n  export type CubismRenderer_WebGL = $.CubismRenderer_WebGL;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdHandle } from '../id/cubismid';\nimport { CubismFramework } from '../live2dcubismframework';\nimport {\n  CubismBlendMode,\n  CubismTextureColor\n} from '../rendering/cubismrenderer';\nimport { csmMap } from '../type/csmmap';\nimport { csmVector } from '../type/csmvector';\nimport { CSM_ASSERT } from '../utils/cubismdebug';\n\n/**\n * SDK側から与えられたDrawableの乗算色・スクリーン色上書きフラグと\n * その色を保持する構造体\n */\nexport class DrawableColorData {\n  constructor(\n    isOverwritten = false,\n    color: CubismTextureColor = new CubismTextureColor()\n  ) {\n    this.isOverwritten = isOverwritten;\n    this.color = color;\n  }\n\n  public isOverwritten: boolean;\n  public color: CubismTextureColor;\n}\n/**\n * @brief テクスチャの色をRGBAで扱うための構造体\n */\nexport class PartColorData {\n  constructor(\n    isOverwritten = false,\n    color: CubismTextureColor = new CubismTextureColor()\n  ) {\n    this.isOverwritten = isOverwritten;\n    this.color = color;\n  }\n\n  public isOverwritten: boolean;\n  public color: CubismTextureColor;\n}\n\n/**\n * テクスチャのカリング設定を管理するための構造体\n */\nexport class DrawableCullingData {\n  /**\n   * コンストラクタ\n   *\n   * @param isOverwritten\n   * @param isCulling\n   */\n  public constructor(isOverwritten = false, isCulling = false) {\n    this.isOverwritten = isOverwritten;\n    this.isCulling = isCulling;\n  }\n\n  public isOverwritten: boolean;\n  public isCulling: boolean;\n}\n\n/**\n * モデル\n *\n * Mocデータから生成されるモデルのクラス。\n */\nexport class CubismModel {\n  /**\n   * モデルのパラメータの更新\n   */\n  public update(): void {\n    // Update model\n    this._model.update();\n\n    this._model.drawables.resetDynamicFlags();\n  }\n\n  /**\n   * PixelsPerUnitを取得する\n   * @returns PixelsPerUnit\n   */\n  public getPixelsPerUnit(): number {\n    if (this._model == null) {\n      return 0.0;\n    }\n\n    return this._model.canvasinfo.PixelsPerUnit;\n  }\n\n  /**\n   * キャンバスの幅を取得する\n   */\n  public getCanvasWidth(): number {\n    if (this._model == null) {\n      return 0.0;\n    }\n\n    return (\n      this._model.canvasinfo.CanvasWidth / this._model.canvasinfo.PixelsPerUnit\n    );\n  }\n\n  /**\n   * キャンバスの高さを取得する\n   */\n  public getCanvasHeight(): number {\n    if (this._model == null) {\n      return 0.0;\n    }\n\n    return (\n      this._model.canvasinfo.CanvasHeight / this._model.canvasinfo.PixelsPerUnit\n    );\n  }\n\n  /**\n   * パラメータを保存する\n   */\n  public saveParameters(): void {\n    const parameterCount: number = this._model.parameters.count;\n    const savedParameterCount: number = this._savedParameters.getSize();\n\n    for (let i = 0; i < parameterCount; ++i) {\n      if (i < savedParameterCount) {\n        this._savedParameters.set(i, this._parameterValues[i]);\n      } else {\n        this._savedParameters.pushBack(this._parameterValues[i]);\n      }\n    }\n  }\n\n  /**\n   * 乗算色を取得する\n   * @param index Drawablesのインデックス\n   * @returns 指定したdrawableの乗算色(RGBA)\n   */\n  public getMultiplyColor(index: number): CubismTextureColor {\n    // Drawableとモデル全体の乗算色上書きフラグがどちらもtrueな場合、モデル全体の上書きフラグが優先される\n    if (\n      this.getOverwriteFlagForModelMultiplyColors() ||\n      this.getOverwriteFlagForDrawableMultiplyColors(index)\n    ) {\n      return this._userMultiplyColors.at(index).color;\n    }\n\n    const color = this.getDrawableMultiplyColor(index);\n    return color;\n  }\n\n  /**\n   * スクリーン色を取得する\n   * @param index Drawablesのインデックス\n   * @returns 指定したdrawableのスクリーン色(RGBA)\n   */\n  public getScreenColor(index: number): CubismTextureColor {\n    // Drawableとモデル全体のスクリーン色上書きフラグがどちらもtrueな場合、モデル全体の上書きフラグが優先される\n    if (\n      this.getOverwriteFlagForModelScreenColors() ||\n      this.getOverwriteFlagForDrawableScreenColors(index)\n    ) {\n      return this._userScreenColors.at(index).color;\n    }\n\n    const color = this.getDrawableScreenColor(index);\n    return color;\n  }\n\n  /**\n   * 乗算色をセットする\n   * @param index Drawablesのインデックス\n   * @param color 設定する乗算色(CubismTextureColor)\n   */\n  public setMultiplyColorByTextureColor(\n    index: number,\n    color: CubismTextureColor\n  ) {\n    this.setMultiplyColorByRGBA(index, color.r, color.g, color.b, color.a);\n  }\n\n  /**\n   * 乗算色をセットする\n   * @param index Drawablesのインデックス\n   * @param r 設定する乗算色のR値\n   * @param g 設定する乗算色のG値\n   * @param b 設定する乗算色のB値\n   * @param a 設定する乗算色のA値\n   */\n  public setMultiplyColorByRGBA(\n    index: number,\n    r: number,\n    g: number,\n    b: number,\n    a = 1.0\n  ) {\n    this._userMultiplyColors.at(index).color.r = r;\n    this._userMultiplyColors.at(index).color.g = g;\n    this._userMultiplyColors.at(index).color.b = b;\n    this._userMultiplyColors.at(index).color.a = a;\n  }\n\n  /**\n   * スクリーン色をセットする\n   * @param index Drawablesのインデックス\n   * @param color 設定するスクリーン色(CubismTextureColor)\n   */\n  public setScreenColorByTextureColor(\n    index: number,\n    color: CubismTextureColor\n  ) {\n    this.setScreenColorByRGBA(index, color.r, color.g, color.b, color.a);\n  }\n\n  /**\n   * スクリーン色をセットする\n   * @param index Drawablesのインデックス\n   * @param r 設定するスクリーン色のR値\n   * @param g 設定するスクリーン色のG値\n   * @param b 設定するスクリーン色のB値\n   * @param a 設定するスクリーン色のA値\n   */\n  public setScreenColorByRGBA(\n    index: number,\n    r: number,\n    g: number,\n    b: number,\n    a = 1.0\n  ) {\n    this._userScreenColors.at(index).color.r = r;\n    this._userScreenColors.at(index).color.g = g;\n    this._userScreenColors.at(index).color.b = b;\n    this._userScreenColors.at(index).color.a = a;\n  }\n  /**\n   * partの乗算色を取得する\n   * @param partIndex partのインデックス\n   * @returns 指定したpartの乗算色\n   */\n  public getPartMultiplyColor(partIndex: number): CubismTextureColor {\n    return this._userPartMultiplyColors.at(partIndex).color;\n  }\n\n  /**\n   * partのスクリーン色を取得する\n   * @param partIndex partのインデックス\n   * @returns 指定したpartのスクリーン色\n   */\n  public getPartScreenColor(partIndex: number): CubismTextureColor {\n    return this._userPartScreenColors.at(partIndex).color;\n  }\n\n  /**\n   * partのOverwriteColor setter関数\n   * @param partIndex partのインデックス\n   * @param r 設定する色のR値\n   * @param g 設定する色のG値\n   * @param b 設定する色のB値\n   * @param a 設定する色のA値\n   * @param partColors 設定するpartのカラーデータ配列\n   * @param drawableColors partに関連するDrawableのカラーデータ配列\n   */\n  public setPartColor(\n    partIndex: number,\n    r: number,\n    g: number,\n    b: number,\n    a: number,\n    partColors: csmVector<PartColorData>,\n    drawableColors: csmVector<DrawableColorData>\n  ) {\n    partColors.at(partIndex).color.r = r;\n    partColors.at(partIndex).color.g = g;\n    partColors.at(partIndex).color.b = b;\n    partColors.at(partIndex).color.a = a;\n\n    if (partColors.at(partIndex).isOverwritten) {\n      for (\n        let i = 0;\n        i < this._partChildDrawables.at(partIndex).getSize();\n        ++i\n      ) {\n        const drawableIndex = this._partChildDrawables.at(partIndex).at(i);\n        drawableColors.at(drawableIndex).color.r = r;\n        drawableColors.at(drawableIndex).color.g = g;\n        drawableColors.at(drawableIndex).color.b = b;\n        drawableColors.at(drawableIndex).color.a = a;\n      }\n    }\n  }\n\n  /**\n   * 乗算色をセットする\n   * @param partIndex partのインデックス\n   * @param color 設定する乗算色(CubismTextureColor)\n   */\n  public setPartMultiplyColorByTextureColor(\n    partIndex: number,\n    color: CubismTextureColor\n  ) {\n    this.setPartMultiplyColorByRGBA(\n      partIndex,\n      color.r,\n      color.g,\n      color.b,\n      color.a\n    );\n  }\n\n  /**\n   * 乗算色をセットする\n   * @param partIndex partのインデックス\n   * @param r 設定する乗算色のR値\n   * @param g 設定する乗算色のG値\n   * @param b 設定する乗算色のB値\n   * @param a 設定する乗算色のA値\n   */\n  public setPartMultiplyColorByRGBA(\n    partIndex: number,\n    r: number,\n    g: number,\n    b: number,\n    a: number\n  ) {\n    this.setPartColor(\n      partIndex,\n      r,\n      g,\n      b,\n      a,\n      this._userPartMultiplyColors,\n      this._userMultiplyColors\n    );\n  }\n\n  /**\n   * スクリーン色をセットする\n   * @param partIndex partのインデックス\n   * @param color 設定するスクリーン色(CubismTextureColor)\n   */\n  public setPartScreenColorByTextureColor(\n    partIndex: number,\n    color: CubismTextureColor\n  ) {\n    this.setPartScreenColorByRGBA(\n      partIndex,\n      color.r,\n      color.g,\n      color.b,\n      color.a\n    );\n  }\n\n  /**\n   * スクリーン色をセットする\n   * @param partIndex partのインデックス\n   * @param r 設定するスクリーン色のR値\n   * @param g 設定するスクリーン色のG値\n   * @param b 設定するスクリーン色のB値\n   * @param a 設定するスクリーン色のA値\n   */\n  public setPartScreenColorByRGBA(\n    partIndex: number,\n    r: number,\n    g: number,\n    b: number,\n    a: number\n  ) {\n    this.setPartColor(\n      partIndex,\n      r,\n      g,\n      b,\n      a,\n      this._userPartScreenColors,\n      this._userScreenColors\n    );\n  }\n\n  /**\n   * SDKから指定したモデルの乗算色を上書きするか\n   * @returns true -> SDKからの情報を優先する\n   *          false -> モデルに設定されている色情報を使用\n   */\n  public getOverwriteFlagForModelMultiplyColors(): boolean {\n    return this._isOverwrittenModelMultiplyColors;\n  }\n\n  /**\n   * SDKから指定したモデルのスクリーン色を上書きするか\n   * @returns true -> SDKからの情報を優先する\n   *          false -> モデルに設定されている色情報を使用\n   */\n  public getOverwriteFlagForModelScreenColors(): boolean {\n    return this._isOverwrittenModelScreenColors;\n  }\n\n  /**\n   * SDKから指定したモデルの乗算色を上書きするかセットする\n   * @param value true -> SDKからの情報を優先する\n   *              false -> モデルに設定されている色情報を使用\n   */\n  public setOverwriteFlagForModelMultiplyColors(value: boolean) {\n    this._isOverwrittenModelMultiplyColors = value;\n  }\n\n  /**\n   * SDKから指定したモデルのスクリーン色を上書きするかセットする\n   * @param value true -> SDKからの情報を優先する\n   *              false -> モデルに設定されている色情報を使用\n   */\n  public setOverwriteFlagForModelScreenColors(value: boolean) {\n    this._isOverwrittenModelScreenColors = value;\n  }\n\n  /**\n   * SDKから指定したDrawableIndexの乗算色を上書きするか\n   * @returns true -> SDKからの情報を優先する\n   *          false -> モデルに設定されている色情報を使用\n   */\n  public getOverwriteFlagForDrawableMultiplyColors(\n    drawableindex: number\n  ): boolean {\n    return this._userMultiplyColors.at(drawableindex).isOverwritten;\n  }\n\n  /**\n   * SDKから指定したDrawableIndexのスクリーン色を上書きするか\n   * @returns true -> SDKからの情報を優先する\n   *          false -> モデルに設定されている色情報を使用\n   */\n  public getOverwriteFlagForDrawableScreenColors(\n    drawableindex: number\n  ): boolean {\n    return this._userScreenColors.at(drawableindex).isOverwritten;\n  }\n\n  /**\n   * SDKから指定したDrawableIndexの乗算色を上書きするかセットする\n   * @param value true -> SDKからの情報を優先する\n   *              false -> モデルに設定されている色情報を使用\n   */\n  public setOverwriteFlagForDrawableMultiplyColors(\n    drawableindex: number,\n    value: boolean\n  ) {\n    this._userMultiplyColors.at(drawableindex).isOverwritten = value;\n  }\n\n  /**\n   * SDKから指定したDrawableIndexのスクリーン色を上書きするかセットする\n   * @param value true -> SDKからの情報を優先する\n   *              false -> モデルに設定されている色情報を使用\n   */\n  public setOverwriteFlagForDrawableScreenColors(\n    drawableindex: number,\n    value: boolean\n  ) {\n    this._userScreenColors.at(drawableindex).isOverwritten = value;\n  }\n\n  /**\n   * SDKからpartの乗算色を上書きするか\n   * @param partIndex partのインデックス\n   * @returns true    ->  SDKからの情報を優先する\n   *          false   ->  モデルに設定されている色情報を使用\n   */\n  public getOverwriteColorForPartMultiplyColors(partIndex: number) {\n    return this._userPartMultiplyColors.at(partIndex).isOverwritten;\n  }\n\n  /**\n   * SDKからpartのスクリーン色を上書きするか\n   * @param partIndex partのインデックス\n   * @returns true    ->  SDKからの情報を優先する\n   *          false   ->  モデルに設定されている色情報を使用\n   */\n  public getOverwriteColorForPartScreenColors(partIndex: number) {\n    return this._userPartScreenColors.at(partIndex).isOverwritten;\n  }\n\n  /**\n   * partのOverwriteFlag setter関数\n   * @param partIndex partのインデックス\n   * @param value true -> SDKからの情報を優先する\n   *              false -> モデルに設定されている色情報を使用\n   * @param partColors 設定するpartのカラーデータ配列\n   * @param drawableColors partに関連するDrawableのカラーデータ配列\n   */\n  public setOverwriteColorForPartColors(\n    partIndex: number,\n    value: boolean,\n    partColors: csmVector<PartColorData>,\n    drawableColors: csmVector<DrawableColorData>\n  ) {\n    partColors.at(partIndex).isOverwritten = value;\n\n    for (let i = 0; i < this._partChildDrawables.at(partIndex).getSize(); ++i) {\n      const drawableIndex = this._partChildDrawables.at(partIndex).at(i);\n      drawableColors.at(drawableIndex).isOverwritten = value;\n\n      if (value) {\n        drawableColors.at(drawableIndex).color.r =\n          partColors.at(partIndex).color.r;\n        drawableColors.at(drawableIndex).color.g =\n          partColors.at(partIndex).color.g;\n        drawableColors.at(drawableIndex).color.b =\n          partColors.at(partIndex).color.b;\n        drawableColors.at(drawableIndex).color.a =\n          partColors.at(partIndex).color.a;\n      }\n    }\n  }\n\n  /**\n   * SDKからpartのスクリーン色を上書きするかをセットする\n   * @param partIndex partのインデックス\n   * @param value true -> SDKからの情報を優先する\n   *              false -> モデルに設定されている色情報を使用\n   */\n  public setOverwriteColorForPartMultiplyColors(\n    partIndex: number,\n    value: boolean\n  ) {\n    this._userPartMultiplyColors.at(partIndex).isOverwritten = value;\n    this.setOverwriteColorForPartColors(\n      partIndex,\n      value,\n      this._userPartMultiplyColors,\n      this._userMultiplyColors\n    );\n  }\n\n  /**\n   * SDKからpartのスクリーン色を上書きするかをセットする\n   * @param partIndex partのインデックス\n   * @param value true -> SDKからの情報を優先する\n   *              false -> モデルに設定されている色情報を使用\n   */\n  public setOverwriteColorForPartScreenColors(\n    partIndex: number,\n    value: boolean\n  ) {\n    this._userPartScreenColors.at(partIndex).isOverwritten = value;\n    this.setOverwriteColorForPartColors(\n      partIndex,\n      value,\n      this._userPartScreenColors,\n      this._userScreenColors\n    );\n  }\n\n  /**\n   * Drawableのカリング情報を取得する。\n   *\n   * @param   drawableIndex   Drawableのインデックス\n   * @return  Drawableのカリング情報\n   */\n  public getDrawableCulling(drawableIndex: number): boolean {\n    if (\n      this.getOverwriteFlagForModelCullings() ||\n      this.getOverwriteFlagForDrawableCullings(drawableIndex)\n    ) {\n      return this._userCullings.at(drawableIndex).isCulling;\n    }\n\n    const constantFlags = this._model.drawables.constantFlags;\n    return !Live2DCubismCore.Utils.hasIsDoubleSidedBit(\n      constantFlags[drawableIndex]\n    );\n  }\n\n  /**\n   * Drawableのカリング情報を設定する。\n   *\n   * @param drawableIndex Drawableのインデックス\n   * @param isCulling カリング情報\n   */\n  public setDrawableCulling(drawableIndex: number, isCulling: boolean): void {\n    this._userCullings.at(drawableIndex).isCulling = isCulling;\n  }\n\n  /**\n   * SDKからモデル全体のカリング設定を上書きするか。\n   *\n   * @retval  true    ->  SDK上のカリング設定を使用\n   * @retval  false   ->  モデルのカリング設定を使用\n   */\n  public getOverwriteFlagForModelCullings(): boolean {\n    return this._isOverwrittenCullings;\n  }\n\n  /**\n   * SDKからモデル全体のカリング設定を上書きするかを設定する。\n   *\n   * @param isOverwrittenCullings SDK上のカリング設定を使うならtrue、モデルのカリング設定を使うならfalse\n   */\n  public setOverwriteFlagForModelCullings(\n    isOverwrittenCullings: boolean\n  ): void {\n    this._isOverwrittenCullings = isOverwrittenCullings;\n  }\n\n  /**\n   *\n   * @param drawableIndex Drawableのインデックス\n   * @retval  true    ->  SDK上のカリング設定を使用\n   * @retval  false   ->  モデルのカリング設定を使用\n   */\n  public getOverwriteFlagForDrawableCullings(drawableIndex: number): boolean {\n    return this._userCullings.at(drawableIndex).isOverwritten;\n  }\n\n  /**\n   *\n   * @param drawableIndex Drawableのインデックス\n   * @param isOverwrittenCullings SDK上のカリング設定を使うならtrue、モデルのカリング設定を使うならfalse\n   */\n  public setOverwriteFlagForDrawableCullings(\n    drawableIndex: number,\n    isOverwrittenCullings: boolean\n  ): void {\n    this._userCullings.at(drawableIndex).isOverwritten = isOverwrittenCullings;\n  }\n\n  /**\n   * モデルの不透明度を取得する\n   *\n   * @returns 不透明度の値\n   */\n  public getModelOapcity(): number {\n    return this._modelOpacity;\n  }\n\n  /**\n   * モデルの不透明度を設定する\n   *\n   * @param value 不透明度の値\n   */\n  public setModelOapcity(value: number) {\n    this._modelOpacity = value;\n  }\n\n  /**\n   * モデルを取得\n   */\n  public getModel(): Live2DCubismCore.Model {\n    return this._model;\n  }\n\n  /**\n   * パーツのインデックスを取得\n   * @param partId パーツのID\n   * @return パーツのインデックス\n   */\n  public getPartIndex(partId: CubismIdHandle): number {\n    let partIndex: number;\n    const partCount: number = this._model.parts.count;\n\n    for (partIndex = 0; partIndex < partCount; ++partIndex) {\n      if (partId == this._partIds.at(partIndex)) {\n        return partIndex;\n      }\n    }\n\n    // モデルに存在していない場合、非存在パーツIDリスト内にあるかを検索し、そのインデックスを返す\n    if (this._notExistPartId.isExist(partId)) {\n      return this._notExistPartId.getValue(partId);\n    }\n\n    // 非存在パーツIDリストにない場合、新しく要素を追加する\n    partIndex = partCount + this._notExistPartId.getSize();\n    this._notExistPartId.setValue(partId, partIndex);\n    this._notExistPartOpacities.appendKey(partIndex);\n\n    return partIndex;\n  }\n\n  /**\n   * パーツのIDを取得する。\n   *\n   * @param partIndex 取得するパーツのインデックス\n   * @return パーツのID\n   */\n  public getPartId(partIndex: number): CubismIdHandle {\n    const partId = this._model.parts.ids[partIndex];\n    return CubismFramework.getIdManager().getId(partId);\n  }\n\n  /**\n   * パーツの個数の取得\n   * @return パーツの個数\n   */\n  public getPartCount(): number {\n    const partCount: number = this._model.parts.count;\n    return partCount;\n  }\n\n  /**\n   * パーツの不透明度の設定(Index)\n   * @param partIndex パーツのインデックス\n   * @param opacity 不透明度\n   */\n  public setPartOpacityByIndex(partIndex: number, opacity: number): void {\n    if (this._notExistPartOpacities.isExist(partIndex)) {\n      this._notExistPartOpacities.setValue(partIndex, opacity);\n      return;\n    }\n\n    // インデックスの範囲内検知\n    CSM_ASSERT(0 <= partIndex && partIndex < this.getPartCount());\n\n    this._partOpacities[partIndex] = opacity;\n  }\n\n  /**\n   * パーツの不透明度の設定(Id)\n   * @param partId パーツのID\n   * @param opacity パーツの不透明度\n   */\n  public setPartOpacityById(partId: CubismIdHandle, opacity: number): void {\n    // 高速化のためにPartIndexを取得できる機構になっているが、外部からの設定の時は呼び出し頻度が低いため不要\n    const index: number = this.getPartIndex(partId);\n\n    if (index < 0) {\n      return; // パーツがないのでスキップ\n    }\n\n    this.setPartOpacityByIndex(index, opacity);\n  }\n\n  /**\n   * パーツの不透明度の取得(index)\n   * @param partIndex パーツのインデックス\n   * @return パーツの不透明度\n   */\n  public getPartOpacityByIndex(partIndex: number): number {\n    if (this._notExistPartOpacities.isExist(partIndex)) {\n      // モデルに存在しないパーツIDの場合、非存在パーツリストから不透明度を返す。\n      return this._notExistPartOpacities.getValue(partIndex);\n    }\n\n    // インデックスの範囲内検知\n    CSM_ASSERT(0 <= partIndex && partIndex < this.getPartCount());\n\n    return this._partOpacities[partIndex];\n  }\n\n  /**\n   * パーツの不透明度の取得(id)\n   * @param partId パーツのＩｄ\n   * @return パーツの不透明度\n   */\n  public getPartOpacityById(partId: CubismIdHandle): number {\n    // 高速化のためにPartIndexを取得できる機構になっているが、外部からの設定の時は呼び出し頻度が低いため不要\n    const index: number = this.getPartIndex(partId);\n\n    if (index < 0) {\n      return 0; // パーツが無いのでスキップ\n    }\n\n    return this.getPartOpacityByIndex(index);\n  }\n\n  /**\n   * パラメータのインデックスの取得\n   * @param パラメータID\n   * @return パラメータのインデックス\n   */\n  public getParameterIndex(parameterId: CubismIdHandle): number {\n    let parameterIndex: number;\n    const idCount: number = this._model.parameters.count;\n\n    for (parameterIndex = 0; parameterIndex < idCount; ++parameterIndex) {\n      if (parameterId != this._parameterIds.at(parameterIndex)) {\n        continue;\n      }\n\n      return parameterIndex;\n    }\n\n    // モデルに存在していない場合、非存在パラメータIDリスト内を検索し、そのインデックスを返す\n    if (this._notExistParameterId.isExist(parameterId)) {\n      return this._notExistParameterId.getValue(parameterId);\n    }\n\n    // 非存在パラメータIDリストにない場合新しく要素を追加する\n    parameterIndex =\n      this._model.parameters.count + this._notExistParameterId.getSize();\n\n    this._notExistParameterId.setValue(parameterId, parameterIndex);\n    this._notExistParameterValues.appendKey(parameterIndex);\n\n    return parameterIndex;\n  }\n\n  /**\n   * パラメータの個数の取得\n   * @return パラメータの個数\n   */\n  public getParameterCount(): number {\n    return this._model.parameters.count;\n  }\n\n  /**\n   * パラメータの種類の取得\n   * @param parameterIndex パラメータのインデックス\n   * @return csmParameterType_Normal -> 通常のパラメータ\n   *          csmParameterType_BlendShape -> ブレンドシェイプパラメータ\n   */\n  public getParameterType(\n    parameterIndex: number\n  ): Live2DCubismCore.csmParameterType {\n    return this._model.parameters.types[parameterIndex];\n  }\n\n  /**\n   * パラメータの最大値の取得\n   * @param parameterIndex パラメータのインデックス\n   * @return パラメータの最大値\n   */\n  public getParameterMaximumValue(parameterIndex: number): number {\n    return this._model.parameters.maximumValues[parameterIndex];\n  }\n\n  /**\n   * パラメータの最小値の取得\n   * @param parameterIndex パラメータのインデックス\n   * @return パラメータの最小値\n   */\n  public getParameterMinimumValue(parameterIndex: number): number {\n    return this._model.parameters.minimumValues[parameterIndex];\n  }\n\n  /**\n   * パラメータのデフォルト値の取得\n   * @param parameterIndex パラメータのインデックス\n   * @return パラメータのデフォルト値\n   */\n  public getParameterDefaultValue(parameterIndex: number): number {\n    return this._model.parameters.defaultValues[parameterIndex];\n  }\n\n  /**\n   * 指定したパラメータindexのIDを取得\n   *\n   * @param parameterIndex パラメータのインデックス\n   * @returns パラメータID\n   */\n  public getParameterId(parameterIndex: number): CubismIdHandle {\n    return CubismFramework.getIdManager().getId(\n      this._model.parameters.ids[parameterIndex]\n    );\n  }\n\n  /**\n   * パラメータの値の取得\n   * @param parameterIndex    パラメータのインデックス\n   * @return パラメータの値\n   */\n  public getParameterValueByIndex(parameterIndex: number): number {\n    if (this._notExistParameterValues.isExist(parameterIndex)) {\n      return this._notExistParameterValues.getValue(parameterIndex);\n    }\n\n    // インデックスの範囲内検知\n    CSM_ASSERT(\n      0 <= parameterIndex && parameterIndex < this.getParameterCount()\n    );\n\n    return this._parameterValues[parameterIndex];\n  }\n\n  /**\n   * パラメータの値の取得\n   * @param parameterId    パラメータのID\n   * @return パラメータの値\n   */\n  public getParameterValueById(parameterId: CubismIdHandle): number {\n    // 高速化のためにparameterIndexを取得できる機構になっているが、外部からの設定の時は呼び出し頻度が低いため不要\n    const parameterIndex: number = this.getParameterIndex(parameterId);\n    return this.getParameterValueByIndex(parameterIndex);\n  }\n\n  /**\n   * パラメータの値の設定\n   * @param parameterIndex パラメータのインデックス\n   * @param value パラメータの値\n   * @param weight 重み\n   */\n  public setParameterValueByIndex(\n    parameterIndex: number,\n    value: number,\n    weight = 1.0\n  ): void {\n    if (this._notExistParameterValues.isExist(parameterIndex)) {\n      this._notExistParameterValues.setValue(\n        parameterIndex,\n        weight == 1\n          ? value\n          : this._notExistParameterValues.getValue(parameterIndex) *\n              (1 - weight) +\n              value * weight\n      );\n\n      return;\n    }\n\n    // インデックスの範囲内検知\n    CSM_ASSERT(\n      0 <= parameterIndex && parameterIndex < this.getParameterCount()\n    );\n\n    if (this._model.parameters.maximumValues[parameterIndex] < value) {\n      value = this._model.parameters.maximumValues[parameterIndex];\n    }\n    if (this._model.parameters.minimumValues[parameterIndex] > value) {\n      value = this._model.parameters.minimumValues[parameterIndex];\n    }\n\n    this._parameterValues[parameterIndex] =\n      weight == 1\n        ? value\n        : (this._parameterValues[parameterIndex] =\n            this._parameterValues[parameterIndex] * (1 - weight) +\n            value * weight);\n  }\n\n  /**\n   * パラメータの値の設定\n   * @param parameterId パラメータのID\n   * @param value パラメータの値\n   * @param weight 重み\n   */\n  public setParameterValueById(\n    parameterId: CubismIdHandle,\n    value: number,\n    weight = 1.0\n  ): void {\n    const index: number = this.getParameterIndex(parameterId);\n    this.setParameterValueByIndex(index, value, weight);\n  }\n\n  /**\n   * パラメータの値の加算(index)\n   * @param parameterIndex パラメータインデックス\n   * @param value 加算する値\n   * @param weight 重み\n   */\n  public addParameterValueByIndex(\n    parameterIndex: number,\n    value: number,\n    weight = 1.0\n  ): void {\n    this.setParameterValueByIndex(\n      parameterIndex,\n      this.getParameterValueByIndex(parameterIndex) + value * weight\n    );\n  }\n\n  /**\n   * パラメータの値の加算(id)\n   * @param parameterId パラメータＩＤ\n   * @param value 加算する値\n   * @param weight 重み\n   */\n  public addParameterValueById(\n    parameterId: any,\n    value: number,\n    weight = 1.0\n  ): void {\n    const index: number = this.getParameterIndex(parameterId);\n    this.addParameterValueByIndex(index, value, weight);\n  }\n\n  /**\n   * パラメータの値の乗算\n   * @param parameterId パラメータのID\n   * @param value 乗算する値\n   * @param weight 重み\n   */\n  public multiplyParameterValueById(\n    parameterId: CubismIdHandle,\n    value: number,\n    weight = 1.0\n  ): void {\n    const index: number = this.getParameterIndex(parameterId);\n    this.multiplyParameterValueByIndex(index, value, weight);\n  }\n\n  /**\n   * パラメータの値の乗算\n   * @param parameterIndex パラメータのインデックス\n   * @param value 乗算する値\n   * @param weight 重み\n   */\n  public multiplyParameterValueByIndex(\n    parameterIndex: number,\n    value: number,\n    weight = 1.0\n  ): void {\n    this.setParameterValueByIndex(\n      parameterIndex,\n      this.getParameterValueByIndex(parameterIndex) *\n        (1.0 + (value - 1.0) * weight)\n    );\n  }\n\n  /**\n   * Drawableのインデックスの取得\n   * @param drawableId DrawableのID\n   * @return Drawableのインデックス\n   */\n  public getDrawableIndex(drawableId: CubismIdHandle): number {\n    const drawableCount = this._model.drawables.count;\n\n    for (\n      let drawableIndex = 0;\n      drawableIndex < drawableCount;\n      ++drawableIndex\n    ) {\n      if (this._drawableIds.at(drawableIndex) == drawableId) {\n        return drawableIndex;\n      }\n    }\n\n    return -1;\n  }\n\n  /**\n   * Drawableの個数の取得\n   * @return drawableの個数\n   */\n  public getDrawableCount(): number {\n    const drawableCount = this._model.drawables.count;\n    return drawableCount;\n  }\n\n  /**\n   * DrawableのIDを取得する\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableのID\n   */\n  public getDrawableId(drawableIndex: number): CubismIdHandle {\n    const parameterIds: string[] = this._model.drawables.ids;\n    return CubismFramework.getIdManager().getId(parameterIds[drawableIndex]);\n  }\n\n  /**\n   * Drawableの描画順リストの取得\n   * @return Drawableの描画順リスト\n   */\n  public getDrawableRenderOrders(): Int32Array {\n    const renderOrders: Int32Array = this._model.drawables.renderOrders;\n    return renderOrders;\n  }\n\n  /**\n   * @deprecated\n   * 関数名が誤っていたため、代替となる getDrawableTextureIndex を追加し、この関数は非推奨となりました。\n   *\n   * Drawableのテクスチャインデックスリストの取得\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableのテクスチャインデックスリスト\n   */\n  public getDrawableTextureIndices(drawableIndex: number): number {\n    return this.getDrawableTextureIndex(drawableIndex);\n  }\n\n  /**\n   * Drawableのテクスチャインデックスの取得\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableのテクスチャインデックス\n   */\n  public getDrawableTextureIndex(drawableIndex: number): number {\n    const textureIndices: Int32Array = this._model.drawables.textureIndices;\n    return textureIndices[drawableIndex];\n  }\n\n  /**\n   * DrawableのVertexPositionsの変化情報の取得\n   *\n   * 直近のCubismModel.update関数でDrawableの頂点情報が変化したかを取得する。\n   *\n   * @param   drawableIndex   Drawableのインデックス\n   * @retval  true    Drawableの頂点情報が直近のCubismModel.update関数で変化した\n   * @retval  false   Drawableの頂点情報が直近のCubismModel.update関数で変化していない\n   */\n  public getDrawableDynamicFlagVertexPositionsDidChange(\n    drawableIndex: number\n  ): boolean {\n    const dynamicFlags: Uint8Array = this._model.drawables.dynamicFlags;\n    return Live2DCubismCore.Utils.hasVertexPositionsDidChangeBit(\n      dynamicFlags[drawableIndex]\n    );\n  }\n\n  /**\n   * Drawableの頂点インデックスの個数の取得\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableの頂点インデックスの個数\n   */\n  public getDrawableVertexIndexCount(drawableIndex: number): number {\n    const indexCounts: Int32Array = this._model.drawables.indexCounts;\n    return indexCounts[drawableIndex];\n  }\n\n  /**\n   * Drawableの頂点の個数の取得\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableの頂点の個数\n   */\n  public getDrawableVertexCount(drawableIndex: number): number {\n    const vertexCounts = this._model.drawables.vertexCounts;\n    return vertexCounts[drawableIndex];\n  }\n\n  /**\n   * Drawableの頂点リストの取得\n   * @param drawableIndex drawableのインデックス\n   * @return drawableの頂点リスト\n   */\n  public getDrawableVertices(drawableIndex: number): Float32Array {\n    return this.getDrawableVertexPositions(drawableIndex);\n  }\n\n  /**\n   * Drawableの頂点インデックスリストの取得\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableの頂点インデックスリスト\n   */\n  public getDrawableVertexIndices(drawableIndex: number): Uint16Array {\n    const indicesArray: Uint16Array[] = this._model.drawables.indices;\n    return indicesArray[drawableIndex];\n  }\n\n  /**\n   * Drawableの頂点リストの取得\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableの頂点リスト\n   */\n  public getDrawableVertexPositions(drawableIndex: number): Float32Array {\n    const verticesArray: Float32Array[] = this._model.drawables.vertexPositions;\n    return verticesArray[drawableIndex];\n  }\n\n  /**\n   * Drawableの頂点のUVリストの取得\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableの頂点UVリスト\n   */\n  public getDrawableVertexUvs(drawableIndex: number): Float32Array {\n    const uvsArray: Float32Array[] = this._model.drawables.vertexUvs;\n    return uvsArray[drawableIndex];\n  }\n\n  /**\n   * Drawableの不透明度の取得\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableの不透明度\n   */\n  public getDrawableOpacity(drawableIndex: number): number {\n    const opacities: Float32Array = this._model.drawables.opacities;\n    return opacities[drawableIndex];\n  }\n\n  /**\n   * Drawableの乗算色の取得\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableの乗算色(RGBA)\n   * スクリーン色はRGBAで取得されるが、Aは必ず0\n   */\n  public getDrawableMultiplyColor(drawableIndex: number): CubismTextureColor {\n    const multiplyColors: Float32Array = this._model.drawables.multiplyColors;\n    const index = drawableIndex * 4;\n    const multiplyColor: CubismTextureColor = new CubismTextureColor();\n    multiplyColor.r = multiplyColors[index];\n    multiplyColor.g = multiplyColors[index + 1];\n    multiplyColor.b = multiplyColors[index + 2];\n    multiplyColor.a = multiplyColors[index + 3];\n    return multiplyColor;\n  }\n\n  /**\n   * Drawableのスクリーン色の取得\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableのスクリーン色(RGBA)\n   * スクリーン色はRGBAで取得されるが、Aは必ず0\n   */\n  public getDrawableScreenColor(drawableIndex: number): CubismTextureColor {\n    const screenColors: Float32Array = this._model.drawables.screenColors;\n    const index = drawableIndex * 4;\n    const screenColor: CubismTextureColor = new CubismTextureColor();\n    screenColor.r = screenColors[index];\n    screenColor.g = screenColors[index + 1];\n    screenColor.b = screenColors[index + 2];\n    screenColor.a = screenColors[index + 3];\n    return screenColor;\n  }\n\n  /**\n   * Drawableの親パーツのインデックスの取得\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableの親パーツのインデックス\n   */\n  public getDrawableParentPartIndex(drawableIndex: number): number {\n    return this._model.drawables.parentPartIndices[drawableIndex];\n  }\n\n  /**\n   * Drawableのブレンドモードを取得\n   * @param drawableIndex Drawableのインデックス\n   * @return drawableのブレンドモード\n   */\n  public getDrawableBlendMode(drawableIndex: number): CubismBlendMode {\n    const constantFlags = this._model.drawables.constantFlags;\n\n    return Live2DCubismCore.Utils.hasBlendAdditiveBit(\n      constantFlags[drawableIndex]\n    )\n      ? CubismBlendMode.CubismBlendMode_Additive\n      : Live2DCubismCore.Utils.hasBlendMultiplicativeBit(\n            constantFlags[drawableIndex]\n          )\n        ? CubismBlendMode.CubismBlendMode_Multiplicative\n        : CubismBlendMode.CubismBlendMode_Normal;\n  }\n\n  /**\n   * Drawableのマスクの反転使用の取得\n   *\n   * Drawableのマスク使用時の反転設定を取得する。\n   * マスクを使用しない場合は無視される。\n   *\n   * @param drawableIndex Drawableのインデックス\n   * @return Drawableの反転設定\n   */\n  public getDrawableInvertedMaskBit(drawableIndex: number): boolean {\n    const constantFlags: Uint8Array = this._model.drawables.constantFlags;\n\n    return Live2DCubismCore.Utils.hasIsInvertedMaskBit(\n      constantFlags[drawableIndex]\n    );\n  }\n\n  /**\n   * Drawableのクリッピングマスクリストの取得\n   * @return Drawableのクリッピングマスクリスト\n   */\n  public getDrawableMasks(): Int32Array[] {\n    const masks: Int32Array[] = this._model.drawables.masks;\n    return masks;\n  }\n\n  /**\n   * Drawableのクリッピングマスクの個数リストの取得\n   * @return Drawableのクリッピングマスクの個数リスト\n   */\n  public getDrawableMaskCounts(): Int32Array {\n    const maskCounts: Int32Array = this._model.drawables.maskCounts;\n    return maskCounts;\n  }\n\n  /**\n   * クリッピングマスクの使用状態\n   *\n   * @return true クリッピングマスクを使用している\n   * @return false クリッピングマスクを使用していない\n   */\n  public isUsingMasking(): boolean {\n    for (let d = 0; d < this._model.drawables.count; ++d) {\n      if (this._model.drawables.maskCounts[d] <= 0) {\n        continue;\n      }\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Drawableの表示情報を取得する\n   *\n   * @param drawableIndex Drawableのインデックス\n   * @return true Drawableが表示\n   * @return false Drawableが非表示\n   */\n  public getDrawableDynamicFlagIsVisible(drawableIndex: number): boolean {\n    const dynamicFlags: Uint8Array = this._model.drawables.dynamicFlags;\n    return Live2DCubismCore.Utils.hasIsVisibleBit(dynamicFlags[drawableIndex]);\n  }\n\n  /**\n   * DrawableのDrawOrderの変化情報の取得\n   *\n   * 直近のCubismModel.update関数でdrawableのdrawOrderが変化したかを取得する。\n   * drawOrderはartMesh上で指定する0から1000の情報\n   * @param drawableIndex drawableのインデックス\n   * @return true drawableの不透明度が直近のCubismModel.update関数で変化した\n   * @return false drawableの不透明度が直近のCubismModel.update関数で変化している\n   */\n  public getDrawableDynamicFlagVisibilityDidChange(\n    drawableIndex: number\n  ): boolean {\n    const dynamicFlags: Uint8Array = this._model.drawables.dynamicFlags;\n    return Live2DCubismCore.Utils.hasVisibilityDidChangeBit(\n      dynamicFlags[drawableIndex]\n    );\n  }\n\n  /**\n   * Drawableの不透明度の変化情報の取得\n   *\n   * 直近のCubismModel.update関数でdrawableの不透明度が変化したかを取得する。\n   *\n   * @param drawableIndex drawableのインデックス\n   * @return true Drawableの不透明度が直近のCubismModel.update関数で変化した\n   * @return false Drawableの不透明度が直近のCubismModel.update関数で変化してない\n   */\n  public getDrawableDynamicFlagOpacityDidChange(\n    drawableIndex: number\n  ): boolean {\n    const dynamicFlags: Uint8Array = this._model.drawables.dynamicFlags;\n    return Live2DCubismCore.Utils.hasOpacityDidChangeBit(\n      dynamicFlags[drawableIndex]\n    );\n  }\n\n  /**\n   * Drawableの描画順序の変化情報の取得\n   *\n   * 直近のCubismModel.update関数でDrawableの描画の順序が変化したかを取得する。\n   *\n   * @param drawableIndex Drawableのインデックス\n   * @return true Drawableの描画の順序が直近のCubismModel.update関数で変化した\n   * @return false Drawableの描画の順序が直近のCubismModel.update関数で変化してない\n   */\n  public getDrawableDynamicFlagRenderOrderDidChange(\n    drawableIndex: number\n  ): boolean {\n    const dynamicFlags: Uint8Array = this._model.drawables.dynamicFlags;\n    return Live2DCubismCore.Utils.hasRenderOrderDidChangeBit(\n      dynamicFlags[drawableIndex]\n    );\n  }\n\n  /**\n   * Drawableの乗算色・スクリーン色の変化情報の取得\n   *\n   * 直近のCubismModel.update関数でDrawableの乗算色・スクリーン色が変化したかを取得する。\n   *\n   * @param drawableIndex Drawableのインデックス\n   * @return true Drawableの乗算色・スクリーン色が直近のCubismModel.update関数で変化した\n   * @return false Drawableの乗算色・スクリーン色が直近のCubismModel.update関数で変化してない\n   */\n  public getDrawableDynamicFlagBlendColorDidChange(\n    drawableIndex: number\n  ): boolean {\n    const dynamicFlags: Uint8Array = this._model.drawables.dynamicFlags;\n    return Live2DCubismCore.Utils.hasBlendColorDidChangeBit(\n      dynamicFlags[drawableIndex]\n    );\n  }\n\n  /**\n   * 保存されたパラメータの読み込み\n   */\n  public loadParameters(): void {\n    let parameterCount: number = this._model.parameters.count;\n    const savedParameterCount: number = this._savedParameters.getSize();\n\n    if (parameterCount > savedParameterCount) {\n      parameterCount = savedParameterCount;\n    }\n\n    for (let i = 0; i < parameterCount; ++i) {\n      this._parameterValues[i] = this._savedParameters.at(i);\n    }\n  }\n\n  /**\n   * 初期化する\n   */\n  public initialize(): void {\n    CSM_ASSERT(this._model);\n\n    this._parameterValues = this._model.parameters.values;\n    this._partOpacities = this._model.parts.opacities;\n    this._parameterMaximumValues = this._model.parameters.maximumValues;\n    this._parameterMinimumValues = this._model.parameters.minimumValues;\n\n    {\n      const parameterIds: string[] = this._model.parameters.ids;\n      const parameterCount: number = this._model.parameters.count;\n\n      this._parameterIds.prepareCapacity(parameterCount);\n      for (let i = 0; i < parameterCount; ++i) {\n        this._parameterIds.pushBack(\n          CubismFramework.getIdManager().getId(parameterIds[i])\n        );\n      }\n    }\n\n    const partCount: number = this._model.parts.count;\n    {\n      const partIds: string[] = this._model.parts.ids;\n\n      this._partIds.prepareCapacity(partCount);\n      for (let i = 0; i < partCount; ++i) {\n        this._partIds.pushBack(\n          CubismFramework.getIdManager().getId(partIds[i])\n        );\n      }\n\n      this._userPartMultiplyColors.prepareCapacity(partCount);\n      this._userPartScreenColors.prepareCapacity(partCount);\n\n      this._partChildDrawables.prepareCapacity(partCount);\n    }\n\n    {\n      const drawableIds: string[] = this._model.drawables.ids;\n      const drawableCount: number = this._model.drawables.count;\n\n      this._userMultiplyColors.prepareCapacity(drawableCount);\n      this._userScreenColors.prepareCapacity(drawableCount);\n\n      // カリング設定\n      this._userCullings.prepareCapacity(drawableCount);\n      const userCulling: DrawableCullingData = new DrawableCullingData(\n        false,\n        false\n      );\n\n      // Part\n      {\n        for (let i = 0; i < partCount; ++i) {\n          const multiplyColor: CubismTextureColor = new CubismTextureColor(\n            1.0,\n            1.0,\n            1.0,\n            1.0\n          );\n          const screenColor: CubismTextureColor = new CubismTextureColor(\n            0.0,\n            0.0,\n            0.0,\n            1.0\n          );\n\n          const userMultiplyColor: PartColorData = new PartColorData(\n            false,\n            multiplyColor\n          );\n          const userScreenColor: PartColorData = new PartColorData(\n            false,\n            screenColor\n          );\n\n          this._userPartMultiplyColors.pushBack(userMultiplyColor);\n          this._userPartScreenColors.pushBack(userScreenColor);\n          this._partChildDrawables.pushBack(new csmVector<number>());\n          this._partChildDrawables.at(i).prepareCapacity(drawableCount);\n        }\n      }\n\n      // Drawables\n      {\n        for (let i = 0; i < drawableCount; ++i) {\n          const multiplyColor: CubismTextureColor = new CubismTextureColor(\n            1.0,\n            1.0,\n            1.0,\n            1.0\n          );\n          const screenColor: CubismTextureColor = new CubismTextureColor(\n            0.0,\n            0.0,\n            0.0,\n            1.0\n          );\n\n          const userMultiplyColor: DrawableColorData = new DrawableColorData(\n            false,\n            multiplyColor\n          );\n          const userScreenColor: DrawableColorData = new DrawableColorData(\n            false,\n            screenColor\n          );\n\n          this._drawableIds.pushBack(\n            CubismFramework.getIdManager().getId(drawableIds[i])\n          );\n\n          this._userMultiplyColors.pushBack(userMultiplyColor);\n          this._userScreenColors.pushBack(userScreenColor);\n\n          this._userCullings.pushBack(userCulling);\n\n          const parentIndex = this.getDrawableParentPartIndex(i);\n          if (parentIndex >= 0) {\n            this._partChildDrawables.at(parentIndex).pushBack(i);\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * コンストラクタ\n   * @param model モデル\n   */\n  public constructor(model: Live2DCubismCore.Model) {\n    this._model = model;\n    this._parameterValues = null;\n    this._parameterMaximumValues = null;\n    this._parameterMinimumValues = null;\n    this._partOpacities = null;\n    this._savedParameters = new csmVector<number>();\n    this._parameterIds = new csmVector<CubismIdHandle>();\n    this._drawableIds = new csmVector<CubismIdHandle>();\n    this._partIds = new csmVector<CubismIdHandle>();\n    this._isOverwrittenModelMultiplyColors = false;\n    this._isOverwrittenModelScreenColors = false;\n    this._isOverwrittenCullings = false;\n    this._modelOpacity = 1.0;\n\n    this._userMultiplyColors = new csmVector<DrawableColorData>();\n    this._userScreenColors = new csmVector<DrawableColorData>();\n    this._userCullings = new csmVector<DrawableCullingData>();\n    this._userPartMultiplyColors = new csmVector<PartColorData>();\n    this._userPartScreenColors = new csmVector<PartColorData>();\n    this._partChildDrawables = new csmVector<csmVector<number>>();\n\n    this._notExistPartId = new csmMap<CubismIdHandle, number>();\n    this._notExistParameterId = new csmMap<CubismIdHandle, number>();\n    this._notExistParameterValues = new csmMap<number, number>();\n    this._notExistPartOpacities = new csmMap<number, number>();\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    this._model.release();\n    this._model = null;\n  }\n\n  private _notExistPartOpacities: csmMap<number, number>; // 存在していないパーツの不透明度のリスト\n  private _notExistPartId: csmMap<CubismIdHandle, number>; // 存在していないパーツIDのリスト\n\n  private _notExistParameterValues: csmMap<number, number>; // 存在していないパラメータの値のリスト\n  private _notExistParameterId: csmMap<CubismIdHandle, number>; // 存在していないパラメータIDのリスト\n\n  private _savedParameters: csmVector<number>; // 保存されたパラメータ\n\n  private _isOverwrittenModelMultiplyColors: boolean; // SDK上でモデル全体の乗算色を上書きするか判定するフラグ\n  private _isOverwrittenModelScreenColors: boolean; // SDK上でモデル全体のスクリーン色を上書きするか判定するフラグ\n  private _userMultiplyColors: csmVector<DrawableColorData>; // Drawableごとに設定する乗算色と上書きフラグを管理するリスト\n  private _userScreenColors: csmVector<DrawableColorData>; // Drawableごとに設定するスクリーン色と上書きフラグを管理するリスト\n  private _userPartScreenColors: csmVector<PartColorData>; // Part 乗算色の配列\n  private _userPartMultiplyColors: csmVector<PartColorData>; // Part スクリーン色の配列\n  private _partChildDrawables: csmVector<csmVector<number>>; // Partの子DrawableIndexの配列\n\n  private _model: Live2DCubismCore.Model; // モデル\n\n  private _parameterValues: Float32Array; // パラメータの値のリスト\n  private _parameterMaximumValues: Float32Array; // パラメータの最大値のリスト\n  private _parameterMinimumValues: Float32Array; // パラメータの最小値のリスト\n\n  private _partOpacities: Float32Array; // パーツの不透明度のリスト\n\n  private _modelOpacity: number; // モデルの不透明度\n\n  private _parameterIds: csmVector<CubismIdHandle>;\n  private _partIds: csmVector<CubismIdHandle>;\n  private _drawableIds: csmVector<CubismIdHandle>;\n\n  private _isOverwrittenCullings: boolean; // モデルのカリング設定をすべて上書きするか？\n  private _userCullings: csmVector<DrawableCullingData>; // カリング設定の配列\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmodel';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismModel = $.CubismModel;\n  export type CubismModel = $.CubismModel;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CSM_ASSERT, CubismLogError } from '../utils/cubismdebug';\nimport { CubismModel } from './cubismmodel';\n\n/**\n * Mocデータの管理\n *\n * Mocデータの管理を行うクラス。\n */\nexport class CubismMoc {\n  /**\n   * Mocデータの作成\n   */\n  public static create(\n    mocBytes: ArrayBuffer,\n    shouldCheckMocConsistency: boolean\n  ): CubismMoc {\n    let cubismMoc: CubismMoc = null;\n\n    if (shouldCheckMocConsistency) {\n      // .moc3の整合性を確認\n      const consistency = this.hasMocConsistency(mocBytes);\n\n      if (!consistency) {\n        // 整合性が確認できなければ処理しない\n        CubismLogError(`Inconsistent MOC3.`);\n        return cubismMoc;\n      }\n    }\n\n    const moc: Live2DCubismCore.Moc =\n      Live2DCubismCore.Moc.fromArrayBuffer(mocBytes);\n\n    if (moc) {\n      cubismMoc = new CubismMoc(moc);\n      cubismMoc._mocVersion = Live2DCubismCore.Version.csmGetMocVersion(\n        moc,\n        mocBytes\n      );\n    }\n\n    return cubismMoc;\n  }\n\n  /**\n   * Mocデータを削除\n   *\n   * Mocデータを削除する\n   */\n  public static delete(moc: CubismMoc): void {\n    moc._moc._release();\n    moc._moc = null;\n    moc = null;\n  }\n\n  /**\n   * モデルを作成する\n   *\n   * @return Mocデータから作成されたモデル\n   */\n  createModel(): CubismModel {\n    let cubismModel: CubismModel = null;\n\n    const model: Live2DCubismCore.Model = Live2DCubismCore.Model.fromMoc(\n      this._moc\n    );\n\n    if (model) {\n      cubismModel = new CubismModel(model);\n      cubismModel.initialize();\n\n      ++this._modelCount;\n    }\n\n    return cubismModel;\n  }\n\n  /**\n   * モデルを削除する\n   */\n  deleteModel(model: CubismModel): void {\n    if (model != null) {\n      model.release();\n      model = null;\n      --this._modelCount;\n    }\n  }\n\n  /**\n   * コンストラクタ\n   */\n  private constructor(moc: Live2DCubismCore.Moc) {\n    this._moc = moc;\n    this._modelCount = 0;\n    this._mocVersion = 0;\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    CSM_ASSERT(this._modelCount == 0);\n\n    this._moc._release();\n    this._moc = null;\n  }\n\n  /**\n   * 最新の.moc3 Versionを取得\n   */\n  public getLatestMocVersion(): number {\n    return Live2DCubismCore.Version.csmGetLatestMocVersion();\n  }\n\n  /**\n   * 読み込んだモデルの.moc3 Versionを取得\n   */\n  public getMocVersion(): number {\n    return this._mocVersion;\n  }\n\n  /**\n   * .moc3 の整合性を検証する\n   */\n  public static hasMocConsistency(mocBytes: ArrayBuffer): boolean {\n    const isConsistent =\n      Live2DCubismCore.Moc.prototype.hasMocConsistency(mocBytes);\n    return isConsistent === 1 ? true : false;\n  }\n\n  _moc: Live2DCubismCore.Moc; // Mocデータ\n  _modelCount: number; // Mocデータから作られたモデルの個数\n  _mocVersion: number; // 読み込んだモデルの.moc3 Version\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmoc';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismMoc = $.CubismMoc;\n  export type CubismMoc = $.CubismMoc;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdHandle } from '../id/cubismid';\nimport { CubismFramework } from '../live2dcubismframework';\nimport { CubismJson } from '../utils/cubismjson';\n\nconst Meta = 'Meta';\nconst UserDataCount = 'UserDataCount';\nconst TotalUserDataSize = 'TotalUserDataSize';\nconst UserData = 'UserData';\nconst Target = 'Target';\nconst Id = 'Id';\nconst Value = 'Value';\n\nexport class CubismModelUserDataJson {\n  /**\n   * コンストラクタ\n   * @param buffer    userdata3.jsonが読み込まれているバッファ\n   * @param size      バッファのサイズ\n   */\n  public constructor(buffer: ArrayBuffer, size: number) {\n    this._json = CubismJson.create(buffer, size);\n  }\n\n  /**\n   * デストラクタ相当の処理\n   */\n  public release(): void {\n    CubismJson.delete(this._json);\n  }\n\n  /**\n   * ユーザーデータ個数の取得\n   * @return ユーザーデータの個数\n   */\n  public getUserDataCount(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(UserDataCount)\n      .toInt();\n  }\n\n  /**\n   * ユーザーデータ総文字列数の取得\n   *\n   * @return ユーザーデータ総文字列数\n   */\n  public getTotalUserDataSize(): number {\n    return this._json\n      .getRoot()\n      .getValueByString(Meta)\n      .getValueByString(TotalUserDataSize)\n      .toInt();\n  }\n\n  /**\n   * ユーザーデータのタイプの取得\n   *\n   * @return ユーザーデータのタイプ\n   */\n  public getUserDataTargetType(i: number): string {\n    return this._json\n      .getRoot()\n      .getValueByString(UserData)\n      .getValueByIndex(i)\n      .getValueByString(Target)\n      .getRawString();\n  }\n\n  /**\n   * ユーザーデータのターゲットIDの取得\n   *\n   * @param i インデックス\n   * @return ユーザーデータターゲットID\n   */\n  public getUserDataId(i: number): CubismIdHandle {\n    return CubismFramework.getIdManager().getId(\n      this._json\n        .getRoot()\n        .getValueByString(UserData)\n        .getValueByIndex(i)\n        .getValueByString(Id)\n        .getRawString()\n    );\n  }\n\n  /**\n   * ユーザーデータの文字列の取得\n   *\n   * @param i インデックス\n   * @return ユーザーデータ\n   */\n  public getUserDataValue(i: number): string {\n    return this._json\n      .getRoot()\n      .getValueByString(UserData)\n      .getValueByIndex(i)\n      .getValueByString(Value)\n      .getRawString();\n  }\n\n  private _json: CubismJson;\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmodeluserdatajson';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismModelUserDataJson = $.CubismModelUserDataJson;\n  export type CubismModelUserDataJson = $.CubismModelUserDataJson;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismIdHandle } from '../id/cubismid';\nimport { CubismFramework } from '../live2dcubismframework';\nimport { csmString } from '../type/csmstring';\nimport { csmVector } from '../type/csmvector';\nimport { CubismModelUserDataJson } from './cubismmodeluserdatajson';\n\nconst ArtMesh = 'ArtMesh';\n\n/**\n * ユーザーデータインターフェース\n *\n * Jsonから読み込んだユーザーデータを記録しておくための構造体\n */\nexport class CubismModelUserDataNode {\n  targetType: CubismIdHandle; // ユーザーデータターゲットタイプ\n  targetId: CubismIdHandle; // ユーザーデータターゲットのID\n  value: csmString; // ユーザーデータ\n}\n\n/**\n * ユーザデータの管理クラス\n *\n * ユーザデータをロード、管理、検索インターフェイス、解放までを行う。\n */\nexport class CubismModelUserData {\n  /**\n   * インスタンスの作成\n   *\n   * @param buffer    userdata3.jsonが読み込まれているバッファ\n   * @param size      バッファのサイズ\n   * @return 作成されたインスタンス\n   */\n  public static create(buffer: ArrayBuffer, size: number): CubismModelUserData {\n    const ret: CubismModelUserData = new CubismModelUserData();\n\n    ret.parseUserData(buffer, size);\n\n    return ret;\n  }\n\n  /**\n   * インスタンスを破棄する\n   *\n   * @param modelUserData 破棄するインスタンス\n   */\n  public static delete(modelUserData: CubismModelUserData): void {\n    if (modelUserData != null) {\n      modelUserData.release();\n      modelUserData = null;\n    }\n  }\n\n  /**\n   * ArtMeshのユーザーデータのリストの取得\n   *\n   * @return ユーザーデータリスト\n   */\n  public getArtMeshUserDatas(): csmVector<CubismModelUserDataNode> {\n    return this._artMeshUserDataNode;\n  }\n\n  /**\n   * userdata3.jsonのパース\n   *\n   * @param buffer    userdata3.jsonが読み込まれているバッファ\n   * @param size      バッファのサイズ\n   */\n  public parseUserData(buffer: ArrayBuffer, size: number): void {\n    let json: CubismModelUserDataJson = new CubismModelUserDataJson(\n      buffer,\n      size\n    );\n    if (!json) {\n      json.release();\n      json = void 0;\n      return;\n    }\n\n    const typeOfArtMesh = CubismFramework.getIdManager().getId(ArtMesh);\n    const nodeCount: number = json.getUserDataCount();\n\n    for (let i = 0; i < nodeCount; i++) {\n      const addNode: CubismModelUserDataNode = new CubismModelUserDataNode();\n\n      addNode.targetId = json.getUserDataId(i);\n      addNode.targetType = CubismFramework.getIdManager().getId(\n        json.getUserDataTargetType(i)\n      );\n      addNode.value = new csmString(json.getUserDataValue(i));\n      this._userDataNodes.pushBack(addNode);\n\n      if (addNode.targetType == typeOfArtMesh) {\n        this._artMeshUserDataNode.pushBack(addNode);\n      }\n    }\n\n    json.release();\n    json = void 0;\n  }\n\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    this._userDataNodes = new csmVector<CubismModelUserDataNode>();\n    this._artMeshUserDataNode = new csmVector<CubismModelUserDataNode>();\n  }\n\n  /**\n   * デストラクタ相当の処理\n   *\n   * ユーザーデータ構造体配列を解放する\n   */\n  public release(): void {\n    for (let i = 0; i < this._userDataNodes.getSize(); ++i) {\n      this._userDataNodes.set(i, null);\n    }\n\n    this._userDataNodes = null;\n  }\n\n  private _userDataNodes: csmVector<CubismModelUserDataNode>; // ユーザーデータ構造体配列\n  private _artMeshUserDataNode: csmVector<CubismModelUserDataNode>; // 閲覧リストの保持\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismmodeluserdata';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismModelUserData = $.CubismModelUserData;\n  export type CubismModelUserData = $.CubismModelUserData;\n  export const CubismModelUserDataNode = $.CubismModelUserDataNode;\n  export type CubismModelUserDataNode = $.CubismModelUserDataNode;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismBreath } from '../effect/cubismbreath';\nimport { CubismEyeBlink } from '../effect/cubismeyeblink';\nimport { CubismPose } from '../effect/cubismpose';\nimport { CubismIdHandle } from '../id/cubismid';\nimport { Constant } from '../live2dcubismframework';\nimport { CubismModelMatrix } from '../math/cubismmodelmatrix';\nimport { CubismTargetPoint } from '../math/cubismtargetpoint';\nimport { ACubismMotion, FinishedMotionCallback } from '../motion/acubismmotion';\nimport { CubismExpressionMotion } from '../motion/cubismexpressionmotion';\nimport { CubismExpressionMotionManager } from '../motion/cubismexpressionmotionmanager';\nimport { CubismMotion } from '../motion/cubismmotion';\nimport { CubismMotionManager } from '../motion/cubismmotionmanager';\nimport { CubismMotionQueueManager } from '../motion/cubismmotionqueuemanager';\nimport { CubismPhysics } from '../physics/cubismphysics';\nimport { CubismRenderer_WebGL } from '../rendering/cubismrenderer_webgl';\nimport { csmString } from '../type/csmstring';\nimport { CubismLogError, CubismLogInfo } from '../utils/cubismdebug';\nimport { CubismMoc } from './cubismmoc';\nimport { CubismModel } from './cubismmodel';\nimport { CubismModelUserData } from './cubismmodeluserdata';\n\n/**\n * ユーザーが実際に使用するモデル\n *\n * ユーザーが実際に使用するモデルの基底クラス。これを継承してユーザーが実装する。\n */\nexport class CubismUserModel {\n  /**\n   * 初期化状態の取得\n   *\n   * 初期化されている状態か？\n   *\n   * @return true     初期化されている\n   * @return false    初期化されていない\n   */\n  public isInitialized(): boolean {\n    return this._initialized;\n  }\n\n  /**\n   * 初期化状態の設定\n   *\n   * 初期化状態を設定する。\n   *\n   * @param v 初期化状態\n   */\n  public setInitialized(v: boolean): void {\n    this._initialized = v;\n  }\n\n  /**\n   * 更新状態の取得\n   *\n   * 更新されている状態か？\n   *\n   * @return true     更新されている\n   * @return false    更新されていない\n   */\n  public isUpdating(): boolean {\n    return this._updating;\n  }\n\n  /**\n   * 更新状態の設定\n   *\n   * 更新状態を設定する\n   *\n   * @param v 更新状態\n   */\n  public setUpdating(v: boolean): void {\n    this._updating = v;\n  }\n\n  /**\n   * マウスドラッグ情報の設定\n   * @param ドラッグしているカーソルのX位置\n   * @param ドラッグしているカーソルのY位置\n   */\n  public setDragging(x: number, y: number): void {\n    this._dragManager.set(x, y);\n  }\n\n  /**\n   * 加速度の情報を設定する\n   * @param x X軸方向の加速度\n   * @param y Y軸方向の加速度\n   * @param z Z軸方向の加速度\n   */\n  public setAcceleration(x: number, y: number, z: number): void {\n    this._accelerationX = x;\n    this._accelerationY = y;\n    this._accelerationZ = z;\n  }\n\n  /**\n   * モデル行列を取得する\n   * @return モデル行列\n   */\n  public getModelMatrix(): CubismModelMatrix {\n    return this._modelMatrix;\n  }\n\n  /**\n   * 不透明度の設定\n   * @param a 不透明度\n   */\n  public setOpacity(a: number): void {\n    this._opacity = a;\n  }\n\n  /**\n   * 不透明度の取得\n   * @return 不透明度\n   */\n  public getOpacity(): number {\n    return this._opacity;\n  }\n\n  /**\n   * モデルデータを読み込む\n   *\n   * @param buffer    moc3ファイルが読み込まれているバッファ\n   */\n  public loadModel(buffer: ArrayBuffer, shouldCheckMocConsistency = false) {\n    this._moc = CubismMoc.create(buffer, shouldCheckMocConsistency);\n\n    if (this._moc == null) {\n      CubismLogError('Failed to CubismMoc.create().');\n      return;\n    }\n\n    this._model = this._moc.createModel();\n\n    if (this._model == null) {\n      CubismLogError('Failed to CreateModel().');\n      return;\n    }\n\n    this._model.saveParameters();\n    this._modelMatrix = new CubismModelMatrix(\n      this._model.getCanvasWidth(),\n      this._model.getCanvasHeight()\n    );\n  }\n\n  /**\n   * モーションデータを読み込む\n   * @param buffer motion3.jsonファイルが読み込まれているバッファ\n   * @param size バッファのサイズ\n   * @param name モーションの名前\n   * @param onFinishedMotionHandler モーション再生終了時に呼び出されるコールバック関数\n   * @return モーションクラス\n   */\n  public loadMotion(\n    buffer: ArrayBuffer,\n    size: number,\n    name: string,\n    onFinishedMotionHandler?: FinishedMotionCallback\n  ): CubismMotion {\n    if (buffer == null || size == 0) {\n      CubismLogError('Failed to loadMotion().');\n      return null;\n    }\n    return CubismMotion.create(buffer, size, onFinishedMotionHandler);\n  }\n\n  /**\n   * 表情データの読み込み\n   * @param buffer expファイルが読み込まれているバッファ\n   * @param size バッファのサイズ\n   * @param name 表情の名前\n   */\n  public loadExpression(\n    buffer: ArrayBuffer,\n    size: number,\n    name: string\n  ): ACubismMotion {\n    if (buffer == null || size == 0) {\n      CubismLogError('Failed to loadExpression().');\n      return null;\n    }\n    return CubismExpressionMotion.create(buffer, size);\n  }\n\n  /**\n   * ポーズデータの読み込み\n   * @param buffer pose3.jsonが読み込まれているバッファ\n   * @param size バッファのサイズ\n   */\n  public loadPose(buffer: ArrayBuffer, size: number): void {\n    if (buffer == null || size == 0) {\n      CubismLogError('Failed to loadPose().');\n      return;\n    }\n    this._pose = CubismPose.create(buffer, size);\n  }\n\n  /**\n   * モデルに付属するユーザーデータを読み込む\n   * @param buffer userdata3.jsonが読み込まれているバッファ\n   * @param size バッファのサイズ\n   */\n  public loadUserData(buffer: ArrayBuffer, size: number): void {\n    if (buffer == null || size == 0) {\n      CubismLogError('Failed to loadUserData().');\n      return;\n    }\n    this._modelUserData = CubismModelUserData.create(buffer, size);\n  }\n\n  /**\n   * 物理演算データの読み込み\n   * @param buffer  physics3.jsonが読み込まれているバッファ\n   * @param size    バッファのサイズ\n   */\n  public loadPhysics(buffer: ArrayBuffer, size: number): void {\n    if (buffer == null || size == 0) {\n      CubismLogError('Failed to loadPhysics().');\n      return;\n    }\n    this._physics = CubismPhysics.create(buffer, size);\n  }\n\n  /**\n   * 当たり判定の取得\n   * @param drawableId 検証したいDrawableのID\n   * @param pointX X位置\n   * @param pointY Y位置\n   * @return true ヒットしている\n   * @return false ヒットしていない\n   */\n  public isHit(\n    drawableId: CubismIdHandle,\n    pointX: number,\n    pointY: number\n  ): boolean {\n    const drawIndex: number = this._model.getDrawableIndex(drawableId);\n\n    if (drawIndex < 0) {\n      return false; // 存在しない場合はfalse\n    }\n\n    const count: number = this._model.getDrawableVertexCount(drawIndex);\n    const vertices: Float32Array = this._model.getDrawableVertices(drawIndex);\n\n    let left: number = vertices[0];\n    let right: number = vertices[0];\n    let top: number = vertices[1];\n    let bottom: number = vertices[1];\n\n    for (let j = 1; j < count; ++j) {\n      const x = vertices[Constant.vertexOffset + j * Constant.vertexStep];\n      const y = vertices[Constant.vertexOffset + j * Constant.vertexStep + 1];\n\n      if (x < left) {\n        left = x; // Min x\n      }\n\n      if (x > right) {\n        right = x; // Max x\n      }\n\n      if (y < top) {\n        top = y; // Min y\n      }\n\n      if (y > bottom) {\n        bottom = y; // Max y\n      }\n    }\n\n    const tx: number = this._modelMatrix.invertTransformX(pointX);\n    const ty: number = this._modelMatrix.invertTransformY(pointY);\n\n    return left <= tx && tx <= right && top <= ty && ty <= bottom;\n  }\n\n  /**\n   * モデルの取得\n   * @return モデル\n   */\n  public getModel(): CubismModel {\n    return this._model;\n  }\n\n  /**\n   * レンダラの取得\n   * @return レンダラ\n   */\n  public getRenderer(): CubismRenderer_WebGL {\n    return this._renderer;\n  }\n\n  /**\n   * レンダラを作成して初期化を実行する\n   * @param maskBufferCount バッファの生成数\n   */\n  public createRenderer(maskBufferCount = 1): void {\n    if (this._renderer) {\n      this.deleteRenderer();\n    }\n\n    this._renderer = new CubismRenderer_WebGL();\n    this._renderer.initialize(this._model, maskBufferCount);\n  }\n\n  /**\n   * レンダラの解放\n   */\n  public deleteRenderer(): void {\n    if (this._renderer != null) {\n      this._renderer.release();\n      this._renderer = null;\n    }\n  }\n\n  /**\n   * イベント発火時の標準処理\n   *\n   * Eventが再生処理時にあった場合の処理をする。\n   * 継承で上書きすることを想定している。\n   * 上書きしない場合はログ出力をする。\n   *\n   * @param eventValue 発火したイベントの文字列データ\n   */\n  public motionEventFired(eventValue: csmString): void {\n    CubismLogInfo('{0}', eventValue.s);\n  }\n\n  /**\n   * イベント用のコールバック\n   *\n   * CubismMotionQueueManagerにイベント用に登録するためのCallback。\n   * CubismUserModelの継承先のEventFiredを呼ぶ。\n   *\n   * @param caller 発火したイベントを管理していたモーションマネージャー、比較用\n   * @param eventValue 発火したイベントの文字列データ\n   * @param customData CubismUserModelを継承したインスタンスを想定\n   */\n  public static cubismDefaultMotionEventCallback(\n    caller: CubismMotionQueueManager,\n    eventValue: csmString,\n    customData: CubismUserModel\n  ): void {\n    const model: CubismUserModel = customData;\n\n    if (model != null) {\n      model.motionEventFired(eventValue);\n    }\n  }\n\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    // 各変数初期化\n    this._moc = null;\n    this._key = null;\n    this._model = null;\n    this._motionManager = null;\n    this._expressionManager = null;\n    this._eyeBlink = null;\n    this._breath = null;\n    this._modelMatrix = null;\n    this._pose = null;\n    this._dragManager = null;\n    this._physics = null;\n    this._modelUserData = null;\n    this._initialized = false;\n    this._updating = false;\n    this._opacity = 1.0;\n    this._lipsync = true;\n    this._lastLipSyncValue = 0.0;\n    this._dragX = 0.0;\n    this._dragY = 0.0;\n    this._accelerationX = 0.0;\n    this._accelerationY = 0.0;\n    this._accelerationZ = 0.0;\n    this._mocConsistency = false;\n    this._debugMode = false;\n    this._renderer = null;\n\n    // モーションマネージャーを作成\n    this._motionManager = new CubismMotionManager();\n    this._motionManager.setEventCallback(\n      CubismUserModel.cubismDefaultMotionEventCallback,\n      this\n    );\n\n    // 表情マネージャーを作成\n    this._expressionManager = new CubismExpressionMotionManager();\n\n    // ドラッグによるアニメーション\n    this._dragManager = new CubismTargetPoint();\n  }\n\n  /**\n   * デストラクタに相当する処理\n   */\n  public release() {\n    if (this._motionManager != null) {\n      this._motionManager.release();\n      this._motionManager = null;\n    }\n\n    if (this._expressionManager != null) {\n      this._expressionManager.release();\n      this._expressionManager = null;\n    }\n\n    if (this._moc != null) {\n      this._moc.deleteModel(this._model);\n      this._moc.release();\n      this._moc = null;\n    }\n\n    this._modelMatrix = null;\n\n    CubismPose.delete(this._pose);\n    CubismEyeBlink.delete(this._eyeBlink);\n    CubismBreath.delete(this._breath);\n\n    this._dragManager = null;\n\n    CubismPhysics.delete(this._physics);\n    CubismModelUserData.delete(this._modelUserData);\n\n    this.deleteRenderer();\n  }\n\n  protected _moc: CubismMoc; // Mocデータ\n  protected _key: string // 模型名称\n  protected _voiceWeight: number // 音频权重\n  protected _model: CubismModel; // Modelインスタンス\n\n  protected _motionManager: CubismMotionManager; // モーション管理\n  protected _expressionManager: CubismExpressionMotionManager; // 表情管理\n  protected _eyeBlink: CubismEyeBlink; // 自動まばたき\n  protected _breath: CubismBreath; // 呼吸\n  protected _modelMatrix: CubismModelMatrix; // モデル行列\n  protected _pose: CubismPose; // ポーズ管理\n  protected _dragManager: CubismTargetPoint; // マウスドラッグ\n  protected _physics: CubismPhysics; // 物理演算\n  protected _modelUserData: CubismModelUserData; // ユーザーデータ\n\n  protected _initialized: boolean; // 初期化されたかどうか\n  protected _updating: boolean; // 更新されたかどうか\n  protected _opacity: number; // 不透明度\n  protected _lipsync: boolean; // リップシンクするかどうか\n  protected _lastLipSyncValue: number; // 最後のリップシンクの制御地\n  protected _dragX: number; // マウスドラッグのX位置\n  protected _dragY: number; // マウスドラッグのY位置\n  protected _accelerationX: number; // X軸方向の加速度\n  protected _accelerationY: number; // Y軸方向の加速度\n  protected _accelerationZ: number; // Z軸方向の加速度\n  protected _mocConsistency: boolean; // MOC3一貫性検証するかどうか\n  protected _debugMode: boolean; // デバッグモードかどうか\n\n  private _renderer: CubismRenderer_WebGL; // レンダラ\n\n  public get key(): string {\n    return this._key\n  }\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismusermodel';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismUserModel = $.CubismUserModel;\n  export type CubismUserModel = $.CubismUserModel;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\n/**\n * プラットフォーム依存機能を抽象化する Cubism Platform Abstraction Layer.\n *\n * ファイル読み込みや時刻取得等のプラットフォームに依存する関数をまとめる。\n */\nexport class LAppPal {\n  /**\n   * ファイルをバイトデータとして読みこむ\n   *\n   * @param filePath 読み込み対象ファイルのパス\n   * @return\n   * {\n   *      buffer,   読み込んだバイトデータ\n   *      size        ファイルサイズ\n   * }\n   */\n  public static loadFileAsBytes(\n    filePath: string,\n    callback: (arrayBuffer: ArrayBuffer, size: number) => void\n  ): void {\n    fetch(filePath)\n      .then(response => response.arrayBuffer())\n      .then(arrayBuffer => callback(arrayBuffer, arrayBuffer.byteLength));\n  }\n\n  /**\n   * デルタ時間（前回フレームとの差分）を取得する\n   * @return デルタ時間[ms]\n   */\n  public static getDeltaTime(): number {\n    return this.s_deltaTime;\n  }\n\n  public static updateTime(): void {\n    this.s_currentFrame = Date.now();\n    this.s_deltaTime = (this.s_currentFrame - this.s_lastFrame) / 1000;\n    this.s_lastFrame = this.s_currentFrame;\n  }\n\n  /**\n   * メッセージを出力する\n   * @param message 文字列\n   */\n  public static printMessage(message: string): void {\n    console.log(message);\n  }\n\n  static lastUpdate = Date.now();\n\n  static s_currentFrame = 0.0;\n  static s_lastFrame = 0.0;\n  static s_deltaTime = 0.0;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\n/** @deprecated この変数は getInstance() が非推奨になったことに伴い、非推奨となりました。 */\nexport let s_instance: LAppWavFileHandler = null;\n\nexport class LAppWavFileHandler {\n  /**\n   * クラスのインスタンス（シングルトン）を返す。\n   * インスタンスが生成されていない場合は内部でインスタンスを生成する。\n   *\n   * @return クラスのインスタンス\n   * @deprecated このクラスでのシングルトンパターンの使用は非推奨となりました。代わりに new LAppWavFileHandler() を使用してください。\n   */\n  public static getInstance(): LAppWavFileHandler {\n    if (s_instance == null) {\n      s_instance = new LAppWavFileHandler();\n    }\n\n    return s_instance;\n  }\n\n  /**\n   * クラスのインスタンス（シングルトン）を解放する。\n   *\n   * @deprecated この関数は getInstance() が非推奨になったことに伴い、非推奨となりました。\n   */\n  public static releaseInstance(): void {\n    if (s_instance != null) {\n      s_instance = void 0;\n    }\n\n    s_instance = null;\n  }\n\n  public update(deltaTimeSeconds: number) {\n    let goalOffset: number;\n    let rms: number;\n\n    // データロード前/ファイル末尾に達した場合は更新しない\n    if (\n      this._pcmData == null ||\n      this._sampleOffset >= this._wavFileInfo._samplesPerChannel\n    ) {\n      this._lastRms = 0.0;\n      return false;\n    }\n\n    // 経過時間後の状態を保持\n    this._userTimeSeconds += deltaTimeSeconds;\n    goalOffset = Math.floor(\n      this._userTimeSeconds * this._wavFileInfo._samplingRate\n    );\n    if (goalOffset > this._wavFileInfo._samplesPerChannel) {\n      goalOffset = this._wavFileInfo._samplesPerChannel;\n    }\n\n    // RMS計測\n    rms = 0.0;\n    for (\n      let channelCount = 0;\n      channelCount < this._wavFileInfo._numberOfChannels;\n      channelCount++\n    ) {\n      for (\n        let sampleCount = this._sampleOffset;\n        sampleCount < goalOffset;\n        sampleCount++\n      ) {\n        const pcm = this._pcmData[channelCount][sampleCount];\n        rms += pcm * pcm;\n      }\n    }\n    rms = Math.sqrt(\n      rms /\n        (this._wavFileInfo._numberOfChannels *\n          (goalOffset - this._sampleOffset))\n    );\n\n    this._lastRms = rms;\n    this._sampleOffset = goalOffset;\n    return true;\n  }\n\n  public start(filePath: string): void {\n    this.initVoice()\n    this.loadWavFile(filePath, false);\n  }\n\n  public initVoice(): void {\n    // サンプル位参照位置を初期化\n    this._sampleOffset = 0;\n    this._userTimeSeconds = 0.0;\n\n    // RMS値をリセット\n    this._lastRms = 0.0;\n  }\n\n  public getRms(): number {\n    return this._lastRms;\n  }\n\n  // ファイルロード\n  public async asyncFileLoad(filePath: string): Promise<ArrayBuffer> {\n    return fetch(filePath)\n        .then(res => res.arrayBuffer());\n  };\n\n  public loadWavFile(filePath: string, initVoice: boolean = true): Promise<boolean> {\n    if (initVoice) {\n      this.initVoice()\n    }\n\n    return new Promise(resolveValue => {\n      let ret = false;\n\n      if (this._pcmData != null) {\n        this.releasePcmData();\n      }\n\n      // ファイルロード\n      const asyncFileLoad = async () => {\n        return fetch(filePath).then(responce => {\n          return responce.arrayBuffer();\n        });\n      };\n\n      const asyncWavFileManager = (async () => {\n        const fileBytes = await asyncFileLoad();\n        ret = await this.loadWavBytes(fileBytes, false, filePath);\n        resolveValue(ret)\n      })().then(() => {\n        resolveValue(ret);\n      });\n    });\n  }\n\n  public loadWavBytes(dataBytes: ArrayBuffer, initVoice: boolean = true, filePath: string = \"0.wav\"): Promise<boolean> {\n    if (initVoice) {\n      this.initVoice()\n    }\n\n    return new Promise(resolveValue => {\n      let ret = false;\n\n      if (this._pcmData != null) {\n        this.releasePcmData();\n      }\n\n      // // ファイルロード\n      // const asyncFileLoad = async () => {\n      //   return fetch(filePath).then(responce => {\n      //     return responce.arrayBuffer();\n      //   });\n      // };\n\n      const asyncWavFileManager = (async (): Promise<boolean> => {\n        this._byteReader._fileByte = dataBytes;\n        this._byteReader._fileDataView = new DataView(\n            this._byteReader._fileByte\n        );\n        this._byteReader._fileSize = this._byteReader._fileByte.byteLength;\n        this._byteReader._readOffset = 0;\n\n        // ファイルロードに失敗しているか、先頭のシグネチャ\"RIFF\"を入れるサイズもない場合は失敗\n        if (\n            this._byteReader._fileByte == null ||\n            this._byteReader._fileSize < 4\n        ) {\n          resolveValue(false);\n          return;\n        }\n\n        // ファイル名\n        this._wavFileInfo._fileName = filePath;\n\n        try {\n          // シグネチャ \"RIFF\"\n          if (!this._byteReader.getCheckSignature('RIFF')) {\n            ret = false;\n            throw new Error('Cannot find Signeture \"RIFF\".');\n          }\n          // ファイルサイズ-8（読み飛ばし）\n          this._byteReader.get32LittleEndian();\n          // シグネチャ \"WAVE\"\n          if (!this._byteReader.getCheckSignature('WAVE')) {\n            ret = false;\n            throw new Error('Cannot find Signeture \"WAVE\".');\n          }\n          // シグネチャ \"fmt \"\n          if (!this._byteReader.getCheckSignature('fmt ')) {\n            ret = false;\n            throw new Error('Cannot find Signeture \"fmt\".');\n          }\n          // fmtチャンクサイズ\n          const fmtChunkSize = this._byteReader.get32LittleEndian();\n          // フォーマットIDは1（リニアPCM）以外受け付けない\n          if (this._byteReader.get16LittleEndian() != 1) {\n            ret = false;\n            throw new Error('File is not linear PCM.');\n          }\n          // チャンネル数\n          this._wavFileInfo._numberOfChannels =\n              this._byteReader.get16LittleEndian();\n          // サンプリングレート\n          this._wavFileInfo._samplingRate =\n              this._byteReader.get32LittleEndian();\n          // データ速度[byte/sec]（読み飛ばし）\n          this._byteReader.get32LittleEndian();\n          // ブロックサイズ（読み飛ばし）\n          this._byteReader.get16LittleEndian();\n          // 量子化ビット数\n          this._wavFileInfo._bitsPerSample =\n              this._byteReader.get16LittleEndian();\n          // fmtチャンクの拡張部分の読み飛ばし\n          if (fmtChunkSize > 16) {\n            this._byteReader._readOffset += fmtChunkSize - 16;\n          }\n          // \"data\"チャンクが出現するまで読み飛ばし\n          while (\n              !this._byteReader.getCheckSignature('data') &&\n              this._byteReader._readOffset < this._byteReader._fileSize\n              ) {\n            this._byteReader._readOffset +=\n                this._byteReader.get32LittleEndian() + 4;\n          }\n          // ファイル内に\"data\"チャンクが出現しなかった\n          if (this._byteReader._readOffset >= this._byteReader._fileSize) {\n            ret = false;\n            throw new Error('Cannot find \"data\" Chunk.');\n          }\n          // サンプル数\n          {\n            const dataChunkSize = this._byteReader.get32LittleEndian();\n            this._wavFileInfo._samplesPerChannel =\n                (dataChunkSize * 8) /\n                (this._wavFileInfo._bitsPerSample *\n                    this._wavFileInfo._numberOfChannels);\n          }\n          // 領域確保\n          this._pcmData = new Array(this._wavFileInfo._numberOfChannels);\n          for (\n              let channelCount = 0;\n              channelCount < this._wavFileInfo._numberOfChannels;\n              channelCount++\n          ) {\n            this._pcmData[channelCount] = new Float32Array(\n                this._wavFileInfo._samplesPerChannel\n            );\n          }\n          // 波形データ取得\n          for (\n              let sampleCount = 0;\n              sampleCount < this._wavFileInfo._samplesPerChannel;\n              sampleCount++\n          ) {\n            for (\n                let channelCount = 0;\n                channelCount < this._wavFileInfo._numberOfChannels;\n                channelCount++\n            ) {\n              this._pcmData[channelCount][sampleCount] = this.getPcmSample();\n            }\n          }\n\n          ret = true;\n\n          resolveValue(ret);\n        } catch (e) {\n          console.log(e);\n        }\n      })().then(() => {\n        resolveValue(ret);\n      });\n    });\n  }\n\n  public getPcmSample(): number {\n    let pcm32;\n\n    // 32ビット幅に拡張してから-1～1の範囲に丸める\n    switch (this._wavFileInfo._bitsPerSample) {\n      case 8:\n        pcm32 = this._byteReader.get8() - 128;\n        pcm32 <<= 24;\n        break;\n      case 16:\n        pcm32 = this._byteReader.get16LittleEndian() << 16;\n        break;\n      case 24:\n        pcm32 = this._byteReader.get24LittleEndian() << 8;\n        break;\n      default:\n        // 対応していないビット幅\n        pcm32 = 0;\n        break;\n    }\n\n    return pcm32 / 2147483647; //Number.MAX_VALUE;\n  }\n\n  /**\n   * 指定したチャンネルから音声サンプルの配列を取得する\n   *\n   * @param usechannel 利用するチャンネル\n   * @returns 指定したチャンネルの音声サンプルの配列\n   */\n  public getPcmDataChannel(usechannel: number): Float32Array {\n    // 指定したチャンネル数がデータ用配列の長さより多いならnullを返す。\n    if (!this._pcmData || !(usechannel < this._pcmData.length)) {\n      return null;\n    }\n\n    // _pcmDataから新規に指定したチャンネルのFloat32Arrayを作成する。\n    return Float32Array.from(this._pcmData[usechannel]);\n  }\n\n  /**\n   * 音声のサンプリング周波数を取得する。\n   *\n   * @returns 音声のサンプリング周波数\n   */\n  public getWavSamplingRate(): number {\n    if (!this._wavFileInfo || this._wavFileInfo._samplingRate < 1) {\n      return null;\n    }\n\n    return this._wavFileInfo._samplingRate;\n  }\n\n  public releasePcmData(): void {\n    for (\n      let channelCount = 0;\n      channelCount < this._wavFileInfo._numberOfChannels;\n      channelCount++\n    ) {\n      delete this._pcmData[channelCount];\n    }\n    delete this._pcmData;\n    this._pcmData = null;\n  }\n\n  constructor() {\n    this._pcmData = null;\n    this._userTimeSeconds = 0.0;\n    this._lastRms = 0.0;\n    this._sampleOffset = 0.0;\n    this._wavFileInfo = new WavFileInfo();\n    this._byteReader = new ByteReader();\n  }\n\n  _pcmData: Array<Float32Array>;\n  _userTimeSeconds: number;\n  _lastRms: number;\n  _sampleOffset: number;\n  _wavFileInfo: WavFileInfo;\n  _byteReader: ByteReader;\n  _loadFiletoBytes = (arrayBuffer: ArrayBuffer, length: number): void => {\n    this._byteReader._fileByte = arrayBuffer;\n    this._byteReader._fileDataView = new DataView(this._byteReader._fileByte);\n    this._byteReader._fileSize = length;\n  };\n}\n\nexport class WavFileInfo {\n  constructor() {\n    this._fileName = '';\n    this._numberOfChannels = 0;\n    this._bitsPerSample = 0;\n    this._samplingRate = 0;\n    this._samplesPerChannel = 0;\n  }\n\n  _fileName: string; ///< ファイル名\n  _numberOfChannels: number; ///< チャンネル数\n  _bitsPerSample: number; ///< サンプルあたりビット数\n  _samplingRate: number; ///< サンプリングレート\n  _samplesPerChannel: number; ///< 1チャンネルあたり総サンプル数\n}\n\nexport class ByteReader {\n  constructor() {\n    this._fileByte = null;\n    this._fileDataView = null;\n    this._fileSize = 0;\n    this._readOffset = 0;\n  }\n\n  /**\n   * @brief 8ビット読み込み\n   * @return Csm::csmUint8 読み取った8ビット値\n   */\n  public get8(): number {\n    const ret = this._fileDataView.getUint8(this._readOffset);\n    this._readOffset++;\n    return ret;\n  }\n\n  /**\n   * @brief 16ビット読み込み（リトルエンディアン）\n   * @return Csm::csmUint16 読み取った16ビット値\n   */\n  public get16LittleEndian(): number {\n    const ret =\n      (this._fileDataView.getUint8(this._readOffset + 1) << 8) |\n      this._fileDataView.getUint8(this._readOffset);\n    this._readOffset += 2;\n    return ret;\n  }\n\n  /**\n   * @brief 24ビット読み込み（リトルエンディアン）\n   * @return Csm::csmUint32 読み取った24ビット値（下位24ビットに設定）\n   */\n  public get24LittleEndian(): number {\n    const ret =\n      (this._fileDataView.getUint8(this._readOffset + 2) << 16) |\n      (this._fileDataView.getUint8(this._readOffset + 1) << 8) |\n      this._fileDataView.getUint8(this._readOffset);\n    this._readOffset += 3;\n    return ret;\n  }\n\n  /**\n   * @brief 32ビット読み込み（リトルエンディアン）\n   * @return Csm::csmUint32 読み取った32ビット値\n   */\n  public get32LittleEndian(): number {\n    const ret =\n      (this._fileDataView.getUint8(this._readOffset + 3) << 24) |\n      (this._fileDataView.getUint8(this._readOffset + 2) << 16) |\n      (this._fileDataView.getUint8(this._readOffset + 1) << 8) |\n      this._fileDataView.getUint8(this._readOffset);\n    this._readOffset += 4;\n    return ret;\n  }\n\n  /**\n   * @brief シグネチャの取得と参照文字列との一致チェック\n   * @param[in] reference 検査対象のシグネチャ文字列\n   * @retval  true    一致している\n   * @retval  false   一致していない\n   */\n  public getCheckSignature(reference: string): boolean {\n    const getSignature: Uint8Array = new Uint8Array(4);\n    const referenceString: Uint8Array = new TextEncoder().encode(reference);\n    if (reference.length != 4) {\n      return false;\n    }\n    for (let signatureOffset = 0; signatureOffset < 4; signatureOffset++) {\n      getSignature[signatureOffset] = this.get8();\n    }\n    return (\n      getSignature[0] == referenceString[0] &&\n      getSignature[1] == referenceString[1] &&\n      getSignature[2] == referenceString[2] &&\n      getSignature[3] == referenceString[3]\n    );\n  }\n\n  _fileByte: ArrayBuffer; ///< ロードしたファイルのバイト列\n  _fileDataView: DataView;\n  _fileSize: number; ///< ファイルサイズ\n  _readOffset: number; ///< ファイル参照位置\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismDefaultParameterId } from '@framework/cubismdefaultparameterid';\nimport { CubismModelSettingJson } from '@framework/cubismmodelsettingjson';\nimport {\n  BreathParameterData,\n  CubismBreath\n} from '@framework/effect/cubismbreath';\nimport { CubismEyeBlink } from '@framework/effect/cubismeyeblink';\nimport { ICubismModelSetting } from '@framework/icubismmodelsetting';\nimport { CubismIdHandle } from '@framework/id/cubismid';\nimport { CubismFramework } from '@framework/live2dcubismframework';\nimport { CubismMatrix44 } from '@framework/math/cubismmatrix44';\nimport { CubismUserModel } from '@framework/model/cubismusermodel';\nimport {\n  ACubismMotion,\n  FinishedMotionCallback\n} from '@framework/motion/acubismmotion';\nimport { CubismMotion } from '@framework/motion/cubismmotion';\nimport {\n  CubismMotionQueueEntryHandle,\n  InvalidMotionQueueEntryHandleValue\n} from '@framework/motion/cubismmotionqueuemanager';\nimport { csmMap } from '@framework/type/csmmap';\nimport { csmRect } from '@framework/type/csmrectf';\nimport { csmString } from '@framework/type/csmstring';\nimport { csmVector } from '@framework/type/csmvector';\nimport {\n  CSM_ASSERT,\n  CubismLogError,\n  CubismLogInfo\n} from '@framework/utils/cubismdebug';\n\nimport LAppDefine from './lappdefine';\nimport { frameBuffer, LAppDelegate } from './lappdelegate';\nimport { canvas, gl } from './lappglmanager';\nimport { LAppPal } from './lapppal';\nimport { TextureInfo } from './lapptexturemanager';\nimport { LAppWavFileHandler } from './lappwavfilehandler';\nimport { CubismMoc } from '@framework/model/cubismmoc';\n\nenum LoadStep {\n  LoadAssets,\n  LoadModel,\n  WaitLoadModel,\n  LoadExpression,\n  WaitLoadExpression,\n  LoadPhysics,\n  WaitLoadPhysics,\n  LoadPose,\n  WaitLoadPose,\n  SetupEyeBlink,\n  SetupBreath,\n  LoadUserData,\n  WaitLoadUserData,\n  SetupEyeBlinkIds,\n  SetupLipSyncIds,\n  SetupLayout,\n  LoadMotion,\n  WaitLoadMotion,\n  CompleteInitialize,\n  CompleteSetupModel,\n  LoadTexture,\n  WaitLoadTexture,\n  CompleteSetup\n}\n\n/**\n * ユーザーが実際に使用するモデルの実装クラス<br>\n * モデル生成、機能コンポーネント生成、更新処理とレンダリングの呼び出しを行う。\n */\nexport class LAppModel extends CubismUserModel {\n  /**\n   * model3.jsonが置かれたディレクトリとファイルパスからモデルを生成する\n   * @param dir\n   * @param fileName\n   */\n  public loadAssets(dir: string, fileName: string): void {\n    this._modelHomeDir = dir;\n\n    fetch(`${this._modelHomeDir}${fileName}`)\n      .then(response => response.arrayBuffer())\n      .then(arrayBuffer => {\n        const setting: ICubismModelSetting = new CubismModelSettingJson(\n          arrayBuffer,\n          arrayBuffer.byteLength\n        );\n\n        // ステートを更新\n        this._state = LoadStep.LoadModel;\n\n        // 結果を保存\n        this.setupModel(setting);\n      })\n      .catch(error => {\n        // model3.json読み込みでエラーが発生した時点で描画は不可能なので、setupせずエラーをcatchして何もしない\n        CubismLogError(`Failed to load file ${this._modelHomeDir}${fileName}`);\n      });\n  }\n\n  /**\n   * model3.jsonからモデルを生成する。\n   * model3.jsonの記述に従ってモデル生成、モーション、物理演算などのコンポーネント生成を行う。\n   *\n   * @param setting ICubismModelSettingのインスタンス\n   */\n  private setupModel(setting: ICubismModelSetting): void {\n    this._updating = true;\n    this._initialized = false;\n\n    this._modelSetting = setting;\n\n    // CubismModel\n    if (this._modelSetting.getModelFileName() != '') {\n      const modelFileName = this._modelSetting.getModelFileName();\n\n      fetch(`${this._modelHomeDir}${modelFileName}`)\n        .then(response => {\n          if (response.ok) {\n            return response.arrayBuffer();\n          } else if (response.status >= 400) {\n            CubismLogError(\n              `Failed to load file ${this._modelHomeDir}${modelFileName}`\n            );\n            return new ArrayBuffer(0);\n          }\n        })\n        .then(arrayBuffer => {\n          this.loadModel(arrayBuffer, this._mocConsistency);\n          this._state = LoadStep.LoadExpression;\n\n          // callback\n          loadCubismExpression();\n        });\n\n      this._state = LoadStep.WaitLoadModel;\n    } else {\n      LAppPal.printMessage('Model data does not exist.');\n    }\n\n    // Expression\n    const loadCubismExpression = (): void => {\n      if (this._modelSetting.getExpressionCount() > 0) {\n        const count: number = this._modelSetting.getExpressionCount();\n\n        for (let i = 0; i < count; i++) {\n          const expressionName = this._modelSetting.getExpressionName(i);\n          const expressionFileName =\n            this._modelSetting.getExpressionFileName(i);\n\n          fetch(`${this._modelHomeDir}${expressionFileName}`)\n            .then(response => {\n              if (response.ok) {\n                return response.arrayBuffer();\n              } else if (response.status >= 400) {\n                CubismLogError(\n                  `Failed to load file ${this._modelHomeDir}${expressionFileName}`\n                );\n                // ファイルが存在しなくてもresponseはnullを返却しないため、空のArrayBufferで対応する\n                return new ArrayBuffer(0);\n              }\n            })\n            .then(arrayBuffer => {\n              const motion: ACubismMotion = this.loadExpression(\n                arrayBuffer,\n                arrayBuffer.byteLength,\n                expressionName\n              );\n\n              if (this._expressions.getValue(expressionName) != null) {\n                ACubismMotion.delete(\n                  this._expressions.getValue(expressionName)\n                );\n                this._expressions.setValue(expressionName, null);\n              }\n\n              this._expressions.setValue(expressionName, motion);\n\n              this._expressionCount++;\n\n              if (this._expressionCount >= count) {\n                this._state = LoadStep.LoadPhysics;\n\n                // callback\n                loadCubismPhysics();\n              }\n            });\n        }\n        this._state = LoadStep.WaitLoadExpression;\n      } else {\n        this._state = LoadStep.LoadPhysics;\n\n        // callback\n        loadCubismPhysics();\n      }\n    };\n\n    // Physics\n    const loadCubismPhysics = (): void => {\n      if (this._modelSetting.getPhysicsFileName() != '') {\n        const physicsFileName = this._modelSetting.getPhysicsFileName();\n\n        fetch(`${this._modelHomeDir}${physicsFileName}`)\n          .then(response => {\n            if (response.ok) {\n              return response.arrayBuffer();\n            } else if (response.status >= 400) {\n              CubismLogError(\n                `Failed to load file ${this._modelHomeDir}${physicsFileName}`\n              );\n              return new ArrayBuffer(0);\n            }\n          })\n          .then(arrayBuffer => {\n            this.loadPhysics(arrayBuffer, arrayBuffer.byteLength);\n\n            this._state = LoadStep.LoadPose;\n\n            // callback\n            loadCubismPose();\n          });\n        this._state = LoadStep.WaitLoadPhysics;\n      } else {\n        this._state = LoadStep.LoadPose;\n\n        // callback\n        loadCubismPose();\n      }\n    };\n\n    // Pose\n    const loadCubismPose = (): void => {\n      if (this._modelSetting.getPoseFileName() != '') {\n        const poseFileName = this._modelSetting.getPoseFileName();\n\n        fetch(`${this._modelHomeDir}${poseFileName}`)\n          .then(response => {\n            if (response.ok) {\n              return response.arrayBuffer();\n            } else if (response.status >= 400) {\n              CubismLogError(\n                `Failed to load file ${this._modelHomeDir}${poseFileName}`\n              );\n              return new ArrayBuffer(0);\n            }\n          })\n          .then(arrayBuffer => {\n            this.loadPose(arrayBuffer, arrayBuffer.byteLength);\n\n            this._state = LoadStep.SetupEyeBlink;\n\n            // callback\n            setupEyeBlink();\n          });\n        this._state = LoadStep.WaitLoadPose;\n      } else {\n        this._state = LoadStep.SetupEyeBlink;\n\n        // callback\n        setupEyeBlink();\n      }\n    };\n\n    // EyeBlink\n    const setupEyeBlink = (): void => {\n      if (this._modelSetting.getEyeBlinkParameterCount() > 0) {\n        this._eyeBlink = CubismEyeBlink.create(this._modelSetting);\n        this._state = LoadStep.SetupBreath;\n      }\n\n      // callback\n      setupBreath();\n    };\n\n    // Breath\n    const setupBreath = (): void => {\n      this._breath = CubismBreath.create();\n\n      const breathParameters: csmVector<BreathParameterData> = new csmVector();\n      breathParameters.pushBack(\n        new BreathParameterData(this._idParamAngleX, 0.0, 15.0, 6.5345, 0.5)\n      );\n      breathParameters.pushBack(\n        new BreathParameterData(this._idParamAngleY, 0.0, 8.0, 3.5345, 0.5)\n      );\n      breathParameters.pushBack(\n        new BreathParameterData(this._idParamAngleZ, 0.0, 10.0, 5.5345, 0.5)\n      );\n      breathParameters.pushBack(\n        new BreathParameterData(this._idParamBodyAngleX, 0.0, 4.0, 15.5345, 0.5)\n      );\n      breathParameters.pushBack(\n        new BreathParameterData(\n          CubismFramework.getIdManager().getId(\n            CubismDefaultParameterId.ParamBreath\n          ),\n          0.5,\n          0.5,\n          3.2345,\n          1\n        )\n      );\n\n      this._breath.setParameters(breathParameters);\n      this._state = LoadStep.LoadUserData;\n\n      // callback\n      loadUserData();\n    };\n\n    // UserData\n    const loadUserData = (): void => {\n      if (this._modelSetting.getUserDataFile() != '') {\n        const userDataFile = this._modelSetting.getUserDataFile();\n\n        fetch(`${this._modelHomeDir}${userDataFile}`)\n          .then(response => {\n            if (response.ok) {\n              return response.arrayBuffer();\n            } else if (response.status >= 400) {\n              CubismLogError(\n                `Failed to load file ${this._modelHomeDir}${userDataFile}`\n              );\n              return new ArrayBuffer(0);\n            }\n          })\n          .then(arrayBuffer => {\n            this.loadUserData(arrayBuffer, arrayBuffer.byteLength);\n\n            this._state = LoadStep.SetupEyeBlinkIds;\n\n            // callback\n            setupEyeBlinkIds();\n          });\n\n        this._state = LoadStep.WaitLoadUserData;\n      } else {\n        this._state = LoadStep.SetupEyeBlinkIds;\n\n        // callback\n        setupEyeBlinkIds();\n      }\n    };\n\n    // EyeBlinkIds\n    const setupEyeBlinkIds = (): void => {\n      const eyeBlinkIdCount: number =\n        this._modelSetting.getEyeBlinkParameterCount();\n\n      for (let i = 0; i < eyeBlinkIdCount; ++i) {\n        this._eyeBlinkIds.pushBack(\n          this._modelSetting.getEyeBlinkParameterId(i)\n        );\n      }\n\n      this._state = LoadStep.SetupLipSyncIds;\n\n      // callback\n      setupLipSyncIds();\n    };\n\n    // LipSyncIds\n    const setupLipSyncIds = (): void => {\n      const lipSyncIdCount = this._modelSetting.getLipSyncParameterCount();\n\n      for (let i = 0; i < lipSyncIdCount; ++i) {\n        this._lipSyncIds.pushBack(this._modelSetting.getLipSyncParameterId(i));\n      }\n      this._state = LoadStep.SetupLayout;\n\n      // callback\n      setupLayout();\n    };\n\n    // Layout\n    const setupLayout = (): void => {\n      const layout: csmMap<string, number> = new csmMap<string, number>();\n\n      if (this._modelSetting == null || this._modelMatrix == null) {\n        CubismLogError('Failed to setupLayout().');\n        return;\n      }\n\n      this._modelSetting.getLayoutMap(layout);\n      this._modelMatrix.setupFromLayout(layout);\n      this._state = LoadStep.LoadMotion;\n\n      // callback\n      loadCubismMotion();\n    };\n\n    // Motion\n    const loadCubismMotion = (): void => {\n      this._state = LoadStep.WaitLoadMotion;\n      this._model.saveParameters();\n      this._allMotionCount = 0;\n      this._motionCount = 0;\n      const group: string[] = [];\n\n      const motionGroupCount: number = this._modelSetting.getMotionGroupCount();\n\n      // モーションの総数を求める\n      for (let i = 0; i < motionGroupCount; i++) {\n        group[i] = this._modelSetting.getMotionGroupName(i);\n        this._allMotionCount += this._modelSetting.getMotionCount(group[i]);\n      }\n\n      // モーションの読み込み\n      for (let i = 0; i < motionGroupCount; i++) {\n        this.preLoadMotionGroup(group[i]);\n      }\n\n      // モーションがない場合\n      if (motionGroupCount == 0) {\n        this._state = LoadStep.LoadTexture;\n\n        // 全てのモーションを停止する\n        this._motionManager.stopAllMotions();\n\n        this._updating = false;\n        this._initialized = true;\n\n        this.createRenderer();\n        this.setupTextures();\n        this.getRenderer().startUp(gl);\n      }\n    };\n  }\n\n  /**\n   * テクスチャユニットにテクスチャをロードする\n   */\n  private setupTextures(): void {\n    // iPhoneでのアルファ品質向上のためTypescriptではpremultipliedAlphaを採用\n    const usePremultiply = true;\n\n    if (this._state == LoadStep.LoadTexture) {\n      // テクスチャ読み込み用\n      const textureCount: number = this._modelSetting.getTextureCount();\n\n      for (\n        let modelTextureNumber = 0;\n        modelTextureNumber < textureCount;\n        modelTextureNumber++\n      ) {\n        // テクスチャ名が空文字だった場合はロード・バインド処理をスキップ\n        if (this._modelSetting.getTextureFileName(modelTextureNumber) == '') {\n          console.log('getTextureFileName null');\n          continue;\n        }\n\n        // WebGLのテクスチャユニットにテクスチャをロードする\n        let texturePath =\n          this._modelSetting.getTextureFileName(modelTextureNumber);\n        texturePath = this._modelHomeDir + texturePath;\n\n        // ロード完了時に呼び出すコールバック関数\n        const onLoad = (textureInfo: TextureInfo): void => {\n          this.getRenderer().bindTexture(modelTextureNumber, textureInfo.id);\n\n          this._textureCount++;\n\n          if (this._textureCount >= textureCount) {\n            // ロード完了\n            this._state = LoadStep.CompleteSetup;\n          }\n        };\n\n        // 読み込み\n        LAppDelegate.getInstance()\n          .getTextureManager()\n          .createTextureFromPngFile(texturePath, usePremultiply, onLoad);\n        this.getRenderer().setIsPremultipliedAlpha(usePremultiply);\n      }\n\n      this._state = LoadStep.WaitLoadTexture;\n    }\n  }\n\n  /**\n   * レンダラを再構築する\n   */\n  public reloadRenderer(): void {\n    this.deleteRenderer();\n    this.createRenderer();\n    this.setupTextures();\n  }\n\n  /**\n   * 更新\n   */\n  public update(): void {\n    if (this._state != LoadStep.CompleteSetup) return;\n\n    const deltaTimeSeconds: number = LAppPal.getDeltaTime();\n    this._userTimeSeconds += deltaTimeSeconds;\n\n    this._dragManager.update(deltaTimeSeconds);\n    this._dragX = this._dragManager.getX();\n    this._dragY = this._dragManager.getY();\n\n    // モーションによるパラメータ更新の有無\n    let motionUpdated = false;\n\n    //--------------------------------------------------------------------------\n    this._model.loadParameters(); // 前回セーブされた状態をロード\n    if (this._motionManager.isFinished()) {\n      // モーションの再生がない場合、待機モーションの中からランダムで再生する\n      this.startRandomMotion(\n        LAppDefine.MotionGroupIdle,\n        LAppDefine.PriorityIdle\n      );\n    } else {\n      motionUpdated = this._motionManager.updateMotion(\n        this._model,\n        deltaTimeSeconds\n      ); // モーションを更新\n    }\n    this._model.saveParameters(); // 状態を保存\n    //--------------------------------------------------------------------------\n\n    // まばたき\n    if (!motionUpdated) {\n      if (this._eyeBlink != null) {\n        // メインモーションの更新がないとき\n        this._eyeBlink.updateParameters(this._model, deltaTimeSeconds); // 目パチ\n      }\n    }\n\n    if (this._expressionManager != null) {\n      this._expressionManager.updateMotion(this._model, deltaTimeSeconds); // 表情でパラメータ更新（相対変化）\n    }\n\n    // ドラッグによる変化\n    // ドラッグによる顔の向きの調整\n    this._model.addParameterValueById(this._idParamAngleX, this._dragX * 30); // -30から30の値を加える\n    this._model.addParameterValueById(this._idParamAngleY, this._dragY * 30);\n    this._model.addParameterValueById(\n      this._idParamAngleZ,\n      this._dragX * this._dragY * -30\n    );\n\n    // ドラッグによる体の向きの調整\n    this._model.addParameterValueById(\n      this._idParamBodyAngleX,\n      this._dragX * 10\n    ); // -10から10の値を加える\n\n    // ドラッグによる目の向きの調整\n    this._model.addParameterValueById(this._idParamEyeBallX, this._dragX); // -1から1の値を加える\n    this._model.addParameterValueById(this._idParamEyeBallY, this._dragY);\n\n    // this.mouthPlayer(0, 0.5)\n\n    // 呼吸など\n    if (this._breath != null) {\n      this._breath.updateParameters(this._model, deltaTimeSeconds);\n    }\n\n    // 物理演算の設定\n    if (this._physics != null) {\n      this._physics.evaluate(this._model, deltaTimeSeconds);\n    }\n\n    // リップシンクの設定\n    if (this._lipsync) {\n      let value = 0.0; // リアルタイムでリップシンクを行う場合、システムから音量を取得して、0~1の範囲で値を入力します。\n\n      this._wavFileHandler.update(deltaTimeSeconds);\n      value = this._wavFileHandler.getRms();\n\n      for (let i = 0; i < this._lipSyncIds.getSize(); ++i) {\n        this._model.addParameterValueById(this._lipSyncIds.at(i), value, this._voiceWeight);\n      }\n    }\n\n    // ポーズの設定\n    if (this._pose != null) {\n      this._pose.updateParameters(this._model, deltaTimeSeconds);\n    }\n\n    this._model.update();\n  }\n\n  // 嘴巴动作\n  public mouthMotions(pathOrBuffer: string | ArrayBuffer, voiceWeight: number = 0.8): void {\n    this._voiceWeight = voiceWeight\n    if (pathOrBuffer instanceof ArrayBuffer) {\n      this._wavFileHandler.loadWavBytes(pathOrBuffer);\n    } else {\n      this._wavFileHandler.loadWavFile(pathOrBuffer);\n    }\n  }\n\n  // 加载本地wav\n  public async loadVoice(path: string): Promise<ArrayBuffer> {\n    return this._wavFileHandler.asyncFileLoad(path)\n  }\n\n  /**\n   * 引数で指定したモーションの再生を開始する\n   * @param group モーショングループ名\n   * @param no グループ内の番号\n   * @param priority 優先度\n   * @param onFinishedMotionHandler モーション再生終了時に呼び出されるコールバック関数\n   * @return 開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するisFinished()の引数で使用する。開始できない時は[-1]\n   */\n  public startMotion(\n    group: string,\n    no: number,\n    priority: number,\n    onFinishedMotionHandler?: FinishedMotionCallback\n  ): CubismMotionQueueEntryHandle {\n    if (priority == LAppDefine.PriorityForce) {\n      this._motionManager.setReservePriority(priority);\n    } else if (!this._motionManager.reserveMotion(priority)) {\n      if (this._debugMode) {\n        LAppPal.printMessage(\"[APP]can't start motion.\");\n      }\n      return InvalidMotionQueueEntryHandleValue;\n    }\n\n    const motionFileName = this._modelSetting.getMotionFileName(group, no);\n\n    // ex) idle_0\n    const name = `${group}_${no}`;\n    let motion: CubismMotion = this._motions.getValue(name) as CubismMotion;\n    let autoDelete = false;\n\n    if (motion == null) {\n      fetch(`${this._modelHomeDir}${motionFileName}`)\n        .then(response => {\n          if (response.ok) {\n            return response.arrayBuffer();\n          } else if (response.status >= 400) {\n            CubismLogError(\n              `Failed to load file ${this._modelHomeDir}${motionFileName}`\n            );\n            return new ArrayBuffer(0);\n          }\n        })\n        .then(arrayBuffer => {\n          motion = this.loadMotion(\n            arrayBuffer,\n            arrayBuffer.byteLength,\n            null,\n            onFinishedMotionHandler\n          );\n\n          if (motion == null) {\n            return;\n          }\n\n          let fadeTime: number = this._modelSetting.getMotionFadeInTimeValue(\n            group,\n            no\n          );\n\n          if (fadeTime >= 0.0) {\n            motion.setFadeInTime(fadeTime);\n          }\n\n          fadeTime = this._modelSetting.getMotionFadeOutTimeValue(group, no);\n          if (fadeTime >= 0.0) {\n            motion.setFadeOutTime(fadeTime);\n          }\n\n          motion.setEffectIds(this._eyeBlinkIds, this._lipSyncIds);\n          autoDelete = true; // 終了時にメモリから削除\n        });\n    } else {\n      motion.setFinishedMotionHandler(onFinishedMotionHandler);\n    }\n\n    //voice\n    const voice = this._modelSetting.getMotionSoundFileName(group, no);\n    if (voice.localeCompare('') != 0) {\n      let path = voice;\n      path = this._modelHomeDir + path;\n      this._wavFileHandler.start(path);\n    }\n\n    if (this._debugMode) {\n      LAppPal.printMessage(`[APP]start motion: [${group}_${no}`);\n    }\n    return this._motionManager.startMotionPriority(\n      motion,\n      autoDelete,\n      priority\n    );\n  }\n\n  /**\n   * ランダムに選ばれたモーションの再生を開始する。\n   * @param group モーショングループ名\n   * @param priority 優先度\n   * @param onFinishedMotionHandler モーション再生終了時に呼び出されるコールバック関数\n   * @return 開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するisFinished()の引数で使用する。開始できない時は[-1]\n   */\n  public startRandomMotion(\n    group: string,\n    priority: number,\n    onFinishedMotionHandler?: FinishedMotionCallback\n  ): CubismMotionQueueEntryHandle {\n    if (this._modelSetting.getMotionCount(group) == 0) {\n      return InvalidMotionQueueEntryHandleValue;\n    }\n\n    const no: number = Math.floor(\n      Math.random() * this._modelSetting.getMotionCount(group)\n    );\n\n    return this.startMotion(group, no, priority, onFinishedMotionHandler);\n  }\n\n  /**\n   * 引数で指定した表情モーションをセットする\n   *\n   * @param expressionId 表情モーションのID\n   */\n  public setExpression(expressionId: string): void {\n    const motion: ACubismMotion = this._expressions.getValue(expressionId);\n\n    if (this._debugMode) {\n      LAppPal.printMessage(`[APP]expression: [${expressionId}]`);\n    }\n\n    if (motion != null) {\n      this._expressionManager.startMotionPriority(\n        motion,\n        false,\n        LAppDefine.PriorityForce\n      );\n    } else {\n      if (this._debugMode) {\n        LAppPal.printMessage(`[APP]expression[${expressionId}] is null`);\n      }\n    }\n  }\n\n  /**\n   * ランダムに選ばれた表情モーションをセットする\n   */\n  public setRandomExpression(): void {\n    if (this._expressions.getSize() == 0) {\n      return;\n    }\n\n    const no: number = Math.floor(Math.random() * this._expressions.getSize());\n\n    for (let i = 0; i < this._expressions.getSize(); i++) {\n      if (i == no) {\n        const name: string = this._expressions._keyValues[i].first;\n        this.setExpression(name);\n        return;\n      }\n    }\n  }\n\n  /**\n   * イベントの発火を受け取る\n   */\n  public motionEventFired(eventValue: csmString): void {\n    CubismLogInfo('{0} is fired on LAppModel!!', eventValue.s);\n  }\n\n  /**\n   * 当たり判定テスト\n   * 指定ＩＤの頂点リストから矩形を計算し、座標をが矩形範囲内か判定する。\n   *\n   * @param hitArenaName  当たり判定をテストする対象のID\n   * @param x             判定を行うX座標\n   * @param y             判定を行うY座標\n   */\n  public hitTest(hitArenaName: string, x: number, y: number): boolean {\n    // 透明時は当たり判定無し。\n    if (this._opacity < 1) {\n      return false;\n    }\n\n    const count: number = this._modelSetting.getHitAreasCount();\n\n    for (let i = 0; i < count; i++) {\n      if (this._modelSetting.getHitAreaName(i) == hitArenaName) {\n        const drawId: CubismIdHandle = this._modelSetting.getHitAreaId(i);\n        return this.isHit(drawId, x, y);\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * モーションデータをグループ名から一括でロードする。\n   * モーションデータの名前は内部でModelSettingから取得する。\n   *\n   * @param group モーションデータのグループ名\n   */\n  public preLoadMotionGroup(group: string): void {\n    for (let i = 0; i < this._modelSetting.getMotionCount(group); i++) {\n      const motionFileName = this._modelSetting.getMotionFileName(group, i);\n\n      // ex) idle_0\n      const name = `${group}_${i}`;\n      if (this._debugMode) {\n        LAppPal.printMessage(\n          `[APP]load motion: ${motionFileName} => [${name}]`\n        );\n      }\n\n      fetch(`${this._modelHomeDir}${motionFileName}`)\n        .then(response => {\n          if (response.ok) {\n            return response.arrayBuffer();\n          } else if (response.status >= 400) {\n            CubismLogError(\n              `Failed to load file ${this._modelHomeDir}${motionFileName}`\n            );\n            return new ArrayBuffer(0);\n          }\n        })\n        .then(arrayBuffer => {\n          const tmpMotion: CubismMotion = this.loadMotion(\n            arrayBuffer,\n            arrayBuffer.byteLength,\n            name\n          );\n\n          if (tmpMotion != null) {\n            let fadeTime = this._modelSetting.getMotionFadeInTimeValue(\n              group,\n              i\n            );\n            if (fadeTime >= 0.0) {\n              tmpMotion.setFadeInTime(fadeTime);\n            }\n\n            fadeTime = this._modelSetting.getMotionFadeOutTimeValue(group, i);\n            if (fadeTime >= 0.0) {\n              tmpMotion.setFadeOutTime(fadeTime);\n            }\n            tmpMotion.setEffectIds(this._eyeBlinkIds, this._lipSyncIds);\n\n            if (this._motions.getValue(name) != null) {\n              ACubismMotion.delete(this._motions.getValue(name));\n            }\n\n            this._motions.setValue(name, tmpMotion);\n\n            this._motionCount++;\n            if (this._motionCount >= this._allMotionCount) {\n              this._state = LoadStep.LoadTexture;\n\n              // 全てのモーションを停止する\n              this._motionManager.stopAllMotions();\n\n              this._updating = false;\n              this._initialized = true;\n\n              this.createRenderer();\n              this.setupTextures();\n              this.getRenderer().startUp(gl);\n            }\n          } else {\n            // loadMotionできなかった場合はモーションの総数がずれるので1つ減らす\n            this._allMotionCount--;\n          }\n        });\n    }\n  }\n\n  /**\n   * すべてのモーションデータを解放する。\n   */\n  public releaseMotions(): void {\n    this._motions.clear();\n  }\n\n  /**\n   * 全ての表情データを解放する。\n   */\n  public releaseExpressions(): void {\n    this._expressions.clear();\n  }\n\n  /**\n   * モデルを描画する処理。モデルを描画する空間のView-Projection行列を渡す。\n   */\n  public doDraw(): void {\n    if (this._model == null) return;\n\n    // キャンバスサイズを渡す\n    const viewport: number[] = [0, 0, canvas.width, canvas.height];\n\n    this.getRenderer().setRenderState(frameBuffer, viewport);\n    this.getRenderer().drawModel();\n  }\n\n  /**\n   * モデルを描画する処理。モデルを描画する空間のView-Projection行列を渡す。\n   */\n  public draw(matrix: CubismMatrix44): void {\n    if (this._model == null) {\n      return;\n    }\n\n    // 各読み込み終了後\n    if (this._state == LoadStep.CompleteSetup) {\n      matrix.multiplyByMatrix(this._modelMatrix);\n\n      this.getRenderer().setMvpMatrix(matrix);\n\n      this.doDraw();\n    }\n  }\n\n  public async hasMocConsistencyFromFile() {\n    CSM_ASSERT(this._modelSetting.getModelFileName().localeCompare(``));\n\n    // CubismModel\n    if (this._modelSetting.getModelFileName() != '') {\n      const modelFileName = this._modelSetting.getModelFileName();\n\n      const response = await fetch(`${this._modelHomeDir}${modelFileName}`);\n      const arrayBuffer = await response.arrayBuffer();\n\n      this._consistency = CubismMoc.hasMocConsistency(arrayBuffer);\n\n      if (!this._consistency) {\n        CubismLogInfo('Inconsistent MOC3.');\n      } else {\n        CubismLogInfo('Consistent MOC3.');\n      }\n\n      return this._consistency;\n    } else {\n      LAppPal.printMessage('Model data does not exist.');\n    }\n  }\n\n  /**\n   * コンストラクタ\n   */\n  public constructor(key: string) {\n    super();\n\n    this._key = key;\n    this._voiceWeight = 0.8;\n\n    this._modelSetting = null;\n    this._modelHomeDir = null;\n    this._userTimeSeconds = 0.0;\n\n    this._eyeBlinkIds = new csmVector<CubismIdHandle>();\n    this._lipSyncIds = new csmVector<CubismIdHandle>();\n\n    this._motions = new csmMap<string, ACubismMotion>();\n    this._expressions = new csmMap<string, ACubismMotion>();\n\n    this._hitArea = new csmVector<csmRect>();\n    this._userArea = new csmVector<csmRect>();\n\n    this._idParamAngleX = CubismFramework.getIdManager().getId(\n      CubismDefaultParameterId.ParamAngleX\n    );\n    this._idParamAngleY = CubismFramework.getIdManager().getId(\n      CubismDefaultParameterId.ParamAngleY\n    );\n    this._idParamAngleZ = CubismFramework.getIdManager().getId(\n      CubismDefaultParameterId.ParamAngleZ\n    );\n    this._idParamEyeBallX = CubismFramework.getIdManager().getId(\n      CubismDefaultParameterId.ParamEyeBallX\n    );\n    this._idParamEyeBallY = CubismFramework.getIdManager().getId(\n      CubismDefaultParameterId.ParamEyeBallY\n    );\n    this._idParamBodyAngleX = CubismFramework.getIdManager().getId(\n      CubismDefaultParameterId.ParamBodyAngleX\n    );\n\n    if (LAppDefine.MOCConsistencyValidationEnable) {\n      this._mocConsistency = true;\n    }\n\n    this._state = LoadStep.LoadAssets;\n    this._expressionCount = 0;\n    this._textureCount = 0;\n    this._motionCount = 0;\n    this._allMotionCount = 0;\n    this._wavFileHandler = new LAppWavFileHandler();\n    this._consistency = false;\n  }\n\n  _modelSetting: ICubismModelSetting; // モデルセッティング情報\n  _modelHomeDir: string; // モデルセッティングが置かれたディレクトリ\n  _userTimeSeconds: number; // デルタ時間の積算値[秒]\n\n  _eyeBlinkIds: csmVector<CubismIdHandle>; // モデルに設定された瞬き機能用パラメータID\n  _lipSyncIds: csmVector<CubismIdHandle>; // モデルに設定されたリップシンク機能用パラメータID\n\n  _motions: csmMap<string, ACubismMotion>; // 読み込まれているモーションのリスト\n  _expressions: csmMap<string, ACubismMotion>; // 読み込まれている表情のリスト\n\n  _hitArea: csmVector<csmRect>;\n  _userArea: csmVector<csmRect>;\n\n  _idParamAngleX: CubismIdHandle; // パラメータID: ParamAngleX\n  _idParamAngleY: CubismIdHandle; // パラメータID: ParamAngleY\n  _idParamAngleZ: CubismIdHandle; // パラメータID: ParamAngleZ\n  _idParamEyeBallX: CubismIdHandle; // パラメータID: ParamEyeBallX\n  _idParamEyeBallY: CubismIdHandle; // パラメータID: ParamEyeBAllY\n  _idParamBodyAngleX: CubismIdHandle; // パラメータID: ParamBodyAngleX\n\n  _idParamMouthForm: CubismIdHandle; // 嘴巴X\n  _idParamMouthOpenY: CubismIdHandle; // 嘴巴Y\n\n  _state: LoadStep; // 現在のステータス管理用\n  _expressionCount: number; // 表情データカウント\n  _textureCount: number; // テクスチャカウント\n  _motionCount: number; // モーションデータカウント\n  _allMotionCount: number; // モーション総数\n  _wavFileHandler: LAppWavFileHandler; //wavファイルハンドラ\n  _consistency: boolean; // MOC3一貫性チェック管理用\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismMatrix44 } from '@framework/math/cubismmatrix44';\nimport { ACubismMotion } from '@framework/motion/acubismmotion';\nimport { csmVector } from '@framework/type/csmvector';\n\nimport LAppDefine from './lappdefine';\nimport { canvas } from './lappglmanager';\nimport { LAppModel } from './lappmodel';\nimport { LAppPal } from './lapppal';\n\nexport let s_instance: LAppLive2DManager = null;\n\n/**\n * サンプルアプリケーションにおいてCubismModelを管理するクラス\n * モデル生成と破棄、タップイベントの処理、モデル切り替えを行う。\n */\nexport class LAppLive2DManager {\n  /**\n   * クラスのインスタンス（シングルトン）を返す。\n   * インスタンスが生成されていない場合は内部でインスタンスを生成する。\n   *\n   * @return クラスのインスタンス\n   */\n  public static getInstance(model: string = \"Mao\", create: boolean = true): LAppLive2DManager {\n    if (create && s_instance == null) {\n      s_instance = new LAppLive2DManager(model);\n    }\n\n    return s_instance;\n  }\n\n  /**\n   * クラスのインスタンス（シングルトン）を解放する。\n   */\n  public static releaseInstance(): void {\n    if (s_instance != null) {\n      s_instance = void 0;\n    }\n\n    s_instance = null;\n  }\n\n  /**\n   * 現在のシーンで保持しているモデルを返す。\n   *\n   * @param key モデルリストのインデックス値\n   * @return モデルのインスタンスを返す。インデックス値が範囲外の場合はNULLを返す。\n   */\n  public getModel(key: string): LAppModel {\n    let size = this._models.getSize();\n    if (size > 0) {\n      for (let pos = 0; pos < size; pos++) {\n        const model = this._models.at(pos);\n        if (model.key == key) {\n          return model;\n        }\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * 現在のシーンで保持しているすべてのモデルを解放する\n   */\n  public releaseAllModel(): void {\n    for (let i = 0; i < this._models.getSize(); i++) {\n      this._models.at(i).release();\n      this._models.set(i, null);\n    }\n\n    this._models.clear();\n  }\n\n  /**\n   * 画面をドラッグした時の処理\n   *\n   * @param x 画面のX座標\n   * @param y 画面のY座標\n   */\n  public onDrag(x: number, y: number): void {\n    for (let i = 0; i < this._models.getSize(); i++) {\n      const model: LAppModel = this._models.at(i);\n\n      if (model) {\n        model.setDragging(x, y);\n      }\n    }\n  }\n\n  /**\n   * 画面をタップした時の処理\n   *\n   * @param x 画面のX座標\n   * @param y 画面のY座標\n   */\n  public onTap(x: number, y: number): void {\n    if (LAppDefine.DebugLogEnable) {\n      LAppPal.printMessage(\n        `[APP]tap point: {x: ${x.toFixed(2)} y: ${y.toFixed(2)}}`\n      );\n    }\n\n    for (let i = 0; i < this._models.getSize(); i++) {\n      if (this._models.at(i).hitTest(LAppDefine.HitAreaNameHead, x, y)) {\n        if (LAppDefine.DebugLogEnable) {\n          LAppPal.printMessage(\n            `[APP]hit area: [${LAppDefine.HitAreaNameHead}]`\n          );\n        }\n        this._models.at(i).setRandomExpression();\n      } else if (this._models.at(i).hitTest(LAppDefine.HitAreaNameBody, x, y)) {\n        if (LAppDefine.DebugLogEnable) {\n          LAppPal.printMessage(\n            `[APP]hit area: [${LAppDefine.HitAreaNameBody}]`\n          );\n        }\n        this._models\n          .at(i)\n          .startRandomMotion(\n            LAppDefine.MotionGroupTapBody,\n            LAppDefine.PriorityNormal,\n            this._finishedMotion\n          );\n      }\n    }\n  }\n\n  /**\n   * 画面を更新するときの処理\n   * モデルの更新処理及び描画処理を行う\n   */\n  public onUpdate(): void {\n    const { width, height } = canvas;\n\n    const modelCount: number = this._models.getSize();\n\n    for (let i = 0; i < modelCount; ++i) {\n      const projection: CubismMatrix44 = new CubismMatrix44();\n      const model: LAppModel = this._models.at(i);\n\n      if (model.getModel()) {\n        if (model.getModel().getCanvasWidth() > 1.0 && width < height) {\n          // 横に長いモデルを縦長ウィンドウに表示する際モデルの横サイズでscaleを算出する\n          model.getModelMatrix().setWidth(2.0);\n          projection.scale(1.0, width / height);\n        } else {\n          projection.scale(height / width, 1.0);\n        }\n\n        // 必要があればここで乗算\n        if (this._viewMatrix != null) {\n          projection.multiplyByMatrix(this._viewMatrix);\n        }\n      }\n\n      model.update();\n      model.draw(projection); // 参照渡しなのでprojectionは変質する。\n    }\n  }\n\n  /**\n   * シーンを切り替える\n   * サンプルアプリケーションではモデルセットの切り替えを行う。\n   */\n  public changeScene(model: string): void {\n    if (LAppDefine.DebugLogEnable) {\n      LAppPal.printMessage(`[APP]model: ${model}`);\n    }\n\n    // ModelDir[]に保持したディレクトリ名から\n    // model3.jsonのパスを決定する。\n    // ディレクトリ名とmodel3.jsonの名前を一致させておくこと。\n    const modelPath: string = LAppDefine.ResourcesPath + model + '/';\n    let modelJsonName: string = model;\n    modelJsonName += '.model3.json';\n\n    this.releaseAllModel();\n    this._models.pushBack(new LAppModel(model));\n    this._models.at(0).loadAssets(modelPath, modelJsonName);\n  }\n\n  public setViewMatrix(m: CubismMatrix44) {\n    for (let i = 0; i < 16; i++) {\n      this._viewMatrix.getArray()[i] = m.getArray()[i];\n    }\n  }\n\n  /**\n   * コンストラクタ\n   */\n  constructor(model: string) {\n    this._viewMatrix = new CubismMatrix44();\n    this._models = new csmVector<LAppModel>();\n    this.changeScene(model);\n  }\n\n  _viewMatrix: CubismMatrix44; // モデル描画に用いるview行列\n  _models: csmVector<LAppModel>; // モデルインスタンスのコンテナ\n  // モーション再生終了のコールバック関数\n  _finishedMotion = (self: ACubismMotion): void => {\n    LAppPal.printMessage('Motion Finished:');\n    console.log(self);\n  };\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { csmVector, iterator } from '@framework/type/csmvector';\n\nimport { gl } from './lappglmanager';\n\n/**\n * テクスチャ管理クラス\n * 画像読み込み、管理を行うクラス。\n */\nexport class LAppTextureManager {\n  /**\n   * コンストラクタ\n   */\n  constructor() {\n    this._textures = new csmVector<TextureInfo>();\n  }\n\n  /**\n   * 解放する。\n   */\n  public release(): void {\n    for (\n      let ite: iterator<TextureInfo> = this._textures.begin();\n      ite.notEqual(this._textures.end());\n      ite.preIncrement()\n    ) {\n      gl.deleteTexture(ite.ptr().id);\n    }\n    this._textures = null;\n  }\n\n  /**\n   * 画像読み込み\n   *\n   * @param fileName 読み込む画像ファイルパス名\n   * @param usePremultiply Premult処理を有効にするか\n   * @return 画像情報、読み込み失敗時はnullを返す\n   */\n  public createTextureFromPngFile(\n    fileName: string,\n    usePremultiply: boolean,\n    callback: (textureInfo: TextureInfo) => void\n  ): void {\n    // search loaded texture already\n    for (\n      let ite: iterator<TextureInfo> = this._textures.begin();\n      ite.notEqual(this._textures.end());\n      ite.preIncrement()\n    ) {\n      if (\n        ite.ptr().fileName == fileName &&\n        ite.ptr().usePremultply == usePremultiply\n      ) {\n        // 2回目以降はキャッシュが使用される(待ち時間なし)\n        // WebKitでは同じImageのonloadを再度呼ぶには再インスタンスが必要\n        // 詳細：https://stackoverflow.com/a/5024181\n        ite.ptr().img = new Image();\n        ite\n          .ptr()\n          .img.addEventListener('load', (): void => callback(ite.ptr()), {\n            passive: true\n          });\n        ite.ptr().img.src = fileName;\n        return;\n      }\n    }\n\n    // データのオンロードをトリガーにする\n    const img = new Image();\n    img.crossOrigin = \"anonymous\";\n\n    img.addEventListener(\n      'load',\n      (): void => {\n        // テクスチャオブジェクトの作成\n        const tex: WebGLTexture = gl.createTexture();\n\n        // テクスチャを選択\n        gl.bindTexture(gl.TEXTURE_2D, tex);\n\n        // テクスチャにピクセルを書き込む\n        gl.texParameteri(\n          gl.TEXTURE_2D,\n          gl.TEXTURE_MIN_FILTER,\n          gl.LINEAR_MIPMAP_LINEAR\n        );\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n        // Premult処理を行わせる\n        if (usePremultiply) {\n          gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1);\n        }\n\n        // テクスチャにピクセルを書き込む\n        gl.texImage2D(\n          gl.TEXTURE_2D,\n          0,\n          gl.RGBA,\n          gl.RGBA,\n          gl.UNSIGNED_BYTE,\n          img\n        );\n\n        // ミップマップを生成\n        gl.generateMipmap(gl.TEXTURE_2D);\n\n        // テクスチャをバインド\n        gl.bindTexture(gl.TEXTURE_2D, null);\n\n        const textureInfo: TextureInfo = new TextureInfo();\n        if (textureInfo != null) {\n          textureInfo.fileName = fileName;\n          textureInfo.width = img.width;\n          textureInfo.height = img.height;\n          textureInfo.id = tex;\n          textureInfo.img = img;\n          textureInfo.usePremultply = usePremultiply;\n          this._textures.pushBack(textureInfo);\n        }\n\n        callback(textureInfo);\n      },\n      { passive: true }\n    );\n    img.src = fileName;\n  }\n\n  /**\n   * 画像の解放\n   *\n   * 配列に存在する画像全てを解放する。\n   */\n  public releaseTextures(): void {\n    for (let i = 0; i < this._textures.getSize(); i++) {\n      this._textures.set(i, null);\n    }\n\n    this._textures.clear();\n  }\n\n  /**\n   * 画像の解放\n   *\n   * 指定したテクスチャの画像を解放する。\n   * @param texture 解放するテクスチャ\n   */\n  public releaseTextureByTexture(texture: WebGLTexture): void {\n    for (let i = 0; i < this._textures.getSize(); i++) {\n      if (this._textures.at(i).id != texture) {\n        continue;\n      }\n\n      this._textures.set(i, null);\n      this._textures.remove(i);\n      break;\n    }\n  }\n\n  /**\n   * 画像の解放\n   *\n   * 指定した名前の画像を解放する。\n   * @param fileName 解放する画像ファイルパス名\n   */\n  public releaseTextureByFilePath(fileName: string): void {\n    for (let i = 0; i < this._textures.getSize(); i++) {\n      if (this._textures.at(i).fileName == fileName) {\n        this._textures.set(i, null);\n        this._textures.remove(i);\n        break;\n      }\n    }\n  }\n\n  _textures: csmVector<TextureInfo>;\n}\n\n/**\n * 画像情報構造体\n */\nexport class TextureInfo {\n  img: HTMLImageElement; // 画像\n  id: WebGLTexture = null; // テクスチャ\n  width = 0; // 横幅\n  height = 0; // 高さ\n  usePremultply: boolean; // Premult処理を有効にするか\n  fileName: string; // ファイル名\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismMatrix44 } from './cubismmatrix44';\n\n/**\n * カメラの位置変更に使うと便利な4x4行列\n *\n * カメラの位置変更に使うと便利な4x4行列のクラス。\n */\nexport class CubismViewMatrix extends CubismMatrix44 {\n  /**\n   * コンストラクタ\n   */\n  public constructor() {\n    super();\n    this._screenLeft = 0.0;\n    this._screenRight = 0.0;\n    this._screenTop = 0.0;\n    this._screenBottom = 0.0;\n    this._maxLeft = 0.0;\n    this._maxRight = 0.0;\n    this._maxTop = 0.0;\n    this._maxBottom = 0.0;\n    this._maxScale = 0.0;\n    this._minScale = 0.0;\n  }\n\n  /**\n   * 移動を調整\n   *\n   * @param x X軸の移動量\n   * @param y Y軸の移動量\n   */\n  public adjustTranslate(x: number, y: number): void {\n    if (this._tr[0] * this._maxLeft + (this._tr[12] + x) > this._screenLeft) {\n      x = this._screenLeft - this._tr[0] * this._maxLeft - this._tr[12];\n    }\n\n    if (this._tr[0] * this._maxRight + (this._tr[12] + x) < this._screenRight) {\n      x = this._screenRight - this._tr[0] * this._maxRight - this._tr[12];\n    }\n\n    if (this._tr[5] * this._maxTop + (this._tr[13] + y) < this._screenTop) {\n      y = this._screenTop - this._tr[5] * this._maxTop - this._tr[13];\n    }\n\n    if (\n      this._tr[5] * this._maxBottom + (this._tr[13] + y) >\n      this._screenBottom\n    ) {\n      y = this._screenBottom - this._tr[5] * this._maxBottom - this._tr[13];\n    }\n\n    const tr1: Float32Array = new Float32Array([\n      1.0,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      1.0,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      1.0,\n      0.0,\n      x,\n      y,\n      0.0,\n      1.0\n    ]);\n\n    CubismMatrix44.multiply(tr1, this._tr, this._tr);\n  }\n\n  /**\n   * 拡大率を調整\n   *\n   * @param cx 拡大を行うX軸の中心位置\n   * @param cy 拡大を行うY軸の中心位置\n   * @param scale 拡大率\n   */\n  public adjustScale(cx: number, cy: number, scale: number): void {\n    const maxScale: number = this.getMaxScale();\n    const minScale: number = this.getMinScale();\n\n    const targetScale = scale * this._tr[0];\n\n    if (targetScale < minScale) {\n      if (this._tr[0] > 0.0) {\n        scale = minScale / this._tr[0];\n      }\n    } else if (targetScale > maxScale) {\n      if (this._tr[0] > 0.0) {\n        scale = maxScale / this._tr[0];\n      }\n    }\n\n    const tr1: Float32Array = new Float32Array([\n      1.0,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      1.0,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      1.0,\n      0.0,\n      cx,\n      cy,\n      0.0,\n      1.0\n    ]);\n\n    const tr2: Float32Array = new Float32Array([\n      scale,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      scale,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      1.0,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      1.0\n    ]);\n\n    const tr3: Float32Array = new Float32Array([\n      1.0,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      1.0,\n      0.0,\n      0.0,\n      0.0,\n      0.0,\n      1.0,\n      0.0,\n      -cx,\n      -cy,\n      0.0,\n      1.0\n    ]);\n\n    CubismMatrix44.multiply(tr3, this._tr, this._tr);\n    CubismMatrix44.multiply(tr2, this._tr, this._tr);\n    CubismMatrix44.multiply(tr1, this._tr, this._tr);\n  }\n\n  /**\n   * デバイスに対応する論理座養生の範囲の設定\n   *\n   * @param left      左辺のX軸の位置\n   * @param right     右辺のX軸の位置\n   * @param bottom    下辺のY軸の位置\n   * @param top       上辺のY軸の位置\n   */\n  public setScreenRect(\n    left: number,\n    right: number,\n    bottom: number,\n    top: number\n  ): void {\n    this._screenLeft = left;\n    this._screenRight = right;\n    this._screenBottom = bottom;\n    this._screenTop = top;\n  }\n\n  /**\n   * デバイスに対応する論理座標上の移動可能範囲の設定\n   * @param left      左辺のX軸の位置\n   * @param right     右辺のX軸の位置\n   * @param bottom    下辺のY軸の位置\n   * @param top       上辺のY軸の位置\n   */\n  public setMaxScreenRect(\n    left: number,\n    right: number,\n    bottom: number,\n    top: number\n  ): void {\n    this._maxLeft = left;\n    this._maxRight = right;\n    this._maxTop = top;\n    this._maxBottom = bottom;\n  }\n\n  /**\n   * 最大拡大率の設定\n   * @param maxScale 最大拡大率\n   */\n  public setMaxScale(maxScale: number): void {\n    this._maxScale = maxScale;\n  }\n\n  /**\n   * 最小拡大率の設定\n   * @param minScale 最小拡大率\n   */\n  public setMinScale(minScale: number): void {\n    this._minScale = minScale;\n  }\n\n  /**\n   * 最大拡大率の取得\n   * @return 最大拡大率\n   */\n  public getMaxScale(): number {\n    return this._maxScale;\n  }\n\n  /**\n   * 最小拡大率の取得\n   * @return 最小拡大率\n   */\n  public getMinScale(): number {\n    return this._minScale;\n  }\n\n  /**\n   * 拡大率が最大になっているかを確認する\n   *\n   * @return true 拡大率は最大\n   * @return false 拡大率は最大ではない\n   */\n  public isMaxScale(): boolean {\n    return this.getScaleX() >= this._maxScale;\n  }\n\n  /**\n   * 拡大率が最小になっているかを確認する\n   *\n   * @return true 拡大率は最小\n   * @return false 拡大率は最小ではない\n   */\n  public isMinScale(): boolean {\n    return this.getScaleX() <= this._minScale;\n  }\n\n  /**\n   * デバイスに対応する論理座標の左辺のＸ軸位置を取得する\n   * @return デバイスに対応する論理座標の左辺のX軸位置\n   */\n  public getScreenLeft(): number {\n    return this._screenLeft;\n  }\n\n  /**\n   * デバイスに対応する論理座標の右辺のＸ軸位置を取得する\n   * @return デバイスに対応する論理座標の右辺のX軸位置\n   */\n  public getScreenRight(): number {\n    return this._screenRight;\n  }\n\n  /**\n   * デバイスに対応する論理座標の下辺のY軸位置を取得する\n   * @return デバイスに対応する論理座標の下辺のY軸位置\n   */\n  public getScreenBottom(): number {\n    return this._screenBottom;\n  }\n\n  /**\n   * デバイスに対応する論理座標の上辺のY軸位置を取得する\n   * @return デバイスに対応する論理座標の上辺のY軸位置\n   */\n  public getScreenTop(): number {\n    return this._screenTop;\n  }\n\n  /**\n   * 左辺のX軸位置の最大値の取得\n   * @return 左辺のX軸位置の最大値\n   */\n  public getMaxLeft(): number {\n    return this._maxLeft;\n  }\n\n  /**\n   * 右辺のX軸位置の最大値の取得\n   * @return 右辺のX軸位置の最大値\n   */\n  public getMaxRight(): number {\n    return this._maxRight;\n  }\n\n  /**\n   * 下辺のY軸位置の最大値の取得\n   * @return 下辺のY軸位置の最大値\n   */\n  public getMaxBottom(): number {\n    return this._maxBottom;\n  }\n\n  /**\n   * 上辺のY軸位置の最大値の取得\n   * @return 上辺のY軸位置の最大値\n   */\n  public getMaxTop(): number {\n    return this._maxTop;\n  }\n\n  private _screenLeft: number; // デバイスに対応する論理座標上の範囲（左辺X軸位置）\n  private _screenRight: number; // デバイスに対応する論理座標上の範囲（右辺X軸位置）\n  private _screenTop: number; // デバイスに対応する論理座標上の範囲（上辺Y軸位置）\n  private _screenBottom: number; // デバイスに対応する論理座標上の範囲（下辺Y軸位置）\n  private _maxLeft: number; // 論理座標上の移動可能範囲（左辺X軸位置）\n  private _maxRight: number; // 論理座標上の移動可能範囲（右辺X軸位置）\n  private _maxTop: number; // 論理座標上の移動可能範囲（上辺Y軸位置）\n  private _maxBottom: number; // 論理座標上の移動可能範囲（下辺Y軸位置）\n  private _maxScale: number; // 拡大率の最大値\n  private _minScale: number; // 拡大率の最小値\n}\n\n// Namespace definition for compatibility.\nimport * as $ from './cubismviewmatrix';\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Live2DCubismFramework {\n  export const CubismViewMatrix = $.CubismViewMatrix;\n  export type CubismViewMatrix = $.CubismViewMatrix;\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { canvas, gl } from './lappglmanager';\n\n/**\n * スプライトを実装するクラス\n *\n * テクスチャＩＤ、Rectの管理\n */\nexport class LAppSprite {\n  /**\n   * コンストラクタ\n   * @param x            x座標\n   * @param y            y座標\n   * @param width        横幅\n   * @param height       高さ\n   * @param textureId    テクスチャ\n   */\n  constructor(\n    x: number,\n    y: number,\n    width: number,\n    height: number,\n    textureId: WebGLTexture\n  ) {\n    this._rect = new Rect();\n    this._rect.left = x - width * 0.5;\n    this._rect.right = x + width * 0.5;\n    this._rect.up = y + height * 0.5;\n    this._rect.down = y - height * 0.5;\n    this._texture = textureId;\n    this._vertexBuffer = null;\n    this._uvBuffer = null;\n    this._indexBuffer = null;\n\n    this._positionLocation = null;\n    this._uvLocation = null;\n    this._textureLocation = null;\n\n    this._positionArray = null;\n    this._uvArray = null;\n    this._indexArray = null;\n\n    this._firstDraw = true;\n  }\n\n  /**\n   * 解放する。\n   */\n  public release(): void {\n    this._rect = null;\n\n    gl.deleteTexture(this._texture);\n    this._texture = null;\n\n    gl.deleteBuffer(this._uvBuffer);\n    this._uvBuffer = null;\n\n    gl.deleteBuffer(this._vertexBuffer);\n    this._vertexBuffer = null;\n\n    gl.deleteBuffer(this._indexBuffer);\n    this._indexBuffer = null;\n  }\n\n  /**\n   * テクスチャを返す\n   */\n  public getTexture(): WebGLTexture {\n    return this._texture;\n  }\n\n  /**\n   * 描画する。\n   * @param programId シェーダープログラム\n   * @param canvas 描画するキャンパス情報\n   */\n  public render(programId: WebGLProgram): void {\n    if (this._texture == null) {\n      // ロードが完了していない\n      return;\n    }\n\n    // 初回描画時\n    if (this._firstDraw) {\n      // 何番目のattribute変数か取得\n      this._positionLocation = gl.getAttribLocation(programId, 'position');\n      gl.enableVertexAttribArray(this._positionLocation);\n\n      this._uvLocation = gl.getAttribLocation(programId, 'uv');\n      gl.enableVertexAttribArray(this._uvLocation);\n\n      // 何番目のuniform変数か取得\n      this._textureLocation = gl.getUniformLocation(programId, 'texture');\n\n      // uniform属性の登録\n      gl.uniform1i(this._textureLocation, 0);\n\n      // uvバッファ、座標初期化\n      {\n        this._uvArray = new Float32Array([\n          1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0\n        ]);\n\n        // uvバッファを作成\n        this._uvBuffer = gl.createBuffer();\n      }\n\n      // 頂点バッファ、座標初期化\n      {\n        const maxWidth = canvas.width;\n        const maxHeight = canvas.height;\n\n        // 頂点データ\n        this._positionArray = new Float32Array([\n          (this._rect.right - maxWidth * 0.5) / (maxWidth * 0.5),\n          (this._rect.up - maxHeight * 0.5) / (maxHeight * 0.5),\n          (this._rect.left - maxWidth * 0.5) / (maxWidth * 0.5),\n          (this._rect.up - maxHeight * 0.5) / (maxHeight * 0.5),\n          (this._rect.left - maxWidth * 0.5) / (maxWidth * 0.5),\n          (this._rect.down - maxHeight * 0.5) / (maxHeight * 0.5),\n          (this._rect.right - maxWidth * 0.5) / (maxWidth * 0.5),\n          (this._rect.down - maxHeight * 0.5) / (maxHeight * 0.5)\n        ]);\n\n        // 頂点バッファを作成\n        this._vertexBuffer = gl.createBuffer();\n      }\n\n      // 頂点インデックスバッファ、初期化\n      {\n        // インデックスデータ\n        this._indexArray = new Uint16Array([0, 1, 2, 3, 2, 0]);\n\n        // インデックスバッファを作成\n        this._indexBuffer = gl.createBuffer();\n      }\n\n      this._firstDraw = false;\n    }\n\n    // UV座標登録\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._uvBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, this._uvArray, gl.STATIC_DRAW);\n\n    // attribute属性を登録\n    gl.vertexAttribPointer(this._uvLocation, 2, gl.FLOAT, false, 0, 0);\n\n    // 頂点座標を登録\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, this._positionArray, gl.STATIC_DRAW);\n\n    // attribute属性を登録\n    gl.vertexAttribPointer(this._positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n    // 頂点インデックスを作成\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._indexArray, gl.DYNAMIC_DRAW);\n\n    // モデルの描画\n    gl.bindTexture(gl.TEXTURE_2D, this._texture);\n    gl.drawElements(\n      gl.TRIANGLES,\n      this._indexArray.length,\n      gl.UNSIGNED_SHORT,\n      0\n    );\n  }\n\n  /**\n   * 当たり判定\n   * @param pointX x座標\n   * @param pointY y座標\n   */\n  public isHit(pointX: number, pointY: number): boolean {\n    // 画面サイズを取得する。\n    const { height } = canvas;\n\n    // Y座標は変換する必要あり\n    const y = height - pointY;\n\n    return (\n      pointX >= this._rect.left &&\n      pointX <= this._rect.right &&\n      y <= this._rect.up &&\n      y >= this._rect.down\n    );\n  }\n\n  _texture: WebGLTexture; // テクスチャ\n  _vertexBuffer: WebGLBuffer; // 頂点バッファ\n  _uvBuffer: WebGLBuffer; // uv頂点バッファ\n  _indexBuffer: WebGLBuffer; // 頂点インデックスバッファ\n  _rect: Rect; // 矩形\n\n  _positionLocation: number;\n  _uvLocation: number;\n  _textureLocation: WebGLUniformLocation;\n\n  _positionArray: Float32Array;\n  _uvArray: Float32Array;\n  _indexArray: Uint16Array;\n\n  _firstDraw: boolean;\n}\n\nexport class Rect {\n  public left: number; // 左辺\n  public right: number; // 右辺\n  public up: number; // 上辺\n  public down: number; // 下辺\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nexport class TouchManager {\n  /**\n   * コンストラクタ\n   */\n  constructor() {\n    this._startX = 0.0;\n    this._startY = 0.0;\n    this._lastX = 0.0;\n    this._lastY = 0.0;\n    this._lastX1 = 0.0;\n    this._lastY1 = 0.0;\n    this._lastX2 = 0.0;\n    this._lastY2 = 0.0;\n    this._lastTouchDistance = 0.0;\n    this._deltaX = 0.0;\n    this._deltaY = 0.0;\n    this._scale = 1.0;\n    this._touchSingle = false;\n    this._flipAvailable = false;\n  }\n\n  public getCenterX(): number {\n    return this._lastX;\n  }\n\n  public getCenterY(): number {\n    return this._lastY;\n  }\n\n  public getDeltaX(): number {\n    return this._deltaX;\n  }\n\n  public getDeltaY(): number {\n    return this._deltaY;\n  }\n\n  public getStartX(): number {\n    return this._startX;\n  }\n\n  public getStartY(): number {\n    return this._startY;\n  }\n\n  public getScale(): number {\n    return this._scale;\n  }\n\n  public getX(): number {\n    return this._lastX;\n  }\n\n  public getY(): number {\n    return this._lastY;\n  }\n\n  public getX1(): number {\n    return this._lastX1;\n  }\n\n  public getY1(): number {\n    return this._lastY1;\n  }\n\n  public getX2(): number {\n    return this._lastX2;\n  }\n\n  public getY2(): number {\n    return this._lastY2;\n  }\n\n  public isSingleTouch(): boolean {\n    return this._touchSingle;\n  }\n\n  public isFlickAvailable(): boolean {\n    return this._flipAvailable;\n  }\n\n  public disableFlick(): void {\n    this._flipAvailable = false;\n  }\n\n  /**\n   * タッチ開始時イベント\n   * @param deviceX タッチした画面のxの値\n   * @param deviceY タッチした画面のyの値\n   */\n  public touchesBegan(deviceX: number, deviceY: number): void {\n    this._lastX = deviceX;\n    this._lastY = deviceY;\n    this._startX = deviceX;\n    this._startY = deviceY;\n    this._lastTouchDistance = -1.0;\n    this._flipAvailable = true;\n    this._touchSingle = true;\n  }\n\n  /**\n   * ドラッグ時のイベント\n   * @param deviceX タッチした画面のxの値\n   * @param deviceY タッチした画面のyの値\n   */\n  public touchesMoved(deviceX: number, deviceY: number): void {\n    this._lastX = deviceX;\n    this._lastY = deviceY;\n    this._lastTouchDistance = -1.0;\n    this._touchSingle = true;\n  }\n\n  /**\n   * フリックの距離測定\n   * @return フリック距離\n   */\n  public getFlickDistance(): number {\n    return this.calculateDistance(\n      this._startX,\n      this._startY,\n      this._lastX,\n      this._lastY\n    );\n  }\n\n  /**\n   * 点１から点２への距離を求める\n   *\n   * @param x1 １つ目のタッチした画面のxの値\n   * @param y1 １つ目のタッチした画面のyの値\n   * @param x2 ２つ目のタッチした画面のxの値\n   * @param y2 ２つ目のタッチした画面のyの値\n   */\n  public calculateDistance(\n    x1: number,\n    y1: number,\n    x2: number,\n    y2: number\n  ): number {\n    return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));\n  }\n\n  /**\n   * ２つ目の値から、移動量を求める。\n   * 違う方向の場合は移動量０。同じ方向の場合は、絶対値が小さい方の値を参照する。\n   *\n   * @param v1 １つ目の移動量\n   * @param v2 ２つ目の移動量\n   *\n   * @return 小さい方の移動量\n   */\n  public calculateMovingAmount(v1: number, v2: number): number {\n    if (v1 > 0.0 != v2 > 0.0) {\n      return 0.0;\n    }\n\n    const sign: number = v1 > 0.0 ? 1.0 : -1.0;\n    const absoluteValue1 = Math.abs(v1);\n    const absoluteValue2 = Math.abs(v2);\n    return (\n      sign * (absoluteValue1 < absoluteValue2 ? absoluteValue1 : absoluteValue2)\n    );\n  }\n\n  _startY: number; // タッチを開始した時のxの値\n  _startX: number; // タッチを開始した時のyの値\n  _lastX: number; // シングルタッチ時のxの値\n  _lastY: number; // シングルタッチ時のyの値\n  _lastX1: number; // ダブルタッチ時の一つ目のxの値\n  _lastY1: number; // ダブルタッチ時の一つ目のyの値\n  _lastX2: number; // ダブルタッチ時の二つ目のxの値\n  _lastY2: number; // ダブルタッチ時の二つ目のyの値\n  _lastTouchDistance: number; // 2本以上でタッチしたときの指の距離\n  _deltaX: number; // 前回の値から今回の値へのxの移動距離。\n  _deltaY: number; // 前回の値から今回の値へのyの移動距離。\n  _scale: number; // このフレームで掛け合わせる拡大率。拡大操作中以外は1。\n  _touchSingle: boolean; // シングルタッチ時はtrue\n  _flipAvailable: boolean; // フリップが有効かどうか\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismMatrix44 } from '@framework/math/cubismmatrix44';\nimport { CubismViewMatrix } from '@framework/math/cubismviewmatrix';\n\nimport LAppDefine from './lappdefine';\nimport { LAppDelegate } from './lappdelegate';\nimport { canvas, gl } from './lappglmanager';\nimport { LAppLive2DManager } from './lapplive2dmanager';\nimport { LAppPal } from './lapppal';\nimport { LAppSprite } from './lappsprite';\nimport { TextureInfo } from './lapptexturemanager';\nimport { TouchManager } from './touchmanager';\n\n/**\n * 描画クラス。\n */\nexport class LAppView {\n  /**\n   * コンストラクタ\n   */\n  constructor() {\n    this._programId = null;\n    this._back = null;\n\n    // タッチ関係のイベント管理\n    this._touchManager = new TouchManager();\n\n    // デバイス座標からスクリーン座標に変換するための\n    this._deviceToScreen = new CubismMatrix44();\n\n    // 画面の表示の拡大縮小や移動の変換を行う行列\n    this._viewMatrix = new CubismViewMatrix();\n  }\n\n  /**\n   * 初期化する。\n   */\n  public initialize(): void {\n    const { width, height } = canvas;\n\n    const ratio: number = width / height;\n    const left: number = -ratio;\n    const right: number = ratio;\n    const bottom: number = LAppDefine.ViewLogicalLeft;\n    const top: number = LAppDefine.ViewLogicalRight;\n\n    this._viewMatrix.setScreenRect(left, right, bottom, top); // デバイスに対応する画面の範囲。 Xの左端、Xの右端、Yの下端、Yの上端\n    this._viewMatrix.scale(LAppDefine.ViewScale, LAppDefine.ViewScale);\n\n    this._deviceToScreen.loadIdentity();\n    if (width > height) {\n      const screenW: number = Math.abs(right - left);\n      this._deviceToScreen.scaleRelative(screenW / width, -screenW / width);\n    } else {\n      const screenH: number = Math.abs(top - bottom);\n      this._deviceToScreen.scaleRelative(screenH / height, -screenH / height);\n    }\n    this._deviceToScreen.translateRelative(-width * 0.5, -height * 0.5);\n\n    // 表示範囲の設定\n    this._viewMatrix.setMaxScale(LAppDefine.ViewMaxScale); // 限界拡張率\n    this._viewMatrix.setMinScale(LAppDefine.ViewMinScale); // 限界縮小率\n\n    // 表示できる最大範囲\n    this._viewMatrix.setMaxScreenRect(\n      LAppDefine.ViewLogicalMaxLeft,\n      LAppDefine.ViewLogicalMaxRight,\n      LAppDefine.ViewLogicalMaxBottom,\n      LAppDefine.ViewLogicalMaxTop\n    );\n  }\n\n  /**\n   * 解放する\n   */\n  public release(): void {\n    this._viewMatrix = null;\n    this._touchManager = null;\n    this._deviceToScreen = null;\n\n    this._back.release();\n    this._back = null;\n\n    gl.deleteProgram(this._programId);\n    this._programId = null;\n  }\n\n  /**\n   * 描画する。\n   */\n  public render(): void {\n    gl.useProgram(this._programId);\n\n    if (this._back) {\n      this._back.render(this._programId);\n    }\n\n    gl.flush();\n\n    const live2DManager: LAppLive2DManager = LAppLive2DManager.getInstance();\n\n    live2DManager.setViewMatrix(this._viewMatrix);\n\n    live2DManager.onUpdate();\n  }\n\n  /**\n   * 画像の初期化を行う。\n   */\n  public initializeSprite(): void {\n    const width: number = canvas.width;\n    const height: number = canvas.height;\n\n    const textureManager = LAppDelegate.getInstance().getTextureManager();\n    const resourcesPath = LAppDefine.ResourcesPath;\n\n    let imageName = '';\n\n    // 背景画像初期化\n    imageName = LAppDefine.BackImageName;\n\n    // 非同期なのでコールバック関数を作成\n    const initBackGroundTexture = (textureInfo: TextureInfo): void => {\n      const x: number = width * 0.5;\n      const y: number = height * 0.5;\n\n      const fwidth = textureInfo.width * 2.0;\n      const fheight = height * 0.95;\n      this._back = new LAppSprite(x, y, fwidth, fheight, textureInfo.id);\n    };\n\n    textureManager.createTextureFromPngFile(\n      resourcesPath + imageName,\n      false,\n      initBackGroundTexture\n    );\n\n    // シェーダーを作成\n    if (this._programId == null) {\n      this._programId = LAppDelegate.getInstance().createShader();\n    }\n  }\n\n  /**\n   * タッチされた時に呼ばれる。\n   *\n   * @param pointX スクリーンX座標\n   * @param pointY スクリーンY座標\n   */\n  public onTouchesBegan(pointX: number, pointY: number): void {\n    this._touchManager.touchesBegan(\n      pointX * window.devicePixelRatio,\n      pointY * window.devicePixelRatio\n    );\n  }\n\n  /**\n   * タッチしているときにポインタが動いたら呼ばれる。\n   *\n   * @param pointX スクリーンX座標\n   * @param pointY スクリーンY座標\n   * @param model\n   */\n  public onTouchesMoved(pointX: number, pointY: number): void {\n    const viewX: number = this.transformViewX(this._touchManager.getX());111\n    const viewY: number = this.transformViewY(this._touchManager.getY());\n\n    this._touchManager.touchesMoved(\n      pointX * window.devicePixelRatio,\n      pointY * window.devicePixelRatio\n    );\n\n    const live2DManager: LAppLive2DManager = LAppLive2DManager.getInstance();\n    live2DManager.onDrag(viewX, viewY);\n  }\n\n  /**\n   * タッチが終了したら呼ばれる。\n   *\n   * @param pointX スクリーンX座標\n   * @param pointY スクリーンY座標\n   */\n  public onTouchesEnded(pointX: number, pointY: number): void {\n    // タッチ終了\n    const live2DManager: LAppLive2DManager = LAppLive2DManager.getInstance();\n    live2DManager.onDrag(0.0, 0.0);\n\n    {\n      // シングルタップ\n      const x: number = this._deviceToScreen.transformX(\n        this._touchManager.getX()\n      ); // 論理座標変換した座標を取得。\n      const y: number = this._deviceToScreen.transformY(\n        this._touchManager.getY()\n      ); // 論理座標変化した座標を取得。\n\n      if (LAppDefine.DebugTouchLogEnable) {\n        LAppPal.printMessage(`[APP]touchesEnded x: ${x} y: ${y}`);\n      }\n      live2DManager.onTap(x, y);\n    }\n  }\n\n  /**\n   * X座標をView座標に変換する。\n   *\n   * @param deviceX デバイスX座標\n   */\n  public transformViewX(deviceX: number): number {\n    const screenX: number = this._deviceToScreen.transformX(deviceX); // 論理座標変換した座標を取得。\n    return this._viewMatrix.invertTransformX(screenX); // 拡大、縮小、移動後の値。\n  }\n\n  /**\n   * Y座標をView座標に変換する。\n   *\n   * @param deviceY デバイスY座標\n   */\n  public transformViewY(deviceY: number): number {\n    const screenY: number = this._deviceToScreen.transformY(deviceY); // 論理座標変換した座標を取得。\n    return this._viewMatrix.invertTransformY(screenY);\n  }\n\n  /**\n   * X座標をScreen座標に変換する。\n   * @param deviceX デバイスX座標\n   */\n  public transformScreenX(deviceX: number): number {\n    return this._deviceToScreen.transformX(deviceX);\n  }\n\n  /**\n   * Y座標をScreen座標に変換する。\n   *\n   * @param deviceY デバイスY座標\n   */\n  public transformScreenY(deviceY: number): number {\n    return this._deviceToScreen.transformY(deviceY);\n  }\n\n  _touchManager: TouchManager; // タッチマネージャー\n  _deviceToScreen: CubismMatrix44; // デバイスからスクリーンへの行列\n  _viewMatrix: CubismViewMatrix; // viewMatrix\n  _programId: WebGLProgram; // シェーダID\n  _back: LAppSprite; // 背景画像\n  _changeModel: boolean; // モデル切り替えフラグ\n  _isClick: boolean; // クリック中\n}\n","import LAppDefine from \"./lappdefine\";\n\n\nexport let s_instance: LAppMessageBox = null;\nexport let messageBox: HTMLDivElement = null;\n\nexport class LAppMessageBox {\n    public static getInstance(): LAppMessageBox {\n        if (s_instance == null) {\n            s_instance = new LAppMessageBox();\n        }\n\n        return s_instance;\n    }\n\n    public getMessageBox(): HTMLDivElement {\n        if (this._messageBox == null) {\n            this._messageBox = document.querySelector('#'+ LAppDefine.MessageBoxId);\n        }\n        return this._messageBox;\n    }\n\n    public initialize(canvas: HTMLCanvasElement, style: Record<string, any> = {}): boolean {\n        messageBox = document.createElement('div');\n\n        messageBox.id = LAppDefine.MessageBoxId;\n        messageBox.style.position = 'fixed';\n        messageBox.style.padding = '10px';\n        messageBox.style.zIndex = '9999';\n        messageBox.style.display = 'flex';\n        messageBox.style.justifyContent = 'center';\n\n        messageBox.style.width = canvas.width + 'px';\n        messageBox.style.height = '20px';\n        messageBox.style.right = '0';\n        messageBox.style.bottom = canvas.height + 50 + 'px';\n        for (let key in style) {\n            if (!!key && key != \"innerHTML\" && key != \"innerText\") {\n                if (messageBox.style.hasOwnProperty(key)) {\n                    Reflect.set(messageBox.style, key, Reflect.get(style, key));\n                }\n            }\n        }\n        messageBox.innerHTML = '<div class=\"live2dMessageBox-content\"></div>';\n        document.body.appendChild(messageBox);\n\n        const cssText = `#${messageBox.id}.live2dMessageBox-content{background-color:#706561;color:white;padding:10px;height:fit-content;border-radius:.7em;word-break:break-all;border-right:1px solid transparent}#${messageBox.id}.live2dMessageBox-content-hidden{opacity:0;transition:all 0.5s ease-in;-moz-transition:all 0.5s ease-in;-webkit-transition:all 0.5s ease-in}#${messageBox.id}.live2dMessageBox-content-visible{opacity:1;transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-webkit-transition:all 0.5s ease-out}`\n        if (!document.head.querySelector(\"#\"+messageBox.id + \"_css\")) {\n            const styleEl = document.createElement('style')\n            styleEl.id = \"#\"+messageBox.id + \"_css\";\n            styleEl.innerHTML = cssText;\n            document.head.appendChild(styleEl);\n        }\n\n        this.hideMessageBox();\n        return true;\n    }\n\n    public setMessage(message: string, duration: number=null) {\n        const messageBox = this.getMessageBox();\n\n        this.hideMessageBox();\n        messageBox.textContent = message;\n\n        setTimeout(() => {\n            const wrapperDiv: HTMLDivElement = document.querySelector('#' + LAppDefine.MessageBoxId);\n            wrapperDiv.style.bottom = (LAppDefine.CanvasSize === 'auto' ? 500: LAppDefine.CanvasSize.height) + messageBox.offsetHeight - 25 + 'px';\n        }, 10);\n\n        this.revealMessageBox();\n        if (duration != null) {\n            setTimeout(() => {\n                this.hideMessageBox();\n            }, duration);\n        }\n    }\n\n    // 隐藏对话框\n    public hideMessageBox() {\n        const messageBox = this.getMessageBox();\n        messageBox.classList.remove('live2dMessageBox-content-visible');\n        messageBox.classList.add('live2dMessageBox-content-hidden');\n    }\n\n    // 展示对话框\n    public revealMessageBox() {\n        const messageBox = this.getMessageBox();\n        messageBox.classList.remove('live2dMessageBox-content-hidden');\n        messageBox.classList.add('live2dMessageBox-content-visible');\n    }\n\n    _messageBox: HTMLDivElement = null\n}","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { CubismFramework, Option } from '@framework/live2dcubismframework';\n\nimport LAppDefine from './lappdefine';\nimport { LAppLive2DManager } from './lapplive2dmanager';\nimport { LAppPal } from './lapppal';\nimport { LAppTextureManager } from './lapptexturemanager';\nimport { LAppView } from './lappview';\nimport {canvas, gl, LAppGlManager} from './lappglmanager';\nimport {LAppMessageBox} from \"./lappmessagebox\";\n\nexport let s_instance: LAppDelegate = null;\nexport let frameBuffer: WebGLFramebuffer = null;\n\n/**\n * アプリケーションクラス。\n * Cubism SDKの管理を行う。\n */\nexport class LAppDelegate {\n  /**\n   * クラスのインスタンス（シングルトン）を返す。\n   * インスタンスが生成されていない場合は内部でインスタンスを生成する。\n   *\n   * @return クラスのインスタンス\n   */\n  public static getInstance(): LAppDelegate {\n    if (s_instance == null) {\n      s_instance = new LAppDelegate();\n    }\n\n    return s_instance;\n  }\n\n  /**\n   * クラスのインスタンス（シングルトン）を解放する。\n   */\n  public static releaseInstance(): void {\n    if (s_instance != null) {\n      s_instance.release();\n    }\n\n    s_instance = null;\n  }\n\n  /**\n   * APPに必要な物を初期化する。\n   */\n  public initialize(model: string): boolean {\n    // キャンバスを DOM に追加\n    document.body.appendChild(canvas);\n\n    if (LAppDefine.CanvasSize === 'auto') {\n      this._resizeCanvas();\n    } else {\n      canvas.width = LAppDefine.CanvasSize.width;\n      canvas.height = LAppDefine.CanvasSize.height;\n    }\n\n    if (!frameBuffer) {\n      frameBuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);\n    }\n\n    // 透過設定\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n    const supportTouch: boolean = 'ontouchend' in canvas;\n\n    if (supportTouch) {\n      // タッチ関連コールバック関数登録\n      canvas.addEventListener('touchstart', onTouchBegan, { passive: true });\n      canvas.addEventListener('touchmove', onTouchMoved, { passive: true });\n      canvas.addEventListener('touchend', onTouchEnded, { passive: true });\n      canvas.addEventListener('touchcancel', onTouchCancel, { passive: true });\n    } else {\n      // マウス関連コールバック関数登録\n      canvas.addEventListener('mousedown', onClickBegan, { passive: true });\n      canvas.addEventListener('mousemove', onMouseMoved, { passive: true });\n      canvas.addEventListener('mouseup', onClickEnded, { passive: true });\n    }\n\n    // AppViewの初期化\n    this._view.initialize();\n\n    // Cubism SDKの初期化\n    this.initializeCubism(model);\n\n    LAppMessageBox.getInstance().initialize(canvas, LAppDefine.MessageStyle)\n    return true;\n  }\n\n  /**\n   * Resize canvas and re-initialize view.\n   */\n  public onResize(): void {\n    this._resizeCanvas();\n    this._view.initialize();\n    this._view.initializeSprite();\n  }\n\n  /**\n   * 解放する。\n   */\n  public release(): void {\n    this._textureManager.release();\n    this._textureManager = null;\n\n    this._view.release();\n    this._view = null;\n\n    // リソースを解放\n    LAppLive2DManager.releaseInstance();\n\n    // Cubism SDKの解放\n    CubismFramework.dispose();\n\n    // canvas 删除\n    LAppGlManager.releaseInstance();\n  }\n\n  /**\n   * 実行処理。\n   */\n  public run(): void {\n    // メインループ\n    const loop = (): void => {\n      // インスタンスの有無の確認\n      if (s_instance == null) {\n        return;\n      }\n\n      // 時間更新\n      LAppPal.updateTime();\n\n      // 画面の初期化\n      gl.clearColor(0.0, 0.0, 0.0, 1.0);\n\n      // 深度テストを有効化\n      gl.enable(gl.DEPTH_TEST);\n\n      // 近くにある物体は、遠くにある物体を覆い隠す\n      gl.depthFunc(gl.LEQUAL);\n\n      // カラーバッファや深度バッファをクリアする\n      gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n      gl.clearDepth(1.0);\n\n      // 透過設定\n      gl.enable(gl.BLEND);\n      gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n      // 描画更新\n      this._view.render();\n\n      // ループのために再帰呼び出し\n      requestAnimationFrame(loop);\n    };\n    loop();\n  }\n\n  /**\n   * シェーダーを登録する。\n   */\n  public createShader(): WebGLProgram {\n    // バーテックスシェーダーのコンパイル\n    const vertexShaderId = gl.createShader(gl.VERTEX_SHADER);\n\n    if (vertexShaderId == null) {\n      LAppPal.printMessage('failed to create vertexShader');\n      return null;\n    }\n\n    const vertexShader: string =\n      'precision mediump float;' +\n      'attribute vec3 position;' +\n      'attribute vec2 uv;' +\n      'varying vec2 vuv;' +\n      'void main(void)' +\n      '{' +\n      '   gl_Position = vec4(position, 1.0);' +\n      '   vuv = uv;' +\n      '}';\n\n    gl.shaderSource(vertexShaderId, vertexShader);\n    gl.compileShader(vertexShaderId);\n\n    // フラグメントシェーダのコンパイル\n    const fragmentShaderId = gl.createShader(gl.FRAGMENT_SHADER);\n\n    if (fragmentShaderId == null) {\n      LAppPal.printMessage('failed to create fragmentShader');\n      return null;\n    }\n\n    const fragmentShader: string =\n      'precision mediump float;' +\n      'varying vec2 vuv;' +\n      'uniform sampler2D texture;' +\n      'void main(void)' +\n      '{' +\n      '   gl_FragColor = texture2D(texture, vuv);' +\n      '}';\n\n    gl.shaderSource(fragmentShaderId, fragmentShader);\n    gl.compileShader(fragmentShaderId);\n\n    // プログラムオブジェクトの作成\n    const programId = gl.createProgram();\n    gl.attachShader(programId, vertexShaderId);\n    gl.attachShader(programId, fragmentShaderId);\n\n    gl.deleteShader(vertexShaderId);\n    gl.deleteShader(fragmentShaderId);\n\n    // リンク\n    gl.linkProgram(programId);\n\n    gl.useProgram(programId);\n\n    return programId;\n  }\n\n  /**\n   * View情報を取得する。\n   */\n  public getView(): LAppView {\n    return this._view;\n  }\n\n  public getTextureManager(): LAppTextureManager {\n    return this._textureManager;\n  }\n\n  /**\n   * コンストラクタ\n   */\n  constructor() {\n    this._captured = false;\n    this._mouseX = 0.0;\n    this._mouseY = 0.0;\n    this._isEnd = false;\n\n    this._cubismOption = new Option();\n    this._view = new LAppView();\n    this._textureManager = new LAppTextureManager();\n  }\n\n  /**\n   * Cubism SDKの初期化\n   */\n  public initializeCubism(model: string): void {\n    // setup cubism\n    this._cubismOption.logFunction = LAppPal.printMessage;\n    this._cubismOption.loggingLevel = LAppDefine.CubismLoggingLevel;\n    CubismFramework.startUp(this._cubismOption);\n\n    // initialize cubism\n    CubismFramework.initialize();\n\n    // load model\n    LAppLive2DManager.getInstance(model);\n\n    LAppPal.updateTime();\n\n    this._view.initializeSprite();\n  }\n\n  /**\n   * Resize the canvas to fill the screen.\n   */\n  private _resizeCanvas(): void {\n    canvas.width = canvas.clientWidth * window.devicePixelRatio;\n    canvas.height = canvas.clientHeight * window.devicePixelRatio;\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n  }\n\n  _cubismOption: Option; // Cubism SDK Option\n  _view: LAppView; // View情報\n  _captured: boolean; // クリックしているか\n  _mouseX: number; // マウスX座標\n  _mouseY: number; // マウスY座標\n  _isEnd: boolean; // APP終了しているか\n  _textureManager: LAppTextureManager; // テクスチャマネージャー\n}\n\n/**\n * クリックしたときに呼ばれる。\n */\nfunction onClickBegan(e: MouseEvent): void {\n  if (!LAppDelegate.getInstance()._view) {\n    LAppPal.printMessage('view notfound');\n    return;\n  }\n  LAppDelegate.getInstance()._captured = true;\n\n  const posX: number = e.pageX;\n  const posY: number = e.pageY;\n\n  LAppDelegate.getInstance()._view.onTouchesBegan(posX, posY);\n}\n\n/**\n * マウスポインタが動いたら呼ばれる。\n */\nfunction onMouseMoved(e: MouseEvent): void {\n  if (!LAppDelegate.getInstance()._captured) {\n    return;\n  }\n\n  if (!LAppDelegate.getInstance()._view) {\n    LAppPal.printMessage('view notfound');\n    return;\n  }\n\n  const rect = (e.target as Element).getBoundingClientRect();\n  const posX: number = e.clientX - rect.left;\n  const posY: number = e.clientY - rect.top;\n\n  LAppDelegate.getInstance()._view.onTouchesMoved(posX, posY);\n}\n\n/**\n * クリックが終了したら呼ばれる。\n */\nfunction onClickEnded(e: MouseEvent): void {\n  LAppDelegate.getInstance()._captured = false;\n  if (!LAppDelegate.getInstance()._view) {\n    LAppPal.printMessage('view notfound');\n    return;\n  }\n\n  const rect = (e.target as Element).getBoundingClientRect();\n  const posX: number = e.clientX - rect.left;\n  const posY: number = e.clientY - rect.top;\n\n  LAppDelegate.getInstance()._view.onTouchesEnded(posX, posY);\n}\n\n/**\n * タッチしたときに呼ばれる。\n */\nfunction onTouchBegan(e: TouchEvent): void {\n  if (!LAppDelegate.getInstance()._view) {\n    LAppPal.printMessage('view notfound');\n    return;\n  }\n\n  LAppDelegate.getInstance()._captured = true;\n\n  const posX = e.changedTouches[0].pageX;\n  const posY = e.changedTouches[0].pageY;\n\n  LAppDelegate.getInstance()._view.onTouchesBegan(posX, posY);\n}\n\n/**\n * スワイプすると呼ばれる。\n */\nfunction onTouchMoved(e: TouchEvent): void {\n  if (!LAppDelegate.getInstance()._captured) {\n    return;\n  }\n\n  if (!LAppDelegate.getInstance()._view) {\n    LAppPal.printMessage('view notfound');\n    return;\n  }\n\n  const rect = (e.target as Element).getBoundingClientRect();\n\n  const posX = e.changedTouches[0].clientX - rect.left;\n  const posY = e.changedTouches[0].clientY - rect.top;\n\n  LAppDelegate.getInstance()._view.onTouchesMoved(posX, posY);\n}\n\n/**\n * タッチが終了したら呼ばれる。\n */\nfunction onTouchEnded(e: TouchEvent): void {\n  LAppDelegate.getInstance()._captured = false;\n\n  if (!LAppDelegate.getInstance()._view) {\n    LAppPal.printMessage('view notfound');\n    return;\n  }\n\n  const rect = (e.target as Element).getBoundingClientRect();\n\n  const posX = e.changedTouches[0].clientX - rect.left;\n  const posY = e.changedTouches[0].clientY - rect.top;\n\n  LAppDelegate.getInstance()._view.onTouchesEnded(posX, posY);\n}\n\n/**\n * タッチがキャンセルされると呼ばれる。\n */\nfunction onTouchCancel(e: TouchEvent): void {\n  LAppDelegate.getInstance()._captured = false;\n\n  if (!LAppDelegate.getInstance()._view) {\n    LAppPal.printMessage('view notfound');\n    return;\n  }\n\n  const rect = (e.target as Element).getBoundingClientRect();\n\n  const posX = e.changedTouches[0].clientX - rect.left;\n  const posY = e.changedTouches[0].clientY - rect.top;\n\n  LAppDelegate.getInstance()._view.onTouchesEnded(posX, posY);\n}\n","/**\n * Copyright(c) Live2D Inc. All rights reserved.\n *\n * Use of this source code is governed by the Live2D Open Software license\n * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.\n */\n\nimport { LAppDelegate } from './lappdelegate';\nimport LAppDefine from './lappdefine';\nimport { LAppGlManager } from './lappglmanager';\nimport {LAppLive2DManager} from \"./lapplive2dmanager\";\nimport {LAppMessageBox} from \"./lappmessagebox\";\n\n/**\n * 終了時の処理\n */\nwindow.addEventListener(\n    'beforeunload',\n    (): void => LAppDelegate.releaseInstance(),\n    { passive: true }\n);\n\n/**\n * Process when changing screen size.\n */\nwindow.addEventListener(\n    'resize',\n    () => {\n        if (LAppDefine.CanvasSize === 'auto') {\n            LAppDelegate.getInstance().onResize();\n        }\n    },\n    { passive: true }\n);\n\n// 启动入口\nfunction launchLive2d(config: Live2dConfig) {\n    // Initialize WebGL and create the application instance\n    const keys = Object.keys(config);\n    for (const key of keys) {\n        if (!!key) {\n            if (LAppDefine.hasOwnProperty(key)) {\n                Reflect.set(LAppDefine, key, Reflect.get(config, key));\n            }\n        }\n    }\n\n    if (\n        !LAppGlManager.getInstance() ||\n        !LAppDelegate.getInstance().initialize(config.Model)\n    ) {\n        return;\n    }\n\n    LAppDelegate.getInstance().run();\n}\n\n// 修改画板\nfunction changeScene(model: string) {\n    var instance = LAppLive2DManager.getInstance(model, false);\n    if (!!instance) {\n        instance.changeScene(model);\n    }\n}\n\n// 清除实例\nfunction releaseInstance() {\n    LAppDelegate.releaseInstance()\n}\n\n// 执行动作\nfunction setExpression(model: string, expressionId: string): void {\n    const instance = LAppLive2DManager.getInstance(model, false);\n    if (!instance) {\n        return\n    }\n\n    const laModel = instance.getModel(model);\n    if (!!laModel) {\n        laModel.setExpression(expressionId);\n    }\n}\n\n// 获取所有动作\nfunction getAllExpression(model: string): string[] {\n    const result: string[] = []\n    const instance = LAppLive2DManager.getInstance(model, false);\n    if (!instance) {\n        return result\n    }\n\n    const laModel = instance.getModel(model);\n    const size = laModel._expressions.getSize();\n    for (let i = 0; i < size; i++) {\n        const key = laModel._expressions._keyValues[i].first\n        result.push(key)\n    }\n\n    return result\n}\n\n// 随机动作\nfunction setRandomExpression(model: string): void {\n    const instance = LAppLive2DManager.getInstance(model, false);\n    if (!instance) {\n        return\n    }\n\n    const laModel = instance.getModel(model);\n    if (!!laModel) {\n        laModel.setRandomExpression();\n    }\n}\n\n// 嘴巴动画\nfunction mouthMotions(model: string, pathOrBuffer: string | ArrayBuffer, voiceWeight: number = 0.8): void {\n    const instance = LAppLive2DManager.getInstance(model, false);\n    if (!instance) {\n        return\n    }\n\n    const laModel = instance.getModel(model);\n    if (!!laModel) {\n        laModel.mouthMotions(pathOrBuffer, voiceWeight)\n    }\n}\n\n// 加载文件\nfunction loadVoice(model: string, path: string): Promise<ArrayBuffer> {\n    const instance = LAppLive2DManager.getInstance(model, false);\n    if (!instance) {\n        return Promise.reject(new Error('No instance'));\n    }\n\n    const laModel = instance.getModel(model);\n    if (!!laModel) {\n        return laModel.loadVoice(path)\n    }\n\n    return Promise.reject(new Error('No laModel'));\n}\n\nfunction setMessageBox(message: string, duration: number) {\n    const messageBox = LAppMessageBox.getInstance();\n    messageBox.setMessage(message, duration);\n}\n\nfunction hideMessageBox() {\n    const messageBox = LAppMessageBox.getInstance();\n    messageBox.hideMessageBox();\n}\n\nfunction revealMessageBox() {\n    const messageBox = LAppMessageBox.getInstance();\n    messageBox.revealMessageBox();\n}\n\nconst Live2d = {\n    launchLive2d,\n    changeScene,\n    releaseInstance,\n    setExpression,\n    setRandomExpression,\n    getAllExpression,\n    mouthMotions,\n    loadVoice,\n    setMessageBox,\n    hideMessageBox,\n    revealMessageBox,\n}\n\nif (typeof window !== 'undefined') {\n    (window as any).Live2d = Live2d;\n}\n\nexport default Live2d"],"names":["_csmVector","initialCapacity","index","value","offset","ret","newSize","i","callPlacementNew","sub","position","begin","end","dstSi","srcSi","srcEi","addCount","addSize","ite","iterator","newVector","csmVector","iterator$1","v","Live2DCubismFramework","$.csmVector","$.iterator","csmString","c","length","s","$.csmString","CubismId","id","$.CubismId","CubismIdManager","ids","result","$.CubismIdManager","CubismMatrix44","a","b","dst","n","j","k","tr","src","x","y","tr1","m","cloneMatrix","$.CubismMatrix44","csmRect","w","h","r","$.csmRect","CubismRenderer","renderer","model","matrix44","red","green","blue","alpha","opacity","modelColorRGBA","enable","culling","high","CubismTextureColor","CubismBlendMode","g","CubismClippingContext","clippingDrawableIndices","clipCount","drawableIndex","$.CubismBlendMode","$.CubismRenderer","$.CubismTextureColor","CubismLogPrint","level","fmt","args","CubismDebug","CubismLogPrintIn","CSM_ASSERT","expr","CubismLogDebug","CubismLogInfo","CubismLogWarning","CubismLogError","LogLevel","logLevel","format","CubismFramework","logPrint","buffer","data","$.CubismDebug","csmPair","key","_csmMap","size","found","fitToSize","csmMap","idx","iteold","$.csmMap","$.csmPair","CubismJsonExtension","obj","map","convValue","JsonBoolean","JsonString","JsonFloat","JsonMap","JsonNullvalue","arr","JsonArray","CSM_JSON_ERROR_TYPE_MISMATCH","CSM_JSON_ERROR_INDEX_OF_BOUNDS","Value$2","Value","defaultValue","indent","errorStr","JsonError","CubismJson","json","instance","uint8Array","str","len","parseCallback","endPos","decodeBuffer","strbuf","outEndPos","o","f","afterString","strtod","string","c2","bufStart","localRetEndPos2","ok","FOR_LOOP","FOR_LOOP2","FOR_LOOP3","localRetEndpos2","isStatic","stringBuffer","iter","$.CubismJson","$.JsonArray","$.JsonBoolean","$.JsonError","$.JsonFloat","$.JsonMap","$.JsonNullvalue","$.JsonString","$.Value","endPtr","testC","test","number","d","s_isStarted","s_isInitialized","s_option","s_cubismIdManager","Constant","csmDelete","address","option","version","major","minor","patch","versionNumber","memorySize","message","Option","LogLevel2","$.Constant","$.csmDelete","$.CubismFramework","config","canvas","gl","s_instance","LAppGlManager","create","CubismDefaultParameterId","$.CubismDefaultParameterId","ICubismModelSetting","$.ICubismModelSetting","FileReferences","Groups","Layout","HitAreas","Moc","Textures","Physics","Pose","Expressions","Motions","UserData","Name","FilePath","Id","Ids","SoundPath","FadeInTime","FadeOutTime","LipSync","EyeBlink","CubismModelSettingJson","pathArray","arrayLength","textureDirectoryStr","groupName","outLayoutMap","num","refI","node","$.CubismModelSettingJson","CubismBreath","breathParameters","deltaTimeSeconds","t","BreathParameterData","parameterId","peak","cycle","weight","$.BreathParameterData","$.CubismBreath","_CubismEyeBlink","modelSetting","eyeBlink","blinkingInterval","closing","closed","opening","parameterIds","parameterValue","CubismEyeBlink","EyeState","EyeState2","$.CubismEyeBlink","$.EyeState","Epsilon","DefaultFadeInSeconds","FadeIn","Link","CubismPose","pose3json","root","poseListInfo","poseCount","poseIndex","idListInfo","idCount","groupCount","groupIndex","partInfo","partData","PartData","linkListInfo","linkCount","linkIndex","linkPart","linkId","pose","beginIndex","partGroupCount","partsIndex","paramIndex","partIndex","linkPartIndex","visiblePartIndex","newOpacity","phi","backOpacityThreshold","a1","clonePartData","$.CubismPose","$.PartData","CubismModelMatrix","scaleX","scaleY","layout","keyWidth","keyHeight","keyX","keyY","keyCenterX","keyCenterY","keyTop","keyBottom","keyLeft","keyRight","$.CubismModelMatrix","CubismVector2","vector2","scalar","rhs","$.CubismVector2","_CubismMath","min","max","cx","isNegativeNumber","left","right","degrees","radian","from","to","q1","q2","degree","totalAngle","ba","ca","da","p","p3","q","discriminant","center","threshold","mp3","mp33","cosphi","t1","root1","root2","root3","u1","sd","v1","dividend","divisor","absDividend","absDivisor","CubismMath","$.CubismMath","FrameRate","CubismTargetPoint","maxV","deltaTimeWeight","frameToMaxSpeed","maxA","dx","dy","vx","vy","ax","ay","curV","$.CubismTargetPoint","ACubismMotion","onFinishedMotionHandler","motion","motionQueueEntry","userTimeSeconds","fadeWeight","duration","fadeIn","fadeOut","fadeInSeconds","fadeOutSeconds","offsetSeconds","beforeCheckTimeSeconds","motionTimeSeconds","$.ACubismMotion","ExpressionKeyFadeIn","ExpressionKeyFadeOut","ExpressionKeyParameters","ExpressionKeyId","ExpressionKeyValue","ExpressionKeyBlend","BlendValueAdd","BlendValueMultiply","BlendValueOverwrite","DefaultFadeTime","_CubismExpressionMotion","expression","parameter","expressionParameterValues","expressionIndex","expressionParameterValue","currentParameterValue","expressionParameters","parameterIndex","newAdditiveValue","newMultiplyValue","newOverwriteValue","parameterCount","param","blendType","item","ExpressionParameter","source","destination","CubismExpressionMotion","ExpressionBlendType","$.CubismExpressionMotion","$.ExpressionBlendType","$.ExpressionParameter","CubismMotionQueueEntry","newEndTimeSeconds","startTime","endTime","timeSeconds","checkSeconds","$.CubismMotionQueueEntry","CubismMotionQueueManager","autoDelete","InvalidMotionQueueEntryHandleValue","motionQueueEntryNumber","callback","customData","updated","firedList","$.CubismMotionQueueManager","$.InvalidMotionQueueEntryHandleValue","ExpressionParameterValue","CubismExpressionMotionManager","priority","motions","expressionWeight","expressionMotion","$.CubismExpressionMotionManager","CubismMotionCurveTarget","CubismMotionCurveTarget2","CubismMotionSegmentType","CubismMotionPoint","CubismMotionSegment","CubismMotionCurve","CubismMotionEvent","CubismMotionData","$.CubismMotionCurve","$.CubismMotionCurveTarget","$.CubismMotionData","$.CubismMotionEvent","$.CubismMotionPoint","$.CubismMotionSegment","$.CubismMotionSegmentType","Meta","Duration","Loop","AreBeziersRestricted","CurveCount","Fps","TotalSegmentCount","TotalPointCount","Curves","Target","Segments","UserDataCount","TotalUserDataSize","Time","CubismMotionJson","flagType","curveIndex","segmentIndex","userDataIndex","EvaluationOptionFlag","$.CubismMotionJson","EffectNameEyeBlink","EffectNameLipSync","TargetNameModel","TargetNameParameter","TargetNamePartOpacity","IdNameOpacity","UseOldBeziersCurveMotion","lerpPoints","linearEvaluate","points","time","bezierEvaluate","p01","p12","p23","p012","p123","bezierEvaluateCardanoInterpretation","x1","x2","cx1","cx2","steppedEvaluate","inverseSteppedEvaluate","evaluateCurve","motionData","curve","target","totalSegmentCount","pointPosition","segment","CubismMotion","timeOffsetSeconds","lipSyncValue","eyeBlinkValue","maxTargetSize","lipSyncFlags","eyeBlinkFlags","tmpFadeIn","tmpFadeOut","curves","sourceValue","fin","fout","paramWeight","loop","loopFadeIn","eyeBlinkParameterIds","lipSyncParameterIds","motionJson","areBeziersRestructed","totalPointCount","curveCount","segmentPosition","userdatacount","u","$.CubismMotion","CubismMotionManager","val","$.CubismMotionManager","CubismPhysicsTargetType","CubismPhysicsTargetType2","CubismPhysicsSource","CubismPhysicsSource2","PhysicsJsonEffectiveForces","CubismPhysicsParameter","CubismPhysicsNormalization","CubismPhysicsParticle","CubismPhysicsSubRig","CubismPhysicsInput","CubismPhysicsOutput","CubismPhysicsRig","$.CubismPhysicsInput","$.CubismPhysicsNormalization","$.CubismPhysicsOutput","$.CubismPhysicsParameter","$.CubismPhysicsParticle","$.CubismPhysicsRig","$.CubismPhysicsSource","$.CubismPhysicsSubRig","$.CubismPhysicsTargetType","$.PhysicsJsonEffectiveForces","Position","X","Y","Angle","Type","EffectiveForces","TotalInputCount","TotalOutputCount","PhysicsSettingCount","Gravity","Wind","VertexCount","PhysicsSettings","Normalization","Minimum","Maximum","Default","Reflect","Weight","Input","Source","Output","Scale","VertexIndex","Destination","Vertices","Mobility","Delay","Radius","Acceleration","CubismPhysicsJson","physicsSettingIndex","inputIndex","outputIndex","vertexIndex","$.CubismPhysicsJson","PhysicsTypeTagX","PhysicsTypeTagY","PhysicsTypeTagAngle","AirResistance","MaximumWeight","MovementThreshold","MaxDeltaTime","CubismPhysics","physics","physicsJson","particleIndex","getInputTranslationXFromNormalizedParameterValue","getInputTranslationYFromNormalizedParamterValue","getInputAngleFromNormalizedParameterValue","currentRigOutput","PhysicsOutput","previousRigOutput","getOutputTranslationX","getOutputScaleTranslationX","getOutputTranslationY","getOutputScaleTranslationY","getOutputAngle","getOutputScaleAngle","radAngle","outputValue","totalTranslation","currentSetting","currentInputs","currentOutputs","currentParticles","parameterValues","parameterMaximumValues","parameterMinimumValues","parameterDefaultValues","_a","_b","settingIndex","updateParticlesForStabilization","translation","destinationParameterIndex","outParameterCaches","updateOutputParameterValue","outParamIndex","physicsDeltaTime","inputWeight","updateParticles","outParameterValues","options","Options","strand","radius","sign","targetTranslation","targetAngle","parameterMinimumValue","parameterMaximumValue","parameterDefaultValue","normalizationPosition","normalizationAngle","isInverted","normalizeParameterValue","normalizaitionPosition","particles","parentGravity","getRangeValue","maxValue","minValue","getDefaultValue","translationScale","angleScale","strandCount","windDirection","thresholdValue","airResistance","delay","direction","velocity","force","newDirection","totalRadian","currentGravity","parameterValueMinimum","parameterValueMaximum","output","outputScale","parameterMinimum","parameterMaximum","parameterDefault","normalizedMinimum","normalizedMaximum","normalizedDefault","minNormValue","maxNormValue","middleNormValue","middleValue","paramValue","nLength","pLength","$.CubismPhysics","$.Options","ColorChannelCount","ClippingMaskMaxCountOnDefault","ClippingMaskMaxCountOnMultiRenderTexture","CubismClippingManager","clippingContextFactory","tmp","renderTextureCount","clippingContext","drawableMasks","drawableMaskCounts","count","sameCount","clipId","isRightHanded","usingClipCount","clipIndex","cc","clipContext","allClippedDrawRect","layoutBoundsOnTex01","margin","ppu","maskPixelSize","physicalMaskWidth","physicalMaskHeight","useClippingMaskMaxCount","layoutCountMaxValue","countPerSheetDiv","reduceLayoutTextureCount","divCount","modCount","curClipIndex","renderTextureIndex","channelIndex","layoutCount","checkChannelIndex","xpos","ypos","clippedDrawTotalMinX","clippedDrawTotalMinY","clippedDrawTotalMaxX","clippedDrawTotalMaxY","clippedDrawCount","clippedDrawableIndex","drawableVertexCount","drawableVertexes","minX","minY","maxX","maxY","pi","channelNo","ShaderCount","CubismShader_WebGL","srcColor","dstColor","srcAlpha","dstAlpha","masked","invertedMask","shaderSet","vertexArray","uvArray","tex","colorChannel","textureNo","textureId","matrix4x4","baseColor","multiplyColor","screenColor","indexArray","rect","CubismShaderSet","vertexShaderSrcSetupMask","fragmentShaderSrcsetupMask","vertexShaderSrc","fragmentShaderSrcPremultipliedAlpha","vertexShaderSrcMasked","fragmentShaderSrcMaskPremultipliedAlpha","fragmentShaderSrcMaskInvertedPremultipliedAlpha","vertexShaderSource","fragmentShaderSource","shaderProgram","vertShader","fragShader","shaderType","shaderSource","shader","log","ShaderNames","ShaderNames2","$.CubismShaderSet","$.CubismShader_WebGL","$.ShaderNames","s_viewport","s_fbo","CubismClippingManager_WebGL","CubismRenderTextureResource","CubismClippingContext_WebGL","allClipedDrawRect","clipContextRenderTexture","clipDrawCount","clipDrawIndex","frameNo","texture","manager","CubismRendererProfile_WebGL","enabled","CubismRenderer_WebGL","maskBufferCount","modelTextureNo","glTexture","drawableCount","renderOrder","order","indexCount","fbo","viewport","clip","$.CubismClippingContext_WebGL","$.CubismClippingManager_WebGL","$.CubismRenderTextureResource","$.CubismRenderer_WebGL","DrawableColorData","isOverwritten","color","PartColorData","DrawableCullingData","isCulling","CubismModel","savedParameterCount","partColors","drawableColors","drawableindex","constantFlags","isOverwrittenCullings","partId","partCount","drawableId","dynamicFlags","multiplyColors","screenColors","partIds","drawableIds","userCulling","userMultiplyColor","userScreenColor","parentIndex","$.CubismModel","CubismMoc","mocBytes","shouldCheckMocConsistency","cubismMoc","moc","cubismModel","$.CubismMoc","CubismModelUserDataJson","$.CubismModelUserDataJson","ArtMesh","CubismModelUserDataNode","CubismModelUserData","modelUserData","typeOfArtMesh","nodeCount","addNode","$.CubismModelUserData","$.CubismModelUserDataNode","CubismUserModel","z","name","pointX","pointY","drawIndex","vertices","top","bottom","tx","ty","eventValue","caller","$.CubismUserModel","_LAppPal","filePath","response","arrayBuffer","LAppPal","LAppWavFileHandler","WavFileInfo","ByteReader","goalOffset","rms","channelCount","sampleCount","pcm","res","initVoice","resolveValue","asyncFileLoad","responce","fileBytes","dataBytes","fmtChunkSize","dataChunkSize","e","pcm32","usechannel","reference","getSignature","referenceString","signatureOffset","LAppModel","dir","fileName","setting","error","modelFileName","loadCubismExpression","expressionName","expressionFileName","loadCubismPhysics","physicsFileName","loadCubismPose","poseFileName","setupEyeBlink","setupBreath","loadUserData","userDataFile","setupEyeBlinkIds","eyeBlinkIdCount","setupLipSyncIds","lipSyncIdCount","setupLayout","loadCubismMotion","group","motionGroupCount","textureCount","modelTextureNumber","texturePath","onLoad","textureInfo","LAppDelegate","motionUpdated","LAppDefine","pathOrBuffer","voiceWeight","path","no","motionFileName","fadeTime","voice","expressionId","hitArenaName","drawId","tmpMotion","frameBuffer","matrix","LAppLive2DManager","self","pos","width","height","modelCount","projection","modelPath","modelJsonName","LAppTextureManager","usePremultiply","img","TextureInfo","CubismViewMatrix","cy","scale","maxScale","minScale","targetScale","tr2","tr3","$.CubismViewMatrix","LAppSprite","Rect","programId","maxWidth","maxHeight","TouchManager","deviceX","deviceY","y1","y2","v2","absoluteValue1","absoluteValue2","LAppView","ratio","screenW","screenH","live2DManager","textureManager","resourcesPath","imageName","initBackGroundTexture","fwidth","fheight","viewX","viewY","screenX","screenY","messageBox","LAppMessageBox","style","cssText","styleEl","wrapperDiv","onTouchBegan","onTouchMoved","onTouchEnded","onTouchCancel","onClickBegan","onMouseMoved","onClickEnded","vertexShaderId","fragmentShaderId","posX","posY","launchLive2d","keys","changeScene","releaseInstance","setExpression","laModel","getAllExpression","setRandomExpression","mouthMotions","loadVoice","setMessageBox","hideMessageBox","revealMessageBox","Live2d"],"mappings":"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"}