00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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
00058
00059 void TFGeneric::update()
00060 {
00061
00062 if(_elts->elementChanged())
00063 {
00064 _elts->updateChanged();
00065 setChanged();
00066 }
00067 }
00068
00069
00070
00071
00072 int TFGeneric::getChangeID()
00073 {
00074 bool changed = false;
00075
00076 if(_elts->elementChanged())
00077 changed = true;
00078
00079
00080 if(changed)
00081 update();
00082
00083 return SimBase::getChangeID();
00084 }
00085
00086
00087
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
00110 v = tv;
00111 }
00112
00113 return v;
00114 }
00115
00116
00117
00118
00119
00120 TFImageSP TFGeneric::get2DMap(gutz::vec2i axesIdx,
00121 const gutz::vec2i size,
00122 int type,
00123 int kind)
00124 {
00125 const int numVals = 4;
00126
00127 vec2i tfmsz = size;
00128
00129
00130 if(size == vec2i_neg_one)
00131 {
00132 derr("get2DMap(), using default size, [256,256]");
00133 tfmsz = vec2i(256,256);
00134 }
00135
00136
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
00144 tfm->clear(kind);
00145
00146
00147 if(!_elts)
00148 {
00149 derr("eval(), no elements to evaluate");
00150
00151 return tfm;
00152 }
00153
00154
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
00167 tfm->setAxes(axesIdx);
00168
00169
00170 return tfm;
00171 }
00172
00173
00174
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
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