1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#ifndef _HAIR_VRAY_SHADE_DATA_H_
#define _HAIR_VRAY_SHADE_DATA_H_
// Shave and a Haircut
// (c) 2019 Epic Games
// US Patent 6720962
// V-Ray headers
#include "vraybase.h"
#include "vraymayageom.h"
#include "vrayplugins.h"
#include "geometryclasses.h"
#include "hairprimitives.h"
#include "rayprimitives.h"
class shaveVrayInstance;
class shaveVrayVoxelPrim;
class shaveVrayShadeData : public VR::BaseShadeData,
#if VRAY_DLL_VERSION < 0x31000
public VR::VRayMayaHairDataInterface,
public VR::VRayFurSamplingInterface,
#else
public VR::VRayHairCommonShadeData,
#endif
public VR::MappedSurface
{
#if defined(VRAY30) || defined(VRAY40)
VR::HairData *hairData;
#endif
shaveVrayVoxelPrim* getIntersectedPrimitive(const VR::VRayContext &rc);
public:
shaveVrayShadeData(shaveVrayInstance *instance /*, MayaHairPrimitiveType *hairPrimitive*/);
PluginBase* getPlugin(void) VRAY_OVERRIDE
{
return NULL;
}
PluginInterface* newInterface(InterfaceID id) VRAY_OVERRIDE
{
#if VRAY_DLL_VERSION < 0x31000
if (id==EXT_MAYA_HAIR_DATA)
return static_cast<VR::VRayMayaHairDataInterface*>(this);
if (id==EXT_VRAY_FUR_SAMPLING)
return static_cast<VR::VRayFurSamplingInterface*>(this);
#else
if (id==EXT_VRAY_COMMON_HAIR_SHADE_DATA)
return static_cast<VR::VRayHairCommonShadeData*>(this);
#endif
if (id==EXT_MAPPED_SURFACE)
return static_cast<VR::MappedSurface*>(this);
return BaseShadeData::newInterface(id);
}
// From VRayMayaHairDataInterface
// From VRayHairCommonShadeData (3.0)
VR::Color getColor(const VR::VRayContext &rc) VRAY_OVERRIDE;
VR::Color getIncandescence(const VR::VRayContext &rc) VRAY_OVERRIDE;
VR::Color getTransparency(const VR::VRayContext &rc) VRAY_OVERRIDE;
void getShadeData(const VR::VRayContext &rc, VR::VRayMayaHairShadeData &result) VRAY_OVERRIDE;
#if defined(VRAY30) || defined(VRAY40)
float getRandByStrand(const VR::VRayContext &rc, int seedOffset) VRAY_OVERRIDE;
int getStrandIndex(const VR::VRayContext &rc) VRAY_OVERRIDE;
int getSegmentIndexInStrand(const VR::VRayContext &rc) VRAY_OVERRIDE;
void getIndexAndBlend(const VR::VRayContext &rc, int &out_index, float &out_blend) VRAY_OVERRIDE;
# if VRAY_DLL_VERSION >= 0x36000
float getStrandLength(const VR::VRayContext &rc) VRAY_OVERRIDE;
# endif
#endif
// From VRayFurSamplingInterface
float getDistanceAlongStrand(const VR::VRayContext &rc) VRAY_OVERRIDE;
// From MappedSurface
#if defined(VRAY30)
VR::Transform getLocalUVWTransform(const VR::VRayContext &rc, int channel) VRAY_OVERRIDE;
#elif defined(VRAY40)
void getLocalUVWTransform(const VR::VRayContext &rc, int channel, VR::ShadeTransform &result) override;
void getLocalUVWCoordinates(const VR::VRayContext &rc, int channel, VR::ShadeVec &result) override;
int getLocalUVWTransformByName(const VR::VRayContext &rc, const VR::StringID &channelName, VR::ShadeTransform &result) override;
int getUVWCoordinatesByName(const VR::VRayContext &rc, const VR::StringID &channelName, VR::ShadeVec &result) override;
VR::ShadeVec getMapChannelVertexVector(int mapChannelIdx, int vertexIdx) override;
VR::ShadeVec getUVWcoords(const VR::VRayContext &vri, int channel) override;
void getUVWderivs(const VR::VRayContext &vri, int channel, VR::ShadeVec derivs[2]) override;
void getUVWbases(const VR::VRayContext &vri, int channel, VR::ShadeVec bases[3]) override;
VR::ShadeVec getUVWnormal(const VR::VRayContext &vri, int channel) override;
#endif
};
/*
* Get strand, segment index and offset within segment from ray context.
*/
static inline void shaveVrayGetHairParams(const VR::VRayContext &rc, int &out_strand, int &out_segment, float &out_offset) {
#if defined(VRAY30) || defined(VRAY40)
out_strand = rc.rayresult.extra_int[1];
out_segment = rc.rayresult.faceIndex;
out_offset = rc.rayresult.bary[0];
#else
out_strand = rc.rayresult.faceIndex;
out_segment = (int)rc.rayresult.extraf;
out_offset = rc.rayresult.bary[2];
#endif
}
/*
* Get strand and segment index from ray context.
*/
static inline void shaveVrayGetHairParams(const VR::VRayContext &rc, int &out_strand, int &out_segment) {
#if defined(VRAY30) || defined(VRAY40)
out_strand = rc.rayresult.extra_int[1];
out_segment = rc.rayresult.faceIndex;
#else
out_strand = rc.rayresult.faceIndex;
out_segment = (int)rc.rayresult.extraf;
#endif
}
#endif
|