chart2/Package_opengl.mk | 2 chart2/opengl/shape3DFragmentShaderV300.glsl | 87 +++++++++ chart2/opengl/shape3DVertexShaderV300.glsl | 29 +++ chart2/source/view/charttypes/GL3DBarChart.cxx | 83 ++++++--- chart2/source/view/inc/GL3DBarChart.hxx | 6 chart2/source/view/inc/GL3DRenderer.hxx | 20 ++ chart2/source/view/main/GL3DRenderer.cxx | 228 ++++++++++++++++++++----- 7 files changed, 387 insertions(+), 68 deletions(-)
New commits: commit 796a9e97522ee1201a3f291f3c1c31d02541c789 Author: weigao <wei...@multicorewareinc.com> Date: Sat Jun 14 08:59:07 2014 -0700 add codes for calling the 3.0 shaders Change-Id: I0e95879c04047ccb836543d801bda6a01ae469ef diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 1799396..9098cd1 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -172,6 +172,7 @@ void OpenGL3DRenderer::CheckGLSLVersion() if (iVersion > 3) { maResources.m_b330Support = true; + maResources.m_b330Support = false; return; } p++; @@ -810,11 +811,6 @@ void OpenGL3DRenderer::RenderPolygon3D(Polygon3DInfo &polygon) { return ; } - //update ubo - Update3DUniformBlock(); - glBindBuffer(GL_UNIFORM_BUFFER, m_3DUBOBuffer); - glBufferSubData(GL_UNIFORM_BUFFER, m_3DActualSizeLight, sizeof(MaterialParameters), &polygon.material); - CHECK_GL_ERROR(); glBindBuffer(GL_UNIFORM_BUFFER, 0); if(mbPickingMode) { @@ -825,6 +821,31 @@ void OpenGL3DRenderer::RenderPolygon3D(Polygon3DInfo &polygon) glUseProgram(maResources.m_3DProID); glUniformMatrix4fv(maResources.m_3DViewID, 1, GL_FALSE, &m_3DView[0][0]); glUniformMatrix4fv(maResources.m_3DProjectionID, 1, GL_FALSE, &m_3DProjection[0][0]); + if (maResources.m_b330Support) + { + //update ubo + Update3DUniformBlock(); + glBindBuffer(GL_UNIFORM_BUFFER, m_3DUBOBuffer); + glBufferSubData(GL_UNIFORM_BUFFER, m_3DActualSizeLight, sizeof(MaterialParameters), &polygon.material); + CHECK_GL_ERROR(); + } + else + { + //update light information + glUniform4fv(maResources.m_3DLightColorID, m_iLightNum, (GLfloat*)m_LightColor); + glUniform4fv(maResources.m_3DLightPosID, m_iLightNum, (GLfloat*)m_PositionWorldspace); + glUniform1fv(maResources.m_3DLightPowerID, m_iLightNum, m_fLightPower); + glUniform1i(maResources.m_3DLightNumID, m_iLightNum); + glUniform4fv(maResources.m_3DLightAmbientID, 1, &m_Ambient[0]); + //update meterial information + glUniform4fv(maResources.m_3DMaterialAmbientID, 1, &polygon.material.ambient[0]); + glUniform4fv(maResources.m_3DMaterialDiffuseID, 1, &polygon.material.diffuse[0]); + glUniform4fv(maResources.m_3DMaterialSpecularID, 1, &polygon.material.specular[0]); + glUniform4fv(maResources.m_3DMaterialColorID, 1, &polygon.material.materialColor[0]); + glUniform1i(maResources.m_3DMaterialTwoSidesID, polygon.material.twoSidesLighting); + glUniform1f(maResources.m_3DMaterialShininessID, polygon.material.shininess); + CHECK_GL_ERROR(); + } } for (size_t i = 0; i < verticesNum; i++) { @@ -942,26 +963,45 @@ void OpenGL3DRenderer::RenderPolygon3DObject() void OpenGL3DRenderer::Set3DSenceInfo(sal_uInt32 nColor, bool twoSidesLighting) { m_Polygon3DInfo.material.twoSidesLighting = twoSidesLighting; - - m_LightsInfo.ambient = getColorAsVector(nColor); - - m_LightsInfo.lightNum = 0; + if (maResources.m_b330Support) + { + m_LightsInfo.ambient = getColorAsVector(nColor); + m_LightsInfo.lightNum = 0; + } + else + { + m_iLightNum = 0; + m_Ambient = getColorAsVector(nColor);; + } SetLightInfo(true, 0xFFFFFF, glm::vec4(1.0, 1.0, 1.0, 0.0)); } void OpenGL3DRenderer::SetLightInfo(bool lightOn, sal_uInt32 nColor, const glm::vec4& direction) { - if (m_LightsInfo.lightNum >= MAX_LIGHT_NUM) - { - return; - } - if (lightOn) { - m_LightsInfo.light[m_LightsInfo.lightNum].lightColor = getColorAsVector(nColor); - m_LightsInfo.light[m_LightsInfo.lightNum].positionWorldspace = direction; - m_LightsInfo.light[m_LightsInfo.lightNum].lightPower = 1.0; - m_LightsInfo.lightNum++; + if (maResources.m_b330Support) + { + if (m_LightsInfo.lightNum >= MAX_LIGHT_NUM) + { + return; + } + m_LightsInfo.light[m_LightsInfo.lightNum].lightColor = getColorAsVector(nColor); + m_LightsInfo.light[m_LightsInfo.lightNum].positionWorldspace = direction; + m_LightsInfo.light[m_LightsInfo.lightNum].lightPower = 1.0; + m_LightsInfo.lightNum++; + } + else + { + if (m_iLightNum >= MAX_LIGHT_NUM) + { + return; + } + m_LightColor[m_iLightNum] = getColorAsVector(nColor); + m_PositionWorldspace[m_iLightNum] = direction; + m_fLightPower[m_iLightNum] = 1.0; + m_iLightNum++; + } } } @@ -1363,7 +1403,6 @@ void OpenGL3DRenderer::RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D) glUniform4fv(maResources.m_2DColorID, 1, &extrude3D.id[0]); } glDrawElements(GL_TRIANGLES, extrude3D.size[TOP_SURFACE], GL_UNSIGNED_SHORT, reinterpret_cast<GLvoid*>(extrude3D.startIndex[TOP_SURFACE])); - RenderExtrudeFlatSurface(extrude3D, FLAT_BOTTOM_SURFACE); } void OpenGL3DRenderer::RenderNonRoundedBar(const Extrude3DInfo& extrude3D) @@ -1427,12 +1466,26 @@ void OpenGL3DRenderer::RenderExtrude3DObject() } else { - Update3DUniformBlock(); glUseProgram(maResources.m_3DProID); glUniformMatrix4fv(maResources.m_3DViewID, 1, GL_FALSE, &m_3DView[0][0]); glUniformMatrix4fv(maResources.m_3DProjectionID, 1, GL_FALSE, &m_3DProjection[0][0]); + if (maResources.m_b330Support) + { + //update ubo + Update3DUniformBlock(); + CHECK_GL_ERROR(); + } + else + { + //update light information + glUniform4fv(maResources.m_3DLightColorID, m_iLightNum, (GLfloat*)m_LightColor); + glUniform4fv(maResources.m_3DLightPosID, m_iLightNum, (GLfloat*)m_PositionWorldspace); + glUniform1fv(maResources.m_3DLightPowerID, m_iLightNum, m_fLightPower); + glUniform1i(maResources.m_3DLightNumID, m_iLightNum); + glUniform4fv(maResources.m_3DLightAmbientID, 1, &m_Ambient[0]); + CHECK_GL_ERROR(); + } } - CHECK_GL_ERROR(); size_t extrude3DNum = m_Extrude3DList.size(); for (size_t i = 0; i < extrude3DNum; i++) { @@ -1472,10 +1525,23 @@ void OpenGL3DRenderer::RenderExtrude3DObject() extrude3DInfo.zScale *= m_fHeightWeight; if(!mbPickingMode) { - glBindBuffer(GL_UNIFORM_BUFFER, m_3DUBOBuffer); - glBufferSubData(GL_UNIFORM_BUFFER, m_3DActualSizeLight, sizeof(MaterialParameters), &extrude3DInfo.material); - CHECK_GL_ERROR(); - glBindBuffer(GL_UNIFORM_BUFFER, 0); + if (maResources.m_b330Support) + { + glBindBuffer(GL_UNIFORM_BUFFER, m_3DUBOBuffer); + glBufferSubData(GL_UNIFORM_BUFFER, m_3DActualSizeLight, sizeof(MaterialParameters), &extrude3DInfo.material); + CHECK_GL_ERROR(); + glBindBuffer(GL_UNIFORM_BUFFER, 0); + } + else + { + //update meterial information + glUniform4fv(maResources.m_3DMaterialAmbientID, 1, &extrude3DInfo.material.ambient[0]); + glUniform4fv(maResources.m_3DMaterialDiffuseID, 1, &extrude3DInfo.material.diffuse[0]); + glUniform4fv(maResources.m_3DMaterialSpecularID, 1, &extrude3DInfo.material.specular[0]); + glUniform4fv(maResources.m_3DMaterialColorID, 1, &extrude3DInfo.material.materialColor[0]); + glUniform1i(maResources.m_3DMaterialTwoSidesID, extrude3DInfo.material.twoSidesLighting); + glUniform1f(maResources.m_3DMaterialShininessID, extrude3DInfo.material.shininess); + } } extrude3DInfo.reverse = 0; if (extrude3DInfo.rounded) @@ -1777,7 +1843,16 @@ void OpenGL3DRenderer::ProcessUnrenderedShape(bool bNewScene) if(mbPickingMode) RenderExtrude3DObject(); else - RenderBatchBars(bNewScene); + { + if (maResources.m_b330Support) + { + RenderBatchBars(bNewScene); + } + else + { + RenderExtrude3DObject(); + } + } //render text RenderTextShape(); // render screen text commit 783372f383650fe3d26f4b02432921a206d99d35 Author: weigao <wei...@multicorewareinc.com> Date: Sat Jun 14 08:51:43 2014 -0700 add codes for compile the 3.0 shaders Change-Id: Idc58635cc1604208317319bfa399a1574979a909 diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index b24d45e..1e5df81 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -234,10 +234,12 @@ private: void InitBatch3DUniformBlock(); void UpdateBatch3DUniformBlock(); void RenderBatchBars(bool bNewScene); + void CheckGLSLVersion(); private: struct ShaderResources { + bool m_b330Support;; // 3DProID GLint m_3DProID; GLint m_3DProjectionID; @@ -246,6 +248,18 @@ private: GLint m_3DNormalMatrixID; GLint m_3DVertexID; GLint m_3DNormalID; + //300 verson; + GLint m_3DMaterialAmbientID; + GLint m_3DMaterialDiffuseID; + GLint m_3DMaterialSpecularID; + GLint m_3DMaterialColorID; + GLint m_3DMaterialTwoSidesID; + GLint m_3DMaterialShininessID; + GLint m_3DLightColorID; + GLint m_3DLightPosID; + GLint m_3DLightPowerID; + GLint m_3DLightNumID; + GLint m_3DLightAmbientID; // TextProID GLint m_TextProID; @@ -380,6 +394,12 @@ private: MaterialParameters m_Batchmaterial; GLuint m_Batch3DUBOBuffer; GLint m_Batch3DActualSizeLight; + //for 3.0 version + int m_iLightNum; + glm::vec4 m_Ambient; + glm::vec4 m_LightColor[MAX_LIGHT_NUM]; + glm::vec4 m_PositionWorldspace[MAX_LIGHT_NUM]; + float m_fLightPower[MAX_LIGHT_NUM]; }; } diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 287c98a..1799396 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -139,6 +139,7 @@ OpenGL3DRenderer::ShaderResources::ShaderResources() , m_3DBatchVertexID(0) , m_3DBatchNormalID(0) , m_3DBatchColorID(0) + , m_b330Support(false) { } @@ -151,16 +152,82 @@ OpenGL3DRenderer::ShaderResources::~ShaderResources() glDeleteProgram(m_3DBatchProID); } +void OpenGL3DRenderer::CheckGLSLVersion() +{ + char version[256] = {0}; + strcpy(version, (char *)glGetString(GL_SHADING_LANGUAGE_VERSION)); + char *p = version; + int iVersion = 0; + //get the first point + while ((*p != '\0') && (*p != '.')) + { + iVersion = iVersion * 10 + ((*p) - 0x30); + p++; + } + if (iVersion < 3) + { + maResources.m_b330Support = false; + return; + } + if (iVersion > 3) + { + maResources.m_b330Support = true; + return; + } + p++; + iVersion = *p - 0x30; + if (iVersion >= 3) + { + maResources.m_b330Support = true; + return; + } + maResources.m_b330Support = false; +} + void OpenGL3DRenderer::ShaderResources::LoadShaders() { - m_3DProID = OpenGLHelper::LoadShaders("shape3DVertexShader", "shape3DFragmentShader"); - m_3DProjectionID = glGetUniformLocation(m_3DProID, "P"); - m_3DViewID = glGetUniformLocation(m_3DProID, "V"); - m_3DModelID = glGetUniformLocation(m_3DProID, "M"); - m_3DNormalMatrixID = glGetUniformLocation(m_3DProID, "normalMatrix"); - m_3DVertexID = glGetAttribLocation(m_3DProID, "vertexPositionModelspace"); - m_3DNormalID = glGetAttribLocation(m_3DProID, "vertexNormalModelspace"); + if (m_b330Support) + { + m_3DProID = OpenGLHelper::LoadShaders("shape3DVertexShader", "shape3DFragmentShader"); + m_3DProjectionID = glGetUniformLocation(m_3DProID, "P"); + m_3DViewID = glGetUniformLocation(m_3DProID, "V"); + m_3DModelID = glGetUniformLocation(m_3DProID, "M"); + m_3DNormalMatrixID = glGetUniformLocation(m_3DProID, "normalMatrix"); + m_3DVertexID = glGetAttribLocation(m_3DProID, "vertexPositionModelspace"); + m_3DNormalID = glGetAttribLocation(m_3DProID, "vertexNormalModelspace"); + + m_3DBatchProID = OpenGLHelper::LoadShaders("shape3DVertexShaderBatch", "shape3DFragmentShaderBatch"); + m_3DBatchProjectionID = glGetUniformLocation(m_3DBatchProID, "P"); + m_3DBatchViewID = glGetUniformLocation(m_3DBatchProID, "V"); + m_3DBatchModelID = glGetAttribLocation(m_3DBatchProID, "M"); + m_3DBatchNormalMatrixID = glGetAttribLocation(m_3DBatchProID, "normalMatrix"); + m_3DBatchVertexID = glGetAttribLocation(m_3DBatchProID, "vertexPositionModelspace"); + m_3DBatchNormalID = glGetAttribLocation(m_3DBatchProID, "vertexNormalModelspace"); + m_3DBatchColorID = glGetAttribLocation(m_3DBatchProID, "barColor"); + } + else + { + //use 300 + m_3DProID = OpenGLHelper::LoadShaders("shape3DVertexShaderV300", "shape3DFragmentShaderV300"); + m_3DProjectionID = glGetUniformLocation(m_3DProID, "P"); + m_3DViewID = glGetUniformLocation(m_3DProID, "V"); + m_3DModelID = glGetUniformLocation(m_3DProID, "M"); + m_3DNormalMatrixID = glGetUniformLocation(m_3DProID, "normalMatrix"); + m_3DMaterialAmbientID = glGetUniformLocation(m_3DProID, "materialAmbient"); + m_3DMaterialDiffuseID = glGetUniformLocation(m_3DProID, "materialDiffuse"); + m_3DMaterialSpecularID = glGetUniformLocation(m_3DProID, "materialSpecular"); + m_3DMaterialColorID = glGetUniformLocation(m_3DProID, "materialColor"); + m_3DMaterialTwoSidesID = glGetUniformLocation(m_3DProID, "twoSidesLighting"); + m_3DMaterialShininessID = glGetUniformLocation(m_3DProID, "materialShininess"); + m_3DLightColorID = glGetUniformLocation(m_3DProID, "lightColor"); + m_3DLightPosID = glGetUniformLocation(m_3DProID, "lightPosWorldspace"); + m_3DLightPowerID = glGetUniformLocation(m_3DProID, "lightPower"); + m_3DLightNumID = glGetUniformLocation(m_3DProID, "lightNum"); + m_3DLightAmbientID = glGetUniformLocation(m_3DProID, "lightAmbient"); + m_3DVertexID = glGetAttribLocation(m_3DProID, "vertexPositionModelspace"); + m_3DNormalID = glGetAttribLocation(m_3DProID, "vertexNormalModelspace"); + } m_TextProID = OpenGLHelper::LoadShaders("textVertexShader", "textFragmentShader"); m_TextMatrixID = glGetUniformLocation(m_TextProID, "MVP"); m_TextVertexID = glGetAttribLocation(m_TextProID, "vPosition"); @@ -177,14 +244,6 @@ void OpenGL3DRenderer::ShaderResources::LoadShaders() m_2DVertexID = glGetAttribLocation(m_CommonProID, "vPosition"); m_2DColorID = glGetUniformLocation(m_CommonProID, "vColor"); - m_3DBatchProID = OpenGLHelper::LoadShaders("shape3DVertexShaderBatch", "shape3DFragmentShaderBatch"); - m_3DBatchProjectionID = glGetUniformLocation(m_3DBatchProID, "P"); - m_3DBatchViewID = glGetUniformLocation(m_3DBatchProID, "V"); - m_3DBatchModelID = glGetAttribLocation(m_3DBatchProID, "M"); - m_3DBatchNormalMatrixID = glGetAttribLocation(m_3DBatchProID, "normalMatrix"); - m_3DBatchVertexID = glGetAttribLocation(m_3DBatchProID, "vertexPositionModelspace"); - m_3DBatchNormalID = glGetAttribLocation(m_3DBatchProID, "vertexNormalModelspace"); - m_3DBatchColorID = glGetAttribLocation(m_3DBatchProID, "barColor"); CHECK_GL_ERROR(); } @@ -258,6 +317,7 @@ void OpenGL3DRenderer::init() m_fViewAngle = 30.0f; m_3DProjection = glm::perspective(m_fViewAngle, (float)m_iWidth / (float)m_iHeight, 0.01f, 6000.0f); + CheckGLSLVersion(); maResources.LoadShaders(); maPickingResources.LoadShaders(); @@ -280,9 +340,12 @@ void OpenGL3DRenderer::init() m_Extrude3DInfo.rounded = false; CHECK_GL_ERROR(); - Init3DUniformBlock(); - InitBatch3DUniformBlock(); - + if (maResources.m_b330Support) + { + Init3DUniformBlock(); + InitBatch3DUniformBlock(); + } + CHECK_GL_ERROR(); glViewport(0, 0, m_iWidth, m_iHeight); Set3DSenceInfo(0xFFFFFF, true); } commit 1d05b6a490867f3dcdb8d4bf0aed3162af9cf1ff Author: weigao <wei...@multicorewareinc.com> Date: Sat Jun 14 08:00:02 2014 -0700 add shaders for 3.0 glsl version Change-Id: I52dd49132a9b625e8be51b4d5feb7e567ffa0a6e diff --git a/chart2/Package_opengl.mk b/chart2/Package_opengl.mk index d8f9fa7..3d68a93 100644 --- a/chart2/Package_opengl.mk +++ b/chart2/Package_opengl.mk @@ -30,6 +30,8 @@ $(eval $(call gb_Package_add_files,chart2_opengl_shader,$(LIBO_BIN_FOLDER)/openg renderTextureFragmentShader.glsl \ shape3DFragmentShaderBatch.glsl \ shape3DVertexShaderBatch.glsl \ + shape3DFragmentShaderV300.glsl \ + shape3DVertexShaderV300.glsl \ )) # vim: set noet sw=4 ts=4: diff --git a/chart2/opengl/shape3DFragmentShaderV300.glsl b/chart2/opengl/shape3DFragmentShaderV300.glsl new file mode 100644 index 0000000..31a32e0 --- /dev/null +++ b/chart2/opengl/shape3DFragmentShaderV300.glsl @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#define MAX_LIGHT_NUM 8 + +varying vec3 positionWorldspace; +varying vec3 normalCameraspace; + +uniform mat4 V; +uniform vec4 materialAmbient; +uniform vec4 materialDiffuse; +uniform vec4 materialSpecular; +uniform vec4 materialColor; +uniform int twoSidesLighting; +uniform float materialShininess; +uniform vec4 lightColor[MAX_LIGHT_NUM]; +uniform vec4 lightPosWorldspace[MAX_LIGHT_NUM]; +uniform float lightPower[MAX_LIGHT_NUM]; +uniform int lightNum; +uniform vec4 lightAmbient; + +void main() +{ + vec3 colorTotal = vec3(0.0f, 0.0f, 0.0f); + + vec3 vertexPositionCameraspace = (V * vec4(positionWorldspace,1)).xyz; + + vec3 MaterialDiffuseColor = materialColor.rgb; + + vec3 normalDirectionCameraspace = normalCameraspace; + vec3 eyeDirectionCameraspace = normalize(vec3(0, 0, 0) - vertexPositionCameraspace); + float attenuation = 1.0; + int i = 0; + vec3 lightDirectionCameraspace; + vec3 vertexToLightSource; + + vec3 totalAmbient = lightAmbient.rgb * + MaterialDiffuseColor * + materialAmbient.rgb + * 5.0; + + if ((twoSidesLighting == 1) && (!gl_FrontFacing)) + { + normalDirectionCameraspace = -normalDirectionCameraspace; + } + for (i = 0; i < lightNum; i++) + { + float LightPower = lightPower[i]; + lightDirectionCameraspace = normalize((V * lightPosWorldspace[i]).xyz); + + float cosTheta = clamp(dot(normalDirectionCameraspace,lightDirectionCameraspace), 0,1); + vec3 lightDiffuse = LightPower * + attenuation * + lightColor[i].rgb * + MaterialDiffuseColor * + materialDiffuse.rgb * + cosTheta; + + vec3 specularReflection; + if (dot(normalDirectionCameraspace, lightDirectionCameraspace) < 0) + { + specularReflection = vec3(0.0, 0.0, 0.0); + } + else + { + vec3 R = reflect(-lightDirectionCameraspace,normalDirectionCameraspace); + float cosAlpha = clamp(dot(eyeDirectionCameraspace, R), 0,1); + specularReflection = attenuation * + LightPower * + lightColor[i].rgb * + materialSpecular.rgb * + MaterialDiffuseColor * + pow(max(0.0, cosAlpha), materialShininess); + } + colorTotal += lightDiffuse + specularReflection; + + } + colorTotal += totalAmbient; + gl_FragColor = vec4(colorTotal, 1.0); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/opengl/shape3DVertexShaderV300.glsl b/chart2/opengl/shape3DVertexShaderV300.glsl new file mode 100644 index 0000000..6737004 --- /dev/null +++ b/chart2/opengl/shape3DVertexShaderV300.glsl @@ -0,0 +1,29 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +attribute vec3 vertexPositionModelspace; +attribute vec3 vertexNormalModelspace; + +varying vec3 positionWorldspace; +varying vec3 normalCameraspace; + +uniform mat4 P; +uniform mat4 M; +uniform mat4 V; +uniform mat3 normalMatrix; + +void main() +{ + gl_Position = P * V * M * vec4(vertexPositionModelspace,1); + + positionWorldspace = (M * vec4(vertexPositionModelspace,1)).xyz; + + normalCameraspace = normalize(mat3(V) * normalMatrix * vertexNormalModelspace); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 0bed429ef5a44137ad3c82b3b70a2617c7e741c0 Author: weigao <wei...@multicorewareinc.com> Date: Mon Jun 16 23:40:36 2014 -0700 modify the mouse drag function Change-Id: I9639b2a29522ba0765f4442c2f78de56388fe754 diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index 2fd8181..a4e1901 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -414,19 +414,19 @@ void GL3DBarChart::clickedAt(const Point& rPos, sal_uInt16 nButtons) pScreenText->render(); } -void GL3DBarChart::mouseDragMove(const Point& , const Point& , sal_uInt16 nButtons) +void GL3DBarChart::mouseDragMove(const Point& rStartPos, const Point& rEndPos, sal_uInt16 nButtons) { if(mbBlockUserInput) return; mbBlockUserInput = true; - - if(nButtons == MOUSE_RIGHT) + long direction = rEndPos.X() - rStartPos.X(); + if(direction < 0) { mnCornerId = (mnCornerId + 1) % 4; moveToCorner(); } - else if(nButtons == MOUSE_LEFT) + else if(direction > 0) { mnCornerId = mnCornerId - 1; if(mnCornerId < 0) @@ -437,33 +437,33 @@ void GL3DBarChart::mouseDragMove(const Point& , const Point& , sal_uInt16 nButto glm::vec3 GL3DBarChart::getCornerPosition(sal_Int8 nId) { + float pi = 3.1415926; switch(nId) { case 0: { - return glm::vec3(-30, -30, DEFAULT_CAMERA_HEIGHT); + return glm::vec3(mnMaxX / 2 - mnDistance * sin(pi / 4), mnMaxY / 2 - mnDistance * cos(pi / 4), DEFAULT_CAMERA_HEIGHT * 2); } break; case 1: { - return glm::vec3(mnMaxX, -30, DEFAULT_CAMERA_HEIGHT); + return glm::vec3(mnMaxX / 2 + mnDistance * sin(pi / 4), mnMaxY / 2 - mnDistance * cos(pi / 4), DEFAULT_CAMERA_HEIGHT * 2); } break; case 2: { - return glm::vec3(mnMaxX, mnMaxY, DEFAULT_CAMERA_HEIGHT); + return glm::vec3(mnMaxX / 2 + mnDistance * sin(pi / 4), mnMaxY / 2 + mnDistance * cos(pi / 4), DEFAULT_CAMERA_HEIGHT * 2); } break; case 3: { - return glm::vec3(-30, mnMaxY, DEFAULT_CAMERA_HEIGHT); + return glm::vec3(mnMaxX / 2 - mnDistance * sin(pi / 4), mnMaxY / 2 + mnDistance * cos(pi / 4), DEFAULT_CAMERA_HEIGHT * 2); } break; default: assert(false); } - - return glm::vec3(-30, -30, DEFAULT_CAMERA_HEIGHT); + return maDefaultCameraPosition; } void GL3DBarChart::moveToCorner() commit f1c79fc1707bec384c55f7f493962beffda79277 Author: weigao <wei...@multicorewareinc.com> Date: Mon Jun 16 23:33:03 2014 -0700 add move to default process Change-Id: I8d562b3e2d1bb83a6e07ed089a3006a109beeece diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index e0689a8..2fd8181 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -355,24 +355,19 @@ void GL3DBarChart::moveToDefault() glm::vec3 maTargetDirection = maDefaultCameraDirection; maStepDirection = (maTargetDirection - maCameraDirection)/((float)mnStepsTotal); - while((mnStep < mnStepsTotal) && mbBlockUserInput) - { - ++mnStep; - maCameraPosition += maStep; - mpCamera->setPosition(maCameraPosition); - maCameraDirection += maStepDirection; - mpCamera->setDirection(maCameraDirection); - render(); - } - maShapes.pop_back(); - mbBlockUserInput = false; - mnStep = 0; + maTimer.SetTimeout(TIMEOUT); + maTimer.SetTimeoutHdl(LINK(this, GL3DBarChart, MoveToBar)); + maTimer.Start(); } void GL3DBarChart::clickedAt(const Point& rPos, sal_uInt16 nButtons) { if(mbBlockUserInput) return; + if (nButtons == MOUSE_RIGHT) + { + moveToDefault(); + } if(nButtons != MOUSE_LEFT) return; commit 1877c8ccf0a6aafdcbadc62740656e11af06cf61 Author: weigao <wei...@multicorewareinc.com> Date: Mon Jun 16 23:21:04 2014 -0700 modify the click view angle Change-Id: I8717745d2f503f8ad3c21673a07aed867b5681f9 diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index 9f51196..e0689a8 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -398,14 +398,15 @@ void GL3DBarChart::clickedAt(const Point& rPos, sal_uInt16 nButtons) render(); glm::vec3 maTargetPosition = rBarInfo.maPos; - maTargetPosition.z += 45; - maStep = (maTargetPosition - maCameraPosition)/100.0f; + maTargetPosition.z += 240; + maTargetPosition.y += BAR_SIZE_Y / 2.0f; + maStep = (maTargetPosition - maCameraPosition)/((float)mnStepsTotal); glm::vec3 maTargetDirection = rBarInfo.maPos; maTargetDirection.x += BAR_SIZE_X / 2.0f; maTargetDirection.y += BAR_SIZE_Y / 2.0f; - maStepDirection = (maTargetDirection - maCameraDirection)/100.f; + maStepDirection = (maTargetDirection - maCameraDirection)/((float)mnStepsTotal); maTimer.SetTimeout(TIMEOUT); maTimer.SetTimeoutHdl(LINK(this, GL3DBarChart, MoveToBar)); commit fc42841c516b36feb13fedf8e15864f41b6aa65d Author: weigao <wei...@multicorewareinc.com> Date: Mon Jun 16 23:08:00 2014 -0700 modify the default view angle Change-Id: Ic7c901108a290a9d9c5a8564b6eefa7ed32a9e1f diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index f2ec238..9f51196 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -36,7 +36,8 @@ GL3DBarChart::GL3DBarChart( mnStepsTotal(0), mnCornerId(0), mbBlockUserInput(false), - mbNeedsNewRender(true) + mbNeedsNewRender(true), + mbCameraInit(false) { Size aSize = mrWindow.GetSizePixel(); mpRenderer->SetSize(aSize); @@ -61,9 +62,9 @@ GL3DBarChart::~GL3DBarChart() namespace { -const float TEXT_HEIGHT = 15.0f; -const float DEFAULT_CAMERA_HEIGHT = 500.0f; -const size_t STEPS = 100; +const float TEXT_HEIGHT = 10.0f; +float DEFAULT_CAMERA_HEIGHT = 500.0f; +const size_t STEPS = 200; const sal_uLong TIMEOUT = 5; const sal_uInt32 ID_STEP = 10; @@ -266,12 +267,28 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer mnMaxX = nMaxPointCount * (BAR_SIZE_X + BAR_DISTANCE_X) + 40; mnMaxY = nSeriesIndex * (BAR_SIZE_Y + BAR_DISTANCE_Y) + 40; - - maCameraPosition = glm::vec3(-30, -30, DEFAULT_CAMERA_HEIGHT); - mpCamera->setPosition(maCameraPosition); - maCameraDirection = glm::vec3(mnMaxX/2, mnMaxY/2, 0); - mpCamera->setDirection(maCameraDirection); - + if (!mbCameraInit) + { + mnDistance = sqrt(mnMaxX * mnMaxX + mnMaxY * mnMaxY + DEFAULT_CAMERA_HEIGHT * DEFAULT_CAMERA_HEIGHT); + maDefaultCameraDirection = glm::vec3(mnMaxX * 0.4, mnMaxY * 0.35, 0); + maDefaultCameraPosition = glm::vec3(maDefaultCameraDirection.x, maDefaultCameraDirection.y - mnDistance, DEFAULT_CAMERA_HEIGHT * 2); + mnCornerId = 0; + mbCameraInit = true; + float pi = 3.1415926f; + float angleX = -pi / 6.5f; + float angleZ = -pi / 8.0f; + glm::mat4 maDefaultRotateMatrix = glm::eulerAngleYXZ(0.0f, angleX, angleZ); + maDefaultCameraPosition = glm::vec3(maDefaultRotateMatrix * glm::vec4(maDefaultCameraPosition, 1.0f)); + maCameraPosition = maDefaultCameraPosition; + maCameraDirection = maDefaultCameraDirection; + mpCamera->setPosition(maCameraPosition); + mpCamera->setDirection(maCameraDirection); + } + else + { + mpCamera->setPosition(maCameraPosition); + mpCamera->setDirection(maCameraDirection); + } mbNeedsNewRender = true; } @@ -328,6 +345,30 @@ public: } +void GL3DBarChart::moveToDefault() +{ + mnStepsTotal = STEPS; + mnStep = 0; + mbBlockUserInput = true; + glm::vec3 maTargetPosition = maDefaultCameraPosition; + maStep = (maTargetPosition - maCameraPosition)/((float)mnStepsTotal); + + glm::vec3 maTargetDirection = maDefaultCameraDirection; + maStepDirection = (maTargetDirection - maCameraDirection)/((float)mnStepsTotal); + while((mnStep < mnStepsTotal) && mbBlockUserInput) + { + ++mnStep; + maCameraPosition += maStep; + mpCamera->setPosition(maCameraPosition); + maCameraDirection += maStepDirection; + mpCamera->setDirection(maCameraDirection); + render(); + } + maShapes.pop_back(); + mbBlockUserInput = false; + mnStep = 0; +} + void GL3DBarChart::clickedAt(const Point& rPos, sal_uInt16 nButtons) { if(mbBlockUserInput) diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx index 0566904..d3426a3 100644 --- a/chart2/source/view/inc/GL3DBarChart.hxx +++ b/chart2/source/view/inc/GL3DBarChart.hxx @@ -58,6 +58,7 @@ public: private: void moveToCorner(); + void moveToDefault(); glm::vec3 getCornerPosition(sal_Int8 nCornerId); DECL_LINK(MoveCamera, void*); @@ -77,6 +78,9 @@ private: glm::vec3 maCameraPosition; glm::vec3 maCameraDirection; + glm::vec3 maDefaultCameraPosition; + glm::vec3 maDefaultCameraDirection; + Timer maTimer; glm::vec3 maStep; glm::vec3 maStepDirection; @@ -84,6 +88,7 @@ private: size_t mnStepsTotal; float mnMaxX; float mnMaxY; + float mnDistance; /** * 0 = corner at (0,0,0); * numbering counter clockwise @@ -107,6 +112,7 @@ private: std::map<sal_uInt32, const BarInformation> maBarMap; bool mbBlockUserInput; bool mbNeedsNewRender; + bool mbCameraInit; }; } commit c90b597698d7a41d69daadbaeef22440dde72d7a Author: weigao <wei...@multicorewareinc.com> Date: Mon Jun 16 22:58:26 2014 -0700 modify the perspective view angle to 30 Change-Id: I07b39f8b372368f82137feec3a6d12921fc1ec9f diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index f82dbaa..287c98a 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -255,7 +255,7 @@ void OpenGL3DRenderer::init() glBufferData(GL_ARRAY_BUFFER, sizeof(boundBoxNormal), boundBoxNormal, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); - m_fViewAngle = 60.0f; + m_fViewAngle = 30.0f; m_3DProjection = glm::perspective(m_fViewAngle, (float)m_iWidth / (float)m_iHeight, 0.01f, 6000.0f); maResources.LoadShaders(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits