/*=========================================================================

  Program:   Visualization Toolkit
  Module:    $RCSfile: vtkAngleRepresentation3D.h,v $

  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
// .NAME vtkAngleRepresentation3D - represent the vtkAngleWidget
// .SECTION Description
// The vtkAngleRepresentation3D is a representation for the
// vtkAngleWidget. This representation consists of two rays and three
// vtkHandleRepresentations to place and manipulate the three points defining
// the angle representation. (Note: the three points are referred to as Point1,
// Center, and Point2, at the two end points (Point1 and Point2) and Center
// (around which the angle is measured). This particular implementation is a 
// 3D representation, meaning that it draws in the overlay plane.

// .SECTION See Also
// vtkAngleWidget vtkHandleRepresentation


#ifndef __vtkAngleRepresentation3D_h
#define __vtkAngleRepresentation3D_h

#include "vtkAngleRepresentation.h"

class vtkActor;
class vtkProperty;
class vtkPolyDataMapper;
class vtkLineSource;
class vtkArcSource;
class vtkFollower;
class vtkVectorText;
class vtkPolyDataMapper;
class vtkTextProperty;

class VTK_WIDGETS_EXPORT vtkAngleRepresentation3D : public vtkAngleRepresentation
{
public:
  // Description:
  // Instantiate class.
  static vtkAngleRepresentation3D *New();

  // Description:
  // Standard VTK methods.
  vtkTypeRevisionMacro(vtkAngleRepresentation3D,vtkAngleRepresentation);
  void PrintSelf(ostream& os, vtkIndent indent);

  // Description:
  // Satisfy the superclasses API. Angle returned is in radians.
  virtual double GetAngle();

  // Description:
  // Methods to Set/Get the coordinates of the two points defining
  // this representation. Note that methods are available for both
  // display and world coordinates.
  virtual void GetPoint1WorldPosition(double pos[3]);
  virtual void GetCenterWorldPosition(double pos[3]);
  virtual void GetPoint2WorldPosition(double pos[3]);
  virtual void SetPoint1WorldPosition(double pos[3]);
  virtual void SetPoint1DisplayPosition(double pos[3]);
  virtual void SetCenterWorldPosition(double pos[3]);
  virtual void SetCenterDisplayPosition(double pos[3]);
  virtual void SetPoint2WorldPosition(double pos[3]);
  virtual void SetPoint2DisplayPosition(double pos[3]);
  virtual void GetPoint1DisplayPosition(double pos[3]);
  virtual void GetCenterDisplayPosition(double pos[3]);
  virtual void GetPoint2DisplayPosition(double pos[3]);

  // Description:
  // Set/Get the three leaders used to create this representation.
  // By obtaining these leaders the user can set the appropriate
  // properties, etc.
  vtkGetObjectMacro(Ray1,vtkActor);
  vtkGetObjectMacro(Ray2,vtkActor);
  vtkGetObjectMacro(Arc,vtkActor);
  vtkGetObjectMacro(TextActor,vtkFollower);
  
  // Description:
  // Scale text.
  virtual void SetTextActorScale( double scale[3] );
  virtual double * GetTextActorScale();
  
  // Description:
  // Method defined by vtkWidgetRepresentation superclass and
  // needed here.
  void BuildRepresentation();

  // Description:
  // Methods required by vtkProp superclass.
  virtual void ReleaseGraphicsResources(vtkWindow *w);
  virtual int RenderOpaqueGeometry(vtkViewport*);
  virtual int RenderTranslucentPolygonalGeometry(vtkViewport*);
  virtual int HasTranslucentPolygonalGeometry();

protected:
  vtkAngleRepresentation3D();
  ~vtkAngleRepresentation3D();

  // The pieces that make up the angle representations
  vtkLineSource     *Line1Source;  
  vtkLineSource     *Line2Source;  
  vtkArcSource      *ArcSource;  
  vtkPolyDataMapper *Line1Mapper;
  vtkPolyDataMapper *Line2Mapper;
  vtkPolyDataMapper *ArcMapper;
  vtkActor          *Ray1;
  vtkActor          *Ray2;
  vtkActor          *Arc;
  vtkFollower       *TextActor;
  vtkPolyDataMapper *TextMapper;
  vtkVectorText     *TextInput;
  double             Angle;
  bool               ScaleInitialized;
  double             TextPosition[3];

private:
  vtkAngleRepresentation3D(const vtkAngleRepresentation3D&);  //Not implemented
  void operator=(const vtkAngleRepresentation3D&);  //Not implemented
};

#endif
