46 #include "RiTypesHelper.h"
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);
97 PRMAN_INLINE
bool GetTransmit(
bool* entering = NULL)
const;
101 PRMAN_INLINE
bool GetUser()
const;
102 PRMAN_INLINE
unsigned char GetLpeId()
const;
103 PRMAN_INLINE
unsigned char GetLobeId()
const;
106 PRMAN_INLINE
unsigned char GetUnused()
const;
109 PRMAN_INLINE
void SetValid(
bool val);
116 PRMAN_INLINE
void SetUser(
bool val);
117 PRMAN_INLINE
void SetLpeId(
unsigned char val);
118 PRMAN_INLINE
void SetLobeId(
unsigned char val);
120 PRMAN_INLINE
void SetUnused(
unsigned char val);
123 PRMAN_INLINE
void Set(
129 unsigned char vLpeId,
130 unsigned char vLobeId,
131 bool vThinShadowFlag =
false);
134 PRMAN_INLINE
unsigned short Serialize()
const;
139 unsigned short discrete : 1;
140 unsigned short specular : 1;
142 unsigned short reflect : 1;
146 unsigned short user : 1;
147 unsigned short lpeId : 3;
148 unsigned short lobeId : 4;
173 unsigned char lobeId,
205 PRMAN_INLINE
unsigned short GetDiffuse()
const;
207 PRMAN_INLINE
unsigned short GetUser()
const;
221 PRMAN_INLINE
void SetValid(
bool val);
229 PRMAN_INLINE
void SetDiffuse(
unsigned short bits);
230 PRMAN_INLINE
void SetSpecular(
unsigned short bits);
231 PRMAN_INLINE
void SetUser(
unsigned short bits);
240 PRMAN_INLINE
void SetAll();
244 PRMAN_INLINE
bool HasAny()
const;
265 PRMAN_INLINE RixBXLobeTraits
const&
operator&=(RixBXLobeTraits
const& rhs);
268 PRMAN_INLINE RixBXLobeTraits
const&
operator|=(RixBXLobeTraits
const& rhs);
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,
343 RtColorRGB* diffuseLobes[],
344 RtColorRGB* specularLobes[],
345 RtColorRGB* userLobes[],
346 unsigned char diffuseLpeIds[],
347 unsigned char specularLpeIds[],
348 unsigned char userLpeIds[],
355 PRMAN_INLINE RixBXActiveLobeWeights&
operator=(
356 RixBXActiveLobeWeights
const& that);
361 PRMAN_INLINE RtColorRGB
const*
GetUserLobe(
int i)
const;
392 bool includeUserLobes =
false)
const;
398 bool includeUserLobes =
false);
401 RtColorRGB
const& weight,
402 bool includeUserLobes =
false);
405 PRMAN_INLINE
void ZeroAtIndex(
int index,
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,
440 RtColorRGB* diffuseLobes[],
441 RtColorRGB* specularLobes[],
442 RtColorRGB* userLobes[],
449 PRMAN_INLINE RixBXLobeWeights&
operator=(RixBXLobeWeights
const& that);
454 PRMAN_INLINE RtColorRGB
const*
GetUserLobe(
int i)
const;
481 bool doInitializeWeights =
true);
489 RixBXLobeWeights
const& rhs,
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;
529 PRMAN_INLINE
int RixBXChoose(
float const xi,
int const numThresholds,
530 float const* thresholds);
624 fields.
us = serialized;
633 unsigned char vLpeId,
634 unsigned char vLobeId)
718 PRMAN_INLINE
unsigned char
724 PRMAN_INLINE
unsigned char
736 return (fields.
bits.
lobeId == k_RixBXSubsurfaceLobeId1 ||
737 fields.
bits.
lobeId == k_RixBXSubsurfaceLobeId2 ||
738 fields.
bits.
lobeId == k_RixBXSubsurfaceLobeId3);
747 PRMAN_INLINE
unsigned char
835 unsigned char vLpeId,
836 unsigned char vLobeId,
837 bool vThinShadowFlag)
852 PRMAN_INLINE
unsigned short
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)
1009 PRMAN_INLINE
unsigned short
1012 return static_cast<unsigned short>(fields.
bits.
D);
1015 PRMAN_INLINE
unsigned short
1018 return static_cast<unsigned short>(fields.
bits.
S);
1021 PRMAN_INLINE
unsigned short
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);
1176 PRMAN_INLINE
unsigned
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,
1299 RtColorRGB* diffuseLobes[],
1300 RtColorRGB* specularLobes[],
1301 RtColorRGB* userLobes[],
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;
1409 PRMAN_INLINE
unsigned char
1412 return m_numDiffuseLobes;
1415 PRMAN_INLINE
unsigned char
1418 return m_numSpecularLobes;
1421 PRMAN_INLINE
unsigned char
1424 return m_numUserLobes;
1427 PRMAN_INLINE RtColorRGB
const*
1430 return m_diffuseLobes[i] + m_offset;
1433 PRMAN_INLINE RtColorRGB
const*
1436 return m_specularLobes[i] + m_offset;
1439 PRMAN_INLINE RtColorRGB
const*
1442 return m_userLobes[i] + m_offset;
1445 PRMAN_INLINE RtColorRGB*
1448 return m_diffuseLobes[i] + m_offset;
1451 PRMAN_INLINE RtColorRGB*
1454 return m_specularLobes[i] + m_offset;
1457 PRMAN_INLINE RtColorRGB*
1460 return m_userLobes[i] + m_offset;
1463 PRMAN_INLINE
unsigned char
1466 return m_diffuseLpeIds[i];
1469 PRMAN_INLINE
unsigned char
1472 return m_specularLpeIds[i];
1475 PRMAN_INLINE
unsigned char
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);
1505 PRMAN_INLINE RtColorRGB
1508 RtColorRGB sum(0.0f);
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;
1547 RtColorRGB
const& 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,
1599 RtColorRGB* diffuseLobes[],
1600 RtColorRGB* specularLobes[],
1601 RtColorRGB* userLobes[],
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];
1660 PRMAN_INLINE RtColorRGB
const*
1663 return m_diffuseLobes[i] + m_offset;
1666 PRMAN_INLINE RtColorRGB
const*
1669 return m_specularLobes[i] + m_offset;
1672 PRMAN_INLINE RtColorRGB
const*
1675 return m_userLobes[i] + m_offset;
1678 PRMAN_INLINE RtColorRGB*
1681 return m_diffuseLobes[i] + m_offset;
1684 PRMAN_INLINE RtColorRGB*
1687 return m_specularLobes[i] + m_offset;
1690 PRMAN_INLINE RtColorRGB*
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;
1756 PRMAN_INLINE RtColorRGB*
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());