lightpreview: add "Camera Bookmarks" submenu

This commit is contained in:
Eric Wasylishen 2024-02-25 23:35:30 -07:00
parent 1e53d45a6c
commit 1f02b50441
4 changed files with 114 additions and 0 deletions

View File

@ -900,6 +900,7 @@ void GLView::setCamera(const qvec3d &origin, const qvec3d &fwd)
{
m_cameraOrigin = {(float)origin[0], (float)origin[1], (float)origin[2]};
m_cameraFwd = {(float)fwd[0], (float)fwd[1], (float)fwd[2]};
update();
}
void GLView::setLighmapOnly(bool lighmapOnly)
@ -1919,3 +1920,8 @@ qvec3f GLView::cameraPosition() const
{
return qvec3f{m_cameraOrigin[0], m_cameraOrigin[1], m_cameraOrigin[2]};
}
qvec3f GLView::cameraForward() const
{
return qvec3f{m_cameraFwd[0], m_cameraFwd[1], m_cameraFwd[2]};
}

View File

@ -279,4 +279,5 @@ signals:
public:
qvec3f cameraPosition() const;
qvec3f cameraForward() const;
};

View File

@ -103,6 +103,81 @@ static QStringList GetRecents()
return recents;
}
// Camera Bookmarks
static constexpr auto CAMERA_BOOKMARKS_SETTINGS_KEY = "camera_bookmarks";
static constexpr size_t MAX_CAMERA_BOOKMARKS = 10;
struct camera_bookmark_t {
qvec3f origin;
qvec3f forward;
};
static void ClearCameraBookmarks()
{
QSettings s;
s.setValue(CAMERA_BOOKMARKS_SETTINGS_KEY, QStringList());
}
static QString CameraBookmarkToQString(const camera_bookmark_t &b) {
return QString("%1 %2 %3 %4 %5 %6")
.arg(b.origin[0])
.arg(b.origin[1])
.arg(b.origin[2])
.arg(b.forward[0])
.arg(b.forward[1])
.arg(b.forward[2]);
}
static std::optional<camera_bookmark_t> CameraBookmarkFromQString(const QString &string) {
QStringList parts = string.split(' ', Qt::SkipEmptyParts);
if (parts.length() != 6)
return std::nullopt;
camera_bookmark_t result;
result.origin[0] = parts[0].toFloat();
result.origin[1] = parts[1].toFloat();
result.origin[2] = parts[2].toFloat();
result.forward[0] = parts[3].toFloat();
result.forward[1] = parts[4].toFloat();
result.forward[2] = parts[5].toFloat();
return {result};
}
/**
* Updates the recent camera bookmarks settings by pushing the given camera pos to the front
* and trimming the list to MAX_CAMERA_BOOKMARKS.
*/
static void AddCameraBookmark(const camera_bookmark_t &b)
{
QSettings s;
QStringList qt_strings = s.value(CAMERA_BOOKMARKS_SETTINGS_KEY).toStringList();
qt_strings.push_front(CameraBookmarkToQString(b));
while (qt_strings.size() > MAX_CAMERA_BOOKMARKS) {
qt_strings.pop_back();
}
s.setValue(CAMERA_BOOKMARKS_SETTINGS_KEY, qt_strings);
}
static std::vector<camera_bookmark_t> GetCameraBookmarks()
{
QSettings s;
QStringList qt_strings = s.value(CAMERA_BOOKMARKS_SETTINGS_KEY).toStringList();
std::vector<camera_bookmark_t> result;
for (const QString &qt_string : qt_strings) {
if (auto parsed = CameraBookmarkFromQString(qt_string); parsed) {
result.push_back(*parsed);
}
}
return result;
}
// ETLogWidget
ETLogWidget::ETLogWidget(QWidget *parent)
: QTabWidget(parent)
@ -442,6 +517,34 @@ void MainWindow::updateRecentsSubmenu(const QStringList &recents)
});
}
void MainWindow::updateCameraBookmarksSubmenu() {
cameraBookmarksMenu->clear();
cameraBookmarksMenu->addAction(tr("Bookmark Current Camera Position"), this, [this]() {
camera_bookmark_t b {
.origin = this->glView->cameraPosition(),
.forward = this->glView->cameraForward()
};
AddCameraBookmark(b);
this->updateCameraBookmarksSubmenu();
});
cameraBookmarksMenu->addSeparator();
auto bookmarks = GetCameraBookmarks();
for (const auto &bookmark : bookmarks) {
auto *action = cameraBookmarksMenu->addAction(CameraBookmarkToQString(bookmark));
connect(action, &QAction::triggered, this, [this, bookmark]() {
this->glView->setCamera(bookmark.origin, bookmark.forward);
});
}
cameraBookmarksMenu->addSeparator();
cameraBookmarksMenu->addAction(tr("Clear Camera Bookmarks"), this, [this]() {
ClearCameraBookmarks();
this->updateCameraBookmarksSubmenu();
});
}
MainWindow::~MainWindow() { }
static void OpenHelpFile(const QString &file) {
@ -485,6 +588,8 @@ void MainWindow::setupMenu()
// view menu
viewMenu = menuBar()->addMenu(tr("&View"));
cameraBookmarksMenu = viewMenu->addMenu(tr("Camera Bookmarks"));
updateCameraBookmarksSubmenu();
// help menu

View File

@ -91,6 +91,7 @@ private:
void logWidgetSetText(ETLogTab tab, const std::string &str);
void createStatusBar();
void updateRecentsSubmenu(const QStringList &recents);
void updateCameraBookmarksSubmenu();
void setupMenu();
void fileOpen();
void takeScreenshot();
@ -128,6 +129,7 @@ private:
QVBoxLayout *lightstyles = nullptr;
QMenu *viewMenu = nullptr;
QMenu *cameraBookmarksMenu = nullptr;
QMenu *openRecentMenu = nullptr;
ETLogWidget *m_outputLogWidget = nullptr;