// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
-/***********************************************************************
-FONCTION :
-----------
-Classe V3d_View :
-HISTORIQUE DES MODIFICATIONS :
---------------------------------
-00-09-92 : GG ; Creation.
-02-10-96 : FMN ; Suppression appel Redraw sans MustBeResized()
-05-06-97 : FMN ; Correction FitAll()
-30-06-97 : GG ; Correction + Optimisation de Panning(...)
-On fait la translation + le zoom en une seule
-operation au lieu de 2 precedemment qui etait buggee.
-09-07-97 : FMN ; Correction FitAll() sur le Ratio
-16-07-97 : FMN ; Correction FitAll() sur le calcul de la Box
-22-07-97 : FMN ; Ajout mode RetainMode pour le Transient
-15-12-97 : FMN ; Ajout texture mapping
-17-12-97 : FMN ; CTS19129 Correction FitAll() multiple
-18-12-97 : FMN ; Ajout mode Ajout
-24-12-97 : FMN ; Remplacement de math par MathGra
-24-12-97 : CQO ; BUC50037 Xw_Window -> Aspect_Window
-31-12-97 : CAL ; Remplacement de MathGra par Array2OfReal
-07-01-98 : CAL ; Ajout de la methode DoMapping.
-07-01-98 : CAL ; Retrait de tous les "this->" inutiles
-21-01-98 : CAL ; Remplacement des Window->Position () par Window->Size ()
-27-01-98 : FMN ; PERF: OPTIMISATION LOADER (LOPTIM)
-12-02-98 : GG ; Reactivation du Redraw dans MustBeResized()
-23-02-98 : FMN ; Remplacement PI par Standard_PI
-25-02-98 : FMN ; PERF.27: Optimisation of view creation from existing view
-11-03-98 : STT ; S3558
-19-03-98 : FMN ; Probleme dans FitAll car la methode WNT_Window::Size(Real,Real)
-ne marche pas.
-08-04-98 : STT ; suppr. S3558
-10-04-98 : CAL ; Ajout des methodes RefToPix et PixToRef
-13-06-98 : FMN ; Probleme dans FitAll car la methode WNT_Window::Size(Real,Real)
-ne marche pas. Contournement en appelant WNT_Window::Size(Int,Int).
-16-08-98 : CAL ; S3892. Ajout grilles 3d.
-09-09-98 : CAL ; S3892. Generalisation de TrsPoint.
-06-10-98 : CAL ; Ajout d'un TIMER si CSF_GraphicTimer est definie.
-16-10-98 : CAL ; Retrait d'un TIMER si CSF_GraphicTimer est definie.
-06-11-98 : CAL ; PRO ?????. Probleme dans ZFitAll si un point dans la vue.
-29-OCT-98 : DCB : Adding ScreenCopy () method.
-REMARQUES :
------------
-About FitAll() multiple. This probleme is caused by missing
-precision of transformation matrices. If it is supposed that
-projection is made in the plane (U,V), there is a difference
-after several Zoom - compared to the exact value (cf ZoomX).
-Don't forget that the matrices work in float and not in double.
-To solve the problem (for lack of a better solution) I make 2 passes.
-************************************************************************/
-/*----------------------------------------------------------------------*/
-/*
-* Includes
-*/
+#include <V3d_View.hxx>
#include <Aspect_GradientBackground.hxx>
#include <Aspect_Grid.hxx>
#include <Graphic3d_MapOfStructure.hxx>
#include <Graphic3d_Structure.hxx>
#include <Graphic3d_TextureEnv.hxx>
-#include <Graphic3d_Vector.hxx>
#include <Image_AlienPixMap.hxx>
+#include <Message.hxx>
+#include <Message_Messenger.hxx>
#include <NCollection_Array1.hxx>
#include <Precision.hxx>
#include <Quantity_Color.hxx>
#include <V3d_Light.hxx>
#include <V3d_StereoDumpOptions.hxx>
#include <V3d_UnMapped.hxx>
-#include <V3d_View.hxx>
#include <V3d_Viewer.hxx>
-IMPLEMENT_STANDARD_RTTIEXT(V3d_View,MMgt_TShared)
-
-#define V3d_FLAG_COMPUTATION 0x00000004
-
-// Perspective
-#include <OSD_Environment.hxx>
-
-/*----------------------------------------------------------------------*/
-/*
-* Constant
-*/
+IMPLEMENT_STANDARD_RTTIEXT(V3d_View,Standard_Transient)
#define DEUXPI (2. * M_PI)
//=============================================================================
V3d_View::V3d_View (const Handle(V3d_Viewer)& theViewer, const V3d_TypeOfView theType)
: MyViewer (theViewer.operator->()),
- MyActiveLights(),
- myActiveLightsIterator(),
SwitchSetFront (Standard_False),
+ myZRotation (Standard_False),
+ myTrihedron (new V3d_Trihedron()),
MyTrsf (1, 4, 1, 4)
{
myView = theViewer->Driver()->CreateView (theViewer->StructureManager());
myDefaultCamera = new Graphic3d_Camera();
myImmediateUpdate = Standard_False;
- SetAntialiasingOff();
SetAutoZFitMode (Standard_True, 1.0);
SetBackFacingModel (V3d_TOBM_AUTOMATIC);
SetCamera (aCamera);
SetAxis (0.,0.,0.,1.,1.,1.);
SetVisualization (theViewer->DefaultVisualization());
SetShadingModel (theViewer->DefaultShadingModel());
- SetSurfaceDetail (theViewer->DefaultSurfaceDetail());
SetTwist (0.);
SetAt (0.,0.,0.);
SetProj (theViewer->DefaultViewProj());
SetSize (theViewer->DefaultViewSize());
Standard_Real zsize = theViewer->DefaultViewSize();
SetZSize (2.*zsize);
- SetZClippingType (V3d_OFF);
- SetZClippingDepth (0.);
- SetZClippingWidth (zsize);
- SetZCueingOff();
- SetZCueingDepth (0.);
- SetZCueingWidth (zsize);
SetDepth (theViewer->DefaultViewSize() / 2.0);
SetViewMappingDefault();
SetViewOrientationDefault();
//=============================================================================
V3d_View::V3d_View (const Handle(V3d_Viewer)& theViewer, const Handle(V3d_View)& theView)
: MyViewer (theViewer.operator->()),
- MyActiveLights(),
- myActiveLightsIterator(),
SwitchSetFront(Standard_False),
+ myZRotation (Standard_False),
MyTrsf (1, 4, 1, 4)
{
myView = theViewer->Driver()->CreateView (theViewer->StructureManager());
myView->CopySettings (theView->View());
+ myDefaultViewPoint = theView->myDefaultViewPoint;
+ myDefaultViewAxis = theView->myDefaultViewAxis;
- myDefaultCamera = new Graphic3d_Camera();
+ myDefaultCamera = new Graphic3d_Camera (theView->DefaultCamera());
myImmediateUpdate = Standard_False;
SetAutoZFitMode (theView->AutoZFitMode(), theView->AutoZFitScaleFactor());
- SetAxis (0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
- SetViewMappingDefault();
- SetViewOrientationDefault();
theViewer->AddView (this);
Init();
myImmediateUpdate = Standard_True;
thePreviousView->Convert (theX1, theY1, aU1, aV1);
thePreviousView->Convert (theX2, theY2, aU2, aV2);
myView->SetWindow (theWindow);
- FitAll (theWindow, aU1, aV1, aU2, aV2);
+ FitAll (aU1, aV1, aU2, aV2);
MyViewer->SetViewOn (this);
MyWindow = theWindow;
SetRatio();
myView->SetWindow (theWindow, theContext);
MyViewer->SetViewOn (this);
SetRatio();
- Redraw();
+ if (myImmediateUpdate)
+ {
+ Redraw();
+ }
}
//=============================================================================
//=============================================================================
void V3d_View::Remove() const
{
+ if (!MyGrid.IsNull())
+ {
+ MyGrid->Erase();
+ }
+ if (!myTrihedron.IsNull())
+ {
+ myTrihedron->Erase();
+ }
+
MyViewer->DelView (this);
myView->Remove();
Handle(Aspect_Window)& aWin = const_cast<Handle(Aspect_Window)&> (MyWindow);
return;
}
- myView->Update (Aspect_TOU_ASAP);
+ myView->Update();
+ myView->Compute();
+ myView->Redraw();
}
//=============================================================================
return;
}
- Handle(Graphic3d_GraphicDriver) aGraphicDriver = MyViewer->Driver();
Handle(Graphic3d_StructureManager) aStructureMgr = MyViewer->StructureManager();
for (Standard_Integer aRetryIter = 0; aRetryIter < 2; ++aRetryIter)
{
- if (aGraphicDriver->IsDeviceLost())
+ if (aStructureMgr->IsDeviceLost())
{
aStructureMgr->RecomputeStructures();
- aGraphicDriver->ResetDeviceLostFlag();
}
AutoZFit();
myView->Redraw();
- if (!aGraphicDriver->IsDeviceLost())
+ if (!aStructureMgr->IsDeviceLost())
{
return;
}
myAutoZFitIsOn = theIsOn;
}
-// ========================================================================
-// function : AutoZFitMode
-// purpose :
-// ========================================================================
-Standard_Boolean V3d_View::AutoZFitMode() const
-{
- return myAutoZFitIsOn;
-}
-
-// ========================================================================
-// function : AutoZFitScaleFactor
-// purpose :
-// ========================================================================
-Standard_Real V3d_View::AutoZFitScaleFactor() const
-{
- return myAutoZFitScaleFactor;
-}
-
//=============================================================================
//function : AutoZFit
//purpose :
//=============================================================================
void V3d_View::UpdateLights() const
{
- Graphic3d_ListOfCLight aLights;
-
- for (TColStd_ListIteratorOfListOfTransient anIt (MyActiveLights); anIt.More(); anIt.Next())
+ Handle(Graphic3d_LightSet) aLights = new Graphic3d_LightSet();
+ for (V3d_ListOfLight::Iterator anActiveLightIter (myActiveLights); anActiveLightIter.More(); anActiveLightIter.Next())
{
- aLights.Append (Handle(V3d_Light)::DownCast (anIt.Value())->Light());
+ aLights->Add (anActiveLightIter.Value());
}
-
myView->SetLights (aLights);
-
- Update();
}
//=============================================================================
myView->Resized();
SetRatio();
-
- Redraw();
+ if (myImmediateUpdate)
+ {
+ Redraw();
+ }
}
//=============================================================================
}
}
-//=============================================================================
-//function : SetBackgroundColor
-//purpose :
-//=============================================================================
-void V3d_View::SetBackgroundColor (const Quantity_NameOfColor theName)
-{
- SetBackgroundColor (Quantity_Color (theName));
-}
-
//=============================================================================
//function : SetBgGradientColors
//purpose :
}
}
-//=============================================================================
-//function : SetBgGradientColors
-//purpose :
-//=============================================================================
-void V3d_View::SetBgGradientColors (const Quantity_NameOfColor theColor1,
- const Quantity_NameOfColor theColor2,
- const Aspect_GradientFillMethod theFillStyle,
- const Standard_Boolean theToUpdate)
-{
- Quantity_Color aColor1 (theColor1);
- Quantity_Color aColor2 (theColor2);
-
- SetBgGradientColors (aColor1, aColor2, theFillStyle, theToUpdate);
-}
-
//=============================================================================
//function : SetBgGradientStyle
//purpose :
//function : SetAxis
//purpose :
//=============================================================================
-void V3d_View::SetAxis(const Standard_Real X, const Standard_Real Y, const Standard_Real Z, const Standard_Real Vx, const Standard_Real Vy, const Standard_Real Vz)
+void V3d_View::SetAxis (const Standard_Real theX, const Standard_Real theY, const Standard_Real theZ,
+ const Standard_Real theVx, const Standard_Real theVy, const Standard_Real theVz)
{
- Standard_Real D,Nx = Vx,Ny = Vy,Nz = Vz ;
-
- D = Sqrt( Vx*Vx + Vy*Vy + Vz*Vz ) ;
- V3d_BadValue_Raise_if ( D <= 0. , "V3d_View::SetAxis, bad axis");
- Nx /= D ; Ny /= D ; Nz /= D ;
- MyDefaultViewPoint.SetCoord(X,Y,Z) ;
- MyDefaultViewAxis.SetCoord(Nx,Ny,Nz) ;
+ myDefaultViewPoint.SetCoord (theX, theY, theZ);
+ myDefaultViewAxis.SetCoord (theVx, theVy, theVz);
}
//=============================================================================
//function : SetShadingModel
//purpose :
//=============================================================================
-void V3d_View::SetShadingModel (const V3d_TypeOfShadingModel theShadingModel)
-{
- myView->SetShadingModel (static_cast<Graphic3d_TypeOfShadingModel> (theShadingModel));
-}
-
-//=============================================================================
-//function : SetSurfaceDetail
-//purpose :
-//=============================================================================
-void V3d_View::SetSurfaceDetail (const V3d_TypeOfSurfaceDetail theSurfaceDetail)
+void V3d_View::SetShadingModel (const Graphic3d_TypeOfShadingModel theShadingModel)
{
- myView->SetSurfaceDetailType (static_cast<Graphic3d_TypeOfSurfaceDetail> (theSurfaceDetail));
+ myView->SetShadingModel (theShadingModel);
}
//=============================================================================
//function : Rotate
//purpose :
//=============================================================================
-void V3d_View::Rotate(const V3d_TypeOfAxe Axe, const Standard_Real angle,
- const Standard_Real X, const Standard_Real Y, const Standard_Real Z, const Standard_Boolean Start)
+void V3d_View::Rotate (const V3d_TypeOfAxe theAxe, const Standard_Real theAngle,
+ const Standard_Real theX, const Standard_Real theY, const Standard_Real theZ, const Standard_Boolean theStart)
{
- Standard_Real Angle = angle ;
+ Standard_Real anAngle = theAngle;
- if( Angle > 0. ) while ( Angle > DEUXPI ) Angle -= DEUXPI ;
- else if( Angle < 0. ) while ( Angle < -DEUXPI ) Angle += DEUXPI ;
+ if (anAngle > 0.0) while (anAngle > DEUXPI) anAngle -= DEUXPI;
+ else if (anAngle < 0.0) while (anAngle < -DEUXPI) anAngle += DEUXPI;
Handle(Graphic3d_Camera) aCamera = Camera();
- if (Start)
+ if (theStart)
{
- myGravityReferencePoint.SetCoord (X, Y, Z);
+ myGravityReferencePoint.SetCoord (theX, theY, theZ);
myCamStartOpUp = aCamera->Up();
myCamStartOpEye = aCamera->Eye();
myCamStartOpCenter = aCamera->Center();
- switch (Axe) {
- case V3d_X :
- myViewAxis.SetCoord(1.,0.,0.) ;
- break ;
- case V3d_Y :
- myViewAxis.SetCoord(0.,1.,0.) ;
- break ;
- case V3d_Z :
- myViewAxis.SetCoord(0.,0.,1.) ;
- break ;
+ switch (theAxe)
+ {
+ case V3d_X: myViewAxis = gp::DX(); break;
+ case V3d_Y: myViewAxis = gp::DY(); break;
+ case V3d_Z: myViewAxis = gp::DZ(); break;
}
myCamStartOpUp = aCamera->Up();
// rotate camera around passed axis
gp_Trsf aRotation;
gp_Pnt aRCenter (aVref.X(), aVref.Y(), aVref.Z());
- gp_Dir aRAxis ((Axe == V3d_X) ? 1.0 : 0.0,
- (Axe == V3d_Y) ? 1.0 : 0.0,
- (Axe == V3d_Z) ? 1.0 : 0.0);
+ gp_Dir aRAxis ((theAxe == V3d_X) ? 1.0 : 0.0,
+ (theAxe == V3d_Y) ? 1.0 : 0.0,
+ (theAxe == V3d_Z) ? 1.0 : 0.0);
- aRotation.SetRotation (gp_Ax1 (aRCenter, aRAxis), Angle);
+ aRotation.SetRotation (gp_Ax1 (aRCenter, aRAxis), anAngle);
aCamera->Transform (aRotation);
myCamStartOpCenter = aCamera->Center();
}
- const Graphic3d_Vertex& aPnt = MyDefaultViewPoint;
- const Graphic3d_Vector& anAxis = MyDefaultViewAxis;
-
aCamera->SetUp (myCamStartOpUp);
aCamera->SetEye (myCamStartOpEye);
aCamera->SetCenter (myCamStartOpCenter);
gp_Trsf aRotation;
- gp_Pnt aRCenter (aPnt.X(), aPnt.Y(), aPnt.Z());
- gp_Dir aRAxis (anAxis.X(), anAxis.Y(), anAxis.Z());
+ gp_Pnt aRCenter (myDefaultViewPoint);
+ gp_Dir aRAxis (myDefaultViewAxis);
aRotation.SetRotation (gp_Ax1 (aRCenter, aRAxis), Angle);
aCamera->Transform (aRotation);
aCamera->SetEye (myCamStartOpEye);
aCamera->SetCenter (myCamStartOpCenter);
- const Graphic3d_Vector& anAxis = MyDefaultViewAxis;
-
gp_Trsf aRotation;
gp_Pnt aRCenter = aCamera->Eye();
- gp_Dir aRAxis (anAxis.X(), anAxis.Y(), anAxis.Z());
+ gp_Dir aRAxis (myDefaultViewAxis);
aRotation.SetRotation (gp_Ax1 (aRCenter, aRAxis), Angle);
aCamera->Transform (aRotation);
void V3d_View::SetTwist(const Standard_Real angle)
{
Standard_Real Angle = angle ;
- Standard_Boolean TheStatus;
if( Angle > 0. ) while ( Angle > DEUXPI ) Angle -= DEUXPI ;
else if( Angle < 0. ) while ( Angle < -DEUXPI ) Angle += DEUXPI ;
Handle(Graphic3d_Camera) aCamera = Camera();
- gp_Dir aReferencePlane (aCamera->Direction().Reversed());
- gp_Dir anUp;
-
- anUp = gp_Dir (0.0, 0.0, 1.0);
-
- TheStatus = ScreenAxis(aReferencePlane, anUp,
- myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
- if( !TheStatus ) {
- anUp = gp_Dir (0.0, 1.0, 0.0);
- TheStatus = ScreenAxis(aReferencePlane, anUp,
- myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
- }
- if( !TheStatus ) {
- anUp = gp_Dir (1.0, 0.0, 0.0);
- TheStatus = ScreenAxis(aReferencePlane, anUp,
- myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
+ const gp_Dir aReferencePlane (aCamera->Direction().Reversed());
+ if (!screenAxis (aReferencePlane, gp::DZ(), myXscreenAxis, myYscreenAxis, myZscreenAxis)
+ && !screenAxis (aReferencePlane, gp::DY(), myXscreenAxis, myYscreenAxis, myZscreenAxis)
+ && !screenAxis (aReferencePlane, gp::DZ(), myXscreenAxis, myYscreenAxis, myZscreenAxis))
+ {
+ throw V3d_BadValue ("V3d_ViewSetTwist, alignment of Eye,At,Up,");
}
-
- V3d_BadValue_Raise_if( !TheStatus,"V3d_ViewSetTwist, alignment of Eye,At,Up,");
gp_Pnt aRCenter = aCamera->Center();
gp_Dir aZAxis (aCamera->Direction().Reversed());
gp_Trsf aTrsf;
aTrsf.SetRotation (gp_Ax1 (aRCenter, aZAxis), Angle);
- Standard_Real myYscreenAxisX, myYscreenAxisY, myYscreenAxisZ;
- myYscreenAxis.Coord (myYscreenAxisX, myYscreenAxisY, myYscreenAxisZ);
-
- aCamera->SetUp (gp_Dir (myYscreenAxisX, myYscreenAxisY, myYscreenAxisZ));
+ aCamera->SetUp (gp_Dir (myYscreenAxis));
aCamera->Transform (aTrsf);
AutoZFit();
//function : SetProj
//purpose :
//=============================================================================
-void V3d_View::SetProj( const V3d_TypeOfOrientation Orientation )
+void V3d_View::SetProj (const V3d_TypeOfOrientation theOrientation,
+ const Standard_Boolean theIsYup)
{
- Standard_Real Xpn=0;
- Standard_Real Ypn=0;
- Standard_Real Zpn=0;
-
- switch (Orientation) {
- case V3d_Zpos :
- Ypn = 1.;
- break;
- case V3d_Zneg :
- Ypn = -1.;
- break;
- default:
- Zpn = 1.;
+ Graphic3d_Vec3d anUp = theIsYup ? Graphic3d_Vec3d (0.0, 1.0, 0.0) : Graphic3d_Vec3d (0.0, 0.0, 1.0);
+ if (theIsYup)
+ {
+ if (theOrientation == V3d_Ypos
+ || theOrientation == V3d_Yneg)
+ {
+ anUp.SetValues (0.0, 0.0, -1.0);
+ }
+ }
+ else
+ {
+ if (theOrientation == V3d_Zpos)
+ {
+ anUp.SetValues (0.0, 1.0, 0.0);
+ }
+ else if (theOrientation == V3d_Zneg)
+ {
+ anUp.SetValues (0.0, -1.0, 0.0);
+ }
}
- const Graphic3d_Vector& aBck = V3d::GetProjAxis (Orientation);
+ const gp_Dir aBck = V3d::GetProjAxis (theOrientation);
// retain camera panning from origin when switching projection
- Handle(Graphic3d_Camera) aCamera = Camera();
-
- gp_Pnt anOriginVCS = aCamera->ConvertWorld2View (gp::Origin());
- Standard_Real aPanX = anOriginVCS.X();
- Standard_Real aPanY = anOriginVCS.Y();
+ const Handle(Graphic3d_Camera)& aCamera = Camera();
+ const gp_Pnt anOriginVCS = aCamera->ConvertWorld2View (gp::Origin());
aCamera->SetCenter (gp_Pnt (0, 0, 0));
aCamera->SetDirection (gp_Dir (aBck.X(), aBck.Y(), aBck.Z()).Reversed());
- aCamera->SetUp (gp_Dir (Xpn, Ypn, Zpn));
+ aCamera->SetUp (gp_Dir (anUp.x(), anUp.y(), anUp.z()));
aCamera->OrthogonalizeUp();
- Panning (aPanX, aPanY);
+ Panning (anOriginVCS.X(), anOriginVCS.Y());
AutoZFit();
//function : SetUp
//purpose :
//=============================================================================
-void V3d_View::SetUp(const Standard_Real Vx,const Standard_Real Vy,const Standard_Real Vz)
+void V3d_View::SetUp (const Standard_Real theVx, const Standard_Real theVy, const Standard_Real theVz)
{
- Standard_Boolean TheStatus ;
- V3d_BadValue_Raise_if( Sqrt(Vx*Vx + Vy*Vy + Vz*Vz) <= 0. ,
- "V3d_View::SetUp, nullUp vector");
-
Handle(Graphic3d_Camera) aCamera = Camera();
- gp_Dir aReferencePlane (aCamera->Direction().Reversed());
- gp_Dir anUp (Vx, Vy, Vz);
-
- TheStatus = ScreenAxis(aReferencePlane,anUp,
- myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
- if( !TheStatus ) {
- anUp = gp_Dir (0.0, 0.0, 1.0);
- TheStatus = ScreenAxis(aReferencePlane,anUp,
- myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
- }
- if( !TheStatus ) {
- anUp = gp_Dir (0.0, 1.0, 0.0);
- TheStatus = ScreenAxis(aReferencePlane,anUp,
- myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
- }
- if( !TheStatus ) {
- anUp = gp_Dir (1.0, 0.0, 0.0);
- TheStatus = ScreenAxis(aReferencePlane,anUp,
- myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
+ const gp_Dir aReferencePlane (aCamera->Direction().Reversed());
+ const gp_Dir anUp (theVx, theVy, theVz);
+ if (!screenAxis (aReferencePlane, anUp, myXscreenAxis, myYscreenAxis, myZscreenAxis)
+ && !screenAxis (aReferencePlane, gp::DZ(), myXscreenAxis, myYscreenAxis, myZscreenAxis)
+ && !screenAxis (aReferencePlane, gp::DY(), myXscreenAxis, myYscreenAxis, myZscreenAxis)
+ && !screenAxis (aReferencePlane, gp::DX(), myXscreenAxis, myYscreenAxis, myZscreenAxis))
+ {
+ throw V3d_BadValue ("V3d_View::Setup, alignment of Eye,At,Up");
}
- V3d_BadValue_Raise_if( !TheStatus,"V3d_View::Setup, alignment of Eye,At,Up");
- Standard_Real myYscreenAxisX, myYscreenAxisY, myYscreenAxisZ;
- myYscreenAxis.Coord (myYscreenAxisX, myYscreenAxisY, myYscreenAxisZ);
-
- aCamera->SetUp (gp_Dir (myYscreenAxisX, myYscreenAxisY, myYscreenAxisZ));
+ aCamera->SetUp (gp_Dir (myYscreenAxis));
AutoZFit();
//function : SetUp
//purpose :
//=============================================================================
-void V3d_View::SetUp( const V3d_TypeOfOrientation Orientation )
+void V3d_View::SetUp (const V3d_TypeOfOrientation theOrientation)
{
- Standard_Boolean TheStatus ;
-
Handle(Graphic3d_Camera) aCamera = Camera();
- gp_Dir aReferencePlane (aCamera->Direction().Reversed());
- gp_Dir anUp;
-
- const Graphic3d_Vector& aViewReferenceUp = V3d::GetProjAxis(Orientation) ;
- anUp = gp_Dir (aViewReferenceUp.X(), aViewReferenceUp.Y(), aViewReferenceUp.Z());
-
- TheStatus = ScreenAxis(aReferencePlane,anUp,
- myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
- if( !TheStatus ) {
- anUp = gp_Dir (0.,0.,1.);
- TheStatus = ScreenAxis(aReferencePlane,anUp,
- myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
- }
- if( !TheStatus ) {
- anUp = gp_Dir (0.,1.,0.);
- TheStatus = ScreenAxis(aReferencePlane,anUp,
- myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
- }
- if( !TheStatus ) {
- anUp = gp_Dir (1.,0.,0.);
- TheStatus = ScreenAxis(aReferencePlane,anUp,
- myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
+ const gp_Dir aReferencePlane (aCamera->Direction().Reversed());
+ const gp_Dir anUp = V3d::GetProjAxis (theOrientation);
+ if (!screenAxis (aReferencePlane, anUp, myXscreenAxis, myYscreenAxis, myZscreenAxis)
+ && !screenAxis (aReferencePlane, gp::DZ(), myXscreenAxis, myYscreenAxis, myZscreenAxis)
+ && !screenAxis (aReferencePlane, gp::DY(), myXscreenAxis, myYscreenAxis, myZscreenAxis)
+ && !screenAxis (aReferencePlane, gp::DX(), myXscreenAxis, myYscreenAxis, myZscreenAxis))
+ {
+ throw V3d_BadValue ("V3d_View::SetUp, alignment of Eye,At,Up");
}
- V3d_BadValue_Raise_if( !TheStatus, "V3d_View::SetUp, alignment of Eye,At,Up");
- Standard_Real myYscreenAxisX, myYscreenAxisY, myYscreenAxisZ;
- myYscreenAxis.Coord (myYscreenAxisX, myYscreenAxisY, myYscreenAxisZ);
-
- aCamera->SetUp (gp_Dir (myYscreenAxisX, myYscreenAxisY, myYscreenAxisZ));
+ aCamera->SetUp (gp_Dir (myYscreenAxis));
AutoZFit();
//function : SetZoom
//purpose :
//=============================================================================
-void V3d_View::SetZoom(const Standard_Real Coef,const Standard_Boolean Start)
+void V3d_View::SetZoom (const Standard_Real theCoef,const Standard_Boolean theToStart)
{
- V3d_BadValue_Raise_if( Coef <= 0.,"V3d_View::SetZoom, bad coefficient");
+ V3d_BadValue_Raise_if (theCoef <= 0., "V3d_View::SetZoom, bad coefficient");
Handle(Graphic3d_Camera) aCamera = Camera();
- if (Start)
+ if (theToStart)
{
myCamStartOpEye = aCamera->Eye();
myCamStartOpCenter = aCamera->Center();
Standard_Real aViewHeight = aCamera->ViewDimensions().Y();
// ensure that zoom will not be too small or too big
- Standard_Real coef = Coef;
- if (aViewWidth < coef * Precision::Confusion())
+ Standard_Real aCoef = theCoef;
+ if (aViewWidth < aCoef * Precision::Confusion())
{
- coef = aViewWidth / Precision::Confusion();
+ aCoef = aViewWidth / Precision::Confusion();
}
- else if (aViewWidth > coef * 1e12)
+ else if (aViewWidth > aCoef * 1e12)
{
- coef = aViewWidth / 1e12;
+ aCoef = aViewWidth / 1e12;
}
- if (aViewHeight < coef * Precision::Confusion())
+ if (aViewHeight < aCoef * Precision::Confusion())
{
- coef = aViewHeight / Precision::Confusion();
+ aCoef = aViewHeight / Precision::Confusion();
}
- else if (aViewHeight > coef * 1e12)
+ else if (aViewHeight > aCoef * 1e12)
{
- coef = aViewHeight / 1e12;
+ aCoef = aViewHeight / 1e12;
}
aCamera->SetEye (myCamStartOpEye);
aCamera->SetCenter (myCamStartOpCenter);
- aCamera->SetScale (aCamera->Scale() / Coef);
+ aCamera->SetScale (aCamera->Scale() / aCoef);
AutoZFit();
//function : FitAll
//purpose :
//=============================================================================
-void V3d_View::FitAll (const Quantity_Coefficient theMargin, const Standard_Boolean theToUpdate)
+void V3d_View::FitAll (const Standard_Real theMargin, const Standard_Boolean theToUpdate)
{
FitAll (myView->MinMaxValues(), theMargin, theToUpdate);
}
//function : FitAll
//purpose :
//=============================================================================
-void V3d_View::FitAll (const Bnd_Box& theBox, const Quantity_Coefficient theMargin, const Standard_Boolean theToUpdate)
+void V3d_View::FitAll (const Bnd_Box& theBox, const Standard_Real theMargin, const Standard_Boolean theToUpdate)
{
Standard_ASSERT_RAISE(theMargin >= 0.0 && theMargin < 1.0, "Invalid margin coefficient");
//function : DepthFitAll
//purpose :
//=============================================================================
-void V3d_View::DepthFitAll(const Quantity_Coefficient Aspect,
- const Quantity_Coefficient Margin)
+void V3d_View::DepthFitAll(const Standard_Real Aspect,
+ const Standard_Real Margin)
{
Standard_Real Xmin,Ymin,Zmin,Xmax,Ymax,Zmax,U,V,W,U1,V1,W1 ;
Standard_Real Umin,Vmin,Wmin,Umax,Vmax,Wmax ;
ImmediateUpdate();
}
-//=============================================================================
-//function : FitAll
-//purpose :
-//=============================================================================
-void V3d_View::FitAll(const Standard_Real theMinXv,
- const Standard_Real theMinYv,
- const Standard_Real theMaxXv,
- const Standard_Real theMaxYv)
-{
- FitAll (MyWindow, theMinXv, theMinYv, theMaxXv, theMaxYv);
-}
-
-//=============================================================================
-//function : WindowFitAll
-//purpose :
-//=============================================================================
-void V3d_View::WindowFitAll(const Standard_Integer Xmin,
- const Standard_Integer Ymin,
- const Standard_Integer Xmax,
- const Standard_Integer Ymax)
-{
- WindowFit(Xmin,Ymin,Xmax,Ymax);
-}
-
//=======================================================================
//function : WindowFit
//purpose :
//function : ConvertWithProj
//purpose :
//=======================================================================
-void V3d_View::ConvertWithProj(const Standard_Integer Xp,
- const Standard_Integer Yp,
- Standard_Real& X,
- Standard_Real& Y,
- Standard_Real& Z,
- Standard_Real& Dx,
- Standard_Real& Dy,
- Standard_Real& Dz) const
+void V3d_View::ConvertWithProj(const Standard_Integer theXp,
+ const Standard_Integer theYp,
+ Standard_Real& theX,
+ Standard_Real& theY,
+ Standard_Real& theZ,
+ Standard_Real& theDx,
+ Standard_Real& theDy,
+ Standard_Real& theDz) const
{
V3d_UnMapped_Raise_if (!myView->IsDefined(), "view has no window");
- Standard_Integer aHeight, aWidth;
+ Standard_Integer aHeight = 0, aWidth = 0;
MyWindow->Size (aWidth, aHeight);
- Standard_Real anX = 2.0 * Xp / aWidth - 1.0;
- Standard_Real anY = 2.0 * (aHeight - 1 - Yp) / aHeight - 1.0;
- Standard_Real aZ = 2.0 * 0.0 - 1.0;
-
- Handle(Graphic3d_Camera) aCamera = Camera();
-
- gp_Pnt aResult = aCamera->UnProject (gp_Pnt (anX, anY, aZ));
-
- X = aResult.X();
- Y = aResult.Y();
- Z = aResult.Z();
-
- Graphic3d_Vertex aVrp;
- aVrp.SetCoord (X, Y, Z);
+ const Standard_Real anX = 2.0 * theXp / aWidth - 1.0;
+ const Standard_Real anY = 2.0 * (aHeight - 1 - theYp) / aHeight - 1.0;
+ const Standard_Real aZ = 2.0 * 0.0 - 1.0;
- aResult = aCamera->UnProject (gp_Pnt (anX, anY, aZ - 10.0));
+ const Handle(Graphic3d_Camera)& aCamera = Camera();
+ const gp_Pnt aResult1 = aCamera->UnProject (gp_Pnt (anX, anY, aZ));
+ const gp_Pnt aResult2 = aCamera->UnProject (gp_Pnt (anX, anY, aZ - 10.0));
- Graphic3d_Vec3d aNormDir;
- aNormDir.x() = X - aResult.X();
- aNormDir.y() = Y - aResult.Y();
- aNormDir.z() = Z - aResult.Z();
+ theX = aResult1.X();
+ theY = aResult1.Y();
+ theZ = aResult1.Z();
+ Graphic3d_Vec3d aNormDir (theX - aResult2.X(),
+ theY - aResult2.Y(),
+ theZ - aResult2.Z());
aNormDir.Normalize();
- Dx = aNormDir.x();
- Dy = aNormDir.y();
- Dz = aNormDir.z();
+ theDx = aNormDir.x();
+ theDy = aNormDir.y();
+ theDz = aNormDir.z();
}
//=======================================================================
{
const Handle(Graphic3d_Structure)& aStruct = aStructIter.Key();
if (!aStruct->IsVisible()
- || (hasSelection && !aStruct->IsHighlighted())
- || aStruct->IsEmpty())
+ || aStruct->IsInfinite()
+ || (hasSelection && !aStruct->IsHighlighted()))
{
continue;
}
- Bnd_Box aBox = aStruct->MinMaxValues();
- if (aBox.IsVoid() || aStruct->IsInfinite())
+ const Graphic3d_BndBox3d& aBox = aStruct->CStructure()->BoundingBox();
+ if (!aBox.IsValid())
+ {
+ continue;
+ }
+
+ // skip transformation-persistent objects
+ if (!aStruct->TransformPersistence().IsNull())
{
continue;
}
// use camera projection to find gravity point
- aBox.Get (Xmin, Ymin, Zmin,
- Xmax, Ymax, Zmax);
+ Xmin = aBox.CornerMin().x();
+ Ymin = aBox.CornerMin().y();
+ Zmin = aBox.CornerMin().z();
+ Xmax = aBox.CornerMax().x();
+ Ymax = aBox.CornerMax().y();
+ Zmax = aBox.CornerMax().z();
gp_Pnt aPnts[THE_NB_BOUND_POINTS] =
{
gp_Pnt (Xmin, Ymin, Zmin), gp_Pnt (Xmin, Ymin, Zmax),
if (aNbPoints == 0)
{
- for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (aSetOfStructures);
- aStructIter.More(); aStructIter.Next())
+ // fallback - just use bounding box of entire scene
+ Bnd_Box aBox = myView->MinMaxValues();
+ if (!aBox.IsVoid())
{
- const Handle(Graphic3d_Structure)& aStruct = aStructIter.Key();
- if (aStruct->IsEmpty())
- {
- continue;
- }
-
- Bnd_Box aBox = aStruct->MinMaxValues();
- if (aBox.IsVoid() || aStruct->IsInfinite())
- {
- continue;
- }
-
aBox.Get (Xmin, Ymin, Zmin,
Xmax, Ymax, Zmax);
gp_Pnt aPnts[THE_NB_BOUND_POINTS] =
Z = aCameraEye.Z();
}
-//=============================================================================
-//function : FocalReferencePoint
-//purpose :
-//=============================================================================
-void V3d_View::FocalReferencePoint(Standard_Real& X, Standard_Real& Y,Standard_Real& Z) const
-{
- Eye (X,Y,Z);
-}
-
//=============================================================================
//function : ProjReferenceAxe
//purpose :
//=============================================================================
Standard_Real V3d_View::Twist() const
{
- Standard_Real Xup,Yup,Zup,Xpn,Ypn,Zpn,X0,Y0,Z0 ;
- Standard_Real pvx,pvy,pvz,pvn,sca,angle ;
- Graphic3d_Vector Xaxis,Yaxis,Zaxis ;
- Standard_Boolean TheStatus ;
+ gp_Vec Xaxis, Yaxis, Zaxis;
+ const gp_Dir aReferencePlane (Camera()->Direction().Reversed());
+ if (!screenAxis (aReferencePlane, gp::DZ(), Xaxis, Yaxis, Zaxis)
+ && !screenAxis (aReferencePlane, gp::DY(), Xaxis, Yaxis, Zaxis)
+ && !screenAxis (aReferencePlane, gp::DX(), Xaxis, Yaxis, Zaxis))
+ {
+ //
+ }
- gp_Dir aReferencePlane (Camera()->Direction().Reversed());
- gp_Dir anUp;
+ // Compute Cross Vector From Up & Origin
+ const gp_Dir aCameraUp = Camera()->Up();
+ const gp_XYZ aP = Yaxis.XYZ().Crossed (aCameraUp.XYZ());
- Proj(Xpn,Ypn,Zpn);
- anUp = gp_Dir (0.,0.,1.) ;
- TheStatus = ScreenAxis (aReferencePlane, anUp,Xaxis,Yaxis,Zaxis) ;
- if( !TheStatus ) {
- anUp = gp_Dir (0.,1.,0.) ;
- TheStatus = ScreenAxis (aReferencePlane, anUp,Xaxis,Yaxis,Zaxis) ;
- }
- if( !TheStatus ) {
- anUp = gp_Dir (1.,0.,0.) ;
- TheStatus = ScreenAxis (aReferencePlane, anUp,Xaxis,Yaxis,Zaxis) ;
+ // compute Angle
+ Standard_Real anAngle = ASin (Max (Min (aP.Modulus(), 1.0), -1.0));
+ if (Yaxis.Dot (aCameraUp.XYZ()) < 0.0)
+ {
+ anAngle = M_PI - anAngle;
}
- Yaxis.Coord(X0,Y0,Z0) ;
-
- Up(Xup,Yup,Zup) ;
- /* Compute Cross Vector From Up & Origin */
- pvx = Y0*Zup - Z0*Yup ;
- pvy = Z0*Xup - X0*Zup ;
- pvz = X0*Yup - Y0*Xup ;
- pvn = pvx*pvx + pvy*pvy + pvz*pvz ;
- sca = X0*Xup + Y0*Yup + Z0*Zup ;
- /* Compute Angle */
- angle = Sqrt(pvn) ;
- if( angle > 1. ) angle = 1. ;
- else if( angle < -1. ) angle = -1. ;
- angle = asin(angle) ;
- if( sca < 0. ) angle = M_PI - angle ;
- if( angle > 0. && angle < M_PI ) {
- sca = pvx*Xpn + pvy*Ypn + pvz*Zpn ;
- if( sca < 0. ) angle = DEUXPI - angle ;
+ if (anAngle > 0.0
+ && anAngle < M_PI)
+ {
+ const gp_Dir aProjDir = Camera()->Direction().Reversed();
+ if (aP.Dot (aProjDir.XYZ()) < 0.0)
+ {
+ anAngle = DEUXPI - anAngle;
+ }
}
- return angle ;
+ return anAngle;
}
//=============================================================================
//function : ShadingModel
//purpose :
//=============================================================================
-V3d_TypeOfShadingModel V3d_View::ShadingModel() const
-{
- return static_cast<V3d_TypeOfShadingModel> (myView->ShadingModel());
-}
-
-//=============================================================================
-//function : SurfaceDetail
-//purpose :
-//=============================================================================
-V3d_TypeOfSurfaceDetail V3d_View::SurfaceDetail() const
+Graphic3d_TypeOfShadingModel V3d_View::ShadingModel() const
{
- return static_cast<V3d_TypeOfSurfaceDetail> (myView->SurfaceDetailType());
+ return myView->ShadingModel();
}
//=============================================================================
return static_cast<V3d_TypeOfVisualization> (myView->VisualizationType());
}
-//=============================================================================
-//function : Antialiasing
-//purpose :
-//=============================================================================
-Standard_Boolean V3d_View::Antialiasing() const
-{
- return myView->IsAntialiasingEnabled();
-}
-
-//=============================================================================
-//function : Viewer
-//purpose :
-//=============================================================================
-Handle(V3d_Viewer) V3d_View::Viewer() const
-{
- return MyViewer;
-}
-
//=============================================================================
//function : IfWindow
//purpose :
return myView->IsDefined();
}
-//=============================================================================
-//function : Window
-//purpose :
-//=============================================================================
-Handle(Aspect_Window) V3d_View::Window() const
-{
- return MyWindow;
-}
-
//=============================================================================
//function : Type
//purpose :
}
//=============================================================================
-//function : View
-//purpose :
-//=============================================================================
-Handle(Graphic3d_CView) V3d_View::View() const
-{
- return myView;
-}
-
-//=============================================================================
-//function : ScreenAxis
+//function : screenAxis
//purpose :
//=============================================================================
-Standard_Boolean V3d_View::ScreenAxis( const gp_Dir &Vpn, const gp_Dir &Vup, Graphic3d_Vector &Xaxe, Graphic3d_Vector &Yaxe, Graphic3d_Vector &Zaxe)
+Standard_Boolean V3d_View::screenAxis (const gp_Dir& theVpn, const gp_Dir& theVup,
+ gp_Vec& theXaxe, gp_Vec& theYaxe, gp_Vec& theZaxe)
{
- Standard_Real Xpn, Ypn, Zpn, Xup, Yup, Zup;
- Standard_Real dx1, dy1, dz1, xx, yy, zz;
+ theXaxe = theVup.XYZ().Crossed (theVpn.XYZ());
+ if (theXaxe.Magnitude() <= gp::Resolution())
+ {
+ return Standard_False;
+ }
+ theXaxe.Normalize();
- Xpn = Vpn.X(); Ypn = Vpn.Y(); Zpn = Vpn.Z();
- Xup = Vup.X(); Yup = Vup.Y(); Zup = Vup.Z();
- xx = Yup*Zpn - Zup*Ypn;
- yy = Zup*Xpn - Xup*Zpn;
- zz = Xup*Ypn - Yup*Xpn;
- Xaxe.SetCoord (xx, yy, zz);
- if (Xaxe.LengthZero()) return Standard_False;
- Xaxe.Normalize();
- Xaxe.Coord(dx1, dy1, dz1);
- xx = Ypn*dz1 - Zpn*dy1;
- yy = Zpn*dx1 - Xpn*dz1;
- zz = Xpn*dy1 - Ypn*dx1;
- Yaxe.SetCoord (xx, yy, zz) ;
- if (Yaxe.LengthZero()) return Standard_False;
- Yaxe.Normalize();
+ theYaxe = theVpn.XYZ().Crossed (theXaxe.XYZ());
+ if (theYaxe.Magnitude() <= gp::Resolution())
+ {
+ return Standard_False;
+ }
+ theYaxe.Normalize();
- Zaxe.SetCoord (Xpn, Ypn, Zpn);
- Zaxe.Normalize();
+ theZaxe = theVpn.XYZ();
+ theZaxe.Normalize();
return Standard_True;
}
//function : TrsPoint
//purpose :
//=============================================================================
-Graphic3d_Vertex V3d_View::TrsPoint( const Graphic3d_Vertex &P, const TColStd_Array2OfReal &Matrix )
+gp_XYZ V3d_View::TrsPoint (const Graphic3d_Vertex& thePnt, const TColStd_Array2OfReal& theMat)
{
- Graphic3d_Vertex PP ;
- Standard_Real X,Y,Z,XX,YY,ZZ ;
-
// CAL. S3892
- Standard_Integer lr, ur, lc, uc;
- lr = Matrix.LowerRow ();
- ur = Matrix.UpperRow ();
- lc = Matrix.LowerCol ();
- uc = Matrix.UpperCol ();
- if ((ur - lr + 1 != 4) || (uc - lc + 1 != 4) ) {
- P.Coord(X,Y,Z) ;
- PP.SetCoord(X,Y,Z) ;
- return PP ;
+ const Standard_Integer lr = theMat.LowerRow();
+ const Standard_Integer ur = theMat.UpperRow();
+ const Standard_Integer lc = theMat.LowerCol();
+ const Standard_Integer uc = theMat.UpperCol();
+ if ((ur - lr + 1 != 4) || (uc - lc + 1 != 4))
+ {
+ return gp_XYZ (thePnt.X(), thePnt.Y(), thePnt.Z());
}
- P.Coord(X,Y,Z) ;
- XX = (Matrix(lr,lc+3) + X*Matrix(lr,lc) + Y*Matrix(lr,lc+1)+
- Z*Matrix(lr,lc+2))/Matrix(lr+3,lc+3) ;
-
- YY = (Matrix(lr+1,lc+3) + X*Matrix(lr+1,lc) + Y*Matrix(lr+1,lc+1) +
- Z*Matrix(lr+1,lc+2))/Matrix(lr+3,lc+3) ;
- ZZ = (Matrix(lr+2,lc+3) + X*Matrix(lr+2,lc) + Y*Matrix(lr+2,lc+1) +
- Z*Matrix(lr+2,lc+2))/Matrix(lr+3,lc+3) ;
- PP.SetCoord(XX,YY,ZZ) ;
- return PP ;
+ Standard_Real X, Y, Z;
+ thePnt.Coord (X,Y,Z);
+ const Standard_Real XX = (theMat(lr,lc+3) + X*theMat(lr,lc) + Y*theMat(lr,lc+1) + Z*theMat(lr,lc+2)) / theMat(lr+3,lc+3);
+ const Standard_Real YY = (theMat(lr+1,lc+3) + X*theMat(lr+1,lc) + Y*theMat(lr+1,lc+1) + Z*theMat(lr+1,lc+2))/theMat(lr+3,lc+3);
+ const Standard_Real ZZ = (theMat(lr+2,lc+3) + X*theMat(lr+2,lc) + Y*theMat(lr+2,lc+1) + Z*theMat(lr+2,lc+2))/theMat(lr+3,lc+3);
+ return gp_XYZ (XX, YY, ZZ);
}
//=======================================================================
//=======================================================================
void V3d_View::Pan (const Standard_Integer theDXp,
const Standard_Integer theDYp,
- const Quantity_Factor theZoomFactor,
+ const Standard_Real theZoomFactor,
const Standard_Boolean theToStart)
{
Panning (Convert (theDXp), Convert (theDYp), theZoomFactor, theToStart);
//=======================================================================
void V3d_View::Panning (const Standard_Real theDXv,
const Standard_Real theDYv,
- const Quantity_Factor theZoomFactor,
+ const Standard_Real theZoomFactor,
const Standard_Boolean theToStart)
{
Standard_ASSERT_RAISE (theZoomFactor > 0.0, "Bad zoom factor");
Standard_Real aZoomAtPointYv = 0.0;
Convert (MyZoomAtPointX, MyZoomAtPointY, aZoomAtPointXv, aZoomAtPointYv);
- V3d_Coordinate aDxv = aZoomAtPointXv / aCoef;
- V3d_Coordinate aDyv = aZoomAtPointYv / aCoef;
+ Standard_Real aDxv = aZoomAtPointXv / aCoef;
+ Standard_Real aDyv = aZoomAtPointYv / aCoef;
aCamera->SetScale (aCamera->Scale() / aCoef);
Translate (aCamera, aZoomAtPointXv - aDxv, aZoomAtPointYv - aDyv);
//function : FitAll
//purpose :
//=============================================================================
-void V3d_View::FitAll(const Handle(Aspect_Window)& aWindow,
- const Standard_Real Xmin,
- const Standard_Real Ymin,
- const Standard_Real Xmax,
- const Standard_Real Ymax)
+void V3d_View::FitAll(const Standard_Real theXmin,
+ const Standard_Real theYmin,
+ const Standard_Real theXmax,
+ const Standard_Real theYmax)
{
- Standard_Integer aWinWidth, aWinHeight;
- aWindow->Size (aWinWidth, aWinHeight);
+ Handle(Graphic3d_Camera) aCamera = Camera();
+ Standard_Real anAspect = aCamera->Aspect();
- Standard_Real aWinAspect = (Standard_Real)aWinWidth / aWinHeight;
- Standard_Real aFitSizeU = Abs (Xmax - Xmin);
- Standard_Real aFitSizeV = Abs (Ymax - Ymin);
+ Standard_Real aFitSizeU = Abs (theXmax - theXmin);
+ Standard_Real aFitSizeV = Abs (theYmax - theYmin);
Standard_Real aFitAspect = aFitSizeU / aFitSizeV;
- if (aFitAspect >= aWinAspect)
+ if (aFitAspect >= anAspect)
{
- aFitSizeV = aFitSizeU / aWinAspect;
+ aFitSizeV = aFitSizeU / anAspect;
}
else
{
- aFitSizeU = aFitSizeV * aWinAspect;
+ aFitSizeU = aFitSizeV * anAspect;
}
- Handle(Graphic3d_Camera) aCamera = Camera();
-
- aCamera->SetAspect (aWinAspect);
- Translate (aCamera, (Xmin + Xmax) * 0.5, (Ymin + Ymax) * 0.5);
+ Translate (aCamera, (theXmin + theXmax) * 0.5, (theYmin + theYmax) * 0.5);
Scale (aCamera, aFitSizeU, aFitSizeV);
AutoZFit();
//function : StartRotation
//purpose :
//=============================================================================
-static Standard_Boolean zRotation = Standard_False;
void V3d_View::StartRotation(const Standard_Integer X,
const Standard_Integer Y,
- const Quantity_Ratio zRotationThreshold)
+ const Standard_Real zRotationThreshold)
{
sx = X; sy = Y;
Standard_Real x,y;
ry = Standard_Real(Convert(y));
Gravity(gx,gy,gz);
Rotate(0.,0.,0.,gx,gy,gz,Standard_True);
- zRotation = Standard_False;
+ myZRotation = Standard_False;
if( zRotationThreshold > 0. ) {
Standard_Real dx = Abs(sx - rx/2.);
Standard_Real dy = Abs(sy - ry/2.);
- // if( dx > rx/3. || dy > ry/3. ) zRotation = Standard_True;
+ // if( dx > rx/3. || dy > ry/3. ) myZRotation = Standard_True;
Standard_Real dd = zRotationThreshold * (rx + ry)/2.;
- if( dx > dd || dy > dd ) zRotation = Standard_True;
+ if( dx > dd || dy > dd ) myZRotation = Standard_True;
}
}
return;
}
Standard_Real dx=0.,dy=0.,dz=0.;
- if( zRotation ) {
+ if( myZRotation ) {
dz = atan2(Standard_Real(X)-rx/2., ry/2.-Standard_Real(Y)) -
atan2(sx-rx/2.,ry/2.-sy);
} else {
if (myComputedMode)
{
myView->SetComputedMode (Standard_True);
- Update();
}
}
else
{
myView->SetComputedMode (Standard_False);
- Update();
}
}
}
}
-//=============================================================================
-//function : Export
-//purpose :
-//=============================================================================
-Standard_Boolean V3d_View::Export (const Standard_CString theFileName,
- const Graphic3d_ExportFormat theFormat,
- const Graphic3d_SortType theSortType)
-{
- return myView->Export (theFileName, theFormat, theSortType);
-}
-
//=============================================================================
//function : Dump
//purpose :
//purpose :
//=============================================================================
Standard_Boolean V3d_View::ToPixMap (Image_PixMap& theImage,
- const Standard_Integer theWidth,
- const Standard_Integer theHeight,
- const Graphic3d_BufferType& theBufferType,
- const Standard_Boolean theToKeepAspect,
- const V3d_StereoDumpOptions theStereoOptions)
+ const V3d_ImageDumpOptions& theParams)
{
- // always prefer hardware accelerated offscreen buffer
+ Graphic3d_Vec2i aTargetSize (theParams.Width, theParams.Height);
+ if (aTargetSize.x() != 0
+ && aTargetSize.y() != 0)
+ {
+ // allocate image buffer for dumping
+ if (theImage.IsEmpty()
+ || theImage.SizeX() != Standard_Size(aTargetSize.x())
+ || theImage.SizeY() != Standard_Size(aTargetSize.y()))
+ {
+ Image_Format aFormat = Image_Format_UNKNOWN;
+ switch (theParams.BufferType)
+ {
+ case Graphic3d_BT_RGB: aFormat = Image_Format_RGB; break;
+ case Graphic3d_BT_RGBA: aFormat = Image_Format_RGBA; break;
+ case Graphic3d_BT_Depth: aFormat = Image_Format_GrayF; break;
+ case Graphic3d_BT_RGB_RayTraceHdrLeft: aFormat = Image_Format_RGBF; break;
+ }
+
+ if (!theImage.InitZero (aFormat, Standard_Size(aTargetSize.x()), Standard_Size(aTargetSize.y())))
+ {
+ Message::DefaultMessenger()->Send (TCollection_AsciiString ("Fail to allocate an image ") + aTargetSize.x() + "x" + aTargetSize.y()
+ + " for view dump", Message_Fail);
+ return Standard_False;
+ }
+ }
+ }
+ if (theImage.IsEmpty())
+ {
+ Message::DefaultMessenger()->Send (TCollection_AsciiString ("V3d_View::ToPixMap() has been called without image dimensions"), Message_Fail);
+ return Standard_False;
+ }
+ aTargetSize.x() = (Standard_Integer )theImage.SizeX();
+ aTargetSize.y() = (Standard_Integer )theImage.SizeY();
+
Handle(Standard_Transient) aFBOPtr;
Handle(Standard_Transient) aPrevFBOPtr = myView->FBO();
- Standard_Integer aFBOVPSizeX (theWidth), aFBOVPSizeY (theHeight), aFBOSizeXMax (0), aFBOSizeYMax (0);
- Standard_Integer aPrevFBOVPSizeX (0), aPrevFBOVPSizeY (0), aPrevFBOSizeXMax (0), aPrevFBOSizeYMax (0);
+ Graphic3d_Vec2i aFBOVPSize = aTargetSize;
+
+ bool isTiling = false;
+ if (theParams.TileSize > 0)
+ {
+ if (aFBOVPSize.x() > theParams.TileSize
+ || aFBOVPSize.y() > theParams.TileSize)
+ {
+ aFBOVPSize.x() = Min (aFBOVPSize.x(), theParams.TileSize);
+ aFBOVPSize.y() = Min (aFBOVPSize.y(), theParams.TileSize);
+ isTiling = true;
+ }
+ }
+
+ Graphic3d_Vec2i aPrevFBOVPSize;
if (!aPrevFBOPtr.IsNull())
{
+ Graphic3d_Vec2i aPrevFBOSizeMax;
myView->FBOGetDimensions (aPrevFBOPtr,
- aPrevFBOVPSizeX, aPrevFBOVPSizeY,
- aPrevFBOSizeXMax, aPrevFBOSizeYMax);
- if (aFBOVPSizeX <= aPrevFBOSizeXMax && aFBOVPSizeY <= aPrevFBOSizeYMax)
+ aPrevFBOVPSize.x(), aPrevFBOVPSize.y(),
+ aPrevFBOSizeMax.x(), aPrevFBOSizeMax.y());
+ if (aFBOVPSize.x() <= aPrevFBOSizeMax.x()
+ && aFBOVPSize.y() <= aPrevFBOSizeMax.y())
{
- myView->FBOChangeViewport (aPrevFBOPtr, aFBOVPSizeX, aFBOVPSizeY);
aFBOPtr = aPrevFBOPtr;
}
}
if (aFBOPtr.IsNull())
{
- // Try to create hardware accelerated buffer
- aFBOPtr = myView->FBOCreate (aFBOVPSizeX, aFBOVPSizeY);
- if (!aFBOPtr.IsNull())
+ Standard_Integer aMaxTexSizeX = MyViewer->Driver()->InquireLimit (Graphic3d_TypeOfLimit_MaxViewDumpSizeX);
+ Standard_Integer aMaxTexSizeY = MyViewer->Driver()->InquireLimit (Graphic3d_TypeOfLimit_MaxViewDumpSizeY);
+ if (theParams.TileSize > aMaxTexSizeX
+ || theParams.TileSize > aMaxTexSizeY)
{
- myView->FBOGetDimensions (aFBOPtr,
- aFBOVPSizeX, aFBOVPSizeY,
- aFBOSizeXMax, aFBOSizeYMax);
- // reduce viewport in case of hardware limits
- if (aFBOVPSizeX > aFBOSizeXMax) aFBOVPSizeX = aFBOSizeXMax;
- if (aFBOVPSizeY > aFBOSizeYMax) aFBOVPSizeY = aFBOSizeYMax;
- myView->FBOChangeViewport (aFBOPtr, aFBOVPSizeX, aFBOVPSizeY);
+ Message::DefaultMessenger()->Send (TCollection_AsciiString ("Image dump can not be performed - specified tile size (")
+ + theParams.TileSize + ") exceeds hardware limits (" + aMaxTexSizeX + "x" + aMaxTexSizeY + ")", Message_Fail);
+ return Standard_False;
}
+
+ if (aFBOVPSize.x() > aMaxTexSizeX
+ || aFBOVPSize.y() > aMaxTexSizeY)
+ {
+ if (MyViewer->Driver()->InquireLimit (Graphic3d_TypeOfLimit_IsWorkaroundFBO))
+ {
+ Message::DefaultMessenger ()->Send (TCollection_AsciiString ("Warning, workaround for Intel driver problem with empty FBO for images with big width is applyed."), Message_Warning);
+ }
+ Message::DefaultMessenger()->Send (TCollection_AsciiString ("Info, tiling image dump is used, image size (")
+ + aFBOVPSize.x() + "x" + aFBOVPSize.y() + ") exceeds hardware limits (" + aMaxTexSizeX + "x" + aMaxTexSizeY + ")", Message_Info);
+ aFBOVPSize.x() = Min (aFBOVPSize.x(), aMaxTexSizeX);
+ aFBOVPSize.y() = Min (aFBOVPSize.y(), aMaxTexSizeY);
+ isTiling = true;
+ }
+
+ // Try to create hardware accelerated buffer
+ aFBOPtr = myView->FBOCreate (aFBOVPSize.x(), aFBOVPSize.y());
}
myView->SetFBO (aFBOPtr);
- // If hardware accelerated buffer - try to use onscreen buffer
- // Results may be bad!
if (aFBOPtr.IsNull())
{
- // retrieve window sizes
- Standard_Integer aWinWidth, aWinHeight;
- MyWindow->Size (aWinWidth, aWinHeight);
-
- // technically we can reduce existing viewport...
- // but currently allow only dumping the window itself
- if (aFBOVPSizeX != aWinWidth || aFBOVPSizeY != aWinHeight)
+ // try to use on-screen buffer
+ Graphic3d_Vec2i aWinSize;
+ MyWindow->Size (aWinSize.x(), aWinSize.y());
+ if (aFBOVPSize.x() != aWinSize.x()
+ || aFBOVPSize.y() != aWinSize.y())
{
- return Standard_False;
+ isTiling = true;
}
+ aFBOVPSize = aWinSize;
+
+ Message::DefaultMessenger()->Send (TCollection_AsciiString ("Warning, on screen buffer is used for image dump - content might be invalid"), Message_Warning);
}
+ // backup camera parameters
Handle(Graphic3d_Camera) aStoreMapping = new Graphic3d_Camera();
-
Handle(Graphic3d_Camera) aCamera = Camera();
-
aStoreMapping->Copy (aCamera);
-
if (aCamera->IsStereo())
{
- switch (theStereoOptions)
+ switch (theParams.StereoOptions)
{
case V3d_SDO_MONO:
{
}
}
}
-
- // render immediate structures into back buffer rather than front
- const Standard_Boolean aPrevImmediateMode = myView->SetImmediateModeDrawToFront (Standard_False);
-
- const Standard_Boolean toAutoUpdate = myImmediateUpdate;
- myImmediateUpdate = Standard_False;
- AutoZFit();
- myImmediateUpdate = toAutoUpdate;
-
- if (theToKeepAspect)
+ if (theParams.ToAdjustAspect)
{
- aCamera->SetAspect ((Standard_Real) aFBOVPSizeX / aFBOVPSizeY);
+ aCamera->SetAspect (Standard_Real(aTargetSize.x()) / Standard_Real(aTargetSize.y()));
}
+ AutoZFit();
- Redraw();
-
- myView->SetImmediateModeDrawToFront (aPrevImmediateMode);
-
- aCamera->Copy (aStoreMapping);
+ // render immediate structures into back buffer rather than front
+ const Standard_Boolean aPrevImmediateMode = myView->SetImmediateModeDrawToFront (Standard_False);
Standard_Boolean isSuccess = Standard_True;
-
- // allocate image buffer for dumping
- if (theImage.IsEmpty()
- || (Standard_Size )aFBOVPSizeX != theImage.SizeX()
- || (Standard_Size )aFBOVPSizeY != theImage.SizeY())
+ if (!isTiling)
{
- bool isBigEndian = Image_PixMap::IsBigEndianHost();
- Image_PixMap::ImgFormat aFormat = Image_PixMap::ImgUNKNOWN;
- switch (theBufferType)
+ if (!aFBOPtr.IsNull())
{
- case Graphic3d_BT_RGB: aFormat = isBigEndian ? Image_PixMap::ImgRGB : Image_PixMap::ImgBGR; break;
- case Graphic3d_BT_RGBA: aFormat = isBigEndian ? Image_PixMap::ImgRGBA : Image_PixMap::ImgBGRA; break;
- case Graphic3d_BT_Depth: aFormat = Image_PixMap::ImgGrayF; break;
+ myView->FBOChangeViewport (aFBOPtr, aTargetSize.x(), aTargetSize.y());
}
+ Redraw();
+ isSuccess = isSuccess && myView->BufferDump (theImage, theParams.BufferType);
+ }
+ else
+ {
+ Image_PixMap aTilePixMap;
+ aTilePixMap.SetTopDown (theImage.IsTopDown());
- isSuccess = isSuccess && theImage.InitZero (aFormat, aFBOVPSizeX, aFBOVPSizeY);
+ Graphic3d_Vec2i anOffset (0, 0);
+ for (; anOffset.y() < aTargetSize.y(); anOffset.y() += aFBOVPSize.y())
+ {
+ anOffset.x() = 0;
+ for (; anOffset.x() < aTargetSize.x(); anOffset.x() += aFBOVPSize.x())
+ {
+ Graphic3d_CameraTile aTileUncropped;
+ aTileUncropped.Offset = anOffset;
+ aTileUncropped.TotalSize = aTargetSize;
+ aTileUncropped.TileSize = aFBOVPSize;
+ const Graphic3d_CameraTile aTile = aTileUncropped.Cropped();
+ if (aTile.TileSize.x() < 1
+ || aTile.TileSize.y() < 1)
+ {
+ continue;
+ }
+
+ const Standard_Integer aLeft = aTile.Offset.x();
+ Standard_Integer aBottom = aTile.Offset.y();
+ if (theImage.IsTopDown())
+ {
+ const Standard_Integer aTop = aTile.Offset.y() + aTile.TileSize.y();
+ aBottom = aTargetSize.y() - aTop;
+ }
+ aTilePixMap.InitWrapper (theImage.Format(), theImage.ChangeData()
+ + theImage.SizeRowBytes() * aBottom + theImage.SizePixelBytes() * aLeft,
+ aTile.TileSize.x(), aTile.TileSize.y(),
+ theImage.SizeRowBytes());
+
+ if (!aFBOPtr.IsNull())
+ {
+ aCamera->SetTile (aTile);
+ myView->FBOChangeViewport (aFBOPtr, aTile.TileSize.x(), aTile.TileSize.y());
+ }
+ else
+ {
+ // no API to resize viewport of on-screen buffer - render uncropped
+ aCamera->SetTile (aTileUncropped);
+ }
+ Redraw();
+ isSuccess = isSuccess && myView->BufferDump (aTilePixMap, theParams.BufferType);
+ if (!isSuccess)
+ {
+ break;
+ }
+ }
+ if (!isSuccess)
+ {
+ break;
+ }
+ }
}
- isSuccess = isSuccess && myView->BufferDump (theImage, theBufferType);
- // FBO now useless, free resources
+ // restore state
+ myView->SetImmediateModeDrawToFront (aPrevImmediateMode);
+ aCamera->Copy (aStoreMapping);
if (aFBOPtr != aPrevFBOPtr)
{
myView->FBORelease (aFBOPtr);
}
else if (!aPrevFBOPtr.IsNull())
{
- myView->FBOChangeViewport (aPrevFBOPtr, aPrevFBOVPSizeX, aPrevFBOVPSizeY);
+ myView->FBOChangeViewport (aPrevFBOPtr, aPrevFBOVPSize.x(), aPrevFBOVPSize.y());
}
myView->SetFBO (aPrevFBOPtr);
-
return isSuccess;
}
aViewSizeYv = aViewSizeZv;
}
- Scale (theCamera, aViewSizeXv * (1.0 + theMargin), aViewSizeYv * (1.0 + theMargin));
+ Scale (theCamera, aViewSizeXv, aViewSizeYv);
+
+ const Standard_Real aZoomCoef = myView->ConsiderZoomPersistenceObjects();
+
+ Scale (theCamera, theCamera->ViewDimensions().X() * (aZoomCoef + theMargin), theCamera->ViewDimensions().Y() * (aZoomCoef + theMargin));
return Standard_True;
}
}
// =======================================================================
-// function : IsCullingEnabled
+// function : DiagnosticInformation
// purpose :
// =======================================================================
-Standard_Boolean V3d_View::IsCullingEnabled() const
+void V3d_View::DiagnosticInformation (TColStd_IndexedDataMapOfStringString& theDict,
+ Graphic3d_DiagnosticInfo theFlags) const
{
- return myView->IsCullingEnabled();
+ myView->DiagnosticInformation (theDict, theFlags);
+}
+
+//=======================================================================
+//function : StatisticInformation
+//purpose :
+//=======================================================================
+void V3d_View::StatisticInformation (TColStd_IndexedDataMapOfStringString& theDict) const
+{
+ myView->StatisticInformation (theDict);
}
// =======================================================================
-// function : SetFrustumCulling
+// function : StatisticInformation
// purpose :
// =======================================================================
-void V3d_View::SetFrustumCulling (const Standard_Boolean theToClip)
+TCollection_AsciiString V3d_View::StatisticInformation() const
+{
+ return myView->StatisticInformation();
+}
+
+//=============================================================================
+//function : RenderingParams
+//purpose :
+//=============================================================================
+const Graphic3d_RenderingParams& V3d_View::RenderingParams() const
+{
+ return myView->RenderingParams();
+}
+
+//=============================================================================
+//function : ChangeRenderingParams
+//purpose :
+//=============================================================================
+Graphic3d_RenderingParams& V3d_View::ChangeRenderingParams()
{
- myView->SetCullingEnabled (theToClip);
+ return myView->ChangeRenderingParams();
}