[Libreoffice-commits] core.git: Branch 'private/moggi/extract-shaders' - chart2/source

Markus Mohrhard markus.mohrhard at collabora.co.uk
Sun Jan 26 20:59:10 PST 2014


 chart2/source/view/main/DummyXShape.cxx  |  521 -------------------------------
 chart2/source/view/main/OpenGLRender.cxx |   74 +---
 chart2/source/view/main/OpenGLRender.hxx |    8 
 3 files changed, 39 insertions(+), 564 deletions(-)

New commits:
commit aa9cae8936b1a8eb464c8a7a27c1484089a7c7b0
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Mon Jan 27 05:56:40 2014 +0100

    use point sprites for symbol rendering
    
    Change-Id: Ib2b35c367c0b70e3ba140c15fae5378c7a2edebc

diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index d24f913..c4a6ed0 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -465,509 +465,8 @@ DummySymbol2D::DummySymbol2D(const drawing::Position3D& rPos, const drawing::Dir
     mnBorderColor(nBorderColor),
     mnFillColor(nFillColor)
 {
-    //setPosition(Position3DToAWTPoint(rPos));
-    //setSize(Direction3DToAWTSize(rSize));
-}
-drawing::PolyPolygonShape3D oglCreatePolyPolygon_Symbol( const drawing::Position3D& rPos
-                                 , const drawing::Direction3D& rSize
-                                 , sal_Int32 nStandardSymbol )
-{
-    printf("***  createPolyPolygon_Symbol\n");
-    if(nStandardSymbol<0)
-        nStandardSymbol*=-1;
-    nStandardSymbol = nStandardSymbol%Symbol_COUNT;
-    SymbolEnum eSymbolType=static_cast<SymbolEnum>(nStandardSymbol);
-
-    const double& fX = rPos.PositionX;
-    const double& fY = rPos.PositionY;
-
-    const double fWidthH  = rSize.DirectionX/2.0; //fWidthH stands for Half Width
-    const double fHeightH = rSize.DirectionY/2.0; //fHeightH stands for Half Height
-
-    const sal_Int32 nQuarterCount = 35; // points inside a quadrant, used in case circle
-
-    sal_Int32 nPointCount = 4; //all arrow symbols only need 4 points
-    switch( eSymbolType )
-    {
-        case Symbol_Square:
-        case Symbol_Diamond:
-        case Symbol_Bowtie:
-        case Symbol_Sandglass:
-        case Symbol_HorizontalBar:
-        case Symbol_VerticalBar:
-            nPointCount = 5;
-            break;
-        case Symbol_X:
-            nPointCount = 13;
-            break;
-        case Symbol_Plus:
-            nPointCount = 13;
-            break;
-        case Symbol_Star:
-            nPointCount = 9;
-            break;
-        case Symbol_Asterisk:
-            nPointCount = 19;
-            break;
-        case Symbol_Circle:
-            nPointCount = 5 + 4 * nQuarterCount;
-            break;
-        default:
-            break;
-    }
-
-    drawing::PolyPolygonShape3D aPP;
-
-    aPP.SequenceX.realloc(1);
-    aPP.SequenceY.realloc(1);
-    aPP.SequenceZ.realloc(1);
-
-    drawing::DoubleSequence* pOuterSequenceX = aPP.SequenceX.getArray();
-    drawing::DoubleSequence* pOuterSequenceY = aPP.SequenceY.getArray();
-    drawing::DoubleSequence* pOuterSequenceZ = aPP.SequenceZ.getArray();
-
-    pOuterSequenceX->realloc(nPointCount);
-    pOuterSequenceY->realloc(nPointCount);
-    pOuterSequenceZ->realloc(nPointCount);
-
-    double* pInnerSequenceX = pOuterSequenceX->getArray();
-    double* pInnerSequenceY = pOuterSequenceY->getArray();
-    double* pInnerSequenceZ = pOuterSequenceZ->getArray();
-
-    for(sal_Int32 nN = nPointCount; nN--;)
-        *pInnerSequenceZ++ = 0.0;
-
-    switch(eSymbolType)
-    {
-        case Symbol_Square:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-        case Symbol_UpArrow:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-            break;
-        }
-        case Symbol_DownArrow:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-        case Symbol_RightArrow:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-        case Symbol_LeftArrow:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY;
-            break;
-        }
-        case Symbol_Bowtie:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-        case Symbol_Sandglass:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-            break;
-        }
-        case Symbol_Diamond:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY;
-            break;
-        }
-        case Symbol_HorizontalBar:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-0.2*fHeightH;
-            break;
-        }
-        case Symbol_VerticalBar:
-        {
-            *pInnerSequenceX++ = fX-0.2*fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX+0.2*fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX+0.2*fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX-0.2*fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX-0.2*fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            break;
-        }
-        case Symbol_Circle:
-        {
-            double fOmega = 1.5707963267948966192 / (nQuarterCount + 1.0);
-            // one point in the middle of each edge to get full size bounding rectangle
-            *pInnerSequenceX++ = fX + fWidthH;
-            *pInnerSequenceY++ = fY;
-            // 0 to PI/2
-            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
-            {
-                *pInnerSequenceX++ = fX + fWidthH * cos( i * fOmega );
-                *pInnerSequenceY++ = fY - fHeightH * sin( i * fOmega );
-            }
-            // PI/2 to PI
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY - fHeightH;
-            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
-            {
-                *pInnerSequenceX++ = fX - fWidthH * sin( i * fOmega);
-                *pInnerSequenceY++ = fY - fHeightH * cos( i * fOmega);
-            }
-            // PI to 3/2*PI
-            *pInnerSequenceX++ = fX - fWidthH;
-            *pInnerSequenceY++ = fY;
-            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
-            {
-                *pInnerSequenceX++ = fX - fWidthH * cos( i * fOmega);
-                *pInnerSequenceY++ = fY + fHeightH * sin( i * fOmega);
-            }
-            // 3/2*PI to 2*PI
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY + fHeightH;
-            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
-            {
-                *pInnerSequenceX++ = fX + fWidthH * sin(i * fOmega);
-                *pInnerSequenceY++ = fY + fHeightH * cos(i * fOmega);
-            }
-            // close polygon
-            *pInnerSequenceX++ = fX + fWidthH;
-            *pInnerSequenceY++ = fY;
-            break;
-        }
-        case Symbol_Star:
-        {
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX+0.2*fWidthH;
-            *pInnerSequenceY++ = fY-0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX+0.2*fWidthH;
-            *pInnerSequenceY++ = fY+0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX-0.2*fWidthH;
-            *pInnerSequenceY++ = fY+0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX-0.2*fWidthH;
-            *pInnerSequenceY++ = fY-0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-        case Symbol_X:
-        {
-            const double fScaleX = fWidthH / 128.0;
-            const double fScaleY = fHeightH / 128.0;
-            const double fSmall = sqrt(200.0);
-            const double fLarge = 128.0 - fSmall;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY - fScaleY * fSmall;
-
-            *pInnerSequenceX++ = fX - fScaleX * fLarge;
-            *pInnerSequenceY++ = fY - fHeightH;
-
-            *pInnerSequenceX++ = fX - fWidthH;
-            *pInnerSequenceY++ = fY - fScaleY * fLarge;
-
-            *pInnerSequenceX++ = fX - fScaleX * fSmall;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX - fWidthH;
-            *pInnerSequenceY++ = fY + fScaleY * fLarge;
-
-            *pInnerSequenceX++ = fX - fScaleX * fLarge;
-            *pInnerSequenceY++ = fY + fHeightH;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY + fScaleY * fSmall;
-
-            *pInnerSequenceX++ = fX + fScaleX * fLarge;
-            *pInnerSequenceY++ = fY + fHeightH;
-
-            *pInnerSequenceX++ = fX + fWidthH;
-            *pInnerSequenceY++ = fY + fScaleY * fLarge;
-
-            *pInnerSequenceX++ = fX + fScaleX * fSmall;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX + fWidthH;
-            *pInnerSequenceY++ = fY - fScaleY * fLarge;
-
-            *pInnerSequenceX++ = fX + fScaleX * fLarge;
-            *pInnerSequenceY++ = fY - fHeightH;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY - fScaleY * fSmall;
-            break;
-
-        }
-        case Symbol_Plus:
-        {
-            const double fScaleX = fWidthH / 128.0;
-            const double fScaleY = fHeightH / 128.0;
-            const double fHalf = 10.0; //half line width on 256 size square
-            const double fdX = fScaleX * fHalf;
-            const double fdY = fScaleY * fHalf;
-
-            *pInnerSequenceX++ = fX-fdX;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fdX;
-            *pInnerSequenceY++ = fY-fdY;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fdY;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fdY;
-
-            *pInnerSequenceX++ = fX-fdX;
-            *pInnerSequenceY++ = fY+fdY;
-
-            *pInnerSequenceX++ = fX-fdX;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fdX;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fdX;
-            *pInnerSequenceY++ = fY+fdY;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fdY;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fdY;
-
-            *pInnerSequenceX++ = fX+fdX;
-            *pInnerSequenceY++ = fY-fdY;
-
-            *pInnerSequenceX++ = fX+fdY;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fdX;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-
-        }
-        case Symbol_Asterisk:
-        {
-            const double fHalf = 10.0; // half line width on 256 size square
-            const double fTwoY = fHalf * sqrt(3.0);
-            const double fFourY = (128.0 - 2.0 * fHalf ) / sqrt(3.0);
-            const double fThreeX = 128.0 - fHalf;
-            const double fThreeY = fHalf * sqrt(3.0) + fFourY;
-            const double fFiveX = 2.0 * fHalf;
-
-            const double fScaleX = fWidthH / 128.0;
-            const double fScaleY = fHeightH / 128.0;
-
-            //1
-            *pInnerSequenceX++ = fX-fScaleX * fHalf;
-            *pInnerSequenceY++ = fY-fHeightH;
-            //2
-            *pInnerSequenceX++ = fX-fScaleX * fHalf;
-            *pInnerSequenceY++ = fY-fScaleY * fTwoY;
-            //3
-            *pInnerSequenceX++ = fX-fScaleX * fThreeX;
-            *pInnerSequenceY++ = fY-fScaleY * fThreeY;
-            //4
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fScaleY * fFourY;
-            //5
-            *pInnerSequenceX++ = fX-fScaleX * fFiveX;
-            *pInnerSequenceY++ = fY;
-            //6 as 4
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fScaleY * fFourY;
-            //7 as 3
-            *pInnerSequenceX++ = fX-fScaleX * fThreeX;
-            *pInnerSequenceY++ = fY+fScaleY * fThreeY;
-            //8 as 2
-            *pInnerSequenceX++ = fX-fScaleX * fHalf;
-            *pInnerSequenceY++ = fY+fScaleY * fTwoY;
-            //9 as 1
-            *pInnerSequenceX++ = fX-fScaleX * fHalf;
-            *pInnerSequenceY++ = fY+fHeightH;
-            //10 as 1
-            *pInnerSequenceX++ = fX+fScaleX * fHalf;
-            *pInnerSequenceY++ = fY+fHeightH;
-            //11 as 2
-            *pInnerSequenceX++ = fX+fScaleX * fHalf;
-            *pInnerSequenceY++ = fY+fScaleY * fTwoY;
-            //12 as 3
-            *pInnerSequenceX++ = fX+fScaleX * fThreeX;
-            *pInnerSequenceY++ = fY+fScaleY * fThreeY;
-            //13 as 4
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fScaleY * fFourY;
-            //14 as 5
-            *pInnerSequenceX++ = fX+fScaleX * fFiveX;
-            *pInnerSequenceY++ = fY;
-            //15 as 4
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fScaleY * fFourY;
-            //16 as 3
-            *pInnerSequenceX++ = fX+fScaleX * fThreeX;
-            *pInnerSequenceY++ = fY-fScaleY * fThreeY;
-            //17 as 2
-            *pInnerSequenceX++ = fX+fScaleX * fHalf;
-            *pInnerSequenceY++ = fY-fScaleY * fTwoY;
-            // 18 as 1
-            *pInnerSequenceX++ = fX+fScaleX * fHalf;
-            *pInnerSequenceY++ = fY-fHeightH;
-            // 19 = 1, closing
-            *pInnerSequenceX++ = fX-fScaleX * fHalf;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-        default: //case Symbol_Square:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-    }
-
-    return aPP;
+    setPosition(Position3DToAWTPoint(rPos));
+    setSize(Direction3DToAWTSize(rSize));
 }
 
 void DummySymbol2D::render()
@@ -976,21 +475,7 @@ void DummySymbol2D::render()
 
     pChart->m_GLRender.SetColor(mnFillColor);
 
-    drawing::PointSequenceSequence aPointss( PolyToPointSequence(
-                oglCreatePolyPolygon_Symbol( mrPosition, mrSize, mnStandardSymbol ) ));
-
-    sal_Int32 nPointssCount = aPointss.getLength();
-    for(sal_Int32 i = 0; i < nPointssCount; i++)
-    {
-        const com::sun::star::uno::Sequence<com::sun::star::awt::Point>& points = aPointss[i];
-        sal_Int32 nPointsCount = points.getLength();
-        for(sal_Int32 j = 0; j < nPointsCount; j++)
-        {
-            const com::sun::star::awt::Point& p = points[j];
-            pChart->m_GLRender.SetSymbol2DShapePoint((float)p.X, (float)p.Y, nPointsCount);
-        }
-    }
-    pChart->m_GLRender.RenderSymbol2DShape();
+    pChart->m_GLRender.RenderSymbol2DShape(maPosition.X, maPosition.Y, maSize.Width, maSize.Height, mnStandardSymbol);
 }
 
 DummyCircle::DummyCircle(const awt::Point& rPos, const awt::Size& rSize)
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index 49ab3ea..e80e210 100644
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -384,6 +384,11 @@ int OpenGLRender::InitOpenGL(GLWindow aWindow)
     m_BackgroundVertexID = glGetAttribLocation(m_BackgroundProID, "vPosition");
     m_BackgroundColorID = glGetAttribLocation(m_BackgroundProID, "vColor");
 
+    m_SymbolProID = LoadShaders("symbolVertexShader", "symbolFragmentShader");
+    m_SymbolVertexID = glGetAttribLocation(m_SymbolProID, "vPosition");
+    m_SymbolMatrixID = glGetAttribLocation(m_SymbolProID, "MVP");
+    m_SymbolColorID = glGetAttribLocation(m_SymbolProID, "vColor");
+
     m_TextProID = LoadShaders("textVertexShader", "textFragmentShader");
     m_TextMatrixID = glGetUniformLocation(m_TextProID, "MVP");
     m_TextVertexID = glGetAttribLocation(m_TextProID, "vPosition");
@@ -1720,67 +1725,48 @@ int OpenGLRender::RenderPieSegment2DShape(float fSize, float fPosX, float fPosY)
     CHECK_GL_ERROR();
     return 0;
 }
-int OpenGLRender::SetSymbol2DShapePoint(float x, float y, int listLength)
-{
-    if (m_Symbol2DPointList.empty())
-    {
-        m_Symbol2DPointList.reserve(listLength);
-    }
-    float actualX = (x / OPENGL_SCALE_VALUE);
-    float actualY = (y / OPENGL_SCALE_VALUE);
-    m_Symbol2DPointList.push_back(actualX);
-    m_Symbol2DPointList.push_back(actualY);
-    m_Symbol2DPointList.push_back(m_fZStep);
-
-    if (m_Symbol2DPointList.size() == size_t(listLength * 3))
-    {
-        m_Symbol2DShapePointList.push_back(m_Symbol2DPointList);
-        m_Symbol2DPointList.clear();
-    }
-    return 0;
-}
-
-int OpenGLRender::RenderSymbol2DShape()
+int OpenGLRender::RenderSymbol2DShape(float x, float y, float width, float height, sal_Int32)
 {
     CHECK_GL_ERROR();
 
+    glDisable(GL_POINT_SMOOTH);
     glDisable(GL_MULTISAMPLE);
-    size_t listNum = m_Symbol2DShapePointList.size();
-    PosVecf3 trans = {0.0f, 0.0f, 0.0f};
+    glPointSize(10.f);
+    PosVecf3 trans = {x/OPENGL_SCALE_VALUE, y/OPENGL_SCALE_VALUE, m_fZStep};
     PosVecf3 angle = {0.0f, 0.0f, 0.0f};
-    PosVecf3 scale = {1.0f, 1.0f, 1.0f};
+    PosVecf3 scale = {width/OPENGL_SCALE_VALUE, height/OPENGL_SCALE_VALUE, 1.0f};
     MoveModelf(trans, angle, scale);
     m_MVP = m_Projection * m_View * m_Model;
-    for (size_t i = 0; i < listNum; ++i)
-    {
-        PointList &pointList = m_Symbol2DShapePointList.back();
-        //fill vertex buffer
-        glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
-        glBufferData(GL_ARRAY_BUFFER, pointList.size() * sizeof(float), &pointList[0], GL_STATIC_DRAW);
-        // Use our shader
-        glUseProgram(m_CommonProID);
 
-        glUniform4fv(m_2DColorID, 1, &m_2DColor[0]);
+    float aPos[3] = { 0.f, 0.f, 0.f };
+    //fill vertex buffer
+    glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
+    glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(float), aPos, GL_STATIC_DRAW);
 
-        glUniformMatrix4fv(m_MatrixID, 1, GL_FALSE, &m_MVP[0][0]);
+    // Use our shader
+    glUseProgram(m_SymbolProID);
 
-        // 1rst attribute buffer : vertices
-        glEnableVertexAttribArray(m_2DVertexID);
-        glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
-        glVertexAttribPointer(
-            m_2DVertexID,                  // attribute. No particular reason for 0, but must match the layout in the shader.
+    glUniform4fv(m_SymbolColorID, 1, &m_2DColor[0]);
+
+    glUniformMatrix4fv(m_SymbolMatrixID, 1, GL_FALSE, &m_MVP[0][0]);
+
+    // 1rst attribute buffer : vertices
+    glEnableVertexAttribArray(m_SymbolVertexID);
+    glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
+    glVertexAttribPointer(
+            m_SymbolVertexID,                  // attribute. No particular reason for 0, but must match the layout in the shader.
             3,                  // size
             GL_FLOAT,           // type
             GL_FALSE,           // normalized?
             0,                  // stride
             (void*)0            // array buffer offset
             );
-        glDrawArrays(GL_POLYGON, 0, pointList.size() / 3); // 12*3 indices starting at 0 -> 12 triangles
-        glDisableVertexAttribArray(m_2DVertexID);
-        glUseProgram(0);
-        m_Symbol2DShapePointList.pop_back();
-    }
+    glDrawArrays(GL_POINTS, 0, 1); // 12*3 indices starting at 0 -> 12 triangles
+
+    glDisableVertexAttribArray(m_SymbolVertexID);
+    glUseProgram(0);
     glEnable(GL_MULTISAMPLE);
+    glEnable(GL_POINT_SMOOTH);
     m_fZStep += 0.01f;
 
     CHECK_GL_ERROR();
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index 2faf556..76217ac 100644
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -180,8 +180,7 @@ public:
     void GeneratePieSegment2D(double, double, double, double);
     int RenderPieSegment2DShape(float, float, float);
 
-    int SetSymbol2DShapePoint(float, float, int);
-    int RenderSymbol2DShape();
+    int RenderSymbol2DShape(float, float, float, float, sal_Int32);
 #if DEBUG_POSITIONING
     void renderDebug();
 #endif
@@ -306,6 +305,11 @@ private:
     PointList m_Symbol2DPointList;
     std::list<PointList> m_Symbol2DShapePointList;
 
+    GLuint m_SymbolProID;
+    GLuint m_SymbolVertexID;
+    GLuint m_SymbolMatrixID;
+    GLuint m_SymbolColorID;
+
 #if DEBUG_POSITIONING
     GLuint m_DebugProID;
     GLuint m_DebugVertexID;


More information about the Libreoffice-commits mailing list