- unit wow;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, dglOpenGL, StdCtrls, SDL, SDL_Image;
- type
- TForm1 = class(TForm)
- procedure FormKeyPress(Sender: TObject; var Key: Char);
- procedure FormDestroy(Sender: TObject);
- procedure FormResize(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure IdleHandler(Sender: TObject; var Done: Boolean);
- private
- StartTime, TimeCount, FrameCount : Cardinal; //FrameCounter
- Frames, DrawTime : Cardinal; //& Timebased Movement
- procedure SetupGL;
- procedure Render;
- procedure ErrorHandler;
- procedure drawquads;
- procedure LoadTextur;
- public
- DC : HDC; //Handle auf Zeichenfläche
- RC : HGLRC;//Rendering Context
- end;
- var
- Form1: TForm1;
- sonrot,sonrot2,weite,a, winkel: Double;
- tex : PSDL_Surface;
- const
- NearClipping = 1;
- FarClipping = 1000;
- implementation
- {$R *.dfm}
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- //Initialisierung von OpenGL
- DC:= GetDC(Handle);
- if not InitOpenGL then Application.Terminate;
- RC:= CreateRenderingContext( DC,
- [opDoubleBuffered],
- 32,
- 24,
- 0,
- 0,
- 0,
- 0);
- ActivateRenderingContext(DC, RC);
- SetupGL;
- LoadTextur;
- Application.OnIdle := IdleHandler;
- 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(damit schneller)
- 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;
- IdleHandler(Sender, tmpBool);
- end;
- procedure TForm1.FormDestroy(Sender: TObject);
- begin
- DeactivateRenderingContext;
- DestroyRenderingContext(RC);
- ReleaseDC(Handle, DC);
- end;
- procedure TForm1.LoadTextur;
- var TexID: gluInt;
- begin
- tex := IMG_Load('./kachel1.jpg');
- if assigned(tex) then
- begin
- glGenTextures(1, @TexID);
- glBindTexture(GL_TEXTURE_2D, TexID);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- // Achtung! Einige Bildformate erwarten statt GL_RGB, GL_BGR. Diese Konstante fehlt in den Standard-Headern
- glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
- SDL_FreeSurface(tex);
- end;
- end;
- procedure TForm1.Render;
- begin
- glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farbpuffer und Tiefenpuffer gelöscht
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity;
- gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity;
- glTranslatef(0,-0.3,-10);
- sonrot:= sonrot + (0.01*Drawtime);
- If (sonrot > 360) then sonrot := sonrot - 360;
- sonrot2:= sonrot2 - (0.1*Drawtime);
- If (sonrot2 > 360) then sonrot2 := sonrot - 360;
- //Rotatef(a,0,1,0);
- glTranslatef(0,0,weite);
- glTranslatef(winkel,0,0);
- glDisable(GL_CULL_FACE);
- glrotatef(10,1,0,0);
- glrotatef(sonrot,0,1,0);
- glColor3ub(255,255,0);
- drawquads;
- SwapBuffers(DC);
- end;
- procedure TForm1.drawquads;
- begin
- glEnable(GL_TEXTURE_2D);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0); glVertex3f(-1,-1, 1);
- glTexCoord2f(0,1); glVertex3f( -1,1, 1);
- glTexCoord2f(1,1); glVertex3f( 1,1, 1);
- glTexCoord2f(1,0); glVertex3f( 1,-1, 1);
- glTexCoord2f(0,0); glVertex3f(-1,-1,1);
- glTexCoord2f(0,1); glVertex3f(-1,1,1);
- glTexCoord2f(1,1); glVertex3f(-1,1, -1);
- glTexCoord2f(1,0); glVertex3f(-1,-1,-1);
- glTexCoord2f(0,0); glVertex3f(1,1,1);
- glTexCoord2f(0,1); glVertex3f(1,-1,1);
- glTexCoord2f(1,1); glVertex3f(1,-1,-1);
- glTexCoord2f(1,0); glVertex3f(1,1,-1);
- glVertex3f(-1,1,-1);
- glVertex3f( 1, 1,-1);
- glVertex3f( 1,-1,-1);
- glVertex3f( -1,-1,-1);
- // glVertex3f(-1,-1, 0);
- // glVertex3f(-1, 1, 0);
- // glVertex3f( -1,-1,0);
- // glVertex3f(-1,1, 0);
- //
- // glVertex3f(1,-1, 0);
- // glVertex3f(1, 1, 0);
- // glVertex3f(1,-1,0);
- // glVertex3f(1,1, 0);
- glEnd();
- end;
- procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
- begin
- StartTime:= GetTickCount;
- Render;
- DrawTime:= GetTickCount - StartTime;
- Inc(TimeCount, DrawTime);
- Inc(FrameCount);
- if TimeCount >= 1000 then begin
- Frames:= FrameCount;
- TimeCount:= TimeCount - 1000;
- FrameCount:= 0;
- Caption:= InttoStr(Frames) + 'FPS';
- ErrorHandler;
- end;
- Done:= false;
- end;
- procedure TForm1.ErrorHandler;
- begin
- Form1.Caption := gluErrorString(glGetError);
- end;
- procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
- begin
- if Key = 'a' then
- winkel := winkel+1;
- if Key = 'd' then
- winkel := winkel-1;
- if Key = 'w' then
- weite := weite+1;
- if Key = 's' then
- weite := weite-1;
- if Key = 'q' then
- a:= a-1;
- if Key = 'e'then
- a:= a+1;end;
- end.