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
00026
00027
00028
00029
00030
00031
00032
00033 #include <GL/glut.h>
00034 #include "voxel-view.hh"
00035 #include "ineq-op.hh"
00036 #include "definition.hh"
00037 #include "matrix-att.hh"
00038 #include "voxel-list.hh"
00039 #include "ineq-table-6.hh"
00040 #include "ineq-table-2.hh"
00041 #include "ineq-table-2-att.hh"
00042 #include "ineq-table-6-att.hh"
00043 #include "ineq-use-att.hh"
00044 #include "ineq-use.hh"
00045
00046 using namespace std;
00047 using namespace GMap3d;
00048
00049
00050
00051
00052
00053 Voxel_View::Voxel_View(CGMap * GM)
00054 {
00055 G = GM;
00056 }
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 void Voxel_View::Calculate_Int_Bounding_Box(float gmapBoundingBox[6],
00071 int matrixBoundingBox[6])
00072 {
00073 float up, down;
00074
00075
00076 for (int i=0 ; i<5 ; i+=2)
00077 {
00078
00079
00080
00081 up = ceilf(gmapBoundingBox[i]);
00082 down = floorf(gmapBoundingBox[i]);
00083
00084 if (fabs(up - gmapBoundingBox[i])<EPS)
00085 matrixBoundingBox[i] = (int)up;
00086
00087 else
00088 matrixBoundingBox[i] = (int)down;
00089
00090
00091
00092 up = ceilf(-gmapBoundingBox[i+1]);
00093 down = floorf(-gmapBoundingBox[i+1]);
00094
00095 if (fabs(down + gmapBoundingBox[i+1])<EPS)
00096 matrixBoundingBox[i+1] = (int)down;
00097
00098 else
00099 matrixBoundingBox[i+1] = (int)up;
00100 }
00101 }
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 void Voxel_View::Create_Matrix()
00113 {
00114 CAttribute * alpha;
00115 Matrix_Att * matrix;
00116 Matrix * mat, * tempMat;
00117 CDart * d01, * dO, * d;
00118 Ineq_Table2 * tf;
00119 Ineq_Table6 * te;
00120 Ineq_Use * ue;
00121
00122 float gmapBoundingBox[6];
00123 int matrixBoundingBox[6];
00124
00125
00126 int markVoxel = G->getNewMark();
00127
00128
00129 CDynamicCoverageAll Cgm(G);
00130
00131 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00132 {
00133 d = *Cgm;
00134
00135
00136 if (!G->isMarked(d, markVoxel))
00137 {
00138
00139
00140 Calculate_Bounding_Box(G, d, ORBIT_0123, gmapBoundingBox);
00141
00142
00143 Calculate_Int_Bounding_Box(gmapBoundingBox, matrixBoundingBox);
00144
00145
00146 matrix = new Matrix_Att(matrixBoundingBox, NO_COLOR);
00147 mat = (Matrix*)matrix->Get_Data();
00148
00149
00150 CCoverage* DC = G->getDynamicCoverage(d, ORBIT_0123);
00151
00152
00153 for (DC->reinit(); DC->cont(); (*DC)++)
00154 {
00155 dO = **DC;
00156
00157
00158 if (!G->isMarked(dO, markVoxel))
00159 {
00160
00161 if (G->getAttribute(dO,ORBIT_013, INT_ATTRIBUTE_ID))
00162 {
00163
00164 Calculate_Bounding_Box(G, dO, ORBIT_01,
00165 gmapBoundingBox);
00166
00167
00168
00169 Calculate_Int_Bounding_Box(gmapBoundingBox,
00170 matrixBoundingBox);
00171
00172
00173 tempMat = new Matrix(matrixBoundingBox, FACE_COLOR);
00174
00175
00176 alpha = G->getAttribute(dO, ORBIT_013,
00177 INEQ2_ATTRIBUTE_ID);
00178 tf = ((Ineq_Table2_Att*)alpha)->Get_Data();
00179
00180
00181
00182 for (int t=0; t<2; t++)
00183
00184 for (int i = matrixBoundingBox[1];
00185 i <= matrixBoundingBox[0]; i++)
00186 for (int j = matrixBoundingBox[3];
00187 j <= matrixBoundingBox[2]; j++)
00188 for (int k = matrixBoundingBox[5];
00189 k <= matrixBoundingBox[4]; k++)
00190 {
00191 if (!tf->Get_Ineq(t)
00192 ->Test_Point(CVertex(i,j,k)))
00193 tempMat->Set_Color(i, j, k, NO_COLOR);
00194 }
00195
00196
00197 CCoverage* DCf = G->getDynamicCoverage(dO, ORBIT_01);
00198 for (DCf->reinit();
00199 DCf->cont();
00200 (*DCf)++)
00201 {
00202 d01 = **DCf;
00203
00204
00205 if (!G->isMarked(d01, markVoxel))
00206 {
00207
00208 alpha = G->getAttribute(d01, ORBIT_023,
00209 INEQ6_ATTRIBUTE_ID);
00210 te = ((Ineq_Table6_Att*)alpha)->Get_Data();
00211
00212
00213
00214 alpha = G->getAttribute(d01, ORBIT_0,
00215 USE_ATTRIBUTE_ID);
00216 ue = ((Ineq_Use_Att*)alpha)->Get_Data();
00217
00218
00219
00220 for (int t=0; t<6; t++)
00221
00222 if(ue->Get_Use(t))
00223 {
00224 for (int i = matrixBoundingBox[1];
00225 i <= matrixBoundingBox[0]; i++)
00226 for (int j = matrixBoundingBox[3];
00227 j <= matrixBoundingBox[2]; j++)
00228 for (int k = matrixBoundingBox[5];
00229 k <= matrixBoundingBox[4]; k++)
00230 {
00231 if (!te->Get_Ineq(t)
00232 ->Test_Point(CVertex(i,j,k)))
00233 tempMat->Set_Color(i, j, k,
00234 NO_COLOR);
00235 }
00236 }
00237 G->setMark(d01, markVoxel);
00238 G->setMark(G->alpha0(d01), markVoxel);
00239 }
00240 }
00241 delete DCf;
00242
00243
00244
00245 Voxel_List* vList = new Voxel_List();
00246 list<Voxel*> *l = (list<Voxel*>*)vList->Get_Data();
00247
00248
00249
00250 for (int i = matrixBoundingBox[1];
00251 i <= matrixBoundingBox[0]; i++)
00252 for (int j = matrixBoundingBox[3];
00253 j <= matrixBoundingBox[2]; j++)
00254 for (int k = matrixBoundingBox[5];
00255 k <= matrixBoundingBox[4]; k++)
00256 {
00257 if (tempMat->Get_Color(i, j, k) == FACE_COLOR)
00258 {
00259 l->push_front(new Voxel(i, j, k));
00260 mat->Set_Color(i, j, k, FACE_COLOR);
00261 }
00262 }
00263 if(!G->getAttribute(dO,ORBIT_013,PT_LIST_ATTRIBUTE_ID))
00264 G->addAttribute(dO, ORBIT_013, vList);
00265
00266 delete tempMat;
00267 }
00268 else
00269 G->setMark(dO, markVoxel);
00270 }
00271 }
00272
00273
00274 for (DC->reinit(); DC->cont(); (*DC)++)
00275 G->unsetMark(**DC, markVoxel);
00276
00277
00278 for (DC->reinit(); DC->cont(); (*DC)++)
00279 {
00280 dO = **DC;
00281 if (!G->isMarked(dO, markVoxel))
00282 {
00283 if (!G->isFree0(dO))
00284 {
00285
00286 Calculate_Bounding_Box(G, dO, ORBIT_0,
00287 gmapBoundingBox);
00288
00289
00290 Calculate_Int_Bounding_Box(gmapBoundingBox,
00291 matrixBoundingBox);
00292
00293
00294 tempMat = new Matrix(matrixBoundingBox, EDGE_COLOR);
00295
00296
00297 alpha = G->getAttribute(dO, ORBIT_023,
00298 INEQ6_ATTRIBUTE_ID);
00299 te = ((Ineq_Table6_Att*)alpha)->Get_Data();
00300
00301
00302 for (int t=0; t<6; t++)
00303
00304
00305 for (int i=matrixBoundingBox[1];
00306 i<=matrixBoundingBox[0]; i++)
00307
00308 for (int j=matrixBoundingBox[3];
00309 j<=matrixBoundingBox[2]; j++)
00310
00311 for (int k=matrixBoundingBox[5];
00312 k<=matrixBoundingBox[4]; k++)
00313 {
00314 if (!te->Get_Ineq(t)
00315 ->Test_Point(CVertex(i,j,k)))
00316 tempMat->Set_Color(i, j, k, NO_COLOR);
00317 }
00318
00319
00320 CCoverage* DCe = G->getDynamicCoverage(dO, ORBIT_023);
00321 for (DCe->reinit();
00322 DCe->cont();
00323 (*DCe)++)
00324 G->setMark(**DCe, markVoxel);
00325 delete DCe;
00326
00327
00328 Voxel_List* vList = new Voxel_List();
00329 list<Voxel*> *l = (list<Voxel*>*)vList->Get_Data();
00330
00331
00332
00333
00334 for (int i=matrixBoundingBox[1];
00335 i<=matrixBoundingBox[0]; i++)
00336
00337 for (int j=matrixBoundingBox[3];
00338 j<=matrixBoundingBox[2]; j++)
00339
00340 for (int k=matrixBoundingBox[5];
00341 k<=matrixBoundingBox[4]; k++)
00342 {
00343 if (tempMat->Get_Color(i, j, k) == EDGE_COLOR)
00344 {
00345 l->push_front(new Voxel(i, j, k));
00346 mat->Set_Color(i, j, k, EDGE_COLOR);
00347 }
00348 }
00349 G->addAttribute(dO, ORBIT_023, vList);
00350 delete tempMat;
00351 }
00352
00353
00354 else
00355 G->setMark(dO, markVoxel);
00356 }
00357 }
00358
00359 for (DC->reinit(); DC->cont(); (*DC)++)
00360 G->unsetMark(**DC, markVoxel);
00361
00362
00363
00364 for (DC->reinit(); DC->cont(); (*DC)++)
00365 {
00366 dO = **DC;
00367
00368
00369 if (!G->isMarked(dO, markVoxel))
00370 {
00371
00372 alpha = G->getAttribute(dO, ORBIT_123, INEQ6_ATTRIBUTE_ID);
00373 te = ((Ineq_Table6_Att*)alpha)->Get_Data();
00374
00375
00376 gmapBoundingBox[0]=te->Get_Ineq(0)->GetW();
00377 gmapBoundingBox[1]=te->Get_Ineq(1)->GetW();
00378 gmapBoundingBox[2]=te->Get_Ineq(2)->GetW();
00379 gmapBoundingBox[3]=te->Get_Ineq(3)->GetW();
00380 gmapBoundingBox[4]=te->Get_Ineq(4)->GetW();
00381 gmapBoundingBox[5]=te->Get_Ineq(5)->GetW();
00382
00383
00384 Calculate_Int_Bounding_Box(gmapBoundingBox,
00385 matrixBoundingBox);
00386
00387
00388 tempMat = new Matrix(matrixBoundingBox, VERTEX_COLOR);
00389
00390
00391 for (int t=0; t<6; t++)
00392
00393
00394 for (int i=matrixBoundingBox[1];
00395 i<=matrixBoundingBox[0]; i++)
00396
00397 for (int j=matrixBoundingBox[3];
00398 j<=matrixBoundingBox[2]; j++)
00399
00400 for (int k=matrixBoundingBox[5];
00401 k<=matrixBoundingBox[4]; k++)
00402 {
00403 if (!te->Get_Ineq(t)->Test_Point(CVertex(i,j,k)))
00404 tempMat->Set_Color(i, j, k, NO_COLOR);
00405 }
00406
00407
00408 CCoverage* DCe = G->getDynamicCoverage(dO, ORBIT_123);
00409 for(DCe->reinit();
00410 DCe->cont();
00411 (*DCe)++)
00412 G->setMark(**DCe, markVoxel);
00413 delete DCe;
00414
00415
00416 Voxel_List* vList = new Voxel_List();
00417 list<Voxel*> *l = (list<Voxel*>*)vList->Get_Data();
00418
00419
00420
00421 for (int i=matrixBoundingBox[1];
00422 i<=matrixBoundingBox[0]; i++)
00423
00424 for (int j=matrixBoundingBox[3];
00425 j<=matrixBoundingBox[2]; j++)
00426
00427 for (int k=matrixBoundingBox[5];
00428 k<=matrixBoundingBox[4]; k++)
00429 {
00430 if (tempMat->Get_Color(i, j, k) == VERTEX_COLOR)
00431 {
00432 l->push_front(new Voxel(i, j, k));
00433 mat->Set_Color(i, j, k, VERTEX_COLOR);
00434 }
00435 }
00436
00437 G->addAttribute(dO, ORBIT_123, vList);
00438 delete tempMat;
00439 }
00440 }
00441
00442 G->addAttribute(d, ORBIT_0123, matrix);
00443
00444 for (DC->reinit(); DC->cont(); (*DC)++)
00445 G->unsetMark(**DC, markVoxel);
00446
00447 for (DC->reinit(); DC->cont(); (*DC)++)
00448 G->setMark(**DC, markVoxel);
00449 delete DC;
00450 }
00451 }
00452 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00453 G->unsetMark(*Cgm, markVoxel);
00454
00455 G->freeMark(markVoxel);
00456 }
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466 void Voxel_View::Draw_Vertices()
00467 {
00468 CDart * d;
00469 int markVoxel = G->getNewMark();
00470
00471
00472 glEnable(GL_LIGHTING);
00473
00474 CDynamicCoverageAll Cgm(G);
00475 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00476 {
00477 d = *Cgm;
00478
00479
00480 if (!G->isMarked(d, markVoxel))
00481 {
00482
00483 CAttribute *alpha = G->getAttribute(d, ORBIT_0123, MATRIX_ATTRIBUTE_ID);
00484 Matrix * mat = ((Matrix_Att*)alpha)->Get_Data();
00485
00486
00487 for (int i=mat->Get_X_Min() ; i<=mat->Get_X_Max() ; i++)
00488
00489 for (int j=mat->Get_Y_Min() ; j<=mat->Get_Y_Max() ; j++)
00490
00491 for (int k=mat->Get_Z_Min() ; k<=mat->Get_Z_Max() ; k++)
00492
00493 if (mat->Get_Color(i,j,k) == VERTEX_COLOR)
00494 {
00495 glPushMatrix();
00496 glTranslatef(i,j,k);
00497 glutSolidCube(0.9);
00498 glPopMatrix();
00499 }
00500
00501
00502 CCoverage* DC = G->getDynamicCoverage(d, ORBIT_0123);
00503 for (DC->reinit(); DC->cont(); (*DC)++)
00504 G->setMark(**DC, markVoxel);
00505 delete DC;
00506 }
00507 }
00508 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00509 G->unsetMark(*Cgm, markVoxel);
00510
00511 G->freeMark(markVoxel);
00512
00513
00514 glDisable(GL_LIGHTING);
00515 }
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525 void Voxel_View::Draw_Edges()
00526 {
00527 CDart * d;
00528 int markVoxel = G->getNewMark();
00529
00530
00531 glEnable(GL_LIGHTING);
00532
00533 CDynamicCoverageAll Cgm(G);
00534 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00535 {
00536 d = *Cgm;
00537
00538
00539 if (!G->isMarked(d, markVoxel))
00540 {
00541
00542 CAttribute *alpha = G->getAttribute(d, ORBIT_0123, MATRIX_ATTRIBUTE_ID);
00543 Matrix * mat = ((Matrix_Att*)alpha)->Get_Data();
00544
00545
00546 for (int i=mat->Get_X_Min() ; i<=mat->Get_X_Max() ; i++)
00547
00548 for (int j=mat->Get_Y_Min() ; j<=mat->Get_Y_Max() ; j++)
00549
00550 for (int k=mat->Get_Z_Min() ; k<=mat->Get_Z_Max() ; k++)
00551
00552 if (mat->Get_Color(i,j,k) == EDGE_COLOR)
00553 {
00554 glPushMatrix();
00555 glTranslatef(i,j,k);
00556 glutSolidCube(0.9);
00557 glPopMatrix();
00558 }
00559 CCoverage* DC = G->getDynamicCoverage(d, ORBIT_0123);
00560 for (DC->reinit(); DC->cont(); (*DC)++)
00561 G->setMark(**DC, markVoxel);
00562 delete DC;
00563 }
00564 }
00565 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00566 G->unsetMark(*Cgm, markVoxel);
00567
00568 G->freeMark(markVoxel);
00569
00570
00571 glDisable(GL_LIGHTING);
00572 }
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582 void Voxel_View::Draw_Faces()
00583 {
00584 CDart * d;
00585 int markVoxel = G->getNewMark();
00586
00587
00588 glEnable(GL_LIGHTING);
00589
00590 CDynamicCoverageAll Cgm(G);
00591 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00592 {
00593 d = *Cgm;
00594
00595
00596 if (!G->isMarked(d, markVoxel))
00597 {
00598
00599
00600 CAttribute *alpha = G->getAttribute(d, ORBIT_0123, MATRIX_ATTRIBUTE_ID);
00601 Matrix * mat = ((Matrix_Att*)alpha)->Get_Data();
00602
00603
00604 for (int i=mat->Get_X_Min() ; i<=mat->Get_X_Max() ; i++)
00605
00606 for (int j=mat->Get_Y_Min() ; j<=mat->Get_Y_Max() ; j++)
00607
00608 for (int k=mat->Get_Z_Min() ; k<=mat->Get_Z_Max() ; k++)
00609
00610 if (mat->Get_Color(i,j,k) == FACE_COLOR)
00611 {
00612 glPushMatrix();
00613 glTranslatef(i,j,k);
00614 glutSolidCube(0.9);
00615 glPopMatrix();
00616 }
00617 CCoverage* DC = G->getDynamicCoverage(d, ORBIT_0123);
00618 for (DC->reinit(); DC->cont(); (*DC)++)
00619 G->setMark(**DC, markVoxel);
00620 delete DC;
00621 }
00622 }
00623 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00624 G->unsetMark(*Cgm, markVoxel);
00625
00626 G->freeMark(markVoxel);
00627
00628
00629 glDisable(GL_LIGHTING);
00630 }