1 #pragma once
2 
3 #ifndef Y_BASICNODES_H
4 #define Y_BASICNODES_H
5 
6 #include <core_api/shader.h>
7 #include <core_api/texture.h>
8 #include <core_api/environment.h>
9 #include <core_api/matrix4.h>
10 
11 __BEGIN_YAFRAY
12 
13 enum TEX_COORDS {TXC_UV, TXC_GLOB, TXC_ORCO, TXC_TRAN, TXC_NOR, TXC_REFL, TXC_WIN, TXC_STICK, TXC_STRESS, TXC_TAN };
14 enum TEX_PROJ {TXP_PLAIN=0, TXP_CUBE, TXP_TUBE, TXP_SPHERE};
15 
16 class textureMapper_t: public shaderNode_t
17 {
18 	public:
19 		textureMapper_t(const texture_t *texture);
20 		virtual void eval(nodeStack_t &stack, const renderState_t &state, const surfacePoint_t &sp)const;
21 		virtual void eval(nodeStack_t &stack, const renderState_t &state, const surfacePoint_t &sp, const vector3d_t &wo, const vector3d_t &wi)const;
22 		virtual void evalDerivative(nodeStack_t &stack, const renderState_t &state, const surfacePoint_t &sp)const;
configInputs(const paraMap_t & params,const nodeFinder_t & find)23 		virtual bool configInputs(const paraMap_t &params, const nodeFinder_t &find) { return true; };
24 		//virtual void getDerivative(const surfacePoint_t &sp, float &du, float &dv)const;
25 		static shaderNode_t* factory(const paraMap_t &params,renderEnvironment_t &render);
26 	protected:
27 		void setup();
28 		void getCoords(point3d_t &texpt, vector3d_t &Ng, const surfacePoint_t &sp, const renderState_t &state) const;
29 		point3d_t doMapping(const point3d_t &p, const vector3d_t &N)const;
30 		TEX_COORDS 	tex_coords;
31 		TEX_PROJ tex_maptype;
32 		int map_x, map_y, map_z; //!< axis mapping; 0:set to zero, 1:x, 2:y, 3:z
33 		point3d_t pDU, pDV, pDW;
34 		float dU, dV, dW, dUV;
35 		const texture_t *tex;
36 		vector3d_t scale;
37 		vector3d_t offset;
38 		float bumpStr;
39 		bool doScalar;
40 		matrix4x4_t mtx;
41 };
42 
43 class valueNode_t: public shaderNode_t
44 {
45 	public:
valueNode_t(colorA_t col,float val)46 		valueNode_t(colorA_t col, float val): color(col), value(val) {}
47 		virtual void eval(nodeStack_t &stack, const renderState_t &state, const surfacePoint_t &sp)const;
48 		virtual void eval(nodeStack_t &stack, const renderState_t &state, const surfacePoint_t &sp, const vector3d_t &wo, const vector3d_t &wi)const;
configInputs(const paraMap_t & params,const nodeFinder_t & find)49 		virtual bool configInputs(const paraMap_t &params, const nodeFinder_t &find) { return true; };
50 		static shaderNode_t* factory(const paraMap_t &params,renderEnvironment_t &render);
51 	protected:
52 		colorA_t color;
53 		float value;
54 };
55 
56 class mixNode_t: public shaderNode_t
57 {
58 	public:
59 		mixNode_t();
60 		mixNode_t(float val);
61 		virtual void eval(nodeStack_t &stack, const renderState_t &state, const surfacePoint_t &sp)const;
62 		virtual void eval(nodeStack_t &stack, const renderState_t &state, const surfacePoint_t &sp, const vector3d_t &wo, const vector3d_t &wi)const;
63 		virtual bool configInputs(const paraMap_t &params, const nodeFinder_t &find);
64 		virtual bool getDependencies(std::vector<const shaderNode_t*> &dep) const;
65 		static shaderNode_t* factory(const paraMap_t &params,renderEnvironment_t &render);
66 	protected:
67 		void getInputs(nodeStack_t &stack, colorA_t &cin1, colorA_t &cin2, float &fin1, float &fin2, float &f2) const;
68 		colorA_t col1, col2;
69 		float val1, val2, cfactor;
70 		const shaderNode_t *input1;
71 		const shaderNode_t *input2;
72 		const shaderNode_t *factor;
73 };
74 
getInputs(nodeStack_t & stack,colorA_t & cin1,colorA_t & cin2,float & fin1,float & fin2,float & f2)75 inline void mixNode_t::getInputs(nodeStack_t &stack, colorA_t &cin1, colorA_t &cin2, float &fin1, float &fin2, float &f2) const
76 {
77 	f2 = (factor) ? factor->getScalar(stack) : cfactor;
78 	if(input1)
79 	{
80 		cin1 = input1->getColor(stack);
81 		fin1 = input1->getScalar(stack);
82 	}
83 	else
84 	{
85 		cin1 = col1;
86 		fin1 = val1;
87 	}
88 	if(input2)
89 	{
90 		cin2 = input2->getColor(stack);
91 		fin2 = input2->getScalar(stack);
92 	}
93 	else
94 	{
95 		cin2 = col2;
96 		fin2 = val2;
97 	}
98 }
99 
100 
101 __END_YAFRAY
102 
103 #endif // Y_BASICNODES_H
104