diff options
author | weigao <weigao@multicorewareinc.com> | 2014-05-28 13:06:07 +0800 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-05-28 19:16:18 +0200 |
commit | 3b3f92be9cd7d7ed32cb5650893d1ad512fb4a0b (patch) | |
tree | baa4c694f70a520db721cd03ba096a22cd9d23e1 | |
parent | 0e332ba4e618413bb938f8aee3553530470d20ad (diff) |
add get and release batch render info function
-rw-r--r-- | chart2/source/view/inc/GL3DRenderer.hxx | 3 | ||||
-rw-r--r-- | chart2/source/view/main/GL3DRenderer.cxx | 104 |
2 files changed, 107 insertions, 0 deletions
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index 88e5666f4711..4b2f906b7256 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -225,6 +225,9 @@ private: void ReleaseTextShapes(); void ReleaseScreenTextShapes(); void ReleaseBatchBarInfo(); + void GetBatchBarsInfo(); + void GetBatchTopAndFlatInfo(Extrude3DInfo &extrude3D); + void GetBatchMiddleInfo(Extrude3DInfo &extrude3D); void InitBatch3DUniformBlock(); void UpdateBatch3DUniformBlock(); private: diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 59d0f9252ede..e96b150cb2ba 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -1725,16 +1725,120 @@ sal_uInt32 OpenGL3DRenderer::GetPixelColorFromPoint(long nX, long nY) return aColor.GetColor(); } +void OpenGL3DRenderer::ReleaseBatchBarInfo() +{ + for (int i = 0; i < 3; i++) + { + m_BarSurface[i].modelMatrixList.clear(); + m_BarSurface[i].normalMatrixList.clear(); + m_BarSurface[i].colorList.clear(); + } +} + + void OpenGL3DRenderer::ReleaseShapes() { ReleasePolygonShapes(); ReleaseExtrude3DShapes(); ReleaseTextShapes(); ReleaseScreenTextShapes(); + ReleaseBatchBarInfo(); } +void OpenGL3DRenderer::GetBatchMiddleInfo(Extrude3DInfo &extrude3D) +{ + float xyScale = extrude3D.xScale; + float zScale = extrude3D.zScale; + float actualZScale = zScale - m_RoundBarMesh.bottomThreshold * xyScale; + PosVecf3 trans = {extrude3D.xTransform, + extrude3D.yTransform, + extrude3D.zTransform}; + if (actualZScale < 0.0f) + { + return ; + } + else + { + glm::mat4 scale = glm::scale(xyScale, xyScale,actualZScale); + glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); + m_Model = aTranslationMatrix * extrude3D.rotation * scale; + } + glm::mat3 normalMatrix(m_Model); + glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix); + m_BarSurface[MIDDLE_SURFACE].modelMatrixList.push_back(m_Model); + m_BarSurface[MIDDLE_SURFACE].normalMatrixList.push_back(normalInverseTranspos); + m_BarSurface[MIDDLE_SURFACE].colorList.push_back(extrude3D.material.materialColor); } +void OpenGL3DRenderer::GetBatchTopAndFlatInfo(Extrude3DInfo &extrude3D) +{ + float xyScale = extrude3D.xScale; + float zScale = extrude3D.zScale; + float actualZTrans = zScale - m_RoundBarMesh.bottomThreshold * xyScale; + PosVecf3 trans = {extrude3D.xTransform, + extrude3D.yTransform, + extrude3D.zTransform}; + glm::mat4 orgTrans = glm::translate(glm::vec3(0.0, 0.0, -1.0)); + if (actualZTrans < 0.0f) + { + // the height of rounded corner is higher than the cube than use the org scale matrix + //yScale /= (float)(1 + BOTTOM_THRESHOLD); + zScale /= (float)(m_RoundBarMesh.bottomThreshold); + glm::mat4 scale = glm::scale(xyScale, xyScale, zScale); + //MoveModelf(trans, angle, scale); + glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); + m_Model = aTranslationMatrix * extrude3D.rotation * scale * orgTrans; + } + else + { + // use different matrices for different parts + glm::mat4 topTrans = glm::translate(glm::vec3(0.0, 0.0, actualZTrans)); + glm::mat4 topScale = glm::scale(xyScale, xyScale, xyScale); + glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); + m_Model = aTranslationMatrix * extrude3D.rotation * topTrans * topScale * orgTrans; + } + glm::mat3 normalMatrix(m_Model); + glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix); + m_BarSurface[TOP_SURFACE].modelMatrixList.push_back(m_Model); + m_BarSurface[TOP_SURFACE].normalMatrixList.push_back(normalInverseTranspos); + m_BarSurface[TOP_SURFACE].colorList.push_back(extrude3D.material.materialColor); + + 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; + normalMatrix = glm::mat3(m_Model); + normalInverseTranspos = glm::inverseTranspose(normalMatrix); + + m_BarSurface[FLAT_BOTTOM_SURFACE].modelMatrixList.push_back(m_Model); + m_BarSurface[FLAT_BOTTOM_SURFACE].normalMatrixList.push_back(normalInverseTranspos); + m_BarSurface[FLAT_BOTTOM_SURFACE].colorList.push_back(extrude3D.material.materialColor); } +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); + GetBatchMiddleInfo(extrude3DInfo); + } + else + { + 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; + glm::mat3 normalMatrix(m_Model); + glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix); + m_BarSurface[0].modelMatrixList.push_back(m_Model); + m_BarSurface[0].normalMatrixList.push_back(normalInverseTranspos); + m_BarSurface[0].colorList.push_back(extrude3DInfo.material.materialColor); + } + } +} +} +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |