- unit Morhun;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs,dglopengl,Math, ExtCtrls;
- type
- TForm1 = class(TForm)
- Timer1: TTimer;
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure FormResize(Sender: TObject);
- procedure Timer1Timer(Sender: TObject);
- procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- private { Private-Deklarationen }
- StartTime, TimeCount, FrameCount : Cardinal; //FrameCounter
- Frames, DrawTime : Cardinal; //& Timebased Movement
- procedure SetupGL;
- procedure Render;
- procedure ErrorHandler;
- procedure init;
- public { Public-Deklarationen }
- DC : HDC; //Handle auf Zeichenfläche
- RC : HGLRC;//Rendering Context
- xs, ys : Integer;
- end;
- var
- Form1: TForm1;
- i: Integer;
- const
- NearClipping = 1;
- FarClipping = 1000;
- Huhn = 100;
- NULL = 0;
- function selection: Integer;
- implementation
- {$R *.dfm}
- procedure TForm1.Render;
- begin
- glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity;
- glInitNames;
- glPushName(0);
- //gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity;
- glTranslatef(0, 0, -1);
- glPushMatrix();
- glTranslatef(-1, -0.9, -1);
- glRotatef(-60,1,0,0);
- glLoadName(NULL);
- glBegin(GL_QUADS);
- glColor3f(0, 1, 0);//Farbe
- glVertex3f(0, 0, 0);//unten rechts
- glVertex3f(2, 0, 0);//oben rechts
- glVertex3f(2, 2, 0);//oben links
- glVertex3f(0, 2, 0);//unten links
- glEnd;
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0,-0.7,-1);
- glTranslatef(Sin(i/130),Cos(i/130),0);
- dec(i);
- if (i=-45) then
- i:=45;
- glLoadName(Huhn);
- glBegin(GL_QUADS);
- glColor3f(1,0,0);//Farbe
- glVertex3f(0,0.1,0);
- glVertex3f(0,0,0);
- glVertex3f(0.1,0,0);
- glVertex3f(0.1,0.1,0);
- glVertex3f(0,0.1,0);
- glEnd;
- SwapBuffers(DC);
- end;
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- DC:= GetDC(Handle);
- if not InitOpenGL then Application.Terminate;
- RC:= CreateRenderingContext( DC,
- [opDoubleBuffered],
- 32,
- 24,
- 0,0,0,
- 0);
- ActivateRenderingContext(DC, RC);
- Timer1.Enabled:=True;
- end;
- procedure TForm1.FormDestroy(Sender: TObject);
- begin
- DeactivateRenderingContext;
- DestroyRenderingContext(RC);
- ReleaseDC(Handle, DC);
- end;
- procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- begin
- xs := x;
- ys := y;
- ShowMessage(IntToStr(selection));
- end;
- procedure TForm1.FormResize(Sender: TObject);
- var tmpBool : Boolean;
- begin
- glViewport(0, 0, ClientWidth, ClientHeight);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity;
- gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity;
- end;
- procedure TForm1.SetupGL;
- begin
- glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
- glEnable(GL_DEPTH_TEST); //Tiefentest aktivieren
- //glEnable(GL_CULL_FACE); //Backface Culling aktivieren
- ActivateRenderingContext(DC, RC);
- SetupGL;
- Init; //Was man sonst so initialisieren will.
- end;
- procedure TForm1.Timer1Timer(Sender: TObject);
- begin
- inc(FrameCount);
- Render;
- If FrameCount = 20 then
- begin
- ErrorHandler;
- FrameCount := 0;
- end;
- end;
- procedure TForm1.init;
- begin
- i:=0;
- end;
- procedure TForm1.ErrorHandler;
- begin
- //Form1.Caption := gluErrorString(glGetError);
- end;
- function Selection : integer;
- var
- Puffer : array[0..256] of GLUInt;
- Viewport : TGLVectori4;
- Treffer,i : Integer;
- Z_Wert : GLUInt;
- Getroffen : GLUInt;
- begin
- with Form1 do
- Begin
- glGetIntegerv(GL_VIEWPORT, @viewport); //Die Sicht speichern
- glSelectBuffer(256, @Puffer); //Den Puffer zuordnen
- glMatrixMode(GL_PROJECTION); //In den Projektionsmodus
- glRenderMode(GL_SELECT); //In den Selectionsmodus schalten
- glPushMatrix; //Um unsere Matrix zu sichern
- glLoadIdentity; //Und dieselbige wieder zurückzusetzen
- gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);
- gluPerspective(60.0, Viewport[2]/Viewport[3], 1, 256);
- render; //Die Szene zeichnen
- glMatrixMode(GL_PROJECTION); //Wieder in den Projektionsmodus
- glPopMatrix; //und unsere alte Matrix wiederherzustellen
- treffer := glRenderMode(GL_RENDER); //Anzahl der Treffer auslesen
- Getroffen := High(GLUInt); //Höchsten möglichen Wert annehmen
- Z_Wert := High(GLUInt); //Höchsten Z - Wert
- for i := 0 to Treffer-1 do
- if Puffer[(i*4)+1] < Z_Wert then
- begin
- getroffen := Puffer[(i*4)+3];
- Z_Wert := Puffer[(i*4)+1];
- end;
- if getroffen=High(GLUInt)
- then Result := -1
- else Result := getroffen;
- end;
- end;
- end.