00001 #include <esg/geometry/FDH6.h>
00002 #include <esg/mesh/BoxMesh.h>
00003
00004 using namespace esg;
00005
00006 const unsigned FDH6::DIRS = 3;
00007 const unsigned FDH6::SIZE = 6 ;
00008 const float FDH6::FDHMat[6][3] =
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
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)
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;
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
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