50 static const unsigned char k_RixBXMaxNumDiffuseLobes = 4;
53 static const unsigned char k_RixBXMaxNumSpecularLobes = 8;
56 static const unsigned char k_RixBXMaxNumUserLobes = 12;
59 static const unsigned char k_RixBXSubsurfaceLobeId1 = 9;
60 static const unsigned char k_RixBXSubsurfaceLobeId2 = 10;
61 static const unsigned char k_RixBXSubsurfaceLobeId3 = 11;
79 unsigned char lobeId);
130 unsigned char vLpeId,
131 unsigned char vLobeId,
132 bool vThinShadowFlag =
false);
264 PRMAN_INLINE RixBXLobeTraits
const& operator&=(RixBXLobeTraits
const& rhs);
267 PRMAN_INLINE RixBXLobeTraits
const& operator|=(RixBXLobeTraits
const& rhs);
277 unsigned D : k_RixBXMaxNumDiffuseLobes;
278 unsigned S : k_RixBXMaxNumSpecularLobes;
279 unsigned U : k_RixBXMaxNumUserLobes;
308 false,
false,
false,
false, 0x0, 0x0, 0x0);
310 false,
true,
true,
false, 0xF, 0x0, 0x0);
312 false,
true,
true,
false, 0x0, 0xFF, 0x0);
314 false,
true,
false,
true, 0xF, 0x0, 0x0);
316 false,
true,
false,
true, 0x0, 0xFF, 0x0);
318 false,
true,
true,
true, 0xF, 0x0, 0x0);
320 false,
true,
true,
true, 0x0, 0xFF, 0x0);
322 false,
false,
false,
false, 0x0, 0x0, 0xFFF);
324 false,
true,
true,
false, 0x0F, 0xFF, 0x0);
326 false,
true,
false,
true, 0x0F, 0xFF, 0x0);
328 false,
true,
true,
true, 0x0F, 0xFF, 0xFFF);
340 int numSpecularLobes,
345 unsigned char diffuseLpeIds[],
346 unsigned char specularLpeIds[],
347 unsigned char userLpeIds[],
351 PRMAN_INLINE RixBXActiveLobeWeights(RixBXActiveLobeWeights
const& that);
355 RixBXActiveLobeWeights
const& that);
384 PRMAN_INLINE unsigned char GetDiffuseLpeId(
int i)
const;
385 PRMAN_INLINE unsigned char GetSpecularLpeId(
int i)
const;
391 bool includeUserLobes =
false)
const;
397 bool includeUserLobes =
false);
401 bool includeUserLobes =
false);
404 PRMAN_INLINE void ZeroAtIndex(
int index,
bool includeUserLobes =
false);
410 RtColorRGB* m_diffuseLobes[k_RixBXMaxNumDiffuseLobes];
411 RtColorRGB* m_specularLobes[k_RixBXMaxNumSpecularLobes];
412 RtColorRGB* m_userLobes[k_RixBXMaxNumUserLobes];
416 unsigned char m_numDiffuseLobes;
417 unsigned char m_numSpecularLobes;
418 unsigned char m_numUserLobes;
421 unsigned char m_diffuseLpeIds[k_RixBXMaxNumDiffuseLobes];
422 unsigned char m_specularLpeIds[k_RixBXMaxNumSpecularLobes];
423 unsigned char m_userLpeIds[k_RixBXMaxNumUserLobes];
437 int numSpecularLobes,
445 PRMAN_INLINE RixBXLobeWeights(RixBXLobeWeights
const& that);
448 PRMAN_INLINE RixBXLobeWeights& operator=(RixBXLobeWeights
const& that);
480 bool doInitializeWeights =
true);
488 RixBXLobeWeights
const& rhs,
498 bool includeUserLobes =
false);
506 bool includeUserLobes =
false);
510 RtColorRGB* m_diffuseLobes[k_RixBXMaxNumDiffuseLobes];
511 RtColorRGB* m_specularLobes[k_RixBXMaxNumSpecularLobes];
512 RtColorRGB* m_userLobes[k_RixBXMaxNumUserLobes];
517 unsigned char m_numDiffuseLobes;
518 unsigned char m_numSpecularLobes;
519 unsigned char m_numUserLobes;
529 float const* thresholds);
623 fields.us = serialized;
632 unsigned char vLpeId,
633 unsigned char vLobeId)
635 fields.bits.valid = 1;
636 fields.bits.discrete = vDiscrete;
637 fields.bits.specular = vSpecular;
638 fields.bits.reflect = vReflect;
639 fields.bits.entering = 0;
640 fields.bits.continuation = 0;
641 fields.bits.user = vUser;
642 fields.bits.lpeId = vLpeId & 0x7;
643 fields.bits.lobeId = vLobeId & 0xF;
644 fields.bits.thinShadow = 0;
645 fields.bits.unused = 0;
651 return fields.bits.valid;
657 return fields.bits.valid && fields.bits.discrete;
663 return fields.bits.valid && !fields.bits.discrete;
669 return fields.bits.valid && !fields.bits.specular;
675 return fields.bits.valid && fields.bits.specular;
681 return fields.bits.valid && fields.bits.reflect;
687 bool transmit = fields.bits.valid && !fields.bits.reflect;
689 *vEntering = fields.bits.entering && transmit;
696 return fields.bits.valid && !fields.bits.reflect && fields.bits.entering;
702 return fields.bits.valid && fields.bits.continuation;
708 return fields.bits.valid && !fields.bits.continuation;
714 return fields.bits.valid && fields.bits.user;
720 return (
unsigned char)(fields.bits.valid ? fields.bits.lpeId : 0);
726 return (
unsigned char)(fields.bits.valid ? fields.bits.lobeId : 0);
732 if (!fields.bits.valid)
735 return (fields.bits.lobeId == k_RixBXSubsurfaceLobeId1 ||
736 fields.bits.lobeId == k_RixBXSubsurfaceLobeId2 ||
737 fields.bits.lobeId == k_RixBXSubsurfaceLobeId3);
743 return fields.bits.valid && fields.bits.thinShadow;
749 return (
unsigned char)(fields.bits.valid ? fields.bits.unused : 0);
755 fields.bits.valid = val;
761 fields.bits.discrete = val;
767 fields.bits.specular = val;
773 fields.bits.reflect = 1;
779 fields.bits.reflect = 0;
780 fields.bits.entering = val;
787 assert(fields.bits.reflect == 0);
788 fields.bits.entering = val;
794 fields.bits.continuation = val;
800 fields.bits.user = val;
806 fields.bits.lpeId = val & 0x7;
812 fields.bits.lobeId = val & 0xF;
818 fields.bits.thinShadow = val;
824 fields.bits.unused = val & 0x1;
834 unsigned char vLpeId,
835 unsigned char vLobeId,
836 bool vThinShadowFlag)
838 fields.bits.valid = 1;
839 fields.bits.discrete = vDiscrete;
840 fields.bits.specular = vSpecular;
841 fields.bits.reflect = vReflect;
842 fields.bits.continuation = vContinuation;
843 fields.bits.entering = 0;
844 fields.bits.user = vUser;
845 fields.bits.lpeId = vLpeId & 0x7;
846 fields.bits.lobeId = vLobeId & 0xF;
847 fields.bits.thinShadow = vThinShadowFlag;
848 fields.bits.unused = 0;
871 unsigned char lpeId = 0;
874 lpeId = (
unsigned char)lpeInfo->GetLpeIdByName(
875 discrete, specular, reflect, user, lobeId, name);
889 fields.bits.valid = 1;
896 fields.us = serialized;
909 assert(
sizeof(fields.bits) ==
sizeof(
unsigned));
910 fields.bits.discreteSubset =
discrete;
911 fields.bits.solidAngleSubset = solidAngle;
912 fields.bits.reflectSubset =
reflect;
913 fields.bits.transmitSubset = transmit;
914 fields.bits.continuationSubset = 0;
915 fields.bits.D = D & 0x0F;
916 fields.bits.S = S & 0xFF;
917 fields.bits.U = U & 0xFFF;
918 fields.bits.maxspeculardepth = 0;
919 fields.bits.maxdiffusedepth = 0;
920 fields.bits.valid = 1;
930 fields.bits.discreteSubset = 0;
931 fields.bits.solidAngleSubset = 0;
932 fields.bits.reflectSubset = 0;
933 fields.bits.transmitSubset = 0;
934 fields.bits.continuationSubset = 0;
938 if (lobe.
GetLpeId() < k_RixBXMaxNumUserLobes)
939 fields.bits.U = (1 << lobe.
GetLpeId()) & 0xFFF;
947 fields.bits.reflectSubset = lobe.
GetReflect();
952 fields.bits.D = (1 << lobe.
GetLpeId()) & 0x0F;
956 fields.bits.S = (1 << lobe.
GetLpeId()) & 0xFF;
968 fields.bits.maxspeculardepth = 0;
969 fields.bits.maxdiffusedepth = 0;
975 return fields.bits.valid;
981 return fields.bits.discreteSubset;
987 return fields.bits.solidAngleSubset;
993 return fields.bits.reflectSubset;
999 return fields.bits.transmitSubset;
1005 return fields.bits.continuationSubset;
1011 return static_cast<unsigned short>(fields.bits.D);
1017 return static_cast<unsigned short>(fields.bits.S);
1023 return static_cast<unsigned short>(fields.bits.U);
1029 return fields.bits.maxspeculardepth;
1035 return fields.bits.maxdiffusedepth;
1041 fields.bits.valid = val;
1047 fields.bits.discreteSubset = val;
1053 fields.bits.solidAngleSubset = val;
1059 fields.bits.reflectSubset = val;
1065 fields.bits.transmitSubset = val;
1071 fields.bits.continuationSubset = val;
1077 fields.bits.D =
static_cast<unsigned>(val & 0x0F);
1083 fields.bits.S =
static_cast<unsigned>(val & 0xFF);
1089 fields.bits.U =
static_cast<unsigned>(val & 0xFFF);
1095 fields.bits.maxspeculardepth = val;
1101 fields.bits.maxdiffusedepth = val;
1128 fields.bits.valid = 1;
1129 fields.bits.discreteSubset = 0;
1130 fields.bits.solidAngleSubset = 1;
1131 fields.bits.reflectSubset = 1;
1132 fields.bits.transmitSubset = 1;
1133 fields.bits.continuationSubset = 0;
1134 fields.bits.maxspeculardepth = 0;
1135 fields.bits.maxdiffusedepth = 0;
1136 fields.bits.D = 0x0F;
1137 fields.bits.S = 0xFF;
1138 fields.bits.U = 0xFFF;
1144 return HasAnyDiffSpec() || HasAnyUser();
1150 return (fields.bits.D | fields.bits.S) &&
1151 (fields.bits.reflectSubset | fields.bits.transmitSubset |
1152 fields.bits.continuationSubset);
1158 return (fields.bits.D != 0) &&
1159 (fields.bits.reflectSubset || fields.bits.transmitSubset);
1165 return (fields.bits.S != 0) &&
1166 (fields.bits.reflectSubset || fields.bits.transmitSubset);
1172 return (fields.bits.U != 0);
1199 fields.us &= rhs.fields.
us;
1222 fields.us |= rhs.fields.
us;
1286 m_numDiffuseLobes(0),
1287 m_numSpecularLobes(0),
1295 int numDiffuseLobes,
1296 int numSpecularLobes,
1301 unsigned char diffuseLpeIds[],
1302 unsigned char specularLpeIds[],
1303 unsigned char userLpeIds[],
1306 m_lobeTraits(lobeTraits),
1307 m_numDiffuseLobes((unsigned char)numDiffuseLobes),
1308 m_numSpecularLobes((unsigned char)numSpecularLobes),
1309 m_numUserLobes((unsigned char)numUserLobes)
1311 for (
int i = 0; i < numDiffuseLobes; i++)
1313 m_diffuseLobes[i] = diffuseLobes[i];
1314 m_diffuseLpeIds[i] = diffuseLpeIds[i];
1317 for (
int i = 0; i < numSpecularLobes; i++)
1319 m_specularLobes[i] = specularLobes[i];
1320 m_specularLpeIds[i] = specularLpeIds[i];
1323 for (
int i = 0; i < numUserLobes; i++)
1325 m_userLobes[i] = userLobes[i];
1326 m_userLpeIds[i] = userLpeIds[i];
1333 : m_offset(that.m_offset),
1334 m_lobeTraits(that.m_lobeTraits),
1335 m_numDiffuseLobes(that.m_numDiffuseLobes),
1336 m_numSpecularLobes(that.m_numSpecularLobes),
1337 m_numUserLobes(that.m_numUserLobes)
1339 for (
int i = 0; i < m_numDiffuseLobes; i++)
1341 m_diffuseLobes[i] = that.m_diffuseLobes[i];
1342 m_diffuseLpeIds[i] = that.m_diffuseLpeIds[i];
1344 for (
int i = 0; i < m_numSpecularLobes; i++)
1346 m_specularLobes[i] = that.m_specularLobes[i];
1347 m_specularLpeIds[i] = that.m_specularLpeIds[i];
1349 for (
int i = 0; i < m_numUserLobes; i++)
1351 m_userLobes[i] = that.m_userLobes[i];
1352 m_userLpeIds[i] = that.m_userLpeIds[i];
1359 m_offset = that.m_offset;
1360 m_lobeTraits = that.m_lobeTraits;
1361 m_numDiffuseLobes = that.m_numDiffuseLobes;
1362 m_numSpecularLobes = that.m_numSpecularLobes;
1363 m_numUserLobes = that.m_numUserLobes;
1365 for (
int i = 0; i < m_numDiffuseLobes; i++)
1367 m_diffuseLobes[i] = that.m_diffuseLobes[i];
1368 m_diffuseLpeIds[i] = that.m_diffuseLpeIds[i];
1370 for (
int i = 0; i < m_numSpecularLobes; i++)
1372 m_specularLobes[i] = that.m_specularLobes[i];
1373 m_specularLpeIds[i] = that.m_specularLpeIds[i];
1375 for (
int i = 0; i < m_numUserLobes; i++)
1377 m_userLobes[i] = that.m_userLobes[i];
1378 m_userLpeIds[i] = that.m_userLpeIds[i];
1399 return m_lobeTraits;
1405 m_lobeTraits = lobes;
1411 return m_numDiffuseLobes;
1417 return m_numSpecularLobes;
1423 return m_numUserLobes;
1429 return m_diffuseLobes[i] + m_offset;
1435 return m_specularLobes[i] + m_offset;
1441 return m_userLobes[i] + m_offset;
1447 return m_diffuseLobes[i] + m_offset;
1453 return m_specularLobes[i] + m_offset;
1459 return m_userLobes[i] + m_offset;
1465 return m_diffuseLpeIds[i];
1471 return m_specularLpeIds[i];
1477 return m_userLpeIds[i];
1483 m_numDiffuseLobes = 0;
1485 m_lobeTraits &= (k_RixBXTraitsAllSpecular | k_RixBXTraitsAllUser);
1491 m_numSpecularLobes = 0;
1493 m_lobeTraits &= (k_RixBXTraitsAllDiffuse | k_RixBXTraitsAllUser);
1501 m_lobeTraits &= (k_RixBXTraitsAllDiffuse | k_RixBXTraitsAllSpecular);
1509 int idx = m_offset + index;
1510 for (
int i = 0; i < m_numDiffuseLobes; i++)
1511 sum += m_diffuseLobes[i][idx];
1512 for (
int i = 0; i < m_numSpecularLobes; i++)
1513 sum += m_specularLobes[i][idx];
1515 if (includeUserLobes)
1517 for (
int i = 0; i < m_numUserLobes; i++)
1518 sum += m_userLobes[i][idx];
1528 bool includeUserLobes)
1530 int idx = m_offset + index;
1531 for (
int i = 0; i < m_numDiffuseLobes; i++)
1532 m_diffuseLobes[i][idx] *= weight;
1533 for (
int i = 0; i < m_numSpecularLobes; i++)
1534 m_specularLobes[i][idx] *= weight;
1536 if (includeUserLobes)
1538 for (
int i = 0; i < m_numUserLobes; i++)
1539 m_userLobes[i][idx] *= weight;
1547 bool includeUserLobes)
1549 int idx = m_offset + index;
1550 for (
int i = 0; i < m_numDiffuseLobes; i++)
1551 m_diffuseLobes[i][idx] *= weight;
1552 for (
int i = 0; i < m_numSpecularLobes; i++)
1553 m_specularLobes[i][idx] *= weight;
1555 if (includeUserLobes)
1557 for (
int i = 0; i < m_numUserLobes; i++)
1558 m_userLobes[i][idx] *= weight;
1565 int idx = m_offset + index;
1566 for (
int i = 0; i < m_numDiffuseLobes; i++)
1567 m_diffuseLobes[i][idx].Zero();
1568 for (
int i = 0; i < m_numSpecularLobes; i++)
1569 m_specularLobes[i][idx].Zero();
1571 if (includeUserLobes)
1573 for (
int i = 0; i < m_numUserLobes; i++)
1574 m_userLobes[i][idx].Zero();
1586 m_numDiffuseLobes(0),
1587 m_numSpecularLobes(0),
1595 int numDiffuseLobes,
1596 int numSpecularLobes,
1602 : m_numPoints(numPoints),
1604 m_numDiffuseLobes((unsigned char)numDiffuseLobes),
1605 m_numSpecularLobes((unsigned char)numSpecularLobes),
1606 m_numUserLobes((unsigned char)numUserLobes)
1608 for (
int i = 0; i < numDiffuseLobes; i++)
1609 m_diffuseLobes[i] = diffuseLobes[i];
1611 for (
int i = 0; i < numSpecularLobes; i++)
1612 m_specularLobes[i] = specularLobes[i];
1614 for (
int i = 0; i < numUserLobes; i++)
1615 m_userLobes[i] = userLobes[i];
1620 : m_numPoints(that.m_numPoints),
1621 m_offset(that.m_offset),
1622 m_activeLobeTraits(that.m_activeLobeTraits),
1623 m_numDiffuseLobes(that.m_numDiffuseLobes),
1624 m_numSpecularLobes(that.m_numSpecularLobes),
1625 m_numUserLobes(that.m_numUserLobes)
1627 for (
int i = 0; i < m_numDiffuseLobes; i++)
1628 m_diffuseLobes[i] = that.m_diffuseLobes[i];
1630 for (
int i = 0; i < m_numSpecularLobes; i++)
1631 m_specularLobes[i] = that.m_specularLobes[i];
1633 for (
int i = 0; i < m_numUserLobes; i++)
1634 m_userLobes[i] = that.m_userLobes[i];
1640 m_numPoints = that.m_numPoints;
1641 m_offset = that.m_offset;
1642 m_activeLobeTraits = that.m_activeLobeTraits;
1643 m_numDiffuseLobes = that.m_numDiffuseLobes;
1644 m_numSpecularLobes = that.m_numSpecularLobes;
1645 m_numUserLobes = that.m_numUserLobes;
1647 for (
int i = 0; i < m_numDiffuseLobes; i++)
1648 m_diffuseLobes[i] = that.m_diffuseLobes[i];
1650 for (
int i = 0; i < m_numSpecularLobes; i++)
1651 m_specularLobes[i] = that.m_specularLobes[i];
1653 for (
int i = 0; i < m_numUserLobes; i++)
1654 m_userLobes[i] = that.m_userLobes[i];
1662 return m_diffuseLobes[i] + m_offset;
1668 return m_specularLobes[i] + m_offset;
1674 return m_userLobes[i] + m_offset;
1680 return m_diffuseLobes[i] + m_offset;
1686 return m_specularLobes[i] + m_offset;
1692 return m_userLobes[i] + m_offset;
1704 m_numPoints = numPoints;
1722 return m_activeLobeTraits;
1728 m_activeLobeTraits = lobes;
1734 m_activeLobeTraits |= lobes;
1740 return m_numDiffuseLobes;
1746 return m_numSpecularLobes;
1752 return m_numUserLobes;
1758 bool doInitializeWeights)
1766 unsigned char lpeId = lobeSampled.
GetLpeId();
1767 unsigned short traitMask;
1768 unsigned short sampleMask;
1771 p = m_userLobes[lpeId];
1772 traitMask = m_activeLobeTraits.
GetUser();
1773 sampleMask = (1U << lpeId) & 0xFFFFU;
1777 p = m_diffuseLobes[lpeId];
1779 sampleMask = (1U << lpeId) & 0x0FU;
1782 p = m_specularLobes[lpeId];
1784 sampleMask = (1U << lpeId) & 0xFFU;
1786 if (!(traitMask & sampleMask))
1789 m_activeLobeTraits |= traits;
1790 if (doInitializeWeights)
1791 memset(p, 0, m_numPoints *
sizeof(
RtColorRGB));
1793 return p + m_offset;
1802 r.m_numDiffuseLobes = r.m_numSpecularLobes = r.m_numUserLobes = 0;
1803 r.m_lobeTraits = m_activeLobeTraits;
1804 r.m_offset = m_offset;
1807 unsigned long lpeId;
1808 mask = m_activeLobeTraits.
GetDiffuse() & ((1 << m_numDiffuseLobes) - 1);
1813 r.m_diffuseLobes[r.m_numDiffuseLobes] = m_diffuseLobes[lpeId];
1814 r.m_diffuseLpeIds[r.m_numDiffuseLobes] = (
unsigned char)lpeId;
1815 r.m_numDiffuseLobes++;
1817 mask = m_activeLobeTraits.
GetSpecular() & ((1 << m_numSpecularLobes) - 1);
1822 r.m_specularLobes[r.m_numSpecularLobes] = m_specularLobes[lpeId];
1823 r.m_specularLpeIds[r.m_numSpecularLobes] = (
unsigned char)lpeId;
1824 r.m_numSpecularLobes++;
1826 mask = m_activeLobeTraits.
GetUser() & ((1 << m_numUserLobes) - 1);
1831 r.m_userLobes[r.m_numUserLobes] = m_userLobes[lpeId];
1832 r.m_userLpeIds[r.m_numUserLobes] = (
unsigned char)lpeId;
1843 int numDiffuseLobes = 0;
1844 int numSpecularLobes = 0;
1845 int numUserLobes = 0;
1847 RixBXLobeTraits lobes = (m_activeLobeTraits & rhs.m_activeLobeTraits);
1849 unsigned long lpeId;
1850 int nDiff = std::min(m_numDiffuseLobes, rhs.m_numDiffuseLobes);
1851 mask = lobes.
GetDiffuse() & ((1 << nDiff) - 1);
1856 activeLhs.m_diffuseLobes[numDiffuseLobes] = m_diffuseLobes[lpeId];
1857 activeRhs.m_diffuseLobes[numDiffuseLobes] = rhs.m_diffuseLobes[lpeId];
1858 activeLhs.m_diffuseLpeIds[numDiffuseLobes] = (
unsigned char)lpeId;
1859 activeRhs.m_diffuseLpeIds[numDiffuseLobes] = (
unsigned char)lpeId;
1862 int nSpec = std::min(m_numSpecularLobes, rhs.m_numSpecularLobes);
1868 activeLhs.m_specularLobes[numSpecularLobes] = m_specularLobes[lpeId];
1869 activeRhs.m_specularLobes[numSpecularLobes] = rhs.m_specularLobes[lpeId];
1870 activeLhs.m_specularLpeIds[numSpecularLobes] = (
unsigned char)lpeId;
1871 activeRhs.m_specularLpeIds[numSpecularLobes] = (
unsigned char)lpeId;
1874 int nUser = std::min(m_numUserLobes, rhs.m_numUserLobes);
1875 mask = lobes.
GetUser() & ((1 << nUser) - 1);
1880 activeLhs.m_userLobes[numUserLobes] = m_userLobes[lpeId];
1881 activeRhs.m_userLobes[numUserLobes] = rhs.m_userLobes[lpeId];
1882 activeLhs.m_userLpeIds[numUserLobes] = (
unsigned char)lpeId;
1883 activeRhs.m_userLpeIds[numUserLobes] = (
unsigned char)lpeId;
1887 activeLhs.m_offset = m_offset;
1888 activeLhs.m_lobeTraits = lobes;
1889 activeLhs.m_numDiffuseLobes = (
unsigned char)numDiffuseLobes;
1890 activeLhs.m_numSpecularLobes = (
unsigned char)numSpecularLobes;
1891 activeLhs.m_numUserLobes = (
unsigned char)numUserLobes;
1893 activeRhs.m_offset = rhs.m_offset;
1894 activeRhs.m_lobeTraits = lobes;
1895 activeRhs.m_numDiffuseLobes = (
unsigned char)numDiffuseLobes;
1896 activeRhs.m_numSpecularLobes = (
unsigned char)numSpecularLobes;
1897 activeRhs.m_numUserLobes = (
unsigned char)numUserLobes;
1904 bool includeUserLobes)
1908 for (
int i = 0; i < nDiff; i++)
1915 for (
int i = 0; i < nSpec; i++)
1921 if (includeUserLobes)
1924 for (
int i = 0; i < nUser; i++)
1936 bool includeUserLobes)
1940 for (
int i = 0; i < nDiff; i++)
1947 for (
int i = 0; i < nSpec; i++)
1953 if (includeUserLobes)
1956 for (
int i = 0; i < nUser; i++)
1966 RixBXChoose(
float const xi,
int const numThresholds,
float const* thresholds)
1969 if (xi < thresholds[0])
1974 for (
int i = 1; i < numThresholds; i++)
1976 if (thresholds[i - 1] <= xi && xi < thresholds[i])
1982 return numThresholds;
1993 int totalLobes = numDiffuse + numSpecular;
1996 const int point = 0;
2002 float importance[k_RixBXMaxNumDiffuseLobes+k_RixBXMaxNumSpecularLobes];
2003 float totalImportance = 0.f;
2005 for(
int l = 0; l < numDiffuse; l++ )
2008 float lum = pLobe[point].Luminance();
2015 totalImportance += lum;
2016 importance[l] = totalImportance;
2018 bool firstLobeIsDiffuse = nLobes > 0;
2019 for(
int l = 0; l < numSpecular; l++ )
2022 float lum = pLobe[point].Luminance();
2029 totalImportance += lum;
2030 importance[numDiffuse+l] = totalImportance;
2033 if( totalImportance == 0.f || (nLobes == 0) )
2044 bool isSpecular = !firstLobeIsDiffuse;
2053 for(
int l = 0; l < totalLobes; l++ )
2054 importance[l] /= totalImportance;
2057 int lobe =
RixBXChoose( xi, totalLobes-1, importance );
2059 if( lobe < 0 || lobe >= totalLobes )
2069 float probability = (lobe == 0) ?
2070 importance[0] : (importance[lobe] - importance[lobe-1]);
2072 bool isDiffuse = lobe < numDiffuse;
2073 if( !isDiffuse ) lobe -= numDiffuse;
2075 unsigned char lpeId = 0;
2077 for(
int l = 0; l < numDiffuse; l++ )
2080 if( isDiffuse && (l == lobe) )
2084 pDiffuse[point] /= probability;
2087 pDiffuse[point].Zero();
2090 for(
int l = 0; l < numSpecular; l++ )
2093 if( !isDiffuse && (l == lobe) )
2097 pSpec[point] /= probability;
2100 pSpec[point].Zero();
2119 for(
int i = 0; i < npoints; i++ )
2123 if( !lobeSampled[i].GetValid() )
2149 unsigned short s = (
unsigned short)(1U << chosenLobe.
GetLpeId());
2154 unsigned short d = (
unsigned short)(1U << chosenLobe.
GetLpeId());
PRMAN_INLINE void SetLpeId(unsigned char val)
PRMAN_INLINE unsigned char GetUnused() const
PRMAN_INLINE bool GetThinShadowFlag() const
unsigned reflectSubset
includes solid angle (non-discrete) lobe
PRMAN_INLINE bool GetMaxDiffuseDepth() const
PRMAN_INLINE void SetDiscrete(bool val)
PRMAN_INLINE void ClearAllUserLobes()
PRMAN_INLINE bool GetContinuation() const
PRMAN_INLINE bool HasAnyDiffSpec() const
PRMAN_INLINE void SetUser(bool val)
pxrcore::ColorRGB RtColorRGB
PRMAN_INLINE bool HasAnyUser() const
Returns true if any user bits are set.
PRMAN_INLINE bool GetSpecular() const
PRMAN_INLINE RixBXActiveLobeWeights()
Constructor; sets the number of diffuse and specular lobes to zero.
PRMAN_INLINE bool GetValid() const
PRMAN_INLINE void AddWeightAtIndex(int index, RixBXActiveLobeWeights const &src, bool includeUserLobes=false)
PRMAN_INLINE RixBXLobeWeights & operator=(RixBXLobeWeights const &that)
Assignment.
PRMAN_INLINE bool HasAnyDiffuse() const
PRMAN_INLINE void SetUnused(unsigned char val)
unsigned S
1 bit / diffuse lobe
PRMAN_INLINE bool GetDiscrete() const
This struct represents the characteristics of just one lobe of a bxdf.
PRMAN_INLINE RtColorRGB SumAtIndex(int index, bool includeUserLobes=false) const
PRMAN_INLINE void GetActiveLobesIntersection(RixBXLobeWeights const &rhs, RixBXActiveLobeWeights &activeLhs, RixBXActiveLobeWeights &activeRhs) const
PRMAN_INLINE void SetValid(bool val)
PRMAN_INLINE bool GetSolidAngle() const
unsigned continuationSubset
include transmitted rays
PRMAN_INLINE bool GetDiffuse() const
unsigned maxspeculardepth
1 bit / user lobe
PRMAN_INLINE void SetUser(unsigned short bits)
unsigned discreteSubset
if 0, its an invalid sample
PRMAN_INLINE void SetActiveLobeTraits(RixBXLobeTraits lobes)
PRMAN_INLINE int GetNumUserLobes() const
unsigned U
1 bit / specular lobe
PRMAN_INLINE int GetNumDiffuseLobes() const
unsigned solidAngleSubset
includes discrete lobe
PRMAN_INLINE void AddActiveLobeTraits(RixBXLobeTraits lobes)
PRMAN_INLINE unsigned int RixFindFirstSetBit(unsigned long long v)
PRMAN_INLINE unsigned char GetLobeId() const
PRMAN_INLINE int GetOffset() const
PRMAN_INLINE int GetOffset() const
PRMAN_INLINE void SetContinuation(bool val)
PRMAN_INLINE RtColorRGB const * GetUserLobe(int i) const
PRMAN_INLINE bool GetDiscrete() const
PRMAN_INLINE bool GetMaxSpecularDepth() const
PRMAN_INLINE RixBXLobeTraits GetLobeTraits() const
PRMAN_INLINE bool GetContinuation() const
PRMAN_INLINE RixBXLobeTraits()
Constructor; initializes all fields to zero.
unsigned short continuation
PRMAN_INLINE void SetSpecular(unsigned short bits)
PRMAN_INLINE bool HasAny() const
PRMAN_INLINE unsigned char GetDiffuseLpeId(int i) const
PRMAN_INLINE unsigned short GetUser() const
unsigned short lpeId
0 is standard, 1 is user-specific
unsigned D
include continuation rays
PRMAN_INLINE bool GetTransmit(bool *entering=NULL) const
PRMAN_INLINE void CopyWeightAtIndex(int index, RixBXActiveLobeWeights const &src, bool includeUserLobes=false)
PRMAN_INLINE void SetTransmit(bool val)
PRMAN_INLINE void SetContinuation(bool val)
PRMAN_INLINE unsigned char GetNumSpecularLobes() const
PRMAN_INLINE void SetAll()
PRMAN_INLINE RixBXLobeTraits operator &(RixBXLobeTraits const &lhs, RixBXLobeTraits const &rhs)
Bitwise AND all fields.
PRMAN_INLINE void SetMaxSpecularDepth(bool val)
PRMAN_INLINE unsigned char GetLpeId() const
PRMAN_INLINE void MultiplyByWeightAtIndex(int index, float weight, bool includeUserLobes=false)
PRMAN_INLINE void SetNumPoints(int numPoints)
PRMAN_INLINE RixBXLobeSampled()
Constructor; initializes the valid bit to false.
PRMAN_INLINE void SetLobeTraits(RixBXLobeTraits lobes)
PRMAN_INLINE RixBXActiveLobeWeights & operator=(RixBXActiveLobeWeights const &that)
Assignment.
unsigned transmitSubset
include reflected rays
PRMAN_INLINE bool GetValid() const
PRMAN_INLINE RixBXLobeWeights()
PRMAN_INLINE void SetDiffuse(unsigned short bits)
unsigned short lobeId
specular or diffuse lobe identity
PRMAN_INLINE RixBXLobeTraits const & operator &=(RixBXLobeTraits const &rhs)
Bitwise AND all fields with the right-hand-side.
PRMAN_INLINE unsigned char GetNumDiffuseLobes() const
PRMAN_INLINE RtColorRGB * AddActiveLobe(RixBXLobeSampled lobe, bool doInitializeWeights=true)
unsigned short unused
1 to flag thin shadow, 0 otherwise
PRMAN_INLINE RtColorRGB const * GetDiffuseLobe(int i) const
PRMAN_INLINE void SetOffset(int offset)
PRMAN_INLINE RtColorRGB const * GetUserLobe(int i) const
Id for RixLPEInfo interface.
PRMAN_INLINE unsigned short GetSpecular() const
PRMAN_INLINE void SetEntering(bool entering)
PRMAN_INLINE void ClearAllSpecularLobes()
PRMAN_INLINE RixBXLobeTraits GetActiveLobeTraits() const
PRMAN_INLINE void SetSpecular(bool val)
PRMAN_INLINE void SetMaxDiffuseDepth(bool val)
PRMAN_INLINE RixBXLobeSampled RixBXLookupLobeByName(RixContext &ctx, bool discrete, bool specular, bool reflect, bool user, unsigned char lobeId, char const *name)
PRMAN_INLINE void ClearAllDiffuseLobes()
PRMAN_INLINE RtColorRGB const * GetSpecularLobe(int i) const
PRMAN_INLINE int GetNumSpecularLobes() const
PRMAN_INLINE void SetLobeId(unsigned char val)
PRMAN_INLINE void SetDiscrete(bool val)
PRMAN_INLINE bool GetSolidAngle() const
PRMAN_INLINE bool GetEntering() const
PRMAN_INLINE unsigned char GetNumUserLobes() const
PRMAN_INLINE unsigned char GetUserLpeId(int i) const
PRMAN_INLINE int GetNumPoints() const
PRMAN_INLINE bool GetReflect() const
unsigned short entering
0 is refract, 1 is reflect
PRMAN_INLINE bool HasAnySpecular() const
PRMAN_INLINE void ZeroAtIndex(int index, bool includeUserLobes=false)
PRMAN_INLINE unsigned Serialize() const
PRMAN_INLINE void SetOffset(int offset)
PRMAN_INLINE RtColorRGB const * GetSpecularLobe(int i) const
PRMAN_INLINE bool RixBXChooseLobe(float const xi, RixBXActiveLobeWeights &lw, RixBXLobeSampled &chosenLobe)
PRMAN_INLINE RtColorRGB const * GetDiffuseLobe(int i) const
PRMAN_INLINE bool GetUser() const
PRMAN_INLINE void SetNone()
Zero all fields.
PRMAN_INLINE void SetTransmit(bool entering)
PRMAN_INLINE void SetReflect(bool val)
PRMAN_INLINE bool LobeIdIsSubsurface() const
PRMAN_INLINE void SetThinShadowFlag(bool val)
PRMAN_INLINE unsigned short GetDiffuse() const
PRMAN_INLINE void SetValid(bool val)
PRMAN_INLINE bool GetReflect() const
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.
PRMAN_INLINE RixBXLobeTraits operator|(RixBXLobeTraits const &lhs, RixBXLobeTraits const &rhs)
Bitwise OR all fields.
PRMAN_INLINE bool CompareLobeID(RixBXLobeSampled const &rhs) const
virtual RixInterface * GetRixInterface(RixInterfaceId id) const =0
unsigned short discrete
0 means all other fields are invalid
PRMAN_INLINE unsigned char GetSpecularLpeId(int i) const
unsigned short reflect
0 is diffuse, 1 is specular
PRMAN_INLINE bool GetScattering() const
PRMAN_INLINE unsigned short Serialize() const
PRMAN_INLINE void SetReflect()
PRMAN_INLINE bool GetTransmit() const
PRMAN_INLINE RixBXLobeTraits const & operator|=(RixBXLobeTraits const &rhs)
Bitwise OR all fields with the right-hand-side.
PRMAN_INLINE void SetSolidAngle(bool val)
unsigned short user
0 is scattering, 1 is continuation
PRMAN_INLINE int RixBXChoose(float const xi, int const numThresholds, float const *thresholds)
unsigned short thinShadow
an optional user label for the sample
PRMAN_INLINE void GetActiveLobes(RixBXActiveLobeWeights &r) const
Return just the active lobes in the provided RixBXActiveLobeWeights.