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
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; |
|
} |
|
|
|
|
|
|