Work on OpenGL Example.
This commit is contained in:
@ -12,11 +12,11 @@ using namespace std;
|
||||
|
||||
OpenGLWidget::OpenGLWidget(QWidget *parent)
|
||||
:QGLWidget(parent)
|
||||
,m_volData(0)
|
||||
{
|
||||
m_xRotation = 0;
|
||||
m_yRotation = 0;
|
||||
m_uRegionSideLength = 16.0f;
|
||||
m_distance = -g_uVolumeSideLength / 2.0f;
|
||||
|
||||
timer = new QTimer(this);
|
||||
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
|
||||
@ -87,7 +87,8 @@ void OpenGLWidget::setVolume(PolyVox::Volume<PolyVox::uint8_t>* volData)
|
||||
}
|
||||
}
|
||||
|
||||
m_distance = m_volData->getLongestSideLength() / -2.0f;
|
||||
//Projection matrix is dependant on volume size, so we need to set it up again.
|
||||
setupProjectionMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
@ -124,66 +125,64 @@ void OpenGLWidget::initializeGL()
|
||||
|
||||
void OpenGLWidget::resizeGL(int w, int h)
|
||||
{
|
||||
glViewport ( 0, 0, w, h );
|
||||
glMatrixMode ( GL_PROJECTION ); // Select The Projection Matrix
|
||||
glLoadIdentity ( ); // Reset The Projection Matrix
|
||||
//Setup the viewport based on the window size
|
||||
glViewport(0, 0, w, h);
|
||||
|
||||
float aspect = ( float ) w / ( float ) h;
|
||||
glOrtho(-m_distance*aspect, m_distance*aspect, -m_distance, m_distance, 1.0, 5000);
|
||||
glMatrixMode ( GL_MODELVIEW ); // Select The Model View Matrix
|
||||
glLoadIdentity ( ); // Reset The Model View Matrix
|
||||
//Projection matrix is also dependant on the size of the current volume.
|
||||
if(m_volData)
|
||||
{
|
||||
setupProjectionMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
void OpenGLWidget::paintGL()
|
||||
{
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
|
||||
|
||||
glMatrixMode ( GL_MODELVIEW ); // Select The Model View Matrix
|
||||
glLoadIdentity(); // Reset The Current Modelview Matrix
|
||||
|
||||
//Moves the camera back so we can see the volume
|
||||
glTranslatef(0.0f, 0.0f, m_distance);
|
||||
|
||||
//Rotate the volume by the required amount
|
||||
//glRotatef(g_xRotation, 1.0f, 0.0f, 0.0f);
|
||||
//glRotatef(g_yRotation, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
;
|
||||
glRotatef(m_xRotation, 1.0f, 0.0f, 0.0f);
|
||||
glRotatef(m_yRotation, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
//Centre the volume on the origin
|
||||
glTranslatef(-g_uVolumeSideLength/2,-g_uVolumeSideLength/2,-g_uVolumeSideLength/2);
|
||||
|
||||
for(PolyVox::uint16_t uRegionZ = 0; uRegionZ < m_uVolumeDepthInRegions; ++uRegionZ)
|
||||
if(m_volData)
|
||||
{
|
||||
for(PolyVox::uint16_t uRegionY = 0; uRegionY < m_uVolumeHeightInRegions; ++uRegionY)
|
||||
{
|
||||
for(PolyVox::uint16_t uRegionX = 0; uRegionX < m_uVolumeWidthInRegions; ++uRegionX)
|
||||
{
|
||||
Vector3DUint8 v3dRegPos(uRegionX,uRegionY,uRegionZ);
|
||||
if(m_bUseOpenGLVertexBufferObjects)
|
||||
{
|
||||
renderRegionVertexBufferObject(m_mapOpenGLSurfacePatches[v3dRegPos]);
|
||||
}
|
||||
else
|
||||
{
|
||||
IndexedSurfacePatch* ispCurrent = m_mapIndexedSurfacePatches[v3dRegPos];
|
||||
renderRegionImmediateMode(*ispCurrent);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
|
||||
|
||||
glMatrixMode(GL_MODELVIEW); // Select The Model View Matrix
|
||||
glLoadIdentity(); // Reset The Current Modelview Matrix
|
||||
|
||||
//Moves the camera back so we can see the volume
|
||||
glTranslatef(0.0f, 0.0f, -m_volData->getDiagonalLength());
|
||||
|
||||
glRotatef(m_xRotation, 1.0f, 0.0f, 0.0f);
|
||||
glRotatef(m_yRotation, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
//Centre the volume on the origin
|
||||
glTranslatef(-g_uVolumeSideLength/2,-g_uVolumeSideLength/2,-g_uVolumeSideLength/2);
|
||||
|
||||
for(PolyVox::uint16_t uRegionZ = 0; uRegionZ < m_uVolumeDepthInRegions; ++uRegionZ)
|
||||
{
|
||||
for(PolyVox::uint16_t uRegionY = 0; uRegionY < m_uVolumeHeightInRegions; ++uRegionY)
|
||||
{
|
||||
for(PolyVox::uint16_t uRegionX = 0; uRegionX < m_uVolumeWidthInRegions; ++uRegionX)
|
||||
{
|
||||
Vector3DUint8 v3dRegPos(uRegionX,uRegionY,uRegionZ);
|
||||
if(m_bUseOpenGLVertexBufferObjects)
|
||||
{
|
||||
renderRegionVertexBufferObject(m_mapOpenGLSurfacePatches[v3dRegPos]);
|
||||
}
|
||||
else
|
||||
{
|
||||
IndexedSurfacePatch* ispCurrent = m_mapIndexedSurfacePatches[v3dRegPos];
|
||||
renderRegionImmediateMode(*ispCurrent);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GLenum errCode;
|
||||
const GLubyte *errString;
|
||||
|
||||
if ((errCode = glGetError()) != GL_NO_ERROR)
|
||||
{
|
||||
errString = gluErrorString(errCode);
|
||||
cout << "OpenGL Error: " << errString << endl;
|
||||
}
|
||||
}
|
||||
|
||||
GLenum errCode;
|
||||
const GLubyte *errString;
|
||||
|
||||
if ((errCode = glGetError()) != GL_NO_ERROR)
|
||||
{
|
||||
errString = gluErrorString(errCode);
|
||||
cout << "OpenGL Error: " << errString << endl;
|
||||
} // Reset The Current Modelview Matrix
|
||||
}
|
||||
|
||||
void OpenGLWidget::mousePressEvent(QMouseEvent* event)
|
||||
@ -203,5 +202,15 @@ void OpenGLWidget::mouseMoveEvent(QMouseEvent* event)
|
||||
|
||||
void OpenGLWidget::wheelEvent(QWheelEvent* event)
|
||||
{
|
||||
m_distance += event->delta() / 120.0f;
|
||||
}
|
||||
|
||||
void OpenGLWidget::setupProjectionMatrix(void)
|
||||
{
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
|
||||
float frustumSize = m_volData->getDiagonalLength() / 2.0f;
|
||||
float aspect = static_cast<float>(width()) / static_cast<float>(height());
|
||||
|
||||
glOrtho(frustumSize*aspect, -frustumSize*aspect, frustumSize, -frustumSize, 1.0, 5000);
|
||||
}
|
Reference in New Issue
Block a user