diff options
author | xukai <xukai@multicorewareinc.com> | 2014-05-05 12:25:42 +0800 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-05-05 17:57:20 +0200 |
commit | 4e8a9d669f835cb2f1df3efc9b41d86d51af90d7 (patch) | |
tree | 5db9a48e6bd5dbbe1753cdd161afec29f692b1fe /chart2 | |
parent | 0714c0aba7ceb38ba73e11f6ee00ba876b3f48a0 (diff) |
add codes to set camera info
Change-Id: Id6bac3a8dd46d7994c9e64c9e0c16e8c7ac036ac
Diffstat (limited to 'chart2')
-rw-r--r-- | chart2/source/view/inc/3DChartObjects.hxx | 1 | ||||
-rw-r--r-- | chart2/source/view/inc/GL3DRenderer.hxx | 3 | ||||
-rw-r--r-- | chart2/source/view/main/3DChartObjects.cxx | 2 | ||||
-rw-r--r-- | chart2/source/view/main/GL3DRenderer.cxx | 121 |
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) |