Changeset 1633 for GTP/trunk/Lib/Vis/Preprocessing/src/HierarchyManager.cpp
- Timestamp:
- 10/17/06 20:32:06 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Vis/Preprocessing/src/HierarchyManager.cpp
r1632 r1633 113 113 mSubdivisionStats.open(subdivisionStatsLog); 114 114 115 //mMinRenderCostDecrease = -1; 115 Environment::GetSingleton()->GetBoolValue( 116 "Hierarchy.Construction.recomputeSplitPlaneOnRepair", mRecomputeSplitPlaneOnRepair); 116 117 117 118 Debug << "******** Hierachy Manager Parameters ***********" << endl; … … 122 123 Debug << "repair queue: " << mRepairQueue << endl; 123 124 Debug << "number of multilevels: " << mNumMultiLevels << endl; 125 Debug << "recompute split plane on repair: " << mRecomputeSplitPlaneOnRepair << endl; 124 126 125 127 switch (mConstructionType) … … 259 261 (0 260 262 || (mHierarchyStats.Leaves() >= mTermMaxLeaves) 261 || (mHierarchyStats.mGlobalCostMisses >= mTermGlobalCostMissTolerance)263 //|| (mHierarchyStats.mGlobalCostMisses >= mTermGlobalCostMissTolerance) 262 264 || (candidate->GlobalTerminationCriteriaMet()) 263 265 //|| (mHierarchyStats.mRenderCostDecrease < mMinRenderCostDecrease) … … 316 318 // compute view space bounding box 317 319 mVspTree->ComputeBoundingBox(sampleRays, forcedViewSpace); 320 321 SplitQueue objectSpaceQueue; 322 SplitQueue viewSpaceQueue; 318 323 319 324 // use sah for evaluating osp tree construction … … 324 329 mSavedObjectSpaceSubdivisionType = mObjectSpaceSubdivisionType; 325 330 326 SplitQueue objectSpaceQueue;327 SplitQueue viewSpaceQueue;328 329 331 // number of initial splits 330 332 int maxSteps = 200; 331 333 float renderCostDecr = 0; 334 335 SubdivisionCandidate *osc = 336 PrepareObjectSpaceSubdivision(sampleRays, objects); 337 338 objectSpaceQueue.Push(osc); 339 340 ///////////////////////// 341 // calulcate initial object space splits 342 343 SubdivisionCandidateContainer dirtyVspList; 344 345 // subdivide object space first 346 // for first round, use sah splits. Once view space partition 347 // has started, use render cost heuristics instead 348 const int ospSteps = 349 RunConstruction(objectSpaceQueue, dirtyVspList, renderCostDecr, maxSteps); 350 351 cout << ospSteps << " object space partition steps taken" << endl; 352 353 SubdivisionCandidate *vsc = 354 PrepareViewSpaceSubdivision(sampleRays, objects); 355 356 viewSpaceQueue.Push(vsc); 357 358 // view space subdivision was constructed 359 mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 360 361 // don't terminate on max steps 362 //maxSteps = mTermMaxLeaves; 332 363 333 364 // This method subdivides view space / object space … … 337 368 // and vice versa until iteration depth is reached. 338 369 339 while (1) 340 { 341 // subdivide object space first 342 // for first round, use sah splits. Once view space partition 343 // has started, use render cost heuristics instead 344 SubdivisionCandidate *osc = 345 ResetObjectSpaceSubdivision(sampleRays, objects); 346 objectSpaceQueue.Push(osc); 347 348 // process object space candidates using render queue for 349 // objects until slope of previous subdivision is reached 350 SubdivisionCandidateContainer ospContainer; 351 352 const int ospSteps = 353 RunConstruction(objectSpaceQueue, ospContainer, renderCostDecr, maxSteps); 354 cout << ospSteps << " object space partition steps taken" << endl; 355 356 // use splits of one kind until rendercost slope is reached 357 renderCostDecr = mHierarchyStats.mRenderCostDecrease; 370 while (!(viewSpaceQueue.Empty() && objectSpaceQueue.Empty())) 371 { 372 // should view or object space be subdivided further? 373 if (viewSpaceQueue.Empty() || 374 (!objectSpaceQueue.Empty() && 375 (objectSpaceQueue.Top()->GetPriority() > viewSpaceQueue.Top()->GetPriority()))) 376 { 377 // use splits of one kind until rendercost slope is reached 378 renderCostDecr = mHierarchyStats.mRenderCostDecrease; 379 380 // dirtied view space candidates 381 SubdivisionCandidateContainer dirtyVspList; 382 383 // subdivide object space first 384 // for first round, use sah splits. Once view space partition 385 // has started, use render cost heuristics instead 386 const int ospSteps = 387 RunConstruction(objectSpaceQueue, dirtyVspList, renderCostDecr, maxSteps); 388 389 cout << ospSteps << " object space partition steps taken" << endl; 358 390 359 // object space subdivision constructed 360 mObjectSpaceSubdivisionType = mSavedObjectSpaceSubdivisionType; 361 362 /// Repair split queue 363 cout << "repairing queue ... " << endl; 364 365 vector<SubdivisionCandidate *> dirtyList; 366 367 CollectDirtyCandidates(ospContainer, dirtyList); 368 //RepairQueue(dirtyList, viewSpaceQueue); 369 370 cout << "finished repairing queue ... " << endl; 371 372 CLEAR_CONTAINER(ospContainer); 373 374 ///////////////// 375 // subdivide view space with respect to the objects 376 377 SubdivisionCandidate *vsc = 378 ResetViewSpaceSubdivision(sampleRays, objects); 379 viewSpaceQueue.Push(vsc); 380 381 SubdivisionCandidateContainer vspContainer; 382 // process view space candidates 383 const int vspSteps = 384 RunConstruction(viewSpaceQueue, vspContainer, renderCostDecr, maxSteps); 385 386 cout << vspSteps << " view space partition steps taken" << endl; 387 388 // view space subdivision constructed 389 mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 390 391 // use splits of one kind until rendercost slope is reached 392 renderCostDecr = mHierarchyStats.mRenderCostDecrease; 393 394 /// Repair split queue 395 cout << "repairing queue ... " << endl; 396 397 CollectDirtyCandidates(vspContainer, dirtyList); 398 //RepairQueue(dirtyList, objectSpaceQueue); 399 400 cout << "finished repairing queue ... " << endl; 401 402 CLEAR_CONTAINER(vspContainer); 403 } 404 391 // object space subdivision constructed 392 mObjectSpaceSubdivisionType = mSavedObjectSpaceSubdivisionType; 393 394 /// Repair split queue 395 cout << "repairing queue ... " << endl; 396 RepairQueue(dirtyVspList, viewSpaceQueue, true); 397 cout << "repaired " << dirtyVspList.size() << " candidates" << endl; 398 } 399 else 400 { 401 // use splits of one kind until rendercost slope is reached 402 renderCostDecr = mHierarchyStats.mRenderCostDecrease; 403 404 ///////////////// 405 // subdivide view space with respect to the objects 406 407 SubdivisionCandidateContainer dirtyOspList; 408 409 // process view space candidates 410 const int vspSteps = 411 RunConstruction(viewSpaceQueue, dirtyOspList, renderCostDecr, maxSteps); 412 413 cout << vspSteps << " view space partition steps taken" << endl; 414 415 // view space subdivision constructed 416 mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 417 418 /// Repair split queue 419 cout << "repairing queue ... " << endl; 420 RepairQueue(dirtyOspList, objectSpaceQueue, true); 421 cout << "repaired " << dirtyOspList.size() << " candidates" << endl; 422 } 423 } 424 405 425 cout << "\nfinished in " << TimeDiff(startTime, GetTime()) * 1e-3 << " secs" << endl; 406 426 … … 432 452 mVspTree->ComputeBoundingBox(sampleRays, forcedViewSpace); 433 453 434 // use objects for evaluating vsp tree construction in the first levels435 // of the subdivision454 // use objects for evaluating vsp tree construction in the 455 // first levels of the subdivision 436 456 mSavedObjectSpaceSubdivisionType = mObjectSpaceSubdivisionType; 437 457 mObjectSpaceSubdivisionType = NO_OBJ_SUBDIV; … … 557 577 const bool repairQueue) 558 578 { 559 // test if global termination criteria were met before this split560 579 const bool terminationCriteriaMet = GlobalTerminationCriteriaMet(sc); 561 const bool vspSplit = (sc->Type() == SubdivisionCandidate::VIEW_SPACE); 562 563 bool success = false; 564 565 switch (sc->Type()) 566 { 567 case SubdivisionCandidate::VIEW_SPACE: 568 { 569 VspNode *n = mVspTree->Subdivide(splitQueue, sc, terminationCriteriaMet); 570 571 // check if terminated 572 success = !n->IsLeaf(); 573 } 574 break; 575 case SubdivisionCandidate::OBJECT_SPACE: 576 { 577 if (mObjectSpaceSubdivisionType == KD_BASED_OBJ_SUBDIV) 578 { 579 KdNode *n = mOspTree->Subdivide(splitQueue, sc, terminationCriteriaMet); 580 581 // local or global termination criteria failed 582 success = !n->IsLeaf(); 583 } 584 else if (mObjectSpaceSubdivisionType == BV_BASED_OBJ_SUBDIV) 585 { 586 BvhNode *n = mBvHierarchy->Subdivide(splitQueue, sc, terminationCriteriaMet); 587 588 // local or global termination criteria failed 589 success = !n->IsLeaf(); 590 } 591 } 592 break; 593 default: 594 cerr << "unknown subdivision type" << endl; 595 break; 596 } 580 581 const bool success = sc->Apply(splitQueue, terminationCriteriaMet); 597 582 598 583 if (!success) // split was not taken … … 635 620 // this would be object space splits and other way round 636 621 vector<SubdivisionCandidate *> dirtyList; 637 CollectDirtyCandidates(sc, dirtyList);638 639 RepairQueue(dirtyList, splitQueue );622 sc->CollectDirtyCandidates(dirtyList, false); 623 624 RepairQueue(dirtyList, splitQueue, mRecomputeSplitPlaneOnRepair); 640 625 } 641 626 … … 766 751 //////// 767 752 //-- subdivide leaf node of either type 768 769 753 ApplySubdivisionCandidate(sc, mTQueue, repairQueue); 770 771 754 DEL_PTR(sc); 772 755 } … … 775 758 776 759 int HierarchyManager::RunConstruction(SplitQueue &splitQueue, 777 SubdivisionCandidateContainer & chosenCandidates,760 SubdivisionCandidateContainer &dirtyCandidates, 778 761 const float minRenderCostDecr, 779 762 const int maxSteps) 780 763 { 781 764 int steps = 0; 765 SubdivisionCandidate::NewMail(); 782 766 783 767 // main loop 784 while (!splitQueue.Empty() && ( (steps ++)< maxSteps))768 while (!splitQueue.Empty() && (steps < maxSteps)) 785 769 { 786 770 SubdivisionCandidate *sc = NextSubdivisionCandidate(splitQueue); 787 771 788 772 // minimum slope reached 789 if (sc->GetRenderCostDecrease() < minRenderCostDecr) 790 break; 773 //if (sc->GetRenderCostDecrease() < minRenderCostDecr) break; 791 774 792 775 //////// … … 794 777 795 778 const bool repairQueue = false; 796 bool success = ApplySubdivisionCandidate(sc, splitQueue, repairQueue);779 const bool success = ApplySubdivisionCandidate(sc, splitQueue, repairQueue); 797 780 798 781 if (success) 799 782 { 800 chosenCandidates.push_back(sc); 783 sc->CollectDirtyCandidates(dirtyCandidates, true); 784 //cout << "collected " << dirtyCandidates.size() << "dirty candidates" << endl; 785 ++ steps; 801 786 } 802 787 } … … 826 811 827 812 firstCandidate = mBvHierarchy->Reset(sampleRays, objects); 828 cout << "here4" << endl;813 829 814 mHierarchyStats.mTotalCost = mBvHierarchy->mTotalCost; 830 815 … … 835 820 // evaluate stats before first subdivision 836 821 EvalSubdivisionStats(); 837 cout << "here5" << endl;838 822 } 839 823 break; … … 845 829 break; 846 830 } 847 cout << "here6" << endl; 831 848 832 return firstCandidate; 849 833 } … … 990 974 991 975 992 void HierarchyManager::CollectObjectSpaceDirtyList(SubdivisionCandidate *sc,993 SubdivisionCandidateContainer &dirtyList)994 {995 switch (mObjectSpaceSubdivisionType)996 {997 case KD_BASED_OBJ_SUBDIV:998 {999 OspTree::OspSubdivisionCandidate *ospSc =1000 dynamic_cast<OspTree::OspSubdivisionCandidate *>(sc);1001 1002 mOspTree->CollectDirtyCandidates(ospSc, dirtyList);1003 break;1004 }1005 case BV_BASED_OBJ_SUBDIV:1006 {1007 BvHierarchy::BvhSubdivisionCandidate *bvhSc =1008 dynamic_cast<BvHierarchy::BvhSubdivisionCandidate *>(sc);1009 1010 mBvHierarchy->CollectDirtyCandidates(bvhSc, dirtyList);1011 break;1012 }1013 default:1014 break;1015 }1016 }1017 1018 1019 void HierarchyManager::CollectViewSpaceDirtyList(SubdivisionCandidate *sc,1020 SubdivisionCandidateContainer &dirtyList)1021 {1022 VspTree::VspSubdivisionCandidate *vspSc =1023 dynamic_cast<VspTree::VspSubdivisionCandidate *>(sc);1024 1025 mVspTree->CollectDirtyCandidates(vspSc, dirtyList);1026 }1027 1028 1029 void HierarchyManager::CollectDirtyCandidates(SubdivisionCandidate *sc,1030 SubdivisionCandidateContainer &dirtyList)1031 {1032 // we have either a object space or view space split1033 if (sc->Type() == SubdivisionCandidate::VIEW_SPACE)1034 {1035 CollectViewSpaceDirtyList(sc, dirtyList);1036 }1037 else // object space split1038 {1039 CollectObjectSpaceDirtyList(sc, dirtyList);1040 }1041 }1042 1043 1044 976 void HierarchyManager::CollectDirtyCandidates(const SubdivisionCandidateContainer &chosenCandidates, 1045 977 SubdivisionCandidateContainer &dirtyList) 1046 978 { 1047 979 SubdivisionCandidateContainer::const_iterator sit, sit_end = chosenCandidates.end(); 980 SubdivisionCandidate::NewMail(); 1048 981 1049 982 for (sit = chosenCandidates.begin(); sit != sit_end; ++ sit) 1050 983 { 1051 // we have either a object space or view space split 1052 if ((*sit)->Type() == SubdivisionCandidate::VIEW_SPACE) 1053 { 1054 CollectViewSpaceDirtyList(*sit, dirtyList); 1055 } 1056 else // object space split 1057 { 1058 CollectObjectSpaceDirtyList(*sit, dirtyList); 1059 } 1060 } 1061 } 1062 1063 1064 void HierarchyManager::RepairQueue(const vector<SubdivisionCandidate *> &dirtyList, 1065 SplitQueue &splitQueue) 984 (*sit)->CollectDirtyCandidates(dirtyList, true); 985 } 986 } 987 988 989 void HierarchyManager::RepairQueue(const SubdivisionCandidateContainer &dirtyList, 990 SplitQueue &splitQueue, 991 const bool recomputeSplitPlaneOnRepair) 1066 992 { 1067 993 // for each update of the view space partition: … … 1097 1023 1098 1024 splitQueue.Erase(sc); // erase from queue 1099 sc->EvalPriority( ); // reevaluate1025 sc->EvalPriority(recomputeSplitPlaneOnRepair); // reevaluate 1100 1026 1101 1027 #ifdef _DEBUG … … 1113 1039 mHierarchyStats.mRepairTime += timeDiff; 1114 1040 1115 if ( 1) cout << "repaired in " << timeDiff * 1e-3f << " secs" << endl;1041 if (0) cout << "repaired in " << timeDiff * 1e-3f << " secs" << endl; 1116 1042 } 1117 1043
Note: See TracChangeset
for help on using the changeset viewer.