mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 17:14:59 +02:00
Merge pull request #6290 from zzmp/examples/growth
Add growth script to examples
This commit is contained in:
commit
b340a99d69
1 changed files with 122 additions and 0 deletions
122
examples/growth.js
Normal file
122
examples/growth.js
Normal file
|
@ -0,0 +1,122 @@
|
|||
//
|
||||
// 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);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue