[Libreoffice-commits] core.git: Branch 'feature/chart-opengl2' - 2 commits - chart2/source
YangZhang
yangzhang at multicorewareinc.com
Mon Dec 30 23:27:44 PST 2013
chart2/source/view/main/OpenGLRender.cxx | 216 +++++++++++++++++++++++++
chart2/source/view/main/OpenGLRender.hxx | 43 ++++
chart2/source/view/main/OpenglShapeFactory.cxx | 6
3 files changed, 265 insertions(+)
New commits:
commit 356fc4ffe09bb804068c5786d3b3c1f38b3a8690
Author: YangZhang <yangzhang at multicorewareinc.com>
Date: Mon Dec 30 19:03:03 2013 +0800
add bubble chart
Change-Id: Idfffb7ce8607964ecb71571546bfcc2544b4e00a
Signed-off-by: shaochunfang <shaochun at multicorewareinc.com>
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index cbb5af8..f039ffd 100755
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -27,6 +27,13 @@ using namespace std;
#define OPENGL_SHADER( ... )# __VA_ARGS__
+#define GL_PI 3.14159f
+
+#if defined( _WIN32 )
+#define WGL_SAMPLE_BUFFERS_ARB 0x2041
+#define WGL_SAMPLES_ARB 0x2042
+#endif
+
const char *ColorFragmemtShader = OPENGL_SHADER (
varying vec3 fragmentColor;
@@ -1226,5 +1233,185 @@ int OpenGLRender::CreateMultiSampleFrameBufObj()
return 0;
}
+int OpenGLRender::Create2DCircle(int detail)
+{
+ float angle;
+ int idx = 2;
+ if (detail <= 0)
+ {
+ return -1;
+ }
+ m_Bubble2DCircle.bufLen = 2 * (detail + 3)* sizeof(float);
+ m_Bubble2DCircle.pointBuf = (float *)malloc(m_Bubble2DCircle.bufLen);
+ memset(m_Bubble2DCircle.pointBuf, 0, m_Bubble2DCircle.bufLen);
+ for(angle = 2.0f * GL_PI; angle > -(2.0f * GL_PI / detail); angle -= (2.0f * GL_PI / detail))
+ {
+ m_Bubble2DCircle.pointBuf[idx++] = sin(angle);
+ m_Bubble2DCircle.pointBuf[idx++] = cos(angle);
+ }
+ return 0;
+}
+
+int OpenGLRender::Bubble2DShapePoint(float x, float y, float directionX, float directionY)
+{
+ //check whether to create the circle data
+ if (!m_Bubble2DCircle.pointBuf)
+ {
+ Create2DCircle(100);
+ }
+
+ float actualX = (x / 10.0f) - ((float)m_iWidth / 2);
+ float actualY = (y / 10.0f) - ((float)m_iHeight / 2);
+ m_Bubble2DPointList.x = actualX;
+ m_Bubble2DPointList.y = actualY;
+ m_Bubble2DPointList.xScale = directionX / 10.0f;
+ m_Bubble2DPointList.yScale = directionY / 10.0f;
+
+ m_fPicLeft = actualX < m_fPicLeft ? actualX : m_fPicLeft;
+
+ m_fPicRight = actualX > m_fPicRight ? actualX : m_fPicRight;
+
+ m_fPicBottom = actualY < m_fPicBottom ? actualY : m_fPicBottom;
+
+ m_fPicTop = actualY > m_fPicTop ? actualY : m_fPicTop;
+
+ m_Bubble2DShapePointList.push_back(m_Bubble2DPointList);
+ return 0;
+}
+
+int OpenGLRender::RenderBubble2FBO(int wholeFlag)
+{
+ char fileName[256] = {0};
+ GLenum status;
+ glViewport(0, 0, m_iWidth, m_iHeight);
+ glClearDepth(1.0f);
+ // Clear the screen
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ if ((!m_FboID[0]) || (!m_FboID[1]))
+ {
+ // create a texture object
+ CreateTextureObj(m_iWidth, m_iHeight);
+ //create render buffer object
+ CreateRenderObj(m_iWidth, m_iHeight);
+ //create fbo
+ CreateFrameBufferObj();
+ if (m_iArbMultisampleSupported)
+ {
+ CreateMultiSampleFrameBufObj();
+ }
+ }
+ //bind fbo
+ if (m_iArbMultisampleSupported)
+ {
+ glBindFramebuffer(GL_FRAMEBUFFER,m_frameBufferMS);
+ }
+ else
+ {
+ glBindFramebuffer(GL_FRAMEBUFFER, m_FboID[m_iFboIdx % 2]);
+ }
+ // Clear the screen
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ if (wholeFlag)
+ {
+ if (m_iFboIdx > 0)
+ {
+ RenderTexture2FBO(m_TextureObj[(m_iFboIdx - 1) % 2]);
+ }
+ }
+ int listNum = m_Bubble2DShapePointList.size();
+ for (int i = 0; i < listNum; i++)
+ {
+ //move the circle to the pos, and scale using the xScale and Y scale
+ Bubble2DPointList &pointList = m_Bubble2DShapePointList.front();
+ PosVecf3 trans = {pointList.x, pointList.y, 0.0f};
+ PosVecf3 angle = {0.0f, 0.0f, 0.0f};
+ PosVecf3 scale = {pointList.xScale, pointList.yScale, 1.0f};
+ MoveModelf(trans, angle, scale);
+ m_MVP = m_Projection * m_View * m_Model;
+ //render to fbo
+ //fill vertex buffer
+ glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
+ if (!m_Bubble2DCircle.pointBuf)
+ {
+ Create2DCircle(100);
+ }
+ glBufferData(GL_ARRAY_BUFFER, m_Bubble2DCircle.bufLen, m_Bubble2DCircle.pointBuf, GL_STATIC_DRAW);
+
+ glUseProgram(m_CommonProID);
+
+ glUniform4fv(m_2DColorID, 1, &m_2DColor[0]);
+
+ glUniformMatrix4fv(m_MatrixID, 1, GL_FALSE, &m_MVP[0][0]);
+ // 1rst attribute buffer : vertices
+ glEnableVertexAttribArray(m_2DVertexID);
+ glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
+ glVertexAttribPointer(
+ m_2DVertexID, // attribute. No particular reason for 0, but must match the layout in the shader.
+ 2, // size
+ GL_FLOAT, // type
+ GL_FALSE, // normalized?
+ 0, // stride
+ (void*)0 // array buffer offset
+ );
+ glDrawArrays(GL_TRIANGLE_FAN, 0, m_Bubble2DCircle.bufLen / sizeof(float) / 2);
+ glDisableVertexAttribArray(m_2DVertexID);
+ glUseProgram(0);
+ m_Bubble2DShapePointList.pop_front();
+ }
+ //if use MSAA, we should copy the data to the FBO texture
+ GLenum fbResult = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ if( fbResult != GL_FRAMEBUFFER_COMPLETE )
+ {
+ return -1;
+ }
+ if (m_iArbMultisampleSupported)
+ {
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, m_frameBufferMS);
+ status = glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
+ if (status != GL_FRAMEBUFFER_COMPLETE)
+ {
+ cout << "The frame buffer status is not complete!" << endl;
+ return -1;
+ }
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FboID[m_iFboIdx % 2]);
+ status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
+ if (status != GL_FRAMEBUFFER_COMPLETE)
+ {
+ cout << "The frame buffer status is not complete!" << endl;
+ return -1;
+ }
+ glBlitFramebuffer(0, 0 ,m_iWidth, m_iHeight, 0, 0,m_iWidth ,m_iHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
+ glBindFramebuffer(GL_READ_FRAMEBUFFER,0);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0);
+ glBindFramebuffer(GL_FRAMEBUFFER, m_FboID[m_iFboIdx % 2]);
+ }
+ int wndLeft = ((int)m_fPicLeft + (m_iWidth / 2) - 1) & ~3;
+ int wndRight = ((int)m_fPicRight + (m_iWidth / 2) + 7) & ~3;
+ int wndBottom = ((int)m_fPicBottom + (m_iHeight/ 2) - 1) & ~3;
+ int wndTop = ((int)m_fPicTop + (m_iHeight/ 2) + 7) & ~3;
+ int picWidth = wndRight - wndLeft;
+ int picHeight = wndTop - wndBottom;
+ sprintf(fileName, "D:\\shaderout_%d_%d_%d.bmp", picWidth, picHeight, m_iFboIdx);
+ sal_uInt8 *buf = (sal_uInt8 *)malloc(picWidth * picHeight * 3 + BMP_HEADER_LEN);
+ CreateBMPHeader(buf, picWidth, picHeight);
+ glReadPixels(wndLeft, wndBottom, picWidth, picHeight, GL_BGR, GL_UNSIGNED_BYTE, buf + BMP_HEADER_LEN);
+ FILE *pfile = fopen(fileName,"wb");
+ fwrite(buf, picWidth * picHeight * 3 + BMP_HEADER_LEN, 1, pfile);
+ free(buf);
+ fclose(pfile);
+
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+#if defined( WNT )
+ SwapBuffers(glWin.hDC);
+ glFlush();
+#elif defined( UNX )
+ unx::glXSwapBuffers(glWin.dpy, glWin.win);
+#endif
+// RenderTexture(m_TextureObj[m_iFboIdx % 2]);
+ m_iFboIdx++;
+ return 0;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index aed00f9..f23f0bb 100755
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -73,6 +73,21 @@ typedef struct Line2DPointList
int bufLen;
}Line2DPointList;
+typedef struct Bubble2DPointList
+{
+ float x;
+ float y;
+ float xScale;
+ float yScale;
+}Bubble2DPointList;
+
+typedef struct Bubble2DCircle
+{
+ float *pointBuf;
+ int bufLen;
+}Bubble2DCircle;
+
+
/// Holds the information of our new child window
struct GLWindow
{
@@ -130,6 +145,8 @@ public:
int GetMSAASupport();
int GetMSAAFormat();
void SetColor(sal_uInt32 color);
+ int Bubble2DShapePoint(float x, float y, float directionX, float directionY);
+ int RenderBubble2FBO(int wholeFlag);
private:
GLint LoadShaders(const char *vertexShader,const char *fragmentShader);
int CreateTextureObj(int width, int height);
@@ -142,6 +159,7 @@ private:
#endif
int WGLisExtensionSupported(const char *extension);
int CreateMultiSampleFrameBufObj();
+ int Create2DCircle(int detail);
private:
// Projection matrix : default 45 degree Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
@@ -231,6 +249,23 @@ private:
GLuint m_frameBufferMS;
GLuint m_renderBufferColorMS;
GLuint m_renderBufferDepthMS;
+
+ float m_fPicRight;
+
+ float m_fPicLeft;
+
+ float m_fPicBottom;
+
+ float m_fPicTop;
+
+ Bubble2DCircle m_Bubble2DCircle;
+
+ Bubble2DPointList m_Bubble2DPointList;
+
+ list <Bubble2DPointList> m_Bubble2DShapePointList;
+ GLint m_CommonProID;
+ GLint m_2DVertexID;
+ GLint m_2DColorID;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/main/OpenglShapeFactory.cxx b/chart2/source/view/main/OpenglShapeFactory.cxx
index 4189163..7210035 100644
--- a/chart2/source/view/main/OpenglShapeFactory.cxx
+++ b/chart2/source/view/main/OpenglShapeFactory.cxx
@@ -321,6 +321,12 @@ uno::Reference< drawing::XShape >
rPosition.PositionX - (rSize.DirectionX / 2.0),
rPosition.PositionY - (rSize.DirectionY / 2.0),
rPosition.PositionZ );
+ dummy::DummyChart *pChart = (dummy::DummyChart *)m_pChart;
+ long color = 0x3465AF;
+ pChart->m_GLRender.SetColor(color);
+ pChart->m_GLRender.Bubble2DShapePoint(rPosition.PositionX, rPosition.PositionY,
+ rSize.DirectionX / 2.0, rSize.DirectionY / 2.0);
+ pChart->m_GLRender.RenderBubble2FBO(GL_TRUE);
dummy::DummyCircle* pCircle = new dummy::DummyCircle(Position3DToAWTPoint( aCenterPosition ),
Direction3DToAWTSize( rSize ));
xTarget->add(pCircle);
commit ad955044483d2b12df09e6a1af744a871e7d524a
Author: Peilin <peilin at multicorewareinc.com>
Date: Mon Dec 30 17:57:49 2013 +0800
add anti-aliasing fbo
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index d76b4fa..cbb5af8 100755
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -1197,5 +1197,34 @@ int OpenGLRender::WGLisExtensionSupported(const char *extension)
}
#endif
+void OpenGLRender::SetColor(sal_uInt32 color)
+{
+ sal_uInt8 r = (color & 0x00FF0000) >> 16;
+ sal_uInt8 g = (color & 0x0000FF00) >> 8;
+ sal_uInt8 b = (color & 0x000000FF);
+ m_2DColor = glm::vec4((float)r / 255.0f, (float)g / 255.0f, (float)b / 255.0f, m_fLineAlpha);
+}
+
+int OpenGLRender::CreateMultiSampleFrameBufObj()
+{
+ glGenFramebuffers(1, &m_frameBufferMS);
+ glBindFramebuffer(GL_FRAMEBUFFER, m_frameBufferMS);
+
+ glGenRenderbuffers(1, &m_renderBufferColorMS);
+ glBindRenderbuffer(GL_RENDERBUFFER, m_renderBufferColorMS);
+ glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_RGB, m_iWidth, m_iHeight);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_renderBufferColorMS);
+
+ glGenRenderbuffers(1, &m_renderBufferDepthMS);
+ glBindRenderbuffer(GL_RENDERBUFFER, m_renderBufferDepthMS);
+ glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_DEPTH_COMPONENT24, m_iWidth, m_iHeight);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_renderBufferDepthMS);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
+ return 0;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index 70b05e0..aed00f9 100755
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -129,6 +129,7 @@ public:
#endif
int GetMSAASupport();
int GetMSAAFormat();
+ void SetColor(sal_uInt32 color);
private:
GLint LoadShaders(const char *vertexShader,const char *fragmentShader);
int CreateTextureObj(int width, int height);
@@ -140,6 +141,8 @@ private:
int InitTempWindow(HWND *hwnd, int width, int height, PIXELFORMATDESCRIPTOR inPfd);
#endif
int WGLisExtensionSupported(const char *extension);
+ int CreateMultiSampleFrameBufObj();
+
private:
// Projection matrix : default 45 degree Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
glm::mat4 m_Projection;
@@ -223,6 +226,11 @@ private:
int m_iArbMultisampleFormat;
GLint m_iSampleBufs;
GLint m_iSamples;
+
+ glm::vec4 m_2DColor;
+ GLuint m_frameBufferMS;
+ GLuint m_renderBufferColorMS;
+ GLuint m_renderBufferDepthMS;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list