00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
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
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
00097
00098 void VolyCube::setDims(vec3f origin, vec3f size)
00099 {
00100
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
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
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
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
00173
00174 void VolyCube::setNrroDims(NrroSP n)
00175 {
00176 if(n->isValid())
00177 {
00178 _origin = n->getPos();
00179
00180
00181 readState(n);
00182 if(vec3f_neg_one == _size)
00183 _size = n->getSizeV3();
00184 }
00185
00186 setDims(_origin, _size);
00187 }
00188
00189
00190
00191
00192 void VolyCube::setNrroTcoords(NrroSP n, int texNum)
00193 {
00194
00195
00196 vec2ui a1r = n->axisValNPad(1);
00197 vec2ui a2r = n->axisValNPad(2);
00198 vec2ui a3r = n->axisValNPad(3);
00199
00200
00201 vec3f lltex(vec3f_zero);
00202 vec3f urtex(vec3f_one);
00203
00204
00205
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
00215
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
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
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
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())
00262 {
00263 _size = vec3f_neg_one;
00264 return;
00265 }
00266 else
00267 {
00268
00269 if(str2vec3<float>(szstr, _size))
00270 {
00271
00272 derr("readState(), str2vec3<>() failed, size not read");
00273 _size = vec3f_neg_one;
00274 return;
00275 }
00276 return;
00277 }
00278
00279 }
00280
00281
00282
00283
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
00303 {
00304 VolytopeSP vc(new VolyCube(f,0));
00305 vtv.push_back(vc);
00306 }
00307 return vtv;
00308 }
00309
00310
00311
00312
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 }