mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-06 00:02:59 +02:00
106 lines
No EOL
3.8 KiB
JavaScript
106 lines
No EOL
3.8 KiB
JavaScript
//
|
|
// Created by Philip Rosedale on March 7, 2016
|
|
// Copyright 2016 High Fidelity, Inc.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
//
|
|
// 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);
|
|
}
|
|
};
|
|
}) |