From 17f4103123d54a5e2288a357bc20b596601e2b73 Mon Sep 17 00:00:00 2001 From: Ian Curtis Date: Fri, 26 Jul 2019 16:39:58 +0000 Subject: [PATCH] A culling node must follow immediately after a viewport. --- Src/Graphics/New3D/New3D.cpp | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/Src/Graphics/New3D/New3D.cpp b/Src/Graphics/New3D/New3D.cpp index 47ad0a4..adf9f46 100644 --- a/Src/Graphics/New3D/New3D.cpp +++ b/Src/Graphics/New3D/New3D.cpp @@ -619,16 +619,15 @@ void CNew3D::DescendNodePtr(UINT32 nodeAddr) return; } - switch ((nodeAddr >> 24) & 0xFF) // pointer type encoded in upper 8 bits + switch ((nodeAddr >> 24) & 0x5) // pointer type encoded in upper 8 bits { - case 0x00: // culling node + case 0x00: DescendCullingNode(nodeAddr & 0xFFFFFF); break; - case 0x01: // model (perhaps bit 2 is a flag in this case?) - case 0x03: + case 0x01: DrawModel(nodeAddr & 0xFFFFFF); break; - case 0x04: // pointer list + case 0x04: DescendPointerList(nodeAddr & 0xFFFFFF); break; default: @@ -907,30 +906,11 @@ void CNew3D::RenderViewport(UINT32 addr) // Set up coordinate system and base matrix InitMatrixStack(matrixBase, m_modelMat); - // Safeguard: weird coordinate system matrices usually indicate scenes that will choke the renderer - if (NULL != m_matrixBasePtr) - { - float m21, m32, m13; - - // Get the three elements that are usually set and see if their magnitudes are 1 - m21 = m_matrixBasePtr[6]; - m32 = m_matrixBasePtr[10]; - m13 = m_matrixBasePtr[5]; - - m21 *= m21; - m32 *= m32; - m13 *= m13; - - if ((m21>1.05) || (m21<0.95)) - return; - if ((m32>1.05) || (m32<0.95)) - return; - if ((m13>1.05) || (m13<0.95)) - return; + // Descend down the node link. Need to start with a culling node because that defines our culling radius. + auto childptr = vpnode[0x02]; + if (((childptr >> 24) & 0x5) == 0) { + DescendNodePtr(vpnode[0x02]); } - - // Descend down the node link: Use recursive traversal - DescendNodePtr(vpnode[0x02]); } // render next viewport