summaryrefslogtreecommitdiff
path: root/chart2
diff options
context:
space:
mode:
authorxukai <xukai@multicorewareinc.com>2014-05-05 12:25:42 +0800
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-05-05 17:57:20 +0200
commit4e8a9d669f835cb2f1df3efc9b41d86d51af90d7 (patch)
tree5db9a48e6bd5dbbe1753cdd161afec29f692b1fe /chart2
parent0714c0aba7ceb38ba73e11f6ee00ba876b3f48a0 (diff)
add codes to set camera info
Change-Id: Id6bac3a8dd46d7994c9e64c9e0c16e8c7ac036ac
Diffstat (limited to 'chart2')
-rw-r--r--chart2/source/view/inc/3DChartObjects.hxx1
-rw-r--r--chart2/source/view/inc/GL3DRenderer.hxx3
-rw-r--r--chart2/source/view/main/3DChartObjects.cxx2
-rw-r--r--chart2/source/view/main/GL3DRenderer.cxx121
4 files changed, 46 insertions, 81 deletions
diff --git a/chart2/source/view/inc/3DChartObjects.hxx b/chart2/source/view/inc/3DChartObjects.hxx
index e3165e29a149..1fa9402bf8fb 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 b31a5ac2f010..5f66203a13ce 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 f7e0eb7f7902..6148f037f4ea 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 baa8cbab1a2e..651fca461bff 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)