1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-07 18:30:55 +03:00
occt/src/Visual3d/Visual3d_ViewManager.cxx
2012-03-05 19:28:25 +04:00

1342 lines
35 KiB
C++
Executable File

/***********************************************************************
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 <Visual3d_ViewManager.ixx>
#include <Visual3d_ViewManager.pxx>
#include <Standard_ErrorHandler.hxx>
#include <Aspect.hxx>
#include <Graphic3d_GraphicDriver.hxx>
#include <Graphic3d_MapOfStructure.hxx>
#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
#include <Visual3d_PickPath.hxx>
#include <Visual3d_SetIteratorOfSetOfView.hxx>
#ifndef WNT
# include <Xw_Window.hxx>
#else
# include <WNT_Window.hxx>
#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; i<apick.Pick.depth; i++) {
found = Standard_False;
j = apick.Pick.listid[i-1];
Set.Clear ();
StructCur->Descendants (Set);
Graphic3d_MapIteratorOfMapOfStructure IteratorD (Set);
j = apick.Pick.listid[i];
while (IteratorD.More () && !found) {
StructCur = IteratorD.Key ();
if (StructCur->Identification () == j ) {
found = Standard_True;
// Maj element number
PPat.SetElementNumber (apick.Pick.listelem[i]);
// Maj pick identifier
PPat.SetPickIdentifier (apick.Pick.listpickid[i]);
// Maj structure
PPat.SetStructIdentifier (StructCur);
// Maj PickPath
PDes.AddPickPath (PPat);
NbPick++;
}
// IteratorD.Next () is located on the next structure
IteratorD.Next ();
}
}
}
apick.Pick.depth = int (NbPick);
MyGraphicDriver->InitPick ();
return (PDes);
}
Standard_Boolean Visual3d_ViewManager::ViewExists (const Handle(Aspect_Window)& AWindow, Graphic3d_CView& TheCView) const {
Standard_Boolean Exist = Standard_False;
// Parse the list of views to find
// a view with the specified window
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
int TheWindowIdOfView;
#ifndef WNT
const Handle(Xw_Window) THEWindow = *(Handle(Xw_Window) *) &AWindow;
int TheSpecifiedWindowId = int (THEWindow->XWindow ());
#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);
}