www.pudn.com > Ì廿֯Âë.rar > tfvolume.cpp, change:2001-12-11,size:3383b


#include "tfvolume.h" 
#include "progress.h" 
 
TransferFunctionVolume::TransferFunctionVolume(Volume *vol, TransferFunction *tf) 
{ 
   m_x = vol->GetDimX(); 
   m_y = vol->GetDimY(); 
   m_z = vol->GetDimZ(); 
   m_xy = m_x * m_y; 
   m_vol = vol; 
   m_tf = tf; 
   int size = m_x * m_y * m_z; 
   m_colors = new rgba[size]; 
   m_opacity = new float[size]; 
   m_update = true; 
} 
 
TransferFunctionVolume::~TransferFunctionVolume() 
{ 
   delete []m_colors; 
   delete []m_opacity; 
} 
 
void  
TransferFunctionVolume::UpdateOnUse() 
{ 
   m_update = true; 
} 
 
void  
TransferFunctionVolume::Update() 
{ 
   if (!m_update) return; 
   m_update = false; 
 
   ProgressWin pw; 
   pw.SetText("Updating Transfer Function Colors ..."); 
   pw.SetRange(0, m_z-1); 
 
   for (int z=0; z<m_z; z++) 
   { 
      for (int y=0; y<m_y; y++) 
         for (int x=0; x<m_x; x++) 
         { 
            data_t data = m_vol->GetData(x,y,z); 
            int i = DATA(x,y,z); 
            m_tf->GetColor(data, m_colors[i]); 
            m_tf->GetOpacity(data, m_opacity[i]); 
         }            
      pw.SetPos(z); 
   } 
} 
 
bool  
TransferFunctionVolume::GetColor(coord3 &pos, rgba &color) 
{ 
   if (m_update) Update(); 
   color = m_colors[DATA((int)(pos.x),(int)(pos.y),(int)(pos.z))]; 
   return true; 
} 
 
bool 
TransferFunctionVolume::GetColorTL(coord3 &pos, rgba &color) 
{ 
   int x0 = (int)(pos.x); 
   int y0 = (int)(pos.y); 
   int z0 = (int)(pos.z); 
   if ((x0 >= m_x-1) || (y0 >= m_y-1) || (z0 >= m_z-1)) return false; 
   int x1 = x0+1; 
   int y1 = y0+1; 
   int z1 = z0+1; 
 
   float fx = pos.x - x0; 
   float fy = pos.y - y0; 
   float fz = pos.z - z0; 
 
   rgbaf cm00 = (rgba2rgbaf(m_colors[DATA(x0,y0,z0)])*(1-fx) + rgba2rgbaf(m_colors[DATA(x1,y0,z0)])*fx); 
   rgbaf cm10 = (rgba2rgbaf(m_colors[DATA(x0,y1,z0)])*(1-fx) + rgba2rgbaf(m_colors[DATA(x1,y1,z0)])*fx); 
   rgbaf cm01 = (rgba2rgbaf(m_colors[DATA(x0,y0,z1)])*(1-fx) + rgba2rgbaf(m_colors[DATA(x1,y0,z1)])*fx); 
   rgbaf cm11 = (rgba2rgbaf(m_colors[DATA(x0,y1,z1)])*(1-fx) + rgba2rgbaf(m_colors[DATA(x1,y1,z1)])*fx); 
   rgbaf cmm0 = (cm00*(1-fy) + cm10*fy); 
   rgbaf cmm1 = (cm01*(1-fy) + cm11*fy); 
   rgbaf cmmm = (cmm0*(1-fz) + cmm1*fz); 
   color = rgbaf2rgba(cmmm); 
   return true; 
} 
 
bool  
TransferFunctionVolume::GetTransparency(coord3 &pos, float &transparency) 
{ 
   if (m_update) Update(); 
   transparency = 1.0f - m_opacity[DATA((int)(pos.x),(int)(pos.y),(int)(pos.z))]; 
   return true; 
} 
 
bool  
TransferFunctionVolume::GetTransparencyTL(coord3 &pos, float &transparency) 
{ 
   int x0 = (int)(pos.x); 
   int y0 = (int)(pos.y); 
   int z0 = (int)(pos.z); 
   if ((x0 >= m_x-1) || (y0 >= m_y-1) || (z0 >= m_z-1)) return false; 
   int x1 = x0+1; 
   int y1 = y0+1; 
   int z1 = z0+1; 
 
   float fx = pos.x - x0; 
   float fy = pos.y - y0; 
   float fz = pos.z - z0; 
   float om00 = m_opacity[DATA(x0,y0,z0)]*(1-fx) + m_opacity[DATA(x1,y0,z0)]*fx; 
   float om10 = m_opacity[DATA(x0,y1,z0)]*(1-fx) + m_opacity[DATA(x1,y1,z0)]*fx; 
   float om01 = m_opacity[DATA(x0,y0,z1)]*(1-fx) + m_opacity[DATA(x1,y0,z1)]*fx; 
   float om11 = m_opacity[DATA(x0,y1,z1)]*(1-fx) + m_opacity[DATA(x1,y1,z1)]*fx; 
   float omm0 = om00*(1-fy) + om10*fy; 
   float omm1 = om01*(1-fy) + om11*fy; 
   float ommm = omm0*(1-fz) + omm1*fz; 
   transparency = 1.0f - ommm; 
   return true; 
}