From 37bdf8e3ac2a4dc5f72298b605859e2d7ff61741 Mon Sep 17 00:00:00 2001 From: David Williams Date: Fri, 23 May 2014 16:26:56 +0200 Subject: [PATCH] Templatised code for example mesh conversion. --- examples/Basic/OpenGLWidget.cpp | 23 +++++++++++++++++------ examples/Basic/OpenGLWidget.h | 4 ++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/examples/Basic/OpenGLWidget.cpp b/examples/Basic/OpenGLWidget.cpp index 7fb5f2cb..badf1cba 100644 --- a/examples/Basic/OpenGLWidget.cpp +++ b/examples/Basic/OpenGLWidget.cpp @@ -16,6 +16,17 @@ OpenGLWidget::OpenGLWidget(QWidget *parent) } void OpenGLWidget::setMeshToRender(const PolyVox::Mesh >& surfaceMesh) +{ + setMeshToRenderImpl(surfaceMesh); +} + +void OpenGLWidget::setMeshToRender(const PolyVox::Mesh >& surfaceMesh) +{ + setMeshToRenderImpl(surfaceMesh); +} + +template +void OpenGLWidget::setMeshToRenderImpl(const MeshType& surfaceMesh) { //Convienient access to the vertices and indices const auto& vecIndices = surfaceMesh.getIndices(); @@ -24,27 +35,27 @@ void OpenGLWidget::setMeshToRender(const PolyVox::Mesh >& s // 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), 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), 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); diff --git a/examples/Basic/OpenGLWidget.h b/examples/Basic/OpenGLWidget.h index 266ee0e6..8e6f048c 100644 --- a/examples/Basic/OpenGLWidget.h +++ b/examples/Basic/OpenGLWidget.h @@ -51,11 +51,15 @@ public: // Convert a SurfaceMesh to OpenGL index/vertex buffers void setMeshToRender(const PolyVox::Mesh >& surfaceMesh); + void setMeshToRender(const PolyVox::Mesh >& surfaceMesh); // The viewable region can be adjusted so that this example framework can be use for different volume sizes. void setViewableRegion(PolyVox::Region viewableRegion); protected: + template + void setMeshToRenderImpl(const MeshType& surfaceMesh); + // Qt OpenGL functions void initializeGL(); void resizeGL(int w, int h);