Each mesh now has it's own transform matrix applied, so that our example framework can support breaking a volume into regions.

This commit is contained in:
David Williams 2014-05-23 22:03:57 +02:00
parent 9f5b2e1659
commit 4f7e1e6846
3 changed files with 48 additions and 51 deletions

View File

@ -127,17 +127,14 @@ void OpenGLWidget::paintGL()
//Clear the screen //Clear the screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
QMatrix4x4 modelToWorldMatrix{};
//modelToWorldMatrix.rotate(m_xRotation, 0, 1, 0); //rotate around y-axis
//modelToWorldMatrix.rotate(m_yRotation, 1, 0, 0); //rotate around x-axis
//modelToWorldMatrix.translate(-32, -32, -32); //centre the model on the origin
shader.bind(); shader.bind();
shader.setUniformValue("modelToWorldMatrix", modelToWorldMatrix); //Update to the latest camera matrix
for (OpenGLMeshData meshData : mMeshData) for (OpenGLMeshData meshData : mMeshData)
{ {
QMatrix4x4 modelToWorldMatrix{};
modelToWorldMatrix.translate(meshData.translation.getX(), meshData.translation.getY(), meshData.translation.getZ()); // Centre the model on the origin
shader.setUniformValue("modelToWorldMatrix", modelToWorldMatrix); // Update to the latest camera matrix
glBindVertexArray(meshData.vertexArrayObject); glBindVertexArray(meshData.vertexArrayObject);
glDrawElements(GL_TRIANGLES, meshData.noOfIndices, GL_UNSIGNED_INT, 0); glDrawElements(GL_TRIANGLES, meshData.noOfIndices, GL_UNSIGNED_INT, 0);

View File

@ -37,6 +37,7 @@ struct OpenGLMeshData
GLuint indexBuffer; GLuint indexBuffer;
GLuint vertexBuffer; GLuint vertexBuffer;
GLuint vertexArrayObject; GLuint vertexArrayObject;
PolyVox::Vector3DInt32 translation;
}; };
class OpenGLWidget : public QGLWidget class OpenGLWidget : public QGLWidget
@ -49,43 +50,13 @@ public:
void mouseMoveEvent(QMouseEvent* event); void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event); void mousePressEvent(QMouseEvent* event);
// Convert a SurfaceMesh to OpenGL index/vertex buffers
template <typename MeshType>
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: // Convert a SurfaceMesh to OpenGL index/vertex buffers. Inlined because it's templatised.
template <typename MeshType>
void addMesh(const MeshType& surfaceMesh)
// Qt OpenGL functions {
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
private:
void setupWorldToCameraMatrix();
// Index/vertex buffer data
std::vector<OpenGLMeshData> mMeshData;
QGLShaderProgram shader;
// Mouse data
QPoint m_LastFrameMousePos;
QPoint m_CurrentMousePos;
// Camera setup
PolyVox::Region m_viewableRegion;
int m_xRotation;
int m_yRotation;
};
template <typename MeshType>
void OpenGLWidget::addMesh(const MeshType& surfaceMesh)
{
//Convienient access to the vertices and indices //Convienient access to the vertices and indices
const auto& vecIndices = surfaceMesh.getIndices(); const auto& vecIndices = surfaceMesh.getIndices();
const auto& vecVertices = surfaceMesh.getVertices(); const auto& vecVertices = surfaceMesh.getVertices();
@ -116,7 +87,36 @@ void OpenGLWidget::addMesh(const MeshType& surfaceMesh)
meshData.noOfIndices = vecIndices.size(); //Save this for the call to glDrawElements later meshData.noOfIndices = vecIndices.size(); //Save this for the call to glDrawElements later
meshData.translation = surfaceMesh.m_Region.getLowerCorner();
mMeshData.push_back(meshData); mMeshData.push_back(meshData);
} }
protected:
// Qt OpenGL functions
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
private:
void setupWorldToCameraMatrix();
// Index/vertex buffer data
std::vector<OpenGLMeshData> mMeshData;
QGLShaderProgram shader;
// Mouse data
QPoint m_LastFrameMousePos;
QPoint m_CurrentMousePos;
// Camera setup
PolyVox::Region m_viewableRegion;
int m_xRotation;
int m_yRotation;
};
#endif //__BasicExample_OpenGLWidget_H__ #endif //__BasicExample_OpenGLWidget_H__

View File

@ -78,16 +78,16 @@ int main(int argc, char *argv[])
createSphereInVolume(volData, 30); createSphereInVolume(volData, 30);
// Extract the surface for the specified region of the volume. Uncomment the line for the kind of surface extraction you want to see. // Extract the surface for the specified region of the volume. Uncomment the line for the kind of surface extraction you want to see.
auto mesh = extractCubicMesh(&volData, volData.getEnclosingRegion()); //auto mesh = extractCubicMesh(&volData, volData.getEnclosingRegion());
//auto mesh = extractMarchingCubesMesh(&volData, volData.getEnclosingRegion()); //auto mesh = extractMarchingCubesMesh(&volData, volData.getEnclosingRegion());
//auto mesh = extractCubicMesh(&volData, PolyVox::Region(Vector3DInt32(0, 0, 0), Vector3DInt32(31, 31, 31))); auto mesh = extractCubicMesh(&volData, PolyVox::Region(Vector3DInt32(0, 0, 0), Vector3DInt32(31, 31, 31)));
//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.addMesh(mesh); openGLWidget.addMesh(mesh);
openGLWidget.addMesh(mesh2);
openGLWidget.setViewableRegion(volData.getEnclosingRegion()); openGLWidget.setViewableRegion(volData.getEnclosingRegion());
//openGLWidget.addMesh(mesh2);
//Run the message pump. //Run the message pump.
return app.exec(); return app.exec();