00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "lux.h"
00025 #include "transport.h"
00026 #include "scene.h"
00027 #include "mc.h"
00028
00029 namespace lux
00030 {
00031
00032
00033 struct BidirVertex;
00034 class BidirIntegrator : public SurfaceIntegrator {
00035 public:
00036
00037 Spectrum Li(const Scene *scene, const RayDifferential &ray, const Sample *sample, float *alpha) const;
00038 void RequestSamples(Sample *sample, const Scene *scene);
00039 virtual BidirIntegrator* clone() const;
00040 IntegrationSampler* HasIntegrationSampler(IntegrationSampler *is) { return NULL; };
00041 static SurfaceIntegrator *CreateSurfaceIntegrator(const ParamSet ¶ms);
00042 private:
00043
00044 int generatePath(const Scene *scene, const Ray &r, const Sample *sample,
00045 const int *bsdfOffset, const int *bsdfCompOffset,
00046 BidirVertex *vertices, int maxVerts) const;
00047 float weightPath(BidirVertex *eye, int nEye, BidirVertex *light, int nLight) const;
00048 Spectrum evalPath(const Scene *scene, BidirVertex *eye, int nEye,
00049 BidirVertex *light, int nLight) const;
00050 static float G(const BidirVertex &v0, const BidirVertex &v1);
00051 static bool visible(const Scene *scene, const Point &P0, const Point &P1);
00052
00053 #define MAX_VERTS 4
00054 int eyeBSDFOffset[MAX_VERTS], eyeBSDFCompOffset[MAX_VERTS];
00055 int lightBSDFOffset[MAX_VERTS], lightBSDFCompOffset[MAX_VERTS];
00056 int directLightOffset[MAX_VERTS], directLightNumOffset[MAX_VERTS];
00057 int directBSDFOffset[MAX_VERTS], directBSDFCompOffset[MAX_VERTS];
00058 int lightNumOffset, lightPosOffset, lightDirOffset;
00059 };
00060 struct BidirVertex {
00061 BidirVertex() { bsdfWeight = dAWeight = 0.; rrWeight = 1.;
00062 flags = BxDFType(0); bsdf = NULL; }
00063 BSDF *bsdf;
00064 Point p;
00065 Normal ng, ns;
00066 Vector wi, wo;
00067 float bsdfWeight, dAWeight, rrWeight;
00068 BxDFType flags;
00069 };
00070
00071 }
00072