Brought in the near clipping plane for Step 1.5+. Objects close to camera are no longer cut-off (e.g., driver arms and steering wheels in cockpit views). Note: This change should probably be applied to Step 1.0 as well in the future. For now, I am leaving the old distance because Step 1.0 coordinates need closer investigation. Bringing in the near clipping plane extends the view frustum depth and will worsen Z-buffer accuracy. Be on the lookout for Z-fighting that did not previously exist.

This commit is contained in:
Bart Trzynadlowski 2012-02-28 04:34:32 +00:00
parent f9c3b9b5f8
commit 1bce444668

View file

@ -815,7 +815,7 @@ void CRender3D::RenderViewport(UINT32 addr, int pri)
int curPri; int curPri;
int vpX, vpY, vpWidth, vpHeight; int vpX, vpY, vpWidth, vpHeight;
int spotColorIdx; int spotColorIdx;
GLfloat vpTopAngle, vpBotAngle, fovYDegrees; GLfloat vpTopAngle, vpBotAngle, fovYDegrees, near, far;
GLfloat scrollFog, scrollAtt; GLfloat scrollFog, scrollAtt;
// Translate address and obtain pointer // Translate address and obtain pointer
@ -848,7 +848,19 @@ void CRender3D::RenderViewport(UINT32 addr, int pri)
vpTopAngle = (float) asin(*(float *)&vpnode[0x0E]); // FOV Y upper half-angle (radians) vpTopAngle = (float) asin(*(float *)&vpnode[0x0E]); // FOV Y upper half-angle (radians)
vpBotAngle = (float) asin(*(float *)&vpnode[0x12]); // FOV Y lower half-angle vpBotAngle = (float) asin(*(float *)&vpnode[0x12]); // FOV Y lower half-angle
fovYDegrees = (vpTopAngle+vpBotAngle)*(float)(180.0/3.14159265358979323846); fovYDegrees = (vpTopAngle+vpBotAngle)*(float)(180.0/3.14159265358979323846);
// TO-DO: investigate clipping planes // TO-DO: figure out how near and far planes are stored
if (step >= 0x15)
{
near = 1e-2;
far = 1e5;
}
else
{
// Move near plane out a bit on Step 1.0 to avoid issues w/ Z-fighting.
// This may be unnecessary.
near = 1e-1;
far = 1e5;
}
// Set up viewport and projection (TO-DO: near and far clipping) // Set up viewport and projection (TO-DO: near and far clipping)
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
@ -860,7 +872,8 @@ void CRender3D::RenderViewport(UINT32 addr, int pri)
viewportY = yOffs + (GLint) ((float)(384-(vpY+vpHeight))*yRatio); viewportY = yOffs + (GLint) ((float)(384-(vpY+vpHeight))*yRatio);
viewportWidth = totalXRes; viewportWidth = totalXRes;
viewportHeight = (GLint) ((float)vpHeight*yRatio); viewportHeight = (GLint) ((float)vpHeight*yRatio);
gluPerspective(fovYDegrees,(GLfloat)viewportWidth/(GLfloat)viewportHeight,0.1f,1e5); // use actual full screen ratio to get proper X FOV gluPerspective(fovYDegrees,(GLfloat)viewportWidth/(GLfloat)viewportHeight,0.01f,1e5);
//gluPerspective(fovYDegrees,(GLfloat)viewportWidth/(GLfloat)viewportHeight,0.1f,1e5); // use actual full screen ratio to get proper X FOV
//printf("viewportX=%d, viewportY=%d, viewportWidth=%d, viewportHeight=%d\tvpY=%d vpHeight=%d\n", viewportX, viewportY, viewportWidth, viewportHeight, vpY,vpHeight); //printf("viewportX=%d, viewportY=%d, viewportWidth=%d, viewportHeight=%d\tvpY=%d vpHeight=%d\n", viewportX, viewportY, viewportWidth, viewportHeight, vpY,vpHeight);
} }
else else