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

Generated on Mon Jan 21 01:15:16 2008 for FlowVis by  doxygen 1.5.4