diff --git a/scripts/system/particle_explorer/hifi-entity-ui.js b/scripts/system/particle_explorer/hifi-entity-ui.js
deleted file mode 100644
index 62a0aadc86..0000000000
--- a/scripts/system/particle_explorer/hifi-entity-ui.js
+++ /dev/null
@@ -1,709 +0,0 @@
-/* global window, document, print, alert, console,setTimeout, clearTimeout, _ $ */
-/* eslint no-console: 0 */
-
-/**
-UI Builder V1.0
-
-Created by Matti 'Menithal' Lahtinen
-24/5/2017
-Copyright 2017 High Fidelity, Inc.
-
-This can eventually be expanded to all of Edit, for now, starting
-with Particles Only.
-
-This is created for the sole purpose of streamliming the bridge, and to simplify
-the logic between an inputfield in WebView and Entities in High Fidelity.
-
-We also do not need anything as heavy as jquery or any other platform,
-as we are mostly only building for QT (while, all the other JS frameworks usually do alot of polyfilling)
-
-Available Types:
-
- JSONInputField - Accepts JSON input, once one presses Save, it will be propegated.
- Button- A Button that listens for a custom event as defined by callback
- Boolean - Creates a checkbox that the user can either check or uncheck
- SliderFloat - Creates a slider (with input) that has Float values from min to max.
- Default is min 0, max 1
- SliderInteger - Creates a slider (with input) that has a Integer value from min to max.
- Default is min 1, max 10000
- SliderRadian - Creates a slider (with input) that has Float values in degrees,
- that are converted to radians. default is min 0, max Math.PI.
- Texture - Creates a Image with an url input field that points to texture.
- If image cannot form, show "cannot find image"
- VecQuaternion - Creates a 3D Vector field that converts to quaternions.
- Checkbox exists to show quaternions instead.
- Color - Create field color button, that when pressed, opens the color picker.
- Vector - Create a 3D Vector field that has one to one correspondence.
-
-The script will use this structure to build a UI that is connected The
-id fields within High Fidelity
-
-This should make editing, and everything related much more simpler to maintain,
-and If there is any changes to either the Entities or properties of
-
-**/
-
-var RADIANS_PER_DEGREE = Math.PI / 180;
-var DEBOUNCE_TIMEOUT = 125;
-
-var roundFloat = function (input, round) {
- round = round ? round : 1000;
- var sanitizedInput;
- if (typeof input === "string") {
- sanitizedInput = parseFloat(input);
- } else {
- sanitizedInput = input;
- }
- return Math.round(sanitizedInput * round) / round;
-};
-
-function HifiEntityUI(parent) {
- this.parent = parent;
-
- var self = this;
- this.sendPackage = {};
- this.settingsUpdateLock = false;
- this.webBridgeSync = function(id, val) {
- if (!this.settingsUpdateLock) {
- this.sendPackage[id] = val;
- this.webBridgeSyncDebounce();
- }
- };
- this.webBridgeSyncDebounce = _.debounce(function () {
- if (self.EventBridge) {
- self.submitChanges(self.sendPackage);
- self.sendPackage = {};
- }
- }, DEBOUNCE_TIMEOUT);
-}
-
-HifiEntityUI.prototype = {
- setOnSelect: function (callback) {
- this.onSelect = callback;
- },
- submitChanges: function (structure) {
- var message = {
- messageType: "settings_update",
- updatedSettings: structure
- };
- this.EventBridge.emitWebEvent(JSON.stringify(message));
- },
- setUI: function (structure) {
- this.structure = structure;
- },
- disableFields: function () {
- var fields = document.getElementsByTagName("input");
- for (var i = 0; i < fields.length; i++) {
- if (fields[i].getAttribute("type") !== "button") {
- fields[i].value = "";
- }
-
- fields[i].setAttribute("disabled", true);
- }
- var textures = document.getElementsByTagName("img");
- for (i = 0; i < textures.length; i++) {
- textures[i].src = "";
- }
-
- textures = document.getElementsByClassName("with-texture");
- for (i = 0; i < textures.length; i++) {
- textures[i].classList.remove("with-textures");
- textures[i].classList.add("no-texture");
- }
-
- var textareas = document.getElementsByTagName("textarea");
- for (var x = 0; x < textareas.length; x++) {
- textareas[x].remove();
- }
- },
- getSettings: function () {
- var self = this;
- var json = {};
- var keys = Object.keys(self.builtRows);
- for (var i = 0; i < keys.length; i++) {
- var key = keys[i];
- var el = self.builtRows[key];
- if (el.className.indexOf("checkbox") !== -1) {
- json[key] = document.getElementById(key)
- .checked ? true : false;
- } else if (el.className.indexOf("vector-section") !== -1) {
- var vector = {};
- if (el.className.indexOf("rgb") !== -1) {
- var red = document.getElementById(key + "-red");
- var blue = document.getElementById(key + "-blue");
- var green = document.getElementById(key + "-green");
- vector.red = red.value;
- vector.blue = blue.value;
- vector.green = green.value;
- } else if (el.className.indexOf("pyr") !== -1) {
- var p = document.getElementById(key + "-Pitch");
- var y = document.getElementById(key + "-Yaw");
- var r = document.getElementById(key + "-Roll");
- vector.x = p.value;
- vector.y = y.value;
- vector.z = r.value;
- } else {
- var x = document.getElementById(key + "-x");
- var ey = document.getElementById(key + "-y");
- var z = document.getElementById(key + "-z");
- vector.x = x.value;
- vector.y = ey.value;
- vector.z = z.value;
- }
- json[key] = vector;
- } else if (el.className.indexOf("radian") !== -1) {
- json[key] = document.getElementById(key).value * RADIANS_PER_DEGREE;
- } else if (el.className.length > 0) {
- json[key] = document.getElementById(key).value;
- }
- }
-
-
- return json;
- },
- fillFields: function (currentProperties) {
- var self = this;
- var fields = document.getElementsByTagName("input");
-
- if (!currentProperties.locked) {
- for (var i = 0; i < fields.length; i++) {
- fields[i].removeAttribute("disabled");
- if (fields[i].hasAttribute("data-max")) {
- // Reset Max to original max
- fields[i].setAttribute("max", fields[i].getAttribute("data-max"));
- }
- }
- }
-
- if (self.onSelect) {
- self.onSelect();
- }
- var keys = Object.keys(currentProperties);
-
-
- for (var e in keys) {
- if (keys.hasOwnProperty(e)) {
- var value = keys[e];
-
- var property = currentProperties[value];
- var field = self.builtRows[value];
- if (field) {
- var el = document.getElementById(value);
-
- if (field.className.indexOf("radian") !== -1) {
- el.value = property / RADIANS_PER_DEGREE;
- el.onchange({
- target: el
- });
- } else if (field.className.indexOf("range") !== -1 || field.className.indexOf("texture") !== -1) {
- el.value = property;
- el.onchange({
- target: el
- });
- } else if (field.className.indexOf("checkbox") !== -1) {
- if (property) {
- el.setAttribute("checked", property);
- } else {
- el.removeAttribute("checked");
- }
- } else if (field.className.indexOf("vector-section") !== -1) {
- if (field.className.indexOf("rgb") !== -1) {
- var red = document.getElementById(value + "-red");
- var blue = document.getElementById(value + "-blue");
- var green = document.getElementById(value + "-green");
- red.value = parseInt(property.red);
- blue.value = parseInt(property.blue);
- green.value = parseInt(property.green);
-
- red.oninput({
- target: red
- });
- } else if (field.className.indexOf("xyz") !== -1) {
- var x = document.getElementById(value + "-x");
- var y = document.getElementById(value + "-y");
- var z = document.getElementById(value + "-z");
-
- x.value = roundFloat(property.x, 100);
- y.value = roundFloat(property.y, 100);
- z.value = roundFloat(property.z, 100);
- } else if (field.className.indexOf("pyr") !== -1) {
- var pitch = document.getElementById(value + "-Pitch");
- var yaw = document.getElementById(value + "-Yaw");
- var roll = document.getElementById(value + "-Roll");
-
- pitch.value = roundFloat(property.x, 100);
- yaw.value = roundFloat(property.y, 100);
- roll.value = roundFloat(property.z, 100);
-
- }
- }
- }
- }
- }
- },
- connect: function (EventBridge) {
- this.EventBridge = EventBridge;
-
- var self = this;
-
- EventBridge.emitWebEvent(JSON.stringify({
- messageType: 'page_loaded'
- }));
-
- EventBridge.scriptEventReceived.connect(function (data) {
- data = JSON.parse(data);
-
- if (data.messageType === 'particle_settings') {
- self.settingsUpdateLock = true;
- self.fillFields(data.currentProperties);
- self.settingsUpdateLock = false;
- // Do expected property match with structure;
- } else if (data.messageType === 'particle_close') {
- self.disableFields();
- }
- });
- },
- build: function () {
- var self = this;
- var sections = Object.keys(this.structure);
- this.builtRows = {};
- sections.forEach(function (section, index) {
- var properties = self.structure[section];
- self.addSection(self.parent, section, properties, index);
- });
- },
- addSection: function (parent, section, properties, index) {
- var self = this;
-
- var sectionDivHeader = document.createElement("fieldset");
- var title = document.createElement("legend");
- var dropDown = document.createElement("span");
-
- dropDown.className = "arrow";
- sectionDivHeader.className = "major";
- title.className = "section-header";
- title.id = section + "-section";
- title.innerHTML = section;
- title.appendChild(dropDown);
- sectionDivHeader.appendChild(title);
-
- var collapsed = index !== 0;
-
- dropDown.innerHTML = collapsed ? "L" : "M";
- sectionDivHeader.setAttribute("collapsed", collapsed);
- parent.appendChild(sectionDivHeader);
-
- var sectionDivBody = document.createElement("div");
- sectionDivBody.className = "property-group";
-
- var animationWrapper = document.createElement("div");
- animationWrapper.className = "section-wrap";
-
- for (var property in properties) {
- if (properties.hasOwnProperty(property)) {
- var builtRow = self.addElement(animationWrapper, properties[property]);
- var id = properties[property].id;
- if (id) {
- self.builtRows[id] = builtRow;
- }
- }
- }
- sectionDivBody.appendChild(animationWrapper);
- sectionDivHeader.appendChild(sectionDivBody);
- _.defer(function () {
- var height = (animationWrapper.clientHeight) + "px";
- if (collapsed) {
- sectionDivBody.classList.remove("visible");
- sectionDivBody.style.maxHeight = "0px";
- } else {
- sectionDivBody.classList.add("visible");
- sectionDivBody.style.maxHeight = height;
- }
-
- title.onclick = function () {
- collapsed = !collapsed;
- if (collapsed) {
- sectionDivBody.classList.remove("visible");
- sectionDivBody.style.maxHeight = "0px";
- } else {
- sectionDivBody.classList.add("visible");
- sectionDivBody.style.maxHeight = (animationWrapper.clientHeight) + "px";
- }
- // sectionDivBody.style.display = collapsed ? "none": "block";
- dropDown.innerHTML = collapsed ? "L" : "M";
- title.setAttribute("collapsed", collapsed);
- };
- });
- },
- addLabel: function (parent, group) {
- var label = document.createElement("label");
- label.innerHTML = group.name;
- parent.appendChild(label);
- if (group.unit) {
- var span = document.createElement("span");
- span.innerHTML = group.unit;
- span.className = "unit";
- label.appendChild(span);
- }
- return label;
- },
- addVector: function (parent, group, labels, domArray) {
- var self = this;
- var inputs = labels ? labels : ["x", "y", "z"];
- domArray = domArray ? domArray : [];
- parent.id = group.id;
- for (var index in inputs) {
- var element = document.createElement("input");
-
- element.setAttribute("type", "number");
- element.className = inputs[index];
- element.id = group.id + "-" + inputs[index];
-
- if (group.defaultRange) {
- if (group.defaultRange.min) {
- element.setAttribute("min", group.defaultRange.min);
- }
- if (group.defaultRange.max) {
- element.setAttribute("max", group.defaultRange.max);
- }
- if (group.defaultRange.step) {
- element.setAttribute("step", group.defaultRange.step);
- }
- }
- if (group.oninput) {
- element.oninput = group.oninput;
- } else {
- element.oninput = function (event) {
- self.webBridgeSync(group.id, {
- x: domArray[0].value,
- y: domArray[1].value,
- z: domArray[2].value
- });
- };
- }
- element.onchange = element.oninput;
- domArray.push(element);
- }
-
- this.addLabel(parent, group);
- var className = "";
- for (var i = 0; i < inputs.length; i++) {
- className += inputs[i].charAt(0)
- .toLowerCase();
- }
- parent.className += " property vector-section " + className;
-
- // Add Tuple and the rest
- var tupleContainer = document.createElement("div");
- tupleContainer.className = "tuple";
- for (var domIndex in domArray) {
- var container = domArray[domIndex];
- var div = document.createElement("div");
- var label = document.createElement("label");
- label.innerHTML = inputs[domIndex] + ":";
- label.setAttribute("for", container.id);
- div.appendChild(container);
- div.appendChild(label);
- tupleContainer.appendChild(div);
- }
- parent.appendChild(tupleContainer);
- },
- addVectorQuaternion: function (parent, group) {
- this.addVector(parent, group, ["Pitch", "Yaw", "Roll"]);
- },
- addColorPicker: function (parent, group) {
- var self = this;
- var $colPickContainer = $('
', {
- id: group.id,
- class: "color-picker"
- });
- var updateColors = function (red, green, blue) {
- $colPickContainer.css('background-color', "rgb(" +
- red + "," +
- green + "," +
- blue + ")");
- };
-
- var inputs = ["red", "green", "blue"];
- var domArray = [];
- group.oninput = function (event) {
- $colPickContainer.colpickSetColor(
- {
- r: domArray[0].value,
- g: domArray[1].value,
- b: domArray[2].value
- },
- true);
- };
- group.defaultRange = {
- min: 0,
- max: 255,
- step: 1
- };
-
- parent.appendChild($colPickContainer[0]);
- self.addVector(parent, group, inputs, domArray);
-
- updateColors(domArray[0].value, domArray[1].value, domArray[2].value);
-
- // Could probably write a custom one for this to completely write out jquery,
- // but for now, using the same as earlier.
-
- /* Color Picker Logic Here */
-
-
- $colPickContainer.colpick({
- colorScheme: (group.layoutColorScheme === undefined ? 'dark' : group.layoutColorScheme),
- layout: (group.layoutType === undefined ? 'hex' : group.layoutType),
- submit: (group.useSubmitButton === undefined ? true : group.useSubmitButton),
- color: {
- r: domArray[0].value,
- g: domArray[1].value,
- b: domArray[2].value
- },
- onChange: function (hsb, hex, rgb, el) {
- updateColors(rgb.r, rgb.g, rgb.b);
-
- domArray[0].value = rgb.r;
- domArray[1].value = rgb.g;
- domArray[2].value = rgb.b;
- self.webBridgeSync(group.id, {
- red: rgb.r,
- green: rgb.g,
- blue: rgb.b
- });
- },
- onSubmit: function (hsb, hex, rgb, el) {
- $(el)
- .css('background-color', '#' + hex);
- $(el)
- .colpickHide();
- domArray[0].value = rgb.r;
- domArray[1].value = rgb.g;
- domArray[2].value = rgb.b;
- self.webBridgeSync(group.id, {
- red: rgb.r,
- green: rgb.g,
- blue: rgb.b
- });
- }
- });
- },
- addTextureField: function (parent, group) {
- var self = this;
- this.addLabel(parent, group);
- parent.className += " property texture";
- var textureImage = document.createElement("div");
- var textureUrl = document.createElement("input");
- textureUrl.setAttribute("type", "text");
- textureUrl.id = group.id;
- textureImage.className = "texture-image no-texture";
- var image = document.createElement("img");
- var imageLoad = _.debounce(function (url) {
- if (url.slice(0, 5).toLowerCase() === "atp:/") {
- image.src = "";
- image.style.display = "none";
- textureImage.classList.remove("with-texture");
- textureImage.classList.remove("no-texture");
- textureImage.classList.add("no-preview");
- } else if (url.length > 0) {
- textureImage.classList.remove("no-texture");
- textureImage.classList.remove("no-preview");
- textureImage.classList.add("with-texture");
- image.src = url;
- image.style.display = "block";
- } else {
- image.src = "";
- image.style.display = "none";
- textureImage.classList.remove("with-texture");
- textureImage.classList.remove("no-preview");
- textureImage.classList.add("no-texture");
- }
- }, DEBOUNCE_TIMEOUT * 2);
-
- textureUrl.oninput = function (event) {
- // Add throttle
- var url = event.target.value;
- imageLoad(url);
- self.webBridgeSync(group.id, url);
- };
- textureUrl.onchange = textureUrl.oninput;
- textureImage.appendChild(image);
- parent.appendChild(textureImage);
- parent.appendChild(textureUrl);
- },
- addSlider: function (parent, group) {
- var self = this;
- this.addLabel(parent, group);
- parent.className += " property range";
- var container = document.createElement("div");
- container.className = "slider-wrapper";
- var slider = document.createElement("input");
- slider.setAttribute("type", "range");
-
- var inputField = document.createElement("input");
- inputField.setAttribute("type", "number");
-
- container.appendChild(slider);
- container.appendChild(inputField);
- parent.appendChild(container);
-
- if (group.type === "SliderInteger") {
- inputField.setAttribute("min", group.min !== undefined ? group.min : 0);
- inputField.setAttribute("step", 1);
-
- slider.setAttribute("min", group.min !== undefined ? group.min : 0);
- slider.setAttribute("max", group.max !== undefined ? group.max : 10000);
- slider.setAttribute("data-max", group.max !== undefined ? group.max : 10000);
- slider.setAttribute("step", 1);
-
- inputField.oninput = function (event) {
- // TODO: Remove this functionality? Alan finds it confusing
- if (parseInt(event.target.value) > parseInt(slider.getAttribute("max")) && group.max !== 1) {
- slider.setAttribute("max", event.target.value);
- }
- slider.value = event.target.value;
- self.webBridgeSync(group.id, slider.value);
- };
- inputField.onchange = inputField.oninput;
- slider.oninput = function (event) {
- inputField.value = event.target.value;
- self.webBridgeSync(group.id, inputField.value);
- };
-
- inputField.id = group.id;
- } else if (group.type === "SliderRadian") {
- slider.setAttribute("min", group.min !== undefined ? group.min : 0);
- slider.setAttribute("max", group.max !== undefined ? group.max : 180);
- slider.setAttribute("step", 1);
- parent.className += " radian";
- inputField.setAttribute("min", (group.min !== undefined ? group.min : 0));
- inputField.setAttribute("max", (group.max !== undefined ? group.max : 180));
-
- inputField.oninput = function (event) {
- slider.value = event.target.value;
- self.webBridgeSync(group.id, slider.value * RADIANS_PER_DEGREE);
- };
- inputField.onchange = inputField.oninput;
-
- inputField.id = group.id;
- slider.oninput = function (event) {
- if (event.target.value > 0) {
- inputField.value = Math.floor(event.target.value);
- } else {
- inputField.value = Math.ceil(event.target.value);
- }
- self.webBridgeSync(group.id, inputField.value * RADIANS_PER_DEGREE);
- };
- var degrees = document.createElement("label");
- degrees.innerHTML = "°";
- degrees.style.fontSize = "1.4rem";
- degrees.style.display = "inline";
- degrees.style.verticalAlign = "top";
- degrees.style.paddingLeft = "0.4rem";
- container.appendChild(degrees);
-
- } else {
- // Must then be Float
- inputField.setAttribute("min", group.min !== undefined ? group.min : 0);
- slider.setAttribute("step", 0.01);
-
- slider.setAttribute("min", group.min !== undefined ? group.min : 0);
- slider.setAttribute("max", group.max !== undefined ? group.max : 1);
- slider.setAttribute("data-max", group.max !== undefined ? group.max : 1);
- slider.setAttribute("step", 0.01);
-
- inputField.oninput = function (event) {
- // TODO: Remove this functionality? Alan finds it confusing
- if (parseFloat(event.target.value) > parseFloat(slider.getAttribute("max")) && group.max !== 1) {
- slider.setAttribute("max", event.target.value);
- }
-
- slider.value = event.target.value;
- self.webBridgeSync(group.id, slider.value);
- // bind web sock update here.
- };
- inputField.onchange = inputField.oninput;
- slider.oninput = function (event) {
- inputField.value = event.target.value;
- self.webBridgeSync(group.id, inputField.value);
- };
-
- inputField.id = group.id;
- }
-
- // UpdateBinding
- },
- addCheckBox: function (parent, group) {
- var checkBox = document.createElement("input");
- checkBox.setAttribute("type", "checkbox");
- var self = this;
- checkBox.onchange = function (event) {
- self.webBridgeSync(group.id, event.target.checked);
- };
- checkBox.id = group.id;
- parent.appendChild(checkBox);
- var label = this.addLabel(parent, group);
- label.setAttribute("for", checkBox.id);
- parent.className += " property checkbox";
- },
- addElement: function (parent, group) {
- var self = this;
- var property = document.createElement("div");
- property.id = group.id;
-
- var row = document.createElement("div");
- switch (group.type) {
- case "Button":
- var button = document.createElement("input");
- button.setAttribute("type", "button");
- button.id = group.id;
- if (group.disabled) {
- button.disabled = group.disabled;
- }
- button.className = group.class;
- button.value = group.name;
-
- button.onclick = group.callback;
- parent.appendChild(button);
- break;
- case "Row":
- var hr = document.createElement("hr");
- hr.className = "splitter";
- if (group.id) {
- hr.id = group.id;
- }
- parent.appendChild(hr);
- break;
- case "Boolean":
- self.addCheckBox(row, group);
- parent.appendChild(row);
- break;
- case "SliderFloat":
- case "SliderInteger":
- case "SliderRadian":
- self.addSlider(row, group);
- parent.appendChild(row);
- break;
- case "Texture":
- self.addTextureField(row, group);
- parent.appendChild(row);
- break;
- case "Color":
- self.addColorPicker(row, group);
- parent.appendChild(row);
- break;
- case "Vector":
- self.addVector(row, group);
- parent.appendChild(row);
- break;
- case "VectorQuaternion":
- self.addVectorQuaternion(row, group);
- parent.appendChild(row);
- break;
- default:
- console.log("not defined");
- }
- return row;
- }
-};
\ No newline at end of file
diff --git a/scripts/system/particle_explorer/particle-style.css b/scripts/system/particle_explorer/particle-style.css
deleted file mode 100644
index cde325f6c6..0000000000
--- a/scripts/system/particle_explorer/particle-style.css
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
-// particle-style.css
-//
-// Created by Matti 'Menithal' Lahtinen on 21 May 2017
-// Copyright 2017 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
-*/
-
-
-.property-group {
- max-height: 0;
- -webkit-transition: max-height 0.15s ease-out;
- transition: max-height 0.15s ease-out;
- overflow: hidden;
-}
-.property-group.visible {
- transition: max-height 0.25s ease-in;
-}
-.section-wrap {
- width: 100%;
-}
-.property {
- padding: 0.4rem 0;
- margin: 0;
-}
-.property.checkbox {
- margin: 0;
-}
-.property.range label{
- display: block;
-}
-
-input[type="button"] {
- margin: 0.4rem;
- min-width: 6rem;
-}
-input[type="text"] {
- margin: 0;
-}
-.property.range input[type=number]{
- margin-left: 0.8rem;
- width: 5.4rem;
- height: 1.8rem;
-}
-input[type=range] {
- -webkit-appearance: none;
- background: #2e2e2e;
- height: 1.8rem;
- border-radius: 1rem;
-}
-input[type=range]::-webkit-slider-thumb {
- -webkit-appearance:none;
- width: 0.6rem;
- height: 1.8rem;
- padding:0;
- margin: 0;
- background-color: #696969;
- border-radius: 1rem;
-}
-input[type=range]::-webkit-slider-thumb:hover {
- background-color: white;
-}
-input[type=range]:focus { /*#252525*/
- outline: none;
-}
-.tuple label {
- text-transform: capitalize;
-}
-.slider-wrapper {
- display: table;
- padding: 0.4rem 0;
-}
-hr.splitter{
- width: 100%;
- padding: 0.2rem 0 0 0;
- margin: 0;
- position: relative;
- clear: both;
-}
-hr.splitter:last-of-type{
- padding:0;
-}
-#rem {
- height: 1rem;
- width: 1rem;
-}
-.property {
- min-height: 2rem;
-}
-.property.vector-section{
-
- width: 24rem;
-}
-
-.property.texture {
- display: block;
-}
-.property.texture input{
- margin: 0.4rem 0;
-}
-.texture-image img{
- padding: 0;
- margin: 0;
- width: 100%;
- height: 100%;
- display: none;
-}
-.texture-image {
- display: block;
- position: relative;
- background-repeat: no-repeat;
- background-position: center;
- background-size: 100% 100%;
- margin-top: 0.4rem;
- height:128px;
- width: 128px;
- background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAABhNJREFUeNrsnVFy4joQRVsSCwAqBMwqsrRsIavMEkICoeAf2+8j1R5ZGDBgpLzoUDVVmTT2dc8It/paOpi3t7faOSciImVZyn6/l6qqRETEWivj8VistYPFd7ud1HUtIiLGGBmPx5JKX0RkMplIzvmPnHNijBERaS7Ef1lrB40bY1oXgH5a/ZH+8P7+LlVVycfHR/MGa60URdGcYOi4MUaKomhGaGx9EZHlcplMP2X+Ly8vPwOgLEtxzklVVVJVVfOznqAsy9YFXhuvqqq5AF/Lj+srtr7+LpV+yvz1mNF+vxcRkdVqJdZaeXp6ap1ws9m0TjibzVoj6lJ8vV6fjJdlKev1ujViU+j7t8tc8p9Op1KWpYw06L9JL0Av0r9l+jXl3nhd11JV1VE8tn5YM3PI3xjzoxVOGvyDU7zQj6s/0tGmI++amtNV087F9Wf/FnVPzRtCXz8RdV1nlb/efUbaJy4Wi0FqzjU1yRgjs9ls0Jp3jb6IyPPzczL9lPkvFot/dwCtB/om/x9oyJoXxps65NW8mPpdNTeX/JtBEtYE/+AUL/Tj6g/qA3TVnD41a6g++Bp9rYOp9FPnH80HOBcvy1I2m81D++BL+o/2AX5r/vgA+AD4AOif8AH8EdpVcy71sX3jWp/8W2AKff/TkUv+Oufr9AF0YuKc66xJ18T7eNP3nP9WfZ0EzufzJPqp8y+KQuq67vYBdETqCDpVU/rEw5oUnr+rD46h73/qUuinzh8fAP22D6AjxznXcqq6akrf+KmaFB6vf4+t7/sAelfIJf/GB9jtdmKMkdVq1dQM3zg4VVNU/NY+1Bgjh8Oh6YM1+dj6X19fzXwgp/wbH0DFtS7oyf0RdKqmhPFr+1RdseKfP7a+Px/IKX98APTbPoDOJrv60L417d54TH3V8lfS5pT/yfUA6/X6qOZcqkm3xrUm6X9CTH3fB0ihnzr/Ix9A/3T1qbfWpGvjMfX9T0UK/dT54wOg/88H8EfGPTVr6D740frhLDmn/Hv5AH1qku9t31KTzh3/aP1LPsBfzr+XDxCO0K6ack/N6qp5MfUv+QB/Of/ePsCQfWmfc6EfV3/kjzZrrRwOh9YtKHSm/LjOH3yrMTzej4c1y//51PHoP0a/tR7AOSdFURw9rz5VU049zw7jl2qWrosP++BY+iI/+wJS6afMv9kXoA6gvimsieHzZr/m6MTp3PPuc3G9SP95OPpx9JtOgT4cHwA+QCJ9+ADwAeADsC+AfQHo/4b1APAB4APAB4APAB8APgB9OD4AfAD4AFFqEnwA+AD4APgA6P86HwA+AHyAZhIBHwA+AHwA+AD04X/eB4APAB8APgB8APgA8AHow/P0AeADwAeADwAfAD4AfAD68Px8APgA8AHgA8AHgA8AH0DO70/v6lHvjaOfVn8U/iLcXx5OUML96X49vRTX3/nPw9FPo9+sB5hMJuKck+VyeVRTrLWtdfNdcf95eldNCuOfn5+tSYy/Pz+2voi0fICc8p/P5z93gJAPEN4+wufN4evaePj99eH+ePTj6p/1Abp60kt9Ksf/v46HDwAfAD6A/6gUPgD7AtgXwPP4DNcDwAeADwAfAD4AfAD4ADyPz289AHyA+Pqp84cPIPAB8AHwAfAB8AHgA7Q+HfAB4APAB4APAB+APjw3HwA+AHwA+ADwAeADwAegD8/TB4APAB8APgB8APgA8AHow/PzAeADwAeADwAfAD4AfACJ//316KfVH/mjLeb31+vx/kWhH0+/tR7AOSdFUUT9/nq9oK4+OJa+iLT25+eUf7MvIOQDxPr+en2F++PRj6PfdAr04fgA8AES6cMHgA8AH4B9AewLQP83rAeADwAfAD4AfAD4APAB6MPxAeADwAeIUpPgA8AHwAfAB0D/1/kA8AHgAzSTCPgA8AHgA8AHoA//8z4AfAD4APAB4APAB4APQB+epw8AHwA+AHwA+ADwAeAD0Ifn5wPAB4APAB8APgB8gBz5AOb19bX2TYLpdNpqQ7bbbctJGjJeVZVst9vWLSu2/vf3t+Sc/yicFIRr0C7Fu76f/lw8XBePflr9/wYAqWwWUSLcO54AAAAASUVORK5CYII=');
-}
-
-.texture-image.no-texture {
- background-image: url('data:image/png;base64,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');
-}
-
-.texture-image.no-preview {
- background-image: url('data:image/png;base64,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');
-}
-
-#properties-list > fieldset {
- margin-top: 0px;
-}
-
-#main-header {
- margin-bottom: 21px;
-}
-
-.section-wrap {
- padding: 21px 0px;
-}
\ No newline at end of file
diff --git a/scripts/system/particle_explorer/particleExplorer.html b/scripts/system/particle_explorer/particleExplorer.html
deleted file mode 100644
index ab4c249cc3..0000000000
--- a/scripts/system/particle_explorer/particleExplorer.html
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/scripts/system/particle_explorer/particleExplorer.js b/scripts/system/particle_explorer/particleExplorer.js
deleted file mode 100644
index f1b7c8600f..0000000000
--- a/scripts/system/particle_explorer/particleExplorer.js
+++ /dev/null
@@ -1,485 +0,0 @@
-//
-// particleExplorer.js
-//
-// Created by James B. Pollack @imgntn on 9/26/2015
-// Copyright 2017 High Fidelity, Inc.
-//
-// Reworked by Menithal on 20/5/2017
-// Reworked by Daniela Fontes and Artur Gomes (Mimicry) on 12/18/2017
-//
-// Web app side of the App - contains GUI.
-// This is an example of a new, easy way to do two way bindings between dynamically created GUI and in-world entities.
-//
-// Distributed under the Apache License, Version 2.0.
-// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
-//
-/* global HifiEntityUI, openEventBridge, console, EventBridge, document, window */
-/* eslint no-console: 0, no-global-assign: 0 */
-
-(function () {
-
- var root = document.getElementById("properties-list");
-
- window.onload = function () {
- var ui = new HifiEntityUI(root);
- var textarea = document.createElement("textarea");
- var properties = "";
- var menuStructure = {
- General: [
- {
- type: "Row",
- id: "export-import-field"
- },
- {
- id: "show-properties-button",
- name: "Show Properties",
- type: "Button",
- class: "blue",
- disabled: true,
- callback: function (event) {
- var insertZone = document.getElementById("export-import-field");
- var json = ui.getSettings();
- properties = JSON.stringify(json);
- textarea.value = properties;
- if (!insertZone.contains(textarea)) {
- insertZone.appendChild(textarea);
- insertZone.parentNode.parentNode.style.maxHeight =
- insertZone.parentNode.clientHeight + "px";
- document.getElementById("export-properties-button").removeAttribute("disabled");
- textarea.onchange = function (e) {
- if (e.target.value !== properties) {
- document.getElementById("import-properties-button").removeAttribute("disabled");
- }
- };
- textarea.oninput = textarea.onchange;
- document.getElementById("show-properties-button").value = "Hide Properties";
- } else {
- textarea.onchange = function () {};
- textarea.oninput = textarea.onchange;
- textarea.value = "";
- textarea.remove();
- insertZone.parentNode.parentNode.style.maxHeight =
- insertZone.parentNode.clientHeight + "px";
- document.getElementById("export-properties-button").setAttribute("disabled", true);
- document.getElementById("import-properties-button").setAttribute("disabled", true);
- document.getElementById("show-properties-button").value = "Show Properties";
- }
- }
- },
- {
- id: "import-properties-button",
- name: "Import",
- type: "Button",
- class: "blue",
- disabled: true,
- callback: function (event) {
- ui.fillFields(JSON.parse(textarea.value));
- ui.submitChanges(JSON.parse(textarea.value));
- }
- },
- {
- id: "export-properties-button",
- name: "Export",
- type: "Button",
- class: "red",
- disabled: true,
- callback: function (event) {
- textarea.select();
- try {
- var success = document.execCommand('copy');
- if (!success) {
- throw "Not success :(";
- }
- } catch (e) {
- print("couldnt copy field");
- }
- }
- },
- {
- type: "Row"
- },
- {
- id: "isEmitting",
- name: "Is Emitting",
- type: "Boolean"
- },
- {
- type: "Row"
- },
- {
- id: "lifespan",
- name: "Lifespan",
- type: "SliderFloat",
- min: 0.01,
- max: 10
- },
- {
- type: "Row"
- },
- {
- id: "maxParticles",
- name: "Max Particles",
- type: "SliderInteger",
- min: 1,
- max: 10000
- },
- {
- type: "Row"
- },
- {
- id: "textures",
- name: "Textures",
- type: "Texture"
- },
- {
- type: "Row"
- }
- ],
- Emit: [
- {
- id: "emitRate",
- name: "Emit Rate",
- type: "SliderInteger",
- max: 1000,
- min: 1
- },
- {
- type: "Row"
- },
- {
- id: "emitSpeed",
- name: "Emit Speed",
- type: "SliderFloat",
- max: 5
- },
- {
- id: "speedSpread",
- name: "Speed Spread",
- type: "SliderFloat",
- max: 5
- },
- {
- type: "Row"
- },
- {
- id: "emitDimensions",
- name: "Emit Dimension",
- type: "Vector",
- defaultRange: {
- min: 0,
- step: 0.01
- }
- },
- {
- type: "Row"
- },
- {
- id: "emitOrientation",
- unit: "deg",
- name: "Emit Orientation",
- type: "VectorQuaternion",
- defaultRange: {
- min: 0,
- step: 0.01
- }
- },
- {
- type: "Row"
- },
- {
- id: "emitterShouldTrail",
- name: "Emitter Should Trail",
- type: "Boolean"
- },
- {
- type: "Row"
- }
- ],
- Radius: [
- {
- id: "particleRadius",
- name: "Particle Radius",
- type: "SliderFloat",
- max: 4.0
- },
- {
- type: "Row"
- },
- {
- id: "radiusSpread",
- name: "Radius Spread",
- type: "SliderFloat",
- max: 4.0
- },
- {
- type: "Row"
- },
- {
- id: "radiusStart",
- name: "Radius Start",
- type: "SliderFloat",
- max: 4.0
- },
- {
- type: "Row"
- },
- {
- id: "radiusFinish",
- name: "Radius Finish",
- type: "SliderFloat",
- max: 4.0
- },
- {
- type: "Row"
- }
- ],
- Color: [
- {
- id: "color",
- name: "Color",
- type: "Color",
- defaultColor: {
- red: 255,
- green: 255,
- blue: 255
- },
- layoutType: "hex",
- layoutColorScheme: "dark",
- useSubmitButton: false
- },
- {
- type: "Row"
- },
- {
- id: "colorSpread",
- name: "Color Spread",
- type: "Color",
- defaultColor: {
- red: 0,
- green: 0,
- blue: 0
- },
- layoutType: "hex",
- layoutColorScheme: "dark",
- useSubmitButton: false
- },
- {
- type: "Row"
- },
- {
- id: "colorStart",
- name: "Color Start",
- type: "Color",
- defaultColor: {
- red: 255,
- green: 255,
- blue: 255
- },
- layoutType: "hex",
- layoutColorScheme: "dark",
- useSubmitButton: false
- },
- {
- type: "Row"
- },
- {
- id: "colorFinish",
- name: "Color Finish",
- type: "Color",
- defaultColor: {
- red: 255,
- green: 255,
- blue: 255
- },
- layoutType: "hex",
- layoutColorScheme: "dark",
- useSubmitButton: false
- },
- {
- type: "Row"
- }
- ],
- Acceleration: [
- {
- id: "emitAcceleration",
- name: "Emit Acceleration",
- type: "Vector",
- defaultRange: {
- step: 0.01
- }
- },
- {
- type: "Row"
- },
- {
- id: "accelerationSpread",
- name: "Acceleration Spread",
- type: "Vector",
- defaultRange: {
- step: 0.01
- }
- },
- {
- type: "Row"
- }
- ],
- Alpha: [
- {
- id: "alpha",
- name: "Alpha",
- type: "SliderFloat",
- max: 1.0
- },
- {
- type: "Row"
- },
- {
- id: "alphaSpread",
- name: "Alpha Spread",
- type: "SliderFloat",
- max: 1.0
- },
- {
- type: "Row"
- },
- {
- id: "alphaStart",
- name: "Alpha Start",
- type: "SliderFloat",
- max: 1.0
- },
- {
- type: "Row"
- },
- {
- id: "alphaFinish",
- name: "Alpha Finish",
- type: "SliderFloat",
- max: 1.0
- },
- {
- type: "Row"
- }
- ],
- Spin: [
- {
- id: "particleSpin",
- name: "Particle Spin",
- type: "SliderRadian",
- min: -360.0,
- max: 360.0
- },
- {
- type: "Row"
- },
- {
- id: "spinSpread",
- name: "Spin Spread",
- type: "SliderRadian",
- max: 360.0
- },
- {
- type: "Row"
- },
- {
- id: "spinStart",
- name: "Spin Start",
- type: "SliderRadian",
- min: -360.0,
- max: 360.0
- },
- {
- type: "Row"
- },
- {
- id: "spinFinish",
- name: "Spin Finish",
- type: "SliderRadian",
- min: -360.0,
- max: 360.0
- },
- {
- type: "Row"
- },
- {
- id: "rotateWithEntity",
- name: "Rotate with Entity",
- type: "Boolean"
- },
- {
- type: "Row"
- }
- ],
- Polar: [
- {
- id: "polarStart",
- name: "Polar Start",
- unit: "deg",
- type: "SliderRadian"
- },
- {
- type: "Row"
- },
- {
- id: "polarFinish",
- name: "Polar Finish",
- unit: "deg",
- type: "SliderRadian"
- },
- {
- type: "Row"
- }
- ],
- Azimuth: [
- {
- id: "azimuthStart",
- name: "Azimuth Start",
- unit: "deg",
- type: "SliderRadian",
- min: -180,
- max: 0
- },
- {
- type: "Row"
- },
- {
- id: "azimuthFinish",
- name: "Azimuth Finish",
- unit: "deg",
- type: "SliderRadian"
- },
- {
- type: "Row"
- }
- ]
- };
- ui.setUI(menuStructure);
- ui.setOnSelect(function () {
- document.getElementById("show-properties-button").removeAttribute("disabled");
- document.getElementById("export-properties-button").setAttribute("disabled", true);
- document.getElementById("import-properties-button").setAttribute("disabled", true);
- });
- ui.build();
- var overrideLoad = false;
- if (openEventBridge === undefined) {
- overrideLoad = true,
- openEventBridge = function (callback) {
- callback({
- emitWebEvent: function () {},
- submitChanges: function () {},
- scriptEventReceived: {
- connect: function () {
-
- }
- }
- });
- };
- }
- openEventBridge(function (EventBridge) {
- ui.connect(EventBridge);
- });
- if (overrideLoad) {
- openEventBridge();
- }
- };
-})();
diff --git a/scripts/system/particle_explorer/particleExplorerTool.js b/scripts/system/particle_explorer/particleExplorerTool.js
deleted file mode 100644
index a3be004329..0000000000
--- a/scripts/system/particle_explorer/particleExplorerTool.js
+++ /dev/null
@@ -1,144 +0,0 @@
-//
-// particleExplorerTool.js
-//
-// Created by Eric Levin on 2/15/16
-// Copyright 2016 High Fidelity, Inc.
-// Adds particleExplorer tool to the edit panel when a user selects a particle entity from the edit tool window
-// This is an example of a new, easy way to do two way bindings between dynamically created GUI and in-world entities.
-//
-// Distributed under the Apache License, Version 2.0.
-// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
-//
-/* global ParticleExplorerTool */
-
-
-var PARTICLE_EXPLORER_HTML_URL = Script.resolvePath('particleExplorer.html');
-
-ParticleExplorerTool = function(createToolsWindow) {
- var that = {};
- that.activeParticleEntity = 0;
- that.updatedActiveParticleProperties = {};
-
- that.createWebView = function() {
- that.webView = Tablet.getTablet("com.highfidelity.interface.tablet.system");
- that.webView.setVisible = function(value) {};
- that.webView.webEventReceived.connect(that.webEventReceived);
- createToolsWindow.webEventReceived.addListener(this, that.webEventReceived);
- };
-
- function emitScriptEvent(data) {
- var messageData = JSON.stringify(data);
- that.webView.emitScriptEvent(messageData);
- createToolsWindow.emitScriptEvent(messageData);
- }
-
- that.destroyWebView = function() {
- if (!that.webView) {
- return;
- }
- that.activeParticleEntity = 0;
- that.updatedActiveParticleProperties = {};
-
- emitScriptEvent({
- messageType: "particle_close"
- });
- };
-
- function sendParticleProperties(properties) {
- emitScriptEvent({
- messageType: "particle_settings",
- currentProperties: properties
- });
- }
-
- function sendActiveParticleProperties() {
- var properties = Entities.getEntityProperties(that.activeParticleEntity);
- if (properties.emitOrientation) {
- properties.emitOrientation = Quat.safeEulerAngles(properties.emitOrientation);
- }
- // Update uninitialized variables
- if (isNaN(properties.alphaStart)) {
- properties.alphaStart = properties.alpha;
- }
- if (isNaN(properties.alphaFinish)) {
- properties.alphaFinish = properties.alpha;
- }
- if (isNaN(properties.radiusStart)) {
- properties.radiusStart = properties.particleRadius;
- }
- if (isNaN(properties.radiusFinish)) {
- properties.radiusFinish = properties.particleRadius;
- }
- if (isNaN(properties.colorStart.red)) {
- properties.colorStart = properties.color;
- }
- if (isNaN(properties.colorFinish.red)) {
- properties.colorFinish = properties.color;
- }
- if (isNaN(properties.spinStart)) {
- properties.spinStart = properties.particleSpin;
- }
- if (isNaN(properties.spinFinish)) {
- properties.spinFinish = properties.particleSpin;
- }
- sendParticleProperties(properties);
- }
-
- function sendUpdatedActiveParticleProperties() {
- sendParticleProperties(that.updatedActiveParticleProperties);
- that.updatedActiveParticleProperties = {};
- }
-
- that.webEventReceived = function(message) {
- var data = JSON.parse(message);
- if (data.messageType === "settings_update") {
- var updatedSettings = data.updatedSettings;
-
- var optionalProps = ["alphaStart", "alphaFinish", "radiusStart", "radiusFinish", "colorStart", "colorFinish", "spinStart", "spinFinish"];
- var fallbackProps = ["alpha", "particleRadius", "color", "particleSpin"];
- for (var i = 0; i < optionalProps.length; i++) {
- var fallbackProp = fallbackProps[Math.floor(i / 2)];
- var optionalValue = updatedSettings[optionalProps[i]];
- var fallbackValue = updatedSettings[fallbackProp];
- if (optionalValue && fallbackValue) {
- delete updatedSettings[optionalProps[i]];
- }
- }
-
- if (updatedSettings.emitOrientation) {
- updatedSettings.emitOrientation = Quat.fromVec3Degrees(updatedSettings.emitOrientation);
- }
-
- Entities.editEntity(that.activeParticleEntity, updatedSettings);
-
- var entityProps = Entities.getEntityProperties(that.activeParticleEntity, optionalProps);
-
- var needsUpdate = false;
- for (var i = 0; i < optionalProps.length; i++) {
- var fallbackProp = fallbackProps[Math.floor(i / 2)];
- var fallbackValue = updatedSettings[fallbackProp];
- if (fallbackValue) {
- var optionalProp = optionalProps[i];
- if ((fallbackProp !== "color" && isNaN(entityProps[optionalProp])) || (fallbackProp === "color" && isNaN(entityProps[optionalProp].red))) {
- that.updatedActiveParticleProperties[optionalProp] = fallbackValue;
- needsUpdate = true;
- }
- }
- }
-
- if (needsUpdate) {
- sendUpdatedActiveParticleProperties();
- }
-
- } else if (data.messageType === "page_loaded") {
- sendActiveParticleProperties();
- }
- };
-
- that.setActiveParticleEntity = function(id) {
- that.activeParticleEntity = id;
- sendActiveParticleProperties();
- };
-
- return that;
-};
diff --git a/scripts/system/particle_explorer/underscore-min.js b/scripts/system/particle_explorer/underscore-min.js
deleted file mode 100644
index f01025b7bc..0000000000
--- a/scripts/system/particle_explorer/underscore-min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// Underscore.js 1.8.3
-// http://underscorejs.org
-// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
-// Underscore may be freely distributed under the MIT license.
-(function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])
i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this);
-//# sourceMappingURL=underscore-min.map
\ No newline at end of file