[Libreoffice-commits] core.git: 10 commits - chart2/opengl chart2/Package_opengl.mk chart2/source
xukai
xukai at multicorewareinc.com
Mon May 5 09:03:07 PDT 2014
chart2/Package_opengl.mk | 2
chart2/opengl/shape3DFragmentShader.glsl | 111 +++++++++++++++++++++
chart2/opengl/shape3DVertexShader.glsl | 30 +++++
chart2/source/view/inc/3DChartObjects.hxx | 12 ++
chart2/source/view/inc/GL3DRenderer.hxx | 11 +-
chart2/source/view/main/3DChartObjects.cxx | 34 ++++++
chart2/source/view/main/GL3DRenderer.cxx | 148 +++++++++++------------------
7 files changed, 254 insertions(+), 94 deletions(-)
New commits:
commit e0dc3c8a0a69bb44a583b42d6fb823efbc311dc5
Author: xukai <xukai at multicorewareinc.com>
Date: Mon May 5 14:05:08 2014 +0800
add codes to Line::render()
Change-Id: I6510f486707b08ea8f611105f40cc4c7e1581a7f
diff --git a/chart2/source/view/inc/3DChartObjects.hxx b/chart2/source/view/inc/3DChartObjects.hxx
index 54b6a24..b1f8de4 100644
--- a/chart2/source/view/inc/3DChartObjects.hxx
+++ b/chart2/source/view/inc/3DChartObjects.hxx
@@ -54,6 +54,8 @@ class Line : public Renderable3DObject
public:
Line( sal_uInt32 nId );
+ virtual void render() SAL_OVERRIDE;
+
private:
glm::vec3 maPosBegin;
glm::vec3 maPosEnd;
@@ -87,7 +89,7 @@ class Camera : public Renderable3DObject
{
public:
Camera();
- virtual void render();
+ virtual void render() SAL_OVERRIDE;
private:
glm::vec3 maPos;
glm::vec3 maUp;
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index 38279a3..045107b 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -54,6 +54,14 @@ Line::Line(sal_uInt32 nId):
{
}
+void Line::render()
+{
+ getRender()->AddShapePolygon3DObject(0, true, (sal_Int32)maLineColor.GetColor(), 0, 0);
+ getRender()->AddPolygon3DObjectPoint(maPosBegin.x, maPosBegin.y, maPosBegin.z);
+ getRender()->AddPolygon3DObjectPoint(maPosEnd.x, maPosEnd.y, maPosEnd.z);
+ getRender()->EndAddShapePolygon3DObject();
+}
+
Text::Text(sal_uInt32 nId):
Renderable3DObject(nId)
{
commit 461aa03c95e3297041de4eec8b3d44da348f60e8
Author: xukai <xukai at multicorewareinc.com>
Date: Mon May 5 13:00:46 2014 +0800
remove the codes of set camera info to render()
Change-Id: I9c2aecd5dea617e7cd69c1fc005b6a9ee237f202
diff --git a/chart2/source/view/inc/3DChartObjects.hxx b/chart2/source/view/inc/3DChartObjects.hxx
index 1fa9402..54b6a24 100644
--- a/chart2/source/view/inc/3DChartObjects.hxx
+++ b/chart2/source/view/inc/3DChartObjects.hxx
@@ -87,6 +87,7 @@ class Camera : public Renderable3DObject
{
public:
Camera();
+ virtual void render();
private:
glm::vec3 maPos;
glm::vec3 maUp;
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index 6148f03..38279a3 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -70,9 +70,14 @@ Camera::Camera():
maUp(0, 1, 0),
maDirection(glm::vec3(0,0,0)-maPos)
{
+}
+
+void Camera::render()
+{
getRender()->SetCameraInfo(maPos, maDirection, maUp, true);
}
+
namespace temporary {
TemporaryContext::TemporaryContext():
commit 4e8a9d669f835cb2f1df3efc9b41d86d51af90d7
Author: xukai <xukai at multicorewareinc.com>
Date: Mon May 5 12:25:42 2014 +0800
add codes to set camera info
Change-Id: Id6bac3a8dd46d7994c9e64c9e0c16e8c7ac036ac
diff --git a/chart2/source/view/inc/3DChartObjects.hxx b/chart2/source/view/inc/3DChartObjects.hxx
index e3165e2..1fa9402 100644
--- a/chart2/source/view/inc/3DChartObjects.hxx
+++ b/chart2/source/view/inc/3DChartObjects.hxx
@@ -89,6 +89,7 @@ public:
Camera();
private:
glm::vec3 maPos;
+ glm::vec3 maUp;
glm::vec3 maDirection;
};
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx
index b31a5ac..5f66203 100644
--- a/chart2/source/view/inc/GL3DRenderer.hxx
+++ b/chart2/source/view/inc/GL3DRenderer.hxx
@@ -109,6 +109,7 @@ typedef struct Extrude3DInfo
typedef struct CameraInfo
{
+ bool useDefault;
glm::vec3 cameraPos;
glm::vec3 cameraOrg;
glm::vec3 cameraUp;
@@ -179,7 +180,7 @@ public:
void SetClickPos(Point aMPos);
void RenderClickPos(Point aMPos);
void SetSize(const Size& rSize);
-
+ void SetCameraInfo(glm::vec3 pos, glm::vec3 direction, glm::vec3 up, bool useDefalut);
private:
void MoveModelf(PosVecf3& trans,PosVecf3& angle,PosVecf3& scale);
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index f7e0eb7..6148f03 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -67,8 +67,10 @@ Rectangle::Rectangle(sal_uInt32 nId):
Camera::Camera():
Renderable3DObject(0),
maPos(10,10,-10),
+ maUp(0, 1, 0),
maDirection(glm::vec3(0,0,0)-maPos)
{
+ getRender()->SetCameraInfo(maPos, maDirection, maUp, true);
}
namespace temporary {
diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index baa8cba..651fca4 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -96,6 +96,8 @@ OpenGL3DRenderer::OpenGL3DRenderer():
m_SenceBox.minZCoord = FLT_MAX;
m_uiSelectFrameCounter = 0;
m_fHeightWeight = 1.0f;
+ m_CameraInfo.useDefault = true;
+ m_CameraInfo.cameraUp = glm::vec3(0, 1, 0);
}
void OpenGL3DRenderer::LoadShaders()
@@ -111,6 +113,18 @@ void OpenGL3DRenderer::LoadShaders()
Init3DUniformBlock();
}
+void OpenGL3DRenderer::SetCameraInfo(glm::vec3 pos, glm::vec3 direction, glm::vec3 up, bool useDefalut)
+{
+ m_CameraInfo.useDefault = useDefalut;
+ if (m_CameraInfo.useDefault)
+ {
+ return;
+ }
+ m_CameraInfo.cameraPos = pos;
+ m_CameraInfo.cameraOrg = pos + direction;
+ m_CameraInfo.cameraUp = up;
+}
+
void OpenGL3DRenderer::init()
{
glGenBuffers(1, &m_CubeVertexBuf);
@@ -801,21 +815,6 @@ void OpenGL3DRenderer::EndAddShapePolygon3DObject()
void OpenGL3DRenderer::AddPolygon3DObjectNormalPoint(float x, float y, float z)
{
- float actualX = x - (float)m_iWidth / 2;
- float actualY = y - (float)m_iHeight / 2;
- float actualZ = z;
- float maxCoord = std::max(actualX, std::max(actualY, actualZ));
- m_fZmax = std::max(maxCoord, m_fZmax);
- m_Polygon3DInfo.vertices->push_back(glm::vec3(actualX, -actualY, actualZ));
-
- m_SenceBox.maxXCoord = std::max(m_SenceBox.maxXCoord, actualX);
- m_SenceBox.minXCoord = std::min(m_SenceBox.minXCoord, actualX);
-
- m_SenceBox.maxYCoord = std::max(m_SenceBox.maxYCoord, actualY);
- m_SenceBox.minYCoord = std::min(m_SenceBox.minYCoord, actualY);
-
- m_SenceBox.maxZCoord = std::max(m_SenceBox.maxZCoord, actualZ);
- m_SenceBox.minZCoord = std::min(m_SenceBox.minZCoord, actualZ);
if (m_Polygon3DInfo.fillStyle)
{
if (!m_Polygon3DInfo.normals)
@@ -844,61 +843,19 @@ void OpenGL3DRenderer::AddPolygon3DObjectPoint(float x, float y, float z)
float maxCoord = std::max(actualX, std::max(actualY, actualZ));
m_fZmax = std::max(maxCoord, m_fZmax);
m_Polygon3DInfo.vertices->push_back(glm::vec3(actualX, -actualY, actualZ));
+ m_SenceBox.maxXCoord = std::max(m_SenceBox.maxXCoord, actualX);
+ m_SenceBox.minXCoord = std::min(m_SenceBox.minXCoord, actualX);
+
+ m_SenceBox.maxYCoord = std::max(m_SenceBox.maxYCoord, actualY);
+ m_SenceBox.minYCoord = std::min(m_SenceBox.minYCoord, actualY);
+
+ m_SenceBox.maxZCoord = std::max(m_SenceBox.maxZCoord, actualZ);
+ m_SenceBox.minZCoord = std::min(m_SenceBox.minZCoord, actualZ);
}
void OpenGL3DRenderer::EndAddPolygon3DObjectPoint()
{
m_Polygon3DInfo.verticesList.push_back(m_Polygon3DInfo.vertices);
- //get the buttom surface to calc the camera org, just for the demo
- if (m_Polygon3DInfo.vertices->size() && !m_bCameraUpdated)
- {
- float minX = m_Polygon3DInfo.vertices->at(0).x;
- float maxX = m_Polygon3DInfo.vertices->at(0).x;
- float minZ = m_Polygon3DInfo.vertices->at(0).z;
- float maxZ = m_Polygon3DInfo.vertices->at(0).z;
- float maxY = m_Polygon3DInfo.vertices->at(0).y;
- float minY = m_Polygon3DInfo.vertices->at(0).y;
- for (size_t i = 1; i < m_Polygon3DInfo.vertices->size(); i++)
- {
- minX = std::min(minX, m_Polygon3DInfo.vertices->at(i).x);
- maxX = std::max(maxX, m_Polygon3DInfo.vertices->at(i).x);
- minZ = std::min(minZ, m_Polygon3DInfo.vertices->at(i).z);
- maxZ = std::max(maxZ, m_Polygon3DInfo.vertices->at(i).z);
- minY = std::min(minY, m_Polygon3DInfo.vertices->at(i).y);
- maxY = std::max(maxY, m_Polygon3DInfo.vertices->at(i).y);
- }
-
- if (maxY == minY)
- {
- float distance = maxZ + 300;
- float veriticalAngle = GL_PI / 6.0f;
- float horizontalAngle = 0;
- m_CameraInfo.cameraOrg = glm::vec3(minX + (maxX - minX) / 2,
- minY + (maxY - minY) / 2,
- minZ + (maxZ - minZ) / 2);
- //update the camera position and org
- m_CameraInfo.cameraPos.x = m_CameraInfo.cameraOrg.x + distance * cos(veriticalAngle) * sin(horizontalAngle);
- m_CameraInfo.cameraPos.z = m_CameraInfo.cameraOrg.z + distance * cos(veriticalAngle) * cos(horizontalAngle);
- m_CameraInfo.cameraPos.y = m_CameraInfo.cameraOrg.y - distance * sin(veriticalAngle);
-
- m_3DView = glm::lookAt(m_CameraInfo.cameraPos, // Camera is at (0,0,3), in World Space
- m_CameraInfo.cameraOrg, // and looks at the origin
- m_CameraInfo.cameraUp // Head is up (set to 0,-1,0 to look upside-down)
- );
- m_3DViewBack = m_3DView;
- #if 0
- cout << "update position" << endl;
- cout << "m_CameraInfo.cameraPos.x = " << m_CameraInfo.cameraPos.x << endl;
- cout << "m_CameraInfo.cameraPos.y = " << m_CameraInfo.cameraPos.y << endl;
- cout << "m_CameraInfo.cameraPos.z = " << m_CameraInfo.cameraPos.z << endl;
-
- cout << "m_CameraInfo.cameraOrg.x = " << m_CameraInfo.cameraOrg.x << endl;
- cout << "m_CameraInfo.cameraOrg.y = " << m_CameraInfo.cameraOrg.y << endl;
- cout << "m_CameraInfo.cameraOrg.z = " << m_CameraInfo.cameraOrg.z << endl;
- #endif
- m_bCameraUpdated = true;
- }
- }
m_Polygon3DInfo.vertices = NULL;
}
@@ -1263,14 +1220,16 @@ void OpenGL3DRenderer::CreateSceneBoxView()
m_fHeightWeight = senceBoxWidth * (float)m_iHeight / (float)m_iWidth / senceBoxHeight;
m_SenceBox.maxYCoord *= m_fHeightWeight;
m_SenceBox.minYCoord *= m_fHeightWeight;
- m_CameraInfo.cameraOrg = glm::vec3(m_SenceBox.minXCoord + senceBoxWidth / 2,
- -m_SenceBox.minYCoord - senceBoxHeight * m_fHeightWeight/ 2,
- m_SenceBox.minZCoord + senceBoxDepth / 2);
- //update the camera position and org
- m_CameraInfo.cameraPos.x = m_CameraInfo.cameraOrg.x + distance * cos(veriticalAngle) * sin(horizontalAngle);
- m_CameraInfo.cameraPos.z = m_CameraInfo.cameraOrg.z + distance * cos(veriticalAngle) * cos(horizontalAngle);
- m_CameraInfo.cameraPos.y = m_CameraInfo.cameraOrg.y - distance * sin(veriticalAngle);
-
+ if (m_CameraInfo.useDefault)
+ {
+ m_CameraInfo.cameraOrg = glm::vec3(m_SenceBox.minXCoord + senceBoxWidth / 2,
+ -m_SenceBox.minYCoord - senceBoxHeight * m_fHeightWeight/ 2,
+ m_SenceBox.minZCoord + senceBoxDepth / 2);
+ //update the camera position and org
+ m_CameraInfo.cameraPos.x = m_CameraInfo.cameraOrg.x + distance * cos(veriticalAngle) * sin(horizontalAngle);
+ m_CameraInfo.cameraPos.z = m_CameraInfo.cameraOrg.z + distance * cos(veriticalAngle) * cos(horizontalAngle);
+ m_CameraInfo.cameraPos.y = m_CameraInfo.cameraOrg.y - distance * sin(veriticalAngle);
+ }
m_3DView = glm::lookAt(m_CameraInfo.cameraPos, // Camera is at (0,0,3), in World Space
m_CameraInfo.cameraOrg, // and looks at the origin
m_CameraInfo.cameraUp // Head is up (set to 0,-1,0 to look upside-down)
@@ -1395,14 +1354,16 @@ int OpenGL3DRenderer::ProcessExtrude3DPickingBox()
extrude3DInfo.yRange[0] *= m_fHeightWeight;
extrude3DInfo.yRange[1] *= m_fHeightWeight;
int reverse = extrude3DInfo.yRange[0] > extrude3DInfo.yRange[1] ? 1 : -1;
- m_CameraInfo.cameraOrg = glm::vec3(extrude3DInfo.xTransform + (extrude3DInfo.xRange[1] - extrude3DInfo.xRange[0]) / 2,
- -extrude3DInfo.yTransform + (extrude3DInfo.yRange[1] - extrude3DInfo.yRange[0]) *reverse,
- extrude3DInfo.zTransform + (extrude3DInfo.xRange[1] - extrude3DInfo.xRange[0]) / 2);
-
- m_CameraInfo.cameraPos.x = m_CameraInfo.cameraOrg.x - distance * cos(veriticalAngle) * sin(horizontalAngle);
- m_CameraInfo.cameraPos.z = m_CameraInfo.cameraOrg.z + distance * cos(veriticalAngle) * cos(horizontalAngle);
- m_CameraInfo.cameraPos.y = m_CameraInfo.cameraOrg.y + distance * sin(horizontalAngle) * reverse;
+ if (m_CameraInfo.useDefault)
+ {
+ m_CameraInfo.cameraOrg = glm::vec3(extrude3DInfo.xTransform + (extrude3DInfo.xRange[1] - extrude3DInfo.xRange[0]) / 2,
+ -extrude3DInfo.yTransform + (extrude3DInfo.yRange[1] - extrude3DInfo.yRange[0]) *reverse,
+ extrude3DInfo.zTransform + (extrude3DInfo.xRange[1] - extrude3DInfo.xRange[0]) / 2);
+ m_CameraInfo.cameraPos.x = m_CameraInfo.cameraOrg.x - distance * cos(veriticalAngle) * sin(horizontalAngle);
+ m_CameraInfo.cameraPos.z = m_CameraInfo.cameraOrg.z + distance * cos(veriticalAngle) * cos(horizontalAngle);
+ m_CameraInfo.cameraPos.y = m_CameraInfo.cameraOrg.y + distance * sin(horizontalAngle) * reverse;
+ }
m_3DView = glm::lookAt(m_CameraInfo.cameraPos, // Camera is at (0,0,3), in World Space
m_CameraInfo.cameraOrg, // and looks at the origin
m_CameraInfo.cameraUp // Head is up (set to 0,-1,0 to look upside-down)
commit 0714c0aba7ceb38ba73e11f6ee00ba876b3f48a0
Author: xukai <xukai at multicorewareinc.com>
Date: Mon May 5 11:54:26 2014 +0800
Initial size of OpenGL3DRenderer
Change-Id: Ibfed531e48848ea711be429d6e5c08094473f781
diff --git a/chart2/source/view/inc/3DChartObjects.hxx b/chart2/source/view/inc/3DChartObjects.hxx
index c953eea..e3165e2 100644
--- a/chart2/source/view/inc/3DChartObjects.hxx
+++ b/chart2/source/view/inc/3DChartObjects.hxx
@@ -30,7 +30,7 @@ public:
virtual void render();
- void getRender();
+ OpenGL3DRenderer* getRender();
protected:
sal_uInt32 mnUniqueId;
@@ -94,7 +94,7 @@ private:
namespace temporary {
-class TemporaryContext
+class TemporaryContext: public opengl3D::Renderable3DObject
{
public:
TemporaryContext();
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx
index abf611e..b31a5ac 100644
--- a/chart2/source/view/inc/GL3DRenderer.hxx
+++ b/chart2/source/view/inc/GL3DRenderer.hxx
@@ -178,6 +178,7 @@ public:
void SetFPS(float fps);
void SetClickPos(Point aMPos);
void RenderClickPos(Point aMPos);
+ void SetSize(const Size& rSize);
private:
void MoveModelf(PosVecf3& trans,PosVecf3& angle,PosVecf3& scale);
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index 17d8111..f7e0eb7 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -25,7 +25,7 @@ void Renderable3DObject::render()
(void) mnUniqueId;
}
-void Renderable3DObject::getRender()
+OpenGL3DRenderer* Renderable3DObject::getRender()
{
if(mPrender==NULL)
{
@@ -33,6 +33,7 @@ void Renderable3DObject::getRender()
mPrender->init();
mPrender->Set3DSenceInfo();
}
+ return mPrender;
}
@@ -73,6 +74,7 @@ Camera::Camera():
namespace temporary {
TemporaryContext::TemporaryContext():
+ Renderable3DObject(-1),
miWidth(200),
miHeight(200)
{
@@ -81,7 +83,9 @@ TemporaryContext::TemporaryContext():
void TemporaryContext::init()
{
maContext.init();
- maContext.setWinSize(Size(miWidth, miHeight));
+ Size winSize(miWidth, miHeight);
+ maContext.setWinSize(winSize);
+ getRender()->SetSize(winSize);
}
void TemporaryContext::render()
diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index 5b1ebe6..baa8cba 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -144,6 +144,12 @@ void OpenGL3DRenderer::init()
m_IsOpenglInit = true;
}
+void OpenGL3DRenderer::SetSize(const Size& rSize)
+{
+ m_iWidth = rSize.Width();
+ m_iHeight = rSize.Height();
+}
+
bool OpenGL3DRenderer::isOpenGLInitialized()
{
return m_IsOpenglInit;
commit 4b6ba1eae6c2bae982190618ed46e9b66a3b2b2a
Author: xukai <xukai at multicorewareinc.com>
Date: Mon May 5 11:06:30 2014 +0800
Initialization of light
Change-Id: I91220e8ebffa0090fa7e9146df853f16b6783491
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx
index 049ea67..abf611e 100644
--- a/chart2/source/view/inc/GL3DRenderer.hxx
+++ b/chart2/source/view/inc/GL3DRenderer.hxx
@@ -160,7 +160,7 @@ public:
void LoadShaders();
void init();
bool isOpenGLInitialized();
- void Set3DSenceInfo(const glm::vec3& cameraUp, sal_Int32 color, bool twoSidesLighting = false);
+ void Set3DSenceInfo(sal_Int32 color = 255, bool twoSidesLighting = true);
void SetLightInfo(bool lightOn, sal_Int32 color, const glm::vec4& direction);
void AddShapePolygon3DObject(sal_Int32 color, bool lineOnly, sal_Int32 lineColor,
long fillStyle, sal_Int32 specular);
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index f3cb166..17d8111 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -31,6 +31,7 @@ void Renderable3DObject::getRender()
{
mPrender = new OpenGL3DRenderer();
mPrender->init();
+ mPrender->Set3DSenceInfo();
}
}
diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index 5a6e17a..5b1ebe6 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -716,11 +716,8 @@ void OpenGL3DRenderer::RenderPolygon3DObject()
return;
}
-void OpenGL3DRenderer::Set3DSenceInfo(const glm::vec3& cameraUp, sal_Int32 color, bool twoSidesLighting)
+void OpenGL3DRenderer::Set3DSenceInfo(sal_Int32 color, bool twoSidesLighting)
{
-
- m_CameraInfo.cameraUp = cameraUp;
-
m_Polygon3DInfo.material.twoSidesLighting = twoSidesLighting;
m_LightsInfo.ambient = glm::vec4((float)(((color) & 0x00FF0000) >> 16) / 255.0f,
@@ -729,10 +726,15 @@ void OpenGL3DRenderer::Set3DSenceInfo(const glm::vec3& cameraUp, sal_Int32 color
1.0);
m_LightsInfo.lightNum = 0;
+ SetLightInfo(true, 255, glm::vec4(1.0, 1.0, 1.0, 0.0));
}
void OpenGL3DRenderer::SetLightInfo(bool lightOn, sal_Int32 color, const glm::vec4& direction)
{
+ if (m_LightsInfo.lightNum > MAX_LIGHT_NUM)
+ {
+ return;
+ }
if (lightOn)
{
m_LightsInfo.light[m_LightsInfo.lightNum].lightColor = glm::vec4((float)(((color) & 0x00FF0000) >> 16) / 255.0f,
commit d3832fc4e030c29eb9b7aef43931c46c66db3bc8
Author: xukai <xukai at multicorewareinc.com>
Date: Mon May 5 10:42:20 2014 +0800
Introduce OpenGL3DRenderer object
Change-Id: If0454ace5ef21b9d32299f3edea115a2726aac00
diff --git a/chart2/source/view/inc/3DChartObjects.hxx b/chart2/source/view/inc/3DChartObjects.hxx
index 0483a74..c953eea 100644
--- a/chart2/source/view/inc/3DChartObjects.hxx
+++ b/chart2/source/view/inc/3DChartObjects.hxx
@@ -13,6 +13,9 @@
#include <vcl/bitmapex.hxx>
#include <vcl/opengl/OpenGLContext.hxx>
+#include "GL3DRenderer.hxx"
+
+
namespace chart {
@@ -27,8 +30,11 @@ public:
virtual void render();
+ void getRender();
+
protected:
sal_uInt32 mnUniqueId;
+ static OpenGL3DRenderer* mPrender;
};
class Bar : public Renderable3DObject
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index 3600f0a..f3cb166 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -13,6 +13,8 @@ namespace chart {
namespace opengl3D {
+OpenGL3DRenderer* Renderable3DObject::mPrender = NULL;
+
Renderable3DObject::Renderable3DObject(sal_uInt32 nId):
mnUniqueId(nId)
{
@@ -23,6 +25,16 @@ void Renderable3DObject::render()
(void) mnUniqueId;
}
+void Renderable3DObject::getRender()
+{
+ if(mPrender==NULL)
+ {
+ mPrender = new OpenGL3DRenderer();
+ mPrender->init();
+ }
+}
+
+
Bar::Bar(const glm::mat4& rPosition, sal_uInt32 nId)
: Renderable3DObject(nId)
, mbRoundedCorners(false)
commit bf293da67847f64fc0cf0acd54a9f4e4e76f9da5
Author: xukai <xukai at multicorewareinc.com>
Date: Mon May 5 10:36:32 2014 +0800
To implement an abstract method:isOpenGLInitialized
Change-Id: I651c0e5830008fd08ba886ccf1be99d40868bb72
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx
index 26c9716..049ea67 100644
--- a/chart2/source/view/inc/GL3DRenderer.hxx
+++ b/chart2/source/view/inc/GL3DRenderer.hxx
@@ -159,7 +159,7 @@ public:
void LoadShaders();
void init();
-
+ bool isOpenGLInitialized();
void Set3DSenceInfo(const glm::vec3& cameraUp, sal_Int32 color, bool twoSidesLighting = false);
void SetLightInfo(bool lightOn, sal_Int32 color, const glm::vec4& direction);
void AddShapePolygon3DObject(sal_Int32 color, bool lineOnly, sal_Int32 lineColor,
@@ -227,7 +227,7 @@ private:
glm::mat4 m_Model;
// Our ModelViewProjection : multiplication of our 3 matrices
glm::mat4 m_MVP;
-
+ bool m_IsOpenglInit;
#if 0
double m_dFreq;
#endif
diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index 762c873..5a6e17a 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -141,8 +141,15 @@ void OpenGL3DRenderer::init()
m_3DProjection = glm::perspective(30.0f, (float)m_iWidth / (float)m_iHeight, 0.01f, 2000.0f);
LoadShaders();
+ m_IsOpenglInit = true;
}
+bool OpenGL3DRenderer::isOpenGLInitialized()
+{
+ return m_IsOpenglInit;
+}
+
+
void OpenGL3DRenderer::AddVertexData(GLuint vertexBuf)
{
glBindBuffer(GL_ARRAY_BUFFER, vertexBuf);
commit 4493860167d998cf03274b6acc7c7959d5738c4b
Author: xukai <xukai at multicorewareinc.com>
Date: Mon May 5 10:28:38 2014 +0800
Update Function Set3DSenceInfo
Change-Id: Ic117de10be2181a80e65ea48c888789456abfb0a
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx
index cc86bee..26c9716 100644
--- a/chart2/source/view/inc/GL3DRenderer.hxx
+++ b/chart2/source/view/inc/GL3DRenderer.hxx
@@ -160,8 +160,7 @@ public:
void LoadShaders();
void init();
- void Set3DSenceInfo(const glm::vec3& cameraUp, const glm::mat4& D3DTrasform,
- bool twoSidesLighting, sal_Int32 color);
+ void Set3DSenceInfo(const glm::vec3& cameraUp, sal_Int32 color, bool twoSidesLighting = false);
void SetLightInfo(bool lightOn, sal_Int32 color, const glm::vec4& direction);
void AddShapePolygon3DObject(sal_Int32 color, bool lineOnly, sal_Int32 lineColor,
long fillStyle, sal_Int32 specular);
diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index 0b210cb..762c873 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -577,7 +577,6 @@ void OpenGL3DRenderer::RenderLine3D(Polygon3DInfo &polygon)
PosVecf3 scale = {1.0f, m_fHeightWeight, 1.0f};
MoveModelf(trans, angle, scale);
- m_3DMVP = m_3DProjection * m_3DView * m_D3DTrasform;
m_3DMVP = m_3DProjection * m_3DView * m_Model;
//if line only, using the common shader to render
@@ -710,13 +709,11 @@ void OpenGL3DRenderer::RenderPolygon3DObject()
return;
}
-void OpenGL3DRenderer::Set3DSenceInfo(const glm::vec3& cameraUp, const glm::mat4& D3DTrasform, bool twoSidesLighting, sal_Int32 color)
+void OpenGL3DRenderer::Set3DSenceInfo(const glm::vec3& cameraUp, sal_Int32 color, bool twoSidesLighting)
{
m_CameraInfo.cameraUp = cameraUp;
- m_D3DTrasform = D3DTrasform;
-
m_Polygon3DInfo.material.twoSidesLighting = twoSidesLighting;
m_LightsInfo.ambient = glm::vec4((float)(((color) & 0x00FF0000) >> 16) / 255.0f,
commit eb0da9b80fa412202200cd5255e0e0eb6a9e38e9
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date: Mon May 5 17:43:59 2014 +0200
fix whitespace issues
Change-Id: I7a3680aa324c4242572b71c91ec5bc4f85eff9e9
diff --git a/chart2/opengl/shape3DFragmentShader.glsl b/chart2/opengl/shape3DFragmentShader.glsl
index f527dd1..5cb521a 100644
--- a/chart2/opengl/shape3DFragmentShader.glsl
+++ b/chart2/opengl/shape3DFragmentShader.glsl
@@ -6,27 +6,27 @@
* 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 330 core
+#version 330 core
#define MAX_LIGHT_NUM 8
in vec3 positionWorldspace;
in vec3 normalCameraspace;
uniform mat4 V;
out vec4 actualColor;
-struct MaterialParameters
-{
- vec4 ambient;
- vec4 diffuse;
- vec4 specular;
+struct MaterialParameters
+{
+ vec4 ambient;
+ vec4 diffuse;
+ vec4 specular;
vec4 materialColor;
-
+
int twoSidesLighting;
float shininess;
float pad;
float pad1;
};
-layout(std140) uniform GlobalMaterialParameters
+layout(std140) uniform GlobalMaterialParameters
{
MaterialParameters matralParameter;
}Material;
@@ -51,23 +51,23 @@ layout(std140) uniform GlobalLights
void main()
{
vec3 colorTotal = vec3(0.0f, 0.0f, 0.0f);
-
+
vec3 vertexPositionCameraspace = (V * vec4(positionWorldspace,1)).xyz;
-
+
vec3 MaterialDiffuseColor = Material.matralParameter.materialColor.rgb;
-
+
vec3 normalDirectionCameraspace = normalCameraspace;
- vec3 eyeDirectionCameraspace = normalize(vec3(0, 0, 0) - vertexPositionCameraspace);
+ vec3 eyeDirectionCameraspace = normalize(vec3(0, 0, 0) - vertexPositionCameraspace);
float attenuation = 1.0;
int i = 0;
vec3 lightDirectionCameraspace;
vec3 vertexToLightSource;
-
+
vec3 lightAmbient = Lights.ambient.rgb *
- MaterialDiffuseColor *
+ MaterialDiffuseColor *
Material.matralParameter.ambient.rgb
* 5.0;
-
+
if ((Material.matralParameter.twoSidesLighting == 1) && (!gl_FrontFacing))
{
normalDirectionCameraspace = -normalDirectionCameraspace;
@@ -76,15 +76,15 @@ void main()
{
float LightPower = Lights.light[i].lightPower;
lightDirectionCameraspace = normalize((V * Lights.light[i].positionWorldspace).xyz);
-
+
float cosTheta = clamp(dot(normalDirectionCameraspace,lightDirectionCameraspace), 0,1);
- vec3 lightDiffuse = LightPower *
- attenuation *
- Lights.light[i].lightColor.rgb *
- MaterialDiffuseColor *
- Material.matralParameter.diffuse.rgb *
+ vec3 lightDiffuse = LightPower *
+ attenuation *
+ Lights.light[i].lightColor.rgb *
+ MaterialDiffuseColor *
+ Material.matralParameter.diffuse.rgb *
cosTheta;
-
+
vec3 specularReflection;
if (dot(normalDirectionCameraspace, lightDirectionCameraspace) < 0)
{
@@ -94,17 +94,18 @@ void main()
{
vec3 R = reflect(-lightDirectionCameraspace,normalDirectionCameraspace);
float cosAlpha = clamp(dot(eyeDirectionCameraspace, R), 0,1);
- specularReflection = attenuation *
- LightPower *
- Lights.light[i].lightColor.rgb *
+ specularReflection = attenuation *
+ LightPower *
+ Lights.light[i].lightColor.rgb *
Material.matralParameter.specular.rgb *
MaterialDiffuseColor *
pow(max(0.0, cosAlpha), Material.matralParameter.shininess);
}
colorTotal += lightDiffuse + specularReflection;
-
+
}
colorTotal += lightAmbient;
actualColor = vec4(colorTotal, 1.0);
}
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/opengl/shape3DVertexShader.glsl b/chart2/opengl/shape3DVertexShader.glsl
index 4587feb..d0bd693 100644
--- a/chart2/opengl/shape3DVertexShader.glsl
+++ b/chart2/opengl/shape3DVertexShader.glsl
@@ -21,9 +21,10 @@ uniform mat3 normalMatrix;
void main()
{
gl_Position = P * V * M * vec4(vertexPositionModelspace,1);
-
+
positionWorldspace = (M * vec4(vertexPositionModelspace,1)).xyz;
normalCameraspace = normalize(mat3(V) * normalMatrix * vertexNormalModelspace);
}
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 8af5e1a9fbd48d173bd1cd98f153428234638707
Author: xukai <xukai at multicorewareinc.com>
Date: Sun May 4 17:05:05 2014 +0800
add vertex shader and fragment shader for 3D rendering
Change-Id: I7b1ca054006500d468da73d2d85eafaad85dda67
diff --git a/chart2/Package_opengl.mk b/chart2/Package_opengl.mk
index ef33ebb..626a50f 100644
--- a/chart2/Package_opengl.mk
+++ b/chart2/Package_opengl.mk
@@ -20,6 +20,8 @@ $(eval $(call gb_Package_add_files,chart2_opengl_shader,$(LIBO_BIN_FOLDER)/openg
symbolVertexShader.glsl \
textFragmentShader.glsl \
textVertexShader.glsl \
+ shape3DFragmentShader.glsl \
+ shape3DVertexShader.glsl \
))
# vim: set noet sw=4 ts=4:
diff --git a/chart2/opengl/shape3DFragmentShader.glsl b/chart2/opengl/shape3DFragmentShader.glsl
new file mode 100644
index 0000000..f527dd1
--- /dev/null
+++ b/chart2/opengl/shape3DFragmentShader.glsl
@@ -0,0 +1,110 @@
+/* -*- 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 330 core
+#define MAX_LIGHT_NUM 8
+
+in vec3 positionWorldspace;
+in vec3 normalCameraspace;
+uniform mat4 V;
+out vec4 actualColor;
+struct MaterialParameters
+{
+ vec4 ambient;
+ vec4 diffuse;
+ vec4 specular;
+ vec4 materialColor;
+
+ int twoSidesLighting;
+ float shininess;
+ float pad;
+ float pad1;
+};
+
+layout(std140) uniform GlobalMaterialParameters
+{
+ MaterialParameters matralParameter;
+}Material;
+
+struct LightSource
+{
+ vec4 lightColor;
+ vec4 positionWorldspace;
+ float lightPower;
+ float pad1;
+ float pad2;
+ float pad3;
+};
+
+layout(std140) uniform GlobalLights
+{
+ int lightNum;
+ vec4 ambient;
+ LightSource light[MAX_LIGHT_NUM];
+} Lights;
+
+void main()
+{
+ vec3 colorTotal = vec3(0.0f, 0.0f, 0.0f);
+
+ vec3 vertexPositionCameraspace = (V * vec4(positionWorldspace,1)).xyz;
+
+ vec3 MaterialDiffuseColor = Material.matralParameter.materialColor.rgb;
+
+ vec3 normalDirectionCameraspace = normalCameraspace;
+ vec3 eyeDirectionCameraspace = normalize(vec3(0, 0, 0) - vertexPositionCameraspace);
+ float attenuation = 1.0;
+ int i = 0;
+ vec3 lightDirectionCameraspace;
+ vec3 vertexToLightSource;
+
+ vec3 lightAmbient = Lights.ambient.rgb *
+ MaterialDiffuseColor *
+ Material.matralParameter.ambient.rgb
+ * 5.0;
+
+ if ((Material.matralParameter.twoSidesLighting == 1) && (!gl_FrontFacing))
+ {
+ normalDirectionCameraspace = -normalDirectionCameraspace;
+ }
+ for (i = 0; i < Lights.lightNum; i++)
+ {
+ float LightPower = Lights.light[i].lightPower;
+ lightDirectionCameraspace = normalize((V * Lights.light[i].positionWorldspace).xyz);
+
+ float cosTheta = clamp(dot(normalDirectionCameraspace,lightDirectionCameraspace), 0,1);
+ vec3 lightDiffuse = LightPower *
+ attenuation *
+ Lights.light[i].lightColor.rgb *
+ MaterialDiffuseColor *
+ Material.matralParameter.diffuse.rgb *
+ cosTheta;
+
+ vec3 specularReflection;
+ if (dot(normalDirectionCameraspace, lightDirectionCameraspace) < 0)
+ {
+ specularReflection = vec3(0.0, 0.0, 0.0);
+ }
+ else
+ {
+ vec3 R = reflect(-lightDirectionCameraspace,normalDirectionCameraspace);
+ float cosAlpha = clamp(dot(eyeDirectionCameraspace, R), 0,1);
+ specularReflection = attenuation *
+ LightPower *
+ Lights.light[i].lightColor.rgb *
+ Material.matralParameter.specular.rgb *
+ MaterialDiffuseColor *
+ pow(max(0.0, cosAlpha), Material.matralParameter.shininess);
+ }
+ colorTotal += lightDiffuse + specularReflection;
+
+ }
+ colorTotal += lightAmbient;
+ actualColor = vec4(colorTotal, 1.0);
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
diff --git a/chart2/opengl/shape3DVertexShader.glsl b/chart2/opengl/shape3DVertexShader.glsl
new file mode 100644
index 0000000..4587feb
--- /dev/null
+++ b/chart2/opengl/shape3DVertexShader.glsl
@@ -0,0 +1,29 @@
+/* -*- 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 330 core
+in vec3 vertexPositionModelspace;
+in vec3 vertexNormalModelspace;
+
+out vec3 positionWorldspace;
+out vec3 normalCameraspace;
+
+uniform mat4 P;
+uniform mat4 M;
+uniform mat4 V;
+uniform mat3 normalMatrix;
+
+void main()
+{
+ gl_Position = P * V * M * vec4(vertexPositionModelspace,1);
+
+ positionWorldspace = (M * vec4(vertexPositionModelspace,1)).xyz;
+
+ normalCameraspace = normalize(mat3(V) * normalMatrix * vertexNormalModelspace);
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index b977654..0b210cb 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -140,6 +140,7 @@ void OpenGL3DRenderer::init()
m_3DProjection = glm::perspective(30.0f, (float)m_iWidth / (float)m_iHeight, 0.01f, 2000.0f);
+ LoadShaders();
}
void OpenGL3DRenderer::AddVertexData(GLuint vertexBuf)
More information about the Libreoffice-commits
mailing list