summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Happy-yappH <Happy-yappH@users.noreply.github.com>2021-02-24 21:13:10 -0700
committer GitHub <noreply@github.com>2021-02-25 15:13:10 +1100
commitf776977ea8e64b7b3cd06f97b524678cc67b4300 (patch)
tree57973df3aa3b6358755c270c8e72fabdcd24d2cf
parent86c5beb9d9b7f5f28f01f07b37db84cee394db1f (diff)
hng64 : Improved projection matrix calculation, also improving 3D clipping. (#7810)
-rw-r--r--src/mame/video/hng64_3d.hxx30
1 files changed, 17 insertions, 13 deletions
diff --git a/src/mame/video/hng64_3d.hxx b/src/mame/video/hng64_3d.hxx
index 76d731000fe..68e5210d30c 100644
--- a/src/mame/video/hng64_3d.hxx
+++ b/src/mame/video/hng64_3d.hxx
@@ -273,12 +273,12 @@ void hng64_state::setCameraProjectionMatrix(const uint16_t* packet)
// [1] - ???? ... ? Contains a value in buriki's 'how to play' - probably a projection window/offset.
// [2] - ???? ... ? Contains a value in buriki's 'how to play' - probably a projection window/offset.
// [3] - ???? ... ? Contains a value
- // [4] - xxxx ... Camera projection near - confirmed by sams64_2
- // [5] - xxxx ... Camera projection near - confirmed by sams64_2
- // [6] - xxxx ... Camera projection near - confirmed by sams64_2
- // [7] - xxxx ... Camera projection far (?)
- // [8] - xxxx ... Camera projection far (?)
- // [9] - xxxx ... Camera projection far (?)
+ // [4] - xxxx ... Camera projection Z scale
+ // [5] - xxxx ... Camera projection near Z
+ // [6] - xxxx ... Camera projection screen Z
+ // [7] - xxxx ... Camera projection (?)
+ // [8] - xxxx ... Camera projection (?)
+ // [9] - xxxx ... Camera projection (?)
// [10] - xxxx ... Camera projection right - confirmed by sams64_2
// [11] - xxxx ... Camera projection left - confirmed by sams64_2
// [12] - xxxx ... Camera projection top - confirmed by sams64_2
@@ -288,33 +288,37 @@ void hng64_state::setCameraProjectionMatrix(const uint16_t* packet)
////////////*/
// Heisted from GLFrustum - 6 parameters...
+ // Gives the x,y extents for the projection plane at screenZ
const float left = uToF(packet[11]);
const float right = uToF(packet[10]);
const float top = uToF(packet[12]);
const float bottom = uToF(packet[13]);
- // TODO: It's unclear how the 3 values combine to make a near clipping plane
- const float near_ = uToF(packet[6]) + (uToF(packet[6]) * uToF(packet[4]));
- const float far_ = 0.9f; // uToF(packet[9]) + (uToF(packet[9]) * uToF(packet[7]));
+ // Mapping to a canonical view volume of the cube from (-1,-1,-1) to (1,1,1)
+ // near maps to z value -1, screenZ (the projection plane) maps to z value 0
+ // and far (which can be determined from near and screenZ) maps to z value of +1
+ const float screenZ = uToF(packet[6]) * uToF(packet[4]) + uToF(packet[6]);
+ const float near = uToF(packet[5]) * uToF(packet[4]) + uToF(packet[5]);
+ const float far = -(screenZ * near)/(screenZ - 2.0f*near);
- m_projectionMatrix[0] = (2.0f*near_)/(right-left);
+ m_projectionMatrix[0] = (2.0f*screenZ)/(right-left);
m_projectionMatrix[1] = 0.0f;
m_projectionMatrix[2] = 0.0f;
m_projectionMatrix[3] = 0.0f;
m_projectionMatrix[4] = 0.0f;
- m_projectionMatrix[5] = (2.0f*near_)/(top-bottom);
+ m_projectionMatrix[5] = (2.0f*screenZ)/(top-bottom);
m_projectionMatrix[6] = 0.0f;
m_projectionMatrix[7] = 0.0f;
m_projectionMatrix[8] = (right+left)/(right-left);
m_projectionMatrix[9] = (top+bottom)/(top-bottom);
- m_projectionMatrix[10] = -((far_+near_)/(far_-near_));
+ m_projectionMatrix[10] = -((far+near)/(far-near));
m_projectionMatrix[11] = -1.0f;
m_projectionMatrix[12] = 0.0f;
m_projectionMatrix[13] = 0.0f;
- m_projectionMatrix[14] = -((2.0f*far_*near_)/(far_-near_));
+ m_projectionMatrix[14] = -((2.0f*far*near)/(far-near));
m_projectionMatrix[15] = 0.0f;
}