add model groups, async font load, array addOnce

This commit is contained in:
Stewart Allen 2021-12-29 23:52:48 -05:00
commit 5506567ecf
8 changed files with 54 additions and 28 deletions

View file

@ -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
*

View file

@ -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');

View file

@ -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

View file

@ -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();
}
}
}
}
};

View file

@ -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;
}
};
})();

View file

@ -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: {

View file

@ -16,7 +16,7 @@
<link rel="apple-touch-icon" href="/kiri/favicon-mobile.png">
<link rel="stylesheet" type="text/css" href="/kiri/index.css?{{version}}">
<link href="/font/css/all.min.css" rel="stylesheet">
<script src="/font/js/all.min.js" crossorigin="anonymous"></script>
<script src="/font/js/all.min.js" crossorigin="anonymous" async></script>
<script src="/code/kiri.js?{{version}}"></script>
</head>
<body>

View file

@ -14,7 +14,7 @@
<link rel="icon" href="/mesh/favicon.ico">
<link rel="stylesheet" type="text/css" href="/mesh/index.css?{{version}}">
<link href="/font/css/all.min.css" rel="stylesheet">
<script src="/font/js/all.min.js" crossorigin="anonymous"></script>
<script src="/font/js/all.min.js" crossorigin="anonymous" async></script>
<script src="/code/mesh.js?{{version}}"></script>
</head>
<body>