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 ¶ms, 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 ¶ms,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 ¶ms, const nodeFinder_t &find) { return true; };
50 static shaderNode_t* factory(const paraMap_t ¶ms,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 ¶ms, const nodeFinder_t &find);
64 virtual bool getDependencies(std::vector<const shaderNode_t*> &dep) const;
65 static shaderNode_t* factory(const paraMap_t ¶ms,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