summit/frontend/node_modules/three-stdlib/loaders/AMFLoader.cjs.map

1 line
18 KiB
Plaintext
Raw Normal View History

2025-12-08 16:31:30 +00:00
{"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