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

Aktuelle Zeit: Mo Jul 14, 2025 18:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: SDL-Opengl-Selection
BeitragVerfasst: So Apr 06, 2008 10:51 
Offline
DGL Member

Registriert: Fr Apr 04, 2008 14:55
Beiträge: 3
Hey

Ich schon wieder!!^^ Ich wollte fragen, wiso diese selection nicht funktioniert?!


Zu erst soll geguckt werden, ob ein button von der mouse geklickt worden ist?!
Code:
  1.  
  2. procedure EventsHandle;
  3. var
  4.   event : TSDL_EVENT;
  5. begin
  6.   while SDL_Pollevent(@event) = 1 do
  7.     begin
  8.       case event.type_ of
  9.         SDL_QuitEV :
  10.           begin
  11.             done := -1;
  12.           end;
  13.         SDL_Keydown :
  14.           begin
  15.             Handlekeypress(@event.key.keysym);
  16.           end;
  17.         SDL_Videoresize :
  18.           begin
  19.             //.....
  20.           end;
  21.         SDL_MOUSEBUTTONDOWN :
  22.           begin
  23.             MOuse(event);
  24.           end;
  25.       end;//case
  26.     end;//while
  27. end;
  28.  
  29.  


Dann soll darauf reagiert werden:

Code:
  1. procedure Mouse(mouse : Tsdl_Event);
  2. begin
  3.   case inginterface of
  4.     0:
  5.       begin
  6.         case selection(mouse.motion.y,mouse.motion.x) of
  7.           -1:
  8.             begin
  9.               writeln('Du hast auf Nichts geklickt!!(1)');
  10.             end;
  11.           0:
  12.             begin
  13.               writeln('Du hast auf Nichts geklickt!!(2)');
  14.             end;
  15.           1:
  16.             begin
  17.               writeln('Du hast auf Quit geklickt!!');
  18.               Quit_APP;
  19.             end;
  20.         end;
  21.       end;//0
  22.   end;//case
  23.  
  24.   window_resize;
  25. end;
  26.  


Und die Selection sieht dann wie folgt aus:
Code:
  1. function Selection(ys,xs:integer) : integer;
  2. var
  3.   Puffer       : array[0..512] of GLUInt;
  4.   Viewport     : TGLVectori4;
  5.   Treffer,i    : Integer;
  6.   Z_Wert       : GLUInt;
  7.   Getroffen    : GLUInt;
  8. begin
  9.   glGetIntegerv(GL_VIEWPORT, @viewport);      
  10.   glSelectBuffer(512, @Puffer);              
  11.  
  12.   glMatrixMode(GL_PROJECTION);                
  13.   glRenderMode(GL_SELECT);                  
  14.   glPushMatrix;                              
  15.   glLoadIdentity;                            
  16.  
  17.   gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);
  18.   gluPerspective(45.0, Viewport[2]/Viewport[3], 0.1, 1000);
  19.  
  20.   render(ingInterface);                                    
  21.   glMatrixMode(GL_PROJECTION);              
  22.   glPopMatrix;                                
  23.  
  24.   treffer := glRenderMode(GL_RENDER);        
  25.  
  26.   Getroffen := High(GLUInt);                  
  27.   Z_Wert := High(GLUInt);                    
  28.   for i := 0 to Treffer-1 do
  29.     if Puffer[(i*4)+1] < Z_Wert then
  30.     begin
  31.       getroffen       := Puffer[(i*4)+3];
  32.       Z_Wert := Puffer[(i*4)+1];
  33.     end;
  34.  
  35.   if getroffen=High(GLUInt)
  36.     then Result := -1
  37.     else Result := getroffen;
  38. end;
  39.  


Und so sieht momentan noch die Render funktion aus:
Code:
  1. procedure Render(GI:integer = 0; value : integer = 0);
  2. begin
  3.   case GI of
  4.     0 :
  5.       begin// GI = 0
  6.         glclear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  7.  
  8.         glloadidentity();
  9.  
  10.         glinitnames();
  11.         glpushname(0);
  12.  
  13.         gltranslatef(0,0,-10);
  14.  
  15.         glloadname(1);
  16.         glbegin(gl_quads);
  17.           glvertex3f(-1,-0.5,0);
  18.           glvertex3f(1,-0.5,0);
  19.           glvertex3f(1,0.5,0);
  20.           glvertex3f(-1,0.5,0);
  21.         glend;
  22.       end;// GI = 0
  23.     1 :
  24.       begin//GI=1
  25.       end;//GI=1
  26.     2 :
  27.       begin//GI=2
  28.       end;//GI=2
  29.   end;//case GI
  30. end;


Ziel ist es ein kleines Game Interface aber momentan funktioniert die Selection noch nciht ich bekomme immer als antwort:
Du hast auf Nichts geklickt!!(1)

Könnt ihr mir einen anstoß geben, wodran das liegen könnte?!

Danke im Vorraus

MfG banane


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 06, 2008 11:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Du setzt in Render die für die Selektion eingestellte Pickingmatrix ja via glLoadIdentit wieder zurück, bzw. du bist da im falschen Matrixmodus.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 06, 2008 23:19 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
außerdem würde ich da die Berechnung eher von Hand machen. Also entweder einfacher AABB check oder noch eine bitmaske dazu. Zu den Nachteilen der OpenGL Selection gibt es hier einige threads.

_________________
Bild


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 5 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.008s | 15 Queries | GZIP : On ]