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

Aktuelle Zeit: Fr Jul 18, 2025 00:22

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Apr 03, 2006 00:00 
Offline
DGL Member

Registriert: So Feb 19, 2006 18:52
Beiträge: 110
Hallo,

es geht um folgende funktion :

Code:
  1.  
  2.   if spController.Down then
  3.   begin
  4.       myDisk := gluNewQuadric;
  5.       myTess := gluNewTess;
  6.  
  7.       // online ATC CTR POSITIONEN**************************************************
  8.       gllAtc:=glgenlists(7);
  9.       glNewList(gllAtc, GL_COMPILE);
  10.  
  11.  
  12.  
  13.       iOgCtr := High(aCtr);
  14.       pCtr := @aCtr[0];
  15.       for x := 0 to iOgCtr do
  16.       begin
  17.         glBegin(GL_LINE_LOOP);
  18.         glColor3F(0.5,0.5,1);
  19.  
  20.         z := 0;
  21.         SetLength(myPointList, 0);
  22.         pFirRecord := @aFirRecord[0];
  23.         iOgFir     := High(aFirRecord);
  24.         for y := 0 to iOgFir do
  25.         begin
  26.           szFir := '';
  27.           if pCtr^.szIID <> '' then
  28.             szFir := pCtr^.szID+' '+pCtr^.szIID
  29.           else
  30.             szFir := pCtr^.szID;
  31.  
  32.           if (pFirRecord^.szFir = szFir) then
  33.           begin
  34.             glVertex3F(pFirRecord^.rLon, pFirRecord^.rLat,0);
  35.               reShortPlan.Lines.Add(szFir+' '+RtoS(pFirRecord^.rLat)+' '+RtoS(pFirRecord^.rLon));
  36.               SetLength(myPointList, z+1);
  37.                 myPointList[z][0] := pFirRecord^.rLon;
  38.                 myPointList[z][1] := pFirRecord^.rLat;
  39.                 myPointList[z][2] := 0;
  40.               inc(z);
  41.           end;
  42.           inc(pFirRecord);
  43.         end;
  44.         glEnd;
  45.  
  46.         // Tesselierung der Fir
  47.         debug('Tesseliere: '+szFir+'Typ: '+pCtr^.szTyp+' High: '+IntToStr(High(myPointList))+' Length: '+IntToStr(Length(myPointList)));
  48.           glEnable(GL_BLEND);
  49.           glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  50.  
  51.           glColor4f(0.5,0.5,1,0.4);
  52.           if pCtr^.szTyp = 'FSS' then
  53.             glColor4f(0.9,0.5,1,0.4);            
  54.  
  55.           //myTess := gluNewTess;
  56.  
  57.           gluTessCallback(myTess, GLU_BEGIN, @glBegin);
  58.           gluTessCallback(myTess, GLU_VERTEX, @glVertex3fv);
  59.           gluTessCallback(myTess, GLU_END, @glEnd);
  60.           gluTessBeginPolygon(myTess, nil);
  61.           gluTessBeginContour(myTess);
  62.  
  63.           for z:= 0 to length(myPointList)-1 do
  64.           begin
  65.             GLArrayd3[0] := myPointList[z][0];
  66.             GLArrayd3[1] := myPointList[z][1];
  67.             GLArrayd3[2] := myPointList[z][2];
  68.             gluTessVertex(myTess, GLArrayd3, @myPointList[z]);
  69.           end;
  70.           gluTessEndContour(myTess);
  71.           gluTessEndPolygon(myTess);
  72.           //gluDeleteTess(myTess);
  73.           glDisable(GL_BLEND);
  74.           SetLength(myPointList, 0);
  75.  
  76.         inc(pCtr);
  77.       end;
  78.  
  79.       // ANdere ATC POSITIONEN *****************************************************
  80.       //myDisk := gluNewQuadric;
  81.  
  82.       for x := 0 to iOgAtc do
  83.       begin
  84.         // APP
  85.         if pAtc^.szTyp = 'APP' then
  86.         begin
  87.           glPushMatrix;
  88.            glEnable(GL_BLEND);
  89.            glTranslateF(pAtc^.rLon,pAtc^.rLat,0);
  90.            glColor4f(0,0.5,0,0.3);
  91.            gluSphere(myDisk,0.8,360,260);
  92.            glDisable(GL_BLEND);
  93.           glPopMatrix;
  94.         end;
  95.         // TWR
  96.         if pAtc^.szTyp = 'TWR' then
  97.         begin
  98.           glPushMatrix;
  99.            glEnable(GL_BLEND);
  100.            glTranslateF(pAtc^.rLon,pAtc^.rLat,0);
  101.            glColor4f(0.8,0.2,0,0.5);
  102.            gluSphere(myDisk,0.3,360,260);
  103.            glDisable(GL_BLEND);
  104.           glPopMatrix;
  105.         end;
  106.  
  107.  
  108.         // GND
  109.         if pAtc^.szTyp = 'GND' then
  110.         begin
  111.           glColor3F(0,0.5,0);
  112.           glPointSize(5);
  113.           glBegin(GL_POINTS);
  114.            glVertex3F(pAtc^.rLon,pAtc^.rLat,0);
  115.           glEnd;
  116.           glPointSize(1);
  117.         end;
  118.  
  119.         inc(pAtc);
  120.       end;
  121.  
  122.       glEndList;
  123.  
  124.       gluDeleteQuadric(myDisk);
  125.       gluDeleteTess(myTess);
  126.       // ***************************************************************************
  127.  


Zur Erklärung :

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 ?

Matthias


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Apr 03, 2006 00:52 
Offline
Ernährungsberater
Benutzeravatar

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:
Code:
  1. if myDisk=nil then Error


Zu dem Rest kann ich aber aktuell nichts sagen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 03, 2006 00:58 
Offline
DGL Member

Registriert: So Feb 19, 2006 18:52
Beiträge: 110
Hallo,

ach so ist das gemeint. Verstehe und teste ich sogleich, danke.

Vielleicht kannst Du mir ja sagen wie das mit dem gluNewQuadric und gluNewTess ist ?

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

Also das quadric oder tess jedesmal neu erstellen oder
vielleicht EIN globales quadric und EIN globales TESS erstellen ?

Wie macht man das richtig ?

Matthias


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 03, 2006 01:22 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Mir ist erstmal eins aufgefallen:
Code:
  1. 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 03, 2006 01:30 
Offline
DGL Member

Registriert: So Feb 19, 2006 18:52
Beiträge: 110
Hallo,

ich hab da glaub ich was falsch verstanden mit den Listen.
Ich dachte für jede Liste brauche ich eine eigene NUMMER :-)

Hab jetzt nochmal gelesen und hoffe das ist so richtig ?

Also wenn ich folgende Listen habe :
// OGL Listen
gllGitter : TGLuint; // 1
gllCoastLine : TGLuint; // 2
gllVor : TGLuint; // 3
gllNdb : TGLuint; // 4
gllFir : TGLuint; // 5
gllFirNamen : TGLuint; // 6
gllATC : TGLuint; // 7
gllAtcId : TGLuint; // 8
gllAtcUser : TGLuint; // 9
gllPilots : TGLuint; // 10
gllPilotCs : TGLuint; // 11
gllPilotUser : TGLuint; // 12
gllVorNamen : TGLuint; // 13
gllNdbNamen : TGLuint; // 14
gllHiAw : TGLuint; // 15
gllHiAwID : TGLuint; // 16
gllHiAwWp : TGLuint; // 17
gllLoAw : TGLuint; // 18
gllLoAwID : TGLuint; // 19
gllLoAwWp : TGLuint; // 20

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 ?

Matthias


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 03, 2006 01:35 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
STF-DIR hat geschrieben:
und dann für jede Liste glNewList(gllAtc, GL_COMPILE);

Nein, weil du damit die Liste gllAtc erstellst, du musst es so machen:
Code:
  1. gllGitter:=glGenLists(20);
  2. gllCoastLine := gllGitter+1;
  3. gllVor := gllGitter+2;
  4. .
  5. .
  6. .
  7. gllLoAwWp := gllGitter+19;


Und compilieren machst du dann mit:
Code:
  1. glNewList(gllVor, GL_COMPILE);

als Beispiel.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 03, 2006 01:48 
Offline
DGL Member

Registriert: So Feb 19, 2006 18:52
Beiträge: 110
Ahmmmm,

nicht vestanden .., sorry

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:
  1.  
  2. if buttonATC then
  3.  glCallList(atc);
  4.  
  5. if buttonGitter then
  6.   glCallList(gitter);
  7.  
  8. if buttonLoAw then
  9.   glCallList(LoAw);
  10.  


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.

Matthias


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 03, 2006 02:04 
Offline
Ernährungsberater
Benutzeravatar

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:
  1. glNewList(ATC, GL_COMPILE);
  2. //mit Inhalt füllen
  3. 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 03, 2006 02:44 
Offline
DGL Member

Registriert: So Feb 19, 2006 18:52
Beiträge: 110
Hallo,

ich glaub ich habs verstanden DANKE !!

Sieht jetzt so aus .... am Anfang des Programms werden die Listen angefordert :

// Listen erstellen
gllMain := glGenLists(21);
gllGitter := gllMain+1; // 1
gllCoastLine := gllMain+2; // 2
gllVor := gllMain+3; // 3
gllNdb := gllMain+4; // 4
gllFir := gllMain+5; // 5
gllFirNamen := gllMain+6; // 6
gllATC := gllMain+7; // 7
gllAtcId := gllMain+8; // 8
gllAtcUser := gllMain+9; // 9
gllPilots := gllMain+10; // 10
gllPilotCs := gllMain+11; // 11
gllPilotUser := gllMain+12; // 12
gllVorNamen := gllMain+13; // 13
gllNdbNamen := gllMain+14; // 14
gllHiAw := gllMain+15; // 15
gllHiAwID := gllMain+16; // 16
gllHiAwWp := gllMain+17; // 17
gllLoAw := gllMain+18; // 18
gllLoAwID := gllMain+19; // 19
gllLoAwWp := gllMain+20; // 20

Dann werden die Statischen erstellt :

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 ...

Matthias und Danke nochmals !!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 03, 2006 10:37 
Offline
Ernährungsberater
Benutzeravatar

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.


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


Wer ist online?

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.

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