+// Copyright (c) 1995-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.
/***********************************************************************
24-10-97 : CAL ; Retrait de DownCast.
20-11-97 : CAL ; Disparition de la dependance avec math
01-12-97 : CAL ; Retrait du test IsActive sur l'Update et le Redraw
- 31-12-97 : CAL ; Disparition de MathGra
+ 31-12-97 : CAL ; Disparition de MathGra
16-01-98 : CAL ; Ajout du SetTransform sur une TOS_COMPUTED
11-03-98 : CAL ; Visual3d_ViewManager::Remove ()
20-05-98 : CAL ; Perfs. Connection entre structures COMPUTED.
#include <Visual3d_PickPath.hxx>
#include <Visual3d_SetIteratorOfSetOfView.hxx>
-#ifndef WNT
-# include <Xw_Window.hxx>
-#else
+#if defined (_WIN32) || defined(__WIN32__)
# include <WNT_Window.hxx>
-#endif // WNT
+#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
+# include <Cocoa_Window.hxx>
+#else
+# include <Xw_Window.hxx>
+#endif
//-Aliases
//-Constructors
-Visual3d_ViewManager::Visual3d_ViewManager (const Handle(Aspect_GraphicDevice)& aDevice):
-Graphic3d_StructureManager (aDevice),
+Visual3d_ViewManager::Visual3d_ViewManager (const Handle(Graphic3d_GraphicDriver)& theDriver):
+Graphic3d_StructureManager (theDriver),
MyDefinedView (),
MyViewGenId (View_IDMIN+((View_IDMIN+View_IDMAX)/(Visual3d_ViewManager::Limit ()))*(Visual3d_ViewManager::CurrentId ()-1),View_IDMIN+((View_IDMIN+View_IDMAX)/(Visual3d_ViewManager::Limit ()))*Visual3d_ViewManager::CurrentId ()-1),
MyZBufferAuto (Standard_False),
myLayerIds.Add (0);
myLayerSeq.Append (0);
- Handle(Aspect_GraphicDriver) agd = aDevice->GraphicDriver ();
-
- MyGraphicDriver = *(Handle(Graphic3d_GraphicDriver) *) &agd;
+ MyGraphicDriver = theDriver;
}
//-Destructors
//
// Destroy all defined views
//
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
#ifdef DESTROY
cout << "The Manager " << MyId << " have " << Length << " defined views\n";
cout << flush;
#endif
-
- MyDefinedView.Clear ();
+ // clear all structures whilst views are alive for correct GPU memory management
+ MyDisplayedStructure.Clear();
+ MyHighlightedStructure.Clear();
+ MyPickStructure.Clear();
+
+ // clear list of managed views
+ MyDefinedView.Clear();
}
void Visual3d_ViewManager::ChangeDisplayPriority (const Handle(Graphic3d_Structure)& AStructure, const Standard_Integer OldPriority, const Standard_Integer NewPriority) {
//
// Change structure priority in all defined views
//
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
+
while (MyIterator.More ()) {
(MyIterator.Value ())->ChangeDisplayPriority
(AStructure, OldPriority, NewPriority);
}
-void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStructure) {
+void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStructure) {
//Standard_Integer LengthD = MyDisplayedStructure.Extent() ();
// Even if physically the structure cannot
// be displayed (pb of visualisation type)
// it has status Displayed.
-
+
if (!MyDisplayedStructure.Contains(AStructure))
return;
// Recompute structure in all activated views
//
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
+
while (MyIterator.More ()) {
(MyIterator.Value ())->ReCompute (AStructure);
// MyIterator.Next () is located on the next view
MyIterator.Next ();
}
-
+
}
-void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStructure,
- const Handle(Graphic3d_DataStructureManager)& AProjector)
-{
+void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStructure,
+ const Handle(Graphic3d_DataStructureManager)& AProjector)
+{
if (! AProjector->IsKind (STANDARD_TYPE (Visual3d_View))) return;
#endif
Standard_Integer ViewId = theView->Identification ();
- Standard_Integer indexD = 0;
-
// Even if physically the structure cannot
// be displayed (pb of visualisation type)
// it has status Displayed.
if (!MyDisplayedStructure.Contains(AStructure))
return;
-
+
//
// Recompute structure in all activated views
//
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
+
while (MyIterator.More ()) {
if ((MyIterator.Value ())->Identification () == ViewId)
theView->ReCompute (AStructure);
void Visual3d_ViewManager::Clear (const Handle(Graphic3d_Structure)& AStructure, const Standard_Boolean WithDestruction) {
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
+
while (MyIterator.More ()) {
(MyIterator.Value ())->Clear (AStructure, WithDestruction);
void Visual3d_ViewManager::Connect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter) {
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
+
while (MyIterator.More ()) {
(MyIterator.Value ())->Connect (AMother, ADaughter);
void Visual3d_ViewManager::Disconnect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter) {
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
+
while (MyIterator.More ()) {
(MyIterator.Value ())->Disconnect (AMother, ADaughter);
}
-void Visual3d_ViewManager::Display (const Handle(Graphic3d_Structure)& AStructure) {
+void Visual3d_ViewManager::Display (const Handle(Graphic3d_Structure)& AStructure) {
// Even if physically the structure cannot
// Display structure in all activated views
//
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
+
while (MyIterator.More ()) {
(MyIterator.Value ())->Display (AStructure);
//
// Erase structure in all defined views
//
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
+
while (MyIterator.More ()) {
(MyIterator.Value ())->Erase (AStructure);
}
MyHighlightedStructure.Remove (AStructure);
- MyVisibleStructure.Remove (AStructure);
MyPickStructure.Remove (AStructure);
}
void Visual3d_ViewManager::Erase () {
Graphic3d_MapIteratorOfMapOfStructure it( MyDisplayedStructure);
-
+
for (; it.More(); it.Next()) {
Handle(Graphic3d_Structure) SG = it.Key();
SG->Erase();
//
// Highlight in all activated views
//
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
+
while (MyIterator.More ()) {
(MyIterator.Value ())->Highlight (AStructure, AMethod);
void Visual3d_ViewManager::SetTransform (const Handle(Graphic3d_Structure)& AStructure, const TColStd_Array2OfReal& ATrsf) {
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
+
while (MyIterator.More ()) {
(MyIterator.Value ())->SetTransform (AStructure, ATrsf);
void Visual3d_ViewManager::UnHighlight () {
Graphic3d_MapIteratorOfMapOfStructure it(MyHighlightedStructure);
-
+
for (; it.More(); it.Next()) {
Handle(Graphic3d_Structure) SG = it.Key();
SG->UnHighlight ();
//
// UnHighlight in all activated views
//
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
+
while (MyIterator.More ()) {
(MyIterator.Value ())->UnHighlight (AStructure);
}
-void Visual3d_ViewManager::Redraw () const {
-
-Standard_Integer MaxDx, MaxDy;
-Standard_Integer Dx, Dy;
- MaxDx = MaxDy = IntegerFirst ();
-
- //
- // Redraw all activated views
- //
- Standard_Integer j = MyDefinedView.Extent ();
- if (j == 0) return;
- Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
- if (! MyUnderLayer.IsNull () || ! MyOverLayer.IsNull ()) {
- while (MyIterator.More ()) {
- (MyIterator.Value ())->Window ()->Size (Dx, Dy);
- if (Dx > MaxDx) MaxDx = Dx;
- if (Dy > MaxDy) MaxDy = Dy;
+void Visual3d_ViewManager::Redraw() const
+{
+ // redraw all activated views
+ if (MyDefinedView.Extent() == 0)
+ {
+ return;
+ }
- // MyIterator.Next () is located on the next view
- MyIterator.Next ();
- }
- if (! MyUnderLayer.IsNull ())
- MyUnderLayer->SetViewport (MaxDx, MaxDy);
- if (! MyOverLayer.IsNull ())
- MyOverLayer->SetViewport (MaxDx, MaxDy);
- }
-
- if (! MyUnderLayer.IsNull () || ! MyOverLayer.IsNull ())
- MyIterator.Initialize (MyDefinedView);
- while (MyIterator.More ()) {
- (MyIterator.Value ())->Redraw (MyUnderLayer, MyOverLayer);
+ if (!MyUnderLayer.IsNull() || !MyOverLayer.IsNull())
+ {
+ Standard_Integer aWidth = 0, aHeight = 0;
+ Standard_Integer aWidthMax = 0;
+ Standard_Integer aHeightMax = 0;
+ for (Visual3d_SetIteratorOfSetOfView anIter (MyDefinedView);
+ anIter.More(); anIter.Next())
+ {
+ anIter.Value()->Window()->Size (aWidth, aHeight);
+ aWidthMax = Max (aWidthMax, aWidth);
+ aHeightMax = Max (aHeightMax, aWidth);
+ }
+ if (!MyUnderLayer.IsNull())
+ {
+ MyUnderLayer->SetViewport (aWidthMax, aHeightMax);
+ }
+ if (!MyOverLayer.IsNull())
+ {
+ MyOverLayer->SetViewport (aWidthMax, aHeightMax);
+ }
+ }
- // MyIterator.Next () is located on the next view
- MyIterator.Next ();
+ for (Visual3d_SetIteratorOfSetOfView anIter (MyDefinedView);
+ anIter.More(); anIter.Next())
+ {
+ anIter.Value()->Redraw (MyUnderLayer, MyOverLayer);
}
+}
+void Visual3d_ViewManager::Update() const
+{
+ Redraw();
}
-void Visual3d_ViewManager::Update () const {
+void Visual3d_ViewManager::RedrawImmediate() const
+{
+ if (MyDefinedView.Extent() == 0)
+ {
+ return;
+ }
- //
- // Update all activated views
- //
- Standard_Integer j = MyDefinedView.Extent ();
- if (j == 0) return;
- Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
- while (MyIterator.More ()) {
- (MyIterator.Value ())->Update (MyUnderLayer, MyOverLayer);
+ // update all activated views
+ for (Visual3d_SetIteratorOfSetOfView anIter (MyDefinedView);
+ anIter.More(); anIter.Next())
+ {
+ anIter.Value()->RedrawImmediate (MyUnderLayer, MyOverLayer);
+ }
+}
- // MyIterator.Next () is located on the next view
- MyIterator.Next ();
- }
+void Visual3d_ViewManager::Invalidate() const
+{
+ if (MyDefinedView.Extent() == 0)
+ {
+ return;
+ }
+ // update all activated views
+ for (Visual3d_SetIteratorOfSetOfView anIter (MyDefinedView);
+ anIter.More(); anIter.Next())
+ {
+ anIter.Value()->Invalidate();
+ }
}
Handle(Visual3d_HSetOfView) Visual3d_ViewManager::ActivatedView () const {
Handle (Visual3d_HSetOfView) SG = new Visual3d_HSetOfView ();
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
while (MyIterator.More ()) {
}
-void Visual3d_ViewManager::ConvertCoord (const Handle(Aspect_Window)& AWindow, const Graphic3d_Vertex& AVertex, Standard_Integer& AU, Standard_Integer& AV) const {
-
-// Convert only if the data is correct
-Standard_Boolean Exist;
-Graphic3d_CView TheCView;
-//Graphic3d_Vertex Point;
-
-TColStd_Array2OfReal Ori_Matrix (0,3,0,3);
-TColStd_Array2OfReal Map_Matrix (0,3,0,3);
-
-Standard_Integer Width, Height;
-Standard_Real AX, AY, AZ;
-Standard_Real Dx, Dy, Ratio;
-
- Exist = ViewExists (AWindow, TheCView);
-
- if (! Exist) {
- AU = AV = IntegerLast ();
- }
- else {
- // NKV - 11.02.08 - Use graphic driver functions
- Standard_Boolean Result;
-
- AVertex.Coord (AX, AY, AZ);
-
- Result = MyGraphicDriver->ProjectRaster (TheCView,
- Standard_ShortReal (AX), Standard_ShortReal (AY), Standard_ShortReal (AZ),
- AU, AV);
-
- // the old code
- if (!Result) {
-
- Standard_Real PtX, PtY, PtZ, PtT;
- Standard_Real APX, APY, APZ;
- Standard_Real APT;
-
- Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
-
- Standard_Integer stop = 0;
-
- while ((! stop) && (MyIterator.More ())) {
- if (TheCView.ViewId ==
- (MyIterator.Value ())->Identification ()) {
- Ori_Matrix =
- (MyIterator.Value ())->MatrixOfOrientation ();
- Map_Matrix =
- (MyIterator.Value ())->MatrixOfMapping ();
- stop = 1;
- }
-
- // MyIterator.Next () is located on the next view
- MyIterator.Next ();
- }
-
-
- // WCS -> View Reference Coordinate Space
- PtX = Ori_Matrix (0, 0) * AX
- + Ori_Matrix (0, 1) * AY
- + Ori_Matrix (0, 2) * AZ
- + Ori_Matrix (0, 3);
- PtY = Ori_Matrix (1, 0) * AX
- + Ori_Matrix (1, 1) * AY
- + Ori_Matrix (1, 2) * AZ
- + Ori_Matrix (1, 3);
- PtZ = Ori_Matrix (2, 0) * AX
- + Ori_Matrix (2, 1) * AY
- + Ori_Matrix (2, 2) * AZ
- + Ori_Matrix (2, 3);
- PtT = Ori_Matrix (3, 0) * AX
- + Ori_Matrix (3, 1) * AY
- + Ori_Matrix (3, 2) * AZ
- + Ori_Matrix (3, 3);
-
- // VRCS -> Normalized Projection Coordinate Space
- APX = Map_Matrix (0, 0) * PtX
- + Map_Matrix (0, 1) * PtY
- + Map_Matrix (0, 2) * PtZ
- + Map_Matrix (0, 3) * PtT;
- APY = Map_Matrix (1, 0) * PtX
- + Map_Matrix (1, 1) * PtY
- + Map_Matrix (1, 2) * PtZ
- + Map_Matrix (1, 3) * PtT;
- APZ = Map_Matrix (2, 0) * PtX
- + Map_Matrix (2, 1) * PtY
- + Map_Matrix (2, 2) * PtZ
- + Map_Matrix (2, 3) * PtT;
- APT = Map_Matrix (3, 0) * PtX
- + Map_Matrix (3, 1) * PtY
- + Map_Matrix (3, 2) * PtZ
- + Map_Matrix (3, 3) * PtT;
-
- if (APT == 0. || stop == 0) {
- AU = AV = IntegerLast ();
- }
- else {
- APX /= APT;
- APY /= APT;
- APZ /= APT;
-
- // NPCS -> Device Coordinate Space
- AWindow->Size (Width, Height);
- Dx = Standard_Real (Width);
- Dy = Standard_Real (Height);
- Ratio = Dx / Dy;
- if (Ratio >= 1.) {
- AU = Standard_Integer (APX * Dx);
- AV = Standard_Integer (Dy - APY * Dy * Ratio);
- }
- else {
- AU = Standard_Integer (APX * Dx / Ratio);
- AV = Standard_Integer (Dy - APY * Dy);
- }
- }
- }
- }
-
-}
-
-Graphic3d_Vertex Visual3d_ViewManager::ConvertCoord (const Handle(Aspect_Window)& AWindow, const Standard_Integer AU, const Standard_Integer AV) const {
-
-// Convert only if the data is correct
-Graphic3d_CView TheCView;
-Graphic3d_Vertex Point;
-
- if (! ViewExists (AWindow, TheCView))
- Point.SetCoord (RealLast (), RealLast (), RealLast ());
- else {
-Standard_Integer Width, Height;
-Standard_ShortReal x, y, z;
-Standard_Boolean Result;
-
- AWindow->Size (Width, Height);
-
- Result = MyGraphicDriver->UnProjectRaster (TheCView,
- 0, 0, Width, Height,
- AU, AV, x, y, z);
-
- // unproject is done by UnProjectRaster
- if (Result) {
- Point.SetCoord
- (Standard_Real (x), Standard_Real (y), Standard_Real (z));
- }
- // unproject cannot be done by UnProjectRaster
- // Code suspended since drivers Phigs and Pex are abandoned.
- else {
-
-Standard_Real NPCX, NPCY, NPCZ;
-Standard_Real VRCX, VRCY, VRCZ, VRCT;
-Standard_Real WCX, WCY, WCZ, WCT;
-
-TColStd_Array2OfReal TOri_Matrix (0,3,0,3);
-TColStd_Array2OfReal TMap_Matrix (0,3,0,3);
-TColStd_Array2OfReal TOri_Matrix_Inv (0,3,0,3);
-TColStd_Array2OfReal TMap_Matrix_Inv (0,3,0,3);
-
-Standard_Real Dx, Dy, Ratio;
-Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-Standard_Integer j;
-
-Standard_Integer stop = 0;
-
-Standard_Boolean BResult;
-
- j = MyDefinedView.Extent ();
-
- while ((! stop) && (MyIterator.More ())) {
- if (TheCView.ViewId ==
- (MyIterator.Value ())->Identification ()) {
- TOri_Matrix =
- (MyIterator.Value ())->MatrixOfOrientation ();
- TMap_Matrix =
- (MyIterator.Value ())->MatrixOfMapping ();
- stop = 1;
- }
-
- // MyIterator.Next () is located on the next view
- MyIterator.Next ();
- }
-
- // View Mapping Transformation and View Clip, inversion
- BResult = Aspect::Inverse (TMap_Matrix, TMap_Matrix_Inv);
-
- // View Orientation Transformation, inversion
- BResult = Aspect::Inverse (TOri_Matrix, TOri_Matrix_Inv);
-
- // (AU, AV) : Device Coordinate Space
- // DCS -> NPCS Normalized Projection Coordinate Space
- Dx = Standard_Real (Width);
- Dy = Standard_Real (Height);
- Ratio = Dx / Dy;
-
- if (Ratio >= 1.) {
- NPCX = Standard_Real (AU) / Dx;
- NPCY = (Dy - Standard_Real (AV)) / Dx;
- }
- else {
- NPCX = Standard_Real (AU) / Dy;
- NPCY = (Dy - Standard_Real (AV)) / Dy;
- }
- NPCZ = 0.0;
-
- // NPCS -> VRCS View Reference Coordinate Space
- // PtVRC = Map_Matrix_Inv.Multiplied (PtNPC);
-
- VRCX = TMap_Matrix_Inv (0, 0) * NPCX
- + TMap_Matrix_Inv (0, 1) * NPCY
- + TMap_Matrix_Inv (0, 2) * NPCZ
- + TMap_Matrix_Inv (0, 3);
- VRCY = TMap_Matrix_Inv (1, 0) * NPCX
- + TMap_Matrix_Inv (1, 1) * NPCY
- + TMap_Matrix_Inv (1, 2) * NPCZ
- + TMap_Matrix_Inv (1, 3);
- VRCZ = TMap_Matrix_Inv (2, 0) * NPCX
- + TMap_Matrix_Inv (2, 1) * NPCY
- + TMap_Matrix_Inv (2, 2) * NPCZ
- + TMap_Matrix_Inv (2, 3);
- VRCT = TMap_Matrix_Inv (3, 0) * NPCX
- + TMap_Matrix_Inv (3, 1) * NPCY
- + TMap_Matrix_Inv (3, 2) * NPCZ
- + TMap_Matrix_Inv (3, 3);
-
- // VRCS -> WCS World Coordinate Space
- // PtWC = Ori_Matrix_Inv.Multiplied (PtVRC);
-
- WCX = TOri_Matrix_Inv (0, 0) * VRCX
- + TOri_Matrix_Inv (0, 1) * VRCY
- + TOri_Matrix_Inv (0, 2) * VRCZ
- + TOri_Matrix_Inv (0, 3) * VRCT;
- WCY = TOri_Matrix_Inv (1, 0) * VRCX
- + TOri_Matrix_Inv (1, 1) * VRCY
- + TOri_Matrix_Inv (1, 2) * VRCZ
- + TOri_Matrix_Inv (1, 3) * VRCT;
- WCZ = TOri_Matrix_Inv (2, 0) * VRCX
- + TOri_Matrix_Inv (2, 1) * VRCY
- + TOri_Matrix_Inv (2, 2) * VRCZ
- + TOri_Matrix_Inv (2, 3) * VRCT;
- WCT = TOri_Matrix_Inv (3, 0) * VRCX
- + TOri_Matrix_Inv (3, 1) * VRCY
- + TOri_Matrix_Inv (3, 2) * VRCZ
- + TOri_Matrix_Inv (3, 3) * VRCT;
-
- if (WCT != 0.)
- Point.SetCoord (WCX/WCT, WCY/WCT, WCZ/WCT);
- else
- Point.SetCoord (RealLast (), RealLast (), RealLast ());
- }
- }
-
- return (Point);
-
-}
-
-void Visual3d_ViewManager::ConvertCoordWithProj (const Handle(Aspect_Window)& AWindow, const Standard_Integer AU, const Standard_Integer AV, Graphic3d_Vertex& Point, Graphic3d_Vector& Proj) const {
-
-// Conversion only if the data is correct
-Graphic3d_CView TheCView;
-
- if (! ViewExists (AWindow, TheCView)) {
- Point.SetCoord (RealLast (), RealLast (), RealLast ());
- Proj.SetCoord (0., 0., 0.);
- }
- else {
-Standard_Integer Width, Height;
-Standard_ShortReal x, y, z;
-Standard_ShortReal dx, dy, dz;
-Standard_Boolean Result;
-
- AWindow->Size (Width, Height);
-
- Result = MyGraphicDriver->UnProjectRasterWithRay (TheCView,
- 0, 0, Width, Height,
- AU, AV, x, y, z, dx, dy, dz);
-
- // unproject is done by UnProjectRaster
- if (Result) {
- Point.SetCoord
- (Standard_Real (x), Standard_Real (y), Standard_Real (z));
- Proj.SetCoord
- (Standard_Real (dx), Standard_Real (dy), Standard_Real (dz));
- Proj.Normalize();
- }
- // unproject cannot be done by UnProjectRaster
- // Code is suspended since drivers Phigs are Pex abandoned.
- else {
-
-Standard_Real NPCX, NPCY, NPCZ;
-Standard_Real VRCX, VRCY, VRCZ, VRCT;
-Standard_Real WCX, WCY, WCZ, WCT;
-
-TColStd_Array2OfReal TOri_Matrix (0,3,0,3);
-TColStd_Array2OfReal TMap_Matrix (0,3,0,3);
-TColStd_Array2OfReal TOri_Matrix_Inv (0,3,0,3);
-TColStd_Array2OfReal TMap_Matrix_Inv (0,3,0,3);
-
-Standard_Real Dx, Dy, Ratio;
-Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-Standard_Integer j;
-
-Standard_Integer stop = 0;
-
-Standard_Boolean BResult;
-
- j = MyDefinedView.Extent ();
-
- while ((! stop) && (MyIterator.More ())) {
- if (TheCView.ViewId ==
- (MyIterator.Value ())->Identification ()) {
- TOri_Matrix =
- (MyIterator.Value ())->MatrixOfOrientation ();
- TMap_Matrix =
- (MyIterator.Value ())->MatrixOfMapping ();
- stop = 1;
- }
-
- // MyIterator.Next () is located on the next view
- MyIterator.Next ();
- }
-
- // View Mapping Transformation and View Clip, inversion
- BResult = Aspect::Inverse (TMap_Matrix, TMap_Matrix_Inv);
-
- // View Orientation Transformation, inversion
- BResult = Aspect::Inverse (TOri_Matrix, TOri_Matrix_Inv);
-
- // (AU, AV) : Device Coordinate Space
- // DCS -> NPCS Normalized Projection Coordinate Space
- Dx = Standard_Real (Width);
- Dy = Standard_Real (Height);
- Ratio = Dx / Dy;
-
- if (Ratio >= 1.) {
- NPCX = Standard_Real (AU) / Dx;
- NPCY = (Dy - Standard_Real (AV)) / Dx;
- }
- else {
- NPCX = Standard_Real (AU) / Dy;
- NPCY = (Dy - Standard_Real (AV)) / Dy;
- }
- NPCZ = 0.0;
-
- // NPCS -> VRCS View Reference Coordinate Space
- // PtVRC = Map_Matrix_Inv.Multiplied (PtNPC);
-
- VRCX = TMap_Matrix_Inv (0, 0) * NPCX
- + TMap_Matrix_Inv (0, 1) * NPCY
- + TMap_Matrix_Inv (0, 2) * NPCZ
- + TMap_Matrix_Inv (0, 3);
- VRCY = TMap_Matrix_Inv (1, 0) * NPCX
- + TMap_Matrix_Inv (1, 1) * NPCY
- + TMap_Matrix_Inv (1, 2) * NPCZ
- + TMap_Matrix_Inv (1, 3);
- VRCZ = TMap_Matrix_Inv (2, 0) * NPCX
- + TMap_Matrix_Inv (2, 1) * NPCY
- + TMap_Matrix_Inv (2, 2) * NPCZ
- + TMap_Matrix_Inv (2, 3);
- VRCT = TMap_Matrix_Inv (3, 0) * NPCX
- + TMap_Matrix_Inv (3, 1) * NPCY
- + TMap_Matrix_Inv (3, 2) * NPCZ
- + TMap_Matrix_Inv (3, 3);
-
- // VRCS -> WCS World Coordinate Space
- // PtWC = Ori_Matrix_Inv.Multiplied (PtVRC);
-
- WCX = TOri_Matrix_Inv (0, 0) * VRCX
- + TOri_Matrix_Inv (0, 1) * VRCY
- + TOri_Matrix_Inv (0, 2) * VRCZ
- + TOri_Matrix_Inv (0, 3) * VRCT;
- WCY = TOri_Matrix_Inv (1, 0) * VRCX
- + TOri_Matrix_Inv (1, 1) * VRCY
- + TOri_Matrix_Inv (1, 2) * VRCZ
- + TOri_Matrix_Inv (1, 3) * VRCT;
- WCZ = TOri_Matrix_Inv (2, 0) * VRCX
- + TOri_Matrix_Inv (2, 1) * VRCY
- + TOri_Matrix_Inv (2, 2) * VRCZ
- + TOri_Matrix_Inv (2, 3) * VRCT;
- WCT = TOri_Matrix_Inv (3, 0) * VRCX
- + TOri_Matrix_Inv (3, 1) * VRCY
- + TOri_Matrix_Inv (3, 2) * VRCZ
- + TOri_Matrix_Inv (3, 3) * VRCT;
-
- if (WCT != 0.)
- Point.SetCoord (WCX/WCT, WCY/WCT, WCZ/WCT);
- else
- Point.SetCoord (RealLast (), RealLast (), RealLast ());
-
- // Define projection ray
- NPCZ = 10.0;
-
- // NPCS -> VRCS View Reference Coordinate Space
- // PtVRC = Map_Matrix_Inv.Multiplied (PtNPC);
-
- VRCX = TMap_Matrix_Inv (0, 0) * NPCX
- + TMap_Matrix_Inv (0, 1) * NPCY
- + TMap_Matrix_Inv (0, 2) * NPCZ
- + TMap_Matrix_Inv (0, 3);
- VRCY = TMap_Matrix_Inv (1, 0) * NPCX
- + TMap_Matrix_Inv (1, 1) * NPCY
- + TMap_Matrix_Inv (1, 2) * NPCZ
- + TMap_Matrix_Inv (1, 3);
- VRCZ = TMap_Matrix_Inv (2, 0) * NPCX
- + TMap_Matrix_Inv (2, 1) * NPCY
- + TMap_Matrix_Inv (2, 2) * NPCZ
- + TMap_Matrix_Inv (2, 3);
- VRCT = TMap_Matrix_Inv (3, 0) * NPCX
- + TMap_Matrix_Inv (3, 1) * NPCY
- + TMap_Matrix_Inv (3, 2) * NPCZ
- + TMap_Matrix_Inv (3, 3);
-
- // VRCS -> WCS World Coordinate Space
- // PtWC = Ori_Matrix_Inv.Multiplied (PtVRC);
-
- WCX = TOri_Matrix_Inv (0, 0) * VRCX
- + TOri_Matrix_Inv (0, 1) * VRCY
- + TOri_Matrix_Inv (0, 2) * VRCZ
- + TOri_Matrix_Inv (0, 3) * VRCT;
- WCY = TOri_Matrix_Inv (1, 0) * VRCX
- + TOri_Matrix_Inv (1, 1) * VRCY
- + TOri_Matrix_Inv (1, 2) * VRCZ
- + TOri_Matrix_Inv (1, 3) * VRCT;
- WCZ = TOri_Matrix_Inv (2, 0) * VRCX
- + TOri_Matrix_Inv (2, 1) * VRCY
- + TOri_Matrix_Inv (2, 2) * VRCZ
- + TOri_Matrix_Inv (2, 3) * VRCT;
- WCT = TOri_Matrix_Inv (3, 0) * VRCX
- + TOri_Matrix_Inv (3, 1) * VRCY
- + TOri_Matrix_Inv (3, 2) * VRCZ
- + TOri_Matrix_Inv (3, 3) * VRCT;
-
- if (WCT != 0.) {
- Proj.SetCoord (WCX/WCT, WCY/WCT, WCZ/WCT);
- Proj.Normalize();
- }
- else
- Proj.SetCoord (0., 0., 0.);
- }
- }
-
-}
-
-Visual3d_PickDescriptor Visual3d_ViewManager::Pick (const Visual3d_ContextPick& CTX, const Handle(Aspect_Window)& AWindow, const Standard_Integer AX, const Standard_Integer AY) {
-
-// The marking is activated only if the data is correct
-Standard_Boolean DoPick = Standard_False;
-
-CALL_DEF_PICK apick;
-Standard_Integer Width, Height;
-
- // Parse the list of views to find a
- // view having this specified window
- Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
- int TheWindowIdOfView;
-
-#ifndef WNT
-const Handle(Xw_Window) THEWindow = *(Handle(Xw_Window) *) &AWindow;
- int TheSpecifiedWindowId = int (THEWindow->XWindow ());
-#else
-const Handle(WNT_Window) THEWindow = *(Handle(WNT_Window) *) &AWindow;
- int TheSpecifiedWindowId = int (THEWindow->HWindow ());
-#endif // WNT
-
- while ((! DoPick) && (MyIterator.More ())) {
-
- if ( ((MyIterator.Value ())->IsDefined ()) &&
- ((MyIterator.Value ())->IsActive ()) ) {
-
-const Handle(Aspect_Window) AspectWindow = (MyIterator.Value ())->Window ();
-#ifndef WNT
-const Handle(Xw_Window) theWindow = *(Handle(Xw_Window) *) &AspectWindow;
- TheWindowIdOfView = int (theWindow->XWindow ());
-#else
-const Handle(WNT_Window) theWindow = *(Handle(WNT_Window) *) &AspectWindow;
- TheWindowIdOfView = int (theWindow->HWindow ());
-#endif // WNT
- // Comparision on window IDs
- if (TheWindowIdOfView == TheSpecifiedWindowId) {
- DoPick = Standard_True;
-
- // Update
- apick.WsId =
- int ((MyIterator.Value ())->Identification ());
-
- apick.ViewId =
- int ((MyIterator.Value ())->Identification ());
-#ifndef WNT
- apick.DefWindow.XWindow = TheSpecifiedWindowId;
-#else
- apick.DefWindow.XWindow = (HWND) TheSpecifiedWindowId;
-#endif
-
- apick.x = int (AX);
- apick.y = int (AY);
-
- theWindow->Size (Width, Height);
- apick.DefWindow.dx = float (Width);
- apick.DefWindow.dy = float (Height);
-
- apick.Context.aperture = (float) CTX.Aperture ();
- apick.Context.order = int (CTX.Order ());
- apick.Context.depth = int (CTX.Depth ());
-
- }
- } /* if ((MyIterator.Value ())->IsDefined ()) { */
-
- // MyIterator.Next () is located on the next view
- MyIterator.Next ();
- }
-
- if (DoPick)
- MyGraphicDriver->Pick (apick);
- else
- apick.Pick.depth = 0;
-
- // Picking : return
-Standard_Integer i, j=0;
-Standard_Integer NbPick;
-
-Visual3d_PickDescriptor PDes (CTX);
-Visual3d_PickPath PPat;
-
- PDes.Clear ();
- NbPick = 0;
- // For i=0 it is not a graphic structure it is a view structure
- // For i=1 it is the displayed graphic structure
- // For i=2 to apick.Pick.depth-1 it is the connected graphic structures
- if (apick.Pick.depth != 0) {
- j = apick.Pick.listid[1];
- if ((Graphic3d_StructureManager::Identification (j))->
- IsSelectable ()) {
- // Maj element number
- PPat.SetElementNumber (apick.Pick.listelem[1]);
- // Maj pick identifier
- PPat.SetPickIdentifier (apick.Pick.listpickid[1]);
- // Maj structure
- PPat.SetStructIdentifier
- (Graphic3d_StructureManager::Identification (j));
- // Maj PickPath
- PDes.AddPickPath (PPat);
- NbPick++;
- }
- }
-
- // Not very efficient, revise (CAL 22/09/95)
- if (apick.Pick.depth > 2) {
-Handle(Graphic3d_Structure) StructCur =
- Graphic3d_StructureManager::Identification (j);
-Standard_Boolean found;
-Graphic3d_MapOfStructure Set;
-
- for (i=2; i<apick.Pick.depth; i++) {
- found = Standard_False;
- j = apick.Pick.listid[i-1];
- Set.Clear ();
- StructCur->Descendants (Set);
-Graphic3d_MapIteratorOfMapOfStructure IteratorD (Set);
-
- j = apick.Pick.listid[i];
- while (IteratorD.More () && !found) {
- StructCur = IteratorD.Key ();
- if (StructCur->Identification () == j ) {
- found = Standard_True;
- // Maj element number
- PPat.SetElementNumber (apick.Pick.listelem[i]);
- // Maj pick identifier
- PPat.SetPickIdentifier (apick.Pick.listpickid[i]);
- // Maj structure
- PPat.SetStructIdentifier (StructCur);
- // Maj PickPath
- PDes.AddPickPath (PPat);
- NbPick++;
- }
- // IteratorD.Next () is located on the next structure
- IteratorD.Next ();
- }
- }
- }
-
- apick.Pick.depth = int (NbPick);
-
- MyGraphicDriver->InitPick ();
-
- return (PDes);
-
-}
-
Standard_Boolean Visual3d_ViewManager::ViewExists (const Handle(Aspect_Window)& AWindow, Graphic3d_CView& TheCView) const {
Standard_Boolean Exist = Standard_False;
// Parse the list of views to find
// a view with the specified window
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
- int TheWindowIdOfView;
-#ifndef WNT
-const Handle(Xw_Window) THEWindow = *(Handle(Xw_Window) *) &AWindow;
- int TheSpecifiedWindowId = int (THEWindow->XWindow ());
+#if defined(_WIN32) || 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);
+ NSView* TheSpecifiedWindowId = THEWindow->HView();
#else
-const Handle(WNT_Window) THEWindow = *(Handle(WNT_Window) *) &AWindow;
- int TheSpecifiedWindowId = int (THEWindow->HWindow ());
-#endif // WNT
+ const Handle(Xw_Window) THEWindow = Handle(Xw_Window)::DownCast (AWindow);
+ int TheSpecifiedWindowId = int (THEWindow->XWindow ());
+#endif
while ((! Exist) && (MyIterator.More ())) {
((MyIterator.Value ())->IsActive ()) ) {
const Handle(Aspect_Window) AspectWindow = (MyIterator.Value ())->Window ();
-#ifndef WNT
-const Handle(Xw_Window) theWindow = *(Handle(Xw_Window) *) &AspectWindow;
- TheWindowIdOfView = int (theWindow->XWindow ());
+#if defined(_WIN32) || 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);
+ NSView* TheWindowIdOfView = theWindow->HView();
#else
-const Handle(WNT_Window) theWindow = *(Handle(WNT_Window) *) &AspectWindow;
- TheWindowIdOfView = int (theWindow->HWindow ());
+ const Handle(Xw_Window) theWindow = Handle(Xw_Window)::DownCast (AspectWindow);
+ int TheWindowIdOfView = int (theWindow->XWindow ());
#endif // WNT
// Comparaison on window IDs
if (TheWindowIdOfView == TheSpecifiedWindowId) {
Exist = Standard_True;
- TheCView = *(CALL_DEF_VIEW *)(MyIterator.Value ())->CView ();
+ TheCView = *(Graphic3d_CView* )(MyIterator.Value())->CView();
}
} /* if ((MyIterator.Value ())->IsDefined ()) */
// Activates all deactivated views
//
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
while (MyIterator.More ()) {
if (! (MyIterator.Value ())->IsActive ())
//
// Deactivates all activated views
//
-#ifdef DEB
- Standard_Integer Length = MyDefinedView.Extent ();
-#else
- MyDefinedView.Extent ();
-#endif
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-
+
while (MyIterator.More ()) {
if ((MyIterator.Value ())->IsActive ())
(MyIterator.Value ())->Deactivate ();
}
Standard_Integer Visual3d_ViewManager::Identification () const {
-
+
return (Graphic3d_StructureManager::Identification ());
}
void Visual3d_ViewManager::UnIdentification (const Standard_Integer aViewId)
{
+ Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+ while (MyIterator.More())
+ {
+ if ((MyIterator.Value())->Identification () == aViewId)
+ {
+ const Handle(Visual3d_View)& theView = MyIterator.Value();
+ //remove the view from the list
+ MyDefinedView.Remove(theView);
+ break;
+ }
+ // go to next
+ MyIterator.Next ();
+ }
MyViewGenId.Free(aViewId);
}
if (! MyZBufferAuto && ! AFlag) return;
// if pass from False to True :
- // no problem, at the next view update, it
+ // no problem, at the next view update, it
// will properly ask questions to answer (SetVisualisation)
// if pass from True to False :
// it is necessary to modify ZBufferActivity at each view so that
//=======================================================================
//function : ChangeZLayer
-//purpose :
+//purpose :
//=======================================================================
void Visual3d_ViewManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
{
if (!myLayerIds.Contains (theLayerId))
return;
-
+
// change display layer for structure in all views
if (MyDisplayedStructure.Contains (theStructure))
{
for ( ; aViewIt.More (); aViewIt.Next ())
(aViewIt.Value ())->ChangeZLayer (theStructure, theLayerId);
}
-
+
// tell graphic driver to update the structure's display layer
- MyGraphicDriver->ChangeZLayer (
- (*(Graphic3d_CStructure*)theStructure->CStructure ()), theLayerId);
+ MyGraphicDriver->ChangeZLayer (*(theStructure->CStructure()), theLayerId);
}
//=======================================================================
Standard_Integer Visual3d_ViewManager::GetZLayer (const Handle(Graphic3d_Structure)& theStructure) const
{
- Graphic3d_CStructure& aStructure =
- (*(Graphic3d_CStructure*)theStructure->CStructure ());
-
- return MyGraphicDriver->GetZLayer (aStructure);
+ return MyGraphicDriver->GetZLayer (*theStructure->CStructure ());
}
//=======================================================================
//=======================================================================
//function : RemoveZLayer
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theLayerId)
static Aspect_GenId aGenId (1, IntegerLast());
return aGenId;
}
+
+//=======================================================================
+//function : InstallZLayers
+//purpose :
+//=======================================================================
+
+void Visual3d_ViewManager::InstallZLayers(const Handle(Visual3d_View)& theView) const
+{
+ if (!MyDefinedView.Contains (theView))
+ return;
+
+ // erase and insert layers iteratively to provide the same layer order as
+ // in the view manager's sequence. This approach bases on the layer insertion
+ // order: the new layers are always appended to the end of the list
+ // inside of view, while layer remove operation doesn't affect the order.
+ // Starting from second layer : no need to change the default z layer.
+ for (Standard_Integer aSeqIdx = 2; aSeqIdx <= myLayerSeq.Length (); aSeqIdx++)
+ {
+ Standard_Integer aLayerID = myLayerSeq.Value (aSeqIdx);
+ theView->RemoveZLayer (aLayerID);
+ theView->AddZLayer (aLayerID);
+ }
+}