Example #1
0
        private Vector2 ScreenFromWorld(Vector2 position, ICameraModel2D cam)
        {
            var worldFocusToPoint          = position - cam.GetWorldFocus();
            var rotatedToScreenOrientation = Utility.Geometry.RotateVectorClockwise(worldFocusToPoint, -cam.GetWorldClockwiseRotationRadsFromPositiveY());

            return(rotatedToScreenOrientation * cam.GetWorldZoom());
        }
Example #2
0
        private TransformResult WindowFromScreen(Vector2 position, ICameraModel2D cam, IViewportModel viewport)
        {
            var windowResolution      = new Vector2((float)_systemComponents.Window.Width, (float)_systemComponents.Window.Height);
            var screenSpaceCentreView = Vector2.Zero;
            var viewWidth             = windowResolution.X;
            var viewHeight            = windowResolution.Y;

            if (viewport != null)
            {
                var windowSpaceCentreView = new Vector2((float)(viewport.MinX + (0.5f * viewport.Width)), (float)(viewport.MinY + (0.5f * viewport.Height)));
                screenSpaceCentreView = new Vector2(windowSpaceCentreView.X, windowResolution.Y - windowSpaceCentreView.Y) - (0.5f * windowResolution);
                viewWidth             = viewport.Width;
                viewHeight            = viewport.Height;
            }

            var camVirtualResolution = cam.GetVirtualResolution();
            var resolutionScalar     = new Vector2(viewWidth / camVirtualResolution.X, viewHeight / camVirtualResolution.Y);

            var screenSpacePosition = screenSpaceCentreView + (position * resolutionScalar);

            var windowPosition = (0.5f * windowResolution) + new Vector2(screenSpacePosition.X, -screenSpacePosition.Y);

            var withinView = windowPosition.X >= 0.0f &&
                             windowPosition.X <= windowResolution.X && //Perhaps < preferred
                             windowPosition.Y >= 0.0f &&
                             windowPosition.Y <= windowResolution.Y;   //Perhaps < preferred

            return(new TransformResult
            {
                Contained = withinView,
                Position = windowPosition
            });
        }
Example #3
0
        private TransformResult ScreenFromWindow(Vector2 position, ICameraModel2D cam, IViewportModel viewport)
        {
            var viewPositionOriginTopLeft = position;
            var viewWidth  = (float)_systemComponents.Window.Width;
            var viewHeight = (float)_systemComponents.Window.Height;

            if (viewport != null)
            {
                viewWidth  = viewport.Width;
                viewHeight = viewport.Height;
                viewPositionOriginTopLeft -= new Vector2(viewport.MinX, viewport.MinY);
            }

            var viewPositionTransformed = new Vector2(viewPositionOriginTopLeft.X, viewHeight - viewPositionOriginTopLeft.Y);

            viewPositionTransformed -= 0.5f * new Vector2(viewWidth, viewHeight);

            var camVirtualResolution = cam.GetVirtualResolution();
            var resolutionScalar     = new Vector2(camVirtualResolution.X / viewWidth, camVirtualResolution.Y / viewHeight);

            var screenPosition = viewPositionTransformed * resolutionScalar;

            var withinView = screenPosition.X >= -0.5f * camVirtualResolution.X &&
                             screenPosition.X <= 0.5f * camVirtualResolution.X && //Perhaps < preferred
                             screenPosition.Y >= -0.5f * camVirtualResolution.Y &&
                             screenPosition.Y <= 0.5f * camVirtualResolution.Y;   //Perhaps < preferred

            return(new TransformResult
            {
                Contained = withinView,
                Position = screenPosition
            });
        }
Example #4
0
        private TransformResult WorldFromWindow(Vector2 position, ICameraModel2D camera, IViewportModel viewport)
        {
            var screen = ScreenFromWindow(position, camera, viewport);
            var world  = screen;

            world.Position = WorldFromScreen(screen.Position, camera);
            return(world);
        }
Example #5
0
        private Vector2 WorldFromScreen(Vector2 position, ICameraModel2D cam)
        {
            var up    = cam.GetWorldUp();
            var right = new Vector2(up.Y, -up.X);

            position /= cam.GetWorldZoom();
            var shiftFromFocus = (position.X * right) + (position.Y * up);

            return(cam.GetWorldFocus() + shiftFromFocus);
        }
Example #6
0
        public void Render(CommandList cl, IDrawStageModel stage, GpuSurface surface, ICameraModel2D camera)
        {
            if (cl == null || stage == null || surface == null || camera == null)
            {
                _frameworkMessenger.Report("Warning: you are feeding DrawStage Renderer null inputs, aborting");
                return;
            }

            cl.SetFramebuffer(surface.Framebuffer);
            _viewportManager.ConfigureViewportForActiveFramebuffer(cl);
            cl.SetVertexBuffer(0, stage.Buffers.VertexBuffer);
            cl.SetIndexBuffer(stage.Buffers.IndexBuffer, IndexFormat.UInt32); //Extract format and type
            cl.SetPipeline(_pipelineFactory.ReturnDrawingPipeline(stage.BlendState));
            cl.SetGraphicsResourceSet(0, camera.ResourceSet);

            //When drawing commands are queued need to check and ensure the same texture is not used for both tex inputs
            //We also need to trigger the sort somewhere earlier than this and ensure if already sorted into batches dont do it
            var batcher = stage.Batcher;

            for (var b = 0; b < batcher.NumberOfBatches; b++)
            {
                var batch = batcher.Pool[b];

                ResourceSet t0;
                if (batch.Texture0 == 0UL)
                {
                    t0 = _surfaceManager.SingleWhitePixel.ResourceSet_TexWrap;
                }
                else
                {
                    var retrieved = _surfaceManager.RetrieveSurface(batch.Texture0, new GpuSurfaceType[] { GpuSurfaceType.SwapChainOutput, GpuSurfaceType.Internal });

                    if (retrieved == surface)
                    {
                        _frameworkMessenger.Report("Warning: A draw stage is attempting to draw a surface onto itself. Aborting");
                        return;
                    }

                    t0 = retrieved == null ? _surfaceManager.SingleWhitePixel.ResourceSet_TexWrap :
                         batch.TextureMode0 == TextureCoordinateMode.Mirror ?
                         retrieved.ResourceSet_TexMirror : retrieved.ResourceSet_TexWrap;
                }
                cl.SetGraphicsResourceSet(1, t0);

                ResourceSet t1;
                if (batch.Texture1 == 0UL)
                {
                    t1 = _surfaceManager.SingleWhitePixel.ResourceSet_TexWrap;
                }
                else
                {
                    var retrieved = _surfaceManager.RetrieveSurface(batch.Texture1, new GpuSurfaceType[] { GpuSurfaceType.SwapChainOutput, GpuSurfaceType.Internal });

                    t1 = retrieved == null ? _surfaceManager.SingleWhitePixel.ResourceSet_TexWrap :
                         batch.TextureMode1 == TextureCoordinateMode.Mirror ?
                         retrieved.ResourceSet_TexMirror : retrieved.ResourceSet_TexWrap;

                    if (retrieved == surface)
                    {
                        _frameworkMessenger.Report("Warning: A draw stage is attempting to draw a surface onto itself. Aborting");
                        return;
                    }
                }
                cl.SetGraphicsResourceSet(2, t1);

                cl.DrawIndexed((uint)batch.NumIndices, 1, (uint)batch.StartIndex, 0, 0);
            }
        }
        public void Render(CommandList cl, IDistortionStageModel stage, GpuSurface source, GpuSurface target, ICameraModel2D camera)
        {
            if (cl == null || stage == null || source == null || target == null || camera == null)
            {
                _frameworkMessenger.Report("Warning: you are feeding the Distortion Stage Renderer null inputs, aborting");
                return;
            }

            _heightRenderer.Render(cl, stage, stage.HeightMapSurface, camera);
            _gradientShiftRenderer.Render(cl, stage, stage.HeightMapSurface, stage.GradientShiftSurface);
            _distortionRenderer.Render(cl, stage, source, stage.GradientShiftSurface, target);
        }
        public void Render(CommandList cl, IDistortionStageModel stage, GpuSurface target, ICameraModel2D camera)
        {
            cl.SetPipeline(_pipeline);
            cl.SetFramebuffer(target.Framebuffer);
            cl.ClearColorTarget(0, RgbaFloat.Clear);                          // HERE DIFFERENT TO STANDARD DRAW ONLY (FUTURE PULL OUT TO BASE?)
            cl.SetVertexBuffer(0, stage.Buffers.VertexBuffer);
            cl.SetIndexBuffer(stage.Buffers.IndexBuffer, IndexFormat.UInt32); //Extract format and type
            cl.SetGraphicsResourceSet(0, camera.ResourceSet);

            var batcher = stage.Batcher;

            for (var b = 0; b < batcher.NumberOfBatches; b++)
            {
                var batch = batcher.Pool[b];

                ResourceSet t0;
                if (batch.Texture0 == 0UL)
                {
                    t0 = _surfaceManager.SingleWhitePixel.ResourceSet_TexWrap;
                }
                else
                {
                    var retrieved = _surfaceManager.RetrieveSurface(batch.Texture0, new GpuSurfaceType[] { GpuSurfaceType.SwapChainOutput, GpuSurfaceType.Internal });

                    if (retrieved == target)
                    {
                        _frameworkMessenger.Report("Warning: A distortion stage is attempting to draw a surface onto itself. Aborting");
                        return;
                    }

                    t0 = retrieved == null ? _surfaceManager.SingleWhitePixel.ResourceSet_TexWrap :
                         batch.TextureMode0 == TextureCoordinateMode.Mirror ?
                         retrieved.ResourceSet_TexMirror : retrieved.ResourceSet_TexWrap;
                }
                cl.SetGraphicsResourceSet(1, t0);

                ResourceSet t1;
                if (batch.Texture1 == 0UL)
                {
                    t1 = _surfaceManager.SingleWhitePixel.ResourceSet_TexWrap;
                }
                else
                {
                    var retrieved = _surfaceManager.RetrieveSurface(batch.Texture1, new GpuSurfaceType[] { GpuSurfaceType.SwapChainOutput, GpuSurfaceType.Internal });

                    if (retrieved == target)
                    {
                        _frameworkMessenger.Report("Warning: A distortion stage is attempting to draw a surface onto itself. Aborting");
                        return;
                    }

                    t1 = retrieved == null ? _surfaceManager.SingleWhitePixel.ResourceSet_TexWrap :
                         batch.TextureMode1 == TextureCoordinateMode.Mirror ?
                         retrieved.ResourceSet_TexMirror : retrieved.ResourceSet_TexWrap;
                }
                cl.SetGraphicsResourceSet(2, t1);

                cl.DrawIndexed((uint)batch.NumIndices, 1, (uint)batch.StartIndex, 0, 0);
            }
        }
Example #9
0
        private TransformResult WindowFromWorld(Vector2 position, ICameraModel2D camera, IViewportModel viewport)
        {
            var screen = ScreenFromWorld(position, camera);

            return(WindowFromScreen(screen, camera, viewport));
        }