{"version":3,"file":"MMDExporter.cjs","sources":["../../src/exporters/MMDExporter.ts"],"sourcesContent":["import { Matrix4, Quaternion, Vector3, Bone, SkinnedMesh } from 'three'\n// @ts-ignore\nimport { CharsetEncoder } from '../libs/mmdparser'\n\n/**\n * Dependencies\n *  - mmd-parser https://github.com/takahirox/mmd-parser\n */\n\nclass MMDExporter {\n  /* TODO: implement\n\t// mesh -> pmd\n\tthis.parsePmd = function ( object ) {\n\t};\n\t*/\n\n  /* TODO: implement\n\t// mesh -> pmx\n\tthis.parsePmx = function ( object ) {\n\t};\n\t*/\n\n  /* TODO: implement\n\t// animation + skeleton -> vmd\n\tthis.parseVmd = function ( object ) {\n\t};\n\t*/\n\n  /*\n   * skeleton -> vpd\n   * Returns Shift_JIS encoded Uint8Array. Otherwise return strings.\n   */\n  public parseVpd(skin: SkinnedMesh, outputShiftJis: boolean, useOriginalBones: boolean): Uint8Array | string | null {\n    if (skin.isSkinnedMesh !== true) {\n      console.warn('THREE.MMDExporter: parseVpd() requires SkinnedMesh instance.')\n      return null\n    }\n\n    function toStringsFromNumber(num: number): string {\n      if (Math.abs(num) < 1e-6) num = 0\n\n      let a = num.toString()\n\n      if (a.indexOf('.') === -1) {\n        a += '.'\n      }\n\n      a += '000000'\n\n      const index = a.indexOf('.')\n\n      const d = a.slice(0, index)\n      const p = a.slice(index + 1, index + 7)\n\n      return d + '.' + p\n    }\n\n    function toStringsFromArray(array: number[]): string {\n      const a = []\n\n      for (let i = 0, il = array.length; i < il; i++) {\n        a.push(toStringsFromNumber(array[i]))\n      }\n\n      return a.join(',')\n    }\n\n    skin.updateMatrixWorld(true)\n\n    const bones = skin.skeleton.bones\n    const bones2 = this.getBindBones(skin)\n\n    const position = new Vector3()\n    const quaternion = new Quaternion()\n    const quaternion2 = new Quaternion()\n    const matrix = new Matrix4()\n\n    const array = []\n    array.push('Vocaloid Pose Data file')\n    array.push('')\n    array.push((skin.name !== '' ? skin.name.replace(/\\s/g, '_') : 'skin') + '.osm;')\n    array.push(bones.length + ';')\n    array.push('')\n\n    for (let i = 0, il = bones.length; i < il; i++) {\n      const bone = bones[i]\n      const bone2 = bones2[i]\n\n      /*\n       * use the bone matrix saved before solving IK.\n       * see CCDIKSolver for the detail.\n       */\n      if (\n        useOriginalBones === true &&\n        bone.userData.ik !== undefined &&\n        bone.userData.ik.originalMatrix !== undefined\n      ) {\n        matrix.fromArray(bone.userData.ik.originalMatrix)\n      } else {\n        matrix.copy(bone.matrix)\n      }\n\n      position.setFromMatrixPosition(matrix)\n      quaternion.setFromRotationMatrix(matrix)\n\n      const pArray = position.sub(bone2.position).toArray()\n      const qArray = quaternion2.copy(bone2.quaternion).conjugate().multiply(quaternion).toArray()\n\n      // right to left\n      pArray[2] = -pArray[2]\n      qArray[0] = -qArray[0]\n      qArray[1] = -qArray[1]\n\n      array.push('Bone' + i + '{' + bone.name)\n      array.push('  ' + toStringsFromArray(pArray) + ';')\n      array.push('  ' + toStringsFromArray(qArray) + ';')\n      array.push('}')\n      array.push('')\n    }\n\n    array.push('')\n\n    const lines = array.join('\\n')\n\n    return outputShiftJis === true ? this.unicodeToShiftjis(lines) : lines\n  }\n\n  // Unicode to Shift_JIS table\n  private u2sTable: { [key: string]: number | undefined } | undefined\n\n  private unicodeToShiftjis(str: string): Uint8Array {\n    if (this.u2sTable === undefined) {\n      const encoder = new CharsetEncoder()\n      const table = encoder.s2uTable\n      this.u2sTable = {}\n\n      const keys = Object.keys(table)\n\n      for (let i = 0, il = keys.length; i < il; i++) {\n        let key = keys[i]\n\n        const value = table[key]\n\n        this.u2sTable[value] = parseInt(key)\n      }\n    }\n\n    const array = []\n\n    for (let i = 0, il = str.length; i < il; i++) {\n      const code = str.charCodeAt(i)\n\n      const value = this.u2sTable[code]\n\n      if (value === undefined) {\n        throw 'cannot convert charcode 0x' + code.toString(16)\n      } else if (value > 0xff) {\n        array.push((value >> 8) & 0xff)\n        array.push(value & 0xff)\n      } else {\n        array.push(value & 0xff)\n      }\n    }\n\n    return new Uint8Array(array)\n  }\n\n  private getBindBones(skin: SkinnedMesh): Bone[] {\n    // any more efficient ways?\n    const poseSkin = skin.clone()\n    poseSkin.pose()\n    return poseSkin.skeleton.bones\n  }\n}\n\nexport { MMDExporter }\n"],"names":["array","Vector3","Quaternion","Matrix4","CharsetEncoder"],"mappings":";;;;;;;;;;AASA,MAAM,YAAY;AAAA,EAAlB;AAuHU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAhGD,SAAS,MAAmB,gBAAyB,kBAAuD;AAC7G,QAAA,KAAK,kBAAkB,MAAM;AAC/B,cAAQ,KAAK,8DAA8D;AACpE,aAAA;AAAA,IACT;AAEA,aAAS,oBAAoB,KAAqB;AAC5C,UAAA,KAAK,IAAI,GAAG,IAAI;AAAY,cAAA;AAE5B,UAAA,IAAI,IAAI;AAEZ,UAAI,EAAE,QAAQ,GAAG,MAAM,IAAI;AACpB,aAAA;AAAA,MACP;AAEK,WAAA;AAEC,YAAA,QAAQ,EAAE,QAAQ,GAAG;AAE3B,YAAM,IAAI,EAAE,MAAM,GAAG,KAAK;AAC1B,YAAM,IAAI,EAAE,MAAM,QAAQ,GAAG,QAAQ,CAAC;AAEtC,aAAO,IAAI,MAAM;AAAA,IACnB;AAEA,aAAS,mBAAmBA,QAAyB;AACnD,YAAM,IAAI,CAAA;AAEV,eAAS,IAAI,GAAG,KAAKA,OAAM,QAAQ,IAAI,IAAI,KAAK;AAC9C,UAAE,KAAK,oBAAoBA,OAAM,CAAC,CAAC,CAAC;AAAA,MACtC;AAEO,aAAA,EAAE,KAAK,GAAG;AAAA,IACnB;AAEA,SAAK,kBAAkB,IAAI;AAErB,UAAA,QAAQ,KAAK,SAAS;AACtB,UAAA,SAAS,KAAK,aAAa,IAAI;AAE/B,UAAA,WAAW,IAAIC,MAAAA;AACf,UAAA,aAAa,IAAIC,MAAAA;AACjB,UAAA,cAAc,IAAIA,MAAAA;AAClB,UAAA,SAAS,IAAIC,MAAAA;AAEnB,UAAM,QAAQ,CAAA;AACd,UAAM,KAAK,yBAAyB;AACpC,UAAM,KAAK,EAAE;AACP,UAAA,MAAM,KAAK,SAAS,KAAK,KAAK,KAAK,QAAQ,OAAO,GAAG,IAAI,UAAU,OAAO;AAC1E,UAAA,KAAK,MAAM,SAAS,GAAG;AAC7B,UAAM,KAAK,EAAE;AAEb,aAAS,IAAI,GAAG,KAAK,MAAM,QAAQ,IAAI,IAAI,KAAK;AACxC,YAAA,OAAO,MAAM,CAAC;AACd,YAAA,QAAQ,OAAO,CAAC;AAOpB,UAAA,qBAAqB,QACrB,KAAK,SAAS,OAAO,UACrB,KAAK,SAAS,GAAG,mBAAmB,QACpC;AACA,eAAO,UAAU,KAAK,SAAS,GAAG,cAAc;AAAA,MAAA,OAC3C;AACE,eAAA,KAAK,KAAK,MAAM;AAAA,MACzB;AAEA,eAAS,sBAAsB,MAAM;AACrC,iBAAW,sBAAsB,MAAM;AAEvC,YAAM,SAAS,SAAS,IAAI,MAAM,QAAQ,EAAE;AACtC,YAAA,SAAS,YAAY,KAAK,MAAM,UAAU,EAAE,UAAA,EAAY,SAAS,UAAU,EAAE,QAAQ;AAG3F,aAAO,CAAC,IAAI,CAAC,OAAO,CAAC;AACrB,aAAO,CAAC,IAAI,CAAC,OAAO,CAAC;AACrB,aAAO,CAAC,IAAI,CAAC,OAAO,CAAC;AAErB,YAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;AACvC,YAAM,KAAK,OAAO,mBAAmB,MAAM,IAAI,GAAG;AAClD,YAAM,KAAK,OAAO,mBAAmB,MAAM,IAAI,GAAG;AAClD,YAAM,KAAK,GAAG;AACd,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,UAAM,KAAK,EAAE;AAEP,UAAA,QAAQ,MAAM,KAAK,IAAI;AAE7B,WAAO,mBAAmB,OAAO,KAAK,kBAAkB,KAAK,IAAI;AAAA,EACnE;AAAA,EAKQ,kBAAkB,KAAyB;AAC7C,QAAA,KAAK,aAAa,QAAW;AACzB,YAAA,UAAU,IAAIC,UAAAA;AACpB,YAAM,QAAQ,QAAQ;AACtB,WAAK,WAAW;AAEV,YAAA,OAAO,OAAO,KAAK,KAAK;AAE9B,eAAS,IAAI,GAAG,KAAK,KAAK,QAAQ,IAAI,IAAI,KAAK;AACzC,YAAA,MAAM,KAAK,CAAC;AAEV,cAAA,QAAQ,MAAM,GAAG;AAEvB,aAAK,SAAS,KAAK,IAAI,SAAS,GAAG;AAAA,MACrC;AAAA,IACF;AAEA,UAAM,QAAQ,CAAA;AAEd,aAAS,IAAI,GAAG,KAAK,IAAI,QAAQ,IAAI,IAAI,KAAK;AACtC,YAAA,OAAO,IAAI,WAAW,CAAC;AAEvB,YAAA,QAAQ,KAAK,SAAS,IAAI;AAEhC,UAAI,UAAU,QAAW;AACjB,cAAA,+BAA+B,KAAK,SAAS,EAAE;AAAA,MAAA,WAC5C,QAAQ,KAAM;AACjB,cAAA,KAAM,SAAS,IAAK,GAAI;AACxB,cAAA,KAAK,QAAQ,GAAI;AAAA,MAAA,OAClB;AACC,cAAA,KAAK,QAAQ,GAAI;AAAA,MACzB;AAAA,IACF;AAEO,WAAA,IAAI,WAAW,KAAK;AAAA,EAC7B;AAAA,EAEQ,aAAa,MAA2B;AAExC,UAAA,WAAW,KAAK;AACtB,aAAS,KAAK;AACd,WAAO,SAAS,SAAS;AAAA,EAC3B;AACF;;"}