//  Copyright (C) 2007-2010  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
//
//  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.
//
//  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
//

//  GEOM OBJECT : interactive object for Geometry entities visualization
//  File   : GEOM_Actor.h
//  Author : Christophe ATTANASIO
//  Module : GEOM
//  $Header: /home/server/cvs/GEOM/GEOM_SRC/src/OBJECT/GEOM_Actor.h,v 1.11.2.3.10.1 2010-04-21 08:08:23 vsr Exp $
//
#ifndef GEOM_ACTOR_H
#define GEOM_ACTOR_H

#include "GEOM_OBJECT_defs.hxx"
#include "GEOM_SmartPtr.h"

#include <SALOME_Actor.h>

#include <TopoDS_Shape.hxx>
#include <vtkSmartPointer.h>

class vtkCamera;

class GEOM_VertexSource;
typedef GEOM_SmartPtr<GEOM_VertexSource> PVertexSource;

class GEOM_EdgeSource;
typedef GEOM_SmartPtr<GEOM_EdgeSource> PEdgeSource;

class GEOM_WireframeFace;
typedef GEOM_SmartPtr<GEOM_WireframeFace> PWFaceSource;

class GEOM_ShadingFace;
typedef GEOM_SmartPtr<GEOM_ShadingFace> PSFaceSource;

#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
class vtkRenderer;

class vtkAppendPolyData;
typedef GEOM_SmartPtr<vtkAppendPolyData> PAppendFilter;

class GEOM_OBJECT_EXPORT GEOM_Actor: public SALOME_Actor
{
public:
  vtkTypeMacro(GEOM_Actor,SALOME_Actor);
  static GEOM_Actor* New();

  void SetShape(const TopoDS_Shape& theShape,
                float theDeflection,
                bool theIsRelative,
                bool theIsVector = false);

  void SetDeflection(float theDeflection, bool theIsRelative);
  float GetDeflection() const{ return myDeflection;}
  bool GetIsRelative() const{ return myIsRelative;}

  void AddToRender(vtkRenderer* theRenderer);
  void RemoveFromRender(vtkRenderer* theRenderer);

  enum EDisplayMode{ eWireframe, eShading};

/*   void SetDisplayMode(EDisplayMode theMode);  */
/*   EDisplayMode GetDisplayMode() const { return myDisplayMode;}  */

  void SetSelected(bool theIsSelected);
  bool IsSelected() const { return myIsSelected;}

  // OLD METHODS
  // Properties
  void SetHighlightProperty(vtkProperty* Prop);
  void SetWireframeProperty(vtkProperty* Prop);
  void SetShadingProperty(vtkProperty* Prop);

  void setDeflection(double adef);
  virtual void setDisplayMode(int thenewmode);

  // Description:
  // This causes the actor to be rendered. It, in turn, will render the actor's
  // property and then mapper.
  virtual void Render(vtkRenderer *, vtkMapper *);
  // Description:
  // Release any graphics resources that are being consumed by this actor.
  // The parameter window could be used to determine which graphic
  // resources to release.
  void ReleaseGraphicsResources(vtkWindow *);
  const TopoDS_Shape& getTopo();
  void setInputShape(const TopoDS_Shape& ashape, double adef1,
                     int imode, bool isVector = false);
  double getDeflection();
  double isVector();

  // SubShape
  void SubShapeOn();
  void SubShapeOff();

  // Highlight
  virtual void highlight(bool theHighlight);
  virtual bool hasHighlight() { return true; }

  void ShallowCopy(vtkProp *prop);

  // Opacity
  void SetOpacity(vtkFloatingPointType opa);
  vtkFloatingPointType GetOpacity();

  // Color
  void SetColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b);
  void GetColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b);

  virtual bool IsInfinitive();

  // overloaded functions
  //! To map current selection to VTK representation
  virtual
  void
  Highlight(bool theHighlight);

  //----------------------------------------------------------------------------
  //! To process prehighlight (called from #SVTK_InteractorStyle)
  virtual
  bool
  PreHighlight(vtkInteractorStyle* theInteractorStyle,
               SVTK_SelectionEvent* theSelectionEvent,
               bool theIsHighlight);

  //! To process highlight (called from #SVTK_InteractorStyle)
  virtual
  bool
  Highlight(vtkInteractorStyle* theInteractorStyle,
            SVTK_SelectionEvent* theSelectionEvent,
            bool theIsHighlight);

  //! Visibility management
  virtual
  void
  SetVisibility( int );

  //! IsoLines management
  // theNb[0] - number of U lines
  // theNb[1] - number of V lines
  virtual
  void
  SetNbIsos(const int theNb[2]);

  virtual
  void
  GetNbIsos(int &theNbU,int &theNbV);
  
  //! Vector mode management
  virtual
  void
  SetVectorMode(const bool theMode);

  virtual
  bool
  GetVectorMode();

protected:
  void SetShape(const TopoDS_Shape& theShape,
                const TopTools_IndexedDataMapOfShapeListOfShape& theEdgeMap,
                bool theIsVector = false);

  void SetModified();

  void GetMatrix(vtkCamera* theCam, vtkMatrix4x4 *result);

  GEOM_Actor();
  ~GEOM_Actor();

private:
  TopoDS_Shape myShape;
  int myNbIsos[2];
  bool isOnlyVertex;

  float myDeflection;
  bool myIsRelative;
  bool myIsForced;

  //  EDisplayMode myDisplayMode;
  bool myIsSelected;
  bool myVectorMode;

  PDeviceActor myVertexActor;
  PVertexSource myVertexSource;

  PDeviceActor myIsolatedEdgeActor;
  PEdgeSource myIsolatedEdgeSource;

  PDeviceActor myOneFaceEdgeActor;
  PEdgeSource myOneFaceEdgeSource;

  PDeviceActor mySharedEdgeActor;
  PEdgeSource mySharedEdgeSource;

  PDeviceActor myWireframeFaceActor;
  PWFaceSource myWireframeFaceSource;

  PDeviceActor myShadingFaceActor;
  PSFaceSource myShadingFaceSource;

  PDeviceActor myHighlightActor;
  vtkSmartPointer<vtkProperty>  myHighlightProp;
  vtkSmartPointer<vtkProperty>  myPreHighlightProp;
  vtkSmartPointer<vtkProperty>  myShadingFaceProp;

  PAppendFilter myAppendFilter;
  PPolyDataMapper myPolyDataMapper;

  virtual void SetMapper(vtkMapper*);

  GEOM_Actor(const GEOM_Actor&);
  void operator=(const GEOM_Actor&);
};

#endif //GEOM_ACTOR_H
