Add Capturing 2s, 3s etc to Stop Motion (#121)
This commit is contained in:
parent
abdb0dabb6
commit
1c126afd2c
8 changed files with 71 additions and 29 deletions
|
@ -4,3 +4,4 @@ scenes
|
||||||
extras
|
extras
|
||||||
outputs
|
outputs
|
||||||
palettes
|
palettes
|
||||||
|
stopmotion
|
||||||
|
|
|
@ -36,6 +36,7 @@ public:
|
||||||
static const std::string Outputs;
|
static const std::string Outputs;
|
||||||
static const std::string Scripts;
|
static const std::string Scripts;
|
||||||
static const std::string Palettes;
|
static const std::string Palettes;
|
||||||
|
static const std::string StopMotion;
|
||||||
|
|
||||||
static const TFilePath SandboxProjectName;
|
static const TFilePath SandboxProjectName;
|
||||||
|
|
||||||
|
|
|
@ -847,7 +847,7 @@ bool Canon::downloadImage(EdsBaseRef object) {
|
||||||
jpgStream = NULL;
|
jpgStream = NULL;
|
||||||
if (object) EdsRelease(object);
|
if (object) EdsRelease(object);
|
||||||
return err;
|
return err;
|
||||||
StopMotion::instance()->m_tempRaw = TApp::instance()->getCurrentScene()->getScene()->decodeFilePath(TFilePath("+extras")).getQString();
|
StopMotion::instance()->m_tempRaw = TApp::instance()->getCurrentScene()->getScene()->decodeFilePath(TFilePath("+stopmotion")).getQString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -257,9 +257,9 @@ StopMotion::StopMotion() {
|
||||||
ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
|
ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
|
||||||
|
|
||||||
setToNextNewLevel();
|
setToNextNewLevel();
|
||||||
m_filePath = scene->getDefaultLevelPath(OVL_TYPE, m_levelName.toStdWString())
|
//m_filePath = scene->getDefaultLevelPath(OVL_TYPE, m_levelName.toStdWString())
|
||||||
.getParentDir()
|
// .getParentDir()
|
||||||
.getQString();
|
// .getQString();
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
|
@ -1006,6 +1006,13 @@ void StopMotion::setXSheetFrameNumber(int frameNumber) {
|
||||||
|
|
||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
|
|
||||||
|
void StopMotion::setCaptureNumberOfFrames(int frames) {
|
||||||
|
m_captureNumberOfFrames = frames;
|
||||||
|
emit(captureNumberOfFramesChanged(frames));
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
|
||||||
bool StopMotion::loadLineUpImage() {
|
bool StopMotion::loadLineUpImage() {
|
||||||
if (m_liveViewStatus == LiveViewClosed || m_userCalledPause) return false;
|
if (m_liveViewStatus == LiveViewClosed || m_userCalledPause) return false;
|
||||||
int row;
|
int row;
|
||||||
|
@ -1635,18 +1642,16 @@ bool StopMotion::importImage() {
|
||||||
col += 1;
|
col += 1;
|
||||||
xsh->insertColumn(col);
|
xsh->insertColumn(col);
|
||||||
}
|
}
|
||||||
xsh->insertCells(row, col);
|
for (int i = 0; i < m_captureNumberOfFrames; i++) {
|
||||||
xsh->setCell(row, col, TXshCell(sl, fid));
|
xsh->insertCells(row + i, col);
|
||||||
|
xsh->setCell(row + i, col, TXshCell(sl, fid));
|
||||||
|
}
|
||||||
app->getCurrentColumn()->setColumnIndex(col);
|
app->getCurrentColumn()->setColumnIndex(col);
|
||||||
if (getReviewTime() == 0 || m_isTimeLapse)
|
if (getReviewTime() == 0 || m_isTimeLapse)
|
||||||
app->getCurrentFrame()->setFrame(row + 1);
|
app->getCurrentFrame()->setFrame(row + m_captureNumberOfFrames);
|
||||||
m_xSheetFrameNumber = row + 2;
|
m_xSheetFrameNumber = row + 1 + m_captureNumberOfFrames;
|
||||||
emit(xSheetFrameNumberChanged(m_xSheetFrameNumber));
|
emit(xSheetFrameNumberChanged(m_xSheetFrameNumber));
|
||||||
postImportProcess();
|
postImportProcess();
|
||||||
// if (m_newImage->getLx() > 2000) {
|
|
||||||
// m_subsampling = 4;
|
|
||||||
// setSubsampling();
|
|
||||||
//}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1683,13 +1688,14 @@ bool StopMotion::importImage() {
|
||||||
|
|
||||||
// if there is a column containing the same level
|
// if there is a column containing the same level
|
||||||
if (foundRow >= 0) {
|
if (foundRow >= 0) {
|
||||||
// put the cell at the bottom
|
for (int i = 0; i < m_captureNumberOfFrames; i++) {
|
||||||
xsh->insertCells(row, foundCol);
|
xsh->insertCells(row + i, foundCol);
|
||||||
xsh->setCell(row, foundCol, TXshCell(sl, fid));
|
xsh->setCell(row + i, foundCol, TXshCell(sl, fid));
|
||||||
|
}
|
||||||
app->getCurrentColumn()->setColumnIndex(foundCol);
|
app->getCurrentColumn()->setColumnIndex(foundCol);
|
||||||
if (getReviewTime() == 0 || m_isTimeLapse)
|
if (getReviewTime() == 0 || m_isTimeLapse)
|
||||||
app->getCurrentFrame()->setFrame(row + 1);
|
app->getCurrentFrame()->setFrame(row + m_captureNumberOfFrames);
|
||||||
m_xSheetFrameNumber = row + 2;
|
m_xSheetFrameNumber = row + 1 + m_captureNumberOfFrames;
|
||||||
emit(xSheetFrameNumberChanged(m_xSheetFrameNumber));
|
emit(xSheetFrameNumberChanged(m_xSheetFrameNumber));
|
||||||
}
|
}
|
||||||
// if the level is registered in the scene, but is not placed in the xsheet,
|
// if the level is registered in the scene, but is not placed in the xsheet,
|
||||||
|
@ -1699,11 +1705,13 @@ bool StopMotion::importImage() {
|
||||||
col += 1;
|
col += 1;
|
||||||
xsh->insertColumn(col);
|
xsh->insertColumn(col);
|
||||||
}
|
}
|
||||||
xsh->setCell(row, col, TXshCell(sl, fid));
|
for (int i = 0; i < m_captureNumberOfFrames; i++) {
|
||||||
|
xsh->setCell(row + i, col, TXshCell(sl, fid));
|
||||||
|
}
|
||||||
app->getCurrentColumn()->setColumnIndex(col);
|
app->getCurrentColumn()->setColumnIndex(col);
|
||||||
if (getReviewTime() == 0 || m_isTimeLapse)
|
if (getReviewTime() == 0 || m_isTimeLapse)
|
||||||
app->getCurrentFrame()->setFrame(row + 1);
|
app->getCurrentFrame()->setFrame(row + m_captureNumberOfFrames);
|
||||||
m_xSheetFrameNumber = row + 2;
|
m_xSheetFrameNumber = row + 1 + m_captureNumberOfFrames;
|
||||||
emit(xSheetFrameNumberChanged(m_xSheetFrameNumber));
|
emit(xSheetFrameNumberChanged(m_xSheetFrameNumber));
|
||||||
}
|
}
|
||||||
postImportProcess();
|
postImportProcess();
|
||||||
|
|
|
@ -51,9 +51,10 @@ private:
|
||||||
// file stuff
|
// file stuff
|
||||||
int m_frameNumber = 1;
|
int m_frameNumber = 1;
|
||||||
int m_xSheetFrameNumber = 1;
|
int m_xSheetFrameNumber = 1;
|
||||||
|
int m_captureNumberOfFrames = 1;
|
||||||
QString m_levelName = "";
|
QString m_levelName = "";
|
||||||
QString m_fileType = "jpg";
|
QString m_fileType = "jpg";
|
||||||
QString m_filePath = "+extras";
|
QString m_filePath = "+stopmotion";
|
||||||
QString m_frameInfoText = "";
|
QString m_frameInfoText = "";
|
||||||
QString m_infoColorName = "";
|
QString m_infoColorName = "";
|
||||||
QString m_frameInfoToolTip = "";
|
QString m_frameInfoToolTip = "";
|
||||||
|
@ -114,6 +115,8 @@ public:
|
||||||
// files and frames
|
// files and frames
|
||||||
void setXSheetFrameNumber(int frameNumber);
|
void setXSheetFrameNumber(int frameNumber);
|
||||||
int getXSheetFrameNumber() { return m_xSheetFrameNumber; }
|
int getXSheetFrameNumber() { return m_xSheetFrameNumber; }
|
||||||
|
void setCaptureNumberOfFrames(int frames);
|
||||||
|
int getCaptureNumberOfFrames() { return m_captureNumberOfFrames; }
|
||||||
void setFrameNumber(int frameNumber);
|
void setFrameNumber(int frameNumber);
|
||||||
int getFrameNumber() { return m_frameNumber; }
|
int getFrameNumber() { return m_frameNumber; }
|
||||||
void setLevelName(QString levelName);
|
void setLevelName(QString levelName);
|
||||||
|
@ -236,6 +239,7 @@ signals:
|
||||||
void frameNumberChanged(int);
|
void frameNumberChanged(int);
|
||||||
void frameInfoTextChanged(QString);
|
void frameInfoTextChanged(QString);
|
||||||
void xSheetFrameNumberChanged(int);
|
void xSheetFrameNumberChanged(int);
|
||||||
|
void captureNumberOfFramesChanged(int);
|
||||||
|
|
||||||
// options
|
// options
|
||||||
void optionsChanged();
|
void optionsChanged();
|
||||||
|
|
|
@ -233,6 +233,10 @@ StopMotionController::StopMotionController(QWidget *parent) : QWidget(parent) {
|
||||||
m_previousXSheetFrameButton = new QToolButton(this);
|
m_previousXSheetFrameButton = new QToolButton(this);
|
||||||
m_onionOpacityFld = new DVGui::IntField(this);
|
m_onionOpacityFld = new DVGui::IntField(this);
|
||||||
|
|
||||||
|
m_captureFramesCombo = new QComboBox(this);
|
||||||
|
m_captureFramesCombo->addItems({ "1s", "2s", "3s", "4s", "5s", "6s", "7s", "8s" });
|
||||||
|
m_captureFramesCombo->setCurrentIndex(m_stopMotion->getCaptureNumberOfFrames() - 1);
|
||||||
|
|
||||||
// should choosing the file type is disabled for simplicty
|
// should choosing the file type is disabled for simplicty
|
||||||
// too many options can be a bad thing
|
// too many options can be a bad thing
|
||||||
m_fileTypeCombo = new QComboBox(this);
|
m_fileTypeCombo = new QComboBox(this);
|
||||||
|
@ -412,10 +416,12 @@ StopMotionController::StopMotionController(QWidget *parent) : QWidget(parent) {
|
||||||
fileTypeLay->setMargin(0);
|
fileTypeLay->setMargin(0);
|
||||||
fileTypeLay->setSpacing(3);
|
fileTypeLay->setSpacing(3);
|
||||||
{
|
{
|
||||||
fileTypeLay->addWidget(new QLabel(tr("File Type:"), this), 0);
|
//fileTypeLay->addWidget(new QLabel(tr("File Type:"), this), 0);
|
||||||
fileTypeLay->addWidget(m_fileTypeCombo, 1);
|
fileTypeLay->addWidget(m_fileTypeCombo, 1);
|
||||||
fileTypeLay->addSpacing(10);
|
//fileTypeLay->addSpacing(10);
|
||||||
fileTypeLay->addWidget(m_fileFormatOptionButton);
|
fileTypeLay->addWidget(m_fileFormatOptionButton);
|
||||||
|
m_fileTypeCombo->hide();
|
||||||
|
m_fileFormatOptionButton->hide();
|
||||||
}
|
}
|
||||||
fileLay->addLayout(fileTypeLay, 0);
|
fileLay->addLayout(fileTypeLay, 0);
|
||||||
|
|
||||||
|
@ -423,8 +429,9 @@ StopMotionController::StopMotionController(QWidget *parent) : QWidget(parent) {
|
||||||
saveInLay->setMargin(0);
|
saveInLay->setMargin(0);
|
||||||
saveInLay->setSpacing(3);
|
saveInLay->setSpacing(3);
|
||||||
{
|
{
|
||||||
saveInLay->addWidget(new QLabel(tr("Save In:"), this), 0);
|
//saveInLay->addWidget(new QLabel(tr("Save In:"), this), 0);
|
||||||
saveInLay->addWidget(m_saveInFileFld, 1);
|
saveInLay->addWidget(m_saveInFileFld, 1);
|
||||||
|
m_saveInFileFld->hide();
|
||||||
}
|
}
|
||||||
fileLay->addLayout(saveInLay, 0);
|
fileLay->addLayout(saveInLay, 0);
|
||||||
// fileLay->addWidget(subfolderButton, 0);
|
// fileLay->addWidget(subfolderButton, 0);
|
||||||
|
@ -437,7 +444,9 @@ StopMotionController::StopMotionController(QWidget *parent) : QWidget(parent) {
|
||||||
displayLay->setHorizontalSpacing(3);
|
displayLay->setHorizontalSpacing(3);
|
||||||
displayLay->setVerticalSpacing(5);
|
displayLay->setVerticalSpacing(5);
|
||||||
{
|
{
|
||||||
displayLay->addWidget(new QLabel(tr("XSheet Frame:"), this), 0, 0,
|
displayLay->addWidget(new QLabel(tr("Expose as: ")), 0, 0, Qt::AlignRight);
|
||||||
|
displayLay->addWidget(m_captureFramesCombo, 0, 1, Qt::AlignLeft);
|
||||||
|
displayLay->addWidget(new QLabel(tr("XSheet Frame:"), this), 1, 0,
|
||||||
Qt::AlignRight);
|
Qt::AlignRight);
|
||||||
QHBoxLayout *xsheetLay = new QHBoxLayout();
|
QHBoxLayout *xsheetLay = new QHBoxLayout();
|
||||||
xsheetLay->setMargin(0);
|
xsheetLay->setMargin(0);
|
||||||
|
@ -450,7 +459,7 @@ StopMotionController::StopMotionController(QWidget *parent) : QWidget(parent) {
|
||||||
Qt::AlignCenter);
|
Qt::AlignCenter);
|
||||||
xsheetLay->addStretch(50);
|
xsheetLay->addStretch(50);
|
||||||
}
|
}
|
||||||
displayLay->addLayout(xsheetLay, 0, 1);
|
displayLay->addLayout(xsheetLay, 1, 1);
|
||||||
}
|
}
|
||||||
displayLay->setColumnStretch(0, 0);
|
displayLay->setColumnStretch(0, 0);
|
||||||
displayLay->setColumnStretch(1, 1);
|
displayLay->setColumnStretch(1, 1);
|
||||||
|
@ -1036,6 +1045,10 @@ StopMotionController::StopMotionController(QWidget *parent) : QWidget(parent) {
|
||||||
SLOT(onPreviousXSheetFrame()));
|
SLOT(onPreviousXSheetFrame()));
|
||||||
ret = ret && connect(m_setToCurrentXSheetFrameButton, SIGNAL(clicked()), this,
|
ret = ret && connect(m_setToCurrentXSheetFrameButton, SIGNAL(clicked()), this,
|
||||||
SLOT(setToCurrentXSheetFrame()));
|
SLOT(setToCurrentXSheetFrame()));
|
||||||
|
ret = ret && connect(m_captureFramesCombo, SIGNAL(currentIndexChanged(int)),
|
||||||
|
this, SLOT(onCaptureFramesChanged(int)));
|
||||||
|
ret = ret && connect(m_stopMotion, SIGNAL(captureNumberOfFramesChanged(int)),
|
||||||
|
this, SLOT(onCaptureNumberOfFramesChanged(int)));
|
||||||
ret = ret && connect(m_onionOpacityFld, SIGNAL(valueEditedByHand()), this,
|
ret = ret && connect(m_onionOpacityFld, SIGNAL(valueEditedByHand()), this,
|
||||||
SLOT(onOnionOpacityFldEdited()));
|
SLOT(onOnionOpacityFldEdited()));
|
||||||
ret = ret && connect(m_onionOpacityFld, SIGNAL(valueChanged(bool)), this,
|
ret = ret && connect(m_onionOpacityFld, SIGNAL(valueChanged(bool)), this,
|
||||||
|
@ -1670,6 +1683,12 @@ void StopMotionController::onXSheetFrameNumberChanged(int frameNumber) {
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void StopMotionController::onCaptureNumberOfFramesChanged(int frames) {
|
||||||
|
m_captureFramesCombo->setCurrentIndex(frames - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
void StopMotionController::onFilePathChanged(QString filePath) {
|
void StopMotionController::onFilePathChanged(QString filePath) {
|
||||||
m_saveInFileFld->setPath(filePath);
|
m_saveInFileFld->setPath(filePath);
|
||||||
}
|
}
|
||||||
|
@ -2921,6 +2940,12 @@ void StopMotionController::onXSheetFrameNumberChanged() {
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void StopMotionController::onCaptureFramesChanged(int index) {
|
||||||
|
m_stopMotion->setCaptureNumberOfFrames(index + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
void StopMotionController::onSaveInPathEdited() {
|
void StopMotionController::onSaveInPathEdited() {
|
||||||
m_stopMotion->setFilePath(m_saveInFileFld->getPath());
|
m_stopMotion->setFilePath(m_saveInFileFld->getPath());
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,7 +96,7 @@ class StopMotionController final : public QWidget {
|
||||||
*m_liveViewCompensationSlider;
|
*m_liveViewCompensationSlider;
|
||||||
QComboBox *m_cameraListCombo, *m_exposureCombo, *m_fileTypeCombo,
|
QComboBox *m_cameraListCombo, *m_exposureCombo, *m_fileTypeCombo,
|
||||||
*m_whiteBalanceCombo, *m_resolutionCombo, *m_imageQualityCombo,
|
*m_whiteBalanceCombo, *m_resolutionCombo, *m_imageQualityCombo,
|
||||||
*m_pictureStyleCombo, *m_controlDeviceCombo;
|
*m_pictureStyleCombo, *m_controlDeviceCombo, *m_captureFramesCombo;
|
||||||
LevelNameLineEdit *m_levelNameEdit;
|
LevelNameLineEdit *m_levelNameEdit;
|
||||||
QCheckBox *m_blackScreenForCapture, *m_placeOnXSheetCB, *m_directShowCB,
|
QCheckBox *m_blackScreenForCapture, *m_placeOnXSheetCB, *m_directShowCB,
|
||||||
*m_liveViewOnAllFramesCB, *m_useMjpgCB, *m_useNumpadCB, *m_drawBeneathCB,
|
*m_liveViewOnAllFramesCB, *m_useMjpgCB, *m_useNumpadCB, *m_drawBeneathCB,
|
||||||
|
@ -157,6 +157,8 @@ protected slots:
|
||||||
void onFileTypeActivated();
|
void onFileTypeActivated();
|
||||||
void onFrameNumberChanged();
|
void onFrameNumberChanged();
|
||||||
void onXSheetFrameNumberChanged();
|
void onXSheetFrameNumberChanged();
|
||||||
|
void onCaptureFramesChanged(int index);
|
||||||
|
void onCaptureNumberOfFramesChanged(int frames);
|
||||||
void onFrameCaptured(QImage &image);
|
void onFrameCaptured(QImage &image);
|
||||||
void onOnionOpacityFldEdited();
|
void onOnionOpacityFldEdited();
|
||||||
void onOnionOpacitySliderChanged(bool ignore);
|
void onOnionOpacitySliderChanged(bool ignore);
|
||||||
|
|
|
@ -54,7 +54,8 @@ const std::string
|
||||||
/*! Default outputs folder: is used to save all rendered scenes.*/
|
/*! Default outputs folder: is used to save all rendered scenes.*/
|
||||||
TProject::Outputs = "outputs",
|
TProject::Outputs = "outputs",
|
||||||
/*! Default palettes folder: is used for color design (色指定)*/
|
/*! Default palettes folder: is used for color design (色指定)*/
|
||||||
TProject::Palettes = "palettes";
|
TProject::Palettes = "palettes",
|
||||||
|
TProject::StopMotion = "stopmotion";
|
||||||
//! Default project name
|
//! Default project name
|
||||||
const TFilePath TProject::SandboxProjectName("sandbox");
|
const TFilePath TProject::SandboxProjectName("sandbox");
|
||||||
|
|
||||||
|
@ -944,7 +945,7 @@ void TProjectManager::getFolderNames(std::vector<std::string> &names) {
|
||||||
}
|
}
|
||||||
const std::string stdNames[] = {TProject::Inputs, TProject::Drawings,
|
const std::string stdNames[] = {TProject::Inputs, TProject::Drawings,
|
||||||
TProject::Scenes, TProject::Extras,
|
TProject::Scenes, TProject::Extras,
|
||||||
TProject::Outputs, TProject::Scripts};
|
TProject::Outputs, TProject::Scripts, TProject::StopMotion};
|
||||||
for (auto const &name : stdNames) {
|
for (auto const &name : stdNames) {
|
||||||
// se il nome non e' gia' stato inserito lo aggiungo
|
// se il nome non e' gia' stato inserito lo aggiungo
|
||||||
if (std::find(names.begin(), names.end(), name) == names.end())
|
if (std::find(names.begin(), names.end(), name) == names.end())
|
||||||
|
|
Loading…
Reference in a new issue