int Open(lua_State *L) { ml_Lua = Lua(); OldSpew = GetSpewOutputFunc(); SpewOutputFunc(NewSpew); ml_Lua->SetGlobal("SPEW_MESSAGE", (float)SPEW_MESSAGE); ml_Lua->SetGlobal("SPEW_WARNING", (float)SPEW_WARNING); ml_Lua->SetGlobal("SPEW_ASSERT", (float)SPEW_ASSERT); ml_Lua->SetGlobal("SPEW_ERROR", (float)SPEW_ERROR); ml_Lua->SetGlobal("SPEW_LOG", (float)SPEW_LOG); ml_Lua->SetGlobal("SPEW_TYPE_COUNT", (float)SPEW_TYPE_COUNT); ml_Lua->SetGlobal("SPEW_DEBUGGER", (float)SPEW_DEBUGGER); ml_Lua->SetGlobal("SPEW_CONTINUE", (float)SPEW_CONTINUE); ml_Lua->SetGlobal("SPEW_TYPE_COUNT", (float)SPEW_TYPE_COUNT); ml_Lua->SetGlobal("SPEW_ABORT", (float)SPEW_ABORT); ml_Lua->NewGlobalTable("simplespew"); ILuaObject* simplespew = ml_Lua->GetGlobal("simplespew"); simplespew->SetMember("Remove", RemoveSpew); simplespew->UnReference(); AddRemoveHook("ShutDown"); AddRemoveHook("OnConfirmQuit"); //Extras return 0; }
virtual void OnEnable() override { f = fopen("spewlog.txt", "w"); RealOutputFunc = GetSpewOutputFunc(); SpewOutputFunc(&MyOutputFunc); }
void SpewPerfStats( studiohdr_t *pStudioHdr, const char *pFilename, unsigned int flags ) { char fileName[260]; vertexFileHeader_t *pNewVvdHdr; vertexFileHeader_t *pVvdHdr = 0; OptimizedModel::FileHeader_t *pVtxHdr = 0; studiohwdata_t studioHWData; int vvdSize = 0; const char *prefix[] = {".dx80.vtx", ".dx90.vtx", ".sw.vtx"}; s_pSavedSpewFunc = NULL; if( !( flags & SPEWPERFSTATS_SHOWSTUDIORENDERWARNINGS ) ) { s_pSavedSpewFunc = GetSpewOutputFunc(); SpewOutputFunc( NullSpewOutputFunc ); } // no stats on these if (!pStudioHdr->numbodyparts) return; // Need to update the render config to spew perf stats. UpdateStudioRenderConfig(); // persist the vvd data Q_StripExtension( pFilename, fileName, sizeof( fileName ) ); strcat( fileName, ".vvd" ); if (FileExists( fileName )) { vvdSize = LoadFile( fileName, (void**)&pVvdHdr ); } else { MdlError( "Could not open '%s'\n", fileName ); } // validate header if (pVvdHdr->id != MODEL_VERTEX_FILE_ID) { MdlError( "Bad id for '%s' (got %d expected %d)\n", fileName, pVvdHdr->id, MODEL_VERTEX_FILE_ID); } if (pVvdHdr->version != MODEL_VERTEX_FILE_VERSION) { MdlError( "Bad version for '%s' (got %d expected %d)\n", fileName, pVvdHdr->version, MODEL_VERTEX_FILE_VERSION); } if (pVvdHdr->checksum != pStudioHdr->checksum) { MdlError( "Bad checksum for '%s' (got %d expected %d)\n", fileName, pVvdHdr->checksum, pStudioHdr->checksum); } if (pVvdHdr->numFixups) { // need to perform mesh relocation fixups // allocate a new copy pNewVvdHdr = (vertexFileHeader_t *)malloc( vvdSize ); if (!pNewVvdHdr) { MdlError( "Error allocating %d bytes for Vertex File '%s'\n", vvdSize, fileName ); } Studio_LoadVertexes( pVvdHdr, pNewVvdHdr, 0, true ); // discard original free( pVvdHdr ); pVvdHdr = pNewVvdHdr; } // iterate all ???.vtx files for (int j=0; j<sizeof(prefix)/sizeof(prefix[0]); j++) { // make vtx filename Q_StripExtension( pFilename, fileName, sizeof( fileName ) ); strcat( fileName, prefix[j] ); // persist the vtx data if (FileExists(fileName)) { LoadFile( fileName, (void**)&pVtxHdr ); } else { MdlError( "Could not open '%s'\n", fileName ); } // validate header if (pVtxHdr->version != OPTIMIZED_MODEL_FILE_VERSION) { MdlError( "Bad version for '%s' (got %d expected %d)\n", fileName, pVtxHdr->version, OPTIMIZED_MODEL_FILE_VERSION ); } if (pVtxHdr->checkSum != pStudioHdr->checksum) { MdlError( "Bad checksum for '%s' (got %d expected %d)\n", fileName, pVtxHdr->checkSum, pStudioHdr->checksum ); } // studio render will request these through cache interface pStudioHdr->pVertexBase = (void *)pVvdHdr; pStudioHdr->pIndexBase = (void *)pVtxHdr; g_pStudioRender->LoadModel( pStudioHdr, pVtxHdr, &studioHWData ); if( flags & SPEWPERFSTATS_SHOWPERF ) { if( flags & SPEWPERFSTATS_SPREADSHEET ) { printf( "%s,%s,%d,", fileName, prefix[j], studioHWData.m_NumLODs - studioHWData.m_RootLOD ); } else { printf( "\n" ); printf( "Performance Stats: %s\n", fileName ); printf( "------------------\n" ); } } int i; if( flags & SPEWPERFSTATS_SHOWPERF ) { for( i = studioHWData.m_RootLOD; i < studioHWData.m_NumLODs; i++ ) { DrawModelInfo_t drawModelInfo; drawModelInfo.m_Skin = 0; drawModelInfo.m_Body = 0; drawModelInfo.m_HitboxSet = 0; drawModelInfo.m_pClientEntity = 0; drawModelInfo.m_pColorMeshes = 0; drawModelInfo.m_pStudioHdr = pStudioHdr; drawModelInfo.m_pHardwareData = &studioHWData; CUtlBuffer statsOutput( 0, 0, CUtlBuffer::TEXT_BUFFER ); if( !( flags & SPEWPERFSTATS_SPREADSHEET ) ) { printf( "LOD:%d\n", i ); } drawModelInfo.m_Lod = i; DrawModelResults_t results; g_pStudioRender->GetPerfStats( &results, drawModelInfo, &statsOutput ); if( flags & SPEWPERFSTATS_SPREADSHEET ) { printf( "%d,%d,%d,", results.m_ActualTriCount, results.m_NumBatches, results.m_NumMaterials ); } else { printf( " actual tris:%d\n", ( int )results.m_ActualTriCount ); printf( " texture memory bytes: %d (only valid in a rendering app)\n", ( int )results.m_TextureMemoryBytes ); printf( ( char * )statsOutput.Base() ); } } if( flags & SPEWPERFSTATS_SPREADSHEET ) { printf( "\n" ); } } g_pStudioRender->UnloadModel( &studioHWData ); free(pVtxHdr); } if (pVvdHdr) free(pVvdHdr); if( !( flags & SPEWPERFSTATS_SHOWSTUDIORENDERWARNINGS ) ) { SpewOutputFunc( s_pSavedSpewFunc ); } }