Files
FC1/Editor/LevelInfo.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

153 lines
4.2 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2002.
// -------------------------------------------------------------------------
// File name: levelinfo.cpp
// Version: v1.00
// Created: 4/6/2003 by Timur.
// Compilers: Visual Studio.NET
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "LevelInfo.h"
#include "Objects\ObjectManager.h"
#include "Material\MaterialManager.h"
#include "Heightmap.h"
#include "VegetationMap.h"
//////////////////////////////////////////////////////////////////////////
CLevelInfo::CLevelInfo()
{
m_pReport = GetIEditor()->GetErrorReport();
}
//////////////////////////////////////////////////////////////////////////
void CLevelInfo::SaveLevelResources( const CString &toPath )
{
}
//////////////////////////////////////////////////////////////////////////
void CLevelInfo::Validate()
{
m_pReport->Clear();
m_pReport->SetImmidiateMode(false);
// Validate level.
GetIEditor()->GetHeightmap()->GetVegetationMap()->Validate( *m_pReport );
ValidateObjects();
ValidateMaterials();
if (m_pReport->GetErrorCount() == 0)
{
AfxMessageBox( _T("No Errors Found") );
}
else
m_pReport->Display();
}
//////////////////////////////////////////////////////////////////////////
void CLevelInfo::ValidateObjects()
{
CWaitCursor cursor;
// Validate all objects
CBaseObjectsArray objects;
GetIEditor()->GetObjectManager()->GetObjects( objects );
int i;
CLogFile::WriteLine( "Validating Objects..." );
for (i = 0; i < objects.size(); i++)
{
CBaseObject *pObject = objects[i];
m_pReport->SetCurrentValidatorObject( pObject );
pObject->Validate( m_pReport );
CUsedResources rs;
pObject->GatherUsedResources( rs );
rs.Validate( m_pReport );
m_pReport->SetCurrentValidatorObject( NULL );
}
CLogFile::WriteLine( "Validating Duplicate Objects..." );
//////////////////////////////////////////////////////////////////////////
// Find duplicate objects, Same objects with same transform.
// Use simple grid parition for speed up check.
//////////////////////////////////////////////////////////////////////////
int gridSize = 256;
SSectorInfo si;
GetIEditor()->GetHeightmap()->GetSectorsInfo( si );
float worldSize = si.numSectors * si.sectorSize;
float fGridToWorld = worldSize / gridSize;
// Put all objects into parition grid.
std::vector<std::list<CBaseObject*> > grid;
grid.resize( gridSize*gridSize );
// Put objects to grid.
for (i = 0; i < objects.size(); i++)
{
CBaseObject *pObject = objects[i];
Vec3 pos = pObject->GetWorldPos();
int px = ftoi( pos.x/fGridToWorld );
int py = ftoi( pos.y/fGridToWorld );
if (px < 0) px = 0;
if (py < 0) py = 0;
if (px >= gridSize) px = gridSize-1;
if (py >= gridSize) py = gridSize-1;
grid[py*gridSize + px].push_back( pObject );
}
std::list<CBaseObject*>::iterator it1,it2;
// Check objects in grid.
for (i = 0; i < gridSize*gridSize; i++)
{
std::list<CBaseObject*>::iterator first = grid[i].begin();
std::list<CBaseObject*>::iterator last = grid[i].end();
for (it1 = first; it1 != last; ++it1)
for (it2 = first; it2 != last; ++it2)
{
if (it1 != it2)
{
// Check if same object.
CBaseObject *p1 = *it1;
CBaseObject *p2 = *it2;
if (p1->GetClassDesc() == p2->GetClassDesc())
{
// Same class.
if (p1->GetWorldPos() == p2->GetWorldPos() && p1->GetAngles() == p2->GetAngles() && p1->GetScale() == p2->GetScale())
{
// Same transformation
// Check if objects are really same.
if (p1->IsSimilarObject(p2))
{
// Report duplicate object.
CErrorRecord err;
err.error.Format( "Duplicate object detected %s",(const char*)p1->GetName() );
err.pObject = p1;
err.severity = CErrorRecord::ESEVERITY_WARNING;
m_pReport->ReportError( err );
}
}
}
}
}
}
}
//////////////////////////////////////////////////////////////////////////
void CLevelInfo::ValidateMaterials()
{
// Validate all objects
CBaseObjectsArray objects;
GetIEditor()->GetMaterialManager()->Validate();
}