12c3181daea4d5f1d8039328c0d34734cab4c124
[occt.git] / src / Graphic3d / Graphic3d_MaterialAspect.cxx
1 // Copyright (c) 1991-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <Graphic3d_MaterialAspect.ixx>
16 #include <Standard_Assert.hxx>
17
18 // =======================================================================
19 // function : Graphic3d_MaterialAspect
20 // purpose  :
21 // =======================================================================
22 Graphic3d_MaterialAspect::Graphic3d_MaterialAspect()
23 : myDiffuseColor (0.2, 0.2, 0.2, Quantity_TOC_RGB),
24   myAmbientColor (0.2, 0.2, 0.2, Quantity_TOC_RGB)
25 {
26   myRequestedMaterialName = Graphic3d_NOM_DEFAULT;
27   Init (myRequestedMaterialName);
28 }
29
30 // =======================================================================
31 // function : Graphic3d_MaterialAspect
32 // purpose  :
33 // =======================================================================
34 Graphic3d_MaterialAspect::Graphic3d_MaterialAspect (const Graphic3d_NameOfMaterial theName)
35 : myDiffuseColor (0.2, 0.2, 0.2, Quantity_TOC_RGB),
36   myAmbientColor (0.2, 0.2, 0.2, Quantity_TOC_RGB)
37 {
38   myRequestedMaterialName = theName;
39   Init (myRequestedMaterialName);
40 }
41
42 // =======================================================================
43 // function : Init
44 // purpose  :
45 // =======================================================================
46 void Graphic3d_MaterialAspect::Init (const Graphic3d_NameOfMaterial theName)
47 {
48   myMaterialType     = Graphic3d_MATERIAL_ASPECT;
49   myTransparencyCoef = 0.0f;
50   myRefractionIndex  = 1.0f;
51   myDiffuseActivity  = Standard_True;
52   myDiffuseCoef      = 0.65f;
53   myAmbientActivity  = Standard_True;
54   myAmbientCoef      = 0.3f;
55   mySpecularActivity = Standard_True;
56   mySpecularCoef     = 0.0f;
57   myEmissiveActivity = Standard_False;
58   myEmissiveCoef     = 0.0f;
59   myEnvReflexion     = 0.0f;
60   myShininess        = 0.039f;
61   myDiffuseColor .SetValues (0.2, 0.2, 0.2, Quantity_TOC_RGB);
62   mySpecularColor.SetValues (1.0, 1.0, 1.0, Quantity_TOC_RGB);
63   myMaterialName     = theName;
64
65   Standard_Integer index = Standard_Integer (theName);
66   if (index < NumberOfMaterials())
67   {
68     myStringName = MaterialName (index + 1);
69   }
70
71   switch (theName)
72   {
73     case Graphic3d_NOM_PLASTIC:       // Blue plastic
74       myShininess    = Standard_ShortReal (0.0078125);
75       myAmbientCoef  = Standard_ShortReal (0.5);
76       myDiffuseCoef  = Standard_ShortReal (0.24);
77       mySpecularCoef = Standard_ShortReal (0.06);
78       break;
79     case Graphic3d_NOM_SHINY_PLASTIC: // black plastic
80       myShininess    = Standard_ShortReal (1.0);
81       myAmbientCoef  = Standard_ShortReal (0.44);
82       myDiffuseCoef  = Standard_ShortReal (0.5);
83       mySpecularCoef = Standard_ShortReal (1.0);
84       break;
85     case Graphic3d_NOM_SATIN :
86       myShininess    = Standard_ShortReal (0.09375);
87       myAmbientCoef  = Standard_ShortReal (0.33);
88       myDiffuseCoef  = Standard_ShortReal (0.4);
89       mySpecularCoef = Standard_ShortReal (0.44);
90       break;
91     case Graphic3d_NOM_NEON_GNC:
92       myShininess    = Standard_ShortReal (0.05);
93       myAmbientCoef  = Standard_ShortReal (1.0);
94       myDiffuseCoef  = Standard_ShortReal (1.0);
95       mySpecularCoef = Standard_ShortReal (0.62);
96       myEmissiveCoef = Standard_ShortReal (1.0);
97       myEmissiveActivity = Standard_True;
98       myAmbientActivity  = Standard_False;
99       break;
100     case Graphic3d_NOM_METALIZED:
101       myShininess    = Standard_ShortReal (0.13);
102       myAmbientCoef  = Standard_ShortReal (0.9);
103       myDiffuseCoef  = Standard_ShortReal (0.47);
104       mySpecularCoef = Standard_ShortReal (0.45);
105       myAmbientActivity  = Standard_False;
106
107       // Color resulting from dispersed
108       //myDiffuseColor .SetValues (0.87, 0.96,  1.0, Quantity_TOC_RGB);
109       // Color resulting from specular
110       //mySpecularColor.SetValues (0.93, 0.95, 0.78, Quantity_TOC_RGB);
111       break;
112     // Ascending Compatibility physical materials. The same definition is taken as in the next constructor.
113     case Graphic3d_NOM_BRASS:
114       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
115
116       myShininess    = 0.65f;
117       myAmbientCoef  = 1.00f;
118       myDiffuseCoef  = 1.00f;
119       mySpecularCoef = 1.00f;
120
121       // Color resulting from ambient
122       myAmbientColor .SetValues (0.329f, 0.224f, 0.027f, Quantity_TOC_RGB);
123       // Color resulting from dispersed
124       myDiffuseColor .SetValues (0.780f, 0.569f, 0.114f, Quantity_TOC_RGB);
125       // Color resulting from specular
126       mySpecularColor.SetValues (0.992f, 0.941f, 0.808f, Quantity_TOC_RGB);
127       break;
128     case Graphic3d_NOM_BRONZE:
129       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
130
131       myShininess    = 0.65f;
132       myAmbientCoef  = 1.00f;
133       myDiffuseCoef  = 1.00f;
134       mySpecularCoef = 1.00f;
135
136       // Color resulting from ambient
137       myAmbientColor .SetValues (0.213f, 0.128f, 0.054f, Quantity_TOC_RGB);
138       // Color resulting from dispersed
139       myDiffuseColor .SetValues (0.714f, 0.428f, 0.181f, Quantity_TOC_RGB);
140       // Color resulting from specular
141       mySpecularColor.SetValues (0.590f, 0.408f, 0.250f, Quantity_TOC_RGB);
142       break;
143     case Graphic3d_NOM_COPPER:
144       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
145
146       myShininess    = 0.65f;
147       myAmbientCoef  = 1.00f;
148       myDiffuseCoef  = 1.00f;
149       mySpecularCoef = 1.00f;
150
151       // Color resulting from ambient
152       myAmbientColor .SetValues (0.191f, 0.074f, 0.023f, Quantity_TOC_RGB);
153       // Color resulting from dispersed
154       myDiffuseColor .SetValues (0.604f, 0.270f, 0.083f, Quantity_TOC_RGB);
155       // Color resulting from specular
156       mySpecularColor.SetValues (0.950f, 0.640f, 0.540f, Quantity_TOC_RGB);
157       break;
158     case Graphic3d_NOM_GOLD:
159       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
160
161       myShininess    = 0.80f;
162       myAmbientCoef  = 1.00f;
163       myDiffuseCoef  = 1.00f;
164       mySpecularCoef = 1.00f;
165
166       // Color resulting from ambient
167       myAmbientColor .SetValues (0.300f, 0.230f, 0.095f, Quantity_TOC_RGB);
168       // Color resulting from dispersed
169       myDiffuseColor .SetValues (0.752f, 0.580f, 0.100f, Quantity_TOC_RGB);
170       // Color resulting from specular
171       mySpecularColor.SetValues (1.000f, 0.710f, 0.290f, Quantity_TOC_RGB);
172       break;
173     case Graphic3d_NOM_PEWTER:
174       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
175
176       myShininess    = 0.50f;
177       myAmbientCoef  = 1.00f;
178       myDiffuseCoef  = 1.00f;
179       mySpecularCoef = 1.00f;
180
181       // Color resulting from ambient
182       myAmbientColor .SetValues (0.106f, 0.059f, 0.114f, Quantity_TOC_RGB);
183       // Color resulting from dispersed
184       myDiffuseColor .SetValues (0.427f, 0.471f, 0.541f, Quantity_TOC_RGB);
185       // Color resulting from specular
186       mySpecularColor.SetValues (0.333f, 0.333f, 0.522f, Quantity_TOC_RGB);
187       break;
188     case Graphic3d_NOM_PLASTER:
189       myShininess    = 0.01f;
190       myAmbientCoef  = 0.26f;
191       myDiffuseCoef  = 0.75f;
192       mySpecularCoef = 0.05f;
193
194       // Color resulting from ambient
195       myAmbientColor .SetValues (0.192f, 0.192f, 0.192f, Quantity_TOC_RGB);
196       // Color resulting from dispersed
197       myDiffuseColor .SetValues (0.508f, 0.508f, 0.508f, Quantity_TOC_RGB);
198       // Color resulting from specular
199       mySpecularColor.SetValues (0.508f, 0.508f, 0.508f, Quantity_TOC_RGB);
200       break;
201     case Graphic3d_NOM_SILVER:
202       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
203
204       myShininess    = 0.75f;
205       myAmbientCoef  = 1.00f;
206       myDiffuseCoef  = 1.00f;
207       mySpecularCoef = 1.00f;
208
209       // Color resulting from ambient
210       myAmbientColor .SetValues (0.275f, 0.275f, 0.250f, Quantity_TOC_RGB);
211       // Color resulting from dispersed
212       myDiffuseColor .SetValues (0.630f, 0.630f, 0.630f, Quantity_TOC_RGB);
213       // Color resulting from specular
214       mySpecularColor.SetValues (0.950f, 0.930f, 0.880f, Quantity_TOC_RGB);
215       break;
216     case Graphic3d_NOM_STEEL:
217       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
218
219       myShininess    = 0.90f;
220       myAmbientCoef  = 1.00f;
221       myDiffuseCoef  = 1.00f;
222       mySpecularCoef = 1.00f;
223
224       // Color resulting from ambient
225       myAmbientColor .SetValues (0.150f, 0.150f, 0.180f, Quantity_TOC_RGB);
226       // Color resulting from dispersed
227       myDiffuseColor .SetValues (0.500f, 0.510f, 0.520f, Quantity_TOC_RGB);
228       // Color resulting from specular
229       mySpecularColor.SetValues (0.560f, 0.570f, 0.580f, Quantity_TOC_RGB);
230       break;
231     case Graphic3d_NOM_STONE:
232       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
233
234       myShininess    = 0.17f;
235       myAmbientCoef  = 0.19f;
236       myDiffuseCoef  = 0.75f;
237       mySpecularCoef = 0.08f;
238
239       // Color resulting from ambient
240       myAmbientColor .SetValues (1.0,  0.8, 0.62, Quantity_TOC_RGB);
241       // Color resulting from dispersed
242       myDiffuseColor .SetValues (1.0,  0.8, 0.62, Quantity_TOC_RGB);
243       // Color resulting from specular
244       mySpecularColor.SetValues (0.98, 1.0, 0.60, Quantity_TOC_RGB);
245       break;
246     // Ascending Compatibility of physical materials. Takes the same definition as in the next constructor. New materials
247     case Graphic3d_NOM_CHROME:
248       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
249
250       myShininess    = 0.90f;
251       myAmbientCoef  = 1.00f;
252       myDiffuseCoef  = 1.00f;
253       mySpecularCoef = 1.00f;
254
255       // Color resulting from ambient
256       myAmbientColor .SetValues (0.200f, 0.200f, 0.225f, Quantity_TOC_RGB);
257       // Color resulting from dispersed
258       myDiffuseColor .SetValues (0.550f, 0.550f, 0.550f, Quantity_TOC_RGB);
259       // Color resulting from specular
260       mySpecularColor.SetValues (0.975f, 0.975f, 0.975f, Quantity_TOC_RGB);
261       break;
262     case Graphic3d_NOM_ALUMINIUM:
263       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
264
265       myShininess    = 0.75f;
266       myAmbientCoef  = 1.00f;
267       myDiffuseCoef  = 1.00f;
268       mySpecularCoef = 1.00f;
269
270       // Color resulting from ambient
271       myAmbientColor .SetValues (0.300f, 0.300f, 0.300f, Quantity_TOC_RGB);
272       // Color resulting from dispersed
273       myDiffuseColor .SetValues (0.600f, 0.600f, 0.600f, Quantity_TOC_RGB);
274       // Color resulting from specular
275       mySpecularColor.SetValues (0.910f, 0.920f, 0.920f, Quantity_TOC_RGB);
276       break;
277     case Graphic3d_NOM_NEON_PHC:
278       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
279
280       myShininess    = 0.05f;
281       myAmbientCoef  = 1.00f;
282       myDiffuseCoef  = 1.00f;
283       mySpecularCoef = 0.62f;
284       myEmissiveCoef = 0.90f;
285       myAmbientActivity  = Standard_False;
286       myDiffuseActivity  = Standard_False;
287       myEmissiveActivity = Standard_True;
288
289       // Color resulting from ambient
290       myAmbientColor .SetValues (1.0, 1.0, 1.0,  Quantity_TOC_RGB);
291       // Color resulting from dispersed
292       myDiffuseColor .SetValues (1.0, 1.0, 1.0,  Quantity_TOC_RGB);
293       // Color resulting from specular
294       mySpecularColor.SetValues (1.0, 1.0, 1.0,  Quantity_TOC_RGB);
295       // Color resulting from specular
296       myEmissiveColor.SetValues (0.0, 1.0, 0.46, Quantity_TOC_RGB);
297       break;
298     case Graphic3d_NOM_OBSIDIAN:
299       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
300
301       myShininess    = 0.3f;
302       myAmbientCoef  = 1.0f;
303       myDiffuseCoef  = 1.0f;
304       mySpecularCoef = 1.0f;
305
306       // Color resulting from ambient
307       myAmbientColor .SetValues (0.054f, 0.050f, 0.066f, Quantity_TOC_RGB);
308       // Color resulting from dispersed
309       myDiffuseColor .SetValues (0.183f, 0.170f, 0.225f, Quantity_TOC_RGB);
310       // Color resulting from specular
311       mySpecularColor.SetValues (0.333f, 0.329f, 0.346f, Quantity_TOC_RGB);
312       break;
313     case Graphic3d_NOM_JADE:
314       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
315
316       myShininess    = 0.10f;
317       myAmbientCoef  = 1.00f;
318       myDiffuseCoef  = 1.00f;
319       mySpecularCoef = 1.00f;
320
321       // Color resulting from ambient
322       myAmbientColor .SetValues (0.135f, 0.223f, 0.158f, Quantity_TOC_RGB);
323       // Color resulting from dispersed
324       myDiffuseColor .SetValues (0.540f, 0.890f, 0.630f, Quantity_TOC_RGB);
325       // Color resulting from specular
326       mySpecularColor.SetValues (0.316f, 0.316f, 0.316f, Quantity_TOC_RGB);
327       break;
328     case Graphic3d_NOM_CHARCOAL:
329       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
330
331       myShininess    = 0.01f;
332       myAmbientCoef  = 1.00f;
333       myDiffuseCoef  = 1.00f;
334       mySpecularCoef = 1.00f;
335
336       // Color resulting from ambient
337       myAmbientColor .SetValues (0.050f, 0.050f, 0.050f, Quantity_TOC_RGB);
338       // Color resulting from dispersed
339       myDiffuseColor .SetValues (0.150f, 0.150f, 0.150f, Quantity_TOC_RGB);
340       // Color resulting from specular
341       mySpecularColor.SetValues (0.000f, 0.000f, 0.000f, Quantity_TOC_RGB);
342       break;
343     case Graphic3d_NOM_WATER:
344       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
345
346       myShininess    = 0.90f;
347       myAmbientCoef  = 1.00f;
348       myDiffuseCoef  = 1.00f;
349       mySpecularCoef = 1.00f;
350       myRefractionIndex  = 1.33f;
351       myTransparencyCoef = 0.80f;
352
353       // Color resulting from ambient
354       myAmbientColor.SetValues (0.450f, 0.450f, 0.475f, Quantity_TOC_RGB);
355       // Color resulting from dispersed
356       myDiffuseColor.SetValues (0.050f, 0.050f, 0.075f, Quantity_TOC_RGB);
357       // Color resulting from specular
358       mySpecularColor.SetValues (0.380f, 0.380f, 0.380f, Quantity_TOC_RGB);
359       break;
360     case Graphic3d_NOM_GLASS:
361       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
362
363       myShininess    = 0.50f;
364       myAmbientCoef  = 1.00f;
365       myDiffuseCoef  = 1.00f;
366       mySpecularCoef = 1.00f;
367       myRefractionIndex  = 1.62f;
368       myTransparencyCoef = 0.80f;
369
370       // Color resulting from ambient
371       myAmbientColor.SetValues (0.550f, 0.575f, 0.575f, Quantity_TOC_RGB);
372       // Color resulting from dispersed
373       myDiffuseColor.SetValues (0.050f, 0.075f, 0.075f, Quantity_TOC_RGB);
374       // Color resulting from specular
375       mySpecularColor.SetValues (0.920f, 0.920f, 0.920f, Quantity_TOC_RGB);
376       break;
377     case Graphic3d_NOM_DIAMOND:
378       myMaterialType = Graphic3d_MATERIAL_PHYSIC;
379
380       myShininess    = 0.90f;
381       myAmbientCoef  = 1.00f;
382       myDiffuseCoef  = 1.00f;
383       mySpecularCoef = 1.00f;
384       myRefractionIndex  = 2.42f;
385       myTransparencyCoef = 0.80f;
386
387       // Color resulting from ambient
388       myAmbientColor.SetValues (0.550f, 0.550f, 0.550f, Quantity_TOC_RGB);
389       // Color resulting from dispersed
390       myDiffuseColor.SetValues (0.100f, 0.100f, 0.100f, Quantity_TOC_RGB);
391       // Color resulting from specular
392       mySpecularColor.SetValues (0.970f, 0.970f, 0.970f, Quantity_TOC_RGB);
393       break;
394     case Graphic3d_NOM_UserDefined:
395       myStringName = "UserDefined";
396       break;
397     case Graphic3d_NOM_DEFAULT:
398     default:
399       myStringName = "Default";
400       break;
401   }
402 }
403
404 // =======================================================================
405 // function : IncreaseShine
406 // purpose  :
407 // =======================================================================
408 void Graphic3d_MaterialAspect::IncreaseShine (const Standard_Real theDelta)
409 {
410   Standard_ShortReal anOldShine = myShininess;
411   myShininess = Standard_ShortReal(myShininess + myShininess * theDelta / 100.0);
412   if (myShininess > 1.0 || myShininess < 0.0)
413   {
414     myShininess = anOldShine;
415   }
416 }
417
418 // =======================================================================
419 // function : SetMaterialType
420 // purpose  :
421 // =======================================================================
422 void Graphic3d_MaterialAspect::SetMaterialType (const Graphic3d_TypeOfMaterial theType)
423 {
424   myMaterialType = theType;
425   if (theType != myMaterialType)
426   {
427     SetMaterialName ("UserDefined");
428   }
429 }
430
431 // =======================================================================
432 // function : SetAmbient
433 // purpose  :
434 // =======================================================================
435 void Graphic3d_MaterialAspect::SetAmbient (const Standard_Real theValue)
436 {
437   if (theValue < 0.0
438    || theValue > 1.0)
439   {
440     Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetAmbient < 0. or > 1.0");
441   }
442
443   myAmbientCoef = Standard_ShortReal (theValue);
444   if (myAmbientActivity
445    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
446   {
447     SetMaterialName ("UserDefined");
448   }
449 }
450
451 // =======================================================================
452 // function : SetColor
453 // purpose  :
454 // =======================================================================
455 void Graphic3d_MaterialAspect::SetColor (const Quantity_Color& theColor)
456 {
457   const Standard_ShortReal anAmbientCoeff = 0.25f;
458   myAmbientColor.SetValues (theColor.Red()   * anAmbientCoeff,
459                             theColor.Green() * anAmbientCoeff,
460                             theColor.Blue()  * anAmbientCoeff, Quantity_TOC_RGB);
461   myDiffuseColor = theColor;
462   if (myAmbientActivity && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
463   {
464     SetMaterialName ("UserDefined");
465   }
466 }
467
468 // =======================================================================
469 // function : SetAmbientColor
470 // purpose  :
471 // =======================================================================
472 void Graphic3d_MaterialAspect::SetAmbientColor (const Quantity_Color& theColor)
473 {
474   myAmbientColor = theColor;
475   if (myAmbientActivity
476    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
477   {
478     SetMaterialName ("UserDefined");
479   }
480 }
481
482 // =======================================================================
483 // function : SetDiffuseColor
484 // purpose  :
485 // =======================================================================
486 void Graphic3d_MaterialAspect::SetDiffuseColor (const Quantity_Color& theColor)
487 {
488   myDiffuseColor = theColor;
489   if (myDiffuseActivity
490    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
491   {
492     SetMaterialName ("UserDefined");
493   }
494 }
495
496 // =======================================================================
497 // function : SetSpecularColor
498 // purpose  :
499 // =======================================================================
500 void Graphic3d_MaterialAspect::SetSpecularColor (const Quantity_Color& theColor)
501 {
502   mySpecularColor = theColor;
503   if (mySpecularActivity
504    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
505   {
506     SetMaterialName ("UserDefined");
507   }
508 }
509
510 // =======================================================================
511 // function : SetEmissiveColor
512 // purpose  :
513 // =======================================================================
514 void Graphic3d_MaterialAspect::SetEmissiveColor (const Quantity_Color& theColor)
515 {
516   myEmissiveColor = theColor;
517   if (myEmissiveActivity
518    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
519   {
520     SetMaterialName ("UserDefined");
521   }
522 }
523
524 // =======================================================================
525 // function : SetDiffuse
526 // purpose  :
527 // =======================================================================
528 void Graphic3d_MaterialAspect::SetDiffuse (const Standard_Real theValue)
529 {
530   if (theValue < 0.0
531    || theValue > 1.0)
532   {
533     Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetDiffuse < 0. or > 1.0");
534   }
535
536   myDiffuseCoef  = Standard_ShortReal (theValue);
537   if (myDiffuseActivity
538    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
539   {
540     SetMaterialName ("UserDefined");
541   }
542 }
543
544 // =======================================================================
545 // function : SetEmissive
546 // purpose  :
547 // =======================================================================
548 void Graphic3d_MaterialAspect::SetEmissive (const Standard_Real theValue)
549 {
550   if (theValue < 0.0
551    || theValue > 1.0)
552   {
553     Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetEmissive < 0. or > 1.0");
554   }
555
556   myEmissiveCoef = Standard_ShortReal (theValue);
557   if (myDiffuseActivity
558    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
559   {
560     SetMaterialName ("UserDefined");
561   }
562 }
563
564 // =======================================================================
565 // function : SetReflectionModeOn
566 // purpose  :
567 // =======================================================================
568 void Graphic3d_MaterialAspect::SetReflectionModeOn (const Graphic3d_TypeOfReflection theType)
569 {
570   switch (theType)
571   {
572     case Graphic3d_TOR_AMBIENT:
573       myAmbientActivity  = Standard_True;
574       break;
575     case Graphic3d_TOR_DIFFUSE:
576       myDiffuseActivity  = Standard_True;
577       break;
578     case Graphic3d_TOR_SPECULAR:
579       mySpecularActivity = Standard_True;
580       break;
581     case Graphic3d_TOR_EMISSION:
582       myEmissiveActivity = Standard_True;
583       break;
584   }
585   if (myMaterialType == Graphic3d_MATERIAL_PHYSIC)
586   {
587     SetMaterialName ("UserDefined");
588   }
589 }
590
591 // =======================================================================
592 // function : SetReflectionModeOff
593 // purpose  :
594 // =======================================================================
595 void Graphic3d_MaterialAspect::SetReflectionModeOff (const Graphic3d_TypeOfReflection theType)
596 {
597   switch (theType)
598   {
599     case Graphic3d_TOR_AMBIENT:
600       myAmbientActivity  = Standard_False;
601       break;
602     case Graphic3d_TOR_DIFFUSE:
603       myDiffuseActivity  = Standard_False;
604       break;
605     case Graphic3d_TOR_SPECULAR:
606       mySpecularActivity = Standard_False;
607       break;
608     case Graphic3d_TOR_EMISSION:
609       myEmissiveActivity = Standard_False;
610       break;
611   }
612   if (myMaterialType == Graphic3d_MATERIAL_PHYSIC)
613   {
614     SetMaterialName ("UserDefined");
615   }
616 }
617
618 // =======================================================================
619 // function : SetSpecular
620 // purpose  :
621 // =======================================================================
622 void Graphic3d_MaterialAspect::SetSpecular (const Standard_Real theValue)
623 {
624   if (theValue < 0.0
625    || theValue > 1.0)
626   {
627     Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetSpecular < 0. or > 1.0");
628   }
629
630   mySpecularCoef  = Standard_ShortReal (theValue);
631   if (mySpecularActivity
632    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
633   {
634     SetMaterialName ("UserDefined");
635   }
636 }
637
638 // =======================================================================
639 // function : SetTransparency
640 // purpose  :
641 // =======================================================================
642 void Graphic3d_MaterialAspect::SetTransparency (const Standard_Real theValue)
643 {
644   if (theValue < 0.0
645    || theValue > 1.0)
646   {
647     Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetTransparency < 0. or > 1.0");
648   }
649
650   myTransparencyCoef  = Standard_ShortReal (theValue);
651 }
652
653 // =======================================================================
654 // function : SetRefractionIndex
655 // purpose  :
656 // =======================================================================
657 void Graphic3d_MaterialAspect::SetRefractionIndex (const Standard_Real theValue)
658 {
659   if (theValue < 1.0)
660   {
661     Graphic3d_MaterialDefinitionError::Raise ("Bad value for refraction index < 1.0");
662   }
663
664   myRefractionIndex = static_cast<Standard_ShortReal> (theValue);
665 }
666
667 // =======================================================================
668 // function : Color
669 // purpose  :
670 // =======================================================================
671 const Quantity_Color& Graphic3d_MaterialAspect::Color() const
672 {
673   // It is generally accepted to consider diffuse color as
674   // "general" color of a material when light shines on it
675   return myDiffuseColor;
676 }
677
678 // =======================================================================
679 // function : AmbientColor
680 // purpose  :
681 // =======================================================================
682 const Quantity_Color& Graphic3d_MaterialAspect::AmbientColor() const
683 {
684   return myAmbientColor;
685 }
686
687 // =======================================================================
688 // function : DiffuseColor
689 // purpose  :
690 // =======================================================================
691 const Quantity_Color& Graphic3d_MaterialAspect::DiffuseColor() const
692 {
693   return myDiffuseColor;
694 }
695
696 // =======================================================================
697 // function : SpecularColor
698 // purpose  :
699 // =======================================================================
700 const Quantity_Color& Graphic3d_MaterialAspect::SpecularColor() const
701 {
702   return mySpecularColor;
703 }
704
705 // =======================================================================
706 // function : EmissiveColor
707 // purpose  :
708 // =======================================================================
709 const Quantity_Color& Graphic3d_MaterialAspect::EmissiveColor() const
710 {
711   return myEmissiveColor;
712 }
713
714 // =======================================================================
715 // function : MaterialType
716 // purpose  :
717 // =======================================================================
718 Standard_Boolean Graphic3d_MaterialAspect::MaterialType (const Graphic3d_TypeOfMaterial theType) const
719 {
720   return myMaterialType == theType;
721 }
722
723 // =======================================================================
724 // function : ReflectionMode
725 // purpose  :
726 // =======================================================================
727 Standard_Boolean Graphic3d_MaterialAspect::ReflectionMode (const Graphic3d_TypeOfReflection theType) const
728 {
729   switch (theType)
730   {
731     case Graphic3d_TOR_AMBIENT:  return myAmbientActivity;
732     case Graphic3d_TOR_DIFFUSE:  return myDiffuseActivity;
733     case Graphic3d_TOR_SPECULAR: return mySpecularActivity;
734     case Graphic3d_TOR_EMISSION: return myEmissiveActivity;
735   }
736   return Standard_False;
737 }
738
739 // =======================================================================
740 // function : Ambient
741 // purpose  :
742 // =======================================================================
743 Standard_Real Graphic3d_MaterialAspect::Ambient() const
744 {
745   return Standard_Real (myAmbientCoef);
746 }
747
748 // =======================================================================
749 // function : Diffuse
750 // purpose  :
751 // =======================================================================
752 Standard_Real Graphic3d_MaterialAspect::Diffuse() const
753 {
754   return Standard_Real (myDiffuseCoef);
755 }
756
757 // =======================================================================
758 // function : Emissive
759 // purpose  :
760 // =======================================================================
761 Standard_Real Graphic3d_MaterialAspect::Emissive() const
762 {
763   return Standard_Real (myEmissiveCoef);
764 }
765
766 // =======================================================================
767 // function : Specular
768 // purpose  :
769 // =======================================================================
770 Standard_Real Graphic3d_MaterialAspect::Specular() const
771 {
772   return Standard_Real (mySpecularCoef);
773 }
774
775 // =======================================================================
776 // function : Transparency
777 // purpose  :
778 // =======================================================================
779 Standard_Real Graphic3d_MaterialAspect::Transparency() const
780 {
781   return Standard_Real (myTransparencyCoef);
782 }
783
784 // =======================================================================
785 // function : RefractionIndex
786 // purpose  :
787 // =======================================================================
788 Standard_Real Graphic3d_MaterialAspect::RefractionIndex() const
789 {
790   return myRefractionIndex;
791 }
792
793 // =======================================================================
794 // function : Shininess
795 // purpose  :
796 // =======================================================================
797 Standard_Real Graphic3d_MaterialAspect::Shininess() const
798 {
799   return Standard_Real (myShininess);
800 }
801
802 // =======================================================================
803 // function : SetShininess
804 // purpose  :
805 // =======================================================================
806 void Graphic3d_MaterialAspect::SetShininess (const Standard_Real theValue)
807 {
808   if (theValue < 0.0
809    || theValue > 1.0)
810   {
811     Graphic3d_MaterialDefinitionError::Raise ("Bad value for Shininess < 0. or > 1.0");
812   }
813
814   myShininess = Standard_ShortReal (theValue);
815   SetMaterialName ("UserDefined");
816 }
817
818 // =======================================================================
819 // function : SetEnvReflexion
820 // purpose  :
821 // =======================================================================
822 void Graphic3d_MaterialAspect::SetEnvReflexion (const Standard_ShortReal theValue)
823 {
824   myEnvReflexion = theValue;
825 }
826
827 // =======================================================================
828 // function : EnvReflexion
829 // purpose  :
830 // =======================================================================
831 Standard_ShortReal Graphic3d_MaterialAspect::EnvReflexion() const
832 {
833   return myEnvReflexion;
834 }
835
836 // =======================================================================
837 // function : Name
838 // purpose  :
839 // =======================================================================
840 Graphic3d_NameOfMaterial Graphic3d_MaterialAspect::Name() const
841 {
842   return myMaterialName;
843 }
844
845 // =======================================================================
846 // function : Reset
847 // purpose  :
848 // =======================================================================
849 void Graphic3d_MaterialAspect::Reset()
850 {
851   Init (myRequestedMaterialName);
852 }
853
854 // =======================================================================
855 // function : IsEqual
856 // purpose  :
857 // =======================================================================
858 Standard_Boolean Graphic3d_MaterialAspect::IsEqual (const Graphic3d_MaterialAspect& theOther) const
859 {
860   return myAmbientCoef      == theOther.myAmbientCoef
861       && myDiffuseCoef      == theOther.myDiffuseCoef
862       && mySpecularCoef     == theOther.mySpecularCoef
863       && myEmissiveCoef     == theOther.myEmissiveCoef
864       && myTransparencyCoef == theOther.myTransparencyCoef
865       && myRefractionIndex  == theOther.myRefractionIndex
866       && myShininess        == theOther.myShininess
867       && myEnvReflexion     == theOther.myEnvReflexion
868       && myAmbientColor     == theOther.myAmbientColor
869       && myDiffuseColor     == theOther.myDiffuseColor
870       && mySpecularColor    == theOther.mySpecularColor
871       && myEmissiveColor    == theOther.myEmissiveColor
872       && myAmbientActivity  == theOther.myAmbientActivity
873       && myDiffuseActivity  == theOther.myDiffuseActivity
874       && mySpecularActivity == theOther.mySpecularActivity
875       && myEmissiveActivity == theOther.myEmissiveActivity;
876 }
877
878 // =======================================================================
879 // function : IsDifferent
880 // purpose  :
881 // =======================================================================
882 Standard_Boolean Graphic3d_MaterialAspect::IsDifferent (const Graphic3d_MaterialAspect& theOther) const
883 {
884   return !IsEqual (theOther);
885 }
886
887 typedef struct _Material
888 {
889   const char*              name;
890   Graphic3d_TypeOfMaterial type;
891 } Material;
892
893 static Material theMaterials[] =
894 {
895   {"Brass",            Graphic3d_MATERIAL_PHYSIC},
896   {"Bronze",           Graphic3d_MATERIAL_PHYSIC},
897   {"Copper",           Graphic3d_MATERIAL_PHYSIC},
898   {"Gold",             Graphic3d_MATERIAL_PHYSIC},
899   {"Pewter",           Graphic3d_MATERIAL_PHYSIC},
900   {"Plastered",        Graphic3d_MATERIAL_ASPECT},
901   {"Plastified",       Graphic3d_MATERIAL_ASPECT},
902   {"Silver",           Graphic3d_MATERIAL_PHYSIC},
903   {"Steel",            Graphic3d_MATERIAL_PHYSIC},
904   {"Stone",            Graphic3d_MATERIAL_PHYSIC},
905   {"Shiny_plastified", Graphic3d_MATERIAL_ASPECT},
906   {"Satined",          Graphic3d_MATERIAL_ASPECT},
907   {"Metalized",        Graphic3d_MATERIAL_ASPECT},
908   {"Ionized",          Graphic3d_MATERIAL_ASPECT},
909   {"Chrome",           Graphic3d_MATERIAL_PHYSIC},
910   {"Aluminium",        Graphic3d_MATERIAL_PHYSIC},
911   {"Obsidian",         Graphic3d_MATERIAL_PHYSIC},
912   {"Neon",             Graphic3d_MATERIAL_PHYSIC},
913   {"Jade",             Graphic3d_MATERIAL_PHYSIC},
914   {"Charcoal",         Graphic3d_MATERIAL_PHYSIC},
915   {"Water",            Graphic3d_MATERIAL_PHYSIC},
916   {"Glass",            Graphic3d_MATERIAL_PHYSIC},
917   {"Diamond",          Graphic3d_MATERIAL_PHYSIC}
918
919 };
920
921 // =======================================================================
922 // function : NumberOfMaterials
923 // purpose  :
924 // =======================================================================
925 Standard_Integer Graphic3d_MaterialAspect::NumberOfMaterials()
926 {
927   Standard_STATIC_ASSERT(sizeof(theMaterials)/sizeof(Material) == Graphic3d_NOM_DEFAULT);
928   return Graphic3d_NOM_DEFAULT;
929 }
930
931 // =======================================================================
932 // function : MaterialName
933 // purpose  :
934 // =======================================================================
935 Standard_CString Graphic3d_MaterialAspect::MaterialName (const Standard_Integer theRank)
936 {
937   if (theRank < 1 || theRank > NumberOfMaterials())
938   {
939     Standard_OutOfRange::Raise ("BAD index of material");
940   }
941   return theMaterials[theRank - 1].name;
942 }
943
944 // =======================================================================
945 // function : MaterialFromName
946 // purpose  :
947 // =======================================================================
948 Graphic3d_NameOfMaterial Graphic3d_MaterialAspect::MaterialFromName (const Standard_CString theName)
949 {
950   TCollection_AsciiString aName (theName);
951   aName.LowerCase();
952   aName.Capitalize();
953   const Standard_Integer aNbMaterials = Graphic3d_MaterialAspect::NumberOfMaterials();
954   for (Standard_Integer aMatIter = 1; aMatIter <= aNbMaterials; ++aMatIter)
955   {
956     if (aName == Graphic3d_MaterialAspect::MaterialName (aMatIter))
957     {
958       return Graphic3d_NameOfMaterial(aMatIter - 1);
959     }
960   }
961
962   // parse aliases
963   if (aName == "Plastic")            // Plastified
964   {
965     return Graphic3d_NOM_PLASTIC;
966   }
967   else if (aName == "Shiny_plastic") // Shiny_plastified
968   {
969     return Graphic3d_NOM_SHINY_PLASTIC;
970   }
971   else if (aName == "Plaster")       // Plastered
972   {
973     return Graphic3d_NOM_PLASTER;
974   }
975   else if (aName == "Satin")         // Satined
976   {
977     return Graphic3d_NOM_SATIN;
978   }
979   else if (aName == "Neon_gnc")      // Ionized
980   {
981     return Graphic3d_NOM_NEON_GNC;
982   }
983   else if (aName == "Neon_phc") // Neon
984   {
985     return Graphic3d_NOM_NEON_PHC;
986   }
987   return Graphic3d_NOM_DEFAULT;
988 }
989
990 // =======================================================================
991 // function : MaterialType
992 // purpose  :
993 // =======================================================================
994 Graphic3d_TypeOfMaterial Graphic3d_MaterialAspect::MaterialType (const Standard_Integer theRank)
995 {
996   if (theRank < 1 || theRank > NumberOfMaterials())
997   {
998     Standard_OutOfRange::Raise ("BAD index of material");
999   }
1000   return theMaterials[theRank - 1].type;
1001 }
1002
1003 // =======================================================================
1004 // function : MaterialName
1005 // purpose  :
1006 // =======================================================================
1007 Standard_CString Graphic3d_MaterialAspect::MaterialName() const
1008 {
1009   return myStringName.ToCString();
1010 }
1011
1012 // =======================================================================
1013 // function : SetMaterialName
1014 // purpose  :
1015 // =======================================================================
1016 void Graphic3d_MaterialAspect::SetMaterialName (const Standard_CString theNewName)
1017 {
1018   // if a component of a "standard" material change, the
1019   // result is no more standard (a blue gold is not a gold)
1020   myMaterialName = Graphic3d_NOM_UserDefined;
1021   myStringName   = theNewName;
1022 }