chart2/Package_opengl.mk | 2 chart2/opengl/screenTextFragmentShader.glsl | 3 chart2/opengl/textFragmentShader.glsl | 3 chart2/opengl/textFragmentShaderBatch.glsl | 20 + chart2/opengl/textVertexShaderBatch.glsl | 22 ++ chart2/source/view/inc/GL3DRenderer.hxx | 44 +++- chart2/source/view/main/3DChartObjects.cxx | 11 - chart2/source/view/main/GL3DRenderer.cxx | 288 +++++++++++++++++++++++----- 8 files changed, 342 insertions(+), 51 deletions(-)
New commits: commit e4939a72af3baff282a50bf1bce76c3184f26403 Author: weigao <wei...@multicorewareinc.com> Date: Wed Jun 18 08:21:41 2014 -0700 add code to call batch texture render Change-Id: I09da7c49eb11da9ea2bc18a5e13f2fd2c0d6bd8f diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index 065b5fb..5f2167c 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -143,6 +143,23 @@ struct TextInfo float vertex[12]; }; +struct TextureArrayInfo +{ + size_t subTextureNum; + int textureArrayWidth; + int textureArrayHeight; + GLuint textureID; +}; +struct TextInfoBatch +{ + size_t batchNum; + std::vector<glm::vec4> idList; + std::vector<TextureArrayInfo> texture; + std::vector<glm::vec3> vertexList; + std::vector<glm::vec3> textureCoordList; +}; + + struct BatchBarInfo { std::vector <glm::mat4> modelMatrixList; @@ -235,6 +252,18 @@ private: void UpdateBatch3DUniformBlock(); void RenderBatchBars(bool bNewScene); void CheckGLSLVersion(); + void RenderTextShapeBatch(); + void ReleaseTextShapesBatch(); + void CreateTextTextureSingle(const boost::shared_array<sal_uInt8> &bitmapBuf, + ::Size maSizePixels, + glm::vec3 vTopLeft,glm::vec3 vTopRight, + glm::vec3 vBottomRight, glm::vec3 vBottomLeft, + sal_uInt32 nUniqueId); + void CreateTextTextureBatch(const boost::shared_array<sal_uInt8> &bitmapBuf, + ::Size maSizePixels, + glm::vec3 vTopLeft,glm::vec3 vTopRight, + glm::vec3 vBottomRight, glm::vec3 vBottomLeft, + sal_uInt32 nUniqueId); private: struct ShaderResources @@ -290,6 +319,14 @@ private: GLint m_3DBatchNormalID; GLint m_3DBatchColorID; + //Batch render text + bool mbTexBatchSupport; + GLint m_BatchTextProID; + GLint m_BatchTextMatrixID; + GLint m_BatchTextVertexID; + GLint m_BatchTextTexCoordID; + GLint m_BatchTextTexID; + ShaderResources(); ~ShaderResources(); @@ -362,7 +399,7 @@ private: std::vector <TextInfo> m_TextInfoList; std::vector <TextInfo> m_ScreenTextInfoList; GLuint m_TextTexCoordBuf; - + GLuint m_TextTexCoordBufBatch; int m_uiSelectFrameCounter; std::vector<glm::vec3> m_Vertices; @@ -392,6 +429,7 @@ private: MaterialParameters m_Batchmaterial; GLuint m_Batch3DUBOBuffer; GLint m_Batch3DActualSizeLight; + TextInfoBatch m_TextInfoBatch; //for 3.0 version int m_iLightNum; glm::vec4 m_Ambient; diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index cf22a86..60b3cb2 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -88,6 +88,7 @@ OpenGL3DRenderer::OpenGL3DRenderer(): OpenGL3DRenderer::~OpenGL3DRenderer() { + ReleaseShapes(); // delete buffers glDeleteBuffers(1, &m_CubeVertexBuf); glDeleteBuffers(1, &m_CubeNormalBuf); @@ -103,10 +104,18 @@ OpenGL3DRenderer::~OpenGL3DRenderer() glDeleteBuffers(1, &m_Batch3DUBOBuffer); glDeleteBuffers(1, &m_3DUBOBuffer); glDeleteBuffers(1, &m_3DUBOBuffer); + glDeleteBuffers(1, &m_TextTexCoordBufBatch); glDeleteFramebuffers(1, &mnPickingFbo); glDeleteRenderbuffers(1, &mnPickingRboDepth); glDeleteRenderbuffers(1, &mnPickingRboColor); + + for (size_t i = 0; i < m_TextInfoBatch.texture.size(); i++) + { + glDeleteTextures(1, &m_TextInfoBatch.texture[i].textureID); + } + m_TextInfoBatch.texture.clear(); + } OpenGL3DRenderer::ShaderResources::ShaderResources() @@ -139,6 +148,12 @@ OpenGL3DRenderer::ShaderResources::ShaderResources() , m_3DBatchNormalID(0) , m_3DBatchColorID(0) , m_b330Support(false) + , m_BatchTextProID(0) + , m_BatchTextMatrixID(0) + , m_BatchTextVertexID(0) + , m_BatchTextTexCoordID(0) + , m_BatchTextTexID(0) + , mbTexBatchSupport(false) { } @@ -149,6 +164,7 @@ OpenGL3DRenderer::ShaderResources::~ShaderResources() glDeleteProgram(m_ScreenTextProID); glDeleteProgram(m_3DProID); glDeleteProgram(m_3DBatchProID); + glDeleteProgram(m_BatchTextProID); } void OpenGL3DRenderer::CheckGLSLVersion() @@ -204,6 +220,27 @@ void OpenGL3DRenderer::ShaderResources::LoadShaders() m_3DBatchVertexID = glGetAttribLocation(m_3DBatchProID, "vertexPositionModelspace"); m_3DBatchNormalID = glGetAttribLocation(m_3DBatchProID, "vertexNormalModelspace"); m_3DBatchColorID = glGetAttribLocation(m_3DBatchProID, "barColor"); + //check whether the texture array is support + GLint numExtensions = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions); + for( GLint i = 0; i < numExtensions; ++i ) + { + OUString currExt = ::rtl::OUString::createFromAscii((char*)glGetStringi(GL_EXTENSIONS, i)); + if (currExt == "GL_EXT_texture_array") + { + mbTexBatchSupport = true; + break; + } + } + if (mbTexBatchSupport) + { + m_BatchTextProID = OpenGLHelper::LoadShaders("textVertexShaderBatch", "textFragmentShaderBatch"); + m_BatchTextMatrixID = glGetUniformLocation(m_BatchTextProID, "MVP"); + m_BatchTextTexID = glGetUniformLocation(m_BatchTextProID, "texArray"); + m_BatchTextVertexID = glGetAttribLocation(m_BatchTextProID, "vPosition"); + m_BatchTextTexCoordID = glGetAttribLocation(m_BatchTextProID, "texCoord"); + } + mbTexBatchSupport = m_BatchTextProID ? true : false; } else { @@ -227,11 +264,14 @@ void OpenGL3DRenderer::ShaderResources::LoadShaders() 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"); - m_TextTexCoordID = glGetAttribLocation(m_TextProID, "texCoord"); - m_TextTexID = glGetUniformLocation(m_TextProID, "TextTex"); + if (!mbTexBatchSupport) + { + m_TextProID = OpenGLHelper::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"); + } m_ScreenTextProID = OpenGLHelper::LoadShaders("screenTextVertexShader", "screenTextFragmentShader"); m_ScreenTextVertexID = glGetAttribLocation(m_ScreenTextProID, "vPosition"); @@ -303,6 +343,7 @@ void OpenGL3DRenderer::init() glGenBuffers(1, &m_BatchModelMatrixBuf); glGenBuffers(1, &m_BatchNormalMatrixBuf); glGenBuffers(1, &m_BatchColorBuf); + glGenBuffers(1, &m_TextTexCoordBufBatch); glGenBuffers(1, &m_BoundBox); glBindBuffer(GL_ARRAY_BUFFER, m_BoundBox); glBufferData(GL_ARRAY_BUFFER, sizeof(boundBox), boundBox, GL_STATIC_DRAW); @@ -344,6 +385,7 @@ void OpenGL3DRenderer::init() Init3DUniformBlock(); InitBatch3DUniformBlock(); } + m_TextInfoBatch.batchNum = 512; CHECK_GL_ERROR(); glViewport(0, 0, m_iWidth, m_iHeight); Set3DSenceInfo(0xFFFFFF, true); @@ -1607,11 +1649,11 @@ void OpenGL3DRenderer::CreateScreenTextTexture( m_ScreenTextInfoList.push_back(aTextInfo); } -void OpenGL3DRenderer::CreateTextTexture(const boost::shared_array<sal_uInt8> &bitmapBuf, - ::Size maSizePixels, - glm::vec3 vTopLeft,glm::vec3 vTopRight, - glm::vec3 vBottomRight, glm::vec3 vBottomLeft, - sal_uInt32 nUniqueId) +void OpenGL3DRenderer::CreateTextTextureSingle(const boost::shared_array<sal_uInt8> &bitmapBuf, + ::Size maSizePixels, + glm::vec3 vTopLeft,glm::vec3 vTopRight, + glm::vec3 vBottomRight, glm::vec3 vBottomLeft, + sal_uInt32 nUniqueId) { long bmpWidth = maSizePixels.Width(); long bmpHeight = maSizePixels.Height(); @@ -1652,6 +1694,91 @@ void OpenGL3DRenderer::CreateTextTexture(const boost::shared_array<sal_uInt8> &b glBindTexture(GL_TEXTURE_2D, 0); CHECK_GL_ERROR(); m_TextInfoList.push_back(aTextInfo); + +} + + +void OpenGL3DRenderer::CreateTextTextureBatch(const boost::shared_array<sal_uInt8> &bitmapBuf, + ::Size maSizePixels, + glm::vec3 vTopLeft,glm::vec3 vTopRight, + glm::vec3 vBottomRight, glm::vec3 vBottomLeft, + sal_uInt32 nUniqueId) +{ + long bmpWidth = maSizePixels.Width(); + long bmpHeight = maSizePixels.Height(); + glm::vec4 id = getColorAsVector(nUniqueId); + m_TextInfoBatch.idList.push_back(id); + m_TextInfoBatch.vertexList.push_back(glm::vec3(vBottomRight.x, vBottomRight.y, vBottomRight.z)); + m_TextInfoBatch.vertexList.push_back(glm::vec3(vTopRight.x, vTopRight.y, vTopRight.z)); + m_TextInfoBatch.vertexList.push_back(glm::vec3(vTopLeft.x, vTopLeft.y, vTopLeft.z)); + m_TextInfoBatch.vertexList.push_back(glm::vec3(vBottomLeft.x, vBottomLeft.y, vBottomLeft.z)); + //find the last vector, which size is small than default batch number; + size_t index = 0; + while ((m_TextInfoBatch.texture.size() > 0) && + (m_TextInfoBatch.texture[index].subTextureNum >= m_TextInfoBatch.batchNum) && + (index < m_TextInfoBatch.texture.size() - 1)) + { + index++; + } + //if the sub texture number of the last texture array reach the largest, create a new textur array + if ((m_TextInfoBatch.texture.size() == 0) || + (m_TextInfoBatch.texture[index].subTextureNum >= m_TextInfoBatch.batchNum)) + { + TextureArrayInfo textureArray = {0}; + glGenTextures(1, &textureArray.textureID); + CHECK_GL_ERROR(); + glBindTexture(GL_TEXTURE_2D_ARRAY, textureArray.textureID); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + CHECK_GL_ERROR(); + textureArray.textureArrayWidth = bmpHeight * 8; + textureArray.textureArrayHeight = bmpHeight; + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, textureArray.textureArrayWidth, textureArray.textureArrayHeight, + m_TextInfoBatch.batchNum, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); + CHECK_GL_ERROR(); + if (m_TextInfoBatch.texture.size() > 0) + { + index++; + } + m_TextInfoBatch.texture.push_back(textureArray); + glBindTexture(GL_TEXTURE_2D_ARRAY, 0); + } + glBindTexture(GL_TEXTURE_2D_ARRAY, m_TextInfoBatch.texture[index].textureID); + CHECK_GL_ERROR(); + glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, m_TextInfoBatch.texture[index].subTextureNum, bmpWidth, bmpHeight, 1, GL_RGB, GL_UNSIGNED_BYTE, bitmapBuf.get()); + CHECK_GL_ERROR(); + //calc texture coordinate + m_TextInfoBatch.textureCoordList.push_back(glm::vec3((float)bmpWidth / (float)m_TextInfoBatch.texture[index].textureArrayWidth, + 0, + m_TextInfoBatch.texture[index].subTextureNum)); + m_TextInfoBatch.textureCoordList.push_back(glm::vec3((float)bmpWidth / (float)m_TextInfoBatch.texture[index].textureArrayWidth, + (float)bmpHeight/ (float)m_TextInfoBatch.texture[index].textureArrayHeight, + m_TextInfoBatch.texture[index].subTextureNum)); + m_TextInfoBatch.textureCoordList.push_back(glm::vec3(0, + (float)bmpHeight/ (float)m_TextInfoBatch.texture[index].textureArrayHeight, + m_TextInfoBatch.texture[index].subTextureNum)); + m_TextInfoBatch.textureCoordList.push_back(glm::vec3(0, + 0, + m_TextInfoBatch.texture[index].subTextureNum)); + m_TextInfoBatch.texture[index].subTextureNum++; + glBindTexture(GL_TEXTURE_2D_ARRAY, 0); +} +void OpenGL3DRenderer::CreateTextTexture(const boost::shared_array<sal_uInt8> &bitmapBuf, + ::Size maSizePixels, + glm::vec3 vTopLeft,glm::vec3 vTopRight, + glm::vec3 vBottomRight, glm::vec3 vBottomLeft, + sal_uInt32 nUniqueId) +{ + if (maResources.mbTexBatchSupport) + { + CreateTextTextureBatch(bitmapBuf, maSizePixels, vTopLeft, vTopRight, vBottomRight, vBottomLeft, nUniqueId); + } + else + { + CreateTextTextureSingle(bitmapBuf, maSizePixels, vTopLeft, vTopRight, vBottomRight, vBottomLeft, nUniqueId); + } } void OpenGL3DRenderer::ReleaseTextShapes() @@ -1729,7 +1856,67 @@ void OpenGL3DRenderer::RenderScreenTextShape() } CHECK_GL_ERROR(); } +void OpenGL3DRenderer::ReleaseTextShapesBatch() +{ + for (size_t i = 0; i < m_TextInfoBatch.texture.size(); i++) + { + m_TextInfoBatch.texture[i].subTextureNum = 0; + } + m_TextInfoBatch.vertexList.clear(); + m_TextInfoBatch.textureCoordList.clear(); + m_TextInfoBatch.idList.clear(); +} +void OpenGL3DRenderer::RenderTextShapeBatch() +{ + glm::mat4 aMVP = m_3DProjection * m_3DView * m_GlobalScaleMatrix; + glUseProgram(maResources.m_BatchTextProID); + CHECK_GL_ERROR(); + glUniformMatrix4fv(maResources.m_BatchTextMatrixID, 1, GL_FALSE, &aMVP[0][0]); + glEnableVertexAttribArray(maResources.m_BatchTextVertexID); + glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer); + glVertexAttribPointer( + maResources.m_BatchTextVertexID, + 3, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + //tex coord + CHECK_GL_ERROR(); + glEnableVertexAttribArray(maResources.m_BatchTextTexCoordID); + glBindBuffer(GL_ARRAY_BUFFER, m_TextTexCoordBufBatch); + glVertexAttribPointer( + maResources.m_BatchTextTexCoordID, + 3, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + //use texture array to get the vertex + for (size_t i = 0; i < m_TextInfoBatch.texture.size(); i++) + { + int vertexNum = m_TextInfoBatch.texture[i].subTextureNum; + glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer); + glBufferData(GL_ARRAY_BUFFER, 4 * vertexNum * sizeof(glm::vec3), &m_TextInfoBatch.vertexList[4 * i * m_TextInfoBatch.batchNum], GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, m_TextTexCoordBufBatch); + glBufferData(GL_ARRAY_BUFFER, 4 * vertexNum * sizeof(glm::vec3), &m_TextInfoBatch.textureCoordList[4 * i * m_TextInfoBatch.batchNum], GL_STATIC_DRAW); + glBindTexture(GL_TEXTURE_2D_ARRAY, m_TextInfoBatch.texture[i].textureID); + CHECK_GL_ERROR(); + glUniform1i(maResources.m_BatchTextTexID, 0); + CHECK_GL_ERROR(); + //TODO: moggi: get rid fo GL_QUADS + glDrawArrays(GL_QUADS, 0, 4 * vertexNum); + } + glDisableVertexAttribArray(maResources.m_BatchTextVertexID); + CHECK_GL_ERROR(); + glDisableVertexAttribArray(maResources.m_BatchTextTexCoordID); + CHECK_GL_ERROR(); + glBindTexture(GL_TEXTURE_2D_ARRAY, 0); + glUseProgram(0); +} void OpenGL3DRenderer::RenderTextShape() { CHECK_GL_ERROR(); @@ -1855,7 +2042,14 @@ void OpenGL3DRenderer::ProcessUnrenderedShape(bool bNewScene) } } //render text - RenderTextShape(); + if (maResources.mbTexBatchSupport) + { + RenderTextShapeBatch(); + } + else + { + RenderTextShape(); + } // render screen text RenderScreenTextShape(); #if DEBUG_FBO @@ -1915,6 +2109,7 @@ void OpenGL3DRenderer::ReleaseShapes() ReleaseTextShapes(); ReleaseScreenTextShapes(); ReleaseBatchBarInfo(); + ReleaseTextShapesBatch(); } void OpenGL3DRenderer::GetBatchMiddleInfo(Extrude3DInfo &extrude3D) commit 580250bdb98a0e81a8f049e21c0b44bd0c970943 Author: weigao <wei...@multicorewareinc.com> Date: Wed Jun 18 08:01:46 2014 -0700 add batch render texture shaders Change-Id: I922d24bc63ed7c1f16318c25da0b6b3401d24b6f diff --git a/chart2/Package_opengl.mk b/chart2/Package_opengl.mk index 3d68a93..6e1e298 100644 --- a/chart2/Package_opengl.mk +++ b/chart2/Package_opengl.mk @@ -32,6 +32,8 @@ $(eval $(call gb_Package_add_files,chart2_opengl_shader,$(LIBO_BIN_FOLDER)/openg shape3DVertexShaderBatch.glsl \ shape3DFragmentShaderV300.glsl \ shape3DVertexShaderV300.glsl \ + textFragmentShaderBatch.glsl \ + textVertexShaderBatch.glsl \ )) # vim: set noet sw=4 ts=4: diff --git a/chart2/opengl/textFragmentShaderBatch.glsl b/chart2/opengl/textFragmentShaderBatch.glsl new file mode 100644 index 0000000..d7bd4ae --- /dev/null +++ b/chart2/opengl/textFragmentShaderBatch.glsl @@ -0,0 +1,20 @@ +/* -*- 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/. + */ +#version 330 core +#extension GL_EXT_texture_array : enable +uniform sampler2DArray texArray; +in vec3 vTexCoord; + +out vec4 actualColor; +void main() +{ + vec3 color = texture2DArray(texArray, vTexCoord.xyz).rgb; + actualColor = vec4(color, 1.0 - color.r); +} +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/opengl/textVertexShaderBatch.glsl b/chart2/opengl/textVertexShaderBatch.glsl new file mode 100644 index 0000000..f894333 --- /dev/null +++ b/chart2/opengl/textVertexShaderBatch.glsl @@ -0,0 +1,22 @@ +/* -*- 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/. + */ +#version 330 core +in vec3 vPosition; +in vec3 texCoord; + +out vec3 vTexCoord; +uniform mat4 MVP; + +void main() +{ + gl_Position = MVP * vec4(vPosition, 1); + vTexCoord = texCoord; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 11bc1787baa529466a3a2374d991677a23160ad4 Author: weigao <wei...@multicorewareinc.com> Date: Wed Jun 18 01:10:05 2014 -0700 use shader to calculate alpha channel Change-Id: I3cf9636b36ffd47589dd3ab61278802ca73644ce diff --git a/chart2/opengl/screenTextFragmentShader.glsl b/chart2/opengl/screenTextFragmentShader.glsl index a848103..7e2bd26 100644 --- a/chart2/opengl/screenTextFragmentShader.glsl +++ b/chart2/opengl/screenTextFragmentShader.glsl @@ -11,7 +11,8 @@ varying vec2 vTexCoord; uniform sampler2D TextTex; void main() { - gl_FragColor = vec4(texture2D(TextTex, vTexCoord).rgba); + vec3 color = texture2D(TextTex, vTexCoord).rgb; + gl_FragColor = vec4(color, 1.0 - color.r); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/opengl/textFragmentShader.glsl b/chart2/opengl/textFragmentShader.glsl index ef8d44d..c1d44bc 100644 --- a/chart2/opengl/textFragmentShader.glsl +++ b/chart2/opengl/textFragmentShader.glsl @@ -11,7 +11,8 @@ uniform sampler2D TextTex; varying vec2 vTexCoord; void main() { - gl_FragColor = vec4(texture2D(TextTex, vTexCoord).rgba); + vec3 color = texture2D(TextTex, vTexCoord).rgb; + gl_FragColor = vec4(color, 1.0 - color.r); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index ce40540..065b5fb 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -379,8 +379,6 @@ private: float m_fViewAngle; - float m_fHeightWeight; - bool mbPickingMode; GLuint mnPickingFbo; diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx index 038caaf..001190f 100644 --- a/chart2/source/view/main/3DChartObjects.cxx +++ b/chart2/source/view/main/3DChartObjects.cxx @@ -12,6 +12,7 @@ #include <vcl/svapp.hxx> #include <vcl/opengl/OpenGLHelper.hxx> +#include <vcl/bmpacc.hxx> namespace chart { @@ -90,7 +91,15 @@ const TextCacheItem& TextCache::getText(OUString rText) aDevice.DrawText(Point(0,0), rText); BitmapEx aText(aDevice.GetBitmapEx(Point(0,0), aDevice.GetOutputSize())); - TextCacheItem *pItem = new TextCacheItem(OpenGLHelper::ConvertBitmapExToRGBABuffer(aText), aText.GetSizePixel()); +// TextCacheItem *pItem = new TextCacheItem(OpenGLHelper::ConvertBitmapExToRGBABuffer(aText), aText.GetSizePixel()); + Bitmap aBitmap (aText.GetBitmap()); + BitmapReadAccess *pAcc = aBitmap.AcquireReadAccess(); + sal_uInt8 *buf = (sal_uInt8 *)pAcc->GetBuffer(); + long nBmpWidth = aText.GetSizePixel().Width(); + long nBmpHeight = aText.GetSizePixel().Height(); + sal_uInt8* pBitmapBuf(new sal_uInt8[3* nBmpWidth * nBmpHeight]); + memcpy(pBitmapBuf, buf, 3* nBmpWidth * nBmpHeight); + TextCacheItem *pItem = new TextCacheItem(pBitmapBuf, aText.GetSizePixel()); maTextCache.insert(rText, pItem); return *maTextCache.find(rText)->second; diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 8887a05..cf22a86 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -54,10 +54,10 @@ int static checkGLError(const char *file, int line) #define CHECK_GL_ERROR() checkGLError(__FILE__, __LINE__) GLfloat texCoords[] = { - 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, - 0.0f, 1.0f + 0.0f, 1.0f, + 0.0f, 0.0f }; glm::vec4 getColorAsVector(sal_uInt32 nColor) @@ -73,7 +73,6 @@ glm::vec4 getColorAsVector(sal_uInt32 nColor) OpenGL3DRenderer::OpenGL3DRenderer(): m_uiSelectFrameCounter(0) , m_fViewAngle(30.0f) - , m_fHeightWeight(1.0f) , mbPickingMode(false) { m_Polygon3DInfo.lineOnly = false; @@ -763,7 +762,7 @@ void OpenGL3DRenderer::RenderLine3D(Polygon3DInfo &polygon) glUseProgram(maResources.m_CommonProID); PosVecf3 trans = {0.0f, 0, 0.0}; PosVecf3 angle = {0.0f, 0.0f, 0.0f}; - PosVecf3 scale = {1.0f, 1.0f, m_fHeightWeight}; + PosVecf3 scale = {1.0f, 1.0f, 1.0f}; MoveModelf(trans, angle, scale); m_Model = m_GlobalScaleMatrix * m_Model; m_3DMVP = m_3DProjection * m_3DView * m_Model; @@ -854,7 +853,7 @@ void OpenGL3DRenderer::RenderPolygon3D(Polygon3DInfo &polygon) Normals3D *normalList = polygon.normalsList[i]; PosVecf3 trans = {0.0f, 0.0f, 0.0}; PosVecf3 angle = {0.0f, 0.0f, 0.0f}; - PosVecf3 scale = {1.0f, 1.0f, m_fHeightWeight}; + PosVecf3 scale = {1.0f, 1.0f, 1.0f}; MoveModelf(trans, angle, scale); m_Model = m_GlobalScaleMatrix * m_Model; glm::mat3 normalMatrix(m_Model); @@ -1522,8 +1521,6 @@ void OpenGL3DRenderer::RenderExtrude3DObject() (void*)0 // array buffer offset ); } - extrude3DInfo.zTransform *= m_fHeightWeight; - extrude3DInfo.zScale *= m_fHeightWeight; if(!mbPickingMode) { if (maResources.m_b330Support) @@ -1574,22 +1571,22 @@ void OpenGL3DRenderer::CreateScreenTextTexture( TextInfo aTextInfo; aTextInfo.id = getColorAsVector(nUniqueId); - aTextInfo.vertex[0] = vTopLeft.x; - aTextInfo.vertex[1] = vTopLeft.y; + aTextInfo.vertex[0] = vBottomRight.x; + aTextInfo.vertex[1] = vBottomRight.y; aTextInfo.vertex[2] = 0; aTextInfo.vertex[3] = vBottomRight.x; aTextInfo.vertex[4] = vTopLeft.y; aTextInfo.vertex[5] = 0; + aTextInfo.vertex[6] = vTopLeft.x; + aTextInfo.vertex[7] = vTopLeft.y; + aTextInfo.vertex[8] = 0; + aTextInfo.vertex[9] = vTopLeft.x; aTextInfo.vertex[10] = vBottomRight.y; aTextInfo.vertex[11] = 0; - aTextInfo.vertex[6] = vBottomRight.x; - aTextInfo.vertex[7] = vBottomRight.y; - aTextInfo.vertex[8] = 0; - CHECK_GL_ERROR(); glGenTextures(1, &aTextInfo.texture); CHECK_GL_ERROR(); @@ -1603,7 +1600,7 @@ void OpenGL3DRenderer::CreateScreenTextTexture( CHECK_GL_ERROR(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); CHECK_GL_ERROR(); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bmpWidth, bmpHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapBuf.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bmpWidth, bmpHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapBuf.get()); CHECK_GL_ERROR(); glBindTexture(GL_TEXTURE_2D, 0); CHECK_GL_ERROR(); @@ -1621,21 +1618,21 @@ void OpenGL3DRenderer::CreateTextTexture(const boost::shared_array<sal_uInt8> &b TextInfo aTextInfo; aTextInfo.id = getColorAsVector(nUniqueId); - aTextInfo.vertex[0] = vTopLeft.x; - aTextInfo.vertex[1] = vTopLeft.y; - aTextInfo.vertex[2] = vTopLeft.z * m_fHeightWeight; + aTextInfo.vertex[0] = vBottomRight.x; + aTextInfo.vertex[1] = vBottomRight.y; + aTextInfo.vertex[2] = vBottomRight.z; aTextInfo.vertex[3] = vTopRight.x; aTextInfo.vertex[4] = vTopRight.y; - aTextInfo.vertex[5] = vTopRight.z * m_fHeightWeight; + aTextInfo.vertex[5] = vTopRight.z; aTextInfo.vertex[9] = vBottomLeft.x; aTextInfo.vertex[10] = vBottomLeft.y; - aTextInfo.vertex[11] = vBottomLeft.z * m_fHeightWeight; + aTextInfo.vertex[11] = vBottomLeft.z; - aTextInfo.vertex[6] = vBottomRight.x; - aTextInfo.vertex[7] = vBottomRight.y; - aTextInfo.vertex[8] = vBottomRight.z * m_fHeightWeight; + aTextInfo.vertex[6] = vTopLeft.x; + aTextInfo.vertex[7] = vTopLeft.y; + aTextInfo.vertex[8] = vTopLeft.z; CHECK_GL_ERROR(); glGenTextures(1, &aTextInfo.texture); @@ -1650,7 +1647,7 @@ void OpenGL3DRenderer::CreateTextTexture(const boost::shared_array<sal_uInt8> &b CHECK_GL_ERROR(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); CHECK_GL_ERROR(); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bmpWidth, bmpHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapBuf.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bmpWidth, bmpHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapBuf.get()); CHECK_GL_ERROR(); glBindTexture(GL_TEXTURE_2D, 0); CHECK_GL_ERROR(); @@ -1816,11 +1813,11 @@ void OpenGL3DRenderer::ClearBuffer() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin (GL_QUADS); - glColor3f(0.3,0.3,0.3); + glColor3f(0.3f,0.3f,0.3f); glVertex3f (-1.0f, -1.0f, -1.0f); glVertex3f (1.0f, -1.0f, -1.0f); - glColor3f(0.0,0.0,0.0); + glColor3f(0.0f,0.0f,0.0f); glVertex3f (1.0f, 1.0f, -1.0f); glVertex3f (-1.0f, 1.0f, -1.0f); glEnd (); @@ -1997,8 +1994,6 @@ void OpenGL3DRenderer::GetBatchBarsInfo() for (size_t i = 0; i < m_Extrude3DList.size(); i++) { Extrude3DInfo &extrude3DInfo = m_Extrude3DList[i]; - extrude3DInfo.zTransform *= m_fHeightWeight; - extrude3DInfo.zScale *= m_fHeightWeight; if (m_Extrude3DInfo.rounded) { GetBatchTopAndFlatInfo(extrude3DInfo); commit bfc5fec078d0a9dd5f0d423a560e4ab4c74d2513 Author: weigao <wei...@multicorewareinc.com> Date: Wed Jun 18 00:04:08 2014 -0700 add global scale matrix Change-Id: I23b9929dd3f0f1b0a070091ed9c1fe920edfcbf9 diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index 1e5df81..ce40540 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -400,6 +400,8 @@ private: glm::vec4 m_LightColor[MAX_LIGHT_NUM]; glm::vec4 m_PositionWorldspace[MAX_LIGHT_NUM]; float m_fLightPower[MAX_LIGHT_NUM]; + + glm::mat4 m_GlobalScaleMatrix; }; } diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 08f911a..8887a05 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -348,6 +348,7 @@ void OpenGL3DRenderer::init() CHECK_GL_ERROR(); glViewport(0, 0, m_iWidth, m_iHeight); Set3DSenceInfo(0xFFFFFF, true); + m_GlobalScaleMatrix = glm::scale(0.01f, 0.01f, 0.01f); } void OpenGL3DRenderer::SetSize(const Size& rSize) @@ -764,7 +765,7 @@ void OpenGL3DRenderer::RenderLine3D(Polygon3DInfo &polygon) PosVecf3 angle = {0.0f, 0.0f, 0.0f}; PosVecf3 scale = {1.0f, 1.0f, m_fHeightWeight}; MoveModelf(trans, angle, scale); - + m_Model = m_GlobalScaleMatrix * m_Model; m_3DMVP = m_3DProjection * m_3DView * m_Model; for (size_t i = 0; i < polygon.verticesList.size(); i++) @@ -855,6 +856,7 @@ void OpenGL3DRenderer::RenderPolygon3D(Polygon3DInfo &polygon) PosVecf3 angle = {0.0f, 0.0f, 0.0f}; PosVecf3 scale = {1.0f, 1.0f, m_fHeightWeight}; MoveModelf(trans, angle, scale); + m_Model = m_GlobalScaleMatrix * m_Model; glm::mat3 normalMatrix(m_Model); glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix); @@ -1253,7 +1255,7 @@ void OpenGL3DRenderer::RenderExtrudeFlatSurface(const Extrude3DInfo& extrude3D, extrude3D.zTransform}; glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); glm::mat4 flatScale = glm::scale(xyScale, xyScale, xyScale); - m_Model = aTranslationMatrix * extrude3D.rotation * flatScale; + m_Model = m_GlobalScaleMatrix * aTranslationMatrix * extrude3D.rotation * flatScale; if(!mbPickingMode) { glm::mat3 normalMatrix(m_Model); @@ -1297,7 +1299,7 @@ void OpenGL3DRenderer::RenderExtrudeBottomSurface(const Extrude3DInfo& extrude3D glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); m_Model = aTranslationMatrix * extrude3D.rotation * topTrans * topScale; } - + m_Model = m_GlobalScaleMatrix * m_Model; if(!mbPickingMode) { glm::mat3 normalMatrix(m_Model); @@ -1342,7 +1344,7 @@ void OpenGL3DRenderer::RenderExtrudeMiddleSurface(const Extrude3DInfo& extrude3D glm::mat4 reverseMatrix = glm::translate(glm::vec3(0.0, 0.0, -1.0)); m_Model = m_Model * reverseMatrix; } - + m_Model = m_GlobalScaleMatrix * m_Model; if(!mbPickingMode) { glm::mat3 normalMatrix(m_Model); @@ -1387,7 +1389,7 @@ void OpenGL3DRenderer::RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D) glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); m_Model = aTranslationMatrix * extrude3D.rotation * topTrans * topScale * orgTrans; } - + m_Model = m_GlobalScaleMatrix * m_Model; if(!mbPickingMode) { glm::mat3 normalMatrix(m_Model); @@ -1417,7 +1419,7 @@ void OpenGL3DRenderer::RenderNonRoundedBar(const Extrude3DInfo& extrude3D) glm::mat4 reverseMatrix = glm::translate(glm::vec3(0.0, 0.0, -1.0)); m_Model = m_Model * reverseMatrix; } - + m_Model = m_GlobalScaleMatrix * m_Model; if(!mbPickingMode) { glm::mat3 normalMatrix(m_Model); @@ -1741,6 +1743,7 @@ void OpenGL3DRenderer::RenderTextShape() PosVecf3 angle = {0.0f, 0.0f, 0.0f}; PosVecf3 scale = {1.0, 1.0, 1.0f}; MoveModelf(trans, angle, scale); + m_Model = m_GlobalScaleMatrix * m_Model; glm::mat4 aMVP = m_3DProjection * m_3DView * m_Model; glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer); CHECK_GL_ERROR(); @@ -1794,6 +1797,8 @@ void OpenGL3DRenderer::RenderTextShape() void OpenGL3DRenderer::CreateSceneBoxView() { + m_CameraInfo.cameraPos = glm::vec3(m_GlobalScaleMatrix * glm::vec4(m_CameraInfo.cameraPos, 1.0)); + m_CameraInfo.cameraOrg = glm::vec3(m_GlobalScaleMatrix * glm::vec4(m_CameraInfo.cameraOrg, 1.0)); m_3DView = glm::lookAt(m_CameraInfo.cameraPos, m_CameraInfo.cameraOrg, m_CameraInfo.cameraUp); @@ -1933,6 +1938,7 @@ void OpenGL3DRenderer::GetBatchMiddleInfo(Extrude3DInfo &extrude3D) glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); m_Model = aTranslationMatrix * extrude3D.rotation * scale; } + m_Model = m_GlobalScaleMatrix * m_Model; glm::mat3 normalMatrix(m_Model); glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix); m_BarSurface[MIDDLE_SURFACE].modelMatrixList.push_back(m_Model); @@ -1967,6 +1973,7 @@ void OpenGL3DRenderer::GetBatchTopAndFlatInfo(Extrude3DInfo &extrude3D) glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); m_Model = aTranslationMatrix * extrude3D.rotation * topTrans * topScale * orgTrans; } + m_Model = m_GlobalScaleMatrix * m_Model; glm::mat3 normalMatrix(m_Model); glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix); m_BarSurface[TOP_SURFACE].modelMatrixList.push_back(m_Model); @@ -1976,6 +1983,7 @@ void OpenGL3DRenderer::GetBatchTopAndFlatInfo(Extrude3DInfo &extrude3D) glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); glm::mat4 flatScale = glm::scale(xyScale, xyScale, xyScale); m_Model = aTranslationMatrix * extrude3D.rotation * flatScale; + m_Model = m_GlobalScaleMatrix * m_Model; normalMatrix = glm::mat3(m_Model); normalInverseTranspos = glm::inverseTranspose(normalMatrix); @@ -2001,6 +2009,7 @@ void OpenGL3DRenderer::GetBatchBarsInfo() glm::mat4 transformMatrix = glm::translate(glm::vec3(extrude3DInfo.xTransform, extrude3DInfo.yTransform, extrude3DInfo.zTransform)); glm::mat4 scaleMatrix = glm::scale(extrude3DInfo.xScale, extrude3DInfo.yScale, extrude3DInfo.zScale); m_Model = transformMatrix * extrude3DInfo.rotation * scaleMatrix; + m_Model = m_GlobalScaleMatrix * m_Model; glm::mat3 normalMatrix(m_Model); glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix); m_BarSurface[0].modelMatrixList.push_back(m_Model); commit 7fce7e9916b0471310319b360bca99b96cec7eba Author: weigao <wei...@multicorewareinc.com> Date: Tue Jun 17 23:29:09 2014 -0700 fix the using 3.0 version bug Change-Id: Ie197d0156a2d8b54fe6b08a905d82a63d31513f2 diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 9098cd1..08f911a 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -172,7 +172,6 @@ void OpenGL3DRenderer::CheckGLSLVersion() if (iVersion > 3) { maResources.m_b330Support = true; - maResources.m_b330Support = false; return; } p++; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits