overte-lubosz/script-archive/growth.js
2016-04-26 11:18:22 -07:00

122 lines
3 KiB
JavaScript

//
// growth.js
//
// Created by Zachary Pomerantz 11/2/2015.
// Copyright 2015 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
//
var RADIUS = 5;
var LIFETIME = 60; // only keep these entities around for a minute
var SIZE = 1; // starting size
var SIZE_MAX = 3;
var SIZE_MIN = 0.5;
var center = MyAvatar.position;
var positions = [
Vec3.sum(center, Vec3.multiply(RADIUS, Vec3.FRONT)),
Vec3.sum(center, Vec3.multiply(-RADIUS, Vec3.FRONT)),
Vec3.sum(center, Vec3.multiply(RADIUS, Vec3.RIGHT)),
Vec3.sum(center, Vec3.multiply(-RADIUS, Vec3.RIGHT)),
];
// Create spheres around the avatar
var spheres = map(positions, getSphere);
// Toggle sphere growth
each(spheres, function(sphere) {
var state = {
size: SIZE,
grow: true, // grow/shrink
state: false, // mutate/pause
};
// Grow or shrink on click
Script.addEventHandler(sphere, 'clickReleaseOnEntity', toggleGrowth);
// TODO: Toggle on collisions as well
function toggleGrowth() {
if (state.state) {
stop();
} else {
start();
}
}
function start() {
var verb = state.grow ? 'grow' : 'shrink';
print('starting to '+verb+' '+sphere);
Script.update.connect(grow);
state.state = true;
}
function stop() {
print('stopping '+sphere);
Script.update.disconnect(grow);
state.state = false;
state.grow = !state.grow;
}
function grow(delta) {
if ((state.grow && state.size > SIZE_MAX) || // cannot grow more
(!state.grow && state.size < SIZE_MIN)) { // cannot shrink more
stop();
return;
}
state.size += (state.grow ? 1 : -1) * delta; // grow/shrink
Entities.editEntity(sphere, { dimensions: getDimensions(state.size) });
}
});
Script.scriptEnding.connect(function() { // cleanup
each(spheres, function(sphere) {
Entities.deleteEntity(sphere);
});
});
// NOTE: Everything below this line is a helper.
// The basic logic of this example is entirely above this note.
// Entity helpers
function getSphere(position) {
return Entities.addEntity({
type: 'Sphere',
position: position,
dimensions: getDimensions(SIZE),
color: getColor(),
gravity: Vec3.ZERO,
lifetime: LIFETIME,
ignoreCollisions: true,
});
}
function getDimensions(size) {
return { x: size, y: size, z: size };
}
function getColor() {
return { red: getValue(), green: getValue(), blue: getValue() };
function getValue() { return Math.floor(Math.random() * 255); }
}
// Functional helpers
function map(list, iterator) {
var result = [];
for (var i = 0; i < list.length; i++) {
result.push(iterator(list[i], i, list));
}
return result;
}
function each(list, iterator) {
for (var i = 0; i < list.length; i++) {
iterator(list[i], i, list);
}
}