LCOV - code coverage report
Current view: top level - chart2/source/view/inc - GL3DRenderer.hxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 0 13 0.0 %
Date: 2015-06-13 12:38:46 Functions: 0 19 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  */
       9             : 
      10             : #ifndef INCLUDED_CHART2_SOURCE_VIEW_INC_GL3DRENDERER_HXX
      11             : #define INCLUDED_CHART2_SOURCE_VIEW_INC_GL3DRENDERER_HXX
      12             : 
      13             : #include "glm/glm.hpp"
      14             : #include "glm/gtx/transform.hpp"
      15             : #include "glm/gtx/euler_angles.hpp"
      16             : #include "glm/gtx/quaternion.hpp"
      17             : 
      18             : #include <com/sun/star/awt/Point.hpp>
      19             : #include <boost/shared_array.hpp>
      20             : #include <tools/gen.hxx>
      21             : 
      22             : #include <vcl/bitmapex.hxx>
      23             : 
      24             : #include <vector>
      25             : #include <list>
      26             : #include <map>
      27             : 
      28             : #define MAX_LIGHT_NUM 8
      29             : 
      30             : namespace chart {
      31             : 
      32             : namespace opengl3D {
      33             : 
      34             : struct PosVecf3
      35             : {
      36             :     float x;
      37             :     float y;
      38             :     float z;
      39             : };
      40             : 
      41             : typedef std::vector <glm::vec3> Vertices3D;
      42             : typedef std::vector <glm::vec2> UVs3D;
      43             : typedef std::vector <glm::vec3> Normals3D;
      44             : 
      45           0 : struct MaterialParameters
      46             : {
      47             :     glm::vec4 ambient;
      48             :     glm::vec4 diffuse;
      49             :     glm::vec4 specular;
      50             :     glm::vec4 materialColor;
      51             : 
      52             :     bool twoSidesLighting;
      53             :     float shininess;
      54             :     float pad;
      55             :     float pad1;
      56             : };
      57             : 
      58           0 : struct LightSource
      59             : {
      60             :     glm::vec4   lightColor;
      61             :     glm::vec4   positionWorldspace;
      62             :     float  lightPower;
      63             :     float  pad1;
      64             :     float  pad2;
      65             :     float  pad3;
      66             : };
      67             : 
      68           0 : struct GlobalLights
      69             : {
      70             :     int lightNum;
      71             :     glm::vec4 ambient;
      72             :     LightSource light[MAX_LIGHT_NUM];
      73             : };
      74             : 
      75           0 : struct Polygon3DInfo
      76             : {
      77             :     bool lineOnly;
      78             :     float lineWidth;
      79             :     bool twoSidesLighting;
      80             :     long fillStyle;
      81             :     glm::vec4 polygonColor;
      82             :     glm::vec4 id;
      83             :     Vertices3D *vertices;
      84             :     Normals3D *normals;
      85             :     std::vector <Vertices3D *> verticesList;
      86             :     std::vector <Normals3D *> normalsList;
      87             :     MaterialParameters material;
      88             : };
      89             : 
      90           0 : struct Extrude3DInfo
      91             : {
      92             :     bool rounded;
      93             :     bool twoSidesLighting;
      94             :     glm::vec4 extrudeColor;
      95             :     glm::vec4 id;
      96             :     sal_uInt32 orgID;
      97             :     float xScale;
      98             :     float yScale;
      99             :     float zScale;
     100             :     float xTransform;
     101             :     float yTransform;
     102             :     float zTransform;
     103             :     glm::mat4 rotation;
     104             :     MaterialParameters material;
     105             :     int startIndex[5];
     106             :     int size[5];
     107             :     int reverse;
     108             : };
     109             : 
     110             : struct CameraInfo
     111             : {
     112             :     glm::vec3 cameraPos;
     113             :     glm::vec3 cameraOrg;
     114             :     glm::vec3 cameraUp;
     115             : 
     116           0 :     CameraInfo():
     117           0 :         cameraUp(glm::vec3(0, 0, 1)) {}
     118             : };
     119             : 
     120             : struct RoundBarMesh
     121             : {
     122             :     float topThreshold;
     123             :     float bottomThreshold;
     124             :     int iMeshStartIndices;
     125             :     int iMeshSizes;
     126             :     int iElementStartIndices[5];
     127             :     int iElementSizes[5];
     128             : };
     129             : 
     130           0 : struct PackedVertex{
     131             :     glm::vec3 position;
     132             :     glm::vec3 normal;
     133           0 :     bool operator<(const PackedVertex& that) const{
     134           0 :         return memcmp(this, &that, sizeof(PackedVertex))>0;
     135             :     };
     136             : };
     137             : 
     138           0 : struct TextInfo
     139             : {
     140             :     glm::vec4 id;
     141             :     sal_uInt32 uniqueId;
     142             :     GLuint texture;
     143             :     float vertex[12];
     144             :     glm::vec3 pos;
     145             :     glm::vec4 textColor;
     146             : };
     147             : 
     148             : struct TextureArrayInfo
     149             : {
     150             :     size_t subTextureNum;
     151             :     int textureArrayWidth;
     152             :     int textureArrayHeight;
     153             :     GLuint textureID;
     154             : 
     155             :     TextureArrayInfo();
     156             : };
     157             : 
     158           0 : struct TextInfoBatch
     159             : {
     160             :     size_t batchNum;
     161             :     std::vector<glm::vec4> idList;
     162             :     std::vector<TextureArrayInfo> texture;
     163             :     std::vector<glm::vec3> vertexList;
     164             :     std::vector<glm::vec3> textureCoordList;
     165             : };
     166             : 
     167           0 : struct BatchBarInfo
     168             : {
     169             :     std::vector <glm::mat4> modelMatrixList;
     170             :     std::vector <glm::mat3> normalMatrixList;
     171             :     std::vector <glm::vec4> colorList;
     172             :     std::map<sal_uInt32, unsigned int> mapId2Color;
     173             :     glm::vec4 selectBarColor;
     174             : };
     175             : 
     176             : class OpenGL3DRenderer
     177             : {
     178             : public:
     179             :     OpenGL3DRenderer();
     180             :     ~OpenGL3DRenderer();
     181             : 
     182             :     void init();
     183             :     void Set3DSenceInfo(sal_uInt32 color = 255, bool twoSidesLighting = true);
     184             :     void SetLightInfo(bool lightOn, sal_uInt32 color, const glm::vec4& direction);
     185             :     void AddShapePolygon3DObject(sal_uInt32 color, bool lineOnly, sal_uInt32 lineColor,
     186             :             long fillStyle, sal_uInt32 specular, sal_uInt32 nUniqueId);
     187             :     void EndAddShapePolygon3DObject();
     188             :     void AddPolygon3DObjectNormalPoint(float x, float y, float z);
     189             :     void EndAddPolygon3DObjectNormalPoint();
     190             :     void AddPolygon3DObjectPoint(float x, float y, float z);
     191             :     void EndAddPolygon3DObjectPoint();
     192             :     void AddShape3DExtrudeObject(bool roundedCorner, sal_uInt32 color, sal_uInt32 specular, const glm::mat4& modelMatrix, sal_uInt32 nUniqueId);
     193             :     void EndAddShape3DExtrudeObject();
     194             :     void SetSize(const Size& rSize);
     195             :     void SetCameraInfo(const glm::vec3& pos, const glm::vec3& direction, const glm::vec3& up);
     196             :     void CreateTextTexture(const boost::shared_array<sal_uInt8> &bitmapBuf,
     197             :                            const ::Size& rSizePixels,
     198             :                            const glm::vec3& vTopLeft, const glm::vec3& vTopRight,
     199             :                            const glm::vec3& vBottomRight, const glm::vec3& vBottomLeft,
     200             :                            sal_uInt32 nUniqueId);
     201             :     void CreateScreenTextTexture(const boost::shared_array<sal_uInt8> &bitmapBuf,
     202             :                                  const ::Size& rSizePixels, const glm::vec2& vTopLeft,
     203             :                                  const glm::vec2& vBottomRight, const glm::vec3& vPos, const glm::vec4& vScreenTextColor,
     204             :                                  sal_uInt32 nUniqueId);
     205             :     void ProcessUnrenderedShape(bool bNewScene);
     206             : 
     207             :     void SetPickingMode(bool bPickingMode);
     208             : 
     209             :     sal_uInt32 GetPixelColorFromPoint(long nX, long nY);
     210             : 
     211             :     void ReleaseShapes();
     212             :     void ReleaseScreenTextShapes();
     213             :     void ReleaseTextTexture();
     214             :     void ReleaseScreenTextTexture();
     215             :     void StartClick(sal_uInt32 &selectID);
     216             :     void EndClick();
     217             :     void SetScroll();
     218             :     void SetScrollSpeed(float scrollSpeed);
     219             :     void SetScrollDistance(float scrollDistance);
     220             :     void SetSceneEdge(float minCoordX, float maxCoordX);
     221             :     glm::mat4 GetProjectionMatrix();
     222             :     glm::mat4 GetViewMatrix();
     223             :     glm::mat4 GetGlobalScaleMatrix();
     224             :     glm::mat4 GetDiffOfTwoCameras(const glm::vec3& rBeginPos, const glm::vec3& rEndPos, const glm::vec3& rBeginDirection, const glm::vec3& rEndDirection);
     225             :     glm::mat4 GetDiffOfTwoCameras(const glm::vec3& rEndPos, const glm::vec3& rEndDirection);
     226             :     void AddMatrixDiff(const glm::mat4& aMat);
     227             :     void ResetMatrixDiff();
     228             : private:
     229             :     void MoveModelf( const PosVecf3& trans, const PosVecf3& angle, const PosVecf3& scale);
     230             : 
     231             :     static void ClearBuffer();
     232             :     void RenderPolygon3DObject();
     233             :     void RenderLine3D(const Polygon3DInfo &polygon);
     234             :     void RenderPolygon3D(const Polygon3DInfo &polygon);
     235             :     void Init3DUniformBlock();
     236             :     void Update3DUniformBlock();
     237             :     void RenderExtrude3DObject();
     238             :     //add for text
     239             :     void RenderTextShape();
     240             :     void RenderScreenTextShape();
     241             :     void RenderExtrudeSurface(const Extrude3DInfo& extrude3D);
     242             :     void RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D);
     243             :     void RenderExtrudeMiddleSurface(const Extrude3DInfo& extrude3D);
     244             :     void RenderExtrudeBottomSurface(const Extrude3DInfo& extrude3D);
     245             :     void RenderExtrudeFlatSurface(const Extrude3DInfo& extrude3D, int surIndex);
     246             :     void AddVertexData(GLuint vertexBuf);
     247             :     void AddNormalData(GLuint normalBuf);
     248             :     void AddIndexData(GLuint indexBuf);
     249             :     void RenderNonRoundedBar(const Extrude3DInfo& extrude3D);
     250             :     static bool GetSimilarVertexIndex(PackedVertex & packed,
     251             :         std::map<PackedVertex,unsigned short> & VertexToOutIndex,
     252             :         unsigned short & result
     253             :         );
     254             :     static void SetVertex(PackedVertex &packed,
     255             :         std::map<PackedVertex,unsigned short> &VertexToOutIndex,
     256             :         std::vector<glm::vec3> &vertex,
     257             :         std::vector<glm::vec3> &normal,
     258             :         std::vector<unsigned short> &indeices);
     259             :     void CreateActualRoundedCube(float fRadius, int iSubDivY, int iSubDivZ, float width, float height, float depth);
     260             :     static int GenerateRoundCornerBar(std::vector<glm::vec3> &vertices, std::vector<glm::vec3> &normals, float fRadius, int iSubDivY,
     261             :                                int iSubDivZ, float width, float height, float depth);
     262             :     void CreateSceneBoxView();
     263             : 
     264             :     void ReleasePolygonShapes();
     265             :     void ReleaseExtrude3DShapes();
     266             :     void ReleaseTextShapes();
     267             :     void ReleaseBatchBarInfo();
     268             :     void GetBatchBarsInfo();
     269             :     void GetBatchTopAndFlatInfo(const Extrude3DInfo &extrude3D);
     270             :     void GetBatchMiddleInfo(const Extrude3DInfo &extrude3D);
     271             :     void InitBatch3DUniformBlock();
     272             :     void UpdateBatch3DUniformBlock();
     273             :     void RenderBatchBars(bool bNewScene);
     274             :     void CheckGLSLVersion();
     275             :     void RenderTextShapeBatch();
     276             :     void ReleaseTextShapesBatch();
     277             :     void CreateTextTextureSingle(const boost::shared_array<sal_uInt8> &bitmapBuf,
     278             :                            const ::Size& rSizePixels,
     279             :                            const glm::vec3& vTopLeft, const glm::vec3& vTopRight,
     280             :                            const glm::vec3& vBottomRight, const glm::vec3& vBottomLeft,
     281             :                            sal_uInt32 nUniqueId);
     282             :     void CreateTextTextureBatch(const boost::shared_array<sal_uInt8> &bitmapBuf,
     283             :                        const ::Size& rSizePixels,
     284             :                        const glm::vec3& vTopLeft, const glm::vec3& vTopRight,
     285             :                        const glm::vec3& vBottomRight, const glm::vec3& vBottomLeft,
     286             :                        sal_uInt32 nUniqueId);
     287             :     void SetHighLightBar(BatchBarInfo &barInfo);
     288             :     void DisableHighLightBar(BatchBarInfo &barInfo);
     289             :     void CalcScrollMoveMatrix(bool bNewScene);
     290             : private:
     291             : 
     292             :     struct ShaderResources
     293             :     {
     294             :         bool m_b330Support;
     295             :         bool m_bScrollFlag;
     296             :         // 3DProID
     297             :         GLint m_3DProID;
     298             :         GLint m_3DProjectionID;
     299             :         GLint m_3DViewID;
     300             :         GLint m_3DModelID;
     301             :         GLint m_3DNormalMatrixID;
     302             :         GLint m_3DVertexID;
     303             :         GLint m_3DNormalID;
     304             :         GLint m_3DMinCoordXID;
     305             :         GLint m_3DMaxCoordXID;
     306             :         GLint m_3DUndrawID;
     307             :         //300 verson;
     308             :         GLint m_3DMaterialAmbientID;
     309             :         GLint m_3DMaterialDiffuseID;
     310             :         GLint m_3DMaterialSpecularID;
     311             :         GLint m_3DMaterialColorID;
     312             :         GLint m_3DMaterialTwoSidesID;
     313             :         GLint m_3DMaterialShininessID;
     314             :         GLint m_3DLightColorID;
     315             :         GLint m_3DLightPosID;
     316             :         GLint m_3DLightPowerID;
     317             :         GLint m_3DLightNumID;
     318             :         GLint m_3DLightAmbientID;
     319             : 
     320             :         // TextProID
     321             :         GLint m_TextProID;
     322             :         GLint m_TextMatrixID;
     323             :         GLint m_TextVertexID;
     324             :         GLint m_TextTexCoordID;
     325             :         GLint m_TextTexID;
     326             : 
     327             :         // ScreenTextProID
     328             :         GLint m_ScreenTextProID;
     329             :         GLint m_ScreenTextVertexID;
     330             :         GLint m_ScreenTextTexCoordID;
     331             :         GLint m_ScreenTextTexID;
     332             :         GLint m_ScreenTextColorID;
     333             : 
     334             :         // CommonProID
     335             :         GLint m_CommonProID;
     336             :         GLint m_2DVertexID;
     337             :         GLint m_2DColorID;
     338             :         GLint m_MatrixID;
     339             : 
     340             :         // Batch render
     341             :         GLint m_3DBatchProID;
     342             :         GLint m_3DBatchProjectionID;
     343             :         GLint m_3DBatchViewID;
     344             :         GLint m_3DBatchModelID;
     345             :         GLint m_3DBatchNormalMatrixID;
     346             :         GLint m_3DBatchVertexID;
     347             :         GLint m_3DBatchNormalID;
     348             :         GLint m_3DBatchColorID;
     349             :         GLint m_3DBatchTransMatrixID;
     350             :         GLint m_3DBatchMinCoordXID;
     351             :         GLint m_3DBatchMaxCoordXID;
     352             :         GLint m_3DBatchUndrawID;
     353             : 
     354             :         //Batch render text
     355             :         bool mbTexBatchSupport;
     356             :         GLint m_BatchTextProID;
     357             :         GLint m_BatchTextMatrixID;
     358             :         GLint m_BatchTextVertexID;
     359             :         GLint m_BatchTextTexCoordID;
     360             :         GLint m_BatchTextTexID;
     361             : 
     362             :         ShaderResources();
     363             :         ~ShaderResources();
     364             : 
     365             :         void LoadShaders();
     366             :     };
     367             : 
     368             :     struct PickingShaderResources
     369             :     {
     370             :         // CommonProID
     371             :         GLint m_CommonProID;
     372             :         GLint m_2DVertexID;
     373             :         GLint m_2DColorID;
     374             :         GLint m_MatrixID;
     375             :         GLint m_ModelID;
     376             :         GLint m_MinCoordXID;
     377             :         GLint m_MaxCoordXID;
     378             :         PickingShaderResources();
     379             :         ~PickingShaderResources();
     380             : 
     381             :         void LoadShaders();
     382             :     };
     383             : 
     384             :     ShaderResources maResources;
     385             :     PickingShaderResources maPickingResources;
     386             : 
     387             :     // Model matrix : an identity matrix (model will be at the origin
     388             :     glm::mat4 m_Model;
     389             : 
     390             :     sal_Int32 m_iWidth;
     391             : 
     392             :     sal_Int32 m_iHeight;
     393             : 
     394             :     GlobalLights m_LightsInfo;
     395             : 
     396             :     CameraInfo m_CameraInfo;
     397             : 
     398             :     Polygon3DInfo m_Polygon3DInfo;
     399             : 
     400             :     std::vector <Polygon3DInfo> m_Polygon3DInfoList;
     401             : 
     402             :     glm::mat4 m_3DProjection;
     403             : 
     404             :     glm::mat4 m_3DView;
     405             : 
     406             :     glm::mat4 m_3DMVP;
     407             : 
     408             :     GLuint m_3DUBOBuffer;
     409             : #if 0
     410             :     GLint m_3DLightBlockIndex;
     411             : 
     412             :     GLint m_3DMaterialBlockIndex;
     413             : #endif
     414             :     GLint m_3DActualSizeLight;
     415             : 
     416             :     GLuint m_NormalBuffer;
     417             : 
     418             :     GLuint m_VertexBuffer;
     419             : 
     420             :     Extrude3DInfo m_Extrude3DInfo;
     421             : 
     422             :     std::vector <Extrude3DInfo> m_Extrude3DList;
     423             : 
     424             :     GLuint m_CubeVertexBuf;
     425             : 
     426             :     GLuint m_CubeElementBuf;
     427             : 
     428             :     GLuint m_CubeNormalBuf;
     429             : 
     430             :     GLuint m_BoundBox;
     431             :     GLuint m_BoundBoxNormal;
     432             :      // add for text
     433             :     std::vector <TextInfo> m_TextInfoList;
     434             :     std::vector <TextInfo> m_ScreenTextInfoList;
     435             :     GLuint m_TextTexCoordBuf;
     436             :     GLuint m_TextTexCoordBufBatch;
     437             : 
     438             :     std::vector<glm::vec3> m_Vertices;
     439             : 
     440             :     std::vector<glm::vec3> m_Normals;
     441             : 
     442             :     std::vector<unsigned short> m_Indices;
     443             : 
     444             :     RoundBarMesh m_RoundBarMesh;
     445             : 
     446             :     GLuint m_RenderVertexBuf;
     447             : 
     448             :     GLuint m_RenderTexCoordBuf;
     449             : 
     450             :     float m_fViewAngle;
     451             : 
     452             :     bool mbPickingMode;
     453             : 
     454             :     GLuint mnPickingFbo;
     455             :     GLuint mnPickingRboDepth;
     456             :     GLuint mnPickingRboColor;
     457             : 
     458             :     BatchBarInfo m_BarSurface[3];
     459             :     GLuint m_BatchModelMatrixBuf;
     460             :     GLuint m_BatchNormalMatrixBuf;
     461             :     GLuint m_BatchColorBuf;
     462             :     MaterialParameters m_Batchmaterial;
     463             :     GLuint m_Batch3DUBOBuffer;
     464             :     GLint m_Batch3DActualSizeLight;
     465             : 
     466             :     glm::mat4 m_GlobalScaleMatrix;
     467             :     TextInfoBatch m_TextInfoBatch;
     468             :     //for 3.0 version
     469             :     int m_iLightNum;
     470             :     glm::vec4 m_Ambient;
     471             :     glm::vec4 m_LightColor[MAX_LIGHT_NUM];
     472             :     glm::vec4 m_PositionWorldspace[MAX_LIGHT_NUM];
     473             :     float m_fLightPower[MAX_LIGHT_NUM];
     474             :     //for 3.0 end
     475             :     std::vector<GLuint> m_Texturelist;
     476             :     std::vector<GLuint> m_ScreenTexturelist;
     477             :     bool m_bHighLighting;
     478             :     sal_uInt32 m_uiSelectID;
     479             :     float m_fScrollSpeed;
     480             :     float m_fScrollDistance;
     481             :     float m_fMinCoordX;
     482             :     float m_fMaxCoordX;
     483             :     float m_fCurDistance;
     484             :     glm::mat4 m_ScrollMoveMatrix;
     485             :     bool m_bUndrawFlag;
     486             :     glm::mat4 m_matDiff;
     487             : };
     488             : 
     489             : }
     490             : 
     491             : }
     492             : 
     493             : #endif
     494             : 
     495             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11