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 @@
-
+
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()