content/hifi-public/cozza13/solarsystem/app/Builder.js
Dale Glass 0d14e5a379 Initial data.
Needs a lot of cleanup. Data has been de-duplicated, and where identical copies existed, one of them
has been replaced with a symlink.

Some files have been excluded, such as binaries, installers and debug dumps. Some of that may still
be present.
2022-02-13 18:59:11 +01:00

297 lines
No EOL
9.3 KiB
JavaScript

//
// interface.js
//
// version 0.1
//
// Created by Victor Kislichenko, April 2015
//
// Presents the Builder for the stage script
//
// Icons downloaded from http://icons8.com/
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
StageBuilder = (function() {
//private: Calculators
var getCirclePoints = function(data)
{
if(data.limit <= 0 || data.limit > 360) data.limit = 360;
var result = [];
var rotateRad = data.rotate * (Math.PI/180);
var circleLimitRad = data.limit * (Math.PI/180);
for(var i = 0; i < data.pointsAmount+1; i++) {
var angleRad = circleLimitRad * i / data.pointsAmount;
//var angleDeg = angleRad * (180/Math.PI);
result.push({
x : data.center.x + data.radius * Math.cos(angleRad + rotateRad),
y : data.center.x + data.radius * Math.sin(angleRad + rotateRad),
});
}
return result;
}
var lineDistance = function(pointA, pointB)
{
var dist = {
x : Math.abs(pointA.x - pointB.x),
y : Math.abs(pointA.y - pointB.y),
}
return Math.sqrt(dist.x * dist.x + dist.y * dist.y);
}
var getBlocsFromPoints = function(points, options)
{
var result = [];
var gapFix = options.block_gapfix;
for(var i = 0; i < points.length-1; i++) {
var block = {
pointA : points[i],
pointB : points[i+1],
};
block.proportions = {
length : lineDistance(block.pointA, block.pointB) + gapFix,
};
block.pointCenter = {
x : (block.pointA.x + block.pointB.x) / 2,
y : (block.pointA.y + block.pointB.y) / 2,
}
block.rotation = Math.atan2(block.pointB.y - block.pointA.y,block.pointB.x - block.pointA.x);
block.rotationDeg = block.rotation * (180/Math.PI);
result.push(block);
}
return result;
}
function colorLuminance(hex, lum) {
// validate hex string
hex = String(hex).replace(/[^0-9a-f]/gi, '');
if (hex.length < 6) {
hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];
}
lum = lum || 0;
// convert to decimal and change luminosity
var rgb = "#", c, i;
for (i = 0; i < 3; i++) {
c = parseInt(hex.substr(i*2,2), 16);
c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);
rgb += ("00"+c).substr(c.length);
}
return rgb;
}
function hexToRgb(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
var getRandomInt = function(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
function normalizeDegrees(degrees) {
while (degrees > 180) degrees -= 360;
while (degrees < -180) degrees += 360;
return degrees;
}
//public
var that = {
options: {
levels : 5,
blocks : 20,
circle_radius: 5,
circle_limit: 180,
circle_rotate: 0,
block_height: 0.5,
block_depth: 2,
block_gapfix: 0.1,
block_script: '',
block_color_random: false,
block_color_base: "#E6E6E6",
},
};
that.calc = function() {
var result = [];
//get points
var circleConfig = {
pointsAmount : that.options.blocks,
radius : that.options.circle_radius,
limit: that.options.circle_limit,
rotate : that.options.circle_rotate,
center : {
x : 0,
y : 0,
},
};
//build all levels
for(var i = 0; i < that.options.levels; i++) {
var levelResult = {
level : i,
};
//get points
levelResult.points = getCirclePoints(circleConfig);
//get blocks
levelResult.blocs = getBlocsFromPoints(levelResult.points, that.options);
result.push(levelResult);
circleConfig.radius += that.options.block_depth-that.options.block_gapfix;
}
return result;
}
that.build = function()
{
if(!StageManager.managerEntity) return;
//delete existing blocks
that.clear();
//second: resize stage floor
var managerEntityDimensions = StageManager.managerEntity.entityProperties.dimensions;
managerEntityDimensions.x = that.options.circle_radius * 2;
managerEntityDimensions.z = that.options.circle_radius * 2;
StageManager.managerEntity.edit({dimensions: managerEntityDimensions});
//create blocks
var blueprint = that.calc();
//center
var center = {
x : StageManager.managerEntity.entityProperties.position.x,
y : StageManager.managerEntity.entityProperties.position.y,
z : StageManager.managerEntity.entityProperties.position.z,
};
//define identity checker
var entityIdentifier = new StageEntityIdentifier();
var blockColor = that.options.block_color_base;
var blockColorLum = -0.05 / that.options.levels;
for(var i in blueprint)
{
var level = blueprint[i];
var blockColorRGB = hexToRgb(blockColor);
if(that.options.block_color_random) {
var blockColorRGB = { r: getRandomInt(0,255), g: getRandomInt(0,255), b: getRandomInt(0,255) };
}
//draw blocks
for(var j in level.blocs)
{
var block = level.blocs[j];
var blockEntityProperties = {
type: "Box",
position : {
x: block.pointCenter.x + center.x,
z: block.pointCenter.y + center.z,
y: center.y + that.options.block_height * level.level,
},
registrationPoint: {x:0.5, y:0, z:0.5},
rotation : Quat.fromPitchYawRollRadians(0, -1*block.rotation, 0),
dimensions : {
x: block.proportions.length+that.options.block_gapfix,
y: that.options.block_height,
z: that.options.block_depth,
},
velocity: { x: 0, y: 0, z: 0 },
gravity: { x: 0, y: 0, z: 0 },
damping: 0,
color: { red: blockColorRGB.r, green: blockColorRGB.g, blue: blockColorRGB.b },
script : that.options.block_script,
userData : {
isStageBlock: true,
stageEntity : StageManager.managerEntity.entity,
},
};
var blockEntity = new StageEntity({
properties : blockEntityProperties,
// callback : {
// add : function() { print('add '+JSON.stringify(this)); },
// identify: function() {print('identify '+JSON.stringify(this));},
// },
});
entityIdentifier.entities.push(blockEntity);
}
if(blockColorLum !== 0) blockColor = colorLuminance(blockColor, blockColorLum);
}
//wait for identities and save blocks
entityIdentifier.process({
progress : function(identified, total){
StageInterface.webWindows.manage.emitScriptEvent({
type: 'action',
action: 'applyProgress',
identified : identified,
total: total,
});
},
done : function(){
var blocks = [];
for(var i in this.entities) {
blocks.push(this.entities[i].entity);
}
var userData = StageManager.getUserData();
userData.blocks = blocks;
StageManager.setUserData(userData);
StageInterface.webWindows.manage.emitScriptEvent({
type: 'action',
action: 'applied',
});
}
});
}
that.clear = function() {
if(!StageManager.managerEntity) return;
//delete from hf
var userData = StageManager.getUserData();
if(userData.blocks) {
for(var i in userData.blocks) {
//load and delete
new StageEntity({
entity : userData.blocks[i],
callback : {
load : function() {
this.remove();
},
},
});
}
}
/*
//delete from userData
userData.blocks = [];
StageManager.setUserData(userData);
*/
}
return that;
})()