[Libreoffice-commits] core.git: 4 commits - chart2/opengl chart2/Package_opengl.mk chart2/source

Markus Mohrhard markus.mohrhard at googlemail.com
Wed May 7 20:27:23 PDT 2014


 chart2/Package_opengl.mk                       |    2 
 chart2/opengl/renderTextureFragmentShader.glsl |   18 ++
 chart2/opengl/renderTextureVertexShader.glsl   |   19 ++
 chart2/source/view/inc/GL3DRenderer.hxx        |   15 +
 chart2/source/view/inc/StaticGeometry.h        |   31 +++
 chart2/source/view/main/3DChartObjects.cxx     |    5 
 chart2/source/view/main/GL3DRenderer.cxx       |  213 ++++++++++++++++++++-----
 7 files changed, 259 insertions(+), 44 deletions(-)

New commits:
commit 2ca8dbba58a44d4b65cbe78508d7ad0ef76cffa0
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu May 8 05:22:45 2014 +0200

    add include guards
    
    Change-Id: I42ba4a97de241637b36704958fcf7b32d308a8a1

diff --git a/chart2/source/view/inc/StaticGeometry.h b/chart2/source/view/inc/StaticGeometry.h
index cbfbcce..e734ade 100644
--- a/chart2/source/view/inc/StaticGeometry.h
+++ b/chart2/source/view/inc/StaticGeometry.h
@@ -1,3 +1,15 @@
+/* -*- 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/.
+ */
+
+#ifndef INCLUDED_CHART2_STATIC_GEOMETRY_H
+#define INCLUDED_CHART2_STATIC_GEOMETRY_H
+
 #define TOP_SURFACE 0
 #define MIDDLE_SURFACE 1
 #define BOTTOM_SURFACE 2
@@ -127,4 +139,6 @@ static GLfloat squareVertices[] = {
     -1.0f,  1.0f, -1.0
 };
 
+#endif
 
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit a63ad6f2749f054270671285d1f49057c3013d56
Author: weigao <weigao at multicorewareinc.com>
Date:   Wed May 7 15:10:42 2014 +0800

    add reverse image shader
    
    Change-Id: Ibd3aff8aeb71626dada762b53cde8f50f7fbf812

diff --git a/chart2/Package_opengl.mk b/chart2/Package_opengl.mk
index 626a50f..d96a1ce 100644
--- a/chart2/Package_opengl.mk
+++ b/chart2/Package_opengl.mk
@@ -22,6 +22,8 @@ $(eval $(call gb_Package_add_files,chart2_opengl_shader,$(LIBO_BIN_FOLDER)/openg
 	textVertexShader.glsl \
 	shape3DFragmentShader.glsl \
 	shape3DVertexShader.glsl \
+	renderTextureVertexShader.glsl \
+	renderTextureFragmentShader.glsl \
 ))
 
 # vim: set noet sw=4 ts=4:
diff --git a/chart2/opengl/renderTextureFragmentShader.glsl b/chart2/opengl/renderTextureFragmentShader.glsl
new file mode 100644
index 0000000..a6c71f4
--- /dev/null
+++ b/chart2/opengl/renderTextureFragmentShader.glsl
@@ -0,0 +1,18 @@
+/* -*- 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/.
+ */
+
+uniform sampler2D RenderTex;
+varying vec2 vTexCoord;
+
+void main()
+{
+    gl_FragColor = vec4(texture2D(RenderTex, vTexCoord).rgb, 1.0);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/opengl/renderTextureVertexShader.glsl b/chart2/opengl/renderTextureVertexShader.glsl
new file mode 100644
index 0000000..dd11b15
--- /dev/null
+++ b/chart2/opengl/renderTextureVertexShader.glsl
@@ -0,0 +1,19 @@
+/* -*- 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 vec4 vPosition;
+attribute vec2 texCoord;
+varying vec2 vTexCoord;
+void main()
+{
+    gl_Position =  vPosition;
+    vTexCoord = texCoord;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx
index c47357c..928fa25 100644
--- a/chart2/source/view/inc/GL3DRenderer.hxx
+++ b/chart2/source/view/inc/GL3DRenderer.hxx
@@ -235,6 +235,7 @@ private:
                                int iSubDivZ, float width, float height, float depth);
     void CreateSceneBoxView();
     void CreateBMPHeader(sal_uInt8 *bmpHeader, int xsize, int ysize);
+    void RenderTexture(GLuint TexID);
 private:
     // Projection matrix : default 45 degree Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
     glm::mat4 m_Projection;
@@ -353,6 +354,17 @@ private:
     GLint m_2DVertexID;
     GLint m_2DColorID;
 
+    GLint m_RenderProID;
+
+    GLuint m_RenderVertexBuf;
+
+    GLuint m_RenderTexCoordBuf;
+
+    GLint m_RenderTexID;
+
+    GLint m_RenderVertexID;
+
+    GLint m_RenderTexCoordID;
     //TODO: moggi: kill the following parts
     // don't add anything below or I will remove it
 #if 0
diff --git a/chart2/source/view/inc/StaticGeometry.h b/chart2/source/view/inc/StaticGeometry.h
index 2ee0446..cbfbcce 100644
--- a/chart2/source/view/inc/StaticGeometry.h
+++ b/chart2/source/view/inc/StaticGeometry.h
@@ -104,7 +104,7 @@ static const GLfloat boundBoxNormal[] = {
     1.0f, 0.0f, 0.0f//12
 };
 
-GLfloat coordinateAxis[] = {
+static GLfloat coordinateAxis[] = {
       -1.0, 0.0, 0.0,
       1.0, 0.0, 0.0,//x
       0.0, 0.0, -1.0,
@@ -113,3 +113,18 @@ GLfloat coordinateAxis[] = {
       0.0, 1.0, 0.0//y
 };
 
+static GLfloat coordReverseVertices[] = {
+    0.0f, 1.0f,
+    1.0f, 1.0f,
+    1.0f, 0.0f,
+    0.0f, 0.0f,
+};
+
+static GLfloat squareVertices[] = {
+    -1.0f, -1.0f, -1.0,
+    1.0f, -1.0f, -1.0,
+    1.0f,  1.0f, -1.0,
+    -1.0f,  1.0f, -1.0
+};
+
+
diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index 438fa77..7725cbf 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -127,6 +127,12 @@ void OpenGL3DRenderer::LoadShaders()
     m_MatrixID = glGetUniformLocation(m_CommonProID, "MVP");
     m_2DVertexID = glGetAttribLocation(m_CommonProID, "vPosition");
     m_2DColorID = glGetUniformLocation(m_CommonProID, "vColor");
+
+    m_RenderProID = OpenGLHelper::LoadShaders("renderTextureVertexShader", "renderTextureFragmentShader");
+    m_RenderVertexID = glGetAttribLocation(m_RenderProID, "vPosition");
+    m_RenderTexCoordID = glGetAttribLocation(m_RenderProID, "texCoord");
+    m_RenderTexID = glGetUniformLocation(m_RenderProID, "RenderTex");
+    printf("m_RenderProID = %d, m_RenderVertexID = %d\n", m_RenderProID, m_RenderVertexID);
     CHECK_GL_ERROR();
 }
 
@@ -181,7 +187,6 @@ void OpenGL3DRenderer::CreateFrameBufferObj()
         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_RboID[i]);
         glCheckFramebufferStatus(GL_FRAMEBUFFER);
         glBindRenderbuffer(GL_RENDERBUFFER, 0);
-        glBindFramebuffer(GL_FRAMEBUFFER, m_FboID[0]);
     }
 }
 
@@ -197,7 +202,40 @@ void OpenGL3DRenderer::SetCameraInfo(glm::vec3 pos, glm::vec3 direction, glm::ve
     m_CameraInfo.cameraUp = up;
 }
 
+void OpenGL3DRenderer::RenderTexture(GLuint TexID)
+{
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
+    glUseProgram(m_RenderProID);
+
+    glEnableVertexAttribArray(m_RenderVertexID);
+    glBindBuffer(GL_ARRAY_BUFFER, m_RenderVertexBuf);
+    glVertexAttribPointer(
+        m_RenderVertexID,                  // attribute. No particular reason for 0, but must match the layout in the shader.
+        3,                  // size
+        GL_FLOAT,           // type
+        GL_FALSE,           // normalized?
+        0,                  // stride
+        (void*)0            // array buffer offset
+        );
+    glEnableVertexAttribArray(m_RenderTexCoordID);
+    glBindBuffer(GL_ARRAY_BUFFER, m_RenderTexCoordBuf);
+    glVertexAttribPointer(
+        m_RenderTexCoordID,                  // 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
+        );
+    glBindTexture(GL_TEXTURE_2D, TexID);
+    glUniform1i(m_RenderTexID, 0);
+    glDrawArrays(GL_QUADS, 0, 4);
+    glDisableVertexAttribArray(m_RenderTexCoordID);
+    glDisableVertexAttribArray(m_RenderVertexID);
+    glBindTexture(GL_TEXTURE_2D, 0);
+    glUseProgram(0);
+}
 
 void OpenGL3DRenderer::init()
 {
@@ -251,6 +289,17 @@ void OpenGL3DRenderer::init()
     glBindBuffer(GL_ARRAY_BUFFER, m_TextTexCoordBuf);
     glBufferData(GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW);
     glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+    glGenBuffers(1, &m_RenderTexCoordBuf);
+    glBindBuffer(GL_ARRAY_BUFFER, m_RenderTexCoordBuf);
+    glBufferData(GL_ARRAY_BUFFER, sizeof(coordReverseVertices), coordReverseVertices, GL_STATIC_DRAW);
+    glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+    glGenBuffers(1, &m_RenderVertexBuf);
+    glBindBuffer(GL_ARRAY_BUFFER, m_RenderVertexBuf);
+    glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertices), squareVertices, GL_STATIC_DRAW);
+    glBindBuffer(GL_ARRAY_BUFFER, 0);
+
     CHECK_GL_ERROR();
     Init3DUniformBlock();
 
@@ -1526,11 +1575,6 @@ void OpenGL3DRenderer::ProcessUnrenderedShape()
 #if 1
     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();
     }
     glBindFramebuffer(GL_FRAMEBUFFER, m_FboID[0]);
@@ -1546,6 +1590,9 @@ void OpenGL3DRenderer::ProcessUnrenderedShape()
     RenderTextShape();
     //render the axis
     RenderCoordinateAxis();
+    glBindFramebuffer(GL_FRAMEBUFFER, m_FboID[1]);
+    glViewport(0, 0, m_iWidth, m_iHeight);
+    RenderTexture(m_TextureObj[0]);
 #if DEBUG_FBO
     char fileName[256] = {0};
     sprintf(fileName, "D://shaderout_%d_%d.bmp", m_iWidth, m_iHeight);
commit 8018772ac7c75a042a6749d1c675401cd4c77d62
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Thu May 8 05:16:49 2014 +0200

    fix wrong access to array
    
    Change-Id: I3298bd15260b2cbfd9a74024504d982dc00f4137

diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index a1f648b..438fa77 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -1082,7 +1082,8 @@ void OpenGL3DRenderer::RenderExtrudeFlatSurface(const Extrude3DInfo& extrude3D,
     glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix);
     glUniformMatrix4fv(m_3DModelID, 1, GL_FALSE, &m_Model[0][0]);
     glUniformMatrix3fv(m_3DNormalMatrixID, 1, GL_FALSE, &normalInverseTranspos[0][0]);
-    glDrawElements(GL_TRIANGLES, extrude3D.size[surIndex], GL_UNSIGNED_SHORT, (void *)extrude3D.startIndex[surIndex]);
+    //TODO: moggi: startIndex is int!!!!
+    glDrawElements(GL_TRIANGLES, extrude3D.size[surIndex], GL_UNSIGNED_SHORT, &extrude3D.startIndex[surIndex]);
 }
 
 void OpenGL3DRenderer::RenderExtrudeBottomSurface(const Extrude3DInfo& extrude3D)
@@ -1115,7 +1116,8 @@ void OpenGL3DRenderer::RenderExtrudeBottomSurface(const Extrude3DInfo& extrude3D
     glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix);
     glUniformMatrix4fv(m_3DModelID, 1, GL_FALSE, &m_Model[0][0]);
     glUniformMatrix3fv(m_3DNormalMatrixID, 1, GL_FALSE, &normalInverseTranspos[0][0]);
-    glDrawElements(GL_TRIANGLES, extrude3D.size[BOTTOM_SURFACE], GL_UNSIGNED_SHORT, (void *)extrude3D.startIndex[BOTTOM_SURFACE]);
+    //TODO: moggi: startIndex is int!!!!
+    glDrawElements(GL_TRIANGLES, extrude3D.size[BOTTOM_SURFACE], GL_UNSIGNED_SHORT, &extrude3D.startIndex[BOTTOM_SURFACE]);
 }
 
 void OpenGL3DRenderer::RenderExtrudeMiddleSurface(const Extrude3DInfo& extrude3D)
@@ -1150,7 +1152,7 @@ void OpenGL3DRenderer::RenderExtrudeMiddleSurface(const Extrude3DInfo& extrude3D
     glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix);
     glUniformMatrix4fv(m_3DModelID, 1, GL_FALSE, &m_Model[0][0]);
     glUniformMatrix3fv(m_3DNormalMatrixID, 1, GL_FALSE, &normalInverseTranspos[0][0]);
-    glDrawElements(GL_TRIANGLES, extrude3D.size[MIDDLE_SURFACE], GL_UNSIGNED_SHORT, (void *)extrude3D.startIndex[MIDDLE_SURFACE]);
+    glDrawElements(GL_TRIANGLES, extrude3D.size[MIDDLE_SURFACE], GL_UNSIGNED_SHORT, &extrude3D.startIndex[MIDDLE_SURFACE]);
 }
 
 void OpenGL3DRenderer::RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D)
@@ -1186,7 +1188,7 @@ void OpenGL3DRenderer::RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D)
     glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix);
     glUniformMatrix4fv(m_3DModelID, 1, GL_FALSE, &m_Model[0][0]);
     glUniformMatrix3fv(m_3DNormalMatrixID, 1, GL_FALSE, &normalInverseTranspos[0][0]);
-    glDrawElements(GL_TRIANGLES, extrude3D.size[TOP_SURFACE], GL_UNSIGNED_SHORT, (void *)extrude3D.startIndex[TOP_SURFACE]);
+    glDrawElements(GL_TRIANGLES, extrude3D.size[TOP_SURFACE], GL_UNSIGNED_SHORT, &extrude3D.startIndex[TOP_SURFACE]);
     RenderExtrudeFlatSurface(extrude3D, FLAT_BOTTOM_SURFACE);
 }
 
commit 38519bad1f74ad248c5c2c37dce2f978984a977c
Author: weigao <weigao at multicorewareinc.com>
Date:   Wed May 7 13:30:59 2014 +0800

    fix the render part
    
    Change-Id: I92f60d706408acefd763f0f80af5fa3398e667d4

diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx
index 1d103529..c47357c 100644
--- a/chart2/source/view/inc/GL3DRenderer.hxx
+++ b/chart2/source/view/inc/GL3DRenderer.hxx
@@ -192,6 +192,7 @@ public:
     void SetSize(const Size& rSize);
     void SetCameraInfo(glm::vec3 pos, glm::vec3 direction, glm::vec3 up, bool useDefalut);
     void CreateTextTexture(const BitmapEx& rBitmapEx, glm::vec3 vTopLeft,glm::vec3 vTopRight, glm::vec3 vBottomRight, glm::vec3 vBottomLeft);
+    void ProcessUnrenderedShape();
 private:
     void MoveModelf(PosVecf3& trans,PosVecf3& angle,PosVecf3& scale);
 
@@ -211,7 +212,6 @@ private:
     void RenderExtrudeMiddleSurface(const Extrude3DInfo& extrude3D);
     void RenderExtrudeBottomSurface(const Extrude3DInfo& extrude3D);
     void RenderExtrudeFlatSurface(const Extrude3DInfo& extrude3D, int surIndex);
-    void ProcessUnrenderedShape();
     glm::vec4 GetColorByIndex(int index);
     sal_uInt32 GetIndexByColor(sal_uInt32 r, sal_uInt32 g, sal_uInt32 b);
     void ProcessPickingBox();
@@ -234,6 +234,7 @@ private:
     int GenerateRoundCornerBar(std::vector<glm::vec3> &vertices, std::vector<glm::vec3> &normals, float fRadius, int iSubDivY,
                                int iSubDivZ, float width, float height, float depth);
     void CreateSceneBoxView();
+    void CreateBMPHeader(sal_uInt8 *bmpHeader, int xsize, int ysize);
 private:
     // Projection matrix : default 45 degree Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
     glm::mat4 m_Projection;
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index c43b999..b4ca2c4 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -112,6 +112,11 @@ void Camera::render()
     mpRenderer->SetCameraInfo(maPos, maDirection, maUp, true);
 }
 
+void Camera::zoom(sal_uInt32 /*nId*/)
+{
+    // TODO here
+}
+
 }
 
 }
diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index 40a3885..a1f648b 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -22,7 +22,9 @@
 
 #define GL_PI 3.14159f
 #define RGB_WHITE (0xFF | (0xFF << 8) | (0xFF << 16))
+#define BMP_HEADER_LEN 54
 
+#define DEBUG_FBO 0
 using namespace com::sun::star;
 
 namespace chart {
@@ -90,6 +92,8 @@ OpenGL3DRenderer::OpenGL3DRenderer():
     m_CameraInfo.useDefault = true;
     m_CameraInfo.cameraUp = glm::vec3(0, 1, 0);
     m_RoundBarMesh.iMeshSizes = 0;
+    m_FboID[0] = 0;
+    m_FboID[1] = 0;
 }
 
 namespace {
@@ -223,8 +227,6 @@ void OpenGL3DRenderer::init()
     glClearDepth(1.0f);
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
-    CreateFrameBufferObj();
-
     glGenBuffers(1, &m_CubeVertexBuf);
     glGenBuffers(1, &m_CubeNormalBuf);
     glGenBuffers(1, &m_CubeElementBuf);
@@ -242,9 +244,8 @@ void OpenGL3DRenderer::init()
     glBindBuffer(GL_ARRAY_BUFFER, m_CoordinateBuf);
     glBufferData(GL_ARRAY_BUFFER, sizeof(coordinateAxis), coordinateAxis, GL_STATIC_DRAW);
     glBindBuffer(GL_ARRAY_BUFFER, 0);
-
-
-    m_3DProjection = glm::perspective(30.0f, (float)m_iWidth / (float)m_iHeight, 0.01f, 2000.0f);
+    m_fViewAngle = 30.0f;
+    m_3DProjection = glm::perspective(m_fViewAngle, (float)m_iWidth / (float)m_iHeight, 0.01f, 2000.0f);
     LoadShaders();
     glGenBuffers(1, &m_TextTexCoordBuf);
     glBindBuffer(GL_ARRAY_BUFFER, m_TextTexCoordBuf);
@@ -252,6 +253,9 @@ void OpenGL3DRenderer::init()
     glBindBuffer(GL_ARRAY_BUFFER, 0);
     CHECK_GL_ERROR();
     Init3DUniformBlock();
+
+    glViewport(0, 0, m_iWidth, m_iHeight);
+    Set3DSenceInfo(0xFFFFFF, true);
 }
 
 void OpenGL3DRenderer::SetSize(const Size& rSize)
@@ -836,7 +840,7 @@ void OpenGL3DRenderer::Set3DSenceInfo(sal_Int32 color, bool twoSidesLighting)
                                                    1.0);
 
     m_LightsInfo.lightNum = 0;
-    SetLightInfo(true, 255, glm::vec4(1.0, 1.0, 1.0, 0.0));
+    SetLightInfo(true, 0xFFFFFF, glm::vec4(1.0, 1.0, 1.0, 0.0));
 }
 
 void OpenGL3DRenderer::SetLightInfo(bool lightOn, sal_Int32 color, const glm::vec4& direction)
@@ -927,12 +931,14 @@ void OpenGL3DRenderer::AddPolygon3DObjectPoint(float x, float y, float z)
     {
         m_Polygon3DInfo.vertices = new Vertices3D;
     }
-    float actualX = x - (float)m_iWidth / 2;
-    float actualY = y  - (float)m_iHeight / 2;
+    //float actualX = x - (float)m_iWidth / 2;
+    //float actualY = y  - (float)m_iHeight / 2;
+    float actualX = x;
+    float actualY = y;
     float actualZ = z;
     float maxCoord = std::max(actualX, std::max(actualY, actualZ));
     m_fZmax = std::max(maxCoord, m_fZmax);
-    m_Polygon3DInfo.vertices->push_back(glm::vec3(actualX, -actualY, actualZ));
+    m_Polygon3DInfo.vertices->push_back(glm::vec3(actualX, actualY, actualZ));
     m_SenceBox.maxXCoord = std::max(m_SenceBox.maxXCoord, actualX);
     m_SenceBox.minXCoord = std::min(m_SenceBox.minXCoord, actualX);
 
@@ -956,10 +962,10 @@ void OpenGL3DRenderer::AddShape3DExtrudeObject(bool roundedCorner, sal_Int32 col
     glm::vec4 DirY = modelMatrix * glm::vec4(0.0, 1.0, 0.0, 0.0);
     glm::vec4 DirZ = modelMatrix * glm::vec4(0.0, 0.0, 1.0, 0.0);
     m_Extrude3DInfo.xScale = glm::length(DirX);
-    m_Extrude3DInfo.yScale = glm::length(DirY);
-    m_Extrude3DInfo.zScale = glm::length(DirZ);
+    m_Extrude3DInfo.yScale = glm::length(DirZ);
+    m_Extrude3DInfo.zScale = glm::length(DirY);
     glm::mat4 transformMatrixInverse = glm::inverse(glm::translate(glm::vec3(tranform)));
-    glm::mat4 scaleMatrixInverse = glm::inverse(glm::scale(m_Extrude3DInfo.xScale, m_Extrude3DInfo.yScale, m_Extrude3DInfo.zScale));
+    glm::mat4 scaleMatrixInverse = glm::inverse(glm::scale(m_Extrude3DInfo.xScale, m_Extrude3DInfo.zScale, m_Extrude3DInfo.yScale));
     m_Extrude3DInfo.rotation = transformMatrixInverse * modelMatrix * scaleMatrixInverse;
     //color
     m_Extrude3DInfo.extrudeColor = glm::vec4((float)(((color) & 0x00FF0000) >> 16) / 255.0f,
@@ -979,10 +985,35 @@ void OpenGL3DRenderer::AddShape3DExtrudeObject(bool roundedCorner, sal_Int32 col
     m_Extrude3DInfo.material.ambient = glm::vec4(0.2, 0.2, 0.2, 1.0);
 
     m_Extrude3DInfo.material.shininess = 1.0f;
-    m_Extrude3DInfo.xTransform = tranform.x - ((float)m_iWidth / 2);
-    m_Extrude3DInfo.yTransform = tranform.y - ((float)m_iHeight / 2);
+    m_Extrude3DInfo.xTransform = tranform.x;
+    m_Extrude3DInfo.yTransform = tranform.y;
     m_Extrude3DInfo.zTransform = tranform.z;
+//    m_Extrude3DInfo.zTransform = 0;
     m_Extrude3DInfo.rounded = roundedCorner;
+    if (m_Extrude3DInfo.rounded && (m_RoundBarMesh.iMeshSizes == 0))
+    {
+        CreateActualRoundedCube(0.1f, 30, 30, 1.0f, 1.2f, m_Extrude3DInfo.zScale / m_Extrude3DInfo.xScale);
+        AddVertexData(m_CubeVertexBuf);
+        AddNormalData(m_CubeNormalBuf);
+        AddIndexData(m_CubeElementBuf);
+        for (int j = 0; j < 5; j++)
+        {
+            m_Extrude3DInfo.startIndex[j] = m_RoundBarMesh.iElementStartIndices[j];
+            m_Extrude3DInfo.size[j] = m_RoundBarMesh.iElementSizes[j];
+        }
+    }
+    m_Vertices.clear();
+    m_Normals.clear();
+    m_Indeices.clear();
+    m_SenceBox.maxXCoord = std::max(m_SenceBox.maxXCoord, m_Extrude3DInfo.xTransform + m_Extrude3DInfo.xScale);
+    m_SenceBox.minXCoord = std::min(m_SenceBox.minXCoord, m_Extrude3DInfo.xTransform);
+
+    m_SenceBox.maxYCoord = std::max(m_SenceBox.maxYCoord, m_Extrude3DInfo.yTransform + m_Extrude3DInfo.yScale);
+    m_SenceBox.minYCoord = std::min(m_SenceBox.minYCoord, m_Extrude3DInfo.yTransform );
+
+    m_SenceBox.maxZCoord = std::max(m_SenceBox.maxZCoord, m_Extrude3DInfo.zTransform + m_Extrude3DInfo.zScale);
+    m_SenceBox.minZCoord = std::min(m_SenceBox.minZCoord, m_Extrude3DInfo.zTransform);
+
 }
 
 void OpenGL3DRenderer::EndAddShape3DExtrudeObject()
@@ -1051,7 +1082,7 @@ void OpenGL3DRenderer::RenderExtrudeFlatSurface(const Extrude3DInfo& extrude3D,
     glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix);
     glUniformMatrix4fv(m_3DModelID, 1, GL_FALSE, &m_Model[0][0]);
     glUniformMatrix3fv(m_3DNormalMatrixID, 1, GL_FALSE, &normalInverseTranspos[0][0]);
-    glDrawElements(GL_TRIANGLES, extrude3D.size[surIndex], GL_UNSIGNED_SHORT, &extrude3D.startIndex[surIndex]);
+    glDrawElements(GL_TRIANGLES, extrude3D.size[surIndex], GL_UNSIGNED_SHORT, (void *)extrude3D.startIndex[surIndex]);
 }
 
 void OpenGL3DRenderer::RenderExtrudeBottomSurface(const Extrude3DInfo& extrude3D)
@@ -1084,7 +1115,7 @@ void OpenGL3DRenderer::RenderExtrudeBottomSurface(const Extrude3DInfo& extrude3D
     glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix);
     glUniformMatrix4fv(m_3DModelID, 1, GL_FALSE, &m_Model[0][0]);
     glUniformMatrix3fv(m_3DNormalMatrixID, 1, GL_FALSE, &normalInverseTranspos[0][0]);
-    glDrawElements(GL_TRIANGLES, extrude3D.size[BOTTOM_SURFACE], GL_UNSIGNED_SHORT, &extrude3D.startIndex[BOTTOM_SURFACE]);
+    glDrawElements(GL_TRIANGLES, extrude3D.size[BOTTOM_SURFACE], GL_UNSIGNED_SHORT, (void *)extrude3D.startIndex[BOTTOM_SURFACE]);
 }
 
 void OpenGL3DRenderer::RenderExtrudeMiddleSurface(const Extrude3DInfo& extrude3D)
@@ -1119,7 +1150,7 @@ void OpenGL3DRenderer::RenderExtrudeMiddleSurface(const Extrude3DInfo& extrude3D
     glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix);
     glUniformMatrix4fv(m_3DModelID, 1, GL_FALSE, &m_Model[0][0]);
     glUniformMatrix3fv(m_3DNormalMatrixID, 1, GL_FALSE, &normalInverseTranspos[0][0]);
-    glDrawElements(GL_TRIANGLES, extrude3D.size[MIDDLE_SURFACE], GL_UNSIGNED_SHORT, &extrude3D.startIndex[MIDDLE_SURFACE]);
+    glDrawElements(GL_TRIANGLES, extrude3D.size[MIDDLE_SURFACE], GL_UNSIGNED_SHORT, (void *)extrude3D.startIndex[MIDDLE_SURFACE]);
 }
 
 void OpenGL3DRenderer::RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D)
@@ -1155,7 +1186,7 @@ void OpenGL3DRenderer::RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D)
     glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix);
     glUniformMatrix4fv(m_3DModelID, 1, GL_FALSE, &m_Model[0][0]);
     glUniformMatrix3fv(m_3DNormalMatrixID, 1, GL_FALSE, &normalInverseTranspos[0][0]);
-    glDrawElements(GL_TRIANGLES, extrude3D.size[TOP_SURFACE], GL_UNSIGNED_SHORT, &extrude3D.startIndex[TOP_SURFACE]);
+    glDrawElements(GL_TRIANGLES, extrude3D.size[TOP_SURFACE], GL_UNSIGNED_SHORT, (void *)extrude3D.startIndex[TOP_SURFACE]);
     RenderExtrudeFlatSurface(extrude3D, FLAT_BOTTOM_SURFACE);
 }
 
@@ -1185,6 +1216,7 @@ void OpenGL3DRenderer::RenderExtrudeSurface(const Extrude3DInfo& extrude3D)
 {
     glUniformMatrix4fv(m_3DViewID, 1, GL_FALSE, &m_3DView[0][0]);
     glUniformMatrix4fv(m_3DProjectionID, 1, GL_FALSE, &m_3DProjection[0][0]);
+    CHECK_GL_ERROR();
     RenderExtrudeMiddleSurface(extrude3D);
     // check reverse flag to decide whether to render the top middle
     if (extrude3D.reverse)
@@ -1211,18 +1243,6 @@ void OpenGL3DRenderer::RenderExtrude3DObject()
     for (size_t i = 0; i < extrude3DNum; i++)
     {
         Extrude3DInfo extrude3DInfo = m_Extrude3DList[i];
-        if (extrude3DInfo.rounded && (m_RoundBarMesh.iMeshSizes == 0))
-        {
-            CreateActualRoundedCube(0.1f, 30, 30, 1.0f, 1.2f, extrude3DInfo.zScale / extrude3DInfo.xScale);
-            AddVertexData(m_CubeVertexBuf);
-            AddNormalData(m_CubeNormalBuf);
-            AddIndexData(m_CubeElementBuf);
-            for (int j = 0; i < 5; i++)
-            {
-                m_Extrude3DInfo.startIndex[j] = m_RoundBarMesh.iElementStartIndices[i];
-                m_Extrude3DInfo.size[j] = m_RoundBarMesh.iElementSizes[i];
-            }
-        }
         GLuint vertexBuf = extrude3DInfo.rounded ? m_CubeVertexBuf : m_BoundBox;
         GLuint normalBuf = extrude3DInfo.rounded ? m_CubeNormalBuf : m_BoundBoxNormal;
         // 1st attribute buffer : vertices
@@ -1438,25 +1458,25 @@ void OpenGL3DRenderer::RenderClickPos(Point aMPos)
 
 void OpenGL3DRenderer::CreateSceneBoxView()
 {
-    float senceBoxWidth = m_SenceBox.maxXCoord - m_SenceBox.minXCoord;
-    float senceBoxHeight = m_SenceBox.maxYCoord - m_SenceBox.minYCoord;
-    float senceBoxDepth = m_SenceBox.maxZCoord - m_SenceBox.minZCoord;
-    float distanceZ = m_SenceBox.maxZCoord + senceBoxWidth / 2 / tan(m_fViewAngle * GL_PI / 180.0f);
-    float veriticalAngle = atan((float)m_iHeight / (float)m_iWidth);
-    float distance = distanceZ / cos(veriticalAngle);
-    float horizontalAngle = 0;
-    m_fHeightWeight = senceBoxWidth * (float)m_iHeight / (float)m_iWidth / senceBoxHeight;
-    m_SenceBox.maxYCoord *= m_fHeightWeight;
-    m_SenceBox.minYCoord *= m_fHeightWeight;
     if (m_CameraInfo.useDefault)
     {
+        float senceBoxWidth = m_SenceBox.maxXCoord - m_SenceBox.minXCoord;
+        float senceBoxHeight = m_SenceBox.maxYCoord - m_SenceBox.minYCoord;
+        float senceBoxDepth = m_SenceBox.maxZCoord - m_SenceBox.minZCoord;
+        float distanceZ = m_SenceBox.maxZCoord + senceBoxWidth / 2 / tan(m_fViewAngle / 2 * GL_PI / 180.0f);
+        float veriticalAngle = atan((float)m_iHeight / (float)m_iWidth);
+        float distance = distanceZ / cos(veriticalAngle);
+        float horizontalAngle = 0;
+        m_fHeightWeight = senceBoxWidth * (float)m_iHeight / (float)m_iWidth / senceBoxHeight;
+        m_SenceBox.maxYCoord *= m_fHeightWeight;
+        m_SenceBox.minYCoord *= m_fHeightWeight;
         m_CameraInfo.cameraOrg = glm::vec3(m_SenceBox.minXCoord + senceBoxWidth / 2,
-                                           -m_SenceBox.minYCoord - senceBoxHeight * m_fHeightWeight/ 2,
-                                           m_SenceBox.minZCoord + senceBoxDepth / 2);
+                                           m_SenceBox.minYCoord + senceBoxHeight * m_fHeightWeight/ 2,
+                                           m_SenceBox.minZCoord + senceBoxDepth * 2);
         //update the camera position and org
         m_CameraInfo.cameraPos.x = m_CameraInfo.cameraOrg.x + distance * cos(veriticalAngle) * sin(horizontalAngle);
         m_CameraInfo.cameraPos.z = m_CameraInfo.cameraOrg.z + distance * cos(veriticalAngle) * cos(horizontalAngle);
-        m_CameraInfo.cameraPos.y = m_CameraInfo.cameraOrg.y - distance * sin(veriticalAngle);
+        m_CameraInfo.cameraPos.y = m_CameraInfo.cameraOrg.y + distance * sin(veriticalAngle);
     }
     m_3DView = glm::lookAt(m_CameraInfo.cameraPos, // Camera is at (0,0,3), in World Space
                m_CameraInfo.cameraOrg, // and looks at the origin
@@ -1466,9 +1486,56 @@ void OpenGL3DRenderer::CreateSceneBoxView()
     m_bCameraUpdated = true;
 }
 
+void OpenGL3DRenderer::CreateBMPHeader(sal_uInt8 *bmpHeader, int xsize, int ysize)
+{
+    unsigned char header[BMP_HEADER_LEN] = {
+        0x42, 0x4d, 0, 0, 0, 0, 0, 0, 0, 0,
+        54, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0
+    };
+
+    long file_size = (long)xsize * (long)ysize * 3 + 54;
+    header[2] = (unsigned char)(file_size &0x000000ff);
+    header[3] = (file_size >> 8) & 0x000000ff;
+    header[4] = (file_size >> 16) & 0x000000ff;
+    header[5] = (file_size >> 24) & 0x000000ff;
+
+    long width = xsize;
+    header[18] = width & 0x000000ff;
+    header[19] = (width >> 8) &0x000000ff;
+    header[20] = (width >> 16) &0x000000ff;
+    header[21] = (width >> 24) &0x000000ff;
+
+    long height = -ysize;
+    header[22] = height &0x000000ff;
+    header[23] = (height >> 8) &0x000000ff;
+    header[24] = (height >> 16) &0x000000ff;
+    header[25] = (height >> 24) &0x000000ff;
+    memcpy(bmpHeader, header, BMP_HEADER_LEN);
+}
+
 
 void OpenGL3DRenderer::ProcessUnrenderedShape()
 {
+    CreateSceneBoxView();
+    glViewport(0, 0, m_iWidth, m_iHeight);
+    glClearDepth(1.0f);
+#if 1
+    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();
+    }
+    glBindFramebuffer(GL_FRAMEBUFFER, m_FboID[0]);
+#endif
+    glViewport(0, 0, m_iWidth, m_iHeight);
+    glClearColor(0.0, 0.0, 1.0, 1.0);
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     //Polygon
     RenderPolygon3DObject();
     //Shape3DExtrudeObject
@@ -1477,6 +1544,18 @@ void OpenGL3DRenderer::ProcessUnrenderedShape()
     RenderTextShape();
     //render the axis
     RenderCoordinateAxis();
+#if DEBUG_FBO
+    char fileName[256] = {0};
+    sprintf(fileName, "D://shaderout_%d_%d.bmp", m_iWidth, m_iHeight);
+    FILE *pfile = fopen(fileName,"wb");
+    sal_uInt8 *Tmp = (sal_uInt8 *)malloc(m_iWidth * m_iHeight * 3 + BMP_HEADER_LEN);
+    CreateBMPHeader(Tmp, m_iWidth, m_iHeight);
+    glReadPixels(0, 0, m_iWidth, m_iHeight, GL_BGR, GL_UNSIGNED_BYTE, Tmp + BMP_HEADER_LEN);
+    fwrite(Tmp, m_iWidth * m_iHeight * 3 + BMP_HEADER_LEN, 1, pfile);
+    fclose(pfile);
+    free(Tmp);
+#endif
+//    glBindFramebuffer(GL_FRAMEBUFFER, 0);
 }
 
 glm::vec4 OpenGL3DRenderer::GetColorByIndex(int index)
@@ -1495,7 +1574,7 @@ sal_uInt32 OpenGL3DRenderer::GetIndexByColor(sal_uInt32 r, sal_uInt32 g, sal_uIn
 void OpenGL3DRenderer::ProcessPickingBox()
 {
     glViewport(0, 0, m_iWidth, m_iHeight);
-    glBindFramebuffer(GL_FRAMEBUFFER, m_FboID[0]);
+    glBindFramebuffer(GL_FRAMEBUFFER, m_FboID[1]);
     glClearDepth(1.0f);
     glClearColor(1.0, 1.0, 1.0, 1.0);
     if(ProcessExtrude3DPickingBox() == 1)
@@ -1503,7 +1582,7 @@ void OpenGL3DRenderer::ProcessPickingBox()
         //the picked object has been processed, return
         return ;
     }
-    glBindFramebuffer(GL_FRAMEBUFFER, m_FboID[0]);
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);
 }
 
 int OpenGL3DRenderer::ProcessExtrude3DPickingBox()
@@ -1608,6 +1687,7 @@ int OpenGL3DRenderer::ProcessExtrude3DPickingBox()
     m_coordinateAxisinfo.scale.y = 4 * extrude3DInfo.xScale;
     m_coordinateAxisinfo.scale.z = 4 * extrude3DInfo.xScale;
     m_coordinateAxisinfo.color = glm::vec4(0.5, 1.0, 0.8, 1.0);
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);
     return 1;
 }
 


More information about the Libreoffice-commits mailing list