61 lines
2.1 KiB
JavaScript
61 lines
2.1 KiB
JavaScript
(function() {
|
|
var ORBIT_RADIUS = 2.5; // distance from origin
|
|
var ORBIT_SPEED = 0.2; // radians per second
|
|
var SPIN_SPEED = 1.5; // radians per second
|
|
var ORBIT_Y = 2; // height above ground
|
|
|
|
var solids = ["tetrahedron", "cube", "octahedron", "dodecahedron", "icosahedron"];
|
|
var count = solids.length;
|
|
var entities = {};
|
|
var startTime = Date.now();
|
|
|
|
function findEntities() {
|
|
var found = Entities.findEntities({x:0, y:0, z:0}, 200);
|
|
solids.forEach(function(name) {
|
|
found.forEach(function(id) {
|
|
var props = Entities.getEntityProperties(id, ["name"]);
|
|
if (props.name === name) {
|
|
entities[name] = id;
|
|
}
|
|
});
|
|
});
|
|
|
|
// If we didn't find all 5, try again shortly
|
|
if (Object.keys(entities).length < solids.length) {
|
|
print("Only found " + Object.keys(entities).length + " solids, retrying...");
|
|
Script.setTimeout(findEntities, 500);
|
|
} else {
|
|
print("Found all solids, starting update loop");
|
|
Script.update.connect(update);
|
|
}
|
|
}
|
|
|
|
// Initial delay before first attempt
|
|
Script.setTimeout(findEntities, 500);
|
|
|
|
function update(dt) {
|
|
var elapsed = (Date.now() - startTime) / 1000;
|
|
|
|
solids.forEach(function(name, i) {
|
|
var id = entities[name];
|
|
if (!id) return;
|
|
|
|
// orbit angle offset per solid so they're evenly spaced
|
|
var orbitAngle = elapsed * ORBIT_SPEED + (i / count) * 2 * Math.PI;
|
|
|
|
var x = Math.cos(orbitAngle) * ORBIT_RADIUS;
|
|
var z = Math.sin(orbitAngle) * ORBIT_RADIUS;
|
|
|
|
// spin around local Y axis
|
|
var spinAngle = elapsed * SPIN_SPEED;
|
|
|
|
Entities.editEntity(id, {
|
|
position: { x: x, y: ORBIT_Y, z: z },
|
|
rotation: Quat.fromPitchYawRollRadians(spinAngle, spinAngle, -spinAngle * 0.5)
|
|
});
|
|
});
|
|
}
|
|
|
|
Script.update.connect(update);
|
|
findEntities();
|
|
})();
|