123
This commit is contained in:
153
Editor/LevelInfo.cpp
Normal file
153
Editor/LevelInfo.cpp
Normal file
@@ -0,0 +1,153 @@
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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();
|
||||
}
|
||||
Reference in New Issue
Block a user