diff --git a/examples/SmoothLOD/CMakeLists.txt b/examples/SmoothLOD/CMakeLists.txt index 570cda55..55c9e934 100644 --- a/examples/SmoothLOD/CMakeLists.txt +++ b/examples/SmoothLOD/CMakeLists.txt @@ -26,7 +26,7 @@ PROJECT(SmoothLODExample) #Projects source files SET(SRC_FILES main.cpp - OpenGLWidget.cpp + ../common/OpenGLWidget.cpp ) #Projects headers files diff --git a/examples/SmoothLOD/OpenGLWidget.cpp b/examples/SmoothLOD/OpenGLWidget.cpp deleted file mode 100644 index d487f73b..00000000 --- a/examples/SmoothLOD/OpenGLWidget.cpp +++ /dev/null @@ -1,195 +0,0 @@ -#include "OpenGLWidget.h" - -#include - -using namespace PolyVox; -using namespace std; - -OpenGLWidget::OpenGLWidget(QWidget *parent) - :QGLWidget(parent) - ,m_uBeginIndex(0) - ,m_uEndIndex(0) - ,indexBuffer(0) - ,vertexBuffer(0) - - ,m_uBeginIndexLow(0) - ,m_uEndIndexLow(0) - ,indexBufferLow(0) - ,vertexBufferLow(0) - ,m_xRotation(0) - ,m_yRotation(0) -{ -} - -void OpenGLWidget::setMeshToRender(const PolyVox::Mesh >& surfaceMesh) -{ - //Convienient access to the vertices and indices - const vector& vecIndices = surfaceMesh.getIndices(); - const vector >& vecVertices = surfaceMesh.getVertices(); - - //Build an OpenGL index buffer - glGenBuffers(1, &indexBuffer); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); - const GLvoid* pIndices = static_cast(&(vecIndices[0])); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, vecIndices.size() * sizeof(uint32_t), pIndices, GL_STATIC_DRAW); - - //Build an OpenGL vertex buffer - glGenBuffers(1, &vertexBuffer); - glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); - const GLvoid* pVertices = static_cast(&(vecVertices[0])); - glBufferData(GL_ARRAY_BUFFER, vecVertices.size() * sizeof(MarchingCubesVertex), pVertices, GL_STATIC_DRAW); - - m_uBeginIndex = 0; - m_uEndIndex = vecIndices.size(); -} - -void OpenGLWidget::setMeshToRenderLowLOD(const PolyVox::Mesh >& surfaceMesh) -{ - //Convienient access to the vertices and indices - const vector& vecIndices = surfaceMesh.getIndices(); - const vector >& vecVertices = surfaceMesh.getVertices(); - - //Build an OpenGL index buffer - glGenBuffers(1, &indexBufferLow); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferLow); - const GLvoid* pIndices = static_cast(&(vecIndices[0])); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, vecIndices.size() * sizeof(uint32_t), pIndices, GL_STATIC_DRAW); - - //Build an OpenGL vertex buffer - glGenBuffers(1, &vertexBufferLow); - glBindBuffer(GL_ARRAY_BUFFER, vertexBufferLow); - const GLvoid* pVertices = static_cast(&(vecVertices[0])); - glBufferData(GL_ARRAY_BUFFER, vecVertices.size() * sizeof(MarchingCubesVertex), pVertices, GL_STATIC_DRAW); - - m_uBeginIndexLow = 0; - m_uEndIndexLow = vecIndices.size(); -} - -void OpenGLWidget::initializeGL() -{ - //We need GLEW to access recent OpenGL functionality - std::cout << "Initialising GLEW..."; - GLenum result = glewInit(); - if (result == GLEW_OK) - { - std::cout << "success" << std::endl; - } - else - { - /* Problem: glewInit failed, something is seriously wrong. */ - std::cout << "failed" << std::endl; - std::cout << "Initialising GLEW failed with the following error: " << glewGetErrorString(result) << std::endl; - exit(EXIT_FAILURE); - } - - //Print out some information about the OpenGL implementation. - std::cout << "OpenGL Implementation Details:" << std::endl; - if(glGetString(GL_VENDOR)) - std::cout << "\tGL_VENDOR: " << glGetString(GL_VENDOR) << std::endl; - if(glGetString(GL_RENDERER)) - std::cout << "\tGL_RENDERER: " << glGetString(GL_RENDERER) << std::endl; - if(glGetString(GL_VERSION)) - std::cout << "\tGL_VERSION: " << glGetString(GL_VERSION) << std::endl; - if(glGetString(GL_SHADING_LANGUAGE_VERSION)) - std::cout << "\tGL_SHADING_LANGUAGE_VERSION: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl; - - //Check our version of OpenGL is recent enough. - //We need at least 1.5 for vertex buffer objects, - if (!GLEW_VERSION_1_5) - { - std::cout << "Error: You need OpenGL version 1.5 to run this example." << std::endl; - exit(EXIT_FAILURE); - } - - //Set up the clear colour - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClearDepth(1.0f); - - //Enable the depth buffer - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LEQUAL); - - //Anable smooth lighting - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glShadeModel(GL_SMOOTH); - - //We'll be rendering with index/vertex arrays - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - - glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); -} - -void OpenGLWidget::resizeGL(int w, int h) -{ - //Setup the viewport - glViewport(0, 0, w, h); - - //Set up the projection matrix - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - float frustumSize = 32.0f; //Half the volume size - float aspect = static_cast(width()) / static_cast(height()); - glOrtho(frustumSize*aspect, -frustumSize*aspect, frustumSize, -frustumSize, 1.0, 1000); -} - -void OpenGLWidget::paintGL() -{ - //Clear the screen - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - //Set up the viewing transformation - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f,0.0f,-100.0f); //Centre volume and move back - glRotatef(-m_xRotation, 0.0f, 1.0f, 0.0f); - glRotatef(-m_yRotation, 1.0f, 0.0f, 0.0f); - glTranslatef(-32.0f,-32.0f,-32.0f); //Centre volume and move back - - //Bind the index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); - - //Bind the vertex buffer - glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); - glVertexPointer(3, GL_FLOAT, sizeof(MarchingCubesVertex), 0); - glNormalPointer(GL_FLOAT, sizeof(MarchingCubesVertex), (GLvoid*)12); - - glDrawRangeElements(GL_TRIANGLES, m_uBeginIndex, m_uEndIndex-1, m_uEndIndex - m_uBeginIndex, GL_UNSIGNED_INT, 0); - - //Bind the index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferLow); - - //Bind the vertex buffer - glBindBuffer(GL_ARRAY_BUFFER, vertexBufferLow); - glVertexPointer(3, GL_FLOAT, sizeof(MarchingCubesVertex), 0); - glNormalPointer(GL_FLOAT, sizeof(MarchingCubesVertex), (GLvoid*)12); - - glDrawRangeElements(GL_TRIANGLES, m_uBeginIndexLow, m_uEndIndexLow-1, m_uEndIndexLow - m_uBeginIndexLow, GL_UNSIGNED_INT, 0); - - GLenum errCode = glGetError(); - if(errCode != GL_NO_ERROR) - { - //What has replaced getErrorString() in the latest OpenGL? - std::cout << "OpenGL Error: " << errCode << std::endl; - } -} - -void OpenGLWidget::mousePressEvent(QMouseEvent* event) -{ - m_CurrentMousePos = event->pos(); - m_LastFrameMousePos = m_CurrentMousePos; - - update(); -} - -void OpenGLWidget::mouseMoveEvent(QMouseEvent* event) -{ - m_CurrentMousePos = event->pos(); - QPoint diff = m_CurrentMousePos - m_LastFrameMousePos; - m_xRotation += diff.x(); - m_yRotation += diff.y(); - m_LastFrameMousePos = m_CurrentMousePos; - - update(); -} diff --git a/examples/SmoothLOD/OpenGLWidget.h b/examples/SmoothLOD/OpenGLWidget.h deleted file mode 100644 index af5b96ee..00000000 --- a/examples/SmoothLOD/OpenGLWidget.h +++ /dev/null @@ -1,74 +0,0 @@ -/******************************************************************************* -Copyright (c) 2005-2009 David Williams - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not -claim that you wrote the original software. If you use this software -in a product, an acknowledgment in the product documentation would be -appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must not be -misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*******************************************************************************/ - -#ifndef __BasicExample_OpenGLWidget_H__ -#define __BasicExample_OpenGLWidget_H__ - -#include "PolyVoxCore/Mesh.h" - -#include "glew/glew.h" - -#include - -class OpenGLWidget : public QGLWidget -{ -public: - //Constructor - OpenGLWidget(QWidget *parent); - - //Mouse handling - void mouseMoveEvent(QMouseEvent* event); - void mousePressEvent(QMouseEvent* event); - - //Convert a SrfaceMesh to OpenGL index/vertex buffers - void setMeshToRender(const PolyVox::Mesh >& surfaceMesh); - void setMeshToRenderLowLOD(const PolyVox::Mesh >& surfaceMesh); - -protected: - //Qt OpenGL functions - void initializeGL(); - void resizeGL(int w, int h); - void paintGL(); - -private: - //Index/vertex buffer data - GLuint m_uBeginIndex; - GLuint m_uEndIndex; - //GLuint noOfIndices; - GLuint indexBuffer; - GLuint vertexBuffer; - - GLuint m_uBeginIndexLow; - GLuint m_uEndIndexLow; - //GLuint noOfIndicesLow; - GLuint indexBufferLow; - GLuint vertexBufferLow; - - //Mouse data - QPoint m_LastFrameMousePos; - QPoint m_CurrentMousePos; - int m_xRotation; - int m_yRotation; -}; - -#endif //__BasicExample_OpenGLWidget_H__ diff --git a/examples/SmoothLOD/main.cpp b/examples/SmoothLOD/main.cpp index a0dc6dcd..e38dff25 100644 --- a/examples/SmoothLOD/main.cpp +++ b/examples/SmoothLOD/main.cpp @@ -98,8 +98,10 @@ int main(int argc, char *argv[]) meshHighLOD.translateVertices(Vector3DFloat(30, 0, 0)); //Pass the surface to the OpenGL window - openGLWidget.setMeshToRender(meshHighLOD); - openGLWidget.setMeshToRenderLowLOD(meshLowLOD); + openGLWidget.addMesh(meshHighLOD); + openGLWidget.addMesh(meshLowLOD); + + openGLWidget.setViewableRegion(volData.getEnclosingRegion()); //Run the message pump. return app.exec();