Ignore:
Timestamp:
01/03/06 18:37:32 (19 years ago)
Author:
mattausch
Message:
 
Location:
trunk/VUT/GtpVisibilityPreprocessor/src
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/GtpVisibilityPreprocessor/src/Preprocessor.cpp

    r490 r491  
    255255 
    256256 
     257// use ascii format to store rays 
     258#define USE_ASCII 0 
     259 
     260 
    257261inline bool ilt(Intersectable *obj1, Intersectable *obj2) 
    258262{ 
     
    268272        environment->GetStringValue("Preprocessor.samplesFilename", fileName); 
    269273         
    270         Vector3 origin, termination; 
    271         // HACK: needed only for lower_bound algorithm 
    272         MeshInstance object(NULL); 
    273         ifstream samplesIn(fileName); 
    274  
     274    Vector3 origin, termination; 
     275        // HACK: needed only for lower_bound algorithm to find the  
     276        // intersected objects 
     277        MeshInstance sObj(NULL); 
     278        MeshInstance tObj(NULL); 
     279 
     280#if USE_ASCII 
     281        ifstream samplesIn(fileName, ios::binary); 
    275282        if (!samplesIn.is_open()) 
    276283                return false; 
    277284 
    278285        string buf; 
    279          
    280286        while (!(getline(samplesIn, buf)).eof()) 
    281287        { 
    282                 sscanf(buf.c_str(), "%f %f %f %f %f %f %d",  
     288                sscanf(buf.c_str(), "%f %f %f %f %f %f %d %d",  
    283289                           &origin.x, &origin.y, &origin.z, 
    284                            &termination.x, &termination.y, &termination.z, &(object.mId)); 
    285                  
    286                 if (1) 
     290                           &termination.x, &termination.y, &termination.z,  
     291                           &(sObj.mId), &(tObj.mId)); 
     292                 
     293                Intersectable *sourceObj = NULL; 
     294                Intersectable *termObj = NULL; 
     295                 
     296                if (sObj.mId >= 0) 
    287297                { 
    288298                        ObjectContainer::iterator oit = 
    289                                 lower_bound(objects.begin(), objects.end(), &object, ilt); 
    290  
    291                         samples.push_back(new VssRay(origin, termination, NULL, *oit)); 
    292                 } 
    293                 else 
     299                                lower_bound(objects.begin(), objects.end(), &sObj, ilt); 
     300                        sourceObj = *oit; 
     301                } 
     302                 
     303                if (tObj.mId >= 0) 
    294304                { 
    295                         samples.push_back(new VssRay(origin, termination, NULL, objects[object.mId])); 
    296                 } 
    297         } 
    298          
     305                        ObjectContainer::iterator oit = 
     306                                lower_bound(objects.begin(), objects.end(), &tObj, ilt); 
     307                        termObj = *oit; 
     308                } 
     309 
     310                samples.push_back(new VssRay(origin, termination, sourceObj, termObj)); 
     311        } 
     312#else 
     313        ifstream samplesIn(fileName, ios::binary); 
     314        if (!samplesIn.is_open()) 
     315                return false; 
     316 
     317        while (1) 
     318        { 
     319                 samplesIn.read(reinterpret_cast<char *>(&origin), sizeof(Vector3)); 
     320                 samplesIn.read(reinterpret_cast<char *>(&termination), sizeof(Vector3)); 
     321                 samplesIn.read(reinterpret_cast<char *>(&(sObj.mId)), sizeof(int)); 
     322                 samplesIn.read(reinterpret_cast<char *>(&(tObj.mId)), sizeof(int)); 
     323                 
     324                 if (samplesIn.eof()) 
     325                        break; 
     326 
     327                Intersectable *sourceObj = NULL; 
     328                Intersectable *termObj = NULL; 
     329                 
     330                if (sObj.mId >= 0) 
     331                { 
     332                        ObjectContainer::iterator oit = 
     333                                lower_bound(objects.begin(), objects.end(), &sObj, ilt); 
     334                        sourceObj = *oit; 
     335                } 
     336                 
     337                if (tObj.mId >= 0) 
     338                { 
     339                        ObjectContainer::iterator oit = 
     340                                lower_bound(objects.begin(), objects.end(), &tObj, ilt); 
     341                        termObj = *oit; 
     342                } 
     343 
     344                samples.push_back(new VssRay(origin, termination, sourceObj, termObj)); 
     345        } 
     346 
     347#endif 
    299348        samplesIn.close(); 
    300349 
     
    304353bool Preprocessor::WriteSamples(const VssRayContainer &samples) const 
    305354{ 
    306         char buf[100]; 
    307         environment->GetStringValue("Preprocessor.samplesFilename", buf); 
    308         ofstream samplesOut(buf); 
     355        char fileName[100]; 
     356        environment->GetStringValue("Preprocessor.samplesFilename", fileName); 
     357         
    309358 
    310359        VssRayContainer::const_iterator it, it_end = samples.end(); 
    311360         
     361#if USE_ASCII 
     362        ofstream samplesOut(fileName); 
    312363        if (!samplesOut.is_open()) 
    313364                return false; 
     
    316367        { 
    317368                VssRay *ray = *it; 
    318          
     369                int sourceid = ray->mOriginObject ? ray->mOriginObject->mId : -1;                
     370                int termid = ray->mTerminationObject ? ray->mTerminationObject->mId : -1;        
     371 
    319372                samplesOut << ray->GetOrigin().x << " " << ray->GetOrigin().y << " " << ray->GetOrigin().z << " "  
    320373                                   << ray->GetTermination().x << " " << ray->GetTermination().y << " " << ray->GetTermination().z << " "  
    321                                    << ray->mTerminationObject->mId << "\n"; 
    322         } 
     374                                   << sourceid << " " << termid << "\n"; 
     375        } 
     376#else 
     377        ofstream samplesOut(fileName, ios::binary); 
     378        if (!samplesOut.is_open()) 
     379                return false; 
     380 
     381        for (it = samples.begin(); it != it_end; ++ it) 
     382        {        
     383                VssRay *ray = *it; 
     384                Vector3 origin(ray->GetOrigin()); 
     385                Vector3 termination(ray->GetTermination()); 
     386                 
     387                int sourceid = ray->mOriginObject ? ray->mOriginObject->mId : -1;                
     388                int termid = ray->mTerminationObject ? ray->mTerminationObject->mId : -1;                
     389 
     390                samplesOut.write(reinterpret_cast<char *>(&origin), sizeof(Vector3)); 
     391                samplesOut.write(reinterpret_cast<char *>(&termination), sizeof(Vector3)); 
     392                samplesOut.write(reinterpret_cast<char *>(&sourceid), sizeof(int)); 
     393                samplesOut.write(reinterpret_cast<char *>(&termid), sizeof(int)); 
     394    } 
     395#endif 
    323396        samplesOut.close(); 
    324  
    325397        return true; 
    326398} 
  • trunk/VUT/GtpVisibilityPreprocessor/src/ViewCellBsp.cpp

    r490 r491  
    314314                polys.pop_back(); 
    315315 
    316                 //Debug << "New polygon with plane: " << poly->GetSupportingPlane() << "\n"; 
    317  
    318                 // classify polygon 
     316                //-- classify polygon 
    319317                const int cf = poly->ClassifyPlane(plane, mEpsilon); 
    320318 
     
    387385        app << "#N_LEAVES ( Number of leaves )\n" << Leaves() << "\n"; 
    388386 
    389         app << "#N_SPLITS ( Number of splits )\n" << splits << "\n"; 
     387        app << "#N_POLYSPLITS ( Number of polygon splits )\n" << polySplits << "\n"; 
     388 
     389        app << "#AXIS_ALIGNED_SPLITS (number of axis aligned splits)\n" << splits[0] + splits[1] + splits[2] << endl; 
     390 
     391        app << "#N_SPLITS ( Number of splits in axes x y z\n"; 
     392 
     393        for (int i = 0; i < 3; ++ i) 
     394                app << splits[i] << " "; 
     395        app << endl; 
    390396 
    391397        app << "#N_PMAXDEPTHLEAVES ( Percentage of leaves at maximum depth )\n"  
     
    420426 
    421427        app << "#N_ROUTPUT_INPUT_POLYGONS ( ratio polygons after subdivision / input polygons )\n" << 
    422                  (polys + splits) / (double)polys << endl; 
     428                 (polys + polySplits) / (double)polys << endl; 
    423429         
    424430        app << "===== END OF BspTree statistics ==========\n"; 
     
    529535                                CLEAR_CONTAINER(coincident); 
    530536 
    531                                 mStat.splits += splits; 
     537                                mStat.polySplits += splits; 
    532538 
    533539                                // push the children on the stack 
     
    962968        startTime = GetTime(); 
    963969        // subdivide polygons with plane 
    964         mStat.splits += SplitPolygons(interior->GetPlane(), 
    965                                                                   *tData.mPolygons,  
    966                                           *frontData.mPolygons,  
    967                                                                   *backData.mPolygons,  
    968                                                                   coincident); 
     970        mStat.polySplits += SplitPolygons(interior->GetPlane(), 
     971                                                                          *tData.mPolygons,  
     972                                                                          *frontData.mPolygons,  
     973                                                                          *backData.mPolygons,  
     974                                                                          coincident); 
    969975 
    970976        Debug << "time used for polygon splitting: " << TimeDiff(startTime, GetTime())*1e-3 << "s" << endl; 
  • trunk/VUT/GtpVisibilityPreprocessor/src/ViewCellBsp.h

    r490 r491  
    9393        int nodes; 
    9494        // number of splits 
    95         int splits; 
     95        int splits[3]; 
     96         
    9697        // totals number of rays 
    9798        int rays; 
     
    129130        /// number of invalid leaves 
    130131        int invalidLeaves; 
     132        /// polygon splits  
     133        int polySplits; 
    131134 
    132135        // Constructor 
     
    146149        { 
    147150                nodes = 0; 
    148                 splits = 0; 
     151                for (int i = 0; i < 3; ++ i) 
     152                        splits[i] = 0; 
    149153                 
    150154                maxDepth = 0; 
     
    165169                maxPvs = 0; 
    166170                invalidLeaves = 0; 
     171                polySplits = 0; 
    167172        } 
    168173 
  • trunk/VUT/GtpVisibilityPreprocessor/src/ViewCellsManager.cpp

    r490 r491  
    16431643 
    16441644 
    1645 /**********************************************************************/ 
    1646 /*                 VspBspViewCellsManager implementation              */ 
    1647 /**********************************************************************/ 
     1645/************************************************************************/ 
     1646/*                 VspBspViewCellsManager implementation                */ 
     1647/************************************************************************/ 
    16481648 
    16491649 
     
    17221722         
    17231723        Debug << mVspBspTree->GetStatistics() << endl; 
     1724 
    17241725        // collapse invalid regions 
     1726        cout << "collapsing invalid tree regions ... "; 
    17251727        mVspBspTree->CollapseTree(mVspBspTree->GetRoot());  
     1728        cout << "finished" << endl; 
     1729        cout << "reseting view cell stats ... "; 
    17261730        ResetViewCells(); 
     1731        cout << "finished" << endl; 
    17271732         
    17281733        Debug << "\nView cells after construction:\n" << mViewCellsStats << endl; 
    1729          
     1734 
     1735        if (1) // export initial view cells 
     1736        { 
     1737                cout << "exporting initial view cells (=leaves) ... "; 
     1738                Exporter *exporter = Exporter::GetExporter("view_cells.x3d"); 
     1739         
     1740                if (exporter) 
     1741                { 
     1742                        //exporter->SetWireframe(); 
     1743                        exporter->SetFilled(); 
     1744                        ExportViewCells(exporter); 
     1745 
     1746                        //if (mExportRays) 
     1747                        //      exporter->ExportRays(postProcessRays, RgbColor(1, 1, 0)); 
     1748                         
     1749                        if (mExportGeometry) 
     1750                                exporter->ExportGeometry(objects); 
     1751                         
     1752                        delete exporter; 
     1753                } 
     1754                cout << "finished" << endl; 
     1755        } 
     1756 
    17301757        long startTime = GetTime(); 
     1758        cout << "Computing remaining ray contributions ... "; 
    17311759        // recast rest of rays 
    17321760        ComputeSampleContributions(savedRays); 
    1733          
     1761        cout << "finished" << endl; 
     1762 
    17341763        Debug << "Computed remaining ray contribution in " << TimeDiff(startTime, GetTime()) * 1e-3  
    17351764                  << " secs" << endl; 
     
    18061835    Debug << ss << endl; 
    18071836 
    1808         if (1) // export view cells 
    1809         { 
    1810                 cout << "exporting initial view cells (=leaves) ... "; 
    1811                 Exporter *exporter = Exporter::GetExporter("view_cells.x3d"); 
    1812          
    1813                 if (exporter) 
    1814                 { 
    1815                         //exporter->SetWireframe(); 
    1816                         exporter->SetFilled(); 
    1817                         ExportViewCells(exporter); 
    1818  
    1819                         if (mExportRays) 
    1820                         { 
    1821                                 exporter->ExportRays(postProcessRays, RgbColor(1, 1, 0)); 
    1822                         } 
    1823  
    1824                         if (mExportGeometry) 
    1825                         { 
    1826                                 Material m; 
    1827                                 m.mDiffuseColor = RgbColor(0, 1, 0); 
    1828                                 exporter->SetForcedMaterial(m); 
    1829                                 exporter->SetFilled(); 
    1830  
    1831                                 exporter->ExportGeometry(objects); 
    1832                         } 
    1833  
    1834                         delete exporter; 
    1835                 } 
    1836                 cout << "finished" << endl; 
    1837         } 
    1838  
    18391837        //-- merge or subdivide view cells 
    18401838        int merged = 0; 
     
    18531851                  << TimeDiff(startTime, GetTime()) *1e-3 << " secs" << endl << endl; 
    18541852         
     1853        cout << "reseting view cell stats ... "; 
    18551854        ResetViewCells(); 
     1855        cout << "finished" << endl; 
     1856 
    18561857        //BspLeaf::NewMail(); 
    18571858        if (1) // export merged view cells 
  • trunk/VUT/GtpVisibilityPreprocessor/src/VspBspTree.cpp

    r490 r491  
    3434 
    3535float BspMergeCandidate::sOverallCost = 0; 
     36 
     37 
     38/// Adds object to the pvs of the front and back node 
     39inline void AddObject2Pvs(Intersectable *object, 
     40                                                  const int side, 
     41                                                  int &pvsBack, 
     42                                                  int &pvsFront) 
     43{ 
     44        if (!object) 
     45                return; 
     46 
     47        if (side <= 0) 
     48        { 
     49                if (!object->Mailed() && !object->Mailed(2)) 
     50                { 
     51                        ++ pvsBack; 
     52 
     53                        if (object->Mailed(1)) 
     54                                object->Mail(2); 
     55                        else 
     56                                object->Mail(); 
     57                } 
     58        } 
     59 
     60        if (side >= 0) 
     61        { 
     62                if (!object->Mailed(1) && !object->Mailed(2)) 
     63                { 
     64                        ++ pvsFront; 
     65 
     66                        if (object->Mailed()) 
     67                                object->Mail(2); 
     68                        else 
     69                                object->Mail(1); 
     70                } 
     71        } 
     72} 
     73 
    3674 
    3775/****************************************************************/ 
     
    509547 
    510548        // subdivide polygons 
    511         mStat.splits += SplitPolygons(interior->GetPlane(), 
    512                                                                   *tData.mPolygons, 
    513                                           *frontData.mPolygons, 
    514                                                                   *backData.mPolygons, 
    515                                                                   coincident); 
     549        SplitPolygons(interior->GetPlane(), 
     550                                  *tData.mPolygons, 
     551                      *frontData.mPolygons, 
     552                                  *backData.mPolygons, 
     553                                  coincident); 
    516554 
    517555 
     
    755793 
    756794float VspBspTree::SelectAxisAlignedPlane(Plane3 &plane, 
    757                                                                                  const VspBspTraversalData &tData) 
     795                                                                                 const VspBspTraversalData &tData, 
     796                                                                                 int &bestAxis) 
    758797{ 
    759798        AxisAlignedBox3 box; 
     
    771810        float nPosition[3]; 
    772811        float nCostRatio[3]; 
    773         int bestAxis = -1; 
     812        bestAxis = -1; 
    774813 
    775814        const int sAxis = box.Size().DrivingAxis(); 
     
    815854        Vector3 normal(0,0,0); normal[bestAxis] = 1; 
    816855        plane = Plane3(normal, nPosition[bestAxis]); 
    817  
     856         
    818857        return nCostRatio[bestAxis]; 
    819858} 
     859 
     860 
     861float VspBspTree::EvalCostRatio(const VspBspTraversalData &tData, 
     862                                                                const AxisAlignedBox3 &box, 
     863                                                                const int axis, 
     864                                                                const float position, 
     865                                                                int &raysBack, 
     866                                                                int &raysFront, 
     867                                                                int &pvsBack, 
     868                                                                int &pvsFront) 
     869{ 
     870        raysBack = 0; 
     871        raysFront = 0; 
     872        pvsFront = 0; 
     873        pvsBack = 0; 
     874 
     875        Intersectable::NewMail(3); 
     876 
     877        // eval pvs size 
     878        const int pvsSize = tData.mPvs; 
     879 
     880        // create unique ids for pvs heuristics 
     881        GenerateUniqueIdsForPvs(); 
     882 
     883        // this is the main ray classification loop! 
     884        for(RayInfoContainer::iterator ri = tData.mRays->begin(); 
     885                        ri != tData.mRays->end(); ++ ri) 
     886        { 
     887                if (!(*ri).mRay->IsActive()) 
     888                        continue; 
     889 
     890                // determine the side of this ray with respect to the plane 
     891                float t; 
     892                int side = (*ri).ComputeRayIntersection(axis, position, t); 
     893                         
     894                if (side <= 0) 
     895                        ++ raysBack; 
     896 
     897                if (side >= 0) 
     898                        ++ raysFront; 
     899 
     900                AddObjToPvs((*ri).mRay->mTerminationObject, side, pvsBack, pvsFront); 
     901        } 
     902 
     903        //-- only one of these options should be one 
     904 
     905        if (0) //-- only pvs 
     906        { 
     907                const float sum = float(pvsBack + pvsFront); 
     908                const float oldCost = (float)pvsSize; 
     909 
     910                return sum / oldCost; 
     911        } 
     912 
     913        //-- pvs + probability heuristics 
     914        float pBack, pFront, pOverall; 
     915 
     916        if (0) 
     917        { 
     918                // box length substitute for probability 
     919                const float minBox = box.Min(axis); 
     920                const float maxBox = box.Max(axis); 
     921 
     922                pBack = position - minBox; 
     923                pFront = maxBox - position; 
     924                pOverall = maxBox - minBox; 
     925        } 
     926 
     927        if (1) //-- area substitute for probability 
     928        { 
     929                 
     930                const bool useMidSplit = true; 
     931                //const bool useMidSplit = false; 
     932                         
     933                pOverall = box.SurfaceArea(); 
     934                         
     935                if (!useMidSplit) 
     936                { 
     937                        Vector3 pos = box.Max(); pos[axis] = position; 
     938                        pBack = AxisAlignedBox3(box.Min(), pos).SurfaceArea(); 
     939 
     940                        pos = box.Min(); pos[axis] = position; 
     941                        pFront = AxisAlignedBox3(pos, box.Max()).SurfaceArea(); 
     942                } 
     943                else 
     944                { 
     945                        //-- simplified computation for mid split 
     946                        const int axis2 = (axis + 1) % 3; 
     947                        const int axis3 = (axis + 2) % 3; 
     948 
     949                        const float faceArea =  
     950                                (box.Max(axis2) - box.Min(axis2)) * 
     951                                (box.Max(axis3) - box.Min(axis3)); 
     952 
     953                        pBack = pFront = pOverall * 0.5f + faceArea; 
     954                } 
     955        } 
     956 
     957        //-- ray density substitute for probability 
     958        if (0) 
     959        { 
     960                pBack = (float)raysBack; 
     961                pFront = (float)raysFront; 
     962                pOverall = (float)tData.mRays->size(); 
     963        } 
     964 
     965        //Debug << axis << " " << pvsSize << " " << pvsBack << " " << pvsFront << endl; 
     966        //Debug << pFront << " " << pBack << " " << pOverall << endl; 
     967 
     968        // float sum = raysBack*(position - minBox) + raysFront*(maxBox - position); 
     969        const float newCost = pvsBack * pBack + pvsFront * pFront; 
     970        //  float oldCost = leaf->mRays.size(); 
     971        const float oldCost = (float)pvsSize * pOverall; 
     972 
     973        return  (mCtDivCi + newCost) / oldCost; 
     974} 
     975 
    820976 
    821977 
     
    835991                        return true; 
    836992                } 
    837                 else 
    838                 { 
    839                         //-- choose plane on midpoint of a ray 
    840                         const int candidateIdx = (int)RandomValue(0, (Real)((int)data.mRays->size() - 1)); 
    841  
    842                         const Vector3 minPt = (*data.mRays)[candidateIdx].ExtrapOrigin(); 
    843                         const Vector3 maxPt = (*data.mRays)[candidateIdx].ExtrapTermination(); 
    844  
    845                         const Vector3 pt = (maxPt + minPt) * 0.5; 
    846  
    847                         const Vector3 normal = (*data.mRays)[candidateIdx].mRay->GetDir(); 
    848  
    849                         plane = Plane3(normal, pt); 
    850                         return true; 
    851                 } 
    852  
    853                 return false; 
    854993        } 
    855994 
     
    9381077        // intermediate plane 
    9391078        Plane3 plane; 
     1079        bool useAxisAlignedPlane = false; 
    9401080 
    9411081        const int limit = Min((int)data.mPolygons->size(), mMaxPolyCandidates); 
     
    9671107        } 
    9681108 
    969 #if 0 
    970         //-- choose candidate planes extracted from rays 
    971         //-- different methods are available 
    972         for (int i = 0; i < mMaxRayCandidates; ++ i) 
    973         { 
    974                 plane = ChooseCandidatePlane3(*data.mRays); 
    975                 candidateCost = SplitPlaneCost(plane, data); 
    976  
    977                 if (candidateCost < lowestCost) 
    978                 { 
    979                         bestPlane = plane; 
    980                         lowestCost = candidateCost; 
    981                 } 
    982         } 
    983 #endif 
    984  
    985         // axis aligned splits 
    986         candidateCost = SelectAxisAlignedPlane(plane, data); 
     1109        //-- axis aligned splits 
     1110        int axis; 
     1111        candidateCost = SelectAxisAlignedPlane(plane, data, axis); 
    9871112 
    9881113        if (candidateCost < lowestCost) 
    989         { 
     1114        {        
     1115                if (!useAxisAlignedPlane) 
     1116                { 
     1117                        useAxisAlignedPlane = true; 
     1118                        //! error also computed if cost ratio is missed 
     1119                        ++ mStat.splits[axis]; 
     1120                } 
     1121 
    9901122                bestPlane = plane; 
    9911123                lowestCost = candidateCost; 
     
    10311163        if (mSplitPlaneStrategy & PVS) 
    10321164        { 
     1165// matt: change back!! 
     1166Intersectable::NewMail(3); 
    10331167                // create unique ids for pvs heuristics 
    1034                 GenerateUniqueIdsForPvs(); 
     1168                //GenerateUniqueIdsForPvs(); 
    10351169 
    10361170                if (mPvsUseArea) // use front and back cell areas to approximate volume 
     
    10561190        bool useRand; 
    10571191 
    1058         // choose test polyongs randomly if over threshold 
     1192        // choose test rays randomly if too much 
    10591193        if ((int)data.mRays->size() > mMaxTests) 
    10601194        { 
     
    10951229 
    10961230                        // add the termination object 
    1097                         AddObjToPvs(ray->mTerminationObject, cf, frontPvs, backPvs); 
     1231                        //AddObjToPvs(ray->mTerminationObject, cf, frontPvs, backPvs); 
     1232                        AddObject2Pvs(ray->mTerminationObject, cf, frontPvs, backPvs); 
    10981233                        // add the source object 
    1099                         AddObjToPvs(ray->mOriginObject, cf, frontPvs, backPvs); 
    1100  
    1101                         // use number or length of rays to approximate volume 
     1234                        //AddObjToPvs(ray->mOriginObject, cf, frontPvs, backPvs); 
     1235 
     1236                        // use number of rays to approximate volume 
    11021237                        if (!mPvsUseArea) 
    11031238                        { 
    1104                                 float len = 1; 
    1105  
    1106                                 if (pvsUseLen) // use length of rays 
    1107                                         len = rayInf.SqrSegmentLength(); 
    1108  
    1109                                 pOverall += len; 
    1110  
    1111                                 if (cf == 1) 
    1112                                         pFront += len; 
    1113                                 else if (cf == -1) 
    1114                                         pBack += len; 
    1115                                 else if (cf == 0) 
    1116                                 { 
    1117                                         // use length of rays to approximate volume 
    1118                                         if (pvsUseLen) 
    1119                                         { 
    1120                                                 float newLen = len * 
    1121                                                         (rayInf.GetMaxT() - t) / 
    1122                                                         (rayInf.GetMaxT() - rayInf.GetMinT()); 
    1123  
    1124                                                 if (candidatePlane.Side(rayInf.ExtrapOrigin()) <= 0) 
    1125                                                 { 
    1126                                                         pBack += newLen; 
    1127                                                         pFront += len - newLen; 
    1128                                                 } 
    1129                                                 else 
    1130                                                 { 
    1131                                                         pFront += newLen; 
    1132                                                         pBack += len - newLen; 
    1133                                                 } 
    1134                                         } 
    1135                                         else 
    1136                                         { 
    1137                                                 ++ pFront; 
    1138                                                 ++ pBack; 
    1139                                         } 
    1140                                 } 
     1239                                ++ pOverall; 
     1240 
     1241                                if (cf >= 0) 
     1242                                        ++ pFront; 
     1243                                if (cf <= 0) 
     1244                                        ++ pBack; 
    11411245                        } 
    11421246                } 
     
    12151319        } 
    12161320} 
     1321 
    12171322 
    12181323void VspBspTree::CollectLeaves(vector<BspLeaf *> &leaves) const 
  • trunk/VUT/GtpVisibilityPreprocessor/src/VspBspTree.h

    r489 r491  
    421421        */ 
    422422        float SelectAxisAlignedPlane(Plane3 &plane,  
    423                                                                  const VspBspTraversalData &tData); 
     423                                                                 const VspBspTraversalData &tData, 
     424                                                                 int &bestAxis); 
    424425 
    425426        /** Sorts split candidates for surface area heuristics for axis aligned splits. 
     
    438439                                                                  float &position); 
    439440 
     441        /** Evaluates cost ratio for axis aligned splits. 
     442        */ 
     443        float EvalCostRatio(const VspBspTraversalData &tData, 
     444                                                const AxisAlignedBox3 &box, 
     445                                                const int axis, 
     446                                                const float position, 
     447                                                int &raysBack, 
     448                                                int &raysFront, 
     449                                                int &pvsBack, 
     450                                                int &pvsFront); 
     451 
    440452        /** Selects an axis aligned split plane. 
    441                 Returns true if split is valied 
     453                @Returns true if split is valied 
    442454        */ 
    443455        bool SelectAxisAlignedPlane(Plane3 &plane, const PolygonContainer &polys) const; 
  • trunk/VUT/GtpVisibilityPreprocessor/src/VspKdTree.cpp

    r486 r491  
    831831        return  (mCtDivCi + newCost) / oldCost; 
    832832} 
     833 
    833834 
    834835float VspKdTree::BestCostRatioRegular(VspKdLeaf *leaf, 
  • trunk/VUT/GtpVisibilityPreprocessor/src/VssPreprocessor.cpp

    r490 r491  
    1212#include "RenderSimulator.h" 
    1313 
    14 bool useViewSpaceBox = true; 
     14bool useViewSpaceBox = false; 
    1515bool use2dSampling = false; 
    16 bool useViewspacePlane = true; 
     16bool useViewspacePlane = false; 
    1717 
    1818VssPreprocessor::VssPreprocessor(): 
     
    464464          WriteSamples(mVssRays); 
    465465          cout << "finished\n" << endl; 
    466   } 
    467  
    468   //VssRayContainer dummyRays; 
    469   //LoadSamples(dummyRays, mObjects); 
    470   //Debug << "rays " << (int)mVssRays.size() << " " << dummyRays.size() << endl; 
     466 
     467          /*VssRayContainer dummyRays; 
     468          LoadSamples(dummyRays, mObjects); 
     469          Debug << "rays " << (int)mVssRays.size() << " " << dummyRays.size() << endl; 
     470 
     471          for (int i = 0; i < (int)mVssRays.size(); ++ i) 
     472          { 
     473                  Debug << mVssRays[i]->GetOrigin() << " " << mVssRays[i]->GetTermination() << " " << mVssRays[i]->mOriginObject << " " << mVssRays[i]->mTerminationObject << endl; 
     474                  Debug << dummyRays[i]->GetOrigin() << " " << dummyRays[i]->GetTermination() << " " << dummyRays[i]->mOriginObject << " " << dummyRays[i]->mTerminationObject << endl << endl; 
     475          }*/ 
     476  } 
    471477 
    472478  //int numExportRays = 10000; 
Note: See TracChangeset for help on using the changeset viewer.