Changeset 556 for trunk/VUT/GtpVisibilityPreprocessor/src/Pvs.h
- Timestamp:
- 01/19/06 15:30:44 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/VUT/GtpVisibilityPreprocessor/src/Pvs.h
r492 r556 25 25 template<typename T> 26 26 struct PvsData { 27 int mVisibleSamples; 27 // int mVisibleSamples; 28 // sum of probability density of visible sample rays 29 float mSumPdf; 28 30 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; } 30 37 }; 31 38 … … 46 53 int GetSize() const {return (int)mEntries.size();} 47 54 bool Empty() const {return mEntries.empty();} 55 56 /** Normalize the visibility of entries in order to get comparable 57 results */ 58 59 void NormalizeMaximum(); 48 60 49 61 /** Merges pvs of a and pvs of b into this pvs. … … 61 73 PvsData<T> *Find(T sample); 62 74 63 bool GetSampleContribution(T sample, float &contribution);75 bool GetSampleContribution(T sample, const float pdf, float &contribution); 64 76 65 77 /** Adds sample to PVS. … … 67 79 @returns true if sample was not already in PVS. 68 80 */ 69 bool AddSample(T sample, float &contribution);81 bool AddSample(T sample, const float pdf, float &contribution); 70 82 71 83 /** Adds sample to PVS. 72 84 @returns contribution of sample (0 or 1) 73 85 */ 74 int AddSample(T sample);86 float AddSample(T sample, const float pdf); 75 87 76 88 /** Adds one pvs to another one. … … 94 106 @param visibleSampels number of references to be removed 95 107 */ 96 bool RemoveSample(T sample, const int visibleSamples);108 bool RemoveSample(T sample, const float pdf); 97 109 98 110 /// Map of PVS entries … … 130 142 131 143 if (data) 132 data->m VisibleSamples += (*it).second.mVisibleSamples;144 data->mSumPdf += (*it).second.mSumPdf; 133 145 else 134 146 mEntries.insert(*it); … … 159 171 160 172 template <typename T> 161 int162 Pvs<T>::AddSample(T sample )173 float 174 Pvs<T>::AddSample(T sample, const float pdf) 163 175 { 164 176 PvsData<T> *data = Find(sample); 165 177 166 178 if (data) { 167 return ++data->mVisibleSamples; 179 data->mSumPdf+=pdf; 180 return data->mSumPdf; 168 181 } 169 182 else { 170 mEntries[sample] = PvsData<T>( 1);171 return 1;183 mEntries[sample] = PvsData<T>(pdf); 184 return pdf; 172 185 } 173 186 } … … 175 188 template <typename T> 176 189 bool 177 Pvs<T>::AddSample(T sample, float &contribution) 190 Pvs<T>::AddSample(T sample, 191 const float pdf, 192 float &contribution) 178 193 { 179 194 PvsData<T> *data = Find(sample); 180 195 181 196 if (data) { 182 data->m VisibleSamples++;183 contribution = 1.0f/data->mVisibleSamples;197 data->mSumPdf+=pdf; 198 contribution = pdf/data->mSumPdf; 184 199 return false; 185 200 } 186 201 else { 187 mEntries[sample] = PvsData<T>( 1);202 mEntries[sample] = PvsData<T>(pdf); 188 203 contribution = 1.0f; 189 204 return true; … … 193 208 template <typename T> 194 209 bool 195 Pvs<T>::GetSampleContribution(T sample, float &contribution) 210 Pvs<T>::GetSampleContribution(T sample, 211 const float pdf, 212 float &contribution) 196 213 { 197 214 PvsData<T> *data = Find(sample); 198 215 199 216 if (data) { 200 contribution = 1.0f/(data->mVisibleSamples + 1);217 contribution = pdf/(data->mSumPdf + pdf); 201 218 return false; 202 219 } … … 208 225 209 226 template <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; 227 bool 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; 225 243 } 226 244 … … 228 246 int Pvs<T>::AddPvs(const Pvs<T> &pvs) 229 247 { 230 231 232 233 234 235 236 AddSample((*it).first, contri);237 238 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(); 239 257 } 240 258 … … 242 260 int Pvs<T>::SubtractPvs(const Pvs<T> &pvs) 243 261 { 244 245 246 247 248 249 RemoveSample((*it).first, (*it).second.mVisibleSamples);250 251 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(); 252 270 } 253 271 … … 262 280 entries.push_back((*it)->first); 263 281 } 282 283 template <typename T> 284 void 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 264 306 265 307 /** Class instantiating the Pvs template for kd tree nodes.
Note: See TracChangeset
for help on using the changeset viewer.