/// <summary>
            /// Creates a new object instance, recording the current state of the scene object header.
            /// </summary>
            /// <param name="obj">Scene object to record the state of.</param>
            /// <param name="path">
            /// Path to the field which should be focused when performing the undo/redo operation.
            /// </param>
            internal SceneObjectHeaderToRecord(SceneObject obj, string path)
            {
                this.objs = new [] { obj };
                this.path = path;

                orgStates = new [] { SceneObjectState.Create(obj) };
            }
            /// <summary>
            /// Generates the diff from the previously recorded state and the current state. If there is a difference
            /// an undo command is recorded.
            /// </summary>
            internal void RecordCommand()
            {
                if (objs == null)
                {
                    return;
                }

                List <SceneObjectHeaderUndo> headers = new List <SceneObjectHeaderUndo>();

                for (int i = 0; i < objs.Length; i++)
                {
                    SceneObject      obj      = objs[i];
                    SceneObjectState orgState = orgStates[i];

                    if (obj.IsDestroyed)
                    {
                        continue;
                    }

                    SceneObjectDiff oldToNew = SceneObjectDiff.Create(orgState, SceneObjectState.Create(obj));
                    if (oldToNew.flags == 0)
                    {
                        continue;
                    }

                    SceneObjectDiff newToOld = SceneObjectDiff.Create(SceneObjectState.Create(obj), orgState);
                    headers.Add(new SceneObjectHeaderUndo(obj, newToOld, oldToNew));
                }

                if (headers.Count > 0)
                {
                    UndoRedo.Global.RegisterCommand(new RecordSceneObjectHeaderUndo(headers, path));
                }
            }
            /// <summary>
            /// Creates a new object instance, recording the current state of the scene object header for multiple scene
            /// objects.
            /// </summary>
            /// <param name="objs">Scene objects to record the state of.</param>
            /// <param name="path">
            /// Path to the field which should be focused when performing the undo/redo operation.
            /// </param>
            internal SceneObjectHeaderToRecord(SceneObject[] objs, string path)
            {
                this.objs = objs;
                this.path = path;

                orgStates = new SceneObjectState[objs.Length];
                for (int i = 0; i < orgStates.Length; i++)
                {
                    orgStates[i] = SceneObjectState.Create(objs[i]);
                }
            }
        /// <summary>
        /// Initializes the state from a scene object.
        /// </summary>
        /// <param name="so">Scene object to initialize the state from.</param>
        /// <returns>New state object.</returns>
        internal static SceneObjectState Create(SceneObject so)
        {
            SceneObjectState state = new SceneObjectState();

            state.name     = so.Name;
            state.position = so.LocalPosition;
            state.rotation = so.LocalRotation;
            state.scale    = so.LocalScale;
            state.active   = so.Active;

            return(state);
        }
        /// <summary>
        /// Creates a diff object storing the difference between two <see cref="SceneObjectState"/> objects.
        /// </summary>
        /// <param name="oldState">State of the scene object to compare from.</param>
        /// <param name="newState">State of the scene object to compare to.</param>
        /// <returns>Difference between the two scene object states.</returns>
        internal static SceneObjectDiff Create(SceneObjectState oldState, SceneObjectState newState)
        {
            SceneObjectDiff diff = new SceneObjectDiff();

            diff.state = new SceneObjectState();

            if (oldState.name != newState.name)
            {
                diff.state.name = newState.name;
                diff.flags     |= SceneObjectDiffFlags.Name;
            }

            if (oldState.position != newState.position)
            {
                diff.state.position = newState.position;
                diff.flags         |= SceneObjectDiffFlags.Position;
            }

            if (oldState.rotation != newState.rotation)
            {
                diff.state.rotation = newState.rotation;
                diff.flags         |= SceneObjectDiffFlags.Rotation;
            }

            if (oldState.scale != newState.scale)
            {
                diff.state.scale = newState.scale;
                diff.flags      |= SceneObjectDiffFlags.Scale;
            }

            if (oldState.active != newState.active)
            {
                diff.state.active = newState.active;
                diff.flags       |= SceneObjectDiffFlags.Active;
            }

            return(diff);
        }