summaryrefslogtreecommitdiff
path: root/hammer/objectbar.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/objectbar.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'hammer/objectbar.cpp')
-rw-r--r--hammer/objectbar.cpp1041
1 files changed, 1041 insertions, 0 deletions
diff --git a/hammer/objectbar.cpp b/hammer/objectbar.cpp
new file mode 100644
index 0000000..c4df314
--- /dev/null
+++ b/hammer/objectbar.cpp
@@ -0,0 +1,1041 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================
+
+#include "stdafx.h"
+#include "hammer.h"
+#include "ObjectBar.h"
+#include "Options.h"
+#include "ControlBarIDs.h"
+#include "Prefabs.h"
+#include "Prefab3D.h"
+#include "StockSolids.h"
+#include "mainfrm.h"
+#include "MapSolid.h"
+#include "MapWorld.h"
+#include "MapDoc.h"
+#include "GlobalFunctions.h"
+#include "ArchDlg.h"
+#include "TorusDlg.h"
+#include "ToolManager.h"
+#include "mathlib/vector.h"
+#include "mapview2d.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+
+#pragma warning( disable : 4355 )
+
+
+CMapClass *CreateArch(BoundBox *pBox, float fStartAngle, int iSides, float fArc,
+ int iWallWidth, int iAddHeight, BOOL bPreview);
+
+CMapClass *CreateTorus(BoundBox *pBox, float fStartAngle, int iSides, float fArc, int iWallWidth, float flCrossSectionalRadius,
+ float fRotationStartAngle, int iRotationSides, float fRotationArc, int iAddHeight, BOOL bPreview);
+
+
+static int _iNewObjIndex = 0;
+static char _szNewObjName[128];
+
+struct SolidTypeInfo_t
+{
+ LPCTSTR pszName;
+ UINT nFaces;
+ UINT nFacesMin;
+ UINT nFacesMax;
+ bool bEnableFaceControl;
+};
+
+
+SolidTypeInfo_t SolidTypes[] =
+{
+ {"block", 0, 6, 6, false},
+ {"wedge", 0, 5, 5, false},
+ {"cylinder", 8, 3, 32, true},
+ {"spike", 4, 3, 32, true},
+ {"sphere", 8, 3, 16, true},
+ {"arch", 8, 3, 128, true},
+ {"torus", 0, 4, 128, false},
+};
+
+
+BEGIN_MESSAGE_MAP(CObjectBar, CHammerBar)
+ ON_UPDATE_COMMAND_UI(IDC_CREATELIST, UpdateControl)
+ ON_UPDATE_COMMAND_UI(IDC_CATEGORYLIST, UpdateControl)
+ ON_UPDATE_COMMAND_UI(IDC_FACES, UpdateFaceControl)
+ ON_UPDATE_COMMAND_UI(IDC_FACESSPIN, UpdateFaceControl)
+ ON_UPDATE_COMMAND_UI(ID_TOOLS_CREATEPREFAB, UpdateControl)
+ ON_UPDATE_COMMAND_UI(ID_CREATEOBJECT, UpdateControl)
+ ON_CBN_SELCHANGE(IDC_CATEGORYLIST, OnChangeCategory)
+END_MESSAGE_MAP()
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Get the index of the specified solid type.
+//-----------------------------------------------------------------------------
+static int FindSolidType( const char *pName )
+{
+ for ( int i=0; i < ARRAYSIZE( SolidTypes ); i++ )
+ {
+ if ( Q_stricmp( pName, SolidTypes[i].pszName ) == 0 )
+ return i;
+ }
+ return -1;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Get the index of the specified GDClass.
+//-----------------------------------------------------------------------------
+static int FindGameDataClass( const char *pName )
+{
+ extern GameData *pGD;
+ if( pGD != NULL )
+ {
+ int nCount = pGD->GetClassCount();
+ for (int i = 0; i < nCount; i++)
+ {
+ GDclass *pc = pGD->GetClass(i);
+ if ( Q_stricmp( pName, pc->GetName() ) == 0 )
+ return i;
+ }
+ }
+ return -1;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CObjectBar::CObjectBar()
+ : CHammerBar(), m_CreateList( this )
+{
+ for(int i = 0; i < MAX_PREV_SEL; i++)
+ {
+ m_PrevSel[i].dwGameID = 0;
+ }
+
+ m_dwPrevGameID = (unsigned long)-1;
+}
+
+
+bool CObjectBar::UseRandomYawOnEntityPlacement()
+{
+ return ::SendMessage( ::GetDlgItem( GetSafeHwnd(), IDC_RANDOMYAW ), BM_GETCHECK, 0, 0 ) == BST_CHECKED;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : pDX -
+//-----------------------------------------------------------------------------
+void CObjectBar::DoDataExchange(CDataExchange *pDX)
+{
+ CHammerBar::DoDataExchange(pDX);
+ //{{AFX_DATA_MAP(COP_Entity)
+ DDX_Control(pDX, IDC_CREATELIST, m_CreateList);
+ //}}AFX_DATA_MAP
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Returns the bounds of the current 3D prefab object.
+// Input : *pBox -
+// Output : Returns TRUE on success, FALSE on failure.
+//-----------------------------------------------------------------------------
+BOOL CObjectBar::GetPrefabBounds(BoundBox *pBox)
+{
+ if (ListType != listPrefabs)
+ {
+ return FALSE;
+ }
+
+ CPrefab3D *pPrefab = (CPrefab3D *)CPrefab::FindID(_iNewObjIndex);
+ if (pPrefab != NULL)
+ {
+ if (pPrefab->GetType() != pt3D)
+ {
+ return(FALSE);
+ }
+
+ if (!pPrefab->IsLoaded())
+ {
+ pPrefab->Load();
+ }
+
+ if (!pPrefab->IsLoaded())
+ {
+ return(FALSE);
+ }
+
+ CMapWorld *pWorld = pPrefab->GetWorld();
+
+ Vector mins;
+ Vector maxs;
+ pWorld->GetRender2DBox(mins, maxs);
+ pBox->SetBounds(mins, maxs);
+
+ return(TRUE);
+ }
+
+ return(FALSE);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Find the specified prefab.
+//-----------------------------------------------------------------------------
+CPrefab* CObjectBar::FindPrefabByName( const char *pName )
+{
+ CPrefabLibrary *pLibrary = CPrefabLibrary::FindID( m_CategoryList.GetItemData(m_CategoryList.GetCurSel() ) );
+ if ( pLibrary )
+ {
+ POSITION p = ENUM_START;
+ CPrefab *pPrefab = pLibrary->EnumPrefabs( p );
+ while( pPrefab )
+ {
+ if ( Q_stricmp( pName, pPrefab->GetName() ) == 0 )
+ return pPrefab;
+
+ pPrefab = pLibrary->EnumPrefabs( p );
+ }
+ }
+ return NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : pBox -
+// pAxes -
+// Output :
+//-----------------------------------------------------------------------------
+CMapClass *CObjectBar::CreateInBox(BoundBox *pBox, CMapView *pView)
+{
+ // primitives:
+
+ int axHorz = 0;
+ int axVert = 1;
+
+ CMapView2D *pView2D = dynamic_cast<CMapView2D*>(pView);
+
+ if ( pView2D )
+ {
+ axHorz = pView2D->axHorz;
+ axVert = pView2D->axVert;
+ }
+
+ if(ListType == listPrimitives)
+ {
+ int nFaces;
+ char szBuf[128];
+ m_Faces.GetWindowText(szBuf, 128);
+ nFaces = atoi(szBuf);
+
+ //
+ // The index into the solid types array is stored in the item data.
+ //
+ int nSolidIndex = _iNewObjIndex;
+
+ int nFacesMin = SolidTypes[nSolidIndex].nFacesMin;
+ int nFacesMax = SolidTypes[nSolidIndex].nFacesMax;
+
+ //
+ // Insure that the face count is within legal range (if applicable).
+ //
+ if ((SolidTypes[nSolidIndex].bEnableFaceControl) && (nFaces < nFacesMin || nFaces > nFacesMax))
+ {
+ CString str;
+ str.Format("The face count for a %s must be in the range of %d to %d.",
+ SolidTypes[nSolidIndex].pszName, nFacesMin, nFacesMax);
+ AfxMessageBox(str);
+ return NULL;
+ }
+
+ if(nSolidIndex < 5)
+ {
+ StockSolid *pStock = NULL;
+
+ switch(nSolidIndex)
+ {
+ case 0:
+ pStock = new StockBlock;
+ break;
+ case 1:
+ pStock = new StockWedge;
+ break;
+ case 2:
+ pStock = new StockCylinder;
+ pStock->SetFieldData(StockCylinder::fieldSideCount, nFaces);
+ break;
+ case 3:
+ pStock = new StockSpike;
+ pStock->SetFieldData(StockSpike::fieldSideCount, nFaces);
+ break;
+ default:
+ pStock = new StockSphere;
+ pStock->SetFieldData(StockSphere::fieldSideCount, nFaces);
+ break;
+ }
+
+ // create a solid
+ CMapSolid *pSolid = new CMapSolid;
+ pStock->SetFromBox(pBox);
+ pStock->CreateMapSolid(pSolid, Options.GetTextureAlignment());
+ pSolid->SetTexture(GetDefaultTextureName());
+ delete pStock; // done with you! done!
+
+ // return new solid
+ return pSolid;
+ }
+ else if (nSolidIndex == 5)
+ {
+ // arch
+ CArchDlg dlg(pBox->bmins, pBox->bmaxs);
+ Vector sizebounds;
+ pBox->GetBoundsSize(sizebounds);
+ dlg.m_iSides = nFaces;
+ dlg.SetMaxWallWidth(min((int)sizebounds[axHorz], (int)sizebounds[axVert]));
+ if(dlg.DoModal() != IDOK)
+ return NULL;
+
+ // save values for next use of arch
+ dlg.SaveValues();
+
+ CMapClass *pArch = CreateArch(pBox, dlg.m_fAngle,
+ dlg.m_iSides, dlg.m_fArc, dlg.m_iWallWidth,
+ dlg.m_iAddHeight, FALSE);
+
+ const CMapObjectList &SolidList = *pArch->GetChildren();
+ FOR_EACH_OBJ( SolidList, nSolid )
+ {
+ CMapSolid *pSolid = dynamic_cast<CMapSolid *>(SolidList[nSolid]);
+ if ( pSolid )
+ pSolid->SetTexture(GetDefaultTextureName());
+ }
+
+ return pArch;
+ }
+ else
+ {
+ // Torus
+ CTorusDlg dlg( pBox->bmins, pBox->bmaxs );
+ Vector sizebounds;
+ pBox->GetBoundsSize( sizebounds );
+ dlg.SetMaxWallWidth(min((int)sizebounds[axHorz], (int)sizebounds[axVert]));
+ if(dlg.DoModal() != IDOK)
+ return NULL;
+
+ // save values for next use of arch
+ dlg.SaveValues();
+
+ CMapClass *pTorus = CreateTorus(pBox, dlg.m_fAngle, dlg.m_iSides, dlg.m_fArc, dlg.m_iWallWidth,
+ dlg.GetTorusCrossSectionRadius(),
+ dlg.m_fRotationAngle, dlg.m_iRotationSides, dlg.m_fRotationArc, dlg.m_iAddHeight, FALSE);
+
+ const CMapObjectList &SolidList = *pTorus->GetChildren();
+ FOR_EACH_OBJ( SolidList, nSolid )
+ {
+ CMapSolid *pSolid = dynamic_cast<CMapSolid *>(SolidList[nSolid]);
+ if ( pSolid )
+ pSolid->SetTexture(GetDefaultTextureName());
+ }
+
+ return pTorus;
+ }
+ }
+ else
+ {
+ CPrefab *pPrefab = CPrefab::FindID(_iNewObjIndex);
+ if (pPrefab != NULL)
+ {
+ return(pPrefab->CreateInBox(pBox));
+ }
+ }
+
+ return NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Returns the classname of the default entity for the entity creation tool.
+//-----------------------------------------------------------------------------
+LPCTSTR CObjectBar::GetDefaultEntityClass(void)
+{
+ return _szNewObjName;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CMapClass *CObjectBar::BuildPrefabObjectAtPoint( Vector const &HitPos )
+{
+ //
+ // find prefab
+ //
+ CPrefab3D *pPrefab = ( CPrefab3D* )CPrefab::FindID( _iNewObjIndex );
+ if( !pPrefab )
+ return NULL;
+
+ //
+ // create prefab bounding box -- centered at hit pos
+ //
+ return pPrefab->CreateAtPointAroundOrigin( HitPos );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+bool CObjectBar::IsEntityToolCreatingPrefab( void )
+{
+ if( ( m_iLastTool == TOOL_ENTITY ) && ( m_CategoryList.GetCurSel() != 0 ) )
+ return true;
+
+ return false;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+bool CObjectBar::IsEntityToolCreatingEntity( void )
+{
+ if( ( m_iLastTool == TOOL_ENTITY ) && ( m_CategoryList.GetCurSel() == 0 ) )
+ return true;
+
+ return false;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectBar::OnChangeCategory()
+{
+ switch (ListType)
+ {
+ case listPrimitives:
+ {
+ iBlockSel = -1;
+ LoadBlockItems();
+ break;
+ }
+
+ case listPrefabs:
+ {
+ if (m_iLastTool == TOOL_BLOCK)
+ {
+ iBlockSel = -1;
+ LoadBlockItems();
+ }
+ else if (m_iLastTool == TOOL_ENTITY)
+ {
+ iEntitySel = -1;
+ LoadEntityItems();
+ }
+ break;
+ }
+
+ case listEntities:
+ {
+ iEntitySel = -1;
+ LoadEntityItems();
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+
+ DoHideControls();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : pParentWnd -
+// Output : Returns TRUE on success, FALSE on failure.
+//-----------------------------------------------------------------------------
+BOOL CObjectBar::Create(CWnd *pParentWnd)
+{
+ if (!CHammerBar::Create(pParentWnd, IDD_OBJECTBAR, CBRS_RIGHT, IDCB_OBJECTBAR))
+ {
+ return FALSE;
+ }
+
+ SetWindowText("New Objects");
+
+
+ // set up controls
+
+ // We only want it to return values that are in our list of suggestions.
+ m_CreateList.SubclassDlgItem(IDC_CREATELIST, this);
+ m_CreateList.SetOnlyProvideSuggestions( true );
+
+ m_CategoryList.SubclassDlgItem(IDC_CATEGORYLIST, this);
+ m_Faces.SubclassDlgItem(IDC_FACES, this);
+ m_FacesSpin.SubclassDlgItem(IDC_FACESSPIN, this);
+ m_FacesSpin.SetBuddy(&m_Faces);
+
+ iBlockSel = -1;
+ iEntitySel = -1;
+ m_iLastTool = -1;
+
+ LoadBlockCategories();
+
+ // outta here
+ return TRUE;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Load the category list with the list of primitives and object libraries.
+//-----------------------------------------------------------------------------
+void CObjectBar::LoadBlockCategories( void )
+{
+ m_CategoryList.SetRedraw(FALSE);
+
+ // first item is the primitive list
+ m_CategoryList.ResetContent();
+ m_CategoryList.AddString("Primitives");
+
+ // the next items are the prefab categories (libraries)
+ LoadPrefabCategories();
+
+ // redraw category list
+ m_CategoryList.SetRedraw(TRUE);
+ m_CategoryList.Invalidate();
+
+ // set initial state
+ m_CategoryList.SetCurSel( 0 );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectBar::LoadEntityCategories( void )
+{
+ m_CategoryList.SetRedraw( FALSE );
+
+ // first item is the primitive list
+ m_CategoryList.ResetContent();
+ m_CategoryList.AddString( "Entities" );
+
+ // the next items are the prefab categories (libraries)
+ LoadPrefabCategories();
+
+ // redraw category list
+ m_CategoryList.SetRedraw( TRUE );
+ m_CategoryList.Invalidate();
+
+ // set initial state
+ m_CategoryList.SetCurSel( 0 );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectBar::LoadPrefabCategories( void )
+{
+ //
+ // if a long list -- don't update every time
+ //
+ m_CategoryList.SetRedraw( FALSE );
+
+ //
+ // add all prefab object libraries to the category list
+ //
+ POSITION p = ENUM_START;
+ CPrefabLibrary *pLibrary = CPrefabLibrary::EnumLibraries( p );
+ while( pLibrary )
+ {
+ int iIndex = m_CategoryList.AddString( pLibrary->GetName() );
+ m_CategoryList.SetItemData( iIndex, pLibrary->GetID() );
+ pLibrary = CPrefabLibrary::EnumLibraries( p );
+ }
+
+ m_CategoryList.SetRedraw(TRUE);
+ m_CategoryList.Invalidate();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectBar::LoadBlockItems( void )
+{
+ //
+ // verify the block categories are loaded
+ //
+ if( m_CategoryList.GetCurSel() == CB_ERR )
+ {
+ LoadBlockCategories();
+ }
+
+ //
+ // load primitive items
+ //
+ if( m_CategoryList.GetCurSel() == 0 )
+ {
+ // set list type (primitives)
+ ListType = listPrimitives;
+
+ // set list type (primitives)
+ CUtlVector<CString> suggestions;
+ for( int i = 0; i < sizeof( SolidTypes ) / sizeof( SolidTypes[0] ); i++)
+ suggestions.AddToTail( SolidTypes[i].pszName );
+
+ m_CreateList.SetSuggestions( suggestions );
+ }
+ else
+ {
+ LoadPrefabItems();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectBar::LoadEntityItems( void )
+{
+ //
+ // verify the block categories are loaded
+ //
+ if( m_CategoryList.GetCurSel() == CB_ERR )
+ {
+ LoadEntityCategories();
+ }
+
+ //
+ // load entity items
+ //
+ if( m_CategoryList.GetCurSel() == 0 )
+ {
+ // set list type (markers)???
+ ListType = listEntities;
+
+ CUtlVector<CString> suggestions;
+ extern GameData *pGD;
+ if( pGD != NULL )
+ {
+ int nCount = pGD->GetClassCount();
+ for (int i = 0; i < nCount; i++)
+ {
+ GDclass *pc = pGD->GetClass(i);
+ if( !pc->IsBaseClass() && !pc->IsSolidClass() )
+ {
+ suggestions.AddToTail( pc->GetName() );
+ }
+ }
+ }
+
+ m_CreateList.SetSuggestions( suggestions );
+ }
+ else
+ {
+ LoadPrefabItems();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectBar::LoadPrefabItems( void )
+{
+ // set list type (prefabs)
+ ListType = listPrefabs;
+
+ CUtlVector<CString> suggestions;
+
+ // get the active library and add the prefabs from it
+ CPrefabLibrary *pLibrary = CPrefabLibrary::FindID( m_CategoryList.GetItemData(m_CategoryList.GetCurSel() ) );
+
+ POSITION p = ENUM_START;
+ CPrefab *pPrefab = pLibrary->EnumPrefabs( p );
+ while( pPrefab )
+ {
+ suggestions.AddToTail( pPrefab->GetName() );
+ pPrefab = pLibrary->EnumPrefabs( p );
+ }
+
+ m_CreateList.SetSuggestions( suggestions );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectBar::DoHideControls()
+{
+ // hide controls based on which mode is selected...
+ if(ListType == listPrimitives)
+ {
+ GetDlgItem(ID_INSERTPREFAB_ORIGINAL)->ShowWindow(SW_HIDE);
+ m_Faces.ShowWindow(SW_SHOW);
+ m_FacesSpin.ShowWindow(SW_SHOW);
+ GetDlgItem(IDC_FACESPROMPT)->ShowWindow(SW_SHOW);
+ }
+ else if(ListType == listPrefabs)
+ {
+ m_Faces.ShowWindow(SW_HIDE);
+ m_FacesSpin.ShowWindow(SW_HIDE);
+ GetDlgItem(IDC_FACESPROMPT)->ShowWindow(SW_HIDE);
+ GetDlgItem(ID_INSERTPREFAB_ORIGINAL)->ShowWindow(SW_SHOW);
+ }
+ else if(ListType == listEntities)
+ {
+ m_Faces.ShowWindow(SW_HIDE);
+ m_FacesSpin.ShowWindow(SW_HIDE);
+ GetDlgItem(IDC_FACESPROMPT)->ShowWindow(SW_HIDE);
+ GetDlgItem(ID_INSERTPREFAB_ORIGINAL)->ShowWindow(SW_HIDE);
+ }
+
+ // Show the "random yaw" button?
+ bool bShow = (ListType == listEntities);
+ GetDlgItem( IDC_RANDOMYAW )->ShowWindow( bShow ? SW_SHOW : SW_HIDE );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *pCmdUI -
+//-----------------------------------------------------------------------------
+void CObjectBar::UpdateControl(CCmdUI *pCmdUI)
+{
+ CMapDoc *pDoc = CMapDoc::GetActiveMapDoc();
+
+ switch (pCmdUI->m_nID)
+ {
+ case ID_INSERTPREFAB_ORIGINAL:
+ {
+ pCmdUI->Enable(ListType == listPrefabs);
+ break;
+ }
+
+ case IDC_CREATELIST:
+ case IDC_CATEGORYLIST:
+ {
+ BOOL bEnable = FALSE;
+ if (pDoc)
+ {
+ int nTool = pDoc->GetTools()->GetActiveToolID();
+ if ((nTool == TOOL_ENTITY) || (nTool == TOOL_BLOCK))
+ {
+ bEnable = TRUE;
+ }
+ }
+ pCmdUI->Enable(bEnable);
+ break;
+ }
+
+ default:
+ {
+ pCmdUI->Enable( pDoc ? TRUE : FALSE);
+ break;
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *pWnd -
+// bModifyWnd -
+// Output : Returns TRUE on success, FALSE on failure.
+//-----------------------------------------------------------------------------
+BOOL CObjectBar::EnableFaceControl(CWnd *pWnd, BOOL bModifyWnd)
+{
+ BOOL bEnable = CMapDoc::GetActiveMapDoc() ? TRUE : FALSE;
+
+ if(bEnable)
+ {
+ bEnable = FALSE;
+
+ //
+ // Enable the control only if we are dealing with an object the
+ // that has adjustable faces.
+ //
+ if (ListType == listPrimitives)
+ {
+ int nSolidIndex = iBlockSel;
+ if (SolidTypes[nSolidIndex].bEnableFaceControl)
+ {
+ bEnable = TRUE;
+ }
+ }
+ }
+
+ if(bModifyWnd)
+ pWnd->EnableWindow(bEnable);
+
+ return bEnable;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *pCmdUI -
+//-----------------------------------------------------------------------------
+void CObjectBar::UpdateFaceControl(CCmdUI *pCmdUI)
+{
+ pCmdUI->Enable(EnableFaceControl(GetDlgItem(pCmdUI->m_nID), FALSE));
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Called when a new item has been selected in the combo box.
+//-----------------------------------------------------------------------------
+void CObjectBar::OnTextChanged( const char *pSelection )
+{
+ char szBuf[128];
+
+ switch (ListType)
+ {
+ case listPrimitives:
+ {
+ _iNewObjIndex = FindSolidType( pSelection );
+ Assert( _iNewObjIndex != -1 );
+
+ //
+ // Save current value from the faces edit control. The next time this primitive is
+ // selected the value will be restored.
+ //
+ if (iBlockSel != -1)
+ {
+ int nSolidIndex = iBlockSel;
+ m_Faces.GetWindowText(szBuf, 128);
+ SolidTypes[nSolidIndex].nFaces = atoi(szBuf);
+ }
+ iBlockSel = _iNewObjIndex;
+ break;
+ }
+
+ case listPrefabs:
+ {
+ CPrefab *pPrefab = FindPrefabByName( pSelection );
+ Assert( pPrefab );
+ if ( pPrefab )
+ {
+ _iNewObjIndex = pPrefab->GetID();
+
+ if (m_iLastTool == TOOL_BLOCK )
+ {
+ iBlockSel = _iNewObjIndex;
+ }
+ else if( m_iLastTool == TOOL_ENTITY )
+ {
+ iEntitySel = _iNewObjIndex;
+ }
+ }
+ break;
+ }
+
+ case listEntities:
+ {
+ _iNewObjIndex = FindGameDataClass( pSelection );
+ Assert( _iNewObjIndex != -1 );
+ if ( _iNewObjIndex != -1 )
+ {
+ Q_strncpy( _szNewObjName, pSelection, sizeof( _szNewObjName ) );
+ }
+ break;
+ }
+ }
+
+ if (ListType != listPrimitives)
+ return;
+
+ EnableFaceControl(&m_Faces, TRUE);
+ EnableFaceControl(&m_FacesSpin, TRUE);
+
+ int nSolidIndex = _iNewObjIndex;
+
+ m_FacesSpin.SetRange(SolidTypes[nSolidIndex].nFacesMin, SolidTypes[nSolidIndex].nFacesMax);
+ m_FacesSpin.SetPos(SolidTypes[nSolidIndex].nFaces);
+
+ itoa(SolidTypes[nSolidIndex].nFaces, szBuf, 10);
+ m_Faces.SetWindowText(szBuf);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : dwGameID -
+// piNewIndex -
+// Output :
+//-----------------------------------------------------------------------------
+int CObjectBar::GetPrevSelIndex(DWORD dwGameID, int *piNewIndex)
+{
+ for(int i = 0; i < MAX_PREV_SEL; i++)
+ {
+ if(m_PrevSel[i].dwGameID == 0 && piNewIndex)
+ *piNewIndex = i;
+
+ if(m_PrevSel[i].dwGameID == dwGameID)
+ return i;
+ }
+
+ return -1;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : pMsg -
+// Output : Returns TRUE on success, FALSE on failure.
+//-----------------------------------------------------------------------------
+BOOL CObjectBar::PreTranslateMessage(MSG* pMsg)
+{
+ //
+ // See if the message is a keydown and the current focus window is the
+ // ComboBox in the ObjectBar!
+ //
+ /*static BOOL bRecurse = FALSE;
+
+ if (pMsg->message == WM_KEYDOWN && !bRecurse)
+ {
+ if (GetFocus() == &m_CreateList)
+ {
+ //AfxMessageBox("Ok");
+ bRecurse = TRUE;
+ m_CreateList.SendMessage(WM_CHAR, pMsg->wParam, pMsg->lParam);
+ bRecurse = FALSE;
+ return TRUE;
+ }
+ }
+ */
+ return CHammerBar::PreTranslateMessage(pMsg);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : iTool -
+//-----------------------------------------------------------------------------
+void CObjectBar::UpdateListForTool( int iTool )
+{
+ //
+ // initialize for new "game config"
+ //
+ int iPrevSel = 0;
+ if (m_dwPrevGameID != g_pGameConfig->dwID)
+ {
+ //
+ // save current game id and save
+ //
+ m_dwPrevGameID = g_pGameConfig->dwID;
+ GetPrevSelIndex( g_pGameConfig->dwID, &iPrevSel );
+ m_PrevSel[iPrevSel].dwGameID = g_pGameConfig->dwID;
+
+ m_PrevSel[iPrevSel].block.strCategory = "Primitives";
+ m_PrevSel[iPrevSel].block.strItem = "block";
+
+ m_PrevSel[iPrevSel].entity.strCategory = "Entities";
+ m_PrevSel[iPrevSel].entity.strItem = g_pGameConfig->szDefaultPoint;
+ }
+
+ // get game id previously selected data index
+ iPrevSel = GetPrevSelIndex( m_dwPrevGameID );
+ if (iPrevSel == -1)
+ return;
+
+ //
+ // Save last known selection state for previous tool
+ //
+ if (m_iLastTool == TOOL_BLOCK)
+ {
+ int iCategory = m_CategoryList.GetCurSel();
+ if( iCategory != -1 )
+ {
+ m_CategoryList.GetLBText( iCategory, m_PrevSel[iPrevSel].block.strCategory );
+ m_PrevSel[iPrevSel].block.strItem = m_CreateList.GetCurrentItem();
+ }
+ else
+ {
+ m_PrevSel[iPrevSel].block.strCategory = "";
+ m_PrevSel[iPrevSel].block.strItem = "";
+ }
+ }
+ else if (m_iLastTool == TOOL_ENTITY)
+ {
+ int iCategory = m_CategoryList.GetCurSel();
+ if( iCategory != -1 )
+ {
+ m_CategoryList.GetLBText( iCategory, m_PrevSel[iPrevSel].entity.strCategory );
+ m_PrevSel[iPrevSel].entity.strItem = m_CreateList.GetCurrentItem();
+ }
+ else
+ {
+ m_PrevSel[iPrevSel].entity.strCategory = "";
+ m_PrevSel[iPrevSel].entity.strItem = "";
+ }
+ }
+
+ // save tool for next pass
+ m_iLastTool = iTool;
+
+ //
+ // update new for new tool
+ //
+ if (iTool == TOOL_BLOCK)
+ {
+ //
+ // load block categories and items
+ //
+ LoadBlockCategories();
+ m_CategoryList.SelectString( -1, m_PrevSel[iPrevSel].block.strCategory );
+ LoadBlockItems();
+
+ m_CreateList.SelectItem( m_PrevSel[iPrevSel].block.strItem );
+ OnTextChanged( m_PrevSel[iPrevSel].block.strItem );
+ iBlockSel = FindSolidType( m_PrevSel[iPrevSel].block.strItem );
+ Assert( iBlockSel >= 0 );
+
+ // hide/show appropriate controls
+ DoHideControls();
+
+ //
+ // enable/disable face controls
+ //
+ EnableFaceControl( &m_Faces, TRUE );
+ EnableFaceControl( &m_FacesSpin, TRUE );
+ }
+ else if (iTool == TOOL_ENTITY)
+ {
+ //
+ // load entity categories and items
+ //
+ LoadEntityCategories();
+ m_CategoryList.SelectString( -1, m_PrevSel[iPrevSel].entity.strCategory );
+ LoadEntityItems();
+
+ m_CreateList.SelectItem( m_PrevSel[iPrevSel].entity.strItem );
+ OnTextChanged( m_PrevSel[iPrevSel].entity.strItem );
+ iEntitySel = FindGameDataClass( m_PrevSel[iPrevSel].entity.strItem );
+
+ // hide/show appropriate controls
+ DoHideControls();
+
+ //
+ // enable/disable face controls
+ //
+ EnableFaceControl( &m_Faces, TRUE );
+ EnableFaceControl( &m_FacesSpin, TRUE );
+ }
+ else
+ {
+ m_CategoryList.ResetContent();
+ m_CreateList.Clear();
+ DoHideControls();
+ }
+}