summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chart2/source/view/main/GL3DRenderer.cxx127
1 files changed, 101 insertions, 26 deletions
diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index 3566fb310cdb..41784671137e 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -195,6 +195,7 @@ void OpenGL3DRenderer::CheckGLSLVersion()
if (iVersion > 3)
{
maResources.m_b330Support = true;
+ maResources.m_b330Support = false;
return;
}
p++;
@@ -834,11 +835,6 @@ void OpenGL3DRenderer::RenderPolygon3D(const Polygon3DInfo& polygon)
{
return ;
}
- //update ubo
- Update3DUniformBlock();
- glBindBuffer(GL_UNIFORM_BUFFER, m_3DUBOBuffer);
- glBufferSubData(GL_UNIFORM_BUFFER, m_3DActualSizeLight, sizeof(MaterialParameters), &polygon.material);
- CHECK_GL_ERROR();
glBindBuffer(GL_UNIFORM_BUFFER, 0);
if(mbPickingMode)
{
@@ -849,6 +845,31 @@ void OpenGL3DRenderer::RenderPolygon3D(const Polygon3DInfo& polygon)
glUseProgram(maResources.m_3DProID);
glUniformMatrix4fv(maResources.m_3DViewID, 1, GL_FALSE, &m_3DView[0][0]);
glUniformMatrix4fv(maResources.m_3DProjectionID, 1, GL_FALSE, &m_3DProjection[0][0]);
+ if (maResources.m_b330Support)
+ {
+ //update ubo
+ Update3DUniformBlock();
+ glBindBuffer(GL_UNIFORM_BUFFER, m_3DUBOBuffer);
+ glBufferSubData(GL_UNIFORM_BUFFER, m_3DActualSizeLight, sizeof(MaterialParameters), &polygon.material);
+ CHECK_GL_ERROR();
+ }
+ else
+ {
+ //update light information
+ glUniform4fv(maResources.m_3DLightColorID, m_iLightNum, (GLfloat*)m_LightColor);
+ glUniform4fv(maResources.m_3DLightPosID, m_iLightNum, (GLfloat*)m_PositionWorldspace);
+ glUniform1fv(maResources.m_3DLightPowerID, m_iLightNum, m_fLightPower);
+ glUniform1i(maResources.m_3DLightNumID, m_iLightNum);
+ glUniform4fv(maResources.m_3DLightAmbientID, 1, &m_Ambient[0]);
+ //update meterial information
+ glUniform4fv(maResources.m_3DMaterialAmbientID, 1, &polygon.material.ambient[0]);
+ glUniform4fv(maResources.m_3DMaterialDiffuseID, 1, &polygon.material.diffuse[0]);
+ glUniform4fv(maResources.m_3DMaterialSpecularID, 1, &polygon.material.specular[0]);
+ glUniform4fv(maResources.m_3DMaterialColorID, 1, &polygon.material.materialColor[0]);
+ glUniform1i(maResources.m_3DMaterialTwoSidesID, polygon.material.twoSidesLighting);
+ glUniform1f(maResources.m_3DMaterialShininessID, polygon.material.shininess);
+ CHECK_GL_ERROR();
+ }
}
for (size_t i = 0; i < verticesNum; i++)
{
@@ -968,26 +989,45 @@ void OpenGL3DRenderer::RenderPolygon3DObject()
void OpenGL3DRenderer::Set3DSenceInfo(sal_uInt32 nColor, bool twoSidesLighting)
{
m_Polygon3DInfo.material.twoSidesLighting = twoSidesLighting;
-
- m_LightsInfo.ambient = getColorAsVector(nColor);
-
- m_LightsInfo.lightNum = 0;
+ if (maResources.m_b330Support)
+ {
+ m_LightsInfo.ambient = getColorAsVector(nColor);
+ m_LightsInfo.lightNum = 0;
+ }
+ else
+ {
+ m_iLightNum = 0;
+ m_Ambient = getColorAsVector(nColor);;
+ }
SetLightInfo(true, 0xFFFFFF, glm::vec4(1.0, 1.0, 1.0, 0.0));
}
void OpenGL3DRenderer::SetLightInfo(bool lightOn, sal_uInt32 nColor, const glm::vec4& direction)
{
- if (m_LightsInfo.lightNum >= MAX_LIGHT_NUM)
- {
- return;
- }
-
if (lightOn)
{
- m_LightsInfo.light[m_LightsInfo.lightNum].lightColor = getColorAsVector(nColor);
- m_LightsInfo.light[m_LightsInfo.lightNum].positionWorldspace = direction;
- m_LightsInfo.light[m_LightsInfo.lightNum].lightPower = 1.0;
- m_LightsInfo.lightNum++;
+ if (maResources.m_b330Support)
+ {
+ if (m_LightsInfo.lightNum >= MAX_LIGHT_NUM)
+ {
+ return;
+ }
+ m_LightsInfo.light[m_LightsInfo.lightNum].lightColor = getColorAsVector(nColor);
+ m_LightsInfo.light[m_LightsInfo.lightNum].positionWorldspace = direction;
+ m_LightsInfo.light[m_LightsInfo.lightNum].lightPower = 1.0;
+ m_LightsInfo.lightNum++;
+ }
+ else
+ {
+ if (m_iLightNum >= MAX_LIGHT_NUM)
+ {
+ return;
+ }
+ m_LightColor[m_iLightNum] = getColorAsVector(nColor);
+ m_PositionWorldspace[m_iLightNum] = direction;
+ m_fLightPower[m_iLightNum] = 1.0;
+ m_iLightNum++;
+ }
}
}
@@ -1389,7 +1429,6 @@ void OpenGL3DRenderer::RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D)
glUniform4fv(maResources.m_2DColorID, 1, &extrude3D.id[0]);
}
glDrawElements(GL_TRIANGLES, extrude3D.size[TOP_SURFACE], GL_UNSIGNED_SHORT, reinterpret_cast<GLvoid*>(extrude3D.startIndex[TOP_SURFACE]));
- RenderExtrudeFlatSurface(extrude3D, FLAT_BOTTOM_SURFACE);
}
void OpenGL3DRenderer::RenderNonRoundedBar(const Extrude3DInfo& extrude3D)
@@ -1453,12 +1492,26 @@ void OpenGL3DRenderer::RenderExtrude3DObject()
}
else
{
- Update3DUniformBlock();
glUseProgram(maResources.m_3DProID);
glUniformMatrix4fv(maResources.m_3DViewID, 1, GL_FALSE, &m_3DView[0][0]);
glUniformMatrix4fv(maResources.m_3DProjectionID, 1, GL_FALSE, &m_3DProjection[0][0]);
+ if (maResources.m_b330Support)
+ {
+ //update ubo
+ Update3DUniformBlock();
+ CHECK_GL_ERROR();
+ }
+ else
+ {
+ //update light information
+ glUniform4fv(maResources.m_3DLightColorID, m_iLightNum, (GLfloat*)m_LightColor);
+ glUniform4fv(maResources.m_3DLightPosID, m_iLightNum, (GLfloat*)m_PositionWorldspace);
+ glUniform1fv(maResources.m_3DLightPowerID, m_iLightNum, m_fLightPower);
+ glUniform1i(maResources.m_3DLightNumID, m_iLightNum);
+ glUniform4fv(maResources.m_3DLightAmbientID, 1, &m_Ambient[0]);
+ CHECK_GL_ERROR();
+ }
}
- CHECK_GL_ERROR();
size_t extrude3DNum = m_Extrude3DList.size();
for (size_t i = 0; i < extrude3DNum; i++)
{
@@ -1498,10 +1551,23 @@ void OpenGL3DRenderer::RenderExtrude3DObject()
extrude3DInfo.zScale *= m_fHeightWeight;
if(!mbPickingMode)
{
- glBindBuffer(GL_UNIFORM_BUFFER, m_3DUBOBuffer);
- glBufferSubData(GL_UNIFORM_BUFFER, m_3DActualSizeLight, sizeof(MaterialParameters), &extrude3DInfo.material);
- CHECK_GL_ERROR();
- glBindBuffer(GL_UNIFORM_BUFFER, 0);
+ if (maResources.m_b330Support)
+ {
+ glBindBuffer(GL_UNIFORM_BUFFER, m_3DUBOBuffer);
+ glBufferSubData(GL_UNIFORM_BUFFER, m_3DActualSizeLight, sizeof(MaterialParameters), &extrude3DInfo.material);
+ CHECK_GL_ERROR();
+ glBindBuffer(GL_UNIFORM_BUFFER, 0);
+ }
+ else
+ {
+ //update meterial information
+ glUniform4fv(maResources.m_3DMaterialAmbientID, 1, &extrude3DInfo.material.ambient[0]);
+ glUniform4fv(maResources.m_3DMaterialDiffuseID, 1, &extrude3DInfo.material.diffuse[0]);
+ glUniform4fv(maResources.m_3DMaterialSpecularID, 1, &extrude3DInfo.material.specular[0]);
+ glUniform4fv(maResources.m_3DMaterialColorID, 1, &extrude3DInfo.material.materialColor[0]);
+ glUniform1i(maResources.m_3DMaterialTwoSidesID, extrude3DInfo.material.twoSidesLighting);
+ glUniform1f(maResources.m_3DMaterialShininessID, extrude3DInfo.material.shininess);
+ }
}
extrude3DInfo.reverse = 0;
if (extrude3DInfo.rounded)
@@ -1796,7 +1862,16 @@ void OpenGL3DRenderer::ProcessUnrenderedShape(bool bNewScene)
if(mbPickingMode)
RenderExtrude3DObject();
else
- RenderBatchBars(bNewScene);
+ {
+ if (maResources.m_b330Support)
+ {
+ RenderBatchBars(bNewScene);
+ }
+ else
+ {
+ RenderExtrude3DObject();
+ }
+ }
//render text
RenderTextShape();
// render screen text