Better templatization of addMesh.
This commit is contained in:
parent
37bdf8e3ac
commit
9f5b2e1659
@ -15,52 +15,6 @@ OpenGLWidget::OpenGLWidget(QWidget *parent)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenGLWidget::setMeshToRender(const PolyVox::Mesh<CubicVertex<uint8_t> >& surfaceMesh)
|
|
||||||
{
|
|
||||||
setMeshToRenderImpl(surfaceMesh);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenGLWidget::setMeshToRender(const PolyVox::Mesh<MarchingCubesVertex<uint8_t> >& surfaceMesh)
|
|
||||||
{
|
|
||||||
setMeshToRenderImpl(surfaceMesh);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename MeshType>
|
|
||||||
void OpenGLWidget::setMeshToRenderImpl(const MeshType& surfaceMesh)
|
|
||||||
{
|
|
||||||
//Convienient access to the vertices and indices
|
|
||||||
const auto& vecIndices = surfaceMesh.getIndices();
|
|
||||||
const auto& vecVertices = surfaceMesh.getVertices();
|
|
||||||
|
|
||||||
// This struct holds the OpenGL properties (buffer handles, etc) which will be used
|
|
||||||
// to render our mesh. We copy the data from the PolyVox mesh into this structure.
|
|
||||||
OpenGLMeshData meshData;
|
|
||||||
|
|
||||||
//Create the VAO for the mesh
|
|
||||||
glGenVertexArrays(1, &(meshData.vertexArrayObject));
|
|
||||||
glBindVertexArray(meshData.vertexArrayObject);
|
|
||||||
|
|
||||||
//The GL_ARRAY_BUFFER will contain the list of vertex positions
|
|
||||||
glGenBuffers(1, &(meshData.vertexBuffer));
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, meshData.vertexBuffer);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, vecVertices.size() * sizeof(CubicVertex<uint8_t>), vecVertices.data(), GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
//and GL_ELEMENT_ARRAY_BUFFER will contain the indices
|
|
||||||
glGenBuffers(1, &(meshData.indexBuffer));
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, meshData.indexBuffer);
|
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vecIndices.size() * sizeof(uint32_t), vecIndices.data(), GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
//We need to tell OpenGL how to understand the format of the vertex data
|
|
||||||
glEnableVertexAttribArray(0); //We're talking about shader attribute '0'
|
|
||||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(CubicVertex<uint8_t>), 0); //take the first 3 floats from every sizeof(decltype(vecVertices)::value_type)
|
|
||||||
|
|
||||||
glBindVertexArray(0);
|
|
||||||
|
|
||||||
meshData.noOfIndices = vecIndices.size(); //Save this for the call to glDrawElements later
|
|
||||||
|
|
||||||
mMeshData.push_back(meshData);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenGLWidget::setViewableRegion(Region viewableRegion)
|
void OpenGLWidget::setViewableRegion(Region viewableRegion)
|
||||||
{
|
{
|
||||||
m_viewableRegion = viewableRegion;
|
m_viewableRegion = viewableRegion;
|
||||||
|
@ -50,15 +50,14 @@ public:
|
|||||||
void mousePressEvent(QMouseEvent* event);
|
void mousePressEvent(QMouseEvent* event);
|
||||||
|
|
||||||
// Convert a SurfaceMesh to OpenGL index/vertex buffers
|
// Convert a SurfaceMesh to OpenGL index/vertex buffers
|
||||||
void setMeshToRender(const PolyVox::Mesh<PolyVox::CubicVertex<uint8_t> >& surfaceMesh);
|
template <typename MeshType>
|
||||||
void setMeshToRender(const PolyVox::Mesh<PolyVox::MarchingCubesVertex<uint8_t> >& surfaceMesh);
|
void addMesh(const MeshType& surfaceMesh);
|
||||||
|
|
||||||
// The viewable region can be adjusted so that this example framework can be use for different volume sizes.
|
// The viewable region can be adjusted so that this example framework can be use for different volume sizes.
|
||||||
void setViewableRegion(PolyVox::Region viewableRegion);
|
void setViewableRegion(PolyVox::Region viewableRegion);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
template <typename MeshType>
|
|
||||||
void setMeshToRenderImpl(const MeshType& surfaceMesh);
|
|
||||||
|
|
||||||
// Qt OpenGL functions
|
// Qt OpenGL functions
|
||||||
void initializeGL();
|
void initializeGL();
|
||||||
@ -84,4 +83,40 @@ private:
|
|||||||
int m_yRotation;
|
int m_yRotation;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename MeshType>
|
||||||
|
void OpenGLWidget::addMesh(const MeshType& surfaceMesh)
|
||||||
|
{
|
||||||
|
//Convienient access to the vertices and indices
|
||||||
|
const auto& vecIndices = surfaceMesh.getIndices();
|
||||||
|
const auto& vecVertices = surfaceMesh.getVertices();
|
||||||
|
|
||||||
|
// This struct holds the OpenGL properties (buffer handles, etc) which will be used
|
||||||
|
// to render our mesh. We copy the data from the PolyVox mesh into this structure.
|
||||||
|
OpenGLMeshData meshData;
|
||||||
|
|
||||||
|
//Create the VAO for the mesh
|
||||||
|
glGenVertexArrays(1, &(meshData.vertexArrayObject));
|
||||||
|
glBindVertexArray(meshData.vertexArrayObject);
|
||||||
|
|
||||||
|
//The GL_ARRAY_BUFFER will contain the list of vertex positions
|
||||||
|
glGenBuffers(1, &(meshData.vertexBuffer));
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, meshData.vertexBuffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, vecVertices.size() * sizeof(CubicVertex<uint8_t>), vecVertices.data(), GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
//and GL_ELEMENT_ARRAY_BUFFER will contain the indices
|
||||||
|
glGenBuffers(1, &(meshData.indexBuffer));
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, meshData.indexBuffer);
|
||||||
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vecIndices.size() * sizeof(uint32_t), vecIndices.data(), GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
//We need to tell OpenGL how to understand the format of the vertex data
|
||||||
|
glEnableVertexAttribArray(0); //We're talking about shader attribute '0'
|
||||||
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(CubicVertex<uint8_t>), 0); //take the first 3 floats from every sizeof(decltype(vecVertices)::value_type)
|
||||||
|
|
||||||
|
glBindVertexArray(0);
|
||||||
|
|
||||||
|
meshData.noOfIndices = vecIndices.size(); //Save this for the call to glDrawElements later
|
||||||
|
|
||||||
|
mMeshData.push_back(meshData);
|
||||||
|
}
|
||||||
|
|
||||||
#endif //__BasicExample_OpenGLWidget_H__
|
#endif //__BasicExample_OpenGLWidget_H__
|
||||||
|
@ -85,9 +85,9 @@ int main(int argc, char *argv[])
|
|||||||
//auto mesh2 = extractCubicMesh(&volData, PolyVox::Region(Vector3DInt32(32, 32, 32), Vector3DInt32(63, 63, 63)));
|
//auto mesh2 = extractCubicMesh(&volData, PolyVox::Region(Vector3DInt32(32, 32, 32), Vector3DInt32(63, 63, 63)));
|
||||||
|
|
||||||
//Pass the surface to the OpenGL window
|
//Pass the surface to the OpenGL window
|
||||||
openGLWidget.setMeshToRender(mesh);
|
openGLWidget.addMesh(mesh);
|
||||||
openGLWidget.setViewableRegion(volData.getEnclosingRegion());
|
openGLWidget.setViewableRegion(volData.getEnclosingRegion());
|
||||||
//openGLWidget.setMeshToRender(mesh2);
|
//openGLWidget.addMesh(mesh2);
|
||||||
|
|
||||||
//Run the message pump.
|
//Run the message pump.
|
||||||
return app.exec();
|
return app.exec();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user