fix centering matrix + perspective projections

This commit is contained in:
Chris Danford
2004-10-24 22:59:10 +00:00
parent a374bda82f
commit 0a6acd94ae
8 changed files with 61 additions and 42 deletions
+6 -6
View File
@@ -238,8 +238,8 @@ void PrefsManager::Init()
m_iCenterImageTranslateX = 0;
m_iCenterImageTranslateY = 0;
m_fCenterImageScaleX = 1;
m_fCenterImageScaleY = 1;
m_fCenterImageAddWidth = 0;
m_fCenterImageAddHeight = 0;
m_iAttractSoundFrequency = 1;
m_bAllowExtraStage = true;
@@ -554,8 +554,8 @@ void PrefsManager::ReadPrefsFromFile( CString sIni )
ini.GetValue( "Options", "CenterImageTranslateX", m_iCenterImageTranslateX );
ini.GetValue( "Options", "CenterImageTranslateY", m_iCenterImageTranslateY );
ini.GetValue( "Options", "CenterImageScaleX", m_fCenterImageScaleX );
ini.GetValue( "Options", "CenterImageScaleY", m_fCenterImageScaleY );
ini.GetValue( "Options", "CenterImageAddWidth", m_fCenterImageAddWidth );
ini.GetValue( "Options", "CenterImageAddHeight", m_fCenterImageAddHeight );
ini.GetValue( "Options", "AttractSoundFrequency", m_iAttractSoundFrequency );
ini.GetValue( "Options", "AllowExtraStage", m_bAllowExtraStage );
ini.GetValue( "Options", "HideDefaultNoteSkin", m_bHideDefaultNoteSkin );
@@ -789,8 +789,8 @@ void PrefsManager::SaveGlobalPrefsToDisk() const
ini.SetValue( "Options", "CenterImageTranslateX", m_iCenterImageTranslateX );
ini.SetValue( "Options", "CenterImageTranslateY", m_iCenterImageTranslateY );
ini.SetValue( "Options", "CenterImageScaleX", m_fCenterImageScaleX );
ini.SetValue( "Options", "CenterImageScaleY", m_fCenterImageScaleY );
ini.SetValue( "Options", "CenterImageAddWidth", m_fCenterImageAddWidth );
ini.SetValue( "Options", "CenterImageAddHeight", m_fCenterImageAddHeight );
ini.SetValue( "Options", "AttractSoundFrequency", m_iAttractSoundFrequency );
ini.SetValue( "Options", "AllowExtraStage", m_bAllowExtraStage );
ini.SetValue( "Options", "HideDefaultNoteSkin", m_bHideDefaultNoteSkin );
+2 -2
View File
@@ -192,8 +192,8 @@ public:
bool m_bMemoryCardsMountOnlyWhenNecessary;
int m_iCenterImageTranslateX;
int m_iCenterImageTranslateY;
float m_fCenterImageScaleX;
float m_fCenterImageScaleY;
int m_fCenterImageAddWidth;
int m_fCenterImageAddHeight;
int m_iAttractSoundFrequency; // 0 = never, 1 = every time
bool m_bAllowExtraStage;
bool m_bHideDefaultNoteSkin;
+18 -4
View File
@@ -180,7 +180,7 @@ void RageDisplay::SetDefaultRenderStates()
SetBlendMode( BLEND_NORMAL );
SetTextureFiltering( true );
LoadMenuPerspective(0, CENTER_X, CENTER_Y); // 0 FOV = ortho
ChangeCentering(0,0,1,1);
ChangeCentering(0,0,0,0);
}
@@ -632,12 +632,26 @@ RageMatrix RageDisplay::GetFrustumMatrix( float l, float r, float b, float t, fl
return m;
}
void RageDisplay::ChangeCentering( int trans_x, int trans_y, float scale_x, float scale_y )
void RageDisplay::ChangeCentering( int trans_x, int trans_y, int add_width, int add_height )
{
// in screen space, left edge = -1, right edge = 1, bottom edge = -1. top edge = 1
float fPercentShiftX = 2*trans_x/640.f;
float fPercentShiftY = -2*trans_y/480.f;
float fPercentScaleX = (640.f+add_width)/640.f;
float fPercentScaleY = (480.f+add_height)/480.f;
RageMatrix m1;
RageMatrix m2;
RageMatrixTranslation( &m1, float(trans_x), float(trans_y), 0 );
RageMatrixScaling( &m2, scale_x, scale_y, 1 );
RageMatrixTranslation(
&m1,
fPercentShiftX,
fPercentShiftY,
0 );
RageMatrixScaling(
&m2,
fPercentScaleX,
fPercentScaleY,
1 );
RageMatrixMultiply( &m_Centering, &m1, &m2 );
}
+1 -1
View File
@@ -305,7 +305,7 @@ public:
void LoadLookAt( float fov, const RageVector3 &Eye, const RageVector3 &At, const RageVector3 &Up );
/* Centering matrix */
void ChangeCentering( int trans_x, int trans_y, float scale_x, float scale_y );
void ChangeCentering( int trans_x, int trans_y, int add_width, int add_height );
RageSurface *CreateSurfaceFromPixfmt( PixelFormat pixfmt, void *pixels, int width, int height, int pitch );
PixelFormat FindPixelFormat( int bpp, int Rmask, int Gmask, int Bmask, int Amask, bool realtime=false );
+5 -4
View File
@@ -737,10 +737,11 @@ RageDisplay::VideoModeParams RageDisplay_D3D::GetVideoModeParams() const { retur
void RageDisplay_D3D::SendCurrentMatrices()
{
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, (D3DMATRIX*)GetProjectionTop() );
RageMatrix modelView;
RageMatrixMultiply( &modelView, GetCentering(), GetViewTop() );
g_pd3dDevice->SetTransform( D3DTS_VIEW, (D3DMATRIX*)&modelView );
RageMatrix projection;
RageMatrixMultiply( &projection, GetCentering(), GetProjectionTop() );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, (D3DMATRIX*)&projection );
g_pd3dDevice->SetTransform( D3DTS_VIEW, (D3DMATRIX*)GetViewTop() );
/* Convert to OpenGL-style "pixel-centered" coords */
RageMatrix m;
+8 -4
View File
@@ -836,14 +836,18 @@ static void SetupVertices( const RageSpriteVertex v[], int iNumVerts )
void RageDisplay_OGL::SendCurrentMatrices()
{
RageMatrix projection;
RageMatrixMultiply( &projection, GetCentering(), GetProjectionTop() );
glMatrixMode( GL_PROJECTION );
glLoadMatrixf( (const float*)GetProjectionTop() );
glLoadMatrixf( (const float*)&projection );
// OpenGL has just "modelView", whereas D3D has "world" and "view"
RageMatrix modelView;
RageMatrixMultiply( &modelView, GetCentering(), GetViewTop() );
RageMatrixMultiply( &modelView, &modelView, GetWorldTop() );
RageMatrixMultiply( &modelView, GetViewTop(), GetWorldTop() );
glMatrixMode( GL_MODELVIEW );
glLoadMatrixf( (const float*)&modelView );
glMatrixMode( GL_TEXTURE );
glMatrixMode( GL_TEXTURE );
glLoadMatrixf( (const float*)GetTextureTop() );
}
+17 -17
View File
@@ -52,7 +52,7 @@ void ScreenCenterImage::Input( const DeviceInput& DeviceI, const InputEventType
if( DeviceI.device == DEVICE_KEYBOARD && DeviceI.button == KEY_SPACE )
{
PREFSMAN->m_iCenterImageTranslateX = PREFSMAN->m_iCenterImageTranslateY = 0;
PREFSMAN->m_fCenterImageScaleX = PREFSMAN->m_fCenterImageScaleY = 1;
PREFSMAN->m_fCenterImageAddWidth = PREFSMAN->m_fCenterImageAddHeight = 0;
return;
}
@@ -148,29 +148,29 @@ void ScreenCenterImage::Input( const DeviceInput& DeviceI, const InputEventType
void ScreenCenterImage::Move( Axis axis, float fDelta )
{
float fValues[4] =
int *piValues[4] =
{
(float) PREFSMAN->m_iCenterImageTranslateX,
(float) PREFSMAN->m_iCenterImageTranslateY,
PREFSMAN->m_fCenterImageScaleX,
PREFSMAN->m_fCenterImageScaleY
&PREFSMAN->m_iCenterImageTranslateX,
&PREFSMAN->m_iCenterImageTranslateY,
&PREFSMAN->m_fCenterImageAddWidth,
&PREFSMAN->m_fCenterImageAddHeight
};
if( axis == AXIS_SCALE_X || axis == AXIS_SCALE_Y )
fDelta *= 0.001f;
fValues[axis] += fDelta;
PREFSMAN->m_iCenterImageTranslateX = lrintf( fValues[0] );
PREFSMAN->m_iCenterImageTranslateY = lrintf( fValues[1] );
PREFSMAN->m_fCenterImageScaleX = fValues[2];
PREFSMAN->m_fCenterImageScaleY = fValues[3];
*piValues[axis] += lrintf( fDelta );
DISPLAY->ChangeCentering(
PREFSMAN->m_iCenterImageTranslateX,
PREFSMAN->m_iCenterImageTranslateY,
PREFSMAN->m_fCenterImageScaleX,
PREFSMAN->m_fCenterImageScaleY );
PREFSMAN->m_fCenterImageAddWidth,
PREFSMAN->m_fCenterImageAddHeight );
CString sMessage =
ssprintf( "Centering: x=%d, y=%d, width=%d, height=%d",
PREFSMAN->m_iCenterImageTranslateX,
PREFSMAN->m_iCenterImageTranslateY,
PREFSMAN->m_fCenterImageAddWidth,
PREFSMAN->m_fCenterImageAddHeight );
SCREENMAN->SystemMessageNoAnimate( sMessage );
}
void ScreenCenterImage::Update( float fDeltaTime )
+4 -4
View File
@@ -128,8 +128,8 @@ void ApplyGraphicOptions()
DISPLAY->ChangeCentering(
PREFSMAN->m_iCenterImageTranslateX,
PREFSMAN->m_iCenterImageTranslateY,
PREFSMAN->m_fCenterImageScaleX,
PREFSMAN->m_fCenterImageScaleY );
PREFSMAN->m_fCenterImageAddWidth,
PREFSMAN->m_fCenterImageAddHeight );
bNeedReload |= TEXTUREMAN->SetPrefs(
RageTextureManagerPrefs(
@@ -1066,8 +1066,8 @@ int main(int argc, char* argv[])
DISPLAY->ChangeCentering(
PREFSMAN->m_iCenterImageTranslateX,
PREFSMAN->m_iCenterImageTranslateY,
PREFSMAN->m_fCenterImageScaleX,
PREFSMAN->m_fCenterImageScaleY );
PREFSMAN->m_fCenterImageAddWidth,
PREFSMAN->m_fCenterImageAddHeight );
TEXTUREMAN = new RageTextureManager();
TEXTUREMAN->SetPrefs(