public void TestPerspectiveCamera() { _form.Show(); _form.ClientSize = new Size(1280, 800); _form.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width / 2 - 640, Screen.PrimaryScreen.WorkingArea.Height / 2 - 400); _form.BringToFront(); _form.WindowState = FormWindowState.Minimized; _form.WindowState = FormWindowState.Normal; var camera = _renderer.CreateCamera <Gorgon2DPerspectiveCamera>("TestCam", new RectangleF(Vector2.Zero, _form.ClientSize), 0.01f, 1000.0f); var camera2 = _renderer.CreateCamera <Gorgon2DPerspectiveCamera>("TestCam2", new RectangleF(-1, -1, 2, 2), 0.1f, 1.0f); using (var texture = _graphics.Textures.FromFile <GorgonTexture2D>("Test", @"..\..\..\..\Resources\Images\Ship.png", new GorgonCodecPNG())) { //camera.ViewDimensions = new RectangleF(0, 0, 1, 1); camera.ViewDimensions = new RectangleF(-1, -1, 2, 2); //camera.ViewDimensions = new RectangleF(-640, -400, 1280, 800); var size = new Vector2(texture.Settings.Width * (camera.ViewDimensions.Width / _screen.Settings.Width) * 12.80f, texture.Settings.Height * (camera.ViewDimensions.Height / _screen.Settings.Height) * 12.80f); var sprite = _renderer.Renderables.CreateSprite("Test", new GorgonSpriteSettings { Texture = texture, Size = size, TextureRegion = new RectangleF(Vector2.Zero, texture.ToTexel(texture.Settings.Width, texture.Settings.Height)) }); sprite.Anchor = size / 2.0f; _renderer.Camera = camera; sprite.Depth = 0.0001f; //sprite.Position = (Vector2)camera.Project(new Vector3(320, 200, sprite.Depth)); //camera.Anchor = new Vector2(_screen.Settings.Width / 2.0f, _screen.Settings.Height / 2.0f); //_screen.AfterSwapChainResized += (sender, args) => camera.Anchor = new Vector2(_screen.Settings.Width / 2.0f, _screen.Settings.Height / 2.0f); _form.MouseWheel += (sender, args) => { sprite.Depth += args.Delta / 32000.0f; }; float camDepth = 0.01f; _form.KeyPreview = true; _form.Focus(); _form.KeyPress += (sender, args) => { if (args.KeyChar == 'w') { camDepth -= 12.0f * GorgonTiming.Delta; } if (args.KeyChar == 's') { camDepth += 12.0f * GorgonTiming.Delta; } }; Gorgon.Run(_form, () => { Vector2 cursorPos = _form.PointToClient(Cursor.Position); Vector3 projectedSpace = camera.Project(new Vector3(cursorPos, 0), false); Vector3 projectedViewSpace = camera.Project(new Vector3(320, 200, 0.01f)); Vector3 unprojectedSpace = camera.Unproject(projectedSpace, false); Vector3 unprojectedViewSpace = camera.Unproject(projectedViewSpace); //_renderer.DefaultCamera.Position = cursorPos; _renderer.Clear(Color.Black); projectedSpace.X = -projectedSpace.X; projectedSpace.Y = -projectedSpace.Y; projectedSpace.Z = camDepth; _renderer.Camera = camera; sprite.Draw(); camera.Position = projectedSpace; camera2.Draw(); camera.Draw(); _renderer.DefaultCamera.Draw(); _renderer.Camera = null; _renderer.Drawing.DrawEllipse(new RectangleF(310, 190, 20, 20), Color.Firebrick, 64, new Vector2(1)); _renderer.Drawing.DrawString(_graphics.Fonts.DefaultFont, string.Format("X:{0:0.00}, Y:{1:0.00}\nU:{2:0.00}, V:{3:0.00}\nI:{4:0.00}, J:{5:0.00}\nK:{8:0.00}, L:{9:00}\nSize X:{6:0.00}, Size Y:{7:0.00}, Depth: {10:0.000}", projectedSpace.X, projectedSpace.Y, unprojectedSpace.X, unprojectedSpace.Y, projectedViewSpace.X, projectedViewSpace.Y, size.X, size.Y, unprojectedViewSpace.X, unprojectedViewSpace.Y, sprite.Depth), Vector2.Zero, Color.Yellow); _renderer.Render(); return(true); }); Assert.IsTrue(_form.TestResult == DialogResult.Yes); } }