diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /mp/src/utils/vrad/vraddll.cpp | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/utils/vrad/vraddll.cpp')
| -rw-r--r-- | mp/src/utils/vrad/vraddll.cpp | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/mp/src/utils/vrad/vraddll.cpp b/mp/src/utils/vrad/vraddll.cpp new file mode 100644 index 00000000..87f8d7fc --- /dev/null +++ b/mp/src/utils/vrad/vraddll.cpp @@ -0,0 +1,243 @@ +//========= 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;
+}
+
+
|