Render To Folders

This commit is contained in:
manongjohn 2023-09-29 13:58:37 -04:00
parent cdef06c259
commit ab2b67c21e
14 changed files with 183 additions and 46 deletions

View file

@ -98,6 +98,7 @@ public:
int m_multimedia; int m_multimedia;
bool m_renderKeysOnly; bool m_renderKeysOnly;
bool m_renderToFolders;
int m_threadsIndex; int m_threadsIndex;
int m_maxTileSizeIndex; int m_maxTileSizeIndex;
@ -120,9 +121,9 @@ public:
const QString &user, const QString &host, int stepCount, const QString &user, const QString &host, int stepCount,
int priority, const TFilePath &taskFilePath, int priority, const TFilePath &taskFilePath,
const TFilePath &outputPath, int from, int to, int step, int shrink, const TFilePath &outputPath, int from, int to, int step, int shrink,
int multimedia, bool renderKeysOnly, int chunksize, int multimedia, bool renderKeysOnly, bool renderToFolders,
int threadsIndex, int maxTileSizeIndex, OverwriteBehavior overwrite, int chunksize, int threadsIndex, int maxTileSizeIndex,
bool onlyvisible); OverwriteBehavior overwrite, bool onlyvisible);
virtual ~TFarmTask() { delete m_dependencies; } virtual ~TFarmTask() { delete m_dependencies; }
@ -157,8 +158,8 @@ public:
const QString &host, int stepCount, int priority, const QString &host, int stepCount, int priority,
const TFilePath &taskFilePath, const TFilePath &outputPath, const TFilePath &taskFilePath, const TFilePath &outputPath,
int from, int to, int step, int shrink, int multimedia, int from, int to, int step, int shrink, int multimedia,
bool renderKeysOnly, int chunksize, int threadsIndex, bool renderKeysOnly, bool renderToFolders, int chunksize,
int maxTileSizeIndex); int threadsIndex, int maxTileSizeIndex);
TFarmTaskGroup(const QString &id, const QString &name, const QString &user, TFarmTaskGroup(const QString &id, const QString &name, const QString &user,
const QString &host, int stepCount, int priority, const QString &host, int stepCount, int priority,

View file

@ -68,7 +68,8 @@ public:
MultimediaRenderer(ToonzScene *scene, const TFilePath &moviePath, MultimediaRenderer(ToonzScene *scene, const TFilePath &moviePath,
int multimediaMode, bool renderKeysOnly, int multimediaMode, bool renderKeysOnly,
int threadCount = 1, bool cacheResults = true); bool renderToFolders, int threadCount = 1,
bool cacheResults = true);
~MultimediaRenderer(); ~MultimediaRenderer();
@ -85,6 +86,7 @@ public:
enum { COLUMNS = 1, LAYERS = 2 }; enum { COLUMNS = 1, LAYERS = 2 };
int getMultimediaMode() const; int getMultimediaMode() const;
bool isRenderKeysOnly() const; bool isRenderKeysOnly() const;
bool isRenderToFolders() const;
//! Returns the currently active TRenderer. //! Returns the currently active TRenderer.
TRenderer *getTRenderer(); TRenderer *getTRenderer();

View file

@ -87,6 +87,7 @@ private:
int m_multimediaRendering; int m_multimediaRendering;
bool m_renderKeysOnly; bool m_renderKeysOnly;
bool m_renderToFolders;
int m_maxTileSizeIndex; int m_maxTileSizeIndex;
int m_threadIndex; int m_threadIndex;
@ -215,6 +216,11 @@ Insert in \b v all extension in format properties of output settings.
void setRenderKeysOnly(bool keysOnly) { m_renderKeysOnly = keysOnly; } void setRenderKeysOnly(bool keysOnly) { m_renderKeysOnly = keysOnly; }
bool isRenderKeysOnly() const { return m_renderKeysOnly; } bool isRenderKeysOnly() const { return m_renderKeysOnly; }
void setRenderToFolders(bool renderToFolders) {
m_renderToFolders = renderToFolders;
}
bool isRenderToFolders() const { return m_renderToFolders; }
/*! Sets the granularity of raster allocations for rendering processes. /*! Sets the granularity of raster allocations for rendering processes.
The specified value refers to an index associated with const values, The specified value refers to an index associated with const values,
spanning from 0 (no bound, ie giant rasters are allowed) to 3 (highly spanning from 0 (no bound, ie giant rasters are allowed) to 3 (highly

View file

@ -487,6 +487,7 @@ static std::pair<int, int> generateMovie(ToonzScene *scene, const TFilePath &fp,
int multimediaRender = outputSettings.getMultimediaRendering(); int multimediaRender = outputSettings.getMultimediaRendering();
bool renderKeysOnly = outputSettings.isRenderKeysOnly(); bool renderKeysOnly = outputSettings.isRenderKeysOnly();
bool renderToFolders = outputSettings.isRenderToFolders();
//--------------------------------------------------------- //---------------------------------------------------------
// Multimedia render // Multimedia render
@ -494,7 +495,8 @@ static std::pair<int, int> generateMovie(ToonzScene *scene, const TFilePath &fp,
if (multimediaRender) { if (multimediaRender) {
MultimediaRenderer multimediaRenderer(scene, fp, multimediaRender, MultimediaRenderer multimediaRenderer(scene, fp, multimediaRender,
renderKeysOnly, threadCount); renderKeysOnly, renderToFolders,
threadCount);
TRenderSettings rs = outputSettings.getRenderSettings(); TRenderSettings rs = outputSettings.getRenderSettings();
rs.m_maxTileSize = maxTileSize; rs.m_maxTileSize = maxTileSize;
rs.m_shrinkX = rs.m_shrinkY = shrink; rs.m_shrinkX = rs.m_shrinkY = shrink;
@ -610,6 +612,7 @@ int main(int argc, char *argv[]) {
IntQualifier shrinkOpt("-shrink n", "Shrink"); IntQualifier shrinkOpt("-shrink n", "Shrink");
IntQualifier multimedia("-multimedia n", "Multimedia rendering mode"); IntQualifier multimedia("-multimedia n", "Multimedia rendering mode");
IntQualifier renderKeysOnly("-renderkeysonly n", "Render keys drawings only"); IntQualifier renderKeysOnly("-renderkeysonly n", "Render keys drawings only");
IntQualifier renderToFolders("-rendertofolders n", "Render To Folders");
StringQualifier farmData("-farm data", "TFarm Controller"); StringQualifier farmData("-farm data", "TFarm Controller");
StringQualifier idq("-id n", "id"); StringQualifier idq("-id n", "id");
StringQualifier nthreads("-nthreads n", "Number of rendering threads"); StringQualifier nthreads("-nthreads n", "Number of rendering threads");
@ -617,7 +620,8 @@ int main(int argc, char *argv[]) {
"Enable tile rendering of max n MB per tile"); "Enable tile rendering of max n MB per tile");
StringQualifier tmsg("-tmsg val", "only internal use"); StringQualifier tmsg("-tmsg val", "only internal use");
usageLine = srcName + dstName + range + stepOpt + shrinkOpt + multimedia + usageLine = srcName + dstName + range + stepOpt + shrinkOpt + multimedia +
renderKeysOnly + farmData + idq + nthreads + tileSize + tmsg; renderKeysOnly + renderToFolders + farmData + idq + nthreads +
tileSize + tmsg;
// system path qualifiers // system path qualifiers
std::map<QString, std::unique_ptr<TCli::QualifierT<TFilePath>>> std::map<QString, std::unique_ptr<TCli::QualifierT<TFilePath>>>
@ -932,6 +936,9 @@ int main(int argc, char *argv[]) {
if (renderKeysOnly.isSelected()) if (renderKeysOnly.isSelected())
scene->getProperties()->getOutputProperties()->setRenderKeysOnly( scene->getProperties()->getOutputProperties()->setRenderKeysOnly(
renderKeysOnly.getValue()); renderKeysOnly.getValue());
if (renderToFolders.isSelected())
scene->getProperties()->getOutputProperties()->setRenderToFolders(
renderToFolders.getValue());
// Retrieve Thread count // Retrieve Thread count
const int procCount = TSystem::getProcessorCount(); const int procCount = TSystem::getProcessorCount();

View file

@ -361,6 +361,7 @@ void BatchesController::addComposerTask(const TFilePath &_taskFilePath) {
int multimedia = out.getMultimediaRendering(); int multimedia = out.getMultimediaRendering();
bool renderKeysOnly = out.isRenderKeysOnly(); bool renderKeysOnly = out.isRenderKeysOnly();
bool renderToFolders = out.isRenderToFolders();
int threadsIndex = out.getThreadIndex(); int threadsIndex = out.getThreadIndex();
int maxTileSizeIndex = out.getMaxTileSizeIndex(); int maxTileSizeIndex = out.getMaxTileSizeIndex();
@ -386,7 +387,8 @@ void BatchesController::addComposerTask(const TFilePath &_taskFilePath) {
TFarmTaskGroup *taskGroup = new TFarmTaskGroup( TFarmTaskGroup *taskGroup = new TFarmTaskGroup(
id, name, TSystem::getUserName(), TSystem::getHostName(), sceneFrameCount, id, name, TSystem::getUserName(), TSystem::getHostName(), sceneFrameCount,
50, taskFilePath, outputPath, r0, r1, step, shrink, multimedia, 50, taskFilePath, outputPath, r0, r1, step, shrink, multimedia,
renderKeysOnly, taskChunkSize, threadsIndex, maxTileSizeIndex); renderKeysOnly, renderToFolders, taskChunkSize, threadsIndex,
maxTileSizeIndex);
try { try {
BatchesController::instance()->addTask(id, taskGroup); BatchesController::instance()->addTask(id, taskGroup);

View file

@ -941,6 +941,9 @@ QFrame *OutputSettingsPopup::createMoreSettingsBox() {
m_renderKeysOnly = new DVGui::CheckBox(tr("Render Key Drawings Only"), this); m_renderKeysOnly = new DVGui::CheckBox(tr("Render Key Drawings Only"), this);
m_renderKeysOnly->setEnabled(false); m_renderKeysOnly->setEnabled(false);
m_renderToFolders = new DVGui::CheckBox(tr("Render To Folders"), this);
m_renderToFolders->setEnabled(false);
//----- //-----
QGridLayout *lay = new QGridLayout(); QGridLayout *lay = new QGridLayout();
@ -983,9 +986,11 @@ QFrame *OutputSettingsPopup::createMoreSettingsBox() {
Qt::AlignLeft | Qt::AlignVCenter); Qt::AlignLeft | Qt::AlignVCenter);
lay->addWidget(m_renderKeysOnly, 6, 1, 1, 3, lay->addWidget(m_renderKeysOnly, 6, 1, 1, 3,
Qt::AlignLeft | Qt::AlignVCenter); Qt::AlignLeft | Qt::AlignVCenter);
lay->addWidget(m_renderToFolders, 7, 1, 1, 3,
Qt::AlignLeft | Qt::AlignVCenter);
lay->addWidget(m_doStereoscopy, 7, 0); lay->addWidget(m_doStereoscopy, 8, 0);
lay->addWidget(new QLabel(tr("Camera Shift:")), 7, 1, 1, 2, lay->addWidget(new QLabel(tr("Camera Shift:")), 8, 1, 1, 2,
Qt::AlignRight | Qt::AlignVCenter); Qt::AlignRight | Qt::AlignVCenter);
lay->addWidget(m_stereoShift, 8, 3, Qt::AlignLeft | Qt::AlignVCenter); lay->addWidget(m_stereoShift, 8, 3, Qt::AlignLeft | Qt::AlignVCenter);
} }
@ -1020,6 +1025,8 @@ QFrame *OutputSettingsPopup::createMoreSettingsBox() {
SLOT(onStereoChanged())); SLOT(onStereoChanged()));
ret = ret && connect(m_renderKeysOnly, SIGNAL(stateChanged(int)), this, ret = ret && connect(m_renderKeysOnly, SIGNAL(stateChanged(int)), this,
SLOT(onRenderKeysOnlyChecked(int))); SLOT(onRenderKeysOnlyChecked(int)));
ret = ret && connect(m_renderToFolders, SIGNAL(stateChanged(int)), this,
SLOT(onRenderToFoldersChecked(int)));
assert(ret); assert(ret);
return moreSettingsBox; return moreSettingsBox;
} }
@ -1173,7 +1180,9 @@ void OutputSettingsPopup::updateField() {
m_fileFormat->findText(QString::fromStdString(path.getType()))); m_fileFormat->findText(QString::fromStdString(path.getType())));
m_multimediaOm->setCurrentIndex(prop->getMultimediaRendering()); m_multimediaOm->setCurrentIndex(prop->getMultimediaRendering());
m_renderKeysOnly->setChecked(prop->isRenderKeysOnly()); m_renderKeysOnly->setChecked(prop->isRenderKeysOnly());
m_renderToFolders->setChecked(prop->isRenderToFolders());
m_renderKeysOnly->setEnabled(prop->getMultimediaRendering()); m_renderKeysOnly->setEnabled(prop->getMultimediaRendering());
m_renderToFolders->setEnabled(prop->getMultimediaRendering());
} }
// Refresh format if allow-multithread was toggled // Refresh format if allow-multithread was toggled
@ -1841,6 +1850,7 @@ void OutputSettingsPopup::onMultimediaChanged(int state) {
prop->setMultimediaRendering(state); prop->setMultimediaRendering(state);
m_renderKeysOnly->setEnabled(state); m_renderKeysOnly->setEnabled(state);
m_renderToFolders->setEnabled(state);
TApp::instance()->getCurrentScene()->setDirtyFlag(true); TApp::instance()->getCurrentScene()->setDirtyFlag(true);
} }
@ -1857,6 +1867,16 @@ void OutputSettingsPopup::onRenderKeysOnlyChecked(int) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void OutputSettingsPopup::onRenderToFoldersChecked(int) {
if (!getCurrentScene()) return;
TOutputProperties *prop = getProperties();
prop->setRenderToFolders(m_renderToFolders->isChecked());
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
}
//-----------------------------------------------------------------------------
void OutputSettingsPopup::onThreadsComboChanged(int type) { void OutputSettingsPopup::onThreadsComboChanged(int type) {
if (!getCurrentScene()) return; if (!getCurrentScene()) return;
TOutputProperties *prop = getProperties(); TOutputProperties *prop = getProperties();

View file

@ -71,6 +71,7 @@ class OutputSettingsPopup : public DVGui::Dialog {
QComboBox *m_threadsComboOm; QComboBox *m_threadsComboOm;
bool m_allowMT; bool m_allowMT;
DVGui::CheckBox *m_renderKeysOnly; DVGui::CheckBox *m_renderKeysOnly;
DVGui::CheckBox *m_renderToFolders;
DVGui::DoubleLineEdit *m_frameRateFld; DVGui::DoubleLineEdit *m_frameRateFld;
QPushButton *m_fileFormatButton; QPushButton *m_fileFormatButton;
@ -133,6 +134,7 @@ protected slots:
void onSubcameraChecked(int state); void onSubcameraChecked(int state);
void onMultimediaChanged(int mode); void onMultimediaChanged(int mode);
void onRenderKeysOnlyChecked(int); void onRenderKeysOnlyChecked(int);
void onRenderToFoldersChecked(int);
void onThreadsComboChanged(int type); void onThreadsComboChanged(int type);
void onRasterGranularityChanged(int type); void onRasterGranularityChanged(int type);
void onStereoChecked(int); void onStereoChecked(int);

View file

@ -163,6 +163,7 @@ class RenderCommand {
int m_multimediaRender; int m_multimediaRender;
bool m_renderKeysOnly; bool m_renderKeysOnly;
bool m_renderToFolders;
public: public:
RenderCommand() RenderCommand()
@ -175,7 +176,8 @@ public:
, m_oldCameraRes(0, 0) , m_oldCameraRes(0, 0)
, m_timeStretchFactor(1) , m_timeStretchFactor(1)
, m_multimediaRender(0) , m_multimediaRender(0)
, m_renderKeysOnly(false) { , m_renderKeysOnly(false)
, m_renderToFolders(false) {
setCommandHandler("MI_Render", this, &RenderCommand::onRender); setCommandHandler("MI_Render", this, &RenderCommand::onRender);
setCommandHandler("MI_SaveAndRender", this, &RenderCommand::onSaveAndRender); setCommandHandler("MI_SaveAndRender", this, &RenderCommand::onSaveAndRender);
setCommandHandler("MI_FastRender", this, &RenderCommand::onFastRender); setCommandHandler("MI_FastRender", this, &RenderCommand::onFastRender);
@ -241,6 +243,7 @@ sprop->getOutputProperties()->setRenderSettings(rso);*/
m_stepd = m_step; m_stepd = m_step;
m_multimediaRender = 0; m_multimediaRender = 0;
m_renderKeysOnly = false; m_renderKeysOnly = false;
m_renderToFolders = false;
return true; return true;
} }
@ -306,6 +309,7 @@ sprop->getOutputProperties()->setRenderSettings(rso);*/
// Update the multimedia render switch // Update the multimedia render switch
m_multimediaRender = outputSettings.getMultimediaRendering(); m_multimediaRender = outputSettings.getMultimediaRendering();
m_renderKeysOnly = outputSettings.isRenderKeysOnly(); m_renderKeysOnly = outputSettings.isRenderKeysOnly();
m_renderToFolders = outputSettings.isRenderToFolders();
return true; return true;
} }
@ -735,10 +739,11 @@ void RenderCommand::multimediaRender() {
TRenderSettings rs = prop->getRenderSettings(); TRenderSettings rs = prop->getRenderSettings();
rs.m_maxTileSize = maxTileSizes[index]; rs.m_maxTileSize = maxTileSizes[index];
int multimedia = prop->getMultimediaRendering(); int multimedia = prop->getMultimediaRendering();
bool renderKeysOnly = prop->isRenderKeysOnly(); bool renderKeysOnly = prop->isRenderKeysOnly();
bool renderToFolders = prop->isRenderToFolders();
MultimediaRenderer multimediaRenderer(scene, m_fp, multimedia, renderKeysOnly, MultimediaRenderer multimediaRenderer(scene, m_fp, multimedia, renderKeysOnly,
threadCount); renderToFolders, threadCount);
multimediaRenderer.setRenderSettings(rs); multimediaRenderer.setRenderSettings(rs);
TPointD cameraDpi = scene->getCurrentCamera()->getDpi(); TPointD cameraDpi = scene->getCurrentCamera()->getDpi();

View file

@ -341,7 +341,9 @@ void TaskSheet::update(TFarmTask *task) {
m_shrink->setText(QString::number(task->m_shrink)); m_shrink->setText(QString::number(task->m_shrink));
m_multimedia->setCurrentIndex(task->m_multimedia); m_multimedia->setCurrentIndex(task->m_multimedia);
m_renderKeysOnly->setChecked(task->m_renderKeysOnly); m_renderKeysOnly->setChecked(task->m_renderKeysOnly);
m_renderToFolders->setChecked(task->m_renderToFolders);
m_renderKeysOnly->setEnabled(m_multimedia->currentIndex()); m_renderKeysOnly->setEnabled(m_multimedia->currentIndex());
m_renderToFolders->setEnabled(m_multimedia->currentIndex());
m_threadsCombo->setCurrentIndex(task->m_threadsIndex); m_threadsCombo->setCurrentIndex(task->m_threadsIndex);
m_rasterGranularityCombo->setCurrentIndex(task->m_maxTileSizeIndex); m_rasterGranularityCombo->setCurrentIndex(task->m_maxTileSizeIndex);
@ -695,6 +697,7 @@ void TaskSheet::setMultimedia(int) {
} }
m_renderKeysOnly->setEnabled(m_multimedia->currentIndex()); m_renderKeysOnly->setEnabled(m_multimedia->currentIndex());
m_renderToFolders->setEnabled(m_multimedia->currentIndex());
m_viewer->startTimer(); m_viewer->startTimer();
} }
@ -723,6 +726,28 @@ void TaskSheet::setRenderKeysOnly(int) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void TaskSheet::setRenderToFolders(int) {
if (!m_task) return;
if (m_task->m_renderToFolders ==
(m_renderToFolders->checkState() == Qt::Checked))
return;
m_task->m_renderToFolders = (m_renderToFolders->checkState() == Qt::Checked);
m_commandLine->setText(m_task->getCommandLine());
BatchesController::instance()->setDirtyFlag(true);
// Update children tasks, if present.
TFarmTaskGroup *taskGroup = dynamic_cast<TFarmTaskGroup *>(m_task);
if (taskGroup) {
for (int i = 0; i < taskGroup->getTaskCount(); ++i)
taskGroup->getTask(i)->m_renderToFolders = taskGroup->m_renderToFolders;
}
m_viewer->startTimer();
}
//-----------------------------------------------------------------------------
void TaskSheet::setThreadsCombo(int) { void TaskSheet::setThreadsCombo(int) {
if (!m_task) return; if (!m_task) return;
if (m_task->m_threadsIndex == m_threadsCombo->currentIndex()) return; if (m_task->m_threadsIndex == m_threadsCombo->currentIndex()) return;
@ -873,6 +898,8 @@ TaskSheet::TaskSheet(TasksViewer *owner) : QScrollArea(owner) {
Qt::AlignLeft | Qt::AlignTop, row1++); Qt::AlignLeft | Qt::AlignTop, row1++);
::create(m_renderKeysOnly, layout1, tr("Render Key Drawings Only"), row1++, ::create(m_renderKeysOnly, layout1, tr("Render Key Drawings Only"), row1++,
4); 4);
::create(m_renderToFolders, layout1, tr("Render To Folders"), row1++,
4);
::create(m_from, m_to, layout1, tr("From:"), tr("To:"), ::create(m_from, m_to, layout1, tr("From:"), tr("To:"),
Qt::AlignRight | Qt::AlignTop, Qt::AlignRight | Qt::AlignTop, Qt::AlignRight | Qt::AlignTop, Qt::AlignRight | Qt::AlignTop,
row1++); row1++);
@ -887,6 +914,7 @@ TaskSheet::TaskSheet(TasksViewer *owner) : QScrollArea(owner) {
m_multimedia->addItems(multimediaTypes); m_multimedia->addItems(multimediaTypes);
m_renderKeysOnly->setEnabled(false); m_renderKeysOnly->setEnabled(false);
m_renderToFolders->setEnabled(false);
::create(m_threadsCombo, layout1, tr("Dedicated CPUs:"), row1++, 3); ::create(m_threadsCombo, layout1, tr("Dedicated CPUs:"), row1++, 3);
QStringList threadsTypes; QStringList threadsTypes;
@ -985,6 +1013,8 @@ TaskSheet::TaskSheet(TasksViewer *owner) : QScrollArea(owner) {
SLOT(setMultimedia(int))); SLOT(setMultimedia(int)));
ret = ret && connect(m_renderKeysOnly, SIGNAL(stateChanged(int)), this, ret = ret && connect(m_renderKeysOnly, SIGNAL(stateChanged(int)), this,
SLOT(setRenderKeysOnly(int))); SLOT(setRenderKeysOnly(int)));
ret = ret && connect(m_renderToFolders, SIGNAL(stateChanged(int)), this,
SLOT(setRenderToFolders(int)));
ret = ret && connect(m_visible, SIGNAL(stateChanged(int)), this, ret = ret && connect(m_visible, SIGNAL(stateChanged(int)), this,
SLOT(setVisible(int))); SLOT(setVisible(int)));

View file

@ -127,6 +127,7 @@ class TaskSheet final : public QScrollArea {
QListWidget *m_notAddedBox; QListWidget *m_notAddedBox;
DVGui::CheckBox *m_visible; DVGui::CheckBox *m_visible;
DVGui::CheckBox *m_renderKeysOnly; DVGui::CheckBox *m_renderKeysOnly;
DVGui::CheckBox *m_renderToFolders;
QComboBox *m_overwrite; QComboBox *m_overwrite;
QComboBox *m_multimedia; QComboBox *m_multimedia;
QComboBox *m_threadsCombo; QComboBox *m_threadsCombo;
@ -150,6 +151,7 @@ protected slots:
void setOverwrite(int); void setOverwrite(int);
void setMultimedia(int); void setMultimedia(int);
void setRenderKeysOnly(int); void setRenderKeysOnly(int);
void setRenderToFolders(int);
void setThreadsCombo(int); void setThreadsCombo(int);
void setGranularityCombo(int); void setGranularityCombo(int);
void setPriority(); void setPriority();

View file

@ -130,6 +130,7 @@ TFarmTask::TFarmTask(const QString &name)
, m_chunkSize(-1) , m_chunkSize(-1)
, m_multimedia(0) // Full render, no multimedia , m_multimedia(0) // Full render, no multimedia
, m_renderKeysOnly(false) , m_renderKeysOnly(false)
, m_renderToFolders(false)
, m_threadsIndex(2) // All threads , m_threadsIndex(2) // All threads
, m_maxTileSizeIndex(0) // No tiling , m_maxTileSizeIndex(0) // No tiling
, m_overwrite() , m_overwrite()
@ -144,8 +145,9 @@ TFarmTask::TFarmTask(const QString &id, const QString &name, bool composerTask,
int priority, const TFilePath &taskFilePath, int priority, const TFilePath &taskFilePath,
const TFilePath &outputPath, int from, int to, int step, const TFilePath &outputPath, int from, int to, int step,
int shrink, int multimedia, bool renderKeysOnly, int shrink, int multimedia, bool renderKeysOnly,
int chunksize, int threadsIndex, int maxTileSizeIndex, bool renderToFolders, int chunksize, int threadsIndex,
OverwriteBehavior overwrite, bool onlyvisible) int maxTileSizeIndex, OverwriteBehavior overwrite,
bool onlyvisible)
: m_isComposerTask(composerTask) : m_isComposerTask(composerTask)
, m_id(id) , m_id(id)
@ -166,6 +168,7 @@ TFarmTask::TFarmTask(const QString &id, const QString &name, bool composerTask,
, m_shrink(shrink) , m_shrink(shrink)
, m_multimedia(multimedia) , m_multimedia(multimedia)
, m_renderKeysOnly(renderKeysOnly) , m_renderKeysOnly(renderKeysOnly)
, m_renderToFolders(renderToFolders)
, m_threadsIndex(threadsIndex) , m_threadsIndex(threadsIndex)
, m_maxTileSizeIndex(maxTileSizeIndex) , m_maxTileSizeIndex(maxTileSizeIndex)
, m_chunkSize(chunksize) , m_chunkSize(chunksize)
@ -224,6 +227,7 @@ TFarmTask &TFarmTask::operator=(const TFarmTask &rhs) {
m_overwrite = rhs.m_overwrite; m_overwrite = rhs.m_overwrite;
m_multimedia = rhs.m_multimedia; m_multimedia = rhs.m_multimedia;
m_renderKeysOnly = rhs.m_renderKeysOnly; m_renderKeysOnly = rhs.m_renderKeysOnly;
m_renderToFolders = rhs.m_renderToFolders;
m_threadsIndex = rhs.m_threadsIndex; m_threadsIndex = rhs.m_threadsIndex;
m_maxTileSizeIndex = rhs.m_maxTileSizeIndex; m_maxTileSizeIndex = rhs.m_maxTileSizeIndex;
m_chunkSize = rhs.m_chunkSize; m_chunkSize = rhs.m_chunkSize;
@ -266,6 +270,7 @@ bool TFarmTask::operator==(const TFarmTask &task) {
task.m_shrink == m_shrink && task.m_onlyVisible == m_onlyVisible && task.m_shrink == m_shrink && task.m_onlyVisible == m_onlyVisible &&
task.m_overwrite == m_overwrite && task.m_multimedia == m_multimedia && task.m_overwrite == m_overwrite && task.m_multimedia == m_multimedia &&
task.m_renderKeysOnly == m_renderKeysOnly && task.m_renderKeysOnly == m_renderKeysOnly &&
task.m_renderToFolders == m_renderToFolders &&
task.m_threadsIndex == m_threadsIndex && task.m_threadsIndex == m_threadsIndex &&
task.m_maxTileSizeIndex == m_maxTileSizeIndex && task.m_maxTileSizeIndex == m_maxTileSizeIndex &&
task.m_chunkSize == m_chunkSize && equalDependencies); task.m_chunkSize == m_chunkSize && equalDependencies);
@ -449,6 +454,9 @@ void TFarmTask::parseCommandLine(QString commandLine) {
} else if (l.at(i) == "-renderkeysonly") { } else if (l.at(i) == "-renderkeysonly") {
m_renderKeysOnly = (l.at(i + 1).toInt()); m_renderKeysOnly = (l.at(i + 1).toInt());
i += 2; i += 2;
} else if (l.at(i) == "-rendertofolders") {
m_renderToFolders = (l.at(i + 1).toInt());
i += 2;
} else if (l.at(i) == "-nthreads") { } else if (l.at(i) == "-nthreads") {
QString str(l.at(i + 1)); QString str(l.at(i + 1));
@ -534,6 +542,7 @@ QString TFarmTask::getCommandLineArguments() const {
cmdline += " -shrink " + QString::number(m_shrink); cmdline += " -shrink " + QString::number(m_shrink);
cmdline += " -multimedia " + QString::number(m_multimedia); cmdline += " -multimedia " + QString::number(m_multimedia);
cmdline += " -renderkeysonly " + QString::number(m_renderKeysOnly ? 1 : 0); cmdline += " -renderkeysonly " + QString::number(m_renderKeysOnly ? 1 : 0);
cmdline += " -rendertofolders " + QString::number(m_renderToFolders ? 1 : 0);
const QString threadCounts[3] = {"single", "half", "all"}; const QString threadCounts[3] = {"single", "half", "all"};
cmdline += " -nthreads " + threadCounts[m_threadsIndex]; cmdline += " -nthreads " + threadCounts[m_threadsIndex];
@ -588,6 +597,7 @@ QStringList TFarmTask::getCommandLineArgumentsList() const {
ret << "-shrink" << QString::number(m_shrink); ret << "-shrink" << QString::number(m_shrink);
ret << "-multimedia" << QString::number(m_multimedia); ret << "-multimedia" << QString::number(m_multimedia);
ret << "-renderkeysonly" << QString::number(m_renderKeysOnly ? 1 : 0); ret << "-renderkeysonly" << QString::number(m_renderKeysOnly ? 1 : 0);
ret << "-rendertofolders" << QString::number(m_renderToFolders ? 1 : 0);
const QString threadCounts[3] = {"single", "half", "all"}; const QString threadCounts[3] = {"single", "half", "all"};
ret << "-nthreads" << threadCounts[m_threadsIndex]; ret << "-nthreads" << threadCounts[m_threadsIndex];
@ -673,8 +683,9 @@ bool TFarmTaskGroup::changeChunkSize(int chunksize) {
TFarmTask *subTask = new TFarmTask( TFarmTask *subTask = new TFarmTask(
m_id + "." + toString(i, 2, '0'), subName, true, m_user, m_hostName, m_id + "." + toString(i, 2, '0'), subName, true, m_user, m_hostName,
rb - ra + 1, m_priority, m_taskFilePath, m_outputPath, ra, rb, rb - ra + 1, m_priority, m_taskFilePath, m_outputPath, ra, rb,
m_step, m_shrink, m_multimedia, m_renderKeysOnly, m_chunkSize, m_step, m_shrink, m_multimedia, m_renderKeysOnly, m_renderToFolders,
m_threadsIndex, m_maxTileSizeIndex, Overwrite_Off, false); m_chunkSize, m_threadsIndex, m_maxTileSizeIndex, Overwrite_Off,
false);
subTask->m_parentId = m_id; subTask->m_parentId = m_id;
addTask(subTask); addTask(subTask);
@ -691,18 +702,17 @@ bool TFarmTaskGroup::changeChunkSize(int chunksize) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
TFarmTaskGroup::TFarmTaskGroup(const QString &id, const QString &name, TFarmTaskGroup::TFarmTaskGroup(
const QString &user, const QString &host, const QString &id, const QString &name, const QString &user,
int stepCount, int priority, const QString &host, int stepCount, int priority,
const TFilePath &taskFilePath, const TFilePath &taskFilePath, const TFilePath &outputPath, int from,
const TFilePath &outputPath, int from, int to, int to, int step, int shrink, int multimedia, bool renderKeysOnly,
int step, int shrink, int multimedia, bool renderToFolders, int chunksize, int threadsIndex, int maxTileSizeIndex)
bool renderKeysOnly, int chunksize,
int threadsIndex, int maxTileSizeIndex)
: TFarmTask(id, name, true, user, host, stepCount, priority, taskFilePath, : TFarmTask(id, name, true, user, host, stepCount, priority, taskFilePath,
outputPath, from, to, step, shrink, multimedia, renderKeysOnly, outputPath, from, to, step, shrink, multimedia, renderKeysOnly,
chunksize, threadsIndex, maxTileSizeIndex, Overwrite_Off, false) renderToFolders, chunksize, threadsIndex, maxTileSizeIndex,
Overwrite_Off, false)
, m_imp(new Imp()) { , m_imp(new Imp()) {
int subCount = 0; int subCount = 0;
if (chunksize > 0) subCount = tceil((to - from + 1) / (double)chunksize); if (chunksize > 0) subCount = tceil((to - from + 1) / (double)chunksize);
@ -720,8 +730,8 @@ TFarmTaskGroup::TFarmTaskGroup(const QString &id, const QString &name,
TFarmTask *subTask = new TFarmTask( TFarmTask *subTask = new TFarmTask(
id + "." + toString(i, 2, '0'), subName, true, user, host, id + "." + toString(i, 2, '0'), subName, true, user, host,
stepCount, priority, taskFilePath, outputPath, ra, rb, step, shrink, stepCount, priority, taskFilePath, outputPath, ra, rb, step, shrink,
multimedia, renderKeysOnly, chunksize, threadsIndex, multimedia, renderKeysOnly, renderToFolders, chunksize,
maxTileSizeIndex, Overwrite_Off, false); threadsIndex, maxTileSizeIndex, Overwrite_Off, false);
subTask->m_parentId = id; subTask->m_parentId = id;
addTask(subTask); addTask(subTask);
@ -742,7 +752,8 @@ TFarmTaskGroup::TFarmTaskGroup(const QString &id, const QString &name,
const TFilePath &taskFilePath, const TFilePath &taskFilePath,
OverwriteBehavior overwrite, bool onlyvisible) OverwriteBehavior overwrite, bool onlyvisible)
: TFarmTask(id, name, false, user, host, stepCount, priority, taskFilePath, : TFarmTask(id, name, false, user, host, stepCount, priority, taskFilePath,
TFilePath(), 0, 0, 0, 0, 0, 0, 0, 0, 0, overwrite, onlyvisible) TFilePath(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, overwrite,
onlyvisible)
, m_imp(new Imp()) {} , m_imp(new Imp()) {}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View file

@ -4,6 +4,7 @@
#include "toonz/multimediarenderer.h" #include "toonz/multimediarenderer.h"
#include "toonz/movierenderer.h" #include "toonz/movierenderer.h"
#include "trenderer.h" #include "trenderer.h"
#include "tsystem.h"
// Scene structures // Scene structures
#include "toonz/toonzscene.h" #include "toonz/toonzscene.h"
@ -73,9 +74,11 @@ public:
int m_multimediaMode; int m_multimediaMode;
bool m_renderKeysOnly; bool m_renderKeysOnly;
bool m_renderToFolders;
Imp(ToonzScene *scene, const TFilePath &moviePath, int multimediaMode, Imp(ToonzScene *scene, const TFilePath &moviePath, int multimediaMode,
bool renderKeysOnly, int threadCount, bool cacheResults); bool renderKeysOnly, bool renderToFolders, int threadCount,
bool cacheResults);
~Imp(); ~Imp();
@ -100,7 +103,8 @@ public:
MultimediaRenderer::Imp::Imp(ToonzScene *scene, const TFilePath &moviePath, MultimediaRenderer::Imp::Imp(ToonzScene *scene, const TFilePath &moviePath,
int multimediaMode, bool renderKeysOnly, int multimediaMode, bool renderKeysOnly,
int threadCount, bool cacheResults) bool renderToFolders, int threadCount,
bool cacheResults)
: m_scene(scene) : m_scene(scene)
, m_fp(moviePath) , m_fp(moviePath)
, m_threadCount(threadCount) , m_threadCount(threadCount)
@ -114,7 +118,8 @@ MultimediaRenderer::Imp::Imp(ToonzScene *scene, const TFilePath &moviePath,
, m_currentFx(0) , m_currentFx(0)
, m_currentFrame() , m_currentFrame()
, m_multimediaMode(multimediaMode) , m_multimediaMode(multimediaMode)
, m_renderKeysOnly(renderKeysOnly) { , m_renderKeysOnly(renderKeysOnly)
, m_renderToFolders(renderToFolders) {
// Retrieve all fx nodes to be rendered in this process. // Retrieve all fx nodes to be rendered in this process.
scanSceneForRenderNodes(); scanSceneForRenderNodes();
} }
@ -394,13 +399,39 @@ void MultimediaRenderer::Imp::start() {
std::wstring fxNameNoSpaces(::removeSpaces(fxName)); std::wstring fxNameNoSpaces(::removeSpaces(fxName));
std::wstring fxId(currFx->getFxId()); std::wstring fxId(currFx->getFxId());
std::wstring fpName = std::wstring fpName;
m_fp.getWideName() + L"_" + columnName +
(columnId == columnName ? L"" : L"(" + columnId + L")") + TFilePath fp = m_fp;
(fxId.empty() ? L"" : L"_" + fxName + (fxId == fxNameNoSpaces
? L"" if (!m_renderToFolders)
: L"(" + fxId + L")")); fpName = fp.getWideName() + L"_" + columnName +
TFilePath movieFp(m_fp.withName(fpName)); (columnId == columnName ? L"" : L"(" + columnId + L")") +
(fxId.empty()
? L""
: L"_" + fxName +
(fxId == fxNameNoSpaces ? L"" : L"(" + fxId + L")"));
else {
fp = fp.getParentDir() + TFilePath(fp.getWideName()) +
TFilePath(columnName +
(columnId == columnName ? L"" : L"(" + columnId + L")")) +
columnName;
fp = fp.withType(m_fp.getType());
if (!TSystem::doesExistFileOrLevel(fp.getParentDir())) {
TFilePath parentDir = fp.getParentDir();
try {
TSystem::mkDir(parentDir);
} catch (...) {
break;
}
}
fpName = columnName +
((fxId.empty() || m_multimediaMode == 1)
? L""
: L"_" + fxName +
(fxId == fxNameNoSpaces ? L"" : L"(" + fxId + L")"));
}
TFilePath movieFp(fp.withName(fpName));
// Initialize a MovieRenderer with our infos // Initialize a MovieRenderer with our infos
MovieRenderer movieRenderer(m_scene, movieFp, m_threadCount, false); MovieRenderer movieRenderer(m_scene, movieFp, m_threadCount, false);
@ -487,9 +518,10 @@ void MultimediaRenderer::Imp::onRenderCompleted() {
MultimediaRenderer::MultimediaRenderer(ToonzScene *scene, MultimediaRenderer::MultimediaRenderer(ToonzScene *scene,
const TFilePath &moviePath, const TFilePath &moviePath,
int multimediaMode, bool renderKeysOnly, int multimediaMode, bool renderKeysOnly,
int threadCount, bool cacheResults) bool renderToFolders, int threadCount,
bool cacheResults)
: m_imp(new Imp(scene, moviePath, multimediaMode, renderKeysOnly, : m_imp(new Imp(scene, moviePath, multimediaMode, renderKeysOnly,
threadCount, cacheResults)) { renderToFolders, threadCount, cacheResults)) {
m_imp->addRef(); m_imp->addRef();
} }
@ -527,6 +559,12 @@ bool MultimediaRenderer::isRenderKeysOnly() const {
//--------------------------------------------------------- //---------------------------------------------------------
bool MultimediaRenderer::isRenderToFolders() const {
return m_imp->m_renderToFolders;
}
//---------------------------------------------------------
void MultimediaRenderer::setRenderSettings( void MultimediaRenderer::setRenderSettings(
const TRenderSettings &renderSettings) { const TRenderSettings &renderSettings) {
// assert(m_imp->m_framesOnRendering.empty()); // assert(m_imp->m_framesOnRendering.empty());

View file

@ -39,6 +39,7 @@ TOutputProperties::TOutputProperties()
, m_whichLevels(false) , m_whichLevels(false)
, m_multimediaRendering(0) , m_multimediaRendering(0)
, m_renderKeysOnly(false) , m_renderKeysOnly(false)
, m_renderToFolders(false)
, m_maxTileSizeIndex(0) , m_maxTileSizeIndex(0)
, m_threadIndex(2) , m_threadIndex(2)
, m_subcameraPreview(false) , m_subcameraPreview(false)
@ -63,6 +64,7 @@ TOutputProperties::TOutputProperties(const TOutputProperties &src)
, m_step(src.m_step) , m_step(src.m_step)
, m_multimediaRendering(src.m_multimediaRendering) , m_multimediaRendering(src.m_multimediaRendering)
, m_renderKeysOnly(src.m_renderKeysOnly) , m_renderKeysOnly(src.m_renderKeysOnly)
, m_renderToFolders(src.m_renderToFolders)
, m_maxTileSizeIndex(src.m_maxTileSizeIndex) , m_maxTileSizeIndex(src.m_maxTileSizeIndex)
, m_threadIndex(src.m_threadIndex) , m_threadIndex(src.m_threadIndex)
, m_subcameraPreview(src.m_subcameraPreview) , m_subcameraPreview(src.m_subcameraPreview)
@ -99,6 +101,7 @@ TOutputProperties &TOutputProperties::operator=(const TOutputProperties &src) {
m_multimediaRendering = src.m_multimediaRendering; m_multimediaRendering = src.m_multimediaRendering;
m_renderKeysOnly = src.m_renderKeysOnly; m_renderKeysOnly = src.m_renderKeysOnly;
m_renderToFolders = src.m_renderToFolders;
m_maxTileSizeIndex = src.m_maxTileSizeIndex; m_maxTileSizeIndex = src.m_maxTileSizeIndex;
m_threadIndex = src.m_threadIndex; m_threadIndex = src.m_threadIndex;
m_subcameraPreview = src.m_subcameraPreview; m_subcameraPreview = src.m_subcameraPreview;

View file

@ -260,8 +260,12 @@ void TSceneProperties::saveData(TOStream &os) const {
os.child("multimedia") << out.getMultimediaRendering(); os.child("multimedia") << out.getMultimediaRendering();
// Save render keys only if enabled and multimedia set to anything except // Save render keys only if enabled and multimedia set to anything except
// None // None
if (out.getMultimediaRendering() && out.isRenderKeysOnly()) if (out.getMultimediaRendering()) {
os.child("renderKeysOnly") << (out.isRenderKeysOnly() ? 1 : 0); if (out.isRenderKeysOnly())
os.child("renderKeysOnly") << (out.isRenderKeysOnly() ? 1 : 0);
if (out.isRenderToFolders())
os.child("renderToFolders") << (out.isRenderToFolders() ? 1 : 0);
}
os.child("threadsIndex") << out.getThreadIndex(); os.child("threadsIndex") << out.getThreadIndex();
os.child("maxTileSizeIndex") << out.getMaxTileSizeIndex(); os.child("maxTileSizeIndex") << out.getMaxTileSizeIndex();
os.child("subcameraPrev") << (out.isSubcameraPreview() ? 1 : 0); os.child("subcameraPrev") << (out.isSubcameraPreview() ? 1 : 0);
@ -597,6 +601,10 @@ void TSceneProperties::loadData(TIStream &is, bool isLoadingProject) {
int renderKeysOnly; int renderKeysOnly;
is >> renderKeysOnly; is >> renderKeysOnly;
out.setRenderKeysOnly(renderKeysOnly == 1); out.setRenderKeysOnly(renderKeysOnly == 1);
} else if (tagName == "renderToFolders") {
int renderToFolders;
is >> renderToFolders;
out.setRenderToFolders(renderToFolders == 1);
} else if (tagName == "threadsIndex") { } else if (tagName == "threadsIndex") {
int j; int j;
is >> j; is >> j;