three-stdlib 2.30.2 → 2.30.4
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/_polyfill/LoaderUtils.cjs +18 -0
- package/_polyfill/LoaderUtils.cjs.map +1 -0
- package/_polyfill/LoaderUtils.js +18 -0
- package/_polyfill/LoaderUtils.js.map +1 -0
- package/loaders/3MFLoader.cjs +4 -3
- package/loaders/3MFLoader.cjs.map +1 -1
- package/loaders/3MFLoader.js +5 -4
- package/loaders/3MFLoader.js.map +1 -1
- package/loaders/AMFLoader.cjs +2 -1
- package/loaders/AMFLoader.cjs.map +1 -1
- package/loaders/AMFLoader.js +3 -2
- package/loaders/AMFLoader.js.map +1 -1
- package/loaders/FBXLoader.cjs +3 -2
- package/loaders/FBXLoader.cjs.map +1 -1
- package/loaders/FBXLoader.js +3 -2
- package/loaders/FBXLoader.js.map +1 -1
- package/loaders/GLTFLoader.cjs +5 -4
- package/loaders/GLTFLoader.cjs.map +1 -1
- package/loaders/GLTFLoader.js +5 -4
- package/loaders/GLTFLoader.js.map +1 -1
- package/loaders/KTX2Loader.cjs +3 -3
- package/loaders/KTX2Loader.cjs.map +1 -1
- package/loaders/KTX2Loader.js +3 -3
- package/loaders/KTX2Loader.js.map +1 -1
- package/loaders/PCDLoader.cjs +2 -1
- package/loaders/PCDLoader.cjs.map +1 -1
- package/loaders/PCDLoader.js +3 -2
- package/loaders/PCDLoader.js.map +1 -1
- package/loaders/PLYLoader.cjs +2 -1
- package/loaders/PLYLoader.cjs.map +1 -1
- package/loaders/PLYLoader.js +3 -2
- package/loaders/PLYLoader.js.map +1 -1
- package/loaders/STLLoader.cjs +2 -1
- package/loaders/STLLoader.cjs.map +1 -1
- package/loaders/STLLoader.js +3 -2
- package/loaders/STLLoader.js.map +1 -1
- package/loaders/VTKLoader.cjs +4 -3
- package/loaders/VTKLoader.cjs.map +1 -1
- package/loaders/VTKLoader.js +5 -4
- package/loaders/VTKLoader.js.map +1 -1
- package/loaders/XLoader.cjs +3 -2
- package/loaders/XLoader.cjs.map +1 -1
- package/loaders/XLoader.js +3 -2
- package/loaders/XLoader.js.map +1 -1
- package/package.json +1 -1
package/loaders/3MFLoader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"3MFLoader.js","sources":["../../src/loaders/3MFLoader.js"],"sourcesContent":["import {\n BufferAttribute,\n BufferGeometry,\n ClampToEdgeWrapping,\n Color,\n FileLoader,\n Float32BufferAttribute,\n Group,\n LinearFilter,\n LinearMipmapLinearFilter,\n Loader,\n LoaderUtils,\n Matrix4,\n Mesh,\n MeshPhongMaterial,\n MeshStandardMaterial,\n MirroredRepeatWrapping,\n NearestFilter,\n RepeatWrapping,\n TextureLoader,\n} from 'three'\nimport { unzipSync } from 'fflate'\n\n/**\n *\n * 3D Manufacturing Format (3MF) specification: https://3mf.io/specification/\n *\n * The following features from the core specification are supported:\n *\n * - 3D Models\n * - Object Resources (Meshes and Components)\n * - Material Resources (Base Materials)\n *\n * 3MF Materials and Properties Extension are only partially supported.\n *\n * - Texture 2D\n * - Texture 2D Groups\n * - Color Groups (Vertex Colors)\n * - Metallic Display Properties (PBR)\n */\n\nclass ThreeMFLoader extends Loader {\n constructor(manager) {\n super(manager)\n this.availableExtensions = []\n }\n\n load(url, onLoad, onProgress, onError) {\n const scope = this\n const loader = new FileLoader(scope.manager)\n loader.setPath(scope.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(scope.requestHeader)\n loader.setWithCredentials(scope.withCredentials)\n loader.load(\n url,\n function (buffer) {\n try {\n onLoad(scope.parse(buffer))\n } catch (e) {\n if (onError) {\n onError(e)\n } else {\n console.error(e)\n }\n\n scope.manager.itemError(url)\n }\n },\n onProgress,\n onError,\n )\n }\n\n parse(data) {\n const scope = this\n const textureLoader = new TextureLoader(this.manager)\n\n function loadDocument(data) {\n let zip = null\n let file = null\n\n let relsName\n let modelRelsName\n const modelPartNames = []\n const printTicketPartNames = []\n const texturesPartNames = []\n const otherPartNames = []\n\n let modelRels\n const modelParts = {}\n const printTicketParts = {}\n const texturesParts = {}\n const otherParts = {}\n\n try {\n zip = unzipSync(new Uint8Array(data))\n } catch (e) {\n if (e instanceof ReferenceError) {\n console.error('THREE.3MFLoader: fflate missing and file is compressed.')\n return null\n }\n }\n\n for (file in zip) {\n if (file.match(/\\_rels\\/.rels$/)) {\n relsName = file\n } else if (file.match(/3D\\/_rels\\/.*\\.model\\.rels$/)) {\n modelRelsName = file\n } else if (file.match(/^3D\\/.*\\.model$/)) {\n modelPartNames.push(file)\n } else if (file.match(/^3D\\/Metadata\\/.*\\.xml$/)) {\n printTicketPartNames.push(file)\n } else if (file.match(/^3D\\/Textures?\\/.*/)) {\n texturesPartNames.push(file)\n } else if (file.match(/^3D\\/Other\\/.*/)) {\n otherPartNames.push(file)\n }\n }\n\n //\n\n const relsView = zip[relsName]\n const relsFileText = LoaderUtils.decodeText(relsView)\n const rels = parseRelsXml(relsFileText)\n\n //\n\n if (modelRelsName) {\n const relsView = zip[modelRelsName]\n const relsFileText = LoaderUtils.decodeText(relsView)\n modelRels = parseRelsXml(relsFileText)\n }\n\n //\n\n for (let i = 0; i < modelPartNames.length; i++) {\n const modelPart = modelPartNames[i]\n const view = zip[modelPart]\n\n const fileText = LoaderUtils.decodeText(view)\n const xmlData = new DOMParser().parseFromString(fileText, 'application/xml')\n\n if (xmlData.documentElement.nodeName.toLowerCase() !== 'model') {\n console.error('THREE.3MFLoader: Error loading 3MF - no 3MF document found: ', modelPart)\n }\n\n const modelNode = xmlData.querySelector('model')\n const extensions = {}\n\n for (let i = 0; i < modelNode.attributes.length; i++) {\n const attr = modelNode.attributes[i]\n if (attr.name.match(/^xmlns:(.+)$/)) {\n extensions[attr.value] = RegExp.$1\n }\n }\n\n const modelData = parseModelNode(modelNode)\n modelData['xml'] = modelNode\n\n if (0 < Object.keys(extensions).length) {\n modelData['extensions'] = extensions\n }\n\n modelParts[modelPart] = modelData\n }\n\n //\n\n for (let i = 0; i < texturesPartNames.length; i++) {\n const texturesPartName = texturesPartNames[i]\n texturesParts[texturesPartName] = zip[texturesPartName].buffer\n }\n\n return {\n rels: rels,\n modelRels: modelRels,\n model: modelParts,\n printTicket: printTicketParts,\n texture: texturesParts,\n other: otherParts,\n }\n }\n\n function parseRelsXml(relsFileText) {\n const relationships = []\n\n const relsXmlData = new DOMParser().parseFromString(relsFileText, 'application/xml')\n\n const relsNodes = relsXmlData.querySelectorAll('Relationship')\n\n for (let i = 0; i < relsNodes.length; i++) {\n const relsNode = relsNodes[i]\n\n const relationship = {\n target: relsNode.getAttribute('Target'), //required\n id: relsNode.getAttribute('Id'), //required\n type: relsNode.getAttribute('Type'), //required\n }\n\n relationships.push(relationship)\n }\n\n return relationships\n }\n\n function parseMetadataNodes(metadataNodes) {\n const metadataData = {}\n\n for (let i = 0; i < metadataNodes.length; i++) {\n const metadataNode = metadataNodes[i]\n const name = metadataNode.getAttribute('name')\n const validNames = [\n 'Title',\n 'Designer',\n 'Description',\n 'Copyright',\n 'LicenseTerms',\n 'Rating',\n 'CreationDate',\n 'ModificationDate',\n ]\n\n if (0 <= validNames.indexOf(name)) {\n metadataData[name] = metadataNode.textContent\n }\n }\n\n return metadataData\n }\n\n function parseBasematerialsNode(basematerialsNode) {\n const basematerialsData = {\n id: basematerialsNode.getAttribute('id'), // required\n basematerials: [],\n }\n\n const basematerialNodes = basematerialsNode.querySelectorAll('base')\n\n for (let i = 0; i < basematerialNodes.length; i++) {\n const basematerialNode = basematerialNodes[i]\n const basematerialData = parseBasematerialNode(basematerialNode)\n basematerialData.index = i // the order and count of the material nodes form an implicit 0-based index\n basematerialsData.basematerials.push(basematerialData)\n }\n\n return basematerialsData\n }\n\n function parseTexture2DNode(texture2DNode) {\n const texture2dData = {\n id: texture2DNode.getAttribute('id'), // required\n path: texture2DNode.getAttribute('path'), // required\n contenttype: texture2DNode.getAttribute('contenttype'), // required\n tilestyleu: texture2DNode.getAttribute('tilestyleu'),\n tilestylev: texture2DNode.getAttribute('tilestylev'),\n filter: texture2DNode.getAttribute('filter'),\n }\n\n return texture2dData\n }\n\n function parseTextures2DGroupNode(texture2DGroupNode) {\n const texture2DGroupData = {\n id: texture2DGroupNode.getAttribute('id'), // required\n texid: texture2DGroupNode.getAttribute('texid'), // required\n displaypropertiesid: texture2DGroupNode.getAttribute('displaypropertiesid'),\n }\n\n const tex2coordNodes = texture2DGroupNode.querySelectorAll('tex2coord')\n\n const uvs = []\n\n for (let i = 0; i < tex2coordNodes.length; i++) {\n const tex2coordNode = tex2coordNodes[i]\n const u = tex2coordNode.getAttribute('u')\n const v = tex2coordNode.getAttribute('v')\n\n uvs.push(parseFloat(u), parseFloat(v))\n }\n\n texture2DGroupData['uvs'] = new Float32Array(uvs)\n\n return texture2DGroupData\n }\n\n function parseColorGroupNode(colorGroupNode) {\n const colorGroupData = {\n id: colorGroupNode.getAttribute('id'), // required\n displaypropertiesid: colorGroupNode.getAttribute('displaypropertiesid'),\n }\n\n const colorNodes = colorGroupNode.querySelectorAll('color')\n\n const colors = []\n const colorObject = new Color()\n\n for (let i = 0; i < colorNodes.length; i++) {\n const colorNode = colorNodes[i]\n const color = colorNode.getAttribute('color')\n\n colorObject.setStyle(color.substring(0, 7))\n colorObject.convertSRGBToLinear() // color is in sRGB\n\n colors.push(colorObject.r, colorObject.g, colorObject.b)\n }\n\n colorGroupData['colors'] = new Float32Array(colors)\n\n return colorGroupData\n }\n\n function parseMetallicDisplaypropertiesNode(metallicDisplaypropetiesNode) {\n const metallicDisplaypropertiesData = {\n id: metallicDisplaypropetiesNode.getAttribute('id'), // required\n }\n\n const metallicNodes = metallicDisplaypropetiesNode.querySelectorAll('pbmetallic')\n\n const metallicData = []\n\n for (let i = 0; i < metallicNodes.length; i++) {\n const metallicNode = metallicNodes[i]\n\n metallicData.push({\n name: metallicNode.getAttribute('name'), // required\n metallicness: parseFloat(metallicNode.getAttribute('metallicness')), // required\n roughness: parseFloat(metallicNode.getAttribute('roughness')), // required\n })\n }\n\n metallicDisplaypropertiesData.data = metallicData\n\n return metallicDisplaypropertiesData\n }\n\n function parseBasematerialNode(basematerialNode) {\n const basematerialData = {}\n\n basematerialData['name'] = basematerialNode.getAttribute('name') // required\n basematerialData['displaycolor'] = basematerialNode.getAttribute('displaycolor') // required\n basematerialData['displaypropertiesid'] = basematerialNode.getAttribute('displaypropertiesid')\n\n return basematerialData\n }\n\n function parseMeshNode(meshNode) {\n const meshData = {}\n\n const vertices = []\n const vertexNodes = meshNode.querySelectorAll('vertices vertex')\n\n for (let i = 0; i < vertexNodes.length; i++) {\n const vertexNode = vertexNodes[i]\n const x = vertexNode.getAttribute('x')\n const y = vertexNode.getAttribute('y')\n const z = vertexNode.getAttribute('z')\n\n vertices.push(parseFloat(x), parseFloat(y), parseFloat(z))\n }\n\n meshData['vertices'] = new Float32Array(vertices)\n\n const triangleProperties = []\n const triangles = []\n const triangleNodes = meshNode.querySelectorAll('triangles triangle')\n\n for (let i = 0; i < triangleNodes.length; i++) {\n const triangleNode = triangleNodes[i]\n const v1 = triangleNode.getAttribute('v1')\n const v2 = triangleNode.getAttribute('v2')\n const v3 = triangleNode.getAttribute('v3')\n const p1 = triangleNode.getAttribute('p1')\n const p2 = triangleNode.getAttribute('p2')\n const p3 = triangleNode.getAttribute('p3')\n const pid = triangleNode.getAttribute('pid')\n\n const triangleProperty = {}\n\n triangleProperty['v1'] = parseInt(v1, 10)\n triangleProperty['v2'] = parseInt(v2, 10)\n triangleProperty['v3'] = parseInt(v3, 10)\n\n triangles.push(triangleProperty['v1'], triangleProperty['v2'], triangleProperty['v3'])\n\n // optional\n\n if (p1) {\n triangleProperty['p1'] = parseInt(p1, 10)\n }\n\n if (p2) {\n triangleProperty['p2'] = parseInt(p2, 10)\n }\n\n if (p3) {\n triangleProperty['p3'] = parseInt(p3, 10)\n }\n\n if (pid) {\n triangleProperty['pid'] = pid\n }\n\n if (0 < Object.keys(triangleProperty).length) {\n triangleProperties.push(triangleProperty)\n }\n }\n\n meshData['triangleProperties'] = triangleProperties\n meshData['triangles'] = new Uint32Array(triangles)\n\n return meshData\n }\n\n function parseComponentsNode(componentsNode) {\n const components = []\n\n const componentNodes = componentsNode.querySelectorAll('component')\n\n for (let i = 0; i < componentNodes.length; i++) {\n const componentNode = componentNodes[i]\n const componentData = parseComponentNode(componentNode)\n components.push(componentData)\n }\n\n return components\n }\n\n function parseComponentNode(componentNode) {\n const componentData = {}\n\n componentData['objectId'] = componentNode.getAttribute('objectid') // required\n\n const transform = componentNode.getAttribute('transform')\n\n if (transform) {\n componentData['transform'] = parseTransform(transform)\n }\n\n return componentData\n }\n\n function parseTransform(transform) {\n const t = []\n transform.split(' ').forEach(function (s) {\n t.push(parseFloat(s))\n })\n\n const matrix = new Matrix4()\n matrix.set(t[0], t[3], t[6], t[9], t[1], t[4], t[7], t[10], t[2], t[5], t[8], t[11], 0.0, 0.0, 0.0, 1.0)\n\n return matrix\n }\n\n function parseObjectNode(objectNode) {\n const objectData = {\n type: objectNode.getAttribute('type'),\n }\n\n const id = objectNode.getAttribute('id')\n\n if (id) {\n objectData['id'] = id\n }\n\n const pid = objectNode.getAttribute('pid')\n\n if (pid) {\n objectData['pid'] = pid\n }\n\n const pindex = objectNode.getAttribute('pindex')\n\n if (pindex) {\n objectData['pindex'] = pindex\n }\n\n const thumbnail = objectNode.getAttribute('thumbnail')\n\n if (thumbnail) {\n objectData['thumbnail'] = thumbnail\n }\n\n const partnumber = objectNode.getAttribute('partnumber')\n\n if (partnumber) {\n objectData['partnumber'] = partnumber\n }\n\n const name = objectNode.getAttribute('name')\n\n if (name) {\n objectData['name'] = name\n }\n\n const meshNode = objectNode.querySelector('mesh')\n\n if (meshNode) {\n objectData['mesh'] = parseMeshNode(meshNode)\n }\n\n const componentsNode = objectNode.querySelector('components')\n\n if (componentsNode) {\n objectData['components'] = parseComponentsNode(componentsNode)\n }\n\n return objectData\n }\n\n function parseResourcesNode(resourcesNode) {\n const resourcesData = {}\n\n resourcesData['basematerials'] = {}\n const basematerialsNodes = resourcesNode.querySelectorAll('basematerials')\n\n for (let i = 0; i < basematerialsNodes.length; i++) {\n const basematerialsNode = basematerialsNodes[i]\n const basematerialsData = parseBasematerialsNode(basematerialsNode)\n resourcesData['basematerials'][basematerialsData['id']] = basematerialsData\n }\n\n //\n\n resourcesData['texture2d'] = {}\n const textures2DNodes = resourcesNode.querySelectorAll('texture2d')\n\n for (let i = 0; i < textures2DNodes.length; i++) {\n const textures2DNode = textures2DNodes[i]\n const texture2DData = parseTexture2DNode(textures2DNode)\n resourcesData['texture2d'][texture2DData['id']] = texture2DData\n }\n\n //\n\n resourcesData['colorgroup'] = {}\n const colorGroupNodes = resourcesNode.querySelectorAll('colorgroup')\n\n for (let i = 0; i < colorGroupNodes.length; i++) {\n const colorGroupNode = colorGroupNodes[i]\n const colorGroupData = parseColorGroupNode(colorGroupNode)\n resourcesData['colorgroup'][colorGroupData['id']] = colorGroupData\n }\n\n //\n\n resourcesData['pbmetallicdisplayproperties'] = {}\n const pbmetallicdisplaypropertiesNodes = resourcesNode.querySelectorAll('pbmetallicdisplayproperties')\n\n for (let i = 0; i < pbmetallicdisplaypropertiesNodes.length; i++) {\n const pbmetallicdisplaypropertiesNode = pbmetallicdisplaypropertiesNodes[i]\n const pbmetallicdisplaypropertiesData = parseMetallicDisplaypropertiesNode(pbmetallicdisplaypropertiesNode)\n resourcesData['pbmetallicdisplayproperties'][\n pbmetallicdisplaypropertiesData['id']\n ] = pbmetallicdisplaypropertiesData\n }\n\n //\n\n resourcesData['texture2dgroup'] = {}\n const textures2DGroupNodes = resourcesNode.querySelectorAll('texture2dgroup')\n\n for (let i = 0; i < textures2DGroupNodes.length; i++) {\n const textures2DGroupNode = textures2DGroupNodes[i]\n const textures2DGroupData = parseTextures2DGroupNode(textures2DGroupNode)\n resourcesData['texture2dgroup'][textures2DGroupData['id']] = textures2DGroupData\n }\n\n //\n\n resourcesData['object'] = {}\n const objectNodes = resourcesNode.querySelectorAll('object')\n\n for (let i = 0; i < objectNodes.length; i++) {\n const objectNode = objectNodes[i]\n const objectData = parseObjectNode(objectNode)\n resourcesData['object'][objectData['id']] = objectData\n }\n\n return resourcesData\n }\n\n function parseBuildNode(buildNode) {\n const buildData = []\n const itemNodes = buildNode.querySelectorAll('item')\n\n for (let i = 0; i < itemNodes.length; i++) {\n const itemNode = itemNodes[i]\n const buildItem = {\n objectId: itemNode.getAttribute('objectid'),\n }\n const transform = itemNode.getAttribute('transform')\n\n if (transform) {\n buildItem['transform'] = parseTransform(transform)\n }\n\n buildData.push(buildItem)\n }\n\n return buildData\n }\n\n function parseModelNode(modelNode) {\n const modelData = { unit: modelNode.getAttribute('unit') || 'millimeter' }\n const metadataNodes = modelNode.querySelectorAll('metadata')\n\n if (metadataNodes) {\n modelData['metadata'] = parseMetadataNodes(metadataNodes)\n }\n\n const resourcesNode = modelNode.querySelector('resources')\n\n if (resourcesNode) {\n modelData['resources'] = parseResourcesNode(resourcesNode)\n }\n\n const buildNode = modelNode.querySelector('build')\n\n if (buildNode) {\n modelData['build'] = parseBuildNode(buildNode)\n }\n\n return modelData\n }\n\n function buildTexture(texture2dgroup, objects, modelData, textureData) {\n const texid = texture2dgroup.texid\n const texture2ds = modelData.resources.texture2d\n const texture2d = texture2ds[texid]\n\n if (texture2d) {\n const data = textureData[texture2d.path]\n const type = texture2d.contenttype\n\n const blob = new Blob([data], { type: type })\n const sourceURI = URL.createObjectURL(blob)\n\n const texture = textureLoader.load(sourceURI, function () {\n URL.revokeObjectURL(sourceURI)\n })\n\n if ('colorSpace' in texture) texture.colorSpace = 'srgb'\n else texture.encoding = 3001 // sRGBEncoding\n\n // texture parameters\n\n switch (texture2d.tilestyleu) {\n case 'wrap':\n texture.wrapS = RepeatWrapping\n break\n\n case 'mirror':\n texture.wrapS = MirroredRepeatWrapping\n break\n\n case 'none':\n case 'clamp':\n texture.wrapS = ClampToEdgeWrapping\n break\n\n default:\n texture.wrapS = RepeatWrapping\n }\n\n switch (texture2d.tilestylev) {\n case 'wrap':\n texture.wrapT = RepeatWrapping\n break\n\n case 'mirror':\n texture.wrapT = MirroredRepeatWrapping\n break\n\n case 'none':\n case 'clamp':\n texture.wrapT = ClampToEdgeWrapping\n break\n\n default:\n texture.wrapT = RepeatWrapping\n }\n\n switch (texture2d.filter) {\n case 'auto':\n texture.magFilter = LinearFilter\n texture.minFilter = LinearMipmapLinearFilter\n break\n\n case 'linear':\n texture.magFilter = LinearFilter\n texture.minFilter = LinearFilter\n break\n\n case 'nearest':\n texture.magFilter = NearestFilter\n texture.minFilter = NearestFilter\n break\n\n default:\n texture.magFilter = LinearFilter\n texture.minFilter = LinearMipmapLinearFilter\n }\n\n return texture\n } else {\n return null\n }\n }\n\n function buildBasematerialsMeshes(\n basematerials,\n triangleProperties,\n meshData,\n objects,\n modelData,\n textureData,\n objectData,\n ) {\n const objectPindex = objectData.pindex\n\n const materialMap = {}\n\n for (let i = 0, l = triangleProperties.length; i < l; i++) {\n const triangleProperty = triangleProperties[i]\n const pindex = triangleProperty.p1 !== undefined ? triangleProperty.p1 : objectPindex\n\n if (materialMap[pindex] === undefined) materialMap[pindex] = []\n\n materialMap[pindex].push(triangleProperty)\n }\n\n //\n\n const keys = Object.keys(materialMap)\n const meshes = []\n\n for (let i = 0, l = keys.length; i < l; i++) {\n const materialIndex = keys[i]\n const trianglePropertiesProps = materialMap[materialIndex]\n const basematerialData = basematerials.basematerials[materialIndex]\n const material = getBuild(basematerialData, objects, modelData, textureData, objectData, buildBasematerial)\n\n //\n\n const geometry = new BufferGeometry()\n\n const positionData = []\n\n const vertices = meshData.vertices\n\n for (let j = 0, jl = trianglePropertiesProps.length; j < jl; j++) {\n const triangleProperty = trianglePropertiesProps[j]\n\n positionData.push(vertices[triangleProperty.v1 * 3 + 0])\n positionData.push(vertices[triangleProperty.v1 * 3 + 1])\n positionData.push(vertices[triangleProperty.v1 * 3 + 2])\n\n positionData.push(vertices[triangleProperty.v2 * 3 + 0])\n positionData.push(vertices[triangleProperty.v2 * 3 + 1])\n positionData.push(vertices[triangleProperty.v2 * 3 + 2])\n\n positionData.push(vertices[triangleProperty.v3 * 3 + 0])\n positionData.push(vertices[triangleProperty.v3 * 3 + 1])\n positionData.push(vertices[triangleProperty.v3 * 3 + 2])\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(positionData, 3))\n\n //\n\n const mesh = new Mesh(geometry, material)\n meshes.push(mesh)\n }\n\n return meshes\n }\n\n function buildTexturedMesh(\n texture2dgroup,\n triangleProperties,\n meshData,\n objects,\n modelData,\n textureData,\n objectData,\n ) {\n // geometry\n\n const geometry = new BufferGeometry()\n\n const positionData = []\n const uvData = []\n\n const vertices = meshData.vertices\n const uvs = texture2dgroup.uvs\n\n for (let i = 0, l = triangleProperties.length; i < l; i++) {\n const triangleProperty = triangleProperties[i]\n\n positionData.push(vertices[triangleProperty.v1 * 3 + 0])\n positionData.push(vertices[triangleProperty.v1 * 3 + 1])\n positionData.push(vertices[triangleProperty.v1 * 3 + 2])\n\n positionData.push(vertices[triangleProperty.v2 * 3 + 0])\n positionData.push(vertices[triangleProperty.v2 * 3 + 1])\n positionData.push(vertices[triangleProperty.v2 * 3 + 2])\n\n positionData.push(vertices[triangleProperty.v3 * 3 + 0])\n positionData.push(vertices[triangleProperty.v3 * 3 + 1])\n positionData.push(vertices[triangleProperty.v3 * 3 + 2])\n\n //\n\n uvData.push(uvs[triangleProperty.p1 * 2 + 0])\n uvData.push(uvs[triangleProperty.p1 * 2 + 1])\n\n uvData.push(uvs[triangleProperty.p2 * 2 + 0])\n uvData.push(uvs[triangleProperty.p2 * 2 + 1])\n\n uvData.push(uvs[triangleProperty.p3 * 2 + 0])\n uvData.push(uvs[triangleProperty.p3 * 2 + 1])\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(positionData, 3))\n geometry.setAttribute('uv', new Float32BufferAttribute(uvData, 2))\n\n // material\n\n const texture = getBuild(texture2dgroup, objects, modelData, textureData, objectData, buildTexture)\n\n const material = new MeshPhongMaterial({ map: texture, flatShading: true })\n\n // mesh\n\n const mesh = new Mesh(geometry, material)\n\n return mesh\n }\n\n function buildVertexColorMesh(colorgroup, triangleProperties, meshData, objects, modelData, objectData) {\n // geometry\n\n const geometry = new BufferGeometry()\n\n const positionData = []\n const colorData = []\n\n const vertices = meshData.vertices\n const colors = colorgroup.colors\n\n for (let i = 0, l = triangleProperties.length; i < l; i++) {\n const triangleProperty = triangleProperties[i]\n\n const v1 = triangleProperty.v1\n const v2 = triangleProperty.v2\n const v3 = triangleProperty.v3\n\n positionData.push(vertices[v1 * 3 + 0])\n positionData.push(vertices[v1 * 3 + 1])\n positionData.push(vertices[v1 * 3 + 2])\n\n positionData.push(vertices[v2 * 3 + 0])\n positionData.push(vertices[v2 * 3 + 1])\n positionData.push(vertices[v2 * 3 + 2])\n\n positionData.push(vertices[v3 * 3 + 0])\n positionData.push(vertices[v3 * 3 + 1])\n positionData.push(vertices[v3 * 3 + 2])\n\n //\n\n const p1 = triangleProperty.p1 !== undefined ? triangleProperty.p1 : objectData.pindex\n const p2 = triangleProperty.p2 !== undefined ? triangleProperty.p2 : p1\n const p3 = triangleProperty.p3 !== undefined ? triangleProperty.p3 : p1\n\n colorData.push(colors[p1 * 3 + 0])\n colorData.push(colors[p1 * 3 + 1])\n colorData.push(colors[p1 * 3 + 2])\n\n colorData.push(colors[p2 * 3 + 0])\n colorData.push(colors[p2 * 3 + 1])\n colorData.push(colors[p2 * 3 + 2])\n\n colorData.push(colors[p3 * 3 + 0])\n colorData.push(colors[p3 * 3 + 1])\n colorData.push(colors[p3 * 3 + 2])\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(positionData, 3))\n geometry.setAttribute('color', new Float32BufferAttribute(colorData, 3))\n\n // material\n\n const material = new MeshPhongMaterial({ vertexColors: true, flatShading: true })\n\n // mesh\n\n const mesh = new Mesh(geometry, material)\n\n return mesh\n }\n\n function buildDefaultMesh(meshData) {\n const geometry = new BufferGeometry()\n geometry.setIndex(new BufferAttribute(meshData['triangles'], 1))\n geometry.setAttribute('position', new BufferAttribute(meshData['vertices'], 3))\n\n const material = new MeshPhongMaterial({ color: 0xaaaaff, flatShading: true })\n\n const mesh = new Mesh(geometry, material)\n\n return mesh\n }\n\n function buildMeshes(resourceMap, meshData, objects, modelData, textureData, objectData) {\n const keys = Object.keys(resourceMap)\n const meshes = []\n\n for (let i = 0, il = keys.length; i < il; i++) {\n const resourceId = keys[i]\n const triangleProperties = resourceMap[resourceId]\n const resourceType = getResourceType(resourceId, modelData)\n\n switch (resourceType) {\n case 'material':\n const basematerials = modelData.resources.basematerials[resourceId]\n const newMeshes = buildBasematerialsMeshes(\n basematerials,\n triangleProperties,\n meshData,\n objects,\n modelData,\n textureData,\n objectData,\n )\n\n for (let j = 0, jl = newMeshes.length; j < jl; j++) {\n meshes.push(newMeshes[j])\n }\n\n break\n\n case 'texture':\n const texture2dgroup = modelData.resources.texture2dgroup[resourceId]\n meshes.push(\n buildTexturedMesh(\n texture2dgroup,\n triangleProperties,\n meshData,\n objects,\n modelData,\n textureData,\n objectData,\n ),\n )\n break\n\n case 'vertexColors':\n const colorgroup = modelData.resources.colorgroup[resourceId]\n meshes.push(buildVertexColorMesh(colorgroup, triangleProperties, meshData, objects, modelData, objectData))\n break\n\n case 'default':\n meshes.push(buildDefaultMesh(meshData))\n break\n\n default:\n console.error('THREE.3MFLoader: Unsupported resource type.')\n }\n }\n\n return meshes\n }\n\n function getResourceType(pid, modelData) {\n if (modelData.resources.texture2dgroup[pid] !== undefined) {\n return 'texture'\n } else if (modelData.resources.basematerials[pid] !== undefined) {\n return 'material'\n } else if (modelData.resources.colorgroup[pid] !== undefined) {\n return 'vertexColors'\n } else if (pid === 'default') {\n return 'default'\n } else {\n return undefined\n }\n }\n\n function analyzeObject(modelData, meshData, objectData) {\n const resourceMap = {}\n\n const triangleProperties = meshData['triangleProperties']\n\n const objectPid = objectData.pid\n\n for (let i = 0, l = triangleProperties.length; i < l; i++) {\n const triangleProperty = triangleProperties[i]\n let pid = triangleProperty.pid !== undefined ? triangleProperty.pid : objectPid\n\n if (pid === undefined) pid = 'default'\n\n if (resourceMap[pid] === undefined) resourceMap[pid] = []\n\n resourceMap[pid].push(triangleProperty)\n }\n\n return resourceMap\n }\n\n function buildGroup(meshData, objects, modelData, textureData, objectData) {\n const group = new Group()\n\n const resourceMap = analyzeObject(modelData, meshData, objectData)\n const meshes = buildMeshes(resourceMap, meshData, objects, modelData, textureData, objectData)\n\n for (let i = 0, l = meshes.length; i < l; i++) {\n group.add(meshes[i])\n }\n\n return group\n }\n\n function applyExtensions(extensions, meshData, modelXml) {\n if (!extensions) {\n return\n }\n\n const availableExtensions = []\n const keys = Object.keys(extensions)\n\n for (let i = 0; i < keys.length; i++) {\n const ns = keys[i]\n\n for (let j = 0; j < scope.availableExtensions.length; j++) {\n const extension = scope.availableExtensions[j]\n\n if (extension.ns === ns) {\n availableExtensions.push(extension)\n }\n }\n }\n\n for (let i = 0; i < availableExtensions.length; i++) {\n const extension = availableExtensions[i]\n extension.apply(modelXml, extensions[extension['ns']], meshData)\n }\n }\n\n function getBuild(data, objects, modelData, textureData, objectData, builder) {\n if (data.build !== undefined) return data.build\n\n data.build = builder(data, objects, modelData, textureData, objectData)\n\n return data.build\n }\n\n function buildBasematerial(materialData, objects, modelData) {\n let material\n\n const displaypropertiesid = materialData.displaypropertiesid\n const pbmetallicdisplayproperties = modelData.resources.pbmetallicdisplayproperties\n\n if (displaypropertiesid !== null && pbmetallicdisplayproperties[displaypropertiesid] !== undefined) {\n // metallic display property, use StandardMaterial\n\n const pbmetallicdisplayproperty = pbmetallicdisplayproperties[displaypropertiesid]\n const metallicData = pbmetallicdisplayproperty.data[materialData.index]\n\n material = new MeshStandardMaterial({\n flatShading: true,\n roughness: metallicData.roughness,\n metalness: metallicData.metallicness,\n })\n } else {\n // otherwise use PhongMaterial\n\n material = new MeshPhongMaterial({ flatShading: true })\n }\n\n material.name = materialData.name\n\n // displaycolor MUST be specified with a value of a 6 or 8 digit hexadecimal number, e.g. \"#RRGGBB\" or \"#RRGGBBAA\"\n\n const displaycolor = materialData.displaycolor\n\n const color = displaycolor.substring(0, 7)\n material.color.setStyle(color)\n material.color.convertSRGBToLinear() // displaycolor is in sRGB\n\n // process alpha if set\n\n if (displaycolor.length === 9) {\n material.opacity = parseInt(displaycolor.charAt(7) + displaycolor.charAt(8), 16) / 255\n }\n\n return material\n }\n\n function buildComposite(compositeData, objects, modelData, textureData) {\n const composite = new Group()\n\n for (let j = 0; j < compositeData.length; j++) {\n const component = compositeData[j]\n let build = objects[component.objectId]\n\n if (build === undefined) {\n buildObject(component.objectId, objects, modelData, textureData)\n build = objects[component.objectId]\n }\n\n const object3D = build.clone()\n\n // apply component transform\n\n const transform = component.transform\n\n if (transform) {\n object3D.applyMatrix4(transform)\n }\n\n composite.add(object3D)\n }\n\n return composite\n }\n\n function buildObject(objectId, objects, modelData, textureData) {\n const objectData = modelData['resources']['object'][objectId]\n\n if (objectData['mesh']) {\n const meshData = objectData['mesh']\n\n const extensions = modelData['extensions']\n const modelXml = modelData['xml']\n\n applyExtensions(extensions, meshData, modelXml)\n\n objects[objectData.id] = getBuild(meshData, objects, modelData, textureData, objectData, buildGroup)\n } else {\n const compositeData = objectData['components']\n\n objects[objectData.id] = getBuild(compositeData, objects, modelData, textureData, objectData, buildComposite)\n }\n }\n\n function buildObjects(data3mf) {\n const modelsData = data3mf.model\n const modelRels = data3mf.modelRels\n const objects = {}\n const modelsKeys = Object.keys(modelsData)\n const textureData = {}\n\n // evaluate model relationships to textures\n\n if (modelRels) {\n for (let i = 0, l = modelRels.length; i < l; i++) {\n const modelRel = modelRels[i]\n const textureKey = modelRel.target.substring(1)\n\n if (data3mf.texture[textureKey]) {\n textureData[modelRel.target] = data3mf.texture[textureKey]\n }\n }\n }\n\n // start build\n\n for (let i = 0; i < modelsKeys.length; i++) {\n const modelsKey = modelsKeys[i]\n const modelData = modelsData[modelsKey]\n\n const objectIds = Object.keys(modelData['resources']['object'])\n\n for (let j = 0; j < objectIds.length; j++) {\n const objectId = objectIds[j]\n\n buildObject(objectId, objects, modelData, textureData)\n }\n }\n\n return objects\n }\n\n function fetch3DModelPart(rels) {\n for (let i = 0; i < rels.length; i++) {\n const rel = rels[i]\n const extension = rel.target.split('.').pop()\n\n if (extension.toLowerCase() === 'model') return rel\n }\n }\n\n function build(objects, data3mf) {\n const group = new Group()\n\n const relationship = fetch3DModelPart(data3mf['rels'])\n const buildData = data3mf.model[relationship['target'].substring(1)]['build']\n\n for (let i = 0; i < buildData.length; i++) {\n const buildItem = buildData[i]\n const object3D = objects[buildItem['objectId']]\n\n // apply transform\n\n const transform = buildItem['transform']\n\n if (transform) {\n object3D.applyMatrix4(transform)\n }\n\n group.add(object3D)\n }\n\n return group\n }\n\n const data3mf = loadDocument(data)\n const objects = buildObjects(data3mf)\n\n return build(objects, data3mf)\n }\n\n addExtension(extension) {\n this.availableExtensions.push(extension)\n }\n}\n\nexport { ThreeMFLoader }\n"],"names":["data","relsView","relsFileText","i","objects","build","data3mf"],"mappings":";;AAyCA,MAAM,sBAAsB,OAAO;AAAA,EACjC,YAAY,SAAS;AACnB,UAAM,OAAO;AACb,SAAK,sBAAsB,CAAE;AAAA,EAC9B;AAAA,EAED,KAAK,KAAK,QAAQ,YAAY,SAAS;AACrC,UAAM,QAAQ;AACd,UAAM,SAAS,IAAI,WAAW,MAAM,OAAO;AAC3C,WAAO,QAAQ,MAAM,IAAI;AACzB,WAAO,gBAAgB,aAAa;AACpC,WAAO,iBAAiB,MAAM,aAAa;AAC3C,WAAO,mBAAmB,MAAM,eAAe;AAC/C,WAAO;AAAA,MACL;AAAA,MACA,SAAU,QAAQ;AAChB,YAAI;AACF,iBAAO,MAAM,MAAM,MAAM,CAAC;AAAA,QAC3B,SAAQ,GAAP;AACA,cAAI,SAAS;AACX,oBAAQ,CAAC;AAAA,UACrB,OAAiB;AACL,oBAAQ,MAAM,CAAC;AAAA,UAChB;AAED,gBAAM,QAAQ,UAAU,GAAG;AAAA,QAC5B;AAAA,MACF;AAAA,MACD;AAAA,MACA;AAAA,IACD;AAAA,EACF;AAAA,EAED,MAAM,MAAM;AACV,UAAM,QAAQ;AACd,UAAM,gBAAgB,IAAI,cAAc,KAAK,OAAO;AAEpD,aAAS,aAAaA,OAAM;AAC1B,UAAI,MAAM;AACV,UAAI,OAAO;AAEX,UAAI;AACJ,UAAI;AACJ,YAAM,iBAAiB,CAAE;AAEzB,YAAM,oBAAoB,CAAE;AAG5B,UAAI;AACJ,YAAM,aAAa,CAAE;AACrB,YAAM,mBAAmB,CAAE;AAC3B,YAAM,gBAAgB,CAAE;AACxB,YAAM,aAAa,CAAE;AAErB,UAAI;AACF,cAAM,UAAU,IAAI,WAAWA,KAAI,CAAC;AAAA,MACrC,SAAQ,GAAP;AACA,YAAI,aAAa,gBAAgB;AAC/B,kBAAQ,MAAM,yDAAyD;AACvE,iBAAO;AAAA,QACR;AAAA,MACF;AAED,WAAK,QAAQ,KAAK;AAChB,YAAI,KAAK,MAAM,gBAAgB,GAAG;AAChC,qBAAW;AAAA,QACZ,WAAU,KAAK,MAAM,6BAA6B,GAAG;AACpD,0BAAgB;AAAA,QACjB,WAAU,KAAK,MAAM,iBAAiB,GAAG;AACxC,yBAAe,KAAK,IAAI;AAAA,QAClC,WAAmB,KAAK,MAAM,yBAAyB;AAAG;AAAA,iBAEvC,KAAK,MAAM,oBAAoB,GAAG;AAC3C,4BAAkB,KAAK,IAAI;AAAA,QAC5B,WAAU,KAAK,MAAM,gBAAgB;AAAG;AAAA,MAG1C;AAID,YAAM,WAAW,IAAI,QAAQ;AAC7B,YAAM,eAAe,YAAY,WAAW,QAAQ;AACpD,YAAM,OAAO,aAAa,YAAY;AAItC,UAAI,eAAe;AACjB,cAAMC,YAAW,IAAI,aAAa;AAClC,cAAMC,gBAAe,YAAY,WAAWD,SAAQ;AACpD,oBAAY,aAAaC,aAAY;AAAA,MACtC;AAID,eAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,cAAM,YAAY,eAAe,CAAC;AAClC,cAAM,OAAO,IAAI,SAAS;AAE1B,cAAM,WAAW,YAAY,WAAW,IAAI;AAC5C,cAAM,UAAU,IAAI,UAAS,EAAG,gBAAgB,UAAU,iBAAiB;AAE3E,YAAI,QAAQ,gBAAgB,SAAS,YAAW,MAAO,SAAS;AAC9D,kBAAQ,MAAM,gEAAgE,SAAS;AAAA,QACxF;AAED,cAAM,YAAY,QAAQ,cAAc,OAAO;AAC/C,cAAM,aAAa,CAAE;AAErB,iBAASC,KAAI,GAAGA,KAAI,UAAU,WAAW,QAAQA,MAAK;AACpD,gBAAM,OAAO,UAAU,WAAWA,EAAC;AACnC,cAAI,KAAK,KAAK,MAAM,cAAc,GAAG;AACnC,uBAAW,KAAK,KAAK,IAAI,OAAO;AAAA,UACjC;AAAA,QACF;AAED,cAAM,YAAY,eAAe,SAAS;AAC1C,kBAAU,KAAK,IAAI;AAEnB,YAAI,IAAI,OAAO,KAAK,UAAU,EAAE,QAAQ;AACtC,oBAAU,YAAY,IAAI;AAAA,QAC3B;AAED,mBAAW,SAAS,IAAI;AAAA,MACzB;AAID,eAAS,IAAI,GAAG,IAAI,kBAAkB,QAAQ,KAAK;AACjD,cAAM,mBAAmB,kBAAkB,CAAC;AAC5C,sBAAc,gBAAgB,IAAI,IAAI,gBAAgB,EAAE;AAAA,MACzD;AAED,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,QACT,OAAO;AAAA,MACR;AAAA,IACF;AAED,aAAS,aAAa,cAAc;AAClC,YAAM,gBAAgB,CAAE;AAExB,YAAM,cAAc,IAAI,UAAS,EAAG,gBAAgB,cAAc,iBAAiB;AAEnF,YAAM,YAAY,YAAY,iBAAiB,cAAc;AAE7D,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,cAAM,WAAW,UAAU,CAAC;AAE5B,cAAM,eAAe;AAAA,UACnB,QAAQ,SAAS,aAAa,QAAQ;AAAA;AAAA,UACtC,IAAI,SAAS,aAAa,IAAI;AAAA;AAAA,UAC9B,MAAM,SAAS,aAAa,MAAM;AAAA;AAAA,QACnC;AAED,sBAAc,KAAK,YAAY;AAAA,MAChC;AAED,aAAO;AAAA,IACR;AAED,aAAS,mBAAmB,eAAe;AACzC,YAAM,eAAe,CAAE;AAEvB,eAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,cAAM,eAAe,cAAc,CAAC;AACpC,cAAM,OAAO,aAAa,aAAa,MAAM;AAC7C,cAAM,aAAa;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAED,YAAI,KAAK,WAAW,QAAQ,IAAI,GAAG;AACjC,uBAAa,IAAI,IAAI,aAAa;AAAA,QACnC;AAAA,MACF;AAED,aAAO;AAAA,IACR;AAED,aAAS,uBAAuB,mBAAmB;AACjD,YAAM,oBAAoB;AAAA,QACxB,IAAI,kBAAkB,aAAa,IAAI;AAAA;AAAA,QACvC,eAAe,CAAE;AAAA,MAClB;AAED,YAAM,oBAAoB,kBAAkB,iBAAiB,MAAM;AAEnE,eAAS,IAAI,GAAG,IAAI,kBAAkB,QAAQ,KAAK;AACjD,cAAM,mBAAmB,kBAAkB,CAAC;AAC5C,cAAM,mBAAmB,sBAAsB,gBAAgB;AAC/D,yBAAiB,QAAQ;AACzB,0BAAkB,cAAc,KAAK,gBAAgB;AAAA,MACtD;AAED,aAAO;AAAA,IACR;AAED,aAAS,mBAAmB,eAAe;AACzC,YAAM,gBAAgB;AAAA,QACpB,IAAI,cAAc,aAAa,IAAI;AAAA;AAAA,QACnC,MAAM,cAAc,aAAa,MAAM;AAAA;AAAA,QACvC,aAAa,cAAc,aAAa,aAAa;AAAA;AAAA,QACrD,YAAY,cAAc,aAAa,YAAY;AAAA,QACnD,YAAY,cAAc,aAAa,YAAY;AAAA,QACnD,QAAQ,cAAc,aAAa,QAAQ;AAAA,MAC5C;AAED,aAAO;AAAA,IACR;AAED,aAAS,yBAAyB,oBAAoB;AACpD,YAAM,qBAAqB;AAAA,QACzB,IAAI,mBAAmB,aAAa,IAAI;AAAA;AAAA,QACxC,OAAO,mBAAmB,aAAa,OAAO;AAAA;AAAA,QAC9C,qBAAqB,mBAAmB,aAAa,qBAAqB;AAAA,MAC3E;AAED,YAAM,iBAAiB,mBAAmB,iBAAiB,WAAW;AAEtE,YAAM,MAAM,CAAE;AAEd,eAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,cAAM,gBAAgB,eAAe,CAAC;AACtC,cAAM,IAAI,cAAc,aAAa,GAAG;AACxC,cAAM,IAAI,cAAc,aAAa,GAAG;AAExC,YAAI,KAAK,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC;AAAA,MACtC;AAED,yBAAmB,KAAK,IAAI,IAAI,aAAa,GAAG;AAEhD,aAAO;AAAA,IACR;AAED,aAAS,oBAAoB,gBAAgB;AAC3C,YAAM,iBAAiB;AAAA,QACrB,IAAI,eAAe,aAAa,IAAI;AAAA;AAAA,QACpC,qBAAqB,eAAe,aAAa,qBAAqB;AAAA,MACvE;AAED,YAAM,aAAa,eAAe,iBAAiB,OAAO;AAE1D,YAAM,SAAS,CAAE;AACjB,YAAM,cAAc,IAAI,MAAO;AAE/B,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,cAAM,YAAY,WAAW,CAAC;AAC9B,cAAM,QAAQ,UAAU,aAAa,OAAO;AAE5C,oBAAY,SAAS,MAAM,UAAU,GAAG,CAAC,CAAC;AAC1C,oBAAY,oBAAqB;AAEjC,eAAO,KAAK,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAAA,MACxD;AAED,qBAAe,QAAQ,IAAI,IAAI,aAAa,MAAM;AAElD,aAAO;AAAA,IACR;AAED,aAAS,mCAAmC,8BAA8B;AACxE,YAAM,gCAAgC;AAAA,QACpC,IAAI,6BAA6B,aAAa,IAAI;AAAA;AAAA,MACnD;AAED,YAAM,gBAAgB,6BAA6B,iBAAiB,YAAY;AAEhF,YAAM,eAAe,CAAE;AAEvB,eAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,cAAM,eAAe,cAAc,CAAC;AAEpC,qBAAa,KAAK;AAAA,UAChB,MAAM,aAAa,aAAa,MAAM;AAAA;AAAA,UACtC,cAAc,WAAW,aAAa,aAAa,cAAc,CAAC;AAAA;AAAA,UAClE,WAAW,WAAW,aAAa,aAAa,WAAW,CAAC;AAAA;AAAA,QACtE,CAAS;AAAA,MACF;AAED,oCAA8B,OAAO;AAErC,aAAO;AAAA,IACR;AAED,aAAS,sBAAsB,kBAAkB;AAC/C,YAAM,mBAAmB,CAAE;AAE3B,uBAAiB,MAAM,IAAI,iBAAiB,aAAa,MAAM;AAC/D,uBAAiB,cAAc,IAAI,iBAAiB,aAAa,cAAc;AAC/E,uBAAiB,qBAAqB,IAAI,iBAAiB,aAAa,qBAAqB;AAE7F,aAAO;AAAA,IACR;AAED,aAAS,cAAc,UAAU;AAC/B,YAAM,WAAW,CAAE;AAEnB,YAAM,WAAW,CAAE;AACnB,YAAM,cAAc,SAAS,iBAAiB,iBAAiB;AAE/D,eAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,cAAM,aAAa,YAAY,CAAC;AAChC,cAAM,IAAI,WAAW,aAAa,GAAG;AACrC,cAAM,IAAI,WAAW,aAAa,GAAG;AACrC,cAAM,IAAI,WAAW,aAAa,GAAG;AAErC,iBAAS,KAAK,WAAW,CAAC,GAAG,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC;AAAA,MAC1D;AAED,eAAS,UAAU,IAAI,IAAI,aAAa,QAAQ;AAEhD,YAAM,qBAAqB,CAAE;AAC7B,YAAM,YAAY,CAAE;AACpB,YAAM,gBAAgB,SAAS,iBAAiB,oBAAoB;AAEpE,eAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,cAAM,eAAe,cAAc,CAAC;AACpC,cAAM,KAAK,aAAa,aAAa,IAAI;AACzC,cAAM,KAAK,aAAa,aAAa,IAAI;AACzC,cAAM,KAAK,aAAa,aAAa,IAAI;AACzC,cAAM,KAAK,aAAa,aAAa,IAAI;AACzC,cAAM,KAAK,aAAa,aAAa,IAAI;AACzC,cAAM,KAAK,aAAa,aAAa,IAAI;AACzC,cAAM,MAAM,aAAa,aAAa,KAAK;AAE3C,cAAM,mBAAmB,CAAE;AAE3B,yBAAiB,IAAI,IAAI,SAAS,IAAI,EAAE;AACxC,yBAAiB,IAAI,IAAI,SAAS,IAAI,EAAE;AACxC,yBAAiB,IAAI,IAAI,SAAS,IAAI,EAAE;AAExC,kBAAU,KAAK,iBAAiB,IAAI,GAAG,iBAAiB,IAAI,GAAG,iBAAiB,IAAI,CAAC;AAIrF,YAAI,IAAI;AACN,2BAAiB,IAAI,IAAI,SAAS,IAAI,EAAE;AAAA,QACzC;AAED,YAAI,IAAI;AACN,2BAAiB,IAAI,IAAI,SAAS,IAAI,EAAE;AAAA,QACzC;AAED,YAAI,IAAI;AACN,2BAAiB,IAAI,IAAI,SAAS,IAAI,EAAE;AAAA,QACzC;AAED,YAAI,KAAK;AACP,2BAAiB,KAAK,IAAI;AAAA,QAC3B;AAED,YAAI,IAAI,OAAO,KAAK,gBAAgB,EAAE,QAAQ;AAC5C,6BAAmB,KAAK,gBAAgB;AAAA,QACzC;AAAA,MACF;AAED,eAAS,oBAAoB,IAAI;AACjC,eAAS,WAAW,IAAI,IAAI,YAAY,SAAS;AAEjD,aAAO;AAAA,IACR;AAED,aAAS,oBAAoB,gBAAgB;AAC3C,YAAM,aAAa,CAAE;AAErB,YAAM,iBAAiB,eAAe,iBAAiB,WAAW;AAElE,eAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,cAAM,gBAAgB,eAAe,CAAC;AACtC,cAAM,gBAAgB,mBAAmB,aAAa;AACtD,mBAAW,KAAK,aAAa;AAAA,MAC9B;AAED,aAAO;AAAA,IACR;AAED,aAAS,mBAAmB,eAAe;AACzC,YAAM,gBAAgB,CAAE;AAExB,oBAAc,UAAU,IAAI,cAAc,aAAa,UAAU;AAEjE,YAAM,YAAY,cAAc,aAAa,WAAW;AAExD,UAAI,WAAW;AACb,sBAAc,WAAW,IAAI,eAAe,SAAS;AAAA,MACtD;AAED,aAAO;AAAA,IACR;AAED,aAAS,eAAe,WAAW;AACjC,YAAM,IAAI,CAAE;AACZ,gBAAU,MAAM,GAAG,EAAE,QAAQ,SAAU,GAAG;AACxC,UAAE,KAAK,WAAW,CAAC,CAAC;AAAA,MAC5B,CAAO;AAED,YAAM,SAAS,IAAI,QAAS;AAC5B,aAAO,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,GAAK,GAAK,GAAK,CAAG;AAEvG,aAAO;AAAA,IACR;AAED,aAAS,gBAAgB,YAAY;AACnC,YAAM,aAAa;AAAA,QACjB,MAAM,WAAW,aAAa,MAAM;AAAA,MACrC;AAED,YAAM,KAAK,WAAW,aAAa,IAAI;AAEvC,UAAI,IAAI;AACN,mBAAW,IAAI,IAAI;AAAA,MACpB;AAED,YAAM,MAAM,WAAW,aAAa,KAAK;AAEzC,UAAI,KAAK;AACP,mBAAW,KAAK,IAAI;AAAA,MACrB;AAED,YAAM,SAAS,WAAW,aAAa,QAAQ;AAE/C,UAAI,QAAQ;AACV,mBAAW,QAAQ,IAAI;AAAA,MACxB;AAED,YAAM,YAAY,WAAW,aAAa,WAAW;AAErD,UAAI,WAAW;AACb,mBAAW,WAAW,IAAI;AAAA,MAC3B;AAED,YAAM,aAAa,WAAW,aAAa,YAAY;AAEvD,UAAI,YAAY;AACd,mBAAW,YAAY,IAAI;AAAA,MAC5B;AAED,YAAM,OAAO,WAAW,aAAa,MAAM;AAE3C,UAAI,MAAM;AACR,mBAAW,MAAM,IAAI;AAAA,MACtB;AAED,YAAM,WAAW,WAAW,cAAc,MAAM;AAEhD,UAAI,UAAU;AACZ,mBAAW,MAAM,IAAI,cAAc,QAAQ;AAAA,MAC5C;AAED,YAAM,iBAAiB,WAAW,cAAc,YAAY;AAE5D,UAAI,gBAAgB;AAClB,mBAAW,YAAY,IAAI,oBAAoB,cAAc;AAAA,MAC9D;AAED,aAAO;AAAA,IACR;AAED,aAAS,mBAAmB,eAAe;AACzC,YAAM,gBAAgB,CAAE;AAExB,oBAAc,eAAe,IAAI,CAAE;AACnC,YAAM,qBAAqB,cAAc,iBAAiB,eAAe;AAEzE,eAAS,IAAI,GAAG,IAAI,mBAAmB,QAAQ,KAAK;AAClD,cAAM,oBAAoB,mBAAmB,CAAC;AAC9C,cAAM,oBAAoB,uBAAuB,iBAAiB;AAClE,sBAAc,eAAe,EAAE,kBAAkB,IAAI,CAAC,IAAI;AAAA,MAC3D;AAID,oBAAc,WAAW,IAAI,CAAE;AAC/B,YAAM,kBAAkB,cAAc,iBAAiB,WAAW;AAElE,eAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,cAAM,iBAAiB,gBAAgB,CAAC;AACxC,cAAM,gBAAgB,mBAAmB,cAAc;AACvD,sBAAc,WAAW,EAAE,cAAc,IAAI,CAAC,IAAI;AAAA,MACnD;AAID,oBAAc,YAAY,IAAI,CAAE;AAChC,YAAM,kBAAkB,cAAc,iBAAiB,YAAY;AAEnE,eAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,cAAM,iBAAiB,gBAAgB,CAAC;AACxC,cAAM,iBAAiB,oBAAoB,cAAc;AACzD,sBAAc,YAAY,EAAE,eAAe,IAAI,CAAC,IAAI;AAAA,MACrD;AAID,oBAAc,6BAA6B,IAAI,CAAE;AACjD,YAAM,mCAAmC,cAAc,iBAAiB,6BAA6B;AAErG,eAAS,IAAI,GAAG,IAAI,iCAAiC,QAAQ,KAAK;AAChE,cAAM,kCAAkC,iCAAiC,CAAC;AAC1E,cAAM,kCAAkC,mCAAmC,+BAA+B;AAC1G,sBAAc,6BAA6B,EACzC,gCAAgC,IAAI,CAC9C,IAAY;AAAA,MACL;AAID,oBAAc,gBAAgB,IAAI,CAAE;AACpC,YAAM,uBAAuB,cAAc,iBAAiB,gBAAgB;AAE5E,eAAS,IAAI,GAAG,IAAI,qBAAqB,QAAQ,KAAK;AACpD,cAAM,sBAAsB,qBAAqB,CAAC;AAClD,cAAM,sBAAsB,yBAAyB,mBAAmB;AACxE,sBAAc,gBAAgB,EAAE,oBAAoB,IAAI,CAAC,IAAI;AAAA,MAC9D;AAID,oBAAc,QAAQ,IAAI,CAAE;AAC5B,YAAM,cAAc,cAAc,iBAAiB,QAAQ;AAE3D,eAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,cAAM,aAAa,YAAY,CAAC;AAChC,cAAM,aAAa,gBAAgB,UAAU;AAC7C,sBAAc,QAAQ,EAAE,WAAW,IAAI,CAAC,IAAI;AAAA,MAC7C;AAED,aAAO;AAAA,IACR;AAED,aAAS,eAAe,WAAW;AACjC,YAAM,YAAY,CAAE;AACpB,YAAM,YAAY,UAAU,iBAAiB,MAAM;AAEnD,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,cAAM,WAAW,UAAU,CAAC;AAC5B,cAAM,YAAY;AAAA,UAChB,UAAU,SAAS,aAAa,UAAU;AAAA,QAC3C;AACD,cAAM,YAAY,SAAS,aAAa,WAAW;AAEnD,YAAI,WAAW;AACb,oBAAU,WAAW,IAAI,eAAe,SAAS;AAAA,QAClD;AAED,kBAAU,KAAK,SAAS;AAAA,MACzB;AAED,aAAO;AAAA,IACR;AAED,aAAS,eAAe,WAAW;AACjC,YAAM,YAAY,EAAE,MAAM,UAAU,aAAa,MAAM,KAAK,aAAc;AAC1E,YAAM,gBAAgB,UAAU,iBAAiB,UAAU;AAE3D,UAAI,eAAe;AACjB,kBAAU,UAAU,IAAI,mBAAmB,aAAa;AAAA,MACzD;AAED,YAAM,gBAAgB,UAAU,cAAc,WAAW;AAEzD,UAAI,eAAe;AACjB,kBAAU,WAAW,IAAI,mBAAmB,aAAa;AAAA,MAC1D;AAED,YAAM,YAAY,UAAU,cAAc,OAAO;AAEjD,UAAI,WAAW;AACb,kBAAU,OAAO,IAAI,eAAe,SAAS;AAAA,MAC9C;AAED,aAAO;AAAA,IACR;AAED,aAAS,aAAa,gBAAgBC,UAAS,WAAW,aAAa;AACrE,YAAM,QAAQ,eAAe;AAC7B,YAAM,aAAa,UAAU,UAAU;AACvC,YAAM,YAAY,WAAW,KAAK;AAElC,UAAI,WAAW;AACb,cAAMJ,QAAO,YAAY,UAAU,IAAI;AACvC,cAAM,OAAO,UAAU;AAEvB,cAAM,OAAO,IAAI,KAAK,CAACA,KAAI,GAAG,EAAE,MAAY;AAC5C,cAAM,YAAY,IAAI,gBAAgB,IAAI;AAE1C,cAAM,UAAU,cAAc,KAAK,WAAW,WAAY;AACxD,cAAI,gBAAgB,SAAS;AAAA,QACvC,CAAS;AAED,YAAI,gBAAgB;AAAS,kBAAQ,aAAa;AAAA;AAC7C,kBAAQ,WAAW;AAIxB,gBAAQ,UAAU,YAAU;AAAA,UAC1B,KAAK;AACH,oBAAQ,QAAQ;AAChB;AAAA,UAEF,KAAK;AACH,oBAAQ,QAAQ;AAChB;AAAA,UAEF,KAAK;AAAA,UACL,KAAK;AACH,oBAAQ,QAAQ;AAChB;AAAA,UAEF;AACE,oBAAQ,QAAQ;AAAA,QACnB;AAED,gBAAQ,UAAU,YAAU;AAAA,UAC1B,KAAK;AACH,oBAAQ,QAAQ;AAChB;AAAA,UAEF,KAAK;AACH,oBAAQ,QAAQ;AAChB;AAAA,UAEF,KAAK;AAAA,UACL,KAAK;AACH,oBAAQ,QAAQ;AAChB;AAAA,UAEF;AACE,oBAAQ,QAAQ;AAAA,QACnB;AAED,gBAAQ,UAAU,QAAM;AAAA,UACtB,KAAK;AACH,oBAAQ,YAAY;AACpB,oBAAQ,YAAY;AACpB;AAAA,UAEF,KAAK;AACH,oBAAQ,YAAY;AACpB,oBAAQ,YAAY;AACpB;AAAA,UAEF,KAAK;AACH,oBAAQ,YAAY;AACpB,oBAAQ,YAAY;AACpB;AAAA,UAEF;AACE,oBAAQ,YAAY;AACpB,oBAAQ,YAAY;AAAA,QACvB;AAED,eAAO;AAAA,MACf,OAAa;AACL,eAAO;AAAA,MACR;AAAA,IACF;AAED,aAAS,yBACP,eACA,oBACA,UACAI,UACA,WACA,aACA,YACA;AACA,YAAM,eAAe,WAAW;AAEhC,YAAM,cAAc,CAAE;AAEtB,eAAS,IAAI,GAAG,IAAI,mBAAmB,QAAQ,IAAI,GAAG,KAAK;AACzD,cAAM,mBAAmB,mBAAmB,CAAC;AAC7C,cAAM,SAAS,iBAAiB,OAAO,SAAY,iBAAiB,KAAK;AAEzE,YAAI,YAAY,MAAM,MAAM;AAAW,sBAAY,MAAM,IAAI,CAAE;AAE/D,oBAAY,MAAM,EAAE,KAAK,gBAAgB;AAAA,MAC1C;AAID,YAAM,OAAO,OAAO,KAAK,WAAW;AACpC,YAAM,SAAS,CAAE;AAEjB,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK;AAC3C,cAAM,gBAAgB,KAAK,CAAC;AAC5B,cAAM,0BAA0B,YAAY,aAAa;AACzD,cAAM,mBAAmB,cAAc,cAAc,aAAa;AAClE,cAAM,WAAW,SAAS,kBAAkBA,UAAS,WAAW,aAAa,YAAY,iBAAiB;AAI1G,cAAM,WAAW,IAAI,eAAgB;AAErC,cAAM,eAAe,CAAE;AAEvB,cAAM,WAAW,SAAS;AAE1B,iBAAS,IAAI,GAAG,KAAK,wBAAwB,QAAQ,IAAI,IAAI,KAAK;AAChE,gBAAM,mBAAmB,wBAAwB,CAAC;AAElD,uBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AACvD,uBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AACvD,uBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAEvD,uBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AACvD,uBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AACvD,uBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAEvD,uBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AACvD,uBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AACvD,uBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAAA,QACxD;AAED,iBAAS,aAAa,YAAY,IAAI,uBAAuB,cAAc,CAAC,CAAC;AAI7E,cAAM,OAAO,IAAI,KAAK,UAAU,QAAQ;AACxC,eAAO,KAAK,IAAI;AAAA,MACjB;AAED,aAAO;AAAA,IACR;AAED,aAAS,kBACP,gBACA,oBACA,UACAA,UACA,WACA,aACA,YACA;AAGA,YAAM,WAAW,IAAI,eAAgB;AAErC,YAAM,eAAe,CAAE;AACvB,YAAM,SAAS,CAAE;AAEjB,YAAM,WAAW,SAAS;AAC1B,YAAM,MAAM,eAAe;AAE3B,eAAS,IAAI,GAAG,IAAI,mBAAmB,QAAQ,IAAI,GAAG,KAAK;AACzD,cAAM,mBAAmB,mBAAmB,CAAC;AAE7C,qBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AACvD,qBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AACvD,qBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAEvD,qBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AACvD,qBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AACvD,qBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAEvD,qBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AACvD,qBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AACvD,qBAAa,KAAK,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAIvD,eAAO,KAAK,IAAI,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAC5C,eAAO,KAAK,IAAI,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAE5C,eAAO,KAAK,IAAI,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAC5C,eAAO,KAAK,IAAI,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAE5C,eAAO,KAAK,IAAI,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAC5C,eAAO,KAAK,IAAI,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAAA,MAC7C;AAED,eAAS,aAAa,YAAY,IAAI,uBAAuB,cAAc,CAAC,CAAC;AAC7E,eAAS,aAAa,MAAM,IAAI,uBAAuB,QAAQ,CAAC,CAAC;AAIjE,YAAM,UAAU,SAAS,gBAAgBA,UAAS,WAAW,aAAa,YAAY,YAAY;AAElG,YAAM,WAAW,IAAI,kBAAkB,EAAE,KAAK,SAAS,aAAa,MAAM;AAI1E,YAAM,OAAO,IAAI,KAAK,UAAU,QAAQ;AAExC,aAAO;AAAA,IACR;AAED,aAAS,qBAAqB,YAAY,oBAAoB,UAAUA,UAAS,WAAW,YAAY;AAGtG,YAAM,WAAW,IAAI,eAAgB;AAErC,YAAM,eAAe,CAAE;AACvB,YAAM,YAAY,CAAE;AAEpB,YAAM,WAAW,SAAS;AAC1B,YAAM,SAAS,WAAW;AAE1B,eAAS,IAAI,GAAG,IAAI,mBAAmB,QAAQ,IAAI,GAAG,KAAK;AACzD,cAAM,mBAAmB,mBAAmB,CAAC;AAE7C,cAAM,KAAK,iBAAiB;AAC5B,cAAM,KAAK,iBAAiB;AAC5B,cAAM,KAAK,iBAAiB;AAE5B,qBAAa,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC;AACtC,qBAAa,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC;AACtC,qBAAa,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC;AAEtC,qBAAa,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC;AACtC,qBAAa,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC;AACtC,qBAAa,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC;AAEtC,qBAAa,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC;AACtC,qBAAa,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC;AACtC,qBAAa,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC;AAItC,cAAM,KAAK,iBAAiB,OAAO,SAAY,iBAAiB,KAAK,WAAW;AAChF,cAAM,KAAK,iBAAiB,OAAO,SAAY,iBAAiB,KAAK;AACrE,cAAM,KAAK,iBAAiB,OAAO,SAAY,iBAAiB,KAAK;AAErE,kBAAU,KAAK,OAAO,KAAK,IAAI,CAAC,CAAC;AACjC,kBAAU,KAAK,OAAO,KAAK,IAAI,CAAC,CAAC;AACjC,kBAAU,KAAK,OAAO,KAAK,IAAI,CAAC,CAAC;AAEjC,kBAAU,KAAK,OAAO,KAAK,IAAI,CAAC,CAAC;AACjC,kBAAU,KAAK,OAAO,KAAK,IAAI,CAAC,CAAC;AACjC,kBAAU,KAAK,OAAO,KAAK,IAAI,CAAC,CAAC;AAEjC,kBAAU,KAAK,OAAO,KAAK,IAAI,CAAC,CAAC;AACjC,kBAAU,KAAK,OAAO,KAAK,IAAI,CAAC,CAAC;AACjC,kBAAU,KAAK,OAAO,KAAK,IAAI,CAAC,CAAC;AAAA,MAClC;AAED,eAAS,aAAa,YAAY,IAAI,uBAAuB,cAAc,CAAC,CAAC;AAC7E,eAAS,aAAa,SAAS,IAAI,uBAAuB,WAAW,CAAC,CAAC;AAIvE,YAAM,WAAW,IAAI,kBAAkB,EAAE,cAAc,MAAM,aAAa,MAAM;AAIhF,YAAM,OAAO,IAAI,KAAK,UAAU,QAAQ;AAExC,aAAO;AAAA,IACR;AAED,aAAS,iBAAiB,UAAU;AAClC,YAAM,WAAW,IAAI,eAAgB;AACrC,eAAS,SAAS,IAAI,gBAAgB,SAAS,WAAW,GAAG,CAAC,CAAC;AAC/D,eAAS,aAAa,YAAY,IAAI,gBAAgB,SAAS,UAAU,GAAG,CAAC,CAAC;AAE9E,YAAM,WAAW,IAAI,kBAAkB,EAAE,OAAO,UAAU,aAAa,MAAM;AAE7E,YAAM,OAAO,IAAI,KAAK,UAAU,QAAQ;AAExC,aAAO;AAAA,IACR;AAED,aAAS,YAAY,aAAa,UAAUA,UAAS,WAAW,aAAa,YAAY;AACvF,YAAM,OAAO,OAAO,KAAK,WAAW;AACpC,YAAM,SAAS,CAAE;AAEjB,eAAS,IAAI,GAAG,KAAK,KAAK,QAAQ,IAAI,IAAI,KAAK;AAC7C,cAAM,aAAa,KAAK,CAAC;AACzB,cAAM,qBAAqB,YAAY,UAAU;AACjD,cAAM,eAAe,gBAAgB,YAAY,SAAS;AAE1D,gBAAQ,cAAY;AAAA,UAClB,KAAK;AACH,kBAAM,gBAAgB,UAAU,UAAU,cAAc,UAAU;AAClE,kBAAM,YAAY;AAAA,cAChB;AAAA,cACA;AAAA,cACA;AAAA,cACAA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACD;AAED,qBAAS,IAAI,GAAG,KAAK,UAAU,QAAQ,IAAI,IAAI,KAAK;AAClD,qBAAO,KAAK,UAAU,CAAC,CAAC;AAAA,YACzB;AAED;AAAA,UAEF,KAAK;AACH,kBAAM,iBAAiB,UAAU,UAAU,eAAe,UAAU;AACpE,mBAAO;AAAA,cACL;AAAA,gBACE;AAAA,gBACA;AAAA,gBACA;AAAA,gBACAA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACD;AAAA,YACF;AACD;AAAA,UAEF,KAAK;AACH,kBAAM,aAAa,UAAU,UAAU,WAAW,UAAU;AAC5D,mBAAO,KAAK,qBAAqB,YAAY,oBAAoB,UAAUA,UAAS,WAAW,UAAU,CAAC;AAC1G;AAAA,UAEF,KAAK;AACH,mBAAO,KAAK,iBAAiB,QAAQ,CAAC;AACtC;AAAA,UAEF;AACE,oBAAQ,MAAM,6CAA6C;AAAA,QAC9D;AAAA,MACF;AAED,aAAO;AAAA,IACR;AAED,aAAS,gBAAgB,KAAK,WAAW;AACvC,UAAI,UAAU,UAAU,eAAe,GAAG,MAAM,QAAW;AACzD,eAAO;AAAA,MACf,WAAiB,UAAU,UAAU,cAAc,GAAG,MAAM,QAAW;AAC/D,eAAO;AAAA,MACf,WAAiB,UAAU,UAAU,WAAW,GAAG,MAAM,QAAW;AAC5D,eAAO;AAAA,MACf,WAAiB,QAAQ,WAAW;AAC5B,eAAO;AAAA,MACf,OAAa;AACL,eAAO;AAAA,MACR;AAAA,IACF;AAED,aAAS,cAAc,WAAW,UAAU,YAAY;AACtD,YAAM,cAAc,CAAE;AAEtB,YAAM,qBAAqB,SAAS,oBAAoB;AAExD,YAAM,YAAY,WAAW;AAE7B,eAAS,IAAI,GAAG,IAAI,mBAAmB,QAAQ,IAAI,GAAG,KAAK;AACzD,cAAM,mBAAmB,mBAAmB,CAAC;AAC7C,YAAI,MAAM,iBAAiB,QAAQ,SAAY,iBAAiB,MAAM;AAEtE,YAAI,QAAQ;AAAW,gBAAM;AAE7B,YAAI,YAAY,GAAG,MAAM;AAAW,sBAAY,GAAG,IAAI,CAAE;AAEzD,oBAAY,GAAG,EAAE,KAAK,gBAAgB;AAAA,MACvC;AAED,aAAO;AAAA,IACR;AAED,aAAS,WAAW,UAAUA,UAAS,WAAW,aAAa,YAAY;AACzE,YAAM,QAAQ,IAAI,MAAO;AAEzB,YAAM,cAAc,cAAc,WAAW,UAAU,UAAU;AACjE,YAAM,SAAS,YAAY,aAAa,UAAUA,UAAS,WAAW,aAAa,UAAU;AAE7F,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAI,GAAG,KAAK;AAC7C,cAAM,IAAI,OAAO,CAAC,CAAC;AAAA,MACpB;AAED,aAAO;AAAA,IACR;AAED,aAAS,gBAAgB,YAAY,UAAU,UAAU;AACvD,UAAI,CAAC,YAAY;AACf;AAAA,MACD;AAED,YAAM,sBAAsB,CAAE;AAC9B,YAAM,OAAO,OAAO,KAAK,UAAU;AAEnC,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAM,KAAK,KAAK,CAAC;AAEjB,iBAAS,IAAI,GAAG,IAAI,MAAM,oBAAoB,QAAQ,KAAK;AACzD,gBAAM,YAAY,MAAM,oBAAoB,CAAC;AAE7C,cAAI,UAAU,OAAO,IAAI;AACvB,gCAAoB,KAAK,SAAS;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAED,eAAS,IAAI,GAAG,IAAI,oBAAoB,QAAQ,KAAK;AACnD,cAAM,YAAY,oBAAoB,CAAC;AACvC,kBAAU,MAAM,UAAU,WAAW,UAAU,IAAI,CAAC,GAAG,QAAQ;AAAA,MAChE;AAAA,IACF;AAED,aAAS,SAASJ,OAAMI,UAAS,WAAW,aAAa,YAAY,SAAS;AAC5E,UAAIJ,MAAK,UAAU;AAAW,eAAOA,MAAK;AAE1C,MAAAA,MAAK,QAAQ,QAAQA,OAAMI,UAAS,WAAW,aAAa,UAAU;AAEtE,aAAOJ,MAAK;AAAA,IACb;AAED,aAAS,kBAAkB,cAAcI,UAAS,WAAW;AAC3D,UAAI;AAEJ,YAAM,sBAAsB,aAAa;AACzC,YAAM,8BAA8B,UAAU,UAAU;AAExD,UAAI,wBAAwB,QAAQ,4BAA4B,mBAAmB,MAAM,QAAW;AAGlG,cAAM,4BAA4B,4BAA4B,mBAAmB;AACjF,cAAM,eAAe,0BAA0B,KAAK,aAAa,KAAK;AAEtE,mBAAW,IAAI,qBAAqB;AAAA,UAClC,aAAa;AAAA,UACb,WAAW,aAAa;AAAA,UACxB,WAAW,aAAa;AAAA,QAClC,CAAS;AAAA,MACT,OAAa;AAGL,mBAAW,IAAI,kBAAkB,EAAE,aAAa,KAAI,CAAE;AAAA,MACvD;AAED,eAAS,OAAO,aAAa;AAI7B,YAAM,eAAe,aAAa;AAElC,YAAM,QAAQ,aAAa,UAAU,GAAG,CAAC;AACzC,eAAS,MAAM,SAAS,KAAK;AAC7B,eAAS,MAAM,oBAAqB;AAIpC,UAAI,aAAa,WAAW,GAAG;AAC7B,iBAAS,UAAU,SAAS,aAAa,OAAO,CAAC,IAAI,aAAa,OAAO,CAAC,GAAG,EAAE,IAAI;AAAA,MACpF;AAED,aAAO;AAAA,IACR;AAED,aAAS,eAAe,eAAeA,UAAS,WAAW,aAAa;AACtE,YAAM,YAAY,IAAI,MAAO;AAE7B,eAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,cAAM,YAAY,cAAc,CAAC;AACjC,YAAIC,SAAQD,SAAQ,UAAU,QAAQ;AAEtC,YAAIC,WAAU,QAAW;AACvB,sBAAY,UAAU,UAAUD,UAAS,WAAW,WAAW;AAC/D,UAAAC,SAAQD,SAAQ,UAAU,QAAQ;AAAA,QACnC;AAED,cAAM,WAAWC,OAAM,MAAO;AAI9B,cAAM,YAAY,UAAU;AAE5B,YAAI,WAAW;AACb,mBAAS,aAAa,SAAS;AAAA,QAChC;AAED,kBAAU,IAAI,QAAQ;AAAA,MACvB;AAED,aAAO;AAAA,IACR;AAED,aAAS,YAAY,UAAUD,UAAS,WAAW,aAAa;AAC9D,YAAM,aAAa,UAAU,WAAW,EAAE,QAAQ,EAAE,QAAQ;AAE5D,UAAI,WAAW,MAAM,GAAG;AACtB,cAAM,WAAW,WAAW,MAAM;AAElC,cAAM,aAAa,UAAU,YAAY;AACzC,cAAM,WAAW,UAAU,KAAK;AAEhC,wBAAgB,YAAY,UAAU,QAAQ;AAE9C,QAAAA,SAAQ,WAAW,EAAE,IAAI,SAAS,UAAUA,UAAS,WAAW,aAAa,YAAY,UAAU;AAAA,MAC3G,OAAa;AACL,cAAM,gBAAgB,WAAW,YAAY;AAE7C,QAAAA,SAAQ,WAAW,EAAE,IAAI,SAAS,eAAeA,UAAS,WAAW,aAAa,YAAY,cAAc;AAAA,MAC7G;AAAA,IACF;AAED,aAAS,aAAaE,UAAS;AAC7B,YAAM,aAAaA,SAAQ;AAC3B,YAAM,YAAYA,SAAQ;AAC1B,YAAMF,WAAU,CAAE;AAClB,YAAM,aAAa,OAAO,KAAK,UAAU;AACzC,YAAM,cAAc,CAAE;AAItB,UAAI,WAAW;AACb,iBAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,IAAI,GAAG,KAAK;AAChD,gBAAM,WAAW,UAAU,CAAC;AAC5B,gBAAM,aAAa,SAAS,OAAO,UAAU,CAAC;AAE9C,cAAIE,SAAQ,QAAQ,UAAU,GAAG;AAC/B,wBAAY,SAAS,MAAM,IAAIA,SAAQ,QAAQ,UAAU;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAID,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,cAAM,YAAY,WAAW,CAAC;AAC9B,cAAM,YAAY,WAAW,SAAS;AAEtC,cAAM,YAAY,OAAO,KAAK,UAAU,WAAW,EAAE,QAAQ,CAAC;AAE9D,iBAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,gBAAM,WAAW,UAAU,CAAC;AAE5B,sBAAY,UAAUF,UAAS,WAAW,WAAW;AAAA,QACtD;AAAA,MACF;AAED,aAAOA;AAAA,IACR;AAED,aAAS,iBAAiB,MAAM;AAC9B,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAM,MAAM,KAAK,CAAC;AAClB,cAAM,YAAY,IAAI,OAAO,MAAM,GAAG,EAAE,IAAK;AAE7C,YAAI,UAAU,kBAAkB;AAAS,iBAAO;AAAA,MACjD;AAAA,IACF;AAED,aAAS,MAAMA,UAASE,UAAS;AAC/B,YAAM,QAAQ,IAAI,MAAO;AAEzB,YAAM,eAAe,iBAAiBA,SAAQ,MAAM,CAAC;AACrD,YAAM,YAAYA,SAAQ,MAAM,aAAa,QAAQ,EAAE,UAAU,CAAC,CAAC,EAAE,OAAO;AAE5E,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,cAAM,YAAY,UAAU,CAAC;AAC7B,cAAM,WAAWF,SAAQ,UAAU,UAAU,CAAC;AAI9C,cAAM,YAAY,UAAU,WAAW;AAEvC,YAAI,WAAW;AACb,mBAAS,aAAa,SAAS;AAAA,QAChC;AAED,cAAM,IAAI,QAAQ;AAAA,MACnB;AAED,aAAO;AAAA,IACR;AAED,UAAM,UAAU,aAAa,IAAI;AACjC,UAAM,UAAU,aAAa,OAAO;AAEpC,WAAO,MAAM,SAAS,OAAO;AAAA,EAC9B;AAAA,EAED,aAAa,WAAW;AACtB,SAAK,oBAAoB,KAAK,SAAS;AAAA,EACxC;AACH;"}
|
|
1
|
+
{"version":3,"file":"3MFLoader.js","sources":["../../src/loaders/3MFLoader.js"],"sourcesContent":["import {\n BufferAttribute,\n BufferGeometry,\n ClampToEdgeWrapping,\n Color,\n FileLoader,\n Float32BufferAttribute,\n Group,\n LinearFilter,\n LinearMipmapLinearFilter,\n Loader,\n LoaderUtils,\n Matrix4,\n Mesh,\n MeshPhongMaterial,\n MeshStandardMaterial,\n MirroredRepeatWrapping,\n NearestFilter,\n RepeatWrapping,\n TextureLoader,\n} from 'three'\nimport { unzipSync } from 'fflate'\nimport { decodeText } from '../_polyfill/LoaderUtils'\n\n/**\n *\n * 3D Manufacturing Format (3MF) specification: https://3mf.io/specification/\n *\n * The following features from the core specification are supported:\n *\n * - 3D Models\n * - Object Resources (Meshes and Components)\n * - Material Resources (Base Materials)\n *\n * 3MF Materials and Properties Extension are only partially supported.\n *\n * - Texture 2D\n * - Texture 2D Groups\n * - Color Groups (Vertex Colors)\n * - Metallic Display Properties (PBR)\n */\n\nclass ThreeMFLoader extends Loader {\n constructor(manager) {\n super(manager)\n this.availableExtensions = []\n }\n\n load(url, onLoad, onProgress, onError) {\n const scope = this\n const loader = new FileLoader(scope.manager)\n loader.setPath(scope.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(scope.requestHeader)\n loader.setWithCredentials(scope.withCredentials)\n loader.load(\n url,\n function (buffer) {\n try {\n onLoad(scope.parse(buffer))\n } catch (e) {\n if (onError) {\n onError(e)\n } else {\n console.error(e)\n }\n\n scope.manager.itemError(url)\n }\n },\n onProgress,\n onError,\n )\n }\n\n parse(data) {\n const scope = this\n const textureLoader = new TextureLoader(this.manager)\n\n function loadDocument(data) {\n let zip = null\n let file = null\n\n let relsName\n let modelRelsName\n const modelPartNames = []\n const printTicketPartNames = []\n const texturesPartNames = []\n const otherPartNames = []\n\n let modelRels\n const modelParts = {}\n const printTicketParts = {}\n const texturesParts = {}\n const otherParts = {}\n\n try {\n zip = unzipSync(new Uint8Array(data))\n } catch (e) {\n if (e instanceof ReferenceError) {\n console.error('THREE.3MFLoader: fflate missing and file is compressed.')\n return null\n }\n }\n\n for (file in zip) {\n if (file.match(/\\_rels\\/.rels$/)) {\n relsName = file\n } else if (file.match(/3D\\/_rels\\/.*\\.model\\.rels$/)) {\n modelRelsName = file\n } else if (file.match(/^3D\\/.*\\.model$/)) {\n modelPartNames.push(file)\n } else if (file.match(/^3D\\/Metadata\\/.*\\.xml$/)) {\n printTicketPartNames.push(file)\n } else if (file.match(/^3D\\/Textures?\\/.*/)) {\n texturesPartNames.push(file)\n } else if (file.match(/^3D\\/Other\\/.*/)) {\n otherPartNames.push(file)\n }\n }\n\n //\n\n const relsView = zip[relsName]\n const relsFileText = decodeText(relsView)\n const rels = parseRelsXml(relsFileText)\n\n //\n\n if (modelRelsName) {\n const relsView = zip[modelRelsName]\n const relsFileText = decodeText(relsView)\n modelRels = parseRelsXml(relsFileText)\n }\n\n //\n\n for (let i = 0; i < modelPartNames.length; i++) {\n const modelPart = modelPartNames[i]\n const view = zip[modelPart]\n\n const fileText = decodeText(view)\n const xmlData = new DOMParser().parseFromString(fileText, 'application/xml')\n\n if (xmlData.documentElement.nodeName.toLowerCase() !== 'model') {\n console.error('THREE.3MFLoader: Error loading 3MF - no 3MF document found: ', modelPart)\n }\n\n const modelNode = xmlData.querySelector('model')\n const extensions = {}\n\n for (let i = 0; i < modelNode.attributes.length; i++) {\n const attr = modelNode.attributes[i]\n if (attr.name.match(/^xmlns:(.+)$/)) {\n extensions[attr.value] = RegExp.$1\n }\n }\n\n const modelData = parseModelNode(modelNode)\n modelData['xml'] = modelNode\n\n if (0 < Object.keys(extensions).length) {\n modelData['extensions'] = extensions\n }\n\n modelParts[modelPart] = modelData\n }\n\n //\n\n for (let i = 0; i < texturesPartNames.length; i++) {\n const texturesPartName = texturesPartNames[i]\n texturesParts[texturesPartName] = zip[texturesPartName].buffer\n }\n\n return {\n rels: rels,\n modelRels: modelRels,\n model: modelParts,\n printTicket: printTicketParts,\n texture: texturesParts,\n other: otherParts,\n }\n }\n\n function parseRelsXml(relsFileText) {\n const relationships = []\n\n const relsXmlData = new DOMParser().parseFromString(relsFileText, 'application/xml')\n\n const relsNodes = relsXmlData.querySelectorAll('Relationship')\n\n for (let i = 0; i < relsNodes.length; i++) {\n const relsNode = relsNodes[i]\n\n const relationship = {\n target: relsNode.getAttribute('Target'), //required\n id: relsNode.getAttribute('Id'), //required\n type: relsNode.getAttribute('Type'), //required\n }\n\n relationships.push(relationship)\n }\n\n return relationships\n }\n\n function parseMetadataNodes(metadataNodes) {\n const metadataData = {}\n\n for (let i = 0; i < metadataNodes.length; i++) {\n const metadataNode = metadataNodes[i]\n const name = metadataNode.getAttribute('name')\n const validNames = [\n 'Title',\n 'Designer',\n 'Description',\n 'Copyright',\n 'LicenseTerms',\n 'Rating',\n 'CreationDate',\n 'ModificationDate',\n ]\n\n if (0 <= validNames.indexOf(name)) {\n metadataData[name] = metadataNode.textContent\n }\n }\n\n return metadataData\n }\n\n function parseBasematerialsNode(basematerialsNode) {\n const basematerialsData = {\n id: basematerialsNode.getAttribute('id'), // required\n basematerials: [],\n }\n\n const basematerialNodes = basematerialsNode.querySelectorAll('base')\n\n for (let i = 0; i < basematerialNodes.length; i++) {\n const basematerialNode = basematerialNodes[i]\n const basematerialData = parseBasematerialNode(basematerialNode)\n basematerialData.index = i // the order and count of the material nodes form an implicit 0-based index\n basematerialsData.basematerials.push(basematerialData)\n }\n\n return basematerialsData\n }\n\n function parseTexture2DNode(texture2DNode) {\n const texture2dData = {\n id: texture2DNode.getAttribute('id'), // required\n path: texture2DNode.getAttribute('path'), // required\n contenttype: texture2DNode.getAttribute('contenttype'), // required\n tilestyleu: texture2DNode.getAttribute('tilestyleu'),\n tilestylev: texture2DNode.getAttribute('tilestylev'),\n filter: texture2DNode.getAttribute('filter'),\n }\n\n return texture2dData\n }\n\n function parseTextures2DGroupNode(texture2DGroupNode) {\n const texture2DGroupData = {\n id: texture2DGroupNode.getAttribute('id'), // required\n texid: texture2DGroupNode.getAttribute('texid'), // required\n displaypropertiesid: texture2DGroupNode.getAttribute('displaypropertiesid'),\n }\n\n const tex2coordNodes = texture2DGroupNode.querySelectorAll('tex2coord')\n\n const uvs = []\n\n for (let i = 0; i < tex2coordNodes.length; i++) {\n const tex2coordNode = tex2coordNodes[i]\n const u = tex2coordNode.getAttribute('u')\n const v = tex2coordNode.getAttribute('v')\n\n uvs.push(parseFloat(u), parseFloat(v))\n }\n\n texture2DGroupData['uvs'] = new Float32Array(uvs)\n\n return texture2DGroupData\n }\n\n function parseColorGroupNode(colorGroupNode) {\n const colorGroupData = {\n id: colorGroupNode.getAttribute('id'), // required\n displaypropertiesid: colorGroupNode.getAttribute('displaypropertiesid'),\n }\n\n const colorNodes = colorGroupNode.querySelectorAll('color')\n\n const colors = []\n const colorObject = new Color()\n\n for (let i = 0; i < colorNodes.length; i++) {\n const colorNode = colorNodes[i]\n const color = colorNode.getAttribute('color')\n\n colorObject.setStyle(color.substring(0, 7))\n colorObject.convertSRGBToLinear() // color is in sRGB\n\n colors.push(colorObject.r, colorObject.g, colorObject.b)\n }\n\n colorGroupData['colors'] = new Float32Array(colors)\n\n return colorGroupData\n }\n\n function parseMetallicDisplaypropertiesNode(metallicDisplaypropetiesNode) {\n const metallicDisplaypropertiesData = {\n id: metallicDisplaypropetiesNode.getAttribute('id'), // required\n }\n\n const metallicNodes = metallicDisplaypropetiesNode.querySelectorAll('pbmetallic')\n\n const metallicData = []\n\n for (let i = 0; i < metallicNodes.length; i++) {\n const metallicNode = metallicNodes[i]\n\n metallicData.push({\n name: metallicNode.getAttribute('name'), // required\n metallicness: parseFloat(metallicNode.getAttribute('metallicness')), // required\n roughness: parseFloat(metallicNode.getAttribute('roughness')), // required\n })\n }\n\n metallicDisplaypropertiesData.data = metallicData\n\n return metallicDisplaypropertiesData\n }\n\n function parseBasematerialNode(basematerialNode) {\n const basematerialData = {}\n\n basematerialData['name'] = basematerialNode.getAttribute('name') // required\n basematerialData['displaycolor'] = basematerialNode.getAttribute('displaycolor') // required\n basematerialData['displaypropertiesid'] = basematerialNode.getAttribute('displaypropertiesid')\n\n return basematerialData\n }\n\n function parseMeshNode(meshNode) {\n const meshData = {}\n\n const vertices = []\n const vertexNodes = meshNode.querySelectorAll('vertices vertex')\n\n for (let i = 0; i < vertexNodes.length; i++) {\n const vertexNode = vertexNodes[i]\n const x = vertexNode.getAttribute('x')\n const y = vertexNode.getAttribute('y')\n const z = vertexNode.getAttribute('z')\n\n vertices.push(parseFloat(x), parseFloat(y), parseFloat(z))\n }\n\n meshData['vertices'] = new Float32Array(vertices)\n\n const triangleProperties = []\n const triangles = []\n const triangleNodes = meshNode.querySelectorAll('triangles triangle')\n\n for (let i = 0; i < triangleNodes.length; i++) {\n const triangleNode = triangleNodes[i]\n const v1 = triangleNode.getAttribute('v1')\n const v2 = triangleNode.getAttribute('v2')\n const v3 = triangleNode.getAttribute('v3')\n const p1 = triangleNode.getAttribute('p1')\n const p2 = triangleNode.getAttribute('p2')\n const p3 = triangleNode.getAttribute('p3')\n const pid = triangleNode.getAttribute('pid')\n\n const triangleProperty = {}\n\n triangleProperty['v1'] = parseInt(v1, 10)\n triangleProperty['v2'] = parseInt(v2, 10)\n triangleProperty['v3'] = parseInt(v3, 10)\n\n triangles.push(triangleProperty['v1'], triangleProperty['v2'], triangleProperty['v3'])\n\n // optional\n\n if (p1) {\n triangleProperty['p1'] = parseInt(p1, 10)\n }\n\n if (p2) {\n triangleProperty['p2'] = parseInt(p2, 10)\n }\n\n if (p3) {\n triangleProperty['p3'] = parseInt(p3, 10)\n }\n\n if (pid) {\n triangleProperty['pid'] = pid\n }\n\n if (0 < Object.keys(triangleProperty).length) {\n triangleProperties.push(triangleProperty)\n }\n }\n\n meshData['triangleProperties'] = triangleProperties\n meshData['triangles'] = new Uint32Array(triangles)\n\n return meshData\n }\n\n function parseComponentsNode(componentsNode) {\n const components = []\n\n const componentNodes = componentsNode.querySelectorAll('component')\n\n for (let i = 0; i < componentNodes.length; i++) {\n const componentNode = componentNodes[i]\n const componentData = parseComponentNode(componentNode)\n components.push(componentData)\n }\n\n return components\n }\n\n function parseComponentNode(componentNode) {\n const componentData = {}\n\n componentData['objectId'] = componentNode.getAttribute('objectid') // required\n\n const transform = componentNode.getAttribute('transform')\n\n if (transform) {\n componentData['transform'] = parseTransform(transform)\n }\n\n return componentData\n }\n\n function parseTransform(transform) {\n const t = []\n transform.split(' ').forEach(function (s) {\n t.push(parseFloat(s))\n })\n\n const matrix = new Matrix4()\n matrix.set(t[0], t[3], t[6], t[9], t[1], t[4], t[7], t[10], t[2], t[5], t[8], t[11], 0.0, 0.0, 0.0, 1.0)\n\n return matrix\n }\n\n function parseObjectNode(objectNode) {\n const objectData = {\n type: objectNode.getAttribute('type'),\n }\n\n const id = objectNode.getAttribute('id')\n\n if (id) {\n objectData['id'] = id\n }\n\n const pid = objectNode.getAttribute('pid')\n\n if (pid) {\n objectData['pid'] = pid\n }\n\n const pindex = objectNode.getAttribute('pindex')\n\n if (pindex) {\n objectData['pindex'] = pindex\n }\n\n const thumbnail = objectNode.getAttribute('thumbnail')\n\n if (thumbnail) {\n objectData['thumbnail'] = thumbnail\n }\n\n const partnumber = objectNode.getAttribute('partnumber')\n\n if (partnumber) {\n objectData['partnumber'] = partnumber\n }\n\n const name = objectNode.getAttribute('name')\n\n if (name) {\n objectData['name'] = name\n }\n\n const meshNode = objectNode.querySelector('mesh')\n\n if (meshNode) {\n objectData['mesh'] = parseMeshNode(meshNode)\n }\n\n const componentsNode = objectNode.querySelector('components')\n\n if (componentsNode) {\n objectData['components'] = parseComponentsNode(componentsNode)\n }\n\n return objectData\n }\n\n function parseResourcesNode(resourcesNode) {\n const resourcesData = {}\n\n resourcesData['basematerials'] = {}\n const basematerialsNodes = resourcesNode.querySelectorAll('basematerials')\n\n for (let i = 0; i < basematerialsNodes.length; i++) {\n const basematerialsNode = basematerialsNodes[i]\n const basematerialsData = parseBasematerialsNode(basematerialsNode)\n resourcesData['basematerials'][basematerialsData['id']] = basematerialsData\n }\n\n //\n\n resourcesData['texture2d'] = {}\n const textures2DNodes = resourcesNode.querySelectorAll('texture2d')\n\n for (let i = 0; i < textures2DNodes.length; i++) {\n const textures2DNode = textures2DNodes[i]\n const texture2DData = parseTexture2DNode(textures2DNode)\n resourcesData['texture2d'][texture2DData['id']] = texture2DData\n }\n\n //\n\n resourcesData['colorgroup'] = {}\n const colorGroupNodes = resourcesNode.querySelectorAll('colorgroup')\n\n for (let i = 0; i < colorGroupNodes.length; i++) {\n const colorGroupNode = colorGroupNodes[i]\n const colorGroupData = parseColorGroupNode(colorGroupNode)\n resourcesData['colorgroup'][colorGroupData['id']] = colorGroupData\n }\n\n //\n\n resourcesData['pbmetallicdisplayproperties'] = {}\n const pbmetallicdisplaypropertiesNodes = resourcesNode.querySelectorAll('pbmetallicdisplayproperties')\n\n for (let i = 0; i < pbmetallicdisplaypropertiesNodes.length; i++) {\n const pbmetallicdisplaypropertiesNode = pbmetallicdisplaypropertiesNodes[i]\n const pbmetallicdisplaypropertiesData = parseMetallicDisplaypropertiesNode(pbmetallicdisplaypropertiesNode)\n resourcesData['pbmetallicdisplayproperties'][\n pbmetallicdisplaypropertiesData['id']\n ] = pbmetallicdisplaypropertiesData\n }\n\n //\n\n resourcesData['texture2dgroup'] = {}\n const textures2DGroupNodes = resourcesNode.querySelectorAll('texture2dgroup')\n\n for (let i = 0; i < textures2DGroupNodes.length; i++) {\n const textures2DGroupNode = textures2DGroupNodes[i]\n const textures2DGroupData = parseTextures2DGroupNode(textures2DGroupNode)\n resourcesData['texture2dgroup'][textures2DGroupData['id']] = textures2DGroupData\n }\n\n //\n\n resourcesData['object'] = {}\n const objectNodes = resourcesNode.querySelectorAll('object')\n\n for (let i = 0; i < objectNodes.length; i++) {\n const objectNode = objectNodes[i]\n const objectData = parseObjectNode(objectNode)\n resourcesData['object'][objectData['id']] = objectData\n }\n\n return resourcesData\n }\n\n function parseBuildNode(buildNode) {\n const buildData = []\n const itemNodes = buildNode.querySelectorAll('item')\n\n for (let i = 0; i < itemNodes.length; i++) {\n const itemNode = itemNodes[i]\n const buildItem = {\n objectId: itemNode.getAttribute('objectid'),\n }\n const transform = itemNode.getAttribute('transform')\n\n if (transform) {\n buildItem['transform'] = parseTransform(transform)\n }\n\n buildData.push(buildItem)\n }\n\n return buildData\n }\n\n function parseModelNode(modelNode) {\n const modelData = { unit: modelNode.getAttribute('unit') || 'millimeter' }\n const metadataNodes = modelNode.querySelectorAll('metadata')\n\n if (metadataNodes) {\n modelData['metadata'] = parseMetadataNodes(metadataNodes)\n }\n\n const resourcesNode = modelNode.querySelector('resources')\n\n if (resourcesNode) {\n modelData['resources'] = parseResourcesNode(resourcesNode)\n }\n\n const buildNode = modelNode.querySelector('build')\n\n if (buildNode) {\n modelData['build'] = parseBuildNode(buildNode)\n }\n\n return modelData\n }\n\n function buildTexture(texture2dgroup, objects, modelData, textureData) {\n const texid = texture2dgroup.texid\n const texture2ds = modelData.resources.texture2d\n const texture2d = texture2ds[texid]\n\n if (texture2d) {\n const data = textureData[texture2d.path]\n const type = texture2d.contenttype\n\n const blob = new Blob([data], { type: type })\n const sourceURI = URL.createObjectURL(blob)\n\n const texture = textureLoader.load(sourceURI, function () {\n URL.revokeObjectURL(sourceURI)\n })\n\n if ('colorSpace' in texture) texture.colorSpace = 'srgb'\n else texture.encoding = 3001 // sRGBEncoding\n\n // texture parameters\n\n switch (texture2d.tilestyleu) {\n case 'wrap':\n texture.wrapS = RepeatWrapping\n break\n\n case 'mirror':\n texture.wrapS = MirroredRepeatWrapping\n break\n\n case 'none':\n case 'clamp':\n texture.wrapS = ClampToEdgeWrapping\n break\n\n default:\n texture.wrapS = RepeatWrapping\n }\n\n switch (texture2d.tilestylev) {\n case 'wrap':\n texture.wrapT = RepeatWrapping\n break\n\n case 'mirror':\n texture.wrapT = MirroredRepeatWrapping\n break\n\n case 'none':\n case 'clamp':\n texture.wrapT = ClampToEdgeWrapping\n break\n\n default:\n texture.wrapT = RepeatWrapping\n }\n\n switch (texture2d.filter) {\n case 'auto':\n texture.magFilter = LinearFilter\n texture.minFilter = LinearMipmapLinearFilter\n break\n\n case 'linear':\n texture.magFilter = LinearFilter\n texture.minFilter = LinearFilter\n break\n\n case 'nearest':\n texture.magFilter = NearestFilter\n texture.minFilter = NearestFilter\n break\n\n default:\n texture.magFilter = LinearFilter\n texture.minFilter = LinearMipmapLinearFilter\n }\n\n return texture\n } else {\n return null\n }\n }\n\n function buildBasematerialsMeshes(\n basematerials,\n triangleProperties,\n meshData,\n objects,\n modelData,\n textureData,\n objectData,\n ) {\n const objectPindex = objectData.pindex\n\n const materialMap = {}\n\n for (let i = 0, l = triangleProperties.length; i < l; i++) {\n const triangleProperty = triangleProperties[i]\n const pindex = triangleProperty.p1 !== undefined ? triangleProperty.p1 : objectPindex\n\n if (materialMap[pindex] === undefined) materialMap[pindex] = []\n\n materialMap[pindex].push(triangleProperty)\n }\n\n //\n\n const keys = Object.keys(materialMap)\n const meshes = []\n\n for (let i = 0, l = keys.length; i < l; i++) {\n const materialIndex = keys[i]\n const trianglePropertiesProps = materialMap[materialIndex]\n const basematerialData = basematerials.basematerials[materialIndex]\n const material = getBuild(basematerialData, objects, modelData, textureData, objectData, buildBasematerial)\n\n //\n\n const geometry = new BufferGeometry()\n\n const positionData = []\n\n const vertices = meshData.vertices\n\n for (let j = 0, jl = trianglePropertiesProps.length; j < jl; j++) {\n const triangleProperty = trianglePropertiesProps[j]\n\n positionData.push(vertices[triangleProperty.v1 * 3 + 0])\n positionData.push(vertices[triangleProperty.v1 * 3 + 1])\n positionData.push(vertices[triangleProperty.v1 * 3 + 2])\n\n positionData.push(vertices[triangleProperty.v2 * 3 + 0])\n positionData.push(vertices[triangleProperty.v2 * 3 + 1])\n positionData.push(vertices[triangleProperty.v2 * 3 + 2])\n\n positionData.push(vertices[triangleProperty.v3 * 3 + 0])\n positionData.push(vertices[triangleProperty.v3 * 3 + 1])\n positionData.push(vertices[triangleProperty.v3 * 3 + 2])\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(positionData, 3))\n\n //\n\n const mesh = new Mesh(geometry, material)\n meshes.push(mesh)\n }\n\n return meshes\n }\n\n function buildTexturedMesh(\n texture2dgroup,\n triangleProperties,\n meshData,\n objects,\n modelData,\n textureData,\n objectData,\n ) {\n // geometry\n\n const geometry = new BufferGeometry()\n\n const positionData = []\n const uvData = []\n\n const vertices = meshData.vertices\n const uvs = texture2dgroup.uvs\n\n for (let i = 0, l = triangleProperties.length; i < l; i++) {\n const triangleProperty = triangleProperties[i]\n\n positionData.push(vertices[triangleProperty.v1 * 3 + 0])\n positionData.push(vertices[triangleProperty.v1 * 3 + 1])\n positionData.push(vertices[triangleProperty.v1 * 3 + 2])\n\n positionData.push(vertices[triangleProperty.v2 * 3 + 0])\n positionData.push(vertices[triangleProperty.v2 * 3 + 1])\n positionData.push(vertices[triangleProperty.v2 * 3 + 2])\n\n positionData.push(vertices[triangleProperty.v3 * 3 + 0])\n positionData.push(vertices[triangleProperty.v3 * 3 + 1])\n positionData.push(vertices[triangleProperty.v3 * 3 + 2])\n\n //\n\n uvData.push(uvs[triangleProperty.p1 * 2 + 0])\n uvData.push(uvs[triangleProperty.p1 * 2 + 1])\n\n uvData.push(uvs[triangleProperty.p2 * 2 + 0])\n uvData.push(uvs[triangleProperty.p2 * 2 + 1])\n\n uvData.push(uvs[triangleProperty.p3 * 2 + 0])\n uvData.push(uvs[triangleProperty.p3 * 2 + 1])\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(positionData, 3))\n geometry.setAttribute('uv', new Float32BufferAttribute(uvData, 2))\n\n // material\n\n const texture = getBuild(texture2dgroup, objects, modelData, textureData, objectData, buildTexture)\n\n const material = new MeshPhongMaterial({ map: texture, flatShading: true })\n\n // mesh\n\n const mesh = new Mesh(geometry, material)\n\n return mesh\n }\n\n function buildVertexColorMesh(colorgroup, triangleProperties, meshData, objects, modelData, objectData) {\n // geometry\n\n const geometry = new BufferGeometry()\n\n const positionData = []\n const colorData = []\n\n const vertices = meshData.vertices\n const colors = colorgroup.colors\n\n for (let i = 0, l = triangleProperties.length; i < l; i++) {\n const triangleProperty = triangleProperties[i]\n\n const v1 = triangleProperty.v1\n const v2 = triangleProperty.v2\n const v3 = triangleProperty.v3\n\n positionData.push(vertices[v1 * 3 + 0])\n positionData.push(vertices[v1 * 3 + 1])\n positionData.push(vertices[v1 * 3 + 2])\n\n positionData.push(vertices[v2 * 3 + 0])\n positionData.push(vertices[v2 * 3 + 1])\n positionData.push(vertices[v2 * 3 + 2])\n\n positionData.push(vertices[v3 * 3 + 0])\n positionData.push(vertices[v3 * 3 + 1])\n positionData.push(vertices[v3 * 3 + 2])\n\n //\n\n const p1 = triangleProperty.p1 !== undefined ? triangleProperty.p1 : objectData.pindex\n const p2 = triangleProperty.p2 !== undefined ? triangleProperty.p2 : p1\n const p3 = triangleProperty.p3 !== undefined ? triangleProperty.p3 : p1\n\n colorData.push(colors[p1 * 3 + 0])\n colorData.push(colors[p1 * 3 + 1])\n colorData.push(colors[p1 * 3 + 2])\n\n colorData.push(colors[p2 * 3 + 0])\n colorData.push(colors[p2 * 3 + 1])\n colorData.push(colors[p2 * 3 + 2])\n\n colorData.push(colors[p3 * 3 + 0])\n colorData.push(colors[p3 * 3 + 1])\n colorData.push(colors[p3 * 3 + 2])\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(positionData, 3))\n geometry.setAttribute('color', new Float32BufferAttribute(colorData, 3))\n\n // material\n\n const material = new MeshPhongMaterial({ vertexColors: true, flatShading: true })\n\n // mesh\n\n const mesh = new Mesh(geometry, material)\n\n return mesh\n }\n\n function buildDefaultMesh(meshData) {\n const geometry = new BufferGeometry()\n geometry.setIndex(new BufferAttribute(meshData['triangles'], 1))\n geometry.setAttribute('position', new BufferAttribute(meshData['vertices'], 3))\n\n const material = new MeshPhongMaterial({ color: 0xaaaaff, flatShading: true })\n\n const mesh = new Mesh(geometry, material)\n\n return mesh\n }\n\n function buildMeshes(resourceMap, meshData, objects, modelData, textureData, objectData) {\n const keys = Object.keys(resourceMap)\n const meshes = []\n\n for (let i = 0, il = keys.length; i < il; i++) {\n const resourceId = keys[i]\n const triangleProperties = resourceMap[resourceId]\n const resourceType = getResourceType(resourceId, modelData)\n\n switch (resourceType) {\n case 'material':\n const basematerials = modelData.resources.basematerials[resourceId]\n const newMeshes = buildBasematerialsMeshes(\n basematerials,\n triangleProperties,\n meshData,\n objects,\n modelData,\n textureData,\n objectData,\n )\n\n for (let j = 0, jl = newMeshes.length; j < jl; j++) {\n meshes.push(newMeshes[j])\n }\n\n break\n\n case 'texture':\n const texture2dgroup = modelData.resources.texture2dgroup[resourceId]\n meshes.push(\n buildTexturedMesh(\n texture2dgroup,\n triangleProperties,\n meshData,\n objects,\n modelData,\n textureData,\n objectData,\n ),\n )\n break\n\n case 'vertexColors':\n const colorgroup = modelData.resources.colorgroup[resourceId]\n meshes.push(buildVertexColorMesh(colorgroup, triangleProperties, meshData, objects, modelData, objectData))\n break\n\n case 'default':\n meshes.push(buildDefaultMesh(meshData))\n break\n\n default:\n console.error('THREE.3MFLoader: Unsupported resource type.')\n }\n }\n\n return meshes\n }\n\n function getResourceType(pid, modelData) {\n if (modelData.resources.texture2dgroup[pid] !== undefined) {\n return 'texture'\n } else if (modelData.resources.basematerials[pid] !== undefined) {\n return 'material'\n } else if (modelData.resources.colorgroup[pid] !== undefined) {\n return 'vertexColors'\n } else if (pid === 'default') {\n return 'default'\n } else {\n return undefined\n }\n }\n\n function analyzeObject(modelData, meshData, objectData) {\n const resourceMap = {}\n\n const triangleProperties = meshData['triangleProperties']\n\n const objectPid = objectData.pid\n\n for (let i = 0, l = triangleProperties.length; i < l; i++) {\n const triangleProperty = triangleProperties[i]\n let pid = triangleProperty.pid !== undefined ? triangleProperty.pid : objectPid\n\n if (pid === undefined) pid = 'default'\n\n if (resourceMap[pid] === undefined) resourceMap[pid] = []\n\n resourceMap[pid].push(triangleProperty)\n }\n\n return resourceMap\n }\n\n function buildGroup(meshData, objects, modelData, textureData, objectData) {\n const group = new Group()\n\n const resourceMap = analyzeObject(modelData, meshData, objectData)\n const meshes = buildMeshes(resourceMap, meshData, objects, modelData, textureData, objectData)\n\n for (let i = 0, l = meshes.length; i < l; i++) {\n group.add(meshes[i])\n }\n\n return group\n }\n\n function applyExtensions(extensions, meshData, modelXml) {\n if (!extensions) {\n return\n }\n\n const availableExtensions = []\n const keys = Object.keys(extensions)\n\n for (let i = 0; i < keys.length; i++) {\n const ns = keys[i]\n\n for (let j = 0; j < scope.availableExtensions.length; j++) {\n const extension = scope.availableExtensions[j]\n\n if (extension.ns === ns) {\n availableExtensions.push(extension)\n }\n }\n }\n\n for (let i = 0; i < availableExtensions.length; i++) {\n const extension = availableExtensions[i]\n extension.apply(modelXml, extensions[extension['ns']], meshData)\n }\n }\n\n function getBuild(data, objects, modelData, textureData, objectData, builder) {\n if (data.build !== undefined) return data.build\n\n data.build = builder(data, objects, modelData, textureData, objectData)\n\n return data.build\n }\n\n function buildBasematerial(materialData, objects, modelData) {\n let material\n\n const displaypropertiesid = materialData.displaypropertiesid\n const pbmetallicdisplayproperties = modelData.resources.pbmetallicdisplayproperties\n\n if (displaypropertiesid !== null && pbmetallicdisplayproperties[displaypropertiesid] !== undefined) {\n // metallic display property, use StandardMaterial\n\n const pbmetallicdisplayproperty = pbmetallicdisplayproperties[displaypropertiesid]\n const metallicData = pbmetallicdisplayproperty.data[materialData.index]\n\n material = new MeshStandardMaterial({\n flatShading: true,\n roughness: metallicData.roughness,\n metalness: metallicData.metallicness,\n })\n } else {\n // otherwise use PhongMaterial\n\n material = new MeshPhongMaterial({ flatShading: true })\n }\n\n material.name = materialData.name\n\n // displaycolor MUST be specified with a value of a 6 or 8 digit hexadecimal number, e.g. \"#RRGGBB\" or \"#RRGGBBAA\"\n\n const displaycolor = materialData.displaycolor\n\n const color = displaycolor.substring(0, 7)\n material.color.setStyle(color)\n material.color.convertSRGBToLinear() // displaycolor is in sRGB\n\n // process alpha if set\n\n if (displaycolor.length === 9) {\n material.opacity = parseInt(displaycolor.charAt(7) + displaycolor.charAt(8), 16) / 255\n }\n\n return material\n }\n\n function buildComposite(compositeData, objects, modelData, textureData) {\n const composite = new Group()\n\n for (let j = 0; j < compositeData.length; j++) {\n const component = compositeData[j]\n let build = objects[component.objectId]\n\n if (build === undefined) {\n buildObject(component.objectId, objects, modelData, textureData)\n build = objects[component.objectId]\n }\n\n const object3D = build.clone()\n\n // apply component transform\n\n const transform = component.transform\n\n if (transform) {\n object3D.applyMatrix4(transform)\n }\n\n composite.add(object3D)\n }\n\n return composite\n }\n\n function buildObject(objectId, objects, modelData, textureData) {\n const objectData = modelData['resources']['object'][objectId]\n\n if (objectData['mesh']) {\n const meshData = objectData['mesh']\n\n const extensions = modelData['extensions']\n const modelXml = modelData['xml']\n\n applyExtensions(extensions, meshData, modelXml)\n\n objects[objectData.id] = getBuild(meshData, objects, modelData, textureData, objectData, buildGroup)\n } else {\n const compositeData = objectData['components']\n\n objects[objectData.id] = getBuild(compositeData, objects, modelData, textureData, objectData, buildComposite)\n }\n }\n\n function buildObjects(data3mf) {\n const modelsData = data3mf.model\n const modelRels = data3mf.modelRels\n const objects = {}\n const modelsKeys = Object.keys(modelsData)\n const textureData = {}\n\n // evaluate model relationships to textures\n\n if (modelRels) {\n for (let i = 0, l = modelRels.length; i < l; i++) {\n const modelRel = modelRels[i]\n const textureKey = modelRel.target.substring(1)\n\n if (data3mf.texture[textureKey]) {\n textureData[modelRel.target] = data3mf.texture[textureKey]\n }\n }\n }\n\n // start build\n\n for (let i = 0; i < modelsKeys.length; i++) {\n const modelsKey = modelsKeys[i]\n const modelData = modelsData[modelsKey]\n\n const objectIds = Object.keys(modelData['resources']['object'])\n\n for (let j = 0; j < objectIds.length; j++) {\n const objectId = objectIds[j]\n\n buildObject(objectId, objects, modelData, textureData)\n }\n }\n\n return objects\n }\n\n function fetch3DModelPart(rels) {\n for (let i = 0; i < rels.length; i++) {\n const rel = rels[i]\n const extension = rel.target.split('.').pop()\n\n if (extension.toLowerCase() === 'model') return rel\n }\n }\n\n function build(objects, data3mf) {\n const group = new Group()\n\n const relationship = fetch3DModelPart(data3mf['rels'])\n const buildData = data3mf.model[relationship['target'].substring(1)]['build']\n\n for (let i = 0; i < buildData.length; i++) {\n const buildItem = buildData[i]\n const object3D = objects[buildItem['objectId']]\n\n // apply transform\n\n const transform = buildItem['transform']\n\n if (transform) {\n object3D.applyMatrix4(transform)\n }\n\n group.add(object3D)\n }\n\n return group\n }\n\n const data3mf = loadDocument(data)\n const objects = buildObjects(data3mf)\n\n return build(objects, data3mf)\n }\n\n addExtension(extension) {\n this.availableExtensions.push(extension)\n }\n}\n\nexport { ThreeMFLoader }\n"],"names":["data","relsView","relsFileText","i","objects","build","data3mf"],"mappings":"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"}
|
package/loaders/AMFLoader.cjs
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const THREE = require("three");
|
|
4
4
|
const fflate = require("fflate");
|
|
5
|
+
const LoaderUtils = require("../_polyfill/LoaderUtils.cjs");
|
|
5
6
|
class AMFLoader extends THREE.Loader {
|
|
6
7
|
constructor(manager) {
|
|
7
8
|
super(manager);
|
|
@@ -55,7 +56,7 @@ class AMFLoader extends THREE.Loader {
|
|
|
55
56
|
console.log("THREE.AMFLoader: Trying to load file asset: " + file);
|
|
56
57
|
view = new DataView(zip[file].buffer);
|
|
57
58
|
}
|
|
58
|
-
const fileText =
|
|
59
|
+
const fileText = LoaderUtils.decodeText(view);
|
|
59
60
|
const xmlData2 = new DOMParser().parseFromString(fileText, "application/xml");
|
|
60
61
|
if (xmlData2.documentElement.nodeName.toLowerCase() !== "amf") {
|
|
61
62
|
console.log("THREE.AMFLoader: Error loading AMF - no AMF document found.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AMFLoader.cjs","sources":["../../src/loaders/AMFLoader.js"],"sourcesContent":["import {\n BufferGeometry,\n Color,\n FileLoader,\n Float32BufferAttribute,\n Group,\n Loader,\n LoaderUtils,\n Mesh,\n MeshPhongMaterial,\n} from 'three'\nimport { unzipSync } from 'fflate'\n\n/**\n * Description: Early release of an AMF Loader following the pattern of the\n * example loaders in the three.js project.\n *\n * Usage:\n *\tconst loader = new AMFLoader();\n *\tloader.load('/path/to/project.amf', function(objecttree) {\n *\t\tscene.add(objecttree);\n *\t});\n *\n * Materials now supported, material colors supported\n * Zip support, requires fflate\n * No constellation support (yet)!\n *\n */\n\nclass AMFLoader extends Loader {\n constructor(manager) {\n super(manager)\n }\n\n load(url, onLoad, onProgress, onError) {\n const scope = this\n\n const loader = new FileLoader(scope.manager)\n loader.setPath(scope.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(scope.requestHeader)\n loader.setWithCredentials(scope.withCredentials)\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\n } catch (e) {\n if (onError) {\n onError(e)\n } else {\n console.error(e)\n }\n\n scope.manager.itemError(url)\n }\n },\n onProgress,\n onError,\n )\n }\n\n parse(data) {\n function loadDocument(data) {\n let view = new DataView(data)\n const magic = String.fromCharCode(view.getUint8(0), view.getUint8(1))\n\n if (magic === 'PK') {\n let zip = null\n let file = null\n\n console.log('THREE.AMFLoader: Loading Zip')\n\n try {\n zip = unzipSync(new Uint8Array(data))\n } catch (e) {\n if (e instanceof ReferenceError) {\n console.log('THREE.AMFLoader: fflate missing and file is compressed.')\n return null\n }\n }\n\n for (file in zip) {\n if (file.toLowerCase().substr(-4) === '.amf') {\n break\n }\n }\n\n console.log('THREE.AMFLoader: Trying to load file asset: ' + file)\n view = new DataView(zip[file].buffer)\n }\n\n const fileText = LoaderUtils.decodeText(view)\n const xmlData = new DOMParser().parseFromString(fileText, 'application/xml')\n\n if (xmlData.documentElement.nodeName.toLowerCase() !== 'amf') {\n console.log('THREE.AMFLoader: Error loading AMF - no AMF document found.')\n return null\n }\n\n return xmlData\n }\n\n function loadDocumentScale(node) {\n let scale = 1.0\n let unit = 'millimeter'\n\n if (node.documentElement.attributes.unit !== undefined) {\n unit = node.documentElement.attributes.unit.value.toLowerCase()\n }\n\n const scaleUnits = {\n millimeter: 1.0,\n inch: 25.4,\n feet: 304.8,\n meter: 1000.0,\n micron: 0.001,\n }\n\n if (scaleUnits[unit] !== undefined) {\n scale = scaleUnits[unit]\n }\n\n console.log('THREE.AMFLoader: Unit scale: ' + scale)\n return scale\n }\n\n function loadMaterials(node) {\n let matName = 'AMF Material'\n const matId = node.attributes.id.textContent\n let color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 }\n\n let loadedMaterial = null\n\n for (let i = 0; i < node.childNodes.length; i++) {\n const matChildEl = node.childNodes[i]\n\n if (matChildEl.nodeName === 'metadata' && matChildEl.attributes.type !== undefined) {\n if (matChildEl.attributes.type.value === 'name') {\n matName = matChildEl.textContent\n }\n } else if (matChildEl.nodeName === 'color') {\n color = loadColor(matChildEl)\n }\n }\n\n loadedMaterial = new MeshPhongMaterial({\n flatShading: true,\n color: new Color(color.r, color.g, color.b),\n name: matName,\n })\n\n if (color.a !== 1.0) {\n loadedMaterial.transparent = true\n loadedMaterial.opacity = color.a\n }\n\n return { id: matId, material: loadedMaterial }\n }\n\n function loadColor(node) {\n const color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 }\n\n for (let i = 0; i < node.childNodes.length; i++) {\n const matColor = node.childNodes[i]\n\n if (matColor.nodeName === 'r') {\n color.r = matColor.textContent\n } else if (matColor.nodeName === 'g') {\n color.g = matColor.textContent\n } else if (matColor.nodeName === 'b') {\n color.b = matColor.textContent\n } else if (matColor.nodeName === 'a') {\n color.a = matColor.textContent\n }\n }\n\n return color\n }\n\n function loadMeshVolume(node) {\n const volume = { name: '', triangles: [], materialid: null }\n\n let currVolumeNode = node.firstElementChild\n\n if (node.attributes.materialid !== undefined) {\n volume.materialId = node.attributes.materialid.nodeValue\n }\n\n while (currVolumeNode) {\n if (currVolumeNode.nodeName === 'metadata') {\n if (currVolumeNode.attributes.type !== undefined) {\n if (currVolumeNode.attributes.type.value === 'name') {\n volume.name = currVolumeNode.textContent\n }\n }\n } else if (currVolumeNode.nodeName === 'triangle') {\n const v1 = currVolumeNode.getElementsByTagName('v1')[0].textContent\n const v2 = currVolumeNode.getElementsByTagName('v2')[0].textContent\n const v3 = currVolumeNode.getElementsByTagName('v3')[0].textContent\n\n volume.triangles.push(v1, v2, v3)\n }\n\n currVolumeNode = currVolumeNode.nextElementSibling\n }\n\n return volume\n }\n\n function loadMeshVertices(node) {\n const vertArray = []\n const normalArray = []\n let currVerticesNode = node.firstElementChild\n\n while (currVerticesNode) {\n if (currVerticesNode.nodeName === 'vertex') {\n let vNode = currVerticesNode.firstElementChild\n\n while (vNode) {\n if (vNode.nodeName === 'coordinates') {\n const x = vNode.getElementsByTagName('x')[0].textContent\n const y = vNode.getElementsByTagName('y')[0].textContent\n const z = vNode.getElementsByTagName('z')[0].textContent\n\n vertArray.push(x, y, z)\n } else if (vNode.nodeName === 'normal') {\n const nx = vNode.getElementsByTagName('nx')[0].textContent\n const ny = vNode.getElementsByTagName('ny')[0].textContent\n const nz = vNode.getElementsByTagName('nz')[0].textContent\n\n normalArray.push(nx, ny, nz)\n }\n\n vNode = vNode.nextElementSibling\n }\n }\n\n currVerticesNode = currVerticesNode.nextElementSibling\n }\n\n return { vertices: vertArray, normals: normalArray }\n }\n\n function loadObject(node) {\n const objId = node.attributes.id.textContent\n const loadedObject = { name: 'amfobject', meshes: [] }\n let currColor = null\n let currObjNode = node.firstElementChild\n\n while (currObjNode) {\n if (currObjNode.nodeName === 'metadata') {\n if (currObjNode.attributes.type !== undefined) {\n if (currObjNode.attributes.type.value === 'name') {\n loadedObject.name = currObjNode.textContent\n }\n }\n } else if (currObjNode.nodeName === 'color') {\n currColor = loadColor(currObjNode)\n } else if (currObjNode.nodeName === 'mesh') {\n let currMeshNode = currObjNode.firstElementChild\n const mesh = { vertices: [], normals: [], volumes: [], color: currColor }\n\n while (currMeshNode) {\n if (currMeshNode.nodeName === 'vertices') {\n const loadedVertices = loadMeshVertices(currMeshNode)\n\n mesh.normals = mesh.normals.concat(loadedVertices.normals)\n mesh.vertices = mesh.vertices.concat(loadedVertices.vertices)\n } else if (currMeshNode.nodeName === 'volume') {\n mesh.volumes.push(loadMeshVolume(currMeshNode))\n }\n\n currMeshNode = currMeshNode.nextElementSibling\n }\n\n loadedObject.meshes.push(mesh)\n }\n\n currObjNode = currObjNode.nextElementSibling\n }\n\n return { id: objId, obj: loadedObject }\n }\n\n const xmlData = loadDocument(data)\n let amfName = ''\n let amfAuthor = ''\n const amfScale = loadDocumentScale(xmlData)\n const amfMaterials = {}\n const amfObjects = {}\n const childNodes = xmlData.documentElement.childNodes\n\n let i, j\n\n for (i = 0; i < childNodes.length; i++) {\n const child = childNodes[i]\n\n if (child.nodeName === 'metadata') {\n if (child.attributes.type !== undefined) {\n if (child.attributes.type.value === 'name') {\n amfName = child.textContent\n } else if (child.attributes.type.value === 'author') {\n amfAuthor = child.textContent\n }\n }\n } else if (child.nodeName === 'material') {\n const loadedMaterial = loadMaterials(child)\n\n amfMaterials[loadedMaterial.id] = loadedMaterial.material\n } else if (child.nodeName === 'object') {\n const loadedObject = loadObject(child)\n\n amfObjects[loadedObject.id] = loadedObject.obj\n }\n }\n\n const sceneObject = new Group()\n const defaultMaterial = new MeshPhongMaterial({ color: 0xaaaaff, flatShading: true })\n\n sceneObject.name = amfName\n sceneObject.userData.author = amfAuthor\n sceneObject.userData.loader = 'AMF'\n\n for (const id in amfObjects) {\n const part = amfObjects[id]\n const meshes = part.meshes\n const newObject = new Group()\n newObject.name = part.name || ''\n\n for (i = 0; i < meshes.length; i++) {\n let objDefaultMaterial = defaultMaterial\n const mesh = meshes[i]\n const vertices = new Float32BufferAttribute(mesh.vertices, 3)\n let normals = null\n\n if (mesh.normals.length) {\n normals = new Float32BufferAttribute(mesh.normals, 3)\n }\n\n if (mesh.color) {\n const color = mesh.color\n\n objDefaultMaterial = defaultMaterial.clone()\n objDefaultMaterial.color = new Color(color.r, color.g, color.b)\n\n if (color.a !== 1.0) {\n objDefaultMaterial.transparent = true\n objDefaultMaterial.opacity = color.a\n }\n }\n\n const volumes = mesh.volumes\n\n for (j = 0; j < volumes.length; j++) {\n const volume = volumes[j]\n const newGeometry = new BufferGeometry()\n let material = objDefaultMaterial\n\n newGeometry.setIndex(volume.triangles)\n newGeometry.setAttribute('position', vertices.clone())\n\n if (normals) {\n newGeometry.setAttribute('normal', normals.clone())\n }\n\n if (amfMaterials[volume.materialId] !== undefined) {\n material = amfMaterials[volume.materialId]\n }\n\n newGeometry.scale(amfScale, amfScale, amfScale)\n newObject.add(new Mesh(newGeometry, material.clone()))\n }\n }\n\n sceneObject.add(newObject)\n }\n\n return sceneObject\n }\n}\n\nexport { AMFLoader }\n"],"names":["Loader","FileLoader","data","unzipSync","LoaderUtils","xmlData","i","MeshPhongMaterial","Color","Group","Float32BufferAttribute","BufferGeometry","Mesh"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AMFLoader.cjs","sources":["../../src/loaders/AMFLoader.js"],"sourcesContent":["import {\n BufferGeometry,\n Color,\n FileLoader,\n Float32BufferAttribute,\n Group,\n Loader,\n LoaderUtils,\n Mesh,\n MeshPhongMaterial,\n} from 'three'\nimport { unzipSync } from 'fflate'\nimport { decodeText } from '../_polyfill/LoaderUtils'\n\n/**\n * Description: Early release of an AMF Loader following the pattern of the\n * example loaders in the three.js project.\n *\n * Usage:\n *\tconst loader = new AMFLoader();\n *\tloader.load('/path/to/project.amf', function(objecttree) {\n *\t\tscene.add(objecttree);\n *\t});\n *\n * Materials now supported, material colors supported\n * Zip support, requires fflate\n * No constellation support (yet)!\n *\n */\n\nclass AMFLoader extends Loader {\n constructor(manager) {\n super(manager)\n }\n\n load(url, onLoad, onProgress, onError) {\n const scope = this\n\n const loader = new FileLoader(scope.manager)\n loader.setPath(scope.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(scope.requestHeader)\n loader.setWithCredentials(scope.withCredentials)\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\n } catch (e) {\n if (onError) {\n onError(e)\n } else {\n console.error(e)\n }\n\n scope.manager.itemError(url)\n }\n },\n onProgress,\n onError,\n )\n }\n\n parse(data) {\n function loadDocument(data) {\n let view = new DataView(data)\n const magic = String.fromCharCode(view.getUint8(0), view.getUint8(1))\n\n if (magic === 'PK') {\n let zip = null\n let file = null\n\n console.log('THREE.AMFLoader: Loading Zip')\n\n try {\n zip = unzipSync(new Uint8Array(data))\n } catch (e) {\n if (e instanceof ReferenceError) {\n console.log('THREE.AMFLoader: fflate missing and file is compressed.')\n return null\n }\n }\n\n for (file in zip) {\n if (file.toLowerCase().substr(-4) === '.amf') {\n break\n }\n }\n\n console.log('THREE.AMFLoader: Trying to load file asset: ' + file)\n view = new DataView(zip[file].buffer)\n }\n\n const fileText = decodeText(view)\n const xmlData = new DOMParser().parseFromString(fileText, 'application/xml')\n\n if (xmlData.documentElement.nodeName.toLowerCase() !== 'amf') {\n console.log('THREE.AMFLoader: Error loading AMF - no AMF document found.')\n return null\n }\n\n return xmlData\n }\n\n function loadDocumentScale(node) {\n let scale = 1.0\n let unit = 'millimeter'\n\n if (node.documentElement.attributes.unit !== undefined) {\n unit = node.documentElement.attributes.unit.value.toLowerCase()\n }\n\n const scaleUnits = {\n millimeter: 1.0,\n inch: 25.4,\n feet: 304.8,\n meter: 1000.0,\n micron: 0.001,\n }\n\n if (scaleUnits[unit] !== undefined) {\n scale = scaleUnits[unit]\n }\n\n console.log('THREE.AMFLoader: Unit scale: ' + scale)\n return scale\n }\n\n function loadMaterials(node) {\n let matName = 'AMF Material'\n const matId = node.attributes.id.textContent\n let color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 }\n\n let loadedMaterial = null\n\n for (let i = 0; i < node.childNodes.length; i++) {\n const matChildEl = node.childNodes[i]\n\n if (matChildEl.nodeName === 'metadata' && matChildEl.attributes.type !== undefined) {\n if (matChildEl.attributes.type.value === 'name') {\n matName = matChildEl.textContent\n }\n } else if (matChildEl.nodeName === 'color') {\n color = loadColor(matChildEl)\n }\n }\n\n loadedMaterial = new MeshPhongMaterial({\n flatShading: true,\n color: new Color(color.r, color.g, color.b),\n name: matName,\n })\n\n if (color.a !== 1.0) {\n loadedMaterial.transparent = true\n loadedMaterial.opacity = color.a\n }\n\n return { id: matId, material: loadedMaterial }\n }\n\n function loadColor(node) {\n const color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 }\n\n for (let i = 0; i < node.childNodes.length; i++) {\n const matColor = node.childNodes[i]\n\n if (matColor.nodeName === 'r') {\n color.r = matColor.textContent\n } else if (matColor.nodeName === 'g') {\n color.g = matColor.textContent\n } else if (matColor.nodeName === 'b') {\n color.b = matColor.textContent\n } else if (matColor.nodeName === 'a') {\n color.a = matColor.textContent\n }\n }\n\n return color\n }\n\n function loadMeshVolume(node) {\n const volume = { name: '', triangles: [], materialid: null }\n\n let currVolumeNode = node.firstElementChild\n\n if (node.attributes.materialid !== undefined) {\n volume.materialId = node.attributes.materialid.nodeValue\n }\n\n while (currVolumeNode) {\n if (currVolumeNode.nodeName === 'metadata') {\n if (currVolumeNode.attributes.type !== undefined) {\n if (currVolumeNode.attributes.type.value === 'name') {\n volume.name = currVolumeNode.textContent\n }\n }\n } else if (currVolumeNode.nodeName === 'triangle') {\n const v1 = currVolumeNode.getElementsByTagName('v1')[0].textContent\n const v2 = currVolumeNode.getElementsByTagName('v2')[0].textContent\n const v3 = currVolumeNode.getElementsByTagName('v3')[0].textContent\n\n volume.triangles.push(v1, v2, v3)\n }\n\n currVolumeNode = currVolumeNode.nextElementSibling\n }\n\n return volume\n }\n\n function loadMeshVertices(node) {\n const vertArray = []\n const normalArray = []\n let currVerticesNode = node.firstElementChild\n\n while (currVerticesNode) {\n if (currVerticesNode.nodeName === 'vertex') {\n let vNode = currVerticesNode.firstElementChild\n\n while (vNode) {\n if (vNode.nodeName === 'coordinates') {\n const x = vNode.getElementsByTagName('x')[0].textContent\n const y = vNode.getElementsByTagName('y')[0].textContent\n const z = vNode.getElementsByTagName('z')[0].textContent\n\n vertArray.push(x, y, z)\n } else if (vNode.nodeName === 'normal') {\n const nx = vNode.getElementsByTagName('nx')[0].textContent\n const ny = vNode.getElementsByTagName('ny')[0].textContent\n const nz = vNode.getElementsByTagName('nz')[0].textContent\n\n normalArray.push(nx, ny, nz)\n }\n\n vNode = vNode.nextElementSibling\n }\n }\n\n currVerticesNode = currVerticesNode.nextElementSibling\n }\n\n return { vertices: vertArray, normals: normalArray }\n }\n\n function loadObject(node) {\n const objId = node.attributes.id.textContent\n const loadedObject = { name: 'amfobject', meshes: [] }\n let currColor = null\n let currObjNode = node.firstElementChild\n\n while (currObjNode) {\n if (currObjNode.nodeName === 'metadata') {\n if (currObjNode.attributes.type !== undefined) {\n if (currObjNode.attributes.type.value === 'name') {\n loadedObject.name = currObjNode.textContent\n }\n }\n } else if (currObjNode.nodeName === 'color') {\n currColor = loadColor(currObjNode)\n } else if (currObjNode.nodeName === 'mesh') {\n let currMeshNode = currObjNode.firstElementChild\n const mesh = { vertices: [], normals: [], volumes: [], color: currColor }\n\n while (currMeshNode) {\n if (currMeshNode.nodeName === 'vertices') {\n const loadedVertices = loadMeshVertices(currMeshNode)\n\n mesh.normals = mesh.normals.concat(loadedVertices.normals)\n mesh.vertices = mesh.vertices.concat(loadedVertices.vertices)\n } else if (currMeshNode.nodeName === 'volume') {\n mesh.volumes.push(loadMeshVolume(currMeshNode))\n }\n\n currMeshNode = currMeshNode.nextElementSibling\n }\n\n loadedObject.meshes.push(mesh)\n }\n\n currObjNode = currObjNode.nextElementSibling\n }\n\n return { id: objId, obj: loadedObject }\n }\n\n const xmlData = loadDocument(data)\n let amfName = ''\n let amfAuthor = ''\n const amfScale = loadDocumentScale(xmlData)\n const amfMaterials = {}\n const amfObjects = {}\n const childNodes = xmlData.documentElement.childNodes\n\n let i, j\n\n for (i = 0; i < childNodes.length; i++) {\n const child = childNodes[i]\n\n if (child.nodeName === 'metadata') {\n if (child.attributes.type !== undefined) {\n if (child.attributes.type.value === 'name') {\n amfName = child.textContent\n } else if (child.attributes.type.value === 'author') {\n amfAuthor = child.textContent\n }\n }\n } else if (child.nodeName === 'material') {\n const loadedMaterial = loadMaterials(child)\n\n amfMaterials[loadedMaterial.id] = loadedMaterial.material\n } else if (child.nodeName === 'object') {\n const loadedObject = loadObject(child)\n\n amfObjects[loadedObject.id] = loadedObject.obj\n }\n }\n\n const sceneObject = new Group()\n const defaultMaterial = new MeshPhongMaterial({ color: 0xaaaaff, flatShading: true })\n\n sceneObject.name = amfName\n sceneObject.userData.author = amfAuthor\n sceneObject.userData.loader = 'AMF'\n\n for (const id in amfObjects) {\n const part = amfObjects[id]\n const meshes = part.meshes\n const newObject = new Group()\n newObject.name = part.name || ''\n\n for (i = 0; i < meshes.length; i++) {\n let objDefaultMaterial = defaultMaterial\n const mesh = meshes[i]\n const vertices = new Float32BufferAttribute(mesh.vertices, 3)\n let normals = null\n\n if (mesh.normals.length) {\n normals = new Float32BufferAttribute(mesh.normals, 3)\n }\n\n if (mesh.color) {\n const color = mesh.color\n\n objDefaultMaterial = defaultMaterial.clone()\n objDefaultMaterial.color = new Color(color.r, color.g, color.b)\n\n if (color.a !== 1.0) {\n objDefaultMaterial.transparent = true\n objDefaultMaterial.opacity = color.a\n }\n }\n\n const volumes = mesh.volumes\n\n for (j = 0; j < volumes.length; j++) {\n const volume = volumes[j]\n const newGeometry = new BufferGeometry()\n let material = objDefaultMaterial\n\n newGeometry.setIndex(volume.triangles)\n newGeometry.setAttribute('position', vertices.clone())\n\n if (normals) {\n newGeometry.setAttribute('normal', normals.clone())\n }\n\n if (amfMaterials[volume.materialId] !== undefined) {\n material = amfMaterials[volume.materialId]\n }\n\n newGeometry.scale(amfScale, amfScale, amfScale)\n newObject.add(new Mesh(newGeometry, material.clone()))\n }\n }\n\n sceneObject.add(newObject)\n }\n\n return sceneObject\n }\n}\n\nexport { AMFLoader }\n"],"names":["Loader","FileLoader","data","unzipSync","decodeText","xmlData","i","MeshPhongMaterial","Color","Group","Float32BufferAttribute","BufferGeometry","Mesh"],"mappings":"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"}
|
package/loaders/AMFLoader.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Loader, FileLoader, Group, MeshPhongMaterial, Float32BufferAttribute, Color, BufferGeometry, Mesh
|
|
1
|
+
import { Loader, FileLoader, Group, MeshPhongMaterial, Float32BufferAttribute, Color, BufferGeometry, Mesh } from "three";
|
|
2
2
|
import { unzipSync } from "fflate";
|
|
3
|
+
import { decodeText } from "../_polyfill/LoaderUtils.js";
|
|
3
4
|
class AMFLoader extends Loader {
|
|
4
5
|
constructor(manager) {
|
|
5
6
|
super(manager);
|
|
@@ -53,7 +54,7 @@ class AMFLoader extends Loader {
|
|
|
53
54
|
console.log("THREE.AMFLoader: Trying to load file asset: " + file);
|
|
54
55
|
view = new DataView(zip[file].buffer);
|
|
55
56
|
}
|
|
56
|
-
const fileText =
|
|
57
|
+
const fileText = decodeText(view);
|
|
57
58
|
const xmlData2 = new DOMParser().parseFromString(fileText, "application/xml");
|
|
58
59
|
if (xmlData2.documentElement.nodeName.toLowerCase() !== "amf") {
|
|
59
60
|
console.log("THREE.AMFLoader: Error loading AMF - no AMF document found.");
|
package/loaders/AMFLoader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AMFLoader.js","sources":["../../src/loaders/AMFLoader.js"],"sourcesContent":["import {\n BufferGeometry,\n Color,\n FileLoader,\n Float32BufferAttribute,\n Group,\n Loader,\n LoaderUtils,\n Mesh,\n MeshPhongMaterial,\n} from 'three'\nimport { unzipSync } from 'fflate'\n\n/**\n * Description: Early release of an AMF Loader following the pattern of the\n * example loaders in the three.js project.\n *\n * Usage:\n *\tconst loader = new AMFLoader();\n *\tloader.load('/path/to/project.amf', function(objecttree) {\n *\t\tscene.add(objecttree);\n *\t});\n *\n * Materials now supported, material colors supported\n * Zip support, requires fflate\n * No constellation support (yet)!\n *\n */\n\nclass AMFLoader extends Loader {\n constructor(manager) {\n super(manager)\n }\n\n load(url, onLoad, onProgress, onError) {\n const scope = this\n\n const loader = new FileLoader(scope.manager)\n loader.setPath(scope.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(scope.requestHeader)\n loader.setWithCredentials(scope.withCredentials)\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\n } catch (e) {\n if (onError) {\n onError(e)\n } else {\n console.error(e)\n }\n\n scope.manager.itemError(url)\n }\n },\n onProgress,\n onError,\n )\n }\n\n parse(data) {\n function loadDocument(data) {\n let view = new DataView(data)\n const magic = String.fromCharCode(view.getUint8(0), view.getUint8(1))\n\n if (magic === 'PK') {\n let zip = null\n let file = null\n\n console.log('THREE.AMFLoader: Loading Zip')\n\n try {\n zip = unzipSync(new Uint8Array(data))\n } catch (e) {\n if (e instanceof ReferenceError) {\n console.log('THREE.AMFLoader: fflate missing and file is compressed.')\n return null\n }\n }\n\n for (file in zip) {\n if (file.toLowerCase().substr(-4) === '.amf') {\n break\n }\n }\n\n console.log('THREE.AMFLoader: Trying to load file asset: ' + file)\n view = new DataView(zip[file].buffer)\n }\n\n const fileText = LoaderUtils.decodeText(view)\n const xmlData = new DOMParser().parseFromString(fileText, 'application/xml')\n\n if (xmlData.documentElement.nodeName.toLowerCase() !== 'amf') {\n console.log('THREE.AMFLoader: Error loading AMF - no AMF document found.')\n return null\n }\n\n return xmlData\n }\n\n function loadDocumentScale(node) {\n let scale = 1.0\n let unit = 'millimeter'\n\n if (node.documentElement.attributes.unit !== undefined) {\n unit = node.documentElement.attributes.unit.value.toLowerCase()\n }\n\n const scaleUnits = {\n millimeter: 1.0,\n inch: 25.4,\n feet: 304.8,\n meter: 1000.0,\n micron: 0.001,\n }\n\n if (scaleUnits[unit] !== undefined) {\n scale = scaleUnits[unit]\n }\n\n console.log('THREE.AMFLoader: Unit scale: ' + scale)\n return scale\n }\n\n function loadMaterials(node) {\n let matName = 'AMF Material'\n const matId = node.attributes.id.textContent\n let color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 }\n\n let loadedMaterial = null\n\n for (let i = 0; i < node.childNodes.length; i++) {\n const matChildEl = node.childNodes[i]\n\n if (matChildEl.nodeName === 'metadata' && matChildEl.attributes.type !== undefined) {\n if (matChildEl.attributes.type.value === 'name') {\n matName = matChildEl.textContent\n }\n } else if (matChildEl.nodeName === 'color') {\n color = loadColor(matChildEl)\n }\n }\n\n loadedMaterial = new MeshPhongMaterial({\n flatShading: true,\n color: new Color(color.r, color.g, color.b),\n name: matName,\n })\n\n if (color.a !== 1.0) {\n loadedMaterial.transparent = true\n loadedMaterial.opacity = color.a\n }\n\n return { id: matId, material: loadedMaterial }\n }\n\n function loadColor(node) {\n const color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 }\n\n for (let i = 0; i < node.childNodes.length; i++) {\n const matColor = node.childNodes[i]\n\n if (matColor.nodeName === 'r') {\n color.r = matColor.textContent\n } else if (matColor.nodeName === 'g') {\n color.g = matColor.textContent\n } else if (matColor.nodeName === 'b') {\n color.b = matColor.textContent\n } else if (matColor.nodeName === 'a') {\n color.a = matColor.textContent\n }\n }\n\n return color\n }\n\n function loadMeshVolume(node) {\n const volume = { name: '', triangles: [], materialid: null }\n\n let currVolumeNode = node.firstElementChild\n\n if (node.attributes.materialid !== undefined) {\n volume.materialId = node.attributes.materialid.nodeValue\n }\n\n while (currVolumeNode) {\n if (currVolumeNode.nodeName === 'metadata') {\n if (currVolumeNode.attributes.type !== undefined) {\n if (currVolumeNode.attributes.type.value === 'name') {\n volume.name = currVolumeNode.textContent\n }\n }\n } else if (currVolumeNode.nodeName === 'triangle') {\n const v1 = currVolumeNode.getElementsByTagName('v1')[0].textContent\n const v2 = currVolumeNode.getElementsByTagName('v2')[0].textContent\n const v3 = currVolumeNode.getElementsByTagName('v3')[0].textContent\n\n volume.triangles.push(v1, v2, v3)\n }\n\n currVolumeNode = currVolumeNode.nextElementSibling\n }\n\n return volume\n }\n\n function loadMeshVertices(node) {\n const vertArray = []\n const normalArray = []\n let currVerticesNode = node.firstElementChild\n\n while (currVerticesNode) {\n if (currVerticesNode.nodeName === 'vertex') {\n let vNode = currVerticesNode.firstElementChild\n\n while (vNode) {\n if (vNode.nodeName === 'coordinates') {\n const x = vNode.getElementsByTagName('x')[0].textContent\n const y = vNode.getElementsByTagName('y')[0].textContent\n const z = vNode.getElementsByTagName('z')[0].textContent\n\n vertArray.push(x, y, z)\n } else if (vNode.nodeName === 'normal') {\n const nx = vNode.getElementsByTagName('nx')[0].textContent\n const ny = vNode.getElementsByTagName('ny')[0].textContent\n const nz = vNode.getElementsByTagName('nz')[0].textContent\n\n normalArray.push(nx, ny, nz)\n }\n\n vNode = vNode.nextElementSibling\n }\n }\n\n currVerticesNode = currVerticesNode.nextElementSibling\n }\n\n return { vertices: vertArray, normals: normalArray }\n }\n\n function loadObject(node) {\n const objId = node.attributes.id.textContent\n const loadedObject = { name: 'amfobject', meshes: [] }\n let currColor = null\n let currObjNode = node.firstElementChild\n\n while (currObjNode) {\n if (currObjNode.nodeName === 'metadata') {\n if (currObjNode.attributes.type !== undefined) {\n if (currObjNode.attributes.type.value === 'name') {\n loadedObject.name = currObjNode.textContent\n }\n }\n } else if (currObjNode.nodeName === 'color') {\n currColor = loadColor(currObjNode)\n } else if (currObjNode.nodeName === 'mesh') {\n let currMeshNode = currObjNode.firstElementChild\n const mesh = { vertices: [], normals: [], volumes: [], color: currColor }\n\n while (currMeshNode) {\n if (currMeshNode.nodeName === 'vertices') {\n const loadedVertices = loadMeshVertices(currMeshNode)\n\n mesh.normals = mesh.normals.concat(loadedVertices.normals)\n mesh.vertices = mesh.vertices.concat(loadedVertices.vertices)\n } else if (currMeshNode.nodeName === 'volume') {\n mesh.volumes.push(loadMeshVolume(currMeshNode))\n }\n\n currMeshNode = currMeshNode.nextElementSibling\n }\n\n loadedObject.meshes.push(mesh)\n }\n\n currObjNode = currObjNode.nextElementSibling\n }\n\n return { id: objId, obj: loadedObject }\n }\n\n const xmlData = loadDocument(data)\n let amfName = ''\n let amfAuthor = ''\n const amfScale = loadDocumentScale(xmlData)\n const amfMaterials = {}\n const amfObjects = {}\n const childNodes = xmlData.documentElement.childNodes\n\n let i, j\n\n for (i = 0; i < childNodes.length; i++) {\n const child = childNodes[i]\n\n if (child.nodeName === 'metadata') {\n if (child.attributes.type !== undefined) {\n if (child.attributes.type.value === 'name') {\n amfName = child.textContent\n } else if (child.attributes.type.value === 'author') {\n amfAuthor = child.textContent\n }\n }\n } else if (child.nodeName === 'material') {\n const loadedMaterial = loadMaterials(child)\n\n amfMaterials[loadedMaterial.id] = loadedMaterial.material\n } else if (child.nodeName === 'object') {\n const loadedObject = loadObject(child)\n\n amfObjects[loadedObject.id] = loadedObject.obj\n }\n }\n\n const sceneObject = new Group()\n const defaultMaterial = new MeshPhongMaterial({ color: 0xaaaaff, flatShading: true })\n\n sceneObject.name = amfName\n sceneObject.userData.author = amfAuthor\n sceneObject.userData.loader = 'AMF'\n\n for (const id in amfObjects) {\n const part = amfObjects[id]\n const meshes = part.meshes\n const newObject = new Group()\n newObject.name = part.name || ''\n\n for (i = 0; i < meshes.length; i++) {\n let objDefaultMaterial = defaultMaterial\n const mesh = meshes[i]\n const vertices = new Float32BufferAttribute(mesh.vertices, 3)\n let normals = null\n\n if (mesh.normals.length) {\n normals = new Float32BufferAttribute(mesh.normals, 3)\n }\n\n if (mesh.color) {\n const color = mesh.color\n\n objDefaultMaterial = defaultMaterial.clone()\n objDefaultMaterial.color = new Color(color.r, color.g, color.b)\n\n if (color.a !== 1.0) {\n objDefaultMaterial.transparent = true\n objDefaultMaterial.opacity = color.a\n }\n }\n\n const volumes = mesh.volumes\n\n for (j = 0; j < volumes.length; j++) {\n const volume = volumes[j]\n const newGeometry = new BufferGeometry()\n let material = objDefaultMaterial\n\n newGeometry.setIndex(volume.triangles)\n newGeometry.setAttribute('position', vertices.clone())\n\n if (normals) {\n newGeometry.setAttribute('normal', normals.clone())\n }\n\n if (amfMaterials[volume.materialId] !== undefined) {\n material = amfMaterials[volume.materialId]\n }\n\n newGeometry.scale(amfScale, amfScale, amfScale)\n newObject.add(new Mesh(newGeometry, material.clone()))\n }\n }\n\n sceneObject.add(newObject)\n }\n\n return sceneObject\n }\n}\n\nexport { AMFLoader }\n"],"names":["data","xmlData","i"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AMFLoader.js","sources":["../../src/loaders/AMFLoader.js"],"sourcesContent":["import {\n BufferGeometry,\n Color,\n FileLoader,\n Float32BufferAttribute,\n Group,\n Loader,\n LoaderUtils,\n Mesh,\n MeshPhongMaterial,\n} from 'three'\nimport { unzipSync } from 'fflate'\nimport { decodeText } from '../_polyfill/LoaderUtils'\n\n/**\n * Description: Early release of an AMF Loader following the pattern of the\n * example loaders in the three.js project.\n *\n * Usage:\n *\tconst loader = new AMFLoader();\n *\tloader.load('/path/to/project.amf', function(objecttree) {\n *\t\tscene.add(objecttree);\n *\t});\n *\n * Materials now supported, material colors supported\n * Zip support, requires fflate\n * No constellation support (yet)!\n *\n */\n\nclass AMFLoader extends Loader {\n constructor(manager) {\n super(manager)\n }\n\n load(url, onLoad, onProgress, onError) {\n const scope = this\n\n const loader = new FileLoader(scope.manager)\n loader.setPath(scope.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(scope.requestHeader)\n loader.setWithCredentials(scope.withCredentials)\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\n } catch (e) {\n if (onError) {\n onError(e)\n } else {\n console.error(e)\n }\n\n scope.manager.itemError(url)\n }\n },\n onProgress,\n onError,\n )\n }\n\n parse(data) {\n function loadDocument(data) {\n let view = new DataView(data)\n const magic = String.fromCharCode(view.getUint8(0), view.getUint8(1))\n\n if (magic === 'PK') {\n let zip = null\n let file = null\n\n console.log('THREE.AMFLoader: Loading Zip')\n\n try {\n zip = unzipSync(new Uint8Array(data))\n } catch (e) {\n if (e instanceof ReferenceError) {\n console.log('THREE.AMFLoader: fflate missing and file is compressed.')\n return null\n }\n }\n\n for (file in zip) {\n if (file.toLowerCase().substr(-4) === '.amf') {\n break\n }\n }\n\n console.log('THREE.AMFLoader: Trying to load file asset: ' + file)\n view = new DataView(zip[file].buffer)\n }\n\n const fileText = decodeText(view)\n const xmlData = new DOMParser().parseFromString(fileText, 'application/xml')\n\n if (xmlData.documentElement.nodeName.toLowerCase() !== 'amf') {\n console.log('THREE.AMFLoader: Error loading AMF - no AMF document found.')\n return null\n }\n\n return xmlData\n }\n\n function loadDocumentScale(node) {\n let scale = 1.0\n let unit = 'millimeter'\n\n if (node.documentElement.attributes.unit !== undefined) {\n unit = node.documentElement.attributes.unit.value.toLowerCase()\n }\n\n const scaleUnits = {\n millimeter: 1.0,\n inch: 25.4,\n feet: 304.8,\n meter: 1000.0,\n micron: 0.001,\n }\n\n if (scaleUnits[unit] !== undefined) {\n scale = scaleUnits[unit]\n }\n\n console.log('THREE.AMFLoader: Unit scale: ' + scale)\n return scale\n }\n\n function loadMaterials(node) {\n let matName = 'AMF Material'\n const matId = node.attributes.id.textContent\n let color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 }\n\n let loadedMaterial = null\n\n for (let i = 0; i < node.childNodes.length; i++) {\n const matChildEl = node.childNodes[i]\n\n if (matChildEl.nodeName === 'metadata' && matChildEl.attributes.type !== undefined) {\n if (matChildEl.attributes.type.value === 'name') {\n matName = matChildEl.textContent\n }\n } else if (matChildEl.nodeName === 'color') {\n color = loadColor(matChildEl)\n }\n }\n\n loadedMaterial = new MeshPhongMaterial({\n flatShading: true,\n color: new Color(color.r, color.g, color.b),\n name: matName,\n })\n\n if (color.a !== 1.0) {\n loadedMaterial.transparent = true\n loadedMaterial.opacity = color.a\n }\n\n return { id: matId, material: loadedMaterial }\n }\n\n function loadColor(node) {\n const color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 }\n\n for (let i = 0; i < node.childNodes.length; i++) {\n const matColor = node.childNodes[i]\n\n if (matColor.nodeName === 'r') {\n color.r = matColor.textContent\n } else if (matColor.nodeName === 'g') {\n color.g = matColor.textContent\n } else if (matColor.nodeName === 'b') {\n color.b = matColor.textContent\n } else if (matColor.nodeName === 'a') {\n color.a = matColor.textContent\n }\n }\n\n return color\n }\n\n function loadMeshVolume(node) {\n const volume = { name: '', triangles: [], materialid: null }\n\n let currVolumeNode = node.firstElementChild\n\n if (node.attributes.materialid !== undefined) {\n volume.materialId = node.attributes.materialid.nodeValue\n }\n\n while (currVolumeNode) {\n if (currVolumeNode.nodeName === 'metadata') {\n if (currVolumeNode.attributes.type !== undefined) {\n if (currVolumeNode.attributes.type.value === 'name') {\n volume.name = currVolumeNode.textContent\n }\n }\n } else if (currVolumeNode.nodeName === 'triangle') {\n const v1 = currVolumeNode.getElementsByTagName('v1')[0].textContent\n const v2 = currVolumeNode.getElementsByTagName('v2')[0].textContent\n const v3 = currVolumeNode.getElementsByTagName('v3')[0].textContent\n\n volume.triangles.push(v1, v2, v3)\n }\n\n currVolumeNode = currVolumeNode.nextElementSibling\n }\n\n return volume\n }\n\n function loadMeshVertices(node) {\n const vertArray = []\n const normalArray = []\n let currVerticesNode = node.firstElementChild\n\n while (currVerticesNode) {\n if (currVerticesNode.nodeName === 'vertex') {\n let vNode = currVerticesNode.firstElementChild\n\n while (vNode) {\n if (vNode.nodeName === 'coordinates') {\n const x = vNode.getElementsByTagName('x')[0].textContent\n const y = vNode.getElementsByTagName('y')[0].textContent\n const z = vNode.getElementsByTagName('z')[0].textContent\n\n vertArray.push(x, y, z)\n } else if (vNode.nodeName === 'normal') {\n const nx = vNode.getElementsByTagName('nx')[0].textContent\n const ny = vNode.getElementsByTagName('ny')[0].textContent\n const nz = vNode.getElementsByTagName('nz')[0].textContent\n\n normalArray.push(nx, ny, nz)\n }\n\n vNode = vNode.nextElementSibling\n }\n }\n\n currVerticesNode = currVerticesNode.nextElementSibling\n }\n\n return { vertices: vertArray, normals: normalArray }\n }\n\n function loadObject(node) {\n const objId = node.attributes.id.textContent\n const loadedObject = { name: 'amfobject', meshes: [] }\n let currColor = null\n let currObjNode = node.firstElementChild\n\n while (currObjNode) {\n if (currObjNode.nodeName === 'metadata') {\n if (currObjNode.attributes.type !== undefined) {\n if (currObjNode.attributes.type.value === 'name') {\n loadedObject.name = currObjNode.textContent\n }\n }\n } else if (currObjNode.nodeName === 'color') {\n currColor = loadColor(currObjNode)\n } else if (currObjNode.nodeName === 'mesh') {\n let currMeshNode = currObjNode.firstElementChild\n const mesh = { vertices: [], normals: [], volumes: [], color: currColor }\n\n while (currMeshNode) {\n if (currMeshNode.nodeName === 'vertices') {\n const loadedVertices = loadMeshVertices(currMeshNode)\n\n mesh.normals = mesh.normals.concat(loadedVertices.normals)\n mesh.vertices = mesh.vertices.concat(loadedVertices.vertices)\n } else if (currMeshNode.nodeName === 'volume') {\n mesh.volumes.push(loadMeshVolume(currMeshNode))\n }\n\n currMeshNode = currMeshNode.nextElementSibling\n }\n\n loadedObject.meshes.push(mesh)\n }\n\n currObjNode = currObjNode.nextElementSibling\n }\n\n return { id: objId, obj: loadedObject }\n }\n\n const xmlData = loadDocument(data)\n let amfName = ''\n let amfAuthor = ''\n const amfScale = loadDocumentScale(xmlData)\n const amfMaterials = {}\n const amfObjects = {}\n const childNodes = xmlData.documentElement.childNodes\n\n let i, j\n\n for (i = 0; i < childNodes.length; i++) {\n const child = childNodes[i]\n\n if (child.nodeName === 'metadata') {\n if (child.attributes.type !== undefined) {\n if (child.attributes.type.value === 'name') {\n amfName = child.textContent\n } else if (child.attributes.type.value === 'author') {\n amfAuthor = child.textContent\n }\n }\n } else if (child.nodeName === 'material') {\n const loadedMaterial = loadMaterials(child)\n\n amfMaterials[loadedMaterial.id] = loadedMaterial.material\n } else if (child.nodeName === 'object') {\n const loadedObject = loadObject(child)\n\n amfObjects[loadedObject.id] = loadedObject.obj\n }\n }\n\n const sceneObject = new Group()\n const defaultMaterial = new MeshPhongMaterial({ color: 0xaaaaff, flatShading: true })\n\n sceneObject.name = amfName\n sceneObject.userData.author = amfAuthor\n sceneObject.userData.loader = 'AMF'\n\n for (const id in amfObjects) {\n const part = amfObjects[id]\n const meshes = part.meshes\n const newObject = new Group()\n newObject.name = part.name || ''\n\n for (i = 0; i < meshes.length; i++) {\n let objDefaultMaterial = defaultMaterial\n const mesh = meshes[i]\n const vertices = new Float32BufferAttribute(mesh.vertices, 3)\n let normals = null\n\n if (mesh.normals.length) {\n normals = new Float32BufferAttribute(mesh.normals, 3)\n }\n\n if (mesh.color) {\n const color = mesh.color\n\n objDefaultMaterial = defaultMaterial.clone()\n objDefaultMaterial.color = new Color(color.r, color.g, color.b)\n\n if (color.a !== 1.0) {\n objDefaultMaterial.transparent = true\n objDefaultMaterial.opacity = color.a\n }\n }\n\n const volumes = mesh.volumes\n\n for (j = 0; j < volumes.length; j++) {\n const volume = volumes[j]\n const newGeometry = new BufferGeometry()\n let material = objDefaultMaterial\n\n newGeometry.setIndex(volume.triangles)\n newGeometry.setAttribute('position', vertices.clone())\n\n if (normals) {\n newGeometry.setAttribute('normal', normals.clone())\n }\n\n if (amfMaterials[volume.materialId] !== undefined) {\n material = amfMaterials[volume.materialId]\n }\n\n newGeometry.scale(amfScale, amfScale, amfScale)\n newObject.add(new Mesh(newGeometry, material.clone()))\n }\n }\n\n sceneObject.add(newObject)\n }\n\n return sceneObject\n }\n}\n\nexport { AMFLoader }\n"],"names":["data","xmlData","i"],"mappings":"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"}
|
package/loaders/FBXLoader.cjs
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const THREE = require("three");
|
|
4
4
|
const fflate = require("fflate");
|
|
5
5
|
const NURBSCurve = require("../curves/NURBSCurve.cjs");
|
|
6
|
+
const LoaderUtils = require("../_polyfill/LoaderUtils.cjs");
|
|
6
7
|
let fbxTree;
|
|
7
8
|
let connections;
|
|
8
9
|
let sceneGraph;
|
|
@@ -2238,7 +2239,7 @@ class BinaryReader {
|
|
|
2238
2239
|
const nullByte = a.indexOf(0);
|
|
2239
2240
|
if (nullByte >= 0)
|
|
2240
2241
|
a = a.slice(0, nullByte);
|
|
2241
|
-
return
|
|
2242
|
+
return LoaderUtils.decodeText(new Uint8Array(a));
|
|
2242
2243
|
}
|
|
2243
2244
|
}
|
|
2244
2245
|
class FBXTree {
|
|
@@ -2436,7 +2437,7 @@ function convertArrayBufferToString(buffer, from, to) {
|
|
|
2436
2437
|
from = 0;
|
|
2437
2438
|
if (to === void 0)
|
|
2438
2439
|
to = buffer.byteLength;
|
|
2439
|
-
return
|
|
2440
|
+
return LoaderUtils.decodeText(new Uint8Array(buffer, from, to));
|
|
2440
2441
|
}
|
|
2441
2442
|
function append(a, b) {
|
|
2442
2443
|
for (let i = 0, j = a.length, l = b.length; i < l; i++, j++) {
|