Ignore:
Timestamp:
04/23/07 16:19:30 (17 years ago)
Author:
mattausch
Message:

implemented part of rendering estimation of wimmer et al. for view space / object space subdivision.
warning: not working with undersampling estimation + local visibility based subdivision.

File:
1 edited

Legend:

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

    r2237 r2332  
    304304 
    305305 
    306 void HierarchyManager::EvalSubdivisionStats() 
     306void HierarchyManager::PrintSubdivisionStats() 
    307307{ 
    308308         
     
    492492 
    493493        // create first nodes 
    494         mVspTree->Initialise(sampleRays, forcedViewSpace); 
     494        mVspTree->Initialise(sampleRays, forcedViewSpace, objects); 
    495495        InitialiseObjectSpaceSubdivision(objects); 
    496496 
    497497        // hack: assume that object space can be seen from view space 
    498         mHierarchyStats.mTotalCost = mInitialRenderCost = (float)objects.size(); 
     498        mHierarchyStats.mTotalCost = mInitialRenderCost = GetViewCellsManager()->ComputeRenderCost(objects.size(), 1); 
     499 
    499500        // only one entry for start 
    500501        mHierarchyStats.mPvsEntries = 1; 
    501502        mHierarchyStats.mMemory = (float)ObjectPvs::GetEntrySizeByte(); 
    502503 
    503         EvalSubdivisionStats(); 
     504        PrintSubdivisionStats(); 
    504505        Debug << "setting total cost to " << mHierarchyStats.mTotalCost << endl; 
    505506 
     
    678679        mHierarchyStats.mPvsEntries = 1; 
    679680        mHierarchyStats.mMemory = (float)ObjectPvs::GetEntrySizeByte(); 
    680         mHierarchyStats.mTotalCost = (float)objects.size(); 
     681        mHierarchyStats.mTotalCost = GetViewCellsManager()->ComputeRenderCost(objects.size(), 1); 
    681682 
    682683        mHierarchyStats.mRenderCostDecrease = 0; 
    683684 
    684         EvalSubdivisionStats(); 
     685        PrintSubdivisionStats(); 
    685686        Debug << "setting total cost to " << mHierarchyStats.mTotalCost << endl; 
    686687 
     
    689690         
    690691        // create only roots 
    691         mVspTree->Initialise(sampleRays, forcedViewSpace); 
     692        mVspTree->Initialise(sampleRays, forcedViewSpace, objects); 
    692693        InitialiseObjectSpaceSubdivision(objects); 
    693694 
     
    745746        //-- new stats 
    746747 
    747         mHierarchyStats.mTotalCost = mVspTree->mTotalCost; 
    748         cout << "\nreseting cost for vsp, new total cost: " << mHierarchyStats.mTotalCost << endl; 
     748        if (0) 
     749        { 
     750                mHierarchyStats.mTotalCost = mVspTree->mTotalCost; 
     751                cout << "\nreseting cost for vsp construction, new total cost: " << mHierarchyStats.mTotalCost << endl; 
     752        } 
    749753} 
    750754 
     
    960964 
    961965        // output stats 
    962         EvalSubdivisionStats(); 
     966        PrintSubdivisionStats(); 
    963967 
    964968        return true; 
     
    12231227 
    12241228                        // evaluate stats before first subdivision 
    1225                         EvalSubdivisionStats(); 
     1229                        PrintSubdivisionStats(); 
    12261230                        cout << "finished bv hierarchy preparation" << endl; 
    12271231                } 
     
    12411245                                                                                                 AxisAlignedBox3 *forcedViewSpace) 
    12421246{ 
    1243         ViewCellsManager *vm = mVspTree->mViewCellsManager; 
     1247        ViewCellsManager *vm = GetViewCellsManager(); 
    12441248 
    12451249        // HACK: rather not destroy vsp tree 
     
    12501254        mVspTree->mViewCellsManager = vm; 
    12511255 
    1252         mVspTree->Initialise(sampleRays, forcedViewSpace); 
     1256        mVspTree->Initialise(sampleRays, forcedViewSpace, objects); 
     1257         
    12531258         
    12541259        ////////// 
    12551260        //-- reset stats 
     1261 
    12561262    mHierarchyStats.mNodes = GetObjectSpaceSubdivisionNodes(); 
    12571263                //-mVspTree->mVspStats.nodes + 1; 
     
    12661272 
    12671273        // evaluate new stats before first subdivsiion 
    1268         EvalSubdivisionStats(); 
     1274        PrintSubdivisionStats(); 
    12691275} 
    12701276 
     
    12781284        mHierarchyStats.mNodes = 2; 
    12791285         
    1280         mHierarchyStats.mTotalCost = (float)objects.size(); 
     1286        mHierarchyStats.mTotalCost = GetViewCellsManager()->ComputeRenderCost(objects.size(), 1); 
    12811287        Debug << "setting total cost to " << mHierarchyStats.mTotalCost << endl; 
    12821288 
     
    12851291         
    12861292        // initialise view / object space 
    1287         mVspTree->Initialise(sampleRays, forcedViewSpace); 
     1293        mVspTree->Initialise(sampleRays, forcedViewSpace, objects); 
    12881294        InitialiseObjectSpaceSubdivision(objects); 
    12891295 
     
    19871993 
    19881994void HierarchyManager::ComputePvs(const ObjectPvs &pvs,  
    1989                                                                   float &rc,  
     1995                                                                  float &triangles,  
    19901996                                                                  int &pvsEntries) 
    19911997{ 
     
    20262032                        ObjectContainer objects; 
    20272033            activeNode->CollectObjects(objects); 
    2028                         rc += mBvHierarchy->EvalAbsCost(objects); 
     2034                        triangles += (float)objects.size(); 
    20292035#else 
    2030                         rc += mBvHierarchy->GetRenderCostIncrementially(activeNode); 
     2036                        triangles += mBvHierarchy->GetTriangleSizeIncrementially(activeNode); 
    20312037#endif 
    20322038                        ++ pvsEntries; 
     
    22322238        { 
    22332239                ViewCell *vc = *vit; 
    2234                 float rc = 0; 
    2235          
     2240                 
    22362241#if STUPID_METHOD        
    22372242                ObjectPvs pvs; 
     
    22542259                vc->Mail(); 
    22552260 
     2261                float triangles = 0; 
     2262                int entries = 0; 
     2263 
    22562264                if (useFilter) 
    22572265                { 
    22582266                        const long startT = GetTime(); 
     2267                         
    22592268                        ObjectPvs filteredPvs; 
    2260                         mVspTree->mViewCellsManager->ApplyFilter2(vc, false, 1.0f, filteredPvs); 
     2269                        GetViewCellsManager()->ApplyFilter2(vc, false, 1.0f, filteredPvs); 
     2270 
    22612271                        const long endT = GetTime(); 
    22622272 
    22632273                        //cout << "filter computed in " << TimeDiff(startT, endT) * 1e-3f << " secs" << endl; 
    2264                         ComputePvs(filteredPvs, rc, pvsEntries); 
     2274                         
     2275                        ComputePvs(filteredPvs, triangles, entries); 
    22652276                } 
    22662277                else 
    22672278                { 
    2268                         ComputePvs(vc->GetPvs(), rc, pvsEntries); 
    2269                         vc->SetPvsCost(rc); 
    2270                 } 
    2271  
    2272                 rc *= vc->GetVolume(); 
     2279                        ComputePvs(vc->GetPvs(), triangles, entries); 
     2280                        vc->SetPvsCost(triangles); 
     2281                } 
     2282 
     2283                const float rc = GetViewCellsManager()->ComputeRenderCost((int)triangles, entries) * vc->GetVolume(); 
     2284                 
    22732285                renderCost += rc; 
    2274         } 
    2275  
    2276         renderCost /= mVspTree->mViewCellsManager->GetViewSpaceBox().GetVolume(); 
     2286                pvsEntries += entries; 
     2287        } 
     2288 
     2289        renderCost /= GetViewCellsManager()->GetViewSpaceBox().GetVolume(); 
    22772290        memory = pvsEntries * ObjectPvs::GetEntrySize(); 
    22782291 
     
    22972310                const string filename = string(statsPrefix) + string(str); 
    22982311 
    2299                 mVspTree->mViewCellsManager->EvalViewCellHistogramForPvsSize(filename, viewCells); 
     2312                GetViewCellsManager()->EvalViewCellHistogramForPvsSize(filename, viewCells); 
    23002313 
    23012314                histoUsed = true; 
     
    23222335 
    23232336 
    2324 void HierarchyManager::ExportStats(ofstream &stats,  
    2325                                                                    SplitQueue &tQueue,  
    2326                                                                    const ObjectContainer &objects) 
    2327 { 
    2328         HierarchySubdivisionStats subStats; 
    2329         subStats.Reset(); 
    2330  
    2331         ///////////// 
    2332         //-- initial situation 
    2333  
    2334         subStats.mNumSplits = 0; 
    2335         subStats.mTotalRenderCost = (float)objects.size(); 
    2336         subStats.mEntriesInPvs = 1; 
    2337         subStats.mMemoryCost = (float)ObjectPvs::GetEntrySize(); 
    2338         subStats.mFullMemory = subStats.mMemoryCost; 
    2339         subStats.mViewSpaceSplits = 0; 
    2340         subStats.mObjectSpaceSplits = 0; 
    2341         subStats.mRenderCostDecrease = 0; 
    2342         subStats.Print(stats); 
    2343  
    2344         cout << "exporting vsposp stats ... " << endl; 
    2345  
    2346         //-- go through tree in the order of render cost decrease 
    2347         //-- which is the same order as the view cells were merged 
    2348         //-- or the reverse order of subdivision for subdivision-only  
    2349         //-- view cell hierarchies. 
    2350  
    2351         while (!tQueue.Empty()) 
    2352         { 
    2353                 SubdivisionCandidate *nextCandidate = NextSubdivisionCandidate(tQueue); 
    2354                 bool isLeaf; 
    2355                 int timeStamp; 
    2356                 //float rcDecr;  
    2357                 //int entriesIncr;  
    2358  
    2359                 if (nextCandidate->Type() == SubdivisionCandidate::VIEW_SPACE) 
    2360                 { 
    2361                         timeStamp = (int)-nextCandidate->GetPriority(); 
    2362  
    2363                         VspNode *newNode = mVspTree->SubdivideAndCopy(tQueue, nextCandidate); 
    2364                         VspNode *oldNode = (VspNode *)nextCandidate->mEvaluationHack; 
    2365  
    2366                         isLeaf = newNode->IsLeaf(); 
    2367                         //subStats.mRenderCostDecrease = oldNode->mRenderCostDecr; 
    2368                         //entriesIncr = oldNode->mPvsEntriesIncr; 
    2369                 } 
    2370                 else 
    2371                 { 
    2372                         timeStamp = (int)-nextCandidate->GetPriority(); 
    2373  
    2374                         BvhNode *newNode = mBvHierarchy->SubdivideAndCopy(tQueue, nextCandidate); 
    2375                         BvhNode *oldNode = (BvhNode *)nextCandidate->mEvaluationHack; 
    2376  
    2377                         isLeaf = newNode->IsLeaf(); 
    2378                         //subStats.mRenderCostDecrease = oldNode->mRenderCostDecr; 
    2379                         //entriesIncr = oldNode->mPvsEntriesIncr; 
    2380                 }                
    2381  
    2382                 if (!isLeaf) 
    2383                 { 
    2384                         subStats.mTotalRenderCost -= subStats.mRenderCostDecrease; 
    2385                         //subStats.mEntriesInPvs += entriesIncr; 
    2386  
    2387                         if (nextCandidate->Type() == SubdivisionCandidate::VIEW_SPACE) 
    2388                         { 
    2389                                 ++ subStats.mViewSpaceSplits; 
    2390                                 //cout << "v"; 
    2391                                 //cout << "vsp t: " << timeStamp << " rc: " << rcDecr << " pvs: " << entriesIncr << endl; 
    2392                         } 
    2393                         else 
    2394                         { 
    2395                                 ++ subStats.mObjectSpaceSplits; 
    2396                                 //cout << "o"; 
    2397                                 //"osp t: " << timeStamp << " rc: " << rcDecr << " pvs: " << entriesIncr << endl; 
    2398                         } 
    2399  
    2400                         ++ subStats.mNumSplits; 
    2401  
    2402                         if ((subStats.mNumSplits % 500) == 499) 
    2403                                 cout << subStats.mNumSplits << " steps taken" << endl; 
    2404  
    2405                         subStats.mMemoryCost = (float)subStats.mEntriesInPvs * (float)ObjectPvs::GetEntrySize(); 
    2406                         subStats.mFullMemory = subStats.mMemoryCost; 
    2407  
    2408                         subStats.Print(stats); 
    2409  
    2410                 } 
    2411  
    2412                 DEL_PTR(nextCandidate); 
    2413         } 
    2414  
    2415         stats.close(); 
    2416 } 
    2417  
    2418  
    2419 void HierarchyManager::EvaluateSubdivision(const VssRayContainer &sampleRays, 
    2420                                                                                    const ObjectContainer &objects, 
    2421                                                                                    const string &filename) 
    2422 { 
    2423 #if 0 
    2424         VspTree *oldVspTree = mVspTree; 
    2425         ViewCellsManager *vm = mVspTree->mViewCellsManager; 
    2426         BvHierarchy *oldHierarchy = mBvHierarchy; 
    2427  
    2428         mBvHierarchy = new BvHierarchy(); 
    2429         mBvHierarchy->mHierarchyManager = this; 
    2430         mBvHierarchy->mViewCellsManager = vm; 
    2431  
    2432         mVspTree = new VspTree(); 
    2433         mVspTree->mHierarchyManager = this; 
    2434         mVspTree->mViewCellsManager = vm; 
    2435  
    2436         // create first nodes 
    2437         mVspTree->Initialise(sampleRays, &oldVspTree->mBoundingBox); 
    2438         InitialiseObjectSpaceSubdivision(objects); 
    2439  
    2440         const long startTime = GetTime(); 
    2441         cout << "Constructing evaluation hierarchies ... \n"; 
    2442          
    2443         ofstream stats; 
    2444         stats.open(filename.c_str()); 
    2445         SplitQueue tQueue; 
    2446  
    2447         BvhNode *oldBvhRoot = oldHierarchy->GetRoot(); 
    2448         VspNode *oldVspRoot = oldVspTree->GetRoot(); 
    2449  
    2450         RayInfoContainer *viewSpaceRays = new RayInfoContainer(); 
    2451          
    2452         SubdivisionCandidate *firstVsp = mVspTree->PrepareConstruction(sampleRays, *viewSpaceRays); 
    2453         tQueue.Push(firstVsp); 
    2454  
    2455         mBvHierarchy->PrepareConstruction(tQueue, sampleRays, objects); 
    2456  
    2457     firstVsp->mEvaluationHack = oldVspRoot; 
    2458         firstBvh->mEvaluationHack = oldBvhRoot; 
    2459  
    2460         firstVsp->SetPriority((float)-oldVspRoot->mTimeStamp); 
    2461         firstBvh->SetPriority((float)-oldBvhRoot->GetTimeStamp()); 
    2462          
    2463         ExportStats(stats, tQueue, objects); 
    2464  
    2465         cout << "\nfinished in " << TimeDiff(startTime, GetTime()) * 1e-3 << " secs" << endl; 
    2466         RemoveRayRefs(objects); 
    2467  
    2468         // view cells needed only for evaluation 
    2469         ViewCellContainer viewCells; 
    2470         mVspTree->CollectViewCells(viewCells, false); 
    2471          
    2472         // helper trees can be destroyed 
    2473         DEL_PTR(mVspTree); 
    2474         DEL_PTR(mBvHierarchy); 
    2475  
    2476         CLEAR_CONTAINER(viewCells); 
    2477  
    2478         // reset hierarchies 
    2479         mVspTree = oldVspTree; 
    2480         mBvHierarchy = oldHierarchy; 
    2481  
    2482         // reinstall old bv refs 
    2483         vector<BvhLeaf *> leaves; 
    2484         mBvHierarchy->CollectLeaves(mBvHierarchy->GetRoot(), leaves); 
    2485         vector<BvhLeaf *>::const_iterator bit, bit_end = leaves.end(); 
    2486  
    2487         for (bit = leaves.begin(); bit != bit_end; ++ bit) 
    2488         { 
    2489                 mBvHierarchy->AssociateObjectsWithLeaf(*bit); 
    2490         } 
    2491 #endif 
    2492 } 
    2493  
    2494  
    2495 void HierarchyManager::EvaluateSubdivision2(ofstream &splitsStats, 
    2496                                                                                         const int splitsStepSize, 
    2497                                                                                         const bool useFilter, 
    2498                                                                                         const bool useHisto, 
    2499                                                                                         const int histoMem, 
    2500                                                                                         const int pass) 
     2337 
     2338void HierarchyManager::EvaluateSubdivision(ofstream &splitsStats, 
     2339                                                                                   const int splitsStepSize, 
     2340                                                                                   const bool useFilter, 
     2341                                                                                   const bool useHisto, 
     2342                                                                                   const int histoMem, 
     2343                                                                                   const int pass) 
    25012344{ 
    25022345        vector<HierarchySubdivisionStats> subStatsContainer; 
     
    26452488        if (!mTraversalTree) 
    26462489        { 
    2647                 return mVspTree->CastLineSegment(origin,termination, viewcells, useMailboxing); 
     2490                return mVspTree->CastLineSegment(origin, termination, viewcells, useMailboxing); 
    26482491        } 
    26492492        else 
    26502493        { 
    2651                 return mTraversalTree->CastLineSegment(origin,termination, viewcells, useMailboxing); 
    2652         } 
    2653 } 
    2654  
    2655  
    2656 } 
     2494                return mTraversalTree->CastLineSegment(origin, termination, viewcells, useMailboxing); 
     2495        } 
     2496} 
     2497 
     2498 
     2499ViewCellsManager *HierarchyManager::GetViewCellsManager()  
     2500{ 
     2501        return mVspTree->mViewCellsManager; 
     2502} 
     2503 
     2504 
     2505} 
Note: See TracChangeset for help on using the changeset viewer.