0024381: Visualization, TKOpenGl - revise matrices stack and usage of temporary matrices
[occt.git] / src / OpenGl / OpenGl_Structure.cxx
CommitLineData
b311480e 1// Created on: 2011-08-01
2// Created by: Sergey ZERCHANINOV
973c2be1 3// Copyright (c) 2011-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.
b311480e 15
4269bd1b 16#include <OpenGl_CappingAlgo.hxx>
17#include <OpenGl_Context.hxx>
30f0ad28 18#include <OpenGl_GlCore11.hxx>
63bcc448 19#include <OpenGl_GraphicDriver.hxx>
30f0ad28 20#include <OpenGl_ShaderManager.hxx>
21#include <OpenGl_ShaderProgram.hxx>
2bd4bfac 22#include <OpenGl_StructureShadow.hxx>
2166f0fa 23#include <OpenGl_telem_util.hxx>
30f0ad28 24#include <OpenGl_Vec.hxx>
25#include <OpenGl_View.hxx>
26#include <OpenGl_Workspace.hxx>
2166f0fa 27
51b10cd4 28#include <Graphic3d_SequenceOfHClipPlane_Handle.hxx>
b859a34d 29
63bcc448 30IMPLEMENT_STANDARD_HANDLE (OpenGl_Structure, Graphic3d_CStructure)
31IMPLEMENT_STANDARD_RTTIEXT(OpenGl_Structure, Graphic3d_CStructure)
32
27eed937 33//! Auxiliary class for bounding box presentation
34class OpenGl_BndBoxPrs : public OpenGl_Element
35{
36
37public:
38
39 //! Main constructor
b7cd4ba7 40 OpenGl_BndBoxPrs (const Graphic3d_BndBox4f& theBndBox)
41 {
42 const float Xm = theBndBox.CornerMin().x();
43 const float Ym = theBndBox.CornerMin().y();
44 const float Zm = theBndBox.CornerMin().z();
45 const float XM = theBndBox.CornerMax().x();
46 const float YM = theBndBox.CornerMax().y();
47 const float ZM = theBndBox.CornerMax().z();
48
27eed937 49 myVerts[0] = OpenGl_Vec3 (Xm, Ym, Zm);
50 myVerts[1] = OpenGl_Vec3 (Xm, Ym, ZM);
51 myVerts[2] = OpenGl_Vec3 (Xm, YM, ZM);
52 myVerts[3] = OpenGl_Vec3 (Xm, YM, Zm);
53 myVerts[4] = OpenGl_Vec3 (Xm, Ym, Zm);
54 myVerts[5] = OpenGl_Vec3 (XM, Ym, Zm);
55 myVerts[6] = OpenGl_Vec3 (XM, Ym, ZM);
56 myVerts[7] = OpenGl_Vec3 (XM, YM, ZM);
57 myVerts[8] = OpenGl_Vec3 (XM, YM, Zm);
58 myVerts[9] = OpenGl_Vec3 (XM, Ym, Zm);
59 myVerts[10] = OpenGl_Vec3 (XM, YM, Zm);
60 myVerts[11] = OpenGl_Vec3 (Xm, YM, Zm);
61 myVerts[12] = OpenGl_Vec3 (Xm, YM, ZM);
62 myVerts[13] = OpenGl_Vec3 (XM, YM, ZM);
63 myVerts[14] = OpenGl_Vec3 (XM, Ym, ZM);
64 myVerts[15] = OpenGl_Vec3 (Xm, Ym, ZM);
65 }
66
67 //! Render presentation
68 virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const
69 {
ca3c13d1 70 #if !defined(GL_ES_VERSION_2_0)
27eed937 71 // Apply line aspect
72 const OpenGl_AspectLine* anAspectLine = theWorkspace->AspectLine (Standard_True);
73 const Handle(OpenGl_Texture) aPrevTexture = theWorkspace->DisableTexture();
74
75 glDisable (GL_LIGHTING);
679ecdee 76 if ((theWorkspace->NamedStatus & OPENGL_NS_IMMEDIATE) != 0)
27eed937 77 {
78 glDepthMask (GL_FALSE);
79 }
80
81 // Use highlight colors
ca3c13d1 82 theWorkspace->GetGlContext()->core11->glColor3fv ((theWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT) ? theWorkspace->HighlightColor->rgb : anAspectLine->Color().rgb);
27eed937 83
84 glEnableClientState (GL_VERTEX_ARRAY);
85 glVertexPointer (3, GL_FLOAT, 0, (GLfloat* )&myVerts);
86 glDrawArrays (GL_LINE_STRIP, 0, 16);
87 glDisableClientState (GL_VERTEX_ARRAY);
88
89 // restore aspects
90 if (!aPrevTexture.IsNull())
91 {
92 theWorkspace->EnableTexture (aPrevTexture);
93 }
ca3c13d1 94 #endif
27eed937 95 }
96
97 //! Release graphical resources
10b9c7df 98 virtual void Release (OpenGl_Context*)
27eed937 99 {
100 //
101 }
102
103protected:
104
105 //! Protected destructor
106 virtual ~OpenGl_BndBoxPrs() {}
107
108private:
109
110 OpenGl_Vec3 myVerts[16]; //!< vertices array
111
112public:
113
114 DEFINE_STANDARD_ALLOC
115
116};
2166f0fa
SK
117
118/*----------------------------------------------------------------------*/
119
4269bd1b 120// =======================================================================
121// function : OpenGl_Structure
122// purpose :
123// =======================================================================
63bcc448 124OpenGl_Structure::OpenGl_Structure (const Handle(Graphic3d_StructureManager)& theManager)
125: Graphic3d_CStructure (theManager),
126 myTransformation(NULL),
2166f0fa 127 myTransPers(NULL),
2166f0fa
SK
128 myAspectLine(NULL),
129 myAspectFace(NULL),
130 myAspectMarker(NULL),
131 myAspectText(NULL),
2166f0fa 132 myHighlightColor(NULL),
59f45b7c 133 myNamedStatus(0),
fc73a202 134 myZLayer(0),
135 myIsRaytracable (Standard_False),
b7cd4ba7 136 myModificationState (0),
7d9e854b 137 myIsCulled (Standard_True),
138 myIsMirrored (Standard_False)
2166f0fa 139{
63bcc448 140 UpdateNamedStatus();
2166f0fa
SK
141}
142
4269bd1b 143// =======================================================================
144// function : ~OpenGl_Structure
145// purpose :
146// =======================================================================
5e27df78 147OpenGl_Structure::~OpenGl_Structure()
2166f0fa 148{
5e27df78 149 Release (Handle(OpenGl_Context)());
150 delete myTransformation; myTransformation = NULL;
151 delete myTransPers; myTransPers = NULL;
2166f0fa
SK
152}
153
4269bd1b 154// =======================================================================
63bcc448 155// function : UpdateAspects
4269bd1b 156// purpose :
157// =======================================================================
63bcc448 158void OpenGl_Structure::UpdateAspects()
2166f0fa 159{
63bcc448 160 SetTransformPersistence (TransformPersistence);
161
162 if (ContextLine.IsDef)
163 SetAspectLine (ContextLine);
164
165 if (ContextFillArea.IsDef)
166 SetAspectFace (ContextFillArea);
167
168 if (ContextMarker.IsDef)
169 SetAspectMarker (ContextMarker);
170
171 if (ContextText.IsDef)
172 SetAspectText (ContextText);
173}
174
175// =======================================================================
176// function : UpdateTransformation
177// purpose :
178// =======================================================================
179void OpenGl_Structure::UpdateTransformation()
180{
181 if (myTransformation == NULL)
e276548b 182 {
5e27df78 183 myTransformation = new OpenGl_Matrix();
e276548b 184 }
2166f0fa 185
7d9e854b 186 Standard_ShortReal (*aMat)[4] = Graphic3d_CStructure::Transformation;
187
188 Standard_ShortReal aDet =
189 aMat[0][0] * (aMat[1][1] * aMat[2][2] - aMat[2][1] * aMat[1][2]) -
190 aMat[0][1] * (aMat[1][0] * aMat[2][2] - aMat[2][0] * aMat[1][2]) +
191 aMat[0][2] * (aMat[1][0] * aMat[2][1] - aMat[2][0] * aMat[1][1]);
192
193 // Determinant of transform matrix less then 0 means that mirror transform applied.
194 myIsMirrored = aDet < 0.0f;
195
63bcc448 196 matcpy (myTransformation->mat, &Graphic3d_CStructure::Transformation[0][0]);
e276548b 197
e276548b 198 if (myIsRaytracable)
199 {
200 UpdateStateWithAncestorStructures();
201 }
2166f0fa
SK
202}
203
4269bd1b 204// =======================================================================
205// function : SetTransformPersistence
206// purpose :
207// =======================================================================
2166f0fa
SK
208void OpenGl_Structure::SetTransformPersistence(const CALL_DEF_TRANSFORM_PERSISTENCE &ATransPers)
209{
210 if (!myTransPers)
211 myTransPers = new TEL_TRANSFORM_PERSISTENCE;
212
213 myTransPers->mode = ATransPers.Flag;
214 myTransPers->pointX = ATransPers.Point.x;
215 myTransPers->pointY = ATransPers.Point.y;
216 myTransPers->pointZ = ATransPers.Point.z;
b7cd4ba7 217 MarkAsNotCulled();
2166f0fa
SK
218}
219
4269bd1b 220// =======================================================================
221// function : SetAspectLine
222// purpose :
223// =======================================================================
fd4a6963 224void OpenGl_Structure::SetAspectLine (const CALL_DEF_CONTEXTLINE &theAspect)
2166f0fa
SK
225{
226 if (!myAspectLine)
fd4a6963 227 {
5e27df78 228 myAspectLine = new OpenGl_AspectLine();
fd4a6963 229 }
230 myAspectLine->SetAspect (theAspect);
2166f0fa
SK
231}
232
4269bd1b 233// =======================================================================
234// function : SetAspectFace
235// purpose :
236// =======================================================================
fd4a6963 237void OpenGl_Structure::SetAspectFace (const CALL_DEF_CONTEXTFILLAREA& theAspect)
2166f0fa
SK
238{
239 if (!myAspectFace)
bf75be98 240 {
5e27df78 241 myAspectFace = new OpenGl_AspectFace();
bf75be98 242 }
fd4a6963 243 myAspectFace->SetAspect (theAspect);
e276548b 244
e276548b 245 if (myIsRaytracable)
246 {
247 UpdateStateWithAncestorStructures();
248 }
2166f0fa
SK
249}
250
4269bd1b 251// =======================================================================
252// function : SetAspectMarker
253// purpose :
254// =======================================================================
fd4a6963 255void OpenGl_Structure::SetAspectMarker (const CALL_DEF_CONTEXTMARKER& theAspect)
2166f0fa
SK
256{
257 if (!myAspectMarker)
a577aaab 258 {
5e27df78 259 myAspectMarker = new OpenGl_AspectMarker();
a577aaab 260 }
fd4a6963 261 myAspectMarker->SetAspect (theAspect);
2166f0fa
SK
262}
263
4269bd1b 264// =======================================================================
265// function : SetAspectText
266// purpose :
267// =======================================================================
fd4a6963 268void OpenGl_Structure::SetAspectText (const CALL_DEF_CONTEXTTEXT &theAspect)
2166f0fa
SK
269{
270 if (!myAspectText)
fd4a6963 271 {
5e27df78 272 myAspectText = new OpenGl_AspectText();
fd4a6963 273 }
274 myAspectText->SetAspect (theAspect);
2166f0fa
SK
275}
276
4269bd1b 277// =======================================================================
b64d84be 278// function : clearHighlightBox
4269bd1b 279// purpose :
280// =======================================================================
b64d84be 281void OpenGl_Structure::clearHighlightBox (const Handle(OpenGl_Context)& theGlCtx)
2166f0fa 282{
b64d84be 283 if (!myHighlightBox.IsNull())
5e27df78 284 {
285 myHighlightBox->Release (theGlCtx);
b64d84be 286 myHighlightBox.Nullify();
2166f0fa
SK
287 }
288}
289
63bcc448 290// =======================================================================
291// function : HighlightWithColor
292// purpose :
293// =======================================================================
294void OpenGl_Structure::HighlightWithColor (const Graphic3d_Vec3& theColor,
295 const Standard_Boolean theToCreate)
296{
7d9e854b 297 const Handle(OpenGl_Context)& aContext = GlDriver()->GetSharedContext();
63bcc448 298 if (theToCreate)
7d9e854b 299 setHighlightColor (aContext, theColor);
63bcc448 300 else
7d9e854b 301 clearHighlightColor (aContext);
63bcc448 302}
303
304// =======================================================================
305// function : HighlightWithBndBox
306// purpose :
307// =======================================================================
b64d84be 308void OpenGl_Structure::HighlightWithBndBox (const Handle(Graphic3d_Structure)& theStruct,
309 const Standard_Boolean theToCreate)
63bcc448 310{
7d9e854b 311 const Handle(OpenGl_Context)& aContext = GlDriver()->GetSharedContext();
b64d84be 312 if (!theToCreate)
313 {
7d9e854b 314 clearHighlightBox (aContext);
b64d84be 315 return;
316 }
317
318 if (!myHighlightBox.IsNull())
319 {
7d9e854b 320 myHighlightBox->Release (aContext);
b64d84be 321 }
63bcc448 322 else
b64d84be 323 {
324 myHighlightBox = new OpenGl_Group (theStruct);
325 }
326
327 CALL_DEF_CONTEXTLINE& aContextLine = myHighlightBox->ChangeContextLine();
328 aContextLine.IsDef = 1;
b7cd4ba7 329 aContextLine.Color = HighlightColor;
b64d84be 330 aContextLine.LineType = Aspect_TOL_SOLID;
331 aContextLine.Width = 1.0f;
332 myHighlightBox->UpdateAspectLine (Standard_True);
333
b7cd4ba7 334 OpenGl_BndBoxPrs* aBndBoxPrs = new OpenGl_BndBoxPrs (myBndBox);
b64d84be 335 myHighlightBox->AddElement (aBndBoxPrs);
63bcc448 336}
337
4269bd1b 338// =======================================================================
b64d84be 339// function : setHighlightColor
4269bd1b 340// purpose :
341// =======================================================================
b64d84be 342void OpenGl_Structure::setHighlightColor (const Handle(OpenGl_Context)& theGlCtx,
63bcc448 343 const Graphic3d_Vec3& theColor)
2166f0fa 344{
b64d84be 345 clearHighlightBox (theGlCtx);
5e27df78 346 if (myHighlightColor == NULL)
347 {
348 myHighlightColor = new TEL_COLOUR();
349 }
2166f0fa 350
63bcc448 351 myHighlightColor->rgb[0] = theColor.r();
352 myHighlightColor->rgb[1] = theColor.g();
353 myHighlightColor->rgb[2] = theColor.b();
2166f0fa
SK
354 myHighlightColor->rgb[3] = 1.F;
355}
356
4269bd1b 357// =======================================================================
b64d84be 358// function : clearHighlightColor
4269bd1b 359// purpose :
360// =======================================================================
b64d84be 361void OpenGl_Structure::clearHighlightColor (const Handle(OpenGl_Context)& theGlCtx)
2166f0fa 362{
b64d84be 363 clearHighlightBox(theGlCtx);
5e27df78 364 delete myHighlightColor;
365 myHighlightColor = NULL;
2166f0fa
SK
366}
367
e276548b 368// =======================================================================
63bcc448 369// function : UpdateNamedStatus
e276548b 370// purpose :
371// =======================================================================
63bcc448 372void OpenGl_Structure::UpdateNamedStatus()
e276548b 373{
63bcc448 374 myNamedStatus = 0;
375 if (highlight) myNamedStatus |= OPENGL_NS_HIGHLIGHT;
376 if (!visible) myNamedStatus |= OPENGL_NS_HIDE;
e276548b 377
e276548b 378 if (myIsRaytracable)
379 {
380 UpdateStateWithAncestorStructures();
381 }
e276548b 382}
383
e276548b 384// =======================================================================
385// function : RegisterAncestorStructure
386// purpose :
387// =======================================================================
388void OpenGl_Structure::RegisterAncestorStructure (const OpenGl_Structure* theStructure) const
389{
390 for (OpenGl_ListOfStructure::Iterator anIt (myAncestorStructures); anIt.More(); anIt.Next())
391 {
392 if (anIt.Value() == theStructure)
393 {
394 return;
5322131b 395 }
e276548b 396 }
397
398 myAncestorStructures.Append (theStructure);
399}
400
401// =======================================================================
402// function : UnregisterAncestorStructure
403// purpose :
404// =======================================================================
405void OpenGl_Structure::UnregisterAncestorStructure (const OpenGl_Structure* theStructure) const
406{
407 for (OpenGl_ListOfStructure::Iterator anIt (myAncestorStructures); anIt.More(); anIt.Next())
408 {
409 if (anIt.Value() == theStructure)
410 {
411 myAncestorStructures.Remove (anIt);
412 return;
5322131b 413 }
e276548b 414 }
415}
416
d5af8626 417// =======================================================================
418// function : UnregisterFromAncestorStructure
419// purpose :
420// =======================================================================
421void OpenGl_Structure::UnregisterFromAncestorStructure() const
422{
423 for (OpenGl_ListOfStructure::Iterator anIta (myAncestorStructures); anIta.More(); anIta.Next())
424 {
425 OpenGl_Structure* anAncestor = const_cast<OpenGl_Structure*> (anIta.ChangeValue());
426
427 for (OpenGl_ListOfStructure::Iterator anIts (anAncestor->myConnected); anIts.More(); anIts.Next())
428 {
429 if (anIts.Value() == this)
430 {
431 anAncestor->myConnected.Remove (anIts);
432 return;
5322131b 433 }
d5af8626 434 }
435 }
436}
437
e276548b 438// =======================================================================
439// function : UpdateStateWithAncestorStructures
440// purpose :
441// =======================================================================
442void OpenGl_Structure::UpdateStateWithAncestorStructures() const
443{
444 myModificationState++;
445
446 for (OpenGl_ListOfStructure::Iterator anIt (myAncestorStructures); anIt.More(); anIt.Next())
447 {
448 anIt.Value()->UpdateStateWithAncestorStructures();
449 }
450}
451
452// =======================================================================
453// function : UpdateRaytracableWithAncestorStructures
454// purpose :
455// =======================================================================
456void OpenGl_Structure::UpdateRaytracableWithAncestorStructures() const
457{
458 myIsRaytracable = OpenGl_Raytrace::IsRaytracedStructure (this);
459
460 if (!myIsRaytracable)
461 {
462 for (OpenGl_ListOfStructure::Iterator anIt (myAncestorStructures); anIt.More(); anIt.Next())
463 {
464 anIt.Value()->UpdateRaytracableWithAncestorStructures();
465 }
466 }
467}
468
469// =======================================================================
470// function : SetRaytracableWithAncestorStructures
471// purpose :
472// =======================================================================
473void OpenGl_Structure::SetRaytracableWithAncestorStructures() const
474{
475 myIsRaytracable = Standard_True;
476
477 for (OpenGl_ListOfStructure::Iterator anIt (myAncestorStructures); anIt.More(); anIt.Next())
478 {
479 if (!anIt.Value()->IsRaytracable())
480 {
481 anIt.Value()->SetRaytracableWithAncestorStructures();
482 }
483 }
484}
485
4269bd1b 486// =======================================================================
487// function : Connect
488// purpose :
489// =======================================================================
63bcc448 490void OpenGl_Structure::Connect (Graphic3d_CStructure& theStructure)
2166f0fa 491{
63bcc448 492 OpenGl_Structure* aStruct = (OpenGl_Structure* )&theStructure;
e276548b 493 Disconnect (theStructure);
63bcc448 494 myConnected.Append (aStruct);
e276548b 495
63bcc448 496 if (aStruct->IsRaytracable())
e276548b 497 {
498 UpdateStateWithAncestorStructures();
499 SetRaytracableWithAncestorStructures();
500 }
501
63bcc448 502 aStruct->RegisterAncestorStructure (this);
2166f0fa
SK
503}
504
4269bd1b 505// =======================================================================
506// function : Disconnect
507// purpose :
508// =======================================================================
63bcc448 509void OpenGl_Structure::Disconnect (Graphic3d_CStructure& theStructure)
2166f0fa 510{
63bcc448 511 OpenGl_Structure* aStruct = (OpenGl_Structure* )&theStructure;
512 for (OpenGl_ListOfStructure::Iterator anIter (myConnected); anIter.More(); anIter.Next())
2166f0fa
SK
513 {
514 // Check for the given structure
63bcc448 515 if (anIter.Value() == aStruct)
2166f0fa 516 {
63bcc448 517 myConnected.Remove (anIter);
e276548b 518
63bcc448 519 if (aStruct->IsRaytracable())
e276548b 520 {
521 UpdateStateWithAncestorStructures();
522 UpdateRaytracableWithAncestorStructures();
523 }
524
63bcc448 525 aStruct->UnregisterAncestorStructure (this);
2166f0fa
SK
526 return;
527 }
2166f0fa
SK
528 }
529}
530
4269bd1b 531// =======================================================================
b64d84be 532// function : NewGroup
4269bd1b 533// purpose :
534// =======================================================================
b64d84be 535Handle(Graphic3d_Group) OpenGl_Structure::NewGroup (const Handle(Graphic3d_Structure)& theStruct)
2166f0fa 536{
b64d84be 537 Handle(OpenGl_Group) aGroup = new OpenGl_Group (theStruct);
538 myGroups.Append (aGroup);
539 return aGroup;
2166f0fa
SK
540}
541
4269bd1b 542// =======================================================================
543// function : RemoveGroup
544// purpose :
545// =======================================================================
b64d84be 546void OpenGl_Structure::RemoveGroup (const Handle(Graphic3d_Group)& theGroup)
2166f0fa 547{
b64d84be 548 if (theGroup.IsNull())
549 {
550 return;
551 }
552
553 for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myGroups); aGroupIter.More(); aGroupIter.Next())
2166f0fa
SK
554 {
555 // Check for the given group
b64d84be 556 if (aGroupIter.Value() == theGroup)
2166f0fa 557 {
b64d84be 558 theGroup->Clear (Standard_False);
e276548b 559
b64d84be 560 if (((OpenGl_Group* )theGroup.operator->())->IsRaytracable())
e276548b 561 {
562 UpdateStateWithAncestorStructures();
563 UpdateRaytracableWithAncestorStructures();
564 }
e276548b 565
b64d84be 566 myGroups.Remove (aGroupIter);
2166f0fa
SK
567 return;
568 }
2166f0fa
SK
569 }
570}
571
63bcc448 572// =======================================================================
573// function : Clear
574// purpose :
575// =======================================================================
576void OpenGl_Structure::Clear()
577{
578 Clear (GlDriver()->GetSharedContext());
579}
580
4269bd1b 581// =======================================================================
582// function : Clear
583// purpose :
584// =======================================================================
5e27df78 585void OpenGl_Structure::Clear (const Handle(OpenGl_Context)& theGlCtx)
2166f0fa 586{
e276548b 587 Standard_Boolean aRaytracableGroupDeleted (Standard_False);
e276548b 588
5e27df78 589 // Release groups
b64d84be 590 for (OpenGl_Structure::GroupIterator aGroupIter (myGroups); aGroupIter.More(); aGroupIter.Next())
2166f0fa 591 {
b64d84be 592 aRaytracableGroupDeleted |= aGroupIter.Value()->IsRaytracable();
5322131b 593
2166f0fa 594 // Delete objects
b64d84be 595 aGroupIter.ChangeValue()->Release (theGlCtx);
2166f0fa
SK
596 }
597 myGroups.Clear();
e276548b 598
e276548b 599 if (aRaytracableGroupDeleted)
600 {
601 UpdateStateWithAncestorStructures();
602 UpdateRaytracableWithAncestorStructures();
603 }
b7cd4ba7 604
605 Is2dText = Standard_False;
606 IsForHighlight = Standard_False;
2166f0fa
SK
607}
608
0717ddc1 609// =======================================================================
610// function : RenderGeometry
611// purpose :
612// =======================================================================
7d9e854b 613void OpenGl_Structure::RenderGeometry (const Handle(OpenGl_Workspace) &theWorkspace) const
0717ddc1 614{
615 // Render groups
616 const Graphic3d_SequenceOfGroup& aGroups = DrawGroups();
617 for (OpenGl_Structure::GroupIterator aGroupIter (aGroups); aGroupIter.More(); aGroupIter.Next())
618 {
7d9e854b 619 aGroupIter.Value()->Render (theWorkspace);
0717ddc1 620 }
621}
622
4269bd1b 623// =======================================================================
624// function : Render
625// purpose :
626// =======================================================================
7d9e854b 627void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &theWorkspace) const
2166f0fa
SK
628{
629 // Process the structure only if visible
7d9e854b 630 if (myNamedStatus & OPENGL_NS_HIDE)
631 {
2166f0fa 632 return;
7d9e854b 633 }
2166f0fa 634
c827ea3a 635 const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext();
b7cd4ba7 636
2166f0fa 637 // Render named status
7d9e854b 638 const Standard_Integer aNamedStatus = theWorkspace->NamedStatus;
639 theWorkspace->NamedStatus |= myNamedStatus;
2166f0fa 640
7d9e854b 641 // Do we need to restore GL_NORMALIZE?
c827ea3a 642 const Standard_Boolean anOldGlNormalize = aCtx->IsGlNormalizeEnabled();
2166f0fa
SK
643
644 // Apply local transformation
2166f0fa
SK
645 if (myTransformation)
646 {
c827ea3a 647 OpenGl_Matrix aModelWorld;
648 OpenGl_Transposemat3 (&aModelWorld, myTransformation);
649 aCtx->ModelWorldState.Push();
650 aCtx->ModelWorldState.SetCurrent (OpenGl_Mat4::Map ((Standard_ShortReal* )aModelWorld.mat));
7d9e854b 651
652 Standard_ShortReal aScaleX = OpenGl_Vec3 (myTransformation->mat[0][0],
653 myTransformation->mat[0][1],
654 myTransformation->mat[0][2]).SquareModulus();
655 // Scale transform detected.
656 if (Abs (aScaleX - 1.f) > Precision::Confusion())
657 {
c827ea3a 658 aCtx->SetGlNormalizeEnabled (Standard_True);
7d9e854b 659 }
2166f0fa
SK
660 }
661
662 // Apply transform persistence
7d9e854b 663 const TEL_TRANSFORM_PERSISTENCE *aTransPersistence = NULL;
2166f0fa
SK
664 if ( myTransPers && myTransPers->mode != 0 )
665 {
c827ea3a 666 aTransPersistence = theWorkspace->ActiveView()->BeginTransformPersistence (aCtx, myTransPers);
2166f0fa
SK
667 }
668
c827ea3a 669 // Take into account transform persistence
670 aCtx->ApplyModelViewMatrix();
671
2166f0fa 672 // Apply aspects
7d9e854b 673 const OpenGl_AspectLine *anAspectLine = theWorkspace->AspectLine (Standard_False);
674 const OpenGl_AspectFace *anAspectFace = theWorkspace->AspectFace (Standard_False);
675 const OpenGl_AspectMarker *anAspectMarker = theWorkspace->AspectMarker (Standard_False);
676 const OpenGl_AspectText *anAspectText = theWorkspace->AspectText (Standard_False);
2166f0fa 677 if (myAspectLine)
7d9e854b 678 {
679 theWorkspace->SetAspectLine (myAspectLine);
680 }
2166f0fa 681 if (myAspectFace)
7d9e854b 682 {
683 theWorkspace->SetAspectFace (myAspectFace);
684 }
2166f0fa 685 if (myAspectMarker)
7d9e854b 686 {
687 theWorkspace->SetAspectMarker (myAspectMarker);
688 }
2166f0fa 689 if (myAspectText)
7d9e854b 690 {
691 theWorkspace->SetAspectText (myAspectText);
692 }
693
694 // Apply correction for mirror transform
695 if (myIsMirrored)
696 {
c827ea3a 697 aCtx->core11fwd->glFrontFace (GL_CW);
7d9e854b 698 }
2166f0fa 699
2166f0fa 700 // Apply highlight color
7d9e854b 701 const TEL_COLOUR *aHighlightColor = theWorkspace->HighlightColor;
2166f0fa 702 if (myHighlightColor)
7d9e854b 703 theWorkspace->HighlightColor = myHighlightColor;
2166f0fa
SK
704
705 // Render connected structures
7d9e854b 706 OpenGl_ListOfStructure::Iterator anIter (myConnected);
707 while (anIter.More())
2166f0fa 708 {
7d9e854b 709 anIter.Value()->RenderGeometry (theWorkspace);
710 anIter.Next();
2166f0fa
SK
711 }
712
4269bd1b 713 // Set up plane equations for non-structure transformed global model-view matrix
b859a34d 714 // List of planes to be applied to context state
51b10cd4 715 Handle(Graphic3d_SequenceOfHClipPlane) aUserPlanes;
b859a34d 716
717 // Collect clipping planes of structure scope
718 if (!myClipPlanes.IsEmpty())
4269bd1b 719 {
7d9e854b 720 Graphic3d_SequenceOfHClipPlane::Iterator aClippingIter (myClipPlanes);
721 for (; aClippingIter.More(); aClippingIter.Next())
b859a34d 722 {
7d9e854b 723 const Handle(Graphic3d_ClipPlane)& aClipPlane = aClippingIter.Value();
b859a34d 724 if (!aClipPlane->IsOn())
725 {
726 continue;
727 }
728
729 if (aUserPlanes.IsNull())
730 {
51b10cd4 731 aUserPlanes = new Graphic3d_SequenceOfHClipPlane();
b859a34d 732 }
733
51b10cd4 734 aUserPlanes->Append (aClipPlane);
b859a34d 735 }
4269bd1b 736 }
737
b859a34d 738 if (!aUserPlanes.IsNull() && !aUserPlanes->IsEmpty())
4269bd1b 739 {
b859a34d 740 // add planes at loaded view matrix state
c827ea3a 741 aCtx->ChangeClipping().AddWorld (*aUserPlanes, theWorkspace);
30f0ad28 742
743 // Set OCCT state uniform variables
c827ea3a 744 if (!aCtx->ShaderManager()->IsEmpty())
30f0ad28 745 {
c827ea3a 746 aCtx->ShaderManager()->UpdateClippingState();
30f0ad28 747 }
4269bd1b 748 }
749
2166f0fa 750 // Render groups
b64d84be 751 const Graphic3d_SequenceOfGroup& aGroups = DrawGroups();
752 for (OpenGl_Structure::GroupIterator aGroupIter (aGroups); aGroupIter.More(); aGroupIter.Next())
2166f0fa 753 {
7d9e854b 754 aGroupIter.Value()->Render (theWorkspace);
2166f0fa
SK
755 }
756
7d9e854b 757 // Reset correction for mirror transform
758 if (myIsMirrored)
c827ea3a 759 {
760 aCtx->core11fwd->glFrontFace (GL_CCW);
761 }
7d9e854b 762
b859a34d 763 // Render capping for structure groups
c827ea3a 764 if (!aCtx->Clipping().Planes().IsEmpty())
b859a34d 765 {
7d9e854b 766 OpenGl_CappingAlgo::RenderCapping (theWorkspace, aGroups);
b859a34d 767 }
4269bd1b 768
b859a34d 769 // Revert structure clippings
770 if (!aUserPlanes.IsNull() && !aUserPlanes->IsEmpty())
4269bd1b 771 {
c827ea3a 772 aCtx->ChangeClipping().Remove (*aUserPlanes);
30f0ad28 773
774 // Set OCCT state uniform variables
c827ea3a 775 if (!aCtx->ShaderManager()->IsEmpty())
30f0ad28 776 {
c827ea3a 777 aCtx->ShaderManager()->RevertClippingState();
30f0ad28 778 }
4269bd1b 779 }
780
c827ea3a 781 // Apply local transformation
782 if (myTransformation)
783 {
784 aCtx->ModelWorldState.Pop();
785 aCtx->SetGlNormalizeEnabled (anOldGlNormalize);
786 }
787
2166f0fa 788 // Restore highlight color
7d9e854b 789 theWorkspace->HighlightColor = aHighlightColor;
2166f0fa
SK
790
791 // Restore aspects
7d9e854b 792 theWorkspace->SetAspectLine (anAspectLine);
793 theWorkspace->SetAspectFace (anAspectFace);
794 theWorkspace->SetAspectMarker (anAspectMarker);
795 theWorkspace->SetAspectText (anAspectText);
2166f0fa
SK
796
797 // Restore transform persistence
798 if ( myTransPers && myTransPers->mode != 0 )
799 {
c827ea3a 800 theWorkspace->ActiveView()->BeginTransformPersistence (aCtx, aTransPersistence);
2166f0fa
SK
801 }
802
b7cd4ba7 803 // Apply highlight box
804 if (!myHighlightBox.IsNull())
805 {
7d9e854b 806 myHighlightBox->Render (theWorkspace);
b7cd4ba7 807 }
808
2166f0fa 809 // Restore named status
7d9e854b 810 theWorkspace->NamedStatus = aNamedStatus;
2166f0fa
SK
811}
812
5e27df78 813// =======================================================================
814// function : Release
815// purpose :
816// =======================================================================
817void OpenGl_Structure::Release (const Handle(OpenGl_Context)& theGlCtx)
818{
819 // Release groups
820 Clear (theGlCtx);
10b9c7df 821 OpenGl_Element::Destroy (theGlCtx.operator->(), myAspectLine);
822 OpenGl_Element::Destroy (theGlCtx.operator->(), myAspectFace);
823 OpenGl_Element::Destroy (theGlCtx.operator->(), myAspectMarker);
824 OpenGl_Element::Destroy (theGlCtx.operator->(), myAspectText);
b64d84be 825 clearHighlightColor (theGlCtx);
d5af8626 826
d5af8626 827 // Remove from connected list of ancestor
828 UnregisterFromAncestorStructure();
5e27df78 829}
830
dd8a4ce9 831// =======================================================================
832// function : ReleaseGlResources
833// purpose :
834// =======================================================================
835void OpenGl_Structure::ReleaseGlResources (const Handle(OpenGl_Context)& theGlCtx)
836{
b64d84be 837 for (OpenGl_Structure::GroupIterator aGroupIter (myGroups); aGroupIter.More(); aGroupIter.Next())
dd8a4ce9 838 {
b64d84be 839 aGroupIter.ChangeValue()->Release (theGlCtx);
dd8a4ce9 840 }
841 if (myAspectLine != NULL)
842 {
10b9c7df 843 myAspectLine->Release (theGlCtx.operator->());
dd8a4ce9 844 }
845 if (myAspectFace != NULL)
846 {
10b9c7df 847 myAspectFace->Release (theGlCtx.operator->());
dd8a4ce9 848 }
849 if (myAspectMarker != NULL)
850 {
10b9c7df 851 myAspectMarker->Release (theGlCtx.operator->());
dd8a4ce9 852 }
853 if (myAspectText != NULL)
854 {
10b9c7df 855 myAspectText->Release (theGlCtx.operator->());
dd8a4ce9 856 }
b64d84be 857 if (!myHighlightBox.IsNull())
dd8a4ce9 858 {
10b9c7df 859 myHighlightBox->Release (theGlCtx.operator->());
dd8a4ce9 860 }
861}
862
59f45b7c 863//=======================================================================
864//function : SetZLayer
bf75be98 865//purpose :
59f45b7c 866//=======================================================================
59f45b7c 867void OpenGl_Structure::SetZLayer (const Standard_Integer theLayerIndex)
868{
869 myZLayer = theLayerIndex;
870}
871
872//=======================================================================
873//function : GetZLayer
bf75be98 874//purpose :
59f45b7c 875//=======================================================================
59f45b7c 876Standard_Integer OpenGl_Structure::GetZLayer () const
877{
878 return myZLayer;
879}
679ecdee 880
679ecdee 881//=======================================================================
882//function : ShadowLink
883//purpose :
884//=======================================================================
885Handle(Graphic3d_CStructure) OpenGl_Structure::ShadowLink (const Handle(Graphic3d_StructureManager)& theManager) const
886{
887 return new OpenGl_StructureShadow (theManager, this);
888}