The spica renderer
light.h
1 #ifdef _MSC_VER
2 #pragma once
3 #endif
4 
5 #ifndef _SPICA_LIGHT_INTERFACE_
6 #define _SPICA_LIGHT_INTERFACE_
7 
8 #include "core/core.hpp"
9 #include "core/cobject.h"
10 #include "core/point3d.h"
11 #include "core/normal3d.h"
12 #include "core/spectrum.h"
13 #include "core/vector3d.h"
14 #include "core/transform.h"
15 #include "core/uncopyable.h"
16 #include "core/stack.h"
17 
18 #include "core/render.hpp"
19 
20 namespace spica {
21 
22  class SPICA_EXPORTS LightSample {
23  private:
24  Point3d _pos{0.0, 0.0, 0.0};
25  Normal3d _nrm{0.0, 0.0, 0.0};
26  Vector3d _dir{0.0, 0.0, 0.0};
27  Spectrum _emt{0.0, 0.0, 0.0};
28  double _pdf = 0.0;
30  public:
32  }
33 
34  LightSample(const Point3d& p, const Normal3d& n, const Vector3d& dir,
35  const Spectrum& e, double pdf)
36  : _pos{ p }
37  , _nrm{ n }
38  , _dir{ dir }
39  , _emt{ e }
40  , _pdf{ pdf } {
41  }
42 
43  ~LightSample() {
44  }
45 
46  LightSample(const LightSample& l)
47  : LightSample{} {
48  this->operator=(l);
49  }
50 
51  LightSample& operator=(const LightSample& l) {
52  this->_pos = l._pos;
53  this->_nrm = l._nrm;
54  this->_dir = l._dir;
55  this->_emt = l._emt;
56  this->_pdf = l._pdf;
57  return *this;
58  }
59 
60  inline Point3d position() const { return _pos; }
61  inline Normal3d normal() const { return _nrm; }
62  inline Vector3d dir() const { return _dir; }
63  inline Spectrum Le() const { return _emt; }
64  inline double pdf() const { return _pdf; }
65  };
66 
71  enum class LightType {
72  None = 0x00,
73  Area = 0x01,
74  Envmap = 0x02,
75  };
76 
80  class SPICA_EXPORTS Light : public CObject, Uncopyable {
81  public:
82  Light(LightType type, const Transform& light2World, int numSamples = 1);
83  virtual ~Light();
84 
85  LightType type() const;
86 
87  virtual Spectrum L(const Interaction& pLight, const Vector3d& dir) const;
88 
95  virtual Spectrum sampleLi(const Interaction& pObj, const Point2d& rands,
96  Vector3d* dir, double* pdf, VisibilityTester* vis) const = 0;
97 
104  virtual double pdfLi(const Interaction& pObj, const Vector3d& dir) const = 0;
105 
106  virtual Spectrum Le(const Ray& ray) const;
107  virtual Spectrum sampleLe(const Point2d& rand1, const Point2d& rand2,
108  Ray* ray, Normal3d* nLight, double* pdfPos,
109  double *pdfDir) const = 0;
110  virtual void pdfLe(const Ray& ray, const Normal3d& nLight,
111  double* pdfPos, double* pdfDir) const = 0;
112 
113  virtual Spectrum power() const = 0;
114 
115  virtual Light* clone() const = 0;
116 
117  inline virtual bool isDelta() const { return false; }
118  inline bool isArea() const { return type_ == LightType::Area; }
119 
120  protected:
121  const LightType type_;
122  const int numSamples_;
123 
124  const Transform lightToWorld_;
125  const Transform worldToLight_;
126  };
127 
128 } // spica
129 
130 #endif // _SPICA_LIGHT_INTERFACE_
RGB spectrum.
Definition: spectrum.h:18
Ray class.
Definition: ray.h:24
Definition: cobject.h:24
The transformation operator class.
Definition: transform.h:17
The base class for the lights.
Definition: light.h:80
Definition: visibility_tester.h:15
Definition: light.h:22
Interface class which forbids copy and assignment.
Definition: uncopyable.h:15
Definition: interaction.h:23
LightSample()
Sample PDF.
Definition: light.h:31