aboutsummaryrefslogtreecommitdiff
path: root/vrayPlug/plugin/shaveVrayShadeData.h
blob: b85c8aa059ba3e7f76fe167bcb61b32b77579b67 (plain) (blame)
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