Ignore:
Timestamp:
06/04/08 01:49:14 (16 years ago)
Author:
mattausch
Message:

added new importance sampling method for gvs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Vis/Preprocessing/src/GvsPreprocessor.cpp

    r2732 r2735  
    7070mCurrentViewCell(NULL), 
    7171mCurrentViewPoint(Vector3(0.0f, 0.0f, 0.0f)), 
    72 mOnlyRandomSampling(false) 
    73 //mOnlyRandomSampling(true) 
     72mOnlyRandomSampling(false), 
     73//mOnlyRandomSampling(true), 
     74mUseProbablyVisibleSampling(false) 
    7475{ 
    7576        Environment::GetSingleton()->GetIntValue("GvsPreprocessor.totalSamples", mTotalSamples); 
     
    798799        generationTimer.Entry(); 
    799800 
    800         ViewCellBorderBasedDistribution vcStrat(*this, mCurrentViewCell); 
    801         GenerateRays(DETERMINISTIC_GVS ? numSamples : numSamples / 16, *mDistribution, simpleRays, sInvalidSamples); 
     801        if (mUseProbablyVisibleSampling && (RandomValue(0, 1) > 0.5)) 
     802        { 
     803                ProbablyVisibleDistribution distr(*this, mCurrentViewCell, &mProbablyVisibleTriangles); 
     804                GenerateRays(numSamples, distr, simpleRays, sInvalidSamples); 
     805        } 
     806        else 
     807        { 
     808                GenerateRays(DETERMINISTIC_GVS ? numSamples : numSamples / 16, *mDistribution, simpleRays, sInvalidSamples); 
     809        } 
    802810 
    803811        generationTimer.Exit(); 
     
    814822                const bool pruneInvalidRays = false; 
    815823                //const bool pruneInvalidRays = true; 
     824 
    816825                CastRays(simpleRays, vssRays, castDoubleRays, pruneInvalidRays); 
    817826        } 
     
    14321441        mGvsStats.mRandomSamples = 0; 
    14331442        mGvsStats.mGvsSamples = 0; 
    1434  
     1443        mUseProbablyVisibleSampling = false; 
    14351444        //renderer->mPvsStat.currentPass = 0; 
     1445 
    14361446        mPass = 0; 
    14371447 
     
    14711481                newRandomSamples = CastInitialSamples(mInitialSamples); 
    14721482                 
     1483                //if (!mUseProbablyVisibleSampling && !mOnlyRandomSampling) 
    14731484                if (!mOnlyRandomSampling) 
    14741485                        newGvsSamples = ProcessQueue(); 
     
    15001511                        ++ mPass; 
    15011512                        mGvsStats.mPassContribution = mGvsStats.mTotalContribution - oldContribution; 
     1513 
     1514                        if (mGvsStats.mPassContribution < 2000) 
     1515                                mUseProbablyVisibleSampling = true; 
     1516                         
     1517                        if (mUseProbablyVisibleSampling) 
     1518                                PrepareProbablyVisibleSampling(); 
    15021519 
    15031520 
     
    19431960 
    19441961 
    1945 } 
     1962void GvsPreprocessor::PrepareProbablyVisibleSampling() 
     1963{ 
     1964         
     1965        // warning: using mailing! 
     1966        Intersectable::NewMail(); 
     1967 
     1968        mProbablyVisibleTriangles.clear(); 
     1969        CollectProbablyVisibleTriangles(mProbablyVisibleTriangles); 
     1970} 
     1971 
     1972 
     1973void GvsPreprocessor::CollectProbablyVisibleTriangles(ObjectContainer &triangles) 
     1974{ 
     1975        ObjectPvsIterator pit = mCurrentViewCell->GetPvs().GetIterator(); 
     1976 
     1977        static ObjectContainer tmpTriangles; 
     1978 
     1979        while (pit.HasMoreEntries()) 
     1980        {        
     1981                tmpTriangles.clear(); 
     1982 
     1983                KdIntersectable *kdObj = static_cast<KdIntersectable *>(pit.Next()); 
     1984                mKdTree->CollectObjectsWithDublicates(kdObj->GetItem(), tmpTriangles); 
     1985 
     1986                ObjectContainer::const_iterator oit, oit_end = tmpTriangles.end(); 
     1987 
     1988                for (oit = tmpTriangles.begin(); oit != oit_end; ++ oit) 
     1989                { 
     1990                        TriangleIntersectable *triObj = static_cast<TriangleIntersectable *>(*oit); 
     1991 
     1992                        // find objects which are not yet accounted for yet contained in kd pvs objects 
     1993                        if (!triObj->Mailed() && (triObj->mCounter < ACCOUNTED_OBJECT)) 
     1994                        { 
     1995                                triObj->Mail(); 
     1996                                triangles.push_back(triObj); 
     1997                        } 
     1998                } 
     1999        } 
     2000} 
     2001 
     2002 
     2003} 
Note: See TracChangeset for help on using the changeset viewer.