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