Needs a lot of cleanup. Data has been de-duplicated, and where identical copies existed, one of them has been replaced with a symlink. Some files have been excluded, such as binaries, installers and debug dumps. Some of that may still be present.
101 lines
3.6 KiB
JavaScript
101 lines
3.6 KiB
JavaScript
(function () {
|
|
// See tests/performance/tribbles.js
|
|
Script.include("../libraries/virtualBaton.js");
|
|
var dimensions, oldColor, entityID,
|
|
editRate = 60,
|
|
moveRate = 1,
|
|
scale = 2,
|
|
accumulated = 0,
|
|
increment = {red: 1, green: 1, blue: 1},
|
|
hasUpdate = false,
|
|
shutdown = false,
|
|
baton;
|
|
function nextWavelength(color) {
|
|
var old = oldColor[color];
|
|
if (old === 255) {
|
|
increment[color] = -1;
|
|
} else if (old === 0) {
|
|
increment[color] = 1;
|
|
}
|
|
var next = (old + increment[color]) % 256;
|
|
return next;
|
|
}
|
|
function update(delta) { // High frequency stuff is done in update in case we fall behind.
|
|
accumulated += delta;
|
|
if (accumulated > (1 / editRate)) {
|
|
var newColor = {red: nextWavelength('red'), green: nextWavelength('green'), blue: nextWavelength('blue')};
|
|
oldColor = newColor;
|
|
Entities.editEntity(entityID, {color: newColor});
|
|
accumulated = 0;
|
|
}
|
|
}
|
|
function randomCentered() {
|
|
return Math.random() - 0.5;
|
|
}
|
|
function randomVector() {
|
|
return {x: randomCentered() * dimensions.x, y: randomCentered() * dimensions.y, z: randomCentered() * dimensions.z};
|
|
}
|
|
function move() {
|
|
var newData = {velocity: Vec3.sum({x: 0, y: 1, z: 0}, randomVector()), angularVelocity: Vec3.multiply(Math.PI, randomVector())};
|
|
var nextChange = Math.ceil(Math.random() * 2000 / moveRate);
|
|
Entities.editEntity(entityID, newData);
|
|
if (!shutdown) {
|
|
Script.setTimeout(move, nextChange);
|
|
}
|
|
}
|
|
function startUpdate() {
|
|
print('startUpdate', entityID);
|
|
hasUpdate = true;
|
|
Script.update.connect(update);
|
|
}
|
|
function stopUpdate() {
|
|
print('stopUpdate', entityID, hasUpdate);
|
|
if (!hasUpdate) {
|
|
return;
|
|
}
|
|
hasUpdate = false;
|
|
Script.update.disconnect(update);
|
|
}
|
|
function stopUpdateAndReclaim() {
|
|
print('stopUpdateAndReclaim', entityID);
|
|
stopUpdate();
|
|
baton.claim(startUpdate, stopUpdateAndReclaim);
|
|
}
|
|
this.preload = function (givenEntityID) {
|
|
entityID = givenEntityID;
|
|
var properties = Entities.getEntityProperties(entityID);
|
|
var userData = properties.userData && JSON.parse(properties.userData);
|
|
var moveTimeout = userData ? userData.moveTimeout : 0;
|
|
var editTimeout = userData ? userData.editTimeout : 0;
|
|
var debug = (userData && userData.debug) || {};
|
|
editRate = (userData && userData.editRate) || editRate;
|
|
moveRate = (moveRate && userData.moveRate) || moveRate;
|
|
oldColor = properties.color;
|
|
dimensions = Vec3.multiply(scale, properties.dimensions);
|
|
baton = virtualBaton({
|
|
batonName: 'io.highfidelity.tribble:' + entityID, // One winner for each entity
|
|
debugFlow: debug.flow,
|
|
debugSend: debug.send,
|
|
debugReceive: debug.receive
|
|
});
|
|
if (editTimeout) {
|
|
baton.claim(startUpdate, stopUpdateAndReclaim);
|
|
if (editTimeout > 0) {
|
|
Script.setTimeout(stopUpdate, editTimeout * 1000);
|
|
}
|
|
}
|
|
if (moveTimeout) {
|
|
Script.setTimeout(move, 1000);
|
|
if (moveTimeout > 0) {
|
|
Script.setTimeout(function () {
|
|
shutdown = true;
|
|
}, moveTimeout * 1000);
|
|
}
|
|
}
|
|
};
|
|
this.unload = function () {
|
|
baton.unload();
|
|
shutdown = true;
|
|
stopUpdate();
|
|
};
|
|
})
|