@xmcl/model
Version:
Create Three.js model for player and block
5 lines • 53.8 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../block.ts", "../player.ts", "../player-model.ts"],
"sourcesContent": ["import { BlockModel, PackMeta } from '@xmcl/resourcepack'\nimport { Material } from 'three/src/materials/Material'\nimport { LinearFilter, NearestFilter } from 'three/src/constants'\nimport { Object3D } from 'three/src/core/Object3D'\nimport { TextureLoader } from 'three/src/loaders/TextureLoader'\nimport { MeshBasicMaterial } from 'three/src/materials/MeshBasicMaterial'\nimport { MeshLambertMaterial } from 'three/src/materials/MeshLambertMaterial'\nimport { Mesh } from 'three/src/objects/Mesh'\nimport { Group } from 'three/src/objects/Group'\nimport { BoxGeometry } from 'three/src/geometries/BoxGeometry'\nimport { Vector3 } from 'three/src/math/Vector3'\nimport { Vector2 } from 'three/src/math/Vector2'\nimport { BufferAttribute } from 'three/src/core/BufferAttribute'\nimport type { Texture } from 'three/src/textures/Texture'\n\ninterface TextureData {\n url: string\n animation?: PackMeta.Animation\n}\n\nexport interface TextureManager {\n hasTexture(path: string): boolean\n loadTexture(path: string): Texture\n}\n\nexport class BasicTextureManager implements TextureManager {\n constructor(private textures: Record<string, TextureData> = {}, private loader = new TextureLoader()) {}\n\n hasTexture(path: string): boolean {\n return !!this.textures[path]\n }\n\n loadTexture(path: string): Texture {\n const texture = this.loader.load(this.textures[path].url)\n\n // sharp pixels and smooth edges\n texture.magFilter = NearestFilter\n texture.minFilter = LinearFilter\n\n return texture\n }\n}\n\nexport const DEFAULT_TRANSFORM: BlockModel.Transform = {\n rotation: [0, 0, 0],\n translation: [0, 0, 0],\n scale: [1, 1, 1],\n}\nexport const DEFAULT_DISPLAY: BlockModel.Display = {\n ground: DEFAULT_TRANSFORM,\n gui: DEFAULT_TRANSFORM,\n thirdperson_lefthand: DEFAULT_TRANSFORM,\n thirdperson_righthand: DEFAULT_TRANSFORM,\n firstperson_lefthand: DEFAULT_TRANSFORM,\n firstperson_righthand: DEFAULT_TRANSFORM,\n fixed: DEFAULT_TRANSFORM,\n head: DEFAULT_TRANSFORM,\n}\nexport const BUILTIN_GENERATED: BlockModel.Resolved = {\n display: DEFAULT_DISPLAY,\n ambientocclusion: false,\n textures: {},\n elements: [\n {\n from: [0, 0, 0],\n to: [16, 16, 16],\n faces: {\n down: { uv: [0, 0, 16, 16], texture: '' },\n },\n },\n ],\n overrides: [],\n}\n\nfunction findRealTexturePath(model: BlockModel.Resolved, variantKey: string) {\n let texturePath = model.textures[variantKey] as string\n while (texturePath.startsWith('#')) {\n const next = model.textures[texturePath.substring(1, texturePath.length)]\n if (!next) {\n return undefined\n }\n texturePath = next\n }\n return texturePath\n}\n\nexport class BlockModelObject extends Object3D {\n animationLoop = false\n displayOption: BlockModel.Display = DEFAULT_DISPLAY\n\n applyDisplay(option: string) {\n const group = this.children[0]\n\n if (option === 'block') {\n // reset transformations\n group.rotation.set(0, 0, 0)\n group.position.set(0, 0, 0)\n group.scale.set(1, 1, 1)\n } else {\n if (!(option in this.displayOption)) {\n throw new Error('Display option is invalid.')\n }\n\n const options = (this.displayOption as any)[option]\n\n const rot = options.rotation\n const pos = options.translation\n const scale = options.scale\n\n // apply transformations\n group.rotation.set(rot[0] * Math.PI / 180, rot[1] * Math.PI / 180, rot[2] * Math.PI / 180)\n group.position.set(pos[0], pos[1], pos[2])\n group.scale.set(scale[0] === 0 ? 0.00001 : scale[0], scale[1] === 0 ? 0.00001 : scale[1], scale[2] === 0 ? 0.00001 : scale[2])\n }\n }\n\n getCenter() {\n const group = this.children[0]\n\n // compute absolute bounding box\n const box = {\n minx: 0,\n miny: 0,\n minz: 0,\n maxx: 0,\n maxy: 0,\n maxz: 0,\n }\n\n for (let i = 0; i < group.children.length; i++) {\n const pivot = group.children[i]\n const mesh = pivot.children[0] as Mesh\n const geo = mesh.geometry as BoxGeometry\n\n // for (let j = 0; j < geo.vertices.length; j++) {\n // // convert vertex coordinates to world coordinates\n // const vertex = geo.vertices[j].clone();\n // const abs = mesh.localToWorld(vertex);\n\n // // update bounding box\n\n // if (abs.x < box.minx) { box.minx = abs.x; }\n // if (abs.y < box.miny) { box.miny = abs.y; }\n // if (abs.z < box.minz) { box.minz = abs.z; }\n\n // if (abs.x > box.maxx) { box.maxx = abs.x; }\n // if (abs.y > box.maxy) { box.maxy = abs.y; }\n // if (abs.z > box.maxz) { box.maxz = abs.z; }\n // }\n }\n\n // return the center of the bounding box\n\n return new Vector3(\n (box.minx + box.maxx) / 2,\n (box.miny + box.maxy) / 2,\n (box.minz + box.maxz) / 2,\n )\n }\n}\n\nexport class BlockModelFactory {\n static TRANSPARENT_MATERIAL = new MeshBasicMaterial({ transparent: true, opacity: 0, alphaTest: 0.5 })\n\n private cachedMaterial: Record<string, Material> = {}\n\n constructor(readonly textureManager: TextureManager, readonly option: { clipUVs?: boolean; modelOnly?: boolean } = {}) { }\n\n /**\n * Get threejs `Object3D` for that block model.\n */\n getObject(model: BlockModel.Resolved, options:{ uvlock?: boolean; y?: number; x?: number } = {}, fix = 0.001) {\n const xRotation = options.x || 0\n const yRotation = options.y || 0\n const uvlock = options.uvlock || false\n\n const option = this.option\n const textureManager = this.textureManager\n\n const clipUVs = option.clipUVs || false\n const modelOnly = option.modelOnly || false\n\n const obj = new BlockModelObject()\n const group = new Group()\n group.name = 'wrapper'\n\n const materials: Material[] = [BlockModelFactory.TRANSPARENT_MATERIAL]\n const materialIndexes: { [variant: string]: number } = {}\n\n const materialPathIndexes: { [texPath: string]: number } = {}\n for (const variant of Object.keys(model.textures)) {\n const texPath = findRealTexturePath(model, variant)\n let materialIndex = 0\n\n if (!texPath) {\n console.error(`Cannot find texture @${texPath}`)\n } else {\n let materialPathIndex = materialPathIndexes[texPath]\n if (materialPathIndex) {\n // noop\n } else if (texPath in this.cachedMaterial) {\n materialPathIndex = materials.length\n materials.push(this.cachedMaterial[texPath])\n } else if (textureManager.hasTexture(texPath)) {\n // build new material\n const texture = textureManager.loadTexture(texPath)\n\n // map texture to material, keep transparency and fix transparent z-fighting\n const mat = new MeshLambertMaterial({ map: texture, transparent: true, alphaTest: 0.5 })\n\n materialPathIndex = materials.length\n this.cachedMaterial[texPath] = mat\n\n mat.name = texPath\n\n materials.push(mat)\n }\n materialPathIndexes[texPath] = materialPathIndex\n materialIndex = materialPathIndex\n }\n\n materialIndexes[variant] = materialIndex\n }\n\n for (const element of model.elements) {\n // get dimensions and origin\n const width = element.to[0] - element.from[0]\n const height = element.to[1] - element.from[1]\n const length = element.to[2] - element.from[2]\n\n const origin = {\n x: (element.to[0] + element.from[0]) / 2 - 8,\n y: (element.to[1] + element.from[1]) / 2 - 8,\n z: (element.to[2] + element.from[2]) / 2 - 8,\n }\n\n const blockGeometry = new BoxGeometry(width + fix, height + fix, length + fix)\n const blockMesh = new Mesh(blockGeometry, materials)\n blockMesh.name = 'block-element'\n blockGeometry.clearGroups()\n\n blockMesh.position.x = origin.x\n blockMesh.position.y = origin.y\n blockMesh.position.z = origin.z\n\n const uvAttr: number[] = []\n\n const faces = ['east', 'west', 'up', 'down', 'south', 'north'] as const\n\n const getDefaultUv = (i: number) => [\n [\n // east\n element.from[2],\n element.from[1],\n element.to[2],\n element.to[1],\n ],\n [\n // west\n element.from[2],\n element.from[1],\n element.to[2],\n element.to[1],\n ],\n [\n // up\n element.from[0],\n element.from[2],\n element.to[0],\n element.to[2],\n ],\n [\n // down\n element.from[0],\n element.from[2],\n element.to[0],\n element.to[2],\n ],\n [\n // south\n element.from[0],\n element.from[1],\n element.to[0],\n element.to[1],\n ],\n [\n // north\n element.from[0],\n element.from[1],\n element.to[0],\n element.to[1],\n ],\n ][i]\n\n for (let i = 0; i < 6; i++) {\n const faceName = faces[i]\n const face = element.faces[faceName]\n let materialIndex = 0\n let uv: number[]\n if (face) {\n // get material index\n materialIndex = materialIndexes[face.texture.substring(1, face.texture.length)] // references.indexOf(ref[0] == '#' ? ref.substring(1) : ref)\n\n uv = face.uv || getDefaultUv(i)\n\n if (clipUVs) {\n uv = uv.map((e) => {\n if (e + 0.00001 < 0) {\n return 0\n } else if (e - 0.00001 > 16) {\n return 16\n } else {\n return e\n }\n })\n }\n\n uv = uv.map((e) => e / 16)\n } else {\n uv = [0, 0, 1, 1]\n // transparent material\n }\n const [x1, y1, x2, y2] = uv\n let map = [\n new Vector2(x1, y2),\n new Vector2(x2, y2),\n new Vector2(x1, y1),\n new Vector2(x2, y1),\n ]\n\n if (face && face.rotation) {\n let amount = Number(face.rotation)\n // check property\n if (!([0, 90, 180, 270].indexOf(amount) >= 0)) {\n console.error('The \"rotation\" property for \"' + face + '\" face is invalid (got \"' + amount + '\").')\n }\n\n amount = (360 - amount) % 360\n\n // rotate map\n for (let j = 0; j < amount / 90; j++) {\n map = [map[1], map[3], map[0], map[2]]\n }\n }\n\n if (uvlock) {\n let rotation = 0\n if (xRotation >= 180) {\n if (faceName === 'up') {\n rotation = yRotation\n } else if (faceName === 'down') {\n rotation = (360 - yRotation) % 360\n } else {\n rotation = xRotation\n }\n } else {\n if (faceName === 'down') {\n rotation = yRotation\n } else if (faceName === 'up') {\n rotation = (360 - yRotation) % 360\n } else {\n rotation = xRotation\n }\n }\n\n for (let j = 0; j < rotation / 90; j++) {\n for (let m = 0; m < map.length; m++) {\n const vector = map[m]\n const x = vector.x\n const y = vector.y\n\n vector.x = 1 - y\n vector.y = x\n }\n }\n }\n\n uvAttr.push(\n map[0].x, map[0].y,\n map[1].x, map[1].y,\n map[2].x, map[2].y,\n map[3].x, map[3].y,\n )\n blockGeometry.addGroup(i * 6, 6, materialIndex)\n // blockGeometry.uvsNeedUpdate = true;\n }\n blockGeometry.setAttribute('uv', new BufferAttribute(\n new Float32Array(uvAttr), 2))\n\n /**\n * bake rotation start\n */\n if (element.rotation) {\n // get origin, axis and angle\n const rotationOrigin = {\n x: element.rotation.origin[0] - 8,\n y: element.rotation.origin[1] - 8,\n z: element.rotation.origin[2] - 8,\n }\n\n const axis = element.rotation.axis\n const angle = element.rotation.angle\n\n // create pivot\n const pivot = new Group()\n pivot.name = 'pivot'\n pivot.position.x = rotationOrigin.x\n pivot.position.y = rotationOrigin.y\n pivot.position.z = rotationOrigin.z\n\n pivot.add(blockMesh)\n\n // adjust mesh coordinates\n blockMesh.position.x -= rotationOrigin.x\n blockMesh.position.y -= rotationOrigin.y\n blockMesh.position.z -= rotationOrigin.z\n\n // rotate pivot\n if (axis === 'x') {\n pivot.rotateX(angle * Math.PI / 180)\n } else if (axis === 'y') {\n pivot.rotateY(angle * Math.PI / 180)\n } else if (axis === 'z') {\n pivot.rotateZ(angle * Math.PI / 180)\n }\n\n const rescale = element.rotation.rescale || false\n if (rescale) {\n if (angle % 90 === 45) {\n if (axis === 'x') {\n pivot.scale.y *= Math.sqrt(2)\n pivot.scale.z *= Math.sqrt(2)\n }\n if (axis === 'y') {\n pivot.scale.x *= Math.sqrt(2)\n pivot.scale.z *= Math.sqrt(2)\n }\n if (axis === 'z') {\n pivot.scale.x *= Math.sqrt(2)\n pivot.scale.y *= Math.sqrt(2)\n }\n }\n }\n\n group.add(pivot)\n } else {\n const pivot = new Group()\n pivot.name = 'pivot'\n pivot.add(blockMesh)\n group.add(pivot)\n }\n }\n\n obj.rotateY(-yRotation * Math.PI / 180)\n obj.rotateX(-xRotation * Math.PI / 180)\n\n obj.add(group)\n\n return obj\n }\n}\n", "import { BufferAttribute, Texture, Vector2 } from 'three'\nimport { DoubleSide, NearestFilter } from 'three/src/constants'\nimport { Object3D } from 'three/src/core/Object3D'\nimport { BoxGeometry } from 'three/src/geometries/BoxGeometry'\nimport { BoxHelper } from 'three/src/helpers/BoxHelper'\nimport { MeshBasicMaterial } from 'three/src/materials/MeshBasicMaterial'\nimport { Color } from 'three/src/math/Color'\nimport { Mesh } from 'three/src/objects/Mesh'\nimport { CanvasTexture } from 'three/src/textures/CanvasTexture'\nimport format, { CubeUVMapping, ModelTemplate } from './player-model'\n\nfunction convertLegacySkin(context: CanvasRenderingContext2D, width: number) {\n const scale = width / 64.0\n\n function copySkin(ctx: CanvasRenderingContext2D, sX: number, sY: number, w: number, h: number, dX: number, dY: number, flipHorizontal: boolean) {\n sX *= scale\n sY *= scale\n w *= scale\n h *= scale\n dX *= scale\n dY *= scale\n\n const imgData = ctx.getImageData(sX, sY, w, h)\n if (flipHorizontal) {\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < (w / 2); x++) {\n const index = (x + y * w) * 4\n const index2 = ((w - x - 1) + y * w) * 4\n const pA1 = imgData.data[index]\n const pA2 = imgData.data[index + 1]\n const pA3 = imgData.data[index + 2]\n const pA4 = imgData.data[index + 3]\n\n const pB1 = imgData.data[index2]\n const pB2 = imgData.data[index2 + 1]\n const pB3 = imgData.data[index2 + 2]\n const pB4 = imgData.data[index2 + 3]\n\n imgData.data[index] = pB1\n imgData.data[index + 1] = pB2\n imgData.data[index + 2] = pB3\n imgData.data[index + 3] = pB4\n\n imgData.data[index2] = pA1\n imgData.data[index2 + 1] = pA2\n imgData.data[index2 + 2] = pA3\n imgData.data[index2 + 3] = pA4\n }\n }\n }\n ctx.putImageData(imgData, dX, dY)\n }\n\n copySkin(context, 4, 16, 4, 4, 20, 48, true) // Top Leg\n copySkin(context, 8, 16, 4, 4, 24, 48, true) // Bottom Leg\n copySkin(context, 0, 20, 4, 12, 24, 52, true) // Outer Leg\n copySkin(context, 4, 20, 4, 12, 20, 52, true) // Front Leg\n copySkin(context, 8, 20, 4, 12, 16, 52, true) // Inner Leg\n copySkin(context, 12, 20, 4, 12, 28, 52, true) // Back Leg\n copySkin(context, 44, 16, 4, 4, 36, 48, true) // Top Arm\n copySkin(context, 48, 16, 4, 4, 40, 48, true) // Bottom Arm\n copySkin(context, 40, 20, 4, 12, 40, 52, true) // Outer Arm\n copySkin(context, 44, 20, 4, 12, 36, 52, true) // Front Arm\n copySkin(context, 48, 20, 4, 12, 32, 52, true) // Inner Arm\n copySkin(context, 52, 20, 4, 12, 44, 52, true) // Back Arm\n}\n\ntype TextureSource = string | HTMLImageElement | URL\n\nfunction mapCubeUV(mesh: Mesh, src: CubeUVMapping) {\n const material = mesh.material as MeshBasicMaterial\n const texture = material.map!\n const tileUvW = 1 / texture.image.width\n const tileUvH = 1 / texture.image.height\n const uvs: Vector2[] = []\n /**\n * Set the box mesh UV to the Minecraft skin texture\n */\n function mapUV(x1: number, y1: number, x2: number, y2: number) {\n x1 *= tileUvW\n x2 *= tileUvW\n y1 = 1 - (y1 * tileUvH)\n y2 = 1 - (y2 * tileUvH)\n\n uvs.push(\n new Vector2(x1, y1),\n new Vector2(x2, y1),\n new Vector2(x1, y2),\n new Vector2(x2, y2),\n )\n }\n\n const faces = ['left', 'right', 'top', 'bottom', 'front', 'back'] as const\n for (let i = 0; i < faces.length; i++) {\n const uvs = src[faces[i]]\n mapUV(uvs[0], uvs[1], uvs[2], uvs[3])\n }\n\n const fArr = new Float32Array(uvs.length * 2)\n for (let i = 0; i < uvs.length; i++) {\n fArr[i * 2] = uvs[i].x\n fArr[i * 2 + 1] = uvs[i].y\n }\n const attr = new BufferAttribute(fArr, 2)\n mesh.geometry.setAttribute('uv', attr)\n}\n\nexport class PlayerObject3D extends Object3D {\n private _slim = false\n\n constructor(skin: MeshBasicMaterial, cape: MeshBasicMaterial, transparent: MeshBasicMaterial, slim: boolean) {\n super()\n this._slim = slim\n buildPlayerModel(this, skin, cape, transparent, slim)\n }\n\n get slim() {\n return this._slim\n }\n\n set slim(slim: boolean) {\n if (slim !== this._slim) {\n const template = slim ? format.alex : format.steve\n const leftArm = this.getObjectByName('leftArm')! as Mesh\n const rightArm = this.getObjectByName('rightArm')! as Mesh\n\n leftArm.geometry = new BoxGeometry(template.leftArm.w, template.leftArm.h, template.leftArm.d)\n mapCubeUV(leftArm, template.leftArm)\n rightArm.geometry = new BoxGeometry(template.rightArm.w, template.rightArm.h, template.rightArm.d)\n mapCubeUV(rightArm, template.rightArm)\n\n const leftArmLayer = this.getObjectByName('leftArmLayer')! as Mesh\n const rightArmLayer = this.getObjectByName('rightArmLayer')! as Mesh\n if (leftArmLayer) {\n leftArmLayer.geometry = new BoxGeometry(template.leftArm.layer.w, template.leftArm.layer.h, template.leftArm.layer.d)\n mapCubeUV(leftArmLayer, template.leftArm.layer)\n }\n if (rightArmLayer) {\n rightArmLayer.geometry = new BoxGeometry(template.rightArm.layer.w, template.rightArm.layer.h, template.rightArm.layer.d)\n mapCubeUV(rightArmLayer, template.rightArm.layer)\n }\n }\n this._slim = slim\n }\n}\n\nfunction buildPlayerModel(root: Object3D, skin: MeshBasicMaterial, cape: MeshBasicMaterial, transparent: MeshBasicMaterial, slim: boolean): Object3D {\n const template = slim ? format.alex : format.steve\n const partsNames: Array<keyof ModelTemplate> = Object.keys(template) as any\n\n for (const partName of partsNames) {\n const model = template[partName]\n\n const mesh = new Mesh(new BoxGeometry(model.w, model.h, model.d),\n partName === 'cape' ? cape : skin)\n\n mesh.name = partName\n if (model.y) { mesh.position.y = model.y }\n if (model.x) { mesh.position.x = model.x }\n if (model.z) { mesh.position.z = model.z }\n if (partName === 'cape') {\n mesh.rotation.x = 25 * (Math.PI / 180)\n }\n mapCubeUV(mesh, model)\n\n const box = new BoxHelper(mesh, new Color(0xffffff))\n box.name = `${partName}Box`\n box.visible = false\n mesh.add(box)\n\n if ('layer' in model) {\n const layer = model.layer\n const layerMesh = new Mesh(new BoxGeometry(layer.w, layer.h, layer.d), transparent)\n layerMesh.name = `${partName}Layer`\n if (layer.y) { layerMesh.position.y = layer.y }\n if (layer.x) { layerMesh.position.x = layer.x }\n if (layer.z) { layerMesh.position.z = layer.z }\n\n mapCubeUV(layerMesh, layer)\n\n mesh.add(layerMesh)\n }\n\n root.add(mesh)\n }\n\n return root\n}\n\nfunction ensureImage(textureSource: TextureSource) {\n if (textureSource instanceof Image) {\n return textureSource\n }\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.onload = () => { resolve(img) }\n img.onerror = (e, source, lineno, colno, error) => { reject(error) }\n if (textureSource instanceof URL) {\n img.src = textureSource.toString()\n } else {\n img.src = textureSource\n }\n })\n}\n\nexport class PlayerModel {\n static create() { return new PlayerModel() }\n\n readonly playerObject3d: PlayerObject3D\n readonly materialPlayer: MeshBasicMaterial\n readonly materialTransparent: MeshBasicMaterial\n readonly materialCape: MeshBasicMaterial\n readonly textureCape: CanvasTexture\n readonly texturePlayer: CanvasTexture\n\n constructor() {\n const canvas = document.createElement('canvas')\n canvas.width = 64\n canvas.height = 64\n const texture = new CanvasTexture(canvas)\n texture.magFilter = NearestFilter\n texture.minFilter = NearestFilter\n this.texturePlayer = texture\n texture.name = 'skinTexture'\n\n this.materialPlayer = new MeshBasicMaterial({ map: texture })\n\n this.materialTransparent = new MeshBasicMaterial({\n map: texture,\n transparent: true,\n depthWrite: false,\n side: DoubleSide,\n })\n\n const textureCape = new CanvasTexture(document.createElement('canvas'))\n textureCape.magFilter = NearestFilter\n textureCape.minFilter = NearestFilter\n textureCape.name = 'capeTexture'\n this.textureCape = textureCape\n\n const materialCape = new MeshBasicMaterial({\n map: this.textureCape,\n })\n materialCape.name = 'capeMaterial'\n materialCape.visible = false\n this.materialCape = materialCape\n\n this.playerObject3d = new PlayerObject3D(this.materialPlayer, this.materialCape, this.materialTransparent, false)\n }\n\n /**\n * @param skin The skin texture source. Should be url string, URL object, or a Image HTML element\n * @param isSlim Is this skin slim\n */\n async setSkin(skin: TextureSource, isSlim = false) {\n this.playerObject3d.slim = isSlim\n const texture = this.texturePlayer\n const i = await ensureImage(skin)\n const legacy = i.width !== i.height\n const canvas = texture.image\n const context = canvas.getContext('2d')\n canvas.width = i.width\n canvas.height = i.width\n context.clearRect(0, 0, i.width, i.width)\n if (legacy) {\n context.drawImage(i, 0, 0, i.width, i.width / 2.0)\n convertLegacySkin(context, i.width)\n } else {\n context.drawImage(i, 0, 0, i.width, i.width)\n }\n texture.needsUpdate = true\n }\n\n async setCape(cape: TextureSource | undefined) {\n if (cape === undefined) {\n this.materialCape.visible = false\n return\n }\n this.materialCape.visible = true\n const img = await ensureImage(cape)\n const texture = this.textureCape\n texture.image = img\n texture.needsUpdate = true\n }\n\n // name(name) {\n // if (name === undefined || name === \"\" || name === null) {\n // if (this.nameTagObject === null) { return this; }\n // this.root.remove(this.nameTagObject);\n // this.nameTagObject = null;\n // }\n // if (this.nameTagObject) { this.clear(); }\n // // build the texture\n // const canvas = buildNameTag(name);\n // const texture = new Texture(canvas);\n // texture.needsUpdate = true;\n // // build the sprite itself\n // const material = new SpriteMaterial({\n // map: texture,\n // // useScreenCoordinates: false\n // });\n // const sprite = new Sprite(material);\n // this.nameTagObject = sprite;\n // sprite.position.y = 1.15;\n // // add sprite to the character\n // this.root.add(this.nameTagObject);\n // return this;\n // }\n\n // load(option) {\n // if (!option) { return this; }\n // if (option.skin) { this.loadSkin(option.skin); }\n // if (option.cape) { this.loadCape(option.skin); }\n // return this;\n // }\n\n // say(text, expire = 4) {\n // expire *= 1000;\n // if (this.speakExpire) {\n // clearTimeout(this.speakExpire);\n // this.root.remove(this.speakBox);\n // this.speakBox = null;\n // this.speakExpire = null;\n // }\n // this.speakExpire = setTimeout(() => {\n // this.root.remove(this.speakBox);\n // this.speakBox = null;\n // this.speakExpire = null;\n // }, expire);\n\n // // build the texture\n // const canvas = buildChatBox(text);\n // const texture = new Texture(canvas);\n // texture.needsUpdate = true;\n // // build the sprite itself\n // const material = new SpriteMaterial({\n // map: texture,\n // // useScreenCoordinates: false\n // });\n // const sprite = new Sprite(material);\n // this.speakBox = sprite;\n // sprite.scale.multiplyScalar(4);\n // sprite.position.y = 1.5;\n // // add sprite to the character\n // this.root.add(this.speakBox);\n // return this;\n // }\n}\n\nexport default PlayerModel\n", "export interface ModelTemplate {\n head: Part\n rightLeg: Part\n leftLeg: Part\n torso: Part\n leftArm: Part\n rightArm: Part\n cape: Transform & CubeUVMapping\n}\nexport interface Dimension {\n h: number\n w: number\n d: number\n}\nexport interface CubeUVMapping {\n top: number[]\n bottom: number[]\n right: number[]\n front: number[]\n left: number[]\n back: number[]\n}\nexport interface Translation {\n x: number\n y: number\n z: number\n}\nexport interface Transform extends Translation, Dimension {\n}\nexport interface Part extends Transform, CubeUVMapping {\n layer: Dimension & CubeUVMapping & Partial<Translation>\n}\nfunction createGroup(slim: boolean): ModelTemplate {\n return {\n head: {\n h: 0,\n w: 0,\n d: 0,\n x: 0,\n y: 0,\n z: 0,\n layer: {\n w: 9,\n h: 9,\n d: 9,\n top: [40, 0, 48, 8],\n bottom: [48, 0, 56, 8],\n right: [32, 8, 40, 16],\n front: [40, 8, 48, 16],\n left: [48, 8, 56, 16],\n back: [56, 8, 64, 16],\n },\n top: [8, 0, 16, 8],\n bottom: [24, 8, 16, 0],\n right: [0, 8, 8, 16],\n front: [8, 8, 16, 16],\n left: [16, 8, 24, 16],\n back: [24, 8, 32, 16],\n },\n rightLeg: {\n h: 0,\n w: 0,\n d: 0,\n x: 0,\n y: 0,\n z: 0,\n layer: {\n w: 4.5,\n d: 4.5,\n h: 13.5,\n top: [4, 48, 8, 36],\n bottom: [8, 48, 12, 36],\n right: [0, 36, 4, 48],\n front: [4, 36, 8, 48],\n left: [8, 36, 12, 48],\n back: [12, 36, 16, 48],\n },\n top: [4, 16, 8, 20],\n bottom: [8, 16, 12, 20],\n right: [0, 20, 4, 32],\n front: [4, 20, 8, 32],\n left: [8, 20, 12, 32],\n back: [12, 20, 16, 32],\n },\n torso: {\n h: 0,\n w: 0,\n d: 0,\n x: 0,\n y: 0,\n z: 0,\n layer: {\n w: 9,\n h: 13.5,\n d: 4.5,\n top: [20, 48, 28, 36],\n bottom: [28, 48, 36, 36],\n right: [16, 36, 20, 48],\n front: [20, 36, 28, 48],\n left: [28, 36, 32, 48],\n back: [32, 36, 40, 48],\n },\n top: [20, 16, 28, 20],\n bottom: [28, 16, 36, 20],\n right: [16, 20, 20, 32],\n front: [20, 20, 28, 32],\n left: [28, 20, 32, 32],\n back: [32, 20, 40, 32],\n },\n leftArm: {\n h: 0,\n w: 0,\n d: 0,\n x: 0,\n y: 0,\n z: 0,\n layer: {\n w: 4.5,\n h: 13.5,\n d: 4.5,\n top: [52, 48, 56, 52],\n bottom: [56, 48, 60, 52],\n right: [48, 52, 52, 64],\n front: [52, 52, 56, 64],\n left: [56, 52, 60, 64],\n back: [60, 52, 64, 64],\n },\n\n top: [36, 48, slim ? 39 : 40, 52],\n bottom: [slim ? 39 : 40, 48, slim ? 42 : 44, 52],\n left: [32, 52, 36, 64],\n front: [36, 52, slim ? 39 : 40, 64],\n right: [slim ? 39 : 40, 52, slim ? 43 : 44, 64],\n back: [slim ? 43 : 44, 52, slim ? 46 : 48, 64],\n },\n rightArm: {\n h: 0,\n w: 0,\n d: 0,\n x: 0,\n y: 0,\n z: 0,\n layer: {\n w: 4.5,\n h: 13.5,\n d: 4.5,\n top: [44, 48, 48, 36],\n bottom: [48, 48, 52, 36],\n left: [48, 36, 52, 48],\n front: [44, 36, 48, 48],\n right: [40, 36, 44, 48],\n back: [52, 36, 64, 48],\n },\n top: [44, 16, slim ? 47 : 48, 20],\n bottom: [slim ? 47 : 48, 16, slim ? 50 : 52, 20],\n left: [40, 20, 44, 32],\n front: [44, 20, slim ? 47 : 48, 32],\n right: [slim ? 47 : 48, 20, slim ? 51 : 52, 32],\n back: [slim ? 51 : 52, 20, slim ? 54 : 56, 32],\n },\n leftLeg: {\n h: 0,\n w: 0,\n d: 0,\n x: 0,\n y: 0,\n z: 0,\n layer: {\n w: 4.5,\n d: 4.5,\n h: 13.5,\n top: [4, 48, 8, 52],\n bottom: [8, 48, 12, 52],\n right: [0, 52, 4, 64],\n front: [4, 52, 8, 64],\n left: [8, 52, 12, 64],\n back: [12, 52, 16, 64],\n },\n top: [20, 48, 24, 52],\n bottom: [24, 48, 28, 52],\n right: [16, 52, 20, 64],\n front: [20, 52, 24, 64],\n left: [24, 52, 28, 64],\n back: [28, 52, 32, 64],\n },\n\n cape: {\n x: 0,\n y: 0,\n z: 0,\n h: 0,\n w: 0,\n d: 0,\n top: [1, 0, 11, 1],\n bottom: [11, 0, 21, 1],\n left: [11, 1, 12, 17],\n front: [12, 1, 22, 17],\n right: [0, 1, 1, 17],\n back: [1, 1, 11, 17],\n },\n }\n}\n\nconst PIXRATIO = 1 / 32\n\nfunction create(slim: boolean) {\n function decorateDimension(group: ModelTemplate) {\n function calculate(model: Part) {\n return {\n h: Math.abs(model.front[1] - model.front[3]) * PIXRATIO,\n w: Math.abs(model.front[0] - model.front[2]) * PIXRATIO,\n d: Math.abs(model.right[0] - model.right[2]) * PIXRATIO,\n }\n }\n for (const part of Object.values(group)) {\n Object.assign(part, calculate(part))\n if ('layer' in part) {\n part.layer.w *= PIXRATIO\n part.layer.h *= PIXRATIO\n part.layer.d *= PIXRATIO\n }\n }\n return group\n }\n function decoratePos(group: ModelTemplate) {\n const charH = 1\n group.head.y = charH - group.head.h / 2\n group.torso.y = group.rightLeg.h + group.torso.h / 2\n\n group.rightLeg.x = -group.rightLeg.w / 2\n group.rightLeg.y = group.rightLeg.h / 2\n group.leftLeg.x = group.leftLeg.w / 2\n group.leftLeg.y = group.leftLeg.h / 2\n\n group.rightArm.x = -group.torso.w / 2 - group.rightArm.w / 2\n group.rightArm.y = group.rightLeg.h + group.torso.h - group.rightArm.h / 2\n\n group.leftArm.x = group.torso.w / 2 + group.leftArm.w / 2\n group.leftArm.y = group.leftLeg.h + group.torso.h - group.leftArm.h / 2\n\n group.cape.y = group.rightLeg.h + group.torso.h / 5 * 2\n group.cape.z = -group.torso.d * 3 / 2\n return group\n }\n return decoratePos(decorateDimension(createGroup(slim)))\n}\n\nexport default {\n steve: create(false),\n alex: create(true),\n}\n"],
"mappings": "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