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-normal-vector.hh"
00027 #include "dart-vertex.hh"
00028 #include "parameter-gmap-vertex.hh"
00029 #include "parameter-normal-vector.hh"
00030 #include "parameter-selection.hh"
00031 #include <cassert>
00032 using namespace GMap3d;
00033
00034 CPrecompileNormalVector::
00035 CPrecompileNormalVector(CParameterGMapVertex * AParameterGMapV,
00036 CParameterNormalVector * AParameterNormalVector,
00037 CParameterSelection * AParameterSelection) :
00038 FParameterGMapV (AParameterGMapV),
00039 FParameterNormalVector(AParameterNormalVector),
00040 FParameterSelection (AParameterSelection)
00041 {
00042 assert(FParameterGMapV!=NULL);
00043 assert(FParameterNormalVector!=NULL && FParameterSelection!=NULL);
00044
00045 FParameterGMapV->addPrecompileToUpdate(this);
00046 FParameterNormalVector->addPrecompileToUpdate(this);
00047 FParameterSelection->addPrecompileToUpdate(this);
00048 }
00049
00050 CPrecompileNormalVector::
00051 CPrecompileNormalVector(const CPrecompileNormalVector & APrecompile) :
00052 CPrecompile (APrecompile),
00053 FParameterGMapV (APrecompile.FParameterGMapV),
00054 FParameterNormalVector(static_cast<CParameterNormalVector*>
00055 (APrecompile.FParameterNormalVector->copy())),
00056 FParameterSelection (APrecompile.FParameterSelection)
00057 {
00058 assert(FParameterGMapV!=NULL);
00059 assert(FParameterNormalVector!=NULL && FParameterSelection!=NULL);
00060
00061 FParameterGMapV->addPrecompileToUpdate(this);
00062 FParameterNormalVector->addPrecompileToUpdate(this);
00063 FParameterSelection->addPrecompileToUpdate(this);
00064 }
00065
00066 CPrecompileNormalVector::~CPrecompileNormalVector()
00067 {
00068 FParameterGMapV->removePrecompileToUpdate(this);
00069 FParameterNormalVector->removePrecompileToUpdate(this);
00070 FParameterSelection->removePrecompileToUpdate(this);
00071 }
00072
00073 CPrecompile * CPrecompileNormalVector::copy() const
00074 { return new CPrecompileNormalVector(*this); }
00075
00076 void CPrecompileNormalVector::setParameter(CParameter * AParameter)
00077 {
00078 switch (AParameter->getType())
00079 {
00080 case PARAMETER_GMAP_VERTEX:
00081 setGMapVertex(static_cast<CParameterGMapVertex *>(AParameter));
00082 break;
00083 case PARAMETER_NORMAL_VECTOR:
00084 setNormalVector(static_cast<CParameterNormalVector *>(AParameter));
00085 break;
00086 case PARAMETER_SELECTION:
00087 setSelection(static_cast<CParameterSelection *>(AParameter));
00088 break;
00089 }
00090 }
00091
00092 CParameter* CPrecompileNormalVector::getParameter() const
00093 { return FParameterNormalVector; }
00094
00095 void CPrecompileNormalVector::setGMapVertex(CParameterGMapVertex* AParameterGMapV)
00096 {
00097 assert(AParameterGMapV != NULL);
00098 AParameterGMapV->addPrecompileToUpdate(this);
00099 FParameterGMapV->removePrecompileToUpdate(this);
00100 FParameterGMapV = AParameterGMapV;
00101 setToUpdate();
00102 }
00103
00104 void CPrecompileNormalVector::setNormalVector(CParameterNormalVector*
00105 ANormalVector)
00106 {
00107 assert(ANormalVector != NULL);
00108 ANormalVector->addPrecompileToUpdate(this);
00109 FParameterNormalVector->removePrecompileToUpdate(this);
00110 FParameterNormalVector = ANormalVector;
00111 setToUpdate();
00112 }
00113
00114 void CPrecompileNormalVector::setSelection(CParameterSelection* ASelection)
00115 {
00116 assert(ASelection != NULL);
00117 ASelection->addPrecompileToUpdate(this);
00118 FParameterSelection->removePrecompileToUpdate(this);
00119 FParameterSelection = ASelection;
00120 setToUpdate();
00121 }
00122
00123 TPrecompile CPrecompileNormalVector::getType() const
00124 { return PRECOMPILE_NORMAL_VECTOR; }
00125
00126 void CPrecompileNormalVector::drawNormal(CDart* ADart, bool ATwoSides)
00127 {
00128 CVertex bary = FParameterGMapV->getMap()->barycenter(ADart, ORBIT_01);
00129 CVertex normal = FParameterGMapV->getMap()->faceNormalVector(ADart);
00130
00131 float k = FParameterNormalVector->getLGNormalVector();
00132
00133 CVertex p1 = bary + k*normal;
00134 CVertex p2 = ATwoSides ? bary-k*normal : bary;
00135
00136 LINE(& p1, & p2);
00137 }
00138
00139 void CPrecompileNormalVector::drawModel()
00140 {
00141 glLineWidth(FParameterNormalVector->getLWNormalVector());
00142 glColor3fv(FParameterNormalVector->getCLNormalVector());
00143 glBegin(GL_LINES);
00144
00145 if (FParameterNormalVector->getShowAllNormals())
00146 {
00147 int treated = FParameterGMapV->getMap()->getNewMark();
00148
00149 for (CDynamicCoverageAll it(FParameterGMapV->getMap()); it.cont(); ++it)
00150 if (! FParameterGMapV->getMap()->isMarked(*it, treated))
00151 {
00152 bool done = false;
00153 for (CDynamicCoverage01 face(FParameterGMapV->getMap(), *it); face.cont(); ++face)
00154 {
00155 if (! FParameterGMapV->getMap()->isFree0(*face))
00156 {
00157 done = true;
00158 drawNormal(*face, true);
00159 }
00160
00161 FParameterGMapV->getMap()->setMark(*face, treated);
00162 FParameterGMapV->getMap()->setMark(FParameterGMapV->getMap()->alpha3(*face), treated);
00163 }
00164
00165 if (!done)
00166 drawNormal(*it, false);
00167 }
00168
00169 FParameterGMapV->getMap()->negateMaskMark(treated);
00170 FParameterGMapV->getMap()->freeMark(treated);
00171 }
00172 else
00173 {
00174 CDart* last = FParameterSelection->getLastSelectedDart();
00175
00176 if (last != NULL)
00177 drawNormal(last, false);
00178 }
00179
00180 glEnd();
00181 }
00182