MTS_NAMESPACE_BEGIN void transmittanceIntegrand(const BSDF *bsdf, const Vector &wi, size_t nPts, const Float *in, Float *out) { Intersection its; #pragma omp parallel for for (int i=0; i<(int) nPts; ++i) { BSDFQueryRecord bRec(its, wi, Vector(), EImportance); bRec.typeMask = BSDF::ETransmission; Point2 sample(in[2*i], in[2*i+1]); if (sample.x == 1) sample.x = 1-Epsilon; if (sample.y == 1) sample.y = 1-Epsilon; out[i] = bsdf->sample(bRec, sample)[0]; if (mts_isnan(out[i])) SLog(EError, "%s\n\nNaN!", bRec.toString().c_str()); } }
std::string timeString(Float time, bool precise) { std::ostringstream os; char suffix = 's'; #ifdef WIN32 if (mts_isnan(time) || std::isinf(time)) { #else if (mts_isnan(time) || std::fpclassify(time) == FP_INFINITE) { #endif return "inf"; } os << std::setprecision(precise ? 4 : 1) << std::fixed; if (time > 60) { time /= 60; suffix = 'm'; if (time > 60) { time /= 60; suffix = 'h'; if (time > 12) { time /= 12; suffix = 'd'; } } } os << time << suffix; return os.str(); } std::string randomString(Random *random, size_t size) { static const char alphanum[] = "0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"; std::string ranStr(size, 't'); for (size_t i = 0; i < size; ++i) { ranStr[i] = alphanum[ (int)(random->nextFloat() * (sizeof(alphanum) - 1)) ]; } return ranStr; } double normalQuantile(double p) { // By Peter J. Acklam // http://home.online.no/~pjacklam/notes/invnorm/impl/sprouse/ltqnorm.c static const double LOW = 0.02425; static const double HIGH = 0.97575; double q, r; /* Coefficients in rational approximations. */ static const double a[] = { -3.969683028665376e+01, 2.209460984245205e+02, -2.759285104469687e+02, 1.383577518672690e+02, -3.066479806614716e+01, 2.506628277459239e+00 }; static const double b[] = { -5.447609879822406e+01, 1.615858368580409e+02, -1.556989798598866e+02, 6.680131188771972e+01, -1.328068155288572e+01 }; static const double c[] = { -7.784894002430293e-03, -3.223964580411365e-01, -2.400758277161838e+00, -2.549732539343734e+00, 4.374664141464968e+00, 2.938163982698783e+00 }; static const double d[] = { 7.784695709041462e-03, 3.224671290700398e-01, 2.445134137142996e+00, 3.754408661907416e+00 }; errno = 0; if (p < 0 || p > 1) { errno = EDOM; return 0.0; } else if (p == 0) { errno = ERANGE; return -HUGE_VAL /* minus "infinity" */; } else if (p == 1) { errno = ERANGE; return HUGE_VAL /* "infinity" */; } else if (p < LOW) { /* Rational approximation for lower region */ q = sqrt(-2*log(p)); return (((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5]) / ((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1); } else if (p > HIGH) { /* Rational approximation for upper region */ q = sqrt(-2*log(1-p)); return -(((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5]) / ((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1); } else { /* Rational approximation for central region */ q = p - 0.5; r = q*q; return (((((a[0]*r+a[1])*r+a[2])*r+a[3])*r+a[4])*r+a[5])*q / (((((b[0]*r+b[1])*r+b[2])*r+b[3])*r+b[4])*r+1); } } Float hypot2(Float a, Float b) { Float r; if (std::abs(a) > std::abs(b)) { r = b/a; r = std::abs(a)*std::sqrt(1+r*r); } else if (b != 0) { r = a/b; r = std::abs(b)*std::sqrt(1+r*r); } else { r = 0; } return r; }