From dd8331d9fcc97596e754449f6ae015913c18519f Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sun, 11 May 2003 07:23:47 +0000 Subject: [PATCH] add support for models in NoteSkin --- stepmania/src/Model.cpp | 72 ++++++++++++++++++++++++++------- stepmania/src/Model.h | 14 +++++++ stepmania/src/NoteDisplay.cpp | 17 +++++++- stepmania/src/ScreenSandbox.cpp | 26 ++++++++++-- stepmania/src/ScreenSandbox.h | 3 +- stepmania/src/StepMania.dsp | 28 ++++++++++--- stepmania/src/ThemeManager.cpp | 2 +- 7 files changed, 134 insertions(+), 28 deletions(-) diff --git a/stepmania/src/Model.cpp b/stepmania/src/Model.cpp index 25ebcb0c0e..a923dd74de 100644 --- a/stepmania/src/Model.cpp +++ b/stepmania/src/Model.cpp @@ -1,7 +1,7 @@ #include "global.h" /* ----------------------------------------------------------------------------- - Class: Milkshape + Class: Model Desc: Types defined in msLib.h. @@ -10,11 +10,12 @@ ----------------------------------------------------------------------------- */ #include "Model.h" -#include "Milkshape.h" +#include "ModelTypes.h" #include "mathlib.h" #include "RageDisplay.h" #include "RageUtil.h" #include "RageTextureManager.h" +#include "IniFile.h" const float FRAMES_PER_SECOND = 30; @@ -39,6 +40,33 @@ void Model::Clear () m_pModel = NULL; } +bool Model::LoadFromModelFile( CString sPath ) +{ + CString sDir, sThrowAway; + splitrelpath( sPath, sDir, sThrowAway, sThrowAway ); + + IniFile ini; + ini.SetPath( sPath ); + ini.ReadFile(); + + if( !ini.GetKey("Model") ) + RageException::Throw( "The model file '%s' is invalid.", sPath.c_str() ); + + CString sFileName; + ini.GetValue( "Model", "File", sFileName ); + LoadMilkshapeAscii( sDir+sFileName ); + + float f; + if( ini.GetValueF( "Model", "BaseRotationXDegrees", f ) ) Actor::SetBaseRotationX( f ); + if( ini.GetValueF( "Model", "BaseRotationYDegrees", f ) ) Actor::SetBaseRotationY( f ); + if( ini.GetValueF( "Model", "BaseRotationZDegrees", f ) ) Actor::SetBaseRotationZ( f ); + if( ini.GetValueF( "Model", "BaseZoomX", f ) ) Actor::SetBaseZoomX( f ); + if( ini.GetValueF( "Model", "BaseZoomY", f ) ) Actor::SetBaseZoomY( f ); + if( ini.GetValueF( "Model", "BaseZoomZ", f ) ) Actor::SetBaseZoomZ( f ); + + return true; +} + bool Model::LoadMilkshapeAscii( CString sPath ) { CString sDir, sThrowAway; @@ -46,7 +74,7 @@ bool Model::LoadMilkshapeAscii( CString sPath ) FILE *file = fopen (sPath, "rt"); if (!file) - RageException::Throw( "Model:: Could not open '%s'.", sPath.c_str() ); + RageException::Throw( "Model::LoadMilkshapeAscii Could not open '%s'.", sPath.c_str() ); Clear (); @@ -378,14 +406,10 @@ bool Model::LoadMilkshapeAscii( CString sPath ) sscanf (szLine, "\"%[^\"]\"", szName); strcpy( Material.szAlphaTexture, szName ); - Material.pTexture = NULL; if( strcmp(Material.szDiffuseTexture, "")!=0 ) { - RageTextureID ID; - ID.filename = sDir+Material.szDiffuseTexture; - ID.bStretch = true; - if( DoesFileExist(ID.filename) ) - Material.pTexture = TEXTUREMAN->LoadTexture( ID ); + if( IsAFile(sDir+Material.szDiffuseTexture) ) + Material.aniTexture.Load( sDir+Material.szDiffuseTexture ); } } } @@ -722,7 +746,7 @@ void Model::DrawPrimitives() mat.Diffuse, mat.Specular, mat.fShininess ); - DISPLAY->SetTexture( mat.pTexture ); + DISPLAY->SetTexture( mat.aniTexture.GetCurrentTexture() ); } else { @@ -758,10 +782,11 @@ void Model::DrawPrimitives() } else { - VectorRotate (originalVert.Normal, m_pBones[originalVert.nBoneIndex].mFinal, tempVert.n); - int bone = originalVert.nBoneIndex; - VectorRotate (originalVert.Vertex, m_pBones[originalVert.nBoneIndex].mFinal, tempVert.p); + + VectorRotate (originalVert.Normal, m_pBones[bone].mFinal, tempVert.n); + + VectorRotate (originalVert.Vertex, m_pBones[bone].mFinal, tempVert.p); tempVert.p[0] += m_pBones[bone].mFinal[0][3]; tempVert.p[1] += m_pBones[bone].mFinal[1][3]; tempVert.p[2] += m_pBones[bone].mFinal[2][3]; @@ -971,4 +996,23 @@ void Model::Update( float fDelta ) { Actor::Update( fDelta ); AdvanceFrame( fDelta ); -} \ No newline at end of file + if( m_pModel ) + for( int i=0; iMaterials.size(); i++ ) + m_pModel->Materials[i].aniTexture.Update( fDelta ); +} + +void Model::SetState( int iNewState ) +{ + if( m_pModel ) + for( int i=0; iMaterials.size(); i++ ) + m_pModel->Materials[i].aniTexture.SetState( iNewState ); +} + +int Model::GetNumStates() +{ + int iMaxStates = 0; + if( m_pModel ) + for( int i=0; iMaterials.size(); i++ ) + iMaxStates = max( iMaxStates, m_pModel->Materials[i].aniTexture.GetNumStates() ); + return iMaxStates; +} diff --git a/stepmania/src/Model.h b/stepmania/src/Model.h index 3ce5d1f75e..c42d599048 100644 --- a/stepmania/src/Model.h +++ b/stepmania/src/Model.h @@ -35,6 +35,16 @@ public: public: void Clear (); + void Load( CString sPath ) + { + if( sPath == "" ) return; + if( sPath.Right(6) == ".model" ) + LoadFromModelFile( sPath ); + else + LoadMilkshapeAscii( sPath ); + }; + + bool LoadFromModelFile( CString sPath ); bool LoadMilkshapeAscii( CString sPath ); bool LoadMilkshapeAsciiBones( CString sPath ); @@ -45,6 +55,10 @@ public: void SetupBones (); void AdvanceFrame (float dt); + virtual void SetState( int iNewState ); + virtual int GetNumStates(); + + private: msModel *m_pModel; RageVector3 m_vMins, m_vMaxs; diff --git a/stepmania/src/NoteDisplay.cpp b/stepmania/src/NoteDisplay.cpp index fb8b657e51..ef7c386be0 100644 --- a/stepmania/src/NoteDisplay.cpp +++ b/stepmania/src/NoteDisplay.cpp @@ -29,10 +29,10 @@ Actor* MakeModelOrSprite( CString sFile ) { - if( sFile.Right(3)=="txt" ) + if( sFile.Right(3)=="txt"||sFile.Right(5)=="model" ) { Model* pModel = new Model; - pModel->LoadMilkshapeAscii( sFile ); + pModel->Load( sFile ); return pModel; } else @@ -699,7 +699,20 @@ void NoteDisplay::DrawTap( const int iCol, const float fBeat, const bool bOnSame pActor->SetXY( fXPos, fYPos ); pActor->SetDiffuse( diffuse ); pActor->SetGlow( glow ); + + + DISPLAY->EnableLighting( true ); + DISPLAY->SetLightDirectional( + 0, + RageColor(0.0f,0.0f,0.0f,1), + RageColor(1,1,1,1), + RageColor(1,1,1,1), + RageVector3(1, 0, +1) ); + pActor->Draw(); + + DISPLAY->SetLightOff( 0 ); + DISPLAY->EnableLighting( false ); } diff --git a/stepmania/src/ScreenSandbox.cpp b/stepmania/src/ScreenSandbox.cpp index 3a235fef62..30d23f2c86 100644 --- a/stepmania/src/ScreenSandbox.cpp +++ b/stepmania/src/ScreenSandbox.cpp @@ -18,6 +18,8 @@ #include "ScreenSandbox.h" #include "GameConstantsAndTypes.h" #include "ThemeManager.h" +#include "RageDisplay.h" +#include "RageTimer.h" ScreenSandbox::ScreenSandbox() : Screen("ScreenSandbox") @@ -32,12 +34,12 @@ ScreenSandbox::ScreenSandbox() : Screen("ScreenSandbox") // this->AddChild( &m_sprite ); m_model.SetXY(CENTER_X, CENTER_Y); - m_model.SetZoomX(1); - m_model.SetZoomY(-1); - m_model.LoadMilkshapeAscii( "arrow.txt" ); + m_model.SetZoom(3); + //m_model.SetZoomY(-1); + m_model.LoadMilkshapeAscii( "Down Tap Note 4th.txt" ); // m_model.LoadMilkshapeAsciiBones( "D:\\Dev\\ddrpc char hacking\\DDRPCRip\\models\\howtoplay.bones.txt" ); this->AddChild(&m_model); - m_model.SetEffectSpin( RageVector3(0,90,0) ); + m_model.SetEffectSpin( RageVector3(0,90,90) ); this->AddChild( &m_In ); @@ -58,6 +60,22 @@ void ScreenSandbox::Update( float fDeltaTime ) Screen::Update(fDeltaTime); } +void ScreenSandbox::DrawPrimitives() +{ + DISPLAY->EnableLighting( true ); + DISPLAY->SetLightDirectional( + 0, + RageColor(0,0,0,0), + RageColor(1,1,1,1), + RageColor(0,0,0,1), + RageVector3(0, -1, 0) ); + + Screen::DrawPrimitives(); + + DISPLAY->SetLightOff( 0 ); + DISPLAY->EnableLighting( false ); +} + void ScreenSandbox::MenuLeft( PlayerNumber pn ) { m_In.Load( THEME->GetPathToB("_menu in") ); diff --git a/stepmania/src/ScreenSandbox.h b/stepmania/src/ScreenSandbox.h index b8f9b916f1..9ff538e2ec 100644 --- a/stepmania/src/ScreenSandbox.h +++ b/stepmania/src/ScreenSandbox.h @@ -23,11 +23,12 @@ public: virtual void Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ); virtual void HandleScreenMessage( const ScreenMessage SM ); + virtual void Update(float f); + virtual void DrawPrimitives(); void MenuLeft( PlayerNumber pn ); void MenuRight( PlayerNumber pn ); - void Update(float f); Model m_model; Quad m_quad; Transition m_In; diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index 34a6429051..ab1c65bb6c 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -60,7 +60,7 @@ IntDir=.\../Release6 TargetDir=\stepmania\stepmania TargetName=StepMania SOURCE="$(InputPath)" -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -95,7 +95,7 @@ IntDir=.\../Debug6 TargetDir=\stepmania\stepmania TargetName=StepMania-debug SOURCE="$(InputPath)" -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -1008,10 +1008,6 @@ SOURCE=.\mathlib.h # End Source File # Begin Source File -SOURCE=.\Milkshape.h -# End Source File -# Begin Source File - SOURCE=.\Model.cpp # End Source File # Begin Source File @@ -1020,6 +1016,14 @@ SOURCE=.\Model.h # End Source File # Begin Source File +SOURCE=.\ModelTypes.cpp +# End Source File +# Begin Source File + +SOURCE=.\ModelTypes.h +# End Source File +# Begin Source File + SOURCE=.\Quad.h # End Source File # Begin Source File @@ -2029,6 +2033,10 @@ SOURCE=.\ScreenTitleMenu.h # End Source File # Begin Source File +SOURCE=.\ScreenUnlock.cpp +# End Source File +# Begin Source File + SOURCE=.\ScreenUnlock.h # End Source File # Begin Source File @@ -2139,6 +2147,14 @@ SOURCE=.\ThemeManager.cpp SOURCE=.\ThemeManager.h # End Source File +# Begin Source File + +SOURCE=.\UnlockSystem.cpp +# End Source File +# Begin Source File + +SOURCE=.\UnlockSystem.h +# End Source File # End Group # Begin Source File diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index 214d14f48c..ece62d900f 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -138,7 +138,7 @@ try_element_again: static const char *masks[NUM_ELEMENT_CATEGORIES][12] = { { "", NULL }, { "*.ini", NULL }, - {"*.sprite", "*.png", "*.jpg", "*.bmp", "*.gif","*.avi", "*.mpg", "*.mpeg", NULL}, + { "*.model", "*.sprite", "*.png", "*.jpg", "*.bmp", "*.gif","*.avi", "*.mpg", "*.mpeg", NULL}, { "*.png", NULL }, { ".set", ".mp3", ".ogg", ".wav", NULL }, };