Seite 1 von 1

OpenGL mit SDL verwenden

Verfasst: Mo Mai 04, 2009 9:23 pm
von Jside
/* edit by Kerli: Wir schweifen wieder ab :) */
Dirty Oerti hat geschrieben:
jside hat geschrieben:...Mal nebenbei angemerkt, jeder 3te hier incl. Ich bastelt an einer GameEngine ...warum proggen wir nicht gleich zusammen eine?
Hier! ^^ :)
Hätte hier schonmal eine komplette INIT für SDL und OpenGL parat, aber noch ungetestet...^^

Code: Alles auswählen

typedef struct {
    int r;
    int b;
    int g;
    int alpha;
} GfxColor;

typedef struct {
    int   depth;
    int   width;
    int   heigth;
    int   lod; //Level of Detail, unbenutzt
    int   efflod; //Effect Level of Detail, ebenfalls unbenutzt
    int   fullscreen; //1= Fullscreen
    char *title; //Fenster Titel
    char *task; //Fenster Task
    GfxColor background; //OpenGL clear() hintergrund
}GfxOptions;

void SDLinit(GfxOptions Gfx) {
    if(SDL_Init(SDL_INIT_EVERYTHING) == -1) {
        fprintf(stderr,"Unable to init SDL: %s\n",SDL_GetError());
        return;
    }
    SDL_WM_SetCaption(Gfx.title, Gfx.task);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    if(!Gfx.fullscreen) SDL_SetVideoMode(Gfx.heigth, Gfx.width, Gfx.depth, SDL_OPENGL);
    else SDL_SetVideoMode(Gfx.heigth, Gfx.width, Gfx.depth, SDL_OPENGL|SDL_FULLSCREEN);
}

void GLinit(GfxOptions Gfx) {
    glEnable(GL_TEXTURE_2D);

    glBlendFunc(GL_SRC_ALPHA,GL_ONE);

    glClearColor(Gfx.background.r, Gfx.background.b, Gfx.background.g, Gfx.background.alpha);

    glClearDepth(Gfx.depth);

    glDepthFunc(GL_LESS);

    glEnable(GL_DEPTH_TEST);

    glShadeModel(GL_SMOOTH);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

Re: OpenGL oder SDL

Verfasst: Mo Mai 04, 2009 9:25 pm
von Dirty Oerti
*Räusper*
Kann r,g,b, und a nicht nur Werte zwischen 0-255 annehmen..?
Wozu braucht man dann ints? Da tuns auch Chars...

Re: OpenGL oder SDL

Verfasst: Mo Mai 04, 2009 9:30 pm
von Jside
Dirty Oerti hat geschrieben:*Räusper*
Kann r,g,b, und a nicht nur Werte zwischen 0-255 annehmen..?
Wozu braucht man dann ints? Da tuns auch Chars...
Joa, war nur schnell hingeproggt, da denke ich normalerweise nicht über sowas nach :D :lol:

Re: OpenGL oder SDL

Verfasst: Mo Mai 04, 2009 10:02 pm
von Kerli
Jside hat geschrieben:Joa, war nur schnell hingeproggt, da denke ich normalerweise nicht über sowas nach :D :lol:
Die Programmierer habe ich ja besonders gerne. Einfach Code schreiben und nicht mitdenken :P

Als weitere Optimierung könntest du die Strukturen noch als konstante Referenzen übergeben. Erspart unnötige Kopien und beseitigt ein paar mögliche Fehlerquellen.

Wer so etwas ähnliches in C++ haben möchte kann auch einmal auf meine Seite schauen. Das hab ich für meine Tutorials geschrieben, aber es kann sie natürlich jeder verwenden wie und wo er mag (Ist eine BSD-Lizenz).

Re: OpenGL oder SDL

Verfasst: Di Mai 05, 2009 8:51 am
von Xin
Jside hat geschrieben:Joa, war nur schnell hingeproggt, da denke ich normalerweise nicht über sowas nach :D :lol:
Der Informatiker rät: Niemals nur schnell hinproggen. Wird das Projekt größer, weiß man nicht mehr, was schnell hingerotzt wurde und was durchdacht wurde. Solange es nur rappelt, aber nicht auseinanderfliegt, bleibt alles so wie es ist. Wenn dann links und rechts rapelt und in Folge dazu aber in der Mitte auseinanderfliegt, wird die Sache kompliziert. Weil das in der Mitte ist durchdacht und eigentlich durch Tests abgesichert und kann eigentlich doch gar nicht kaputt gehen... oder!?

Programmiere lieber durchdacht und wirf in Folge dazu eventuell durchdachten Code als Prototypen wieder weg (passiert in der Realität eh nie...). Wenn man sich dran gewöhnt hat, grundsätzlich durchdacht zu programmieren, fällt das nicht mehr zeitlich ins Gewicht.

Re: OpenGL mit SDL verwenden

Verfasst: Mi Mai 06, 2009 5:36 pm
von Jside
Joa schon gut, ich hab jetzt schon einen guten Ansatz, und schon wenige, dafür aber sehr Kraftvolle Funktionen eingebaut, so in 2 Stunden arbeit, obwohl ich heute morgen ewtl. 5% Ahnung von OpenGL hatte, und nach ner Stunde Manuals lesen glaubisch schon ganz gut zurecht komme ^^ :) (ich hab vorallem ältere Handbücher gelesen, da da OpenGL noch nicht so verschaltelt war wie heute, und man alles viel besser verstehen kann)

Folgende funktionen hab ich drin:

int SDLinit(GfxOptions Gfx); //Kennt ihr, hab ich aber nochmals überarbeitet...(ver 0.2)
void GLinit(GfxOptions Gfx); //Auch etwas überarbeitet(ver 0.3)

void GfxDisplaySimpleTriangle(GfxTriangle client); //Generiert eine Simple Triangle
void GfxMultiTrangle(); //Start eines Multitriangle Models
void GfxMultiEnd(); //Ende eines Multi Triangle oder Quad Models
void GfxMultiQuad(); //Start eines Multi Quad Models
void GfxSetTriColor(GfxTriangle client, GfxColor color); //Setzt alle Vertex Farben des Triangles "client" auf die selbe Farbe.

Gerade im Moment in WIP:
void GfxDisplaySimpleQuad(GfxQuad client); // Dürfte klar sein
void GfxIdioteSecureMod(GfxViewport client, enum Gfxmod type); //Setzt den Modus(3D Perspektive oder 2D) Vollautomatisch auf die Viewport structur "client"
void GfxStartViewport(GfxViewport client); //Startet für alle Modelle, die danach angezeigt werden den vorher definierten, oder vollautomatisch definierten ViewPort.

TODO:
Rotation/Coordinaten
Texturen
etc.

Beispiele:
Einfache Triangle;
GfxOptions MainOptions;
/* Hier MainOptions definieren, oder auslesen lassen */

SDLinit(MainOptions);
GLinit(MainOptions);

GfxTriangle test;
/* hier test definieren, oder auslesen lassen */

DisplaySimpleTriangle(test);

SDL_GL_SwapBuffers();
sleep(2);
Model aus mehreren Triangles;
GfxOptions MainOptions;
/* Hier MainOptions definieren, oder auslesen lassen */

SDLinit(MainOptions);
GLinit(MainOptions);

GfxTriangle test[6];
/* hier test definieren, oder auslesen lassen */

GfxMultiTrangle();
DisplaySimpleTriangle(test[0]); // Ja auch sowas kann die Engine ;)
DisplaySimpleTriangle(test[1]);
DisplaySimpleTriangle(test[2]);
/* Punkt, Punkt, Punkt */
GfxMultiEnd()

SDL_GL_SwapBuffers();
sleep(2);
Einfacher gehts echt nitmehr, ohne das ich denjenigen, der die Engine benutzt bevormunde ;)

236 Codezeilen, Doxygen durchkommentiert(zumindest die Funktionen)

Bisjetzt jemand eine Idee/Kritik etc? Ich lads mal heute abend soweit hoch...

Re: OpenGL mit SDL verwenden

Verfasst: Mi Mai 06, 2009 9:13 pm
von Jside
Ok, ich hab bislang nix neues eingebaut, nur die Funktion GfxDisplaySimpleQuad() eingefügt,
http://jside.bplaced.net/enginev0.1.tar.gz
Einfach sh build ausführen, dann wird das ganze neu kompiliert...
Wenn alles läuft wird ein Dreieck angezeigt...

GfxSetTriColor hat einen Macken, da werden die Werte nicht richtig übergeben... :oops:
GfxSetQuadColor hab ich nochnicht geproggt...

Ich schreibe zurzeit an einer Dokumentation^^

Wer mithelfen will, kann einfach dran rumbasteln, und den Code mir per Email, PN oder in dem Fred hier Posten, dabei aber bei Veränderungen in bestehenden Funktionen im Kommentarheader den @version Wert eins höher setzten.


*geht schonmal in Deckung* :mrgreen: :mrgreen: