|
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 |
}
|