First update tracker, then raise events (LIBOMV-903)

git-svn-id: e915c4f8b2ea2a6e63cbe989b51c0994a698cc26@3534 52acb1d6-8a22-11de-b505-999d5b087335

--- OpenMetaverse/ObjectManager.cs
+++ OpenMetaverse/ObjectManager.cs
@@ -2807,13 +2807,6 @@
         protected void ObjectPhysicsPropertiesHandler(string capsKey, IMessage message, Simulator simulator)
         {
             ObjectPhysicsPropertiesMessage msg = (ObjectPhysicsPropertiesMessage)message;
-            if (m_PhysicsProperties != null)
-            {
-                for (int i = 0; i < msg.ObjectPhysicsProperties.Length; i++)
-                {
-                    OnPhysicsProperties(new PhysicsPropertiesEventArgs(simulator, msg.ObjectPhysicsProperties[i]));
-                }
-            }

             if (Client.Settings.OBJECT_TRACKING)
             {
@@ -2829,6 +2822,13 @@
                 }
             }

+            if (m_PhysicsProperties != null)
+            {
+                for (int i = 0; i < msg.ObjectPhysicsProperties.Length; i++)
+                {
+                    OnPhysicsProperties(new PhysicsPropertiesEventArgs(simulator, msg.ObjectPhysicsProperties[i]));
+                }
+            }
         }

         #endregion Packet Handlers


冗長なFieldSetを削除。

冗長なFieldSetを削除。

--- Implem.Pleasanter/Models/Sites/SiteUtilities.cs
+++ Implem.Pleasanter/Models/Sites/SiteUtilities.cs
@@ -3130,43 +3130,39 @@
             var firstSiteId = summarySiteIdHash.Select(o => o.Key.ToLong()).FirstOrDefault();
             return siteDataRows.Any()
                 ? hb.FieldSet(id: "SummariesSettingsEditor", action: () => hb
-                    .FieldSet(
-                        css: " enclosed",
-                        legendText: Displays.SettingSummaryColumns(),
-                        action: () => hb
-                            .FieldDropDown(
-                                controlId: "SummarySiteId",
-                                controlCss: " auto-postback",
-                                labelText: Displays.SummarySiteId(),
-                                optionCollection: summarySiteIdHash,
+                    .FieldDropDown(
+                        controlId: "SummarySiteId",
+                        controlCss: " auto-postback",
+                        labelText: Displays.SummarySiteId(),
+                        optionCollection: summarySiteIdHash,
+                        action: "SetSiteSettings",
+                        method: "post")
+                    .SummaryDestinationColumn(
+                        siteId: firstSiteId,
+                        referenceType: ss.ReferenceType,
+                        siteDataRows: siteDataRows)
+                    .SummaryLinkColumn(
+                        ss: ss,
+                        siteId: firstSiteId)
+                    .FieldDropDown(
+                        controlId: "SummaryType",
+                        controlCss: " auto-postback",
+                        labelText: Displays.SummaryType(),
+                        optionCollection: SummaryTypeCollection(),
+                        action: "SetSiteSettings",
+                        method: "post")
+                    .SummarySourceColumn(ss)
+                    .FieldContainer(actionOptions: () => hb
+                        .Div(css: "buttons", action: () => hb
+                            .Button(
+                                controlId: "AddSummary",
+                                text: Displays.Add(),
+                                controlCss: "button-icon",
+                                onClick: "$p.addSummary($(this));",
+                                icon: "ui-icon-plus",
                                 action: "SetSiteSettings",
-                                method: "post")
-                            .SummaryDestinationColumn(
-                                siteId: firstSiteId,
-                                referenceType: ss.ReferenceType,
-                                siteDataRows: siteDataRows)
-                            .SummaryLinkColumn(
-                                ss: ss,
-                                siteId: firstSiteId)
-                            .FieldDropDown(
-                                controlId: "SummaryType",
-                                controlCss: " auto-postback",
-                                labelText: Displays.SummaryType(),
-                                optionCollection: SummaryTypeCollection(),
-                                action: "SetSiteSettings",
-                                method: "post")
-                            .SummarySourceColumn(ss)
-                            .FieldContainer(actionOptions: () => hb
-                                .Div(css: "buttons", action: () => hb
-                                    .Button(
-                                        controlId: "AddSummary",
-                                        text: Displays.Add(),
-                                        controlCss: "button-icon",
-                                        onClick: "$p.addSummary($(this));",
-                                        icon: "ui-icon-plus",
-                                        action: "SetSiteSettings",
-                                        method: "put")))
-                            .SummarySettings(sourceSiteSettings: ss)))
+                                method: "put")))
+                    .SummarySettings(sourceSiteSettings: ss))
                 : hb.SummariesSettingsEditorNoLinks();
         }


LIBOMV-273 Adds Missing Event to SelectParcelObjectsReply packet handler. which would cause the OnParcelSelectedObjects event to not be fired on response data.

git-svn-id: c32cf1ecefca26b8770d7b0740bc0c5c174087e4@1988 c754d5e9-d413-0410-bcdf-9574c9dba6b7

--- OpenMetaverse/ParcelManager.cs
+++ OpenMetaverse/ParcelManager.cs
@@ -1628,13 +1628,18 @@
         private void SelectParcelObjectsReplyHandler(Packet packet, Simulator simulator)
         {
             ForceObjectSelectPacket reply = (ForceObjectSelectPacket)packet;
-            List<uint> ObjectIDs = new List<uint>(reply.Data.Length);
+            List<uint> objectIDs = new List<uint>(reply.Data.Length);

             for (int i = 0; i < reply.Data.Length; i++)
             {
-                ObjectIDs.Add(reply.Data[i].LocalID);
+                objectIDs.Add(reply.Data[i].LocalID);
             }

+            if (OnParcelSelectedObjects != null)
+            {
+                try { OnParcelSelectedObjects(simulator, objectIDs); }
+                catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); }
+            }
         }

         #endregion Packet Handlers


modify: Lexer.csのコーディング規則に関わる修正

modify: Lexer.csのコーディング規則に関わる修正

--- lury-lexer/Lexer.cs
+++ lury-lexer/Lexer.cs
@@ -259,7 +259,7 @@

             // Dedent All
             if (this.sourceLength > 0)
-                this.StackIndent(this.sourceLength - 1, 0, atEndOfFile: true);
+                this.StackIndent(this.sourceLength - 1, 0, true);

             this.AddToken(endoffile, 0);
             return true;


Fixed overlap problems with INSTALLSPEC

Fixed overlap problems with INSTALLSPEC

--- PInvoke/Security/AdvApi32/AppMgmt.cs
+++ PInvoke/Security/AdvApi32/AppMgmt.cs
@@ -393,12 +393,12 @@
 			/// application deployed to the user with this file name extension.
 			/// </para>
 			/// </summary>
-			[FieldOffset(0), MarshalAs(UnmanagedType.LPWStr)]
-			public string FileExt;
+			[FieldOffset(0)]
+			public StrPtrUni FileExt;

 			/// <summary/>
-			[FieldOffset(0), MarshalAs(UnmanagedType.LPWStr)]
-			public string ProgId;
+			[FieldOffset(0)]
+			public StrPtrUni ProgId;

 			/// <summary/>
 			[FieldOffset(0)]
@@ -412,8 +412,7 @@
 				/// The user-friendly name of the application as it appears in <c>Add or Remove Programs</c> and the Group Policy Object
 				/// Editor. You can obtain the name by calling GetManagedApplications.
 				/// </summary>
-				[MarshalAs(UnmanagedType.LPWStr)]
-				public string Name;
+				public StrPtrUni Name;

 				/// <summary>
 				/// The <c>GUID</c> for the group policy object in which the application exists. You can obtain the group policy object


Reorganize and cleanup code

Reorganize and cleanup code

--- AnimatorComponent/Editor/AnimationPathAnimatorEditor.cs
+++ AnimatorComponent/Editor/AnimationPathAnimatorEditor.cs
@@ -14,34 +14,6 @@
     /// </summary>
     [CustomEditor(typeof (AnimationPathAnimator))]
     public sealed class AnimationPathAnimatorEditor : Editor {
-        #region EXPORTER
-
-        public void DrawExportControls() {
-            EditorGUILayout.BeginHorizontal();
-
-            Script.ExportSamplingFrequency =
-                EditorGUILayout.IntField(
-                    new GUIContent(
-                        "Export Sampling",
-                        "Number of points to export for 1 m of the animation "
-                        + "path. If set to 0, it'll export only keys defined in "
-                        + "the path."),
-                    Script.ExportSamplingFrequency);
-
-            // Limit value.
-            if (Script.ExportSamplingFrequency < 1) {
-                Script.ExportSamplingFrequency = 1;
-            }
-
-            if (GUILayout.Button("Export")) {
-                Script.ExportNodes(Script.ExportSamplingFrequency);
-            }
-
-            EditorGUILayout.EndHorizontal();
-        }
-
-        #endregion
-
         #region PROPERTIES

         /// <summary>
@@ -52,6 +24,7 @@
         /// <summary>
         ///     Is true when serialized properties are initialized.
         /// </summary>
+        // todo remove
         private bool SerializedPropertiesInitialized { get; set; }

         /// <summary>
@@ -105,6 +78,7 @@
             // Repaint scene after each inspector update.
             SceneView.RepaintAll();
         }
+
         private void OnDisable() {
             // Disable Unity scene tool.
             SceneTool.RestoreTool();
@@ -175,16 +149,6 @@
         #endregion UNITY MESSAGES

         #region INSPECTOR CONTROLS
-        private void DrawTiltingCurve() {
-            if (Script.PathData == null) return;
-
-            Script.PathData.TiltingCurve = EditorGUILayout.CurveField(
-                new GUIContent(
-                    "Tilting Curve",
-                    ""),
-                Script.PathData.TiltingCurve);
-        }
-

         private void DrawAdvancedSettingsControls() {
             if (advancedSettingsFoldout.boolValue) {
@@ -335,23 +299,13 @@
             serializedObject.ApplyModifiedProperties();
         }

-        private void HandleDrawEaseCurve() {
-            if (Script.PathData == null) return;
-
-            Script.PathData.EaseCurve = EditorGUILayout.CurveField(
-                new GUIContent(
-                    "Ease Curve",
-                    ""),
-                Script.PathData.EaseCurve);
-        }
-
         private void DrawHandleModeDropdown() {
             Undo.RecordObject(Script.SettingsAsset, "Change handle mode.");

             var prevHandleMode = Script.HandleMode;

             Script.HandleMode =
-                (HandleMode)EditorGUILayout.EnumPopup(
+                (HandleMode) EditorGUILayout.EnumPopup(
                     new GUIContent(
                         "Scene Tool",
                         "Tool displayed next to each node. Default " +
@@ -383,13 +337,46 @@
             serializedObject.ApplyModifiedProperties();
         }

+        private void DrawNodeButtonsToggle() {
+            Script.DrawNodeButtons = EditorGUILayout.Toggle(
+                new GUIContent(
+                    "Draw Buttons",
+                    "Draw on-scene node buttons."),
+                Script.DrawNodeButtons);
+        }
+
+        private void DrawNodeHandleDropdown() {
+            var disable = Script.TangentMode != TangentMode.Custom;
+
+            EditorGUI.BeginDisabledGroup(disable);
+
+            Script.NodeHandle =
+                (NodeHandle) EditorGUILayout.EnumPopup(
+                    new GUIContent(
+                        "Node Handle",
+                        "On-scene node handle."),
+                    Script.NodeHandle);
+
+            EditorGUI.EndDisabledGroup();
+        }
+
+        private void DrawObjectCurveToggle() {
+            Undo.RecordObject(Script, "Toggle drawing object path.");
+
+            Script.DrawObjectPath = EditorGUILayout.Toggle(
+                new GUIContent(
+                    "Draw Object Path",
+                    ""),
+                Script.DrawObjectPath);
+        }
+
         private void DrawPathDataAssetField() {
             Undo.RecordObject(Script, "Change PathData inspector field.");

-            Script.PathData = (PathData)EditorGUILayout.ObjectField(
+            Script.PathData = (PathData) EditorGUILayout.ObjectField(
                 new GUIContent("Path Asset", "Asset containing all path data."),
                 Script.PathData,
-                typeof(PathData),
+                typeof (PathData),
                 false);
         }

@@ -446,7 +433,7 @@

             EditorGUI.BeginDisabledGroup(disable);

-            Script.PositionHandle = (PositionHandle)EditorGUILayout.EnumPopup(
+            Script.PositionHandle = (PositionHandle) EditorGUILayout.EnumPopup(
                 new GUIContent(
                     "Position Handle",
                     "Handle used to move nodes on scene. Default " +
@@ -557,6 +544,20 @@
             serializedObject.ApplyModifiedProperties();
         }

+        private void DrawRotationCurveToggle() {
+            var disable = Script.RotationMode != RotationMode.Custom;
+
+            EditorGUI.BeginDisabledGroup(disable);
+
+            Script.DrawRotationPathCurve = EditorGUILayout.Toggle(
+                new GUIContent(
+                    "Draw Rotation Path",
+                    ""),
+                Script.DrawRotationPathCurve);
+
+            EditorGUI.EndDisabledGroup();
+        }
+
         private void DrawRotationModeDropdown(
             Action<RotationMode, RotationMode> callback) {

@@ -567,7 +568,7 @@

             // Draw RotationMode dropdown.
             var currentRotationMode =
-                (RotationMode)EditorGUILayout.EnumPopup(
+                (RotationMode) EditorGUILayout.EnumPopup(
                     new GUIContent(
                         "Rotation Mode",
                         "Mode that controls animated game object rotation."),
@@ -648,7 +649,7 @@

             // Draw tangent mode dropdown.
             Script.TangentMode =
-                (TangentMode)EditorGUILayout.EnumPopup(
+                (TangentMode) EditorGUILayout.EnumPopup(
                     new GUIContent(
                         "Tangent Mode",
                         "Tangent mode applied to each path node."),
@@ -658,38 +659,6 @@
             if (Script.TangentMode != prevTangentMode) {
                 HandleTangentModeChange(prevTangentMode);
             }
-        }
-
-        private void DrawRotationCurveToggle() {
-            var disable = Script.RotationMode != RotationMode.Custom;
-
-            EditorGUI.BeginDisabledGroup(disable);
-
-            Script.DrawRotationPathCurve = EditorGUILayout.Toggle(
-                new GUIContent(
-                    "Draw Rotation Path",
-                    ""),
-                Script.DrawRotationPathCurve);
-
-            EditorGUI.EndDisabledGroup();
-        }
-
-        private void DrawNodeButtonsToggle() {
-            Script.DrawNodeButtons = EditorGUILayout.Toggle(
-                new GUIContent(
-                    "Draw Buttons",
-                    "Draw on-scene node buttons."),
-                Script.DrawNodeButtons);
-        }
-
-        private void DrawObjectCurveToggle() {
-            Undo.RecordObject(Script, "Toggle drawing object path.");
-
-            Script.DrawObjectPath = EditorGUILayout.Toggle(
-                new GUIContent(
-                    "Draw Object Path",
-                    ""),
-                Script.DrawObjectPath);
         }

         private void DrawTargetGOField() {
@@ -705,28 +674,33 @@
             HandleTargetGOFieldChange(prevTargetGO);
         }

-        private void DrawNodeHandleDropdown() {
-            var disable = Script.TangentMode != TangentMode.Custom;
-
-            EditorGUI.BeginDisabledGroup(disable);
-
-            Script.NodeHandle =
-                (NodeHandle) EditorGUILayout.EnumPopup(
-                    new GUIContent(
-                        "Node Handle",
-                        "On-scene node handle."),
-                    Script.NodeHandle);
-
-            EditorGUI.EndDisabledGroup();
+        private void DrawTiltingCurve() {
+            if (Script.PathData == null) return;
+
+            Script.PathData.TiltingCurve = EditorGUILayout.CurveField(
+                new GUIContent(
+                    "Tilting Curve",
+                    ""),
+                Script.PathData.TiltingCurve);
         }

         private void DrawWrapModeDropdown() {
             Script.WrapMode =
-                (AnimatorWrapMode)EditorGUILayout.EnumPopup(
+                (AnimatorWrapMode) EditorGUILayout.EnumPopup(
                     new GUIContent(
                         "Wrap Mode",
                         "Determines animator behaviour after animation end."),
                     Script.WrapMode);
+        }
+
+        private void HandleDrawEaseCurve() {
+            if (Script.PathData == null) return;
+
+            Script.PathData.EaseCurve = EditorGUILayout.CurveField(
+                new GUIContent(
+                    "Ease Curve",
+                    ""),
+                Script.PathData.EaseCurve);
         }

         private void HandleDrawForwardPointOffsetSlider() {
@@ -780,129 +754,11 @@

             EditorGUI.EndDisabledGroup();
         }
+
         #endregion

         #region SCENE VIEW DRAWING HANDLERS
-        private void HandleDrawingMoveAllModeLables() {
-            if (!Script.MoveAllMode) return;
-            if (!Script.DrawObjectPath) return;
-
-            // Get global node positions.
-            var globalNodePositions = Script.GetGlobalNodePositions();
-
-            // Create array with text to be displayed for each node.
-            var labelText = MultiplyTextIntoArray(
-                Script.SettingsAsset.MoveAllLabelText,
-                globalNodePositions);
-
-            SceneHandles.DrawUpdateAllLabels(
-                globalNodePositions,
-                labelText,
-                Script.SettingsAsset.MoveAllLabelOffsetX,
-                Script.SettingsAsset.MoveAllLabelOffsetY,
-                Script.SettingsAsset.DefaultLabelWidth,
-                Script.SettingsAsset.DefaultLabelHeight,
-                Script.Skin.GetStyle("MoveAllLabel"));
-        }
-
-        private void HandleDrawingRotationPathTangentHandles() {
-            // Don't draw when rotation path is disabled.
-            if (Script.RotationMode != RotationMode.Custom) return;
-            // Draw tangent handles only in custom tangent mode.
-            if (Script.TangentMode != TangentMode.Custom) return;
-            // Draw tangent handles only tangent node handle is selected.
-            if (Script.NodeHandle != NodeHandle.Tangent) return;
-
-            // Positions at which to draw tangent handles.
-            var nodes = Script.GetGlobalRotationPathPositions();
-
-            // Draw tangent handles.
-            SceneHandles.DrawTangentHandles(
-                nodes,
-                Script.RotationCurveColor,
-                Script.SettingsAsset.TangentHandleSize,
-                UpdateRotationPathTangents);
-        }
-
-        private void HandleDrawingRotationPathSmoothButtons() {
-            if (!Script.DrawNodeButtons) return;
-            if ((Script.TangentMode != TangentMode.Custom)
-                || (Script.RotationMode != RotationMode.Custom)) return;
-
-            var nodePositions = Script.GetGlobalRotationPathPositions();
-
-            var buttonStyle = Script.Skin.GetStyle(
-                "SmoothNodeButton");
-
-            SceneHandles.DrawNodeButtons(
-                nodePositions,
-                Script.SettingsAsset.RotationSmoothButtonOffsetH,
-                Script.SettingsAsset.RotationSmoothButtonOffsetV,
-                DrawRotationPathSmoothButtonsCallbackHandler,
-                buttonStyle);
-        }
-
-        private void HandleDrawingPathSmoothButtons() {
-            if (!Script.DrawNodeButtons) return;
-            // Custom tangent mode and Tangent node handle must be enabled.
-            if (Script.TangentMode != TangentMode.Custom) return;
-            if (!Script.DrawObjectPath) return;
-
-            // Get positions positions.
-            var nodePositions = Script.GetGlobalNodePositions();
-
-            // Get style for add button.
-            var buttonStyle = Script.Skin.GetStyle(
-                "SmoothNodeButton");
-
-            // Draw add node buttons.
-            SceneHandles.DrawNodeButtons(
-                nodePositions,
-                Script.SettingsAsset.SmoothButtonOffsetH,
-                Script.SettingsAsset.SmoothButtonOffsetV,
-                DrawPathSmoothButtonsCallbackHandler,
-                buttonStyle);
-        }
-
-        private void HandleDrawingObjectPathTangentHandles() {
-            // Draw tangent handles only in custom tangent mode.
-            if (Script.TangentMode != TangentMode.Custom) return;
-            // Draw tangent handles only tangent node handle is selected.
-            if (Script.NodeHandle != NodeHandle.Tangent) return;
-
-            // Positions at which to draw tangent handles.
-            var nodes = Script.GetGlobalNodePositions();
-
-            // Draw tangent handles.
-            SceneHandles.DrawTangentHandles(
-                nodes,
-                Script.GizmoCurveColor,
-                Script.SettingsAsset.TangentHandleSize,
-                UpdateObjectPathTangents);
-        }
-
-        private void HandleDrawingSceneToolToggleButtons() {
-            if (!Script.DrawNodeButtons) return;
-            if (!Script.DrawObjectPath) return;
-
-            // Get node positions.
-            var nodePositions = Script.GetGlobalNodePositions();
-            // Remove extreme nodes.
-            nodePositions.RemoveAt(0);
-            nodePositions.RemoveAt(nodePositions.Count - 1);
-
-            // Get style for add button.
-            var toggleButtonStyle = Script.Skin.GetStyle(
-                "SceneToolToggleButton");
-
-            // Draw add node buttons.
-            SceneHandles.DrawNodeButtons(
-                nodePositions,
-                Script.SettingsAsset.SceneToolToggleOffsetH,
-                Script.SettingsAsset.SceneToolToggleOffsetV,
-                DrawSceneToolToggleButtonsCallbackHandler,
-                toggleButtonStyle);
-        }
+
         /// <summary>
         ///     Method responsible for drawing for each node Unity's default position handle.
         /// </summary>
@@ -1036,6 +892,67 @@
                 Script.Skin.GetStyle("EaseValueLabel"));
         }

+        private void HandleDrawingMoveAllModeLables() {
+            if (!Script.MoveAllMode) return;
+            if (!Script.DrawObjectPath) return;
+
+            // Get global node positions.
+            var globalNodePositions = Script.GetGlobalNodePositions();
+
+            // Create array with text to be displayed for each node.
+            var labelText = MultiplyTextIntoArray(
+                Script.SettingsAsset.MoveAllLabelText,
+                globalNodePositions);
+
+            SceneHandles.DrawUpdateAllLabels(
+                globalNodePositions,
+                labelText,
+                Script.SettingsAsset.MoveAllLabelOffsetX,
+                Script.SettingsAsset.MoveAllLabelOffsetY,
+                Script.SettingsAsset.DefaultLabelWidth,
+                Script.SettingsAsset.DefaultLabelHeight,
+                Script.Skin.GetStyle("MoveAllLabel"));
+        }
+
+        private void HandleDrawingObjectPathTangentHandles() {
+            // Draw tangent handles only in custom tangent mode.
+            if (Script.TangentMode != TangentMode.Custom) return;
+            // Draw tangent handles only tangent node handle is selected.
+            if (Script.NodeHandle != NodeHandle.Tangent) return;
+
+            // Positions at which to draw tangent handles.
+            var nodes = Script.GetGlobalNodePositions();
+
+            // Draw tangent handles.
+            SceneHandles.DrawTangentHandles(
+                nodes,
+                Script.GizmoCurveColor,
+                Script.SettingsAsset.TangentHandleSize,
+                UpdateObjectPathTangents);
+        }
+
+        private void HandleDrawingPathSmoothButtons() {
+            if (!Script.DrawNodeButtons) return;
+            // Custom tangent mode and Tangent node handle must be enabled.
+            if (Script.TangentMode != TangentMode.Custom) return;
+            if (!Script.DrawObjectPath) return;
+
+            // Get positions positions.
+            var nodePositions = Script.GetGlobalNodePositions();
+
+            // Get style for add button.
+            var buttonStyle = Script.Skin.GetStyle(
+                "SmoothNodeButton");
+
+            // Draw add node buttons.
+            SceneHandles.DrawNodeButtons(
+                nodePositions,
+                Script.SettingsAsset.SmoothButtonOffsetH,
+                Script.SettingsAsset.SmoothButtonOffsetV,
+                DrawPathSmoothButtonsCallbackHandler,
+                buttonStyle);
+        }
+
         /// <summary>
         ///     Handle drawing movement handles.
         /// </summary>
@@ -1097,6 +1014,66 @@
             HandleDrawDefaultRotationHandle(rotationPointGlobalPosition);
         }

+        private void HandleDrawingRotationPathSmoothButtons() {
+            if (!Script.DrawNodeButtons) return;
+            if ((Script.TangentMode != TangentMode.Custom)
+                || (Script.RotationMode != RotationMode.Custom)) return;
+
+            var nodePositions = Script.GetGlobalRotationPathPositions();
+
+            var buttonStyle = Script.Skin.GetStyle(
+                "SmoothNodeButton");
+
+            SceneHandles.DrawNodeButtons(
+                nodePositions,
+                Script.SettingsAsset.RotationSmoothButtonOffsetH,
+                Script.SettingsAsset.RotationSmoothButtonOffsetV,
+                DrawRotationPathSmoothButtonsCallbackHandler,
+                buttonStyle);
+        }
+
+        private void HandleDrawingRotationPathTangentHandles() {
+            // Don't draw when rotation path is disabled.
+            if (Script.RotationMode != RotationMode.Custom) return;
+            // Draw tangent handles only in custom tangent mode.
+            if (Script.TangentMode != TangentMode.Custom) return;
+            // Draw tangent handles only tangent node handle is selected.
+            if (Script.NodeHandle != NodeHandle.Tangent) return;
+
+            // Positions at which to draw tangent handles.
+            var nodes = Script.GetGlobalRotationPathPositions();
+
+            // Draw tangent handles.
+            SceneHandles.DrawTangentHandles(
+                nodes,
+                Script.RotationCurveColor,
+                Script.SettingsAsset.TangentHandleSize,
+                UpdateRotationPathTangents);
+        }
+
+        private void HandleDrawingSceneToolToggleButtons() {
+            if (!Script.DrawNodeButtons) return;
+            if (!Script.DrawObjectPath) return;
+
+            // Get node positions.
+            var nodePositions = Script.GetGlobalNodePositions();
+            // Remove extreme nodes.
+            nodePositions.RemoveAt(0);
+            nodePositions.RemoveAt(nodePositions.Count - 1);
+
+            // Get style for add button.
+            var toggleButtonStyle = Script.Skin.GetStyle(
+                "SceneToolToggleButton");
+
+            // Draw add node buttons.
+            SceneHandles.DrawNodeButtons(
+                nodePositions,
+                Script.SettingsAsset.SceneToolToggleOffsetH,
+                Script.SettingsAsset.SceneToolToggleOffsetV,
+                DrawSceneToolToggleButtonsCallbackHandler,
+                toggleButtonStyle);
+        }
+
         /// <summary>
         ///     Handle drawing on-scene tilting handles.
         /// </summary>
@@ -1167,60 +1144,10 @@
                 Script.SettingsAsset.DefaultLabelHeight,
                 Script.Skin.GetStyle("UpdateAllLabel"));
         }
+
         #endregion DRAWING HANDLERS

         #region CALLBACK HANDLERS
-        private void DrawRotationPathSmoothButtonsCallbackHandler(int nodeIndex) {
-            Undo.RecordObject(Script.PathData, "Smooth Rotation Path node.");
-
-            Script.PathData.SmoothRotationPathNodeTangents(nodeIndex);
-        }
-
-        private void DrawPathSmoothButtonsCallbackHandler(int nodeIndex) {
-            Undo.RecordObject(Script.PathData, "Smooth Path node.");
-
-            Script.PathData.SmoothAllPathNodeTangents(nodeIndex);
-        }
-
-        private void DrawRotationModeDropdownCallbackHandler(
-                    RotationMode prevRotationMode,
-                    RotationMode currentRotationMode) {
-
-            Script.HandleMode = HandleMode.None;
-
-            // If custom rotation mode was just select, apply selected mode.
-            if (currentRotationMode == RotationMode.Custom) {
-                Script.RotationMode = RotationMode.Custom;
-                Script.DrawRotationPathCurve = true;
-                Script.PathData.ResetRotationPath();
-                return;
-            }
-
-            // Display modal window only when exiting custom rotation mode.
-            if (prevRotationMode != RotationMode.Custom) {
-                Script.RotationMode = currentRotationMode;
-                return;
-            }
-
-            // Display modal window.
-            var canDisableRotationPath = EditorUtility.DisplayDialog(
-                "Are you sure want to disable rotation path?",
-                "If you disable rotation path, all rotation path data " +
-                "will be lost.",
-                "Continue",
-                "Cancel");
-
-            // If user continues, apply selected rotation mode.
-            if (canDisableRotationPath) {
-                Script.RotationMode = currentRotationMode;
-            }
-
-            Utilities.InvokeMethodWithReflection(
-                Script,
-                "HandleUpdateAnimGOInSceneView",
-                null);
-        }
-

         private void ChangeRotationAtTimestampCallbackHandler() {
             if (Script.TangentMode == TangentMode.Custom) return;
@@ -1280,6 +1207,12 @@
             EditorUtility.SetDirty(Script.PathData);
         }

+        private void DrawPathSmoothButtonsCallbackHandler(int nodeIndex) {
+            Undo.RecordObject(Script.PathData, "Smooth Path node.");
+
+            Script.PathData.SmoothAllPathNodeTangents(nodeIndex);
+        }
+
         private void DrawPositionHandlesCallbackHandler(
             int movedNodeIndex,
             Vector3 newGlobalPos) {
@@ -1335,6 +1268,51 @@
             HandleLinearTangentMode();

             EditorUtility.SetDirty(Script.PathData);
+        }
+
+        private void DrawRotationModeDropdownCallbackHandler(
+            RotationMode prevRotationMode,
+            RotationMode currentRotationMode) {
+
+            Script.HandleMode = HandleMode.None;
+
+            // If custom rotation mode was just select, apply selected mode.
+            if (currentRotationMode == RotationMode.Custom) {
+                Script.RotationMode = RotationMode.Custom;
+                Script.DrawRotationPathCurve = true;
+                Script.PathData.ResetRotationPath();
+                return;
+            }
+
+            // Display modal window only when exiting custom rotation mode.
+            if (prevRotationMode != RotationMode.Custom) {
+                Script.RotationMode = currentRotationMode;
+                return;
+            }
+
+            // Display modal window.
+            var canDisableRotationPath = EditorUtility.DisplayDialog(
+                "Are you sure want to disable rotation path?",
+                "If you disable rotation path, all rotation path data " +
+                "will be lost.",
+                "Continue",
+                "Cancel");
+
+            // If user continues, apply selected rotation mode.
+            if (canDisableRotationPath) {
+                Script.RotationMode = currentRotationMode;
+            }
+
+            Utilities.InvokeMethodWithReflection(
+                Script,
+                "HandleUpdateAnimGOInSceneView",
+                null);
+        }
+
+        private void DrawRotationPathSmoothButtonsCallbackHandler(int nodeIndex) {
+            Undo.RecordObject(Script.PathData, "Smooth Rotation Path node.");
+
+            Script.PathData.SmoothRotationPathNodeTangents(nodeIndex);
         }

         private void DrawSceneToolToggleButtonsCallbackHandler(int index) {
@@ -1373,127 +1351,10 @@

             EditorUtility.SetDirty(Script.PathData);
         }
+
         #endregion CALLBACK HANDLERS

         #region OTHER HANDLERS
-        // todo rename to HandleHandleModeChange.
-        private void HandleModeChange() {
-            // If handle mode was changed to None..
-            if (Script.HandleMode == HandleMode.None) {
-                // Don't display update all values mode label.
-                Script.UpdateAllMode = false;
-            }
-            // Handle changed to ease or tilting.
-            else {
-                Script.PositionHandle = PositionHandle.Free;
-            }
-        }
-
-        private void HandlePlayPauseButton() {
-            Utilities.InvokeMethodWithReflection(
-                Script,
-                "HandlePlayPause",
-                null);
-        }
-
-        private void HandleRotationModeDropdownChange(
-                    RotationMode prevRotationMode,
-                    RotationMode currentRotationMode) {
-
-        }
-
-        /// <summary>
-        ///     Defines what to do when undo event is performed.
-        /// </summary>
-        private void HandleUndoEvent() {
-            if (Event.current.type == EventType.ValidateCommand
-                && Event.current.commandName == "UndoRedoPerformed") {
-
-                // Repaint inspector.
-                Repaint();
-
-                // Update path with new tangent setting.
-                HandleSmoothTangentMode();
-                HandleLinearTangentMode();
-
-                // Update animated object.
-                Utilities.InvokeMethodWithReflection(
-                    Script,
-                    "HandleUpdateAnimGOInSceneView",
-                    null);
-
-                // Fire event.
-                Utilities.InvokeMethodWithReflection(
-                    Script,
-                    "FireUndoRedoPerformedEvent",
-                    null);
-
-                SceneView.RepaintAll();
-            }
-        }
-
-        /// <summary>
-        ///     Method responsible for offseting rotation path position by a given delta.
-        /// </summary>
-        /// <param name="moveDelta"></param>
-        private void HandleOffsetRotationPathPosition(Vector3 moveDelta) {
-            if (Script.RotationMode != RotationMode.Custom) return;
-
-            Script.PathData.OffsetRotationPathPosition(moveDelta);
-        }
-
-        private void HandleMoveSingleNode(
-                    int movedNodeIndex,
-                    Vector3 newGlobalPos) {
-            // Return if node handle is not set to position.
-            if (Script.NodeHandle != NodeHandle.Position) return;
-            // Return if move all mode is enabled.
-            if (Script.MoveAllMode) return;
-
-            // Remember path length before applying changes.
-            var oldAnimGoPathLength = Script.PathData.GetPathLength(
-                Script.SettingsAsset.PathLengthSampling);
-
-            // Calculate node new local position.
-            var newNodeLocalPosition =
-                Script.transform.InverseTransformPoint(newGlobalPos);
-
-            // Move node.
-            Script.PathData.MoveNodeToPosition(
-                movedNodeIndex,
-                newNodeLocalPosition);
-
-            // Handle tangent mode.
-            HandleSmoothTangentMode();
-            HandleLinearTangentMode();
-
-            // Distribute timestamps.
-            Script.PathData.DistributeTimestamps(
-                DistributeTimestampsCallbackHandler);
-
-            // Current path length.
-            var newAnimGoPathLength = Script.PathData.GetPathLength(
-                Script.SettingsAsset.PathLengthSampling);
-
-            DistributeEaseValues(oldAnimGoPathLength, newAnimGoPathLength);
-        }
-
-        private void HandleMoveAllMode(int movedNodeIndex, Vector3 newGlobalPos) {
-            // Return if move all mode is disabled.
-            if (!Script.MoveAllMode) return;
-
-            var oldNodeLocalPosition =
-                Script.PathData.GetNodePosition(movedNodeIndex);
-            var newNodeLocalPosition =
-                Script.transform.InverseTransformPoint(newGlobalPos);
-
-            // Calculate movement delta.
-            var moveDelta = newNodeLocalPosition - oldNodeLocalPosition;
-
-            Script.PathData.OffsetNodePositions(moveDelta);
-            HandleOffsetRotationPathPosition(moveDelta);
-        }
-

         /// <summary>
         ///     Defines what to do when tangent mode is changed from custom to something else.
@@ -1512,56 +1373,6 @@
                 "Cancel");

             return (canExit);
-        }
-
-        private void HandleLinearTangentMode() {
-            if (Script.TangentMode == TangentMode.Linear) {
-                Script.PathData.SetPathTangentsToLinear();
-                Script.PathData.SetRotationPathTangentsToLineear();
-            }
-        }
-
-        /// <summary>
-        ///     Method responsible for applying smooth to rotation path node tangents.
-        /// </summary>
-        private void HandleSmoothRotationPathTangents() {
-            if (Script.RotationMode != RotationMode.Custom) return;
-
-            Script.PathData.SmoothRotationPathTangents();
-        }
-
-        private void HandleSmoothTangentMode() {
-            if (Script.TangentMode == TangentMode.Smooth) {
-                Script.PathData.SmoothAllPathNodeTangents();
-                HandleSmoothRotationPathTangents();
-            }
-        }
-
-        /// <summary>
-        ///     Handles tangent mode change.
-        /// </summary>
-        /// <param name="prevTangentMode"></param>
-        private void HandleTangentModeChange(TangentMode prevTangentMode) {
-            if (Script.PathData == null) return;
-
-            Undo.RecordObject(Script.PathData, "Smooth path node tangents.");
-
-            // Display modal window.
-            var canExitCustomTangentMode =
-                HandleAskIfExitTangentMode(prevTangentMode);
-            // If user canceled operation..
-            if (!canExitCustomTangentMode) {
-                // Restore Custom tangent mode.
-                Script.TangentMode = TangentMode.Custom;
-
-                return;
-            }
-
-            // Handle selected tangent mode.
-            HandleSmoothTangentMode();
-            HandleLinearTangentMode();
-
-            SceneView.RepaintAll();
         }

         /// <summary>
@@ -1606,6 +1417,7 @@
             // Disable ease tool.
             Script.PathData.TiltingToolState[index] = false;
         }
+
         /// <summary>
         ///     Enable selected node tool.
         /// </summary>
@@ -1647,6 +1459,144 @@

             // Enable ease tool for the node.
             Script.PathData.TiltingToolState[index] = true;
+        }
+
+        private void HandleLinearTangentMode() {
+            if (Script.TangentMode == TangentMode.Linear) {
+                Script.PathData.SetPathTangentsToLinear();
+                Script.PathData.SetRotationPathTangentsToLineear();
+            }
+        }
+
+        // todo rename to HandleHandleModeChange.
+        private void HandleModeChange() {
+            // If handle mode was changed to None..
+            if (Script.HandleMode == HandleMode.None) {
+                // Don't display update all values mode label.
+                Script.UpdateAllMode = false;
+            }
+            // Handle changed to ease or tilting.
+            else {
+                Script.PositionHandle = PositionHandle.Free;
+            }
+        }
+
+        private void HandleMoveAllMode(int movedNodeIndex, Vector3 newGlobalPos) {
+            // Return if move all mode is disabled.
+            if (!Script.MoveAllMode) return;
+
+            var oldNodeLocalPosition =
+                Script.PathData.GetNodePosition(movedNodeIndex);
+            var newNodeLocalPosition =
+                Script.transform.InverseTransformPoint(newGlobalPos);
+
+            // Calculate movement delta.
+            var moveDelta = newNodeLocalPosition - oldNodeLocalPosition;
+
+            Script.PathData.OffsetNodePositions(moveDelta);
+            HandleOffsetRotationPathPosition(moveDelta);
+        }
+
+        private void HandleMoveSingleNode(
+            int movedNodeIndex,
+            Vector3 newGlobalPos) {
+            // Return if node handle is not set to position.
+            if (Script.NodeHandle != NodeHandle.Position) return;
+            // Return if move all mode is enabled.
+            if (Script.MoveAllMode) return;
+
+            // Remember path length before applying changes.
+            var oldAnimGoPathLength = Script.PathData.GetPathLength(
+                Script.SettingsAsset.PathLengthSampling);
+
+            // Calculate node new local position.
+            var newNodeLocalPosition =
+                Script.transform.InverseTransformPoint(newGlobalPos);
+
+            // Move node.
+            Script.PathData.MoveNodeToPosition(
+                movedNodeIndex,
+                newNodeLocalPosition);
+
+            // Handle tangent mode.
+            HandleSmoothTangentMode();
+            HandleLinearTangentMode();
+
+            // Distribute timestamps.
+            Script.PathData.DistributeTimestamps(
+                DistributeTimestampsCallbackHandler);
+
+            // Current path length.
+            var newAnimGoPathLength = Script.PathData.GetPathLength(
+                Script.SettingsAsset.PathLengthSampling);
+
+            DistributeEaseValues(oldAnimGoPathLength, newAnimGoPathLength);
+        }
+
+        /// <summary>
+        ///     Method responsible for offseting rotation path position by a given delta.
+        /// </summary>
+        /// <param name="moveDelta"></param>
+        private void HandleOffsetRotationPathPosition(Vector3 moveDelta) {
+            if (Script.RotationMode != RotationMode.Custom) return;
+
+            Script.PathData.OffsetRotationPathPosition(moveDelta);
+        }
+
+        private void HandlePlayPauseButton() {
+            Utilities.InvokeMethodWithReflection(
+                Script,
+                "HandlePlayPause",
+                null);
+        }
+
+        private void HandleRotationModeDropdownChange(
+            RotationMode prevRotationMode,
+            RotationMode currentRotationMode) {
+
+        }
+
+        /// <summary>
+        ///     Method responsible for applying smooth to rotation path node tangents.
+        /// </summary>
+        private void HandleSmoothRotationPathTangents() {
+            if (Script.RotationMode != RotationMode.Custom) return;
+
+            Script.PathData.SmoothRotationPathTangents();
+        }
+
+        private void HandleSmoothTangentMode() {
+            if (Script.TangentMode == TangentMode.Smooth) {
+                Script.PathData.SmoothAllPathNodeTangents();
+                HandleSmoothRotationPathTangents();
+            }
+        }
+
+        /// <summary>
+        ///     Handles tangent mode change.
+        /// </summary>
+        /// <param name="prevTangentMode"></param>
+        private void HandleTangentModeChange(TangentMode prevTangentMode) {
+            if (Script.PathData == null) return;
+
+            Undo.RecordObject(Script.PathData, "Smooth path node tangents.");
+
+            // Display modal window.
+            var canExitCustomTangentMode =
+                HandleAskIfExitTangentMode(prevTangentMode);
+            // If user canceled operation..
+            if (!canExitCustomTangentMode) {
+                // Restore Custom tangent mode.
+                Script.TangentMode = TangentMode.Custom;
+
+                return;
+            }
+
+            // Handle selected tangent mode.
+            HandleSmoothTangentMode();
+            HandleLinearTangentMode();
+
+            SceneView.RepaintAll();
         }

         /// <summary>
@@ -1709,6 +1659,36 @@
         }

         /// <summary>
+        ///     Defines what to do when undo event is performed.
+        /// </summary>
+        private void HandleUndoEvent() {
+            if (Event.current.type == EventType.ValidateCommand
+                && Event.current.commandName == "UndoRedoPerformed") {
+
+                // Repaint inspector.
+                Repaint();
+
+                // Update path with new tangent setting.
+                HandleSmoothTangentMode();
+                HandleLinearTangentMode();
+
+                // Update animated object.
+                Utilities.InvokeMethodWithReflection(
+                    Script,
+                    "HandleUpdateAnimGOInSceneView",
+                    null);
+
+                // Fire event.
+                Utilities.InvokeMethodWithReflection(
+                    Script,
+                    "FireUndoRedoPerformedEvent",
+                    null);
+
+                SceneView.RepaintAll();
+            }
+        }
+
+        /// <summary>
         ///     Handles situation when adding new node to the path would result in
         ///     anim. GO path and rotation path having different number of nodes.
         /// </summary>
@@ -1770,25 +1750,68 @@
         #endregion

         #region METHODS
-        private string[] MultiplyTextIntoArray(
-                    string text,
-                    List<Vector3> globalNodePositions) {
-
-            var labelText = new string[globalNodePositions.Count];
-            for (var i = 0; i < globalNodePositions.Count; i++) {
-                labelText[i] = text;
-            }
-            return labelText;
-        }
-
-        private List<Vector3> RemoveNodeButtonPositions() {
-            // Node positions.
-            var nodePositions = Script.GetGlobalNodePositions();
-            // Remove extreme nodes.
-            // Extreme nodes can't be removed.
-            nodePositions.RemoveAt(0);
-            nodePositions.RemoveAt(nodePositions.Count - 1);
-            return nodePositions;
+
+        public void DrawExportControls() {
+            EditorGUILayout.BeginHorizontal();
+
+            Script.ExportSamplingFrequency =
+                EditorGUILayout.IntField(
+                    new GUIContent(
+                        "Export Sampling",
+                        "Number of points to export for 1 m of the animation "
+                        + "path. If set to 0, it'll export only keys defined in "
+                        + "the path."),
+                    Script.ExportSamplingFrequency);
+
+            // Limit value.
+            if (Script.ExportSamplingFrequency < 1) {
+                Script.ExportSamplingFrequency = 1;
+            }
+
+            if (GUILayout.Button("Export")) {
+                Script.ExportNodes(Script.ExportSamplingFrequency);
+            }
+
+            EditorGUILayout.EndHorizontal();
+        }
+
+        private static void FocusOnSceneView() {
+            if (SceneView.sceneViews.Count > 0) {
+                var sceneView = (SceneView) SceneView.sceneViews[0];
+                sceneView.Focus();
+            }
+        }
+
+        /// <summary>
+        ///     Add new path node between two others, exactly in the middle.
+        /// </summary>
+        /// <param name="nodeIndex">Node index after which a new node will be placed.</param>
+        private void AddNodeBetween(int nodeIndex) {
+            // Timestamp of node that was taken action on.
+            var currentKeyTime = Script.PathData.GetNodeTimestamp(nodeIndex);
+            // Get timestamp of the next node.
+            var nextKeyTime = Script.PathData.GetNodeTimestamp(nodeIndex + 1);
+
+            // Calculate timestamps for new key. It'll be placed exactly
+            // between the two nodes.
+            var newKeyTime =
+                currentKeyTime +
+                ((nextKeyTime - currentKeyTime) / 2);
+
+            // Return if timestamp for new node would be too close to the
+            // neighbouring nodes.
+            if (Mathf.Abs(currentKeyTime - newKeyTime)
+                < Script.SettingsAsset.MinNodeTimeSeparation) {
+
+                Debug.LogWarning(
+                    "Cannot add this node. Time difference to " +
+                    "previous and next node is too small. " +
+                    "Move nodes more far away.");
+                return;
+            }
+
+            // Add node to the animation curves.
+            Script.PathData.CreateNodeAtTime(newKeyTime);
         }

         private List<Vector3> AddNodeButtonPositions() {
@@ -1797,80 +1820,6 @@
             // Remove last node's position.
             nodePositions.RemoveAt(nodePositions.Count - 1);
             return nodePositions;
-        }
-
-        /// <summary>
-        ///     Offset rotation path node tangents by given value.
-        /// </summary>
-        /// <param name="index"></param>
-        /// <param name="inOutTangentOffset"></param>
-        private void UpdateRotationPathTangents(
-            int index,
-            Vector3 inOutTangentOffset) {
-
-            // Make snapshot of the target object.
-            Undo.RecordObject(Script.PathData, "Update rotation path tangents.");
-
-            Script.PathData.OffsetRotationPathNodeTangents(
-                index,
-                inOutTangentOffset);
-        }
-
-        /// <summary>
-        ///     Offset animated object path node tangents by given value.
-        /// </summary>
-        /// <param name="index"></param>
-        /// <param name="inOutTangentOffset"></param>
-        private void UpdateObjectPathTangents(
-            int index,
-            Vector3 inOutTangentOffset) {
-
-            // Make snapshot of the target object.
-            Undo.RecordObject(Script.PathData, "Update node tangents.");
-
-            Script.PathData.OffsetPathNodeTangents(index, inOutTangentOffset);
-            Script.PathData.DistributeTimestamps(
-                DistributeTimestampsCallbackHandler);
-        }
-
-
-        private static void FocusOnSceneView() {
-            if (SceneView.sceneViews.Count > 0) {
-                var sceneView = (SceneView) SceneView.sceneViews[0];
-                sceneView.Focus();
-            }
-        }
-
-        /// <summary>
-        ///     Add new path node between two others, exactly in the middle.
-        /// </summary>
-        /// <param name="nodeIndex">Node index after which a new node will be placed.</param>
-        private void AddNodeBetween(int nodeIndex) {
-            // Timestamp of node that was taken action on.
-            var currentKeyTime = Script.PathData.GetNodeTimestamp(nodeIndex);
-            // Get timestamp of the next node.
-            var nextKeyTime = Script.PathData.GetNodeTimestamp(nodeIndex + 1);
-
-            // Calculate timestamps for new key. It'll be placed exactly
-            // between the two nodes.
-            var newKeyTime =
-                currentKeyTime +
-                ((nextKeyTime - currentKeyTime) / 2);
-
-            // Return if timestamp for new node would be too close to the
-            // neighbouring nodes.
-            if (Mathf.Abs(currentKeyTime - newKeyTime)
-                < Script.SettingsAsset.MinNodeTimeSeparation) {
-
-                Debug.LogWarning(
-                    "Cannot add this node. Time difference to " +
-                    "previous and next node is too small. " +
-                    "Move nodes more far away.");
-                return;
-            }
-
-            // Add node to the animation curves.
-            Script.PathData.CreateNodeAtTime(newKeyTime);
         }

         /// <summary>
@@ -2043,6 +1992,7 @@
             DrawAdvancedSettingsFoldout();
             DrawAdvancedSettingsControls();
         }
+
         private void InitializeSerializedProperties() {
             animatedGO = serializedObject.FindProperty("animatedGO");
             targetGO = serializedObject.FindProperty("targetGO");
@@ -2071,15 +2021,6 @@
             SerializedPropertiesInitialized = true;
         }

-        private bool RequiredAssetsLoaded() {
-            var assetsLoaded = (bool) Utilities.InvokeMethodWithReflection(
-                Script,
-                "RequiredAssetsLoaded",
-                null);
-
-            return assetsLoaded;
-        }
-
         /// <summary>
         ///     Multiply each ease value by a difference between two given values.
         /// </summary>
@@ -2105,6 +2046,17 @@
             Script.PathData.MultiplyEaseCurveValues(multiplier);
         }

+        private string[] MultiplyTextIntoArray(
+            string text,
+            List<Vector3> globalNodePositions) {
+
+            var labelText = new string[globalNodePositions.Count];
+            for (var i = 0; i < globalNodePositions.Count; i++) {
+                labelText[i] = text;
+            }
+            return labelText;
+        }
+
         /// <summary>
         ///     Multiply each tilting value by a difference between two given values.
         /// </summary>
@@ -2130,6 +2082,59 @@
             Script.PathData.MultiplyTiltingCurveValues(multiplier);
         }

+        private List<Vector3> RemoveNodeButtonPositions() {
+            // Node positions.
+            var nodePositions = Script.GetGlobalNodePositions();
+            // Remove extreme nodes.
+            // Extreme nodes can't be removed.
+            nodePositions.RemoveAt(0);
+            nodePositions.RemoveAt(nodePositions.Count - 1);
+            return nodePositions;
+        }
+
+        private bool RequiredAssetsLoaded() {
+            var assetsLoaded = (bool) Utilities.InvokeMethodWithReflection(
+                Script,
+                "RequiredAssetsLoaded",
+                null);
+
+            return assetsLoaded;
+        }
+
+        /// <summary>
+        ///     Offset animated object path node tangents by given value.
+        /// </summary>
+        /// <param name="index"></param>
+        /// <param name="inOutTangentOffset"></param>
+        private void UpdateObjectPathTangents(
+            int index,
+            Vector3 inOutTangentOffset) {
+
+            // Make snapshot of the target object.
+            Undo.RecordObject(Script.PathData, "Update node tangents.");
+
+            Script.PathData.OffsetPathNodeTangents(index, inOutTangentOffset);
+            Script.PathData.DistributeTimestamps(
+                DistributeTimestampsCallbackHandler);
+        }
+
+        /// <summary>
+        ///     Offset rotation path node tangents by given value.
+        /// </summary>
+        /// <param name="index"></param>
+        /// <param name="inOutTangentOffset"></param>
+        private void UpdateRotationPathTangents(
+            int index,
+            Vector3 inOutTangentOffset) {
+
+            // Make snapshot of the target object.
+            Undo.RecordObject(Script.PathData, "Update rotation path tangents.");
+
+            Script.PathData.OffsetRotationPathNodeTangents(
+                index,
+                inOutTangentOffset);
+        }
+
         #endregion

         #region SHORTCUTS
@@ -2295,6 +2300,7 @@
                 HandleModeChange();
             }
         }
+
         private void HandlePlayPauseShortcut() {
             // Play/pause animation.
             if (Event.current.type == EventType.keyDown


Don't draw inspector options if path is not referenced

--- AnimatorComponent/Editor/AnimationPathAnimatorEditor.cs
+++ AnimatorComponent/Editor/AnimationPathAnimatorEditor.cs
@@ -1303,6 +1303,9 @@

             DrawAnimatedGOField();
             DrawTargetGOField();
+
+            // Hide inspector options if path is not selected.
+            if (Script.PathData == null) return;

             EditorGUILayout.Space();


refactor cli to get aguments

refactor cli to get aguments

--- PackageUseScrutiniser.Cli/Program.cs
+++ PackageUseScrutiniser.Cli/Program.cs
@@ -5,34 +5,50 @@

 namespace PackageUseScrutiniser.Cli
 {
-    class Program
+    internal static class Program
     {
         static void Main(string[] args)
         {
-
-            IEnumerable<string> packages = new List<string>();
-            var packageFinder = new PackageFinder();
-            switch (args.Length)
-            {
-                case 1:
-                    if (args[0] == "--help")
-                    {
-                        PrintHelp();
-                    }
-                    packages = packageFinder.GetPackages(Directory.GetCurrentDirectory(), args[0]);
-                    break;
-                case 2:
-                    packages = packageFinder.GetPackages(args[0], args[1]);
-                    break;
-                default:
-                    PrintHelp();
-                    break;
+            if (args.Length == 0 || args[0] == "--help" || args.Length > 2)
+            {
+                PrintHelp();
+                return;
+            }
+
+            var path = GetPath(args);
+            if (!Directory.Exists(path))
+            {
+                Console.WriteLine("Path {0} does not exist", path);
+                return;
             }

-            foreach (var package in packages)
+            var packageId = GetPackageId(args);
+            var packageFinder = new PackageFinder();
+
+            foreach (var package in packageFinder.GetPackages(packageId, path))
             {
                 Console.WriteLine(package);
             }
+        }
+
+        private static string GetPath(string[] args)
+        {
+            if (args.Length >= 2)
+            {
+                return args[1];
+            }
+
+            return Directory.GetCurrentDirectory();
+        }
+
+        private static string GetPackageId(IList<string> args)
+        {
+            if (args.Count >= 1)
+            {
+                return args[0];
+            }
+
+            return null;
         }

         private static void PrintHelp()


Updated tap to place to work in the editor & without the requirement of the spatial mapping manager.

--- Assets/HoloToolkit/SpatialMapping/Scripts/TapToPlace.cs
+++ Assets/HoloToolkit/SpatialMapping/Scripts/TapToPlace.cs
@@ -16,7 +16,7 @@
     /// and SpatialMappingManager.
     /// TapToPlace also adds a WorldAnchor component to enable persistence.
     /// </summary>
-
+    [RequireComponent(typeof(Collider))]
     public class TapToPlace : MonoBehaviour, IInputClickHandler
     {
         [Tooltip("Supply a friendly name for the anchor as the key name for the WorldAnchorStore.")]
@@ -36,6 +36,7 @@
         [Tooltip("Setting this to true will enable the user to move and place the object in the scene without needing to tap on the object. Useful when you want to place an object immediately.")]
         public bool IsBeingPlaced;

+#if UNITY_WSA && !UNITY_EDITOR
         /// <summary>
         /// Manages persisted anchors.
         /// </summary>
@@ -46,9 +47,19 @@
         /// to control rendering and to access the physics layer mask.
         /// </summary>
         protected SpatialMappingManager spatialMappingManager;
+#endif
+
+        /// <summary>
+        /// Keeps track of the layer the game object was on.
+        /// During placement the layer is switched to Ignore Raycast while placing the object.
+        /// </summary>
+        private int defaultLayer;

         protected virtual void Start()
         {
+            defaultLayer = gameObject.layer;
+
+#if UNITY_WSA && !UNITY_EDITOR
             // Make sure we have all the components in the scene we need.
             anchorManager = WorldAnchorManager.Instance;
             if (anchorManager == null)
@@ -56,25 +67,15 @@
                 Debug.LogError("This script expects that you have a WorldAnchorManager component in your scene.");
             }

-            spatialMappingManager = SpatialMappingManager.Instance;
-            if (spatialMappingManager == null)
-            {
-                Debug.LogError("This script expects that you have a SpatialMappingManager component in your scene.");
-            }
-
             if (anchorManager != null && spatialMappingManager != null)
             {
                 // If we are not starting out with actively placing the object, give it a World Anchor
-                if(!IsBeingPlaced)
+                if (!IsBeingPlaced)
                 {
                     anchorManager.AttachAnchor(gameObject, SavedAnchorFriendlyName);
                 }
             }
-            else
-            {
-                // If we don't have what we need to proceed, we may as well remove ourselves.
-                Destroy(this);
-            }
+#endif

             if (PlaceParentOnTap)
             {
@@ -93,36 +94,39 @@
             // update the placement to match the user's gaze.
             if (IsBeingPlaced)
             {
-                // Do a raycast into the world that will only hit the Spatial Mapping mesh.
+                // Rotate this object to face the user.
+                Quaternion toQuat = Camera.main.transform.localRotation;
+                toQuat.x = 0;
+                toQuat.z = 0;
+
+#if UNITY_WSA && !UNITY_EDITOR
                 Vector3 headPosition = Camera.main.transform.position;
                 Vector3 gazeDirection = Camera.main.transform.forward;

+                // If we're using the spatial mapping, check to see if we got a hit, else use the gaze position.
                 RaycastHit hitInfo;
-                if (Physics.Raycast(headPosition, gazeDirection, out hitInfo, 30.0f, spatialMappingManager.LayerMask))
+                Vector3 placementPosition = spatialMappingManager != null &&
+                    Physics.Raycast(headPosition, gazeDirection, out hitInfo, 30.0f, spatialMappingManager.LayerMask)
+                        ? hitInfo.point
+                        : GazeManager.Instance.HitPosition;
+#else
+                Vector3 placementPosition = GazeManager.Instance.HitPosition;
+#endif
+
+                // Here is where you might consider adding intelligence
+                // to how the object is placed.  For example, consider
+                // placing based on the bottom of the object's
+                // collider so it sits properly on surfaces.
+
+                if (PlaceParentOnTap)
                 {
-                    // Rotate this object to face the user.
-                    Quaternion toQuat = Camera.main.transform.localRotation;
-                    toQuat.x = 0;
-                    toQuat.z = 0;
-
-                    // Move this object to where the raycast
-                    // hit the Spatial Mapping mesh.
-                    // Here is where you might consider adding intelligence
-                    // to how the object is placed.  For example, consider
-                    // placing based on the bottom of the object's
-                    // collider so it sits properly on surfaces.
-                    if (PlaceParentOnTap)
-                    {
-                        // Place the parent object as well but keep the focus on the current game object
-                        Vector3 currentMovement = hitInfo.point - gameObject.transform.position;
-                        ParentGameObjectToPlace.transform.position += currentMovement;
-                        ParentGameObjectToPlace.transform.rotation = toQuat;
-                    }
-                    else
-                    {
-                        gameObject.transform.position = hitInfo.point;
-                        gameObject.transform.rotation = toQuat;
-                    }
+                    ParentGameObjectToPlace.transform.position += placementPosition - gameObject.transform.position;
+                    ParentGameObjectToPlace.transform.rotation = toQuat;
+                }
+                else
+                {
+                    gameObject.transform.position = placementPosition;
+                    gameObject.transform.rotation = toQuat;
                 }
             }
         }
@@ -132,21 +136,32 @@
             // On each tap gesture, toggle whether the user is in placing mode.
             IsBeingPlaced = !IsBeingPlaced;

-            // If the user is in placing mode, display the spatial mapping mesh.
             if (IsBeingPlaced)
             {
+                gameObject.layer = 2;
+                InputManager.Instance.AddGlobalListener(gameObject);
+
+#if UNITY_WSA && !UNITY_EDITOR
+
+                // If the user is in placing mode, display the spatial mapping mesh.
                 spatialMappingManager.DrawVisualMeshes = true;

-                Debug.Log(gameObject.name + " : Removing existing world anchor if any.");
-
+                //Removes existing world anchor if any exist.
                 anchorManager.RemoveAnchor(gameObject);
+#endif
             }
-            // If the user is not in placing mode, hide the spatial mapping mesh.
             else
             {
+                gameObject.layer = defaultLayer;
+                InputManager.Instance.RemoveGlobalListener(gameObject);
+#if UNITY_WSA && !UNITY_EDITOR
+
+                // If the user is not in placing mode, hide the spatial mapping mesh.
                 spatialMappingManager.DrawVisualMeshes = false;
+
                 // Add world anchor when object placement is done.
                 anchorManager.AttachAnchor(gameObject, SavedAnchorFriendlyName);
+#endif
             }
         }

@@ -156,12 +171,12 @@
             {
                 if (gameObject.transform.parent == null)
                 {
-                    Debug.LogError("The selected GameObject has no parent.");
+                    Debug.LogWarning("The selected GameObject has no parent.");
                     PlaceParentOnTap = false;
                 }
                 else
                 {
-                    Debug.LogError("No parent specified. Using immediate parent instead: " + gameObject.transform.parent.gameObject.name);
+                    Debug.LogWarning("No parent specified. Using immediate parent instead: " + gameObject.transform.parent.gameObject.name);
                     ParentGameObjectToPlace = gameObject.transform.parent.gameObject;
                 }
             }


issues/24 refactor(SingletonMonoBehaviour): rename private value

--- Assets/Plugins/Unidux/Scripts/SingletonMonoBehaviour.cs
+++ Assets/Plugins/Unidux/Scripts/SingletonMonoBehaviour.cs
@@ -4,23 +4,23 @@
 {
     public class SingletonMonoBehaviour<TClass> : MonoBehaviour where TClass : SingletonMonoBehaviour<TClass>
     {
-        protected static TClass instance;
+        protected static TClass _instance;

         public static TClass Instance
         {
             get
             {
-                if (instance == null)
+                if (_instance == null)
                 {
-                    instance = (TClass) FindObjectOfType(typeof(TClass));
+                    _instance = (TClass) FindObjectOfType(typeof(TClass));

-                    if (instance == null)
+                    if (_instance == null)
                     {
                         Debug.LogWarning(typeof(TClass) + "is nothing");
                     }
                 }

-                return instance;
+                return _instance;
             }
         }

@@ -31,12 +31,12 @@

         protected bool CheckInstance()
         {
-            if (instance == null)
+            if (_instance == null)
             {
-                instance = (TClass) this;
+                _instance = (TClass) this;
                 return true;
             }
-            else if (Instance == this)
+            else if (_instance == this)
             {
                 return true;
             }


More changes and documentation to make this easier for later changes. Vehicles might? work a bit better now with how they move/rotate.

--- Aurora/Physics/AuroraOpenDynamicsEngine/AODEDynamics.cs
+++ Aurora/Physics/AuroraOpenDynamicsEngine/AODEDynamics.cs
@@ -812,6 +812,7 @@
                 }
             }

+            //Do this here, because it shouldn't clear out gravity or the tainted forces (not part of vehicle physics)
             if ((m_flags & (VehicleFlag.NO_X)) != 0)
                 m_dir.X = 0;
             if ((m_flags & (VehicleFlag.NO_Y)) != 0)
@@ -856,7 +857,8 @@
             Vector3 PreferredAxisOfMotion = new Vector3(1, 0, 0);
             PreferredAxisOfMotion *= m_referenceFrame;

-            //m_dir += ((PreferredAxisOfMotion * m_linearDeflectionEfficiency) / (m_linearDeflectionTimescale / pTimestep));
+            //Multiply it so that it scales linearly
+            m_dir *= ((PreferredAxisOfMotion * m_linearDeflectionEfficiency) / (m_linearDeflectionTimescale / pTimestep));

             #endregion

@@ -868,7 +870,7 @@
                 Mass = mass.mass;
                 Mass *= 2;
             }
-
+            //No Setting forces, only velocity! Forces are NOT recommended to be used by the ODE manual
             //d.BodySetForce(Body, _pParentScene.gravityx + TaintedForce.X,
             //    _pParentScene.gravityy + TaintedForce.Y,
             //    (_pParentScene.gravityz * Mass * (1f - m_VehicleBuoyancy)) + TaintedForce.Z);
@@ -881,12 +883,12 @@
             //Uses the square to make bouyancy more effective as in SL, as it seems to effect gravity more the higher the value is
             //This check helps keep things from being pushed into the ground and the consequence of being shoved back out
             if (Math.Abs(m_dir.Z) > 0.1)
-                m_dir.Z += ((_pParentScene.gravityz * Mass) * ((((1 - m_VehicleBuoyancy) * (1 - m_VehicleBuoyancy) * (1 - m_VehicleBuoyancy))) * pTimestep));
-
-            if (m_dir.Z > 10)
+                m_dir.Z += ((_pParentScene.gravityz * Mass) * ((((1 - m_VehicleBuoyancy) * (1 - m_VehicleBuoyancy))) * pTimestep));
+
+            /*if (m_dir.Z > 10)
                 m_dir.Z = 10;
             else if (m_dir.Z < -10)
-                m_dir.Z = -10;
+                m_dir.Z = -10;*/

             d.BodySetLinearVel(Body, m_dir.X, m_dir.Y, m_dir.Z);

@@ -1106,21 +1108,6 @@
             {
                 m_lastAngularVelocity.Y += (m_lastAngularVelocity.Y) * (pTimestep);
             }
-
-            #endregion
-
-            #region Drift
-
-            //FLAGGED FOR REEVALUATION
-            //Slide us around a bit
-            lastDrift += m_lastAngularVelocity.Z / (7f / pTimestep);
-
-            if (Math.Abs(lastDrift) < 0.1)
-                lastDrift = 0;
-
-            lastDrift -= lastDrift / (2f / pTimestep);
-
-            m_lastAngularVelocity.Z += lastDrift;

             #endregion


Implement a new SendUpdate() method for vehicles that will limit the # of updates and make it a bit smoother and stop the vehicle from not stopping all the time.

--- Aurora/Physics/AuroraOpenDynamicsEngine/AODEDynamics.cs
+++ Aurora/Physics/AuroraOpenDynamicsEngine/AODEDynamics.cs
@@ -554,9 +554,7 @@
             MoveAngular (pTimestep, pParentScene, parent);
             LimitRotation(pTimestep);

-            // WE deal with updates
-            if(!m_linearZeroFlag || !m_angularZeroFlag)
-                parent.RequestPhysicsterseUpdate();
+            SendUpdate(parent);
         }   // end Step

         private void MoveLinear (float pTimestep, AuroraODEPhysicsScene _pParentScene, AuroraODEPrim parent)
@@ -912,7 +910,7 @@
             Vector3 deflection = Vector3.Zero;
             Vector3 banking = Vector3.Zero;

-            if(m_verticalAttractionTimescale < 300 && (m_angularMotorVelocity != Vector3.Zero || m_angularMotorApply > 0))
+            if(m_verticalAttractionTimescale < 300 && (m_angularMotorVelocity != Vector3.Zero || m_angularMotorApply > 90))
             {
                 float VAservo = 0;
                 if(Type == Vehicle.TYPE_BOAT)
@@ -1089,6 +1087,35 @@
             }
         }

+        private Vector3 m_lastVelocity = Vector3.Zero;
+        private Vector3 m_lastAngVelocity = Vector3.Zero;
+        private int m_sentZeroFlag = 0;
+
+        private void SendUpdate (AuroraODEPrim parent)
+        {
+            // WE deal with updates
+            if(m_linearZeroFlag && m_angularZeroFlag)
+            {
+                if(m_sentZeroFlag > 0)
+                {
+                    m_sentZeroFlag--;
+                    parent.RequestPhysicsterseUpdate();
+                }
+            }
+            else
+            {
+                if(!m_lastVelocity.ApproxEquals(parent.Velocity, 0.1f) ||
+                    !m_lastAngVelocity.ApproxEquals(parent.RotationalVelocity, 0.1f))
+                {
+                    m_lastVelocity = parent.Velocity;
+                    m_lastAngVelocity = parent.RotationalVelocity;
+                    m_sentZeroFlag = 5;
+                }
+                else
+                {
+                }
+            }
+        }
         private Vector3 ToEuler(Quaternion m_lastCameraRotation)
         {
             Quaternion t = new Quaternion(m_lastCameraRotation.X * m_lastCameraRotation.X, m_lastCameraRotation.Y * m_lastCameraRotation.Y, m_lastCameraRotation.Z * m_lastCameraRotation.Z, m_lastCameraRotation.W * m_lastCameraRotation.W);


Media Items Trashed

Media Items Trashed

Don't try to create something that is in the trash. It an item is
trashed and we want to import it - untrash the item

--- Jumoo.uSync.Core/Serializers/MediaSerializer.cs
+++ Jumoo.uSync.Core/Serializers/MediaSerializer.cs
@@ -31,12 +31,17 @@
             var update = node.Attribute("updated").ValueOrDefault(DateTime.Now);

             var item = _mediaService.GetById(guid);
-            if (item == null || item.Trashed)
+            if (item == null)
             {
                 item = _mediaService.CreateMedia(name, parentId, mediaTypeAlias);
             }
             else
             {
+                if (item.Trashed)
+                {
+                    item.ChangeTrashedState(false);
+                }
+
                 if (!forceUpdate)
                 {
                     if (DateTime.Compare(update, item.UpdateDate.ToLocalTime()) < 0)


Mess with water rendering a bit more.

Mess with water rendering a bit more.

--- OpenSim/Region/CoreModules/World/WorldMap/WarpTileRenderer.cs
+++ OpenSim/Region/CoreModules/World/WorldMap/WarpTileRenderer.cs
@@ -185,8 +185,8 @@
             else
                 waterColormaterial = new warp_Material (ConvertColor (WATER_COLOR));

-            waterColormaterial.setTransparency ((byte)((1f - WATER_COLOR.A) * 255f) * 4);
-            waterColormaterial.setReflectivity (0);
+            waterColormaterial.setTransparency ((byte)((1f - WATER_COLOR.A) * 255f) * 2);
+            waterColormaterial.setReflectivity (50);
             renderer.Scene.addMaterial ("WaterColor", waterColormaterial);
             renderer.SetObjectMaterial ("Water", "WaterColor");


Don't create a rendered object for the None hand joint. (#4830)

--- Assets/MixedRealityToolkit/Providers/Hands/BaseHandVisualizer.cs
+++ Assets/MixedRealityToolkit/Providers/Hands/BaseHandVisualizer.cs
@@ -115,14 +115,23 @@
                 }
                 else
                 {
-                    GameObject prefab = InputSystem.InputSystemProfile.HandTrackingProfile.JointPrefab;
-                    if (handJoint == TrackedHandJoint.Palm)
+                    GameObject prefab;
+                    if (handJoint == TrackedHandJoint.None)
+                    {
+                        // No visible mesh for the "None" joint
+                        prefab = null;
+                    }
+                    else if (handJoint == TrackedHandJoint.Palm)
                     {
                         prefab = InputSystem.InputSystemProfile.HandTrackingProfile.PalmJointPrefab;
                     }
                     else if (handJoint == TrackedHandJoint.IndexTip)
                     {
                         prefab = InputSystem.InputSystemProfile.HandTrackingProfile.FingerTipPrefab;
+                    }
+                    else
+                    {
+                        prefab = InputSystem.InputSystemProfile.HandTrackingProfile.JointPrefab;
                     }

                     GameObject jointObject;


removed duplicate manager  from message

removed duplicate manager  from message

--- Assets/MixedRealityToolkit/_Core/Managers/MixedRealityManager.cs
+++ Assets/MixedRealityToolkit/_Core/Managers/MixedRealityManager.cs
@@ -915,7 +915,7 @@

             if (isMixedRealityManagerInitializing)
             {
-                Debug.LogWarning("Unable to get manager a manager while initializing!");
+                Debug.LogWarning("Unable to get a manager while initializing!");
                 return;
             }


Update version number

Update version number

--- BusinessAccounting/BusinessAccounting/Properties/AssemblyInfo.cs
+++ BusinessAccounting/BusinessAccounting/Properties/AssemblyInfo.cs
@@ -12,7 +12,7 @@
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("Alexander Fuks")]
 [assembly: AssemblyProduct("Business Accounting")]
-[assembly: AssemblyCopyright("Copyright © Alexander Fuks 2014-2017")]
+[assembly: AssemblyCopyright("Copyright © Alexander Fuks 2014-2019")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]

@@ -51,5 +51,5 @@
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.4.0.0")]
-[assembly: AssemblyFileVersion("1.4.0.0")]
+[assembly: AssemblyVersion("1.4.1.0")]
+[assembly: AssemblyFileVersion("1.4.1.0")]


Fix not pasting stats with no boss name available.

--- CasualMeter.Common/Formatters/DamageTrackerFormatter.cs
+++ CasualMeter.Common/Formatters/DamageTrackerFormatter.cs
@@ -13,7 +13,7 @@
         public DamageTrackerFormatter(DamageTracker damageTracker, FormatHelpers formatHelpers)
         {
             var placeHolders = new List<KeyValuePair<string, object>>();
-            placeHolders.Add(new KeyValuePair<string, object>("Boss", damageTracker.Name));
+            placeHolders.Add(new KeyValuePair<string, object>("Boss", damageTracker.Name??string.Empty));
             placeHolders.Add(new KeyValuePair<string, object>("Time", formatHelpers.FormatTimeSpan(damageTracker.Duration)));

             Placeholders = placeHolders.ToDictionary(x => x.Key, y => y.Value);


Updated tests

Updated tests

git-tfs-id: [https://tfs.caes.ucdavis.edu:8088/tfs]$/Commencement/Trunk/Commencement;C9170

--- Commencement.Tests/Controllers/AccountControllerTest.cs
+++ Commencement.Tests/Controllers/AccountControllerTest.cs
@@ -2,6 +2,7 @@
 using System.Linq;
 using Commencement.Controllers;
 using Commencement.Controllers.Filters;
+using Commencement.Core.Domain;
 using Commencement.Tests.Core.Extensions;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 using MvcContrib.TestHelper;
@@ -320,7 +321,7 @@
         /// #4
         /// </summary>
         [TestMethod]
-        public void TestControllerMethodEmulateContainsExpectedAttributes()
+        public void TestControllerMethodEmulateContainsExpectedAttributes1()
         {
             #region Arrange
             var controllerClass = _controllerClass;
@@ -333,8 +334,31 @@
             #endregion Act

             #region Assert
-            Assert.AreEqual(1, allAttributes.Count(), "More than expected custom attributes found.");
+            Assert.AreEqual(2, allAttributes.Count(), "More than expected custom attributes found.");
             Assert.AreEqual(1, expectedAttribute.Count(), "EmulationUserOnlyAttribute not found.");
+            #endregion Assert
+        }
+
+        /// <summary>
+        /// Tests the controller method emulate contains expected attributes.
+        /// #4
+        /// </summary>
+        [TestMethod]
+        public void TestControllerMethodEmulateContainsExpectedAttributes2()
+        {
+            #region Arrange
+            var controllerClass = _controllerClass;
+            var controllerMethod = controllerClass.GetMethod("Emulate");
+            #endregion Arrange
+
+            #region Act
+            var allAttributes = controllerMethod.GetCustomAttributes(true);
+            var expectedAttribute = controllerMethod.GetCustomAttributes(true).OfType<PageTrackingFilter>();
+            #endregion Act
+
+            #region Assert
+            Assert.AreEqual(2, allAttributes.Count(), "More than expected custom attributes found.");
+            Assert.AreEqual(1, expectedAttribute.Count(), "PageTrackingFilter not found.");
             #endregion Assert
         }

@@ -352,10 +376,12 @@

             #region Act
             var allAttributes = controllerMethod.GetCustomAttributes(true);
-            #endregion Act
-
-            #region Assert
-            Assert.AreEqual(0, allAttributes.Count(), "More than expected custom attributes found.");
+            var expectedAttribute = controllerMethod.GetCustomAttributes(true).OfType<PageTrackingFilter>();
+            #endregion Act
+
+            #region Assert
+            Assert.AreEqual(1, allAttributes.Count(), "More than expected custom attributes found.");
+            Assert.AreEqual(1, expectedAttribute.Count(), "PageTrackingFilter not found.");
             #endregion Assert
         }
         #endregion Controller Method Tests


fix Duration type mismatch bug in

fix Duration type mismatch bug in

--- csharp/Adapter/Microsoft.Spark.CSharp/Proxy/Ipc/DStreamIpcProxy.cs
+++ csharp/Adapter/Microsoft.Spark.CSharp/Proxy/Ipc/DStreamIpcProxy.cs
@@ -40,7 +40,7 @@
         public IDStreamProxy Window(int windowSeconds, int slideSeconds = 0)
         {
             string windowId = null;
-            var windowDurationReference = SparkCLRIpcProxy.JvmBridge.CallConstructor("org.apache.spark.streaming.Duration", new object[] { windowSeconds * 1000 });
+            var windowDurationReference = SparkCLRIpcProxy.JvmBridge.CallConstructor("org.apache.spark.streaming.Duration", new object[] { (long)windowSeconds * 1000 });

             if (slideSeconds <= 0)
             {
@@ -48,7 +48,7 @@
                 return new DStreamIpcProxy(new JvmObjectReference(windowId));
             }

-            var slideDurationReference = SparkCLRIpcProxy.JvmBridge.CallConstructor("org.apache.spark.streaming.Duration", new object[] { slideSeconds * 1000 });
+            var slideDurationReference = SparkCLRIpcProxy.JvmBridge.CallConstructor("org.apache.spark.streaming.Duration", new object[] { (long)slideSeconds * 1000 });
             windowId = (string)SparkCLRIpcProxy.JvmBridge.CallNonStaticJavaMethod(javaDStreamReference, "window", new object[] { windowDurationReference, slideDurationReference });

             return new DStreamIpcProxy(new JvmObjectReference(windowId));


Bumping version to 1.1.1

Bumping version to 1.1.1

--- D2L.Services.Core.Extensions/Properties/AssemblyInfo.cs
+++ D2L.Services.Core.Extensions/Properties/AssemblyInfo.cs
@@ -66,8 +66,8 @@

 // [assembly: AssemblyVersion("1.0.*")]

-[assembly: AssemblyVersion("1.1.0.0")]
+[assembly: AssemblyVersion("1.1.1.0")]

-[assembly: AssemblyFileVersion("1.1.0.0")]
+[assembly: AssemblyFileVersion("1.1.1.0")]


Update RazerLayoutMap.cs

Update RazerLayoutMap.cs

--- Project-Aurora/Project-Aurora/Devices/Razer/RazerLayoutMap.cs
+++ Project-Aurora/Project-Aurora/Devices/Razer/RazerLayoutMap.cs
@@ -168,9 +168,9 @@
             {DeviceKeys.O, new int [] {2, 10} },
             {DeviceKeys.P, new int [] {2, 11} },
             {DeviceKeys.OPEN_BRACKET, new int [] {2, 12} },
-            {DeviceKeys.CLOSE_BRACKET, new int [] {2,13} },
-            {DeviceKeys.BACKSLASH, new int [] {2, 15} },
-            {DeviceKeys.BACKSLASH_UK, new int [] {2, 15} },
+            {DeviceKeys.CLOSE_BRACKET, new int [] {2, 13} },
+            {DeviceKeys.BACKSLASH, new int [] {2, 14} },
+            {DeviceKeys.BACKSLASH_UK, new int [] {2, 14} },
             {DeviceKeys.CAPS_LOCK, new int [] {3, 1} },
             {DeviceKeys.A, new int [] {3, 2} },
             {DeviceKeys.S, new int [] {3, 3} },
@@ -195,7 +195,7 @@
             {DeviceKeys.COMMA, new int [] {4, 10} },
             {DeviceKeys.PERIOD, new int [] {4, 11} },
             {DeviceKeys.FORWARD_SLASH, new int [] {4, 12} },
-            {DeviceKeys.RIGHT_SHIFT, new int [] {4, 14} },
+            {DeviceKeys.RIGHT_SHIFT, new int [] {4, 15} },
             {DeviceKeys.LEFT_CONTROL, new int [] {5, 1} },
             {DeviceKeys.LEFT_FN, new int [] {5, 2} },
             {DeviceKeys.LEFT_WINDOWS, new int [] {5, 3} },


Add Memset's Cloud Storage to Openstack providers

--- Duplicati/Library/Backend/OpenStack/OpenStackStorage.cs
+++ Duplicati/Library/Backend/OpenStack/OpenStackStorage.cs
@@ -64,6 +64,7 @@
             new KeyValuePair<string, string>("Rackspace UK", "https://lon.identity.api.rackspacecloud.com/v2.0"),
             new KeyValuePair<string, string>("OVH Cloud Storage", "https://auth.cloud.ovh.net/v2.0"),
             new KeyValuePair<string, string>("Selectel Cloud Storage", "https://auth.selcdn.ru"),
+            new KeyValuePair<string, string>("Memset Cloud Storage", "https://auth.storage.memset.com"),
         };

         public static readonly KeyValuePair<string, string>[] OPENSTACK_VERSIONS = {


Support to specify UTC and offset separately to setCurrentTimeAsync

--- Project/Api/SystemApiClient.cs
+++ Project/Api/SystemApiClient.cs
@@ -14,12 +14,12 @@
         {
         }

-        public async Task SetCurrentTimeAsync(DateTimeOffset time)
+        public async Task SetCurrentTimeAsync(DateTimeOffset UtcTime, int OffsetInMinute)
         {
             var req = new TimeOffset
             {
-                DateTime = time.ToString("yyyy-MM-ddThh:mm:ssZ"),
-                TimeZoneOffsetMinute = (int)(time.Offset.TotalMinutes),
+                DateTime = UtcTime.ToString("yyyy-MM-ddTHH:mm:ssZ"),
+                TimeZoneOffsetMinute = OffsetInMinute,
                 DstOffsetMinute = 0
             };
             await NoValue(RequestGenerator.Serialize("setCurrentTime", ApiVersion.V1_0, req));


Special case mono hacks, no longer needed

infact hacks caused breakage

--- Dynamitey/Internal/Optimization/InvokeHelper-Regular.cs
+++ Dynamitey/Internal/Optimization/InvokeHelper-Regular.cs
@@ -446,12 +446,8 @@
                 if (staticContext) //CSharp Binder won't call Static properties, grrr.
                 {
                     var tStaticFlag = CSharpBinderFlags.None;
-                    if ((target is Type && ((Type)target).GetTypeInfo().IsPublic) || Util.IsMono)
+                    if ((target is Type && ((Type)target).GetTypeInfo().IsPublic))
                     {
-                        //Mono only works if InvokeSpecialName is set and .net only works if it isn't
-                        if (Util.IsMono)
-                            tStaticFlag |= CSharpBinderFlags.InvokeSpecialName;
-
                         tBinder = () => Binder.InvokeMember(tStaticFlag, "get_" + name,
                                                             null,
                                                             context,
@@ -515,8 +511,6 @@

                     tBinder = () =>{
                                     var tStaticFlag = CSharpBinderFlags.ResultDiscarded;
-                                    if (Util.IsMono) //Mono only works if InvokeSpecialName is set and .net only works if it isn't
-                                        tStaticFlag |= CSharpBinderFlags.InvokeSpecialName;

                                       return Binder.InvokeMember(tStaticFlag, "set_" + name,
                                                           null,


PlayStation 4 trophies now seem to include the Platinum points in the total points.

--- PsnWrapper/UserDataCompiler.cs
+++ PsnWrapper/UserDataCompiler.cs
@@ -190,7 +190,8 @@
 							userGame.OrderPlayed = orderPlayed++;
 							userGame.LastUpdated = apiGame.Updated;
 							userGame.TotalPoints = int.Parse(gameDetails.Element("TotalPoints").Value);
-							userGame.EarnedPoints = userGame.CalculateEarnedPoints();
+							// It appears that PS4 games now include platinums in the total points count. Should probably just overwrite this for all platforms.
+							userGame.EarnedPoints = userGame.CalculateEarnedPoints(apiGame.Platform.ToLower() == "ps4");
 							userGame.Progress = userGame.CalculateProgress().ToString();
 							userGame.Platform = apiGame.Platform;


ComparerEx documentation comments

ComparerEx documentation comments

--- Framework.Core/System/Collections/Generic/ComparerEx.cs
+++ Framework.Core/System/Collections/Generic/ComparerEx.cs
@@ -8,14 +8,25 @@

 namespace System.Collections.Generic
 {
+    /// <summary>
+    /// Defines the <see cref="ComparerEx" />
+    /// </summary>
     public static class ComparerEx
     {
+        /// <summary>
+        /// Creates a comparer by using the specified comparison.
+        /// </summary>
+        /// <typeparam name="T">The type of items compared.</typeparam>
+        /// <param name="comparison">The comparison<see cref="Comparison{T}"/></param>
+        /// <returns>The new <see cref="Comparer{T}"/>.</returns>
         [MethodImpl(MethodImplOptionsEx.AggressiveInlining)]
         public static Comparer<T> Create<T>(Comparison<T> comparison)
         {
 #if LESSTHAN_NET45
+
             return new CustomComparer<T>(comparison);
 #else
+
             return Comparer<T>.Create(comparison);
 #endif
         }


[ReignOfKings] Fix vanilla chat commands not working

--- Games/Unity/Oxide.Game.ReignOfKings/ReignOfKingsCore.cs
+++ Games/Unity/Oxide.Game.ReignOfKings/ReignOfKingsCore.cs
@@ -264,10 +264,9 @@
             if (Covalence.CommandSystem.HandleChatMessage(iplayer, str)) return true;

             // Is it a regular chat command?
-            if (!cmdlib.HandleChatCommand(player, cmd, args))
-                iplayer.Reply(lang.GetMessage("UnknownCommand", this, iplayer.Id), cmd);
-
-            return true;
+            if (cmdlib.HandleChatCommand(player, cmd, args)) return true;
+
+            return null;
         }

         #endregion