1771846b76e9feee15304f65822eb54714fc368c
[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.hxx>
16
17 #include <Graphic3d_MaterialDefinitionError.hxx>
18 #include <Standard_Assert.hxx>
19 #include <Standard_OutOfRange.hxx>
20
21 namespace
22 {
23   //! Raw material for defining list of standard materials
24   struct RawMaterial
25   {
26     const char*              StringName;
27     Graphic3d_BSDF           BSDF;
28     Quantity_Color           Colors   [Graphic3d_TypeOfReflection_NB];
29     Standard_ShortReal       ColorCoef[Graphic3d_TypeOfReflection_NB];
30     Standard_ShortReal       TransparencyCoef;
31     Standard_ShortReal       RefractionIndex;
32     Standard_ShortReal       Shininess;
33     Standard_ShortReal       EnvReflexion;
34     Graphic3d_TypeOfMaterial MaterialType;
35     Graphic3d_NameOfMaterial MaterialName;
36     Standard_Boolean         ReflActivity[Graphic3d_TypeOfReflection_NB];
37
38     RawMaterial (Graphic3d_NameOfMaterial theName, const char* theStringName);
39
40   };
41
42   //! Name list of standard materials (defined within enumeration).
43   static const RawMaterial THE_MATERIALS[] =
44   {
45     RawMaterial (Graphic3d_NOM_BRASS,       "Brass"),
46     RawMaterial (Graphic3d_NOM_BRONZE,      "Bronze"),
47     RawMaterial (Graphic3d_NOM_COPPER,      "Copper"),
48     RawMaterial (Graphic3d_NOM_GOLD,        "Gold"),
49     RawMaterial (Graphic3d_NOM_PEWTER,      "Pewter"),
50     RawMaterial (Graphic3d_NOM_PLASTER,     "Plastered"),
51     RawMaterial (Graphic3d_NOM_PLASTIC,     "Plastified"),
52     RawMaterial (Graphic3d_NOM_SILVER,      "Silver"),
53     RawMaterial (Graphic3d_NOM_STEEL,       "Steel"),
54     RawMaterial (Graphic3d_NOM_STONE,       "Stone"),
55     RawMaterial (Graphic3d_NOM_SHINY_PLASTIC, "Shiny_plastified"),
56     RawMaterial (Graphic3d_NOM_SATIN,       "Satined"),
57     RawMaterial (Graphic3d_NOM_METALIZED,   "Metalized"),
58     RawMaterial (Graphic3d_NOM_NEON_GNC,    "Ionized"),
59     RawMaterial (Graphic3d_NOM_CHROME,      "Chrome"),
60     RawMaterial (Graphic3d_NOM_ALUMINIUM,   "Aluminium"),
61     RawMaterial (Graphic3d_NOM_OBSIDIAN,    "Obsidian"),
62     RawMaterial (Graphic3d_NOM_NEON_PHC,    "Neon"),
63     RawMaterial (Graphic3d_NOM_JADE,        "Jade"),
64     RawMaterial (Graphic3d_NOM_CHARCOAL,    "Charcoal"),
65     RawMaterial (Graphic3d_NOM_WATER,       "Water"),
66     RawMaterial (Graphic3d_NOM_GLASS,       "Glass"),
67     RawMaterial (Graphic3d_NOM_DIAMOND,     "Diamond"),
68     RawMaterial (Graphic3d_NOM_TRANSPARENT, "Transparent"),
69     RawMaterial (Graphic3d_NOM_DEFAULT,     "Default"),
70     RawMaterial (Graphic3d_NOM_UserDefined, "UserDefined")
71   };
72 }
73
74 // =======================================================================
75 // function : RawMaterial
76 // purpose  :
77 // =======================================================================
78 RawMaterial::RawMaterial (Graphic3d_NameOfMaterial theName, const char* theStringName)
79 : StringName      (theStringName),
80   BSDF            (Graphic3d_BSDF::CreateDiffuse (Graphic3d_Vec3 (0.0f))),
81   TransparencyCoef(0.0f),
82   RefractionIndex (1.0f),
83   Shininess       (0.039f),
84   EnvReflexion    (0.0f),
85   MaterialType    (Graphic3d_MATERIAL_ASPECT),
86   MaterialName    (theName)
87 {
88   ReflActivity[Graphic3d_TOR_AMBIENT]  = Standard_True;
89   ReflActivity[Graphic3d_TOR_DIFFUSE]  = Standard_True;
90   ReflActivity[Graphic3d_TOR_SPECULAR] = Standard_True;
91   ReflActivity[Graphic3d_TOR_EMISSION] = Standard_False;
92
93   ColorCoef[Graphic3d_TOR_AMBIENT]  = 0.3f;
94   ColorCoef[Graphic3d_TOR_DIFFUSE]  = 0.65f;
95   ColorCoef[Graphic3d_TOR_SPECULAR] = 0.0f;
96   ColorCoef[Graphic3d_TOR_EMISSION] = 0.0f;
97
98   Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.2f, 0.2f, 0.2f));
99   Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.2f, 0.2f, 0.2f));
100   Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (1.0f, 1.0f, 1.0f));
101   switch (theName)
102   {
103     case Graphic3d_NOM_PLASTIC:
104       Shininess                         = 0.0078125f;
105       ColorCoef[Graphic3d_TOR_AMBIENT]  = 0.50f;
106       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 0.24f;
107       ColorCoef[Graphic3d_TOR_SPECULAR] = 0.06f;
108
109       BSDF.Kd = (Graphic3d_Vec3 )Colors[Graphic3d_TOR_DIFFUSE];
110       BSDF.Ks = Graphic3d_Vec3 (0.00784314f, 0.00784314f, 0.00784314f);
111       BSDF.Normalize();
112       BSDF.Roughness = 0.25f;
113       break;
114     case Graphic3d_NOM_SHINY_PLASTIC:
115       Shininess                         = 1.00f;
116       ColorCoef[Graphic3d_TOR_AMBIENT]  = 0.44f;
117       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 0.50f;
118       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
119
120       BSDF.Kd = (Graphic3d_Vec3 )Colors[Graphic3d_TOR_DIFFUSE];
121       BSDF.Ks = Graphic3d_Vec3 (0.145f, 0.145f, 0.145f);
122       BSDF.Normalize();
123       BSDF.Roughness = 0.17f;
124       break;
125     case Graphic3d_NOM_SATIN:
126       Shininess                         = 0.09375f;
127       ColorCoef[Graphic3d_TOR_AMBIENT]  = 0.33f;
128       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 0.40f;
129       ColorCoef[Graphic3d_TOR_SPECULAR] = 0.44f;
130
131       BSDF.Kd = Graphic3d_Vec3 (0.2f);
132       BSDF.Ks = Graphic3d_Vec3 (0.6f);
133       BSDF.Roughness = 0.6f;
134
135       break;
136     case Graphic3d_NOM_NEON_GNC:
137       Shininess                         = 0.05f;
138       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
139       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
140       ColorCoef[Graphic3d_TOR_SPECULAR] = 0.62f;
141       ColorCoef[Graphic3d_TOR_EMISSION] = 1.00f;
142       ReflActivity[Graphic3d_TOR_AMBIENT]  = Standard_False;
143       ReflActivity[Graphic3d_TOR_EMISSION] = Standard_True;
144
145       BSDF.Kd = Graphic3d_Vec3 (0.0f);
146       BSDF.Kr = Graphic3d_Vec3 (0.5f);
147       BSDF.Le = (Graphic3d_Vec3 )Colors[Graphic3d_TOR_DIFFUSE];
148       BSDF.Fresnel = Graphic3d_Fresnel::CreateDielectric (1.5f);
149       break;
150     case Graphic3d_NOM_METALIZED:
151       Shininess                         = 0.13f;
152       ColorCoef[Graphic3d_TOR_AMBIENT]  = 0.90f;
153       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 0.47f;
154       ColorCoef[Graphic3d_TOR_SPECULAR] = 0.45f;
155       ReflActivity[Graphic3d_TOR_AMBIENT] = Standard_False;
156       {
157         const Graphic3d_Vec3 aColor = (Graphic3d_Vec3 )Colors[Graphic3d_TOR_DIFFUSE];
158         BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
159           Graphic3d_Fresnel::CreateSchlick (aColor), 0.045f);
160       }
161       break;
162     // Ascending Compatibility physical materials. The same definition is taken as in the next constructor.
163     case Graphic3d_NOM_BRASS:
164       MaterialType = Graphic3d_MATERIAL_PHYSIC;
165
166       Shininess                         = 0.65f;
167       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
168       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
169       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
170
171       BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
172         Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.58f, 0.42f, 0.20f)), 0.045f);
173
174       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.329f, 0.224f, 0.027f));
175       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.780f, 0.569f, 0.114f));
176       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.992f, 0.941f, 0.808f));
177       break;
178     case Graphic3d_NOM_BRONZE:
179       MaterialType = Graphic3d_MATERIAL_PHYSIC;
180
181       Shininess                         = 0.65f;
182       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
183       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
184       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
185
186       BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
187         Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.65f, 0.35f, 0.15f)), 0.045f);
188
189       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.213f, 0.128f, 0.054f));
190       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.714f, 0.428f, 0.181f));
191       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.590f, 0.408f, 0.250f));
192       break;
193     case Graphic3d_NOM_COPPER:
194       MaterialType = Graphic3d_MATERIAL_PHYSIC;
195
196       Shininess                         = 0.65f;
197       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
198       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
199       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
200
201       BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
202         Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.955008f, 0.637427f, 0.538163f)), 0.045f);
203
204       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.191f, 0.074f, 0.023f));
205       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.604f, 0.270f, 0.083f));
206       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.950f, 0.640f, 0.540f));
207       break;
208     case Graphic3d_NOM_GOLD:
209       MaterialType = Graphic3d_MATERIAL_PHYSIC;
210
211       Shininess                         = 0.80f;
212       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
213       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
214       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
215
216       BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
217         Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (1.000000f, 0.765557f, 0.336057f)), 0.045f);
218
219       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.300f, 0.230f, 0.095f));
220       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.752f, 0.580f, 0.100f));
221       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (1.000f, 0.710f, 0.290f));
222       break;
223     case Graphic3d_NOM_PEWTER:
224       MaterialType = Graphic3d_MATERIAL_PHYSIC;
225
226       Shininess                         = 0.50f;
227       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
228       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
229       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
230
231       BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
232         Graphic3d_Fresnel::CreateConductor (1.8800f, 3.4900f), 0.045f);
233
234       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.106f, 0.059f, 0.114f));
235       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.427f, 0.471f, 0.541f));
236       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.333f, 0.333f, 0.522f));
237       break;
238     case Graphic3d_NOM_PLASTER:
239       Shininess                         = 0.01f;
240       ColorCoef[Graphic3d_TOR_AMBIENT]  = 0.26f;
241       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 0.75f;
242       ColorCoef[Graphic3d_TOR_SPECULAR] = 0.05f;
243
244       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.192f, 0.192f, 0.192f));
245       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.508f, 0.508f, 0.508f));
246       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.508f, 0.508f, 0.508f));
247
248       BSDF.Kd = Graphic3d_Vec3 (0.482353f, 0.482353f, 0.482353f);
249
250       break;
251     case Graphic3d_NOM_SILVER:
252       MaterialType = Graphic3d_MATERIAL_PHYSIC;
253
254       Shininess                         = 0.75f;
255       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
256       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
257       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
258
259       BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
260         Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.971519f, 0.959915f, 0.915324f)), 0.045f);
261
262       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.275f, 0.275f, 0.250f));
263       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.630f, 0.630f, 0.630f));
264       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.950f, 0.930f, 0.880f));
265       break;
266     case Graphic3d_NOM_STEEL:
267       MaterialType = Graphic3d_MATERIAL_PHYSIC;
268
269       Shininess                         = 0.90f;
270       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
271       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
272       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
273
274       BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
275         Graphic3d_Fresnel::CreateConductor (Graphic3d_Vec3 (2.90f, 2.80f, 2.53f), Graphic3d_Vec3 (3.08f, 2.90f, 2.74f)), 0.045f);
276
277       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.150f, 0.150f, 0.180f));
278       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.500f, 0.510f, 0.520f));
279       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.560f, 0.570f, 0.580f));
280       break;
281     case Graphic3d_NOM_STONE:
282       MaterialType = Graphic3d_MATERIAL_PHYSIC;
283
284       Shininess                         = 0.17f;
285       ColorCoef[Graphic3d_TOR_AMBIENT]  = 0.19f;
286       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 0.75f;
287       ColorCoef[Graphic3d_TOR_SPECULAR] = 0.08f;
288
289       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (1.00f, 0.8f, 0.62f));
290       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (1.00f, 0.8f, 0.62f));
291       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.98f, 1.0f, 0.60f));
292
293       BSDF.Kd = Graphic3d_Vec3 (0.243137f, 0.243137f, 0.243137f);
294       BSDF.Ks = Graphic3d_Vec3 (0.00392157f, 0.00392157f, 0.00392157f);
295
296       break;
297     // Ascending Compatibility of physical materials. Takes the same definition as in the next constructor. New materials
298     case Graphic3d_NOM_CHROME:
299       MaterialType = Graphic3d_MATERIAL_PHYSIC;
300
301       Shininess                         = 0.90f;
302       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
303       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
304       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
305
306       BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
307         Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.549585f, 0.556114f, 0.554256f)), 0.045f);
308
309       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.200f, 0.200f, 0.225f));
310       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.550f, 0.550f, 0.550f));
311       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.975f, 0.975f, 0.975f));
312       break;
313     case Graphic3d_NOM_ALUMINIUM:
314       MaterialType = Graphic3d_MATERIAL_PHYSIC;
315
316       Shininess                         = 0.75f;
317       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
318       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
319       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
320
321       BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
322         Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.913183f, 0.921494f, 0.924524f)), 0.045f);
323
324       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.300f, 0.300f, 0.300f));
325       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.600f, 0.600f, 0.600f));
326       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.910f, 0.920f, 0.920f));
327       break;
328     case Graphic3d_NOM_NEON_PHC:
329       MaterialType = Graphic3d_MATERIAL_PHYSIC;
330
331       Shininess                         = 0.05f;
332       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
333       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
334       ColorCoef[Graphic3d_TOR_SPECULAR] = 0.62f;
335       ColorCoef[Graphic3d_TOR_EMISSION] = 0.90f;
336       ReflActivity[Graphic3d_TOR_AMBIENT]  = Standard_False;
337       ReflActivity[Graphic3d_TOR_DIFFUSE]  = Standard_False;
338       ReflActivity[Graphic3d_TOR_EMISSION] = Standard_True;
339
340       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (1.0f, 1.0f, 1.0f));
341       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (1.0f, 1.0f, 1.0f));
342       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (1.0f, 1.0f, 1.0f));
343       Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f, 1.0f, 0.46f));
344
345       BSDF.Kd = Graphic3d_Vec3 (0.0f);
346       BSDF.Kr = Graphic3d_Vec3 (0.5f);
347       BSDF.Le = Graphic3d_Vec3 (0.0f, 1.0f, 0.46f);
348       BSDF.Fresnel = Graphic3d_Fresnel::CreateDielectric (1.5f);
349       break;
350     case Graphic3d_NOM_OBSIDIAN:
351       MaterialType = Graphic3d_MATERIAL_PHYSIC;
352
353       Shininess                         = 0.3f;
354       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.0f;
355       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.0f;
356       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.0f;
357
358       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.054f, 0.050f, 0.066f));
359       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.183f, 0.170f, 0.225f));
360       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.333f, 0.329f, 0.346f));
361
362       BSDF.Kd = Graphic3d_Vec3 (0.023f, 0.f, 0.023f);
363       BSDF.Ks = Graphic3d_Vec3 (0.0156863f, 0.0156863f, 0.0156863f);
364       BSDF.Roughness = 0.1f;
365       break;
366     case Graphic3d_NOM_JADE:
367       MaterialType = Graphic3d_MATERIAL_PHYSIC;
368
369       Shininess                         = 0.10f;
370       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
371       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
372       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
373
374       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.135f, 0.223f, 0.158f));
375       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.540f, 0.890f, 0.630f));
376       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.316f, 0.316f, 0.316f));
377
378       BSDF.Fresnel = Graphic3d_Fresnel::CreateDielectric (1.5f);
379       BSDF.Kd = Graphic3d_Vec3 (0.208658f, 0.415686f, 0.218401f);
380       BSDF.Ks = Graphic3d_Vec3 (0.611765f, 0.611765f, 0.611765f);
381       BSDF.Roughness = 0.06f;
382       break;
383     case Graphic3d_NOM_CHARCOAL:
384       MaterialType = Graphic3d_MATERIAL_PHYSIC;
385
386       Shininess                         = 0.01f;
387       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
388       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
389       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
390
391       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.050f, 0.050f, 0.050f));
392       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.150f, 0.150f, 0.150f));
393       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.000f, 0.000f, 0.000f));
394
395       BSDF.Kd = Graphic3d_Vec3 (0.02f, 0.02f, 0.02f);
396       BSDF.Ks = Graphic3d_Vec3 (0.1f, 0.1f, 0.1f);
397       BSDF.Roughness = 0.3f;
398       break;
399     case Graphic3d_NOM_WATER:
400       MaterialType = Graphic3d_MATERIAL_PHYSIC;
401
402       Shininess                         = 0.90f;
403       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
404       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
405       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
406       RefractionIndex  = 1.33f;
407       BSDF             = Graphic3d_BSDF::CreateGlass (Graphic3d_Vec3 (1.f),
408                                                       Graphic3d_Vec3 (0.7f, 0.75f, 0.85f),
409                                                       0.05f,
410                                                       RefractionIndex);
411       TransparencyCoef = 0.80f;
412
413       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.450f, 0.450f, 0.475f));
414       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.050f, 0.050f, 0.075f));
415       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.380f, 0.380f, 0.380f));
416       break;
417     case Graphic3d_NOM_GLASS:
418       MaterialType = Graphic3d_MATERIAL_PHYSIC;
419
420       Shininess                         = 0.50f;
421       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
422       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
423       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
424       RefractionIndex  = 1.62f;
425       BSDF             = Graphic3d_BSDF::CreateGlass (Graphic3d_Vec3 (1.f),
426                                                       Graphic3d_Vec3 (0.75f, 0.95f, 0.9f),
427                                                       0.05f,
428                                                       RefractionIndex);
429       TransparencyCoef = 0.80f;
430
431       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.550f, 0.575f, 0.575f));
432       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.050f, 0.075f, 0.075f));
433       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.920f, 0.920f, 0.920f));
434       break;
435     case Graphic3d_NOM_DIAMOND:
436       MaterialType = Graphic3d_MATERIAL_PHYSIC;
437
438       Shininess                         = 0.90f;
439       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
440       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
441       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
442       RefractionIndex  = 2.42f;
443       BSDF             = Graphic3d_BSDF::CreateGlass (Graphic3d_Vec3 (1.f),
444                                                       Graphic3d_Vec3 (0.95f, 0.95f, 0.95f),
445                                                       0.05f,
446                                                       RefractionIndex);
447       TransparencyCoef = 0.80f;
448
449       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.550f, 0.550f, 0.550f));
450       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.100f, 0.100f, 0.100f));
451       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.970f, 0.970f, 0.970f));
452       break;
453
454     case Graphic3d_NOM_TRANSPARENT:
455       MaterialType = Graphic3d_MATERIAL_PHYSIC;
456
457       Shininess                         = 0.90f;
458       ColorCoef[Graphic3d_TOR_AMBIENT]  = 1.00f;
459       ColorCoef[Graphic3d_TOR_DIFFUSE]  = 1.00f;
460       ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
461       RefractionIndex = 1.0f;
462
463       BSDF.Kd = Graphic3d_Vec3 (0.1f);
464       BSDF.Kt = Graphic3d_Vec3 (0.9f);
465       BSDF.Fresnel = Graphic3d_Fresnel::CreateConstant (0.0f);
466       TransparencyCoef = 0.80f;
467
468       Colors[Graphic3d_TOR_AMBIENT]  = Quantity_Color (Graphic3d_Vec3 (0.550f, 0.550f, 0.550f));
469       Colors[Graphic3d_TOR_DIFFUSE]  = Quantity_Color (Graphic3d_Vec3 (0.100f, 0.100f, 0.100f));
470       Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.970f, 0.970f, 0.970f));
471       break;
472     case Graphic3d_NOM_UserDefined:
473       break;
474     case Graphic3d_NOM_DEFAULT:
475       break;
476   }
477 }
478
479 // =======================================================================
480 // function : Graphic3d_MaterialAspect
481 // purpose  :
482 // =======================================================================
483 Graphic3d_MaterialAspect::Graphic3d_MaterialAspect()
484 : myRequestedMaterialName (Graphic3d_NOM_DEFAULT)
485 {
486   init (Graphic3d_NOM_DEFAULT);
487 }
488
489 // =======================================================================
490 // function : Graphic3d_MaterialAspect
491 // purpose  :
492 // =======================================================================
493 Graphic3d_MaterialAspect::Graphic3d_MaterialAspect (const Graphic3d_NameOfMaterial theName)
494 : myRequestedMaterialName (theName)
495 {
496   init (theName);
497 }
498
499 // =======================================================================
500 // function : init
501 // purpose  :
502 // =======================================================================
503 void Graphic3d_MaterialAspect::init (const Graphic3d_NameOfMaterial theName)
504 {
505   const RawMaterial& aMat = THE_MATERIALS[theName];
506   myBSDF       = aMat.BSDF;
507   myStringName = aMat.StringName;
508   myColors[Graphic3d_TOR_AMBIENT]     = aMat.Colors[Graphic3d_TOR_AMBIENT];
509   myColors[Graphic3d_TOR_DIFFUSE]     = aMat.Colors[Graphic3d_TOR_DIFFUSE];
510   myColors[Graphic3d_TOR_SPECULAR]    = aMat.Colors[Graphic3d_TOR_SPECULAR];
511   myColors[Graphic3d_TOR_EMISSION]    = aMat.Colors[Graphic3d_TOR_EMISSION];
512   myColorCoef[Graphic3d_TOR_AMBIENT]  = aMat.ColorCoef[Graphic3d_TOR_AMBIENT];
513   myColorCoef[Graphic3d_TOR_DIFFUSE]  = aMat.ColorCoef[Graphic3d_TOR_DIFFUSE];
514   myColorCoef[Graphic3d_TOR_SPECULAR] = aMat.ColorCoef[Graphic3d_TOR_SPECULAR];
515   myColorCoef[Graphic3d_TOR_EMISSION] = aMat.ColorCoef[Graphic3d_TOR_EMISSION];
516   myTransparencyCoef = aMat.TransparencyCoef;
517   myRefractionIndex  = aMat.RefractionIndex;
518   myShininess        = aMat.Shininess;
519   myEnvReflexion     = aMat.EnvReflexion;
520   myMaterialType     = aMat.MaterialType;
521   myMaterialName     = theName;
522   myRequestedMaterialName = theName;
523   myReflActivity[Graphic3d_TOR_AMBIENT]  = aMat.ReflActivity[Graphic3d_TOR_AMBIENT];
524   myReflActivity[Graphic3d_TOR_DIFFUSE]  = aMat.ReflActivity[Graphic3d_TOR_DIFFUSE];
525   myReflActivity[Graphic3d_TOR_SPECULAR] = aMat.ReflActivity[Graphic3d_TOR_SPECULAR];
526   myReflActivity[Graphic3d_TOR_EMISSION] = aMat.ReflActivity[Graphic3d_TOR_EMISSION];
527 }
528
529 // =======================================================================
530 // function : IncreaseShine
531 // purpose  :
532 // =======================================================================
533 void Graphic3d_MaterialAspect::IncreaseShine (const Standard_ShortReal theDelta)
534 {
535   const Standard_ShortReal anOldShine = myShininess;
536   myShininess = myShininess + myShininess * theDelta / 100.0f;
537   if (myShininess > 1.0f || myShininess < 0.0f)
538   {
539     myShininess = anOldShine;
540   }
541 }
542
543 // =======================================================================
544 // function : SetMaterialType
545 // purpose  :
546 // =======================================================================
547 void Graphic3d_MaterialAspect::SetMaterialType (const Graphic3d_TypeOfMaterial theType)
548 {
549   myMaterialType = theType;
550   if (theType != myMaterialType)
551   {
552     setUserMaterial();
553   }
554 }
555
556 // =======================================================================
557 // function : SetAmbient
558 // purpose  :
559 // =======================================================================
560 void Graphic3d_MaterialAspect::SetAmbient (const Standard_ShortReal theValue)
561 {
562   if (theValue < 0.0f
563    || theValue > 1.0f)
564   {
565     Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetAmbient < 0. or > 1.0");
566   }
567
568   myColorCoef[Graphic3d_TOR_AMBIENT] = theValue;
569   if (myReflActivity[Graphic3d_TOR_AMBIENT]
570    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
571   {
572     setUserMaterial();
573   }
574 }
575
576 // =======================================================================
577 // function : SetColor
578 // purpose  :
579 // =======================================================================
580 void Graphic3d_MaterialAspect::SetColor (const Quantity_Color& theColor)
581 {
582   const Standard_ShortReal anAmbientCoeff = 0.25f;
583   myColors[Graphic3d_TOR_AMBIENT].SetValues (theColor.Red()   * anAmbientCoeff,
584                                              theColor.Green() * anAmbientCoeff,
585                                              theColor.Blue()  * anAmbientCoeff, Quantity_TOC_RGB);
586   myColors[Graphic3d_TOR_DIFFUSE] =  theColor;
587   if (myReflActivity[Graphic3d_TOR_AMBIENT]
588    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
589   {
590     setUserMaterial();
591   }
592 }
593
594 // =======================================================================
595 // function : SetAmbientColor
596 // purpose  :
597 // =======================================================================
598 void Graphic3d_MaterialAspect::SetAmbientColor (const Quantity_Color& theColor)
599 {
600   myColors[Graphic3d_TOR_AMBIENT] = theColor;
601   if (myReflActivity[Graphic3d_TOR_AMBIENT]
602    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
603   {
604     setUserMaterial();
605   }
606 }
607
608 // =======================================================================
609 // function : SetDiffuseColor
610 // purpose  :
611 // =======================================================================
612 void Graphic3d_MaterialAspect::SetDiffuseColor (const Quantity_Color& theColor)
613 {
614   myColors[Graphic3d_TOR_DIFFUSE] = theColor;
615   if (myReflActivity[Graphic3d_TOR_DIFFUSE]
616    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
617   {
618     setUserMaterial();
619   }
620 }
621
622 // =======================================================================
623 // function : SetSpecularColor
624 // purpose  :
625 // =======================================================================
626 void Graphic3d_MaterialAspect::SetSpecularColor (const Quantity_Color& theColor)
627 {
628   myColors[Graphic3d_TOR_SPECULAR] = theColor;
629   if (myReflActivity[Graphic3d_TOR_SPECULAR]
630    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
631   {
632     setUserMaterial();
633   }
634 }
635
636 // =======================================================================
637 // function : SetEmissiveColor
638 // purpose  :
639 // =======================================================================
640 void Graphic3d_MaterialAspect::SetEmissiveColor (const Quantity_Color& theColor)
641 {
642   myColors[Graphic3d_TOR_EMISSION] = theColor;
643   if (myReflActivity[Graphic3d_TOR_EMISSION]
644    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
645   {
646     setUserMaterial();
647   }
648 }
649
650 // =======================================================================
651 // function : SetDiffuse
652 // purpose  :
653 // =======================================================================
654 void Graphic3d_MaterialAspect::SetDiffuse (const Standard_ShortReal theValue)
655 {
656   if (theValue < 0.0f
657    || theValue > 1.0f)
658   {
659     Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetDiffuse < 0. or > 1.0");
660   }
661
662   myColorCoef[Graphic3d_TOR_DIFFUSE] = theValue;
663   if (myReflActivity[Graphic3d_TOR_DIFFUSE]
664    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
665   {
666     setUserMaterial();
667   }
668 }
669
670 // =======================================================================
671 // function : SetEmissive
672 // purpose  :
673 // =======================================================================
674 void Graphic3d_MaterialAspect::SetEmissive (const Standard_ShortReal theValue)
675 {
676   if (theValue < 0.0f
677    || theValue > 1.0f)
678   {
679     Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetEmissive < 0. or > 1.0");
680   }
681
682   myColorCoef[Graphic3d_TOR_EMISSION] = theValue;
683   if (myReflActivity[Graphic3d_TOR_DIFFUSE]
684    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
685   {
686     setUserMaterial();
687   }
688 }
689
690 // =======================================================================
691 // function : SetReflectionMode
692 // purpose  :
693 // =======================================================================
694 void Graphic3d_MaterialAspect::SetReflectionMode (const Graphic3d_TypeOfReflection theType,
695                                                   const Standard_Boolean theValue)
696 {
697   myReflActivity[theType] = theValue;
698   if (myMaterialType == Graphic3d_MATERIAL_PHYSIC)
699   {
700     setUserMaterial();
701   }
702 }
703
704 // =======================================================================
705 // function : SetSpecular
706 // purpose  :
707 // =======================================================================
708 void Graphic3d_MaterialAspect::SetSpecular (const Standard_ShortReal theValue)
709 {
710   if (theValue < 0.0f
711    || theValue > 1.0f)
712   {
713     Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetSpecular < 0. or > 1.0");
714   }
715
716   myColorCoef[Graphic3d_TOR_SPECULAR] = theValue;
717   if (myReflActivity[Graphic3d_TOR_SPECULAR]
718    && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
719   {
720     setUserMaterial();
721   }
722 }
723
724 // =======================================================================
725 // function : SetTransparency
726 // purpose  :
727 // =======================================================================
728 void Graphic3d_MaterialAspect::SetTransparency (const Standard_ShortReal theValue)
729 {
730   if (theValue < 0.0f
731    || theValue > 1.0f)
732   {
733     Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetTransparency < 0. or > 1.0");
734   }
735
736   myTransparencyCoef = theValue;
737 }
738
739 // =======================================================================
740 // function : SetRefractionIndex
741 // purpose  :
742 // =======================================================================
743 void Graphic3d_MaterialAspect::SetRefractionIndex (const Standard_ShortReal theValue)
744 {
745   if (theValue < 1.0f)
746   {
747     Graphic3d_MaterialDefinitionError::Raise ("Bad value for refraction index < 1.0");
748   }
749
750   myRefractionIndex = theValue;
751 }
752
753 // =======================================================================
754 // function : SetShininess
755 // purpose  :
756 // =======================================================================
757 void Graphic3d_MaterialAspect::SetShininess (const Standard_ShortReal theValue)
758 {
759   if (theValue < 0.0f
760    || theValue > 1.0f)
761   {
762     Graphic3d_MaterialDefinitionError::Raise ("Bad value for Shininess < 0. or > 1.0");
763   }
764
765   myShininess = theValue;
766   setUserMaterial();
767 }
768
769 // =======================================================================
770 // function : MaterialName
771 // purpose  :
772 // =======================================================================
773 Standard_CString Graphic3d_MaterialAspect::MaterialName (const Standard_Integer theRank)
774 {
775   if (theRank < 1 || theRank > NumberOfMaterials())
776   {
777     Standard_OutOfRange::Raise ("BAD index of material");
778   }
779   const RawMaterial& aMat = THE_MATERIALS[theRank - 1];
780   return aMat.StringName;
781 }
782
783 // =======================================================================
784 // function : MaterialFromName
785 // purpose  :
786 // =======================================================================
787 Graphic3d_NameOfMaterial Graphic3d_MaterialAspect::MaterialFromName (const Standard_CString theName)
788 {
789   TCollection_AsciiString aName (theName);
790   aName.LowerCase();
791   aName.Capitalize();
792   const Standard_Integer aNbMaterials = Graphic3d_MaterialAspect::NumberOfMaterials();
793   for (Standard_Integer aMatIter = 0; aMatIter < aNbMaterials; ++aMatIter)
794   {
795     const RawMaterial& aMat = THE_MATERIALS[aMatIter];
796     if (aName == aMat.StringName)
797     {
798       return Graphic3d_NameOfMaterial(aMatIter);
799     }
800   }
801
802   // parse aliases
803   if (aName == "Plastic")            // Plastified
804   {
805     return Graphic3d_NOM_PLASTIC;
806   }
807   else if (aName == "Shiny_plastic") // Shiny_plastified
808   {
809     return Graphic3d_NOM_SHINY_PLASTIC;
810   }
811   else if (aName == "Plaster")       // Plastered
812   {
813     return Graphic3d_NOM_PLASTER;
814   }
815   else if (aName == "Satin")         // Satined
816   {
817     return Graphic3d_NOM_SATIN;
818   }
819   else if (aName == "Neon_gnc")      // Ionized
820   {
821     return Graphic3d_NOM_NEON_GNC;
822   }
823   else if (aName == "Neon_phc") // Neon
824   {
825     return Graphic3d_NOM_NEON_PHC;
826   }
827   return Graphic3d_NOM_DEFAULT;
828 }
829
830 // =======================================================================
831 // function : MaterialType
832 // purpose  :
833 // =======================================================================
834 Graphic3d_TypeOfMaterial Graphic3d_MaterialAspect::MaterialType (const Standard_Integer theRank)
835 {
836   if (theRank < 1 || theRank > NumberOfMaterials())
837   {
838     Standard_OutOfRange::Raise ("BAD index of material");
839   }
840   const RawMaterial& aMat = THE_MATERIALS[theRank - 1];
841   return aMat.MaterialType;
842 }