@mml-io/3d-web-avatar 0.17.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.js +15 -10
- package/build/index.js.map +2 -2
- package/package.json +9 -9
package/build/index.js
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
// src/character/MMLCharacter.ts
|
2
|
-
import {
|
2
|
+
import {
|
3
|
+
Group,
|
4
|
+
MathUtils
|
5
|
+
} from "three";
|
3
6
|
var MMLCharacter = class {
|
4
7
|
constructor(modelLoader) {
|
5
8
|
this.modelLoader = modelLoader;
|
@@ -20,20 +23,22 @@ var MMLCharacter = class {
|
|
20
23
|
const originGeometry = skinnedMesh.geometry;
|
21
24
|
const boneIndexMap = this.createBoneIndexMap(originSkeleton, targetSkeleton);
|
22
25
|
const newSkinIndexArray = [];
|
23
|
-
|
24
|
-
|
26
|
+
const missingBoneIndices = /* @__PURE__ */ new Set();
|
27
|
+
const skinIndexAttribute = originGeometry.attributes.skinIndex;
|
28
|
+
for (let i = 0; i < skinIndexAttribute.count; i++) {
|
29
|
+
const originIndex = skinIndexAttribute.getComponent(i, 0);
|
25
30
|
const targetIndex = boneIndexMap.get(originIndex);
|
26
31
|
if (targetIndex !== void 0) {
|
27
|
-
|
32
|
+
skinIndexAttribute.setComponent(i, 0, targetIndex);
|
28
33
|
} else {
|
29
|
-
|
30
|
-
newSkinIndexArray.push(0);
|
34
|
+
missingBoneIndices.add(originIndex);
|
31
35
|
}
|
32
36
|
}
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
+
if (missingBoneIndices.size > 0) {
|
38
|
+
console.warn(
|
39
|
+
`Missing bone indices in skinIndex attribute: ${Array.from(missingBoneIndices).join(", ")}`
|
40
|
+
);
|
41
|
+
}
|
37
42
|
}
|
38
43
|
async mergeBodyParts(fullBodyURL, bodyParts) {
|
39
44
|
const group = new Group();
|
package/build/index.js.map
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"version": 3,
|
3
3
|
"sources": ["../src/character/MMLCharacter.ts", "../src/helpers/cloneSkinnedMesh.ts", "../src/helpers/parseMMLDescription.ts", "../src/helpers/createMMLCharacterString.ts"],
|
4
|
-
"sourcesContent": ["import { ModelLoadResult } from \"@mml-io/model-loader\";\nimport { Bone, BufferAttribute, Group, MathUtils, Object3D, Skeleton, SkinnedMesh } from \"three\";\n\nimport { MMLCharacterDescriptionPart } from \"../helpers/parseMMLDescription\";\n\ntype MMLCharacterModelLoader = {\n load: (url: string) => Promise<ModelLoadResult>;\n};\n\nexport class MMLCharacter {\n constructor(private modelLoader: MMLCharacterModelLoader) {}\n\n private createBoneIndexMap(\n originSkeleton: Skeleton,\n targetSkeleton: Skeleton,\n ): Map<number, number> {\n const boneIndexMap = new Map<number, number>();\n\n for (let i = 0; i < originSkeleton.bones.length; i++) {\n const originBone = originSkeleton.bones[i];\n const targetBone = targetSkeleton.bones.find((bone) => bone.name === originBone.name);\n if (targetBone) {\n boneIndexMap.set(i, targetSkeleton.bones.indexOf(targetBone));\n }\n }\n return boneIndexMap;\n }\n\n private remapBoneIndices(skinnedMesh: SkinnedMesh, targetSkeleton: Skeleton): void {\n const originSkeleton = skinnedMesh.skeleton;\n const originGeometry = skinnedMesh.geometry;\n\n const boneIndexMap = this.createBoneIndexMap(originSkeleton, targetSkeleton);\n\n const newSkinIndexArray = [];\n for (let i = 0; i < originGeometry.attributes.skinIndex.array.length; i++) {\n const originIndex = originGeometry.attributes.skinIndex.array[i];\n const targetIndex = boneIndexMap.get(originIndex);\n if (targetIndex !== undefined) {\n newSkinIndexArray.push(targetIndex);\n } else {\n console.error(\"Missing bone index\", originIndex);\n newSkinIndexArray.push(0);\n }\n }\n skinnedMesh.geometry.attributes.skinIndex = new BufferAttribute(\n new Uint8Array(newSkinIndexArray),\n 4,\n );\n }\n\n public async mergeBodyParts(\n fullBodyURL: string,\n bodyParts: Array<MMLCharacterDescriptionPart>,\n ): Promise<Object3D> {\n const group = new Group();\n\n const fullBodyAssetPromise = this.modelLoader.load(fullBodyURL);\n\n const assetPromises: Array<\n Promise<{ asset: ModelLoadResult; part: MMLCharacterDescriptionPart }>\n > = bodyParts.map((part) => {\n return new Promise((resolve) => {\n this.modelLoader.load(part.url).then((asset) => {\n resolve({ asset, part });\n });\n });\n });\n\n const fullBodyAsset = await fullBodyAssetPromise;\n const assets = await Promise.all(assetPromises);\n\n const rawBodyGltf = fullBodyAsset.group;\n const availableBones = new Map<string, Bone>();\n rawBodyGltf.traverse((child) => {\n const asBone = child as Bone;\n if (asBone.isBone) {\n availableBones.set(child.name, asBone);\n }\n\n const asSkinnedMesh = child as SkinnedMesh;\n if (asSkinnedMesh.isSkinnedMesh) {\n asSkinnedMesh.castShadow = true;\n asSkinnedMesh.receiveShadow = true;\n }\n });\n const foundSkinnedMeshes: Array<SkinnedMesh> = [];\n rawBodyGltf.traverse((child) => {\n const asSkinnedMesh = child as SkinnedMesh;\n if (asSkinnedMesh.isSkinnedMesh) {\n foundSkinnedMeshes.push(asSkinnedMesh);\n }\n });\n\n if (foundSkinnedMeshes.length === 0) {\n throw new Error(\"No skinned mesh in base model file\");\n }\n if (foundSkinnedMeshes.length > 1) {\n console.warn(\n \"Multiple skinned meshes in base model file. Expected 1. Using first for skeleton.\",\n );\n }\n const skinnedMesh = foundSkinnedMeshes[0];\n group.add(...foundSkinnedMeshes);\n const sharedSkeleton = skinnedMesh.skeleton;\n group.add(skinnedMesh.skeleton.bones[0]);\n const sharedMatrixWorld = skinnedMesh.matrixWorld;\n\n for (const loadingAsset of assets) {\n const part = loadingAsset.part;\n const rawGltf = loadingAsset.asset;\n\n const modelGroup = rawGltf.group;\n if (part.socket) {\n const socketName = part.socket.socket;\n let bone = availableBones.get(\"root\");\n if (availableBones.has(socketName)) {\n bone = availableBones.get(socketName);\n } else {\n console.warn(\n `WARNING: no bone found for [${socketName}] socket. Attatching to Root bone`,\n );\n }\n if (bone) {\n bone.add(modelGroup);\n\n modelGroup.position.set(\n part.socket.position.x,\n part.socket.position.y,\n part.socket.position.z,\n );\n\n modelGroup.rotation.set(\n MathUtils.degToRad(part.socket.rotation.x),\n MathUtils.degToRad(part.socket.rotation.y),\n MathUtils.degToRad(part.socket.rotation.z),\n );\n\n modelGroup.scale.set(part.socket.scale.x, part.socket.scale.y, part.socket.scale.z);\n }\n } else {\n const skinnedMeshes: Array<SkinnedMesh> = [];\n modelGroup.traverse((child) => {\n const asSkinnedMesh = child as SkinnedMesh;\n if (asSkinnedMesh.isSkinnedMesh) {\n skinnedMeshes.push(asSkinnedMesh);\n }\n });\n for (const skinnedMeshPart of skinnedMeshes) {\n this.remapBoneIndices(skinnedMeshPart, sharedSkeleton);\n skinnedMeshPart.castShadow = true;\n skinnedMeshPart.receiveShadow = true;\n skinnedMeshPart.bind(sharedSkeleton, sharedMatrixWorld!);\n skinnedMeshPart.children = [];\n group.add(skinnedMeshPart);\n }\n }\n }\n return group;\n }\n}\n", "import { Group } from \"three\";\nimport * as SkeletonUtils from \"three/examples/jsm/utils/SkeletonUtils.js\";\n\nexport function cloneSkinnedMesh(model: Group) {\n return SkeletonUtils.clone(model);\n}\n", "export type MMLCharacterDescriptionPart = {\n url: string;\n type?: string;\n socket?: {\n socket: string;\n position: { x: number; y: number; z: number };\n scale: { x: number; y: number; z: number };\n rotation: { x: number; y: number; z: number };\n };\n};\n\nexport type MMLCharacterDescription = {\n base: MMLCharacterDescriptionPart;\n parts: MMLCharacterDescriptionPart[];\n};\n\nexport type LoadingErrors = string[];\n\nexport const parseMMLDescription = (\n mmlDescription: string,\n): [MMLCharacterDescription, LoadingErrors] => {\n const parser: DOMParser = new DOMParser();\n const doc = parser.parseFromString(mmlDescription, \"text/html\");\n\n const tag = (count: number) => {\n return count > 1 ? \"tags\" : \"tag\";\n };\n\n const errors: string[] = [];\n\n const warn = (errorMessage: string) => {\n errors.push(errorMessage);\n console.warn(errorMessage);\n };\n\n const characters = Array.from(doc.body.children).filter(\n (child) => child.tagName.toLowerCase() === \"m-character\",\n );\n const validCharacter = characters.shift();\n\n if (characters.length > 0) {\n const tagStr = tag(characters.length);\n warn(\n `ignoring ${characters.length} extra <m-character> ${tagStr} found in the root of the document (only the first one is valid).`,\n );\n }\n\n const nestedCharacters = doc.querySelectorAll(\"body * m-character\");\n if (nestedCharacters.length > 0) {\n const tagStr = tag(nestedCharacters.length);\n warn(\n `ignoring ${nestedCharacters.length} nested <m-character> ${tagStr} found within other tags. A valid <m-character> tag must be at the root of the document.`,\n );\n }\n\n const rootModels = Array.from(doc.body.children).filter(\n (child) => child.tagName.toLowerCase() === \"m-model\",\n );\n if (rootModels.length > 0) {\n const tagStr = tag(rootModels.length);\n warn(\n `ignoring ${rootModels.length} <m-model> ${tagStr} were found at the root of the document (<m-model> tags must be children of a valid <m-character> tag).`,\n );\n }\n\n let base: MMLCharacterDescriptionPart = { url: \"\" };\n let parts: MMLCharacterDescriptionPart[] = [];\n\n if (validCharacter) {\n const baseSrc = validCharacter.getAttribute(\"src\") ?? \"\";\n base = { url: baseSrc };\n\n const directModelChildren = Array.from(validCharacter.children).filter(\n (child) => child.tagName.toLowerCase() === \"m-model\",\n );\n parts = directModelChildren.map((model) => {\n const partSrc = model.getAttribute(\"src\") ?? \"\";\n\n const socketAttr = model.getAttribute(\"socket\");\n const position = {\n x: parseFloat(model.getAttribute(\"x\") ?? \"0\") || 0,\n y: parseFloat(model.getAttribute(\"y\") ?? \"0\") || 0,\n z: parseFloat(model.getAttribute(\"z\") ?? \"0\") || 0,\n };\n const scale = {\n x: parseFloat(model.getAttribute(\"sx\") ?? \"1\") || 1,\n y: parseFloat(model.getAttribute(\"sy\") ?? \"1\") || 1,\n z: parseFloat(model.getAttribute(\"sz\") ?? \"1\") || 1,\n };\n const rotation = {\n x: parseFloat(model.getAttribute(\"rx\") ?? \"0\") || 0,\n y: parseFloat(model.getAttribute(\"ry\") ?? \"0\") || 0,\n z: parseFloat(model.getAttribute(\"rz\") ?? \"0\") || 0,\n };\n\n const socketObj = socketAttr ? { socket: socketAttr, position, scale, rotation } : undefined;\n\n return { url: partSrc, socket: socketObj };\n });\n\n const wrappedModelTags = Array.from(doc.querySelectorAll(\"m-character m-model\")).filter(\n (model) => !directModelChildren.includes(model),\n );\n if (wrappedModelTags.length > 0) {\n const tagStr = tag(wrappedModelTags.length);\n warn(\n `ignoring ${wrappedModelTags.length} <m-model> ${tagStr} that were found wrapped inside tags other than a valid <m-character> tag.`,\n );\n }\n } else {\n warn(`No valid <m-character> tag was found in the provided document.`);\n }\n\n const characterDescription: MMLCharacterDescription = {\n base: base,\n parts: parts,\n };\n\n return [characterDescription, errors];\n};\n", "import { MMLCharacterDescription } from \"./parseMMLDescription\";\n\nexport const createMMLCharacterString = (characterDescription: MMLCharacterDescription): string => {\n const base = characterDescription.base.url;\n\n const partsTags = characterDescription.parts.map(\n (part) => `<m-model src=\"${part.url}\"${part.type ? ` type=\"${part.type}\"` : \"\"}></m-model>`,\n );\n\n return `<m-character src=\"${base}\">\n ${partsTags.join(\"\\n \")}\n</m-character>`;\n};\n"],
|
5
|
-
"mappings": ";AACA,
|
4
|
+
"sourcesContent": ["import { ModelLoadResult } from \"@mml-io/model-loader\";\nimport {\n Bone,\n BufferAttribute,\n Group,\n InterleavedBufferAttribute,\n MathUtils,\n Object3D,\n Skeleton,\n SkinnedMesh,\n} from \"three\";\n\nimport { MMLCharacterDescriptionPart } from \"../helpers/parseMMLDescription\";\n\ntype MMLCharacterModelLoader = {\n load: (url: string) => Promise<ModelLoadResult>;\n};\n\nexport class MMLCharacter {\n constructor(private modelLoader: MMLCharacterModelLoader) {}\n\n private createBoneIndexMap(\n originSkeleton: Skeleton,\n targetSkeleton: Skeleton,\n ): Map<number, number> {\n const boneIndexMap = new Map<number, number>();\n\n for (let i = 0; i < originSkeleton.bones.length; i++) {\n const originBone = originSkeleton.bones[i];\n const targetBone = targetSkeleton.bones.find((bone) => bone.name === originBone.name);\n if (targetBone) {\n boneIndexMap.set(i, targetSkeleton.bones.indexOf(targetBone));\n }\n }\n return boneIndexMap;\n }\n\n private remapBoneIndices(skinnedMesh: SkinnedMesh, targetSkeleton: Skeleton): void {\n const originSkeleton = skinnedMesh.skeleton;\n const originGeometry = skinnedMesh.geometry;\n\n const boneIndexMap = this.createBoneIndexMap(originSkeleton, targetSkeleton);\n\n const newSkinIndexArray = [];\n const missingBoneIndices = new Set();\n\n const skinIndexAttribute = originGeometry.attributes.skinIndex;\n for (let i = 0; i < skinIndexAttribute.count; i++) {\n const originIndex = skinIndexAttribute.getComponent(i, 0);\n const targetIndex = boneIndexMap.get(originIndex);\n if (targetIndex !== undefined) {\n skinIndexAttribute.setComponent(i, 0, targetIndex);\n } else {\n missingBoneIndices.add(originIndex);\n }\n }\n\n if (missingBoneIndices.size > 0) {\n console.warn(\n `Missing bone indices in skinIndex attribute: ${Array.from(missingBoneIndices).join(\", \")}`,\n );\n }\n }\n\n public async mergeBodyParts(\n fullBodyURL: string,\n bodyParts: Array<MMLCharacterDescriptionPart>,\n ): Promise<Object3D> {\n const group = new Group();\n\n const fullBodyAssetPromise = this.modelLoader.load(fullBodyURL);\n\n const assetPromises: Array<\n Promise<{ asset: ModelLoadResult; part: MMLCharacterDescriptionPart }>\n > = bodyParts.map((part) => {\n return new Promise((resolve) => {\n this.modelLoader.load(part.url).then((asset) => {\n resolve({ asset, part });\n });\n });\n });\n\n const fullBodyAsset = await fullBodyAssetPromise;\n const assets = await Promise.all(assetPromises);\n\n const rawBodyGltf = fullBodyAsset.group;\n const availableBones = new Map<string, Bone>();\n rawBodyGltf.traverse((child) => {\n const asBone = child as Bone;\n if (asBone.isBone) {\n availableBones.set(child.name, asBone);\n }\n\n const asSkinnedMesh = child as SkinnedMesh;\n if (asSkinnedMesh.isSkinnedMesh) {\n asSkinnedMesh.castShadow = true;\n asSkinnedMesh.receiveShadow = true;\n }\n });\n const foundSkinnedMeshes: Array<SkinnedMesh> = [];\n rawBodyGltf.traverse((child) => {\n const asSkinnedMesh = child as SkinnedMesh;\n if (asSkinnedMesh.isSkinnedMesh) {\n foundSkinnedMeshes.push(asSkinnedMesh);\n }\n });\n\n if (foundSkinnedMeshes.length === 0) {\n throw new Error(\"No skinned mesh in base model file\");\n }\n if (foundSkinnedMeshes.length > 1) {\n console.warn(\n \"Multiple skinned meshes in base model file. Expected 1. Using first for skeleton.\",\n );\n }\n const skinnedMesh = foundSkinnedMeshes[0];\n group.add(...foundSkinnedMeshes);\n const sharedSkeleton = skinnedMesh.skeleton;\n group.add(skinnedMesh.skeleton.bones[0]);\n const sharedMatrixWorld = skinnedMesh.matrixWorld;\n\n for (const loadingAsset of assets) {\n const part = loadingAsset.part;\n const rawGltf = loadingAsset.asset;\n\n const modelGroup = rawGltf.group;\n if (part.socket) {\n const socketName = part.socket.socket;\n let bone = availableBones.get(\"root\");\n if (availableBones.has(socketName)) {\n bone = availableBones.get(socketName);\n } else {\n console.warn(\n `WARNING: no bone found for [${socketName}] socket. Attatching to Root bone`,\n );\n }\n if (bone) {\n bone.add(modelGroup);\n\n modelGroup.position.set(\n part.socket.position.x,\n part.socket.position.y,\n part.socket.position.z,\n );\n\n modelGroup.rotation.set(\n MathUtils.degToRad(part.socket.rotation.x),\n MathUtils.degToRad(part.socket.rotation.y),\n MathUtils.degToRad(part.socket.rotation.z),\n );\n\n modelGroup.scale.set(part.socket.scale.x, part.socket.scale.y, part.socket.scale.z);\n }\n } else {\n const skinnedMeshes: Array<SkinnedMesh> = [];\n modelGroup.traverse((child) => {\n const asSkinnedMesh = child as SkinnedMesh;\n if (asSkinnedMesh.isSkinnedMesh) {\n skinnedMeshes.push(asSkinnedMesh);\n }\n });\n for (const skinnedMeshPart of skinnedMeshes) {\n this.remapBoneIndices(skinnedMeshPart, sharedSkeleton);\n skinnedMeshPart.castShadow = true;\n skinnedMeshPart.receiveShadow = true;\n skinnedMeshPart.bind(sharedSkeleton, sharedMatrixWorld!);\n skinnedMeshPart.children = [];\n group.add(skinnedMeshPart);\n }\n }\n }\n return group;\n }\n}\n", "import { Group } from \"three\";\nimport * as SkeletonUtils from \"three/examples/jsm/utils/SkeletonUtils.js\";\n\nexport function cloneSkinnedMesh(model: Group) {\n return SkeletonUtils.clone(model);\n}\n", "export type MMLCharacterDescriptionPart = {\n url: string;\n type?: string;\n socket?: {\n socket: string;\n position: { x: number; y: number; z: number };\n scale: { x: number; y: number; z: number };\n rotation: { x: number; y: number; z: number };\n };\n};\n\nexport type MMLCharacterDescription = {\n base: MMLCharacterDescriptionPart;\n parts: MMLCharacterDescriptionPart[];\n};\n\nexport type LoadingErrors = string[];\n\nexport const parseMMLDescription = (\n mmlDescription: string,\n): [MMLCharacterDescription, LoadingErrors] => {\n const parser: DOMParser = new DOMParser();\n const doc = parser.parseFromString(mmlDescription, \"text/html\");\n\n const tag = (count: number) => {\n return count > 1 ? \"tags\" : \"tag\";\n };\n\n const errors: string[] = [];\n\n const warn = (errorMessage: string) => {\n errors.push(errorMessage);\n console.warn(errorMessage);\n };\n\n const characters = Array.from(doc.body.children).filter(\n (child) => child.tagName.toLowerCase() === \"m-character\",\n );\n const validCharacter = characters.shift();\n\n if (characters.length > 0) {\n const tagStr = tag(characters.length);\n warn(\n `ignoring ${characters.length} extra <m-character> ${tagStr} found in the root of the document (only the first one is valid).`,\n );\n }\n\n const nestedCharacters = doc.querySelectorAll(\"body * m-character\");\n if (nestedCharacters.length > 0) {\n const tagStr = tag(nestedCharacters.length);\n warn(\n `ignoring ${nestedCharacters.length} nested <m-character> ${tagStr} found within other tags. A valid <m-character> tag must be at the root of the document.`,\n );\n }\n\n const rootModels = Array.from(doc.body.children).filter(\n (child) => child.tagName.toLowerCase() === \"m-model\",\n );\n if (rootModels.length > 0) {\n const tagStr = tag(rootModels.length);\n warn(\n `ignoring ${rootModels.length} <m-model> ${tagStr} were found at the root of the document (<m-model> tags must be children of a valid <m-character> tag).`,\n );\n }\n\n let base: MMLCharacterDescriptionPart = { url: \"\" };\n let parts: MMLCharacterDescriptionPart[] = [];\n\n if (validCharacter) {\n const baseSrc = validCharacter.getAttribute(\"src\") ?? \"\";\n base = { url: baseSrc };\n\n const directModelChildren = Array.from(validCharacter.children).filter(\n (child) => child.tagName.toLowerCase() === \"m-model\",\n );\n parts = directModelChildren.map((model) => {\n const partSrc = model.getAttribute(\"src\") ?? \"\";\n\n const socketAttr = model.getAttribute(\"socket\");\n const position = {\n x: parseFloat(model.getAttribute(\"x\") ?? \"0\") || 0,\n y: parseFloat(model.getAttribute(\"y\") ?? \"0\") || 0,\n z: parseFloat(model.getAttribute(\"z\") ?? \"0\") || 0,\n };\n const scale = {\n x: parseFloat(model.getAttribute(\"sx\") ?? \"1\") || 1,\n y: parseFloat(model.getAttribute(\"sy\") ?? \"1\") || 1,\n z: parseFloat(model.getAttribute(\"sz\") ?? \"1\") || 1,\n };\n const rotation = {\n x: parseFloat(model.getAttribute(\"rx\") ?? \"0\") || 0,\n y: parseFloat(model.getAttribute(\"ry\") ?? \"0\") || 0,\n z: parseFloat(model.getAttribute(\"rz\") ?? \"0\") || 0,\n };\n\n const socketObj = socketAttr ? { socket: socketAttr, position, scale, rotation } : undefined;\n\n return { url: partSrc, socket: socketObj };\n });\n\n const wrappedModelTags = Array.from(doc.querySelectorAll(\"m-character m-model\")).filter(\n (model) => !directModelChildren.includes(model),\n );\n if (wrappedModelTags.length > 0) {\n const tagStr = tag(wrappedModelTags.length);\n warn(\n `ignoring ${wrappedModelTags.length} <m-model> ${tagStr} that were found wrapped inside tags other than a valid <m-character> tag.`,\n );\n }\n } else {\n warn(`No valid <m-character> tag was found in the provided document.`);\n }\n\n const characterDescription: MMLCharacterDescription = {\n base: base,\n parts: parts,\n };\n\n return [characterDescription, errors];\n};\n", "import { MMLCharacterDescription } from \"./parseMMLDescription\";\n\nexport const createMMLCharacterString = (characterDescription: MMLCharacterDescription): string => {\n const base = characterDescription.base.url;\n\n const partsTags = characterDescription.parts.map(\n (part) => `<m-model src=\"${part.url}\"${part.type ? ` type=\"${part.type}\"` : \"\"}></m-model>`,\n );\n\n return `<m-character src=\"${base}\">\n ${partsTags.join(\"\\n \")}\n</m-character>`;\n};\n"],
|
5
|
+
"mappings": "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",
|
6
6
|
"names": []
|
7
7
|
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@mml-io/3d-web-avatar",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.19.0",
|
4
4
|
"publishConfig": {
|
5
5
|
"access": "public"
|
6
6
|
},
|
@@ -20,17 +20,17 @@
|
|
20
20
|
"test": "NODE_OPTIONS=--experimental-vm-modules jest"
|
21
21
|
},
|
22
22
|
"dependencies": {
|
23
|
-
"@mml-io/model-loader": "0.
|
24
|
-
"react": "^18.
|
25
|
-
"react-dom": "^18.
|
23
|
+
"@mml-io/model-loader": "0.17.1",
|
24
|
+
"react": "^18.3.1",
|
25
|
+
"react-dom": "^18.3.1",
|
26
26
|
"three": "0.163.0"
|
27
27
|
},
|
28
28
|
"devDependencies": {
|
29
|
-
"@types/node": "^20.
|
30
|
-
"@types/react": "^18.
|
31
|
-
"@types/react-dom": "^18.
|
29
|
+
"@types/node": "^20.14.10",
|
30
|
+
"@types/react": "^18.3.3",
|
31
|
+
"@types/react-dom": "^18.3.0",
|
32
32
|
"@types/three": "0.163.0",
|
33
|
-
"esbuild-css-modules-plugin": "3.1.
|
33
|
+
"esbuild-css-modules-plugin": "3.1.2"
|
34
34
|
},
|
35
|
-
"gitHead": "
|
35
|
+
"gitHead": "1d785e68643dd46c63b49d9fcb0fc1d73097a414"
|
36
36
|
}
|