- Timestamp:
- 06/20/06 13:28:51 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Geom/shared/GTGeometry/src/libs/SimplificationMethod.cpp
r1007 r1025 33 33 // Recalculate the cost of the vertices of an edge 34 34 //--------------------------------------------------------------------------- 35 void SimplificationMethod::compute_pair_info( qslim::pair_info *auxpair)36 { 37 qslim::Vertex *v0 = auxpair->v0;38 qslim::Vertex *v1 = auxpair->v1;39 40 qslim::vert_info& v0_info = vertex_info(v0);41 qslim::vert_info& v1_info = vertex_info(v1);42 43 qslim::Mat4 Q = v0_info.Q + v1_info.Q;44 qslim::real norm = v0_info.norm + v1_info.norm;45 46 auxpair->cost = qslim::quadrix_pair_target(Q, v0, v1, auxpair->candidate);47 48 if( qslim::will_weight_by_area )35 void SimplificationMethod::compute_pair_info(simplif::pair_info *auxpair) 36 { 37 simplif::Vertex *v0 = auxpair->v0; 38 simplif::Vertex *v1 = auxpair->v1; 39 40 simplif::vert_info& v0_info = vertex_info(v0); 41 simplif::vert_info& v1_info = vertex_info(v1); 42 43 simplif::Mat4 Q = v0_info.Q + v1_info.Q; 44 simplif::real norm = v0_info.norm + v1_info.norm; 45 46 auxpair->cost = simplif::quadrix_pair_target(Q, v0, v1, auxpair->candidate); 47 48 if( simplif::will_weight_by_area ) 49 49 auxpair->cost /= norm; 50 50 51 if( qslim::will_preserve_mesh_quality )51 if( simplif::will_preserve_mesh_quality ) 52 52 auxpair->cost += pair_mesh_penalty(M0, v0, v1, auxpair->candidate); 53 53 … … 70 70 // Reasign the new vertex to the adequate face 71 71 //--------------------------------------------------------------------------- 72 int SimplificationMethod::predict_face( qslim::Face& F, qslim::Vertex *v1, qslim::Vertex *v2, qslim::Vec3& vnew, qslim::Vec3& f1, qslim::Vec3& f2, qslim::Vec3& f3)72 int SimplificationMethod::predict_face(simplif::Face& F, simplif::Vertex *v1, simplif::Vertex *v2, simplif::Vec3& vnew, simplif::Vec3& f1, simplif::Vec3& f2, simplif::Vec3& f3) 73 73 { 74 74 int nmapped = 0; … … 93 93 //--------------------------------------------------------------------------- 94 94 //--------------------------------------------------------------------------- 95 qslim::real SimplificationMethod::pair_mesh_penalty(qslim::Model& M, qslim::Vertex *v1, qslim::Vertex *v2, qslim::Vec3& vnew)96 { 97 static qslim::face_buffer changed;95 simplif::real SimplificationMethod::pair_mesh_penalty(simplif::Model& M, simplif::Vertex *v1, simplif::Vertex *v2, simplif::Vec3& vnew) 96 { 97 static simplif::face_buffer changed; 98 98 changed.reset(); 99 99 … … 101 101 102 102 // real Nsum = 0; 103 qslim::real Nmin = 0;103 simplif::real Nmin = 0; 104 104 105 105 for(int i=0; i<changed.length(); i++) 106 106 { 107 qslim::Face& F = *changed(i);108 qslim::Vec3 f1, f2, f3;107 simplif::Face& F = *changed(i); 108 simplif::Vec3 f1, f2, f3; 109 109 110 110 int nmapped = predict_face(F, v1, v2, vnew, f1, f2, f3); … … 113 113 if( nmapped < 2 ) 114 114 { 115 qslim::Plane Pnew(f1, f2, f3);116 qslim::real delta = Pnew.normal() * F.plane().normal();115 simplif::Plane Pnew(f1, f2, f3); 116 simplif::real delta = Pnew.normal() * F.plane().normal(); 117 117 118 118 if( Nmin > delta ) Nmin = delta; … … 130 130 // Returns true if the givens vertices are a valid pair 131 131 //--------------------------------------------------------------------------- 132 bool SimplificationMethod::check_for_pair( qslim::Vertex *v0, qslim::Vertex *v1)133 { 134 const qslim::pair_buffer& pairs = vertex_info(v0).pairs;132 bool SimplificationMethod::check_for_pair(simplif::Vertex *v0, simplif::Vertex *v1) 133 { 134 const simplif::pair_buffer& pairs = vertex_info(v0).pairs; 135 135 136 136 for(int i=0; i<pairs.length(); i++) … … 146 146 // Create a new pair with two given vertices 147 147 //--------------------------------------------------------------------------- 148 qslim::pair_info *SimplificationMethod::new_pair(qslim::Vertex *v0, qslim::Vertex *v1)149 { 150 qslim::vert_info& v0_info = vertex_info(v0);151 qslim::vert_info& v1_info = vertex_info(v1);152 153 qslim::pair_info *pair = new qslim::pair_info(v0,v1);148 simplif::pair_info *SimplificationMethod::new_pair(simplif::Vertex *v0, simplif::Vertex *v1) 149 { 150 simplif::vert_info& v0_info = vertex_info(v0); 151 simplif::vert_info& v1_info = vertex_info(v1); 152 153 simplif::pair_info *pair = new simplif::pair_info(v0,v1); 154 154 v0_info.pairs.add(pair); 155 155 v1_info.pairs.add(pair); … … 161 161 // Remove a given pair 162 162 //--------------------------------------------------------------------------- 163 void SimplificationMethod::delete_pair( qslim::pair_info *auxpair)164 { 165 qslim::vert_info& v0_info = vertex_info(auxpair->v0);166 qslim::vert_info& v1_info = vertex_info(auxpair->v1);163 void SimplificationMethod::delete_pair(simplif::pair_info *auxpair) 164 { 165 simplif::vert_info& v0_info = vertex_info(auxpair->v0); 166 simplif::vert_info& v1_info = vertex_info(auxpair->v1); 167 167 168 168 v0_info.pairs.remove(v0_info.pairs.find(auxpair)); … … 178 178 // Contract a given pair 179 179 //--------------------------------------------------------------------------- 180 void SimplificationMethod::do_contract( qslim::Model& m, qslim::pair_info *auxpair)181 { 182 qslim::Vertex *v0 = auxpair->v0; qslim::Vertex *v1 = auxpair->v1;183 qslim::vert_info& v0_info = vertex_info(v0);184 qslim::vert_info& v1_info = vertex_info(v1);185 qslim::Vec3 vnew = auxpair->candidate;180 void SimplificationMethod::do_contract(simplif::Model& m, simplif::pair_info *auxpair) 181 { 182 simplif::Vertex *v0 = auxpair->v0; simplif::Vertex *v1 = auxpair->v1; 183 simplif::vert_info& v0_info = vertex_info(v0); 184 simplif::vert_info& v1_info = vertex_info(v1); 185 simplif::Vec3 vnew = auxpair->candidate; 186 186 int i; 187 187 … … 190 190 v0_info.norm += v1_info.norm; 191 191 192 qslim::Vec3 p(vnew);193 qslim::Vec3 v0antes(v0->operator[](qslim::X),v0->operator[](qslim::Y),v0->operator[](qslim::Z));192 simplif::Vec3 p(vnew); 193 simplif::Vec3 v0antes(v0->operator[](simplif::X),v0->operator[](simplif::Y),v0->operator[](simplif::Z)); 194 194 195 195 // Find the edge to remove (before remove it (contract())) 196 qslim::Edge *econ=NULL;196 simplif::Edge *econ=NULL; 197 197 bool finded = false; 198 198 for (i=0; i<v0->edgeUses().length(); i++) … … 210 210 211 211 // Perform the actual contraction 212 static qslim::face_buffer changed;212 static simplif::face_buffer changed; 213 213 changed.reset(); 214 214 m.contract(v0, v1, vnew, changed); … … 216 216 // Stores the simplification step 217 217 MeshSimplificationSequence::Step simplifstep; 218 qslim::Vec3 vdesp = p - v0antes;218 simplif::Vec3 vdesp = p - v0antes; 219 219 220 220 // Stores the displacement in the simplification step 221 simplifstep.x=(float)vdesp[ qslim::X];222 simplifstep.y = (float)vdesp[ qslim::Y];223 simplifstep.z = (float)vdesp[ qslim::Z];221 simplifstep.x=(float)vdesp[simplif::X]; 222 simplifstep.y = (float)vdesp[simplif::Y]; 223 simplifstep.z = (float)vdesp[simplif::Z]; 224 224 225 225 // Submeshes which pertains each vertex … … 245 245 for (i=0; i<changed.length(); i++) 246 246 { 247 qslim::Face *auxface = changed(i);247 simplif::Face *auxface = changed(i); 248 248 249 249 if (auxface->isValid()) … … 291 291 for(i=0; i<v0_info.pairs.length(); i++) 292 292 { 293 qslim::pair_info *p = v0_info.pairs(i);293 simplif::pair_info *p = v0_info.pairs(i); 294 294 compute_pair_info(p); 295 295 } 296 296 297 297 // Process pairs associated with now dead vertex 298 static qslim::pair_buffer condemned(6); // collect condemned pairs for execution298 static simplif::pair_buffer condemned(6); // collect condemned pairs for execution 299 299 condemned.reset(); 300 300 301 301 for(i=0; i<v1_info.pairs.length(); i++) 302 302 { 303 qslim::pair_info *p = v1_info.pairs(i);304 305 qslim::Vertex *u;303 simplif::pair_info *p = v1_info.pairs(i); 304 305 simplif::Vertex *u; 306 306 if( p->v0 == v1 ) 307 307 u = p->v1; … … 332 332 //--------------------------------------------------------------------------- 333 333 //--------------------------------------------------------------------------- 334 bool SimplificationMethod::decimate_quadric( qslim::Vertex *v, qslim::Mat4& Q)334 bool SimplificationMethod::decimate_quadric(simplif::Vertex *v, simplif::Mat4& Q) 335 335 { 336 336 if( vinfo.length() > 0 ) … … 346 346 // Extract a pair from the heap, concract it and remove it form the heap 347 347 //--------------------------------------------------------------------------- 348 void SimplificationMethod::decimate_contract( qslim::Model& m)349 { 350 qslim::heap_node *top;351 qslim::pair_info *pair;348 void SimplificationMethod::decimate_contract(simplif::Model& m) 349 { 350 simplif::heap_node *top; 351 simplif::pair_info *pair; 352 352 353 353 for(;;) … … 355 355 top = heap->extract(); 356 356 if( !top ) return; 357 pair = ( qslim::pair_info *)top->obj;357 pair = (simplif::pair_info *)top->obj; 358 358 359 359 //Remove all the vertices of the removed edges … … 361 361 for (int i=0; i<pair->v0->edgeUses().length(); i++) 362 362 { 363 qslim::Edge *econ = pair->v0->edgeUses()(i);363 simplif::Edge *econ = pair->v0->edgeUses()(i); 364 364 if (pair->v1->vID == econ->org()->vID || pair->v1->vID == econ->dest()->vID) 365 365 { … … 383 383 //--------------------------------------------------------------------------- 384 384 //--------------------------------------------------------------------------- 385 qslim::real SimplificationMethod::decimate_error(qslim::Vertex *v)386 { 387 qslim::vert_info& info = vertex_info(v);388 389 qslim::real err = qslim::quadrix_evaluate_vertex(*v, info.Q);390 391 if( qslim::will_weight_by_area )385 simplif::real SimplificationMethod::decimate_error(simplif::Vertex *v) 386 { 387 simplif::vert_info& info = vertex_info(v); 388 389 simplif::real err = simplif::quadrix_evaluate_vertex(*v, info.Q); 390 391 if( simplif::will_weight_by_area ) 392 392 err /= info.norm; 393 393 … … 398 398 // Extract the minimum cost of the the valid nodes (not simplified) 399 399 //--------------------------------------------------------------------------- 400 qslim::real SimplificationMethod::decimate_min_error()401 { 402 qslim::heap_node *top;403 qslim::pair_info *pair;400 simplif::real SimplificationMethod::decimate_min_error() 401 { 402 simplif::heap_node *top; 403 simplif::pair_info *pair; 404 404 405 405 for(;;) … … 407 407 top = heap->top(); 408 408 if( !top ) return -1.0; 409 pair = ( qslim::pair_info *)top->obj;409 pair = (simplif::pair_info *)top->obj; 410 410 411 411 if( pair->isValid() ) … … 422 422 // Returns the maximum error by vertex 423 423 //--------------------------------------------------------------------------- 424 qslim::real SimplificationMethod::decimate_max_error(qslim::Model& m)425 { 426 qslim::real max_err = 0;424 simplif::real SimplificationMethod::decimate_max_error(simplif::Model& m) 425 { 426 simplif::real max_err = 0; 427 427 428 428 for(int i=0; i<m.vertCount(); i++) … … 438 438 // Initializations 439 439 //--------------------------------------------------------------------------- 440 void SimplificationMethod::decimate_init( qslim::Model& m, qslim::real limit)440 void SimplificationMethod::decimate_init(simplif::Model& m, simplif::real limit) 441 441 { 442 442 int i,j; … … 444 444 vinfo.init(m.vertCount()); 445 445 446 if( qslim::will_use_vertex_constraint )446 if( simplif::will_use_vertex_constraint ) 447 447 for(i=0; i<m.vertCount(); i++) 448 448 { 449 qslim::Vertex *v = m.vertex(i);449 simplif::Vertex *v = m.vertex(i); 450 450 if( v->isValid() ) 451 vertex_info(v).Q = qslim::quadrix_vertex_constraint(*v);451 vertex_info(v).Q = simplif::quadrix_vertex_constraint(*v); 452 452 } 453 453 … … 455 455 if( m.face(i)->isValid() ) 456 456 { 457 if( qslim::will_use_plane_constraint )458 { 459 qslim::Mat4 Q = qslim::quadrix_plane_constraint(*m.face(i));460 qslim::real norm = 0.0;461 462 if( qslim::will_weight_by_area )457 if( simplif::will_use_plane_constraint ) 458 { 459 simplif::Mat4 Q = simplif::quadrix_plane_constraint(*m.face(i)); 460 simplif::real norm = 0.0; 461 462 if( simplif::will_weight_by_area ) 463 463 { 464 464 norm = m.face(i)->area(); … … 475 475 } 476 476 477 if( qslim::will_constrain_boundaries )477 if( simplif::will_constrain_boundaries ) 478 478 { 479 479 for(i=0; i<m.edgeCount(); i++) 480 if( m.edge(i)->isValid() && qslim::check_for_discontinuity(m.edge(i)) )481 { 482 qslim::Mat4 B = qslim::quadrix_discontinuity_constraint(m.edge(i));483 qslim::real norm = 0.0;484 485 if( qslim::will_weight_by_area )486 { 487 norm = qslim::norm2(*m.edge(i)->org() - *m.edge(i)->dest());480 if( m.edge(i)->isValid() && simplif::check_for_discontinuity(m.edge(i)) ) 481 { 482 simplif::Mat4 B = simplif::quadrix_discontinuity_constraint(m.edge(i)); 483 simplif::real norm = 0.0; 484 485 if( simplif::will_weight_by_area ) 486 { 487 norm = simplif::norm2(*m.edge(i)->org() - *m.edge(i)->dest()); 488 488 B *= norm; 489 489 } 490 490 491 B *= qslim::boundary_constraint_weight;491 B *= simplif::boundary_constraint_weight; 492 492 vertex_info(m.edge(i)->org()).Q += B; 493 493 vertex_info(m.edge(i)->org()).norm += norm; … … 497 497 } 498 498 499 heap = new qslim::Heap(m.validEdgeCount);499 heap = new simplif::Heap(m.validEdgeCount); 500 500 501 501 int pair_count = 0; … … 504 504 if( m.edge(i)->isValid() ) 505 505 { 506 qslim::pair_info *pair = new_pair(m.edge(i)->org(), m.edge(i)->dest());506 simplif::pair_info *pair = new_pair(m.edge(i)->org(), m.edge(i)->dest()); 507 507 //pointers_to_remove.push_back(pair); 508 508 compute_pair_info(pair); … … 517 517 if( proximity_limit > 0 ) 518 518 { 519 qslim::ProxGrid grid(m.bounds.min, m.bounds.max, limit);519 simplif::ProxGrid grid(m.bounds.min, m.bounds.max, limit); 520 520 for(i=0; i<m.vertCount(); i++) 521 521 grid.addPoint(m.vertex(i)); 522 522 523 qslim::buffer<qslim::Vec3 *> nearby(32);523 simplif::buffer<simplif::Vec3 *> nearby(32); 524 524 for(i=0; i<m.vertCount(); i++) 525 525 { … … 529 529 for(j=0; j<nearby.length(); j++) 530 530 { 531 qslim::Vertex *v1 = m.vertex(i);532 qslim::Vertex *v2 = (qslim::Vertex *)nearby(j);531 simplif::Vertex *v1 = m.vertex(i); 532 simplif::Vertex *v2 = (simplif::Vertex *)nearby(j); 533 533 534 534 if( v1->isValid() && v2->isValid() ) … … 539 539 if( !check_for_pair(v1,v2) ) 540 540 { 541 qslim::pair_info *pair = new_pair(v1,v2);541 simplif::pair_info *pair = new_pair(v1,v2); 542 542 compute_pair_info(pair); 543 543 pair_count++; … … 586 586 void SimplificationMethod::simplifmethod_run(int finalfaces,TIPOFUNC upb) 587 587 { 588 decimate_init(M0, qslim::pair_selection_tolerance);588 decimate_init(M0, simplif::pair_selection_tolerance); 589 589 unsigned int contador = 0; 590 590 float percent; // simplification percentage. … … 604 604 decim_data.clear(); 605 605 606 while( M0.validFaceCount > finalfaces/* qslim::face_target*/606 while( M0.validFaceCount > finalfaces/*simplif::face_target*/ 607 607 && M0.validFaceCount > 1 608 && decimate_min_error() < qslim::error_tolerance )608 && decimate_min_error() < simplif::error_tolerance ) 609 609 { 610 610 decimate_contract(M0); … … 629 629 void SimplificationMethod::simplifmethod_runv(int numvertices,TIPOFUNC upb) 630 630 { 631 decimate_init(M0, qslim::pair_selection_tolerance);631 decimate_init(M0, simplif::pair_selection_tolerance); 632 632 unsigned int contador = 0; 633 633 int previousValidVertCount; … … 650 650 decim_data.clear(); 651 651 652 while( M0.validVertCount > numvertices /* qslim::face_target*/652 while( M0.validVertCount > numvertices /*simplif::face_target*/ 653 653 && 654 decimate_min_error() < qslim::error_tolerance654 decimate_min_error() < simplif::error_tolerance 655 655 && 656 656 previousValidVertCount != M0.validVertCount) … … 730 730 { 731 731 //If the vertex is not in vertices_map, then is added 732 simplifindex=M0.in_Vertex( qslim::Vec3(objmesh->mSubMesh[i].mVertexBuffer->mPosition[j].x,732 simplifindex=M0.in_Vertex(simplif::Vec3(objmesh->mSubMesh[i].mVertexBuffer->mPosition[j].x, 733 733 objmesh->mSubMesh[i].mVertexBuffer->mPosition[j].y, 734 734 objmesh->mSubMesh[i].mVertexBuffer->mPosition[j].z)); 735 M0.in_Normal( qslim::Vec3(objmesh->mSubMesh[i].mVertexBuffer->mNormal[j].x,735 M0.in_Normal(simplif::Vec3(objmesh->mSubMesh[i].mVertexBuffer->mNormal[j].x, 736 736 objmesh->mSubMesh[i].mVertexBuffer->mNormal[j].y, 737 737 objmesh->mSubMesh[i].mVertexBuffer->mNormal[j].z)); 738 738 739 M0.in_TexCoord( qslim::Vec2(objmesh->mSubMesh[i].mVertexBuffer->mTexCoords[j].x,739 M0.in_TexCoord(simplif::Vec2(objmesh->mSubMesh[i].mVertexBuffer->mTexCoords[j].x, 740 740 objmesh->mSubMesh[i].mVertexBuffer->mTexCoords[j].y)); 741 741 vertices_map[auxvert] = num_final_verts; … … 777 777 { 778 778 //If the vertex is not in vertices_map, then is added 779 simplifindex=M0.in_Vertex( qslim::Vec3(objmesh->mSubMesh[i].mVertexBuffer->mPosition[j].x,779 simplifindex=M0.in_Vertex(simplif::Vec3(objmesh->mSubMesh[i].mVertexBuffer->mPosition[j].x, 780 780 objmesh->mSubMesh[i].mVertexBuffer->mPosition[j].y, 781 781 objmesh->mSubMesh[i].mVertexBuffer->mPosition[j].z)); 782 M0.in_Normal( qslim::Vec3(objmesh->mSubMesh[i].mVertexBuffer->mNormal[j].x,782 M0.in_Normal(simplif::Vec3(objmesh->mSubMesh[i].mVertexBuffer->mNormal[j].x, 783 783 objmesh->mSubMesh[i].mVertexBuffer->mNormal[j].y, 784 784 objmesh->mSubMesh[i].mVertexBuffer->mNormal[j].z)); 785 M0.in_TexCoord( qslim::Vec2(0.0,0.0));785 M0.in_TexCoord(simplif::Vec2(0.0,0.0)); 786 786 vertices_map[auxvert] = num_final_verts; 787 787 num_final_verts ++; … … 970 970 if (M0.face(i)->isValid()) 971 971 { 972 qslim::Face *auxface = M0.face(i);972 simplif::Face *auxface = M0.face(i); 973 973 974 974 // Determine to which submesh pertains the triangle.
Note: See TracChangeset
for help on using the changeset viewer.