b311480e |
1 | // Created by: NW,JPB,CAL |
2 | // Copyright (c) 1991-1999 Matra Datavision |
973c2be1 |
3 | // Copyright (c) 1999-2014 OPEN CASCADE SAS |
b311480e |
4 | // |
973c2be1 |
5 | // This file is part of Open CASCADE Technology software library. |
b311480e |
6 | // |
d5f74e42 |
7 | // This library is free software; you can redistribute it and/or modify it under |
8 | // the terms of the GNU Lesser General Public License version 2.1 as published |
973c2be1 |
9 | // by the Free Software Foundation, with special exception defined in the file |
10 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT |
11 | // distribution for complete text of the license and disclaimer of any warranty. |
b311480e |
12 | // |
973c2be1 |
13 | // Alternatively, this file may be used under the terms of Open CASCADE |
14 | // commercial license or contractual agreement. |
7fd59977 |
15 | |
b64d84be |
16 | #include <Graphic3d_Group.ixx> |
7fd59977 |
17 | |
b64d84be |
18 | #include <gp_Pnt.hxx> |
19 | #include <Graphic3d_ArrayOfPoints.hxx> |
20 | #include <Graphic3d_StructureManager.hxx> |
21 | #include <Graphic3d_ShaderProgram.hxx> |
22 | #include <Graphic3d_TransModeFlags.hxx> |
23 | #include <Graphic3d_TextureMap.hxx> |
24 | #include <Message.hxx> |
25 | #include <Message_Messenger.hxx> |
26 | #include <NCollection_String.hxx> |
27 | #include <TCollection_AsciiString.hxx> |
7fd59977 |
28 | |
b64d84be |
29 | #include <Graphic3d_CStructure.hxx> |
30 | #include <Graphic3d_Structure.pxx> |
7fd59977 |
31 | |
b64d84be |
32 | #define MyIsEmpty myCBitFields.bool1 |
33 | #define MyContainsFacet myCBitFields.bool2 |
7fd59977 |
34 | |
b64d84be |
35 | // ======================================================================= |
36 | // function : Graphic3d_Group |
37 | // purpose : |
38 | // ======================================================================= |
39 | Graphic3d_Group::Graphic3d_Group (const Handle(Graphic3d_Structure)& theStruct) |
31c0e219 |
40 | : myIsClosed (Standard_False) |
b64d84be |
41 | { |
42 | myBounds.XMin = ShortRealLast(); |
43 | myBounds.YMin = ShortRealLast(); |
44 | myBounds.ZMin = ShortRealLast(); |
45 | myBounds.XMax = ShortRealFirst(); |
46 | myBounds.YMax = ShortRealFirst(); |
47 | myBounds.ZMax = ShortRealFirst(); |
7fd59977 |
48 | |
b64d84be |
49 | // |
50 | // A small commentary on the usage of This! |
51 | // |
52 | // Graphic3d_Group is created in a structure. Graphic3d_Structure is a |
53 | // manager of Graphic3d_Group. In the constructor of Graphic3d_Group |
54 | // a method Add of Graphic3d_Structure is called. It allows adding |
55 | // the instance of Graphic3d_Group in its manager. So there are 2 references |
56 | // to <me> and everything works well. |
57 | // |
58 | // This () is the instance of the class, the current group |
59 | //Handle(Graphic3d_Group) me = Handle(Graphic3d_Group)::DownCast (This()); |
7fd59977 |
60 | |
b64d84be |
61 | myStructure = theStruct.operator->(); |
7fd59977 |
62 | |
b64d84be |
63 | MyContainsFacet = Standard_False, |
64 | MyIsEmpty = Standard_True; |
7fd59977 |
65 | |
b64d84be |
66 | ContextLine.IsDef = 0; |
67 | ContextText.IsDef = 0; |
68 | ContextMarker.IsDef = 0; |
69 | ContextFillArea.IsDef = 0; |
7fd59977 |
70 | |
b64d84be |
71 | ContextLine.IsSet = 0; |
72 | ContextText.IsSet = 0; |
73 | ContextMarker.IsSet = 0; |
74 | ContextFillArea.IsSet = 0; |
75 | } |
76 | |
77 | // ======================================================================= |
78 | // function : Clear |
79 | // purpose : |
80 | // ======================================================================= |
81 | void Graphic3d_Group::Clear (Standard_Boolean theUpdateStructureMgr) |
82 | { |
83 | if (IsDeleted()) |
84 | { |
85 | return; |
86 | } |
87 | |
88 | ContextLine.IsSet = 0, |
89 | ContextText.IsSet = 0, |
90 | ContextMarker.IsSet = 0, |
91 | ContextFillArea.IsSet = 0; |
7fd59977 |
92 | |
b64d84be |
93 | ContextLine.IsDef = 0, |
94 | ContextText.IsDef = 0, |
95 | ContextMarker.IsDef = 0, |
96 | ContextFillArea.IsDef = 0; |
7fd59977 |
97 | |
b64d84be |
98 | myBounds.XMin = ShortRealLast(); |
99 | myBounds.YMin = ShortRealLast(); |
100 | myBounds.ZMin = ShortRealLast(); |
101 | myBounds.XMax = ShortRealFirst(); |
102 | myBounds.YMax = ShortRealFirst(); |
103 | myBounds.ZMax = ShortRealFirst(); |
7fd59977 |
104 | |
b64d84be |
105 | if (MyContainsFacet) |
106 | { |
107 | myStructure->GroupsWithFacet (-1); |
108 | MyContainsFacet = Standard_False; |
109 | } |
110 | MyIsEmpty = Standard_True; |
7fd59977 |
111 | |
b64d84be |
112 | // clear method could be used on Graphic3d_Structure destruction, |
113 | // and its structure manager could be already destroyed, in that |
114 | // case we don't need to update it; |
115 | if (theUpdateStructureMgr) |
116 | { |
117 | Update(); |
118 | } |
119 | } |
7fd59977 |
120 | |
b64d84be |
121 | // ======================================================================= |
122 | // function : Destroy |
123 | // purpose : |
124 | // ======================================================================= |
125 | void Graphic3d_Group::Destroy() |
126 | { |
127 | // tell graphics driver to clear internal resources of the group |
128 | Clear (Standard_False); |
129 | } |
7fd59977 |
130 | |
b64d84be |
131 | // ======================================================================= |
132 | // function : Remove |
133 | // purpose : |
134 | // ======================================================================= |
135 | void Graphic3d_Group::Remove() |
7fd59977 |
136 | { |
b64d84be |
137 | if (IsDeleted()) |
138 | { |
139 | return; |
140 | } |
7fd59977 |
141 | |
b64d84be |
142 | if (MyContainsFacet) |
143 | { |
144 | myStructure->GroupsWithFacet (-1); |
145 | MyContainsFacet = Standard_False; |
146 | } |
147 | myStructure->Remove (this); |
7fd59977 |
148 | |
b64d84be |
149 | Update(); |
7fd59977 |
150 | |
b64d84be |
151 | myBounds.XMin = ShortRealLast(); |
152 | myBounds.YMin = ShortRealLast(); |
153 | myBounds.ZMin = ShortRealLast(); |
154 | myBounds.XMax = ShortRealFirst(); |
155 | myBounds.YMax = ShortRealFirst(); |
156 | myBounds.ZMax = ShortRealFirst(); |
7fd59977 |
157 | |
b64d84be |
158 | MyIsEmpty = Standard_True; |
159 | } |
160 | |
161 | // ======================================================================= |
162 | // function : IsDeleted |
163 | // purpose : |
164 | // ======================================================================= |
165 | Standard_Boolean Graphic3d_Group::IsDeleted() const |
166 | { |
167 | return myStructure == NULL |
168 | || myStructure->IsDeleted(); |
169 | } |
170 | |
171 | // ======================================================================= |
172 | // function : ContainsFacet |
173 | // purpose : |
174 | // ======================================================================= |
175 | Standard_Boolean Graphic3d_Group::ContainsFacet() const |
176 | { |
177 | return MyContainsFacet; |
178 | } |
179 | |
180 | // ======================================================================= |
181 | // function : IsEmpty |
182 | // purpose : |
183 | // ======================================================================= |
184 | Standard_Boolean Graphic3d_Group::IsEmpty() const |
185 | { |
186 | if (IsDeleted()) |
187 | { |
188 | return Standard_True; |
189 | } |
190 | |
191 | const Standard_ShortReal RL = ShortRealLast(); |
192 | const Standard_ShortReal RF = ShortRealFirst(); |
193 | const Standard_Boolean isEmpty = ((myBounds.XMin == RL) && (myBounds.YMin == RL) |
194 | && (myBounds.ZMin == RL) && (myBounds.XMax == RF) |
195 | && (myBounds.YMax == RF) && (myBounds.ZMax == RF)); |
196 | if (isEmpty != MyIsEmpty) |
197 | { |
198 | ::Message::DefaultMessenger()->Send ("Graphic3d_Group: MyIsEmpty != IsEmpty()", Message_Trace); |
199 | } |
200 | return isEmpty; |
201 | } |
202 | |
203 | // ======================================================================= |
204 | // function : SetMinMaxValues |
205 | // purpose : |
206 | // ======================================================================= |
207 | void Graphic3d_Group::SetMinMaxValues (const Standard_Real theXMin, const Standard_Real theYMin, const Standard_Real theZMin, |
208 | const Standard_Real theXMax, const Standard_Real theYMax, const Standard_Real theZMax) |
209 | { |
210 | myBounds.XMin = Standard_ShortReal (theXMin); |
211 | myBounds.YMin = Standard_ShortReal (theYMin); |
212 | myBounds.ZMin = Standard_ShortReal (theZMin); |
213 | myBounds.XMax = Standard_ShortReal (theXMax); |
214 | myBounds.YMax = Standard_ShortReal (theYMax); |
215 | myBounds.ZMax = Standard_ShortReal (theZMax); |
216 | } |
217 | |
218 | // ======================================================================= |
219 | // function : MinMaxValues |
220 | // purpose : |
221 | // ======================================================================= |
222 | void Graphic3d_Group::MinMaxValues (Standard_Real& theXMin, Standard_Real& theYMin, Standard_Real& theZMin, |
223 | Standard_Real& theXMax, Standard_Real& theYMax, Standard_Real& theZMax) const |
224 | { |
225 | MinMaxCoord (theXMin, theYMin, theZMin, |
226 | theXMax, theYMax, theZMax); |
227 | } |
228 | |
229 | // ======================================================================= |
230 | // function : Structure |
231 | // purpose : |
232 | // ======================================================================= |
233 | Handle(Graphic3d_Structure) Graphic3d_Group::Structure() const |
234 | { |
235 | return myStructure; |
236 | } |
237 | |
238 | // ======================================================================= |
239 | // function : MinMaxCoord |
240 | // purpose : |
241 | // ======================================================================= |
242 | void Graphic3d_Group::MinMaxCoord (Standard_Real& theXMin, Standard_Real& theYMin, Standard_Real& theZMin, |
243 | Standard_Real& theXMax, Standard_Real& theYMax, Standard_Real& theZMax) const |
244 | { |
245 | if (IsEmpty()) |
246 | { |
247 | // Empty Group |
248 | theXMin = theYMin = theZMin = ShortRealFirst(); |
249 | theXMax = theYMax = theZMax = ShortRealLast(); |
250 | } |
251 | else |
252 | { |
253 | theXMin = Standard_Real (myBounds.XMin); |
254 | theYMin = Standard_Real (myBounds.YMin); |
255 | theZMin = Standard_Real (myBounds.ZMin); |
256 | theXMax = Standard_Real (myBounds.XMax); |
257 | theYMax = Standard_Real (myBounds.YMax); |
258 | theZMax = Standard_Real (myBounds.ZMax); |
259 | } |
260 | } |
261 | |
262 | // ======================================================================= |
263 | // function : Update |
264 | // purpose : |
265 | // ======================================================================= |
266 | void Graphic3d_Group::Update() const |
267 | { |
268 | if (IsDeleted()) |
269 | { |
270 | return; |
271 | } |
272 | |
273 | if (myStructure->StructureManager()->UpdateMode() == Aspect_TOU_ASAP) |
274 | { |
275 | myStructure->StructureManager()->Update(); |
276 | } |
277 | } |
278 | |
279 | // ======================================================================= |
280 | // function : SetGroupPrimitivesAspect |
281 | // purpose : |
282 | // ======================================================================= |
283 | void Graphic3d_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine) |
284 | { |
285 | if (IsDeleted()) |
286 | { |
287 | return; |
288 | } |
289 | |
290 | Standard_Real aWidth; |
291 | Quantity_Color aColor; |
292 | Aspect_TypeOfLine aLType; |
293 | theAspLine->Values (aColor, aLType, aWidth); |
294 | |
295 | ContextLine.IsDef = 1; |
296 | ContextLine.Color.r = float (aColor.Red()); |
297 | ContextLine.Color.g = float (aColor.Green()); |
298 | ContextLine.Color.b = float (aColor.Blue()); |
299 | ContextLine.LineType = aLType; |
300 | ContextLine.Width = float (aWidth); |
301 | ContextLine.ShaderProgram = theAspLine->ShaderProgram(); |
7fd59977 |
302 | |
b64d84be |
303 | UpdateAspectLine (Standard_True); |
7fd59977 |
304 | |
b64d84be |
305 | ContextLine.IsSet = 1; |
7fd59977 |
306 | |
b64d84be |
307 | Update(); |
308 | } |
309 | |
310 | // ======================================================================= |
311 | // function : SetGroupPrimitivesAspect |
312 | // purpose : |
313 | // ======================================================================= |
314 | void Graphic3d_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspFill) |
315 | { |
316 | if (IsDeleted()) |
317 | { |
318 | return; |
319 | } |
320 | |
321 | Standard_Real anRGB[3]; |
322 | Standard_Real aWidth; |
323 | Quantity_Color anIntColor; |
324 | Quantity_Color aBackIntColor; |
325 | Quantity_Color anEdgeColor; |
326 | Aspect_TypeOfLine aLType; |
327 | Aspect_InteriorStyle aStyle; |
328 | theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth); |
329 | |
330 | anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB); |
331 | ContextFillArea.Style = aStyle; |
332 | ContextFillArea.IntColor.r = float (anRGB[0]); |
333 | ContextFillArea.IntColor.g = float (anRGB[1]); |
334 | ContextFillArea.IntColor.b = float (anRGB[2]); |
335 | |
336 | if (theAspFill->Distinguish()) |
337 | { |
338 | aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB); |
339 | } |
340 | ContextFillArea.BackIntColor.r = float (anRGB[0]); |
341 | ContextFillArea.BackIntColor.g = float (anRGB[1]); |
342 | ContextFillArea.BackIntColor.b = float (anRGB[2]); |
343 | |
344 | // Edges |
345 | ContextFillArea.Edge = theAspFill->Edge() ? 1 : 0; |
346 | ContextFillArea.EdgeColor.r = float (anEdgeColor.Red()); |
347 | ContextFillArea.EdgeColor.g = float (anEdgeColor.Green()); |
348 | ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue()); |
349 | ContextFillArea.LineType = aLType; |
350 | ContextFillArea.Width = float (aWidth); |
351 | ContextFillArea.Hatch = theAspFill->HatchStyle(); |
352 | |
353 | // Front and Back face |
354 | ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0; |
355 | ContextFillArea.BackFace = theAspFill->BackFace() ? 1 : 0; |
356 | |
357 | // Back Material |
358 | const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial(); |
359 | |
360 | // Light specificity |
361 | ContextFillArea.Back.Shininess = float (aBack.Shininess()); |
362 | ContextFillArea.Back.Ambient = float (aBack.Ambient()); |
363 | ContextFillArea.Back.Diffuse = float (aBack.Diffuse()); |
364 | ContextFillArea.Back.Specular = float (aBack.Specular()); |
365 | ContextFillArea.Back.Transparency = float (aBack.Transparency()); |
366 | ContextFillArea.Back.Emission = float (aBack.Emissive()); |
dc9ef964 |
367 | ContextFillArea.Back.RefractionIndex = float (aBack.RefractionIndex()); |
b64d84be |
368 | |
369 | // Reflection mode |
370 | ContextFillArea.Back.IsAmbient = aBack.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0; |
371 | ContextFillArea.Back.IsDiffuse = aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0; |
372 | ContextFillArea.Back.IsSpecular = aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0; |
373 | ContextFillArea.Back.IsEmission = aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0; |
374 | |
375 | // Material type |
376 | ContextFillArea.Back.IsPhysic = aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0; |
377 | |
378 | // Specular color |
379 | ContextFillArea.Back.ColorSpec.r = float (aBack.SpecularColor().Red()); |
380 | ContextFillArea.Back.ColorSpec.g = float (aBack.SpecularColor().Green()); |
381 | ContextFillArea.Back.ColorSpec.b = float (aBack.SpecularColor().Blue()); |
382 | |
383 | // Ambient color |
384 | ContextFillArea.Back.ColorAmb.r = float (aBack.AmbientColor().Red()); |
385 | ContextFillArea.Back.ColorAmb.g = float (aBack.AmbientColor().Green()); |
386 | ContextFillArea.Back.ColorAmb.b = float (aBack.AmbientColor().Blue()); |
387 | |
388 | // Diffuse color |
389 | ContextFillArea.Back.ColorDif.r = float (aBack.DiffuseColor().Red()); |
390 | ContextFillArea.Back.ColorDif.g = float (aBack.DiffuseColor().Green()); |
391 | ContextFillArea.Back.ColorDif.b = float (aBack.DiffuseColor().Blue()); |
392 | |
393 | // Emissive color |
394 | ContextFillArea.Back.ColorEms.r = float (aBack.EmissiveColor().Red()); |
395 | ContextFillArea.Back.ColorEms.g = float (aBack.EmissiveColor().Green()); |
396 | ContextFillArea.Back.ColorEms.b = float (aBack.EmissiveColor().Blue()); |
397 | |
398 | ContextFillArea.Back.EnvReflexion = float (aBack.EnvReflexion()); |
399 | |
400 | // Front Material |
401 | const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial(); |
402 | // Light specificity |
403 | ContextFillArea.Front.Shininess = float (aFront.Shininess()); |
404 | ContextFillArea.Front.Ambient = float (aFront.Ambient()); |
405 | ContextFillArea.Front.Diffuse = float (aFront.Diffuse()); |
406 | ContextFillArea.Front.Specular = float (aFront.Specular()); |
407 | ContextFillArea.Front.Transparency = float (aFront.Transparency()); |
408 | ContextFillArea.Front.Emission = float (aFront.Emissive()); |
dc9ef964 |
409 | ContextFillArea.Front.RefractionIndex = float (aFront.RefractionIndex()); |
b64d84be |
410 | |
411 | // Reflection mode |
412 | ContextFillArea.Front.IsAmbient = aFront.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0; |
413 | ContextFillArea.Front.IsDiffuse = aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0; |
414 | ContextFillArea.Front.IsSpecular = aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0; |
415 | ContextFillArea.Front.IsEmission = aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0; |
416 | |
417 | // Material type |
418 | ContextFillArea.Front.IsPhysic = aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0; |
419 | |
420 | // Specular color |
421 | ContextFillArea.Front.ColorSpec.r = float (aFront.SpecularColor().Red()); |
422 | ContextFillArea.Front.ColorSpec.g = float (aFront.SpecularColor().Green()); |
423 | ContextFillArea.Front.ColorSpec.b = float (aFront.SpecularColor().Blue()); |
424 | |
425 | // Ambient color |
426 | ContextFillArea.Front.ColorAmb.r = float (aFront.AmbientColor().Red()); |
427 | ContextFillArea.Front.ColorAmb.g = float (aFront.AmbientColor().Green()); |
428 | ContextFillArea.Front.ColorAmb.b = float (aFront.AmbientColor().Blue()); |
429 | |
430 | // Diffuse color |
431 | ContextFillArea.Front.ColorDif.r = float (aFront.DiffuseColor().Red()); |
432 | ContextFillArea.Front.ColorDif.g = float (aFront.DiffuseColor().Green()); |
433 | ContextFillArea.Front.ColorDif.b = float (aFront.DiffuseColor().Blue()); |
434 | |
435 | // Emissive color |
436 | ContextFillArea.Front.ColorEms.r = float (aFront.EmissiveColor().Red()); |
437 | ContextFillArea.Front.ColorEms.g = float (aFront.EmissiveColor().Green()); |
438 | ContextFillArea.Front.ColorEms.b = float (aFront.EmissiveColor().Blue()); |
439 | |
440 | ContextFillArea.Front.EnvReflexion = float (aFront.EnvReflexion()); |
441 | |
442 | ContextFillArea.IsDef = 1; // Definition material ok |
443 | |
444 | // Texture map |
445 | ContextFillArea.Texture.TextureMap = theAspFill->TextureMap(); |
446 | ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0; |
447 | |
448 | Standard_Integer aPolyMode; |
449 | Standard_ShortReal aPolyFactor, aPolyUnits; |
450 | theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits); |
451 | ContextFillArea.PolygonOffsetMode = aPolyMode; |
452 | ContextFillArea.PolygonOffsetFactor = aPolyFactor; |
453 | ContextFillArea.PolygonOffsetUnits = aPolyUnits; |
454 | |
455 | ContextFillArea.ShaderProgram = theAspFill->ShaderProgram(); |
456 | |
457 | UpdateAspectFace (Standard_True); |
458 | |
459 | ContextFillArea.IsSet = 1; |
460 | |
461 | Update(); |
462 | } |
463 | |
464 | // ======================================================================= |
465 | // function : SetGroupPrimitivesAspect |
466 | // purpose : |
467 | // ======================================================================= |
468 | void Graphic3d_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspMarker) |
469 | { |
470 | if (IsDeleted()) |
471 | { |
472 | return; |
473 | } |
474 | |
475 | Standard_Real aScale; |
476 | Quantity_Color aColor; |
477 | Aspect_TypeOfMarker aMarkerType; |
478 | theAspMarker->Values (aColor, aMarkerType, aScale); |
479 | |
480 | ContextMarker.IsDef = 1; |
481 | ContextMarker.Color.r = Standard_ShortReal (aColor.Red()); |
482 | ContextMarker.Color.g = Standard_ShortReal (aColor.Green()); |
483 | ContextMarker.Color.b = Standard_ShortReal (aColor.Blue()); |
484 | ContextMarker.MarkerType = aMarkerType; |
485 | ContextMarker.Scale = Standard_ShortReal (aScale); |
486 | ContextMarker.MarkerImage = theAspMarker->GetMarkerImage(); |
487 | ContextMarker.ShaderProgram = theAspMarker->ShaderProgram(); |
488 | |
489 | UpdateAspectMarker (Standard_True); |
490 | |
491 | ContextMarker.IsSet = 1; |
492 | |
493 | Update(); |
494 | } |
495 | |
496 | // ======================================================================= |
497 | // function : SetGroupPrimitivesAspect |
498 | // purpose : |
499 | // ======================================================================= |
500 | void Graphic3d_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspText) |
501 | { |
502 | if (IsDeleted()) |
503 | { |
504 | return; |
505 | } |
506 | |
507 | Standard_Real anExpansion, aSpace, aTextAngle; |
508 | Quantity_Color aColor, aColorSubTitle; |
509 | Standard_CString aFont; |
510 | Aspect_TypeOfStyleText aStyle; |
511 | Aspect_TypeOfDisplayText aDisplayType; |
512 | Standard_Boolean isTextZoomable; |
513 | Font_FontAspect aTextFontAspect; |
514 | theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyle, aDisplayType, |
515 | aColorSubTitle, isTextZoomable, aTextAngle, aTextFontAspect); |
516 | |
517 | ContextText.IsDef = 1; |
518 | ContextText.Color.r = float (aColor.Red()); |
519 | ContextText.Color.g = float (aColor.Green()); |
520 | ContextText.Color.b = float (aColor.Blue()); |
521 | ContextText.Font = (char* )aFont; |
522 | ContextText.Expan = float (anExpansion); |
523 | ContextText.Space = float (aSpace); |
524 | ContextText.Style = aStyle; |
525 | ContextText.DisplayType = aDisplayType; |
526 | ContextText.ColorSubTitle.r = float (aColorSubTitle.Red()); |
527 | ContextText.ColorSubTitle.g = float (aColorSubTitle.Green()); |
528 | ContextText.ColorSubTitle.b = float (aColorSubTitle.Blue()); |
529 | ContextText.TextZoomable = isTextZoomable; |
530 | ContextText.TextAngle = float (aTextAngle); |
531 | ContextText.TextFontAspect = aTextFontAspect; |
532 | ContextText.ShaderProgram = theAspText->ShaderProgram(); |
533 | |
534 | UpdateAspectText (Standard_True); |
535 | |
536 | ContextText.IsSet = 1; |
537 | |
538 | Update(); |
539 | } |
540 | |
541 | // ======================================================================= |
542 | // function : SetPrimitivesAspect |
543 | // purpose : |
544 | // ======================================================================= |
545 | void Graphic3d_Group::SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine) |
546 | { |
547 | if (IsDeleted()) |
548 | { |
549 | return; |
550 | } |
7fd59977 |
551 | |
b64d84be |
552 | Standard_Real aWidth; |
553 | Quantity_Color aColor; |
554 | Aspect_TypeOfLine aLType; |
555 | theAspLine->Values (aColor, aLType, aWidth); |
7fd59977 |
556 | |
b64d84be |
557 | ContextLine.IsDef = 1; |
558 | ContextLine.Color.r = float (aColor.Red()); |
559 | ContextLine.Color.g = float (aColor.Green()); |
560 | ContextLine.Color.b = float (aColor.Blue()); |
561 | ContextLine.LineType = aLType; |
562 | ContextLine.Width = float (aWidth); |
563 | ContextLine.ShaderProgram = theAspLine->ShaderProgram(); |
7fd59977 |
564 | |
b64d84be |
565 | UpdateAspectLine (Standard_False); |
7fd59977 |
566 | |
b64d84be |
567 | ContextLine.IsSet = 1; |
7fd59977 |
568 | |
b64d84be |
569 | Update(); |
570 | } |
571 | |
572 | // ======================================================================= |
573 | // function : SetPrimitivesAspect |
574 | // purpose : |
575 | // ======================================================================= |
576 | void Graphic3d_Group::SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspFill) |
577 | { |
578 | if (IsDeleted()) |
579 | { |
580 | return; |
581 | } |
582 | |
583 | Standard_Real anRGB[3]; |
584 | Standard_Real aWidth; |
585 | Quantity_Color anIntColor; |
586 | Quantity_Color aBackIntColor; |
587 | Quantity_Color anEdgeColor; |
588 | Aspect_TypeOfLine aLType; |
589 | Aspect_InteriorStyle aStyle; |
590 | theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth); |
591 | |
592 | anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB); |
593 | ContextFillArea.Style = aStyle; |
594 | ContextFillArea.IntColor.r = float (anRGB[0]); |
595 | ContextFillArea.IntColor.g = float (anRGB[1]); |
596 | ContextFillArea.IntColor.b = float (anRGB[2]); |
597 | |
598 | if (theAspFill->Distinguish()) |
599 | { |
600 | aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB); |
601 | } |
602 | ContextFillArea.BackIntColor.r = float(anRGB[0]); |
603 | ContextFillArea.BackIntColor.g = float(anRGB[1]); |
604 | ContextFillArea.BackIntColor.b = float(anRGB[2]); |
605 | |
606 | // Edges |
607 | ContextFillArea.Edge = theAspFill->Edge() ? 1 : 0; |
608 | ContextFillArea.EdgeColor.r = float (anEdgeColor.Red()); |
609 | ContextFillArea.EdgeColor.g = float (anEdgeColor.Green()); |
610 | ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue()); |
611 | ContextFillArea.LineType = aLType; |
612 | ContextFillArea.Width = float (aWidth); |
613 | ContextFillArea.Hatch = theAspFill->HatchStyle(); |
614 | |
615 | // Front and Back face |
616 | ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0; |
617 | ContextFillArea.BackFace = theAspFill->BackFace() ? 1 : 0; |
618 | |
619 | // Back Material |
620 | const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial(); |
621 | // Material state |
622 | ContextFillArea.Back.Shininess = float (aBack.Shininess()); |
623 | ContextFillArea.Back.Ambient = float (aBack.Ambient()); |
624 | ContextFillArea.Back.Diffuse = float (aBack.Diffuse()); |
625 | ContextFillArea.Back.Specular = float (aBack.Specular()); |
626 | ContextFillArea.Back.Transparency = float (aBack.Transparency()); |
627 | ContextFillArea.Back.Emission = float (aBack.Emissive()); |
628 | |
629 | // Reflection mode |
630 | ContextFillArea.Back.IsAmbient = aBack.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0; |
631 | ContextFillArea.Back.IsDiffuse = aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0; |
632 | ContextFillArea.Back.IsSpecular = aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0; |
633 | ContextFillArea.Back.IsEmission = aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0; |
634 | |
635 | // Material type |
636 | ContextFillArea.Back.IsPhysic = aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0; |
637 | |
638 | // Specular color |
639 | ContextFillArea.Back.ColorSpec.r = float (aBack.SpecularColor().Red()); |
640 | ContextFillArea.Back.ColorSpec.g = float (aBack.SpecularColor().Green()); |
641 | ContextFillArea.Back.ColorSpec.b = float (aBack.SpecularColor().Blue()); |
642 | |
643 | // Ambient color |
644 | ContextFillArea.Back.ColorAmb.r = float (aBack.AmbientColor().Red()); |
645 | ContextFillArea.Back.ColorAmb.g = float (aBack.AmbientColor().Green()); |
646 | ContextFillArea.Back.ColorAmb.b = float (aBack.AmbientColor().Blue()); |
647 | |
648 | // Diffuse color |
649 | ContextFillArea.Back.ColorDif.r = float (aBack.DiffuseColor().Red()); |
650 | ContextFillArea.Back.ColorDif.g = float (aBack.DiffuseColor().Green()); |
651 | ContextFillArea.Back.ColorDif.b = float (aBack.DiffuseColor().Blue()); |
652 | |
653 | // Emissive color |
654 | ContextFillArea.Back.ColorEms.r = float (aBack.EmissiveColor().Red()); |
655 | ContextFillArea.Back.ColorEms.g = float (aBack.EmissiveColor().Green()); |
656 | ContextFillArea.Back.ColorEms.b = float (aBack.EmissiveColor().Blue()); |
657 | |
658 | ContextFillArea.Back.EnvReflexion = float (aBack.EnvReflexion()); |
659 | |
660 | // Front Material |
661 | const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial(); |
662 | // Light specificity |
663 | ContextFillArea.Front.Shininess = float (aFront.Shininess()); |
664 | ContextFillArea.Front.Ambient = float (aFront.Ambient()); |
665 | ContextFillArea.Front.Diffuse = float (aFront.Diffuse()); |
666 | ContextFillArea.Front.Specular = float (aFront.Specular()); |
667 | ContextFillArea.Front.Transparency = float (aFront.Transparency()); |
668 | ContextFillArea.Front.Emission = float (aFront.Emissive()); |
669 | |
670 | // Reflection mode |
671 | ContextFillArea.Front.IsAmbient = aFront.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0; |
672 | ContextFillArea.Front.IsDiffuse = aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0; |
673 | ContextFillArea.Front.IsSpecular = aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0; |
674 | ContextFillArea.Front.IsEmission = aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0; |
675 | |
676 | // Material type |
677 | ContextFillArea.Front.IsPhysic = aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0; |
678 | |
679 | // Specular color |
680 | ContextFillArea.Front.ColorSpec.r = float (aFront.SpecularColor().Red()); |
681 | ContextFillArea.Front.ColorSpec.g = float (aFront.SpecularColor().Green()); |
682 | ContextFillArea.Front.ColorSpec.b = float (aFront.SpecularColor().Blue()); |
683 | |
684 | // Ambient color |
685 | ContextFillArea.Front.ColorAmb.r = float (aFront.AmbientColor().Red()); |
686 | ContextFillArea.Front.ColorAmb.g = float (aFront.AmbientColor().Green()); |
687 | ContextFillArea.Front.ColorAmb.b = float (aFront.AmbientColor().Blue()); |
688 | |
689 | // Diffuse color |
690 | ContextFillArea.Front.ColorDif.r = float (aFront.DiffuseColor().Red()); |
691 | ContextFillArea.Front.ColorDif.g = float (aFront.DiffuseColor().Green()); |
692 | ContextFillArea.Front.ColorDif.b = float (aFront.DiffuseColor().Blue()); |
693 | |
694 | // Emissive color |
695 | ContextFillArea.Front.ColorEms.r = float (aFront.EmissiveColor().Red()); |
696 | ContextFillArea.Front.ColorEms.g = float (aFront.EmissiveColor().Green()); |
697 | ContextFillArea.Front.ColorEms.b = float (aFront.EmissiveColor().Blue()); |
698 | |
699 | ContextFillArea.Front.EnvReflexion = float (aFront.EnvReflexion()); |
700 | |
701 | ContextFillArea.IsDef = 1; // Material definition ok |
702 | |
703 | ContextFillArea.Texture.TextureMap = theAspFill->TextureMap(); |
704 | ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0; |
705 | |
706 | Standard_Integer aPolyMode; |
707 | Standard_ShortReal aPolyFactor, aPolyUnits; |
708 | theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits); |
709 | ContextFillArea.PolygonOffsetMode = aPolyMode; |
710 | ContextFillArea.PolygonOffsetFactor = aPolyFactor; |
711 | ContextFillArea.PolygonOffsetUnits = aPolyUnits; |
712 | |
713 | ContextFillArea.ShaderProgram = theAspFill->ShaderProgram(); |
714 | |
715 | UpdateAspectFace (Standard_False); |
716 | |
717 | ContextFillArea.IsSet = 1; |
718 | |
719 | Update(); |
720 | } |
721 | |
722 | // ======================================================================= |
723 | // function : SetPrimitivesAspect |
724 | // purpose : |
725 | // ======================================================================= |
726 | void Graphic3d_Group::SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspMarker) |
727 | { |
728 | if (IsDeleted()) |
729 | { |
730 | return; |
731 | } |
732 | |
733 | Standard_Real aScale; |
734 | Quantity_Color aColor; |
735 | Aspect_TypeOfMarker aMarkerType; |
736 | theAspMarker->Values (aColor, aMarkerType, aScale); |
737 | |
738 | ContextMarker.IsDef = 1; |
739 | ContextMarker.Color.r = Standard_ShortReal (aColor.Red()); |
740 | ContextMarker.Color.g = Standard_ShortReal (aColor.Green()); |
741 | ContextMarker.Color.b = Standard_ShortReal (aColor.Blue()); |
742 | ContextMarker.MarkerType = aMarkerType; |
743 | ContextMarker.Scale = Standard_ShortReal (aScale); |
744 | ContextMarker.MarkerImage = theAspMarker->GetMarkerImage(); |
745 | |
746 | ContextMarker.ShaderProgram = theAspMarker->ShaderProgram(); |
747 | |
748 | UpdateAspectMarker (Standard_False); |
749 | |
750 | ContextMarker.IsSet = 1; |
751 | |
752 | Update(); |
753 | } |
754 | |
755 | // ======================================================================= |
756 | // function : SetPrimitivesAspect |
757 | // purpose : |
758 | // ======================================================================= |
759 | void Graphic3d_Group::SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspText) |
760 | { |
761 | if (IsDeleted()) |
762 | { |
763 | return; |
764 | } |
765 | |
766 | Standard_CString aFont; |
767 | Standard_Real aSpace, anExpansion, aTextAngle; |
768 | Quantity_Color aColor, aColorSubTitle; |
769 | Aspect_TypeOfStyleText aStyle; |
770 | Aspect_TypeOfDisplayText aDisplayType; |
771 | Standard_Boolean aTextZoomable; |
772 | Font_FontAspect aTextFontAspect; |
773 | theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyle, aDisplayType, |
774 | aColorSubTitle, aTextZoomable, aTextAngle, aTextFontAspect); |
775 | |
776 | ContextText.IsDef = 1; |
777 | ContextText.Color.r = float (aColor.Red()); |
778 | ContextText.Color.g = float (aColor.Green()); |
779 | ContextText.Color.b = float (aColor.Blue()); |
780 | ContextText.Font = (char* )aFont; |
781 | ContextText.Expan = float (anExpansion); |
782 | ContextText.Space = float (aSpace); |
783 | ContextText.Style = aStyle; |
784 | ContextText.DisplayType = aDisplayType; |
785 | ContextText.ColorSubTitle.r = float (aColorSubTitle.Red()); |
786 | ContextText.ColorSubTitle.g = float (aColorSubTitle.Green()); |
787 | ContextText.ColorSubTitle.b = float (aColorSubTitle.Blue()); |
788 | ContextText.TextZoomable = aTextZoomable; |
789 | ContextText.TextAngle = float (aTextAngle); |
790 | ContextText.TextFontAspect = aTextFontAspect; |
791 | ContextText.ShaderProgram = theAspText->ShaderProgram(); |
792 | |
793 | UpdateAspectText (Standard_False); |
794 | |
795 | ContextText.IsSet = 1; |
796 | |
797 | Update(); |
798 | } |
799 | |
800 | // ======================================================================= |
801 | // function : IsGroupPrimitivesAspectSet |
802 | // purpose : |
803 | // ======================================================================= |
804 | Standard_Boolean Graphic3d_Group::IsGroupPrimitivesAspectSet (const Graphic3d_GroupAspect theAspect) const |
805 | { |
806 | switch (theAspect) |
807 | { |
808 | case Graphic3d_ASPECT_LINE: return ContextLine.IsSet; |
809 | case Graphic3d_ASPECT_TEXT: return ContextText.IsSet; |
810 | case Graphic3d_ASPECT_MARKER: return ContextMarker.IsSet; |
811 | case Graphic3d_ASPECT_FILL_AREA: return ContextFillArea.IsSet; |
812 | default: return Standard_False; |
813 | } |
814 | } |
815 | |
816 | // ======================================================================= |
817 | // function : GroupPrimitivesAspect |
818 | // purpose : |
819 | // ======================================================================= |
820 | void Graphic3d_Group::GroupPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine, |
821 | const Handle(Graphic3d_AspectText3d)& theAspText, |
822 | const Handle(Graphic3d_AspectMarker3d)& theAspMarker, |
823 | const Handle(Graphic3d_AspectFillArea3d)& theAspFill) const |
824 | { |
825 | Quantity_Color aColor; |
826 | Graphic3d_MaterialAspect aFront, aBack; |
827 | |
828 | const CALL_DEF_CONTEXTLINE& anAspLine = ContextLine.IsSet ? ContextLine : myStructure->CStructure()->ContextLine; |
829 | aColor.SetValues (Standard_Real (anAspLine.Color.r), |
830 | Standard_Real (anAspLine.Color.g), |
831 | Standard_Real (anAspLine.Color.b), Quantity_TOC_RGB); |
832 | theAspLine->SetColor (aColor); |
833 | theAspLine->SetType (Aspect_TypeOfLine (anAspLine.LineType)); |
834 | theAspLine->SetWidth (Standard_Real (anAspLine.Width)); |
835 | theAspLine->SetShaderProgram (anAspLine.ShaderProgram); |
836 | |
837 | const CALL_DEF_CONTEXTTEXT& anAspText = ContextText.IsSet ? ContextText : myStructure->CStructure()->ContextText; |
838 | aColor.SetValues (Standard_Real (anAspText.Color.r), |
839 | Standard_Real (anAspText.Color.g), |
840 | Standard_Real (anAspText.Color.b), Quantity_TOC_RGB); |
841 | theAspText->SetColor (aColor); |
842 | aColor.SetValues (Standard_Real (anAspText.ColorSubTitle.r), |
843 | Standard_Real (anAspText.ColorSubTitle.g), |
844 | Standard_Real (anAspText.ColorSubTitle.b), Quantity_TOC_RGB); |
845 | theAspText->SetColorSubTitle (aColor); |
846 | theAspText->SetFont (anAspText.Font); |
847 | theAspText->SetSpace (Standard_Real (anAspText.Space)); |
848 | theAspText->SetExpansionFactor (Standard_Real (anAspText.Expan)); |
849 | theAspText->SetStyle (Aspect_TypeOfStyleText (anAspText.Style)); |
850 | theAspText->SetDisplayType (Aspect_TypeOfDisplayText (anAspText.DisplayType)); |
851 | theAspText->SetShaderProgram (anAspText.ShaderProgram); |
852 | |
853 | const CALL_DEF_CONTEXTMARKER& anAspMarker = ContextMarker.IsSet ? ContextMarker : myStructure->CStructure()->ContextMarker; |
854 | aColor.SetValues (Standard_Real (anAspMarker.Color.r), |
855 | Standard_Real (anAspMarker.Color.g), |
856 | Standard_Real (anAspMarker.Color.b), Quantity_TOC_RGB); |
857 | theAspMarker->SetColor (aColor); |
858 | theAspMarker->SetType (anAspMarker.MarkerType); |
859 | theAspMarker->SetScale (Standard_Real (anAspMarker.Scale)); |
860 | theAspMarker->SetShaderProgram (anAspMarker.ShaderProgram); |
861 | if (anAspMarker.MarkerType == Aspect_TOM_USERDEFINED) |
862 | { |
863 | theAspMarker->SetMarkerImage (ContextMarker.MarkerImage); |
864 | } |
865 | |
866 | const CALL_DEF_CONTEXTFILLAREA& anAspFill = ContextFillArea.IsSet ? ContextFillArea : myStructure->CStructure()->ContextFillArea; |
867 | // Interior |
868 | theAspFill->SetInteriorStyle (Aspect_InteriorStyle (anAspFill.Style)); |
869 | aColor.SetValues (Standard_Real (anAspFill.IntColor.r), |
870 | Standard_Real (anAspFill.IntColor.g), |
871 | Standard_Real (anAspFill.IntColor.b), Quantity_TOC_RGB); |
872 | theAspFill->SetInteriorColor (aColor); |
873 | |
874 | // Edges |
875 | aColor.SetValues (Standard_Real (anAspFill.EdgeColor.r), |
876 | Standard_Real (anAspFill.EdgeColor.g), |
877 | Standard_Real (anAspFill.EdgeColor.b), Quantity_TOC_RGB); |
878 | theAspFill->SetEdgeColor (aColor); |
879 | theAspFill->SetEdgeLineType (Aspect_TypeOfLine (anAspFill.LineType)); |
880 | theAspFill->SetEdgeWidth (Standard_Real (anAspFill.Width)); |
881 | |
882 | // Back Material |
883 | aBack.SetShininess (Standard_Real (anAspFill.Back.Shininess)); |
884 | aBack.SetAmbient (Standard_Real (anAspFill.Back.Ambient)); |
885 | aBack.SetDiffuse (Standard_Real (anAspFill.Back.Diffuse)); |
886 | aBack.SetSpecular (Standard_Real (anAspFill.Back.Specular)); |
887 | aBack.SetTransparency (Standard_Real (anAspFill.Back.Transparency)); |
888 | aBack.SetEmissive (Standard_Real (anAspFill.Back.Emission)); |
889 | anAspFill.Back.IsAmbient == 1 ? aBack.SetReflectionModeOn (Graphic3d_TOR_AMBIENT) : aBack.SetReflectionModeOff (Graphic3d_TOR_AMBIENT); |
890 | anAspFill.Back.IsDiffuse == 1 ? aBack.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE) : aBack.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE); |
891 | anAspFill.Back.IsSpecular == 1 ? aBack.SetReflectionModeOn (Graphic3d_TOR_SPECULAR) : aBack.SetReflectionModeOff (Graphic3d_TOR_SPECULAR); |
892 | anAspFill.Back.IsEmission == 1 ? aBack.SetReflectionModeOn (Graphic3d_TOR_EMISSION) : aBack.SetReflectionModeOff (Graphic3d_TOR_EMISSION); |
893 | |
894 | aColor.SetValues (Standard_Real (anAspFill.Back.ColorSpec.r), |
895 | Standard_Real (anAspFill.Back.ColorSpec.g), |
896 | Standard_Real (anAspFill.Back.ColorSpec.b), Quantity_TOC_RGB); |
897 | aBack.SetSpecularColor (aColor); |
898 | |
899 | aColor.SetValues (Standard_Real (anAspFill.Back.ColorAmb.r), |
900 | Standard_Real (anAspFill.Back.ColorAmb.g), |
901 | Standard_Real (anAspFill.Back.ColorAmb.b), Quantity_TOC_RGB); |
902 | aBack.SetAmbientColor (aColor); |
903 | |
904 | aColor.SetValues (Standard_Real (anAspFill.Back.ColorDif.r), |
905 | Standard_Real (anAspFill.Back.ColorDif.g), |
906 | Standard_Real (anAspFill.Back.ColorDif.b), Quantity_TOC_RGB); |
907 | aBack.SetDiffuseColor (aColor); |
908 | |
909 | aColor.SetValues (Standard_Real (anAspFill.Back.ColorEms.r), |
910 | Standard_Real (anAspFill.Back.ColorEms.g), |
911 | Standard_Real (anAspFill.Back.ColorEms.b), Quantity_TOC_RGB); |
912 | aBack.SetEmissiveColor (aColor); |
913 | |
914 | aBack.SetEnvReflexion (anAspFill.Back.EnvReflexion); |
915 | |
916 | // Front Material |
917 | aFront.SetShininess (Standard_Real (anAspFill.Front.Shininess)); |
918 | aFront.SetAmbient (Standard_Real (anAspFill.Front.Ambient)); |
919 | aFront.SetDiffuse (Standard_Real (anAspFill.Front.Diffuse)); |
920 | aFront.SetSpecular (Standard_Real (anAspFill.Front.Specular)); |
921 | aFront.SetTransparency (Standard_Real (anAspFill.Front.Transparency)); |
922 | aFront.SetEmissive (Standard_Real (anAspFill.Back.Emission)); |
923 | anAspFill.Front.IsAmbient == 1 ? aFront.SetReflectionModeOn (Graphic3d_TOR_AMBIENT) : aFront.SetReflectionModeOff (Graphic3d_TOR_AMBIENT); |
924 | anAspFill.Front.IsDiffuse == 1 ? aFront.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE) : aFront.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE); |
925 | anAspFill.Front.IsSpecular == 1 ? aFront.SetReflectionModeOn (Graphic3d_TOR_SPECULAR) : aFront.SetReflectionModeOff (Graphic3d_TOR_SPECULAR); |
926 | anAspFill.Front.IsEmission == 1 ? aFront.SetReflectionModeOn (Graphic3d_TOR_EMISSION) : aFront.SetReflectionModeOff (Graphic3d_TOR_EMISSION); |
927 | |
928 | aColor.SetValues (Standard_Real (anAspFill.Front.ColorSpec.r), |
929 | Standard_Real (anAspFill.Front.ColorSpec.g), |
930 | Standard_Real (anAspFill.Front.ColorSpec.b), Quantity_TOC_RGB); |
931 | aFront.SetSpecularColor (aColor); |
932 | |
933 | aColor.SetValues (Standard_Real (anAspFill.Front.ColorAmb.r), |
934 | Standard_Real (anAspFill.Front.ColorAmb.g), |
935 | Standard_Real (anAspFill.Front.ColorAmb.b), Quantity_TOC_RGB); |
936 | aFront.SetAmbientColor (aColor); |
937 | |
938 | aColor.SetValues (Standard_Real (anAspFill.Front.ColorDif.r), |
939 | Standard_Real (anAspFill.Front.ColorDif.g), |
940 | Standard_Real (anAspFill.Front.ColorDif.b), Quantity_TOC_RGB); |
941 | aFront.SetDiffuseColor (aColor); |
942 | |
943 | aColor.SetValues (Standard_Real (anAspFill.Front.ColorEms.r), |
944 | Standard_Real (anAspFill.Front.ColorEms.g), |
945 | Standard_Real (anAspFill.Front.ColorEms.b), Quantity_TOC_RGB); |
946 | aFront.SetEmissiveColor (aColor); |
947 | |
948 | aFront.SetEnvReflexion (anAspFill.Front.EnvReflexion); |
949 | |
950 | // Edges |
951 | anAspFill.Edge == 1 ? theAspFill->SetEdgeOn() : theAspFill->SetEdgeOff(); |
952 | // Hatch |
953 | theAspFill->SetHatchStyle (Aspect_HatchStyle (anAspFill.Hatch)); |
954 | // Materials |
955 | // Front and Back face |
956 | anAspFill.Distinguish == 1 ? theAspFill->SetDistinguishOn() : theAspFill->SetDistinguishOff(); |
957 | anAspFill.BackFace == 1 ? theAspFill->SuppressBackFace() : theAspFill->AllowBackFace(); |
958 | // Texture |
959 | theAspFill->SetTextureMap (anAspFill.Texture.TextureMap); |
960 | anAspFill.Texture.doTextureMap == 1 ? theAspFill->SetTextureMapOn() : theAspFill->SetTextureMapOff(); |
961 | theAspFill->SetShaderProgram (anAspFill.ShaderProgram); |
962 | theAspFill->SetPolygonOffsets (anAspFill.PolygonOffsetMode, |
963 | anAspFill.PolygonOffsetFactor, |
964 | anAspFill.PolygonOffsetUnits); |
965 | theAspFill->SetBackMaterial (aBack); |
966 | theAspFill->SetFrontMaterial (aFront); |
967 | } |
968 | |
969 | // ======================================================================= |
970 | // function : PrimitivesAspect |
971 | // purpose : |
972 | // ======================================================================= |
973 | void Graphic3d_Group::PrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine, |
974 | const Handle(Graphic3d_AspectText3d)& theAspText, |
975 | const Handle(Graphic3d_AspectMarker3d)& theAspMarker, |
976 | const Handle(Graphic3d_AspectFillArea3d)& theAspFill) const |
977 | { |
978 | GroupPrimitivesAspect (theAspLine, theAspText, theAspMarker, theAspFill); |
979 | } |
980 | |
981 | // ======================================================================= |
982 | // function : AddPrimitiveArray |
983 | // purpose : |
984 | // ======================================================================= |
985 | void Graphic3d_Group::AddPrimitiveArray (const Handle(Graphic3d_ArrayOfPrimitives)& thePrim, |
986 | const Standard_Boolean theToEvalMinMax) |
987 | { |
988 | if (IsDeleted() |
989 | || !thePrim->IsValid()) |
990 | { |
991 | return; |
992 | } |
993 | |
871fa103 |
994 | AddPrimitiveArray (thePrim->Type(), thePrim->Indices(), thePrim->Attributes(), thePrim->Bounds(), theToEvalMinMax); |
995 | } |
996 | |
997 | // ======================================================================= |
998 | // function : AddPrimitiveArray |
999 | // purpose : |
1000 | // ======================================================================= |
1001 | void Graphic3d_Group::AddPrimitiveArray (const Graphic3d_TypeOfPrimitiveArray theType, |
1002 | const Handle(Graphic3d_IndexBuffer)& , |
1003 | const Handle(Graphic3d_Buffer)& theAttribs, |
1004 | const Handle(Graphic3d_BoundBuffer)& , |
1005 | const Standard_Boolean theToEvalMinMax) |
1006 | { |
1007 | if (IsDeleted() |
1008 | || theAttribs.IsNull()) |
1009 | { |
1010 | return; |
1011 | } |
1012 | |
b64d84be |
1013 | if (!MyContainsFacet |
871fa103 |
1014 | && theType != Graphic3d_TOPA_POLYLINES |
1015 | && theType != Graphic3d_TOPA_SEGMENTS |
1016 | && theType != Graphic3d_TOPA_POINTS) |
b64d84be |
1017 | { |
1018 | myStructure->GroupsWithFacet (1); |
1019 | MyContainsFacet = Standard_True; |
1020 | } |
1021 | |
1022 | MyIsEmpty = Standard_False; |
b64d84be |
1023 | if (theToEvalMinMax) |
1024 | { |
871fa103 |
1025 | const Standard_Integer aNbVerts = theAttribs->NbElements; |
1026 | for (Standard_Integer anAttribIter = 0; anAttribIter < theAttribs->NbAttributes; ++anAttribIter) |
b64d84be |
1027 | { |
871fa103 |
1028 | const Graphic3d_Attribute& anAttrib = theAttribs->Attribute (anAttribIter); |
1029 | if (anAttrib.Id != Graphic3d_TOA_POS) |
1030 | { |
1031 | continue; |
1032 | } |
1033 | |
1034 | const size_t anOffset = theAttribs->AttributeOffset (anAttribIter); |
1035 | switch (anAttrib.DataType) |
1036 | { |
1037 | case Graphic3d_TOD_VEC2: |
1038 | { |
1039 | for (Standard_Integer aVertIter = 0; aVertIter < aNbVerts; ++aVertIter) |
1040 | { |
1041 | const Graphic3d_Vec2& aVert = *reinterpret_cast<const Graphic3d_Vec2* >(theAttribs->value (aVertIter) + anOffset); |
1042 | if (aVert.x() < myBounds.XMin) myBounds.XMin = aVert.x(); |
1043 | if (aVert.y() < myBounds.YMin) myBounds.YMin = aVert.y(); |
1044 | if (aVert.x() > myBounds.XMax) myBounds.XMax = aVert.x(); |
1045 | if (aVert.y() > myBounds.YMax) myBounds.YMax = aVert.y(); |
1046 | } |
1047 | break; |
1048 | } |
1049 | case Graphic3d_TOD_VEC3: |
1050 | case Graphic3d_TOD_VEC4: |
1051 | { |
1052 | for (Standard_Integer aVertIter = 0; aVertIter < aNbVerts; ++aVertIter) |
1053 | { |
1054 | const Graphic3d_Vec3& aVert = *reinterpret_cast<const Graphic3d_Vec3* >(theAttribs->value (aVertIter) + anOffset); |
1055 | if (aVert.x() < myBounds.XMin) myBounds.XMin = aVert.x(); |
1056 | if (aVert.y() < myBounds.YMin) myBounds.YMin = aVert.y(); |
1057 | if (aVert.z() < myBounds.ZMin) myBounds.ZMin = aVert.z(); |
1058 | if (aVert.x() > myBounds.XMax) myBounds.XMax = aVert.x(); |
1059 | if (aVert.y() > myBounds.YMax) myBounds.YMax = aVert.y(); |
1060 | if (aVert.z() > myBounds.ZMax) myBounds.ZMax = aVert.z(); |
1061 | } |
1062 | break; |
1063 | } |
1064 | default: break; |
1065 | } |
1066 | break; |
b64d84be |
1067 | } |
1068 | } |
1069 | |
1070 | Update(); |
1071 | } |
1072 | |
1073 | // ======================================================================= |
1074 | // function : Marker |
1075 | // purpose : |
1076 | // ======================================================================= |
1077 | void Graphic3d_Group::Marker (const Graphic3d_Vertex& thePoint, |
1078 | const Standard_Boolean theToEvalMinMax) |
1079 | { |
1080 | Handle(Graphic3d_ArrayOfPoints) aPoints = new Graphic3d_ArrayOfPoints (1); |
1081 | aPoints->AddVertex (thePoint.X(), thePoint.Y(), thePoint.Z()); |
1082 | AddPrimitiveArray (aPoints, theToEvalMinMax); |
1083 | } |
1084 | |
1085 | // ======================================================================= |
1086 | // function : UserDraw |
1087 | // purpose : |
1088 | // ======================================================================= |
1089 | void Graphic3d_Group::UserDraw (const Standard_Address /*theObject*/, |
1090 | const Standard_Boolean /*theToEvalMinMax*/, |
1091 | const Standard_Boolean theContainsFacet) |
1092 | { |
1093 | if (IsDeleted()) |
1094 | { |
1095 | return; |
1096 | } |
1097 | |
1098 | // Without this modification, the group assumes the primitive contains |
1099 | // no polygons and does not require the Z-buffer for display. |
1100 | if (!MyContainsFacet && theContainsFacet) |
1101 | { |
1102 | myStructure->GroupsWithFacet (1); |
1103 | MyContainsFacet = Standard_True; |
1104 | } |
1105 | |
1106 | MyIsEmpty = Standard_False; |
1107 | Update(); |
1108 | } |
1109 | |
1110 | // ======================================================================= |
1111 | // function : Text |
1112 | // purpose : |
1113 | // ======================================================================= |
1114 | void Graphic3d_Group::Text (const Standard_CString /*theText*/, |
1115 | const Graphic3d_Vertex& thePoint, |
1116 | const Standard_Real /*theHeight*/, |
1117 | const Quantity_PlaneAngle /*theAngle*/, |
1118 | const Graphic3d_TextPath /*theTp*/, |
1119 | const Graphic3d_HorizontalTextAlignment /*theHta*/, |
1120 | const Graphic3d_VerticalTextAlignment /*theVta*/, |
1121 | const Standard_Boolean theToEvalMinMax) |
1122 | { |
1123 | if (IsDeleted()) |
1124 | { |
1125 | return; |
1126 | } |
1127 | |
1128 | MyIsEmpty = Standard_False; |
1129 | if (theToEvalMinMax) |
1130 | { |
1131 | Standard_ShortReal x, y, z; |
1132 | thePoint.Coord (x, y, z); |
1133 | if (x < myBounds.XMin) myBounds.XMin = x; |
1134 | if (y < myBounds.YMin) myBounds.YMin = y; |
1135 | if (z < myBounds.ZMin) myBounds.ZMin = z; |
1136 | if (x > myBounds.XMax) myBounds.XMax = x; |
1137 | if (y > myBounds.YMax) myBounds.YMax = y; |
1138 | if (z > myBounds.ZMax) myBounds.ZMax = z; |
1139 | } |
1140 | Update(); |
1141 | } |
1142 | |
1143 | // ======================================================================= |
1144 | // function : Text |
1145 | // purpose : |
1146 | // ======================================================================= |
1147 | void Graphic3d_Group::Text (const Standard_CString theText, |
1148 | const Graphic3d_Vertex& thePoint, |
1149 | const Standard_Real theHeight, |
1150 | const Standard_Boolean theToEvalMinMax) |
1151 | { |
1152 | Text (theText, thePoint, theHeight, 0.0, |
1153 | Graphic3d_TP_RIGHT, Graphic3d_HTA_LEFT, Graphic3d_VTA_BOTTOM, theToEvalMinMax); |
1154 | } |
1155 | |
1156 | // ======================================================================= |
1157 | // function : Text |
1158 | // purpose : |
1159 | // ======================================================================= |
1160 | void Graphic3d_Group::Text (const TCollection_ExtendedString& theText, |
1161 | const Graphic3d_Vertex& thePoint, |
1162 | const Standard_Real theHeight, |
1163 | const Quantity_PlaneAngle theAngle, |
1164 | const Graphic3d_TextPath theTp, |
1165 | const Graphic3d_HorizontalTextAlignment theHta, |
1166 | const Graphic3d_VerticalTextAlignment theVta, |
1167 | const Standard_Boolean theToEvalMinMax) |
1168 | { |
1169 | const NCollection_String aText ((Standard_Utf16Char* )theText.ToExtString()); |
1170 | Text (aText.ToCString(), thePoint, theHeight, theAngle, |
1171 | theTp, theHta, theVta, theToEvalMinMax); |
1172 | } |
1173 | |
1174 | // ======================================================================= |
1175 | // function : Text |
1176 | // purpose : |
1177 | // ======================================================================= |
1178 | void Graphic3d_Group::Text (const TCollection_ExtendedString& theText, |
1179 | const Graphic3d_Vertex& thePoint, |
1180 | const Standard_Real theHeight, |
1181 | const Standard_Boolean theToEvalMinMax) |
1182 | { |
1183 | const NCollection_String aText ((Standard_Utf16Char* )theText.ToExtString()); |
1184 | Text (aText.ToCString(), thePoint, theHeight, 0.0, |
1185 | Graphic3d_TP_RIGHT, Graphic3d_HTA_LEFT, Graphic3d_VTA_BOTTOM, theToEvalMinMax); |
7fd59977 |
1186 | } |
31c0e219 |
1187 | |
1188 | // ======================================================================= |
1189 | // function : SetClosed |
1190 | // purpose : |
1191 | // ======================================================================= |
1192 | void Graphic3d_Group::SetClosed (const Standard_Boolean theIsClosed) |
1193 | { |
1194 | myIsClosed = theIsClosed; |
1195 | } |
1196 | |
1197 | // ======================================================================= |
1198 | // function : IsClosed |
1199 | // purpose : |
1200 | // ======================================================================= |
1201 | Standard_Boolean Graphic3d_Group::IsClosed() const |
1202 | { |
1203 | return myIsClosed; |
1204 | } |