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

Aktuelle Zeit: Fr Jul 04, 2025 08:43

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Okt 26, 2011 16:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
Hello,

Ich arbeite momentan an meinem neuen Editor. Leider will die Selektion nicht funktionieren. Zwar bewirkt ein Klick auf etwas Unbenanntes oder ins "Nichts" die Rückgabe -1, jedoch heißen alle benannten Objekte angeblich 0. Ich erhalte nie den Namen, sondern immer -1 oder 0 zurück... auch wenn ich beispielsweise alles 8 nenne. Hab jetzt ausführlich hin und her ge-debug'd, vill springt ja einem erfahrenerem etwas ins Auge... hier einfach mal der Quelltext.

Code:
  1. function TEditor.Pick: Integer;
  2. var SelectBuffer: array[0..512] of TGLUInt;
  3.     Viewport: TGLArrayi4;
  4.     HitCount,i: Integer;
  5.     HitZ,HitName: TGLUInt;
  6. begin
  7. glGetIntegerv(GL_VIEWPORT,@Viewport);
  8. glSelectBuffer(512,@SelectBuffer);
  9.  
  10. glRenderMode(GL_SELECT);
  11. glInitNames;
  12. glPushName(0);
  13.  
  14. glMatrixMode(GL_PROJECTION);
  15. glPushMatrix;
  16. glLoadIdentity;
  17. gluPickMatrix(mX, Viewport[3]-mY, 5.0, 5.0, Viewport);
  18. gluPerspective(45,CWIDTH/CHEIGHT,1,2048);
  19.  
  20. oCamera.Move;
  21. oEditor.Render;
  22.  
  23. glMatrixMode(GL_PROJECTION);
  24. glPopMatrix;
  25.  
  26. HitCount:=glRenderMode(GL_RENDER);
  27. HitName:=High(TGLUInt);
  28. HitZ:=High(TGLUInt);
  29. for i:=0 to HitCount-1 do
  30.  if SelectBuffer[(i*4)+1]<HitZ then
  31.   begin
  32.   HitName:=SelectBuffer[(i*4)+3];
  33.   HitZ:=SelectBuffer[(i*4)+1];
  34.   end;
  35.  
  36. Result:=HitName;
  37. end;


Und hier nochmal Camera.Move sowie Editor.Render

Code:
  1. procedure TCamera.Move;
  2. begin
  3. glMatrixMode(GL_MODELVIEW);
  4. glLoadIdentity;
  5.  
  6. glTranslate1Vec(Position);
  7. end;


Code:
  1. procedure TEditor.Render;
  2. var i,k,h: Integer;
  3. begin
  4. if not EnableRendering then exit;
  5.  
  6. //Texturen und Tiefentest aus
  7. glDisable(GL_TEXTURE_2D);
  8. glDisable(GL_DEPTH_TEST);
  9.  
  10. //ursprung zeichnen
  11. PaintOrigin;
  12.  
  13. //alle vertices zeichnen
  14. glBegin(GL_Points);
  15. for i:=0 to All.Count-1 do
  16.   if TEntity(All[i]).ClassType=TTerrain then
  17.     for k:=0 to length(TTerrain(all[i]).Surfaces)-1 do
  18.       for h:=0 to length(TTerrain(all[i]).Surfaces[k].Vertices)-1 do
  19.         begin
  20.         glLoadName(h+1); //Um Nullen auszuschließen :p Es macht keinen unterschied welchen Namen ich verteile
  21.         glColor3f(1,0,0);
  22.         glVertex1Vec(TTerrain(all[i]).Surfaces[k].Vertices[h].Position);
  23.         end;
  24. glEnd;
  25.  
  26. //Texturen wieder anschalten
  27. glEnable(GL_TEXTURE_2D);
  28. glEnable(GL_DEPTH_TEST);
  29. end;


So.. der Code ist btw noch sehr frisch und unbearbeitet und mich würd auch interessieren ob man das mitm Classtype so machen kann (TEntity besitzt im gegensatz zu TTerrain, das eine Ableitung von TEntity ist, keine Surfaces, darum der Heckmeck). Krikit jeder Art ist auch willkommen^^

edit: camera.move is natürlich höchst provisorisch gecodet und soll momentan nur alles bischn zurechtrücken können. :p

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Okt 27, 2011 13:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
niemand ne idee? bin n bischn drauf hängen geblieben und kann bei bestem willen auch keinen unterschied zu meiner alten funktionierenden selektion ausmachen...

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Okt 27, 2011 17:04 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
ich hatte auch mal diese art der selektion verwendet sie aber nie so richtig verstanden und sie war auch wirklich mies und langsam auf den meisten pc's wo ich es probiert habe.

deswegen habe ich auf colorpicking umgestellt, was ich a) irgendwann sogar verstanden hatte und b) viel performanter ist.

trotzdem hänge ich dir mal den code von mir reinm kann dir aber nicht wirklich sagen wie der funktioniert hat und wie gesagt: tu dir selbst einen gefallen und wechsel auf colorpicking.

das ist jetzt die selection die ich damals verwendet hatte:

Code:
  1. function TForm1.Selection : 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.   start,dauer:cardinal;
  9. begin
  10.   start:=gettickcount();
  11.   glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  12.   glSelectBuffer(512, @Puffer);                //Den Puffer zuordnen
  13.  
  14.   glMatrixMode(GL_PROJECTION);                //In den Projektionsmodus
  15.   glRenderMode(GL_SELECT);                    //In den Selectionsmodus schalten
  16.   glPushMatrix;                               //Um unsere Matrix zu sichern
  17.  
  18.   amselektieren:=true;
  19.   glLoadIdentity;                             //Und dieselbige wieder zurückzusetzen
  20.   gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);
  21.  
  22.   if perspektivisch then begin
  23.   gluPerspective(45.0, Panel2.Width/Panel2.Height, NearClipping, FarClipping);
  24.   end else begin
  25.   orthologisch(nil);
  26.   end;
  27.   render;                                     //Die Szene zeichnen
  28.  
  29.   glMatrixMode(GL_PROJECTION);                //Wieder in den Projektionsmodus
  30.   glPopMatrix;                                //und unsere alte Matrix wiederherzustellen
  31.  
  32.   treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  33.  
  34.   Getroffen := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  35.   Z_Wert := High(GLUInt);                     //Höchsten Z - Wert
  36.   for i := 0 to Treffer-1 do
  37.     if Puffer[(i*4)+1] < Z_Wert then
  38.     begin
  39.       getroffen := Puffer[(i*4)+3];
  40.       Z_Wert    := Puffer[(i*4)+1];
  41.     end;
  42.   result := getroffen;
  43.   dauer:= gettickcount()-start;
  44.   panel13.Caption:='Selektion hat: '+floattostr(dauer/1000)+' Sekunden gedauert und result war: '+inttostr(result);
  45.  
  46. end;


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 28, 2011 06:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
mhm colorpicking hab ich mir auch schon angeschaut aber nicht alles verstanden, wogegen ich dachte den selectionsmodus verstanden zu haben. auf performance kommt es in meinem editor nicht an, da dieser nur auf einigen ausgewählten (leistungsstarken) rechnern laufen soll.. aber vill wechsel ich ganz zukunftsorientiert doch, auch wenn es mich ärgert zu wechseln nur weil ich die simple ogl selektion nicht hinbekomme -_- edit: zusaäztlich lief die ja auch schonmal (in einem anderen projekt), vermutlich hat sich n über dummer fehler eingeschlichen der alles ruiniert

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 28, 2011 20:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 03, 2008 12:01
Beiträge: 167
Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
Gerade wenn du auf leistungsstarken Rechnern arbeitest, solltest du Color Picking verwenden. Der Selektionsmodus ist offiziell als "deprecated" markiert worden. Wenn du ihn verwendest, können manche heutigen Treiber auf Software Rendering umschalten, was der Performance-Overkill wäre.

_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Okt 29, 2011 11:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
hm also wie gesagt, es kommt wirklich nicht drauf an; mein letzter editor zeichnete alles im imidiate mode und hatte ne ogl selektion und alles lief flüssig. was vielmehr ggn die ogl selektion spricht ist, das niemand drauf eingeht und "alle" colorpicking rufen.^^
ihr wollt color picking? ihr kricht color picking! :)

edit: das spiel an sich, welches ich natürlich möglichst performant haben möchte, kommt ohne selektion aus.

edit: das ding is ich bin anfänger und freu mich über alles was ich ganz verstanden habe, auch wenns ne tote technik ist; jetzt colorpicking zu lernen is zwar auch schön aber vorallem lähmt es meinen eh schon hinkenden fortschritt und ich will endlich weiterkommen :p

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


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


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.008s | 16 Queries | GZIP : On ]