// nUtil - An utility Library for gnurbs
// Copyright (C) 2008-2026 Eric Bechet
//
// See the LICENSE file for contributions and license information.
// Please report all bugs and problems to <bechet@cadxfem.org>.
//

#ifndef __VTKDISPLAY_H
#define __VTKDISPLAY_H

#include <vector>

#include <vtkSmartPointer.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include "nutil.h"

/// Display class.
class vtkdisplay : public ndisplay_base
{
protected :
  vtkSmartPointer<vtkRenderer> renderer;
  vtkSmartPointer<vtkRenderWindow> renderWindow;
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor;
  vtkSmartPointer<vtkInteractorStyleTrackballCamera> interactorObserver;

public:
  /// \brief Constructor.
  vtkdisplay(color c=color(25, 51, 102,255),char *nom=NULL);

  /// \brief Destructor.
  virtual ~vtkdisplay() {}

  /// \brief Adds all data for display.
  /// \param[in] data data to display.
  virtual void init_data(data_container &data);

  /// \brief Adds only vertices data for display.
  /// \param[in] data data to display.
  virtual void init_data_vertices(data_container & data);

  /// \brief Adds only lines data for display.
  /// \param[in] data data to display.
  virtual void init_data_lines(data_container & data);

  /// \brief Adds only triangles data for display.
  /// \param[in] data data to display.
  virtual void init_data_triangles(data_container & data);

  /// \brief Adds only quads data for display.
  /// \param[in] data data to display.
  virtual void init_data_quads(data_container & data);

  /// \brief Adds only text data for display.
  /// \param[in] data data to display.
  virtual void init_data_textes(data_container & data);

  /// \brief Display loop.
  /// \param[in] perspectiveon if true uses parallel projection for display.
  virtual void display(bool perspectiveon=0);

  virtual void test(void);
  virtual void resetCamera();
  virtual void kbCallback(int);
  virtual void mousewheelforwardCall(int x,int y);
  virtual void mousewheelbackwardCall(int x,int y);
private :
  std::vector<vtkSmartPointer<vtkActor> > list_numero[3];
  bool numero[3];
  std::vector<vtkSmartPointer<vtkActor> > list_triangle;
  bool triangle;
  std::vector<vtkSmartPointer<vtkActor> > list_vertice;
  bool vertice;
  std::vector<vtkSmartPointer<vtkActor> > list_line;
  bool line;
  std::vector<vtkSmartPointer<vtkActor> > list_quad;
  bool quad;
  void saveCameraDefault();
  double cameraDefPosition [3];
  double cameraDefFocalPoint [3];
  double cameraDefViewUp [3];
  double scaleactif;
};


#endif// __VTKDISPLAY_H
