diff --git a/stuff/profiles/layouts/rooms/Default/menubar_template.xml b/stuff/profiles/layouts/rooms/Default/menubar_template.xml index 6c9f3b8..92a3b14 100644 --- a/stuff/profiles/layouts/rooms/Default/menubar_template.xml +++ b/stuff/profiles/layouts/rooms/Default/menubar_template.xml @@ -34,6 +34,7 @@ <separator/> <command>MI_OutputSettings</command> <command>MI_Render</command> + <command>MI_FastRender</command> <separator/> <command>MI_PrintXsheet</command> <command>MI_Print</command> diff --git a/toonz/sources/image/ffmpeg/tiio_mp4.cpp b/toonz/sources/image/ffmpeg/tiio_mp4.cpp index 173d627..1e83e1a 100644 --- a/toonz/sources/image/ffmpeg/tiio_mp4.cpp +++ b/toonz/sources/image/ffmpeg/tiio_mp4.cpp @@ -39,11 +39,16 @@ private: TLevelWriterMp4::TLevelWriterMp4(const TFilePath &path, TPropertyGroup *winfo) : TLevelWriter(path, winfo) { if (!m_properties) m_properties = new Tiio::Mp4WriterProperties(); - std::string scale = m_properties->getProperty("Scale")->getValueAsString(); - m_scale = QString::fromStdString(scale).toInt(); - std::string quality = - m_properties->getProperty("Quality")->getValueAsString(); - m_vidQuality = QString::fromStdString(quality).toInt(); + if (m_properties->getPropertyCount() == 0) { + m_scale = 100; + m_vidQuality = 100; + } else { + std::string scale = m_properties->getProperty("Scale")->getValueAsString(); + m_scale = QString::fromStdString(scale).toInt(); + std::string quality = + m_properties->getProperty("Quality")->getValueAsString(); + m_vidQuality = QString::fromStdString(quality).toInt(); + } ffmpegWriter = new Ffmpeg(); ffmpegWriter->setPath(m_path); if (TSystem::doesExistFileOrLevel(m_path)) TSystem::deleteFile(m_path); diff --git a/toonz/sources/include/toonz/preferences.h b/toonz/sources/include/toonz/preferences.h index 56f7e3e..4e3e30d 100644 --- a/toonz/sources/include/toonz/preferences.h +++ b/toonz/sources/include/toonz/preferences.h @@ -411,7 +411,8 @@ public: bool getPrecompute() { return m_precompute; } void setFfmpegTimeout(int seconds); int getFfmpegTimeout() { return m_ffmpegTimeout; } - + void setFastRenderPath(std::string path); + QString getFastRenderPath() const { return m_fastRenderPath; } // Uncategorized - internals void setAskForOverrideRender(bool on); @@ -455,6 +456,7 @@ private: QString m_units, m_cameraUnits, m_scanLevelType, m_currentRoomChoice, m_oldUnits, m_oldCameraUnits, m_ffmpegPath, m_shortcutPreset, m_customProjectRoot; + QString m_fastRenderPath; double m_defLevelWidth, m_defLevelHeight, m_defLevelDpi; diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index 23c7403..1a070a6 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1601,6 +1601,7 @@ void MainWindow::defineActions() { createMenuFileAction(MI_OutputSettings, tr("&Output Settings..."), "Ctrl+O"); createMenuFileAction(MI_PreviewSettings, tr("&Preview Settings..."), ""); createMenuFileAction(MI_Render, tr("&Render"), "Ctrl+Shift+R"); + createMenuFileAction(MI_FastRender, tr("&Fast Render to MP4"), "Alt+R"); createMenuFileAction(MI_Preview, tr("&Preview"), "Ctrl+R"); createRightClickMenuAction(MI_SavePreviewedFrames, tr("&Save Previewed Frames"), ""); diff --git a/toonz/sources/toonz/menubar.cpp b/toonz/sources/toonz/menubar.cpp index c578245..97b4398 100644 --- a/toonz/sources/toonz/menubar.cpp +++ b/toonz/sources/toonz/menubar.cpp @@ -1099,6 +1099,7 @@ QMenuBar *StackedMenuBar::createFullMenuBar() { fileMenu->addSeparator(); addMenuItem(fileMenu, MI_OutputSettings); addMenuItem(fileMenu, MI_Render); + addMenuItem(fileMenu, MI_FastRender); // addMenuItem(fileMenu, MI_SavePreviewedFrames); fileMenu->addSeparator(); addMenuItem(fileMenu, MI_PrintXsheet); diff --git a/toonz/sources/toonz/menubarcommandids.h b/toonz/sources/toonz/menubarcommandids.h index 6c79b5e..0b7f96b 100644 --- a/toonz/sources/toonz/menubarcommandids.h +++ b/toonz/sources/toonz/menubarcommandids.h @@ -41,6 +41,7 @@ #define MI_OutputSettings "MI_OutputSettings" #define MI_PreviewSettings "MI_PreviewSettings" #define MI_Render "MI_Render" +#define MI_FastRender "MI_FastRender" #define MI_Preview "MI_Preview" #define MI_RegeneratePreview "MI_RegeneratePreview" #define MI_RegenerateFramePr "MI_RegenerateFramePr" diff --git a/toonz/sources/toonz/preferencespopup.cpp b/toonz/sources/toonz/preferencespopup.cpp index d9d06f1..2b518ae 100644 --- a/toonz/sources/toonz/preferencespopup.cpp +++ b/toonz/sources/toonz/preferencespopup.cpp @@ -923,6 +923,13 @@ void PreferencesPopup::onFfmpegPathChanged() { //----------------------------------------------------------------------------- +void PreferencesPopup::onFastRenderPathChanged() { + QString text = m_fastRenderPathFileField->getPath(); + m_pref->setFastRenderPath(text.toStdString()); +} + +//----------------------------------------------------------------------------- + void PreferencesPopup::onFfmpegTimeoutChanged() { m_pref->setFfmpegTimeout(m_ffmpegTimeout->getValue()); } @@ -1118,7 +1125,9 @@ PreferencesPopup::PreferencesPopup() //--- Import/Export ------------------------------ categoryList->addItem(tr("Import/Export")); m_ffmpegPathFileFld = new DVGui::FileField(this, QString("")); - m_ffmpegTimeout = new DVGui::IntLineEdit(this, 30, 1); + m_fastRenderPathFileField = + new DVGui::FileField(this, QString("desktop"), false, true); + m_ffmpegTimeout = new DVGui::IntLineEdit(this, 30, 1); //--- Drawing ------------------------------ categoryList->addItem(tr("Drawing")); @@ -1342,6 +1351,8 @@ PreferencesPopup::PreferencesPopup() //--- Import/Export ------------------------------ QString path = m_pref->getFfmpegPath(); m_ffmpegPathFileFld->setPath(path); + path = m_pref->getFastRenderPath(); + m_fastRenderPathFileField->setPath(path); m_ffmpegTimeout->setValue(m_pref->getFfmpegTimeout()); //--- Drawing ------------------------------ @@ -1755,6 +1766,14 @@ PreferencesPopup::PreferencesPopup() ioGridLay->addWidget(new QLabel(tr("FFmpeg Timeout:")), 4, 0, Qt::AlignRight); ioGridLay->addWidget(m_ffmpegTimeout, 4, 1, 1, 3); + ioGridLay->addWidget(new QLabel(" "), 5, 0); + ioGridLay->addWidget( + new QLabel(tr("Please indicate where you would like " + "exports from Fast Render(MP4) to go.")), + 6, 0, 1, 4); + ioGridLay->addWidget(new QLabel(tr("Fast Render Path: ")), 7, 0, + Qt::AlignRight); + ioGridLay->addWidget(m_fastRenderPathFileField, 7, 1, 1, 3); } ioLay->addLayout(ioGridLay); ioLay->addStretch(1); @@ -2128,6 +2147,8 @@ PreferencesPopup::PreferencesPopup() //--- Import/Export ---------------------- ret = ret && connect(m_ffmpegPathFileFld, SIGNAL(pathChanged()), this, SLOT(onFfmpegPathChanged())); + ret = ret && connect(m_fastRenderPathFileField, SIGNAL(pathChanged()), this, + SLOT(onFastRenderPathChanged())); ret = ret && connect(m_ffmpegTimeout, SIGNAL(editingFinished()), this, SLOT(onFfmpegTimeoutChanged())); diff --git a/toonz/sources/toonz/preferencespopup.h b/toonz/sources/toonz/preferencespopup.h index ba790d7..ddc1be1 100644 --- a/toonz/sources/toonz/preferencespopup.h +++ b/toonz/sources/toonz/preferencespopup.h @@ -76,7 +76,7 @@ private: DVGui::FileField *m_customProjectRootFileField; - DVGui::FileField *m_ffmpegPathFileFld; + DVGui::FileField *m_ffmpegPathFileFld, *m_fastRenderPathFileField; QGroupBox *m_autoSaveGroup; @@ -168,6 +168,7 @@ private slots: void onShowKeyframesOnCellAreaChanged(int); void onFfmpegPathChanged(); void onFfmpegTimeoutChanged(); + void onFastRenderPathChanged(); void onUseNumpadForSwitchingStylesClicked(bool); }; diff --git a/toonz/sources/toonz/rendercommand.cpp b/toonz/sources/toonz/rendercommand.cpp index adaf9f8..5af6af1 100644 --- a/toonz/sources/toonz/rendercommand.cpp +++ b/toonz/sources/toonz/rendercommand.cpp @@ -214,6 +214,7 @@ public: , m_timeStretchFactor(1) , m_multimediaRender(0) { setCommandHandler("MI_Render", this, &RenderCommand::onRender); + setCommandHandler("MI_FastRender", this, &RenderCommand::onFastRender); setCommandHandler("MI_Preview", this, &RenderCommand::onPreview); } @@ -222,6 +223,7 @@ public: void rasterRender(bool isPreview); void multimediaRender(); void onRender(); + void onFastRender(); void onPreview(); static void resetBgColor(); void doRender(bool isPreview); @@ -788,6 +790,38 @@ void RenderCommand::multimediaRender() { void RenderCommand::onRender() { doRender(false); } +void RenderCommand::onFastRender() { + TOutputProperties *prop = TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProperties() + ->getOutputProperties(); + QString sceneName = QString::fromStdWString( + TApp::instance()->getCurrentScene()->getScene()->getSceneName()); + QString location = Preferences::instance()->getFastRenderPath(); + if (location == "desktop" || location == "Desktop") { + location = + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); + } + TFilePath path = TFilePath(location) + TFilePath(sceneName + ".mp4"); + TFilePath currPath = prop->getPath(); + + QStringList formats; + TImageWriter::getSupportedFormats(formats, true); + TLevelWriter::getSupportedFormats(formats, true); + Tiio::Writer::getSupportedFormats(formats, true); + if (!formats.contains("mp4")) { + QString msg = QObject::tr( + "FFmpeg not found, please set the location in the Preferences and " + "restart."); + DVGui::warning(msg); + return; + } + prop->setPath(path); + doRender(false); + prop->setPath(currPath); +} + void RenderCommand::onPreview() { doRender(true); } //--------------------------------------------------------- diff --git a/toonz/sources/toonzlib/preferences.cpp b/toonz/sources/toonzlib/preferences.cpp index b325637..3d63618 100644 --- a/toonz/sources/toonzlib/preferences.cpp +++ b/toonz/sources/toonzlib/preferences.cpp @@ -294,6 +294,7 @@ Preferences::Preferences() , m_projectRoot(0x08) , m_customProjectRoot("") , m_precompute(true) + , m_fastRenderPath("desktop") , m_ffmpegTimeout(30) , m_shortcutPreset("defopentoonz") , m_useNumpadForSwitchingStyles(true) { @@ -561,6 +562,9 @@ Preferences::Preferences() QString ffmpegPath = m_settings->value("ffmpegPath").toString(); if (ffmpegPath != "") m_ffmpegPath = ffmpegPath; setFfmpegPath(m_ffmpegPath.toStdString()); + QString fastRenderPath = m_settings->value("fastRenderPath").toString(); + if (fastRenderPath != "") m_fastRenderPath = fastRenderPath; + setFastRenderPath(m_fastRenderPath.toStdString()); getValue(*m_settings, "ffmpegTimeout", m_ffmpegTimeout); QString shortcutPreset = m_settings->value("shortcutPreset").toString(); if (shortcutPreset != "") m_shortcutPreset = shortcutPreset; @@ -1259,6 +1263,14 @@ void Preferences::setFfmpegPath(std::string path) { //----------------------------------------------------------------- +void Preferences::setFastRenderPath(std::string path) { + m_fastRenderPath = QString::fromStdString(path); + std::string strPath = m_ffmpegPath.toStdString(); + m_settings->setValue("fastRenderPath", m_fastRenderPath); +} + +//----------------------------------------------------------------- + void Preferences::setShortcutPreset(std::string preset) { m_shortcutPreset = QString::fromStdString(preset); m_settings->setValue("shortcutPreset", m_shortcutPreset);