initial
This commit is contained in:
243
utils/vrad/vraddll.cpp
Normal file
243
utils/vrad/vraddll.cpp
Normal file
@@ -0,0 +1,243 @@
|
||||
//========= Copyright <20> 1996-2005, 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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user