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 #include "debug.h"
00029
00030 using namespace lux;
00031
00032
00033 DebugIntegrator* DebugIntegrator::clone() const
00034 {
00035 return new DebugIntegrator(*this);
00036 }
00037 Spectrum DebugIntegrator::Li(const Scene *scene,
00038 const RayDifferential &ray, const Sample *sample,
00039 float *alpha) const {
00040 Intersection isect;
00041 Spectrum L(0.);
00042 bool hitSomething;
00043 BSDF *bsdf = NULL;
00044
00045 if (alpha) *alpha = 1;
00046
00047 hitSomething = scene->Intersect(ray, &isect);
00048 if (hitSomething) {
00049 bsdf = isect.GetBSDF( ray);
00050 }
00051
00052 float color[3] = {0,0,0};
00053
00054 int i;
00055 for (i = 0 ; i < 3 ; i++)
00056 {
00057 if (debug_variable[i] == DEBUG_HIT_SOMETHING)
00058 {
00059 color[i] = hitSomething ? 1 : 0;
00060 }
00061 else if (debug_variable[i] == DEBUG_ONE)
00062 {
00063 color[i] = 1;
00064 }
00065 else if (debug_variable[i] == DEBUG_ZERO)
00066 {
00067 color[i] = 0;
00068 }
00069 else if (hitSomething)
00070 {
00071 switch( debug_variable[i] )
00072 {
00073 case DEBUG_U:
00074 color[i] = isect.dg.u;
00075 break;
00076 case DEBUG_V:
00077 color[i] = isect.dg.v;
00078 break;
00079 case DEBUG_GEOM_NORMAL_X:
00080 color[i] = fabsf(isect.dg.nn.x);
00081 break;
00082 case DEBUG_GEOM_NORMAL_Y:
00083 color[i] = fabsf(isect.dg.nn.y);
00084 break;
00085 case DEBUG_GEOM_NORMAL_Z:
00086 color[i] = fabsf(isect.dg.nn.z);
00087 break;
00088 case DEBUG_SHAD_NORMAL_X:
00089 color[i] = fabsf(bsdf->dgShading.nn.x);
00090 break;
00091 case DEBUG_SHAD_NORMAL_Y:
00092 color[i] = fabsf(bsdf->dgShading.nn.y);
00093 break;
00094 case DEBUG_SHAD_NORMAL_Z:
00095 color[i] = fabsf(bsdf->dgShading.nn.z);
00096 break;
00097 default:
00098 break;
00099 }
00100 }
00101 if (color[i] < 0)
00102 {
00103
00104 std::stringstream ss;
00105 ss<<"i = "<<i<<" debug_variable[i] = "<<debug_variable[i]<<" hit_something = "<<hitSomething<<" color[i] = "<<color[i];
00106 luxError(LUX_CONSISTENCY,LUX_SEVERE,ss.str().c_str());
00107 }
00108 }
00109
00110 L = Spectrum(color);
00111 return L;
00112 }
00113
00114 SurfaceIntegrator* DebugIntegrator::CreateSurfaceIntegrator(const ParamSet ¶ms)
00115 {
00116 string strs[3];
00117 strs[0] = params.FindOneString( "red", "u" );
00118 strs[1] = params.FindOneString( "green", "v" );
00119 strs[2] = params.FindOneString( "blue", "zero" );
00120
00121 DebugVariable vars[3];
00122
00123 int i;
00124 for (i = 0 ; i < 3 ; i++)
00125 {
00126 if (strs[i] == "u") { vars[i] = DEBUG_U; }
00127 else if (strs[i] == "v") { vars[i] = DEBUG_V; }
00128 else if (strs[i] == "nx") { vars[i] = DEBUG_GEOM_NORMAL_X; }
00129 else if (strs[i] == "ny") { vars[i] = DEBUG_GEOM_NORMAL_Y; }
00130 else if (strs[i] == "nz") { vars[i] = DEBUG_GEOM_NORMAL_Z; }
00131 else if (strs[i] == "snx") { vars[i] = DEBUG_SHAD_NORMAL_X; }
00132 else if (strs[i] == "sny") { vars[i] = DEBUG_SHAD_NORMAL_Y; }
00133 else if (strs[i] == "snz") { vars[i] = DEBUG_SHAD_NORMAL_Z; }
00134 else if (strs[i] == "hit") { vars[i] = DEBUG_HIT_SOMETHING; }
00135 else if (strs[i] == "zero") { vars[i] = DEBUG_ZERO; }
00136 else if (strs[i] == "one") { vars[i] = DEBUG_ONE; }
00137 else
00138 {
00139
00140 std::stringstream ss;
00141 ss<<"Unknown debug type '"<<strs[i]<<"' defaulting to zero.";
00142 luxError(LUX_BADTOKEN,LUX_ERROR,ss.str().c_str());
00143 vars[i] = DEBUG_ZERO;
00144 }
00145 }
00146
00147 return new DebugIntegrator(vars);
00148 }