Sfoglia il codice sorgente

Getting ready for v2.2.0

David Catuhe 10 anni fa
parent
commit
53bf9020d0
34 ha cambiato i file con 41127 aggiunte e 3108 eliminazioni
  1. BIN
      Exporters/3ds Max/Max2Babylon-0.17.zip
  2. 0 98
      Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/action.js
  3. 0 234
      Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/actionkinds.js
  4. 0 141
      Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/contextmenu.js
  5. 0 152
      Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/fonts.css
  6. 0 210
      Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/index.css
  7. 0 207
      Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/index.html
  8. 0 284
      Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/list.js
  9. 0 307
      Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/parametersManager.js
  10. 0 11
      Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/raphael.js
  11. 0 216
      Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/utils.js
  12. 0 750
      Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/viewer.js
  13. 0 87
      Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/viewsertoolbar.js
  14. 1 1
      Exporters/3ds Max/Max2Babylon/Exporter/BabylonExporter.cs
  15. 1 1
      Exporters/3ds Max/Max2Babylon/Forms/ActionsBuilderForm.cs
  16. 5 5
      Exporters/3ds Max/Max2Babylon/GlobalUtility.cs
  17. 16 16
      Exporters/3ds Max/Max2Babylon/Tools/Tools.cs
  18. 305 305
      dist/preview release - beta/babylon.2.2.d.ts
  19. 4 5
      dist/preview release - beta/babylon.2.2.js
  20. 14 6
      dist/preview release - beta/babylon.2.2.max.js
  21. 4 5
      dist/preview release - beta/babylon.2.2.noworker.js
  22. 6319 0
      dist/preview release - alpha/babylon.2.3.d.ts
  23. 37 0
      dist/preview release - alpha/babylon.2.3.js
  24. 34273 0
      dist/preview release - alpha/babylon.2.3.max.js
  25. 36 0
      dist/preview release - alpha/babylon.2.3.noworker.js
  26. 6 0
      dist/preview release - alpha/what's new.md
  27. 0 60
      dist/preview release - beta/what's new.md
  28. 0 0
      dist/previous releases/babylon.2.1.d.ts
  29. 0 0
      dist/previous releases/babylon.2.1.debug.js
  30. 0 0
      dist/previous releases/babylon.2.1.js
  31. 0 0
      dist/previous releases/babylon.2.1.noworker.js
  32. 8 7
      readme.md
  33. 37 0
      src/Cameras/babylon.anaglyphCamera.js
  34. 61 0
      what's new.md

BIN
Exporters/3ds Max/Max2Babylon-0.17.zip


+ 0 - 98
Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/action.js

@@ -1,98 +0,0 @@
-/// <reference path="raphael.js" />
-/// <reference path="viewer.js" />
-/// <reference path="actionKinds.js" />
-
-var AB;
-(function (AB) {
-
-    var Node = (function () {
-        function Node() {
-            // Members
-            this.rect = null;
-            this.text = null;
-            this.line = null;
-
-            this.action = null;
-
-            this.detached = false;
-            this.minimized = false;
-        }
-
-        // Get node's object attribute
-        // element: The element to get the attribute
-        // attribute: the attribute name "text, "width", etc.
-        // value: optional, if not reading mode but writing mode
-        Node.prototype.attr = function(element, attribute, value) {
-            if (value)
-                element.attr(attribute, value);
-            else
-                return element.attr(attribute);
-        }
-
-        // Returns the point at (x, y) is inside the node
-        // x: the x position of the point
-        // y: the y position of the point
-        Node.prototype.isPointInside = function (x, y) {
-            return this.rect.isPointInside(x, y) || this.text.isPointInside(x, y);
-        }
-
-        return Node;
-    })();
-
-    var Action = (function() {
-        function Action(node) {
-            // Graph related
-            this.parent = null;
-            this.children = new Array();
-            this.node = node;
-
-            // Action
-            this.name = "";
-            this.type = AB.ActionsBuilder.Type.OBJECT;
-            this.propertiesResults = new Array();
-            this.properties = new Array();
-
-            // Extra
-            this.combine = false;
-            this.combineArray = new Array();
-            this.hub = null;
-        }
-
-        // Adds a child to the action
-        // object: the child
-        Action.prototype.addChild = function (object) {
-            if (object == null)
-                return false;
-
-            this.children.push(object);
-            object.parent = this;
-
-            return true;
-        }
-
-        // Removes a child from the action
-        // object: the child to remove
-        Action.prototype.removeChild = function (object) {
-            var indice = this.children.indexOf(object);
-
-            if (indice != -1) {
-                this.children.splice(indice, 1);
-                return true;
-            }
-
-            return false;
-        }
-
-        // Clears all the children of the action
-        Action.prototype.clearChildren = function () {
-            this.children = new Array();
-        }
-
-        return Action;
-
-    })();
-
-    AB.Action = Action;
-    AB.Node = Node;
-
-})(AB || (AB = { }));

+ 0 - 234
Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/actionkinds.js

@@ -1,234 +0,0 @@
-/// <reference path="raphael.js" />
-/// <reference path="viewer.js" />
-/// <reference path="action.js" />
-/// <reference path="babylon.max.js" />
-
-var AB;
-(function (AB) {
-
-    var directActionTemplate = function (parameters, secondArgument) {
-        var template = [
-            { text: "target", value: "Object name?", targetType: "SceneProperties" }
-        ];
-
-        if (secondArgument)
-            template.push({text: secondArgument, value: "value..."});
-
-        if (parameters)
-            template.push.apply(template, parameters);
-
-        return template;
-    }
-
-    var directActionWidthPropertyPath = function (parameters) {
-        return directActionTemplate(parameters, "propertyPath");
-    }
-
-    var ActionsBuilder = (function () {
-        function ActionsBuilder()
-        { }
-
-        var engine = new BABYLON.Engine(document.getElementById("renderCanvas"), false);
-        var scene = new BABYLON.Scene(engine);
-        var camera = new BABYLON.Camera("empty_camera", BABYLON.Vector3.Zero(), scene);
-        var light = new BABYLON.PointLight("empty_light", BABYLON.Vector3.Zero(), scene);
-        var mesh = new BABYLON.Mesh("empty_mesh", scene);
-
-        ActionsBuilder.Engine = function () {
-            return engine;
-        }
-
-        ActionsBuilder.Scene = function () {
-            return scene;
-        }
-
-        ActionsBuilder.Camera = function () {
-            return camera;
-        }
-
-        ActionsBuilder.Light = function () {
-            return light;
-        }
-
-        ActionsBuilder.Mesh = function () {
-            return mesh;
-        }
-
-        //
-        // Types
-        //
-        ActionsBuilder.Type = ActionsBuilder.Type || {};
-        ActionsBuilder.Type.TRIGGER = 0;
-        ActionsBuilder.Type.ACTION = 1;
-        ActionsBuilder.Type.FLOW_CONTROL = 2;
-        ActionsBuilder.Type.OBJECT = 3;
-        ActionsBuilder.Type.SCENE = 4;
-
-        //
-        // Data types names
-        //
-        ActionsBuilder.DataTypesNames = ActionsBuilder.DataTypesNames || new Array();
-        ActionsBuilder.DataTypesNames.push({ name: "Scene", data: "SceneProperties" });
-        ActionsBuilder.DataTypesNames.push({ name: "Camera", data: "CameraProperties" });
-        ActionsBuilder.DataTypesNames.push({ name: "Light", data: "LightProperties" });
-        ActionsBuilder.DataTypesNames.push({ name: "Mesh", data: "MeshProperties" });
-
-        //
-        // Autorized data types
-        //
-        ActionsBuilder.Types = ActionsBuilder.Types || new Array();
-        ActionsBuilder.Types.push("Boolean");
-        ActionsBuilder.Types.push("Number");
-        ActionsBuilder.Types.push("Vector2");
-        ActionsBuilder.Types.push("Vector3");
-        ActionsBuilder.Types.push("String");
-
-        // Tests if the property type is in ActionsBuilder.Types
-        var testInstanceOf = function (object, propertyName) {
-            if (object == null || object.constructor == null)
-                return false;
-
-            if (propertyName.length > 0 && propertyName[0] == "_")
-                return false;
-
-            var name = object.constructor.toString().match(/function (\w*)/)[1];
-
-            for (var i = 0; i < ActionsBuilder.Types.length; i++) {
-                if (name == ActionsBuilder.Types[i])
-                    return true;
-            }
-
-            return false;
-        }
-
-        //
-        // Scene properties
-        //
-        ActionsBuilder.SceneProperties = ActionsBuilder.SceneProperties || new Array();
-        for (var thing in scene) {
-            if (testInstanceOf(scene[thing], thing)) {
-                ActionsBuilder.SceneProperties.push({ name: thing, type: typeof (scene[thing]) });
-            }
-        }
-
-        //
-        // Camera properties
-        //
-        ActionsBuilder.CameraProperties = ActionsBuilder.CameraProperties || new Array();
-        for (var thing in camera) {
-            if (testInstanceOf(camera[thing], thing)) {
-                ActionsBuilder.CameraProperties.push({ name: thing, type: typeof (camera[thing]) });
-            }
-        }
-
-        //
-        // Light properties
-        //
-        ActionsBuilder.LightProperties = ActionsBuilder.LightProperties || new Array();
-        for (var thing in light) {
-            if (testInstanceOf(light[thing], thing)) {
-                ActionsBuilder.LightProperties.push({ name: thing, type: typeof (light[thing]) });
-            }
-        }
-
-        //
-        // Mesh properties
-        //
-        ActionsBuilder.MeshProperties = ActionsBuilder.MeshProperties || new Array();
-        for (var thing in mesh) {
-            if (testInstanceOf(mesh[thing], thing)) {
-                ActionsBuilder.MeshProperties.push({ name: thing, type: typeof (mesh[thing]) });
-            }
-        }
-
-        //
-        // Scene properties (meshes, lights, etc)
-        //
-        ActionsBuilder.MeshesList = ActionsBuilder.MeshesList || new Array();
-        ActionsBuilder.LightsList = ActionsBuilder.LightsList || new Array();
-        ActionsBuilder.CamerasList = ActionsBuilder.CamerasList || new Array();
-        ActionsBuilder.SoundsList = ActionsBuilder.SoundsList || new Array();
-
-        //
-        // Triggers
-        //
-        ActionsBuilder.Trigger = ActionsBuilder.Trigger || {};
-        ActionsBuilder.Trigger[0] = { name: "NothingTrigger", properties: [] };
-        ActionsBuilder.Trigger[1] = { name: "OnPickTrigger", properties: [], description: "When the user clicks" };
-        ActionsBuilder.Trigger[2] = { name: "OnLeftPickTrigger", properties: [], description: "When the user left clicks" };
-        ActionsBuilder.Trigger[3] = { name: "OnRightPickTrigger", properties: [], description: "When the user right clicks" };
-        ActionsBuilder.Trigger[4] = { name: "OnCenterPickTrigger", properties: [], description: "When the user center clicks (mouse wheel)" };
-        ActionsBuilder.Trigger[5] = { name: "OnPointerOverTrigger", properties: [], description: "When the user's mouse is on the object" };
-        ActionsBuilder.Trigger[6] = { name: "OnPointerOutTrigger", properties: [], description: "When the user's mouse is out of the object" };
-        ActionsBuilder.Trigger[7] = { name: "OnEveryFrameTrigger", properties: [], description: "Called each frame (only on scene)" };
-        ActionsBuilder.Trigger[8] = { name: "OnIntersectionEnterTrigger", properties: [{ text: "parameter", value: "Object name?" }], description: "When the object intersects an other object" };
-        ActionsBuilder.Trigger[9] = { name: "OnIntersectionExitTrigger", properties: [{ text: "parameter", value: "Object name?" }], descripton: "When the object exists intersection with an other object" };
-        ActionsBuilder.Trigger[10] = { name: "OnKeyDownTrigger", properties: [{ text: "parameter:", value: "" }], description: "When the user push a key" };
-        ActionsBuilder.Trigger[11] = { name: "OnKeyUpTrigger", properties: [{ text: "parameter:", value: "" }], description: "When the user pushed a key" };
-        ActionsBuilder.Trigger.COUNT = 12;
-
-        //
-        // Actions (direct & interpolate)
-        //
-        ActionsBuilder.Action = ActionsBuilder.Action || {};
-        ActionsBuilder.Action[0] = { name: "SwitchBooleanAction", properties: directActionWidthPropertyPath(), description: "Switches a boolean value for a given parameter of the target object : true to false, or false to true" };
-        ActionsBuilder.Action[1] = { name: "SetStateAction", properties: directActionTemplate(null, "value"), description: "Sets a new state value of the target object (i.e \"off\" or \"on\")" };
-        ActionsBuilder.Action[2] = { name: "SetValueAction", properties: directActionWidthPropertyPath([{ text: "value", value: "value?" }]), description: "Sets a new value to the specified parameter of the object" };
-        ActionsBuilder.Action[3] = { name: "SetParentAction", properties: directActionTemplate([{ text: "parent", value: "object name?" }]), description: "Sets a new parent for the target object" };
-        ActionsBuilder.Action[4] = { name: "IncrementValueAction", properties: directActionWidthPropertyPath([{ text: "value", value: "value?" }]), description: "Increments the value of the given parameter for the target object. The value can be negative" };
-        ActionsBuilder.Action[5] = { name: "PlayAnimationAction", properties: directActionTemplate([{ text: "from", value: "0" }, { text: "to", value: "150" }, { text: "loop", value: "false" }]), description: "Plays the animation of the target object" };
-        ActionsBuilder.Action[6] = { name: "StopAnimationAction", properties: directActionTemplate(), description: "Stops the animation of the target object" };
-        ActionsBuilder.Action[7] = { name: "DoNothingAction", properties: [], description: "Does nothing, can be used to balance the actions graph" };
-        ActionsBuilder.Action[8] = {
-            name: "InterpolateValueAction", properties: directActionWidthPropertyPath([
-                { text: "value", value: "value" },
-                { text: "duration", value: "1000" },
-                { text: "stopOtherAnimations", value: "false" }]),
-            description: "Creates an animation (key frames) that animates the target object by modifying the given parameter to the target value"
-        };
-        ActionsBuilder.Action[9] = { name: "PlaySoundAction", properties: [{ text: "sound", value: "path to sound..." }], description: "Plays a sound giving it's path (name)" };
-        ActionsBuilder.Action[10] = { name: "StopSoundAction", properties: [{ text: "sound", value: "path to sound..." }], description: "Stops a sound giving it's path (name)" };
-        ActionsBuilder.Action[11] = { name: "CombineAction", properties: [], description: "Special action that combines multiple actions" };
-        ActionsBuilder.Action.COUNT = 12;
-
-        //
-        // Flow Control
-        //
-        ActionsBuilder.FlowActionOperators = ActionsBuilder.FlowActionOperators || new Array();
-        ActionsBuilder.FlowActionOperators.push("IsEqual");
-        ActionsBuilder.FlowActionOperators.push("IsDifferent");
-        ActionsBuilder.FlowActionOperators.push("IsGreater");
-        ActionsBuilder.FlowActionOperators.push("IsLesser");
-
-        ActionsBuilder.FlowAction = ActionsBuilder.FlowAction || {};
-        ActionsBuilder.FlowAction[0] = { name: "ValueCondition", properties: directActionWidthPropertyPath([{ text: "value", value: "value?" }, { text: "operator", value: ActionsBuilder.FlowActionOperators[0] }]), description: "A condition" };
-        ActionsBuilder.FlowAction[1] = { name: "StateCondition", properties: directActionTemplate([{ text: "value", value: "value?" }]), description: "A condition, true if the target object state equals the given state" };
-        ActionsBuilder.FlowAction.COUNT = 2;
-        ActionsBuilder.FlowAction.Hub = { name: "Hub", properties: [], description: "" };
-
-        //
-        // Utils
-        //
-        ActionsBuilder.GetDescriptionFromActionName = function (name) {
-            for (var i = 0; i < ActionsBuilder.Trigger.COUNT; i++) {
-                if (ActionsBuilder.Trigger[i].name == name)
-                    return ActionsBuilder.Trigger[i].description;
-            }
-
-            for (var i = 0; i < ActionsBuilder.Action.COUNT; i++) {
-                if (ActionsBuilder.Action[i].name == name)
-                    return ActionsBuilder.Action[i].description;
-            }
-
-            for (var i = 0; i < ActionsBuilder.FlowAction.COUNT; i++) {
-                if (ActionsBuilder.FlowAction[i].name == name)
-                    return ActionsBuilder.FlowAction[i].description;
-            }
-
-        };
-
-        return ActionsBuilder;
-    })();
-
-    AB.ActionsBuilder = ActionsBuilder;
-})(AB || (AB = {}));

+ 0 - 141
Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/contextmenu.js

@@ -1,141 +0,0 @@
-/// <reference path="raphael.js" />
-/// <reference path="actionKinds.js" />
-/// <reference path="viewer.js" />
-
-var AB;
-(function (AB) {
-
-    var ContextMenu = (function () {
-
-        function ContextMenu(viewer) {
-            var scope = this;
-
-            // Members
-            this.viewer = viewer;
-
-            this.showing = false;
-            this.savedColor = Raphael.rgb(255, 255, 255);
-            this.overColor = Raphael.rgb(140, 200, 230);
-
-            // Context menu elements
-            this.elements = [
-                { text: "Reduce", rect: null, action: "onReduce" },
-                { text: "Delete", rect: null, action: "onRemoveNode" },
-                { text: "Delete branch", rect: null, action: "onRemoveBranch" },
-                { text: "Connect / Disconnect", rect: null, action: "onDetachNode" },
-                { text: "Copy", rect: null, action: "onCopyStructure" },
-                { text: "Paste", rect: null, action: "onPasteStructure" },
-                // Add other elements here
-                { text: "", rect: null, action: null } // Color separator (top)
-            ];
-
-            // Finish
-            this.attachControl(viewer.graph.canvas);
-        }
-
-        // Attaches controls to the viewer
-        // element: the viewer element (canvas or div or etc.)
-        ContextMenu.prototype.attachControl = function (element) {
-            var scope = this;
-
-            var onClick = function (event) {
-                var x = scope.viewer.mousex;
-                var y = scope.viewer.mousey;
-
-                // Remove all context menu nodes, and run action if selected
-                if (scope.showing) {
-                    for (var i = 0; i < scope.elements.length; i++) {
-                        var el = scope.elements[i];
-
-                        if (el.action && el.rect.isPointInside(x, y))
-                            scope.viewer.utils[el.action]();
-
-                        scope.viewer._removeNode(el.rect);
-                    }
-                }
-                scope.showing = false;
-            };
-
-            var onMouseMove = function (event) {
-                // Override context menu's node color if mouse is inside
-                if (scope.showing) {
-                    for (var i = 0; i < scope.elements.length; i++) {
-                        var el = scope.elements[i];
-
-                        if (el.text == "")
-                            continue;
-
-                        var x = scope.viewer.mousex;
-                        var y = scope.viewer.mousey;
-
-                        if (el.rect.isPointInside(x, y))
-                            el.rect.attr(el.rect.rect, "fill", scope.overColor);
-                        else
-                            el.rect.attr(el.rect.rect, "fill", scope.savedColor);
-                    }
-                }
-            };
-
-            var onRightClick = function (event) {
-                var x = scope.viewer.mousex;
-                var y = scope.viewer.mousey;
-
-                if (y + (AB.Graph.NODE_HEIGHT * scope.elements.length) > scope.viewer.element.offsetHeight + scope.viewer.element.scrollTop)
-                    y = (AB.Graph.NODE_HEIGHT * scope.elements.length);
-                if (x + AB.Graph.NODE_WIDTH > scope.viewer.element.offsetWidth + scope.viewer.element.scrollLeft)
-                    x -= AB.Graph.NODE_WIDTH;
-
-                scope.viewer.onClick(event);
-
-                // Set selected node
-                var result = scope.viewer.traverseGraph(null, x, y);
-                if (result.hit) {
-                    scope.viewer.selectedNode = result.element;
-                }
-
-                if (!scope.showing) {
-                    if (scope.viewer.selectedNode == null)
-                        return;
-
-                    // Create elements
-                    var yOffset = 10;
-
-                    for (var i = 0; i < scope.elements.length - 1; i++) {
-                        var el = scope.elements[i];
-
-                        el.rect = scope.viewer._createNode(el.text, Raphael.rgb(216, 216, 216), true);
-                        scope.viewer._setNodePosition(el.rect, x, y + yOffset);
-
-                        el.rect.text.attr("x", x + 5);
-
-                        yOffset += AB.Graph.NODE_HEIGHT;
-                    }
-
-                    // Color separator
-                    var separator = scope.elements[scope.elements.length - 1];
-                    separator.rect = scope.viewer._createNode("", scope.viewer.getNodeColor(scope.viewer.selectedNode), true);
-                    scope.viewer._setNodePosition(separator.rect, x, y);
-                    separator.rect.attr(separator.rect.rect, "height", 10);
-
-                    // Finish
-                    scope.showing = true;
-                }
-                else {
-                    onClick();
-                    onRightClick(event);
-                }
-
-                window.event.returnValue = false;
-            };
-
-            document.addEventListener("click", onClick);
-            document.addEventListener("mousemove", onMouseMove);
-            element.addEventListener("contextmenu", onRightClick);
-        }
-
-        return ContextMenu;
-    })();
-
-    AB.ContextMenu = ContextMenu;
-
-})(AB || (AB = { }));

+ 0 - 152
Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/fonts.css

@@ -1,152 +0,0 @@
-@font-face {
-    font-family: "Sinkin Sans Thin";
-    src: url('fonts/SinkinSans/SinkinSans-100Thin.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-100Thin.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-100Thin.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-100Thin.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-100Thin.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans Thin Italic";
-    src: url('fonts/SinkinSans/SinkinSans-100ThinItalic.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-100ThinItalic.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-100ThinItalic.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-100ThinItalic.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-100ThinItalic.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans XLight";
-    src: url('fonts/SinkinSans/SinkinSans-200XLight.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-200XLight.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-200XLight.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-200XLight.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-200XLight.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans XLight Italic";
-    src: url('fonts/SinkinSans/SinkinSans-200XLightItalic.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-200XLightItalic.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-200XLightItalic.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-200XLightItalic.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-200XLightItalic.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans Light";
-    src: url('fonts/SinkinSans/SinkinSans-300Light.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-300Light.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-300Light.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-300Light.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-300Light.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans Light Italic";
-    src: url('fonts/SinkinSans/SinkinSans-300LightItalic.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-300LightItalic.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-300LightItalic.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-300LightItalic.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-300LightItalic.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans Italic";
-    src: url('fonts/SinkinSans/SinkinSans-400Italic.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-400Italic.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-400Italic.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-400Italic.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-400Italic.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans Regular";
-    src: url('fonts/SinkinSans/SinkinSans-400Regular.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-400Regular.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-400Regular.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-400Regular.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-400Regular.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans Medium";
-    src: url('fonts/SinkinSans/SinkinSans-500Medium.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-500Medium.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-500Medium.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-500Medium.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-500Medium.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans Medium Italic";
-    src: url('fonts/SinkinSans/SinkinSans-500MediumItalic.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-500MediumItalic.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-500MediumItalic.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-500MediumItalic.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-500MediumItalic.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans Semi-Bold";
-    src: url('fonts/SinkinSans/SinkinSans-600SemiBold.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-600SemiBold.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-600SemiBold.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-600SemiBold.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-600SemiBold.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans Semi-Bold Italic";
-    src: url('fonts/SinkinSans/SinkinSans-600SemiBoldItalic.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-600SemiBoldItalic.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-600SemiBoldItalic.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-600SemiBoldItalic.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-600SemiBoldItalic.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans Bold";
-    src: url('fonts/SinkinSans/SinkinSans-700Bold.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-700Bold.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-700Bold.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-700Bold.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-700Bold.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans Bold Italic";
-    src: url('fonts/SinkinSans/SinkinSans-700BoldItalic.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-700BoldItalic.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-700BoldItalic.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-700BoldItalic.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-700BoldItalic.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans Black";
-    src: url('fonts/SinkinSans/SinkinSans-800Black.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-800Black.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-800Black.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-800Black.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-800Black.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans XBlack";
-    src: url('fonts/SinkinSans/SinkinSans-900XBlack.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-900XBlack.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-900XBlack.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-900XBlack.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-900XBlack.svg#segeoN') format('svg');
-}
-
-@font-face {
-    font-family: "Sinkin Sans XBlack Italic";
-    src: url('fonts/SinkinSans/SinkinSans-900XBlackItalic.ttf');
-    src: url('fonts/SinkinSans/SinkinSans-900XBlackItalic.eot?#iefix') format('embedded-opentype'),
-        url('fonts/SinkinSans/SinkinSans-900XBlackItalic.woff') format('woff'),
-        url('fonts/SinkinSans/SinkinSans-900XBlackItalic.ttf') format('truetype'),
-        url('fonts/SinkinSans/SinkinSans-900XBlackItalic.svg#segeoN') format('svg');
-}

+ 0 - 210
Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/index.css

@@ -1,210 +0,0 @@
-html, body {
-  margin: 0;
-  padding: 0;
-  width: 100%;
-  height: 100%;
-  background-color: white;
-  cursor: default;
-}
-
-ul {
-  padding-left: 1em;
-  margin-bottom: 0.5em;
-  margin-top: 0.5em;
-}
-ul li {
-  list-style-type: none;
-  display: inline-block;
-  margin-right: 3em;
-  cursor: pointer;
-}
-ul li:last-child {
-  margin-right: 0;
-}
-
-svg {
-  left: 0 !important;
-}
-
-.container {
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-}
-.container a, .container p, .container li {
-  color: black;
-  font-family: Sinkin Sans Light;
-  font-size: 0.7em;
-}
-.container .formSend {
-  float: right;
-  width: 420px;
-  height: 55px;
-}
-.container .formSend button {
-  margin-right: 0.7em;
-  margin-bottom: 2em;
-  margin-top: 1.2em;
-  border: 0;
-  color: white;
-  width: 47%;
-  height: 50%;
-  border-radius: 1em;
-  moz-border-radius: 1em;
-  -webkit-border-radius: 1em;
-  -khtml-border-radius: 1em;
-  text-transform: uppercase;
-  font-family: "Sinkin Sans Semi-Bold";
-  outline: none;
-  cursor: pointer;
-}
-.container .formSend button.grey {
-  text-align: left;
-  padding-left: 1.5em;
-  background-color: #424242;
-}
-.container .formSend button.blue {
-  text-align: right;
-  padding-right: 1.5em;
-  background-color: #7facc1;
-}
-.container #Parameters, .container #List {
-  overflow: auto;
-  width: 25%;
-  /*height: 751px;*/
-  position: relative;
-  float: left;
-  margin-left: 1%;
-}
-.container #Parameters svg, .container #List svg {
-  width: 100%;
-}
-.container #Parameters {
-  position: relative;
-  margin-right: 1%;
-  background-color: #262626 !important;
-}
-.container #Parameters a {
-  margin-left: 3em;
-  color: white;
-}
-.container #Parameters .parametersClass {
-  border: 1px white solid;
-  margin: 0.9em;
-  padding-left: 0.3em;
-  padding-top: 0.5em;
-  padding-bottom: 0.5em;
-  border-radius: 2px;
-  moz-border-radius: 2px;
-  -webkit-border-radius: 2px;
-  -khtml-border-radius: 2px;
-  width: 88%;
-}
-.container #Parameters .parametersClass a {
-  border: 0;
-}
-.container #Parameters input.parametersClass, .container #Parameters select.parametersClass {
-  border: 0;
-  padding: 0;
-  height: 2em;
-  margin-left: 3em !important;
-  cursor: pointer;
-}
-.container #Parameters input.parametersClass {
-  width: 70%;
-  padding-left: 2em;
-  font-family: "Sinkin Sans Light";
-}
-.container #Parameters select.parametersClass {
-  width: 77%;
-  text-indent: 1em;
-  font-family: "Sinkin Sans Light";
-}
-.container #Parameters .parametersEditedNode {
-    width: 90%;
-    margin: 0.9em;
-    height: 25px;
-}
-.container #Parameters .parametersEditedNode a {
-    height: 100%;
-    text-align: center;
-    font-family: "Sinkin Sans Light";
-}
-.container #Parameters .parametersHelp {
-  position: absolute;
-  bottom: 0;
-  width: 100%;
-  padding: 0;
-  background-color: black;
-}
-.container #Parameters .parametersHelp a {
-  padding-left: 0.2em;
-  padding-right: 0.2em;
-  padding-top: 0.5em;
-  padding-bottom: 2em;
-  display: block;
-  width: auto;
-  text-align: left;
-  border: 0;
-  color: #828282;
-  font-style: italic;
-  max-height: 95%;
-  height: 95%;
-}
-.container .GraphContainer {
-  width: 46%;
-  /*height: 751px;*/
-  height: 100%;
-  max-height: 100%;
-  position: relative;
-  float: left;
-  margin-left: 1%;
-}
-.container #Graph {
-  background: -ms-linear-gradient(top, #262626 0%, #7d7e7d 100%);
-  background: linear-gradient(top, #262626 0%, #7d7e7d 100%);
-  background: -webkit-linear-gradient(top, #262626 0%, #7d7e7d 100%);
-  position: relative;
-  overflow: scroll;
-  height: 96%;
-  width: 100%;
-  position: relative;
-}
-
-.container #Graph svg {
-  overflow: scroll;
-  height: 100%;
-  display: inline-block;
-}
-
-.container #Toolbar {
-  margin: 0;
-  padding: 0;
-  background-color: black;
-  padding-top: 1.1%;
-  padding-bottom: 1.1%;
-}
-.container #Toolbar ul {
-  padding: 0;
-  margin: 0;
-  position: relative;
-}
-.container #Toolbar ul li {
-  color: white;
-  margin-right: 4em;
-}
-.container #Toolbar ul li:first-child {
-  margin-left: 3em;
-}
-.container #Toolbar ul li:last-child {
-  margin-right: 0;
-}
-.container #Toolbar ul li.border {
-  padding: 0.2em;
-  border: 1px solid white;
-}
-.container #List {
-  background-color: #3a3a3a;
-  max-height: 95%;
-  height: 95%;
-}

File diff suppressed because it is too large
+ 0 - 207
Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/index.html


+ 0 - 284
Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/list.js

@@ -1,284 +0,0 @@
-/// <reference path="raphael.js" />
-/// <reference path="actionKinds.js" />
-/// <reference path="viewer.js" />
-
-var AB;
-(function (AB) {
-
-    //
-    // List element
-    //
-    var ListElement = (function () {
-        function ListElement() {
-            // Members
-            this.rect = null;
-            this.text = null;
-
-            this.name = new String();
-            this.type = AB.ActionsBuilder.Type.SCENE;
-            this.kind = null;
-            this.properties = null;
-        }
-
-        ListElement.prototype.attr = function (element, attribute, value) {
-            if (value)
-                element.attr(attribute, value);
-            else
-                return element.attr(attribute);
-        }
-
-        return ListElement;
-    })();
-
-    var List = (function () {
-
-        //
-        // Public functions
-        //
-        function List(graph) {
-            // Members
-            this.telement = document.getElementById("ListTriggers");
-            this.aelement = document.getElementById("ListActions");
-            this.faelement = document.getElementById("ListFlowActions");
-
-            this.tlist = Raphael("ListTriggers", (25 * screen.width) / 100, 400);
-            this.alist = Raphael("ListActions", (25 * screen.width) / 100, 400);
-            this.falist = Raphael("ListFlowActions", (25 * screen.width) / 100, 400);
-            this.graph = graph;
-
-            this.listElements = new Array();
-            this.objectType = AB.ActionsBuilder.Type.OBJECT;
-
-            var scope = this;
-            window.onresize = function () {
-                for (var i = 0; i < scope.listElements.length; i++) {
-                    scope.listElements[i].attr(scope.listElements[i].rect, "width", scope.telement.getBoundingClientRect().width - 20);
-                }
-            }
-        }
-
-        // Clears the list of elements
-        List.prototype.clearList = function () {
-            for (var i = 0; i < this.listElements.length; i++) {
-                this._removeListElement(this.listElements[i]);
-            }
-        }
-
-        // Creates the list of elements automatically
-        List.prototype.createListElements = function () {
-            var excludedTriggers = [7, 10, 11]; // If objectType === Scene
-            var yOffset = 10;
-            var textColor = Raphael.rgb(61, 72, 76);
-            var whiteTitle = Raphael.rgb(255, 255, 255);
-
-            // Create Triggers
-            var t = this._createListElement("TRIGGERS", AB.ActionsBuilder.Type.OBJECT, null, yOffset, false, whiteTitle, this.tlist);
-            t.attr(t.text, "x", 15);
-            t.attr(t.rect, "fill", Raphael.rgb(41, 129, 255));
-            t.text.attr("font-family", "Sinkin Sans Medium");
-            t.text.attr("font-size", "11");
-            yOffset += List.ELEMENT_HEIGHT;
-
-            for (var i = 0; i < AB.ActionsBuilder.Trigger.COUNT; i++) {
-                if (excludedTriggers.indexOf(i) != -1 && this.objectType != AB.ActionsBuilder.Type.SCENE)
-                    continue;
-
-                var e = this._createListElement(AB.ActionsBuilder.Trigger[i].name, AB.ActionsBuilder.Type.TRIGGER,
-                                                AB.ActionsBuilder.Trigger[i].properties, yOffset, true, textColor,
-                                                this.tlist);
-                e.attr(e.rect, "fill", Raphael.rgb(133, 154, 185));
-
-                yOffset += List.ELEMENT_HEIGHT;
-            }
-
-            yOffset += List.ELEMENT_HEIGHT;
-            this.tlist.canvas.style.height = this.telement.style.height = yOffset + "px";
-            this._createCollapseAnimation(this.tlist, this.telement, yOffset, t);
-
-            // Create Actions
-            yOffset = 10;
-
-            var a = this._createListElement("ACTIONS", AB.ActionsBuilder.Type.OBJECT, null, yOffset, false, textColor, this.alist);
-            a.attr(a.text, "x", 15);
-            a.attr(a.rect, "fill", Raphael.rgb(255, 220, 42));
-            a.text.attr("font-family", "Sinkin Sans Medium");
-            a.text.attr("font-size", "11");
-            yOffset += List.ELEMENT_HEIGHT;
-
-            for (var i = 0; i < AB.ActionsBuilder.Action.COUNT; i++) {
-                var e = this._createListElement(AB.ActionsBuilder.Action[i].name, AB.ActionsBuilder.Type.ACTION,
-                                                AB.ActionsBuilder.Action[i].properties, yOffset, true, textColor,
-                                                this.alist);
-                e.attr(e.rect, "fill", Raphael.rgb(182, 185, 132));
-
-                yOffset += List.ELEMENT_HEIGHT;
-            }
-
-            yOffset += List.ELEMENT_HEIGHT;
-            this.alist.canvas.style.height = this.aelement.style.height = yOffset + "px";
-            this._createCollapseAnimation(this.alist, this.aelement, yOffset, a);
-
-            // Create flow control
-            yOffset = 10;
-
-            var f = this._createListElement("FLOW CONTROL", AB.ActionsBuilder.Type.OBJECT, null, yOffset, false, whiteTitle, this.falist);
-            f.attr(f.text, "x", 15);
-            f.attr(f.rect, "fill", Raphael.rgb(255, 41, 53));
-            f.text.attr("font-family", "Sinkin Sans Medium");
-            f.text.attr("font-size", "11");
-            yOffset += List.ELEMENT_HEIGHT;
-
-            for (var i = 0; i < AB.ActionsBuilder.FlowAction.COUNT; i++) {
-                var e = this._createListElement(AB.ActionsBuilder.FlowAction[i].name, AB.ActionsBuilder.Type.FLOW_CONTROL,
-                                                AB.ActionsBuilder.FlowAction[i].properties, yOffset, true, textColor,
-                                                this.falist);
-                e.attr(e.rect, "fill", Raphael.rgb(185, 132, 140));
-
-                yOffset += List.ELEMENT_HEIGHT;
-            }
-
-            yOffset += List.ELEMENT_HEIGHT;
-            this.falist.canvas.style.height = this.faelement.style.height = yOffset + "px";
-            this._createCollapseAnimation(this.falist, this.faelement, yOffset, f);
-        }
-
-        // Sets the color theme of the list (background)
-        List.prototype.setColorTheme = function (color) {
-            this.tlist.canvas.style.backgroundColor = color;
-            this.alist.canvas.style.backgroundColor = color;
-            this.falist.canvas.style.backgroundColor = color;
-        }
-
-        //
-        // Private functions
-        //
-
-        // Creates a list element
-        // name: the element's name
-        // type: the elements type (TRIGGER, ACTION, FLOW_CONTROL)
-        // properties: array of properties
-        // yOffset: the y position of the element
-        // drag: boolean, if the element should be animated
-        // textColor: optional, the text color
-        // list: the raphaeljs object
-        List.prototype._createListElement = function (name, type, properties, yOffset, drag, textColor, list) {
-            var e = new ListElement();
-
-            e.rect = list.rect(10, yOffset, this.telement.getBoundingClientRect().width - 30, List.ELEMENT_HEIGHT);
-            e.text = list.text(e.rect.attr("x") + 20, yOffset + e.rect.attr("height") / 2, name);
-            e.name = name;
-            e.type = type;
-            e.properties = properties;
-
-            e.rect.attr("fill", Raphael.rgb(64, 64, 64));
-            e.rect.attr("stroke", Raphael.rgb(58, 58, 58));
-            e.text.attr("font-size", "12");
-            e.text.attr("text-anchor", "start");
-            e.text.attr("font-family", "Sinkin Sans Light");
-            if (textColor)
-                e.text.attr("fill", textColor);
-
-            if (drag) {
-                this._createListElementAnimation(e);
-            }
-
-            this.listElements.push(e);
-            return e;
-        }
-
-        // Removes a list element
-        // element: the list element to remove
-        List.prototype._removeListElement = function (element) {
-            element.rect.remove();
-            element.text.remove();
-        }
-
-        // Creates the collapse / expand animation
-        // element: the element to animated
-        // htmlElement: the html element container
-        // expandedHeight: the height when list is expanded
-        // onElement: the element that receives the click element
-        List.prototype._createCollapseAnimation = function (element, htmlElement, expandedHeight, onElement) {
-            var onClick = function (event) {               
-                var height = htmlElement.style.height;
-                if (height == expandedHeight + "px") {
-                    htmlElement.style.height = element.canvas.style.height = 35 + "px";
-                }
-                else {
-                    htmlElement.style.height = element.canvas.style.height = expandedHeight + "px";
-                }
-            };
-
-            onElement.rect.click(onClick);
-        }
-
-        // Creates the animation of list elements
-        // element: the element to animate
-        List.prototype._createListElementAnimation = function (element) {
-            var scope = this;
-            var mousex, mousey;
-
-            var onMove = function (dx, dy, x, y, event) {
-                mousex = x;
-                mousey = y;
-            };
-
-            var onStart = function (x, y, event) {
-                element.rect.animate({
-                    x: -10,
-                    opacity: 0.25
-                }, 500, ">");
-                element.text.animate({
-                    x: 10,
-                    opacity: 0.25
-                }, 500, ">");
-            };
-
-            var onEnd = function (event) {
-                element.rect.animate({
-                    x: 10,
-                    opacity: 1.0
-                }, 500, "<");
-                element.text.animate({
-                    x: 30,
-                    opacity: 1.0
-                }, 500, "<");
-
-                var x = mousex - scope.graph.graph.canvas.getBoundingClientRect().left;
-                var y = mousey - scope.graph.graph.canvas.getBoundingClientRect().top;
-                var dragResult = scope.graph.traverseGraph(null, x, y);
-
-                if (dragResult.hit) {
-                    if (element.type == AB.ActionsBuilder.Type.TRIGGER && dragResult.element != scope.graph.root.action)
-                        return;
-
-                    if (element.type == AB.ActionsBuilder.Type.ACTION && dragResult.element == scope.graph.root.action)
-                        return;
-
-                    if (element.type == AB.ActionsBuilder.Type.FLOW_CONTROL && (dragResult.element == scope.graph.root.action || (dragResult.element.type == AB.ActionsBuilder.Type.FLOW_CONTROL && dragResult.element.parent.hub == null)))
-                        return;
-
-                    if (element.type == AB.ActionsBuilder.Type.FLOW_CONTROL && dragResult.element.combine)
-                        return;
-
-                    if (!dragResult.element.combine && dragResult.element.children.length > 0 && dragResult.element.type != AB.ActionsBuilder.Type.TRIGGER && dragResult.element != scope.graph.root.action)
-                        return;
-
-                    scope.graph.addNode(dragResult.element, element);
-                    scope.graph.update();
-                }
-            };
-
-            element.rect.drag(onMove, onStart, onEnd);
-            element.text.drag(onMove, onStart, onEnd);
-        }
-
-        List.ELEMENT_HEIGHT = 25;
-
-        return List;
-    })();
-
-    AB.List = List;
-    AB.ListElement = ListElement;
-
-})(AB || (AB = { }));

+ 0 - 307
Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/parametersManager.js

@@ -1,307 +0,0 @@
-/// <reference path="raphael.js" />
-/// <reference path="actionKinds.js" />
-/// <reference path="viewer.js" />
-
-var AB;
-(function (AB) {
-
-    var ParametersManager = (function () {
-
-        function ParametersManager(viewer) {
-            // Members
-            this.viewer = viewer;
-            this.parametersElement = document.getElementById("Parameters");
-        }
-
-        // Clears the parameters view (right side)
-        ParametersManager.prototype.clearParameters = function () {
-            if (this.divHelpText) {
-                this.divHelpText.parentNode.removeChild(this.divHelpText);
-                this.divHelpText = null;
-            }
-
-            while (this.parametersElement.childNodes.length)
-                this.parametersElement.removeChild(this.parametersElement.firstChild);
-        }
-
-        // Creates the help section
-        ParametersManager.prototype.createHelpSection = function (element) {
-            var divHelpText = document.createElement("div");
-            divHelpText.className = "parametersHelp";
-            this.parametersElement.appendChild(divHelpText);
-
-            var helpText = document.createElement("a");
-            helpText.innerHTML = AB.ActionsBuilder.GetDescriptionFromActionName(element.action.name);
-            helpText.className = "parametersClass";
-            divHelpText.appendChild(helpText);
-        }
-
-        // Creates parameters for the given element (node / action)
-        ParametersManager.prototype.createParameters = function (element) {
-            // Events
-            var onInputChange = function (input, propertyID) {
-                return function () {
-                    var value = input.value;
-                    element.action.propertiesResults[propertyID] = value;
-                };
-            };
-
-            var onTargetTypeChanged = function (targetTypeSelect, propertyPathSelect, targetNameSelect, propertyID) {
-                return function () {
-                    var selected = targetTypeSelect.selectedIndex;
-                    var value = targetTypeSelect.options[selected].value;
-
-                    if (targetNameSelect != null && value != "SceneProperties") {
-                        var array = null;
-                        // Keep target name value
-                        var nameValue = targetNameSelect.value;
-
-                        targetNameSelect.length = 0;
-
-                        if (value == "MeshProperties") array = AB.ActionsBuilder.MeshesList;
-                        else if (value == "LightProperties") array = AB.ActionsBuilder.LightsList;
-                        else if (value == "CameraProperties") array = AB.ActionsBuilder.CamerasList;
-
-                        for (var i = 0; i < array.length; i++) {
-                            var option = document.createElement("option");
-                            option.value = array[i];
-                            option.innerHTML = array[i];
-                            targetNameSelect.add(option);
-                        }
-
-                        targetNameSelect.value = nameValue;
-                    }
-
-                    if (propertyPathSelect != null) {
-                        // Get array of properties for selected object type (scene, camera, light, mesh, ...)
-                        var array = AB.ActionsBuilder[targetTypeSelect.options[selected].value];
-                        propertyPathSelect.length = 0;
-
-                        for (var j = 0; j < array.length; j++) {
-                            var option = document.createElement("option");
-                            option.value = array[j].name;
-                            option.innerHTML = array[j].name;
-                            propertyPathSelect.add(option);
-                        }
-                    }
-                    element.action.properties[propertyPathSelect != null ? propertyID - 1 : propertyID].targetType = targetTypeSelect.options[selected].value;
-                };
-            };
-
-            var onTargetNameChanged = function (targetNameSelect, propertyID) {
-                return function () {
-                    element.action.propertiesResults[propertyID] = targetNameSelect.options[targetNameSelect.selectedIndex].value;
-                }
-            }
-
-            var onPropertyPathChanged = function (propertyPathSelect, additionalInput, propertyID) {
-                return function () {
-                    additionalInput.value = "";
-                    element.action.propertiesResults[propertyID] = propertyPathSelect.options[propertyPathSelect.selectedIndex].value;
-                };
-            };
-
-            var onAdditionalPropertyPathChanged = function (propertyPathSelect, additionalInput, propertyID) {
-                return function () {
-                    var propertyPath = propertyPathSelect.options[propertyPathSelect.selectedIndex].value;
-                    if (additionalInput.value != "")
-                        propertyPath += "." + additionalInput.value;
-                    element.action.propertiesResults[propertyID] = propertyPath;
-                };
-            };
-
-            var onConditionOperatorChanged = function (conditionOperatorSelect, propertyID) {
-                return function () {
-                    element.action.propertiesResults[propertyID] = conditionOperatorSelect.options[conditionOperatorSelect.selectedIndex].value;
-                };
-            };
-
-            // Special Elements
-            var targetTypeSelect = null;
-            var targetNameSelect = null;
-            var propertyPathSelect = null;
-            var soundNameSelect = null;
-
-            // Clear view (div)
-            this.clearParameters();
-
-            // Get properties
-            var p = element.action.properties;
-            var pr = element.action.propertiesResults;
-
-            // Create edition presentation
-            var divEditedNode = document.createElement("div");
-            divEditedNode.className = "parametersEditedNode";
-            divEditedNode.style.backgroundColor = this.viewer.getSelectedNodeColor(element.action, this.viewer.isParentDetached(element.action));
-            divEditedNode.style.border = "2px solid white";
-
-            var textEditedNode = document.createElement("a");
-            textEditedNode.className = "parametersEditedNode";
-            textEditedNode.innerHTML = element.action.name;
-            textEditedNode.style.verticalAlign = "middle";
-            textEditedNode.style.textAlign = "center";
-            if (element.action.type == AB.ActionsBuilder.Type.ACTION)
-                textEditedNode.style.color = "black";
-            else
-                textEditedNode.style.color = "white";
-            textEditedNode.style.width = textEditedNode.style.height = "100%";
-            divEditedNode.appendChild(textEditedNode);
-
-            this.parametersElement.appendChild(divEditedNode);
-
-            if (p.length == 0) {
-                this.createHelpSection(element);
-                return;
-            }
-
-            // Create parameters
-            for (var i = 0; i < p.length; i++) {
-                // Create separator
-                var separator = document.createElement("hr");
-                separator.noShade = true;
-                separator.style.width = "90%";
-
-                this.parametersElement.appendChild(separator);
-
-                // Parameter text
-                var propertyText = document.createElement("a");
-                propertyText.text = p[i].text;
-
-                this.parametersElement.appendChild(propertyText);
-
-                // If target, add the input element + combo box with target type
-                if (p[i].text == "sound") {
-                    soundNameSelect = document.createElement("select");
-                    soundNameSelect.className = "parametersClass";
-
-                    for (var j = 0; j < AB.ActionsBuilder.SoundsList.length; j++) {
-                        var name = AB.ActionsBuilder.SoundsList[j];
-                        var option = document.createElement("option");
-                        option.value = option.innerHTML = name;
-                        option.className = "parametersClass";
-                        soundNameSelect.add(option);
-                    }
-
-                    soundNameSelect.value = pr[i];
-                    this.parametersElement.appendChild(document.createElement("br"));
-                    this.parametersElement.appendChild(soundNameSelect);
-
-                    soundNameSelect.onchange = onInputChange(soundNameSelect, i);
-
-                    continue;
-                }
-                else if (p[i].text == "target"
-                    || (element.action.type == AB.ActionsBuilder.Type.TRIGGER && p[i].text == "parameter")
-                    || p[i].text == "parent")
-                {
-                    targetTypeSelect = document.createElement("select");
-                    targetTypeSelect.className = "parametersClass";
-
-                    for (var j = 0; j < AB.ActionsBuilder.DataTypesNames.length; j++) {
-                        var data = AB.ActionsBuilder.DataTypesNames[j];
-                        var option = document.createElement("option");
-                        option.value = data.data;
-                        option.innerHTML = data.name;
-                        option.className = "parametersClass";
-                        targetTypeSelect.add(option);
-                    }
-
-                    targetTypeSelect.value = p[i].targetType;
-
-                    this.parametersElement.appendChild(document.createElement("br"));
-                    this.parametersElement.appendChild(targetTypeSelect);
-
-                    // List names
-                    targetNameSelect = document.createElement("select");
-                    targetNameSelect.className = "parametersClass";
-
-                    this.parametersElement.appendChild(document.createElement("br"));
-                    this.parametersElement.appendChild(targetNameSelect);
-
-                    onTargetTypeChanged(targetTypeSelect, null, targetNameSelect, i)();
-
-                    targetNameSelect.value = pr[i];
-
-                    targetTypeSelect.onchange = onTargetTypeChanged(targetTypeSelect, null, targetNameSelect, i);
-                    targetNameSelect.onchange = onTargetNameChanged(targetNameSelect, i);
-
-                    continue;
-                }
-                // If propertyPath, add the combox box to select the property and input element for additional property
-                else if (p[i].text == "propertyPath") {
-                    propertyPathSelect = document.createElement("select");
-                    propertyPathSelect.className = "parametersClass";
-
-                    this.parametersElement.appendChild(document.createElement("br"));
-                    this.parametersElement.appendChild(propertyPathSelect);
-
-                    // Special input, then continue after its creation
-                    var additionalInput = document.createElement("input");
-                    additionalInput.setAttribute("value", "");
-                    additionalInput.className = "parametersClass";
-
-                    this.parametersElement.appendChild(document.createElement("br"));
-                    this.parametersElement.appendChild(additionalInput);
-
-                    // If propertyPath exists, then target exists
-                    targetTypeSelect.onchange = onTargetTypeChanged(targetTypeSelect, propertyPathSelect, targetNameSelect, i);
-                    propertyPathSelect.onchange = onPropertyPathChanged(propertyPathSelect, additionalInput, i);
-                    additionalInput.onkeyup = onAdditionalPropertyPathChanged(propertyPathSelect, additionalInput, i);
-
-                    // Fill propertyPath combo box
-                    onTargetTypeChanged(targetTypeSelect, propertyPathSelect, targetNameSelect, i)();
-
-                    // Set selected property
-                    var propertyName = pr[i].split(".");
-                    propertyPathSelect.value = propertyName[0];
-
-                    var additionPropertyName = "";
-                    for (var j = 1; j < propertyName.length; j++)
-                        additionPropertyName += propertyName[j];
-
-                    additionalInput.setAttribute("value", additionPropertyName);
-
-                    // Finish
-                    continue;
-                }
-                    // Value condition, add combo box for operator type
-                else if (p[i].text == "operator") {
-                    var conditionOperatorSelect = document.createElement("select");
-                    conditionOperatorSelect.className = "parametersClass";
-
-                    for (var j = 0; j < AB.ActionsBuilder.FlowActionOperators.length; j++) {
-                        var option = document.createElement("option");
-                        option.value = AB.ActionsBuilder.FlowActionOperators[j];
-                        option.innerHTML = AB.ActionsBuilder.FlowActionOperators[j];
-                        conditionOperatorSelect.add(option);
-                    }
-
-                    conditionOperatorSelect.value = pr[i];
-                    conditionOperatorSelect.onchange = onConditionOperatorChanged(conditionOperatorSelect, i);
-
-                    this.parametersElement.appendChild(document.createElement("br"));
-                    this.parametersElement.appendChild(conditionOperatorSelect);
-
-                    continue;
-                }
-
-                var propertyInput = document.createElement("input");
-                propertyInput.setAttribute("value", pr[i]);
-                propertyInput.onkeyup = onInputChange(propertyInput, i);
-                propertyInput.className = "parametersClass";
-
-                //this.parametersElement.appendChild(document.createElement("br"));
-                this.parametersElement.appendChild(propertyInput);
-            }
-
-            // Create help text (bottom)
-            this.createHelpSection(element);
-        }
-
-        return ParametersManager;
-
-    })();
-
-    AB.ParametersManager = ParametersManager;
-
-})(AB || (AB = {}));

File diff suppressed because it is too large
+ 0 - 11
Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/raphael.js


+ 0 - 216
Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/utils.js

@@ -1,216 +0,0 @@
-/// <reference path="raphael.js" />
-/// <reference path="viewer.js" />
-
-var AB;
-(function (AB) {
-
-    var Utils = (function () {
-        function Utils(viewer) {
-            // Members
-            this.viewer = viewer;
-        }
-
-        // Removes the selected node
-        Utils.prototype.onRemoveNode = function () {
-            if (!this.viewer.selectedNode)
-                return;
-
-            var node = this.viewer.selectedNode;
-
-            if (node.type == AB.ActionsBuilder.Type.FLOW_CONTROL && node.parent.combine)
-                this.viewer.selectedNode = node.parent;
-
-            node.parent.removeChild(node);
-            this.viewer._removeAction(node, false);
-
-            if (node.combine) {
-                // Remove hub
-                var hub = node.hub;
-
-                node.parent.removeChild(hub.action);
-                this.viewer._removeAction(hub.action, false);
-
-                if (hub.action.children.length > 0)
-                    node.hub.action.children[0].parent = node.parent;
-            }
-
-            this.viewer.update();
-            this.viewer.parametersManager.clearParameters();
-
-            this.viewer.selectedNode = null;
-        }
-
-        // Removes the selected branch (starting from the selected node)
-        Utils.prototype.onRemoveBranch = function () {
-            if (!this.viewer.selectedNode)
-                return;
-
-            var node = this.viewer.selectedNode;
-
-            if (node.type == AB.ActionsBuilder.Type.FLOW_CONTROL && node.parent.combine)
-                this.selectedNode = node.parent;
-
-            node.parent.removeChild(this.selectedNode);
-            this.viewer._removeAction(node, true);
-
-            this.viewer.update();
-            this.viewer.parametersManager.clearParameters();
-
-            this.viewer.selectedNode = null;
-        }
-
-        // Detaches the selected node
-        // forceDetach: forces the Detach Color (green) for children of the selected node
-        // forceAttach: same as forceDetach but for the original node color
-        Utils.prototype.onDetachNode = function (forceDetach, forceAttach) {
-            if (!this.viewer.selectedNode)
-                return;
-
-            var node = this.viewer.selectedNode;
-
-            if (forceDetach == null) forceDetach = false;
-            if (forceAttach == null) forceAttach = false;
-
-            var detached = node.node.detached;
-            if (forceAttach)
-                detached = false;
-            else if (forceDetach)
-                detached = true;
-            else
-                detached = !detached;
-
-            node.node.detached = detached;
-
-            var scope = this;
-            var resetColor = function (root, color) {
-                var col = color == null ? scope.viewer.getNodeColor(root, scope.viewer.isParentDetached(root)) : color;
-                root.node.attr(root.node.rect, "fill", col);
-
-                if (root.node.line)
-                    root.node.attr(root.node.line, "stroke", col);
-
-                if (root.combine) {
-                    for (var i = 0; i < root.combineArray.length; i++) {
-                        resetColor(root.combineArray[i], color);
-                    }
-                }
-
-                for (var i = 0; i < root.children.length; i++) {
-                    resetColor(root.children[i], color);
-                }
-            };
-
-            this.viewer._setLine(node);
-            resetColor(node, !detached ? null : this.viewer.getNodeColor(node));
-        }
-
-        // Disconnects all triggers
-        Utils.prototype.onDetachAll = function (forceDetach, forceAttach) {
-            var scope = this;
-
-            var detach = function (root) {
-                scope.viewer.selectedNode = root;
-                scope.onDetachNode(forceDetach, forceAttach);
-            };
-
-            for (var i = 0; i < this.viewer.root.action.children.length; i++)
-                detach(this.viewer.root.action.children[i]);
-        }
-
-        // Copies the selected node structure (except root node) to the
-        // clipboard
-        Utils.prototype.onCopyStructure = function () {
-            if (!this.viewer.selectedNode)
-                return;
-
-            var structure = this.viewer.createJSON(this.viewer.selectedNode);
-            var asText = JSON.stringify(structure);
-
-            window.clipboardData.setData("text", asText);
-        }
-
-        // Pastes the previously copied structure (onCopyStructure) to
-        // the selected node
-        Utils.prototype.onPasteStructure = function () {
-            if (!this.viewer.selectedNode)
-                return;
-
-            var asText = window.clipboardData.getData("text");
-            var isJson = asText.length > 0 && asText[0] == "{" && asText[asText.length - 1] == "}";
-            var structure = JSON.parse(asText);
-            var node = this.viewer.selectedNode;
-
-            if (structure.type == AB.ActionsBuilder.Type.TRIGGER && node.node != this.viewer.root) {
-                alert("You can't paste a trigger if the selected node isn't the root object");
-                return;
-            }
-
-            if (structure.type != AB.ActionsBuilder.Type.TRIGGER && node.node == this.viewer.root) {
-                alert("You can't paste an action or condition if the selected node is the root object");
-                return;
-            }
-
-            this.viewer.loadFromJSON(structure, node);
-            this.viewer.update();
-        }
-
-        // Reduces the select node's width
-        Utils.prototype.onReduce = function (forceExpand, forceReduce) {
-            if (!this.viewer.selectedNode)
-                return;
-
-            if (forceExpand == null) forceExpand = false;
-            if (forceReduce == null) forceReduce = false;
-
-            var node = this.viewer.selectedNode.node;
-            var width = node.attr(node.rect, "width");
-
-            if ((width >= Graph.NODE_WIDTH && !forceExpand) || forceReduce) {
-                node.text.hide();
-                node.rect.stop();
-            }
-            else {
-                node.text.show();
-                node.attr(node.rect, "opacity", 1.0);
-            }
-
-            node.attr(node.rect, "width", (width >= Graph.NODE_WIDTH * this.viewer.zoom && !forceExpand) || forceReduce ? Graph.NODE_MINIMIZED_WIDTH * this.viewer.zoom : Graph.NODE_WIDTH * this.viewer.zoom);
-            node.minimized = !node.minimized;
-
-            this.viewer.update();
-        }
-
-        // Reduces all graph's nodes
-        Utils.prototype.onReduceAll = function (forceExpand) {
-            if (forceExpand == null)
-                forceExpand = false;
-
-            var scope = this;
-
-            var reduce = function (root) {
-                scope.viewer.selectedNode = root;
-                scope.onReduce(forceExpand, forceExpand ? false : true);
-
-                if (root.combine) {
-                    for (var i = 0; i < root.combineArray.length; i++)
-                        reduce(root.combineArray[i]);
-                }
-
-                for (var i = 0; i < root.children.length; i++)
-                    reduce(root.children[i]);
-
-            };
-
-            for (var i = 0; i < this.viewer.root.action.children.length; i++)
-                reduce(this.viewer.root.action.children[i]);
-
-            this.viewer.selectedNode = null;
-        }
-
-        return Utils;
-
-    })();
-
-    AB.Utils = Utils;
-
-})(AB || (AB = {}));

+ 0 - 750
Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/viewer.js

@@ -1,750 +0,0 @@
-/// <reference path="raphael.js" />
-/// <reference path="action.js" />
-/// <reference path="contextmenu.js" />
-/// <reference path="viewertoolbar.js" />
-/// <reference path="parametersManager.js" />
-/// <reference path="utils.js" />
-
-var AB;
-(function (AB) {
-
-    var Graph = (function () {
-
-        //
-        // Public functions
-        //
-        function Graph() {
-            var scope = this;
-
-            // Members
-            this.element = document.getElementById("Graph");
-            this.graph = Raphael("Graph", (50 * screen.width) / 100, screen.height);
-            this.root = this._createNode("Object name", Raphael.rgb(255, 255, 255), true);
-
-            this.utils = new AB.Utils(this);
-            this.contextMenu = new AB.ContextMenu(this);
-            this.toolbar = new AB.ToolBar(this);
-            this.parametersManager = new AB.ParametersManager(this);
-
-            this.mousex = 0;
-            this.mousey = 0;
-            this.objectName = "";
-            this.editing = false;
-            this.zoom = 1.0;
-
-            this.selectedNode = null;
-
-            this.element.onmouseover = function () {
-                scope.editing = false;
-            };
-            this.element.onmouseout = function () {
-                scope.editing = true;
-            };
-
-            document.addEventListener("click", function (event) {
-                if (!scope.contextMenu.showing) {
-                    scope.onClick(event);
-                }
-            });
-            document.ondblclick = function (event) {
-                var result = scope.traverseGraph(null, scope.mousex, scope.mousey);
-                if (result.hit && result.element.node != scope.root) {
-                    scope.onReduce();
-                }
-            };
-            document.onmousemove = function (event) {
-                scope.mousex = event.clientX - scope.graph.canvas.getBoundingClientRect().left;
-                scope.mousey = event.clientY - scope.graph.canvas.getBoundingClientRect().top;
-            };
-
-            // Set properties
-            this.element.scrollLeft = (this.element.getBoundingClientRect().width / 2) + (Graph.NODE_WIDTH / 2);
-        }
-
-        // Handles the click event. Called by this and this.contextmenu
-        // event: the event object
-        Graph.prototype.onClick = function (event) {
-            var result = this.traverseGraph(null, this.mousex, this.mousey, true);
-
-            if (!this.editing) {
-                if (this.selectedNode != null) {
-                    var detached = this.isParentDetached(this.selectedNode);
-                    this.selectedNode.node.attr(this.selectedNode.node.rect, "fill", this.getNodeColor(this.selectedNode, detached));
-                    this.selectedNode = null;
-                    if (!result.hit)
-                        this.parametersManager.clearParameters();
-                }
-
-                if (result.hit && result.element.node != this.root) {
-                    this.selectedNode = result.element;
-                    this.selectedNode.node.attr(this.selectedNode.node.rect, "fill", this.getSelectedNodeColor(this.selectedNode, detached));
-                }
-
-                if (!result.hit)
-                    this.selectedNode = null;
-            }
-        }
-
-        // Returns the node's color for a given type
-        // action : the action to test
-        // returns the node color
-        Graph.prototype.getSelectedNodeColor = function (action, detached) {
-            // Detached
-            if (action.detached || (action.node && action.node.detached) || detached)
-                return Raphael.rgb(96, 122, 14);
-
-            // Get proper color
-            var color = Raphael.rgb(255, 255, 255); // Default color for root
-            switch (action.type) {
-                case AB.ActionsBuilder.Type.TRIGGER: color = Raphael.rgb(41, 129, 255); break;
-                case AB.ActionsBuilder.Type.ACTION: color = Raphael.rgb(255, 220, 42); break;
-                case AB.ActionsBuilder.Type.FLOW_CONTROL: color = Raphael.rgb(255, 41, 53); break;
-            }
-
-            return color;
-        }
-
-        Graph.prototype.getNodeColor = function (action, detached) {
-            if (action.detached || (action.node && action.node.detached) || detached)
-                return Raphael.rgb(96, 122, 14);
-
-            // Get proper color
-            var color = Raphael.rgb(255, 255, 255); // Default color for root
-            switch (action.type) {
-                case AB.ActionsBuilder.Type.TRIGGER: color = Raphael.rgb(133, 154, 185); break;
-                case AB.ActionsBuilder.Type.ACTION: color = Raphael.rgb(182, 185, 132); break;
-                case AB.ActionsBuilder.Type.FLOW_CONTROL: color = Raphael.rgb(185, 132, 140); break;
-            }
-
-            return color;
-        }
-
-        Graph.prototype.isParentDetached = function (node) {
-            var parent = node.parent;
-            while (parent != null) {
-                if (parent.node.detached)
-                    return true;
-                parent = parent.parent;
-            }
-
-            return false;
-        }
-
-        // Adds a node to the graph
-        // parent : the parent of the added node
-        // listElement : the values
-        Graph.prototype.addNode = function (parent, listElement) {
-            var color = this.getNodeColor(listElement);
-
-            var n = this._createNode(listElement.name, color, parent.combine ? true : false);
-            if (listElement.name == "CombineAction") {
-                n.action.combine = true;
-
-                var hubElement = AB.ActionsBuilder.FlowAction.Hub;
-                var hubType = AB.ActionsBuilder.Type.FLOW_CONTROL;
-                n.action.hub = this._createNode(hubElement.name, this.getNodeColor({ type: hubType }), false);
-                n.action.hub.action.type = hubType;
-                n.action.addChild(n.action.hub.action);
-                this._createNodeAnimation(n.action.hub);
-            }
-
-            n.action.name = listElement.name;
-            n.action.type = listElement.type;
-            n.detached = listElement.detached || false;
-            n.action.properties = listElement.properties;
-
-            for (var i = 0; i < listElement.properties.length; i++)
-                n.action.propertiesResults.push(listElement.properties[i].value);
-
-            if (parent && !parent.combine) {
-                parent.addChild(n.action);
-            }
-            else if (parent.combine) {
-                // Create hub
-                parent.combineArray.push(n.action);
-                n.action.parent = parent;
-                parent.node.attr(parent.node.text, "text", "");
-            }
-
-            this._createNodeAnimation(n);
-
-            return n;
-        }
-
-        // Updates the graph
-        Graph.prototype.update = function () {
-            var scope = this;
-            var rootChildID = 0;
-
-            var setNodeSize = function(node) {
-                if (node.minimized) {
-                    node.attr(node.rect, "width", Graph.NODE_MINIMIZED_WIDTH * scope.zoom);
-                    node.attr(node.rect, "height", Graph.NODE_HEIGHT * scope.zoom);
-                }
-                else {
-                    node.attr(node.rect, "width", Graph.NODE_WIDTH * scope.zoom);
-                    node.attr(node.rect, "height", Graph.NODE_HEIGHT * scope.zoom);
-                }
-                node.attr(node.text, "font-size", 11 * scope.zoom);
-            }
-
-            var onUpdate = function (action, yOffset) {
-                var node = action.node;
-                var parent = action.parent ? action.parent.node : null;
-
-                // Set size of node according to zoom
-                if (action.combine) {
-                    var length = 0;
-                    for (var i = 0; i < action.combineArray.length; i++) {
-                        var n = action.combineArray[i].node;
-
-                        setNodeSize(n);
-
-                        length += n.attr(n.rect, "width");
-                    }
-                }
-                setNodeSize(node);
-
-                // Set position
-                if (parent) {
-                    scope._setNodePosition(node, parent.attr(parent.rect, "x"), yOffset);
-                    scope._setLine(action);
-                }
-
-                // Calculate total width
-                var totalWidth = 0;
-                for (var i = 0; i < action.children.length; i++) {
-                    var n = action.children[i].node;
-                    totalWidth += n.attr(n.rect, "width");
-                }
-
-                var nodeWidth = node.attr(node.rect, "width");
-                var nodex = node.attr(node.rect, "x");
-
-                var startingXPos = nodex + (nodeWidth / 2) - (totalWidth / 2);
-
-                // Recursively set position of children
-                for (var i = 0; i < action.children.length; i++) {
-
-                    var n = action.children[i].node;
-                    var newx = startingXPos;
-                    var newy = yOffset + Graph.VERTICAL_OFFSET * scope.zoom;
-
-                    onUpdate(n.action, newy);
-
-                    scope._setNodePosition(n, newx, newy);
-                    scope._setLine(n.action);
-                    startingXPos += n.attr(n.rect, "width");
-                }
-            };
-
-            var onPosition = function (action, maxWidth) {
-
-                var total = 0;
-                var start = action.combine && action.combineArray.length > 1 ? 0 : 1;
-
-                for (var i = start; i < action.children.length; i++) {
-                    var n = action.children[i].node;
-
-                    if (action.combine) {
-                        for (var j = 1; j < action.combineArray.length; j++) {
-                            var cn = action.combineArray[j].node;
-                            total += cn.attr(cn.rect, "width");
-                        }
-                    }
-                    else
-                        total += n.attr(n.rect, "width");
-                }
-
-                if (total > maxWidth) {
-                    maxWidth = total;
-                }
-
-                for (var i = 0; i < action.children.length; i++) {
-                    maxWidth = onPosition(action.children[i], maxWidth);
-                }
-
-                return maxWidth;
-
-            };
-
-            // Set root node position / scale and recursively set position of its children
-            this._setNodePosition(this.root, (this.graph.width / 2) - (Graph.NODE_WIDTH / 2) * this.zoom, 10);
-            this.root.attr(this.root.rect, "width", Graph.NODE_WIDTH * scope.zoom);
-            this.root.attr(this.root.rect, "height", Graph.NODE_HEIGHT * scope.zoom);
-
-            onUpdate(this.root.action, 10 * this.zoom);
-
-            // Get total widths
-            var widths = new Array();
-            /*
-            object:
-                {
-                    triggerWidth: number
-                    childrenWidths: new Array<number>()
-                }
-            */
-
-            for (var i = 0; i < scope.root.action.children.length; i++) {
-                var a = scope.root.action.children[i];
-
-                var obj = {
-                    triggerWidth: onPosition(a, 0),
-                    childrenWidths: new Array()
-                };
-
-                for (var j = 0; j < a.children.length; j++) {
-                    var cw = onPosition(a.children[j], 0);
-                    obj.childrenWidths.push(cw);
-                    obj.triggerWidth += cw;
-                }
-
-                widths.push(obj);
-            }
-
-            // Set new position of children
-            var rx = scope.root.attr(scope.root.rect, "x");
-            var rwidth = 0;
-            var cwidth = 0;
-
-            for (var i = 0; i < scope.root.action.children.length; i++) {
-                var a = scope.root.action.children[i];
-                var tx = a.node.attr(a.node.rect, "x");
-
-                for (var j = 0; j < a.children.length; j++) {
-                    var n = a.children[j].node;
-                    var x = n.attr(n.rect, "x");
-                    var y = n.attr(n.rect, "y");
-                    var inverse = x >= tx ? 1 : -1;
-
-                    scope._setNodePosition(n, x + (scope.root.action.children.length > 1 ? widths[i].childrenWidths[j] / 1.8 : 0) * inverse, y);
-                    scope._setLine(n.action);
-
-                    scope._resizeCanvas(n);
-                    cwidth += widths[i].childrenWidths[j] / 2;
-                }
-
-                if (scope.root.action.children.length > 1) {
-                    var n = a.node;
-                    var x = n.attr(n.rect, "x");
-                    var y = n.attr(n.rect, "y");
-                    var inverse = x >= rx && i == 0 && !n.minimized ? 1 : -1;
-
-                    scope._setNodePosition(n, x + rwidth + (i > 1 ? widths[i - 1].triggerWidth / 1.8 : 0) + (widths[i].triggerWidth / 1.8) * inverse, y);
-                    scope._setLine(n.action);
-
-                    scope._resizeCanvas(n);
-                }
-
-                rwidth += widths[i].triggerWidth / 2;
-            }
-        }
-
-        // Creates the JSON according to the graph
-        // root: the root object to start with
-        Graph.prototype.createJSON = function (root) {
-            if (!root) root = this.root.action;
-
-            var action = {};
-            action.type = root.type;
-            action.name = root.name;
-            action.detached = root.node.detached;
-            action.children = new Array();
-            action.combine = new Array();
-
-            action.properties = new Array();
-            for (var i = 0; i < root.properties.length; i++) {
-                action.properties[i] = { name: root.properties[i].text, value: root.propertiesResults[i] };
-                if (root.properties[i].targetType != null)
-                    action.properties[i].targetType = root.properties[i].targetType;
-            }
-
-            if (root.combine) {
-                for (var i = 0; i < root.combineArray.length; i++) {
-                    var combinedAction = root.combineArray[i];
-                    action.combine.push(this.createJSON(combinedAction, action));
-                }
-            }
-            
-            if (root.combine)
-                root = root.children[0]; // The hub
-
-            for (var i = 0; i < root.children.length; i++) {
-                action.children.push(this.createJSON(root.children[i], action));
-            }
-
-            return action;
-        }
-
-        // Loads a graph from a JSON
-        // Graph: the root object's graph
-        // startNode: the start node to where begin the load
-        Graph.prototype.loadFromJSON = function (graph, startNode) {
-            var scope = this;
-
-            // If startNode is null, means it replaces all the graph
-            // If not, it comes from a copy/paste
-            if (startNode == null) {
-                for (var i = 0; i < this.root.action.children.length; i++)
-                    this._removeAction(this.root.action.children[i], true);
-
-                this.root.action.clearChildren();
-            }
-
-            var load = function (root, parent, detached, combine) {
-                if (!parent) parent = scope.root.action;
-                if (!root) root = graph;
-                if (!detached) detached = false;
-                if (!combine) combine = false;
-
-                var n = null; // Not going to be created
-
-                if (root.type != AB.ActionsBuilder.Type.OBJECT) { // Means it is not the root (the edited object)
-                    var e = {};
-                    e.type = root.type;
-                    e.name = root.name;
-                    e.detached = root.detached;
-                    e.combine = root.combine.length > 0;
-                    e.properties = new Array();
-                    e.combineArray = new Array();
-
-                    for (var i = 0; i < root.properties.length; i++) {
-                        e.properties.push({ text: root.properties[i].name, value: root.properties[i].value });
-                        if (root.properties[i].targetType != null) {
-                            e.properties[e.properties.length - 1].targetType = root.properties[i].targetType;
-                        }
-                    }
-
-                    n = scope.addNode(parent, e);
-                    if (detached)
-                        n.attr(n.rect, "fill", scope.getNodeColor(n.action));
-                    else
-                        detached = n.detached;
-
-                    // If combine array length > 0, it is a combine action
-                    for (var i = 0; i < root.combine.length; i++) {
-                        load(root.combine[i], n.action, detached, true);
-                    }
-
-                    if (!combine)
-                        parent = parent.children[parent.children.length - 1];
-                    else
-                        n.action.parent = null;
-                }
-
-                for (var i = 0; i < root.children.length; i++) {
-                    load(root.children[i], n && n.action.combine ? n.action.hub.action : parent, root.detached, false);
-                }
-            }
-
-            load(graph, startNode);
-            this.update();
-        }
-
-        // Traverse the graph and returns if hit a node
-        // start: the start node to start traverse
-        // x: the mouse's x position
-        // y: the mouse's y position
-        // traverseCombine: if check the combine nodes
-        Graph.prototype.traverseGraph = function (start, x, y, traverseCombine) {
-            if (!start) start = this.root.action;
-            if (traverseCombine == null) traverseCombine = false;
-
-            var result = {
-                hit: true,
-                element: start
-            };
-
-            if (start.node.isPointInside(x, y))
-                return result;
-
-            for (var i = 0; i < start.children.length; i++) {
-
-                if (start.children[i].node.isPointInside(x, y)) {
-                    result.hit = true;
-                    result.element = start.children[i];
-
-                    if (start.children[i].combine && traverseCombine) {
-                        var a = start.children[i];
-                        for (var j = 0; j < a.combineArray.length; j++) {
-                            if (a.combineArray[j].node.isPointInside(x, y)) {
-                                result.element = a.combineArray[j];
-                                break;
-                            }
-                        }
-                    }
-
-                    return result;
-                }
-
-                result = this.traverseGraph(start.children[i], x, y, traverseCombine);
-                if (result.hit)
-                    return result;
-
-            }
-
-            result.hit = false;
-            result.element = null;
-            return result;
-        }
-
-        //
-        // Private functions
-        //
-
-        // Sets the given node's line
-        // If commented, the line isn't setted by hidden
-        Graph.prototype._setLine = function (element) {
-            var n = element.node;
-            var nodeWidth = n.attr(n.rect, "width");
-            var nodeHeight = n.attr(n.rect, "height");
-            var nodex = n.attr(n.rect, "x");
-            var nodey = n.attr(n.rect, "y");
-
-            if (n.detached) {
-                n.attr(n.line, "path", ["M", nodex, nodey, "L", nodex, nodey]);
-                return;
-            }
-
-            var linex = n.attr(n.rect, "x") + nodeWidth / 2;
-            var liney = n.attr(n.rect, "y");
-
-            var p = element.parent.node;
-            var parentWidth = p.attr(p.rect, "width");
-            var parentHeight = p.attr(p.rect, "height");
-            var parentx = p.attr(p.rect, "x");
-            var parenty = p.attr(p.rect, "y");
-
-            var liney2 = liney - (liney - parenty - parentHeight) / 2;
-            var linex3 = parentx + parentWidth / 2;
-            var liney4 = parenty + parentHeight;
-
-            n.attr(n.line, "path", ["M", linex, liney, "L", linex, liney2, "L", linex3, liney2, "L", linex3, liney4]);
-            n.attr(n.line, "stroke", this.getSelectedNodeColor(element, element.node.detached));
-
-        }
-
-        // Sets the given node's position
-        // Applies changements on its children
-        Graph.prototype._setNodePosition = function (node, x, y) {
-            var offsetx = node.attr(node.rect, "x") - x;
-
-            node.attr(node.rect, "x", x);
-            node.attr(node.rect, "y", y);
-
-            var bbox = node.text.getBBox();
-            var textWidth = 0;
-            if (bbox)
-                textWidth = node.text.getBBox().width;
-
-            node.attr(node.text, "x", x + node.attr(node.rect, "width") / 2 - textWidth / 2);
-            node.attr(node.text, "y", y + node.attr(node.rect, "height") / 2);
-
-            // Set combine nodes positions
-            if (node.action.combine) {
-                var length = 0;
-                for (var i = 0; i < node.action.combineArray.length; i++) {
-                    var a = node.action.combineArray[i];
-                    var n = a.node;
-
-                    n.attr(n.rect, "x", node.attr(node.rect, "x") + length);
-                    n.attr(n.rect, "y", node.attr(node.rect, "y"));
-
-                    textWidth = n.text.getBBox().width;
-                    n.attr(n.text, "x", n.attr(n.rect, "x") + n.attr(n.rect, "width") / 2 - textWidth / 2);
-                    n.attr(n.text, "y", y + Graph.NODE_HEIGHT / 2);
-
-                    length += n.attr(n.rect, "width");
-                }
-
-                node.attr(node.rect, "width", length);
-            }
-
-            for (var i = 0; i < node.action.children.length; i++) {
-                this._setNodePosition(node.action.children[i].node, node.action.children[i].node.attr(node.action.children[i].node.rect, "x") - offsetx, y + Graph.VERTICAL_OFFSET);
-                this._setLine(node.action.children[i]);
-            }
-        }
-
-        // Resizes the canvas if the node is outside the current canvas size
-        Graph.prototype._resizeCanvas = function (node) {
-            var x = node.attr(node.rect, "x");
-            var y = node.attr(node.rect, "y");
-
-            if (x > 0 + Graph.NODE_WIDTH && x < this.graph.width - Graph.NODE_WIDTH && y < this.graph.height)
-                    return;
-
-            this.graph.setSize(this.graph.width + 500, this.graph.height + 500);
-            this._setNodePosition(this.root, (this.graph.width / 2) - (Graph.NODE_WIDTH / 2), 10);
-
-            this.element.scrollLeft = (this.graph.width / 2) - this.element.getBoundingClientRect().width / 2;
-        }
-
-        // Removes a node
-        // node : the node to remove
-        Graph.prototype._removeNode = function (node) {
-            node.rect.remove();
-            node.text.remove();
-            if (node.line)
-                node.line.remove();
-        }
-
-        // Remove an action from the graph
-        // action : the action to remove
-        // removeChildren : if true, it deletes the branch
-        Graph.prototype._removeAction = function (action, removeChildren) {
-            if (!removeChildren)
-                removeChildren = false;
-
-            this._removeNode(action.node);
-
-            if (action.combine) {
-                for (var i = 0; i < action.combineArray.length; i++) {
-                    this._removeNode(action.combineArray[i].node);
-                }
-                action.combineArray = new Array();
-            }
-
-            if (removeChildren) {
-                for (var i = 0; i < action.children.length; i++)
-                    this._removeAction(action.children[i], removeChildren);
-
-                action.clearChildren();
-            }
-            else {
-                for (var i = 0; i < action.children.length; i++) {
-                    action.parent.addChild(action.children[i]);
-                    action.children[i].parent = action.parent;
-                }
-            }
-        }
-
-        // Creates a node
-        // text : the text/name of the node
-        // color : the node's color
-        // noLine : if the node has parent then draw a line, or not
-        Graph.prototype._createNode = function (text, color, noLine) {
-            var n = new AB.Node();
-            n.rect = this.graph.rect(20, 20, Graph.NODE_WIDTH, Graph.NODE_HEIGHT, 0);
-            n.text = this.graph.text(0, 0, text);
-
-            if (!noLine) {
-                n.line = this.graph.path("M10 10L90 90");
-                n.line.attr("stroke", color);
-            }
-
-            n.action = new AB.Action(n);
-
-            n.rect.attr("fill", color);
-            n.text.attr("font-size", 11);
-            n.text.attr("text-anchor", "start");
-            n.text.attr("font-family", "Sinkin Sans Light");
-
-            return n;
-        }
-
-        // Creates the animations for a node
-        // element: the node
-        Graph.prototype._createNodeAnimation = function (element) {
-            var scope = this;
-            var mousex, mousey;
-            var finished = true;
-            var elementx = 0;
-            var elementy = 0;
-
-            var onMove = function (dx, dy, x, y, event) {
-                mousex = x;
-                mousey = y;
-            };
-
-            var onStart = function (x, y, event) {
-                if (element.minimized)
-                    return;
-
-                mousex = x;
-                mousey = y;
-
-                if (finished) {
-                    elementx = element.attr(element.rect, "x");
-                    elementy = element.attr(element.rect, "y");
-                }
-                finished = false;
-
-                if (!element.minimized) {
-                    element.rect.animate({
-                        x: element.attr(element.rect, "x") - 10,
-                        y: element.attr(element.rect, "y") - 5,
-                        width: element.minimized ? Graph.NODE_MINIMIZED_WIDTH + 20 : Graph.NODE_WIDTH + 20,
-                        height: Graph.NODE_HEIGHT + 10,
-                        opacity: 0.25
-                    }, 500, ">");
-                }
-            };
-
-            var onEnd = function (event) {
-
-                if (!element.minimized) {
-                    element.rect.animate({
-                        x: elementx,
-                        y: elementy,
-                        width: element.minimized ? Graph.NODE_MINIMIZED_WIDTH : Graph.NODE_WIDTH,
-                        height: Graph.NODE_HEIGHT,
-                        opacity: 1.0
-                    }, 500, ">", function () { finished = true; });
-                }
-                var x = mousex - scope.graph.canvas.getBoundingClientRect().left;
-                var y = mousey - scope.graph.canvas.getBoundingClientRect().top;
-                var dragResult = scope.traverseGraph(null, x, y, true);
-
-                if (dragResult.hit && dragResult.element == element.action || !dragResult.hit) {
-                    scope.parametersManager.createParameters(element);
-                }
-                else {
-                    if (dragResult.element.children.length > 0 && dragResult.element.type != AB.ActionsBuilder.Type.TRIGGER)
-                        return;
-
-                    if (element.action.type == AB.ActionsBuilder.Type.TRIGGER && dragResult.element != scope.root.action)
-                        return;
-
-                    if (element.action.type == AB.ActionsBuilder.Type.ACTION && dragResult.element == scope.root.action)
-                        return;
-
-                    if (element.action.type == AB.ActionsBuilder.Type.FLOW_CONTROL && (dragResult.element == scope.root.action || dragResult.element.type == AB.ActionsBuilder.Type.FLOW_CONTROL))
-                        return;
-
-                    if (element.action.parent && element.action.parent.combine) // Musn't move hubs
-                        return;
-
-                    if (element.action == dragResult.element.parent)
-                        return;
-
-                    // Reset node
-                    element.rect.stop(element.rect.animation);
-                    element.attr(element.rect, "opacity", 1.0);
-                    element.attr(element.rect, "width", Graph.NODE_WIDTH);
-                    element.attr(element.rect, "height", Graph.NODE_HEIGHT);
-
-                    if (element.action.parent) {
-                        element.action.parent.removeChild(element.action);
-                        dragResult.element.addChild(element.action);
-                        scope.update();
-                        scope._createNodeAnimation(element);
-                    }
-                }
-            };
-
-            element.rect.drag(onMove, onStart, onEnd);
-            element.text.drag(onMove, onStart, onEnd);
-        }
-
-        Graph.NODE_MINIMIZED_WIDTH = 50;
-        Graph.NODE_WIDTH = 150;
-        Graph.NODE_HEIGHT = 25;
-        Graph.VERTICAL_OFFSET = 70;
-
-        return Graph;
-    })();
-
-    AB.Graph = Graph;
-
-})(AB || (AB = {}));

+ 0 - 87
Exporters/3ds Max/Max2Babylon/Exporter/ActionBuilder/ActionsBuilder/viewsertoolbar.js

@@ -1,87 +0,0 @@
-/// <reference path="raphael.js" />
-/// <reference path="actionKinds.js" />
-/// <reference path="viewer.js" />
-
-var AB;
-(function (AB) {
-
-    var ToolBar = (function () {
-        function ToolBar(viewer) {
-            // Members
-            this.element = document.getElementById("ToolbarList");
-            this.viewer = viewer;
-
-            // Configure
-            this._attachControl();
-        }
-
-        //
-        // Private methods
-        //
-        // Attaches controls to each button
-        ToolBar.prototype._attachControl = function () {
-            var scope = this;
-            var events = new Array();
-
-            // Create event handlers and add them to the events array
-            var onReduce = function () {
-                scope.viewer.utils.onReduceAll(false);
-            };
-            events.push(onReduce);
-
-            var onExpand = function () {
-                scope.viewer.utils.onReduceAll(true);
-            };
-            events.push(onExpand);
-
-            var onDisconnect = function () {
-                scope.viewer.utils.onDetachAll(true, false);
-            };
-            events.push(onDisconnect);
-
-            var onReconnect = function () {
-                scope.viewer.utils.onDetachAll(false, true);
-            };
-            events.push(onReconnect);
-
-            var onDeZoom = function () {
-                if (scope.viewer.zoom > 0.0)
-                    scope.viewer.zoom -= 0.1;
-
-                scope.viewer.update();
-            };
-            events.push(onDeZoom);
-
-            var onZoom = function () {
-                if (scope.viewer.zoom < 1.0)
-                    scope.viewer.zoom += 0.1;
-
-                scope.viewer.update();
-            };
-            events.push(onZoom);
-
-            // Add events
-            var onEvent = function (id, element) {
-                return function (event) {
-                    element.style.backgroundColor = "rgb(155, 155, 155)";
-                    events[id](event);
-                    setTimeout(function () {
-                        element.style.backgroundColor = "rgb(0, 0, 0)";
-                    }, 100);
-                };
-            };
-
-            var list = this.element.getElementsByTagName("li");
-            for (var i = 0; i < events.length; i++) {
-                list[i].addEventListener("click", onEvent(i, list[i]));
-            }
-        }
-
-        ToolBar.VIEW_HEIGHT = 40;
-
-        return ToolBar;
-    })();
-
-    AB.ToolBar = ToolBar;
-
-})(AB || (AB = {}));

+ 1 - 1
Exporters/3ds Max/Max2Babylon/Exporter/BabylonExporter.cs

@@ -197,7 +197,7 @@ namespace Max2Babylon
                         babylonScene.fogColor = fog.GetColor(0).ToArray();
                         babylonScene.fogMode = 3;
                     }
-#if !MAX2015
+#if !MAX2015 && !MAX2016
                     else
                     {
                         var paramBlock = atmospheric.GetReference(0) as IIParamBlock;

+ 1 - 1
Exporters/3ds Max/Max2Babylon/Forms/ActionsBuilderForm.cs

@@ -26,7 +26,7 @@ namespace Max2Babylon
             // Finish
             _babylonActionsBuilderAction = babylonActionsBuilderAction;
         }
-         
+        
         private void ActionsBuilderForm_Load(object sender, EventArgs e)
         {
             if (Loader.Core.SelNodeCount > 0)

+ 5 - 5
Exporters/3ds Max/Max2Babylon/GlobalUtility.cs

@@ -54,7 +54,7 @@ namespace Max2Babylon
                 actionTable = Loader.Global.ActionTable.Create(idActionTable, 0, ref actionTableName);
                 actionTable.AppendOperation(new BabylonExportActionItem());
                 actionTable.AppendOperation(new BabylonPropertiesActionItem());
-               // actionTable.AppendOperation(new BabylonActionsBuilderActionItem());
+                actionTable.AppendOperation(new BabylonActionsBuilderActionItem());
                 actionCallback = new BabylonActionCallback();
 
                 actionManager.RegisterActionTable(actionTable);
@@ -107,11 +107,11 @@ namespace Max2Babylon
                 menuItemBabylon = Loader.Global.IMenuItem;
                 menuItemBabylon.Title = "Babylon Properties";
                 menuItemBabylon.ActionItem = actionTable[1];
-                //menu.AddItem(menuItemBabylon, -1);
+                menu.AddItem(menuItemBabylon, -1);
 
-                //menuItemBabylon = Loader.Global.IMenuItem;
-                //menuItemBabylon.Title = "Babylon Actions Builder";
-                //menuItemBabylon.ActionItem = actionTable[2];
+                menuItemBabylon = Loader.Global.IMenuItem;
+                menuItemBabylon.Title = "Babylon Actions Builder";
+                menuItemBabylon.ActionItem = actionTable[2];
                 menu.AddItem(menuItemBabylon, -1);
 
                 menuItem = Loader.Global.IMenuItem;

+ 16 - 16
Exporters/3ds Max/Max2Babylon/Tools/Tools.cs

@@ -15,7 +15,7 @@ namespace Max2Babylon
     {
         public static IntPtr GetNativeHandle(this INativeObject obj)
         {
-#if MAX2015
+#if MAX2015 || MAX2016
             return obj.NativePointer;
 #else
             return obj.Handle;
@@ -77,7 +77,7 @@ namespace Max2Babylon
 
         public static IMatrix3 Identity { get { return Loader.Global.Matrix3.Create(XAxis, YAxis, ZAxis, Origin); } }
 
-#if !MAX2015
+#if !MAX2015 && !MAX2016
         unsafe public static int GetParamBlockIndex(IIParamBlock paramBlock, string name)
         {
             for (short index = 0; index < paramBlock.NumParams; index++)
@@ -561,7 +561,7 @@ namespace Max2Babylon
         public static void SetStringProperty(this IINode node, string propertyName, string defaultState)
         {
             string state = defaultState;
-#if MAX2015
+#if MAX2015 || MAX2016
             node.SetUserPropString(propertyName, state);
 #else
             node.SetUserPropString(ref propertyName, ref state);
@@ -571,7 +571,7 @@ namespace Max2Babylon
         public static bool GetBoolProperty(this IINode node, string propertyName, int defaultState = 0)
         {
             int state = defaultState;
-#if MAX2015
+#if MAX2015 || MAX2016
             node.GetUserPropBool(propertyName, ref state);
 #else
             node.GetUserPropBool(ref propertyName, ref state);
@@ -583,7 +583,7 @@ namespace Max2Babylon
         public static string GetStringProperty(this IINode node, string propertyName, string defaultState)
         {
             string state = defaultState;
-#if MAX2015
+#if MAX2015 || MAX2016
             node.GetUserPropString(propertyName, ref state);
 #else
             node.GetUserPropString(ref propertyName, ref state);
@@ -595,7 +595,7 @@ namespace Max2Babylon
         public static float GetFloatProperty(this IINode node, string propertyName, float defaultState = 0)
         {
             float state = defaultState;
-#if MAX2015
+#if MAX2015 || MAX2016
             node.GetUserPropFloat(propertyName, ref state);
 #else
             node.GetUserPropFloat(ref propertyName, ref state);
@@ -608,7 +608,7 @@ namespace Max2Babylon
         {
             float state0 = 0;
             string name = propertyName + "_x";
-#if MAX2015
+#if MAX2015 || MAX2016
             node.GetUserPropFloat(name, ref state0);
 #else
             node.GetUserPropFloat(ref name, ref state0);
@@ -617,7 +617,7 @@ namespace Max2Babylon
 
             float state1 = 0;
             name = propertyName + "_y";
-#if MAX2015
+#if MAX2015 || MAX2016
             node.GetUserPropFloat(name, ref state1);
 #else
             node.GetUserPropFloat(ref name, ref state1);
@@ -625,7 +625,7 @@ namespace Max2Babylon
 
             float state2 = 0;
             name = propertyName + "_z";
-#if MAX2015
+#if MAX2015 || MAX2016
             node.GetUserPropFloat(name, ref state2);
 #else
             node.GetUserPropFloat(ref name, ref state2);
@@ -690,7 +690,7 @@ namespace Max2Babylon
         {
             if (checkBox.CheckState != CheckState.Indeterminate)
             {
-#if MAX2015
+#if MAX2015 || MAX2016
                 node.SetUserPropBool(propertyName, checkBox.CheckState == CheckState.Checked);
 #else
                 node.SetUserPropBool(ref propertyName, checkBox.CheckState == CheckState.Checked);
@@ -711,7 +711,7 @@ namespace Max2Babylon
             foreach (var node in nodes)
             {
                 var value = textBox.Text;
-#if MAX2015
+#if MAX2015 || MAX2016
                 node.SetUserPropString(propertyName, value);
 #else
                 node.SetUserPropString(ref propertyName, ref value);
@@ -728,7 +728,7 @@ namespace Max2Babylon
         {
             foreach (var node in nodes)
             {
-#if MAX2015
+#if MAX2015 || MAX2016
                 node.SetUserPropFloat(propertyName, (float)nup.Value);
 #else
                 node.SetUserPropFloat(ref propertyName, (float)nup.Value);
@@ -746,21 +746,21 @@ namespace Max2Babylon
         public static void UpdateVector3Control(Vector3Control vector3Control, IINode node, string propertyName)
         {
             string name = propertyName + "_x";
-#if MAX2015
+#if MAX2015 || MAX2016
             node.SetUserPropFloat(name, vector3Control.X);
 #else
             node.SetUserPropFloat(ref name, vector3Control.X);
 #endif
 
             name = propertyName + "_y";
-#if MAX2015
+#if MAX2015 || MAX2016
             node.SetUserPropFloat(name, vector3Control.Y);
 #else
             node.SetUserPropFloat(ref name, vector3Control.Y);
 #endif
 
             name = propertyName + "_z";
-#if MAX2015
+#if MAX2015 || MAX2016
             node.SetUserPropFloat(name, vector3Control.Z);
 #else
             node.SetUserPropFloat(ref name, vector3Control.Z);
@@ -778,7 +778,7 @@ namespace Max2Babylon
         public static void UpdateComboBox(ComboBox comboBox, IINode node, string propertyName)
         {
             var value = comboBox.SelectedItem.ToString();
-#if MAX2015
+#if MAX2015 || MAX2016
             node.SetUserPropString(propertyName, value);
 #else
             node.SetUserPropString(ref propertyName, ref value);

+ 305 - 305
dist/preview release - beta/babylon.2.2.d.ts

@@ -304,7 +304,6 @@ interface Window {
     IDBKeyRange(func: any): any;
     webkitIDBKeyRange(func: any): any;
     msIDBKeyRange(func: any): any;
-    URL: HTMLURL;
     webkitURL: HTMLURL;
     webkitRequestAnimationFrame(func: any): any;
     mozRequestAnimationFrame(func: any): any;
@@ -1407,6 +1406,7 @@ declare module BABYLON {
         private _connectedMesh;
         private _customAttenuationFunction;
         private _registerFunc;
+        private _isOutputConnected;
         /**
         * Create a sound and attach it to a scene
         * @param name Name of your sound
@@ -2154,6 +2154,66 @@ declare module BABYLON {
 }
 
 declare module BABYLON {
+    class BoundingBox {
+        minimum: Vector3;
+        maximum: Vector3;
+        vectors: Vector3[];
+        center: Vector3;
+        extendSize: Vector3;
+        directions: Vector3[];
+        vectorsWorld: Vector3[];
+        minimumWorld: Vector3;
+        maximumWorld: Vector3;
+        private _worldMatrix;
+        constructor(minimum: Vector3, maximum: Vector3);
+        getWorldMatrix(): Matrix;
+        _update(world: Matrix): void;
+        isInFrustum(frustumPlanes: Plane[]): boolean;
+        isCompletelyInFrustum(frustumPlanes: Plane[]): boolean;
+        intersectsPoint(point: Vector3): boolean;
+        intersectsSphere(sphere: BoundingSphere): boolean;
+        intersectsMinMax(min: Vector3, max: Vector3): boolean;
+        static Intersects(box0: BoundingBox, box1: BoundingBox): boolean;
+        static IntersectsSphere(minPoint: Vector3, maxPoint: Vector3, sphereCenter: Vector3, sphereRadius: number): boolean;
+        static IsCompletelyInFrustum(boundingVectors: Vector3[], frustumPlanes: Plane[]): boolean;
+        static IsInFrustum(boundingVectors: Vector3[], frustumPlanes: Plane[]): boolean;
+    }
+}
+
+declare module BABYLON {
+    class BoundingInfo {
+        minimum: Vector3;
+        maximum: Vector3;
+        boundingBox: BoundingBox;
+        boundingSphere: BoundingSphere;
+        constructor(minimum: Vector3, maximum: Vector3);
+        _update(world: Matrix): void;
+        isInFrustum(frustumPlanes: Plane[]): boolean;
+        isCompletelyInFrustum(frustumPlanes: Plane[]): boolean;
+        _checkCollision(collider: Collider): boolean;
+        intersectsPoint(point: Vector3): boolean;
+        intersects(boundingInfo: BoundingInfo, precise: boolean): boolean;
+    }
+}
+
+declare module BABYLON {
+    class BoundingSphere {
+        minimum: Vector3;
+        maximum: Vector3;
+        center: Vector3;
+        radius: number;
+        centerWorld: Vector3;
+        radiusWorld: number;
+        private _tempRadiusVector;
+        constructor(minimum: Vector3, maximum: Vector3);
+        _update(world: Matrix): void;
+        isInFrustum(frustumPlanes: Plane[]): boolean;
+        intersectsPoint(point: Vector3): boolean;
+        static Intersects(sphere0: BoundingSphere, sphere1: BoundingSphere): boolean;
+    }
+}
+
+declare module BABYLON {
     class DebugLayer {
         private _scene;
         private _camera;
@@ -2271,66 +2331,6 @@ declare module BABYLON {
 }
 
 declare module BABYLON {
-    class BoundingBox {
-        minimum: Vector3;
-        maximum: Vector3;
-        vectors: Vector3[];
-        center: Vector3;
-        extendSize: Vector3;
-        directions: Vector3[];
-        vectorsWorld: Vector3[];
-        minimumWorld: Vector3;
-        maximumWorld: Vector3;
-        private _worldMatrix;
-        constructor(minimum: Vector3, maximum: Vector3);
-        getWorldMatrix(): Matrix;
-        _update(world: Matrix): void;
-        isInFrustum(frustumPlanes: Plane[]): boolean;
-        isCompletelyInFrustum(frustumPlanes: Plane[]): boolean;
-        intersectsPoint(point: Vector3): boolean;
-        intersectsSphere(sphere: BoundingSphere): boolean;
-        intersectsMinMax(min: Vector3, max: Vector3): boolean;
-        static Intersects(box0: BoundingBox, box1: BoundingBox): boolean;
-        static IntersectsSphere(minPoint: Vector3, maxPoint: Vector3, sphereCenter: Vector3, sphereRadius: number): boolean;
-        static IsCompletelyInFrustum(boundingVectors: Vector3[], frustumPlanes: Plane[]): boolean;
-        static IsInFrustum(boundingVectors: Vector3[], frustumPlanes: Plane[]): boolean;
-    }
-}
-
-declare module BABYLON {
-    class BoundingInfo {
-        minimum: Vector3;
-        maximum: Vector3;
-        boundingBox: BoundingBox;
-        boundingSphere: BoundingSphere;
-        constructor(minimum: Vector3, maximum: Vector3);
-        _update(world: Matrix): void;
-        isInFrustum(frustumPlanes: Plane[]): boolean;
-        isCompletelyInFrustum(frustumPlanes: Plane[]): boolean;
-        _checkCollision(collider: Collider): boolean;
-        intersectsPoint(point: Vector3): boolean;
-        intersects(boundingInfo: BoundingInfo, precise: boolean): boolean;
-    }
-}
-
-declare module BABYLON {
-    class BoundingSphere {
-        minimum: Vector3;
-        maximum: Vector3;
-        center: Vector3;
-        radius: number;
-        centerWorld: Vector3;
-        radiusWorld: number;
-        private _tempRadiusVector;
-        constructor(minimum: Vector3, maximum: Vector3);
-        _update(world: Matrix): void;
-        isInFrustum(frustumPlanes: Plane[]): boolean;
-        intersectsPoint(point: Vector3): boolean;
-        static Intersects(sphere0: BoundingSphere, sphere1: BoundingSphere): boolean;
-    }
-}
-
-declare module BABYLON {
     class DirectionalLight extends Light implements IShadowLight {
         direction: Vector3;
         position: Vector3;
@@ -3215,194 +3215,50 @@ declare module BABYLON {
 }
 
 declare module BABYLON {
-    class Particle {
+    class AbstractMesh extends Node implements IDisposable {
+        private static _BILLBOARDMODE_NONE;
+        private static _BILLBOARDMODE_X;
+        private static _BILLBOARDMODE_Y;
+        private static _BILLBOARDMODE_Z;
+        private static _BILLBOARDMODE_ALL;
+        static BILLBOARDMODE_NONE: number;
+        static BILLBOARDMODE_X: number;
+        static BILLBOARDMODE_Y: number;
+        static BILLBOARDMODE_Z: number;
+        static BILLBOARDMODE_ALL: number;
+        definedFacingForward: boolean;
         position: Vector3;
-        direction: Vector3;
-        color: Color4;
-        colorStep: Color4;
-        lifeTime: number;
-        age: number;
-        size: number;
-        angle: number;
-        angularSpeed: number;
-        copyTo(other: Particle): void;
-    }
-}
-
-declare module BABYLON {
-    class ParticleSystem implements IDisposable {
-        name: string;
-        static BLENDMODE_ONEONE: number;
-        static BLENDMODE_STANDARD: number;
-        id: string;
+        rotation: Vector3;
+        rotationQuaternion: Quaternion;
+        scaling: Vector3;
+        billboardMode: number;
+        visibility: number;
+        alphaIndex: number;
+        infiniteDistance: boolean;
+        isVisible: boolean;
+        isPickable: boolean;
+        showBoundingBox: boolean;
+        showSubMeshesBoundingBox: boolean;
+        onDispose: any;
+        isBlocker: boolean;
+        skeleton: Skeleton;
         renderingGroupId: number;
-        emitter: any;
-        emitRate: number;
-        manualEmitCount: number;
-        updateSpeed: number;
-        targetStopDuration: number;
-        disposeOnStop: boolean;
-        minEmitPower: number;
-        maxEmitPower: number;
-        minLifeTime: number;
-        maxLifeTime: number;
-        minSize: number;
-        maxSize: number;
-        minAngularSpeed: number;
-        maxAngularSpeed: number;
-        particleTexture: Texture;
-        layerMask: number;
-        onDispose: () => void;
-        updateFunction: (particles: Particle[]) => void;
-        blendMode: number;
-        forceDepthWrite: boolean;
-        gravity: Vector3;
-        direction1: Vector3;
-        direction2: Vector3;
-        minEmitBox: Vector3;
-        maxEmitBox: Vector3;
-        color1: Color4;
-        color2: Color4;
-        colorDead: Color4;
-        textureMask: Color4;
-        startDirectionFunction: (emitPower: number, worldMatrix: Matrix, directionToUpdate: Vector3) => void;
-        startPositionFunction: (worldMatrix: Matrix, positionToUpdate: Vector3) => void;
-        private particles;
-        private _capacity;
-        private _scene;
-        private _vertexDeclaration;
-        private _vertexStrideSize;
-        private _stockParticles;
-        private _newPartsExcess;
-        private _vertexBuffer;
-        private _indexBuffer;
-        private _vertices;
-        private _effect;
-        private _customEffect;
-        private _cachedDefines;
-        private _scaledColorStep;
-        private _colorDiff;
-        private _scaledDirection;
-        private _scaledGravity;
-        private _currentRenderId;
-        private _alive;
-        private _started;
-        private _stopped;
-        private _actualFrame;
-        private _scaledUpdateSpeed;
-        constructor(name: string, capacity: number, scene: Scene, customEffect?: Effect);
-        recycleParticle(particle: Particle): void;
-        getCapacity(): number;
-        isAlive(): boolean;
-        isStarted(): boolean;
-        start(): void;
-        stop(): void;
-        _appendParticleVertex(index: number, particle: Particle, offsetX: number, offsetY: number): void;
-        private _update(newParticles);
-        private _getEffect();
-        animate(): void;
-        render(): number;
-        dispose(): void;
-        clone(name: string, newEmitter: any): ParticleSystem;
-    }
-}
-
-declare module BABYLON {
-    interface IPhysicsEnginePlugin {
-        initialize(iterations?: number): any;
-        setGravity(gravity: Vector3): void;
-        runOneStep(delta: number): void;
-        registerMesh(mesh: AbstractMesh, impostor: number, options: PhysicsBodyCreationOptions): any;
-        registerMeshesAsCompound(parts: PhysicsCompoundBodyPart[], options: PhysicsBodyCreationOptions): any;
-        unregisterMesh(mesh: AbstractMesh): any;
-        applyImpulse(mesh: AbstractMesh, force: Vector3, contactPoint: Vector3): void;
-        createLink(mesh1: AbstractMesh, mesh2: AbstractMesh, pivot1: Vector3, pivot2: Vector3, options?: any): boolean;
-        dispose(): void;
-        isSupported(): boolean;
-        updateBodyPosition(mesh: AbstractMesh): void;
-    }
-    interface PhysicsBodyCreationOptions {
-        mass: number;
-        friction: number;
-        restitution: number;
-    }
-    interface PhysicsCompoundBodyPart {
-        mesh: Mesh;
-        impostor: number;
-    }
-    class PhysicsEngine {
-        gravity: Vector3;
-        private _currentPlugin;
-        constructor(plugin?: IPhysicsEnginePlugin);
-        _initialize(gravity?: Vector3): void;
-        _runOneStep(delta: number): void;
-        _setGravity(gravity: Vector3): void;
-        _registerMesh(mesh: AbstractMesh, impostor: number, options: PhysicsBodyCreationOptions): any;
-        _registerMeshesAsCompound(parts: PhysicsCompoundBodyPart[], options: PhysicsBodyCreationOptions): any;
-        _unregisterMesh(mesh: AbstractMesh): void;
-        _applyImpulse(mesh: AbstractMesh, force: Vector3, contactPoint: Vector3): void;
-        _createLink(mesh1: AbstractMesh, mesh2: AbstractMesh, pivot1: Vector3, pivot2: Vector3, options?: any): boolean;
-        _updateBodyPosition(mesh: AbstractMesh): void;
-        dispose(): void;
-        isSupported(): boolean;
-        static NoImpostor: number;
-        static SphereImpostor: number;
-        static BoxImpostor: number;
-        static PlaneImpostor: number;
-        static MeshImpostor: number;
-        static CapsuleImpostor: number;
-        static ConeImpostor: number;
-        static CylinderImpostor: number;
-        static ConvexHullImpostor: number;
-        static Epsilon: number;
-    }
-}
-
-declare module BABYLON {
-    class AbstractMesh extends Node implements IDisposable {
-        private static _BILLBOARDMODE_NONE;
-        private static _BILLBOARDMODE_X;
-        private static _BILLBOARDMODE_Y;
-        private static _BILLBOARDMODE_Z;
-        private static _BILLBOARDMODE_ALL;
-        static BILLBOARDMODE_NONE: number;
-        static BILLBOARDMODE_X: number;
-        static BILLBOARDMODE_Y: number;
-        static BILLBOARDMODE_Z: number;
-        static BILLBOARDMODE_ALL: number;
-        definedFacingForward: boolean;
-        position: Vector3;
-        rotation: Vector3;
-        rotationQuaternion: Quaternion;
-        scaling: Vector3;
-        billboardMode: number;
-        visibility: number;
-        alphaIndex: number;
-        infiniteDistance: boolean;
-        isVisible: boolean;
-        isPickable: boolean;
-        showBoundingBox: boolean;
-        showSubMeshesBoundingBox: boolean;
-        onDispose: any;
-        isBlocker: boolean;
-        skeleton: Skeleton;
-        renderingGroupId: number;
-        material: Material;
-        receiveShadows: boolean;
-        actionManager: ActionManager;
-        renderOutline: boolean;
-        outlineColor: Color3;
-        outlineWidth: number;
-        renderOverlay: boolean;
-        overlayColor: Color3;
-        overlayAlpha: number;
-        hasVertexAlpha: boolean;
-        useVertexColors: boolean;
-        applyFog: boolean;
-        computeBonesUsingShaders: boolean;
-        useOctreeForRenderingSelection: boolean;
-        useOctreeForPicking: boolean;
-        useOctreeForCollisions: boolean;
+        material: Material;
+        receiveShadows: boolean;
+        actionManager: ActionManager;
+        renderOutline: boolean;
+        outlineColor: Color3;
+        outlineWidth: number;
+        renderOverlay: boolean;
+        overlayColor: Color3;
+        overlayAlpha: number;
+        hasVertexAlpha: boolean;
+        useVertexColors: boolean;
+        applyFog: boolean;
+        computeBonesUsingShaders: boolean;
+        useOctreeForRenderingSelection: boolean;
+        useOctreeForPicking: boolean;
+        useOctreeForCollisions: boolean;
         layerMask: number;
         alwaysSelectAsActiveMesh: boolean;
         _physicImpostor: number;
@@ -4348,6 +4204,150 @@ declare module BABYLON {
 }
 
 declare module BABYLON {
+    class Particle {
+        position: Vector3;
+        direction: Vector3;
+        color: Color4;
+        colorStep: Color4;
+        lifeTime: number;
+        age: number;
+        size: number;
+        angle: number;
+        angularSpeed: number;
+        copyTo(other: Particle): void;
+    }
+}
+
+declare module BABYLON {
+    class ParticleSystem implements IDisposable {
+        name: string;
+        static BLENDMODE_ONEONE: number;
+        static BLENDMODE_STANDARD: number;
+        id: string;
+        renderingGroupId: number;
+        emitter: any;
+        emitRate: number;
+        manualEmitCount: number;
+        updateSpeed: number;
+        targetStopDuration: number;
+        disposeOnStop: boolean;
+        minEmitPower: number;
+        maxEmitPower: number;
+        minLifeTime: number;
+        maxLifeTime: number;
+        minSize: number;
+        maxSize: number;
+        minAngularSpeed: number;
+        maxAngularSpeed: number;
+        particleTexture: Texture;
+        layerMask: number;
+        onDispose: () => void;
+        updateFunction: (particles: Particle[]) => void;
+        blendMode: number;
+        forceDepthWrite: boolean;
+        gravity: Vector3;
+        direction1: Vector3;
+        direction2: Vector3;
+        minEmitBox: Vector3;
+        maxEmitBox: Vector3;
+        color1: Color4;
+        color2: Color4;
+        colorDead: Color4;
+        textureMask: Color4;
+        startDirectionFunction: (emitPower: number, worldMatrix: Matrix, directionToUpdate: Vector3) => void;
+        startPositionFunction: (worldMatrix: Matrix, positionToUpdate: Vector3) => void;
+        private particles;
+        private _capacity;
+        private _scene;
+        private _vertexDeclaration;
+        private _vertexStrideSize;
+        private _stockParticles;
+        private _newPartsExcess;
+        private _vertexBuffer;
+        private _indexBuffer;
+        private _vertices;
+        private _effect;
+        private _customEffect;
+        private _cachedDefines;
+        private _scaledColorStep;
+        private _colorDiff;
+        private _scaledDirection;
+        private _scaledGravity;
+        private _currentRenderId;
+        private _alive;
+        private _started;
+        private _stopped;
+        private _actualFrame;
+        private _scaledUpdateSpeed;
+        constructor(name: string, capacity: number, scene: Scene, customEffect?: Effect);
+        recycleParticle(particle: Particle): void;
+        getCapacity(): number;
+        isAlive(): boolean;
+        isStarted(): boolean;
+        start(): void;
+        stop(): void;
+        _appendParticleVertex(index: number, particle: Particle, offsetX: number, offsetY: number): void;
+        private _update(newParticles);
+        private _getEffect();
+        animate(): void;
+        render(): number;
+        dispose(): void;
+        clone(name: string, newEmitter: any): ParticleSystem;
+    }
+}
+
+declare module BABYLON {
+    interface IPhysicsEnginePlugin {
+        initialize(iterations?: number): any;
+        setGravity(gravity: Vector3): void;
+        runOneStep(delta: number): void;
+        registerMesh(mesh: AbstractMesh, impostor: number, options: PhysicsBodyCreationOptions): any;
+        registerMeshesAsCompound(parts: PhysicsCompoundBodyPart[], options: PhysicsBodyCreationOptions): any;
+        unregisterMesh(mesh: AbstractMesh): any;
+        applyImpulse(mesh: AbstractMesh, force: Vector3, contactPoint: Vector3): void;
+        createLink(mesh1: AbstractMesh, mesh2: AbstractMesh, pivot1: Vector3, pivot2: Vector3, options?: any): boolean;
+        dispose(): void;
+        isSupported(): boolean;
+        updateBodyPosition(mesh: AbstractMesh): void;
+    }
+    interface PhysicsBodyCreationOptions {
+        mass: number;
+        friction: number;
+        restitution: number;
+    }
+    interface PhysicsCompoundBodyPart {
+        mesh: Mesh;
+        impostor: number;
+    }
+    class PhysicsEngine {
+        gravity: Vector3;
+        private _currentPlugin;
+        constructor(plugin?: IPhysicsEnginePlugin);
+        _initialize(gravity?: Vector3): void;
+        _runOneStep(delta: number): void;
+        _setGravity(gravity: Vector3): void;
+        _registerMesh(mesh: AbstractMesh, impostor: number, options: PhysicsBodyCreationOptions): any;
+        _registerMeshesAsCompound(parts: PhysicsCompoundBodyPart[], options: PhysicsBodyCreationOptions): any;
+        _unregisterMesh(mesh: AbstractMesh): void;
+        _applyImpulse(mesh: AbstractMesh, force: Vector3, contactPoint: Vector3): void;
+        _createLink(mesh1: AbstractMesh, mesh2: AbstractMesh, pivot1: Vector3, pivot2: Vector3, options?: any): boolean;
+        _updateBodyPosition(mesh: AbstractMesh): void;
+        dispose(): void;
+        isSupported(): boolean;
+        static NoImpostor: number;
+        static SphereImpostor: number;
+        static BoxImpostor: number;
+        static PlaneImpostor: number;
+        static MeshImpostor: number;
+        static CapsuleImpostor: number;
+        static ConeImpostor: number;
+        static CylinderImpostor: number;
+        static ConvexHullImpostor: number;
+        static Epsilon: number;
+    }
+}
+
+declare module BABYLON {
     class BoundingBoxRenderer {
         frontColor: Color3;
         backColor: Color3;
@@ -4450,64 +4450,6 @@ declare module BABYLON {
 }
 
 declare module BABYLON {
-    class Sprite {
-        name: string;
-        position: Vector3;
-        color: Color4;
-        width: number;
-        height: number;
-        angle: number;
-        cellIndex: number;
-        invertU: number;
-        invertV: number;
-        disposeWhenFinishedAnimating: boolean;
-        animations: Animation[];
-        private _animationStarted;
-        private _loopAnimation;
-        private _fromIndex;
-        private _toIndex;
-        private _delay;
-        private _direction;
-        private _frameCount;
-        private _manager;
-        private _time;
-        size: number;
-        constructor(name: string, manager: SpriteManager);
-        playAnimation(from: number, to: number, loop: boolean, delay: number): void;
-        stopAnimation(): void;
-        _animate(deltaTime: number): void;
-        dispose(): void;
-    }
-}
-
-declare module BABYLON {
-    class SpriteManager {
-        name: string;
-        cellSize: number;
-        sprites: Sprite[];
-        renderingGroupId: number;
-        layerMask: number;
-        onDispose: () => void;
-        fogEnabled: boolean;
-        private _capacity;
-        private _spriteTexture;
-        private _epsilon;
-        private _scene;
-        private _vertexDeclaration;
-        private _vertexStrideSize;
-        private _vertexBuffer;
-        private _indexBuffer;
-        private _vertices;
-        private _effectBase;
-        private _effectFog;
-        constructor(name: string, imgUrl: string, capacity: number, cellSize: number, scene: Scene, epsilon?: number, samplingMode?: number);
-        private _appendSpriteVertex(index, sprite, offsetX, offsetY, rowSize);
-        render(): void;
-        dispose(): void;
-    }
-}
-
-declare module BABYLON {
     class AnaglyphPostProcess extends PostProcess {
         constructor(name: string, ratio: number, camera: Camera, samplingMode?: number, engine?: Engine, reusable?: boolean);
     }
@@ -5060,6 +5002,64 @@ declare module BABYLON {
     }
 }
 
+declare module BABYLON {
+    class Sprite {
+        name: string;
+        position: Vector3;
+        color: Color4;
+        width: number;
+        height: number;
+        angle: number;
+        cellIndex: number;
+        invertU: number;
+        invertV: number;
+        disposeWhenFinishedAnimating: boolean;
+        animations: Animation[];
+        private _animationStarted;
+        private _loopAnimation;
+        private _fromIndex;
+        private _toIndex;
+        private _delay;
+        private _direction;
+        private _frameCount;
+        private _manager;
+        private _time;
+        size: number;
+        constructor(name: string, manager: SpriteManager);
+        playAnimation(from: number, to: number, loop: boolean, delay: number): void;
+        stopAnimation(): void;
+        _animate(deltaTime: number): void;
+        dispose(): void;
+    }
+}
+
+declare module BABYLON {
+    class SpriteManager {
+        name: string;
+        cellSize: number;
+        sprites: Sprite[];
+        renderingGroupId: number;
+        layerMask: number;
+        onDispose: () => void;
+        fogEnabled: boolean;
+        private _capacity;
+        private _spriteTexture;
+        private _epsilon;
+        private _scene;
+        private _vertexDeclaration;
+        private _vertexStrideSize;
+        private _vertexBuffer;
+        private _indexBuffer;
+        private _vertices;
+        private _effectBase;
+        private _effectFog;
+        constructor(name: string, imgUrl: string, capacity: number, cellSize: number, scene: Scene, epsilon?: number, samplingMode?: number);
+        private _appendSpriteVertex(index, sprite, offsetX, offsetY, rowSize);
+        render(): void;
+        dispose(): void;
+    }
+}
+
 declare module BABYLON.Internals {
     class AndOrNotEvaluator {
         static Eval(query: string, evaluateCallback: (val: any) => boolean): boolean;

File diff suppressed because it is too large
+ 4 - 5
dist/preview release - beta/babylon.2.2.js


+ 14 - 6
dist/preview release - beta/babylon.2.2.max.js

@@ -5716,7 +5716,7 @@ var BABYLON;
         });
         Object.defineProperty(Engine, "Version", {
             get: function () {
-                return "2.2.0-beta";
+                return "2.2.0";
             },
             enumerable: true,
             configurable: true
@@ -30520,6 +30520,7 @@ var BABYLON;
             this._coneInnerAngle = 360;
             this._coneOuterAngle = 360;
             this._coneOuterGain = 0;
+            this._isOutputConnected = false;
             this.name = name;
             this._scene = scene;
             this._readyToPlayCallback = readyToPlayCallback;
@@ -30698,8 +30699,11 @@ var BABYLON;
         };
         Sound.prototype.connectToSoundTrackAudioNode = function (soundTrackAudioNode) {
             if (BABYLON.Engine.audioEngine.canUseWebAudio) {
-                this._ouputAudioNode.disconnect();
+                if (this._isOutputConnected) {
+                    this._ouputAudioNode.disconnect();
+                }
                 this._ouputAudioNode.connect(soundTrackAudioNode);
+                this._isOutputConnected = true;
             }
         };
         /**
@@ -32335,9 +32339,9 @@ var BABYLON;
             if (submeshIndex > 0) {
                 this._reconstructedMesh.subMeshes = [];
                 submeshesArray.forEach(function (submesh) {
-                    new BABYLON.SubMesh(submesh.materialIndex, submesh.verticesStart, submesh.verticesCount, submesh.indexStart, submesh.indexCount, submesh.getMesh());
+                    new BABYLON.SubMesh(submesh.materialIndex, submesh.verticesStart, submesh.verticesCount, /* 0, newPositionData.length/3, */ submesh.indexStart, submesh.indexCount, submesh.getMesh());
                 });
-                var newSubmesh = new BABYLON.SubMesh(originalSubmesh.materialIndex, startingVertex, vertexCount, startingIndex, newTriangles.length * 3, this._reconstructedMesh);
+                var newSubmesh = new BABYLON.SubMesh(originalSubmesh.materialIndex, startingVertex, vertexCount, /* 0, newPositionData.length / 3, */ startingIndex, newTriangles.length * 3, this._reconstructedMesh);
             }
         };
         QuadraticErrorSimplification.prototype.initDecimatedMesh = function () {
@@ -33426,7 +33430,9 @@ var BABYLON;
         // colors shifting and distortion
         LensRenderingPipeline.prototype._createChromaticAberrationPostProcess = function (ratio) {
             var _this = this;
-            this._chromaticAberrationPostProcess = new BABYLON.PostProcess("LensChromaticAberration", "chromaticAberration", ["chromatic_aberration", "screen_width", "screen_height"], [], ratio, null, BABYLON.Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), false);
+            this._chromaticAberrationPostProcess = new BABYLON.PostProcess("LensChromaticAberration", "chromaticAberration", ["chromatic_aberration", "screen_width", "screen_height"], // uniforms
+            [], // samplers
+            ratio, null, BABYLON.Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), false);
             this._chromaticAberrationPostProcess.onApply = function (effect) {
                 effect.setFloat('chromatic_aberration', _this._chromaticAberration);
                 effect.setFloat('screen_width', _this._scene.getEngine().getRenderingCanvas().width);
@@ -33436,7 +33442,9 @@ var BABYLON;
         // highlights enhancing
         LensRenderingPipeline.prototype._createHighlightsPostProcess = function (ratio) {
             var _this = this;
-            this._highlightsPostProcess = new BABYLON.PostProcess("LensHighlights", "lensHighlights", ["pentagon", "gain", "threshold", "screen_width", "screen_height"], [], ratio, null, BABYLON.Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), false);
+            this._highlightsPostProcess = new BABYLON.PostProcess("LensHighlights", "lensHighlights", ["pentagon", "gain", "threshold", "screen_width", "screen_height"], // uniforms
+            [], // samplers
+            ratio, null, BABYLON.Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), false);
             this._highlightsPostProcess.onApply = function (effect) {
                 effect.setFloat('gain', _this._highlightsGain);
                 effect.setFloat('threshold', _this._highlightsThreshold);

File diff suppressed because it is too large
+ 4 - 5
dist/preview release - beta/babylon.2.2.noworker.js


File diff suppressed because it is too large
+ 6319 - 0
dist/preview release - alpha/babylon.2.3.d.ts


File diff suppressed because it is too large
+ 37 - 0
dist/preview release - alpha/babylon.2.3.js


File diff suppressed because it is too large
+ 34273 - 0
dist/preview release - alpha/babylon.2.3.max.js


File diff suppressed because it is too large
+ 36 - 0
dist/preview release - alpha/babylon.2.3.noworker.js


+ 6 - 0
dist/preview release - alpha/what's new.md

@@ -0,0 +1,6 @@
+- 2.3.0:
+  - **Major updates**
+  - **Updates**
+  - **Bug fixes**
+  - **Breaking changes**
+

+ 0 - 60
dist/preview release - beta/what's new.md

@@ -1,60 +0,0 @@
-- 2.2.0:
-  - **Major updates**
-    - Blender can now bake Procedural textures & Cycles materials.  Plus more. See [documentation here](https://github.com/BabylonJS/Babylon.js/tree/master/Exporters/Blender) [Palmer-JC](https://github.com/Palmer-JC)
-    - Meshes can now be attached to bones. See [documentation here](http://babylondoc.azurewebsites.net/page.php?p=22421) and [sample here](http://www.babylonjs-playground.com/#11BH6Z#18) [deltakosh](https://github.com/deltakosh)
-    - HDR Rendering pipeline. See [demo here]() [julien-moreau](https://github.com/julien-moreau)
-    - New rewored StandardMaterial.isReady for better memory usage and performance [deltakosh](https://github.com/deltakosh)
-    - Revamping of FBX exporter. Now supports animations and bones [simonferquel](http://www.github.com/simonferquel), [deltakosh](https://github.com/deltakosh)
-    - StandardMaterial.useGlossinessFromSpecularMapAlpha to use specular map alpha as glossiness level [deltakosh](https://github.com/deltakosh)    
-    - Added support for StandardMaterial.roughness. See [demo here](http://www.babylonjs-playground.com/#RNBKQ#8) [deltakosh](https://github.com/deltakosh)
-    - OBJ loader. See [demo here](http://www.babylonjs-playground.com/#28YUR5) [Temechon](https://github.com/Temechon)
-    - EdgesRenderer. See [demo here](http://www.babylonjs-playground.com/#TYAHX#10) [deltakosh](https://github.com/deltakosh)
-  - **Updates**
-    - Adding layerMask to lensFlareSystem, spritesManager, particleSystem [deltakosh](https://github.com/deltakosh)
-    - Adding emissiveAsIllumination and reflectionFresnelFromSpecular for StandardMaterial [deltakosh](https://github.com/deltakosh)
-    - Adding isEnabled for ProceduralTexture [deltakosh](https://github.com/deltakosh)
-    - Compression supported for raw textures [deltakosh](https://github.com/deltakosh)
-    - New TonemapPostProcess. See [demo here](http://www.babylonjs-playground.com/#ELTGD) [deltakosh](https://github.com/deltakosh)
-    - New options parameters for Box, Sphere, Plane and Ground. See [demo here](http://www.html5gamedevs.com/topic/17044-evolution-for-out-of-the-box-meshes-creation/) [deltakosh](https://github.com/deltakosh)
-    - Added per face UV and Colors options for `CreateBox` [jerome](https://github.com/jbousquie)
-    - Added darkness support for soft shadows [deltakosh](https://github.com/deltakosh)
-    - Added scene.getLensFlareSystemByName() [deltakosh](https://github.com/deltakosh)
-    - Added LensFlareSystem.setEmitter() [deltakosh](https://github.com/deltakosh)
-    - Added Color3.FromHexString() and Color3.toHexString() [deltakosh](https://github.com/deltakosh)
-    - Added Color4.FromHexString() and Color4.toHexString() [deltakosh](https://github.com/deltakosh)
-    - Added mesh.computeBonesUsingShaders to allow developers to disable HW skinning for low end devices [deltakosh](https://github.com/deltakosh)
-    - Added material.disableDepthWrite (default is off) [deltakosh](https://github.com/deltakosh)
-    - Added material.alphaMode (default is BABYLON.Engine.ALPHA_COMBINE, can be set to BABYLON.Engine.ALPHA_ADD, *_SUBTRACT, *_MULTIPLY or *_MAXIMIZED ) [deltakosh](https://github.com/deltakosh), [jahow](https://github.com/jahow)
-    - Added Animatable.reset() function [deltakosh](https://github.com/deltakosh)
-    - New parameter for ArcRotateCamera.zoomOn to preserve maxZ [deltakosh](https://github.com/deltakosh)
-    - PickingInfo.getNormal can now use either vertices normals or vertices positions [deltakosh](https://github.com/deltakosh)
-    - Meshes can now support uv2, uv4, uv5 and uv6 for ShaderMaterials [deltakosh](https://github.com/deltakosh)
-    - Panning support for ArcRotateCamera [julien-moreau](https://github.com/julien-moreau)
-    - Vertex color and diffuse color can now be mixed [deltakosh](https://github.com/deltakosh)
-    - Depth-of-field improvements [PR](https://github.com/BabylonJS/Babylon.js/pull/567) [jahow](https://github.com/jahow)
-    - Engine now initialize WebGL with preserveDrawingBuffer = false by default [deltakosh](https://github.com/deltakosh)
-    - withEpsilon with a user defined epsilon [PR](https://github.com/BabylonJS/Babylon.js/pull/573) [RaananW](https://github.com/RaananW)
-    - Adding onAfterRender function in BABYLON.PostProcess [PR](https://github.com/BabylonJS/Babylon.js/pull/572) [julien-moreau](https://github.com/julien-moreau)
-    - Improved shaders optimizer to remove specular code when not needed [deltakosh](https://github.com/deltakosh)    
-    - Added some utility functions to Vector2/3/4 [PR](https://github.com/BabylonJS/Babylon.js/pull/578) [jahow](https://github.com/jahow)
-    - Added split angularSensibiliy into X and Y for arcRotateCamera [PR](https://github.com/BabylonJS/Babylon.js/pull/683) [Remwrath](https://github.com/Remwrath)
-    - Added function getFrontPosition(distance) for Camera [PR](https://github.com/BabylonJS/Babylon.js/pull/681) [dad72](https://github.com/dad72)
-    - New rawTexture.update function [robgdl](https://github.com/robgdl)
-    - Changes to meshes transform baking and added flipFaces [PR](https://github.com/BabylonJS/Babylon.js/pull/579) [jahow](https://github.com/jahow)
-    - SerializeMesh serializes a mesh or array of meshes to be imported with the loader's ImportMesh optionally including their children and/or parents. [PR](https://github.com/BabylonJS/Babylon.js/pull/583) [PR2](https://github.com/BabylonJS/Babylon.js/pull/609) [RaananW](https://github.com/RaananW)
-	- onCollide callback for meshes calling moveWithCollisions. [PR](https://github.com/BabylonJS/Babylon.js/pull/585) [RaananW](https://github.com/RaananW)
-	- Unity Exporter now uses game object name as the Babylon.js mesh name, instead of mesh name which is not unique when dealing with primitive objects (cubes, spheres, planes, etc..) [ozRocker] (https://github.com/punkoffice)
-	- Path3D construction : new _raw_ parameter, if true returns a non-normalized Path3D object
-	- added `Vector3.RotationFromAxisToRef()` :  same as `RotationFromAxis()` but assigns a reference [jerome](https://github.com/jbousquie)
-	- `ComputeNormals` optimization : less object allocation and normal array initialization
-	- Ribbon : _closePath_ parameter now creates a smooth seam [jerome](https://github.com/jbousquie)
-  - **Bug fixes**
-    - Fixing bug with rig cameras positioning [deltakosh](https://github.com/deltakosh)
-    - Instance meshes' geometry ID is now serialized correctly. [PR](https://github.com/BabylonJS/Babylon.js/pull/607) [RaananW](https://github.com/RaananW)
-    - Bug fix at set numberOfBricksWidth [PR](https://github.com/BabylonJS/Babylon.js/pull/684) [Polatouche](https://github.com/Polatouche)
-  - **Breaking changes**
-    - In LensRenderingPipeline: parameter `dof_focus_depth` (range 0..1) is deprecated, use `dof_focus_distance` (range 0..infinity) instead [jahow](https://github.com/jahow)
-    - Cylinder Mesh complete reimplementation for better normals [jerome](https://github.com/jbousquie)
-    - `RotationFromAxis()` : fixed the dot product case outside the range [-1, 1]
-    - Path3D : fix wrong normal/binormal due to normalization approximations
-

dist/babylon.2.1.d.ts → dist/previous releases/babylon.2.1.d.ts


dist/babylon.2.1.debug.js → dist/previous releases/babylon.2.1.debug.js


dist/babylon.2.1.js → dist/previous releases/babylon.2.1.js


dist/babylon.2.1.noworker.js → dist/previous releases/babylon.2.1.noworker.js


+ 8 - 7
readme.md

@@ -3,16 +3,14 @@ Babylon.js
 
 Getting started? Play directly with the Babylon.js API via our [playground](http://www.babylonjs.com/playground). It contains also lot of simple samples to learn how to use it. 
 
-[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/deltakosh/babylon.js/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
-
 ## CDN
-- http://cdn.babylonjs.com/2-1/babylon.js 
-- http://cdn.babylonjs.com/2-1/babylon.max.js 
-- http://cdn.babylonjs.com/2-1/babylon.noworker.js 
+- http://cdn.babylonjs.com/2-2/babylon.js 
+- http://cdn.babylonjs.com/2-2/babylon.max.js 
+- http://cdn.babylonjs.com/2-2/babylon.noworker.js 
 
 ## Preview release
 You can help by testing or contributing to the next version.
-- **2.2-beta** can be found [here](https://github.com/BabylonJS/Babylon.js/tree/master/dist/preview%20release%20-%20beta)
+- **2.3-alpha** can be found [here](https://github.com/BabylonJS/Babylon.js/tree/master/dist/preview%20release%20-%20alpha)
 - We are not complicate people, but we still have some [coding guidelines](http://doc.babylonjs.com/generals/Approved_Naming_Conventions)
 - Before submitting your PR, just check that everything goes well by [creating the minified version](http://doc.babylonjs.com/generals/Creating_the_Mini-fied_Version)
 
@@ -93,8 +91,10 @@ Unity 5 [exporter](https://github.com/BabylonJS/Babylon.js/tree/master/Exporters
  - SSAO
  - Volumetric Light Scattering 
  - Depth of field and lens effects
+ - HDR rendering pipeline
  - Lens flares
  - Multi-views
+ - Edges renderer
 -  Textures:
  - Render target textures
  - Dynamic textures (canvas)
@@ -120,12 +120,13 @@ Unity 5 [exporter](https://github.com/BabylonJS/Babylon.js/tree/master/Exporters
  - Parametric shapes (Ribbon, tube, etc.)
  - Hardware instances
 -  Import: 
- - Babylon scene file can be converted from .OBJ, .FBX
+ - Babylon scene file can be converted from .FBX
  - Exporter for Blender
  - Exporter for Cheetah3d
  - Exporter for 3ds Max
  - Exporter for Unity 5
  - STL importer
+ - OBJ importer
  - Assets manager
 
 [![Build Status](https://travis-ci.org/BabylonJS/Babylon.js.svg)](https://travis-ci.org/BabylonJS/Babylon.js)

+ 37 - 0
src/Cameras/babylon.anaglyphCamera.js

@@ -0,0 +1,37 @@
+var __extends = this.__extends || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    __.prototype = b.prototype;
+    d.prototype = new __();
+};
+var BABYLON;
+(function (BABYLON) {
+    var AnaglyphFreeCamera = (function (_super) {
+        __extends(AnaglyphFreeCamera, _super);
+        function AnaglyphFreeCamera(name, position, eyeSpace, scene) {
+            _super.call(this, name, position, scene);
+            this.setSubCameraMode(BABYLON.Camera.SUB_CAMERA_MODE_ANAGLYPH, eyeSpace);
+        }
+        return AnaglyphFreeCamera;
+    })(BABYLON.FreeCamera);
+    BABYLON.AnaglyphFreeCamera = AnaglyphFreeCamera;
+    var AnaglyphArcRotateCamera = (function (_super) {
+        __extends(AnaglyphArcRotateCamera, _super);
+        function AnaglyphArcRotateCamera(name, alpha, beta, radius, target, eyeSpace, scene) {
+            _super.call(this, name, alpha, beta, radius, target, scene);
+            this.setSubCameraMode(BABYLON.Camera.SUB_CAMERA_MODE_ANAGLYPH, eyeSpace);
+        }
+        return AnaglyphArcRotateCamera;
+    })(BABYLON.ArcRotateCamera);
+    BABYLON.AnaglyphArcRotateCamera = AnaglyphArcRotateCamera;
+    var AnaglyphGamepadCamera = (function (_super) {
+        __extends(AnaglyphGamepadCamera, _super);
+        function AnaglyphGamepadCamera(name, position, eyeSpace, scene) {
+            _super.call(this, name, position, scene);
+            this.setSubCameraMode(BABYLON.Camera.SUB_CAMERA_MODE_ANAGLYPH, eyeSpace);
+        }
+        return AnaglyphGamepadCamera;
+    })(BABYLON.GamepadCamera);
+    BABYLON.AnaglyphGamepadCamera = AnaglyphGamepadCamera;
+})(BABYLON || (BABYLON = {}));
+//# sourceMappingURL=babylon.anaglyphCamera.js.map

+ 61 - 0
what's new.md

@@ -1,5 +1,66 @@
 Changes list
 ============
+- 2.2.0:
+  - **Major updates**
+    - Blender can now bake Procedural textures & Cycles materials.  Plus more. See [documentation here](https://github.com/BabylonJS/Babylon.js/tree/master/Exporters/Blender) ([Palmer-JC](https://github.com/Palmer-JC))
+    - Meshes can now be attached to bones. See [documentation here](http://babylondoc.azurewebsites.net/page.php?p=22421) and [sample here](http://www.babylonjs-playground.com/#11BH6Z#18) ([deltakosh](https://github.com/deltakosh))
+    - HDR Rendering pipeline. See [demo here](http://www.babylonjs-playground.com/#2EGN4U#2) ([julien-moreau](https://github.com/julien-moreau))
+    - New rewored StandardMaterial.isReady for better memory usage and performance ([deltakosh](https://github.com/deltakosh))
+    - Revamping of FBX exporter. Now supports animations and bones ([simonferquel](http://www.github.com/simonferquel), [deltakosh](https://github.com/deltakosh))
+    - StandardMaterial.useGlossinessFromSpecularMapAlpha to use specular map alpha as glossiness level ([deltakosh](https://github.com/deltakosh))    
+    - Added support for StandardMaterial.roughness. See [demo here](http://www.babylonjs-playground.com/#RNBKQ#8) ([deltakosh](https://github.com/deltakosh))
+    - OBJ loader. See [demo here](http://www.babylonjs-playground.com/#28YUR5) ([Temechon](https://github.com/Temechon))
+    - EdgesRenderer. See [demo here](http://www.babylonjs-playground.com/#TYAHX#10) ([deltakosh](https://github.com/deltakosh))
+    - Actions Builder tool for 3dsmax exporter. More info [here](https://medium.com/babylon-js/actions-builder-b05e72aa541a) ([julien-moreau](https://github.com/julien-moreau))
+  - **Updates**
+    - Adding layerMask to lensFlareSystem, spritesManager, particleSystem ([deltakosh](https://github.com/deltakosh))
+    - Adding emissiveAsIllumination and reflectionFresnelFromSpecular for StandardMaterial ([deltakosh](https://github.com/deltakosh))
+    - Adding isEnabled for ProceduralTexture ([deltakosh](https://github.com/deltakosh))
+    - Compression supported for raw textures ([deltakosh](https://github.com/deltakosh))
+    - New TonemapPostProcess. See [demo here](http://www.babylonjs-playground.com/#ELTGD) ([deltakosh](https://github.com/deltakosh))
+    - New options parameters for Box, Sphere, Plane and Ground. See [demo here](http://www.html5gamedevs.com/topic/17044-evolution-for-out-of-the-box-meshes-creation/) ([deltakosh](https://github.com/deltakosh))
+    - Added per face UV and Colors options for `CreateBox` ([jerome](https://github.com/jbousquie))
+    - Added darkness support for soft shadows ([deltakosh](https://github.com/deltakosh))
+    - Added scene.getLensFlareSystemByName() ([deltakosh](https://github.com/deltakosh))
+    - Added LensFlareSystem.setEmitter() ([deltakosh](https://github.com/deltakosh))
+    - Added Color3.FromHexString() and Color3.toHexString() ([deltakosh](https://github.com/deltakosh))
+    - Added Color4.FromHexString() and Color4.toHexString() ([deltakosh](https://github.com/deltakosh))
+    - Added mesh.computeBonesUsingShaders to allow developers to disable HW skinning for low end devices ([deltakosh](https://github.com/deltakosh))
+    - Added material.disableDepthWrite (default is off) ([deltakosh](https://github.com/deltakosh))
+    - Added material.alphaMode (default is BABYLON.Engine.ALPHA_COMBINE, can be set to BABYLON.Engine.ALPHA_ADD, *_SUBTRACT, *_MULTIPLY or *_MAXIMIZED ) ([deltakosh](https://github.com/deltakosh), [jahow](https://github.com/jahow))
+    - Added Animatable.reset() function ([deltakosh](https://github.com/deltakosh))
+    - New parameter for ArcRotateCamera.zoomOn to preserve maxZ ([deltakosh](https://github.com/deltakosh))
+    - PickingInfo.getNormal can now use either vertices normals or vertices positions ([deltakosh](https://github.com/deltakosh))
+    - Meshes can now support uv2, uv4, uv5 and uv6 for ShaderMaterials ([deltakosh](https://github.com/deltakosh))
+    - Panning support for ArcRotateCamera ([julien-moreau](https://github.com/julien-moreau))
+    - Vertex color and diffuse color can now be mixed ([deltakosh](https://github.com/deltakosh))
+    - Depth-of-field improvements [PR](https://github.com/BabylonJS/Babylon.js/pull/567) ([jahow](https://github.com/jahow))
+    - Engine now initialize WebGL with preserveDrawingBuffer = false by default ([deltakosh](https://github.com/deltakosh))
+    - withEpsilon with a user defined epsilon [PR](https://github.com/BabylonJS/Babylon.js/pull/573) ([RaananW](https://github.com/RaananW))
+    - Adding onAfterRender function in BABYLON.PostProcess [PR](https://github.com/BabylonJS/Babylon.js/pull/572) ([julien-moreau](https://github.com/julien-moreau))
+    - Improved shaders optimizer to remove specular code when not needed ([deltakosh](https://github.com/deltakosh))    
+    - Added some utility functions to Vector2/3/4 [PR](https://github.com/BabylonJS/Babylon.js/pull/578) ([jahow](https://github.com/jahow))
+    - Added split angularSensibiliy into X and Y for arcRotateCamera [PR](https://github.com/BabylonJS/Babylon.js/pull/683) ([Remwrath](https://github.com/Remwrath))
+    - Added function getFrontPosition(distance) for Camera [PR](https://github.com/BabylonJS/Babylon.js/pull/681) ([dad72](https://github.com/dad72))
+    - New rawTexture.update function ([robgdl](https://github.com/robgdl))
+    - Changes to meshes transform baking and added flipFaces [PR](https://github.com/BabylonJS/Babylon.js/pull/579) ([jahow](https://github.com/jahow))
+    - SerializeMesh serializes a mesh or array of meshes to be imported with the loader's ImportMesh optionally including their children and/or parents. [PR](https://github.com/BabylonJS/Babylon.js/pull/583) [PR2](https://github.com/BabylonJS/Babylon.js/pull/609) ([RaananW](https://github.com/RaananW))
+    - onCollide callback for meshes calling moveWithCollisions. [PR](https://github.com/BabylonJS/Babylon.js/pull/585) ([RaananW](https://github.com/RaananW))
+    - Unity Exporter now uses game object name as the Babylon.js mesh name, instead of mesh name which is not unique when dealing with primitive objects (cubes, spheres, planes, etc..) ([ozRocker](https://github.com/punkoffice))
+    - Path3D construction : new _raw_ parameter, if true returns a non-normalized Path3D object ([jerome](https://github.com/jbousquie))
+	  - Added `Vector3.RotationFromAxisToRef()` :  same as `RotationFromAxis()` but assigns a reference ([jerome](https://github.com/jbousquie))
+	  - `ComputeNormals` optimization : less object allocation and normal array initialization ([jerome](https://github.com/jbousquie))
+	  - Ribbon : _closePath_ parameter now creates a smooth seam ([jerome](https://github.com/jbousquie))
+  - **Bug fixes**
+    - Fixing bug with rig cameras positioning ([deltakosh](https://github.com/deltakosh))
+    - Instance meshes' geometry ID is now serialized correctly. [PR](https://github.com/BabylonJS/Babylon.js/pull/607) ([RaananW](https://github.com/RaananW))
+    - Bug fix at set numberOfBricksWidth [PR](https://github.com/BabylonJS/Babylon.js/pull/684) ([Polatouche](https://github.com/Polatouche))
+  - **Breaking changes**
+    - In LensRenderingPipeline: parameter `dof_focus_depth` (range 0..1) is deprecated, use `dof_focus_distance` (range 0..infinity) instead ([jahow](https://github.com/jahow))
+    - Cylinder Mesh complete reimplementation for better normals ([jerome](https://github.com/jbousquie))
+    - `RotationFromAxis()` : fixed the dot product case outside the range [-1, 1] ([jerome](https://github.com/jbousquie))
+    - Path3D : fix wrong normal/binormal due to normalization approximations ([jerome](https://github.com/jbousquie))
+
 - 2.1.0:
   - **Major updates**
     - Collisions can now be offloaded on webworkers ([raananw](http://www.github.com/raananw))