800 lines
57 KiB
JavaScript
800 lines
57 KiB
JavaScript
/**
|
|
* Magic Spells
|
|
* @version 1.0.1
|
|
*/
|
|
|
|
(function () {
|
|
'use strict';
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Configuration
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
var MINIMUM_CAST_TIME = 0.2; // in seconds
|
|
var CASTING_SOUND_URL = 'https://cdn.rawgit.com/sos0/hi-fi/master/assets/cast.raw';
|
|
var CASTING_PARTICLE_TEXTURE_URL = 'http://hifi-production.s3.amazonaws.com/tutorials/particleFingers/smoke.png';
|
|
var DEFAULT_SPELL_SCRIPT_URLS = {
|
|
circle: 'https://gist.githubusercontent.com/AngeloYazar/b66e09e71ff8e9c85cf7f58fa2170ce7/raw/f620f2e99e98c40b45c1d029c771a5d4058510d8/teleport.js',
|
|
square: 'https://gist.githubusercontent.com/AngeloYazar/3d1c2484cd2c2045d93124e6a35f5f51/raw/0c7f3d63a0081099a2616e8f20c1f674c1887f29/shield.js',
|
|
triangle: 'https://gist.githubusercontent.com/AngeloYazar/630806a6cc2d02410e9bb6828261893f/raw/27dcf6b367b030044c36049f232abe9ec0a012cb/fireball.js',
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Shape Detector
|
|
//
|
|
// FULL LICENSE: https://raw.githubusercontent.com/MathieuLoutre/shape-detector/master/LICENSE
|
|
// The MIT License (MIT)
|
|
//
|
|
// Copyright (c) 2014 Mathieu Triay
|
|
//
|
|
// Original License: Copyright (C) 2007-2012, Jacob O. Wobbrock, Andrew D. Wilson and Yang Li.
|
|
// All rights reserved.
|
|
//
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
var ShapeDetector = (function () {
|
|
var _nbSamplePoints;
|
|
var _squareSize = 250;
|
|
var _phi = 0.5 * (-1.0 + Math.sqrt(5.0));
|
|
var _angleRange = deg2Rad(45.0);
|
|
var _anglePrecision = deg2Rad(2.0);
|
|
var _halfDiagonal = Math.sqrt(_squareSize * _squareSize + _squareSize * _squareSize) * 0.5;
|
|
var _origin = { x: 0, y: 0 };
|
|
|
|
function deg2Rad (d) {
|
|
|
|
return d * Math.PI / 180.0;
|
|
};
|
|
|
|
function getDistance (a, b) {
|
|
|
|
var dx = b.x - a.x;
|
|
var dy = b.y - a.y;
|
|
|
|
return Math.sqrt(dx * dx + dy * dy);
|
|
};
|
|
|
|
function Stroke (points, name) {
|
|
|
|
this.points = points;
|
|
this.name = name;
|
|
this.processStroke();
|
|
};
|
|
|
|
Stroke.prototype.processStroke = function () {
|
|
|
|
this.points = this.resample();
|
|
this.setCentroid();
|
|
this.points = this.rotateBy(-this.indicativeAngle());
|
|
this.points = this.scaleToSquare();
|
|
this.setCentroid();
|
|
this.points = this.translateToOrigin();
|
|
|
|
return this;
|
|
};
|
|
|
|
Stroke.prototype.resample = function () {
|
|
|
|
var localDistance, q;
|
|
var interval = this.strokeLength() / (_nbSamplePoints - 1);
|
|
var distance = 0.0;
|
|
var newPoints = [this.points[0]];
|
|
|
|
for (var i = 1; i < this.points.length; i++) {
|
|
localDistance = getDistance(this.points[i - 1], this.points[i]);
|
|
|
|
if (distance + localDistance >= interval) {
|
|
q = {
|
|
x: this.points[i - 1].x + ((interval - distance) / localDistance) * (this.points[i].x - this.points[i - 1].x),
|
|
y: this.points[i - 1].y + ((interval - distance) / localDistance) * (this.points[i].y - this.points[i - 1].y)
|
|
};
|
|
|
|
newPoints.push(q);
|
|
this.points.splice(i, 0, q);
|
|
distance = 0.0;
|
|
}
|
|
else {
|
|
distance += localDistance;
|
|
}
|
|
}
|
|
|
|
if (newPoints.length === _nbSamplePoints - 1) {
|
|
newPoints.push(this.points[this.points.length - 1]);
|
|
}
|
|
|
|
return newPoints;
|
|
};
|
|
|
|
Stroke.prototype.rotateBy = function (angle) {
|
|
|
|
var point;
|
|
var cos = Math.cos(angle);
|
|
var sin = Math.sin(angle);
|
|
var newPoints = [];
|
|
|
|
for (var i = 0; i < this.points.length; i++) {
|
|
point = this.points[i];
|
|
|
|
newPoints.push({
|
|
x: (point.x - this.c.x) * cos - (point.y - this.c.y) * sin + this.c.x,
|
|
y: (point.x - this.c.x) * sin + (point.y - this.c.y) * cos + this.c.y
|
|
});
|
|
}
|
|
|
|
return newPoints;
|
|
};
|
|
|
|
Stroke.prototype.scaleToSquare = function () {
|
|
|
|
var point;
|
|
var newPoints = []
|
|
var box = {
|
|
minX: +Infinity,
|
|
maxX: -Infinity,
|
|
minY: +Infinity,
|
|
maxY: -Infinity
|
|
};
|
|
|
|
for (var i = 0; i < this.points.length; i++) {
|
|
point = this.points[i];
|
|
|
|
box.minX = Math.min(box.minX, point.x);
|
|
box.minY = Math.min(box.minY, point.y);
|
|
box.maxX = Math.max(box.maxX, point.x);
|
|
box.maxY = Math.max(box.maxY, point.y);
|
|
}
|
|
|
|
box.width = box.maxX - box.minX;
|
|
box.height = box.maxY - box.minY;
|
|
|
|
for (i = 0; i < this.points.length; i++) {
|
|
point = this.points[i];
|
|
|
|
newPoints.push({
|
|
x: point.x * (_squareSize / box.width),
|
|
y: point.y * (_squareSize / box.height)
|
|
});
|
|
}
|
|
|
|
return newPoints;
|
|
};
|
|
|
|
Stroke.prototype.translateToOrigin = function (points) {
|
|
|
|
var point;
|
|
var newPoints = [];
|
|
|
|
for (var i = 0; i < this.points.length; i++) {
|
|
point = this.points[i];
|
|
|
|
newPoints.push({
|
|
x: point.x + _origin.x - this.c.x,
|
|
y: point.y + _origin.y - this.c.y
|
|
});
|
|
}
|
|
|
|
return newPoints;
|
|
};
|
|
|
|
Stroke.prototype.setCentroid = function () {
|
|
|
|
var point;
|
|
this.c = {
|
|
x: 0.0,
|
|
y: 0.0
|
|
};
|
|
|
|
for (var i = 0; i < this.points.length; i++) {
|
|
point = this.points[i];
|
|
|
|
this.c.x += point.x;
|
|
this.c.y += point.y;
|
|
}
|
|
|
|
this.c.x /= this.points.length;
|
|
this.c.y /= this.points.length;
|
|
|
|
return this;
|
|
};
|
|
|
|
Stroke.prototype.indicativeAngle = function () {
|
|
|
|
return Math.atan2(this.c.y - this.points[0].y, this.c.x - this.points[0].x);
|
|
};
|
|
|
|
Stroke.prototype.strokeLength = function () {
|
|
|
|
var d = 0.0;
|
|
|
|
for (var i = 1; i < this.points.length; i++) {
|
|
d += getDistance(this.points[i - 1], this.points[i]);
|
|
}
|
|
|
|
return d;
|
|
};
|
|
|
|
Stroke.prototype.distanceAtBestAngle = function (pattern) {
|
|
|
|
var a = -_angleRange;
|
|
var b = _angleRange;
|
|
var x1 = _phi * a + (1.0 - _phi) * b;
|
|
var f1 = this.distanceAtAngle(pattern, x1);
|
|
var x2 = (1.0 - _phi) * a + _phi * b;
|
|
var f2 = this.distanceAtAngle(pattern, x2);
|
|
|
|
while (Math.abs(b - a) > _anglePrecision) {
|
|
|
|
if (f1 < f2) {
|
|
b = x2;
|
|
x2 = x1;
|
|
f2 = f1;
|
|
x1 = _phi * a + (1.0 - _phi) * b;
|
|
f1 = this.distanceAtAngle(pattern, x1);
|
|
}
|
|
else {
|
|
a = x1;
|
|
x1 = x2;
|
|
f1 = f2;
|
|
x2 = (1.0 - _phi) * a + _phi * b;
|
|
f2 = this.distanceAtAngle(pattern, x2);
|
|
}
|
|
}
|
|
|
|
return Math.min(f1, f2);
|
|
};
|
|
|
|
Stroke.prototype.distanceAtAngle = function (pattern, angle) {
|
|
|
|
var strokePoints = this.rotateBy(angle);
|
|
var patternPoints = pattern.points;
|
|
var d = 0.0;
|
|
|
|
for (var i = 0; i < strokePoints.length; i++) {
|
|
d += getDistance(strokePoints[i], patternPoints[i]);
|
|
}
|
|
|
|
return d / strokePoints.length;
|
|
};
|
|
|
|
function ShapeDetector (patterns, options) {
|
|
|
|
options = options || {};
|
|
this.threshold = options.threshold || 0;
|
|
_nbSamplePoints = options.nbSamplePoints || 64;
|
|
|
|
this.patterns = [];
|
|
|
|
for (var i = 0; i < patterns.length; i++) {
|
|
this.learn(patterns[i].name, patterns[i].points);
|
|
}
|
|
}
|
|
|
|
ShapeDetector.defaultShapes = [
|
|
{
|
|
points: [{ x: 140.17500305175776, y: 420.52500915527327 }, { x: 157.69687843322748, y: 385.4812583923338 }, { x: 175.2187538146972, y: 350.4375076293944 }, { x: 192.7406291961669, y: 315.39375686645496 }, { x: 210.26250457763663, y: 280.3500061035155 }, { x: 227.78437995910636, y: 245.30625534057606 }, { x: 245.30625534057606, y: 210.26250457763663 }, { x: 262.8281307220458, y: 175.2187538146972 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 297.87188148498524, y: 175.2187538146972 }, { x: 315.39375686645496, y: 210.26250457763663 }, { x: 332.9156322479247, y: 245.30625534057606 }, { x: 350.4375076293944, y: 280.3500061035155 }, { x: 367.95938301086414, y: 315.39375686645496 }, { x: 385.4812583923338, y: 350.4375076293944 }, { x: 403.00313377380354, y: 385.4812583923338 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327}],
|
|
name: "triangle"
|
|
},
|
|
{
|
|
points: [{ x: 280.3500061035155, y: 140.17500305175776 }, { x: 297.87188148498524, y: 175.2187538146972 }, { x: 315.39375686645496, y: 210.26250457763663 }, { x: 332.9156322479247, y: 245.30625534057606 }, { x: 350.4375076293944, y: 280.3500061035155 }, { x: 367.95938301086414, y: 315.39375686645496 }, { x: 385.4812583923338, y: 350.4375076293944 }, { x: 403.00313377380354, y: 385.4812583923338 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 157.69687843322748, y: 385.4812583923338 }, { x: 175.2187538146972, y: 350.4375076293944 }, { x: 192.7406291961669, y: 315.39375686645496 }, { x: 210.26250457763663, y: 280.3500061035155 }, { x: 227.78437995910636, y: 245.30625534057606 }, { x: 245.30625534057606, y: 210.26250457763663 }, { x: 262.8281307220458, y: 175.2187538146972 }, { x: 280.3500061035155, y: 140.17500305175776}],
|
|
name: "triangle"
|
|
},
|
|
{
|
|
points: [{ x: 420.52500915527327, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 157.69687843322748, y: 385.4812583923338 }, { x: 175.2187538146972, y: 350.4375076293944 }, { x: 192.7406291961669, y: 315.39375686645496 }, { x: 210.26250457763663, y: 280.3500061035155 }, { x: 227.78437995910636, y: 245.30625534057606 }, { x: 245.30625534057606, y: 210.26250457763663 }, { x: 262.8281307220458, y: 175.2187538146972 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 297.87188148498524, y: 175.2187538146972 }, { x: 315.39375686645496, y: 210.26250457763663 }, { x: 332.9156322479247, y: 245.30625534057606 }, { x: 350.4375076293944, y: 280.3500061035155 }, { x: 367.95938301086414, y: 315.39375686645496 }, { x: 385.4812583923338, y: 350.4375076293944 }, { x: 403.00313377380354, y: 385.4812583923338 }, { x: 420.52500915527327, y: 420.52500915527327}],
|
|
name: "triangle"
|
|
},
|
|
{
|
|
points: [{ x: 140.17500305175776, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 403.00313377380354, y: 385.4812583923338 }, { x: 385.4812583923338, y: 350.4375076293944 }, { x: 367.9593830108641, y: 315.39375686645496 }, { x: 350.4375076293944, y: 280.3500061035155 }, { x: 332.9156322479247, y: 245.30625534057606 }, { x: 315.39375686645496, y: 210.26250457763663 }, { x: 297.87188148498524, y: 175.2187538146972 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 262.8281307220458, y: 175.2187538146972 }, { x: 245.30625534057606, y: 210.26250457763663 }, { x: 227.78437995910636, y: 245.30625534057606 }, { x: 210.26250457763663, y: 280.3500061035155 }, { x: 192.7406291961669, y: 315.39375686645496 }, { x: 175.2187538146972, y: 350.4375076293944 }, { x: 157.69687843322748, y: 385.4812583923338 }, { x: 140.17500305175776, y: 420.52500915527327}],
|
|
name: "triangle"
|
|
},
|
|
{
|
|
points: [{ x: 420.52500915527327, y: 420.52500915527327 }, { x: 403.00313377380354, y: 385.4812583923338 }, { x: 385.4812583923338, y: 350.4375076293944 }, { x: 367.9593830108641, y: 315.39375686645496 }, { x: 350.4375076293944, y: 280.3500061035155 }, { x: 332.9156322479247, y: 245.30625534057606 }, { x: 315.39375686645496, y: 210.26250457763663 }, { x: 297.87188148498524, y: 175.2187538146972 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 262.8281307220458, y: 175.2187538146972 }, { x: 245.30625534057606, y: 210.26250457763663 }, { x: 227.78437995910636, y: 245.30625534057606 }, { x: 210.26250457763663, y: 280.3500061035155 }, { x: 192.7406291961669, y: 315.39375686645496 }, { x: 175.2187538146972, y: 350.4375076293944 }, { x: 157.69687843322748, y: 385.4812583923338 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327}],
|
|
name: "triangle"
|
|
},
|
|
{
|
|
points: [{ x: 280.3500061035155, y: 140.17500305175776 }, { x: 262.8281307220458, y: 175.2187538146972 }, { x: 245.30625534057606, y: 210.26250457763663 }, { x: 227.78437995910636, y: 245.30625534057606 }, { x: 210.26250457763663, y: 280.3500061035155 }, { x: 192.7406291961669, y: 315.39375686645496 }, { x: 175.2187538146972, y: 350.4375076293944 }, { x: 157.69687843322748, y: 385.4812583923338 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 403.00313377380354, y: 385.4812583923338 }, { x: 385.4812583923338, y: 350.4375076293944 }, { x: 367.9593830108641, y: 315.39375686645496 }, { x: 350.4375076293944, y: 280.3500061035155 }, { x: 332.9156322479247, y: 245.30625534057606 }, { x: 315.39375686645496, y: 210.26250457763663 }, { x: 297.87188148498524, y: 175.2187538146972 }, { x: 280.3500061035155, y: 140.17500305175776}],
|
|
name: "triangle"
|
|
},
|
|
{
|
|
points: [{ x: 140.17500305175776, y: 140.17500305175776 }, { x: 175.2187538146972, y: 140.17500305175776 }, { x: 210.26250457763663, y: 140.17500305175776 }, { x: 245.30625534057606, y: 140.17500305175776 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 315.39375686645496, y: 140.17500305175776 }, { x: 350.4375076293944, y: 140.17500305175776 }, { x: 385.4812583923338, y: 140.17500305175776 }, { x: 420.52500915527327, y: 140.17500305175776 }, { x: 420.52500915527327, y: 140.17500305175776 }, { x: 420.52500915527327, y: 175.2187538146972 }, { x: 420.52500915527327, y: 210.26250457763663 }, { x: 420.52500915527327, y: 245.30625534057606 }, { x: 420.52500915527327, y: 280.3500061035155 }, { x: 420.52500915527327, y: 315.39375686645496 }, { x: 420.52500915527327, y: 350.4375076293944 }, { x: 420.52500915527327, y: 385.4812583923338 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 385.4812583923338 }, { x: 140.17500305175776, y: 350.4375076293944 }, { x: 140.17500305175776, y: 315.39375686645496 }, { x: 140.17500305175776, y: 280.3500061035155 }, { x: 140.17500305175776, y: 245.30625534057606 }, { x: 140.17500305175776, y: 210.26250457763663 }, { x: 140.17500305175776, y: 175.2187538146972 }, { x: 140.17500305175776, y: 140.17500305175776}],
|
|
name: "square"
|
|
},
|
|
{
|
|
points: [{ x: 420.52500915527327, y: 140.17500305175776 }, { x: 420.52500915527327, y: 175.2187538146972 }, { x: 420.52500915527327, y: 210.26250457763663 }, { x: 420.52500915527327, y: 245.30625534057606 }, { x: 420.52500915527327, y: 280.3500061035155 }, { x: 420.52500915527327, y: 315.39375686645496 }, { x: 420.52500915527327, y: 350.4375076293944 }, { x: 420.52500915527327, y: 385.4812583923338 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 385.4812583923338 }, { x: 140.17500305175776, y: 350.4375076293944 }, { x: 140.17500305175776, y: 315.39375686645496 }, { x: 140.17500305175776, y: 280.3500061035155 }, { x: 140.17500305175776, y: 245.30625534057606 }, { x: 140.17500305175776, y: 210.26250457763663 }, { x: 140.17500305175776, y: 175.2187538146972 }, { x: 140.17500305175776, y: 140.17500305175776 }, { x: 140.17500305175776, y: 140.17500305175776 }, { x: 175.2187538146972, y: 140.17500305175776 }, { x: 210.26250457763663, y: 140.17500305175776 }, { x: 245.30625534057606, y: 140.17500305175776 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 315.39375686645496, y: 140.17500305175776 }, { x: 350.4375076293944, y: 140.17500305175776 }, { x: 385.4812583923338, y: 140.17500305175776 }, { x: 420.52500915527327, y: 140.17500305175776}],
|
|
name: "square"
|
|
},
|
|
{
|
|
points: [{ x: 420.52500915527327, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 385.4812583923338 }, { x: 140.17500305175776, y: 350.4375076293944 }, { x: 140.17500305175776, y: 315.39375686645496 }, { x: 140.17500305175776, y: 280.3500061035155 }, { x: 140.17500305175776, y: 245.30625534057606 }, { x: 140.17500305175776, y: 210.26250457763663 }, { x: 140.17500305175776, y: 175.2187538146972 }, { x: 140.17500305175776, y: 140.17500305175776 }, { x: 140.17500305175776, y: 140.17500305175776 }, { x: 175.2187538146972, y: 140.17500305175776 }, { x: 210.26250457763663, y: 140.17500305175776 }, { x: 245.30625534057606, y: 140.17500305175776 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 315.39375686645496, y: 140.17500305175776 }, { x: 350.4375076293944, y: 140.17500305175776 }, { x: 385.4812583923338, y: 140.17500305175776 }, { x: 420.52500915527327, y: 140.17500305175776 }, { x: 420.52500915527327, y: 140.17500305175776 }, { x: 420.52500915527327, y: 175.2187538146972 }, { x: 420.52500915527327, y: 210.26250457763663 }, { x: 420.52500915527327, y: 245.30625534057606 }, { x: 420.52500915527327, y: 280.3500061035155 }, { x: 420.52500915527327, y: 315.39375686645496 }, { x: 420.52500915527327, y: 350.4375076293944 }, { x: 420.52500915527327, y: 385.4812583923338 }, { x: 420.52500915527327, y: 420.52500915527327}],
|
|
name: "square"
|
|
},
|
|
{
|
|
points: [{ x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 385.4812583923338 }, { x: 140.17500305175776, y: 350.4375076293944 }, { x: 140.17500305175776, y: 315.39375686645496 }, { x: 140.17500305175776, y: 280.3500061035155 }, { x: 140.17500305175776, y: 245.30625534057606 }, { x: 140.17500305175776, y: 210.26250457763663 }, { x: 140.17500305175776, y: 175.2187538146972 }, { x: 140.17500305175776, y: 140.17500305175776 }, { x: 140.17500305175776, y: 140.17500305175776 }, { x: 175.2187538146972, y: 140.17500305175776 }, { x: 210.26250457763663, y: 140.17500305175776 }, { x: 245.30625534057606, y: 140.17500305175776 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 315.39375686645496, y: 140.17500305175776 }, { x: 350.4375076293944, y: 140.17500305175776 }, { x: 385.4812583923338, y: 140.17500305175776 }, { x: 420.52500915527327, y: 140.17500305175776 }, { x: 420.52500915527327, y: 140.17500305175776 }, { x: 420.52500915527327, y: 175.2187538146972 }, { x: 420.52500915527327, y: 210.26250457763663 }, { x: 420.52500915527327, y: 245.30625534057606 }, { x: 420.52500915527327, y: 280.3500061035155 }, { x: 420.52500915527327, y: 315.39375686645496 }, { x: 420.52500915527327, y: 350.4375076293944 }, { x: 420.52500915527327, y: 385.4812583923338 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327}],
|
|
name: "square"
|
|
},
|
|
{
|
|
points: [{ x: 140.17500305175776, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 385.4812583923338 }, { x: 420.52500915527327, y: 350.4375076293944 }, { x: 420.52500915527327, y: 315.39375686645496 }, { x: 420.52500915527327, y: 280.3500061035155 }, { x: 420.52500915527327, y: 245.30625534057606 }, { x: 420.52500915527327, y: 210.26250457763663 }, { x: 420.52500915527327, y: 175.2187538146972 }, { x: 420.52500915527327, y: 140.17500305175776 }, { x: 420.52500915527327, y: 140.17500305175776 }, { x: 385.4812583923338, y: 140.17500305175776 }, { x: 350.4375076293944, y: 140.17500305175776 }, { x: 315.39375686645496, y: 140.17500305175776 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 245.30625534057606, y: 140.17500305175776 }, { x: 210.26250457763663, y: 140.17500305175776 }, { x: 175.2187538146972, y: 140.17500305175776 }, { x: 140.17500305175776, y: 140.17500305175776 }, { x: 140.17500305175776, y: 140.17500305175776 }, { x: 140.17500305175776, y: 175.2187538146972 }, { x: 140.17500305175776, y: 210.26250457763663 }, { x: 140.17500305175776, y: 245.30625534057606 }, { x: 140.17500305175776, y: 280.3500061035155 }, { x: 140.17500305175776, y: 315.39375686645496 }, { x: 140.17500305175776, y: 350.4375076293944 }, { x: 140.17500305175776, y: 385.4812583923338 }, { x: 140.17500305175776, y: 420.52500915527327}],
|
|
name: "square"
|
|
},
|
|
{
|
|
points: [{ x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 385.4812583923338 }, { x: 420.52500915527327, y: 350.4375076293944 }, { x: 420.52500915527327, y: 315.39375686645496 }, { x: 420.52500915527327, y: 280.3500061035155 }, { x: 420.52500915527327, y: 245.30625534057606 }, { x: 420.52500915527327, y: 210.26250457763663 }, { x: 420.52500915527327, y: 175.2187538146972 }, { x: 420.52500915527327, y: 140.17500305175776 }, { x: 420.52500915527327, y: 140.17500305175776 }, { x: 385.4812583923338, y: 140.17500305175776 }, { x: 350.4375076293944, y: 140.17500305175776 }, { x: 315.39375686645496, y: 140.17500305175776 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 245.30625534057606, y: 140.17500305175776 }, { x: 210.26250457763663, y: 140.17500305175776 }, { x: 175.2187538146972, y: 140.17500305175776 }, { x: 140.17500305175776, y: 140.17500305175776 }, { x: 140.17500305175776, y: 140.17500305175776 }, { x: 140.17500305175776, y: 175.2187538146972 }, { x: 140.17500305175776, y: 210.26250457763663 }, { x: 140.17500305175776, y: 245.30625534057606 }, { x: 140.17500305175776, y: 280.3500061035155 }, { x: 140.17500305175776, y: 315.39375686645496 }, { x: 140.17500305175776, y: 350.4375076293944 }, { x: 140.17500305175776, y: 385.4812583923338 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327}],
|
|
name: "square"
|
|
},
|
|
{
|
|
points: [{ x: 420.52500915527327, y: 140.17500305175776 }, { x: 385.4812583923338, y: 140.17500305175776 }, { x: 350.4375076293944, y: 140.17500305175776 }, { x: 315.39375686645496, y: 140.17500305175776 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 245.30625534057606, y: 140.17500305175776 }, { x: 210.26250457763663, y: 140.17500305175776 }, { x: 175.2187538146972, y: 140.17500305175776 }, { x: 140.17500305175776, y: 140.17500305175776 }, { x: 140.17500305175776, y: 140.17500305175776 }, { x: 140.17500305175776, y: 175.2187538146972 }, { x: 140.17500305175776, y: 210.26250457763663 }, { x: 140.17500305175776, y: 245.30625534057606 }, { x: 140.17500305175776, y: 280.3500061035155 }, { x: 140.17500305175776, y: 315.39375686645496 }, { x: 140.17500305175776, y: 350.4375076293944 }, { x: 140.17500305175776, y: 385.4812583923338 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 385.4812583923338 }, { x: 420.52500915527327, y: 350.4375076293944 }, { x: 420.52500915527327, y: 315.39375686645496 }, { x: 420.52500915527327, y: 280.3500061035155 }, { x: 420.52500915527327, y: 245.30625534057606 }, { x: 420.52500915527327, y: 210.26250457763663 }, { x: 420.52500915527327, y: 175.2187538146972 }, { x: 420.52500915527327, y: 140.17500305175776}],
|
|
name: "square"
|
|
},
|
|
{
|
|
points: [{ x: 140.17500305175776, y: 140.17500305175776 }, { x: 140.17500305175776, y: 175.2187538146972 }, { x: 140.17500305175776, y: 210.26250457763663 }, { x: 140.17500305175776, y: 245.30625534057606 }, { x: 140.17500305175776, y: 280.3500061035155 }, { x: 140.17500305175776, y: 315.39375686645496 }, { x: 140.17500305175776, y: 350.4375076293944 }, { x: 140.17500305175776, y: 385.4812583923338 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 140.17500305175776, y: 420.52500915527327 }, { x: 175.2187538146972, y: 420.52500915527327 }, { x: 210.26250457763663, y: 420.52500915527327 }, { x: 245.30625534057606, y: 420.52500915527327 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 315.39375686645496, y: 420.52500915527327 }, { x: 350.4375076293944, y: 420.52500915527327 }, { x: 385.4812583923338, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 420.52500915527327 }, { x: 420.52500915527327, y: 385.4812583923338 }, { x: 420.52500915527327, y: 350.4375076293944 }, { x: 420.52500915527327, y: 315.39375686645496 }, { x: 420.52500915527327, y: 280.3500061035155 }, { x: 420.52500915527327, y: 245.30625534057606 }, { x: 420.52500915527327, y: 210.26250457763663 }, { x: 420.52500915527327, y: 175.2187538146972 }, { x: 420.52500915527327, y: 140.17500305175776 }, { x: 420.52500915527327, y: 140.17500305175776 }, { x: 385.4812583923338, y: 140.17500305175776 }, { x: 350.4375076293944, y: 140.17500305175776 }, { x: 315.39375686645496, y: 140.17500305175776 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 245.30625534057606, y: 140.17500305175776 }, { x: 210.26250457763663, y: 140.17500305175776 }, { x: 175.2187538146972, y: 140.17500305175776 }, { x: 140.17500305175776, y: 140.17500305175776}],
|
|
name: "square"
|
|
},
|
|
{
|
|
points: [{ x: 420.52500915527327, y: 280.3500061035155 }, { x: 418.3954358873965, y: 304.69113993790967 }, { x: 412.07142208989444, y: 328.29268073795373 }, { x: 401.74511972189896, y: 350.43750762939436 }, { x: 387.73028825550034, y: 370.4527612529582 }, { x: 370.4527612529582, y: 387.73028825550034 }, { x: 350.4375076293944, y: 401.74511972189896 }, { x: 328.2926807379538, y: 412.07142208989444 }, { x: 304.69113993790967, y: 418.3954358873965 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 256.0088722691214, y: 418.3954358873965 }, { x: 232.4073314690773, y: 412.07142208989444 }, { x: 210.26250457763666, y: 401.74511972189896 }, { x: 190.2472509540728, y: 387.73028825550034 }, { x: 172.9697239515307, y: 370.4527612529582 }, { x: 158.95489248513206, y: 350.43750762939436 }, { x: 148.62859011713658, y: 328.2926807379538 }, { x: 142.30457631963455, y: 304.6911399379096 }, { x: 140.17500305175776, y: 280.3500061035155 }, { x: 142.30457631963455, y: 256.00887226912135 }, { x: 148.62859011713655, y: 232.4073314690773 }, { x: 158.9548924851321, y: 210.2625045776366 }, { x: 172.96972395153068, y: 190.2472509540728 }, { x: 190.24725095407277, y: 172.9697239515307 }, { x: 210.26250457763658, y: 158.95489248513212 }, { x: 232.40733146907718, y: 148.62859011713658 }, { x: 256.00887226912135, y: 142.30457631963455 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 304.6911399379096, y: 142.30457631963455 }, { x: 328.2926807379537, y: 148.62859011713653 }, { x: 350.4375076293944, y: 158.9548924851321 }, { x: 370.4527612529582, y: 172.96972395153068 }, { x: 387.73028825550034, y: 190.24725095407274 }, { x: 401.7451197218989, y: 210.26250457763658 }, { x: 412.07142208989444, y: 232.4073314690773 }, { x: 418.39543588739645, y: 256.00887226912124 }, { x: 420.52500915527327, y: 280.35000610351545}],
|
|
name: "circle"
|
|
},
|
|
{
|
|
points: [{ x: 420.52500915527327, y: 280.3500061035155 }, { x: 418.3954358873965, y: 256.00887226912135 }, { x: 412.07142208989444, y: 232.4073314690773 }, { x: 401.74511972189896, y: 210.26250457763666 }, { x: 387.73028825550034, y: 190.2472509540728 }, { x: 370.4527612529582, y: 172.96972395153068 }, { x: 350.4375076293944, y: 158.9548924851321 }, { x: 328.2926807379538, y: 148.62859011713658 }, { x: 304.69113993790967, y: 142.30457631963455 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 256.0088722691214, y: 142.30457631963455 }, { x: 232.4073314690773, y: 148.62859011713655 }, { x: 210.26250457763666, y: 158.95489248513206 }, { x: 190.2472509540728, y: 172.96972395153068 }, { x: 172.9697239515307, y: 190.24725095407277 }, { x: 158.95489248513206, y: 210.26250457763666 }, { x: 148.62859011713658, y: 232.40733146907723 }, { x: 142.30457631963455, y: 256.0088722691214 }, { x: 140.17500305175776, y: 280.3500061035155 }, { x: 142.30457631963455, y: 304.69113993790967 }, { x: 148.62859011713655, y: 328.29268073795373 }, { x: 158.9548924851321, y: 350.4375076293944 }, { x: 172.96972395153068, y: 370.4527612529582 }, { x: 190.24725095407277, y: 387.73028825550034 }, { x: 210.26250457763658, y: 401.7451197218989 }, { x: 232.40733146907718, y: 412.07142208989444 }, { x: 256.00887226912135, y: 418.3954358873965 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 304.6911399379096, y: 418.3954358873965 }, { x: 328.2926807379537, y: 412.0714220898945 }, { x: 350.4375076293944, y: 401.74511972189896 }, { x: 370.4527612529582, y: 387.73028825550034 }, { x: 387.73028825550034, y: 370.4527612529583 }, { x: 401.7451197218989, y: 350.4375076293944 }, { x: 412.07142208989444, y: 328.29268073795373 }, { x: 418.39543588739645, y: 304.6911399379098 }, { x: 420.52500915527327, y: 280.35000610351557}],
|
|
name: "circle"
|
|
},
|
|
{
|
|
points: [{ x: 140.17500305175776, y: 280.3500061035155 }, { x: 142.30457631963455, y: 256.00887226912135 }, { x: 148.62859011713655, y: 232.4073314690773 }, { x: 158.95489248513206, y: 210.26250457763666 }, { x: 172.96972395153068, y: 190.2472509540728 }, { x: 190.2472509540728, y: 172.96972395153068 }, { x: 210.2625045776366, y: 158.9548924851321 }, { x: 232.40733146907726, y: 148.62859011713658 }, { x: 256.00887226912135, y: 142.30457631963455 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 304.6911399379096, y: 142.30457631963455 }, { x: 328.29268073795373, y: 148.62859011713655 }, { x: 350.43750762939436, y: 158.95489248513206 }, { x: 370.4527612529582, y: 172.96972395153068 }, { x: 387.73028825550034, y: 190.24725095407277 }, { x: 401.74511972189896, y: 210.26250457763666 }, { x: 412.07142208989444, y: 232.40733146907723 }, { x: 418.3954358873965, y: 256.0088722691214 }, { x: 420.52500915527327, y: 280.3500061035155 }, { x: 418.3954358873965, y: 304.69113993790967 }, { x: 412.07142208989444, y: 328.29268073795373 }, { x: 401.74511972189896, y: 350.4375076293944 }, { x: 387.73028825550034, y: 370.4527612529582 }, { x: 370.4527612529582, y: 387.73028825550034 }, { x: 350.4375076293944, y: 401.7451197218989 }, { x: 328.29268073795384, y: 412.07142208989444 }, { x: 304.69113993790967, y: 418.3954358873965 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 256.0088722691214, y: 418.3954358873965 }, { x: 232.40733146907735, y: 412.0714220898945 }, { x: 210.2625045776366, y: 401.74511972189896 }, { x: 190.2472509540728, y: 387.73028825550034 }, { x: 172.9697239515307, y: 370.4527612529583 }, { x: 158.95489248513212, y: 350.4375076293944 }, { x: 148.62859011713655, y: 328.29268073795373 }, { x: 142.30457631963458, y: 304.6911399379098 }, { x: 140.17500305175776, y: 280.35000610351557}],
|
|
name: "circle"
|
|
},
|
|
{
|
|
points: [{ x: 140.17500305175776, y: 280.3500061035155 }, { x: 142.30457631963455, y: 304.69113993790967 }, { x: 148.62859011713655, y: 328.29268073795373 }, { x: 158.95489248513206, y: 350.43750762939436 }, { x: 172.96972395153068, y: 370.4527612529582 }, { x: 190.2472509540728, y: 387.73028825550034 }, { x: 210.2625045776366, y: 401.74511972189896 }, { x: 232.40733146907726, y: 412.07142208989444 }, { x: 256.00887226912135, y: 418.3954358873965 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 304.6911399379096, y: 418.3954358873965 }, { x: 328.29268073795373, y: 412.07142208989444 }, { x: 350.43750762939436, y: 401.74511972189896 }, { x: 370.4527612529582, y: 387.73028825550034 }, { x: 387.73028825550034, y: 370.4527612529582 }, { x: 401.74511972189896, y: 350.43750762939436 }, { x: 412.07142208989444, y: 328.2926807379538 }, { x: 418.3954358873965, y: 304.6911399379096 }, { x: 420.52500915527327, y: 280.3500061035155 }, { x: 418.3954358873965, y: 256.00887226912135 }, { x: 412.07142208989444, y: 232.4073314690773 }, { x: 401.74511972189896, y: 210.2625045776366 }, { x: 387.73028825550034, y: 190.2472509540728 }, { x: 370.4527612529582, y: 172.9697239515307 }, { x: 350.4375076293944, y: 158.95489248513212 }, { x: 328.29268073795384, y: 148.62859011713658 }, { x: 304.69113993790967, y: 142.30457631963455 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 256.0088722691214, y: 142.30457631963455 }, { x: 232.40733146907735, y: 148.62859011713653 }, { x: 210.2625045776366, y: 158.9548924851321 }, { x: 190.2472509540728, y: 172.96972395153068 }, { x: 172.9697239515307, y: 190.24725095407274 }, { x: 158.95489248513212, y: 210.26250457763658 }, { x: 148.62859011713655, y: 232.4073314690773 }, { x: 142.30457631963458, y: 256.00887226912124 }, { x: 140.17500305175776, y: 280.35000610351545}],
|
|
name: "circle"
|
|
},
|
|
{
|
|
points: [{ x: 280.3500061035155, y: 420.52500915527327 }, { x: 304.6911399379096, y: 418.3954358873965 }, { x: 328.29268073795373, y: 412.07142208989444 }, { x: 350.43750762939436, y: 401.74511972189896 }, { x: 370.4527612529582, y: 387.73028825550034 }, { x: 387.73028825550034, y: 370.4527612529582 }, { x: 401.74511972189896, y: 350.43750762939436 }, { x: 412.07142208989444, y: 328.2926807379538 }, { x: 418.3954358873965, y: 304.6911399379096 }, { x: 420.52500915527327, y: 280.3500061035155 }, { x: 418.3954358873965, y: 256.00887226912135 }, { x: 412.07142208989444, y: 232.4073314690773 }, { x: 401.74511972189896, y: 210.2625045776366 }, { x: 387.73028825550034, y: 190.2472509540728 }, { x: 370.4527612529582, y: 172.9697239515307 }, { x: 350.4375076293944, y: 158.95489248513212 }, { x: 328.29268073795384, y: 148.62859011713658 }, { x: 304.69113993790967, y: 142.30457631963455 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 256.0088722691214, y: 142.30457631963455 }, { x: 232.40733146907735, y: 148.62859011713653 }, { x: 210.2625045776366, y: 158.9548924851321 }, { x: 190.2472509540728, y: 172.96972395153068 }, { x: 172.9697239515307, y: 190.24725095407274 }, { x: 158.95489248513212, y: 210.26250457763658 }, { x: 148.62859011713655, y: 232.4073314690773 }, { x: 142.30457631963458, y: 256.00887226912124 }, { x: 140.17500305175776, y: 280.35000610351545 }, { x: 142.30457631963455, y: 304.6911399379096 }, { x: 148.62859011713658, y: 328.2926807379538 }, { x: 158.954892485132, y: 350.4375076293943 }, { x: 172.96972395153068, y: 370.4527612529582 }, { x: 190.24725095407274, y: 387.7302882555003 }, { x: 210.26250457763666, y: 401.74511972189896 }, { x: 232.40733146907718, y: 412.07142208989444 }, { x: 256.00887226912135, y: 418.3954358873965 }, { x: 280.35000610351545, y: 420.52500915527327}],
|
|
name: "circle"
|
|
},
|
|
{
|
|
points: [{ x: 280.3500061035155, y: 140.17500305175776 }, { x: 304.6911399379096, y: 142.30457631963455 }, { x: 328.29268073795373, y: 148.62859011713655 }, { x: 350.43750762939436, y: 158.95489248513206 }, { x: 370.4527612529582, y: 172.96972395153068 }, { x: 387.73028825550034, y: 190.24725095407277 }, { x: 401.74511972189896, y: 210.26250457763666 }, { x: 412.07142208989444, y: 232.40733146907723 }, { x: 418.3954358873965, y: 256.0088722691214 }, { x: 420.52500915527327, y: 280.3500061035155 }, { x: 418.3954358873965, y: 304.69113993790967 }, { x: 412.07142208989444, y: 328.29268073795373 }, { x: 401.74511972189896, y: 350.4375076293944 }, { x: 387.73028825550034, y: 370.4527612529582 }, { x: 370.4527612529582, y: 387.73028825550034 }, { x: 350.4375076293944, y: 401.7451197218989 }, { x: 328.29268073795384, y: 412.07142208989444 }, { x: 304.69113993790967, y: 418.3954358873965 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 256.0088722691214, y: 418.3954358873965 }, { x: 232.40733146907735, y: 412.0714220898945 }, { x: 210.2625045776366, y: 401.74511972189896 }, { x: 190.2472509540728, y: 387.73028825550034 }, { x: 172.9697239515307, y: 370.4527612529583 }, { x: 158.95489248513212, y: 350.4375076293944 }, { x: 148.62859011713655, y: 328.29268073795373 }, { x: 142.30457631963458, y: 304.6911399379098 }, { x: 140.17500305175776, y: 280.35000610351557 }, { x: 142.30457631963455, y: 256.0088722691214 }, { x: 148.62859011713658, y: 232.40733146907723 }, { x: 158.954892485132, y: 210.26250457763672 }, { x: 172.96972395153068, y: 190.2472509540728 }, { x: 190.24725095407274, y: 172.96972395153074 }, { x: 210.26250457763666, y: 158.95489248513206 }, { x: 232.40733146907718, y: 148.6285901171366 }, { x: 256.00887226912135, y: 142.30457631963455 }, { x: 280.35000610351545, y: 140.17500305175776}],
|
|
name: "circle"
|
|
},
|
|
{
|
|
points: [{ x: 280.3500061035155, y: 140.17500305175776 }, { x: 256.0088722691214, y: 142.30457631963455 }, { x: 232.4073314690773, y: 148.62859011713655 }, { x: 210.26250457763666, y: 158.95489248513206 }, { x: 190.2472509540728, y: 172.96972395153068 }, { x: 172.9697239515307, y: 190.24725095407277 }, { x: 158.95489248513206, y: 210.26250457763666 }, { x: 148.62859011713658, y: 232.40733146907723 }, { x: 142.30457631963455, y: 256.0088722691214 }, { x: 140.17500305175776, y: 280.3500061035155 }, { x: 142.30457631963455, y: 304.69113993790967 }, { x: 148.62859011713655, y: 328.29268073795373 }, { x: 158.9548924851321, y: 350.4375076293944 }, { x: 172.96972395153068, y: 370.4527612529582 }, { x: 190.24725095407277, y: 387.73028825550034 }, { x: 210.26250457763658, y: 401.7451197218989 }, { x: 232.40733146907718, y: 412.07142208989444 }, { x: 256.00887226912135, y: 418.3954358873965 }, { x: 280.3500061035155, y: 420.52500915527327 }, { x: 304.6911399379096, y: 418.3954358873965 }, { x: 328.2926807379537, y: 412.0714220898945 }, { x: 350.4375076293944, y: 401.74511972189896 }, { x: 370.4527612529582, y: 387.73028825550034 }, { x: 387.73028825550034, y: 370.4527612529583 }, { x: 401.7451197218989, y: 350.4375076293944 }, { x: 412.07142208989444, y: 328.29268073795373 }, { x: 418.39543588739645, y: 304.6911399379098 }, { x: 420.52500915527327, y: 280.35000610351557 }, { x: 418.3954358873965, y: 256.0088722691214 }, { x: 412.07142208989444, y: 232.40733146907723 }, { x: 401.745119721899, y: 210.26250457763672 }, { x: 387.73028825550034, y: 190.2472509540728 }, { x: 370.4527612529583, y: 172.96972395153074 }, { x: 350.43750762939436, y: 158.95489248513206 }, { x: 328.29268073795384, y: 148.6285901171366 }, { x: 304.69113993790967, y: 142.30457631963455 }, { x: 280.35000610351557, y: 140.17500305175776}],
|
|
name: "circle"
|
|
},
|
|
{
|
|
points: [{ x: 280.3500061035155, y: 420.52500915527327 }, { x: 256.0088722691214, y: 418.3954358873965 }, { x: 232.4073314690773, y: 412.07142208989444 }, { x: 210.26250457763666, y: 401.74511972189896 }, { x: 190.2472509540728, y: 387.73028825550034 }, { x: 172.9697239515307, y: 370.4527612529582 }, { x: 158.95489248513206, y: 350.43750762939436 }, { x: 148.62859011713658, y: 328.2926807379538 }, { x: 142.30457631963455, y: 304.6911399379096 }, { x: 140.17500305175776, y: 280.3500061035155 }, { x: 142.30457631963455, y: 256.00887226912135 }, { x: 148.62859011713655, y: 232.4073314690773 }, { x: 158.9548924851321, y: 210.2625045776366 }, { x: 172.96972395153068, y: 190.2472509540728 }, { x: 190.24725095407277, y: 172.9697239515307 }, { x: 210.26250457763658, y: 158.95489248513212 }, { x: 232.40733146907718, y: 148.62859011713658 }, { x: 256.00887226912135, y: 142.30457631963455 }, { x: 280.3500061035155, y: 140.17500305175776 }, { x: 304.6911399379096, y: 142.30457631963455 }, { x: 328.2926807379537, y: 148.62859011713653 }, { x: 350.4375076293944, y: 158.9548924851321 }, { x: 370.4527612529582, y: 172.96972395153068 }, { x: 387.73028825550034, y: 190.24725095407274 }, { x: 401.7451197218989, y: 210.26250457763658 }, { x: 412.07142208989444, y: 232.4073314690773 }, { x: 418.39543588739645, y: 256.00887226912124 }, { x: 420.52500915527327, y: 280.35000610351545 }, { x: 418.3954358873965, y: 304.6911399379096 }, { x: 412.07142208989444, y: 328.2926807379538 }, { x: 401.745119721899, y: 350.4375076293943 }, { x: 387.73028825550034, y: 370.4527612529582 }, { x: 370.4527612529583, y: 387.7302882555003 }, { x: 350.43750762939436, y: 401.74511972189896 }, { x: 328.29268073795384, y: 412.07142208989444 }, { x: 304.69113993790967, y: 418.3954358873965 }, { x: 280.35000610351557, y: 420.52500915527327}],
|
|
name: "circle"
|
|
}
|
|
];
|
|
|
|
ShapeDetector.prototype.spot = function (points, patternName) {
|
|
|
|
if (patternName == null) {
|
|
patternName = '';
|
|
}
|
|
|
|
var distance, pattern, score;
|
|
var stroke = new Stroke(points);
|
|
var bestDistance = +Infinity;
|
|
var bestPattern = null;
|
|
var bestScore = 0;
|
|
|
|
for (var i = 0; i < this.patterns.length; i++) {
|
|
pattern = this.patterns[i];
|
|
|
|
if (pattern.name.indexOf(patternName) > -1) {
|
|
distance = stroke.distanceAtBestAngle(pattern);
|
|
score = 1.0 - distance / _halfDiagonal;
|
|
|
|
if (distance < bestDistance && score > this.threshold) {
|
|
bestDistance = distance;
|
|
bestPattern = pattern.name;
|
|
bestScore = score;
|
|
}
|
|
}
|
|
}
|
|
|
|
return { pattern: bestPattern, score: bestScore };
|
|
};
|
|
|
|
ShapeDetector.prototype.learn = function (name, points) {
|
|
|
|
return this.patterns.push(new Stroke(points, name));
|
|
};
|
|
|
|
return ShapeDetector;
|
|
})();
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Utils
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
/**
|
|
* Try to parse a JSON string, return a default value or an empty object
|
|
* if parseing fails.
|
|
* @param {string} data - data to be parsed
|
|
* @param {object} [defaultValue] - value to be returned in case of a failed parse
|
|
* @returns {object}
|
|
*/
|
|
var parseJSON = function (data, defaultValue) {
|
|
try {
|
|
return JSON.parse(data);
|
|
} catch (e) {
|
|
return defaultValue || {};
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Simple prefixed log function
|
|
*/
|
|
var log = function (message) {
|
|
print('MagicSpells: ' + message);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Magic Spells
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
var MagicSpells = {};
|
|
|
|
/**
|
|
* Initalizes the MagicSpells object. This is called in main()
|
|
*/
|
|
MagicSpells.init = function () {
|
|
this.isEnabled = true;
|
|
this.isCasting = false;
|
|
this.positions = [];
|
|
this.spellcastEntities = [];
|
|
this.particleEntities = [];
|
|
this.shapeDetector = new ShapeDetector(ShapeDetector.defaultShapes);
|
|
|
|
// Spell Book
|
|
this.spellbook = {
|
|
circle: function () {},
|
|
triangle: function () {},
|
|
square: function () {}
|
|
};
|
|
|
|
// Spell Tracing Particle Properties
|
|
this.particleProperties = {
|
|
type: 'ParticleEffect',
|
|
parentID: MyAvatar.sessionUUID,
|
|
color: {
|
|
red: 125,
|
|
green: 125,
|
|
blue: 125
|
|
},
|
|
isEmitting: 1,
|
|
maxParticles: 1000,
|
|
lifespan: 20,
|
|
emitRate: 1000,
|
|
emitSpeed: 0,
|
|
speedSpread: 0,
|
|
emitOrientation: {
|
|
x: -0.7035577893257141,
|
|
y: -0.000015259007341228426,
|
|
z: -0.000015259007341228426,
|
|
w: 0.7106381058692932
|
|
},
|
|
emitRadiusStart: 1,
|
|
polarStart: 0,
|
|
polarFinish: 0,
|
|
azimuthFinish: 3.1415927410125732,
|
|
emitAcceleration: {
|
|
x: 0,
|
|
y: 0,
|
|
z: 0
|
|
},
|
|
accelerationSpread: {
|
|
x: 0,
|
|
y: 0,
|
|
z: 0
|
|
},
|
|
particleRadius: 0.014999999888241291,
|
|
radiusSpread: 1,
|
|
radiusStart: 0.03000000474974513,
|
|
radiusFinish: 0.0020000000474974513,
|
|
colorSpread: {
|
|
red: 125,
|
|
green: 125,
|
|
blue: 125
|
|
},
|
|
colorStart: {
|
|
red: 20,
|
|
green: 20,
|
|
blue: 100
|
|
},
|
|
colorFinish: {
|
|
red: 125,
|
|
green: 125,
|
|
blue: 125
|
|
},
|
|
alpha: 1,
|
|
alphaSpread: 0,
|
|
alphaStart: 1,
|
|
alphaFinish: 0,
|
|
emitterShouldTrail: true,
|
|
textures: CASTING_PARTICLE_TEXTURE_URL,
|
|
lifetime: 3600
|
|
};
|
|
};
|
|
|
|
|
|
/**
|
|
* Creates and Attaches a Magical Bracelet, this is currently unused.
|
|
*/
|
|
MagicSpells.attachBracelet = function () {
|
|
var MODEL_URL = 'https://dl.dropboxusercontent.com/s/sfrzxubqzpp6u1n/bracelet.fbx';
|
|
MyAvatar.attach(MODEL_URL, 'RightForeArm', {x: 0.020, y: 0.180, z: -0.005}, Quat.fromPitchYawRollDegrees(-149, 0, 100), 0.1);
|
|
};
|
|
|
|
/**
|
|
* Adds the spell tracing particle emitter to the right hand of the avatar.
|
|
*/
|
|
MagicSpells.addEmitterAtRightHand = function () {
|
|
var PARICLE_NAME_BASE = 'spawnedSpellParticle';
|
|
var jointName = 'RightHandIndex3';
|
|
|
|
var jointID = MyAvatar.jointNames.indexOf(jointName);
|
|
this.particleProperties.name = PARICLE_NAME_BASE + jointName;
|
|
this.particleProperties.parentJointIndex = jointID;
|
|
this.particleProperties.parentID = MyAvatar.sessionUUID;
|
|
|
|
var emitter = Entities.addEntity(this.particleProperties);
|
|
this.particleEntities.push(emitter);
|
|
};
|
|
|
|
/**
|
|
* Deletes all emitters created by MagicSpells
|
|
*/
|
|
MagicSpells.deleteAllEmitters = function () {
|
|
for (var i = 0; i < this.particleEntities.length; i++) {
|
|
Entities.deleteEntity(this.particleEntities[i]);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Casts a spell
|
|
* @param {string} shape - The string name of the shape pattern that is being cast.
|
|
*/
|
|
MagicSpells.cast = function (shape) {
|
|
if (typeof this.spellbook[shape] === 'function') {
|
|
var rightPalmPosition = MyAvatar.getRightPalmPosition();
|
|
var centeredRightPalm = Vec3.sum(Vec3.multiply(0.25, Quat.getFront(MyAvatar.orientation)), rightPalmPosition);
|
|
var forwardVec = Quat.getFront(MyAvatar.orientation);
|
|
forwardVec = Vec3.normalize(forwardVec);
|
|
var lookVec = Quat.getFront(MyAvatar.headOrientation);
|
|
lookVec = Vec3.normalize(lookVec);
|
|
|
|
this.spellbook[shape]({
|
|
castPosition: centeredRightPalm,
|
|
forward: forwardVec,
|
|
look: lookVec,
|
|
shape: shape
|
|
});
|
|
} else {
|
|
log('Failed to cast ' + shape + '. No associated script.');
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Called when the user begins casting.
|
|
* This plays a sound and attaches an emitter.
|
|
*/
|
|
MagicSpells.onCastingBegan = function () {
|
|
this.castTime = Date.now();
|
|
var castingSound = SoundCache.getSound(CASTING_SOUND_URL);
|
|
|
|
Audio.playSound(castingSound, {
|
|
position: MyAvatar.getRightPalmPosition(),
|
|
volume: 0.1
|
|
});
|
|
this.addEmitterAtRightHand();
|
|
};
|
|
|
|
/**
|
|
* Called every step during a cast.
|
|
* This tracks the position of the right hand over time.
|
|
*/
|
|
MagicSpells.onCastingUpdate = function () {
|
|
var position = MyAvatar.getRightHandPosition();
|
|
this.positions.push(position);
|
|
};
|
|
|
|
/**
|
|
* Called at the end of a cast.
|
|
* This detects the traced shape and calls cast()
|
|
*/
|
|
MagicSpells.onCastingEnded = function () {
|
|
if (Date.now() - this.castTime > MINIMUM_CAST_TIME) {
|
|
var shape = this.shapeDetector.spot(this.positions);
|
|
|
|
if (shape.score > 0.6) {
|
|
this.cast(shape.pattern);
|
|
}
|
|
}
|
|
|
|
this.reset();
|
|
}
|
|
|
|
/**
|
|
* update() is called every frame.
|
|
* This triggers the casting events.
|
|
*/
|
|
MagicSpells.update = function () {
|
|
if (this.isEnabled) {
|
|
this.triggerValue = Controller.getValue(Controller.Standard.RT);
|
|
|
|
if (this.triggerValue > 0.6) {
|
|
if (!this.isCasting) {
|
|
this.isCasting = true;
|
|
this.onCastingBegan();
|
|
}
|
|
this.onCastingUpdate();
|
|
} else if (this.isCasting) {
|
|
this.isCasting = false;
|
|
this.onCastingEnded();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Resets the casting state and removes all emitters
|
|
*/
|
|
MagicSpells.reset = function () {
|
|
this.positions = [];
|
|
this.deleteAllEmitters();
|
|
};
|
|
|
|
/**
|
|
* Enables casting
|
|
*/
|
|
MagicSpells.enable = function () {
|
|
if (!this.isEnabled) {
|
|
this.isEnabled = true;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Disables casting
|
|
*/
|
|
MagicSpells.disable = function () {
|
|
if (this.isEnabled) {
|
|
this.reset();
|
|
this.isCasting = false;
|
|
this.isEnabled = false;
|
|
}
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Main
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
/**
|
|
* main is the entry point for Magic Spells and handles
|
|
* all of the required initialization.
|
|
*/
|
|
var main = function () {
|
|
MagicSpells.init();
|
|
|
|
var systemToolbar = Toolbars.getToolbar('com.highfidelity.interface.toolbar.system');
|
|
var systemPath = Script.resolvePath('file:///~/system/');
|
|
var url = Script.resolvePath('./html/spellbook.html') + '#' + systemPath;
|
|
var spellsWindowVisible = false;
|
|
var spellsWindowListeners = {};
|
|
var spellUrls = {};
|
|
|
|
var spellsToolbarButton = systemToolbar.addButton({
|
|
objectName: 'spellbook',
|
|
imageURL: Script.resolvePath('./assets/images/tools/spells.svg'),
|
|
visible: true,
|
|
alpha: 0.9,
|
|
buttonState: 1,
|
|
hoverState: 3,
|
|
defaultState: 1
|
|
});
|
|
|
|
var spellsWindow = new OverlayWebWindow({
|
|
title: 'Magic Spells',
|
|
source: url,
|
|
width: 300,
|
|
height: 450,
|
|
visible: spellsWindowVisible
|
|
});
|
|
|
|
spellsWindow.webEventReceived.connect(function (data) {
|
|
var event = parseJSON(data);
|
|
if (spellsWindowListeners[event.type]) {
|
|
spellsWindowListeners[event.type](event);
|
|
}
|
|
});
|
|
|
|
var emit = function (eventType, data) {
|
|
data = data || {};
|
|
data.type = eventType;
|
|
spellsWindow.emitScriptEvent(JSON.stringify(data));
|
|
};
|
|
|
|
// Called when the web window is done loading
|
|
spellsWindowListeners.loaded = function (event) {
|
|
var enabled = Settings.getValue('com.magicspells.enabled', true);
|
|
spellUrls = Settings.getValue('com.magicspells.spells', DEFAULT_SPELL_SCRIPT_URLS);
|
|
|
|
emit('init', {
|
|
enabled: enabled,
|
|
spellUrls: spellUrls
|
|
});
|
|
};
|
|
|
|
// Called when a user clicks the 'Update' button
|
|
spellsWindowListeners.update = function (event) {
|
|
var spells = event.spells || [];
|
|
var results = {};
|
|
|
|
for (i in spells) {
|
|
var spell = spells[i];
|
|
var shape = spell.key;
|
|
var code = spell.data;
|
|
var spellFunction = false;
|
|
|
|
if (code) {
|
|
var wrappedCode = '(function (context) { ' + code + ' })';
|
|
spellFunction = Script.evaluate(wrappedCode, shape + '.js', 0);
|
|
}
|
|
|
|
if (spellFunction) {
|
|
MagicSpells.spellbook[shape] = spellFunction;
|
|
results[shape] = 'success';
|
|
} else {
|
|
log('Failed to load script for ' + shape);
|
|
MagicSpells.spellbook[shape] = false;
|
|
results[shape] = 'failure';
|
|
}
|
|
|
|
spellUrls[shape] = spell.url;
|
|
}
|
|
|
|
emit('updateComplete', {
|
|
results: results
|
|
});
|
|
|
|
Settings.setValue('com.magicspells.spells', spellUrls);
|
|
};
|
|
|
|
// Called when a user clicks the 'Enabled' checkbox
|
|
spellsWindowListeners.enable = function (event) {
|
|
if (event.value) {
|
|
MagicSpells.enable();
|
|
} else {
|
|
MagicSpells.disable();
|
|
}
|
|
|
|
Settings.setValue('com.magicspells.enabled', MagicSpells.isEnabled);
|
|
};
|
|
|
|
function onSpellsToolbarButtonClicked () {
|
|
if (spellsWindowVisible) {
|
|
spellsWindow.setVisible(false);
|
|
} else {
|
|
spellsWindow.setVisible(true);
|
|
}
|
|
}
|
|
|
|
var onSpellsWindowVisibilityChanged = function () {
|
|
spellsToolbarButton.writeProperty('buttonState', spellsWindow.visible ? 0 : 1);
|
|
spellsToolbarButton.writeProperty('defaultState', spellsWindow.visible ? 0 : 1);
|
|
spellsToolbarButton.writeProperty('hoverState', spellsWindow.visible ? 2 : 3);
|
|
spellsWindowVisible = spellsWindow.visible;
|
|
};
|
|
|
|
onSpellsWindowVisibilityChanged();
|
|
|
|
spellsToolbarButton.clicked.connect(onSpellsToolbarButtonClicked);
|
|
spellsWindow.visibleChanged.connect(onSpellsWindowVisibilityChanged);
|
|
|
|
var onUpdate = function onUpdate() {
|
|
MagicSpells.update();
|
|
};
|
|
|
|
Script.update.connect(onUpdate);
|
|
|
|
Script.scriptEnding.connect(function () {
|
|
systemToolbar.removeButton('spellbook');
|
|
Script.update.disconnect(onUpdate);
|
|
MagicSpells.reset();
|
|
});
|
|
};
|
|
|
|
main();
|
|
})();
|