Ignore:
Timestamp:
11/10/05 09:55:50 (19 years ago)
Author:
bittner
Message:

vsspreprocessor updates

Location:
trunk/VUT/GtpVisibilityPreprocessor/src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/GtpVisibilityPreprocessor/src/Makefile

    r382 r401  
    11############################################################################# 
    22# Makefile for building: preprocessor 
    3 # Generated by qmake (1.07a) (Qt 3.3.2) on: Sat Nov 05 19:00:35 2005 
     3# Generated by qmake (1.07a) (Qt 3.3.2) on: Wed Nov 09 22:44:25 2005 
    44# Project:  preprocessor.pro 
    55# Template: app 
     
    228228                common.h \ 
    229229                Material.h \ 
     230                VssRay.h \ 
    230231                Parser.h \ 
    231232                Mesh.h \ 
     
    235236                Pvs.h \ 
    236237                Ray.h \ 
     238                Polygon3.h \ 
    237239                 
    238240 
     
    261263                Material.h \ 
    262264                Exporter.h \ 
     265                VssRay.h \ 
    263266                 
    264267 
     
    281284                common.h \ 
    282285                Ray.h \ 
     286                Polygon3.h \ 
    283287                 
    284288 
     
    342346                ViewCell.h \ 
    343347                Polygon3.h \ 
     348                VssRay.h \ 
    344349                Containers.h \ 
    345350                AxisAlignedBox3.h \ 
     
    367372                common.h \ 
    368373                Exporter.h \ 
     374                VssRay.h \ 
    369375                Material.h \ 
    370376                Pvs.h \ 
     
    442448                common.h \ 
    443449                Ray.h \ 
     450                Polygon3.h \ 
    444451                VssRay.h \ 
    445452                 
     
    466473                Exporter.h \ 
    467474                Containers.h \ 
    468                 Material.h \ 
     475                VssRay.h \ 
     476                Material.h \ 
     477                Vector3.h \ 
     478                common.h \ 
    469479                 
    470480 
     
    485495                Intersectable.h \ 
    486496                Material.h \ 
     497                VssRay.h \ 
    487498                 
    488499 
     
    546557                common.h \ 
    547558                Material.h \ 
     559                VssRay.h \ 
    548560                Intersectable.h \ 
    549561                 
     
    621633                Pvs.h \ 
    622634                Rectangle3.h \ 
     635                VssRay.h \ 
    623636                 
    624637 
     
    642655                VssRay.h \ 
    643656                Intersectable.h \ 
     657                Ray.h \ 
    644658                AxisAlignedBox3.h \ 
    645659                Statistics.h \ 
  • trunk/VUT/GtpVisibilityPreprocessor/src/Ray.h

    r392 r401  
    290290}; 
    291291 
     292struct SimpleRay 
     293{ 
     294        Vector3 mOrigin; 
     295        Vector3 mDirection; 
     296        SimpleRay() {} 
     297        SimpleRay(const Vector3 &o, const Vector3 &d):mOrigin(o), mDirection(d) {} 
     298}; 
     299 
     300typedef vector<SimpleRay> SimpleRayContainer; 
    292301 
    293302#endif  
  • trunk/VUT/GtpVisibilityPreprocessor/src/VssPreprocessor.cpp

    r387 r401  
    3939VssPreprocessor::CastRay( 
    4040                                                                                                 Vector3 &viewPoint, 
    41                                                                                                  Vector3 &direction 
     41                                                                                                 Vector3 &direction, 
     42                                                                                                 VssRayContainer &vssRays 
    4243                                                                                                 ) 
    4344{ 
     
    6061                box.ComputeMinMaxT(ray, &tmin, &tmax); 
    6162                if (tmax > bsize) { 
    62                         cerr<<"Warning: tmax > box size tmax="<<tmax<<" tmin="<<tmin<<" size="<<bsize<<endl; 
    63                         cerr<<"ray"<<ray<<endl; 
     63                        //                      cerr<<"Warning: tmax > box size tmax="<<tmax<<" tmin="<<tmin<<" size="<<bsize<<endl; 
     64                        //                      cerr<<"ray"<<ray<<endl; 
    6465                } 
    6566                pointA = ray.Extrap(tmax); 
     
    8586                box.ComputeMinMaxT(ray, &tmin, &tmax); 
    8687                if (tmax > bsize) { 
    87                         cerr<<"Warning: tmax > box size tmax="<<tmax<<" tmin="<<tmin<<" size="<<bsize<<endl; 
    88                         cerr<<"ray"<<ray<<endl; 
     88                        //                      cerr<<"Warning: tmax > box size tmax="<<tmax<<" tmin="<<tmin<<" size="<<bsize<<endl; 
     89                        //                      cerr<<"ray"<<ray<<endl; 
    8990                } 
    9091                 
     
    108109                                                                                                        objectB, 
    109110                                                                                                        objectA); 
    110                         mVssRays.push_back(vssRay); 
     111                        vssRays.push_back(vssRay); 
    111112                        hits ++; 
    112113                } 
     
    117118                                                                                                        objectA, 
    118119                                                                                                        objectB); 
    119                         mVssRays.push_back(vssRay); 
     120                        vssRays.push_back(vssRay); 
    120121                        hits ++; 
    121122                } 
     
    150151} 
    151152 
     153int 
     154VssPreprocessor::RandomizedImportanceSampling(VssTree *vssTree, 
     155                                                                                                                                                                                        const int desiredSamples) 
     156{ 
     157        float minRayContribution; 
     158        float maxRayContribution; 
     159        float avgRayContribution; 
     160 
     161        vssTree->GetRayContributionStatistics(minRayContribution, 
     162                                                                                                                                                                maxRayContribution, 
     163                                                                                                                                                                avgRayContribution); 
     164 
     165        cout<< 
     166                "#MIN_RAY_CONTRIB\n"<<minRayContribution<<endl<< 
     167                "#MAX_RAY_CONTRIB\n"<<maxRayContribution<<endl<< 
     168                "#AVG_RAY_CONTRIB\n"<<avgRayContribution<<endl; 
     169         
     170        float p = desiredSamples/(float)(avgRayContribution*vssTree->stat.Leaves()); 
     171        SimpleRayContainer rays; 
     172        int num = vssTree->GenerateRays(p, rays); 
     173        cout<<"Generated "<<num<<" rays."<<endl; 
     174         
     175        VssRayContainer  vssRays; 
     176         
     177        for (int i=0; i < rays.size(); i++) 
     178                CastRay(rays[i].mOrigin, rays[i].mDirection, vssRays); 
     179 
     180        vssTree->AddRays(vssRays); 
     181        return num; 
     182} 
    152183 
    153184 
     
    175206        } 
    176207         
    177         bool useViewSpaceBox = true; 
     208        bool useViewSpaceBox = false; 
    178209        if (useViewSpaceBox) 
    179210                viewSpaceBox = &box; 
    180          
     211 
     212        VssTree *vssTree = NULL; 
     213 
    181214  while (totalSamples < mTotalSamples) { 
    182215                int passContributingSamples = 0; 
     
    193226                        Vector3 direction = GetDirection(viewpoint); 
    194227                         
    195                         sampleContributions = CastRay(viewpoint, direction); 
     228                        sampleContributions = CastRay(viewpoint, direction, mVssRays); 
    196229                         
    197230                         
     
    226259                        "#AvgPVS\n"<< pvsSize/(float)mObjects.size() << endl << 
    227260                        "#AvgRayContrib\n" << avgRayContrib << endl; 
     261 
     262 
     263 
     264                 
    228265        } 
    229266         
     
    257294        cout<<"done."<<endl<<flush; 
    258295 
    259         VssTree *vssTree = new VssTree; 
    260  
     296 
     297 
     298 
     299        vssTree = new VssTree; 
     300         
    261301        vssTree->Construct(mVssRays, viewSpaceBox); 
    262302 
    263303        cout<<"VssTree root PVS size = "<<vssTree->GetRootPvsSize()<<endl; 
    264          
    265  
    266  
     304 
     305         
     306        int samples = 0; 
     307        for (int i=0; i < 50; i++) { 
     308                int num = 100000; 
     309                if (0) { 
     310                        VssRayContainer vssRays; 
     311                        for (int j=0; j < num; j++) { 
     312                                Vector3 viewpoint = GetViewpoint(viewSpaceBox); 
     313                                Vector3 direction = GetDirection(viewpoint); 
     314                                CastRay(viewpoint, direction, vssRays); 
     315                        } 
     316                        vssTree->AddRays(vssRays); 
     317                } else { 
     318                        num = RandomizedImportanceSampling(vssTree, num); 
     319                } 
     320                samples+=num; 
     321                float pvs = vssTree->GetAvgPvsSize(); 
     322                cout<<samples<<" avgPVS ="<<pvs<<endl; 
     323        } 
     324 
     325        delete vssTree; 
     326         
    267327  return true; 
    268328} 
  • trunk/VUT/GtpVisibilityPreprocessor/src/VssPreprocessor.h

    r386 r401  
    77#include "Preprocessor.h" 
    88#include "VssRay.h" 
     9class VssTree; 
    910 
    1011/** Sampling based visibility preprocessing. The implementation is based on heuristical 
     
    4445        CastRay( 
    4546                                        Vector3 &viewPoint, 
    46                                         Vector3 &direction 
     47                                        Vector3 &direction, 
     48                                        VssRayContainer &vssRays 
     49 
    4750                                        ); 
    4851                 
     
    5154        virtual bool BuildBspTree() { return false; } 
    5255 
     56        int 
     57        RandomizedImportanceSampling(VssTree *vssTree, const int desiredSamples); 
     58 
    5359}; 
    5460 
  • trunk/VUT/GtpVisibilityPreprocessor/src/VssTree.cpp

    r395 r401  
    2323#include "VssRay.h" 
    2424#include "Intersectable.h" 
     25#include "Ray.h" 
    2526 
    2627 
     
    197198 
    198199void 
    199 VssTreeLeaf::EvalPvsSize() 
     200VssTreeLeaf::UpdatePvsSize() 
    200201{ 
    201202        if (!mValidPvs) { 
     
    273274 
    274275  stat.rays = leaf->rays.size(); 
    275         leaf->EvalPvsSize(); 
     276        leaf->UpdatePvsSize(); 
    276277  stat.initialPvsSize = leaf->GetPvsSize(); 
    277278  // Subdivide(); 
     
    13721373        return pvsSize; 
    13731374} 
     1375 
     1376void 
     1377VssTree::GetRayContributionStatistics( 
     1378                                                                                                                                                        float &minRayContribution, 
     1379                                                                                                                                                        float &maxRayContribution, 
     1380                                                                                                                                                        float &avgRayContribution 
     1381                                                                                                                                                        ) 
     1382{ 
     1383        stack<VssTreeNode *> tstack; 
     1384  tstack.push(root); 
     1385         
     1386        minRayContribution = 1.0f; 
     1387        maxRayContribution = 0.0f; 
     1388        float sumRayContribution = 0.0f; 
     1389        int leaves = 0; 
     1390 
     1391  while (!tstack.empty()) { 
     1392    VssTreeNode *node = tstack.top(); 
     1393    tstack.pop(); 
     1394                 
     1395    if (node->IsLeaf()) { 
     1396                        leaves++; 
     1397                        VssTreeLeaf *leaf = (VssTreeLeaf *)node; 
     1398                        float c = leaf->GetAvgRayContribution(); 
     1399                        if (c > maxRayContribution) 
     1400                                maxRayContribution = c; 
     1401                        if (c < minRayContribution) 
     1402                                minRayContribution = c; 
     1403                        sumRayContribution += c; 
     1404                         
     1405                } else { 
     1406                        VssTreeInterior *in = (VssTreeInterior *)node; 
     1407                        // both nodes for directional splits 
     1408                        tstack.push(in->front); 
     1409                        tstack.push(in->back); 
     1410                } 
     1411        } 
     1412         
     1413        cout<<"sum="<<sumRayContribution<<endl; 
     1414        cout<<"leaves="<<leaves<<endl; 
     1415        avgRayContribution = sumRayContribution/(float)leaves; 
     1416} 
     1417 
     1418 
     1419int 
     1420VssTree::GenerateRays(const float ratioPerLeaf, 
     1421                                                                                        SimpleRayContainer &rays) 
     1422{ 
     1423        stack<VssTreeNode *> tstack; 
     1424  tstack.push(root); 
     1425         
     1426  while (!tstack.empty()) { 
     1427    VssTreeNode *node = tstack.top(); 
     1428    tstack.pop(); 
     1429                 
     1430    if (node->IsLeaf()) { 
     1431                        VssTreeLeaf *leaf = (VssTreeLeaf *)node; 
     1432                        float c = leaf->GetAvgRayContribution(); 
     1433                        int num = (c*ratioPerLeaf + 0.5); 
     1434                        //                      cout<<num<<" "; 
     1435 
     1436                        for (int i=0; i < num; i++) { 
     1437                                Vector3 origin = GetBBox(leaf).GetRandomPoint(); 
     1438                                Vector3 dirVector = GetDirBBox(leaf).GetRandomPoint(); 
     1439                                Vector3 direction = Vector3(sin(dirVector.x), sin(dirVector.y), cos(dirVector.x)); 
     1440                                //cout<<"dir vector.x="<<dirVector.x<<"direction'.x="<<atan2(direction.x, direction.y)<<endl; 
     1441                                rays.push_back(SimpleRay(origin, direction)); 
     1442                        } 
     1443                         
     1444                } else { 
     1445                        VssTreeInterior *in = (VssTreeInterior *)node; 
     1446                        // both nodes for directional splits 
     1447                        tstack.push(in->front); 
     1448                        tstack.push(in->back); 
     1449                } 
     1450        } 
     1451 
     1452        return rays.size(); 
     1453} 
     1454 
     1455 
     1456float 
     1457VssTree::GetAvgPvsSize() 
     1458{ 
     1459        stack<VssTreeNode *> tstack; 
     1460  tstack.push(root); 
     1461 
     1462        int sumPvs = 0; 
     1463        int leaves = 0; 
     1464  while (!tstack.empty()) { 
     1465    VssTreeNode *node = tstack.top(); 
     1466    tstack.pop(); 
     1467                 
     1468    if (node->IsLeaf()) { 
     1469                        VssTreeLeaf *leaf = (VssTreeLeaf *)node; 
     1470                        // update pvs size 
     1471                        leaf->UpdatePvsSize(); 
     1472                        sumPvs += leaf->GetPvsSize(); 
     1473                        leaves++; 
     1474                } else { 
     1475                        VssTreeInterior *in = (VssTreeInterior *)node; 
     1476                        // both nodes for directional splits 
     1477                        tstack.push(in->front); 
     1478                        tstack.push(in->back); 
     1479                } 
     1480        } 
     1481 
     1482 
     1483        return sumPvs/(float)leaves; 
     1484} 
  • trunk/VUT/GtpVisibilityPreprocessor/src/VssTree.h

    r395 r401  
    2929 
    3030#include "Statistics.h" 
     31#include "Ray.h" 
    3132 
    3233// -------------------------------------------------------------- 
     
    412413 
    413414        void 
    414         EvalPvsSize(); 
     415        UpdatePvsSize(); 
    415416 
    416417  void Mail() { mailbox = mailID; } 
     
    423424 
    424425        float GetAvgRayContribution() const { 
    425                 return GetPvsSize()/(float)rays.size(); 
     426                return GetPvsSize()/((float)rays.size() + Limits::Small); 
    426427        } 
    427428}; 
     
    610611                                                                                                        VssRayContainer &add 
    611612                                                                                                        ); 
    612          
     613 
     614        virtual void AddRays( 
     615                                                                                         VssRayContainer &add 
     616                                                                                         ) 
     617        { 
     618                VssRayContainer remove; 
     619                UpdateRays(remove, add); 
     620        } 
     621 
    613622   
    614623         
     
    772781        int 
    773782        GetPvsSize(VssTreeNode *node, const AxisAlignedBox3 &box) const; 
    774          
     783 
     784        void 
     785        GetRayContributionStatistics( 
     786                                                                                                                         float &minRayContribution, 
     787                                                                                                                         float &maxRayContribution, 
     788                                                                                                                         float &avgRayContribution 
     789                                                                                                                         ); 
     790 
     791        int 
     792        GenerateRays(const float ratioPerLeaf, 
     793                                                         SimpleRayContainer &rays); 
     794 
     795        float 
     796        GetAvgPvsSize(); 
     797 
    775798}; 
    776799 
  • trunk/VUT/GtpVisibilityPreprocessor/src/default.env

    r387 r401  
    2424 
    2525VssPreprocessor { 
    26         totalSamples 100000 
     26        totalSamples 200000 
    2727        samplesPerPass  50000 
    2828} 
     
    3232 
    3333        maxDepth        40 
    34         minPvs          10 
     34        minPvs          5 
    3535        minSize         0.00001 
    3636        maxCostRatio    0.95 
    37         maxRayContribution 0.2 
     37        maxRayContribution 0.3 
    3838         
    3939        maxTotalMemory  400 
Note: See TracChangeset for help on using the changeset viewer.