1 // File: OpenGl_AspectFace.cxx
2 // Created: 13 July 2011
3 // Author: Sergey ZERCHANINOV
4 // Copyright: OPEN CASCADE 2011
6 #include <OpenGl_AspectFace.hxx>
8 #include <InterfaceGraphic_Graphic3d.hxx>
9 #include <Aspect_PolygonOffsetMode.hxx>
11 /*----------------------------------------------------------------------*/
13 static const TEL_CONTEXT_FACE myDefaultAspectFace =
16 TOn, TEL_HS_SOLID, TOn, TelCullNone,
17 { 0.2F, 0.8F, 0.1F, 0.0F, /* amb, diff, spec, emsv */
18 1.0F, 10.0F, 0.0F, /* trans, shine, env_reflexion */
20 (OPENGL_AMBIENT_MASK | OPENGL_DIFFUSE_MASK | OPENGL_SPECULAR_MASK), /* color_mask */
21 {{ 1.0F, 1.0F, 1.0F, 1.0F }}, /* ambient color */
22 {{ 1.0F, 1.0F, 1.0F, 1.0F }}, /* diffuse color */
23 {{ 1.0F, 1.0F, 1.0F, 1.0F }}, /* specular color */
24 {{ 1.0F, 1.0F, 1.0F, 1.0F }}, /* emissive color */
25 {{ 1.0F, 1.0F, 1.0F, 1.0F }} /* material color */
27 { 0.2F, 0.8F, 0.1F, 0.0F, /* amb, diff, spec, emsv */
28 1.0F, 10.0F, 0.0F, /* trans, shine, env_reflexion */
30 (OPENGL_AMBIENT_MASK | OPENGL_DIFFUSE_MASK | OPENGL_SPECULAR_MASK), /* color_mask */
31 {{ 1.0F, 1.0F, 1.0F, 1.0F }}, /* ambient color */
32 {{ 1.0F, 1.0F, 1.0F, 1.0F }}, /* diffuse color */
33 {{ 1.0F, 1.0F, 1.0F, 1.0F }}, /* specular color */
34 {{ 1.0F, 1.0F, 1.0F, 1.0F }}, /* emissive color */
35 {{ 1.0F, 1.0F, 1.0F, 1.0F }} /* material color */
37 0, -1, { Aspect_POM_Fill, 1.0F, 0.0F }
40 /*----------------------------------------------------------------------*/
42 static void ConvertMaterial (const CALL_DEF_MATERIAL &material, OPENGL_SURF_PROP &surface)
44 /* Cas par cas pour l evaluation */
45 surface.amb = material.IsAmbient? material.Ambient : 0.F;
46 surface.diff = material.IsDiffuse? material.Diffuse : 0.F;
47 surface.spec = material.IsSpecular? material.Specular : 0.F;
48 surface.emsv = material.IsEmission? material.Emission : 0.F;
50 /* type de materiel */
51 surface.isphysic = material.IsPhysic? 1 : 0;
53 /* Couleur du materiel */
54 surface.color_mask = 0;
55 if ( material.IsAmbient )
56 surface.color_mask |= OPENGL_AMBIENT_MASK;
57 if ( material.IsDiffuse )
58 surface.color_mask |= OPENGL_DIFFUSE_MASK;
59 if ( material.IsSpecular )
60 surface.color_mask |= OPENGL_SPECULAR_MASK;
61 if ( material.IsEmission )
62 surface.color_mask |= OPENGL_EMISSIVE_MASK;
64 /* Couleur eclairage ambient */
65 surface.ambcol.rgb[0] = material.ColorAmb.r;
66 surface.ambcol.rgb[1] = material.ColorAmb.g;
67 surface.ambcol.rgb[2] = material.ColorAmb.b;
68 surface.ambcol.rgb[3] = 1.F;
70 /* Couleur eclairage diffus */
71 surface.difcol.rgb[0] = material.ColorDif.r;
72 surface.difcol.rgb[1] = material.ColorDif.g;
73 surface.difcol.rgb[2] = material.ColorDif.b;
74 surface.difcol.rgb[3] = 1.F;
76 /* Couleur eclairage speculaire */
77 surface.speccol.rgb[0] = material.ColorSpec.r;
78 surface.speccol.rgb[1] = material.ColorSpec.g;
79 surface.speccol.rgb[2] = material.ColorSpec.b;
80 surface.speccol.rgb[3] = 1.F;
82 /* Couleur d emission */
83 surface.emscol.rgb[0] = material.ColorEms.r;
84 surface.emscol.rgb[1] = material.ColorEms.g;
85 surface.emscol.rgb[2] = material.ColorEms.b;
86 surface.emscol.rgb[3] = 1.F;
88 surface.shine = ( float )128 * material.Shininess;
89 surface.env_reflexion = material.EnvReflexion;
91 /* Dans la couche C++ :
92 * prop->trans = 0. => opaque
93 * prop->trans = 1. => transparent
94 * in OpenGl it is opposite.
96 surface.trans = 1.0F - material.Transparency;
99 /*----------------------------------------------------------------------*/
101 OpenGl_AspectFace::OpenGl_AspectFace ()
102 : myContext(myDefaultAspectFace)
105 /*----------------------------------------------------------------------*/
107 void OpenGl_AspectFace::SetContext (const CALL_DEF_CONTEXTFILLAREA &AContext)
110 myContext.InteriorStyle = (Aspect_InteriorStyle) AContext.Style;
113 myContext.Edge = AContext.Edge ? TOn : TOff;
115 //TelInteriorStyleIndex
116 switch( AContext.Hatch )
118 case 0 : /* Aspect_HS_HORIZONTAL */
119 myContext.Hatch = TEL_HS_HORIZONTAL;
121 case 1 : /* Aspect_HS_HORIZONTAL_WIDE */
122 myContext.Hatch = TEL_HS_HORIZONTAL_SPARSE;
124 case 2 : /* Aspect_HS_VERTICAL */
125 myContext.Hatch = TEL_HS_VERTICAL;
127 case 3 : /* Aspect_HS_VERTICAL_WIDE */
128 myContext.Hatch = TEL_HS_VERTICAL_SPARSE;
130 case 4 : /* Aspect_HS_DIAGONAL_45 */
131 myContext.Hatch = TEL_HS_DIAG_45;
133 case 5 : /* Aspect_HS_DIAGONAL_45_WIDE */
134 myContext.Hatch = TEL_HS_DIAG_45_SPARSE;
136 case 6 : /* Aspect_HS_DIAGONAL_135 */
137 myContext.Hatch = TEL_HS_DIAG_135;
139 case 7 : /* Aspect_HS_DIAGONAL_135_WIDE */
140 myContext.Hatch = TEL_HS_DIAG_135_SPARSE;
142 case 8 : /* Aspect_HS_GRID */
143 myContext.Hatch = TEL_HS_GRID;
145 case 9 : /* Aspect_HS_GRID_WIDE */
146 myContext.Hatch = TEL_HS_GRID_SPARSE;
148 case 10 : /* Aspect_HS_GRID_DIAGONAL */
149 myContext.Hatch = TEL_HS_CROSS;
151 case 11 : /* Aspect_HS_GRID_DIAGONAL_WIDE */
152 myContext.Hatch = TEL_HS_CROSS_SPARSE;
159 //TelFaceDistinguishingMode
160 myContext.DistinguishingMode = AContext.Distinguish ? TOn : TOff;
163 myContext.CullingMode = AContext.BackFace ? TelCullBack : TelCullNone;
165 //TelSurfaceAreaProperties
166 ConvertMaterial(AContext.Front,myContext.IntFront);
168 //TelBackSurfaceAreaProperties
169 ConvertMaterial(AContext.Back,myContext.IntBack);
172 myContext.IntFront.matcol.rgb[0] = (float) AContext.IntColor.r;
173 myContext.IntFront.matcol.rgb[1] = (float) AContext.IntColor.g;
174 myContext.IntFront.matcol.rgb[2] = (float) AContext.IntColor.b;
175 myContext.IntFront.matcol.rgb[3] = 1.f;
177 //TelBackInteriorColour
178 myContext.IntBack.matcol.rgb[0] = (float) AContext.BackIntColor.r;
179 myContext.IntBack.matcol.rgb[1] = (float) AContext.BackIntColor.g;
180 myContext.IntBack.matcol.rgb[2] = (float) AContext.BackIntColor.b;
181 myContext.IntBack.matcol.rgb[3] = 1.f;
184 myContext.doTextureMap = AContext.Texture.doTextureMap;
187 myContext.TexId = AContext.Texture.TexId;
190 myContext.PolygonOffset.mode = (Aspect_PolygonOffsetMode) AContext.PolygonOffsetMode;
191 myContext.PolygonOffset.factor = AContext.PolygonOffsetFactor;
192 myContext.PolygonOffset.units = AContext.PolygonOffsetUnits;
194 CALL_DEF_CONTEXTLINE anEdgeContext;
197 anEdgeContext.Color.r = (float) AContext.EdgeColor.r;
198 anEdgeContext.Color.g = (float) AContext.EdgeColor.g;
199 anEdgeContext.Color.b = (float) AContext.EdgeColor.b;
202 anEdgeContext.LineType = (Aspect_TypeOfLine) AContext.LineType;
205 anEdgeContext.Width = (float) AContext.Width;
207 myAspectEdge.SetContext(anEdgeContext);
210 /*----------------------------------------------------------------------*/
212 void OpenGl_AspectFace::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
214 AWorkspace->SetAspectFace(this);
217 /*----------------------------------------------------------------------*/