A culling node must follow immediately after a viewport.

This commit is contained in:
Ian Curtis 2019-07-26 16:39:58 +00:00
parent cc830003f5
commit 17f4103123

View file

@ -619,16 +619,15 @@ void CNew3D::DescendNodePtr(UINT32 nodeAddr)
return; 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); DescendCullingNode(nodeAddr & 0xFFFFFF);
break; break;
case 0x01: // model (perhaps bit 2 is a flag in this case?) case 0x01:
case 0x03:
DrawModel(nodeAddr & 0xFFFFFF); DrawModel(nodeAddr & 0xFFFFFF);
break; break;
case 0x04: // pointer list case 0x04:
DescendPointerList(nodeAddr & 0xFFFFFF); DescendPointerList(nodeAddr & 0xFFFFFF);
break; break;
default: default:
@ -907,30 +906,11 @@ void CNew3D::RenderViewport(UINT32 addr)
// Set up coordinate system and base matrix // Set up coordinate system and base matrix
InitMatrixStack(matrixBase, m_modelMat); InitMatrixStack(matrixBase, m_modelMat);
// Safeguard: weird coordinate system matrices usually indicate scenes that will choke the renderer // Descend down the node link. Need to start with a culling node because that defines our culling radius.
if (NULL != m_matrixBasePtr) auto childptr = vpnode[0x02];
{ if (((childptr >> 24) & 0x5) == 0) {
float m21, m32, m13; DescendNodePtr(vpnode[0x02]);
// 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: Use recursive traversal
DescendNodePtr(vpnode[0x02]);
} }
// render next viewport // render next viewport