From 91ad30c287dcf91c6a694cbc6cee4c0cdca8b829 Mon Sep 17 00:00:00 2001 From: Tony Wasserka Date: Mon, 24 Jun 2013 21:27:40 +0200 Subject: [PATCH] softgpu/TransformUnit: Implement remaining coordinate system transformations. --- GPU/Software/TransformUnit.cpp | 15 +++++++++++++-- GPU/Software/TransformUnit.h | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/GPU/Software/TransformUnit.cpp b/GPU/Software/TransformUnit.cpp index 6306d55bf2..e37ff5b295 100644 --- a/GPU/Software/TransformUnit.cpp +++ b/GPU/Software/TransformUnit.cpp @@ -32,18 +32,29 @@ ViewCoords TransformUnit::WorldToView(const WorldCoords& coords) ClipCoords TransformUnit::ViewToClip(const ViewCoords& coords) { - ClipCoords ret; - return ret; + Vec4 coords4(coords.x, coords.y, coords.z, 1.0f); + Mat4x4 projection_matrix(gstate.projMatrix); + return ClipCoords(projection_matrix * coords4); } ScreenCoords TransformUnit::ClipToScreen(const ClipCoords& coords) { ScreenCoords ret; + float viewport_dx = gstate.viewportx2 - gstate.viewportx1; // TODO: -1? + float viewport_dy = gstate.viewporty2 - gstate.viewporty1; // TODO: -1? + float viewport_dz = gstate.viewportz2 - gstate.viewportz1; // TODO: -1? + // TODO: Check for invalid parameters (x2 < x1, etc) + + ret.x = (coords.x * viewport_dx / coords.w + gstate.viewportx1) * 0xFFFF; + ret.y = (coords.y * viewport_dy / coords.w + gstate.viewporty1) * 0xFFFF; + ret.z = (coords.z * viewport_dz / coords.w + gstate.viewportz1) * 0xFFFF; return ret; } DrawingCoords TransformUnit::ScreenToDrawing(const ScreenCoords& coords) { DrawingCoords ret; + ret.x = (coords.x - gstate.offsetx) & 0x3ff; + ret.y = (coords.y - gstate.offsety) & 0x3ff; return ret; } diff --git a/GPU/Software/TransformUnit.h b/GPU/Software/TransformUnit.h index 403f9b983c..7e6f9ae6e7 100644 --- a/GPU/Software/TransformUnit.h +++ b/GPU/Software/TransformUnit.h @@ -35,7 +35,7 @@ struct ScreenCoords u16 z; }; -typedef Vec2 DrawingCoords; +typedef Vec2 DrawingCoords; // TODO: Keep z component? class TransformUnit {