[Libreoffice-commits] core.git: Branch 'feature/chart-opengl2' - 3 commits - chart2/source
Peilin
peilin at multicorewareinc.com
Mon Jan 6 05:46:23 PST 2014
chart2/source/view/main/OpenGLRender.cxx | 203 ++++++++++++++++++++++++-------
chart2/source/view/main/OpenGLRender.hxx | 11 +
2 files changed, 170 insertions(+), 44 deletions(-)
New commits:
commit 143f47dced2b01e4c379b14a03243b5fa514bad6
Author: Peilin <peilin at multicorewareinc.com>
Date: Mon Jan 6 16:32:09 2014 +0800
fix the crash and add SetBackGroundColor of rectrangle
Change-Id: I521de3e68af928a1c9879a20e72ea5290259bd2c
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index 866d3d2..73aedac 100644
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -409,7 +409,7 @@ int OpenGLRender::InitOpenGL(GLWindow aWindow)
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glClearColor (1.0f, 1.0f, 1.0f, 1.0f);
+ glClearColor (m_ClearColor.r, m_ClearColor.g, m_ClearColor.b, m_ClearColor.a);
glClear(GL_COLOR_BUFFER_BIT);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -917,6 +917,12 @@ OpenGLRender::OpenGLRender(uno::Reference< drawing::XShape > xTarget):
m_TextTexCoordID(1)
{
memset(&m_Line2DPointList, 0, sizeof(Line2DPointList));
+ memset(&m_Bubble2DPointList, 0, sizeof(m_Bubble2DPointList));
+ memset(&m_Bubble2DCircle, 0, sizeof(m_Bubble2DCircle));
+ memset(&m_TextInfo, 0, sizeof(TextInfo));
+ memset(&m_Area2DPointList, 0, sizeof(m_Area2DPointList));
+ memset(&m_RectangleList, 0, sizeof(RectanglePointList));
+
m_iFboIdx = 0;
m_FboID[0] = 0;
m_FboID[1] = 0;
@@ -924,6 +930,14 @@ OpenGLRender::OpenGLRender(uno::Reference< drawing::XShape > xTarget):
m_TextureObj[1] = 0;
m_RboID[0] = 0;
m_RboID[1] = 0;
+ m_iArbMultisampleSupported = 0;
+ m_iArbMultisampleFormat = 0;
+ m_ClearColor = glm::vec4(1.0f, 1.0f, 1.0f, 1.0f);
+
+ for (size_t i = 0; i < sizeof(m_BackgroundColor) / sizeof(float); i++)
+ {
+ m_BackgroundColor[i] = 1.0;
+ }
mxRenderTarget->setPosition(awt::Point(0,0));
}
@@ -1358,31 +1372,45 @@ int OpenGLRender::RenderRectangleShape()
RectanglePointList &pointList = m_RectangleShapePointList.front();
PosVecf3 trans = {pointList.x, pointList.y, pointList.z};
PosVecf3 angle = {0.0f, 0.0f, 0.0f};
- PosVecf3 scale = {pointList.xScale, pointList.yScale, 1.0f};
+ PosVecf3 scale = {pointList.xScale / 2, pointList.yScale / 2, 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);
glBufferData(GL_ARRAY_BUFFER, sizeof(square2DVertices), square2DVertices, GL_STATIC_DRAW);
- glUseProgram(m_CommonProID);
+ glBindBuffer(GL_ARRAY_BUFFER, m_ColorBuffer);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(m_BackgroundColor), m_BackgroundColor, GL_STATIC_DRAW);
+ glUseProgram(m_BackgroundProID);
- glUniform4fv(m_2DColorID, 1, &m_2DColor[0]);
- glUniformMatrix4fv(m_MatrixID, 1, GL_FALSE, &m_MVP[0][0]);
+ glUniformMatrix4fv(m_BackgroundMatrixID, 1, GL_FALSE, &m_MVP[0][0]);
// 1rst attribute buffer : vertices
- glEnableVertexAttribArray(m_2DVertexID);
+ glEnableVertexAttribArray(m_BackgroundVertexID);
glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
glVertexAttribPointer(
- m_2DVertexID, // attribute. No particular reason for 0, but must match the layout in the shader.
+ m_BackgroundVertexID, // 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
);
+ // 2nd attribute buffer : color
+ glEnableVertexAttribArray(m_BackgroundColorID);
+ glBindBuffer(GL_ARRAY_BUFFER, m_ColorBuffer);
+ glVertexAttribPointer(
+ m_BackgroundColorID, // attribute. No particular reason for 0, but must match the layout in the shader.
+ 4, // size
+ GL_FLOAT, // type
+ GL_FALSE, // normalized?
+ 0, // stride
+ (void*)0 // array buffer offset
+ );
glDrawArrays(GL_QUADS, 0, 4);
- glDisableVertexAttribArray(m_2DVertexID);
+ glDisableVertexAttribArray(m_BackgroundVertexID);
+ glDisableVertexAttribArray(m_BackgroundColorID);
glUseProgram(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
m_RectangleShapePointList.pop_front();
@@ -1390,6 +1418,7 @@ int OpenGLRender::RenderRectangleShape()
return 0;
}
+
int OpenGLRender::CreateTextTexture(::rtl::OUString textValue, sal_uInt32 color, const Font& rFont, awt::Point aPos, awt::Size aSize, long rotation)
{
VirtualDevice aDevice;
@@ -1649,4 +1678,38 @@ int OpenGLRender::RenderArea2DShape()
return 0;
}
+void OpenGLRender::SetBackGroundColor(long color1, long color2)
+{
+ sal_uInt8 r = (color1 & 0x00FF0000) >> 16;
+ sal_uInt8 g = (color1 & 0x0000FF00) >> 8;
+ sal_uInt8 b = (color1 & 0x000000FF);
+
+ m_BackgroundColor[0] = (float)r / 255.0f;
+ m_BackgroundColor[1] = (float)g / 255.0f;
+ m_BackgroundColor[2] = (float)b / 255.0f;
+ m_BackgroundColor[3] = 1.0;
+
+ m_BackgroundColor[4] = (float)r / 255.0f;
+ m_BackgroundColor[5] = (float)g / 255.0f;
+ m_BackgroundColor[6] = (float)b / 255.0f;
+ m_BackgroundColor[7] = 1.0;
+
+ r = (color2 & 0x00FF0000) >> 16;
+ g = (color2 & 0x0000FF00) >> 8;
+ b = (color2 & 0x000000FF);
+
+ m_BackgroundColor[8] = (float)r / 255.0f;
+ m_BackgroundColor[9] = (float)g / 255.0f;
+ m_BackgroundColor[10] = (float)b / 255.0f;
+ m_BackgroundColor[11] = 1.0;
+
+ m_BackgroundColor[12] = (float)r / 255.0f;
+ m_BackgroundColor[13] = (float)g / 255.0f;
+ m_BackgroundColor[14] = (float)b / 255.0f;
+ m_BackgroundColor[15] = 1.0;
+ cout << "color1 = " << color1 << ", color2 = " << color2 << endl;
+
+}
+
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index 4314670..a65730b 100644
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -195,6 +195,7 @@ private:
int WGLisExtensionSupported(const char *extension);
int CreateMultiSampleFrameBufObj();
int Create2DCircle(int detail);
+ void SetBackGroundColor(long color1, long color2);
private:
// Projection matrix : default 45 degree Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
@@ -328,6 +329,9 @@ private:
GLint m_BackgroundVertexID;
GLint m_BackgroundColorID;
+ float m_BackgroundColor[16];
+ glm::vec4 m_ClearColor;
+
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 1abbc58ccfda56a0c465681b347f2b3ca54bbcbb
Author: Peilin <peilin at multicorewareinc.com>
Date: Mon Jan 6 15:22:30 2014 +0800
change glm perspective to ortho
Change-Id: I507477cd6087d3fe6be998a75d5a66016d323447
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index d099938..866d3d2 100644
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -815,7 +815,8 @@ int OpenGLRender::SetViewPoint(PosVeci3 camPos, PosVeci3 orgPos, int headUpFlag)
glm::vec3(orgPos.x, orgPos.y ,orgPos.z), // and looks at the origin
glm::vec3(0, (headUpFlag >= 0 ? 1 : -1) , 0) // Head is up (set to 0,-1,0 to look upside-down)
);
- m_Projection = glm::perspective(45.0f, (float)m_iWidth / (float)m_iHeight, 0.1f, 100.0f);
+ //m_Projection = glm::perspective(45.0f, (float)m_iWidth / (float)m_iHeight, 0.1f, 100.0f);
+ m_Projection = glm::ortho((-(float)m_iWidth) / 2, ((float)m_iWidth) / 2, -((float)m_iHeight) / 2, ((float)m_iHeight) / 2, -2.0f, 100.0f); // In world coordinates
return 0;
}
commit fd5f5881636330dd5ab5b87ae7b0cdd7388ce1a0
Author: Peilin <peilin at multicorewareinc.com>
Date: Mon Jan 6 15:06:36 2014 +0800
modify shader and make SetLine2DShapePoint more precision
Change-Id: Ia692a678d68d3b492661cd6946c1a63b5a2c8413
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index 439358c..d099938 100644
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -58,33 +58,34 @@ using namespace std;
#define WGL_SAMPLES_ARB 0x2042
#endif
-const char *ColorFragmemtShader = OPENGL_SHADER (
+const char *CommonFragmemtShader = OPENGL_SHADER (
-varying vec3 fragmentColor;
+varying vec4 fragmentColor;
void main()
{
- gl_FragColor = vec4(fragmentColor, 1);
+ gl_FragColor = fragmentColor;
}
);
-const char *TransformVertexShader = OPENGL_SHADER (
+const char *CommonVertexShader = OPENGL_SHADER (
-attribute vec3 vertexPosition_modelspace;
-attribute vec3 vertexColor;
-varying vec3 fragmentColor;
+attribute vec3 vPosition;
uniform mat4 MVP;
+uniform vec4 vColor;
+varying vec4 fragmentColor;
void main()
{
- gl_Position = MVP * vec4(vertexPosition_modelspace,1);
- fragmentColor = vertexColor;
+ gl_Position = MVP * vec4(vPosition, 1);
+ fragmentColor = vColor;
}
);
-const char *Line2DFragmemtShader = OPENGL_SHADER (
+
+const char *BackgroundFragmemtShader = OPENGL_SHADER (
varying vec4 fragmentColor;
@@ -95,20 +96,22 @@ void main()
);
-const char *Line2DVertexShader = OPENGL_SHADER (
+const char *BackgroundVertexShader = OPENGL_SHADER (
-attribute vec4 vPosition;
-uniform vec4 vLineColor;
+attribute vec3 vPosition;
+uniform mat4 MVP;
+attribute vec4 vColor;
varying vec4 fragmentColor;
void main()
{
- gl_Position = vPosition;
- fragmentColor = vLineColor;
+ gl_Position = MVP * vec4(vPosition, 1);
+ fragmentColor = vColor;
}
);
+
const char *RenderFragmentShader = OPENGL_SHADER (
uniform sampler2D RenderTex;
@@ -116,7 +119,7 @@ varying vec2 vTexCoord;
void main()
{
- gl_FragColor = vec4(texture2D(RenderTex, vTexCoord).rgb, 1);
+ gl_FragColor = vec4(texture2D(RenderTex, vTexCoord).rgb, 1.0);
}
);
@@ -135,6 +138,31 @@ void main()
);
+const char *TextFragmentShader = OPENGL_SHADER (
+uniform sampler2D TextTex;
+varying vec2 vTexCoord;
+void main()
+{
+ gl_FragColor = vec4(texture2D(TextTex, vTexCoord).rgba);
+}
+
+);
+
+const char *TextVertexShader = OPENGL_SHADER (
+
+attribute vec3 vPosition;
+uniform mat4 MVP;
+attribute vec2 texCoord;
+varying vec2 vTexCoord;
+void main()
+{
+ gl_Position = MVP * vec4(vPosition, 1);
+ vTexCoord = texCoord;
+}
+
+);
+
+
static GLfloat squareVertices[] = {
-1.0f, -1.0f, -1.0,
@@ -392,21 +420,32 @@ int OpenGLRender::InitOpenGL(GLWindow aWindow)
glm::vec3(0,0,0), // and looks at the origin
glm::vec3(0,1,0) // Head is up (set to 0,-1,0 to look upside-down)
);
- m_ProgramID = LoadShaders(TransformVertexShader, ColorFragmemtShader);
+ m_MVP = m_Projection * m_View * m_Model;
glGenBuffers(1, &m_VertexBuffer);
glGenBuffers(1, &m_ColorBuffer);
- m_MatrixID = glGetUniformLocation(m_ProgramID, "MVP");
- m_VertexID = glGetAttribLocation(m_ProgramID, "vertexPosition_modelspace");
- m_ColorID = glGetAttribLocation(m_ProgramID, "vertexColor");
m_RenderProID = LoadShaders(RenderVertexShader, RenderFragmentShader);
m_RenderVertexID = glGetAttribLocation(m_RenderProID, "vPosition");
m_RenderTexCoordID = glGetAttribLocation(m_RenderProID, "texCoord");
m_RenderTexID = glGetUniformLocation(m_RenderProID, "RenderTex");
- m_Line2DProID = LoadShaders(Line2DVertexShader, Line2DFragmemtShader);
- m_Line2DVertexID = glGetAttribLocation(m_Line2DProID, "vPosition");
- m_Line2DColorID = glGetUniformLocation(m_Line2DProID, "vLineColor");
+ m_CommonProID = LoadShaders(CommonVertexShader, CommonFragmemtShader);
+ m_MatrixID = glGetUniformLocation(m_CommonProID, "MVP");
+ m_2DVertexID = glGetAttribLocation(m_CommonProID, "vPosition");
+ m_2DColorID = glGetUniformLocation(m_CommonProID, "vColor");
+
+ m_BackgroundProID = LoadShaders(BackgroundVertexShader, BackgroundFragmemtShader);
+ m_BackgroundMatrixID = glGetUniformLocation(m_BackgroundProID, "MVP");
+ m_BackgroundVertexID = glGetAttribLocation(m_BackgroundProID, "vPosition");
+ m_BackgroundColorID = glGetAttribLocation(m_BackgroundProID, "vColor");
+
+ m_TextProID = LoadShaders(TextVertexShader, TextFragmentShader);
+ m_TextMatrixID = glGetUniformLocation(m_TextProID, "MVP");
+ m_TextVertexID = glGetAttribLocation(m_TextProID, "vPosition");
+ m_TextTexCoordID = glGetAttribLocation(m_TextProID, "texCoord");
+ m_TextTexID = glGetUniformLocation(m_TextProID, "TextTex");
+
+ CHECK_GL_ERROR();
glGenBuffers(1, &m_RenderVertexBuf);
glBindBuffer(GL_ARRAY_BUFFER, m_RenderVertexBuf);
@@ -417,6 +456,12 @@ int OpenGLRender::InitOpenGL(GLWindow aWindow)
glBindBuffer(GL_ARRAY_BUFFER, m_RenderTexCoordBuf);
glBufferData(GL_ARRAY_BUFFER, sizeof(coordVertices), coordVertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ glGenBuffers(1, &m_TextTexCoordBuf);
+ glBindBuffer(GL_ARRAY_BUFFER, m_TextTexCoordBuf);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(coordVertices), coordVertices, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
#if defined( WNT )
SwapBuffers(glWin.hDC);
glFlush();
@@ -482,22 +527,30 @@ BitmapEx OpenGLRender::GetAsBitmap()
int OpenGLRender::SetLine2DShapePoint(float x, float y, int listLength)
{
- if (!m_Line2DPoitList.pointBuf)
+ if (!m_Line2DPointList.pointBuf)
{
//a new point buffer should be alloc, we should push the old buffer first
- m_Line2DPoitList.bufLen = listLength * sizeof(float) * 2;
- m_Line2DPoitList.pointBuf = (float *)malloc(m_Line2DPoitList.bufLen);
+ m_Line2DPointList.bufLen = listLength * sizeof(float) * 3;
+ m_Line2DPointList.pointBuf = (float *)malloc(m_Line2DPointList.bufLen);
+ m_iPointNum = 0;
}
+ float actualX = (x / OPENGL_SCALE_VALUE) - ((float)m_iWidth / 2);
+ float actualY = (y / OPENGL_SCALE_VALUE) - ((float)m_iHeight / 2);
+ m_Line2DPointList.pointBuf[m_iPointNum++] = actualX;
+ m_Line2DPointList.pointBuf[m_iPointNum++] = actualY;
+ m_Line2DPointList.pointBuf[m_iPointNum++] = m_fZStep;
+ m_fPicLeft = actualX < m_fPicLeft ? actualX : m_fPicLeft;
- float zeroX = (float)m_iWidth * 10;
- float zeroY = (float)m_iHeight * 10;
- m_Line2DPoitList.pointBuf[m_iPointNum++] = 3.5 * ((x - zeroX) / zeroX + 0.3);
- m_Line2DPoitList.pointBuf[m_iPointNum++] = 3.5 * ((y - zeroY) / zeroY + 0.25);
+ m_fPicRight = actualX > m_fPicRight ? actualX : m_fPicRight;
- if (m_iPointNum == (listLength << 1))
+ m_fPicBottom = actualY < m_fPicBottom ? actualY : m_fPicBottom;
+
+ m_fPicTop = actualY > m_fPicTop ? actualY : m_fPicTop;
+
+ if (m_iPointNum == (listLength * 3))
{
- m_Line2DShapePointList.push_back(m_Line2DPoitList);
- m_Line2DPoitList.pointBuf = NULL;
+ m_Line2DShapePointList.push_back(m_Line2DPointList);
+ m_Line2DPointList.pointBuf = NULL;
m_iPointNum = 0;
}
return 0;
@@ -862,7 +915,7 @@ OpenGLRender::OpenGLRender(uno::Reference< drawing::XShape > xTarget):
m_TextVertexID(0),
m_TextTexCoordID(1)
{
- memset(&m_Line2DPoitList, 0, sizeof(Line2DPointList));
+ memset(&m_Line2DPointList, 0, sizeof(Line2DPointList));
m_iFboIdx = 0;
m_FboID[0] = 0;
m_FboID[1] = 0;
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index b5a8f0e..4314670 100644
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -264,7 +264,7 @@ private:
int m_iPointNum;
- Line2DPointList m_Line2DPoitList;
+ Line2DPointList m_Line2DPointList;
int m_iFboIdx;
@@ -323,6 +323,11 @@ private:
Area2DPointList m_Area2DPointList;
std::list <Area2DPointList> m_Area2DShapePointList;
+ GLint m_BackgroundProID;
+ GLint m_BackgroundMatrixID;
+ GLint m_BackgroundVertexID;
+ GLint m_BackgroundColorID;
+
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list