diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index ad67f22899..afd7a1c8eb 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -42,8 +42,7 @@ GameState::GameState() GameState::~GameState() { - for( int p=0; pSwitchNoteSkin( PlayerNumber(p), PREFSMAN->m_sDefaultNoteSkin ); - for( p=0; pUpdate(fDelta); - m_bActiveAttackEndedThisUpdate[p] = false; for( unsigned s=0; sm_Position[m_PlayerNumber]->BeginDrawTrack(c); + GAMESTATE->m_Position->BeginDrawTrack(m_PlayerNumber, c); float fX = ArrowGetXPos( m_PlayerNumber, c, 0 ); m_GhostArrowRow[c].SetX( fX ); @@ -73,7 +73,7 @@ void GhostArrowRow::DrawPrimitives() m_GhostArrowRowBright[c].Draw(); m_HoldGhostArrowRow[c].Draw(); - GAMESTATE->m_Position[m_PlayerNumber]->EndDrawTrack(c); + GAMESTATE->m_Position->EndDrawTrack(m_PlayerNumber, c); } } diff --git a/stepmania/src/GrayArrowRow.cpp b/stepmania/src/GrayArrowRow.cpp index b238127aee..cd33629728 100644 --- a/stepmania/src/GrayArrowRow.cpp +++ b/stepmania/src/GrayArrowRow.cpp @@ -59,14 +59,14 @@ void GrayArrowRow::DrawPrimitives() { for( int c=0; cm_Position[m_PlayerNumber]->BeginDrawTrack(c); + GAMESTATE->m_Position->BeginDrawTrack(m_PlayerNumber, c); // set arrow X float fX = ArrowGetXPos( m_PlayerNumber, c, 0 ); m_GrayArrow[c].SetX( fX ); m_GrayArrow[c].Draw(); - GAMESTATE->m_Position[m_PlayerNumber]->EndDrawTrack(c); + GAMESTATE->m_Position->EndDrawTrack(m_PlayerNumber, c); } } diff --git a/stepmania/src/NoteField.cpp b/stepmania/src/NoteField.cpp index a43cc59c6d..f8e7f57bf9 100644 --- a/stepmania/src/NoteField.cpp +++ b/stepmania/src/NoteField.cpp @@ -336,7 +336,7 @@ void NoteField::DrawPrimitives() for( int c=0; cm_Position[m_PlayerNumber]->BeginDrawTrack(c); + GAMESTATE->m_Position->BeginDrawTrack(m_PlayerNumber, c); ///////////////////////////////// // Draw all HoldNotes in this column (so that they appear under the tap notes) @@ -404,7 +404,7 @@ void NoteField::DrawPrimitives() m_NoteDisplay[c].DrawTap( c, NoteRowToBeat(i), bHoldNoteBeginsOnThisBeat, bIsInSelectionRange ? fSelectedRangeGlow : m_fPercentFadeToFail ); } - GAMESTATE->m_Position[m_PlayerNumber]->EndDrawTrack(c); + GAMESTATE->m_Position->EndDrawTrack(m_PlayerNumber, c); } } diff --git a/stepmania/src/NoteFieldPositioning.cpp b/stepmania/src/NoteFieldPositioning.cpp index 336521e37c..29b0f3969d 100644 --- a/stepmania/src/NoteFieldPositioning.cpp +++ b/stepmania/src/NoteFieldPositioning.cpp @@ -1,12 +1,20 @@ #include "global.h" #include "NoteFieldPositioning.h" + #include "RageDisplay.h" #include "RageDisplayInternal.h" - #include "RageUtil.h" #include "RageLog.h" #include "RageMath.h" +#include "GameState.h" +#include "GameManager.h" +#include "IniFile.h" +#include "Game.h" +#include "Style.h" +#include "GameDef.h" + + /* This is similar in style to Actor::Command. However, Actors don't store * matrix stacks; they only store offsets and scales, and compound them into * a single transformations at once. This makes some things easy, but it's not @@ -83,16 +91,7 @@ void MatrixCommand(CString sCommandString, RageMatrix &mat) } -NoteFieldPositioning::NoteFieldPositioning() -{ - Init(); -} - -NoteFieldPositioning::~NoteFieldPositioning() -{ -} - -void NoteFieldPositioning::Init() +NoteFieldPositioning::Mode::Mode() { for( int tn=0; tnm_ColumnInfo[pn][t].fXOffset; - RageMatrixTranslation(&m_Position[t], fPixelXOffsetFromCenter, 0, 0); - } - - // XXX - - FILE *f = fopen("test.dat", "r"); - if(f) for(int t = 0; t < MAX_NOTE_TRACKS; ++t) - { - char buf[1000]; - if(!fgets(buf, 1000, f)) break; - - CString b(buf); - TrimRight(b); - - RageMatrixIdentity(&m_Position[t]); - MatrixCommand(b, m_Position[t]); - - if(!fgets(buf, 1000, f)) break; - b=buf; - TrimRight(b); - - RageMatrixIdentity(&m_PerspPosition[t]); - MatrixCommand(b, m_PerspPosition[t]); - - if(!fgets(buf, 1000, f)) break; - sscanf(buf, "%f", &m_fFov[t]); - } - if( f ) - fclose(f); -// XXX - -} - -void NoteFieldPositioning::Update(float fDeltaTime) -{ -} - - -void NoteFieldPositioning::BeginDrawTrack(int tn) -{ - DISPLAY->PushMatrix(); - - glMultMatrixf((float *) m_Position[tn]); + glMultMatrixf((const float *) m_Position[tn]); if(m_fFov[tn]) DISPLAY->EnterPerspective(m_fFov[tn]); - glMultMatrixf((float *) m_PerspPosition[tn]); + glMultMatrixf((const float *) m_PerspPosition[tn]); } -void NoteFieldPositioning::EndDrawTrack(int tn) +void NoteFieldPositioning::Mode::EndDrawTrack(int tn) const { if(m_fFov[tn]) DISPLAY->ExitPerspective(); +} + + +NoteFieldPositioning::NoteFieldPositioning(CString fn) +{ + IniFile ini(fn); + if(!ini.ReadFile()) + return; + + for(IniFile::const_iterator i = ini.begin(); i != ini.end(); ++i) + { + Mode m; + + const IniFile::key &k = i->second; + for(int t = 0; t < MAX_NOTE_TRACKS; ++t) + { + IniFile::key::const_iterator val; + + val = k.find("Name"); + ASSERT(val != k.end()); /* required */ + m.name = val->second; + + val = k.find(ssprintf("Track%i", t+1)); + if(val != k.end()) + MatrixCommand(val->second, m.m_Position[t]); + val = k.find(ssprintf("PTrack%i", t+1)); + if(val != k.end()) + MatrixCommand(val->second, m.m_PerspPosition[t]); + + val = k.find(ssprintf("FOV%i", t+1)); + if(val != k.end()) + m.m_fFov[t] = float(atof(val->second.c_str())); + + CString sGames; + val = k.find("Games"); + if(val != k.end()) + { + vector games; + split(val->second, ",", games); + for(unsigned n = 0; n < games.size(); ++n) + { + vector bits; + split(games[n], "-", bits); + ASSERT(bits.size() == 2); + + const Game game = GAMEMAN->StringToGameType( bits[0] ); + ASSERT(game != GAME_INVALID); + + const Style style = GAMEMAN->GameAndStringToStyle( game, bits[1] ); + ASSERT(style != STYLE_INVALID); + m.Styles.insert(style ); + } + } + } + + Modes.push_back(m); + } +} + +bool NoteFieldPositioning::Mode::MatchesCurrentGame() const +{ + if(Styles.empty()) + return true; + + if(Styles.find(GAMESTATE->m_CurStyle) == Styles.end()) + return false; + + return true; +} + + +/* Get the unique ID of the given name, for the current game/style. If it + * doesn't exist, return "". */ +int NoteFieldPositioning::GetID(const CString &name) const +{ + LOG->Trace("look for %s", name.c_str()); + for(unsigned i = 0; i < Modes.size(); ++i) + { + if(Modes[i].name.CompareNoCase(name)) + continue; + + if(!Modes[i].MatchesCurrentGame()) + continue; + + LOG->Trace("found it"); + return i; + } + + return -1; +} + +int NoteFieldPositioning::GetID(PlayerNumber pn) const +{ + return GetID(GAMESTATE->m_PlayerOptions[pn].m_sPositioning); +} + + +/* Get all arrow modifier names for the current game. */ +void NoteFieldPositioning::GetNamesForCurrentGame(vector &IDs) +{ // XXX dupes + /* Iterate over all keys. */ + for(unsigned i = 0; i < Modes.size(); ++i) + { + if(!Modes[i].MatchesCurrentGame()) + continue; + + IDs.push_back(Modes[i].name); + } +} + + +void NoteFieldPositioning::BeginDrawTrack(PlayerNumber pn, int tn) const +{ + const int mode = GetID(pn); + + DISPLAY->PushMatrix(); + + if(mode == -1) + { + /* No transformation is enabled, so use the one defined in the style + * table. */ + const StyleDef *s = GAMESTATE->GetCurrentStyleDef(); + const float fPixelXOffsetFromCenter = s->m_ColumnInfo[pn][tn].fXOffset; + DISPLAY->Translate(fPixelXOffsetFromCenter, 0, 0); + } else { + Modes[mode].BeginDrawTrack(tn); + } +} + +void NoteFieldPositioning::EndDrawTrack(PlayerNumber pn, int tn) const +{ + const int mode = GetID(pn); + + if(mode != -1) + Modes[mode].EndDrawTrack(tn); DISPLAY->PopMatrix(); } - diff --git a/stepmania/src/NoteFieldPositioning.h b/stepmania/src/NoteFieldPositioning.h index f89a3fe61e..fd217a5faf 100644 --- a/stepmania/src/NoteFieldPositioning.h +++ b/stepmania/src/NoteFieldPositioning.h @@ -1,31 +1,47 @@ #ifndef NOTEFIELD_POSITIONING_H #define NOTEFIELD_POSITIONING_H -#include "NoteTypes.h" +#include "RageMath.h" #include "PlayerNumber.h" #include "StyleDef.h" #include "PlayerNumber.h" +#include "Style.h" -#include "RageMath.h" +#include class NoteFieldPositioning { - RageMatrix m_Position[MAX_NOTE_TRACKS]; - /* 0 = no perspective */ - float m_fFov[MAX_NOTE_TRACKS]; - RageMatrix m_PerspPosition[MAX_NOTE_TRACKS]; + struct Mode + { + Mode(); + bool MatchesCurrentGame() const; + + void BeginDrawTrack(int tn) const; + void EndDrawTrack(int tn) const; + + CString name; + set