Eigene Dateien/Vis/src/VTransferFunction2D.cpp

Go to the documentation of this file.
00001 #include "VTransferFunction2D.h"
00002 #include "glew.h"
00003 #include <algorithm>
00004 #include "QVolRendCanvas.h"
00005 
00006 VTransferFunction2D::~VTransferFunction2D()
00007 {
00008         if(m_VolumeHistogramDisplayList2D != 0)
00009         {
00010                 glDeleteLists(m_VolumeHistogramDisplayList2D, 1);
00011         }
00012         
00013         if(m_VolumeHistogram2D)
00014         {
00015                 m_VolumeHistogram2D = 0;
00016         }
00017 
00018         if(m_MainCanvas)
00019         {
00020                 m_MainCanvas = NULL;
00021         }
00022 
00023         
00024 }
00025 
00026 void VTransferFunction2D::reinit()
00027 {
00028         /*vTransferFunction2DPoint p1;
00029         p1.m_Color = VVector(0.0f, 0.0f, 0.0f);
00030         p1.m_Alpha = 0.0f;
00031         p1.m_density = 0.0f;
00032         p1.m_gmag = 0.0f;
00033 
00034         vTransferFunction2DPoint p2;
00035         p2.m_Color = VVector(1.0f, 1.0f, 1.0f);
00036         p2.m_Alpha = 1.0f;
00037         p1.m_density = 1.0f;
00038         p2.m_gmag = 0.0f;
00039 
00040         vTransferFunction2DPoint p3;
00041         p3.m_Color = VVector(1.0f, 1.0f, 1.0f);
00042         p3.m_Alpha = 1.0f;
00043         p3.m_gmag = 1.0f;
00044         p3.m_density = 1.0f;
00045 
00046         vTransferFunction2DPoint p4;
00047         p4.m_Color = VVector(1.0f, 1.0f, 1.0f);
00048         p4.m_Alpha = 1.0f;
00049         p4.m_gmag = 1.0f;
00050         p4.m_density = 0.0f;
00051 
00052         vTransferFunction2DPoint p5;
00053         p5.m_Color = VVector(0.5f, 0.5f, 0.5f);
00054         p5.m_Alpha = 0.5f;
00055         p5.m_gmag = 0.5f;
00056         p5.m_density = 0.5f;
00057 
00058         m_FuncControlPoints.push_back(p5);
00059 
00060         vTransferFunctionTriangle t1(p1,p2,p3);
00061         vTransferFunctionTriangle t2(p5,p2,p3);
00062         vTransferFunctionTriangle t3(p5,p3,p4);
00063         vTransferFunctionTriangle t4(p5,p4,p1);
00064 
00065         m_FuncControlTriangles.push_back(t1);
00066         m_FuncControlTriangles.push_back(t2);
00067         m_FuncControlTriangles.push_back(t3);
00068         m_FuncControlTriangles.push_back(t4);*/
00069 }
00070 
00071 
00072 void VTransferFunction2D::draw2d()
00073 {
00074         if(m_VolumeHistogramDisplayList2D != 0)
00075         {
00076                 glCallList(m_VolumeHistogramDisplayList2D);
00077         }
00078 
00079         glEnable(GL_TEXTURE_2D);
00080         glDisable(GL_TEXTURE_2D);
00081 
00082         glPointSize(7.0f);
00083         glBegin(GL_POINTS);
00084         //draw all points
00085         for(int i = 0; i < (int)m_FuncControlPoints.size(); i++)
00086         {               
00087                 vTransferFunction2DPoint ptmp = m_FuncControlPoints[i];
00088                 
00089                 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
00090                 glVertex3f(ptmp.m_density * 2.0f - 1.0f, ptmp.m_gmag * 2.0f - 1.0f, -0.15f);
00091         }
00092         glEnd();
00093 
00094         glPointSize(5.0f);
00095         glBegin(GL_POINTS);
00096         //draw all points
00097         for(int i = 0; i < (int)m_FuncControlPoints.size(); i++)
00098         {               
00099                 vTransferFunction2DPoint ptmp = m_FuncControlPoints[i];
00100                 
00101                 glColor4f(ptmp.m_Color.getX(), ptmp.m_Color.getY(), ptmp.m_Color.getZ(), 1.0f);
00102                 glVertex3f(ptmp.m_density * 2.0f - 1.0f, ptmp.m_gmag * 2.0f - 1.0f, -0.2f);
00103         }
00104         glEnd();
00105 
00106         glLineWidth(1.0f);
00107         glBegin(GL_LINES);
00108         for (int i = 0; i < (int)m_FuncControlTriangles.size(); i++)
00109         {
00110                 vTransferFunctionWannabeTriangle t;
00111                 t = m_FuncControlTriangles[i];
00112 
00113                 glColor3f(1.0f, 1.0f, 1.0f);
00114                 glVertex3f( t.point1.x, t.point1.y , -0.02f-i*0.01f);
00115                 glVertex3f( t.point2.x, t.point2.y , -0.02f-i*0.01f);
00116 
00117                 glVertex3f( t.point2.x, t.point2.y , -0.02f-i*0.01f);
00118                 glVertex3f( t.point4.x, t.point4.y , -0.02f-i*0.01f);
00119 
00120                 glVertex3f( t.point4.x, t.point4.y , -0.02f-i*0.01f);
00121                 glVertex3f( t.point1.x, t.point1.y , -0.02f-i*0.01f);
00122         }
00123         glEnd();
00124 
00125         glEnable(GL_BLEND);
00126         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00127 
00128         glBegin(GL_QUADS);
00129         for (int i = 0; i < (int)m_FuncControlTriangles.size(); i++)
00130         {
00131                 vTransferFunctionWannabeTriangle t;
00132                 t = m_FuncControlTriangles[i];
00133 
00134                 float rgba[4];
00135                 rgba[0] = t.point1.rgb.getX();
00136                 rgba[1] = t.point1.rgb.getY();
00137                 rgba[2] = t.point1.rgb.getZ();
00138                 rgba[3] = t.point1.alpha*0.7f;
00139                 glColor4fv(rgba);
00140                 glVertex3f( t.point1.x, t.point1.y , -0.02f-i*0.01f);
00141 
00142                 rgba[0] = t.point2.rgb.getX();
00143                 rgba[1] = t.point2.rgb.getY();
00144                 rgba[2] = t.point2.rgb.getZ();
00145                 rgba[3] = t.point2.alpha*0.7f;
00146                 glColor4fv(rgba);
00147                 glVertex3f( t.point2.x, t.point2.y , -0.02f-i*0.01f);
00148 
00149                 rgba[0] = t.point3.rgb.getX();
00150                 rgba[1] = t.point3.rgb.getY();
00151                 rgba[2] = t.point3.rgb.getZ();
00152                 rgba[3] = t.point3.alpha*0.7f;
00153                 glColor4fv(rgba);
00154                 glVertex3f( t.point3.x, t.point3.y , -0.02f-i*0.01f);
00155 
00156                 rgba[0] = t.point4.rgb.getX();
00157                 rgba[1] = t.point4.rgb.getY();
00158                 rgba[2] = t.point4.rgb.getZ();
00159                 rgba[3] = t.point4.alpha*0.7f;
00160                 glColor4fv(rgba);
00161                 glVertex3f( t.point4.x, t.point4.y , -0.02f-i*0.01f);
00162         }
00163         glEnd();
00164 
00165         glDisable(GL_BLEND);
00166 }
00167 
00168 void VTransferFunction2D::addTransferFunctionPoint( vTransferFunction2DPoint newPoint )
00169 {
00170         m_FuncControlPoints.push_back(newPoint);
00171 
00172         vTransferFunctionWannabeTriangle t;
00173         //bottom point
00174         t.point1.x              = newPoint.m_density * 2.0f - 1.0f;
00175         t.point1.y              = (newPoint.m_gmag - 0.3f) * 2.0f - 1.0f;
00176         t.point1.rgb    = newPoint.m_Color;
00177         t.point1.alpha  = 0.0f,//newPoint.m_Alpha;
00178 
00179         //right point
00180         t.point2.x              = (newPoint.m_density + 0.05f) * 2.0f - 1.0f;
00181         t.point2.y              = (newPoint.m_gmag + 0.15f) * 2.0f - 1.0f;
00182         t.point2.rgb    = VVector(0.0f,0.0f,0.0f);
00183         t.point2.alpha  = 0.0f;
00184 
00185         //left point
00186         t.point4.x              = (newPoint.m_density - 0.05f) * 2.0f - 1.0f;
00187         t.point4.y              = (newPoint.m_gmag + 0.15f) * 2.0f - 1.0f;
00188         t.point4.rgb    = VVector(0.0f,0.0f,0.0f);
00189         t.point4.alpha  = 0.0f;
00190 
00191         //wannabe point on the line p2-p4
00192         t.point3.x              = (newPoint.m_density ) * 2.0f - 1.0f;
00193         t.point3.y              = (newPoint.m_gmag + 0.15f) * 2.0f - 1.0f;
00194         t.point3.rgb    = newPoint.m_Color;
00195         t.point3.alpha  = newPoint.m_Alpha;
00196 
00197         //p1 p2 p3 is ccw
00198 
00199         m_FuncControlTriangles.push_back(t);
00200         m_hasChanged = true;
00201 
00202 }
00203 
00204 VVector VTransferFunction2D::transferFunctionPointInRange(float selectedDensity, float gmag, float range)
00205 {
00206 
00207         return VVector(0.0f,0.0f,-1.0f);
00208 }
00209 
00210 void VTransferFunction2D::addTransferFunctionPoint(vTransferFunctionWannabeTriangle t, vTransferFunction2DPoint newPoint)
00211 {
00212         m_FuncControlPoints.push_back(newPoint);
00213         m_FuncControlTriangles.push_back(t);
00214         m_hasChanged = true;
00215 }
00216 
00217 void VTransferFunction2D::removeTransferFunctionPoint(float density, float gmag, float tres)
00218 {
00219         std::vector<vTransferFunction2DPoint> _FuncControlPoints;
00220         std::vector<vTransferFunctionWannabeTriangle> _FuncControlTriangles;
00221 
00222         for(int i = 0; i< (int)m_FuncControlPoints.size(); i++)
00223         {
00224                 if(abs(m_FuncControlPoints[i].m_density - density) > tres || abs(m_FuncControlPoints[i].m_gmag - gmag) > tres)
00225                 {
00226                         _FuncControlPoints.push_back(m_FuncControlPoints[i]);
00227                         _FuncControlTriangles.push_back(m_FuncControlTriangles[i]);
00228                 }
00229         }
00230 
00231         m_FuncControlPoints.clear();
00232         m_FuncControlTriangles.clear();
00233         m_FuncControlPoints = _FuncControlPoints;
00234         m_FuncControlTriangles = _FuncControlTriangles;
00235 
00236         _FuncControlTriangles.clear();
00237         _FuncControlPoints.clear();
00238         m_hasChanged = true;
00239         
00240 }
00241 
00242 void VTransferFunction2D::changePointColor(float density, float gmag, VVector color, float alpha, float tres)
00243 {
00244         
00245         for(int index = 0; index< (int)m_FuncControlPoints.size(); index++)
00246         {
00247                 if(abs(m_FuncControlPoints[index].m_density - density) < tres && abs(m_FuncControlPoints[index].m_gmag - gmag) < tres)
00248                 {
00249                 
00250                         m_FuncControlPoints[index].m_Color = color;
00251                         m_FuncControlPoints[index].m_Alpha = alpha;
00252 
00253                         m_FuncControlTriangles[index].point1.rgb        = m_FuncControlPoints[index].m_Color;
00254                         m_FuncControlTriangles[index].point1.alpha      = 0.0f;//m_FuncControlPoints[index].m_Alpha;
00255 
00256                         m_FuncControlTriangles[index].point2.rgb        = VVector(0.0f,0.0f,0.0f);
00257                         m_FuncControlTriangles[index].point2.alpha      = 0.0f;
00258 
00259                         m_FuncControlTriangles[index].point4.rgb        = VVector(0.0f,0.0f,0.0f);
00260                         m_FuncControlTriangles[index].point4.alpha      = 0.0f;
00261 
00262                         m_FuncControlTriangles[index].point3.rgb        = m_FuncControlPoints[index].m_Color;
00263                         m_FuncControlTriangles[index].point3.alpha      = m_FuncControlPoints[index].m_Alpha;
00264                         break;
00265                 }
00266         }
00267 
00268         m_hasChanged = true;
00269 }
00270 
00271 void VTransferFunction2D::changeTriangleSize( int index, float offsetw, float offseth)
00272 {
00273         
00274         //if( m_FuncControlTriangles[index].point3.y - m_FuncControlTriangles[index].point1.y + offseth > 0.025f)
00275         {
00276                 m_FuncControlTriangles[index].point1.y -= 2.0f * offseth/3.0f;
00277                 m_FuncControlTriangles[index].point2.y += offseth/3.0f;
00278                 m_FuncControlTriangles[index].point3.y += offseth/3.0f;
00279                 m_FuncControlTriangles[index].point4.y += offseth/3.0f;
00280 
00281                 m_FuncControlTriangles[index].a_offseth += offseth;
00282         }
00283 
00284         if( m_FuncControlTriangles[index].point2.x - m_FuncControlTriangles[index].point4.x + offsetw > 0.025f)
00285         {
00286                 m_FuncControlTriangles[index].point1.x -= 0.0f;
00287                 m_FuncControlTriangles[index].point2.x += offsetw/2.0f;
00288                 m_FuncControlTriangles[index].point3.x += 0.0f;
00289                 m_FuncControlTriangles[index].point4.x -= offsetw/2.0f;
00290 
00291                 m_FuncControlTriangles[index].a_offsetw += offsetw;
00292         }
00293         
00294         m_hasChanged = true;
00295 }
00296 
00297 void VTransferFunction2D::changeTriangleSkew( int index, float skew )
00298 {
00299         
00300         if( abs(m_FuncControlTriangles[index].a_skew + skew) < 0.1f)
00301         {
00302                 m_FuncControlTriangles[index].point1.x += skew;
00303 
00304                 m_FuncControlTriangles[index].a_skew += skew;
00305         }
00306         
00307         m_hasChanged = true;
00308 }
00309 
00310 int VTransferFunction2D::findIndexTransferFunctionPoint(float density, float gmag, float tres)
00311 {
00312         int index = -1;
00313 
00314         for(int i = 0; i< (int)m_FuncControlPoints.size(); i++)
00315         {
00316                 if(abs(m_FuncControlPoints[i].m_density - density) < tres && abs(m_FuncControlPoints[i].m_gmag - gmag) < tres)
00317                 {
00318                         index = i;
00319                         break;
00320                 }
00321         }
00322 
00323         return index;
00324         
00325 }
00326 
00327 void VTransferFunction2D::changePointPosition(int index, float newx, float newy)
00328 {
00329 
00330         //assert
00331         if( index < 0 || index >= (int)m_FuncControlPoints.size()) return;
00332 
00333         m_FuncControlPoints[index].m_density = newx*0.5f + 0.5f;
00334 
00335         if(m_FuncControlPoints[index].m_density > 1.0f) m_FuncControlPoints[index].m_density = 1.0f;
00336         if(m_FuncControlPoints[index].m_density < 0.0f) m_FuncControlPoints[index].m_density = 0.0f;
00337 
00338         m_FuncControlPoints[index].m_gmag = newy*0.5f + 0.5f;
00339         if(m_FuncControlPoints[index].m_gmag > 1.0f) m_FuncControlPoints[index].m_gmag = 1.0f;
00340         if(m_FuncControlPoints[index].m_gmag < 0.0f) m_FuncControlPoints[index].m_gmag = 0.0f;
00341 
00342         m_FuncControlTriangles[index].point1.x          = m_FuncControlPoints[index].m_density * 2.0f - 1.0f + m_FuncControlTriangles[index].a_skew;
00343         m_FuncControlTriangles[index].point1.y          = (m_FuncControlPoints[index].m_gmag - 0.3f) * 2.0f - 1.0f  - 2.0f * m_FuncControlTriangles[index].a_offseth / 3.0f;
00344 
00345         //right point
00346         m_FuncControlTriangles[index].point2.x          = (m_FuncControlPoints[index].m_density + 0.05f) * 2.0f - 1.0f + m_FuncControlTriangles[index].a_offsetw / 2.0f;
00347         m_FuncControlTriangles[index].point2.y          = (m_FuncControlPoints[index].m_gmag + 0.15f) * 2.0f - 1.0f + m_FuncControlTriangles[index].a_offseth / 3.0f;
00348 
00349         //left point
00350         m_FuncControlTriangles[index].point4.x          = (m_FuncControlPoints[index].m_density - 0.05f) * 2.0f - 1.0f - + m_FuncControlTriangles[index].a_offsetw / 2.0f;
00351         m_FuncControlTriangles[index].point4.y          = (m_FuncControlPoints[index].m_gmag + 0.15f) * 2.0f - 1.0f + m_FuncControlTriangles[index].a_offseth / 3.0f;
00352 
00353         //wannabe point on the line p2-p4
00354         m_FuncControlTriangles[index].point3.x          = (m_FuncControlPoints[index].m_density ) * 2.0f - 1.0f;
00355         m_FuncControlTriangles[index].point3.y          = (m_FuncControlPoints[index].m_gmag + 0.15f) * 2.0f - 1.0f + m_FuncControlTriangles[index].a_offseth / 3.0f;
00356 
00357         m_hasChanged = true;
00358 }
00359 
00360 
00361 void VTransferFunction2D::setHistogram2D(unsigned char * volumeHistogram2d)
00362 {
00363         this->clear();
00364         m_VolumeHistogram2D = volumeHistogram2d;
00365 
00366         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
00367 
00368         glGenTextures(1, &m_Histogram2DTextureHandle);
00369 
00370         glActiveTexture(GL_TEXTURE0);
00371         glBindTexture(GL_TEXTURE_2D,m_Histogram2DTextureHandle);
00372 
00373         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
00374         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
00375         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
00376         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
00377 
00378         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
00379         
00380         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,1024, 1024, GL_RGBA, GL_UNSIGNED_BYTE, &(m_VolumeHistogram2D[0]));
00381 
00382         glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
00383 
00384         generateDisplayList2D();
00385 
00386         reinit();
00387 }
00388 
00389 void VTransferFunction2D::generateDisplayList2D()
00390 {
00391         if(m_VolumeHistogramDisplayList2D != 0)
00392         {
00393                 glDeleteLists(m_VolumeHistogramDisplayList2D, 1);
00394         }
00395         
00396         m_VolumeHistogramDisplayList2D = glGenLists(1);
00397         glNewList(m_VolumeHistogramDisplayList2D, GL_COMPILE);
00398 
00399         glEnable(GL_TEXTURE_2D);
00400 
00401         glBegin(GL_QUADS);
00402 
00403                 //glColor4f(0.0f,0.0f,0.0f,1.0f);
00404 
00405                 glTexCoord2f(0.0f, 0.0f);glVertex3f(-1.0f, -1.0f, 0.0f);
00406                 glTexCoord2f(1.0f, 0.0f);glVertex3f( 1.0f, -1.0f, 0.0f);
00407                 glTexCoord2f(1.0f, 1.0f);glVertex3f( 1.0f,  1.0f, 0.0f);
00408                 glTexCoord2f(0.0f, 1.0f);glVertex3f(-1.0f,  1.0f, 0.0f);
00409                  
00410         glEnd();
00411 
00412         glDisable(GL_TEXTURE_2D);
00413 
00414         glEndList();
00415 
00416 }
00417 
00418 void VTransferFunction2D::interpolateTransferTriangles()
00419 {
00420         if(!m_FramebufferObject)
00421         {
00422                 m_FramebufferObject = new VFramebufferObject(1024,1024,GL_RGBA);
00423         }
00424 
00425         glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
00426         if(m_FramebufferObject->getFboHandle() == 0)
00427         {
00428                 m_FramebufferObject->init();
00429         }
00430         m_FramebufferObject->bind();
00431 
00432         //glEnable(GL_BLEND);
00433         //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00434 
00435         glBegin(GL_QUADS);
00436         for (int i = 0; i < (int)m_FuncControlTriangles.size(); i++)
00437         {
00438                 vTransferFunctionWannabeTriangle t;
00439                 t = m_FuncControlTriangles[i];
00440 
00441                 float rgba[4];
00442                 rgba[0] = t.point1.rgb.getX();
00443                 rgba[1] = t.point1.rgb.getY();
00444                 rgba[2] = t.point1.rgb.getZ();
00445                 rgba[3] = t.point1.alpha;
00446                 glColor4fv(rgba);
00447                 glVertex3f( t.point1.x, t.point1.y , -0.02f-i*0.01f);
00448 
00449                 rgba[0] = t.point2.rgb.getX();
00450                 rgba[1] = t.point2.rgb.getY();
00451                 rgba[2] = t.point2.rgb.getZ();
00452                 rgba[3] = t.point2.alpha;
00453                 glColor4fv(rgba);
00454                 glVertex3f( t.point2.x, t.point2.y , -0.02f-i*0.01f);
00455 
00456                 rgba[0] = t.point3.rgb.getX();
00457                 rgba[1] = t.point3.rgb.getY();
00458                 rgba[2] = t.point3.rgb.getZ();
00459                 rgba[3] = t.point3.alpha;
00460                 glColor4fv(rgba);
00461                 glVertex3f( t.point3.x, t.point3.y , -0.02f-i*0.01f);
00462 
00463                 rgba[0] = t.point4.rgb.getX();
00464                 rgba[1] = t.point4.rgb.getY();
00465                 rgba[2] = t.point4.rgb.getZ();
00466                 rgba[3] = t.point4.alpha;
00467                 glColor4fv(rgba);
00468                 glVertex3f( t.point4.x, t.point4.y , -0.02f-i*0.01f);
00469         }
00470         glEnd();
00471 
00472         //glDisable(GL_BLEND);
00473         m_FramebufferObject->unbind();
00474 
00475         //m_FramebufferObject->saveImage("./2dHist.tga");
00476 
00477         m_hasChanged = false;
00478         
00479 }
00480 
00481 bool VTransferFunction2D::load(std::string filepath)
00482 {
00483         if(filepath == "")
00484         {
00485                 return true;
00486         }
00487         FILE *fp = NULL;
00488 
00489         fopen_s(&fp,filepath.c_str(),"rb");
00490 
00491         if(!fp)
00492         {
00493                 return false;
00494         }
00495         unsigned int numPoints;
00496 
00497         fread(&numPoints,sizeof(unsigned int),1,fp);
00498 
00499         m_FuncControlPoints.clear();
00500         m_FuncControlTriangles.clear();
00501         for(unsigned int i = 0; i < numPoints; ++i)
00502         {
00503                 vTransferFunction2DPoint tmpp;
00504                 vTransferFunctionWannabeTriangle tmpt;
00505 
00506                 float pValues[6];
00507                 fread(pValues, sizeof(float), 6, fp);
00508                 tmpp.m_Color.setX(pValues[0]); 
00509                 tmpp.m_Color.setY(pValues[1]); 
00510                 tmpp.m_Color.setZ(pValues[2]); 
00511                 tmpp.m_Alpha = pValues[3]; 
00512                 tmpp.m_gmag = pValues[4];
00513                 tmpp.m_density = pValues[5]; 
00514 
00515                 
00516 
00517                 float p1Values[6];
00518                 fread(p1Values, sizeof(float), 6, fp);
00519 
00520                 tmpt.point1.x = p1Values[0]; 
00521                 tmpt.point1.y = p1Values[1];
00522                 tmpt.point1.rgb.setX(p1Values[2]); 
00523                 tmpt.point1.rgb.setY(p1Values[3]); 
00524                 tmpt.point1.rgb.setZ(p1Values[4]); 
00525                 tmpt.point1.alpha = p1Values[5];
00526                 
00527                 float p2Values[6];
00528                 fread(p2Values, sizeof(float), 6, fp);
00529                 tmpt.point2.x = p2Values[0];
00530                 tmpt.point2.y = p2Values[1]; 
00531                 tmpt.point2.rgb.setX(p2Values[2]); 
00532                 tmpt.point2.rgb.setY(p2Values[3]); 
00533                 tmpt.point2.rgb.setZ(p2Values[4]); 
00534                 tmpt.point2.alpha = p2Values[5]; 
00535                 
00536 
00537                 float p3Values[6];
00538                 fread(p3Values, sizeof(float), 6, fp);
00539                 tmpt.point3.x = p3Values[0]; 
00540                 tmpt.point3.y = p3Values[1]; 
00541                 tmpt.point3.rgb.setX(p3Values[2]); 
00542                 tmpt.point3.rgb.setY(p3Values[3]); 
00543                 tmpt.point3.rgb.setZ(p3Values[4]); 
00544                 tmpt.point3.alpha = p3Values[5];
00545                 
00546 
00547                 float p4Values[6];
00548                 fread(p4Values, sizeof(float), 6, fp);
00549                 tmpt.point4.x = p4Values[0];
00550                 tmpt.point4.y = p4Values[1]; 
00551                 tmpt.point4.rgb.setX(p4Values[2]); 
00552                 tmpt.point4.rgb.setY(p4Values[3]); 
00553                 tmpt.point4.rgb.setZ(p4Values[4]); 
00554                 tmpt.point4.alpha = p4Values[5]; 
00555                 
00556 
00557                 float addVals[3];
00558                 fread(addVals, sizeof(float), 3, fp);
00559                 tmpt.a_offsetw = addVals[0]; 
00560                 tmpt.a_offseth = addVals[1]; 
00561                 tmpt.a_skew = addVals[2]; 
00562 
00563                 m_FuncControlPoints.push_back(tmpp);
00564                 m_FuncControlTriangles.push_back(tmpt); 
00565         }
00566         fclose(fp);
00567         m_hasChanged = true;
00568         return true;
00569 }
00570 
00571 bool VTransferFunction2D::save(std::string filepath)
00572 {
00573         if(filepath == "")
00574         {
00575                 return true;
00576         }
00577         FILE *fp = NULL;
00578 
00579 
00580 
00581         fopen_s(&fp,filepath.c_str(),"wb");
00582 
00583         if(!fp)
00584         {
00585                 return false;
00586         }
00587         unsigned int numPoints = (unsigned int)m_FuncControlPoints.size();
00588 
00589         fwrite(reinterpret_cast<char*>(&numPoints), sizeof(unsigned int), 1,fp);
00590 
00591         for(int i = 0; i < (int)m_FuncControlPoints.size(); ++i)
00592         {
00593                 vTransferFunction2DPoint tmpp = m_FuncControlPoints[i];
00594                 vTransferFunctionWannabeTriangle tmpt = m_FuncControlTriangles[i];
00595 
00596                 float pValues[6];
00597                 pValues[0] = tmpp.m_Color.getX();
00598                 pValues[1] = tmpp.m_Color.getY();
00599                 pValues[2] = tmpp.m_Color.getZ();
00600                 pValues[3] = tmpp.m_Alpha;
00601                 pValues[4] = tmpp.m_gmag;
00602                 pValues[5] = tmpp.m_density;
00603 
00604                 fwrite(reinterpret_cast<char*>(pValues), sizeof(float), 6, fp);
00605                 
00606                 float p1Values[6];
00607                 p1Values[0] = tmpt.point1.x;
00608                 p1Values[1] = tmpt.point1.y;
00609                 p1Values[2] = tmpt.point1.rgb.getX();
00610                 p1Values[3] = tmpt.point1.rgb.getY();
00611                 p1Values[4] = tmpt.point1.rgb.getZ();
00612                 p1Values[5] = tmpt.point1.alpha;
00613                 fwrite(reinterpret_cast<char*>(p1Values), sizeof(float), 6, fp);
00614 
00615                 float p2Values[6];
00616                 p2Values[0] = tmpt.point2.x;
00617                 p2Values[1] = tmpt.point2.y;
00618                 p2Values[2] = tmpt.point2.rgb.getX();
00619                 p2Values[3] = tmpt.point2.rgb.getY();
00620                 p2Values[4] = tmpt.point2.rgb.getZ();
00621                 p2Values[5] = tmpt.point2.alpha;
00622                 fwrite(reinterpret_cast<char*>(p2Values), sizeof(float), 6, fp);
00623 
00624                 float p3Values[6];
00625                 p3Values[0] = tmpt.point3.x;
00626                 p3Values[1] = tmpt.point3.y;
00627                 p3Values[2] = tmpt.point3.rgb.getX();
00628                 p3Values[3] = tmpt.point3.rgb.getY();
00629                 p3Values[4] = tmpt.point3.rgb.getZ();
00630                 p3Values[5] = tmpt.point3.alpha;
00631                 fwrite(reinterpret_cast<char*>(p3Values), sizeof(float), 6, fp);
00632 
00633                 float p4Values[6];
00634                 p4Values[0] = tmpt.point4.x;
00635                 p4Values[1] = tmpt.point4.y;
00636                 p4Values[2] = tmpt.point4.rgb.getX();
00637                 p4Values[3] = tmpt.point4.rgb.getY();
00638                 p4Values[4] = tmpt.point4.rgb.getZ();
00639                 p4Values[5] = tmpt.point4.alpha;
00640                 fwrite(reinterpret_cast<char*>(p4Values), sizeof(float), 6, fp);
00641 
00642                 float addVals[3];
00643                 addVals[0] = tmpt.a_offsetw;
00644                 addVals[1] = tmpt.a_offseth;
00645                 addVals[2] = tmpt.a_skew;
00646 
00647                 fwrite(reinterpret_cast<char*>(addVals), sizeof(float), 3, fp);
00648 
00649         }
00650 
00651         fclose(fp);
00652         return true;
00653 }

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