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 /***********************************************************************
18 Classe Visual3d_Layer :
20 HISTORIQUE DES MODIFICATIONS :
21 ----------------------------
22 Novembre 1998 : CAL : Creation.
25 ************************************************************************/
28 #include <Visual3d_Layer.ixx>
30 #include <Graphic3d_TypeOfPrimitive.hxx>
31 #include <Visual3d_ViewManager.hxx>
34 #define MyViewManager ((Visual3d_ViewManager *) MyPtrViewManager)
36 //-Global data definitions
37 static Standard_Boolean theLayerState = Standard_False;
38 static Graphic3d_TypeOfPrimitive theTypeOfPrimitive = Graphic3d_TOP_UNDEFINED;
47 Visual3d_Layer::Visual3d_Layer (const Handle(Visual3d_ViewManager)& AManager, const Aspect_TypeOfLayer ALayerType, const Standard_Boolean AFlag) {
49 cout << "Visual3d_Layer::Visual3d_Layer" << endl;
51 MyPtrViewManager = (void *) AManager.operator->();
53 MyGraphicDriver = MyViewManager->GraphicDriver();
55 MyCLayer.layerType = int (ALayerType);
56 MyCLayer.ptrLayer = NULL;
57 MyCLayer.ortho[0] = -1.0;
58 MyCLayer.ortho[1] = 1.0;
59 MyCLayer.ortho[2] = -1.0;
60 MyCLayer.ortho[3] = 1.0;
61 MyCLayer.attach = 0; // Aspect_TOC_BOTTOM_LEFT
62 MyCLayer.sizeDependent = (AFlag ? 1 : 0);
64 MyViewManager->SetLayer (this);
65 MyGraphicDriver->Layer (MyCLayer);
66 MyCLayer.ptrLayer->layerData = this;
69 cout << "Visual3d_Layer::Visual3d_Layer" << endl;
70 call_def_ptrLayer ptrLayer;
71 ptrLayer = (call_def_ptrLayer) MyCLayer.ptrLayer;
73 cout << "\tptrLayer == NULL" << endl;
75 cout << "\tptrLayer->listIndex = " << ptrLayer->listIndex << endl;
83 void Visual3d_Layer::Destroy () {
85 cout << "Visual3d_Layer::Destroy" << endl;
87 MyGraphicDriver->RemoveLayer (MyCLayer);
92 void Visual3d_Layer::Begin () {
94 cout << "Visual3d_Layer::Begin" << endl;
97 Visual3d_LayerDefinitionError::Raise
98 ("Layer is already open !");
100 MyGraphicDriver->BeginLayer (MyCLayer);
101 theLayerState = Standard_True;
104 void Visual3d_Layer::End () {
106 cout << "Visual3d_Layer::End" << endl;
109 cout << "Visual3d_Layer::End" << endl;
110 call_def_ptrLayer ptrLayer;
111 ptrLayer = (call_def_ptrLayer) MyCLayer.ptrLayer;
112 if (ptrLayer == NULL)
113 cout << "\tptrLayer == NULL" << endl;
115 cout << "\tptrLayer->listIndex = " << ptrLayer->listIndex << endl;
118 Visual3d_LayerDefinitionError::Raise
119 ("Layer is not open !");
121 // Flush all graphics
122 MyGraphicDriver->EndLayer ();
123 theLayerState = Standard_False;
125 cout << "Visual3d_Layer::End" << endl;
126 ptrLayer = (call_def_ptrLayer) MyCLayer.ptrLayer;
127 if (ptrLayer == NULL)
128 cout << "\tptrLayer == NULL" << endl;
130 cout << "\tptrLayer->listIndex = " << ptrLayer->listIndex << endl;
134 void Visual3d_Layer::Clear () {
136 cout << "Visual3d_Layer::Clear" << endl;
139 Visual3d_LayerDefinitionError::Raise
142 MyGraphicDriver->ClearLayer (MyCLayer);
146 //-Graphic definition methods
149 void Visual3d_Layer::BeginPolyline () {
151 cout << "Visual3d_Layer::BeginPolyline" << endl;
154 Visual3d_LayerDefinitionError::Raise
155 ("Layer is not open !");
156 if( theTypeOfPrimitive != Graphic3d_TOP_UNDEFINED )
157 Visual3d_LayerDefinitionError::Raise
158 ("One primitive is already open !");
160 theTypeOfPrimitive = Graphic3d_TOP_POLYLINE;
162 MyGraphicDriver->BeginPolyline2d ();
165 void Visual3d_Layer::BeginPolygon () {
167 cout << "Visual3d_Layer::BeginPolygon" << endl;
170 Visual3d_LayerDefinitionError::Raise
171 ("Layer is not open !");
172 if( theTypeOfPrimitive != Graphic3d_TOP_UNDEFINED )
173 Visual3d_LayerDefinitionError::Raise
174 ("One primitive is already open !");
176 theTypeOfPrimitive = Graphic3d_TOP_POLYGON;
178 MyGraphicDriver->BeginPolygon2d ();
181 void Visual3d_Layer::AddVertex (const Standard_Real X, const Standard_Real Y, const Standard_Boolean AFlag) {
183 cout << "Visual3d_Layer::AddVertex" << endl;
185 Standard_ShortReal x = Standard_ShortReal(X);
186 Standard_ShortReal y = Standard_ShortReal(Y);
188 switch (theTypeOfPrimitive) {
189 case Graphic3d_TOP_POLYLINE :
190 if( AFlag ) MyGraphicDriver->Draw (x, y);
191 else MyGraphicDriver->Move (x, y);
193 case Graphic3d_TOP_POLYGON :
194 MyGraphicDriver->Edge (x, y);
197 Visual3d_LayerDefinitionError::Raise
198 ("Bad Primitive type!");
202 void Visual3d_Layer::ClosePrimitive () {
204 cout << "Visual3d_Layer::ClosePrimitive" << endl;
206 switch (theTypeOfPrimitive) {
207 case Graphic3d_TOP_POLYLINE :
208 MyGraphicDriver->EndPolyline2d ();
210 case Graphic3d_TOP_POLYGON :
211 MyGraphicDriver->EndPolygon2d ();
214 Visual3d_LayerDefinitionError::Raise
215 ("Bad Primitive type!");
218 theTypeOfPrimitive = Graphic3d_TOP_UNDEFINED;
221 void Visual3d_Layer::DrawRectangle (const Standard_Real X, const Standard_Real Y, const Standard_Real Width, const Standard_Real Height) {
223 cout << "Visual3d_Layer::DrawRectangle" << endl;
226 Visual3d_LayerDefinitionError::Raise
227 ("Layer is not open !");
228 if (theTypeOfPrimitive != Graphic3d_TOP_UNDEFINED )
229 Visual3d_LayerDefinitionError::Raise
230 ("One primitive is already open !");
232 Standard_ShortReal x = Standard_ShortReal (X);
233 Standard_ShortReal y = Standard_ShortReal (Y);
234 Standard_ShortReal width = Standard_ShortReal (Width);
235 Standard_ShortReal height = Standard_ShortReal (Height);
236 MyGraphicDriver->Rectangle (x, y, width, height);
242 void Visual3d_Layer::DrawText (const Standard_CString AText, const Standard_Real X, const Standard_Real Y, const Standard_Real AHeight) {
244 cout << "Visual3d_Layer::DrawText" << endl;
247 Visual3d_LayerDefinitionError::Raise
248 ("Layer is not open !");
249 if (theTypeOfPrimitive != Graphic3d_TOP_UNDEFINED )
250 Visual3d_LayerDefinitionError::Raise
251 ("One primitive is already open !");
253 Standard_ShortReal x = Standard_ShortReal (X);
254 Standard_ShortReal y = Standard_ShortReal (Y);
255 Standard_ShortReal height = Standard_ShortReal (AHeight);
256 MyGraphicDriver->Text (AText, x, y, height);
259 void Visual3d_Layer::SetColor (const Quantity_Color& AColor) {
261 cout << "Visual3d_Layer::SetColor" << endl;
264 Visual3d_LayerDefinitionError::Raise
265 ("Layer is not open !");
267 Standard_ShortReal r = Standard_ShortReal (AColor.Red());
268 Standard_ShortReal g = Standard_ShortReal (AColor.Green());
269 Standard_ShortReal b = Standard_ShortReal (AColor.Blue());
271 cout << "\tSetColor : " << r << ", " << g << ", " << b << endl;
273 MyGraphicDriver->SetColor (r, g, b);
276 void Visual3d_Layer::SetTransparency (const Standard_ShortReal ATransparency) {
278 cout << "Visual3d_Layer::SetTransparency" << endl;
281 Visual3d_LayerDefinitionError::Raise
282 ("Layer is not open !");
285 cout << "\tSetTransparency : " << ATransparency << endl;
287 MyGraphicDriver->SetTransparency (ATransparency);
290 void Visual3d_Layer::UnsetTransparency () {
292 cout << "Visual3d_Layer::UnsetTransparency" << endl;
295 Visual3d_LayerDefinitionError::Raise
296 ("Layer is not open !");
299 cout << "\tUnsetTransparency" << endl;
301 MyGraphicDriver->UnsetTransparency ();
307 void Visual3d_Layer::TextSize (const Standard_CString AText, const Standard_Real AHeight, Standard_Real& AWidth, Standard_Real& AnAscent, Standard_Real& ADescent) const {
308 Standard_ShortReal aWidth, anAscent, aDescent;
311 cout << "Visual3d_Layer::TextSize" << endl;
314 Visual3d_LayerDefinitionError::Raise
315 ("Layer is not open !");
316 if (theTypeOfPrimitive != Graphic3d_TOP_UNDEFINED )
317 Visual3d_LayerDefinitionError::Raise
318 ("One primitive is already open !");
320 MyGraphicDriver->TextSize (AText, (Standard_ShortReal)AHeight, aWidth, anAscent, aDescent);
326 void Visual3d_Layer::SetLineAttributes (const Aspect_TypeOfLine AType, const Standard_Real AWidth) {
328 cout << "Visual3d_Layer::SetLineAttributes" << endl;
331 Visual3d_LayerDefinitionError::Raise
332 ("Layer is not open !");
334 Standard_Integer type = AType;
335 Standard_ShortReal width = Standard_ShortReal (AWidth);
337 cout << "\tSetLineAttributes : " << type << ", " << width << endl;
339 MyGraphicDriver->SetLineAttributes (type, width);
342 void Visual3d_Layer::SetTextAttributes (const Standard_CString AFont, const Aspect_TypeOfDisplayText AType, const Quantity_Color& AColor) {
344 cout << "Visual3d_Layer::SetTextAttributes" << endl;
347 Visual3d_LayerDefinitionError::Raise
348 ("Layer is not open !");
350 Standard_CString font = (char*)AFont;
351 Standard_Integer type = AType;
352 Standard_ShortReal r = Standard_ShortReal (AColor.Red());
353 Standard_ShortReal g = Standard_ShortReal (AColor.Green());
354 Standard_ShortReal b = Standard_ShortReal (AColor.Blue());
356 cout << "\tSetTextAttributes : " << font << ", " << type << endl;
357 cout << "\t " << r << ", " << g << ", " << b << endl;
359 MyGraphicDriver->SetTextAttributes (font, type, r, g, b);
362 void Visual3d_Layer::SetOrtho (const Standard_Real Left, const Standard_Real Right, const Standard_Real Bottom, const Standard_Real Top, const Aspect_TypeOfConstraint Attach) {
364 cout << "Visual3d_Layer::SetOrtho" << endl;
367 MyCLayer.ortho[0] = Standard_ShortReal (Left);
368 MyCLayer.ortho[1] = Standard_ShortReal (Right);
369 MyCLayer.ortho[2] = Standard_ShortReal (Bottom);
370 MyCLayer.ortho[3] = Standard_ShortReal (Top);
371 MyCLayer.attach = Standard_Integer (Attach);
374 void Visual3d_Layer::SetViewport (const Standard_Integer Width, const Standard_Integer Height) {
376 cout << "Visual3d_Layer::SetViewport" << endl;
379 MyCLayer.viewport[0] = float (Width);
380 MyCLayer.viewport[1] = float (Height);
383 Aspect_CLayer2d Visual3d_Layer::CLayer () const {
385 cout << "Visual3d_Layer::CLayer" << endl;
388 cout << "Visual3d_Layer::CLayer" << endl;
389 call_def_ptrLayer ptrLayer;
390 ptrLayer = (call_def_ptrLayer) MyCLayer.ptrLayer;
391 if (ptrLayer == NULL)
392 cout << "\tptrLayer == NULL" << endl;
394 cout << "\tptrLayer->listIndex = " << ptrLayer->listIndex << endl;
399 Aspect_TypeOfLayer Visual3d_Layer::Type () const {
401 cout << "Visual3d_Layer::Type" << endl;
403 return Aspect_TypeOfLayer (MyCLayer.layerType);
407 void Visual3d_Layer::AddLayerItem( const Handle(Visual3d_LayerItem&) Item )
409 MyListOfLayerItems.Append( Item );
412 void Visual3d_Layer::RemoveLayerItem( const Handle(Visual3d_LayerItem&) Item )
414 if ( MyListOfLayerItems.IsEmpty() )
417 Visual3d_NListOfLayerItem::Iterator it( MyListOfLayerItems );
418 for( ; it.More(); it.Next() ) {
419 if ( it.Value() == Item ) {
420 MyListOfLayerItems.Remove( it );
426 void Visual3d_Layer::RemoveAllLayerItems()
428 MyListOfLayerItems.Clear();
431 const Visual3d_NListOfLayerItem& Visual3d_Layer::GetLayerItemList() const
433 return MyListOfLayerItems;
436 void Visual3d_Layer::RenderLayerItems() const
438 theLayerState = Standard_True;
440 const Visual3d_NListOfLayerItem& items = GetLayerItemList();
441 Visual3d_NListOfLayerItem::Iterator it(items);
442 for(; it.More(); it.Next() ) {
443 it.Value()->RedrawLayerPrs();
446 theLayerState = Standard_False;