Ignore:
Timestamp:
06/20/06 13:28:51 (18 years ago)
Author:
gumbau
Message:

namespace simplif

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Geom/shared/GTGeometry/src/libs/SimplificationMethod.cpp

    r1007 r1025  
    3333//      Recalculate the cost of the vertices of an edge 
    3434//--------------------------------------------------------------------------- 
    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 ) 
     35void 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 ) 
    4949                auxpair->cost /= norm; 
    5050 
    51         if( qslim::will_preserve_mesh_quality ) 
     51        if( simplif::will_preserve_mesh_quality ) 
    5252                auxpair->cost += pair_mesh_penalty(M0, v0, v1, auxpair->candidate); 
    5353 
     
    7070//      Reasign the new vertex to the adequate face 
    7171//--------------------------------------------------------------------------- 
    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) 
     72int SimplificationMethod::predict_face(simplif::Face& F, simplif::Vertex *v1, simplif::Vertex *v2, simplif::Vec3& vnew, simplif::Vec3& f1, simplif::Vec3& f2, simplif::Vec3& f3) 
    7373{ 
    7474        int nmapped = 0; 
     
    9393//--------------------------------------------------------------------------- 
    9494//--------------------------------------------------------------------------- 
    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; 
     95simplif::real SimplificationMethod::pair_mesh_penalty(simplif::Model& M, simplif::Vertex *v1, simplif::Vertex *v2, simplif::Vec3& vnew) 
     96{ 
     97        static simplif::face_buffer changed; 
    9898        changed.reset(); 
    9999 
     
    101101 
    102102        // real Nsum = 0; 
    103         qslim::real Nmin = 0; 
     103        simplif::real Nmin = 0; 
    104104 
    105105        for(int i=0; i<changed.length(); i++) 
    106106        { 
    107                 qslim::Face& F = *changed(i); 
    108                 qslim::Vec3 f1, f2, f3; 
     107                simplif::Face& F = *changed(i); 
     108                simplif::Vec3 f1, f2, f3; 
    109109 
    110110                int nmapped = predict_face(F, v1, v2, vnew, f1, f2, f3); 
     
    113113                if( nmapped < 2 ) 
    114114                { 
    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(); 
    117117 
    118118                        if( Nmin > delta ) Nmin = delta; 
     
    130130//      Returns true if the givens vertices are a valid pair 
    131131//--------------------------------------------------------------------------- 
    132 bool SimplificationMethod::check_for_pair(qslim::Vertex *v0, qslim::Vertex *v1) 
    133 { 
    134         const qslim::pair_buffer& pairs = vertex_info(v0).pairs; 
     132bool SimplificationMethod::check_for_pair(simplif::Vertex *v0, simplif::Vertex *v1) 
     133{ 
     134        const simplif::pair_buffer& pairs = vertex_info(v0).pairs; 
    135135 
    136136        for(int i=0; i<pairs.length(); i++) 
     
    146146//      Create a new pair with two given vertices 
    147147//--------------------------------------------------------------------------- 
    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); 
     148simplif::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); 
    154154        v0_info.pairs.add(pair); 
    155155        v1_info.pairs.add(pair); 
     
    161161//      Remove a given pair 
    162162//--------------------------------------------------------------------------- 
    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); 
     163void 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); 
    167167 
    168168        v0_info.pairs.remove(v0_info.pairs.find(auxpair)); 
     
    178178//      Contract a given pair 
    179179//--------------------------------------------------------------------------- 
    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; 
     180void 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; 
    186186        int i; 
    187187 
     
    190190        v0_info.norm += v1_info.norm; 
    191191 
    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)); 
    194194 
    195195        // Find the edge to remove (before remove it (contract())) 
    196         qslim::Edge *econ=NULL; 
     196        simplif::Edge *econ=NULL; 
    197197        bool finded = false; 
    198198        for (i=0; i<v0->edgeUses().length(); i++) 
     
    210210 
    211211        // Perform the actual contraction 
    212         static qslim::face_buffer changed; 
     212        static simplif::face_buffer changed; 
    213213        changed.reset(); 
    214214        m.contract(v0, v1, vnew, changed); 
     
    216216        // Stores the simplification step 
    217217        MeshSimplificationSequence::Step simplifstep; 
    218         qslim::Vec3 vdesp = p - v0antes; 
     218        simplif::Vec3 vdesp = p - v0antes; 
    219219 
    220220        // 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]; 
    224224         
    225225        //      Submeshes which pertains each vertex 
     
    245245        for (i=0; i<changed.length(); i++) 
    246246        { 
    247                 qslim::Face *auxface = changed(i); 
     247                simplif::Face *auxface = changed(i); 
    248248 
    249249                if (auxface->isValid()) 
     
    291291        for(i=0; i<v0_info.pairs.length(); i++) 
    292292        { 
    293                 qslim::pair_info *p = v0_info.pairs(i); 
     293                simplif::pair_info *p = v0_info.pairs(i); 
    294294                compute_pair_info(p); 
    295295        } 
    296296 
    297297        // Process pairs associated with now dead vertex 
    298         static qslim::pair_buffer condemned(6); // collect condemned pairs for execution 
     298        static simplif::pair_buffer condemned(6); // collect condemned pairs for execution 
    299299        condemned.reset(); 
    300300 
    301301        for(i=0; i<v1_info.pairs.length(); i++) 
    302302        { 
    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; 
    306306                if( p->v0 == v1 )       
    307307                        u = p->v1; 
     
    332332//--------------------------------------------------------------------------- 
    333333//--------------------------------------------------------------------------- 
    334 bool SimplificationMethod::decimate_quadric(qslim::Vertex *v, qslim::Mat4& Q) 
     334bool SimplificationMethod::decimate_quadric(simplif::Vertex *v, simplif::Mat4& Q) 
    335335{ 
    336336        if( vinfo.length() > 0 ) 
     
    346346//      Extract a pair from the heap, concract it and remove it form the heap 
    347347//--------------------------------------------------------------------------- 
    348 void SimplificationMethod::decimate_contract(qslim::Model& m) 
    349 { 
    350         qslim::heap_node *top; 
    351         qslim::pair_info *pair; 
     348void SimplificationMethod::decimate_contract(simplif::Model& m) 
     349{ 
     350        simplif::heap_node *top; 
     351        simplif::pair_info *pair; 
    352352 
    353353        for(;;) 
     
    355355                top = heap->extract(); 
    356356                if( !top ) return; 
    357                 pair = (qslim::pair_info *)top->obj; 
     357                pair = (simplif::pair_info *)top->obj; 
    358358 
    359359                //Remove all the vertices of the removed edges 
     
    361361                for (int i=0; i<pair->v0->edgeUses().length(); i++) 
    362362                {                
    363                         qslim::Edge *econ = pair->v0->edgeUses()(i); 
     363                        simplif::Edge *econ = pair->v0->edgeUses()(i); 
    364364                        if (pair->v1->vID == econ->org()->vID || pair->v1->vID == econ->dest()->vID) 
    365365                        { 
     
    383383//--------------------------------------------------------------------------- 
    384384//--------------------------------------------------------------------------- 
    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 ) 
     385simplif::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 ) 
    392392                err /= info.norm; 
    393393 
     
    398398//      Extract the minimum cost of the the valid nodes (not simplified) 
    399399//--------------------------------------------------------------------------- 
    400 qslim::real SimplificationMethod::decimate_min_error() 
    401 { 
    402         qslim::heap_node *top; 
    403         qslim::pair_info *pair; 
     400simplif::real SimplificationMethod::decimate_min_error() 
     401{ 
     402        simplif::heap_node *top; 
     403        simplif::pair_info *pair; 
    404404 
    405405        for(;;) 
     
    407407                top = heap->top(); 
    408408                if( !top ) return -1.0; 
    409                 pair = (qslim::pair_info *)top->obj; 
     409                pair = (simplif::pair_info *)top->obj; 
    410410 
    411411                if( pair->isValid() ) 
     
    422422//      Returns the maximum error by vertex 
    423423//--------------------------------------------------------------------------- 
    424 qslim::real SimplificationMethod::decimate_max_error(qslim::Model& m) 
    425 { 
    426         qslim::real max_err = 0; 
     424simplif::real SimplificationMethod::decimate_max_error(simplif::Model& m) 
     425{ 
     426        simplif::real max_err = 0; 
    427427 
    428428        for(int i=0; i<m.vertCount(); i++) 
     
    438438//      Initializations 
    439439//--------------------------------------------------------------------------- 
    440 void SimplificationMethod::decimate_init(qslim::Model& m, qslim::real limit) 
     440void SimplificationMethod::decimate_init(simplif::Model& m, simplif::real limit) 
    441441{ 
    442442        int i,j; 
     
    444444        vinfo.init(m.vertCount()); 
    445445 
    446         if( qslim::will_use_vertex_constraint ) 
     446        if( simplif::will_use_vertex_constraint ) 
    447447                for(i=0; i<m.vertCount(); i++) 
    448448                { 
    449                         qslim::Vertex *v = m.vertex(i); 
     449                        simplif::Vertex *v = m.vertex(i); 
    450450                        if( v->isValid() ) 
    451                                 vertex_info(v).Q = qslim::quadrix_vertex_constraint(*v); 
     451                                vertex_info(v).Q = simplif::quadrix_vertex_constraint(*v); 
    452452                } 
    453453 
     
    455455                if( m.face(i)->isValid() ) 
    456456                { 
    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 ) 
    463463                                { 
    464464                                        norm = m.face(i)->area(); 
     
    475475                } 
    476476 
    477         if( qslim::will_constrain_boundaries ) 
     477        if( simplif::will_constrain_boundaries ) 
    478478        { 
    479479                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()); 
    488488                                        B *= norm; 
    489489                                } 
    490490 
    491                                 B *= qslim::boundary_constraint_weight; 
     491                                B *= simplif::boundary_constraint_weight; 
    492492                                vertex_info(m.edge(i)->org()).Q += B; 
    493493                                vertex_info(m.edge(i)->org()).norm += norm; 
     
    497497        } 
    498498 
    499         heap = new qslim::Heap(m.validEdgeCount); 
     499        heap = new simplif::Heap(m.validEdgeCount); 
    500500 
    501501        int pair_count = 0; 
     
    504504                if( m.edge(i)->isValid() ) 
    505505                { 
    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()); 
    507507                        //pointers_to_remove.push_back(pair); 
    508508                        compute_pair_info(pair); 
     
    517517        if( proximity_limit > 0 ) 
    518518        { 
    519                 qslim::ProxGrid grid(m.bounds.min, m.bounds.max, limit); 
     519                simplif::ProxGrid grid(m.bounds.min, m.bounds.max, limit); 
    520520                for(i=0; i<m.vertCount(); i++) 
    521521                        grid.addPoint(m.vertex(i)); 
    522522 
    523                 qslim::buffer<qslim::Vec3 *> nearby(32); 
     523                simplif::buffer<simplif::Vec3 *> nearby(32); 
    524524                for(i=0; i<m.vertCount(); i++) 
    525525                { 
     
    529529                        for(j=0; j<nearby.length(); j++) 
    530530                        { 
    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); 
    533533 
    534534                                if( v1->isValid() && v2->isValid() ) 
     
    539539                                        if( !check_for_pair(v1,v2) ) 
    540540                                        { 
    541                                                 qslim::pair_info *pair = new_pair(v1,v2); 
     541                                                simplif::pair_info *pair = new_pair(v1,v2); 
    542542                                                compute_pair_info(pair); 
    543543                                                pair_count++; 
     
    586586void SimplificationMethod::simplifmethod_run(int finalfaces,TIPOFUNC upb) 
    587587{ 
    588         decimate_init(M0, qslim::pair_selection_tolerance); 
     588        decimate_init(M0, simplif::pair_selection_tolerance); 
    589589        unsigned        int     contador        =       0; 
    590590        float                                   percent; // simplification percentage. 
     
    604604        decim_data.clear(); 
    605605 
    606         while( M0.validFaceCount > finalfaces/*qslim::face_target*/ 
     606        while( M0.validFaceCount > finalfaces/*simplif::face_target*/ 
    607607                        && M0.validFaceCount > 1 
    608                         && decimate_min_error() < qslim::error_tolerance )  
     608                        && decimate_min_error() < simplif::error_tolerance )  
    609609        { 
    610610                decimate_contract(M0); 
     
    629629void SimplificationMethod::simplifmethod_runv(int numvertices,TIPOFUNC upb) 
    630630{ 
    631         decimate_init(M0, qslim::pair_selection_tolerance); 
     631        decimate_init(M0, simplif::pair_selection_tolerance); 
    632632        unsigned        int     contador        =       0; 
    633633        int                                             previousValidVertCount; 
     
    650650        decim_data.clear(); 
    651651 
    652         while(  M0.validVertCount > numvertices /*qslim::face_target*/ 
     652        while(  M0.validVertCount > numvertices /*simplif::face_target*/ 
    653653                        && 
    654                         decimate_min_error() < qslim::error_tolerance 
     654                        decimate_min_error() < simplif::error_tolerance 
    655655                        && 
    656656                        previousValidVertCount  !=      M0.validVertCount) 
     
    730730                                        { 
    731731                                                //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,  
    733733                                                                        objmesh->mSubMesh[i].mVertexBuffer->mPosition[j].y, 
    734734                                                                        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,  
    736736                                                                        objmesh->mSubMesh[i].mVertexBuffer->mNormal[j].y, 
    737737                                                                        objmesh->mSubMesh[i].mVertexBuffer->mNormal[j].z)); 
    738738 
    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,  
    740740                                                                        objmesh->mSubMesh[i].mVertexBuffer->mTexCoords[j].y)); 
    741741                                                vertices_map[auxvert] = num_final_verts; 
     
    777777                                        { 
    778778                                                //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,  
    780780                                                                        objmesh->mSubMesh[i].mVertexBuffer->mPosition[j].y, 
    781781                                                                        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,  
    783783                                                                        objmesh->mSubMesh[i].mVertexBuffer->mNormal[j].y, 
    784784                                                                        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)); 
    786786                                                vertices_map[auxvert] = num_final_verts; 
    787787                                                num_final_verts ++; 
     
    970970                if (M0.face(i)->isValid()) 
    971971                { 
    972                         qslim::Face *auxface    =       M0.face(i); 
     972                        simplif::Face *auxface  =       M0.face(i); 
    973973 
    974974                        //      Determine to which submesh pertains the triangle. 
Note: See TracChangeset for help on using the changeset viewer.