1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-16 10:08:36 +03:00
occt/src/Visual3d/Visual3d_ViewManager.cxx
abv ed4415982c 0024624: Lost word in license statement in source files
License statement text corrected; compiler warnings caused by Bison 2.41 disabled for MSVC; a few other compiler warnings on 54-bit Windows eliminated by appropriate type cast
Wrong license statements corrected in several files.
Copyright and license statements added in XSD and GLSL files.
Copyright year updated in some files.
Obsolete documentation files removed from DrawResources.
2014-03-25 16:38:55 +04:00

1296 lines
35 KiB
C++

// Copyright (c) 1995-1999 Matra Datavision
// 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.
/***********************************************************************
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 <Aspect_IdentDefinitionError.hxx>
#include <Graphic3d_GraphicDriver.hxx>
#include <Graphic3d_MapOfStructure.hxx>
#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
#include <Visual3d_PickPath.hxx>
#include <Visual3d_SetIteratorOfSetOfView.hxx>
#if defined (_WIN32) || defined(__WIN32__)
# include <WNT_Window.hxx>
#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
# include <Cocoa_Window.hxx>
#else
# include <Xw_Window.hxx>
#endif
//-Aliases
//-Global data definitions
// -- les vues definies
// MyDefinedView : SetOfView;
// -- le generateur d'identificateurs de vues
// MyViewGenId : GenId;
//-Constructors
Visual3d_ViewManager::Visual3d_ViewManager (const Handle(Graphic3d_GraphicDriver)& theDriver):
Graphic3d_StructureManager (theDriver),
MyDefinedView (),
MyViewGenId (View_IDMIN+((View_IDMIN+View_IDMAX)/(Visual3d_ViewManager::Limit ()))*(Visual3d_ViewManager::CurrentId ()-1),View_IDMIN+((View_IDMIN+View_IDMAX)/(Visual3d_ViewManager::Limit ()))*Visual3d_ViewManager::CurrentId ()-1),
MyZBufferAuto (Standard_False),
MyTransparency (Standard_False)
{
// default layer is always presented in display layer sequence
// it can not be removed
myLayerIds.Add (0);
myLayerSeq.Append (0);
MyGraphicDriver = theDriver;
}
//-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 DESTROY
cout << "The Manager " << MyId << " have " << Length << " defined views\n";
cout << flush;
#endif
// clear all structures whilst views are alive for correct GPU memory management
MyDisplayedStructure.Clear();
MyHighlightedStructure.Clear();
MyPickStructure.Clear();
// clear list of managed views
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
//
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 ();
// 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) {
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) {
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) {
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
//
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
while (MyIterator.More ()) {
(MyIterator.Value ())->Erase (AStructure);
// MyIterator.Next () is located on the next view
MyIterator.Next ();
}
MyHighlightedStructure.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
//
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) {
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
//
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 ();
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);
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))
{
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 stop = 0;
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
Aspect::Inverse (TMap_Matrix, TMap_Matrix_Inv);
// View Orientation Transformation, inversion
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);
}
}
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 (0., 0., 0.);
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 stop = 0;
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
Aspect::Inverse (TMap_Matrix, TMap_Matrix_Inv);
// View Orientation Transformation, inversion
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 (0., 0., 0.);
// Define projection ray
NPCZ = 10.0;
// NPCS -> VRCS View Reference Coordinate Space
// PtVRC = Map_Matrix_Inv.Multiplied (PtNPC);
VRCX = TMap_Matrix_Inv (0, 0) * NPCX
+ TMap_Matrix_Inv (0, 1) * NPCY
+ TMap_Matrix_Inv (0, 2) * NPCZ
+ TMap_Matrix_Inv (0, 3);
VRCY = TMap_Matrix_Inv (1, 0) * NPCX
+ TMap_Matrix_Inv (1, 1) * NPCY
+ TMap_Matrix_Inv (1, 2) * NPCZ
+ TMap_Matrix_Inv (1, 3);
VRCZ = TMap_Matrix_Inv (2, 0) * NPCX
+ TMap_Matrix_Inv (2, 1) * NPCY
+ TMap_Matrix_Inv (2, 2) * NPCZ
+ TMap_Matrix_Inv (2, 3);
VRCT = TMap_Matrix_Inv (3, 0) * NPCX
+ TMap_Matrix_Inv (3, 1) * NPCY
+ TMap_Matrix_Inv (3, 2) * NPCZ
+ TMap_Matrix_Inv (3, 3);
// VRCS -> WCS World Coordinate Space
// PtWC = Ori_Matrix_Inv.Multiplied (PtVRC);
WCX = TOri_Matrix_Inv (0, 0) * VRCX
+ TOri_Matrix_Inv (0, 1) * VRCY
+ TOri_Matrix_Inv (0, 2) * VRCZ
+ TOri_Matrix_Inv (0, 3) * VRCT;
WCY = TOri_Matrix_Inv (1, 0) * VRCX
+ TOri_Matrix_Inv (1, 1) * VRCY
+ TOri_Matrix_Inv (1, 2) * VRCZ
+ TOri_Matrix_Inv (1, 3) * VRCT;
WCZ = TOri_Matrix_Inv (2, 0) * VRCX
+ TOri_Matrix_Inv (2, 1) * VRCY
+ TOri_Matrix_Inv (2, 2) * VRCZ
+ TOri_Matrix_Inv (2, 3) * VRCT;
WCT = TOri_Matrix_Inv (3, 0) * VRCX
+ TOri_Matrix_Inv (3, 1) * VRCY
+ TOri_Matrix_Inv (3, 2) * VRCZ
+ TOri_Matrix_Inv (3, 3) * VRCT;
if (WCT != 0.) {
Proj.SetCoord (WCX/WCT, WCY/WCT, WCZ/WCT);
Proj.Normalize();
}
else
Proj.SetCoord (0., 0., 0.);
}
}
}
Standard_Boolean Visual3d_ViewManager::ViewExists (const Handle(Aspect_Window)& AWindow, Graphic3d_CView& TheCView) const {
Standard_Boolean Exist = Standard_False;
// Parse the list of views to find
// a view with the specified window
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
#if defined(_WIN32) || defined(__WIN32__)
const Handle(WNT_Window) THEWindow = Handle(WNT_Window)::DownCast (AWindow);
Aspect_Handle TheSpecifiedWindowId = THEWindow->HWindow ();
#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
const Handle(Cocoa_Window) THEWindow = Handle(Cocoa_Window)::DownCast (AWindow);
NSView* TheSpecifiedWindowId = THEWindow->HView();
#else
const Handle(Xw_Window) THEWindow = Handle(Xw_Window)::DownCast (AWindow);
int TheSpecifiedWindowId = int (THEWindow->XWindow ());
#endif
while ((! Exist) && (MyIterator.More ())) {
if ( ((MyIterator.Value ())->IsDefined ()) &&
((MyIterator.Value ())->IsActive ()) ) {
const Handle(Aspect_Window) AspectWindow = (MyIterator.Value ())->Window ();
#if defined(_WIN32) || defined(__WIN32__)
const Handle(WNT_Window) theWindow = Handle(WNT_Window)::DownCast (AspectWindow);
Aspect_Handle TheWindowIdOfView = theWindow->HWindow ();
#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
const Handle(Cocoa_Window) theWindow = Handle(Cocoa_Window)::DownCast (AspectWindow);
NSView* TheWindowIdOfView = theWindow->HView();
#else
const Handle(Xw_Window) theWindow = Handle(Xw_Window)::DownCast (AspectWindow);
int TheWindowIdOfView = int (theWindow->XWindow ());
#endif // WNT
// Comparaison on window IDs
if (TheWindowIdOfView == TheSpecifiedWindowId) {
Exist = Standard_True;
TheCView = *(Graphic3d_CView* )(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);
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
//
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)
{
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
while (MyIterator.More())
{
if ((MyIterator.Value())->Identification () == aViewId)
{
const Handle(Visual3d_View)& theView = MyIterator.Value();
//remove the view from the list
MyDefinedView.Remove(theView);
break;
}
// go to next
MyIterator.Next ();
}
MyViewGenId.Free(aViewId);
}
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);
}
//=======================================================================
//function : ChangeZLayer
//purpose :
//=======================================================================
void Visual3d_ViewManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
const Standard_Integer theLayerId)
{
if (!myLayerIds.Contains (theLayerId))
return;
// change display layer for structure in all views
if (MyDisplayedStructure.Contains (theStructure))
{
Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView);
for ( ; aViewIt.More (); aViewIt.Next ())
(aViewIt.Value ())->ChangeZLayer (theStructure, theLayerId);
}
// tell graphic driver to update the structure's display layer
MyGraphicDriver->ChangeZLayer (
(*(Graphic3d_CStructure*)theStructure->CStructure ()), theLayerId);
}
//=======================================================================
//function : GetZLayer
//purpose :
//=======================================================================
Standard_Integer Visual3d_ViewManager::GetZLayer (const Handle(Graphic3d_Structure)& theStructure) const
{
Graphic3d_CStructure& aStructure =
(*(Graphic3d_CStructure*)theStructure->CStructure ());
return MyGraphicDriver->GetZLayer (aStructure);
}
//=======================================================================
//function : AddZLayer
//purpose :
//=======================================================================
Standard_Boolean Visual3d_ViewManager::AddZLayer (Standard_Integer& theLayerId)
{
try
{
OCC_CATCH_SIGNALS
theLayerId = getZLayerGenId ().Next ();
myLayerIds.Add (theLayerId);
myLayerSeq.Append (theLayerId);
}
catch (Aspect_IdentDefinitionError)
{
// new index can't be generated
return Standard_False;
}
// tell all managed views to remove display layers
Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView);
for ( ; aViewIt.More (); aViewIt.Next ())
(aViewIt.Value ())->AddZLayer (theLayerId);
return Standard_True;
}
//=======================================================================
//function : RemoveZLayer
//purpose :
//=======================================================================
Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theLayerId)
{
if (!myLayerIds.Contains (theLayerId) || theLayerId == 0)
return Standard_False;
// tell all managed views to remove display layers
Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView);
for ( ; aViewIt.More (); aViewIt.Next ())
(aViewIt.Value ())->RemoveZLayer (theLayerId);
MyGraphicDriver->UnsetZLayer (theLayerId);
// remove index
for (int aIdx = 1; aIdx <= myLayerSeq.Length (); aIdx++)
if (myLayerSeq(aIdx) == theLayerId)
{
myLayerSeq.Remove (aIdx);
break;
}
myLayerIds.Remove (theLayerId);
getZLayerGenId ().Free (theLayerId);
return Standard_True;
}
//=======================================================================
//function : GetAllZLayers
//purpose :
//=======================================================================
void Visual3d_ViewManager::GetAllZLayers (TColStd_SequenceOfInteger& theLayerSeq) const
{
theLayerSeq.Assign (myLayerSeq);
}
//=======================================================================
//function : getZLayerGenId
//purpose :
//=======================================================================
Aspect_GenId& Visual3d_ViewManager::getZLayerGenId ()
{
static Aspect_GenId aGenId (1, IntegerLast());
return aGenId;
}
//=======================================================================
//function : InstallZLayers
//purpose :
//=======================================================================
void Visual3d_ViewManager::InstallZLayers(const Handle(Visual3d_View)& theView) const
{
if (!MyDefinedView.Contains (theView))
return;
// erase and insert layers iteratively to provide the same layer order as
// in the view manager's sequence. This approach bases on the layer insertion
// order: the new layers are always appended to the end of the list
// inside of view, while layer remove operation doesn't affect the order.
// Starting from second layer : no need to change the default z layer.
for (Standard_Integer aSeqIdx = 2; aSeqIdx <= myLayerSeq.Length (); aSeqIdx++)
{
Standard_Integer aLayerID = myLayerSeq.Value (aSeqIdx);
theView->RemoveZLayer (aLayerID);
theView->AddZLayer (aLayerID);
}
}