From 5506567ecf9c5d8af15cb76dbfcf2f892a16b309 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 29 Dec 2021 23:52:48 -0500 Subject: [PATCH] add model groups, async font load, array addOnce --- src/add/array.js | 7 +++++++ src/load/file.js | 5 ++++- src/main/mesh.js | 6 ++---- src/mesh/api.js | 32 ++++++++++++++++++++++++-------- src/mesh/model.js | 11 +++++++++++ src/moto/space.js | 17 ++++------------- web/kiri/index.html | 2 +- web/mesh/index.html | 2 +- 8 files changed, 54 insertions(+), 28 deletions(-) diff --git a/src/add/array.js b/src/add/array.js index 66b14d38..33145b12 100644 --- a/src/add/array.js +++ b/src/add/array.js @@ -67,6 +67,13 @@ return this; }; + AP.addOnce = function(val) { + if (!this.contains(val)) { + this.push(val); + } + return this; + }; + /** * shallow cloning with clone(arg) call on each new element * diff --git a/src/load/file.js b/src/load/file.js index 8fd51993..646b886b 100644 --- a/src/load/file.js +++ b/src/load/file.js @@ -43,13 +43,16 @@ function load_data(data, file, ext) { resolve(load.SVG.parse(data).map(m => { return {mesh: m.toFloat32(), file} })); break; default: - reject(`unknown file type: "${ext}" from ${url}`); + reject(`unknown file type: "${ext}" from ${file}`); break; } }); } function load_file(file) { + if (Array.isArray(file)) { + return Promise.all(file.map(file => load_file(file))); + } return new Promise((resolve, reject) => { if (!file) { return reject('invalid or missing file'); diff --git a/src/main/mesh.js b/src/main/mesh.js index 6d09c0e8..34a7bcd2 100644 --- a/src/main/mesh.js +++ b/src/main/mesh.js @@ -59,7 +59,7 @@ broker.subscribe('space_init', data => { 'drop', (evt) => { estop(evt); platform.setColor(platcolor); - load.File.load(evt.dataTransfer.files[0]) + load.File.load([...evt.dataTransfer.files]) .then(data => { broker.send.space_load(data); }) @@ -84,9 +84,7 @@ broker.subscribe('space_init', data => { // add object loader broker.subscribe('space_load', data => { - for (let od of data) { - mesh.api.models.add(new mesh.model(od)); - } + mesh.api.models.add(data.flat().map(el => new mesh.model(el))); }); // remove version cache bust from url diff --git a/src/mesh/api.js b/src/mesh/api.js index 76aac982..5afafd7e 100644 --- a/src/mesh/api.js +++ b/src/mesh/api.js @@ -25,17 +25,33 @@ let api = mesh.api = { models: { all: models, - add: model => { - if (!models.contains(model)) { - space.model.add(model.mesh); - models.push(model); + add: (list, group = new THREE.Group()) => { + if (!Array.isArray(list)) { + list = [ list ]; } + for (let model of list) { + models.addOnce(model); + model.group = group; + group.add(model.mesh); + } + space.world.add(group); + space.refresh(); }, - remove: Array.handle(model => { - space.model.remove(model.mesh); - models.remove(model); - }) + remove: list => { + if (!Array.isArray(list)) { + list = [ list ]; + } + for (let model of list) { + if (models.remove(model)) { + model.group.remove(model.mesh); + if (model.group.children.length === 0) { + space.world.remove(model.group); + } + space.refresh(); + } + } + } } }; diff --git a/src/mesh/model.js b/src/mesh/model.js index 86458ff3..6caa46b8 100644 --- a/src/mesh/model.js +++ b/src/mesh/model.js @@ -51,6 +51,17 @@ mesh.model = class MeshModel { meh.renderOrder = 1; return meh; } + + get group() { + return this._group; + } + + set group(gv) { + if (this._group && this._group !== gv) { + throw "model cannot change groups"; + } + this._group = gv; + } }; })(); diff --git a/src/moto/space.js b/src/moto/space.js index 4a2d58e7..53b682b0 100644 --- a/src/moto/space.js +++ b/src/moto/space.js @@ -142,6 +142,10 @@ timers[key] = setTimeout(fn, time); } + WORLD.contains = (obj) => { + return WORLD.children.contains(obj); + }; + /** ****************************************************************** * TWEENing Functions ******************************************************************* */ @@ -954,19 +958,6 @@ active: updateLastAction }, - // wraps WORLD add/remove with immediate refresh - model: { - add: mesh => { - WORLD.add(mesh); - refresh(); - }, - - remove: (mesh) => { - WORLD.remove(mesh); - refresh(); - } - }, - world: WORLD, platform: { diff --git a/web/kiri/index.html b/web/kiri/index.html index 3ecd82b3..fd9c5acd 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -16,7 +16,7 @@ - + diff --git a/web/mesh/index.html b/web/mesh/index.html index 766b9fe1..e9a2233c 100644 --- a/web/mesh/index.html +++ b/web/mesh/index.html @@ -14,7 +14,7 @@ - +