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:
parent
9f5b2e1659
commit
4f7e1e6846
@ -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);
|
||||||
|
@ -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__
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user