00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "pbrt.h"
00030 #include "transport.h"
00031 #include "scene.h"
00032
00033 typedef enum {
00034 DEBUG_U, DEBUG_V,
00035 DEBUG_GEOM_NORMAL_X,
00036 DEBUG_GEOM_NORMAL_Y,
00037 DEBUG_GEOM_NORMAL_Z,
00038 DEBUG_SHAD_NORMAL_X,
00039 DEBUG_SHAD_NORMAL_Y,
00040 DEBUG_SHAD_NORMAL_Z,
00041 DEBUG_ONE,
00042 DEBUG_ZERO,
00043 DEBUG_HIT_SOMETHING
00044 } DebugVariable;
00045
00046 class DebugIntegrator : public SurfaceIntegrator {
00047 public:
00048
00049 Spectrum Li(const Scene *scene, const RayDifferential &ray,
00050 const Sample *sample, float *alpha) const;
00051 DebugIntegrator( DebugVariable v[3] )
00052 {
00053 debug_variable[0] = v[0];
00054 debug_variable[1] = v[1];
00055 debug_variable[2] = v[2];
00056 }
00057 private:
00058 DebugVariable debug_variable[3];
00059 };
00060
00061 Spectrum DebugIntegrator::Li(const Scene *scene,
00062 const RayDifferential &ray, const Sample *sample,
00063 float *alpha) const {
00064 Intersection isect;
00065 Spectrum L(0.);
00066 bool hitSomething;
00067 BSDF *bsdf = NULL;
00068
00069 if (alpha) *alpha = 1;
00070
00071 hitSomething = scene->Intersect(ray, &isect);
00072 if (hitSomething) {
00073 bsdf = isect.GetBSDF(ray);
00074 }
00075
00076 float color[3] = {0,0,0};
00077
00078 int i;
00079 for (i = 0 ; i < 3 ; i++)
00080 {
00081 if (debug_variable[i] == DEBUG_HIT_SOMETHING)
00082 {
00083 color[i] = hitSomething ? 1 : 0;
00084 }
00085 else if (debug_variable[i] == DEBUG_ONE)
00086 {
00087 color[i] = 1;
00088 }
00089 else if (debug_variable[i] == DEBUG_ZERO)
00090 {
00091 color[i] = 0;
00092 }
00093 else if (hitSomething)
00094 {
00095 switch( debug_variable[i] )
00096 {
00097 case DEBUG_U:
00098 color[i] = isect.dg.u;
00099 break;
00100 case DEBUG_V:
00101 color[i] = isect.dg.v;
00102 break;
00103 case DEBUG_GEOM_NORMAL_X:
00104 color[i] = fabsf(isect.dg.nn.x);
00105 break;
00106 case DEBUG_GEOM_NORMAL_Y:
00107 color[i] = fabsf(isect.dg.nn.y);
00108 break;
00109 case DEBUG_GEOM_NORMAL_Z:
00110 color[i] = fabsf(isect.dg.nn.z);
00111 break;
00112 case DEBUG_SHAD_NORMAL_X:
00113 color[i] = fabsf(bsdf->dgShading.nn.x);
00114 break;
00115 case DEBUG_SHAD_NORMAL_Y:
00116 color[i] = fabsf(bsdf->dgShading.nn.y);
00117 break;
00118 case DEBUG_SHAD_NORMAL_Z:
00119 color[i] = fabsf(bsdf->dgShading.nn.z);
00120 break;
00121 default:
00122 break;
00123 }
00124 }
00125 if (color[i] < 0)
00126 {
00127 Severe( "i = %d\ndebug_variable[i] = %d\nhit_something = %d\ncolor[i] = %f", i, debug_variable[i], hitSomething, color[i] );
00128 }
00129 }
00130
00131 L = Spectrum(color);
00132 return L;
00133 }
00134
00135 extern "C" DLLEXPORT SurfaceIntegrator *CreateSurfaceIntegrator(const ParamSet ¶ms)
00136 {
00137 string strs[3];
00138 strs[0] = params.FindOneString( "red", "u" );
00139 strs[1] = params.FindOneString( "green", "v" );
00140 strs[2] = params.FindOneString( "blue", "zero" );
00141
00142 DebugVariable vars[3];
00143
00144 int i;
00145 for (i = 0 ; i < 3 ; i++)
00146 {
00147 if (strs[i] == "u") { vars[i] = DEBUG_U; }
00148 else if (strs[i] == "v") { vars[i] = DEBUG_V; }
00149 else if (strs[i] == "nx") { vars[i] = DEBUG_GEOM_NORMAL_X; }
00150 else if (strs[i] == "ny") { vars[i] = DEBUG_GEOM_NORMAL_Y; }
00151 else if (strs[i] == "nz") { vars[i] = DEBUG_GEOM_NORMAL_Z; }
00152 else if (strs[i] == "snx") { vars[i] = DEBUG_SHAD_NORMAL_X; }
00153 else if (strs[i] == "sny") { vars[i] = DEBUG_SHAD_NORMAL_Y; }
00154 else if (strs[i] == "snz") { vars[i] = DEBUG_SHAD_NORMAL_Z; }
00155 else if (strs[i] == "hit") { vars[i] = DEBUG_HIT_SOMETHING; }
00156 else if (strs[i] == "zero") { vars[i] = DEBUG_ZERO; }
00157 else if (strs[i] == "one") { vars[i] = DEBUG_ONE; }
00158 else
00159 {
00160 Error( "Unknown debug type \"%s\", defaulting to zero.", strs[i].c_str() );
00161 vars[i] = DEBUG_ZERO;
00162 }
00163 }
00164
00165 return new DebugIntegrator(vars);
00166 }