[Test] public void GetScreenPos() { using (DrawDevice device = new DrawDevice()) { Vector2 targetSize = new Vector2(800, 600); Vector2 viewportCenter = targetSize * 0.5f; // We'll check twice the focus distance to make sure orthographic // scaling is working as expected. device.FocusDist = DrawDevice.DefaultFocusDist * 2.0f; device.NearZ = 100; device.FarZ = 10000; device.TargetSize = targetSize; device.ViewportRect = new Rect(targetSize); device.ViewerPos = new Vector3(0, 0, -device.FocusDist); // Screen space rendering device.Projection = ProjectionMode.Screen; // 1:1 screen coordinate output in all cases Assert.AreEqual(new Vector2(0.0f, 0.0f), device.GetScreenPos(new Vector3(0.0f, 0.0f, 0.0f))); Assert.AreEqual(new Vector2(400.0f, 300.0f), device.GetScreenPos(new Vector3(400.0f, 300.0f, 0.0f))); Assert.AreEqual(new Vector2(800.0f, 600.0f), device.GetScreenPos(new Vector3(800.0f, 600.0f, 0.0f))); Assert.AreEqual(new Vector2(0.0f, 0.0f), device.GetScreenPos(new Vector3(0.0f, 0.0f, 1000.0f))); Assert.AreEqual(new Vector2(400.0f, 0.0f), device.GetScreenPos(new Vector3(400.0f, 0.0f, 1000.0f))); Assert.AreEqual(new Vector2(800.0f, 0.0f), device.GetScreenPos(new Vector3(800.0f, 0.0f, 1000.0f))); Assert.AreEqual(new Vector2(0.0f, 300.0f), device.GetScreenPos(new Vector3(0.0f, 300.0f, 1000.0f))); Assert.AreEqual(new Vector2(0.0f, 600.0f), device.GetScreenPos(new Vector3(0.0f, 600.0f, 1000.0f))); // World space rendering with orthographic projection device.Projection = ProjectionMode.Orthographic; // Scaled up 2:1 due to focus distance scaling factor Assert.AreEqual(viewportCenter, device.GetScreenPos(new Vector3(0.0f, 0.0f, 0.0f))); Assert.AreEqual(viewportCenter + new Vector2(-400.0f, -300.0f), device.GetScreenPos(new Vector3(-200.0f, -150.0f, 0.0f))); Assert.AreEqual(viewportCenter + new Vector2(400.0f, 300.0f), device.GetScreenPos(new Vector3(200.0f, 150.0f, 0.0f))); // No scale changes at other distances Assert.AreEqual(viewportCenter, device.GetScreenPos(new Vector3(0.0f, 0.0f, 1000.0f))); Assert.AreEqual(viewportCenter + new Vector2(-400.0f, 0.0f), device.GetScreenPos(new Vector3(-200.0f, 0.0f, 1000.0f))); Assert.AreEqual(viewportCenter + new Vector2(400.0f, 0.0f), device.GetScreenPos(new Vector3(200.0f, 0.0f, 1000.0f))); Assert.AreEqual(viewportCenter + new Vector2(0.0f, -300.0f), device.GetScreenPos(new Vector3(0.0f, -150.0f, 1000.0f))); Assert.AreEqual(viewportCenter + new Vector2(0.0f, 300.0f), device.GetScreenPos(new Vector3(0.0f, 150.0f, 1000.0f))); // World space rendering with perspective projection device.Projection = ProjectionMode.Perspective; // 1:1 scaling at focus distance Assert.AreEqual(viewportCenter, device.GetScreenPos(new Vector3(0.0f, 0.0f, 0.0f))); Assert.AreEqual(viewportCenter + new Vector2(-400.0f, -300.0f), device.GetScreenPos(new Vector3(-400.0f, -300.0f, 0.0f))); Assert.AreEqual(viewportCenter + new Vector2(400.0f, 300.0f), device.GetScreenPos(new Vector3(400.0f, 300.0f, 0.0f))); // Scaled down 1:2 at double the focus distance Assert.AreEqual(viewportCenter, device.GetScreenPos(new Vector3(0.0f, 0.0f, 1000.0f))); Assert.AreEqual(viewportCenter + new Vector2(-200.0f, 0.0f), device.GetScreenPos(new Vector3(-400.0f, 0.0f, 1000.0f))); Assert.AreEqual(viewportCenter + new Vector2(200.0f, 0.0f), device.GetScreenPos(new Vector3(400.0f, 0.0f, 1000.0f))); Assert.AreEqual(viewportCenter + new Vector2(0.0f, -150.0f), device.GetScreenPos(new Vector3(0.0f, -300.0f, 1000.0f))); Assert.AreEqual(viewportCenter + new Vector2(0.0f, 150.0f), device.GetScreenPos(new Vector3(0.0f, 300.0f, 1000.0f))); } }