- function TMainForm.nodePicker(xs, ys: Integer): integer;
- var
- buffer: array[0..256] of GLUInt;
- vport: TVector4i;
- hits, i: Integer;
- z_value: GLUInt;
- best_hit: GLUInt;
- begin
- glGetIntegerv(GL_VIEWPORT, @vport); //Die Sicht speichern
- glSelectBuffer(256, @buffer); //Den Puffer zuordnen
- glRenderMode(GL_SELECT); //In den Selectionsmodus schalten
- glMatrixMode(GL_PROJECTION); //In den Projektionsmodus
- glPushMatrix; //Um unsere Matrix zu sichern
- glLoadIdentity; //Und dieselbige wieder zurückzusetzen
- gluPickMatrix(xs, vport[3]-ys, 2.0, 2.0, vport);
- gluPerspective(45.0, PanelMain.ClientWidth/PanelMain.ClientHeight, NearClipping, FarClipping);
- drawObjects(CBDrawMode.ItemIndex); //Die Szene zeichnen
- glMatrixMode(GL_PROJECTION); //Wieder in den Projektionsmodus
- glPopMatrix; //um unsere alte Matrix wiederherzustellen
- hits := glRenderMode(GL_RENDER); //Anzahl der Treffer auslesen
- best_hit := High(GLUInt); //Höchsten möglichen Wert annehmen
- z_value := High(GLUInt); //Höchsten Z - Wert
- for i := 0 to hits-1 do begin
- if buffer[(i*4)+1] < z_value then begin
- best_hit := buffer[(i*4)+3];
- z_value := buffer[(i*4)+1];
- end;
- end;
- Result := best_hit;
- end;