Pathクラス

とか作ってよく論文に出てくる擬似コードなみの簡潔さでパストレ書きたい。

LightE
PathTracer::trace(FVector2& vScr)
{
  EyePath* path = Camera::genPath(vScr);

  // trace ray
  while(path->extend())
    ;

  // get contribution from light at each point
  LightE e(0, 0);
  const unsigned int nPathLength = path->length();
  for(unsigned int i = 0; i < nPathLength; ++i)
  {
    e += Renderer->sampleDI(path->getDG(i)) * path->getWeight(i);
  }

  return e;
}

とか書きたい。

ただ、どうやって速度を出すのかが問題で、pathクラスがvtable持ってたりすると仮想関数コールの嵐になるし。
C++のTemplate使って無理やりDuck Typingでもする?

追記:
コード下書き下書き。意外とinline化できそう?

メモ&TODO:

  • BRDFのreciprocity使ってPath::extendは共有できるか?
  • コンストラクタに渡されたレイで衝突が起こらなかった場合はどうするの?
    • Invalidマークをつけるといってもメモリ確保時のオーバーヘッドが?
      • placement new推奨しとく?
#define PATH_MAX_LENGTH 8

class Path
{
protected:
  //! protected default C-tor
  Path();
  
  //! extend path length by one
  inline bool extend();

  // ------ accesor methods ------
  略

public:
  DiffGeom m_DG[PATH_MAX_LENGTH];
  FVector3 m_vWi[PATH_MAX_LENGTH];
  REAL m_fImportance[PATH_MAX_LENGTH];
  unsigned int m_nPathLength;
};

class EyePath : public Path
{
public:
  //! C-tor
  EyePath(const FVector3& vEye, const FVector3& vPhi); ←コンストラクタで一回目の衝突地点は記録する。(そうしないとextend共有不可)

  // ------ accesor methods ------
  略
private:
  FVector3 m_vEye;
};

class LightPath : public Path
{
public:
  //! C-tor
  LightPath(const FVector3& vLight, const FVector3& vTheta);

  //! 
private:
  FVector3 m_vLight;
};

//! for Metropolis Light Transport
class FullPath : public Path
{

};