49 static const unsigned char k_RixBXMaxNumDiffuseLobes = 4;
52 static const unsigned char k_RixBXMaxNumSpecularLobes = 8;
55 static const unsigned char k_RixBXMaxNumUserLobes = 8;
58 static const unsigned char k_RixBXSubsurfaceLobeId1 = 9;
59 static const unsigned char k_RixBXSubsurfaceLobeId2 = 10;
60 static const unsigned char k_RixBXSubsurfaceLobeId3 = 11;
78 unsigned char lobeId);
129 unsigned char vLpeId,
130 unsigned char vLobeId,
131 bool vThinShadowFlag =
false);
173 unsigned char lobeId,
278 unsigned D : k_RixBXMaxNumDiffuseLobes;
279 unsigned S : k_RixBXMaxNumSpecularLobes;
280 unsigned U : k_RixBXMaxNumUserLobes;
309 false,
false,
false,
false, 0x0, 0x0, 0x0);
311 false,
true,
true,
false, 0xF, 0x0, 0x0);
313 false,
true,
true,
false, 0x0, 0xFF, 0x0);
315 false,
true,
false,
true, 0xF, 0x0, 0x0);
317 false,
true,
false,
true, 0x0, 0xFF, 0x0);
319 false,
true,
true,
true, 0xF, 0x0, 0x0);
321 false,
true,
true,
true, 0x0, 0xFF, 0x0);
323 false,
false,
false,
false, 0x0, 0x0, 0xFF);
325 false,
true,
true,
false, 0x0F, 0xFF, 0x0);
327 false,
true,
false,
true, 0x0F, 0xFF, 0x0);
329 false,
true,
true,
true, 0x0F, 0xFF, 0xFF);
341 int numSpecularLobes,
346 unsigned char diffuseLpeIds[],
347 unsigned char specularLpeIds[],
348 unsigned char userLpeIds[],
392 bool includeUserLobes =
false)
const;
398 bool includeUserLobes =
false);
402 bool includeUserLobes =
false);
411 RtColorRGB* m_diffuseLobes[k_RixBXMaxNumDiffuseLobes];
412 RtColorRGB* m_specularLobes[k_RixBXMaxNumSpecularLobes];
413 RtColorRGB* m_userLobes[k_RixBXMaxNumUserLobes];
417 unsigned char m_numDiffuseLobes;
418 unsigned char m_numSpecularLobes;
419 unsigned char m_numUserLobes;
422 unsigned char m_diffuseLpeIds[k_RixBXMaxNumDiffuseLobes];
423 unsigned char m_specularLpeIds[k_RixBXMaxNumSpecularLobes];
424 unsigned char m_userLpeIds[k_RixBXMaxNumUserLobes];
438 int numSpecularLobes,
481 bool doInitializeWeights =
true);
499 bool includeUserLobes =
false);
507 bool includeUserLobes =
false);
511 RtColorRGB* m_diffuseLobes[k_RixBXMaxNumDiffuseLobes];
512 RtColorRGB* m_specularLobes[k_RixBXMaxNumSpecularLobes];
513 RtColorRGB* m_userLobes[k_RixBXMaxNumUserLobes];
518 unsigned char m_numDiffuseLobes;
519 unsigned char m_numSpecularLobes;
520 unsigned char m_numUserLobes;
530 float const* thresholds);
624 fields.
us = serialized;
633 unsigned char vLpeId,
634 unsigned char vLobeId)
736 return (fields.
bits.
lobeId == k_RixBXSubsurfaceLobeId1 ||
737 fields.
bits.
lobeId == k_RixBXSubsurfaceLobeId2 ||
738 fields.
bits.
lobeId == k_RixBXSubsurfaceLobeId3);
835 unsigned char vLpeId,
836 unsigned char vLobeId,
837 bool vThinShadowFlag)
869 unsigned char lobeId,
872 unsigned char lpeId = 0;
875 lpeId = (
unsigned char)lpeInfo->GetLpeIdByName(
876 discrete, specular, reflect, user, lobeId, name);
897 fields.
us = serialized;
910 assert(
sizeof(fields.
bits) ==
sizeof(
unsigned));
916 fields.
bits.
D = D & 0x0F;
917 fields.
bits.
S = S & 0xFF;
918 fields.
bits.
U = U & 0xFF;
939 if (lobe.
GetLpeId() < k_RixBXMaxNumUserLobes)
1012 return static_cast<unsigned short>(fields.
bits.
D);
1018 return static_cast<unsigned short>(fields.
bits.
S);
1024 return static_cast<unsigned short>(fields.
bits.
U);
1078 fields.
bits.
D =
static_cast<unsigned>(val & 0x0F);
1084 fields.
bits.
S =
static_cast<unsigned>(val & 0xFF);
1090 fields.
bits.
U =
static_cast<unsigned>(val & 0xFF);
1137 fields.
bits.
D = 0x0F;
1138 fields.
bits.
S = 0xFF;
1139 fields.
bits.
U = 0xFF;
1159 return (fields.
bits.
D != 0) &&
1166 return (fields.
bits.
S != 0) &&
1173 return (fields.
bits.
U != 0);
1200 fields.
us &= rhs.fields.
us;
1223 fields.
us |= rhs.fields.
us;
1287 m_numDiffuseLobes(0),
1288 m_numSpecularLobes(0),
1296 int numDiffuseLobes,
1297 int numSpecularLobes,
1302 unsigned char diffuseLpeIds[],
1303 unsigned char specularLpeIds[],
1304 unsigned char userLpeIds[],
1307 m_lobeTraits(lobeTraits),
1308 m_numDiffuseLobes((unsigned char)numDiffuseLobes),
1309 m_numSpecularLobes((unsigned char)numSpecularLobes),
1310 m_numUserLobes((unsigned char)numUserLobes)
1312 for (
int i = 0; i < numDiffuseLobes; i++)
1314 m_diffuseLobes[i] = diffuseLobes[i];
1315 m_diffuseLpeIds[i] = diffuseLpeIds[i];
1318 for (
int i = 0; i < numSpecularLobes; i++)
1320 m_specularLobes[i] = specularLobes[i];
1321 m_specularLpeIds[i] = specularLpeIds[i];
1324 for (
int i = 0; i < numUserLobes; i++)
1326 m_userLobes[i] = userLobes[i];
1327 m_userLpeIds[i] = userLpeIds[i];
1334 : m_offset(that.m_offset),
1335 m_lobeTraits(that.m_lobeTraits),
1336 m_numDiffuseLobes(that.m_numDiffuseLobes),
1337 m_numSpecularLobes(that.m_numSpecularLobes),
1338 m_numUserLobes(that.m_numUserLobes)
1340 for (
int i = 0; i < m_numDiffuseLobes; i++)
1342 m_diffuseLobes[i] = that.m_diffuseLobes[i];
1343 m_diffuseLpeIds[i] = that.m_diffuseLpeIds[i];
1345 for (
int i = 0; i < m_numSpecularLobes; i++)
1347 m_specularLobes[i] = that.m_specularLobes[i];
1348 m_specularLpeIds[i] = that.m_specularLpeIds[i];
1350 for (
int i = 0; i < m_numUserLobes; i++)
1352 m_userLobes[i] = that.m_userLobes[i];
1353 m_userLpeIds[i] = that.m_userLpeIds[i];
1360 m_offset = that.m_offset;
1361 m_lobeTraits = that.m_lobeTraits;
1362 m_numDiffuseLobes = that.m_numDiffuseLobes;
1363 m_numSpecularLobes = that.m_numSpecularLobes;
1364 m_numUserLobes = that.m_numUserLobes;
1366 for (
int i = 0; i < m_numDiffuseLobes; i++)
1368 m_diffuseLobes[i] = that.m_diffuseLobes[i];
1369 m_diffuseLpeIds[i] = that.m_diffuseLpeIds[i];
1371 for (
int i = 0; i < m_numSpecularLobes; i++)
1373 m_specularLobes[i] = that.m_specularLobes[i];
1374 m_specularLpeIds[i] = that.m_specularLpeIds[i];
1376 for (
int i = 0; i < m_numUserLobes; i++)
1378 m_userLobes[i] = that.m_userLobes[i];
1379 m_userLpeIds[i] = that.m_userLpeIds[i];
1400 return m_lobeTraits;
1406 m_lobeTraits = lobes;
1412 return m_numDiffuseLobes;
1418 return m_numSpecularLobes;
1424 return m_numUserLobes;
1430 return m_diffuseLobes[i] + m_offset;
1436 return m_specularLobes[i] + m_offset;
1442 return m_userLobes[i] + m_offset;
1448 return m_diffuseLobes[i] + m_offset;
1454 return m_specularLobes[i] + m_offset;
1460 return m_userLobes[i] + m_offset;
1466 return m_diffuseLpeIds[i];
1472 return m_specularLpeIds[i];
1478 return m_userLpeIds[i];
1484 m_numDiffuseLobes = 0;
1486 m_lobeTraits &= (k_RixBXTraitsAllSpecular | k_RixBXTraitsAllUser);
1492 m_numSpecularLobes = 0;
1494 m_lobeTraits &= (k_RixBXTraitsAllDiffuse | k_RixBXTraitsAllUser);
1502 m_lobeTraits &= (k_RixBXTraitsAllDiffuse | k_RixBXTraitsAllSpecular);
1510 int idx = m_offset + index;
1511 for (
int i = 0; i < m_numDiffuseLobes; i++)
1512 sum += m_diffuseLobes[i][idx];
1513 for (
int i = 0; i < m_numSpecularLobes; i++)
1514 sum += m_specularLobes[i][idx];
1516 if (includeUserLobes)
1518 for (
int i = 0; i < m_numUserLobes; i++)
1519 sum += m_userLobes[i][idx];
1529 bool includeUserLobes)
1531 int idx = m_offset + index;
1532 for (
int i = 0; i < m_numDiffuseLobes; i++)
1533 m_diffuseLobes[i][idx] *= weight;
1534 for (
int i = 0; i < m_numSpecularLobes; i++)
1535 m_specularLobes[i][idx] *= weight;
1537 if (includeUserLobes)
1539 for (
int i = 0; i < m_numUserLobes; i++)
1540 m_userLobes[i][idx] *= weight;
1548 bool includeUserLobes)
1550 int idx = m_offset + index;
1551 for (
int i = 0; i < m_numDiffuseLobes; i++)
1552 m_diffuseLobes[i][idx] *= weight;
1553 for (
int i = 0; i < m_numSpecularLobes; i++)
1554 m_specularLobes[i][idx] *= weight;
1556 if (includeUserLobes)
1558 for (
int i = 0; i < m_numUserLobes; i++)
1559 m_userLobes[i][idx] *= weight;
1566 int idx = m_offset + index;
1567 for (
int i = 0; i < m_numDiffuseLobes; i++)
1568 m_diffuseLobes[i][idx].Zero();
1569 for (
int i = 0; i < m_numSpecularLobes; i++)
1570 m_specularLobes[i][idx].Zero();
1572 if (includeUserLobes)
1574 for (
int i = 0; i < m_numUserLobes; i++)
1575 m_userLobes[i][idx].Zero();
1587 m_numDiffuseLobes(0),
1588 m_numSpecularLobes(0),
1596 int numDiffuseLobes,
1597 int numSpecularLobes,
1603 : m_numPoints(numPoints),
1605 m_numDiffuseLobes((unsigned char)numDiffuseLobes),
1606 m_numSpecularLobes((unsigned char)numSpecularLobes),
1607 m_numUserLobes((unsigned char)numUserLobes)
1609 for (
int i = 0; i < numDiffuseLobes; i++)
1610 m_diffuseLobes[i] = diffuseLobes[i];
1612 for (
int i = 0; i < numSpecularLobes; i++)
1613 m_specularLobes[i] = specularLobes[i];
1615 for (
int i = 0; i < numUserLobes; i++)
1616 m_userLobes[i] = userLobes[i];
1621 : m_numPoints(that.m_numPoints),
1622 m_offset(that.m_offset),
1623 m_activeLobeTraits(that.m_activeLobeTraits),
1624 m_numDiffuseLobes(that.m_numDiffuseLobes),
1625 m_numSpecularLobes(that.m_numSpecularLobes),
1626 m_numUserLobes(that.m_numUserLobes)
1628 for (
int i = 0; i < m_numDiffuseLobes; i++)
1629 m_diffuseLobes[i] = that.m_diffuseLobes[i];
1631 for (
int i = 0; i < m_numSpecularLobes; i++)
1632 m_specularLobes[i] = that.m_specularLobes[i];
1634 for (
int i = 0; i < m_numUserLobes; i++)
1635 m_userLobes[i] = that.m_userLobes[i];
1641 m_numPoints = that.m_numPoints;
1642 m_offset = that.m_offset;
1643 m_activeLobeTraits = that.m_activeLobeTraits;
1644 m_numDiffuseLobes = that.m_numDiffuseLobes;
1645 m_numSpecularLobes = that.m_numSpecularLobes;
1646 m_numUserLobes = that.m_numUserLobes;
1648 for (
int i = 0; i < m_numDiffuseLobes; i++)
1649 m_diffuseLobes[i] = that.m_diffuseLobes[i];
1651 for (
int i = 0; i < m_numSpecularLobes; i++)
1652 m_specularLobes[i] = that.m_specularLobes[i];
1654 for (
int i = 0; i < m_numUserLobes; i++)
1655 m_userLobes[i] = that.m_userLobes[i];
1663 return m_diffuseLobes[i] + m_offset;
1669 return m_specularLobes[i] + m_offset;
1675 return m_userLobes[i] + m_offset;
1681 return m_diffuseLobes[i] + m_offset;
1687 return m_specularLobes[i] + m_offset;
1693 return m_userLobes[i] + m_offset;
1705 m_numPoints = numPoints;
1723 return m_activeLobeTraits;
1729 m_activeLobeTraits = lobes;
1735 m_activeLobeTraits |= lobes;
1741 return m_numDiffuseLobes;
1747 return m_numSpecularLobes;
1753 return m_numUserLobes;
1759 bool doInitializeWeights)
1767 unsigned char lpeId = lobeSampled.
GetLpeId();
1768 unsigned short traitMask;
1769 unsigned short sampleMask;
1772 p = m_userLobes[lpeId];
1773 traitMask = m_activeLobeTraits.
GetUser();
1774 sampleMask = (1U << lpeId) & 0xFFU;
1778 p = m_diffuseLobes[lpeId];
1780 sampleMask = (1U << lpeId) & 0x0FU;
1783 p = m_specularLobes[lpeId];
1785 sampleMask = (1U << lpeId) & 0xFFU;
1787 if (!(traitMask & sampleMask))
1790 m_activeLobeTraits |= traits;
1791 if (doInitializeWeights)
1792 memset(p, 0, m_numPoints *
sizeof(
RtColorRGB));
1794 return p + m_offset;
1803 r.m_numDiffuseLobes = r.m_numSpecularLobes = r.m_numUserLobes = 0;
1804 r.m_lobeTraits = m_activeLobeTraits;
1805 r.m_offset = m_offset;
1808 unsigned long lpeId;
1809 mask = m_activeLobeTraits.
GetDiffuse() & ((1 << m_numDiffuseLobes) - 1);
1814 r.m_diffuseLobes[r.m_numDiffuseLobes] = m_diffuseLobes[lpeId];
1815 r.m_diffuseLpeIds[r.m_numDiffuseLobes] = (
unsigned char)lpeId;
1816 r.m_numDiffuseLobes++;
1818 mask = m_activeLobeTraits.
GetSpecular() & ((1 << m_numSpecularLobes) - 1);
1823 r.m_specularLobes[r.m_numSpecularLobes] = m_specularLobes[lpeId];
1824 r.m_specularLpeIds[r.m_numSpecularLobes] = (
unsigned char)lpeId;
1825 r.m_numSpecularLobes++;
1827 mask = m_activeLobeTraits.
GetUser() & ((1 << m_numUserLobes) - 1);
1832 r.m_userLobes[r.m_numUserLobes] = m_userLobes[lpeId];
1833 r.m_userLpeIds[r.m_numUserLobes] = (
unsigned char)lpeId;
1844 int numDiffuseLobes = 0;
1845 int numSpecularLobes = 0;
1846 int numUserLobes = 0;
1848 RixBXLobeTraits lobes = (m_activeLobeTraits & rhs.m_activeLobeTraits);
1850 unsigned long lpeId;
1851 int nDiff = std::min(m_numDiffuseLobes, rhs.m_numDiffuseLobes);
1852 mask = lobes.
GetDiffuse() & ((1 << nDiff) - 1);
1857 activeLhs.m_diffuseLobes[numDiffuseLobes] = m_diffuseLobes[lpeId];
1858 activeRhs.m_diffuseLobes[numDiffuseLobes] = rhs.m_diffuseLobes[lpeId];
1859 activeLhs.m_diffuseLpeIds[numDiffuseLobes] = (
unsigned char)lpeId;
1860 activeRhs.m_diffuseLpeIds[numDiffuseLobes] = (
unsigned char)lpeId;
1863 int nSpec = std::min(m_numSpecularLobes, rhs.m_numSpecularLobes);
1869 activeLhs.m_specularLobes[numSpecularLobes] = m_specularLobes[lpeId];
1870 activeRhs.m_specularLobes[numSpecularLobes] = rhs.m_specularLobes[lpeId];
1871 activeLhs.m_specularLpeIds[numSpecularLobes] = (
unsigned char)lpeId;
1872 activeRhs.m_specularLpeIds[numSpecularLobes] = (
unsigned char)lpeId;
1875 int nUser = std::min(m_numUserLobes, rhs.m_numUserLobes);
1876 mask = lobes.
GetUser() & ((1 << nUser) - 1);
1881 activeLhs.m_userLobes[numUserLobes] = m_userLobes[lpeId];
1882 activeRhs.m_userLobes[numUserLobes] = rhs.m_userLobes[lpeId];
1883 activeLhs.m_userLpeIds[numUserLobes] = (
unsigned char)lpeId;
1884 activeRhs.m_userLpeIds[numUserLobes] = (
unsigned char)lpeId;
1888 activeLhs.m_offset = m_offset;
1889 activeLhs.m_lobeTraits = lobes;
1890 activeLhs.m_numDiffuseLobes = (
unsigned char)numDiffuseLobes;
1891 activeLhs.m_numSpecularLobes = (
unsigned char)numSpecularLobes;
1892 activeLhs.m_numUserLobes = (
unsigned char)numUserLobes;
1894 activeRhs.m_offset = rhs.m_offset;
1895 activeRhs.m_lobeTraits = lobes;
1896 activeRhs.m_numDiffuseLobes = (
unsigned char)numDiffuseLobes;
1897 activeRhs.m_numSpecularLobes = (
unsigned char)numSpecularLobes;
1898 activeRhs.m_numUserLobes = (
unsigned char)numUserLobes;
1905 bool includeUserLobes)
1909 for (
int i = 0; i < nDiff; i++)
1916 for (
int i = 0; i < nSpec; i++)
1922 if (includeUserLobes)
1925 for (
int i = 0; i < nUser; i++)
1937 bool includeUserLobes)
1941 for (
int i = 0; i < nDiff; i++)
1948 for (
int i = 0; i < nSpec; i++)
1954 if (includeUserLobes)
1957 for (
int i = 0; i < nUser; i++)
1967 RixBXChoose(
float const xi,
int const numThresholds,
float const* thresholds)
1970 if (xi < thresholds[0])
1975 for (
int i = 1; i < numThresholds; i++)
1977 if (thresholds[i - 1] <= xi && xi < thresholds[i])
1983 return numThresholds;
2001 int totalLobes = numDiffuse + numSpecular;
2004 const int point = 0;
2010 float importance[k_RixBXMaxNumDiffuseLobes+k_RixBXMaxNumSpecularLobes];
2011 float totalImportance = 0.f;
2013 for(
int l = 0; l < numDiffuse; l++ )
2016 float val = sqrtf(std::max(0.0f, pLobe[point].ChannelMax()));
2023 totalImportance += val;
2024 importance[l] = totalImportance;
2026 bool firstLobeIsDiffuse = nLobes > 0;
2027 for(
int l = 0; l < numSpecular; l++ )
2030 float val = sqrtf(std::max(0.0f, pLobe[point].ChannelMax()));
2037 totalImportance += val;
2038 importance[numDiffuse+l] = totalImportance;
2041 if( totalImportance == 0.f || (nLobes == 0) )
2052 bool isSpecular = !firstLobeIsDiffuse;
2061 for(
int l = 0; l < totalLobes; l++ )
2062 importance[l] /= totalImportance;
2065 int lobe =
RixBXChoose( xi, totalLobes-1, importance );
2067 if( lobe < 0 || lobe >= totalLobes )
2077 float probability = (lobe == 0) ?
2078 importance[0] : (importance[lobe] - importance[lobe-1]);
2080 bool isDiffuse = lobe < numDiffuse;
2081 if( !isDiffuse ) lobe -= numDiffuse;
2083 unsigned char lpeId = 0;
2085 for(
int l = 0; l < numDiffuse; l++ )
2088 if( isDiffuse && (l == lobe) )
2092 pDiffuse[point] /= probability;
2095 pDiffuse[point].Zero();
2098 for(
int l = 0; l < numSpecular; l++ )
2101 if( !isDiffuse && (l == lobe) )
2105 pSpec[point] /= probability;
2108 pSpec[point].Zero();
2127 for(
int i = 0; i < npoints; i++ )
2131 if( !lobeSampled[i].GetValid() )
2157 unsigned short s = (
unsigned short)(1U << chosenLobe.
GetLpeId());
2162 unsigned short d = (
unsigned short)(1U << chosenLobe.
GetLpeId());
PRMAN_INLINE bool GetReflect() const
Definition: RixBxdfLobe.h:680
PRMAN_INLINE void SetReflect(bool val)
Definition: RixBxdfLobe.h:1058
PRMAN_INLINE bool GetContinuation() const
Definition: RixBxdfLobe.h:701
Definition: RixBxdfLobe.h:332
PRMAN_INLINE void SetContinuation(bool val)
Definition: RixBxdfLobe.h:793
PRMAN_INLINE RtColorRGB const * GetDiffuseLobe(int i) const
Definition: RixBxdfLobe.h:1661
PRMAN_INLINE void SetDiffuse(unsigned short bits)
Definition: RixBxdfLobe.h:1076
PRMAN_INLINE bool HasAnySpecular() const
Returns true if any specular bits are set, and either the reflect or transmit bits are set...
Definition: RixBxdfLobe.h:1164
PRMAN_INLINE unsigned char GetSpecularLpeId(int i) const
Definition: RixBxdfLobe.h:1470
PRMAN_INLINE unsigned short GetUser() const
Definition: RixBxdfLobe.h:1022
PRMAN_INLINE bool GetValid() const
Returns true if this is a valid sample Note this is different from HasAny because a sample could be v...
Definition: RixBxdfLobe.h:974
PRMAN_INLINE RixBXActiveLobeWeights & operator=(RixBXActiveLobeWeights const &that)
Assignment.
Definition: RixBxdfLobe.h:1358
PRMAN_INLINE bool GetSolidAngle() const
Definition: RixBxdfLobe.h:662
PRMAN_INLINE bool GetContinuation() const
Definition: RixBxdfLobe.h:1004
PRMAN_INLINE void SetAll()
Set all bits to true (except for the discreteSubset and continuationSubset which are both set to zero...
Definition: RixBxdfLobe.h:1127
PRMAN_INLINE void CopyWeightAtIndex(int index, RixBXActiveLobeWeights const &src, bool includeUserLobes=false)
Definition: RixBxdfLobe.h:1902
PRMAN_INLINE unsigned int RixFindFirstSetBit(unsigned long long v)
Definition: RixShadingUtils.h:110
PRMAN_INLINE int GetOffset() const
Definition: RixBxdfLobe.h:1386
PRMAN_INLINE bool GetMaxSpecularDepth() const
Definition: RixBxdfLobe.h:1028
unsigned short specular
0 for solid angle measure, 1 for discrete measure
Definition: RixBxdfLobe.h:141
pxrcore::ColorRGB RtColorRGB
Definition: RiTypesHelper.h:520
PRMAN_INLINE bool GetEntering() const
Definition: RixBxdfLobe.h:695
PRMAN_INLINE void SetActiveLobeTraits(RixBXLobeTraits lobes)
Definition: RixBxdfLobe.h:1727
PRMAN_INLINE RtColorRGB const * GetSpecularLobe(int i) const
Definition: RixBxdfLobe.h:1667
PRMAN_INLINE RtColorRGB const * GetUserLobe(int i) const
Definition: RixBxdfLobe.h:1440
PRMAN_INLINE void SetDiscrete(bool val)
Definition: RixBxdfLobe.h:760
Rix interfaces are obtained from an RixContext.
Definition: RixInterfaces.h:172
unsigned short lobeId
specular or diffuse lobe identity
Definition: RixBxdfLobe.h:148
unsigned valid
Definition: RixBxdfLobe.h:272
PRMAN_INLINE RixBXLobeTraits GetActiveLobeTraits() const
Definition: RixBxdfLobe.h:1721
PRMAN_INLINE unsigned char GetNumDiffuseLobes() const
Definition: RixBxdfLobe.h:1410
PRMAN_INLINE bool GetDiscrete() const
Definition: RixBxdfLobe.h:656
PRMAN_INLINE void MultiplyByWeightAtIndex(int index, float weight, bool includeUserLobes=false)
Definition: RixBxdfLobe.h:1526
PRMAN_INLINE bool GetTransmit() const
Definition: RixBxdfLobe.h:998
PRMAN_INLINE RixBXLobeTraits operator|(RixBXLobeTraits const &lhs, RixBXLobeTraits const &rhs)
Bitwise OR all fields.
Definition: RixBxdfLobe.h:1255
PRMAN_INLINE bool GetValid() const
Definition: RixBxdfLobe.h:650
PRMAN_INLINE void ZeroAtIndex(int index, bool includeUserLobes=false)
Definition: RixBxdfLobe.h:1564
unsigned U
1 bit / specular lobe
Definition: RixBxdfLobe.h:280
An interface to find out information related to light path expressions (LPEs).
Definition: RixInterfaces.h:981
PRMAN_INLINE RtColorRGB * AddActiveLobe(RixBXLobeSampled lobe, bool doInitializeWeights=true)
Add a particular lobe to the set of active lobes, and also optionally zero out all of the weights...
Definition: RixBxdfLobe.h:1757
unsigned short discrete
0 means all other fields are invalid
Definition: RixBxdfLobe.h:139
PRMAN_INLINE unsigned char GetDiffuseLpeId(int i) const
Definition: RixBxdfLobe.h:1464
unsigned transmitSubset
include reflected rays
Definition: RixBxdfLobe.h:276
PRMAN_INLINE void SetUser(unsigned short bits)
Definition: RixBxdfLobe.h:1088
unsigned short valid
Definition: RixBxdfLobe.h:138
PRMAN_INLINE void ClearAllDiffuseLobes()
Definition: RixBxdfLobe.h:1482
PRMAN_INLINE unsigned short Serialize() const
Definition: RixBxdfLobe.h:853
unsigned maxspeculardepth
1 bit / user lobe
Definition: RixBxdfLobe.h:282
PRMAN_INLINE void SetMaxDiffuseDepth(bool val)
Definition: RixBxdfLobe.h:1100
PRMAN_INLINE void SetSpecular(unsigned short bits)
Definition: RixBxdfLobe.h:1082
PRMAN_INLINE bool GetTransmit(bool *entering=NULL) const
Definition: RixBxdfLobe.h:686
unsigned short thinShadow
an optional user label for the sample note that these support values greater than 8 used for subsurfa...
Definition: RixBxdfLobe.h:151
PRMAN_INLINE void SetLpeId(unsigned char val)
Definition: RixBxdfLobe.h:805
This struct represents the characteristics of just one lobe of a bxdf.
Definition: RixBxdfLobe.h:63
PRMAN_INLINE void SetContinuation(bool val)
Definition: RixBxdfLobe.h:1070
PRMAN_INLINE unsigned char GetNumUserLobes() const
Definition: RixBxdfLobe.h:1422
PRMAN_INLINE void AddActiveLobeTraits(RixBXLobeTraits lobes)
Definition: RixBxdfLobe.h:1733
unsigned solidAngleSubset
includes discrete lobe
Definition: RixBxdfLobe.h:274
Definition: RixBxdfLobe.h:428
PRMAN_INLINE int GetOffset() const
Definition: RixBxdfLobe.h:1709
PRMAN_INLINE unsigned char GetLobeId() const
Definition: RixBxdfLobe.h:725
PRMAN_INLINE bool HasAny() const
Returns true if any diffuse, specular, or user bits are set, and either the reflect, transmit, or continuation bits are set.
Definition: RixBxdfLobe.h:1143
unsigned discreteSubset
if 0, its an invalid sample
Definition: RixBxdfLobe.h:273
PRMAN_INLINE void SetTransmit(bool entering)
Definition: RixBxdfLobe.h:778
PRMAN_INLINE void SetLobeId(unsigned char val)
Definition: RixBxdfLobe.h:811
Definition: RixBxdfLobe.h:155
PRMAN_INLINE bool GetThinShadowFlag() const
Definition: RixBxdfLobe.h:742
PRMAN_INLINE void SetValid(bool val)
Definition: RixBxdfLobe.h:1040
PRMAN_INLINE int GetNumUserLobes() const
Definition: RixBxdfLobe.h:1751
PRMAN_INLINE RixBXLobeTraits operator &(RixBXLobeTraits const &lhs, RixBXLobeTraits const &rhs)
Bitwise AND all fields.
Definition: RixBxdfLobe.h:1229
PRMAN_INLINE void SetUnused(unsigned char val)
Definition: RixBxdfLobe.h:823
PRMAN_INLINE void SetUser(bool val)
Definition: RixBxdfLobe.h:799
PRMAN_INLINE bool GetUser() const
Definition: RixBxdfLobe.h:713
PRMAN_INLINE RixBXLobeWeights & operator=(RixBXLobeWeights const &that)
Assignment.
Definition: RixBxdfLobe.h:1639
unsigned D
include continuation rays
Definition: RixBxdfLobe.h:278
unsigned us
Definition: RixBxdfLobe.h:289
PRMAN_INLINE void AddWeightAtIndex(int index, RixBXActiveLobeWeights const &src, bool includeUserLobes=false)
Definition: RixBxdfLobe.h:1934
unsigned short continuation
valid only on Transmit, computed by RtRayGeometry::InitOrigination()
Definition: RixBxdfLobe.h:145
PRMAN_INLINE int GetNumPoints() const
Definition: RixBxdfLobe.h:1697
PRMAN_INLINE void GetActiveLobes(RixBXActiveLobeWeights &r) const
Return just the active lobes in the provided RixBXActiveLobeWeights.
Definition: RixBxdfLobe.h:1801
PRMAN_INLINE int RixBXChoose(float const xi, int const numThresholds, float const *thresholds)
Useful utility functions that allow an integrator to select one lobe from a set of lobe described in ...
Definition: RixBxdfLobe.h:1967
PRMAN_INLINE RixBXLobeTraits()
Constructor; initializes all fields to zero.
Definition: RixBxdfLobe.h:886
PRMAN_INLINE void SetValid(bool val)
Definition: RixBxdfLobe.h:754
PRMAN_INLINE unsigned Serialize() const
Definition: RixBxdfLobe.h:1177
PRMAN_INLINE void SetNone()
Zero all fields.
Definition: RixBxdfLobe.h:1106
PRMAN_INLINE bool GetDiscrete() const
Definition: RixBxdfLobe.h:980
virtual RixInterface * GetRixInterface(RixInterfaceId id) const =0
Get the specified interface from this context.
PRMAN_INLINE bool CompareLobeID(RixBXLobeSampled const &rhs) const
Definition: RixBxdfLobe.h:81
PRMAN_INLINE bool GetMaxDiffuseDepth() const
Definition: RixBxdfLobe.h:1034
PRMAN_INLINE bool GetDiffuse() const
Definition: RixBxdfLobe.h:668
PRMAN_INLINE int GetNumSpecularLobes() const
Definition: RixBxdfLobe.h:1745
#define PRMAN_INLINE
Definition: prmanapi.h:99
PRMAN_INLINE void GetActiveLobesIntersection(RixBXLobeWeights const &rhs, RixBXActiveLobeWeights &activeLhs, RixBXActiveLobeWeights &activeRhs) const
Return the intersection of the active lobes for both this and another RixBXLobeWeights.
Definition: RixBxdfLobe.h:1839
PRMAN_INLINE void ClearAllSpecularLobes()
Definition: RixBxdfLobe.h:1490
Definition: RixBxdfLobe.h:136
PRMAN_INLINE bool GetScattering() const
Definition: RixBxdfLobe.h:707
unsigned reflectSubset
includes solid angle (non-discrete) lobe
Definition: RixBxdfLobe.h:275
PRMAN_INLINE unsigned char GetUserLpeId(int i) const
Definition: RixBxdfLobe.h:1476
PRMAN_INLINE unsigned char GetUnused() const
Definition: RixBxdfLobe.h:748
PRMAN_INLINE bool GetSolidAngle() const
Definition: RixBxdfLobe.h:986
PRMAN_INLINE RtColorRGB const * GetSpecularLobe(int i) const
Definition: RixBxdfLobe.h:1434
PRMAN_INLINE RixBXLobeSampled RixBXLookupLobeByName(RixContext &ctx, bool discrete, bool specular, bool reflect, bool user, unsigned char lobeId, char const *name)
Use this method to return a RixBXLobeSampled struct using the name of the bxdf lobe.
Definition: RixBxdfLobe.h:863
PRMAN_INLINE void SetReflect()
Definition: RixBxdfLobe.h:772
PRMAN_INLINE bool HasAnyUser() const
Returns true if any user bits are set.
Definition: RixBxdfLobe.h:1171
unsigned maxdiffusedepth
Definition: RixBxdfLobe.h:283
PRMAN_INLINE unsigned char GetNumSpecularLobes() const
Definition: RixBxdfLobe.h:1416
PRMAN_INLINE void SetOffset(int offset)
Definition: RixBxdfLobe.h:1715
unsigned short lpeId
0 is standard, 1 is user-specific
Definition: RixBxdfLobe.h:147
PRMAN_INLINE void ClearAllUserLobes()
Definition: RixBxdfLobe.h:1498
PRMAN_INLINE void SetTransmit(bool val)
Definition: RixBxdfLobe.h:1064
PRMAN_INLINE unsigned short GetSpecular() const
Definition: RixBxdfLobe.h:1016
PRMAN_INLINE void SetMaxSpecularDepth(bool val)
Definition: RixBxdfLobe.h:1094
PRMAN_INLINE RixBXLobeTraits const & operator|=(RixBXLobeTraits const &rhs)
Bitwise OR all fields with the right-hand-side.
Definition: RixBxdfLobe.h:1206
PRMAN_INLINE void SetThinShadowFlag(bool val)
Definition: RixBxdfLobe.h:817
PRMAN_INLINE unsigned short GetDiffuse() const
Definition: RixBxdfLobe.h:1010
Definition: RixBxdfLobe.h:270
Bitfield bits
Definition: RixBxdfLobe.h:157
PRMAN_INLINE bool HasAnyDiffuse() const
Returns true if any diffuse bits are set, and either the reflect or transmit bits are set...
Definition: RixBxdfLobe.h:1157
PRMAN_INLINE RixBXActiveLobeWeights()
Constructor; sets the number of diffuse and specular lobes to zero.
Definition: RixBxdfLobe.h:1285
PRMAN_INLINE RixBXLobeTraits GetLobeTraits() const
Definition: RixBxdfLobe.h:1398
PRMAN_INLINE RixBXLobeSampled()
Constructor; initializes the valid bit to false.
Definition: RixBxdfLobe.h:600
unsigned short user
0 is scattering, 1 is continuation
Definition: RixBxdfLobe.h:146
unsigned short reflect
0 is diffuse, 1 is specular
Definition: RixBxdfLobe.h:142
PRMAN_INLINE bool HasAnyDiffSpec() const
Returns true if any diffuse or specular bits are set, and either the reflect, transmit, or continuation bits are set.
Definition: RixBxdfLobe.h:1149
PRMAN_INLINE void Set(bool vDiscrete, bool vSpecular, bool vReflect, bool vContinuation, bool vUser, unsigned char vLpeId, unsigned char vLobeId, bool vThinShadowFlag=false)
Set all fields and also sets the valid bit to true.
Definition: RixBxdfLobe.h:829
PRMAN_INLINE int GetNumDiffuseLobes() const
Definition: RixBxdfLobe.h:1739
unsigned short unused
1 to flag thin shadow, 0 otherwise
Definition: RixBxdfLobe.h:152
PRMAN_INLINE void SetOffset(int offset)
Definition: RixBxdfLobe.h:1392
PRMAN_INLINE void SetSolidAngle(bool val)
Definition: RixBxdfLobe.h:1052
This struct represents the characteristics of potentially several lobes of a bxdf in aggregate...
Definition: RixBxdfLobe.h:178
PRMAN_INLINE bool GetSpecular() const
Definition: RixBxdfLobe.h:674
PRMAN_INLINE RtColorRGB SumAtIndex(int index, bool includeUserLobes=false) const
Definition: RixBxdfLobe.h:1506
PRMAN_INLINE void SetEntering(bool entering)
Definition: RixBxdfLobe.h:785
unsigned continuationSubset
include transmitted rays
Definition: RixBxdfLobe.h:277
Definition: RixBxdfLobe.h:286
PRMAN_INLINE void SetNumPoints(int numPoints)
Definition: RixBxdfLobe.h:1703
unsigned short us
Definition: RixBxdfLobe.h:158
PRMAN_INLINE bool RixBXChooseLobe(float const xi, RixBXActiveLobeWeights &lw, RixBXLobeSampled &chosenLobe)
Selects a lobe from a set of lobe responses stored in active weights, lw.
Definition: RixBxdfLobe.h:1987
PRMAN_INLINE bool GetReflect() const
Definition: RixBxdfLobe.h:992
Bitfield bits
Definition: RixBxdfLobe.h:288
PRMAN_INLINE RixBXLobeWeights()
Constructor; sets the number of diffuse, specular, and user lobes to zero.
Definition: RixBxdfLobe.h:1584
Id for RixLPEInfo interface.
Definition: RixInterfaces.h:117
unsigned S
1 bit / diffuse lobe
Definition: RixBxdfLobe.h:279
PRMAN_INLINE void SetSpecular(bool val)
Definition: RixBxdfLobe.h:766
PRMAN_INLINE bool LobeIdIsSubsurface() const
Definition: RixBxdfLobe.h:731
PRMAN_INLINE RtColorRGB const * GetUserLobe(int i) const
Definition: RixBxdfLobe.h:1673
PRMAN_INLINE void SetDiscrete(bool val)
Definition: RixBxdfLobe.h:1046
PRMAN_INLINE RixBXLobeTraits const & operator &=(RixBXLobeTraits const &rhs)
Bitwise AND all fields with the right-hand-side.
PRMAN_INLINE unsigned char GetLpeId() const
Definition: RixBxdfLobe.h:719
PRMAN_INLINE void SetLobeTraits(RixBXLobeTraits lobes)
Definition: RixBxdfLobe.h:1404
unsigned short entering
0 is refract, 1 is reflect
Definition: RixBxdfLobe.h:143
PRMAN_INLINE RtColorRGB const * GetDiffuseLobe(int i) const
Definition: RixBxdfLobe.h:1428