mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-05 21:02:25 +02:00
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();
|
|
};
|
|
})
|