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

Aktuelle Zeit: Di Jul 15, 2025 21:04

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Selektion und Text = Problem
BeitragVerfasst: So Dez 18, 2005 21:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Feb 02, 2005 14:22
Beiträge: 81
Hallo Forum,

ich habe ein recht merkwürdiges Problem. Ich möchte in einer Demo Selektion und Textausgabe kombinieren. In meiner Render-Routine rufe ich die Prozedur 'ShowText' auf. Innerhalb dieser Routine sieht es so aus:
Code:
  1. glDisable(GL_DEPTH_TEST);
  2. glDisable(GL_TEXTURE_2D);
  3.  
  4. glMatrixMode(GL_PROJECTION);
  5. glLoadIdentity;
  6. glOrtho(0,640,480,0, -1,1);
  7. glMatrixMode(GL_MODELVIEW);
  8. glLoadIdentity;
  9.  
  10. If Frameanzeige = True Then
  11. Begin
  12.   PrintText(5, 200, 'FPS: ' + IntToStr(FPSFrames));
  13. End;
  14.  
  15. glEnable(GL_DEPTH_TEST);
  16. glEnable(GL_TEXTURE_2D);


Wenn die Variable Frameanzeige True ist, der Text also ausgegeben wird, funktioniert die Selektion nicht mehr. Ist die Variable False, ist bei der Selektion alles in Ordnung.
Was hat die Textausgabe mit der Seletkion zu tun frage ich mich...und wie kann ich beides in einem Programm anwenden? Merkwürdig...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Selektion und Text = Problem
BeitragVerfasst: So Dez 18, 2005 21:36 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Michael hat geschrieben:
Was hat die Textausgabe mit der Seletkion zu tun frage ich mich

Das Frage ich mich gerade auch. Vielleicht macht der Wechsel in den Orthomodus das Selektieren kaputt. Aber bin mir da unsicher.
Michael hat geschrieben:
...und wie kann ich beides in einem Programm anwenden? Merkwürdig...

Einfach den FPS beim Rendern für die Selektion weglassen.
Vorher Frameanzeige:=False, dann für die Selektion Rendern und dann Frameanzeige:=True;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 18, 2005 21:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Feb 02, 2005 14:22
Beiträge: 81
Danke i0n0s für deine Antwort!

Dein erster Hinweis kann nicht stimmen. GL_ORTHO wird ja auch dann gesetzt, wenn der Text nicht angezeigt wird. Also der Orthomodus selber schadet wohl nicht, erst die Textausgabe macht die Selektion kaputt.

Punkt zwei könnte funktionieren, ist allerdings etwas umständlich :? Gibt es da keine bessere Lösung?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 18, 2005 22:32 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Ich weiß leider nicht wie deine Funktion PrintText aussieht und kann daher nur spekulieren. Vielleicht veränderst du in dieser Funktion deine Modelviewmatrix. Speichere sie am besten vor dem Aufruf der Funktion und setze sie anschließend wieder zurück:

If Frameanzeige = True Then
Begin
glPushMatrix;
PrintText(5, 200, 'FPS: ' + IntToStr(FPSFrames));
glPopMatrix;
End;
In deinem konkreten Fall müsste sogar ein Aufruf von glLoadIdentity nach dem Aufruf von PrintText ausreichen. Wenn das Problem damit nicht gelöst ist zeige uns doch bitte mal die Funktion PrintText.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 18, 2005 22:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also was ich schon festgestellt habe deckt sich mit dem i0n0s auch sagte. Sobald du in den Orthomodus wechselt war dann immer das Ergebniss von der Selektion total komisch und hat vorne und hinten nicht mehr hingehauen. Also am Besten entweder nur Perspektive oder Ortho.

Und zum Thema Selektionspezifisch. Ja es gibt ne ganz simple Lösung. Im Selection Artikel im Wiki ist ein Stück Code beim Zeichnen. Und dort solltest du dir mal die Variable RenderMode ansehen. Das kannst du bei OpenGL abfragen und dann brauchst du nur noch den Inhalt der Variable abprüfen. Nichts was von Außern irgendwie gesteuert werden muss.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 18, 2005 23:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Feb 02, 2005 14:22
Beiträge: 81
Mhhh...so ganz hilft mir das noch nicht weiter.
@Lossy eX:
Kannst du das deinen Hinweis mit 'RenderMode' mal genauer beschreiben?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 19, 2005 08:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du kannst mithilfe von glGetIntegerv(GL_RENDER_MODE, @RenderMode); abfragen in welchem Rendermode sich OpenGL befindet. Es gibt 3 Rendermodes. GL_RENDER, GL_SELEKTION, GL_FEEDBACK.

Und bei allem was nur beim echten Rendern gezeichnet oder ausgeführt werden soll prüfst du vorher ab ob in der Variable RenderMode ein GL_RENDER enthalten ist.

Code:
  1. var
  2.   RenderMode: Cardinal;
  3. begin
  4.   glGetIntegerv(GL_RENDER_MODE, @RenderMode);
  5.  
  6.   // Zeichnen
  7.  
  8.   if (RenderMode = GL_RENDER)
  9.     then SwapBuffers (FDC);
  10. end;


Swapbuffers ist ja etwas was nur beim Zeichnen aufgerufen werden sollte. Also kann man das so ausklammern. Mit genau der gleichen abfrage kannst du auch dein komplettes 2D weglassen. Und der Vorteil dabei ist, dass niemand von Außen sagen muss, dass du im SelektionMode bist. Das ist ja eine Info die man einfachst abfragen kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 19, 2005 11:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Feb 02, 2005 14:22
Beiträge: 81
Danke :!:
Das hat mir geholfen 8)
Code:
  1. If Not (RenderMode = GL_SELECT) Then ShowText;

Diese Zeile vor...
Code:
  1. If (RenderMode = GL_RENDER) Then SwapBuffers(DC);

...macht was ich wollte!

Danke nochmal!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 19, 2005 13:47 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Noch ein kleiner Delphispezifischer Hinweis:

Code:
  1.  
  2. if Booleanvar = true then doSomething;
  3. //entspricht
  4. if Booleanvar then doSomething;
  5.  
  6.  
  7. //genauso das hier
  8.  
  9. if Booelanvar = false then doSomething;
  10. //entspricht
  11. if not Booleanvar then doSomething;
  12.  


Is nicht nur kürzer sondern, jeh nach Variablenbenennung, ließt sich auch leichter.
Nur so mal ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]