Exemplo n.º 1
0
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());
	}
}
Exemplo n.º 2
0
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;
}