Changeset 2332 for GTP/trunk/Lib/Vis/Preprocessing/src/HierarchyManager.cpp
- Timestamp:
- 04/23/07 16:19:30 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Vis/Preprocessing/src/HierarchyManager.cpp
r2237 r2332 304 304 305 305 306 void HierarchyManager:: EvalSubdivisionStats()306 void HierarchyManager::PrintSubdivisionStats() 307 307 { 308 308 … … 492 492 493 493 // create first nodes 494 mVspTree->Initialise(sampleRays, forcedViewSpace );494 mVspTree->Initialise(sampleRays, forcedViewSpace, objects); 495 495 InitialiseObjectSpaceSubdivision(objects); 496 496 497 497 // 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 499 500 // only one entry for start 500 501 mHierarchyStats.mPvsEntries = 1; 501 502 mHierarchyStats.mMemory = (float)ObjectPvs::GetEntrySizeByte(); 502 503 503 EvalSubdivisionStats();504 PrintSubdivisionStats(); 504 505 Debug << "setting total cost to " << mHierarchyStats.mTotalCost << endl; 505 506 … … 678 679 mHierarchyStats.mPvsEntries = 1; 679 680 mHierarchyStats.mMemory = (float)ObjectPvs::GetEntrySizeByte(); 680 mHierarchyStats.mTotalCost = (float)objects.size();681 mHierarchyStats.mTotalCost = GetViewCellsManager()->ComputeRenderCost(objects.size(), 1); 681 682 682 683 mHierarchyStats.mRenderCostDecrease = 0; 683 684 684 EvalSubdivisionStats();685 PrintSubdivisionStats(); 685 686 Debug << "setting total cost to " << mHierarchyStats.mTotalCost << endl; 686 687 … … 689 690 690 691 // create only roots 691 mVspTree->Initialise(sampleRays, forcedViewSpace );692 mVspTree->Initialise(sampleRays, forcedViewSpace, objects); 692 693 InitialiseObjectSpaceSubdivision(objects); 693 694 … … 745 746 //-- new stats 746 747 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 } 749 753 } 750 754 … … 960 964 961 965 // output stats 962 EvalSubdivisionStats();966 PrintSubdivisionStats(); 963 967 964 968 return true; … … 1223 1227 1224 1228 // evaluate stats before first subdivision 1225 EvalSubdivisionStats();1229 PrintSubdivisionStats(); 1226 1230 cout << "finished bv hierarchy preparation" << endl; 1227 1231 } … … 1241 1245 AxisAlignedBox3 *forcedViewSpace) 1242 1246 { 1243 ViewCellsManager *vm = mVspTree->mViewCellsManager;1247 ViewCellsManager *vm = GetViewCellsManager(); 1244 1248 1245 1249 // HACK: rather not destroy vsp tree … … 1250 1254 mVspTree->mViewCellsManager = vm; 1251 1255 1252 mVspTree->Initialise(sampleRays, forcedViewSpace); 1256 mVspTree->Initialise(sampleRays, forcedViewSpace, objects); 1257 1253 1258 1254 1259 ////////// 1255 1260 //-- reset stats 1261 1256 1262 mHierarchyStats.mNodes = GetObjectSpaceSubdivisionNodes(); 1257 1263 //-mVspTree->mVspStats.nodes + 1; … … 1266 1272 1267 1273 // evaluate new stats before first subdivsiion 1268 EvalSubdivisionStats();1274 PrintSubdivisionStats(); 1269 1275 } 1270 1276 … … 1278 1284 mHierarchyStats.mNodes = 2; 1279 1285 1280 mHierarchyStats.mTotalCost = (float)objects.size();1286 mHierarchyStats.mTotalCost = GetViewCellsManager()->ComputeRenderCost(objects.size(), 1); 1281 1287 Debug << "setting total cost to " << mHierarchyStats.mTotalCost << endl; 1282 1288 … … 1285 1291 1286 1292 // initialise view / object space 1287 mVspTree->Initialise(sampleRays, forcedViewSpace );1293 mVspTree->Initialise(sampleRays, forcedViewSpace, objects); 1288 1294 InitialiseObjectSpaceSubdivision(objects); 1289 1295 … … 1987 1993 1988 1994 void HierarchyManager::ComputePvs(const ObjectPvs &pvs, 1989 float & rc,1995 float &triangles, 1990 1996 int &pvsEntries) 1991 1997 { … … 2026 2032 ObjectContainer objects; 2027 2033 activeNode->CollectObjects(objects); 2028 rc += mBvHierarchy->EvalAbsCost(objects);2034 triangles += (float)objects.size(); 2029 2035 #else 2030 rc += mBvHierarchy->GetRenderCostIncrementially(activeNode);2036 triangles += mBvHierarchy->GetTriangleSizeIncrementially(activeNode); 2031 2037 #endif 2032 2038 ++ pvsEntries; … … 2232 2238 { 2233 2239 ViewCell *vc = *vit; 2234 float rc = 0; 2235 2240 2236 2241 #if STUPID_METHOD 2237 2242 ObjectPvs pvs; … … 2254 2259 vc->Mail(); 2255 2260 2261 float triangles = 0; 2262 int entries = 0; 2263 2256 2264 if (useFilter) 2257 2265 { 2258 2266 const long startT = GetTime(); 2267 2259 2268 ObjectPvs filteredPvs; 2260 mVspTree->mViewCellsManager->ApplyFilter2(vc, false, 1.0f, filteredPvs); 2269 GetViewCellsManager()->ApplyFilter2(vc, false, 1.0f, filteredPvs); 2270 2261 2271 const long endT = GetTime(); 2262 2272 2263 2273 //cout << "filter computed in " << TimeDiff(startT, endT) * 1e-3f << " secs" << endl; 2264 ComputePvs(filteredPvs, rc, pvsEntries); 2274 2275 ComputePvs(filteredPvs, triangles, entries); 2265 2276 } 2266 2277 else 2267 2278 { 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 2273 2285 renderCost += rc; 2274 } 2275 2276 renderCost /= mVspTree->mViewCellsManager->GetViewSpaceBox().GetVolume(); 2286 pvsEntries += entries; 2287 } 2288 2289 renderCost /= GetViewCellsManager()->GetViewSpaceBox().GetVolume(); 2277 2290 memory = pvsEntries * ObjectPvs::GetEntrySize(); 2278 2291 … … 2297 2310 const string filename = string(statsPrefix) + string(str); 2298 2311 2299 mVspTree->mViewCellsManager->EvalViewCellHistogramForPvsSize(filename, viewCells);2312 GetViewCellsManager()->EvalViewCellHistogramForPvsSize(filename, viewCells); 2300 2313 2301 2314 histoUsed = true; … … 2322 2335 2323 2336 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 2338 void HierarchyManager::EvaluateSubdivision(ofstream &splitsStats, 2339 const int splitsStepSize, 2340 const bool useFilter, 2341 const bool useHisto, 2342 const int histoMem, 2343 const int pass) 2501 2344 { 2502 2345 vector<HierarchySubdivisionStats> subStatsContainer; … … 2645 2488 if (!mTraversalTree) 2646 2489 { 2647 return mVspTree->CastLineSegment(origin, termination, viewcells, useMailboxing);2490 return mVspTree->CastLineSegment(origin, termination, viewcells, useMailboxing); 2648 2491 } 2649 2492 else 2650 2493 { 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 2499 ViewCellsManager *HierarchyManager::GetViewCellsManager() 2500 { 2501 return mVspTree->mViewCellsManager; 2502 } 2503 2504 2505 }
Note: See TracChangeset
for help on using the changeset viewer.