diff options
Diffstat (limited to 'utils/itemtest_controls/itemtest_controls.cpp')
| -rw-r--r-- | utils/itemtest_controls/itemtest_controls.cpp | 1759 |
1 files changed, 1759 insertions, 0 deletions
diff --git a/utils/itemtest_controls/itemtest_controls.cpp b/utils/itemtest_controls/itemtest_controls.cpp new file mode 100644 index 0000000..ca2fb6e --- /dev/null +++ b/utils/itemtest_controls/itemtest_controls.cpp @@ -0,0 +1,1759 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +//============================================================================= +// +//============================================================================= + + +// Standard includes +#define WIN32_LEAN_AND_MEAN +#include <direct.h> +#include <Windows.h> + + +// Valve includes +#include "itemtest/itemtest_controls.h" +#include "vgui/IVGui.h" +#include "vgui/IInput.h" +#include "vgui/ISystem.h" +#include "vgui/IPanel.h" +#include "vgui_controls/CheckButton.h" +#include "vgui_controls/ComboBox.h" +#include "vgui_controls/FileOpenDialog.h" +#include "vgui_controls/Menu.h" +#include "vgui_controls/MenuItem.h" +#include "vgui_controls/MessageBox.h" +#include "vgui_controls/PanelListPanel.h" +#include "vgui_controls/ScrollBar.h" +#include "vgui_controls/TextImage.h" +#include "tier1/fmtstr.h" + + +// Local includes +#include "dualpanellist.h" + + +// Last include +#include <tier0/memdbgon.h> + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +CItemUploadDialog *g_pItemUploadDialog = NULL; + + +//============================================================================= +// +//============================================================================= +CStatusLabel::CStatusLabel( vgui::Panel *pPanel, const char *pszName, bool bValid /* = false */ ) +: BaseClass( pPanel, pszName, "" ) +, m_bValid( bValid ) +, m_cValid( 0, 192, 0, 255 ) +, m_cInvalid( 192, 0, 0, 255 ) +{ + SetText( m_bValid ? "#valid" : "#invalid" ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CStatusLabel::ApplySchemeSettings( vgui::IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + SetContentAlignment( vgui::Label::a_center ); + + m_cValid = pScheme->GetColor( "StatusLabel.ValidColor", m_cValid ); + m_cInvalid = pScheme->GetColor( "StatusLabel.InvalidColor", m_cInvalid ); + + UpdateColors(); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CStatusLabel::SetValid( bool bValid ) +{ + if ( bValid == m_bValid ) + return; + + m_bValid = bValid; + SetText( m_bValid ? "#valid" : "#invalid" ); + + UpdateColors(); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +bool CStatusLabel::GetValid() const +{ + return m_bValid; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CStatusLabel::UpdateColors() +{ + // TODO: Set valid/invalid colors in scheme .res file... + if ( GetValid() ) + { + SetBgColor( m_cValid ); + } + else + { + SetBgColor( m_cInvalid ); + } +} + + +//============================================================================= +// +//============================================================================= +CItemUploadSubPanel::CItemUploadSubPanel( vgui::Panel *pParent, const char *pszName, const char *pszNextName ) +: BaseClass( pParent, pszName ) +, m_sNextName( pszNextName ) +{ + // Set the Wizard panel if the parent is a Wizard panel (it should be) + vgui::WizardPanel *pWizardPanel = dynamic_cast< vgui::WizardPanel * >( pParent ); + if ( pWizardPanel ) + { + SetWizardPanel( pWizardPanel ); + } + + CFmtStr sTmp; + + // Create the two standard widgets + + if ( CItemUpload::GetDevMode() ) + { + sTmp.sprintf( "#itemtest_wizard_%s_info_dev", GetName() ); + const char *pszCheck = g_pVGuiLocalize->FindAsUTF8( sTmp ); + + if ( pszCheck == sTmp.Access() ) + { + sTmp.Clear(); + } + } + + if ( sTmp.Length() <= 0 ) + { + sTmp.sprintf( "#itemtest_wizard_%s_info", GetName() ); + } + + m_pLabel = new vgui::Label( this, "info", sTmp ); + + m_pPanelListPanel = new vgui::PanelListPanel( this, "list" ); + + m_pStatusLabel = new CStatusLabel( this, "statusLabel", false ); + m_pStatusText = new vgui::Label( this, "statusText", "wonk" ); + + sTmp.sprintf( "itemtest_wizard_%s.res", GetName() ); + + LoadControlSettings( sTmp ); + + m_pLabel->SetAutoResize( PIN_TOPLEFT, AUTORESIZE_RIGHT, 0, 0, 0, 0 ); + m_pLabel->SizeToContents(); // Supposedly doesn't work until layout but kind of does... + m_pLabel->SetWrap( true ); + + m_pStatusLabel->SetAutoResize( PIN_BOTTOMLEFT, AUTORESIZE_NO, 0, 0, 0, 0 ); + + if ( GetWizardPanel() && pszNextName == NULL ) + { + GetWizardPanel()->SetFinishButtonEnabled( false ); + } +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CItemUploadSubPanel::PerformLayout() +{ + BaseClass::PerformLayout(); + + int nOldWide = m_pLabel->GetWide(); + m_pLabel->SizeToContents(); + m_pLabel->SetWide( nOldWide ); + + int nX = 0; + int nY = 0; + + m_pLabel->GetPos( nX, nY ); + + int nX1 = 0; + int nY1 = 0; + + m_pStatusLabel->GetPos( nX1, nY1 ); + + m_pPanelListPanel->SetBounds( nX, nY + m_pLabel->GetTall() + 10, m_pLabel->GetWide(), nY1 - nY - m_pLabel->GetTall() - 20 ); + + bool bDone = false; + + for ( int i = 1; i < m_pPanelListPanel->GetItemCount(); i += 2 ) + { + vgui::Panel *pPanelA0 = m_pPanelListPanel->GetItemLabel( i - 1 ); + vgui::Panel *pPanelA1 = m_pPanelListPanel->GetItemPanel( i - 1 ); + vgui::Panel *pPanelB0 = m_pPanelListPanel->GetItemLabel( i ); + vgui::Panel *pPanelB1 = m_pPanelListPanel->GetItemPanel( i ); + + pPanelA0->SetTall( pPanelA1->GetTall() ); + pPanelB1->SetTall( pPanelB0->GetTall() ); + + if ( !bDone ) + { + bDone = true; + m_pStatusLabel->SetSize( pPanelA0->GetWide(), pPanelB0->GetTall() ); + } + } + + m_pStatusLabel->GetPos( nX, nY ); + m_pStatusText->SetPos( nX + m_pStatusLabel->GetWide() + 5, nY ); + m_pStatusText->SetWide( m_pLabel->GetWide() - nX ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CItemUploadSubPanel::ApplySchemeSettings( vgui::IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + if ( dynamic_cast< CGlobalSubPanel * >( this ) ) + return; + + if ( dynamic_cast< CGeometrySubPanel * >( this ) ) + return; + + /* +#ifdef _DEBUG + + m_pLabel->SetBgColor( Color( 255, 127, 0, 255 ) ); + + m_pPanelListPanel->SetBgColor( Color( 0, 127, 0 ) ); + + for ( int i = 1; i < m_pPanelListPanel->GetItemCount(); i += 2 ) + { + vgui::Panel *pPanel = m_pPanelListPanel->GetItemPanel( i ); + if ( pPanel ) + { + pPanel->SetBgColor( Color( 0, 0, 255 ) ); + } + } + +#endif // _DEBUG + */ + +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CItemUploadSubPanel::OnDisplay() +{ + UpdateGUI(); +// UpdateStatus(); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +vgui::WizardSubPanel *CItemUploadSubPanel::GetNextSubPanel() +{ + return dynamic_cast< WizardSubPanel * >( GetWizardPanel()->FindChildByName( m_sNextName.Get() ) ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +bool CItemUploadSubPanel::UpdateStatus() +{ + CItemUploadWizard *pItemUploadWizard = dynamic_cast< CItemUploadWizard * >( GetWizardPanel() ); + if ( !pItemUploadWizard ) + return false; + + if ( pItemUploadWizard->GetCurrentItemUploadSubPanel() != this ) + return false; + + CAsset &asset = pItemUploadWizard->Asset(); + + CFmtStr sTmp; + sTmp.sprintf( "#itemtest_wizard_%s_title", GetName() ); + + CUtlString sRelativeDir; + asset.GetRelativeDir( sRelativeDir, NULL ); + + const char *pszTitle = g_pVGuiLocalize->FindAsUTF8( sTmp ); + + CUtlString sStatusMsg; + if ( asset.IsOk( sStatusMsg ) && !sRelativeDir.IsEmpty() && pszTitle ) + { + sTmp.sprintf( "%s : %s", pszTitle, sRelativeDir.Get() ); + } + else if ( !sStatusMsg.IsEmpty() ) + { + } + + pItemUploadWizard->SetTitle( sTmp, true ); + + bool bValid = true; + for ( int i = 1; bValid && i < m_pPanelListPanel->GetItemCount(); i += 2 ) + { + CStatusLabel *pStatusLabel = dynamic_cast< CStatusLabel * >( m_pPanelListPanel->GetItemLabel( i ) ); + if ( !pStatusLabel ) + continue; + + bValid = bValid && pStatusLabel->GetValid(); + } + + m_pStatusLabel->SetValid( bValid ); + + sTmp.sprintf( "#itemtest_wizard_%s_%s", GetName(), bValid ? "valid" : "invalid" ); + m_pStatusText->SetText( sTmp ); + + pItemUploadWizard->SetNextButtonEnabled( bValid ); + + if ( pItemUploadWizard->GetCurrentSubPanel() == this ) + { + pItemUploadWizard->SetFinishButtonEnabled( m_sNextName.IsEmpty() ? true : false ); + } + + return bValid; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CItemUploadSubPanel::AddStatusPanels( const char *pszPrefix ) +{ + CFmtStr sTmp; + + sTmp.sprintf( "%sStatusLabel", pszPrefix ); + CStatusLabel *pStatusLabel = new CStatusLabel( this, sTmp ); + + sTmp.sprintf( "%sStatusText", pszPrefix ); + vgui::Label *pStatusText = new vgui::Label( this, sTmp, "" ); + + m_pPanelListPanel->AddItem( pStatusLabel, pStatusText ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CItemUploadSubPanel::SetStatus( bool bValid, const char *pszPrefix, const char *pszMessage /* = NULL */, bool bHide /* = false */ ) +{ + CFmtStr sTmp; + sTmp.sprintf( "%sStatusLabel", pszPrefix ); + + CStatusLabel *pStatusLabel = dynamic_cast< CStatusLabel * >( m_pPanelListPanel->FindChildByName( sTmp, true ) ); + if ( pStatusLabel ) + { + pStatusLabel->SetValid( bValid ); + pStatusLabel->SetVisible( !bHide ); + } + + sTmp.sprintf( "%sStatusText", pszPrefix ); + vgui::Label *pStatusText = dynamic_cast< vgui::Label * >( m_pPanelListPanel->FindChildByName( sTmp, true ) ); + if ( pStatusText ) + { + if ( pszMessage ) + { + pStatusText->SetText( pszMessage ); + } + else + { + sTmp.sprintf( "#%s%s", pszPrefix, bValid ? "Valid" : "Invalid" ); + pStatusText->SetText( sTmp ); + } + + pStatusText->SetVisible( !bHide ); + } + +} + + +//============================================================================= +// +//============================================================================= +class CFileLocationPanel : public vgui::Panel +{ + DECLARE_CLASS_SIMPLE( CFileLocationPanel, vgui::Panel ); + +public: + + CFileLocationPanel( vgui::Panel *pParent, int nLodIndex ) + : BaseClass( pParent ) + { + m_pButtonBrowse = new vgui::Button( this, "BrowseButton", "#BrowseButton", pParent ); + m_pButtonBrowse->SetCommand( new KeyValues( "Open" ) ); + m_pButtonBrowse->AddActionSignalTarget( pParent ); + + m_pLabel = new vgui::Label( this, "FileLabel", "" ); + } + + virtual void PerformLayout() + { + BaseClass::PerformLayout(); + + int w = 0; + int h = 0; + GetSize( w, h ); + + m_pButtonBrowse->SizeToContents(); + + SetTall( m_pButtonBrowse->GetTall() ); + + m_pButtonBrowse->SetPos( w - m_pButtonBrowse->GetWide(), 0 ); + m_pLabel->SetSize( w - m_pButtonBrowse->GetWide(), m_pButtonBrowse->GetTall() ); + m_pLabel->SetPos( 0, 0 ); + } + + vgui::Button *m_pButtonBrowse; + vgui::Label *m_pLabel; + +}; + + +//============================================================================= +// +//============================================================================= +class CLODFileLocationPanel : public vgui::Panel +{ + DECLARE_CLASS_SIMPLE( CLODFileLocationPanel, vgui::Panel ); + +public: + + CLODFileLocationPanel( vgui::Panel *pParent, int nLodIndex ) + : BaseClass( pParent ) + { + CFmtStr sButtonDelete; + sButtonDelete.sprintf( "#LOD%dDelete", nLodIndex ); + + m_pButtonDelete = new vgui::Button( this, sButtonDelete, sButtonDelete ); + m_pButtonDelete->SetCommand( new KeyValues( "Delete", "nLODIndex", nLodIndex ) ); + m_pButtonDelete->AddActionSignalTarget( pParent ); + + CFmtStr sButton; + sButton.sprintf( "#LOD%dButton", nLodIndex ); + + m_pButtonBrowse = new vgui::Button( this, sButton, sButton, pParent ); + m_pButtonBrowse->SetCommand( new KeyValues( "Open", "nLODIndex", nLodIndex ) ); + m_pButtonBrowse->AddActionSignalTarget( pParent ); + + CFmtStr sTextEntry; + sTextEntry.sprintf( "#LOD%dTextEntry", nLodIndex ); + + m_pLabel = new vgui::Label( this, sTextEntry, "" ); + } + + virtual void PerformLayout() + { + BaseClass::PerformLayout(); + + int w = 0; + int h = 0; + GetSize( w, h ); + + m_pButtonDelete->SizeToContents(); + m_pButtonBrowse->SizeToContents(); + + SetTall( m_pButtonBrowse->GetTall() ); + + m_pButtonDelete->SetPos( w - m_pButtonDelete->GetWide(), 0 ); + m_pButtonBrowse->SetPos( w - ( m_pButtonDelete->GetWide() + m_pButtonBrowse->GetWide() ), 0 ); + m_pLabel->SetSize( w - ( m_pButtonDelete->GetWide() + m_pButtonBrowse->GetWide() ), m_pButtonBrowse->GetTall() ); + m_pLabel->SetPos( 0, 0 ); + } + + vgui::Button *m_pButtonBrowse; + vgui::Button *m_pButtonDelete; + vgui::Label *m_pLabel; + +}; + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +CGeometrySubPanel::CGeometrySubPanel( vgui::Panel *pParent, const char *pszName, const char *pszNextName ) +: BaseClass( pParent, pszName, pszNextName ) +{ + m_pFileOpenStateMachine = new vgui::FileOpenStateMachine( this, this ); + m_pFileOpenStateMachine->AddActionSignalTarget( this ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CGeometrySubPanel::UpdateGUI() +{ + CItemUploadWizard *pItemUploadWizard = dynamic_cast< CItemUploadWizard * >( GetWizardPanel() ); + if ( !pItemUploadWizard ) + return; + + CAsset &asset = pItemUploadWizard->Asset(); + + int nGeometryCount = m_pPanelListPanel->GetItemCount() / 2; + + for ( int i = 0; i < asset.TargetDMXCount(); ++i ) + { + if ( i >= nGeometryCount ) + { + AddGeometry(); + nGeometryCount = m_pPanelListPanel->GetItemCount() / 2; + } + + if ( i >= nGeometryCount ) + break; // unrecoverable error + + CLODFileLocationPanel *pFileLocationPanel = dynamic_cast< CLODFileLocationPanel * >( m_pPanelListPanel->GetItemPanel( i * 2 ) ); + if ( !pFileLocationPanel ) + continue; + + vgui::Label *pLabel = pFileLocationPanel->m_pLabel; + if ( !pLabel ) + continue; + + CSmartPtr< CTargetDMX > pTargetDmx = asset.GetTargetDMX( i ); + if ( !pTargetDmx ) + continue; + + pLabel->SetText( pTargetDmx->GetInputFile().Get() ); + } + + // Ensure an empty blank one at the end + if ( nGeometryCount == asset.TargetDMXCount() ) + { + AddGeometry(); + } + else + { + // Remove superfluous + while ( m_pPanelListPanel->GetItemCount() / 2 > ( asset.TargetDMXCount() + 1 ) ) + { + m_pPanelListPanel->RemoveItem( m_pPanelListPanel->GetItemCount() - 1 ); + m_pPanelListPanel->RemoveItem( m_pPanelListPanel->GetItemCount() - 1 ); + } + + // Set last one to empty + if ( ( m_pPanelListPanel->GetItemCount() / 2 ) == ( asset.TargetDMXCount() + 1 ) ) + { + CLODFileLocationPanel *pFileLocationPanel = dynamic_cast< CLODFileLocationPanel * >( m_pPanelListPanel->GetItemPanel( m_pPanelListPanel->GetItemCount() - 2 ) ); + if ( pFileLocationPanel ) + { + vgui::Label *pLabel = pFileLocationPanel->m_pLabel; + if ( pLabel ) + { + pLabel->SetText( "" ); + } + } + } + } + + UpdateStatus(); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +bool CGeometrySubPanel::UpdateStatus() +{ + CItemUploadWizard *pItemUploadWizard = dynamic_cast< CItemUploadWizard * >( GetWizardPanel() ); + if ( !pItemUploadWizard ) + return false; + + CAsset &asset = pItemUploadWizard->Asset(); + + CFmtStr sTmp; + CFmtStr sErrString; + + int nLODIndex = 0; + int nThisPolyCount = 0; + int nLastPolyCount = 0; + + for ( int i = 0; i < m_pPanelListPanel->GetItemCount(); i += 2, ++nLODIndex ) + { + CLODFileLocationPanel *pFileLocationPanel = dynamic_cast< CLODFileLocationPanel * >( m_pPanelListPanel->GetItemPanel( i ) ); + if ( !pFileLocationPanel ) + continue; + + vgui::Label *pLabel = pFileLocationPanel->m_pLabel; + if ( !pLabel ) + continue; + + if ( i == ( m_pPanelListPanel->GetItemCount() - 4 ) ) + { + pFileLocationPanel->m_pButtonDelete->SetEnabled( true ); + } + else + { + pFileLocationPanel->m_pButtonDelete->SetEnabled( false ); + } + + sTmp.sprintf( "LOD%d", nLODIndex ); + + if ( i < ( m_pPanelListPanel->GetItemCount() - 2 ) ) + { + CSmartPtr< CTargetDMX > pTargetDMX = asset.GetTargetDMX( nLODIndex ); + + if ( !pTargetDMX ) + { + sErrString.sprintf( "Invalid Geometry: LOD %d is NULL", nLODIndex ); + SetStatus( false, sTmp, sErrString ); + continue; + } + + CUtlString sStatusMsg; + if ( !pTargetDMX->IsOk( sStatusMsg ) ) + { + SetStatus( false, sStatusMsg.Get() ); + continue; + } + + nLastPolyCount = nThisPolyCount; + nThisPolyCount = pTargetDMX->GetPolyCount(); + + if ( nThisPolyCount <= 0 ) + { + sErrString.sprintf( "LOD %d has bad polygon count: %d", i, nThisPolyCount ); + SetStatus( false, sTmp, sErrString ); + continue; + } + + if ( ( i > 0 ) && ( nThisPolyCount == nLastPolyCount ) ) + { + sErrString.sprintf( "LOD %d (%d polys) has the same number of polygons as previous LOD %d (%d polys)", + nLODIndex, nThisPolyCount, nLODIndex - 1, nLastPolyCount ); + SetStatus( false, sTmp, sErrString ); + continue; + } + + if ( ( i > 0 ) && ( nThisPolyCount >= nLastPolyCount ) ) + { + sErrString.sprintf( "LOD %d (%d polys) has more polygons than previous LOD %d (%d polys)", + nLODIndex, nThisPolyCount, nLODIndex - 1, nLastPolyCount ); + SetStatus( false, sTmp, sErrString ); + continue; + } + + SetStatus( true, sTmp ); + } + else + { + SetStatus( true, sTmp, NULL, true ); + } + } + + bool bValid = BaseClass::UpdateStatus(); + + // In this case there are more validation checks to be performed + + // Ensure each LOD is non-empty + if ( bValid ) + { + sErrString.Clear(); + + // Ensure at least two LODs + if ( CItemUpload::GetDevMode() ) + { + if ( asset.TargetDMXCount() < 1 ) + { + bValid = false; + sErrString.sprintf( "At least 1 LOD is required" ); + } + } + else if ( asset.TargetDMXCount() < 2 ) + { + bValid = false; + sErrString.sprintf( "At least 2 LODs are required" ); + } + + // Any other overall checks can go here + + m_pStatusLabel->SetValid( bValid ); + + if ( !bValid ) + { + // Not sure how to translate this message with parameters, etc... + m_pStatusText->SetText( sErrString ); + } + + pItemUploadWizard->SetNextButtonEnabled( bValid ); + } + + return bValid; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CGeometrySubPanel::SetupFileOpenDialog( + vgui::FileOpenDialog *pDialog, + bool bOpenFile, + const char *pszFileName, + KeyValues *pContextKeyValues ) +{ + char pszStartingDir[ MAX_PATH ]; + if ( !vgui::system()->GetRegistryString( + "HKEY_CURRENT_USER\\Software\\Valve\\itemtest\\geometry\\opendir", + pszStartingDir, sizeof( pszStartingDir ) ) ) + { + _getcwd( pszStartingDir, ARRAYSIZE( pszStartingDir )); + + CUtlString sVMod; + CUtlString sContentDir; + if ( CItemUpload::GetVMod( sVMod ) && !sVMod.IsEmpty() && CItemUpload::GetContentDir( sContentDir ) && !sContentDir.IsEmpty() && CItemUpload::FileExists( sContentDir.Get() ) ) + { + sContentDir += "/"; + sContentDir += sVMod; + sContentDir += "/models"; + + CUtlString sTmp = sContentDir; + sTmp += "/player"; + + if ( CItemUpload::FileExists( sTmp.Get() ) ) + { + sContentDir = sTmp; + sTmp += "/items"; + + if ( CItemUpload::FileExists( sTmp.Get() ) ) + { + CItemUploadWizard *pItemUploadWizard = dynamic_cast< CItemUploadWizard * >( GetWizardPanel() ); + if ( pItemUploadWizard ) + { + CAsset &asset = pItemUploadWizard->Asset(); + + sContentDir = sTmp; + sTmp += "/"; + sTmp += asset.GetClass(); + } + + // TODO: Add steam id? + + V_FixupPathName( pszStartingDir, ARRAYSIZE( pszStartingDir ), sTmp.Get() ); + } + } + } + } + + pDialog->SetStartDirectoryContext( "itemtest_geometry_browser", pszStartingDir ); + + if ( bOpenFile ) + { + pDialog->AddFilter( "*.obj", "OBJ File (*.obj)", true, "obj" ); + pDialog->AddFilter( "*.smd", "Valve SMD File (*.smd)", false, "smd" ); + pDialog->AddFilter( "*.dmx", "Valve DMX File (*.dmx)", false, "dmx" ); + pDialog->AddFilter( "*.*", "All Files (*.*)", false, "geometry" ); + + pDialog->SetTitle( "Open Geometry ( OBJ/SMD/DMX ) File", true ); + } +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +bool CGeometrySubPanel::OnReadFileFromDisk( + const char *pszFileName, + const char *pszFileFormat, + KeyValues *pContextKeyValues ) +{ + CItemUploadWizard *pItemUploadWizard = dynamic_cast< CItemUploadWizard * >( GetWizardPanel() ); + if ( !pItemUploadWizard ) + return false; + + const int nLODIndex = pContextKeyValues->GetInt( "nLODIndex", -1 ); + if ( nLODIndex < 0 ) + return false; + + char szBuf0[ MAX_PATH ]; + char szBuf1[ MAX_PATH ]; + + // Extract path and save to registry to open browser there next time + { + V_strncpy( szBuf0, pszFileName, sizeof( szBuf0 ) ); + V_FixSlashes( szBuf0 ); + V_StripFilename( szBuf0 ); + + _fullpath( szBuf1, szBuf0, ARRAYSIZE( szBuf1 ) ); + + vgui::system()->SetRegistryString( + "HKEY_CURRENT_USER\\Software\\Valve\\itemtest\\geometry\\opendir", + szBuf1 ); + } + + // Get the full path + _fullpath( szBuf1, pszFileName, ARRAYSIZE( szBuf1 ) ); + + CAsset &asset = pItemUploadWizard->Asset(); + + for ( int i = 0; i < asset.TargetDMXCount(); ++i ) + { + CSmartPtr< CTargetDMX > pTargetDMX = asset.GetTargetDMX( i ); + if ( !pTargetDMX ) + continue; + + if ( !V_strcmp( pTargetDMX->GetInputFile().Get(), szBuf1 ) ) + { + vgui::MessageBox *pMessageBox = new vgui::MessageBox( "#duplicate_file_title", "#duplicate_file_text", this ); + if ( pMessageBox ) + { + pMessageBox->SetSize( 640, 480 ); + pMessageBox->SetMinimumSize( 320, 120 ); + + pMessageBox->DoModal(); + } + + return false; + } + } + + bool bRet = false; + + if ( nLODIndex < asset.TargetDMXCount() ) + { + bRet = asset.SetTargetDMX( nLODIndex, szBuf1 ); + } + else if ( nLODIndex == asset.TargetDMXCount() ) + { + const int nCheck = asset.AddTargetDMX( szBuf1 ); + Assert( nCheck == nLODIndex ); + bRet = ( nCheck >= 0 ); + } + + UpdateGUI(); + + return bRet; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +bool CGeometrySubPanel::OnWriteFileToDisk( + const char *pszFileName, + const char *pszFileFormat, + KeyValues *pContextKeyValues ) +{ + return false; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CGeometrySubPanel::OnOpen( int nLodIndex ) +{ + KeyValues *pContextKeyValues = new KeyValues( "FileOpen", "nLODIndex", nLodIndex ); + m_pFileOpenStateMachine->OpenFile( "geometry", pContextKeyValues ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CGeometrySubPanel::OnDelete( int nLodIndex ) +{ + CItemUploadWizard *pItemUploadWizard = dynamic_cast< CItemUploadWizard * >( GetWizardPanel() ); + if ( !pItemUploadWizard ) + return; + + CAsset &asset = pItemUploadWizard->Asset(); + + asset.RemoveTargetDMX( nLodIndex ); + + UpdateGUI(); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CGeometrySubPanel::AddGeometry() +{ + const int nLodIndex = m_pPanelListPanel->GetItemCount() / 2; + + CFmtStr sLabel; + sLabel.sprintf( "#LOD%dLabel", nLodIndex ); + + vgui::Label *pLabel = new vgui::Label( this, sLabel, sLabel ); + pLabel->SetContentAlignment( vgui::Label::a_center ); + + CLODFileLocationPanel *pFileLocationPanel = new CLODFileLocationPanel( this, nLodIndex ); + m_pPanelListPanel->AddItem( pLabel, pFileLocationPanel ); + pFileLocationPanel->m_pLabel->AddActionSignalTarget( this ); + pFileLocationPanel->m_pButtonBrowse->AddActionSignalTarget( this ); + + sLabel.sprintf( "lod%d", nLodIndex ); + AddStatusPanels( sLabel ); +} + + +//============================================================================= +// +//============================================================================= +class CVmtEntry : public CDualPanelList +{ + DECLARE_CLASS_SIMPLE( CVmtEntry, CDualPanelList ); +public: + + MESSAGE_FUNC_PTR( OnTextChanged, "TextChanged", panel ); + MESSAGE_FUNC_PTR( OnOpen, "Open", panel ); + + CVmtEntry( CMaterialSubPanel *pMaterialSubPanel, const char *pszName, int nVmtIndex ) + : CDualPanelList( pMaterialSubPanel, pszName ) + , m_pMaterialSubPanel( pMaterialSubPanel ) + , m_nVmtIndex( nVmtIndex ) + { + { + vgui::Label *pMaterialLabel = new vgui::Label( this, "MaterialLabel", "#MaterialLabel" ); + m_pMaterialName = new vgui::Label( this, "MaterialName", "#MaterialName" ); + + AddItem( pMaterialLabel, m_pMaterialName ); + } + + { + vgui::Label *pMaterialTypeLabel = new vgui::Label( this, "MaterialTypeLabel", "#MaterialTypeLabel" ); + m_pMaterialType = new vgui::ComboBox( this, "MaterialTypeComboBox", 0, false ); + m_pMaterialType->AddItem( "#Invalid", new KeyValues( "Invalid" ) ); + m_pMaterialType->AddItem( "#Primary", new KeyValues( "Primary" ) ); + m_pMaterialType->AddItem( "#Secondary", new KeyValues( "Secondary" ) ); + m_pMaterialType->AddItem( "#DuplicateOfPrimary", new KeyValues( "DuplicateOfPrimary" ) ); + m_pMaterialType->AddItem( "#DuplicateOfSecondary", new KeyValues( "DuplicateOfSecondary" ) ); + m_pMaterialType->AddActionSignalTarget( this ); + + AddItem( pMaterialTypeLabel, m_pMaterialType ); + } + + { + vgui::Label *pRedBlueLabel = new vgui::Label( this, "CommonRedBlueLabel", "#CommonRedBlueLabel" ); + m_pCommonRedBlue = new vgui::ComboBox( this, "CommonRedBlue", 0, false ); + m_pCommonRedBlue->AddItem( "#Common", new KeyValues( "Common" ) ); + m_pCommonRedBlue->AddItem( "#RedAndBlue", new KeyValues( "RedAndBlue" ) ); + m_pCommonRedBlue->AddActionSignalTarget( this ); + + m_nCommonRedBlueId = AddItem( pRedBlueLabel, m_pCommonRedBlue ); + } + + { + vgui::Label *pCommonTextureLabel = new vgui::Label( this, "CommonTextureLabel", "#CommonTextureLabel" ); + m_pCommonTextureFileLocation = new CFileLocationPanel( this, 0 ); + + m_nCommonId = AddItem( pCommonTextureLabel, m_pCommonTextureFileLocation ); + } + + { + vgui::Label *pRedTextureLabel = new vgui::Label( this, "RedTextureLabel", "#RedTextureLabel" ); + m_pRedTextureFileLocation = new CFileLocationPanel( this, 1 ); + + m_nRedId = AddItem( pRedTextureLabel, m_pRedTextureFileLocation ); + } + + { + vgui::Label *pBlueTextureLabel = new vgui::Label( this, "BlueTextureLabel", "#BlueTextureLabel" ); + m_pBlueTextureFileLocation = new CFileLocationPanel( this, 1 ); + + m_nBlueId = AddItem( pBlueTextureLabel, m_pBlueTextureFileLocation ); + } + + { + vgui::Label *pColorAlphaLabel = new vgui::Label( this, "ColorAlphaLabel", "#ColorAlphaLabel" ); + + m_pColorAlpha = new vgui::ComboBox( this, "ColorAlphaComboBox", 0, false ); + m_pColorAlpha->AddItem( "#Nothing", new KeyValues( "None" ) ); + m_pColorAlpha->AddItem( "#Transparency", new KeyValues( "Transparency" ) ); + m_pColorAlpha->AddItem( "#Paintable", new KeyValues( "Paintable" ) ); + m_pColorAlpha->AddItem( "#SpecPhong", new KeyValues( "SpecPhong" ) ); + m_pColorAlpha->AddActionSignalTarget( this ); + + m_nColorAlphaId = AddItem( pColorAlphaLabel, m_pColorAlpha ); + } + + { + vgui::Label *pNormalMapLabel = new vgui::Label( this, "NormalMapLabel", "#NormalMapLabel" ); + m_pNormalTextureFileLocation = new CFileLocationPanel( this, 2 ); + + m_nNormalId = AddItem( pNormalMapLabel, m_pNormalTextureFileLocation ); + } + + { + vgui::Label *pNormalAlphaLabel = new vgui::Label( this, "NormalAlphaLabel", "#NormalAlphaLabel" ); + + m_pNormalAlpha = new vgui::ComboBox( this, "NormalAlphaComboBox", 0, false ); + m_pNormalAlpha->AddItem( "#Nothing", new KeyValues( "None" ) ); + m_pNormalAlpha->AddItem( "#SpecPhong", new KeyValues( "SpecPhong" ) ); + m_pNormalAlpha->AddActionSignalTarget( this ); + + m_nNormalAlphaId = AddItem( pNormalAlphaLabel, m_pNormalAlpha ); + } + + m_pCommonRedBlue->ActivateItem( 0 ); + SetItemVisible( m_nColorAlphaId, false ); + m_pColorAlpha->SilentActivateItem( 0 ); + SetItemVisible( m_nNormalAlphaId, false ); + m_pNormalAlpha->SilentActivateItem( 0 ); + } + + int m_nCommonRedBlueId; + int m_nCommonId; + int m_nRedId; + int m_nBlueId; + int m_nColorAlphaId; + int m_nNormalId; + int m_nNormalAlphaId; + + vgui::Label *m_pMaterialName; + vgui::ComboBox *m_pMaterialType; + vgui::ComboBox *m_pCommonRedBlue; + CFileLocationPanel *m_pCommonTextureFileLocation; + CFileLocationPanel *m_pRedTextureFileLocation; + CFileLocationPanel *m_pBlueTextureFileLocation; + vgui::ComboBox *m_pColorAlpha; + CFileLocationPanel *m_pNormalTextureFileLocation; + vgui::ComboBox *m_pNormalAlpha; + + CMaterialSubPanel *m_pMaterialSubPanel; + + int m_nVmtIndex; + + void SetMaterialId( const char *pszMaterialName ) + { + if ( !m_pMaterialName ) + return; + + m_pMaterialName->SetText( pszMaterialName ); + } + +}; + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CVmtEntry::OnTextChanged( vgui::Panel *pPanel ) +{ + CTargetVMT *pTargetVMT = m_pMaterialSubPanel->GetTargetVMT( m_nVmtIndex ); + if ( !pTargetVMT ) + return; + + bool bUpdate = false; + + if ( pPanel == m_pMaterialType ) + { + KeyValues *pUserData = m_pMaterialType->GetActiveItemUserData(); + if ( pUserData ) + { + if ( !V_strcmp( "Invalid", pUserData->GetName() ) ) + { + pTargetVMT->SetMaterialType( CTargetVMT::kInvalidMaterialType ); + } + else if ( !V_strcmp( "Primary", pUserData->GetName() ) ) + { + pTargetVMT->SetMaterialType( CTargetVMT::kPrimary ); + } + else if ( !V_strcmp( "Secondary", pUserData->GetName() ) ) + { + pTargetVMT->SetMaterialType( CTargetVMT::kSecondary ); + } + else if ( !V_strcmp( "DuplicateOfPrimary", pUserData->GetName() ) ) + { + pTargetVMT->SetDuplicate( CTargetVMT::kPrimary ); + } + else if ( !V_strcmp( "DuplicateOfSecondary", pUserData->GetName() ) ) + { + pTargetVMT->SetDuplicate( CTargetVMT::kSecondary ); + } + else + { + AssertMsg1( 0, "Unknown Material Type: %s\n", pUserData->GetName() ); + } + + bUpdate = true; + } + } + else if ( pPanel == m_pCommonRedBlue ) + { + KeyValues *pUserData = m_pCommonRedBlue->GetActiveItemUserData(); + if ( pUserData ) + { + const bool bCommon = !V_strcmp( "Common", pUserData->GetName() ); + + pTargetVMT->SetColorMapCommon( bCommon ); + + bUpdate = true; + } + } + else if ( pPanel == m_pColorAlpha ) + { + KeyValues *pUserData = m_pColorAlpha->GetActiveItemUserData(); + if ( pUserData ) + { + const char *pszUserData = pUserData->GetName(); + + if ( StringHasPrefix( pszUserData, "T" ) ) + { + pTargetVMT->SetColorAlphaType( CTargetVMT::kTransparency ); + } + else if ( StringHasPrefix( pszUserData, "P" ) ) + { + pTargetVMT->SetColorAlphaType( CTargetVMT::kPaintable ); + } + else if ( StringHasPrefix( pszUserData, "S" ) ) + { + pTargetVMT->SetColorAlphaType( CTargetVMT::kColorSpecPhong ); + } + else + { + pTargetVMT->SetColorAlphaType( CTargetVMT::kNoColorAlpha ); + } + + bUpdate = true; + } + } + else if ( pPanel == m_pNormalAlpha ) + { + KeyValues *pUserData = m_pNormalAlpha->GetActiveItemUserData(); + if ( pUserData ) + { + const char *pszUserData = pUserData->GetName(); + + if ( StringHasPrefix( pszUserData, "S" ) ) + { + pTargetVMT->SetNormalAlphaType( CTargetVMT::kNormalSpecPhong ); + } + else + { + pTargetVMT->SetNormalAlphaType( CTargetVMT::kNoNormalAlpha ); + } + + bUpdate = true; + } + } + + if ( bUpdate ) + { + InvalidateLayout(); + m_pMaterialSubPanel->InvalidateLayout(); + m_pMaterialSubPanel->UpdateGUI(); + } +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CVmtEntry::OnOpen( vgui::Panel *pPanel ) +{ + if ( !m_pMaterialSubPanel ) + return; + + if ( pPanel == m_pCommonTextureFileLocation->m_pButtonBrowse ) + { + m_pMaterialSubPanel->Browse( this, CMaterialSubPanel::kCommon ); + } + else if ( pPanel == m_pRedTextureFileLocation->m_pButtonBrowse ) + { + m_pMaterialSubPanel->Browse( this, CMaterialSubPanel::kRed ); + } + else if ( pPanel == m_pBlueTextureFileLocation->m_pButtonBrowse ) + { + m_pMaterialSubPanel->Browse( this, CMaterialSubPanel::kBlue ); + } + else if ( pPanel == m_pNormalTextureFileLocation->m_pButtonBrowse ) + { + m_pMaterialSubPanel->Browse( this, CMaterialSubPanel::kNormal ); + } +} + + +//============================================================================= +// +//============================================================================= +CMaterialSubPanel::CMaterialSubPanel( vgui::Panel *pParent, const char *pszName, const char *pszNextName ) +: BaseClass( pParent, pszName, pszNextName ) +{ + m_pFileOpenStateMachine = new vgui::FileOpenStateMachine( this, this ); + m_pFileOpenStateMachine->AddActionSignalTarget( this ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMaterialSubPanel::InvalidateLayout() +{ + BaseClass::InvalidateLayout(); + m_pPanelListPanel->InvalidateLayout(); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMaterialSubPanel::UpdateGUI() +{ + CItemUploadWizard *pItemUploadWizard = dynamic_cast< CItemUploadWizard * >( GetWizardPanel() ); + if ( !pItemUploadWizard ) + return; + + CAsset &asset = pItemUploadWizard->Asset(); + + int nMaterialCount = m_pPanelListPanel->GetItemCount() / 2; + + CFmtStr sTmp; + + // Add new gui elements & update existing + for ( int i = 0; i < asset.GetTargetVMTCount(); ++i ) + { + if ( i >= nMaterialCount ) + { + AddMaterial(); + nMaterialCount = m_pPanelListPanel->GetItemCount() / 2; + } + + if ( i >= nMaterialCount ) + break; // unrecoverable error + + CTargetVMT *pTargetVmt = asset.GetTargetVMT( i ); + Assert( pTargetVmt ); + + if ( !pTargetVmt ) + continue; + + CVmtEntry *pVmtEntry = dynamic_cast< CVmtEntry * >( m_pPanelListPanel->GetItemPanel( i * 2 ) ); + if ( !pVmtEntry ) + continue; + + CUtlString sMaterialId; + pTargetVmt->GetMaterialId( sMaterialId ); + pVmtEntry->SetMaterialId( sMaterialId.Get() ); + + const bool bCommon = pTargetVmt->GetColorMapCommon(); + + pVmtEntry->m_pCommonRedBlue->SilentActivateItemByRow( bCommon ? 0 : 1 ); + + bool bVisible = true; + + if ( pTargetVmt->GetDuplicate() ) + { + bVisible = false; + + switch ( pTargetVmt->GetMaterialType() ) + { + case CTargetVMT::kInvalidMaterialType: + pVmtEntry->m_pMaterialType->SilentActivateItemByRow( 0 ); + break; + case CTargetVMT::kPrimary: + pVmtEntry->m_pMaterialType->SilentActivateItemByRow( 3 ); + break; + case CTargetVMT::kSecondary: + pVmtEntry->m_pMaterialType->SilentActivateItemByRow( 4 ); + break; + default: + pVmtEntry->m_pMaterialType->ActivateItem( 0 ); + break; + } + } + else + { + switch ( pTargetVmt->GetMaterialType() ) + { + case CTargetVMT::kInvalidMaterialType: + pVmtEntry->m_pMaterialType->SilentActivateItemByRow( 0 ); + break; + case CTargetVMT::kPrimary: + pVmtEntry->m_pMaterialType->SilentActivateItemByRow( 1 ); + break; + case CTargetVMT::kSecondary: + pVmtEntry->m_pMaterialType->SilentActivateItemByRow( 2 ); + break; + default: + pVmtEntry->m_pMaterialType->ActivateItem( 0 ); + break; + } + } + + pVmtEntry->SetItemVisible( pVmtEntry->m_nCommonRedBlueId, bVisible ); + pVmtEntry->SetItemVisible( pVmtEntry->m_nCommonId, bVisible && bCommon ); + pVmtEntry->SetItemVisible( pVmtEntry->m_nRedId, bVisible && !bCommon ); + pVmtEntry->SetItemVisible( pVmtEntry->m_nBlueId, bVisible && !bCommon ); + pVmtEntry->SetItemVisible( pVmtEntry->m_nNormalId, bVisible ); + + bool bColorVisible = false; + + CSmartPtr< CTargetVTF > pCommonTargetVTF = pTargetVmt->GetCommonTargetVTF(); + if ( pCommonTargetVTF.IsValid() ) + { + pVmtEntry->m_pCommonTextureFileLocation->m_pLabel->SetText( pCommonTargetVTF->GetInputFile() ); + if ( pTargetVmt->GetColorMapCommon() && pCommonTargetVTF->HasAlpha() ) + { + bColorVisible = true; + } + } + else + { + pVmtEntry->m_pCommonTextureFileLocation->m_pLabel->SetText( "" ); + bColorVisible = false; + } + + switch ( pTargetVmt->GetColorAlphaType() ) + { + case CTargetVMT::kNoColorAlpha: + pVmtEntry->m_pColorAlpha->SilentActivateItemByRow( CTargetVMT::kNoColorAlpha ); + break; + case CTargetVMT::kTransparency: + pVmtEntry->m_pColorAlpha->SilentActivateItemByRow( CTargetVMT::kTransparency ); + break; + case CTargetVMT::kPaintable: + pVmtEntry->m_pColorAlpha->SilentActivateItemByRow( CTargetVMT::kPaintable ); + break; + case CTargetVMT::kColorSpecPhong: + pVmtEntry->m_pColorAlpha->SilentActivateItemByRow( CTargetVMT::kColorSpecPhong ); + break; + default: + pVmtEntry->m_pColorAlpha->SilentActivateItemByRow( CTargetVMT::kNoColorAlpha ); + break; + } + + CSmartPtr< CTargetVTF > pRedTargetVTF = pTargetVmt->GetRedTargetVTF(); + CSmartPtr< CTargetVTF > pBlueTargetVTF = pTargetVmt->GetBlueTargetVTF(); + if ( pRedTargetVTF.IsValid() ) + { + pVmtEntry->m_pRedTextureFileLocation->m_pLabel->SetText( pRedTargetVTF->GetInputFile() ); + } + else + { + pVmtEntry->m_pRedTextureFileLocation->m_pLabel->SetText( "" ); + } + + if ( pBlueTargetVTF.IsValid() ) + { + pVmtEntry->m_pBlueTextureFileLocation->m_pLabel->SetText( pBlueTargetVTF->GetInputFile() ); + } + else + { + pVmtEntry->m_pBlueTextureFileLocation->m_pLabel->SetText( "" ); + } + + if ( !pTargetVmt->GetColorMapCommon() && pRedTargetVTF.IsValid() && pBlueTargetVTF.IsValid() ) + { + if ( pRedTargetVTF->HasAlpha() && pBlueTargetVTF->HasAlpha() ) + { + bColorVisible = true; + } + } + + pVmtEntry->SetItemVisible( pVmtEntry->m_nColorAlphaId, bVisible && bColorVisible ); + + bool bNormalVisible = false; + + CSmartPtr< CTargetVTF > pNormalTargetVTF = pTargetVmt->GetNormalTargetVTF(); + if ( pNormalTargetVTF.IsValid() ) + { + pVmtEntry->m_pNormalTextureFileLocation->m_pLabel->SetText( pNormalTargetVTF->GetInputFile() ); + if ( pNormalTargetVTF->HasAlpha() ) + { + bNormalVisible = true; + } + } + + switch ( pTargetVmt->GetNormalAlphaType() ) + { + case CTargetVMT::kNoNormalAlpha: + pVmtEntry->m_pNormalAlpha->SilentActivateItemByRow( CTargetVMT::kNoNormalAlpha ); + break; + case CTargetVMT::kNormalSpecPhong: + pVmtEntry->m_pNormalAlpha->SilentActivateItemByRow( CTargetVMT::kNormalSpecPhong ); + break; + default: + pVmtEntry->m_pNormalAlpha->SilentActivateItemByRow( CTargetVMT::kNoNormalAlpha ); + break; + } + + pVmtEntry->SetItemVisible( pVmtEntry->m_nNormalAlphaId, bVisible && bNormalVisible ); + + pVmtEntry->InvalidateLayout(); + } + + // Remove superfluous + while ( ( m_pPanelListPanel->GetItemCount() / 2 ) > asset.GetTargetVMTCount() ) + { + m_pPanelListPanel->RemoveItem( m_pPanelListPanel->GetItemCount() - 1 ); + m_pPanelListPanel->RemoveItem( m_pPanelListPanel->GetItemCount() - 1 ); + } + + InvalidateLayout(); + + UpdateStatus(); +} + + +//----------------------------------------------------------------------------- +// TODO: Set status +//----------------------------------------------------------------------------- +bool CMaterialSubPanel::UpdateStatus() +{ + CFmtStr sTmp; + + int nIndex = 0; + for ( int i = 0; i < m_pPanelListPanel->GetItemCount(); i += 2, ++nIndex ) + { + CVmtEntry *pVmtEntry = dynamic_cast< CVmtEntry * >( m_pPanelListPanel->GetItemPanel( i ) ); + if ( !pVmtEntry ) + continue; + + CTargetVMT *pTargetVMT = GetTargetVMT( pVmtEntry->m_nVmtIndex ); + Assert( pTargetVMT ); + if ( !pTargetVMT ) + continue; + + sTmp.sprintf( "VMT%d", nIndex ); + + CUtlString sMsg; + if ( pTargetVMT->IsOk( sMsg ) ) + { + SetStatus( true, sTmp ); + continue; + } + + if ( sMsg.IsEmpty() ) + { + SetStatus( false, sTmp, "VMT is not valid\n" ); + } + else + { + SetStatus( false, sTmp, sMsg.Get() ); + } + } + + bool bValid = BaseClass::UpdateStatus(); + + return bValid; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMaterialSubPanel::SetupFileOpenDialog( + vgui::FileOpenDialog *pDialog, + bool bOpenFile, + const char *pszFileName, + KeyValues *pContextKeyValues ) +{ + char pszStartingDir[ MAX_PATH ]; + + if ( !vgui::system()->GetRegistryString( + "HKEY_CURRENT_USER\\Software\\Valve\\itemtest\\texture\\opendir", + pszStartingDir, sizeof( pszStartingDir ) ) ) + { + _getcwd( pszStartingDir, ARRAYSIZE( pszStartingDir )); + + CUtlString sVMod; + CUtlString sContentDir; + if ( CItemUpload::GetVMod( sVMod ) && !sVMod.IsEmpty() && CItemUpload::GetContentDir( sContentDir ) && !sContentDir.IsEmpty() && CItemUpload::FileExists( sContentDir.Get() ) ) + { + sContentDir += "/"; + sContentDir += sVMod; + sContentDir += "/materialsrc/models"; + + CUtlString sTmp = sContentDir; + sTmp += "/player"; + + if ( CItemUpload::FileExists( sTmp.Get() ) ) + { + sContentDir = sTmp; + sTmp += "/items"; + + if ( CItemUpload::FileExists( sTmp.Get() ) ) + { + CItemUploadWizard *pItemUploadWizard = dynamic_cast< CItemUploadWizard * >( GetWizardPanel() ); + if ( pItemUploadWizard ) + { + CAsset &asset = pItemUploadWizard->Asset(); + + sContentDir = sTmp; + sTmp += "/"; + sTmp += asset.GetClass(); + } + + // TODO: Add steam id? + + V_FixupPathName( pszStartingDir, ARRAYSIZE( pszStartingDir ), sTmp.Get() ); + } + } + } + } + + pDialog->SetStartDirectoryContext( "itemtest_texture_browser", pszStartingDir ); + + // TODO: Remember the mask the user likes + if ( bOpenFile ) + { + pDialog->AddFilter( "*.tga", "Targa TrueVision File (*.tga)", true, "tga" ); + pDialog->AddFilter( "*.psd", "Photoshop Document (*.psd)", false, "psd" ); + + pDialog->SetTitle( "Open Texture File", true ); + } +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +bool CMaterialSubPanel::OnReadFileFromDisk( + const char *pszFileName, + const char *pszFileFormat, + KeyValues *pContextKeyValues ) +{ + CItemUploadWizard *pItemUploadWizard = dynamic_cast< CItemUploadWizard * >( GetWizardPanel() ); + if ( !pItemUploadWizard ) + return false; + + char szBuf0[ MAX_PATH ]; + char szBuf1[ MAX_PATH ]; + + // Extract path and save to registry to open browser there next time + { + V_strncpy( szBuf0, pszFileName, sizeof( szBuf0 ) ); + V_FixSlashes( szBuf0 ); + V_StripFilename( szBuf0 ); + + _fullpath( szBuf1, szBuf0, ARRAYSIZE( szBuf1 ) ); + + vgui::system()->SetRegistryString( + "HKEY_CURRENT_USER\\Software\\Valve\\itemtest\\texture\\opendir", + szBuf1 ); + } + + // Get the full path + _fullpath( szBuf1, pszFileName, ARRAYSIZE( szBuf1 ) ); + + CAsset &asset = pItemUploadWizard->Asset(); + + CVmtEntry *pVmtEntry = reinterpret_cast< CVmtEntry * >( pContextKeyValues->GetPtr( "pVmtEntry" ) ); + const Browse_t nBrowseType = static_cast< Browse_t >( pContextKeyValues->GetInt( "nBrowseType" ) ); + + bool bReturnVal = false; + + for ( int i = 0; i < m_pPanelListPanel->GetItemCount(); i += 2 ) + { + if ( pVmtEntry == dynamic_cast< CVmtEntry * >( m_pPanelListPanel->GetItemPanel( i ) ) ) + { + const int nVmtIndex = i / 2; + CTargetVMT *pTargetVMT = asset.GetTargetVMT( nVmtIndex ); + if ( pTargetVMT ) + { + bReturnVal = true; + + switch( nBrowseType ) + { + case CMaterialSubPanel::kCommon: + pTargetVMT->SetCommonTargetVTF( szBuf1 ); + break; + case CMaterialSubPanel::kRed: + pTargetVMT->SetRedTargetVTF( szBuf1 ); + break; + case CMaterialSubPanel::kBlue: + pTargetVMT->SetBlueTargetVTF( szBuf1 ); + break; + case CMaterialSubPanel::kNormal: + pTargetVMT->SetNormalTargetVTF( szBuf1 ); + break; + default: + bReturnVal = false; + break; + } + } + break; + } + } + + UpdateGUI(); + + return bReturnVal; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +bool CMaterialSubPanel::OnWriteFileToDisk( + const char *pszFileName, + const char *pszFileFormat, + KeyValues *pContextKeyValues ) +{ + return false; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMaterialSubPanel::Browse( CVmtEntry *pVmtEntry, Browse_t nBrowseType ) +{ + if ( !pVmtEntry ) + return; + + KeyValues *pContextKeyValues = new KeyValues( "FileOpen", "nBrowseType", nBrowseType ); + pContextKeyValues->SetPtr( "pVmtEntry", pVmtEntry ); + m_pFileOpenStateMachine->OpenFile( "geometry", pContextKeyValues ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +CTargetVMT *CMaterialSubPanel::GetTargetVMT( int nTargetVMTIndex ) +{ + CItemUploadWizard *pItemUploadWizard = dynamic_cast< CItemUploadWizard * >( GetWizardPanel() ); + if ( !pItemUploadWizard ) + return NULL; + + return pItemUploadWizard->Asset().GetTargetVMT( nTargetVMTIndex ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMaterialSubPanel::AddMaterial() +{ + const int nIndex = m_pPanelListPanel->GetItemCount() / 2; + + CFmtStr sLabel; + sLabel.sprintf( "#VMT%dLabel", nIndex ); + + vgui::Label *pLabel = new vgui::Label( this, sLabel, sLabel ); + pLabel->SetContentAlignment( vgui::Label::a_center ); + + sLabel.sprintf( "#VMT%dLabel2", nIndex ); + + CVmtEntry *pVmtEntry = new CVmtEntry( this, sLabel, nIndex ); + + pVmtEntry->SetAutoResize( PIN_TOPLEFT, AUTORESIZE_RIGHT, 0, 0, 0, 0 ); + + m_pPanelListPanel->AddItem( pLabel, pVmtEntry ); + + sLabel.sprintf( "vmt%d", nIndex ); + AddStatusPanels( sLabel ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +CItemUploadWizard::CItemUploadWizard( + vgui::Panel *pParent, + const char *pszName ) +: BaseClass( pParent, pszName ) +{ + SetSize( 1024, 768 ); + SetMinimumSize( 640, 480 ); + + vgui::WizardSubPanel *pSubPanel = NULL; + vgui::DHANDLE< vgui::WizardSubPanel > hSubPanel; + + pSubPanel = new CGlobalSubPanel( this, "global", "geometry" ); + pSubPanel->SetVisible( false ); + hSubPanel = pSubPanel; + m_hSubPanelList.AddToTail( hSubPanel ); + + pSubPanel = new CGeometrySubPanel( this, "geometry", "texture" ); + pSubPanel->SetVisible( false ); + hSubPanel = pSubPanel; + m_hSubPanelList.AddToTail( hSubPanel ); + + pSubPanel = new CMaterialSubPanel( this, "texture", "final" ); + pSubPanel->SetVisible( false ); + hSubPanel = pSubPanel; + m_hSubPanelList.AddToTail( hSubPanel ); + + m_pFinalSubPanel = new CFinalSubPanel( this, "final", NULL ); + pSubPanel = m_pFinalSubPanel; + pSubPanel->SetVisible( false ); + hSubPanel = pSubPanel; + m_hSubPanelList.AddToTail( hSubPanel ); + + Run(); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +CItemUploadWizard::~CItemUploadWizard() +{ +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CItemUploadWizard::Run() +{ + vgui::WizardSubPanel *pStartPanel = dynamic_cast< vgui::WizardSubPanel * >( FindChildByName( "global" ) ); + + if ( !pStartPanel ) + { + Error( "Missing CItemUploadWizard global Panel" ); + } + + BaseClass::Run( pStartPanel ); + + MoveToCenterOfScreen(); + Activate(); + + vgui::input()->SetAppModalSurface( GetVPanel() ); + + CGlobalSubPanel *pGlobalSubPanel = dynamic_cast< CGlobalSubPanel * >( pStartPanel ); + if ( pGlobalSubPanel ) + { + pGlobalSubPanel->UpdateStatus(); + } +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CItemUploadWizard::UpdateGUI() +{ + for ( int i = 0; i < m_hSubPanelList.Count(); ++i ) + { + CItemUploadSubPanel *pSubPanel = dynamic_cast< CItemUploadSubPanel * >( m_hSubPanelList.Element( i ).Get() ); + if ( !pSubPanel ) + continue; + + pSubPanel->UpdateGUI(); + } + + CItemUploadSubPanel *pItemUploadSubPanel = dynamic_cast< CItemUploadSubPanel * >( GetCurrentSubPanel() ); + if ( pItemUploadSubPanel ) + { + pItemUploadSubPanel->UpdateStatus(); + } +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CItemUploadWizard::OnFinishButton() +{ + m_pFinalSubPanel->OnZip(); +}
\ No newline at end of file |