// Copyright (c) 1995-1999 Matra Datavision
-// Copyright (c) 1999-2012 OPEN CASCADE SAS
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
-// The content of this file is subject to the Open CASCADE Technology Public
-// License Version 6.5 (the "License"). You may not use the content of this file
-// except in compliance with the License. Please obtain a copy of the License
-// at http://www.opencascade.org and read it completely before using this file.
+// This file is part of Open CASCADE Technology software library.
//
-// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
-// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+// 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.
//
-// The Original Code and all software distributed under the License is
-// distributed on an "AS IS" basis, without warranty of any kind, and the
-// Initial Developer hereby disclaims all such warranties, including without
-// limitation, any warranties of merchantability, fitness for a particular
-// purpose or non-infringement. Please see the License for the specific terms
-// and conditions governing the rights and limitations under the License.
-
+// 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
// clear all structures whilst views are alive for correct GPU memory management
MyDisplayedStructure.Clear();
MyHighlightedStructure.Clear();
- MyVisibleStructure.Clear();
MyPickStructure.Clear();
// clear list of managed views
// Change structure priority in all defined views
//
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;
// 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) {
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) {
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) {
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
//
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
//
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) {
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
//
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 {
}
-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);
-
- 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.);
- }
- }
-
-}
-
-
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);
-
+
while (MyIterator.More ()) {
if (! (MyIterator.Value ())->IsActive ())
(MyIterator.Value ())->Activate ();
// Deactivates all activated views
//
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)
{
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