Team Fortress 2 Source Code as on 22/4/2020
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.
 
 
 
 
 
 

243 lines
4.9 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
//#include <strstrea.h>
#include "vraddll.h"
#include "bsplib.h"
#include "vrad.h"
#include "map_shared.h"
#include "lightmap.h"
#include "threads.h"
static CUtlVector<unsigned char> g_LastGoodLightData;
static CUtlVector<unsigned char> g_FacesTouched;
static CVRadDLL g_VRadDLL;
EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CVRadDLL, IVRadDLL, VRAD_INTERFACE_VERSION, g_VRadDLL );
EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CVRadDLL, ILaunchableDLL, LAUNCHABLE_DLL_INTERFACE_VERSION, g_VRadDLL );
// ---------------------------------------------------------------------------- //
// temporary static array data size tracking
// original data size = 143 megs
// - converting ddispindices, ddispverts, g_dispinfo, and dlightdata to CUtlVector
// - 51 megs
// ---------------------------------------------------------------------------- //
class dat
{
public:
char *name;
int size;
};
#define DATENTRY(name) {#name, sizeof(name)}
dat g_Dats[] =
{
DATENTRY(dmodels),
DATENTRY(dvisdata),
DATENTRY(dlightdataLDR),
DATENTRY(dlightdataHDR),
DATENTRY(dentdata),
DATENTRY(dleafs),
DATENTRY(dplanes),
DATENTRY(dvertexes),
DATENTRY(g_vertnormalindices),
DATENTRY(g_vertnormals),
DATENTRY(texinfo),
DATENTRY(dtexdata),
DATENTRY(g_dispinfo),
DATENTRY(dorigfaces),
DATENTRY(g_primitives),
DATENTRY(g_primverts),
DATENTRY(g_primindices),
DATENTRY(dfaces),
DATENTRY(dedges),
DATENTRY(dleaffaces),
DATENTRY(dleafbrushes),
DATENTRY(dsurfedges),
DATENTRY(dbrushes),
DATENTRY(dbrushsides),
DATENTRY(dareas),
DATENTRY(dareaportals),
DATENTRY(dworldlights),
DATENTRY(dleafwaterdata),
DATENTRY(g_ClipPortalVerts),
DATENTRY(g_CubemapSamples),
DATENTRY(g_TexDataStringData),
DATENTRY(g_TexDataStringTable),
DATENTRY(g_Overlays)
};
int CalcDatSize()
{
int ret = 0;
int count = sizeof( g_Dats ) / sizeof( g_Dats[0] );
int i;
for( i=1; i < count; i++ )
{
if( g_Dats[i-1].size > g_Dats[i].size )
{
dat temp = g_Dats[i-1];
g_Dats[i-1] = g_Dats[i];
g_Dats[i] = temp;
if( i > 1 )
i -= 2;
else
i -= 1;
}
}
for( i=0; i < count; i++ )
ret += g_Dats[i].size;
return ret;
}
int g_TotalDatSize = CalcDatSize();
int CVRadDLL::main( int argc, char **argv )
{
return VRAD_Main( argc, argv );
}
bool CVRadDLL::Init( char const *pFilename )
{
VRAD_Init();
// Set options and run vrad startup code.
do_fast = true;
g_bLowPriorityThreads = true;
g_pIncremental = GetIncremental();
VRAD_LoadBSP( pFilename );
return true;
}
void CVRadDLL::Release()
{
}
void CVRadDLL::GetBSPInfo( CBSPInfo *pInfo )
{
pInfo->dlightdata = pdlightdata->Base();
pInfo->lightdatasize = pdlightdata->Count();
pInfo->dfaces = dfaces;
pInfo->m_pFacesTouched = g_FacesTouched.Base();
pInfo->numfaces = numfaces;
pInfo->dvertexes = dvertexes;
pInfo->numvertexes = numvertexes;
pInfo->dedges = dedges;
pInfo->numedges = numedges;
pInfo->dsurfedges = dsurfedges;
pInfo->numsurfedges = numsurfedges;
pInfo->texinfo = texinfo.Base();
pInfo->numtexinfo = texinfo.Count();
pInfo->g_dispinfo = g_dispinfo.Base();
pInfo->g_numdispinfo = g_dispinfo.Count();
pInfo->dtexdata = dtexdata;
pInfo->numtexdata = numtexdata;
pInfo->texDataStringData = g_TexDataStringData.Base();
pInfo->nTexDataStringData = g_TexDataStringData.Count();
pInfo->texDataStringTable = g_TexDataStringTable.Base();
pInfo->nTexDataStringTable = g_TexDataStringTable.Count();
}
bool CVRadDLL::DoIncrementalLight( char const *pVMFFile )
{
char tempPath[MAX_PATH], tempFilename[MAX_PATH];
GetTempPath( sizeof( tempPath ), tempPath );
GetTempFileName( tempPath, "vmf_entities_", 0, tempFilename );
FileHandle_t fp = g_pFileSystem->Open( tempFilename, "wb" );
if( !fp )
return false;
g_pFileSystem->Write( pVMFFile, strlen(pVMFFile)+1, fp );
g_pFileSystem->Close( fp );
// Parse the new entities.
if( !LoadEntsFromMapFile( tempFilename ) )
return false;
// Create lights.
CreateDirectLights();
// set up sky cameras
ProcessSkyCameras();
g_bInterrupt = false;
if( RadWorld_Go() )
{
// Save off the last finished lighting results for the BSP.
g_LastGoodLightData.CopyArray( pdlightdata->Base(), pdlightdata->Count() );
if( g_pIncremental )
g_pIncremental->GetFacesTouched( g_FacesTouched );
return true;
}
else
{
g_iCurFace = 0;
return false;
}
}
bool CVRadDLL::Serialize()
{
if( !g_pIncremental )
return false;
if( g_LastGoodLightData.Count() > 0 )
{
pdlightdata->CopyArray( g_LastGoodLightData.Base(), g_LastGoodLightData.Count() );
if( g_pIncremental->Serialize() )
{
// Delete this so it doesn't keep re-saving it.
g_LastGoodLightData.Purge();
return true;
}
}
return false;
}
float CVRadDLL::GetPercentComplete()
{
return (float)g_iCurFace / numfaces;
}
void CVRadDLL::Interrupt()
{
g_bInterrupt = true;
}