Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 15:16

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Jun 16, 2010 22:32 
Offline
DGL Member

Registriert: Mi Nov 18, 2009 10:55
Beiträge: 20
Programmiersprache: C++
Hallo.
Ich schäme mich eigentlich, dieses Thema zu eröffnen, aber ich brauche doch Hilfe bei einem (vermutlich ziemlich einfachen) Problem.
Es geht um das Zeichnen von Primitiven.

Einige Primitive verschwinden nämlich hin und wieder. Mit hin und wieder meine ich nicht, dass sie innerhalb des Programmablaufes plötzlich verschwinden, sondern nach Änderen am Code.
Das aktuelle Beispiel:
Ich habe eine Klasse für Bilder (also einfache textuierte Quads) erstellt und verwendet - und seitdem werden einige Bildelemente nicht mehr dargestellt, an denen ich selbst eigentlich nichts geändert habe.

Ich vermute stark, dass es an meinem Zeichenprozess.
Dazu hier einige Codeausschnitte:

c_GUI_Manager.hpp
Code:
    class c_GUI_Manager {
        private:
        public:
            void begin_2DModus();
            void end_2DModus();
            void Zeichnung_Hinten();
            void Zeichnung_Vorne();
   };

c_GUI_Manager.cpp
Code:
void c_GUI_Manager::begin_2DModus() {
    glEnable(GL_TEXTURE_2D);
    glDisable(GL_DEPTH_TEST);
    glPushMatrix();
        glMatrixMode( GL_PROJECTION );
            glLoadIdentity();
            gluOrtho2D (0,DerWaechter->get_Fensterbreite(),0,DerWaechter->get_Fensterhoehe());
}

void c_GUI_Manager::end_2DModus() {
    glPopMatrix();
    glEnable(GL_DEPTH_TEST);
    glPushMatrix();
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();
    glPopMatrix();
}

void c_GUI_Manager::Zeichnung_Hinten() {
    if(!HintergrundZeichnen)
        return;
    begin_2DModus();
        Hintergrund->zeichne();
    end_2DModus();
}

void c_GUI_Manager::Zeichnung_Vorne() {
    begin_2DModus();
        /*glEnable(GL_BLEND);
        glColor3f(0, 0, 0);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE);

        DerCursor->zeichne();
        glColor3f(1, 1, 1);
        glDisable(GL_BLEND);*/ //Ich dachte erst, hier läge das Problem, aber daran lag/liegt es nicht.
        for(int i=0; i<NR_DummyButtons+NR_AndereButtons-1; i++) {
            if(Dummy_Button[i]==NULL)
                continue;
                Dummy_Button[i]->zeichne();
                Dummy_Button[i]->SchreibeText();
        }
    end_2DModus();
}

Soviel zum "Hauptcode".
Nun frage ich mich natürlich was ich falsch mache und komme eigentlich nur zu dem Ergebnis, dass ich es nicht genau weiß, es aber vermutlich an den Displaylisten liegt.
Nun also die wichtige Frage:
Nützten PushMatrix- und PopMatrix-Befehle beim Initialisieren, also beim kompilieren der Displaylisten, oder werden diese Befehle ignoriert? (Denn es wird ja "nur" das Ergebnis gespeichert und bei Bedarf aufgerufen).
Hier noch die Codestellen aus der Button- und Hintergrundbild-Klasse:
Code:
void c_GUI_Hintergrund::init() {
    const float Breite  = DerWaechter->get_Fensterbreite();
    const float Hoehe   = DerWaechter->get_Fensterhoehe();
    glNewList(DisplayListe, GL_COMPILE);

        glBindTexture(GL_TEXTURE_2D, *OGL_Textures[TextureID]);
        glBegin(GL_TRIANGLE_STRIP);//(GL_QUADS);
                    glTexCoord2i(1,1); glVertex2f(Breite-Rand, Rand);
                    glTexCoord2i(0,1); glVertex2f(Rand,        Rand);
                    glTexCoord2i(1,0); glVertex2f(Breite-Rand, Hoehe-Rand);
                    glTexCoord2i(0,0); glVertex2f(Rand,        Hoehe-Rand);
        glEnd();
    glEndList();
}
inline void c_GUI_Hintergrund::zeichne() {
    glCallList(DisplayListe);
}

void c_GUI_Button::init_Visual() {
    glNewList(DisplayListe, GL_COMPILE); {
            if(glIsEnabled(GL_TEXTURE_2D)==GL_FALSE)
                glEnable(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, *OGL_Textures[TextureID[1]];
            glBegin(GL_QUADS);
                glTexCoord2f(0, 1); glVertex2f((float)Pos_X+Randbreite,  (float)Pos_Y+Randbreite);
                glTexCoord2f(1, 1); glVertex2f((float)Breite-Randbreite, (float)Pos_Y+Randbreite);
                glTexCoord2f(1, 0); glVertex2f((float)Breite-Randbreite,(float)Hoehe-Randbreite);
                glTexCoord2f(0, 0); glVertex2f((float)Pos_X+Randbreite, (float)Hoehe-Randbreite);
            glEnd();
    } glEndList();
    init_BH_Start();
}
void c_GUI_Button::init_BH_Start() {
    glNewList(DisplayListe+1, GL_COMPILE); {
            if(glIsEnabled(GL_TEXTURE_2D)==GL_FALSE)
                glEnable(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, *OGL_Textures[TextureID[0]]);
            glBegin(GL_QUADS);
                glTexCoord2f(0, 1); glVertex2f(Pos_X,  Pos_Y);
                glTexCoord2f(1, 1); glVertex2f(Breite, Pos_Y);
                glTexCoord2f(1, 0); glVertex2f(Breite,Hoehe);
                glTexCoord2f(0, 0); glVertex2f(Pos_X, Hoehe);
            glEnd();
    } glEndList();
}

void c_GUI_Button::zeichne() {
    if(!glIsList(DisplayListe))
        return;
    glPushMatrix(); //Damit die Animation nicht auf den Text überspringt...
        if(ButtonHighlighting==BH_Zoom && BHStatus)
            glCallList(DisplayListe+1);

        if(BHStatus && ButtonHighlighting==BH_Animate) {
            if(AniClock->GetElapsedTime()>Animationsdauer) {
                AniClock->Reset();
            }
            glRotatef(-AniClock->GetElapsedTime() , 1.f, 1.f, 0.f);
        }

        glCallList(DisplayListe);
    glPopMatrix();
}

Bitte seht mir nach, dass ich mit so viel Code um mich werfe, aber es ist mir wichtig, dass verstanden werde und auf Fehler aufmerksam gemacht werde.

Im Anhang befinden sich 3 Bilder. Eines zeigt, wie das Programm momentan aussieht und das andere zeigt, wo sich die Buttons befinden und das dritte zeigt, wie das Programm bis vor Kurzem ausgesehen hat.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 16, 2010 22:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Nützten PushMatrix- und PopMatrix-Befehle beim Initialisieren, also beim kompilieren der Displaylisten, oder werden diese Befehle ignoriert? (Denn es wird ja "nur" das Ergebnis gespeichert und bei Bedarf aufgerufen).

Ich hab deine Frage jetzt nur über flogen, aber es scheint mir das du PushMatrix- und PopMatrix nicht korrekt nutzt. Du musst vor dem Push und vor dem Pop über glMatrixMode festlegen welchen Stack zu pushen/popen willst. Du beeinflusst halt immer den gerade aktiven Stack.

Desweiteren macht das hier z.B. genau gar nichts, wenn MODELVIEW bereits aktiv ist:
Code:
glPushMatrix();
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glPopMatrix();

Wenn vorher die Projektionsmatrix aktiv ist, wird diese gepusht, aber nicht wieder gepoppt. (=> Modelview wird gepoppt)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 17 Queries | GZIP : On ]