From 3fe48b4fd928c271bb3231ddc36392a5f8bf0067 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 29 Jan 2022 11:35:26 -0500 Subject: [PATCH] add 3mf instancing support --- src/load/3mf.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/load/3mf.js b/src/load/3mf.js index c6cfb373..02477cd2 100644 --- a/src/load/3mf.js +++ b/src/load/3mf.js @@ -7,6 +7,7 @@ let load = self.load = self.load || {}; if (load.TMF) return; +// dep: add.three // dep: ext.jszip gapp.register('load.3mf'); @@ -14,6 +15,8 @@ load.TMF = { parseAsync }; +let { BufferAttribute, Matrix4 } = THREE; + function query(node, path, fn) { let collect = false; let match = path[0]; @@ -41,7 +44,6 @@ function loadModel(doc) { let id; let model; let faces; - let refs; let units; let scale = 1; let scaleMap = { @@ -75,14 +77,22 @@ function loadModel(doc) { // emit previous model emitModel(); faces = []; - refs = []; id = node.getAttribute("id") || undefined; model = node.getAttribute("name") || undefined; query(node, ["components","+component"], (type, node) => { let objectid = node.getAttribute('objectid'); - let trans = node.getAttribute('transform'); - refs.push({ objectid, trans }); - // console.log({objectid, trans }); + let mat = node.getAttribute('transform').split(' ').map(v => parseFloat(v)); + mat = [ + ...mat.slice(0,3), 0, + ...mat.slice(3,6), 0, + ...mat.slice(6,9), 0, + ...mat.slice(9,12), 1 + ]; + let ref = byid[objectid]; + if (!ref) return; + let m4 = new Matrix4().fromArray(mat); + let pos = new BufferAttribute(ref.faces.toFloat32(), 3).applyMatrix4(m4); + faces.appendAll(pos.array); }); break; case "mesh":