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
00015
00016
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
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
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
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
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
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
00155
00156 }
00157
00158 void VTransferFunction::removeTransferFunctionPoint(int density)
00159 {
00160 m_FuncControlPoints.erase(density);
00161 m_hasChanged = true;
00162
00163
00164
00165 }
00166
00167 void VTransferFunction::generateDisplayList()
00168 {
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
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
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
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
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 }