diff options
author | weigao <weigao@multicorewareinc.com> | 2014-05-28 12:50:38 +0800 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-05-28 19:16:17 +0200 |
commit | 0e332ba4e618413bb938f8aee3553530470d20ad (patch) | |
tree | 3cc75006f675e25599c3bcc564d596725a1529e1 /chart2 | |
parent | 47a417d93aa7a68f1b3b371e2a4a6b07fb1c6f07 (diff) |
add use and update uno function
Change-Id: I79d7d7ab77fff9a5e60a392e94fe2dd839803b64
Diffstat (limited to 'chart2')
-rw-r--r-- | chart2/source/view/inc/GL3DRenderer.hxx | 3 | ||||
-rw-r--r-- | chart2/source/view/main/GL3DRenderer.cxx | 54 |
2 files changed, 57 insertions, 0 deletions
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index 5e81419bec73..88e5666f4711 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -224,6 +224,9 @@ private: void ReleaseExtrude3DShapes(); void ReleaseTextShapes(); void ReleaseScreenTextShapes(); + void ReleaseBatchBarInfo(); + void InitBatch3DUniformBlock(); + void UpdateBatch3DUniformBlock(); private: struct ShaderResources diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index d869e16904c9..59d0f9252ede 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -278,6 +278,7 @@ void OpenGL3DRenderer::init() CHECK_GL_ERROR(); Init3DUniformBlock(); + InitBatch3DUniformBlock(); glViewport(0, 0, m_iWidth, m_iHeight); Set3DSenceInfo(0xFFFFFF, true); @@ -1070,6 +1071,59 @@ void OpenGL3DRenderer::Init3DUniformBlock() glBindBuffer(GL_UNIFORM_BUFFER, 0); } +void OpenGL3DRenderer::InitBatch3DUniformBlock() +{ + if(mbPickingMode) + return; + + GLuint a3DLightBlockIndex = glGetUniformBlockIndex(maResources.m_3DBatchProID, "GlobalLights"); + GLuint a3DMaterialBlockIndex = glGetUniformBlockIndex(maResources.m_3DBatchProID, "GlobalMaterialParameters"); + + if ((GL_INVALID_INDEX == a3DLightBlockIndex) || (GL_INVALID_INDEX == a3DMaterialBlockIndex)) + { + return; + } + int nUniformBufferAlignSize = 1; + glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &nUniformBufferAlignSize); + GLint nBlockDataSizeLight = 0, nBlockDataSizeMertrial = 0; + glGetActiveUniformBlockiv(maResources.m_3DBatchProID, a3DLightBlockIndex, GL_UNIFORM_BLOCK_DATA_SIZE, &nBlockDataSizeLight); + glGetActiveUniformBlockiv(maResources.m_3DBatchProID, a3DMaterialBlockIndex, GL_UNIFORM_BLOCK_DATA_SIZE, &nBlockDataSizeMertrial); + CHECK_GL_ERROR(); + glGenBuffers(1, &m_Batch3DUBOBuffer); + glBindBuffer(GL_UNIFORM_BUFFER, m_Batch3DUBOBuffer); + CHECK_GL_ERROR(); + m_Batch3DActualSizeLight = ((nBlockDataSizeLight / nUniformBufferAlignSize) + std::min(nBlockDataSizeLight % nUniformBufferAlignSize, 1)) * nUniformBufferAlignSize; +// cout << "nBlockDataSizeMertrial = " << nBlockDataSizeMertrial << ", nBlockDataSizeLight = " << nBlockDataSizeLight << ", m_3DActualSizeLight = " << m_3DActualSizeLight << endl; + int dataSize = m_Batch3DActualSizeLight + nBlockDataSizeMertrial; + glBufferData(GL_UNIFORM_BUFFER, dataSize, NULL, GL_DYNAMIC_DRAW); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, m_Batch3DUBOBuffer, 0, nBlockDataSizeLight); + CHECK_GL_ERROR(); + glUniformBlockBinding(maResources.m_3DBatchProID, a3DLightBlockIndex, 2); + + glBindBufferRange(GL_UNIFORM_BUFFER, 3, m_Batch3DUBOBuffer, ((nBlockDataSizeLight / nUniformBufferAlignSize) + std::min(nBlockDataSizeLight % nUniformBufferAlignSize, 1)) * nUniformBufferAlignSize, nBlockDataSizeMertrial); + glUniformBlockBinding(maResources.m_3DBatchProID, a3DMaterialBlockIndex, 3); + //for the light source uniform, we must calc the offset of each element + CHECK_GL_ERROR(); + glBindBuffer(GL_UNIFORM_BUFFER, 0); +} + +void OpenGL3DRenderer::UpdateBatch3DUniformBlock() +{ + if(mbPickingMode) + return; + + glBindBuffer(GL_UNIFORM_BUFFER, m_Batch3DUBOBuffer); + glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(GLint), &m_LightsInfo.lightNum); + CHECK_GL_ERROR(); + //current std140 alignment: 16 + glBufferSubData(GL_UNIFORM_BUFFER, 16, sizeof(glm::vec4), &m_LightsInfo.ambient[0]); + CHECK_GL_ERROR(); + //current std140 alignment: 16 + glBufferSubData(GL_UNIFORM_BUFFER, 32, sizeof(LightSource) * MAX_LIGHT_NUM, &m_LightsInfo.light); + CHECK_GL_ERROR(); + glBindBuffer(GL_UNIFORM_BUFFER, 0); +} + void OpenGL3DRenderer::Update3DUniformBlock() { if(mbPickingMode) |