//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// //#include #include "vraddll.h" #include "bsplib.h" #include "vrad.h" #include "map_shared.h" #include "lightmap.h" #include "threads.h" static CUtlVector g_LastGoodLightData; static CUtlVector 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; }