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