diff options
author | xukai <xukai@multicorewareinc.com> | 2014-05-06 09:43:08 +0800 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-05-06 07:25:51 +0200 |
commit | 3176300bb3ee3b21efb60e667d94d4dc74120a3d (patch) | |
tree | 14a6ece1e80fba1c6973036f9aa13d11d1e225ea /chart2 | |
parent | f518ed3f04342ef18b15c982fec31c8a898b9048 (diff) |
add api for render non rouded bar
Change-Id: I16bb4ec77cccf0ff9e73f02e13288562004eb5bc
Diffstat (limited to 'chart2')
-rw-r--r-- | chart2/source/view/inc/GL3DRenderer.hxx | 5 | ||||
-rw-r--r-- | chart2/source/view/inc/StaticGeometry.h | 50 | ||||
-rw-r--r-- | chart2/source/view/main/GL3DRenderer.cxx | 122 |
3 files changed, 133 insertions, 44 deletions
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index bc2b32309f99..58bf6890aea3 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -91,6 +91,7 @@ typedef struct Polygon3DInfo typedef struct Extrude3DInfo { int pickingFlg; + bool rounded; bool lineOnly; float lineWidth; bool twoSidesLighting; @@ -98,6 +99,7 @@ typedef struct Extrude3DInfo long fillStyle; float xRange[2]; float yRange[2]; + float zRange[2]; float xTransform; float yTransform; float zTransform; @@ -218,6 +220,7 @@ private: void AddVertexData(GLuint vertexBuf); void AddNormalData(GLuint normalBuf); void AddIndexData(GLuint indexBuf); + void RenderNonRoundedBar(const Extrude3DInfo& extrude3D); bool GetSimilarVertexIndex(PackedVertex & packed, std::map<PackedVertex,unsigned short> & VertexToOutIndex, unsigned short & result @@ -322,7 +325,7 @@ private: Point m_aMPos; GLuint m_BoundBox; - + GLuint m_BoundBoxNormal; // add for text std::list <TextInfo> m_TextInfoList; GLint m_TextProID; diff --git a/chart2/source/view/inc/StaticGeometry.h b/chart2/source/view/inc/StaticGeometry.h index 99a3f9d6f55a..2ee0446a60f8 100644 --- a/chart2/source/view/inc/StaticGeometry.h +++ b/chart2/source/view/inc/StaticGeometry.h @@ -54,6 +54,56 @@ static GLfloat boundBox[] = { 1.0f, 0.0f, 1.0f//12 }; +static const GLfloat boundBoxNormal[] = { + -1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f,//1 + + -1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f,//2 + + 0.0f, 0.0f, -1.0f, + 0.0f, 0.0f, -1.0f, + 0.0f, 0.0f, -1.0f,//3 + + 0.0f, 0.0f, -1.0f, + 0.0f, 0.0f, -1.0f, + 0.0f, 0.0f, -1.0f,//4 + + 0.0f, -1.0f, 0.0f, + 0.0f, -1.0f, 0.0f, + 0.0f,- 1.0f, 0.0f,//5 + + 0.0f, -1.0f, 0.0f, + 0.0f, -1.0f, 0.0f, + 0.0f, -1.0f, 0.0f,//6 + + 0.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 0.0f,//7 + + 0.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 0.0f,//8 + + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f,//9 + + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f,//10 + + 1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f,//11 + + 1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f//12 +}; + GLfloat coordinateAxis[] = { -1.0, 0.0, 0.0, 1.0, 0.0, 0.0,//x diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 682e8979f33a..9fdf6f49477b 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -79,12 +79,6 @@ OpenGL3DRenderer::OpenGL3DRenderer(): m_bCameraUpdated = false; GetFreq(); - - for (int i = 0; i < 5; i++) - { - m_Extrude3DInfo.startIndex[i] = m_RoundBarMesh.iElementStartIndices[i]; - m_Extrude3DInfo.size[i] = m_RoundBarMesh.iElementSizes[i]; - } m_fViewAngle = 30.0f; m_SenceBox.maxXCoord = -1.0 * FLT_MAX; m_SenceBox.minXCoord = FLT_MAX; @@ -96,6 +90,7 @@ OpenGL3DRenderer::OpenGL3DRenderer(): m_fHeightWeight = 1.0f; m_CameraInfo.useDefault = true; m_CameraInfo.cameraUp = glm::vec3(0, 1, 0); + m_RoundBarMesh.iMeshSizes = 0; } namespace { @@ -176,25 +171,18 @@ void OpenGL3DRenderer::init() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glGenBuffers(1, &m_CubeVertexBuf); - AddVertexData(m_CubeVertexBuf); - glGenBuffers(1, &m_CubeNormalBuf); - AddNormalData(m_CubeNormalBuf); - glGenBuffers(1, &m_CubeElementBuf); - AddIndexData(m_CubeElementBuf); - - for (int i = 0; i < 5; i++) - { - m_Extrude3DInfo.startIndex[i] = m_RoundBarMesh.iElementStartIndices[i]; - m_Extrude3DInfo.size[i] = m_RoundBarMesh.iElementSizes[i]; - } - glGenBuffers(1, &m_BoundBox); glBindBuffer(GL_ARRAY_BUFFER, m_BoundBox); glBufferData(GL_ARRAY_BUFFER, sizeof(boundBox), boundBox, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); + glGenBuffers(1, &m_BoundBoxNormal); + glBindBuffer(GL_ARRAY_BUFFER, m_BoundBoxNormal); + glBufferData(GL_ARRAY_BUFFER, sizeof(boundBoxNormal), boundBoxNormal, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glGenBuffers(1, &m_CoordinateBuf); glBindBuffer(GL_ARRAY_BUFFER, m_CoordinateBuf); glBufferData(GL_ARRAY_BUFFER, sizeof(coordinateAxis), coordinateAxis, GL_STATIC_DRAW); @@ -949,11 +937,15 @@ void OpenGL3DRenderer::AddExtrude3DObjectPoint(float x, float y, float z) m_Extrude3DInfo.xRange[1] = x; m_Extrude3DInfo.yRange[0] = y; m_Extrude3DInfo.yRange[1] = y; + m_Extrude3DInfo.zRange[0] = z; + m_Extrude3DInfo.zRange[1] = z; } m_Extrude3DInfo.xRange[0] = std::min(m_Extrude3DInfo.xRange[0], x); m_Extrude3DInfo.xRange[1] = std::max(m_Extrude3DInfo.xRange[1], x); m_Extrude3DInfo.yRange[0] = std::min(m_Extrude3DInfo.yRange[0], y); m_Extrude3DInfo.yRange[1] = std::max(m_Extrude3DInfo.yRange[1], y); + m_Extrude3DInfo.zRange[0] = std::min(m_Extrude3DInfo.zRange[0], z); + m_Extrude3DInfo.zRange[1] = std::max(m_Extrude3DInfo.zRange[1], z); m_iPointNum++; } @@ -1128,6 +1120,28 @@ void OpenGL3DRenderer::RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D) RenderExtrudeFlatSurface(extrude3D, FLAT_BOTTOM_SURFACE); } +void OpenGL3DRenderer::RenderNonRoundedBar(const Extrude3DInfo& extrude3D) +{ + float xScale = extrude3D.xRange[1] - extrude3D.xRange[0]; + float yScale = extrude3D.yRange[1] - extrude3D.yRange[0]; + float zScale = extrude3D.zRange[1] - extrude3D.zRange[0]; + glUniformMatrix4fv(m_3DViewID, 1, GL_FALSE, &m_3DView[0][0]); + glUniformMatrix4fv(m_3DProjectionID, 1, GL_FALSE, &m_3DProjection[0][0]); + glm::mat4 transformMatrix = glm::translate(glm::vec3(extrude3D.xTransform, -extrude3D.yTransform, extrude3D.zTransform)); + glm::mat4 scaleMatrix = glm::scale(xScale, yScale, zScale); + m_Model = transformMatrix * scaleMatrix; + if (extrude3D.reverse) + { + glm::mat4 reverseMatrix = glm::translate(glm::vec3(0.0, -1.0, 0.0)); + m_Model = m_Model * reverseMatrix; + } + glm::mat3 normalMatrix(m_Model); + glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix); + glUniformMatrix4fv(m_3DModelID, 1, GL_FALSE, &m_Model[0][0]); + glUniformMatrix3fv(m_3DNormalMatrixID, 1, GL_FALSE, &normalInverseTranspos[0][0]); + glDrawArrays(GL_TRIANGLES, 0, 36); +} + void OpenGL3DRenderer::RenderExtrudeSurface(const Extrude3DInfo& extrude3D) { glUniformMatrix4fv(m_3DViewID, 1, GL_FALSE, &m_3DView[0][0]); @@ -1154,32 +1168,46 @@ void OpenGL3DRenderer::RenderExtrude3DObject() Update3DUniformBlock(); //render to fbo glUseProgram(m_3DProID); - - // 1rst attribute buffer : vertices - glEnableVertexAttribArray(m_3DVertexID); - glBindBuffer(GL_ARRAY_BUFFER, m_CubeVertexBuf); - glVertexAttribPointer(m_3DVertexID, // 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 : normals - glEnableVertexAttribArray(m_3DNormalID); - glBindBuffer(GL_ARRAY_BUFFER, m_CubeNormalBuf); - glVertexAttribPointer(m_3DNormalID, // 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 - ); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_CubeElementBuf); size_t extrude3DNum = m_Extrude3DList.size(); for (size_t i = 0; i < extrude3DNum; i++) { Extrude3DInfo extrude3DInfo = m_Extrude3DList[i]; + if (extrude3DInfo.rounded && (m_RoundBarMesh.iMeshSizes == 0)) + { + float xScale = extrude3DInfo.xRange[1] - extrude3DInfo.xRange[0]; + float zScale = extrude3DInfo.zRange[1] - extrude3DInfo.zRange[0]; + CreateActualRoundedCube(0.1f, 30, 30, 1.0f, 1.2f, zScale / xScale); + AddVertexData(m_CubeVertexBuf); + AddNormalData(m_CubeNormalBuf); + AddIndexData(m_CubeElementBuf); + for (int i = 0; i < 5; i++) + { + m_Extrude3DInfo.startIndex[i] = m_RoundBarMesh.iElementStartIndices[i]; + m_Extrude3DInfo.size[i] = m_RoundBarMesh.iElementSizes[i]; + } + } + GLuint vertexBuf = extrude3DInfo.rounded ? m_CubeVertexBuf : m_BoundBox; + GLuint normalBuf = extrude3DInfo.rounded ? m_CubeNormalBuf : m_BoundBoxNormal; + // 1st attribute buffer : vertices + glEnableVertexAttribArray(m_3DVertexID); + glBindBuffer(GL_ARRAY_BUFFER, vertexBuf); + glVertexAttribPointer(m_3DVertexID, // 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 : normals + glEnableVertexAttribArray(m_3DNormalID); + glBindBuffer(GL_ARRAY_BUFFER, normalBuf); + glVertexAttribPointer(m_3DNormalID, // 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 + ); extrude3DInfo.yTransform *= m_fHeightWeight; extrude3DInfo.yRange[0] *= m_fHeightWeight; extrude3DInfo.yRange[1] *= m_fHeightWeight; @@ -1188,11 +1216,19 @@ void OpenGL3DRenderer::RenderExtrude3DObject() CHECK_GL_ERROR(); glBindBuffer(GL_UNIFORM_BUFFER, 0); extrude3DInfo.reverse = -extrude3DInfo.yRange[0] > extrude3DInfo.yRange[1] ? 0 : 1; - RenderExtrudeSurface(extrude3DInfo); + if (extrude3DInfo.rounded) + { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_CubeElementBuf); + RenderExtrudeSurface(extrude3DInfo); + } + else + { + RenderNonRoundedBar(extrude3DInfo); + } + glDisableVertexAttribArray(m_3DVertexID); + glDisableVertexAttribArray(m_3DNormalID); } m_Extrude3DList.clear(); - glDisableVertexAttribArray(m_3DVertexID); - glDisableVertexAttribArray(m_3DNormalID); glUseProgram(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glDisable(GL_CULL_FACE); |