a00f983bbcfe22f36bb66276ed9e7377ad8a5c32
[blender.git] / source / blender / freestyle / intern / scene_graph / FrsMaterial.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 #ifndef __FREESTYLE_MATERIAL_H__
22 #define __FREESTYLE_MATERIAL_H__
23
24 /** \file blender/freestyle/intern/scene_graph/FrsMaterial.h
25  *  \ingroup freestyle
26  *  \brief Class used to handle materials.
27  *  \author Stephane Grabli
28  *  \date 10/10/2002
29  */
30
31 #include "../system/FreestyleConfig.h"
32
33 #ifdef WITH_CXX_GUARDEDALLOC
34 #include "MEM_guardedalloc.h"
35 #endif
36
37 namespace Freestyle {
38
39 /*! Class defining a material */
40 class FrsMaterial
41 {
42 public:
43         /*! Default constructor */
44         inline FrsMaterial();
45
46         /*! Builds a Material from its line, diffuse, ambiant, specular, emissive
47          *  colors, a shininess coefficient and line color priority.
48          *    \param iLine
49          *      A 4 element float-array containing the line color.
50          *    \param iDiffuse
51          *      A 4 element float-array containing the diffuse color.
52          *    \param iAmbiant
53          *      A 4 element float-array containing the ambiant color.
54          *    \param iSpecular
55          *      A 4 element float-array containing the specular color.
56          *    \param iEmission
57          *      A 4 element float-array containing the emissive color.
58          *    \param iShininess
59          *      The shininess coefficient.
60          *    \param iPriority
61          *      The line color priority.
62          */
63         inline FrsMaterial(const float *iLine, const float *iDiffuse, const float *iAmbiant, const float *iSpecular,
64                            const float *iEmission, const float iShininess, const int iPriority);
65
66         /*! Copy constructor */
67         inline FrsMaterial(const FrsMaterial& m);
68
69         /*! Destructor */
70         virtual ~FrsMaterial() {}
71
72         /*! Returns the line color as a 4 float array */
73         inline const float *line() const
74         {
75                 return Line;
76         }
77
78         /*! Returns the red component of the line color */
79         inline const float lineR() const
80         {
81                 return Line[0];
82         }
83
84         /*! Returns the green component of the line color */
85         inline const float lineG() const
86         {
87                 return Line[1];
88         }
89
90         /*! Returns the blue component of the line color */
91         inline const float lineB() const
92         {
93                 return Line[2];
94         }
95
96         /*! Returns the alpha component of the line color */
97         inline const float lineA() const
98         {
99                 return Line[3];
100         }
101
102         /*! Returns the diffuse color as a 4 float array */
103         inline const float *diffuse() const
104         {
105                 return Diffuse;
106         }
107
108         /*! Returns the red component of the diffuse color */
109         inline const float diffuseR() const
110         {
111                 return Diffuse[0];
112         }
113
114         /*! Returns the green component of the diffuse color */
115         inline const float diffuseG() const
116         {
117                 return Diffuse[1];
118         }
119
120         /*! Returns the blue component of the diffuse color */
121         inline const float diffuseB() const
122         {
123                 return Diffuse[2];
124         }
125
126         /*! Returns the alpha component of the diffuse color */
127         inline const float diffuseA() const
128         {
129                 return Diffuse[3];
130         }
131
132         /*! Returns the specular color as a 4 float array */
133         inline const float *specular() const
134         {
135                 return Specular;
136         }
137
138         /*! Returns the red component of the specular color */
139         inline const float specularR() const
140         {
141                 return Specular[0];
142         }
143
144         /*! Returns the green component of the specular color */
145         inline const float specularG() const
146         {
147                 return Specular[1];
148         }
149
150         /*! Returns the blue component of the specular color */
151         inline const float specularB() const
152         {
153                 return Specular[2];
154         }
155
156         /*! Returns the alpha component of the specular color */
157         inline const float specularA() const
158         {
159                 return Specular[3];
160         }
161
162         /*! Returns the ambiant color as a 4 float array */
163         inline const float *ambient() const
164         {
165                 return Ambient;
166         }
167
168         /*! Returns the red component of the ambiant color */
169         inline const float ambientR() const
170         {
171                 return Ambient[0];
172         }
173
174         /*! Returns the green component of the ambiant color */
175         inline const float ambientG() const
176         {
177                 return Ambient[1];
178         }
179
180         /*! Returns the blue component of the ambiant color */
181         inline const float ambientB() const
182         {
183                 return Ambient[2];
184         }
185
186         /*! Returns the alpha component of the ambiant color */
187         inline const float ambientA() const
188         {
189                 return Ambient[3];
190         }
191
192         /*! Returns the emissive color as a 4 float array */
193         inline const float *emission() const
194         {
195                 return Emission;
196         }
197
198         /*! Returns the red component of the emissive color */
199         inline const float emissionR() const
200         {
201                 return Emission[0];
202         }
203
204         /*! Returns the green component of the emissive color */
205         inline const float emissionG() const
206         {
207                 return Emission[1];
208         }
209
210         /*! Returns the blue component of the emissive color */
211         inline const float emissionB() const
212         {
213                 return Emission[2];
214         }
215
216         /*! Returns the alpha component of the emissive color */
217         inline const float emissionA() const
218         {
219                 return Emission[3];
220         }
221
222         /*! Returns the shininess coefficient */
223         inline const float shininess() const
224         {
225                 return Shininess;
226         }
227
228         /*! Returns the line color priority */
229         inline const int priority() const
230         {
231                 return Priority;
232         }
233
234         /*! Sets the line color.
235          *    \param r
236          *      Red component
237          *    \param g
238          *      Green component
239          *    \param b
240          *     Blue component
241          *    \param a
242          *      Alpha component
243          */
244         inline void setLine(const float r, const float g, const float b, const float a);
245
246         /*! Sets the diffuse color.
247          *    \param r
248          *      Red component
249          *    \param g
250          *      Green component
251          *    \param b
252          *     Blue component
253          *    \param a
254          *      Alpha component
255          */
256         inline void setDiffuse(const float r, const float g, const float b, const float a);
257
258         /*! Sets the specular color.
259          *    \param r
260          *      Red component
261          *    \param g
262          *      Green component
263          *    \param b
264          *     Blue component
265          *    \param a
266          *      Alpha component
267          */
268         inline void setSpecular(const float r, const float g, const float b, const float a);
269
270         /*! Sets the ambiant color.
271          *    \param r
272          *      Red component
273          *    \param g
274          *      Green component
275          *    \param b
276          *     Blue component
277          *    \param a
278          *      Alpha component
279          */
280         inline void setAmbient(const float r, const float g, const float b, const float a);
281
282         /*! Sets the emissive color.
283          *    \param r
284          *      Red component
285          *    \param g
286          *      Green component
287          *    \param b
288          *     Blue component
289          *    \param a
290          *      Alpha component
291          */
292         inline void setEmission(const float r, const float g, const float b, const float a);
293
294         /*! Sets the shininess.
295          *    \param s
296          *      Shininess
297          */
298         inline void setShininess(const float s);
299
300         /*! Sets the line color priority.
301         *    \param priority
302         *      Priority
303         */
304         inline void setPriority(const int priority);
305
306         /* operators */
307         inline FrsMaterial& operator=(const FrsMaterial& m);
308         inline bool operator!=(const FrsMaterial& m) const;
309         inline bool operator==(const FrsMaterial& m) const;
310
311 private:
312         /*! Material properties */
313         float Line[4];
314         float Diffuse[4];
315         float Specular[4];
316         float Ambient[4];
317         float Emission[4];
318         float Shininess;
319         int Priority;
320
321 #ifdef WITH_CXX_GUARDEDALLOC
322         MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:FrsMaterial")
323 #endif
324 };
325
326 FrsMaterial::FrsMaterial()
327 {
328         Line[0] = Line[1] = Line[2] = 0.0f;
329         Line[3] = 1.0f;
330
331         Ambient[0] = Ambient[1] = Ambient[2] = 0.2f;
332         Ambient[3] = 1.0f;
333
334         Diffuse[0] = Diffuse[1] = Diffuse[2] = 0.8f;
335         Diffuse[3] = 1.0f;
336
337         Emission[0] = Emission[1] = Emission[2] = 0.0f;
338         Emission[3] = 1.0f;
339
340         Specular[0] = Specular[1] = Specular[2] = 0.0f;
341         Specular[3] = 1.0f;
342
343         Shininess = 0.0f;
344         Priority = 0;
345 }
346
347 FrsMaterial::FrsMaterial(const float *iLine, const float *iDiffuse, const float *iAmbiant, const float *iSpecular,
348                          const float *iEmission, const float iShininess, const int iPriority)
349 {
350         for (int i = 0; i < 4; i++) {
351                 Line[i] = iLine[i];
352                 Diffuse[i]  = iDiffuse[i];
353                 Specular[i] = iSpecular[i];
354                 Ambient[i]  = iAmbiant[i];
355                 Emission[i] = iEmission[i];
356         }
357
358         Shininess = iShininess;
359         Priority = iPriority;
360 }
361
362 FrsMaterial::FrsMaterial(const FrsMaterial& m)
363 {
364         for (int i = 0; i < 4; i++) {
365                 Line[i] = m.line()[i];
366                 Diffuse[i]  = m.diffuse()[i];
367                 Specular[i] = m.specular()[i];
368                 Ambient[i]  = m.ambient()[i];
369                 Emission[i] = m.emission()[i];
370         }
371
372         Shininess = m.shininess();
373         Priority = m.priority();
374 }
375
376 void FrsMaterial::setLine(const float r, const float g, const float b, const float a)
377 {
378         Line[0] = r;
379         Line[1] = g;
380         Line[2] = b;
381         Line[3] = a;
382 }
383
384 void FrsMaterial::setDiffuse(const float r, const float g, const float b, const float a)
385 {
386         Diffuse[0] = r;
387         Diffuse[1] = g;
388         Diffuse[2] = b;
389         Diffuse[3] = a;
390 }
391
392 void FrsMaterial::setSpecular(const float r, const float g, const float b, const float a)
393 {
394         Specular[0] = r;
395         Specular[1] = g;
396         Specular[2] = b;
397         Specular[3] = a;
398 }
399
400 void FrsMaterial::setAmbient(const float r, const float g, const float b, const float a)
401 {
402         Ambient[0] = r;
403         Ambient[1] = g;
404         Ambient[2] = b;
405         Ambient[3] = a;
406 }
407
408 void FrsMaterial::setEmission(const float r, const float g, const float b, const float a)
409 {
410         Emission[0] = r;
411         Emission[1] = g;
412         Emission[2] = b;
413         Emission[3] = a;
414 }
415
416 void FrsMaterial::setShininess(const float s)
417 {
418         Shininess = s;
419 }
420
421 void FrsMaterial::setPriority(const int priority)
422 {
423         Priority = priority;
424 }
425
426 FrsMaterial& FrsMaterial::operator=(const FrsMaterial& m)
427 {
428         for (int i = 0; i < 4; i++) {
429                 Line[i] = m.line()[i];
430                 Diffuse[i]  = m.diffuse()[i];
431                 Specular[i] = m.specular()[i];
432                 Ambient[i]  = m.ambient()[i];
433                 Emission[i] = m.emission()[i];
434         }
435
436         Shininess = m.shininess();
437         Priority = m.priority();
438         return *this;
439 }
440
441 bool FrsMaterial::operator!=(const FrsMaterial& m) const
442 {
443         if (Shininess != m.shininess())
444                 return true;
445         if (Priority != m.priority())
446                 return true;
447
448         for (int i = 0; i < 4; i++) {
449                 if (Line[i] != m.line()[i])
450                         return true;
451                 if (Diffuse[i]  != m.diffuse()[i])
452                         return true;
453                 if (Specular[i] != m.specular()[i])
454                         return true;
455                 if (Ambient[i]  != m.ambient()[i])
456                         return true;
457                 if (Emission[i] != m.emission()[i])
458                         return true;
459         }
460
461         return false;
462 }
463
464 bool FrsMaterial::operator==(const FrsMaterial& m) const
465 {
466         return (!((*this) != m));
467 }
468
469 } /* namespace Freestyle */
470
471 #endif // __FREESTYLE_MATERIAL_H__