From 6ff4de3e0bf49145687d2d50c90b4a811c4d4d72 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Sun, 16 Feb 2020 03:23:26 +0100 Subject: [PATCH] Finishing the bases of the QT renderer --- CMakeLists.txt | 1 - README.md | 2 +- {ressources => resources}/Black.svg | 0 {ressources => resources}/Logo.png | Bin {ressources => resources}/White.svg | 0 {ressources => resources}/form.txt | 0 sources/Renderer/IRenderer.hpp | 3 -- sources/Renderer/QtRenderer/QtSFML.cpp | 31 ++++++++---- sources/Renderer/QtRenderer/QtSFML.hpp | 49 +++++++++++++------ sources/Renderer/QtRenderer/QtWidgetSFML.cpp | 7 ++- sources/Renderer/QtRenderer/QtWidgetSFML.hpp | 12 ++++- sources/Renderer/SFRenderer.cpp | 11 +++-- sources/Renderer/SFRenderer.hpp | 2 + sources/SNES.cpp | 1 - 14 files changed, 81 insertions(+), 38 deletions(-) rename {ressources => resources}/Black.svg (100%) rename {ressources => resources}/Logo.png (100%) rename {ressources => resources}/White.svg (100%) rename {ressources => resources}/form.txt (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2f5b665..ded7b13 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,6 +137,5 @@ target_link_libraries(ComSquare sfml-system sfml-audio sfml-network - tgui Qt5::Widgets ) \ No newline at end of file diff --git a/README.md b/README.md index 3e8006b..6f15fed 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

+

License diff --git a/ressources/Black.svg b/resources/Black.svg similarity index 100% rename from ressources/Black.svg rename to resources/Black.svg diff --git a/ressources/Logo.png b/resources/Logo.png similarity index 100% rename from ressources/Logo.png rename to resources/Logo.png diff --git a/ressources/White.svg b/resources/White.svg similarity index 100% rename from ressources/White.svg rename to resources/White.svg diff --git a/ressources/form.txt b/resources/form.txt similarity index 100% rename from ressources/form.txt rename to resources/form.txt diff --git a/sources/Renderer/IRenderer.hpp b/sources/Renderer/IRenderer.hpp index f3ea1d7..aceccdb 100644 --- a/sources/Renderer/IRenderer.hpp +++ b/sources/Renderer/IRenderer.hpp @@ -17,9 +17,6 @@ namespace ComSquare //! @brief Set a new name to the window, if there is already a name it will be overwrite virtual void setWindowName(std::string) = 0; - //! @brief Tells to the program if the window has been closed, and therefore if he should stop - bool shouldExit = true; - //! @brief Render the buffer to the window virtual void drawScreen() = 0; diff --git a/sources/Renderer/QtRenderer/QtSFML.cpp b/sources/Renderer/QtRenderer/QtSFML.cpp index 1d7a27c..7835a5a 100644 --- a/sources/Renderer/QtRenderer/QtSFML.cpp +++ b/sources/Renderer/QtRenderer/QtSFML.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include "QtSFML.hpp" @@ -15,24 +15,37 @@ namespace ComSquare::Renderer { - QtSFML::QtSFML(QApplication &app, unsigned int height, unsigned int width) : - SFRenderer(height, width), _app(app) + QtSFML::QtSFML(QApplication &app, unsigned int h, unsigned int w) : + _app(app), _sfWidget(nullptr), width(w), height(h) { } void QtSFML::createWindow(SNES &snes, int maxFPS) { - QFrame *frame = new QFrame(); - frame->show(); - MainQTWidget *sfView = new MainQTWidget(snes, frame, QPoint(0, 0), QSize(this->_videoMode.width, this->_videoMode.height), maxFPS); - sfView->show(); + this->frame = new QFrame(); + this->setWindowName(snes.cartridge->header.gameName); + this->frame->show(); + this->_sfWidget = new QtFullSFML(snes, frame, QPoint(0, 0), QSize(this->width, this->height), maxFPS); + this->_sfWidget->show(); } - MainQTWidget::MainQTWidget(SNES &snes, QWidget *parent, const QPoint &position, const QSize &size, int frameRate) : + void QtSFML::setWindowName(std::string newWindowName) + { + this->frame->setWindowTitle((newWindowName + " - ComSquare").c_str()); + } + + void QtSFML::putPixel(unsigned y, unsigned x, uint32_t rgba) + { + this->_sfWidget->putPixel(y, x, rgba); + } + + void QtSFML::drawScreen() { } + + QtFullSFML::QtFullSFML(SNES &snes, QWidget *parent, const QPoint &position, const QSize &size, int frameRate) : QtWidgetSFML(parent, position, size, frameRate), _snes(snes) { } - void MainQTWidget::_onUpdate() + void QtFullSFML::_onUpdate() { this->_snes.update(); } diff --git a/sources/Renderer/QtRenderer/QtSFML.hpp b/sources/Renderer/QtRenderer/QtSFML.hpp index b0413c5..9e5a333 100644 --- a/sources/Renderer/QtRenderer/QtSFML.hpp +++ b/sources/Renderer/QtRenderer/QtSFML.hpp @@ -14,14 +14,46 @@ namespace ComSquare::Renderer { - //! @brief A SFML renderer inside a QT window. - class QtSFML : public SFRenderer { + //! @brief The SFML window that manage the update. + class QtFullSFML : public QtWidgetSFML { private: + //! @brief The snes to update. + SNES &_snes; + void _onUpdate() override; + public: + QtFullSFML(SNES &snes, QWidget* parent, const QPoint& position, const QSize& size, int frameRate = 0); + QtFullSFML(const QtFullSFML &) = delete; + QtFullSFML &operator=(const QtFullSFML &) = delete; + ~QtFullSFML() override = default; + }; + + //! @brief A SFML renderer inside a QT window. + class QtSFML : public IRenderer { + private: + //! @brief The QT app instance. QApplication &_app; + //! @brief The SFML frame. + QFrame *frame{}; + //! @brief The SFML widget. + QtFullSFML *_sfWidget{}; + //! @brief The width of the window. + unsigned int width; + //! @brief The height of the window. + unsigned int height; public: //! @brief Use this function to create the window. //! @param maxFPS The number of FPS you aim to run on. void createWindow(SNES &snes, int maxFPS) override; + //! @brief Set a new name to the window, if there is already a name it will be overwrite. + //! @param newWindowName new title for the window. + void setWindowName(std::string newWindowName) override; + //! @brief Add a pixel to the buffer to the coordinates x, y with the color rgba. + //! @param X horizontal index. + //! @param Y vertical index. + //! @param rgba The color of the pixel. + void putPixel(unsigned y, unsigned x, uint32_t rgba) override; + //! @brief This function doesn't do anything because QT internally handle drawing to the screen. + void drawScreen() override; //! @brief Constructor that return a SFML renderer inside a QT window. //! @param height height of the window. //! @param width width of the window. @@ -30,19 +62,6 @@ namespace ComSquare::Renderer QtSFML &operator=(const QtSFML &) = delete; ~QtSFML() = default; }; - - //! @brief The SFML window that manage the update. - class MainQTWidget : public QtWidgetSFML { - private: - //! @brief The snes to update. - SNES &_snes; - void _onUpdate() override; - public: - MainQTWidget(SNES &snes, QWidget* parent, const QPoint& position, const QSize& size, int frameRate = 0); - MainQTWidget(const MainQTWidget &) = delete; - MainQTWidget &operator=(const MainQTWidget &) = delete; - ~MainQTWidget() override = default; - }; } #endif //COMSQUARE_QTSFML_HPP diff --git a/sources/Renderer/QtRenderer/QtWidgetSFML.cpp b/sources/Renderer/QtRenderer/QtWidgetSFML.cpp index ca58ee2..e65076a 100644 --- a/sources/Renderer/QtRenderer/QtWidgetSFML.cpp +++ b/sources/Renderer/QtRenderer/QtWidgetSFML.cpp @@ -7,7 +7,7 @@ namespace ComSquare::Renderer { QtWidgetSFML::QtWidgetSFML(QWidget *parent, const QPoint &position, const QSize &size, int frameRate) : - QWidget(parent) + QWidget(parent), SFRenderer(size.height(), size.width()) { this->setAttribute(Qt::WA_PaintOnScreen); this->setAttribute(Qt::WA_OpaquePaintEvent); @@ -29,7 +29,7 @@ namespace ComSquare::Renderer #ifdef Q_WS_X11 XFlush(QX11Info::display()); #endif - this->sf::RenderWindow::create(this->winId()); + this->_window.create(this->winId()); this->_onInit(); connect(&_timer, SIGNAL(timeout()), this, SLOT(repaint())); @@ -45,9 +45,8 @@ namespace ComSquare::Renderer void QtWidgetSFML::paintEvent(QPaintEvent *) { - this->clear(); this->_onUpdate(); - this->display(); + this->drawScreen(); } void QtWidgetSFML::_onInit(){ } diff --git a/sources/Renderer/QtRenderer/QtWidgetSFML.hpp b/sources/Renderer/QtRenderer/QtWidgetSFML.hpp index 961357f..1825d51 100644 --- a/sources/Renderer/QtRenderer/QtWidgetSFML.hpp +++ b/sources/Renderer/QtRenderer/QtWidgetSFML.hpp @@ -8,19 +8,29 @@ #include #include #include +#include +#include +#include "../SFRenderer.hpp" namespace ComSquare::Renderer { //! @brief A widget that you can put inside a QT application that render using the SFML. - class QtWidgetSFML : public QWidget, public sf::RenderWindow { + class QtWidgetSFML : public QWidget, public SFRenderer { private: + //! @brief Function called when this widget is created. virtual void _onInit(); + //! @brief Function called to update this widget. virtual void _onUpdate() = 0; + //! @brief Qt internal paint engine (always null since we use a custom one) QPaintEngine* paintEngine() const override; + //! @brief Used to create the SF window and bind it to the window manager of the user. void showEvent(QShowEvent*) override; + //! @brief QT event that refresh the widget. (A draw screen) void paintEvent(QPaintEvent*) override; + // @brief Internal timer used for update intervals. QTimer _timer; + //! @brief Has the SF window been created yet. bool _isInitialized = false; public: QtWidgetSFML(QWidget* parent, const QPoint& position, const QSize& size, int frameRate = 0); diff --git a/sources/Renderer/SFRenderer.cpp b/sources/Renderer/SFRenderer.cpp index 2638a0d..16dab71 100644 --- a/sources/Renderer/SFRenderer.cpp +++ b/sources/Renderer/SFRenderer.cpp @@ -14,20 +14,25 @@ namespace ComSquare::Renderer { SFRenderer::SFRenderer(unsigned int height, unsigned int width) { - this->shouldExit = false; this->_videoMode = {width, height, 32}; this->_texture.create(width, height); this->_sprite.setTexture(this->_texture); this->_pixelBuffer = new sf::Color[height * width]; } - void SFRenderer::createWindow(SNES &, int maxFPS) + void SFRenderer::createWindow(SNES &snes, int maxFPS) { sf::Image icon; this->_window.create(this->_videoMode, "ComSquare Emulator", sf::Style::Default); - if (icon.loadFromFile("../ressources/Logo.png")) + if (icon.loadFromFile("resources/Logo.png")) this->_window.setIcon(314, 314, icon.getPixelsPtr()); this->_window.setFramerateLimit(maxFPS); + this->setWindowName(snes.cartridge->header.gameName); + + while (!this->shouldExit) { + snes.update(); + this->getEvents(); + } } SFRenderer::~SFRenderer() diff --git a/sources/Renderer/SFRenderer.hpp b/sources/Renderer/SFRenderer.hpp index 0cd23b1..6a9f187 100644 --- a/sources/Renderer/SFRenderer.hpp +++ b/sources/Renderer/SFRenderer.hpp @@ -37,6 +37,8 @@ namespace ComSquare::Renderer //! @brief The texture to render the array of pixels sf::Texture _texture; public: + //! @brief Tells to the program if the window has been closed, and therefore if he should stop + bool shouldExit = false; //! @brief Set a new name to the window, if there is already a name it will be overwrite. //! @param newWindowName new title for the window. void setWindowName(std::string newWindowName) override; diff --git a/sources/SNES.cpp b/sources/SNES.cpp index b2367af..33b8aa9 100644 --- a/sources/SNES.cpp +++ b/sources/SNES.cpp @@ -18,7 +18,6 @@ namespace ComSquare sram(new Ram::Ram(this->cartridge->header.sramSize)) { bus->mapComponents(*this); - renderer.setWindowName(this->cartridge->header.gameName); } void SNES::enableCPUDebugging()