Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef PLANE_VIEWER_H
Toshihiro Shimizu 890ddd
#define PLANE_VIEWER_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tcommon.h"
Toshihiro Shimizu 890ddd
#include "traster.h"
Toshihiro Shimizu 890ddd
#include "timage.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Shinya Kitaoka 210a8a
#include <qopenglwidget></qopenglwidget>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TOONZQT_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//  Forward declarations
Toshihiro Shimizu 890ddd
class TRasterImageP;
Toshihiro Shimizu 890ddd
class TToonzImageP;
Toshihiro Shimizu 890ddd
class TVectorImageP;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Shinya Kitaoka 120a6e
  \brief    The PlaneViewer class implements a basic OpenGL widget showing a
Shinya Kitaoka 120a6e
  plane in a
Shinya Kitaoka 120a6e
            standard top-down view, and supports image drawing from the Toonz
Shinya Kitaoka 120a6e
  images API.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  \details  A PlaneViewer instance is designed to view bidimensional objects
Shinya Kitaoka 120a6e
  layed-out
Shinya Kitaoka 120a6e
            on a plane, providing standard mouse interaction functions and some
Shinya Kitaoka 120a6e
  built-in
Toshihiro Shimizu 890ddd
            keyboard shortcuts to provide view navigation.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
            The class implements the necessary methods to draw objects on the
Shinya Kitaoka 120a6e
  plane -
Shinya Kitaoka 120a6e
            prominently, functions to push both world and widget references for
Shinya Kitaoka 120a6e
  standard
Shinya Kitaoka 120a6e
            OpenGL drawing, conversions between world and widget coordinates,
Shinya Kitaoka 120a6e
  and
Toshihiro Shimizu 890ddd
            efficient image-drawing functions for all Toonz image types.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class DVAPI PlaneViewer : public QOpenGLWidget {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  PlaneViewer(QWidget *parent);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Background functions
Shinya Kitaoka 120a6e
  void setBgColor(const TPixel32 &color1, const TPixel32 &color2);
Shinya Kitaoka 120a6e
  void getBgColor(TPixel32 &color1, TPixel32 &color2) const;
Shinya Kitaoka 120a6e
  void setChessSize(double size);
Shinya Kitaoka 120a6e
  void drawBackground();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Image drawing functions
Shinya Kitaoka 120a6e
  void draw(TRasterP ras, double dpiX, double dpiY, TPalette *palette = 0);
Shinya Kitaoka 120a6e
  void draw(TRasterImageP ri);
Shinya Kitaoka 120a6e
  void draw(TToonzImageP ti);
Shinya Kitaoka 120a6e
  void draw(TVectorImageP vi);
Shinya Kitaoka 120a6e
  void draw(TImageP img);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // World-Widget conversion functions
Shinya Kitaoka 120a6e
  TPointD winToWorld(int x, int y) { return m_aff.inv() * TPointD(x, y); }
Shinya Kitaoka 120a6e
  TPointD worldToWin(double x, double y) { return m_aff * TPointD(x, y); }
Shinya Kitaoka 120a6e
  TPoint qtWinToWin(int x, int y) { return TPoint(x, height() - y); }
Shinya Kitaoka 120a6e
  TPointD qtWinToWorld(int x, int y) {
Shinya Kitaoka 120a6e
    return m_aff.inv() * TPointD(x, height() - y);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TPoint winToQtWin(int x, int y) { return qtWinToWin(x, y); }
Shinya Kitaoka 120a6e
  TPointD worldToQtWin(double x, double y) {
Shinya Kitaoka 120a6e
    TPointD res(worldToWin(x, y));
Shinya Kitaoka 120a6e
    return TPointD(res.x, height() - res.y);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // World-Widget OpenGL references
Shinya Kitaoka 120a6e
  void pushGLWorldCoordinates();
Shinya Kitaoka 120a6e
  void pushGLWinCoordinates();
Shinya Kitaoka 120a6e
  void popGLCoordinates();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // View functions
Shinya Kitaoka 120a6e
  TAffine &viewAff() { return m_aff; }
Shinya Kitaoka 120a6e
  const TAffine &viewAff() const { return m_aff; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void resetView();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void zoomIn();
Shinya Kitaoka 120a6e
  void zoomOut();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setViewPos(double x, double y);
Shinya Kitaoka 120a6e
  void setViewZoom(double x, double y, double zoom);
Shinya Kitaoka 120a6e
  void setViewZoom(double zoom) {
Shinya Kitaoka 120a6e
    setViewZoom(0.5 * width(), 0.5 * height(), zoom);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void moveView(double dx, double dy) {
Shinya Kitaoka 120a6e
    setViewPos(m_aff.a13 + dx, m_aff.a23 + dy);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  void zoomView(double x, double y, double delta) {
Shinya Kitaoka 120a6e
    setViewZoom(x, y, m_aff.a11 * delta);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setZoomRange(double zoomMin, double zoomMax);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Auxiliary functions
Shinya Kitaoka 120a6e
  TRaster32P rasterBuffer();
Shinya Kitaoka 120a6e
  void flushRasterBuffer();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  int m_xpos, m_ypos;  //!< Mouse position on mouse operations.
Shinya Kitaoka 120a6e
  TAffine m_aff;       //!< Affine transform from world to widget coords.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  float m_bgColorF[6];  //!< Widget bg color cast in the [0, 1] interval.
Shinya Kitaoka 120a6e
  double m_chessSize;   //!< Size of the chessboard squares (default is 40).
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TRaster32P m_rasterBuffer;  //!< Auxiliary buffer used to draw on the widget
Shinya Kitaoka 120a6e
                              //!directly.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  double m_zoomRange[2];  //!< Viewport zoom range (default: [-1024, 1024]).
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  virtual void mouseMoveEvent(QMouseEvent *event) override;
Shinya Kitaoka 120a6e
  virtual void mousePressEvent(QMouseEvent *event) override;
Shinya Kitaoka 120a6e
  virtual void wheelEvent(QWheelEvent *event) override;
Shinya Kitaoka 120a6e
  virtual void keyPressEvent(QKeyEvent *event) override;
Shinya Kitaoka 120a6e
  virtual void hideEvent(QHideEvent *event) override;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void initializeGL() override final;
Shinya Kitaoka 120a6e
  void resizeGL(int width, int height) override final;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  GLdouble m_matrix[16];
Shinya Kitaoka 120a6e
  bool m_firstResize;
Shinya Kitaoka 120a6e
  int m_width;
Shinya Kitaoka 120a6e
  int m_height;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // PLANE_VIEWER_H