Skip to content

Commit 338fd14

Browse files
committed
Have GUI renderer backends as shared objects also
1 parent e441cce commit 338fd14

22 files changed

+1933
-79
lines changed

ext/a-gui/src/agui/application/Application.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
#include <Carbon/Carbon.h>
2424
#endif
2525

26+
#if !defined(_MSC_VER)
27+
#include <dlfcn.h>
28+
#endif
29+
2630
#include <stdlib.h>
2731

2832
#include <array>
@@ -36,7 +40,6 @@
3640
#include <agui/audio/Audio.h>
3741
#include <agui/gui/textures/GUITexture.h>
3842
#include <agui/gui/fileio/TextureReader.h>
39-
#include <agui/gui/renderer/ApplicationGL3Renderer.h>
4043
#include <agui/gui/renderer/GUIRendererBackend.h>
4144
#include <agui/gui/GUIEventHandler.h>
4245
#include <agui/os/filesystem/FileSystem.h>
@@ -63,7 +66,6 @@ using agui::application::Application;
6366
using agui::audio::Audio;
6467
using agui::gui::textures::GUITexture;
6568
using agui::gui::fileio::TextureReader;
66-
using agui::gui::renderer::ApplicationGL3Renderer;
6769
using agui::gui::renderer::GUIRendererBackend;
6870
using agui::gui::GUIEventHandler;
6971
using agui::os::filesystem::FileSystem;
@@ -79,7 +81,7 @@ using agui::utilities::StringTokenizer;
7981
using agui::utilities::StringTools;
8082
using agui::utilities::Time;
8183

82-
unique_ptr<GUIRendererBackend> Application::rendererBackend = nullptr;
84+
unique_ptr<GUIRendererBackend> Application::guiRendererBackend = nullptr;
8385
unique_ptr<Application> Application::application = nullptr;
8486
GUIEventHandler* Application::eventHandler = nullptr;
8587
int64_t Application::timeLast = -1L;
@@ -562,17 +564,14 @@ int Application::run(int argc, char** argv, const string& title, GUIEventHandler
562564
}
563565
}
564566

565-
// renderer
566-
rendererBackend = make_unique<ApplicationGL3Renderer>();
567-
568567
// window hints
569568
if ((windowHints & WINDOW_HINT_NOTRESIZEABLE) == WINDOW_HINT_NOTRESIZEABLE) glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
570569
if ((windowHints & WINDOW_HINT_NOTDECORATED) == WINDOW_HINT_NOTDECORATED) glfwWindowHint(GLFW_DECORATED, GLFW_FALSE);
571570
if ((windowHints & WINDOW_HINT_INVISIBLE) == WINDOW_HINT_INVISIBLE) glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
572571
if ((windowHints & WINDOW_HINT_MAXIMIZED) == WINDOW_HINT_MAXIMIZED) glfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE);
573572

574573
//
575-
for (auto i = 0; rendererBackend->prepareWindowSystemRendererContext(i) == true; i++) {
574+
for (auto i = 0; guiRendererBackend->prepareWindowSystemRendererContext(i) == true; i++) {
576575
glfwWindow = glfwCreateWindow(windowWidth, windowHeight, title.c_str(), NULL, NULL);
577576
if (glfwWindow != nullptr) break;
578577
}
@@ -585,14 +584,14 @@ int Application::run(int argc, char** argv, const string& title, GUIEventHandler
585584
}
586585

587586
//
588-
if (rendererBackend->initializeWindowSystemRendererContext(glfwWindow) == false) {
587+
if (guiRendererBackend->initializeWindowSystemRendererContext(glfwWindow) == false) {
589588
Console::printLine("glfwCreateWindow(): Could not initialize window system renderer context");
590589
glfwTerminate();
591590
return EXITCODE_FAILURE;
592591
}
593592

594593
//
595-
rendererBackend->initialize();
594+
guiRendererBackend->initialize();
596595

597596
//
598597
if ((windowHints & WINDOW_HINT_MAXIMIZED) == 0) glfwSetWindowPos(glfwWindow, windowXPosition, windowYPosition);
@@ -655,7 +654,7 @@ int Application::run(int argc, char** argv, const string& title, GUIEventHandler
655654
Console::printLine("Application::run(): Shutting down application");
656655
Application::application->dispose();
657656
Audio::shutdown();
658-
Application::rendererBackend = nullptr;
657+
Application::guiRendererBackend = nullptr;
659658
Console::shutdown();
660659
//
661660
Application::application = nullptr;

ext/a-gui/src/agui/application/Application.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class agui::application::Application: public GUIApplication
7676
* @returns renderer backend
7777
*/
7878
inline static GUIRendererBackend* getRendererBackend() {
79-
return rendererBackend.get();
79+
return guiRendererBackend.get();
8080
}
8181

8282
/**
@@ -350,7 +350,7 @@ class agui::application::Application: public GUIApplication
350350
virtual void onDrop(const vector<string>& paths);
351351

352352
private:
353-
AGUI_STATIC_DLL_IMPEXT static unique_ptr<GUIRendererBackend> rendererBackend;
353+
AGUI_STATIC_DLL_IMPEXT static unique_ptr<GUIRendererBackend> guiRendererBackend;
354354
AGUI_STATIC_DLL_IMPEXT static unique_ptr<Application> application;
355355
AGUI_STATIC_DLL_IMPEXT static GUIEventHandler* eventHandler;
356356
int windowHints { WINDOW_HINT_NONE };

ext/a-gui/src/agui/gui/GUIVersion.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ string GUIVersion::getVersion() {
1313
}
1414

1515
string GUIVersion::getCopyright() {
16-
return "Developed 2012-2023 by Andreas Drewke, Dominik Hepp, Mathias Lenz, Kolja Gumpert, drewke.net, mindty.com, github.com/mahula. Please see the license @ https://github.com/andreasdr/a-gui/blob/master/LICENSE";
16+
return "Developed 2012-2023 by Andreas Drewke, Dominik Hepp, Kolja Gumpert, drewke.net, mindty.com. Please see the license @ https://github.com/andreasdr/a-gui/blob/master/LICENSE";
1717
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#include <agui/gui/renderer/ApplicationGL2Renderer.h>
2+
3+
#define GLFW_INCLUDE_NONE
4+
#include <GLFW/glfw3.h>
5+
6+
#if !defined(__APPLE__)
7+
#define GLEW_NO_GLU
8+
#include <GL/glew.h>
9+
#if defined(_WIN32)
10+
#include <GL/wglew.h>
11+
#endif
12+
#endif
13+
14+
#include <array>
15+
#include <string>
16+
17+
#include <agui/agui.h>
18+
#include <agui/gui/renderer/GUIShader.h>
19+
#include <agui/gui/GUI.h>
20+
#include <agui/gui/GUIVersion.h>
21+
#include <agui/utilities/Console.h>
22+
23+
using agui::gui::renderer::ApplicationGL2Renderer;
24+
25+
using std::array;
26+
using std::string;
27+
28+
using agui::gui::renderer::GUIShader;
29+
using agui::gui::GUI;
30+
using agui::gui::GUIVersion;
31+
using agui::utilities::Console;
32+
33+
ApplicationGL2Renderer::ApplicationGL2Renderer()
34+
{
35+
}
36+
37+
bool ApplicationGL2Renderer::prepareWindowSystemRendererContext(int tryIdx) {
38+
if (tryIdx > 0) return false;
39+
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_FALSE);
40+
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_ANY_PROFILE);
41+
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
42+
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
43+
return true;
44+
}
45+
46+
bool ApplicationGL2Renderer::initializeWindowSystemRendererContext(GLFWwindow* glfwWindow) {
47+
glfwMakeContextCurrent(glfwWindow);
48+
if (glfwGetCurrentContext() == nullptr) {
49+
Console::printLine("ApplicationGL2Renderer::initializeWindowSystemRendererContext(): glfwMakeContextCurrent(): Error: No window attached to context");
50+
return false;
51+
}
52+
#if !defined(__APPLE__)
53+
glewExperimental = true;
54+
GLenum glewInitStatus = glewInit();
55+
if (glewInitStatus != GLEW_OK) {
56+
Console::printLine("ApplicationGL2Renderer::initializeWindowSystemRendererContext(): glewInit(): Error: " + (string((char*)glewGetErrorString(glewInitStatus))));
57+
return false;
58+
}
59+
#endif
60+
return true;
61+
}
62+
63+
void ApplicationGL2Renderer::onBindTexture(int contextIdx, int32_t textureId)
64+
{
65+
GUI::getShader()->bindTexture(textureId);
66+
}
67+
68+
void ApplicationGL2Renderer::onUpdateTextureMatrix(int contextIdx)
69+
{
70+
GUI::getShader()->updateTextureMatrix();
71+
}
72+
73+
void ApplicationGL2Renderer::onUpdateEffect(int contextIdx)
74+
{
75+
GUI::getShader()->updateEffect();
76+
}
77+
78+
extern "C" ApplicationGL2Renderer* createInstance()
79+
{
80+
if (ApplicationGL2Renderer::getRendererVersion() != GUIVersion::getVersion()) {
81+
Console::printLine("ApplicationGL2Renderer::createInstance(): Engine and renderer backend version do not match: '" + ApplicationGL2Renderer::getRendererVersion() + "' != '" + GUIVersion::getVersion() + "'");
82+
return nullptr;
83+
}
84+
Console::printLine("ApplicationGL2Renderer::createInstance(): Creating ApplicationGL2Renderer instance!");
85+
return new ApplicationGL2Renderer();
86+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#pragma once
2+
3+
#if defined(_MSC_VER)
4+
// this suppresses a warning redefinition of APIENTRY macro
5+
#define NOMINMAX
6+
#include <windows.h>
7+
#endif
8+
#define GLFW_INCLUDE_NONE
9+
#include <GLFW/glfw3.h>
10+
11+
#include <string>
12+
13+
#include <agui/agui.h>
14+
#include <agui/gui/renderer/fwd-agui.h>
15+
#include <agui/gui/renderer/GL2Renderer.h>
16+
#include <agui/gui/renderer/GUIRendererBackendPlugin.h>
17+
18+
using std::string;
19+
20+
/**
21+
* Application GL2 renderer
22+
* @author Andreas Drewke
23+
*/
24+
class agui::gui::renderer::ApplicationGL2Renderer: public GL2Renderer, public GUIRendererBackendPlugin
25+
{
26+
public:
27+
// forbid class copy
28+
FORBID_CLASS_COPY(ApplicationGL2Renderer)
29+
30+
/**
31+
* Public constructor
32+
*/
33+
ApplicationGL2Renderer();
34+
35+
// overridden methods
36+
bool prepareWindowSystemRendererContext(int tryIdx) override;
37+
bool initializeWindowSystemRendererContext(GLFWwindow* glfwWindow) override;
38+
void onBindTexture(int contextIdx, int32_t textureId) override;
39+
void onUpdateTextureMatrix(int contextIdx) override;
40+
void onUpdateEffect(int contextIdx) override;
41+
42+
};

ext/a-gui/src/agui/gui/renderer/ApplicationGL3Renderer.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include <agui/agui.h>
2323
#include <agui/gui/renderer/GUIShader.h>
2424
#include <agui/gui/GUI.h>
25+
#include <agui/gui/GUIVersion.h>
26+
#include <agui/utilities/Console.h>
2527

2628
using agui::gui::renderer::ApplicationGL3Renderer;
2729

@@ -30,6 +32,8 @@ using std::string;
3032

3133
using agui::gui::renderer::GUIShader;
3234
using agui::gui::GUI;
35+
using agui::gui::GUIVersion;
36+
using agui::utilities::Console;
3337

3438
ApplicationGL3Renderer::ApplicationGL3Renderer()
3539
{
@@ -55,14 +59,14 @@ bool ApplicationGL3Renderer::prepareWindowSystemRendererContext(int tryIdx) {
5559
bool ApplicationGL3Renderer::initializeWindowSystemRendererContext(GLFWwindow* glfwWindow) {
5660
glfwMakeContextCurrent(glfwWindow);
5761
if (glfwGetCurrentContext() == nullptr) {
58-
Console::printLine("EngineGL3Renderer::initializeWindowSystemRendererContext(): glfwMakeContextCurrent(): Error: No window attached to context");
62+
Console::printLine("ApplicationGL3Renderer::initializeWindowSystemRendererContext(): glfwMakeContextCurrent(): Error: No window attached to context");
5963
return false;
6064
}
6165
#if !defined(__APPLE__)
6266
//glewExperimental = true;
6367
GLenum glewInitStatus = glewInit();
6468
if (glewInitStatus != GLEW_OK) {
65-
Console::printLine("EngineGL3Renderer::initializeWindowSystemRendererContext(): glewInit(): Error: " + (string((char*)glewGetErrorString(glewInitStatus))));
69+
Console::printLine("ApplicationGL3Renderer::initializeWindowSystemRendererContext(): glewInit(): Error: " + (string((char*)glewGetErrorString(glewInitStatus))));
6670
return false;
6771
}
6872
#endif
@@ -83,3 +87,13 @@ void ApplicationGL3Renderer::onUpdateEffect(int contextIdx)
8387
{
8488
GUI::getShader()->updateEffect();
8589
}
90+
91+
extern "C" ApplicationGL3Renderer* createInstance()
92+
{
93+
if (ApplicationGL3Renderer::getRendererVersion() != GUIVersion::getVersion()) {
94+
Console::printLine("ApplicationGL3Renderer::createInstance(): Engine and renderer backend version do not match: '" + ApplicationGL3Renderer::getRendererVersion() + "' != '" + GUIVersion::getVersion() + "'");
95+
return nullptr;
96+
}
97+
Console::printLine("ApplicationGL3Renderer::createInstance(): Creating ApplicationGL2Renderer instance!");
98+
return new ApplicationGL3Renderer();
99+
}

ext/a-gui/src/agui/gui/renderer/ApplicationGL3Renderer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@
1313
#include <agui/agui.h>
1414
#include <agui/gui/renderer/fwd-agui.h>
1515
#include <agui/gui/renderer/GL3Renderer.h>
16+
#include <agui/gui/renderer/GUIRendererBackendPlugin.h>
1617

1718
using std::string;
1819

1920
/**
2021
* Application GL3 renderer
2122
* @author Andreas Drewke
2223
*/
23-
class agui::gui::renderer::ApplicationGL3Renderer: public GL3Renderer
24+
class agui::gui::renderer::ApplicationGL3Renderer: public GL3Renderer, public GUIRendererBackendPlugin
2425
{
2526
public:
2627
// forbid class copy
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#include <agui/gui/renderer/ApplicationGLES2Renderer.h>
2+
3+
#if defined(_MSC_VER)
4+
// this suppresses a warning redefinition of APIENTRY macro
5+
#define NOMINMAX
6+
#include <windows.h>
7+
#endif
8+
#define GLFW_INCLUDE_NONE
9+
#include <GLFW/glfw3.h>
10+
11+
#include <string>
12+
13+
#include <agui/agui.h>
14+
#include <agui/gui/renderer/GUIShader.h>
15+
#include <agui/gui/GUI.h>
16+
#include <agui/gui/GUIVersion.h>
17+
#include <agui/utilities/Console.h>
18+
19+
using std::string;
20+
21+
using agui::gui::renderer::ApplicationGLES2Renderer;
22+
23+
using agui::gui::renderer::GUIShader;
24+
using agui::gui::GUI;
25+
using agui::gui::GUIVersion;
26+
using agui::utilities::Console;
27+
28+
ApplicationGLES2Renderer::ApplicationGLES2Renderer()
29+
{
30+
}
31+
32+
bool ApplicationGLES2Renderer::prepareWindowSystemRendererContext(int tryIdx) {
33+
if (tryIdx > 0) return false;
34+
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
35+
glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_NATIVE_CONTEXT_API);
36+
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
37+
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
38+
return true;
39+
}
40+
41+
bool ApplicationGLES2Renderer::initializeWindowSystemRendererContext(GLFWwindow* glfwWindow) {
42+
glfwMakeContextCurrent(glfwWindow);
43+
if (glfwGetCurrentContext() == nullptr) {
44+
Console::printLine("ApplicationGLES2Renderer::initializeWindowSystemRendererContext(): glfwMakeContextCurrent(): Error: No window attached to context");
45+
return false;
46+
}
47+
return true;
48+
}
49+
50+
void ApplicationGLES2Renderer::onBindTexture(int contextIdx, int32_t textureId)
51+
{
52+
GUI::getShader()->bindTexture(textureId);
53+
}
54+
55+
void ApplicationGLES2Renderer::onUpdateTextureMatrix(int contextIdx)
56+
{
57+
GUI::getShader()->updateTextureMatrix();
58+
}
59+
60+
void ApplicationGLES2Renderer::onUpdateEffect(int contextIdx)
61+
{
62+
GUI::getShader()->updateEffect();
63+
}
64+
65+
extern "C" ApplicationGLES2Renderer* createInstance()
66+
{
67+
if (ApplicationGLES2Renderer::getRendererVersion() != GUIVersion::getVersion()) {
68+
Console::printLine("ApplicationGL2Renderer::createInstance(): Engine and renderer backend version do not match: '" + ApplicationGLES2Renderer::getRendererVersion() + "' != '" + GUIVersion::getVersion() + "'");
69+
return nullptr;
70+
}
71+
Console::printLine("ApplicationGLES2Renderer::createInstance(): Creating ApplicationGLES2Renderer instance!");
72+
return new ApplicationGLES2Renderer();
73+
}

0 commit comments

Comments
 (0)