FDH6.cc

Go to the documentation of this file.
00001 #include <esg/geometry/FDH6.h>
00002 #include <esg/mesh/BoxMesh.h>
00003 
00004 using namespace esg;
00005 
00006 const unsigned FDH6::DIRS      =  3;             // number of directions
00007 const unsigned FDH6::SIZE      =  6 ;            // 2 * DIRS
00008 const float    FDH6::FDHMat[6][3] =              // matrix of FDH
00009 {
00010   {  1,  0,  0 },
00011   {  0,  1,  0 },
00012   {  0,  0,  1 },
00013   { -1,  0,  0 },
00014   {  0, -1,  0 },
00015   {  0,  0, -1 },
00016 };
00017 
00018 Vector3d* FDH6::_get_corners(unsigned  & numCorners,
00019                              unsigned  (*facetVert)[100],
00020                              unsigned    nFacetVert[]) const
00021 {
00022     Vector3d* vertRepos = new Vector3d [8];
00023 
00024     vertRepos[0].set(_values[3], _values[1], _values[2]);
00025     vertRepos[0].set(_values[0], _values[1], _values[2]);
00026     vertRepos[0].set(_values[0], _values[1], _values[5]);
00027     vertRepos[0].set(_values[3], _values[1], _values[5]);
00028     vertRepos[0].set(_values[3], _values[4], _values[2]);
00029     vertRepos[0].set(_values[0], _values[4], _values[2]);
00030     vertRepos[0].set(_values[0], _values[4], _values[5]);
00031     vertRepos[0].set(_values[3], _values[4], _values[5]);
00032     numCorners = 8;
00033     
00034     if (facetVert && nFacetVert) {
00035         facetVert[0][0] = 0;
00036         facetVert[0][1] = 4;
00037         facetVert[0][2] = 5;
00038         facetVert[0][3] = 1;
00039         facetVert[1][0] = 1;
00040         facetVert[1][1] = 5;
00041         facetVert[1][2] = 6;
00042         facetVert[1][3] = 2;
00043         facetVert[2][0] = 2;
00044         facetVert[2][1] = 6;
00045         facetVert[2][2] = 7;
00046         facetVert[2][3] = 3;
00047         facetVert[3][0] = 3;
00048         facetVert[3][1] = 7;
00049         facetVert[3][2] = 4;
00050         facetVert[3][3] = 0;
00051         facetVert[4][0] = 0;
00052         facetVert[4][1] = 1;
00053         facetVert[4][2] = 2;
00054         facetVert[4][3] = 3;
00055         facetVert[5][0] = 4;
00056         facetVert[5][1] = 7;
00057         facetVert[5][2] = 6;
00058         facetVert[5][3] = 5;
00059         nFacetVert[0] = 4;
00060         nFacetVert[1] = 4;
00061         nFacetVert[2] = 4;
00062         nFacetVert[3] = 4;
00063         nFacetVert[4] = 4;
00064         nFacetVert[5] = 4;
00065     }
00066 
00067     return vertRepos;
00068 }
00069 
00070 Mesh* FDH6::_mesh(int d) const
00071 {
00072     Mesh* pMesh = (Mesh*) new BoxMesh(_values[0] + _values[3],
00073                                       _values[1] + _values[4],
00074                                       _values[2] + _values[5]);
00075     pMesh->translate(Vector3(-_values[3], -_values[4], -_values[5]));
00076     return pMesh;
00077 }
00078 
00079 //------------------- public ---------------------------
00080 
00081 void FDH6::rayIntersection(PointEnv*      pPE,
00082                            int            mask,
00083                            const Vector3& origin,
00084                            const Vector3& direction,
00085                            float          maxDist)
00086 {
00087     if (!pPE) {
00088         fprintf(stderr,"FDH6::rayIntersection(): No point environment structure defined\n");
00089         return;
00090     }
00091     
00092     pPE->mask = ENV_HAVE_NOTHING;
00093     
00094     register double t_out, t1, t2;
00095     double& t_in = pPE->distance;
00096     
00097     if (mask&ENV_WANT_UV_COORD)
00098         fprintf(stderr,"FDH6::rayIntersection(): UV mapping is not implemented");
00099     
00100     if (mask & ENV_WANT_NORMAL) {
00101         register int plane1 = 0, plane2 = 0;
00102         FDH_CLIP_LINE_INDEX_INIT(origin.x, direction.x, 0, 3);
00103         FDH_CLIP_LINE_INDEX_CONT(origin.y, direction.y, 1, 4);
00104         FDH_CLIP_LINE_INDEX_CONT(origin.z, direction.z, 2, 5);
00105         if (t_in < Geometry::EPS)    // ray starts inside FDH
00106             pPE->normal.set(_mat[plane2][0],_mat[plane2][1],_mat[plane2][2]);
00107         else
00108             pPE->normal.set(_mat[plane1][0],_mat[plane1][1],_mat[plane1][2]);
00109         pPE->normalOrientation = PointEnv::OUTWARDS_NORMAL;
00110         pPE->mask |= ENV_HAVE_NORMAL;
00111     } else {
00112         FDH_CLIP_LINE_INIT(origin.x, direction.x, 0, 3);
00113         FDH_CLIP_LINE_CONT(origin.y, direction.y, 1, 4);
00114         FDH_CLIP_LINE_CONT(origin.z, direction.z, 2, 5);
00115     }
00116     
00117     if (mask & ENV_WANT_DISTANCE) {
00118         if (t_in < Geometry::EPS) t_in = t_out; // &t_in = pPE->distance
00119         if (mask & ENV_WANT_INTERSECTION) {
00120             pPE->intersection.set(direction);
00121             pPE->intersection.scaleAdd(t_in, origin);
00122             pPE->mask |= ENV_HAVE_INTERSECTION|ENV_HAVE_DISTANCE|ENV_HAVE_INTERFERENCE;
00123         } else
00124             pPE->mask |= ENV_HAVE_DISTANCE|ENV_HAVE_INTERFERENCE;
00125     } else {
00126         if (mask & ENV_WANT_INTERSECTION) {
00127             pPE->intersection.set(direction);
00128             pPE->intersection.scaleAdd((t_in<Geometry::EPS)?t_out:t_in, origin);
00129             pPE->mask |= ENV_HAVE_INTERSECTION|ENV_HAVE_INTERFERENCE;
00130         } else
00131             pPE->mask |= ENV_HAVE_INTERFERENCE;  
00132     }
00133 }
00134 
00135 bool FDH6::mapToUV(const Vector3& v, Vector2& uv)
00136 {
00137     // FDH matrix dependent !
00138 
00139     unsigned plane = 0;
00140     if      (v.x == _values[0]) plane = 0;
00141     else if (v.y == _values[1]) plane = 1;
00142     else if (v.z == _values[2]) plane = 2;
00143     else if (v.x == _values[3]) plane = 3;
00144     else if (v.y == _values[4]) plane = 4;
00145     else if (v.z == _values[5]) plane = 5;
00146     else return false;
00147     
00148     switch (plane) {
00149     case 0:
00150         uv.set((v.z - _values[2]) / (-_values[5] - _values[2]),
00151                (v.y + _values[4]) / ( _values[1] + _values[4]));
00152         break;
00153     case 1:
00154         uv.set((v.x + _values[3]) / (_values[0] + _values[3]),
00155                (v.z - _values[2]) / (-_values[5] - _values[2]));
00156         break;
00157     case 2:
00158         uv.set((v.x + _values[3]) / (_values[0] + _values[3]),
00159                (v.y + _values[4]) / (_values[1] + _values[4]));
00160         break;
00161     case 3:
00162         uv.set((v.z + _values[5]) / (_values[2] + _values[5]),
00163                (v.y + _values[4]) / (_values[1] + _values[4]));
00164         break;
00165     case 4:
00166         uv.set((v.x + _values[3]) / (_values[0] + _values[3]),
00167                (v.z + _values[5]) / (_values[2] + _values[5]));
00168         break;
00169     case 5:
00170         uv.set((v.x - _values[0]) / (-_values[3] - _values[0]),
00171                (v.y + _values[4]) / ( _values[1] + _values[4]));
00172         break;
00173     }
00174 
00175     return true;
00176 }
00177 
00178 Geometry* FDH6::clone(const Matrix4* pTrMat) const
00179 {
00180   FDH6* pRet = new FDH6;
00181   pRet->_duplicate_attributes(*this);
00182   if (pTrMat) pRet->_transform(*pTrMat);
00183   return pRet;
00184 }
00185 
00186 

Generated on Wed Jun 28 12:24:30 2006 for esg by  doxygen 1.4.6