summaryrefslogtreecommitdiff
path: root/chart2
diff options
context:
space:
mode:
authorxukai <xukai@multicorewareinc.com>2014-05-06 09:43:08 +0800
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-05-06 07:25:51 +0200
commit3176300bb3ee3b21efb60e667d94d4dc74120a3d (patch)
tree14a6ece1e80fba1c6973036f9aa13d11d1e225ea /chart2
parentf518ed3f04342ef18b15c982fec31c8a898b9048 (diff)
add api for render non rouded bar
Change-Id: I16bb4ec77cccf0ff9e73f02e13288562004eb5bc
Diffstat (limited to 'chart2')
-rw-r--r--chart2/source/view/inc/GL3DRenderer.hxx5
-rw-r--r--chart2/source/view/inc/StaticGeometry.h50
-rw-r--r--chart2/source/view/main/GL3DRenderer.cxx122
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);