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.mohrh...@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 <wei...@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.mohrh...@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 <wei...@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; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits