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;
|
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
|
* 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} }));
|
resolve(load.SVG.parse(data).map(m => { return {mesh: m.toFloat32(), file} }));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
reject(`unknown file type: "${ext}" from ${url}`);
|
reject(`unknown file type: "${ext}" from ${file}`);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function load_file(file) {
|
function load_file(file) {
|
||||||
|
if (Array.isArray(file)) {
|
||||||
|
return Promise.all(file.map(file => load_file(file)));
|
||||||
|
}
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return reject('invalid or missing file');
|
return reject('invalid or missing file');
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ broker.subscribe('space_init', data => {
|
||||||
'drop', (evt) => {
|
'drop', (evt) => {
|
||||||
estop(evt);
|
estop(evt);
|
||||||
platform.setColor(platcolor);
|
platform.setColor(platcolor);
|
||||||
load.File.load(evt.dataTransfer.files[0])
|
load.File.load([...evt.dataTransfer.files])
|
||||||
.then(data => {
|
.then(data => {
|
||||||
broker.send.space_load(data);
|
broker.send.space_load(data);
|
||||||
})
|
})
|
||||||
|
|
@ -84,9 +84,7 @@ broker.subscribe('space_init', data => {
|
||||||
|
|
||||||
// add object loader
|
// add object loader
|
||||||
broker.subscribe('space_load', data => {
|
broker.subscribe('space_load', data => {
|
||||||
for (let od of data) {
|
mesh.api.models.add(data.flat().map(el => new mesh.model(el)));
|
||||||
mesh.api.models.add(new mesh.model(od));
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// remove version cache bust from url
|
// remove version cache bust from url
|
||||||
|
|
|
||||||
|
|
@ -25,17 +25,33 @@ let api = mesh.api = {
|
||||||
models: {
|
models: {
|
||||||
all: models,
|
all: models,
|
||||||
|
|
||||||
add: model => {
|
add: (list, group = new THREE.Group()) => {
|
||||||
if (!models.contains(model)) {
|
if (!Array.isArray(list)) {
|
||||||
space.model.add(model.mesh);
|
list = [ list ];
|
||||||
models.push(model);
|
|
||||||
}
|
}
|
||||||
|
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 => {
|
remove: list => {
|
||||||
space.model.remove(model.mesh);
|
if (!Array.isArray(list)) {
|
||||||
models.remove(model);
|
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;
|
meh.renderOrder = 1;
|
||||||
return meh;
|
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);
|
timers[key] = setTimeout(fn, time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WORLD.contains = (obj) => {
|
||||||
|
return WORLD.children.contains(obj);
|
||||||
|
};
|
||||||
|
|
||||||
/** ******************************************************************
|
/** ******************************************************************
|
||||||
* TWEENing Functions
|
* TWEENing Functions
|
||||||
******************************************************************* */
|
******************************************************************* */
|
||||||
|
|
@ -954,19 +958,6 @@
|
||||||
active: updateLastAction
|
active: updateLastAction
|
||||||
},
|
},
|
||||||
|
|
||||||
// wraps WORLD add/remove with immediate refresh
|
|
||||||
model: {
|
|
||||||
add: mesh => {
|
|
||||||
WORLD.add(mesh);
|
|
||||||
refresh();
|
|
||||||
},
|
|
||||||
|
|
||||||
remove: (mesh) => {
|
|
||||||
WORLD.remove(mesh);
|
|
||||||
refresh();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
world: WORLD,
|
world: WORLD,
|
||||||
|
|
||||||
platform: {
|
platform: {
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
<link rel="apple-touch-icon" href="/kiri/favicon-mobile.png">
|
<link rel="apple-touch-icon" href="/kiri/favicon-mobile.png">
|
||||||
<link rel="stylesheet" type="text/css" href="/kiri/index.css?{{version}}">
|
<link rel="stylesheet" type="text/css" href="/kiri/index.css?{{version}}">
|
||||||
<link href="/font/css/all.min.css" rel="stylesheet">
|
<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>
|
<script src="/code/kiri.js?{{version}}"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
<link rel="icon" href="/mesh/favicon.ico">
|
<link rel="icon" href="/mesh/favicon.ico">
|
||||||
<link rel="stylesheet" type="text/css" href="/mesh/index.css?{{version}}">
|
<link rel="stylesheet" type="text/css" href="/mesh/index.css?{{version}}">
|
||||||
<link href="/font/css/all.min.css" rel="stylesheet">
|
<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>
|
<script src="/code/mesh.js?{{version}}"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue