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;
}