diff --git a/_ts_packages/package-lock.json b/_ts_packages/package-lock.json index 3df3942..2797560 100644 --- a/_ts_packages/package-lock.json +++ b/_ts_packages/package-lock.json @@ -761,6 +761,150 @@ } } }, + "node_modules/@pixi/color": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/color/-/color-7.4.3.tgz", + "integrity": "sha512-a6R+bXKeXMDcRmjYQoBIK+v2EYqxSX49wcjAY579EYM/WrFKS98nSees6lqVUcLKrcQh2DT9srJHX7XMny3voQ==", + "license": "MIT", + "dependencies": { + "@pixi/colord": "^2.9.6" + } + }, + "node_modules/@pixi/colord": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@pixi/colord/-/colord-2.9.6.tgz", + "integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==", + "license": "MIT" + }, + "node_modules/@pixi/constants": { + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-6.5.10.tgz", + "integrity": "sha512-PUF2Y9YISRu5eVrVVHhHCWpc/KmxQTg3UH8rIUs8UI9dCK41/wsPd3pEahzf7H47v7x1HCohVZcFO3XQc1bUDw==", + "license": "MIT", + "peer": true + }, + "node_modules/@pixi/core": { + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/core/-/core-6.5.10.tgz", + "integrity": "sha512-Gdzp5ENypyglvsh5Gv3teUZnZnmizo4xOsL+QqmWALdFlJXJwLJMVhKVThV/q/095XR6i4Ou54oshn+m4EkuFw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/offscreencanvas": "^2019.6.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/pixijs" + }, + "peerDependencies": { + "@pixi/constants": "6.5.10", + "@pixi/extensions": "6.5.10", + "@pixi/math": "6.5.10", + "@pixi/runner": "6.5.10", + "@pixi/settings": "6.5.10", + "@pixi/ticker": "6.5.10", + "@pixi/utils": "6.5.10" + } + }, + "node_modules/@pixi/display": { + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/display/-/display-6.5.10.tgz", + "integrity": "sha512-NxFdDDxlbH5fQkzGHraLGoTMucW9pVgXqQm13TSmkA3NWIi/SItHL4qT2SI8nmclT9Vid1VDEBCJFAbdeuQw1Q==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@pixi/constants": "6.5.10", + "@pixi/math": "6.5.10", + "@pixi/settings": "6.5.10", + "@pixi/utils": "6.5.10" + } + }, + "node_modules/@pixi/extensions": { + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-6.5.10.tgz", + "integrity": "sha512-EIUGza+E+sCy3dupuIjvRK/WyVyfSzHb5XsxRaxNrPwvG1iIUIqNqZ3owLYCo4h17fJWrj/yXVufNNtUKQccWQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@pixi/loaders": { + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/loaders/-/loaders-6.5.10.tgz", + "integrity": "sha512-AuK7mXBmyVsDFL9DDFPB8sqP8fwQ2NOktvu98bQuJl0/p/UeK/0OAQnF3wcf3FeBv5YGXfNHL21c2DCisjKfTg==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@pixi/constants": "6.5.10", + "@pixi/core": "6.5.10", + "@pixi/utils": "6.5.10" + } + }, + "node_modules/@pixi/math": { + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/math/-/math-6.5.10.tgz", + "integrity": "sha512-fxeu7ykVbMGxGV2S3qRTupHToeo1hdWBm8ihyURn3BMqJZe2SkZEECPd5RyvIuuNUtjRnmhkZRnF3Jsz2S+L0g==", + "license": "MIT", + "peer": true + }, + "node_modules/@pixi/runner": { + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-6.5.10.tgz", + "integrity": "sha512-4HiHp6diCmigJT/DSbnqQP62OfWKmZB7zPWMdV1AEdr4YT1QxzXAW1wHg7dkoEfyTHqZKl0tm/zcqKq/iH7tMA==", + "license": "MIT", + "peer": true + }, + "node_modules/@pixi/settings": { + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-6.5.10.tgz", + "integrity": "sha512-ypAS5L7pQ2Qb88yQK72bXtc7sD8OrtLWNXdZ/gnw5kwSWCFaOSoqhKqJCXrR5DQtN98+RQefwbEAmMvqobhFyw==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@pixi/constants": "6.5.10" + } + }, + "node_modules/@pixi/sprite": { + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-6.5.10.tgz", + "integrity": "sha512-UiK+8LgM9XQ/SBDKjRgZ8WggdOSlFRXqiWjEZVmNkiyU8HvXeFzWPRhpc8RR1zDwAUhZWKtMhF8X/ba9m+z2lg==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@pixi/constants": "6.5.10", + "@pixi/core": "6.5.10", + "@pixi/display": "6.5.10", + "@pixi/math": "6.5.10", + "@pixi/settings": "6.5.10", + "@pixi/utils": "6.5.10" + } + }, + "node_modules/@pixi/ticker": { + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-6.5.10.tgz", + "integrity": "sha512-UqX1XYtzqFSirmTOy8QAK4Ccg4KkIZztrBdRPKwFSOEiKAJoGDCSBmyQBo/9aYQKGObbNnrJ7Hxv3/ucg3/1GA==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@pixi/extensions": "6.5.10", + "@pixi/settings": "6.5.10" + } + }, + "node_modules/@pixi/utils": { + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-6.5.10.tgz", + "integrity": "sha512-4f4qDMmAz9IoSAe08G2LAxUcEtG9jSdudfsMQT2MG+OpfToirboE6cNoO0KnLCvLzDVE/mfisiQ9uJbVA9Ssdw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/earcut": "^2.1.0", + "earcut": "^2.2.4", + "eventemitter3": "^3.1.0", + "url": "^0.11.0" + }, + "peerDependencies": { + "@pixi/constants": "6.5.10", + "@pixi/settings": "6.5.10" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.60.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", @@ -1246,6 +1390,18 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/css-font-loading-module": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.12.tgz", + "integrity": "sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==", + "license": "MIT" + }, + "node_modules/@types/earcut": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", + "integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1263,6 +1419,13 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT", + "peer": true + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -1496,6 +1659,27 @@ "dequal": "^2.0.3" } }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -1506,6 +1690,15 @@ "node": ">=12" } }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1523,6 +1716,12 @@ "node": ">= 0.4" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1576,6 +1775,16 @@ "url": "https://opencollective.com/express" } }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -1696,6 +1905,24 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, "node_modules/content-disposition": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", @@ -1940,6 +2167,12 @@ "node": ">= 0.4" } }, + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "license": "ISC" + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -1955,6 +2188,12 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/email-addresses": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", + "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==", + "license": "MIT" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -2078,6 +2317,15 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/esm-env": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", @@ -2131,6 +2379,13 @@ "node": ">=6" } }, + "node_modules/eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "license": "MIT", + "peer": true + }, "node_modules/eventsource": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", @@ -2310,6 +2565,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", @@ -2331,6 +2612,36 @@ "url": "https://opencollective.com/express" } }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/form-data": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", @@ -2389,6 +2700,26 @@ "node": ">= 0.8" } }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2521,6 +2852,65 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/gh-pages": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-4.0.0.tgz", + "integrity": "sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ==", + "license": "MIT", + "dependencies": { + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", + "filenamify": "^4.3.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "globby": "^6.1.0" + }, + "bin": { + "gh-pages": "bin/gh-pages.js", + "gh-pages-clean": "bin/gh-pages-clean.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/google-auth-library": { "version": "9.15.1", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", @@ -2589,6 +2979,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/grammy": { "version": "1.42.0", "resolved": "https://registry.npmjs.org/grammy/-/grammy-1.42.0.tgz", @@ -2751,6 +3147,17 @@ "url": "https://opencollective.com/express" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2840,6 +3247,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, + "node_modules/ismobilejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz", + "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==", + "license": "MIT" + }, "node_modules/jose": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz", @@ -2955,6 +3368,15 @@ "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", "license": "BSD-2-Clause" }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", @@ -2993,6 +3415,24 @@ "dev": true, "license": "MIT" }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, "node_modules/loupe": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", @@ -3027,6 +3467,21 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -3082,6 +3537,18 @@ "url": "https://opencollective.com/express" } }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -3223,6 +3690,42 @@ "wrappy": "1" } }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/parse-ms": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", @@ -3257,6 +3760,24 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -3300,6 +3821,467 @@ "dev": true, "license": "ISC" }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pixi-live2d-display": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/pixi-live2d-display/-/pixi-live2d-display-0.4.0.tgz", + "integrity": "sha512-xeYC6y4Y0Bxe9ksWNlGFZC1rII/MPrzPQK7t1c3ubA8RhkOISIqHJl38fNumXqhGEs+yItmgDOkFT+9dsyGDjA==", + "license": "MIT", + "dependencies": { + "gh-pages": "^4.0.0" + }, + "peerDependencies": { + "@pixi/core": "^6", + "@pixi/display": "^6", + "@pixi/loaders": "^6", + "@pixi/math": "^6", + "@pixi/sprite": "^6", + "@pixi/utils": "^6" + } + }, + "node_modules/pixi.js": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-7.4.3.tgz", + "integrity": "sha512-uIWdH0EI2dVgNoqN9aFaHCmR0V65OEhMkXs2sek3c/QP2ItV6UoM+ouX9esSv3ibo20F+J5D1XwnQhUZI6wqeQ==", + "license": "MIT", + "dependencies": { + "@pixi/accessibility": "7.4.3", + "@pixi/app": "7.4.3", + "@pixi/assets": "7.4.3", + "@pixi/compressed-textures": "7.4.3", + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3", + "@pixi/events": "7.4.3", + "@pixi/extensions": "7.4.3", + "@pixi/extract": "7.4.3", + "@pixi/filter-alpha": "7.4.3", + "@pixi/filter-blur": "7.4.3", + "@pixi/filter-color-matrix": "7.4.3", + "@pixi/filter-displacement": "7.4.3", + "@pixi/filter-fxaa": "7.4.3", + "@pixi/filter-noise": "7.4.3", + "@pixi/graphics": "7.4.3", + "@pixi/mesh": "7.4.3", + "@pixi/mesh-extras": "7.4.3", + "@pixi/mixin-cache-as-bitmap": "7.4.3", + "@pixi/mixin-get-child-by-name": "7.4.3", + "@pixi/mixin-get-global-position": "7.4.3", + "@pixi/particle-container": "7.4.3", + "@pixi/prepare": "7.4.3", + "@pixi/sprite": "7.4.3", + "@pixi/sprite-animated": "7.4.3", + "@pixi/sprite-tiling": "7.4.3", + "@pixi/spritesheet": "7.4.3", + "@pixi/text": "7.4.3", + "@pixi/text-bitmap": "7.4.3", + "@pixi/text-html": "7.4.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/pixijs" + } + }, + "node_modules/pixi.js/node_modules/@pixi/accessibility": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-7.4.3.tgz", + "integrity": "sha512-tCr0yeWpMe0yucFvEPidy5a7gVJGpTjqGrDpSEBYT/kbScfUwcoX49RrckCCCiXDlyO4WRh9lVVuHXTvqRLIMg==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3", + "@pixi/events": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/app": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/app/-/app-7.4.3.tgz", + "integrity": "sha512-opyWMuO0Ir8pf1DYUR++wAA6ZfNU+nIX2z95R2OD172HbcdhB4/HD7leLIIAny/LciEdMqlWEBhXK7N93YWbdg==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/assets": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/assets/-/assets-7.4.3.tgz", + "integrity": "sha512-StvjiJBSp/j9hHkGu8AFHNvwYUazXq64WhyhytztyDMRkg/l/cL7EcttY5T0qZNWlIpccdr60LUKrWDOuMpkiw==", + "license": "MIT", + "dependencies": { + "@types/css-font-loading-module": "^0.0.12" + }, + "peerDependencies": { + "@pixi/core": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/compressed-textures": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/compressed-textures/-/compressed-textures-7.4.3.tgz", + "integrity": "sha512-uJ3CC+lNX4HIxs6IxEESO50/0A1KxSVm6CO9UlkXzTsNj9ynmdy5BkJ1dzii7LCdqGcHIXHO01yvKuUbJBBQtw==", + "license": "MIT", + "peerDependencies": { + "@pixi/assets": "7.4.3", + "@pixi/core": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/constants": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-7.4.3.tgz", + "integrity": "sha512-QGmwJUNQy/vVEHzL6VGQvnwawLZ1wceZMI8HwJAT4/I2uAzbBeFDdmCS8WsTpSWLZjF/DszDc1D8BFp4pVJ5UQ==", + "license": "MIT" + }, + "node_modules/pixi.js/node_modules/@pixi/core": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/core/-/core-7.4.3.tgz", + "integrity": "sha512-5YDs11faWgVVTL8VZtLU05/Fl47vaP5Tnsbf+y/WRR0VSW3KhRRGTBU1J3Gdc2xEWbJhUK07KGP7eSZpvtPVgA==", + "license": "MIT", + "dependencies": { + "@pixi/color": "7.4.3", + "@pixi/constants": "7.4.3", + "@pixi/extensions": "7.4.3", + "@pixi/math": "7.4.3", + "@pixi/runner": "7.4.3", + "@pixi/settings": "7.4.3", + "@pixi/ticker": "7.4.3", + "@pixi/utils": "7.4.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/pixijs" + } + }, + "node_modules/pixi.js/node_modules/@pixi/display": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/display/-/display-7.4.3.tgz", + "integrity": "sha512-b5m2dAaoNAVdxz1oDaxl3XZ059NEOcNtGkxTOZ4EYCw/jcp9sZXkgSROHRzsGn4k+NugH7+9MP4Id2Z0kkdUhw==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/events": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/events/-/events-7.4.3.tgz", + "integrity": "sha512-o3j/5Dxq6WDVS6eHfURB/cf/MP+NcsF/eC5PnbSHjXxJmDE7PoTVwLvxexm5uuvNRpFh/6/Fn0V8Vl4gV8sc8w==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/extensions": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-7.4.3.tgz", + "integrity": "sha512-FhoiYkHQEDYHUE7wXhqfsTRz6KxLXjuMbSiAwnLb9uG1vAgp6q6qd6HEsf4X30YaZbLFY8a4KY6hFZWjF+4Fdw==", + "license": "MIT" + }, + "node_modules/pixi.js/node_modules/@pixi/extract": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-7.4.3.tgz", + "integrity": "sha512-HNvGNrEVaeVsbcnIO1MsHpjZbTwo9nIlaOEBzDGcL6JWwzuB1RnzUke7WUCndCUt91sGUdvPnvgCvy9/NNFg3w==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/filter-alpha": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-7.4.3.tgz", + "integrity": "sha512-YFdUB1I53USQb+9TEhS849dV2KZhbnNGIoBbOSThUJfXQc4pDguIFWMagVToAQYgmZ4C4AtYfVjaSEELrMcCdA==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/filter-blur": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-7.4.3.tgz", + "integrity": "sha512-ZFzS9L/whdRbs5A/EUgF3yQaBcxNarmbuwaMgrfnpQ84mRczkGByqDLGToadiufyals07ufTrXBGRle9lbtEDA==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/filter-color-matrix": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-7.4.3.tgz", + "integrity": "sha512-TNu0h20SrzjUWIb5v19dAp1vPpqtG0w2XF9kIHN91bMNaf3R1jzhpWG6TtaVO9eo1IolWcEJLw38jIohyC+KNw==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/filter-displacement": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-7.4.3.tgz", + "integrity": "sha512-ax+cFA2mEnKgqf9F8qInpv09GNWzjwnASLETpwPXzWBtlAlNCeHV2tCv3+SlMdEKUkwG9sA7AmjjjC2JBUyt+Q==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/filter-fxaa": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-7.4.3.tgz", + "integrity": "sha512-y9jhho5cCflhEsPtNqqsd+XJHsb+/ysht4rG/VHQ8Z6pScHYpbgiEpowryGq8uSMQQwx6zKNS2DPiXdiOHPZsg==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/filter-noise": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-7.4.3.tgz", + "integrity": "sha512-rwgSO3BKe1jW/P5CaOcfLKjfpl674aBEo/igi/3QLxA3ORhILNqWRsKkOwP8xF/ejI5NE4rMEkdv0LScbdGFhA==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/graphics": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-7.4.3.tgz", + "integrity": "sha512-wWLivD8/URb8A7X4TqCZGG39C91IE+aOuWY/z9NCz5Z6WvA/VWnsc5fLTlO+ggjGHgKF0cSucCXZfUe1wm0AOQ==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3", + "@pixi/sprite": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/math": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/math/-/math-7.4.3.tgz", + "integrity": "sha512-/uJOVhR2DOZ+zgdI6Bs/CwcXT4bNRKsS+TqX3ekRIxPCwaLra+Qdm7aDxT5cTToDzdxbKL5+rwiLu3Y1egILDw==", + "license": "MIT" + }, + "node_modules/pixi.js/node_modules/@pixi/mesh": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-7.4.3.tgz", + "integrity": "sha512-CikqFPtKvU3Zj986/MSoC8X39CWv5CEpiEW/tYp47p4tgQNDSkNWYnDiNYgb+4VX6pNsBrgX4DALLdTR17SlSA==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/mesh-extras": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-7.4.3.tgz", + "integrity": "sha512-EqpxpVZoTObyupxMSzuUsCGmWPQioW84n9EO9Ajawkk/HYA+qKFZ5viKiEThIUBYgv4Apn/7c0U3Feg7Ez4uQQ==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/mesh": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/mixin-cache-as-bitmap": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-7.4.3.tgz", + "integrity": "sha512-NgvDdgSgd2tfcTSc+SWF12JJjVVz5ZrkSlhX0idSp/LSako82AiFJlD2xqH9GUsEcA6sqBBlnu7nrGkPTHQdhA==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3", + "@pixi/sprite": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/mixin-get-child-by-name": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-7.4.3.tgz", + "integrity": "sha512-HLhDxHwafQT+CxbqQx9w9ivJIyAOg9JJ/6m4fNymVuDWeuMGcxDxBD7DukdUYIieT+RD/RlxdPEmq8YoromlFA==", + "license": "MIT", + "peerDependencies": { + "@pixi/display": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/mixin-get-global-position": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-7.4.3.tgz", + "integrity": "sha512-k09kvkS379EypCIWgXMY7uiXtWk1BsaJyTYlV16Co0AsmNPdFd+wUozMx1xV6rxcGiWXsxr/1k9fbETuYkcXCQ==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/particle-container": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/particle-container/-/particle-container-7.4.3.tgz", + "integrity": "sha512-0DfJF5C0XTfuI2FsLYvMKCOtqWjXWGOWfA6m4l0W/Ke/qw5zKIOEhgjPLw4qNRtOhmEfkVKJUGp66Ap/ya2YzA==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3", + "@pixi/sprite": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/prepare": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-7.4.3.tgz", + "integrity": "sha512-OjJHGKXPzwP5OLKxBnTBnKMOktHynLvO0TQPqTYgNtmGQzY109mypCqM4M+s/V+uYmBo/T+sXvBahj98q/f1tA==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3", + "@pixi/graphics": "7.4.3", + "@pixi/text": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/runner": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-7.4.3.tgz", + "integrity": "sha512-TJyfp7y23u5vvRAyYhVSa7ytq0PdKSvPLXu4G3meoFh1oxTLHH6g/RIzLuxUAThPG2z7ftthuW3qWq6dRV+dhw==", + "license": "MIT" + }, + "node_modules/pixi.js/node_modules/@pixi/settings": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-7.4.3.tgz", + "integrity": "sha512-SmGK8smc0PxRB9nr0UJioEtE9hl4gvj9OedCvZx3bxBwA3omA5BmP3CyhQfN8XJ29+o2OUL01r3zAPVol4l4lA==", + "license": "MIT", + "dependencies": { + "@pixi/constants": "7.4.3", + "@types/css-font-loading-module": "^0.0.12", + "ismobilejs": "^1.1.0" + } + }, + "node_modules/pixi.js/node_modules/@pixi/sprite": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-7.4.3.tgz", + "integrity": "sha512-iNBrpOFF9nXDT6m2jcyYy6l/sRzklLDDck1eFHprHZwvNquY2nzRfh+RGBCecxhBcijiLJ3fsZN33fP0LDXkvw==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/sprite-animated": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-7.4.3.tgz", + "integrity": "sha512-mw5YIec8KfO1Jv9qrDNvGoD7Dlmcgww5YlMtd+ARi7Zzo+6ziNw899LXtoaKX1+3BXdZbYNyJAx3C5r30NtwXA==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/sprite": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/sprite-tiling": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-7.4.3.tgz", + "integrity": "sha512-kUa9cEcMsGXSIZoXA7LhW4oo0eWa30w0KYd7mZ0bqalBMfOcvsGZMN701Lc5lpE8URw+8yu5bnyGLbrxhWBTuw==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3", + "@pixi/sprite": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/spritesheet": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-7.4.3.tgz", + "integrity": "sha512-Ce4xZzUxUSKfiROUjjVCBYNLuCcDEWKJ822bSV9rkgVHItu3q04VnEww0DXO+9K0hKv4Ukjjk8aP6Pz0LgPm7A==", + "license": "MIT", + "peerDependencies": { + "@pixi/assets": "7.4.3", + "@pixi/core": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/text": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/text/-/text-7.4.3.tgz", + "integrity": "sha512-IAF0iu04rPg3oiL0HZsEZI44fpJxq3UZ4xTmx8l1RyhhSXiElLvvSlSH57vt/BKMQZtCs+AqEit7yn8heK2+nQ==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/sprite": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/text-bitmap": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-7.4.3.tgz", + "integrity": "sha512-TnBocJm7f5nMAYwYcsojc62uCrOYauAGH26o3pNrlqmHDRDQ7FzPOGvkYZGYFREbUycloLSRlYpSy0FB9ZdV4Q==", + "license": "MIT", + "peerDependencies": { + "@pixi/assets": "7.4.3", + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3", + "@pixi/mesh": "7.4.3", + "@pixi/text": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/text-html": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/text-html/-/text-html-7.4.3.tgz", + "integrity": "sha512-nm9K9gjSZAU8ETwQZBE3kMGNdO1IzyghxoRTcJCWKhekiGDpUQhopfNhqieNZ7reVJpvhpFQWjbyaHDehndUaQ==", + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.3", + "@pixi/display": "7.4.3", + "@pixi/sprite": "7.4.3", + "@pixi/text": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/ticker": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-7.4.3.tgz", + "integrity": "sha512-tHsAD0iOUb6QSGGw+c8cyRBvxsq/NlfzIFBZLEHhWZ+Bx4a0MmXup6I/yJDGmyPCYE+ctCcAfY13wKAzdiVFgQ==", + "license": "MIT", + "dependencies": { + "@pixi/extensions": "7.4.3", + "@pixi/settings": "7.4.3", + "@pixi/utils": "7.4.3" + } + }, + "node_modules/pixi.js/node_modules/@pixi/utils": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-7.4.3.tgz", + "integrity": "sha512-NO3Y9HAn2UKS1YdxffqsPp+kDpVm8XWvkZcS/E+rBzY9VTLnNOI7cawSRm+dacdET3a8Jad3aDKEDZ0HmAqAFA==", + "license": "MIT", + "dependencies": { + "@pixi/color": "7.4.3", + "@pixi/constants": "7.4.3", + "@pixi/settings": "7.4.3", + "@types/earcut": "^2.1.0", + "earcut": "^2.2.4", + "eventemitter3": "^4.0.0", + "url": "^0.11.0" + } + }, + "node_modules/pixi.js/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/pkce-challenge": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", @@ -3309,6 +4291,18 @@ "node": ">=16.20.0" } }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/postcss": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", @@ -3590,6 +4584,15 @@ "node": ">=v12.22.7" } }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/send": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", @@ -3798,6 +4801,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/svelte": { "version": "5.55.4", "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.55.4.tgz", @@ -3959,6 +4974,18 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", @@ -4026,6 +5053,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -4035,12 +5071,31 @@ "node": ">= 0.8" } }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/url-template": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", "license": "BSD" }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "license": "MIT" + }, "node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -4854,6 +5909,10 @@ "packages/cortex-ui": { "name": "@keisei/cortex-ui", "version": "0.1.0", + "dependencies": { + "pixi-live2d-display": "^0.4.0", + "pixi.js": "^7.4.0" + }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^4.0.0", "@testing-library/svelte": "^5.2.0", diff --git a/_ts_packages/packages/cortex-ui/package.json b/_ts_packages/packages/cortex-ui/package.json index 0f605db..189b746 100644 --- a/_ts_packages/packages/cortex-ui/package.json +++ b/_ts_packages/packages/cortex-ui/package.json @@ -10,6 +10,10 @@ "test": "vitest run", "check": "svelte-check --tsconfig ./tsconfig.json" }, + "dependencies": { + "pixi-live2d-display": "^0.4.0", + "pixi.js": "^7.4.0" + }, "devDependencies": { "svelte": "^5.0.0", "@sveltejs/vite-plugin-svelte": "^4.0.0", diff --git a/_ts_packages/packages/cortex-ui/patches/README.md b/_ts_packages/packages/cortex-ui/patches/README.md new file mode 100644 index 0000000..5b82e90 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/patches/README.md @@ -0,0 +1,38 @@ +# patches/ + +## pixi-live2d-display.patch + +Copied verbatim from AIRI (https://github.com/moeru-ai/airi), MIT License. + +### What it does + +Both `FileLoader` and `ZipLoader` in `pixi-live2d-display@0.4.0` pick the first +settings file ending in `model.json` / `model3.json`. Newer Live2D authoring +tools emit `items_pinned_to_model.json` as a side-car, which accidentally +matches the suffix and derails the loader. The patch filters it out. + +### Is it applied? + +Not automatically. This project uses vanilla `npm install`, so we cannot +pre-apply patches the way `pnpm` + `patchedDependencies` or +`patch-package` would. Two options if you need it: + +1. **Manual**, once per clone, from `_ts_packages/`: + ```sh + patch -p1 -d node_modules/pixi-live2d-display < packages/cortex-ui/patches/pixi-live2d-display.patch + ``` +2. **Automated**, wire up `patch-package`: + ```sh + npm i -D patch-package + # add "postinstall": "patch-package" to root package.json + ``` + (This would touch `_ts_packages/package.json` which is out of scope for + the current wave; leaving as a follow-up.) + +### Do we need it here? + +Not for the bundled Haru model — `Live2DPet.svelte` loads the explicit +`model3.json` URL straight from `/public/live2d-models/…`, bypassing the +filename-scanning code paths the patch touches. The patch becomes relevant +only when (a) user-uploaded ZIPs are supported or (b) a model folder +contains an `items_pinned_to_model.json` sidecar. diff --git a/_ts_packages/packages/cortex-ui/patches/pixi-live2d-display.patch b/_ts_packages/packages/cortex-ui/patches/pixi-live2d-display.patch new file mode 100644 index 0000000..fb7e43e --- /dev/null +++ b/_ts_packages/packages/cortex-ui/patches/pixi-live2d-display.patch @@ -0,0 +1,144 @@ +diff --git a/core/README.md b/core/README.md +deleted file mode 100644 +index ad383747237ee1a22ce39d01fbc7e77ac94b8e47..0000000000000000000000000000000000000000 +diff --git a/core/live2d.d.ts b/core/live2d.d.ts +deleted file mode 100644 +index 0283512ed1c9ea01d7dd1b67b76d660237b453e8..0000000000000000000000000000000000000000 +diff --git a/cubism/.vscode/extensions.json b/cubism/.vscode/extensions.json +deleted file mode 100644 +index fda5ad57b9567b939382ba15fb1d3b9f1fecf77e..0000000000000000000000000000000000000000 +diff --git a/cubism/.vscode/tasks.json b/cubism/.vscode/tasks.json +deleted file mode 100644 +index 7cd3fffed85da69d5af154f63480bce8766a038f..0000000000000000000000000000000000000000 +diff --git a/dist/cubism2.es.js b/dist/cubism2.es.js +index 0d40d5d40533881d154e3c2cdda9b360c57eaaa6..8dbdb1b36e2da42da264dc3533523e61745102f7 100644 +--- a/dist/cubism2.es.js ++++ b/dist/cubism2.es.js +@@ -1373,7 +1373,7 @@ const _FileLoader = class { + } + static createSettings(files) { + return __async(this, null, function* () { +- const settingsFile = files.find((file) => file.name.endsWith("model.json") || file.name.endsWith("model3.json")); ++ const settingsFile = files.find((file) => !file.name.endsWith("items_pinned_to_model.json") && (file.name.endsWith("model.json") || file.name.endsWith("model3.json"))); + if (!settingsFile) { + throw new TypeError("Settings file not found"); + } +@@ -1458,7 +1458,7 @@ const _ZipLoader = class { + static createSettings(reader) { + return __async(this, null, function* () { + const filePaths = yield _ZipLoader.getFilePaths(reader); +- const settingsFilePath = filePaths.find((path) => path.endsWith("model.json") || path.endsWith("model3.json")); ++ const settingsFilePath = filePaths.find((path) => !path.endsWith("items_pinned_to_model.json") && (path.endsWith("model.json") || path.endsWith("model3.json"))); + if (!settingsFilePath) { + throw new Error("Settings file not found"); + } +diff --git a/dist/cubism2.js b/dist/cubism2.js +index c3db490f8dbfdd63ad40648fe0e0325604f22e95..4b452db0b109ba7deaddf397ef351ae7bcfe145c 100644 +--- a/dist/cubism2.js ++++ b/dist/cubism2.js +@@ -1373,7 +1373,7 @@ var __async = (__this, __arguments, generator) => { + } + static createSettings(files) { + return __async(this, null, function* () { +- const settingsFile = files.find((file) => file.name.endsWith("model.json") || file.name.endsWith("model3.json")); ++ const settingsFile = files.find((file) => !file.name.endsWith("items_pinned_to_model.json") && (file.name.endsWith("model.json") || file.name.endsWith("model3.json"))); + if (!settingsFile) { + throw new TypeError("Settings file not found"); + } +@@ -1458,7 +1458,7 @@ var __async = (__this, __arguments, generator) => { + static createSettings(reader) { + return __async(this, null, function* () { + const filePaths = yield _ZipLoader.getFilePaths(reader); +- const settingsFilePath = filePaths.find((path) => path.endsWith("model.json") || path.endsWith("model3.json")); ++ const settingsFilePath = filePaths.find((path) => !path.endsWith("items_pinned_to_model.json") && (path.endsWith("model.json") || path.endsWith("model3.json"))); + if (!settingsFilePath) { + throw new Error("Settings file not found"); + } +diff --git a/dist/cubism4.es.js b/dist/cubism4.es.js +index f21619f5794c00542bb2a9df340e50d4453a0367..38bd069a5d1ec37380c376c2ff2d7fed9c0042b2 100644 +--- a/dist/cubism4.es.js ++++ b/dist/cubism4.es.js +@@ -5012,7 +5012,7 @@ const _FileLoader = class { + } + static createSettings(files) { + return __async(this, null, function* () { +- const settingsFile = files.find((file) => file.name.endsWith("model.json") || file.name.endsWith("model3.json")); ++ const settingsFile = files.find((file) => !file.name.endsWith("items_pinned_to_model.json") && (file.name.endsWith("model.json") || file.name.endsWith("model3.json"))); + if (!settingsFile) { + throw new TypeError("Settings file not found"); + } +@@ -5097,7 +5097,7 @@ const _ZipLoader = class { + static createSettings(reader) { + return __async(this, null, function* () { + const filePaths = yield _ZipLoader.getFilePaths(reader); +- const settingsFilePath = filePaths.find((path) => path.endsWith("model.json") || path.endsWith("model3.json")); ++ const settingsFilePath = filePaths.find((path) => !path.endsWith("items_pinned_to_model.json") && (path.endsWith("model.json") || path.endsWith("model3.json"))); + if (!settingsFilePath) { + throw new Error("Settings file not found"); + } +diff --git a/dist/cubism4.js b/dist/cubism4.js +index 03c1fb2b32b3b908a8b0e604aa3ee50aa9130169..99fc587e3ca7e6f433099e13f33e0e480a10c25a 100644 +--- a/dist/cubism4.js ++++ b/dist/cubism4.js +@@ -5012,7 +5012,7 @@ var __async = (__this, __arguments, generator) => { + } + static createSettings(files) { + return __async(this, null, function* () { +- const settingsFile = files.find((file) => file.name.endsWith("model.json") || file.name.endsWith("model3.json")); ++ const settingsFile = files.find((file) => !file.name.endsWith("items_pinned_to_model.json") && (file.name.endsWith("model.json") || file.name.endsWith("model3.json"))); + if (!settingsFile) { + throw new TypeError("Settings file not found"); + } +@@ -5097,7 +5097,7 @@ var __async = (__this, __arguments, generator) => { + static createSettings(reader) { + return __async(this, null, function* () { + const filePaths = yield _ZipLoader.getFilePaths(reader); +- const settingsFilePath = filePaths.find((path) => path.endsWith("model.json") || path.endsWith("model3.json")); ++ const settingsFilePath = filePaths.find((path) => !path.endsWith("items_pinned_to_model.json") && (path.endsWith("model.json") || path.endsWith("model3.json"))); + if (!settingsFilePath) { + throw new Error("Settings file not found"); + } +diff --git a/dist/index.es.js b/dist/index.es.js +index f969d304f346c4e420b6798dbd4dec81b902a5e4..7e6b4d3ef53f1ea0648030899de9debd291fc551 100644 +--- a/dist/index.es.js ++++ b/dist/index.es.js +@@ -1373,7 +1373,7 @@ const _FileLoader = class { + } + static createSettings(files) { + return __async(this, null, function* () { +- const settingsFile = files.find((file) => file.name.endsWith("model.json") || file.name.endsWith("model3.json")); ++ const settingsFile = files.find((file) => !file.name.endsWith("items_pinned_to_model.json") && (file.name.endsWith("model.json") || file.name.endsWith("model3.json"))); + if (!settingsFile) { + throw new TypeError("Settings file not found"); + } +@@ -1458,7 +1458,7 @@ const _ZipLoader = class { + static createSettings(reader) { + return __async(this, null, function* () { + const filePaths = yield _ZipLoader.getFilePaths(reader); +- const settingsFilePath = filePaths.find((path) => path.endsWith("model.json") || path.endsWith("model3.json")); ++ const settingsFilePath = filePaths.find((path) => !path.endsWith("items_pinned_to_model.json") && (path.endsWith("model.json") || path.endsWith("model3.json"))); + if (!settingsFilePath) { + throw new Error("Settings file not found"); + } +diff --git a/dist/index.js b/dist/index.js +index bc3d800c45889979190175cc88cdd8251feb9b5e..d1a660708ff81e1379f173709a32c6f4aa16696a 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -1373,7 +1373,7 @@ var __async = (__this, __arguments, generator) => { + } + static createSettings(files) { + return __async(this, null, function* () { +- const settingsFile = files.find((file) => file.name.endsWith("model.json") || file.name.endsWith("model3.json")); ++ const settingsFile = files.find((file) => !file.name.endsWith("items_pinned_to_model.json") && (file.name.endsWith("model.json") || file.name.endsWith("model3.json"))); + if (!settingsFile) { + throw new TypeError("Settings file not found"); + } +@@ -1458,7 +1458,7 @@ var __async = (__this, __arguments, generator) => { + static createSettings(reader) { + return __async(this, null, function* () { + const filePaths = yield _ZipLoader.getFilePaths(reader); +- const settingsFilePath = filePaths.find((path) => path.endsWith("model.json") || path.endsWith("model3.json")); ++ const settingsFilePath = filePaths.find((path) => !path.endsWith("items_pinned_to_model.json") && (path.endsWith("model.json") || path.endsWith("model3.json"))); + if (!settingsFilePath) { + throw new Error("Settings file not found"); + } diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F01.exp3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F01.exp3.json new file mode 100644 index 0000000..3b7fe71 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F01.exp3.json @@ -0,0 +1,10 @@ +{ + "Type": "Live2D Expression", + "Parameters": [ + { + "Id": "ParamMouthOpenY", + "Value": 0.27, + "Blend": "Add" + } + ] +} diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F02.exp3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F02.exp3.json new file mode 100644 index 0000000..253a61e --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F02.exp3.json @@ -0,0 +1,35 @@ +{ + "Type": "Live2D Expression", + "Parameters": [ + { + "Id": "ParamBrowLY", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamBrowRY", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamBrowLForm", + "Value": 1, + "Blend": "Add" + }, + { + "Id": "ParamBrowRForm", + "Value": 1, + "Blend": "Add" + }, + { + "Id": "ParamMouthOpenY", + "Value": 1, + "Blend": "Add" + }, + { + "Id": "ParamEyeForm", + "Value": 0.54, + "Blend": "Add" + } + ] +} diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F03.exp3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F03.exp3.json new file mode 100644 index 0000000..55b8fd2 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F03.exp3.json @@ -0,0 +1,55 @@ +{ + "Type": "Live2D Expression", + "Parameters": [ + { + "Id": "ParamBrowLY", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamBrowRY", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamBrowLX", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamBrowRX", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamBrowRAngle", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamBrowLForm", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamBrowRForm", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamMouthForm", + "Value": -2, + "Blend": "Add" + }, + { + "Id": "ParamMouthOpenY", + "Value": 1, + "Blend": "Add" + }, + { + "Id": "ParamEyeForm", + "Value": -1, + "Blend": "Add" + } + ] +} diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F04.exp3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F04.exp3.json new file mode 100644 index 0000000..554f48e --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F04.exp3.json @@ -0,0 +1,60 @@ +{ + "Type": "Live2D Expression", + "Parameters": [ + { + "Id": "ParamEyeLOpen", + "Value": 0.8, + "Blend": "Multiply" + }, + { + "Id": "ParamEyeROpen", + "Value": 0.8, + "Blend": "Multiply" + }, + { + "Id": "ParamBrowLY", + "Value": -0.56, + "Blend": "Add" + }, + { + "Id": "ParamBrowRY", + "Value": -0.56, + "Blend": "Add" + }, + { + "Id": "ParamBrowRX", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamBrowLAngle", + "Value": 0.35, + "Blend": "Add" + }, + { + "Id": "ParamBrowRAngle", + "Value": 0.35, + "Blend": "Add" + }, + { + "Id": "ParamBrowLForm", + "Value": -0.74, + "Blend": "Add" + }, + { + "Id": "ParamBrowRForm", + "Value": -0.74, + "Blend": "Add" + }, + { + "Id": "ParamMouthForm", + "Value": -1.76, + "Blend": "Add" + }, + { + "Id": "ParamEyeForm", + "Value": 1, + "Blend": "Add" + } + ] +} diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F05.exp3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F05.exp3.json new file mode 100644 index 0000000..82c308a --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F05.exp3.json @@ -0,0 +1,35 @@ +{ + "Type": "Live2D Expression", + "Parameters": [ + { + "Id": "ParamEyeLOpen", + "Value": 0, + "Blend": "Multiply" + }, + { + "Id": "ParamEyeLSmile", + "Value": 1, + "Blend": "Add" + }, + { + "Id": "ParamEyeROpen", + "Value": 0, + "Blend": "Multiply" + }, + { + "Id": "ParamEyeRSmile", + "Value": 1, + "Blend": "Add" + }, + { + "Id": "ParamBrowLY", + "Value": 0.32, + "Blend": "Add" + }, + { + "Id": "ParamBrowRY", + "Value": 0.32, + "Blend": "Add" + } + ] +} diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F06.exp3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F06.exp3.json new file mode 100644 index 0000000..1783f20 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F06.exp3.json @@ -0,0 +1,35 @@ +{ + "Type": "Live2D Expression", + "Parameters": [ + { + "Id": "ParamEyeLOpen", + "Value": 2, + "Blend": "Multiply" + }, + { + "Id": "ParamEyeROpen", + "Value": 2, + "Blend": "Multiply" + }, + { + "Id": "ParamBrowLY", + "Value": 1, + "Blend": "Add" + }, + { + "Id": "ParamBrowRY", + "Value": 1, + "Blend": "Add" + }, + { + "Id": "ParamMouthForm", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamEyeBallForm", + "Value": -0.65, + "Blend": "Add" + } + ] +} diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F07.exp3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F07.exp3.json new file mode 100644 index 0000000..7155c07 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F07.exp3.json @@ -0,0 +1,65 @@ +{ + "Type": "Live2D Expression", + "Parameters": [ + { + "Id": "ParamEyeLOpen", + "Value": 0.89, + "Blend": "Multiply" + }, + { + "Id": "ParamEyeROpen", + "Value": 0.89, + "Blend": "Multiply" + }, + { + "Id": "ParamBrowLY", + "Value": -0.56, + "Blend": "Add" + }, + { + "Id": "ParamBrowRY", + "Value": -0.56, + "Blend": "Add" + }, + { + "Id": "ParamBrowLX", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamBrowRX", + "Value": -1, + "Blend": "Add" + }, + { + "Id": "ParamBrowLAngle", + "Value": 0.35, + "Blend": "Add" + }, + { + "Id": "ParamBrowRAngle", + "Value": 0.35, + "Blend": "Add" + }, + { + "Id": "ParamBrowLForm", + "Value": -0.74, + "Blend": "Add" + }, + { + "Id": "ParamBrowRForm", + "Value": -0.74, + "Blend": "Add" + }, + { + "Id": "ParamMouthForm", + "Value": -0.46, + "Blend": "Add" + }, + { + "Id": "ParamTere", + "Value": 1, + "Blend": "Add" + } + ] +} diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F08.exp3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F08.exp3.json new file mode 100644 index 0000000..f2c3787 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/expressions/F08.exp3.json @@ -0,0 +1,30 @@ +{ + "Type": "Live2D Expression", + "Parameters": [ + { + "Id": "ParamEyeLOpen", + "Value": 0.8, + "Blend": "Multiply" + }, + { + "Id": "ParamEyeROpen", + "Value": 0.8, + "Blend": "Multiply" + }, + { + "Id": "ParamBrowLForm", + "Value": -0.33, + "Blend": "Add" + }, + { + "Id": "ParamBrowRForm", + "Value": -0.33, + "Blend": "Add" + }, + { + "Id": "ParamMouthForm", + "Value": -1.76, + "Blend": "Add" + } + ] +} diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.2048/texture_00.png b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.2048/texture_00.png new file mode 100644 index 0000000..881ad67 Binary files /dev/null and b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.2048/texture_00.png differ diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.2048/texture_01.png b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.2048/texture_01.png new file mode 100644 index 0000000..9caa21e Binary files /dev/null and b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.2048/texture_01.png differ diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.moc3 b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.moc3 new file mode 100644 index 0000000..e5fc43a Binary files /dev/null and b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.moc3 differ diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.model3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.model3.json new file mode 100644 index 0000000..357c891 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.model3.json @@ -0,0 +1,49 @@ +{ + "Version": 3, + "FileReferences": { + "Moc": "haru_greeter_t03.moc3", + "Textures": [ + "haru_greeter_t03.2048/texture_00.png", + "haru_greeter_t03.2048/texture_01.png" + ], + "Physics": "haru_greeter_t03.physics3.json", + "Pose": "haru_greeter_t03.pose3.json", + "Expressions": [ + { "Name": "f00", "File": "expressions/F01.exp3.json" }, + { "Name": "f01", "File": "expressions/F02.exp3.json" }, + { "Name": "f02", "File": "expressions/F03.exp3.json" }, + { "Name": "f03", "File": "expressions/F04.exp3.json" }, + { "Name": "f04", "File": "expressions/F05.exp3.json" }, + { "Name": "f05", "File": "expressions/F06.exp3.json" }, + { "Name": "f06", "File": "expressions/F07.exp3.json" }, + { "Name": "f07", "File": "expressions/F08.exp3.json" } + ], + "Motions": { + "Idle": [ + { "File": "motion/haru_g_idle.motion3.json" }, + { "File": "motion/haru_g_m07.motion3.json" }, + { "File": "motion/haru_g_m15.motion3.json" } + ], + "Tap": [ + { "File": "motion/haru_g_m14.motion3.json" }, + { "File": "motion/haru_g_m05.motion3.json" } + ] + } + }, + "Groups": [ + { + "Target": "Parameter", + "Name": "EyeBlink", + "Ids": ["ParamEyeLOpen", "ParamEyeROpen"] + }, + { + "Target": "Parameter", + "Name": "LipSync", + "Ids": ["ParamMouthOpenY"] + } + ], + "HitAreas": [ + { "Id": "HitArea", "Name": "Head" }, + { "Id": "HitArea2", "Name": "Body" } + ] +} diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.physics3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.physics3.json new file mode 100644 index 0000000..3f14797 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.physics3.json @@ -0,0 +1,373 @@ +{ + "Version": 3, + "Meta": { + "PhysicsSettingCount": 4, + "TotalInputCount": 14, + "TotalOutputCount": 4, + "VertexCount": 8, + "EffectiveForces": { + "Gravity": { + "X": 0, + "Y": -1 + }, + "Wind": { + "X": 0, + "Y": 0 + } + }, + "PhysicsDictionary": [ + { + "Id": "PhysicsSetting1", + "Name": "前髪" + }, + { + "Id": "PhysicsSetting2", + "Name": "横髪" + }, + { + "Id": "PhysicsSetting3", + "Name": "後ろ髪" + }, + { + "Id": "PhysicsSetting4", + "Name": "スカーフ" + } + ] + }, + "PhysicsSettings": [ + { + "Id": "PhysicsSetting1", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "ParamAngleX" + }, + "Weight": 60, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamAngleZ" + }, + "Weight": 60, + "Type": "Angle", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleX" + }, + "Weight": 40, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleZ" + }, + "Weight": 40, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "ParamHairFront" + }, + "VertexIndex": 1, + "Scale": 1.821, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 8 + }, + "Mobility": 0.95, + "Delay": 0.8, + "Acceleration": 1.5, + "Radius": 8 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + }, + { + "Id": "PhysicsSetting2", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "ParamAngleX" + }, + "Weight": 60, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamAngleZ" + }, + "Weight": 60, + "Type": "Angle", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleX" + }, + "Weight": 40, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleZ" + }, + "Weight": 40, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "ParamHairSide" + }, + "VertexIndex": 1, + "Scale": 1.593, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 8 + }, + "Mobility": 0.95, + "Delay": 0.8, + "Acceleration": 1, + "Radius": 8 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + }, + { + "Id": "PhysicsSetting3", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "ParamAngleX" + }, + "Weight": 60, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamAngleZ" + }, + "Weight": 60, + "Type": "Angle", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleX" + }, + "Weight": 40, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleZ" + }, + "Weight": 40, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "ParamHairBack" + }, + "VertexIndex": 1, + "Scale": 1.943, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 8 + }, + "Mobility": 0.95, + "Delay": 0.8, + "Acceleration": 1.5, + "Radius": 8 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + }, + { + "Id": "PhysicsSetting4", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleX" + }, + "Weight": 100, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleZ" + }, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "ParamScarf" + }, + "VertexIndex": 1, + "Scale": 0.873, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 10 + }, + "Mobility": 0.9, + "Delay": 0.6, + "Acceleration": 1.5, + "Radius": 10 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + } + ] +} \ No newline at end of file diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.pose3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.pose3.json new file mode 100644 index 0000000..b88b67f --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/haru_greeter_t03.pose3.json @@ -0,0 +1,25 @@ +{ + "Type": "Live2D Pose", + "Groups": [ + [ + { + "Id": "Part01ArmRA001", + "Link": [] + }, + { + "Id": "Part01ArmRB001", + "Link": [] + } + ], + [ + { + "Id": "Part01ArmLA001", + "Link": [] + }, + { + "Id": "Part01ArmLB001", + "Link": [] + } + ] + ] +} diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_idle.motion3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_idle.motion3.json new file mode 100644 index 0000000..1139b04 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_idle.motion3.json @@ -0,0 +1,2266 @@ +{ + "Version": 3, + "Meta": { + "Duration": 10, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 63, + "TotalSegmentCount": 296, + "TotalPointCount": 785, + "UserDataCount": 1, + "TotalUserDataSize": 0 + }, + "UserData": [ + { + "Time": 0.0, + "Value": "test" + } + ], + "Curves": [ + { + "Target": "Model", + "Id": "Opacity", + "Segments": [ + 0, + 1, + 1, + 3.32, + 1, + 6.64, + 1, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleX", + "Segments": [ + 0, + 0, + 1, + 0.178, + 0, + 0.356, + -4, + 0.533, + -4, + 1, + 0.989, + -4, + 1.444, + -4, + 1.9, + -4, + 1, + 2.378, + -4, + 2.856, + 0, + 3.333, + 0, + 1, + 3.444, + 0, + 3.556, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.433, + 0, + 6.967, + 14, + 7.5, + 14, + 1, + 7.833, + 14, + 8.167, + 14, + 8.5, + 14, + 1, + 8.989, + 14, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleY", + "Segments": [ + 0, + 0, + 1, + 0.178, + 0, + 0.356, + -6, + 0.533, + -6, + 1, + 0.989, + -6, + 1.444, + -6, + 1.9, + -6, + 1, + 2.378, + -6, + 2.856, + 0, + 3.333, + 0, + 1, + 3.444, + 0, + 3.556, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.211, + 0, + 6.522, + 5, + 6.833, + 5, + 1, + 7.056, + 5, + 7.278, + -6, + 7.5, + -6, + 1, + 7.833, + -6, + 8.167, + -6, + 8.5, + -6, + 1, + 8.989, + -6, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleZ", + "Segments": [ + 0, + 0, + 1, + 0.178, + 0, + 0.356, + -6, + 0.533, + -6, + 1, + 0.733, + -6, + 0.933, + 1.432, + 1.133, + 5, + 1, + 1.389, + 9.559, + 1.644, + 10, + 1.9, + 10, + 1, + 2.378, + 10, + 2.856, + -6, + 3.333, + -6, + 1, + 3.444, + -6, + 3.556, + -6, + 3.667, + -6, + 1, + 4.156, + -6, + 4.644, + 6, + 5.133, + 6, + 1, + 5.389, + 6, + 5.644, + 6, + 5.9, + 6, + 1, + 6.211, + 6, + 6.522, + 12, + 6.833, + 12, + 1, + 7.389, + 12, + 7.944, + -6, + 8.5, + -6, + 1, + 8.989, + -6, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamTere", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamFaceForm", + "Segments": [ + 0, + 0, + 1, + 3.322, + 0, + 6.644, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeLOpen", + "Segments": [ + 0, + 1, + 1, + 0.633, + 1, + 1.267, + 1, + 1.9, + 1, + 1, + 2, + 1, + 2.1, + 1, + 2.2, + 1, + 1, + 2.244, + 1, + 2.289, + 0, + 2.333, + 0, + 1, + 2.356, + 0, + 2.378, + 0, + 2.4, + 0, + 1, + 2.456, + 0, + 2.511, + 1, + 2.567, + 1, + 1, + 2.933, + 1, + 3.3, + 1, + 3.667, + 1, + 1, + 3.711, + 1, + 3.756, + 0, + 3.8, + 0, + 1, + 3.822, + 0, + 3.844, + 0, + 3.867, + 0, + 1, + 3.922, + 0, + 3.978, + 1, + 4.033, + 1, + 1, + 4.656, + 1, + 5.278, + 1, + 5.9, + 1, + 1, + 6.433, + 1, + 6.967, + 1, + 7.5, + 1, + 1, + 7.544, + 1, + 7.589, + 0, + 7.633, + 0, + 1, + 7.656, + 0, + 7.678, + 0, + 7.7, + 0, + 1, + 7.756, + 0, + 7.811, + 1, + 7.867, + 1, + 1, + 8.078, + 1, + 8.289, + 1, + 8.5, + 1, + 1, + 8.989, + 1, + 9.478, + 1, + 9.967, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeLSmile", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeROpen", + "Segments": [ + 0, + 1, + 1, + 0.633, + 1, + 1.267, + 1, + 1.9, + 1, + 1, + 2, + 1, + 2.1, + 1, + 2.2, + 1, + 1, + 2.244, + 1, + 2.289, + 0, + 2.333, + 0, + 1, + 2.356, + 0, + 2.378, + 0, + 2.4, + 0, + 1, + 2.456, + 0, + 2.511, + 1, + 2.567, + 1, + 1, + 2.933, + 1, + 3.3, + 1, + 3.667, + 1, + 1, + 3.711, + 1, + 3.756, + 0, + 3.8, + 0, + 1, + 3.822, + 0, + 3.844, + 0, + 3.867, + 0, + 1, + 3.922, + 0, + 3.978, + 1, + 4.033, + 1, + 1, + 4.656, + 1, + 5.278, + 1, + 5.9, + 1, + 1, + 6.433, + 1, + 6.967, + 1, + 7.5, + 1, + 1, + 7.544, + 1, + 7.589, + 0, + 7.633, + 0, + 1, + 7.656, + 0, + 7.678, + 0, + 7.7, + 0, + 1, + 7.756, + 0, + 7.811, + 1, + 7.867, + 1, + 1, + 8.078, + 1, + 8.289, + 1, + 8.5, + 1, + 1, + 8.989, + 1, + 9.478, + 1, + 9.967, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeRSmile", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeForm", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallForm", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamTear", + "Segments": [ + 0, + 0, + 1, + 3.322, + 0, + 6.644, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallX", + "Segments": [ + 0, + 0, + 1, + 0.178, + 0, + 0.356, + 0.23, + 0.533, + 0.23, + 1, + 0.989, + 0.23, + 1.444, + 0.23, + 1.9, + 0.23, + 1, + 2.611, + 0.23, + 3.322, + 0, + 4.033, + 0, + 1, + 4.656, + 0, + 5.278, + 0, + 5.9, + 0, + 1, + 6.211, + 0, + 6.522, + -0.198, + 6.833, + -0.3, + 1, + 7.056, + -0.373, + 7.278, + -0.398, + 7.5, + -0.43, + 1, + 7.833, + -0.477, + 8.167, + -0.49, + 8.5, + -0.49, + 1, + 8.989, + -0.49, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallY", + "Segments": [ + 0, + 0, + 1, + 0.178, + 0, + 0.356, + 0.25, + 0.533, + 0.25, + 1, + 0.989, + 0.25, + 1.444, + 0.25, + 1.9, + 0.25, + 1, + 2.611, + 0.25, + 3.322, + 0, + 4.033, + 0, + 1, + 4.656, + 0, + 5.278, + 0, + 5.9, + 0, + 1, + 6.211, + 0, + 6.522, + -0.17, + 6.833, + -0.17, + 1, + 7.056, + -0.17, + 7.278, + 0.29, + 7.5, + 0.29, + 1, + 7.833, + 0.29, + 8.167, + 0.282, + 8.5, + 0.21, + 1, + 8.989, + 0.104, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLY", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRY", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLX", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRX", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLAngle", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRAngle", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLForm", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRForm", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamMouthForm", + "Segments": [ + 0, + 1, + 1, + 3.322, + 1, + 6.644, + 1, + 9.967, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamMouthOpenY", + "Segments": [ + 0, + 0, + 1, + 3.322, + 0, + 6.644, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamScarf", + "Segments": [ + 0, + 0, + 1, + 3.322, + 0, + 6.644, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleX", + "Segments": [ + 0, + 0, + 1, + 0.178, + 0, + 0.356, + -3, + 0.533, + -3, + 1, + 0.989, + -3, + 1.444, + -3, + 1.9, + -3, + 1, + 1.989, + -3, + 2.078, + -3, + 2.167, + -3, + 1, + 2.556, + -3, + 2.944, + 0, + 3.333, + 0, + 1, + 3.444, + 0, + 3.556, + 0, + 3.667, + 0, + 1, + 3.722, + 0, + 3.778, + 0, + 3.833, + 0, + 1, + 4.267, + 0, + 4.7, + 4, + 5.133, + 4, + 1, + 5.389, + 4, + 5.644, + 4, + 5.9, + 4, + 1, + 6, + 4, + 6.1, + 4, + 6.2, + 4, + 1, + 6.411, + 4, + 6.622, + 4.702, + 6.833, + 6, + 1, + 7.056, + 7.367, + 7.278, + 8, + 7.5, + 8, + 1, + 7.833, + 8, + 8.167, + 8, + 8.5, + 8, + 1, + 8.6, + 8, + 8.7, + 8, + 8.8, + 8, + 1, + 9.189, + 8, + 9.578, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleY", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 1.989, + 0, + 2.078, + 0, + 2.167, + 0, + 1, + 2.667, + 0, + 3.167, + 0, + 3.667, + 0, + 1, + 3.722, + 0, + 3.778, + 0, + 3.833, + 0, + 1, + 4.522, + 0, + 5.211, + 0, + 5.9, + 0, + 1, + 6, + 0, + 6.1, + 0, + 6.2, + 0, + 1, + 6.967, + 0, + 7.733, + 0, + 8.5, + 0, + 1, + 8.6, + 0, + 8.7, + 0, + 8.8, + 0, + 1, + 9.189, + 0, + 9.578, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleZ", + "Segments": [ + 0, + 0, + 1, + 0.244, + 0, + 0.489, + 3.788, + 0.733, + 4.987, + 1, + 0.956, + 6.077, + 1.178, + 5.954, + 1.4, + 5.954, + 1, + 1.778, + 5.954, + 2.156, + 5.242, + 2.533, + 2.985, + 1, + 2.8, + 1.393, + 3.067, + 0, + 3.333, + 0, + 1, + 3.444, + 0, + 3.556, + 0, + 3.667, + 0, + 1, + 3.722, + 0, + 3.778, + 0, + 3.833, + 0, + 1, + 4.267, + 0, + 4.7, + -2, + 5.133, + -2, + 1, + 5.389, + -2, + 5.644, + -2, + 5.9, + -2, + 1, + 6, + -2, + 6.1, + -2, + 6.2, + -2, + 1, + 6.411, + -2, + 6.622, + -4, + 6.833, + -4, + 1, + 7.056, + -4, + 7.278, + -2, + 7.5, + -2, + 1, + 7.833, + -2, + 8.167, + -5, + 8.5, + -5, + 1, + 8.6, + -5, + 8.7, + -5, + 8.8, + -5, + 1, + 9.189, + -5, + 9.578, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyUpper", + "Segments": [ + 0, + 0, + 1, + 3.322, + 0, + 6.644, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBreath", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBustY", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmLA", + "Segments": [ + 0, + 1, + 1, + 3.322, + 1, + 6.644, + 1, + 9.967, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmRA", + "Segments": [ + 0, + 1, + 1, + 3.322, + 1, + 6.644, + 1, + 9.967, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmLB", + "Segments": [ + 0, + 0, + 1, + 3.322, + 0, + 6.644, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmRB", + "Segments": [ + 0, + 0, + 1, + 3.322, + 0, + 6.644, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandChangeR", + "Segments": [ + 0, + 0, + 1, + 3.322, + 0, + 6.644, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandAngleR", + "Segments": [ + 0, + -0.1, + 1, + 3.322, + -0.1, + 6.644, + -0.1, + 9.967, + -0.1, + 0, + 10, + -0.1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandDhangeL", + "Segments": [ + 0, + 0, + 1, + 3.322, + 0, + 6.644, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandAngleL", + "Segments": [ + 0, + 0.1, + 1, + 3.322, + 0.1, + 6.644, + 0.1, + 9.967, + 0.1, + 0, + 10, + 0.1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairFront", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairSide", + "Segments": [ + 0, + 0, + 1, + 3.322, + 0, + 6.644, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairBack", + "Segments": [ + 0, + 0, + 1, + 0.633, + 0, + 1.267, + 0, + 1.9, + 0, + 1, + 2.489, + 0, + 3.078, + 0, + 3.667, + 0, + 1, + 4.411, + 0, + 5.156, + 0, + 5.9, + 0, + 1, + 6.767, + 0, + 7.633, + 0, + 8.5, + 0, + 1, + 8.989, + 0, + 9.478, + 0, + 9.967, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Core", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Hoho001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Brow001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Tear", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01EyeBall001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Eye001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Nose001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Mouth001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Face001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Ear001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Neck001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairFront001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairSide001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairBack001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmRB001", + "Segments": [ + 0, + 0, + 2, + 9.97, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmLB001", + "Segments": [ + 0, + 0, + 2, + 9.97, + 0, + 0, + 10, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmRA001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmLA001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Body001", + "Segments": [ + 0, + 1, + 2, + 9.97, + 1, + 0, + 10, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Sketch", + "Segments": [ + 0, + 0, + 2, + 9.97, + 0, + 0, + 10, + 0 + ] + } + ] +} diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_m05.motion3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_m05.motion3.json new file mode 100644 index 0000000..1c7c630 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_m05.motion3.json @@ -0,0 +1,1443 @@ +{ + "Version": 3, + "Meta": { + "Duration": 2.03, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 63, + "TotalSegmentCount": 179, + "TotalPointCount": 434, + "UserDataCount": 0, + "TotalUserDataSize": 0, + "FadeInTime": 0.499, + "FadeOutTime": 0.499 + }, + "Curves": [ + { + "Target": "Model", + "Id": "Opacity", + "Segments": [ + 0, + 1, + 1, + 0.67, + 1, + 1.33, + 1, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleX", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 0, + 0.367, + 0, + 1, + 0.489, + 0, + 0.611, + 0, + 0.733, + 0, + 1, + 0.833, + 0, + 0.933, + 0, + 1.033, + 0, + 1, + 1.222, + 0, + 1.411, + 0, + 1.6, + 0, + 1, + 1.733, + 0, + 1.867, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleY", + "Segments": [ + 0, + 0, + 1, + 0.1, + 0, + 0.2, + -5.165, + 0.3, + -9, + 1, + 0.333, + -10.278, + 0.367, + -10, + 0.4, + -10, + 1, + 0.489, + -10, + 0.578, + 13, + 0.667, + 13, + 1, + 0.767, + 13, + 0.867, + -9, + 0.967, + -9, + 1, + 1.156, + -9, + 1.344, + 0, + 1.533, + 0, + 1, + 1.689, + 0, + 1.844, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleZ", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamTere", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamFaceForm", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeLOpen", + "Segments": [ + 0, + 2, + 1, + 0.233, + 2, + 0.467, + 2, + 0.7, + 2, + 1, + 0.756, + 2, + 0.811, + 0, + 0.867, + 0, + 1, + 0.967, + 0, + 1.067, + 0, + 1.167, + 0, + 1, + 1.244, + 0, + 1.322, + 2, + 1.4, + 2, + 1, + 1.6, + 2, + 1.8, + 2, + 2, + 2, + 0, + 2.033, + 2 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeLSmile", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeROpen", + "Segments": [ + 0, + 2, + 1, + 0.233, + 2, + 0.467, + 2, + 0.7, + 2, + 1, + 0.756, + 2, + 0.811, + 0, + 0.867, + 0, + 1, + 0.967, + 0, + 1.067, + 0, + 1.167, + 0, + 1, + 1.244, + 0, + 1.322, + 2, + 1.4, + 2, + 1, + 1.6, + 2, + 1.8, + 2, + 2, + 2, + 0, + 2.033, + 2 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeRSmile", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeForm", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallForm", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamTear", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallX", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.422, + 0, + 0.511, + 0, + 0.6, + 0, + 1, + 0.633, + 0, + 0.667, + 0, + 0.7, + 0, + 1, + 1.133, + 0, + 1.567, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallY", + "Segments": [ + 0, + 0.3, + 1, + 0.111, + 0.3, + 0.222, + 0.3, + 0.333, + 0.3, + 1, + 0.422, + 0.3, + 0.511, + 0.3, + 0.6, + 0.3, + 1, + 0.633, + 0.3, + 0.667, + 0.3, + 0.7, + 0.3, + 1, + 0.756, + 0.3, + 0.811, + -0.2, + 0.867, + -0.2, + 1, + 0.967, + -0.2, + 1.067, + -0.2, + 1.167, + -0.2, + 1, + 1.244, + -0.2, + 1.322, + 0.3, + 1.4, + 0.3, + 1, + 1.6, + 0.3, + 1.8, + 0.3, + 2, + 0.3, + 0, + 2.033, + 0.3 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLY", + "Segments": [ + 0, + 1, + 1, + 0.233, + 1, + 0.467, + 1, + 0.7, + 1, + 1, + 0.756, + 1, + 0.811, + 0.7, + 0.867, + 0.7, + 1, + 0.967, + 0.7, + 1.067, + 0.7, + 1.167, + 0.7, + 1, + 1.244, + 0.7, + 1.322, + 1, + 1.4, + 1, + 1, + 1.6, + 1, + 1.8, + 1, + 2, + 1, + 0, + 2.033, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRY", + "Segments": [ + 0, + 1, + 1, + 0.233, + 1, + 0.467, + 1, + 0.7, + 1, + 1, + 0.756, + 1, + 0.811, + 0.7, + 0.867, + 0.7, + 1, + 0.967, + 0.7, + 1.067, + 0.7, + 1.167, + 0.7, + 1, + 1.244, + 0.7, + 1.322, + 1, + 1.4, + 1, + 1, + 1.6, + 1, + 1.8, + 1, + 2, + 1, + 0, + 2.033, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLX", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRX", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLAngle", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRAngle", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLForm", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRForm", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamMouthForm", + "Segments": [ + 0, + -0.84, + 1, + 0.667, + -0.84, + 1.333, + -0.84, + 2, + -0.84, + 0, + 2.033, + -0.84 + ] + }, + { + "Target": "Parameter", + "Id": "ParamMouthOpenY", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamScarf", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleX", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleY", + "Segments": [ + 0, + 0, + 1, + 0.133, + 0, + 0.267, + -2, + 0.4, + -2, + 1, + 0.533, + -2, + 0.667, + 2, + 0.8, + 2, + 1, + 0.911, + 2, + 1.022, + 0, + 1.133, + 0, + 1, + 1.422, + 0, + 1.711, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleZ", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyUpper", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBreath", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBustY", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmLA", + "Segments": [ + 0, + -0.16, + 1, + 0.189, + -0.16, + 0.378, + -0.16, + 0.567, + -0.16, + 1, + 0.678, + -0.16, + 0.789, + -0.026, + 0.9, + -0.026, + 1, + 1, + -0.026, + 1.1, + -0.182, + 1.2, + -0.182, + 1, + 1.322, + -0.182, + 1.444, + -0.16, + 1.567, + -0.16, + 1, + 1.711, + -0.16, + 1.856, + -0.16, + 2, + -0.16, + 0, + 2.033, + -0.16 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmRA", + "Segments": [ + 0, + -0.15, + 1, + 0.189, + -0.15, + 0.378, + -0.15, + 0.567, + -0.15, + 1, + 0.678, + -0.15, + 0.789, + -0.025, + 0.9, + -0.025, + 1, + 1, + -0.025, + 1.1, + -0.181, + 1.2, + -0.181, + 1, + 1.322, + -0.181, + 1.444, + -0.15, + 1.567, + -0.15, + 1, + 1.711, + -0.15, + 1.856, + -0.15, + 2, + -0.15, + 0, + 2.033, + -0.15 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmLB", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmRB", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandChangeR", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandAngleR", + "Segments": [ + 0, + 0, + 1, + 0.189, + 0, + 0.378, + 0, + 0.567, + 0, + 1, + 0.644, + 0, + 0.722, + 0.614, + 0.8, + 0.614, + 1, + 0.889, + 0.614, + 0.978, + -0.1, + 1.067, + -0.1, + 1, + 1.178, + -0.1, + 1.289, + 0, + 1.4, + 0, + 1, + 1.6, + 0, + 1.8, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandDhangeL", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandAngleL", + "Segments": [ + 0, + 0, + 1, + 0.189, + 0, + 0.378, + 0, + 0.567, + 0, + 1, + 0.644, + 0, + 0.722, + -0.6, + 0.8, + -0.6, + 1, + 0.889, + -0.6, + 0.978, + 0.1, + 1.067, + 0.1, + 1, + 1.178, + 0.1, + 1.289, + 0, + 1.4, + 0, + 1, + 1.6, + 0, + 1.8, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairFront", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairSide", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairBack", + "Segments": [ + 0, + 0, + 1, + 0.667, + 0, + 1.333, + 0, + 2, + 0, + 0, + 2.033, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Core", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Hoho001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Brow001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Tear", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01EyeBall001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Eye001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Nose001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Mouth001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Face001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Ear001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Neck001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairFront001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairSide001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairBack001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmRB001", + "Segments": [ + 0, + 0, + 2, + 2, + 0, + 0, + 2.03, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmLB001", + "Segments": [ + 0, + 0, + 2, + 2, + 0, + 0, + 2.03, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmRA001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmLA001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Body001", + "Segments": [ + 0, + 1, + 2, + 2, + 1, + 0, + 2.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Sketch", + "Segments": [ + 0, + 0, + 2, + 2, + 0, + 0, + 2.03, + 0 + ] + } + ] +} diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_m07.motion3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_m07.motion3.json new file mode 100644 index 0000000..a7d6d86 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_m07.motion3.json @@ -0,0 +1,1497 @@ +{ + "Version": 3, + "Meta": { + "Duration": 3.93, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 63, + "TotalSegmentCount": 187, + "TotalPointCount": 458, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Model", + "Id": "Opacity", + "Segments": [ + 0, + 1, + 1, + 1.3, + 1, + 2.6, + 1, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleX", + "Segments": [ + 0, + 0, + 1, + 0.467, + 0, + 0.933, + 9.534, + 1.4, + 14, + 1, + 1.567, + 15.595, + 1.733, + 15, + 1.9, + 15, + 1, + 2.289, + 15, + 2.678, + 0, + 3.067, + 0, + 1, + 3.344, + 0, + 3.622, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleY", + "Segments": [ + 0, + 0, + 1, + 0.244, + 0, + 0.489, + 0.061, + 0.733, + -1, + 1, + 0.9, + -1.723, + 1.067, + -13, + 1.233, + -13, + 1, + 1.422, + -13, + 1.611, + 5, + 1.8, + 5, + 1, + 2.189, + 5, + 2.578, + 0, + 2.967, + 0, + 1, + 3.278, + 0, + 3.589, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleZ", + "Segments": [ + 0, + 0, + 1, + 0.367, + 0, + 0.733, + -18, + 1.1, + -18, + 1, + 1.4, + -18, + 1.7, + -18, + 2, + -18, + 1, + 2.3, + -18, + 2.6, + 18, + 2.9, + 18, + 1, + 3.233, + 18, + 3.567, + 18, + 3.9, + 18, + 0, + 3.933, + 18 + ] + }, + { + "Target": "Parameter", + "Id": "ParamTere", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamFaceForm", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeLOpen", + "Segments": [ + 0, + 1, + 1, + 0.344, + 1, + 0.689, + 1, + 1.033, + 1, + 1, + 1.078, + 1, + 1.122, + 0, + 1.167, + 0, + 1, + 1.222, + 0, + 1.278, + 0, + 1.333, + 0, + 1, + 1.411, + 0, + 1.489, + 1, + 1.567, + 1, + 1, + 2.344, + 1, + 3.122, + 1, + 3.9, + 1, + 0, + 3.933, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeLSmile", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeROpen", + "Segments": [ + 0, + 1, + 1, + 0.344, + 1, + 0.689, + 1, + 1.033, + 1, + 1, + 1.078, + 1, + 1.122, + 0, + 1.167, + 0, + 1, + 1.222, + 0, + 1.278, + 0, + 1.333, + 0, + 1, + 1.411, + 0, + 1.489, + 1, + 1.567, + 1, + 1, + 2.344, + 1, + 3.122, + 1, + 3.9, + 1, + 0, + 3.933, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeRSmile", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeForm", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallForm", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamTear", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallX", + "Segments": [ + 0, + 0, + 1, + 0.3, + 0, + 0.6, + -0.27, + 0.9, + -0.27, + 1, + 0.989, + -0.27, + 1.078, + -0.27, + 1.167, + -0.27, + 1, + 1.2, + -0.27, + 1.233, + 0.37, + 1.267, + 0.37, + 1, + 1.378, + 0.37, + 1.489, + 0.37, + 1.6, + 0.37, + 1, + 1.944, + 0.37, + 2.289, + 0, + 2.633, + 0, + 1, + 3.056, + 0, + 3.478, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallY", + "Segments": [ + 0, + 0, + 1, + 0.3, + 0, + 0.6, + 0.58, + 0.9, + 0.58, + 1, + 0.989, + 0.58, + 1.078, + 0.58, + 1.167, + 0.58, + 1, + 1.2, + 0.58, + 1.233, + 0.29, + 1.267, + 0.29, + 1, + 1.378, + 0.29, + 1.489, + 0.29, + 1.6, + 0.29, + 1, + 1.944, + 0.29, + 2.289, + 0, + 2.633, + 0, + 1, + 3.056, + 0, + 3.478, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLY", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRY", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLX", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRX", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLAngle", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRAngle", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLForm", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRForm", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamMouthForm", + "Segments": [ + 0, + 1, + 1, + 1.3, + 1, + 2.6, + 1, + 3.9, + 1, + 0, + 3.933, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamMouthOpenY", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamScarf", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleX", + "Segments": [ + 0, + 0, + 1, + 0.533, + 0, + 1.067, + -7, + 1.6, + -7, + 1, + 2.056, + -7, + 2.511, + 4, + 2.967, + 4, + 1, + 3.278, + 4, + 3.589, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleY", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleZ", + "Segments": [ + 0, + 0, + 1, + 0.578, + 0, + 1.156, + -10, + 1.733, + -10, + 1, + 2.1, + -10, + 2.467, + -7.702, + 2.833, + -4, + 1, + 3.122, + -1.083, + 3.411, + 0, + 3.7, + 0, + 1, + 3.767, + 0, + 3.833, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyUpper", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBreath", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBustY", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmLA", + "Segments": [ + 0, + 0.5, + 1, + 0.156, + 0.5, + 0.311, + 0.734, + 0.467, + 0.76, + 1, + 1.533, + 0.94, + 2.6, + 1, + 3.667, + 1, + 1, + 3.744, + 1, + 3.822, + 0.5, + 3.9, + 0.5, + 0, + 3.933, + 0.5 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmRA", + "Segments": [ + 0, + 0.5, + 1, + 0.156, + 0.5, + 0.311, + 0.734, + 0.467, + 0.76, + 1, + 1.533, + 0.94, + 2.6, + 1, + 3.667, + 1, + 1, + 3.744, + 1, + 3.822, + 0.5, + 3.9, + 0.5, + 0, + 3.933, + 0.5 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmLB", + "Segments": [ + 0, + 2.5, + 1, + 0.133, + 2.5, + 0.267, + 2.3, + 0.4, + 2.3, + 1, + 0.567, + 2.3, + 0.733, + 2.42, + 0.9, + 2.9, + 1, + 1.067, + 3.38, + 1.233, + 3.8, + 1.4, + 3.8, + 1, + 1.556, + 3.8, + 1.711, + 3.857, + 1.867, + 3.7, + 1, + 2.356, + 3.207, + 2.844, + 2.4, + 3.333, + 2.4, + 1, + 3.522, + 2.4, + 3.711, + 2.5, + 3.9, + 2.5, + 0, + 3.933, + 2.5 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmRB", + "Segments": [ + 0, + 3.5, + 1, + 0.133, + 3.5, + 0.267, + 3.1, + 0.4, + 3.1, + 1, + 0.733, + 3.1, + 1.067, + 5, + 1.4, + 5, + 1, + 1.522, + 5, + 1.644, + 5, + 1.767, + 5, + 1, + 2, + 5, + 2.233, + 4.5, + 2.467, + 4.5, + 1, + 2.944, + 4.5, + 3.422, + 4.5, + 3.9, + 4.5, + 0, + 3.933, + 4.5 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandChangeR", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandAngleR", + "Segments": [ + 0, + 0, + 1, + 0.089, + 0, + 0.178, + -0.42, + 0.267, + -0.42, + 1, + 0.344, + -0.42, + 0.422, + 0.35, + 0.5, + 0.35, + 1, + 0.833, + 0.35, + 1.167, + 0, + 1.5, + 0, + 1, + 1.622, + 0, + 1.744, + 0.36, + 1.867, + 0.36, + 1, + 2.111, + 0.36, + 2.356, + -1, + 2.6, + -1, + 1, + 2.867, + -1, + 3.133, + -0.92, + 3.4, + -0.92, + 1, + 3.567, + -0.92, + 3.733, + -0.92, + 3.9, + -0.92, + 0, + 3.933, + -0.92 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandDhangeL", + "Segments": [ + 0, + 0.5, + 1, + 0.278, + 0.5, + 0.556, + 0.5, + 0.833, + 0.5, + 1, + 0.9, + 0.5, + 0.967, + 0, + 1.033, + 0, + 1, + 1.989, + 0, + 2.944, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandAngleL", + "Segments": [ + 0, + 0, + 1, + 0.089, + 0, + 0.178, + -0.39, + 0.267, + -0.39, + 1, + 0.344, + -0.39, + 0.422, + -0.33, + 0.5, + -0.33, + 1, + 0.656, + -0.33, + 0.811, + -0.68, + 0.967, + -0.68, + 1, + 1.222, + -0.68, + 1.478, + 0.36, + 1.733, + 0.36, + 1, + 1.933, + 0.36, + 2.133, + 0.36, + 2.333, + 0.36, + 1, + 2.422, + 0.36, + 2.511, + -0.26, + 2.6, + -0.26, + 1, + 2.767, + -0.26, + 2.933, + -0.26, + 3.1, + -0.26, + 1, + 3.367, + -0.26, + 3.633, + -0.26, + 3.9, + -0.26, + 0, + 3.933, + -0.26 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairFront", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairSide", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairBack", + "Segments": [ + 0, + 0, + 1, + 1.3, + 0, + 2.6, + 0, + 3.9, + 0, + 0, + 3.933, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Core", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Hoho001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Brow001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Tear", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01EyeBall001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Eye001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Nose001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Mouth001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Face001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Ear001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Neck001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairFront001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairSide001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairBack001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmRB001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmLB001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmRA001", + "Segments": [ + 0, + 0, + 2, + 3.9, + 0, + 0, + 3.93, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmLA001", + "Segments": [ + 0, + 0, + 2, + 3.9, + 0, + 0, + 3.93, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Body001", + "Segments": [ + 0, + 1, + 2, + 3.9, + 1, + 0, + 3.93, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Sketch", + "Segments": [ + 0, + 0, + 2, + 3.9, + 0, + 0, + 3.93, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_m14.motion3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_m14.motion3.json new file mode 100644 index 0000000..a0c55c0 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_m14.motion3.json @@ -0,0 +1,2176 @@ +{ + "Version": 3, + "Meta": { + "Duration": 3.03, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 63, + "TotalSegmentCount": 284, + "TotalPointCount": 749, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Model", + "Id": "Opacity", + "Segments": [ + 0, + 1, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleX", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.589, + 0, + 0.678, + 1, + 0.767, + 1, + 1, + 0.889, + 1, + 1.011, + 1.06, + 1.133, + 0.632, + 1, + 1.256, + 0.204, + 1.378, + -2, + 1.5, + -2, + 1, + 2, + -2, + 2.5, + -2, + 3, + -2, + 0, + 3.033, + -2 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleY", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 0, + 0.367, + 0, + 1, + 0.433, + 0, + 0.5, + -1, + 0.567, + -1, + 1, + 0.689, + -1, + 0.811, + 16, + 0.933, + 16, + 1, + 1.067, + 16, + 1.2, + 16.106, + 1.333, + 13.915, + 1, + 1.444, + 12.09, + 1.556, + -1, + 1.667, + -1, + 1, + 2.111, + -1, + 2.556, + -1, + 3, + -1, + 0, + 3.033, + -1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleZ", + "Segments": [ + 0, + 0, + 1, + 0.211, + 0, + 0.422, + 0, + 0.633, + 0, + 1, + 0.767, + 0, + 0.9, + -9, + 1.033, + -9, + 1, + 1.1, + -9, + 1.167, + -9.696, + 1.233, + -5.567, + 1, + 1.356, + 2.004, + 1.478, + 15.49, + 1.6, + 19, + 1, + 1.778, + 19.291, + 1.956, + 18, + 2.133, + 18, + 1, + 2.422, + 18, + 2.711, + 18, + 3, + 18, + 0, + 3.033, + 18 + ] + }, + { + "Target": "Parameter", + "Id": "ParamTere", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamFaceForm", + "Segments": [ + 0, + 0, + 1, + 1, + 0, + 2, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeLOpen", + "Segments": [ + 0, + 1, + 1, + 0.167, + 1, + 0.333, + 1, + 0.5, + 1, + 1, + 0.589, + 1, + 0.678, + 0, + 0.767, + 0, + 1, + 0.8, + 0, + 0.833, + 0, + 0.867, + 0, + 1, + 0.956, + 0, + 1.044, + 1.332, + 1.133, + 1.616, + 1, + 1.256, + 2.007, + 1.378, + 2, + 1.5, + 2, + 1, + 1.667, + 2, + 1.833, + 2, + 2, + 2, + 1, + 2.044, + 2, + 2.089, + 0, + 2.133, + 0, + 1, + 2.167, + 0, + 2.2, + 0, + 2.233, + 0, + 1, + 2.311, + 0, + 2.389, + 2, + 2.467, + 2, + 1, + 2.644, + 2, + 2.822, + 2, + 3, + 2, + 0, + 3.033, + 2 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeLSmile", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeROpen", + "Segments": [ + 0, + 1, + 1, + 0.167, + 1, + 0.333, + 1, + 0.5, + 1, + 1, + 0.589, + 1, + 0.678, + 0, + 0.767, + 0, + 1, + 0.8, + 0, + 0.833, + 0, + 0.867, + 0, + 1, + 0.956, + 0, + 1.044, + 1.332, + 1.133, + 1.616, + 1, + 1.256, + 2.007, + 1.378, + 2, + 1.5, + 2, + 1, + 1.667, + 2, + 1.833, + 2, + 2, + 2, + 1, + 2.044, + 2, + 2.089, + 0, + 2.133, + 0, + 1, + 2.167, + 0, + 2.2, + 0, + 2.233, + 0, + 1, + 2.311, + 0, + 2.389, + 2, + 2.467, + 2, + 1, + 2.644, + 2, + 2.822, + 2, + 3, + 2, + 0, + 3.033, + 2 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeRSmile", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeForm", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0.3, + 1.5, + 0.3, + 1, + 2, + 0.3, + 2.5, + 0.3, + 3, + 0.3, + 0, + 3.033, + 0.3 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallForm", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamTear", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallX", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallY", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0.039, + 1.133, + 0.123, + 1, + 1.256, + 0.172, + 1.378, + 0.2, + 1.5, + 0.2, + 1, + 1.667, + 0.2, + 1.833, + 0.2, + 2, + 0.2, + 1, + 2.044, + 0.2, + 2.089, + -0.2, + 2.133, + -0.2, + 1, + 2.167, + -0.2, + 2.2, + -0.2, + 2.233, + -0.2, + 1, + 2.311, + -0.2, + 2.389, + 0.2, + 2.467, + 0.2, + 1, + 2.644, + 0.2, + 2.822, + 0.2, + 3, + 0.2, + 0, + 3.033, + 0.2 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLY", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.589, + 0, + 0.678, + -0.1, + 0.767, + -0.1, + 1, + 0.8, + -0.1, + 0.833, + -0.1, + 0.867, + -0.1, + 1, + 0.956, + -0.1, + 1.044, + 0.291, + 1.133, + 0.493, + 1, + 1.256, + 0.77, + 1.378, + 0.8, + 1.5, + 0.8, + 1, + 2, + 0.8, + 2.5, + 0.8, + 3, + 0.8, + 0, + 3.033, + 0.8 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRY", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.589, + 0, + 0.678, + -0.1, + 0.767, + -0.1, + 1, + 0.8, + -0.1, + 0.833, + -0.1, + 0.867, + -0.1, + 1, + 0.956, + -0.1, + 1.044, + 0.291, + 1.133, + 0.493, + 1, + 1.256, + 0.77, + 1.378, + 0.8, + 1.5, + 0.8, + 1, + 2, + 0.8, + 2.5, + 0.8, + 3, + 0.8, + 0, + 3.033, + 0.8 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLX", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0.039, + 1.133, + 0.123, + 1, + 1.256, + 0.172, + 1.378, + 0.2, + 1.5, + 0.2, + 1, + 2, + 0.2, + 2.5, + 0.2, + 3, + 0.2, + 0, + 3.033, + 0.2 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRX", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0.039, + 1.133, + 0.123, + 1, + 1.256, + 0.172, + 1.378, + 0.2, + 1.5, + 0.2, + 1, + 2, + 0.2, + 2.5, + 0.2, + 3, + 0.2, + 0, + 3.033, + 0.2 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLAngle", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0.039, + 1.133, + 0.123, + 1, + 1.256, + 0.172, + 1.378, + 0.2, + 1.5, + 0.2, + 1, + 2, + 0.2, + 2.5, + 0.2, + 3, + 0.2, + 0, + 3.033, + 0.2 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRAngle", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0.039, + 1.133, + 0.123, + 1, + 1.256, + 0.172, + 1.378, + 0.2, + 1.5, + 0.2, + 1, + 2, + 0.2, + 2.5, + 0.2, + 3, + 0.2, + 0, + 3.033, + 0.2 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLForm", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0.078, + 1.133, + 0.246, + 1, + 1.256, + 0.344, + 1.378, + 0.4, + 1.5, + 0.4, + 1, + 2, + 0.4, + 2.5, + 0.4, + 3, + 0.4, + 0, + 3.033, + 0.4 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRForm", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0.078, + 1.133, + 0.246, + 1, + 1.256, + 0.344, + 1.378, + 0.4, + 1.5, + 0.4, + 1, + 2, + 0.4, + 2.5, + 0.4, + 3, + 0.4, + 0, + 3.033, + 0.4 + ] + }, + { + "Target": "Parameter", + "Id": "ParamMouthForm", + "Segments": [ + 0, + 1, + 1, + 0.167, + 1, + 0.333, + 1, + 0.5, + 1, + 1, + 0.589, + 1, + 0.678, + -0.5, + 0.767, + -0.5, + 1, + 0.889, + -0.5, + 1.011, + -0.232, + 1.133, + -0.232, + 1, + 1.256, + -0.232, + 1.378, + -1, + 1.5, + -1, + 1, + 2, + -1, + 2.5, + -1, + 3, + -1, + 0, + 3.033, + -1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamMouthOpenY", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamScarf", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleX", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.589, + 0, + 0.678, + 3, + 0.767, + 3, + 1, + 0.889, + 3, + 1.011, + 1.294, + 1.133, + -0.616, + 1, + 1.256, + -2.526, + 1.378, + -3, + 1.5, + -3, + 1, + 2, + -3, + 2.5, + -3, + 3, + -3, + 0, + 3.033, + -3 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleY", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 7, + 1.133, + 7, + 1, + 1.256, + 7, + 1.378, + -9, + 1.5, + -9, + 1, + 2, + -9, + 2.5, + -9, + 3, + -9, + 0, + 3.033, + -9 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleZ", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.589, + 0, + 0.678, + -4.509, + 0.767, + -4.728, + 1, + 0.889, + -5.029, + 1.011, + -5, + 1.133, + -5, + 1, + 1.256, + -5, + 1.378, + 7, + 1.5, + 7, + 1, + 2, + 7, + 2.5, + 7, + 3, + 7, + 0, + 3.033, + 7 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyUpper", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.589, + 0, + 0.678, + -1.507, + 0.767, + -1.507, + 1, + 0.889, + -1.507, + 1.011, + -1.675, + 1.133, + -0.529, + 1, + 1.256, + 0.618, + 1.378, + 10, + 1.5, + 10, + 1, + 2, + 10, + 2.5, + 10, + 3, + 10, + 0, + 3.033, + 10 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBreath", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBustY", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmLA", + "Segments": [ + 0, + 1, + 1, + 0.167, + 1, + 0.333, + 1, + 0.5, + 1, + 1, + 0.711, + 1, + 0.922, + 0.3, + 1.133, + 0.3, + 1, + 1.256, + 0.3, + 1.378, + 0.327, + 1.5, + 0.4, + 1, + 1.6, + 0.459, + 1.7, + 0.5, + 1.8, + 0.5, + 1, + 2.2, + 0.5, + 2.6, + 0.5, + 3, + 0.5, + 0, + 3.033, + 0.5 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmRA", + "Segments": [ + 0, + 1, + 1, + 0.167, + 1, + 0.333, + 1, + 0.5, + 1, + 1, + 0.711, + 1, + 0.922, + 0.3, + 1.133, + 0.3, + 1, + 1.256, + 0.3, + 1.378, + 0.327, + 1.5, + 0.4, + 1, + 1.6, + 0.459, + 1.7, + 0.5, + 1.8, + 0.5, + 1, + 2.2, + 0.5, + 2.6, + 0.5, + 3, + 0.5, + 0, + 3.033, + 0.5 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmLB", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmRB", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandChangeR", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.744, + 0, + 0.989, + 0, + 1.233, + 0, + 1, + 1.467, + 0, + 1.7, + 0, + 1.933, + 0, + 1, + 2.289, + 0, + 2.644, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandAngleR", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.589, + 0, + 0.678, + 0.9, + 0.767, + 0.9, + 1, + 0.922, + 0.9, + 1.078, + 0.681, + 1.233, + 0, + 1, + 1.344, + -0.486, + 1.456, + -0.9, + 1.567, + -0.9, + 1, + 1.689, + -0.9, + 1.811, + -0.6, + 1.933, + -0.6, + 1, + 2.289, + -0.6, + 2.644, + -0.6, + 3, + -0.6, + 0, + 3.033, + -0.6 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandDhangeL", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.744, + 0, + 0.989, + 0, + 1.233, + 0, + 1, + 1.467, + 0, + 1.7, + 0, + 1.933, + 0, + 1, + 2.289, + 0, + 2.644, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandAngleL", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.589, + 0, + 0.678, + -0.9, + 0.767, + -0.9, + 1, + 0.922, + -0.9, + 1.078, + -0.681, + 1.233, + 0, + 1, + 1.344, + 0.486, + 1.456, + 0.9, + 1.567, + 0.9, + 1, + 1.689, + 0.9, + 1.811, + 0.6, + 1.933, + 0.6, + 1, + 2.289, + 0.6, + 2.644, + 0.6, + 3, + 0.6, + 0, + 3.033, + 0.6 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairFront", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairSide", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairBack", + "Segments": [ + 0, + 0, + 1, + 0.167, + 0, + 0.333, + 0, + 0.5, + 0, + 1, + 0.711, + 0, + 0.922, + 0, + 1.133, + 0, + 1, + 1.256, + 0, + 1.378, + 0, + 1.5, + 0, + 1, + 2, + 0, + 2.5, + 0, + 3, + 0, + 0, + 3.033, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Core", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Hoho001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Brow001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Tear", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01EyeBall001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Eye001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Nose001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Mouth001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Face001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Ear001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Neck001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairFront001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairSide001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairBack001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmRB001", + "Segments": [ + 0, + 0, + 2, + 3, + 0, + 0, + 3.03, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmLB001", + "Segments": [ + 0, + 0, + 2, + 3, + 0, + 0, + 3.03, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmRA001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmLA001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Body001", + "Segments": [ + 0, + 1, + 2, + 3, + 1, + 0, + 3.03, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Sketch", + "Segments": [ + 0, + 0, + 2, + 3, + 0, + 0, + 3.03, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_m15.motion3.json b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_m15.motion3.json new file mode 100644 index 0000000..c774ddf --- /dev/null +++ b/_ts_packages/packages/cortex-ui/public/live2d-models/haru/motion/haru_g_m15.motion3.json @@ -0,0 +1,1357 @@ +{ + "Version": 3, + "Meta": { + "Duration": 5.33, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 63, + "TotalSegmentCount": 167, + "TotalPointCount": 398, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Model", + "Id": "Opacity", + "Segments": [ + 0, + 1, + 1, + 1.77, + 1, + 3.53, + 1, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleX", + "Segments": [ + 0, + 0, + 1, + 0.2, + 0, + 0.4, + -3, + 0.6, + -3, + 1, + 1.333, + -3, + 2.067, + -3, + 2.8, + -3, + 1, + 3.056, + -3, + 3.311, + 1, + 3.567, + 1, + 1, + 3.833, + 1, + 4.1, + 0, + 4.367, + 0, + 1, + 4.678, + 0, + 4.989, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleY", + "Segments": [ + 0, + 0, + 1, + 0.2, + 0, + 0.4, + -10, + 0.6, + -10, + 1, + 1.333, + -10, + 2.067, + -10, + 2.8, + -10, + 1, + 3.056, + -10, + 3.311, + 11, + 3.567, + 11, + 1, + 3.833, + 11, + 4.1, + 0, + 4.367, + 0, + 1, + 4.678, + 0, + 4.989, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamAngleZ", + "Segments": [ + 0, + 0, + 1, + 0.211, + 0, + 0.422, + -30, + 0.633, + -30, + 1, + 0.689, + -30, + 0.744, + -30, + 0.8, + -30, + 1, + 1.1, + -30, + 1.4, + 30, + 1.7, + 30, + 1, + 1.744, + 30, + 1.789, + 30, + 1.833, + 30, + 1, + 2.167, + 30, + 2.5, + -30, + 2.833, + -30, + 1, + 2.878, + -30, + 2.922, + -30, + 2.967, + -30, + 1, + 3.222, + -30, + 3.478, + 0, + 3.733, + 0, + 1, + 4.256, + 0, + 4.778, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamTere", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamFaceForm", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeLOpen", + "Segments": [ + 0, + 1, + 1, + 1.767, + 1, + 3.533, + 1, + 5.3, + 1, + 0, + 5.333, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeLSmile", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeROpen", + "Segments": [ + 0, + 1, + 1, + 1.767, + 1, + 3.533, + 1, + 5.3, + 1, + 0, + 5.333, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeRSmile", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeForm", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallForm", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamTear", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallX", + "Segments": [ + 0, + 0, + 1, + 0.2, + 0, + 0.4, + 0.03, + 0.6, + 0.03, + 1, + 0.989, + 0.03, + 1.378, + 0.03, + 1.767, + 0.03, + 1, + 2.144, + 0.03, + 2.522, + 0.03, + 2.9, + 0.03, + 1, + 3.1, + 0.03, + 3.3, + -0.1, + 3.5, + -0.1, + 1, + 3.767, + -0.1, + 4.033, + 0, + 4.3, + 0, + 1, + 4.633, + 0, + 4.967, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamEyeBallY", + "Segments": [ + 0, + 0, + 1, + 0.2, + 0, + 0.4, + 0.67, + 0.6, + 0.67, + 1, + 0.989, + 0.67, + 1.378, + 0.67, + 1.767, + 0.67, + 1, + 2.144, + 0.67, + 2.522, + 0.67, + 2.9, + 0.67, + 1, + 3.1, + 0.67, + 3.3, + -0.21, + 3.5, + -0.21, + 1, + 3.767, + -0.21, + 4.033, + 0, + 4.3, + 0, + 1, + 4.633, + 0, + 4.967, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLY", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRY", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLX", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRX", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLAngle", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRAngle", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowLForm", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBrowRForm", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamMouthForm", + "Segments": [ + 0, + 1, + 1, + 1.767, + 1, + 3.533, + 1, + 5.3, + 1, + 0, + 5.333, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "ParamMouthOpenY", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamScarf", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleX", + "Segments": [ + 0, + 0, + 1, + 0.322, + 0, + 0.644, + 6, + 0.967, + 6, + 1, + 1.322, + 6, + 1.678, + -2, + 2.033, + -2, + 1, + 2.344, + -2, + 2.656, + 0, + 2.967, + 0, + 1, + 3.178, + 0, + 3.389, + -3, + 3.6, + -3, + 1, + 3.833, + -3, + 4.067, + 0, + 4.3, + 0, + 1, + 4.633, + 0, + 4.967, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleY", + "Segments": [ + 0, + 0, + 1, + 0.967, + 0, + 1.933, + 0, + 2.9, + 0, + 1, + 3.111, + 0, + 3.322, + 2, + 3.533, + 2, + 1, + 3.767, + 2, + 4, + 0, + 4.233, + 0, + 1, + 4.589, + 0, + 4.944, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyAngleZ", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBodyUpper", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBreath", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamBustY", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmLA", + "Segments": [ + 0, + 0.5, + 1, + 0.156, + 0.5, + 0.311, + 0.75, + 0.467, + 0.76, + 1, + 1.978, + 0.855, + 3.489, + 0.89, + 5, + 0.89, + 1, + 5.1, + 0.89, + 5.2, + 0.5, + 5.3, + 0.5, + 0, + 5.333, + 0.5 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmRA", + "Segments": [ + 0, + 0.5, + 1, + 0.156, + 0.5, + 0.311, + 0.746, + 0.467, + 0.76, + 1, + 1.978, + 0.899, + 3.489, + 0.95, + 5, + 0.95, + 1, + 5.1, + 0.95, + 5.2, + 0.5, + 5.3, + 0.5, + 0, + 5.333, + 0.5 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmLB", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamArmRB", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandChangeR", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandAngleR", + "Segments": [ + 0, + 0.24, + 1, + 0.356, + 0.24, + 0.711, + 0, + 1.067, + 0, + 1, + 1.389, + 0, + 1.711, + 0.24, + 2.033, + 0.24, + 1, + 3.122, + 0.24, + 4.211, + 0.24, + 5.3, + 0.24, + 0, + 5.333, + 0.24 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandDhangeL", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHandAngleL", + "Segments": [ + 0, + -0.24, + 1, + 0.356, + -0.24, + 0.711, + 0, + 1.067, + 0, + 1, + 1.389, + 0, + 1.711, + -0.24, + 2.033, + -0.24, + 1, + 3.122, + -0.24, + 4.211, + -0.24, + 5.3, + -0.24, + 0, + 5.333, + -0.24 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairFront", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairSide", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "ParamHairBack", + "Segments": [ + 0, + 0, + 1, + 1.767, + 0, + 3.533, + 0, + 5.3, + 0, + 0, + 5.333, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Core", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Hoho001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Brow001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Tear", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01EyeBall001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Eye001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Nose001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Mouth001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Face001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Ear001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Neck001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairFront001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairSide001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01HairBack001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmRB001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmLB001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmRA001", + "Segments": [ + 0, + 0, + 2, + 5.3, + 0, + 0, + 5.33, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01ArmLA001", + "Segments": [ + 0, + 0, + 2, + 5.3, + 0, + 0, + 5.33, + 0 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Body001", + "Segments": [ + 0, + 1, + 2, + 5.3, + 1, + 0, + 5.33, + 1 + ] + }, + { + "Target": "PartOpacity", + "Id": "Part01Sketch", + "Segments": [ + 0, + 0, + 2, + 5.3, + 0, + 0, + 5.33, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/_ts_packages/packages/cortex-ui/src/components/Live2DPet.svelte b/_ts_packages/packages/cortex-ui/src/components/Live2DPet.svelte new file mode 100644 index 0000000..25950d7 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/src/components/Live2DPet.svelte @@ -0,0 +1,169 @@ + + +
+ + {#if load_error} +
{load_error}
+ {/if} +
+ + diff --git a/_ts_packages/packages/cortex-ui/src/lib/live2d/beat-sync.ts b/_ts_packages/packages/cortex-ui/src/lib/live2d/beat-sync.ts new file mode 100644 index 0000000..b1a8290 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/src/lib/live2d/beat-sync.ts @@ -0,0 +1,63 @@ +// Ported from AIRI (https://github.com/moeru-ai/airi), MIT License. +// Original: packages/stage-ui-live2d/src/composables/live2d/beat-sync.ts +// Adapted: STUB for Wave 21. The full 359-LOC AIRI implementation drives +// head yaw/roll from audio BPM with semi-implicit Euler springs and four +// stylistic patterns ('punchy-v' | 'balanced-v' | 'swing-lr' | 'sway-sine'). +// cortex-ui does not yet have TTS/audio wired in, so every method here is +// a no-op that matches the AIRI shape so call-sites compile unchanged. +// Full port scheduled for Wave 22 (TTS integration). + +export type BeatSyncStyleName = + | 'punchy-v' + | 'balanced-v' + | 'swing-lr' + | 'sway-sine'; + +export interface BeatBaseAngles { + x: number; + y: number; + z: number; +} + +export interface BeatSyncController { + readonly targetX: number; + readonly targetY: number; + readonly targetZ: number; + readonly velocityX: number; + readonly velocityY: number; + readonly velocityZ: number; + updateTargets(now: number): void; + scheduleBeat(timestamp?: number | null): void; + setStyle(style: BeatSyncStyleName): void; + getStyle(): BeatSyncStyleName; + setAutoStyleShift(enabled: boolean): void; + debugState(): { + primed: boolean; + patternStarted: boolean; + bpm: number | null; + style: BeatSyncStyleName; + }; +} + +export function createBeatSyncController(): BeatSyncController { + let style: BeatSyncStyleName = 'balanced-v'; + return { + targetX: 0, + targetY: 0, + targetZ: 0, + velocityX: 0, + velocityY: 0, + velocityZ: 0, + updateTargets: () => { /* stub: Wave 22 will drive head sway. */ }, + scheduleBeat: () => { /* stub: Wave 22 will consume TTS beats. */ }, + setStyle: (s) => { style = s; }, + getStyle: () => style, + setAutoStyleShift: () => { /* stub */ }, + debugState: () => ({ + primed: false, + patternStarted: false, + bpm: null, + style, + }), + }; +} diff --git a/_ts_packages/packages/cortex-ui/src/lib/live2d/emotions.ts b/_ts_packages/packages/cortex-ui/src/lib/live2d/emotions.ts new file mode 100644 index 0000000..ef82d37 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/src/lib/live2d/emotions.ts @@ -0,0 +1,72 @@ +// Ported from AIRI (https://github.com/moeru-ai/airi), MIT License. +// Original: packages/stage-ui-live2d/src/constants/emotions.ts +// Copy-as-is; no Vue/Svelte API surface here, just an enum + lookup tables. + +export enum Emotion { + Happy = 'happy', + Sad = 'sad', + Angry = 'angry', + Think = 'think', + Surprise = 'surprised', + Awkward = 'awkward', + Question = 'question', + Curious = 'curious', + Neutral = 'neutral', +} + +export const EMOTION_VALUES = Object.values(Emotion); + +export const EmotionHappyMotionName = 'Happy'; +export const EmotionSadMotionName = 'Sad'; +export const EmotionAngryMotionName = 'Angry'; +export const EmotionAwkwardMotionName = 'Awkward'; +export const EmotionThinkMotionName = 'Think'; +export const EmotionSurpriseMotionName = 'Surprise'; +export const EmotionQuestionMotionName = 'Question'; +export const EmotionNeutralMotionName = 'Idle'; +export const EmotionCuriousMotionName = 'Curious'; + +export const EMOTION_EmotionMotionName_value: Record = { + [Emotion.Happy]: EmotionHappyMotionName, + [Emotion.Sad]: EmotionSadMotionName, + [Emotion.Angry]: EmotionAngryMotionName, + [Emotion.Think]: EmotionThinkMotionName, + [Emotion.Surprise]: EmotionSurpriseMotionName, + [Emotion.Awkward]: EmotionAwkwardMotionName, + [Emotion.Question]: EmotionQuestionMotionName, + [Emotion.Neutral]: EmotionNeutralMotionName, + [Emotion.Curious]: EmotionCuriousMotionName, +}; + +export const EMOTION_VRMExpressionName_value: Record = { + [Emotion.Happy]: 'happy', + [Emotion.Sad]: 'sad', + [Emotion.Angry]: 'angry', + [Emotion.Think]: undefined, + [Emotion.Surprise]: 'surprised', + [Emotion.Awkward]: undefined, + [Emotion.Question]: undefined, + [Emotion.Neutral]: undefined, + [Emotion.Curious]: 'surprised', +}; + +/** + * Cortex mood (4 buckets used by PetEditor) → Live2D Emotion. + * This is the bridge from the existing pet-editor sprite moods to the + * finer-grained AIRI emotion enum. + */ +export type CortexMood = 'idle' | 'happy' | 'think' | 'sleep'; + +export function moodToEmotion(mood: CortexMood): Emotion { + switch (mood) { + case 'happy': + return Emotion.Happy; + case 'think': + return Emotion.Think; + case 'sleep': + return Emotion.Neutral; // no "Sleep" emotion; closest resting state. + case 'idle': + default: + return Emotion.Neutral; + } +} diff --git a/_ts_packages/packages/cortex-ui/src/lib/live2d/expression-controller.ts b/_ts_packages/packages/cortex-ui/src/lib/live2d/expression-controller.ts new file mode 100644 index 0000000..bb61d6e --- /dev/null +++ b/_ts_packages/packages/cortex-ui/src/lib/live2d/expression-controller.ts @@ -0,0 +1,180 @@ +// Ported from AIRI (https://github.com/moeru-ai/airi), MIT License. +// Original: packages/stage-ui-live2d/src/composables/live2d/expression-controller.ts +// Adapted: AIRI's version maintains its own Pinia-backed parameter blend store +// to support authoring UI (ExpressionPanel) on top of exp3 files. In +// cortex-ui we delegate exp3 parsing to pixi-live2d-display's own +// ExpressionManager — the Svelte component merely drives emotion→expression +// selection. This controller tracks the lookup layer (Emotion → exp name) +// plus a small active-parameter registry for optional per-frame overrides. + +import type { + CubismCoreModelLike, + ExpressionManagerLike, + Live2DModelLike, +} from './types'; + +export type ExpressionBlendMode = 'Add' | 'Multiply' | 'Overwrite'; + +export interface ExpressionEntry { + name: string; + parameterId: string; + blend: ExpressionBlendMode; + /** Runtime-mutable: current blended target. */ + currentValue: number; + /** The Cubism parameter's initial value at load time. */ + modelDefault: number; + /** The "intended activation value" from the exp3 file. */ + targetValue: number; +} + +export interface ExpressionController { + setActive(name: string): boolean; + clear(): void; + listAvailable(): string[]; + /** Apply any registered manual overrides every frame. */ + applyExpressions(coreModel: CubismCoreModelLike): void; + registerOverride(entry: ExpressionEntry): void; + removeOverride(parameterId: string): void; + debugActive(): string | null; +} + +interface ControllerState { + active: string | null; + overrides: Map; + // Previous-frame active param IDs, so we can explicitly reset stale writes + // on the inactive→active transition (port of AIRI's `activeLastFrame`). + lastFrame: Set; +} + +function initialState(): ControllerState { + return { + active: null, + overrides: new Map(), + lastFrame: new Set(), + }; +} + +/** + * Create an expression controller bound to a Live2D model. + * + * For Cubism 4 models loaded via pixi-live2d-display, the `expressionManager` + * is populated from `model3.json.FileReferences.Expressions`. This wrapper + * adds: + * - `setActive(name)`: idempotent, logs on unknown name. + * - `applyExpressions(coreModel)`: apply manual parameter overrides on top + * of whatever the native expression manager has already written. + */ +export function createExpressionController( + model: Live2DModelLike, +): ExpressionController { + const state = initialState(); + + function getManager(): ExpressionManagerLike | null { + return model.internalModel?.motionManager?.expressionManager ?? null; + } + + function listAvailable(): string[] { + const em = getManager(); + if (!em?.definitions) return []; + return em.definitions.map((d, i) => d.Name ?? d.name ?? String(i)); + } + + function setActive(name: string): boolean { + const em = getManager(); + if (!em) return false; + const available = listAvailable(); + if (!available.includes(name)) { + // Try numeric index as fallback (pixi-live2d-display accepts both). + const asNum = Number(name); + if (!Number.isInteger(asNum)) return false; + } + try { + const r = em.setExpression(name); + if (r === false) return false; + state.active = name; + return true; + } catch { + return false; + } + } + + function clear(): void { + const em = getManager(); + if (em?.resetExpression) { + try { em.resetExpression(); } catch { /* noop */ } + } + state.active = null; + state.overrides.clear(); + state.lastFrame.clear(); + } + + function registerOverride(entry: ExpressionEntry): void { + state.overrides.set(entry.parameterId, entry); + } + + function removeOverride(parameterId: string): void { + state.overrides.delete(parameterId); + } + + // ---- Per-frame -------------------------------------------------------- + + function applyExpressions(coreModel: CubismCoreModelLike): void { + const activeThisFrame = new Set(); + + for (const entry of state.overrides.values()) { + if (isNoop(entry)) continue; + const value = computeBlend(entry, coreModel); + coreModel.setParameterValueById(entry.parameterId, value); + activeThisFrame.add(entry.parameterId); + } + + for (const paramId of state.lastFrame) { + if (!activeThisFrame.has(paramId)) { + const entry = state.overrides.get(paramId); + if (entry) coreModel.setParameterValueById(paramId, entry.modelDefault); + } + } + + state.lastFrame.clear(); + activeThisFrame.forEach((p) => state.lastFrame.add(p)); + } + + return { + setActive, + clear, + listAvailable, + applyExpressions, + registerOverride, + removeOverride, + debugActive: () => state.active, + }; +} + +// ---- Internal pure helpers (blend math, ported verbatim) ------------------ + +function isNoop(entry: ExpressionEntry): boolean { + switch (entry.blend) { + case 'Add': + return entry.currentValue === 0; + case 'Multiply': + return entry.currentValue === 1; + default: + return entry.currentValue === entry.modelDefault; + } +} + +function computeBlend( + entry: ExpressionEntry, + coreModel: CubismCoreModelLike, +): number { + switch (entry.blend) { + case 'Add': + return entry.modelDefault + entry.currentValue; + case 'Multiply': { + const frameValue = coreModel.getParameterValueById(entry.parameterId); + return frameValue * entry.currentValue; + } + default: + return entry.currentValue; + } +} diff --git a/_ts_packages/packages/cortex-ui/src/lib/live2d/motion-manager.ts b/_ts_packages/packages/cortex-ui/src/lib/live2d/motion-manager.ts new file mode 100644 index 0000000..fc305ba --- /dev/null +++ b/_ts_packages/packages/cortex-ui/src/lib/live2d/motion-manager.ts @@ -0,0 +1,194 @@ +// Ported from AIRI (https://github.com/moeru-ai/airi), MIT License. +// Original: packages/stage-ui-live2d/src/composables/live2d/motion-manager.ts +// Adapted from Vue Composition API (Ref + composables + plugin registry) to +// a plain TS state machine + closure. The AIRI version runs a plugin chain +// each frame hooked into pixi-live2d-display's `MotionManager.update`. Our +// cortex-ui use case is coarser: switch emotions on user action, and let +// pixi-live2d-display's built-in idle + eyeBlink loops handle breathing. +// Only idle/Tap motion groups + F01-F08 expressions are mapped. + +import { + Emotion, + EMOTION_EmotionMotionName_value, +} from './emotions'; +import type { MotionManagerLike } from './types'; + +/** + * Which motion group + expression index the AIRI emotion maps to on the + * bundled Haru model. Models with richer per-emotion motion groups + * (`Happy` / `Sad` / ...) are handled by `MotionManager.startMotion` + * falling through to the declared group if present. + */ +export interface EmotionBinding { + /** Motion group name used by `manager.startMotion(group, index)`. */ + group: string; + /** Optional index inside the group; defaults to 0 (first clip). */ + index?: number; + /** Optional expression name inside the model's Expressions array. */ + expression?: string; +} + +/** Haru-specific fallback bindings used when the model lacks emotion-named groups. */ +export const HARU_EMOTION_BINDINGS: Record = { + [Emotion.Neutral]: { group: 'Idle', index: 0, expression: 'f00' }, + [Emotion.Happy]: { group: 'Tap', index: 0, expression: 'f01' }, + [Emotion.Sad]: { group: 'Idle', index: 1, expression: 'f02' }, + [Emotion.Angry]: { group: 'Tap', index: 1, expression: 'f03' }, + [Emotion.Surprise]: { group: 'Tap', index: 0, expression: 'f04' }, + [Emotion.Awkward]: { group: 'Idle', index: 2, expression: 'f05' }, + [Emotion.Think]: { group: 'Idle', index: 0, expression: 'f06' }, + [Emotion.Question]: { group: 'Idle', index: 0, expression: 'f07' }, + [Emotion.Curious]: { group: 'Tap', index: 1, expression: 'f07' }, +}; + +export interface MotionManagerState { + currentEmotion: Emotion; + lastGroup: string | null; + lastIndex: number; +} + +function initialState(): MotionManagerState { + return { + currentEmotion: Emotion.Neutral, + lastGroup: null, + lastIndex: 0, + }; +} + +export interface EmotionMotionManagerOptions { + /** Per-emotion bindings. Defaults to `HARU_EMOTION_BINDINGS`. */ + bindings?: Record; + /** + * Preferred motion group for a named emotion (e.g. `'Happy'`, `'Sad'`). + * If the pixi manager reports a group by this name, it's used in place + * of the generic binding. Defaults to the AIRI convention from + * `EMOTION_EmotionMotionName_value`. + */ + preferNamedGroups?: boolean; + /** Priority passed to `startMotion`. Default 2 (NORMAL in pixi). */ + priority?: number; +} + +/** + * Return value of {@link createEmotionMotionManager}. + */ +export interface EmotionMotionManager { + setEmotion(emotion: Emotion): Promise; + getCurrentEmotion(): Emotion; + /** Re-play the last picked motion (e.g. after model reload). */ + replay(): Promise; + /** Reset state to Neutral. Does NOT call the manager. */ + reset(): void; + /** Expose internal state for tests. */ + debugState(): Readonly; +} + +/** + * Create an emotion-driven motion manager that wraps a + * pixi-live2d-display `MotionManager`. + * + * The returned object is the minimum surface the Svelte component needs: + * `setEmotion(e)` during user interaction, `getCurrentEmotion()` for + * display, `replay()` after reload. + */ +export function createEmotionMotionManager( + manager: MotionManagerLike, + opts: EmotionMotionManagerOptions = {}, +): EmotionMotionManager { + const bindings = opts.bindings ?? HARU_EMOTION_BINDINGS; + const preferNamed = opts.preferNamedGroups ?? true; + const priority = opts.priority ?? 2; + const state: MotionManagerState = initialState(); + + async function setEmotion(emotion: Emotion): Promise { + const binding = pickBinding(manager, emotion, bindings, preferNamed); + state.currentEmotion = emotion; + state.lastGroup = binding.group; + state.lastIndex = binding.index ?? 0; + + const ok = await playMotion(manager, binding, priority); + if (ok && binding.expression) { + await applyExpression(manager, binding.expression); + } + return ok; + } + + function replay(): Promise { + return setEmotion(state.currentEmotion); + } + + function reset(): void { + state.currentEmotion = Emotion.Neutral; + state.lastGroup = null; + state.lastIndex = 0; + } + + return { + setEmotion, + getCurrentEmotion: () => state.currentEmotion, + replay, + reset, + debugState: () => state, + }; +} + +// --------------------------------------------------------------------------- +// Helpers (kept small to honour the 30-line-per-function rule). +// --------------------------------------------------------------------------- + +function pickBinding( + manager: MotionManagerLike, + emotion: Emotion, + bindings: Record, + preferNamed: boolean, +): EmotionBinding { + const fallback = bindings[emotion]; + if (!preferNamed) return fallback; + + const namedGroup = EMOTION_EmotionMotionName_value[emotion]; + if (namedGroup && managerHasGroup(manager, namedGroup)) { + return { group: namedGroup, index: 0, expression: fallback?.expression }; + } + return fallback; +} + +function managerHasGroup(manager: MotionManagerLike, group: string): boolean { + const groups = manager.groups; + if (!groups) return false; + return groups.idle === group || groups.tap === group; +} + +async function playMotion( + manager: MotionManagerLike, + binding: EmotionBinding, + priority: number, +): Promise { + try { + const result = await Promise.resolve( + manager.startMotion(binding.group, binding.index ?? 0, priority), + ); + return result !== false; + } catch (err) { + // Model may lack the requested group/index; fall back to Idle. + try { + await Promise.resolve(manager.startMotion('Idle', 0, priority)); + return true; + } catch { + return false; + } + } +} + +async function applyExpression( + manager: MotionManagerLike, + name: string, +): Promise { + const em = manager.expressionManager; + if (!em) return false; + try { + const r = await Promise.resolve(em.setExpression(name)); + return r !== false; + } catch { + return false; + } +} diff --git a/_ts_packages/packages/cortex-ui/src/lib/live2d/types.ts b/_ts_packages/packages/cortex-ui/src/lib/live2d/types.ts new file mode 100644 index 0000000..95d3caa --- /dev/null +++ b/_ts_packages/packages/cortex-ui/src/lib/live2d/types.ts @@ -0,0 +1,62 @@ +// Ported from AIRI (https://github.com/moeru-ai/airi), MIT License. +// Original: packages/stage-ui-live2d/src/composables/live2d/motion-manager.ts (types) +// Adapted: Vue Ref types removed; pure structural types only. + +import type { Emotion } from './emotions'; + +/** + * Minimal shape we need from the Cubism 4 core model at runtime. + * We deliberately keep this abstract so the component can run against a + * stub (tests) or the real pixi-live2d-display Cubism4InternalModel.coreModel. + */ +export interface CubismCoreModelLike { + getParameterValueById(id: string): number; + setParameterValueById(id: string, value: number): void; +} + +/** + * Shape of the motion manager exposed by pixi-live2d-display. + * Structural typing only; we never construct one of these ourselves. + */ +export interface MotionManagerLike { + startMotion(group: string, index?: number, priority?: number): Promise | boolean; + stopAllMotions(): void; + groups?: { idle?: string; tap?: string }; + state?: { currentGroup?: string | null }; +} + +/** + * Shape of the expression manager exposed by pixi-live2d-display. + */ +export interface ExpressionManagerLike { + setExpression(name: string | number): Promise | boolean; + resetExpression?(): void; + definitions?: Array<{ Name?: string; name?: string }>; +} + +/** + * Shape of the Live2DModel instance we wrap. + * We use a `Live2DModelLike` interface so the Svelte component can be + * tested with a tiny stub instead of requiring a real WebGL canvas. + */ +export interface Live2DModelLike { + internalModel: { + motionManager: MotionManagerLike & { + expressionManager?: ExpressionManagerLike; + }; + coreModel: CubismCoreModelLike; + }; + on?(event: string, handler: () => void): void; + destroy?(options?: { children?: boolean; texture?: boolean; baseTexture?: boolean }): void; +} + +export interface Live2DPetProps { + /** Absolute or relative URL to the `*.model3.json` settings file. */ + modelPath: string; + /** Current emotion; re-evaluated reactively. */ + mood?: Emotion; + /** Width of the PIXI canvas in CSS pixels. Defaults to 256. */ + width?: number; + /** Height of the PIXI canvas in CSS pixels. Defaults to 256. */ + height?: number; +} diff --git a/_ts_packages/packages/cortex-ui/src/routes/PetEditor.svelte b/_ts_packages/packages/cortex-ui/src/routes/PetEditor.svelte index 8bd833e..cf376b8 100644 --- a/_ts_packages/packages/cortex-ui/src/routes/PetEditor.svelte +++ b/_ts_packages/packages/cortex-ui/src/routes/PetEditor.svelte @@ -3,6 +3,8 @@ import type { CortexConfig } from '../lib/config'; import type { PetManifest } from '../lib/types'; import { pet as fetch_pet } from '../lib/api'; + import Live2DPet from '../components/Live2DPet.svelte'; + import { moodToEmotion, type CortexMood } from '../lib/live2d/emotions'; interface Props { config: CortexConfig; @@ -11,10 +13,15 @@ const { config, user_id }: Props = $props(); + const KEY_RENDERER = 'kei-cortex-renderer'; + const DEFAULT_LIVE2D_MODEL = + './live2d-models/haru/haru_greeter_t03.model3.json'; + let manifest = $state(null); let error = $state(null); let loading = $state(true); - let mood = $state<'idle' | 'happy' | 'think' | 'sleep'>('idle'); + let mood = $state('idle'); + let renderer = $state<'sprite32' | 'live2d'>('sprite32'); const AVAILABLE = { cat: ['idle', 'happy', 'think', 'sleep'] as const, @@ -23,7 +30,6 @@ blob: ['idle'] as const, }; - // Pick species from pet name first letter, defaulting to cat (most states available) function species_for(pet_name: string): 'cat' | 'dog' | 'owl' | 'blob' { const first = pet_name.trim().toLowerCase().charAt(0); if (first === 'd') return 'dog'; @@ -32,13 +38,32 @@ return 'cat'; } - function sprite_src(pet_name: string, m: typeof mood): string { + function sprite_src(pet_name: string, m: CortexMood): string { const sp = species_for(pet_name); const states = AVAILABLE[sp] as readonly string[]; const state = states.includes(m) ? m : 'idle'; return `./sprites/32px/${sp}-${state}.png`; } + function load_renderer_pref(m: PetManifest | null): 'sprite32' | 'live2d' { + // Preferred source of truth (future): `pet.toml` `renderer` field. + const tomlField = (m?.meta as { renderer?: unknown } | undefined)?.renderer; + if (tomlField === 'live2d' || tomlField === 'sprite32') return tomlField; + // Fallback: localStorage set by Setup wizard. + if (typeof localStorage !== 'undefined') { + const stored = localStorage.getItem(KEY_RENDERER); + if (stored === 'live2d' || stored === 'sprite32') return stored; + } + return 'sprite32'; + } + + function toggle_renderer(): void { + renderer = renderer === 'live2d' ? 'sprite32' : 'live2d'; + if (typeof localStorage !== 'undefined') { + localStorage.setItem(KEY_RENDERER, renderer); + } + } + onMount(async () => { if (!user_id) { error = 'missing user_id in route'; @@ -48,6 +73,7 @@ try { const res = await fetch_pet(config, user_id); manifest = res.pet; + renderer = load_renderer_pref(manifest); } catch (e) { error = e instanceof Error ? e.message : String(e); } finally { @@ -60,23 +86,39 @@ {#if manifest}
- {manifest.identity.pet_name} ({mood}) + {#if renderer === 'live2d'} + + {:else} + {manifest.identity.pet_name} ({mood}) + {/if}
{manifest.identity.pet_name}
{#each AVAILABLE[species_for(manifest.identity.pet_name)] as m} {/each}
+
{/if} @@ -109,3 +151,11 @@ {/if} + + diff --git a/_ts_packages/packages/cortex-ui/src/routes/Setup.svelte b/_ts_packages/packages/cortex-ui/src/routes/Setup.svelte index 854c981..dcc1132 100644 --- a/_ts_packages/packages/cortex-ui/src/routes/Setup.svelte +++ b/_ts_packages/packages/cortex-ui/src/routes/Setup.svelte @@ -7,11 +7,21 @@ const { on_saved }: Props = $props(); + const KEY_RENDERER = 'kei-cortex-renderer'; + const existing = load_config(); let daemon_url = $state(existing?.daemon_url ?? 'http://localhost:9797'); let token = $state(existing?.token ?? ''); + let renderer = $state<'sprite32' | 'live2d'>(load_renderer()); let error = $state(null); + function load_renderer(): 'sprite32' | 'live2d' { + if (typeof localStorage === 'undefined') return 'sprite32'; + const stored = localStorage.getItem(KEY_RENDERER); + if (stored === 'live2d' || stored === 'sprite32') return stored; + return 'sprite32'; + } + function submit(event: Event): void { event.preventDefault(); if (!token.trim()) { @@ -19,6 +29,9 @@ return; } save_config({ daemon_url: daemon_url.trim(), token: token.trim() }); + if (typeof localStorage !== 'undefined') { + localStorage.setItem(KEY_RENDERER, renderer); + } error = null; on_saved(); window.location.hash = '#/'; @@ -44,6 +57,30 @@ +
+ Pet renderer + + +
+ {#if error}
{error}
{/if} @@ -52,3 +89,29 @@ + + diff --git a/_ts_packages/packages/cortex-ui/tests/live2d-emotions.test.ts b/_ts_packages/packages/cortex-ui/tests/live2d-emotions.test.ts new file mode 100644 index 0000000..91200a5 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/tests/live2d-emotions.test.ts @@ -0,0 +1,62 @@ +import { describe, it, expect } from 'vitest'; +import { + Emotion, + EMOTION_VALUES, + EMOTION_EmotionMotionName_value, + EMOTION_VRMExpressionName_value, + EmotionNeutralMotionName, + moodToEmotion, +} from '../src/lib/live2d/emotions'; + +describe('emotions enum', () => { + it('contains all 9 AIRI-canonical emotions', () => { + expect(EMOTION_VALUES).toHaveLength(9); + expect(EMOTION_VALUES).toEqual( + expect.arrayContaining([ + Emotion.Happy, + Emotion.Sad, + Emotion.Angry, + Emotion.Think, + Emotion.Surprise, + Emotion.Awkward, + Emotion.Question, + Emotion.Curious, + Emotion.Neutral, + ]), + ); + }); + + it('maps every emotion to a non-empty motion-name string', () => { + for (const e of EMOTION_VALUES) { + const name = EMOTION_EmotionMotionName_value[e]; + expect(typeof name).toBe('string'); + expect(name.length).toBeGreaterThan(0); + } + }); + + it('Neutral maps to Idle (AIRI-canonical group name)', () => { + expect(EMOTION_EmotionMotionName_value[Emotion.Neutral]).toBe('Idle'); + expect(EmotionNeutralMotionName).toBe('Idle'); + }); + + it('VRM table leaves non-VRM-mappable emotions undefined', () => { + expect(EMOTION_VRMExpressionName_value[Emotion.Think]).toBeUndefined(); + expect(EMOTION_VRMExpressionName_value[Emotion.Awkward]).toBeUndefined(); + expect(EMOTION_VRMExpressionName_value[Emotion.Question]).toBeUndefined(); + expect(EMOTION_VRMExpressionName_value[Emotion.Neutral]).toBeUndefined(); + expect(EMOTION_VRMExpressionName_value[Emotion.Happy]).toBe('happy'); + }); + + it('Curious falls back to surprised in VRM map (AIRI convention)', () => { + expect(EMOTION_VRMExpressionName_value[Emotion.Curious]).toBe('surprised'); + }); +}); + +describe('moodToEmotion bridge', () => { + it('maps cortex mood → AIRI emotion deterministically', () => { + expect(moodToEmotion('idle')).toBe(Emotion.Neutral); + expect(moodToEmotion('happy')).toBe(Emotion.Happy); + expect(moodToEmotion('think')).toBe(Emotion.Think); + expect(moodToEmotion('sleep')).toBe(Emotion.Neutral); + }); +}); diff --git a/_ts_packages/packages/cortex-ui/tests/live2d-expression-controller.test.ts b/_ts_packages/packages/cortex-ui/tests/live2d-expression-controller.test.ts new file mode 100644 index 0000000..9817eec --- /dev/null +++ b/_ts_packages/packages/cortex-ui/tests/live2d-expression-controller.test.ts @@ -0,0 +1,98 @@ +import { describe, it, expect, vi } from 'vitest'; +import { + createExpressionController, + type ExpressionEntry, +} from '../src/lib/live2d/expression-controller'; +import type { Live2DModelLike } from '../src/lib/live2d/types'; + +function makeStubModel() { + const paramValues = new Map(); + const getParameterValueById = vi.fn((id: string) => paramValues.get(id) ?? 0); + const setParameterValueById = vi.fn((id: string, v: number) => { + paramValues.set(id, v); + }); + const setExpression = vi.fn(() => true); + const resetExpression = vi.fn(); + const model: Live2DModelLike = { + internalModel: { + motionManager: { + startMotion: vi.fn(() => true), + stopAllMotions: vi.fn(), + expressionManager: { + setExpression, + resetExpression, + definitions: [{ Name: 'f00' }, { Name: 'f01' }], + }, + }, + coreModel: { getParameterValueById, setParameterValueById }, + }, + }; + return { model, setExpression, resetExpression, paramValues, setParameterValueById }; +} + +describe('expression-controller', () => { + it('lists expression definitions from the manager', () => { + const { model } = makeStubModel(); + const c = createExpressionController(model); + expect(c.listAvailable()).toEqual(['f00', 'f01']); + }); + + it('setActive records the active name and calls setExpression', () => { + const { model, setExpression } = makeStubModel(); + const c = createExpressionController(model); + expect(c.setActive('f01')).toBe(true); + expect(c.debugActive()).toBe('f01'); + expect(setExpression).toHaveBeenCalledWith('f01'); + }); + + it('clear() invokes resetExpression and drops all overrides', () => { + const { model, resetExpression } = makeStubModel(); + const c = createExpressionController(model); + c.setActive('f00'); + c.registerOverride(sampleEntry('ParamAngleX', 'Overwrite', 10, 0)); + c.clear(); + expect(resetExpression).toHaveBeenCalled(); + expect(c.debugActive()).toBeNull(); + }); + + it('applyExpressions writes Add-blended value on top of modelDefault', () => { + const { model, setParameterValueById } = makeStubModel(); + const c = createExpressionController(model); + c.registerOverride(sampleEntry('ParamMouthForm', 'Add', 0.3, 0)); + c.applyExpressions(model.internalModel.coreModel); + // Expected write: default (0) + currentValue (0.3) = 0.3 + expect(setParameterValueById).toHaveBeenCalledWith('ParamMouthForm', 0.3); + }); + + it('applyExpressions resets param on active→inactive transition', () => { + const { model, setParameterValueById } = makeStubModel(); + const c = createExpressionController(model); + const entry = sampleEntry('ParamEyeLOpen', 'Multiply', 0.3, 1); + c.registerOverride(entry); + c.applyExpressions(model.internalModel.coreModel); // active + // Now turn the entry into a noop (Multiply * 1 = noop) + entry.currentValue = 1; + c.applyExpressions(model.internalModel.coreModel); // should reset to 1 (default) + const calls = setParameterValueById.mock.calls.filter( + ([id]) => id === 'ParamEyeLOpen', + ); + // Last call on ParamEyeLOpen must be the reset-to-modelDefault (1). + expect(calls.at(-1)?.[1]).toBe(1); + }); +}); + +function sampleEntry( + id: string, + blend: ExpressionEntry['blend'], + current: number, + def: number, +): ExpressionEntry { + return { + name: id, + parameterId: id, + blend, + currentValue: current, + modelDefault: def, + targetValue: current, + }; +} diff --git a/_ts_packages/packages/cortex-ui/tests/live2d-motion-manager.test.ts b/_ts_packages/packages/cortex-ui/tests/live2d-motion-manager.test.ts new file mode 100644 index 0000000..2221503 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/tests/live2d-motion-manager.test.ts @@ -0,0 +1,111 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { Emotion } from '../src/lib/live2d/emotions'; +import { + createEmotionMotionManager, + HARU_EMOTION_BINDINGS, +} from '../src/lib/live2d/motion-manager'; +import type { MotionManagerLike, ExpressionManagerLike } from '../src/lib/live2d/types'; + +function makeStub() { + const calls: Array<{ group: string; index: number; priority: number }> = []; + const expressionCalls: string[] = []; + const expression: ExpressionManagerLike = { + setExpression: vi.fn((name: string) => { + expressionCalls.push(name); + return true; + }), + resetExpression: vi.fn(), + definitions: [ + { Name: 'f00' }, + { Name: 'f01' }, + { Name: 'f02' }, + { Name: 'f03' }, + { Name: 'f04' }, + { Name: 'f05' }, + { Name: 'f06' }, + { Name: 'f07' }, + ], + }; + const mgr: MotionManagerLike & { expressionManager: ExpressionManagerLike } = { + startMotion: vi.fn((group: string, index = 0, priority = 0) => { + calls.push({ group, index, priority }); + return true; + }), + stopAllMotions: vi.fn(), + groups: { idle: 'Idle', tap: 'Tap' }, + state: { currentGroup: null }, + expressionManager: expression, + }; + return { mgr, calls, expressionCalls }; +} + +describe('motion-manager state machine', () => { + beforeEach(() => vi.restoreAllMocks()); + + it('starts in Neutral with no prior calls', () => { + const { mgr } = makeStub(); + const m = createEmotionMotionManager(mgr); + expect(m.getCurrentEmotion()).toBe(Emotion.Neutral); + expect(m.debugState().lastGroup).toBeNull(); + }); + + it('transitions idle → happy → idle, calling startMotion each step', async () => { + const { mgr, calls, expressionCalls } = makeStub(); + const m = createEmotionMotionManager(mgr); + + await m.setEmotion(Emotion.Happy); + expect(m.getCurrentEmotion()).toBe(Emotion.Happy); + const happyBinding = HARU_EMOTION_BINDINGS[Emotion.Happy]; + // Haru has no 'Happy' group so binding falls back to 'Tap'. + expect(calls.at(-1)?.group).toBe(happyBinding.group); + expect(expressionCalls.at(-1)).toBe(happyBinding.expression); + + await m.setEmotion(Emotion.Neutral); + expect(m.getCurrentEmotion()).toBe(Emotion.Neutral); + expect(calls.at(-1)?.group).toBe('Idle'); + expect(calls).toHaveLength(2); + }); + + it('replay() re-invokes startMotion with the last emotion', async () => { + const { mgr, calls } = makeStub(); + const m = createEmotionMotionManager(mgr); + await m.setEmotion(Emotion.Surprise); + const before = calls.length; + await m.replay(); + expect(calls.length).toBe(before + 1); + expect(calls.at(-1)?.group).toBe(calls.at(-2)?.group); + }); + + it('reset() clears state without touching the manager', () => { + const { mgr } = makeStub(); + const m = createEmotionMotionManager(mgr); + m.reset(); + expect(m.getCurrentEmotion()).toBe(Emotion.Neutral); + expect(mgr.startMotion).not.toHaveBeenCalled(); + }); + + it('uses named group when model exposes matching group name', async () => { + const { mgr, calls } = makeStub(); + // Pretend this model has a dedicated "Happy" group. + mgr.groups = { idle: 'Idle', tap: 'Happy' }; + const m = createEmotionMotionManager(mgr); + await m.setEmotion(Emotion.Happy); + expect(calls.at(-1)?.group).toBe('Happy'); + }); + + it('falls back to Idle if startMotion throws', async () => { + const calls: string[] = []; + const mgr: MotionManagerLike = { + startMotion: vi.fn((group: string) => { + calls.push(group); + if (group !== 'Idle') throw new Error('missing group'); + return true; + }), + stopAllMotions: vi.fn(), + groups: { idle: 'Idle' }, + }; + const m = createEmotionMotionManager(mgr, { preferNamedGroups: false }); + await m.setEmotion(Emotion.Angry); + expect(calls).toContain('Idle'); + }); +}); diff --git a/_ts_packages/packages/cortex-ui/tests/live2d-pet-mount.test.ts b/_ts_packages/packages/cortex-ui/tests/live2d-pet-mount.test.ts new file mode 100644 index 0000000..d2ed969 --- /dev/null +++ b/_ts_packages/packages/cortex-ui/tests/live2d-pet-mount.test.ts @@ -0,0 +1,93 @@ +import { describe, it, expect, vi, afterEach } from 'vitest'; +import { render, cleanup } from '@testing-library/svelte'; +import Live2DPet from '../src/components/Live2DPet.svelte'; +import { Emotion } from '../src/lib/live2d/emotions'; + +// Stub pixi-live2d-display/cubism4: Live2DModel.from() returns a fake model +// with the structural shape the motion manager needs. +vi.mock('pixi-live2d-display/cubism4', () => { + const fakeModel = { + x: 0, + y: 0, + width: 100, + height: 100, + scale: { set: vi.fn() }, + internalModel: { + motionManager: { + startMotion: vi.fn(() => true), + stopAllMotions: vi.fn(), + groups: { idle: 'Idle', tap: 'Tap' }, + state: { currentGroup: null }, + expressionManager: { + setExpression: vi.fn(() => true), + resetExpression: vi.fn(), + definitions: [], + }, + }, + coreModel: { + getParameterValueById: vi.fn(() => 0), + setParameterValueById: vi.fn(), + }, + }, + destroy: vi.fn(), + }; + return { + Live2DModel: { + from: vi.fn(async () => fakeModel), + }, + }; +}); + +// Stub pixi.js Application — no WebGL in jsdom. +vi.mock('pixi.js', () => ({ + Application: vi.fn().mockImplementation(() => ({ + stage: { addChild: vi.fn() }, + destroy: vi.fn(), + })), +})); + +describe('Live2DPet component', () => { + afterEach(() => cleanup()); + + it('mounts without throwing and renders a canvas element', () => { + const { container } = render(Live2DPet, { + props: { + modelPath: './live2d-models/haru/haru_greeter_t03.model3.json', + mood: Emotion.Neutral, + width: 128, + height: 128, + }, + }); + const canvas = container.querySelector('canvas.live2d-canvas'); + expect(canvas).not.toBeNull(); + // jsdom exposes no WebGL → component sets load_error and renders hint. + // The canvas still mounts either way; that's the contract we need. + const width = canvas?.getAttribute('width'); + expect(width).toBe('128'); + }); + + it('includes an accessible aria-label on the canvas', () => { + const { container } = render(Live2DPet, { + props: { + modelPath: './live2d-models/haru/haru_greeter_t03.model3.json', + mood: Emotion.Happy, + }, + }); + const canvas = container.querySelector('canvas') as HTMLCanvasElement | null; + expect(canvas?.getAttribute('aria-label')).toContain('happy'); + }); + + it('renders a graceful error hint when WebGL is unavailable (jsdom path)', async () => { + const { container, findByRole } = render(Live2DPet, { + props: { + modelPath: './live2d-models/haru/haru_greeter_t03.model3.json', + mood: Emotion.Neutral, + width: 256, + height: 256, + }, + }); + const hint = await findByRole('status'); + expect(hint.textContent).toMatch(/WebGL/i); + expect(container.querySelector('canvas')).not.toBeNull(); + }); +}); diff --git a/_ts_packages/packages/cortex-ui/vite.config.ts b/_ts_packages/packages/cortex-ui/vite.config.ts index 88be01b..abc1cec 100644 --- a/_ts_packages/packages/cortex-ui/vite.config.ts +++ b/_ts_packages/packages/cortex-ui/vite.config.ts @@ -2,13 +2,19 @@ import { defineConfig } from 'vite'; import { svelte } from '@sveltejs/vite-plugin-svelte'; export default defineConfig({ - plugins: [svelte()], + plugins: [svelte({ hot: false })], base: './', build: { outDir: 'dist', emptyOutDir: true, sourcemap: true, }, + // vitest picks the browser-side Svelte entry, matching how @testing-library/svelte + // mounts components in jsdom. Without this Svelte 5 resolves to the SSR build + // and `mount()` throws `lifecycle_function_unavailable`. + resolve: { + conditions: ['browser'], + }, test: { environment: 'jsdom', environmentOptions: { @@ -18,5 +24,10 @@ export default defineConfig({ }, globals: false, include: ['tests/**/*.test.ts'], + server: { + deps: { + inline: ['@testing-library/svelte'], + }, + }, }, });