Split ModelView matrix stack into View and World stacks.
Add "hallway" and "distant" mods.
This commit is contained in:
@@ -924,9 +924,12 @@ void BGAnimationLayer::Update( float fDeltaTime )
|
|||||||
|
|
||||||
void BGAnimationLayer::Draw()
|
void BGAnimationLayer::Draw()
|
||||||
{
|
{
|
||||||
float fLastFOV = DISPLAY->GetMenuPerspectiveFOV();
|
|
||||||
if( m_fFOV != -1 )
|
if( m_fFOV != -1 )
|
||||||
DISPLAY->LoadMenuPerspective( m_fFOV );
|
{
|
||||||
|
DISPLAY->CameraPushMatrix();
|
||||||
|
DISPLAY->LoadMenuPerspective( m_fFOV, CENTER_X, CENTER_Y );
|
||||||
|
}
|
||||||
|
|
||||||
if( m_bLighting )
|
if( m_bLighting )
|
||||||
{
|
{
|
||||||
DISPLAY->SetLighting( true );
|
DISPLAY->SetLighting( true );
|
||||||
@@ -942,7 +945,10 @@ void BGAnimationLayer::Draw()
|
|||||||
m_pActors[i]->Draw();
|
m_pActors[i]->Draw();
|
||||||
|
|
||||||
if( m_fFOV != -1 )
|
if( m_fFOV != -1 )
|
||||||
DISPLAY->LoadMenuPerspective( fLastFOV );
|
{
|
||||||
|
DISPLAY->CameraPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
if( m_bLighting )
|
if( m_bLighting )
|
||||||
{
|
{
|
||||||
DISPLAY->SetLightOff( 0 );
|
DISPLAY->SetLightOff( 0 );
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ void DancingCharacters::Update( float fDelta )
|
|||||||
|
|
||||||
void DancingCharacters::DrawPrimitives()
|
void DancingCharacters::DrawPrimitives()
|
||||||
{
|
{
|
||||||
DISPLAY->EnterPerspective( 45, false );
|
DISPLAY->CameraPushMatrix();
|
||||||
|
|
||||||
float fPercentIntoSweep;
|
float fPercentIntoSweep;
|
||||||
if(m_fThisCameraStartBeat == m_fThisCameraEndBeat)
|
if(m_fThisCameraStartBeat == m_fThisCameraEndBeat)
|
||||||
@@ -200,7 +200,7 @@ void DancingCharacters::DrawPrimitives()
|
|||||||
|
|
||||||
RageVector3 m_LookAt( 0, m_fLookAtHeight, 0 );
|
RageVector3 m_LookAt( 0, m_fLookAtHeight, 0 );
|
||||||
|
|
||||||
DISPLAY->LookAt(
|
DISPLAY->LoadLookAt( 45,
|
||||||
m_CameraPoint,
|
m_CameraPoint,
|
||||||
m_LookAt,
|
m_LookAt,
|
||||||
RageVector3(0,1,0) );
|
RageVector3(0,1,0) );
|
||||||
@@ -232,5 +232,5 @@ void DancingCharacters::DrawPrimitives()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DISPLAY->ExitPerspective();
|
DISPLAY->CameraPopMatrix();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ NoteFieldMode::NoteFieldMode()
|
|||||||
|
|
||||||
void NoteFieldMode::BeginDrawTrack(int tn)
|
void NoteFieldMode::BeginDrawTrack(int tn)
|
||||||
{
|
{
|
||||||
DISPLAY->PushMatrix();
|
DISPLAY->CameraPushMatrix();
|
||||||
|
|
||||||
/* It's useful to be able to use Actors like this, functioning only
|
/* It's useful to be able to use Actors like this, functioning only
|
||||||
* for a transformation. However, this is a big waste of matrix
|
* for a transformation. However, this is a big waste of matrix
|
||||||
@@ -36,7 +36,7 @@ void NoteFieldMode::BeginDrawTrack(int tn)
|
|||||||
m_CenterTrack[tn].BeginDraw();
|
m_CenterTrack[tn].BeginDraw();
|
||||||
|
|
||||||
if(m_fFov)
|
if(m_fFov)
|
||||||
DISPLAY->EnterPerspective(m_fFov, true, m_fNear, m_fFar);
|
DISPLAY->LoadMenuPerspective(m_fFov, CENTER_X, CENTER_Y);
|
||||||
|
|
||||||
m_Position.BeginDraw();
|
m_Position.BeginDraw();
|
||||||
if(tn != -1)
|
if(tn != -1)
|
||||||
@@ -49,14 +49,11 @@ void NoteFieldMode::EndDrawTrack(int tn)
|
|||||||
m_PositionTrack[tn].EndDraw();
|
m_PositionTrack[tn].EndDraw();
|
||||||
m_Position.EndDraw();
|
m_Position.EndDraw();
|
||||||
|
|
||||||
if(m_fFov)
|
|
||||||
DISPLAY->ExitPerspective();
|
|
||||||
|
|
||||||
if(tn != -1)
|
if(tn != -1)
|
||||||
m_CenterTrack[tn].EndDraw();
|
m_CenterTrack[tn].EndDraw();
|
||||||
m_Center.EndDraw();
|
m_Center.EndDraw();
|
||||||
|
|
||||||
DISPLAY->PopMatrix();
|
DISPLAY->CameraPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
|
|||||||
+11
-14
@@ -398,27 +398,24 @@ void PlayerMinus::DrawPrimitives()
|
|||||||
m_Combo.Draw();
|
m_Combo.Draw();
|
||||||
|
|
||||||
float fTilt = GAMESTATE->m_CurrentPlayerOptions[m_PlayerNumber].m_fPerspectiveTilt;
|
float fTilt = GAMESTATE->m_CurrentPlayerOptions[m_PlayerNumber].m_fPerspectiveTilt;
|
||||||
|
float fSkew = GAMESTATE->m_CurrentPlayerOptions[m_PlayerNumber].m_fSkew;
|
||||||
bool bReverse = GAMESTATE->m_CurrentPlayerOptions[m_PlayerNumber].GetReversePercentForColumn(0)>0.5;
|
bool bReverse = GAMESTATE->m_CurrentPlayerOptions[m_PlayerNumber].GetReversePercentForColumn(0)>0.5;
|
||||||
float fReverseScale = bReverse ? -1.0f : 1.0f;
|
fTilt *= bReverse ? 1.0f : -1.0f;
|
||||||
|
|
||||||
if( fTilt != 0 )
|
DISPLAY->CameraPushMatrix();
|
||||||
{
|
|
||||||
DISPLAY->EnterPerspective(45, false);
|
|
||||||
|
|
||||||
// construct view and project matrix
|
DISPLAY->LoadMenuPerspective( 45, SCALE(fSkew,0.f,1.f,this->GetX(),CENTER_X), CENTER_Y );
|
||||||
RageVector3 Up( 0.0f, 1.0f, 0.0f );
|
|
||||||
RageVector3 Eye( CENTER_X, CENTER_Y+SCALE(fTilt*fReverseScale,-1,1,-350,350), 500 );
|
|
||||||
// give a push the receptors toward the edge of the screen so they aren't so far in the middle
|
|
||||||
float fYOffset = SCALE(fTilt,-1,+1,10*fReverseScale,60*fReverseScale);
|
|
||||||
RageVector3 At( CENTER_X, CENTER_Y+fYOffset, 0 );
|
|
||||||
|
|
||||||
DISPLAY->LookAt(Eye, At, Up);
|
float fOriginalY = m_pNoteField->GetY();
|
||||||
}
|
|
||||||
|
|
||||||
|
m_pNoteField->SetY( fOriginalY + SCALE(fTilt,-1.f,+1.f,0,bReverse?+30:-40) );
|
||||||
|
m_pNoteField->SetZ( SCALE(fTilt,-1.f,+1.f,-50,+50) );
|
||||||
|
m_pNoteField->SetRotationX( SCALE(fTilt,-1.f,+1.f,-30,+30) );
|
||||||
m_pNoteField->Draw();
|
m_pNoteField->Draw();
|
||||||
|
|
||||||
if( fTilt != 0 )
|
m_pNoteField->SetY( fOriginalY );
|
||||||
DISPLAY->ExitPerspective();
|
|
||||||
|
DISPLAY->CameraPopMatrix();
|
||||||
|
|
||||||
if( GAMESTATE->m_PlayerOptions[m_PlayerNumber].m_fBlind == 0 )
|
if( GAMESTATE->m_PlayerOptions[m_PlayerNumber].m_fBlind == 0 )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ void PlayerOptions::Init()
|
|||||||
m_bTimingAssist = false;
|
m_bTimingAssist = false;
|
||||||
m_bProTiming = false;
|
m_bProTiming = false;
|
||||||
m_fPerspectiveTilt = 0;
|
m_fPerspectiveTilt = 0;
|
||||||
|
m_fSkew = 0;
|
||||||
m_sPositioning = ""; // "null"
|
m_sPositioning = ""; // "null"
|
||||||
m_sNoteSkin = "default";
|
m_sNoteSkin = "default";
|
||||||
}
|
}
|
||||||
@@ -56,6 +57,7 @@ void PlayerOptions::Approach( const PlayerOptions& other, float fDeltaSeconds )
|
|||||||
fapproach( m_fDark, other.m_fDark, fDeltaSeconds );
|
fapproach( m_fDark, other.m_fDark, fDeltaSeconds );
|
||||||
fapproach( m_fBlind, other.m_fBlind, fDeltaSeconds );
|
fapproach( m_fBlind, other.m_fBlind, fDeltaSeconds );
|
||||||
fapproach( m_fPerspectiveTilt, other.m_fPerspectiveTilt, fDeltaSeconds );
|
fapproach( m_fPerspectiveTilt, other.m_fPerspectiveTilt, fDeltaSeconds );
|
||||||
|
fapproach( m_fSkew, other.m_fSkew, fDeltaSeconds );
|
||||||
}
|
}
|
||||||
|
|
||||||
CString PlayerOptions::GetString()
|
CString PlayerOptions::GetString()
|
||||||
@@ -141,11 +143,14 @@ CString PlayerOptions::GetString()
|
|||||||
if( m_bTimingAssist ) sReturn += "TimingAssist, ";
|
if( m_bTimingAssist ) sReturn += "TimingAssist, ";
|
||||||
if( m_bProTiming ) sReturn += "ProTiming, ";
|
if( m_bProTiming ) sReturn += "ProTiming, ";
|
||||||
|
|
||||||
switch( (int)m_fPerspectiveTilt )
|
if( m_fSkew==1 && m_fPerspectiveTilt==-1 )
|
||||||
{
|
sReturn += "Incoming, ";
|
||||||
case -1: sReturn += "Incoming, "; break;
|
else if( m_fSkew==1 && m_fPerspectiveTilt==+1 )
|
||||||
case +1: sReturn += "Space, "; break;
|
sReturn += "Space, ";
|
||||||
}
|
else if( m_fSkew==0 && m_fPerspectiveTilt==-1 )
|
||||||
|
sReturn += "Hallway, ";
|
||||||
|
else if( m_fSkew==0 && m_fPerspectiveTilt==+1 )
|
||||||
|
sReturn += "Distant, ";
|
||||||
|
|
||||||
if( !m_sPositioning.empty() )
|
if( !m_sPositioning.empty() )
|
||||||
sReturn += m_sPositioning + ", ";
|
sReturn += m_sPositioning + ", ";
|
||||||
@@ -228,8 +233,10 @@ void PlayerOptions::FromString( CString sOptions )
|
|||||||
else if( sBit == "blind" ) m_fBlind = 1;
|
else if( sBit == "blind" ) m_fBlind = 1;
|
||||||
else if( sBit == "timingassist")m_bTimingAssist = true;
|
else if( sBit == "timingassist")m_bTimingAssist = true;
|
||||||
else if( sBit == "protiming") m_bProTiming = true;
|
else if( sBit == "protiming") m_bProTiming = true;
|
||||||
else if( sBit == "incoming" ) m_fPerspectiveTilt = -1;
|
else if( sBit == "incoming" ) { m_fSkew = 1; m_fPerspectiveTilt = -1; }
|
||||||
else if( sBit == "space" ) m_fPerspectiveTilt = +1;
|
else if( sBit == "space" ) { m_fSkew = 1; m_fPerspectiveTilt = +1; }
|
||||||
|
else if( sBit == "hallway" ) { m_fSkew = 0; m_fPerspectiveTilt = -1; }
|
||||||
|
else if( sBit == "distant" ) { m_fSkew = 0; m_fPerspectiveTilt = +1; }
|
||||||
else if( GAMESTATE->m_pPosition->IsValidModeForAnyStyle(sBit) )
|
else if( GAMESTATE->m_pPosition->IsValidModeForAnyStyle(sBit) )
|
||||||
m_sPositioning = sBit;
|
m_sPositioning = sBit;
|
||||||
else if( NOTESKIN->DoesNoteSkinExist(sBit) )
|
else if( NOTESKIN->DoesNoteSkinExist(sBit) )
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ struct PlayerOptions
|
|||||||
bool m_bTimingAssist;
|
bool m_bTimingAssist;
|
||||||
bool m_bProTiming;
|
bool m_bProTiming;
|
||||||
float m_fPerspectiveTilt; // -1 = near, 0 = overhead, +1 = space
|
float m_fPerspectiveTilt; // -1 = near, 0 = overhead, +1 = space
|
||||||
|
float m_fSkew; // 0 = vanish point is in center of player, 1 = vanish point is in center of screen
|
||||||
CString m_sPositioning; /* The current positioning mode, or empty to use the normal positions. */
|
CString m_sPositioning; /* The current positioning mode, or empty to use the normal positions. */
|
||||||
CString m_sNoteSkin;
|
CString m_sNoteSkin;
|
||||||
|
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ void RageDisplay::SetDefaultRenderStates()
|
|||||||
SetAlphaTest( true );
|
SetAlphaTest( true );
|
||||||
SetBlendMode( BLEND_NORMAL );
|
SetBlendMode( BLEND_NORMAL );
|
||||||
SetTextureFiltering( true );
|
SetTextureFiltering( true );
|
||||||
LoadMenuPerspective(0); // 0 FOV = ortho
|
LoadMenuPerspective(0, CENTER_X, CENTER_Y); // 0 FOV = ortho
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -223,8 +223,7 @@ public:
|
|||||||
LoadIdentity();
|
LoadIdentity();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pops the top of the stack, returns the current top
|
// Pops the top of the stack.
|
||||||
// *after* popping the top.
|
|
||||||
void Pop()
|
void Pop()
|
||||||
{
|
{
|
||||||
stack.pop_back();
|
stack.pop_back();
|
||||||
@@ -350,83 +349,112 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
MatrixStack g_ProjectionStack;
|
MatrixStack g_ProjectionStack;
|
||||||
MatrixStack g_ModelViewStack;
|
MatrixStack g_ViewStack;
|
||||||
|
MatrixStack g_WorldStack;
|
||||||
|
|
||||||
const RageMatrix* RageDisplay::GetProjection()
|
const RageMatrix* RageDisplay::GetProjectionTop()
|
||||||
{
|
{
|
||||||
return g_ProjectionStack.GetTop();
|
return g_ProjectionStack.GetTop();
|
||||||
}
|
}
|
||||||
|
|
||||||
const RageMatrix* RageDisplay::GetModelViewTop()
|
const RageMatrix* RageDisplay::GetViewTop()
|
||||||
{
|
{
|
||||||
return g_ModelViewStack.GetTop();
|
return g_ViewStack.GetTop();
|
||||||
|
}
|
||||||
|
|
||||||
|
const RageMatrix* RageDisplay::GetWorldTop()
|
||||||
|
{
|
||||||
|
return g_WorldStack.GetTop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RageDisplay::PushMatrix()
|
void RageDisplay::PushMatrix()
|
||||||
{
|
{
|
||||||
g_ModelViewStack.Push();
|
g_WorldStack.Push();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RageDisplay::PopMatrix()
|
void RageDisplay::PopMatrix()
|
||||||
{
|
{
|
||||||
g_ModelViewStack.Pop();
|
g_WorldStack.Pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RageDisplay::Translate( float x, float y, float z )
|
void RageDisplay::Translate( float x, float y, float z )
|
||||||
{
|
{
|
||||||
g_ModelViewStack.TranslateLocal(x, y, z);
|
g_WorldStack.TranslateLocal(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RageDisplay::TranslateWorld( float x, float y, float z )
|
void RageDisplay::TranslateWorld( float x, float y, float z )
|
||||||
{
|
{
|
||||||
g_ModelViewStack.Translate(x, y, z);
|
g_WorldStack.Translate(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RageDisplay::Scale( float x, float y, float z )
|
void RageDisplay::Scale( float x, float y, float z )
|
||||||
{
|
{
|
||||||
g_ModelViewStack.ScaleLocal(x, y, z);
|
g_WorldStack.ScaleLocal(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RageDisplay::RotateX( float deg )
|
void RageDisplay::RotateX( float deg )
|
||||||
{
|
{
|
||||||
g_ModelViewStack.RotateXLocal( deg );
|
g_WorldStack.RotateXLocal( deg );
|
||||||
}
|
}
|
||||||
|
|
||||||
void RageDisplay::RotateY( float deg )
|
void RageDisplay::RotateY( float deg )
|
||||||
{
|
{
|
||||||
g_ModelViewStack.RotateYLocal( deg );
|
g_WorldStack.RotateYLocal( deg );
|
||||||
}
|
}
|
||||||
|
|
||||||
void RageDisplay::RotateZ( float deg )
|
void RageDisplay::RotateZ( float deg )
|
||||||
{
|
{
|
||||||
g_ModelViewStack.RotateZLocal( deg );
|
g_WorldStack.RotateZLocal( deg );
|
||||||
}
|
}
|
||||||
|
|
||||||
void RageDisplay::PostMultMatrix( const RageMatrix &m )
|
void RageDisplay::PostMultMatrix( const RageMatrix &m )
|
||||||
{
|
{
|
||||||
g_ModelViewStack.MultMatrix( m );
|
g_WorldStack.MultMatrix( m );
|
||||||
}
|
}
|
||||||
|
|
||||||
void RageDisplay::PreMultMatrix( const RageMatrix &m )
|
void RageDisplay::PreMultMatrix( const RageMatrix &m )
|
||||||
{
|
{
|
||||||
g_ModelViewStack.MultMatrixLocal( m );
|
g_WorldStack.MultMatrixLocal( m );
|
||||||
}
|
}
|
||||||
|
|
||||||
void RageDisplay::LoadIdentity()
|
void RageDisplay::LoadIdentity()
|
||||||
{
|
{
|
||||||
g_ModelViewStack.LoadIdentity();
|
g_WorldStack.LoadIdentity();
|
||||||
}
|
}
|
||||||
|
|
||||||
float g_fLastMenuPerspectiveFOV = -1;
|
/*
|
||||||
float RageDisplay::GetMenuPerspectiveFOV()
|
void RageDisplay::LoadPerspectiveOffCenter(
|
||||||
|
float fovDegrees,
|
||||||
|
float fCenterX,
|
||||||
|
float fCenterY )
|
||||||
{
|
{
|
||||||
return g_fLastMenuPerspectiveFOV;
|
CLAMP( fovDegrees, 0.1f, 179.9f );
|
||||||
|
float fovRadians = fovDegrees / 180.f * PI;
|
||||||
|
float theta = fovRadians/2;
|
||||||
|
float fDistCameraFromImage = SCREEN_WIDTH/2 / tanf( theta );
|
||||||
|
|
||||||
|
// It's the caller's responsibility to push first.
|
||||||
|
g_ProjectionStack.LoadMatrix(
|
||||||
|
GetFrustrumMatrix(
|
||||||
|
(-fCenterX)/fDistCameraFromImage,
|
||||||
|
(-fCenterX+SCREEN_WIDTH)/fDistCameraFromImage,
|
||||||
|
(-fCenterY+SCREEN_HEIGHT)/fDistCameraFromImage,
|
||||||
|
(-fCenterY)/fDistCameraFromImage,
|
||||||
|
1,
|
||||||
|
fDistCameraFromImage+1000 ) );
|
||||||
|
|
||||||
|
// g_ProjectionStack.TranslateLocal( -fCenterX, -fCenterY, 0 );
|
||||||
|
|
||||||
|
g_WorldStack.LoadMatrix(
|
||||||
|
RageLookAt(
|
||||||
|
0, 0, fDistCameraFromImage,
|
||||||
|
0, 0, 0,
|
||||||
|
0.0f, 1.0f, 0.0f) );
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void RageDisplay::LoadMenuPerspective(float fovDegrees)
|
void RageDisplay::LoadMenuPerspective( float fovDegrees, float fVanishPointX, float fVanishPointY )
|
||||||
{
|
{
|
||||||
g_fLastMenuPerspectiveFOV = fovDegrees;
|
|
||||||
|
|
||||||
/* fovDegrees == 0 looks the same as an ortho projection. However,
|
/* fovDegrees == 0 looks the same as an ortho projection. However,
|
||||||
* we don't want to mess with the ModelView stack because
|
* we don't want to mess with the ModelView stack because
|
||||||
* EnterPerspectiveMode's preserve location feature expectes there
|
* EnterPerspectiveMode's preserve location feature expectes there
|
||||||
@@ -438,7 +466,7 @@ void RageDisplay::LoadMenuPerspective(float fovDegrees)
|
|||||||
{
|
{
|
||||||
float left = 0, right = SCREEN_WIDTH, bottom = SCREEN_HEIGHT, top = 0;
|
float left = 0, right = SCREEN_WIDTH, bottom = SCREEN_HEIGHT, top = 0;
|
||||||
g_ProjectionStack.LoadMatrix( GetOrthoMatrix(left, right, bottom, top, SCREEN_NEAR, SCREEN_FAR) );
|
g_ProjectionStack.LoadMatrix( GetOrthoMatrix(left, right, bottom, top, SCREEN_NEAR, SCREEN_FAR) );
|
||||||
g_ModelViewStack.LoadIdentity();
|
g_ViewStack.LoadIdentity();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -447,20 +475,27 @@ void RageDisplay::LoadMenuPerspective(float fovDegrees)
|
|||||||
float theta = fovRadians/2;
|
float theta = fovRadians/2;
|
||||||
float fDistCameraFromImage = SCREEN_WIDTH/2 / tanf( theta );
|
float fDistCameraFromImage = SCREEN_WIDTH/2 / tanf( theta );
|
||||||
|
|
||||||
|
fVanishPointX = SCALE( fVanishPointX, SCREEN_LEFT, SCREEN_RIGHT, SCREEN_RIGHT, SCREEN_LEFT );
|
||||||
|
fVanishPointY = SCALE( fVanishPointY, SCREEN_TOP, SCREEN_BOTTOM, SCREEN_BOTTOM, SCREEN_TOP );
|
||||||
|
|
||||||
|
fVanishPointX -= CENTER_X;
|
||||||
|
fVanishPointY -= CENTER_Y;
|
||||||
|
|
||||||
|
|
||||||
/* It's the caller's responsibility to push first. */
|
/* It's the caller's responsibility to push first. */
|
||||||
g_ProjectionStack.LoadMatrix(
|
g_ProjectionStack.LoadMatrix(
|
||||||
GetFrustrumMatrix(
|
GetFrustrumMatrix(
|
||||||
-(SCREEN_WIDTH/2)/fDistCameraFromImage,
|
(fVanishPointX-SCREEN_WIDTH/2)/fDistCameraFromImage,
|
||||||
+(SCREEN_WIDTH/2)/fDistCameraFromImage,
|
(fVanishPointX+SCREEN_WIDTH/2)/fDistCameraFromImage,
|
||||||
+(SCREEN_HEIGHT/2)/fDistCameraFromImage,
|
(fVanishPointY+SCREEN_HEIGHT/2)/fDistCameraFromImage,
|
||||||
-(SCREEN_HEIGHT/2)/fDistCameraFromImage,
|
(fVanishPointY-SCREEN_HEIGHT/2)/fDistCameraFromImage,
|
||||||
1,
|
1,
|
||||||
fDistCameraFromImage+1000 ) );
|
fDistCameraFromImage+1000 ) );
|
||||||
|
|
||||||
g_ModelViewStack.MultMatrixLocal(
|
g_ViewStack.LoadMatrix(
|
||||||
RageLookAt(
|
RageLookAt(
|
||||||
CENTER_X, CENTER_Y, fDistCameraFromImage,
|
-fVanishPointX+CENTER_X, -fVanishPointY+CENTER_Y, fDistCameraFromImage,
|
||||||
CENTER_X, CENTER_Y, 0,
|
-fVanishPointX+CENTER_X, -fVanishPointY+CENTER_Y, 0,
|
||||||
0.0f, 1.0f, 0.0f) );
|
0.0f, 1.0f, 0.0f) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -483,19 +518,20 @@ void RageDisplay::LoadMenuPerspective(float fovDegrees)
|
|||||||
* When finished, the current position will be the "viewpoint" (at 0,0). negative
|
* When finished, the current position will be the "viewpoint" (at 0,0). negative
|
||||||
* Z goes into the screen, positive X and Y is right and down.
|
* Z goes into the screen, positive X and Y is right and down.
|
||||||
*/
|
*/
|
||||||
void RageDisplay::EnterPerspective(float fov, bool preserve_loc, float near_clip, float far_clip)
|
//void RageDisplay::EnterPerspective(float fov, bool preserve_loc, float near_clip, float far_clip)
|
||||||
{
|
//{
|
||||||
g_ProjectionStack.Push();
|
// g_ProjectionStack.Push();
|
||||||
g_ModelViewStack.Push();
|
// g_WorldStack.Push();
|
||||||
|
//
|
||||||
float aspect = SCREEN_WIDTH/(float)SCREEN_HEIGHT;
|
// float aspect = SCREEN_WIDTH/(float)SCREEN_HEIGHT;
|
||||||
g_ProjectionStack.LoadMatrix( GetPerspectiveMatrix(fov, aspect, near_clip, far_clip) );
|
// g_ProjectionStack.LoadMatrix( GetPerspectiveMatrix(fov, aspect, near_clip, far_clip) );
|
||||||
/* Flip the Y coordinate, so positive numbers go down. */
|
// /* Flip the Y coordinate, so positive numbers go down. */
|
||||||
g_ProjectionStack.Scale(1, -1, 1);
|
// g_ProjectionStack.Scale(1, -1, 1);
|
||||||
|
//
|
||||||
if( preserve_loc )
|
// if( preserve_loc )
|
||||||
{
|
// {
|
||||||
//RageMatrix matTop = *g_ModelViewStack.GetTop();
|
//
|
||||||
|
//RageMatrix matTop = *g_WorldStack.GetTop();
|
||||||
/* TODO: Come up with a more general way to handle this.
|
/* TODO: Come up with a more general way to handle this.
|
||||||
* It looks kind of hacky. -Chris */
|
* It looks kind of hacky. -Chris */
|
||||||
// {
|
// {
|
||||||
@@ -530,21 +566,32 @@ void RageDisplay::EnterPerspective(float fov, bool preserve_loc, float near_clip
|
|||||||
// /* Reset the matrix back to identity. */
|
// /* Reset the matrix back to identity. */
|
||||||
// glMatrixMode( GL_MODELVIEW );
|
// glMatrixMode( GL_MODELVIEW );
|
||||||
// glLoadIdentity();
|
// glLoadIdentity();
|
||||||
}
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
void RageDisplay::CameraPushMatrix()
|
||||||
|
{
|
||||||
|
g_ProjectionStack.Push();
|
||||||
|
g_ViewStack.Push();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RageDisplay::ExitPerspective()
|
void RageDisplay::CameraPopMatrix()
|
||||||
{
|
{
|
||||||
g_ProjectionStack.Pop();
|
g_ProjectionStack.Pop();
|
||||||
g_ModelViewStack.Pop();
|
g_ViewStack.Pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* gluLookAt. The result is pre-multiplied to the matrix (M = L * M) instead of
|
/* gluLookAt. The result is pre-multiplied to the matrix (M = L * M) instead of
|
||||||
* post-multiplied. */
|
* post-multiplied. */
|
||||||
void RageDisplay::LookAt(const RageVector3 &Eye, const RageVector3 &At, const RageVector3 &Up)
|
void RageDisplay::LoadLookAt(float fov, const RageVector3 &Eye, const RageVector3 &At, const RageVector3 &Up)
|
||||||
{
|
{
|
||||||
PreMultMatrix(RageLookAt(Eye.x, Eye.y, Eye.z, At.x, At.y, At.z, Up.x, Up.y, Up.z));
|
float aspect = SCREEN_WIDTH/(float)SCREEN_HEIGHT;
|
||||||
|
g_ProjectionStack.LoadMatrix( GetPerspectiveMatrix(fov, aspect, 1, 1000) );
|
||||||
|
/* Flip the Y coordinate, so positive numbers go down. */
|
||||||
|
g_ProjectionStack.Scale(1, -1, 1);
|
||||||
|
|
||||||
|
g_ViewStack.LoadMatrix(RageLookAt(Eye.x, Eye.y, Eye.z, At.x, At.y, At.z, Up.x, Up.y, Up.z));
|
||||||
}
|
}
|
||||||
|
|
||||||
RageMatrix RageDisplay::GetFrustrumMatrix(
|
RageMatrix RageDisplay::GetFrustrumMatrix(
|
||||||
|
|||||||
+17
-12
@@ -219,6 +219,7 @@ public:
|
|||||||
void ProcessStatsOnFlip();
|
void ProcessStatsOnFlip();
|
||||||
void StatsAddVerts( int iNumVertsRendered );
|
void StatsAddVerts( int iNumVertsRendered );
|
||||||
|
|
||||||
|
/* World matrix stack functions. */
|
||||||
void PushMatrix();
|
void PushMatrix();
|
||||||
void PopMatrix();
|
void PopMatrix();
|
||||||
void Translate( float x, float y, float z );
|
void Translate( float x, float y, float z );
|
||||||
@@ -231,13 +232,17 @@ public:
|
|||||||
void PostMultMatrix( const RageMatrix &f );
|
void PostMultMatrix( const RageMatrix &f );
|
||||||
void PreMultMatrix( const RageMatrix &f );
|
void PreMultMatrix( const RageMatrix &f );
|
||||||
void LoadIdentity();
|
void LoadIdentity();
|
||||||
float GetMenuPerspectiveFOV();
|
|
||||||
void LoadMenuPerspective(float fovDegrees);
|
|
||||||
void EnterPerspective(float fov, bool preserve_loc = true, float znear = 1, float zfar = 1000);
|
|
||||||
void ExitPerspective();
|
|
||||||
void LookAt(const RageVector3 &Eye, const RageVector3 &At, const RageVector3 &Up);
|
|
||||||
|
|
||||||
virtual RageMatrix GetOrthoMatrix( float l, float r, float b, float t, float zn, float zf ) = 0;
|
/* Projection and View matrix stack functions. */
|
||||||
|
void CameraPushMatrix();
|
||||||
|
void CameraPopMatrix();
|
||||||
|
void LoadMenuPerspective( float fovDegrees, float fVanishPointX, float fVanishPointY );
|
||||||
|
void LoadLookAt( float fov, const RageVector3 &Eye, const RageVector3 &At, const RageVector3 &Up );
|
||||||
|
|
||||||
|
SDL_Surface *CreateSurfaceFromPixfmt( PixelFormat pixfmt, void *pixels, int width, int height, int pitch );
|
||||||
|
PixelFormat FindPixelFormat( int bpp, int Rmask, int Gmask, int Bmask, int Amask );
|
||||||
|
|
||||||
|
protected:
|
||||||
RageMatrix GetFrustrumMatrix(
|
RageMatrix GetFrustrumMatrix(
|
||||||
float left,
|
float left,
|
||||||
float right,
|
float right,
|
||||||
@@ -247,13 +252,13 @@ public:
|
|||||||
float zfar );
|
float zfar );
|
||||||
RageMatrix GetPerspectiveMatrix(float fovy, float aspect, float zNear, float zFar);
|
RageMatrix GetPerspectiveMatrix(float fovy, float aspect, float zNear, float zFar);
|
||||||
|
|
||||||
SDL_Surface *CreateSurfaceFromPixfmt( PixelFormat pixfmt, void *pixels, int width, int height, int pitch );
|
// Different for D3D and OpenGL. Not sure why they're not compatible. -Chris
|
||||||
PixelFormat FindPixelFormat( int bpp, int Rmask, int Gmask, int Bmask, int Amask );
|
virtual RageMatrix GetOrthoMatrix( float l, float r, float b, float t, float zn, float zf ) = 0;
|
||||||
|
|
||||||
protected:
|
|
||||||
const RageMatrix* GetProjection();
|
|
||||||
const RageMatrix* GetModelViewTop();
|
|
||||||
|
|
||||||
|
// Called by the RageDisplay derivitives
|
||||||
|
const RageMatrix* GetProjectionTop();
|
||||||
|
const RageMatrix* GetViewTop();
|
||||||
|
const RageMatrix* GetWorldTop();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -647,11 +647,12 @@ void RageDisplay_D3D::SaveScreenshot( CString sPath )
|
|||||||
RageDisplay::VideoModeParams RageDisplay_D3D::GetVideoModeParams() const { return g_CurrentParams; }
|
RageDisplay::VideoModeParams RageDisplay_D3D::GetVideoModeParams() const { return g_CurrentParams; }
|
||||||
|
|
||||||
#define SEND_CURRENT_MATRICES \
|
#define SEND_CURRENT_MATRICES \
|
||||||
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, (D3DMATRIX*)GetProjection() ); \
|
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, (D3DMATRIX*)GetProjectionTop() ); \
|
||||||
|
g_pd3dDevice->SetTransform( D3DTS_VIEW, (D3DMATRIX*)GetViewTop() ); \
|
||||||
RageMatrix m; \
|
RageMatrix m; \
|
||||||
/* Convert to OpenGL-style "pixel-centered" coords */ \
|
/* Convert to OpenGL-style "pixel-centered" coords */ \
|
||||||
RageMatrixTranslation( &m, -0.5f, -0.5f, 0 ); \
|
RageMatrixTranslation( &m, -0.5f, -0.5f, 0 ); \
|
||||||
RageMatrixMultiply( &m, &m, GetModelViewTop() ); \
|
RageMatrixMultiply( &m, &m, GetWorldTop() ); \
|
||||||
g_pd3dDevice->SetTransform( D3DTS_WORLD, (D3DMATRIX*)&m );
|
g_pd3dDevice->SetTransform( D3DTS_WORLD, (D3DMATRIX*)&m );
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -692,6 +692,14 @@ static void SetupVertices( const RageSpriteVertex v[], int iNumVerts )
|
|||||||
glNormalPointer(GL_FLOAT, 0, Normal);
|
glNormalPointer(GL_FLOAT, 0, Normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SEND_CURRENT_MATRICES \
|
||||||
|
glMatrixMode( GL_PROJECTION ); \
|
||||||
|
glLoadMatrixf( (const float*)GetProjectionTop() ); \
|
||||||
|
RageMatrix modelView; \
|
||||||
|
RageMatrixMultiply( &modelView, GetViewTop(), GetWorldTop() ); \
|
||||||
|
glMatrixMode( GL_MODELVIEW ); \
|
||||||
|
glLoadMatrixf( (const float*)&modelView ); \
|
||||||
|
|
||||||
static void SetupVertices( const RageModelVertex v[], int iNumVerts )
|
static void SetupVertices( const RageModelVertex v[], int iNumVerts )
|
||||||
{
|
{
|
||||||
static float *Vertex, *Texture, *Normal;
|
static float *Vertex, *Texture, *Normal;
|
||||||
@@ -737,10 +745,7 @@ void RageDisplay_OGL::DrawQuads( const RageSpriteVertex v[], int iNumVerts )
|
|||||||
if(iNumVerts == 0)
|
if(iNumVerts == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
glMatrixMode( GL_PROJECTION );
|
SEND_CURRENT_MATRICES;
|
||||||
glLoadMatrixf( (const float*)GetProjection() );
|
|
||||||
glMatrixMode( GL_MODELVIEW );
|
|
||||||
glLoadMatrixf( (const float*)GetModelViewTop() );
|
|
||||||
|
|
||||||
SetupVertices( v, iNumVerts );
|
SetupVertices( v, iNumVerts );
|
||||||
glDrawArrays( GL_QUADS, 0, iNumVerts );
|
glDrawArrays( GL_QUADS, 0, iNumVerts );
|
||||||
@@ -752,9 +757,9 @@ void RageDisplay_OGL::DrawFan( const RageSpriteVertex v[], int iNumVerts )
|
|||||||
{
|
{
|
||||||
ASSERT( iNumVerts >= 3 );
|
ASSERT( iNumVerts >= 3 );
|
||||||
glMatrixMode( GL_PROJECTION );
|
glMatrixMode( GL_PROJECTION );
|
||||||
glLoadMatrixf( (const float*)GetProjection() );
|
|
||||||
glMatrixMode( GL_MODELVIEW );
|
SEND_CURRENT_MATRICES;
|
||||||
glLoadMatrixf( (const float*)GetModelViewTop() );
|
|
||||||
SetupVertices( v, iNumVerts );
|
SetupVertices( v, iNumVerts );
|
||||||
glDrawArrays( GL_TRIANGLE_FAN, 0, iNumVerts );
|
glDrawArrays( GL_TRIANGLE_FAN, 0, iNumVerts );
|
||||||
StatsAddVerts( iNumVerts );
|
StatsAddVerts( iNumVerts );
|
||||||
@@ -763,10 +768,9 @@ void RageDisplay_OGL::DrawFan( const RageSpriteVertex v[], int iNumVerts )
|
|||||||
void RageDisplay_OGL::DrawStrip( const RageSpriteVertex v[], int iNumVerts )
|
void RageDisplay_OGL::DrawStrip( const RageSpriteVertex v[], int iNumVerts )
|
||||||
{
|
{
|
||||||
ASSERT( iNumVerts >= 3 );
|
ASSERT( iNumVerts >= 3 );
|
||||||
glMatrixMode( GL_PROJECTION );
|
|
||||||
glLoadMatrixf( (const float*)GetProjection() );
|
SEND_CURRENT_MATRICES;
|
||||||
glMatrixMode( GL_MODELVIEW );
|
|
||||||
glLoadMatrixf( (const float*)GetModelViewTop() );
|
|
||||||
SetupVertices( v, iNumVerts );
|
SetupVertices( v, iNumVerts );
|
||||||
glDrawArrays( GL_TRIANGLE_STRIP, 0, iNumVerts );
|
glDrawArrays( GL_TRIANGLE_STRIP, 0, iNumVerts );
|
||||||
StatsAddVerts( iNumVerts );
|
StatsAddVerts( iNumVerts );
|
||||||
@@ -777,10 +781,9 @@ void RageDisplay_OGL::DrawTriangles( const RageSpriteVertex v[], int iNumVerts )
|
|||||||
if( iNumVerts == 0 )
|
if( iNumVerts == 0 )
|
||||||
return;
|
return;
|
||||||
ASSERT( (iNumVerts%3) == 0 );
|
ASSERT( (iNumVerts%3) == 0 );
|
||||||
glMatrixMode( GL_PROJECTION );
|
|
||||||
glLoadMatrixf( (const float*)GetProjection() );
|
SEND_CURRENT_MATRICES;
|
||||||
glMatrixMode( GL_MODELVIEW );
|
|
||||||
glLoadMatrixf( (const float*)GetModelViewTop() );
|
|
||||||
SetupVertices( v, iNumVerts );
|
SetupVertices( v, iNumVerts );
|
||||||
glDrawArrays( GL_TRIANGLES, 0, iNumVerts );
|
glDrawArrays( GL_TRIANGLES, 0, iNumVerts );
|
||||||
StatsAddVerts( iNumVerts );
|
StatsAddVerts( iNumVerts );
|
||||||
@@ -791,10 +794,8 @@ void RageDisplay_OGL::DrawIndexedTriangles( const RageModelVertex v[], int iNumV
|
|||||||
if( iNumIndices == 0 )
|
if( iNumIndices == 0 )
|
||||||
return;
|
return;
|
||||||
ASSERT( (iNumIndices%3) == 0 );
|
ASSERT( (iNumIndices%3) == 0 );
|
||||||
glMatrixMode( GL_PROJECTION );
|
|
||||||
glLoadMatrixf( (const float*)GetProjection() );
|
SEND_CURRENT_MATRICES;
|
||||||
glMatrixMode( GL_MODELVIEW );
|
|
||||||
glLoadMatrixf( (const float*)GetModelViewTop() );
|
|
||||||
|
|
||||||
SetupVertices( v, iNumVerts );
|
SetupVertices( v, iNumVerts );
|
||||||
// glInterleavedArrays( RageSpriteVertexFormat, sizeof(RageSpriteVertex), v );
|
// glInterleavedArrays( RageSpriteVertexFormat, sizeof(RageSpriteVertex), v );
|
||||||
@@ -812,10 +813,7 @@ void RageDisplay_OGL::DrawLineStrip( const RageSpriteVertex v[], int iNumVerts,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
glMatrixMode( GL_PROJECTION );
|
SEND_CURRENT_MATRICES;
|
||||||
glLoadMatrixf( (const float*)GetProjection() );
|
|
||||||
glMatrixMode( GL_MODELVIEW );
|
|
||||||
glLoadMatrixf( (const float*)GetModelViewTop() );
|
|
||||||
|
|
||||||
/* Draw a nice AA'd line loop. One problem with this is that point and line
|
/* Draw a nice AA'd line loop. One problem with this is that point and line
|
||||||
* sizes don't always precisely match, which doesn't look quite right.
|
* sizes don't always precisely match, which doesn't look quite right.
|
||||||
|
|||||||
@@ -160,6 +160,8 @@ void ScreenPlayerOptions::ImportOptions()
|
|||||||
m_OptionRow[PO_PERSPECTIVE].choices.push_back( "INCOMING" );
|
m_OptionRow[PO_PERSPECTIVE].choices.push_back( "INCOMING" );
|
||||||
m_OptionRow[PO_PERSPECTIVE].choices.push_back( "OVERHEAD" );
|
m_OptionRow[PO_PERSPECTIVE].choices.push_back( "OVERHEAD" );
|
||||||
m_OptionRow[PO_PERSPECTIVE].choices.push_back( "SPACE" );
|
m_OptionRow[PO_PERSPECTIVE].choices.push_back( "SPACE" );
|
||||||
|
m_OptionRow[PO_PERSPECTIVE].choices.push_back( "HALLWAY" );
|
||||||
|
m_OptionRow[PO_PERSPECTIVE].choices.push_back( "DISTANT" );
|
||||||
|
|
||||||
CStringArray arrayPosNames;
|
CStringArray arrayPosNames;
|
||||||
GAMESTATE->m_pPosition->GetNamesForCurrentGame(arrayPosNames);
|
GAMESTATE->m_pPosition->GetNamesForCurrentGame(arrayPosNames);
|
||||||
@@ -275,10 +277,14 @@ void ScreenPlayerOptions::ImportOptions()
|
|||||||
|
|
||||||
/* Default: */
|
/* Default: */
|
||||||
m_iSelectedOption[p][PO_PERSPECTIVE] = 1;
|
m_iSelectedOption[p][PO_PERSPECTIVE] = 1;
|
||||||
if(po.m_fPerspectiveTilt == -1)
|
if( po.m_fSkew==1 && po.m_fPerspectiveTilt==-1 )
|
||||||
m_iSelectedOption[p][PO_PERSPECTIVE] = 0;
|
m_iSelectedOption[p][PO_PERSPECTIVE] = 0;
|
||||||
else if(po.m_fPerspectiveTilt == 1)
|
else if( po.m_fSkew==1 && po.m_fPerspectiveTilt==1 )
|
||||||
m_iSelectedOption[p][PO_PERSPECTIVE] = 2;
|
m_iSelectedOption[p][PO_PERSPECTIVE] = 2;
|
||||||
|
else if( po.m_fSkew==0 && po.m_fPerspectiveTilt==-1 )
|
||||||
|
m_iSelectedOption[p][PO_PERSPECTIVE] = 3;
|
||||||
|
else if( po.m_fSkew==0 && po.m_fPerspectiveTilt==1 )
|
||||||
|
m_iSelectedOption[p][PO_PERSPECTIVE] = 4;
|
||||||
else /* po.m_fPerspectiveTilt == 0 */
|
else /* po.m_fPerspectiveTilt == 0 */
|
||||||
{
|
{
|
||||||
vector<CString> &choices = m_OptionRow[PO_PERSPECTIVE].choices;
|
vector<CString> &choices = m_OptionRow[PO_PERSPECTIVE].choices;
|
||||||
@@ -377,9 +383,13 @@ void ScreenPlayerOptions::ExportOptions()
|
|||||||
|
|
||||||
switch(m_iSelectedOption[p][PO_PERSPECTIVE])
|
switch(m_iSelectedOption[p][PO_PERSPECTIVE])
|
||||||
{
|
{
|
||||||
case 0: po.m_fPerspectiveTilt = -1; break;
|
case 0: po.m_fSkew = 1; po.m_fPerspectiveTilt = -1; break;
|
||||||
case 2: po.m_fPerspectiveTilt = 1; break;
|
case 1: po.m_fSkew = 1; po.m_fPerspectiveTilt = 0; break;
|
||||||
default:po.m_fPerspectiveTilt = 0; break;
|
case 2: po.m_fSkew = 0; po.m_fPerspectiveTilt = 1; break;
|
||||||
|
case 3: po.m_fSkew = 0; po.m_fPerspectiveTilt = -1; break;
|
||||||
|
case 4: po.m_fSkew = 0; po.m_fPerspectiveTilt = 1; break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
if(m_iSelectedOption[p][PO_PERSPECTIVE] > 2)
|
if(m_iSelectedOption[p][PO_PERSPECTIVE] > 2)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -69,4 +69,12 @@ protected:
|
|||||||
float m_fLockInputSecs;
|
float m_fLockInputSecs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Aliases
|
||||||
|
//
|
||||||
|
class ScreenSelectStyle5th : public ScreenSelectMaster
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -262,14 +262,15 @@ ScreenSelectMusic::~ScreenSelectMusic()
|
|||||||
|
|
||||||
void ScreenSelectMusic::DrawPrimitives()
|
void ScreenSelectMusic::DrawPrimitives()
|
||||||
{
|
{
|
||||||
DISPLAY->LoadMenuPerspective(FOV);
|
DISPLAY->CameraPushMatrix();
|
||||||
|
DISPLAY->LoadMenuPerspective(FOV, CENTER_X, CENTER_Y);
|
||||||
|
|
||||||
m_Menu.DrawBottomLayer();
|
m_Menu.DrawBottomLayer();
|
||||||
Screen::DrawPrimitives();
|
Screen::DrawPrimitives();
|
||||||
m_Menu.DrawTopLayer();
|
m_Menu.DrawTopLayer();
|
||||||
m_sprOptionsMessage.Draw();
|
m_sprOptionsMessage.Draw();
|
||||||
|
|
||||||
DISPLAY->LoadMenuPerspective(0);
|
DISPLAY->CameraPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenSelectMusic::TweenSongPartsOnScreen( bool Initial )
|
void ScreenSelectMusic::TweenSongPartsOnScreen( bool Initial )
|
||||||
|
|||||||
Reference in New Issue
Block a user