The spica renderer
interaction.h
1 #ifdef _MSC_VER
2 #pragma once
3 #endif
4 
5 #ifndef _SPICA_INTERACTION_H_
6 #define _SPICA_INTERACTION_H_
7 
8 #include <memory>
9 
10 #include "core/core.hpp"
11 #include "core/common.h"
12 #include "core/spectrum.h"
13 #include "core/point2d.h"
14 #include "core/point3d.h"
15 #include "core/normal3d.h"
16 #include "core/vector3d.h"
17 
18 #include "core/render.hpp"
19 #include "core/medium.h"
20 
21 namespace spica {
22 
23 class SPICA_EXPORTS Interaction {
24 public:
25  Interaction();
26  explicit Interaction(const Point3d& pos, const Normal3d& normal = Normal3d(),
27  const Vector3d& wo = Vector3d());
28  Interaction(const Point3d& pos, const Vector3d& wo,
29  const MediumInterface& mediumInterface);
30  Interaction(const Interaction& intr);
31  virtual ~Interaction();
32 
33  Interaction& operator=(const Interaction& intr);
34 
35  virtual Ray spawnRay(const Vector3d& wi) const;
36  virtual Ray spawnRayTo(const Point3d& p) const;
37  virtual Ray spawnRayTo(const Interaction& intr) const;
38 
39  inline virtual bool isSurfaceInteraction() const { return false; }
40  inline const Point3d& pos() const { return pos_; }
41  inline const Normal3d& normal() const { return normal_; }
42  inline const Vector3d& wo() const { return wo_; }
43  inline void setMediumInterface(const MediumInterface& mediumInterface) {
44  mediumInterface_ = mediumInterface;
45  }
46 
47  inline const Medium* getMedium(const Vector3d& w) const {
48  return vect::dot(w, normal_) > 0.0 ? mediumInterface_.outside()
49  : mediumInterface_.inside();
50  }
51 
52  inline const Medium* getMedium() const {
53  Assertion(mediumInterface_.inside() == mediumInterface_.outside(),
54  "Only inside the primitive should be filled with participating media");
55  return mediumInterface_.inside();
56  }
57 
58 protected:
59  Point3d pos_;
60  Normal3d normal_;
61  Vector3d wo_;
62  MediumInterface mediumInterface_;
63 
64 private:
65  friend class SeparableBSSRDF;
66 };
67 
68 class SPICA_EXPORTS SurfaceInteraction : public Interaction {
69 public:
71  SurfaceInteraction(const Point3d& p,
72  const Point2d& uv, const Vector3d& wo,
73  const Vector3d& dpdu, const Vector3d& dpdv,
74  const Normal3d& dndu, const Normal3d& dndv,
75  const Shape* shape);
77  virtual ~SurfaceInteraction();
78 
79  SurfaceInteraction& operator=(const SurfaceInteraction& intr);
80 
81  void computeDifferentials(const Ray& ray);
82  void setScatterFuncs(const Ray& ray, MemoryArena& arena);
83  void setShadingGeometry(const Vector3d &dpdu, const Vector3d &dpdv,
84  const Normal3d &dndu, const Normal3d &dndv);
85  Spectrum Le(const Vector3d& w) const;
86 
87  inline bool isSurfaceInteraction() const override { return true; }
88  inline const Point2d& uv() const { return uv_; }
89  inline const Vector3d& dpdu() const { return dpdu_; }
90  inline const Vector3d& dpdv() const { return dpdv_; }
91  inline const Normal3d& dndu() const { return dndu_; }
92  inline const Normal3d& dndv() const { return dndv_; }
93  inline const Normal3d& ns() const { return shading.n; }
94  inline const Vector3d& ts() const { return shading.dpdu; }
95  inline const Vector3d& bs() const { return shading.dpdv; }
96  inline double dudx() const { return dudx_; }
97  inline double dudy() const { return dudy_; }
98  inline double dvdx() const { return dvdx_; }
99  inline double dvdy() const { return dvdy_; }
100  inline const Primitive* primitive() const { return primitive_; }
101 
102  inline BSDF* bsdf() const { return bsdf_; }
103  inline BSSRDF* bssrdf() const { return bssrdf_; }
104  inline void setBSDF(BSDF* bsdf) { bsdf_ = bsdf; }
105  inline void setBSSRDF(BSSRDF* bssrdf) { bssrdf_ = bssrdf; }
106  inline void setPrimitive(const Primitive* prim) { primitive_ = prim; }
107 
108 private:
109  Point2d uv_;
110  Vector3d dpdu_, dpdv_;
111  Normal3d dndu_, dndv_;
112  Vector3d dpdx_, dpdy_;
113  struct {
114  Normal3d n;
115  Vector3d dpdu, dpdv;
116  Normal3d dndu, dndv;
117  } shading;
118 
119  double dudx_ = 0.0, dudy_ = 0.0, dvdx_ = 0.0, dvdy_ = 0.0;
120  const Shape* shape_ = nullptr;
121  const Primitive* primitive_ = nullptr;
122  BSDF* bsdf_ = nullptr;
123  BSSRDF* bssrdf_ = nullptr;
124 };
125 
126 class SPICA_EXPORTS MediumInteraction : public Interaction {
127 public:
129  MediumInteraction(const Point3d& p, const Vector3d& wo,
130  const Medium* medium,
131  const PhaseFunction* phase);
132  bool isValid() const;
133 
134  inline const PhaseFunction* phase() const { return phase_; }
135 
136 private:
137  const PhaseFunction* phase_;
138 };
139 
140 } // namespace spica
141 
142 #endif // _SPICA_INTERACTION_H_
Definition: interaction.h:68
SeparableBSSRDF class.
Definition: bssrdf.h:43
RGB spectrum.
Definition: spectrum.h:18
Definition: phase.h:19
Ray class.
Definition: ray.h:24
Definition: medium.h:26
Definition: primitive.h:19
BSSRDF Interface.
Definition: bssrdf.h:25
Definition: interaction.h:126
Definition: interaction.h:23
Abstract shape class.
Definition: shape.h:39
Definition: medium.h:19
Definition: bsdf.h:20