arbeit
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

TFBase.cpp

Go to the documentation of this file.
00001 //------------------------------------------------------------------------
00002 //
00003 //   Joe Kniss
00004 //     3-20-03
00005 //                   ________    ____   ___ 
00006 //                  |        \  /    | /  /
00007 //                  +---+     \/     |/  /
00008 //                  +--+|  |\    /|     < 
00009 //                  |  ||  | \  / |  |\  \ 
00010 //                  |      |  \/  |  | \  \ 
00011 //                   \_____|      |__|  \__\
00012 //                       Copyright  2003 
00013 //                      Joe Michael Kniss
00014 //                   <<< jmk@cs.utah.edu >>>
00015 //               "All Your Base are Belong to Us"
00016 //-------------------------------------------------------------------------
00017 
00018 /// TFBase.cpp
00019 
00020 /// a base interface for transfer functions
00021 
00022 
00023 #include "TFBase.h"
00024 #include <nrro/nrroTypeInfo.h>
00025 #include <nrro/nrroUtil.h>
00026 
00027 using namespace gutz;
00028 using namespace std;
00029 
00030 
00031 TFGeneric::TFGeneric() 
00032 : _vol(0), 
00033   _elts(new TFElementList()),
00034   _res(256.0f),
00035   _images()
00036 {
00037 
00038 }
00039 
00040 TFGeneric::TFGeneric(VolumeSP vol) 
00041 : _vol(vol), 
00042   _elts(new TFElementList()),
00043   _res(256.0f),
00044   _images()
00045 {
00046 
00047 }
00048 
00049 TFGeneric::~TFGeneric() 
00050 {
00051    if(!_elts.isNull()) _elts->clear(); 
00052    _elts = 0; 
00053    _vol = 0;
00054 }
00055 
00056 //////////////////////////////////////////////////////////////////////////
00057 /// update
00058 //////////////////////////////////////////////////////////////////////////
00059 void TFGeneric::update() 
00060 {
00061    /// elements changed...
00062    if(_elts->elementChanged())
00063    {
00064       _elts->updateChanged();
00065       setChanged();
00066    }
00067 }
00068 
00069 //////////////////////////////////////////////////////////////////////////
00070 /// get change ID
00071 //////////////////////////////////////////////////////////////////////////
00072 int TFGeneric::getChangeID()
00073 {
00074    bool changed = false;
00075    /// see if any of the elments changed
00076    if(_elts->elementChanged())
00077       changed = true;
00078 
00079    /// update if anything changed
00080    if(changed)
00081       update();
00082 
00083    return SimBase::getChangeID();
00084 }
00085 
00086 //////////////////////////////////////////////////////////////////////////
00087 /// eval
00088 //////////////////////////////////////////////////////////////////////////
00089 TFGeneric::ValType TFGeneric::eval(const PosType &tfpos)
00090 {
00091    if(_elts.isNull())
00092    {
00093       derr("eval(), no elements to evaluate");
00094       return STF::tfRangeType_default;
00095    }
00096 
00097    TFElementListIter iter;
00098    ValType v = STF::tfRangeType_default;
00099    ValType tv;
00100 
00101    for(iter = _elts->begin(); iter != _elts->end(); ++iter)
00102    {
00103       if((*iter).isNull())
00104       {
00105          derr("eval(), null element encountered");
00106          continue;
00107       }
00108       tv = (*iter)->eval(tfpos);
00109       //(*iter)->blend(tv, v);
00110       v = tv;
00111    }
00112 
00113    return v;
00114 }
00115 
00116 //////////////////////////////////////////////////////////////////////////
00117 /// get2DMap
00118 //////////////////////////////////////////////////////////////////////////
00119 
00120 TFImageSP TFGeneric::get2DMap(gutz::vec2i axesIdx,          /// idicies of domain axes
00121                               const gutz::vec2i size,       /// size of map
00122                               int type,                     /// type of map
00123                               int kind)                     /// kind of map
00124 {
00125    const int numVals = 4;
00126 
00127    vec2i tfmsz = size;
00128 
00129    /// check if we have valid sizes or a request for default ones
00130    if(size == vec2i_neg_one)
00131    {
00132       derr("get2DMap(), using default size, [256,256]");
00133       tfmsz = vec2i(256,256);
00134    }
00135    
00136    /// create image if there isn't an appropriate one available
00137    TFImageSP tfm( new TFImage(type, numVals, tfmsz.x, tfmsz.y) );
00138 
00139    tfm->printType();
00140    cerr << " ----- " << type << endl;
00141    cerr << " dims " << tfm->dim() << " - " << tfm->dim(0) << " " << tfm->dim(1) << " " << tfm->dim(2) << endl;
00142 
00143    /// clear out image to defaults dictated by the kind
00144    tfm->clear(kind);
00145 
00146    /// check if we have any elements to render
00147    if(!_elts)
00148    {
00149       derr("eval(), no elements to evaluate");
00150       /// bail if we have nothing to do
00151       return tfm;
00152    }
00153 
00154    /// call rasterize on each of the elements
00155    TFElementListIter iter;
00156    for(iter = _elts->begin(); iter != _elts->end(); ++iter)
00157    {
00158       if((*iter).isNull())
00159       {
00160          derr("gen2DMap(), null element encountered");
00161          continue;
00162       }
00163       (*iter)->rasterize2D(tfm,axesIdx,kind);
00164    }
00165 
00166    /// remember what axies this TF image are for
00167    tfm->setAxes(axesIdx);
00168    
00169    /// done
00170    return tfm;
00171 }
00172 
00173 //////////////////////////////////////////////////////////////////////////
00174 /// getImage
00175 //////////////////////////////////////////////////////////////////////////
00176 
00177 TFImageSP TFGeneric::getImage(const gutz::vec2i &ai)
00178 {
00179    TFImageSPMapIter iter = _images.find(ai);
00180    if(_images.end() == iter)
00181       return TFImageSP(0);
00182    return (*iter).second;
00183 }
00184 
00185 //////////////////////////////////////////////////////////////////////////
00186 /// setImage
00187 //////////////////////////////////////////////////////////////////////////
00188 void      TFGeneric::setImage(const TFImageSP im)
00189 {
00190    if(!im)
00191    {
00192       derr("setImage(), attempting to add a null image");
00193       return;
00194    }
00195    _images[im->getAxes()] = im;
00196 }
00197 

Send questions, comments, and bug reports to:
jmk