@inweb/viewer-three 26.5.5 → 26.6.1
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/dist/plugins/components/LightHelperComponent.js +9 -3
- package/dist/plugins/components/LightHelperComponent.js.map +1 -1
- package/dist/plugins/components/LightHelperComponent.min.js +1 -1
- package/dist/plugins/components/LightHelperComponent.module.js +5 -4
- package/dist/plugins/components/LightHelperComponent.module.js.map +1 -1
- package/dist/plugins/components/RoomEnvironmentComponent.js +178 -0
- package/dist/plugins/components/RoomEnvironmentComponent.js.map +1 -0
- package/dist/plugins/components/RoomEnvironmentComponent.min.js +1 -0
- package/dist/plugins/components/RoomEnvironmentComponent.module.js +21 -0
- package/dist/plugins/components/RoomEnvironmentComponent.module.js.map +1 -0
- package/dist/plugins/loaders/IFCXLoader.js +21 -27
- package/dist/plugins/loaders/IFCXLoader.js.map +1 -1
- package/dist/plugins/loaders/IFCXLoader.min.js +1 -1
- package/dist/plugins/loaders/IFCXLoader.module.js +7 -18
- package/dist/plugins/loaders/IFCXLoader.module.js.map +1 -1
- package/dist/viewer-three.js +25 -173
- package/dist/viewer-three.js.map +1 -1
- package/dist/viewer-three.min.js +2 -2
- package/dist/viewer-three.module.js +21 -21
- package/dist/viewer-three.module.js.map +1 -1
- package/lib/Viewer/components/LightComponent.d.ts +3 -1
- package/package.json +5 -5
- package/plugins/components/LightHelperComponent.ts +10 -5
- package/{src/Viewer → plugins}/components/RoomEnvironmentComponent.ts +4 -4
- package/plugins/loaders/IFCX/render.js +26 -21
- package/src/Viewer/components/LightComponent.ts +33 -4
- package/src/Viewer/components/index.ts +0 -2
- package/lib/Viewer/components/RoomEnvironmentComponent.d.ts +0 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IFCXLoader.module.js","sources":["../../../plugins/loaders/IFCX/render.js","../../../plugins/loaders/IFCXModelLoader.ts","../../../plugins/loaders/IFCX/IFCXLoader.ts","../../../plugins/loaders/IFCXFileLoader.ts","../../../plugins/loaders/IFCXLoader.ts"],"sourcesContent":["///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\n// https://github.com/buildingSMART/IFC5-development/docs/viewer/render.mjs\n// Commit Date: 17.04.2025 11:13:04\n// Commit SHA-1: 0a351ab2efe7deabbdd131c338a08d5b5c38179c\n\n// (C) buildingSMART International\n// published under MIT license\n\n/* eslint-disable prefer-const */\n/* eslint-disable no-useless-catch */\n\nimport {\n Box3,\n BufferAttribute,\n BufferGeometry,\n Color,\n Group,\n Line,\n LineBasicMaterial,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n PerspectiveCamera,\n Scene,\n Vector3,\n} from \"three\";\n\nconst THREE = {\n Box3,\n BufferAttribute,\n BufferGeometry,\n Color,\n Group,\n Line,\n LineBasicMaterial,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n PerspectiveCamera,\n Scene,\n Vector3,\n};\n\n// composed-object.ts\nfunction getChildByName(root, childName, skip = 0) {\n let fragments = childName.replace(/^<\\/|^\\/|>$/g, \"\").split(\"/\");\n for (let i = 0; i < skip; ++i) {\n fragments.shift();\n }\n let start = root;\n while (fragments.length && start && start.children) {\n // console.log(start, fragments[0]);\n let f = fragments.shift();\n start = start.children.find((i) => i.name.split(\"/\").reverse()[0] === f);\n }\n if (fragments.length == 0) {\n return start;\n }\n}\n\n// compose-alpha.ts\nfunction GetNode(node, path) {\n if (path === \"\") return node;\n let parts = path.split(\"/\");\n let child = node.children.get(parts[0]);\n if (child) {\n if (parts.length === 1) {\n return child;\n }\n return GetNode(child, GetTail(path));\n } else {\n return null;\n }\n}\nfunction GetHead(path) {\n return path.split(\"/\")[0];\n}\nfunction GetTail(path) {\n let parts = path.split(\"/\");\n parts.shift();\n return parts.join(\"/\");\n}\nfunction MakeNode(node) {\n return {\n node,\n children: /* @__PURE__ */ new Map(),\n attributes: /* @__PURE__ */ new Map(),\n };\n}\nfunction ConvertToCompositionNode(path, inputNodes) {\n let compositionNode = {\n path,\n children: {},\n inherits: {},\n attributes: {},\n };\n inputNodes.forEach((node) => {\n Object.keys(node.children).forEach((childName) => {\n compositionNode.children[childName] = node.children[childName];\n });\n Object.keys(node.inherits).forEach((inheritName) => {\n let ih = node.inherits[inheritName];\n if (ih === null) {\n delete compositionNode.inherits[inheritName];\n } else {\n compositionNode.inherits[inheritName] = ih;\n }\n });\n Object.keys(node.attributes).forEach((attrName) => {\n compositionNode.attributes[attrName] = node.attributes[attrName];\n });\n });\n return compositionNode;\n}\nfunction MMSet(map, key, value) {\n if (map.has(key)) {\n map.get(key)?.push(value);\n } else {\n map.set(key, [value]);\n }\n}\nfunction FindRootsOrCycles(nodes) {\n let dependencies = /* @__PURE__ */ new Map();\n let dependents = /* @__PURE__ */ new Map();\n nodes.forEach((node, path) => {\n Object.keys(node.inherits).forEach((inheritName) => {\n MMSet(dependencies, path, node.inherits[inheritName]);\n MMSet(dependents, node.inherits[inheritName], path);\n });\n Object.keys(node.children).forEach((childName) => {\n MMSet(dependencies, path, node.children[childName]);\n MMSet(dependents, node.children[childName], path);\n });\n });\n let paths = [...nodes.keys()];\n let perm = {};\n let temp = {};\n function visit(path) {\n if (perm[path]) return;\n if (temp[path]) throw new Error(`CYCLE!`);\n temp[path] = true;\n let deps = dependencies.get(path);\n if (deps) {\n deps.forEach((dep) => visit(dep));\n }\n perm[path] = true;\n }\n let roots = /* @__PURE__ */ new Set();\n try {\n paths.forEach((path) => {\n if (!dependents.has(path) && path.indexOf(\"/\") === -1) {\n roots.add(path);\n }\n visit(path);\n });\n } catch {\n return null;\n }\n return roots;\n}\nfunction ConvertNodes(input) {\n let compositionNodes = /* @__PURE__ */ new Map();\n for (let [path, inputNodes] of input) {\n compositionNodes.set(path, ConvertToCompositionNode(path, inputNodes));\n }\n return compositionNodes;\n}\nvar CycleError = class extends Error {};\nfunction ExpandFirstRootInInput(nodes) {\n let roots = FindRootsOrCycles(nodes);\n if (!roots) {\n throw new CycleError();\n }\n return ExpandNewNode([...roots.values()][0], nodes);\n}\nfunction CreateArtificialRoot(nodes) {\n let roots = FindRootsOrCycles(nodes);\n if (!roots) {\n throw new CycleError();\n }\n let pseudoRoot = {\n node: \"\",\n attributes: /* @__PURE__ */ new Map(),\n children: /* @__PURE__ */ new Map(),\n };\n roots.forEach((root) => {\n pseudoRoot.children.set(root, ExpandNewNode(root, nodes));\n });\n return pseudoRoot;\n}\nfunction ExpandNewNode(node, nodes) {\n return ExpandNode(node, MakeNode(node), nodes);\n}\nfunction ExpandNode(path, node, nodes) {\n let input = nodes.get(path);\n if (input) {\n AddDataFromInput(input, node, nodes);\n }\n node.children.forEach((child, name) => {\n ExpandNode(`${path}/${name}`, child, nodes);\n });\n return node;\n}\nfunction AddDataFromInput(input, node, nodes) {\n Object.values(input.inherits).forEach((inherit) => {\n let classNode = ExpandNewNode(GetHead(inherit), nodes);\n let subnode = GetNode(classNode, GetTail(inherit));\n if (!subnode) throw new Error(`Unknown node ${inherit}`);\n subnode.children.forEach((child, childName) => {\n node.children.set(childName, child);\n });\n for (let [attrID, attr] of subnode.attributes) {\n node.attributes.set(attrID, attr);\n }\n });\n Object.entries(input.children).forEach(([childName, child]) => {\n if (child !== null) {\n let classNode = ExpandNewNode(GetHead(child), nodes);\n let subnode = GetNode(classNode, GetTail(child));\n if (!subnode) throw new Error(`Unknown node ${child}`);\n node.children.set(childName, subnode);\n } else {\n node.children.delete(childName);\n }\n });\n Object.entries(input.attributes).forEach(([attrID, attr]) => {\n node.attributes.set(attrID, attr);\n });\n}\n\n// workflow-alpha.ts\nfunction MMSet2(map, key, value) {\n if (map.has(key)) {\n map.get(key)?.push(value);\n } else {\n map.set(key, [value]);\n }\n}\nfunction ToInputNodes(data) {\n let inputNodes = /* @__PURE__ */ new Map();\n data.forEach((ifcxNode) => {\n let node = {\n path: ifcxNode.identifier,\n children: ifcxNode.children ? ifcxNode.children : {},\n inherits: ifcxNode.inherits ? ifcxNode.inherits : {},\n attributes: ifcxNode.attributes ? ifcxNode.attributes : {},\n };\n MMSet2(inputNodes, node.path, node);\n });\n return inputNodes;\n}\nvar SchemaValidationError = class extends Error {};\nfunction ValidateAttributeValue(desc, value, path, schemas) {\n if (desc.inherits) {\n desc.inherits.forEach((inheritedSchemaID) => {\n let inheritedSchema = schemas[inheritedSchemaID];\n if (!inheritedSchema) {\n throw new SchemaValidationError(`Unknown inherited schema id \"${desc.inherits}\"`);\n }\n ValidateAttributeValue(inheritedSchema.value, value, path, schemas);\n });\n }\n if (desc.dataType === \"Boolean\") {\n if (typeof value !== \"boolean\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type boolean`);\n }\n } else if (desc.dataType === \"String\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type string`);\n }\n } else if (desc.dataType === \"DateTime\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type date`);\n }\n } else if (desc.dataType === \"Enum\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type string`);\n }\n let found = desc.enumRestrictions.options.filter((option) => option === value).length === 1;\n if (!found) {\n throw new SchemaValidationError(`Expected \"${value}\" to be one of [${desc.enumRestrictions.options.join(\",\")}]`);\n }\n } else if (desc.dataType === \"Integer\") {\n if (typeof value !== \"number\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type int`);\n }\n } else if (desc.dataType === \"Real\") {\n if (typeof value !== \"number\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type real`);\n }\n } else if (desc.dataType === \"Relation\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type string`);\n }\n } else if (desc.dataType === \"Object\") {\n if (typeof value !== \"object\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type object`);\n }\n if (desc.objectRestrictions) {\n Object.keys(desc.objectRestrictions.values).forEach((key) => {\n if (!Object.hasOwn(value, key)) {\n throw new SchemaValidationError(`Expected \"${value}\" to have key ${key}`);\n }\n ValidateAttributeValue(desc.objectRestrictions.values[key], value[key], path + \".\" + key, schemas);\n });\n }\n } else if (desc.dataType === \"Array\") {\n if (!Array.isArray(value)) {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type array`);\n }\n value.forEach((entry) => {\n ValidateAttributeValue(desc.arrayRestrictions.value, entry, path + \".<array>.\", schemas);\n });\n } else {\n throw new SchemaValidationError(`Unexpected datatype ${desc.dataType}`);\n }\n}\nfunction Validate(schemas, inputNodes) {\n inputNodes.forEach((node) => {\n Object.keys(node.attributes).forEach((schemaID) => {\n if (!schemas[schemaID]) {\n throw new SchemaValidationError(`Missing schema \"${schemaID}\" referenced by [\"${node.path}\"].attributes`);\n }\n let schema = schemas[schemaID];\n let value = node.attributes[schemaID];\n try {\n ValidateAttributeValue(schema.value, value, \"\", schemas);\n } catch (e) {\n if (e instanceof SchemaValidationError) {\n throw new SchemaValidationError(`Error validating [\"${node.path}\"].attributes[\"${schemaID}\"]: ${e.message}`);\n } else {\n throw e;\n }\n }\n });\n });\n}\nfunction LoadIfcxFile(file, checkSchemas = true, createArtificialRoot = false) {\n let inputNodes = ToInputNodes(file.data);\n let compositionNodes = ConvertNodes(inputNodes);\n try {\n if (checkSchemas) {\n Validate(file.schemas, compositionNodes);\n }\n } catch (e) {\n throw e;\n }\n if (createArtificialRoot) {\n return CreateArtificialRoot(compositionNodes);\n } else {\n return ExpandFirstRootInInput(compositionNodes);\n }\n}\nfunction Federate(files) {\n let result = {\n header: files[0].header,\n schemas: {},\n data: [],\n };\n files.forEach((file) => {\n Object.keys(file.schemas).forEach((schemaID) => (result.schemas[schemaID] = file.schemas[schemaID]));\n });\n files.forEach((file) => {\n file.data.forEach((node) => result.data.push(node));\n });\n return Prune(result);\n}\nfunction Collapse(nodes, deleteEmpty = false) {\n let result = {\n path: nodes[0].path,\n children: {},\n inherits: {},\n attributes: {},\n };\n nodes.forEach((node) => {\n Object.keys(node.children).forEach((name) => {\n result.children[name] = node.children[name];\n });\n Object.keys(node.inherits).forEach((name) => {\n result.inherits[name] = node.inherits[name];\n });\n Object.keys(node.attributes).forEach((name) => {\n result.attributes[name] = node.attributes[name];\n });\n });\n if (deleteEmpty) {\n let empty = true;\n Object.keys(result.children).forEach((name) => {\n if (result.children[name] !== null) empty = false;\n });\n Object.keys(result.inherits).forEach((name) => {\n if (result.inherits[name] !== null) empty = false;\n });\n Object.keys(result.attributes).forEach((name) => {\n if (result.attributes[name] !== null) empty = false;\n });\n if (empty) return null;\n }\n return result;\n}\nfunction Prune(file, deleteEmpty = false) {\n let result = {\n header: file.header,\n schemas: file.schemas,\n data: [],\n };\n let inputNodes = ToInputNodes(file.data);\n inputNodes.forEach((nodes) => {\n let collapsed = Collapse(nodes, deleteEmpty);\n if (collapsed)\n result.data.push({\n identifier: collapsed.path,\n children: collapsed.children,\n inherits: collapsed.inherits,\n attributes: collapsed.attributes,\n });\n });\n return result;\n}\n\n// compose-flattened.ts\nfunction TreeNodeToComposedObject(path, node, schemas) {\n let co = {\n name: path,\n attributes: {},\n children: [],\n };\n node.children.forEach((childNode, childName) => {\n co.children?.push(TreeNodeToComposedObject(`${path}/${childName}`, childNode, schemas));\n });\n node.attributes.forEach((attr, attrName) => {\n if (attr && typeof attr === \"object\" && !Array.isArray(attr)) {\n Object.keys(attr).forEach((compname) => {\n co.attributes[`${attrName}::${compname}`] = attr[compname];\n });\n } else {\n let schema = schemas[attrName];\n if (schema && schema.value.quantityKind) {\n let postfix = \"\";\n let quantityKind = schema.value.quantityKind;\n if (quantityKind === \"Length\") {\n postfix = \"m\";\n } else if (quantityKind === \"Volume\") {\n postfix = \"m\" + String.fromCodePoint(179);\n }\n co.attributes[attrName] = `${attr} ${postfix}`;\n } else {\n co.attributes[attrName] = attr;\n }\n }\n });\n if (Object.keys(co.attributes).length === 0) delete co.attributes;\n return co;\n}\nfunction compose3(files) {\n let federated = Federate(files);\n let tree = LoadIfcxFile(federated, true, true);\n return TreeNodeToComposedObject(\"\", tree, federated.schemas);\n}\n\n// render.ts\n// var controls;\n// var renderer;\nvar scene;\nvar camera;\nvar datas = [];\nvar autoCamera = true;\n// var THREE = window[\"THREE\"];\nfunction init() {\n scene = new THREE.Scene();\n camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 100);\n camera.up.set(0, 0, 1);\n camera.position.set(50, 50, 50);\n camera.lookAt(0, 0, 0);\n // const nd = document.querySelector(\".viewport\");\n // renderer = new THREE.WebGLRenderer({\n // alpha: true,\n // logarithmicDepthBuffer: true\n // });\n // renderer.setSize(nd.offsetWidth, nd.offsetHeight);\n // controls = new THREE.OrbitControls(camera, renderer.domElement);\n // controls.enableDamping = true;\n // controls.dampingFactor = 0.25;\n // nd.appendChild(renderer.domElement);\n scene.add(camera);\n return scene;\n}\nfunction HasAttr(node, attrName) {\n if (!node || !node.attributes) return false;\n return !!node.attributes[attrName];\n}\nfunction FindChildWithAttr(node, attrName) {\n if (!node || !node.children) return void 0;\n for (let i = 0; i < node.children.length; i++) {\n if (HasAttr(node.children[i], attrName)) {\n return node.children[i];\n }\n }\n return void 0;\n}\nfunction createMaterialFromParent(parent, root) {\n let reference = parent.attributes[\"usd::usdshade::materialbindingapi::material::binding\"];\n let material = {\n color: new THREE.Color(0.6, 0.6, 0.6),\n transparent: false,\n opacity: 1,\n };\n if (reference) {\n const materialNode = getChildByName(root, reference.ref);\n let shader = FindChildWithAttr(materialNode, \"usd::materials::inputs::diffuseColor\");\n if (shader) {\n let color = shader?.attributes[\"usd::materials::inputs::diffuseColor\"];\n material.color = new THREE.Color(...color);\n if (shader?.attributes[\"usd::materials::inputs::opacity\"]) {\n material.transparent = true;\n material.opacity = shader.attributes[\"usd::materials::inputs::opacity\"];\n }\n }\n }\n return material;\n}\nfunction createCurveFromJson(node, parent, root) {\n let points = new Float32Array(node.attributes[\"usd::usdgeom::basiscurves::points\"].flat());\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(points, 3));\n const material = createMaterialFromParent(parent, root);\n let lineMaterial = new THREE.LineBasicMaterial({ ...material });\n lineMaterial.color.multiplyScalar(0.8);\n return new THREE.Line(geometry, lineMaterial);\n}\nfunction createMeshFromJson(node, parent, root) {\n let points = new Float32Array(node.attributes[\"usd::usdgeom::mesh::points\"].flat());\n let indices = new Uint16Array(node.attributes[\"usd::usdgeom::mesh::faceVertexIndices\"]);\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(points, 3));\n geometry.setIndex(new THREE.BufferAttribute(indices, 1));\n geometry.computeVertexNormals();\n const material = createMaterialFromParent(parent, root);\n let meshMaterial = new THREE.MeshBasicMaterial({ ...material });\n return new THREE.Mesh(geometry, meshMaterial);\n}\nfunction traverseTree(node, parent, root, parentNode = void 0) {\n let elem = new THREE.Group();\n if (HasAttr(node, \"usd::usdgeom::visibility::visibility\")) {\n if (node.attributes[\"usd::usdgeom::visibility::visibility\"] === \"invisible\") {\n return;\n }\n } else if (HasAttr(node, \"usd::usdgeom::mesh::points\")) {\n elem = createMeshFromJson(node, parentNode, root);\n } else if (HasAttr(node, \"usd::usdgeom::basiscurves::points\")) {\n elem = createCurveFromJson(node, parentNode, root);\n }\n parent.add(elem);\n if (node !== root) {\n elem.matrixAutoUpdate = false;\n let matrixNode =\n node.attributes && node.attributes[\"usd::xformop::transform\"]\n ? node.attributes[\"usd::xformop::transform\"].flat()\n : null;\n if (matrixNode) {\n let matrix = new THREE.Matrix4();\n matrix.set(...matrixNode);\n matrix.transpose();\n elem.matrix = matrix;\n }\n }\n (node.children || []).forEach((child) => traverseTree(child, elem || parent, root, node));\n}\n// function encodeHtmlEntities(str) {\n// const div = document.createElement(\"div\");\n// div.textContent = str;\n// return div.innerHTML;\n// }\n// var icons = {\n// \"usd::usdgeom::mesh::points\": \"deployed_code\",\n// \"usd::usdgeom::basiscurves::points\": \"line_curve\",\n// \"usd::usdshade::material::outputs::surface.connect\": \"line_style\"\n// };\n// function buildDomTree(prim, node) {\n// const elem = document.createElement(\"div\");\n// let span;\n// elem.appendChild(document.createTextNode(prim.name ? prim.name.split(\"/\").reverse()[0] : \"root\"));\n// elem.appendChild(span = document.createElement(\"span\"));\n// Object.entries(icons).forEach(([k, v]) => span.innerText += (prim.attributes || {})[k] ? v : \" \");\n// span.className = \"material-symbols-outlined\";\n// elem.onclick = (evt) => {\n// let rows = [[\"name\", prim.name]].concat(Object.entries(prim.attributes)).map(([k, v]) => `<tr><td>${encodeHtmlEntities(k)}</td><td>${encodeHtmlEntities(typeof v === \"object\" ? JSON.stringify(v) : v)}</td>`).join(\"\");\n// document.querySelector(\".attributes .table\").innerHTML = `<table border=\"0\">${rows}</table>`;\n// evt.stopPropagation();\n// };\n// node.appendChild(elem);\n// (prim.children || []).forEach((p) => buildDomTree(p, elem));\n// }\nfunction composeAndRender() {\n if (scene) {\n scene.children = [];\n }\n // document.querySelector(\".tree\").innerHTML = \"\";\n if (datas.length === 0) {\n return;\n }\n let tree = null;\n let dataArray = datas.map((arr) => arr[1]);\n tree = compose3(dataArray);\n if (!tree) {\n console.error(\"No result from composition\");\n return;\n }\n traverseTree(tree, scene || init(), tree);\n if (autoCamera) {\n const boundingBox = new THREE.Box3();\n boundingBox.setFromObject(scene);\n if (!boundingBox.isEmpty()) {\n let avg = boundingBox.min.clone().add(boundingBox.max).multiplyScalar(0.5);\n let ext = boundingBox.max.clone().sub(boundingBox.min).length();\n camera.position.copy(avg.clone().add(new THREE.Vector3(1, 1, 1).normalize().multiplyScalar(ext)));\n camera.far = ext * 3;\n camera.updateProjectionMatrix();\n // controls.target.copy(avg);\n // controls.update();\n autoCamera = false;\n }\n }\n // buildDomTree(tree, document.querySelector(\".tree\"));\n // animate();\n}\n// function createLayerDom() {\n// document.querySelector(\".layers div\").innerHTML = \"\";\n// datas.forEach(([name, _], index) => {\n// const elem = document.createElement(\"div\");\n// elem.appendChild(document.createTextNode(name));\n// [\"\\u25B3\", \"\\u25BD\", \"\\xD7\"].reverse().forEach((lbl, cmd) => {\n// const btn = document.createElement(\"span\");\n// btn.onclick = (evt) => {\n// evt.stopPropagation();\n// if (cmd === 2) {\n// if (index > 0) {\n// [datas[index], datas[index - 1]] = [datas[index - 1], datas[index]];\n// }\n// } else if (cmd === 1) {\n// if (index < datas.length - 1) {\n// [datas[index], datas[index + 1]] = [datas[index + 1], datas[index]];\n// }\n// } else if (cmd === 0) {\n// datas.splice(index, 1);\n// }\n// composeAndRender();\n// createLayerDom();\n// };\n// btn.appendChild(document.createTextNode(lbl));\n// elem.appendChild(btn);\n// });\n// document.querySelector(\".layers div\").appendChild(elem);\n// });\n// }\n// function addModel(name, m) {\n// datas.push([name, m]);\n// createLayerDom();\n// composeAndRender();\n// }\n// function animate() {\n// requestAnimationFrame(animate);\n// controls.update();\n// renderer.render(scene, camera);\n// }\n// export {\n// composeAndRender,\n// addModel as default\n// };\nexport function parse(m, name) {\n datas.push([name, m]);\n composeAndRender();\n return scene;\n}\nexport function clear() {\n scene = undefined;\n datas.length = 0;\n autoCamera = true;\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Loader, Viewer } from \"@inweb/viewer-three\";\nimport { parse, clear } from \"./IFCX/render.js\";\n\nexport class IFCXModelLoader extends Loader {\n public viewer: Viewer;\n\n constructor(viewer: Viewer) {\n super();\n this.viewer = viewer;\n }\n\n override isSupport(file: any): boolean {\n return (\n typeof file === \"object\" &&\n typeof file.type === \"string\" &&\n typeof file.download === \"function\" &&\n /.ifcx$/i.test(file.type)\n );\n }\n\n override async load(model: any): Promise<this> {\n const progress = (progress: number) => {\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file: model });\n };\n\n const arrayBuffer = await model.download(progress, this.abortController.signal);\n if (!this.viewer.scene) return this;\n\n const textDecoder = new TextDecoder();\n const json = JSON.parse(textDecoder.decode(arrayBuffer));\n\n const scene = parse(json);\n clear();\n\n let handle = 0;\n scene.traverse((object) => {\n object.userData = { handle, ...object.userData };\n handle++;\n });\n\n this.viewer.scene.add(scene);\n this.viewer.models.push(scene);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: scene, file: model });\n\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { FileLoader, Loader, Scene } from \"three\";\nimport { parse, clear } from \"./render.js\";\n\nclass IFCXLoader extends Loader<Scene> {\n override load(\n url: string,\n onLoad: (data: Scene) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (err: unknown) => void\n ) {\n const manager = this.manager;\n\n manager.itemStart(url);\n\n const _onLoad = (scene: Scene) => {\n onLoad(scene);\n manager.itemEnd(url);\n };\n\n const _onError = (e: unknown) => {\n if (onError) onError(e);\n else console.error(e);\n manager.itemError(url);\n manager.itemEnd(url);\n };\n\n const loader = new FileLoader(this.manager);\n\n loader.setPath(this.path);\n loader.setResponseType(\"json\");\n loader.setRequestHeader(this.requestHeader);\n loader.setWithCredentials(this.withCredentials);\n\n loader.load(url, (json) => this.parse(json, _onLoad, _onError), onProgress, onError);\n }\n\n parse(json: any, onLoad: (scene: Scene) => void, onError: (err: unknown) => void) {\n try {\n onLoad(parse(json));\n } catch (e) {\n onError(e);\n } finally {\n clear();\n }\n }\n}\n\nexport { IFCXLoader };\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { GLTFLoadingManager, GLTFLoadParams, Loader, Viewer } from \"@inweb/viewer-three\";\nimport { IFCXLoader } from \"./IFCX/IFCXLoader\";\n\nexport class IFCXFileLoader extends Loader {\n public viewer: Viewer;\n\n constructor(viewer: Viewer) {\n super();\n this.viewer = viewer;\n }\n\n override isSupport(file: any, format?: string): boolean {\n return (\n (typeof file === \"string\" || file instanceof globalThis.File || file instanceof ArrayBuffer) &&\n /(ifcx)$/i.test(format)\n );\n }\n\n override async load(file: any, format?: string, params?: GLTFLoadParams): Promise<this> {\n const manager = new GLTFLoadingManager(file, params);\n\n const loader = new IFCXLoader(manager);\n loader.setPath(manager.path);\n loader.setCrossOrigin(params.crossOrigin || loader.crossOrigin);\n loader.setWithCredentials(params.withCredentials || loader.withCredentials);\n\n const progress = (event: ProgressEvent) => {\n const { lengthComputable, loaded, total } = event;\n const progress = lengthComputable ? loaded / total : 1;\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file });\n };\n\n const scene = await loader.loadAsync(manager.fileURL, progress);\n if (!this.viewer.scene) return this;\n\n let handle = 0;\n scene.traverse((object) => {\n object.userData = { handle, ...object.userData };\n handle++;\n });\n\n this.viewer.scene.add(scene);\n this.viewer.models.push(scene);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: scene, file });\n\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { loaders } from \"@inweb/viewer-three\";\n\nimport { IFCXModelLoader } from \"./IFCXModelLoader\";\nimport { IFCXFileLoader } from \"./IFCXFileLoader\";\n\nloaders.registerLoader(\"ifcx\", (viewer: any) => new IFCXModelLoader(viewer));\nloaders.registerLoader(\"ifcx-file\", (viewer: any) => new IFCXFileLoader(viewer));\n"],"names":["THREE","Box3","BufferAttribute","BufferGeometry","Color","Group","Line","LineBasicMaterial","Matrix4","Mesh","MeshBasicMaterial","PerspectiveCamera","Scene","Vector3","getChildByName","root","childName","skip","fragments","replace","split","i","shift","start","length","children","f","find","name","reverse","GetNode","node","path","parts","child","get","GetTail","GetHead","join","MakeNode","Map","attributes","ConvertToCompositionNode","inputNodes","compositionNode","inherits","forEach","Object","keys","inheritName","ih","attrName","MMSet","map","key","value","has","push","set","FindRootsOrCycles","nodes","dependencies","dependents","paths","perm","temp","visit","Error","deps","dep","roots","Set","indexOf","add","ConvertNodes","input","compositionNodes","CycleError","ExpandFirstRootInInput","ExpandNewNode","values","CreateArtificialRoot","pseudoRoot","ExpandNode","AddDataFromInput","inherit","classNode","subnode","attrID","attr","entries","delete","MMSet2","ToInputNodes","data","ifcxNode","identifier","SchemaValidationError","ValidateAttributeValue","desc","schemas","inheritedSchemaID","inheritedSchema","dataType","found","enumRestrictions","options","filter","option","objectRestrictions","hasOwn","Array","isArray","entry","arrayRestrictions","Validate","schemaID","schema","e","message","LoadIfcxFile","file","checkSchemas","createArtificialRoot","Federate","files","result","header","Prune","Collapse","deleteEmpty","empty","collapsed","TreeNodeToComposedObject","co","childNode","compname","quantityKind","postfix","String","fromCodePoint","compose3","federated","tree","scene","camera","datas","autoCamera","init","window","innerWidth","innerHeight","up","position","lookAt","HasAttr","FindChildWithAttr","undefined","createMaterialFromParent","parent","reference","material","color","transparent","opacity","materialNode","ref","shader","createCurveFromJson","points","Float32Array","flat","geometry","setAttribute","lineMaterial","multiplyScalar","createMeshFromJson","indices","Uint16Array","setIndex","computeVertexNormals","meshMaterial","traverseTree","parentNode","elem","matrixAutoUpdate","matrixNode","matrix","transpose","composeAndRender","dataArray","arr","console","error","boundingBox","setFromObject","isEmpty","avg","min","clone","max","ext","sub","copy","normalize","far","updateProjectionMatrix","parse","m","clear","IFCXModelLoader","Loader","constructor","viewer","super","this","isSupport","type","download","test","load","model","progress","emitEvent","arrayBuffer","abortController","signal","textDecoder","TextDecoder","json","JSON","decode","handle","traverse","object","userData","models","syncOptions","syncOverlay","update","IFCXLoader","url","onLoad","onProgress","onError","manager","itemStart","_onLoad","itemEnd","_onError","itemError","loader","FileLoader","setPath","setResponseType","setRequestHeader","requestHeader","setWithCredentials","withCredentials","IFCXFileLoader","format","globalThis","File","ArrayBuffer","params","GLTFLoadingManager","setCrossOrigin","crossOrigin","event","lengthComputable","loaded","total","loadAsync","fileURL","loaders","registerLoader"],"mappings":";;;;AAiDA,MAAMA,QAAQ;IACZC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;;;AAIF,SAASC,eAAeC,MAAMC,WAAWC,OAAO;IAC9C,IAAIC,YAAYF,UAAUG,QAAQ,gBAAgB,IAAIC,MAAM;IAC5D,KAAK,IAAIC,IAAI,GAAGA,IAAIJ,QAAQI,GAAG;QAC7BH,UAAUI;AACd;IACE,IAAIC,QAAQR;IACZ,OAAOG,UAAUM,UAAUD,SAASA,MAAME,UAAU;QAElD,IAAIC,IAAIR,UAAUI;QAClBC,QAAQA,MAAME,SAASE,MAAMN,KAAMA,EAAEO,KAAKR,MAAM,KAAKS,UAAU,OAAOH;AAC1E;IACE,IAAIR,UAAUM,UAAU,GAAG;QACzB,OAAOD;AACX;AACA;;AAGA,SAASO,QAAQC,MAAMC;IACrB,IAAIA,SAAS,IAAI,OAAOD;IACxB,IAAIE,QAAQD,KAAKZ,MAAM;IACvB,IAAIc,QAAQH,KAAKN,SAASU,IAAIF,MAAM;IACpC,IAAIC,OAAO;QACT,IAAID,MAAMT,WAAW,GAAG;YACtB,OAAOU;AACb;QACI,OAAOJ,QAAQI,OAAOE,QAAQJ;AAClC,WAAS;QACL,OAAO;AACX;AACA;;AACA,SAASK,QAAQL;IACf,OAAOA,KAAKZ,MAAM,KAAK;AACzB;;AACA,SAASgB,QAAQJ;IACf,IAAIC,QAAQD,KAAKZ,MAAM;IACvBa,MAAMX;IACN,OAAOW,MAAMK,KAAK;AACpB;;AACA,SAASC,SAASR;IAChB,OAAO;QACLA;QACAN,UAA0B,IAAIe;QAC9BC,YAA4B,IAAID;;AAEpC;;AACA,SAASE,yBAAyBV,MAAMW;IACtC,IAAIC,kBAAkB;QACpBZ;QACAP,UAAU,CAAE;QACZoB,UAAU,CAAE;QACZJ,YAAY,CAAE;;IAEhBE,WAAWG,SAASf;QAClBgB,OAAOC,KAAKjB,KAAKN,UAAUqB,SAAS9B;YAClC4B,gBAAgBnB,SAAST,aAAae,KAAKN,SAAST;AAAU;QAEhE+B,OAAOC,KAAKjB,KAAKc,UAAUC,SAASG;YAClC,IAAIC,KAAKnB,KAAKc,SAASI;YACvB,IAAIC,OAAO,MAAM;uBACRN,gBAAgBC,SAASI;AACxC,mBAAa;gBACLL,gBAAgBC,SAASI,eAAeC;AAChD;AAAA;QAEIH,OAAOC,KAAKjB,KAAKU,YAAYK,SAASK;YACpCP,gBAAgBH,WAAWU,YAAYpB,KAAKU,WAAWU;AAAS;AAChE;IAEJ,OAAOP;AACT;;AACA,SAASQ,MAAMC,KAAKC,KAAKC;IACvB,IAAIF,IAAIG,IAAIF,MAAM;QAChBD,IAAIlB,IAAImB,MAAMG,KAAKF;AACvB,WAAS;QACLF,IAAIK,IAAIJ,KAAK,EAACC;AAClB;AACA;;AACA,SAASI,kBAAkBC;IACzB,IAAIC,eAA+B,IAAIrB;IACvC,IAAIsB,aAA6B,IAAItB;IACrCoB,MAAMd,SAAQ,CAACf,MAAMC;QACnBe,OAAOC,KAAKjB,KAAKc,UAAUC,SAASG;YAClCG,MAAMS,cAAc7B,MAAMD,KAAKc,SAASI;YACxCG,MAAMU,YAAY/B,KAAKc,SAASI,cAAcjB;AAAK;QAErDe,OAAOC,KAAKjB,KAAKN,UAAUqB,SAAS9B;YAClCoC,MAAMS,cAAc7B,MAAMD,KAAKN,SAAST;YACxCoC,MAAMU,YAAY/B,KAAKN,SAAST,YAAYgB;AAAK;AACjD;IAEJ,IAAI+B,QAAQ,KAAIH,MAAMZ;IACtB,IAAIgB,OAAO,CAAE;IACb,IAAIC,OAAO,CAAE;IACb,SAASC,MAAMlC;QACb,IAAIgC,KAAKhC,OAAO;QAChB,IAAIiC,KAAKjC,OAAO,MAAM,IAAImC,MAAM;QAChCF,KAAKjC,QAAQ;QACb,IAAIoC,OAAOP,aAAa1B,IAAIH;QAC5B,IAAIoC,MAAM;YACRA,KAAKtB,SAASuB,OAAQH,MAAMG;AAClC;QACIL,KAAKhC,QAAQ;AACjB;IACE,IAAIsC,QAAwB,IAAIC;IAChC;QACER,MAAMjB,SAASd;YACb,KAAK8B,WAAWN,IAAIxB,SAASA,KAAKwC,QAAQ,UAAU,GAAG;gBACrDF,MAAMG,IAAIzC;AAClB;YACMkC,MAAMlC;AAAK;AAEjB,MAAI;QACA,OAAO;AACX;IACE,OAAOsC;AACT;;AACA,SAASI,aAAaC;IACpB,IAAIC,mBAAmC,IAAIpC;IAC3C,KAAK,KAAKR,MAAMW,eAAegC,OAAO;QACpCC,iBAAiBlB,IAAI1B,MAAMU,yBAAyBV,MAAMW;AAC9D;IACE,OAAOiC;AACT;;AACA,IAAIC,aAAa,cAAcV;;AAC/B,SAASW,uBAAuBlB;IAC9B,IAAIU,QAAQX,kBAAkBC;IAC9B,KAAKU,OAAO;QACV,MAAM,IAAIO;AACd;IACE,OAAOE,cAAc,KAAIT,MAAMU,WAAU,IAAIpB;AAC/C;;AACA,SAASqB,qBAAqBrB;IAC5B,IAAIU,QAAQX,kBAAkBC;IAC9B,KAAKU,OAAO;QACV,MAAM,IAAIO;AACd;IACE,IAAIK,aAAa;QACfnD,MAAM;QACNU,YAA4B,IAAID;QAChCf,UAA0B,IAAIe;;IAEhC8B,MAAMxB,SAAS/B;QACbmE,WAAWzD,SAASiC,IAAI3C,MAAMgE,cAAchE,MAAM6C;AAAO;IAE3D,OAAOsB;AACT;;AACA,SAASH,cAAchD,MAAM6B;IAC3B,OAAOuB,WAAWpD,MAAMQ,SAASR,OAAO6B;AAC1C;;AACA,SAASuB,WAAWnD,MAAMD,MAAM6B;IAC9B,IAAIe,QAAQf,MAAMzB,IAAIH;IACtB,IAAI2C,OAAO;QACTS,iBAAiBT,OAAO5C,MAAM6B;AAClC;IACE7B,KAAKN,SAASqB,SAAQ,CAACZ,OAAON;QAC5BuD,WAAW,GAAGnD,QAAQJ,QAAQM,OAAO0B;AAAM;IAE7C,OAAO7B;AACT;;AACA,SAASqD,iBAAiBT,OAAO5C,MAAM6B;IACrCb,OAAOiC,OAAOL,MAAM9B,UAAUC,SAASuC;QACrC,IAAIC,YAAYP,cAAc1C,QAAQgD,UAAUzB;QAChD,IAAI2B,UAAUzD,QAAQwD,WAAWlD,QAAQiD;QACzC,KAAKE,SAAS,MAAM,IAAIpB,MAAM,gBAAgBkB;QAC9CE,QAAQ9D,SAASqB,SAAQ,CAACZ,OAAOlB;YAC/Be,KAAKN,SAASiC,IAAI1C,WAAWkB;AAAM;QAErC,KAAK,KAAKsD,QAAQC,SAASF,QAAQ9C,YAAY;YAC7CV,KAAKU,WAAWiB,IAAI8B,QAAQC;AAClC;AAAA;IAEE1C,OAAO2C,QAAQf,MAAMlD,UAAUqB,SAAQ,EAAE9B,WAAWkB;QAClD,IAAIA,UAAU,MAAM;YAClB,IAAIoD,YAAYP,cAAc1C,QAAQH,QAAQ0B;YAC9C,IAAI2B,UAAUzD,QAAQwD,WAAWlD,QAAQF;YACzC,KAAKqD,SAAS,MAAM,IAAIpB,MAAM,gBAAgBjC;YAC9CH,KAAKN,SAASiC,IAAI1C,WAAWuE;AACnC,eAAW;YACLxD,KAAKN,SAASkE,OAAO3E;AAC3B;AAAA;IAEE+B,OAAO2C,QAAQf,MAAMlC,YAAYK,SAAQ,EAAE0C,QAAQC;QACjD1D,KAAKU,WAAWiB,IAAI8B,QAAQC;AAAK;AAErC;;AAGA,SAASG,OAAOvC,KAAKC,KAAKC;IACxB,IAAIF,IAAIG,IAAIF,MAAM;QAChBD,IAAIlB,IAAImB,MAAMG,KAAKF;AACvB,WAAS;QACLF,IAAIK,IAAIJ,KAAK,EAACC;AAClB;AACA;;AACA,SAASsC,aAAaC;IACpB,IAAInD,aAA6B,IAAIH;IACrCsD,KAAKhD,SAASiD;QACZ,IAAIhE,OAAO;YACTC,MAAM+D,SAASC;YACfvE,UAAUsE,SAAStE,WAAWsE,SAAStE,WAAW,CAAE;YACpDoB,UAAUkD,SAASlD,WAAWkD,SAASlD,WAAW,CAAE;YACpDJ,YAAYsD,SAAStD,aAAasD,SAAStD,aAAa,CAAE;;QAE5DmD,OAAOjD,YAAYZ,KAAKC,MAAMD;AAAK;IAErC,OAAOY;AACT;;AACA,IAAIsD,wBAAwB,cAAc9B;;AAC1C,SAAS+B,uBAAuBC,MAAM5C,OAAOvB,MAAMoE;IACjD,IAAID,KAAKtD,UAAU;QACjBsD,KAAKtD,SAASC,SAASuD;YACrB,IAAIC,kBAAkBF,QAAQC;YAC9B,KAAKC,iBAAiB;gBACpB,MAAM,IAAIL,sBAAsB,gCAAgCE,KAAKtD;AAC7E;YACMqD,uBAAuBI,gBAAgB/C,OAAOA,OAAOvB,MAAMoE;AAAQ;AAEzE;IACE,IAAID,KAAKI,aAAa,WAAW;QAC/B,WAAWhD,UAAU,WAAW;YAC9B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;AACA,WAAS,IAAI4C,KAAKI,aAAa,UAAU;QACrC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;AACA,WAAS,IAAI4C,KAAKI,aAAa,YAAY;QACvC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;AACA,WAAS,IAAI4C,KAAKI,aAAa,QAAQ;QACnC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;QACI,IAAIiD,QAAQL,KAAKM,iBAAiBC,QAAQC,QAAQC,UAAWA,WAAWrD,QAAO/B,WAAW;QAC1F,KAAKgF,OAAO;YACV,MAAM,IAAIP,sBAAsB,aAAa1C,wBAAwB4C,KAAKM,iBAAiBC,QAAQpE,KAAK;AAC9G;AACA,WAAS,IAAI6D,KAAKI,aAAa,WAAW;QACtC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;AACA,WAAS,IAAI4C,KAAKI,aAAa,QAAQ;QACnC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;AACA,WAAS,IAAI4C,KAAKI,aAAa,YAAY;QACvC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;AACA,WAAS,IAAI4C,KAAKI,aAAa,UAAU;QACrC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;QACI,IAAI4C,KAAKU,oBAAoB;YAC3B9D,OAAOC,KAAKmD,KAAKU,mBAAmB7B,QAAQlC,SAASQ;gBACnD,KAAKP,OAAO+D,OAAOvD,OAAOD,MAAM;oBAC9B,MAAM,IAAI2C,sBAAsB,aAAa1C,sBAAsBD;AAC7E;gBACQ4C,uBAAuBC,KAAKU,mBAAmB7B,OAAO1B,MAAMC,MAAMD,MAAMtB,OAAO,MAAMsB,KAAK8C;AAAQ;AAE1G;AACA,WAAS,IAAID,KAAKI,aAAa,SAAS;QACpC,KAAKQ,MAAMC,QAAQzD,QAAQ;YACzB,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;QACIA,MAAMT,SAASmE;YACbf,uBAAuBC,KAAKe,kBAAkB3D,OAAO0D,OAAOjF,OAAO,aAAaoE;AAAQ;AAE9F,WAAS;QACL,MAAM,IAAIH,sBAAsB,uBAAuBE,KAAKI;AAChE;AACA;;AACA,SAASY,SAASf,SAASzD;IACzBA,WAAWG,SAASf;QAClBgB,OAAOC,KAAKjB,KAAKU,YAAYK,SAASsE;YACpC,KAAKhB,QAAQgB,WAAW;gBACtB,MAAM,IAAInB,sBAAsB,mBAAmBmB,6BAA6BrF,KAAKC;AAC7F;YACM,IAAIqF,SAASjB,QAAQgB;YACrB,IAAI7D,QAAQxB,KAAKU,WAAW2E;YAC5B;gBACElB,uBAAuBmB,OAAO9D,OAAOA,OAAO,IAAI6C;AACjD,cAAC,OAAOkB;gBACP,IAAIA,aAAarB,uBAAuB;oBACtC,MAAM,IAAIA,sBAAsB,sBAAsBlE,KAAKC,sBAAsBoF,eAAeE,EAAEC;AAC5G,uBAAe;oBACL,MAAMD;AAChB;AACA;AAAA;AACM;AAEN;;AACA,SAASE,aAAaC,MAAMC,eAAe,MAAMC,uBAAuB;IACtE,IAAIhF,aAAakD,aAAa4B,KAAK3B;IACnC,IAAIlB,mBAAmBF,aAAa/B;IACpC;QACE,IAAI+E,cAAc;YAChBP,SAASM,KAAKrB,SAASxB;AAC7B;AACG,MAAC,OAAO0C;QACP,MAAMA;AACV;IACE,IAAIK,sBAAsB;QACxB,OAAO1C,qBAAqBL;AAChC,WAAS;QACL,OAAOE,uBAAuBF;AAClC;AACA;;AACA,SAASgD,SAASC;IAChB,IAAIC,SAAS;QACXC,QAAQF,MAAM,GAAGE;QACjB3B,SAAS,CAAE;QACXN,MAAM;;IAER+B,MAAM/E,SAAS2E;QACb1E,OAAOC,KAAKyE,KAAKrB,SAAStD,SAASsE,YAAcU,OAAO1B,QAAQgB,YAAYK,KAAKrB,QAAQgB;AAAW;IAEtGS,MAAM/E,SAAS2E;QACbA,KAAK3B,KAAKhD,SAASf,QAAS+F,OAAOhC,KAAKrC,KAAK1B;AAAM;IAErD,OAAOiG,MAAMF;AACf;;AACA,SAASG,SAASrE,OAAOsE,cAAc;IACrC,IAAIJ,SAAS;QACX9F,MAAM4B,MAAM,GAAG5B;QACfP,UAAU,CAAE;QACZoB,UAAU,CAAE;QACZJ,YAAY,CAAE;;IAEhBmB,MAAMd,SAASf;QACbgB,OAAOC,KAAKjB,KAAKN,UAAUqB,SAASlB;YAClCkG,OAAOrG,SAASG,QAAQG,KAAKN,SAASG;AAAK;QAE7CmB,OAAOC,KAAKjB,KAAKc,UAAUC,SAASlB;YAClCkG,OAAOjF,SAASjB,QAAQG,KAAKc,SAASjB;AAAK;QAE7CmB,OAAOC,KAAKjB,KAAKU,YAAYK,SAASlB;YACpCkG,OAAOrF,WAAWb,QAAQG,KAAKU,WAAWb;AAAK;AAC/C;IAEJ,IAAIsG,aAAa;QACf,IAAIC,QAAQ;QACZpF,OAAOC,KAAK8E,OAAOrG,UAAUqB,SAASlB;YACpC,IAAIkG,OAAOrG,SAASG,UAAU,MAAMuG,QAAQ;AAAK;QAEnDpF,OAAOC,KAAK8E,OAAOjF,UAAUC,SAASlB;YACpC,IAAIkG,OAAOjF,SAASjB,UAAU,MAAMuG,QAAQ;AAAK;QAEnDpF,OAAOC,KAAK8E,OAAOrF,YAAYK,SAASlB;YACtC,IAAIkG,OAAOrF,WAAWb,UAAU,MAAMuG,QAAQ;AAAK;QAErD,IAAIA,OAAO,OAAO;AACtB;IACE,OAAOL;AACT;;AACA,SAASE,MAAMP,MAAMS,cAAc;IACjC,IAAIJ,SAAS;QACXC,QAAQN,KAAKM;QACb3B,SAASqB,KAAKrB;QACdN,MAAM;;IAER,IAAInD,aAAakD,aAAa4B,KAAK3B;IACnCnD,WAAWG,SAASc;QAClB,IAAIwE,YAAYH,SAASrE,OAAOsE;QAChC,IAAIE,WACFN,OAAOhC,KAAKrC,KAAK;YACfuC,YAAYoC,UAAUpG;YACtBP,UAAU2G,UAAU3G;YACpBoB,UAAUuF,UAAUvF;YACpBJ,YAAY2F,UAAU3F;;AACtB;IAEN,OAAOqF;AACT;;AAGA,SAASO,yBAAyBrG,MAAMD,MAAMqE;IAC5C,IAAIkC,KAAK;QACP1G,MAAMI;QACNS,YAAY,CAAE;QACdhB,UAAU;;IAEZM,KAAKN,SAASqB,SAAQ,CAACyF,WAAWvH;QAChCsH,GAAG7G,UAAUgC,KAAK4E,yBAAyB,GAAGrG,QAAQhB,aAAauH,WAAWnC;AAAS;IAEzFrE,KAAKU,WAAWK,SAAQ,CAAC2C,MAAMtC;QAC7B,IAAIsC,eAAeA,SAAS,aAAasB,MAAMC,QAAQvB,OAAO;YAC5D1C,OAAOC,KAAKyC,MAAM3C,SAAS0F;gBACzBF,GAAG7F,WAAW,GAAGU,aAAaqF,cAAc/C,KAAK+C;AAAS;AAElE,eAAW;YACL,IAAInB,SAASjB,QAAQjD;YACrB,IAAIkE,UAAUA,OAAO9D,MAAMkF,cAAc;gBACvC,IAAIC,UAAU;gBACd,IAAID,eAAepB,OAAO9D,MAAMkF;gBAChC,IAAIA,iBAAiB,UAAU;oBAC7BC,UAAU;AACpB,uBAAe,IAAID,iBAAiB,UAAU;oBACpCC,UAAU,MAAMC,OAAOC,cAAc;AAC/C;gBACQN,GAAG7F,WAAWU,YAAY,GAAGsC,QAAQiD;AAC7C,mBAAa;gBACLJ,GAAG7F,WAAWU,YAAYsC;AAClC;AACA;AAAA;IAEE,IAAI1C,OAAOC,KAAKsF,GAAG7F,YAAYjB,WAAW,UAAU8G,GAAG7F;IACvD,OAAO6F;AACT;;AACA,SAASO,SAAShB;IAChB,IAAIiB,YAAYlB,SAASC;IACzB,IAAIkB,OAAOvB,aAAasB,WAAW,MAAM;IACzC,OAAOT,yBAAyB,IAAIU,MAAMD,UAAU1C;AACtD;;AAKA,IAAI4C;;AACJ,IAAIC;;AACJ,IAAIC,QAAQ;;AACZ,IAAIC,aAAa;;AAEjB,SAASC;IACPJ,QAAQ,IAAIhJ,MAAMY;IAClBqI,SAAS,IAAIjJ,MAAMW,kBAAkB,IAAI0I,OAAOC,aAAaD,OAAOE,aAAa,IAAK;IACtFN,OAAOO,GAAG9F,IAAI,GAAG,GAAG;IACpBuF,OAAOQ,SAAS/F,IAAI,IAAI,IAAI;IAC5BuF,OAAOS,OAAO,GAAG,GAAG;IAWpBV,MAAMvE,IAAIwE;IACV,OAAOD;AACT;;AACA,SAASW,QAAQ5H,MAAMoB;IACrB,KAAKpB,SAASA,KAAKU,YAAY,OAAO;IACtC,SAASV,KAAKU,WAAWU;AAC3B;;AACA,SAASyG,kBAAkB7H,MAAMoB;IAC/B,KAAKpB,SAASA,KAAKN,UAAU,OAAOoI;IACpC,KAAK,IAAIxI,IAAI,GAAGA,IAAIU,KAAKN,SAASD,QAAQH,KAAK;QAC7C,IAAIsI,QAAQ5H,KAAKN,SAASJ,IAAI8B,WAAW;YACvC,OAAOpB,KAAKN,SAASJ;AAC3B;AACA;IACE,OAAOwI;AACT;;AACA,SAASC,yBAAyBC,QAAQhJ;IACxC,IAAIiJ,YAAYD,OAAOtH,WAAW;IAClC,IAAIwH,WAAW;QACbC,OAAO,IAAIlK,MAAMI,MAAM,IAAK,IAAK;QACjC+J,aAAa;QACbC,SAAS;;IAEX,IAAIJ,WAAW;QACb,MAAMK,eAAevJ,eAAeC,MAAMiJ,UAAUM;QACpD,IAAIC,SAASX,kBAAkBS,cAAc;QAC7C,IAAIE,QAAQ;YACV,IAAIL,QAAQK,QAAQ9H,WAAW;YAC/BwH,SAASC,QAAQ,IAAIlK,MAAMI,SAAS8J;YACpC,IAAIK,QAAQ9H,WAAW,oCAAoC;gBACzDwH,SAASE,cAAc;gBACvBF,SAASG,UAAUG,OAAO9H,WAAW;AAC7C;AACA;AACA;IACE,OAAOwH;AACT;;AACA,SAASO,oBAAoBzI,MAAMgI,QAAQhJ;IACzC,IAAI0J,SAAS,IAAIC,aAAa3I,KAAKU,WAAW,qCAAqCkI;IACnF,MAAMC,WAAW,IAAI5K,MAAMG;IAC3ByK,SAASC,aAAa,YAAY,IAAI7K,MAAME,gBAAgBuK,QAAQ;IACpE,MAAMR,WAAWH,yBAAyBC,QAAQhJ;IAClD,IAAI+J,eAAe,IAAI9K,MAAMO,kBAAkB;WAAK0J;;IACpDa,aAAaZ,MAAMa,eAAe;IAClC,OAAO,IAAI/K,MAAMM,KAAKsK,UAAUE;AAClC;;AACA,SAASE,mBAAmBjJ,MAAMgI,QAAQhJ;IACxC,IAAI0J,SAAS,IAAIC,aAAa3I,KAAKU,WAAW,8BAA8BkI;IAC5E,IAAIM,UAAU,IAAIC,YAAYnJ,KAAKU,WAAW;IAC9C,MAAMmI,WAAW,IAAI5K,MAAMG;IAC3ByK,SAASC,aAAa,YAAY,IAAI7K,MAAME,gBAAgBuK,QAAQ;IACpEG,SAASO,SAAS,IAAInL,MAAME,gBAAgB+K,SAAS;IACrDL,SAASQ;IACT,MAAMnB,WAAWH,yBAAyBC,QAAQhJ;IAClD,IAAIsK,eAAe,IAAIrL,MAAMU,kBAAkB;WAAKuJ;;IACpD,OAAO,IAAIjK,MAAMS,KAAKmK,UAAUS;AAClC;;AACA,SAASC,aAAavJ,MAAMgI,QAAQhJ,MAAMwK,aAAa1B;IACrD,IAAI2B,OAAO,IAAIxL,MAAMK;IACrB,IAAIsJ,QAAQ5H,MAAM,yCAAyC;QACzD,IAAIA,KAAKU,WAAW,4CAA4C,aAAa;YAC3E;AACN;AACG,WAAM,IAAIkH,QAAQ5H,MAAM,+BAA+B;QACtDyJ,OAAOR,mBAAmBjJ,MAAMwJ,YAAYxK;AAC7C,WAAM,IAAI4I,QAAQ5H,MAAM,sCAAsC;QAC7DyJ,OAAOhB,oBAAoBzI,MAAMwJ,YAAYxK;AACjD;IACEgJ,OAAOtF,IAAI+G;IACX,IAAIzJ,SAAShB,MAAM;QACjByK,KAAKC,mBAAmB;QACxB,IAAIC,aACF3J,KAAKU,cAAcV,KAAKU,WAAW,6BAC/BV,KAAKU,WAAW,2BAA2BkI,SAC3C;QACN,IAAIe,YAAY;YACd,IAAIC,SAAS,IAAI3L,MAAMQ;YACvBmL,OAAOjI,OAAOgI;YACdC,OAAOC;YACPJ,KAAKG,SAASA;AACpB;AACA;KACG5J,KAAKN,YAAY,IAAIqB,SAASZ,SAAUoJ,aAAapJ,OAAOsJ,QAAQzB,QAAQhJ,MAAMgB;AACrF;;AA0BA,SAAS8J;IACP,IAAI7C,OAAO;QACTA,MAAMvH,WAAW;AACrB;IAEE,IAAIyH,MAAM1H,WAAW,GAAG;QACtB;AACJ;IACE,IAAIuH,OAAO;IACX,IAAI+C,YAAY5C,MAAM7F,KAAK0I,OAAQA,IAAI;IACvChD,OAAOF,SAASiD;IAChB,KAAK/C,MAAM;QACTiD,QAAQC,MAAM;QACd;AACJ;IACEX,aAAavC,MAAMC,SAASI,QAAQL;IACpC,IAAII,YAAY;QACd,MAAM+C,cAAc,IAAIlM,MAAMC;QAC9BiM,YAAYC,cAAcnD;QAC1B,KAAKkD,YAAYE,WAAW;YAC1B,IAAIC,MAAMH,YAAYI,IAAIC,QAAQ9H,IAAIyH,YAAYM,KAAKzB,eAAe;YACtE,IAAI0B,MAAMP,YAAYM,IAAID,QAAQG,IAAIR,YAAYI,KAAK9K;YACvDyH,OAAOQ,SAASkD,KAAKN,IAAIE,QAAQ9H,IAAI,IAAIzE,MAAMa,QAAQ,GAAG,GAAG,GAAG+L,YAAY7B,eAAe0B;YAC3FxD,OAAO4D,MAAMJ,MAAM;YACnBxD,OAAO6D;YAGP3D,aAAa;AACnB;AACA;AAGA;;AA4CO,SAAS4D,MAAMC,GAAGpL;IACvBsH,MAAMzF,KAAK,EAAC7B,MAAMoL;IAClBnB;IACA,OAAO7C;AACT;;AACO,SAASiE;IACdjE,QAAQa;IACRX,MAAM1H,SAAS;IACf2H,aAAa;AACf;;AClqBM,MAAO+D,wBAAwBC;IAGnC,WAAAC,CAAYC;QACVC;QACAC,KAAKF,SAASA;;IAGP,SAAAG,CAAU/F;QACjB,cACSA,SAAS,mBACTA,KAAKgG,SAAS,mBACdhG,KAAKiG,aAAa,cACzB,UAAUC,KAAKlG,KAAKgG;;IAIf,UAAMG,CAAKC;QAClB,MAAMC,WAAYA;YAChBP,KAAKF,OAAOU,UAAU;gBAAEN,MAAM;gBAAoB3H,MAAMgI;gBAAUrG,MAAMoG;;AAAQ;QAGlF,MAAMG,oBAAoBH,MAAMH,SAASI,UAAUP,KAAKU,gBAAgBC;QACxE,KAAKX,KAAKF,OAAOrE,OAAO,OAAOuE;QAE/B,MAAMY,cAAc,IAAIC;QACxB,MAAMC,OAAOC,KAAKvB,MAAMoB,YAAYI,OAAOP;QAE3C,MAAMhF,QAAQ+D,MAAMsB;QACpBpB;QAEA,IAAIuB,SAAS;QACbxF,MAAMyF,UAAUC;YACdA,OAAOC,WAAW;gBAAEH;mBAAWE,OAAOC;;YACtCH;AAAQ;QAGVjB,KAAKF,OAAOrE,MAAMvE,IAAIuE;QACtBuE,KAAKF,OAAOuB,OAAOnL,KAAKuF;QAExBuE,KAAKF,OAAOwB;QACZtB,KAAKF,OAAOyB;QACZvB,KAAKF,OAAO0B;QAEZxB,KAAKF,OAAOU,UAAU;YAAEN,MAAM;YAAiB3H,MAAMkD;YAAOvB,MAAMoG;;QAElE,OAAON;;;;AC9CX,MAAMyB,mBAAmB7B;IACd,IAAAS,CACPqB,KACAC,QACAC,YACAC;QAEA,MAAMC,UAAU9B,KAAK8B;QAErBA,QAAQC,UAAUL;QAElB,MAAMM,UAAWvG;YACfkG,OAAOlG;YACPqG,QAAQG,QAAQP;AAAI;QAGtB,MAAMQ,WAAYnI;YAChB,IAAI8H,SAASA,QAAQ9H,SAChB0E,QAAQC,MAAM3E;YACnB+H,QAAQK,UAAUT;YAClBI,QAAQG,QAAQP;AAAI;QAGtB,MAAMU,SAAS,IAAIC,WAAWrC,KAAK8B;QAEnCM,OAAOE,QAAQtC,KAAKvL;QACpB2N,OAAOG,gBAAgB;QACvBH,OAAOI,iBAAiBxC,KAAKyC;QAC7BL,OAAOM,mBAAmB1C,KAAK2C;QAE/BP,OAAO/B,KAAKqB,MAAMZ,QAASd,KAAKR,MAAMsB,MAAMkB,SAASE,YAAWN,YAAYC;;IAG9E,KAAArC,CAAMsB,MAAWa,QAAgCE;QAC/C;YACEF,OAAOnC,MAAMsB;UACb,OAAO/G;YACP8H,QAAQ9H;UACA;YACR2F;;;;;ACvCA,MAAOkD,uBAAuBhD;IAGlC,WAAAC,CAAYC;QACVC;QACAC,KAAKF,SAASA;;IAGP,SAAAG,CAAU/F,MAAW2I;QAC5B,eACU3I,SAAS,YAAYA,gBAAgB4I,WAAWC,QAAQ7I,gBAAgB8I,gBAChF,WAAW5C,KAAKyC;;IAIX,UAAMxC,CAAKnG,MAAW2I,QAAiBI;QAC9C,MAAMnB,UAAU,IAAIoB,mBAAmBhJ,MAAM+I;QAE7C,MAAMb,SAAS,IAAIX,WAAWK;QAC9BM,OAAOE,QAAQR,QAAQrN;QACvB2N,OAAOe,eAAeF,OAAOG,eAAehB,OAAOgB;QACnDhB,OAAOM,mBAAmBO,OAAON,mBAAmBP,OAAOO;QAE3D,MAAMpC,WAAY8C;YAChB,OAAMC,kBAAEA,kBAAgBC,QAAEA,QAAMC,OAAEA,SAAUH;YAC5C,MAAM9C,WAAW+C,mBAAmBC,SAASC,QAAQ;YACrDxD,KAAKF,OAAOU,UAAU;gBAAEN,MAAM;gBAAoB3H,MAAMgI;gBAAUrG;;AAAO;QAG3E,MAAMuB,cAAc2G,OAAOqB,UAAU3B,QAAQ4B,SAASnD;QACtD,KAAKP,KAAKF,OAAOrE,OAAO,OAAOuE;QAE/B,IAAIiB,SAAS;QACbxF,MAAMyF,UAAUC;YACdA,OAAOC,WAAW;gBAAEH;mBAAWE,OAAOC;;YACtCH;AAAQ;QAGVjB,KAAKF,OAAOrE,MAAMvE,IAAIuE;QACtBuE,KAAKF,OAAOuB,OAAOnL,KAAKuF;QAExBuE,KAAKF,OAAOwB;QACZtB,KAAKF,OAAOyB;QACZvB,KAAKF,OAAO0B;QAEZxB,KAAKF,OAAOU,UAAU;YAAEN,MAAM;YAAiB3H,MAAMkD;YAAOvB;;QAE5D,OAAO8F;;;;AC7CX2D,QAAQC,eAAe,SAAS9D,UAAgB,IAAIH,gBAAgBG;;AACpE6D,QAAQC,eAAe,cAAc9D,UAAgB,IAAI8C,eAAe9C"}
|
|
1
|
+
{"version":3,"file":"IFCXLoader.module.js","sources":["../../../plugins/loaders/IFCX/render.js","../../../plugins/loaders/IFCXModelLoader.ts","../../../plugins/loaders/IFCX/IFCXLoader.ts","../../../plugins/loaders/IFCXFileLoader.ts","../../../plugins/loaders/IFCXLoader.ts"],"sourcesContent":["///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\n// Repository: https://github.com/buildingSMART/IFC5-development\n// Original File: docs/viewer/render.mjs\n// Commit SHA-1: 83a7ae862232c90065d1bd03fcd538315e7d2563\n// Commit Date: 20.05.2025 21:00:52\n\n// (C) buildingSMART International\n// published under MIT license\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable prefer-const */\n/* eslint-disable no-useless-catch */\n\nimport {\n Box3,\n BufferAttribute,\n BufferGeometry,\n Color,\n Group,\n Line,\n LineBasicMaterial,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n PerspectiveCamera,\n Scene,\n Vector3,\n} from \"three\";\n\nconst THREE = {\n Box3,\n BufferAttribute,\n BufferGeometry,\n Color,\n Group,\n Line,\n LineBasicMaterial,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n PerspectiveCamera,\n Scene,\n Vector3,\n};\n\n// composed-object.ts\nfunction getChildByName(root, childName, skip = 0) {\n let fragments = childName.replace(/^<\\/|^\\/|>$/g, \"\").split(\"/\");\n for (let i = 0; i < skip; ++i) {\n fragments.shift();\n }\n let start = root;\n while (fragments.length && start && start.children) {\n // console.log(start, fragments[0]);\n let f = fragments.shift();\n start = start.children.find((i) => i.name.split(\"/\").reverse()[0] === f);\n }\n if (fragments.length == 0) {\n return start;\n }\n}\n\n// compose-alpha.ts\nfunction GetNode(node, path) {\n if (path === \"\") return node;\n let parts = path.split(\"/\");\n let child = node.children.get(parts[0]);\n if (child) {\n if (parts.length === 1) {\n return child;\n }\n return GetNode(child, GetTail(path));\n } else {\n return null;\n }\n}\nfunction GetHead(path) {\n return path.split(\"/\")[0];\n}\nfunction GetTail(path) {\n let parts = path.split(\"/\");\n parts.shift();\n return parts.join(\"/\");\n}\nfunction MakeNode(node) {\n return {\n node,\n children: /* @__PURE__ */ new Map(),\n attributes: /* @__PURE__ */ new Map(),\n };\n}\nfunction ConvertToCompositionNode(path, inputNodes) {\n let compositionNode = {\n path,\n children: {},\n inherits: {},\n attributes: {},\n };\n inputNodes.forEach((node) => {\n Object.keys(node.children).forEach((childName) => {\n compositionNode.children[childName] = node.children[childName];\n });\n Object.keys(node.inherits).forEach((inheritName) => {\n let ih = node.inherits[inheritName];\n if (ih === null) {\n delete compositionNode.inherits[inheritName];\n } else {\n compositionNode.inherits[inheritName] = ih;\n }\n });\n Object.keys(node.attributes).forEach((attrName) => {\n compositionNode.attributes[attrName] = node.attributes[attrName];\n });\n });\n return compositionNode;\n}\nfunction MMSet(map, key, value) {\n if (map.has(key)) {\n map.get(key)?.push(value);\n } else {\n map.set(key, [value]);\n }\n}\nfunction FindRootsOrCycles(nodes) {\n let dependencies = /* @__PURE__ */ new Map();\n let dependents = /* @__PURE__ */ new Map();\n nodes.forEach((node, path) => {\n Object.keys(node.inherits).forEach((inheritName) => {\n MMSet(dependencies, path, node.inherits[inheritName]);\n MMSet(dependents, node.inherits[inheritName], path);\n });\n Object.keys(node.children).forEach((childName) => {\n MMSet(dependencies, path, node.children[childName]);\n MMSet(dependents, node.children[childName], path);\n });\n });\n let paths = [...nodes.keys()];\n let perm = {};\n let temp = {};\n function visit(path) {\n if (perm[path]) return;\n if (temp[path]) throw new Error(`CYCLE!`);\n temp[path] = true;\n let deps = dependencies.get(path);\n if (deps) {\n deps.forEach((dep) => visit(dep));\n }\n perm[path] = true;\n }\n let roots = /* @__PURE__ */ new Set();\n try {\n paths.forEach((path) => {\n if (!dependents.has(path) && path.indexOf(\"/\") === -1) {\n roots.add(path);\n }\n visit(path);\n });\n } catch (e) {\n return null;\n }\n return roots;\n}\nfunction ConvertNodes(input) {\n let compositionNodes = /* @__PURE__ */ new Map();\n for (let [path, inputNodes] of input) {\n compositionNodes.set(path, ConvertToCompositionNode(path, inputNodes));\n }\n return compositionNodes;\n}\nvar CycleError = class extends Error {};\nfunction ExpandFirstRootInInput(nodes) {\n let roots = FindRootsOrCycles(nodes);\n if (!roots) {\n throw new CycleError();\n }\n return ExpandNewNode([...roots.values()][0], nodes);\n}\nfunction CreateArtificialRoot(nodes) {\n let roots = FindRootsOrCycles(nodes);\n if (!roots) {\n throw new CycleError();\n }\n let pseudoRoot = {\n node: \"\",\n attributes: /* @__PURE__ */ new Map(),\n children: /* @__PURE__ */ new Map(),\n };\n roots.forEach((root) => {\n pseudoRoot.children.set(root, ExpandNewNode(root, nodes));\n });\n return pseudoRoot;\n}\nfunction ExpandNewNode(node, nodes) {\n return ExpandNode(node, MakeNode(node), nodes);\n}\nfunction ExpandNode(path, node, nodes) {\n let input = nodes.get(path);\n if (input) {\n AddDataFromInput(input, node, nodes);\n }\n node.children.forEach((child, name) => {\n ExpandNode(`${path}/${name}`, child, nodes);\n });\n return node;\n}\nfunction AddDataFromInput(input, node, nodes) {\n Object.values(input.inherits).forEach((inherit) => {\n let classNode = ExpandNewNode(GetHead(inherit), nodes);\n let subnode = GetNode(classNode, GetTail(inherit));\n if (!subnode) throw new Error(`Unknown node ${inherit}`);\n subnode.children.forEach((child, childName) => {\n node.children.set(childName, child);\n });\n for (let [attrID, attr] of subnode.attributes) {\n node.attributes.set(attrID, attr);\n }\n });\n Object.entries(input.children).forEach(([childName, child]) => {\n if (child !== null) {\n let classNode = ExpandNewNode(GetHead(child), nodes);\n let subnode = GetNode(classNode, GetTail(child));\n if (!subnode) throw new Error(`Unknown node ${child}`);\n node.children.set(childName, subnode);\n } else {\n node.children.delete(childName);\n }\n });\n Object.entries(input.attributes).forEach(([attrID, attr]) => {\n node.attributes.set(attrID, attr);\n });\n}\n\n// workflow-alpha.ts\nfunction MMSet2(map, key, value) {\n if (map.has(key)) {\n map.get(key)?.push(value);\n } else {\n map.set(key, [value]);\n }\n}\nfunction ToInputNodes(data) {\n let inputNodes = /* @__PURE__ */ new Map();\n data.forEach((ifcxNode) => {\n let node = {\n path: ifcxNode.path,\n children: ifcxNode.children ? ifcxNode.children : {},\n inherits: ifcxNode.inherits ? ifcxNode.inherits : {},\n attributes: ifcxNode.attributes ? ifcxNode.attributes : {},\n };\n MMSet2(inputNodes, node.path, node);\n });\n return inputNodes;\n}\nvar SchemaValidationError = class extends Error {};\nfunction ValidateAttributeValue(desc, value, path, schemas) {\n if (desc.inherits) {\n desc.inherits.forEach((inheritedSchemaID) => {\n let inheritedSchema = schemas[inheritedSchemaID];\n if (!inheritedSchema) {\n throw new SchemaValidationError(`Unknown inherited schema id \"${desc.inherits}\"`);\n }\n ValidateAttributeValue(inheritedSchema.value, value, path, schemas);\n });\n }\n if (desc.dataType === \"Boolean\") {\n if (typeof value !== \"boolean\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type boolean`);\n }\n } else if (desc.dataType === \"String\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type string`);\n }\n } else if (desc.dataType === \"DateTime\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type date`);\n }\n } else if (desc.dataType === \"Enum\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type string`);\n }\n let found = desc.enumRestrictions.options.filter((option) => option === value).length === 1;\n if (!found) {\n throw new SchemaValidationError(`Expected \"${value}\" to be one of [${desc.enumRestrictions.options.join(\",\")}]`);\n }\n } else if (desc.dataType === \"Integer\") {\n if (typeof value !== \"number\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type int`);\n }\n } else if (desc.dataType === \"Real\") {\n if (typeof value !== \"number\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type real`);\n }\n } else if (desc.dataType === \"Relation\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type string`);\n }\n } else if (desc.dataType === \"Object\") {\n if (typeof value !== \"object\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type object`);\n }\n if (desc.objectRestrictions) {\n Object.keys(desc.objectRestrictions.values).forEach((key) => {\n if (!Object.hasOwn(value, key)) {\n throw new SchemaValidationError(`Expected \"${value}\" to have key ${key}`);\n }\n ValidateAttributeValue(desc.objectRestrictions.values[key], value[key], path + \".\" + key, schemas);\n });\n }\n } else if (desc.dataType === \"Array\") {\n if (!Array.isArray(value)) {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type array`);\n }\n value.forEach((entry) => {\n ValidateAttributeValue(desc.arrayRestrictions.value, entry, path + \".<array>.\", schemas);\n });\n } else {\n throw new SchemaValidationError(`Unexpected datatype ${desc.dataType}`);\n }\n}\nfunction Validate(schemas, inputNodes) {\n inputNodes.forEach((node) => {\n Object.keys(node.attributes).forEach((schemaID) => {\n if (!schemas[schemaID]) {\n throw new SchemaValidationError(`Missing schema \"${schemaID}\" referenced by [\"${node.path}\"].attributes`);\n }\n let schema = schemas[schemaID];\n let value = node.attributes[schemaID];\n try {\n ValidateAttributeValue(schema.value, value, \"\", schemas);\n } catch (e) {\n if (e instanceof SchemaValidationError) {\n throw new SchemaValidationError(`Error validating [\"${node.path}\"].attributes[\"${schemaID}\"]: ${e.message}`);\n } else {\n throw e;\n }\n }\n });\n });\n}\nfunction LoadIfcxFile(file, checkSchemas = true, createArtificialRoot = false) {\n let inputNodes = ToInputNodes(file.data);\n let compositionNodes = ConvertNodes(inputNodes);\n try {\n if (checkSchemas) {\n Validate(file.schemas, compositionNodes);\n }\n } catch (e) {\n throw e;\n }\n if (createArtificialRoot) {\n return CreateArtificialRoot(compositionNodes);\n } else {\n return ExpandFirstRootInInput(compositionNodes);\n }\n}\nfunction Federate(files) {\n let result = {\n header: files[0].header,\n schemas: {},\n data: [],\n };\n files.forEach((file) => {\n Object.keys(file.schemas).forEach((schemaID) => (result.schemas[schemaID] = file.schemas[schemaID]));\n });\n files.forEach((file) => {\n file.data.forEach((node) => result.data.push(node));\n });\n return Prune(result);\n}\nfunction Collapse(nodes, deleteEmpty = false) {\n let result = {\n path: nodes[0].path,\n children: {},\n inherits: {},\n attributes: {},\n };\n nodes.forEach((node) => {\n Object.keys(node.children).forEach((name) => {\n result.children[name] = node.children[name];\n });\n Object.keys(node.inherits).forEach((name) => {\n result.inherits[name] = node.inherits[name];\n });\n Object.keys(node.attributes).forEach((name) => {\n result.attributes[name] = node.attributes[name];\n });\n });\n if (deleteEmpty) {\n let empty = true;\n Object.keys(result.children).forEach((name) => {\n if (result.children[name] !== null) empty = false;\n });\n Object.keys(result.inherits).forEach((name) => {\n if (result.inherits[name] !== null) empty = false;\n });\n Object.keys(result.attributes).forEach((name) => {\n if (result.attributes[name] !== null) empty = false;\n });\n if (empty) return null;\n }\n return result;\n}\nfunction Prune(file, deleteEmpty = false) {\n let result = {\n header: file.header,\n schemas: file.schemas,\n data: [],\n };\n let inputNodes = ToInputNodes(file.data);\n inputNodes.forEach((nodes) => {\n let collapsed = Collapse(nodes, deleteEmpty);\n if (collapsed)\n result.data.push({\n path: collapsed.path,\n children: collapsed.children,\n inherits: collapsed.inherits,\n attributes: collapsed.attributes,\n });\n });\n return result;\n}\n\n// compose-flattened.ts\nfunction TreeNodeToComposedObject(path, node, schemas) {\n let co = {\n name: path,\n attributes: {},\n children: [],\n };\n node.children.forEach((childNode, childName) => {\n co.children?.push(TreeNodeToComposedObject(`${path}/${childName}`, childNode, schemas));\n });\n node.attributes.forEach((attr, attrName) => {\n if (attr && typeof attr === \"object\" && !Array.isArray(attr)) {\n Object.keys(attr).forEach((compname) => {\n co.attributes[`${attrName}::${compname}`] = attr[compname];\n });\n } else {\n let schema = schemas[attrName];\n if (schema && schema.value.quantityKind) {\n let postfix = \"\";\n let quantityKind = schema.value.quantityKind;\n if (quantityKind === \"Length\") {\n postfix = \"m\";\n } else if (quantityKind === \"Volume\") {\n postfix = \"m\" + String.fromCodePoint(179);\n }\n co.attributes[attrName] = `${attr} ${postfix}`;\n } else {\n co.attributes[attrName] = attr;\n }\n }\n });\n if (Object.keys(co.attributes).length === 0) delete co.attributes;\n return co;\n}\nfunction compose3(files) {\n let federated = Federate(files);\n let tree = LoadIfcxFile(federated, true, true);\n return TreeNodeToComposedObject(\"\", tree, federated.schemas);\n}\n\n// render.ts\n// var controls;\n// var renderer;\nvar scene;\nvar camera;\nvar datas = [];\nvar autoCamera = true;\n// var THREE = window[\"THREE\"];\nfunction init() {\n scene = new THREE.Scene();\n camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 100);\n camera.up.set(0, 0, 1);\n camera.position.set(50, 50, 50);\n camera.lookAt(0, 0, 0);\n // const nd = document.querySelector(\".viewport\");\n // renderer = new THREE.WebGLRenderer({\n // alpha: true,\n // logarithmicDepthBuffer: true,\n // });\n // renderer.setSize(nd.offsetWidth, nd.offsetHeight);\n // controls = new THREE.OrbitControls(camera, renderer.domElement);\n // controls.enableDamping = true;\n // controls.dampingFactor = 0.25;\n // nd.appendChild(renderer.domElement);\n scene.add(camera);\n return scene;\n}\nfunction HasAttr(node, attrName) {\n if (!node || !node.attributes) return false;\n return !!node.attributes[attrName];\n}\nfunction FindChildWithAttr(node, attrName) {\n if (!node || !node.children) return void 0;\n for (let i = 0; i < node.children.length; i++) {\n if (HasAttr(node.children[i], attrName)) {\n return node.children[i];\n }\n }\n return void 0;\n}\nfunction createMaterialFromParent(parent, root) {\n let reference = parent.attributes[\"usd::usdshade::materialbindingapi::material::binding\"];\n let material = {\n color: new THREE.Color(0.6, 0.6, 0.6),\n transparent: false,\n opacity: 1,\n };\n if (reference) {\n const materialNode = getChildByName(root, reference.ref);\n if (materialNode) {\n let color = materialNode?.attributes[\"bsi::presentation::diffuseColor\"];\n material.color = new THREE.Color(...color);\n if (materialNode?.attributes[\"bsi::presentation::opacity\"]) {\n material.transparent = true;\n material.opacity = materialNode.attributes[\"bsi::presentation::opacity\"];\n }\n }\n }\n return material;\n}\nfunction createCurveFromJson(node, parent, root) {\n let points = new Float32Array(node.attributes[\"usd::usdgeom::basiscurves::points\"].flat());\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(points, 3));\n const material = createMaterialFromParent(parent, root);\n let lineMaterial = new THREE.LineBasicMaterial({ ...material });\n lineMaterial.color.multiplyScalar(0.8);\n return new THREE.Line(geometry, lineMaterial);\n}\nfunction createMeshFromJson(node, parent, root) {\n let points = new Float32Array(node.attributes[\"usd::usdgeom::mesh::points\"].flat());\n let indices = new Uint16Array(node.attributes[\"usd::usdgeom::mesh::faceVertexIndices\"]);\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(points, 3));\n geometry.setIndex(new THREE.BufferAttribute(indices, 1));\n geometry.computeVertexNormals();\n const material = createMaterialFromParent(parent, root);\n let meshMaterial = new THREE.MeshBasicMaterial({ ...material });\n return new THREE.Mesh(geometry, meshMaterial);\n}\nfunction traverseTree(node, parent, root, parentNode = void 0) {\n let elem = new THREE.Group();\n if (HasAttr(node, \"usd::usdgeom::visibility::visibility\")) {\n if (node.attributes[\"usd::usdgeom::visibility::visibility\"] === \"invisible\") {\n return;\n }\n } else if (HasAttr(node, \"usd::usdgeom::mesh::points\")) {\n elem = createMeshFromJson(node, parentNode, root);\n } else if (HasAttr(node, \"usd::usdgeom::basiscurves::points\")) {\n elem = createCurveFromJson(node, parentNode, root);\n }\n parent.add(elem);\n if (node !== root) {\n elem.matrixAutoUpdate = false;\n let matrixNode =\n node.attributes && node.attributes[\"usd::xformop::transform\"]\n ? node.attributes[\"usd::xformop::transform\"].flat()\n : null;\n if (matrixNode) {\n let matrix = new THREE.Matrix4();\n matrix.set(...matrixNode);\n matrix.transpose();\n elem.matrix = matrix;\n }\n }\n (node.children || []).forEach((child) => traverseTree(child, elem || parent, root, node));\n}\n// function encodeHtmlEntities(str) {\n// const div = document.createElement(\"div\");\n// div.textContent = str;\n// return div.innerHTML;\n// }\n// var icons = {\n// \"usd::usdgeom::mesh::points\": \"deployed_code\",\n// \"usd::usdgeom::basiscurves::points\": \"line_curve\",\n// \"usd::usdshade::material::outputs::surface.connect\": \"line_style\",\n// };\n// function buildDomTree(prim, node) {\n// const elem = document.createElement(\"div\");\n// let span;\n// elem.appendChild(document.createTextNode(prim.name ? prim.name.split(\"/\").reverse()[0] : \"root\"));\n// elem.appendChild((span = document.createElement(\"span\")));\n// Object.entries(icons).forEach(([k, v]) => (span.innerText += (prim.attributes || {})[k] ? v : \" \"));\n// span.className = \"material-symbols-outlined\";\n// elem.onclick = (evt) => {\n// let rows = [[\"name\", prim.name]]\n// .concat(Object.entries(prim.attributes))\n// .map(\n// ([k, v]) =>\n// `<tr><td>${encodeHtmlEntities(k)}</td><td>${encodeHtmlEntities(typeof v === \"object\" ? JSON.stringify(v) : v)}</td>`\n// )\n// .join(\"\");\n// document.querySelector(\".attributes .table\").innerHTML = `<table border=\"0\">${rows}</table>`;\n// evt.stopPropagation();\n// };\n// node.appendChild(elem);\n// (prim.children || []).forEach((p) => buildDomTree(p, elem));\n// }\nfunction composeAndRender() {\n if (scene) {\n scene.children = [];\n }\n // document.querySelector(\".tree\").innerHTML = \"\";\n if (datas.length === 0) {\n return;\n }\n let tree = null;\n let dataArray = datas.map((arr) => arr[1]);\n tree = compose3(dataArray);\n if (!tree) {\n console.error(\"No result from composition\");\n return;\n }\n traverseTree(tree, scene || init(), tree);\n if (autoCamera) {\n const boundingBox = new THREE.Box3();\n boundingBox.setFromObject(scene);\n if (!boundingBox.isEmpty()) {\n let avg = boundingBox.min.clone().add(boundingBox.max).multiplyScalar(0.5);\n let ext = boundingBox.max.clone().sub(boundingBox.min).length();\n camera.position.copy(avg.clone().add(new THREE.Vector3(1, 1, 1).normalize().multiplyScalar(ext)));\n camera.far = ext * 3;\n camera.updateProjectionMatrix();\n // controls.target.copy(avg);\n // controls.update();\n autoCamera = false;\n }\n }\n // buildDomTree(tree, document.querySelector(\".tree\"));\n // animate();\n}\n// function createLayerDom() {\n// document.querySelector(\".layers div\").innerHTML = \"\";\n// datas.forEach(([name, _], index) => {\n// const elem = document.createElement(\"div\");\n// elem.appendChild(document.createTextNode(name));\n// [\"\\u25B3\", \"\\u25BD\", \"\\xD7\"].reverse().forEach((lbl, cmd) => {\n// const btn = document.createElement(\"span\");\n// btn.onclick = (evt) => {\n// evt.stopPropagation();\n// if (cmd === 2) {\n// if (index > 0) {\n// [datas[index], datas[index - 1]] = [datas[index - 1], datas[index]];\n// }\n// } else if (cmd === 1) {\n// if (index < datas.length - 1) {\n// [datas[index], datas[index + 1]] = [datas[index + 1], datas[index]];\n// }\n// } else if (cmd === 0) {\n// datas.splice(index, 1);\n// }\n// composeAndRender();\n// createLayerDom();\n// };\n// btn.appendChild(document.createTextNode(lbl));\n// elem.appendChild(btn);\n// });\n// document.querySelector(\".layers div\").appendChild(elem);\n// });\n// }\n// function addModel(name, m) {\n// datas.push([name, m]);\n// createLayerDom();\n// composeAndRender();\n// }\n// function animate() {\n// requestAnimationFrame(animate);\n// controls.update();\n// renderer.render(scene, camera);\n// }\n// export { composeAndRender, addModel as default };\n\nexport function parse(m, name) {\n datas.push([name, m]);\n composeAndRender();\n return scene;\n}\nexport function clear() {\n scene = undefined;\n datas.length = 0;\n autoCamera = true;\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Loader, Viewer } from \"@inweb/viewer-three\";\nimport { parse, clear } from \"./IFCX/render.js\";\n\nexport class IFCXModelLoader extends Loader {\n public viewer: Viewer;\n\n constructor(viewer: Viewer) {\n super();\n this.viewer = viewer;\n }\n\n override isSupport(file: any): boolean {\n return (\n typeof file === \"object\" &&\n typeof file.type === \"string\" &&\n typeof file.download === \"function\" &&\n /.ifcx$/i.test(file.type)\n );\n }\n\n override async load(model: any): Promise<this> {\n const progress = (progress: number) => {\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file: model });\n };\n\n const arrayBuffer = await model.download(progress, this.abortController.signal);\n if (!this.viewer.scene) return this;\n\n const textDecoder = new TextDecoder();\n const json = JSON.parse(textDecoder.decode(arrayBuffer));\n\n const scene = parse(json);\n clear();\n\n let handle = 0;\n scene.traverse((object) => {\n object.userData = { handle, ...object.userData };\n handle++;\n });\n\n this.viewer.scene.add(scene);\n this.viewer.models.push(scene);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: scene, file: model });\n\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { FileLoader, Loader, Scene } from \"three\";\nimport { parse, clear } from \"./render.js\";\n\nclass IFCXLoader extends Loader<Scene> {\n override load(\n url: string,\n onLoad: (data: Scene) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (err: unknown) => void\n ) {\n const manager = this.manager;\n\n manager.itemStart(url);\n\n const _onLoad = (scene: Scene) => {\n onLoad(scene);\n manager.itemEnd(url);\n };\n\n const _onError = (e: unknown) => {\n if (onError) onError(e);\n else console.error(e);\n manager.itemError(url);\n manager.itemEnd(url);\n };\n\n const loader = new FileLoader(this.manager);\n\n loader.setPath(this.path);\n loader.setResponseType(\"json\");\n loader.setRequestHeader(this.requestHeader);\n loader.setWithCredentials(this.withCredentials);\n\n loader.load(url, (json) => this.parse(json, _onLoad, _onError), onProgress, onError);\n }\n\n parse(json: any, onLoad: (scene: Scene) => void, onError: (err: unknown) => void) {\n try {\n onLoad(parse(json));\n } catch (e) {\n onError(e);\n } finally {\n clear();\n }\n }\n}\n\nexport { IFCXLoader };\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { GLTFLoadingManager, GLTFLoadParams, Loader, Viewer } from \"@inweb/viewer-three\";\nimport { IFCXLoader } from \"./IFCX/IFCXLoader\";\n\nexport class IFCXFileLoader extends Loader {\n public viewer: Viewer;\n\n constructor(viewer: Viewer) {\n super();\n this.viewer = viewer;\n }\n\n override isSupport(file: any, format?: string): boolean {\n return (\n (typeof file === \"string\" || file instanceof globalThis.File || file instanceof ArrayBuffer) &&\n /(ifcx)$/i.test(format)\n );\n }\n\n override async load(file: any, format?: string, params?: GLTFLoadParams): Promise<this> {\n const manager = new GLTFLoadingManager(file, params);\n\n const loader = new IFCXLoader(manager);\n loader.setPath(manager.path);\n loader.setCrossOrigin(params.crossOrigin || loader.crossOrigin);\n loader.setWithCredentials(params.withCredentials || loader.withCredentials);\n\n const progress = (event: ProgressEvent) => {\n const { lengthComputable, loaded, total } = event;\n const progress = lengthComputable ? loaded / total : 1;\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file });\n };\n\n const scene = await loader.loadAsync(manager.fileURL, progress);\n if (!this.viewer.scene) return this;\n\n let handle = 0;\n scene.traverse((object) => {\n object.userData = { handle, ...object.userData };\n handle++;\n });\n\n this.viewer.scene.add(scene);\n this.viewer.models.push(scene);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: scene, file });\n\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { loaders } from \"@inweb/viewer-three\";\n\nimport { IFCXModelLoader } from \"./IFCXModelLoader\";\nimport { IFCXFileLoader } from \"./IFCXFileLoader\";\n\nloaders.registerLoader(\"ifcx\", (viewer: any) => new IFCXModelLoader(viewer));\nloaders.registerLoader(\"ifcx-file\", (viewer: any) => new IFCXFileLoader(viewer));\n"],"names":["THREE","Box3","BufferAttribute","BufferGeometry","Color","Group","Line","LineBasicMaterial","Matrix4","Mesh","MeshBasicMaterial","PerspectiveCamera","Scene","Vector3","getChildByName","root","childName","skip","fragments","replace","split","i","shift","start","length","children","f","find","name","reverse","GetNode","node","path","parts","child","get","GetTail","GetHead","join","MakeNode","Map","attributes","ConvertToCompositionNode","inputNodes","compositionNode","inherits","forEach","Object","keys","inheritName","ih","attrName","MMSet","map","key","value","has","push","set","FindRootsOrCycles","nodes","dependencies","dependents","paths","perm","temp","visit","Error","deps","dep","roots","Set","indexOf","add","e","ConvertNodes","input","compositionNodes","CycleError","ExpandFirstRootInInput","ExpandNewNode","values","CreateArtificialRoot","pseudoRoot","ExpandNode","AddDataFromInput","inherit","classNode","subnode","attrID","attr","entries","delete","MMSet2","ToInputNodes","data","ifcxNode","SchemaValidationError","ValidateAttributeValue","desc","schemas","inheritedSchemaID","inheritedSchema","dataType","found","enumRestrictions","options","filter","option","objectRestrictions","hasOwn","Array","isArray","entry","arrayRestrictions","Validate","schemaID","schema","message","LoadIfcxFile","file","checkSchemas","createArtificialRoot","Federate","files","result","header","Prune","Collapse","deleteEmpty","empty","collapsed","TreeNodeToComposedObject","co","childNode","compname","quantityKind","postfix","String","fromCodePoint","compose3","federated","tree","scene","camera","datas","autoCamera","init","window","innerWidth","innerHeight","up","position","lookAt","HasAttr","createMaterialFromParent","parent","reference","material","color","transparent","opacity","materialNode","ref","createCurveFromJson","points","Float32Array","flat","geometry","setAttribute","lineMaterial","multiplyScalar","createMeshFromJson","indices","Uint16Array","setIndex","computeVertexNormals","meshMaterial","traverseTree","parentNode","undefined","elem","matrixAutoUpdate","matrixNode","matrix","transpose","composeAndRender","dataArray","arr","console","error","boundingBox","setFromObject","isEmpty","avg","min","clone","max","ext","sub","copy","normalize","far","updateProjectionMatrix","parse","m","clear","IFCXModelLoader","Loader","constructor","viewer","super","this","isSupport","type","download","test","load","model","progress","emitEvent","arrayBuffer","abortController","signal","textDecoder","TextDecoder","json","JSON","decode","handle","traverse","object","userData","models","syncOptions","syncOverlay","update","IFCXLoader","url","onLoad","onProgress","onError","manager","itemStart","_onLoad","itemEnd","_onError","itemError","loader","FileLoader","setPath","setResponseType","setRequestHeader","requestHeader","setWithCredentials","withCredentials","IFCXFileLoader","format","globalThis","File","ArrayBuffer","params","GLTFLoadingManager","setCrossOrigin","crossOrigin","event","lengthComputable","loaded","total","loadAsync","fileURL","loaders","registerLoader"],"mappings":"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"}
|
package/dist/viewer-three.js
CHANGED
|
@@ -60303,175 +60303,6 @@ void main() {
|
|
|
60303
60303
|
}
|
|
60304
60304
|
}
|
|
60305
60305
|
|
|
60306
|
-
/**
|
|
60307
|
-
* https://github.com/google/model-viewer/blob/master/packages/model-viewer/src/three-components/EnvironmentScene.ts
|
|
60308
|
-
*/
|
|
60309
|
-
|
|
60310
|
-
|
|
60311
|
-
class RoomEnvironment extends Scene {
|
|
60312
|
-
|
|
60313
|
-
constructor() {
|
|
60314
|
-
|
|
60315
|
-
super();
|
|
60316
|
-
|
|
60317
|
-
const geometry = new BoxGeometry();
|
|
60318
|
-
geometry.deleteAttribute( 'uv' );
|
|
60319
|
-
|
|
60320
|
-
const roomMaterial = new MeshStandardMaterial( { side: BackSide } );
|
|
60321
|
-
const boxMaterial = new MeshStandardMaterial();
|
|
60322
|
-
|
|
60323
|
-
const mainLight = new PointLight( 0xffffff, 900, 28, 2 );
|
|
60324
|
-
mainLight.position.set( 0.418, 16.199, 0.300 );
|
|
60325
|
-
this.add( mainLight );
|
|
60326
|
-
|
|
60327
|
-
const room = new Mesh( geometry, roomMaterial );
|
|
60328
|
-
room.position.set( -0.757, 13.219, 0.717 );
|
|
60329
|
-
room.scale.set( 31.713, 28.305, 28.591 );
|
|
60330
|
-
this.add( room );
|
|
60331
|
-
|
|
60332
|
-
const box1 = new Mesh( geometry, boxMaterial );
|
|
60333
|
-
box1.position.set( -10.906, 2.009, 1.846 );
|
|
60334
|
-
box1.rotation.set( 0, -0.195, 0 );
|
|
60335
|
-
box1.scale.set( 2.328, 7.905, 4.651 );
|
|
60336
|
-
this.add( box1 );
|
|
60337
|
-
|
|
60338
|
-
const box2 = new Mesh( geometry, boxMaterial );
|
|
60339
|
-
box2.position.set( -5.607, -0.754, -0.758 );
|
|
60340
|
-
box2.rotation.set( 0, 0.994, 0 );
|
|
60341
|
-
box2.scale.set( 1.970, 1.534, 3.955 );
|
|
60342
|
-
this.add( box2 );
|
|
60343
|
-
|
|
60344
|
-
const box3 = new Mesh( geometry, boxMaterial );
|
|
60345
|
-
box3.position.set( 6.167, 0.857, 7.803 );
|
|
60346
|
-
box3.rotation.set( 0, 0.561, 0 );
|
|
60347
|
-
box3.scale.set( 3.927, 6.285, 3.687 );
|
|
60348
|
-
this.add( box3 );
|
|
60349
|
-
|
|
60350
|
-
const box4 = new Mesh( geometry, boxMaterial );
|
|
60351
|
-
box4.position.set( -2.017, 0.018, 6.124 );
|
|
60352
|
-
box4.rotation.set( 0, 0.333, 0 );
|
|
60353
|
-
box4.scale.set( 2.002, 4.566, 2.064 );
|
|
60354
|
-
this.add( box4 );
|
|
60355
|
-
|
|
60356
|
-
const box5 = new Mesh( geometry, boxMaterial );
|
|
60357
|
-
box5.position.set( 2.291, -0.756, -2.621 );
|
|
60358
|
-
box5.rotation.set( 0, -0.286, 0 );
|
|
60359
|
-
box5.scale.set( 1.546, 1.552, 1.496 );
|
|
60360
|
-
this.add( box5 );
|
|
60361
|
-
|
|
60362
|
-
const box6 = new Mesh( geometry, boxMaterial );
|
|
60363
|
-
box6.position.set( -2.193, -0.369, -5.547 );
|
|
60364
|
-
box6.rotation.set( 0, 0.516, 0 );
|
|
60365
|
-
box6.scale.set( 3.875, 3.487, 2.986 );
|
|
60366
|
-
this.add( box6 );
|
|
60367
|
-
|
|
60368
|
-
|
|
60369
|
-
// -x right
|
|
60370
|
-
const light1 = new Mesh( geometry, createAreaLightMaterial( 50 ) );
|
|
60371
|
-
light1.position.set( -16.116, 14.37, 8.208 );
|
|
60372
|
-
light1.scale.set( 0.1, 2.428, 2.739 );
|
|
60373
|
-
this.add( light1 );
|
|
60374
|
-
|
|
60375
|
-
// -x left
|
|
60376
|
-
const light2 = new Mesh( geometry, createAreaLightMaterial( 50 ) );
|
|
60377
|
-
light2.position.set( -16.109, 18.021, -8.207 );
|
|
60378
|
-
light2.scale.set( 0.1, 2.425, 2.751 );
|
|
60379
|
-
this.add( light2 );
|
|
60380
|
-
|
|
60381
|
-
// +x
|
|
60382
|
-
const light3 = new Mesh( geometry, createAreaLightMaterial( 17 ) );
|
|
60383
|
-
light3.position.set( 14.904, 12.198, -1.832 );
|
|
60384
|
-
light3.scale.set( 0.15, 4.265, 6.331 );
|
|
60385
|
-
this.add( light3 );
|
|
60386
|
-
|
|
60387
|
-
// +z
|
|
60388
|
-
const light4 = new Mesh( geometry, createAreaLightMaterial( 43 ) );
|
|
60389
|
-
light4.position.set( -0.462, 8.89, 14.520 );
|
|
60390
|
-
light4.scale.set( 4.38, 5.441, 0.088 );
|
|
60391
|
-
this.add( light4 );
|
|
60392
|
-
|
|
60393
|
-
// -z
|
|
60394
|
-
const light5 = new Mesh( geometry, createAreaLightMaterial( 20 ) );
|
|
60395
|
-
light5.position.set( 3.235, 11.486, -12.541 );
|
|
60396
|
-
light5.scale.set( 2.5, 2.0, 0.1 );
|
|
60397
|
-
this.add( light5 );
|
|
60398
|
-
|
|
60399
|
-
// +y
|
|
60400
|
-
const light6 = new Mesh( geometry, createAreaLightMaterial( 100 ) );
|
|
60401
|
-
light6.position.set( 0.0, 20.0, 0.0 );
|
|
60402
|
-
light6.scale.set( 1.0, 0.1, 1.0 );
|
|
60403
|
-
this.add( light6 );
|
|
60404
|
-
|
|
60405
|
-
}
|
|
60406
|
-
|
|
60407
|
-
dispose() {
|
|
60408
|
-
|
|
60409
|
-
const resources = new Set();
|
|
60410
|
-
|
|
60411
|
-
this.traverse( ( object ) => {
|
|
60412
|
-
|
|
60413
|
-
if ( object.isMesh ) {
|
|
60414
|
-
|
|
60415
|
-
resources.add( object.geometry );
|
|
60416
|
-
resources.add( object.material );
|
|
60417
|
-
|
|
60418
|
-
}
|
|
60419
|
-
|
|
60420
|
-
} );
|
|
60421
|
-
|
|
60422
|
-
for ( const resource of resources ) {
|
|
60423
|
-
|
|
60424
|
-
resource.dispose();
|
|
60425
|
-
|
|
60426
|
-
}
|
|
60427
|
-
|
|
60428
|
-
}
|
|
60429
|
-
|
|
60430
|
-
}
|
|
60431
|
-
|
|
60432
|
-
function createAreaLightMaterial( intensity ) {
|
|
60433
|
-
|
|
60434
|
-
const material = new MeshBasicMaterial();
|
|
60435
|
-
material.color.setScalar( intensity );
|
|
60436
|
-
return material;
|
|
60437
|
-
|
|
60438
|
-
}
|
|
60439
|
-
|
|
60440
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
60441
|
-
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
|
|
60442
|
-
// All rights reserved.
|
|
60443
|
-
//
|
|
60444
|
-
// This software and its documentation and related materials are owned by
|
|
60445
|
-
// the Alliance. The software may only be incorporated into application
|
|
60446
|
-
// programs owned by members of the Alliance, subject to a signed
|
|
60447
|
-
// Membership Agreement and Supplemental Software License Agreement with the
|
|
60448
|
-
// Alliance. The structure and organization of this software are the valuable
|
|
60449
|
-
// trade secrets of the Alliance and its suppliers. The software is also
|
|
60450
|
-
// protected by copyright law and international treaty provisions. Application
|
|
60451
|
-
// programs incorporating this software must include the following statement
|
|
60452
|
-
// with their copyright notices:
|
|
60453
|
-
//
|
|
60454
|
-
// This application incorporates Open Design Alliance software pursuant to a
|
|
60455
|
-
// license agreement with Open Design Alliance.
|
|
60456
|
-
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
|
|
60457
|
-
// All rights reserved.
|
|
60458
|
-
//
|
|
60459
|
-
// By use of this software, its documentation or related materials, you
|
|
60460
|
-
// acknowledge and accept the above terms.
|
|
60461
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
60462
|
-
class RoomEnvironmentComponent {
|
|
60463
|
-
constructor(viewer) {
|
|
60464
|
-
this.viewer = viewer;
|
|
60465
|
-
const environment = new RoomEnvironment();
|
|
60466
|
-
const pmremGenerator = new PMREMGenerator(this.viewer.renderer);
|
|
60467
|
-
this.viewer.scene.environment = pmremGenerator.fromScene(environment).texture;
|
|
60468
|
-
environment.dispose();
|
|
60469
|
-
}
|
|
60470
|
-
dispose() {
|
|
60471
|
-
this.viewer.scene.environment = undefined;
|
|
60472
|
-
}
|
|
60473
|
-
}
|
|
60474
|
-
|
|
60475
60306
|
///////////////////////////////////////////////////////////////////////////////
|
|
60476
60307
|
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
|
|
60477
60308
|
// All rights reserved.
|
|
@@ -60616,21 +60447,37 @@ void main() {
|
|
|
60616
60447
|
this.geometryEnd = () => {
|
|
60617
60448
|
this.ambientLight.removeFromParent();
|
|
60618
60449
|
this.directionalLight.removeFromParent();
|
|
60450
|
+
this.frontLight.removeFromParent();
|
|
60451
|
+
this.hemisphereLight.removeFromParent();
|
|
60619
60452
|
if (this.viewer.extents.isEmpty())
|
|
60620
60453
|
return;
|
|
60621
60454
|
const extentsCenter = this.viewer.extents.getCenter(new Vector3());
|
|
60622
|
-
const extentsSize = this.viewer.extents.getBoundingSphere(new Sphere()).radius
|
|
60623
|
-
this.directionalLight.position
|
|
60455
|
+
const extentsSize = this.viewer.extents.getBoundingSphere(new Sphere()).radius;
|
|
60456
|
+
this.directionalLight.position
|
|
60457
|
+
.set(0.5, 0, 0.866)
|
|
60458
|
+
.multiplyScalar(extentsSize * 2)
|
|
60459
|
+
.add(extentsCenter);
|
|
60624
60460
|
this.directionalLight.target.position.copy(extentsCenter);
|
|
60461
|
+
this.frontLight.position.set(0, extentsSize * 2, 0).add(extentsCenter);
|
|
60462
|
+
this.frontLight.target.position.copy(extentsCenter);
|
|
60463
|
+
this.hemisphereLight.position.set(0, extentsSize * 3, 0).add(extentsCenter);
|
|
60625
60464
|
this.viewer.scene.add(this.ambientLight);
|
|
60626
60465
|
this.viewer.scene.add(this.directionalLight);
|
|
60466
|
+
this.viewer.scene.add(this.frontLight);
|
|
60467
|
+
this.viewer.scene.add(this.hemisphereLight);
|
|
60627
60468
|
};
|
|
60628
60469
|
this.viewer = viewer;
|
|
60629
|
-
this.ambientLight = new AmbientLight(0xffffff,
|
|
60470
|
+
this.ambientLight = new AmbientLight(0xffffff, 1);
|
|
60630
60471
|
this.viewer.scene.add(this.ambientLight);
|
|
60631
60472
|
this.directionalLight = new DirectionalLight(0xffffff, 1);
|
|
60632
60473
|
this.directionalLight.position.set(0.5, 0, 0.866); // ~60º
|
|
60633
60474
|
this.viewer.scene.add(this.directionalLight);
|
|
60475
|
+
this.frontLight = new DirectionalLight(0xffffff, 1.25);
|
|
60476
|
+
this.frontLight.position.set(0, 1, 0);
|
|
60477
|
+
this.viewer.scene.add(this.frontLight);
|
|
60478
|
+
this.hemisphereLight = new HemisphereLight(0xffffff, 0x444444, 1.25);
|
|
60479
|
+
this.hemisphereLight.position.set(0, 0, 1);
|
|
60480
|
+
this.viewer.scene.add(this.hemisphereLight);
|
|
60634
60481
|
this.viewer.addEventListener("databasechunk", this.geometryEnd);
|
|
60635
60482
|
this.viewer.addEventListener("clear", this.geometryEnd);
|
|
60636
60483
|
}
|
|
@@ -60639,6 +60486,10 @@ void main() {
|
|
|
60639
60486
|
this.ambientLight.dispose();
|
|
60640
60487
|
this.directionalLight.removeFromParent();
|
|
60641
60488
|
this.directionalLight.dispose();
|
|
60489
|
+
this.frontLight.removeFromParent();
|
|
60490
|
+
this.frontLight.dispose();
|
|
60491
|
+
this.hemisphereLight.removeFromParent();
|
|
60492
|
+
this.hemisphereLight.dispose();
|
|
60642
60493
|
this.viewer.removeEventListener("databasechunk", this.geometryEnd);
|
|
60643
60494
|
this.viewer.removeEventListener("clear", this.geometryEnd);
|
|
60644
60495
|
}
|
|
@@ -60929,7 +60780,6 @@ void main() {
|
|
|
60929
60780
|
components.registerComponent("ExtentsComponent", (viewer) => new ExtentsComponent(viewer));
|
|
60930
60781
|
components.registerComponent("CameraComponent", (viewer) => new CameraComponent(viewer));
|
|
60931
60782
|
components.registerComponent("BackgroundComponent", (viewer) => new BackgroundComponent(viewer));
|
|
60932
|
-
components.registerComponent("RoomEnvironmentComponent", (viewer) => new RoomEnvironmentComponent(viewer));
|
|
60933
60783
|
components.registerComponent("LightComponent", (viewer) => new LightComponent(viewer));
|
|
60934
60784
|
components.registerComponent("ResizeCanvasComponent", (viewer) => new ResizeCanvasComponent(viewer));
|
|
60935
60785
|
components.registerComponent("RenderLoopComponent", (viewer) => new RenderLoopComponent(viewer));
|
|
@@ -79561,6 +79411,7 @@ void main() {
|
|
|
79561
79411
|
this.enableEditMode(draggerName);
|
|
79562
79412
|
};
|
|
79563
79413
|
this.resizeContainer = entries => {
|
|
79414
|
+
if (!entries || !entries[0] || !entries[0].contentRect) return;
|
|
79564
79415
|
const {width: width, height: height} = entries[0].contentRect;
|
|
79565
79416
|
if (!width || !height) return;
|
|
79566
79417
|
if (!this._konvaStage) return;
|
|
@@ -79662,6 +79513,7 @@ void main() {
|
|
|
79662
79513
|
});
|
|
79663
79514
|
}
|
|
79664
79515
|
colorizeAllMarkup(r, g, b) {
|
|
79516
|
+
this.setMarkupColor(r, g, b);
|
|
79665
79517
|
const hexColor = new MarkupColor(r, g, b).asHex();
|
|
79666
79518
|
this.getObjects().filter((obj => {
|
|
79667
79519
|
var _a;
|