overte-HifiExperiments/examples/homeContent/plant/growingPlantEntityScript.js
2016-02-15 18:18:58 -08:00

135 lines
No EOL
4.7 KiB
JavaScript

//
// growingPlantEntityScript.js
// examples/homeContent/plant
//
// Created by Eric Levin on 2/10/16.
// Copyright 2016 High Fidelity, Inc.
//
// This entity script handles the logic for growing a plant when it has water poured on it
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
(function() {
Script.include("../../libraries/tween.js");
Script.include("../../libraries/utils.js");
var _this;
var TWEEN = loadTween();
GrowingPlant = function() {
_this = this;
_this.flowers = [];
_this.delay = 1000;
_this.MAX_CACTUS_Y_DIMENSION = 0.7;
_this.GROW_RATE = 0.001;
};
GrowingPlant.prototype = {
water: function() {
_this.cactusDimensions = Vec3.sum(_this.cactusDimensions, {x: 0, y: _this.GROW_RATE, z: 0});
if (_this.cactusDimensions.y > _this.MAX_CACTUS_Y_DIMENSION) {
// We don't want to grow our cactus any more than this or it will look bad
return;
}
// Need to raise up cactus as it stretches so it doesnt burst out the bottom of the plant
_this.cactusPosition = Vec3.sum(_this.cactusPosition, {x: 0, y: _this.cactusHeightMovement * 0.1, z: 0});
Entities.editEntity(_this.cactus, {dimensions: _this.cactusDimensions, position: _this.cactusPosition});
_this.flowers.forEach(_this.waterFlower);
},
waterFlower: function(flower) {
var props = Entities.getEntityProperties(flower, ["position, dimensions"]);
var newDimensions = Vec3.sum(props.dimensions, {x: randFloat(0, 0.0001), y: 0.001, z: randFloat(0, 0.0001)});
var newPosition = Vec3.sum(props.position, {x: 0, y: _this.flowerHeightMovement * 0.55, z: 0});
Entities.editEntity(flower, {dimensions: newDimensions, position: newPosition});
},
createFlowers: function() {
var size = 0.1;
var NUM_FLOWERS = 20
_this.startingFlowerDimensions = {
x: size,
y: 0.001,
z: size
};
_this.flowerHeightMovement = _this.startingFlowerDimensions.y;
for (var i = 0; i < NUM_FLOWERS; i++) {
var segment = i / NUM_FLOWERS * Math.PI * 2;
var radius = randFloat(0.13, 0.25);
var position = Vec3.sum(_this.position, {
x: radius * Math.cos(segment),
y: 0.16,
z: radius * Math.sin(segment)
});
_this.createFlower(position);
}
},
createFlower: function(position) {
var flowerUserData = {
ProceduralEntity: {
shaderUrl: "https://s3-us-west-1.amazonaws.com/hifi-content/eric/shaders/flower.fs",
uniforms: {
iBloomPct: randFloat(0.4, 0.8),
hueTwerking: randFloat(10, 30)
}
}
};
var flower = Entities.addEntity({
type: "Sphere",
name: "flower",
position: position,
dimensions: _this.startingFlowerDimensions,
userData: JSON.stringify(flowerUserData)
});
_this.flowers.push(flower);
},
createCactus: function() {
var MODEL_URL = "https://s3-us-west-1.amazonaws.com/hifi-content/eric/models/cactus.fbx"
_this.cactusDimensions = {
x: 0.09,
y: 0.01,
z: 0.09
};
_this.cactusHeightMovement = _this.cactusDimensions.y/2;
_this.cactusPosition = _this.position;
_this.cactus = Entities.addEntity({
type: "Model",
modelURL: MODEL_URL,
name: "cactus",
position: _this.cactusPosition,
dimensions: _this.cactusDimensions
});
},
preload: function(entityID) {
this.entityID = entityID;
this.props = Entities.getEntityProperties(this.entityID, ["position", "dimensions"]);
this.position = this.props.position;
this.dimensions = this.props.dimensions;
this.createCactus();
this.createFlowers();
},
unload: function() {
Entities.deleteEntity(_this.cactus);
_this.flowers.forEach(function(flower) {
Entities.deleteEntity(flower);
});
}
};
// entity scripts always need to return a newly constructed object of our type
return new GrowingPlant();
});