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
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
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
00142
00143
00144 }
00145
00146 void VTransferFunction::removeTransferFunctionPoint(int density)
00147 {
00148 m_FuncControlPoints.erase(density);
00149 m_hasChanged = true;
00150
00151
00152
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;
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
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
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
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
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 }