75 #include "RixInterfaces.h"
80 #define k_RixShadingVersion 200 // XXY (XX: MAJOR, Y:MINOR)
87 class RixDisplayServices;
106 enum RixShadingInterface
128 k_RixSCIncrementBarrier
139 virtual int GetVersion()
const {
return m_version; }
140 virtual int GetInterface()
const {
return k_RixInvalid; }
141 virtual int Init(RixContext &ctx,
char const *pluginPath) = 0;
143 virtual void Finalize(RixContext &ctx) = 0;
183 InstanceData() : data(NULL), datalen(0), freefunc(NULL) {}
186 void (*freefunc)(RtPointer);
188 virtual int CreateInstanceData(RixContext &,
208 k_RixSCInvalidType=0,
232 k_RixSCInvalidDetail=0,
252 enum RixSCVolumeSelector
255 k_RixSCIncidentVolume,
256 k_RixSCOppositeVolume
263 enum RixSCConnectionInfo
265 k_RixSCDefaultValue = 0,
266 k_RixSCParameterListValue,
277 RixSCAccess a = k_RixSCInput,
289 RixSCType t, RixSCAccess a = k_RixSCInput,
292 customtype(structnm),
303 type(k_RixSCInvalidType),
304 access(k_RixSCInvalidAccess),
310 char const *customtype;
314 bool IsArray()
const {
return (arraylen != -1); }
324 enum RixSCShadingMode
326 k_RixSCInvalidShadingMode,
327 k_RixSCPresenceQuery,
330 k_RixSCVolumeTransmissionQuery,
331 k_RixSCVolumeScatterQuery,
345 virtual RtInt GetNumParams()
const = 0;
353 virtual RtInt
GetParamId(
char const *name, RtInt *paramid)
const = 0;
358 virtual RtInt
GetParamId(
int plistIndex, RtInt *paramid)
const = 0;
364 virtual RtInt
GetParamInfo(RtInt paramid, RixSCType *type,
365 RixSCConnectionInfo *cinfo,
366 int *arraylength=NULL)
const = 0;
371 bool *isconnected,
int *arraylength=NULL)
const
373 RixSCConnectionInfo cinfo;
374 int err =
GetParamInfo(paramid, type, &cinfo, arraylength);
376 *isconnected = (cinfo == k_RixSCNetworkValue);
390 virtual RixSCDetail
EvalParam(RtInt paramid, RtInt arrayindex,
391 RtInt * result)
const = 0;
392 virtual RixSCDetail
EvalParam(RtInt paramid, RtInt arrayindex,
393 RtFloat * result)
const = 0;
394 virtual RixSCDetail
EvalParam(RtInt paramid, RtInt arrayindex,
395 RtColorRGB * result)
const = 0;
396 virtual RixSCDetail
EvalParam(RtInt paramid, RtInt arrayindex,
397 RtFloat3 * result)
const = 0;
398 virtual RixSCDetail
EvalParam(RtInt paramid, RtInt arrayindex,
399 RtMatrix4x4 * result)
const = 0;
400 virtual RixSCDetail
EvalParam(RtInt paramid, RtInt arrayindex,
401 RtConstString * result)
const = 0;
402 virtual RixSCDetail
EvalParam(RtInt paramid, RtInt arrayindex,
404 RtConstPointer * instance)
const = 0;
444 Id() : shadingCtxNum(-6666)
447 Id(
unsigned int i) : integratorCtxNum(static_cast<short>(i >> 16)),
448 shadingCtxNum(static_cast<short>(i & 0xFFFF))
452 unsigned int Serialize()
const
454 return ((
unsigned int) integratorCtxNum << 16) |
455 ((
unsigned int) shadingCtxNum & 0xFFFF);
457 void Invalidate() { shadingCtxNum = -6666; }
458 bool IsValid()
const {
return shadingCtxNum != -6666; }
459 short integratorCtxNum;
471 unsigned eyePath : 1;
498 bool HasHits()
const {
return (
scTraits.missContext == 0); }
499 bool HasMisses()
const {
return (
scTraits.missContext == 1); }
503 assert(
scTraits.shadingMode == k_RixSCScatterQuery ||
504 scTraits.shadingMode == k_RixSCVolumeScatterQuery);
510 assert(
scTraits.shadingMode == k_RixSCOpacityQuery ||
511 scTraits.shadingMode == k_RixSCPresenceQuery ||
512 scTraits.shadingMode == k_RixSCVolumeTransmissionQuery);
518 assert(
scTraits.shadingMode == k_RixSCScatterQuery ||
519 scTraits.shadingMode == k_RixSCVolumeScatterQuery ||
520 scTraits.shadingMode == k_RixSCVolumeTransmissionQuery);
534 virtual bool HasVolume(RixSCVolumeSelector)
const = 0;
536 RtInt nrays, RtRayGeometry *rays)
const = 0;
540 RtRayGeometry *rays)
const
542 return BeginVolume(k_RixSCIncidentVolume, nrays, rays);
545 RtRayGeometry *rays)
const
547 return BeginVolume(k_RixSCOppositeVolume, nrays, rays);
578 RtInt
const *membership=NULL)
const = 0;
582 virtual std::vector<const RixShadingContext *>
const *
620 RtFloat *pointWeight;
654 k_incidentLobeSampled,
673 k_launchShadingCtxId,
678 virtual void GetBuiltinVar(BuiltinVar, RtInt
const**var)
const = 0;
679 virtual void GetBuiltinVar(BuiltinVar, RtFloat
const**var)
const = 0;
680 virtual void GetBuiltinVar(BuiltinVar, RtFloat3
const**var)
const = 0;
681 virtual void GetBuiltinVar(BuiltinVar,
RixLPEState *
const**var)
const = 0;
698 virtual RixSCDetail
GetPrimVar(
char const *name,
699 RixSCType *type, RtInt *arraylen)
const = 0;
700 virtual RixSCDetail
GetPrimVar(
char const *name, RtFloat fill,
702 RtFloat
const **radius=NULL)
const = 0;
703 virtual RixSCDetail
GetPrimVar(
char const *name, RtFloat2 fill,
704 RtFloat2
const **var,
705 RtFloat
const **radius=NULL)
const = 0;
706 virtual RixSCDetail
GetPrimVar(
char const *name, RtFloat3 fill,
707 RtFloat3
const **var,
708 RtFloat
const **radius=NULL)
const = 0;
709 virtual RixSCDetail
GetPrimVar(
char const *name,
710 RtConstString **var)
const = 0;
718 virtual RixSCDetail
GetPrimVar(
char const *name,
720 RtFloat
const **dXdu,
721 RtFloat
const **dXdv)
const = 0;
722 virtual RixSCDetail
GetPrimVar(
char const *name,
723 RtFloat2
const **var,
724 RtFloat
const **dXdu,
725 RtFloat
const **dYdu,
726 RtFloat
const **dXdv,
727 RtFloat
const **dYdv)
const = 0;
728 virtual RixSCDetail
GetPrimVar(
char const *name,
729 RtFloat3
const **var,
730 RtFloat
const **dXdu,
731 RtFloat
const **dYdu,
732 RtFloat
const **dZdu,
733 RtFloat
const **dXdv,
734 RtFloat
const **dYdv,
735 RtFloat
const **dZdv)
const = 0;
739 virtual void SetPrimVar(
char const *name, RixSCDetail d,
740 RtFloat *var, RtFloat *radius) = 0;
741 virtual void SetPrimVar(
char const *name, RixSCDetail d,
742 RtFloat2 *var, RtFloat *radius) = 0;
743 virtual void SetPrimVar(
char const *name, RixSCDetail d,
744 RtFloat3 *var, RtFloat *radius) = 0;
745 virtual void SetPrimVar(
char const *name, RixSCDetail d,
748 enum TransformInterpretation
759 virtual int Transform(TransformInterpretation interp,
760 char const *fromSpace,
char const *toSpace,
761 RtFloat3 *var, RtFloat *radius = NULL)
const = 0;
768 virtual int GetTransform(
char const *fromSpace,
char const *toSpace,
769 RtMatrix4x4
const **matrix,
int *numMatrices)
const = 0;
827 virtual RixSCDetail
EvalParam(RtInt
id, RtInt arrayindex,
828 RtInt
const ** result,
829 RtInt
const *dflt=NULL,
830 bool promoteToVarying=
false)
const = 0;
831 virtual RixSCDetail
EvalParam(RtInt
id, RtInt arrayindex,
832 RtFloat
const ** result,
833 RtFloat
const *dflt=NULL,
834 bool promoteToVarying=
false)
const = 0;
835 virtual RixSCDetail
EvalParam(RtInt
id, RtInt arrayindex,
836 RtColorRGB
const ** result,
837 RtColorRGB
const *dflt=NULL,
838 bool promoteToVarying=
false)
const = 0;
839 virtual RixSCDetail
EvalParam(RtInt
id, RtInt arrayindex,
840 RtFloat3
const ** result,
841 RtFloat3
const *dflt=NULL,
842 bool promoteToVarying=
false)
const = 0;
843 virtual RixSCDetail
EvalParam(RtInt
id, RtInt arrayindex,
844 RtMatrix4x4
const ** result,
845 RtMatrix4x4
const *dflt=NULL,
846 bool promoteToVarying=
false)
const = 0;
847 virtual RixSCDetail
EvalParam(RtInt
id, RtInt arrayindex,
848 RtConstString** result,
849 RtConstString *dflt=NULL,
850 bool promoteToVarying=
false)
const = 0;
851 virtual RixSCDetail
EvalParam(RtInt
id, RtInt arrayindex,
854 bool promoteToVarying=
false)
const = 0;
872 bool promoteToVarying=
false,
873 MemCategory mcat=k_BxdfMem)
const
875 T
const *constResult;
876 RixSCDetail d =
EvalParam(
id, arrayindex, &constResult, dflt);
881 memcpy(*result, constResult, this->
numPts*
sizeof(T));
887 std::fill_n(*result, this->
numPts, constResult[0]);
891 *result = (T *)
Allocate(1,
sizeof(T), mcat);
892 (*result)[0] = constResult[0];
907 virtual RtInt
GetParamId(
char const *name, RtInt *paramid)
const = 0;
913 virtual RtInt
GetParamInfo(RtInt paramid, RixSCType *type,
914 RixSCConnectionInfo *cinfo,
915 int *arraylength=NULL)
const = 0;
920 bool *isconnected,
int *arraylength=NULL)
const
922 RixSCConnectionInfo cinfo;
923 int err =
GetParamInfo(paramid, type, &cinfo, arraylength);
925 *isconnected = (cinfo == k_RixSCNetworkValue);
935 virtual void GetNearestHits(RtInt numRays, RtRayGeometry
const *rays,
939 char const *subset=NULL,
940 RtHitSides hitSides=k_SidesBoth)
const = 0;
957 virtual void *
Allocate(
size_t n,
size_t size, MemCategory m)
const = 0;
967 T *
New(
size_t nObjs, MemCategory cat=k_BxdfMem)
const
969 T *mem =
static_cast<T*
>(
Allocate(nObjs,
sizeof(T), cat));
970 return new (mem) T[nObjs];
988 template <
typename T>
989 T *Allocate(RtInt num)
991 if(num == 0)
return NULL;
992 return (T *) m_sctx->
Allocate(num,
sizeof(T), k_BxdfMem);
994 template <
typename T>
995 T *AllocFor(MemCategory memcat, RtInt num)
997 if(num == 0)
return NULL;
998 return (T *) m_sctx->
Allocate(num,
sizeof(T), memcat);
1000 template <
typename T>
1001 T *AllocForVolume(RtInt num)
1005 if(num == 0)
return NULL;
1006 return (T *) m_sctx->
Allocate(num,
sizeof(T), k_BxdfMem);
1008 template <
typename T>
1009 T *AllocForBxdf(RtInt num)
1011 if(num == 0)
return NULL;
1012 return (T *) m_sctx->
Allocate(num,
sizeof(T), k_BxdfMem);
1014 template <
typename T>
1015 T *AllocForPattern(RtInt num)
1017 if(num == 0)
return NULL;
1018 return (T *) m_sctx->
Allocate(num,
sizeof(T), k_PatternMem);