content/hifi-public/philip/firefly.js
Dale Glass 0d14e5a379 Initial data.
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.
2022-02-13 18:59:11 +01:00

100 lines
No EOL
3.7 KiB
JavaScript

//
// A firefly which is animated by passerbys. It's physical, no gravity, periodic forces applied.
// If a firefly is found to
//
(function () {
var entityID,
timeoutID = null,
properties,
shouldSimulate = false,
ACTIVE_CHECK_INTERVAL = 100, // milliseconds
INACTIVE_CHECK_INTERVAL = 1000, // milliseconds
MAX_DISTANCE_TO_SIMULATE = 20, // meters
LIGHT_LIFETIME = 1400, // milliseconds a firefly light will stay alive
BUMP_SPEED = 1.5, // average velocity given by a bump
BUMP_CHANCE = 0.33,
MIN_SPEED = 0.125, // below this speed, firefly gets a new bump
SPIN_SPEED = 3.5,
BRIGHTNESS = 0.25,
wantDebug = false
function randomVector(size) {
return { x: (Math.random() - 0.5) * size,
y: (Math.random() - 0.5) * size,
z: (Math.random() - 0.5) * size };
}
function printDebug(message) {
if (wantDebug) {
print(message);
}
}
function maybe() {
properties = Entities.getEntityProperties(entityID);
var speed = Vec3.length(properties.velocity);
var distance = Vec3.distance(MyAvatar.position, properties.position);
printDebug("maybe: speed: " + speed + ", distance: " + distance);
if (shouldSimulate) {
// We are simulating this firefly, so do stuff:
if (distance > MAX_DISTANCE_TO_SIMULATE) {
shouldSimulate = false;
} else if ((speed < MIN_SPEED) && (Math.random() < BUMP_CHANCE)) {
bump();
makeLight();
}
} else if (Vec3.length(properties.velocity) == 0.0) {
// We've found a firefly that is not being simulated, so maybe take it over
if (distance < MAX_DISTANCE_TO_SIMULATE) {
shouldSimulate = true;
}
}
timeoutID = Script.setTimeout(maybe, (shouldSimulate == true) ? ACTIVE_CHECK_INTERVAL : INACTIVE_CHECK_INTERVAL);
}
function bump() {
// Give the firefly a little brownian hop
printDebug("bump!");
var velocity = randomVector(BUMP_SPEED);
if (velocity.y < 0.0) { velocity.y *= -1.0 };
Entities.editEntity(entityID, { velocity: velocity,
angularVelocity: randomVector(SPIN_SPEED) });
}
function makeLight() {
printDebug("make light!");
// create a light attached to the firefly that lives for a while
Entities.addEntity({
type: "Light",
name: "firefly light",
intensity: 4.0 * BRIGHTNESS,
falloffRadius: 8.0 * BRIGHTNESS,
dimensions: {
x: 30 * BRIGHTNESS,
y: 30 * BRIGHTNESS,
z: 30 * BRIGHTNESS
},
position: Vec3.sum(properties.position, { x: 0, y: 0.2, z: 0 }),
parentID: entityID,
color: {
red: 150 + Math.random() * 100,
green: 100 + Math.random() * 50,
blue: 150 + Math.random() * 100
},
lifetime: LIGHT_LIFETIME / 1000
});
}
this.preload = function (givenEntityID) {
printDebug("preload firefly...");
entityID = givenEntityID;
timeoutID = Script.setTimeout(maybe, ACTIVE_CHECK_INTERVAL);
};
this.unload = function () {
printDebug("unload firefly...");
if (timeoutID !== undefined) {
Script.clearTimeout(timeoutID);
}
};
})