Ignore:
Timestamp:
01/19/06 15:30:44 (18 years ago)
Author:
bittner
Message:

debug version looking for glrenderer bug...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/GtpVisibilityPreprocessor/src/Pvs.h

    r492 r556  
    2525template<typename T>  
    2626struct PvsData { 
    27   int mVisibleSamples; 
     27  //  int mVisibleSamples; 
     28  // sum of probability density of visible sample rays 
     29  float mSumPdf; 
    2830  PvsData<T>() {} 
    29   PvsData<T>(const int samples): mVisibleSamples(samples) {} 
     31  PvsData<T>(const float sumPdf): 
     32        mSumPdf(sumPdf) {} 
     33 
     34  // $$JB in order to return meaningfull values 
     35  // it assumes that the sum pdf has been normalized somehow!!! 
     36  float GetVisibility() { return mSumPdf; } 
    3037}; 
    3138 
     
    4653  int GetSize() const {return (int)mEntries.size();} 
    4754  bool Empty() const {return mEntries.empty();} 
     55 
     56  /** Normalize the visibility of entries in order to get comparable 
     57          results */ 
     58   
     59  void NormalizeMaximum(); 
    4860   
    4961  /** Merges pvs of a and pvs of b into this pvs. 
     
    6173  PvsData<T> *Find(T sample); 
    6274 
    63   bool GetSampleContribution(T sample, float &contribution); 
     75  bool GetSampleContribution(T sample, const float pdf, float &contribution); 
    6476   
    6577  /** Adds sample to PVS.  
     
    6779          @returns true if sample was not already in PVS. 
    6880  */ 
    69   bool AddSample(T sample, float &contribution); 
     81  bool AddSample(T sample, const float pdf, float &contribution); 
    7082 
    7183  /** Adds sample to PVS. 
    7284          @returns contribution of sample (0 or 1) 
    7385  */ 
    74   int AddSample(T sample); 
     86  float AddSample(T sample, const float pdf); 
    7587   
    7688  /** Adds one pvs to another one. 
     
    94106          @param visibleSampels number of references to be removed 
    95107  */ 
    96   bool RemoveSample(T sample, const int visibleSamples); 
     108  bool RemoveSample(T sample, const float pdf); 
    97109 
    98110  /// Map of PVS entries 
     
    130142                 
    131143                if (data) 
    132                         data->mVisibleSamples += (*it).second.mVisibleSamples; 
     144                        data->mSumPdf += (*it).second.mSumPdf; 
    133145                else 
    134146                        mEntries.insert(*it); 
     
    159171 
    160172template <typename T> 
    161 int 
    162 Pvs<T>::AddSample(T sample) 
     173float 
     174Pvs<T>::AddSample(T sample, const float pdf) 
    163175{ 
    164176  PvsData<T> *data = Find(sample); 
    165177   
    166178  if (data)  { 
    167         return ++data->mVisibleSamples; 
     179        data->mSumPdf+=pdf; 
     180        return data->mSumPdf; 
    168181  } 
    169182  else { 
    170         mEntries[sample] = PvsData<T>(1); 
    171         return 1; 
     183        mEntries[sample] = PvsData<T>(pdf); 
     184        return pdf; 
    172185  } 
    173186} 
     
    175188template <typename T> 
    176189bool 
    177 Pvs<T>::AddSample(T sample, float &contribution) 
     190Pvs<T>::AddSample(T sample, 
     191                                  const float pdf, 
     192                                  float &contribution) 
    178193{ 
    179194  PvsData<T> *data = Find(sample); 
    180195   
    181196  if (data)  { 
    182         data->mVisibleSamples++; 
    183         contribution = 1.0f/data->mVisibleSamples; 
     197        data->mSumPdf+=pdf; 
     198        contribution = pdf/data->mSumPdf; 
    184199        return false; 
    185200  } 
    186201  else { 
    187         mEntries[sample] = PvsData<T>(1); 
     202        mEntries[sample] = PvsData<T>(pdf); 
    188203        contribution = 1.0f; 
    189204        return true; 
     
    193208template <typename T> 
    194209bool 
    195 Pvs<T>::GetSampleContribution(T sample, float &contribution)  
     210Pvs<T>::GetSampleContribution(T sample, 
     211                                                          const float pdf, 
     212                                                          float &contribution)  
    196213{ 
    197214  PvsData<T> *data = Find(sample); 
    198215   
    199216  if (data)  { 
    200         contribution = 1.0f/(data->mVisibleSamples + 1); 
     217        contribution = pdf/(data->mSumPdf + pdf); 
    201218        return false; 
    202219  } 
     
    208225 
    209226template <typename T> 
    210 bool Pvs<T>::RemoveSample(T sample, const int visibleSamples) 
    211 { 
    212         std::map<T, PvsData<T>, LtSample<T> >:: 
    213                 iterator it = mEntries.find(sample); 
    214  
    215         if (it == mEntries.end()) 
    216                 return false; 
    217  
    218         PvsData<T> *data = &(*it).second; 
    219    
    220         data->mVisibleSamples -= visibleSamples; 
    221         if (data->mVisibleSamples <= 0) 
    222                 mEntries.erase(it); 
    223  
    224         return true; 
     227bool Pvs<T>::RemoveSample(T sample, 
     228                                                  const float pdf) 
     229{ 
     230  std::map<T, PvsData<T>, LtSample<T> >:: 
     231        iterator it = mEntries.find(sample); 
     232   
     233  if (it == mEntries.end()) 
     234        return false; 
     235   
     236  PvsData<T> *data = &(*it).second; 
     237   
     238  data->mSumPdf -= pdf; 
     239  if (data->mSumPdf <= 0.0f) 
     240        mEntries.erase(it); 
     241   
     242  return true; 
    225243} 
    226244 
     
    228246int Pvs<T>::AddPvs(const Pvs<T> &pvs) 
    229247{ 
    230         std::map<T, PvsData<T>, LtSample<T> >:: 
    231                 const_iterator it, it_end = pvs.mEntries.end(); 
    232  
    233         float contri; 
    234         // output PVS of view cell 
    235         for (it = pvs.mEntries.begin(); it != it_end; ++ it)  
    236                 AddSample((*it).first, contri); 
    237  
    238         return GetSize(); 
     248  std::map<T, PvsData<T>, LtSample<T> >:: 
     249        const_iterator it, it_end = pvs.mEntries.end(); 
     250   
     251  float contri; 
     252  // output PVS of view cell 
     253  for (it = pvs.mEntries.begin(); it != it_end; ++ it)  
     254        AddSample((*it).first, (*it).second.mSumPdf, contri); 
     255   
     256  return GetSize(); 
    239257} 
    240258  
     
    242260int Pvs<T>::SubtractPvs(const Pvs<T> &pvs) 
    243261{ 
    244         std::map<T, PvsData<T>, LtSample<T> >:: 
    245                 const_iterator it, it_end = pvs.mEntries.end(); 
    246  
    247         // output PVS of view cell 
    248         for (it = pvs.mEntries.begin(); it != it_end; ++ it)  
    249                 RemoveSample((*it).first, (*it).second.mVisibleSamples); 
    250  
    251         return GetSize(); 
     262  std::map<T, PvsData<T>, LtSample<T> >:: 
     263        const_iterator it, it_end = pvs.mEntries.end(); 
     264   
     265  // output PVS of view cell 
     266  for (it = pvs.mEntries.begin(); it != it_end; ++ it)  
     267        RemoveSample((*it).first, (*it).second.mSumPdf); 
     268   
     269  return GetSize(); 
    252270} 
    253271 
     
    262280                entries.push_back((*it)->first); 
    263281} 
     282 
     283template <typename T> 
     284void Pvs<T>::NormalizeMaximum() 
     285{ 
     286  std::map<T, PvsData<T>, LtSample<T> >:: 
     287        const_iterator it, it_end = mEntries.end(); 
     288 
     289  float maxPdfSum = -1.0f; 
     290 
     291  // output PVS of view cell 
     292  for (it = mEntries.begin(); it != it_end; ++ it) { 
     293        float sum = (*it)->second.sumPdf; 
     294        if (sum > maxSum) 
     295          maxSum = sum; 
     296  } 
     297 
     298  maxSum = 1.0f/maxSum; 
     299 
     300  for (it = mEntries.begin(); it != it_end; ++ it) { 
     301        (*it)->second.sumPdf *= maxSum; 
     302  } 
     303   
     304} 
     305 
    264306 
    265307/** Class instantiating the Pvs template for kd tree nodes. 
Note: See TracChangeset for help on using the changeset viewer.