summaryrefslogtreecommitdiff
path: root/chart2
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@collabora.co.uk>2014-05-06 07:00:28 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-05-06 07:25:50 +0200
commit37ec4aefdf054c28bf6f2d3d283dad0f3a799884 (patch)
tree6b32c8fc81dfc5bb1a14b8d2e9b4b4350bb1567d /chart2
parent81074d60801b5ca1c29f7f8127de5c62d652dce1 (diff)
more 3D rendering fixes
Change-Id: I8943355de1b9440104e0281131fb0df3fc599bb4
Diffstat (limited to 'chart2')
-rw-r--r--chart2/source/view/inc/GL3DRenderer.hxx5
-rw-r--r--chart2/source/view/main/3DChartObjects.cxx1
-rw-r--r--chart2/source/view/main/GL3DRenderer.cxx55
3 files changed, 61 insertions, 0 deletions
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx
index 4782f5047482..59b9b0088830 100644
--- a/chart2/source/view/inc/GL3DRenderer.hxx
+++ b/chart2/source/view/inc/GL3DRenderer.hxx
@@ -158,6 +158,7 @@ class OpenGL3DRenderer : public IOpenGLInfoProvider
public:
OpenGL3DRenderer();
+ void CreateFrameBufferObj();
void LoadShaders();
void init();
virtual bool isOpenGLInitialized() SAL_OVERRIDE;
@@ -288,8 +289,12 @@ private:
GLint m_MatrixID;
+ GLuint m_TextureObj[2];
+
GLuint m_FboID[2];
+ GLuint m_RboID[2];
+
Extrude3DInfo m_Extrude3DInfo;
std::vector <Extrude3DInfo> m_Extrude3DList;
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index 4f9da3317df8..d45dc9f09203 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -91,6 +91,7 @@ void TemporaryContext::init()
Size winSize(800, 600);
maContext.setWinSize(winSize);
mpRenderer->SetSize(winSize);
+ mpRenderer->init();
}
}
diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index 651fca461bff..b28e42e5caca 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -100,6 +100,28 @@ OpenGL3DRenderer::OpenGL3DRenderer():
m_CameraInfo.cameraUp = glm::vec3(0, 1, 0);
}
+void OpenGL3DRenderer::CreateFrameBufferObj()
+{
+ // create a framebuffer object, you need to delete them when program exits.
+ glGenFramebuffers(2, m_FboID);
+ glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ for (int i = 0; i < 2; i++)
+ {
+ glBindFramebuffer(GL_FRAMEBUFFER, m_FboID[i]);
+ glBindTexture(GL_TEXTURE_2D, m_TextureObj[i]);
+ // attach a texture to FBO color attachement point
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TextureObj[i], 0);
+ glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ // attach a renderbuffer to depth attachment point
+ glBindRenderbuffer(GL_RENDERBUFFER, m_RboID[i]);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_RboID[i]);
+ glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ }
+}
+
void OpenGL3DRenderer::LoadShaders()
{
m_3DProID = OpenGLHelper::LoadShaders("Shape3DVertexShader", "Shape3DFragmentShader");
@@ -110,6 +132,12 @@ void OpenGL3DRenderer::LoadShaders()
m_3DVertexID = glGetAttribLocation(m_3DProID, "vertexPositionModelspace");
m_3DNormalID = glGetAttribLocation(m_3DProID, "vertexNormalModelspace");
+ m_CommonProID = OpenGLHelper::LoadShaders("commonVertexShader", "commonFragmentShader");
+ m_MatrixID = glGetUniformLocation(m_CommonProID, "MVP");
+ m_2DVertexID = glGetAttribLocation(m_CommonProID, "vPosition");
+ m_2DColorID = glGetUniformLocation(m_CommonProID, "vColor");
+ CHECK_GL_ERROR();
+
Init3DUniformBlock();
}
@@ -127,6 +155,32 @@ void OpenGL3DRenderer::SetCameraInfo(glm::vec3 pos, glm::vec3 direction, glm::ve
void OpenGL3DRenderer::init()
{
+ if (glewIsSupported("framebuffer_object") != GLEW_OK)
+ {
+ SAL_WARN("chart2.opengl", "GL stack has no framebuffer support");
+ return;
+ }
+
+ 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);
+
glGenBuffers(1, &m_CubeVertexBuf);
AddVertexData(m_CubeVertexBuf);
@@ -155,6 +209,7 @@ void OpenGL3DRenderer::init()
m_3DProjection = glm::perspective(30.0f, (float)m_iWidth / (float)m_iHeight, 0.01f, 2000.0f);
LoadShaders();
+ CreateFrameBufferObj();
m_IsOpenglInit = true;
}