/*********************************************************************** FONCTION : ---------- Classe Visual3d_ViewManager.cxx : Declaration of variables specific to visualisers HISTORIQUE DES MODIFICATIONS : -------------------------------- Mars 1992 : NW,JPB,CAL ; Creation. 19-06-96 : FMN ; Suppression variables inutiles 04-02-97 : FMN ; Suppression de PSOutput, XWDOutput ... 06-05-97 : CAL ; Ajout du Clear sur les TOS_COMPUTED. 19-09-97 : CAL ; Remplacement de Window->Position par Window->Size; 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 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. 10-06-98 : CAL ; Modification des signatures de xxProjectRaster. 10-06-98 : CAL ; Modification de la signature de ViewExists. 01-12-98 : CAL ; S4062. Ajout des layers. 02-12-98 : CAL ; Remove () ne detruit plus les vues. ************************************************************************/ /*----------------------------------------------------------------------*/ /* * Constants */ #define NO_DOWNCAST #define NO_DESTROY /*----------------------------------------------------------------------*/ /* * Includes */ // for the class #include #include #include #include #include #include #include #include #include #ifndef WNT # include #else # include #endif // WNT //-Aliases //-Global data definitions // -- les vues definies // MyDefinedView : SetOfView; // -- le generateur d'identificateurs de vues // MyViewGenId : GenId; //-Constructors Visual3d_ViewManager::Visual3d_ViewManager (const Handle(Aspect_GraphicDevice)& aDevice): Graphic3d_StructureManager (aDevice), 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), MyTransparency (Standard_False) { Handle(Aspect_GraphicDriver) agd = aDevice->GraphicDriver (); MyGraphicDriver = *(Handle(Graphic3d_GraphicDriver) *) &agd; } //-Destructors void Visual3d_ViewManager::Destroy () { #ifdef DESTROY cout << "Visual3d_ViewManager::Destroy (" << MyId << ")\n" << flush; #endif Remove (); } //-Methods, in order void Visual3d_ViewManager::Remove () { #ifdef DESTROY cout << "Visual3d_ViewManager::Remove (" << MyId << ")\n" << flush; #endif // // 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 (); } void Visual3d_ViewManager::ChangeDisplayPriority (const Handle(Graphic3d_Structure)& AStructure, const Standard_Integer OldPriority, const Standard_Integer NewPriority) { #ifdef TRACE cout << "Visual3d_ViewManager::ChangeDisplayPriority (" << AStructure->Identification () << ", " << OldPriority << ", " << NewPriority << ")\n"; cout << flush; #endif // // 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); // MyIterator.Next () is located on the next view MyIterator.Next (); } } 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) { if (! AProjector->IsKind (STANDARD_TYPE (Visual3d_View))) return; #ifdef DOWNCAST Handle(Visual3d_View) theView = Handle(Visual3d_View)::DownCast (AProjector); #else Handle(Visual3d_View) theView = *(Handle(Visual3d_View) *) &AProjector; #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); // MyIterator.Next () is located on the next view MyIterator.Next (); } } 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); // MyIterator.Next () is located on the next view MyIterator.Next (); } } 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); // MyIterator.Next () is located on the next view MyIterator.Next (); } } 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); // MyIterator.Next () is located on the next view MyIterator.Next (); } } void Visual3d_ViewManager::Display (const Handle(Graphic3d_Structure)& AStructure) { // Even if physically the structure cannot // be displayed (pb of visualisation type) // it has status Displayed. MyDisplayedStructure.Add(AStructure); // // Display structure in all activated views // Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView); while (MyIterator.More ()) { (MyIterator.Value ())->Display (AStructure); // MyIterator.Next () is located on the next view MyIterator.Next (); } } void Visual3d_ViewManager::Erase (const Handle(Graphic3d_Structure)& AStructure) { // Even if physically the structure cannot // be displayed (pb of visualisation type) // it has status Displayed. MyDisplayedStructure.Remove(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); // MyIterator.Next () is located on the next view MyIterator.Next (); } 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(); } } void Visual3d_ViewManager::Highlight (const Handle(Graphic3d_Structure)& AStructure, const Aspect_TypeOfHighlightMethod AMethod) { MyHighlightedStructure.Add(AStructure); // // 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); // MyIterator.Next () is located on the next view MyIterator.Next (); } } 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); // MyIterator.Next () is located on the next view MyIterator.Next (); } } void Visual3d_ViewManager::UnHighlight () { Graphic3d_MapIteratorOfMapOfStructure it(MyHighlightedStructure); for (; it.More(); it.Next()) { Handle(Graphic3d_Structure) SG = it.Key(); SG->UnHighlight (); } } void Visual3d_ViewManager::UnHighlight (const Handle(Graphic3d_Structure)& AStructure) { MyHighlightedStructure.Remove(AStructure); // // 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); // MyIterator.Next () is located on the next view MyIterator.Next (); } } 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; // 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); // MyIterator.Next () is located on the next view MyIterator.Next (); } } void Visual3d_ViewManager::Update () const { // // 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); // MyIterator.Next () is located on the next view MyIterator.Next (); } } 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 ()) { if ((MyIterator.Value ())->IsActive ()) SG->Add (MyIterator.Value ()); // MyIterator.Next () is located on the next view MyIterator.Next (); } return (SG); } #ifdef IMPLEMENTED Standard_Boolean Visual3d_ViewManager::ContainsComputedStructure () const { Standard_Boolean Result = Standard_False; // // Check all activated views // Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView); Standard_Integer i = MyDefinedView.Extent (); while ((! Result) && (MyIterator.More ())) { if ((MyIterator.Value ())->IsActive ()) Result = (MyIterator.Value ())->ContainsComputedStructure (); // MyIterator.Next () is located on the next view MyIterator.Next (); } return Result; } #endif Handle(Visual3d_HSetOfView) Visual3d_ViewManager::DefinedView () const { Handle (Visual3d_HSetOfView) SG = new Visual3d_HSetOfView (); Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView); while (MyIterator.More ()) { SG->Add (MyIterator.Value ()); // MyIterator.Next () is located on the next view MyIterator.Next (); } return (SG); } 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; iDescendants (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 ()); #else const Handle(WNT_Window) THEWindow = *(Handle(WNT_Window) *) &AWindow; int TheSpecifiedWindowId = int (THEWindow->HWindow ()); #endif // WNT while ((! Exist) && (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 // Comparaison on window IDs if (TheWindowIdOfView == TheSpecifiedWindowId) { Exist = Standard_True; TheCView = *(CALL_DEF_VIEW *)(MyIterator.Value ())->CView (); } } /* if ((MyIterator.Value ())->IsDefined ()) */ // MyIterator.Next () is located on the next view MyIterator.Next (); } return (Exist); } void Visual3d_ViewManager::Activate () { // // 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 ()) (MyIterator.Value ())->Activate (); // MyIterator.Next () is located on the next view MyIterator.Next (); } } void Visual3d_ViewManager::Deactivate () { // // 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 (); // MyIterator.Next () is located on the next view MyIterator.Next (); } } Standard_Integer Visual3d_ViewManager::MaxNumOfViews () const { // Retourne the planned of definable views for the current // Visual3d_ViewManager. return (Standard_Integer ((View_IDMAX-View_IDMIN+1)/Visual3d_ViewManager::Limit ())); } Handle(Graphic3d_Structure) Visual3d_ViewManager::Identification (const Standard_Integer AId) const { return (Graphic3d_StructureManager::Identification (AId)); } Standard_Integer Visual3d_ViewManager::Identification () const { return (Graphic3d_StructureManager::Identification ()); } Standard_Integer Visual3d_ViewManager::Identification (const Handle(Visual3d_View)& AView) { MyDefinedView.Add (AView); return (MyViewGenId.Next ()); } void Visual3d_ViewManager::UnIdentification (const Standard_Integer aViewId) { MyViewGenId.Free(aViewId); } void Visual3d_ViewManager::SetTransparency (const Standard_Boolean AFlag) { if (MyTransparency && AFlag) return; if (! MyTransparency && ! AFlag) return; Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView); while (MyIterator.More ()) { (MyIterator.Value ())->SetTransparency (AFlag); // MyIterator.Next () is located on the next view MyIterator.Next (); } MyTransparency = AFlag; } Standard_Boolean Visual3d_ViewManager::Transparency () const { return (MyTransparency); } void Visual3d_ViewManager::SetZBufferAuto (const Standard_Boolean AFlag) { if (MyZBufferAuto && AFlag) return; if (! MyZBufferAuto && ! AFlag) return; // if pass from False to True : // 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 // zbuffer could be active only if required by context. // In this case -1 is passed so that the view ask itself the question // Note : 0 forces the desactivation, 1 forces the activation if (! AFlag) { Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView); while (MyIterator.More ()) { (MyIterator.Value ())->SetZBufferActivity (-1); // MyIterator.Next () is located on the next view MyIterator.Next (); } } MyZBufferAuto = AFlag; } Standard_Boolean Visual3d_ViewManager::ZBufferAuto () const { return (MyZBufferAuto); } void Visual3d_ViewManager::SetLayer (const Handle(Visual3d_Layer)& ALayer) { #ifdef TRACE_LAYER cout << "Visual3d_ViewManager::SetLayer\n" << flush; #endif if (ALayer->Type () == Aspect_TOL_OVERLAY) { #ifdef TRACE_LAYER if (MyOverLayer.IsNull ()) cout << "MyOverLayer is defined" << endl; else cout << "MyOverLayer is redefined" << endl; #endif MyOverLayer = ALayer; } else { #ifdef TRACE_LAYER if (MyUnderLayer.IsNull ()) cout << "MyUnderLayer is defined" << endl; else cout << "MyUnderLayer is redefined" << endl; #endif MyUnderLayer = ALayer; } } const Handle(Visual3d_Layer)& Visual3d_ViewManager::UnderLayer () const { return (MyUnderLayer); } const Handle(Visual3d_Layer)& Visual3d_ViewManager::OverLayer () const { return (MyOverLayer); }