The spica renderer
sampling.h
1 #ifdef _MSC_VER
2 #pragma once
3 #endif
4 
5 #ifndef _SPICA_SAMPLING_H_
6 #define _SPICA_SAMPLING_H_
7 
8 #include <vector>
9 
10 #include "core/common.h"
11 #include "core/vector3d.h"
12 #include "core/normal3d.h"
13 #include "core/random.h"
14 
15 namespace spica {
16 
17 class SPICA_EXPORTS Distribution1D {
18 public:
20  explicit Distribution1D(const std::vector<double>& data);
22  virtual ~Distribution1D();
23 
24  Distribution1D& operator=(const Distribution1D& d);
25  double operator()(int i) const;
26 
27  double sample(double rand, double* pdf, int* offset = nullptr) const;
28  int sampleDiscrete(double rand, double* pdf) const;
29  double pdfDiscrete(int index) const;
30  inline double integral() const { return integral_; }
31  inline int count() const { return static_cast<int>(func_.size()); }
32 
33 private:
34  // Private methods
35  static int findInterval(const std::vector<double>& cdf, double v);
36 
37  // Private fields
38  std::vector<double> func_, cdf_;
39  double integral_;
40 
41 }; // class Distribution1D
42 
43 class SPICA_EXPORTS Distribution2D {
44 public:
46  Distribution2D(const std::vector<double>& data, int width, int height);
48  virtual ~Distribution2D();
49 
50  Distribution2D& operator=(const Distribution2D& d);
51 
52  Point2d sample(const Point2d& rands, double* pdf) const;
53  double pdf(const Point2d& p) const;
54 
55 private:
56  std::vector<Distribution1D> pCond_;
57  Distribution1D pMarg_;
58 
59 }; // class Distribution2D
60 
61 SPICA_EXPORTS Point2d sampleConcentricDisk(const Point2d& rands);
62 SPICA_EXPORTS Vector3d sampleUniformSphere(const Point2d& rands);
63 SPICA_EXPORTS Vector3d sampleCosineHemisphere(const Point2d& rands);
64 SPICA_EXPORTS inline double cosineHemispherePdf(double cosTheta) { return cosTheta * INV_PI; }
65 SPICA_EXPORTS void sampleUniformHemisphere(const Normal3d& normal, Vector3d* direction, const Point2d& rands);
66 
67 SPICA_EXPORTS
68 void samplePoissonDisk(const Scene& scene, const Point3d& pCamera,
69  double minDist, std::vector<Interaction>* points);
70 
71 } // namespace spica
72 
73 #endif // SPICA_SAMPLING_H_
Three-dimensional vector.
Definition: core.hpp:56
Definition: sampling.h:43
Definition: sampling.h:17