00001 #include "VolumeBuffer.h"
00002 #include <QtGui>
00003 #include <QtOpenGL>
00004
00005 #include <math.h>
00006
00007 #include "tfglwidget.h"
00008 #include <GL/gl.h>
00009 #include <GL/glu.h>
00010 #include <GL/glut.h>
00011
00012 tfGLWidget::tfGLWidget(QWidget *parent)
00013 : QGLWidget(parent)
00014 {
00015 setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
00016 m_tf_texture = new unsigned char [256*64*4];
00017 }
00018
00019 tfGLWidget::~tfGLWidget()
00020 {
00021 makeCurrent();
00022 delete [] m_tf_texture;
00023 }
00024
00025 QSize tfGLWidget::minimumSizeHint() const
00026 {
00027 return QSize(50, 50);
00028 }
00029
00030 QSize tfGLWidget::sizeHint() const
00031 {
00032 return QSize(256, 64);
00033 }
00034
00035 void tfGLWidget::setTFID(GLuint tfid)
00036 {
00037
00038 m_tfid = tfid;
00039 }
00040
00041 void tfGLWidget::setTFImage(QImage &tfimg)
00042 {
00043 m_tfimg = tfimg;
00044 updateGL();
00045 }
00046
00047 void tfGLWidget::initializeGL()
00048 {
00049
00050 glewInit();
00051 qglClearColor(trolltechPurple.dark());
00052 glShadeModel (GL_FLAT);
00053 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
00054 glEnable(GL_TEXTURE_2D);
00055 }
00056
00057 void tfGLWidget::paintGL()
00058 {
00059 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00060
00061 glLoadIdentity();
00062 glTranslated(0.0, 0.0, 0.0);
00063
00064 glEnable(GL_TEXTURE_2D);
00065 glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00066
00067
00068
00069 deleteTexture(m_tfid);
00070
00071
00072 glGenTextures(1, &m_tfid);
00073
00074 int iy = 0;
00075 int ix;
00076
00077 memset(m_tf_texture,0,256*64*4*sizeof(unsigned char));
00078
00079
00080 for (iy = 0; iy < 64; iy++)
00081 {
00082 for (ix = 0; ix < 256; ix++)
00083 {
00084 QRgb tfc = m_tfimg.pixel(ix,0);
00085
00086 m_tf_texture[((256)*iy + ix)*4 + 0] = (GLubyte) qRed(tfc);
00087 m_tf_texture[((256)*iy + ix)*4 + 1] = (GLubyte) qGreen(tfc);
00088 m_tf_texture[((256)*iy + ix)*4 + 2] = (GLubyte) qBlue(tfc);
00089 m_tf_texture[((256)*iy + ix)*4 + 3] = (GLubyte) qAlpha(tfc);
00090 }
00091 }
00092
00093
00094 glBindTexture(GL_TEXTURE_2D,m_tfid);
00095
00096
00097 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
00098 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
00099
00100 GLint mode = GL_CLAMP;
00101 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, mode);
00102 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, mode);
00103
00104
00105 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_tf_texture);
00106
00107 glBegin(GL_QUADS);
00108
00109 glTexCoord3f(0.0f, 0.0f, 0.0f); glVertex3f (-1.0f, -1.0f, 0.0f);
00110 glTexCoord3f(1.0f, 0.0f, 0.0f); glVertex3f (1.0f, -1.0f, 0.0f);
00111 glTexCoord3f(1.0f, 1.0f, 0.0f); glVertex3f (1.0f, 1.0f, 0.0f);
00112 glTexCoord3f(0.0f, 1.0f, 0.0f); glVertex3f (-1.0f, 1.0f, 0.0f);
00113
00114 glEnd();
00115
00116 glFlush();
00117 glDisable(GL_TEXTURE_2D);
00118
00119 }
00120
00121 void tfGLWidget::resizeGL(int width, int height)
00122 {
00123 int side = qMin(width, height);
00124
00125
00126 glViewport (0, 0, (GLsizei) width, (GLsizei) height);
00127 glMatrixMode (GL_PROJECTION);
00128 glLoadIdentity ();
00129 glFrustum (-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
00130 glMatrixMode (GL_MODELVIEW);
00131 }