Пример #1
0
        public void Update(double deltaTime)
        {
            _isEventPause = _inputManager.RightTrigger;
            _isFreeCam    = _inputManager.LeftTrigger;

            if (_eventPlayer != null && _isEventPause == false)
            {
                _eventPlayer.Update(deltaTime);
                if (_eventPlayer.IsEnd)
                {
                    FadeFromBlack(1);
                    _eventPlayer = null;
                }
            }

            foreach (var entity in _actors.Where(x => x.IsMeshLoaded && x.IsVisible))
            {
                entity.Update((float)deltaTime);
            }

            if (_isFading)
            {
                UpdateFade(deltaTime);
            }
        }
Пример #2
0
        public void Update(double deltaTime)
        {
            var isPlayingEvent = _eventPlayer != null && _isEventPause == false;

            _camera.IsEventMode = isPlayingEvent;
            _isEventPause       = _input.Pressed.R2;
            _isFreeCam          = _input.Pressed.L2;

            if (isPlayingEvent)
            {
                _eventPlayer.Update(deltaTime);
                if (_eventPlayer.IsEnd)
                {
                    FadeFromBlack(1);
                    _eventPlayer = null;
                }
            }

            IEntity playerEntity = null;

            foreach (var entity in _actors.Where(x => x.IsMeshLoaded && x.IsVisible))
            {
                if (!isPlayingEvent && !_kernel.DebugMode && entity.IsPlayer)
                {
                    playerEntity = entity;
                    PlayerManager.ProcessPlayer(_input, entity, _targetCamera.YRotation, deltaTime);
                }

                entity.Update((float)deltaTime);
            }

            if (!isPlayingEvent && !_kernel.DebugMode && playerEntity != null)
            {
                const float  RadiusSpeed = 480f;
                const double YSpeed      = Math.PI;

                var analogY   = 0f;
                var radius    = 0f;
                var yRotation = 0f;
                analogY = -_input.AxisRight.X;
                radius -= (float)(_input.AxisRight.Y * RadiusSpeed * deltaTime);

                yRotation -= (float)(YSpeed * analogY * deltaTime);

                _targetCamera.Radius = Math.Min(
                    Math.Max(_targetCamera.Radius + radius, _targetCamera.ObjectiveRadiusMin),
                    _targetCamera.ObjectiveRadiusMax);
                _targetCamera.BackYRotation += yRotation;

                _targetCamera.Update(playerEntity, deltaTime, Math.Abs(analogY) >= 0.9f);
            }

            if (_isFading)
            {
                UpdateFade(deltaTime);
            }
        }
Пример #3
0
        public void ActorSceneVisibility(float time, bool expectedActorVisibility)
        {
            const int    ActorId          = 0;
            const int    FrameActorAppear = 50;
            const string MotionPath       = "anm_ex/motion";

            var fakeField   = Substitute.For <IField>();
            var eventPlayer = new EventPlayer(fakeField, new List <Event.IEventEntry>
            {
                new Event.SetEndFrame
                {
                    EndFrame = 1000
                },
                new Event.ReadAssets
                {
                    FrameStart = -32767,
                    FrameEnd   = 0,
                    Unk06      = 0,
                    Set        = new List <Event.IEventEntry>
                    {
                        new Event.ReadActor
                        {
                            ObjectId = 123,
                            ActorId  = ActorId,
                            Name     = "main_actor"
                        },
                        new Event.ReadMotion
                        {
                            ObjectId     = 123,
                            ActorId      = ActorId,
                            Name         = MotionPath,
                            UnknownIndex = 1,
                        },
                    }
                },
                new Event.SetActor
                {
                    ObjectEntry = 123,
                    ActorId     = ActorId,
                    Name        = "main_actor"
                },
                new Event.SeqPlayAnimation
                {
                    FrameStart = FrameActorAppear,
                    FrameEnd   = 100,
                    ActorId    = ActorId,
                    Path       = MotionPath
                },
                new Event.SeqActorLeave
                {
                    Frame   = 150,
                    ActorId = ActorId
                }
            });

            bool?lastVisibility = null;

            fakeField.SetActorVisibility(Arg.Is(ActorId), Arg.Do <bool>(x => lastVisibility = x));
            eventPlayer.Initialize();
            for (var i = 0; i < time; i++)
            {
                eventPlayer.Update(1f / 30.0f);
            }

            Assert.Equal(expectedActorVisibility, lastVisibility);
        }
Пример #4
0
        public void InterpolateCameraSecondTest(float time, float eyey, float centery)
        {
            var fakeField   = Substitute.For <IField>();
            var eventPlayer = new EventPlayer(fakeField, new List <Event.IEventEntry>
            {
                new Event.SetEndFrame
                {
                    EndFrame = 300
                },
                new Event.SetupEvent(),
                new Event.SetCameraData
                {
                    CameraId    = 0,
                    PositionX   = CameraDataSingleValue(40.186035f),
                    PositionY   = CameraDataSingleValue(271.22748f),
                    PositionZ   = CameraDataSingleValue(527.7301f),
                    LookAtX     = CameraDataSingleValue(-79.38527f),
                    LookAtY     = CameraDataSingleValue(90.874115f),
                    LookAtZ     = CameraDataSingleValue(-78.414696f),
                    Roll        = CameraDataSingleValue(0f),
                    FieldOfView = CameraDataSingleValue(41.092915f),
                },
                new Event.SetCameraData
                {
                    CameraId  = 1,
                    PositionX = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(-317.25266f, Kh2.Motion.Interpolation.Linear, 0, 0f, 0f),
                        CameraDataValue(-317.25266f, Kh2.Motion.Interpolation.Linear, 3584, 0f, 0f),
                        CameraDataValue(-317.25266f, Kh2.Motion.Interpolation.Linear, 3754, 0f, 0f),
                    },
                    PositionY = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(123.61203f, Kh2.Motion.Interpolation.Hermite, 0, 0, 0),
                        CameraDataValue(185.76723f, Kh2.Motion.Interpolation.Linear, 3584, 0f, 0f),
                        CameraDataValue(185.76723f, Kh2.Motion.Interpolation.Linear, 3754, 0f, 0f),
                    },
                    PositionZ = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(-79.360405f, Kh2.Motion.Interpolation.Linear, 0, 0f, 0f),
                        CameraDataValue(-79.360405f, Kh2.Motion.Interpolation.Linear, 3584, 0f, 0f),
                        CameraDataValue(-79.360405f, Kh2.Motion.Interpolation.Linear, 3754, 0f, 0f),
                    },
                    LookAtX = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(-357.23502f, Kh2.Motion.Interpolation.Linear, 0, 0f, 0f),
                        CameraDataValue(-357.23502f, Kh2.Motion.Interpolation.Linear, 3584, 0f, 0f),
                        CameraDataValue(-357.23502f, Kh2.Motion.Interpolation.Linear, 3754, 0f, 0f),
                    },
                    LookAtY = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(122.42929f, Kh2.Motion.Interpolation.Hermite, 0, 0, 0),
                        CameraDataValue(184.58449f, Kh2.Motion.Interpolation.Linear, 3584, 0f, 0f),
                        CameraDataValue(184.58449f, Kh2.Motion.Interpolation.Linear, 3754, 0f, 0f),
                    },
                    LookAtZ = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(-217.77927f, Kh2.Motion.Interpolation.Linear, 0, 0f, 0f),
                        CameraDataValue(-217.77927f, Kh2.Motion.Interpolation.Linear, 3584, 0f, 0f),
                        CameraDataValue(-217.77927f, Kh2.Motion.Interpolation.Linear, 3754, 0f, 0f),
                    },
                    Roll = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Linear, 0, 0f, 0f),
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Linear, 3584, 0f, 0f),
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Linear, 3754, 0f, 0f),
                    },
                    FieldOfView = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(42.026005f, Kh2.Motion.Interpolation.Linear, 0, 0f, 0f),
                        CameraDataValue(42.026005f, Kh2.Motion.Interpolation.Linear, 3584, 0f, 0f),
                        CameraDataValue(42.026005f, Kh2.Motion.Interpolation.Linear, 3754, 0f, 0f),
                    },
                },
                new Event.SeqCamera
                {
                    CameraId   = 0,
                    FrameStart = 15,
                    FrameEnd   = 75,
                },
                new Event.SeqCamera
                {
                    CameraId   = 1,
                    FrameStart = 76,
                    FrameEnd   = 286,
                },
            });

            eventPlayer.Initialize();
            eventPlayer.Update(1 / 60.0 * (time + 30f));

            var setCameraCall = fakeField.ReceivedCalls().FirstOrDefault();

            Assert.NotNull(setCameraCall);

            var actualEye    = (System.Numerics.Vector3)setCameraCall.GetArguments()[0];
            var actualCenter = (System.Numerics.Vector3)setCameraCall.GetArguments()[1];
            var actualFov    = (float)setCameraCall.GetArguments()[2];
            var actualRoll   = (float)setCameraCall.GetArguments()[3];

            Assert.Equal(-317.25266f, actualEye.X, 0);
            Assert.Equal(eyey, -actualEye.Y, 0);
            Assert.Equal(79.360405f, -actualEye.Z, 0);
            Assert.Equal(-357.23502f, actualCenter.X, 0);
            Assert.Equal(centery, -actualCenter.Y, 0);
            Assert.Equal(217.77927f, -actualCenter.Z, 0);
            Assert.Equal(0f, actualRoll, 0);
            Assert.Equal(42.026005f, actualFov, 0);
        }
Пример #5
0
        public void InterpolateCameraTest(float time, float eyex, float eyey, float eyez)
        {
            var fakeField   = Substitute.For <IField>();
            var eventPlayer = new EventPlayer(fakeField, new List <Event.IEventEntry>
            {
                new Event.SetEndFrame
                {
                    EndFrame = 100
                },
                new Event.SetupEvent(),
                new Event.SetCameraData
                {
                    CameraId    = 0,
                    PositionX   = CameraDataSingleValue(-309.26492f),
                    PositionY   = CameraDataSingleValue(2446.094f),
                    PositionZ   = CameraDataSingleValue(1473.9126f),
                    LookAtX     = CameraDataSingleValue(0f),
                    LookAtY     = CameraDataSingleValue(113.279144f),
                    LookAtZ     = CameraDataSingleValue(20.983765f),
                    Roll        = CameraDataSingleValue(0f),
                    FieldOfView = CameraDataSingleValue(48.41243f),
                },
                new Event.SetCameraData
                {
                    CameraId  = 1,
                    PositionX = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(-309.26492f, Kh2.Motion.Interpolation.Hermite, 0, 0, 0),
                        CameraDataValue(411.81467f, Kh2.Motion.Interpolation.Hermite, 341, -0.6224821f, -0.6224821f),
                        CameraDataValue(-298.11935f, Kh2.Motion.Interpolation.Hermite, 648, -0.8131355f, -0.8131355f),
                        CameraDataValue(-106.03006f, Kh2.Motion.Interpolation.Linear, 819, 860.1719f, 860.1719f),
                        CameraDataValue(-106.03006f, Kh2.Motion.Interpolation.Linear, 1024, 0f, 0f),
                    },
                    PositionY = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(2446.094f, Kh2.Motion.Interpolation.Hermite, 0, 0, 0),
                        CameraDataValue(515.0501f, Kh2.Motion.Interpolation.Linear, 819, -1865.6649f, -1865.6649f),
                        CameraDataValue(515.0501f, Kh2.Motion.Interpolation.Linear, 1024, 0f, 0f),
                    },
                    PositionZ = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(1473.9126f, Kh2.Motion.Interpolation.Hermite, 0, 0, 0),
                        CameraDataValue(288.39706f, Kh2.Motion.Interpolation.Linear, 819, -1165.8065f, -1165.8065f),
                        CameraDataValue(288.39706f, Kh2.Motion.Interpolation.Linear, 1024, 0f, 0f),
                    },
                    LookAtX = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Hermite, 0, 0, 0),
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Hermite, 341, 0f, 0f),
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Hermite, 648, 0f, 0f),
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Linear, 819, 0f, 0f),
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Linear, 1024, 0f, 0f),
                    },
                    LookAtY = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(113.279144f, Kh2.Motion.Interpolation.Hermite, 0, 0, 0),
                        CameraDataValue(113.279144f, Kh2.Motion.Interpolation.Hermite, 341, 0f, 0f),
                        CameraDataValue(113.279144f, Kh2.Motion.Interpolation.Hermite, 648, 0f, 0f),
                        CameraDataValue(113.279144f, Kh2.Motion.Interpolation.Linear, 819, 0f, 0f),
                        CameraDataValue(113.279144f, Kh2.Motion.Interpolation.Linear, 1024, 0f, 0f),
                    },
                    LookAtZ = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(20.983765f, Kh2.Motion.Interpolation.Hermite, 0, 0, 0),
                        CameraDataValue(20.983765f, Kh2.Motion.Interpolation.Hermite, 341, 0f, 0f),
                        CameraDataValue(20.983765f, Kh2.Motion.Interpolation.Hermite, 648, 0f, 0f),
                        CameraDataValue(20.983765f, Kh2.Motion.Interpolation.Linear, 819, 0f, 0f),
                        CameraDataValue(20.983765f, Kh2.Motion.Interpolation.Linear, 1024, 0f, 0f),
                    },
                    Roll = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Hermite, 0, 0, 0),
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Hermite, 341, 0f, 0f),
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Hermite, 648, 0f, 0f),
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Linear, 819, 0f, 0f),
                        CameraDataValue(0f, Kh2.Motion.Interpolation.Linear, 1024, 0f, 0f),
                    },
                    FieldOfView = new List <Event.SetCameraData.CameraKeys>
                    {
                        CameraDataValue(48.41243f, Kh2.Motion.Interpolation.Hermite, 0, 0, 0),
                        CameraDataValue(48.41243f, Kh2.Motion.Interpolation.Hermite, 341, 0f, 0f),
                        CameraDataValue(48.41243f, Kh2.Motion.Interpolation.Hermite, 648, 0f, 0f),
                        CameraDataValue(48.41243f, Kh2.Motion.Interpolation.Linear, 819, 0f, 0f),
                        CameraDataValue(48.41243f, Kh2.Motion.Interpolation.Linear, 1024, 0f, 0f),
                    },
                },
                new Event.SeqCamera
                {
                    CameraId   = 0,
                    FrameStart = 0,
                    FrameEnd   = 100,
                },
                new Event.SeqCamera
                {
                    CameraId   = 1,
                    FrameStart = 1,
                    FrameEnd   = 101,
                },
            });

            eventPlayer.Initialize();
            eventPlayer.Update(1 / 60.0 * time);

            var setCameraCall = fakeField.ReceivedCalls().FirstOrDefault();

            Assert.NotNull(setCameraCall);

            var actualEye    = (System.Numerics.Vector3)setCameraCall.GetArguments()[0];
            var actualCenter = (System.Numerics.Vector3)setCameraCall.GetArguments()[1];
            var actualFov    = (float)setCameraCall.GetArguments()[2];
            var actualRoll   = (float)setCameraCall.GetArguments()[3];

            Assert.Equal(eyex, actualEye.X, 0);
            Assert.Equal(eyey, -actualEye.Y, 0);
            Assert.Equal(eyez, -actualEye.Z, 0);
            Assert.Equal(0, actualCenter.X, 0);
            Assert.Equal(-113.28f, -actualCenter.Y, 0);
            Assert.Equal(-20.98f, -actualCenter.Z, 0);
            Assert.Equal(0f, actualRoll, 0);
            Assert.Equal(48.41f, actualFov, 0);
        }