Visualizations experimentation

This commit is contained in:
Jonas Kvinge 2024-06-29 18:32:56 +02:00
parent 8e07909961
commit 09f7be21eb
6 changed files with 41 additions and 49 deletions

View File

@ -41,7 +41,6 @@
#endif // HAVE_PROJECTM4
#include <QCoreApplication>
#include <QGraphicsScene>
#include <QString>
#include <QStringList>
#include <QDir>
@ -59,7 +58,7 @@
#include "visualizationcontainer.h"
ProjectMVisualization::ProjectMVisualization(VisualizationContainer *container)
: QGraphicsScene(container),
: QObject(container),
container_(container),
preset_model_(nullptr),
#ifdef HAVE_PROJECTM4
@ -71,8 +70,6 @@ ProjectMVisualization::ProjectMVisualization(VisualizationContainer *container)
texture_size_(512),
pixel_ratio_(container->devicePixelRatio()) {
QObject::connect(this, &QGraphicsScene::sceneRectChanged, this, &ProjectMVisualization::SceneRectChanged);
#ifndef HAVE_PROJECTM4
for (int i = 0; i < TOTAL_RATING_TYPES; ++i) {
default_rating_list_.push_back(3);
@ -193,11 +190,7 @@ void ProjectMVisualization::Init() {
}
void ProjectMVisualization::drawBackground(QPainter *p, const QRectF &rect) {
Q_UNUSED(rect);
p->beginNativePainting();
void ProjectMVisualization::RenderFrame(const int width, const int height) {
#ifdef HAVE_PROJECTM4
if (!projectm_instance_) {
@ -212,15 +205,13 @@ void ProjectMVisualization::drawBackground(QPainter *p, const QRectF &rect) {
#endif
#ifdef HAVE_PROJECTM4
projectm_set_window_size(projectm_instance_, static_cast<size_t>(sceneRect().width() * pixel_ratio_), static_cast<size_t>(sceneRect().height() * pixel_ratio_));
projectm_set_window_size(projectm_instance_, static_cast<size_t>(width * pixel_ratio_), static_cast<size_t>(height * pixel_ratio_));
projectm_opengl_render_frame(projectm_instance_);
#else
projectm_->projectM_resetGL(static_cast<int>(sceneRect().width() * pixel_ratio_), static_cast<int>(sceneRect().height() * pixel_ratio_));
projectm_->projectM_resetGL(static_cast<int>(width * pixel_ratio_), static_cast<int>(height * pixel_ratio_));
projectm_->renderFrame();
#endif // HAVE_PROJECTM4
p->endNativePainting();
}
void ProjectMVisualization::SceneRectChanged(const QRectF &rect) {

View File

@ -34,9 +34,10 @@
# include <libprojectM/projectM.hpp>
#endif
#include <QObject>
#include <QString>
#include <QStringList>
#include <QGraphicsScene>
#include <QRectF>
#include "engine/gstbufferconsumer.h"
@ -45,7 +46,7 @@ class QPainter;
class ProjectMPresetModel;
class VisualizationContainer;
class ProjectMVisualization : public QGraphicsScene, public GstBufferConsumer {
class ProjectMVisualization : public QObject, public GstBufferConsumer {
Q_OBJECT
public:
@ -64,6 +65,7 @@ class ProjectMVisualization : public QGraphicsScene, public GstBufferConsumer {
int duration() const { return duration_; }
void Init();
void RenderFrame(const int width, const int height);
// BufferConsumer
void ConsumeBuffer(GstBuffer *buffer, const int pipeline_id, const QString &format) override;
@ -80,10 +82,6 @@ class ProjectMVisualization : public QGraphicsScene, public GstBufferConsumer {
void Lock(const bool lock);
protected:
// QGraphicsScene
void drawBackground(QPainter *painter, const QRectF &rect) override;
private slots:
void SceneRectChanged(const QRectF &rect);

View File

@ -62,7 +62,7 @@ constexpr int kDefaultTextureSize = 512;
} // namespace
VisualizationContainer::VisualizationContainer(QWidget *parent)
: QGraphicsView(parent),
: QMainWindow(parent),
projectm_visualization_(new ProjectMVisualization(this)),
overlay_(new VisualizationOverlay),
selector_(new VisualizationSelector(this)),
@ -91,19 +91,10 @@ VisualizationContainer::VisualizationContainer(QWidget *parent)
QObject::connect(close, &QShortcut::activated, this, &VisualizationContainer::close);
// Set up the graphics view
setScene(projectm_visualization_);
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
setViewport(new VisualizationOpenGLWidget(projectm_visualization_));
#else
setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
#endif
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setFrameStyle(QFrame::NoFrame);
setCentralWidget(new VisualizationOpenGLWidget(projectm_visualization_));
// Add the overlay
overlay_proxy_ = scene()->addWidget(overlay_);
//overlay_proxy_ = scene()->addWidget(overlay_);
QObject::connect(overlay_, &VisualizationOverlay::OpacityChanged, this, &VisualizationContainer::ChangeOverlayOpacity);
QObject::connect(overlay_, &VisualizationOverlay::ShowPopupMenu, this, &VisualizationContainer::ShowPopupMenu);
ChangeOverlayOpacity(0.0);
@ -170,7 +161,7 @@ void VisualizationContainer::showEvent(QShowEvent *e) {
qLog(Debug) << "Showing visualization";
QGraphicsView::showEvent(e);
QMainWindow::showEvent(e);
update_timer_.start(1000 / fps_, this);
@ -182,7 +173,7 @@ void VisualizationContainer::hideEvent(QHideEvent *e) {
qLog(Debug) << "Hiding visualization";
QGraphicsView::hideEvent(e);
QMainWindow::hideEvent(e);
update_timer_.stop();
@ -201,7 +192,7 @@ void VisualizationContainer::closeEvent(QCloseEvent *e) {
}
void VisualizationContainer::resizeEvent(QResizeEvent *e) {
QGraphicsView::resizeEvent(e);
QMainWindow::resizeEvent(e);
SizeChanged();
}
@ -213,7 +204,7 @@ void VisualizationContainer::SizeChanged() {
s.setValue("geometry", saveGeometry());
// Resize the scene
if (scene()) scene()->setSceneRect(QRect(QPoint(0, 0), size()));
//if (scene()) scene()->setSceneRect(QRect(QPoint(0, 0), size()));
// Resize the overlay
if (overlay_) overlay_->resize(size());
@ -222,8 +213,8 @@ void VisualizationContainer::SizeChanged() {
void VisualizationContainer::timerEvent(QTimerEvent *e) {
QGraphicsView::timerEvent(e);
if (e->timerId() == update_timer_.timerId()) scene()->update();
QMainWindow::timerEvent(e);
//if (e->timerId() == update_timer_.timerId()) scene()->update();
}
@ -241,14 +232,15 @@ void VisualizationContainer::Stopped() {
void VisualizationContainer::ChangeOverlayOpacity(const qreal value) {
overlay_proxy_->setOpacity(value);
if (overlay_proxy_)
overlay_proxy_->setOpacity(value);
// Hide the cursor if the overlay is hidden
if (value < 0.5) {
viewport()->setCursor(Qt::BlankCursor);
//viewport()->setCursor(Qt::BlankCursor);
}
else {
viewport()->unsetCursor();
//viewport()->unsetCursor();
}
@ -260,29 +252,29 @@ void VisualizationContainer::enterEvent(QEnterEvent *e) {
void VisualizationContainer::enterEvent(QEvent *e) {
#endif
QGraphicsView::enterEvent(e);
QMainWindow::enterEvent(e);
overlay_->SetVisible(true);
}
void VisualizationContainer::leaveEvent(QEvent *e) {
QGraphicsView::leaveEvent(e);
QMainWindow::leaveEvent(e);
overlay_->SetVisible(false);
}
void VisualizationContainer::mouseMoveEvent(QMouseEvent *e) {
QGraphicsView::mouseMoveEvent(e);
QMainWindow::mouseMoveEvent(e);
overlay_->SetVisible(true);
}
void VisualizationContainer::mouseDoubleClickEvent(QMouseEvent *e) {
QGraphicsView::mouseDoubleClickEvent(e);
QMainWindow::mouseDoubleClickEvent(e);
ToggleFullscreen();
}
void VisualizationContainer::contextMenuEvent(QContextMenuEvent *event) {
QGraphicsView::contextMenuEvent(event);
QMainWindow::contextMenuEvent(event);
ShowPopupMenu(event->pos());
}
@ -298,7 +290,7 @@ void VisualizationContainer::keyReleaseEvent(QKeyEvent *event) {
return;
}
QGraphicsView::keyReleaseEvent(event);
QMainWindow::keyReleaseEvent(event);
}

View File

@ -25,7 +25,7 @@
#include "config.h"
#include <QBasicTimer>
#include <QGraphicsView>
#include <QMainWindow>
#include "core/song.h"
@ -49,7 +49,7 @@ class QKeyEvent;
class QEnterEvent;
#endif
class VisualizationContainer : public QGraphicsView {
class VisualizationContainer : public QMainWindow {
Q_OBJECT
public:

View File

@ -19,7 +19,7 @@
#include "config.h"
#include <QtGlobal>
#include <QPainter>
#include "visualizationopenglwidget.h"
#include "projectmvisualization.h"
@ -35,3 +35,13 @@ void VisualizationOpenGLWidget::initializeGL() {
QOpenGLWidget::initializeGL();
}
void VisualizationOpenGLWidget::paintGL() {
QPainter p(this);
p.beginNativePainting();
projectm_visualization_->RenderFrame(width(), height());
p.endNativePainting();
update();
}

View File

@ -34,6 +34,7 @@ class VisualizationOpenGLWidget : public QOpenGLWidget {
protected:
void initializeGL() override;
void paintGL() override;
private:
ProjectMVisualization *projectm_visualization_;