Ignore:
Timestamp:
11/10/05 19:01:38 (19 years ago)
Author:
mattausch
Message:

fixed some bugs in pvs criterium, take other ray plane candidates

Location:
trunk/VUT/GtpVisibilityPreprocessor
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/GtpVisibilityPreprocessor/scripts/default.env

    r402 r404  
    128128        splitPlaneStrategy 1024 
    129129         
    130         maxPolyCandidates 50 
     130        maxPolyCandidates 0 
    131131        maxRayCandidates 50 
    132132         
    133133        Termination { 
    134134                # autopartition 
    135                 maxRays 100 
    136                 maxPolygons 10 
    137                 maxDepth 50 
    138                 minPvs 20 
    139                 minArea 0.001 
     135                maxRays 300 
     136                maxPolygons -1 
     137                maxDepth 40 
     138                minPvs 35 
     139                minArea 0.005 
    140140                 
    141141                # axis aligned splits 
  • trunk/VUT/GtpVisibilityPreprocessor/src/Polygon3.cpp

    r396 r404  
    136136} 
    137137 
    138 int Polygon3::ClassifyPlane(const Plane3 &plane) const 
     138int Polygon3::ClassifyPlane(const Plane3 &plane, const float tolerance) const 
    139139{ 
    140140        VertexContainer::const_iterator it; 
     
    147147        for (it = mVertices.begin(); it != mVertices.end(); ++ it) 
    148148        { 
    149                 const int side = plane.Side(*it, Vector3::sDistTolerance); 
     149                const int side = plane.Side(*it, tolerance); 
    150150                 
    151151                if (side > 0) 
     
    176176         
    177177        return COINCIDENT; // plane and polygon are coincident 
     178} 
     179 
     180int Polygon3::ClassifyPlane(const Plane3 &plane) const 
     181{ 
     182        return ClassifyPlane(plane, Vector3::sDistTolerance); 
    178183} 
    179184 
  • trunk/VUT/GtpVisibilityPreprocessor/src/Polygon3.h

    r396 r404  
    6565        */ 
    6666        int ClassifyPlane(const Plane3 &plane) const; 
     67 
     68 
     69         
     70        /** Classify polygon with respect to the plane. 
     71            @returns one of BACK_SIDE, FRONT_SIDE, SPLIT, COINCIDENT 
     72        */ 
     73        int ClassifyPlane(const Plane3 &plane, const float tolerance) const; 
    6774 
    6875        /** Side of the polygon with respect to the plane. 
  • trunk/VUT/GtpVisibilityPreprocessor/src/SamplingPreprocessor.cpp

    r400 r404  
    912912                        exporter->SetForcedMaterial(m); 
    913913 
    914                         //exporter->SetWireframe(); 
     914                        // exporter->SetWireframe(); 
     915                        exporter->SetFilled(); 
    915916 
    916917                        // output PVS of view cell 
  • trunk/VUT/GtpVisibilityPreprocessor/src/ViewCellBsp.cpp

    r402 r404  
    872872 
    873873 
     874        //-- create front and back leaf 
    874875 
    875876        BspInterior *parent = leaf->GetParent(); 
     
    10891090        Plane3 bestPlane; 
    10901091         
    1091         int limit = sMaxPolyCandidates > 0 ?  
    1092                 Min((int)data.mPolygons->size(), sMaxPolyCandidates) : (int)data.mPolygons->size(); 
     1092        int limit = Min((int)data.mPolygons->size(), sMaxPolyCandidates); 
    10931093         
    10941094        int candidateIdx = limit; 
     
    10961096        for (int i = 0; i < limit; ++ i) 
    10971097        { 
     1098                Debug << i << " "; 
    10981099                candidateIdx = GetNextCandidateIdx(candidateIdx, *data.mPolygons); 
    10991100                 
     
    11191120                Plane3 plane; 
    11201121 
    1121                 if (1) 
     1122                if (0) 
    11221123                { 
    11231124                        Vector3 pt[3]; 
    11241125                        int idx[3]; 
    1125                  
     1126                        int cmaxT = 0; 
     1127                        int cminT = 0; 
     1128                        bool chooseMin = false; 
     1129 
    11261130                        for (int j = 0; j < 3; j ++) 
    11271131                        { 
    11281132                                idx[j] = Random((int)rays->size() * 2); 
    11291133                                 
    1130                                 if (idx[j] < (int)rays->size()) 
    1131                                         pt[j] = (*rays)[idx[j]]->mRay->Extrap((*rays)[idx[j]]->mMinT); 
     1134                                if (idx[j] >= (int)rays->size()) 
     1135                                { 
     1136                                        idx[j] -= (int)rays->size(); 
     1137                                         
     1138                                        chooseMin = (cminT < 2); 
     1139                                } 
    11321140                                else 
    1133                                 {        
    1134                                         idx[j] -= (int)rays->size(); 
    1135                                         pt[j] = (*rays)[idx[j]]->mRay->Extrap((*rays)[idx[j]]->mMaxT); 
    1136                                 } 
     1141                                        chooseMin = (cmaxT < 2); 
     1142 
     1143                                BoundedRay *bRay = (*rays)[idx[j]]; 
     1144                                pt[j] = chooseMin ? bRay->mRay->Extrap(bRay->mMinT) : bRay->mRay->Extrap(bRay->mMaxT); 
    11371145                        }        
    11381146                         
     
    14311439 
    14321440                // give penalty for unbalanced cell 
    1433                 if (((pFront * 0.2) > pBack) || (pFront < (pBack * 0.2))) 
     1441                if (((pFront * 0.2 + 0.00001) > pBack) || (pFront < (pBack * 0.2 + 0.00001))) 
    14341442                        val += 0.5; 
    14351443        } 
    1436 /*      Debug << "totalpvs: " << pvs << " ptotal: " << pOverall 
     1444 
     1445if ((val < 0.00001) || (frontPvs + backPvs < pvs)) 
     1446{ 
     1447        // create three unique ids for pvs heuristics 
     1448        Intersectable::NewMail(); backId = ViewCell::sMailId; 
     1449        Intersectable::NewMail(); frontId = ViewCell::sMailId; 
     1450        Intersectable::NewMail(); frontAndBackId = ViewCell::sMailId; 
     1451 
     1452 
     1453        BoundedRayContainer::const_iterator rit, rit_end = rays.end(); 
     1454 
     1455        int fpvs = 0; int bpvs = 0; 
     1456        for (rit = rays.begin(); rit != rays.end(); ++ rit) 
     1457        { 
     1458                Ray *ray = (*rit)->mRay; 
     1459                const float minT = (*rit)->mMinT; 
     1460                const float maxT = (*rit)->mMaxT; 
     1461 
     1462                const int cf =  
     1463                        ray->ClassifyPlane(candidatePlane, minT, maxT); 
     1464 
     1465                Debug << "classification: " << cf << endl; 
     1466                if (!ray->intersections.empty()) 
     1467                { 
     1468                        // in case the ray intersects an objcrs 
     1469                        // assure that we only count a object  
     1470                        // once for the front and once for the back side of the plane 
     1471                        IncPvs(*ray->intersections[0].mObject, fpvs, bpvs,  
     1472                                   cf, frontId, backId, frontAndBackId); 
     1473                } 
     1474                // the source object in the origin of the ray 
     1475                if (ray->sourceObject.mObject) 
     1476                { 
     1477                        IncPvs(*ray->sourceObject.mObject, fpvs, bpvs,  
     1478                                   cf, frontId, backId, frontAndBackId); 
     1479                } 
     1480 
     1481        } 
     1482 
     1483        Debug << "totalpvs: " << pvs << " ptotal: " << pOverall 
    14371484                  << " frontpvs: " << frontPvs << " pFront: " << pFront  
    14381485                  << " backpvs: " << backPvs << " pBack: " << pBack  
    1439                   << " val " << val << endl; 
    1440 */ 
     1486                  << " val " << val << " new size: " << ComputePvsSize(rays) 
     1487                  << " fp " << fpvs << " bp " << bpvs << endl << endl; 
     1488 
     1489} 
    14411490        return val; 
    14421491} 
     
    14501499                                         const int frontAndBackId) const 
    14511500{ 
    1452         if (cf == Ray::COINCIDENT) //TODO: really belongs to no pvs? 
    1453                 return; 
     1501        // TODO: does this really belong to no pvs? 
     1502        //if (cf == Ray::COINCIDENT) return; 
    14541503 
    14551504        if (cf == Ray::FRONT) 
     
    14791528                } 
    14801529        } 
    1481         // object belongs to both pvs 
    1482         else if ((cf == Ray::FRONT_BACK) || (cf == Ray::BACK_FRONT)) 
     1530        // object belongs to both PVS 
     1531        else if ((cf == Ray::FRONT_BACK) || (cf == Ray::BACK_FRONT) ||(cf == Ray::COINCIDENT)) 
    14831532        { 
    14841533                if (obj.mMailbox !=  frontAndBackId) 
     
    23622411        for (int i = 0; i < (int)mPolys.size(); ++ i) 
    23632412        { 
    2364                 const int cf = mPolys[i]->ClassifyPlane(splitPlane); 
     2413                const int cf = mPolys[i]->ClassifyPlane(splitPlane, 0.00001); 
    23652414                         
    23662415                // split new polygon with all previous planes 
     
    23952444                        case Polygon3::COINCIDENT: 
    23962445                                //front.mPolys.push_back(CreateReversePolygon(mPolys[i])); 
    2397                                 //back.mPolys.push_back(new Polygon3(mPolys[i]->mVertices)); 
     2446                                back.mPolys.push_back(new Polygon3(mPolys[i]->mVertices)); 
    23982447                                break; 
    23992448                        default: 
     
    24242473 
    24252474                const int cf =  
    2426                         planePoly->ClassifyPlane(plane); 
     2475                        planePoly->ClassifyPlane(plane, 0.00001); 
    24272476                         
    24282477                // split new polygon with all previous planes 
Note: See TracChangeset for help on using the changeset viewer.