X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOCCViewer%2FOCCViewer_ViewPort3d.cxx;h=5e927fbb3eda784eef72f747ab9e65b2e29dd368;hb=77a9b7ac9d8b364358e1760e74a44e86557b79aa;hp=34cce7126241e89dbee36483c559c718bbca5394;hpb=22848c5a37cca698c3499080b49212bbcae0d93f;p=modules%2Fgui.git diff --git a/src/OCCViewer/OCCViewer_ViewPort3d.cxx b/src/OCCViewer/OCCViewer_ViewPort3d.cxx index 34cce7126..5e927fbb3 100755 --- a/src/OCCViewer/OCCViewer_ViewPort3d.cxx +++ b/src/OCCViewer/OCCViewer_ViewPort3d.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -26,10 +26,10 @@ #include "OCCViewer_ViewWindow.h" #include "OCCViewer_ViewModel.h" -#include - #include #include +#include +#include #include #include @@ -41,15 +41,20 @@ #include #include + +#if OCC_VERSION_LARGE > 0x06070100 +#include +#else #include #include +#endif #include "utilities.h" -#if defined WNT +#if defined WIN32 #include #else -#include +//#include #endif static double rx = 0.; @@ -72,6 +77,9 @@ OCCViewer_ViewPort3d::OCCViewer_ViewPort3d( QWidget* parent, const Handle( V3d_V // VSR: 01/07/2010 commented to avoid SIGSEGV at SALOME exit //selectVisualId(); +#if OCC_VERSION_LARGE > 0x06070100 + myActiveView = new V3d_View( viewer, type ); +#else if ( type == V3d_ORTHOGRAPHIC ) { myOrthoView = new V3d_OrthographicView( viewer ); myActiveView = myOrthoView; @@ -80,7 +88,11 @@ OCCViewer_ViewPort3d::OCCViewer_ViewPort3d( QWidget* parent, const Handle( V3d_V myPerspView = new V3d_PerspectiveView( viewer ); myActiveView = myPerspView; } - setBackground( Qtx::BackgroundData( Qt::black ) ); // set default background +#endif + + setDefaultParams(); + + myCursor = NULL; } /*! @@ -88,7 +100,13 @@ OCCViewer_ViewPort3d::OCCViewer_ViewPort3d( QWidget* parent, const Handle( V3d_V */ OCCViewer_ViewPort3d::~OCCViewer_ViewPort3d() { - emit vpClosed(); + if ( myCursor ) + { + delete myCursor; + myCursor = NULL; + } + + emit vpClosed(this); Handle(V3d_View) aView = activeView(); if (!aView.IsNull()) aView->Remove(); @@ -126,17 +144,7 @@ bool OCCViewer_ViewPort3d::mapView( const Handle(V3d_View)& view ) view->View()->Deactivate(); } - /* create static trihedron (16551: EDF PAL 501) */ - OCCViewer_ViewWindow* aVW = dynamic_cast( parentWidget()->parentWidget()->parentWidget() ); - if ( aVW ) { - OCCViewer_Viewer* aViewModel = dynamic_cast( aVW->getViewManager()->getViewModel() ); - if ( aViewModel && aViewModel->isStaticTrihedronDisplayed() ){ - view->ZBufferTriedronSetup(); - view->TriedronDisplay( Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.05, V3d_ZBUFFER ); - } - } - - emit( vpMapped() ); + emit( vpMapped(this) ); return true; } @@ -226,13 +234,16 @@ bool OCCViewer_ViewPort3d::syncronize( const OCCViewer_ViewPort3d* ref ) refView->Up( x, y, z ); tgtView->SetUp( x, y, z ); refView->Eye( x, y, z ); tgtView->SetEye( x, y, z ); refView->Proj( x, y, z ); tgtView->SetProj( x, y, z ); +#if OCC_VERSION_LARGE <= 0x06070100 refView->Center( x, y ); tgtView->SetCenter( x, y ); +#endif tgtView->SetScale( refView->Scale() ); tgtView->SetTwist( refView->Twist() ); /* update */ tgtView->Update(); tgtView->SetImmediateUpdate( Standard_True ); + tgtView->ZFitAll(); return true; } @@ -312,22 +323,6 @@ void OCCViewer_ViewPort3d::updateBackground() if ( activeView().IsNull() ) return; if ( !myBackground.isValid() ) return; - // VSR: Important note on below code. - // In OCCT (in version 6.5.2), things about the background drawing - // are not straightforward and not clearly understandable: - // - Horizontal gradient is drawn vertically (!), well ok, from top side to bottom one. - // - Vertical gradient is drawn horizontally (!), from right side to left one (!!!). - // - First and second diagonal gradients are confused. - // - Image texture, once set, can not be removed (!). - // - Texture image fill mode Aspect_FM_NONE is not taken into account (and means the same - // as Aspect_FM_CENTERED). - // - The only way to cancel gradient background (and get back to single colored) is to - // set gradient background style to Aspect_GFM_NONE while passing two colors is also needed - // (see V3d_View::SetBgGradientColors() function). - // - Also, it is impossible to draw texture image above the gradiented background (only above - // single-colored). - // In OCCT 6.5.3 all above mentioned problems are fixed; so, above comment should be removed as soon - // as SALOME is migrated to OCCT 6.5.3. The same concerns #ifdef statements in the below code switch ( myBackground.mode() ) { case Qtx::ColorBackground: { @@ -336,13 +331,8 @@ void OCCViewer_ViewPort3d::updateBackground() // Unset texture should be done here // ... Quantity_Color qCol( c.red()/255., c.green()/255., c.blue()/255., Quantity_TOC_RGB ); -#if OCC_VERSION_LARGE > 0x06050200 // available since OCCT 6.5.3 activeView()->SetBgGradientStyle( Aspect_GFM_NONE ); // cancel gradient background activeView()->SetBgImageStyle( Aspect_FM_NONE ); // cancel texture background -#else - // cancel gradient background (in OCC before v6.5.3 the only way to do this is to set it to NONE type passing arbitrary colors as parameters) - activeView()->SetBgGradientColors( qCol, qCol, Aspect_GFM_NONE ); -#endif // then change background color activeView()->SetBackgroundColor( qCol ); // update viewer @@ -364,38 +354,16 @@ void OCCViewer_ViewPort3d::updateBackground() activeView()->SetBgImageStyle( Aspect_FM_NONE ); // cancel texture background switch ( type ) { case OCCViewer_Viewer::HorizontalGradient: -#if OCC_VERSION_LARGE > 0x06050200 // available since OCCT 6.5.3 activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_HOR, Standard_True ); -#else - // in OCCT before v6.5.3, to draw horizontal gradient it's necessary to use Aspect_GFM_VER type - // and interchange the colors - activeView()->SetBgGradientColors( qCol2, qCol1, Aspect_GFM_VER, Standard_True ); -#endif break; case OCCViewer_Viewer::VerticalGradient: -#if OCC_VERSION_LARGE > 0x06050200 // available since OCCT 6.5.3 activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_VER, Standard_True ); -#else - // in OCCT before v6.5.3, to draw vertical gradient it's necessary to use Aspect_GFM_HOR type - activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_HOR, Standard_True ); -#endif break; case OCCViewer_Viewer::Diagonal1Gradient: -#if OCC_VERSION_LARGE > 0x06050200 // available since OCCT 6.5.3 activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_DIAG1, Standard_True ); -#else - // in OCCT before v6.5.3, to draw 1st dialognal gradient it's necessary to use Aspect_GFM_DIAG2 type - // and interchange the colors - activeView()->SetBgGradientColors( qCol2, qCol1, Aspect_GFM_DIAG2, Standard_True ); -#endif break; case OCCViewer_Viewer::Diagonal2Gradient: -#if OCC_VERSION_LARGE > 0x06050200 // available since OCCT 6.5.3 activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_DIAG2, Standard_True ); -#else - // in OCCT before v6.5.3, to draw 2nd dialognal gradient it's necessary to use Aspect_GFM_DIAG1 type - activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_DIAG1, Standard_True ); -#endif break; case OCCViewer_Viewer::Corner1Gradient: activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_CORNER1, Standard_True ); @@ -423,9 +391,6 @@ void OCCViewer_ViewPort3d::updateBackground() default: break; } -#if OCC_VERSION_LARGE > 0x06050200 // available since OCCT 6.5.3 - // VSR: In OCCT before v6.5.3 below code can't be used because of very ugly bug - it has been impossible to - // clear the background texture image as soon as it was once set to the viewer. if ( myBackground.isTextureShown() ) { QString fileName; int textureMode = myBackground.texture( fileName ); @@ -448,7 +413,6 @@ void OCCViewer_ViewPort3d::updateBackground() activeView()->Update(); } } -#endif } /*! @@ -476,10 +440,8 @@ void OCCViewer_ViewPort3d::fitRect( const QRect& rect ) */ void OCCViewer_ViewPort3d::startZoomAtPoint( int x, int y ) { -#if OCC_VERSION_LARGE > 0x0603000A // available only with OCC-6.3-sp11 and higher version if ( !activeView().IsNull() && isAdvancedZoomingEnabled() ) activeView()->StartZoomAtPoint( x, y ); -#endif } /*! @@ -491,11 +453,9 @@ void OCCViewer_ViewPort3d::zoom( int x0, int y0, int x, int y ) // as OCCT respects a sign of only dx, // but we want both signes to be taken into account //activeView()->Zoom( x0, y0, x, y ); -#if OCC_VERSION_LARGE > 0x0603000A // available only with OCC-6.3-sp11 and higher version if ( isAdvancedZoomingEnabled() ) activeView()->ZoomAtPoint( x0, y0, x, y ); else -#endif activeView()->Zoom( x0 + y0, 0, x + y, 0 ); emit vpTransformed( this ); } @@ -564,7 +524,8 @@ void OCCViewer_ViewPort3d::startRotation( int x, int y, default: break; } - activeView()->DepthFitAll(); + // VSR: 10.06.2015: next line commented out - causes ugly blinking on starting rotation with Perspective projection mode + //activeView()->DepthFitAll(); } } @@ -611,8 +572,10 @@ void OCCViewer_ViewPort3d::rotate( int x, int y, void OCCViewer_ViewPort3d::endRotation() { if ( !activeView().IsNull() ) { - activeView()->ZFitAll(1.); - activeView()->SetZSize(0.); + activeView()->ZFitAll( 1.0 ); +#if OCC_VERSION_LARGE <= 0x06070100 + activeView()->SetZSize( 0.0 ); +#endif activeView()->Update(); emit vpTransformed( this ); } @@ -623,7 +586,7 @@ void OCCViewer_ViewPort3d::endRotation() */ void OCCViewer_ViewPort3d::paintEvent( QPaintEvent* e ) { -#ifndef WNT +#ifndef WIN32 /* X11 : map before show doesn't work */ if ( !mapped( activeView() ) ) mapView( activeView() ); @@ -643,7 +606,7 @@ void OCCViewer_ViewPort3d::paintEvent( QPaintEvent* e ) */ void OCCViewer_ViewPort3d::resizeEvent( QResizeEvent* e ) { -#ifdef WNT +#ifdef WIN32 /* Win32 : map before first show to avoid flicker */ if ( !mapped( activeView() ) ) mapView( activeView() ); @@ -653,6 +616,17 @@ void OCCViewer_ViewPort3d::resizeEvent( QResizeEvent* e ) activeView()->MustBeResized(); } +/*! + Moved the viewport +*/ +/* +void OCCViewer_ViewPort3d::repaintViewAfterMove( ) +{ + if ( !activeView().IsNull() ){ + activeView()->MustBeResized(); + } +} +*/ /*! Fits all objects in view. [ virtual protected ] */ @@ -665,7 +639,14 @@ void OCCViewer_ViewPort3d::fitAll( bool keepScale, bool withZ, bool upd ) myScale = activeView()->Scale(); Standard_Real margin = 0.01; + +#if OCC_VERSION_LARGE > 0x06070100 + activeView()->FitAll( margin, upd ); + if(withZ) + activeView()->ZFitAll(); +#else activeView()->FitAll( margin, withZ, upd ); +#endif activeView()->SetZSize(0.); emit vpTransformed( this ); } @@ -774,8 +755,12 @@ bool OCCViewer_ViewPort3d::synchronize( OCCViewer_ViewPort* view ) Handle(V3d_View) aView3d = getView(); Handle(V3d_View) aRefView3d = vp3d->getView(); aView3d->SetImmediateUpdate( Standard_False ); +#if OCC_VERSION_LARGE > 0x06070100 + aView3d->Camera()->Copy( aRefView3d->Camera() ); +#else aView3d->SetViewMapping( aRefView3d->ViewMapping() ); aView3d->SetViewOrientation( aRefView3d->ViewOrientation() ); +#endif aView3d->ZFitAll(); aView3d->SetImmediateUpdate( Standard_True ); aView3d->Update(); @@ -788,18 +773,58 @@ bool OCCViewer_ViewPort3d::synchronize( OCCViewer_ViewPort* view ) /* * Show/Hide static triedron */ -void OCCViewer_ViewPort3d::updateStaticTriedronVisibility() { - OCCViewer_ViewWindow* aVW = dynamic_cast( parentWidget()->parentWidget()->parentWidget() ); - if ( aVW ) { - OCCViewer_Viewer* aViewModel = dynamic_cast( aVW->getViewManager()->getViewModel() ); - Handle(V3d_View) aView = activeView(); - if ( aViewModel ){ - if(aViewModel->isStaticTrihedronDisplayed()) { - aView->TriedronDisplay( Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.05, V3d_ZBUFFER ); - } else { - aView->TriedronErase(); - } - aView->Update(); - } +void OCCViewer_ViewPort3d::showStaticTrihedron( bool on ) +{ + Handle(V3d_View) aView = activeView(); + if ( !aView ) return; + + if ( on ) { + aView->ZBufferTriedronSetup(); + aView->TriedronDisplay( Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.05, V3d_ZBUFFER ); + } else { + aView->TriedronErase(); } + aView->Update(); +} + +/* + * Create default cursor with a specific shape + */ +void OCCViewer_ViewPort3d::setDefaultCursor( Qt::CursorShape theCursorShape ) +{ + if ( !myCursor ) + myCursor = new QCursor(); + + myCursor->setShape( theCursorShape ); +} + +/* + * Get default cursor with a specific shape + */ +QCursor* OCCViewer_ViewPort3d::getDefaultCursor() const +{ + return myCursor; +} + +/* + * Set default parameters from preferences + */ +void OCCViewer_ViewPort3d::setDefaultParams() +{ + setBackground( Qtx::BackgroundData( Qt::black ) ); // set default background + + // get ray tracing parameters from preferences + int aDepth = SUIT_Session::session()->resourceMgr()->integerValue( "OCCViewer", "rt_depth", 3 ); + bool aReflection = SUIT_Session::session()->resourceMgr()->booleanValue( "OCCViewer", "rt_reflection", true ); + bool anAntialiasing = SUIT_Session::session()->resourceMgr()->booleanValue( "OCCViewer", "rt_antialiasing", false ); + bool aShadow = SUIT_Session::session()->resourceMgr()->booleanValue( "OCCViewer", "rt_shadow", true ); + bool aTransparentShadow = SUIT_Session::session()->resourceMgr()->booleanValue( "OCCViewer", "rt_trans_shadow", true ); + + Graphic3d_RenderingParams& aParams = myActiveView->ChangeRenderingParams(); + aParams.RaytracingDepth = aDepth; + aParams.IsReflectionEnabled = aReflection; + aParams.IsAntialiasingEnabled = anAntialiasing; + aParams.IsShadowEnabled = aShadow; + aParams.IsTransparentShadowEnabled = aTransparentShadow; + myActiveView->Redraw(); }