1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
14 /***********************************************************************
17 Classe Visual3d_Layer :
18 HISTORIQUE DES MODIFICATIONS :
19 ----------------------------
20 Novembre 1998 : CAL : Creation.
22 ************************************************************************/
25 #include <Graphic3d_GraphicDriver.hxx>
26 #include <Graphic3d_TypeOfPrimitive.hxx>
27 #include <Quantity_Color.hxx>
28 #include <Standard_Type.hxx>
29 #include <Visual3d_Layer.hxx>
30 #include <Visual3d_LayerDefinitionError.hxx>
31 #include <Visual3d_LayerItem.hxx>
32 #include <Visual3d_ViewManager.hxx>
35 #define MyViewManager ((Visual3d_ViewManager *) MyPtrViewManager)
37 //-Global data definitions
38 static Standard_Boolean theLayerState = Standard_False;
39 static Graphic3d_TypeOfPrimitive theTypeOfPrimitive = Graphic3d_TOP_UNDEFINED;
48 Visual3d_Layer::Visual3d_Layer (const Handle(Visual3d_ViewManager)& AManager, const Aspect_TypeOfLayer ALayerType, const Standard_Boolean AFlag) {
50 cout << "Visual3d_Layer::Visual3d_Layer" << endl;
52 MyPtrViewManager = (void *) AManager.operator->();
54 MyGraphicDriver = MyViewManager->GraphicDriver();
56 MyCLayer.layerType = int (ALayerType);
57 MyCLayer.ptrLayer = NULL;
58 MyCLayer.ortho[0] = -1.0;
59 MyCLayer.ortho[1] = 1.0;
60 MyCLayer.ortho[2] = -1.0;
61 MyCLayer.ortho[3] = 1.0;
62 MyCLayer.attach = 0; // Aspect_TOC_BOTTOM_LEFT
63 MyCLayer.sizeDependent = (AFlag ? 1 : 0);
65 MyViewManager->SetLayer (this);
66 MyGraphicDriver->Layer (MyCLayer);
67 MyCLayer.ptrLayer->layerData = this;
70 cout << "Visual3d_Layer::Visual3d_Layer" << endl;
71 call_def_ptrLayer ptrLayer;
72 ptrLayer = (call_def_ptrLayer) MyCLayer.ptrLayer;
74 cout << "\tptrLayer == NULL" << endl;
76 cout << "\tptrLayer->listIndex = " << ptrLayer->listIndex << endl;
84 void Visual3d_Layer::Destroy () {
86 cout << "Visual3d_Layer::Destroy" << endl;
88 MyGraphicDriver->RemoveLayer (MyCLayer);
93 void Visual3d_Layer::Begin () {
95 cout << "Visual3d_Layer::Begin" << endl;
98 Visual3d_LayerDefinitionError::Raise
99 ("Layer is already open !");
101 MyGraphicDriver->BeginLayer (MyCLayer);
102 theLayerState = Standard_True;
105 void Visual3d_Layer::End () {
107 cout << "Visual3d_Layer::End" << endl;
110 cout << "Visual3d_Layer::End" << endl;
111 call_def_ptrLayer ptrLayer;
112 ptrLayer = (call_def_ptrLayer) MyCLayer.ptrLayer;
113 if (ptrLayer == NULL)
114 cout << "\tptrLayer == NULL" << endl;
116 cout << "\tptrLayer->listIndex = " << ptrLayer->listIndex << endl;
119 Visual3d_LayerDefinitionError::Raise
120 ("Layer is not open !");
122 // Flush all graphics
123 MyGraphicDriver->EndLayer ();
124 theLayerState = Standard_False;
126 cout << "Visual3d_Layer::End" << endl;
127 ptrLayer = (call_def_ptrLayer) MyCLayer.ptrLayer;
128 if (ptrLayer == NULL)
129 cout << "\tptrLayer == NULL" << endl;
131 cout << "\tptrLayer->listIndex = " << ptrLayer->listIndex << endl;
135 void Visual3d_Layer::Clear () {
137 cout << "Visual3d_Layer::Clear" << endl;
140 Visual3d_LayerDefinitionError::Raise
143 MyGraphicDriver->ClearLayer (MyCLayer);
147 //-Graphic definition methods
150 void Visual3d_Layer::BeginPolyline () {
152 cout << "Visual3d_Layer::BeginPolyline" << endl;
155 Visual3d_LayerDefinitionError::Raise
156 ("Layer is not open !");
157 if( theTypeOfPrimitive != Graphic3d_TOP_UNDEFINED )
158 Visual3d_LayerDefinitionError::Raise
159 ("One primitive is already open !");
161 theTypeOfPrimitive = Graphic3d_TOP_POLYLINE;
163 MyGraphicDriver->BeginPolyline2d ();
166 void Visual3d_Layer::BeginPolygon () {
168 cout << "Visual3d_Layer::BeginPolygon" << endl;
171 Visual3d_LayerDefinitionError::Raise
172 ("Layer is not open !");
173 if( theTypeOfPrimitive != Graphic3d_TOP_UNDEFINED )
174 Visual3d_LayerDefinitionError::Raise
175 ("One primitive is already open !");
177 theTypeOfPrimitive = Graphic3d_TOP_POLYGON;
179 MyGraphicDriver->BeginPolygon2d ();
182 void Visual3d_Layer::AddVertex (const Standard_Real X, const Standard_Real Y, const Standard_Boolean AFlag) {
184 cout << "Visual3d_Layer::AddVertex" << endl;
186 Standard_ShortReal x = Standard_ShortReal(X);
187 Standard_ShortReal y = Standard_ShortReal(Y);
189 switch (theTypeOfPrimitive) {
190 case Graphic3d_TOP_POLYLINE :
191 if( AFlag ) MyGraphicDriver->Draw (x, y);
192 else MyGraphicDriver->Move (x, y);
194 case Graphic3d_TOP_POLYGON :
195 MyGraphicDriver->Edge (x, y);
198 Visual3d_LayerDefinitionError::Raise
199 ("Bad Primitive type!");
203 void Visual3d_Layer::ClosePrimitive () {
205 cout << "Visual3d_Layer::ClosePrimitive" << endl;
207 switch (theTypeOfPrimitive) {
208 case Graphic3d_TOP_POLYLINE :
209 MyGraphicDriver->EndPolyline2d ();
211 case Graphic3d_TOP_POLYGON :
212 MyGraphicDriver->EndPolygon2d ();
215 Visual3d_LayerDefinitionError::Raise
216 ("Bad Primitive type!");
219 theTypeOfPrimitive = Graphic3d_TOP_UNDEFINED;
222 void Visual3d_Layer::DrawRectangle (const Standard_Real X, const Standard_Real Y, const Standard_Real Width, const Standard_Real Height) {
224 cout << "Visual3d_Layer::DrawRectangle" << endl;
227 Visual3d_LayerDefinitionError::Raise
228 ("Layer is not open !");
229 if (theTypeOfPrimitive != Graphic3d_TOP_UNDEFINED )
230 Visual3d_LayerDefinitionError::Raise
231 ("One primitive is already open !");
233 Standard_ShortReal x = Standard_ShortReal (X);
234 Standard_ShortReal y = Standard_ShortReal (Y);
235 Standard_ShortReal width = Standard_ShortReal (Width);
236 Standard_ShortReal height = Standard_ShortReal (Height);
237 MyGraphicDriver->Rectangle (x, y, width, height);
243 void Visual3d_Layer::DrawText (const Standard_CString AText, const Standard_Real X, const Standard_Real Y, const Standard_Real AHeight) {
245 cout << "Visual3d_Layer::DrawText" << endl;
248 Visual3d_LayerDefinitionError::Raise
249 ("Layer is not open !");
250 if (theTypeOfPrimitive != Graphic3d_TOP_UNDEFINED )
251 Visual3d_LayerDefinitionError::Raise
252 ("One primitive is already open !");
254 Standard_ShortReal x = Standard_ShortReal (X);
255 Standard_ShortReal y = Standard_ShortReal (Y);
256 Standard_ShortReal height = Standard_ShortReal (AHeight);
257 MyGraphicDriver->Text (AText, x, y, height);
260 void Visual3d_Layer::SetColor (const Quantity_Color& AColor) {
262 cout << "Visual3d_Layer::SetColor" << endl;
265 Visual3d_LayerDefinitionError::Raise
266 ("Layer is not open !");
268 Standard_ShortReal r = Standard_ShortReal (AColor.Red());
269 Standard_ShortReal g = Standard_ShortReal (AColor.Green());
270 Standard_ShortReal b = Standard_ShortReal (AColor.Blue());
272 cout << "\tSetColor : " << r << ", " << g << ", " << b << endl;
274 MyGraphicDriver->SetColor (r, g, b);
277 void Visual3d_Layer::SetTransparency (const Standard_ShortReal ATransparency) {
279 cout << "Visual3d_Layer::SetTransparency" << endl;
282 Visual3d_LayerDefinitionError::Raise
283 ("Layer is not open !");
286 cout << "\tSetTransparency : " << ATransparency << endl;
288 MyGraphicDriver->SetTransparency (ATransparency);
291 void Visual3d_Layer::UnsetTransparency () {
293 cout << "Visual3d_Layer::UnsetTransparency" << endl;
296 Visual3d_LayerDefinitionError::Raise
297 ("Layer is not open !");
300 cout << "\tUnsetTransparency" << endl;
302 MyGraphicDriver->UnsetTransparency ();
308 void Visual3d_Layer::TextSize (const Standard_CString AText, const Standard_Real AHeight, Standard_Real& AWidth, Standard_Real& AnAscent, Standard_Real& ADescent) const {
309 Standard_ShortReal aWidth, anAscent, aDescent;
312 cout << "Visual3d_Layer::TextSize" << endl;
315 Visual3d_LayerDefinitionError::Raise
316 ("Layer is not open !");
317 if (theTypeOfPrimitive != Graphic3d_TOP_UNDEFINED )
318 Visual3d_LayerDefinitionError::Raise
319 ("One primitive is already open !");
321 MyGraphicDriver->TextSize (AText, (Standard_ShortReal)AHeight, aWidth, anAscent, aDescent);
327 void Visual3d_Layer::SetLineAttributes (const Aspect_TypeOfLine AType, const Standard_Real AWidth) {
329 cout << "Visual3d_Layer::SetLineAttributes" << endl;
332 Visual3d_LayerDefinitionError::Raise
333 ("Layer is not open !");
335 Standard_Integer type = AType;
336 Standard_ShortReal width = Standard_ShortReal (AWidth);
338 cout << "\tSetLineAttributes : " << type << ", " << width << endl;
340 MyGraphicDriver->SetLineAttributes (type, width);
343 void Visual3d_Layer::SetTextAttributes (const Standard_CString AFont, const Aspect_TypeOfDisplayText AType, const Quantity_Color& AColor) {
345 cout << "Visual3d_Layer::SetTextAttributes" << endl;
348 Visual3d_LayerDefinitionError::Raise
349 ("Layer is not open !");
351 Standard_CString font = (char*)AFont;
352 Standard_Integer type = AType;
353 Standard_ShortReal r = Standard_ShortReal (AColor.Red());
354 Standard_ShortReal g = Standard_ShortReal (AColor.Green());
355 Standard_ShortReal b = Standard_ShortReal (AColor.Blue());
357 cout << "\tSetTextAttributes : " << font << ", " << type << endl;
358 cout << "\t " << r << ", " << g << ", " << b << endl;
360 MyGraphicDriver->SetTextAttributes (font, type, r, g, b);
363 void Visual3d_Layer::SetOrtho (const Standard_Real Left, const Standard_Real Right, const Standard_Real Bottom, const Standard_Real Top, const Aspect_TypeOfConstraint Attach) {
365 cout << "Visual3d_Layer::SetOrtho" << endl;
368 MyCLayer.ortho[0] = Standard_ShortReal (Left);
369 MyCLayer.ortho[1] = Standard_ShortReal (Right);
370 MyCLayer.ortho[2] = Standard_ShortReal (Bottom);
371 MyCLayer.ortho[3] = Standard_ShortReal (Top);
372 MyCLayer.attach = Standard_Integer (Attach);
375 void Visual3d_Layer::SetViewport (const Standard_Integer Width, const Standard_Integer Height) {
377 cout << "Visual3d_Layer::SetViewport" << endl;
380 MyCLayer.viewport[0] = float (Width);
381 MyCLayer.viewport[1] = float (Height);
384 Aspect_CLayer2d Visual3d_Layer::CLayer () const {
386 cout << "Visual3d_Layer::CLayer" << endl;
389 cout << "Visual3d_Layer::CLayer" << endl;
390 call_def_ptrLayer ptrLayer;
391 ptrLayer = (call_def_ptrLayer) MyCLayer.ptrLayer;
392 if (ptrLayer == NULL)
393 cout << "\tptrLayer == NULL" << endl;
395 cout << "\tptrLayer->listIndex = " << ptrLayer->listIndex << endl;
400 Aspect_TypeOfLayer Visual3d_Layer::Type () const {
402 cout << "Visual3d_Layer::Type" << endl;
404 return Aspect_TypeOfLayer (MyCLayer.layerType);
408 void Visual3d_Layer::AddLayerItem( const Handle(Visual3d_LayerItem)& Item )
410 MyListOfLayerItems.Append( Item );
413 void Visual3d_Layer::RemoveLayerItem( const Handle(Visual3d_LayerItem)& Item )
415 if ( MyListOfLayerItems.IsEmpty() )
418 Visual3d_NListOfLayerItem::Iterator it( MyListOfLayerItems );
419 for( ; it.More(); it.Next() ) {
420 if ( it.Value() == Item ) {
421 MyListOfLayerItems.Remove( it );
427 void Visual3d_Layer::RemoveAllLayerItems()
429 MyListOfLayerItems.Clear();
432 const Visual3d_NListOfLayerItem& Visual3d_Layer::GetLayerItemList() const
434 return MyListOfLayerItems;
437 void Visual3d_Layer::RenderLayerItems() const
439 theLayerState = Standard_True;
441 const Visual3d_NListOfLayerItem& items = GetLayerItemList();
442 Visual3d_NListOfLayerItem::Iterator it(items);
443 for(; it.More(); it.Next() ) {
444 it.Value()->RedrawLayerPrs();
447 theLayerState = Standard_False;