Ignore:
Timestamp:
07/10/06 19:21:19 (18 years ago)
Author:
bittner
Message:

Merge with Olivers code

File:
1 edited

Legend:

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

    r1027 r1112  
    2323static bool fromBoxVisibility = false; 
    2424 
    25  
     25#define ADD_RAYS_IN_PLACE 0 
     26   
    2627RssPreprocessor::RssPreprocessor(): 
    2728  mPass(0), 
     
    6768          GenerateImportanceRays(mRssTree, number, rays); 
    6869          result = true; 
    69           //      rays.NormalizePdf(); 
    7070        } 
    7171        break; 
     
    7575  } 
    7676 
     77  //  rays.NormalizePdf(); 
     78   
    7779  return result; 
    7880} 
     
    120122  int hits = 0; 
    121123  static Ray ray; 
    122   AxisAlignedBox3 box = mKdTree->GetBox(); 
     124  //  AxisAlignedBox3 box = Union(mKdTree->GetBox(), mViewCellsManager->GetViewSpaceBox()); 
     125 
     126  AxisAlignedBox3 box = mViewCellsManager->GetViewSpaceBox(); 
    123127 
    124128  AxisAlignedBox3 sbox = box; 
     
    284288  } else { 
    285289        int leaves = rssTree->stat.Leaves()/1; 
     290         
    286291        num = rssTree->GenerateRays(desiredSamples, leaves, rays); 
    287292  } 
     
    302307  Exporter *exporter = NULL; 
    303308  exporter = Exporter::GetExporter(filename); 
    304   //    exporter->SetWireframe(); 
    305   //    exporter->ExportKdTree(*mKdTree); 
     309  if (0) { 
     310        exporter->SetWireframe(); 
     311        exporter->ExportKdTree(*mKdTree); 
     312  } 
    306313  exporter->SetFilled(); 
    307314  // $$JB temporarily do not export the scene 
     
    310317  exporter->SetWireframe(); 
    311318 
    312   if (mViewSpaceBox) { 
     319  if (1 || mViewSpaceBox) { 
    313320        exporter->SetForcedMaterial(RgbColor(1,0,1)); 
    314         exporter->ExportBox(*mViewSpaceBox); 
     321        exporter->ExportBox(mViewCellsManager->GetViewSpaceBox()); 
    315322        exporter->ResetForcedMaterial(); 
    316323  } 
    317          
     324   
    318325  VssRayContainer rays; 
    319326   
    320   vssRays.SelectRays( number, rays); 
     327  vssRays.SelectRays(number, rays); 
    321328 
    322329  exporter->ExportRays(rays, RgbColor(1, 0, 0)); 
     330         
     331  delete exporter; 
     332 
     333  cout<<"done."<<endl<<flush; 
     334 
     335  return true; 
     336} 
     337 
     338bool 
     339RssPreprocessor::ExportRayAnimation(const char *filename, 
     340                                                                        const vector<VssRayContainer> &vssRays 
     341                                                                        ) 
     342{ 
     343  cout<<"Exporting vss rays..."<<endl<<flush; 
     344         
     345  Exporter *exporter = NULL; 
     346  exporter = Exporter::GetExporter(filename); 
     347  if (0) { 
     348        exporter->SetWireframe(); 
     349        exporter->ExportKdTree(*mKdTree); 
     350  } 
     351  exporter->SetFilled(); 
     352  // $$JB temporarily do not export the scene 
     353  if (1) 
     354        exporter->ExportScene(mSceneGraph->mRoot); 
     355  exporter->SetWireframe(); 
     356 
     357  if (1 || mViewSpaceBox) { 
     358        exporter->SetForcedMaterial(RgbColor(1,0,1)); 
     359        exporter->ExportBox(mViewCellsManager->GetViewSpaceBox()); 
     360        exporter->ResetForcedMaterial(); 
     361  } 
     362   
     363  exporter->ExportRaySets(vssRays, RgbColor(1, 0, 0)); 
    323364         
    324365  delete exporter; 
     
    459500} 
    460501 
    461  
     502void 
     503NormalizeRatios(float ratios[3]) 
     504{ 
     505  int i; 
     506  float sumRatios; 
     507  sumRatios = ratios[0] + ratios[1] + ratios[2]; 
     508  if (sumRatios == 0.0f) { 
     509        ratios[0] = ratios[1] = ratios[2] = 1.0f; 
     510        sumRatios = 3.0f; 
     511  } 
     512   
     513  for (i=0 ; i < 3; i++) 
     514        ratios[i]/=sumRatios; 
     515#define MIN_RATIO 0.03f 
     516  for (i=0 ; i < 3; i++) 
     517        if (ratios[i] < MIN_RATIO) 
     518          ratios[i] = MIN_RATIO; 
     519 
     520  sumRatios = ratios[0] + ratios[1] + ratios[2]; 
     521  for (i=0 ; i < 3; i++) 
     522        ratios[i]/=sumRatios; 
     523   
     524} 
    462525 
    463526bool 
     
    472535  Randomize(0); 
    473536   
    474          
     537  vector<VssRayContainer> rayBuffer(50); 
     538   
    475539  long startTime = GetTime(); 
    476540   
     
    480544 
    481545  // if not already loaded, construct view cells from file 
    482   if (!mLoadViewCells) {         
    483  
    484         if (0)  
     546  if (!mLoadViewCells) 
     547  { 
     548        if (1)  
    485549          mViewCellsManager->SetViewSpaceBox(mKdTree->GetBox()); 
    486550        else { 
    487551          AxisAlignedBox3 box = mKdTree->GetBox(); 
    488           float s = box.Size(0); 
    489           box.Scale(0.1f); 
    490           box.SetMin(0, box.Min(0) + s); 
    491           box.SetMax(0, box.Max(0) + s); 
     552           
     553          if (1) { 
     554                // use a small box outside of the scene 
     555                box.Scale(Vector3(0.1f,0.5f,0.5f)); 
     556                box.Translate(Vector3(Magnitude(mKdTree->GetBox().Size())*0.5, 0, 0)); 
     557          } else { 
     558                float s = box.Size(0); 
     559                box.Scale(0.1f); 
     560                box.SetMin(0, box.Min(0) + s); 
     561                box.SetMax(0, box.Max(0) + s); 
     562          } 
    492563          
    493564          mViewCellsManager->SetViewSpaceBox(box); 
    494565        } 
    495  
    496           // construct view cells using it's own set of samples 
    497           mViewCellsManager->Construct(this); 
    498  
    499           //-- several visualizations and statistics 
    500           Debug << "view cells construction finished: " << endl; 
    501           mViewCellsManager->PrintStatistics(Debug); 
    502   } 
    503  
    504  
     566         
     567        // construct view cells using it's own set of samples 
     568        mViewCellsManager->Construct(this); 
     569         
     570        //-- several visualizations and statistics 
     571        Debug << "view cells construction finished: " << endl; 
     572        mViewCellsManager->PrintStatistics(Debug); 
     573  } 
     574   
     575   
    505576  int rssPass = 0; 
    506577  int rssSamples = 0; 
     
    515586        cout<<"Generating initial rays..."<<endl<<flush; 
    516587 
    517         GenerateRays(mInitialSamples/4, SPATIAL_BOX_BASED_DISTRIBUTION, rays); 
    518         GenerateRays(mInitialSamples/4, OBJECT_BASED_DISTRIBUTION, rays); 
    519         GenerateRays(mInitialSamples/4, DIRECTION_BASED_DISTRIBUTION, rays); 
    520         GenerateRays(mInitialSamples/4, OBJECT_DIRECTION_BASED_DISTRIBUTION, rays); 
    521          
     588        GenerateRays(mInitialSamples/3, SPATIAL_BOX_BASED_DISTRIBUTION, rays); 
     589        GenerateRays(mInitialSamples/3, OBJECT_BASED_DISTRIBUTION, rays); 
     590        GenerateRays(mInitialSamples/3, DIRECTION_BASED_DISTRIBUTION, rays); 
     591        //      GenerateRays(mInitialSamples/4, OBJECT_DIRECTION_BASED_DISTRIBUTION, rays); 
     592 
    522593        cout<<"Casting initial rays..."<<endl<<flush; 
    523594        CastRays(rays, mVssRays); 
     
    537608        sprintf(filename, "rss-rays-initial.x3d"); 
    538609        ExportRays(filename, mVssRays, mExportNumRays); 
     610 
     611        mVssRays.SelectRays(mExportNumRays, rayBuffer[0], true); 
    539612         
    540613  } 
     
    562635        { 
    563636          VssRayContainer contributingRays; 
    564           mVssRays.GetContributingRays(contributingRays, mPass); 
     637          mVssRays.GetContributingRays(contributingRays, 0); 
    565638          mStats<<"#NUM_CONTRIBUTING_RAYS\n"<<(int)contributingRays.size()<<endl; 
     639          if (mExportRays) { 
     640                char filename[64]; 
     641                sprintf(filename, "rss-crays-%04d.x3d", 0); 
     642                ExportRays(filename, contributingRays, mExportNumRays); 
     643          } 
    566644        } 
    567645         
     
    615693          VssRayContainer tmpVssRays; 
    616694 
    617           float ratios[] = {0.8f,0.1f,0.1f}; 
    618  
     695          static float ratios[] = {0.9f,0.05f,0.05f}; 
     696          //float ratios[] = {1.0f,0.0f,0.0f}; 
     697           
     698          int nrays[3]; 
     699          float contributions[3]; 
     700          float times[3]; 
     701           
     702          long t1, t2; 
     703 
     704          t1 = GetTime(); 
     705           
    619706          GenerateRays(mRssSamplesPerPass*ratios[0], RSS_BASED_DISTRIBUTION, rays); 
     707 
     708          rays.NormalizePdf(rays.size()); 
     709           
    620710          CastRays(rays, tmpVssRays); 
    621711          castRays += rays.size(); 
    622           float c1 = mViewCellsManager->ComputeSampleContributions(tmpVssRays, false, true); 
    623           mStats<<"#RssRelContrib"<<endl<<c1/rays.size()<<endl; 
    624  
     712#if ADD_RAYS_IN_PLACE  
     713          contributions[0] = mViewCellsManager->ComputeSampleContributions(tmpVssRays, true, false); 
     714#else 
     715          contributions[0] = mViewCellsManager->ComputeSampleContributions(tmpVssRays, false, true); 
     716#endif 
     717          times[0] = TimeDiff(t1, GetTime()); 
     718          nrays[0] = rays.size(); 
     719           
     720          mStats<<"#RssRelContrib"<<endl<<contributions[0]/nrays[0]<<endl; 
     721           
    625722          vssRays.insert(vssRays.end(), tmpVssRays.begin(), tmpVssRays.end() ); 
    626723          rays.clear(); 
    627724          tmpVssRays.clear(); 
    628  
    629725          if (ratios[1]!=0.0f) { 
     726                t1 = GetTime(); 
    630727                GenerateRays(mRssSamplesPerPass*ratios[1], SPATIAL_BOX_BASED_DISTRIBUTION, rays); 
    631728                CastRays(rays, tmpVssRays); 
    632729                castRays += rays.size(); 
    633                 float c2 = mViewCellsManager->ComputeSampleContributions(tmpVssRays, false, true); 
    634                 mStats<<"#SpatialRelContrib"<<endl<<c2/rays.size()<<endl; 
     730#if ADD_RAYS_IN_PLACE  
     731                contributions[1] = mViewCellsManager->ComputeSampleContributions(tmpVssRays, true, false); 
     732#else 
     733                contributions[1] = mViewCellsManager->ComputeSampleContributions(tmpVssRays, false, true); 
     734#endif 
     735          times[1] = TimeDiff(t1, GetTime()); 
     736          nrays[1] = rays.size(); 
     737 
     738          mStats<<"#SpatialRelContrib"<<endl<<contributions[1]/nrays[1]<<endl; 
    635739                 
    636740                vssRays.insert(vssRays.end(), tmpVssRays.begin(), tmpVssRays.end() ); 
     
    642746           
    643747          if (ratios[2]!=0.0f) { 
     748                t1 = GetTime(); 
    644749                GenerateRays(mRssSamplesPerPass*ratios[2], DIRECTION_BASED_DISTRIBUTION, rays); 
    645750                CastRays(rays, tmpVssRays); 
    646751                castRays += rays.size(); 
    647                 float c3 = mViewCellsManager->ComputeSampleContributions(tmpVssRays, false, true); 
    648                 mStats<<"#DirectionalRelContrib"<<endl<<c3/rays.size()<<endl; 
     752#if ADD_RAYS_IN_PLACE  
     753                contributions[2] = mViewCellsManager->ComputeSampleContributions(tmpVssRays, true, false); 
     754#else 
     755                contributions[2] = mViewCellsManager->ComputeSampleContributions(tmpVssRays, false, true); 
     756#endif 
     757                times[2] = TimeDiff(t1, GetTime()); 
     758                nrays[2] = rays.size(); 
     759                 
     760                mStats<<"#DirectionalRelContrib"<<endl<<contributions[2]/nrays[2]<<endl; 
    649761                 
    650762                vssRays.insert(vssRays.end(), tmpVssRays.begin(), tmpVssRays.end() ); 
     
    654766          } 
    655767           
     768           
     769          // now evaluate the ratios for the next pass 
     770#define TIMES 0 
     771 
     772#if TIMES 
     773          ratios[0] = sqr(contributions[0]/times[0]); 
     774          ratios[1] = sqr(contributions[1]/times[1]); 
     775          ratios[2] = sqr(contributions[2]/times[2]); 
     776#else 
     777          ratios[0] = sqr(contributions[0]/nrays[0]); 
     778          ratios[1] = sqr(contributions[1]/nrays[1]); 
     779          ratios[2] = sqr(contributions[2]/nrays[2]); 
     780#endif 
     781          NormalizeRatios(ratios); 
     782 
     783          cout<<"New ratios: "<<ratios[0]<<" "<<ratios[1]<<" "<<ratios[2]<<endl; 
     784           
    656785          // add contributions of all rays at once... 
     786#if !ADD_RAYS_IN_PLACE  
    657787          mViewCellsManager->AddSampleContributions(vssRays); 
    658            
     788#endif     
    659789        } 
    660790        else { 
     
    723853                sprintf(filename, "rss-rays-%04d.x3d", rssPass); 
    724854           
     855           
     856 
     857          vssRays.SelectRays(mExportNumRays, rayBuffer[mPass], true); 
     858           
    725859          ExportRays(filename, vssRays, mExportNumRays); 
    726  
     860           
    727861          // now export all contributing rays 
    728862          VssRayContainer contributingRays; 
     
    731865          sprintf(filename, "rss-crays-%04d.x3d", rssPass); 
    732866          ExportRays(filename, contributingRays, mExportNumRays); 
     867           
    733868        } 
    734869 
     
    798933         
    799934  } 
    800    
     935 
     936 
     937  if (mExportRays && mUseImportanceSampling) { 
     938        char filename[64]; 
     939        sprintf(filename, "rss-rays-i.x3d"); 
     940         
     941        rayBuffer.resize(mPass); 
     942        ExportRayAnimation(filename, rayBuffer); 
     943  } 
     944           
    801945  Debug<<"Deleting RSS tree...\n"; 
    802946  delete mRssTree; 
     
    804948 
    805949 
    806   //  mViewCellsManager->ExportViewCells("visibility.xml", 
     950  // mViewCellsManager->ExportViewCells("visibility.xml", 
    807951  //                                                                     true); 
    808952   
Note: See TracChangeset for help on using the changeset viewer.