summaryrefslogtreecommitdiff
path: root/chart2
diff options
context:
space:
mode:
authorZolnai Tamás <tamas.zolnai@collabora.com>2014-03-13 14:22:59 +0100
committerZolnai Tamás <tamas.zolnai@collabora.com>2014-03-14 19:59:21 +0100
commit04b70c682e2cdc52b144961a83d05fd203de6884 (patch)
tree7a88b6307b0d229575accdedebb5ee6a6e002ff0 /chart2
parent84f4de3b65cd0f861e80c69b773004f28f9f8d9f (diff)
Move OpenGLRender to vcl
Change-Id: I6383ae3f94fc18aec92596b9d857d3fde5869dd6
Diffstat (limited to 'chart2')
-rw-r--r--chart2/Library_chartopengl.mk2
-rw-r--r--chart2/Module_chart2.mk1
-rw-r--r--chart2/Package_opengl.mk25
-rw-r--r--chart2/opengl/backgroundFragmentShader.glsl17
-rw-r--r--chart2/opengl/backgroundVertexShader.glsl21
-rw-r--r--chart2/opengl/commonFragmentShader.glsl17
-rw-r--r--chart2/opengl/commonVertexShader.glsl21
-rw-r--r--chart2/opengl/debugFragmentShader.glsl17
-rw-r--r--chart2/opengl/debugVertexShader.glsl19
-rw-r--r--chart2/opengl/symbolFragmentShader.glsl101
-rw-r--r--chart2/opengl/symbolVertexShader.glsl23
-rw-r--r--chart2/opengl/textFragmentShader.glsl17
-rw-r--r--chart2/opengl/textVertexShader.glsl20
-rw-r--r--chart2/source/view/inc/DummyXShape.hxx2
-rwxr-xr-xchart2/source/view/main/OpenGLRender.cxx1688
-rwxr-xr-xchart2/source/view/main/OpenGLRender.hxx298
16 files changed, 2 insertions, 2287 deletions
diff --git a/chart2/Library_chartopengl.mk b/chart2/Library_chartopengl.mk
index 0aa6340aa140..db3dc299b1c2 100644
--- a/chart2/Library_chartopengl.mk
+++ b/chart2/Library_chartopengl.mk
@@ -47,13 +47,13 @@ $(eval $(call gb_Library_use_libraries,chartopengl,\
ucbhelper \
utl \
vcl \
+ vclopengl \
$(gb_UWINAPI) \
))
$(eval $(call gb_Library_add_exception_objects,chartopengl,\
chart2/source/view/main/OpenglShapeFactory \
chart2/source/view/main/DummyXShape \
- chart2/source/view/main/OpenGLRender \
))
ifeq ($(strip $(OS)),WNT)
diff --git a/chart2/Module_chart2.mk b/chart2/Module_chart2.mk
index 611e699705a9..6c4d193dd2dd 100644
--- a/chart2/Module_chart2.mk
+++ b/chart2/Module_chart2.mk
@@ -14,7 +14,6 @@ $(eval $(call gb_Module_add_targets,chart2,\
Library_chartcore \
$(if $(filter FREEBSD LINUX MACOSX WNT,$(OS)), \
Library_chartopengl \
- Package_opengl \
) \
))
diff --git a/chart2/Package_opengl.mk b/chart2/Package_opengl.mk
deleted file mode 100644
index ef33ebbbff44..000000000000
--- a/chart2/Package_opengl.mk
+++ /dev/null
@@ -1,25 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-$(eval $(call gb_Package_Package,chart2_opengl_shader,$(SRCDIR)/chart2/opengl))
-
-$(eval $(call gb_Package_add_files,chart2_opengl_shader,$(LIBO_BIN_FOLDER)/opengl,\
- backgroundFragmentShader.glsl \
- backgroundVertexShader.glsl \
- commonFragmentShader.glsl \
- commonVertexShader.glsl \
- debugFragmentShader.glsl \
- debugVertexShader.glsl \
- symbolFragmentShader.glsl \
- symbolVertexShader.glsl \
- textFragmentShader.glsl \
- textVertexShader.glsl \
-))
-
-# vim: set noet sw=4 ts=4:
diff --git a/chart2/opengl/backgroundFragmentShader.glsl b/chart2/opengl/backgroundFragmentShader.glsl
deleted file mode 100644
index 805789e731ed..000000000000
--- a/chart2/opengl/backgroundFragmentShader.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-varying vec4 fragmentColor;
-
-void main()
-{
- gl_FragColor = fragmentColor;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/opengl/backgroundVertexShader.glsl b/chart2/opengl/backgroundVertexShader.glsl
deleted file mode 100644
index 6d9d6c21f3c9..000000000000
--- a/chart2/opengl/backgroundVertexShader.glsl
+++ /dev/null
@@ -1,21 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-attribute vec3 vPosition;
-uniform mat4 MVP;
-attribute vec4 vColor;
-varying vec4 fragmentColor;
-
-void main()
-{
- gl_Position = MVP * vec4(vPosition, 1);
- fragmentColor = vColor;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/opengl/commonFragmentShader.glsl b/chart2/opengl/commonFragmentShader.glsl
deleted file mode 100644
index 805789e731ed..000000000000
--- a/chart2/opengl/commonFragmentShader.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-varying vec4 fragmentColor;
-
-void main()
-{
- gl_FragColor = fragmentColor;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/opengl/commonVertexShader.glsl b/chart2/opengl/commonVertexShader.glsl
deleted file mode 100644
index f32e3fd38a91..000000000000
--- a/chart2/opengl/commonVertexShader.glsl
+++ /dev/null
@@ -1,21 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-attribute vec3 vPosition;
-uniform mat4 MVP;
-uniform vec4 vColor;
-varying vec4 fragmentColor;
-
-void main()
-{
- gl_Position = MVP * vec4(vPosition, 1);
- fragmentColor = vColor;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/opengl/debugFragmentShader.glsl b/chart2/opengl/debugFragmentShader.glsl
deleted file mode 100644
index d36c4f4d46e4..000000000000
--- a/chart2/opengl/debugFragmentShader.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-varying vec4 fragmentColor;
-
-void main()
-{
- gl_FragColor = vec4(1.0, 1.0, 0.0, 0.5);
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/opengl/debugVertexShader.glsl b/chart2/opengl/debugVertexShader.glsl
deleted file mode 100644
index 762de3121419..000000000000
--- a/chart2/opengl/debugVertexShader.glsl
+++ /dev/null
@@ -1,19 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-attribute vec3 vPosition;
-uniform vec4 vColor;
-varying vec4 fragmentColor;
-
-void main()
-{
- gl_Position = vec4(vPosition, 1);
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/opengl/symbolFragmentShader.glsl b/chart2/opengl/symbolFragmentShader.glsl
deleted file mode 100644
index 3ac6b0305285..000000000000
--- a/chart2/opengl/symbolFragmentShader.glsl
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#version 120
-
-varying vec4 fragmentColor;
-uniform int shape;
-
-void main()
-{
- vec2 p = gl_PointCoord * 2.0 - vec2(1.0); // (0,0) in the center
- if(shape == 0)
- {
- }
- else if(shape == 1) //diamon
- {
- if (abs(p.x) + abs(p.y) > 1)
- discard;
- }
- else if(shape == 2) // arrow
- {
- if(p.y < 0 && (abs(p.x) + abs(p.y)) > 1)
- discard;
- else if(p.y > 0 && abs(p.x) > 0.5)
- discard;
- }
- else if(shape == 3) //arrow up
- {
- if(p.y > 0 && (abs(p.x) + abs(p.y)) > 1)
- discard;
- else if(p.y < 0 && abs(p.x) > 0.5)
- discard;
- }
- else if(shape == 4) // arrow right
- {
- if(p.x > 0 && (abs(p.x) + abs(p.y)) > 1)
- discard;
- else if(p.x < 0 && abs(p.y) > 0.5)
- discard;
- }
- else if(shape == 5) // arrow left
- {
- if(p.x < 0 && (abs(p.x) + abs(p.y)) > 1)
- discard;
- else if(p.x > 0 && abs(p.y) > 0.5)
- discard;
- }
- else if(shape == 6) // hour glass
- {
- if(abs(p.x) < abs(p.y))
- discard;
- }
- else if(shape == 7) // bow tie
- {
- if(abs(p.y) < abs(p.x))
- discard;
- }
- else if(shape == 8) // circle
- {
- if(dot(p.x, p.y) > 1)
- discard;
- }
- else if(shape == 9) // star
- {
- if(sqrt(abs(p.x))+sqrt(abs(p.y)) > 1)
- discard;
- }
- else if(shape == 10) // X
- {
- if(abs(abs(p.x) - abs(p.y)) > 0.2)
- discard;
- }
- else if(shape == 11) // Plus
- {
- if(abs(p.x) > 0.2 && abs(p.y) > 0.2)
- discard;
- }
- else if(shape == 12) // asterisk
- {
- }
- else if(shape == 13) // horizontal bar
- {
- if(abs(p.y) > 0.2)
- discard;
- }
- else if(shape == 14) // vertical bar
- {
- if(abs(p.x) > 0.2)
- discard;
- }
-
- gl_FragColor = fragmentColor;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/opengl/symbolVertexShader.glsl b/chart2/opengl/symbolVertexShader.glsl
deleted file mode 100644
index 3cf9f41ef21b..000000000000
--- a/chart2/opengl/symbolVertexShader.glsl
+++ /dev/null
@@ -1,23 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#version 120
-
-attribute vec3 vPosition;
-uniform mat4 MVP;
-uniform vec4 vColor;
-varying vec4 fragmentColor;
-
-void main()
-{
- gl_Position = MVP * vec4(vPosition, 1);
- fragmentColor = vColor;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/opengl/textFragmentShader.glsl b/chart2/opengl/textFragmentShader.glsl
deleted file mode 100644
index ef8d44d6949d..000000000000
--- a/chart2/opengl/textFragmentShader.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-uniform sampler2D TextTex;
-varying vec2 vTexCoord;
-void main()
-{
- gl_FragColor = vec4(texture2D(TextTex, vTexCoord).rgba);
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/opengl/textVertexShader.glsl b/chart2/opengl/textVertexShader.glsl
deleted file mode 100644
index a805229eb07a..000000000000
--- a/chart2/opengl/textVertexShader.glsl
+++ /dev/null
@@ -1,20 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-attribute vec3 vPosition;
-uniform mat4 MVP;
-attribute vec2 texCoord;
-varying vec2 vTexCoord;
-void main()
-{
- gl_Position = MVP * vec4(vPosition, 1);
- vTexCoord = texCoord;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/inc/DummyXShape.hxx b/chart2/source/view/inc/DummyXShape.hxx
index cf19ff577dd6..553b4e1c20fa 100644
--- a/chart2/source/view/inc/DummyXShape.hxx
+++ b/chart2/source/view/inc/DummyXShape.hxx
@@ -12,7 +12,7 @@
#include <cppuhelper/implbase6.hxx>
-#include "OpenGLRender.hxx"
+#include <vcl/OpenGLRender.hxx>
#include <com/sun/star/drawing/XShape.hpp>
#include <com/sun/star/drawing/XShapes.hpp>
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
deleted file mode 100755
index 3b81db2845be..000000000000
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ /dev/null
@@ -1,1688 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#include <GL/glew.h>
-#include <vector>
-#include "OpenGLRender.hxx"
-#include <vcl/bmpacc.hxx>
-#include <vcl/graph.hxx>
-#include <com/sun/star/awt/XBitmap.hpp>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/graphic/XGraphic.hpp>
-#include <comphelper/InlineContainer.hxx>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/drawing/CircleKind.hpp>
-#include <com/sun/star/drawing/DoubleSequence.hpp>
-#include <com/sun/star/drawing/FlagSequence.hpp>
-#include <com/sun/star/drawing/FillStyle.hpp>
-#include <com/sun/star/drawing/LineStyle.hpp>
-#include <com/sun/star/drawing/NormalsKind.hpp>
-#include <com/sun/star/drawing/PointSequence.hpp>
-#include <com/sun/star/drawing/PolygonKind.hpp>
-#include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
-#include <com/sun/star/drawing/ProjectionMode.hpp>
-#include <com/sun/star/drawing/ShadeMode.hpp>
-#include <com/sun/star/drawing/TextFitToSizeType.hpp>
-#include <com/sun/star/drawing/TextureProjectionMode.hpp>
-#include <com/sun/star/text/XText.hpp>
-#include <com/sun/star/uno/Any.hxx>
-#include <editeng/unoprnms.hxx>
-#include <vcl/virdev.hxx>
-#include <vcl/dibtools.hxx>
-
-#include <osl/file.hxx>
-#include <rtl/bootstrap.hxx>
-#include <config_folders.h>
-
-#include <boost/scoped_array.hpp>
-
-using namespace com::sun::star;
-
-using namespace std;
-
-#define DEBUG_PNG 0
-#if RENDER_TO_FILE
-#define BMP_HEADER_LEN 54
-#endif
-
-#if DEBUG_PNG
-#include <vcl/pngwrite.hxx>
-#endif
-
-#define GL_PI 3.14159f
-
-#if defined( _WIN32 )
-#define WGL_SAMPLE_BUFFERS_ARB 0x2041
-#define WGL_SAMPLES_ARB 0x2042
-#endif
-
-#define Z_STEP 0.001f
-
-int static checkGLError(const char *file, int line)
-{
- GLenum glErr;
- int retCode = 0;
- glErr = glGetError();
- while (glErr != GL_NO_ERROR)
- {
- const GLubyte* sError = gluErrorString(glErr);
-
- if (sError)
- SAL_WARN("chart2.opengl", "GL Error #" << glErr << "(" << gluErrorString(glErr) << ") " << " in File " << file << " at line: " << line);
- else
- SAL_WARN("chart2.opengl", "GL Error #" << glErr << " (no message available)" << " in File " << file << " at line: " << line);
-
- retCode = -1;
- return retCode;
- }
- return retCode;
-}
-
-static bool bGlewInit = false;
-
-#define CHECK_GL_ERROR() checkGLError(__FILE__, __LINE__)
-
-#define CHECK_GL_FRAME_BUFFER_STATUS() \
- status = glCheckFramebufferStatus(GL_FRAMEBUFFER);\
- if( status != GL_FRAMEBUFFER_COMPLETE ) {\
- SAL_WARN("chart2.opengl", "OpenGL error: " << status );\
- return -1;\
- }
-
-namespace {
-
-OUString getShaderFolder()
-{
- OUString aUrl("$BRAND_BASE_DIR/" LIBO_ETC_FOLDER);
- rtl::Bootstrap::expandMacros(aUrl);
-
- return aUrl + "/opengl/";
-}
-
-OUString maShaderFolder = getShaderFolder();
-
-OString loadShader(const OUString& rFilename)
-{
- OUString aFileURL = maShaderFolder + rFilename +".glsl";
- osl::File aFile(aFileURL);
- if(aFile.open(osl_File_OpenFlag_Read) == osl::FileBase::E_None)
- {
- sal_uInt64 nSize = 0;
- aFile.getSize(nSize);
- char* content = new char[nSize+1];
- sal_uInt64 nBytesRead = 0;
- aFile.read(content, nSize, nBytesRead);
- if(nSize != nBytesRead)
- assert(false);
-
- content[nSize] = 0;
- return OString(content);
- }
- else
- {
- SAL_WARN("chart2.opengl", "could not load the file: " << aFileURL);
- }
-
- return OString();
-}
-
-}
-
-GLint OpenGLRender::LoadShaders(const OUString& rVertexShaderName,const OUString& rFragmentShaderName)
-{
- // Create the shaders
- GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
- GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
-
- GLint Result = GL_FALSE;
- int InfoLogLength;
-
- // Compile Vertex Shader
- OString aVertexShaderSource = loadShader(rVertexShaderName);
- char const * VertexSourcePointer = aVertexShaderSource.getStr();
- glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
- glCompileShader(VertexShaderID);
-
- // Check Vertex Shader
- glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
- if ( !Result )
- {
- glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
- if ( InfoLogLength > 0 )
- {
- std::vector<char> VertexShaderErrorMessage(InfoLogLength+1);
- glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
- VertexShaderErrorMessage.push_back('\0');
- SAL_WARN("chart2.opengl", "vertex shader compile failed : " << &VertexShaderErrorMessage[0]);
- }
- else
- SAL_WARN("chart2.opengl", "vertex shader compile failed without error log");
-
- return 0;
- }
-
- // Compile Fragment Shader
- OString aFragmentShaderSource = loadShader(rFragmentShaderName);
- char const * FragmentSourcePointer = aFragmentShaderSource.getStr();
- glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL);
- glCompileShader(FragmentShaderID);
-
- // Check Fragment Shader
- glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
- if ( !Result )
- {
- glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
- if ( InfoLogLength > 0 )
- {
- std::vector<char> FragmentShaderErrorMessage(InfoLogLength+1);
- glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
- FragmentShaderErrorMessage.push_back('\0');
- SAL_WARN("chart2.opengl", "fragment shader compile failed : " << &FragmentShaderErrorMessage[0]);
- }
- else
- SAL_WARN("chart2.opengl", "fragment shader compile failed without error log");
-
-
- return 0;
- }
-
- // Link the program
- GLint ProgramID = glCreateProgram();
- glAttachShader(ProgramID, VertexShaderID);
- glAttachShader(ProgramID, FragmentShaderID);
- glLinkProgram(ProgramID);
-
- // Check the program
- glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
- if ( !Result )
- {
- glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
- if ( InfoLogLength > 0 )
- {
- std::vector<char> ProgramErrorMessage(InfoLogLength+1);
- glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
- ProgramErrorMessage.push_back('\0');
- SAL_WARN("chart2.opengl", "Shader Program failed : " << &ProgramErrorMessage[0]);
- }
- else
- SAL_WARN("chart2.opengl", "shader program link failed without error log");
-
- return 0;
- }
-
- glDeleteShader(VertexShaderID);
- glDeleteShader(FragmentShaderID);
-
- return ProgramID;
-}
-
-namespace {
-
-GLfloat texCoords[] = {
- 0.0f, 0.0f,
- 1.0f, 0.0f,
- 1.0f, 1.0f,
- 0.0f, 1.0f
-};
-
-}
-
-int OpenGLRender::InitOpenGL(GLWindow aWindow)
-{
- glWin = aWindow;
- if(!bGlewInit)
- {
- glewExperimental = GL_TRUE;
- if (glewInit() != GLEW_OK)
- {
- SAL_WARN("chart2.opengl", "Failed to initialize GLEW");
- return -1;
- }
- else
- bGlewInit = true;
- }
-
- // These guys don't just check support but setup the vtables.
- if (glewIsSupported("framebuffer_object") != GLEW_OK)
- {
- SAL_WARN("chart2.opengl", "GL stack has no framebuffer support");
- return -1;
- }
-
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- // Enable depth test
- glEnable(GL_DEPTH_TEST);
- // Accept fragment if it closer to the camera than the former one
- glDepthFunc(GL_LESS);
- glEnable(GL_POINT_SMOOTH);
- glEnable(GL_LINE_SMOOTH);
- glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
- glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glClearColor (1.0, 1.0, 1.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
- glClearDepth(1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- //Init the Projection matrix
- m_Projection = glm::ortho(0.f, float(m_iWidth), 0.f, float(m_iHeight), -1.f, 1.f);
- m_View = glm::lookAt(glm::vec3(0,0,1), // Camera is at (4,3,-3), in World Space
- glm::vec3(0,0,0), // and looks at the origin
- glm::vec3(0,1,0) // Head is up (set to 0,-1,0 to look upside-down)
- );
- m_MVP = m_Projection * m_View * m_Model;
- glGenBuffers(1, &m_VertexBuffer);
- glGenBuffers(1, &m_ColorBuffer);
-
- CHECK_GL_ERROR();
-
- m_CommonProID = LoadShaders("commonVertexShader", "commonFragmentShader");
- m_MatrixID = glGetUniformLocation(m_CommonProID, "MVP");
- m_2DVertexID = glGetAttribLocation(m_CommonProID, "vPosition");
- m_2DColorID = glGetUniformLocation(m_CommonProID, "vColor");
- CHECK_GL_ERROR();
-
-#if DEBUG_POSITIONING
- m_DebugProID = LoadShaders("debugVertexShader", "debugFragmentShader");
- m_DebugVertexID = glGetAttribLocation(m_DebugProID, "vPosition");
- CHECK_GL_ERROR();
-#endif
-
- m_BackgroundProID = LoadShaders("backgroundVertexShader", "backgroundFragmentShader");
- m_BackgroundMatrixID = glGetUniformLocation(m_BackgroundProID, "MVP");
- m_BackgroundVertexID = glGetAttribLocation(m_BackgroundProID, "vPosition");
- m_BackgroundColorID = glGetAttribLocation(m_BackgroundProID, "vColor");
-
- CHECK_GL_ERROR();
-
- m_SymbolProID = LoadShaders("symbolVertexShader", "symbolFragmentShader");
- m_SymbolVertexID = glGetAttribLocation(m_SymbolProID, "vPosition");
- m_SymbolMatrixID = glGetUniformLocation(m_SymbolProID, "MVP");
- m_SymbolColorID = glGetUniformLocation(m_SymbolProID, "vColor");
- m_SymbolShapeID = glGetUniformLocation(m_SymbolProID, "shape");
-
- CHECK_GL_ERROR();
-
- m_TextProID = LoadShaders("textVertexShader", "textFragmentShader");
- m_TextMatrixID = glGetUniformLocation(m_TextProID, "MVP");
- m_TextVertexID = glGetAttribLocation(m_TextProID, "vPosition");
- m_TextTexCoordID = glGetAttribLocation(m_TextProID, "texCoord");
- m_TextTexID = glGetUniformLocation(m_TextProID, "TextTex");
-
- CHECK_GL_ERROR();
-
- glGenBuffers(1, &m_TextTexCoordBuf);
- glBindBuffer(GL_ARRAY_BUFFER, m_TextTexCoordBuf);
- glBufferData(GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
-
-#if defined( WNT )
- SwapBuffers(glWin.hDC);
-#elif defined( MACOSX )
-
-#elif defined( UNX )
- glXSwapBuffers(glWin.dpy, glWin.win);
-#endif
- glFlush();
- glEnable(GL_LIGHTING);
- GLfloat light_direction[] = { 0.0 , 0.0 , 1.0 };
- GLfloat materialDiffuse[] = { 1.0 , 1.0 , 1.0 , 1.0};
- glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_direction);
- glMaterialfv(GL_FRONT,GL_DIFFUSE,materialDiffuse);
- glEnable(GL_LIGHT0);
- glEnable(GL_NORMALIZE);
- return 0;
-}
-
-BitmapEx OpenGLRender::GetAsBitmap()
-{
- boost::scoped_array<sal_uInt8> buf(new sal_uInt8[m_iWidth * m_iHeight * 4]);
- glReadPixels(0, 0, m_iWidth, m_iHeight, GL_BGRA, GL_UNSIGNED_BYTE, buf.get());
-
- Bitmap aBitmap( Size(m_iWidth, m_iHeight), 24 );
- AlphaMask aAlpha( Size(m_iWidth, m_iHeight) );
-
- {
- Bitmap::ScopedWriteAccess pWriteAccess( aBitmap );
- AlphaMask::ScopedWriteAccess pAlphaWriteAccess( aAlpha );
-
- size_t nCurPos = 0;
- for( int y = 0; y < m_iHeight; ++y)
- {
- Scanline pScan = pWriteAccess->GetScanline(y);
- Scanline pAlphaScan = pAlphaWriteAccess->GetScanline(y);
- for( int x = 0; x < m_iWidth; ++x )
- {
- *pScan++ = buf[nCurPos];
- *pScan++ = buf[nCurPos+1];
- *pScan++ = buf[nCurPos+2];
-
- nCurPos += 3;
- *pAlphaScan++ = static_cast<sal_uInt8>( 255 - buf[nCurPos++] );
- }
- }
- }
-
- BitmapEx aBmp(aBitmap, aAlpha);
-
-#if DEBUG_PNG // debug PNG writing
- static int nIdx = 0;
- OUString aName = OUString( "file:///home/moggi/Documents/work/" ) + OUString::number( nIdx++ ) + ".png";
- try {
- vcl::PNGWriter aWriter( aBmp );
- SvFileStream sOutput( aName, STREAM_WRITE );
- aWriter.Write( sOutput );
- sOutput.Close();
- } catch (...) {
- SAL_WARN("chart2.opengl", "Error writing png to " << aName);
- }
-#endif
-
- return aBmp;
-}
-
-int OpenGLRender::SetLine2DShapePoint(float x, float y, int listLength)
-{
- if (m_Line2DPointList.empty())
- {
- m_Line2DPointList.reserve(listLength*3);
- }
- float actualX = (x / OPENGL_SCALE_VALUE);
- float actualY = (y / OPENGL_SCALE_VALUE);
- m_Line2DPointList.push_back(actualX);
- m_Line2DPointList.push_back(actualY);
- m_Line2DPointList.push_back(m_fZStep);
-
- if (m_Line2DPointList.size() == size_t(listLength * 3))
- {
- m_Line2DShapePointList.push_back(m_Line2DPointList);
- m_Line2DPointList.clear();
- }
- return 0;
-}
-
-int OpenGLRender::RenderLine2FBO(int)
-{
- CHECK_GL_ERROR();
- glLineWidth(m_fLineWidth);
- size_t listNum = m_Line2DShapePointList.size();
- PosVecf3 trans = {0.0f, 0.0f, 0.0f};
- PosVecf3 angle = {0.0f, 0.0f, 0.0f};
- PosVecf3 scale = {1.0f, 1.0f, 1.0f};
- MoveModelf(trans, angle, scale);
- m_MVP = m_Projection * m_View * m_Model;
- for (size_t i = 0; i < listNum; i++)
- {
- Line2DPointList &pointList = m_Line2DShapePointList.front();
- //fill vertex buffer
- glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
- CHECK_GL_ERROR();
- glBufferData(GL_ARRAY_BUFFER, pointList.size() * sizeof(float), &pointList[0], GL_STATIC_DRAW);
- CHECK_GL_ERROR();
- // Use our shader
- glUseProgram(m_CommonProID);
- CHECK_GL_ERROR();
-
- glUniform4fv(m_2DColorID, 1, &m_2DColor[0]);
- CHECK_GL_ERROR();
- glUniformMatrix4fv(m_MatrixID, 1, GL_FALSE, &m_MVP[0][0]);
- //CHECK_GL_ERROR();
-
- // 1rst attribute buffer : vertices
- CHECK_GL_ERROR();
- glVertexAttribPointer(
- m_2DVertexID,
- 3, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- glEnableVertexAttribArray(m_2DVertexID);
- glDrawArrays(GL_LINE_STRIP, 0, pointList.size()/3); // 12*3 indices starting at 0 -> 12 triangles
- CHECK_GL_ERROR();
- glUseProgram(0);
- glDisableVertexAttribArray(m_2DVertexID);
- CHECK_GL_ERROR();
- m_Line2DShapePointList.pop_front();
- }
- GLenum status;
- CHECK_GL_ERROR();
- CHECK_GL_FRAME_BUFFER_STATUS();
- m_fZStep += Z_STEP;
- return 0;
-}
-
-#if DEBUG_POSITIONING
-void OpenGLRender::renderDebug()
-{
- CHECK_GL_ERROR();
-
- GLfloat vertices[4][3] = {
- {-0.9, -0.9, 0 },
- {-0.6, -0.2, 0 },
- {0.3, 0.3, 0 },
- {0.9, 0.9, 0 } };
-
- glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
- CHECK_GL_ERROR();
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
- CHECK_GL_ERROR();
- glUseProgram(m_DebugProID);
- CHECK_GL_ERROR();
- glVertexAttribPointer(m_DebugVertexID, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
- CHECK_GL_ERROR();
- glEnableVertexAttribArray(m_DebugVertexID);
-
- glDrawArrays(GL_LINE_STRIP, 0, 3);
- CHECK_GL_ERROR();
- glDisableVertexAttribArray(m_DebugVertexID);
-
- CHECK_GL_ERROR();
-}
-#endif
-
-void OpenGLRender::prepareToRender()
-{
- glViewport(0, 0, m_iWidth, m_iHeight);
- if (!m_FboID)
- {
- // create a texture object
- CreateTextureObj(m_iWidth, m_iHeight);
- //create render buffer object
- CreateRenderObj(m_iWidth, m_iHeight);
- //create fbo
- CreateFrameBufferObj();
- if (mbArbMultisampleSupported)
- {
- CreateMultiSampleFrameBufObj();
- }
- }
- //bind fbo
- if (mbArbMultisampleSupported)
- {
- glBindFramebuffer(GL_FRAMEBUFFER,m_frameBufferMS);
- }
- else
- {
- glBindFramebuffer(GL_FRAMEBUFFER, m_FboID);
- }
-
- // Clear the screen
- glClearDepth(1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- m_fZStep = 0;
-}
-
-void OpenGLRender::renderToBitmap()
-{
- if (mbArbMultisampleSupported)
- {
- GLenum status;
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- glBindFramebuffer(GL_READ_FRAMEBUFFER, m_frameBufferMS);
- status = glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
- if (status != GL_FRAMEBUFFER_COMPLETE)
- {
- SAL_INFO("chart2.opengl", "The frame buffer status is not complete!");
- }
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FboID);
- status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
- if (status != GL_FRAMEBUFFER_COMPLETE)
- {
- SAL_INFO("chart2.opengl", "The frame buffer status is not complete!");
- }
- glBlitFramebuffer(0, 0 ,m_iWidth, m_iHeight, 0, 0,m_iWidth ,m_iHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
- glBindFramebuffer(GL_READ_FRAMEBUFFER,0);
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0);
- }
- glBindFramebuffer(GL_FRAMEBUFFER, m_FboID);
-
-#if RENDER_TO_FILE
- char fileName[256] = {0};
- sprintf(fileName, "D:\\shaderout_%d_%d.bmp", m_iWidth, m_iHeight);
- sal_uInt8 *buf = (sal_uInt8 *)malloc(m_iWidth * m_iHeight * 3 + BMP_HEADER_LEN);
- CreateBMPHeader(buf, m_iWidth, m_iHeight);
- glReadPixels(0, 0, m_iWidth, m_iHeight, GL_BGR, GL_UNSIGNED_BYTE, buf + BMP_HEADER_LEN);
- FILE *pfile = fopen(fileName,"wb");
- fwrite(buf,m_iWidth * m_iHeight * 3 + BMP_HEADER_LEN, 1, pfile);
- free(buf);
- fclose(pfile);
-#else
- Graphic aGraphic( GetAsBitmap() );
- uno::Reference< awt::XBitmap> xBmp( aGraphic.GetXGraphic(), uno::UNO_QUERY );
- uno::Reference < beans::XPropertySet > xPropSet ( mxRenderTarget, uno::UNO_QUERY );
- xPropSet->setPropertyValue("Graphic", uno::makeAny(aGraphic.GetXGraphic()));
- mxRenderTarget->setSize(awt::Size(m_iWidth*OPENGL_SCALE_VALUE, m_iHeight*OPENGL_SCALE_VALUE));
- mxRenderTarget->setPosition(awt::Point(0,0));
-#endif
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
-#if defined( WNT )
- SwapBuffers(glWin.hDC);
-#elif defined( MACOSX )
-
-#elif defined( UNX )
- glXSwapBuffers(glWin.dpy, glWin.win);
-#endif
- glFlush();
-}
-
-int OpenGLRender::CreateTextureObj(int width, int height)
-{
- glGenTextures(1, &m_TextureObj);
- glBindTexture(GL_TEXTURE_2D, m_TextureObj);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
- CHECK_GL_ERROR();
- glBindTexture(GL_TEXTURE_2D, 0);
- return 0;
-}
-
-int OpenGLRender::CreateRenderObj(int width, int height)
-{
- glGenRenderbuffers(1, &m_RboID);
- CHECK_GL_ERROR();
- glBindRenderbuffer(GL_RENDERBUFFER, m_RboID);
- CHECK_GL_ERROR();
- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
- CHECK_GL_ERROR();
- glBindRenderbuffer(GL_RENDERBUFFER, 0);
- CHECK_GL_ERROR();
- return 0;
-}
-
-int OpenGLRender::MoveModelf(PosVecf3 trans, PosVecf3 angle, PosVecf3 scale)
-{
- glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z));
- glm::mat4 aScaleMatrix = glm::scale(glm::vec3(scale.x, scale.y, scale.z));
- glm::mat4 aRotationMatrix = glm::eulerAngleYXZ(angle.y, angle.x, angle.z);
- m_Model = aTranslationMatrix * aRotationMatrix * aScaleMatrix;
- return 0;
-}
-
-int OpenGLRender::CreateFrameBufferObj()
-{
- GLenum status;
- // create a framebuffer object, you need to delete them when program exits.
- glGenFramebuffers(1, &m_FboID);
- CHECK_GL_FRAME_BUFFER_STATUS();
- glBindFramebuffer(GL_FRAMEBUFFER, m_FboID);
- glBindTexture(GL_TEXTURE_2D, m_TextureObj);
- // attach a texture to FBO color attachement point
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TextureObj, 0);
- CHECK_GL_FRAME_BUFFER_STATUS();
- glBindTexture(GL_TEXTURE_2D, 0);
- // attach a renderbuffer to depth attachment point
- glBindRenderbuffer(GL_RENDERBUFFER, m_RboID);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_RboID);
- CHECK_GL_FRAME_BUFFER_STATUS();
- glBindRenderbuffer(GL_RENDERBUFFER, 0);
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
- return 0;
-}
-
-void OpenGLRender::Release()
-{
- glDeleteBuffers(1, &m_VertexBuffer);
- glDeleteBuffers(1, &m_ColorBuffer);
- glDeleteBuffers(1, &m_TextTexCoordBuf);
- glDeleteProgram(m_CommonProID);
- glDeleteProgram(m_TextProID);
- glDeleteProgram(m_BackgroundProID);
- glDeleteProgram(m_SymbolProID);
- glDeleteFramebuffers(1, &m_FboID);
- glDeleteFramebuffers(1, &m_frameBufferMS);
- glDeleteTextures(1, &m_TextureObj);
- glDeleteRenderbuffers(1, &m_RboID);
- glDeleteRenderbuffers(1, &m_renderBufferColorMS);
- glDeleteRenderbuffers(1, &m_renderBufferDepthMS);
-#if defined( WNT )
- wglMakeCurrent(NULL, NULL);
-#elif defined( MACOSX )
-
-#elif defined( UNX )
-
- glXMakeCurrent(glWin.dpy, None, NULL);
- if( glGetError() != GL_NO_ERROR ) {
- SAL_INFO("chart2.opengl", "glError: " << (char *)gluErrorString(glGetError()));
- }
- glXDestroyContext(glWin.dpy, glWin.ctx);
- glWin.ctx = NULL;
- glWin.win = 0;
-
-#endif
-}
-
-OpenGLRender::OpenGLRender(uno::Reference< drawing::XShape > xTarget)
- : m_Model(glm::mat4(1.0f))
- , m_TextureObj(0)
- , m_FboID(0)
- , m_RboID(0)
- , m_iWidth(0)
- , m_iHeight(0)
- , m_fLineWidth(0.001f)
- , mxRenderTarget(xTarget)
- , mbArbMultisampleSupported(false)
-#if defined( _WIN32 )
- , m_iArbMultisampleFormat(0)
-#endif
- , m_2DColor(glm::vec4(1.0, 0.0, 0.0, 1.0))
- , m_frameBufferMS(0)
- , m_renderBufferColorMS(0)
- , m_renderBufferDepthMS(0)
- , m_CommonProID(0)
- , m_2DVertexID(0)
- , m_2DColorID(0)
- , m_fZStep(0)
- , m_TextProID(0)
- , m_TextMatrixID(0)
- , m_TextVertexID(0)
- , m_TextTexCoordID(0)
- , m_TextTexCoordBuf(0)
- , m_TextTexID(0)
- , m_BackgroundProID(0)
- , m_BackgroundMatrixID(0)
- , m_BackgroundVertexID(0)
- , m_BackgroundColorID(0)
- , m_SymbolProID(0)
- , m_SymbolVertexID(0)
- , m_SymbolMatrixID(0)
- , m_SymbolColorID(0)
- , m_SymbolShapeID(0)
-{
- //TODO: moggi: use STL
- memset(&m_Bubble2DCircle, 0, sizeof(m_Bubble2DCircle));
-
- //TODO: moggi: use STL
- for (size_t i = 0; i < sizeof(m_BackgroundColor) / sizeof(float); i++)
- {
- m_BackgroundColor[i] = 1.0;
- }
-
- mxRenderTarget->setPosition(awt::Point(0,0));
-}
-
-OpenGLRender::~OpenGLRender()
-{
- Release();
-}
-
-// TODO: moggi: that screws up FBO if called after buffers have been created!!!!
-void OpenGLRender::SetSize(int width, int height)
-{
- m_iWidth = width;
- m_iHeight = height;
- m_Projection = glm::ortho(0.f, float(m_iWidth), 0.f, float(m_iHeight), -4.f, 3.f);
-}
-
-#if RENDER_TO_FILE
-int OpenGLRender::CreateBMPHeader(sal_uInt8 *bmpHeader, int xsize, int ysize)
-{
- unsigned char header[BMP_HEADER_LEN] = {
- 0x42, 0x4d, 0, 0, 0, 0, 0, 0, 0, 0,
- 54, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0
- };
-
- long file_size = (long)xsize * (long)ysize * 3 + 54;
- header[2] = (unsigned char)(file_size &0x000000ff);
- header[3] = (file_size >> 8) & 0x000000ff;
- header[4] = (file_size >> 16) & 0x000000ff;
- header[5] = (file_size >> 24) & 0x000000ff;
-
- long width = xsize;
- header[18] = width & 0x000000ff;
- header[19] = (width >> 8) &0x000000ff;
- header[20] = (width >> 16) &0x000000ff;
- header[21] = (width >> 24) &0x000000ff;
-
- long height = -ysize;
- header[22] = height &0x000000ff;
- header[23] = (height >> 8) &0x000000ff;
- header[24] = (height >> 16) &0x000000ff;
- header[25] = (height >> 24) &0x000000ff;
- memcpy(bmpHeader, header, BMP_HEADER_LEN);
- return 0;
-}
-#endif
-
-void OpenGLRender::SetLine2DColor(sal_uInt8 r, sal_uInt8 g, sal_uInt8 b, sal_uInt8 nAlpha)
-{
- m_2DColor = glm::vec4((float)r / 255.0f, (float)g / 255.0f, (float)b / 255.0f, nAlpha/255.f);
-}
-
-void OpenGLRender::SetLine2DWidth(int width)
-{
- m_fLineWidth = std::max((float)width / OPENGL_SCALE_VALUE, 0.001f);
-}
-
-#if defined( _WIN32 )
-static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
- switch (message)
- {
- case WM_CREATE:
- return 0;
- case WM_CLOSE:
- PostQuitMessage(0);
- return 0;
- case WM_DESTROY:
- return 0;
- case WM_KEYDOWN:
- switch(wParam)
- {
- case VK_ESCAPE:
- PostQuitMessage(0);
- return 0;
-
- case VK_SPACE:
- break;
- }
- default:
- return DefWindowProc(hwnd, message, wParam, lParam);
- }
-}
-
-bool OpenGLRender::InitMultisample(PIXELFORMATDESCRIPTOR pfd)
-{
- HWND hWnd = NULL;
- //create a temp windwo to check whether support multi-sample, if support, get the format
- if (InitTempWindow(&hWnd, m_iWidth, m_iHeight, pfd) < 0)
- {
- SAL_WARN("chart2.opengl", "Can't create temp window to test");
- return false;
- }
-
- // See If The String Exists In WGL!
- if (!WGLisExtensionSupported("WGL_ARB_multisample"))
- {
- mbArbMultisampleSupported = false;
- SAL_WARN("chart2.opengl", "Device doesn't support multi sample");
- return false;
- }
- // Get Our Pixel Format
- PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB");
- if (!wglChoosePixelFormatARB)
- {
- mbArbMultisampleSupported = false;
- return false;
- }
- // Get Our Current Device Context
- HDC hDC = GetDC(hWnd);
-
- int pixelFormat;
- int valid;
- UINT numFormats;
- float fAttributes[] = {0,0};
- // These Attributes Are The Bits We Want To Test For In Our Sample
- // Everything Is Pretty Standard, The Only One We Want To
- // Really Focus On Is The SAMPLE BUFFERS ARB And WGL SAMPLES
- // These Two Are Going To Do The Main Testing For Whether Or Not
- // We Support Multisampling On This Hardware.
- int iAttributes[] =
- {
- WGL_DRAW_TO_WINDOW_ARB,GL_TRUE,
- WGL_SUPPORT_OPENGL_ARB,GL_TRUE,
- WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB,
- WGL_COLOR_BITS_ARB,24,
- WGL_ALPHA_BITS_ARB,8,
- WGL_DEPTH_BITS_ARB,16,
- WGL_STENCIL_BITS_ARB,0,
- WGL_DOUBLE_BUFFER_ARB,GL_TRUE,
- WGL_SAMPLE_BUFFERS_ARB,GL_TRUE,
- WGL_SAMPLES_ARB,8,
- 0,0
- };
- // First We Check To See If We Can Get A Pixel Format For 4 Samples
- valid = wglChoosePixelFormatARB(hDC, iAttributes, fAttributes, 1, &pixelFormat, &numFormats);
- // If We Returned True, And Our Format Count Is Greater Than 1
- if (valid && numFormats >= 1)
- {
- mbArbMultisampleSupported = true;
- m_iArbMultisampleFormat = pixelFormat;
- wglMakeCurrent(NULL, NULL);
- wglDeleteContext(glWin.hRC);
- ReleaseDC(hWnd, glWin.hDC);
- DestroyWindow(hWnd);
- return mbArbMultisampleSupported;
- }
- // Our Pixel Format With 4 Samples Failed, Test For 2 Samples
- iAttributes[19] = 2;
- valid = wglChoosePixelFormatARB(hDC, iAttributes, fAttributes, 1, &pixelFormat, &numFormats);
- if (valid && numFormats >= 1)
- {
- mbArbMultisampleSupported = true;
- m_iArbMultisampleFormat = pixelFormat;
- wglMakeCurrent(NULL, NULL);
- wglDeleteContext(glWin.hRC);
- ReleaseDC(hWnd, glWin.hDC);
- DestroyWindow(hWnd);
- return mbArbMultisampleSupported;
- }
- // Return The Valid Format
- wglMakeCurrent(NULL, NULL);
- wglDeleteContext(glWin.hRC);
- ReleaseDC(hWnd, glWin.hDC);
- DestroyWindow(hWnd);
- return mbArbMultisampleSupported;
-}
-
-bool OpenGLRender::GetMSAASupport()
-{
- return mbArbMultisampleSupported;
-}
-
-int OpenGLRender::GetMSAAFormat()
-{
- return m_iArbMultisampleFormat;
-}
-
-//TODO: moggi: why the hell do we need another implementation here?
-int OpenGLRender::InitTempWindow(HWND *hwnd, int width, int height, PIXELFORMATDESCRIPTOR inPfd)
-{
- PIXELFORMATDESCRIPTOR pfd = inPfd;
- int pfmt;
- int ret;
- WNDCLASS wc;
- wc.style = 0;
- wc.lpfnWndProc = WndProc;
- wc.cbClsExtra = wc.cbWndExtra = 0;
- wc.hInstance = NULL;
- wc.hIcon = NULL;
- wc.hCursor = NULL;
- wc.hbrBackground = NULL;
- wc.lpszMenuName = NULL;
- wc.lpszClassName = (LPCSTR)"GLRenderer";
- RegisterClass(&wc);
- *hwnd = CreateWindow(wc.lpszClassName, NULL, WS_DISABLED, 0, 0, width, height, NULL, NULL, wc.hInstance, NULL);
- glWin.hDC = GetDC(*hwnd);
- pfmt = ChoosePixelFormat(glWin.hDC, &pfd);
- if (!pfmt)
- {
- return -1;
- }
- ret = SetPixelFormat(glWin.hDC, pfmt, &pfd);
- if(!ret)
- {
- return -1;
- }
- glWin.hRC = wglCreateContext(glWin.hDC);
- if(!(glWin.hRC))
- {
- return -1;
- }
- ret = wglMakeCurrent(glWin.hDC, glWin.hRC);
- if(!ret)
- {
- return -1;
- }
- return 0;
-}
-
-bool OpenGLRender::WGLisExtensionSupported(const char *extension)
-{
- const size_t extlen = strlen(extension);
- const char *supported = NULL;
-
- // Try To Use wglGetExtensionStringARB On Current DC, If Possible
- PROC wglGetExtString = wglGetProcAddress("wglGetExtensionsStringARB");
-
- if (wglGetExtString)
- supported = ((char*(__stdcall*)(HDC))wglGetExtString)(wglGetCurrentDC());
- // If That Failed, Try Standard Opengl Extensions String
- if (supported == NULL)
- supported = (char*)glGetString(GL_EXTENSIONS);
- // If That Failed Too, Must Be No Extensions Supported
- if (supported == NULL)
- return 0;
-
- // Begin Examination At Start Of String, Increment By 1 On False Match
- for (const char* p = supported; ; p++)
- {
- // Advance p Up To The Next Possible Match
- p = strstr(p, extension);
-
- if (p == NULL)
- return 0; // No Match
-
- // Make Sure That Match Is At The Start Of The String Or That
- // The Previous Char Is A Space, Or Else We Could Accidentally
- // Match "wglFunkywglExtension" With "wglExtension"
-
- // Also, Make Sure That The Following Character Is Space Or NULL
- // Or Else "wglExtensionTwo" Might Match "wglExtension"
- if ((p==supported || p[-1]==' ') && (p[extlen]=='\0' || p[extlen]==' '))
- return 1; // Match
- }
-}
-#endif
-
-void OpenGLRender::SetColor(sal_uInt32 color, sal_uInt8 nAlpha)
-{
- sal_uInt8 r = (color & 0x00FF0000) >> 16;
- sal_uInt8 g = (color & 0x0000FF00) >> 8;
- sal_uInt8 b = (color & 0x000000FF);
- m_2DColor = glm::vec4((float)r / 255.0f, (float)g / 255.0f, (float)b / 255.0f, nAlpha/ 255.f);
-}
-
-int OpenGLRender::CreateMultiSampleFrameBufObj()
-{
- glGenFramebuffers(1, &m_frameBufferMS);
- glBindFramebuffer(GL_FRAMEBUFFER, m_frameBufferMS);
-
- glGenRenderbuffers(1, &m_renderBufferColorMS);
- glBindRenderbuffer(GL_RENDERBUFFER, m_renderBufferColorMS);
- glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_RGB, m_iWidth, m_iHeight);
- glBindRenderbuffer(GL_RENDERBUFFER, 0);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_renderBufferColorMS);
-
- glGenRenderbuffers(1, &m_renderBufferDepthMS);
- glBindRenderbuffer(GL_RENDERBUFFER, m_renderBufferDepthMS);
- glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_DEPTH_COMPONENT24, m_iWidth, m_iHeight);
- glBindRenderbuffer(GL_RENDERBUFFER, 0);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_renderBufferDepthMS);
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
- return 0;
-}
-
-int OpenGLRender::Create2DCircle(int detail)
-{
- float angle;
- if (detail <= 0)
- {
- return -1;
- }
- m_Bubble2DCircle.clear();
- m_Bubble2DCircle.reserve(2 * (detail + 3));
- m_Bubble2DCircle.push_back(0);
- m_Bubble2DCircle.push_back(0);
- for(angle = 2.0f * GL_PI; angle > -(2.0f * GL_PI / detail); angle -= (2.0f * GL_PI / detail))
- {
- m_Bubble2DCircle.push_back(sin(angle));
- m_Bubble2DCircle.push_back(cos(angle));
- }
- return 0;
-}
-
-int OpenGLRender::Bubble2DShapePoint(float x, float y, float directionX, float directionY)
-{
- //check whether to create the circle data
- if (m_Bubble2DCircle.empty())
- {
- Create2DCircle(100);
- }
-
- float actualX = (x / OPENGL_SCALE_VALUE);
- float actualY = (y / OPENGL_SCALE_VALUE);
- Bubble2DPointList aBubble2DPointList;
- aBubble2DPointList.xScale = directionX / OPENGL_SCALE_VALUE;
- aBubble2DPointList.yScale = directionY / OPENGL_SCALE_VALUE;
- aBubble2DPointList.x = actualX + aBubble2DPointList.xScale / 2;
- aBubble2DPointList.y = actualY + aBubble2DPointList.yScale / 2;
-
- m_Bubble2DShapePointList.push_back(aBubble2DPointList);
- return 0;
-}
-
-int OpenGLRender::RenderBubble2FBO(int)
-{
- CHECK_GL_ERROR();
- glm::vec4 edgeColor = glm::vec4(0.0, 0.0, 0.0, 1.0);
- size_t listNum = m_Bubble2DShapePointList.size();
- for (size_t i = 0; i < listNum; i++)
- {
- //move the circle to the pos, and scale using the xScale and Y scale
- Bubble2DPointList &pointList = m_Bubble2DShapePointList.front();
- PosVecf3 trans = {pointList.x, pointList.y, m_fZStep};
- PosVecf3 angle = {0.0f, 0.0f, 0.0f};
- PosVecf3 scale = {pointList.xScale, pointList.yScale, 1.0f};
- MoveModelf(trans, angle, scale);
- m_MVP = m_Projection * m_View * m_Model;
- //render to fbo
- //fill vertex buffer
- glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
- if (m_Bubble2DCircle.empty())
- {
- Create2DCircle(100);
- }
- glBufferData(GL_ARRAY_BUFFER, m_Bubble2DCircle.size() * sizeof(GLfloat), &m_Bubble2DCircle[0], GL_STATIC_DRAW);
-
- glUseProgram(m_CommonProID);
-
- glUniform4fv(m_2DColorID, 1, &m_2DColor[0]);
-
- glUniformMatrix4fv(m_MatrixID, 1, GL_FALSE, &m_MVP[0][0]);
- // 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.
- 2, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- glDrawArrays(GL_TRIANGLE_FAN, 0, m_Bubble2DCircle.size() / 2);
- glDisableVertexAttribArray(m_2DVertexID);
- glUseProgram(0);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- //add black edge
- glLineWidth(3.0);
- glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
- glBufferData(GL_ARRAY_BUFFER, m_Bubble2DCircle.size() * sizeof(GLfloat) -2 , &m_Bubble2DCircle[2], GL_STATIC_DRAW);
- glUseProgram(m_CommonProID);
- glUniform4fv(m_2DColorID, 1, &edgeColor[0]);
- glUniformMatrix4fv(m_MatrixID, 1, GL_FALSE, &m_MVP[0][0]);
- 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.
- 2, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- glDrawArrays(GL_LINE_STRIP, 0, (m_Bubble2DCircle.size() * sizeof(GLfloat) -2) / sizeof(float) / 2);
- glDisableVertexAttribArray(m_2DVertexID);
- glUseProgram(0);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- m_Bubble2DShapePointList.pop_front();
- glLineWidth(m_fLineWidth);
- }
- //if use MSAA, we should copy the data to the FBO texture
- GLenum fbResult = glCheckFramebufferStatus(GL_FRAMEBUFFER);
- if( fbResult != GL_FRAMEBUFFER_COMPLETE )
- {
- SAL_WARN("chart2.opengl", "error");
- return -1;
- }
- CHECK_GL_ERROR();
- m_fZStep += Z_STEP;
- return 0;
-}
-
-int OpenGLRender::RectangleShapePoint(float x, float y, float directionX, float directionY)
-{
- //check whether to create the circle data
- float actualX = x / OPENGL_SCALE_VALUE;
- float actualY = y / OPENGL_SCALE_VALUE;
- float actualSizeX = directionX / OPENGL_SCALE_VALUE;
- float actualSizeY = directionY / OPENGL_SCALE_VALUE;
- RectanglePointList aRectangle;
-
- aRectangle.points[0] = actualX;
- aRectangle.points[1] = actualY;
- aRectangle.points[2] = m_fZStep;
- aRectangle.points[3] = actualX + actualSizeX;
- aRectangle.points[4] = actualY;
- aRectangle.points[5] = m_fZStep;
- aRectangle.points[6] = actualX + actualSizeX;
- aRectangle.points[7] = actualY + actualSizeY;
- aRectangle.points[8] = m_fZStep;
- aRectangle.points[9] = actualX;
- aRectangle.points[10] = actualY + actualSizeY;
- aRectangle.points[11] = m_fZStep;
-
- m_RectangleShapePointList.push_back(aRectangle);
- return 0;
-}
-
-
-int OpenGLRender::RenderRectangleShape(bool bBorder, bool bFill)
-{
- size_t listNum = m_RectangleShapePointList.size();
- for (size_t i = 0; i < listNum; i++)
- {
- //move the circle to the pos, and scale using the xScale and Y scale
- RectanglePointList &pointList = m_RectangleShapePointList.front();
- {
- PosVecf3 trans = {0, 0, 0};
- PosVecf3 angle = {0.0f, 0.0f, 0.0f};
- PosVecf3 scale = {1, 1, 1.0f};
- MoveModelf(trans, angle, scale);
- m_MVP = m_Projection * m_View * m_Model;
- }
-
- //render to fbo
- //fill vertex buffer
- glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(pointList.points), pointList.points, GL_STATIC_DRAW);
-
- glBindBuffer(GL_ARRAY_BUFFER, m_ColorBuffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(m_BackgroundColor), m_BackgroundColor, GL_STATIC_DRAW);
- glUseProgram(m_BackgroundProID);
-
- glUniformMatrix4fv(m_BackgroundMatrixID, 1, GL_FALSE, &m_MVP[0][0]);
- if(bFill)
- {
- glEnableVertexAttribArray(m_BackgroundVertexID);
- glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
- glVertexAttribPointer(
- m_BackgroundVertexID, // 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
- );
-
- // 2nd attribute buffer : color
- glEnableVertexAttribArray(m_BackgroundColorID);
- glBindBuffer(GL_ARRAY_BUFFER, m_ColorBuffer);
- glVertexAttribPointer(
- m_BackgroundColorID, // attribute. No particular reason for 0, but must match the layout in the shader.
- 4, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- //TODO: moggi: get rid of GL_QUADS
- glDrawArrays(GL_QUADS, 0, 4);
- glDisableVertexAttribArray(m_BackgroundVertexID);
- glDisableVertexAttribArray(m_BackgroundColorID);
- }
- if(bBorder)
- {
- if(bFill)
- {
- PosVecf3 trans = {0.0, 0.0, Z_STEP };
- PosVecf3 angle = {0.0f, 0.0f, 0.0f};
- PosVecf3 scale = {1, 1, 1.0f};
- MoveModelf(trans, angle, scale);
- m_MVP = m_Projection * m_View * m_Model;
-
- m_fZStep += Z_STEP;
- glUniformMatrix4fv(m_BackgroundMatrixID, 1, GL_FALSE, &m_MVP[0][0]);
- }
- SetBackGroundColor(COL_BLACK, COL_BLACK, 255);
-
- glBindBuffer(GL_ARRAY_BUFFER, m_ColorBuffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(m_BackgroundColor), m_BackgroundColor, GL_STATIC_DRAW);
- // 1rst attribute buffer : vertices
- glEnableVertexAttribArray(m_BackgroundVertexID);
- glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
- glVertexAttribPointer(
- m_BackgroundVertexID, // 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
- );
-
- // 2nd attribute buffer : color
- glEnableVertexAttribArray(m_BackgroundColorID);
- glBindBuffer(GL_ARRAY_BUFFER, m_ColorBuffer);
- glVertexAttribPointer(
- m_BackgroundColorID, // attribute. No particular reason for 0, but must match the layout in the shader.
- 4, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- glDrawArrays(GL_LINE_LOOP, 0, 4);
- glDisableVertexAttribArray(m_BackgroundVertexID);
- glDisableVertexAttribArray(m_BackgroundColorID);
- }
- glDisableVertexAttribArray(m_BackgroundVertexID);
- glDisableVertexAttribArray(m_BackgroundColorID);
- glUseProgram(0);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- m_RectangleShapePointList.pop_front();
- }
- CHECK_GL_ERROR();
-
- m_fZStep += Z_STEP;
- return 0;
-}
-
-
-int OpenGLRender::CreateTextTexture(const BitmapEx& rBitmapEx, const awt::Point&, const awt::Size& aSize, long rotation,
- const drawing::HomogenMatrix3& rTrans)
-{
-#if DEBUG_PNG // debug PNG writing
- static int nIdx = 0;
- OUString aName = OUString( "file:///home/moggi/Documents/work/text" ) + OUString::number( nIdx++ ) + ".png";
- try {
- vcl::PNGWriter aWriter( rBitmapEx );
- SvFileStream sOutput( aName, STREAM_WRITE );
- aWriter.Write( sOutput );
- sOutput.Close();
- } catch (...) {
- SAL_WARN("chart2.opengl", "Error writing png to " << aName);
- }
-#endif
-
- long bmpWidth = rBitmapEx.GetSizePixel().Width();
- long bmpHeight = rBitmapEx.GetSizePixel().Height();
-
- Bitmap aBitmap (rBitmapEx.GetBitmap());
- AlphaMask aAlpha (rBitmapEx.GetAlpha());
- boost::scoped_array<sal_uInt8> bitmapBuf(new sal_uInt8[4* bmpWidth * bmpHeight ]);
- Bitmap::ScopedReadAccess pReadAccces( aBitmap );
- AlphaMask::ScopedReadAccess pAlphaReadAccess( aAlpha );
-
- size_t i = 0;
- for (long ny = 0; ny < bmpHeight; ny++)
- {
- Scanline pAScan = pAlphaReadAccess->GetScanline(ny);
- for(long nx = 0; nx < bmpWidth; nx++)
- {
- BitmapColor aCol = pReadAccces->GetColor( ny, nx );
- bitmapBuf[i++] = aCol.GetRed();
- bitmapBuf[i++] = aCol.GetGreen();
- bitmapBuf[i++] = aCol.GetBlue();
- bitmapBuf[i++] = 255 - *pAScan++;
- }
- }
-
- TextInfo aTextInfo;
- aTextInfo.rotation = -(double)rotation / 360.0 * 2* GL_PI;
- aTextInfo.vertex[0] = -aSize.Width / 2 / OPENGL_SCALE_VALUE;
- aTextInfo.vertex[1] = -aSize.Height / 2 / OPENGL_SCALE_VALUE;
- aTextInfo.vertex[2] = m_fZStep;
-
- aTextInfo.vertex[3] = aSize.Width / 2 / OPENGL_SCALE_VALUE ;
- aTextInfo.vertex[4] = -aSize.Height / 2 / OPENGL_SCALE_VALUE;
- aTextInfo.vertex[5] = m_fZStep;
-
- aTextInfo.vertex[6] = aSize.Width / 2 / OPENGL_SCALE_VALUE;
- aTextInfo.vertex[7] = aSize.Height / 2 / OPENGL_SCALE_VALUE;
- aTextInfo.vertex[8] = m_fZStep;
-
- aTextInfo.vertex[9] = -aSize.Width / 2 / OPENGL_SCALE_VALUE;
- aTextInfo.vertex[10] = aSize.Height / 2 / OPENGL_SCALE_VALUE;
- aTextInfo.vertex[11] = m_fZStep;
- aTextInfo.nDx = (rTrans.Line1.Column3 + aSize.Width / 2 ) / OPENGL_SCALE_VALUE - bmpWidth/2;
- aTextInfo.nDy = (rTrans.Line2.Column3 + aSize.Height / 2 ) / OPENGL_SCALE_VALUE - bmpHeight/2;
-
- CHECK_GL_ERROR();
- glGenTextures(1, &aTextInfo.texture);
- CHECK_GL_ERROR();
- glBindTexture(GL_TEXTURE_2D, aTextInfo.texture);
- CHECK_GL_ERROR();
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- CHECK_GL_ERROR();
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
- CHECK_GL_ERROR();
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- CHECK_GL_ERROR();
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- CHECK_GL_ERROR();
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bmpWidth, bmpHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapBuf.get());
- CHECK_GL_ERROR();
- glBindTexture(GL_TEXTURE_2D, 0);
- CHECK_GL_ERROR();
- m_TextInfoList.push_back(aTextInfo);
- return 0;
-}
-
-int OpenGLRender::RenderTextShape()
-{
- CHECK_GL_ERROR();
- size_t listNum = m_TextInfoList.size();
- for (size_t i = 0; i < listNum; i++)
- {
- TextInfo &textInfo = m_TextInfoList.front();
- PosVecf3 trans = { textInfo.nDx, textInfo.nDy, 0};
- PosVecf3 angle = {0.0f, 0.0f, float(textInfo.rotation)};
- PosVecf3 scale = {1.0, 1.0, 1.0f};
- MoveModelf(trans, angle, scale);
- m_MVP = m_Projection * m_View * m_Model;
- glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
- CHECK_GL_ERROR();
- glBufferData(GL_ARRAY_BUFFER, sizeof(textInfo.vertex), textInfo.vertex, GL_STATIC_DRAW);
- CHECK_GL_ERROR();
- glUseProgram(m_TextProID);
-
- CHECK_GL_ERROR();
- glUniformMatrix4fv(m_TextMatrixID, 1, GL_FALSE, &m_MVP[0][0]);
- // 1rst attribute buffer : vertices
- glEnableVertexAttribArray(m_TextVertexID);
- glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
- glVertexAttribPointer(
- m_TextVertexID,
- 3, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- //tex coord
- CHECK_GL_ERROR();
- glEnableVertexAttribArray(m_TextTexCoordID);
- glBindBuffer(GL_ARRAY_BUFFER, m_TextTexCoordBuf);
- glVertexAttribPointer(
- m_TextTexCoordID,
- 2, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- //texture
- CHECK_GL_ERROR();
- glBindTexture(GL_TEXTURE_2D, textInfo.texture);
- CHECK_GL_ERROR();
- glUniform1i(m_TextTexID, 0);
- CHECK_GL_ERROR();
- //TODO: moggi: get rid fo GL_QUADS
- glDrawArrays(GL_QUADS, 0, 4);
- CHECK_GL_ERROR();
- glDisableVertexAttribArray(m_TextTexCoordID);
- CHECK_GL_ERROR();
- glDisableVertexAttribArray(m_TextVertexID);
- CHECK_GL_ERROR();
- glBindTexture(GL_TEXTURE_2D, 0);
- glUseProgram(0);
- glDeleteTextures(1, &textInfo.texture);
- CHECK_GL_ERROR();
- m_TextInfoList.pop_front();
- }
- CHECK_GL_ERROR();
- m_fZStep += Z_STEP;
- return 0;
-}
-
-int OpenGLRender::SetArea2DShapePoint(float x, float y, int listLength)
-{
- if (m_Area2DPointList.empty())
- {
- m_Area2DPointList.reserve(listLength);
- }
- float actualX = (x / OPENGL_SCALE_VALUE);
- float actualY = (y / OPENGL_SCALE_VALUE);
- m_Area2DPointList.push_back(actualX);
- m_Area2DPointList.push_back(actualY);
- m_Area2DPointList.push_back(m_fZStep);
-
- if (m_Area2DPointList.size() == size_t(listLength * 3))
- {
- m_Area2DShapePointList.push_back(m_Area2DPointList);
- m_Area2DPointList.clear();
- }
- return 0;
-}
-
-namespace {
-
-// only 2D
-bool checkCCW(const Area2DPointList& rPoints)
-{
- if(rPoints.size() < 3)
- return true;
-
- GLfloat sum = 0;
- for(size_t i = 1; i < rPoints.size()/3; i += 3)
- {
- GLfloat x1 = rPoints[(i-1)*3];
- GLfloat x2 = rPoints[i*3];
- GLfloat y1 = rPoints[(i-1)*3 + 1];
- GLfloat y2 = rPoints[i*3 + 1];
- GLfloat prod = (x2-x1)*(y2+y1);
-
- sum += prod;
- }
-
- return (sum <= 0);
-}
-
-}
-
-int OpenGLRender::RenderArea2DShape()
-{
- CHECK_GL_ERROR();
-
- glDisable(GL_MULTISAMPLE);
- size_t listNum = m_Area2DShapePointList.size();
- PosVecf3 trans = {0.0f, 0.0f, 0.0f};
- PosVecf3 angle = {0.0f, 0.0f, 0.0f};
- PosVecf3 scale = {1.0f, 1.0f, 1.0f};
- MoveModelf(trans, angle, scale);
- m_MVP = m_Projection * m_View * m_Model;
- for (size_t i = 0; i < listNum; ++i)
- {
- Area2DPointList &pointList = m_Area2DShapePointList.front();
- bool bIsCCW = checkCCW(pointList); // is it counter clockwise (CCW) or clockwise (CW)
- if(!bIsCCW)
- glFrontFace(GL_CW);
- //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]);
-
- glUniformMatrix4fv(m_MatrixID, 1, GL_FALSE, &m_MVP[0][0]);
-
- // 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.
- 3, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- // TODO: moggi: remove deprecated GL_POLYGON
- glDrawArrays(GL_POLYGON, 0, pointList.size() / 3); // 12*3 indices starting at 0 -> 12 triangles
- glDisableVertexAttribArray(m_2DVertexID);
- glUseProgram(0);
- if(!bIsCCW)
- glFrontFace(GL_CCW);
- m_Area2DShapePointList.pop_front();
- }
- glEnable(GL_MULTISAMPLE);
- m_fZStep += Z_STEP;
-
- CHECK_GL_ERROR();
-
- return 0;
-}
-
-void OpenGLRender::SetBackGroundColor(sal_uInt32 color1, sal_uInt32 color2, sal_uInt8 nAlpha)
-{
- sal_uInt8 r = (color1 & 0x00FF0000) >> 16;
- sal_uInt8 g = (color1 & 0x0000FF00) >> 8;
- sal_uInt8 b = (color1 & 0x000000FF);
-
- m_BackgroundColor[0] = (float)r / 255.0f;
- m_BackgroundColor[1] = (float)g / 255.0f;
- m_BackgroundColor[2] = (float)b / 255.0f;
- m_BackgroundColor[3] = nAlpha / 255.0f;
-
- m_BackgroundColor[4] = (float)r / 255.0f;
- m_BackgroundColor[5] = (float)g / 255.0f;
- m_BackgroundColor[6] = (float)b / 255.0f;
- m_BackgroundColor[7] = nAlpha / 255.0f;
-
- r = (color2 & 0x00FF0000) >> 16;
- g = (color2 & 0x0000FF00) >> 8;
- b = (color2 & 0x000000FF);
-
- m_BackgroundColor[8] = (float)r / 255.0f;
- m_BackgroundColor[9] = (float)g / 255.0f;
- m_BackgroundColor[10] = (float)b / 255.0f;
- m_BackgroundColor[11] = nAlpha / 255.0f;
-
- m_BackgroundColor[12] = (float)r / 255.0f;
- m_BackgroundColor[13] = (float)g / 255.0f;
- m_BackgroundColor[14] = (float)b / 255.0f;
- m_BackgroundColor[15] = nAlpha / 255.0f;
- SAL_INFO("chart2.opengl", "color1 = " << color1 << ", color2 = " << color2);
-
-}
-
-void OpenGLRender::SetChartTransparencyGradient(long transparencyGradient)
-{
- if (transparencyGradient == 1)
- {
- m_BackgroundColor[11] = 0.0;
- m_BackgroundColor[15] = 0.0;
- }
-}
-
-void OpenGLRender::GeneratePieSegment2D(double fInnerRadius, double fOutterRadius, double nAngleStart, double nAngleWidth)
-{
- double nAngleStep = 1;
- PieSegment2DPointList aPointList;
- // TODO: moggi: GL_TRIANGLE_FAN seems not to work
- bool bInnerRadiusNotZero = true; //!rtl::math::approxEqual(0.0, fInnerRadius);
- size_t nVectorSize = 3*(nAngleWidth/nAngleStep);
- if(bInnerRadiusNotZero)
- nVectorSize *= 2;
-
- nAngleStart += 90;
- aPointList.reserve(nVectorSize);
- // if inner radius = 0 generate a normal pie segment (triangle fan)
- // if inner radius != 0 generate a pie segment - inner pie (triangle strip)
- if(!bInnerRadiusNotZero)
- {
- aPointList.push_back(0);
- aPointList.push_back(0);
- aPointList.push_back(m_fZStep);
- }
- for(double nAngle = nAngleStart; nAngle <= nAngleStart + nAngleWidth; nAngle += nAngleStep)
- {
- float xVal = sin(nAngle/360*2*GL_PI);
- float yVal = cos(nAngle/360*2*GL_PI);
- aPointList.push_back(fOutterRadius * xVal);
- aPointList.push_back(fOutterRadius * yVal);
- aPointList.push_back(m_fZStep);
-
- if(bInnerRadiusNotZero)
- {
- aPointList.push_back(fInnerRadius * xVal);
- aPointList.push_back(fInnerRadius * yVal);
- aPointList.push_back(m_fZStep);
- }
- }
-
- m_PieSegment2DShapePointList.push_back(aPointList);
-}
-
-int OpenGLRender::RenderPieSegment2DShape(float fSize, float fPosX, float fPosY)
-{
- int listNum = m_PieSegment2DShapePointList.size();
- PosVecf3 trans = {fPosX/OPENGL_SCALE_VALUE, fPosY/OPENGL_SCALE_VALUE, 0.0f};
- PosVecf3 angle = {0.0f, 0.0f, 0.0f};
- PosVecf3 scale = {fSize/OPENGL_SCALE_VALUE, fSize/OPENGL_SCALE_VALUE, 1.0f};
- MoveModelf(trans, angle, scale);
- m_MVP = m_Projection * m_View * m_Model;
-
- for (int i = 0; i < listNum; i++)
- {
- PieSegment2DPointList &pointList = m_PieSegment2DShapePointList.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]);
-
- glUniformMatrix4fv(m_MatrixID, 1, GL_FALSE, &m_MVP[0][0]);
-
- // 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.
- 3, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- glDrawArrays(GL_TRIANGLE_STRIP, 0, pointList.size() / 3); // 12*3 indices starting at 0 -> 12 triangles
- glDisableVertexAttribArray(m_2DVertexID);
- glUseProgram(0);
- m_PieSegment2DShapePointList.pop_back();
- CHECK_GL_ERROR();
-
- }
- m_fZStep += Z_STEP;
-
- CHECK_GL_ERROR();
- return 0;
-}
-
-int OpenGLRender::RenderSymbol2DShape(float x, float y, float , float , sal_Int32 nSymbol)
-{
- CHECK_GL_ERROR();
-
- glPointSize(20.f);
- CHECK_GL_ERROR();
- PosVecf3 trans = {0.0, 0.0, 0.0};
- PosVecf3 angle = {0.0f, 0.0f, 0.0f};
- PosVecf3 scale = {1.0, 1.0, 1.0f};
- MoveModelf(trans, angle, scale);
- m_MVP = m_Projection * m_View * m_Model;
-
- float aPos[3] = { x/OPENGL_SCALE_VALUE, y/OPENGL_SCALE_VALUE, m_fZStep };
- //fill vertex buffer
- glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
- CHECK_GL_ERROR();
- glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(float), aPos, GL_STATIC_DRAW);
- CHECK_GL_ERROR();
-
- // Use our shader
- glUseProgram(m_SymbolProID);
- CHECK_GL_ERROR();
-
- glUniform4fv(m_SymbolColorID, 1, &m_2DColor[0]);
- glUniform1i(m_SymbolShapeID, nSymbol);
- CHECK_GL_ERROR();
-
- glUniformMatrix4fv(m_SymbolMatrixID, 1, GL_FALSE, &m_MVP[0][0]);
-
- CHECK_GL_ERROR();
- // 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_POINTS, 0, 1);
-
- glDisableVertexAttribArray(m_SymbolVertexID);
- CHECK_GL_ERROR();
- glUseProgram(0);
- m_fZStep += Z_STEP;
-
- CHECK_GL_ERROR();
- return 0;
-}
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
deleted file mode 100755
index 8e5314da1e41..000000000000
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ /dev/null
@@ -1,298 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#if defined( MACOSX )
-#elif defined( UNX )
-# include <prex.h>
-# include "GL/glxew.h"
-# include <postx.h>
-#elif defined( _WIN32 )
-# include "prewin.h"
-# include "windows.h"
-# include "postwin.h"
-#endif
-
-#include <GL/glew.h>
-
-#include <vcl/window.hxx>
-#include <vcl/syschild.hxx>
-#include <vcl/sysdata.hxx>
-#include <vcl/bitmapex.hxx>
-#include <com/sun/star/drawing/HomogenMatrix3.hpp>
-#include <com/sun/star/drawing/XDrawPage.hpp>
-#include <vcl/font.hxx>
-
-
-#if defined( _WIN32 )
-#include <GL/glext.h>
-#include <GL/wglext.h>
-#elif defined( MACOSX )
-#elif defined( UNX )
-#include <GL/glext.h>
-#define GLX_GLXEXT_PROTOTYPES 1
-#include <GL/glx.h>
-#include <GL/glxext.h>
-
-#endif
-
-// Include GLM
-#include <list>
-#include "glm/glm.hpp"
-#include "glm/gtx/transform.hpp"
-#include "glm/gtx/euler_angles.hpp"
-#include "glm/gtx/quaternion.hpp"
-
-#define OPENGL_SCALE_VALUE 20
-#define DEBUG_POSITIONING 0
-#define RENDER_TO_FILE 0
-
-struct PosVecf3
-{
- float x;
- float y;
- float z;
-};
-
-typedef std::vector<GLfloat> Line2DPointList;
-
-struct Bubble2DPointList
-{
- float x;
- float y;
- float xScale;
- float yScale;
-};
-
-typedef std::vector<GLfloat> Bubble2DCircle;
-
-struct RectanglePointList
-{
- float points[12];
-};
-
-struct TextInfo
-{
- GLuint texture;
- double rotation;
- float vertex[12];
- float nDx;
- float nDy;
-};
-
-typedef std::vector<GLfloat> Area2DPointList;
-typedef std::vector<GLfloat> PieSegment2DPointList;
-typedef std::vector<GLfloat> PointList;
-
-/// Holds the information of our new child window
-struct GLWindow
-{
-#if defined( _WIN32 )
- HWND hWnd;
- HDC hDC;
- HGLRC hRC;
-#elif defined( MACOSX )
-#elif defined( UNX )
- Display* dpy;
- int screen;
- XLIB_Window win;
-#if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
- GLXFBConfig fbc;
-#endif
- XVisualInfo* vi;
- GLXContext ctx;
-
- bool HasGLXExtension( const char* name ) { return gluCheckExtension( (const GLubyte*) name, (const GLubyte*) GLXExtensions ); }
- const char* GLXExtensions;
-#endif
- unsigned int bpp;
- unsigned int Width;
- unsigned int Height;
- const GLubyte* GLExtensions;
-
- bool HasGLExtension( const char* name ) { return gluCheckExtension( (const GLubyte*) name, GLExtensions ); }
-
- GLWindow()
- :
-#if defined( _WIN32 )
-#elif defined( MACOSX )
-#elif defined( UNX )
- dpy(NULL),
- screen(0),
- win(0),
-#if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
- fbc(0),
-#endif
- vi(NULL),
- ctx(0),
- GLXExtensions(NULL),
-#endif
- bpp(0),
- Width(0),
- Height(0),
- GLExtensions(NULL)
- {
- }
-};
-
-class OpenGLRender
-{
-public:
- OpenGLRender(com::sun::star::uno::Reference<
- com::sun::star::drawing::XShape > xTarget );
- ~OpenGLRender();
- int InitOpenGL(GLWindow);
- int MoveModelf(PosVecf3 trans, PosVecf3 angle, PosVecf3 scale);
- void SetSize(int width, int height);
- void Release();
-#if RENDER_TO_FILE
- int CreateBMPHeader(sal_uInt8 *bmpHeader, int xsize, int ysize);
-#endif
- int RenderLine2FBO(int wholeFlag);
- int SetLine2DShapePoint(float x, float y, int listLength);
- void SetLine2DColor(sal_uInt8 r, sal_uInt8 g, sal_uInt8 b, sal_uInt8 nAlpha);
- void SetLine2DWidth(int width);
- BitmapEx GetAsBitmap();
-#if defined( _WIN32 )
- bool InitMultisample(PIXELFORMATDESCRIPTOR pfd);
- bool GetMSAASupport();
- int GetMSAAFormat();
-#endif
- void SetColor(sal_uInt32 color, sal_uInt8 nAlpha);
- int Bubble2DShapePoint(float x, float y, float directionX, float directionY);
- int RenderBubble2FBO(int wholeFlag);
-
- void prepareToRender();
- void renderToBitmap();
-
- int RenderRectangleShape(bool bBorder, bool bFill);
- int RectangleShapePoint(float x, float y, float directionX, float directionY);
-
- int CreateTextTexture(const BitmapEx& rBitmapEx,
- const com::sun::star::awt::Point& aPos, const com::sun::star::awt::Size& aSize,
- long rotation, const com::sun::star::drawing::HomogenMatrix3& rTrans);
- int RenderTextShape();
-
- int SetArea2DShapePoint(float x, float y, int listLength);
- int RenderArea2DShape();
- void SetChartTransparencyGradient(long transparencyGradient);
-
- void GeneratePieSegment2D(double, double, double, double);
- int RenderPieSegment2DShape(float, float, float);
-
- int RenderSymbol2DShape(float, float, float, float, sal_Int32);
-#if DEBUG_POSITIONING
- void renderDebug();
-#endif
-
- void SetBackGroundColor(sal_uInt32 color1, sal_uInt32 color2, sal_uInt8 nAlpha);
-private:
- GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName);
- int CreateTextureObj(int width, int height);
- int CreateRenderObj(int width, int height);
- int CreateFrameBufferObj();
-#if defined( _WIN32 )
- int InitTempWindow(HWND *hwnd, int width, int height, PIXELFORMATDESCRIPTOR inPfd);
- bool WGLisExtensionSupported(const char *extension);
-#endif
- int CreateMultiSampleFrameBufObj();
- int Create2DCircle(int detail);
-
-private:
- // Projection matrix : default 45 degree Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
- glm::mat4 m_Projection;
- // Camera matrix
- glm::mat4 m_View;
- // Model matrix : an identity matrix (model will be at the origin
- glm::mat4 m_Model;
- // Our ModelViewProjection : multiplication of our 3 matrices
- glm::mat4 m_MVP;
-
- GLuint m_VertexBuffer;
-
- GLuint m_ColorBuffer;
-
- GLint m_MatrixID;
-
- GLuint m_TextureObj;
-
- GLuint m_FboID;
-
- GLuint m_RboID;
-
- int m_iWidth;
-
- int m_iHeight;
-
- GLWindow glWin;
-
- Line2DPointList m_Line2DPointList;
-
- float m_fLineWidth;
-
- std::list <Line2DPointList> m_Line2DShapePointList;
-
- com::sun::star::uno::Reference< com::sun::star::drawing::XShape > mxRenderTarget;
-
- bool mbArbMultisampleSupported;
-#if defined( _WIN32 )
- int m_iArbMultisampleFormat;
-#endif
-
- glm::vec4 m_2DColor;
- GLuint m_frameBufferMS;
- GLuint m_renderBufferColorMS;
- GLuint m_renderBufferDepthMS;
-
- Bubble2DCircle m_Bubble2DCircle;
-
- std::list <Bubble2DPointList> m_Bubble2DShapePointList;
- GLint m_CommonProID;
- GLint m_2DVertexID;
- GLint m_2DColorID;
-
- float m_fZStep;
-
- std::list <RectanglePointList> m_RectangleShapePointList;
- // add for text
- std::list <TextInfo> m_TextInfoList;
- GLint m_TextProID;
- GLint m_TextMatrixID;
- GLint m_TextVertexID;
- GLint m_TextTexCoordID;
- GLuint m_TextTexCoordBuf;
- GLint m_TextTexID;
-
- Area2DPointList m_Area2DPointList;
- std::list <Area2DPointList> m_Area2DShapePointList;
-
- GLint m_BackgroundProID;
- GLint m_BackgroundMatrixID;
- GLint m_BackgroundVertexID;
- GLint m_BackgroundColorID;
-
- float m_BackgroundColor[16];
-
- std::list <PieSegment2DPointList> m_PieSegment2DShapePointList;
- PointList m_Symbol2DPointList;
- std::list<PointList> m_Symbol2DShapePointList;
-
- GLuint m_SymbolProID;
- GLuint m_SymbolVertexID;
- GLuint m_SymbolMatrixID;
- GLuint m_SymbolColorID;
- GLuint m_SymbolShapeID;
-
-#if DEBUG_POSITIONING
- GLuint m_DebugProID;
- GLuint m_DebugVertexID;
- GLuint m_DebugColorID;
-#endif
-};
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */