hslt: misc improved functionality:

texture formats
matrix 2x2 inversion special case (wasn't called before)
more meaningful flags on vertex.
metadata
johannes hanika 2014-11-03 17:40:20 +01:00 committed by Wenzel Jakob
parent 5d578e9c68
commit 6fb326038e
6 changed files with 52 additions and 12 deletions

View File

@ -75,7 +75,7 @@ struct RestoreMeasureHelper {
: vertex(vertex), measure(vertex->measure) { } : vertex(vertex), measure(vertex->measure) { }
~RestoreMeasureHelper() { vertex->measure = measure; } ~RestoreMeasureHelper() { vertex->measure = measure; }
PathVertex *vertex; PathVertex *vertex;
uint8_t measure; EMeasure measure;
}; };
MTS_NAMESPACE_END MTS_NAMESPACE_END

View File

@ -91,7 +91,7 @@ struct MTS_EXPORT_BIDIR PathVertex {
* *
* \sa EVertexType * \sa EVertexType
*/ */
uint8_t type : 7; EVertexType type : 7;
/** /**
* \brief Denotes whether this vertex \a only supports * \brief Denotes whether this vertex \a only supports
@ -129,7 +129,7 @@ struct MTS_EXPORT_BIDIR PathVertex {
* *
* \sa EMeasure * \sa EMeasure
*/ */
uint8_t measure; EMeasure measure : 8;
/** /**
* \brief When the current vertex supports sampling * \brief When the current vertex supports sampling

View File

@ -96,6 +96,12 @@ struct Frame {
return v.z; return v.z;
} }
/** \brief Assuming that the given direction is in the local coordinate
* system, return the u and v coordinates of the vector 'v' */
inline static Vector2 uv(const Vector &v) {
return Vector2(v.x, v.y);
}
/** \brief Assuming that the given direction is in the local coordinate /** \brief Assuming that the given direction is in the local coordinate
* system, return the squared sine of the angle between the normal and v */ * system, return the squared sine of the angle between the normal and v */
inline static Float sinTheta2(const Vector &v) { inline static Float sinTheta2(const Vector &v) {

View File

@ -37,7 +37,7 @@ public:
/** /**
* \brief Construct a new MxN matrix without initializing it. * \brief Construct a new MxN matrix without initializing it.
* *
* This construtor is useful when the matrix will either not * This constructor is useful when the matrix will either not
* be used at all (it might be part of a larger data structure) * be used at all (it might be part of a larger data structure)
* or initialized at a later point in time. Always make sure * or initialized at a later point in time. Always make sure
* that one of the two is the case! Otherwise your program will do * that one of the two is the case! Otherwise your program will do
@ -291,7 +291,7 @@ public:
* and a permutation vector piv of length m so that A(piv,:) = L*U. * and a permutation vector piv of length m so that A(piv,:) = L*U.
* If m < n, then L is m-by-m and U is m-by-n. * If m < n, then L is m-by-m and U is m-by-n.
* *
* The LU decompostion with pivoting always exists, even if the matrix is * The LU decomposition with pivoting always exists, even if the matrix is
* singular, so the constructor will never fail. * singular, so the constructor will never fail.
* The primary use of the * The primary use of the
* *
@ -361,7 +361,7 @@ public:
T cholDet() const; T cholDet() const;
/// Check if the matrix is identically zeor /// Check if the matrix is identically zero
inline bool isZero() const { inline bool isZero() const {
for (int i=0; i<M; ++i) for (int i=0; i<M; ++i)
for (int j=0; j<N; ++j) for (int j=0; j<N; ++j)
@ -489,7 +489,7 @@ public:
} }
/// Compute the inverse (Faster than Matrix::invert) /// Compute the inverse (Faster than Matrix::invert)
FINLINE bool invert(Matrix2x2 &target) const { FINLINE bool invert2x2(Matrix2x2 &target) const {
Float det = m[0][0]*m[1][1] - m[0][1]*m[1][0]; Float det = m[0][0]*m[1][1] - m[0][1]*m[1][0];
if (std::abs(det) <= RCPOVERFLOW) if (std::abs(det) <= RCPOVERFLOW)
return false; return false;
@ -500,6 +500,22 @@ public:
target.m[1][0] = -m[1][0] * invDet; target.m[1][0] = -m[1][0] * invDet;
return true; return true;
} }
FINLINE bool invert(Matrix2x2 &target) const {
return invert2x2(target);
}
/// Compute the inverse with det (Faster than Matrix::invert)
FINLINE bool invert2x2(Matrix2x2 &target, Float& det) const {
det = m[0][0]*m[1][1] - m[0][1]*m[1][0];
if(std::abs(det) <= RCPOVERFLOW)
return false;
Float invDet = 1/det;
target.m[0][0] = m[1][1] * invDet;
target.m[0][1] = -m[0][1] * invDet;
target.m[1][1] = m[0][0] * invDet;
target.m[1][0] = -m[1][0] * invDet;
return true;
}
/// Matrix-vector multiplication /// Matrix-vector multiplication
inline Vector2 operator*(const Vector2 &v) const { inline Vector2 operator*(const Vector2 &v) const {

View File

@ -167,6 +167,13 @@ struct RayDifferential : public Ray {
ryDirection = d + (ryDirection - d) * amount; ryDirection = d + (ryDirection - d) * amount;
} }
void scaleDifferentialUV(const Vector2 amountUV) {
rxOrigin = o + (rxOrigin - o) * amountUV.x;
ryOrigin = o + (ryOrigin - o) * amountUV.y;
rxDirection = d + (rxDirection - d) * amountUV.x;
ryDirection = d + (ryDirection - d) * amountUV.y;
}
inline void operator=(const RayDifferential &ray) { inline void operator=(const RayDifferential &ray) {
o = ray.o; o = ray.o;
mint = ray.mint; mint = ray.mint;

View File

@ -362,7 +362,18 @@ void GLTexture::lookupGLConstants() {
return; return;
} }
if (m_componentFormat == EFloat16) { if (m_componentFormat == EUInt8) {
switch (m_pixelFormat) {
case ELuminance: m_internalFormat = GL_LUMINANCE8; break;
case ELuminanceAlpha: m_internalFormat = GL_LUMINANCE8_ALPHA8; break;
case ERGB: m_internalFormat = GL_RGB8; break;
case ERGBA: m_internalFormat = GL_RGBA8; break;
default:
Log(EError, "Unknown/unsupported pixel format!");
return;
}
}
else if (m_componentFormat == EFloat16) {
switch (m_pixelFormat) { switch (m_pixelFormat) {
case ELuminance: m_internalFormat = GL_LUMINANCE16F_ARB; break; case ELuminance: m_internalFormat = GL_LUMINANCE16F_ARB; break;
case ELuminanceAlpha: m_internalFormat = GL_LUMINANCE_ALPHA16F_ARB; break; case ELuminanceAlpha: m_internalFormat = GL_LUMINANCE_ALPHA16F_ARB; break;