Ignore:
Timestamp:
10/10/06 00:59:59 (18 years ago)
Author:
bittner
Message:

support for kd tree based pvs

File:
1 edited

Legend:

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

    r1589 r1594  
    2929#define SAMPLE_ORIGIN_OBJECTS 0 
    3030 
     31// $$JB HACK 
     32#define USE_KD_PVS 1 
     33#define KD_PVS_AREA 1e-3f 
    3134 
    3235namespace GtpVisibilityPreprocessor { 
     
    11831186                                                           const float filterWidth) 
    11841187{ 
    1185         ViewCell *currentViewCell = GetViewCell(viewPoint); 
    1186  
    1187         if (mMaxFilterSize < 1) { 
    1188                 prvs.mViewCell = currentViewCell; 
    1189                 return; 
    1190         } 
    1191  
    1192         const AxisAlignedBox3 box = GetFilterBBox(viewPoint, filterWidth); 
    1193  
    1194         if (currentViewCell)  
    1195         { 
    1196                 ViewCellContainer viewCells; 
    1197                 ComputeBoxIntersections(box, viewCells); 
    1198  
    1199                 ViewCell *root = ConstructLocalMergeTree2(currentViewCell, viewCells); 
    1200                 prvs.mViewCell = root; 
    1201  
     1188  ViewCell *currentViewCell = GetViewCell(viewPoint); 
     1189 
     1190  if (mMaxFilterSize < 1) { 
     1191        prvs.mViewCell = currentViewCell; 
     1192        return; 
     1193  } 
     1194   
     1195  const AxisAlignedBox3 box = GetFilterBBox(viewPoint, filterWidth); 
     1196   
     1197  if (currentViewCell)  
     1198        { 
     1199          ViewCellContainer viewCells; 
     1200          ComputeBoxIntersections(box, viewCells); 
     1201           
     1202          ViewCell *root = ConstructLocalMergeTree2(currentViewCell, viewCells); 
     1203          prvs.mViewCell = root; 
     1204           
    12021205        }  
    1203         else 
    1204         { 
    1205                 prvs.mViewCell = NULL; 
    1206                 //prvs.mPvs = root->GetPvs(); 
     1206  else 
     1207        { 
     1208          prvs.mViewCell = NULL; 
     1209          //prvs.mPvs = root->GetPvs(); 
    12071210        } 
    12081211} 
     
    18081811  ViewCellContainer *viewcells = &ray.mViewCells; 
    18091812  ViewCellContainer::const_iterator it; 
     1813 
     1814  if (!ray.mTerminationObject) 
     1815        return; 
     1816   
     1817#if USE_KD_PVS 
     1818  float area = GetPreprocessor()->mKdTree->GetBox().SurfaceArea()*KD_PVS_AREA; 
     1819  KdNode *node = GetPreprocessor()->mKdTree->GetNode(ray.mTermination, area); 
     1820  Intersectable *obj = 
     1821        GetPreprocessor()->mKdTree-> 
     1822        GetOrCreateKdIntersectable(node); 
     1823#else 
     1824  Intersectable *obj = ray.mTerminationObject; 
     1825#endif 
     1826   
    18101827  for (it = viewcells->begin(); it != viewcells->end(); ++it) { 
    18111828        ViewCell *viewcell = *it; 
    18121829        if (viewcell->GetValid()) { 
    18131830          // if ray not outside of view space 
    1814           viewcell->GetPvs().AddSample(ray.mTerminationObject, ray.mPdf); 
     1831          viewcell->GetPvs().AddSample(obj, ray.mPdf); 
    18151832        } 
    18161833  } 
     
    18511868        } 
    18521869 
     1870#if USE_KD_PVS 
     1871        float area = GetPreprocessor()->mKdTree->GetBox().SurfaceArea()*KD_PVS_AREA; 
     1872        KdNode *node = GetPreprocessor()->mKdTree->GetNode(ray.mTermination, area); 
     1873        Intersectable *obj = 
     1874          GetPreprocessor()->mKdTree-> 
     1875          GetOrCreateKdIntersectable(node); 
     1876#else 
     1877        Intersectable *obj = ray.mTerminationObject; 
     1878#endif 
     1879         
     1880         
    18531881        ViewCellContainer::const_iterator it = viewcells.begin(); 
    1854  
     1882         
    18551883        for (; it != viewcells.end(); ++ it)  
    18561884        { 
     
    18621890 
    18631891                        if (ray.mTerminationObject)  
    1864                         {                        
    1865                                 if (viewcell->GetPvs().GetSampleContribution( 
    1866                                                         ray.mTerminationObject, 
    1867                                                         ray.mPdf, 
    1868                                                         contribution)) 
     1892                          {                      
     1893                                 
     1894 
     1895                          if (viewcell->GetPvs().GetSampleContribution(obj, 
     1896                                                                                                                   ray.mPdf, 
     1897                                                                                                                   contribution)) 
    18691898                                { 
    1870                                         ++ ray.mPvsContribution; 
    1871                                         ray.mRelativePvsContribution += contribution; 
     1899                                  ++ ray.mPvsContribution; 
     1900                                  ray.mRelativePvsContribution += contribution; 
    18721901                                } 
    18731902                        } 
     
    19031932                                if (ray.mTerminationObject) 
    19041933                                { 
    1905                                         viewcell->GetPvs().AddSample(ray.mTerminationObject, ray.mPdf); 
     1934                                        viewcell->GetPvs().AddSample(obj, ray.mPdf); 
    19061935                                }                                
    19071936#if SAMPLE_ORIGIN_OBJECTS 
     
    23302359  // now compute a new Pvs by including also objects intersecting the  
    23312360  // extended boxes of visible objects 
    2332  
    23332361  Intersectable::NewMail(); 
    23342362   
     
    55105538                        if (ray.mTerminationObject)  
    55115539                        { 
    5512                                 // todo: maybe not correct for kd node pvs 
    5513                                 Intersectable *obj = mHierarchyManager->GetIntersectable(ray, true); 
    5514                                 if (viewcell->GetPvs().GetSampleContribution(obj, 
    5515                                                                                                                          ray.mPdf,  
    5516                                                                                                                          contribution)) 
     5540                          // todo: maybe not correct for kd node pvs 
     5541                          Intersectable *obj = mHierarchyManager->GetIntersectable(ray, true); 
     5542                           
     5543                          if (viewcell->GetPvs().GetSampleContribution(obj, 
     5544                                                                                                                   ray.mPdf,  
     5545                                                                                                                   contribution)) 
    55175546                                { 
    5518                                         ++ ray.mPvsContribution; 
     5547                                  ++ ray.mPvsContribution; 
    55195548                                } 
    5520  
    5521                                 ray.mRelativePvsContribution += contribution; 
     5549                           
     5550                          ray.mRelativePvsContribution += contribution; 
    55225551                        } 
    5523  
     5552                         
    55245553                        // for directional sampling it is important to count only contributions 
    55255554                        // made in one direction! 
Note: See TracChangeset for help on using the changeset viewer.