コード例 #1
0
ファイル: SandboxGame.cs プロジェクト: sllabres/penumbra
        public SandboxGame()
        {
            var deviceManager = new GraphicsDeviceManager(this);

            Content.RootDirectory = "Content";
            _penumbra             = new PenumbraComponent(this)
            {
                SpriteBatchTransformEnabled = false,
                AmbientColor = Color.Black
            };
            Components.Add(_penumbra);
            _penumbraController = new PenumbraControllerComponent(this, _penumbra);
            Components.Add(_penumbraController);
            Scenarios = new ScenariosComponent(this, _penumbra, _penumbraController);
            Components.Add(Scenarios);
            var ui = new UIComponent(this, _penumbraController)
            {
                DrawOrder = int.MaxValue
            };

            Components.Add(ui);
            _camera = new CameraMovementComponent(this);
            Components.Add(_camera);
            Components.Add(new FpsGarbageComponent(this));

            // There's a bug when trying to change resolution during window resize.
            // https://github.com/mono/MonoGame/issues/3572
            deviceManager.PreferredBackBufferWidth  = 1280;
            deviceManager.PreferredBackBufferHeight = 720;
            Window.AllowUserResizing = false;
            IsMouseVisible           = true;
        }
コード例 #2
0
ファイル: CameraZoomCommand.cs プロジェクト: GreyArmor/d3dlab
        public bool Execute(ISceneSnapshot snapshot, IContextState context)
        {
            var entity = context.GetEntityManager().GetEntity(snapshot.CurrentCameraTag);
            var state  = entity.GetComponent <OrthographicCameraComponent>().GetState();

            var delta = InputState.Delta;

            var data = new MovementData {
                End = InputState.CurrentPosition
            };

            entity.UpdateComponent(CameraMovementComponent.CreateZoom(state, data, delta, 0.001f));

            return(true);
        }
コード例 #3
0
        public bool Execute(ISceneSnapshot snapshot, IContextState context)
        {
            var p1 = InputState.ButtonsStates[GeneralMouseButtons.Left].PointV2;

            var manager = context.GetEntityManager();
            var camera  = manager.GetEntity(snapshot.CurrentCameraTag);
            var world   = manager.GetEntity(snapshot.WorldTag);

            world.UpdateComponent(CaptureTargetUnderMouseComponent.Create(p1));
            camera.AddComponent(CameraMovementComponent.ChangeRotationCenter(
                                    camera.GetComponent <OrthographicCameraComponent>().GetState(),
                                    new MovementData {
                Begin = p1
            }));

            return(true);
        }
コード例 #4
0
        public bool Execute(ISceneSnapshot snapshot, IContextState context)
        {
            var entity = context.GetEntityManager().GetEntity(snapshot.CurrentCameraTag);
            var state  = entity.GetComponent <OrthographicCameraComponent>().GetState();

            var p11  = InputState.ButtonsStates[GeneralMouseButtons.Right].PointV2;
            var p2   = InputState.CurrentPosition;
            var data = new MovementData {
                Begin = p11, End = p2
            };

            //var any = entity.GetComponents<CameraMovementComponent>();
            //if (any.Any()) {//get prev state... means manipulate is continuing
            //    state = any.Single().State;
            //}

            entity.UpdateComponent(CameraMovementComponent.CreateRotate(state, data, sensitivity));

            return(true);
        }
        public bool Execute(ISceneSnapshot snapshot, IContextState context)
        {
            var entity = context.GetEntityManager().GetEntity(snapshot.CurrentCameraTag);

            if (!entity.TryGetComponent(out OrthographicCameraComponent ccom))
            {
                return(false);
            }

            var p11  = InputState.ButtonsStates[GeneralMouseButtons.Right].PointV2;
            var p2   = InputState.CurrentPosition;
            var data = new MovementData {
                Begin = p11, End = p2
            };

            var state = ccom.GetState();

            entity.UpdateComponent(CameraMovementComponent.CreateRotate(state, data, sensitivity));

            return(true);
        }
コード例 #6
0
        public bool Execute(ISceneSnapshot snapshot, IContextState context)
        {
            var entity = context.GetEntityManager().GetEntity(snapshot.CurrentCameraTag);

            var p1 = InputState.ButtonsStates[GeneralMouseButtons.Right].PointV2;// InputState.PrevPosition;
            var p2 = InputState.CurrentPosition;

            var data = new MovementData {
                Begin = p1, End = p2
            };

            var state = entity.GetComponent <OrthographicCameraComponent>().GetState();

            if (entity.TryGetComponent <CameraMovementComponent>(out var movement))
            {
                //get prev state... means manipulate is continuing
                state = movement.State;
            }

            entity.UpdateComponent(CameraMovementComponent.CreatePan(state, data));
            return(true);
        }
コード例 #7
0
        protected virtual OrthographicCameraComponent HandleZooming(ISceneSnapshot snapshot, OrthographicCameraComponent camera, CameraMovementComponent component)
        {
            var   changed = OrthographicCameraComponent.Clone(camera);
            float delta   = component.Delta;

            var nscale = camera.Scale - (delta * component.SpeedValue);

            if (nscale > 0)
            {
                changed.Scale = nscale;
            }

            return(changed);
        }
コード例 #8
0
        protected virtual OrthographicCameraComponent HandleChangingRotateCenter(ISceneSnapshot snapshot,
                                                                                 OrthographicCameraComponent camera, ref CameraMovementComponent component)
        {
            var world = ContextState.GetEntityManager().GetEntity(snapshot.WorldTag);

            if (world.TryGetComponents(
                    out CaptureTargetUnderMouseComponent capture,
                    out CollidedWithEntityByRayComponent collided))
            {
                var changed = OrthographicCameraComponent.Clone(camera);
                changed.RotatePoint = collided.IntersectionPositionWorld;

                var begin          = snapshot.Viewport.Vector3ToScreen(changed.Position, camera.GetState(), snapshot.Surface);
                var move           = new Vector2(capture.ScreenPosition.X - begin.X, capture.ScreenPosition.Y - begin.Y);
                var PanK           = (changed.Width * changed.Scale) / snapshot.Surface.Size.Width;
                var projectionMove = new Vector2(move.X * PanK, move.Y * PanK);
                var left           = Vector3.Cross(changed.UpDirection, changed.LookDirection).Normalized();
                var up             = Vector3.Cross(changed.LookDirection, left).Normalized();
                var panVector      = left * projectionMove.X + up * projectionMove.Y;
                changed.Position += -panVector;

                world.RemoveComponents <CaptureTargetUnderMouseComponent, CollidedWithEntityByRayComponent>();

                camera = changed;
            }

            return(camera);
        }
コード例 #9
0
        protected virtual OrthographicCameraComponent HandlePanning(ISceneSnapshot snapshot, OrthographicCameraComponent camera, CameraMovementComponent component)
        {
            var state = component.State;
            var data  = component.MovementData;

            var changed = OrthographicCameraComponent.Clone(camera);

            var forward = state.LookDirection;
            var left    = Vector3.Cross(state.UpDirection, forward).Normalized();
            var up      = Vector3.Cross(forward, left).Normalized();

            var move           = new Vector2(data.End.X - data.Begin.X, data.End.Y - data.Begin.Y);
            var PanK           = (changed.Width * changed.Scale) / snapshot.Surface.Size.Width;
            var projectionMove = new Vector2(move.X * PanK, move.Y * PanK);

            var panVector = left * projectionMove.X + up * projectionMove.Y;

            changed.Position = state.Position + panVector;

            return(changed);
        }
コード例 #10
0
        protected virtual OrthographicCameraComponent HandleRotatingWithCursorReturningPosition(ISceneSnapshot snapshot, OrthographicCameraComponent camera, CameraMovementComponent component)
        {
            var state = component.State;
            var data  = component.MovementData;

            var cursorPosition = snapshot.InputSnapshot.CurrentInputState.ButtonsStates[GeneralMouseButtons.Right]
                                 .CursorPoint.ToDrawingPoint();

            var rotateAround     = camera.RotatePoint;
            var delta            = data.End - data.Begin;
            var relativeTarget   = rotateAround - state.Target;
            var relativePosition = rotateAround - state.Position;

            var cUp   = Vector3.Normalize(state.UpDirection);
            var up    = state.UpDirection;
            var dir   = Vector3.Normalize(state.LookDirection);
            var right = Vector3.Cross(dir, cUp);

            float d = -0.5f;

            d *= component.SpeedValue;

            var xangle = d * 1 * delta.X / 180 * (float)Math.PI;
            var yangle = d * delta.Y / 180 * (float)Math.PI;

            //System.Diagnostics.Trace.WriteLine($"up: {up}/{xangle}, right: {right}/{yangle}");

            var        q1 = Quaternion.CreateFromAxisAngle(up, xangle);
            var        q2 = Quaternion.CreateFromAxisAngle(right, yangle);
            Quaternion q  = q1 * q2;

            var m = Matrix4x4.CreateFromQuaternion(q);

            var newRelativeTarget   = Vector3.Transform(relativeTarget, m);
            var newRelativePosition = Vector3.Transform(relativePosition, m);

            var newTarget   = rotateAround - newRelativeTarget;
            var newPosition = rotateAround - newRelativePosition;

            var changed = OrthographicCameraComponent.Clone(camera);

            changed.UpDirection   = Vector3.TransformNormal(cUp, m);
            changed.LookDirection = (newTarget - newPosition);
            changed.Position      = newPosition;

            return(changed);
        }