You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
4.6 KiB
177 lines
4.6 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include "stdafx.h" |
|
#include "MapDefs.h" |
|
#include "MapGroup.h" |
|
#include "SaveInfo.h" |
|
#include "hammer.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include <tier0/memdbgon.h> |
|
|
|
|
|
IMPLEMENT_MAPCLASS(CMapGroup) |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Sets the new child's color to our own. |
|
// Input : pChild - Object being added to this group. |
|
//----------------------------------------------------------------------------- |
|
void CMapGroup::AddChild(CMapClass *pChild) |
|
{ |
|
pChild->SetRenderColor(r,g,b); |
|
CMapClass::AddChild(pChild); |
|
Vector2D mins, maxs; |
|
GetRenderLogicalBox(mins, maxs); |
|
m_vecLogicalPosition = ( mins + maxs ) / 2; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *pobj - |
|
// Output : CMapClass * |
|
//----------------------------------------------------------------------------- |
|
CMapClass *CMapGroup::CopyFrom(CMapClass *pobj, bool bUpdateDependencies) |
|
{ |
|
return(CMapClass::CopyFrom(pobj, bUpdateDependencies)); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Output : CMapClass * |
|
//----------------------------------------------------------------------------- |
|
CMapClass *CMapGroup::Copy(bool bUpdateDependencies) |
|
{ |
|
CMapGroup *pNew = new CMapGroup; |
|
return(pNew->CopyFrom(this, bUpdateDependencies)); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Returns a string describing this group. |
|
//----------------------------------------------------------------------------- |
|
const char* CMapGroup::GetDescription(void) |
|
{ |
|
static char szBuf[128]; |
|
sprintf(szBuf, "group of %d objects", m_Children.Count()); |
|
return(szBuf); |
|
} |
|
|
|
|
|
void CMapGroup::SetLogicalPosition( const Vector2D &vecPosition ) |
|
{ |
|
if ( ( m_vecLogicalPosition.x != COORD_NOTINIT ) |
|
&& ( m_vecLogicalPosition.y != COORD_NOTINIT ) |
|
&& ( vecPosition != m_vecLogicalPosition ) ) |
|
{ |
|
Vector2D vecDelta = vecPosition - m_vecLogicalPosition; |
|
|
|
FOR_EACH_OBJ( m_Children, pos ) |
|
{ |
|
CMapClass *pobj = m_Children[pos]; |
|
// update logical bounds |
|
pobj->SetLogicalPosition( pobj->GetLogicalPosition() + vecDelta ); |
|
} |
|
|
|
} |
|
m_vecLogicalPosition = vecPosition; |
|
} |
|
|
|
const Vector2D& CMapGroup::GetLogicalPosition() |
|
{ |
|
return m_vecLogicalPosition; |
|
} |
|
|
|
void CMapGroup::GetRenderLogicalBox( Vector2D &mins, Vector2D &maxs ) |
|
{ |
|
mins.Init( COORD_NOTINIT, COORD_NOTINIT ); |
|
maxs.Init( -COORD_NOTINIT, -COORD_NOTINIT ); |
|
|
|
FOR_EACH_OBJ( m_Children, pos ) |
|
{ |
|
CMapClass *pobj = m_Children[pos]; |
|
// update logical bounds |
|
Vector2D logicalMins,logicalMaxs; |
|
pobj->GetRenderLogicalBox( logicalMins, logicalMaxs ); |
|
mins = mins.Min(logicalMins); |
|
maxs = maxs.Max(logicalMaxs); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *pFile - |
|
// Output : ChunkFileResult_t |
|
//----------------------------------------------------------------------------- |
|
ChunkFileResult_t CMapGroup::LoadVMF(CChunkFile *pFile) |
|
{ |
|
CChunkHandlerMap Handlers; |
|
Handlers.AddHandler("editor", (ChunkHandler_t)CMapClass::LoadEditorCallback, this); |
|
|
|
pFile->PushHandlers(&Handlers); |
|
ChunkFileResult_t eResult = pFile->ReadChunk((KeyHandler_t)CMapClass::LoadEditorKeyCallback, this); |
|
pFile->PopHandlers(); |
|
|
|
return(eResult); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *pFile - |
|
// Output : ChunkFileResult_t |
|
//----------------------------------------------------------------------------- |
|
ChunkFileResult_t CMapGroup::SaveVMF(CChunkFile *pFile, CSaveInfo *pSaveInfo) |
|
{ |
|
// |
|
// Check rules before saving this object. |
|
// |
|
if (!pSaveInfo->ShouldSaveObject(this)) |
|
{ |
|
return(ChunkFile_Ok); |
|
} |
|
|
|
ChunkFileResult_t eResult = pFile->BeginChunk("group"); |
|
|
|
// |
|
// Save the group's ID. |
|
// |
|
if (eResult == ChunkFile_Ok) |
|
{ |
|
eResult = pFile->WriteKeyValueInt("id", GetID()); |
|
} |
|
|
|
if (eResult == ChunkFile_Ok) |
|
{ |
|
eResult = CMapClass::SaveVMF(pFile, pSaveInfo); |
|
} |
|
|
|
if (eResult == ChunkFile_Ok) |
|
{ |
|
eResult = pFile->EndChunk(); |
|
} |
|
|
|
return(eResult); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Groups don't accept visgroups themselves, they |
|
// Input : *pVisGroup - |
|
//----------------------------------------------------------------------------- |
|
void CMapGroup::AddVisGroup(CVisGroup *pVisGroup) |
|
{ |
|
FOR_EACH_OBJ( m_Children, pos ) |
|
{ |
|
m_Children[pos]->AddVisGroup( pVisGroup ); |
|
} |
|
} |
|
|
|
|