Integrieren Sie LibRocket in SDL und OpenGL

7

Ich war derzeit an einem Spielprojekt beteiligt und wir erreichen den Punkt, an dem wir die GUI für Menüs und andere Dinge hinzufügen möchten, aber die Zeit, die wir möglicherweise für die Entwicklung unseres eigenen Systems aufgewendet haben, könnte uns ein wenig Zeit kosten, und dies ist ein Teil davon des Systems, dass wir nicht zu viel Zeit verlieren wollen.

Wir lesen also über einige UI-Bibliotheken wie GUIchan, CEGUI und kürzlich LibRocket, die anscheinend sehr flexibel und nützlich sind. Meine Frage ist also, ob Librocket in ein in SDL / OpenGL in C ++ entwickeltes Projekt integriert werden kann. und wenn Sie wissen, wo Sie Informationen dazu finden, weil wir so etwas nicht finden können.

oscar.rpr
quelle

Antworten:

7

Ja, Sie können libRocket absolut mit fast jedem Rendering-System verwenden (In den meisten Desktop-Systemen, iOS und Android gibt es libRocket-Apps.)

libRocket verwendet intern eine abstrakte Renderschnittstelle. libRocket ist eine Bibliothek, die bereit ist, Text in interne Strukturen zu analysieren und dann seine Geometrie in diesen abstrakten Renderer zu verschieben.

Es wird also überhaupt nichts gerendert, wenn Sie den Renderer nicht selbst implementieren. Sie erben einfach Rocket :: Core :: RenderInterface, wenn ich mich nicht irre, und implementieren selbst einige Funktionen.

Eine Dokumentation dazu finden Sie hier: http://librocket.com/wiki/documentation/C%2B%2BManual/Interfaces

Wenn Sie dann Ihren benutzerdefinierten Renderer zuweisen, wird dieser zum Verschieben der Geometrie verwendet. Zu diesem Zeitpunkt haben Sie die volle Kontrolle darüber, was Sie damit tun sollen.

Es gibt Beispiele für OpenGL-Renderer, aber Sie können eines an SDL anpassen, wenn Sie sehen, dass es zu Ihnen passt!

Ich hoffe es hilft.

Grimshaw
quelle
Vielen Dank für den Kommentar, der mir dabei sehr helfen wird.
oscar.rpr
1
@ oscar.rpr Es sollte auch darauf hingewiesen werden , dass libRocket eine Probe - Schnittstelle , die keine Optimierungen bietet machen sieht vor, dass Sie in den Proben / Schale / include / ShellRenderInterface.h und Proben / Schale / src / ShellRenderInterface.cpp Dateien können wie können erklärt hier . Außerdem hat die Bibliothek bei der letzten Verwendung GL_VERTEX_ARRAYS beim Rendern nicht aktiviert, sodass ich es selbst tun musste oder nichts sehen konnte.
Martin Foot
Vielen Dank für die Antwort, ich werde in diesen Tagen damit arbeiten, ich erzähle Ihnen meine Fortschritte.
oscar.rpr
1

Ich denke, Sie müssen einige Änderungen am libRocket-Code vornehmen, damit er die Fenstererstellung besteht. Ich bin mir nicht sicher, ob es einen anderen Weg gibt, aber ich bin mir sicher, dass dieser Code funktionieren wird! und ich gehe davon aus, dass Sie für ein Windows-System entwickeln. Wenn Sie auf eine andere Plattform abzielen, gibt es ähnliche Schritte, jedoch mit unterschiedlichen Variablen und Funktionsänderungen!

Zunächst müssen Sie einen Handler für das von SDL erstellte Fenster erhalten. Dieser Code extrahiert den erforderlichen HWND-Wert (gemäß hier :

#include <SDL_syswm.h>

struct SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);

if(-1 == SDL_GetWMInfo(&wmInfo))
    throw AVException(SDL_GetError());

HWND hwndSDL = wmInfo.window;

Jetzt müssen wir sicherstellen, dass libRocket dasselbe Fenster für das Rendern verwendet. Nach einer kleinen Suche in den Dateien habe ich eine Datei gefunden hg/shell/src/win32/ShellWin32.cpp(Adresse basiert auf Google Code), die Funktionen zum Erstellen von Fenstern enthält. Dort sehen Sie eine Funktion namens bool Shell::OpenWindow(const char* name, bool attach_opengl). Das ist die Hauptfunktion, die für die Erstellung eines Fensters verantwortlich ist. Damit libRocket unsere hwndSDLVariable wiederverwendet, müssen Sie alle Zeilen in dieser Funktion entfernen / kommentieren, mit Ausnahme der folgenden:

if (attach_opengl)
{
    opengl_attached = AttachOpenGL();
    if (!opengl_attached)
        return false;
}

und kurz vor diesen Zeilen fügen Sie diesen Code hinzu:

window_handle = hwndSDL;

Ich weiß, dass es wahrscheinlich nicht der beste Weg ist, Arbeit zu leisten, aber ich bin sicher, dass es funktionieren wird. Wenn Sie auf etwas anderes als Windows abzielen, müssen Sie nur Entsprechungen für den HWND-Wert und die Funktion zum Erstellen von Fenstern finden. Sie befinden sich sicher irgendwo in Codes, da fast alle Fenstersysteme, entweder Fenster oder Nicht-Fenster, dieselbe Logik verwenden.

Ali1S232
quelle
Entschuldigung, verwenden Sie libRocket oft? Ich bin mir fast sicher, dass libRocket nicht zu dieser Art von Code auf niedriger Ebene kommt. Ohne Ihre Antwort zu ignorieren :) Ich werde trotzdem eine Antwort versuchen :)
Grimshaw
Vielen Dank für die Antwort. Ich werde Ihre Idee für zukünftige Spielprojekte prüfen.
oscar.rpr
1
@ Devil nein, ich habe gerade herausgefunden, dass es eine solche Bibliothek gibt! Wie ich in meiner Antwort angegeben habe, bin ich mir nicht sicher, ob dies die beste Methode für libRocket war, aber es sollte funktionieren. Ich habe das Gleiche getan, um einige andere grafische Bibliotheken zu verbinden. Zum Beispiel, um eine Gameengine im Qt SDK zu initialisieren.
Ali1S232