Im ersten Teil wird eine Fläche ausgefüllt. Diese ist ein bischen eigenwillig geformt und muss deswegen Tesseliert werden. Die funktion hatte ich mal hier oder in nem anderen Forum gefunden.
// ANdere ATC POSITIONEN *****************************************************
Im zweiten Teil werden dann noch einige Kreise gezeichnet.
Das ganze wird per timer aller 5 minuten gemacht. dabei können sich die Flächen ändern und einige bereiche fallen weg oder kommen hinzu.
Ist eigentlich ganz einfach, funktioniert auch .. 10 minuten lang, dann wird plötzlich nix mehr angezeigt. Bleibt einfach alles schwarz. Die Tesselierung wird aber durchgeführt und die Koordinaten sind auch da und stimmen auch.
Die Liste gibts auch, hab ich mit gllIsList() abgefragt.
An was könnte das liegen ?
Ich hab schon
myDisk := gluNewQuadric;
myTess := gluNewTess;
und
gluDeleteQuadric(myDisk);
gluDeleteTess(myTess);
an verschiedenen Stellen getestet. Macht aber keinen Unterschied.
Was mach ich denn hier falsch ?
Übrigens weiss ich nicht wie ich das hier machen soll ?
Wenn gluNewQuadric als Rückgabewert Null (0) liefert, bedeutet dies, dass nicht genug Speicher vorhanden ist um die Quadrik zu erstellen.
function gluNewQuadric : PGLUquadric;
Steht so in der Wiki, aber wo/wie bekomm ich denn da eine Rückgabewert ?
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
STF-DIR hat geschrieben:
Übrigens weiss ich nicht wie ich das hier machen soll ?
Wenn gluNewQuadric als Rückgabewert Null (0) liefert, bedeutet dies, dass nicht genug Speicher vorhanden ist um die Quadrik zu erstellen.
function gluNewQuadric : PGLUquadric;
Steht so in der Wiki, aber wo/wie bekomm ich denn da eine Rückgabewert ?
Matthias
Öhm, kennst du dich mit Pointern aus?
Weil gluNewQuadric liefert einen Pointer auf ein TGLUquadric zurück.
Wenn kein quadric erzeugt werden kann, ist der Pointer ein nil-Pointer, also das Element auf das der Pointer zeigt ist not in list also nicht existent. In C wird das ganze NULL genannt und intern steht dort auch eine 0.
Die Bezeichnung ist in Pascal übrigens extra so:
Alle Zeiger sollten mit einem P gekennzeichnet sein, Records, Objects oder Klassen mit einem T.
Also musst du nur testen:
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Mir ist erstmal eins aufgefallen:
Code:
gllAtc:=glGenLists(7);
Du reservierst dir sieben Listen, erstellst aber nur eine.
STF-DIR hat geschrieben:
Was ist richtig ?
-Liste erstellen ---schleife beginn - quadric neu erstellen - quadric zeichnen - quadric löschen ---schleife ende -liste ende
-Liste erstellen - quadric neu erstellen ---schleife beginn - quadric zeichnen ---schleife ende - quadric löschen -liste ende
Ich kenne mich hier nicht genug mit den GLU-Funktionen aus.
Die 2. Variante ist aber performer wenn sie funktioniert.
Soweit ich mich jetzt aber eingelesen habe, sollte es funktionieren.
Dann müsste ich z.B. im FormCreate oder so, jedenfalls nur einmal glGenLists(20) aufrufen ?
und dann für jede Liste glNewList(gllAtc, GL_COMPILE);
Ist das so richtig ?
Also die einzelnen Listen sind bei mir dazu da um verschieden Sachen an und abzuschalten.
Also in der Render procedure sieht das dann etwa so aus :
Code:
if buttonATC then
glCallList(atc);
if buttonGitter then
glCallList(gitter);
if buttonLoAw then
glCallList(LoAw);
Dabei werden einige der Listen am Programmbeginn erstellt und ändern sich nicht,
z.B. LoAw oder VOR.
Die Liste ATC ändert sich immer. Das ist dann die die sich ändert wenn der Timer aktiv ist.
Da wird eine Datei heruntergeladen und zerpflückt. Daruas wird dann die ATC Liste z.B. jedesmal neu erstellt.
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
STF-DIR hat geschrieben:
Ahmmmm,
nicht vestanden .., sorry
Was hast du nicht verstanden? Das wäre hilfreich.
Ansonsten ist es ja auch kein Problem.
Du musst die Displaylisten ja nicht direkt mit Inhalt füllen, können ja teilweise erstmal leerstehen.
Du generierst dir erstmal am Anfang deine 20 Displaylisten oder wieviele du auch brauchst.
Diese glGenList liefert dir eine einfache Zahl zurück, die intern auf die Liste zeigt.
Wenn du z.B. mit glGenList(2) zwei Displaylisten anforderst, ist die erste die zurückgegebene Zahl, die zweite die Zahl+1.
So kannst du dann auf die n Displaylisten zugreifen die du angefordert hast.
Nachdem du das verstanden und angewendet hast, kannst du die statischen Displaylisten mit Inhalt füllen.
Die dynamischen bzw. ATC füllst du dann auch mit.
Wenn jetzt der Timer aktiv wird, sagst du einfach:
Code:
glNewList(ATC, GL_COMPILE);
//mit Inhalt füllen
glEndList();
glGenList bzw. glDeleteList brauchst du an der Stelle nicht mehr.
Erst am Ende deines Programmes benutzt du glDeleteList auf alle Displaylisten an.
Das Wieso bzw. den Grund weshalb man die beiden Befehle an der Stelle nicht braucht würde ich aber gerne von dir wissen, damit ich weiss ob du es verstanden hast.
glNewList(gllGitter, GL_COMPILE);
usw....
die Dynamischen werden bei dem Timer Ereignis genauso erstellt...jedesmal neu gefüllt weil sich ja die Daten ändern können.
Zitat:
Das Wieso bzw. den Grund weshalb man die beiden Befehle an der Stelle nicht braucht würde ich aber gerne von dir wissen, damit ich weiss ob du es verstanden hast.
Da ich am Anfang gleich 20 Listen angefordert habe stehen mir ja 20 Listen zur Verfügung, also brauch ich die ja nicht nochmal anfordern, dann hätte ich ja 40 ... 60 ... 80 ....
Das Proggi läuft derzeit im Hintergrund, vielleicht lag es ja daran das bei jedem Timerdurchlauf wieder neue Listen angefordert wurden und irgendwann der Speicher nicht mehr ausgereicht hat für ( was weiss ich...nach dem 10. timer vielleicht 500 Listen )
Na mal sehen...
Am Ende müsste ich dann glDeleteLists(gllMain, 20); aufrufen .. denke ich mal oder ?
Ich glaub aber schon ...
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
STF-DIR hat geschrieben:
// Listen erstellen gllMain := glGenLists(21);
Du weisst, dass gllMain auch eine Displayliste ist, die du auch benutzen darfst? Weil nach meinem aktuellen Stand sieht es nicht danach aus, zumindest hast du sie vorher bei deinen Listen nicht aufgelistet.
STF-DIR hat geschrieben:
Am Ende müsste ich dann glDeleteLists(gllMain, 20); aufrufen .. denke ich mal oder ?
Nein, glDeleteLists(gllMain, 21);
Du hast ja 21 Listen angefordert, also musst/solltest du auch alle 21 freigeben.
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.