Changeset 1718


Ignore:
Timestamp:
11/07/06 13:56:58 (18 years ago)
Author:
mattausch
Message:
 
Location:
GTP/trunk/Lib/Vis/Preprocessing/src
Files:
6 edited

Legend:

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

    r1717 r1718  
    838838   
    839839        const AxisAlignedBox3 nodeBbox = tData.mNode->GetBoundingBox(); 
    840  
    841         const float minBox = nodeBbox.Min(axis); 
    842         const float maxBox = nodeBbox.Max(axis); 
    843840        const float boxArea = nodeBbox.SurfaceArea(); 
    844841 
    845842        float minSum = 1e20f; 
    846843   
    847         float minBorder = maxBox; 
    848         float maxBorder = minBox; 
     844        float minBorder = nodeBbox.Max(axis); 
     845        float maxBorder = nodeBbox.Min(axis); 
    849846        float areaLeft = 0, areaRight = 0; 
    850847 
     
    854851        vector<float> bordersRight; 
    855852 
    856         if (mUseBboxAreaForSah) 
    857         { 
    858                 // we keep track of both borders of the bounding boxes => 
    859                 // store the events in descending order 
    860  
    861                 bordersRight.resize(mSubdivisionCandidates->size()); 
    862  
    863                 SortableEntryContainer::reverse_iterator rcit =  
    864                         mSubdivisionCandidates->rbegin(), rcit_end =  
    865                         mSubdivisionCandidates->rend(); 
    866          
    867                 vector<float>::reverse_iterator rbit = bordersRight.rbegin(); 
    868          
    869                 for (; rcit != rcit_end; ++ rcit, ++ rbit)  
    870                 { 
    871                         Intersectable *obj = (*rcit).mObject; 
    872                         const AxisAlignedBox3 obox = obj->GetBox(); 
    873  
    874                         if (obox.Min(axis) < minBorder) 
    875                         { 
    876                                 minBorder = obox.Min(axis); 
    877                         } 
    878  
    879                         (*rbit) = minBorder; 
    880                 } 
     853        // we keep track of both borders of the bounding boxes => 
     854        // store the events in descending order 
     855 
     856        bordersRight.resize(mSubdivisionCandidates->size()); 
     857 
     858        SortableEntryContainer::reverse_iterator rcit =  
     859                mSubdivisionCandidates->rbegin(), rcit_end =  
     860                mSubdivisionCandidates->rend(); 
     861 
     862        vector<float>::reverse_iterator rbit = bordersRight.rbegin(); 
     863 
     864        for (; rcit != rcit_end; ++ rcit, ++ rbit)  
     865        { 
     866                Intersectable *obj = (*rcit).mObject; 
     867                const AxisAlignedBox3 obox = obj->GetBox(); 
     868 
     869                if (obox.Min(axis) < minBorder) 
     870                { 
     871                        minBorder = obox.Min(axis); 
     872                } 
     873 
     874                (*rbit) = minBorder; 
    881875        } 
    882876 
     
    899893                const AxisAlignedBox3 obox = obj->GetBox(); 
    900894 
    901                 if (mUseBboxAreaForSah) 
    902                 { 
    903                         AxisAlignedBox3 lbox = nodeBbox; 
    904                         AxisAlignedBox3 rbox = nodeBbox; 
    905          
    906                         // the borders of the bounding boxes have changed 
    907                         if (obox.Max(axis) > maxBorder) 
    908                         { 
    909                                 maxBorder = obox.Max(axis); 
    910                         } 
    911  
    912                         minBorder = (*bit); 
    913  
    914                         lbox.SetMax(axis, maxBorder); 
    915                         rbox.SetMin(axis, minBorder); 
    916          
    917                         al = lbox.SurfaceArea(); 
    918                         ar = rbox.SurfaceArea(); 
    919                 } 
    920                 else 
    921                 { 
    922                         // just add up areas of the objects itself 
    923                         // As we are not sampling volumetric visibility, 
    924                         // this should provide better heuristics 
    925                         const float area = obj->GetArea();//obox.SurfaceArea(); 
    926  
    927                         al += area; 
    928                         ar -= area; 
    929                 } 
     895                // the borders of the bounding boxes have changed 
     896                if (obox.Max(axis) > maxBorder) 
     897                { 
     898                        maxBorder = obox.Max(axis); 
     899                } 
     900 
     901                minBorder = (*bit); 
     902 
     903                AxisAlignedBox3 lbox = nodeBbox; 
     904                AxisAlignedBox3 rbox = nodeBbox; 
     905 
     906                lbox.SetMax(axis, maxBorder); 
     907                rbox.SetMin(axis, minBorder); 
     908 
     909                al = lbox.SurfaceArea(); 
     910                ar = rbox.SurfaceArea(); 
    930911 
    931912                const bool noValidSplit = ((objectsLeft <= Limits::Small) || (objectsRight <= Limits::Small)); 
    932  
    933913                const float sum =  noValidSplit ? 1e25 : objectsLeft * al + objectsRight * ar; 
    934914       
     
    10541034                AxisAlignedBox3 rbox = nodeBbox; 
    10551035         
    1056                 // the borders of the bounding boxes have changed 
     1036                // the borders of the left bounding box have changed 
    10571037                for (int i = 0; i < 3; ++ i) 
    10581038                { 
     
    23862366 
    23872367 
    2388 } 
     2368void BvHierarchy::CollectObjects(const AxisAlignedBox3 &box, ObjectContainer &objects) 
     2369{ 
     2370        stack<BvhNode *> nodeStack; 
     2371 
     2372        nodeStack.push(mRoot); 
     2373 
     2374        while (!nodeStack.empty())  
     2375        { 
     2376                BvhNode *node = nodeStack.top(); 
     2377 
     2378                nodeStack.pop(); 
     2379 
     2380                if (node->IsLeaf())  
     2381                { 
     2382                        BvhLeaf *leaf = (BvhLeaf *)node; 
     2383 
     2384                        ObjectContainer::const_iterator oit, oit_end = leaf->mObjects.end(); 
     2385 
     2386                        for (oit = leaf->mObjects.begin(); oit != oit_end; ++oit)  
     2387                        { 
     2388                                Intersectable *object = *oit; 
     2389                                if (Overlap(box, object->GetBox()))  
     2390                                { 
     2391                                        object->Mail(); 
     2392                                        objects.push_back(object); 
     2393                                } 
     2394                        } 
     2395                }  
     2396                else  
     2397                { 
     2398                        BvhInterior *interior = (BvhInterior *)node; 
     2399 
     2400                        if (Overlap(box, interior->GetBoundingBox())) 
     2401                                nodeStack.push(interior->GetFront()); 
     2402 
     2403                        if (Overlap(box, interior->GetBoundingBox())) 
     2404                                nodeStack.push(interior->GetBack()); 
     2405                } 
     2406        } 
     2407} 
     2408 
     2409} 
  • GTP/trunk/Lib/Vis/Preprocessing/src/BvHierarchy.h

    r1707 r1718  
    613613        static float EvalAbsCost(const ObjectContainer &objects); 
    614614 
     615        void CollectObjects(const AxisAlignedBox3 &box, ObjectContainer &objects); 
    615616 
    616617protected: 
  • GTP/trunk/Lib/Vis/Preprocessing/src/HierarchyManager.cpp

    r1715 r1718  
    16071607                                                const int entriesInPvs, 
    16081608                                                const float memoryCost, 
    1609                                                 const bool vsp) 
     1609                                                const int viewSpaceSplits, 
     1610                                                const int objectSpaceSplits) 
    16101611{ 
    16111612        stats << "#Pass\n" << 0 << endl 
     
    16141615                   << "#TotalEntriesInPvs\n" << entriesInPvs << endl 
    16151616                   << "#Memory\n" << memoryCost << endl 
    1616                    << "#Vsp\n" << (vsp ? 1 : 0) << endl 
     1617                   << "#ViewSpaceSplits\n" << viewSpaceSplits << endl 
     1618                   << "#ObjectSpaceSplits\n" << objectSpaceSplits << endl 
     1619                   << "#VspOspRatio\n" << (float)viewSpaceSplits / (float)objectSpaceSplits << endl 
    16171620                   << endl; 
    16181621} 
     
    17821785                                                                                float &renderCost, 
    17831786                                                                                float &memory, 
    1784                                                                                 int &pvsEntries) 
     1787                                                                                int &pvsEntries, 
     1788                                                                                int &viewSpaceSplits, 
     1789                                                                                int &objectSpaceSplits) 
    17851790{ 
    17861791        ViewCellContainer viewCells; 
     
    18441849 
    18451850        memory = pvsEntries * ObjectPvs::GetEntrySize(); 
     1851 
     1852        viewSpaceSplits = (int)viewCells.size(); 
     1853        objectSpaceSplits = (int)bvhNodes.size(); 
     1854 
    18461855        //cout << "viewCells: " << (int)viewCells.size() << " nodes: " << (int)bvhNodes.size() << " rc: " << renderCost << " entries: " << pvsEntries << endl; 
    18471856 
     
    18571866        int entriesInPvs = 1; 
    18581867        int steps = 0; 
     1868        int viewSpaceSplits = 0; 
     1869        int objectSpaceSplits = 0; 
    18591870 
    18601871        cout << "exporting vsposp stats ... " << endl; 
     
    18641875        //-- first view cell 
    18651876 
    1866         UpdateStats(stats, 2, totalRenderCost, entriesInPvs, memoryCost, true); 
     1877        UpdateStats(stats, 2, totalRenderCost, entriesInPvs, memoryCost, viewSpaceSplits, objectSpaceSplits); 
    18671878 
    18681879        //-- go through tree in the order of render cost decrease 
     
    19071918                        entriesInPvs += entriesIncr; 
    19081919                        // if (rcDecr <= 0) 
    1909                         if (nextCandidate->Type() == SubdivisionCandidate::VIEW_SPACE)  
     1920                        if (nextCandidate->Type() == SubdivisionCandidate::VIEW_SPACE) 
     1921                        { 
     1922                                ++ viewSpaceSplits; 
    19101923                                cout << "v";//cout << "vsp t: " << timeStamp << " rc: " << rcDecr << " pvs: " << entriesIncr << endl; 
     1924                        } 
    19111925                        else 
     1926                        { 
     1927                                ++ objectSpaceSplits; 
    19121928                                cout << "o";//"osp t: " << timeStamp << " rc: " << rcDecr << " pvs: " << entriesIncr << endl; 
     1929                        } 
    19131930 
    19141931                        ++ steps; 
     
    19161933                        if ((steps % 500) == 499) 
    19171934                                cout << steps << " steps taken" << endl; 
     1935 
    19181936                        const float memoryCost = (float)entriesInPvs * (float)ObjectPvs::GetEntrySize(); 
    1919                         UpdateStats(stats, steps, totalRenderCost, entriesInPvs, memoryCost, false); 
     1937                        UpdateStats(stats, steps, totalRenderCost, entriesInPvs, memoryCost, viewSpaceSplits, objectSpaceSplits); 
    19201938                } 
    19211939 
     
    20102028        float memory; 
    20112029        int pvsEntries; 
     2030        int viewSpaceSplits; 
     2031        int objectSpaceSplits; 
    20122032 
    20132033        while (1) 
    20142034        { 
    2015                 const int numSplits = ExtractStatistics(splits, 99999.0, renderCost, memory, pvsEntries); 
     2035                const int numSplits = ExtractStatistics(splits,  
     2036                                                                                                99999.0,  
     2037                                                                                                renderCost,  
     2038                                                                                                memory,  
     2039                                                                                                pvsEntries, 
     2040                                                                                                viewSpaceSplits, 
     2041                                                                                                objectSpaceSplits); 
    20162042                 
    2017                 UpdateStats(splitsStats, numSplits, renderCost, pvsEntries, memory, 0); 
     2043                UpdateStats(splitsStats,  
     2044                                        numSplits,  
     2045                                        renderCost,  
     2046                                        pvsEntries,  
     2047                                        memory,  
     2048                                        viewSpaceSplits,  
     2049                                        objectSpaceSplits); 
     2050 
    20182051                splits += splitsStepSize; 
    20192052 
     
    20232056} 
    20242057 
    2025 } 
     2058 
     2059void HierarchyManager::CollectObjects(const AxisAlignedBox3 &box, ObjectContainer &objects) 
     2060{ 
     2061} 
     2062 
     2063} 
  • GTP/trunk/Lib/Vis/Preprocessing/src/HierarchyManager.h

    r1713 r1718  
    244244 
    245245 
     246        void CollectObjects(const AxisAlignedBox3 &box, ObjectContainer &objects); 
     247 
    246248        float mInitialRenderCost; 
    247249 
     
    463465                                                  float &renderCost, 
    464466                                                  float &memory, 
    465                                                   int &pvsEntries); 
     467                                                  int &pvsEntries, 
     468                                                  int &viewSpaceSplits, 
     469                                                  int &objectSpaceSplits); 
    466470 
    467471 
  • GTP/trunk/Lib/Vis/Preprocessing/src/TestPreprocessor.vcproj

    r1708 r1718  
    206206                                Name="VCLinkerTool" 
    207207                                AdditionalDependencies="xerces-c_2.lib glew32.lib zdll.lib zziplib.lib devil.lib glut32.lib OpenGL32.Lib glu32.lib Preprocessor.lib RTScene.lib RTWorld.lib QtCore4.lib qtmain.lib QtOpenGL4.lib Qt3Support4.lib QtTest4.lib QtGui4.lib QtGlRenderer.lib" 
    208                                 OutputFile="../bin/release/Preprocessor.exe" 
     208                                OutputFile="../bin/release/Preprocessor2.exe" 
    209209                                LinkIncremental="1" 
    210210                                AdditionalLibraryDirectories="..\src\GL;..\lib\release;..\..\Preprocessing\lib\release;..\..\..\..\..\..\NonGTP\Boost\lib;..\..\..\..\..\..\NonGTP\Xerces\xercesc\lib;..\..\..\..\..\..\NonGTP\Zlib\lib;..\..\..\..\..\..\NonGTP\Devil\lib;..\MultiLevelRayTracing\RTScene\Release;..\MultiLevelRayTracing\RTWorld\Release;&quot;$(QTDIR)\lib&quot;;.\QtGlRenderer\Release" 
  • GTP/trunk/Lib/Vis/Preprocessing/src/ViewCellsManager.cpp

    r1717 r1718  
    26282628 
    26292629 
    2630 void 
    2631 ViewCellsManager::UpdatePvsForEvaluation() 
    2632 { 
    2633   ObjectPvs objPvs; 
    2634   UpdatePvsForEvaluation(mViewCellsTree->GetRoot(), objPvs); 
     2630void ViewCellsManager::UpdatePvsForEvaluation() 
     2631{ 
     2632        ObjectPvs objPvs; 
     2633        UpdatePvsForEvaluation(mViewCellsTree->GetRoot(), objPvs); 
    26352634} 
    26362635 
     
    57255724 
    57265725#if 1 
    5727 #if TEST_EVALUATION 
    5728 void VspOspViewCellsManager::EvalViewCellPartition() 
    5729 { 
    5730         const int castSamples = (int)storedRays.size(); 
    5731         char s[64];  
    5732         char statsPrefix[100]; 
    5733  
    5734         Environment::GetSingleton()->GetStringValue("ViewCells.Evaluation.statsPrefix", statsPrefix); 
    5735  
    5736         Debug << "view cell stats prefix: " << statsPrefix << endl; 
    5737  
    5738         // should directional sampling be used? 
    5739         const bool dirSamples = (mEvaluationSamplingType == SamplingStrategy::DIRECTION_BASED_DISTRIBUTION); 
    5740  
    5741         cout << "reseting pvs ... "; 
    5742         const bool startFromZero = true; 
    5743  
    5744         if (startFromZero) 
    5745         { 
    5746                 // reset pvs and start over from zero 
    5747                 mViewCellsTree->ResetPvs(); 
    5748         } 
    5749         else  
    5750         { 
    5751                 // statistics before casting more samples 
    5752                 cout << "compute new statistics ... "; 
    5753                 sprintf(s, "-%09d-eval.log", castSamples); 
    5754                 string fName = string(statsPrefix) + string(s); 
    5755  
    5756                 mViewCellsTree->ExportStats(fName); 
    5757                 cout << "finished" << endl; 
    5758         } 
    5759         cout << "finished" << endl; 
    5760  
    5761     cout << "Evaluating view cell partition ... " << endl; 
    5762  
    5763         VssRayContainer evaluationSamples = storedRays; 
    5764         const int samplingType = mEvaluationSamplingType; 
    5765          
    5766         cout << "computing sample contributions of " << (int)evaluationSamples.size()  << " samples ... "; 
    5767          
    5768         ComputeSampleContributions(evaluationSamples, true, false); 
    5769          
    5770         cout << "finished" << endl; 
    5771          
    5772         cout << "compute new statistics ... "; 
    5773          
    5774         // propagate pvs or pvs size information 
    5775         ObjectPvs pvs; 
    5776         UpdatePvsForEvaluation(mViewCellsTree->GetRoot(), pvs); 
    5777  
    5778  
    5779         ///////////////////// 
    5780         // $§temporary matt: test render cost 
    5781  
    5782         sprintf(s, "-%09d-eval.log", castSamples); 
    5783         string fileName = string(statsPrefix) + string(s); 
    5784  
    5785         ViewCellContainer leaves; 
    5786  
    5787         mViewCellsTree->CollectLeaves(mViewCellsTree->GetRoot(), leaves); 
    5788         float rc = 0; 
    5789  
    5790         ViewCellContainer::const_iterator vit, vit_end = leaves.end(); 
    5791          
    5792         for (vit = leaves.begin(); vit != vit_end; ++ vit) 
    5793         { 
    5794                 ViewCell *vc = *vit; 
    5795                 const float pvsCost = vc->GetPvs().EvalPvsCost(); 
    5796                 const float vol = vc->GetVolume(); 
    5797                 rc += pvsCost * vol; 
    5798         } 
    5799  
    5800         Debug << "\nrendercost hack: " << rc / mViewSpaceBox.GetVolume() << endl; 
    5801         mViewCellsTree->ExportStats(fileName); 
    5802         cout << "finished" << endl; 
    5803  
    5804         disposeRays(evaluationSamples, NULL); 
    5805 } 
    5806  
    5807 #else 
    58085726 
    58095727void VspOspViewCellsManager::EvalViewCellPartition() 
     
    58125730        int numSamples; 
    58135731        int castSamples = 0; 
     5732        int oldSamples = 0; 
     5733        int samplesForStats; 
     5734        char statsPrefix[100]; 
     5735        char suffix[100]; 
    58145736        int splitsStepSize; 
    58155737 
    5816         char str[64];  
    5817          
     5738 
    58185739        Environment::GetSingleton()->GetIntValue("ViewCells.Evaluation.samplesPerPass", samplesPerPass); 
     5740        Environment::GetSingleton()->GetIntValue("ViewCells.Evaluation.samplesForStats", samplesForStats); 
    58195741        Environment::GetSingleton()->GetIntValue("ViewCells.Evaluation.samples", numSamples); 
     5742        Environment::GetSingleton()->GetStringValue("ViewCells.Evaluation.statsPrefix", statsPrefix); 
    58205743        Environment::GetSingleton()->GetIntValue("ViewCells.Evaluation.stepSize", splitsStepSize); 
    5821  
    5822         char statsPrefix[100]; 
    5823         Environment::GetSingleton()->GetStringValue("ViewCells.Evaluation.statsPrefix", statsPrefix); 
    5824  
     5744         
     5745        Debug << "step size: " << splitsStepSize << endl; 
    58255746        Debug << "view cell evaluation samples per pass: " << samplesPerPass << endl; 
    58265747        Debug << "view cell evaluation samples: " << numSamples << endl; 
    58275748        Debug << "view cell stats prefix: " << statsPrefix << endl; 
    5828         Debug << "step size: " << splitsStepSize << endl; 
     5749 
     5750        // should directional sampling be used? 
     5751        bool dirSamples =  
     5752                (mEvaluationSamplingType == SamplingStrategy::DIRECTION_BASED_DISTRIBUTION); 
    58295753 
    58305754        cout << "reseting pvs ... "; 
    58315755                 
    5832         const bool startFromZero = true; 
    5833  
    58345756        // reset pvs and start over from zero 
    5835         if (startFromZero) 
    5836         { 
    5837                 mViewCellsTree->ResetPvs(); 
    5838         } 
    5839         else // start from current sampless 
    5840         { 
    5841                 // statistics before casting more samples 
    5842                 cout << "compute new statistics ... "; 
    5843                 sprintf(str, "-%09d-eval.log", castSamples); 
    5844                 string fName = string(statsPrefix) + string(str); 
    5845  
    5846                 mViewCellsTree->ExportStats(fName); 
    5847                 cout << "finished" << endl; 
    5848         } 
    5849  
     5757        mViewCellsTree->ResetPvs(); 
     5758         
    58505759        cout << "finished" << endl; 
    58515760    cout << "Evaluating view cell partition ... " << endl; 
     
    58535762        while (castSamples < numSamples) 
    58545763        {                
    5855                 VssRayContainer evaluationSamples; 
    5856  
    58575764                /////////////// 
    58585765                //-- we have to use uniform sampling strategy for construction rays 
    58595766 
    5860                 //VssRayContainer evaluationSamples; 
     5767                VssRayContainer evaluationSamples; 
    58615768                const int samplingType = mEvaluationSamplingType; 
    58625769 
     
    58715778 
    58725779                Real timeDiff = TimeDiff(startTime, GetTime()); 
    5873                 Debug << "finished in " << timeDiff * 1e-3 << " secs" << endl; 
    5874                 cout << "finished in " << timeDiff * 1e-3 << " secs" << endl; 
    5875  
     5780                 
     5781                cout << "finished in " << timeDiff * 1e-3f << " secs" << endl; 
    58765782                cout << "computing sample contributions of " << (int)evaluationSamples.size()  << " samples ... "; 
     5783                 
     5784                Debug << "finished in " << timeDiff * 1e-3f << " secs" << endl; 
    58775785                Debug << "computing sample contributions of " << (int)evaluationSamples.size()  << " samples ... "; 
    58785786 
     
    58855793                Debug << "finished in " << timeDiff * 1e-3 << " secs" << endl; 
    58865794 
    5887                 startTime = GetTime(); 
    5888                 cout << "compute new statistics ... " << endl; 
    5889  
    5890                 /////////// 
    5891                 //-- output stats 
    5892  
    5893                 sprintf(str, "-%09d-eval.log", castSamples); 
    5894                 const string splitsFilename = string(statsPrefix) + string(str); 
    5895  
    5896                 ofstream splitsStr(splitsFilename.c_str()); 
    5897                 mHierarchyManager->EvaluateSubdivision2(splitsStr, splitsStepSize); 
    5898  
    5899                 timeDiff = TimeDiff(startTime, GetTime()); 
    5900                 cout << "finished in " << timeDiff * 1e-3 << " secs" << endl; 
    5901                 Debug << "statistics computed in " << timeDiff * 1e-3 << " secs" << endl; 
    5902          
     5795                if ((castSamples >= samplesForStats + oldSamples) || (castSamples >= numSamples)) 
     5796                { 
     5797                        oldSamples += samplesForStats; 
     5798 
     5799                        /////////// 
     5800                        //-- output stats 
     5801 
     5802                        sprintf(suffix, "-%09d-eval.log", castSamples); 
     5803                        const string filename = string(statsPrefix) + string(suffix); 
     5804 
     5805                        startTime = GetTime(); 
     5806                        cout << "compute new statistics ... " << endl; 
     5807 
     5808                        ofstream ofstr(filename.c_str()); 
     5809                        mHierarchyManager->EvaluateSubdivision2(ofstr, splitsStepSize); 
     5810 
     5811                        timeDiff = TimeDiff(startTime, GetTime()); 
     5812                        cout << "finished in " << timeDiff * 1e-3 << " secs" << endl; 
     5813                        Debug << "statistics computed in " << timeDiff * 1e-3 << " secs" << endl; 
     5814 
     5815                        // only for debugging purpose 
     5816                        if (1) 
     5817                        { 
     5818                                ViewCellContainer viewCells; 
     5819                                mViewCellsTree->CollectLeaves(mViewCellsTree->GetRoot(), viewCells); 
     5820 
     5821                                ViewCellContainer::const_iterator vit, vit_end = viewCells.end(); 
     5822                                int pvsSize = 0; 
     5823 
     5824                                for (vit = viewCells.begin(); vit != vit_end; ++ vit) 
     5825                                { 
     5826                                        pvsSize += (*vit)->GetPvs().GetSize(); 
     5827                                } 
     5828 
     5829                                cout << "debug entries: " << pvsSize << ", memcost: " << (float)pvsSize * ObjectPvs::GetEntrySize() << endl; 
     5830                        } 
     5831                } 
     5832 
    59035833                disposeRays(evaluationSamples, NULL); 
    59045834        } 
     5835         
    59055836} 
    59065837#endif 
    5907 #endif 
    5908 } 
     5838} 
Note: See TracChangeset for help on using the changeset viewer.