You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.2 KiB
JavaScript
51 lines
1.2 KiB
JavaScript
import {Shape} from "./Shape";
|
|
import {Group} from "three";
|
|
import {uuidv4} from "../utils";
|
|
|
|
export class ShapeCollection {
|
|
constructor({shapes = [], name = ""}, filePrefix = "", onLoad = () => {
|
|
}, forceLoad = false) {
|
|
this.id = uuidv4();
|
|
let loaded = 0;
|
|
this.shapes = shapes.map((s) => new Shape(s, filePrefix, () => {
|
|
loaded++;
|
|
|
|
if (loaded === shapes.length) {
|
|
this.isLoaded = true;
|
|
this.onLoad();
|
|
}
|
|
}, forceLoad));
|
|
|
|
this.isLoaded = false;
|
|
this.onLoad = onLoad;
|
|
this.group = null;
|
|
|
|
if (this.shapes.length === 0) {
|
|
this.onLoad();
|
|
this.isLoaded = true;
|
|
}
|
|
}
|
|
|
|
static forceLoad(shapeCollection, filePrefix) {
|
|
return new Promise((res, rej) => {
|
|
let shapeColl = new ShapeCollection(shapeCollection, filePrefix, () => {
|
|
res(shapeColl)
|
|
}, true)
|
|
});
|
|
}
|
|
|
|
getGroup() {
|
|
if (this.group) {
|
|
return this.group;
|
|
}
|
|
|
|
// Create group for all shapes
|
|
this.group = new Group();
|
|
|
|
for (let shape of this.shapes) {
|
|
this.group.add(shape.getMesh())
|
|
}
|
|
|
|
return this.group
|
|
}
|
|
} |