summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorweigao <weigao@multicorewareinc.com>2014-05-28 13:06:07 +0800
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-05-28 19:16:18 +0200
commit3b3f92be9cd7d7ed32cb5650893d1ad512fb4a0b (patch)
treebaa4c694f70a520db721cd03ba096a22cd9d23e1
parent0e332ba4e618413bb938f8aee3553530470d20ad (diff)
add get and release batch render info function
-rw-r--r--chart2/source/view/inc/GL3DRenderer.hxx3
-rw-r--r--chart2/source/view/main/GL3DRenderer.cxx104
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: */