00001 #pragma warning( disable : 4786 )
00002
00003
00004 #include "Octree_Data_Fuser.h"
00005 #include <gl/gl.h>
00006 #include <opengl/gl_material.h>
00007
00008
00009 Octree_Data_Fuser::Octree_Data_Fuser()
00010 {
00011 this->maxlevel = 6;
00012 this->octree_display_mode = octree_whitedisplay;
00013 this->scalefactor = 128.0;
00014 this->expected_vertexes = 80000;
00015 this->expected_facets = 40000;
00016 this->expected_squarevectors = 53333;
00017
00018 root2 = create_node (BLACK);
00019 root2->father = NULL;
00020 this->lu = NULL;
00021 this->display_lu = NULL;
00022 this->track_sensed_obstacles = false;
00023
00024 obstacle_points.clear();
00025
00026 }
00027
00028 Octree_Data_Fuser::Octree_Data_Fuser (const Octree_Data_Fuser& right)
00029
00030
00031 {
00032 TRACE("\n(**warning: untested)Octree_Data_Fuser copy constructor");
00033
00034 this->maxlevel = right.maxlevel;
00035 this->octree_display_mode = right.octree_display_mode;
00036 this->scalefactor = right.scalefactor;
00037 this->expected_vertexes = right.expected_vertexes;
00038 this->expected_facets = right.expected_facets;
00039 this->expected_squarevectors = right.expected_squarevectors;
00040
00041 this->root2 = copy (right.root2);
00042 this->lu = dynamic_cast<GL_Universe *>(right.lu->Clone());
00043 this->display_lu = dynamic_cast<GL_Universe *>(right.display_lu->Clone());
00044 this->track_sensed_obstacles = right.track_sensed_obstacles;
00045
00046 this->obstacle_points = right.obstacle_points;
00047
00048 }
00049
00050
00051
00052 Octree_Data_Fuser::~Octree_Data_Fuser()
00053 {
00054
00055 delete_node (root2);
00056
00057 if (display_lu != NULL)
00058 {
00059 delete display_lu;
00060 display_lu = NULL;
00061 }
00062 }
00063
00064
00065 void Octree_Data_Fuser::new_local_universe (Universe &robot_universe)
00066 {
00067 std::vector< Entity* > tempEntities;
00068 tempEntities.clear();
00069 tempEntities = robot_universe.GetAllEntities() ;
00070
00071
00072
00073
00074 lu = new GL_Universe;
00075 lu->Empty();
00076 int tsize = tempEntities.size() ;
00077 for( int i = 0; i < tsize; i++ )
00078 {
00079 const R_OpenChain* r_openchain = dynamic_cast< const R_OpenChain* >( tempEntities[ i ] ) ;
00080 if( r_openchain != NULL )
00081 {
00082
00083
00084
00085 Entity* addme = tempEntities[ i ]->Clone() ;
00086 addme->SetFrameManager( lu->GetFrameManager() ) ;
00087 lu->AddEntity( addme );
00088
00089 delete addme;
00090 addme = NULL;
00091
00092 }
00093 }
00094 }
00095
00096 void Octree_Data_Fuser::Add_Block(cubic worldextents, cubic newblocksize)
00097 {
00098 OctreeNode *root,*union_result;
00099
00100 root = create_block_node(0,&newblocksize,&worldextents,maxlevel);
00101 root->father = NULL;
00102 union_result = union_node (root,root2);
00103 delete_node (root);
00104 delete_node (root2);
00105 root2 = union_result;
00106 }
00107
00108 void Octree_Data_Fuser::Save_State(const char * filename)
00109
00110 {
00111
00112 FILE *fpointer;
00113
00114 fpointer = fopen (filename,"w");
00115
00116
00117
00118 reset_bitbuckets ();
00119 save_node(root2,fpointer);
00120 fclose (fpointer);
00121
00122 }
00123
00124 void Octree_Data_Fuser::Load_State(const char * filename)
00125
00126 {
00127
00128
00129 FILE *fpointer;
00130
00131 delete_node(root2);
00132 fpointer = NULL;
00133 fpointer = fopen (filename,"rb");
00134 assert(fpointer != NULL);
00135 reset_bitbuckets ();
00136 root2 = read_node(fpointer);
00137 root2->father = NULL;
00138
00139 fclose (fpointer);
00140 }
00141
00142 void Octree_Data_Fuser::GL_Display_Octree ()
00143 {
00144
00145
00146 if( display_lu != NULL )
00147 {
00148 ::glClearColor( 1.0, 1.0, 1.0, 1.0 );
00149 ::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00150
00151 glEnable(GL_LIGHTING) ;
00152 glEnable(GL_BLEND) ;
00153 glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, 1 );
00154 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
00155
00156 glShadeModel( GL_SMOOTH ) ;
00157
00158 double r = 0.8f ;
00159 double g = 0.8f ;
00160 double b = 0.8f ;
00161 float ambient[] = { 0, 0, 0 } ;
00162 float diffuse[] = { r, g, b } ;
00163 float specular[] = { r, g, b } ;
00164 float position[ ] = {50, 50, 50, 1};
00165
00166 glEnable( GL_LIGHTING );
00167 glEnable( GL_LIGHT0 ) ;
00168 glLightfv( GL_LIGHT0, GL_POSITION, position ) ;
00169 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
00170 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse );
00171 glLightfv( GL_LIGHT0, GL_SPECULAR, specular );
00172
00173
00174 GL_Material& matTransparentGreen = GL_Material::matGreenPlastic ;
00175 matTransparentGreen.SetTransparancy( 1.0 );
00176 matTransparentGreen.GLDraw() ;
00177 display_lu->GLDraw();
00178 }
00179
00180
00181
00182
00183
00184 }
00185
00186
00187
00188
00189
00190 void Octree_Data_Fuser::Update (Range_Sensor *camera)
00191 {
00192
00193
00194
00195
00196
00197 for (int i=0; i< 256; i++)
00198 {
00199 for (int j=0; j < 256; j++)
00200 {
00201 camera->ray_coord_map[i][j][0] = camera->ray_coord_map[i][j][0] * scalefactor ;
00202 camera->ray_coord_map[i][j][1] = camera->ray_coord_map[i][j][1] * scalefactor ;
00203 camera->ray_coord_map[i][j][2] = camera->ray_coord_map[i][j][2] * scalefactor ;
00204 }
00205 }
00206
00207
00208 if (track_sensed_obstacles)
00209 {
00210 cubic_d worldsize;
00211
00212
00213 worldsize.x0 = worldsize.y0 = worldsize.z0 = -128.0 ;
00214 worldsize.x1 = worldsize.y1 = worldsize.z1 = 127.0 ;
00215
00216 update_cubes_set (obstacle_points, camera, root2, worldsize);
00217 }
00218
00219
00220 OctreeNode *root,*union_result;
00221 struct free_space* pic;
00222
00223 pic = new free_space;
00224 pic->apex.x = camera->ray_source[0] * scalefactor ;
00225 pic->apex.y = camera->ray_source[1] * scalefactor ;
00226 pic->apex.z = camera->ray_source[2] * scalefactor ;
00227
00228
00229 root = construct_octree_wrapper(pic,maxlevel,camera);
00230 delete pic;
00231 pic = NULL;
00232
00233 union_result = union_node (root,root2);
00234 delete_node(root);
00235 delete_node(root2);
00236 root2 = union_result;
00237
00238
00239 clean (root2);
00240
00241 }
00242
00243
00244
00245 void Octree_Data_Fuser::Convert ( CD_Vcollide* &lv_free, CD_Vcollide* &lv_obstacle,
00246 Universe &robot_universe, bool valid_config)
00247 {
00248
00249 GL_Mesh* mesh;
00250
00251 std::vector<Square> squarevector;
00252 squarevector.reserve(expected_squarevectors);
00253
00254
00255 cubic_d worldsize;
00256
00257
00258
00259 worldsize.x0 = worldsize.y0 = worldsize.z0 = -(1.0/scalefactor)*128.0 ;
00260 worldsize.x1 = worldsize.y1 = worldsize.z1 = (1.0/scalefactor)*127.0 ;
00261
00262 if (lu != NULL)
00263 {
00264 delete lu;
00265 lu = NULL;
00266 }
00267 if (display_lu != NULL)
00268 {
00269 delete display_lu;
00270 display_lu = NULL;
00271 }
00272
00273 new_local_universe (robot_universe);
00274
00275
00276 if (valid_config)
00277 {
00278 if (track_sensed_obstacles)
00279 {
00280 mesh = new GL_Mesh(lu->GetFrameManager());
00281
00282 mesh->GetVertexes().reserve( expected_vertexes );
00283 mesh->GetVertexes().reserve( expected_facets );
00284 mesh->SetName( "octreeMeshRed" );
00285
00286 squarevector.clear();
00287
00288 extract_cubes_set (obstacle_points, 1.0/scalefactor, squarevector, maxlevel);
00289
00290 if (obstacle_points.size() > 0)
00291 {
00292 calc_cube_facets (squarevector, *mesh);
00293
00294
00295
00296 lu->SetConfiguration(showconfig);
00297
00298 lu->AddEntity(mesh);
00299
00300 lv_obstacle = new CD_Vcollide (*lu);
00301
00302 if (octree_display_mode == octree_obstacledisplay)
00303 {
00304
00305 display_lu = lu;
00306 } else
00307 {
00308
00309 delete lu;
00310 }
00311
00312 new_local_universe(robot_universe);
00313 }
00314 delete mesh;
00315 mesh = NULL;
00316 }
00317
00318
00319 lu->SetConfiguration(showconfig);
00320 }
00321
00322 if (octree_display_mode == octree_whitedisplay)
00323 {
00324 mesh = new GL_Mesh(lu->GetFrameManager());
00325
00326 mesh->GetVertexes().reserve( expected_vertexes );
00327 mesh->GetFacets().reserve( expected_facets );
00328 mesh->SetName( "octreeMeshWhite" );
00329
00330 squarevector.clear();
00331
00332
00333 extract_block_node(root2, &worldsize, squarevector, true, WHITE);
00334
00335 calc_cube_facets(squarevector, *mesh);
00336
00337
00338 lu->AddEntity(mesh);
00339
00340
00341
00342 delete mesh;
00343 mesh = NULL;
00344
00345 display_lu = lu;
00346 new_local_universe(robot_universe);
00347 }
00348
00349 mesh = new GL_Mesh(lu->GetFrameManager());
00350
00351
00352 mesh->GetVertexes().reserve( expected_vertexes );
00353 mesh->GetFacets().reserve( expected_facets );
00354 mesh->SetName( "octreeMeshBlack" );
00355
00356 squarevector.clear();
00357
00358 extract_block_node(root2, &worldsize, squarevector, true, BLACK);
00359
00360 calc_cube_facets(squarevector, *mesh);
00361
00362
00363 squarevector.reserve(0);
00364
00365
00366 lu->AddEntity(mesh);
00367
00368
00369
00370 delete mesh;
00371 mesh = NULL;
00372 lv_free = new CD_Vcollide (*lu);
00373
00374 if (octree_display_mode == octree_blackdisplay)
00375 {
00376
00377 display_lu = lu;
00378 } else
00379 {
00380 delete lu;
00381 lu = NULL;
00382 }
00383
00384
00385
00386
00387
00388
00389
00390
00391 }
00392