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

Aktuelle Zeit: Fr Jul 18, 2025 00:13

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Mal wieder: Selection
BeitragVerfasst: Sa Sep 30, 2006 23:02 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Tschuldigung, dass ich euch schon wieder mit meinen kleinen Problemen belästigen muss :cry:

Hab mir vorgenommen mal das Bomberman-Tut durchzuarbeiten. (is übrigens super erkärt, also daran liegts net :D )
War alles recht einfach, bis es an die verdammte Selection ging. (die hab ich noch nie gemocht).

Okay, ich verteile meine NameStacks atribute so:

Code:
  1. type
  2. TFieldType = record
  3.   Texture  : String;
  4.   FType    : Byte;
  5.   FSpecial : Byte;
  6.   NameStack: Byte;
  7.  end;
  8.  
  9. ....
  10.  
  11. procedure TTMap.SetSize(pSize : Integer);
  12. var i,j, Stack: integer;
  13. begin
  14. SetLength(PlayGround, 0);  //auf Null zurücksetzen (löschen)
  15. fSize := pSize; //Länge speichern
  16.  
  17. SetLength(PlayGround, pSize);
  18. for i:=0 to pSize-1 do
  19.  SetLength(PlayGround[i], pSize);
  20.  
  21. //Namestack
  22. Stack:=0;
  23. for i:=0 to pSize-1 do
  24.  for j:=0 to pSize-1 do begin
  25.   PlayGround[i][j].NameStack := Stack;
  26.   Inc(Stack);
  27.  end;
  28. end;


Welche ich dann so in den NameStack lad:
Code:
  1.  
  2. glInitNames;
  3. glPushName(0);
  4. for i:=0 to length(PlayGround)-1 do
  5.  for j:=0 to length(PlayGround[i])-1 do begin
  6.    BRender.TexManager.BindTexture(PlayGround[i][j].Texture);
  7.    glLoadName(PlayGround[i][j].NameStack);                              //hier
  8.     glBegin(GL_QUADS);
  9.      glColor3d(1,0,0);  glTexCoord2f(0,0); glVertex3f(i,0,j);
  10.      glColor3d(0,0,1);  glTexCoord2f(0,1); glVertex3f(i,0,j+1);
  11.      glColor3d(0,1,0);  glTexCoord2f(1,1); glVertex3f(i+1,0,j+1);
  12.      glColor3d(1,0,1);  glTexCoord2f(1,0); glVertex3f(i+1,0,j);
  13.    glEnd;
  14.  end;
  15. end;


Nicht zu vergessen Die RenderProcedure der Selection-Procedure gegenüberzustellen (das Problem mit gluPerspective)

Code:
  1.  
  2. procedure Render;
  3. begin
  4.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.  
  6.   glMatrixMode(GL_PROJECTION);
  7.   glLoadIdentity;
  8.  
  9.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  10.  
  11.   glMatrixMode(GL_MODELVIEW);
  12.   glLoadIdentity;
  13.  
  14.   glPushMatrix;
  15.     glrotatef(Rotation_X,1,0,0);
  16.     glrotatef(Rotation_Y,0,1,0);
  17.     gltranslatef(Pos.X,Pos.Y,Pos.Z);
  18.       Map.Draw;
  19.   glPopMatrix;
  20.   SwapBuffers(DC);
  21. end;
  22.  
  23. //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||//
  24. //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||//
  25. //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||//
  26.  
  27.  
  28. function TBRender.GetSelectBufferHit: TGLUInt;
  29. var
  30.  SelectBuffer : array[0..512] of TGLUInt;
  31.  Viewport     : TVector4i;
  32.  Hits,i       : Integer;
  33.  HitZValue    : TGLUInt;
  34.  Hit          : TGLUInt;
  35. begin
  36. glGetIntegerv(GL_VIEWPORT, @viewport);
  37. glSelectBuffer(512, @SelectBuffer);
  38. glMatrixMode(GL_PROJECTION);
  39. glRenderMode(GL_SELECT);
  40.  
  41. glInitNames;
  42. glPushName(0);
  43.  
  44. glPushMatrix;
  45. glLoadIdentity;
  46. gluPickMatrix(mx, viewport[3]-my, 3.0, 3.0, Viewport);
  47. //gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  48. Render;
  49. glMatrixMode(GL_PROJECTION);
  50. glPopMatrix;
  51.  
  52. Hits      := glRenderMode(GL_RENDER);
  53. Hit       := High(TGLUInt);
  54. HitZValue := High(TGLUInt);
  55.  
  56.  
  57. for i := 0 to Hits-1 do
  58.  if SelectBuffer[(i*4)+1] < HitZValue then
  59.   begin
  60.   Hit       := SelectBuffer[(i*4)+3];
  61.   HitZValue := SelectBuffer[(i*4)+1];
  62.   end;
  63.  
  64.  Result := Hit;
  65. end;
  66.  
  67.  
  68.  
  69.  



Naja, meiner Meinung nach sollte es funktionieren, nur das Problem ist, das ich immer 0 zurückbekomme, sollte ich auf ein Feld klicken.
Sollte ich die Variable Stack in SetSize z.B. auf ein 3 am Anfang setzen, bekomme ich immer 3 zurück, bei 6 ne 6 usw.
Ich verstehs einfach net.

Hab mal nen Screen angehängt, vll hilft der ja


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 30, 2006 23:20 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Meinst du, du bekommst 0 bei der Selectionfunction zurueck oder wenn du damit den Namestack aufrufst?

Es gibt naemlich ein Problem:
Du nutzt ein zweisdeminsionales Array, aber bekommst einen Integer zurueck.
Um also die beiden ArrayIndizes zu bekommen, musst du deinen Resultwert per Div und Mod auseinanderpflücken.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 01, 2006 09:08 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Jop, bekomme 0 bei der Selection

Und ich muss nix mit div und mod auseinandermachen, denn ich hab Pro Feld eine andere Nummer, ungefähr so:

Size := 3
=> 3² verschiedene Namestacknummern


Spalte1: - 0......1.......2

Spalte2: - 3......4.......5

Spalte3: - 6.......7.......8


Ich hab schon eindeutige NameStacks (?), sollte also funktionieren, tuts aber leider net :cry:

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 01, 2006 09:56 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
In der Render Funktion wird für die Projektionsmatrix glLoadIdentity (Zeile 7) aufgerufen. Dadurch wird bei der Selektion die Pick Matrix wieder gelöscht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 01, 2006 10:33 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Naja, nur wenn ich die weglasse, geht überhaupt nichts.... (auch andersrum, wenn ich in der Selections-Function die glLoadIdenty weglass, zeigt er mir wieder was an, nur an Nichtfunktionieren der Selection ändert das nix)

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 01, 2006 10:42 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Zitat:
Spalte1: - 0......1.......2

Spalte2: - 3......4.......5

Spalte3: - 6.......7.......8



Ich weiss schon ^^
Aber wenn du nun 4 hast, dann musst du ja die Indizes deines Array rausbekommen und da musst du mit Div und Mod arbeiten

So meinte ich das

Oder wie willst du von 4 auf den Feldindex kommen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 01, 2006 10:49 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Das glLoadIdentity in der Render Funktion soll nur dann weggelassen werden, wenn die Render Funktion von der Selektion aus aufgerufen wurde.

Code:
  1. var
  2.  rm:Integer;
  3.  
  4. glGetIntegerv(GL_RENDER_MODE,@rm);
  5. if rm=GL_RENDER then glLoadIdentity;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 01, 2006 11:31 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Shaddow hat geschrieben:
Ich weiss schon ^^
Aber wenn du nun 4 hast, dann musst du ja die Indizes deines Array rausbekommen und da musst du mit Div und Mod arbeiten


Öh.. ja, du hast Recht :oops: Hab gedacht du meinst die Namestachverteilung 8)




Zitat:
Das glLoadIdentity in der Render Funktion soll nur dann weggelassen werden, wenn die Render Funktion von der Selektion aus aufgerufen wurde.


Geil, es geht ^^ Cool, danke (musste zwar noch in der Selection-Func gluPerspective auskommentieren, aber es geht jetzt)

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


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


Wer ist online?

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