summaryrefslogtreecommitdiff
path: root/chart2
diff options
context:
space:
mode:
authorweigao <weigao@multicorewareinc.com>2014-08-09 13:08:16 +0800
committerMarkus Mohrhard <markus.mohrhard@collabora.co.uk>2014-08-13 06:21:33 +0200
commit212dfdbb92344cac86f8a511697b148ddd00678d (patch)
treeecf98e0fec0fb13a48391faf10c320264fc892c5 /chart2
parent05ecb52d2bc95dcaceb47df8f09b5bfbe924f9b7 (diff)
add render fps rendering
Change-Id: Ic0c8c9a05079a4d4b715f90eccffb7c4ae8260c9
Diffstat (limited to 'chart2')
-rw-r--r--chart2/source/view/charttypes/GL3DBarChart.cxx115
-rw-r--r--chart2/source/view/inc/GL3DBarChart.hxx13
-rw-r--r--chart2/source/view/inc/GL3DRenderer.hxx2
-rw-r--r--chart2/source/view/main/GL3DRenderer.cxx14
4 files changed, 92 insertions, 52 deletions
diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx
index b325ac86bfe1..532868386d04 100644
--- a/chart2/source/view/charttypes/GL3DBarChart.cxx
+++ b/chart2/source/view/charttypes/GL3DBarChart.cxx
@@ -27,6 +27,7 @@
#define BENCH_MARK_MODE false
#define CLICK_EVENT_ID 1
#define SHAPE_START_ID 10
+#define DATA_UPDATE_TIME 15
using namespace com::sun::star;
@@ -185,12 +186,7 @@ public:
, mbNeedFlyBack(false)
, mnStep(0)
, mnStepsTotal(0)
- , miFrameCount(0)
{
- osl_getSystemTime(&mafpsRenderStartTime);
- osl_getSystemTime(&mafpsRenderEndTime);
- osl_getSystemTime(&maScreenTextUpdateStartTime);
- osl_getSystemTime(&maScreenTextUpdateEndTime);
osl_getSystemTime(&maClickFlyBackStartTime);
osl_getSystemTime(&maClickFlyBackEndTime);
}
@@ -204,8 +200,6 @@ private:
void MoveToCorner();
void ProcessScroll();
void UpdateScreenText();
- void UpdateFPS();
- int CalcTimeInterval(TimeValue &startTime, TimeValue &endTime);
void ProcessClickFlyBack();
private:
glm::vec3 maStartPos;
@@ -216,13 +210,8 @@ private:
glm::vec3 maStepDirection;
size_t mnStep;
size_t mnStepsTotal;
- TimeValue mafpsRenderStartTime;
- TimeValue mafpsRenderEndTime;
- TimeValue maScreenTextUpdateStartTime;
- TimeValue maScreenTextUpdateEndTime;
TimeValue maClickFlyBackStartTime;
TimeValue maClickFlyBackEndTime;
- int miFrameCount;
OUString maFPS;
};
@@ -329,7 +318,7 @@ void RenderBenchMarkThread::ProcessClickFlyBack()
if (!mbNeedFlyBack)
return;
osl_getSystemTime(&maClickFlyBackEndTime);
- int aDeltaMs = CalcTimeInterval(maClickFlyBackStartTime, maClickFlyBackEndTime);
+ int aDeltaMs = mpChart->calcTimeInterval(maClickFlyBackStartTime, maClickFlyBackEndTime);
if(aDeltaMs >= 10000)
{
mpChart->maRenderEvent = EVENT_MOVE_TO_DEFAULT;
@@ -357,42 +346,18 @@ void RenderBenchMarkThread::ProcessMouseEvent()
}
}
-int RenderBenchMarkThread::CalcTimeInterval(TimeValue &startTime, TimeValue &endTime)
-{
- TimeValue aTime;
- aTime.Seconds = endTime.Seconds - startTime.Seconds - 1;
- aTime.Nanosec = 1000000000 + endTime.Nanosec - startTime.Nanosec;
- aTime.Seconds += aTime.Nanosec / 1000000000;
- aTime.Nanosec %= 1000000000;
- return aTime.Seconds * 1000+aTime.Nanosec / 1000000;
-}
-
-void RenderBenchMarkThread::UpdateFPS()
-{
- int aDeltaMs = CalcTimeInterval(mafpsRenderStartTime, mafpsRenderEndTime);
- if(aDeltaMs >= 500)
- {
- osl_getSystemTime(&mafpsRenderEndTime);
- aDeltaMs = CalcTimeInterval(mafpsRenderStartTime, mafpsRenderEndTime);
- int iFPS = miFrameCount * 1000 / aDeltaMs;
- maFPS = OUString("Render FPS: ") + OUString::number(iFPS);
- miFrameCount = 0;
- osl_getSystemTime(&mafpsRenderStartTime);
- }
- osl_getSystemTime(&mafpsRenderEndTime);
- //will add the fps render code here later
-}
-
void RenderBenchMarkThread::UpdateScreenText()
{
- int aDeltaMs = CalcTimeInterval(maScreenTextUpdateStartTime, maScreenTextUpdateEndTime);
- if (aDeltaMs >= 20)
+ if (mpChart->mbScreenTextNewRender)
{
- mpChart->mpRenderer->ReleaseScreenTextShapes();
- UpdateFPS();
- osl_getSystemTime(&maScreenTextUpdateStartTime);
+ mpChart->mpRenderer->ReleaseScreenTextTexture();
+ for(boost::ptr_vector<opengl3D::Renderable3DObject>::iterator itr = mpChart->maScreenTextShapes.begin(),
+ itrEnd = mpChart->maScreenTextShapes.end(); itr != itrEnd; ++itr)
+ {
+ itr->render();
+ }
+ mpChart->mbScreenTextNewRender = false;
}
- osl_getSystemTime(&maScreenTextUpdateEndTime);
}
void RenderBenchMarkThread::execute()
@@ -406,6 +371,7 @@ void RenderBenchMarkThread::execute()
UpdateScreenText();
ProcessMouseEvent();
renderFrame();
+ mpChart->miFrameCount++;
}
#ifdef WNT
Sleep(1);
@@ -415,7 +381,6 @@ void RenderBenchMarkThread::execute()
nTV.Nanosec = 1000000;
osl_waitThread(&nTV);
#endif
- miFrameCount++;
}
}
@@ -438,7 +403,10 @@ GL3DBarChart::GL3DBarChart(
maRenderEvent(EVENT_NONE),
mSelectBarId(0),
miScrollRate(0),
- mbScrollFlg(false)
+ miFrameCount(0),
+ mbScrollFlg(false),
+ mbScreenTextNewRender(false),
+ maFPS(OUString("Render FPS: 0"))
{
if (BENCH_MARK_MODE)
{
@@ -452,6 +420,11 @@ GL3DBarChart::GL3DBarChart(
mpRenderer->SetScroll();
}
}
+ maTimer.SetTimeout(DATA_UPDATE_TIME);
+ maTimer.SetTimeoutHdl(LINK(this, GL3DBarChart, updateTimer));
+ maTimer.Start();
+ osl_getSystemTime(&mafpsRenderStartTime);
+ osl_getSystemTime(&mafpsRenderEndTime);
}
Size aSize = mrWindow.GetSizePixel();
mpRenderer->SetSize(aSize);
@@ -939,6 +912,54 @@ void GL3DBarChart::contextDestroyed()
mbValidContext = false;
}
+void GL3DBarChart::updateRenderFPS()
+{
+ int aDeltaMs = calcTimeInterval(mafpsRenderStartTime, mafpsRenderEndTime);
+ if(aDeltaMs >= 500)
+ {
+ osl_getSystemTime(&mafpsRenderEndTime);
+ aDeltaMs = calcTimeInterval(mafpsRenderStartTime, mafpsRenderEndTime);
+ int iFPS = miFrameCount * 1000 / aDeltaMs;
+ maFPS = OUString("Render FPS: ") + OUString::number(iFPS);
+ miFrameCount = 0;
+ osl_getSystemTime(&mafpsRenderStartTime);
+ }
+ osl_getSystemTime(&mafpsRenderEndTime);
+ maScreenTextShapes.push_back(new opengl3D::ScreenText(mpRenderer.get(), *mpTextCache, maFPS, 0));
+ opengl3D::TextCacheItem tmpTextCache = mpTextCache->getText(maFPS);
+ float rectWidth = (float)tmpTextCache.maSize.Width() / (float)tmpTextCache.maSize.Height() * 0.05;
+ opengl3D::ScreenText* pScreenText = static_cast<opengl3D::ScreenText*>(&maScreenTextShapes.back());
+ pScreenText->setPosition(glm::vec2(-0.99f, 0.99f), glm::vec2(-0.99f + rectWidth, 0.89f));
+}
+
+int GL3DBarChart::calcTimeInterval(TimeValue &startTime, TimeValue &endTime)
+{
+ TimeValue aTime;
+ aTime.Seconds = endTime.Seconds - startTime.Seconds - 1;
+ aTime.Nanosec = 1000000000 + endTime.Nanosec - startTime.Nanosec;
+ aTime.Seconds += aTime.Nanosec / 1000000000;
+ aTime.Nanosec %= 1000000000;
+ return aTime.Seconds * 1000+aTime.Nanosec / 1000000;
+}
+
+void GL3DBarChart::updateScreenText()
+{
+ osl::MutexGuard aGuard(maMutex);
+ maScreenTextShapes.clear();
+ mpRenderer->ReleaseScreenTextShapes();
+ updateRenderFPS();
+ mbScreenTextNewRender = true;
+}
+
+IMPL_LINK_NOARG(GL3DBarChart, updateTimer)
+{
+ maTimer.Stop();
+ updateScreenText();
+ maTimer.SetTimeout(DATA_UPDATE_TIME);
+ maTimer.Start();
+ return 0;
+}
+
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx
index 7b1e7b6d6c8c..27712609877d 100644
--- a/chart2/source/view/inc/GL3DBarChart.hxx
+++ b/chart2/source/view/inc/GL3DBarChart.hxx
@@ -85,7 +85,11 @@ private:
void moveToCorner();
void moveToDefault();
glm::vec3 getCornerPosition(sal_Int8 nCornerId);
-
+ void updateTimer();
+ void updateScreenText();
+ void updateRenderFPS();
+ DECL_LINK(updateTimer, void*);
+ int calcTimeInterval(TimeValue &startTime, TimeValue &endTime);
css::uno::Reference<css::chart2::XChartType> mxChartType;
boost::ptr_vector<opengl3D::Renderable3DObject> maShapes;
@@ -139,6 +143,13 @@ private:
Point maClickPos;
sal_uInt32 miScrollRate;
bool mbScrollFlg;
+ Timer maTimer;
+ bool mbScreenTextNewRender;
+ boost::ptr_vector<opengl3D::Renderable3DObject> maScreenTextShapes;
+ OUString maFPS;
+ sal_uInt32 miFrameCount;
+ TimeValue mafpsRenderStartTime;
+ TimeValue mafpsRenderEndTime;
};
}
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx
index 94a5f88ca4ee..7c1c989fc3d3 100644
--- a/chart2/source/view/inc/GL3DRenderer.hxx
+++ b/chart2/source/view/inc/GL3DRenderer.hxx
@@ -209,6 +209,7 @@ public:
void ReleaseShapes();
void ReleaseScreenTextShapes();
void ReleaseTextTexture();
+ void ReleaseScreenTextTexture();
void StartClick(sal_uInt32 &selectID);
void EndClick();
void SetScroll();
@@ -462,6 +463,7 @@ private:
float m_fLightPower[MAX_LIGHT_NUM];
//for 3.0 end
std::vector<GLuint> m_Texturelist;
+ std::vector<GLuint> m_ScreenTexturelist;
bool m_bHighLighting;
sal_uInt32 m_uiSelectID;
float m_fScrollSpeed;
diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index 295a8a70bdb5..866a5cf9ee4c 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -1709,6 +1709,7 @@ void OpenGL3DRenderer::CreateScreenTextTexture(
glBindTexture(GL_TEXTURE_2D, 0);
CHECK_GL_ERROR();
m_ScreenTextInfoList.push_back(aTextInfo);
+ m_ScreenTexturelist.push_back(aTextInfo.texture);
}
void OpenGL3DRenderer::CreateTextTextureSingle(const boost::shared_array<sal_uInt8> &bitmapBuf,
@@ -1860,14 +1861,19 @@ void OpenGL3DRenderer::ReleaseTextTexture()
void OpenGL3DRenderer::ReleaseScreenTextShapes()
{
- for (size_t i = 0; i < m_ScreenTextInfoList.size(); i++)
+ m_ScreenTextInfoList.clear();
+}
+
+void OpenGL3DRenderer::ReleaseScreenTextTexture()
+{
+ for (size_t i = 0; i < m_ScreenTexturelist.size(); i++)
{
- TextInfo &textInfo = m_ScreenTextInfoList[i];
- glDeleteTextures(1, &textInfo.texture);
+ glDeleteTextures(1, &m_ScreenTexturelist[i]);
}
- m_ScreenTextInfoList.clear();
+ m_ScreenTexturelist.clear();
}
+
void OpenGL3DRenderer::RenderScreenTextShape()
{
glUseProgram(maResources.m_ScreenTextProID);