88fcaef90e69e170540e488c15a3cad923f7f970
[blender.git] / intern / elbeem / intern / ntl_lighting.h
1 /** \file elbeem/intern/ntl_lighting.h
2  *  \ingroup elbeem
3  */
4 /******************************************************************************
5  *
6  * El'Beem - Free Surface Fluid Simulation with the Lattice Boltzmann Method
7  * Copyright 2003-2006 Nils Thuerey
8  *
9  * a light object
10  * default omni light implementation
11  *
12  *****************************************************************************/
13 #ifndef NTL_LIGHTING_H
14 #define NTL_LIGHTING_H
15
16 #include "ntl_vector3dim.h"
17 class ntlMaterial;
18 class ntlRay;
19 class ntlRenderGlobals;
20 class ntlGeometryObject;
21
22
23
24 /* shadow map directions */
25 #define LSM_RIGHT 0
26 #define LSM_LEFT  1
27 #define LSM_UP    2
28 #define LSM_DOWN  3
29 #define LSM_FRONT 4
30 #define LSM_BACK  5
31
32 /*! Basic object for lights, all other light are derived from this one */
33 class ntlLightObject
34 {
35 public:
36   /* CONSTRUCTORS */
37   /*! Default constructor */
38   ntlLightObject(ntlRenderGlobals *glob);
39   /*! Constructor with parameters */
40   ntlLightObject(ntlRenderGlobals *glob, const ntlColor& col);
41   /*! Destructor */
42   virtual ~ntlLightObject();
43
44         /*! prepare light for rendering (for example shadow maps) */
45         virtual void prepare( bool );
46         
47         /*! do the illumination... */
48         virtual ntlColor illuminatePoint(ntlRay &reflectedRay, 
49                                                                                                                                          ntlGeometryObject *closest,
50                                                                                                                                          ntlColor &highlight);
51         /*! shade the point */
52         const ntlColor
53         getShadedColor(const ntlRay &reflectedray, ntlVec3Gfx lightDir,
54                                                                  ntlMaterial *surf, ntlColor &highlight) const;
55
56
57   /* access methods */
58   /*! Access the active flag */
59   inline void setActive(bool set) { mActive = set; }
60   inline bool getActive() const { return mActive; }
61   /*! Access the shadow flag */
62   inline void setCastShadows(bool set) { mCastShadows = set; }
63   inline bool getCastShadows() const { return mCastShadows; }
64   /*! Access the light color */
65   inline void setColor(ntlColor set) { mcColor = set; }
66   inline ntlColor getColor() const { return mcColor; }
67   
68   /*! Access the omni light position */
69   void setPosition(ntlVec3Gfx set) { mvPosition = set; }
70   ntlVec3Gfx getPosition() const { return mvPosition; }
71         
72
73 protected:
74         /*! render globals */
75         ntlRenderGlobals *mpGlob;
76
77         /*! is this light acitve? */
78         bool mActive;
79
80         /*! does it cast shadows? */
81         bool mCastShadows;
82
83   /*! color of this light */
84         ntlColor  mcColor;
85
86         /*! light position */
87         ntlVec3Gfx  mvPosition;
88
89 private:
90
91 };
92
93
94 //! Properties of an geo object, describing the reflection properties of the surface
95 class ntlMaterial
96 {
97 public:
98   // CONSTRUCTORS
99   //! Default constructor
100   ntlMaterial( void );
101   //! Constructor with parameters
102   /*! Sets reflectance, ambient reflection, specular intensity
103    *  specular exponent, mirror intensity 
104    *  transparency, refraction index */
105   ntlMaterial( string name,
106          const ntlColor& Ref, const ntlColor& Amb, 
107                            gfxReal Spec, gfxReal Exp, gfxReal Mirror,
108                            gfxReal Trans, gfxReal Refrac, gfxReal TAdd,
109                            const ntlColor& Att, int fres);
110   //! Desctructor
111   ~ntlMaterial() {};
112
113         //! Calculate reflectance and refratance from Fresnel's law
114         inline void calculateFresnel(const ntlVec3Gfx &dir, const ntlVec3Gfx &normal, gfxReal refIndex,
115                                                                                                                          gfxReal &refl, gfxReal &trans );
116
117 protected:
118
119   /* name of the material */
120   string mName;
121
122   //! Vector for reflectance of each color component (used in shade() of ray object)
123   ntlColor  mDiffuseRefl;
124   //! Ambient reflectance
125   ntlColor mAmbientRefl;
126   //! Specular reflection intensity
127   gfxReal mSpecular;
128   //! Specular phong exponent
129   gfxReal mSpecExponent;
130   //! Mirror intensity
131   gfxReal mMirror;
132
133   //! Transparence
134   gfxReal mTransparence;
135   //! Refraction index, nu(Air) is assumed 1
136   gfxReal mRefracIndex;
137   //! Should transparence be additive?
138   gfxReal mTransAdditive;
139   //! Color dependent transparency attentuation factors (negative logarithm stored)
140   ntlColor mTransAttCol;
141         //! Should the transparence and reflectivity be determined by fresnel?
142         int mFresnel;
143
144
145 public:
146   // access methods
147
148   //! Returns the material name
149   inline string getName() { return mName; }
150   //! Returns the reflectance
151   inline ntlColor  getDiffuseRefl() const { return ntlColor(mDiffuseRefl); }
152   //! Returns the ambience
153   inline ntlColor getAmbientRefl() const { return ntlColor(mAmbientRefl); }
154   //! Returns the specular component
155   inline gfxReal getSpecular() const { return mSpecular; }
156   //! Returns the specular exponent component
157   inline gfxReal getSpecExponent() const { return mSpecExponent; }
158   //! Returns the mirror component
159   inline gfxReal getMirror() const { return mMirror; }
160   //! Returns the transparence component
161   inline gfxReal getTransparence() const { return mTransparence; }
162   //! Returns the refraction index component
163   inline gfxReal getRefracIndex() const { return mRefracIndex; }
164   //! Returns the transparency additive factor component
165   inline gfxReal getTransAdditive() const { return mTransAdditive; }
166   //! Returns the transparency attentuation
167   inline ntlColor getTransAttCol() const { return mTransAttCol; }
168         //! Get Fresnel flag
169         inline int getFresnel( void ) { return mFresnel; }
170
171
172
173   //! Returns the mat name
174   inline void setName(string set) { mName = set; }
175   //! Returns the reflectance
176   inline void setDiffuseRefl(ntlColor set) { mDiffuseRefl=set; }
177   //! Returns the ambience
178   inline void setAmbientRefl(ntlColor set) { mAmbientRefl=set; }
179   //! Returns the specular component
180   inline void setSpecular(gfxReal set) { mSpecular=set; }
181   //! Returns the specular exponent component
182   inline void setSpecExponent(gfxReal set) { mSpecExponent=set; }
183   //! Returns the mirror component
184   inline void setMirror(gfxReal set) { mMirror=set; }
185   //! Returns the transparence component
186   inline void setTransparence(gfxReal set) { mTransparence=set; }
187   //! Returns the refraction index component
188   inline void setRefracIndex(gfxReal set) { mRefracIndex=set; }
189   //! Returns the transparency additive factor component
190   inline void setTransAdditive(gfxReal set) { mTransAdditive=set; }
191   //! Returns the transparency attentuation
192   inline void setTransAttCol(ntlColor set) { 
193                 ntlColor setlog = ntlColor( -log(set[0]), -log(set[1]), -log(set[2]) );
194                 mTransAttCol=setlog; }
195         //! Set Fresnel on/off
196         inline void setFresnel(int set) { mFresnel = set; }
197
198 };
199
200
201 /******************************************************************************
202  * Macro to define the default surface properties for a newly created object
203  *****************************************************************************/
204 #define GET_GLOBAL_DEFAULT_MATERIAL new ntlMaterial( "default",\
205                                         ntlColor( 0.5 ), ntlColor(0.0), \
206                                         1.0, 5.0, 0.0,   \
207                                                                                                                                                                 /*0.0 test:*/ 0.5 , 1.0, 0.0, \
208                                                                                                                                                                 ntlColor( 0.0 ), 0 ); 
209                                                                                                                                                                                                                                                         
210
211
212 /******************************************************************************
213  * Calculate reflectance and refratance from Fresnel's law
214  * cf. Glassner p. 46
215  *****************************************************************************/
216 inline void 
217 ntlMaterial::calculateFresnel(const ntlVec3Gfx &dir, const ntlVec3Gfx &normal, gfxReal refIndex,
218                                                                                                                         gfxReal &refl, gfxReal &trans)
219 {
220         gfxReal c = -dot(dir, normal);
221         if(c<0) { 
222                 refl = 0.0; trans = 0.0; return;
223                 //c = 0.0;
224         }
225
226         gfxReal r0 = ((refIndex-1.0)*(refIndex-1.0)) /
227                 ((refIndex+1.0)*(refIndex+1.0));
228         gfxReal omc = (1.0-c);
229         gfxReal r =r0 + (1.0 - r0) * omc*omc*omc*omc*omc;
230
231         //mMirror = r;
232         //mTransparence = (1.0 - r);
233         refl = r;
234         trans = (1.0 - r);
235         //errorOut(" fres ");
236 }
237
238
239 #endif
240
241