Eigene Dateien/Vis/src/VTransferFunction.cpp

Go to the documentation of this file.
00001 #include "VTransferFunction.h"
00002 #include "glew.h"
00003 #include <algorithm>
00004 #include "QVolRendCanvas.h"
00005 
00006 VTransferFunction::~VTransferFunction()
00007 {
00008         if(m_VolumeHistogramDisplayList != 0)
00009         {
00010                 glDeleteLists(m_VolumeHistogramDisplayList, 1);
00011         }
00012         m_FuncControlPoints.clear();
00013         if(m_VolumeHistogram)
00014         {
00015                 m_VolumeHistogram->clear();
00016         }
00017 
00018         if(m_MainCanvas)
00019         {
00020                 m_MainCanvas = NULL;
00021         }
00022         m_TransferFunction.clear();
00023 
00024         
00025 }
00026 
00027 
00028 void VTransferFunction::draw1d()
00029 {
00030         if(m_VolumeHistogramDisplayList != 0)
00031         {
00032                 glCallList(m_VolumeHistogramDisplayList);
00033         }
00034 
00035         glBegin(GL_QUADS);
00036         glColor4f(0.0f, 0.0f, 0.0f, 0.0f);
00037         glVertex3f(-1.0f, -1.0f, -0.03f);
00038         glColor4f(0.0f, 0.0f, 0.0f, 0.0f);
00039         glVertex3f(-1.0f, -0.8f, -0.03f);
00040 
00041         std::map<int, vTransferFunctionPoint>::iterator it = m_FuncControlPoints.begin();
00042         while(it != m_FuncControlPoints.end())
00043         {
00044                 //end of quad
00045                 glColor4f((*it).second.m_Color.getX(),(*it).second.m_Color.getY(), (*it).second.m_Color.getZ(), (*it).second.m_Alpha );
00046                 glVertex3f(2*(float)(*it).first/4095.0f - 1.0f, -0.8f, -0.03f);
00047                 glColor4f((*it).second.m_Color.getX(),(*it).second.m_Color.getY(), (*it).second.m_Color.getZ(), (*it).second.m_Alpha );
00048                 glVertex3f(2*(float)(*it).first/4095.0f - 1.0f, -1.0f, -0.03f);
00049                 //beginning of quad
00050                 glColor4f((*it).second.m_Color.getX(),(*it).second.m_Color.getY(), (*it).second.m_Color.getZ(), (*it).second.m_Alpha );
00051                 glVertex3f(2*(float)(*it).first/4095.0f - 1.0f, -1.0f, -0.03f);
00052                 glColor4f((*it).second.m_Color.getX(),(*it).second.m_Color.getY(), (*it).second.m_Color.getZ(), (*it).second.m_Alpha );
00053                 glVertex3f(2*(float)(*it).first/4095.0f - 1.0f, -0.8f, -0.03f);
00054                 ++it;
00055         }
00056         glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
00057         glVertex3f(1.0f, -0.8f, -0.03f);
00058         glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
00059         glVertex3f(1.0f, -1.0f, -0.03f);
00060         glEnd();
00061         
00062         if(m_zoom_active&&m_MainCanvas->getLoaded())
00063         {
00064                 float x1 =  (float)max(zoom_ptx - 0.15,-1.0) ;
00065                 float x2 =  (float)min(zoom_ptx + 0.15, 1.0) ;
00066                 float localmax = 0.0;
00067 
00068                 std::vector<int> tmpHist = *m_VolumeHistogram;
00069                 for (int i = (int)((x1 + 1.0f)*2047); i < (int)((x2+1.0f)*2047); i++)
00070                 {
00071                         if(tmpHist[i] > localmax) localmax = tmpHist[i];
00072                 }
00073 
00074                 float upper = (bigzoom) ? 1.0f : -0.333f;
00075 
00076                 glBegin(GL_QUADS);
00077 
00078                         glColor4f(0.9176f, 0.8235f, 0.7451f, 0.3f);
00079 
00080                         glVertex3f(x1,-0.8f, -0.01f);   
00081                         glVertex3f(x2,-0.8f, -0.01f);   
00082                         glVertex3f(x2,1.0f, -0.01f);    
00083                         glVertex3f(x1,1.0f, -0.01f);
00084                 
00085                 glEnd();
00086                 
00087                 glBegin(GL_LINES);
00088                 for (int i = (int)((x1 + 1.0f)*2047); i < (int)((x2+1.0f)*2047); i++)
00089                 {
00090                         glColor3f(0.9176f, 0.4f, 0.4f);
00091                         glVertex3f(2*(float)(i)/4095.0f - 1.0f, -0.8f, -0.02f);
00092                         glVertex3f(2*(float)(i)/4095.0f - 1.0f, (2.0f* abs(upper)*(float)m_VolumeHistogram->at(i)/localmax - 0.8f ), -0.02f);
00093                 }
00094                 glEnd();
00095 
00096         }
00097         
00098         glBegin(GL_LINE_STRIP);
00099         glColor3f(0.0f, 0.0f, 0.0f);
00100         glVertex3f(-1.0f, -0.8f, -0.1f);
00101         it = m_FuncControlPoints.begin();
00102         while(it != m_FuncControlPoints.end())
00103         {
00104                 glColor3f(0.0f, 0.0f, 0.0f);
00105                 glVertex3f((float)(*it).first/4095.0f * 2.0f - 1.0f, (*it).second.m_Alpha * 1.8f - 0.8f, -0.1f);
00106                 ++it;
00107         }
00108         glColor3f(0.5f, 0.5f, 0.5f);
00109         glVertex3f(1.0f, 1.0f, -0.1f);
00110         glEnd();
00111         
00112         glPointSize(7.0f);
00113         glBegin(GL_POINTS);
00114         it = m_FuncControlPoints.begin();
00115         while(it != m_FuncControlPoints.end())
00116         {
00117                 glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
00118                 glVertex3f((float)(*it).first/4095.0f * 2.0f - 1.0f, (*it).second.m_Alpha * 1.8f - 0.8f, -0.15f);
00119                 ++it;
00120         }
00121         glEnd();
00122 
00123         glPointSize(5.0f);
00124         glBegin(GL_POINTS);
00125         it = m_FuncControlPoints.begin();
00126         while(it != m_FuncControlPoints.end())
00127         {
00128                 glColor4f((*it).second.m_Color.getX(), (*it).second.m_Color.getY(), (*it).second.m_Color.getZ(), 1.0f);
00129                 glVertex3f((float)(*it).first/4095.0f * 2.0f - 1.0f, (*it).second.m_Alpha * 1.8f - 0.8f, -0.2f);
00130                 ++it;
00131         }
00132         glEnd();
00133 
00134 
00135 }
00136 
00137 void VTransferFunction::addTransferFunctionPoint(int density, vTransferFunctionPoint newPoint)
00138 {
00139         m_FuncControlPoints[density] = newPoint;
00140         m_hasChanged = true;
00141         //interpolateTransferPoints();
00142         //m_MainCanvas->repaint();
00143         //m_MainCanvas->swapBuffers();
00144 }
00145 
00146 void VTransferFunction::removeTransferFunctionPoint(int density)
00147 {
00148         m_FuncControlPoints.erase(density);
00149         m_hasChanged = true;
00150         //interpolateTransferPoints();
00151         //m_MainCanvas->repaint();
00152         //m_MainCanvas->swapBuffers();
00153 }
00154 
00155 void VTransferFunction::generateDisplayList()
00156 {
00157         if(m_VolumeHistogramDisplayList != 0)
00158         {
00159                 glDeleteLists(m_VolumeHistogramDisplayList, 1);
00160         }
00161         std::vector<int> tmpHist = *m_VolumeHistogram;
00162         float maxHistogramValue =  m_maxdensity;//float)(*max_element(tmpHist.begin(), tmpHist.end()));
00163         
00164         m_VolumeHistogramDisplayList = glGenLists(1);
00165         glNewList(m_VolumeHistogramDisplayList, GL_COMPILE);
00166         glBegin(GL_LINES);
00167         for(int i = 0; i < (int)m_VolumeHistogram->size(); ++i)
00168         {
00169                 glColor3f(0.7f, 0.7f, 0.7f);
00170                 glVertex3f(2*(float)(i)/4095.0f - 1.0f, -0.8f, 0.0f);   
00171                 glColor3f(0.7f, 0.7f, 0.7f);
00172                 glVertex3f(2*(float)(i)/4095.0f - 1.0f, 2* (float)m_VolumeHistogram->at(i)/maxHistogramValue - 0.8f, 0.0f);
00173         }
00174         glEnd();
00175         glEndList();
00176 
00177 }
00178 
00179 
00180 
00181 void VTransferFunction::interpolateTransferPoints()
00182 {
00183         //m_MainCanvas->makeCurrent();
00184 
00185         if(!m_FramebufferObject)
00186         {
00187                 m_FramebufferObject = new VFramebufferObject(4096,2,GL_RGBA);
00188         }
00189 
00190         if(m_FramebufferObject->getFboHandle() == 0)
00191         {
00192                 m_FramebufferObject->init();
00193         }
00194         m_FramebufferObject->bind();
00195 
00196         //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   // Clear Screen And Depth Buffer
00197 
00198         glBegin(GL_QUADS);
00199         glColor4f(0.0f, 0.0f, 0.0f, 0.0f);
00200         glVertex3f(-1.0f, -1.0f, 0.0f);
00201         glColor4f(0.0f, 0.0f, 0.0f, 0.0f);
00202         glVertex3f(-1.0f, 1.0f, 0.0f);
00203 
00204         std::map<int, vTransferFunctionPoint>::iterator it = m_FuncControlPoints.begin();
00205         while(it != m_FuncControlPoints.end())
00206         {
00207                 //end of quad
00208                 glColor4f((*it).second.m_Color.getX(),(*it).second.m_Color.getY(), (*it).second.m_Color.getZ(), (*it).second.m_Alpha );
00209                 glVertex3f(2*(float)(*it).first/4095.0f - 1.0f, 1.0f, 0.0f);
00210                 glColor4f((*it).second.m_Color.getX(),(*it).second.m_Color.getY(), (*it).second.m_Color.getZ(), (*it).second.m_Alpha );
00211                 glVertex3f(2*(float)(*it).first/4095.0f - 1.0f, -1.0f, 0.0f);
00212                 //beginning of quad
00213                 glColor4f((*it).second.m_Color.getX(),(*it).second.m_Color.getY(), (*it).second.m_Color.getZ(), (*it).second.m_Alpha );
00214                 glVertex3f(2*(float)(*it).first/4095.0f - 1.0f, -1.0f, 0.0f);
00215                 glColor4f((*it).second.m_Color.getX(),(*it).second.m_Color.getY(), (*it).second.m_Color.getZ(), (*it).second.m_Alpha );
00216                 glVertex3f(2*(float)(*it).first/4095.0f - 1.0f, 1.0f, 0.0f);
00217                 ++it;
00218         }
00219         glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
00220         glVertex3f(1.0f, 1.0f, 0.0f);
00221         glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
00222         glVertex3f(1.0f, -1.0f, 0.0f);
00223         glEnd();
00224 
00225         
00226         m_FramebufferObject->unbind();
00227 
00228         m_hasChanged = false;
00229 }
00230 
00231 bool VTransferFunction::load(std::string filepath)
00232 {
00233         if(filepath == "")
00234         {
00235                 return true;
00236         }
00237         FILE *fp = NULL;
00238 
00239         fopen_s(&fp,filepath.c_str(),"rb");
00240 
00241         if(!fp)
00242         {
00243                 return false;
00244         }
00245         unsigned int numPoints;
00246 
00247         fread(&numPoints,sizeof(unsigned int),1,fp);
00248 
00249         m_FuncControlPoints.clear();
00250         for(unsigned int i = 0; i < numPoints; ++i)
00251         {
00252                 int density;
00253                 fread(&density, sizeof(int), 1, fp);
00254 
00255                 vTransferFunctionPoint tmp;
00256                 float x,y,z,a;
00257                 fread(&x, sizeof(float), 1, fp);
00258                 fread(&y, sizeof(float), 1, fp);
00259                 fread(&z, sizeof(float), 1, fp);
00260                 fread(&a, sizeof(float), 1, fp);
00261                 tmp.m_Color = VVector(x,y,z);
00262                 tmp.m_Alpha = a;
00263                 m_FuncControlPoints[density] = tmp;
00264 
00265         }
00266         fclose(fp);
00267         m_hasChanged = true;
00268         return true;
00269 }
00270 
00271 bool VTransferFunction::save(std::string filepath)
00272 {
00273         if(filepath == "")
00274         {
00275                 return true;
00276         }
00277         FILE *fp = NULL;
00278 
00279 
00280 
00281         fopen_s(&fp,filepath.c_str(),"wb");
00282 
00283         if(!fp)
00284         {
00285                 return false;
00286         }
00287         unsigned int numPoints = (unsigned int)m_FuncControlPoints.size();
00288 
00289         fwrite(reinterpret_cast<char*>(&numPoints), sizeof(unsigned int), 1,fp);
00290         
00291         std::map<int, vTransferFunctionPoint>::iterator it = m_FuncControlPoints.begin();
00292 
00293         while(it != m_FuncControlPoints.end())
00294         {
00295                 float x,y,z,a;
00296                 x = (*it).second.m_Color.getX();
00297                 y = (*it).second.m_Color.getY();
00298                 z = (*it).second.m_Color.getZ();
00299                 a = (*it).second.m_Alpha;
00300                 int density = (*it).first;
00301                 fwrite(reinterpret_cast<char*>(&density), sizeof(int), 1, fp);
00302                 fwrite(reinterpret_cast<char*>(&x), sizeof(float), 1, fp);
00303                 fwrite(reinterpret_cast<char*>(&y), sizeof(float), 1, fp);
00304                 fwrite(reinterpret_cast<char*>(&z), sizeof(float), 1, fp);
00305                 fwrite(reinterpret_cast<char*>(&a), sizeof(float), 1, fp);
00306                 ++it;
00307         }
00308         fclose(fp);
00309         return true;
00310 }

Generated on Wed Dec 5 05:15:09 2007 for VolRendering by  doxygen 1.5.4