#ifndef MAINGL_H
#define MAINGL_H
#include <QtOpenGL>
{ Q_OBJECT
public:
MainWindow
(QWidget *parent
= 0,
int seq_length
= 5000,
int num_seq
= 80) : QGLWidget(parent
) {
// generate random data to display
data.reserve(num_seq);
QVector<quint8> seq0;
seq0.reserve(seq_length);
for(int j=0;j<seq_length;j++)
{
seq0.push_back( int(rand()/float(RAND_MAX)*4) );
}
data.push_back(seq0);
for(int i=1;i<num_seq;i++)
{
QVector<quint8> seq_i;
seq_i.reserve(seq_length);
for(int j=0;j<seq_length;j++)
{
if(rand()/float(RAND_MAX)*20 < 1)
seq_i.push_back( int(rand()/float(RAND_MAX)*4) );
else
seq_i.push_back( data.at(0).at(j) );
}
data.push_back(seq_i);
}
camPos[0] = 0;camPos[1] = num_seq*10;camPos[2] = 2000;
totaldisplaylist = 0;
totaldisplaylistcount = 0;
gldisplist = 0;
}
~MainWindow()
{
for (quint8 i=0;i < 4;++i) deleteTexture(gltextures[i]);
if (totaldisplaylist) glDeleteLists(totaldisplaylist,totaldisplaylistcount);
if (gldisplist) glDeleteLists(gldisplist,4);
}
protected:
void initializeGL()
{
// Set up the rendering context, define display lists etc.:
glClearColor(1.0, 1.0, 1.0, 1.0);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
// Generate 4 consecutive displaylists
gldisplist = glGenLists(4);
// Prepare 4 textures
for (quint8 i=0;i < 4;++i)
{
QChar base_char
= alpha.
at(i
);
QColor color
= tile_colors
[i
];
textures[i] = pmap;
painter.
fillRect(QRectF(0,
0,
20,
20), color
);
painter.
setFont(QFont("Times",
10));
painter.
setPen(QColor("black"));
painter.
drawText(0,
0,
20,
20,0x0084,
QString(base_char
));
gltextures[i] = bindTexture(*pmap);
qDebug() << gltextures[i];
// compile display list
glNewList(gldisplist+i, GL_COMPILE);
{
glBindTexture(GL_TEXTURE_2D, gltextures[i]);
glBegin(GL_QUADS);
// Upper right corner
glTexCoord2f(0.0, 1.0);
glVertex3f(0.0, 20, 0.0);
// Upper right corner
glTexCoord2f(1.0, 1.0);
glVertex3f(20, 20, 0.0);
// Lower right corner
glTexCoord2f(1.0, 0.0);
glVertex3f(20, 0.0, 0.0);
// Lower left corner
glTexCoord2f(0.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glEnd();
}
glEndList();
}
prerender = false;
if (prerender)
renderGL();
}
void resizeGL(int w, int h)
{
// setup viewport, projection etc.:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, (GLint)w, (GLint)h);
gluPerspective(70.0, (float)w/(float)h, 0.01f, 100000.0f);
//glOrtho(1,w,1,h,-1,10);
}
void renderGL()
{
if (totaldisplaylist) glDeleteLists(totaldisplaylist,totaldisplaylistcount);
totaldisplaylistcount = data.size();
totaldisplaylist = glGenLists(totaldisplaylistcount);
float x_inc = 20;
float y_inc = 20;
for (int i = 0; i < data.size(); i++)
{
glNewList(totaldisplaylist+i, GL_COMPILE);
{
QVector<quint8> seq = data.at(i);
for (int j = 0; j < seq.size(); j++)
{
glCallList(gldisplist+seq.at(j));
glTranslatef(20,0,0);
}
glTranslatef(-x_inc*seq.size(),y_inc,0);
}
glEndList();
}
}
void paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Setup camera ..
gluLookAt(camPos[0],camPos[1],camPos[2],camPos[0],camPos[1],camPos[2]-500,0,1,0);
if (prerender) {
// draw the scene:
for (int i = 0; i < data.size(); i++)
{
glCallList(totaldisplaylist+i);
}
} else {
float x_inc = 20;
float y_inc = 20;
for (int i = 0; i < data.size(); i++)
{
QVector<quint8> seq = data.at(i);
for (int j = 0; j < seq.size(); j++)
{
glCallList(gldisplist+seq.at(j));
glTranslatef(20,0,0);
}
glTranslatef(-x_inc*seq.size(),y_inc,0);
}
}
}
{
// CAMERA
if ((event->modifiers() == Qt::NoModifier) || (event->modifiers() == Qt::ShiftModifier))
{
qreal delta = 50;
if (event->modifiers() == Qt::ShiftModifier) delta *= 10;
switch (event->key()) {
case Qt::Key_Left : {camPos[0] -= delta;}; break;
case Qt::Key_A : {camPos[0] -= delta;}; break;
case Qt::Key_Right : {camPos[0] += delta;}; break;
case Qt::Key_D : {camPos[0] += delta;}; break;
case Qt::Key_Down : {camPos[1] += delta;}; break;
case Qt::Key_W : {camPos[1] += delta;}; break;
case Qt::Key_Up : {camPos[1] -= delta;}; break;
case Qt::Key_S : {camPos[1] -= delta;}; break;
case Qt::Key_Q : {camPos[2] -= delta;}; break;
case Qt::Key_E : {camPos[2] += delta;}; break;
}
update();
}
}
private:
// The 4 characters
GLuint gltextures[4];
GLuint gldisplist;
// Each sequence as a displaylist
GLuint totaldisplaylist;
int totaldisplaylistcount;
float camPos[3];
bool prerender;
QVector< QVector<quint8> > data;
};
#endif // MAINGL_H
-------------------------------
#include <QtCore>
#include <QtGui>
#include "maingl.h"
int main(int argc, char *argv[])
{
MainWindow w;
w.show();
return a.exec();
}
#ifndef MAINGL_H
#define MAINGL_H
#include <QtOpenGL>
class MainWindow : public QGLWidget
{ Q_OBJECT
public:
MainWindow(QWidget *parent = 0,int seq_length = 5000,int num_seq = 80) : QGLWidget(parent)
{
// generate random data to display
data.reserve(num_seq);
QVector<quint8> seq0;
seq0.reserve(seq_length);
for(int j=0;j<seq_length;j++)
{
seq0.push_back( int(rand()/float(RAND_MAX)*4) );
}
data.push_back(seq0);
for(int i=1;i<num_seq;i++)
{
QVector<quint8> seq_i;
seq_i.reserve(seq_length);
for(int j=0;j<seq_length;j++)
{
if(rand()/float(RAND_MAX)*20 < 1)
seq_i.push_back( int(rand()/float(RAND_MAX)*4) );
else
seq_i.push_back( data.at(0).at(j) );
}
data.push_back(seq_i);
}
camPos[0] = 0;camPos[1] = num_seq*10;camPos[2] = 2000;
totaldisplaylist = 0;
totaldisplaylistcount = 0;
gldisplist = 0;
}
~MainWindow()
{
for (quint8 i=0;i < 4;++i) deleteTexture(gltextures[i]);
if (totaldisplaylist) glDeleteLists(totaldisplaylist,totaldisplaylistcount);
if (gldisplist) glDeleteLists(gldisplist,4);
}
protected:
void initializeGL()
{
// Set up the rendering context, define display lists etc.:
glClearColor(1.0, 1.0, 1.0, 1.0);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
QString alpha = "ACGT";
QColor tile_colors[] = { QColor("blue"), QColor("green"), QColor("yellow"), QColor("red") };
// Generate 4 consecutive displaylists
gldisplist = glGenLists(4);
// Prepare 4 textures
for (quint8 i=0;i < 4;++i)
{
QChar base_char = alpha.at(i);
QColor color = tile_colors[i];
QPixmap* pmap = new QPixmap(20,20);
textures[i] = pmap;
QPainter painter(pmap);
painter.fillRect(QRectF(0, 0, 20, 20), color);
painter.setFont(QFont("Times",10));
painter.setPen(QColor("black"));
painter.drawText(0, 0, 20, 20,0x0084, QString(base_char));
gltextures[i] = bindTexture(*pmap);
qDebug() << gltextures[i];
// compile display list
glNewList(gldisplist+i, GL_COMPILE);
{
glBindTexture(GL_TEXTURE_2D, gltextures[i]);
glBegin(GL_QUADS);
// Upper right corner
glTexCoord2f(0.0, 1.0);
glVertex3f(0.0, 20, 0.0);
// Upper right corner
glTexCoord2f(1.0, 1.0);
glVertex3f(20, 20, 0.0);
// Lower right corner
glTexCoord2f(1.0, 0.0);
glVertex3f(20, 0.0, 0.0);
// Lower left corner
glTexCoord2f(0.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glEnd();
}
glEndList();
}
prerender = false;
if (prerender)
renderGL();
}
void resizeGL(int w, int h)
{
// setup viewport, projection etc.:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, (GLint)w, (GLint)h);
gluPerspective(70.0, (float)w/(float)h, 0.01f, 100000.0f);
//glOrtho(1,w,1,h,-1,10);
}
void renderGL()
{
if (totaldisplaylist) glDeleteLists(totaldisplaylist,totaldisplaylistcount);
totaldisplaylistcount = data.size();
totaldisplaylist = glGenLists(totaldisplaylistcount);
float x_inc = 20;
float y_inc = 20;
for (int i = 0; i < data.size(); i++)
{
glNewList(totaldisplaylist+i, GL_COMPILE);
{
QVector<quint8> seq = data.at(i);
for (int j = 0; j < seq.size(); j++)
{
glCallList(gldisplist+seq.at(j));
glTranslatef(20,0,0);
}
glTranslatef(-x_inc*seq.size(),y_inc,0);
}
glEndList();
}
}
void paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Setup camera ..
gluLookAt(camPos[0],camPos[1],camPos[2],camPos[0],camPos[1],camPos[2]-500,0,1,0);
if (prerender) {
// draw the scene:
for (int i = 0; i < data.size(); i++)
{
glCallList(totaldisplaylist+i);
}
} else {
float x_inc = 20;
float y_inc = 20;
for (int i = 0; i < data.size(); i++)
{
QVector<quint8> seq = data.at(i);
for (int j = 0; j < seq.size(); j++)
{
glCallList(gldisplist+seq.at(j));
glTranslatef(20,0,0);
}
glTranslatef(-x_inc*seq.size(),y_inc,0);
}
}
}
void keyPressEvent(QKeyEvent *event)
{
// CAMERA
if ((event->modifiers() == Qt::NoModifier) || (event->modifiers() == Qt::ShiftModifier))
{
qreal delta = 50;
if (event->modifiers() == Qt::ShiftModifier) delta *= 10;
switch (event->key()) {
case Qt::Key_Left : {camPos[0] -= delta;}; break;
case Qt::Key_A : {camPos[0] -= delta;}; break;
case Qt::Key_Right : {camPos[0] += delta;}; break;
case Qt::Key_D : {camPos[0] += delta;}; break;
case Qt::Key_Down : {camPos[1] += delta;}; break;
case Qt::Key_W : {camPos[1] += delta;}; break;
case Qt::Key_Up : {camPos[1] -= delta;}; break;
case Qt::Key_S : {camPos[1] -= delta;}; break;
case Qt::Key_Q : {camPos[2] -= delta;}; break;
case Qt::Key_E : {camPos[2] += delta;}; break;
}
update();
}
}
private:
// The 4 characters
QPixmap* textures[4];
GLuint gltextures[4];
GLuint gldisplist;
// Each sequence as a displaylist
GLuint totaldisplaylist;
int totaldisplaylistcount;
float camPos[3];
bool prerender;
QVector< QVector<quint8> > data;
};
#endif // MAINGL_H
-------------------------------
#include <QtCore>
#include <QtGui>
#include "maingl.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
To copy to clipboard, switch view to plain text mode
Hope it helps!
Bookmarks