Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "viewerdraw.h"
Toshihiro Shimizu 890ddd
#include "tapp.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tscenehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tframehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcolumnhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tobjecthandle.h"
Campbell Barton d0e335
#include "toonz/cleanupparameters.h"
Toshihiro Shimizu 890ddd
#include "sceneviewer.h"
Toshihiro Shimizu 890ddd
#include "ruler.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tgl.h"
Toshihiro Shimizu 890ddd
#include "trop.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "toonz/sceneproperties.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjectid.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjecttree.h"
Toshihiro Shimizu 890ddd
#include "toonz/stage2.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcamera.h"
Toshihiro Shimizu 890ddd
#include "toonz/tproject.h"
Toshihiro Shimizu 890ddd
#include "toonz/preferences.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzfolders.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tenv.h"
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
#include "tfilepath_io.h"
Toshihiro Shimizu 890ddd
#include "tstream.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "subcameramanager.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qsettings></qsettings>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TEnv::StringVar EnvSafeAreaName("SafeAreaName", "PR_safe");
Toshihiro Shimizu 890ddd
Campbell Barton ccd505
/* TODO, move to include */
Campbell Barton ccd505
void getSafeAreaSizeList(QList<qlist<double>> &_sizeList);</qlist<double>
Campbell Barton ccd505
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// SafeAreaData
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void getSafeAreaSizeList(QList<qlist<double>> &_sizeList) {</qlist<double>
Shinya Kitaoka 120a6e
  static QList<qlist<double>> sizeList;</qlist<double>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  static TFilePath projectPath;
Shinya Kitaoka 120a6e
  static QString safeAreaName;
Shinya Kitaoka 120a6e
Jeremy Bullock 1d47b8
  TFilePath fp                = TEnv::getConfigDir();
Shinya Kitaoka 120a6e
  QString currentSafeAreaName = QString::fromStdString(EnvSafeAreaName);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (fp != projectPath || currentSafeAreaName != safeAreaName) {
Shinya Kitaoka 120a6e
    sizeList.clear();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    projectPath  = fp;
Shinya Kitaoka 120a6e
    safeAreaName = currentSafeAreaName;
Shinya Kitaoka 120a6e
Jeremy Bullock 1d47b8
    std::string safeAreaFileName = "safearea.ini";
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    while (!TFileStatus(fp + safeAreaFileName).doesExist() && !fp.isRoot() &&
Shinya Kitaoka 120a6e
           fp.getParentDir() != TFilePath())
Shinya Kitaoka 120a6e
      fp = fp.getParentDir();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    fp = fp + safeAreaFileName;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (TFileStatus(fp).doesExist()) {
Shinya Kitaoka 120a6e
      QSettings settings(toQString(fp), QSettings::IniFormat);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // find the current safearea name from the list
Shinya Kitaoka 120a6e
      QStringList groups = settings.childGroups();
Shinya Kitaoka 120a6e
      for (int g = 0; g < groups.size(); g++) {
Shinya Kitaoka 120a6e
        settings.beginGroup(groups.at(g));
Shinya Kitaoka 120a6e
        // If found, get the safe area setting values
Shinya Kitaoka 120a6e
        if (safeAreaName == settings.value("name", "").toString()) {
Shinya Kitaoka 120a6e
          // enter area group
Shinya Kitaoka 120a6e
          settings.beginGroup("area");
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          QStringList keys = settings.childKeys();
Shinya Kitaoka 120a6e
          for (int i = 0; i < keys.size(); i++) {
Shinya Kitaoka 120a6e
            QList<qvariant> tmp =</qvariant>
Shinya Kitaoka 120a6e
                settings.value(keys.at(i), QList<qvariant>()).toList();</qvariant>
Shinya Kitaoka 120a6e
            QList<double> val_list;</double>
Shinya Kitaoka 120a6e
            for (int j = 0; j < tmp.size(); j++)
Shinya Kitaoka 120a6e
              val_list.push_back(tmp.at(j).toDouble());
Shinya Kitaoka 120a6e
            sizeList.push_back(val_list);
Shinya Kitaoka 120a6e
          }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          // close area group
Shinya Kitaoka 120a6e
          settings.endGroup();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          settings.endGroup();
Shinya Kitaoka 120a6e
          break;
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
        settings.endGroup();
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      // If not found, then put some temporal values..
Shinya Kitaoka 120a6e
      if (sizeList.isEmpty()) {
Shinya Kitaoka 120a6e
        QList<double> tmpList0, tmpList1;</double>
Shinya Kitaoka 120a6e
        tmpList0 << 80.0 << 80.0;
Shinya Kitaoka 120a6e
        tmpList1 << 90.0 << 90.0;
Shinya Kitaoka 120a6e
        sizeList << tmpList0 << tmpList1;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  _sizeList = sizeList;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// da spostare in tgl.h?
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
inline void glVertex(const T3DPointD &p) { glVertex3d(p.x, p.y, p.z); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// da spostare in util.h?
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
inline int findLowerIndex(double x, double step) {
Shinya Kitaoka 120a6e
  int index;
Shinya Kitaoka 120a6e
  double istep = 1 / step;
Shinya Kitaoka 120a6e
  if (x >= 0)
Shinya Kitaoka 120a6e
    index = tfloor(x * istep);
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    index = -tceil(-x * istep);
Shinya Kitaoka 120a6e
  assert(index * step <= x && x < (index + 1) * step);
Shinya Kitaoka 120a6e
  return index;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
inline int findUpperIndex(double x, double step) {
Shinya Kitaoka 120a6e
  int index = -findLowerIndex(-x, step);
Shinya Kitaoka 120a6e
  assert((index - 1) * step < x && x <= index * step);
Shinya Kitaoka 120a6e
  return index;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
T3DPointD make3dPoint(const TPointD &p, double z) {
Shinya Kitaoka 120a6e
  return T3DPointD(p.x, p.y, z);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
void getCameraSection(T3DPointD points[4], int row, double z)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet();
Toshihiro Shimizu 890ddd
  TStageObjectId cameraId = xsh->getStageObjectTree()->getCurrentCameraId();
Toshihiro Shimizu 890ddd
  double camZ = xsh->getZ(cameraId, row);
Toshihiro Shimizu 890ddd
  TAffine camAff = xsh->getPlacement(cameraId, row);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TRectD cameraRect =
Toshihiro Shimizu 890ddd
    TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera()->getStageRect();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  TPointD p[4];
Toshihiro Shimizu 890ddd
  p[0] = camAff * cameraRect.getP00();
Toshihiro Shimizu 890ddd
  p[1] = camAff * cameraRect.getP10();
Toshihiro Shimizu 890ddd
  p[2] = camAff * cameraRect.getP11();
Toshihiro Shimizu 890ddd
  p[3] = camAff * cameraRect.getP01();
Toshihiro Shimizu 890ddd
  TPointD center = 0.5*(p[0]+p[2]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  double f = 1000;
Toshihiro Shimizu 890ddd
  double sc = 1+(camZ-z)/f;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  for(int i=0;i<4;i++)
Toshihiro Shimizu 890ddd
    points[i] = make3dPoint(center+sc*(p[i]-center), z);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
}  // namespace
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// ViewerDraw
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! when camera view mode, draw the mask plane outside of the camera box
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void ViewerDraw::drawCameraMask(SceneViewer *viewer) {
Shinya Kitaoka 120a6e
  TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //  TAffine viewMatrix = viewer->getViewMatrix();
Shinya Kitaoka 120a6e
  int x1, x2, y1, y2;
Shinya Kitaoka 120a6e
  viewer->rect().getCoords(&x1, &y1, &x2, &y2);
Shinya Kitaoka 120a6e
  TRect clipRect = TRect(x1, y1, x2 + 1, y2 + 1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  GLfloat modelView[16];
Shinya Kitaoka 120a6e
  glGetFloatv(GL_MODELVIEW_MATRIX, modelView);
Shinya Kitaoka 120a6e
  TAffine modelViewAff(modelView[0], modelView[4], modelView[12], modelView[1],
Shinya Kitaoka 120a6e
                       modelView[5], modelView[13]);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TRectD cameraRect = getCameraRect();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TPointD clipCorner[] = {
Shinya Kitaoka 120a6e
      modelViewAff.inv() * TPointD(clipRect.x0, clipRect.y0),
Shinya Kitaoka 120a6e
      modelViewAff.inv() * TPointD(clipRect.x1, clipRect.y0),
Shinya Kitaoka 120a6e
      modelViewAff.inv() * TPointD(clipRect.x1, clipRect.y1),
Shinya Kitaoka 120a6e
      modelViewAff.inv() * TPointD(clipRect.x0, clipRect.y1)};
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // bounds: nel sistema di riferimento "corrente" bounds e' il piu' piccolo
Shinya Kitaoka 120a6e
  // rettangolo che copre completamente tutto il viewer
Shinya Kitaoka 120a6e
  TRectD bounds;
Shinya Kitaoka 120a6e
  bounds.x0 = bounds.x1 = clipCorner[0].x;
Shinya Kitaoka 120a6e
  bounds.y0 = bounds.y1 = clipCorner[0].y;
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 1; i < 4; i++) {
Shinya Kitaoka 120a6e
    const TPointD &p = clipCorner[i];
Shinya Kitaoka 120a6e
    if (p.x < bounds.x0)
Shinya Kitaoka 120a6e
      bounds.x0 = p.x;
Shinya Kitaoka 120a6e
    else if (p.x > bounds.x1)
Shinya Kitaoka 120a6e
      bounds.x1 = p.x;
Shinya Kitaoka 120a6e
    if (p.y < bounds.y0)
Shinya Kitaoka 120a6e
      bounds.y0 = p.y;
Shinya Kitaoka 120a6e
    else if (p.y > bounds.y1)
Shinya Kitaoka 120a6e
      bounds.y1 = p.y;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // set the camera mask color same as the previewBG color
Shinya Kitaoka 120a6e
  TPixel32 maskColor = Preferences::instance()->getPreviewBgColor();
Shinya Kitaoka 120a6e
  double mask_r, mask_g, mask_b;
Shinya Kitaoka 120a6e
  mask_r = (double)maskColor.r / 255.0;
Shinya Kitaoka 120a6e
  mask_g = (double)maskColor.g / 255.0;
Shinya Kitaoka 120a6e
  mask_b = (double)maskColor.b / 255.0;
Shinya Kitaoka 120a6e
  glColor3d(mask_r, mask_g, mask_b);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (cameraRect.overlaps(bounds)) {
Shinya Kitaoka 120a6e
    double x0 = cameraRect.x0;
Shinya Kitaoka 120a6e
    double y0 = cameraRect.y0;
Shinya Kitaoka 120a6e
    double x1 = cameraRect.x1;
Shinya Kitaoka 120a6e
    double y1 = cameraRect.y1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (bounds.x0 <= x0) tglFillRect(bounds.x0, bounds.y0, x0, bounds.y1);
Shinya Kitaoka 120a6e
    if (x1 <= bounds.x1) tglFillRect(x1, bounds.y0, bounds.x1, bounds.y1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (x0 < bounds.x1 && x1 > bounds.x0) {
Shinya Kitaoka 120a6e
      double xa = std::max(x0, bounds.x0);
Shinya Kitaoka 120a6e
      double xb = std::min(x1, bounds.x1);
Shinya Kitaoka 120a6e
      if (bounds.y0 < y0) tglFillRect(xa, bounds.y0, xb, y0);
Shinya Kitaoka 120a6e
      if (y1 < bounds.y1) tglFillRect(xa, y1, xb, bounds.y1);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    tglFillRect(bounds);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ViewerDraw::drawGridAndGuides(SceneViewer *viewer, double sc, Ruler *vr,
Shinya Kitaoka 120a6e
                                   Ruler *hr, bool gridEnabled) {
Shinya Kitaoka 120a6e
  int vGuideCount     = 0;
Shinya Kitaoka 120a6e
  int hGuideCount     = 0;
Shinya Kitaoka 120a6e
  if (vr) vGuideCount = vr->getGuideCount();
Shinya Kitaoka 120a6e
  if (hr) hGuideCount = hr->getGuideCount();
Shinya Kitaoka 120a6e
shun_iwasawa c23689
  // int xp1, yp1, xp2, yp2;
shun_iwasawa c23689
  // viewer->geometry().getCoords(&xp1, &yp1, &xp2, &yp2);
shun_iwasawa c23689
  TRect clipRect = TRect(-20, -10, viewer->width() + 10, viewer->height() + 20);
shun_iwasawa c23689
  // TRect clipRect = TRect(xp1- 20, yp2 + 20, xp2 + 10, yp1 - 10);
shun_iwasawa c23689
  // viewer->rect().adjusted(-20, -10, 10, 20);
Shinya Kitaoka 120a6e
  clipRect -=
Shinya Kitaoka 120a6e
      TPoint((clipRect.x0 + clipRect.x1) / 2, (clipRect.y0 + clipRect.y1) / 2);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TAffine mat = viewer->getViewMatrix().inv();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TPointD p00 = mat * convert(clipRect.getP00());
Shinya Kitaoka 120a6e
  TPointD p01 = mat * convert(clipRect.getP01());
Shinya Kitaoka 120a6e
  TPointD p10 = mat * convert(clipRect.getP10());
Shinya Kitaoka 120a6e
  TPointD p11 = mat * convert(clipRect.getP11());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  double xmin = std::min({p00.x, p01.x, p10.x, p11.x});
Shinya Kitaoka 120a6e
  double xmax = std::max({p00.x, p01.x, p10.x, p11.x});
Shinya Kitaoka 120a6e
  double ymin = std::min({p00.y, p01.y, p10.y, p11.y});
Shinya Kitaoka 120a6e
  double ymax = std::max({p00.y, p01.y, p10.y, p11.y});
Shinya Kitaoka 120a6e
Jeremy Bullock 628337
  double step  = 10;
Rozhuk Ivan 823a31
  double absSc = std::abs(sc);
Jeremy Bullock 628337
  if (absSc * step < 4)
Jeremy Bullock 628337
    while (absSc * step < 4) step *= 5;
Jeremy Bullock 628337
  else if (absSc * step > 20)
Jeremy Bullock 628337
    while (absSc * step > 20) step *= 0.2;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int i0 = findLowerIndex(xmin, step);
Shinya Kitaoka 120a6e
  int i1 = findUpperIndex(xmax, step);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int j0 = findLowerIndex(ymin, step);
Shinya Kitaoka 120a6e
  int j1 = findUpperIndex(ymax, step);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  double x0 = i0 * step;
Shinya Kitaoka 120a6e
  double x1 = i1 * step;
Shinya Kitaoka 120a6e
  double y0 = j0 * step;
Shinya Kitaoka 120a6e
  double y1 = j1 * step;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (gridEnabled) {
Shinya Kitaoka 120a6e
    glColor3d(0.7, 0.7, 0.7);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    glBegin(GL_LINES);
Shinya Kitaoka 120a6e
    glVertex2d(0, y0);
Shinya Kitaoka 120a6e
    glVertex2d(0, y1);
Shinya Kitaoka 120a6e
    glVertex2d(x0, 0);
Shinya Kitaoka 120a6e
    glVertex2d(x1, 0);
Shinya Kitaoka 120a6e
    glEnd();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    glEnable(GL_LINE_STIPPLE);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    glLineStipple(1, 0xAAAA);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    glBegin(GL_LINES);
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = i0; i <= i1; i++) {
Shinya Kitaoka 120a6e
      double x = i * step;
Shinya Kitaoka 120a6e
      if (i == 0)
Shinya Kitaoka 120a6e
        continue;
Shinya Kitaoka 120a6e
      else if ((abs(i) % 10) == 0)
Shinya Kitaoka 120a6e
        glColor3d(0.8, 0.8, 0.8);
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        glColor3d(0.9, 0.9, 0.9);
Shinya Kitaoka 120a6e
      glVertex2d(x, y0);
Shinya Kitaoka 120a6e
      glVertex2d(x, y1);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    for (i = j0; i <= j1; i++) {
Shinya Kitaoka 120a6e
      double y = i * step;
Shinya Kitaoka 120a6e
      if (i == 0)
Shinya Kitaoka 120a6e
        continue;
Shinya Kitaoka 120a6e
      else if ((abs(i) % 10) == 0)
Shinya Kitaoka 120a6e
        glColor3d(0.8, 0.8, 0.8);
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        glColor3d(0.9, 0.9, 0.9);
Shinya Kitaoka 120a6e
      glVertex2d(x0, y);
Shinya Kitaoka 120a6e
      glVertex2d(x1, y);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    glEnd();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    glDisable(GL_LINE_STIPPLE);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  glColor3d(0.7, 0.7, 0.7);
Shinya Kitaoka 120a6e
  glLineStipple(1, 0xAAAA);
Shinya Kitaoka 120a6e
  glEnable(GL_LINE_STIPPLE);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  glBegin(GL_LINES);
Shinya Kitaoka 120a6e
  for (i = 0; i < hGuideCount; i++) {
Shinya Kitaoka 120a6e
    double x = hr->getGuide(i);
Shinya Kitaoka 120a6e
    glVertex2d(x, y0);
Shinya Kitaoka 120a6e
    glVertex2d(x, y1);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  for (i = 0; i < vGuideCount; i++) {
Shinya Kitaoka 120a6e
    double y = vr->getGuide(i);
Shinya Kitaoka 120a6e
    glVertex2d(x0, y);
Shinya Kitaoka 120a6e
    glVertex2d(x1, y);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  glEnd();
Shinya Kitaoka 120a6e
  glDisable(GL_LINE_STIPPLE);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ViewerDraw::drawColorcard(UCHAR channel) {
Shinya Kitaoka 120a6e
  ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
Shinya Kitaoka 120a6e
  TRectD rect       = getCameraRect();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TPixel color = (ToonzCheck::instance()->getChecks() & ToonzCheck::eBlackBg)
Shinya Kitaoka 120a6e
                     ? TPixel::Black
Shinya Kitaoka 120a6e
                     : scene->getProperties()->getBgColor();
Shinya Kitaoka 120a6e
  if (channel == 0)
Shinya Kitaoka 120a6e
    color.m = 255;  // fondamentale: senno' non si vedono i fill con le texture
Shinya Kitaoka 120a6e
                    // in camera stand!
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    if (channel == TRop::MChan) {
Shinya Kitaoka 120a6e
      switch (channel) {
Shinya Kitaoka 120a6e
      case TRop::RChan:
Shinya Kitaoka 120a6e
        color.r = color.g = color.b = color.m = color.r;
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      case TRop::GChan:
Shinya Kitaoka 120a6e
        color.r = color.g = color.b = color.m = color.g;
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      case TRop::BChan:
Shinya Kitaoka 120a6e
        color.r = color.g = color.b = color.m = color.b;
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      case TRop::MChan:
Shinya Kitaoka 120a6e
        color.r = color.g = color.b = color.m = color.m;
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      default:
Shinya Kitaoka 120a6e
        assert(false);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      color.r = channel & TRop::RChan ? color.r : 0;
Shinya Kitaoka 120a6e
      color.b = channel & TRop::BChan ? color.b : 0;
Shinya Kitaoka 120a6e
      color.g = channel & TRop::GChan ? color.g : 0;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  tglColor(color);
Shinya Kitaoka 120a6e
  tglFillRect(rect);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ViewerDraw::draw3DCamera(unsigned long flags, double zmin, double phi) {
Shinya Kitaoka 120a6e
  bool cameraRef = 0 != (flags & ViewerDraw::CAMERA_REFERENCE);
Shinya Kitaoka 120a6e
  bool safeArea  = 0 != (flags & ViewerDraw::SAFE_AREA);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TApp *app               = TApp::instance();
Shinya Kitaoka 120a6e
  int frame               = app->getCurrentFrame()->getFrame();
Shinya Kitaoka 120a6e
  ToonzScene *scene       = app->getCurrentScene()->getScene();
Shinya Kitaoka 120a6e
  TXsheet *xsh            = scene->getXsheet();
Shinya Kitaoka 120a6e
  TStageObjectId cameraId = xsh->getStageObjectTree()->getCurrentCameraId();
Shinya Kitaoka 120a6e
  TAffine camAff          = xsh->getPlacement(cameraId, frame);
Shinya Kitaoka 120a6e
  double zcam             = xsh->getZ(cameraId, frame);
Shinya Kitaoka 120a6e
  TRectD rect             = getCameraRect();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  double znear = 1000 + zcam - 100;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TPointD cameraCorners[4] = {camAff * rect.getP00(), camAff * rect.getP10(),
Shinya Kitaoka 120a6e
                              camAff * rect.getP11(), camAff * rect.getP01()};
Shinya Kitaoka 120a6e
  TPointD cameraCenter = 0.5 * (cameraCorners[0] + cameraCorners[2]);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  T3DPointD cage[4][4];
Shinya Kitaoka 120a6e
  std::vector<double> cageZ;</double>
Shinya Kitaoka 120a6e
  cageZ.push_back(znear);
Shinya Kitaoka 120a6e
  double ztable = 0;
Shinya Kitaoka 120a6e
  if (ztable < znear) cageZ.push_back(ztable);
Shinya Kitaoka 120a6e
  if (zmin < znear) cageZ.push_back(zmin);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int columnIndex = app->getCurrentColumn()->getColumnIndex();
Shinya Kitaoka 120a6e
  if (columnIndex >= 0) {
Shinya Kitaoka 120a6e
    TStageObjectId objId = TStageObjectId::ColumnId(columnIndex);
Shinya Kitaoka 120a6e
    double zcur          = xsh->getZ(objId, frame);
Shinya Kitaoka 120a6e
    if (zcur < znear) cageZ.push_back(zcur);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  std::sort(cageZ.begin(), cageZ.end());
Shinya Kitaoka 120a6e
  int m = (int)cageZ.size();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  for (int i = 0; i < m; i++) {
Shinya Kitaoka 120a6e
    double z  = cageZ[i];
Shinya Kitaoka 120a6e
    double sc = (1000 + zcam - z) * 0.001;
Shinya Kitaoka 120a6e
    for (int j = 0; j < 4; j++)
Shinya Kitaoka 120a6e
      cage[i][j] =
Shinya Kitaoka 120a6e
          make3dPoint(cameraCenter + sc * (cameraCorners[j] - cameraCenter), z);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (cameraRef) {
Shinya Kitaoka 120a6e
    glColor3d(1.0, 0.0, 1.0);
Shinya Kitaoka 120a6e
    glLineStipple(1, 0xFFFC);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    glColor3d(1.0, 0.0, 0.0);
Shinya Kitaoka 120a6e
    glLineStipple(1, 0xCCCC);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  glEnable(GL_LINE_STIPPLE);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  double yBigBox       = -Stage::bigBoxSize[1];
Shinya Kitaoka 120a6e
  double xBigBox       = Stage::bigBoxSize[0];
Shinya Kitaoka 120a6e
  if (phi < 0) xBigBox = -xBigBox;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  for (int i = 0; i < m; i++) {
Shinya Kitaoka 120a6e
    // ombre
Shinya Kitaoka 120a6e
    glColor3d(1.0, 0.8, 0.8);
Shinya Kitaoka 120a6e
    glBegin(GL_LINES);
Shinya Kitaoka 120a6e
    glVertex3d(cage[i][0].x, yBigBox, cageZ[i]);
Shinya Kitaoka 120a6e
    glVertex3d(cage[i][1].x, yBigBox, cageZ[i]);
Shinya Kitaoka 120a6e
    glVertex3d(xBigBox, cage[i][1].y, cageZ[i]);
Shinya Kitaoka 120a6e
    glVertex3d(xBigBox, cage[i][2].y, cageZ[i]);
Shinya Kitaoka 120a6e
    glEnd();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    glColor3d(1.0, 0.0, 0.0);
Toshihiro Shimizu 890ddd
    glBegin(GL_LINE_STRIP);
Shinya Kitaoka 120a6e
    for (int j = 0; j < 4; j++) glVertex(cage[i][j]);
Shinya Kitaoka 120a6e
    glVertex(cage[i][0]);
Toshihiro Shimizu 890ddd
    glEnd();
Toshihiro Shimizu 890ddd
  }
Shinya Kitaoka 120a6e
  if (m >= 2) {
Shinya Kitaoka 120a6e
    // ombre
Shinya Kitaoka 120a6e
    glColor3d(1.0, 0.8, 0.8);
Shinya Kitaoka 120a6e
    glVertex3d(cage[0][0].x, yBigBox, cageZ[0]);
Shinya Kitaoka 120a6e
    glVertex3d(cage[m - 1][0].x, yBigBox, cageZ[m - 1]);
Shinya Kitaoka 120a6e
    glVertex3d(cage[0][1].x, yBigBox, cageZ[0]);
Shinya Kitaoka 120a6e
    glVertex3d(cage[m - 1][1].x, yBigBox, cageZ[m - 1]);
Shinya Kitaoka 120a6e
    glVertex3d(xBigBox, cage[0][1].y, cageZ[0]);
Shinya Kitaoka 120a6e
    glVertex3d(xBigBox, cage[m - 1][1].y, cageZ[m - 1]);
Shinya Kitaoka 120a6e
    glVertex3d(xBigBox, cage[0][2].y, cageZ[0]);
Shinya Kitaoka 120a6e
    glVertex3d(xBigBox, cage[m - 1][2].y, cageZ[m - 1]);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    glColor3d(1.0, 0.0, 0.0);
Shinya Kitaoka 120a6e
    glBegin(GL_LINES);
Shinya Kitaoka 120a6e
    for (int j = 0; j < 4; j++) {
Shinya Kitaoka 120a6e
      glVertex(cage[0][j]);
Shinya Kitaoka 120a6e
      glVertex(cage[m - 1][j]);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    glEnd();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  /*
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
if(objId != cameraId)
Shinya Kitaoka 120a6e
{
Shinya Kitaoka 120a6e
glColor3d(1.0,0.0,1.0);
Shinya Kitaoka 120a6e
glBegin(GL_LINE_STRIP);
Shinya Kitaoka 120a6e
for(j=0;j<4;j++) glVertex(currentRect[j]);
Shinya Kitaoka 120a6e
glVertex(currentRect[0]);
Shinya Kitaoka 120a6e
glEnd();
Shinya Kitaoka 120a6e
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  glDisable(GL_LINE_STIPPLE);
Shinya Kitaoka 120a6e
  /*
Shinya Kitaoka 120a6e
glPushMatrix();
Shinya Kitaoka 120a6e
glTranslated(0,0,zcam);
Shinya Kitaoka 120a6e
drawCamera(flags);
Shinya Kitaoka 120a6e
glPopMatrix();
Shinya Kitaoka 120a6e
*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TRectD ViewerDraw::getCameraRect() {
Shinya Kitaoka 120a6e
  if (CleanupPreviewCheck::instance()->isEnabled() ||
Shinya Kitaoka 120a6e
      CameraTestCheck::instance()->isEnabled())
Shinya Kitaoka 120a6e
    return TApp::instance()
Shinya Kitaoka 120a6e
        ->getCurrentScene()
Shinya Kitaoka 120a6e
        ->getScene()
Shinya Kitaoka 120a6e
        ->getProperties()
Shinya Kitaoka 120a6e
        ->getCleanupParameters()
Shinya Kitaoka 120a6e
        ->m_camera.getStageRect();
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    return TApp::instance()
Shinya Kitaoka 120a6e
        ->getCurrentScene()
Shinya Kitaoka 120a6e
        ->getScene()
Shinya Kitaoka 120a6e
        ->getCurrentCamera()
Shinya Kitaoka 120a6e
        ->getStageRect();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ViewerDraw::drawSafeArea() {
Shinya Kitaoka 120a6e
  TRectD rect = getCameraRect();
Shinya Kitaoka 120a6e
  glColor3d(1.0, 0.0, 0.0);
Shinya Kitaoka 120a6e
  glLineStipple(1, 0xCCCC);
Shinya Kitaoka 120a6e
  glEnable(GL_LINE_STIPPLE);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QList<qlist<double>> sizeList;</qlist<double>
Shinya Kitaoka 120a6e
  getSafeAreaSizeList(sizeList);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  double ux = 0.5 * rect.getLx();
Shinya Kitaoka 120a6e
  double uy = 0.5 * rect.getLy();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  for (int i = 0; i < sizeList.size(); i++) {
Shinya Kitaoka 120a6e
    QList<double> curSize = sizeList.at(i);</double>
Shinya Kitaoka 120a6e
    if (curSize.size() == 5)
Shinya Kitaoka 120a6e
      tglColor(
Shinya Kitaoka 120a6e
          TPixel((int)curSize.at(2), (int)curSize.at(3), (int)curSize.at(4)));
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      tglColor(TPixel32::Red);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    double fx = 0.01 * curSize.at(0);
Shinya Kitaoka 120a6e
    double fy = 0.01 * curSize.at(1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    tglDrawRect(-ux * fx, -uy * fy, ux * fx, uy * fy);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  glDisable(GL_LINE_STIPPLE);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ViewerDraw::drawCamera(unsigned long flags, double pixelSize) {
Shinya Kitaoka 120a6e
  bool cameraRef = 0 != (flags & ViewerDraw::CAMERA_REFERENCE);
Shinya Kitaoka 120a6e
  bool camera3d  = 0 != (flags & ViewerDraw::CAMERA_3D);
Shinya Kitaoka 120a6e
  bool solidLine = 0 != (flags & ViewerDraw::SOLID_LINE);
Shinya Kitaoka 120a6e
  bool subcamera = 0 != (flags & ViewerDraw::SUBCAMERA);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TApp *app               = TApp::instance();
Shinya Kitaoka 120a6e
  ToonzScene *scene       = app->getCurrentScene()->getScene();
Shinya Kitaoka 120a6e
  TXsheet *xsh            = scene->getXsheet();
Shinya Kitaoka 120a6e
  TStageObjectId cameraId = xsh->getStageObjectTree()->getCurrentCameraId();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TRectD rect = getCameraRect();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (cameraRef) {
Shinya Kitaoka 120a6e
    glColor3d(1.0, 0.0, 1.0);
Shinya Kitaoka 120a6e
    glLineStipple(1, 0xFFFC);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    glColor3d(1.0, 0.0, 0.0);
Shinya Kitaoka 120a6e
    glLineStipple(1, solidLine ? 0xFFFF : 0xCCCC);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  glEnable(GL_LINE_STIPPLE);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // bordo
Shinya Kitaoka 120a6e
  glBegin(GL_LINE_STRIP);
Shinya Kitaoka 120a6e
  glVertex2d(rect.x0, rect.y0);
Shinya Kitaoka 120a6e
  glVertex2d(rect.x0, rect.y1 - pixelSize);
Shinya Kitaoka 120a6e
  glVertex2d(rect.x1 - pixelSize, rect.y1 - pixelSize);
Shinya Kitaoka 120a6e
  glVertex2d(rect.x1 - pixelSize, rect.y0);
Shinya Kitaoka 120a6e
  glVertex2d(rect.x0, rect.y0);
Shinya Kitaoka 120a6e
  glEnd();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // croce al centro
Shinya Kitaoka 120a6e
  double dx = 0.05 * rect.getP00().x;
Shinya Kitaoka 120a6e
  double dy = 0.05 * rect.getP00().y;
Shinya Kitaoka 120a6e
  tglDrawSegment(TPointD(-dx, -dy), TPointD(dx, dy));
Shinya Kitaoka 120a6e
  tglDrawSegment(TPointD(-dx, dy), TPointD(dx, -dy));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  glDisable(GL_LINE_STIPPLE);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // nome della camera
Shinya Kitaoka 120a6e
  if (!camera3d) {
Shinya Kitaoka 120a6e
    TPointD pos = rect.getP01() + TPointD(0, 4);
Shinya Kitaoka 120a6e
    std::string name;
Shinya Kitaoka 120a6e
    if (CleanupPreviewCheck::instance()->isEnabled())
Shinya Kitaoka 120a6e
      name = "Cleanup Camera";
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      name = xsh->getStageObject(cameraId)->getName();
Shinya Kitaoka 120a6e
    glPushMatrix();
Shinya Kitaoka 120a6e
    glTranslated(pos.x, pos.y, 0);
Shinya Kitaoka 120a6e
    glScaled(2, 2, 2);
Shinya Kitaoka 120a6e
    tglDrawText(TPointD(), name);
Shinya Kitaoka 120a6e
    glPopMatrix();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // draw preview sub-camera
Shinya Kitaoka 120a6e
  if (!CleanupPreviewCheck::instance()->isEnabled() && subcamera) {
Shinya Kitaoka 120a6e
    PreviewSubCameraManager *inst = PreviewSubCameraManager::instance();
Shinya Kitaoka 120a6e
    TRect previewSubRect(inst->getEditingCameraInterestRect());
Shinya Kitaoka 120a6e
    if (previewSubRect.getLx() > 0 && previewSubRect.getLy() > 0) {
Shinya Kitaoka 120a6e
      TRectD stagePreviewSubRect(inst->getEditingCameraInterestStageRect());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      glLineStipple(1, 0xCCCC);
Shinya Kitaoka 120a6e
      glEnable(GL_LINE_STIPPLE);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      glColor3d(1.0, 0.0, 1.0);
Shinya Kitaoka 120a6e
      glBegin(GL_LINE_STRIP);
Shinya Kitaoka 120a6e
      glVertex2d(stagePreviewSubRect.x0, stagePreviewSubRect.y0);
Shinya Kitaoka 120a6e
      glVertex2d(stagePreviewSubRect.x0, stagePreviewSubRect.y1 - pixelSize);
Shinya Kitaoka 120a6e
      glVertex2d(stagePreviewSubRect.x1 - pixelSize,
Shinya Kitaoka 120a6e
                 stagePreviewSubRect.y1 - pixelSize);
Shinya Kitaoka 120a6e
      glVertex2d(stagePreviewSubRect.x1 - pixelSize, stagePreviewSubRect.y0);
Shinya Kitaoka 120a6e
      glVertex2d(stagePreviewSubRect.x0, stagePreviewSubRect.y0);
Shinya Kitaoka 120a6e
      glEnd();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      glDisable(GL_LINE_STIPPLE);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ViewerDraw::draw3DFrame(double minZ, double phi) {
Shinya Kitaoka 120a6e
  double a = Stage::bigBoxSize[0];
Shinya Kitaoka 120a6e
  double b = Stage::bigBoxSize[1];
Shinya Kitaoka 120a6e
  double c = Stage::bigBoxSize[2];
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  double d = phi < 0 ? -a : a;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  double z0 = minZ;
Shinya Kitaoka 120a6e
  double z1 = 1000;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  glColor3d(0.9, 0.9, 0.86);
Shinya Kitaoka 120a6e
  glBegin(GL_LINES);
Shinya Kitaoka 120a6e
  glVertex3d(-a, -b, z0);
Shinya Kitaoka 120a6e
  glVertex3d(-a, -b, z1);
Shinya Kitaoka 120a6e
  glVertex3d(a, -b, z0);
Shinya Kitaoka 120a6e
  glVertex3d(a, -b, z1);
Shinya Kitaoka 120a6e
  glVertex3d(d, b, z0);
Shinya Kitaoka 120a6e
  glVertex3d(d, b, z1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  glVertex3d(-a, -b, z0);
Shinya Kitaoka 120a6e
  glVertex3d(a, -b, z0);
Shinya Kitaoka 120a6e
  glVertex3d(d, -b, z0);
Shinya Kitaoka 120a6e
  glVertex3d(d, b, z0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  glVertex3d(-a, -b, z1);
Shinya Kitaoka 120a6e
  glVertex3d(a, -b, z1);
Shinya Kitaoka 120a6e
  glVertex3d(d, -b, z1);
Shinya Kitaoka 120a6e
  glVertex3d(d, b, z1);
Shinya Kitaoka 120a6e
  glEnd();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  glColor3d(0.7, 0.7, 0.7);
Shinya Kitaoka 120a6e
  glBegin(GL_LINES);
Shinya Kitaoka 120a6e
  glVertex3d(0, -b, z0);
Shinya Kitaoka 120a6e
  glVertex3d(0, -b, z1);
Shinya Kitaoka 120a6e
  glVertex3d(d, 0, z0);
Shinya Kitaoka 120a6e
  glVertex3d(d, 0, z1);
Shinya Kitaoka 120a6e
  glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ViewerDraw::drawFieldGuide() {
Shinya Kitaoka 120a6e
  double f = 1;  // controlla (indirettamente) la grandezza delle scritte
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TSceneProperties *sprop =
Shinya Kitaoka 120a6e
      TApp::instance()->getCurrentScene()->getScene()->getProperties();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int n        = sprop->getFieldGuideSize();
Shinya Kitaoka 120a6e
  if (n < 4) n = 4;
Shinya Kitaoka 120a6e
  double ar    = sprop->getFieldGuideAspectRatio();
Shinya Kitaoka 120a6e
  double lx    = 0.5 * n / f * Stage::inch;  // 320;
Shinya Kitaoka 120a6e
  double ly    = lx / ar;
Shinya Kitaoka 120a6e
  glPushMatrix();
Shinya Kitaoka 120a6e
  glScaled(f, f, 1);
Shinya Kitaoka 120a6e
  double ux = lx / n;
Shinya Kitaoka 120a6e
  double uy = ly / n;
Shinya Kitaoka 120a6e
  glColor3d(.4, .4, .4);
Shinya Kitaoka 120a6e
  glBegin(GL_LINES);
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = -n; i <= n; i++) {
Shinya Kitaoka 120a6e
    glVertex2d(i * ux, -n * uy);
Shinya Kitaoka 120a6e
    glVertex2d(i * ux, n * uy);
Shinya Kitaoka 120a6e
    glVertex2d(-n * ux, i * uy);
Shinya Kitaoka 120a6e
    glVertex2d(n * ux, i * uy);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  glVertex2d(-n * ux, -n * uy);
Shinya Kitaoka 120a6e
  glVertex2d(n * ux, n * uy);
Shinya Kitaoka 120a6e
  glVertex2d(-n * ux, n * uy);
Shinya Kitaoka 120a6e
  glVertex2d(n * ux, -n * uy);
Shinya Kitaoka 120a6e
  glEnd();
Shinya Kitaoka 120a6e
  for (i = 1; i <= n; i++) {
Shinya Kitaoka 120a6e
    TPointD delta = 0.03 * TPointD(ux, uy);
Shinya Kitaoka 120a6e
    std::string s = std::to_string(i);
Shinya Kitaoka 120a6e
    tglDrawText(TPointD(0, i * uy) + delta, s);
Shinya Kitaoka 120a6e
    tglDrawText(TPointD(0, -i * uy) + delta, s);
Shinya Kitaoka 120a6e
    tglDrawText(TPointD(-i * ux, 0) + delta, s);
Shinya Kitaoka 120a6e
    tglDrawText(TPointD(i * ux, 0) + delta, s);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  glPopMatrix();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ViewerDraw::drawDisk(int &tableDLId) {
Shinya Kitaoka 120a6e
  static TPixel32 currentBgColor;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TPixel32 bgColor;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if ((ToonzCheck::instance()->getChecks() & ToonzCheck::eBlackBg))
Shinya Kitaoka 120a6e
    bgColor = TPixel::Black;
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    bgColor = Preferences::instance()->getViewerBgColor();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (tableDLId == -1 || currentBgColor != bgColor) {
Shinya Kitaoka 120a6e
    currentBgColor = bgColor;
Shinya Kitaoka 120a6e
    tableDLId      = createDiskDisplayList();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  glCallList(tableDLId);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
unsigned int ViewerDraw::createDiskDisplayList() {
Shinya Kitaoka 120a6e
  GLuint id = glGenLists(1);
Shinya Kitaoka 120a6e
  static std::vector<tpointd> sinCosTable;</tpointd>
Shinya Kitaoka 120a6e
  if (sinCosTable.empty()) {
Shinya Kitaoka 120a6e
    int n = 120;
Shinya Kitaoka 120a6e
    sinCosTable.resize(n);
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < n; i++) {
Shinya Kitaoka 120a6e
      double ang       = 2 * 3.1415293 * i / n;
Shinya Kitaoka 120a6e
      sinCosTable[i].x = cos(ang);
Shinya Kitaoka 120a6e
      sinCosTable[i].y = sin(ang);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  double r = 10 * Stage::inch;
Shinya Kitaoka 120a6e
  glNewList(id, GL_COMPILE);
Shinya Kitaoka 120a6e
  glColor3d(.6, .65, .7);
Shinya Kitaoka 120a6e
  glBegin(GL_POLYGON);
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  int n = 120;
Shinya Kitaoka 120a6e
  for (i = 0; i < n; i++) tglVertex(r * sinCosTable[i]);
Shinya Kitaoka 120a6e
  glEnd();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  glColor3d(0, 0, 0);
Shinya Kitaoka 120a6e
  glBegin(GL_LINE_STRIP);
Shinya Kitaoka 120a6e
  for (i = 0; i < n; i++) tglVertex(r * sinCosTable[i]);
Shinya Kitaoka 120a6e
  tglVertex(r * sinCosTable[0]);
Shinya Kitaoka 120a6e
  glEnd();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TPixel32 bgColor;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (ToonzCheck::instance()->getChecks() & ToonzCheck::eBlackBg)
Shinya Kitaoka 120a6e
    bgColor = TPixel::Black;
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    bgColor = Preferences::instance()->getViewerBgColor();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  tglColor(bgColor);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  r *= 0.9;
Shinya Kitaoka 120a6e
  int m = 13;
Shinya Kitaoka 120a6e
  glBegin(GL_POLYGON);
Shinya Kitaoka 120a6e
  for (i = n - m; i < n; i++) tglVertex(r * sinCosTable[i]);
Shinya Kitaoka 120a6e
  for (i = 0; i <= m; i++) tglVertex(r * sinCosTable[i]);
Shinya Kitaoka 120a6e
  for (i = n / 2 - m; i <= n / 2 + m; i++) tglVertex(r * sinCosTable[i]);
Shinya Kitaoka 120a6e
  glEnd();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // per non lasciare il colore corrente con il matte a zero
Shinya Kitaoka 120a6e
  glColor4d(0, 0, 0, 1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  glEndList();
Shinya Kitaoka 120a6e
  return (id);
Toshihiro Shimizu 890ddd
}