37 #ifndef RixIntegrator_h 38 #define RixIntegrator_h 58 static const RixChannelId k_InvalidChannelId = 2147483647;
127 virtual bool SplatMulti(
128 int nChans,
RixChannelId const* ids,
int iCtxIndex,
float const value) = 0;
130 virtual bool SplatMulti(
146 virtual bool Write(
RixChannelId id,
int iCtxIndex,
float const value) = 0;
150 virtual bool Write(
RixChannelId id,
int iCtxIndex,
int const value) = 0;
169 virtual void WriteDistance(
171 float const distance,
172 bool const isVolume =
true,
182 virtual void WriteOpacity(
RixChannelId id,
int iCtxIndex,
float const value) = 0;
192 virtual void SplatOpacity(
RixChannelId id,
int iCtxIndex,
float const opacity) = 0;
208 virtual int AddSample(
int iCtxIndex) = 0;
219 virtual void GetDisplayChannels(
int* numDisplays,
RixDisplayChannel const** displays) = 0;
228 virtual void DiscardIteration(
bool redo =
false) = 0;
241 k_rtTransmission = 3,
267 uint32_t private0[5];
269 mutable uint16_t hitId;
294 this->shadingCtxIndex = _shadingCtxIndex;
298 bool const entering = Dot(Ngn[_shadingCtxIndex], this->direction) <= 0.f;
314 this->shadingCtxIndex = _shadingCtxIndex;
316 this->lobeSampled.
Set(
354 float rayOriginRadius,
355 float rayOriginSpread,
358 bool lightPath =
false)
360 float pdfSpread = 0.0f;
369 pdfSpread = 0.125f / sqrtf(fPdf);
386 float curvatureSpread = rayOriginSpread + 2.0f * curvature * rayOriginRadius;
387 newSpread = std::max(curvatureSpread, pdfSpread);
403 newSpread = std::max(rayOriginSpread, pdfSpread);
415 newSpread = rayOriginSpread;
419 if (!(newSpread <= 1.0f)) newSpread = 1.0f;
420 if (newSpread < -1.0f) newSpread = -1.0f;
421 assert(-1.0f <= newSpread && newSpread <= 1.0f);
423 this->raySpread = newSpread;
435 return wavelength != 0.0f ?
436 (int((wavelength - 380.0f) * (65534.0f / (780.0f - 380.0f)) + 0.5f) + 1) :
449 return encodedWavelength != 0 ?
450 (float(encodedWavelength - 1) * ((780.0f - 380.0f) / 65534.0f) + 380.0f) :
479 k_AllModes = (k_Fixed | k_Adaptive | k_Incremental)
485 k_UnidirectionalLighting = 0,
486 k_BidirectionalLighting = 1
491 maxIntegrateSize(1024),
492 maxShadingCtxSize(1024),
493 supportedSamplingModes(k_AllModes),
494 lightingRequirements(k_UnidirectionalLighting),
497 wantsEmptyIntegrate(false),
498 wantsIncrementBarrier(false),
499 numRaysPerIncrement(-1),
501 numBootstrapIncrements(0),
502 lobesWanted(k_RixBXTraitsAllLobe),
503 cameraMediumIOR(1.f),
504 cameraMediumPriority(0),
505 wantsTransmission(false),
506 usesLightingServices(true)
520 for (
int i = 0; i < numDisplays; ++i)
521 if (displays[i].
channel == name)
return &displays[i];
591 static const int k_MaxRaysPerBatch = 32768;
622 k_ConstrainToVolume = 4,
623 k_ContinuationOpacity = 8,
665 virtual void GetNearestHits(
704 virtual void GetNearestHits(
767 bool isLightPath =
false,
769 bool isPrimary =
false,
770 bool isVolume =
false,
771 bool stochasticMode =
true)
773 int nearestHitFlags =
774 (isPrimary ? k_Primary : k_None) |
775 (wantsMisses ? k_IncludeMisses : k_None) |
776 (isVolume ? k_ConstrainToVolume : k_None) |
777 (stochasticMode ? k_None : k_ContinuationOpacity);
781 GetNearestHits(nRays, rays, lobesWanted,
782 raytype, nearestHitFlags, subset, excludeSubset, hitSides, numShadingCtxs, shadingCtxs);
799 bool isPrimary =
false,
800 bool isVolume =
false,
801 bool stochasticMode =
true)
803 int nearestHitFlags =
804 (isPrimary ? k_Primary : k_None) |
805 (isVolume ? k_ConstrainToVolume : k_None) |
806 (stochasticMode ? k_None : k_ContinuationOpacity);
808 GetNearestHits(nRays, rays, raytype,
809 nearestHitFlags, subset, excludeSubset, hitSides, hits);
835 virtual void GetTransmission(
852 virtual void ReleaseShadingContexts(
864 virtual void* Allocate(
size_t nObjs,
size_t objSize,
MemCategory) = 0;
869 T* mem =
static_cast<T*
>(Allocate(nObjs,
sizeof(T), k_IntegratorMem));
873 template <
class T> T*
New(
size_t nObjs)
875 T* mem =
static_cast<T*
>(Allocate(nObjs,
sizeof(T), k_IntegratorMem));
876 return new (mem) T[nObjs];
898 virtual void RenderBegin(
959 for (
int i = 0; i < *numShadingCtxs; ++i)
964 for (
int j = 0; j < sCtx->
numPts; ++j)
970 Integrate(*numShadingCtxs, shadingCtxs, iCtx);
988 virtual void Integrate(
1046 void const* results)
1122 uint32_t
const editHints,
1135 virtual void DestroyIntegrator(
RixIntegrator const* integrator) = 0;
1144 #define RIX_INTEGRATORFACTORYCREATE \ 1145 extern "C" PRMANEXPORT RixIntegratorFactory* CreateRixIntegratorFactory(const char* hint) 1147 #define RIX_INTEGRATORFACTORYDESTROY \ 1148 extern "C" PRMANEXPORT void DestroyRixIntegratorFactory(RixIntegratorFactory* factory)
LightingModes
Indicates the lighting modes supported by the integrator.
RixBXLobeSampled lobeSampled
See RayType for possible values.
virtual void GetNearestHits(int nRays, RtRayGeometry const *rays, RixBXLobeTraits const &lobesWanted, RtRayGeometry::RayType rayType, int nearestHitFlags, RtUString const subset, RtUString const excludeSubset, RtHitSides hitSides, int *numShadingCtxs, RixShadingContext const **shadingCtxs)=0
virtual int GetInterface() const override
void InitOrigination(RixShadingContext const *sCtx, RtNormal3 const *Ngn, int _shadingCtxIndex)
int m_version
Interface version.
pxrcore::ColorRGB RtColorRGB
uint16_t raytype
Shutter-normalized time of ray launch.
This struct represents the characteristics of just one lobe of a bxdf.
float raySpread
Ray direction.
PRMAN_INLINE bool GetSolidAngle() const
bool wantsIncrementBarrier
float dist
Geometric normal on hit.
LightingModes lightingRequirements
Deprecated.
uint16_t shadingCtxIndex
Associated primary ray index.
float opacityThreshold
Data for internal use.
int16_t integratorCtxIndex
Shading context unique identifier.
RixShadingContext::Id shadingCtxId
Characteristics of the BxDF lobe this ray samples.
bool usesLightingServices
uint16_t rayId
Index into the lauching shading context.
PRMAN_INLINE bool GetTransmit(bool *entering=NULL) const
RixBXLobeTraits lobesWanted
RixRNG * rngCtx
A pointer to single RixRNG object, properly configured for numRays samples.
Indicate if the ray should be considered as a primary ray or a continuation of one, uninterrupted from the camera or a light source.
enum RixDisplayChannel::ChannelType type
enum RixDisplayChannel::ChannelStyle style
RtRayGeometry * primaryRays
The primary camera rays.
RixLPEState * lpeState
User-provided index in the ray bundle.
virtual RixDisplayServices * GetDisplayServices(int version=1) const =0
SamplingModes
Indicates the sampling modes supported by the integrator.
float maxDist
Minimum hit distance. Used only for primary rays.
void InitTransmitOrigination(RixShadingContext const *sCtx, int _shadingCtxIndex)
virtual ~RixIntegratorContext()
T * Allocate(size_t nObjs)
int cameraMediumPriority
Priority of the medium surrounding the camera. Defaults to 0.
bool wantsTransmission
Expresses whether integrator has a non trivial GetTransmission() method.
struct RixShadingContext::Id shadingCtxId
virtual void SynchronizeInstanceData(RixContext &rixCtx, RtUString const handle, RixParameterList const *instanceParams, uint32_t const editHints, InstanceData *instanceData) override final
void Splat(RtInt numShadingContexts, RixShadingContext const **sctxs, RixDisplayServices *dspsvc, RtFloat3 *aovValue, RtFloat *savedFloat, RixChannelId *aovIdList, RixBXLobeTraits const *lobesWanted=NULL, RtUString coordinateSystem=Rix::k_camera)
PRMAN_INLINE void SetEntering(bool entering)
int const numDisplays
Display state (unmutable).
float filterSize
(u,v) coordinates of the hit.
pxrcore::UString RtUString
virtual bool SetProperty(RixIntegratorContext &iCtx, const int *rayIds, int nRays, RayProperty rayProperty, void const *values)
virtual ~RixDisplayServices()
#define k_RixShadingVersion
virtual ~RixIntegratorFactory()
virtual void GetNearestHits(int nRays, RtRayGeometry const *rays, RtHitPoint *hits, RtUString const subset=US_NULL, RtUString const excludeSubset=US_NULL, RtHitSides hitSides=k_SidesBoth, bool isPrimary=false, bool isVolume=false, bool stochasticMode=true)
PRMAN_INLINE int RixIsFinite(float x)
Length of view vector (type float)
PRMAN_INLINE bool GetReflect() const
static PRMAN_INLINE uint16_t EncodeWavelength(float wavelength)
virtual void WriteDistance(int const iCtxIndex, float const distance, bool const isVolume=true, RixShadingContext const *sCtx=nullptr)=0
uint16_t wavelength
Flags for internal use.
virtual bool GetProperty(RixIntegratorContext &iCtx, const int *rayIds, int nRays, RayProperty rayProperty, void const *results)
virtual void Synchronize(RixContext &rCtx, RixSCSyncMsg rixSCSyncMsg, RixParameterList const *rixParameterList)
virtual void CreateInstanceData(RixContext &rixCtx, RtUString const handle, RixParameterList const *instanceParams, InstanceData *instanceData) override final
virtual void IntegrateRays(RixBXLobeTraits const &lobesWanted, int *numShadingCtxs, RixShadingContext const **shadingCtxs, RixIntegratorContext &iCtx)
float mpSize
Used for texture filtering.
virtual void GetTransmission(int nRays, RtRayGeometry const *rays, RtColorRGB *transmissions, RtColorRGB *volumeEmissions, RtUString const subset, RtUString const excludeSubset, RixIntegratorContext &iCtx)
SamplingModes supportedSamplingModes
Deprecated.
int numBootstrapIncrements
Used to request iterations which do not contribute to the final result.
uint16_t flags
Internal hit id, zero means 'no hit.'.
float originRadius
Ray origin.
RixIntegratorEnvironment()
PRMAN_INLINE RixDisplayChannel const * GetDisplayChannel(RtUString name) const
int numRays
Unique identifier for integrator context.
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.
unsigned int RixChannelId
static PRMAN_INLINE float DecodeWavelength(uint16_t encodedWavelength)
RtVector3 direction
Radius of ray at its origin.
virtual void GetNearestHits(int nRays, RtRayGeometry const *rays, RixBXLobeTraits const &lobesWanted, bool wantsMisses, int *numShadingCtxs, RixShadingContext const **shadingCtxs, RtUString const subset=US_NULL, RtUString const excludeSubset=US_NULL, bool isLightPath=false, RtHitSides hitSides=k_SidesBoth, bool isPrimary=false, bool isVolume=false, bool stochasticMode=true)
int const numIncrements
Total number of increments. This is usually maxsamples.
RixDisplayChannel const *const displays
float time
Maximum hit distance.
RtNormal3 Ng
Hit position.
void SetRaySpread(RixBXLobeSampled lobe, float rayOriginRadius, float rayOriginSpread, float curvature, float fPdf, bool lightPath=false)
virtual void GetBuiltinVar(BuiltinVar, int const **var) const =0
int const numRaysPerIncrement
RtPoint2 uv
Distance to hit point. 0 means 'no hit'.