This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Tools/LevelEdit/VisLog.cpp

240 lines
6.5 KiB
C++

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/***********************************************************************************************
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
***********************************************************************************************
* *
* Project Name : LevelEdit *
* *
* $Archive:: /Commando/Code/Tools/LevelEdit/VisLog.cpp $*
* *
* Author:: Patrick Smith *
* *
* $Modtime:: 5/22/01 9:15a $*
* *
* $Revision:: 5 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "StdAfx.H"
#include "VisLog.H"
#include "Utils.H"
#include "ChunkIO.H"
enum
{
LOG_CHUNK_VIS = 0x00000000,
LOG_CHUNK_VIS_HEADER = 0x00000100,
LEV_CHUNK_VIS_POINT_INFO = 0x00000102,
};
typedef struct
{
uint32 version;
uint32 count;
uint32 reserved[4];
} VIS_ERROR_HEADER;
/*typedef struct
{
Matrix3D transform;
float backface_fraction;
int status[6];
int direction_bits;
int current_direction;
uint32 Reserved[4];
} VIS_ERROR_INFO;*/
static const uint32 CURRENT_VERSION = 0x00010000;
//////////////////////////////////////////////////////////////////////////////////
//
// VisLogClass
//
//////////////////////////////////////////////////////////////////////////////////
VisLogClass::VisLogClass (void)
{
m_ErrorList.Set_Growth_Step (5000);
return ;
}
//////////////////////////////////////////////////////////////////////////////////
//
// ~VisLogClass
//
//////////////////////////////////////////////////////////////////////////////////
VisLogClass::~VisLogClass (void)
{
Reset_Log ();
return ;
}
//////////////////////////////////////////////////////////////////////////////////
//
// Reset_Log
//
//////////////////////////////////////////////////////////////////////////////////
void
VisLogClass::Reset_Log (void)
{
//
// Delete all the vis samples
//
for (int index = 0; index < m_ErrorList.Count (); index ++) {
VisSampleClass *vis_sample = m_ErrorList[index];
SAFE_DELETE (vis_sample);
}
m_ErrorList.Delete_All ();
return ;
}
//////////////////////////////////////////////////////////////////////////////////
//
// Log_Sample
//
//////////////////////////////////////////////////////////////////////////////////
void
VisLogClass::Log_Sample (const VisSampleClass &vis_sample)
{
//
// If this sample is either a leak or an overflow, then log it
// for reference later.
//
/*if ( vis_sample.Status == VIS_STATUS_BACKFACE_LEAK ||
vis_sample.Status == VIS_STATUS_BACKFACE_OVERFLOW ||
vis_sample.Status == VIS_STATUS_OK) {*/
//
// Add this sample to our list
//
if (m_ErrorList.Count () < 5000) {
VisSampleClass *new_sample = new VisSampleClass (vis_sample);
m_ErrorList.Add (new_sample);
}
//}
return ;
}
//////////////////////////////////////////////////////////////////////////////////
//
// Load
//
//////////////////////////////////////////////////////////////////////////////////
bool
VisLogClass::Load (ChunkLoadClass &chunk_load)
{
bool retval = chunk_load.Open_Chunk ();
if (retval) {
bool close_both = false;
//
// Which chunk is this?
//
switch (chunk_load.Cur_Chunk_ID ())
{
case LOG_CHUNK_VIS:
close_both = chunk_load.Open_Chunk ();
case LOG_CHUNK_VIS_HEADER:
{
VIS_ERROR_HEADER header = { 0 };
retval &= (chunk_load.Read (&header, sizeof (header)) == sizeof (header));
//
// Read the list of points from the chunk
//
for (uint32 index = 0; (index < header.count) && retval; index ++) {
VisSampleClass sample;
retval &= sample.Load (chunk_load);
//
// Add this sample to the log
//
if (retval) {
Log_Sample (sample);
}
}
}
break;
default:
ASSERT (0);
break;
}
//
// Close the chunks
//
chunk_load.Close_Chunk ();
if (close_both) {
chunk_load.Close_Chunk ();
}
}
return retval;
}
//////////////////////////////////////////////////////////////////////////////////
//
// Save
//
//////////////////////////////////////////////////////////////////////////////////
bool
VisLogClass::Save (ChunkSaveClass &chunk_save)
{
bool retval = false;
chunk_save.Begin_Chunk (LOG_CHUNK_VIS);
chunk_save.Begin_Chunk (LOG_CHUNK_VIS_HEADER);
//
// Write the header out to the chunk
//
VIS_ERROR_HEADER header = { 0 };
header.version = CURRENT_VERSION;
header.count = m_ErrorList.Count ();
retval = (chunk_save.Write (&header, sizeof (header)) == sizeof (header));
//
// Now write each of the points to the chunk
//
for (int index = 0; (index < m_ErrorList.Count ()) && retval; index ++) {
VisSampleClass *sample = m_ErrorList[index];
retval &= sample->Save (chunk_save);
}
chunk_save.End_Chunk ();
chunk_save.End_Chunk ();
return retval;
}