40 #include "RixInterfaces.h"
46 static const int k_RixBXMaxNumDiffuseLobes = 4;
49 static const int k_RixBXMaxNumSpecularLobes = 8;
52 static const int k_RixBXMaxNumUserLobes = 8;
65 bool reflect,
bool user,
66 unsigned char lpeId,
unsigned char lobeId);
70 PRMAN_INLINE
bool CompareLobeID(RixBXLobeSampled
const &rhs)
72 return (fields.bits.valid && rhs.fields.bits.valid &&
74 fields.bits.
user == rhs.fields.bits.
user &&
80 PRMAN_INLINE
bool GetValid()
const;
81 PRMAN_INLINE
bool GetDiscrete()
const;
82 PRMAN_INLINE
bool GetSolidAngle()
const;
83 PRMAN_INLINE
bool GetDiffuse()
const;
84 PRMAN_INLINE
bool GetSpecular()
const;
85 PRMAN_INLINE
bool GetReflect()
const;
86 PRMAN_INLINE
bool GetTransmit(
bool *entering=NULL)
const;
87 PRMAN_INLINE
bool GetEntering()
const;
88 PRMAN_INLINE
bool GetContinuation()
const;
89 PRMAN_INLINE
bool GetScattering()
const;
90 PRMAN_INLINE
bool GetUser()
const;
91 PRMAN_INLINE
unsigned char GetLpeId()
const;
92 PRMAN_INLINE
unsigned char GetLobeId()
const;
95 PRMAN_INLINE
void SetValid(
bool val);
96 PRMAN_INLINE
void SetDiscrete(
bool val);
97 PRMAN_INLINE
void SetSpecular(
bool val);
98 PRMAN_INLINE
void SetReflect();
99 PRMAN_INLINE
void SetTransmit(
bool entering);
100 PRMAN_INLINE
void SetEntering(
bool entering);
101 PRMAN_INLINE
void SetContinuation(
bool val);
102 PRMAN_INLINE
void SetUser(
bool val);
103 PRMAN_INLINE
void SetLpeId(
unsigned char val);
104 PRMAN_INLINE
void SetLobeId(
unsigned char val);
107 PRMAN_INLINE
void Set(
bool vDiscrete,
bool vSpecular,
bool vReflect,
108 bool vContinuation,
bool vUser,
109 unsigned char vLpeId,
unsigned char vLobeid);
112 PRMAN_INLINE
unsigned short Serialize()
const;
116 unsigned short valid : 1;
117 unsigned short discrete : 1;
118 unsigned short specular : 1;
120 unsigned short reflect : 1;
121 unsigned short entering : 1;
124 unsigned short user : 1;
125 unsigned short lpeId : 3;
126 unsigned short lobeId : 3;
144 bool discrete,
bool specular,
145 bool reflect,
bool user,
146 unsigned char lobeId,
char const *name);
159 PRMAN_INLINE
RixBXLobeTraits(
bool discrete,
bool reflect,
bool transmit,
160 unsigned short D,
unsigned short S,
unsigned short U);
166 PRMAN_INLINE
bool GetDiscrete()
const;
167 PRMAN_INLINE
bool GetReflect()
const;
168 PRMAN_INLINE
bool GetTransmit()
const;
169 PRMAN_INLINE
bool GetContinuation()
const;
170 PRMAN_INLINE
unsigned short GetDiffuse()
const;
171 PRMAN_INLINE
unsigned short GetSpecular()
const;
172 PRMAN_INLINE
unsigned short GetUser()
const;
174 PRMAN_INLINE
bool GetMaxSpecularDepth()
const;
175 PRMAN_INLINE
bool GetMaxDiffuseDepth()
const;
178 PRMAN_INLINE
void SetDiscrete(
bool val);
179 PRMAN_INLINE
void SetReflect(
bool val);
180 PRMAN_INLINE
void SetTransmit(
bool val);
181 PRMAN_INLINE
void SetContinuation(
bool val);
182 PRMAN_INLINE
void SetMaxSpecularDepth(
bool val);
183 PRMAN_INLINE
void SetMaxDiffuseDepth(
bool val);
184 PRMAN_INLINE
void SetDiffuse(
unsigned short bits);
185 PRMAN_INLINE
void SetSpecular(
unsigned short bits);
186 PRMAN_INLINE
void SetUser(
unsigned short bits);
195 PRMAN_INLINE
void SetAll();
199 PRMAN_INLINE
bool HasAny()
const;
217 PRMAN_INLINE
unsigned Serialize()
const;
220 PRMAN_INLINE RixBXLobeTraits
const &
operator &=(RixBXLobeTraits
const &rhs);
223 PRMAN_INLINE RixBXLobeTraits
const &
operator |=(RixBXLobeTraits
const &rhs);
227 unsigned discreteSubset : 1;
232 unsigned D : k_RixBXMaxNumDiffuseLobes;
233 unsigned S : k_RixBXMaxNumSpecularLobes;
234 unsigned U : k_RixBXMaxNumUserLobes;
237 unsigned maxdiffusedepth : 1;
261 (
false,
false,
false, 0x0, 0x0, 0x0);
263 (
false,
true,
false, 0xF, 0x0, 0x0);
265 (
false,
true,
false, 0x0, 0xFF, 0x0);
267 (
false,
false,
true, 0xF, 0x0, 0x0);
269 (
false,
false,
true, 0x0, 0xFF, 0x0);
271 (
false,
true,
true, 0xF, 0x0, 0x0);
273 (
false,
true,
true, 0x0, 0xFF, 0x0);
275 (
false,
false,
false, 0x0, 0x0, 0xFF);
277 (
false,
true,
false, 0x0F, 0xFF, 0x0);
279 (
false,
false,
true, 0x0F, 0xFF, 0x0);
281 (
false,
true,
true, 0x0F, 0xFF, 0xFF);
292 int numSpecularLobes,
294 RtColorRGB *diffuseLobes[],
295 RtColorRGB *specularLobes[],
296 RtColorRGB *userLobes[],
297 unsigned char diffuseLpeIds[],
298 unsigned char specularLpeIds[],
299 unsigned char userLpeIds[],
306 PRMAN_INLINE RixBXActiveLobeWeights &
operator=
307 (RixBXActiveLobeWeights
const &that);
310 PRMAN_INLINE RtColorRGB
const *GetDiffuseLobe(
int i)
const;
311 PRMAN_INLINE RtColorRGB
const *GetSpecularLobe(
int i)
const;
312 PRMAN_INLINE RtColorRGB
const *GetUserLobe(
int i)
const;
313 PRMAN_INLINE RtColorRGB *GetDiffuseLobe(
int i);
314 PRMAN_INLINE RtColorRGB *GetSpecularLobe(
int i);
315 PRMAN_INLINE RtColorRGB *GetUserLobe(
int i);
318 PRMAN_INLINE
void ClearAllDiffuseLobes();
319 PRMAN_INLINE
void ClearAllSpecularLobes();
320 PRMAN_INLINE
void ClearAllUserLobes();
323 PRMAN_INLINE
int GetOffset()
const;
324 PRMAN_INLINE
void SetOffset(
int offset);
331 PRMAN_INLINE
unsigned char GetNumDiffuseLobes()
const;
332 PRMAN_INLINE
unsigned char GetNumSpecularLobes()
const;
333 PRMAN_INLINE
unsigned char GetNumUserLobes()
const;
336 PRMAN_INLINE
unsigned char GetDiffuseLpeId(
int i)
const;
337 PRMAN_INLINE
unsigned char GetSpecularLpeId(
int i)
const;
338 PRMAN_INLINE
unsigned char GetUserLpeId(
int i)
const;
341 PRMAN_INLINE RtColorRGB SumAtIndex(
int index,
342 bool includeUserLobes =
false)
const;
345 PRMAN_INLINE
void MultiplyByWeightAtIndex(
int index,
float wgt,
346 bool includeUserLobes =
false);
347 PRMAN_INLINE
void MultiplyByWeightAtIndex(
int index, RtColorRGB
const &wgt,
348 bool includeUserLobes =
false);
354 RtColorRGB *m_diffuseLobes[k_RixBXMaxNumDiffuseLobes];
355 RtColorRGB *m_specularLobes[k_RixBXMaxNumSpecularLobes];
356 RtColorRGB *m_userLobes[k_RixBXMaxNumUserLobes];
360 unsigned char m_numDiffuseLobes;
361 unsigned char m_numSpecularLobes;
362 unsigned char m_numUserLobes;
365 unsigned char m_diffuseLpeIds[k_RixBXMaxNumDiffuseLobes];
366 unsigned char m_specularLpeIds[k_RixBXMaxNumSpecularLobes];
367 unsigned char m_userLpeIds[k_RixBXMaxNumUserLobes];
380 int numSpecularLobes,
382 RtColorRGB *diffuseLobes[],
383 RtColorRGB *specularLobes[],
384 RtColorRGB *userLobes[],
391 PRMAN_INLINE RixBXLobeWeights &
operator= (RixBXLobeWeights
const &that);
394 PRMAN_INLINE RtColorRGB
const *GetDiffuseLobe(
int i)
const;
395 PRMAN_INLINE RtColorRGB
const *GetSpecularLobe(
int i)
const;
396 PRMAN_INLINE RtColorRGB
const *GetUserLobe(
int i)
const;
397 PRMAN_INLINE RtColorRGB *GetDiffuseLobe(
int i);
398 PRMAN_INLINE RtColorRGB *GetSpecularLobe(
int i);
399 PRMAN_INLINE RtColorRGB *GetUserLobe(
int i);
402 PRMAN_INLINE
int GetNumPoints()
const;
403 PRMAN_INLINE
void SetNumPoints(
int numPoints);
406 PRMAN_INLINE
int GetOffset()
const;
407 PRMAN_INLINE
void SetOffset(
int offset);
415 PRMAN_INLINE
int GetNumDiffuseLobes()
const;
416 PRMAN_INLINE
int GetNumSpecularLobes()
const;
417 PRMAN_INLINE
int GetNumUserLobes()
const;
422 bool doInitializeWeights =
true);
430 (RixBXLobeWeights &rhs,
437 PRMAN_INLINE
void CopyWeightAtIndex(
int index,
439 bool includeUserLobes =
false);
444 PRMAN_INLINE
void AddWeightAtIndex(
int index,
446 bool includeUserLobes =
false);
450 RtColorRGB *m_diffuseLobes[k_RixBXMaxNumDiffuseLobes];
451 RtColorRGB *m_specularLobes[k_RixBXMaxNumSpecularLobes];
452 RtColorRGB *m_userLobes[k_RixBXMaxNumUserLobes];
457 unsigned char m_numDiffuseLobes;
458 unsigned char m_numSpecularLobes;
459 unsigned char m_numUserLobes;
494 fields.us = serialized;
499 bool reflectV,
bool userV,
500 unsigned char lpeIdV,
unsigned char lobeIdV)
502 fields.bits.valid = 1;
505 fields.bits.
reflect = reflectV;
508 fields.bits.
user = userV;
509 fields.bits.
lpeId = lpeIdV & 0x7;
510 fields.bits.
lobeId = lobeIdV & 0x7;
515 bool RixBXLobeSampled::GetValid()
const
517 return fields.bits.valid;
521 bool RixBXLobeSampled::GetDiscrete()
const
523 return fields.bits.valid && fields.bits.
discrete;
527 bool RixBXLobeSampled::GetSolidAngle()
const
529 return fields.bits.valid && !fields.bits.
discrete;
533 bool RixBXLobeSampled::GetDiffuse()
const
535 return fields.bits.valid && !fields.bits.
specular;
539 bool RixBXLobeSampled::GetSpecular()
const
541 return fields.bits.valid && fields.bits.
specular;
545 bool RixBXLobeSampled::GetReflect()
const
547 return fields.bits.valid && fields.bits.
reflect;
551 bool RixBXLobeSampled::GetTransmit(
bool *enteringV)
const
553 bool transmit = fields.bits.valid && !fields.bits.
reflect;
555 *enteringV = fields.bits.
entering && transmit;
560 bool RixBXLobeSampled::GetEntering()
const
562 return fields.bits.valid && !fields.bits.
reflect && fields.bits.
entering;
566 bool RixBXLobeSampled::GetContinuation()
const
572 bool RixBXLobeSampled::GetScattering()
const
578 bool RixBXLobeSampled::GetUser()
const
580 return fields.bits.valid && fields.bits.
user;
584 unsigned char RixBXLobeSampled::GetLpeId()
const
586 return (
unsigned char) (fields.bits.valid ? fields.bits.
lpeId : 0);
590 unsigned char RixBXLobeSampled::GetLobeId()
const
592 return (
unsigned char) (fields.bits.valid ? fields.bits.
lobeId : 0);
596 void RixBXLobeSampled::SetValid(
bool val)
598 fields.bits.valid = val;
602 void RixBXLobeSampled::SetDiscrete(
bool val)
608 void RixBXLobeSampled::SetSpecular(
bool val)
614 void RixBXLobeSampled::SetReflect()
620 void RixBXLobeSampled::SetTransmit(
bool enterval)
627 void RixBXLobeSampled::SetEntering(
bool enterval)
630 assert(fields.bits.
reflect == 0);
635 void RixBXLobeSampled::SetContinuation(
bool val)
641 void RixBXLobeSampled::SetUser(
bool val)
643 fields.bits.
user = val;
647 void RixBXLobeSampled::SetLpeId(
unsigned char val)
649 fields.bits.
lpeId = val & 0x7;
653 void RixBXLobeSampled::SetLobeId(
unsigned char val)
655 fields.bits.
lobeId = val & 0x7;
660 bool vContinuation,
bool vUser,
661 unsigned char vLpeId,
unsigned char vLobeId)
663 fields.bits.valid = 1;
666 fields.bits.
reflect = vReflect;
669 fields.bits.
user = vUser;
670 fields.bits.
lpeId = vLpeId & 0x7;
671 fields.bits.
lobeId = vLobeId & 0x7;
676 unsigned short RixBXLobeSampled::Serialize()
const
687 bool discrete,
bool specular,
688 bool reflect,
bool user,
689 unsigned char lobeId,
char const *name)
691 unsigned char lpeId = 0;
692 int numPotentialLobes = 0;
694 if (RixLPEInfo *lpeInfo = (RixLPEInfo *) ctx.GetRixInterface(k_RixLPEInfo))
696 lpeId = (
unsigned char)lpeInfo->GetLpeIdByName(
697 discrete, specular, reflect, user, lobeId, name);
700 numPotentialLobes = lpeInfo->GetNumPotentialUserLobes();
702 numPotentialLobes = lpeInfo->GetNumPotentialDiffuseLobes();
704 numPotentialLobes = lpeInfo->GetNumPotentialSpecularLobes();
710 if (lpeId >= numPotentialLobes)
734 fields.us = serialized;
739 unsigned short D,
unsigned short S,
unsigned short U)
741 assert(
sizeof(fields.bits) ==
sizeof(
unsigned));
742 fields.bits.discreteSubset = discrete;
746 fields.bits.
D = D & 0x0F;
747 fields.bits.
S = S & 0xFF;
748 fields.bits.
U = U & 0xFF;
750 fields.bits.maxdiffusedepth = 0;
751 fields.bits.unused = 0;
761 fields.bits.discreteSubset = 0;
768 if (lobe.GetLpeId() < k_RixBXMaxNumUserLobes)
769 fields.bits.
U = (1 << lobe.GetLpeId()) & 0xFF;
775 fields.bits.discreteSubset = lobe.GetDiscrete();
780 if (lobe.GetDiffuse() && lobe.GetLpeId() < k_RixBXMaxNumDiffuseLobes)
781 fields.bits.
D = (1 << lobe.GetLpeId()) & 0x0F;
784 if (lobe.GetSpecular() && lobe.GetLpeId() < k_RixBXMaxNumSpecularLobes)
785 fields.bits.
S = (1 << lobe.GetLpeId()) & 0xFF;
796 fields.bits.maxdiffusedepth = 0;
800 bool RixBXLobeTraits::GetDiscrete()
const
802 return fields.bits.discreteSubset;
806 bool RixBXLobeTraits::GetReflect()
const
812 bool RixBXLobeTraits::GetTransmit()
const
818 bool RixBXLobeTraits::GetContinuation()
const
824 unsigned short RixBXLobeTraits::GetDiffuse()
const
826 return static_cast<unsigned short>(fields.bits.
D);
830 unsigned short RixBXLobeTraits::GetSpecular()
const
832 return static_cast<unsigned short>(fields.bits.
S);
836 unsigned short RixBXLobeTraits::GetUser()
const
838 return static_cast<unsigned short>(fields.bits.
U);
842 bool RixBXLobeTraits::GetMaxSpecularDepth()
const
848 bool RixBXLobeTraits::GetMaxDiffuseDepth()
const
850 return fields.bits.maxdiffusedepth;
854 void RixBXLobeTraits::SetDiscrete(
bool val)
856 fields.bits.discreteSubset = val;
860 void RixBXLobeTraits::SetReflect(
bool val)
866 void RixBXLobeTraits::SetTransmit(
bool val)
872 void RixBXLobeTraits::SetContinuation(
bool val)
878 void RixBXLobeTraits::SetDiffuse(
unsigned short val)
880 fields.bits.
D =
static_cast<unsigned>(val & 0x0F);
884 void RixBXLobeTraits::SetSpecular(
unsigned short val)
886 fields.bits.
S =
static_cast<unsigned>(val & 0xFF);
890 void RixBXLobeTraits::SetUser(
unsigned short val)
892 fields.bits.
U =
static_cast<unsigned>(val & 0xFF);
896 void RixBXLobeTraits::SetMaxSpecularDepth(
bool val)
902 void RixBXLobeTraits::SetMaxDiffuseDepth(
bool val)
904 fields.bits.maxdiffusedepth = val;
930 fields.bits.discreteSubset = 0;
935 fields.bits.maxdiffusedepth = 0;
936 fields.bits.
D = 0x0F;
937 fields.bits.
S = 0xFF;
938 fields.bits.
U = 0xFF;
950 return (fields.bits.
D | fields.bits.
S) &&
973 return (fields.bits.
U != 0);
977 unsigned RixBXLobeTraits::Serialize()
const
1000 fields.us &= rhs.fields.us;
1023 fields.us |= rhs.fields.us;
1084 m_numDiffuseLobes(0),
1085 m_numSpecularLobes(0),
1092 int numDiffuseLobes,
1093 int numSpecularLobes,
1095 RtColorRGB *diffuseLobes[],
1096 RtColorRGB *specularLobes[],
1097 RtColorRGB *userLobes[],
1098 unsigned char diffuseLpeIds[],
1099 unsigned char specularLpeIds[],
1100 unsigned char userLpeIds[],
1104 m_lobeTraits(lobeTraits),
1105 m_numDiffuseLobes((unsigned char)numDiffuseLobes),
1106 m_numSpecularLobes((unsigned char)numSpecularLobes),
1107 m_numUserLobes((unsigned char)numUserLobes)
1109 for (
int i = 0; i < numDiffuseLobes; i++)
1111 m_diffuseLobes[i] = diffuseLobes[i];
1112 m_diffuseLpeIds[i] = diffuseLpeIds[i];
1115 for (
int i = 0; i < numSpecularLobes; i++)
1117 m_specularLobes[i] = specularLobes[i];
1118 m_specularLpeIds[i] = specularLpeIds[i];
1121 for (
int i = 0; i < numUserLobes; i++)
1123 m_userLobes[i] = userLobes[i];
1124 m_userLpeIds[i] = userLpeIds[i];
1132 m_offset(that.m_offset),
1133 m_lobeTraits(that.m_lobeTraits),
1134 m_numDiffuseLobes(that.m_numDiffuseLobes),
1135 m_numSpecularLobes(that.m_numSpecularLobes),
1136 m_numUserLobes(that.m_numUserLobes)
1138 for (
int i = 0; i < m_numDiffuseLobes; i++)
1140 m_diffuseLobes[i] = that.m_diffuseLobes[i];
1141 m_diffuseLpeIds[i] = that.m_diffuseLpeIds[i];
1143 for (
int i = 0; i < m_numSpecularLobes; i++)
1145 m_specularLobes[i] = that.m_specularLobes[i];
1146 m_specularLpeIds[i] = that.m_specularLpeIds[i];
1148 for (
int i = 0; i < m_numUserLobes; i++)
1150 m_userLobes[i] = that.m_userLobes[i];
1151 m_userLpeIds[i] = that.m_userLpeIds[i];
1159 m_offset = that.m_offset;
1160 m_lobeTraits = that.m_lobeTraits;
1161 m_numDiffuseLobes = that.m_numDiffuseLobes;
1162 m_numSpecularLobes = that.m_numSpecularLobes;
1163 m_numUserLobes = that.m_numUserLobes;
1165 for (
int i = 0; i < m_numDiffuseLobes; i++)
1167 m_diffuseLobes[i] = that.m_diffuseLobes[i];
1168 m_diffuseLpeIds[i] = that.m_diffuseLpeIds[i];
1170 for (
int i = 0; i < m_numSpecularLobes; i++)
1172 m_specularLobes[i] = that.m_specularLobes[i];
1173 m_specularLpeIds[i] = that.m_specularLpeIds[i];
1175 for (
int i = 0; i < m_numUserLobes; i++)
1177 m_userLobes[i] = that.m_userLobes[i];
1178 m_userLpeIds[i] = that.m_userLpeIds[i];
1185 int RixBXActiveLobeWeights::GetOffset()
const
1191 void RixBXActiveLobeWeights::SetOffset(
int offset)
1199 return m_lobeTraits;
1205 m_lobeTraits = lobes;
1208 PRMAN_INLINE
unsigned char
1209 RixBXActiveLobeWeights::GetNumDiffuseLobes()
const
1211 return m_numDiffuseLobes;
1214 PRMAN_INLINE
unsigned char
1215 RixBXActiveLobeWeights::GetNumSpecularLobes()
const
1217 return m_numSpecularLobes;
1220 PRMAN_INLINE
unsigned char
1221 RixBXActiveLobeWeights::GetNumUserLobes()
const
1223 return m_numUserLobes;
1226 PRMAN_INLINE RtColorRGB
const *
1227 RixBXActiveLobeWeights::GetDiffuseLobe(
int i)
const
1229 return m_diffuseLobes[i] + m_offset;
1232 PRMAN_INLINE RtColorRGB
const *
1233 RixBXActiveLobeWeights::GetSpecularLobe(
int i)
const
1235 return m_specularLobes[i] + m_offset;
1238 PRMAN_INLINE RtColorRGB
const *
1239 RixBXActiveLobeWeights::GetUserLobe(
int i)
const
1241 return m_userLobes[i] + m_offset;
1244 PRMAN_INLINE RtColorRGB *
1245 RixBXActiveLobeWeights::GetDiffuseLobe(
int i)
1247 return m_diffuseLobes[i] + m_offset;
1250 PRMAN_INLINE RtColorRGB *
1251 RixBXActiveLobeWeights::GetSpecularLobe(
int i)
1253 return m_specularLobes[i] + m_offset;
1256 PRMAN_INLINE RtColorRGB *
1257 RixBXActiveLobeWeights::GetUserLobe(
int i)
1259 return m_userLobes[i] + m_offset;
1262 PRMAN_INLINE
unsigned char
1263 RixBXActiveLobeWeights::GetDiffuseLpeId(
int i)
const
1265 return m_diffuseLpeIds[i];
1268 PRMAN_INLINE
unsigned char
1269 RixBXActiveLobeWeights::GetSpecularLpeId(
int i)
const
1271 return m_specularLpeIds[i];
1274 PRMAN_INLINE
unsigned char
1275 RixBXActiveLobeWeights::GetUserLpeId(
int i)
const
1277 return m_userLpeIds[i];
1281 RixBXActiveLobeWeights::ClearAllDiffuseLobes()
1283 m_numDiffuseLobes = 0;
1285 m_lobeTraits &= (k_RixBXTraitsAllSpecular | k_RixBXTraitsAllUser);
1289 RixBXActiveLobeWeights::ClearAllSpecularLobes()
1291 m_numSpecularLobes = 0;
1293 m_lobeTraits &= (k_RixBXTraitsAllDiffuse | k_RixBXTraitsAllUser);
1297 RixBXActiveLobeWeights::ClearAllUserLobes()
1301 m_lobeTraits &= (k_RixBXTraitsAllDiffuse | k_RixBXTraitsAllSpecular);
1305 RtColorRGB RixBXActiveLobeWeights::SumAtIndex(
int index,
1306 bool includeUserLobes)
const
1308 RtColorRGB sum(0.0f);
1310 int idx = m_offset + index;
1311 for (
int i = 0; i < m_numDiffuseLobes; i++)
1312 sum += m_diffuseLobes[i][idx];
1313 for (
int i = 0; i < m_numSpecularLobes; i++)
1314 sum += m_specularLobes[i][idx];
1316 if (includeUserLobes)
1318 for (
int i = 0; i < m_numUserLobes; i++)
1319 sum += m_userLobes[i][idx];
1326 void RixBXActiveLobeWeights::MultiplyByWeightAtIndex
1327 (
int index,
float weight,
bool includeUserLobes)
1329 int idx = m_offset + index;
1330 for (
int i = 0; i < m_numDiffuseLobes; i++)
1331 m_diffuseLobes[i][idx] *= weight;
1332 for (
int i = 0; i < m_numSpecularLobes; i++)
1333 m_specularLobes[i][idx] *= weight;
1335 if (includeUserLobes)
1337 for (
int i = 0; i < m_numUserLobes; i++)
1338 m_userLobes[i][idx] *= weight;
1343 void RixBXActiveLobeWeights::MultiplyByWeightAtIndex
1344 (
int index, RtColorRGB
const &weight,
bool includeUserLobes)
1346 int idx = m_offset + index;
1347 for (
int i = 0; i < m_numDiffuseLobes; i++)
1348 m_diffuseLobes[i][idx] *= weight;
1349 for (
int i = 0; i < m_numSpecularLobes; i++)
1350 m_specularLobes[i][idx] *= weight;
1352 if (includeUserLobes)
1354 for (
int i = 0; i < m_numUserLobes; i++)
1355 m_userLobes[i][idx] *= weight;
1368 m_numDiffuseLobes(0),
1369 m_numSpecularLobes(0),
1376 int numDiffuseLobes,
1377 int numSpecularLobes,
1379 RtColorRGB *diffuseLobes[],
1380 RtColorRGB *specularLobes[],
1381 RtColorRGB *userLobes[],
1384 m_numPoints(numPoints),
1386 m_numDiffuseLobes((unsigned char)numDiffuseLobes),
1387 m_numSpecularLobes((unsigned char)numSpecularLobes),
1388 m_numUserLobes((unsigned char)numUserLobes)
1390 for (
int i = 0; i < numDiffuseLobes; i++)
1391 m_diffuseLobes[i] = diffuseLobes[i];
1393 for (
int i = 0; i < numSpecularLobes; i++)
1394 m_specularLobes[i] = specularLobes[i];
1396 for (
int i = 0; i < numUserLobes; i++)
1397 m_userLobes[i] = userLobes[i];
1403 m_numPoints(that.m_numPoints),
1404 m_offset(that.m_offset),
1405 m_activeLobeTraits(that.m_activeLobeTraits),
1406 m_numDiffuseLobes(that.m_numDiffuseLobes),
1407 m_numSpecularLobes(that.m_numSpecularLobes),
1408 m_numUserLobes(that.m_numUserLobes)
1410 for (
int i = 0; i < m_numDiffuseLobes; i++)
1411 m_diffuseLobes[i] = that.m_diffuseLobes[i];
1413 for (
int i = 0; i < m_numSpecularLobes; i++)
1414 m_specularLobes[i] = that.m_specularLobes[i];
1416 for (
int i = 0; i < m_numUserLobes; i++)
1417 m_userLobes[i] = that.m_userLobes[i];
1424 m_numPoints = that.m_numPoints;
1425 m_offset = that.m_offset;
1426 m_activeLobeTraits = that.m_activeLobeTraits;
1427 m_numDiffuseLobes = that.m_numDiffuseLobes;
1428 m_numSpecularLobes = that.m_numSpecularLobes;
1429 m_numUserLobes = that.m_numUserLobes;
1431 for (
int i = 0; i < m_numDiffuseLobes; i++)
1432 m_diffuseLobes[i] = that.m_diffuseLobes[i];
1434 for (
int i = 0; i < m_numSpecularLobes; i++)
1435 m_specularLobes[i] = that.m_specularLobes[i];
1437 for (
int i = 0; i < m_numUserLobes; i++)
1438 m_userLobes[i] = that.m_userLobes[i];
1443 PRMAN_INLINE RtColorRGB
const *
1444 RixBXLobeWeights::GetDiffuseLobe(
int i)
const
1446 return m_diffuseLobes[i] + m_offset;
1449 PRMAN_INLINE RtColorRGB
const *
1450 RixBXLobeWeights::GetSpecularLobe(
int i)
const
1452 return m_specularLobes[i] + m_offset;
1455 PRMAN_INLINE RtColorRGB
const *
1456 RixBXLobeWeights::GetUserLobe(
int i)
const
1458 return m_userLobes[i] + m_offset;
1461 PRMAN_INLINE RtColorRGB *
1462 RixBXLobeWeights::GetDiffuseLobe(
int i)
1464 return m_diffuseLobes[i] + m_offset;
1467 PRMAN_INLINE RtColorRGB *
1468 RixBXLobeWeights::GetSpecularLobe(
int i)
1470 return m_specularLobes[i] + m_offset;
1473 PRMAN_INLINE RtColorRGB *
1474 RixBXLobeWeights::GetUserLobe(
int i)
1476 return m_userLobes[i] + m_offset;
1480 int RixBXLobeWeights::GetNumPoints()
const {
return m_numPoints; }
1483 void RixBXLobeWeights::SetNumPoints(
int numPoints) { m_numPoints = numPoints; }
1486 int RixBXLobeWeights::GetOffset()
const {
return m_offset; }
1489 void RixBXLobeWeights::SetOffset(
int offset) { m_offset = offset; }
1494 return m_activeLobeTraits;
1500 m_activeLobeTraits = lobes;
1506 m_activeLobeTraits |= lobes;
1510 int RixBXLobeWeights::GetNumDiffuseLobes()
const
1512 return m_numDiffuseLobes;
1516 int RixBXLobeWeights::GetNumSpecularLobes()
const
1518 return m_numSpecularLobes;
1522 int RixBXLobeWeights::GetNumUserLobes()
const
1524 return m_numUserLobes;
1529 bool doInitializeWeights)
1531 if (lobeSampled.GetUser())
1534 int lpeId = lobeSampled.GetLpeId();
1535 if (lpeId < m_numUserLobes)
1537 RtColorRGB *p = m_userLobes[lpeId];
1538 if (!(m_activeLobeTraits.GetUser() & traits.GetUser()))
1540 m_activeLobeTraits |= traits;
1541 if (doInitializeWeights)
1542 memset(p, 0, m_numPoints *
sizeof(RtColorRGB));
1544 return p + m_offset;
1547 else if (lobeSampled.GetDiffuse())
1550 int lpeId = lobeSampled.GetLpeId();
1551 if (lpeId < m_numDiffuseLobes)
1553 RtColorRGB *p = m_diffuseLobes[lpeId];
1554 if (!(m_activeLobeTraits.GetDiffuse() & traits.GetDiffuse()))
1556 m_activeLobeTraits |= traits;
1557 if (doInitializeWeights)
1558 memset(p, 0, m_numPoints *
sizeof(RtColorRGB));
1560 return p + m_offset;
1563 else if (lobeSampled.GetSpecular())
1566 int lpeId = lobeSampled.GetLpeId();
1567 if (lpeId < m_numSpecularLobes)
1569 RtColorRGB *p = m_specularLobes[lpeId];
1570 if (!(m_activeLobeTraits.GetSpecular() & traits.GetSpecular()))
1572 m_activeLobeTraits |= traits;
1573 if (doInitializeWeights)
1574 memset(p, 0, m_numPoints *
sizeof(RtColorRGB));
1576 return p + m_offset;
1585 r.m_numDiffuseLobes = r.m_numSpecularLobes = r.m_numUserLobes = 0;
1586 r.m_lobeTraits = m_activeLobeTraits;
1587 r.m_offset = m_offset;
1591 int ndiff = m_numDiffuseLobes;
1592 for (
int lpeId = 0, bit = 1; lpeId < ndiff; lpeId++, bit <<= 1)
1594 if (lobes.GetDiffuse() & bit)
1596 r.m_diffuseLobes[r.m_numDiffuseLobes] = m_diffuseLobes[lpeId];
1597 r.m_diffuseLpeIds[r.m_numDiffuseLobes] = (
unsigned char)lpeId;
1598 r.m_numDiffuseLobes++;
1601 int nspec = m_numSpecularLobes;
1602 for (
int lpeId = 0, bit = 1; lpeId < nspec; lpeId++, bit <<= 1)
1604 if (lobes.GetSpecular() & bit)
1606 r.m_specularLobes[r.m_numSpecularLobes] =
1607 m_specularLobes[lpeId];
1608 r.m_specularLpeIds[r.m_numSpecularLobes] = (
unsigned char)lpeId;
1609 r.m_numSpecularLobes++;
1612 int nuser = m_numUserLobes;
1613 for (
int lpeId = 0, bit = 1; lpeId < nuser; lpeId++, bit <<= 1)
1615 if (lobes.GetUser() & bit)
1617 r.m_userLobes[r.m_numUserLobes] =
1619 r.m_userLpeIds[r.m_numUserLobes] = (
unsigned char)lpeId;
1631 int numDiffuseLobes = 0;
1632 int numSpecularLobes = 0;
1633 int numUserLobes = 0;
1635 RixBXLobeTraits lobes = (m_activeLobeTraits & rhs.m_activeLobeTraits);
1637 int ndiff = std::min(m_numDiffuseLobes, rhs.m_numDiffuseLobes);
1638 for (
int lpeId = 0, bit = 1; lpeId < ndiff; lpeId++, bit <<= 1)
1640 if (lobes.GetDiffuse() & bit)
1642 activeLhs.m_diffuseLobes[numDiffuseLobes] =
1643 m_diffuseLobes[lpeId];
1644 activeRhs.m_diffuseLobes[numDiffuseLobes] =
1645 rhs.m_diffuseLobes[lpeId];
1646 activeLhs.m_diffuseLpeIds[numDiffuseLobes] = (
unsigned char)lpeId;
1647 activeRhs.m_diffuseLpeIds[numDiffuseLobes] = (
unsigned char)lpeId;
1651 int nspec = std::min(m_numSpecularLobes, rhs.m_numSpecularLobes);
1652 for (
int lpeId = 0, bit = 1; lpeId < nspec; lpeId++, bit <<= 1)
1654 if (lobes.GetSpecular() & bit)
1656 activeLhs.m_specularLobes[numSpecularLobes] =
1657 m_specularLobes[lpeId];
1658 activeRhs.m_specularLobes[numSpecularLobes] =
1659 rhs.m_specularLobes[lpeId];
1660 activeLhs.m_specularLpeIds[numSpecularLobes] = (
unsigned char)lpeId;
1661 activeRhs.m_specularLpeIds[numSpecularLobes] = (
unsigned char)lpeId;
1665 int nuser = std::min(m_numUserLobes, rhs.m_numUserLobes);
1666 for (
int lpeId = 0, bit = 1; lpeId < nuser; lpeId++, bit <<= 1)
1668 if (lobes.GetUser() & bit)
1670 activeLhs.m_userLobes[numUserLobes] =
1672 activeRhs.m_userLobes[numUserLobes] =
1673 rhs.m_userLobes[lpeId];
1674 activeLhs.m_userLpeIds[numUserLobes] = (
unsigned char)lpeId;
1675 activeRhs.m_userLpeIds[numUserLobes] = (
unsigned char)lpeId;
1680 activeLhs.m_offset = m_offset;
1681 activeLhs.m_lobeTraits = lobes;
1682 activeLhs.m_numDiffuseLobes = (
unsigned char)numDiffuseLobes;
1683 activeLhs.m_numSpecularLobes = (
unsigned char)numSpecularLobes;
1684 activeLhs.m_numUserLobes = (
unsigned char)numUserLobes;
1686 activeRhs.m_offset = rhs.m_offset;
1687 activeRhs.m_lobeTraits = lobes;
1688 activeRhs.m_numDiffuseLobes = (
unsigned char)numDiffuseLobes;
1689 activeRhs.m_numSpecularLobes = (
unsigned char)numSpecularLobes;
1690 activeRhs.m_numUserLobes = (
unsigned char)numUserLobes;
1694 void RixBXLobeWeights::CopyWeightAtIndex(
int index,
1696 bool includeUserLobes)
1699 int ndiff = src.GetNumDiffuseLobes();
1700 for (
int i = 0; i < ndiff; i++)
1702 int lpeId = src.GetDiffuseLpeId(i);
1703 GetDiffuseLobe(lpeId)[index] = src.GetDiffuseLobe(i)[index];
1706 int nspec = src.GetNumSpecularLobes();
1707 for (
int i = 0; i < nspec; i++)
1709 int lpeId = src.GetSpecularLpeId(i);
1710 GetSpecularLobe(lpeId)[index] = src.GetSpecularLobe(i)[index];
1713 if (includeUserLobes)
1715 int nuser = src.GetNumUserLobes();
1716 for (
int i = 0; i < nuser; i++)
1718 int lpeId = src.GetUserLpeId(i);
1719 GetUserLobe(lpeId)[index] = src.GetUserLobe(i)[index];
1725 void RixBXLobeWeights::AddWeightAtIndex(
int index,
1727 bool includeUserLobes)
1730 int ndiff = src.GetNumDiffuseLobes();
1731 for (
int i = 0; i < ndiff; i++)
1733 int lpeId = src.GetDiffuseLpeId(i);
1734 GetDiffuseLobe(lpeId)[index] += src.GetDiffuseLobe(i)[index];
1737 int nspec = src.GetNumSpecularLobes();
1738 for (
int i = 0; i < nspec; i++)
1740 int lpeId = src.GetSpecularLpeId(i);
1741 GetSpecularLobe(lpeId)[index] += src.GetSpecularLobe(i)[index];
1744 if (includeUserLobes)
1746 int nuser = src.GetNumUserLobes();
1747 for (
int i = 0; i < nuser; i++)
1749 int lpeId = src.GetUserLpeId(i);
1750 GetUserLobe(lpeId)[index] += src.GetUserLobe(i)[index];