mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2024-11-22 13:55:38 +00:00
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:
parent
f9c3b9b5f8
commit
1bce444668
|
@ -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,8 +848,20 @@ 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);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue