1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-05 18:16:23 +03:00
occt/src/V3d/V3d_View_3.cxx
kgv 21b2385fcb 0029292: Coding Rules - remove Graphic3d_Vector duplicating gp_XYZ
Graphic3d_Vector has been replaced by gp_Pnt/gp_XYZ/gp_Dir depending on context.
StdSelect_ViewerSelector3d::ToPixMap() - fixed unsafe float math causing out-of-range color results.
2017-11-09 18:08:13 +03:00

212 lines
6.1 KiB
C++

// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <Aspect_GradientBackground.hxx>
#include <Aspect_Grid.hxx>
#include <Aspect_Window.hxx>
#include <Bnd_Box.hxx>
#include <gp_Ax3.hxx>
#include <gp_Dir.hxx>
#include <Graphic3d_Group.hxx>
#include <Graphic3d_Structure.hxx>
#include <Graphic3d_TextureEnv.hxx>
#include <Quantity_Color.hxx>
#include <Standard_MultiplyDefined.hxx>
#include <Standard_TypeMismatch.hxx>
#include <V3d_BadValue.hxx>
#include <V3d_Light.hxx>
#include <V3d_UnMapped.hxx>
#include <V3d_View.hxx>
#include <V3d_Viewer.hxx>
//=============================================================================
//function : Move
//purpose :
//=============================================================================
void V3d_View::Move (const Standard_Real Dx,
const Standard_Real Dy,
const Standard_Real Dz,
const Standard_Boolean Start)
{
Handle(Graphic3d_Camera) aCamera = Camera();
if( Start )
{
myCamStartOpEye = aCamera->Eye();
gp_Dir aReferencePlane (aCamera->Direction().Reversed());
gp_Dir anUp (aCamera->Up());
if (!screenAxis (aReferencePlane, anUp, myXscreenAxis, myYscreenAxis, myZscreenAxis))
{
throw V3d_BadValue("V3d_View::Translate, alignment of Eye,At,Up");
}
}
Standard_Real XX, XY, XZ, YX, YY, YZ, ZX, ZY, ZZ;
myXscreenAxis.Coord (XX,XY,XZ);
myYscreenAxis.Coord (YX,YY,YZ);
myZscreenAxis.Coord (ZX,ZY,ZZ);
aCamera->SetEye (myCamStartOpEye);
aCamera->SetEye (aCamera->Eye().XYZ()
+ Dx * gp_Pnt (XX, XY, XZ).XYZ()
+ Dy * gp_Pnt (YX, YY, YZ).XYZ()
+ Dz * gp_Pnt (ZX, ZY, ZZ).XYZ()
);
AutoZFit();
ImmediateUpdate();
}
//=============================================================================
//function : Move
//purpose :
//=============================================================================
void V3d_View::Move (const Standard_Real theLength, const Standard_Boolean theStart)
{
Handle(Graphic3d_Camera) aCamera = Camera();
if (theStart)
{
myCamStartOpEye = aCamera->Eye();
}
aCamera->SetEye (myCamStartOpEye);
aCamera->SetEye (aCamera->Eye().XYZ() + theLength * myDefaultViewAxis.XYZ());
AutoZFit();
ImmediateUpdate();
}
//=============================================================================
//function : Move
//purpose :
//=============================================================================
void V3d_View::Move (const V3d_TypeOfAxe Axe , const Standard_Real Length, const Standard_Boolean Start)
{
switch (Axe) {
case V3d_X :
Move(Length,0.,0.,Start);
break ;
case V3d_Y :
Move(0.,Length,0.,Start);
break ;
case V3d_Z :
Move(0.,0.,Length,Start);
break ;
}
}
//=============================================================================
//function : Translate
//purpose :
//=============================================================================
void V3d_View::Translate (const Standard_Real Dx,
const Standard_Real Dy,
const Standard_Real Dz,
const Standard_Boolean Start)
{
Handle(Graphic3d_Camera) aCamera = Camera();
if( Start )
{
myCamStartOpEye = aCamera->Eye();
myCamStartOpCenter = aCamera->Center();
gp_Dir aReferencePlane (aCamera->Direction().Reversed());
gp_Dir anUp (aCamera->Up());
if (!screenAxis (aReferencePlane, anUp, myXscreenAxis, myYscreenAxis, myZscreenAxis))
{
throw V3d_BadValue("V3d_View::Translate, alignment of Eye,At,Up");
}
}
aCamera->SetEye (myCamStartOpEye);
aCamera->SetCenter (myCamStartOpCenter);
aCamera->SetCenter (aCamera->Center().XYZ()
- Dx * myXscreenAxis.XYZ()
- Dy * myYscreenAxis.XYZ()
- Dz * myZscreenAxis.XYZ()
);
aCamera->SetEye (aCamera->Eye().XYZ()
- Dx * myXscreenAxis.XYZ()
- Dy * myYscreenAxis.XYZ()
- Dz * myZscreenAxis.XYZ()
);
AutoZFit();
ImmediateUpdate();
}
//=============================================================================
//function : Translate
//purpose :
//=============================================================================
void V3d_View::Translate(const V3d_TypeOfAxe Axe, const Standard_Real Length,const Standard_Boolean Start) {
switch (Axe) {
case V3d_X :
Translate(Length,0.,0., Start);
break ;
case V3d_Y :
Translate(0.,Length,0., Start);
break ;
case V3d_Z :
Translate(0.,0.,Length, Start);
break ;
}
}
//=======================================================================
//function : Place
//purpose :
//=======================================================================
void V3d_View::Place (const Standard_Integer theXp,
const Standard_Integer theYp,
const Standard_Real theZoomFactor)
{
Standard_Integer aWinWidth = 0;
Standard_Integer aWinHeight = 0;
View()->Window()->Size (aWinWidth, aWinHeight);
Standard_Integer aWinCXp = aWinWidth / 2;
Standard_Integer aWinCYp = aWinHeight / 2;
Pan (aWinCXp - theXp, -(aWinCYp - theYp), theZoomFactor / Scale());
}
//=======================================================================
//function : Place
//purpose :
//=======================================================================
void V3d_View::Translate (const Standard_Real theLength, const Standard_Boolean theStart)
{
Handle(Graphic3d_Camera) aCamera = Camera();
if (theStart)
{
myCamStartOpCenter = aCamera->Center() ;
}
gp_Pnt aNewCenter (myCamStartOpCenter.XYZ() - myDefaultViewAxis.XYZ() * theLength);
aCamera->SetCenter (aNewCenter);
AutoZFit();
ImmediateUpdate();
}