mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 02:17:11 +02:00
Merge pull request #6806 from PhilipRosedale/energybar
Energybar example script and test script for scaling
This commit is contained in:
commit
38b0fd2747
3 changed files with 194 additions and 0 deletions
87
examples/dropStuffNearMe.js
Normal file
87
examples/dropStuffNearMe.js
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
//
|
||||||
|
// Created by Philip Rosedale on January 9, 2016
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Puts a bunch of entities in front of you, with various adjustable properties for testing.
|
||||||
|
//
|
||||||
|
// Note that when creating things quickly, the entity server will ignore data if we send updates too quickly.
|
||||||
|
// like Internet MTU, these rates are set by th domain operator, so in this script there is a RATE_PER_SECOND
|
||||||
|
// variable letting you set this speed. If entities are missing from the grid after a relog, this number
|
||||||
|
// being too high may be the reason.
|
||||||
|
|
||||||
|
var SIZE = 0.5;
|
||||||
|
var TYPE = "Box"; // Right now this can be "Box" or "Model" or "Sphere"
|
||||||
|
var MODEL_URL = "http://s3.amazonaws.com/hifi-public/models/content/basketball2.fbx";
|
||||||
|
var MODEL_DIMENSION = { x: 0.3, y: 0.3, z: 0.3 };
|
||||||
|
|
||||||
|
var RATE_PER_SECOND = 1000; // The entity server will drop data if we create things too fast.
|
||||||
|
var SCRIPT_INTERVAL = 100;
|
||||||
|
var LIFETIME = 90;
|
||||||
|
|
||||||
|
var NUMBER_TO_CREATE = 300;
|
||||||
|
|
||||||
|
var GRAVITY = { x: 0, y: -9.8, z: 0 };
|
||||||
|
var VELOCITY = { x: 0.0, y: 0, z: 0 };
|
||||||
|
var ANGULAR_VELOCITY = { x: 1, y: 1, z: 1 };
|
||||||
|
|
||||||
|
var DAMPING = 0.5;
|
||||||
|
var ANGULAR_DAMPING = 0.5;
|
||||||
|
|
||||||
|
var collidable = true;
|
||||||
|
var gravity = true;
|
||||||
|
|
||||||
|
|
||||||
|
var x = 0;
|
||||||
|
var z = 0;
|
||||||
|
var totalCreated = 0;
|
||||||
|
|
||||||
|
var RANGE = 10;
|
||||||
|
var HOW_FAR_IN_FRONT_OF_ME = 3 * RANGE;
|
||||||
|
|
||||||
|
|
||||||
|
var center = Vec3.sum(MyAvatar.position, Vec3.multiply(HOW_FAR_IN_FRONT_OF_ME, Quat.getFront(Camera.orientation)));
|
||||||
|
|
||||||
|
|
||||||
|
function randomVector(range) {
|
||||||
|
return {
|
||||||
|
x: (Math.random() - 0.5) * range.x,
|
||||||
|
y: (Math.random() - 0.5) * range.y,
|
||||||
|
z: (Math.random() - 0.5) * range.z
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3.print("Center: ", center);
|
||||||
|
|
||||||
|
Script.setInterval(function () {
|
||||||
|
if (!Entities.serversExist() || !Entities.canRez() || (totalCreated > NUMBER_TO_CREATE)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var numToCreate = RATE_PER_SECOND * (SCRIPT_INTERVAL / 1000.0);
|
||||||
|
for (var i = 0; (i < numToCreate) && (totalCreated < NUMBER_TO_CREATE); i++) {
|
||||||
|
var position = Vec3.sum(center, randomVector({ x: RANGE, y: RANGE, z: RANGE }));
|
||||||
|
|
||||||
|
Vec3.print("Position: ", position);
|
||||||
|
Entities.addEntity({
|
||||||
|
type: TYPE,
|
||||||
|
modelURL: MODEL_URL,
|
||||||
|
name: "gridTest",
|
||||||
|
position: position,
|
||||||
|
dimensions: (TYPE == "Model") ? MODEL_DIMENSION : { x: SIZE, y: SIZE, z: SIZE },
|
||||||
|
color: { red: Math.random() * 255, green: Math.random() * 255, blue: Math.random() * 255 },
|
||||||
|
velocity: VELOCITY,
|
||||||
|
angularVelocity: Vec3.multiply(Math.random(), ANGULAR_VELOCITY),
|
||||||
|
damping: DAMPING,
|
||||||
|
angularDamping: ANGULAR_DAMPING,
|
||||||
|
gravity: (gravity ? GRAVITY : { x: 0, y: 0, z: 0}),
|
||||||
|
collisionsWillMove: collidable,
|
||||||
|
lifetime: LIFETIME
|
||||||
|
});
|
||||||
|
|
||||||
|
totalCreated++;
|
||||||
|
}
|
||||||
|
}, SCRIPT_INTERVAL);
|
||||||
|
|
102
examples/example/ui/energyBar.js
Normal file
102
examples/example/ui/energyBar.js
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
// energyBar.js
|
||||||
|
// examples/ui
|
||||||
|
//
|
||||||
|
// Created by Eric Levin on 1/4/15
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// This script adds an energy bar overlay which displays the amount of energy a user has left for grabbing and moving objects
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
Script.include("../../libraries/utils.js");
|
||||||
|
var energyColor = {red: 0, green: 200, blue: 0};
|
||||||
|
var lowEnergyColor = {red: 255, green: 0, blue: 0};
|
||||||
|
var totalWidth = 200;
|
||||||
|
var paddingRight = 50;
|
||||||
|
var xPosition = Window.innerWidth - totalWidth - paddingRight;
|
||||||
|
var lowEnergyThreshold = 0.3;
|
||||||
|
var currentEnergy = 1.0;
|
||||||
|
var energyLossRate = 0.003;
|
||||||
|
var energyChargeRate = 0.003;
|
||||||
|
var isGrabbing = false;
|
||||||
|
var refractoryPeriod = 2000;
|
||||||
|
|
||||||
|
var lastAvatarVelocity = MyAvatar.getVelocity();
|
||||||
|
var lastAvatarPosition = MyAvatar.position;
|
||||||
|
|
||||||
|
var background = Overlays.addOverlay("text", {
|
||||||
|
x: xPosition,
|
||||||
|
y: 20,
|
||||||
|
width: totalWidth,
|
||||||
|
height: 10,
|
||||||
|
backgroundColor: {red: 184, green: 181, blue: 178}
|
||||||
|
})
|
||||||
|
|
||||||
|
var bar = Overlays.addOverlay("text", {
|
||||||
|
x: xPosition,
|
||||||
|
y: 20,
|
||||||
|
width: totalWidth,
|
||||||
|
height: 10,
|
||||||
|
backgroundColor: energyColor
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Takes an energy value between 0 and 1 and sets energy bar width appropriately
|
||||||
|
function setEnergy(energy) {
|
||||||
|
energy = clamp(energy, 0, 1);
|
||||||
|
var barWidth = totalWidth * energy;
|
||||||
|
var color = energy <= lowEnergyThreshold ? lowEnergyColor: energyColor;
|
||||||
|
Overlays.editOverlay(bar, { width: barWidth, backgroundColor: color});
|
||||||
|
}
|
||||||
|
|
||||||
|
function avatarAccelerationEnergy() {
|
||||||
|
var AVATAR_MOVEMENT_ENERGY_CONSTANT = 0.001;
|
||||||
|
var velocity = MyAvatar.getVelocity();
|
||||||
|
var dV = Math.abs(Vec3.length(velocity) - Vec3.length(lastAvatarVelocity));
|
||||||
|
var dE = Vec3.length(lastAvatarVelocity) * dV * AVATAR_MOVEMENT_ENERGY_CONSTANT;
|
||||||
|
lastAvatarVelocity = velocity;
|
||||||
|
return dE;
|
||||||
|
}
|
||||||
|
|
||||||
|
function teleported() {
|
||||||
|
var MAX_AVATAR_MOVEMENT_PER_FRAME = 30.0;
|
||||||
|
var position = MyAvatar.position;
|
||||||
|
var dP = Vec3.length(Vec3.subtract(position, lastAvatarPosition));
|
||||||
|
lastAvatarPosition = position;
|
||||||
|
return (dP > MAX_AVATAR_MOVEMENT_PER_FRAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
function audioEnergy() {
|
||||||
|
var AUDIO_ENERGY_CONSTANT = 0.000001;
|
||||||
|
return MyAvatar.audioLoudness * AUDIO_ENERGY_CONSTANT;
|
||||||
|
}
|
||||||
|
|
||||||
|
function update() {
|
||||||
|
// refill energy
|
||||||
|
currentEnergy += energyChargeRate;
|
||||||
|
|
||||||
|
// Avatar acceleration
|
||||||
|
currentEnergy -= avatarAccelerationEnergy();
|
||||||
|
|
||||||
|
// Teleport cost
|
||||||
|
if (teleported()) {
|
||||||
|
currentEnergy = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Making sounds
|
||||||
|
currentEnergy -= audioEnergy();
|
||||||
|
|
||||||
|
|
||||||
|
currentEnergy = clamp(currentEnergy, 0, 1);
|
||||||
|
setEnergy(currentEnergy);
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleanup() {
|
||||||
|
Overlays.deleteOverlay(background);
|
||||||
|
Overlays.deleteOverlay(bar);
|
||||||
|
}
|
||||||
|
|
||||||
|
Script.update.connect(update);
|
||||||
|
Script.scriptEnding.connect(cleanup);
|
|
@ -297,3 +297,8 @@ calculateHandSizeRatio = function() {
|
||||||
var handSizeRatio = centerHandPoint/standardCenterHandPoint;
|
var handSizeRatio = centerHandPoint/standardCenterHandPoint;
|
||||||
return handSizeRatio;
|
return handSizeRatio;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clamp = function(val, min, max){
|
||||||
|
return Math.max(min, Math.min(max, val))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue