예제 #1
0
        public void Evaluate(int SpreadMax)
        {
            var qrot = Quaternion.RotationYawPitchRoll(
                (float)(FDefRot[0].y * Math.PI * 2),
                (float)(FDefRot[0].x * Math.PI * 2),
                (float)(FDefRot[0].z * Math.PI * 2)
                );
            var defcam = new CameraProperties(
                FTrIn[0],
                FDefTrans[0],
                qrot,
                FDefPivotDist[0],
                FDefFov[0],
                FDefNear[0],
                FDefFar[0]
                );

            if (FKeyboard.IsChanged || FMouse.IsChanged)
            {
                _mouseMan.SelectDevice(FMouse[0]);
                _keyMan.SelectDevice(FKeyboard[0]);
            }
            if (_camera == null)
            {
                _camera = new ModularCam()
                {
                    Default       = defcam,
                    Properties    = defcam,
                    RotationSpeed = FRotSpeed[0]
                };
            }
            if (_resetter == null)
            {
                _resetter = new CameraDelta();
            }

            _resetter.ResetTranslation   = FDefTrans.IsChanged || FResetAll[0];
            _resetter.ResetRotation      = FDefRot.IsChanged || FResetAll[0];
            _resetter.ResetPivotDistance = FDefPivotDist.IsChanged || FResetAll[0];
            _resetter.ResetFov           = FDefFov.IsChanged || FResetAll[0];
            _resetter.ResetNear          = FDefNear.IsChanged || FResetAll[0];
            _resetter.ResetFar           = FDefFar.IsChanged || FResetAll[0];

            _camera.InputAspect = FAspectIn[0];
            if (FRotSpeed.IsChanged || FResetAll[0])
            {
                _camera.RotationSpeed = FRotSpeed[0];
            }

            _camera.Default    = defcam;
            _camera.Properties = new CameraProperties(_camera.Properties, defcam, _resetter);

            if (FDeltas.SliceCount > 0 && FDeltas[0] != null)
            {
                if (FDeltas.Any(delta => delta.LockCursor))
                {
                    SetCursorPos(_cursorPos.X, _cursorPos.Y);
                }
                else
                {
                    GetCursorPos(out _cursorPos);
                }
                var hoverhandle  = WindowFromPoint(_cursorPos);
                var parenthandle = GetParent((IntPtr)FHandle[0]);
                for (int i = 0; i < FDeltas.SliceCount; i++)
                {
                    var delta = FDeltas[i];
                    delta.InputMouse      = _mouseMan.Devices[0];
                    delta.InputKeyboard   = _keyMan.Devices[0];
                    delta.ConnectedCamera = _camera;
                    if (FHandle[0] > 0)
                    {
                        delta.InteractUpstream =
                            FHandle[0] == hoverhandle.ToInt32() ||
                            parenthandle == hoverhandle;
                    }
                    else
                    {
                        delta.InteractUpstream = true;
                    }
                    _camera.Move(delta, FHDEHost.FrameTime - _prevFrameTime);
                }
            }
            FCameraOut[0]               = _camera;
            FViewOut[0]                 = _camera.View;
            FProjectionOut[0]           = _camera.Projection;
            FProjectionWithAspectOut[0] = _camera.ProjectionWithAspect;
            _prevFrameTime              = FHDEHost.FrameTime;
        }
예제 #2
0
 public void SetCameraDelta(CameraDelta delta)
 {
     currentCamera.SetCameraDetal(delta);
 }