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

VolytopeStd.cpp

Go to the documentation of this file.
00001 //------------------------------------------------------------------------
00002 //
00003 //   Joe Kniss
00004 //     9-20-02
00005 //                   ________    ____   ___ 
00006 //                  |        \  /    | /  /
00007 //                  +---+     \/     |/  /
00008 //                  +--+|  |\    /|     < 
00009 //                  |  ||  | \  / |  |\  \ 
00010 //                  |      |  \/  |  | \  \ 
00011 //                   \_____|      |__|  \__\
00012 //                       Copyright  2002 
00013 //                      Joe Michael Kniss
00014 //                   <<< jmk@cs.utah.edu >>>
00015 //               "All Your Base are Belong to Us"
00016 //-------------------------------------------------------------------------
00017 
00018 //VolytopeStd.h
00019 
00020 #include "VolytopeStd.h"
00021 #include <assert.h>
00022 #include <string>
00023 #include <sstream>
00024 
00025 using namespace gutz;
00026 using namespace std;
00027 
00028 ///////////////////////////////////////////////////////////////////
00029 //=================================================================
00030 //  VolyCube
00031 //=================================================================
00032 ///////////////////////////////////////////////////////////////////
00033 
00034 VolyCube::VolyCube(vec3f origin, vec3f size, vec3f lltex, vec3f urtex)
00035 : Volytope(string("VolyCube")),
00036 _origin(origin),
00037 _size(size)
00038 {
00039    genVerts(8);
00040    genTcoords(0);
00041    genEdges(12);
00042 
00043    setDims(_origin, _size);
00044    setTcoords(lltex, urtex, 0);
00045 }
00046 
00047 VolyCube::VolyCube(NrroSP nrro)
00048 :Volytope(string("VolyCube")),
00049 _origin(vec3f_neg_half),
00050 _size(vec3f_one)
00051 {
00052    genVerts(8);
00053    genTcoords(0);
00054    genEdges(12);
00055 
00056    if(nrro.isNull())
00057    {
00058       derr("VolyCube(NrroSP), invalid nrro!");
00059       setTcoords(vec3f_zero, vec3f_one, 0);
00060       setDims(_origin, _size);
00061       return;
00062    }
00063 
00064    nrro->forceMultiChannel();
00065 
00066    setNrroDims(nrro);
00067    setNrroTcoords(nrro,0);
00068 }
00069 
00070 ///////////////////////////////////////////////////////////////////
00071 /// VolyCube from field
00072 ///////////////////////////////////////////////////////////////////
00073 VolyCube::VolyCube(VolFieldSP f, unsigned int brickNum)
00074 {
00075    genVerts(8);
00076    genTcoords(0);
00077    genEdges(12);
00078 
00079    if(f->getBrick(brickNum).isNull())
00080    {
00081       derr("VolyCube(VolFieldSP), invalid nrro!");
00082       setTcoords(vec3f_zero, vec3f_one, 0);
00083       setDims(_origin, _size);
00084       return;
00085    }
00086 
00087    f->getBrick(brickNum)->forceMultiChannel();
00088 
00089    setNrroDims(f->getBrick(brickNum));
00090    setNrroTcoords(f->getBrick(brickNum),0);
00091    addTexture(f->genBrickTexture(brickNum));
00092 }
00093 
00094 
00095 ///////////////////////////////////////////////////////////////////
00096 /// set dims
00097 ///////////////////////////////////////////////////////////////////
00098 void VolyCube::setDims(vec3f origin, vec3f size)
00099 {
00100    //assert(_verts); assert(_tcoords[0]); assert(_edges);
00101 
00102    arrayw1v3f v = getVerts();
00103    arrayw1v2i e = getEdges();
00104 
00105    v[0] = origin;
00106    v[1] = origin + size * vec3f_x;
00107    v[2] = origin + size * vec3f_y;
00108    v[3] = origin + size * vec3f_xy;
00109    v[4] = origin + size * vec3f_z;
00110    v[5] = origin + size * vec3f_xz;
00111    v[6] = origin + size * vec3f_yz;
00112    v[7] = origin + size * vec3f_xyz;
00113 
00114    e[0]  = vec2i(0,1);
00115    e[1]  = vec2i(0,2);
00116    e[2]  = vec2i(0,4);
00117    e[3]  = vec2i(1,3);
00118    e[4]  = vec2i(1,5);
00119    e[5]  = vec2i(2,3);
00120    e[6]  = vec2i(2,6);
00121    e[7]  = vec2i(3,7);
00122    e[8]  = vec2i(4,5);
00123    e[9]  = vec2i(4,6);
00124    e[10] = vec2i(5,7);
00125    e[11] = vec2i(6,7);
00126 
00127    setSizes();
00128 }
00129 
00130 ///////////////////////////////////////////////////////////////////
00131 /// set tcoords
00132 ///////////////////////////////////////////////////////////////////
00133 void VolyCube::setTcoords(gutz::vec3f lltex, gutz::vec3f urtex, unsigned int texNum)
00134 {
00135    arrayw1v3f t = getTcoords(texNum);
00136 
00137    t[0] = lltex;
00138    t[1] = vec3f(urtex.x, lltex.y, lltex.z);
00139    t[2] = vec3f(lltex.x, urtex.y, lltex.z);
00140    t[3] = vec3f(urtex.x, urtex.y, lltex.z);
00141    t[4] = vec3f(lltex.x, lltex.y, urtex.z);
00142    t[5] = vec3f(urtex.x, lltex.y, urtex.z);
00143    t[6] = vec3f(lltex.x, urtex.y, urtex.z);
00144    t[7] = urtex;
00145 }
00146 
00147 ///////////////////////////////////////////////////////////////////
00148 /// Load Field
00149 ///////////////////////////////////////////////////////////////////
00150 void VolyCube::loadField(VolFieldSP f, unsigned int brickNum)
00151 {
00152    loadNrro(f->getBrick(brickNum));
00153    addTexture(f->genTexture(brickNum));
00154 }
00155 
00156 ///////////////////////////////////////////////////////////////////
00157 /// Load Nrro
00158 ///////////////////////////////////////////////////////////////////
00159 void VolyCube::loadNrro(NrroSP n)
00160 {
00161    if(n.isNull())
00162    {
00163       derr("loadNrro(), invalid nrro!");
00164       return;
00165    }
00166 
00167    n->forceMultiChannel();
00168    setNrroTcoords(n, -1);
00169 }
00170 
00171 ///////////////////////////////////////////////////////////////////
00172 /// set Nrro Dims
00173 ///////////////////////////////////////////////////////////////////
00174 void VolyCube::setNrroDims(NrroSP n)
00175 {
00176    if(n->isValid())
00177    {
00178       _origin = n->getPos();
00179       
00180       /// see if the nrro has a better idea about it's size
00181       readState(n); 
00182       if(vec3f_neg_one == _size)
00183          _size = n->getSizeV3();
00184    }
00185 
00186    setDims(_origin, _size);
00187 }
00188 
00189 ///////////////////////////////////////////////////////////////////
00190 /// set Nrro Tcoords
00191 ///////////////////////////////////////////////////////////////////
00192 void VolyCube::setNrroTcoords(NrroSP n, int texNum)
00193 {
00194    /// get the ranges of valid data values from
00195    /// the nrrd for each axis
00196    vec2ui a1r = n->axisValNPad(1);
00197    vec2ui a2r = n->axisValNPad(2);
00198    vec2ui a3r = n->axisValNPad(3);
00199 
00200    /// texture coordinates lower-left & upper right
00201    vec3f lltex(vec3f_zero);
00202    vec3f urtex(vec3f_one);
00203 
00204    /// figure out what where the valid ranges are in
00205    ///  terms of texture coordnates
00206    lltex.x = float(AIR_AFFINE(0, a1r.x, n->dim(1), 0.0f, 1.0f));
00207    lltex.y = float(AIR_AFFINE(0, a2r.x, n->dim(2), 0.0f, 1.0f));
00208    lltex.z = float(AIR_AFFINE(0, a3r.x, n->dim(3), 0.0f, 1.0f));
00209 
00210    urtex.x = float(AIR_AFFINE(0, a1r.y, n->dim(1), 0.0f, 1.0f));
00211    urtex.y = float(AIR_AFFINE(0, a2r.y, n->dim(2), 0.0f, 1.0f));
00212    urtex.z = float(AIR_AFFINE(0, a3r.y, n->dim(3), 0.0f, 1.0f));
00213 
00214    /// Always offset texture coordinates by a half!!!!
00215    /// because that's the way opengl stores them?
00216    vec3f htex(1.0f/(2.0f*n->dim(1)), 1.0f/(2.0f*n->dim(2)), 1.0f/(2.0f*n->dim(3)));
00217    lltex += htex;
00218    urtex -= htex;
00219 
00220    unsigned int txnum = (unsigned int) texNum;
00221    if(texNum == -1)
00222    {
00223       unsigned int txnum = 0;
00224       while(!checkTcoords(lltex, urtex, txnum)) ++txnum;
00225    }
00226    setTcoords(lltex, urtex, txnum);
00227 }
00228 
00229 ///////////////////////////////////////////////////////////////////
00230 /// check texture coordinates
00231 ///////////////////////////////////////////////////////////////////
00232 bool VolyCube::checkTcoords(gutz::vec3f lltex, gutz::vec3f urtex, unsigned int texNum)
00233 {
00234    arrayw1v3f tc = getTcoords(texNum);
00235    return ( (lltex == tc[0]) && (urtex == tc[7]) );
00236 }
00237 
00238 ///////////////////////////////////////////////////////////////////
00239 /// write state
00240 ///////////////////////////////////////////////////////////////////
00241 const std::string VC_SIZE_KEY_STR("size_VolyCube");
00242 
00243 void VolyCube::writeState(NrroSP n)
00244 {
00245    if(n.isNull()) return;
00246 
00247    std::ostringstream ss;
00248    ss << _size;
00249    std::string szstr = ss.str();
00250 
00251    n->setComment(VC_SIZE_KEY_STR, szstr);
00252 }
00253 
00254 ///////////////////////////////////////////////////////////////////
00255 /// read state
00256 ///////////////////////////////////////////////////////////////////
00257 void VolyCube::readState(NrroSP n)
00258 {
00259    if(n.isNull()) return;
00260    std::string szstr = n->getComment(VC_SIZE_KEY_STR);
00261    if(szstr.empty()) /// didn't find saved info
00262    {
00263       _size = vec3f_neg_one;
00264       return;
00265    }
00266    else /// did find it
00267    {
00268       /// read vec3 from string, check if good
00269       if(str2vec3<float>(szstr, _size)) 
00270       {
00271          /// not good couldn't read it
00272          derr("readState(), str2vec3<>() failed, size not read");
00273          _size = vec3f_neg_one;
00274          return;
00275       }
00276       return;
00277    }
00278    /// can't get here!
00279 }
00280 
00281 ///////////////////////////////////////////////////////////////////
00282 ///////////////////////////////////////////////////////////////////
00283 /// a VolyCube factory function, from a field
00284 ///////////////////////////////////////////////////////////////////
00285 ///////////////////////////////////////////////////////////////////
00286 VolytopeVec genVolyCubes(VolFieldSP f)
00287 {
00288    if(!f){
00289       cerr << "genVolyCubes(VolFieldSP), ERROR, field invalid" << endl;
00290       return VolytopeVec();
00291    }
00292 
00293    VolytopeVec vtv;
00294    if(f->isBricked())
00295    {
00296       for(unsigned int i=0; i<f->numBricks(); ++i)
00297       {
00298          VolytopeSP vc(new VolyCube(f, i));
00299          vtv.push_back(vc);
00300       }
00301    }
00302    else // not bricked
00303    {
00304       VolytopeSP vc(new VolyCube(f,0));
00305       vtv.push_back(vc);
00306    }
00307    return vtv;
00308 }
00309 
00310 ///////////////////////////////////////////////////////////////////
00311 //=================================================================
00312 //  VolyTet
00313 //=================================================================
00314 ///////////////////////////////////////////////////////////////////
00315 
00316 VolyTet::VolyTet(vec3f origin, vec3f size)
00317 {
00318 
00319 }
00320 
00321 VolyTet::VolyTet(vec3f p0, vec3f p1, vec3f p2, vec3f p4)
00322 {
00323 
00324 }

Send questions, comments, and bug reports to:
jmk