X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOBJECT%2FGEOM_Actor.cxx;h=bc9c5c9f19dee6f0d1792b8d58a7d30acb3cac60;hb=4d4cef4054e35fe6b16c7ba463f5360516d704ec;hp=675ffd06980f8ff8c6c7c46233d32ff6015c9fec;hpb=50a3c17fdbc781ba084b1d13fda020e0b5e81773;p=modules%2Fgeom.git diff --git a/src/OBJECT/GEOM_Actor.cxx b/src/OBJECT/GEOM_Actor.cxx index 675ffd069..bc9c5c9f1 100644 --- a/src/OBJECT/GEOM_Actor.cxx +++ b/src/OBJECT/GEOM_Actor.cxx @@ -1,23 +1,23 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2011 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 +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// 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. +// 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. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // GEOM OBJECT : interactive object for Geometry entities visualization @@ -37,6 +37,7 @@ #include "GEOM_EdgeSource.h" #include "GEOM_WireframeFace.h" #include "GEOM_ShadingFace.h" +#include "GEOM_PainterPolyDataMapper.h" #include "SVTK_Actor.h" #include @@ -74,9 +75,15 @@ #endif GEOM_Actor::GEOM_Actor(): + isOnlyVertex(false), + + myDeflection(-1), + myIsForced(false), + // myDisplayMode(eWireframe), myIsSelected(false), myVectorMode(false), + myVertexActor(GEOM_DeviceActor::New(),true), myVertexSource(GEOM_VertexSource::New(),true), @@ -97,12 +104,17 @@ GEOM_Actor::GEOM_Actor(): myHighlightActor(GEOM_DeviceActor::New(),true), myAppendFilter(vtkAppendPolyData::New(),true), - myPolyDataMapper(vtkPolyDataMapper::New(),true), + // Use mapper as an instance of GEOM_PainterPolyDataMapper class + // to prevent drawing of mappers' content (due to an empty definition + // of GEOM_PainterPolyDataMapper::RenderPiece(...)). + // !!! Presentation of GEOM_Actor is drawing only with help of actors + // defined in this class !!! + myPolyDataMapper(GEOM_PainterPolyDataMapper::New(),true), myHighlightProp(vtkProperty::New()), myPreHighlightProp(vtkProperty::New()), myShadingFaceProp(vtkProperty::New()), - isOnlyVertex(false) + myShadingBackFaceProp(vtkProperty::New()) { #ifdef MYDEBUG MESSAGE (this<< " GEOM_Actor::GEOM_Actor"); @@ -135,13 +147,13 @@ GEOM_Actor::GEOM_Actor(): aProperty->SetPointSize(3); aProperty->SetColor(1, 1, 0); - myAppendFilter->AddInput(myIsolatedEdgeSource->GetOutput()); + myAppendFilter->AddInput(myIsolatedEdgeSource->GetOutput()); myIsolatedEdgeActor->SetInput(myIsolatedEdgeSource->GetOutput(),false); aProperty = myIsolatedEdgeActor->GetProperty(); aProperty->SetRepresentation(VTK_WIREFRAME); aProperty->SetColor(1, 0, 0); - myAppendFilter->AddInput(myOneFaceEdgeSource->GetOutput()); + myAppendFilter->AddInput(myOneFaceEdgeSource->GetOutput()); myOneFaceEdgeActor->SetInput(myOneFaceEdgeSource->GetOutput(),false); aProperty = myOneFaceEdgeActor->GetProperty(); aProperty->SetRepresentation(VTK_WIREFRAME); @@ -161,7 +173,7 @@ GEOM_Actor::GEOM_Actor(): myShadingFaceActor->SetInput(myShadingFaceSource->GetOutput(),true); - myShadingFaceProp->SetRepresentation(VTK_SURFACE); + myShadingFaceProp->SetRepresentation(VTKViewer::Representation::Surface); myShadingFaceProp->SetInterpolationToGouraud(); myShadingFaceProp->SetAmbient(1.0); myShadingFaceProp->SetDiffuse(1.0); @@ -172,10 +184,14 @@ GEOM_Actor::GEOM_Actor(): myShadingFaceActor->SetProperty(myShadingFaceProp.GetPointer()); + StoreBoundaryColors(); + + myNbIsos[0] = -1; + myNbIsos[1] = -1; + // Toggle display mode setDisplayMode(0); // WIRE FRAME SetVectorMode(0); // - } @@ -187,6 +203,7 @@ GEOM_Actor::~GEOM_Actor() myHighlightProp->Delete(); myPreHighlightProp->Delete(); myShadingFaceProp->Delete(); + myShadingBackFaceProp->Delete(); } GEOM_Actor* @@ -277,8 +294,45 @@ GEOM_Actor:: setDisplayMode(int theMode) { #ifdef MYDEBUG - MESSAGE ( "GEOM_Actor::SetDisplayMode = "<SetProperty(Prop); } + +vtkProperty* GEOM_Actor::GetWireframeProperty() +{ + return myWireframeFaceActor->GetProperty(); +} + void GEOM_Actor::SetShadingProperty(vtkProperty* Prop) { #ifdef MYDEBUG @@ -450,6 +512,12 @@ void GEOM_Actor::SetShadingProperty(vtkProperty* Prop) } +vtkProperty* GEOM_Actor::GetShadingProperty() +{ + return myShadingFaceProp; +} + + void GEOM_Actor::Render(vtkRenderer *ren, vtkMapper *theMapper) { #ifdef MYDEBUG @@ -472,11 +540,12 @@ void GEOM_Actor::Render(vtkRenderer *ren, vtkMapper *theMapper) } switch(myDisplayMode){ - case 0://wireframe + case eWireframe://wireframe myPreHighlightProp->SetRepresentationToWireframe(); myHighlightProp->SetRepresentationToWireframe(); break; - case 1://shading + case eShading://shading + case eShadingWithEdges://shading with edges myPreHighlightProp->SetRepresentationToSurface(); myHighlightProp->SetRepresentationToSurface(); break; @@ -486,14 +555,17 @@ void GEOM_Actor::Render(vtkRenderer *ren, vtkMapper *theMapper) if(myIsPreselected){ this->myHighlightActor->SetProperty(myPreHighlightProp.GetPointer()); myShadingFaceActor->SetProperty(myPreHighlightProp.GetPointer()); + myShadingFaceActor->SetBackfaceProperty(myPreHighlightProp.GetPointer()); } else { this->myHighlightActor->SetProperty(myShadingFaceProp.GetPointer()); myShadingFaceActor->SetProperty(myShadingFaceProp.GetPointer()); + myShadingFaceActor->SetBackfaceProperty(myShadingBackFaceProp.GetPointer()); } } else{ this->myHighlightActor->SetProperty(myHighlightProp.GetPointer()); myShadingFaceActor->SetProperty(myHighlightProp.GetPointer()); + myShadingFaceActor->SetBackfaceProperty(myHighlightProp.GetPointer()); } this->Property->Render(this, ren); @@ -539,7 +611,7 @@ void GEOM_Actor::ShallowCopy(vtkProp *prop) GEOM_Actor *f = GEOM_Actor::SafeDownCast(prop); if ( f != NULL ) { - this->SetShape(f->getTopo(),f->GetDeflection(),f->GetIsRelative()); + this->SetShape(f->getTopo(),f->GetDeflection()); } // Now do superclass @@ -597,13 +669,14 @@ void GEOM_Actor::highlight(bool highlight) #ifdef MYDEBUG MESSAGE ( this << " GEOM_Actor::highlight highlight="<SetOpacity(opa); + myShadingBackFaceProp->SetOpacity(opa); myHighlightProp->SetOpacity(opa); myPreHighlightProp->SetOpacity(opa); myVertexActor->GetProperty()->SetOpacity(opa); @@ -619,10 +692,15 @@ void GEOM_Actor::SetColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloat { // enk:tested OK myShadingFaceProp->SetColor(r,g,b); // shading color (Shading) - myIsolatedEdgeActor->GetProperty()->SetColor(r,g,b); // standalone edge color (Wireframe) + myShadingBackFaceProp->SetColor(r,g,b); // back face shading color (Shading) myVertexActor->GetProperty()->SetColor(r,g,b); // vertex actor (Shading/Wireframe) - myOneFaceEdgeActor->GetProperty()->SetColor(r,g,b); // standalone face edge color (Wireframe) - mySharedEdgeActor->GetProperty()->SetColor(r,g,b); // share edge color (Wireframe) + if ( myDisplayMode != (int)eShadingWithEdges ) { + myIsolatedEdgeActor->GetProperty()->SetColor(r,g,b); // standalone edge color (Wireframe) + myOneFaceEdgeActor->GetProperty()->SetColor(r,g,b); // standalone face edge color (Wireframe) + mySharedEdgeActor->GetProperty()->SetColor(r,g,b); // share edge color (Wireframe) + } + + StoreBoundaryColors(); } void GEOM_Actor::GetColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b) @@ -635,6 +713,93 @@ void GEOM_Actor::GetColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFlo b = aRGB[2]; } +void GEOM_Actor::SetMaterial(std::vector theProps) +{ + int aSize = theProps.size(); + + if ( aSize < 1 || aSize > 2) + return; + + // theProps[0] -- front material properties + // theProps[1] -- back material properties (if exist) + // If there are no back material properties, + // we get front material properties as back material + + double aCoefnt; + + // Set reflection coefficients + aCoefnt = theProps[0]->GetAmbient(); + myShadingFaceProp->SetAmbient(aCoefnt); + myVertexActor->GetProperty()->SetAmbient(aCoefnt); + if ( aSize == 2 ) + aCoefnt = theProps[1]->GetAmbient(); + myShadingBackFaceProp->SetAmbient(aCoefnt); + + // Set diffuse coefficients + aCoefnt = theProps[0]->GetDiffuse(); + myShadingFaceProp->SetDiffuse(aCoefnt); + myVertexActor->GetProperty()->SetDiffuse(aCoefnt); + if ( aSize == 2 ) + aCoefnt = theProps[1]->GetDiffuse(); + myShadingBackFaceProp->SetDiffuse(aCoefnt); + + // Set specular coefficients + aCoefnt = theProps[0]->GetSpecular(); + myShadingFaceProp->SetSpecular(aCoefnt); + myVertexActor->GetProperty()->SetSpecular(aCoefnt); + if ( aSize == 2 ) + aCoefnt = theProps[1]->GetSpecular(); + myShadingBackFaceProp->SetSpecular(aCoefnt); + + + double* aColor; + + // Set reflection colors + aColor = theProps[0]->GetAmbientColor(); + myShadingFaceProp->SetAmbientColor(aColor[0], aColor[1], aColor[2]); + myVertexActor->GetProperty()->SetAmbientColor(aColor[0], aColor[1], aColor[2]); + if ( aSize == 2 ) + aColor = theProps[1]->GetAmbientColor(); + myShadingBackFaceProp->SetAmbientColor(aColor[0], aColor[1], aColor[2]); + + // Set diffuse colors + aColor = theProps[0]->GetDiffuseColor(); + myShadingFaceProp->SetDiffuseColor(aColor[0], aColor[1], aColor[2]); + myVertexActor->GetProperty()->SetDiffuseColor(aColor[0], aColor[1], aColor[2]); + if ( aSize == 2 ) + aColor = theProps[1]->GetDiffuseColor(); + myShadingBackFaceProp->SetDiffuseColor(aColor[0], aColor[1], aColor[2]); + + // Set specular colors + aColor = theProps[0]->GetSpecularColor(); + myShadingFaceProp->SetSpecularColor(aColor[0], aColor[1], aColor[2]); + myVertexActor->GetProperty()->SetSpecularColor(aColor[0], aColor[1], aColor[2]); + if ( aSize == 2 ) + aColor = theProps[1]->GetSpecularColor(); + myShadingBackFaceProp->SetSpecularColor(aColor[0], aColor[1], aColor[2]); + + // Set shininess + aCoefnt = theProps[0]->GetSpecularPower(); + myShadingFaceProp->SetSpecularPower(aCoefnt); + myVertexActor->GetProperty()->SetSpecularPower(aCoefnt); + if ( aSize == 2 ) + aCoefnt = theProps[1]->GetSpecularPower(); + myShadingBackFaceProp->SetSpecularPower(aCoefnt); + + // Set back face material property + myShadingFaceActor->SetBackfaceProperty(myShadingBackFaceProp.GetPointer()); +} + +vtkProperty* GEOM_Actor::GetFrontMaterial() +{ + return myShadingFaceProp; +} + +vtkProperty* GEOM_Actor::GetBackMaterial() +{ + return myShadingBackFaceProp; +} + bool GEOM_Actor::IsInfinitive() { return ((bool)myShape.Infinite() || isOnlyVertex); @@ -651,7 +816,15 @@ GEOM_Actor #ifdef MYDEBUG MESSAGE ( this << " GEOM_Actor::Highlight myIsSelected="<SetVisibility( false ); bool anIsPreselected = myIsPreselected; @@ -684,9 +865,9 @@ GEOM_Actor switch(aSelectionMode){ case ActorSelection : { - // cout << "=============== " << myIO->getEntry() << endl; - int nbio = mySelector->IObjectCount(); - // cout << " nbio = " << nbio << endl; +// cout << "=============== " << myIO->getEntry() << endl; +// int nbio = mySelector->IObjectCount(); +// cout << " nbio = " << nbio << endl; if( !mySelector->IsSelected( myIO ) ) { // printf ("!!!!!!!!!!!!!!!!\n"); @@ -813,3 +994,68 @@ void GEOM_Actor::GetMatrix(vtkCamera* theCam, vtkMatrix4x4 *result) matrix->Delete(); this->Transform->Pop(); } + +void GEOM_Actor::SetEdgesInShadingColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b) +{ + myEdgesInShadingColor[0] = r; + myEdgesInShadingColor[1] = g; + myEdgesInShadingColor[2] = b; +} + +void GEOM_Actor::StoreIsoNumbers() +{ + myWireframeFaceSource->GetNbIso(myNbIsos[0], myNbIsos[1]); +} + +void GEOM_Actor::SetIsosWidth(const int width) { + myWireframeFaceActor->GetProperty()->SetLineWidth(width); +} + +int GEOM_Actor::GetIsosWidth() const { + return (int)myWireframeFaceActor->GetProperty()->GetLineWidth(); +} + +void GEOM_Actor::SetWidth(const int width) { + myIsolatedEdgeActor->GetProperty()->SetLineWidth(width); + myOneFaceEdgeActor->GetProperty()->SetLineWidth(width); + mySharedEdgeActor->GetProperty()->SetLineWidth(width); + myHighlightProp->SetLineWidth(width); + myPreHighlightProp->SetLineWidth(width+1); + +} + +int GEOM_Actor::GetWidth() const { + return (int)myIsolatedEdgeActor->GetProperty()->GetLineWidth(); +} + +void GEOM_Actor::RestoreIsoNumbers() +{ + if ( myNbIsos[0] > 0 || myNbIsos[1] > 0 ) + // Restore number of U and (or) V iso lines + myWireframeFaceSource->SetNbIso(myNbIsos); +} + +void GEOM_Actor::ResetIsoNumbers() +{ + int aNb[2] = {0, 0}; + myWireframeFaceSource->SetNbIso(aNb); +} + +void GEOM_Actor::StoreBoundaryColors() +{ + myShadingFaceProp->GetColor(myEdgesInWireframeColor); + +} + +void GEOM_Actor::RestoreBoundaryColors() +{ + myIsolatedEdgeActor->GetProperty()->SetColor(myEdgesInWireframeColor[0], + myEdgesInWireframeColor[1], + myEdgesInWireframeColor[2]); + myOneFaceEdgeActor->GetProperty()->SetColor(myEdgesInWireframeColor[0], + myEdgesInWireframeColor[1], + myEdgesInWireframeColor[2]); + mySharedEdgeActor->GetProperty()->SetColor(myEdgesInWireframeColor[0], + myEdgesInWireframeColor[1], + myEdgesInWireframeColor[2]); +}