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