summaryrefslogtreecommitdiff
path: root/chart2
diff options
context:
space:
mode:
authorweigao <weigao@multicorewareinc.com>2014-05-28 12:50:38 +0800
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-05-28 19:16:17 +0200
commit0e332ba4e618413bb938f8aee3553530470d20ad (patch)
tree3cc75006f675e25599c3bcc564d596725a1529e1 /chart2
parent47a417d93aa7a68f1b3b371e2a4a6b07fb1c6f07 (diff)
add use and update uno function
Change-Id: I79d7d7ab77fff9a5e60a392e94fe2dd839803b64
Diffstat (limited to 'chart2')
-rw-r--r--chart2/source/view/inc/GL3DRenderer.hxx3
-rw-r--r--chart2/source/view/main/GL3DRenderer.cxx54
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)