00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "controler-gmap-types.hh"
00026 #include "precompile-face.hh"
00027 #include "parameter-gmap-vertex.hh"
00028 #include "parameter-face.hh"
00029 #include <cassert>
00030 #include <cstdlib>
00031 using namespace GMap3d;
00032
00033 CPrecompileFace::CPrecompileFace(CParameterGMapVertex * AParameterGMapV,
00034 CParameterFace * AParameterFace ) :
00035 FParameterGMapV(AParameterGMapV),
00036 FParameterFace (AParameterFace),
00037 FTess(NULL)
00038 {
00039 assert(FParameterGMapV!=NULL && FParameterFace!=NULL);
00040
00041 FParameterGMapV->addPrecompileToUpdate(this);
00042 FParameterFace->addPrecompileToUpdate(this);
00043 }
00044
00045 CPrecompileFace::CPrecompileFace(const CPrecompileFace & APrecompile) :
00046 CPrecompile (APrecompile),
00047 FParameterGMapV(APrecompile.FParameterGMapV),
00048 FParameterFace (static_cast<CParameterFace*>
00049 (APrecompile.FParameterFace->copy())),
00050 FTess(NULL)
00051 {
00052 assert(FParameterGMapV!=NULL && FParameterFace!=NULL);
00053
00054 FParameterGMapV->addPrecompileToUpdate(this);
00055 FParameterFace->addPrecompileToUpdate(this);
00056 }
00057
00058 CPrecompileFace::~CPrecompileFace()
00059 {
00060 FParameterGMapV->removePrecompileToUpdate(this);
00061 FParameterFace->removePrecompileToUpdate(this);
00062 }
00063
00064 CPrecompile * CPrecompileFace::copy() const
00065 { return new CPrecompileFace(*this); }
00066
00067 void CPrecompileFace::setParameter(CParameter * AParameter)
00068 {
00069 switch (AParameter->getType())
00070 {
00071 case PARAMETER_GMAP_VERTEX:
00072 setGMapVertex(static_cast<CParameterGMapVertex *>(AParameter));
00073 break;
00074 case PARAMETER_FACE:
00075 setFace(static_cast<CParameterFace *>(AParameter));
00076 break;
00077 }
00078 }
00079
00080 CParameter* CPrecompileFace::getParameter() const
00081 { return FParameterFace; }
00082
00083 void CPrecompileFace::setGMapVertex(CParameterGMapVertex* AParameterGMapV)
00084 {
00085 assert(AParameterGMapV != NULL);
00086 AParameterGMapV->addPrecompileToUpdate(this);
00087 FParameterGMapV->removePrecompileToUpdate(this);
00088 FParameterGMapV = AParameterGMapV;
00089 setToUpdate();
00090 }
00091
00092 void CPrecompileFace::setFace(CParameterFace * AFace)
00093 {
00094 assert(AFace != NULL);
00095 AFace->addPrecompileToUpdate(this);
00096 FParameterFace->removePrecompileToUpdate(this);
00097 FParameterFace = AFace;
00098 setToUpdate();
00099 }
00100
00101 TPrecompile CPrecompileFace::getType() const
00102 { return PRECOMPILE_FACE; }
00103
00104
00105
00106
00107 static void monCombine(GLdouble c[3], void *d[4], GLfloat w[4], void **out)
00108 {
00109 GLdouble *nv = (GLdouble *) malloc(sizeof(GLdouble)*3);
00110
00111 nv[0] = c[0];
00112
00113 nv[1] = c[1];
00114
00115 nv[2] = c[2];
00116
00117 *out = nv;
00118 }
00119
00120 void CPrecompileFace::drawModel()
00121 {
00122 glEnable(GL_BLEND);
00123 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00124
00125 bool bursted1 = ! areEqual(FParameterGMapV->getMap()->getBurstCoef(1), 1.0);
00126 int treated = FParameterGMapV->getMap()->getNewMark();
00127
00128 FTess = gluNewTess();
00129 gluTessCallback(FTess, GLU_TESS_BEGIN, (GLvoid (*) ( )) & glBegin );
00130 gluTessCallback(FTess, GLU_TESS_END, (GLvoid (*) ( )) & glEnd );
00131 gluTessCallback(FTess, GLU_TESS_VERTEX, (GLvoid (*) ( )) & glVertex3dv);
00132 gluTessCallback(FTess, GLU_TESS_COMBINE, (GLvoid (*) ( )) & monCombine );
00133
00134
00135 if ( !FParameterFace->getRandomCLFace () &&
00136 !FParameterFace->getRandomCLVolume() )
00137 glColor4f(FParameterFace->getCLFace(0),
00138 FParameterFace->getCLFace(1),
00139 FParameterFace->getCLFace(2),
00140 FParameterFace->getBLFace());
00141
00142 for (CDynamicCoverageAll it(FParameterGMapV->getMap()); it.cont(); ++it)
00143 if (! FParameterGMapV->getMap()->isMarked(*it, treated))
00144 {
00145 if ( FParameterFace->getRandomCLVolume() )
00146 setRandomColor(*it, 3);
00147
00148 for (CDynamicCoverage012 it2(FParameterGMapV->getMap(), *it);
00149 it2.cont(); ++it2)
00150 if (! FParameterGMapV->getMap()->isMarked(*it2, treated))
00151 {
00152 if (FParameterGMapV->getMap()->isClosedPolyline(*it2))
00153
00154 {
00155 int nbSommetsFace = FParameterGMapV->getMap()->
00156 getNbPolylineVertices(*it2);
00157 if (nbSommetsFace > 2)
00158 {
00159 if (FParameterFace->getRandomCLFace())
00160 setRandomColor(*it2, 2);
00161
00162 drawFace(*it2, nbSommetsFace, bursted1);
00163 }
00164 }
00165
00166 FParameterGMapV->getMap()->markOrbit(*it2, ORBIT_01, treated);
00167 }
00168 }
00169
00170 FParameterGMapV->getMap()->negateMaskMark(treated);
00171 FParameterGMapV->getMap()->freeMark(treated);
00172 gluDeleteTess(FTess);
00173
00174 glDisable(GL_BLEND);
00175 }
00176
00177 void CPrecompileFace::setRandomColor(CDart* ADart, int ADimension)
00178 {
00179 assert( ADimension!=0 );
00180
00181 float r,v,b;
00182
00183 if ( FParameterFace->getRandomColorGeometry() )
00184 {
00185 CVertex bary = FParameterGMapV->getMap()->
00186 barycenter(ADart, ORBIT_CELL[ADimension]);
00187 r = bary.getX();
00188 v = bary.getY();
00189 b = bary.getZ();
00190 }
00191 else
00192 {
00193 int c = 0;
00194
00195 CCoverage* cov = FParameterGMapV->getMap()->
00196 getDynamicCoverage(ADart, ORBIT_CELL[ADimension]);
00197
00198 for ( ; cov->cont(); ++ *cov)
00199 c += (int) ** cov;
00200
00201 delete cov;
00202
00203 r = c / (ADimension * 300 + 0.2);
00204 v = c / (ADimension * 400 + 0.1);
00205 b = c / (ADimension * 500 + 0.3);
00206 }
00207
00208 #define FLT(v) fabs(v)-floor(fabs(v))
00209 glColor4f(FLT(r),FLT(v),FLT(b), FParameterFace->getBLFace());
00210 #undef FLT
00211 }
00212
00213 void CPrecompileFace::drawFace(CDart* ADart, int ANbSommets, bool ABursted)
00214 {
00215 gluTessBeginPolygon(FTess, NULL);
00216 gluTessBeginContour(FTess);
00217
00218 GLdouble* data = new GLdouble[(ABursted ? 6 : 3) * (ANbSommets+1)];
00219
00220 CVertex pred;
00221 int numeroSommet = 0;
00222
00223
00224 for (CDynamicCoverage01 cov(FParameterGMapV->getMap(), ADart);
00225 cov.cont(); ++cov)
00226 {
00227
00228 CVertex & v = FParameterGMapV->getMap()->getBurstVertex(* cov);
00229
00230 if (cov.prevOperationType() == OP_NONE || pred != v)
00231 {
00232 data[ (numeroSommet*3)] = v.getX();
00233 data[1+(numeroSommet*3)] = v.getY();
00234 data[2+(numeroSommet*3)] = v.getZ();
00235
00236 gluTessVertex(FTess, &data[numeroSommet*3], &data[numeroSommet*3]);
00237 ++ numeroSommet;
00238 pred = v;
00239 }
00240 }
00241
00242 gluTessEndContour(FTess);
00243 gluTessEndPolygon(FTess);
00244
00245 delete [] data;
00246 }
00247