Public feed
#379387
/**
* File viewer.cpp
* Brief Implementation of viewer
* This is a simple QGLWidget displaying an openGL wireframe box
*
* The OpenGL code is mostly borrowed from Brian Pauls "spin" example
* in the Mesa distribution.
* $ID$
*/
#include "viewer.h"
/**
* Constructor that creates a viewer widget
*/
viewer::viewer( QWidget* parent, const char* name )
: QGLWidget( parent, name )
{
xRot = yRot = zRot = 0.0;
scale = 1.25;
object = 0;
}
viewer::~viewer()
{ glDeleteLists( object, 1 );
} // end destructor
/*--------------------------------------------------------------------------*/
/**
* Paint the box. The actual openGL commands for drawing the box are
* performed here.
*/
void viewer::paintGL()
{
//glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glEnable( GL_DEPTH_TEST );
//glLoadIdentity();
//glTranslatef(0.0, 0.0, -10.0);
// set the zoom according to the scale variable
//glScalef(scale, scale, scale);
// set the image rotation up according to xRot, yRot, zRot
//glRotatef( xRot, 1.0, 0.0, 0.0);
//glRotatef( yRot, 0.0, 1.0, 0.0);
//glRotatef( zRot, 0.0, 0.0, 1.0);
glCallList(object);
}
GLuint viewer::makeObject()
{ GLuint list;
list = glGenLists(1);
glNewList(list, GL_COMPILE);
// set the initial color
glColor3f( 1.0, 1.0, 1.0 );
// points for triangle to draw Sierpinski Gasket
drawModel();
glEndList();
return list;
} // end make object
/*--------------------------------------------------------------------------*/
/**
* Set up the OpenGL rendering state, and define display list
*/
void viewer::initializeGL()
{
glClearColor( 0.0, 0.0, 0.0, 0.0 ); // Let OpenGL clear to black
object = makeObject(); // generate an OpenGL display list
glShadeModel( GL_SMOOTH ); // we want smooth shading . . . try GL_FLAT if you like
}
/*--------------------------------------------------------------------------*/
/**
* Set up the OpenGL view port, matrix mode, etc.
*/
void viewer::resizeGL( int w, int h )
{
glViewport( 0, 0, (GLint)w, (GLint)h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-10, 10, -10, 10, -5, 5);
glMatrixMode( GL_MODELVIEW );
}
//*********************************************************
// Functions to rotate the model along the x, y, & z axes.
void viewer::setXRotation(int degrees)
{ xRot=(GLfloat)(degrees % 360);
updateGL();
}
void viewer::setYRotation(int degrees)
{ yRot=(GLfloat)(degrees % 360);
updateGL();
}
void viewer::setZRotation(int degrees)
{ zRot=(GLfloat)(degrees % 360);
updateGL();
}
void viewer::loadFile()
{
QFileDialog * n = new QFileDialog(this, "file dialog", TRUE);
n->setFilter("MD2 Model (*.md2)");
n->setMode(QFileDialog::ExistingFile);
n->setViewMode(QFileDialog::Detail);
n->show();
if(n->exec() == QDialog::Accepted) {
loader = MD2();
n->hide();
loader.LoadModel(n->selectedFile());
//MD2 parsing
object = makeObject();
}
}
//**********************************************************
// Write Your Own Function To Set The Scale Here!!!!
//void viewer::setScale(int newscale){ }
//**********************************************************
// Draws a triangle
void viewer::drawFace(int index_a, int index_b, int index_c)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 1, 1);
glBegin(GL_LINE_LOOP);
glVertex3fv (loader.m_vertices[index_a]);
glVertex3fv (loader.m_vertices[index_b]);
glVertex3fv (loader.m_vertices[index_c]);
glEnd();
glFlush();
} // end draw triangle
//*******************************************************
// Function from class to draw the Sierpinski fractal
// Recursion is FUN!
void viewer::drawModel()
{
int index_a, index_b, index_c;
for(int i = 0; i < loader.num_tris; i++)
{
index_a = loader.tris[i].index_xyz[0];
index_b = loader.tris[i].index_xyz[1];
index_c = loader.tris[i].index_xyz[2];
drawFace(index_a, index_b, index_c);
}
} // end draw Sierpinski