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

Aktuelle Zeit: So Jul 20, 2025 09:41

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



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Selection
BeitragVerfasst: Fr Okt 08, 2004 11:31 
Offline
DGL Member

Registriert: Do Apr 22, 2004 10:04
Beiträge: 16
Wohnort: Berlin
Selection:
Code:
  1.  
  2.      glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  3.      glSelectBuffer(512, @SelectBuffer);
  4.      glRenderMode(GL_SELECT);
  5.      glmatrixmode(gl_projection);
  6.      glPushMatrix;
  7.      glLoadIdentity;
  8.  
  9.      gluPickMatrix(MousePos.x, viewport[3]-MousePos.y, 1.0, 1.0, Viewport);
  10.      gluPerspective(45.0, GLForm.ClientWidth/GLForm.ClientHeight, 0.1, 2048);
  11.  
  12.      glEditorDraw;
  13.  
  14.      glmatrixmode(gl_projection);                
  15.      glPopMatrix;  
  16.  
  17.      Hits := glRenderMode(GL_RENDER);
  18.  

Rendern:
Code:
  1.  
  2. PROCEDURE glEditorDraw;
  3. var
  4.   i,j:Integer;
  5.   h:TPoint3D;
  6. BEGIN
  7.   glmatrixmode(gl_modelview);//Hab ich noch hinzugefügt
  8.   FOR i:=0 TO High(EditorMap) DO
  9.     BEGIN
  10.       h.x:= EditorMap[i].xpos;
  11.       h.Y:= EditorMap[i].ypos;
  12.       glLoadIdentity;
  13.       glTranslatef(h.X+TransX,h.Y+TransY,TransZ);
  14.       IF i=SelectedItem THEN
  15.         glColor3f(1,0,0)
  16.       ELSE
  17.         glColor3f(1,1,1);
  18.       glloadname(i);
  19.       FOR j:=0 TO downright DO
  20.         BEGIN
  21.           h:=EditorMap[i].tiles[j].pos;
  22.           glBegin(GL_QUADS);
  23.             glTexCoord2f(1,1);glVertex3f(h.x-0.4,h.y-0.4,h.z);
  24.             glTexCoord2f(1,0);glVertex3f(h.x-0.4,h.y+0.4,h.z);
  25.             glTexCoord2f(0,0);glVertex3f(h.x+0.4,h.y+0.4,h.z);
  26.             glTexCoord2f(0,1);glVertex3f(h.x+0.4,h.y-0.4,h.z);
  27.           glEnd();
  28.         END;
  29.     END;
  30. END;
  31.  


Hab schon im forum gesucht aber irgendwie hat nichts geholfen...
was mach ich falsch?

Selekion ist aus dem Forum


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 08, 2004 11:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Du initialisierst nirgendwo den Namestack, deshalb wirds wohl nicht funzen. (Siehe Tutorial auf meiner HP)

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 08, 2004 11:46 
Offline
DGL Member

Registriert: Do Apr 22, 2004 10:04
Beiträge: 16
Wohnort: Berlin
Code:
  1.  
  2. PROCEDURE glEditorDraw;
  3. var
  4.   i,j:Integer;
  5.   h:TPoint3D;
  6. BEGIN
  7.   glmatrixmode(gl_modelview);
  8.   FOR i:=0 TO High(EditorMap) DO
  9.     BEGIN
  10.       h.x:= EditorMap[i].xpos;
  11.       h.Y:= EditorMap[i].ypos;
  12.       glLoadIdentity;
  13.       glTranslatef(h.X+TransX,h.Y+TransY,TransZ);
  14.       IF i=SelectedItem THEN
  15.         glColor3f(1,0,0)
  16.       ELSE
  17.         glColor3f(1,1,1);
  18.       glloadname(i);
  19.       FOR j:=0 TO downright DO
  20.         BEGIN
  21.           h:=EditorMap[i].tiles[j].pos;
  22.           glBegin(GL_QUADS);
  23.             glTexCoord2f(1,1);glVertex3f(h.x-0.4,h.y-0.4,h.z);
  24.             glTexCoord2f(1,0);glVertex3f(h.x-0.4,h.y+0.4,h.z);
  25.             glTexCoord2f(0,0);glVertex3f(h.x+0.4,h.y+0.4,h.z);
  26.             glTexCoord2f(0,1);glVertex3f(h.x+0.4,h.y-0.4,h.z);
  27.           glEnd();
  28.         END;
  29.     END;
  30. END;
  31.  
  32. function GetSelectBufferHit : Integer;
  33. var
  34.   SelectBuffer : array[0..512] of TGLUInt;
  35.   Viewport     : TVector4i;
  36.   Hits,i       : Integer;
  37.   HitZValue    : TGLUInt;
  38.   Hit          : TGLUInt;
  39. begin
  40.   glGetIntegerv(GL_VIEWPORT, @viewport);
  41.   glSelectBuffer(512, @SelectBuffer);
  42.   glRenderMode(GL_SELECT);
  43.   glInitNames;
  44.   glPushName(0);
  45.   glMatrixMode(GL_PROJECTION);
  46.   glLoadIdentity;
  47.   gluPickMatrix(MousePos.x, viewport[3]-MousePos.y, 1.0, 1.0, Viewport);
  48.   gluPerspective(45.0, GLForm.ClientWidth/GLForm.ClientHeight, 0.1, 2048);
  49.   glEditorDraw;
  50.   Hits      := glRenderMode(GL_RENDER);
  51.   Hit       := High(TGLUInt);
  52.   HitZValue := High(TGLUInt);
  53.   for i := 0 to Hits-1 do
  54.     if SelectBuffer[(i*4)+1] < HitZValue then
  55.       begin
  56.         Hit       := SelectBuffer[(i*4)+3];
  57.         HitZValue := SelectBuffer[(i*4)+1];
  58.       end;
  59.   result:=Hit
  60. end;
  61.  


so siehts im moment aus, klappt aber nicht

kann es sein das beim rendern der neun flächen nur eine fläche die id bekommt, alos den namen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 08, 2004 11:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ja, ist doch logisch. OpenGL ist eine Statemaschine, und der gesetzte Name wird solange zugewiesen bis du irgendwann nen anderen Namen setzt. Dachte du willst nur einen Namen für die ganzen Quads. Wenn nicht, dann musst du den logischerweise vor jedem Quad setzen,

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 10, 2004 21:10 
Offline
DGL Member

Registriert: Do Apr 22, 2004 10:04
Beiträge: 16
Wohnort: Berlin
So, nu klappt die Selektion mit o.g. Funktionen, nur ist die Auswahl verschoben,
d.h. ich klicke links neben ein Quad (es ist absicht, dass mehrere Quads den selben Nmen haben)
aber ich wähle es trotzdem, wenn ich in die rechte hälfte des quads klicke treffe ich es nicht!!!

onCreate:
Code:
  1.  
  2.   InitOpenGL;
  3.   DC := GetDC(Handle);
  4.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  5.   ActivateRenderingContext(DC, RC);
  6.   glEnable(GL_DEPTH_TEST);
  7.   glDepthFunc(GL_LESS);
  8.   glShadeModel(GL_SMOOTH);
  9.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  10.   glEnable(GL_TEXTURE_2D);
  11.  


Draw:
Code:
  1.  
  2.   h.X:=GLForm.ClientWidth;
  3.   h.Y:=GLForm.ClientHeight;
  4.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.   glViewPort(0, 0, h.X, h.Y);
  6.   glMatrixMode(GL_PROJECTION);
  7.   glLoadIdentity;
  8.   gluPerspective(45, h.X/h.Y, 0.1, 1024);
  9.   glMatrixMode(GL_MODELVIEW);
  10.   glLoadIdentity;
  11.   glEditorDraw;
  12.   SwapBuffers(GLForm.DC);
  13.  

so sieht meine opengl Initialisierung aus und die Draw-Routine, ich seh leider nicht woran es liegt...

bei der Selektieren rufe ich die Draw Routine nicht direkt auf sondern nur die o.g. EditorDraw routine


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 10, 2004 21:15 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das Problem tritt nicht nur bei dir auf (such mal im Forum). Bin aber nicht sicher, ob bisher schonmal eine lösung für das Problem gefunden wurde. :(

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 10, 2004 21:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Mögliche Fehlerquellen sind:
* du verwendest für die Selektion andere ViewMatrix/glPerpective/glOrtho Einstellungen als fürs Rendern
* deine Mauskoordinaten sind nicht relativ zur Clientarea des OpenGL Fensters (OpenGL kennt keinen Menübalken oder Fensterrahmen - das sind Windows Spezifika)

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 12, 2004 11:38 
Offline
DGL Member

Registriert: Do Apr 22, 2004 10:04
Beiträge: 16
Wohnort: Berlin
Habs jetzt so hin bekommen, das die entsprchenden Objekte jetzt "genau" getroffen werden
und zwar durch rumprobieren(ich weiß probieren ist kein programmieren, aber der quellcode war sauber!!!)

Bei der selektion hab ich die x-koordinate um 8 einheiten nach links verschoben werden, also

MousePos.X-8

und die y-koordinate um 33 einheiten nach unten, also

MousePos.Y+33

und siehe da, es passt.

Aber wie gesagt, ich weiß nicht wieso dies Verschiebung entsteht, ich benutze die blanke Form ohne
irgendwelche Statusleisten oder Scrollbalken, somit also clientheight und clientwidth.

Ich dachte diese hätten die Ausmaße des Fensters ohne Titelzeile und Ränder.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 12, 2004 13:12 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn du XP hast, änder mal den Windowsstyle von XP nach klassisch bzw umgekehrt und probier nochmal obs stimmt.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 12, 2004 18:50 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Besser ist, es diese Informationen abzufragen. Die Funktion GetSystemMetrics, eine Windows - API Funktion, liefert einem die richtigen Werte.

Interessante Parameter sind:

SM_CXBORDER
SM_CYBORDER
SM_CXMENUSIZE
SM_CYMENUSIZE

und einige andere.

Gruß
KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 12, 2004 19:15 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Oder leg ein Panel in die Form und zeichne darauf OpenGL. Bei dem Panel kannst du dann den Rahmen ausstellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 12, 2004 19:36 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Außerdem kannst du dann neben dem OpenGL Fenster noch andere Controls (z.B. Buttons) in deinem Formular darstellen.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 12, 2004 19:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hm, ich frage mich ernsthaft warum du Probleme mit der Selektion und der VCL hast. Ich hab das schon oft genutzt, und dabei auch verschiedene XP-Themes probiert, alle mit unterschiedlich großen Titelleisten und hatte nie Probleme. Wenn man den Viewport in ner VCL-Anwendung über 0..ClientWidth/0..ClientHeight erstellt, dann bekommt man IMMER den ganzenz Platz zwischen Rand unt Titelleiste. Also tippe ich darauf dass dein Problem woanders herkommt.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 13, 2004 09:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
for the y coordinate have a look at CaptionBarHeight.

Also you might want to look at:
the difference between width and clientwidth
the difference between height and clientheight

_________________
http://3das.noeska.com - create adventure games without programming


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 13, 2004 10:23 
Offline
DGL Member

Registriert: Do Apr 22, 2004 10:04
Beiträge: 16
Wohnort: Berlin
Also ich habs mit dem Panel probiert da war die y Ungenauigkeit nur kleiner,
dann hab ich mal die Form ohne sichtbaren Rand erstellt, also bsnone,
da war die Ungenauigkeit genauso wie beim Panel.


Ich benutze bei der Form ja schon clientheight und clientwidth, was meiner meinung nach die höhe bzw. breite der "benutzbaren" Fläche angibt.

Allerdings ist mir aufgefallen, dass ich den Courser auf eine negative Position am linken Rand bringen kann, wie sowas sein kann versteh ich erstrecht nicht.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 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.014s | 16 Queries | GZIP : On ]