1 // Copyright (c) 1991-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
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.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
15 #include <Graphic3d_MaterialAspect.hxx>
17 #include <Graphic3d_MaterialDefinitionError.hxx>
18 #include <Standard_Assert.hxx>
19 #include <Standard_OutOfRange.hxx>
23 //! Raw material for defining list of standard materials
26 const char* StringName;
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];
38 RawMaterial (Graphic3d_NameOfMaterial theName, const char* theStringName);
42 //! Name list of standard materials (defined within enumeration).
43 static const RawMaterial THE_MATERIALS[] =
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")
74 // =======================================================================
75 // function : RawMaterial
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),
85 MaterialType (Graphic3d_MATERIAL_ASPECT),
86 MaterialName (theName)
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;
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;
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));
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;
109 BSDF.Kd = (Graphic3d_Vec3 )Colors[Graphic3d_TOR_DIFFUSE];
110 BSDF.Ks = Graphic3d_Vec3 (0.00784314f, 0.00784314f, 0.00784314f);
112 BSDF.Roughness = 0.25f;
114 case Graphic3d_NOM_SHINY_PLASTIC:
116 ColorCoef[Graphic3d_TOR_AMBIENT] = 0.44f;
117 ColorCoef[Graphic3d_TOR_DIFFUSE] = 0.50f;
118 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
120 BSDF.Kd = (Graphic3d_Vec3 )Colors[Graphic3d_TOR_DIFFUSE];
121 BSDF.Ks = Graphic3d_Vec3 (0.145f, 0.145f, 0.145f);
123 BSDF.Roughness = 0.17f;
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;
131 BSDF.Kd = Graphic3d_Vec3 (0.2f);
132 BSDF.Ks = Graphic3d_Vec3 (0.6f);
133 BSDF.Roughness = 0.6f;
136 case Graphic3d_NOM_NEON_GNC:
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;
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);
150 case Graphic3d_NOM_METALIZED:
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;
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);
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;
167 ColorCoef[Graphic3d_TOR_AMBIENT] = 1.00f;
168 ColorCoef[Graphic3d_TOR_DIFFUSE] = 1.00f;
169 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
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);
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));
178 case Graphic3d_NOM_BRONZE:
179 MaterialType = Graphic3d_MATERIAL_PHYSIC;
182 ColorCoef[Graphic3d_TOR_AMBIENT] = 1.00f;
183 ColorCoef[Graphic3d_TOR_DIFFUSE] = 1.00f;
184 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
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);
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));
193 case Graphic3d_NOM_COPPER:
194 MaterialType = Graphic3d_MATERIAL_PHYSIC;
197 ColorCoef[Graphic3d_TOR_AMBIENT] = 1.00f;
198 ColorCoef[Graphic3d_TOR_DIFFUSE] = 1.00f;
199 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
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);
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));
208 case Graphic3d_NOM_GOLD:
209 MaterialType = Graphic3d_MATERIAL_PHYSIC;
212 ColorCoef[Graphic3d_TOR_AMBIENT] = 1.00f;
213 ColorCoef[Graphic3d_TOR_DIFFUSE] = 1.00f;
214 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
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);
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));
223 case Graphic3d_NOM_PEWTER:
224 MaterialType = Graphic3d_MATERIAL_PHYSIC;
227 ColorCoef[Graphic3d_TOR_AMBIENT] = 1.00f;
228 ColorCoef[Graphic3d_TOR_DIFFUSE] = 1.00f;
229 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
231 BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
232 Graphic3d_Fresnel::CreateConductor (1.8800f, 3.4900f), 0.045f);
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));
238 case Graphic3d_NOM_PLASTER:
240 ColorCoef[Graphic3d_TOR_AMBIENT] = 0.26f;
241 ColorCoef[Graphic3d_TOR_DIFFUSE] = 0.75f;
242 ColorCoef[Graphic3d_TOR_SPECULAR] = 0.05f;
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));
248 BSDF.Kd = Graphic3d_Vec3 (0.482353f, 0.482353f, 0.482353f);
251 case Graphic3d_NOM_SILVER:
252 MaterialType = Graphic3d_MATERIAL_PHYSIC;
255 ColorCoef[Graphic3d_TOR_AMBIENT] = 1.00f;
256 ColorCoef[Graphic3d_TOR_DIFFUSE] = 1.00f;
257 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
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);
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));
266 case Graphic3d_NOM_STEEL:
267 MaterialType = Graphic3d_MATERIAL_PHYSIC;
270 ColorCoef[Graphic3d_TOR_AMBIENT] = 1.00f;
271 ColorCoef[Graphic3d_TOR_DIFFUSE] = 1.00f;
272 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
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);
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));
281 case Graphic3d_NOM_STONE:
282 MaterialType = Graphic3d_MATERIAL_PHYSIC;
285 ColorCoef[Graphic3d_TOR_AMBIENT] = 0.19f;
286 ColorCoef[Graphic3d_TOR_DIFFUSE] = 0.75f;
287 ColorCoef[Graphic3d_TOR_SPECULAR] = 0.08f;
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));
293 BSDF.Kd = Graphic3d_Vec3 (0.243137f, 0.243137f, 0.243137f);
294 BSDF.Ks = Graphic3d_Vec3 (0.00392157f, 0.00392157f, 0.00392157f);
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;
302 ColorCoef[Graphic3d_TOR_AMBIENT] = 1.00f;
303 ColorCoef[Graphic3d_TOR_DIFFUSE] = 1.00f;
304 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
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);
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));
313 case Graphic3d_NOM_ALUMINIUM:
314 MaterialType = Graphic3d_MATERIAL_PHYSIC;
317 ColorCoef[Graphic3d_TOR_AMBIENT] = 1.00f;
318 ColorCoef[Graphic3d_TOR_DIFFUSE] = 1.00f;
319 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
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);
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));
328 case Graphic3d_NOM_NEON_PHC:
329 MaterialType = Graphic3d_MATERIAL_PHYSIC;
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;
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));
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);
350 case Graphic3d_NOM_OBSIDIAN:
351 MaterialType = Graphic3d_MATERIAL_PHYSIC;
354 ColorCoef[Graphic3d_TOR_AMBIENT] = 1.0f;
355 ColorCoef[Graphic3d_TOR_DIFFUSE] = 1.0f;
356 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.0f;
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));
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;
366 case Graphic3d_NOM_JADE:
367 MaterialType = Graphic3d_MATERIAL_PHYSIC;
370 ColorCoef[Graphic3d_TOR_AMBIENT] = 1.00f;
371 ColorCoef[Graphic3d_TOR_DIFFUSE] = 1.00f;
372 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
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));
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;
383 case Graphic3d_NOM_CHARCOAL:
384 MaterialType = Graphic3d_MATERIAL_PHYSIC;
387 ColorCoef[Graphic3d_TOR_AMBIENT] = 1.00f;
388 ColorCoef[Graphic3d_TOR_DIFFUSE] = 1.00f;
389 ColorCoef[Graphic3d_TOR_SPECULAR] = 1.00f;
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));
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;
399 case Graphic3d_NOM_WATER:
400 MaterialType = Graphic3d_MATERIAL_PHYSIC;
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),
411 TransparencyCoef = 0.80f;
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));
417 case Graphic3d_NOM_GLASS:
418 MaterialType = Graphic3d_MATERIAL_PHYSIC;
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),
429 TransparencyCoef = 0.80f;
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));
435 case Graphic3d_NOM_DIAMOND:
436 MaterialType = Graphic3d_MATERIAL_PHYSIC;
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),
447 TransparencyCoef = 0.80f;
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));
454 case Graphic3d_NOM_TRANSPARENT:
455 MaterialType = Graphic3d_MATERIAL_PHYSIC;
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;
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;
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));
472 case Graphic3d_NOM_UserDefined:
474 case Graphic3d_NOM_DEFAULT:
479 // =======================================================================
480 // function : Graphic3d_MaterialAspect
482 // =======================================================================
483 Graphic3d_MaterialAspect::Graphic3d_MaterialAspect()
484 : myRequestedMaterialName (Graphic3d_NOM_DEFAULT)
486 init (Graphic3d_NOM_DEFAULT);
489 // =======================================================================
490 // function : Graphic3d_MaterialAspect
492 // =======================================================================
493 Graphic3d_MaterialAspect::Graphic3d_MaterialAspect (const Graphic3d_NameOfMaterial theName)
494 : myRequestedMaterialName (theName)
499 // =======================================================================
502 // =======================================================================
503 void Graphic3d_MaterialAspect::init (const Graphic3d_NameOfMaterial theName)
505 const RawMaterial& aMat = THE_MATERIALS[theName];
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];
529 // =======================================================================
530 // function : IncreaseShine
532 // =======================================================================
533 void Graphic3d_MaterialAspect::IncreaseShine (const Standard_ShortReal theDelta)
535 const Standard_ShortReal anOldShine = myShininess;
536 myShininess = myShininess + myShininess * theDelta / 100.0f;
537 if (myShininess > 1.0f || myShininess < 0.0f)
539 myShininess = anOldShine;
543 // =======================================================================
544 // function : SetMaterialType
546 // =======================================================================
547 void Graphic3d_MaterialAspect::SetMaterialType (const Graphic3d_TypeOfMaterial theType)
549 myMaterialType = theType;
550 if (theType != myMaterialType)
556 // =======================================================================
557 // function : SetAmbient
559 // =======================================================================
560 void Graphic3d_MaterialAspect::SetAmbient (const Standard_ShortReal theValue)
565 Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetAmbient < 0. or > 1.0");
568 myColorCoef[Graphic3d_TOR_AMBIENT] = theValue;
569 if (myReflActivity[Graphic3d_TOR_AMBIENT]
570 && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
576 // =======================================================================
577 // function : SetColor
579 // =======================================================================
580 void Graphic3d_MaterialAspect::SetColor (const Quantity_Color& theColor)
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)
594 // =======================================================================
595 // function : SetAmbientColor
597 // =======================================================================
598 void Graphic3d_MaterialAspect::SetAmbientColor (const Quantity_Color& theColor)
600 myColors[Graphic3d_TOR_AMBIENT] = theColor;
601 if (myReflActivity[Graphic3d_TOR_AMBIENT]
602 && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
608 // =======================================================================
609 // function : SetDiffuseColor
611 // =======================================================================
612 void Graphic3d_MaterialAspect::SetDiffuseColor (const Quantity_Color& theColor)
614 myColors[Graphic3d_TOR_DIFFUSE] = theColor;
615 if (myReflActivity[Graphic3d_TOR_DIFFUSE]
616 && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
622 // =======================================================================
623 // function : SetSpecularColor
625 // =======================================================================
626 void Graphic3d_MaterialAspect::SetSpecularColor (const Quantity_Color& theColor)
628 myColors[Graphic3d_TOR_SPECULAR] = theColor;
629 if (myReflActivity[Graphic3d_TOR_SPECULAR]
630 && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
636 // =======================================================================
637 // function : SetEmissiveColor
639 // =======================================================================
640 void Graphic3d_MaterialAspect::SetEmissiveColor (const Quantity_Color& theColor)
642 myColors[Graphic3d_TOR_EMISSION] = theColor;
643 if (myReflActivity[Graphic3d_TOR_EMISSION]
644 && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
650 // =======================================================================
651 // function : SetDiffuse
653 // =======================================================================
654 void Graphic3d_MaterialAspect::SetDiffuse (const Standard_ShortReal theValue)
659 Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetDiffuse < 0. or > 1.0");
662 myColorCoef[Graphic3d_TOR_DIFFUSE] = theValue;
663 if (myReflActivity[Graphic3d_TOR_DIFFUSE]
664 && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
670 // =======================================================================
671 // function : SetEmissive
673 // =======================================================================
674 void Graphic3d_MaterialAspect::SetEmissive (const Standard_ShortReal theValue)
679 Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetEmissive < 0. or > 1.0");
682 myColorCoef[Graphic3d_TOR_EMISSION] = theValue;
683 if (myReflActivity[Graphic3d_TOR_DIFFUSE]
684 && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
690 // =======================================================================
691 // function : SetReflectionMode
693 // =======================================================================
694 void Graphic3d_MaterialAspect::SetReflectionMode (const Graphic3d_TypeOfReflection theType,
695 const Standard_Boolean theValue)
697 myReflActivity[theType] = theValue;
698 if (myMaterialType == Graphic3d_MATERIAL_PHYSIC)
704 // =======================================================================
705 // function : SetSpecular
707 // =======================================================================
708 void Graphic3d_MaterialAspect::SetSpecular (const Standard_ShortReal theValue)
713 Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetSpecular < 0. or > 1.0");
716 myColorCoef[Graphic3d_TOR_SPECULAR] = theValue;
717 if (myReflActivity[Graphic3d_TOR_SPECULAR]
718 && myMaterialType == Graphic3d_MATERIAL_PHYSIC)
724 // =======================================================================
725 // function : SetTransparency
727 // =======================================================================
728 void Graphic3d_MaterialAspect::SetTransparency (const Standard_ShortReal theValue)
733 Graphic3d_MaterialDefinitionError::Raise ("Bad value for SetTransparency < 0. or > 1.0");
736 myTransparencyCoef = theValue;
739 // =======================================================================
740 // function : SetRefractionIndex
742 // =======================================================================
743 void Graphic3d_MaterialAspect::SetRefractionIndex (const Standard_ShortReal theValue)
747 Graphic3d_MaterialDefinitionError::Raise ("Bad value for refraction index < 1.0");
750 myRefractionIndex = theValue;
753 // =======================================================================
754 // function : SetShininess
756 // =======================================================================
757 void Graphic3d_MaterialAspect::SetShininess (const Standard_ShortReal theValue)
762 Graphic3d_MaterialDefinitionError::Raise ("Bad value for Shininess < 0. or > 1.0");
765 myShininess = theValue;
769 // =======================================================================
770 // function : MaterialName
772 // =======================================================================
773 Standard_CString Graphic3d_MaterialAspect::MaterialName (const Standard_Integer theRank)
775 if (theRank < 1 || theRank > NumberOfMaterials())
777 Standard_OutOfRange::Raise ("BAD index of material");
779 const RawMaterial& aMat = THE_MATERIALS[theRank - 1];
780 return aMat.StringName;
783 // =======================================================================
784 // function : MaterialFromName
786 // =======================================================================
787 Graphic3d_NameOfMaterial Graphic3d_MaterialAspect::MaterialFromName (const Standard_CString theName)
789 TCollection_AsciiString aName (theName);
792 const Standard_Integer aNbMaterials = Graphic3d_MaterialAspect::NumberOfMaterials();
793 for (Standard_Integer aMatIter = 0; aMatIter < aNbMaterials; ++aMatIter)
795 const RawMaterial& aMat = THE_MATERIALS[aMatIter];
796 if (aName == aMat.StringName)
798 return Graphic3d_NameOfMaterial(aMatIter);
803 if (aName == "Plastic") // Plastified
805 return Graphic3d_NOM_PLASTIC;
807 else if (aName == "Shiny_plastic") // Shiny_plastified
809 return Graphic3d_NOM_SHINY_PLASTIC;
811 else if (aName == "Plaster") // Plastered
813 return Graphic3d_NOM_PLASTER;
815 else if (aName == "Satin") // Satined
817 return Graphic3d_NOM_SATIN;
819 else if (aName == "Neon_gnc") // Ionized
821 return Graphic3d_NOM_NEON_GNC;
823 else if (aName == "Neon_phc") // Neon
825 return Graphic3d_NOM_NEON_PHC;
827 return Graphic3d_NOM_DEFAULT;
830 // =======================================================================
831 // function : MaterialType
833 // =======================================================================
834 Graphic3d_TypeOfMaterial Graphic3d_MaterialAspect::MaterialType (const Standard_Integer theRank)
836 if (theRank < 1 || theRank > NumberOfMaterials())
838 Standard_OutOfRange::Raise ("BAD index of material");
840 const RawMaterial& aMat = THE_MATERIALS[theRank - 1];
841 return aMat.MaterialType;