1 // Created on: 2011-08-01
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-2012 OPEN CASCADE SAS
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
21 #include <OpenGl_GlCore11.hxx>
23 #include <OpenGl_Structure.hxx>
25 #include <OpenGl_Polyline.hxx>
26 #include <OpenGl_Workspace.hxx>
27 #include <OpenGl_View.hxx>
29 #include <OpenGl_telem_util.hxx>
32 /*----------------------------------------------------------------------*/
34 static void call_util_transpose_mat (float tmat[16], float mat[4][4])
40 tmat[j*4+i] = mat[i][j];
43 /*----------------------------------------------------------------------*/
45 OpenGl_Structure::OpenGl_Structure ()
46 : myTransformation(NULL),
48 myDegenerateModel(NULL),
54 myHighlightColor(NULL),
60 /*----------------------------------------------------------------------*/
62 OpenGl_Structure::~OpenGl_Structure ()
66 delete myTransformation;
67 myTransformation = NULL;
74 if (myDegenerateModel)
76 delete myDegenerateModel;
77 myDegenerateModel = NULL;
91 delete myAspectMarker;
92 myAspectMarker = NULL;
99 ClearHighlightColor();
104 /*----------------------------------------------------------------------*/
106 void OpenGl_Structure::SetTransformation(const float *AMatrix)
108 if (!myTransformation)
109 myTransformation = new OpenGl_Matrix;
111 matcpy( myTransformation->mat, AMatrix );
114 /*----------------------------------------------------------------------*/
116 void OpenGl_Structure::SetTransformPersistence(const CALL_DEF_TRANSFORM_PERSISTENCE &ATransPers)
119 myTransPers = new TEL_TRANSFORM_PERSISTENCE;
121 myTransPers->mode = ATransPers.Flag;
122 myTransPers->pointX = ATransPers.Point.x;
123 myTransPers->pointY = ATransPers.Point.y;
124 myTransPers->pointZ = ATransPers.Point.z;
127 /*----------------------------------------------------------------------*/
129 void OpenGl_Structure::SetDegenerateModel (const Standard_Integer AMode, const float ASkipRatio)
131 if (!myDegenerateModel)
132 myDegenerateModel = new DEGENERATION;
134 myDegenerateModel->mode = AMode;
135 myDegenerateModel->skipRatio = ASkipRatio;
138 /*----------------------------------------------------------------------*/
140 void OpenGl_Structure::SetAspectLine (const CALL_DEF_CONTEXTLINE &AContext)
143 myAspectLine = new OpenGl_AspectLine;
144 myAspectLine->SetContext( AContext );
147 /*----------------------------------------------------------------------*/
149 void OpenGl_Structure::SetAspectFace (const CALL_DEF_CONTEXTFILLAREA &AContext)
152 myAspectFace = new OpenGl_AspectFace;
153 myAspectFace->SetContext( AContext );
156 /*----------------------------------------------------------------------*/
158 void OpenGl_Structure::SetAspectMarker (const CALL_DEF_CONTEXTMARKER &AContext)
161 myAspectMarker = new OpenGl_AspectMarker;
162 myAspectMarker->SetContext( AContext );
165 /*----------------------------------------------------------------------*/
167 void OpenGl_Structure::SetAspectText (const CALL_DEF_CONTEXTTEXT &AContext)
170 myAspectText = new OpenGl_AspectText;
171 myAspectText->SetContext( AContext );
174 /*----------------------------------------------------------------------*/
176 void OpenGl_Structure::SetHighlightBox (const CALL_DEF_BOUNDBOX &ABoundBox)
179 myHighlightBox = new OpenGl_Group;
181 myHighlightBox->Clear();
183 CALL_DEF_CONTEXTLINE context_line;
184 context_line.Color = ABoundBox.Color;
185 context_line.LineType = Aspect_TOL_SOLID;
186 context_line.Width = 1.0f;
187 myHighlightBox->SetAspectLine( context_line );
189 #define CALL_MAX_BOUNDBOXSIZE 16
191 Graphic3d_Array1OfVertex points(1,CALL_MAX_BOUNDBOXSIZE);
192 const float Xm = ABoundBox.Pmin.x;
193 const float Ym = ABoundBox.Pmin.y;
194 const float Zm = ABoundBox.Pmin.z;
195 const float XM = ABoundBox.Pmax.x;
196 const float YM = ABoundBox.Pmax.y;
197 const float ZM = ABoundBox.Pmax.z;
198 points( 1).SetCoord(Xm,Ym,Zm);
199 points( 2).SetCoord(Xm,Ym,ZM);
200 points( 3).SetCoord(Xm,YM,ZM);
201 points( 4).SetCoord(Xm,YM,Zm);
202 points( 5).SetCoord(Xm,Ym,Zm);
203 points( 6).SetCoord(XM,Ym,Zm);
204 points( 7).SetCoord(XM,Ym,ZM);
205 points( 8).SetCoord(XM,YM,ZM);
206 points( 9).SetCoord(XM,YM,Zm);
207 points(10).SetCoord(XM,Ym,Zm);
208 points(11).SetCoord(XM,YM,Zm);
209 points(12).SetCoord(Xm,YM,Zm);
210 points(13).SetCoord(Xm,YM,ZM);
211 points(14).SetCoord(XM,YM,ZM);
212 points(15).SetCoord(XM,Ym,ZM);
213 points(16).SetCoord(Xm,Ym,ZM);
215 OpenGl_Polyline *apolyline = new OpenGl_Polyline(points);
216 myHighlightBox->AddElement( TelPolyline, apolyline );
219 /*----------------------------------------------------------------------*/
221 void OpenGl_Structure::ClearHighlightBox ()
225 delete myHighlightBox;
226 myHighlightBox = NULL;
230 /*----------------------------------------------------------------------*/
232 void OpenGl_Structure::SetHighlightColor (const Standard_ShortReal R, const Standard_ShortReal G, const Standard_ShortReal B)
235 if (!myHighlightColor)
236 myHighlightColor = new TEL_COLOUR;
238 myHighlightColor->rgb[0] = R;
239 myHighlightColor->rgb[1] = G;
240 myHighlightColor->rgb[2] = B;
241 myHighlightColor->rgb[3] = 1.F;
244 /*----------------------------------------------------------------------*/
246 void OpenGl_Structure::ClearHighlightColor ()
249 if (myHighlightColor)
251 delete myHighlightColor;
252 myHighlightColor = NULL;
256 /*----------------------------------------------------------------------*/
258 void OpenGl_Structure::Connect (const OpenGl_Structure *AStructure)
260 Disconnect (AStructure);
261 myConnected.Append(AStructure);
264 /*----------------------------------------------------------------------*/
266 void OpenGl_Structure::Disconnect (const OpenGl_Structure *AStructure)
268 OpenGl_ListOfStructure::Iterator its(myConnected);
271 // Check for the given structure
272 if (its.Value() == AStructure)
274 myConnected.Remove(its);
281 /*----------------------------------------------------------------------*/
283 OpenGl_Group * OpenGl_Structure::AddGroup ()
286 OpenGl_Group *g = new OpenGl_Group;
291 /*----------------------------------------------------------------------*/
293 void OpenGl_Structure::RemoveGroup (const OpenGl_Group *AGroup)
295 OpenGl_ListOfGroup::Iterator itg(myGroups);
298 // Check for the given group
299 if (itg.Value() == AGroup)
303 myGroups.Remove(itg);
310 /*----------------------------------------------------------------------*/
312 void OpenGl_Structure::Clear ()
314 OpenGl_ListOfGroup::Iterator itg(myGroups);
324 /*----------------------------------------------------------------------*/
326 void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
328 // Process the structure only if visible
329 if ( myNamedStatus & OPENGL_NS_HIDE )
332 // Render named status
333 const Standard_Integer named_status = AWorkspace->NamedStatus;
334 AWorkspace->NamedStatus |= myNamedStatus;
336 // Is rendering in ADD or IMMEDIATE mode?
337 const Standard_Boolean isImmediate = (AWorkspace->NamedStatus & (OPENGL_NS_ADD | OPENGL_NS_IMMEDIATE)) != 0;
339 // Apply local transformation
340 GLint matrix_mode = 0;
341 const OpenGl_Matrix *local_trsf = NULL;
342 if (myTransformation)
347 call_util_transpose_mat (mat16, myTransformation->mat);
348 glGetIntegerv (GL_MATRIX_MODE, &matrix_mode);
349 glMatrixMode (GL_MODELVIEW);
351 glScalef (1.F, 1.F, 1.F);
352 glMultMatrixf (mat16);
356 glMatrixMode (GL_MODELVIEW);
359 local_trsf = AWorkspace->SetStructureMatrix(myTransformation);
363 // Apply transform persistence
364 const TEL_TRANSFORM_PERSISTENCE *trans_pers = NULL;
365 if ( myTransPers && myTransPers->mode != 0 )
367 trans_pers = AWorkspace->ActiveView()->BeginTransformPersistence( myTransPers );
370 // Apply degeneration
371 if (myDegenerateModel)
373 if ( AWorkspace->NamedStatus & OPENGL_NS_DEGENERATION )
375 AWorkspace->DegenerateModel = myDegenerateModel->mode;
376 switch ( AWorkspace->DegenerateModel )
382 glDisable ( GL_LINE_STIPPLE );
385 AWorkspace->SkipRatio = myDegenerateModel->skipRatio;
391 const OpenGl_AspectLine *aspect_line = AWorkspace->AspectLine(Standard_False);
392 const OpenGl_AspectFace *aspect_face = AWorkspace->AspectFace(Standard_False);
393 const OpenGl_AspectMarker *aspect_marker = AWorkspace->AspectMarker(Standard_False);
394 const OpenGl_AspectText *aspect_text = AWorkspace->AspectText(Standard_False);
396 AWorkspace->SetAspectLine(myAspectLine);
398 AWorkspace->SetAspectFace(myAspectFace);
400 AWorkspace->SetAspectMarker(myAspectMarker);
402 AWorkspace->SetAspectText(myAspectText);
404 // Apply highlight box
406 myHighlightBox->Render( AWorkspace );
408 // Apply highlight color
409 const TEL_COLOUR *highlight_color = AWorkspace->HighlightColor;
410 if (myHighlightColor)
411 AWorkspace->HighlightColor = myHighlightColor;
413 // Render connected structures
414 OpenGl_ListOfStructure::Iterator its(myConnected);
417 its.Value()->Render(AWorkspace);
422 OpenGl_ListOfGroup::Iterator itg(myGroups);
425 itg.Value()->Render(AWorkspace);
429 // Restore highlight color
430 AWorkspace->HighlightColor = highlight_color;
433 AWorkspace->SetAspectLine(aspect_line);
434 AWorkspace->SetAspectFace(aspect_face);
435 AWorkspace->SetAspectMarker(aspect_marker);
436 AWorkspace->SetAspectText(aspect_text);
438 // Restore transform persistence
439 if ( myTransPers && myTransPers->mode != 0 )
441 AWorkspace->ActiveView()->BeginTransformPersistence( trans_pers );
444 // Restore local transformation
445 if (myTransformation)
450 glMatrixMode (matrix_mode);
454 AWorkspace->SetStructureMatrix(local_trsf);
456 glMatrixMode (GL_MODELVIEW);
461 // Restore named status
462 AWorkspace->NamedStatus = named_status;
465 //=======================================================================
466 //function : SetZLayer
468 //=======================================================================
470 void OpenGl_Structure::SetZLayer (const Standard_Integer theLayerIndex)
472 myZLayer = theLayerIndex;
475 //=======================================================================
476 //function : GetZLayer
478 //=======================================================================
480 Standard_Integer OpenGl_Structure::GetZLayer () const