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_OutOfRange.hxx>
22 //! Raw material for defining list of standard materials
25 const char* StringName;
27 Graphic3d_PBRMaterial PBRMaterial;
28 Quantity_Color Colors[Graphic3d_TypeOfReflection_NB];
29 Standard_ShortReal TransparencyCoef;
30 Standard_ShortReal RefractionIndex;
31 Standard_ShortReal Shininess;
32 Standard_ShortReal AmbientCoef; //!< coefficient for Graphic3d_MaterialAspect::SetColor()
33 Standard_ShortReal DiffuseCoef; //!< coefficient for Graphic3d_MaterialAspect::SetColor()
34 Graphic3d_TypeOfMaterial MaterialType;
35 Graphic3d_NameOfMaterial MaterialName;
37 RawMaterial (Graphic3d_NameOfMaterial theName, const char* theStringName);
41 //! Name list of standard materials (defined within enumeration).
42 static const RawMaterial THE_MATERIALS[] =
44 RawMaterial (Graphic3d_NameOfMaterial_Brass, "Brass"),
45 RawMaterial (Graphic3d_NameOfMaterial_Bronze, "Bronze"),
46 RawMaterial (Graphic3d_NameOfMaterial_Copper, "Copper"),
47 RawMaterial (Graphic3d_NameOfMaterial_Gold, "Gold"),
48 RawMaterial (Graphic3d_NameOfMaterial_Pewter, "Pewter"),
49 RawMaterial (Graphic3d_NameOfMaterial_Plastered, "Plastered"),
50 RawMaterial (Graphic3d_NameOfMaterial_Plastified, "Plastified"),
51 RawMaterial (Graphic3d_NameOfMaterial_Silver, "Silver"),
52 RawMaterial (Graphic3d_NameOfMaterial_Steel, "Steel"),
53 RawMaterial (Graphic3d_NameOfMaterial_Stone, "Stone"),
54 RawMaterial (Graphic3d_NameOfMaterial_ShinyPlastified, "Shiny_plastified"),
55 RawMaterial (Graphic3d_NameOfMaterial_Satin, "Satined"),
56 RawMaterial (Graphic3d_NameOfMaterial_Metalized, "Metalized"),
57 RawMaterial (Graphic3d_NameOfMaterial_Ionized, "Ionized"),
58 RawMaterial (Graphic3d_NameOfMaterial_Chrome, "Chrome"),
59 RawMaterial (Graphic3d_NameOfMaterial_Aluminum, "Aluminium"),
60 RawMaterial (Graphic3d_NameOfMaterial_Obsidian, "Obsidian"),
61 RawMaterial (Graphic3d_NameOfMaterial_Neon, "Neon"),
62 RawMaterial (Graphic3d_NameOfMaterial_Jade, "Jade"),
63 RawMaterial (Graphic3d_NameOfMaterial_Charcoal, "Charcoal"),
64 RawMaterial (Graphic3d_NameOfMaterial_Water, "Water"),
65 RawMaterial (Graphic3d_NameOfMaterial_Glass, "Glass"),
66 RawMaterial (Graphic3d_NameOfMaterial_Diamond, "Diamond"),
67 RawMaterial (Graphic3d_NameOfMaterial_Transparent, "Transparent"),
68 RawMaterial (Graphic3d_NameOfMaterial_DEFAULT, "Default"),
69 RawMaterial (Graphic3d_NameOfMaterial_UserDefined, "UserDefined")
73 // =======================================================================
74 // function : RawMaterial
76 // =======================================================================
77 RawMaterial::RawMaterial (Graphic3d_NameOfMaterial theName, const char* theStringName)
78 : StringName (theStringName),
79 BSDF (Graphic3d_BSDF::CreateDiffuse (Graphic3d_Vec3 (0.0f))),
80 TransparencyCoef(0.0f),
81 RefractionIndex (1.0f),
85 MaterialType (Graphic3d_MATERIAL_ASPECT),
86 MaterialName (theName)
90 case Graphic3d_NameOfMaterial_Plastified:
91 MaterialType = Graphic3d_MATERIAL_ASPECT;
93 Shininess = 0.0078125f;
94 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.25f));
95 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.24f));
96 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.004896f));
97 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
99 BSDF.Kd = Graphic3d_Vec3 (0.2f);
100 BSDF.Ks = Graphic3d_Vec4 (0.00784314f, 0.00784314f, 0.00784314f, 0.25f);
104 case Graphic3d_NameOfMaterial_ShinyPlastified:
105 MaterialType = Graphic3d_MATERIAL_ASPECT;
108 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.22f));
109 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.50f));
110 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (1.0f));
111 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
113 BSDF.Kd = Graphic3d_Vec3 (0.2f);
114 BSDF.Ks = Graphic3d_Vec4 (0.145f, 0.145f, 0.145f, 0.17f);
117 case Graphic3d_NameOfMaterial_Satin:
118 MaterialType = Graphic3d_MATERIAL_ASPECT;
120 Shininess = 0.09375f;
121 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.165f));
122 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.40f));
123 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.162647f));
124 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
126 BSDF.Kd = Graphic3d_Vec3 (0.2f);
127 BSDF.Ks = Graphic3d_Vec4 (0.6f);
130 case Graphic3d_NameOfMaterial_Ionized:
131 MaterialType = Graphic3d_MATERIAL_ASPECT;
134 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.0f));
135 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (1.0f));
136 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.342392f));
137 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (1.0f));
139 BSDF.Kd = Graphic3d_Vec3 (0.0f);
140 BSDF.Ks = Graphic3d_Vec4 (0.5f, 0.5f, 0.5f, 0.f);
141 BSDF.Le = static_cast<Graphic3d_Vec3> (Colors[Graphic3d_TOR_DIFFUSE]);
142 BSDF.FresnelBase = Graphic3d_Fresnel::CreateDielectric (1.5f);
144 case Graphic3d_NameOfMaterial_Metalized:
145 MaterialType = Graphic3d_MATERIAL_ASPECT;
148 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.0f));
149 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.47f));
150 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.170645f));
151 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
153 BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
154 Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.2f)), 0.045f);
156 case Graphic3d_NameOfMaterial_Brass:
157 MaterialType = Graphic3d_MATERIAL_PHYSIC;
159 BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
160 Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.58f, 0.42f, 0.20f)), 0.045f);
163 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.088428f, 0.041081f, 0.002090f));
164 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.570482f, 0.283555f, 0.012335f));
165 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.992f, 0.941f, 0.808f));
166 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
168 case Graphic3d_NameOfMaterial_Bronze:
169 MaterialType = Graphic3d_MATERIAL_PHYSIC;
171 BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
172 Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.65f, 0.35f, 0.15f)), 0.045f);
175 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.037301f, 0.014931f, 0.004305f));
176 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.468185f, 0.153344f, 0.027491f));
177 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.590f, 0.408f, 0.250f));
178 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
180 case Graphic3d_NameOfMaterial_Copper:
181 MaterialType = Graphic3d_MATERIAL_PHYSIC;
183 BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
184 Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.955008f, 0.637427f, 0.538163f)), 0.045f);
187 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.030370f, 0.006451f, 0.001780f));
188 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.323236f, 0.059254f, 0.007584f));
189 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.950f, 0.640f, 0.540f));
190 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
192 case Graphic3d_NameOfMaterial_Gold:
193 MaterialType = Graphic3d_MATERIAL_PHYSIC;
195 BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
196 Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (1.000000f, 0.765557f, 0.336057f)), 0.045f);
199 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.073239f, 0.043234f, 0.009264f));
200 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.525643f, 0.295700f, 0.010023f));
201 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (1.000f, 0.710f, 0.290f));
202 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
204 case Graphic3d_NameOfMaterial_Pewter:
205 MaterialType = Graphic3d_MATERIAL_PHYSIC;
207 BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
208 Graphic3d_Fresnel::CreateConductor (1.8800f, 3.4900f), 0.045f);
211 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.010979f, 0.004795f, 0.012335f));
212 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.152583f, 0.188174f, 0.253972f));
213 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.333f, 0.333f, 0.522f));
214 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
216 case Graphic3d_NameOfMaterial_Plastered:
217 MaterialType = Graphic3d_MATERIAL_ASPECT;
220 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.13f));
221 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.75f));
222 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.003936f));
223 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
225 BSDF.Kd = Graphic3d_Vec3 (0.482353f, 0.482353f, 0.482353f);
228 case Graphic3d_NameOfMaterial_Silver:
229 MaterialType = Graphic3d_MATERIAL_PHYSIC;
231 BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
232 Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.971519f, 0.959915f, 0.915324f)), 0.045f);
235 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.061465f, 0.061465f, 0.050876f));
236 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.354692f, 0.354692f, 0.354692f));
237 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.950f, 0.930f, 0.880f));
238 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
240 case Graphic3d_NameOfMaterial_Steel:
241 MaterialType = Graphic3d_MATERIAL_PHYSIC;
243 BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
244 Graphic3d_Fresnel::CreateConductor (Graphic3d_Vec3 (2.90f, 2.80f, 2.53f), Graphic3d_Vec3 (3.08f, 2.90f, 2.74f)), 0.045f);
247 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.019607f, 0.019607f, 0.027212f));
248 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.214041f, 0.223414f, 0.233022f));
249 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.560f, 0.570f, 0.580f));
250 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
252 case Graphic3d_NameOfMaterial_Stone:
253 MaterialType = Graphic3d_MATERIAL_PHYSIC;
255 // special case for SetColor()
256 AmbientCoef = 0.19f * 0.25f;
260 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.030074f, 0.020069f, 0.013011f));
261 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.522522f, 0.318547f, 0.183064f));
262 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.98f, 1.0f, 0.60f) * 0.08f);
263 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
265 BSDF.Kd = Graphic3d_Vec3 (0.243137f, 0.243137f, 0.243137f);
266 BSDF.Ks = Graphic3d_Vec4 (0.00392157f, 0.00392157f, 0.00392157f, 0.5f);
269 case Graphic3d_NameOfMaterial_Chrome:
270 MaterialType = Graphic3d_MATERIAL_PHYSIC;
272 BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
273 Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.549585f, 0.556114f, 0.554256f)), 0.045f);
276 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.033105f, 0.033105f, 0.041436f));
277 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.263273f, 0.263273f, 0.263273f));
278 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.975f, 0.975f, 0.975f));
279 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
281 case Graphic3d_NameOfMaterial_Aluminum:
282 MaterialType = Graphic3d_MATERIAL_PHYSIC;
284 BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f),
285 Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.913183f, 0.921494f, 0.924524f)), 0.045f);
288 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.073239f, 0.073239f, 0.073239f));
289 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.318547f, 0.318547f, 0.318547f));
290 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.910f, 0.920f, 0.920f));
291 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
293 case Graphic3d_NameOfMaterial_Neon:
294 MaterialType = Graphic3d_MATERIAL_PHYSIC;
297 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.0f));
298 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.0f));
299 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.62f));
300 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f, 0.787412f, 0.142892f));
302 BSDF.Kd = Graphic3d_Vec3 (0.0f);
303 BSDF.Ks = Graphic3d_Vec4 (0.5f, 0.5f, 0.5f, 0.f);
304 BSDF.Le = Graphic3d_Vec3 (0.0f, 1.0f, 0.46f);
305 BSDF.FresnelBase = Graphic3d_Fresnel::CreateDielectric (1.5f);
307 case Graphic3d_NameOfMaterial_Obsidian:
308 MaterialType = Graphic3d_MATERIAL_PHYSIC;
311 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.004305f, 0.003936f, 0.005532f));
312 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.028053f, 0.024515f, 0.041436f));
313 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.333f, 0.329f, 0.346f));
314 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
316 BSDF.Kd = Graphic3d_Vec3 (0.023f, 0.f, 0.023f);
317 BSDF.Ks = Graphic3d_Vec4 (0.0156863f, 0.0156863f, 0.0156863f, 0.1f);
319 case Graphic3d_NameOfMaterial_Jade:
320 MaterialType = Graphic3d_MATERIAL_PHYSIC;
323 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.016338f, 0.040729f, 0.021493f));
324 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.252950f, 0.767769f, 0.354692f));
325 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.316f, 0.316f, 0.316f));
326 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
328 BSDF.FresnelBase = Graphic3d_Fresnel::CreateDielectric (1.5f);
329 BSDF.Kd = Graphic3d_Vec3 (0.208658f, 0.415686f, 0.218401f);
330 BSDF.Ks = Graphic3d_Vec4 (0.611765f, 0.611765f, 0.611765f, 0.06f);
332 case Graphic3d_NameOfMaterial_Charcoal:
333 MaterialType = Graphic3d_MATERIAL_PHYSIC;
336 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.003936f));
337 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.019607f));
338 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.0f));
339 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
341 BSDF.Kd = Graphic3d_Vec3 (0.02f, 0.02f, 0.02f);
342 BSDF.Ks = Graphic3d_Vec4 (0.1f, 0.1f, 0.1f, 0.3f);
344 case Graphic3d_NameOfMaterial_Water:
345 MaterialType = Graphic3d_MATERIAL_PHYSIC;
347 RefractionIndex = 1.33f;
348 BSDF = Graphic3d_BSDF::CreateGlass (Graphic3d_Vec3 (1.f),
349 Graphic3d_Vec3 (0.7f, 0.75f, 0.85f),
352 TransparencyCoef = 0.80f;
355 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.170645f, 0.170645f, 0.191627f));
356 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.003936f, 0.003936f, 0.006571f));
357 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.380f, 0.380f, 0.380f));
358 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
360 case Graphic3d_NameOfMaterial_Glass:
361 MaterialType = Graphic3d_MATERIAL_PHYSIC;
363 RefractionIndex = 1.62f;
364 BSDF = Graphic3d_BSDF::CreateGlass (Graphic3d_Vec3 (1.f),
365 Graphic3d_Vec3 (0.75f, 0.95f, 0.9f),
368 TransparencyCoef = 0.80f;
371 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.263273f, 0.290143f, 0.290143f));
372 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.003936f, 0.006571f, 0.006571f));
373 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.920f, 0.920f, 0.920f));
374 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
376 case Graphic3d_NameOfMaterial_Diamond:
377 MaterialType = Graphic3d_MATERIAL_PHYSIC;
379 RefractionIndex = 2.42f;
380 BSDF = Graphic3d_BSDF::CreateGlass (Graphic3d_Vec3 (1.f),
381 Graphic3d_Vec3 (0.95f, 0.95f, 0.95f),
384 TransparencyCoef = 0.80f;
387 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.263273f));
388 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.010023f));
389 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.970f));
390 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
393 case Graphic3d_NameOfMaterial_Transparent:
394 MaterialType = Graphic3d_MATERIAL_PHYSIC;
396 RefractionIndex = 1.0f;
398 BSDF.Kd = Graphic3d_Vec3 (0.1f);
399 BSDF.Kt = Graphic3d_Vec3 (0.9f);
400 BSDF.FresnelBase = Graphic3d_Fresnel::CreateConstant (0.0f);
401 TransparencyCoef = 0.80f;
404 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.263273f));
405 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.010023f));
406 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.970f));
407 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
409 case Graphic3d_NameOfMaterial_UserDefined:
410 MaterialType = Graphic3d_MATERIAL_PHYSIC;
411 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.1f));
412 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.6f));
413 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.2f));
414 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
416 case Graphic3d_NameOfMaterial_DEFAULT:
417 MaterialType = Graphic3d_MATERIAL_ASPECT;
419 Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.15f));
420 Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.65f));
421 Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.0f));
422 Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f));
425 PBRMaterial.SetBSDF (BSDF);
428 // =======================================================================
429 // function : Graphic3d_MaterialAspect
431 // =======================================================================
432 Graphic3d_MaterialAspect::Graphic3d_MaterialAspect()
433 : myRequestedMaterialName (Graphic3d_NameOfMaterial_DEFAULT)
435 init (Graphic3d_NameOfMaterial_DEFAULT);
438 // =======================================================================
439 // function : Graphic3d_MaterialAspect
441 // =======================================================================
442 Graphic3d_MaterialAspect::Graphic3d_MaterialAspect (const Graphic3d_NameOfMaterial theName)
443 : myRequestedMaterialName (theName)
448 // =======================================================================
451 // =======================================================================
452 void Graphic3d_MaterialAspect::init (const Graphic3d_NameOfMaterial theName)
454 const RawMaterial& aMat = THE_MATERIALS[theName];
456 myPBRMaterial = aMat.PBRMaterial;
457 myStringName = aMat.StringName;
458 myColors[Graphic3d_TOR_AMBIENT] = aMat.Colors[Graphic3d_TOR_AMBIENT];
459 myColors[Graphic3d_TOR_DIFFUSE] = aMat.Colors[Graphic3d_TOR_DIFFUSE];
460 myColors[Graphic3d_TOR_SPECULAR] = aMat.Colors[Graphic3d_TOR_SPECULAR];
461 myColors[Graphic3d_TOR_EMISSION] = aMat.Colors[Graphic3d_TOR_EMISSION];
462 myTransparencyCoef = aMat.TransparencyCoef;
463 myRefractionIndex = aMat.RefractionIndex;
464 myShininess = aMat.Shininess;
465 myMaterialType = aMat.MaterialType;
466 myMaterialName = theName;
467 myRequestedMaterialName = theName;
470 // =======================================================================
471 // function : IncreaseShine
473 // =======================================================================
474 void Graphic3d_MaterialAspect::IncreaseShine (const Standard_ShortReal theDelta)
476 const Standard_ShortReal anOldShine = myShininess;
477 myShininess = myShininess + myShininess * theDelta / 100.0f;
478 if (myShininess > 1.0f || myShininess < 0.0f)
480 myShininess = anOldShine;
484 // =======================================================================
485 // function : SetMaterialType
487 // =======================================================================
488 void Graphic3d_MaterialAspect::SetMaterialType (const Graphic3d_TypeOfMaterial theType)
490 myMaterialType = theType;
491 if (theType != myMaterialType)
497 // =======================================================================
498 // function : SetColor
500 // =======================================================================
501 void Graphic3d_MaterialAspect::SetColor (const Quantity_Color& theColor)
503 if (myMaterialType == Graphic3d_MATERIAL_ASPECT)
508 myPBRMaterial.SetColor (theColor);
510 const RawMaterial& aSrcMat = THE_MATERIALS[myRequestedMaterialName];
511 const Quantity_Color anAmbient((Graphic3d_Vec3 )theColor * aSrcMat.AmbientCoef);
512 const Quantity_Color aDiffuse ((Graphic3d_Vec3 )theColor * aSrcMat.DiffuseCoef);
513 if (myMaterialName != Graphic3d_NameOfMaterial_UserDefined
514 && (!myColors[Graphic3d_TOR_AMBIENT].IsEqual (anAmbient)
515 || !myColors[Graphic3d_TOR_DIFFUSE].IsEqual (aDiffuse)))
519 myColors[Graphic3d_TOR_AMBIENT] = anAmbient;
520 myColors[Graphic3d_TOR_DIFFUSE] = aDiffuse;
523 // =======================================================================
524 // function : SetAmbientColor
526 // =======================================================================
527 void Graphic3d_MaterialAspect::SetAmbientColor (const Quantity_Color& theColor)
529 if (myMaterialType == Graphic3d_MATERIAL_PHYSIC
530 && myMaterialName != Graphic3d_NameOfMaterial_UserDefined
531 && !myColors[Graphic3d_TOR_AMBIENT].IsEqual (theColor))
535 myColors[Graphic3d_TOR_AMBIENT] = theColor;
538 // =======================================================================
539 // function : SetDiffuseColor
541 // =======================================================================
542 void Graphic3d_MaterialAspect::SetDiffuseColor (const Quantity_Color& theColor)
544 if (myMaterialType == Graphic3d_MATERIAL_PHYSIC
545 && myMaterialName != Graphic3d_NameOfMaterial_UserDefined
546 && !myColors[Graphic3d_TOR_DIFFUSE].IsEqual (theColor))
550 myColors[Graphic3d_TOR_DIFFUSE] = theColor;
553 // =======================================================================
554 // function : SetSpecularColor
556 // =======================================================================
557 void Graphic3d_MaterialAspect::SetSpecularColor (const Quantity_Color& theColor)
559 if (myMaterialType == Graphic3d_MATERIAL_PHYSIC
560 && myMaterialName != Graphic3d_NameOfMaterial_UserDefined
561 && !myColors[Graphic3d_TOR_SPECULAR].IsEqual (theColor))
565 myColors[Graphic3d_TOR_SPECULAR] = theColor;
568 // =======================================================================
569 // function : SetEmissiveColor
571 // =======================================================================
572 void Graphic3d_MaterialAspect::SetEmissiveColor (const Quantity_Color& theColor)
574 if (myMaterialType == Graphic3d_MATERIAL_PHYSIC
575 && myMaterialName != Graphic3d_NameOfMaterial_UserDefined
576 && !myColors[Graphic3d_TOR_EMISSION].IsEqual (theColor))
580 myColors[Graphic3d_TOR_EMISSION] = theColor;
583 // =======================================================================
584 // function : SetTransparency
586 // =======================================================================
587 void Graphic3d_MaterialAspect::SetTransparency (const Standard_ShortReal theValue)
592 throw Graphic3d_MaterialDefinitionError("Bad value for SetTransparency < 0. or > 1.0");
595 myTransparencyCoef = theValue;
596 myPBRMaterial.SetAlpha (1.0f - theValue);
599 // =======================================================================
600 // function : SetRefractionIndex
602 // =======================================================================
603 void Graphic3d_MaterialAspect::SetRefractionIndex (const Standard_ShortReal theValue)
607 throw Graphic3d_MaterialDefinitionError("Bad value for refraction index < 1.0");
610 myRefractionIndex = theValue;
613 // =======================================================================
614 // function : SetShininess
616 // =======================================================================
617 void Graphic3d_MaterialAspect::SetShininess (const Standard_ShortReal theValue)
622 throw Graphic3d_MaterialDefinitionError("Bad value for Shininess < 0. or > 1.0");
625 if (myShininess != theValue)
627 myShininess = theValue;
632 // =======================================================================
633 // function : MaterialName
635 // =======================================================================
636 Standard_CString Graphic3d_MaterialAspect::MaterialName (const Standard_Integer theRank)
638 if (theRank < 1 || theRank > NumberOfMaterials())
640 throw Standard_OutOfRange("BAD index of material");
642 const RawMaterial& aMat = THE_MATERIALS[theRank - 1];
643 return aMat.StringName;
646 // =======================================================================
647 // function : MaterialFromName
649 // =======================================================================
650 Standard_Boolean Graphic3d_MaterialAspect::MaterialFromName (const Standard_CString theName,
651 Graphic3d_NameOfMaterial& theMat)
653 TCollection_AsciiString aName (theName);
656 const Standard_Integer aNbMaterials = Graphic3d_MaterialAspect::NumberOfMaterials();
657 for (Standard_Integer aMatIter = 0; aMatIter <= aNbMaterials; ++aMatIter)
659 const RawMaterial& aMat = THE_MATERIALS[aMatIter];
660 if (aName == aMat.StringName)
662 theMat = Graphic3d_NameOfMaterial(aMatIter);
663 return Standard_True;
668 if (aName == "Plastic") // Plastified
670 theMat = Graphic3d_NameOfMaterial_Plastified;
671 return Standard_True;
673 else if (aName == "Shiny_plastic") // Shiny_plastified
675 theMat = Graphic3d_NameOfMaterial_ShinyPlastified;
676 return Standard_True;
678 else if (aName == "Plaster") // Plastered
680 theMat = Graphic3d_NameOfMaterial_Plastered;
681 return Standard_True;
683 else if (aName == "Satin") // Satined
685 theMat = Graphic3d_NameOfMaterial_Satin;
686 return Standard_True;
688 else if (aName == "Neon_gnc") // Ionized
690 theMat = Graphic3d_NameOfMaterial_Ionized;
691 return Standard_True;
693 else if (aName == "Neon_phc") // Neon
695 theMat = Graphic3d_NameOfMaterial_Neon;
696 return Standard_True;
698 return Standard_False;
701 // =======================================================================
702 // function : MaterialType
704 // =======================================================================
705 Graphic3d_TypeOfMaterial Graphic3d_MaterialAspect::MaterialType (const Standard_Integer theRank)
707 if (theRank < 1 || theRank > NumberOfMaterials())
709 throw Standard_OutOfRange("BAD index of material");
711 const RawMaterial& aMat = THE_MATERIALS[theRank - 1];
712 return aMat.MaterialType;
715 //=======================================================================
716 //function : DumpJson
718 //=======================================================================
719 void Graphic3d_MaterialAspect::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
721 OCCT_DUMP_CLASS_BEGIN (theOStream, Graphic3d_MaterialAspect)
723 OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBSDF)
724 OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPBRMaterial)
725 OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myStringName)
727 OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myColors[Graphic3d_TOR_AMBIENT])
728 OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myColors[Graphic3d_TOR_DIFFUSE])
729 OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myColors[Graphic3d_TOR_SPECULAR])
730 OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myColors[Graphic3d_TOR_EMISSION])
732 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTransparencyCoef)
733 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRefractionIndex)
734 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myShininess)
736 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaterialType)
737 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaterialName)
738 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRequestedMaterialName)