37 #ifndef RixLPEInline_h 38 #define RixLPEInline_h 57 static const unsigned char k_numScatterTypes = k_RixBXMaxNumDiffuseLobes +
58 k_RixBXMaxNumSpecularLobes +
59 k_RixBXMaxNumUserLobes;
62 static const unsigned char k_diffStart = 0;
63 static const unsigned char k_specStart = k_diffStart + k_RixBXMaxNumDiffuseLobes;
64 static const unsigned char k_userStart = k_specStart + k_RixBXMaxNumSpecularLobes;
78 const Transition *middle = begin + ((end - begin)>>1);
79 if (symbol < middle->symbol)
81 else if (middle->
symbol < symbol)
89 void *
const *
getRules(
int state,
int &count)
const 153 : m_automata( automata ), m_nautomata( nautomata )
166 m_state.resize(m_nautomata);
167 std::fill(m_state.begin(), m_state.end(), 0);
192 if( !m_automata )
return true;
193 for(
int i = 0; i < m_nautomata; i++ ) if(m_state[i] >=0)
return false;
201 std::vector<short> saveState =
GetState();
202 move(dir, sca, custom);
217 nautomata = m_nautomata;
236 m_thruput *= thruput;
258 bool firstContribution,
283 move( event, scatt, lpeGroupId );
294 bool doStateTransition)
303 if( doStateTransition )
305 move( event, scatt, lpeGroupId );
308 m_thruput *= thruput;
319 for(
int i = 0; i < m_nautomata; i++ )
326 m_state[i] = m_automata[i].
getTransition(m_state[i], custom);
339 bool isSpecular,
unsigned char lpeId)
341 m_isReflect = isReflect;
346 m_lpeIndex =
static_cast<unsigned char>(k_userStart + m_lpeId);
348 else if( isSpecular )
351 m_lpeIndex =
static_cast<unsigned char>(k_specStart + m_lpeId);
356 m_lpeIndex =
static_cast<unsigned char>(k_diffStart + m_lpeId);
371 else if( lobeSampled.
GetUser() )
374 m_lpeIndex =
static_cast<unsigned char>(k_userStart + m_lpeId);
379 m_lpeIndex =
static_cast<unsigned char>(k_specStart + m_lpeId);
385 m_lpeIndex =
static_cast<unsigned char>(k_diffStart + m_lpeId);
399 assert((dl && !sl) ||
403 if( (dl && sl) || (!dl && !sl) )
408 m_lpeId = m_lpeIndex = 0;
416 bool isDiffuse = (dl != 0);
422 m_lpeIndex = isDiffuse ? k_diffStart : k_specStart;
423 m_lpeIndex =
static_cast<unsigned char>(m_lpeIndex + m_lpeId);
426 m_scatter += m_lpeId;
451 return !
GetValid() ? 0 : m_lpeIndex;
467 int integratorCtxIdx,
478 bool writeOpacityAllowed)
480 m_lgtLpeToken(lgtLpeToken),
481 m_lpeGrpId(lpeGrpId),
482 m_isReflect(isReflect),
483 m_lgtTrans(lgtTrans),
484 m_displaySvc(displaySvc),
485 m_integratorCtxIdx(integratorCtxIdx),
489 m_shadingCtxIdx(shadingCtxIdx),
490 m_writeOpacityAllowed(writeOpacityAllowed)
509 RixLPE const& rixLpe = m_rixLpe;
515 bool isReflect = m_isReflect;
518 bool firstContribution =
true;
521 std::vector<short>& state = m_state.GetState();
522 size_t stateSize = state.size();
523 short stateBuffer[1<<16];
525 short* stateBackup = stateBuffer;
526 if (stateSize > 1<<16)
528 stateBackup = (
short*)malloc(stateSize*
sizeof(
short));
530 memcpy(stateBackup, state.data(), stateSize*
sizeof(short));
538 firstContribution =
false;
541 int diffLpeId = k_diffStart + lpeId;
544 m_sCtx, m_shadingCtxIdx, lpeEvent,
547 m_sCtx, m_shadingCtxIdx, diffuse, &m_lgtTrans,
548 firstContribution, lgtLpeToken);
550 diffuse, &m_lgtTrans, isFinite, clamp, diffLpeId,
554 memcpy(state.data(), stateBackup, stateSize*
sizeof(short));
563 firstContribution =
false;
566 int specLpeId = k_specStart + lpeId;
569 m_sCtx, m_shadingCtxIdx, lpeEvent,
572 m_sCtx, m_shadingCtxIdx, specular, &m_lgtTrans,
573 firstContribution, lgtLpeToken);
575 specular, &m_lgtTrans, isFinite, clamp, specLpeId,
579 memcpy(state.data(), stateBackup, stateSize*
sizeof(short));
587 firstContribution =
false;
590 int userLpeId = k_userStart + lpeId;
593 m_sCtx, m_shadingCtxIdx, lpeEvent,
596 m_sCtx, m_shadingCtxIdx, user, &m_lgtTrans, firstContribution,
599 user, &m_lgtTrans, isFinite, clamp, userLpeId,
k_Overwrite,
603 memcpy(state.data(), stateBackup, stateSize*
sizeof(short));
606 if (stateBackup != stateBuffer) free(stateBackup);
615 ? activeLobes.
SumAtIndex(weightIndex) * thruput * m_lgtTrans * clamp
616 : RixConstants::k_ZeroRGB;
618 SplatBeauty(val, m_eyeTrans);
620 else if (m_writeOpacityAllowed && (m_depth == 0))
622 float trans1 = m_eyeTrans.ChannelAvg();
625 m_displaySvc->WriteOpacity(
626 m_rixLpe.m_beautyChanId, m_integratorCtxIdx, 1.0f - trans1);
641 RixLPE const& rixLpe = m_rixLpe;
648 std::vector<short>& state = m_state.GetState();
649 size_t stateSize = state.size();
650 short stateBuffer[1<<16];
652 short* stateBackup = stateBuffer;
653 if (stateSize > 1<<16)
655 stateBackup = (
short*)malloc(stateSize*
sizeof(
short));
657 memcpy(stateBackup, state.data(), stateSize*
sizeof(short));
659 m_state.MoveEmissiveObject(
660 m_sCtx, m_shadingCtxIdx, emission, m_lpeGrpId);
666 memcpy(state.data(), stateBackup, stateSize*
sizeof(short));
668 if (stateBackup != stateBuffer) free(stateBackup);
678 ? (emission * thruput * m_lgtTrans * clamp)
679 : RixConstants::k_ZeroRGB,
682 else if (m_writeOpacityAllowed && (m_depth == 0))
684 float trans1 = m_eyeTrans.ChannelAvg();
687 m_displaySvc->WriteOpacity(
688 m_rixLpe.m_beautyChanId, m_integratorCtxIdx, 1.0f - trans1);
703 if (m_rixLpe.m_anyLPEs)
705 SplatLPE(color, &m_lgtTrans, isFinite, clamp, -1);
710 ? (color * m_lgtTrans * clamp)
711 : RixConstants::k_ZeroRGB,
718 m_displaySvc->Splat(m_rixLpe.m_beautyChanId, m_integratorCtxIdx, val);
720 float trans1 = trans.ChannelAvg();
721 if (m_writeOpacityAllowed && (m_depth == 0) && (trans1 != 1.0f))
723 m_displaySvc->WriteOpacity(
724 m_rixLpe.m_beautyChanId, m_integratorCtxIdx, 1.0f - trans1);
739 m_rixLpe.Splat( m_state, m_displaySvc, val,
740 m_integratorCtxIdx, lgtTrans,
741 clamp, isFinite, overwritePolicy, isHoldout );
unsigned int begin_rules
Definition: RixLPEInline.h:99
PRMAN_INLINE bool GetReflect() const
Definition: RixBxdfLobe.h:680
void MoveLight(RixShadingContext const *sCtx, int sCtxIndex, RtColorRGB const &thruput, RtColorRGB const *lightTrans, bool firstContribution, RixLPEToken lgtLpeToken)
Call this method at a light event along a light transport path.
Definition: RixLPEInline.h:253
PRMAN_INLINE RixLPEToken GetEvent() const
Definition: RixLPEInline.h:430
RixShadingContext is analogous to a RenderMan grid - it is a group of 1 or more points that may be sh...
Definition: RixShading.h:663
Definition: RixBxdfLobe.h:332
PRMAN_INLINE RixLPEToken GetScatt() const
Definition: RixLPEInline.h:437
void SetState(const std::vector< short > &state)
Definition: RixLPEInline.h:184
~RixLPEState()
Definition: RixLPEInline.h:159
unsigned int nrules
Definition: RixLPEInline.h:100
PRMAN_INLINE unsigned char GetSpecularLpeId(int i) const
Definition: RixBxdfLobe.h:1470
PRMAN_INLINE unsigned char GetLpeIndex() const
Definition: RixLPEInline.h:449
void MoveCamera(RixShadingContext const *sCtx, int sCtxIndex)
Call this method at a camera event along a light transport path.
Definition: RixLPEInline.h:222
PRMAN_INLINE unsigned int RixFindFirstSetBit(unsigned long long v)
Definition: RixShadingUtils.h:110
static PRMAN_INLINE RixLPEToken LgtGrpIdToToken(int lightGroupId)
Convert an integer light group id to an LPE token.
Definition: RixLPEInline.h:125
std::vector< State > m_states
Definition: RixLPEInline.h:116
pxrcore::ColorRGB RtColorRGB
Definition: RiTypesHelper.h:520
Definition: RixLPEInline.h:95
PRMAN_INLINE RtColorRGB const * GetUserLobe(int i) const
Definition: RixBxdfLobe.h:1440
PRMAN_INLINE unsigned char GetNumDiffuseLobes() const
Definition: RixBxdfLobe.h:1410
bool m_anyCustomLPEs
Definition: RixLPE.h:256
PRMAN_INLINE bool GetValid() const
Definition: RixBxdfLobe.h:650
PRMAN_INLINE void SplatPerLobe(RixBXActiveLobeWeights &activeLobes, int weightIndex, RtColorRGB const &thruput, bool isFinite, float clamp=1.0f, bool isHoldout=false)
Definition: RixLPEInline.h:500
static const int k_baseLgtGrpTokenOffset
Definition: RixLPE.h:188
int RixLPEToken
Definition: RixInterfaces.h:977
OverwritePolicy
Definition: RixLPE.h:191
PRMAN_INLINE unsigned char GetDiffuseLpeId(int i) const
Definition: RixBxdfLobe.h:1464
PRMAN_INLINE SplatHelper(RixDisplayServices *displaySvc, int integratorCtxIndex, RixLPE &rixLpe, RixLPEState &state, int depth, RixLPEToken lightLpeToken, RixLPEToken lpeGroupId, bool isReflect, RtColorRGB const &eyeTrans, RtColorRGB const &lightTrans, RixShadingContext const *shadingCtx, int shadingCtxIndex, bool writeOpacityAllowed=true)
Definition: RixLPEInline.h:465
static bool trans_comp(const Transition &a, const Transition &b)
Definition: RixLPEInline.h:107
RixLPEToken symbol
Definition: RixLPEInline.h:111
bool m_anyLPEs
Definition: RixLPE.h:253
This struct represents the characteristics of just one lobe of a bxdf.
Definition: RixBxdfLobe.h:63
PRMAN_INLINE unsigned char GetNumUserLobes() const
Definition: RixBxdfLobe.h:1422
std::vector< int > customIdVec
Definition: RixLPEInline.h:102
std::vector< Transition > m_trans
Definition: RixLPEInline.h:114
void MoveVertex(RixShadingContext const *sCtx, int sCtxIndex, RixLPEScatterEvent const scatterEvent, RixLPEToken lpeGroupId=RixLPE::k_BLANK)
Invoke this method at an intermediate (non-camera/non-light) scattering event along a light transport...
Definition: RixLPEInline.h:270
PRMAN_INLINE bool GetUser() const
Definition: RixBxdfLobe.h:713
PRMAN_INLINE unsigned char GetLpeId() const
Definition: RixLPEInline.h:443
std::vector< void * > m_rules
Definition: RixLPEInline.h:115
void *const * getRules(int state, int &count) const
Definition: RixLPEInline.h:89
short wildcard_trans
Definition: RixLPEInline.h:101
bool Broken() const
Definition: RixLPEInline.h:190
const RixLPEAutomata * GetAutomata(int &nautomata) const
Definition: RixLPEInline.h:215
void Reset()
Definition: RixLPEInline.h:164
short getTransition(short state, RixLPEToken symbol) const
Definition: RixLPEInline.h:72
A compact deterministic finite automata class.
Definition: RixLPEInline.h:69
const RtColorRGB & GetThruput() const
Definition: RixLPEInline.h:209
PRMAN_INLINE bool AnyCustomLPEs() const
Definition: RixLPEInline.h:143
#define PRMAN_INLINE
Definition: prmanapi.h:99
Multiple methods of RixDisplayServices require similar parameters:
Definition: RixIntegrator.h:97
unsigned int begin_trans
Definition: RixLPEInline.h:97
PRMAN_INLINE unsigned char GetUserLpeId(int i) const
Definition: RixBxdfLobe.h:1476
PRMAN_INLINE RtColorRGB const * GetSpecularLobe(int i) const
Definition: RixBxdfLobe.h:1434
RtColorRGB m_eyeTrans
Definition: RixLPE.h:353
void MoveEmissiveObject(RixShadingContext const *sCtx, int sCtxIndex, RtColorRGB const &thruput, RixLPEToken lpeGroupId=RixLPE::k_BLANK)
Call this method at an emissive object event along a light transport path.
Definition: RixLPEInline.h:240
PRMAN_INLINE unsigned char GetNumSpecularLobes() const
Definition: RixBxdfLobe.h:1416
RixLPEState(RixLPEAutomata const *automata, const int nautomata)
Definition: RixLPEInline.h:151
PRMAN_INLINE void SplatBeauty(RtColorRGB const &val, RtColorRGB &trans) const
Definition: RixLPEInline.h:716
PRMAN_INLINE RixLPEScatterEvent(RixBXLobeSampled lobeSampled)
Definition: RixLPEInline.h:361
PRMAN_INLINE unsigned short GetSpecular() const
Definition: RixBxdfLobe.h:1016
PRMAN_INLINE unsigned short GetDiffuse() const
Definition: RixBxdfLobe.h:1010
PRMAN_INLINE bool GetValid() const
Definition: RixLPEInline.h:455
std::vector< short > & GetState()
Definition: RixLPEInline.h:172
PRMAN_INLINE ~SplatHelper()
Definition: RixLPEInline.h:495
unsigned int ntrans
Definition: RixLPEInline.h:98
RixChannelId m_beautyChanId
Definition: RixLPE.h:259
Represents the LPE system state of a light transport path.
Definition: RixLPE.h:439
PRMAN_INLINE void SplatValue(RtColorRGB const &color, bool isFinite, float clamp=1.0f)
Definition: RixLPEInline.h:695
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 SplatEmission(RtColorRGB const &emission, RtColorRGB const &thruput, bool isFinite, float clamp=1.0f, bool isHoldout=false)
Definition: RixLPEInline.h:633
PRMAN_INLINE bool GetReflect() const
Definition: RixBxdfLobe.h:992
bool Test(const RixLPEToken dir, const RixLPEToken sca, const RixLPEToken custom)
Definition: RixLPEInline.h:198
PRMAN_INLINE bool AnyLPEs() const
Definition: RixLPEInline.h:136
Definition: RixLPEInline.h:104
PRMAN_INLINE void SplatLPE(RtColorRGB const &val, RtColorRGB const *lightTrans, bool isFinite, float clamp, int lpeId=-1, OverwritePolicy overwritePolicy=k_Overwrite, bool isHoldout=false)
Definition: RixLPEInline.h:729
short state
Definition: RixLPEInline.h:112
PRMAN_INLINE unsigned char GetLpeId() const
Definition: RixBxdfLobe.h:719
#define PIXAR_ARGUSED(x)
Definition: prmanapi.h:170
PRMAN_INLINE RtColorRGB const * GetDiffuseLobe(int i) const
Definition: RixBxdfLobe.h:1428