add model groups, async font load, array addOnce
This commit is contained in:
parent
a1644ed609
commit
5506567ecf
8 changed files with 54 additions and 28 deletions
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue