Big bang
This commit is contained in:
126
src/magnum_item.cpp
Normal file
126
src/magnum_item.cpp
Normal file
@@ -0,0 +1,126 @@
|
||||
#include <Magnum/GL/Framebuffer.h>
|
||||
#include <Magnum/Platform/GLContext.h>
|
||||
#include <QtCore/QRunnable>
|
||||
#include <QtQuick/QQuickWindow>
|
||||
#include <QOpenGLFramebufferObject>
|
||||
#include "magnum_item.h"
|
||||
#include "magnum_render.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace Magnum;
|
||||
using namespace Math::Literals;
|
||||
|
||||
class MagnumFBORenderer : public QQuickFramebufferObject::Renderer {
|
||||
public:
|
||||
MagnumFBORenderer(QQuickWindow *window, MagnumRenderer *renderer) :
|
||||
m_window(window),
|
||||
m_renderer(renderer) {}
|
||||
|
||||
void render() override {
|
||||
m_renderer->render();
|
||||
m_window->resetOpenGLState();
|
||||
update();
|
||||
}
|
||||
|
||||
void synchronize(QQuickFramebufferObject *item) override {
|
||||
auto mitem = static_cast<MagnumItem*>(item);
|
||||
m_renderer->t(mitem->t());
|
||||
m_renderer->hue(mitem->hue());
|
||||
m_renderer->count(mitem->count());
|
||||
}
|
||||
|
||||
QOpenGLFramebufferObject *createFramebufferObject(const QSize &size) override {
|
||||
QOpenGLFramebufferObjectFormat format;
|
||||
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
|
||||
format.setSamples(4);
|
||||
m_fbo = new QOpenGLFramebufferObject(size, format);
|
||||
// ---
|
||||
if (m_ctx == nullptr)
|
||||
m_ctx = new Platform::GLContext();
|
||||
Platform::GLContext::makeCurrent(m_ctx);
|
||||
m_renderer->reset(
|
||||
m_ctx,
|
||||
GL::Framebuffer::wrap(
|
||||
m_fbo->handle(), {{}, {size.width(),
|
||||
size.height()}}),
|
||||
Vector2i{m_window->width(), m_window->height()},
|
||||
Vector2i{size.width(), size.height()});
|
||||
return m_fbo;
|
||||
}
|
||||
|
||||
private:
|
||||
QQuickWindow *m_window;
|
||||
QOpenGLFramebufferObject *m_fbo;
|
||||
Platform::GLContext *m_ctx{};
|
||||
MagnumRenderer *m_renderer;
|
||||
};
|
||||
|
||||
MagnumItem::MagnumItem() : m_renderer(new MagnumRenderer()) {
|
||||
setMirrorVertically(true);
|
||||
setAcceptHoverEvents(true);
|
||||
setAcceptedMouseButtons(Qt::AllButtons);
|
||||
setFlag(ItemAcceptsInputMethod, true);
|
||||
}
|
||||
|
||||
QQuickFramebufferObject::Renderer *MagnumItem::createRenderer() const {
|
||||
return new MagnumFBORenderer(window(), m_renderer);
|
||||
}
|
||||
|
||||
void MagnumItem::setT(qreal t) {
|
||||
if (t == m_t) return;
|
||||
m_t = t;
|
||||
emit tChanged();
|
||||
update();
|
||||
}
|
||||
|
||||
void MagnumItem::setHue(qreal hue) {
|
||||
if (hue == m_hue) return;
|
||||
m_hue = hue;
|
||||
emit hueChanged();
|
||||
update();
|
||||
}
|
||||
|
||||
void MagnumItem::setCount(qint8 count) {
|
||||
if (count == m_count) return;
|
||||
m_count = count;
|
||||
emit countChanged();
|
||||
update();
|
||||
}
|
||||
|
||||
void MagnumItem::keyPressEvent(QKeyEvent *evt) {
|
||||
switch (evt->key()) {
|
||||
case Qt::Key_L:
|
||||
// if (m_camera->lagging() > 0.0f) {
|
||||
// m_camera->setLagging(0.0f);
|
||||
// } else {
|
||||
// m_camera->setLagging(0.85f);
|
||||
// }
|
||||
break;
|
||||
}
|
||||
evt->accept();
|
||||
}
|
||||
|
||||
void MagnumItem::mousePressEvent(QMouseEvent *evt) {
|
||||
}
|
||||
|
||||
void MagnumItem::mouseReleaseEvent(QMouseEvent *evt) {
|
||||
}
|
||||
|
||||
void MagnumItem::mouseMoveEvent(QMouseEvent *evt) {}
|
||||
|
||||
void MagnumItem::wheelEvent(QWheelEvent *evt) {}
|
||||
|
||||
class CleanupJob : public QRunnable {
|
||||
public:
|
||||
CleanupJob(MagnumRenderer *renderer) : m_renderer(renderer) {}
|
||||
void run() override { delete m_renderer; }
|
||||
private:
|
||||
MagnumRenderer *m_renderer;
|
||||
};
|
||||
|
||||
void MagnumItem::releaseResources() {
|
||||
window()->scheduleRenderJob(
|
||||
new CleanupJob(m_renderer),
|
||||
QQuickWindow::BeforeSynchronizingStage);
|
||||
m_renderer = nullptr;
|
||||
}
|
||||
Reference in New Issue
Block a user