Added ticks to stats display

This commit is contained in:
Robert Osfield 2007-01-23 10:38:23 +00:00
parent 71f307c5b2
commit 1f05b14f4e

View File

@ -95,7 +95,9 @@ public:
_statsType(NO_STATS),
_frameRateChildNum(0),
_viewerChildNum(0),
_sceneChildNum(0) {}
_sceneChildNum(0),
_numBlocks(8),
_blockMultiplier(10000.0) {}
enum StatsType
{
@ -274,15 +276,15 @@ public:
struct BlockDrawCallback : public virtual osg::Drawable::DrawCallback
{
BlockDrawCallback(float xPos, osg::Stats* viewerStats, osg::Stats* stats, const std::string& beginName, const std::string& endName, int frameDelta, int numFrames, double multiplier = 1.0):
BlockDrawCallback(StatsHandler* statsHandler, float xPos, osg::Stats* viewerStats, osg::Stats* stats, const std::string& beginName, const std::string& endName, int frameDelta, int numFrames):
_statsHandler(statsHandler),
_xPos(xPos),
_viewerStats(viewerStats),
_stats(stats),
_beginName(beginName),
_endName(endName),
_frameDelta(frameDelta),
_numFrames(numFrames),
_multiplier(multiplier) {}
_numFrames(numFrames) {}
/** do customized draw code.*/
virtual void drawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable) const
@ -307,16 +309,17 @@ public:
if (_stats->getAttribute( i, _beginName, beginValue) &&
_stats->getAttribute( i, _endName, endValue) )
{
(*vertices)[vi++].x() = _xPos + (beginValue - referenceTime)*_multiplier;
(*vertices)[vi++].x() = _xPos + (beginValue - referenceTime)*_multiplier;
(*vertices)[vi++].x() = _xPos + (endValue - referenceTime)*_multiplier;
(*vertices)[vi++].x() = _xPos + (endValue - referenceTime)*_multiplier;
(*vertices)[vi++].x() = _xPos + (beginValue - referenceTime) * _statsHandler->_blockMultiplier;
(*vertices)[vi++].x() = _xPos + (beginValue - referenceTime) * _statsHandler->_blockMultiplier;
(*vertices)[vi++].x() = _xPos + (endValue - referenceTime) * _statsHandler->_blockMultiplier;
(*vertices)[vi++].x() = _xPos + (endValue - referenceTime) * _statsHandler->_blockMultiplier;
}
}
drawable->drawImplementation(renderInfo);
}
StatsHandler* _statsHandler;
float _xPos;
osg::Stats* _viewerStats;
osg::Stats* _stats;
@ -324,7 +327,6 @@ public:
std::string _endName;
int _frameDelta;
int _numFrames;
double _multiplier;
};
osg::Geometry* createGeometry(const osg::Vec3& pos, float height, const osg::Vec4& colour, unsigned int numBlocks)
@ -335,7 +337,7 @@ public:
osg::Vec3Array* vertices = new osg::Vec3Array;
geometry->setVertexArray(vertices);
vertices->reserve(numBlocks);
vertices->reserve(numBlocks*4);
for(unsigned int i=0; i<numBlocks; ++i)
{
@ -355,6 +357,108 @@ public:
return geometry;
}
struct FrameMarkerDrawCallback : public virtual osg::Drawable::DrawCallback
{
FrameMarkerDrawCallback(StatsHandler* statsHandler, float xPos, osg::Stats* viewerStats, int frameDelta, int numFrames):
_statsHandler(statsHandler),
_xPos(xPos),
_viewerStats(viewerStats),
_frameDelta(frameDelta),
_numFrames(numFrames) {}
/** do customized draw code.*/
virtual void drawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable) const
{
osg::Geometry* geom = (osg::Geometry*)drawable;
osg::Vec3Array* vertices = (osg::Vec3Array*)geom->getVertexArray();
int frameNumber = renderInfo.getState()->getFrameStamp()->getFrameNumber();
int startFrame = frameNumber + _frameDelta - _numFrames + 1;
int endFrame = frameNumber + _frameDelta;
double referenceTime;
if (!_viewerStats->getAttribute( startFrame, "Reference time", referenceTime))
{
return;
}
unsigned int vi = 0;
double currentReferenceTime;
for(int i = startFrame; i <= endFrame; ++i)
{
if (_viewerStats->getAttribute( i, "Reference time", currentReferenceTime))
{
(*vertices)[vi++].x() = _xPos + (currentReferenceTime - referenceTime) * _statsHandler->_blockMultiplier;
(*vertices)[vi++].x() = _xPos + (currentReferenceTime - referenceTime) * _statsHandler->_blockMultiplier;
}
}
drawable->drawImplementation(renderInfo);
}
StatsHandler* _statsHandler;
float _xPos;
osg::Stats* _viewerStats;
std::string _endName;
int _frameDelta;
int _numFrames;
};
osg::Geometry* createFrameMarkers(const osg::Vec3& pos, float height, const osg::Vec4& colour, unsigned int numBlocks)
{
osg::Geometry* geometry = new osg::Geometry;
geometry->setUseDisplayList(false);
osg::Vec3Array* vertices = new osg::Vec3Array;
geometry->setVertexArray(vertices);
vertices->reserve(numBlocks*2);
for(unsigned int i=0; i<numBlocks; ++i)
{
vertices->push_back(pos+osg::Vec3(double(i)*_blockMultiplier*0.01, height, 0.0));
vertices->push_back(pos+osg::Vec3(double(i)*_blockMultiplier*0.01, 0.0, 0.0));
}
osg::Vec4Array* colours = new osg::Vec4Array;
colours->push_back(colour);
geometry->setColorArray(colours);
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
geometry->addPrimitiveSet(new osg::DrawArrays(GL_LINES, 0, numBlocks*2));
return geometry;
}
osg::Geometry* createTick(const osg::Vec3& pos, float height, const osg::Vec4& colour, unsigned int numTicks)
{
osg::Geometry* geometry = new osg::Geometry;
geometry->setUseDisplayList(false);
osg::Vec3Array* vertices = new osg::Vec3Array;
geometry->setVertexArray(vertices);
vertices->reserve(numTicks*2);
for(unsigned int i=0; i<numTicks; ++i)
{
float tickHeight = (i%10) ? height : height * 2.0;
vertices->push_back(pos+osg::Vec3(double(i)*_blockMultiplier*0.001, tickHeight , 0.0));
vertices->push_back(pos+osg::Vec3(double(i)*_blockMultiplier*0.001, 0.0, 0.0));
}
osg::Vec4Array* colours = new osg::Vec4Array;
colours->push_back(colour);
geometry->setColorArray(colours);
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
geometry->addPrimitiveSet(new osg::DrawArrays(GL_LINES, 0, numTicks*2));
return geometry;
}
void setUpScene(osgViewer::Viewer* viewer)
{
_switch = new osg::Switch;
@ -450,6 +554,9 @@ public:
osg::Geode* geode = new osg::Geode();
group->addChild(geode);
float topOfViewerStats = pos.y() + characterSize * 1.5;
{
pos.x() = leftPos;
@ -476,8 +583,8 @@ public:
eventValue->setDrawCallback(new TextDrawCallback(viewer->getStats(),"Event traversal time taken",-1, 1000.0));
pos.x() = startBlocks;
osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorUpdate, 10);
geometry->setDrawCallback(new BlockDrawCallback(startBlocks, viewer->getStats(), viewer->getStats(), "Event traversal begin time", "Event traversal end time", -1, 10, 10000.0));
osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorUpdate, _numBlocks);
geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, viewer->getStats(), viewer->getStats(), "Event traversal begin time", "Event traversal end time", -1, _numBlocks));
geode->addDrawable(geometry);
pos.y() -= characterSize*1.5f;
@ -509,8 +616,8 @@ public:
updateValue->setDrawCallback(new TextDrawCallback(viewer->getStats(),"Update traversal time taken",-1, 1000.0));
pos.x() = startBlocks;
osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorUpdate, 10);
geometry->setDrawCallback(new BlockDrawCallback(startBlocks, viewer->getStats(), viewer->getStats(), "Update traversal begin time", "Update traversal end time", -1, 10, 10000.0));
osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorUpdate, _numBlocks);
geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, viewer->getStats(), viewer->getStats(), "Update traversal begin time", "Update traversal end time", -1, _numBlocks));
geode->addDrawable(geometry);
pos.y() -= characterSize*1.5f;
@ -519,13 +626,34 @@ public:
pos.x() = leftPos;
// add camera stats
for(Cameras::iterator citr = cameras.begin();
citr != cameras.end();
++citr)
{
group->addChild(createCameraStats(font, pos, startBlocks, aquireGPUStats, characterSize, viewer->getStats(), *citr));
}
// add frame ticks
{
osg::Geode* geode = new osg::Geode;
group->addChild(geode);
osg::Vec4 colourTicks(1.0f,1.0f,1.0f, 0.5f);
pos.x() = startBlocks;
pos.y() += characterSize*0.5;
float height = topOfViewerStats - pos.y();
osg::Geometry* ticks = createTick(pos, 5.0f, colourTicks, 100);
geode->addDrawable(ticks);
osg::Geometry* frameMarkers = createFrameMarkers(pos, height, colourTicks, _numBlocks + 1);
frameMarkers->setDrawCallback(new FrameMarkerDrawCallback(this, startBlocks, viewer->getStats(), 0, _numBlocks + 1));
geode->addDrawable(frameMarkers);
}
}
// scene stats
@ -593,8 +721,8 @@ public:
cullValue->setDrawCallback(new TextDrawCallback(stats,"Cull traversal time taken",-1, 1000.0));
pos.x() = startBlocks;
osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorCull, 10);
geometry->setDrawCallback(new BlockDrawCallback(startBlocks, viewerStats, stats, "Cull traversal begin time", "Cull traversal end time", -1, 10, 10000.0));
osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorCull, _numBlocks);
geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, viewerStats, stats, "Cull traversal begin time", "Cull traversal end time", -1, _numBlocks));
geode->addDrawable(geometry);
pos.y() -= characterSize*1.5f;
@ -627,8 +755,8 @@ public:
pos.x() = startBlocks;
osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorDraw, 10);
geometry->setDrawCallback(new BlockDrawCallback(startBlocks, viewerStats, stats, "Draw traversal begin time", "Draw traversal end time", -1, 10, 10000.0));
osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorDraw, _numBlocks);
geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, viewerStats, stats, "Draw traversal begin time", "Draw traversal end time", -1, _numBlocks));
geode->addDrawable(geometry);
pos.y() -= characterSize*1.5f;
@ -661,16 +789,14 @@ public:
gpuValue->setDrawCallback(new TextDrawCallback(stats,"GPU draw time taken",-1, 1000.0));
pos.x() = startBlocks;
osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorGPU, 10);
geometry->setDrawCallback(new BlockDrawCallback(startBlocks, viewerStats, stats, "GPU draw begin time", "GPU draw end time", -1, 10, 10000.0));
osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorGPU, _numBlocks);
geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, viewerStats, stats, "GPU draw begin time", "GPU draw end time", -1, _numBlocks));
geode->addDrawable(geometry);
pos.y() -= characterSize*1.5f;
}
pos.x() = leftPos;
return group;
@ -683,6 +809,8 @@ public:
unsigned int _frameRateChildNum;
unsigned int _viewerChildNum;
unsigned int _sceneChildNum;
unsigned int _numBlocks;
double _blockMultiplier;
};