0024776: Visualization - inherit OpenGl_View from Graphic3d_CView
authorapl <apl@opencascade.com>
Tue, 22 Sep 2015 08:49:33 +0000 (11:49 +0300)
committerkgv <kgv@opencascade.com>
Tue, 22 Sep 2015 08:49:33 +0000 (11:49 +0300)
Expose interface of OpenGl_View (OpenGL graphics rendering methods) to client code
and collecting all high-level API methods of application views in V3d_View class.

1) Exposing interface of OpenGl_View:

The OpenGl_View inherits from new class Graphic3d_CView.
Graphic3d_CView is an interface class that declares abstract methods for managing displayed structures,
display properties and a base layer code that implements computation
and management of HLR (or more broadly speaking view-depended) structures.

In new implementation it takes place of eliminated Visual3d_View.
As before the instance of Graphic3d_CView is still completely managed by V3d_View classes.
It can be accessed through V3d_View interface but normally this should not be required as all its methods are completely wrapped.

In more details, a concrete specialization of Graphic3d_CView is created and returned by graphical driver on request.
Right after creation the views is directly used for setting rendering properties and adding graphical structures to be displayed.

The rendering of graphics is possible after mapping a window and activating the view.
The direct setting of properties makes obsolete usage of intermediate structures with display parameter
like Visual3d_ContextView and etc (the whole package of Visual3d become redundant).

2) Collecting all high-level API methods of application views in V3d package:

The patch includes elimination of Visual3d layer.
All of its methods that could be previously used by application are now exposed and should be accessed on the level of V3d entities.
- Introduced new class Graphic3d_CView.
  This is a base class for render views.
  Made possible to specialize concrete instances of the class by graphical driver.
- Moved all methods managing rendering views into interface of Graphic3d_CView.
  The corresponding methods were removed from interface of graphical driver.

3) Eliminated Visual3d package:

- Logic of managing display of structures was put from Visual3d_ViewManager into Graphic3d_StructureManager.
- Removed Visual3d_View class. Logic of managing computed structures was put into base layer of Graphi3d_CView.
- Removed all intermediate structures for storing view parameters e.g. Visual3d_ContextView.
  All settings are kept by instances of Graphic3d_CView
- Removed Visual3d_Light intermediate class.
  All light properties are still stored in Graphic3d_CLight structure.
  The structure is directly access by instance of V3d_Light classes.
- Moved all needed enumerations into Graphic3d package.

4) Update package D3DHost to new changes.

5) Update code of OCCT samples to new changes.

159 files changed:
adm/UDLIST
samples/CSharp/OCCTProxy_D3D/OCCTProxyD3D.cpp
samples/mfc/standard/03_Viewer2d/src/StdAfx.h
samples/mfc/standard/Common/OCC_3dView.cpp
samples/mfc/standard/Common/OCC_BaseDoc.cpp
samples/mfc/standard/Common/StdAfx.h
samples/qt/Common/src/View.cxx
src/AIS/AIS_InteractiveContext.cxx
src/AIS/AIS_InteractiveContext_1.cxx
src/AIS/AIS_InteractiveContext_2.cxx
src/AIS/AIS_LocalContext.cxx
src/AIS/AIS_LocalContext_1.cxx
src/Aspect/Aspect_GraphicCallbackProc.hxx
src/D3DHost/D3DHost_GraphicDriver.cxx
src/D3DHost/D3DHost_GraphicDriver.hxx
src/D3DHost/D3DHost_View.cxx [moved from src/D3DHost/D3DHost_Workspace.cxx with 66% similarity]
src/D3DHost/D3DHost_View.hxx [moved from src/D3DHost/D3DHost_Workspace.hxx with 55% similarity]
src/D3DHost/FILES
src/Graphic3d/FILES
src/Graphic3d/Graphic3d_CAspectFillArea.hxx
src/Graphic3d/Graphic3d_CAspectLine.hxx
src/Graphic3d/Graphic3d_CAspectMarker.hxx
src/Graphic3d/Graphic3d_CAspectText.hxx
src/Graphic3d/Graphic3d_CLight.hxx
src/Graphic3d/Graphic3d_CStructure.hxx
src/Graphic3d/Graphic3d_CView.cxx [new file with mode: 0644]
src/Graphic3d/Graphic3d_CView.hxx
src/Graphic3d/Graphic3d_Camera.cxx
src/Graphic3d/Graphic3d_GraduatedTrihedron.hxx
src/Graphic3d/Graphic3d_GraphicDriver.cxx
src/Graphic3d/Graphic3d_GraphicDriver.hxx
src/Graphic3d/Graphic3d_Group.cxx
src/Graphic3d/Graphic3d_MaterialAspect.hxx
src/Graphic3d/Graphic3d_Structure.cxx
src/Graphic3d/Graphic3d_StructureManager.cxx
src/Graphic3d/Graphic3d_StructureManager.hxx
src/Graphic3d/Graphic3d_TextureEnv.hxx
src/Graphic3d/Graphic3d_TypeOfAnswer.hxx [moved from src/Visual3d/Visual3d_TypeOfAnswer.hxx with 81% similarity]
src/Graphic3d/Graphic3d_TypeOfBackfacingModel.hxx [moved from src/Visual3d/Visual3d_TypeOfBackfacingModel.hxx with 77% similarity]
src/Graphic3d/Graphic3d_TypeOfLightSource.hxx [moved from src/Visual3d/Visual3d_TypeOfLightSource.hxx with 76% similarity]
src/Graphic3d/Graphic3d_TypeOfShadingModel.hxx [moved from src/Visual3d/Visual3d_TypeOfModel.hxx with 56% similarity]
src/Graphic3d/Graphic3d_TypeOfSurfaceDetail.hxx [moved from src/Visual3d/Visual3d_TypeOfSurfaceDetail.hxx with 78% similarity]
src/Graphic3d/Graphic3d_TypeOfVisualization.hxx [moved from src/Visual3d/Visual3d_TypeOfVisualization.hxx with 78% similarity]
src/InterfaceGraphic/FILES
src/InterfaceGraphic/InterfaceGraphic_Aspect.hxx [deleted file]
src/InterfaceGraphic/InterfaceGraphic_Visual3d.hxx [deleted file]
src/OpenGl/FILES
src/OpenGl/OpenGl_CView.hxx [deleted file]
src/OpenGl/OpenGl_Context.cxx
src/OpenGl/OpenGl_Context.hxx
src/OpenGl/OpenGl_GraduatedTrihedron.cxx
src/OpenGl/OpenGl_GraduatedTrihedron.hxx
src/OpenGl/OpenGl_GraphicDriver.cxx
src/OpenGl/OpenGl_GraphicDriver.hxx
src/OpenGl/OpenGl_GraphicDriver_4.cxx [deleted file]
src/OpenGl/OpenGl_GraphicDriver_7.cxx [deleted file]
src/OpenGl/OpenGl_GraphicDriver_713.cxx [deleted file]
src/OpenGl/OpenGl_GraphicDriver_Export.cxx [deleted file]
src/OpenGl/OpenGl_Group.cxx
src/OpenGl/OpenGl_Layer.cxx
src/OpenGl/OpenGl_LayerList.cxx
src/OpenGl/OpenGl_LayerList.hxx
src/OpenGl/OpenGl_Light.hxx
src/OpenGl/OpenGl_MapOfZLayerSettings.hxx [moved from src/Visual3d/Visual3d_MapOfZLayerSettings.hxx with 81% similarity]
src/OpenGl/OpenGl_ShaderManager.cxx
src/OpenGl/OpenGl_ShaderManager.hxx
src/OpenGl/OpenGl_ShaderStates.hxx
src/OpenGl/OpenGl_Text.cxx
src/OpenGl/OpenGl_Trihedron.cxx
src/OpenGl/OpenGl_Trihedron.hxx
src/OpenGl/OpenGl_View.cxx
src/OpenGl/OpenGl_View.hxx
src/OpenGl/OpenGl_View_2.cxx [deleted file]
src/OpenGl/OpenGl_View_Print.cxx [moved from src/OpenGl/OpenGl_Workspace_2.cxx with 82% similarity]
src/OpenGl/OpenGl_View_Raytrace.cxx
src/OpenGl/OpenGl_View_Redraw.cxx [new file with mode: 0644]
src/OpenGl/OpenGl_Window.cxx
src/OpenGl/OpenGl_Window.hxx
src/OpenGl/OpenGl_Window_1.mm
src/OpenGl/OpenGl_Workspace.cxx
src/OpenGl/OpenGl_Workspace.hxx
src/OpenGl/OpenGl_Workspace_5.cxx [deleted file]
src/OpenGl/OpenGl_telem_util.cxx
src/PrsMgr/PrsMgr_Presentation.cxx
src/PrsMgr/PrsMgr_PresentationManager.cxx
src/PrsMgr/PrsMgr_PresentationManager.hxx
src/PrsMgr/PrsMgr_PresentationManager.lxx
src/QABugs/QABugs_8.cxx
src/StdSelect/StdSelect_ViewerSelector3d.cxx
src/TKV3d/CMakeLists.txt
src/TKV3d/PACKAGES
src/V3d/V3d.cxx
src/V3d/V3d.hxx
src/V3d/V3d_AmbientLight.cxx
src/V3d/V3d_AmbientLight.hxx
src/V3d/V3d_CircularGrid.cxx
src/V3d/V3d_DirectionalLight.cxx
src/V3d/V3d_DirectionalLight.hxx
src/V3d/V3d_Light.cxx
src/V3d/V3d_Light.hxx
src/V3d/V3d_Plane.cxx
src/V3d/V3d_PositionLight.cxx
src/V3d/V3d_PositionLight.hxx
src/V3d/V3d_PositionalLight.cxx
src/V3d/V3d_PositionalLight.hxx
src/V3d/V3d_RectangularGrid.cxx
src/V3d/V3d_SpotLight.cxx
src/V3d/V3d_SpotLight.hxx
src/V3d/V3d_TypeOfShadingModel.hxx
src/V3d/V3d_View.cxx
src/V3d/V3d_View.hxx
src/V3d/V3d_View_1.cxx
src/V3d/V3d_View_2.cxx
src/V3d/V3d_View_3.cxx
src/V3d/V3d_View_4.cxx
src/V3d/V3d_View_5.cxx
src/V3d/V3d_View_Print.cxx
src/V3d/V3d_Viewer.cxx
src/V3d/V3d_Viewer.hxx
src/V3d/V3d_Viewer_1.cxx
src/V3d/V3d_Viewer_2.cxx
src/V3d/V3d_Viewer_3.cxx
src/V3d/V3d_Viewer_4.cxx
src/ViewerTest/ViewerTest_ObjectCommands.cxx
src/ViewerTest/ViewerTest_OpenGlCommands.cxx
src/ViewerTest/ViewerTest_ViewerCommands.cxx
src/Visual3d/FILES [deleted file]
src/Visual3d/Visual3d_ClipDefinitionError.hxx [deleted file]
src/Visual3d/Visual3d_ContextPick.cxx [deleted file]
src/Visual3d/Visual3d_ContextPick.hxx [deleted file]
src/Visual3d/Visual3d_ContextPickDefinitionError.hxx [deleted file]
src/Visual3d/Visual3d_ContextView.cxx [deleted file]
src/Visual3d/Visual3d_ContextView.hxx [deleted file]
src/Visual3d/Visual3d_DepthCueingDefinitionError.hxx [deleted file]
src/Visual3d/Visual3d_HSequenceOfLight.hxx [deleted file]
src/Visual3d/Visual3d_HSequenceOfView.hxx [deleted file]
src/Visual3d/Visual3d_LayerDefinitionError.hxx [deleted file]
src/Visual3d/Visual3d_Light.cxx [deleted file]
src/Visual3d/Visual3d_Light.hxx [deleted file]
src/Visual3d/Visual3d_LightDefinitionError.hxx [deleted file]
src/Visual3d/Visual3d_NListOfLayerItem.hxx [deleted file]
src/Visual3d/Visual3d_PickError.hxx [deleted file]
src/Visual3d/Visual3d_SequenceOfLight.hxx [deleted file]
src/Visual3d/Visual3d_SequenceOfView.hxx [deleted file]
src/Visual3d/Visual3d_TransformError.hxx [deleted file]
src/Visual3d/Visual3d_TypeOfOrder.hxx [deleted file]
src/Visual3d/Visual3d_TypeOfProjection.hxx [deleted file]
src/Visual3d/Visual3d_View.cxx [deleted file]
src/Visual3d/Visual3d_View.hxx [deleted file]
src/Visual3d/Visual3d_ViewDefinitionError.hxx [deleted file]
src/Visual3d/Visual3d_ViewManager.cxx [deleted file]
src/Visual3d/Visual3d_ViewManager.hxx [deleted file]
src/Visual3d/Visual3d_ViewManagerDefinitionError.hxx [deleted file]
src/Visual3d/Visual3d_ViewManagerPtr.hxx [deleted file]
src/Visual3d/Visual3d_ViewMappingDefinitionError.hxx [deleted file]
src/Visual3d/Visual3d_ViewOrientationDefinitionError.hxx [deleted file]
src/Visual3d/Visual3d_ViewPtr.hxx [deleted file]
src/Visual3d/Visual3d_ZClippingDefinitionError.hxx [deleted file]
tests/bugs/vis/bug25671

index 29d3f31..c6ecf10 100644 (file)
@@ -212,7 +212,6 @@ n StdPrs
 n StdSelect
 n TColQuantity
 n V3d
-n Visual3d
 n Voxel
 n WNT
 n Xw
index 44a637a..a1a237a 100644 (file)
 #include <Graphic3d_Camera.hxx>
 #include <Graphic3d_TextureParams.hxx>
 #include <D3DHost_GraphicDriver.hxx>
+#include <D3DHost_View.hxx>
 //for object display
 #include <V3d_Viewer.hxx>
 #include <V3d_View.hxx>
-#include <Visual3d_View.hxx>
 #include <AIS_InteractiveContext.hxx>
 #include <AIS_Shape.hxx>
 //topology
@@ -106,7 +106,7 @@ public:
     aWNTWindow->SetPos (0, 0, theWinSizeX, theWinSizeY);
     myView()->MustBeResized();
     myView()->Invalidate();
-    return System::IntPtr(myGraphicDriver()->D3dColorSurface (myView()->View()));
+    return System::IntPtr(Handle(D3DHost_View)::DownCast (myView()->View())->D3dColorSurface());
   }
 
   /// <summary>
index 25e3a10..65799e0 100755 (executable)
 #include <TColgp_HArray1OfPnt2d.hxx>
 #include <TopoDS_Shape.hxx>
 #include <TopoDS.hxx>
-#include <Visual3d_ViewManager.hxx>
 #include <V3d_View.hxx>
 #include <V3d_Viewer.hxx>
 #include <WNT_Window.hxx>
index 4842ba1..8c5c577 100755 (executable)
@@ -8,8 +8,6 @@
 #include "OCC_3dBaseDoc.h"
 #include <res\OCC_Resource.h>
 
-#include <Visual3d_View.hxx>
-
 #include <Graphic3d_ExportFormat.hxx>
 #include <Graphic3d_Camera.hxx>
 
index bf58d76..1ceb699 100755 (executable)
@@ -42,7 +42,7 @@ void OCC_BaseDoc::ExportView (const Handle(V3d_View)& theView) const
       else if (!(aFileExt.CompareNoCase (L"svg"))) anExportFormat = Graphic3d_EF_SVG;
       else anExportFormat = Graphic3d_EF_PGF;
 
-      theView->View()->Export (aFileName.ToCString(), anExportFormat);
+      theView->Export (aFileName.ToCString(), anExportFormat);
     }
     else
     {
index 36d25e7..0f0303b 100755 (executable)
 #include <TopTools_HSequenceOfShape.hxx>
 #include <TopTools_IndexedMapOfShape.hxx>
 
-#include <Visual3d_View.hxx>
 #include <V3d_Viewer.hxx>
 #include <V3d_View.hxx>
 #include <WNT_Window.hxx>
index 0a8a56f..929a6c0 100755 (executable)
@@ -17,7 +17,6 @@
 #include <QMdiSubWindow>
 #include <QStyleFactory>
 
-#include <Visual3d_View.hxx>
 #include <Graphic3d_ExportFormat.hxx>
 #include <Graphic3d_GraphicDriver.hxx>
 #include <Graphic3d_TextureEnv.hxx>
@@ -1147,7 +1146,7 @@ bool View::dump(Standard_CString theFile)
       exFormat = Graphic3d_EF_PGF;
     try
     {
-      myView->View()->Export( theFile, exFormat );
+      myView->Export( theFile, exFormat );
     }
     catch(...)
     {
index 158f897..aa5f229 100644 (file)
@@ -61,8 +61,6 @@
 #include <UnitsAPI.hxx>
 #include <V3d_View.hxx>
 #include <V3d_Viewer.hxx>
-#include <Visual3d_View.hxx>
-#include <Visual3d_ViewManager.hxx>
 
 //#include <AIS_DataMapIteratorOfDataMapOfInteractiveInteger.hxx>
 namespace
@@ -93,7 +91,7 @@ namespace
 
 AIS_InteractiveContext::AIS_InteractiveContext(const Handle(V3d_Viewer)& MainViewer):
 mgrSelector(new SelectMgr_SelectionManager()),
-myMainPM(new PrsMgr_PresentationManager3d(MainViewer->Viewer())),
+myMainPM(new PrsMgr_PresentationManager3d(MainViewer->StructureManager())),
 myMainVwr(MainViewer),
 myMainSel(new StdSelect_ViewerSelector3d()),
 myWasLastMain(Standard_False),
@@ -353,8 +351,8 @@ void AIS_InteractiveContext::ObjectsForView (AIS_ListOfInteractive&  theListOfIO
                                              const Standard_Boolean  theIsVisibleInView,
                                              const AIS_DisplayStatus theStatus) const
 {
-  const Graphic3d_CView* aCView  = reinterpret_cast<const Graphic3d_CView* >(theView->View()->CView());
-  const Standard_Integer aViewId = aCView->ViewId;
+  Handle(Graphic3d_CView) aViewImpl = theView->View();
+  const Standard_Integer  aViewId   = aViewImpl->Identification();
   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
   {
     if (theStatus != AIS_DS_None
@@ -364,7 +362,7 @@ void AIS_InteractiveContext::ObjectsForView (AIS_ListOfInteractive&  theListOfIO
       continue;
     }
 
-    Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->Viewer()->ObjectAffinity (anObjIter.Key());
+    Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->StructureManager()->ObjectAffinity (anObjIter.Key());
     const Standard_Boolean isVisible = anAffinity->IsVisible (aViewId);
     if (isVisible == theIsVisibleInView)
     {
@@ -406,9 +404,9 @@ void AIS_InteractiveContext::SetViewAffinity (const Handle(AIS_InteractiveObject
     return;
   }
 
-  Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->Viewer()->ObjectAffinity (theIObj);
-  const Graphic3d_CView* aCView = reinterpret_cast<const Graphic3d_CView* >(theView->View()->CView());
-  anAffinity->SetVisible (aCView->ViewId, theIsVisible == Standard_True);
+  Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->StructureManager()->ObjectAffinity (theIObj);
+  Handle(Graphic3d_CView) aViewImpl = theView->View();
+  anAffinity->SetVisible (aViewImpl->Identification(), theIsVisible == Standard_True);
   if (theIsVisible)
   {
     theView->View()->ChangeHiddenObjects()->Remove (theIObj.get());
@@ -470,7 +468,7 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
   {
     Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Displayed, theDispMode, theSelectionMode);
     myObjects.Bind   (theIObj, aStatus);
-    Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->Viewer()->RegisterObject (theIObj);
+    Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->StructureManager()->RegisterObject (theIObj);
     myMainPM->Display(theIObj, theDispMode);
     if (theSelectionMode != -1)
     {
@@ -2532,7 +2530,7 @@ void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& t
   mgrSelector->Remove (anObj);
 
   myObjects.UnBind (theIObj);
-  myMainVwr->Viewer()->UnregisterObject (theIObj);
+  myMainVwr->StructureManager()->UnregisterObject (theIObj);
   for (myMainVwr->InitDefinedViews(); myMainVwr->MoreDefinedViews(); myMainVwr->NextDefinedViews())
   {
     myMainVwr->DefinedView()->View()->ChangeHiddenObjects()->Remove (theIObj.get());
index 5cc7814..81cdbf3 100644 (file)
@@ -52,7 +52,6 @@
 #include <V3d_SpotLight.hxx>
 #include <V3d_View.hxx>
 #include <V3d_Viewer.hxx>
-#include <Visual3d_View.hxx>
 
 typedef NCollection_DataMap<Handle(AIS_InteractiveObject), NCollection_Handle<SelectMgr_SequenceOfOwner> > AIS_MapOfObjSelectedOwners;
 
index 9b92c5f..30e50ce 100644 (file)
@@ -687,7 +687,7 @@ Standard_Integer AIS_InteractiveContext::PurgeDisplay()
 //=======================================================================
 Standard_Integer AIS_InteractiveContext::PurgeViewer(const Handle(V3d_Viewer)& Vwr)
 {
-  Handle(Graphic3d_StructureManager) GSM = Vwr->Viewer();
+  Handle(Graphic3d_StructureManager) GSM = Vwr->StructureManager();
   Standard_Integer NbCleared(0);
   Graphic3d_MapOfStructure SOS;
   GSM->DisplayedStructures(SOS);
index d4c400f..1d992a8 100644 (file)
@@ -47,7 +47,6 @@
 #include <TopoDS_Shape.hxx>
 #include <V3d_View.hxx>
 #include <V3d_Viewer.hxx>
-#include <Visual3d_View.hxx>
 
 #include <stdio.h>
 static TCollection_AsciiString AIS_Local_SelName(const Standard_Address address,
index a52a2e4..d04e392 100644 (file)
@@ -52,7 +52,6 @@
 #include <TColStd_MapOfTransient.hxx>
 #include <TopoDS_Shape.hxx>
 #include <V3d_View.hxx>
-#include <Visual3d_View.hxx>
 
 static Standard_Integer GetHiMod(const Handle(AIS_InteractiveObject)& IO)
 {
index 94a9e1a..f6bb079 100644 (file)
@@ -19,6 +19,7 @@
 #include <Aspect_Display.hxx>
 #include <Aspect_Drawable.hxx>
 #include <Aspect_RenderingContext.hxx>
+#include <Standard_Handle.hxx>
 #include <Standard_Transient.hxx>
 
 // The flags below provide additional information to define the moment when
index 23ece91..50c3a33 100644 (file)
 #include <d3d9.h>
 
 #include <D3DHost_GraphicDriver.hxx>
-
-#include <D3DHost_Workspace.hxx>
-#include <OpenGl_CView.hxx>
-#include <Visual3d_View.hxx>
+#include <D3DHost_View.hxx>
 
 #ifdef _MSC_VER
   #pragma comment (lib, "D3D9.lib")
@@ -48,57 +45,19 @@ D3DHost_GraphicDriver::~D3DHost_GraphicDriver()
 // function : View
 // purpose  :
 // =======================================================================
-Standard_Boolean D3DHost_GraphicDriver::View (Graphic3d_CView& theCView)
+Handle(Graphic3d_CView) D3DHost_GraphicDriver::CreateView (const Handle(Graphic3d_StructureManager)& theMgr)
 {
-  Handle(OpenGl_Context) aShareCtx = GetSharedContext();
-  OpenGl_CView*          aCView = (OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL
-   && myMapOfView.Contains (aCView->View))
-  {
-    Handle(D3DHost_Workspace) anOldWS = Handle(D3DHost_Workspace)::DownCast (aCView->WS);
-    Handle(D3DHost_Workspace) aWS     = new D3DHost_Workspace (this, theCView.DefWindow, theCView.GContext, myCaps, aShareCtx);
-    theCView.ptrFBO = aWS->D3dWglBuffer().operator->();
-    aCView->WS = aWS;
-    aWS->SetActiveView (aCView->View, theCView.ViewId);
-
-    myMapOfWS.Remove (anOldWS);
-    myMapOfWS.Add    (aWS);
-    return Standard_True;
-  }
+  Handle(D3DHost_View) aView = new D3DHost_View (theMgr, this, myCaps, myDeviceLostFlag, &myStateCounter);
 
-  Handle(D3DHost_Workspace) aWS       = new D3DHost_Workspace (this, theCView.DefWindow, theCView.GContext, myCaps, aShareCtx);
-  Handle(OpenGl_View)       aView     = new OpenGl_View (theCView.Context, &myStateCounter);
-  myMapOfWS  .Add (aWS);
   myMapOfView.Add (aView);
 
-  aCView = new OpenGl_CView();
-  aCView->View = aView;
-  aCView->WS   = aWS;
-  theCView.ptrFBO  = aWS->D3dWglBuffer().operator->();
-  theCView.ptrView = aCView;
-  aWS->SetActiveView (aCView->View, theCView.ViewId);
-  return Standard_True;
-}
-
-// =======================================================================
-// function : D3dColorSurface
-// purpose  :
-// =======================================================================
-IDirect3DSurface9* D3DHost_GraphicDriver::D3dColorSurface (const Handle(Visual3d_View)& theView) const
-{
-  Graphic3d_CView* aCView = (Graphic3d_CView* )(theView->CView());
-  if (aCView == NULL
-   || aCView->ptrView == NULL)
-  {
-    return NULL;
-  }
-
-  Handle(D3DHost_Workspace) aWS = Handle(D3DHost_Workspace)::DownCast (((OpenGl_CView* )aCView->ptrView)->WS);
-  if (aWS.IsNull()
-   || aWS->D3dWglBuffer().IsNull())
+  for (TColStd_SequenceOfInteger::Iterator aLayerIt (myLayerSeq); aLayerIt.More(); aLayerIt.Next())
   {
-    return NULL;
+    const Graphic3d_ZLayerId        aLayerID  = aLayerIt.Value();
+    const Graphic3d_ZLayerSettings& aSettings = myMapOfZLayerSettings.Find (aLayerID);
+    aView->AddZLayer         (aLayerID);
+    aView->SetZLayerSettings (aLayerID, aSettings);
   }
 
-  return aWS->D3dWglBuffer()->D3dColorSurface();
+  return aView;
 }
index 092017c..1cf41cf 100644 (file)
@@ -18,9 +18,6 @@
 
 #include <OpenGl_GraphicDriver.hxx>
 
-class Visual3d_View;
-struct IDirect3DSurface9;
-
 //! This class defines D3D host for an OpenGl graphic driver
 class D3DHost_GraphicDriver : public OpenGl_GraphicDriver
 {
@@ -32,11 +29,8 @@ public:
   //! Destructor.
   Standard_EXPORT virtual ~D3DHost_GraphicDriver();
 
-  //! Create new view.
-  Standard_EXPORT virtual Standard_Boolean View (Graphic3d_CView& theCView);
-
-  //! Return D3D surface for specified view.
-  Standard_EXPORT IDirect3DSurface9* D3dColorSurface (const Handle(Visual3d_View)& theCView) const;
+  //! Create instance of D3D host view.
+  Standard_EXPORT virtual Handle(Graphic3d_CView) CreateView (const Handle(Graphic3d_StructureManager)& theMgr) Standard_OVERRIDE;
 
 public:
 
similarity index 66%
rename from src/D3DHost/D3DHost_Workspace.cxx
rename to src/D3DHost/D3DHost_View.cxx
index 2277a95..e499b45 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#include <d3d9.h>
-
-#include <D3DHost_Workspace.hxx>
+#include <D3DHost_View.hxx>
 
+#include <D3DHost_GraphicDriver.hxx>
 #include <TCollection_ExtendedString.hxx>
 
 // =======================================================================
 // function : d3dFormatError
 // purpose  :
 // =======================================================================
-TCollection_AsciiString D3DHost_Workspace::d3dFormatError (HRESULT theErrCode)
+TCollection_AsciiString D3DHost_View::d3dFormatError (HRESULT theErrCode)
 {
   switch (theErrCode)
   {
@@ -38,15 +37,15 @@ TCollection_AsciiString D3DHost_Workspace::d3dFormatError (HRESULT theErrCode)
 }
 
 // =======================================================================
-// function : D3DHost_Workspace
+// function : D3DHost_View
 // purpose  :
 // =======================================================================
-D3DHost_Workspace::D3DHost_Workspace (const Handle(OpenGl_GraphicDriver)& theDriver,
-                                      const CALL_DEF_WINDOW&              theCWindow,
-                                      Aspect_RenderingContext             theGContext,
-                                      const Handle(OpenGl_Caps)&          theCaps,
-                                      const Handle(OpenGl_Context)&       theShareCtx)
-: OpenGl_Workspace (theDriver, theCWindow, theGContext, theCaps, theShareCtx),
+D3DHost_View::D3DHost_View (const Handle(Graphic3d_StructureManager)& theMgr,
+                            const Handle(D3DHost_GraphicDriver)& theDriver,
+                            const Handle(OpenGl_Caps)& theCaps,
+                            Standard_Boolean& theDeviceLostFlag,
+                            OpenGl_StateCounter* theCounter)
+: OpenGl_View (theMgr, theDriver, theCaps, theDeviceLostFlag, theCounter),
   myD3dLib      (NULL),
   myD3dDevice   (NULL),
   myRefreshRate (D3DPRESENT_RATE_DEFAULT),
@@ -64,20 +63,17 @@ D3DHost_Workspace::D3DHost_Workspace (const Handle(OpenGl_GraphicDriver)& theDri
   myD3dParams.AutoDepthStencilFormat     = D3DFMT_D16_LOCKABLE;
   myD3dParams.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
   myD3dParams.PresentationInterval       = D3DPRESENT_INTERVAL_DEFAULT;
-
-  d3dInit (theCWindow);
-  d3dCreateRenderTarget();
 }
 
 // =======================================================================
-// function : ~D3DHost_Workspace
+// function : ~D3DHost_View
 // purpose  :
 // =======================================================================
-D3DHost_Workspace::~D3DHost_Workspace()
+D3DHost_View::~D3DHost_View()
 {
   if (!myD3dWglFbo.IsNull())
   {
-    myD3dWglFbo->Release (myGlContext.operator->());
+    myD3dWglFbo->Release (myWorkspace->GetGlContext().operator->());
     myD3dWglFbo.Nullify();
   }
   if (myD3dDevice != NULL)
@@ -93,10 +89,39 @@ D3DHost_Workspace::~D3DHost_Workspace()
 }
 
 // =======================================================================
+// function : SetWindow
+// purpose  :
+// =======================================================================
+void D3DHost_View::SetWindow (const Handle(Aspect_Window)& theWindow,
+                              const Aspect_RenderingContext theContext,
+                              const Aspect_GraphicCallbackProc& theDisplayCB,
+                              const Standard_Address theClientData)
+{
+  if (!myD3dWglFbo.IsNull())
+  {
+    myD3dWglFbo->Release (myWorkspace->GetGlContext().operator->());
+    myD3dWglFbo.Nullify();
+  }
+  if (myD3dDevice != NULL)
+  {
+    myD3dDevice->Release();
+    myD3dDevice = NULL;
+  }
+
+  OpenGl_View::SetWindow (theWindow, theContext, theDisplayCB, theClientData);
+
+  if (!myWindow.IsNull())
+  {
+    d3dInit();
+    d3dCreateRenderTarget();
+  }
+}
+
+// =======================================================================
 // function : d3dInitLib
 // purpose  :
 // =======================================================================
-bool D3DHost_Workspace::d3dInitLib()
+bool D3DHost_View::d3dInitLib()
 {
   if (myD3dLib == NULL)
   {
@@ -127,15 +152,15 @@ bool D3DHost_Workspace::d3dInitLib()
 // function : d3dInit
 // purpose  :
 // =======================================================================
-bool D3DHost_Workspace::d3dInit (const CALL_DEF_WINDOW& theCWindow)
+bool D3DHost_View::d3dInit()
 {
   if (!d3dInitLib())
   {
-    myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
-                              GL_DEBUG_TYPE_ERROR_ARB,
-                              0,
-                              GL_DEBUG_SEVERITY_HIGH_ARB,
-                              "Direct3DCreate9 failed!");
+    myWorkspace->GetGlContext()->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
+                                              GL_DEBUG_TYPE_ERROR_ARB,
+                                              0,
+                                              GL_DEBUG_SEVERITY_HIGH_ARB,
+                                              "Direct3DCreate9 failed!");
     return false;
   }
 
@@ -148,13 +173,13 @@ bool D3DHost_Workspace::d3dInit (const CALL_DEF_WINDOW& theCWindow)
     myRefreshRate = myCurrMode.RefreshRate;
   }
   myD3dParams.Windowed         = TRUE;
-  myD3dParams.BackBufferWidth  = theCWindow.dx;
-  myD3dParams.BackBufferHeight = theCWindow.dy;
-  myD3dParams.hDeviceWindow    = (HWND )theCWindow.XWindow;
+  myD3dParams.BackBufferWidth  = myWindow->Width();
+  myD3dParams.BackBufferHeight = myWindow->Height();
+  myD3dParams.hDeviceWindow    = (HWND )myWindow->PlatformWindow()->NativeHandle();
 
   // create the Video Device
   HRESULT isOK = myD3dLib->CreateDevice (anAdapterId, D3DDEVTYPE_HAL,
-                                         (HWND )theCWindow.XWindow,
+                                         (HWND )myWindow->PlatformWindow()->NativeHandle(),
                                          D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE,
                                          &myD3dParams, &myD3dDevice);
   if (isOK < 0)
@@ -169,7 +194,7 @@ bool D3DHost_Workspace::d3dInit (const CALL_DEF_WINDOW& theCWindow)
 // function : d3dReset
 // purpose  :
 // =======================================================================
-bool D3DHost_Workspace::d3dReset (const CALL_DEF_WINDOW& theCWindow)
+bool D3DHost_View::d3dReset()
 {
   if (myD3dDevice == NULL)
   {
@@ -177,9 +202,9 @@ bool D3DHost_Workspace::d3dReset (const CALL_DEF_WINDOW& theCWindow)
   }
 
   myD3dParams.Windowed         = TRUE;
-  myD3dParams.BackBufferWidth  = theCWindow.dx;
-  myD3dParams.BackBufferHeight = theCWindow.dy;
-  myD3dParams.hDeviceWindow    = (HWND )theCWindow.XWindow;
+  myD3dParams.BackBufferWidth  = myWindow->Width();
+  myD3dParams.BackBufferHeight = myWindow->Height();
+  myD3dParams.hDeviceWindow    = (HWND )myWindow->PlatformWindow()->NativeHandle();
   myD3dParams.FullScreen_RefreshRateInHz = !myD3dParams.Windowed ? myRefreshRate : 0;
 
   HRESULT isOK = myD3dDevice->Reset(&myD3dParams);
@@ -190,13 +215,17 @@ bool D3DHost_Workspace::d3dReset (const CALL_DEF_WINDOW& theCWindow)
 // function : d3dCreateRenderTarget
 // purpose  :
 // =======================================================================
-bool D3DHost_Workspace::d3dCreateRenderTarget()
+bool D3DHost_View::d3dCreateRenderTarget()
 {
   if (myD3dWglFbo.IsNull())
   {
     myD3dWglFbo = new D3DHost_FrameBuffer();
   }
-  if (!myD3dWglFbo->Init (myGlContext, myD3dDevice, myIsD3dEx, myWidth, myHeight))
+  if (!myD3dWglFbo->Init (myWorkspace->GetGlContext(),
+                          myD3dDevice,
+                          myIsD3dEx,
+                          myWindow->Width(),
+                          myWindow->Height()))
   {
     return false;
   }
@@ -209,7 +238,7 @@ bool D3DHost_Workspace::d3dCreateRenderTarget()
 // function : d3dBeginRender
 // purpose  :
 // =======================================================================
-void D3DHost_Workspace::d3dBeginRender()
+void D3DHost_View::d3dBeginRender()
 {
   if (myD3dDevice == NULL)
   {
@@ -225,7 +254,7 @@ void D3DHost_Workspace::d3dBeginRender()
 // function : d3dEndRender
 // purpose  :
 // =======================================================================
-void D3DHost_Workspace::d3dEndRender()
+void D3DHost_View::d3dEndRender()
 {
   if (myD3dDevice != NULL)
   {
@@ -237,7 +266,7 @@ void D3DHost_Workspace::d3dEndRender()
 // function : d3dSwap
 // purpose  :
 // =======================================================================
-bool D3DHost_Workspace::d3dSwap()
+bool D3DHost_View::d3dSwap()
 {
   if (myD3dDevice == NULL)
   {
@@ -249,11 +278,11 @@ bool D3DHost_Workspace::d3dSwap()
   {
     TCollection_ExtendedString aMsg = TCollection_ExtendedString()
       + "Direct3D9, Present device failed, " + d3dFormatError (isOK);
-    myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
-                              GL_DEBUG_TYPE_ERROR_ARB,
-                              0,
-                              GL_DEBUG_SEVERITY_HIGH_ARB,
-                              aMsg);
+    myWorkspace->GetGlContext()->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
+                                              GL_DEBUG_TYPE_ERROR_ARB,
+                                              0,
+                                              GL_DEBUG_SEVERITY_HIGH_ARB,
+                                              aMsg);
   }
   return isOK == D3D_OK;
 }
@@ -262,20 +291,21 @@ bool D3DHost_Workspace::d3dSwap()
 // function : Redraw
 // purpose  :
 // =======================================================================
-void D3DHost_Workspace::Redraw (const Graphic3d_CView& theCView)
+void D3DHost_View::Redraw()
 {
-  if (!Activate()
+  if (!myWorkspace->Activate()
     || myD3dDevice == NULL)
   {
     return;
   }
 
+  Handle(OpenGl_Context) aCtx = myWorkspace->GetGlContext();
   myToFlipOutput = Standard_True;
-  myD3dWglFbo->LockSurface   (myGlContext);
-  OpenGl_Workspace::Redraw (theCView);
-  myD3dWglFbo->UnlockSurface (myGlContext);
+  myD3dWglFbo->LockSurface   (aCtx);
+  OpenGl_View::Redraw();
+  myD3dWglFbo->UnlockSurface (aCtx);
   myToFlipOutput = Standard_False;
-  if (myGlContext->caps->buffersNoSwap)
+  if (aCtx->caps->buffersNoSwap)
   {
     return;
   }
@@ -296,27 +326,28 @@ void D3DHost_Workspace::Redraw (const Graphic3d_CView& theCView)
 // function : RedrawImmediate
 // purpose  :
 // =======================================================================
-void D3DHost_Workspace::RedrawImmediate (const Graphic3d_CView& theCView)
+void D3DHost_View::RedrawImmediate()
 {
+  Handle(OpenGl_Context) aCtx = myWorkspace->GetGlContext();
   if (!myTransientDrawToFront
    || !myBackBufferRestored
-   || (myGlContext->caps->buffersNoSwap && !myMainSceneFbos[0]->IsValid()))
+   || (aCtx->caps->buffersNoSwap && !myMainSceneFbos[0]->IsValid()))
   {
-    Redraw (theCView);
+    Redraw();
     return;
   }
-  else if (!Activate()
+  else if (!myWorkspace->Activate()
          || myD3dDevice == NULL)
   {
     return;
   }
 
   myToFlipOutput = Standard_True;
-  myD3dWglFbo->LockSurface   (myGlContext);
-  OpenGl_Workspace::RedrawImmediate (theCView);
-  myD3dWglFbo->UnlockSurface (myGlContext);
+  myD3dWglFbo->LockSurface   (aCtx);
+  OpenGl_View::RedrawImmediate();
+  myD3dWglFbo->UnlockSurface (aCtx);
   myToFlipOutput = Standard_False;
-  if (myGlContext->caps->buffersNoSwap)
+  if (aCtx->caps->buffersNoSwap)
   {
     return;
   }
@@ -337,24 +368,24 @@ void D3DHost_Workspace::RedrawImmediate (const Graphic3d_CView& theCView)
 // function : Resize
 // purpose  :
 // =======================================================================
-void D3DHost_Workspace::Resize (const CALL_DEF_WINDOW& theCWindow)
+void D3DHost_View::Resized()
 {
-  const Standard_Integer aWidthOld  = myWidth;
-  const Standard_Integer aHeightOld = myHeight;
-  OpenGl_Workspace::Resize (theCWindow);
-  if (aWidthOld  == myWidth
-   && aHeightOld == myHeight)
+  const Standard_Integer aWidthOld  = myWindow->Width();
+  const Standard_Integer aHeightOld = myWindow->Height();
+  OpenGl_View::Resized();
+  if (aWidthOld  == myWindow->Width()
+   && aHeightOld == myWindow->Height())
   {
     return;
   }
 
   if (!myD3dWglFbo.IsNull())
   {
-    myD3dWglFbo->Release (myGlContext.operator->());
+    myD3dWglFbo->Release (myWorkspace->GetGlContext().operator->());
   }
-  if (!myGlContext->caps->buffersNoSwap)
+  if (!myWorkspace->GetGlContext()->caps->buffersNoSwap)
   {
-    d3dReset (theCWindow);
+    d3dReset();
   }
   d3dCreateRenderTarget();
 }
similarity index 55%
rename from src/D3DHost/D3DHost_Workspace.hxx
rename to src/D3DHost/D3DHost_View.hxx
index 748010b..1c2d4cf 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#ifndef _D3DHost_Workspace_HeaderFile
-#define _D3DHost_Workspace_HeaderFile
+#ifndef _D3DHost_View_HeaderFile
+#define _D3DHost_View_HeaderFile
 
 #include <d3d9.h>
 
-#include <OpenGl_Workspace.hxx>
 #include <D3DHost_FrameBuffer.hxx>
+#include <OpenGl_View.hxx>
+#include <OpenGl_Workspace.hxx>
+
+class D3DHost_GraphicDriver;
 
-//! The D3D host containing OpenGL viewer.
-class D3DHost_Workspace : public OpenGl_Workspace
+//! The D3D host view implementation that overrides rendering methods.
+class D3DHost_View : public OpenGl_View
 {
 
 public:
 
-  //! Main constructor.
-  Standard_EXPORT D3DHost_Workspace (const Handle(OpenGl_GraphicDriver)& theDriver,
-                                     const CALL_DEF_WINDOW&              theCWindow,
-                                     Aspect_RenderingContext             theGContext,
-                                     const Handle(OpenGl_Caps)&          theCaps,
-                                     const Handle(OpenGl_Context)&       theShareCtx);
-
-  //! Destroy D3D connection and OpenGL workspace.
-  Standard_EXPORT virtual ~D3DHost_Workspace();
+  //! Constructor.
+  Standard_EXPORT D3DHost_View (const Handle(Graphic3d_StructureManager)& theMgr,
+                                const Handle(D3DHost_GraphicDriver)& theDriver,
+                                const Handle(OpenGl_Caps)& theCaps,
+                                Standard_Boolean& theDeviceLostFlag,
+                                OpenGl_StateCounter* theCounter);
+
+  //! Default destructor.
+  Standard_EXPORT virtual ~D3DHost_View();
+
+  //! Creates and maps rendering window to the view.
+  //! @param theWindow [in] the window.
+  //! @param theContext [in] the rendering context. If NULL the context will be created internally.
+  //! @param theDisplayCB [in] the display callback function. If is not a NULL value, then the callback will be
+  //! invoked at the end of the OCC graphic traversal and just before the swap of buffers.
+  //! @param theClientData [in] the client data for the callback.
+  Standard_EXPORT virtual void SetWindow (const Handle(Aspect_Window)& theWindow,
+                                          const Aspect_RenderingContext theContext,
+                                          const Aspect_GraphicCallbackProc& theDisplayCB,
+                                          const Standard_Address theClientData) Standard_OVERRIDE;
 
   //! Resizes the window.
-  Standard_EXPORT virtual void Resize (const CALL_DEF_WINDOW& theCWindow) Standard_OVERRIDE;
+  Standard_EXPORT virtual void Resized() Standard_OVERRIDE;
 
   //! Redraw the all content.
-  Standard_EXPORT virtual void Redraw (const Graphic3d_CView& theCView) Standard_OVERRIDE;
+  Standard_EXPORT virtual void Redraw() Standard_OVERRIDE;
 
   //! Redraw only immediate layer.
-  Standard_EXPORT virtual void RedrawImmediate (const Graphic3d_CView& theCView) Standard_OVERRIDE;
+  Standard_EXPORT virtual void RedrawImmediate() Standard_OVERRIDE;
 
 public:
 
@@ -57,6 +71,9 @@ public:
   //! Return D3D/WGL FBO.
   const Handle(D3DHost_FrameBuffer)& D3dWglBuffer() const { return myD3dWglFbo; }
 
+  //! Return D3D surface.
+  IDirect3DSurface9* D3dColorSurface() const { return myD3dWglFbo->D3dColorSurface(); }
+
 protected:
 
   //! Auxiliary method.
@@ -66,11 +83,11 @@ protected:
   Standard_EXPORT bool d3dInitLib();
 
   //! Initialize Direct3D output device.
-  Standard_EXPORT bool d3dInit (const CALL_DEF_WINDOW& theCWindow);
+  Standard_EXPORT bool d3dInit();
 
   //! Reset Direct3D output settings. Could be used to switch windowed/fullscreen modes.
   //! Use very carefully! Most objects should be released before and recreated after!
-  Standard_EXPORT bool d3dReset (const CALL_DEF_WINDOW& theCWindow);
+  Standard_EXPORT bool d3dReset();
 
   //! (Re-)create D3D surface.
   Standard_EXPORT bool d3dCreateRenderTarget();
@@ -97,10 +114,10 @@ protected:
 
 public:
 
-  DEFINE_STANDARD_RTTI(D3DHost_Workspace, OpenGl_Workspace)
+  DEFINE_STANDARD_RTTI(D3DHost_View, OpenGl_View)
 
 };
 
-DEFINE_STANDARD_HANDLE(D3DHost_Workspace, OpenGl_Workspace)
+DEFINE_STANDARD_HANDLE(D3DHost_View, OpenGl_View)
 
-#endif // _D3DHost_Workspace_HeaderFile
+#endif // #ifndef _D3DHost_View_HeaderFile
index fce5140..2fc633e 100644 (file)
@@ -2,5 +2,5 @@ D3DHost_GraphicDriver.hxx
 D3DHost_GraphicDriver.cxx
 D3DHost_FrameBuffer.hxx
 D3DHost_FrameBuffer.cxx
-D3DHost_Workspace.hxx
-D3DHost_Workspace.cxx
+D3DHost_View.hxx
+D3DHost_View.cxx
index 3cbda2d..6cfa10e 100755 (executable)
@@ -56,6 +56,7 @@ Graphic3d_CStructure.hxx
 Graphic3d_CStructurePtr.hxx
 Graphic3d_CTexture.hxx
 Graphic3d_CUserDraw.hxx
+Graphic3d_CView.cxx
 Graphic3d_CView.hxx
 Graphic3d_CycleError.hxx
 Graphic3d_DataStructure.pxx
@@ -145,19 +146,25 @@ Graphic3d_TransformError.hxx
 Graphic3d_TransformPers.hxx
 Graphic3d_TransformUtils.hxx
 Graphic3d_TransModeFlags.hxx
+Graphic3d_TypeOfAnswer.hxx
+Graphic3d_TypeOfBackfacingModel.hxx
 Graphic3d_TypeOfBackground.hxx
 Graphic3d_TypeOfComposition.hxx
 Graphic3d_TypeOfConnection.hxx
+Graphic3d_TypeOfLightSource.hxx
 Graphic3d_TypeOfMaterial.hxx
 Graphic3d_TypeOfPolygon.hxx
 Graphic3d_TypeOfPrimitive.hxx
 Graphic3d_TypeOfPrimitiveArray.hxx
 Graphic3d_TypeOfReflection.hxx
 Graphic3d_TypeOfShaderObject.hxx
+Graphic3d_TypeOfShadingModel.hxx
 Graphic3d_TypeOfStructure.hxx
+Graphic3d_TypeOfSurfaceDetail.hxx
 Graphic3d_TypeOfTexture.hxx
 Graphic3d_TypeOfTextureFilter.hxx
 Graphic3d_TypeOfTextureMode.hxx
+Graphic3d_TypeOfVisualization.hxx
 Graphic3d_Vec.hxx
 Graphic3d_Vec2.hxx
 Graphic3d_Vec3.hxx
index 14956a9..ad29d59 100644 (file)
@@ -15,9 +15,9 @@
 #ifndef _Graphic3d_CAspectFillArea_HeaderFile
 #define _Graphic3d_CAspectFillArea_HeaderFile
 
-#include <InterfaceGraphic_Visual3d.hxx>
 #include <Graphic3d_CTexture.hxx>
 #include <Graphic3d_ShaderProgram.hxx>
+#include <InterfaceGraphic_Graphic3d.hxx>
 
 class Graphic3d_CAspectFillArea
 {
index 45b9701..2a23153 100644 (file)
@@ -15,9 +15,9 @@
 #ifndef _Graphic3d_CAspectLine_HeaderFile
 #define _Graphic3d_CAspectLine_HeaderFile
 
-#include <InterfaceGraphic_Visual3d.hxx>
 #include <Graphic3d_CTexture.hxx>
 #include <Graphic3d_ShaderProgram.hxx>
+#include <InterfaceGraphic_Graphic3d.hxx>
 
 class Graphic3d_CAspectLine
 {
index f57b69b..3378f15 100644 (file)
 #define _Graphic3d_CAspectMarker_HeaderFile
 
 #include <Aspect_TypeOfMarker.hxx>
-#include <InterfaceGraphic_Visual3d.hxx>
 #include <Graphic3d_CTexture.hxx>
 #include <Graphic3d_MarkerImage.hxx>
 #include <Graphic3d_ShaderProgram.hxx>
+#include <InterfaceGraphic_Graphic3d.hxx>
 
 class Graphic3d_CAspectMarker
 {
index 036adca..572e5be 100644 (file)
@@ -15,9 +15,9 @@
 #ifndef _Graphic3d_CAspectText_HeaderFile
 #define _Graphic3d_CAspectText_HeaderFile
 
-#include <InterfaceGraphic_Visual3d.hxx>
 #include <Graphic3d_CTexture.hxx>
 #include <Graphic3d_ShaderProgram.hxx>
+#include <InterfaceGraphic_Graphic3d.hxx>
 
 class Graphic3d_CAspectText
 {
index bc8646f..c11200b 100644 (file)
 #ifndef _Graphic3d_CLight_HeaderFile
 #define _Graphic3d_CLight_HeaderFile
 
-#include <InterfaceGraphic_Graphic3d.hxx>
-#include <InterfaceGraphic_Visual3d.hxx>
+#include <Graphic3d_TypeOfLightSource.hxx>
 #include <Graphic3d_Vec.hxx>
+#include <InterfaceGraphic_Graphic3d.hxx>
+#include <NCollection_List.hxx>
 
 //! Light definition
 struct Graphic3d_CLight
@@ -24,14 +25,14 @@ struct Graphic3d_CLight
 
 public:
 
-  Graphic3d_Vec4     Color;       //!< light color
-  Graphic3d_Vec4     Position;    //!< light position
-  Graphic3d_Vec4     Direction;   //!< direction of directional/spot light
-  Graphic3d_Vec4     Params;      //!< packed light parameters
-  Standard_Integer   Type;        //!< Visual3d_TypeOfLightSource enumeration
-  Standard_Boolean   IsHeadlight; //!< flag to mark head light
-  Standard_ShortReal Smoothness;  //!< radius (cone angle) for point (directional) light
-  Standard_ShortReal Intensity;   //!< intensity multiplier for light
+  Graphic3d_Vec4              Color;       //!< light color
+  Graphic3d_Vec4              Position;    //!< light position
+  Graphic3d_Vec4              Direction;   //!< direction of directional/spot light
+  Graphic3d_Vec4              Params;      //!< packed light parameters
+  Graphic3d_TypeOfLightSource Type;        //!< Graphic3d_TypeOfLightSource enumeration
+  Standard_Boolean            IsHeadlight; //!< flag to mark head light
+  Standard_ShortReal          Smoothness;  //!< radius (cone angle) for point (directional) light
+  Standard_ShortReal          Intensity;   //!< intensity multiplier for light
 
   //! Const attenuation factor of positional light source
   Standard_ShortReal  ConstAttenuation()  const { return Params.x();  }
@@ -62,7 +63,7 @@ public:
     Position      (0.0f, 0.0f, 0.0f, 1.0f),
     Direction     (0.0f, 0.0f, 0.0f, 0.0f),
     Params        (0.0f, 0.0f, 0.0f, 0.0f),
-    Type          (0),
+    Type          (Graphic3d_TOLS_AMBIENT),
     IsHeadlight   (Standard_False),
     Smoothness    (0.0f),
     Intensity     (1.0f)
@@ -76,4 +77,6 @@ public:
 
 };
 
+typedef NCollection_List<Graphic3d_CLight> Graphic3d_ListOfCLight;
+
 #endif // Graphic3d_CLight_HeaderFile
index adff5b2..126835e 100644 (file)
@@ -24,6 +24,7 @@
 #include <Graphic3d_TransformPers.hxx>
 #include <Graphic3d_Vec3.hxx>
 #include <Graphic3d_ZLayerId.hxx>
+#include <InterfaceGraphic_Graphic3d.hxx>
 
 class Graphic3d_GraphicDriver;
 class Graphic3d_StructureManager;
diff --git a/src/Graphic3d/Graphic3d_CView.cxx b/src/Graphic3d/Graphic3d_CView.cxx
new file mode 100644 (file)
index 0000000..5568201
--- /dev/null
@@ -0,0 +1,1079 @@
+// Copyright (c) 2015 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <Graphic3d_CView.hxx>
+#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
+#include <Graphic3d_StructureManager.hxx>
+
+//=======================================================================
+//function : Constructor
+//purpose  :
+//=======================================================================
+Graphic3d_CView::Graphic3d_CView (const Handle(Graphic3d_StructureManager)& theMgr)
+: myStructureManager       (theMgr),
+  myHiddenObjects          (new Graphic3d_NMapOfTransient()),
+  myIsInComputedMode       (Standard_False),
+  myIsActive               (Standard_False),
+  myIsRemoved              (Standard_False),
+  myVisualization          (Graphic3d_TOV_WIREFRAME)
+{
+  myId = myStructureManager->Identification (this);
+}
+
+//=======================================================================
+//function : Destructor
+//purpose  :
+//=======================================================================
+Graphic3d_CView::~Graphic3d_CView()
+{
+  if (!IsRemoved())
+  {
+    myStructureManager->UnIdentification (this);
+  }
+}
+
+// =======================================================================
+// function : Activate
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::Activate()
+{
+  if (!IsActive())
+  {
+    myIsActive = Standard_True;
+
+    // Activation of a new view =>
+    // Display structures that can be displayed in this new view.
+    // All structures with status
+    // Displayed in ViewManager are returned and displayed in
+    // the view directly, if the structure is not already
+    // displayed and if the view accepts it in its context.
+    Graphic3d_MapOfStructure aDisplayedStructs;
+    myStructureManager->DisplayedStructures (aDisplayedStructs);
+    for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (aDisplayedStructs); aStructIter.More(); aStructIter.Next())
+    {
+      const Handle(Graphic3d_Structure)& aStruct = aStructIter.Key();
+      if (IsDisplayed (aStruct))
+      {
+        continue;
+      }
+
+      // If the structure can be displayed in the new context of the view, it is displayed.
+      const Graphic3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual());
+      if (anAnswer == Graphic3d_TOA_YES
+       || anAnswer == Graphic3d_TOA_COMPUTE)
+      {
+        Display (aStruct, Aspect_TOU_WAIT);
+      }
+    }
+  }
+
+  Update (myStructureManager->UpdateMode());
+}
+
+// =======================================================================
+// function : Deactivate
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::Deactivate()
+{
+  if (IsActive())
+  {
+    // Deactivation of a view =>
+    // Removal of structures displayed in this view.
+    // All structures with status
+    // Displayed in ViewManager are returned and removed from
+    // the view directly, if the structure is not already
+    // displayed and if the view accepts it in its context.
+    Graphic3d_MapOfStructure aDisplayedStructs;
+    myStructureManager->DisplayedStructures (aDisplayedStructs);
+    for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (aDisplayedStructs); aStructIter.More(); aStructIter.Next())
+    {
+      const Handle(Graphic3d_Structure)& aStruct = aStructIter.Key();
+      if (!IsDisplayed (aStruct))
+      {
+        continue;
+      }
+
+      const Graphic3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual());
+      if (anAnswer == Graphic3d_TOA_YES
+       || anAnswer == Graphic3d_TOA_COMPUTE)
+      {
+        Erase (aStruct, Aspect_TOU_WAIT);
+      }
+    }
+
+    Update (myStructureManager->UpdateMode());
+    myIsActive = Standard_False;
+  }
+}
+
+// ========================================================================
+// function : Remove
+// purpose  :
+// ========================================================================
+void Graphic3d_CView::Remove()
+{
+  if (IsRemoved())
+  {
+    return;
+  }
+
+  Graphic3d_MapOfStructure aDisplayedStructs (myStructsDisplayed);
+
+  for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (aDisplayedStructs); aStructIter.More(); aStructIter.Next())
+  {
+    Erase (aStructIter.Value(), Aspect_TOU_WAIT);
+  }
+
+  myStructsToCompute.Clear();
+  myStructsComputed .Clear();
+  myStructsDisplayed.Clear();
+
+  if (!myStructureManager.IsNull())
+  {
+    myStructureManager->UnIdentification (this);
+  }
+
+  myIsActive  = Standard_False;
+  myIsRemoved = Standard_True;
+}
+
+// ========================================================================
+// function : SetComputedMode
+// purpose  :
+// ========================================================================
+void Graphic3d_CView::SetComputedMode (const Standard_Boolean theMode)
+{
+  if (( theMode &&  myIsInComputedMode)
+   || (!theMode && !myIsInComputedMode))
+  {
+    return;
+  }
+
+  myIsInComputedMode = theMode;
+  if (!myIsInComputedMode)
+  {
+    for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
+    {
+      const Handle(Graphic3d_Structure)& aStruct  = aStructIter.Key();
+      const Graphic3d_TypeOfAnswer        anAnswer = acceptDisplay (aStruct->Visual());
+      if (anAnswer != Graphic3d_TOA_COMPUTE)
+      {
+        continue;
+      }
+
+      const Standard_Integer anIndex = IsComputed (aStruct);
+      if (anIndex != 0)
+      {
+        const Handle(Graphic3d_Structure)& aStructComp = myStructsComputed.Value (anIndex);
+        eraseStructure   (aStructComp->CStructure());
+        displayStructure (aStruct->CStructure(), aStruct->DisplayPriority());
+      }
+    }
+    return;
+  }
+
+  for (Graphic3d_MapOfStructure::Iterator aDispStructIter (myStructsDisplayed); aDispStructIter.More(); aDispStructIter.Next())
+  {
+    Handle(Graphic3d_Structure) aStruct  = aDispStructIter.Key();
+    const Graphic3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual());
+    if (anAnswer != Graphic3d_TOA_COMPUTE)
+    {
+      continue;
+    }
+
+    const Standard_Integer anIndex = IsComputed (aStruct);
+    if (anIndex != 0)
+    {
+      eraseStructure   (aStruct->CStructure());
+      displayStructure (myStructsComputed.Value (anIndex)->CStructure(), aStruct->DisplayPriority());
+
+      Display (aStruct, Aspect_TOU_WAIT);
+      if (aStruct->IsHighlighted())
+      {
+        const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.Value (anIndex);
+        if (!aCompStruct->IsHighlighted())
+        {
+          aCompStruct->Highlight (Aspect_TOHM_COLOR, aStruct->HighlightColor(), Standard_False);
+        }
+      }
+    }
+    else
+    {
+      TColStd_Array2OfReal aTrsf (0, 3, 0, 3);
+      aStruct->Transform (aTrsf);
+      Handle(Graphic3d_Structure) aCompStruct = aStruct->IsTransformed() ? aStruct->Compute (this, aTrsf) : aStruct->Compute (this);
+      aCompStruct->SetHLRValidation (Standard_True);
+
+      const Standard_Boolean toComputeWireframe = myVisualization == Graphic3d_TOV_WIREFRAME
+                                                && aStruct->ComputeVisual() != Graphic3d_TOS_SHADING;
+      const Standard_Boolean toComputeShading   = myVisualization == Graphic3d_TOV_SHADING
+                                                && aStruct->ComputeVisual() != Graphic3d_TOS_WIREFRAME;
+      if (toComputeWireframe) aCompStruct->SetVisual (Graphic3d_TOS_WIREFRAME);
+      if (toComputeShading  ) aCompStruct->SetVisual (Graphic3d_TOS_SHADING);
+
+      if (aStruct->IsHighlighted())
+      {
+        aCompStruct->Highlight (Aspect_TOHM_COLOR, aStruct->HighlightColor(), Standard_False);
+      }
+
+      Standard_Boolean hasResult = Standard_False;
+      const Standard_Integer aNbToCompute = myStructsToCompute.Length();
+      const Standard_Integer aStructId    = aStruct->Identification();
+      for (Standard_Integer aToCompStructIter = 1; aToCompStructIter <= aNbToCompute; ++aToCompStructIter)
+      {
+        if (myStructsToCompute.Value (aToCompStructIter)->Identification() == aStructId)
+        {
+          hasResult = Standard_True;
+          myStructsComputed.ChangeValue (aToCompStructIter) = aCompStruct;
+          break;
+        }
+      }
+
+      if (!hasResult)
+      {
+        myStructsToCompute.Append (aStruct);
+        myStructsComputed .Append (aCompStruct);
+      }
+
+      eraseStructure   (aStruct->CStructure());
+      displayStructure (aCompStruct->CStructure(), aStruct->DisplayPriority());
+    }
+  }
+  Update (myStructureManager->UpdateMode());
+}
+
+// =======================================================================
+// function : ReCompute
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::ReCompute (const Handle(Graphic3d_Structure)& theStruct)
+{
+  theStruct->CalculateBoundBox();
+  if (!theStruct->IsMutable()
+   && !theStruct->CStructure()->IsForHighlight
+   && !theStruct->CStructure()->IsInfinite)
+  {
+    const Standard_Integer aLayerId = theStruct->DisplayPriority();
+    InvalidateBVHData (aLayerId);
+  }
+
+  if (!ComputedMode()
+   || !IsActive()
+   || !theStruct->IsDisplayed())
+  {
+    return;
+  }
+
+  const Graphic3d_TypeOfAnswer anAnswer = acceptDisplay (theStruct->Visual());
+  if (anAnswer != Graphic3d_TOA_COMPUTE)
+  {
+    return;
+  }
+
+  const Standard_Integer anIndex = IsComputed (theStruct);
+  if (anIndex == 0)
+  {
+    return;
+  }
+
+  // compute + validation
+  TColStd_Array2OfReal anIdent (0, 3, 0, 3);
+  for (Standard_Integer aRow = 0; aRow <= 3; ++aRow)
+  {
+    for (Standard_Integer aCol = 0; aCol <= 3; ++aCol)
+    {
+      anIdent (aRow, aCol) = (aRow == aCol ? 1.0 : 0.0);
+    }
+  }
+  TColStd_Array2OfReal aTrsf (0, 3, 0, 3);
+  theStruct->Transform (aTrsf);
+
+  Handle(Graphic3d_Structure) aCompStructOld = myStructsComputed.ChangeValue (anIndex);
+  Handle(Graphic3d_Structure) aCompStruct    = aCompStructOld;
+  aCompStruct->SetTransform (anIdent, Graphic3d_TOC_REPLACE);
+  theStruct->IsTransformed() ? theStruct->Compute (this, aTrsf, aCompStruct)
+                             : theStruct->Compute (this,        aCompStruct);
+  aCompStruct->SetHLRValidation (Standard_True);
+
+  // of which type will be the computed?
+  const Standard_Boolean toComputeWireframe = myVisualization == Graphic3d_TOV_WIREFRAME
+                                           && theStruct->ComputeVisual() != Graphic3d_TOS_SHADING;
+  const Standard_Boolean toComputeShading   = myVisualization == Graphic3d_TOV_SHADING
+                                           && theStruct->ComputeVisual() != Graphic3d_TOS_WIREFRAME;
+  if (toComputeWireframe)
+  {
+    aCompStruct->SetVisual (Graphic3d_TOS_WIREFRAME);
+  }
+  else if (toComputeShading)
+  {
+    aCompStruct->SetVisual (Graphic3d_TOS_SHADING);
+  }
+
+  if (theStruct->IsHighlighted())
+  {
+    aCompStruct->Highlight (Aspect_TOHM_COLOR, theStruct->HighlightColor(), Standard_False);
+  }
+
+  // The previous calculation is removed and the new one is displayed
+  eraseStructure   (aCompStructOld->CStructure());
+  displayStructure (aCompStruct->CStructure(), theStruct->DisplayPriority());
+
+  // why not just replace existing items?
+  //myStructsToCompute.ChangeValue (anIndex) = theStruct;
+  //myStructsComputed .ChangeValue (anIndex) = aCompStruct;
+
+  // hlhsr and the new associated compute are added
+  myStructsToCompute.Append (theStruct);
+  myStructsComputed .Append (aCompStruct);
+
+  // hlhsr and the new associated compute are removed
+  myStructsToCompute.Remove (anIndex);
+  myStructsComputed .Remove (anIndex);
+}
+
+// =======================================================================
+// function : Update
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::Update (const Aspect_TypeOfUpdate theUpdateMode)
+{
+  myMinMax.Invalidate();
+  if (theUpdateMode == Aspect_TOU_ASAP)
+  {
+    Compute();
+    Redraw();
+  }
+}
+
+// =======================================================================
+// function : ContainsFacet
+// purpose  :
+// =======================================================================
+Standard_Boolean Graphic3d_CView::ContainsFacet() const
+{
+  for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
+  {
+    if (aStructIter.Key()->ContainsFacet())
+    {
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+// =======================================================================
+// function : ContainsFacet
+// purpose  :
+// =======================================================================
+Standard_Boolean Graphic3d_CView::ContainsFacet (const Graphic3d_MapOfStructure& theSet) const
+{
+  for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (theSet); aStructIter.More(); aStructIter.Next())
+  {
+    if (aStructIter.Key()->ContainsFacet())
+    {
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+// =======================================================================
+// function : DisplayedStructures
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::DisplayedStructures (Graphic3d_MapOfStructure& theStructures) const
+{
+  for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
+  {
+    theStructures.Add (aStructIter.Key());
+  }
+}
+
+//! Auxiliary method for MinMaxValues() method
+inline void addStructureBndBox (const Handle(Graphic3d_Structure)& theStruct,
+                                const Standard_Boolean             theToIgnoreInfiniteFlag,
+                                Bnd_Box&                           theBndBox)
+{
+  if (!theStruct->IsVisible())
+  {
+    return;
+  }
+  else if (theStruct->IsInfinite()
+       && !theToIgnoreInfiniteFlag)
+  {
+    // XMin, YMin .... ZMax are initialized by means of infinite line data
+    const Bnd_Box aBox = theStruct->MinMaxValues (Standard_False);
+    if (!aBox.IsWhole()
+     && !aBox.IsVoid())
+    {
+      theBndBox.Add (aBox);
+    }
+    return;
+  }
+
+  // Only non-empty and non-infinite structures
+  // are taken into account for calculation of MinMax
+  if (theStruct->IsEmpty()
+   || theStruct->TransformPersistenceMode() != Graphic3d_TMF_None)
+  {
+    return;
+  }
+
+  // "FitAll" operation ignores object with transform persistence parameter
+  const Bnd_Box aBox = theStruct->MinMaxValues (theToIgnoreInfiniteFlag);
+
+  // To prevent float overflow at camera parameters calculation and further
+  // rendering, bounding boxes with at least one vertex coordinate out of
+  // float range are skipped by view fit algorithms
+  if (Abs (aBox.CornerMax().X()) >= ShortRealLast() ||
+      Abs (aBox.CornerMax().Y()) >= ShortRealLast() ||
+      Abs (aBox.CornerMax().Z()) >= ShortRealLast() ||
+      Abs (aBox.CornerMin().X()) >= ShortRealLast() ||
+      Abs (aBox.CornerMin().Y()) >= ShortRealLast() ||
+      Abs (aBox.CornerMin().Z()) >= ShortRealLast())
+    return;
+
+  theBndBox.Add (aBox);
+}
+
+// =======================================================================
+// function : MinMaxValues
+// purpose  :
+// =======================================================================
+Bnd_Box Graphic3d_CView::MinMaxValues (const Standard_Boolean theToIgnoreInfiniteFlag) const
+{
+  if (myMinMax.IsOutdated (theToIgnoreInfiniteFlag))
+  {
+    myMinMax.BoundingBox (theToIgnoreInfiniteFlag) = MinMaxValues (myStructsDisplayed, theToIgnoreInfiniteFlag);
+    myMinMax.IsOutdated  (theToIgnoreInfiniteFlag) = Standard_False;
+  }
+
+  return myMinMax.BoundingBox (theToIgnoreInfiniteFlag);
+}
+
+// =======================================================================
+// function : MinMaxValues
+// purpose  :
+// =======================================================================
+Bnd_Box Graphic3d_CView::MinMaxValues (const Graphic3d_MapOfStructure& theSet,
+                                       const Standard_Boolean theToIgnoreInfiniteFlag) const
+{
+  Bnd_Box aResult;
+  const Standard_Integer aViewId = Identification();
+  for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (theSet); aStructIter.More(); aStructIter.Next())
+  {
+    const Handle(Graphic3d_Structure)& aStructure = aStructIter.Key();
+    if (!aStructIter.Value()->IsVisible())
+    {
+      continue;
+    }
+    else if (!aStructIter.Value()->CStructure()->ViewAffinity.IsNull()
+          && !aStructIter.Value()->CStructure()->ViewAffinity->IsVisible (aViewId))
+    {
+      continue;
+    }
+
+    addStructureBndBox (aStructure, theToIgnoreInfiniteFlag, aResult);
+  }
+  return aResult;
+}
+
+// =======================================================================
+// function : acceptDisplay
+// purpose  :
+// =======================================================================
+Graphic3d_TypeOfAnswer Graphic3d_CView::acceptDisplay (const Graphic3d_TypeOfStructure theStructType) const
+{
+  switch (theStructType)
+  {
+    case Graphic3d_TOS_ALL:
+    {
+      return Graphic3d_TOA_YES; // The structure accepts any type of view
+    }
+    case Graphic3d_TOS_SHADING:
+    {
+      return myVisualization == Graphic3d_TOV_SHADING
+           ? Graphic3d_TOA_YES
+           : Graphic3d_TOA_NO;
+    }
+    case Graphic3d_TOS_WIREFRAME:
+    {
+      return myVisualization == Graphic3d_TOV_WIREFRAME
+           ? Graphic3d_TOA_YES
+           : Graphic3d_TOA_NO;
+    }
+    case Graphic3d_TOS_COMPUTED:
+    {
+      return (myVisualization == Graphic3d_TOV_SHADING || myVisualization == Graphic3d_TOV_WIREFRAME)
+           ?  Graphic3d_TOA_COMPUTE
+           :  Graphic3d_TOA_NO;
+    }
+  }
+  return Graphic3d_TOA_NO;
+}
+
+// =======================================================================
+// function : Compute
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::Compute()
+{
+  // force HLRValidation to False on all structures calculated in the view
+  const Standard_Integer aNbCompStructs = myStructsComputed.Length();
+  for (Standard_Integer aStructIter = 1; aStructIter <= aNbCompStructs; ++aStructIter)
+  {
+    myStructsComputed.Value (aStructIter)->SetHLRValidation (Standard_False);
+  }
+
+  if (!ComputedMode())
+  {
+    return;
+  }
+
+  // Change of orientation or of projection type =>
+  // Remove structures that were calculated for the previous orientation.
+  // Recalculation of new structures.
+  NCollection_Sequence<Handle(Graphic3d_Structure)> aStructsSeq;
+  for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
+  {
+    const Graphic3d_TypeOfAnswer anAnswer = acceptDisplay (aStructIter.Key()->Visual());
+    if (anAnswer == Graphic3d_TOA_COMPUTE)
+    {
+      aStructsSeq.Append (aStructIter.Key()); // if the structure was calculated, it is recalculated
+    }
+  }
+
+  for (NCollection_Sequence<Handle(Graphic3d_Structure)>::Iterator aStructIter (aStructsSeq); aStructIter.More(); aStructIter.Next())
+  {
+    Display (aStructIter.ChangeValue(), Aspect_TOU_WAIT);
+  }
+}
+
+// =======================================================================
+// function : Clear
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::Clear (const Handle(Graphic3d_Structure)& theStructure,
+                             const Standard_Boolean theWithDestruction)
+{
+  const Standard_Integer anIndex = IsComputed (theStructure);
+  if (anIndex != 0)
+  {
+    const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.Value (anIndex);
+    aCompStruct->GraphicClear (theWithDestruction);
+    aCompStruct->SetHLRValidation (Standard_False);
+  }
+}
+
+// =======================================================================
+// function : Connect
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::Connect (const Handle(Graphic3d_Structure)& theMother,
+                               const Handle(Graphic3d_Structure)& theDaughter)
+{
+  Standard_Integer anIndexM = IsComputed (theMother);
+  Standard_Integer anIndexD = IsComputed (theDaughter);
+  if (anIndexM != 0
+   && anIndexD != 0)
+  {
+    const Handle(Graphic3d_Structure)& aStructM = myStructsComputed.Value (anIndexM);
+    const Handle(Graphic3d_Structure)& aStructD = myStructsComputed.Value (anIndexD);
+    aStructM->GraphicConnect (aStructD);
+  }
+}
+
+// =======================================================================
+// function : Disconnect
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::Disconnect (const Handle(Graphic3d_Structure)& theMother,
+                                  const Handle(Graphic3d_Structure)& theDaughter)
+{
+  Standard_Integer anIndexM = IsComputed (theMother);
+  Standard_Integer anIndexD = IsComputed (theDaughter);
+  if (anIndexM != 0
+   && anIndexD != 0)
+  {
+    const Handle(Graphic3d_Structure)& aStructM = myStructsComputed.Value (anIndexM);
+    const Handle(Graphic3d_Structure)& aStructD = myStructsComputed.Value (anIndexD);
+    aStructM->GraphicDisconnect (aStructD);
+  }
+}
+
+// =======================================================================
+// function : Display
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::Display (const Handle(Graphic3d_Structure)& theStructure)
+{
+  Display (theStructure, myStructureManager->UpdateMode());
+}
+
+// =======================================================================
+// function : Display
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::Display (const Handle(Graphic3d_Structure)& theStructure,
+                               const Aspect_TypeOfUpdate theUpdateMode)
+{
+  if (!IsActive())
+  {
+    return;
+  }
+
+  // If Display on a structure present in the list of calculated structures while it is not
+  // or more, of calculated type =>
+  // - removes it as well as the associated old computed
+  // THis happens when hlhsr becomes again of type e non computed after SetVisual.
+  Standard_Integer anIndex = IsComputed (theStructure);
+  if (anIndex != 0
+   && theStructure->Visual() != Graphic3d_TOS_COMPUTED)
+  {
+    myStructsToCompute.Remove (anIndex);
+    myStructsComputed .Remove (anIndex);
+    anIndex = 0;
+  }
+
+  Graphic3d_TypeOfAnswer anAnswer = acceptDisplay (theStructure->Visual());
+  if (anAnswer == Graphic3d_TOA_NO)
+  {
+    return;
+  }
+
+  if (!ComputedMode())
+  {
+    anAnswer = Graphic3d_TOA_YES;
+  }
+
+  if (anAnswer == Graphic3d_TOA_YES)
+  {
+    if (!myStructsDisplayed.Add (theStructure))
+    {
+      return;
+    }
+
+    theStructure->CalculateBoundBox();
+    displayStructure (theStructure->CStructure(), theStructure->DisplayPriority());
+    Update (theUpdateMode);
+    return;
+  }
+  else if (anAnswer != Graphic3d_TOA_COMPUTE)
+  {
+    return;
+  }
+
+  if (anIndex != 0)
+  {
+    // Already computed, is COMPUTED still valid?
+    const Handle(Graphic3d_Structure)& anOldStruct = myStructsComputed.Value (anIndex);
+    if (anOldStruct->HLRValidation())
+    {
+      // Case COMPUTED valid, to be displayed
+      if (!myStructsDisplayed.Add (theStructure))
+      {
+        return;
+      }
+
+      displayStructure (anOldStruct->CStructure(), theStructure->DisplayPriority());
+      Update (theUpdateMode);
+      return;
+    }
+    else
+    {
+      // Case COMPUTED invalid
+      // Is there another valid representation?
+      // Find in the sequence of already calculated structures
+      // 1/ Structure having the same Owner as <AStructure>
+      // 2/ That is not <AStructure>
+      // 3/ The COMPUTED which of is valid
+      const Standard_Integer aNewIndex = HaveTheSameOwner (theStructure);
+      if (aNewIndex != 0)
+      {
+        // Case of COMPUTED invalid, WITH a valid of replacement; to be displayed
+        if (!myStructsDisplayed.Add (theStructure))
+        {
+          return;
+        }
+
+        const Handle(Graphic3d_Structure)& aNewStruct = myStructsComputed.Value (aNewIndex);
+        myStructsComputed.SetValue (anIndex, aNewStruct);
+        displayStructure (aNewStruct->CStructure(), theStructure->DisplayPriority());
+        Update (theUpdateMode);
+        return;
+      }
+      else
+      {
+        // Case COMPUTED invalid, WITHOUT a valid of replacement
+        // COMPUTED is removed if displayed
+        if (myStructsDisplayed.Contains (theStructure))
+        {
+          eraseStructure (anOldStruct->CStructure());
+        }
+      }
+    }
+  }
+
+  // Compute + Validation
+  Handle(Graphic3d_Structure) aStruct;
+  TColStd_Array2OfReal aTrsf (0, 3, 0, 3);
+  theStructure->Transform (aTrsf);
+  if (anIndex != 0)
+  {
+    TColStd_Array2OfReal anIdent (0, 3, 0, 3);
+    for (Standard_Integer ii = 0; ii <= 3; ++ii)
+    {
+      for (Standard_Integer jj = 0; jj <= 3; ++jj)
+      {
+        anIdent (ii, jj) = (ii == jj ? 1.0 : 0.0);
+      }
+    }
+
+    aStruct = myStructsComputed.Value (anIndex);
+    aStruct->SetTransform (anIdent, Graphic3d_TOC_REPLACE);
+    if (theStructure->IsTransformed())
+    {
+      theStructure->Compute (this, aTrsf, aStruct);
+    }
+    else
+    {
+      theStructure->Compute (this, aStruct);
+    }
+  }
+  else
+  {
+    aStruct = theStructure->IsTransformed()
+            ? theStructure->Compute (this, aTrsf)
+            : theStructure->Compute (this);
+  }
+
+  aStruct->SetHLRValidation (Standard_True);
+
+  // TOCOMPUTE and COMPUTED associated to sequences are added
+  myStructsToCompute.Append (theStructure);
+  myStructsComputed .Append (aStruct);
+
+  // The previous are removed if necessary
+  if (anIndex != 0)
+  {
+    myStructsToCompute.Remove (anIndex);
+    myStructsComputed .Remove (anIndex);
+  }
+
+  // Of which type will be the computed?
+  const Standard_Boolean toComputeWireframe = myVisualization == Graphic3d_TOV_WIREFRAME
+                                           && theStructure->ComputeVisual() != Graphic3d_TOS_SHADING;
+  const Standard_Boolean toComputeShading   = myVisualization == Graphic3d_TOV_SHADING
+                                           && theStructure->ComputeVisual() != Graphic3d_TOS_WIREFRAME;
+  if (!toComputeShading && !toComputeWireframe)
+  {
+    anAnswer = Graphic3d_TOA_NO;
+  }
+  else
+  {
+    aStruct->SetVisual (toComputeWireframe ? Graphic3d_TOS_WIREFRAME : Graphic3d_TOS_SHADING);
+    anAnswer = acceptDisplay (aStruct->Visual());
+  }
+
+  if (theStructure->IsHighlighted())
+  {
+    aStruct->Highlight (Aspect_TOHM_COLOR, theStructure->HighlightColor(), Standard_False);
+  }
+
+  // It is displayed only if the calculated structure
+  // has a proper type corresponding to the one of the view.
+  if (anAnswer == Graphic3d_TOA_NO)
+  {
+    return;
+  }
+
+  myStructsDisplayed.Add (theStructure);
+  displayStructure (aStruct->CStructure(), theStructure->DisplayPriority());
+
+  Update (theUpdateMode);
+}
+
+// =======================================================================
+// function : Erase
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::Erase (const Handle(Graphic3d_Structure)& theStructure)
+{
+  Erase (theStructure, myStructureManager->UpdateMode());
+}
+
+// =======================================================================
+// function : Erase
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::Erase (const Handle(Graphic3d_Structure)& theStructure,
+                             const Aspect_TypeOfUpdate theUpdateMode)
+{
+  if (!IsDisplayed (theStructure))
+  {
+    return;
+  }
+
+  Graphic3d_TypeOfAnswer anAnswer = acceptDisplay (theStructure->Visual());
+  if (!ComputedMode())
+  {
+    anAnswer = Graphic3d_TOA_YES;
+  }
+
+  if (anAnswer != Graphic3d_TOA_COMPUTE)
+  {
+    eraseStructure (theStructure->CStructure());
+  }
+  else if (anAnswer == Graphic3d_TOA_COMPUTE && myIsInComputedMode)
+  {
+    const Standard_Integer anIndex = IsComputed (theStructure);
+    if (anIndex != 0)
+    {
+      const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex);
+      eraseStructure (aCompStruct->CStructure());
+    }
+  }
+  myStructsDisplayed.Remove (theStructure);
+  Update (theUpdateMode);
+}
+
+// =======================================================================
+// function : Highlight
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::Highlight (const Handle(Graphic3d_Structure)& theStructure,
+                                 const Aspect_TypeOfHighlightMethod theMethod)
+{
+  const Standard_Integer anIndex = IsComputed (theStructure);
+  if (anIndex != 0)
+  {
+    const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex);
+    aCompStruct->Highlight (theMethod, theStructure->HighlightColor(), Standard_False);
+  }
+}
+
+// =======================================================================
+// function : SetTransform
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::SetTransform (const Handle(Graphic3d_Structure)& theStructure,
+                                    const TColStd_Array2OfReal& theTrsf)
+{
+  const Standard_Integer anIndex = IsComputed (theStructure);
+  if (anIndex != 0)
+  {
+    // Test is somewhat light !
+    // trsf is transferred only if it is :
+    // a translation
+    // a scale
+    if (theTrsf (0, 1) != 0.0 || theTrsf (0, 2) != 0.0
+     || theTrsf (1, 0) != 0.0 || theTrsf (1, 2) != 0.0
+     || theTrsf (2, 0) != 0.0 || theTrsf (2, 1) != 0.0)
+    {
+      ReCompute (theStructure);
+    }
+    else
+    {
+      const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex);
+      aCompStruct->GraphicTransform (theTrsf);
+    }
+  }
+
+  theStructure->CalculateBoundBox();
+  if (!theStructure->IsMutable()
+   && !theStructure->CStructure()->IsForHighlight
+   && !theStructure->CStructure()->IsInfinite)
+  {
+    const Graphic3d_ZLayerId aLayerId = theStructure->GetZLayer();
+    InvalidateBVHData (aLayerId);
+  }
+}
+
+// =======================================================================
+// function : UnHighlight
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::UnHighlight (const Handle(Graphic3d_Structure)& theStructure)
+{
+  Standard_Integer anIndex = IsComputed (theStructure);
+  if (anIndex != 0)
+  {
+    const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex);
+    aCompStruct->GraphicUnHighlight();
+  }
+}
+
+// ========================================================================
+// function : IsComputed
+// purpose  :
+// ========================================================================
+Standard_Boolean Graphic3d_CView::IsComputed (const Standard_Integer theStructId,
+                                              Handle(Graphic3d_Structure)& theComputedStruct) const
+{
+  theComputedStruct.Nullify();
+  if (!ComputedMode())
+    return Standard_False;
+
+  const Standard_Integer aNbStructs = myStructsToCompute.Length();
+  for (Standard_Integer aStructIter = 1; aStructIter <= aNbStructs; ++aStructIter)
+  {
+    if (myStructsToCompute.Value (aStructIter)->Identification() == theStructId)
+    {
+      theComputedStruct = myStructsComputed (aStructIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+// =======================================================================
+// function : IsComputed
+// purpose  :
+// =======================================================================
+Standard_Integer Graphic3d_CView::IsComputed (const Handle(Graphic3d_Structure)& theStructure) const
+{
+  const Standard_Integer aStructId  = theStructure->Identification();
+  const Standard_Integer aNbStructs = myStructsToCompute.Length();
+  for (Standard_Integer aStructIter = 1; aStructIter <= aNbStructs; ++aStructIter)
+  {
+    const Handle(Graphic3d_Structure)& aStruct = myStructsToCompute.Value (aStructIter);
+    if (aStruct->Identification() == aStructId)
+    {
+      return aStructIter;
+    }
+  }
+  return 0;
+}
+
+// =======================================================================
+// function : IsDisplayed
+// purpose  :
+// =======================================================================
+Standard_Boolean Graphic3d_CView::IsDisplayed (const Handle(Graphic3d_Structure)& theStructure) const
+{
+  return myStructsDisplayed.Contains (theStructure);
+}
+
+// =======================================================================
+// function : ChangePriority
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::ChangePriority (const Handle(Graphic3d_Structure)& theStructure,
+                                      const Standard_Integer /*theOldPriority*/,
+                                      const Standard_Integer theNewPriority)
+{
+  if (!IsActive()
+  ||  !IsDisplayed (theStructure))
+  {
+    return;
+  }
+
+  if (!myIsInComputedMode)
+  {
+    changePriority (theStructure->CStructure(), theNewPriority);
+    return;
+  }
+
+  const Standard_Integer              anIndex  = IsComputed (theStructure);
+  const Handle(Graphic3d_CStructure)& aCStruct = anIndex != 0
+                                               ? myStructsComputed.Value (anIndex)->CStructure()
+                                               : theStructure->CStructure();
+
+  changePriority (aCStruct, theNewPriority);
+}
+
+// =======================================================================
+// function : ChangeZLayer
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
+                                    const Graphic3d_ZLayerId theLayerId)
+{
+  if (!IsActive()
+  ||  !IsDisplayed (theStructure))
+  {
+    return;
+  }
+
+  if (!myIsInComputedMode)
+  {
+    changeZLayer (theStructure->CStructure(), theLayerId);
+    return;
+  }
+
+  const Standard_Integer       anIndex  = IsComputed (theStructure);
+  Handle(Graphic3d_CStructure) aCStruct = anIndex != 0
+                                       ? myStructsComputed.Value (anIndex)->CStructure()
+                                       : theStructure->CStructure();
+
+  changeZLayer (aCStruct, theLayerId);
+}
+
+// =======================================================================
+// function : HaveTheSameOwner
+// purpose  :
+// =======================================================================
+Standard_Integer Graphic3d_CView::HaveTheSameOwner (const Handle(Graphic3d_Structure)& theStructure) const
+{
+  // Find in the sequence of already calculated structures
+  // 1/ Structure with the same Owner as <AStructure>
+  // 2/ Which is not <AStructure>
+  // 3/ COMPUTED which of is valid
+  const Standard_Integer aNbToCompStructs = myStructsToCompute.Length();
+  for (Standard_Integer aStructIter = 1; aStructIter <= aNbToCompStructs; ++aStructIter)
+  {
+    const Handle(Graphic3d_Structure)& aStructToComp = myStructsToCompute.Value (aStructIter);
+    if (aStructToComp->Owner()          == theStructure->Owner()
+     && aStructToComp->Identification() != theStructure->Identification())
+    {
+      const Handle(Graphic3d_Structure)& aStructComp = myStructsComputed.Value (aStructIter);
+      if (aStructComp->HLRValidation())
+      {
+        return aStructIter;
+      }
+    }
+  }
+  return 0;
+}
+
+// =======================================================================
+// function : CopySettings
+// purpose  :
+// =======================================================================
+void Graphic3d_CView::CopySettings (const Handle(Graphic3d_CView)& theOther)
+{
+  ChangeRenderingParams() = theOther->RenderingParams();
+  SetAntialiasingEnabled   (theOther->IsAntialiasingEnabled());
+  SetBackground            (theOther->Background());
+  SetGradientBackground    (theOther->GradientBackground());
+  SetBackgroundImage       (theOther->BackgroundImage());
+  SetBackgroundImageStyle  (theOther->BackgroundImageStyle());
+  SetTextureEnv            (theOther->TextureEnv());
+  SetCullingEnabled        (theOther->IsCullingEnabled());
+  SetShadingModel          (theOther->ShadingModel());
+  SetSurfaceDetailType     (theOther->SurfaceDetailType());
+  SetBackfacingModel       (theOther->BackfacingModel());
+  SetCamera                (new Graphic3d_Camera (theOther->Camera()));
+  SetBackZClippingOn       (theOther->BackZClippingIsOn());
+  SetFrontZClippingOn      (theOther->FrontZClippingIsOn());
+  SetZClippingBackPlane    (theOther->ZClippingBackPlane());
+  SetZClippingFrontPlane   (theOther->ZClippingFrontPlane());
+  SetDepthCueingOn         (theOther->DepthCueingIsOn());
+  SetDepthCueingBackPlane  (theOther->DepthCueingBackPlane());
+  SetDepthCueingFrontPlane (theOther->DepthCueingFrontPlane());
+  SetGLLightEnabled        (theOther->IsGLLightEnabled());
+  SetLights                (theOther->Lights());
+  SetClipPlanes            (theOther->ClipPlanes());
+}
index 7b2201f..ec55376 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (c) 1999-2014 OPEN CASCADE SAS
+// Copyright (c) 2015 OPEN CASCADE SAS
 //
 // This file is part of Open CASCADE Technology software library.
 //
 #ifndef _Graphic3d_CView_HeaderFile
 #define _Graphic3d_CView_HeaderFile
 
-#include <InterfaceGraphic_Graphic3d.hxx>
-#include <InterfaceGraphic_Visual3d.hxx>
-#include <Graphic3d_RenderingParams.hxx>
-#include <Graphic3d_TextureEnv.hxx>
+#include <Aspect_GraphicCallbackProc.hxx>
+#include <Aspect_Handle.hxx>
+#include <Aspect_PrintAlgo.hxx>
+#include <Aspect_RenderingContext.hxx>
+#include <Aspect_TypeOfTriedronEcho.hxx>
+#include <Aspect_TypeOfTriedronPosition.hxx>
+#include <Aspect_TypeOfUpdate.hxx>
+#include <Aspect_Window.hxx>
+#include <Graphic3d_BufferType.hxx>
 #include <Graphic3d_Camera.hxx>
-
 #include <Graphic3d_CLight.hxx>
+#include <Graphic3d_CStructure.hxx>
+#include <Graphic3d_DataStructureManager.hxx>
+#include <Graphic3d_ExportFormat.hxx>
+#include <Graphic3d_GraduatedTrihedron.hxx>
+#include <Graphic3d_MapOfStructure.hxx>
+#include <Graphic3d_NMapOfTransient.hxx>
+#include <Graphic3d_PtrFrameBuffer.hxx>
+#include <Graphic3d_RenderingParams.hxx>
 #include <Graphic3d_SequenceOfHClipPlane.hxx>
-
-class CALL_DEF_VIEWCONTEXT
+#include <Graphic3d_SequenceOfStructure.hxx>
+#include <Graphic3d_SortType.hxx>
+#include <Graphic3d_Structure.hxx>
+#include <Graphic3d_StructureManagerPtr.hxx>
+#include <Graphic3d_TextureEnv.hxx>
+#include <Graphic3d_TypeOfAnswer.hxx>
+#include <Graphic3d_TypeOfBackfacingModel.hxx>
+#include <Graphic3d_TypeOfShadingModel.hxx>
+#include <Graphic3d_TypeOfSurfaceDetail.hxx>
+#include <Graphic3d_TypeOfVisualization.hxx>
+#include <Graphic3d_Vec3.hxx>
+#include <Graphic3d_ZLayerId.hxx>
+#include <Graphic3d_ZLayerSettings.hxx>
+#include <Image_PixMap.hxx>
+#include <Quantity_NameOfColor.hxx>
+#include <Standard_Address.hxx>
+#include <Standard_Transient.hxx>
+
+class Graphic3d_CView;
+class Graphic3d_GraphicDriver;
+class Graphic3d_StructureManager;
+
+DEFINE_STANDARD_HANDLE (Graphic3d_CView, Graphic3d_DataStructureManager)
+
+//! Base class of a graphical view that carries out rendering process for a concrete
+//! implementation of graphical driver. Provides virtual interfaces for redrawing its
+//! contents, management of displayed structures and render settings. The source code 
+//! of the class itself implements functionality related to management of
+//! computed (HLR or "view-dependent") structures.
+class Graphic3d_CView : public Graphic3d_DataStructureManager
 {
-
 public:
 
-  CALL_DEF_VIEWCONTEXT()
-  : Aliasing (0),
-    BackZClipping  (0),
-    FrontZClipping (0),
-    DepthCueing (0),
-    ZClipFrontPlane (0.0f),
-    ZClipBackPlane  (0.0f),
-    DepthFrontPlane (0.0f),
-    DepthBackPlane  (0.0f),
-    Model (0),
-    Visualization (0),
-    NbActiveLight (0),
-    ActiveLight (NULL),
-    SurfaceDetail (0),
-    ClipPlanes()
-  {
-    //
-  }
+  //! Constructor.
+  Standard_EXPORT Graphic3d_CView (const Handle(Graphic3d_StructureManager)& theMgr);
+
+  //! Destructor.
+  Standard_EXPORT virtual ~Graphic3d_CView();
+
+  //! Returns the identification number of the view.
+  Standard_Integer Identification() const { return myId; }
+
+  //! Activates the view. Map the associated window on the screen and post the view in this window.
+  //! Warning: Raises ViewDefinitionError if the associated window isn't defined.
+  Standard_EXPORT virtual void Activate();
+
+  //! Deactivates the view. Unmap the associated window on the screen and unpost the view in this window.
+  //! Warning: Raises ViewDefinitionError if the associated window isn't defined.
+  Standard_EXPORT virtual void Deactivate();
+
+  //! Returns the activity flag of the view.
+  Standard_Boolean IsActive() const { return myIsActive; }
+
+  //! Erases the view and removes from graphic driver.
+  //! No more graphic operations are allowed in this view after the call.
+  Standard_EXPORT virtual void Remove();
+
+  //! Returns true if the view was removed.
+  Standard_Boolean IsRemoved() const { return myIsRemoved; }
 
 public:
 
-  int   Aliasing;
+  //! Returns visualization type of the view.
+  Graphic3d_TypeOfVisualization VisualizationType() const { return myVisualization; }
 
-  int   BackZClipping;
-  int   FrontZClipping;
+  //! Sets visualization type of the view.
+  void SetVisualizationType (const Graphic3d_TypeOfVisualization theType) { myVisualization = theType; }
 
-  int   DepthCueing;
+  //! Switches computed HLR mode in the view
+  Standard_EXPORT void SetComputedMode (const Standard_Boolean theMode);
 
-  float ZClipFrontPlane;
-  float ZClipBackPlane;
+  //! Returns the computed HLR mode state
+  Standard_Boolean ComputedMode() const { return myIsInComputedMode; }
 
-  float DepthFrontPlane;
-  float DepthBackPlane;
+  //! Computes the new presentation of the structure  displayed in this view with the type Graphic3d_TOS_COMPUTED.
+  Standard_EXPORT void ReCompute (const Handle(Graphic3d_Structure)& theStructure);
 
-  int   Model;
-  int   Visualization;
+  //! Updates screen in function of modifications of the structures.
+  Standard_EXPORT void Update (const Aspect_TypeOfUpdate theUpdateMode);
 
-  int   NbActiveLight;
-  Graphic3d_CLight* ActiveLight;
+  //! Returns Standard_True if one of the structures displayed in the view contains Polygons, Triangles or Quadrangles.
+  Standard_EXPORT Standard_Boolean ContainsFacet() const;
 
-  Handle(Graphic3d_TextureEnv) TextureEnv;
-  int   SurfaceDetail;
+  //! Returns Standard_True if one of the structures in the set contains Polygons, Triangles or Quadrangles.
+  Standard_EXPORT Standard_Boolean ContainsFacet (const Graphic3d_MapOfStructure& theSet) const;
 
-  Graphic3d_SequenceOfHClipPlane ClipPlanes;
+  //! Returns the set of structures displayed in this view.
+  Standard_EXPORT void DisplayedStructures (Graphic3d_MapOfStructure& theStructures) const;
 
-  Handle(Graphic3d_Camera) Camera;
-};
+  //! Returns number of displayed structures in the view.
+  Standard_Integer NumberOfDisplayedStructures() const { return myStructsDisplayed.Extent(); }
 
-class Graphic3d_CView
-{
+  //! Returns map of objects hidden within this specific view (not viewer-wise).
+  const Handle(Graphic3d_NMapOfTransient)& HiddenObjects() const { return myHiddenObjects; }
+
+  //! Returns map of objects hidden within this specific view (not viewer-wise).
+  Handle(Graphic3d_NMapOfTransient)& ChangeHiddenObjects() { return myHiddenObjects; }
+
+  //! Returns Standard_True in case if the structure with the given <theStructId> is
+  //! in list of structures to be computed and stores computed struct to <theComputedStruct>.
+  Standard_EXPORT Standard_Boolean IsComputed (const Standard_Integer theStructId,
+                                               Handle(Graphic3d_Structure)& theComputedStruct) const;
+
+  //! Returns the coordinates of the boundary box of all
+  //! structures displayed in the view.
+  //! If <theToIgnoreInfiniteFlag> is TRUE, then the boundary box
+  //! also includes minimum and maximum limits of graphical elements
+  //! forming parts of infinite structures.
+  Standard_EXPORT Bnd_Box MinMaxValues (const Standard_Boolean theToIgnoreInfiniteFlag = Standard_False) const;
+
+  //! Returns the coordinates of the boundary box of all structures in the set <theSet>.
+  //! If <theToIgnoreInfiniteFlag> is TRUE, then the boundary box
+  //! also includes minimum and maximum limits of graphical elements
+  //! forming parts of infinite structures.
+  Standard_EXPORT Bnd_Box MinMaxValues (const Graphic3d_MapOfStructure& theSet,
+                                        const Standard_Boolean theToIgnoreInfiniteFlag = Standard_False) const;
+
+  //! Returns the structure manager handle which manage structures associated with this view.
+  const Handle(Graphic3d_StructureManager)& StructureManager() const { return myStructureManager; }
+
+private:
+
+  friend class Graphic3d_StructureManager;
+
+  //! Is it possible to display the structure in the view?
+  Standard_EXPORT Graphic3d_TypeOfAnswer acceptDisplay (const Graphic3d_TypeOfStructure theStructType) const;
+
+  //! Computes the new presentation of the structures displayed in this view with the type Graphic3d_TOS_COMPUTED.
+  Standard_EXPORT void Compute();
+
+  //! Clears the structure in this view.
+  Standard_EXPORT void Clear (const Handle(Graphic3d_Structure)& theStructure, const Standard_Boolean theWithDestruction);
+
+  //! Connects the structures.
+  Standard_EXPORT void Connect (const Handle(Graphic3d_Structure)& theMother,
+                                const Handle(Graphic3d_Structure)& theDaughter);
+
+  //! Disconnects the structures.
+  Standard_EXPORT void Disconnect (const Handle(Graphic3d_Structure)& theMother,
+                                   const Handle(Graphic3d_Structure)& theDaughter);
+
+  //! Displays the structure in the view.
+  Standard_EXPORT void Display (const Handle(Graphic3d_Structure)& theStructure);
+
+  //! Display the structure in the view.
+  Standard_EXPORT void Display (const Handle(Graphic3d_Structure)& theStructure,
+                                const Aspect_TypeOfUpdate theUpdateMode);
+
+  //! Erases the structure from the view.
+  Standard_EXPORT void Erase (const Handle(Graphic3d_Structure)& theStructure);
+
+  //! Erases the structure from the view.
+  Standard_EXPORT void Erase (const Handle(Graphic3d_Structure)& theStructure,
+                              const Aspect_TypeOfUpdate theUpdateMode);
+
+  //! Highlights the structure in the view.
+  Standard_EXPORT void Highlight (const Handle(Graphic3d_Structure)& theStructure,
+                                  const Aspect_TypeOfHighlightMethod theMethod);
+
+  //! Transforms the structure in the view.
+  Standard_EXPORT void SetTransform (const Handle(Graphic3d_Structure)& theStructure,
+                                     const TColStd_Array2OfReal& theTrsf);
+
+  //! Suppress the highlighting on the structure <AStructure>
+  //! in the view <me>.
+  Standard_EXPORT void UnHighlight (const Handle(Graphic3d_Structure)& theStructure);
+
+  //! Returns an index != 0 if the structure have another structure computed for the view <me>.
+  Standard_EXPORT Standard_Integer IsComputed (const Handle(Graphic3d_Structure)& theStructure) const;
+
+  //! Returns true if the structure is displayed in the view.
+  Standard_EXPORT Standard_Boolean IsDisplayed (const Handle(Graphic3d_Structure)& theStructure) const;
+
+  //! Changes the display priority of the structure.
+  Standard_EXPORT void ChangePriority (const Handle(Graphic3d_Structure)& theStructure,
+                                       const Standard_Integer theOldPriority,
+                                       const Standard_Integer theNewPriority);
+
+  //! Change Z layer of already displayed structure in the view.
+  Standard_EXPORT void ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
+                                     const Graphic3d_ZLayerId theLayerId);
+
+  //! Returns an index != 0 if the structure have the same owner than another structure
+  //! in the sequence of the computed structures.
+  Standard_EXPORT Standard_Integer HaveTheSameOwner (const Handle(Graphic3d_Structure)& theStructure) const;
 
 public:
 
-  Graphic3d_CView()
-  : WsId (-1),
-    ViewId (0),
-    ptrView (NULL),
-    IsDeleted (0),
-    IsOpen (0),
-    Active (0),
-    ptrUnderLayer (NULL),
-    ptrOverLayer  (NULL),
-    Backfacing  (0),
-    GContext (NULL),
-    GDisplayCB  (NULL),
-    GClientData (NULL),
-    ptrFBO (NULL),
-    WasRedrawnGL (0),
-    IsCullingEnabled (Standard_True)
-  {
-    memset (&DefWindow, 0, sizeof(DefWindow));
-  }
+  //! Redraw content of the view.
+  virtual void Redraw() = 0;
+
+  //! Redraw immediate content of the view.
+  virtual void RedrawImmediate() = 0;
+
+  //! Invalidates content of the view but does not redraw it.
+  virtual void Invalidate() = 0;
+
+  //! Return true if view content cache has been invalidated.
+  virtual Standard_Boolean IsInvalidated() = 0;
+
+  //! Handle changing size of the rendering window.
+  virtual void Resized() = 0;
+
+  //! @param theDrawToFrontBuffer Advanced option to modify rendering mode:
+  //! 1. TRUE.  Drawing immediate mode structures directly to the front buffer over the scene image.
+  //! Fast, so preferred for interactive work (used by default).
+  //! However these extra drawings will be missed in image dump since it is performed from back buffer.
+  //! Notice that since no pre-buffering used the V-Sync will be ignored and rendering could be seen
+  //! in run-time (in case of slow hardware) and/or tearing may appear.
+  //! So this is strongly recommended to draw only simple (fast) structures.
+  //! 2. FALSE. Drawing immediate mode structures to the back buffer.
+  //! The complete scene is redrawn first, so this mode is slower if scene contains complex data and/or V-Sync
+  //! is turned on. But it works in any case and is especially useful for view dump because the dump image is read
+  //! from the back buffer.
+  //! @return previous mode.
+  virtual Standard_Boolean SetImmediateModeDrawToFront (const Standard_Boolean theDrawToFrontBuffer) = 0;
+
+  //! Creates and maps rendering window to the view.
+  //! @param theView [in] the view to associate with the window.
+  //! @param theWindow [in] the window.
+  //! @param theContext [in] the rendering context. If NULL the context will be created internally.
+  //! @param theDisplayCB [in] the display callback function. If is not a NULL value, then the callback will be
+  //! invoked at the end of the OCC graphic traversal and just before the swap of buffers.
+  //! @param theClientData [in] the client data for the callback.
+  virtual void SetWindow (const Handle(Aspect_Window)& theWindow,
+                          const Aspect_RenderingContext theContext = NULL,
+                          const Aspect_GraphicCallbackProc& theDisplayCB = NULL,
+                          const Standard_Address theClientData = NULL) = 0;
+
+  //! Returns the window associated to the view.
+  virtual Handle(Aspect_Window) Window() const = 0;
+
+  //! Returns True if the window associated to the view is defined.
+  virtual Standard_Boolean IsDefined() const = 0;
+
+  //! Displays z-buffer trihedron.
+  virtual void TriedronDisplay (const Aspect_TypeOfTriedronPosition thePosition = Aspect_TOTP_CENTER,
+                                const Quantity_NameOfColor theColor = Quantity_NOC_WHITE,
+                                const Standard_Real theScale = 0.02,
+                                const Standard_Boolean theAsWireframe = Standard_True) = 0;
+
+  //! Erases z-buffer trihedron.
+  virtual void TriedronErase() = 0;
+
+  //! Setup parameters of z-buffer trihedron.
+  virtual void ZBufferTriedronSetup (const Quantity_NameOfColor theXColor = Quantity_NOC_RED,
+                                     const Quantity_NameOfColor theYColor = Quantity_NOC_GREEN,
+                                     const Quantity_NameOfColor theZColor = Quantity_NOC_BLUE1,
+                                     const Standard_Real theSizeRatio = 0.8,
+                                     const Standard_Real theAxisDiametr = 0.05,
+                                     const Standard_Integer theNbFacettes = 12) = 0;
+
+  //! Displays trihedron echo.
+  virtual void TriedronEcho (const Aspect_TypeOfTriedronEcho theType = Aspect_TOTE_NONE) = 0;
+
+  //! Returns data of a graduated trihedron
+  virtual const Graphic3d_GraduatedTrihedron& GetGraduatedTrihedron() = 0;
+
+  //! Displays Graduated Trihedron.
+  virtual void GraduatedTrihedronDisplay (const Graphic3d_GraduatedTrihedron& theTrihedronData) = 0;
+
+  //! Erases Graduated Trihedron.
+  virtual void GraduatedTrihedronErase() = 0;
+
+  //! Sets minimum and maximum points of scene bounding box for Graduated Trihedron stored in graphic view object.
+  //! @param theMin [in] the minimum point of scene.
+  //! @param theMax [in] the maximum point of scene.
+  virtual void GraduatedTrihedronMinMaxValues (const Graphic3d_Vec3 theMin, const Graphic3d_Vec3 theMax) = 0;
+
+  //! Reads depths of shown pixels of the given rectangle.
+  virtual void ReadDepths (const Standard_Integer theX,
+                           const Standard_Integer theY,
+                           const Standard_Integer theWidth,
+                           const Standard_Integer theHeight,
+                           const Standard_Address theBuffer) const = 0;
+
+  //! Dump active rendering buffer into specified memory buffer.
+  virtual Standard_Boolean BufferDump (Image_PixMap& theImage, const Graphic3d_BufferType& theBufferType) = 0;
+
+  //! Print the contents of the view to the printer.
+  //! @param thePrinterDC        pass the PrinterDeviceContext (HDC)
+  //! @param theToShowBackground when set to FALSE then print the view without background
+  //!                            color (background is white) else set to TRUE for printing
+  //!                            with current background color
+  //! @param theFileName         if != NULL, then the view will be printed to a file
+  //! @param thePrintAlgorithm   select print algorithm: stretch, tile
+  //! @param theScaleFactor      scaling coefficient, used internally to scale the printings
+  //!                            accordingly to the scale factor selected in the printer properties dialog
+  //! @return Standard_True if the data is passed to the printer, otherwise Standard_False if
+  //! the print operation failed due to the printer errors, or lack of system memory. This might be related
+  //! to insufficient memory or some internal errors.
+  //! All this errors are indicated by the message boxes (on level of OpenGl_GraphicDriver).
+  //! Warning: This function can reuse FBO assigned to the view, please take it into account
+  //! if you use it for your purposes.
+  virtual Standard_Boolean Print (const Aspect_Handle    thePrinterDC,
+                                  const Standard_Boolean theToShowBackground,
+                                  const Standard_CString theFileName,
+                                  const Aspect_PrintAlgo thePrintAlgorithm = Aspect_PA_STRETCH,
+                                  const Standard_Real    theScaleFactor = 1.0) = 0;
+
+  //! Export scene into the one of the Vector graphics formats (SVG, PS, PDF...).
+  //! In contrast to Bitmaps, Vector graphics is scalable (so you may got quality benefits
+  //! on printing to laser printer). Notice however that results may differ a lot and
+  //! do not contain some elements.
+  virtual Standard_Boolean Export (const Standard_CString theFileName,
+                                   const Graphic3d_ExportFormat theFormat,
+                                   const Graphic3d_SortType theSortType = Graphic3d_ST_BSP_Tree) = 0;
+
+  //! Marks BVH tree and the set of BVH primitives of correspondent priority list with id theLayerId as outdated.
+  virtual void InvalidateBVHData (const Standard_Integer theLayerId) = 0;
+
+  //! Add a new top-level z layer with ID <theLayerId> for
+  //! the view. Z layers allow drawing structures in higher layers
+  //! in foreground of structures in lower layers. To add a structure
+  //! to desired layer on display it is necessary to set the layer
+  //! ID for the structure.
+  virtual void AddZLayer (const Graphic3d_ZLayerId theLayerId) = 0;
+
+  //! Remove Z layer from the specified view. All structures
+  //! displayed at the moment in layer will be displayed in default layer
+  //! ( the bottom-level z layer ). To unset layer ID from associated
+  //! structures use method UnsetZLayer (...).
+  virtual void RemoveZLayer (const Graphic3d_ZLayerId theLayerId) = 0;
+
+  //! Sets the settings for a single Z layer of specified view.
+  virtual void SetZLayerSettings (const Graphic3d_ZLayerId theLayerId,
+                                  const Graphic3d_ZLayerSettings& theSettings) = 0;
+
+  //! Returns pointer to an assigned framebuffer object.
+  virtual Graphic3d_PtrFrameBuffer FBO() const = 0;
+
+  //! Sets framebuffer object for offscreen rendering.
+  virtual void SetFBO (const Graphic3d_PtrFrameBuffer theFBO) = 0;
+
+  //! Generate offscreen FBO in the graphic library.
+  //! If not supported on hardware returns NULL.
+  virtual Graphic3d_PtrFrameBuffer FBOCreate (const Standard_Integer theWidth,
+                                              const Standard_Integer theHeight) = 0;
+
+  //! Remove offscreen FBO from the graphic library
+  virtual void FBORelease (Graphic3d_PtrFrameBuffer& theFBOPtr) = 0;
+
+  //! Read offscreen FBO configuration.
+  virtual void FBOGetDimensions (const Graphic3d_PtrFrameBuffer theFBOPtr,
+                                 Standard_Integer& theWidth,
+                                 Standard_Integer& theHeight,
+                                 Standard_Integer& theWidthMax,
+                                 Standard_Integer& theHeightMax) = 0;
+
+  //! Change offscreen FBO viewport.
+  virtual void FBOChangeViewport (Graphic3d_PtrFrameBuffer& theFBOPtr,
+                                  const Standard_Integer theWidth,
+                                  const Standard_Integer theHeight) = 0;
 
 public:
 
-  int   WsId;
-  int   ViewId;
-  void* ptrView;
+  //! Copy visualization settings from another view.
+  //! Method is used for cloning views in viewer when its required to create view
+  //! with same view properties.
+  Standard_EXPORT virtual void CopySettings (const Handle(Graphic3d_CView)& theOther);
+
+  //! Returns current rendering parameters and effect settings.
+  const Graphic3d_RenderingParams& RenderingParams() const { return myRenderParams; }
+
+  //! Returns reference to current rendering parameters and effect settings.
+  Graphic3d_RenderingParams& ChangeRenderingParams() { return myRenderParams; }
+
+  //! Returns true if anti-aliasing is enabled for the view.
+  virtual Standard_Boolean IsAntialiasingEnabled() const = 0;
+
+  //! Enable or disable anti-aliasing in the view.
+  virtual void SetAntialiasingEnabled (const Standard_Boolean theIsEnabled) = 0;
+
+  //! Returns background  fill color.
+  virtual Aspect_Background Background() const = 0;
+
+  //! Sets background fill color.
+  virtual void SetBackground (const Aspect_Background& theBackground) = 0;
+
+  //! Returns gradient background fill colors.
+  virtual Aspect_GradientBackground GradientBackground() const = 0;
+
+  //! Sets gradient background fill colors.
+  virtual void SetGradientBackground (const Aspect_GradientBackground& theBackground) = 0;
+
+  //! Returns background image texture file path.
+  virtual TCollection_AsciiString BackgroundImage() = 0;
+
+  //! Sets background image texture file path.
+  virtual void SetBackgroundImage (const TCollection_AsciiString& theFilePath) = 0;
+
+  //! Returns background image fill style.
+  virtual Aspect_FillMethod BackgroundImageStyle() const = 0;
+
+  //! Sets background image fill style.
+  virtual void SetBackgroundImageStyle (const Aspect_FillMethod theFillStyle) = 0;
+
+  //! Returns environment texture set for the view.
+  virtual Handle(Graphic3d_TextureEnv) TextureEnv() const = 0; 
+
+  //! Sets environment texture for the view.
+  virtual void SetTextureEnv (const Handle(Graphic3d_TextureEnv)& theTextureEnv) = 0;
+
+  //! Returns the state of frustum culling optimization.
+  virtual Standard_Boolean IsCullingEnabled() const = 0;
+
+  //! Enables or disables frustum culling optimization.
+  virtual void SetCullingEnabled (const Standard_Boolean theIsEnabled) = 0;
+
+  //! Returns shading model of the view.
+  virtual Graphic3d_TypeOfShadingModel ShadingModel() const = 0;
+
+  //! Sets shading model of the view.
+  virtual void SetShadingModel (const Graphic3d_TypeOfShadingModel theModel) = 0;
+
+  //! Returns surface detail type of the view.
+  virtual Graphic3d_TypeOfSurfaceDetail SurfaceDetailType() const = 0;
+
+  //! Sets surface detail type of the view.
+  virtual void SetSurfaceDetailType (const Graphic3d_TypeOfSurfaceDetail theType) = 0;
 
-  int   IsDeleted;
-  int   IsOpen;
+  //! Return backfacing model used for the view.
+  virtual Graphic3d_TypeOfBackfacingModel BackfacingModel() const = 0;
 
-  int   Active;
+  //! Sets backfacing model for the view.
+  virtual void SetBackfacingModel (const Graphic3d_TypeOfBackfacingModel theModel) = 0;
 
-  CALL_DEF_VIEWCONTEXT     Context;
+  //! Returns camera object of the view.
+  virtual const Handle(Graphic3d_Camera)& Camera() const = 0;
 
-  CALL_DEF_WINDOW          DefWindow;
+  //! Sets camera used by the view.
+  virtual void SetCamera (const Handle(Graphic3d_Camera)& theCamera) = 0;
 
-  void* ptrUnderLayer;
-  void* ptrOverLayer;
+  //! Returns the activity of back z-clipping plane.
+  virtual Standard_Boolean BackZClippingIsOn() const = 0;
 
-  int   Backfacing;
+  //! Activates the back Z-clipping plane.
+  virtual void SetBackZClippingOn (const Standard_Boolean theIsOn) = 0;
 
-  Aspect_RenderingContext    GContext;
-  Aspect_GraphicCallbackProc GDisplayCB;
-  void* GClientData;
+  //! Returns the definition of the back Z-clipping plane.
+  virtual Standard_Real ZClippingBackPlane() const = 0;
 
-  void* ptrFBO;
+  //! Sets the definition of the back Z-clipping plane.
+  virtual void SetZClippingBackPlane (const Standard_Real theValue) = 0;
 
-  //! Was the window redrawn by standard OpenGL?
-  mutable int WasRedrawnGL;
+  //! Returns the activity of front z-clipping plane.
+  virtual Standard_Boolean FrontZClippingIsOn() const = 0;
 
-  //! Specifies rendering parameters and effects.
-  Graphic3d_RenderingParams RenderParams;
+  //! Activates the front Z-clipping plane.
+  virtual void SetFrontZClippingOn (const Standard_Boolean theIsOn) = 0;
 
-  //! Enables/disables frustum culling.
-  Standard_Boolean IsCullingEnabled;
+  //! Returns the definition of the front Z-clipping plane.
+  virtual Standard_Real ZClippingFrontPlane() const = 0;
 
+  //! Sets the definition of the front Z-clipping plane.
+  virtual void SetZClippingFrontPlane (const Standard_Real theValue) = 0;
+
+  //! Returns the activity of depth cueing.
+  virtual Standard_Boolean DepthCueingIsOn() const = 0;
+
+  //! Sets the activity of depth cueing.
+  virtual void SetDepthCueingOn (const Standard_Boolean theIsOn) = 0;
+
+  //! Returns the back depth cueing plane.
+  virtual Standard_Real DepthCueingBackPlane() const = 0;
+
+  //! Set the back depth cueing plane.
+  virtual void SetDepthCueingBackPlane (const Standard_Real theValue) = 0;
+
+  //! Returns the front depth cueing plane.
+  virtual Standard_Real DepthCueingFrontPlane() const = 0;
+
+  //! Set the front depth cueing plane.
+  virtual void SetDepthCueingFrontPlane (const Standard_Real theValue) = 0;
+
+  //! Returns true if GL lighting is enabled.
+  virtual Standard_Boolean IsGLLightEnabled() const = 0;
+
+  //! Sets GL lighting enabled or disable state.
+  virtual void SetGLLightEnabled (const Standard_Boolean theIsEnabled) = 0;
+
+  //! Returns list of lights of the view.
+  virtual const Graphic3d_ListOfCLight& Lights() const = 0;
+
+  //! Sets list of lights for the view.
+  virtual void SetLights (const Graphic3d_ListOfCLight& theLights) = 0;
+
+  //! Returns list of clip planes set for the view.
+  virtual const Graphic3d_SequenceOfHClipPlane& ClipPlanes() const = 0;
+
+  //! Sets list of clip planes for the view.
+  virtual void SetClipPlanes (const Graphic3d_SequenceOfHClipPlane& thePlanes) = 0;
+
+private:
+
+  //! Adds the structure to display lists of the view.
+  virtual void displayStructure (const Handle(Graphic3d_CStructure)& theStructure,
+                                 const Standard_Integer thePriority) = 0;
+
+  //! Erases the structure from display lists of the view.
+  virtual void eraseStructure (const Handle(Graphic3d_CStructure)& theStructure) = 0;
+
+  //! Change Z layer of a structure already presented in view.
+  virtual void changeZLayer (const Handle(Graphic3d_CStructure)& theCStructure,
+                             const Graphic3d_ZLayerId theNewLayerId) = 0;
+
+  //! Changes the priority of a structure within its Z layer in the specified view.
+  virtual void changePriority (const Handle(Graphic3d_CStructure)& theCStructure,
+                               const Standard_Integer theNewPriority) = 0;
+
+protected:
+
+  struct CachedMinMax
+  {
+    CachedMinMax() { Invalidate(); }
+
+    Bnd_Box& BoundingBox (const Standard_Boolean theToIgnoreInfiniteFlag)
+    {
+      return !theToIgnoreInfiniteFlag ? myBoundingBox[0] : myBoundingBox[1];
+    }
+    Standard_Boolean& IsOutdated (const Standard_Boolean theToIgnoreInfiniteFlag)
+    {
+      return !theToIgnoreInfiniteFlag ? myIsOutdated[0] : myIsOutdated[1];
+    }
+    void Invalidate()
+    {
+      myIsOutdated[0] = Standard_True;
+      myIsOutdated[1] = Standard_True;
+    }
+
+    Standard_Boolean myIsOutdated [2];
+    Bnd_Box          myBoundingBox[2];
+  };
+
+protected:
+
+  Standard_Integer myId;
+  Graphic3d_RenderingParams myRenderParams;
+  Handle(Graphic3d_StructureManager) myStructureManager;
+  Graphic3d_SequenceOfStructure myStructsToCompute;
+  Graphic3d_SequenceOfStructure myStructsComputed;
+  Graphic3d_MapOfStructure myStructsDisplayed;
+  Handle(Graphic3d_NMapOfTransient) myHiddenObjects;
+  Standard_Boolean myIsInComputedMode;
+  Standard_Boolean myIsActive;
+  Standard_Boolean myIsRemoved;
+  Graphic3d_TypeOfVisualization myVisualization;
+  mutable CachedMinMax myMinMax;
+
+private:
+
+  DEFINE_STANDARD_RTTI (Graphic3d_CView, Graphic3d_DataStructureManager)
 };
 
-#endif // Graphic3d_CView_HeaderFile
+#endif // _Graphic3d_CView_HeaderFile
index f6c043c..11e120b 100644 (file)
@@ -235,6 +235,11 @@ gp_Dir Graphic3d_Camera::Direction() const
 // =======================================================================
 void Graphic3d_Camera::SetScale (const Standard_Real theScale)
 {
+  if (Scale() == theScale)
+  {
+    return;
+  }
+
   myScale = theScale;
 
   switch (myProjType)
@@ -281,7 +286,7 @@ Standard_Real Graphic3d_Camera::Scale() const
 // =======================================================================
 void Graphic3d_Camera::SetProjectionType (const Projection theProjectionType)
 {
-  Projection anOldType = myProjType;
+  Projection anOldType = ProjectionType();
 
   if (anOldType == theProjectionType)
   {
@@ -311,7 +316,13 @@ void Graphic3d_Camera::SetProjectionType (const Projection theProjectionType)
 // =======================================================================
 void Graphic3d_Camera::SetFOVy (const Standard_Real theFOVy)
 {
+  if (FOVy() == theFOVy)
+  {
+    return;
+  }
+
   myFOVy = theFOVy;
+
   InvalidateProjection();
 }
 
@@ -329,6 +340,12 @@ void Graphic3d_Camera::SetZRange (const Standard_Real theZNear,
     Standard_ASSERT_RAISE (theZFar  > 0.0, "Only positive Z-Far is allowed for perspective camera");
   }
 
+  if (ZNear() == theZNear
+   && ZFar () == theZFar)
+  {
+    return;
+  }
+
   myZNear = theZNear;
   myZFar  = theZFar;
 
@@ -341,7 +358,13 @@ void Graphic3d_Camera::SetZRange (const Standard_Real theZNear,
 // =======================================================================
 void Graphic3d_Camera::SetAspect (const Standard_Real theAspect)
 {
+  if (Aspect() == theAspect)
+  {
+    return;
+  }
+
   myAspect = theAspect;
+
   InvalidateProjection();
 }
 
@@ -351,8 +374,15 @@ void Graphic3d_Camera::SetAspect (const Standard_Real theAspect)
 // =======================================================================
 void Graphic3d_Camera::SetZFocus(const FocusType theType, const Standard_Real theZFocus)
 {
+  if (ZFocusType() == theType
+   && ZFocus    () == theZFocus)
+  {
+    return;
+  }
+
   myZFocusType = theType;
-  myZFocus = theZFocus;
+  myZFocus     = theZFocus;
+
   InvalidateProjection();
 }
 
@@ -362,8 +392,15 @@ void Graphic3d_Camera::SetZFocus(const FocusType theType, const Standard_Real th
 // =======================================================================
 void Graphic3d_Camera::SetIOD (const IODType theType, const Standard_Real theIOD)
 {
+  if (IODType() == theType
+   && IOD    () == theIOD)
+  {
+    return;
+  }
+
   myIODType = theType;
-  myIOD = theIOD;
+  myIOD     = theIOD;
+
   InvalidateProjection();
 }
 
index 13eb392..7d9b759 100644 (file)
@@ -24,7 +24,7 @@
 #include <TCollection_AsciiString.hxx>
 #include <TCollection_ExtendedString.hxx>
 
-class Visual3d_View;
+class Graphic3d_CView;
 
 //! Class that stores style for one graduated trihedron axis such as colors, lengths and customization flags.
 //! It is used in Graphic3d_GraduatedTrihedron.
@@ -111,7 +111,7 @@ class Graphic3d_GraduatedTrihedron
 {
 public:
 
-  typedef void (*MinMaxValuesCallback) (Visual3d_View*);
+  typedef void (*MinMaxValuesCallback) (Graphic3d_CView*);
 
 public:
 
@@ -138,7 +138,7 @@ public:
     myAxes (0) = Graphic3d_AxisAspect ("X", Quantity_NOC_RED, Quantity_NOC_RED);
     myAxes (1) = Graphic3d_AxisAspect ("Y", Quantity_NOC_GREEN, Quantity_NOC_GREEN);
     myAxes (2) = Graphic3d_AxisAspect ("Z", Quantity_NOC_BLUE1, Quantity_NOC_BLUE1);
-    PtrVisual3dView = NULL;
+    PtrView    = NULL;
   }
 
 public:
@@ -196,7 +196,7 @@ public:
 public:
 
   MinMaxValuesCallback CubicAxesCallback; //!< Callback function to define boundary box of displayed objects
-  Visual3d_View*       PtrVisual3dView;
+  Graphic3d_CView*     PtrView;
 
 protected:
 
index 8c54362..ac6bbd3 100644 (file)
@@ -14,7 +14,6 @@
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-
 #include <Graphic3d_GraphicDriver.hxx>
 #include <Graphic3d_Structure.hxx>
 #include <Graphic3d_StructureManager.hxx>
@@ -79,10 +78,9 @@ void Graphic3d_GraphicDriver::PrintCStructure (const Graphic3d_CStructure& ACStr
 void Graphic3d_GraphicDriver::PrintCView (const Graphic3d_CView& ACView, const Standard_Integer AField) const {
 
   if (AField) {
-    cout << "\tws id " << ACView.WsId << ", "
-      << "view id " << ACView.ViewId << "\n";
-    cout << "\tXwindow id " << ACView.DefWindow.XWindow << ", "
-      << "activity " << ACView.Active << "\n";
+    cout << "view id " << ACView.Identification() << "\n";
+    cout << "\tXwindow id " << (ACView.Window().IsNull() ? 0 : ACView.Window()->NativeHandle()) << ", "
+      << "activity " << ACView.IsActive() << "\n";
     cout << flush;
   }
 
index 12c0333..3bc5fa9 100644 (file)
 #include <Graphic3d_ZLayerSettings.hxx>
 #include <Graphic3d_CLight.hxx>
 #include <TColStd_Array2OfReal.hxx>
+#include <TColStd_SequenceOfInteger.hxx>
+
+class Graphic3d_CView;
+class Graphic3d_GraphicDriver;
 class Graphic3d_TransformError;
 class Graphic3d_Structure;
 class Graphic3d_StructureManager;
+class Graphic3d_ViewManager;
 class Quantity_Color;
 class TCollection_AsciiString;
 
-
-class Graphic3d_GraphicDriver;
 DEFINE_STANDARD_HANDLE(Graphic3d_GraphicDriver, MMgt_TShared)
 
 //! This class allows the definition of a graphic driver
@@ -68,218 +71,63 @@ public:
 
   
   //! call_togl_inquirelight
-  Standard_EXPORT virtual Standard_Integer InquireLightLimit() = 0;
+  virtual Standard_Integer InquireLightLimit() = 0;
   
   //! call_togl_inquireplane
-  Standard_EXPORT virtual Standard_Integer InquirePlaneLimit() = 0;
+  virtual Standard_Integer InquirePlaneLimit() = 0;
   
   //! call_togl_inquireview
-  Standard_EXPORT virtual Standard_Integer InquireViewLimit() = 0;
-  
-  //! call_togl_displaystructure
-  Standard_EXPORT virtual void DisplayStructure (const Graphic3d_CView& theCView, const Handle(Graphic3d_Structure)& theStructure, const Standard_Integer thePriority) = 0;
-  
-  //! call_togl_erasestructure
-  Standard_EXPORT virtual void EraseStructure (const Graphic3d_CView& theCView, const Handle(Graphic3d_Structure)& theStructure) = 0;
-  
-  //! call_togl_removestructure
-  Standard_EXPORT virtual void RemoveStructure (Handle(Graphic3d_CStructure)& theCStructure) = 0;
+  virtual Standard_Integer InquireViewLimit() = 0;
   
   //! Creates new empty graphic structure
-  Standard_EXPORT virtual Handle(Graphic3d_CStructure) Structure (const Handle(Graphic3d_StructureManager)& theManager) = 0;
-  
-  //! call_togl_activateview
-  Standard_EXPORT virtual void ActivateView (const Graphic3d_CView& ACView) = 0;
-  
-  //! call_togl_antialiasing
-  Standard_EXPORT virtual void AntiAliasing (const Graphic3d_CView& ACView, const Standard_Boolean AFlag) = 0;
-  
-  //! call_togl_background
-  Standard_EXPORT virtual void Background (const Graphic3d_CView& ACView) = 0;
-  
-  //! call_togl_gradient_background
-  Standard_EXPORT virtual void GradientBackground (const Graphic3d_CView& ACView, const Quantity_Color& AColor1, const Quantity_Color& AColor2, const Aspect_GradientFillMethod FillStyle) = 0;
-  
-  Standard_EXPORT virtual void BackgroundImage (const Standard_CString FileName, const Graphic3d_CView& ACView, const Aspect_FillMethod FillStyle) = 0;
-  
-  Standard_EXPORT virtual void SetBgImageStyle (const Graphic3d_CView& ACView, const Aspect_FillMethod FillStyle) = 0;
-  
-  Standard_EXPORT virtual void SetBgGradientStyle (const Graphic3d_CView& ACView, const Aspect_GradientFillMethod FillStyle) = 0;
-  
-  //! call_togl_cliplimit
-  Standard_EXPORT virtual void ClipLimit (const Graphic3d_CView& ACView, const Standard_Boolean AWait) = 0;
+  virtual Handle(Graphic3d_CStructure) CreateStructure (const Handle(Graphic3d_StructureManager)& theManager) = 0;
   
-  //! call_togl_deactivateview
-  Standard_EXPORT virtual void DeactivateView (const Graphic3d_CView& ACView) = 0;
+  //! Removes structure from graphic driver and releases its resources.
+  virtual void RemoveStructure (Handle(Graphic3d_CStructure)& theCStructure) = 0;
   
-  //! call_togl_cliplimit
-  Standard_EXPORT virtual void DepthCueing (const Graphic3d_CView& ACView, const Standard_Boolean AFlag) = 0;
+  //! Creates new view for this graphic driver.
+  virtual Handle(Graphic3d_CView) CreateView (const Handle(Graphic3d_StructureManager)& theMgr) = 0;
   
-  //! call_togl_ratio_window
-  Standard_EXPORT virtual void RatioWindow (const Graphic3d_CView& ACView) = 0;
-  
-  //! Redraw content of the view
-  Standard_EXPORT virtual void Redraw (const Graphic3d_CView& theCView, const Standard_Integer theX = 0, const Standard_Integer theY = 0, const Standard_Integer theWidth = 0, const Standard_Integer theHeight = 0) = 0;
-  
-  //! Redraw layer of immediate presentations
-  Standard_EXPORT virtual void RedrawImmediate (const Graphic3d_CView& theCView) = 0;
-  
-  //! Invalidates content of the view but does not redraw it
-  Standard_EXPORT virtual void Invalidate (const Graphic3d_CView& theCView) = 0;
-
-  //! Returns true if cached view content has been invalidated.
-  Standard_EXPORT virtual Standard_Boolean IsInvalidated (const Graphic3d_CView& theCView) const = 0;
+  //! Removes view from graphic driver and releases its resources.
+  virtual void RemoveView (const Handle(Graphic3d_CView)& theView) = 0;
 
-  //! call_togl_removeview
-  Standard_EXPORT virtual void RemoveView (const Graphic3d_CView& ACView) = 0;
-  
-  //! call_togl_setlight
-  Standard_EXPORT virtual void SetLight (const Graphic3d_CView& ACView) = 0;
-  
-  //! Pass clip planes to the associated graphic driver view.
-  Standard_EXPORT virtual void SetClipPlanes (const Graphic3d_CView& theCView) = 0;
-  
-  //! Inform graphic driver if camera assigned to view changes.
-  Standard_EXPORT virtual void SetCamera (const Graphic3d_CView& theCView) = 0;
-  
-  //! call_togl_setvisualisation
-  Standard_EXPORT virtual void SetVisualisation (const Graphic3d_CView& ACView) = 0;
-  
-  //! call_togl_view
-  Standard_EXPORT virtual Standard_Boolean View (Graphic3d_CView& ACView) = 0;
-  
-  Standard_EXPORT virtual void Environment (const Graphic3d_CView& ACView) = 0;
-  
   //! enables/disables usage of OpenGL vertex buffer arrays while drawing primitiev arrays
-  Standard_EXPORT virtual void EnableVBO (const Standard_Boolean status) = 0;
+  virtual void EnableVBO (const Standard_Boolean status) = 0;
   
   //! Returns information about GPU memory usage.
-  Standard_EXPORT virtual Standard_Boolean MemoryInfo (Standard_Size& theFreeBytes, TCollection_AsciiString& theInfo) const = 0;
-  
-  //! call_togl_ztriedron_setup
-  Standard_EXPORT virtual void ZBufferTriedronSetup (const Graphic3d_CView& theCView, const Quantity_NameOfColor XColor = Quantity_NOC_RED, const Quantity_NameOfColor YColor = Quantity_NOC_GREEN, const Quantity_NameOfColor ZColor = Quantity_NOC_BLUE1, const Standard_Real SizeRatio = 0.8, const Standard_Real AxisDiametr = 0.05, const Standard_Integer NbFacettes = 12) = 0;
-  
-  //! call_togl_triedron_display
-  Standard_EXPORT virtual void TriedronDisplay (const Graphic3d_CView& ACView, const Aspect_TypeOfTriedronPosition APosition = Aspect_TOTP_CENTER, const Quantity_NameOfColor AColor = Quantity_NOC_WHITE, const Standard_Real AScale = 0.02, const Standard_Boolean AsWireframe = Standard_True) = 0;
-  
-  //! call_togl_triedron_erase
-  Standard_EXPORT virtual void TriedronErase (const Graphic3d_CView& ACView) = 0;
+  virtual Standard_Boolean MemoryInfo (Standard_Size& theFreeBytes, TCollection_AsciiString& theInfo) const = 0;
   
-  //! call_togl_triedron_echo
-  Standard_EXPORT virtual void TriedronEcho (const Graphic3d_CView& ACView, const Aspect_TypeOfTriedronEcho AType = Aspect_TOTE_NONE) = 0;
-  
-  //! call_togl_graduatedtrihedron_display
-  Standard_EXPORT virtual void GraduatedTrihedronDisplay (const Graphic3d_CView& theView, const Graphic3d_GraduatedTrihedron& theCubic) = 0;
-  
-  //! call_togl_graduatedtrihedron_erase
-  Standard_EXPORT virtual void GraduatedTrihedronErase (const Graphic3d_CView& theView) = 0;
-  
-  //! Sets minimum and maximum points of scene bounding box for Graduated Trihedron
-  //! stored in graphic view object.
-  //! @param theView [in] current graphic view
-  //! @param theMin [in] the minimum point of scene.
-  //! @param theMax [in] the maximum point of scene.
-  Standard_EXPORT virtual void GraduatedTrihedronMinMaxValues (const Graphic3d_CView& theView, const Graphic3d_Vec3 theMin, const Graphic3d_Vec3 theMax) = 0;
-  
-  //! @param theDrawToFrontBuffer Advanced option to modify rendering mode:
-  //! 1. TRUE.  Drawing immediate mode structures directly to the front buffer over the scene image.
-  //! Fast, so preferred for interactive work (used by default).
-  //! However these extra drawings will be missed in image dump since it is performed from back buffer.
-  //! Notice that since no pre-buffering used the V-Sync will be ignored and rendering could be seen
-  //! in run-time (in case of slow hardware) and/or tearing may appear.
-  //! So this is strongly recommended to draw only simple (fast) structures.
-  //! 2. FALSE. Drawing immediate mode structures to the back buffer.
-  //! The complete scene is redrawn first, so this mode is slower if scene contains complex data and/or V-Sync is turned on.
-  //! But it works in any case and is especially useful for view dump because the dump image is read from the back buffer.
-  //! @return previous mode.
-  Standard_EXPORT virtual Standard_Boolean SetImmediateModeDrawToFront (const Graphic3d_CView& theCView, const Standard_Boolean theDrawToFrontBuffer) = 0;
-
-  Standard_EXPORT virtual Standard_ShortReal DefaultTextHeight() const = 0;
+  virtual Standard_ShortReal DefaultTextHeight() const = 0;
   
   //! call_togl_textsize2d
-  Standard_EXPORT virtual void TextSize (const Standard_CString AText, const Standard_ShortReal AHeight, Standard_ShortReal& AWidth, Standard_ShortReal& AnAscent, Standard_ShortReal& ADescent) const = 0;
-  
-  //! call_togl_backfacing
-  Standard_EXPORT virtual void SetBackFacingModel (const Graphic3d_CView& aView) = 0;
-  
-  //! Reads depths of shown pixels of the given
-  //! rectangle (glReadPixels with GL_DEPTH_COMPONENT)
-  Standard_EXPORT virtual void ReadDepths (const Graphic3d_CView& view, const Standard_Integer x, const Standard_Integer y, const Standard_Integer width, const Standard_Integer height, const Standard_Address buffer) const = 0;
-  
-  //! Generate offscreen FBO in the graphic library.
-  //! If not supported on hardware returns NULL.
-  Standard_EXPORT virtual Graphic3d_PtrFrameBuffer FBOCreate (const Graphic3d_CView& view, const Standard_Integer width, const Standard_Integer height) = 0;
-  
-  //! Remove offscreen FBO from the graphic library
-  Standard_EXPORT virtual void FBORelease (const Graphic3d_CView& view, Graphic3d_PtrFrameBuffer& fboPtr) = 0;
-  
-  //! Read offscreen FBO configuration.
-  Standard_EXPORT virtual void FBOGetDimensions (const Graphic3d_CView& view, const Graphic3d_PtrFrameBuffer fboPtr, Standard_Integer& width, Standard_Integer& height, Standard_Integer& widthMax, Standard_Integer& heightMax) = 0;
-  
-  //! Change offscreen FBO viewport.
-  Standard_EXPORT virtual void FBOChangeViewport (const Graphic3d_CView& view, Graphic3d_PtrFrameBuffer& fboPtr, const Standard_Integer width, const Standard_Integer height) = 0;
-  
-  //! Dump active rendering buffer into specified memory buffer.
-  Standard_EXPORT virtual Standard_Boolean BufferDump (const Graphic3d_CView& theCView, Image_PixMap& theImage, const Graphic3d_BufferType& theBufferType) = 0;
-  
-  //! call_togl_gllight
-  Standard_EXPORT virtual void SetGLLightEnabled (const Graphic3d_CView& view, const Standard_Boolean isEnabled) const = 0;
-  
-  //! call_togl_isgllight
-  Standard_EXPORT virtual Standard_Boolean IsGLLightEnabled (const Graphic3d_CView& view) const = 0;
-  
-  //! print the contents of all layers of the view to the printer.
-  //! <hPrnDC> : Pass the PrinterDeviceContext (HDC),
-  //! <showBackground> : When set to FALSE then print the view without background color
-  //! (background is white)
-  //! else set to TRUE for printing with current background color.
-  //! <filename>: If != NULL, then the view will be printed to a file.
-  //! <printAlgorithm>: Select print algorithm: stretch, tile.
-  //! <theScaleFactor>: Scaling coefficient, used internally to scale the
-  //! printings accordingly to the scale factor selected in the printer
-  //! properties dialog.
-  //! Returns Standard_True if the data is passed to the printer, otherwise
-  //! Standard_False if the print operation failed due to the printer errors,
-  //! or insufficient system memory available.
-  Standard_EXPORT virtual Standard_Boolean Print (const Graphic3d_CView& ACView, const Aspect_Handle hPrnDC, const Standard_Boolean showBackground, const Standard_CString filename, const Aspect_PrintAlgo printAlgorithm = Aspect_PA_STRETCH, const Standard_Real theScaleFactor = 1.0) const = 0;
-  
+  virtual void TextSize (const Standard_CString AText, const Standard_ShortReal AHeight, Standard_ShortReal& AWidth, Standard_ShortReal& AnAscent, Standard_ShortReal& ADescent) const = 0;
 
-  //! Export scene into the one of the Vector graphics formats (SVG, PS, PDF...).
-  //! In contrast to Bitmaps, Vector graphics is scalable (so you may got quality benefits on printing to laser printer).
-  //! Notice however that results may differ a lot and do not contain some elements.
-  Standard_EXPORT virtual Standard_Boolean Export (const Standard_CString theFileName, const Graphic3d_ExportFormat theFormat, const Graphic3d_SortType theSortType, const Standard_Integer theWidth, const Standard_Integer theHeight, const Graphic3d_CView& theView, const Standard_Real thePrecision = 0.005, const Standard_Address theProgressBarFunc = NULL, const Standard_Address theProgressObject = NULL) = 0;
-  
-
-  //! Marks BVH tree and the set of BVH primitives of correspondent priority list with id theLayerId as outdated.
-  Standard_EXPORT virtual void InvalidateBVHData (Graphic3d_CView& theCView, const Standard_Integer theLayerId) = 0;
-  
   //! Add a new top-level z layer with ID <theLayerId> for
   //! the view. Z layers allow drawing structures in higher layers
   //! in foreground of structures in lower layers. To add a structure
   //! to desired layer on display it is necessary to set the layer
   //! ID for the structure.
-  Standard_EXPORT virtual void AddZLayer (const Graphic3d_CView& theCView, const Graphic3d_ZLayerId theLayerId) = 0;
-  
-  //! Remove Z layer from the specified view. All structures
-  //! displayed at the moment in layer will be displayed in default layer
-  //! ( the bottom-level z layer ). To unset layer ID from associated
-  //! structures use method UnsetZLayer (...).
-  Standard_EXPORT virtual void RemoveZLayer (const Graphic3d_CView& theCView, const Graphic3d_ZLayerId theLayerId) = 0;
-  
-  //! Unset Z layer ID for all structures. The structure
-  //! indexes will be set to default layer ( the bottom-level z layer
-  //! with ID = 0 ).
-  Standard_EXPORT virtual void UnsetZLayer (const Graphic3d_ZLayerId theLayerId) = 0;
+  virtual void AddZLayer (const Graphic3d_ZLayerId theLayerId) = 0;
 
-  //! Change Z layer of a structure already presented in view.
-  Standard_EXPORT virtual void ChangeZLayer (const Graphic3d_CStructure& theCStructure, const Graphic3d_CView& theCView, const Graphic3d_ZLayerId theNewLayerId) = 0;
-  
-  //! Sets the settings for a single Z layer of specified view.
-  Standard_EXPORT virtual void SetZLayerSettings (const Graphic3d_CView& theCView, const Graphic3d_ZLayerId theLayerId, const Graphic3d_ZLayerSettings& theSettings) = 0;
+  //! Removes Z layer. All structures displayed at the moment in layer will be displayed in
+  //! default layer (the bottom-level z layer). By default, there are always default
+  //! bottom-level layer that can't be removed.  The passed theLayerId should be not less than 0
+  //! (reserved for default layers that can not be removed).
+  virtual void RemoveZLayer (const Graphic3d_ZLayerId theLayerId) = 0;
+
+  //! Returns list of Z layers defined for the graphical driver.
+  virtual void ZLayers (TColStd_SequenceOfInteger& theLayerSeq) const = 0;
+
+  //! Sets the settings for a single Z layer.
+  virtual void SetZLayerSettings (const Graphic3d_ZLayerId theLayerId, const Graphic3d_ZLayerSettings& theSettings) = 0;
+
+  //! Returns the settings of a single Z layer.
+  virtual Graphic3d_ZLayerSettings ZLayerSettings (const Graphic3d_ZLayerId theLayerId) = 0;
+
+  //! Returns view associated with the window if it is exists and is activated.
+  //! Returns Standard_True if the view associated to the window exists.
+  virtual Standard_Boolean ViewExists (const Handle(Aspect_Window)& theWindow, Handle(Graphic3d_CView)& theView) = 0;
 
-  //! Changes the priority of a structure within its Z layer in the specified view.
-  Standard_EXPORT virtual void ChangePriority (const Graphic3d_CStructure& theCStructure, const Graphic3d_CView& theCView, const Standard_Integer theNewPriority) = 0;
-  
   Standard_EXPORT void PrintBoolean (const Standard_CString AComment, const Standard_Boolean AValue) const;
   
   Standard_EXPORT void PrintCLight (const Graphic3d_CLight& ACLight, const Standard_Integer AField) const;
@@ -311,15 +159,12 @@ public:
   
   Standard_EXPORT void ResetDeviceLostFlag();
 
-
-
-
   DEFINE_STANDARD_RTTI(Graphic3d_GraphicDriver,MMgt_TShared)
 
 protected:
 
   
-  //! Initialises the Driver
+  //! Initializes the Driver
   Standard_EXPORT Graphic3d_GraphicDriver(const Handle(Aspect_DisplayConnection)& theDisp);
 
   Standard_Integer MyTraceLevel;
index b44c6d7..4000c7c 100644 (file)
@@ -259,10 +259,7 @@ void Graphic3d_Group::Update() const
     return;
   }
 
-  if (myStructure->StructureManager()->UpdateMode() == Aspect_TOU_ASAP)
-  {
-    myStructure->StructureManager()->Update();
-  }
+  myStructure->StructureManager()->Update (myStructure->StructureManager()->UpdateMode());
 }
 
 // =======================================================================
index 55812d2..0d25052 100644 (file)
@@ -95,14 +95,6 @@ public:
   //! one of reflection modes (ambient, diffuse, specular or emissive)
   //! enabled. See also SetReflectionModeOn() and SetReflectionModeOff() methods.
   //!
-  //! NOTE: In order for transparency specified through this method to
-  //! take effect, it is necessary to enable transparency
-  //! in the viewer. This can be done either directly -
-  //! see Visual3d_ViewManager::SetTransparency(Standard_Boolean),
-  //! or indirectly - by calling AIS_InteractiveObject::SetTransparency()
-  //! before an object is added to an interactive context, or by
-  //! calling AIS_InteractiveContext::SetTransparency() for a given
-  //! interactive object already displayed.
   //! Category: Methods to modify the class definition
   //! Warning: Raises MaterialDefinitionError if <AValue> is a
   //! negative value or greater than 1.0.
index a6403b4..655499a 100644 (file)
@@ -53,7 +53,7 @@ Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManage
   myOwner                 (NULL),
   myVisual                (Graphic3d_TOS_ALL)
 {
-  myCStructure = theManager->GraphicDriver()->Structure (theManager);
+  myCStructure = theManager->GraphicDriver()->CreateStructure (theManager);
 
   // default aspects
   Handle(Graphic3d_AspectLine3d)     aAspectLine3d     = new Graphic3d_AspectLine3d();
@@ -2033,10 +2033,7 @@ void Graphic3d_Structure::Update() const
     return;
   }
 
-  if (myStructureManager->UpdateMode() == Aspect_TOU_ASAP)
-  {
-    myStructureManager->Update();
-  }
+  myStructureManager->Update (myStructureManager->UpdateMode());
 }
 
 //=============================================================================
index f7fafe7..7f506e6 100644 (file)
@@ -42,6 +42,7 @@ static Standard_Integer StructureManager_CurrentId = 0;
 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
 
 Graphic3d_StructureManager::Graphic3d_StructureManager (const Handle(Graphic3d_GraphicDriver)& theDriver)
+: myViewGenId (0, 31)
 {
 
 Standard_Real Coef;
@@ -81,17 +82,17 @@ Standard_Integer Limit  = Graphic3d_StructureManager::Limit ();
         Aspect_GenId theGenId(
           Standard_Integer (Structure_IDMIN+Coef*(StructureManager_CurrentId)),
           Standard_Integer (Structure_IDMIN+Coef*(StructureManager_CurrentId+1)-1));
-        MyStructGenId   = theGenId;
+        myStructGenId   = theGenId;
 
-        MyId                    = StructureManager_CurrentId;
+        myId                    = StructureManager_CurrentId;
 
-        MyAspectLine3d          = new Graphic3d_AspectLine3d ();
-        MyAspectText3d          = new Graphic3d_AspectText3d ();
-        MyAspectMarker3d        = new Graphic3d_AspectMarker3d ();
-        MyAspectFillArea3d      = new Graphic3d_AspectFillArea3d ();
+        myAspectLine3d          = new Graphic3d_AspectLine3d ();
+        myAspectText3d          = new Graphic3d_AspectText3d ();
+        myAspectMarker3d        = new Graphic3d_AspectMarker3d ();
+        myAspectFillArea3d      = new Graphic3d_AspectFillArea3d ();
 
-        MyUpdateMode            = Aspect_TOU_WAIT;
-        MyGraphicDriver         = theDriver;
+        myUpdateMode            = Aspect_TOU_WAIT;
+        myGraphicDriver         = theDriver;
 
 }
 
@@ -99,103 +100,150 @@ Standard_Integer Limit  = Graphic3d_StructureManager::Limit ();
 
 void Graphic3d_StructureManager::Destroy () {
 
-        MyDisplayedStructure.Clear ();
-        MyHighlightedStructure.Clear ();
-        StructureManager_ArrayId[MyId]  = 0;
+        myDisplayedStructure.Clear ();
+        myHighlightedStructure.Clear ();
+        myDefinedViews.Clear();
+        StructureManager_ArrayId[myId]  = 0;
 
 }
 
-//-Methods, in order
-
-void Graphic3d_StructureManager::SetUpdateMode (const Aspect_TypeOfUpdate AType) {
+// ========================================================================
+// function : SetUpdateMode
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::SetUpdateMode (const Aspect_TypeOfUpdate theType)
+{
+  myUpdateMode = theType;
+}
 
-        MyUpdateMode    = AType;
+// ========================================================================
+// function : UpdateMode
+// purpose  :
+// ========================================================================
+Aspect_TypeOfUpdate Graphic3d_StructureManager::UpdateMode() const
+{
+  return myUpdateMode;
+}
 
+// ========================================================================
+// function : Update
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::Update (const Aspect_TypeOfUpdate theMode) const
+{
+  for (Graphic3d_IndexedMapOfView::Iterator aViewIt (myDefinedViews); aViewIt.More(); aViewIt.Next())
+  {
+    aViewIt.Value()->Update (theMode);
+  }
 }
 
-Aspect_TypeOfUpdate Graphic3d_StructureManager::UpdateMode () const {
+// ========================================================================
+// function : Remove
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::Remove()
+{
+  // clear all structures whilst views are alive for correct GPU memory management
+  myDisplayedStructure.Clear();
+  myHighlightedStructure.Clear();
 
-        return (MyUpdateMode);
+  // clear list of managed views
+  myDefinedViews.Clear();
+}
 
+// ========================================================================
+// function : Erase
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::Erase()
+{
+  for (Graphic3d_MapIteratorOfMapOfStructure anIt (myDisplayedStructure); anIt.More(); anIt.Next())
+  {
+    anIt.Key()->Erase();
+  }
 }
 
+
+
+
+
 void Graphic3d_StructureManager::SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& CTX) {
 
-        MyAspectLine3d          = CTX;
+        myAspectLine3d          = CTX;
 
 }
 
 void Graphic3d_StructureManager::SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& CTX) {
 
-        MyAspectFillArea3d      = CTX;
+        myAspectFillArea3d      = CTX;
 
 }
 
 void Graphic3d_StructureManager::SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& CTX) {
 
-        MyAspectText3d          = CTX;
+        myAspectText3d          = CTX;
 
 }
 
 void Graphic3d_StructureManager::SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& CTX) {
 
-        MyAspectMarker3d        = CTX;
+        myAspectMarker3d        = CTX;
 
 }
 
 void Graphic3d_StructureManager::PrimitivesAspect (Handle(Graphic3d_AspectLine3d)& CTXL, Handle(Graphic3d_AspectText3d)& CTXT, Handle(Graphic3d_AspectMarker3d)& CTXM, Handle(Graphic3d_AspectFillArea3d)& CTXF) const {
 
-        CTXL    = MyAspectLine3d;
-        CTXT    = MyAspectText3d;
-        CTXM    = MyAspectMarker3d;
-        CTXF    = MyAspectFillArea3d;
+        CTXL    = myAspectLine3d;
+        CTXT    = myAspectText3d;
+        CTXM    = myAspectMarker3d;
+        CTXF    = myAspectFillArea3d;
 
 }
 
 Handle(Graphic3d_AspectLine3d) Graphic3d_StructureManager::Line3dAspect () const {
 
-        return (MyAspectLine3d);
+        return (myAspectLine3d);
 
 }
 
 Handle(Graphic3d_AspectText3d) Graphic3d_StructureManager::Text3dAspect () const {
 
-        return (MyAspectText3d);
+        return (myAspectText3d);
 
 }
 
 Handle(Graphic3d_AspectMarker3d) Graphic3d_StructureManager::Marker3dAspect () const {
 
-        return (MyAspectMarker3d);
+        return (myAspectMarker3d);
 
 }
 
 Handle(Graphic3d_AspectFillArea3d) Graphic3d_StructureManager::FillArea3dAspect () const {
 
-        return (MyAspectFillArea3d);
+        return (myAspectFillArea3d);
 
 }
 
-void Graphic3d_StructureManager::Remove (const Standard_Integer AnId) {
+void Graphic3d_StructureManager::Remove (const Standard_Integer theId) {
 
-        MyStructGenId.Free (AnId);
+        myStructGenId.Free (theId);
 
 }
 
 void Graphic3d_StructureManager::DisplayedStructures (Graphic3d_MapOfStructure& SG) const {
 
-  SG.Assign(MyDisplayedStructure);
+  SG.Assign(myDisplayedStructure);
 
-  //JMBStandard_Integer Length  = MyDisplayedStructure.Length ();
+  //JMBStandard_Integer Length  = myDisplayedStructure.Length ();
 
   //JMBfor (Standard_Integer i=1; i<=Length; i++)
-  //JMB SG.Add (MyDisplayedStructure.Value (i));
+  //JMB SG.Add (myDisplayedStructure.Value (i));
 
 }
 
 Standard_Integer Graphic3d_StructureManager::NumberOfDisplayedStructures () const {
 
-Standard_Integer Length = MyDisplayedStructure.Extent ();
+Standard_Integer Length = myDisplayedStructure.Extent ();
 
         return (Length);
 
@@ -203,19 +251,19 @@ Standard_Integer Length = MyDisplayedStructure.Extent ();
 
 //Handle(Graphic3d_Structure) Graphic3d_StructureManager::DisplayedStructure (const Standard_Integer AnIndex) const {
 
-//return (MyDisplayedStructure.Value (AnIndex));
+//return (myDisplayedStructure.Value (AnIndex));
 
 //}
 
 void Graphic3d_StructureManager::HighlightedStructures (Graphic3d_MapOfStructure& SG) const {
 
-  SG.Assign(MyHighlightedStructure);
+  SG.Assign(myHighlightedStructure);
 
 }
 
 Standard_Integer Graphic3d_StructureManager::NewIdentification () {
 
-Standard_Integer Id     = MyStructGenId.Next ();
+Standard_Integer Id     = myStructGenId.Next ();
 
         return Id;
 
@@ -228,7 +276,7 @@ Handle(Graphic3d_Structure) Graphic3d_StructureManager::Identification (const St
 
   Handle(Graphic3d_Structure) StructNull;
  
-  Graphic3d_MapIteratorOfMapOfStructure it( MyDisplayedStructure);
+  Graphic3d_MapIteratorOfMapOfStructure it( myDisplayedStructure);
   
   Handle(Graphic3d_Structure) SGfound;
 
@@ -250,7 +298,7 @@ Handle(Graphic3d_Structure) Graphic3d_StructureManager::Identification (const St
 
 Standard_Integer Graphic3d_StructureManager::Identification () const {
  
-        return (MyId);
+        return (myId);
  
 }
 
@@ -268,7 +316,7 @@ Standard_Integer Graphic3d_StructureManager::CurrentId () {
 
 const Handle(Graphic3d_GraphicDriver)& Graphic3d_StructureManager::GraphicDriver () const {
 
-        return (MyGraphicDriver);
+        return (myGraphicDriver);
 
 }
 
@@ -277,7 +325,7 @@ void Graphic3d_StructureManager::RecomputeStructures()
   // Go through all unique structures including child (connected) ones and ensure that they are computed.
   Graphic3d_MapOfStructure aStructNetwork;
 
-  for (Graphic3d_MapIteratorOfMapOfStructure anIter(MyDisplayedStructure); anIter.More(); anIter.Next())
+  for (Graphic3d_MapIteratorOfMapOfStructure anIter(myDisplayedStructure); anIter.More(); anIter.Next())
   {
     Handle(Graphic3d_Structure) aStructure = anIter.Key();
     anIter.Key()->Network (anIter.Key(), Graphic3d_TOC_DESCENDANT, aStructNetwork);
@@ -320,3 +368,244 @@ Handle(Graphic3d_ViewAffinity) Graphic3d_StructureManager::ObjectAffinity (const
   myRegisteredObjects.Find (theObject.operator->(), aResult);
   return aResult;
 }
+
+// ========================================================================
+// function : Identification
+// purpose  :
+// ========================================================================
+Standard_Integer Graphic3d_StructureManager::Identification (Graphic3d_CView* theView)
+{
+  if (myDefinedViews.Contains (theView))
+  {
+    return theView->Identification();
+  }
+
+  myDefinedViews.Add (theView);
+  return myViewGenId.Next();
+}
+
+// ========================================================================
+// function : UnIdentification
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::UnIdentification (Graphic3d_CView* theView)
+{
+  if (myDefinedViews.Contains (theView))
+  {
+    myDefinedViews.Swap (myDefinedViews.FindIndex (theView), myDefinedViews.Size());
+    myDefinedViews.RemoveLast();
+    myViewGenId.Free (theView->Identification());
+  }
+}
+
+// ========================================================================
+// function : DefinedViews
+// purpose  :
+// ========================================================================
+const Graphic3d_IndexedMapOfView& Graphic3d_StructureManager::DefinedViews() const
+{
+  return myDefinedViews;
+}
+
+// ========================================================================
+// function : MaxNumOfViews
+// purpose  :
+// ========================================================================
+Standard_Integer Graphic3d_StructureManager::MaxNumOfViews() const
+{
+  return myViewGenId.Upper() - myViewGenId.Lower() + 1;
+}
+
+// ========================================================================
+// function : ReCompute
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::ReCompute (const Handle(Graphic3d_Structure)& theStructure)
+{
+  if (!myDisplayedStructure.Contains (theStructure))
+  {
+    return;
+  }
+
+  // Recompute structure for all defined views
+  for (Standard_Integer aViewIt = 1; aViewIt <= myDefinedViews.Extent(); ++aViewIt)
+  {
+    ReCompute (theStructure, myDefinedViews (aViewIt));
+  }
+}
+
+// ========================================================================
+// function : ReCompute
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::ReCompute (const Handle(Graphic3d_Structure)& theStructure,
+                                            const Handle(Graphic3d_DataStructureManager)& theProjector)
+{
+  Handle(Graphic3d_CView) aView = Handle(Graphic3d_CView)::DownCast (theProjector);
+
+  if (aView.IsNull()
+   || !myDefinedViews.Contains (aView.operator->())
+   || !myDisplayedStructure.Contains (theStructure))
+  {
+    return;
+  }
+
+  aView->ReCompute (theStructure);
+}
+
+// ========================================================================
+// function : Clear
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::Clear (const Handle(Graphic3d_Structure)& theStructure,
+                                        const Standard_Boolean theWithDestruction)
+{
+  for (Graphic3d_IndexedMapOfView::Iterator aViewIt (myDefinedViews); aViewIt.More(); aViewIt.Next())
+  {
+    aViewIt.Value()->Clear (theStructure, theWithDestruction);
+  }
+}
+
+// ========================================================================
+// function : Connect
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::Connect (const Handle(Graphic3d_Structure)& theMother,
+                                          const Handle(Graphic3d_Structure)& theDaughter)
+{
+  for (Graphic3d_IndexedMapOfView::Iterator aViewIt (myDefinedViews); aViewIt.More(); aViewIt.Next())
+  {
+    aViewIt.Value()->Connect (theMother, theDaughter);
+  }
+}
+
+// ========================================================================
+// function : Disconnect
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::Disconnect (const Handle(Graphic3d_Structure)& theMother,
+                                             const Handle(Graphic3d_Structure)& theDaughter)
+{
+  for (Graphic3d_IndexedMapOfView::Iterator aViewIt (myDefinedViews); aViewIt.More(); aViewIt.Next())
+  {
+    aViewIt.Value()->Disconnect (theMother, theDaughter);
+  }
+}
+
+// ========================================================================
+// function : Display
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::Display (const Handle(Graphic3d_Structure)& theStructure)
+{
+  myDisplayedStructure.Add (theStructure);
+
+  for (Graphic3d_IndexedMapOfView::Iterator aViewIt (myDefinedViews); aViewIt.More(); aViewIt.Next())
+  {
+    aViewIt.Value()->Display (theStructure);
+  }
+}
+
+// ========================================================================
+// function : Erase
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::Erase (const Handle(Graphic3d_Structure)& theStructure)
+{
+  myDisplayedStructure  .Remove(theStructure);
+  myHighlightedStructure.Remove (theStructure);
+
+  // Erase structure in all defined views
+  for (Graphic3d_IndexedMapOfView::Iterator aViewIt (myDefinedViews); aViewIt.More(); aViewIt.Next())
+  {
+    aViewIt.Value()->Erase (theStructure);
+  }
+}
+
+// ========================================================================
+// function : Erase
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::Highlight (const Handle(Graphic3d_Structure)& theStructure,
+                                            const Aspect_TypeOfHighlightMethod theMethod)
+{
+  myHighlightedStructure.Add (theStructure);
+
+  // Highlight in all defined views
+  for (Graphic3d_IndexedMapOfView::Iterator aViewIt (myDefinedViews); aViewIt.More(); aViewIt.Next())
+  {
+    aViewIt.Value()->Highlight (theStructure, theMethod);
+  }
+}
+
+// ========================================================================
+// function : UnHighlight
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::UnHighlight (const Handle(Graphic3d_Structure)& theStructure)
+{
+  myHighlightedStructure.Remove (theStructure);
+
+  // UnHighlight in all defined views
+  for (Graphic3d_IndexedMapOfView::Iterator aViewIt (myDefinedViews); aViewIt.More(); aViewIt.Next())
+  {
+    aViewIt.Value()->UnHighlight (theStructure);
+  }
+}
+
+// ========================================================================
+// function : UnHighlight
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::UnHighlight()
+{
+  for (Graphic3d_MapIteratorOfMapOfStructure anIt (myHighlightedStructure); anIt.More(); anIt.Next())
+  {
+    anIt.Key()->UnHighlight();
+  }
+}
+
+// ========================================================================
+// function : SetTransform
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::SetTransform (const Handle(Graphic3d_Structure)& theStructure,
+                                               const TColStd_Array2OfReal& theTrsf)
+{
+  for (Graphic3d_IndexedMapOfView::Iterator aViewIt (myDefinedViews); aViewIt.More(); aViewIt.Next())
+  {
+    aViewIt.Value()->SetTransform (theStructure, theTrsf);
+  }
+}
+
+// ========================================================================
+// function : ChangeDisplayPriority
+// purpose  :
+// ========================================================================
+void Graphic3d_StructureManager::ChangeDisplayPriority (const Handle(Graphic3d_Structure)& theStructure,
+                                                        const Standard_Integer theOldPriority,
+                                                        const Standard_Integer theNewPriority)
+{
+  for (Graphic3d_IndexedMapOfView::Iterator aViewIt (myDefinedViews); aViewIt.More(); aViewIt.Next())
+  {
+    aViewIt.Value()->ChangePriority (theStructure, theOldPriority, theNewPriority);
+  }
+}
+
+//=======================================================================
+//function : ChangeZLayer
+//purpose  :
+//=======================================================================
+void Graphic3d_StructureManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
+                                               const Graphic3d_ZLayerId           theLayerId)
+{
+  if (!myDisplayedStructure.Contains (theStructure))
+  {
+    return;
+  }
+
+  for (Graphic3d_IndexedMapOfView::Iterator aViewIt (myDefinedViews); aViewIt.More(); aViewIt.Next())
+  {
+    aViewIt.Value()->ChangeZLayer (theStructure, theLayerId);
+  }
+}
index 1f2149d..fadac9e 100644 (file)
 #ifndef _Graphic3d_StructureManager_HeaderFile
 #define _Graphic3d_StructureManager_HeaderFile
 
-#include <Standard.hxx>
-#include <Standard_Type.hxx>
-
-#include <Standard_Integer.hxx>
+#include <Aspect_GenId.hxx>
+#include <Aspect_TypeOfHighlightMethod.hxx>
 #include <Aspect_TypeOfUpdate.hxx>
-#include <Graphic3d_MapOfStructure.hxx>
+#include <Graphic3d_CView.hxx>
 #include <Graphic3d_MapOfObject.hxx>
-#include <Aspect_GenId.hxx>
-#include <MMgt_TShared.hxx>
+#include <Graphic3d_MapOfStructure.hxx>
+#include <Graphic3d_ViewAffinity.hxx>
 #include <Graphic3d_ZLayerId.hxx>
 #include <Graphic3d_ZLayerSettings.hxx>
+#include <MMgt_TShared.hxx>
+#include <NCollection_IndexedMap.hxx>
+#include <Standard.hxx>
 #include <Standard_Boolean.hxx>
-#include <TColStd_SequenceOfInteger.hxx>
-#include <Aspect_TypeOfHighlightMethod.hxx>
+#include <Standard_Integer.hxx>
+#include <Standard_Type.hxx>
 #include <TColStd_Array2OfReal.hxx>
-#include <Graphic3d_ViewAffinity.hxx>
+#include <TColStd_SequenceOfInteger.hxx>
+
+typedef NCollection_IndexedMap<Graphic3d_CView*> Graphic3d_IndexedMapOfView;
+
 class Graphic3d_AspectLine3d;
 class Graphic3d_AspectText3d;
 class Graphic3d_AspectMarker3d;
@@ -43,7 +47,6 @@ class Graphic3d_Structure;
 class Graphic3d_DataStructureManager;
 class Standard_Transient;
 
-
 class Graphic3d_StructureManager;
 DEFINE_STANDARD_HANDLE(Graphic3d_StructureManager, MMgt_TShared)
 
@@ -55,226 +58,209 @@ DEFINE_STANDARD_HANDLE(Graphic3d_StructureManager, MMgt_TShared)
 //! Destroy, Highlight, Visible
 class Graphic3d_StructureManager : public MMgt_TShared
 {
-
 public:
 
-  
+  //! Initializes the ViewManager.
+  //! Currently creating of more than 100 viewer instances
+  //! is not supported and leads to InitializationError and
+  //! initialization failure.
+  //! This limitation might be addressed in some future OCCT releases.
+  //! Warning: Raises InitialisationError if the initialization
+  //! of the ViewManager failed.
+  Standard_EXPORT Graphic3d_StructureManager (const Handle(Graphic3d_GraphicDriver)& theDriver);
+
   //! Deletes the manager <me>.
   Standard_EXPORT virtual void Destroy();
 ~Graphic3d_StructureManager()
 {
   Destroy();
 }
-  
+
   //! Modifies the default attributes for lines
   //! in the visualiser.
   Standard_EXPORT void SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& CTX);
-  
+
   //! Modifies the default attributes for faces
   //! in the visualiser.
   Standard_EXPORT void SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& CTX);
-  
+
   //! Modifies the default attributes for text
   //! in the visualiser.
   Standard_EXPORT void SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& CTX);
-  
+
   //! Modifies the default attributes for markers
   //! in the visualiser.
   Standard_EXPORT void SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& CTX);
-  
+
   //! Modifies the screen update mode.
   //!
-  //! TOU_ASAP as soon as possible
-  //! TOU_WAIT on demand (with the Update function)
+  //! TOU_ASAP - as soon as possible
+  //! TOU_WAIT - on demand (with the Update function)
   //! Note : Dynamic Operations and Update Mode
   //! Use SetUpdateMode to control when changes to
   //! the display are made.   Use one of the   following
   //! functions to update one or more views:
-  //! -   Update all views of the viewer:   Visual3d_ViewManager::Update ()
-  //! -   Update one view of the viewer:   Visual3d_View::Update () Use one of
-  //! the   following functions to update the entire display:
-  //! -   Redraw all structures in all views:   Visual3d_ViewManager::Redraw ()
-  //! -   Redraw all structures in one view:   Visual3d_View::Redraw ()  Update)
-  Standard_EXPORT void SetUpdateMode (const Aspect_TypeOfUpdate AType);
-  
-  //! Updates screen in function of modifications of
-  //! the structures.
-  //! Warning: Not necessary if the update mode is TOU_ASAP.
-  Standard_EXPORT virtual void Update() const = 0;
-  
+  //! - Update all views of the viewer: Graphic3d_StructureManager::Update()
+  //! - Update one view of the viewer:  Graphic3d_View::Update()
+  //! Use one of the following functions to update the entire display:
+  //! - Redraw all structures in all views: Graphic3d_StructureManager::Redraw()
+  //! - Redraw all structures in one view:  Graphic3d_View::Redraw()
+  Standard_EXPORT void SetUpdateMode (const Aspect_TypeOfUpdate theType);
+
+  //! Returns the screen update mode.
+  //!
+  //! TOU_ASAP as soon as possible
+  //! TOU_WAIT on demand (Update)
+  Standard_EXPORT Aspect_TypeOfUpdate UpdateMode() const;
+
+  //! Updates screen in function of modifications of the structures.
+  Standard_EXPORT virtual void Update (const Aspect_TypeOfUpdate theMode = Aspect_TOU_ASAP) const;
+
+  //! Deletes and erases the 3D structure manager.
+  Standard_EXPORT virtual void Remove();
+
+  //! Erases all the structures.
+  Standard_EXPORT virtual void Erase();
+
   //! Returns the set of structures displayed in
   //! visualiser <me>.
   Standard_EXPORT void DisplayedStructures (Graphic3d_MapOfStructure& SG) const;
-  
+
   //! Returns the set of highlighted structures
   //! in a visualiser <me>.
   Standard_EXPORT void HighlightedStructures (Graphic3d_MapOfStructure& SG) const;
-  
+
   //! Returns the values of the current default attributes.
   Standard_EXPORT Handle(Graphic3d_AspectFillArea3d) FillArea3dAspect() const;
-  
+
   //! Returns maximum number of managers defineable.
   Standard_EXPORT static Standard_Integer Limit();
-  
+
   //! Returns the values of the current default attributes.
   Standard_EXPORT Handle(Graphic3d_AspectLine3d) Line3dAspect() const;
-  
+
   //! Returns the values of the current default attributes.
   Standard_EXPORT Handle(Graphic3d_AspectMarker3d) Marker3dAspect() const;
-  
+
   //! Returns the values of the current default attributes.
   Standard_EXPORT void PrimitivesAspect (Handle(Graphic3d_AspectLine3d)& CTXL, Handle(Graphic3d_AspectText3d)& CTXT, Handle(Graphic3d_AspectMarker3d)& CTXM, Handle(Graphic3d_AspectFillArea3d)& CTXF) const;
-  
+
   //! Returns the values of the current default attributes.
   Standard_EXPORT Handle(Graphic3d_AspectText3d) Text3dAspect() const;
-  
-  //! Returns the screen update mode.
-  //!
-  //! TOU_ASAP as soon as possible
-  //! TOU_WAIT on demand (Update)
-  Standard_EXPORT Aspect_TypeOfUpdate UpdateMode() const;
-  
-  //! Changes the display priority of the structure <AStructure>.
-  Standard_EXPORT virtual void ChangeDisplayPriority (const Handle(Graphic3d_Structure)& AStructure, const Standard_Integer OldPriority, const Standard_Integer NewPriority) = 0;
-  
-  //! Change Z layer for structure. The z layer mechanism allows
-  //! to display structures in higher layers in overlay of structures in
-  //! lower layers.
-  Standard_EXPORT virtual void ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure, const Graphic3d_ZLayerId theLayerId) = 0;
-  
-  //! Sets the settings for a single Z layer for all managed views.
-  Standard_EXPORT virtual void SetZLayerSettings (const Graphic3d_ZLayerId theLayerId, const Graphic3d_ZLayerSettings& theSettings) = 0;
-  
-  //! Returns the settings of a single Z layer.
-  Standard_EXPORT virtual Graphic3d_ZLayerSettings ZLayerSettings (const Graphic3d_ZLayerId theLayerId) = 0;
-  
-  //! Add a new top-level Z layer and get its ID as
-  //! <theLayerId> value. The method returns Standard_False if the layer
-  //! can not be created. The z layer mechanism allows to display
-  //! structures in higher layers in overlay of structures in lower layers.
-  Standard_EXPORT virtual Standard_Boolean AddZLayer (Graphic3d_ZLayerId& theLayerId) = 0;
-  
-  //! Remove Z layer with ID <theLayerId>. Method returns
-  //! Standard_False if the layer can not be removed or doesn't exists.
-  //! By default, there is always a default bottom-level layer that can't
-  //! be removed.
-  Standard_EXPORT virtual Standard_Boolean RemoveZLayer (const Graphic3d_ZLayerId theLayerId) = 0;
-  
-  //! Return all Z layer ids in sequence ordered by level
-  //! from lowest layer to highest. The first layer ID in sequence is
-  //! the default layer that can't be removed.
-  Standard_EXPORT virtual void GetAllZLayers (TColStd_SequenceOfInteger& theLayerSeq) const = 0;
-  
+
   //! Returns a current identifier available.
   Standard_EXPORT static Standard_Integer CurrentId();
-  
-  //! Forces a new construction of the structure <AStructure>
-  //! if <AStructure> is displayed and TOS_COMPUTED.
-  Standard_EXPORT virtual void ReCompute (const Handle(Graphic3d_Structure)& AStructure) = 0;
-  
-  //! Forces a new construction of the structure <AStructure>
-  //! if <AStructure> is displayed in <AProjector> and TOS_COMPUTED.
-  Standard_EXPORT virtual void ReCompute (const Handle(Graphic3d_Structure)& AStructure, const Handle(Graphic3d_DataStructureManager)& AProjector) = 0;
-  
-  //! Clears the structure <AStructure>.
-  Standard_EXPORT virtual void Clear (const Handle(Graphic3d_Structure)& AStructure, const Standard_Boolean WithDestruction) = 0;
-  
-  //! Connects the structures <AMother> and <ADaughter>.
-  Standard_EXPORT virtual void Connect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter) = 0;
-  
-  //! Disconnects the structures <AMother> and <ADaughter>.
-  Standard_EXPORT virtual void Disconnect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter) = 0;
-  
-  //! Display the structure <AStructure>.
-  Standard_EXPORT virtual void Display (const Handle(Graphic3d_Structure)& AStructure) = 0;
-  
-  //! Erases the structure <AStructure>.
-  Standard_EXPORT virtual void Erase (const Handle(Graphic3d_Structure)& AStructure) = 0;
-  
-  //! Highlights the structure <AStructure>.
-  Standard_EXPORT virtual void Highlight (const Handle(Graphic3d_Structure)& AStructure, const Aspect_TypeOfHighlightMethod AMethod) = 0;
-  
-  //! Transforms the structure <AStructure>.
-  Standard_EXPORT virtual void SetTransform (const Handle(Graphic3d_Structure)& AStructure, const TColStd_Array2OfReal& ATrsf) = 0;
-  
+
+  //! Forces a new construction of the structure.
+  //! if <theStructure> is displayed and TOS_COMPUTED.
+  Standard_EXPORT virtual void ReCompute (const Handle(Graphic3d_Structure)& theStructure);
+
+  //! Forces a new construction of the structure.
+  //! if <theStructure> is displayed in <theProjector> and TOS_COMPUTED.
+  Standard_EXPORT virtual void ReCompute (const Handle(Graphic3d_Structure)& theStructure, const Handle(Graphic3d_DataStructureManager)& theProjector);
+
+  //! Clears the structure.
+  Standard_EXPORT virtual void Clear (const Handle(Graphic3d_Structure)& theStructure, const Standard_Boolean theWithDestruction);
+
+  //! Connects the structures.
+  Standard_EXPORT virtual void Connect (const Handle(Graphic3d_Structure)& theMother, const Handle(Graphic3d_Structure)& theDaughter);
+
+  //! Disconnects the structures.
+  Standard_EXPORT virtual void Disconnect (const Handle(Graphic3d_Structure)& theMother, const Handle(Graphic3d_Structure)& theDaughter);
+
+  //! Display the structure.
+  Standard_EXPORT virtual void Display (const Handle(Graphic3d_Structure)& theStructure);
+
+  //! Erases the structure.
+  Standard_EXPORT virtual void Erase (const Handle(Graphic3d_Structure)& theStructure);
+
+  //! Highlights the structure.
+  Standard_EXPORT virtual void Highlight (const Handle(Graphic3d_Structure)& theStructure, const Aspect_TypeOfHighlightMethod theMethod);
+
+  //! Transforms the structure.
+  Standard_EXPORT virtual void SetTransform (const Handle(Graphic3d_Structure)& theStructure, const TColStd_Array2OfReal& theTrsf);
+
+  //! Changes the display priority of the structure <AStructure>.
+  Standard_EXPORT virtual void ChangeDisplayPriority (const Handle(Graphic3d_Structure)& theStructure, const Standard_Integer theOldPriority, const Standard_Integer theNewPriority);
+
+  //! Change Z layer for structure. The Z layer mechanism allows to display structures in higher
+  //! layers in overlay of structures in lower layers.
+  Standard_EXPORT virtual void ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure, const Graphic3d_ZLayerId theLayerId);
+
   //! Returns the graphic driver of <me>.
   Standard_EXPORT const Handle(Graphic3d_GraphicDriver)& GraphicDriver() const;
-  
+
+  //! Attaches the view to this structure manager and sets its identification number within the manager.
+  Standard_EXPORT Standard_Integer Identification (Graphic3d_CView* theView);
+
+  //! Detach the view from this structure manager and release its identification.
+  Standard_EXPORT void UnIdentification (Graphic3d_CView* theView);
+
+  //! Returns the group of views defined in the structure manager.
+  Standard_EXPORT const Graphic3d_IndexedMapOfView& DefinedViews() const;
+
+  //! Returns the theoretical maximum number of definable views in the manager.
+  //! Warning: It's not possible to accept an infinite number of definable views because each
+  //! view must have an identification and we have different managers.
+  Standard_EXPORT Standard_Integer MaxNumOfViews() const;
+
   //! Returns the identification number of the manager.
   Standard_EXPORT virtual Standard_Integer Identification() const;
-  
+
   //! Returns the structure with the identification number <AId>.
   Standard_EXPORT virtual Handle(Graphic3d_Structure) Identification (const Standard_Integer AId) const;
-  
+
   //! Returns a new identification number for a new structure in the manager.
   Standard_EXPORT Standard_Integer NewIdentification();
-  
-  //! Suppresses the highlighting on all the structures in <me>.
-  Standard_EXPORT virtual void UnHighlight() = 0;
-  
+
   //! Suppress the highlighting on the structure <AStructure>.
-  Standard_EXPORT virtual void UnHighlight (const Handle(Graphic3d_Structure)& AStructure) = 0;
-  
+  Standard_EXPORT virtual void UnHighlight (const Handle(Graphic3d_Structure)& AStructure);
+
+  //! Suppresses the highlighting on all the structures in <me>.
+  Standard_EXPORT virtual void UnHighlight();
+
   Standard_EXPORT void RecomputeStructures();
-  
+
   //! Recomputes all structures from theStructures.
   Standard_EXPORT void RecomputeStructures (const Graphic3d_MapOfStructure& theStructures);
-  
+
   Standard_EXPORT Handle(Graphic3d_ViewAffinity) RegisterObject (const Handle(Standard_Transient)& theObject);
-  
+
   Standard_EXPORT void UnregisterObject (const Handle(Standard_Transient)& theObject);
-  
-  Standard_EXPORT Handle(Graphic3d_ViewAffinity) ObjectAffinity (const Handle(Standard_Transient)& theObject) const;
 
-friend class Graphic3d_Structure;
+  Standard_EXPORT Handle(Graphic3d_ViewAffinity) ObjectAffinity (const Handle(Standard_Transient)& theObject) const;
 
+  friend class Graphic3d_Structure;
 
   DEFINE_STANDARD_RTTI(Graphic3d_StructureManager,MMgt_TShared)
 
 protected:
 
-  
-  //! Initialises the ViewManager.
-  //! Currently creating of more than 100 viewer instances
-  //! is not supported and leads to InitializationError and
-  //! initialisation failure.
-  //! This limitation might be addressed in some future OCCT releases.
-  //! Warning: Raises InitialisationError if the initialisation
-  //! of the ViewManager failed.
-  Standard_EXPORT Graphic3d_StructureManager(const Handle(Graphic3d_GraphicDriver)& theDriver);
-  
   //! Returns the number of structures displayed in
-  //! visualiser <me>.
-  //! Returns the structure displayed in visualiser <me>.
+  //! visualizer <me>.
+  //! Returns the structure displayed in visualizer <me>.
   Standard_EXPORT Standard_Integer NumberOfDisplayedStructures() const;
 
-  Standard_Integer MyId;
-  Aspect_TypeOfUpdate MyUpdateMode;
-  Handle(Graphic3d_AspectLine3d) MyAspectLine3d;
-  Handle(Graphic3d_AspectText3d) MyAspectText3d;
-  Handle(Graphic3d_AspectMarker3d) MyAspectMarker3d;
-  Handle(Graphic3d_AspectFillArea3d) MyAspectFillArea3d;
-  Graphic3d_MapOfStructure MyDisplayedStructure;
-  Graphic3d_MapOfObject myRegisteredObjects;
-  Graphic3d_MapOfStructure MyHighlightedStructure;
-  Aspect_GenId MyStructGenId;
-  Handle(Graphic3d_GraphicDriver) MyGraphicDriver;
-
-
 private:
 
-  
-  //! Frees the identifieur <AnId>.
-  Standard_EXPORT void Remove (const Standard_Integer AnId);
-
+  //! Frees the identifier of a structure.
+  void Remove (const Standard_Integer theId);
 
+protected:
 
+  Standard_Integer myId;
+  Aspect_GenId myStructGenId;
+  Aspect_GenId myViewGenId;
+  Aspect_TypeOfUpdate myUpdateMode;
+  Handle(Graphic3d_AspectLine3d) myAspectLine3d;
+  Handle(Graphic3d_AspectText3d) myAspectText3d;
+  Handle(Graphic3d_AspectMarker3d) myAspectMarker3d;
+  Handle(Graphic3d_AspectFillArea3d) myAspectFillArea3d;
+  Graphic3d_MapOfStructure myDisplayedStructure;
+  Graphic3d_MapOfStructure myHighlightedStructure;
+  Graphic3d_MapOfObject myRegisteredObjects;
+  Handle(Graphic3d_GraphicDriver) myGraphicDriver;
+  Graphic3d_IndexedMapOfView myDefinedViews;
 };
 
-
-
-
-
-
-
 #endif // _Graphic3d_StructureManager_HeaderFile
index 70c62d9..d94a2cb 100644 (file)
@@ -31,7 +31,7 @@ class TCollection_AsciiString;
 class Graphic3d_TextureEnv;
 DEFINE_STANDARD_HANDLE(Graphic3d_TextureEnv, Graphic3d_TextureRoot)
 
-//! This class provides environment texture usable only in Visual3d_ContextView
+//! This class provides environment texture.
 class Graphic3d_TextureEnv : public Graphic3d_TextureRoot
 {
 
similarity index 81%
rename from src/Visual3d/Visual3d_TypeOfAnswer.hxx
rename to src/Graphic3d/Graphic3d_TypeOfAnswer.hxx
index 305188f..1f72e9a 100644 (file)
@@ -14,8 +14,8 @@
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#ifndef _Visual3d_TypeOfAnswer_HeaderFile
-#define _Visual3d_TypeOfAnswer_HeaderFile
+#ifndef _Graphic3d_TypeOfAnswer_HeaderFile
+#define _Graphic3d_TypeOfAnswer_HeaderFile
 
 //! The answer of the method AcceptDisplay
 //! AcceptDisplay  means is it possible to display the
 //! TOA_YES yes
 //! TOA_NO  no
 //! TOA_COMPUTE yes but we have to compute the representation
-enum Visual3d_TypeOfAnswer
+enum Graphic3d_TypeOfAnswer
 {
-Visual3d_TOA_YES,
-Visual3d_TOA_NO,
-Visual3d_TOA_COMPUTE
+  Graphic3d_TOA_YES,
+  Graphic3d_TOA_NO,
+  Graphic3d_TOA_COMPUTE
 };
 
-#endif // _Visual3d_TypeOfAnswer_HeaderFile
+#endif // _Graphic3d_TypeOfAnswer_HeaderFile
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#ifndef _Visual3d_TypeOfBackfacingModel_HeaderFile
-#define _Visual3d_TypeOfBackfacingModel_HeaderFile
+#ifndef _Graphic3d_TypeOfBackfacingModel_HeaderFile
+#define _Graphic3d_TypeOfBackfacingModel_HeaderFile
 
 //! Modes of display of back faces in the view
 //!
 //! TOBM_AUTOMATIC graphic's structure setting is in use
 //! TOBM_FORCE     force display of back faces
 //! TOBM_DISABLE   disable display of back faces
-enum Visual3d_TypeOfBackfacingModel
+enum Graphic3d_TypeOfBackfacingModel
 {
-Visual3d_TOBM_AUTOMATIC,
-Visual3d_TOBM_FORCE,
-Visual3d_TOBM_DISABLE
+  Graphic3d_TOBM_AUTOMATIC,
+  Graphic3d_TOBM_FORCE,
+  Graphic3d_TOBM_DISABLE
 };
 
-#endif // _Visual3d_TypeOfBackfacingModel_HeaderFile
+#endif // _Graphic3d_TypeOfBackfacingModel_HeaderFile
similarity index 76%
rename from src/Visual3d/Visual3d_TypeOfLightSource.hxx
rename to src/Graphic3d/Graphic3d_TypeOfLightSource.hxx
index d1dea0a..17a923a 100644 (file)
@@ -14,8 +14,8 @@
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#ifndef _Visual3d_TypeOfLightSource_HeaderFile
-#define _Visual3d_TypeOfLightSource_HeaderFile
+#ifndef _Graphic3d_TypeOfLightSource_HeaderFile
+#define _Graphic3d_TypeOfLightSource_HeaderFile
 
 //! Definition of all the type of light sources
 //!
 //! TOLS_DIRECTIONAL    directional light
 //! TOLS_POSITIONAL positional light
 //! TOLS_SPOT       spot light
-enum Visual3d_TypeOfLightSource
+enum Graphic3d_TypeOfLightSource
 {
-Visual3d_TOLS_AMBIENT,
-Visual3d_TOLS_DIRECTIONAL,
-Visual3d_TOLS_POSITIONAL,
-Visual3d_TOLS_SPOT
+  Graphic3d_TOLS_AMBIENT,
+  Graphic3d_TOLS_DIRECTIONAL,
+  Graphic3d_TOLS_POSITIONAL,
+  Graphic3d_TOLS_SPOT
 };
 
-#endif // _Visual3d_TypeOfLightSource_HeaderFile
+#endif // _Graphic3d_TypeOfLightSource_HeaderFile
similarity index 56%
rename from src/Visual3d/Visual3d_TypeOfModel.hxx
rename to src/Graphic3d/Graphic3d_TypeOfShadingModel.hxx
index f51e074..b889d4c 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#ifndef _Visual3d_TypeOfModel_HeaderFile
-#define _Visual3d_TypeOfModel_HeaderFile
+#ifndef _Graphic3d_TypeOfShadingModel_HeaderFile
+#define _Graphic3d_TypeOfShadingModel_HeaderFile
 
 //! Definition of the rendering (colour shading) model
-//! Visual3d_TOM_NONE     No lighting, only white ambient light
-//! Visual3d_TOM_FACET    No interpolation, constant shading      (Flat    Shading)
-//! Visual3d_TOM_VERTEX   Interpolation of color based on normals (Gouraud Shading)
-//! Visual3d_TOM_FRAGMENT Interpolation of color based on normals (Phong   Shading)
-enum Visual3d_TypeOfModel
+//! Graphic3d_TOSM_NONE     No lighting, only white ambient light
+//! Graphic3d_TOSM_FACET    No interpolation, constant shading      (Flat    Shading)
+//! Graphic3d_TOSM_VERTEX   Interpolation of color based on normals (Gouraud Shading)
+//! Graphic3d_TOSM_FRAGMENT Interpolation of color based on normals (Phong   Shading)
+enum Graphic3d_TypeOfShadingModel
 {
-Visual3d_TOM_NONE,
-Visual3d_TOM_FACET,
-Visual3d_TOM_VERTEX,
-Visual3d_TOM_FRAGMENT
+  Graphic3d_TOSM_NONE,
+  Graphic3d_TOSM_FACET,
+  Graphic3d_TOSM_VERTEX,
+  Graphic3d_TOSM_FRAGMENT
 };
 
-#endif // _Visual3d_TypeOfModel_HeaderFile
+#endif // _Graphic3d_TypeOfShadingModel_HeaderFile
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#ifndef _Visual3d_TypeOfSurfaceDetail_HeaderFile
-#define _Visual3d_TypeOfSurfaceDetail_HeaderFile
+#ifndef _Graphic3d_TypeOfSurfaceDetail_HeaderFile
+#define _Graphic3d_TypeOfSurfaceDetail_HeaderFile
 
 //! Modes of visualisation of objects in a view
 //!
 //! TOD_NONE        no texture mapping
 //! TOD_ENVIRONMENT only environnement mapping
 //! TOD_ALL     environnement + texture mapping
-enum Visual3d_TypeOfSurfaceDetail
+enum Graphic3d_TypeOfSurfaceDetail
 {
-Visual3d_TOD_NONE,
-Visual3d_TOD_ENVIRONMENT,
-Visual3d_TOD_ALL
+  Graphic3d_TOD_NONE,
+  Graphic3d_TOD_ENVIRONMENT,
+  Graphic3d_TOD_ALL
 };
 
-#endif // _Visual3d_TypeOfSurfaceDetail_HeaderFile
+#endif // _Graphic3d_TypeOfSurfaceDetail_HeaderFile
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#ifndef _Visual3d_TypeOfVisualization_HeaderFile
-#define _Visual3d_TypeOfVisualization_HeaderFile
+#ifndef _Graphic3d_TypeOfVisualization_HeaderFile
+#define _Graphic3d_TypeOfVisualization_HeaderFile
 
 //! Modes of visualisation of objects in a view
 //!
 //! TOV_WIREFRAME   wireframe visualisation
 //! TOV_SHADING     shaded visualisation
-enum Visual3d_TypeOfVisualization
+enum Graphic3d_TypeOfVisualization
 {
-Visual3d_TOV_WIREFRAME,
-Visual3d_TOV_SHADING
+  Graphic3d_TOV_WIREFRAME,
+  Graphic3d_TOV_SHADING
 };
 
-#endif // _Visual3d_TypeOfVisualization_HeaderFile
+#endif // _Graphic3d_TypeOfVisualization_HeaderFile
index 20cd265..6d9bfeb 100755 (executable)
@@ -1,6 +1,4 @@
 InterfaceGraphic.hxx
-InterfaceGraphic_Aspect.hxx
 InterfaceGraphic_Graphic3d.hxx
 InterfaceGraphic_telem.hxx
 InterfaceGraphic_tgl_all.hxx
-InterfaceGraphic_Visual3d.hxx
diff --git a/src/InterfaceGraphic/InterfaceGraphic_Aspect.hxx b/src/InterfaceGraphic/InterfaceGraphic_Aspect.hxx
deleted file mode 100644 (file)
index 533bd92..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 1991-1999 Matra Datavision
-// Copyright (c) 1999-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#ifndef InterfaceGraphic_AspectHeader
-#define InterfaceGraphic_AspectHeader
-
-#include <Aspect_Drawable.hxx>
-#include <Aspect_RenderingContext.hxx>
-
-/* WINDOW */
-
-typedef struct {
-
-  int IsDefined;
-
-  Aspect_Drawable XWindow;
-  Aspect_Drawable XParentWindow;
-
-  int dx, dy;
-  int left, top;
-
-  struct {
-    float r, g, b;
-  } Background;
-
-} CALL_DEF_WINDOW;
-
-
-typedef struct {
-  int listIndex;
-  void*  layerData;
-} CALL_DEF_PTRLAYER, *call_def_ptrLayer;
-
-
-/* LAYER */
-
-typedef struct {
-  CALL_DEF_PTRLAYER* ptrLayer;
-  int layerType;
-  int attach;
-  int sizeDependent;
-  float ortho[4];
-  float viewport[2];
-
-} CALL_DEF_LAYER;
-
-#endif /* InterfaceGraphic_AspectHeader */
diff --git a/src/InterfaceGraphic/InterfaceGraphic_Visual3d.hxx b/src/InterfaceGraphic/InterfaceGraphic_Visual3d.hxx
deleted file mode 100644 (file)
index 240a8fe..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) 1991-1999 Matra Datavision
-// Copyright (c) 1999-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#ifndef InterfaceGraphic_Visual3dHeader
-#define InterfaceGraphic_Visual3dHeader
-
-#include <InterfaceGraphic_Aspect.hxx>
-#include <InterfaceGraphic_Graphic3d.hxx>
-#include <Aspect_RenderingContext.hxx>
-#include <Aspect_GraphicCallbackProc.hxx>
-#include <Standard_Transient.hxx>
-
-typedef float CALL_DEF_MATRIX4X4[4][4];
-
-/* SOMMET */
-
-typedef struct {
-
-       float x, y, z;
-
-} CALL_DEF_VERTEX;
-
-/* ORIENTATION */
-
-typedef struct {
-
-  CALL_DEF_VERTEX ViewReferencePoint;
-  CALL_DEF_VERTEX ViewReferencePlane;
-  CALL_DEF_VERTEX ViewReferenceUp;
-  float ViewScaleX;
-  float ViewScaleY;
-  float ViewScaleZ;
-
-  float ModelViewMatrix[4][4];
-
-  unsigned IsCustomMatrix;
-
-} CALL_DEF_VIEWORIENTATION;
-
-
-/* MAPPING */
-
-typedef struct {
-
-  int Projection;
-
-  CALL_DEF_VERTEX ProjectionReferencePoint;
-
-  float ViewPlaneDistance;
-  float BackPlaneDistance;
-  float FrontPlaneDistance;
-
-  struct {
-    float um, vm, uM, vM;
-  } WindowLimit;
-
-  float ProjectionMatrix[4][4];
-
-  unsigned IsCustomMatrix;
-
-} CALL_DEF_VIEWMAPPING;
-
-#endif /* InterfaceGraphic_Visual3dHeader */
index 2a784b8..650941a 100755 (executable)
@@ -28,20 +28,20 @@ OpenGl_PrimitiveArray.hxx
 OpenGl_PrimitiveArray.cxx
 OpenGl_Workspace.hxx
 OpenGl_Workspace.cxx
-OpenGl_Workspace_2.cxx
-OpenGl_Workspace_5.cxx
 OpenGl_View.hxx
 OpenGl_View.cxx
-OpenGl_View_2.cxx
+OpenGl_View_Print.cxx
+OpenGl_View_Raytrace.cxx
+OpenGl_View_Redraw.cxx
 OpenGl_Light.hxx
 OpenGl_Trihedron.hxx
 OpenGl_Trihedron.cxx
 OpenGl_GraduatedTrihedron.hxx
 OpenGl_GraduatedTrihedron.cxx
+OpenGl_MapOfZLayerSettings.hxx
 OpenGl_Matrix.hxx
 OpenGl_Matrix.cxx
 OpenGl_MatrixState.hxx
-OpenGl_CView.hxx
 OpenGl_NamedStatus.hxx
 OpenGl_TextParam.hxx
 OpenGl_PrinterContext.hxx
@@ -113,10 +113,6 @@ OpenGl_LayerList.hxx
 OpenGl_LayerFilter.hxx
 OpenGl_GraphicDriver.cxx
 OpenGl_GraphicDriver.hxx
-OpenGl_GraphicDriver_4.cxx
-OpenGl_GraphicDriver_7.cxx
-OpenGl_GraphicDriver_713.cxx
-OpenGl_GraphicDriver_Export.cxx
 OpenGl_IndexBuffer.cxx
 OpenGl_IndexBuffer.hxx
 OpenGl_Layer.cxx
@@ -151,6 +147,5 @@ OpenGl_VertexBuffer.lxx
 OpenGl_VertexBufferCompat.cxx
 OpenGl_VertexBufferCompat.hxx
 OpenGl_VertexBufferEditor.hxx
-OpenGl_View_Raytrace.cxx
 OpenGl_TextBuilder.hxx
 OpenGl_TextBuilder.cxx
\ No newline at end of file
diff --git a/src/OpenGl/OpenGl_CView.hxx b/src/OpenGl/OpenGl_CView.hxx
deleted file mode 100644 (file)
index ec443f7..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Created on: 2011-09-20
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#ifndef OpenGl_CView_Header
-#define OpenGl_CView_Header
-
-#include <InterfaceGraphic_telem.hxx>
-
-#include <OpenGl_Workspace.hxx>
-#include <OpenGl_View.hxx>
-
-struct OpenGl_CView
-{
-  Handle(OpenGl_Workspace) WS;
-  Handle(OpenGl_View)      View;
-  DEFINE_STANDARD_ALLOC
-};
-
-#endif //OpenGl_CView_Header
index 5a1a4e7..53ef7a2 100644 (file)
@@ -220,7 +220,7 @@ OpenGl_Context::~OpenGl_Context()
       myUnusedResources->RemoveFirst();
     }
   }
-  else
+  else if (myShaderManager->IsSameContext (this))
   {
     myShaderManager->SetContext (NULL);
   }
@@ -2722,3 +2722,87 @@ void OpenGl_Context::ApplyProjectionMatrix()
     myShaderManager->UpdateProjectionStateTo (ProjectionState.Current());
   }
 }
+
+
+// =======================================================================
+// function : EnableFeatures
+// purpose  :
+// =======================================================================
+void OpenGl_Context::EnableFeatures() const
+{
+  //
+}
+
+// =======================================================================
+// function : DisableFeatures
+// purpose  :
+// =======================================================================
+void OpenGl_Context::DisableFeatures() const
+{
+#if !defined(GL_ES_VERSION_2_0)
+  glPixelTransferi (GL_MAP_COLOR, GL_FALSE);
+#endif
+
+  /*
+  * Disable stuff that's likely to slow down glDrawPixels.
+  * (Omit as much of this as possible, when you know in advance
+  * that the OpenGL state will already be set correctly.)
+  */
+  glDisable(GL_DITHER);
+  glDisable(GL_BLEND);
+  glDisable(GL_DEPTH_TEST);
+  glDisable(GL_TEXTURE_2D);
+  glDisable(GL_STENCIL_TEST);
+
+#if !defined(GL_ES_VERSION_2_0)
+  glDisable(GL_LIGHTING);
+  glDisable(GL_ALPHA_TEST);
+  glDisable(GL_FOG);
+  glDisable(GL_LOGIC_OP);
+  glDisable(GL_TEXTURE_1D);
+
+  glPixelTransferi(GL_MAP_COLOR, GL_FALSE);
+  glPixelTransferi(GL_RED_SCALE, 1);
+  glPixelTransferi(GL_RED_BIAS, 0);
+  glPixelTransferi(GL_GREEN_SCALE, 1);
+  glPixelTransferi(GL_GREEN_BIAS, 0);
+  glPixelTransferi(GL_BLUE_SCALE, 1);
+  glPixelTransferi(GL_BLUE_BIAS, 0);
+  glPixelTransferi(GL_ALPHA_SCALE, 1);
+  glPixelTransferi(GL_ALPHA_BIAS, 0);
+
+  /*
+  * Disable extensions that could slow down glDrawPixels.
+  * (Actually, you should check for the presence of the proper
+  * extension before making these calls.  I've omitted that
+  * code for simplicity.)
+  */
+
+  if ((myGlVerMajor >= 1) && (myGlVerMinor >= 2))
+  {
+#ifdef GL_EXT_convolution
+    if (CheckExtension ("GL_CONVOLUTION_1D_EXT"))
+      glDisable(GL_CONVOLUTION_1D_EXT);
+
+    if (CheckExtension ("GL_CONVOLUTION_2D_EXT"))
+      glDisable(GL_CONVOLUTION_2D_EXT);
+
+    if (CheckExtension ("GL_SEPARABLE_2D_EXT"))
+      glDisable(GL_SEPARABLE_2D_EXT);
+#endif
+
+#ifdef GL_EXT_histogram
+    if (CheckExtension ("GL_SEPARABLE_2D_EXT"))
+      glDisable(GL_HISTOGRAM_EXT);
+
+    if (CheckExtension ("GL_MINMAX_EXT"))
+      glDisable(GL_MINMAX_EXT);
+#endif
+
+#ifdef GL_EXT_texture3D
+    if (CheckExtension ("GL_TEXTURE_3D_EXT"))
+      glDisable(GL_TEXTURE_3D_EXT);
+#endif
+  }
+#endif
+}
index e4573eb..98a7fa9 100644 (file)
@@ -573,6 +573,10 @@ public: //! @name methods to alter or retrieve current state
     return myIsGlDebugCtx;
   }
 
+  Standard_EXPORT void EnableFeatures() const;
+
+  Standard_EXPORT void DisableFeatures() const;
+
 private:
 
   //! Wrapper to system function to retrieve GL function pointer by name.
index 1eb00d2..a836256 100755 (executable)
@@ -15,8 +15,6 @@
 
 #include <OpenGl_GlCore11.hxx>
 #include <InterfaceGraphic_Graphic3d.hxx>
-#include <InterfaceGraphic_Aspect.hxx>
-#include <InterfaceGraphic_Visual3d.hxx>
 
 #include <OpenGl_GraduatedTrihedron.hxx>
 
@@ -50,7 +48,8 @@ namespace
 // =======================================================================
 OpenGl_GraduatedTrihedron::OpenGl_GraduatedTrihedron()
 : myMin (0.0f, 0.0f, 0.0f),
-  myMax (100.0f, 100.0f, 100.0f)
+  myMax (100.0f, 100.0f, 100.0f),
+  myIsInitialized (Standard_False)
 {
   //
 }
@@ -59,38 +58,10 @@ OpenGl_GraduatedTrihedron::OpenGl_GraduatedTrihedron()
 // function : SetValues
 // purpose  :
 // =======================================================================
-void OpenGl_GraduatedTrihedron::SetValues (const Handle(OpenGl_Context)&       theCtx,
-                                           const Graphic3d_GraduatedTrihedron& theData)
+void OpenGl_GraduatedTrihedron::SetValues (const Graphic3d_GraduatedTrihedron& theData)
 {
-  Release (theCtx.operator->());
-  myData = theData;
-
-  // Initialize text label parameters for x, y, and z axes
-  myAxes[0] = Axis (myData.XAxisAspect(), OpenGl_Vec3 (1.0f, 0.0f, 0.0f));
-  myAxes[1] = Axis (myData.YAxisAspect(), OpenGl_Vec3 (0.0f, 1.0f, 0.0f));
-  myAxes[2] = Axis (myData.ZAxisAspect(), OpenGl_Vec3 (0.0f, 0.0f, 1.0f));
-
-  // Initialize constant primitives: text, arrows.
-  myAxes[0].InitArrow (theCtx, myData.ArrowsLength(), OpenGl_Vec3 (0.0f, 0.0f, 1.0f));
-  myAxes[1].InitArrow (theCtx, myData.ArrowsLength(), OpenGl_Vec3 (0.0f, 0.0f, 1.0f));
-  myAxes[2].InitArrow (theCtx, myData.ArrowsLength(), OpenGl_Vec3 (1.0f, 0.0f, 0.0f));
-  for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
-  {
-    myAxes[anIt].Label.SetFontSize (theCtx, theData.NamesSize());
-  }
-
-  myLabelValues.SetFontSize (theCtx, theData.ValuesSize());
-
-  myAspectLabels.SetFontAspect (theData.NamesFontAspect());
-  myAspectLabels.ChangeFontName() = theData.NamesFont();
-
-  myAspectValues.SetFontAspect (theData.ValuesFontAspect());
-  myAspectValues.ChangeFontName() = theData.ValuesFont();
-
-  // Grid aspect
-  myGridLineAspect.ChangeColor().rgb[0] = (Standard_ShortReal) theData.GridColor().Red();
-  myGridLineAspect.ChangeColor().rgb[1] = (Standard_ShortReal) theData.GridColor().Green();
-  myGridLineAspect.ChangeColor().rgb[2] = (Standard_ShortReal) theData.GridColor().Blue();
+  myData          = theData;
+  myIsInitialized = Standard_False;
 }
 
 // =======================================================================
@@ -115,6 +86,45 @@ void OpenGl_GraduatedTrihedron::Release (OpenGl_Context* theCtx)
 }
 
 // =======================================================================
+// function : initResources
+// purpose  :
+// =======================================================================
+void OpenGl_GraduatedTrihedron::initGlResources (const Handle(OpenGl_Context)& theCtx) const
+{
+  myAxes[0].Release     (theCtx.operator->());
+  myAxes[1].Release     (theCtx.operator->());
+  myAxes[2].Release     (theCtx.operator->());
+  myLabelValues.Release (theCtx.operator->());
+
+  // Initialize text label parameters for x, y, and z axes
+  myAxes[0] = Axis (myData.XAxisAspect(), OpenGl_Vec3 (1.0f, 0.0f, 0.0f));
+  myAxes[1] = Axis (myData.YAxisAspect(), OpenGl_Vec3 (0.0f, 1.0f, 0.0f));
+  myAxes[2] = Axis (myData.ZAxisAspect(), OpenGl_Vec3 (0.0f, 0.0f, 1.0f));
+
+  // Initialize constant primitives: text, arrows.
+  myAxes[0].InitArrow (theCtx, myData.ArrowsLength(), OpenGl_Vec3 (0.0f, 0.0f, 1.0f));
+  myAxes[1].InitArrow (theCtx, myData.ArrowsLength(), OpenGl_Vec3 (0.0f, 0.0f, 1.0f));
+  myAxes[2].InitArrow (theCtx, myData.ArrowsLength(), OpenGl_Vec3 (1.0f, 0.0f, 0.0f));
+  for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
+  {
+    myAxes[anIt].Label.SetFontSize (theCtx, myData.NamesSize());
+  }
+
+  myLabelValues.SetFontSize (theCtx, myData.ValuesSize());
+
+  myAspectLabels.SetFontAspect (myData.NamesFontAspect());
+  myAspectLabels.ChangeFontName() = myData.NamesFont();
+
+  myAspectValues.SetFontAspect (myData.ValuesFontAspect());
+  myAspectValues.ChangeFontName() = myData.ValuesFont();
+
+  // Grid aspect
+  myGridLineAspect.ChangeColor().rgb[0] = (Standard_ShortReal) myData.GridColor().Red();
+  myGridLineAspect.ChangeColor().rgb[1] = (Standard_ShortReal) myData.GridColor().Green();
+  myGridLineAspect.ChangeColor().rgb[2] = (Standard_ShortReal) myData.GridColor().Blue();
+}
+
+// =======================================================================
 // method  : getNormal
 // purpose : Normal of the view (not normalized!)
 // =======================================================================
@@ -546,6 +556,11 @@ void OpenGl_GraduatedTrihedron::renderTickmarkLabels (const Handle(OpenGl_Worksp
 void OpenGl_GraduatedTrihedron::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
 {
   const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext();
+  if (!myIsInitialized)
+  {
+    initGlResources (theWorkspace->GetGlContext());
+    myIsInitialized = Standard_True;
+  }
 
   // Update boundary box
   OpenGl_Vec3 anOldMin = myMin;
@@ -553,7 +568,7 @@ void OpenGl_GraduatedTrihedron::Render (const Handle(OpenGl_Workspace)& theWorks
 
   if (myData.CubicAxesCallback)
   {
-    myData.CubicAxesCallback (myData.PtrVisual3dView);
+    myData.CubicAxesCallback (myData.PtrView);
     if (!myAxes[0].Line.IsInitialized()
      || !myAxes[1].Line.IsInitialized()
      || !myAxes[2].Line.IsInitialized()
index 97d852a..00e686b 100755 (executable)
@@ -26,7 +26,6 @@
 #include <OpenGl_PrimitiveArray.hxx>
 #include <OpenGl_Text.hxx>
 
-class Visual3d_View;
 class OpenGl_View;
 
 //! This class allows to render Graduated Trihedron, i.e. trihedron with grid.
@@ -54,8 +53,7 @@ public:
   virtual void Release (OpenGl_Context* theCtx);
 
   //! Setup configuration.
-  void SetValues (const Handle(OpenGl_Context)&       theCtx,
-                  const Graphic3d_GraduatedTrihedron& theData);
+  void SetValues (const Graphic3d_GraduatedTrihedron& theData);
 
   //! Sets up-to-date values of scene bounding box.
   //! Can be used in callback mechanism to get up-to-date values.
@@ -131,6 +129,10 @@ private:
 
 private:
 
+  //! Initialize or update GL resources for rendering trihedron.
+  //! @param theContext [in] the GL context.
+  void initGlResources (const Handle(OpenGl_Context)& theContext) const;
+
   //! Gets normal of the view out of user.
   //! @param theContext [in] OpenGL Context
   //! @param theNormal [out] normal of the view out of user
@@ -211,11 +213,9 @@ protected: //! @name Scene bounding box values
 
 protected:
 
-  Axis myAxes[3]; //!< Axes for trihedron
-
-  Graphic3d_GraduatedTrihedron myData;
-
-  OpenGl_AspectLine myGridLineAspect; //!< Color grid properties
+  mutable Axis myAxes[3]; //!< Axes for trihedron
+  mutable Graphic3d_GraduatedTrihedron myData;
+  mutable OpenGl_AspectLine myGridLineAspect; //!< Color grid properties
 
 protected: //! @name Labels properties
 
@@ -225,6 +225,8 @@ protected: //! @name Labels properties
 
 private:
 
+  mutable Standard_Boolean myIsInitialized;
+
   enum AxisFlags
   {
     XOO_XYO = 1 << 1,
@@ -237,7 +239,6 @@ private:
     XOZ_XYZ = 1 << 8,
     XYO_XYZ = 1 << 9
   };
-
 };
 
 #endif //_OpenGl_GraduatedTrihedron_Header
index c95df9c..8a3e210 100644 (file)
@@ -18,7 +18,6 @@
 #include <OpenGl_Flipper.hxx>
 #include <OpenGl_GraduatedTrihedron.hxx>
 #include <OpenGl_Group.hxx>
-#include <OpenGl_CView.hxx>
 #include <OpenGl_View.hxx>
 #include <OpenGl_StencilTest.hxx>
 #include <OpenGl_Text.hxx>
 #include <OpenGl_Workspace.hxx>
 
 #include <Aspect_GraphicDeviceDefinitionError.hxx>
+#include <Aspect_IdentDefinitionError.hxx>
 #include <Message_Messenger.hxx>
 #include <OSD_Environment.hxx>
 #include <Standard_NotImplemented.hxx>
 
+#if defined(_WIN32)
+  #include <WNT_Window.hxx>
+#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
+  #include <Cocoa_Window.hxx>
+#else
+  #include <Xw_Window.hxx>
+#endif
+
 #if !defined(_WIN32) && !defined(__ANDROID__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
   #include <X11/Xlib.h> // XOpenDisplay()
 #endif
@@ -38,7 +46,6 @@
   #include <EGL/egl.h>
 #endif
 
-
 namespace
 {
   static const Handle(OpenGl_Context) TheNullGlCtx;
@@ -59,7 +66,6 @@ OpenGl_GraphicDriver::OpenGl_GraphicDriver (const Handle(Aspect_DisplayConnectio
 #endif
   myCaps           (new OpenGl_Caps()),
   myMapOfView      (1, NCollection_BaseAllocator::CommonBaseAllocator()),
-  myMapOfWS        (1, NCollection_BaseAllocator::CommonBaseAllocator()),
   myMapOfStructure (1, NCollection_BaseAllocator::CommonBaseAllocator()),
   myUserDrawCallback (NULL)
 {
@@ -89,6 +95,46 @@ OpenGl_GraphicDriver::OpenGl_GraphicDriver (const Handle(Aspect_DisplayConnectio
   {
     Aspect_GraphicDeviceDefinitionError::Raise ("OpenGl_GraphicDriver: default context can not be initialized!");
   }
+
+  // default layers are always presented in display layer sequence it can not be removed
+  Graphic3d_ZLayerSettings anUnderlaySettings;
+  anUnderlaySettings.Flags = 0;
+  anUnderlaySettings.IsImmediate = false;
+  myLayerIds.Add             (Graphic3d_ZLayerId_BotOSD);
+  myLayerSeq.Append          (Graphic3d_ZLayerId_BotOSD);
+  myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_BotOSD, anUnderlaySettings);
+
+  Graphic3d_ZLayerSettings aDefSettings;
+  aDefSettings.Flags = Graphic3d_ZLayerDepthTest
+                     | Graphic3d_ZLayerDepthWrite;
+  aDefSettings.IsImmediate = false;
+  myLayerIds.Add             (Graphic3d_ZLayerId_Default);
+  myLayerSeq.Append          (Graphic3d_ZLayerId_Default);
+  myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_Default, aDefSettings);
+
+  Graphic3d_ZLayerSettings aTopSettings;
+  aTopSettings.Flags = Graphic3d_ZLayerDepthTest
+                     | Graphic3d_ZLayerDepthWrite;
+  aTopSettings.IsImmediate = true;
+  myLayerIds.Add             (Graphic3d_ZLayerId_Top);
+  myLayerSeq.Append          (Graphic3d_ZLayerId_Top);
+  myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_Top, aTopSettings);
+
+  Graphic3d_ZLayerSettings aTopmostSettings;
+  aTopmostSettings.Flags = Graphic3d_ZLayerDepthTest
+                         | Graphic3d_ZLayerDepthWrite
+                         | Graphic3d_ZLayerDepthClear;
+  aTopmostSettings.IsImmediate = true;
+  myLayerIds.Add             (Graphic3d_ZLayerId_Topmost);
+  myLayerSeq.Append          (Graphic3d_ZLayerId_Topmost);
+  myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_Topmost, aTopmostSettings);
+
+  Graphic3d_ZLayerSettings anOsdSettings;
+  anOsdSettings.Flags = 0;
+  anOsdSettings.IsImmediate = true;
+  myLayerIds.Add             (Graphic3d_ZLayerId_TopOSD);
+  myLayerSeq.Append          (Graphic3d_ZLayerId_TopOSD);
+  myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_TopOSD, anOsdSettings);
 }
 
 // =======================================================================
@@ -107,11 +153,17 @@ OpenGl_GraphicDriver::~OpenGl_GraphicDriver()
 void OpenGl_GraphicDriver::ReleaseContext()
 {
   Handle(OpenGl_Context) aCtxShared;
-  for (NCollection_Map<Handle(OpenGl_Workspace)>::Iterator aWindowIter (myMapOfWS);
-       aWindowIter.More(); aWindowIter.Next())
+  for (NCollection_Map<Handle(OpenGl_View)>::Iterator aViewIter (myMapOfView);
+       aViewIter.More(); aViewIter.Next())
   {
-    const Handle(OpenGl_Workspace)& aWindow = aWindowIter.ChangeValue();
-    const Handle(OpenGl_Context)&   aCtx    = aWindow->GetGlContext();
+    const Handle(OpenGl_View)& aView = aViewIter.ChangeValue();
+    const Handle(OpenGl_Window)& aWindow = aView->GlWindow();
+    if (aWindow.IsNull())
+    {
+      continue;
+    }
+
+    const Handle(OpenGl_Context)& aCtx = aWindow->GetGlContext();
     if (aCtx->MakeCurrent()
      && aCtxShared.IsNull())
     {
@@ -138,12 +190,17 @@ void OpenGl_GraphicDriver::ReleaseContext()
   }
   myDeviceLostFlag = myDeviceLostFlag || !myMapOfStructure.IsEmpty();
 
-  for (NCollection_Map<Handle(OpenGl_Workspace)>::Iterator aWindowIter (myMapOfWS);
-       aWindowIter.More(); aWindowIter.Next())
+  for (NCollection_Map<Handle(OpenGl_View)>::Iterator aViewIter (myMapOfView);
+       aViewIter.More(); aViewIter.Next())
   {
-    const Handle(OpenGl_Workspace)& aWindow = aWindowIter.ChangeValue();
-    const Handle(OpenGl_Context)&   aCtx    = aWindow->GetGlContext();
-    aCtx->forcedRelease();
+    const Handle(OpenGl_View)& aView = aViewIter.ChangeValue();
+    const Handle(OpenGl_Window)& aWindow = aView->GlWindow();
+    if (aWindow.IsNull())
+    {
+      continue;
+    }
+
+    aWindow->GetGlContext()->forcedRelease();
   }
 
 #if defined(HAVE_EGL) || defined(__ANDROID__)
@@ -364,13 +421,24 @@ void OpenGl_GraphicDriver::EnableVBO (const Standard_Boolean theToTurnOn)
 // =======================================================================
 const Handle(OpenGl_Context)& OpenGl_GraphicDriver::GetSharedContext() const
 {
-  if (myMapOfWS.IsEmpty())
+  if (myMapOfView.IsEmpty())
   {
     return TheNullGlCtx;
   }
 
-  NCollection_Map<Handle(OpenGl_Workspace)>::Iterator anIter (myMapOfWS);
-  return anIter.Value()->GetGlContext();
+  NCollection_Map<Handle(OpenGl_View)>::Iterator anIter (myMapOfView);
+  for (; anIter.More(); anIter.Next())
+  {
+    Handle(OpenGl_Window) aWindow = anIter.Value()->GlWindow();
+    if (aWindow.IsNull())
+    {
+      continue;
+    }
+
+    return aWindow->GetGlContext();
+  }
+
+  return TheNullGlCtx;
 }
 
 // =======================================================================
@@ -392,272 +460,345 @@ Standard_Boolean OpenGl_GraphicDriver::MemoryInfo (Standard_Size&           theF
 }
 
 // =======================================================================
-// function : SetImmediateModeDrawToFront
+// function : SetBuffersNoSwap
 // purpose  :
 // =======================================================================
-Standard_Boolean OpenGl_GraphicDriver::SetImmediateModeDrawToFront (const Graphic3d_CView& theCView,
-                                                                    const Standard_Boolean theDrawToFrontBuffer)
+void OpenGl_GraphicDriver::SetBuffersNoSwap (const Standard_Boolean theIsNoSwap)
 {
-  if (theCView.ViewId == -1)
-  {
-    return Standard_False;
-  }
-
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL)
-  {
-    return aCView->WS->SetImmediateModeDrawToFront (theDrawToFrontBuffer);
-  }
-  return Standard_False;
+  myCaps->buffersNoSwap = theIsNoSwap;
 }
 
 // =======================================================================
-// function : Print
+// function : TextSize
 // purpose  :
 // =======================================================================
-Standard_Boolean OpenGl_GraphicDriver::Print (const Graphic3d_CView& theCView,
-                                              const Aspect_Handle    thePrintDC,
-                                              const Standard_Boolean theToShowBackground,
-                                              const Standard_CString theFilename,
-                                              const Aspect_PrintAlgo thePrintAlgorithm,
-                                              const Standard_Real    theScaleFactor) const
+void OpenGl_GraphicDriver::TextSize (const Standard_CString   theText,
+                                     const Standard_ShortReal theHeight,
+                                     Standard_ShortReal&      theWidth,
+                                     Standard_ShortReal&      theAscent,
+                                     Standard_ShortReal&      theDescent) const
 {
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView == NULL
-   || !myPrintContext.IsNull())
+  const Handle(OpenGl_Context)& aCtx = GetSharedContext();
+  if (aCtx.IsNull())
   {
-    return Standard_False;
+    return;
   }
 
-  Standard_Boolean isPrinted = Standard_False;
-  myPrintContext = new OpenGl_PrinterContext();
-#ifdef _WIN32
-  isPrinted = aCView->WS->Print (myPrintContext,
-                                 theCView,
-                                 thePrintDC,
-                                 theToShowBackground,
-                                 theFilename,
-                                 thePrintAlgorithm,
-                                 theScaleFactor);
-#else
-  Standard_NotImplemented::Raise ("OpenGl_GraphicDriver::Print is implemented only on Windows");
-#endif
-  myPrintContext.Nullify();
-  return isPrinted;
+  const Standard_ShortReal aHeight = (theHeight < 2.0f) ? DefaultTextHeight() : theHeight;
+  OpenGl_TextParam aTextParam;
+  aTextParam.Height = (int )aHeight;
+  OpenGl_AspectText aTextAspect;
+  CALL_DEF_CONTEXTTEXT aDefaultContextText =
+  {
+    1, //IsDef
+    1, //IsSet
+    "Courier", //Font
+    0.3F, //Space
+    1.F, //Expan
+    { 1.F, 1.F, 1.F }, //Color
+    (int)Aspect_TOST_NORMAL, //Style
+    (int)Aspect_TODT_NORMAL, //DisplayType
+    { 1.F, 1.F, 1.F }, //ColorSubTitle
+    0, //TextZoomable
+    0.F, //TextAngle
+    (int)Font_FA_Regular //TextFontAspect
+  };
+  aTextAspect.SetAspect(aDefaultContextText);
+  TCollection_ExtendedString anExtText = theText;
+  NCollection_String aText = (Standard_Utf16Char* )anExtText.ToExtString();
+  OpenGl_Text::StringSize (aCtx, aText, aTextAspect, aTextParam, theWidth, theAscent, theDescent);
 }
 
-// =======================================================================
-// function : ZBufferTriedronSetup
-// purpose  :
-// =======================================================================
-void OpenGl_GraphicDriver::ZBufferTriedronSetup (const Graphic3d_CView&     theCView,
-                                                 const Quantity_NameOfColor theXColor,
-                                                 const Quantity_NameOfColor theYColor,
-                                                 const Quantity_NameOfColor theZColor,
-                                                 const Standard_Real        theSizeRatio,
-                                                 const Standard_Real        theAxisDiametr,
-                                                 const Standard_Integer     theNbFacets)
+//=======================================================================
+//function : AddZLayer
+//purpose  :
+//=======================================================================
+void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_ZLayerId theLayerId)
 {
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView == NULL)
+  if (theLayerId < 1)
   {
-    return;
+    Standard_ASSERT_RAISE (theLayerId > 0,
+                           "OpenGl_GraphicDriver::AddZLayer, "
+                           "negative and zero IDs are reserved");
   }
 
-  OpenGl_Trihedron& aTrih = aCView->View->ChangeTrihedron();
-  aTrih.SetArrowsColors  (theXColor, theYColor, theZColor);
-  aTrih.SetSizeRatio     (theSizeRatio);
-  aTrih.SetNbFacets      (theNbFacets);
-  aTrih.SetArrowDiameter (theAxisDiametr);
-}
+  myLayerIds.Add    (theLayerId);
+  myLayerSeq.Append (theLayerId);
 
-// =======================================================================
-// function : TriedronDisplay
-// purpose  :
-// =======================================================================
-void OpenGl_GraphicDriver::TriedronDisplay (const Graphic3d_CView&              theCView,
-                                            const Aspect_TypeOfTriedronPosition thePosition,
-                                            const Quantity_NameOfColor          theColor,
-                                            const Standard_Real                 theScale,
-                                            const Standard_Boolean              theAsWireframe)
-{
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL)
+  // Default z-layer settings
+  myMapOfZLayerSettings.Bind (theLayerId, Graphic3d_ZLayerSettings());
+
+  // Add layer to all views
+  NCollection_Map<Handle(OpenGl_View)>::Iterator aViewIt (myMapOfView);
+  for (; aViewIt.More(); aViewIt.Next())
   {
-    aCView->View->TriedronDisplay (thePosition, theColor, theScale, theAsWireframe);
+    aViewIt.Value()->AddZLayer (theLayerId);
   }
 }
 
-// =======================================================================
-// function : TriedronErase
-// purpose  :
-// =======================================================================
-void OpenGl_GraphicDriver::TriedronErase (const Graphic3d_CView& theCView)
+//=======================================================================
+//function : RemoveZLayer
+//purpose  :
+//=======================================================================
+void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_ZLayerId theLayerId)
 {
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL)
+  Standard_ASSERT_RAISE (theLayerId > 0,
+                         "OpenGl_GraphicDriver::AddZLayer, "
+                         "negative and zero IDs are reserved"
+                         "and can not be removed");
+
+  Standard_ASSERT_RAISE (myLayerIds.Contains (theLayerId),
+                         "OpenGl_GraphicDriver::RemoveZLayer, "
+                         "Layer with theLayerId does not exist");
+
+  // Remove layer from all of the views
+  NCollection_Map<Handle(OpenGl_View)>::Iterator aViewIt (myMapOfView);
+  for (; aViewIt.More(); aViewIt.Next())
+  {
+    aViewIt.Value()->RemoveZLayer (theLayerId);
+  }
+
+  // Unset Z layer for all of the structures.
+  NCollection_DataMap<Standard_Integer, OpenGl_Structure*>::Iterator aStructIt (myMapOfStructure);
+  for( ; aStructIt.More (); aStructIt.Next ())
   {
-    aCView->View->TriedronErase (aCView->WS->GetGlContext());
+    OpenGl_Structure* aStruct = aStructIt.ChangeValue ();
+    if (aStruct->ZLayer() == theLayerId)
+      aStruct->SetZLayer (Graphic3d_ZLayerId_Default);
   }
+
+  // Remove index
+  for (int aIdx = 1; aIdx <= myLayerSeq.Length (); aIdx++)
+  {
+    if (myLayerSeq (aIdx) == theLayerId)
+    {
+      myLayerSeq.Remove (aIdx);
+      break;
+    }
+  }
+
+  myMapOfZLayerSettings.UnBind (theLayerId);
+  myLayerIds.Remove  (theLayerId);
 }
 
-// =======================================================================
-// function : TriedronEcho
-// purpose  :
-// =======================================================================
-void OpenGl_GraphicDriver::TriedronEcho (const Graphic3d_CView& ,
-                                         const Aspect_TypeOfTriedronEcho )
+//=======================================================================
+//function : ZLayers
+//purpose  :
+//=======================================================================
+void OpenGl_GraphicDriver::ZLayers (TColStd_SequenceOfInteger& theLayerSeq) const
 {
-  // do nothing
+  theLayerSeq.Assign (myLayerSeq);
 }
 
-// =======================================================================
-// function : Environment
-// purpose  :
-// =======================================================================
-void OpenGl_GraphicDriver::Environment (const Graphic3d_CView& theCView)
+//=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+void OpenGl_GraphicDriver::SetZLayerSettings (const Graphic3d_ZLayerId theLayerId,
+                                              const Graphic3d_ZLayerSettings& theSettings)
 {
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView == NULL)
+  // Change Z layer settings in all managed views
+  NCollection_Map<Handle(OpenGl_View)>::Iterator aViewIt (myMapOfView);
+  for (; aViewIt.More(); aViewIt.Next())
   {
-    return;
+    aViewIt.Value()->SetZLayerSettings (theLayerId, theSettings);
   }
 
-  aCView->View->SetTextureEnv    (aCView->WS->GetGlContext(), theCView.Context.TextureEnv);
-  aCView->View->SetSurfaceDetail ((Visual3d_TypeOfSurfaceDetail)theCView.Context.SurfaceDetail);
+  if (myMapOfZLayerSettings.IsBound (theLayerId))
+  {
+    myMapOfZLayerSettings.ChangeFind (theLayerId) = theSettings;
+  }
+  else
+  {
+    myMapOfZLayerSettings.Bind (theLayerId, theSettings);
+  }
 }
 
-// =======================================================================
-// function : BackgroundImage
-// purpose  :
-// =======================================================================
-void OpenGl_GraphicDriver::BackgroundImage (const Standard_CString  theFileName,
-                                            const Graphic3d_CView&  theCView,
-                                            const Aspect_FillMethod theFillStyle)
+//=======================================================================
+//function : ZLayerSettings
+//purpose  :
+//=======================================================================
+Graphic3d_ZLayerSettings OpenGl_GraphicDriver::ZLayerSettings (const Graphic3d_ZLayerId theLayerId)
 {
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL)
-  {
-    aCView->View->CreateBackgroundTexture (theFileName, theFillStyle);
-  }
+  Standard_ASSERT_RAISE (myLayerIds.Contains (theLayerId),
+                         "OpenGl_GraphicDriver::ZLayerSettings, "
+                         "Layer with theLayerId does not exist");
+
+  return myMapOfZLayerSettings.Find (theLayerId);
 }
 
 // =======================================================================
-// function : SetBgImageStyle
+// function : Structure
 // purpose  :
 // =======================================================================
-void OpenGl_GraphicDriver::SetBgImageStyle (const Graphic3d_CView&  theCView,
-                                            const Aspect_FillMethod theFillStyle)
+Handle(Graphic3d_CStructure) OpenGl_GraphicDriver::CreateStructure (const Handle(Graphic3d_StructureManager)& theManager)
 {
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL)
-  {
-    aCView->View->SetBackgroundTextureStyle (theFillStyle);
-  }
+  Handle(OpenGl_Structure) aStructure = new OpenGl_Structure (theManager);
+  myMapOfStructure.Bind (aStructure->Id, aStructure.operator->());
+  return aStructure;
 }
 
 // =======================================================================
-// function : SetBgGradientStyle
+// function : Structure
 // purpose  :
 // =======================================================================
-void OpenGl_GraphicDriver::SetBgGradientStyle (const Graphic3d_CView&          theCView,
-                                               const Aspect_GradientFillMethod theFillType)
+void OpenGl_GraphicDriver::RemoveStructure (Handle(Graphic3d_CStructure)& theCStructure)
 {
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL)
+  OpenGl_Structure* aStructure = NULL;
+  if (!myMapOfStructure.Find (theCStructure->Id, aStructure))
   {
-    aCView->View->SetBackgroundGradientType (theFillType);
+    return;
   }
+
+  myMapOfStructure.UnBind (theCStructure->Id);
+  aStructure->Release (GetSharedContext());
+  theCStructure.Nullify();
 }
 
 // =======================================================================
-// function : GraduatedTrihedronDisplay
+// function : View
 // purpose  :
 // =======================================================================
-void OpenGl_GraphicDriver::GraduatedTrihedronDisplay (const Graphic3d_CView&               theCView,
-                                                      const Graphic3d_GraduatedTrihedron& theCubic)
+Handle(Graphic3d_CView) OpenGl_GraphicDriver::CreateView (const Handle(Graphic3d_StructureManager)& theMgr)
 {
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL)
+  Handle(OpenGl_View) aView = new OpenGl_View (theMgr, this, myCaps, myDeviceLostFlag, &myStateCounter);
+
+  myMapOfView.Add (aView);
+
+  for (TColStd_SequenceOfInteger::Iterator aLayerIt (myLayerSeq); aLayerIt.More(); aLayerIt.Next())
   {
-    aCView->View->GraduatedTrihedronDisplay (aCView->WS->GetGlContext(), theCubic);
+    const Graphic3d_ZLayerId        aLayerID  = aLayerIt.Value();
+    const Graphic3d_ZLayerSettings& aSettings = myMapOfZLayerSettings.Find (aLayerID);
+    aView->AddZLayer         (aLayerID);
+    aView->SetZLayerSettings (aLayerID, aSettings);
   }
+
+  return aView;
 }
 
 // =======================================================================
-// function : GraduatedTrihedronErase
+// function : RemoveView
 // purpose  :
 // =======================================================================
-void OpenGl_GraphicDriver::GraduatedTrihedronErase (const Graphic3d_CView& theCView)
+void OpenGl_GraphicDriver::RemoveView (const Handle(Graphic3d_CView)& theView)
 {
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL)
+  Handle(OpenGl_Context) aCtx = GetSharedContext();
+  Handle(OpenGl_View) aView   = Handle(OpenGl_View)::DownCast (theView);
+  if (aView.IsNull())
   {
-    aCView->View->GraduatedTrihedronErase (aCView->WS->GetGlContext());
+    return;
   }
-}
 
-// =======================================================================
-// function : GraduatedTrihedronMinMaxValues
-// purpose  :
-// =======================================================================
-void OpenGl_GraphicDriver::GraduatedTrihedronMinMaxValues (const Graphic3d_CView& theView,
-                                                           const Graphic3d_Vec3   theMin,
-                                                           const Graphic3d_Vec3   theMax)
-{
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theView.ptrView;
-  if (aCView != NULL)
+  if (!myMapOfView.Remove (aView))
+  {
+    return;
+  }
+
+  Handle(OpenGl_Window) aWindow = aView->GlWindow();
+  if (!aWindow.IsNull()
+    && aWindow->GetGlContext()->MakeCurrent())
   {
-    aCView->View->ChangeGraduatedTrihedron().SetMinMax (theMin, theMax);
+    aCtx = aWindow->GetGlContext();
+  }
+  else
+  {
+    // try to hijack another context if any
+    const Handle(OpenGl_Context)& anOtherCtx = GetSharedContext();
+    if (!anOtherCtx.IsNull()
+      && anOtherCtx != aWindow->GetGlContext())
+    {
+      aCtx = anOtherCtx;
+      aCtx->MakeCurrent();
+    }
+  }
+
+  aView->ReleaseGlResources (aCtx);
+  if (myMapOfView.IsEmpty())
+  {
+    // The last view removed but some objects still present.
+    // Release GL resources now without object destruction.
+    for (NCollection_DataMap<Standard_Integer, OpenGl_Structure*>::Iterator aStructIt (myMapOfStructure);
+         aStructIt.More (); aStructIt.Next())
+    {
+      OpenGl_Structure* aStruct = aStructIt.ChangeValue();
+      aStruct->ReleaseGlResources (aCtx);
+    }
+    myDeviceLostFlag = !myMapOfStructure.IsEmpty();
   }
 }
 
 // =======================================================================
-// function : SetBuffersNoSwap
+// function : Window
 // purpose  :
 // =======================================================================
-void OpenGl_GraphicDriver::SetBuffersNoSwap (const Standard_Boolean theIsNoSwap)
+Handle(OpenGl_Window) OpenGl_GraphicDriver::CreateRenderWindow (const Handle(Aspect_Window)&  theWindow,
+                                                                const Aspect_RenderingContext theContext)
 {
-  myCaps->buffersNoSwap = theIsNoSwap;
+  Handle(OpenGl_Context) aShareCtx = GetSharedContext();
+  Handle(OpenGl_Window) aWindow = new OpenGl_Window (this, theWindow, theContext, myCaps, aShareCtx);
+  return aWindow;
 }
 
-// =======================================================================
-// function : TextSize
-// purpose  :
-// =======================================================================
-void OpenGl_GraphicDriver::TextSize (const Standard_CString   theText,
-                                     const Standard_ShortReal theHeight,
-                                     Standard_ShortReal&      theWidth,
-                                     Standard_ShortReal&      theAscent,
-                                     Standard_ShortReal&      theDescent) const
+//=======================================================================
+//function : ViewExists
+//purpose  :
+//=======================================================================
+Standard_Boolean OpenGl_GraphicDriver::ViewExists (const Handle(Aspect_Window)& AWindow, Handle(Graphic3d_CView)& theView)
 {
-  const Handle(OpenGl_Context)& aCtx = GetSharedContext();
-  if (aCtx.IsNull())
+  Standard_Boolean isExist = Standard_False;
+
+  // Parse the list of views to find
+  // a view with the specified window
+
+#if defined(_WIN32)
+  const Handle(WNT_Window) THEWindow = Handle(WNT_Window)::DownCast (AWindow);
+  Aspect_Handle TheSpecifiedWindowId = THEWindow->HWindow ();
+#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
+  const Handle(Cocoa_Window) THEWindow = Handle(Cocoa_Window)::DownCast (AWindow);
+  #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+    UIView* TheSpecifiedWindowId = THEWindow->HView();
+  #else
+    NSView* TheSpecifiedWindowId = THEWindow->HView();
+  #endif
+#elif defined(__ANDROID__)
+  int TheSpecifiedWindowId = -1;
+#else
+  const Handle(Xw_Window) THEWindow = Handle(Xw_Window)::DownCast (AWindow);
+  int TheSpecifiedWindowId = int (THEWindow->XWindow ());
+#endif
+
+  NCollection_Map<Handle(OpenGl_View)>::Iterator aViewIt (myMapOfView);
+  for(; aViewIt.More(); aViewIt.Next())
   {
-    return;
+    const Handle(OpenGl_View)& aView = aViewIt.Value();
+    if (aView->IsDefined() && aView->IsActive())
+    {
+      const Handle(Aspect_Window) AspectWindow = aView->Window();
+
+#if defined(_WIN32)
+      const Handle(WNT_Window) theWindow = Handle(WNT_Window)::DownCast (AspectWindow);
+      Aspect_Handle TheWindowIdOfView = theWindow->HWindow ();
+#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
+      const Handle(Cocoa_Window) theWindow = Handle(Cocoa_Window)::DownCast (AspectWindow);
+      #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+        UIView* TheWindowIdOfView = theWindow->HView();
+      #else
+        NSView* TheWindowIdOfView = theWindow->HView();
+      #endif
+#elif defined(__ANDROID__)
+      int TheWindowIdOfView = 0;
+#else
+      const Handle(Xw_Window) theWindow = Handle(Xw_Window)::DownCast (AspectWindow);
+      int TheWindowIdOfView = int (theWindow->XWindow ());
+#endif  // WNT
+      // Comparaison on window IDs
+      if (TheWindowIdOfView == TheSpecifiedWindowId)
+      {
+        isExist = Standard_True;
+        theView = aView;
+      }
+    }
   }
 
-  const Standard_ShortReal aHeight = (theHeight < 2.0f) ? DefaultTextHeight() : theHeight;
-  OpenGl_TextParam aTextParam;
-  aTextParam.Height = (int )aHeight;
-  OpenGl_AspectText aTextAspect;
-  CALL_DEF_CONTEXTTEXT aDefaultContextText =
-  {
-    1, //IsDef
-    1, //IsSet
-    "Courier", //Font
-    0.3F, //Space
-    1.F, //Expan
-    { 1.F, 1.F, 1.F }, //Color
-    (int)Aspect_TOST_NORMAL, //Style
-    (int)Aspect_TODT_NORMAL, //DisplayType
-    { 1.F, 1.F, 1.F }, //ColorSubTitle
-    0, //TextZoomable
-    0.F, //TextAngle
-    (int)Font_FA_Regular //TextFontAspect
-  };
-  aTextAspect.SetAspect(aDefaultContextText);
-  TCollection_ExtendedString anExtText = theText;
-  NCollection_String aText = (Standard_Utf16Char* )anExtText.ToExtString();
-  OpenGl_Text::StringSize (aCtx, aText, aTextAspect, aTextParam, theWidth, theAscent, theDescent);
+  return isExist;
 }
index 7308ec5..b92e9e3 100644 (file)
 #define _OpenGl_GraphicDriver_HeaderFile
 
 #include <Graphic3d_GraphicDriver.hxx>
-#include <OpenGl_Context.hxx>
-#include <OpenGl_PrinterContext.hxx>
-
-#include <Standard_CString.hxx>
-
-#include <TColStd_HArray1OfByte.hxx>
-#include <TColStd_HArray1OfReal.hxx>
-#include <Quantity_PlaneAngle.hxx>
-#include <Quantity_NameOfColor.hxx>
 
 #include <Aspect_Display.hxx>
 #include <Aspect_DisplayConnection.hxx>
@@ -35,6 +26,7 @@
 #include <Aspect_TypeOfTriedronEcho.hxx>
 #include <Aspect_Handle.hxx>
 #include <Aspect_PrintAlgo.hxx>
+#include <Aspect_RenderingContext.hxx>
 #include <gp_Ax2.hxx>
 #include <Graphic3d_CView.hxx>
 #include <Graphic3d_CStructure.hxx>
 #include <Graphic3d_Array2OfVertex.hxx>
 #include <Graphic3d_BufferType.hxx>
 #include <NCollection_DataMap.hxx>
-
+#include <OpenGl_Context.hxx>
+#include <OpenGl_MapOfZLayerSettings.hxx>
+#include <Quantity_PlaneAngle.hxx>
+#include <Quantity_NameOfColor.hxx>
+#include <Standard_CString.hxx>
 #include <TColStd_Array1OfInteger.hxx>
-#include <TColStd_HArray1OfReal.hxx>
 #include <TColStd_Array2OfReal.hxx>
 #include <TColStd_HArray1OfByte.hxx>
+#include <TColStd_HArray1OfReal.hxx>
+#include <TColStd_MapOfInteger.hxx>
 
+class Aspect_Window;
 class Graphic3d_Vector;
 class Quantity_Color;
 class Graphic3d_Vertex;
@@ -66,6 +64,7 @@ class OpenGl_Element;
 class OpenGl_Structure;
 class OpenGl_Text;
 class OpenGl_View;
+class OpenGl_Window;
 
 //! Tool class to implement consistent state counter
 //! for objects inside the same driver instance.
@@ -83,6 +82,7 @@ private:
 };
 
 class OpenGl_GraphicDriver;
+
 DEFINE_STANDARD_HANDLE(OpenGl_GraphicDriver,Graphic3d_GraphicDriver)
 
 //! This class defines an OpenGl graphic driver
@@ -118,159 +118,49 @@ public:
   Standard_EXPORT Standard_Integer InquireLightLimit ();
   Standard_EXPORT Standard_Integer InquireViewLimit ();
 
-public: // Methods for graphical structures
+public:
 
-  Standard_EXPORT void DisplayStructure (const Graphic3d_CView&             theCView,
-                                         const Handle(Graphic3d_Structure)& theStructure,
-                                         const Standard_Integer             thePriority);
-  Standard_EXPORT void EraseStructure (const Graphic3d_CView&             theCView,
-                                       const Handle(Graphic3d_Structure)& theStructure);
-  Standard_EXPORT void RemoveStructure (Handle(Graphic3d_CStructure)& theCStructure);
-  Standard_EXPORT Handle(Graphic3d_CStructure) Structure (const Handle(Graphic3d_StructureManager)& theManager);
+  Standard_EXPORT virtual Handle(Graphic3d_CStructure) CreateStructure (const Handle(Graphic3d_StructureManager)& theManager) Standard_OVERRIDE;
 
-  Standard_EXPORT Standard_Boolean SetImmediateModeDrawToFront (const Graphic3d_CView& theCView,
-                                                                const Standard_Boolean theDrawToFrontBuffer);
+  Standard_EXPORT virtual void RemoveStructure (Handle(Graphic3d_CStructure)& theCStructure) Standard_OVERRIDE;
 
-public:
+  Standard_EXPORT virtual Handle(Graphic3d_CView) CreateView (const Handle(Graphic3d_StructureManager)& theMgr) Standard_OVERRIDE;
 
-  Standard_EXPORT void ActivateView (const Graphic3d_CView& ACView);
-  Standard_EXPORT void AntiAliasing (const Graphic3d_CView& ACView, const Standard_Boolean AFlag);
-  Standard_EXPORT void Background (const Graphic3d_CView& ACView);
-  Standard_EXPORT void GradientBackground (const Graphic3d_CView& ACView, const Quantity_Color& AColor1, const Quantity_Color& AColor2, const Aspect_GradientFillMethod FillStyle);
-  Standard_EXPORT void BackgroundImage (const Standard_CString FileName, const Graphic3d_CView& ACView, const Aspect_FillMethod FillStyle);
-  Standard_EXPORT void SetBgImageStyle (const Graphic3d_CView& ACView, const Aspect_FillMethod FillStyle);
-  Standard_EXPORT void SetBgGradientStyle (const Graphic3d_CView& ACView, const Aspect_GradientFillMethod FillStyle);
-  Standard_EXPORT void ClipLimit (const Graphic3d_CView& ACView, const Standard_Boolean AWait);
-  Standard_EXPORT void DeactivateView (const Graphic3d_CView& ACView);
-  Standard_EXPORT void DepthCueing (const Graphic3d_CView& ACView, const Standard_Boolean AFlag);
-  Standard_EXPORT void RatioWindow (const Graphic3d_CView& ACView);
-  Standard_EXPORT void Redraw (const Graphic3d_CView& theCView,
-                               const Standard_Integer theX = 0,
-                               const Standard_Integer theY = 0,
-                               const Standard_Integer theWidth  = 0,
-                               const Standard_Integer theHeight = 0);
-  Standard_EXPORT void RedrawImmediate (const Graphic3d_CView& theCView);
-  Standard_EXPORT void Invalidate (const Graphic3d_CView& theCView);
-  Standard_EXPORT Standard_Boolean IsInvalidated (const Graphic3d_CView& theCView) const;
-  Standard_EXPORT void RemoveView (const Graphic3d_CView& ACView);
-  Standard_EXPORT void SetLight (const Graphic3d_CView& ACView);
-  Standard_EXPORT void SetClipPlanes (const Graphic3d_CView& theCView);
-  Standard_EXPORT void SetCamera (const Graphic3d_CView& theCView);
-  Standard_EXPORT void SetVisualisation (const Graphic3d_CView& ACView);
-  Standard_EXPORT Standard_Boolean View (Graphic3d_CView& ACView);
-  Standard_EXPORT void Environment (const Graphic3d_CView& ACView);
-  Standard_EXPORT void ZBufferTriedronSetup (const Graphic3d_CView& theCView,
-                                             const Quantity_NameOfColor XColor = Quantity_NOC_RED,
-                                             const Quantity_NameOfColor YColor = Quantity_NOC_GREEN,
-                                             const Quantity_NameOfColor ZColor = Quantity_NOC_BLUE1,
-                                             const Standard_Real SizeRatio = 0.8,
-                                             const Standard_Real AxisDiametr = 0.05,
-                                             const Standard_Integer NbFacettes = 12);
-  Standard_EXPORT void TriedronDisplay (const Graphic3d_CView& ACView, const Aspect_TypeOfTriedronPosition APosition = Aspect_TOTP_CENTER, const Quantity_NameOfColor AColor = Quantity_NOC_WHITE, const Standard_Real AScale = 0.02, const Standard_Boolean AsWireframe = Standard_True);
-  Standard_EXPORT void TriedronErase (const Graphic3d_CView& ACView);
-  Standard_EXPORT void TriedronEcho (const Graphic3d_CView& ACView, const Aspect_TypeOfTriedronEcho AType = Aspect_TOTE_NONE);
-
-  //! Displays Graduated trihedron
-  //! @param theView [in] the graphic view
-  //! @param theCubic [in] Graduated Trihedon parameters.
-  //! @sa OpenGl_GraduatedTrihedron
-  //! @sa Graphic3d_GraduatedTrihedron
-  Standard_EXPORT void GraduatedTrihedronDisplay (const Graphic3d_CView& theView, const Graphic3d_GraduatedTrihedron& theCubic);
-
-  //! Erases Graduated Trihedron from the view.
-  //! theView [in] graphic view
-  //! @sa OpenGl_GraduatedTrihedron
-  Standard_EXPORT void GraduatedTrihedronErase (const Graphic3d_CView& theView);
-
-  //! Sets minimum and maximum points of scene bounding box for Graduated Trihedron
-  //! stored in graphic view object. 
-  //! @param theView [in] current graphic view
-  //! @param theMin [in] the minimum point of scene.
-  //! @param theMax [in] the maximum point of scene.
-  //! @sa OpenGl_GraduatedTrihedron
-  Standard_EXPORT void GraduatedTrihedronMinMaxValues (const Graphic3d_CView& theView,
-                                                       const Graphic3d_Vec3 theMin, const Graphic3d_Vec3 theMax);
+  Standard_EXPORT virtual void RemoveView (const Handle(Graphic3d_CView)& theView) Standard_OVERRIDE;
+
+  Standard_EXPORT virtual Handle(OpenGl_Window) CreateRenderWindow (const Handle(Aspect_Window)& theWindow, const Aspect_RenderingContext theContext);
+
+public:
 
   Standard_EXPORT void TextSize (const Standard_CString AText,const Standard_ShortReal AHeight,Standard_ShortReal& AWidth,Standard_ShortReal& AnAscent,Standard_ShortReal& ADescent) const;
-  Standard_EXPORT void SetBackFacingModel (const Graphic3d_CView& aView);
-
-  //! Print the contents of all layers of the view to the printer.
-  //! @param thePrinterDC        pass the PrinterDeviceContext (HDC)
-  //! @param theToShowBackground when set to FALSE then print the view without background color (background is white) else set to TRUE for printing with current background color
-  //! @param theFileName         if != NULL, then the view will be printed to a file
-  //! @param thePrintAlgorithm   select print algorithm: stretch, tile
-  //! @param theScaleFactor      scaling coefficient, used internally to scale the printings accordingly to the scale factor selected in the printer properties dialog
-  //! @return Standard_True if the data is passed to the printer, otherwise Standard_False if the print operation failed due to the printer errors,
-  //! or lack of system memory. This might be related to insufficient memory or some internal errors.
-  //! All this errors are indicated by the message boxes (on level of OpenGl_GraphicDriver).
-  //! Warning: This function can reuse FBO assigned to the view, please take it into account if you use it for your purposes.
-  Standard_EXPORT Standard_Boolean Print (const Graphic3d_CView& theCView,
-                                          const Aspect_Handle    thePrinterDC,
-                                          const Standard_Boolean theToShowBackground,
-                                          const Standard_CString theFileName,
-                                          const Aspect_PrintAlgo thePrintAlgorithm = Aspect_PA_STRETCH,
-                                          const Standard_Real    theScaleFactor = 1.0) const;
-
-  //! Reads depths of shown pixels of the given rectangle (glReadPixels with GL_DEPTH_COMPONENT)
-  Standard_EXPORT void ReadDepths (const Graphic3d_CView& view,const Standard_Integer x,const Standard_Integer y,const Standard_Integer width,const Standard_Integer height,const Standard_Address buffer) const;
-
-  //! Generate offscreen FBO (needs OpenGL2+ hardware).
-  //! If not supported on hardware returns NULL.
-  Standard_EXPORT Graphic3d_PtrFrameBuffer FBOCreate (const Graphic3d_CView& view, const Standard_Integer width, const Standard_Integer height);
-
-  //! Remove offscreen FBO
-  Standard_EXPORT void FBORelease (const Graphic3d_CView& view, Graphic3d_PtrFrameBuffer& fboPtr);
-
-  //! Dump active rendering buffer into specified memory buffer.
-  Standard_EXPORT Standard_Boolean BufferDump (const Graphic3d_CView&      theCView,
-                                               Image_PixMap&               theImage,
-                                               const Graphic3d_BufferType& theBufferType);
-
-  Standard_EXPORT void SetGLLightEnabled (const Graphic3d_CView& view,const Standard_Boolean isEnabled) const;
-
-  Standard_EXPORT Standard_Boolean IsGLLightEnabled (const Graphic3d_CView& view) const;
 
   Standard_EXPORT Standard_Integer InquirePlaneLimit();
 
   Standard_EXPORT Standard_ShortReal DefaultTextHeight() const;
 
-  Standard_EXPORT void FBOGetDimensions(const Graphic3d_CView& view,const Graphic3d_PtrFrameBuffer fboPtr,Standard_Integer& width,Standard_Integer& height,Standard_Integer& widthMax,Standard_Integer& heightMax);
+  Standard_EXPORT Standard_Boolean ViewExists (const Handle(Aspect_Window)& theWindow, Handle(Graphic3d_CView)& theView) Standard_OVERRIDE;
 
-  Standard_EXPORT void FBOChangeViewport(const Graphic3d_CView& view,Graphic3d_PtrFrameBuffer& fboPtr,const Standard_Integer width,const Standard_Integer height);
-
-  Standard_EXPORT Standard_Boolean Export(const Standard_CString theFileName,const Graphic3d_ExportFormat theFormat,const Graphic3d_SortType theSortType,const Standard_Integer theWidth,const Standard_Integer theHeight,const Graphic3d_CView& theView,const Standard_Real thePrecision = 0.005,const Standard_Address theProgressBarFunc = NULL,const Standard_Address theProgressObject = NULL);
-
-  //! Add a new top-level z layer with ID theLayerId for the view. Z layers allow drawing structures in higher layers in foreground of structures in lower layers.
-  //! To add a structure to desired layer on display it is necessary to set the layer index for the structure.
-  Standard_EXPORT void AddZLayer (const Graphic3d_CView&   theCView,
-                                  const Graphic3d_ZLayerId theLayerId);
+public:
 
-  //! Remove Z layer from the specified view.
-  //! All structures displayed at the moment in layer will be displayed in default layer (the bottom-level z layer).
-  //! To unset layer index from associated structures use method UnsetZLayer (...).
-  Standard_EXPORT void RemoveZLayer (const Graphic3d_CView&   theCView,
-                                     const Graphic3d_ZLayerId theLayerId);
+  //! Adds a new top-level z layer with ID theLayerId for all views. Z layers allow drawing structures in higher layers
+  //! in foreground of structures in lower layers. To add a structure to desired layer on display it is necessary to
+  //! set the layer index for the structure. The passed theLayerId should be not less than 0 (reserved for default layers).
+  Standard_EXPORT void AddZLayer (const Graphic3d_ZLayerId theLayerId) Standard_OVERRIDE;
 
-  //! Unset Z layer ID for all structures.
-  //! The structure indexes will be set to default layer (the bottom-level z layer with ID = 0).
-  Standard_EXPORT void UnsetZLayer (const Graphic3d_ZLayerId theLayerId);
+  //! Removes Z layer. All structures displayed at the moment in layer will be displayed in
+  //! default layer (the bottom-level z layer). By default, there are always default
+  //! bottom-level layer that can't be removed.  The passed theLayerId should be not less than 0
+  //! (reserved for default layers that can not be removed).
+  Standard_EXPORT void RemoveZLayer (const Graphic3d_ZLayerId theLayerId) Standard_OVERRIDE;
 
-  //! Change Z layer of a structure already presented in view.
-  //! It is recommended to update z layer of already displayed structures with this method before setting new z layer index to the structure.
-  //! This is usually done by viewer manager.
-  Standard_EXPORT void ChangeZLayer (const Graphic3d_CStructure& theCStructure,
-                                     const Graphic3d_CView&      theCView,
-                                     const Graphic3d_ZLayerId    theNewLayerId);
+  //! Returns list of Z layers defined for the graphical driver.
+  Standard_EXPORT void ZLayers (TColStd_SequenceOfInteger& theLayerSeq) const Standard_OVERRIDE;
 
-  //! Sets the settings for a single Z layer of specified view.
-  Standard_EXPORT void SetZLayerSettings (const Graphic3d_CView&          theCView,
-                                          const Graphic3d_ZLayerId        theLayerId,
-                                          const Graphic3d_ZLayerSettings& theSettings);
+  //! Sets the settings for a single Z layer.
+  Standard_EXPORT void SetZLayerSettings (const Graphic3d_ZLayerId theLayerId, const Graphic3d_ZLayerSettings& theSettings) Standard_OVERRIDE;
 
-  //! Changes priority of a structure within its Z layer for the specified view.
-  Standard_EXPORT void ChangePriority (const Graphic3d_CStructure& theCStructure,
-                                       const Graphic3d_CView& theCView,
-                                       const Standard_Integer theNewPriority);
+  //! Returns the settings of a single Z layer.
+  Standard_EXPORT virtual Graphic3d_ZLayerSettings ZLayerSettings (const Graphic3d_ZLayerId theLayerId) Standard_OVERRIDE;
 
 public:
 
@@ -311,10 +201,6 @@ public:
   //! Could return NULL-handle if no window created by this driver.
   Standard_EXPORT const Handle(OpenGl_Context)& GetSharedContext() const;
 
-  //! Marks BVH tree for given priority list as dirty and
-  //! marks primitive set for rebuild.
-  Standard_EXPORT void InvalidateBVHData (Graphic3d_CView& theCView, const Standard_Integer theLayerId);
-
 #if defined(HAVE_EGL) || defined(__ANDROID__)
   Aspect_Display          getRawGlDisplay() const { return myEglDisplay; }
   Aspect_RenderingContext getRawGlContext() const { return myEglContext;  }
@@ -336,13 +222,17 @@ protected:
 
   Handle(OpenGl_Caps)                                             myCaps;
   NCollection_Map<Handle(OpenGl_View)>                            myMapOfView;
-  NCollection_Map<Handle(OpenGl_Workspace)>                       myMapOfWS;
   NCollection_DataMap<Standard_Integer, OpenGl_Structure*>        myMapOfStructure;
-  mutable Handle(OpenGl_PrinterContext)                           myPrintContext;
   OpenGl_UserDrawCallback_t                                       myUserDrawCallback;
 
 public:
 
+  TColStd_MapOfInteger       myLayerIds;
+  TColStd_SequenceOfInteger  myLayerSeq;
+  OpenGl_MapOfZLayerSettings myMapOfZLayerSettings;
+
+public:
+
   //! State counter for OpenGl structures.
   OpenGl_StateCounter* GetStateCounter() const { return &myStateCounter; }
 
diff --git a/src/OpenGl/OpenGl_GraphicDriver_4.cxx b/src/OpenGl/OpenGl_GraphicDriver_4.cxx
deleted file mode 100644 (file)
index cc021b0..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-// Created on: 2011-10-20
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#include <OpenGl_GraphicDriver.hxx>
-
-#include <NCollection_DataMap.hxx>
-#include <OpenGl_Structure.hxx>
-#include <OpenGl_CView.hxx>
-
-void OpenGl_GraphicDriver::DisplayStructure (const Graphic3d_CView&             theCView,
-                                             const Handle(Graphic3d_Structure)& theStructure,
-                                             const Standard_Integer             thePriority)
-{
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView == NULL)
-    return;
-
-  aCView->View->DisplayStructure (theStructure, thePriority);
-}
-
-void OpenGl_GraphicDriver::EraseStructure (const Graphic3d_CView&             theCView,
-                                           const Handle(Graphic3d_Structure)& theStructure)
-{
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView == NULL)
-    return;
-
-  aCView->View->EraseStructure (theStructure);
-}
-
-void OpenGl_GraphicDriver::RemoveStructure (Handle(Graphic3d_CStructure)& theCStructure)
-{
-  OpenGl_Structure* aStructure = NULL;
-  if (!myMapOfStructure.Find (theCStructure->Id, aStructure))
-  {
-    return;
-  }
-
-  myMapOfStructure.UnBind (theCStructure->Id);
-  aStructure->Release (GetSharedContext());
-  theCStructure.Nullify();
-}
-
-Handle(Graphic3d_CStructure) OpenGl_GraphicDriver::Structure (const Handle(Graphic3d_StructureManager)& theManager)
-{
-  Handle(OpenGl_Structure) aStructure = new OpenGl_Structure (theManager);
-  myMapOfStructure.Bind (aStructure->Id, aStructure.operator->());
-  return aStructure;
-}
-
-//=======================================================================
-//function : ChangeZLayer
-//purpose  :
-//=======================================================================
-
-void OpenGl_GraphicDriver::ChangeZLayer (const Graphic3d_CStructure& theCStructure,
-                                         const Graphic3d_CView&      theCView,
-                                         const Graphic3d_ZLayerId    theNewLayerId)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView;
-
-  if (!myMapOfStructure.IsBound (theCStructure.Id) || !aCView)
-    return;
-
-  OpenGl_Structure* aStructure = myMapOfStructure.Find (theCStructure.Id);
-
-  aCView->View->ChangeZLayer (aStructure, theNewLayerId);
-}
-
-//=======================================================================
-//function : UnsetZLayer
-//purpose  :
-//=======================================================================
-
-void OpenGl_GraphicDriver::UnsetZLayer (const Graphic3d_ZLayerId theLayerId)
-{
-  NCollection_DataMap<Standard_Integer, OpenGl_Structure*>::Iterator aStructIt (myMapOfStructure);
-  for( ; aStructIt.More (); aStructIt.Next ())
-  {
-    OpenGl_Structure* aStruct = aStructIt.ChangeValue ();
-    if (aStruct->ZLayer() == theLayerId)
-      aStruct->SetZLayer (Graphic3d_ZLayerId_Default);
-  }
-}
-
-//=======================================================================
-//function : ChangePriority
-//purpose  :
-//=======================================================================
-void OpenGl_GraphicDriver::ChangePriority (const Graphic3d_CStructure& theCStructure,
-                                           const Graphic3d_CView&      theCView,
-                                           const Standard_Integer      theNewPriority)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView;
-
-  if (!myMapOfStructure.IsBound (theCStructure.Id) || !aCView)
-    return;
-
-  OpenGl_Structure* aStructure = myMapOfStructure.Find (theCStructure.Id);
-
-  aCView->View->ChangePriority (aStructure, theNewPriority);
-}
diff --git a/src/OpenGl/OpenGl_GraphicDriver_7.cxx b/src/OpenGl/OpenGl_GraphicDriver_7.cxx
deleted file mode 100644 (file)
index 7f1c6be..0000000
+++ /dev/null
@@ -1,599 +0,0 @@
-// Created on: 2011-10-20
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#include <OpenGl_GraphicDriver.hxx>
-
-#include <OpenGl_FrameBuffer.hxx>
-
-#include <OpenGl_Structure.hxx>
-#include <OpenGl_CView.hxx>
-#include <OpenGl_Text.hxx>
-
-/*----------------------------------------------------------------------*/
-
-void OpenGl_GraphicDriver::ActivateView (const Graphic3d_CView& ACView)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-    aCView->WS->SetActiveView(aCView->View, ACView.ViewId);
-}
-
-void OpenGl_GraphicDriver::AntiAliasing (const Graphic3d_CView& ACView, const Standard_Boolean AFlag)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-    aCView->View->SetAntiAliasing(AFlag);
-}
-
-void OpenGl_GraphicDriver::Background (const Graphic3d_CView& ACView)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-  {
-    aCView->WS->SetBackgroundColor(ACView.DefWindow.Background.r,ACView.DefWindow.Background.g,ACView.DefWindow.Background.b);
-  }
-}
-
-void OpenGl_GraphicDriver::GradientBackground (const Graphic3d_CView& ACView,
-                                              const Quantity_Color& AColor1,
-                                              const Quantity_Color& AColor2,
-                                              const Aspect_GradientFillMethod AType)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-  {
-    aCView->View->SetBackgroundGradient(AColor1,AColor2,AType);
-  }
-}
-
-void OpenGl_GraphicDriver::ClipLimit (const Graphic3d_CView& ACView, const Standard_Boolean AWait)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-  {
-    aCView->View->SetClipLimit(ACView);
-    if (!AWait)
-    {
-      aCView->WS->Resize(ACView.DefWindow);
-    }
-  }
-}
-
-void OpenGl_GraphicDriver::DeactivateView (const Graphic3d_CView& ACView)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-  {
-    const Handle(OpenGl_View) aDummyView;
-    aCView->WS->SetActiveView (aDummyView, -1);
-  }
-}
-
-void OpenGl_GraphicDriver::DepthCueing (const Graphic3d_CView& ACView, const Standard_Boolean AFlag)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-    aCView->View->SetFog(ACView, AFlag);
-}
-
-void OpenGl_GraphicDriver::RatioWindow (const Graphic3d_CView& theCView)
-{
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL)
-    aCView->WS->Resize (theCView.DefWindow);
-}
-
-void OpenGl_GraphicDriver::Redraw (const Graphic3d_CView& ACView,
-                                   const Standard_Integer /*x*/,
-                                   const Standard_Integer /*y*/,
-                                   const Standard_Integer /*width*/,
-                                   const Standard_Integer /*height*/)
-{
-  if (ACView.RenderParams.Method == Graphic3d_RM_RAYTRACING
-  && !myCaps->vboDisable
-  && !myCaps->keepArrayData)
-  {
-    if (ACView.WasRedrawnGL)
-    {
-      myDeviceLostFlag = Standard_True;
-    }
-
-    myCaps->keepArrayData = Standard_True;
-  }
-
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-  {
-    /*if( width <= 0 || height <= 0  )
-      aCView->WS->Redraw(ACView, ACUnderLayer, ACOverLayer);
-    else
-      aCView->WS->RedrawArea(ACView, ACUnderLayer, ACOverLayer, x, y, width, height);*/
-    // Always do full redraw
-    aCView->WS->Redraw(ACView);
-  }
-}
-
-void OpenGl_GraphicDriver::RedrawImmediate (const Graphic3d_CView& theCView)
-{
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL)
-  {
-    aCView->WS->RedrawImmediate (theCView);
-  }
-}
-
-void OpenGl_GraphicDriver::Invalidate (const Graphic3d_CView& theCView)
-{
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL)
-  {
-    aCView->WS->Invalidate();
-  }
-}
-
-Standard_Boolean OpenGl_GraphicDriver::IsInvalidated (const Graphic3d_CView& theCView) const
-{
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  return aCView == NULL
-      || aCView->WS->IsInvalidated();
-}
-
-Graphic3d_PtrFrameBuffer OpenGl_GraphicDriver::FBOCreate (const Graphic3d_CView& ACView, const Standard_Integer theWidth, const Standard_Integer theHeight)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-    return aCView->WS->FBOCreate(theWidth, theHeight);
-  return (Graphic3d_PtrFrameBuffer)NULL;
-}
-
-Graphic3d_PtrFrameBuffer OpenGl_Workspace::FBOCreate (const Standard_Integer theWidth,
-                                                      const Standard_Integer theHeight)
-{
-  // activate OpenGL context
-  if (!Activate())
-    return NULL;
-
-  // create the FBO
-  const Handle(OpenGl_Context)& aCtx = GetGlContext();
-  OpenGl_FrameBuffer* aFrameBuffer = new OpenGl_FrameBuffer();
-  if (!aFrameBuffer->Init (aCtx, theWidth, theHeight))
-  {
-    aFrameBuffer->Release (aCtx.operator->());
-    delete aFrameBuffer;
-    return NULL;
-  }
-  return (Graphic3d_PtrFrameBuffer )aFrameBuffer;
-}
-
-void OpenGl_GraphicDriver::FBORelease (const Graphic3d_CView& ACView, Graphic3d_PtrFrameBuffer& theFBOPtr)
-{
-  if (theFBOPtr == NULL)
-    return;
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-  {
-    aCView->WS->FBORelease(theFBOPtr);
-    theFBOPtr = NULL;
-  }
-}
-
-void OpenGl_Workspace::FBORelease (Graphic3d_PtrFrameBuffer theFBOPtr)
-{
-  // activate OpenGL context
-  if (!Activate()
-   || theFBOPtr == NULL)
-  {
-    return;
-  }
-
-  // release the object
-  OpenGl_FrameBuffer* aFrameBuffer = (OpenGl_FrameBuffer*)theFBOPtr;
-  if (aFrameBuffer != NULL)
-  {
-    aFrameBuffer->Release (GetGlContext().operator->());
-  }
-  delete aFrameBuffer;
-}
-
-void OpenGl_GraphicDriver::FBOGetDimensions (const Graphic3d_CView& ,
-                                             const Graphic3d_PtrFrameBuffer theFBOPtr,
-                                             Standard_Integer& theWidth,    Standard_Integer& theHeight,
-                                             Standard_Integer& theWidthMax, Standard_Integer& theHeightMax)
-{
-  if (theFBOPtr == NULL)
-  {
-    return;
-  }
-  const OpenGl_FrameBuffer* aFrameBuffer = (const OpenGl_FrameBuffer* )theFBOPtr;
-  theWidth  = aFrameBuffer->GetVPSizeX(); // current viewport size
-  theHeight = aFrameBuffer->GetVPSizeY();
-  theWidthMax  = aFrameBuffer->GetSizeX(); // texture size
-  theHeightMax = aFrameBuffer->GetSizeY();
-}
-
-void OpenGl_GraphicDriver::FBOChangeViewport (const Graphic3d_CView& ,
-                                              Graphic3d_PtrFrameBuffer& theFBOPtr,
-                                              const Standard_Integer theWidth, const Standard_Integer theHeight)
-{
-  if (theFBOPtr == NULL)
-  {
-    return;
-  }
-  OpenGl_FrameBuffer* aFrameBuffer = (OpenGl_FrameBuffer* )theFBOPtr;
-  aFrameBuffer->ChangeViewport (theWidth, theHeight);
-}
-
-inline bool getDataFormat (const Image_PixMap& theData,
-                           GLenum&             thePixelFormat,
-                           GLenum&             theDataType)
-{
-  thePixelFormat = GL_RGB;
-  theDataType    = GL_UNSIGNED_BYTE;
-  switch (theData.Format())
-  {
-  #if !defined(GL_ES_VERSION_2_0)
-    case Image_PixMap::ImgGray:
-      thePixelFormat = GL_DEPTH_COMPONENT;
-      theDataType    = GL_UNSIGNED_BYTE;
-      return true;
-    case Image_PixMap::ImgGrayF:
-      thePixelFormat = GL_DEPTH_COMPONENT;
-      theDataType    = GL_FLOAT;
-      return true;
-    case Image_PixMap::ImgBGR:
-      thePixelFormat = GL_BGR;
-      theDataType    = GL_UNSIGNED_BYTE;
-      return true;
-    case Image_PixMap::ImgBGRA:
-    case Image_PixMap::ImgBGR32:
-      thePixelFormat = GL_BGRA;
-      theDataType    = GL_UNSIGNED_BYTE;
-      return true;
-    case Image_PixMap::ImgBGRF:
-      thePixelFormat = GL_BGR;
-      theDataType    = GL_FLOAT;
-      return true;
-    case Image_PixMap::ImgBGRAF:
-      thePixelFormat = GL_BGRA;
-      theDataType    = GL_FLOAT;
-      return true;
-  #else
-    case Image_PixMap::ImgGray:
-    case Image_PixMap::ImgGrayF:
-    case Image_PixMap::ImgBGR:
-    case Image_PixMap::ImgBGRA:
-    case Image_PixMap::ImgBGR32:
-    case Image_PixMap::ImgBGRF:
-    case Image_PixMap::ImgBGRAF:
-      return false;
-  #endif
-    case Image_PixMap::ImgRGB:
-      thePixelFormat = GL_RGB;
-      theDataType    = GL_UNSIGNED_BYTE;
-      return true;
-    case Image_PixMap::ImgRGBA:
-    case Image_PixMap::ImgRGB32:
-      thePixelFormat = GL_RGBA;
-      theDataType    = GL_UNSIGNED_BYTE;
-      return true;
-    case Image_PixMap::ImgRGBF:
-      thePixelFormat = GL_RGB;
-      theDataType    = GL_FLOAT;
-      return true;
-    case Image_PixMap::ImgRGBAF:
-      thePixelFormat = GL_RGBA;
-      theDataType    = GL_FLOAT;
-      return true;
-    case Image_PixMap::ImgAlpha:
-    case Image_PixMap::ImgAlphaF:
-      return false; // GL_ALPHA is no more supported in core context
-    case Image_PixMap::ImgUNKNOWN:
-      return false;
-  }
-  return false;
-}
-
-Standard_Boolean OpenGl_GraphicDriver::BufferDump (const Graphic3d_CView&      theCView,
-                                                   Image_PixMap&               theImage,
-                                                   const Graphic3d_BufferType& theBufferType)
-{
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  return (aCView != NULL) && aCView->WS->BufferDump ((OpenGl_FrameBuffer* )theCView.ptrFBO, theImage, theBufferType);
-}
-
-//! Compute aligned number greater or equal to specified one
-inline Standard_Size getAligned (const Standard_Size theNumber,
-                                 const Standard_Size theAlignment)
-{
-  return theNumber + theAlignment - 1 - (theNumber - 1) % theAlignment;
-}
-
-Standard_Boolean OpenGl_Workspace::BufferDump (OpenGl_FrameBuffer*         theFBOPtr,
-                                               Image_PixMap&               theImage,
-                                               const Graphic3d_BufferType& theBufferType)
-{
-  GLenum aFormat, aType;
-  if (theImage.IsEmpty()
-   || !getDataFormat (theImage, aFormat, aType)
-   || !Activate())
-  {
-    return Standard_False;
-  }
-#if !defined(GL_ES_VERSION_2_0)
-  GLint aReadBufferPrev = GL_BACK;
-  if (theBufferType == Graphic3d_BT_Depth
-   && aFormat != GL_DEPTH_COMPONENT)
-  {
-    return Standard_False;
-  }
-#endif
-
-  // bind FBO if used
-  if (theFBOPtr != NULL && theFBOPtr->IsValid())
-  {
-    theFBOPtr->BindBuffer (GetGlContext());
-  }
-  else
-  {
-  #if !defined(GL_ES_VERSION_2_0)
-    glGetIntegerv (GL_READ_BUFFER, &aReadBufferPrev);
-    GLint aDrawBufferPrev = GL_BACK;
-    glGetIntegerv (GL_DRAW_BUFFER, &aDrawBufferPrev);
-    glReadBuffer (aDrawBufferPrev);
-  #endif
-  }
-
-  // setup alignment
-  const GLint anAligment   = Min (GLint(theImage.MaxRowAligmentBytes()), 8); // limit to 8 bytes for OpenGL
-  glPixelStorei (GL_PACK_ALIGNMENT, anAligment);
-  bool isBatchCopy = !theImage.IsTopDown();
-
-  const GLint   anExtraBytes       = GLint(theImage.RowExtraBytes());
-  GLint         aPixelsWidth       = GLint(theImage.SizeRowBytes() / theImage.SizePixelBytes());
-  Standard_Size aSizeRowBytesEstim = getAligned (theImage.SizePixelBytes() * aPixelsWidth, anAligment);
-  if (anExtraBytes < anAligment)
-  {
-    aPixelsWidth = 0;
-  }
-  else if (aSizeRowBytesEstim != theImage.SizeRowBytes())
-  {
-    aPixelsWidth = 0;
-    isBatchCopy  = false;
-  }
-#if !defined(GL_ES_VERSION_2_0)
-  glPixelStorei (GL_PACK_ROW_LENGTH, aPixelsWidth);
-#else
-  if (aPixelsWidth != 0)
-  {
-    isBatchCopy = false;
-  }
-#endif
-
-  if (!isBatchCopy)
-  {
-    // copy row by row
-    for (Standard_Size aRow = 0; aRow < theImage.SizeY(); ++aRow)
-    {
-      // Image_PixMap rows indexation always starts from the upper corner
-      // while order in memory depends on the flag and processed by ChangeRow() method
-      glReadPixels (0, GLint(theImage.SizeY() - aRow - 1), GLsizei (theImage.SizeX()), 1, aFormat, aType, theImage.ChangeRow (aRow));
-    }
-  }
-  else
-  {
-    glReadPixels (0, 0, GLsizei (theImage.SizeX()), GLsizei (theImage.SizeY()), aFormat, aType, theImage.ChangeData());
-  }
-
-  glPixelStorei (GL_PACK_ALIGNMENT,  1);
-#if !defined(GL_ES_VERSION_2_0)
-  glPixelStorei (GL_PACK_ROW_LENGTH, 0);
-#endif
-
-  if (theFBOPtr != NULL && theFBOPtr->IsValid())
-  {
-    theFBOPtr->UnbindBuffer (GetGlContext());
-  }
-  else
-  {
-  #if !defined(GL_ES_VERSION_2_0)
-    glReadBuffer (aReadBufferPrev);
-  #endif
-  }
-  return Standard_True;
-}
-
-void OpenGl_GraphicDriver::RemoveView (const Graphic3d_CView& theCView)
-{
-  Handle(OpenGl_Context) aCtx   = GetSharedContext();
-  OpenGl_CView*          aCView = (OpenGl_CView* )theCView.ptrView;
-  if (aCView == NULL
-   || aCView->View.IsNull()
-   || aCView->WS.IsNull())
-  {
-    return;
-  }
-
-  Handle(OpenGl_View)      aView   = aCView->View;
-  Handle(OpenGl_Workspace) aWindow = aCView->WS;
-  if (!myMapOfWS  .Remove (aWindow)
-   || !myMapOfView.Remove (aView))
-  {
-    return;
-  }
-
-  if (aWindow->GetGlContext()->MakeCurrent())
-  {
-    aCtx = aWindow->GetGlContext();
-  }
-  else
-  {
-    // try to hijack another context if any
-    const Handle(OpenGl_Context)& anOtherCtx = GetSharedContext();
-    if (!anOtherCtx.IsNull()
-      && anOtherCtx != aWindow->GetGlContext())
-    {
-      aCtx = anOtherCtx;
-      aCtx->MakeCurrent();
-    }
-  }
-
-  aView->ReleaseGlResources (aCtx);
-  if (myMapOfWS.IsEmpty())
-  {
-    // The last view removed but some objects still present.
-    // Release GL resources now without object destruction.
-    for (NCollection_DataMap<Standard_Integer, OpenGl_Structure*>::Iterator aStructIt (myMapOfStructure);
-         aStructIt.More (); aStructIt.Next())
-    {
-      OpenGl_Structure* aStruct = aStructIt.ChangeValue();
-      aStruct->ReleaseGlResources (aCtx);
-    }
-    myDeviceLostFlag = !myMapOfStructure.IsEmpty();
-  }
-
-  delete aCView;
-  ((Graphic3d_CView *)&theCView)->ptrView = NULL;
-
-  aCtx.Nullify();
-  aView.Nullify();
-  aWindow.Nullify();
-}
-
-void OpenGl_GraphicDriver::SetLight (const Graphic3d_CView& ACView)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-    aCView->View->SetLights(ACView.Context);
-}
-
-void OpenGl_GraphicDriver::SetClipPlanes (const Graphic3d_CView& theCView)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView;
-  if (aCView)
-  {
-    aCView->View->SetClipPlanes (theCView.Context.ClipPlanes);
-  }
-}
-
-//=======================================================================
-//function : SetCamera
-//purpose  :
-//=======================================================================
-void OpenGl_GraphicDriver::SetCamera (const Graphic3d_CView& theCView)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView;
-  if (aCView)
-  {
-    aCView->View->SetCamera (theCView.Context.Camera);
-  }
-}
-
-void OpenGl_GraphicDriver::SetVisualisation (const Graphic3d_CView& ACView)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-  {
-    aCView->View->SetVisualisation(ACView.Context);
-  }
-}
-
-// =======================================================================
-// function : InvalidateBVHData
-// purpose  :
-// =======================================================================
-void OpenGl_GraphicDriver::InvalidateBVHData (Graphic3d_CView& theCView, const Standard_Integer theLayerId)
-{
-  OpenGl_CView *aCView = (OpenGl_CView *)theCView.ptrView;
-  if(aCView)
-  {
-    aCView->View->InvalidateBVHData (theLayerId);
-  }
-}
-
-Standard_Boolean OpenGl_GraphicDriver::View (Graphic3d_CView& theCView)
-{
-  Handle(OpenGl_Context) aShareCtx = GetSharedContext();
-  OpenGl_CView*          aCView = (OpenGl_CView* )theCView.ptrView;
-  if (aCView != NULL
-   && myMapOfView.Contains (aCView->View))
-  {
-    Handle(OpenGl_Workspace) anOldWS = aCView->WS;
-    Handle(OpenGl_Workspace) aWS     = new OpenGl_Workspace (this, theCView.DefWindow, theCView.GContext, myCaps, aShareCtx);
-    aCView->WS = aWS;
-    aWS->SetActiveView (aCView->View, theCView.ViewId);
-
-    myMapOfWS.Remove (anOldWS);
-    myMapOfWS.Add    (aWS);
-    return Standard_True;
-  }
-
-  Handle(OpenGl_Workspace) aWS       = new OpenGl_Workspace (this, theCView.DefWindow, theCView.GContext, myCaps, aShareCtx);
-  Handle(OpenGl_View)      aView     = new OpenGl_View (theCView.Context, &myStateCounter);
-  myMapOfWS  .Add (aWS);
-  myMapOfView.Add (aView);
-
-  aCView = new OpenGl_CView();
-  aCView->View = aView;
-  aCView->WS   = aWS;
-  theCView.ptrView = aCView;
-  aWS->SetActiveView (aCView->View, theCView.ViewId);
-
-  return Standard_True;
-}
-
-void OpenGl_GraphicDriver::SetBackFacingModel (const Graphic3d_CView& ACView)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-    aCView->View->SetBackfacing(ACView.Backfacing);
-}
-
-//=======================================================================
-//function : AddZLayer
-//purpose  :
-//=======================================================================
-
-void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_CView&   theCView,
-                                      const Graphic3d_ZLayerId theLayerId)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView;
-  if (aCView)
-    aCView->View->AddZLayer (theLayerId);
-}
-
-//=======================================================================
-//function : RemoveZLayer
-//purpose  :
-//=======================================================================
-void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView&   theCView,
-                                         const Graphic3d_ZLayerId theLayerId)
-{
-  const OpenGl_CView* aCView = (const OpenGl_CView *)theCView.ptrView;
-  if (aCView)
-    aCView->View->RemoveZLayer (theLayerId);
-}
-
-//=======================================================================
-//function : SetZLayerSettings
-//purpose  :
-//=======================================================================
-Standard_EXPORT void OpenGl_GraphicDriver::SetZLayerSettings (const Graphic3d_CView&          theCView,
-                                                              const Graphic3d_ZLayerId        theLayerId,
-                                                              const Graphic3d_ZLayerSettings& theSettings)
-{
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
-  if (aCView)
-    aCView->View->SetZLayerSettings (theLayerId, theSettings);
-}
diff --git a/src/OpenGl/OpenGl_GraphicDriver_713.cxx b/src/OpenGl/OpenGl_GraphicDriver_713.cxx
deleted file mode 100644 (file)
index c9d86da..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-// Created on: 2011-10-20
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#include <OpenGl_GraphicDriver.hxx>
-
-#include <OpenGl_Group.hxx>
-#include <OpenGl_PrimitiveArray.hxx>
-
-#include <OpenGl_CView.hxx>
-
-void OpenGl_GraphicDriver::ReadDepths( const Graphic3d_CView& ACView,
-                                      const Standard_Integer x,
-                                      const Standard_Integer y,
-                                      const Standard_Integer width,
-                                      const Standard_Integer height,
-                                      const Standard_Address buffer ) const
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-    aCView->WS->ReadDepths(x, y, width, height, (float*) buffer);
-}
-
-void OpenGl_GraphicDriver::SetGLLightEnabled( const Graphic3d_CView& ACView, const Standard_Boolean isEnabled ) const
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-    aCView->WS->UseGLLight() = isEnabled;
-}
-
-Standard_Boolean OpenGl_GraphicDriver::IsGLLightEnabled( const Graphic3d_CView& ACView ) const
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-    return aCView->WS->UseGLLight();
-  return Standard_False;
-}
diff --git a/src/OpenGl/OpenGl_GraphicDriver_Export.cxx b/src/OpenGl/OpenGl_GraphicDriver_Export.cxx
deleted file mode 100644 (file)
index 98e9727..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (c) 1999-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#include <OpenGl_GraphicDriver.hxx>
-#include <OpenGl_Context.hxx>
-#include <OpenGl_CView.hxx>
-
-#include <Standard_CLocaleSentry.hxx>
-
-#ifdef HAVE_GL2PS
-#include <gl2ps.h>
-#endif
-
-/************************************************************************/
-/* Print Methods                                                        */
-/************************************************************************/
-
-#ifdef HAVE_GL2PS
-Standard_Boolean OpenGl_GraphicDriver::Export (const Standard_CString theFileName,
-                                               const Graphic3d_ExportFormat theFormat,
-                                               const Graphic3d_SortType theSortType,
-                                               const Standard_Integer theWidth,
-                                               const Standard_Integer theHeight,
-                                               const Graphic3d_CView& theView,
-                                               const Standard_Real    /*thePrecision*/,
-                                               const Standard_Address /*theProgressBarFunc*/,
-                                               const Standard_Address /*theProgressObject*/)
-{
-  // gl2psBeginPage() will call OpenGL functions
-  // so we should activate correct GL context before redraw scene call
-  const OpenGl_CView* aCView = (const OpenGl_CView* )theView.ptrView;
-  if (aCView == NULL || !aCView->WS->GetGlContext()->MakeCurrent())
-  {
-    return Standard_False;
-  }
-
-  Standard_Integer aFormat = -1;
-  Standard_Integer aSortType = Graphic3d_ST_BSP_Tree;
-  switch (theFormat)
-  {
-    case Graphic3d_EF_PostScript:
-      aFormat = GL2PS_PS;
-      break;
-    case Graphic3d_EF_EnhPostScript:
-      aFormat = GL2PS_EPS;
-      break;
-    case Graphic3d_EF_TEX:
-      aFormat = GL2PS_TEX;
-      break;
-    case Graphic3d_EF_PDF:
-      aFormat = GL2PS_PDF;
-      break;
-    case Graphic3d_EF_SVG:
-      aFormat = GL2PS_SVG;
-      break;
-    case Graphic3d_EF_PGF:
-      aFormat = GL2PS_PGF;
-      break;
-    case Graphic3d_EF_EMF:
-      //aFormat = GL2PS_EMF;
-      aFormat = GL2PS_PGF + 1; // 6
-      break;
-    default:
-      // unsupported format
-      return Standard_False;
-  }
-
-  switch (theSortType)
-  {
-    case Graphic3d_ST_Simple:
-      aSortType = GL2PS_SIMPLE_SORT;
-      break;
-    case Graphic3d_ST_BSP_Tree:
-      aSortType = GL2PS_BSP_SORT;
-      break;
-  }
-
-  GLint aViewport[4];
-  aViewport[0] = 0;
-  aViewport[1] = 0;
-  aViewport[2] = theWidth;
-  aViewport[3] = theHeight;
-
-  GLint aBufferSize = 1024 * 1024;
-  GLint anErrCode = GL2PS_SUCCESS;
-
-  // gl2ps uses standard write functions and do not check locale
-  Standard_CLocaleSentry aLocaleSentry;
-
-  while (aBufferSize > 0)
-  {
-    // current patch for EMF support in gl2ps uses WinAPI functions to create file
-    FILE* aFileH = (theFormat != Graphic3d_EF_EMF) ? fopen (theFileName, "wb") : NULL;
-    anErrCode = gl2psBeginPage ("", "", aViewport, aFormat, aSortType,
-                    GL2PS_DRAW_BACKGROUND | GL2PS_OCCLUSION_CULL | GL2PS_BEST_ROOT/* | GL2PS_SIMPLE_LINE_OFFSET*/,
-                    GL_RGBA, 0, NULL,
-                    0, 0, 0, aBufferSize, aFileH, theFileName);
-    if (anErrCode != GL2PS_SUCCESS)
-    {
-      // initialization failed
-      if (aFileH != NULL)
-        fclose (aFileH);
-      break;
-    }
-    Redraw (theView);
-
-    anErrCode = gl2psEndPage();
-    if (aFileH != NULL)
-      fclose (aFileH);
-
-    if (anErrCode == GL2PS_OVERFLOW)
-      aBufferSize *= 2;
-    else
-      break;
-  }
-  return anErrCode == GL2PS_SUCCESS;
-}
-#else
-Standard_Boolean OpenGl_GraphicDriver::Export (const Standard_CString /*theFileName*/,
-                                               const Graphic3d_ExportFormat /*theFormat*/,
-                                               const Graphic3d_SortType /*theSortType*/,
-                                               const Standard_Integer /*theWidth*/,
-                                               const Standard_Integer /*theHeight*/,
-                                               const Graphic3d_CView& /*theView*/,
-                                               const Standard_Real    /*thePrecision*/,
-                                               const Standard_Address /*theProgressBarFunc*/,
-                                               const Standard_Address /*theProgressObject*/)
-{
-    return Standard_False;
-}
-#endif
index 162f2d4..3386835 100644 (file)
@@ -18,6 +18,7 @@
 #include <OpenGl_GraphicDriver.hxx>
 #include <OpenGl_Flipper.hxx>
 #include <OpenGl_PrimitiveArray.hxx>
+#include <OpenGl_SceneGeometry.hxx>
 #include <OpenGl_StencilTest.hxx>
 #include <OpenGl_Structure.hxx>
 #include <OpenGl_Text.hxx>
index 9f142bb..d902414 100644 (file)
@@ -135,7 +135,7 @@ void OpenGl_Layer::InvalidateBVHData()
 void OpenGl_Layer::renderAll (const Handle(OpenGl_Workspace)& theWorkspace) const
 {
   const Standard_Integer aNbPriorities = myArray.Length();
-  const Standard_Integer aViewId       = theWorkspace->ActiveViewId();
+  const Standard_Integer aViewId       = theWorkspace->View()->Identification();
   for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
   {
     const OpenGl_IndexedMapOfStructure& aStructures = myArray (aPriorityIter);
@@ -189,11 +189,11 @@ void OpenGl_Layer::renderTraverse (const Handle(OpenGl_Workspace)& theWorkspace)
     }
   }
 
-  OpenGl_BVHTreeSelector& aSelector = theWorkspace->ActiveView()->BVHTreeSelector();
+  OpenGl_BVHTreeSelector& aSelector = theWorkspace->View()->BVHTreeSelector();
   traverse (aSelector);
 
   const Standard_Integer aNbPriorities = myArray.Length();
-  const Standard_Integer aViewId       = theWorkspace->ActiveViewId();
+  const Standard_Integer aViewId       = theWorkspace->View()->Identification();
   for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
   {
     const OpenGl_IndexedMapOfStructure& aStructures = myArray (aPriorityIter);
index 6b1c11d..dfa89b5 100644 (file)
@@ -160,10 +160,9 @@ void OpenGl_LayerList::AddStructure (const OpenGl_Structure*  theStruct,
 //purpose  :
 //=======================================================================
 
-void OpenGl_LayerList::RemoveStructure (const Handle(Graphic3d_Structure)& theStructure)
+void OpenGl_LayerList::RemoveStructure (const OpenGl_Structure* theStructure)
 {
-  const OpenGl_Structure*  aStruct  = reinterpret_cast<const OpenGl_Structure* > (theStructure->CStructure().operator->());
-  const Graphic3d_ZLayerId aLayerId = aStruct->ZLayer();
+  const Graphic3d_ZLayerId aLayerId = theStructure->ZLayer();
 
   Standard_Integer aSeqPos = myLayers.Lower();
   myLayerIds.Find (aLayerId, aSeqPos);
@@ -174,7 +173,7 @@ void OpenGl_LayerList::RemoveStructure (const Handle(Graphic3d_Structure)& theSt
   // remove structure from associated list
   // if the structure is not found there,
   // scan through layers and remove it
-  if (aLayer.Remove (aStruct, aPriority))
+  if (aLayer.Remove (theStructure, aPriority))
   {
     --myNbStructures;
     if (aLayer.LayerSettings().IsImmediate)
@@ -182,7 +181,7 @@ void OpenGl_LayerList::RemoveStructure (const Handle(Graphic3d_Structure)& theSt
       --myImmediateNbStructures;
     }
 
-    if (aStruct->IsRaytracable())
+    if (theStructure->IsRaytracable())
     {
       ++myModificationState;
     }
@@ -200,7 +199,7 @@ void OpenGl_LayerList::RemoveStructure (const Handle(Graphic3d_Structure)& theSt
       continue;
     }
 
-    if (aLayerEx.Remove (aStruct, aPriority))
+    if (aLayerEx.Remove (theStructure, aPriority))
     {
       --myNbStructures;
       if (aLayerEx.LayerSettings().IsImmediate)
@@ -208,7 +207,7 @@ void OpenGl_LayerList::RemoveStructure (const Handle(Graphic3d_Structure)& theSt
         --myImmediateNbStructures;
       }
 
-      if (aStruct->IsRaytracable())
+      if (theStructure->IsRaytracable())
       {
         ++myModificationState;
       }
index 41efccd..ec05a3e 100644 (file)
@@ -63,7 +63,7 @@ public:
                      Standard_Boolean        isForChangePriority = Standard_False);
 
   //! Remove structure from structure list and return its previous priority
-  void RemoveStructure (const Handle(Graphic3d_Structure)& theStructure);
+  void RemoveStructure (const OpenGl_Structure* theStructure);
 
   //! Change structure z layer
   //! If the new layer is not presented, the structure will be displayed
index 2c392f6..99319d8 100644 (file)
 #define OpenGl_Light_Header
 
 #include <Graphic3d_CLight.hxx>
-#include <Visual3d_TypeOfLightSource.hxx>
 #include <NCollection_List.hxx>
 
 #define OpenGLMaxLights 8
 
-typedef Graphic3d_CLight               OpenGl_Light;
-typedef NCollection_List<OpenGl_Light> OpenGl_ListOfLight;
+typedef Graphic3d_CLight       OpenGl_Light;
+typedef Graphic3d_ListOfCLight OpenGl_ListOfLight;
+
+static inline OpenGl_ListOfLight& OpenGl_NoShadingLight()
+{
+  static OpenGl_ListOfLight aLights;
+  if (aLights.IsEmpty())
+  {
+    OpenGl_Light       aLight;
+    aLight.Type        = Graphic3d_TOLS_AMBIENT;
+    aLight.IsHeadlight = Standard_False;
+    aLight.Color.r()   = 1.;
+    aLight.Color.g()   = 1.;
+    aLight.Color.b()   = 1.;
+    aLights.Append (aLight);
+  }
+  return aLights;
+}
 
 #endif // OpenGl_Light_Header
similarity index 81%
rename from src/Visual3d/Visual3d_MapOfZLayerSettings.hxx
rename to src/OpenGl/OpenGl_MapOfZLayerSettings.hxx
index af99f59..09977a0 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#ifndef _Visual3d_MapOfZLayerSettings_HeaderFile
-#define _Visual3d_MapOfZLayerSettings_HeaderFile
+#ifndef _OpenGl_MapOfZLayerSettings_HeaderFile
+#define _OpenGl_MapOfZLayerSettings_HeaderFile
 
 #include <Standard_TypeDef.hxx>
 #include <NCollection_Map.hxx>
 #include <Graphic3d_ZLayerId.hxx>
 #include <Graphic3d_ZLayerSettings.hxx>
 
-typedef NCollection_DataMap<Graphic3d_ZLayerId, Graphic3d_ZLayerSettings> Visual3d_MapOfZLayerSettings;
+typedef NCollection_DataMap<Graphic3d_ZLayerId, Graphic3d_ZLayerSettings> OpenGl_MapOfZLayerSettings;
 
-#endif // _Visual3d_MapOfZLayerSettings_HeaderFile
+#endif // _OpenGl_MapOfZLayerSettings_HeaderFile
index b8cdeb0..d164819 100644 (file)
@@ -206,7 +206,7 @@ const char THE_FRAG_CLIP_PLANES[] =
 // purpose  : Creates new empty shader manager
 // =======================================================================
 OpenGl_ShaderManager::OpenGl_ShaderManager (OpenGl_Context* theContext)
-: myShadingModel (Visual3d_TOM_VERTEX),
+: myShadingModel (Graphic3d_TOSM_VERTEX),
   myContext  (theContext),
   myLastView (NULL)
 {
@@ -340,7 +340,7 @@ Standard_Boolean OpenGl_ShaderManager::IsEmpty() const
 // =======================================================================
 void OpenGl_ShaderManager::switchLightPrograms()
 {
-  TCollection_AsciiString aKey (myShadingModel == Visual3d_TOM_FRAGMENT ? "p_" : "g_");
+  TCollection_AsciiString aKey (myShadingModel == Graphic3d_TOSM_FRAGMENT ? "p_" : "g_");
   const OpenGl_ListOfLight* aLights = myLightSourceState.LightSources();
   if (aLights != NULL)
   {
@@ -348,15 +348,15 @@ void OpenGl_ShaderManager::switchLightPrograms()
     {
       switch (aLightIter.Value().Type)
       {
-        case Visual3d_TOLS_AMBIENT:
+        case Graphic3d_TOLS_AMBIENT:
           break; // skip ambient
-        case Visual3d_TOLS_DIRECTIONAL:
+        case Graphic3d_TOLS_DIRECTIONAL:
           aKey += "d";
           break;
-        case Visual3d_TOLS_POSITIONAL:
+        case Graphic3d_TOLS_POSITIONAL:
           aKey += "p";
           break;
-        case Visual3d_TOLS_SPOT:
+        case Graphic3d_TOLS_SPOT:
           aKey += "s";
           break;
       }
@@ -385,7 +385,7 @@ void OpenGl_ShaderManager::UpdateLightSourceStateTo (const OpenGl_ListOfLight* t
 // function : SetShadingModel
 // purpose  :
 // =======================================================================
-void OpenGl_ShaderManager::SetShadingModel (const Visual3d_TypeOfModel theModel)
+void OpenGl_ShaderManager::SetShadingModel (const Graphic3d_TypeOfShadingModel theModel)
 {
   myShadingModel = theModel;
   switchLightPrograms();
@@ -530,7 +530,7 @@ void OpenGl_ShaderManager::PushLightSourceState (const Handle(OpenGl_ShaderProgr
   for (OpenGl_ListOfLight::Iterator anIter (*myLightSourceState.LightSources()); anIter.More(); anIter.Next())
   {
     const OpenGl_Light& aLight = anIter.Value();
-    if (aLight.Type == Visual3d_TOLS_AMBIENT)
+    if (aLight.Type == Graphic3d_TOLS_AMBIENT)
     {
       anAmbient += aLight.Color;
       continue;
@@ -546,10 +546,10 @@ void OpenGl_ShaderManager::PushLightSourceState (const Handle(OpenGl_ShaderProgr
 
     OpenGl_ShaderLightParameters& aLightParams = aLightParamsArray[aLightsNb];
     aLightParams.Color    = aLight.Color;
-    aLightParams.Position = aLight.Type == Visual3d_TOLS_DIRECTIONAL
+    aLightParams.Position = aLight.Type == Graphic3d_TOLS_DIRECTIONAL
                          ? -aLight.Direction
                          :  aLight.Position;
-    if (aLight.Type == Visual3d_TOLS_SPOT)
+    if (aLight.Type == Graphic3d_TOLS_SPOT)
     {
       aLightParams.Direction = aLight.Direction;
     }
@@ -826,7 +826,7 @@ const OpenGl_SurfaceDetailState& OpenGl_ShaderManager::SurfaceDetailState() cons
 // function : UpdateSurfaceDetailStateTo
 // purpose  : Updates state of OCCT surface detail
 // =======================================================================
-void OpenGl_ShaderManager::UpdateSurfaceDetailStateTo (const Visual3d_TypeOfSurfaceDetail theDetail)
+void OpenGl_ShaderManager::UpdateSurfaceDetailStateTo (const Graphic3d_TypeOfSurfaceDetail theDetail)
 {
   mySurfaceDetailState.Set (theDetail);
   mySurfaceDetailState.Update();
@@ -1327,7 +1327,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad
 // =======================================================================
 TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting (const Standard_Boolean theHasVertColor)
 {
-  bool aLightsMap[Visual3d_TOLS_SPOT + 1] = { false, false, false, false };
+  bool aLightsMap[Graphic3d_TOLS_SPOT + 1] = { false, false, false, false };
   TCollection_AsciiString aLightsFunc, aLightsLoop;
   const OpenGl_ListOfLight* aLights = myLightSourceState.LightSources();
   if (aLights != NULL)
@@ -1337,16 +1337,16 @@ TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting (const Standard
     {
       switch (aLightIter.Value().Type)
       {
-        case Visual3d_TOLS_AMBIENT:
+        case Graphic3d_TOLS_AMBIENT:
           --anIndex;
           break; // skip ambient
-        case Visual3d_TOLS_DIRECTIONAL:
+        case Graphic3d_TOLS_DIRECTIONAL:
           aLightsLoop = aLightsLoop + EOL"    directionalLight (" + anIndex + ", theNormal, theView, theIsFront);";
           break;
-        case Visual3d_TOLS_POSITIONAL:
+        case Graphic3d_TOLS_POSITIONAL:
           aLightsLoop = aLightsLoop + EOL"    pointLight (" + anIndex + ", theNormal, theView, aPoint, theIsFront);";
           break;
-        case Visual3d_TOLS_SPOT:
+        case Graphic3d_TOLS_SPOT:
           aLightsLoop = aLightsLoop + EOL"    spotLight (" + anIndex + ", theNormal, theView, aPoint, theIsFront);";
           break;
       }
@@ -1360,10 +1360,10 @@ TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting (const Standard
       aTypeBit = true;
       switch (aLightIter.Value().Type)
       {
-        case Visual3d_TOLS_AMBIENT:     break;
-        case Visual3d_TOLS_DIRECTIONAL: aLightsFunc += THE_FUNC_directionalLight; break;
-        case Visual3d_TOLS_POSITIONAL:  aLightsFunc += THE_FUNC_pointLight;       break;
-        case Visual3d_TOLS_SPOT:        aLightsFunc += THE_FUNC_spotLight;        break;
+        case Graphic3d_TOLS_AMBIENT:     break;
+        case Graphic3d_TOLS_DIRECTIONAL: aLightsFunc += THE_FUNC_directionalLight; break;
+        case Graphic3d_TOLS_POSITIONAL:  aLightsFunc += THE_FUNC_pointLight;       break;
+        case Graphic3d_TOLS_SPOT:        aLightsFunc += THE_FUNC_spotLight;        break;
       }
     }
   }
index f9abcf7..f5e4d30 100644 (file)
@@ -18,6 +18,8 @@
 
 #include <Graphic3d_ShaderProgram.hxx>
 #include <Graphic3d_StereoMode.hxx>
+#include <Graphic3d_TypeOfShadingModel.hxx>
+#include <Graphic3d_TypeOfSurfaceDetail.hxx>
 
 #include <NCollection_DataMap.hxx>
 #include <NCollection_Sequence.hxx>
@@ -29,7 +31,7 @@
 #include <OpenGl_AspectText.hxx>
 #include <OpenGl_AspectMarker.hxx>
 #include <OpenGl_Texture.hxx>
-#include <Visual3d_TypeOfModel.hxx>
+
 
 class OpenGl_View;
 
@@ -257,7 +259,7 @@ public:
   Standard_EXPORT const OpenGl_SurfaceDetailState& SurfaceDetailState() const;
 
   //! Updates state of OCCT surface detail.
-  Standard_EXPORT void UpdateSurfaceDetailStateTo (const Visual3d_TypeOfSurfaceDetail theDetail);
+  Standard_EXPORT void UpdateSurfaceDetailStateTo (const Graphic3d_TypeOfSurfaceDetail theDetail);
 
 public:
 
@@ -272,8 +274,14 @@ public:
     myContext = theCtx;
   }
 
+  //! Returns true when provided context is the same as used one by shader manager.
+  bool IsSameContext (OpenGl_Context* theCtx) const
+  {
+    return myContext == theCtx;
+  }
+
   //! Sets shading model.
-  Standard_EXPORT void SetShadingModel(const Visual3d_TypeOfModel theModel);
+  Standard_EXPORT void SetShadingModel (const Graphic3d_TypeOfShadingModel theModel);
 
   //! Sets last view manger used with.
   //! Helps to handle matrix states in multi-view configurations.
@@ -301,7 +309,7 @@ protected:
     {
       aBits |= OpenGl_PO_ClipPlanes;
     }
-    if (theEnableEnvMap && mySurfaceDetailState.Detail() == Visual3d_TOD_ENVIRONMENT)
+    if (theEnableEnvMap && mySurfaceDetailState.Detail() == Graphic3d_TOD_ENVIRONMENT)
     {
       // Environment map overwrites material texture
       aBits |= OpenGl_PO_TextureEnv;
@@ -355,7 +363,7 @@ protected:
   Standard_Boolean prepareStdProgramLight (Handle(OpenGl_ShaderProgram)& theProgram,
                                            const Standard_Integer        theBits)
   {
-    return myShadingModel == Visual3d_TOM_FRAGMENT
+    return myShadingModel == Graphic3d_TOSM_FRAGMENT
          ? prepareStdProgramPhong   (theProgram, theBits)
          : prepareStdProgramGouraud (theProgram, theBits);
   }
@@ -385,7 +393,7 @@ protected:
 
 protected:
 
-  Visual3d_TypeOfModel               myShadingModel;       //!< lighting shading model
+  Graphic3d_TypeOfShadingModel       myShadingModel;       //!< lighting shading model
   OpenGl_ShaderProgramList           myProgramList;        //!< The list of shader programs
   Handle(OpenGl_SetOfShaderPrograms) myLightPrograms;      //!< pointer to active lighting programs matrix
   OpenGl_SetOfShaderPrograms         myFlatPrograms;       //!< programs matrix without  lighting
index 12e390f..4f8dae0 100755 (executable)
 #ifndef _OpenGl_State_HeaderFile
 #define _OpenGl_State_HeaderFile
 
+#include <Graphic3d_TypeOfSurfaceDetail.hxx>
 #include <InterfaceGraphic_tgl_all.hxx>
 #include <NCollection_List.hxx>
 #include <OpenGl_Element.hxx>
 #include <OpenGl_Light.hxx>
 #include <OpenGl_Vec.hxx>
-#include <Visual3d_TypeOfSurfaceDetail.hxx>
 
 //! Defines interface for OpenGL state.
 class OpenGl_StateInterface
@@ -189,21 +189,21 @@ class OpenGl_SurfaceDetailState : public OpenGl_StateInterface
 public:
 
   //! Creates new surface detail state.
-  OpenGl_SurfaceDetailState (const Visual3d_TypeOfSurfaceDetail theDetail = Visual3d_TOD_NONE)
+  OpenGl_SurfaceDetailState (const Graphic3d_TypeOfSurfaceDetail theDetail = Graphic3d_TOD_NONE)
   : myDetail (theDetail)
   {
     //
   }
 
   //! Sets new surface detail.
-  void Set (const Visual3d_TypeOfSurfaceDetail theDetail) { myDetail = theDetail; }
+  void Set (const Graphic3d_TypeOfSurfaceDetail theDetail) { myDetail = theDetail; }
 
   //! Returns surface detail.
-  const Visual3d_TypeOfSurfaceDetail Detail() const { return myDetail; }
+  const Graphic3d_TypeOfSurfaceDetail Detail() const { return myDetail; }
 
 private:
 
-  Visual3d_TypeOfSurfaceDetail myDetail; //!< OCCT surface detail
+  Graphic3d_TypeOfSurfaceDetail myDetail; //!< OCCT surface detail
 
 };
 
index 61462c7..babd557 100644 (file)
@@ -416,7 +416,7 @@ void OpenGl_Text::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
       aTextAspect, aTextAspect->ShaderProgramRes (aCtx));
   }
 
-  myOrientationMatrix = theWorkspace->ActiveView()->Camera()->OrientationMatrix();
+  myOrientationMatrix = theWorkspace->View()->Camera()->OrientationMatrix();
   myProjMatrix.Convert (aCtx->ProjectionState.Current());
 
   // use highlight color or colors from aspect
index 60f34bd..e25d821 100644 (file)
@@ -40,7 +40,7 @@ namespace
 void OpenGl_Trihedron::resetTransformations (const Handle(OpenGl_Workspace)& theWorkspace) const
 {
   const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext();
-  const Handle(OpenGl_View)& aView    = theWorkspace->ActiveView();
+  const OpenGl_View*            aView    = theWorkspace->View();
   GLdouble anU = 1.0;
   GLdouble aV = 1.0;
   if (aView->Height() < aView->Width())
index 0bdf1d5..934d903 100755 (executable)
@@ -74,7 +74,7 @@ public:
 
 protected:
 
-  //! Invalidate Primitve Arrays.
+  //! Invalidate Primitive Arrays.
   void invalidate();
 
   void redraw(const Handle(OpenGl_Workspace)& theWorkspace) const;
index f7f155a..b2f76c5 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#include <NCollection_Mat4.hxx>
+#include <OpenGl_View.hxx>
 
+#include <Aspect_GraphicCallbackProc.hxx>
+#include <Aspect_RenderingContext.hxx>
+#include <Aspect_Window.hxx>
+#include <Graphic3d_AspectFillArea3d.hxx>
+#include <Graphic3d_Texture2Dmanual.hxx>
+#include <Graphic3d_TextureEnv.hxx>
+#include <Graphic3d_Mat4d.hxx>
+#include <NCollection_Mat4.hxx>
 #include <OpenGl_Context.hxx>
+#include <OpenGl_FrameBuffer.hxx>
 #include <OpenGl_GlCore11.hxx>
 #include <OpenGl_GraduatedTrihedron.hxx>
 #include <OpenGl_GraphicDriver.hxx>
 #include <OpenGl_ShaderManager.hxx>
 #include <OpenGl_Texture.hxx>
 #include <OpenGl_Trihedron.hxx>
-#include <OpenGl_View.hxx>
+#include <OpenGl_Window.hxx>
 #include <OpenGl_Workspace.hxx>
+#include <Standard_CLocaleSentry.hxx>
 
-#include <Graphic3d_TextureEnv.hxx>
-#include <Graphic3d_Mat4d.hxx>
-
+#ifdef HAVE_GL2PS
+#include <gl2ps.h>
+#endif
 
 /*----------------------------------------------------------------------*/
 
 namespace
 {
-  static const OPENGL_ZCLIP myDefaultZClip = { { Standard_True, 0.F }, { Standard_True, 1.F } };
-  static const OPENGL_FOG myDefaultFog = { Standard_False, 0.F, 1.F, { { 0.F, 0.F, 0.F, 1.F } } };
+  static const OPENGL_ZCLIP myDefaultZClip = { { Standard_False, 0.F }, { Standard_False, 1.F } };
+  static const OPENGL_FOG   myDefaultFog   = { Standard_False, 0.F, 1.F, { { 0.F, 0.F, 0.F, 1.F } } };
+  static const TEL_COLOUR   myDefaultBg    = { { 0.F, 0.F, 0.F, 1.F } };
 }
 
-/*----------------------------------------------------------------------*/
-
-OpenGl_View::OpenGl_View (const CALL_DEF_VIEWCONTEXT &AContext,
-                          OpenGl_StateCounter*       theCounter)
-: mySurfaceDetail(Visual3d_TOD_ALL),
-  myBackfacing(0),
-  //shield_indicator = TOn,
-  //shield_colour = { { 0.F, 0.F, 0.F, 1.F } },
-  //border_indicator = TOff,
-  //border_colour = { { 0.F, 0.F, 0.F, 1.F } },
-  //active_status = TOn,
-  myZClip(myDefaultZClip),
-  myCamera(AContext.Camera),
-  myFog(myDefaultFog),
-  myToShowTrihedron (false),
-  myToShowGradTrihedron (false),
-  myVisualization(AContext.Visualization),
-  myShadingModel ((Visual3d_TypeOfModel )AContext.Model),
-  myAntiAliasing(Standard_False),
-  myWorldViewProjState(),
-  myStateCounter (theCounter),
+// =======================================================================
+// function : Constructor
+// purpose  :
+// =======================================================================
+OpenGl_View::OpenGl_View (const Handle(Graphic3d_StructureManager)& theMgr,
+                          const Handle(OpenGl_GraphicDriver)& theDriver,
+                          const Handle(OpenGl_Caps)& theCaps,
+                          Standard_Boolean& theDeviceLostFlag,
+                          OpenGl_StateCounter* theCounter)
+: Graphic3d_CView  (theMgr),
+  myDriver         (theDriver.operator->()),
+  myCaps           (theCaps),
+  myDeviceLostFlag (theDeviceLostFlag),
+  myWasRedrawnGL   (Standard_False),
+  myAntiAliasing   (Standard_False),
+  myCulling        (Standard_True),
+  myShadingModel   (Graphic3d_TOSM_FACET),
+  mySurfaceDetail  (Graphic3d_TOD_ALL),
+  myBackfacing     (Graphic3d_TOBM_AUTOMATIC),
+  myBgColor        (myDefaultBg),
+  myFog            (myDefaultFog),
+  myZClip          (myDefaultZClip),
+  myCamera         (new Graphic3d_Camera()),
+  myFBO            (NULL),
+  myUseGLLight     (Standard_True),
+  myToShowTrihedron      (false),
+  myToShowGradTrihedron  (false),
+  myStateCounter         (theCounter),
   myLastLightSourceState (0, 0),
+  myFrameCounter         (0),
+  myHasFboBlit           (Standard_True),
+  myTransientDrawToFront (Standard_True),
+  myBackBufferRestored   (Standard_False),
+  myIsImmediateDrawn     (Standard_False),
   myTextureParams   (new OpenGl_AspectFace()),
   myBgGradientArray (new OpenGl_BackgroundArray (Graphic3d_TOB_GRADIENT)),
   myBgTextureArray  (new OpenGl_BackgroundArray (Graphic3d_TOB_TEXTURE)),
   // ray-tracing fields initialization
-  myRaytraceInitStatus (OpenGl_RT_NONE),
-  myIsRaytraceDataValid (Standard_False),
+  myRaytraceInitStatus     (OpenGl_RT_NONE),
+  myIsRaytraceDataValid    (Standard_False),
   myIsRaytraceWarnTextures (Standard_False),
   myToUpdateEnvironmentMap (Standard_False),
   myLayerListState (0)
 {
-  myCurrLightSourceState = myStateCounter->Increment();
-}
+  myWorkspace = new OpenGl_Workspace (this, NULL);
 
-/*----------------------------------------------------------------------*/
+  // AA mode
+  const char* anAaEnv = ::getenv ("CALL_OPENGL_ANTIALIASING_MODE");
+  if (anAaEnv != NULL)
+  {
+    int v;
+    if (sscanf (anAaEnv, "%d", &v) > 0) myAntiAliasing = v;
+  }
+
+  myCurrLightSourceState  = myStateCounter->Increment();
+  myMainSceneFbos[0]      = new OpenGl_FrameBuffer();
+  myMainSceneFbos[1]      = new OpenGl_FrameBuffer();
+  myImmediateSceneFbos[0] = new OpenGl_FrameBuffer();
+  myImmediateSceneFbos[1] = new OpenGl_FrameBuffer();
 
+  myDisplayCallback.Func = NULL;
+  myDisplayCallback.Data = NULL;
+}
+
+// =======================================================================
+// function : Destructor
+// purpose  :
+// =======================================================================
 OpenGl_View::~OpenGl_View()
 {
   ReleaseGlResources (NULL); // ensure ReleaseGlResources() was called within valid context
@@ -82,6 +124,10 @@ OpenGl_View::~OpenGl_View()
   OpenGl_Element::Destroy (NULL, myTextureParams);
 }
 
+// =======================================================================
+// function : ReleaseGlResources
+// purpose  :
+// =======================================================================
 void OpenGl_View::ReleaseGlResources (const Handle(OpenGl_Context)& theCtx)
 {
   myTrihedron         .Release (theCtx.operator->());
@@ -106,140 +152,595 @@ void OpenGl_View::ReleaseGlResources (const Handle(OpenGl_Context)& theCtx)
     myBgTextureArray->Release (theCtx.operator->());
   }
 
+  myMainSceneFbos[0]     ->Release (theCtx.operator->());
+  myMainSceneFbos[1]     ->Release (theCtx.operator->());
+  myImmediateSceneFbos[0]->Release (theCtx.operator->());
+  myImmediateSceneFbos[1]->Release (theCtx.operator->());
+  myFullScreenQuad        .Release (theCtx.operator->());
+  myFullScreenQuadFlip    .Release (theCtx.operator->());
+
   releaseRaytraceResources (theCtx);
 }
 
-void OpenGl_View::SetTextureEnv (const Handle(OpenGl_Context)&       theCtx,
-                                 const Handle(Graphic3d_TextureEnv)& theTexture)
+// =======================================================================
+// function : Remove
+// purpose  :
+// =======================================================================
+void OpenGl_View::Remove()
 {
-  if (!myTextureEnv.IsNull())
+  if (IsRemoved())
   {
-    theCtx->DelayedRelease (myTextureEnv);
-    myTextureEnv.Nullify();
+    return;
   }
 
-  if (theTexture.IsNull())
+  myDriver->RemoveView (this);
+  myWindow.Nullify();
+
+  Graphic3d_CView::Remove();
+}
+
+// =======================================================================
+// function : SetTextureEnv
+// purpose  :
+// =======================================================================
+void OpenGl_View::SetTextureEnv (const Handle(Graphic3d_TextureEnv)& theTextureEnv)
+{
+  Handle(OpenGl_Context) aCtx = myWorkspace->GetGlContext();
+  if (!aCtx.IsNull() && !myTextureEnv.IsNull())
+  {
+    aCtx->DelayedRelease (myTextureEnv);
+  }
+
+  myToUpdateEnvironmentMap = Standard_True;
+  myTextureEnvData = theTextureEnv;
+  myTextureEnv.Nullify();
+  initTextureEnv (aCtx);
+}
+
+// =======================================================================
+// function : initTextureEnv
+// purpose  :
+// =======================================================================
+void OpenGl_View::initTextureEnv (const Handle(OpenGl_Context)& theContext)
+{
+  if (myTextureEnvData.IsNull()
+    ||  theContext.IsNull()
+    || !theContext->MakeCurrent())
   {
     return;
   }
 
-  myTextureEnv = new OpenGl_Texture (theTexture->GetParams());
-  Handle(Image_PixMap) anImage = theTexture->GetImage();
+  myTextureEnv = new OpenGl_Texture (myTextureEnvData->GetParams());
+  Handle(Image_PixMap) anImage = myTextureEnvData->GetImage();
   if (!anImage.IsNull())
-    myTextureEnv->Init (theCtx, *anImage.operator->(), theTexture->Type());
+  {
+    myTextureEnv->Init (theContext, *anImage.operator->(), myTextureEnvData->Type());
+  }
+}
 
-  myToUpdateEnvironmentMap = Standard_True;
+// =======================================================================
+// function : SetImmediateModeDrawToFront
+// purpose  :
+// =======================================================================
+Standard_Boolean OpenGl_View::SetImmediateModeDrawToFront (const Standard_Boolean theDrawToFrontBuffer)
+{
+  const Standard_Boolean aPrevMode = myTransientDrawToFront;
+  myTransientDrawToFront = theDrawToFrontBuffer;
+  return aPrevMode;
 }
 
-void OpenGl_View::SetSurfaceDetail (const Visual3d_TypeOfSurfaceDetail theMode)
+// =======================================================================
+// function : SetWindow
+// purpose  :
+// =======================================================================
+void OpenGl_View::SetWindow (const Handle(Aspect_Window)& theWindow,
+                             const Aspect_RenderingContext theContext,
+                             const Aspect_GraphicCallbackProc& theDisplayCB,
+                             const Standard_Address theClientData)
 {
-  mySurfaceDetail = theMode;
+  myWindow = myDriver->CreateRenderWindow (theWindow, theContext);
+  Standard_ASSERT_RAISE (!myWindow.IsNull(),
+                         "OpenGl_View::SetWindow, "
+                         "Failed to create OpenGl window.");
 
+  myDisplayCallback.Func = theDisplayCB;
+  myDisplayCallback.Data = theClientData;
+
+  myWorkspace = new OpenGl_Workspace (this, myWindow);
+  myWorldViewProjState.Reset();
   myToUpdateEnvironmentMap = Standard_True;
+  myHasFboBlit = Standard_True;
+  Invalidate();
+
+  // Environment texture resource does not support lazy initialization.
+  initTextureEnv (myWorkspace->GetGlContext());
+}
+
+// =======================================================================
+// function : Resized
+// purpose  :
+// =======================================================================
+void OpenGl_View::Resized()
+{
+  if (myWindow.IsNull())
+    return;
+
+  myWindow->Resize();
+}
+
+// =======================================================================
+// function : TriedronDisplay
+// purpose  :
+// =======================================================================
+void OpenGl_View::TriedronDisplay (const Aspect_TypeOfTriedronPosition thePosition,
+                                   const Quantity_NameOfColor          theColor,
+                                   const Standard_Real                 theScale,
+                                   const Standard_Boolean              theAsWireframe)
+{
+  myToShowTrihedron = true;
+  myTrihedron.SetWireframe   (theAsWireframe);
+  myTrihedron.SetPosition    (thePosition);
+  myTrihedron.SetScale       (theScale);
+  myTrihedron.SetLabelsColor (theColor);
 }
 
 // =======================================================================
-// function : SetBackfacing
+// function : TriedronErase
 // purpose  :
 // =======================================================================
-void OpenGl_View::SetBackfacing (const Standard_Integer theMode)
+void OpenGl_View::TriedronErase()
 {
-  myBackfacing = theMode;
+  myToShowTrihedron = false;
+  myTrihedron.Release (myWorkspace->GetGlContext().operator->());
+}
+
+// =======================================================================
+// function : ZBufferTriedronSetup
+// purpose  :
+// =======================================================================
+void OpenGl_View::ZBufferTriedronSetup (const Quantity_NameOfColor theXColor,
+                                        const Quantity_NameOfColor theYColor,
+                                        const Quantity_NameOfColor theZColor,
+                                        const Standard_Real theSizeRatio,
+                                        const Standard_Real theAxisDiametr,
+                                        const Standard_Integer theNbFacettes)
+{
+  myTrihedron.SetArrowsColors  (theXColor, theYColor, theZColor);
+  myTrihedron.SetSizeRatio     (theSizeRatio);
+  myTrihedron.SetNbFacets      (theNbFacettes);
+  myTrihedron.SetArrowDiameter (theAxisDiametr);
 }
 
 // =======================================================================
-// function : SetLights
+// function : TriedronEcho
 // purpose  :
 // =======================================================================
-void OpenGl_View::SetLights (const CALL_DEF_VIEWCONTEXT& theViewCtx)
+void OpenGl_View::TriedronEcho (const Aspect_TypeOfTriedronEcho /*theType*/)
 {
-  myLights.Clear();
-  for (Standard_Integer aLightIt = 0; aLightIt < theViewCtx.NbActiveLight; ++aLightIt)
+  // do nothing
+}
+
+// =======================================================================
+// function : SetMinMaxValuesCallback
+// purpose  :
+// =======================================================================
+static void SetMinMaxValuesCallback (Graphic3d_CView* theView)
+{
+  OpenGl_View* aView = dynamic_cast<OpenGl_View*>(theView);
+  if (aView == NULL)
+    return;
+
+  Bnd_Box aBox = theView->MinMaxValues();
+  if (!aBox.IsVoid())
   {
-    myLights.Append (theViewCtx.ActiveLight[aLightIt]);
+    gp_Pnt aMin = aBox.CornerMin();
+    gp_Pnt aMax = aBox.CornerMax();
+
+    Graphic3d_Vec3 aMinVec ((Standard_ShortReal )aMin.X(), (Standard_ShortReal )aMin.Y(), (Standard_ShortReal )aMin.Z());
+    Graphic3d_Vec3 aMaxVec ((Standard_ShortReal )aMax.X(), (Standard_ShortReal )aMax.Y(), (Standard_ShortReal )aMax.Z());
+    aView->GraduatedTrihedronMinMaxValues (aMinVec, aMaxVec);
   }
-  myCurrLightSourceState = myStateCounter->Increment();
 }
 
-/*----------------------------------------------------------------------*/
+// =======================================================================
+// function : GraduatedTrihedronDisplay
+// purpose  :
+// =======================================================================
+void OpenGl_View::GraduatedTrihedronDisplay (const Graphic3d_GraduatedTrihedron& theTrihedronData)
+{
+  myGTrihedronData = theTrihedronData;
+  myGTrihedronData.PtrView = this;
+  myGTrihedronData.CubicAxesCallback = SetMinMaxValuesCallback;
+  myGraduatedTrihedron.SetValues (myGTrihedronData);
+  myToShowGradTrihedron = true;
+}
 
-//call_togl_setvisualisation
-void OpenGl_View::SetVisualisation (const CALL_DEF_VIEWCONTEXT &AContext)
+// =======================================================================
+// function : GraduatedTrihedronErase
+// purpose  :
+// =======================================================================
+void OpenGl_View::GraduatedTrihedronErase()
 {
-  myVisualization = AContext.Visualization;
-  myShadingModel  = (Visual3d_TypeOfModel )AContext.Model;
+  myGTrihedronData.PtrView = NULL;
+  myGraduatedTrihedron.Release (myWorkspace->GetGlContext().operator->());
+  myToShowGradTrihedron = false;
 }
 
-/*----------------------------------------------------------------------*/
+// =======================================================================
+// function : GraduatedTrihedronMinMaxValues
+// purpose  :
+// =======================================================================
+void OpenGl_View::GraduatedTrihedronMinMaxValues (const Graphic3d_Vec3 theMin, const Graphic3d_Vec3 theMax)
+{
+  myGraduatedTrihedron.SetMinMax (theMin, theMax);
+}
 
-//call_togl_cliplimit
-void OpenGl_View::SetClipLimit (const Graphic3d_CView& theCView)
+// =======================================================================
+// function : ReadDepths
+// purpose  :
+// =======================================================================
+void OpenGl_View::ReadDepths (const Standard_Integer theX,
+                              const Standard_Integer theY,
+                              const Standard_Integer theWidth,
+                              const Standard_Integer theHeight,
+                              const Standard_Address theBuffer) const
 {
-  myZClip.Back.Limit = theCView.Context.ZClipBackPlane;
-  myZClip.Front.Limit = theCView.Context.ZClipFrontPlane;
+  if (myWindow.IsNull())
+    return;
 
-  myZClip.Back.IsOn  = (theCView.Context.BackZClipping  != 0);
-  myZClip.Front.IsOn = (theCView.Context.FrontZClipping != 0);
+  myWindow->ReadDepths (theX, theY, theWidth, theHeight, (float*)theBuffer);
 }
 
-/*----------------------------------------------------------------------*/
+// =======================================================================
+// function : BufferDump
+// purpose  :
+// =======================================================================
+Standard_Boolean OpenGl_View::BufferDump (Image_PixMap& theImage, const Graphic3d_BufferType& theBufferType)
+{
+  return myWorkspace->BufferDump (myFBO, theImage, theBufferType);
+}
+
+// =======================================================================
+// function : Background
+// purpose  :
+// =======================================================================
+Aspect_Background OpenGl_View::Background() const
+{
+  return Aspect_Background (Quantity_Color (myBgColor.rgb[0], myBgColor.rgb[1], myBgColor.rgb[2], Quantity_TOC_RGB));
+}
+
+// =======================================================================
+// function : SetBackground
+// purpose  :
+// =======================================================================
+void OpenGl_View::SetBackground (const Aspect_Background& theBackground)
+{
+  Quantity_Color aBgColor = theBackground.Color();
+  myBgColor.rgb[0] = static_cast<float> (aBgColor.Red());
+  myBgColor.rgb[1] = static_cast<float> (aBgColor.Green());
+  myBgColor.rgb[2] = static_cast<float> (aBgColor.Blue());
+  myFog.Color      = myBgColor;
+}
+
+// =======================================================================
+// function : GradientBackground
+// purpose  :
+// =======================================================================
+Aspect_GradientBackground OpenGl_View::GradientBackground() const
+{
+  Quantity_Color aColor1, aColor2;
+  aColor1.SetValues (myBgGradientArray->GradientColor (0).r(),
+                     myBgGradientArray->GradientColor (0).g(),
+                     myBgGradientArray->GradientColor (0).b(), Quantity_TOC_RGB);
+  aColor2.SetValues (myBgGradientArray->GradientColor (1).r(),
+                     myBgGradientArray->GradientColor (1).g(),
+                     myBgGradientArray->GradientColor (1).b(), Quantity_TOC_RGB);
+  return Aspect_GradientBackground (aColor1, aColor2, myBgGradientArray->GradientFillMethod());
+}
 
-void OpenGl_View::SetFog (const Graphic3d_CView& theCView,
-                          const Standard_Boolean theFlag)
+// =======================================================================
+// function : SetGradientBackground
+// purpose  :
+// =======================================================================
+void OpenGl_View::SetGradientBackground (const Aspect_GradientBackground& theBackground)
 {
-  if (!theFlag)
+  Quantity_Color aColor1, aColor2;
+  theBackground.Colors (aColor1, aColor2);
+  myBgGradientArray->SetGradientParameters (aColor1, aColor2, theBackground.BgGradientFillMethod());
+}
+
+// =======================================================================
+// function : SetBackgroundImage
+// purpose  :
+// =======================================================================
+void OpenGl_View::SetBackgroundImage (const TCollection_AsciiString& theFilePath)
+{
+  // Prepare aspect for texture storage
+  myBackgroundImagePath = theFilePath;
+  Handle(Graphic3d_AspectFillArea3d) anAspect = new Graphic3d_AspectFillArea3d();
+  Handle(Graphic3d_Texture2Dmanual) aTextureMap = new Graphic3d_Texture2Dmanual (TCollection_AsciiString (theFilePath));
+  aTextureMap->EnableRepeat();
+  aTextureMap->DisableModulate();
+  aTextureMap->GetParams()->SetGenMode (Graphic3d_TOTM_MANUAL,
+                                        Graphic3d_Vec4 (0.0f, 0.0f, 0.0f, 0.0f),
+                                        Graphic3d_Vec4 (0.0f, 0.0f, 0.0f, 0.0f));
+  anAspect->SetTextureMap (aTextureMap);
+  anAspect->SetInteriorStyle (Aspect_IS_SOLID);
+  // Enable texture mapping
+  if (aTextureMap->IsDone())
   {
-    myFog.IsOn = Standard_False;
+    anAspect->SetTextureMapOn();
   }
   else
   {
-    myFog.IsOn = Standard_True;
+    anAspect->SetTextureMapOff();
+    return;
+  }
 
-    myFog.Front = theCView.Context.DepthFrontPlane;
-    myFog.Back = theCView.Context.DepthBackPlane;
+  // Set texture parameters
+  myTextureParams->SetAspect (anAspect);
+}
 
-    myFog.Color.rgb[0] = theCView.DefWindow.Background.r;
-    myFog.Color.rgb[1] = theCView.DefWindow.Background.g;
-    myFog.Color.rgb[2] = theCView.DefWindow.Background.b;
-    myFog.Color.rgb[3] = 1.0f;
-  }
+// =======================================================================
+// function : BackgroundImageStyle
+// purpose  :
+// =======================================================================
+Aspect_FillMethod OpenGl_View::BackgroundImageStyle() const
+{
+  return myBgTextureArray->TextureFillMethod();
 }
 
-/*----------------------------------------------------------------------*/
+// =======================================================================
+// function : SetBackgroundImageStyle
+// purpose  :
+// =======================================================================
+void OpenGl_View::SetBackgroundImageStyle (const Aspect_FillMethod theFillStyle)
+{
+  myBgTextureArray->SetTextureFillMethod (theFillStyle);
+}
 
-void OpenGl_View::TriedronDisplay (const Aspect_TypeOfTriedronPosition thePosition,
-                                   const Quantity_NameOfColor          theColor,
-                                   const Standard_Real                 theScale,
-                                   const Standard_Boolean              theAsWireframe)
+//=======================================================================
+//function : AddZLayer
+//purpose  :
+//=======================================================================
+void OpenGl_View::AddZLayer (const Graphic3d_ZLayerId theLayerId)
 {
-  myToShowTrihedron = true;
-  myTrihedron.SetWireframe   (theAsWireframe);
-  myTrihedron.SetPosition    (thePosition);
-  myTrihedron.SetScale       (theScale);
-  myTrihedron.SetLabelsColor (theColor);
+  myZLayers.AddLayer (theLayerId);
 }
 
-/*----------------------------------------------------------------------*/
+//=======================================================================
+//function : RemoveZLayer
+//purpose  :
+//=======================================================================
+void OpenGl_View::RemoveZLayer (const Graphic3d_ZLayerId theLayerId)
+{
+  myZLayers.RemoveLayer (theLayerId);
+}
 
-void OpenGl_View::TriedronErase (const Handle(OpenGl_Context)& theCtx)
+//=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+void OpenGl_View::SetZLayerSettings (const Graphic3d_ZLayerId        theLayerId,
+                                     const Graphic3d_ZLayerSettings& theSettings)
 {
-  myToShowTrihedron = false;
-  myTrihedron.Release (theCtx.operator->());
+  myZLayers.SetLayerSettings (theLayerId, theSettings);
 }
 
-/*----------------------------------------------------------------------*/
+//=======================================================================
+//function : FBO
+//purpose  :
+//=======================================================================
+Graphic3d_PtrFrameBuffer OpenGl_View::FBO() const
+{
+  return reinterpret_cast<Graphic3d_PtrFrameBuffer> (myFBO);
+}
 
-void OpenGl_View::GraduatedTrihedronDisplay (const Handle(OpenGl_Context)&       theCtx,
-                                             const Graphic3d_GraduatedTrihedron& theData)
+//=======================================================================
+//function : SetFBO
+//purpose  :
+//=======================================================================
+void OpenGl_View::SetFBO (const Graphic3d_PtrFrameBuffer theFBO)
 {
-  myToShowGradTrihedron = true;
-  myGraduatedTrihedron.SetValues (theCtx, theData);
+  myFBO = reinterpret_cast<OpenGl_FrameBuffer*> (theFBO);
 }
 
-/*----------------------------------------------------------------------*/
+//=======================================================================
+//function : FBOCreate
+//purpose  :
+//=======================================================================
+Graphic3d_PtrFrameBuffer OpenGl_View::FBOCreate (const Standard_Integer theWidth,
+                                                 const Standard_Integer theHeight)
+{
+  return myWorkspace->FBOCreate (theWidth, theHeight);
+}
 
-void OpenGl_View::GraduatedTrihedronErase (const Handle(OpenGl_Context)& theCtx)
+//=======================================================================
+//function : FBORelease
+//purpose  :
+//=======================================================================
+void OpenGl_View::FBORelease (Graphic3d_PtrFrameBuffer& theFBOPtr)
 {
-  myToShowGradTrihedron = false;
-  myGraduatedTrihedron.Release (theCtx.operator->());
+  myWorkspace->FBORelease (theFBOPtr);
+}
+
+//=======================================================================
+//function : FBOGetDimensions
+//purpose  :
+//=======================================================================
+void OpenGl_View::FBOGetDimensions (const Graphic3d_PtrFrameBuffer theFBOPtr,
+                                    Standard_Integer& theWidth,
+                                    Standard_Integer& theHeight,
+                                    Standard_Integer& theWidthMax,
+                                    Standard_Integer& theHeightMax)
+{
+  const OpenGl_FrameBuffer* aFrameBuffer = (const OpenGl_FrameBuffer* )theFBOPtr;
+  theWidth     = aFrameBuffer->GetVPSizeX(); // current viewport size
+  theHeight    = aFrameBuffer->GetVPSizeY();
+  theWidthMax  = aFrameBuffer->GetSizeX(); // texture size
+  theHeightMax = aFrameBuffer->GetSizeY();
+}
+
+//=======================================================================
+//function : FBOChangeViewport
+//purpose  :
+//=======================================================================
+void OpenGl_View::FBOChangeViewport (Graphic3d_PtrFrameBuffer& theFBOPtr,
+                                     const Standard_Integer theWidth,
+                                     const Standard_Integer theHeight)
+{
+  OpenGl_FrameBuffer* aFrameBuffer = (OpenGl_FrameBuffer* )theFBOPtr;
+  aFrameBuffer->ChangeViewport (theWidth, theHeight);
+}
+
+// =======================================================================
+// function : Export
+// purpose  :
+// =======================================================================
+#ifdef HAVE_GL2PS
+Standard_Boolean OpenGl_View::Export (const Standard_CString theFileName,
+                                      const Graphic3d_ExportFormat theFormat,
+                                      const Graphic3d_SortType theSortType)
+{
+  // gl2psBeginPage() will call OpenGL functions
+  // so we should activate correct GL context before redraw scene call
+  if (!myWorkspa