private Vector2 ScreenFromWorld(Vector2 position, ICameraModel2D cam) { var worldFocusToPoint = position - cam.GetWorldFocus(); var rotatedToScreenOrientation = Utility.Geometry.RotateVectorClockwise(worldFocusToPoint, -cam.GetWorldClockwiseRotationRadsFromPositiveY()); return(rotatedToScreenOrientation * cam.GetWorldZoom()); }
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 }); }
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 }); }
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); }
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); }
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); } }
private TransformResult WindowFromWorld(Vector2 position, ICameraModel2D camera, IViewportModel viewport) { var screen = ScreenFromWorld(position, camera); return(WindowFromScreen(screen, camera, viewport)); }