Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

VolSet.cpp

Go to the documentation of this file.
00001 #include "TorstensFilters.h"
00002 #include "VolSet.h"
00003 
00004 using namespace SpecFVRNS;
00005 
00006 VolumeSet::VolumeSet(int nvolumes)
00007 {
00008     m_Volumes = NULL;
00009     m_Filter = NULL;
00010     createVolumes(nvolumes,true);
00011 }
00012 
00013 VolumeSet::~VolumeSet() 
00014 {
00015     destroyData(true);
00016 }
00017 
00018 void VolumeSet::createVolumes(int nvolumes, bool initFilter) 
00019 {
00020     cout << "initializing " << nvolumes << " volumes" << endl;
00021     if(m_Volumes) destroyData(initFilter);
00022     m_NVolumes = nvolumes;
00023     if(initFilter) {
00024         cout << "reseting filter" << endl;
00025         m_Filter = new TorstensFilters(d0_c3_4ef);
00026     }
00027     
00028     if(nvolumes) {
00029         m_Volumes = new Volume*[m_NVolumes];
00030         int c;
00031         for(c=0; c<m_NVolumes; c++)
00032             m_Volumes[c]= new Volume;
00033         if(!initFilter) setFilter(m_Filter);
00034     } else
00035         m_Volumes = NULL;
00036     m_Recomp=false;
00037 }
00038 
00039 void VolumeSet::destroyData(bool destroyFilter) 
00040 {
00041     if(m_Volumes) {
00042         int c;
00043         for(c=0;c<m_NVolumes;c++) {
00044             if(m_Volumes[c]) delete m_Volumes[c];
00045         }
00046         delete m_Volumes;
00047         m_Volumes = NULL;
00048         m_NVolumes = 0;
00049     }
00050     if(destroyFilter && m_Filter) {
00051         delete m_Filter;
00052         m_Filter=NULL;
00053     }
00054 }
00055 
00056 #define FILTER_SET_SUB(x)       \
00057         m_Filter = new TorstensFilters((x));    \
00058         ITERATE_VOLS(setFilter(m_Filter));      \
00059         //cout << #x << " : Filter width = " << m_Filter->getWidth() << endl;
00060 
00061 bool VolumeSet::setFilter(int num)
00062 {
00063         Filter* tmp = m_Filter;
00064         switch(num) {
00065         case 0:  FILTER_SET_SUB(d0_c0_1ef); break;
00066         case 1:  FILTER_SET_SUB(d0_c0_2ef); break;
00067         case 2:  FILTER_SET_SUB(d0_c0_3ef); break;
00068         case 3:  FILTER_SET_SUB(d0_c0_4ef); break;
00069         case 4:  FILTER_SET_SUB(d0_c1_1ef); break;
00070         case 5:  FILTER_SET_SUB(d0_c1_2ef); break;
00071         case 6:  FILTER_SET_SUB(d0_c1_3ef); break;
00072         case 7:  FILTER_SET_SUB(d0_c1_4ef); break;
00073         case 8:  FILTER_SET_SUB(d0_c2_1ef); break;
00074         case 9:  FILTER_SET_SUB(d0_c2_2ef); break;
00075         case 10: FILTER_SET_SUB(d0_c2_3ef); break;
00076         case 11: FILTER_SET_SUB(d0_c2_4ef); break;
00077         case 12: FILTER_SET_SUB(d0_c3_1ef); break;
00078         case 13: FILTER_SET_SUB(d0_c3_2ef); break;
00079         case 14: FILTER_SET_SUB(d0_c3_3ef); break;
00080         case 15: FILTER_SET_SUB(d0_c3_4ef); break;
00081         case 16: FILTER_SET_SUB(d0_cn_1ef); break;
00082         case 17: FILTER_SET_SUB(d0_cn_2ef); break;
00083         case 18: FILTER_SET_SUB(d0_cn_3ef); break;
00084         case 19: FILTER_SET_SUB(d0_cn_4ef); break;
00085         default: return false;
00086         }
00087         if (tmp) delete tmp;
00088         m_Recomp = true;
00089         return true;
00090 }
00091 
00092 bool VolumeSet::setFilter(Filter* filter)
00093 {
00094     if(filter == m_Filter) return true;
00095     Filter* tmp = m_Filter;
00096     m_Filter = filter;
00097     int c;
00098     for( c=0; c<m_NVolumes; c++) {
00099         if(m_Volumes[c]) m_Volumes[c]->setFilter(m_Filter);
00100     }
00101     //ITERATE_VOLS(setFilter(m_Filter));
00102     //cout << "Filter width = " << m_Filter->getWidth() << endl;
00103     if (tmp) delete tmp;    
00104     m_Recomp = true;
00105     return true;
00106 }
00107 
00108 // Read the volume
00109 bool VolumeSet::read(char* in, float s, float m_pad, dword a_pad ) 
00110 {
00111     if (!in) return false;
00112     createVolumes(1);
00113     if(!m_Filter) {
00114         cout << "No Filter set!" << endl;
00115         return false;
00116     }
00117     
00118 /* roadmap
00119    (in VolSet) load a transfer function
00120    (combine with vuVolume?)
00121    (in VolSet) load a vud, classify
00122    create different volumes
00123    transform to Freq
00124    
00125    rendering:
00126    slice 
00127    inverse transform
00128    create spectral image
00129    illuminate image -> create RGB
00130    draw pixels
00131    
00132    control:
00133    have (two/several) light sources
00134    set weights
00135 */
00136     
00137     //createVolumes(1);
00138     
00139     //m_Volumes[0]->setFilter(m_Filter);
00140     //m_Volumes[0]->read(in,s,m_pad,a_pad);
00141     cout <<"read not implemented anymore"<<endl;
00142     return false;
00143     
00144 }
00145 
00146 bool VolumeSet::write_fvr(char* fn) 
00147 {
00148     if(!fn) return false;
00149     if(m_NVolumes == 0) return false;
00150     m_Volumes[0]->write_fvr(fn);
00151     return true;
00152 }
00153 
00154 void VolumeSet::buildColourVolumes(byte *data, 
00155                                    dword xsize, dword ysize, dword zsize,
00156                                    dword dsize, const vuTFIntensity &tfunc,
00157                                    float osamp, float m_pad, dword a_pad)
00158 {
00159     createVolumes(tfunc.getNComponents()-1); //no alpha volume
00160     if(!m_Filter) {
00161         cerr <<"No filter defined."<<endl;
00162         return;
00163     }
00164     int c;
00165     for(c=0;c<m_NVolumes;c++) {
00166         m_Volumes[c]->setFilter(m_Filter);
00167         m_Volumes[c]->convert(data, xsize, ysize, zsize, dsize,
00168                               tfunc, c, osamp, m_pad, a_pad);
00169     }    
00170 }

Generated on Wed Dec 15 21:20:32 2004 for vuVolume by  doxygen 1.3.9.1