GUI mit OpenGL (Glut)

  • Hallo, ich habe jetzt schon 3 Tage oder so im Internet herumgesucht, wie man OpenGL (Glut) in ein Programm einbettet, welches mit Winforms ein GUI bereitstellt (c++).....

    Habe es shcon mit Qt (Opensource) versucht, da konnte ich beim Installieren allerdings das hier nicht machen: configure -platform win32-msvc2005 ("win32-msvc2005" wurde nicht erkannt - ich denke weil die MSVC-unterstützung in der OpenSource version fehlt).....(ansonsten wäre dies glaube ich das Optimale....
    Dann habe ich es mit MFC probiert, aber bin da leider auch nicht sehr weit gekommen.....
    Außerdem wollte ich es mit Glow versuchen, das gab allerdings ein paar Compiler Errors (irgendwas mit dem Linker)
    Und zum Schluss habe ich versucht mit GTKMM und GTKGLEXTMM was zu machen (bei letzterem gibts allerdings keine Binaries, also hab ich das auch nicht geschafft)


    Also habe ich mal ein GUI mit Winforms gemacht, und damit "herumgespielt (ein neues Glut-fenster ist ja kein Problem beim laden, aber das Fenster in ein Panel zu bekommen.....vielleicht ists ja doch mit MFC leichter??)


    Vielleicht hat von euch jemand eine ahnung, wie man leicht ein glut-Window an ein Panel "binden" kann, oder wie man ohne glut in ein Panel zeichnen kann. Oder eventuell gibts ein ganz einfache Variante, die mir bis jetzt nicht vor die Augen gekommen ist......


    Wäre sehr nett, wenn ihr mir auf die Sprünge helfen könntet.

    Lg
    Spite

  • Ja die Seite kenne ich natürlich ;).
    Wo gibts da was, das mit GUI Programmierung zu tun hat? (Ich find zumindest auf die Schnelle nur den MFC-Basecode, werde mir den mal anschauen ;)...

    Danke auf jeden Fall mal!!

    Lg
    Spite

  • Ok, ich habe mal gefunden wonach ich gesucht habe, ich schaffe es jetzt lt. einem Beispiel von TheCodeProject ein Opengl-Window zeichnen lassen kann.

    Ich habs jetzt so modifiziert, dass ich das Opengl-Window jetzt auch in ein beliebiges Panel werfen kann.

    Eine Frage dazu:
    Wie resize ich meine opengl-view jetzt?
    Welches Event ist dafür zuständig??

    edit:
    hat sich erledigt

    Lg
    Spite

  • ich habe eigentlich immer OpenGL mit MFC verwendet. Dabei habe ich das OpenGL Window von CWnd abgeleitet. Hier stehen Dir dann alle MFC CWnd Methoden und Events zu Verfügung - in Deinem Fall: WM_SIZE --> OnSize

    zB:

  • Ja ich habe es zwar schon mal geschafft das zu beseitigen, ich hab zZ allerdings ziemliche Performance-Probleme.....

    Was ich machen will ist folgendes:
    Ich habe ein Programm (das muss ich sowieso ändern, wenn ichs ganz einbaue, ich weiß), das mir basierend auf ein paar Texturen (die zu laden dauert leider ewig zZ) ein Strassennetzwerk berechnet.

    Ok, wenn ich grösstenteils alles so belasse, wie ich mein Programm vorher ohne GUI hatte, dann habe ich nach der Erstellung nur noch ca. 2Fps bei ca. 30.000 Linien?? Woran liegt das?
    Wenn ich meine alte Version starte habe ich bei 1600x1200 und 180.000 Linien noch immer fast 30Fps.

    Hast du eine ahnung woran das liegen könnte.
    Ich habe zZ sowas:
    namespace StassenKreuzungen
    {
    vector<way>strassen;
    vector<cross>kreuzungen;
    }

    die Werte werden in einer StreetGen.cpp berechnet und in die Vektoren gespeichert.
    Beim rendern hab ich dann aus der OpenGLForm.cpp auch zugriff auf die Vektoren und kann sie zeichnen.

    Woran liegt das?
    Ich muss zugeben ich habe noch NIE ein GUI programmiert, also habe ich davon keine ahnung.
    (außerdem weiß ich nicht, oba man sowas überhaupt machen kann/sollte mit dem namespace, damit man auf Variablen zugreifen kann???)
    Vielleicht liegts auch am timer, der alle 10ms den Render-Befehl gibt....

    Lg
    Spite

  • Ich würde dir für ein OpenGl GUI mal folgendes "anbieten": http://www.cs.unc.edu/~rademach/glui/

    ist eine plattformunabhängige lib die auf glut aufbaut und deren verwendung sehr gut dokumentiert ist. (im beiliegenden pdf)

    bzgl der generellen verwendung von glut empfehle ich das tut auf lighthouse3d, wo so sachen wie onresize, etc. ganz einfach erklärt werden. ich denke mit den beiden links solltest du ganz passable guis bauen können, ohne dich mit der mfc herumschlagen zu müssen.

    @namespaces: ja sowas geht theoretisch schon, was du da machen willst, nur mach dir gedanken über sichtbarkeit, static, extern, etc ... ansonsten kanns durchaus sein, dass die variablen überall anders sind.

    Worshipping the mighty Kchommander and seeking the virtues of Gebauz

  • Hallo Grassi, danke erst mal für den Link, hab die Seite shcon mal gesehen, aber anscheinend nicht so richtig angeschaut :)

    Werde mir mal ansehen, ob das eventuell leichter ist, oder ob ich doch bei den Winforms bleibe....
    Die Namespaces waren eigentlich nur dazu da, einmal "schnell" etwas in das Panel rendern zu können.

    Wenn ich alles tatsächlich einbaue, werde ich wohl noch einiges an der Struktur meines Progs ändern müssen (ist zZ eigenlich alles in einer langen cpp Datei drinnen, aber da wollte ich sowieso noch ändern....

    Also ich werde mir das mal ansehen, danke

    Lg
    Spite

  • Namespaces haben absolut gar nichts mit der Performance zu tun (abgesehen von den Symbolnamen landen die gar nicht in der kompilierten Datei). Ich denk du hast ein Problem mit dem event handling, lass mal einen profiler drüber laufen.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Hab shcon alles geregelt, funktioniert jetzt optimal, gleich schnell wie vorher ohne GUI :).

    Aber eine Frage habe ich noch.
    Ich habe meinen Button, der das Strassennetzwerk berechnen lässt.
    Je nach eingestellter Landschaftsgröße kann das schon mal 30Sek. oder so dauern, also dachte ich ich füge sowas wie eine Info ein, wieviele Strassen gerade existieren, upgedatet ca. jede Sekunde.

    Wie kann ich jetzt sozusagen von "außen" den Text eines Labels ändern?
    Ich dachte auch schon an einen timer, der jede Sekunde mal die Größe des Vektors abruft in dem die Strassen gespeichert sind, aber das wird wahrscheinlich nix, weil ja da gerade die Berechnungen laufen oder?

    Wie macht man sowas, während eine Berechnung läuft? Oder muss ich da immer wieder mal die Berechnung abstoppen, die Anzahl ausgeben und dann die Berechnung fortführen???

    Irgendeine Idee?

    Lg
    Spite

  • eine möglichkeit, wie du es schon gesagt hast, ist, einfach in der berechnungs schleife nach n durchläufen das label upzudaten. ( if (count>1000) updatelabel() ).

    hat natürlich den nachteil, das nich genau jede sekunde das label geupdatet wird und vorallem, wenn der algorithmus nicht linear ist (also wenn jede zusätzliche strasse, den algorithmus verlangsamt) die update zeiten auch grösser werden. (z.B.: zuerst wird das label alle 20 ms geupdatet und zum ende der berechnung nur mehr alle 5 sekunden [beispielhafter extremfall])

    die andere Methode ist, einen Thread zu erzeugen, der, wie du es schon vorher gesagt hast, z.B. ein mal pro sekunde auf den vector zugreift und das ganze ins label schreibt (ist aber warscheinlich die etwas kompliziertere Methode)

    ich würde zuerst mal nur die erste implementieren, da sie einfach zu machen ist und vielleicht eh vollkommen ausreicht...

  • Ja sowas habe ich mir auch schon gedacht, aber wie würde ich sowas angehen, denn von meiner Schleife aus habe ich ja keinerlei Kontrolle über das Label des GUI, oder?
    Ich verwende eine "Bridge" zwischen den 2 Projekten GUI und App, also wird das nicht gehen oder??

    Ein Thread wäre cool, das wollte ich mir sowieso shcon mal anschauen, kenn mich da nicht aus.....
    Kann denn ein Thread auf zB die länge eines Vectors zugreifen und dann im GUI das Label anders benennen??
    Wäre cool, wenn du mir dazu was schreiben könntest ;)

    Danke einstweilen samyjr!!

    Lg
    Spite

    eventuell gibts da auch eine recht einfache c++ Lösung, aber soooo ein Profi bin i jetzt a wieder nit :)

  • Ja sowas habe ich mir auch schon gedacht, aber wie würde ich sowas angehen, denn von meiner Schleife aus habe ich ja keinerlei Kontrolle über das Label des GUI, oder?
    Ich verwende eine "Bridge" zwischen den 2 Projekten GUI und App, also wird das nicht gehen oder??

    hab noch nie mit einer "Bridge" (ist ein design pattern zum gui bau oder?) gearbeitet, werde aber jetzt mal nachgoogeln ... wennst irgendwo mal das label "beschreiben" kannst, dann muss das auch warscheinlich möglich sein, das mit einer bridge zu verbinden ...


    Ein Thread wäre cool, das wollte ich mir sowieso shcon mal anschauen, kenn mich da nicht aus.....
    Kann denn ein Thread auf zB die länge eines Vectors zugreifen und dann im GUI das Label anders benennen??

    nunja, Threads in C++ sind anders als Threads in Java, da C++ von sich aus (afaik) keine Threads zur verfügung stellen, sondern das OS bzw. die LIBS des OS. genrell sollte man von einem Thread aus auf daten vom "hauptprogram" zugreifen können, ansonsten hätten die ja kaum einen sinn :D


    eventuell gibts da auch eine recht einfache c++ Lösung, aber soooo ein Profi bin i jetzt a wieder nit :)

    bin auch alles andere als ein profi in C++. die einzige erfahrung damit hab ich von CG23, Compilerbau (mehr C als ++), SE 2 und diversen Jobs...

    Aja, die wichtigste Frage überhaupt. was verwendest du jetzt eigentlich zum GUI anzeigen/machen?

  • Ja ich weiß nur nicht, wie ich aus so einer Struktur:
    Form1 -> GUIAppBridge -> | -> MainApp -> StreetNetwork (hier steht dann der Vec)
    dann vom StreetNetwork (wo dann alle Berechnungen laufen) aus irgendwie mein Form1 dazu bringe ein Label anders zu benennen (das mit den Zeitabständen wär ja erstmal egal.......).

    Sprich mein GUI ist in der Form1, darin habe ich sowas: GUIAppBridge* guiAppBridge, dort wiederum habe ich eine MainApp * application, und dort wieder habe ich ein StreetNetwork *network.....

    Ist das grauslig?
    Weil ich dachte, so wäre alles schön getrennt.... (auch die 2 Teile des Programms (MainApp, sowie StreetNetwork sind ein Programm als lib compiliert, und in Abhängigkeit dazu dann die Form1 und GUIAppBridge)
    Ich hoffe man kann verstehen was ich meine ;)......

    Lg
    Spite

    edit:
    wenn ich mein Label aus Form1 in einen namespace schmeiss mit einer methode zum updaten und ich die Form1 in in meine StreetNetwork include glaubst du würde das dann funktionieren?
    Möglich wärs, oder ehen nicht (zB weil das dann ja eine Lib wird oder so, kenn mich da nicht aus, ich denke ich werd mal probiern....
    wobei ich dann keine Ahnung hätte, wie ich mein Label in einen Namespace bekomme..... :(

  • Ok, durch public machen einer Methode, sowie des Vectors, der die Strassen enthält konnte ich die Schleife in die Form1.h bringen, da wirs dann einfach nach jedem x-ten Schritt das Label upgedated (geht sicher auch schöner... aber es passt mal so) :)

    Lg
    Spite

  • Ok, durch public machen einer Methode, sowie des Vectors, der die Strassen enthält konnte ich die Schleife in die Form1.h bringen, da wirs dann einfach nach jedem x-ten Schritt das Label upgedated (geht sicher auch schöner... aber es passt mal so) :)

    solange es funktioniert ... oder schaut sich dann noch irgendwer den source an? (Prof, Tutor, etc.)

    im nachhinein, sobald alles funkt, kann man schnell sehr viel vom code "aufräumen" bzw umstrukturieren. das ist zumindest meine erfahrung, es sei den es ist ein riesenprojekt... :D

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!