void Scene::GetStatistics(POVMS_Object& parserStats) { struct TimeData final { POV_LONG cpuTime; POV_LONG realTime; size_t samples; TimeData() : cpuTime(0), realTime(0), samples(0) { } }; TimeData timeData[TraceThreadData::kMaxTimeType]; for(std::vector<TraceThreadData*>::iterator i(sceneThreadData.begin()); i != sceneThreadData.end(); i++) { timeData[(*i)->timeType].realTime = max(timeData[(*i)->timeType].realTime, (*i)->realTime); if ((*i)->cpuTime >= 0) timeData[(*i)->timeType].cpuTime += (*i)->cpuTime; else timeData[(*i)->timeType].cpuTime = -1; timeData[(*i)->timeType].samples++; } for(size_t i = TraceThreadData::kUnknownTime; i < TraceThreadData::kMaxTimeType; i++) { if(timeData[i].samples > 0) { POVMS_Object elapsedTime(kPOVObjectClass_ElapsedTime); elapsedTime.SetLong(kPOVAttrib_RealTime, timeData[i].realTime); if (timeData[i].cpuTime >= 0) elapsedTime.SetLong(kPOVAttrib_CPUTime, timeData[i].cpuTime); elapsedTime.SetInt(kPOVAttrib_TimeSamples, POVMSInt(timeData[i].samples)); switch(i) { case TraceThreadData::kParseTime: parserStats.Set(kPOVAttrib_ParseTime, elapsedTime); break; case TraceThreadData::kBoundingTime: parserStats.Set(kPOVAttrib_BoundingTime, elapsedTime); break; } } } parserStats.SetInt(kPOVAttrib_FiniteObjects, sceneData->numberOfFiniteObjects); parserStats.SetInt(kPOVAttrib_InfiniteObjects, sceneData->numberOfInfiniteObjects); parserStats.SetInt(kPOVAttrib_LightSources, POVMSInt(sceneData->lightSources.size())); parserStats.SetInt(kPOVAttrib_Cameras, POVMSInt(sceneData->cameras.size())); if(sceneData->boundingMethod == 2) { parserStats.SetInt(kPOVAttrib_BSPNodes, sceneData->nodes); parserStats.SetInt(kPOVAttrib_BSPSplitNodes, sceneData->splitNodes); parserStats.SetInt(kPOVAttrib_BSPObjectNodes, sceneData->objectNodes); parserStats.SetInt(kPOVAttrib_BSPEmptyNodes, sceneData->emptyNodes); parserStats.SetInt(kPOVAttrib_BSPMaxObjects, sceneData->maxObjects); parserStats.SetFloat(kPOVAttrib_BSPAverageObjects, sceneData->averageObjects); parserStats.SetInt(kPOVAttrib_BSPMaxDepth, sceneData->maxDepth); parserStats.SetFloat(kPOVAttrib_BSPAverageDepth, sceneData->averageDepth); parserStats.SetInt(kPOVAttrib_BSPAborts, sceneData->aborts); parserStats.SetFloat(kPOVAttrib_BSPAverageAborts, sceneData->averageAborts); parserStats.SetFloat(kPOVAttrib_BSPAverageAbortObjects, sceneData->averageAbortObjects); } }