overte/examples/example/entities/makeHouses.js
2015-03-18 19:30:08 +01:00

161 lines
No EOL
5 KiB
JavaScript

//
// makeHouses.js
//
//
// Created by Stojce Slavkovski on March 14, 2015
// Copyright 2015 High Fidelity, Inc.
//
// This sample script that creates house entities based on parameters.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
(function () {
/** options **/
var numHouses = 100;
var xRange = 300;
var yRange = 300;
var sizeOfTheHouse = {
x: 10,
y: 10,
z: 10
};
/**/
//
// var modelUrl = "http://localhost/~stojce/models/3-Buildings-2-SanFranciscoHouse-";
// var modelurlExt = ".fbx";
// var modelVariations = 100;
var houseModels = [
"http://public.highfidelity.io/models/entities/3-Buildings-2-SanFranciscoHouseBlue.fbx",
"http://public.highfidelity.io/models/entities/3-Buildings-2-SanFranciscoHouseBlue3.fbx",
"http://public.highfidelity.io/models/entities/3-Buildings-2-SanFranciscoHouseGreen.fbx",
"http://public.highfidelity.io/models/entities/3-Buildings-2-SanFranciscoHouseGreen2.fbx",
"http://public.highfidelity.io/models/entities/3-Buildings-2-SanFranciscoHouseRed.fbx",
"http://public.highfidelity.io/models/entities/3-Buildings-2-SanFranciscoHouseRose.fbx",
"http://public.highfidelity.io/models/entities/3-Buildings-2-SanFranciscoHouseViolet.fbx",
"http://public.highfidelity.io/models/entities/3-Buildings-2-SanFranciscoHouseYellow.fbx",
"http://public.highfidelity.io/models/entities/3-Buildings-2-SanFranciscoHouseYellow2.fbx"
];
var houses = [];
function addHouseAt(position, rotation) {
// get random house model
//var modelNumber = 1 + Math.floor(Math.random() * (modelVariations - 1));
//var modelUrl = modelUrl + modelNumber + modelurlExt;
//print("Model ID:" + modelNumber);
var modelUrl = houseModels[Math.floor(Math.random() * houseModels.length)];
var properties = {
type: "Model",
position: position,
rotation: rotation,
dimensions: sizeOfTheHouse,
modelURL: modelUrl
};
return Entities.addEntity(properties);
}
// calculate initial position
var posX = MyAvatar.position.x - (xRange / 2);
var measures = calculateParcels(numHouses, xRange, yRange);
var dd = 0;
// avatar facing rotation
var rotEven = Quat.fromPitchYawRollDegrees(0, 270.0 + MyAvatar.bodyYaw, 0.0);
// avatar opposite rotation
var rotOdd = Quat.fromPitchYawRollDegrees(0, 90.0 + MyAvatar.bodyYaw, 0.0);
var housePos = Vec3.sum(MyAvatar.position, Quat.getFront(Camera.getOrientation()));
for (var j = 0; j < measures.rows; j++) {
var posX1 = 0 - (xRange / 2);
dd += measures.parcelLength;
for (var i = 0; i < measures.cols; i++) {
// skip reminder of houses
if (houses.length > numHouses) {
break;
}
var posShift = {
x: posX1,
y: 0,
z: dd
};
print("House nr.:" + (houses.length + 1));
houses.push(
addHouseAt(Vec3.sum(housePos, posShift), (j % 2 == 0) ? rotEven : rotOdd)
);
posX1 += measures.parcelWidth;
}
}
// calculate rows and columns in area, and dimension of single parcel
function calculateParcels(items, areaWidth, areaLength) {
var idealSize = Math.min(Math.sqrt(areaWidth * areaLength / items), areaWidth, areaLength);
var baseWidth = Math.min(Math.floor(areaWidth / idealSize), items);
var baseLength = Math.min(Math.floor(areaLength / idealSize), items);
var sirRows = baseWidth;
var sirCols = Math.ceil(items / sirRows);
var sirW = areaWidth / sirRows;
var sirL = areaLength / sirCols;
var visCols = baseLength;
var visRows = Math.ceil(items / visCols);
var visW = areaWidth / visRows;
var visL = areaLength / visCols;
var rows = 0;
var cols = 0;
var parcelWidth = 0;
var parcelLength = 0;
if (Math.min(sirW, sirL) > Math.min(visW, visL)) {
rows = sirRows;
cols = sirCols;
parcelWidth = sirW;
parcelLength = sirL;
} else {
rows = visRows;
cols = visCols;
parcelWidth = visW;
parcelLength = visL;
}
print("rows:" + rows);
print("cols:" + cols);
print("parcelWidth:" + parcelWidth);
print("parcelLength:" + parcelLength);
return {
rows: rows,
cols: cols,
parcelWidth: parcelWidth,
parcelLength: parcelLength
};
}
function cleanup() {
while (houses.length > 0) {
if (!houses[0].isKnownID) {
houses[0] = Entities.identifyEntity(houses[0]);
}
Entities.deleteEntity(houses.shift());
}
}
Script.scriptEnding.connect(cleanup);
})();