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

TFItem.cpp

Go to the documentation of this file.
00001 //------------------------------------------------------------------------
00002 //
00003 //   Joe Kniss
00004 //     6-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 /// TFItem.cpp
00019 ///  simianUI
00020 
00021 #include "TFItem.h"
00022 #include <iostream>
00023 #include <algorithm>
00024 
00025 using namespace std;
00026 
00027 
00028 //////////////////////////////////////////////////////////////////////////
00029 //////////////////////////////////////////////////////////////////////////
00030 /// TFItem
00031 //////////////////////////////////////////////////////////////////////////
00032 //////////////////////////////////////////////////////////////////////////
00033 
00034 //////////////////////////////////////////////////////////////////////////
00035 /// construct
00036 TFItem::TFItem(QCanvas *canvas, TFEltSP elt)
00037 : PolygonEdit(canvas), _elt(elt), _axisX(0), _axisY(1), _lastEltMod(0), _lastElmMod(0),
00038 _done(false), _scale(canvas->width(), canvas->height()), _border(STF::tfSType(5.0))
00039 {
00040 
00041    if(_elt.isNull()) 
00042    {
00043       cerr << "TFItem::construct(), ERROR tf element is NULL" << endl;
00044    }
00045    else
00046    {
00047       /// elt
00048       _lastEltMod = _elt.getChangeID();
00049       _lastElmMod = _elt->getChangeID();
00050    }
00051    setTransform();
00052 }
00053 
00054 //////////////////////////////////////////////////////////////////////////
00055 /// update
00056 void TFItem::update()
00057 {
00058    cerr << " update called " << endl;
00059    setTransform();
00060    updateDef();
00061    _lastEltMod = _elt.getChangeID();
00062    if(!_elt.isNull())
00063    {
00064       _lastElmMod = _elt->getChangeID();
00065    }
00066 }
00067 
00068 //////////////////////////////////////////////////////////////////////////
00069 /// getTFPosCA 
00070 tfVec2 TFItem::getTFPosCA(int i)
00071 {
00072    /// get tf element
00073    TFElement *tfe = _elt.getPtr();
00074    /// make sure we are good
00075    if((!tfe) || (i >= int(tfe->getPosVec().size()) ))
00076       return tfVec2_bad;
00077    
00078    /// get position
00079    TFElement::PosType p = tfe->getPos(i);
00080    /// get elements that correspond to current axes
00081    return tfVec2(p[_axisX], p[_axisY]);
00082 }
00083 
00084 //////////////////////////////////////////////////////////////////////////
00085 /// setTFPosCA
00086 void   TFItem::setTFPosCA(int i, tfVec2 pos)
00087 {
00088    /// get tf element
00089    TFElement *tfe = _elt.getPtr();
00090    /// make sure we are good
00091    if((!tfe) || (i >= int(tfe->getPosVec().size()) ))
00092       return;
00093    
00094    TFElement::PosType p = tfe->getPos(i);
00095    p[_axisX] = pos.x;
00096    p[_axisY] = pos.y;
00097    tfe->setPos(i,p);
00098 }
00099 
00100 //////////////////////////////////////////////////////////////////////////
00101 /// setScale
00102 void TFItem::setScale(tfVec2 scales)
00103 {
00104    _scale = scales;
00105    _invScale.x = 1.0/_scale.x;
00106    _invScale.y = 1.0/_scale.y;
00107    setTransform();
00108 }
00109 
00110 //////////////////////////////////////////////////////////////////////////
00111 /// set Transform
00112 void TFItem::setTransform()
00113 {
00114    /// set to identity
00115    _xform.eye();
00116    _invXform.eye();
00117    tfVec2 scale(_scale - _border*2.0);
00118    
00119    _xform[0] *= _scale.x;
00120    _xform[4] *= _scale.x;
00121    _xform[6] += _border.x;
00122    _xform[7] += _border.y;
00123 
00124    /// TODO: looks like the mat3 inverse is fucked up,
00125    ///  shouldn't need a transpose, need to fix this!
00126    _invXform = _xform.inv().tp();
00127 
00128 }
00129 
00130 //////////////////////////////////////////////////////////////////////////
00131 //////////////////////////////////////////////////////////////////////////
00132 /// TFItemVec
00133 //////////////////////////////////////////////////////////////////////////
00134 //////////////////////////////////////////////////////////////////////////
00135 
00136 //////////////////////////////////////////////////////////////////////////
00137 /// construct
00138 TFItemVec::TFItemVec(QCanvas *canvas, TFBaseSP tf)
00139 : _tf(tf), _canvas(canvas), _scales(canvas->width(), canvas->height()),
00140 _border(STF::tfSType(5))
00141 {
00142    setTF(tf);
00143 }
00144 
00145 //////////////////////////////////////////////////////////////////////////
00146 /// destruct
00147 TFItemVec::~TFItemVec()
00148 {
00149    clear();
00150 }
00151 
00152 //////////////////////////////////////////////////////////////////////////
00153 /// update
00154 void TFItemVec::update()
00155 {
00156    if(_tf.isNull()) return;
00157    checkNewElts();
00158    checkDelElts();
00159 
00160    /// call update on all items
00161    for(int i=0; i< int(size()); ++i)
00162    {
00163       TFItemSP item = this->operator[](i);
00164       item->setScale(_scales);
00165       item->setBorder(_border);
00166       item->update();
00167    }
00168 }
00169 
00170 //////////////////////////////////////////////////////////////////////////
00171 /// get Item
00172 TFItemSP TFItemVec::getItem(TFEltSP elt) const
00173 {
00174    for(TFItemVecConstIter i = begin(); i != end(); ++i)
00175    {
00176       (*i)->getElt() == elt;
00177       return (*i);
00178    }
00179    return TFItemSP(0);
00180 }
00181 
00182 //////////////////////////////////////////////////////////////////////////
00183 /// add Item
00184 void TFItemVec::addItem(TFEltSP elt)
00185 {
00186    /// check if it is already in list
00187    if(getItem(elt).isNull())
00188    {
00189       /// add it to list
00190       TFItemSP item(genTFItem(elt, _canvas));
00191       /// cant generate the correct item, return
00192       if(item.isNull())
00193       {
00194          cerr << "TFItemVec::addItem, cannot generate correct item" << endl;
00195          return;
00196       }
00197       push_back(item);
00198    }
00199 }
00200 
00201 //////////////////////////////////////////////////////////////////////////
00202 /// check new elements
00203 void TFItemVec::checkNewElts()
00204 {
00205    TFElementListSP tfel = _tf->getTFElts();
00206    for(TFElementListIter i = tfel->begin(); i != tfel->end(); ++i)
00207    {
00208       addItem((*i));
00209    }
00210 }
00211 
00212 //////////////////////////////////////////////////////////////////////////
00213 /// check deleted elements
00214 void TFItemVec::checkDelElts()
00215 {
00216 #if 0
00217    TFElementListSP tfel = _tf->getTFElts();
00218    for(TFElementListIter i = tfel->begin(); i != tfel->end(); ++i)
00219    {
00220       if( (*i)->needRemove() )
00221       {
00222          TFItemVecIter deliter = find(begin(), end(), getItem(*i));
00223          if(deliter != end())
00224          {
00225             erase( deliter  );
00226          }
00227          else
00228          {
00229             cerr << "TFItemVec::checkDelElts(), element not found in vector" << endl;
00230          }
00231       }
00232    }
00233 #endif
00234 }
00235 
00236 //////////////////////////////////////////////////////////////////////////
00237 /// set TF
00238 void  TFItemVec::setTF(TFBaseSP tf)
00239 {
00240    _tf = tf;
00241    /// nuke everything
00242    clear();
00243    /// rebuild
00244    update();
00245 }
00246 
00247 //////////////////////////////////////////////////////////////////////////
00248 /// set Canvas
00249 void  TFItemVec::setCanvas(QCanvas *canvas)
00250 {
00251    for(int i=0; i< int(size()); ++i)
00252    {
00253       this->operator[](i)->setCanvas(canvas);
00254    }
00255    _canvas = canvas;
00256 }
00257 

Send questions, comments, and bug reports to:
jmk