private CameraTarget SelectTarget(UpdateCameraEventArgs e)
        {
            var cameraBase   = e.Camera;
            var playerCamera = cameraBase.As <PlayerCamera>();

            if (playerCamera == null)
            {
                return(null);
            }

            TESObjectREFR target    = null;
            uint          refHandle = playerCamera.TargetRefHandle;

            using (var objRef = new ObjectRefHolder(refHandle))
            {
                if (objRef.IsValid)
                {
                    target = objRef.Object;
                }
            }

            var t = CameraTarget.Create(target);

            if (t == null)
            {
                return(null);
            }

            var actor = t.Actor;
            var obj   = t.Object;

            this.LastActorWasPlayer = actor != null && actor.IsPlayer;
            this.LastTargetFormId   = obj != null ? obj.FormId : 0;

            return(t);
        }
        internal static CameraTarget Create(TESObjectREFR obj)
        {
            if (obj == null)
            {
                return(null);
            }

            TESObjectREFR originalObj   = obj;
            Actor         originalActor = obj as Actor;

            bool isMountChange = false;
            {
                var horse = obj as Actor;
                if (horse != null && horse.IsBeingRidden)
                {
                    var rider = horse.GetMountedBy();
                    if (rider != null)
                    {
                        obj           = rider;
                        isMountChange = true;
                    }
                }
            }

            var t = new CameraTarget();

            t.Object         = obj;
            t.Actor          = obj as Actor;
            t.OriginalObject = originalObj;
            t.OriginalActor  = originalActor;

            var node = t.Actor != null && t.Actor.IsPlayer ? t.Actor.GetSkeletonNode(false) : obj.Node;

            if (node == null)
            {
                return(null);
            }

            for (int i = 0; i < EyeNodeNames.Length; i++)
            {
                var name = EyeNodeNames[i];
                var n    = node.LookupNodeByName(name);
                if (n != null)
                {
                    t.HeadNode = n;
                    break;
                }
            }

            if (t.HeadNode == null)
            {
                t.HeadNode = node;
            }

            for (int i = 0; i < RootNodeNames.Length; i++)
            {
                var name = RootNodeNames[i];
                var n    = node.LookupNodeByName(name);
                if (n != null)
                {
                    t.RootNode = n;
                    break;
                }
            }

            if (t.RootNode == null)
            {
                t.RootNode = node;
            }

            t.StabilizeRootNode = t.RootNode;
            if (isMountChange && t.Actor != null && t.OriginalActor != null && !t.Actor.Equals(t.OriginalActor))
            {
                var stabilize = t.OriginalActor.IsPlayer ? t.OriginalActor.GetSkeletonNode(false) : t.OriginalActor.Node;
                if (stabilize != null)
                {
                    t.StabilizeRootNode = stabilize;
                }
            }

            return(t);
        }