- unit OpenGLQ;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs,dglOpenGL,glbitmap, ImgList, ExtCtrls, StdCtrls, ComCtrls;
- CONST NearClipping = 1;
- FarClipping = 1000;
- type
- TOpenGLF = class(TForm)
- MMQ_ImageList2: TImageList;
- Panel1: TPanel;
- Panel2: TPanel;
- TrackBar1: TTrackBar;
- TrackBar2: TTrackBar;
- TrackBar3: TTrackBar;
- TrackBar4: TTrackBar;
- procedure FormCreate(Sender: TObject);
- procedure FormResize(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure TrackBar1Change(Sender: TObject);
- procedure TrackBar2Change(Sender: TObject);
- procedure TrackBar3Change(Sender: TObject);
- procedure TrackBar4Change(Sender: TObject);
- procedure FormShow(Sender: TObject);
- private { Private-Deklarationen }
- FMyIma : TglBitmap2D;
- StartTime, TimeCount, FrameCount : Cardinal; //FrameCounter
- Frames, DrawTime : Cardinal; //& Timebased Movement
- procedure SetupGL;
- procedure Render;
- public { Public-Deklarationen }
- DC : HDC; //Handle auf Zeichenfläche
- RC : HGLRC;//Rendering Context
- end;
- var
- OpenGLF: TOpenGLF;
- MyBitMap : TBitMap;
- winkel:real=45;
- tiefe:real=-6;
- rota:real=0;
- scale:real=1;
- implementation
- {$R *.dfm}
- procedure TOpenGLF.SetupGL;
- begin
- glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe 0.4.05.07
- glEnable(GL_DEPTH_TEST); //Tiefentest aktivieren
- glEnable(GL_CULL_FACE); //Backface Culling aktivieren
- end;
- PROCEDURE TOpenGLF.FormCreate(Sender: TObject);
- BEGIN
- DC:= GetDC(Panel2.Handle);
- if not InitOpenGL then Application.Terminate;
- RC:= CreateRenderingContext( DC,
- [opDoubleBuffered],
- 32,
- 24,
- 0,0,0,
- 0);
- ActivateRenderingContext(DC, RC);
- SetupGL;
- END;
- PROCEDURE TOpenGLF.FormShow(Sender: TObject);
- BEGIN
- FMyIma := TglBitmap2D.Create;
- FMyIma.LoadFromFile('c:\test.bmp'); // Datei laden
- FMyIma.GenTexture(False);
- END;
- PROCEDURE TOpenGLF.FormResize(Sender: TObject);
- BEGIN
- glViewport(0, 0, Panel2.Width, panel2.Height);
- END;
- PROCEDURE TOpenGLF.FormDestroy(Sender: TObject);
- BEGIN
- FMyIma.Free;
- DeactivateRenderingContext;
- DestroyRenderingContext(RC);
- ReleaseDC(Handle, DC);
- END;
- PROCEDURE TOpenGLF.Render;
- BEGIN
- glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity;
- gluPerspective(winkel, Panel2.Width/panel2.height, NearClipping, FarClipping);
- glTranslatef(0, 0, 0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity;
- // Sonne zeichnen
- glScalef(Scale,scale,1);
- FMyIma.Bind;
- glTranslatef(0, 0,tiefe);
- glColor3f(1,1,0);
- glRotatef(rota*10,0,1,0);
- glBegin(GL_QUADS);
- glVertex3f(-1,-1,0);
- glVertex3f(1,-1,0);
- glVertex3f(1,1,0);
- glVertex3f(-1,1,0);
- glEnd;
- glRotatef(-rota*10,0,1,0);
- //Erde zeichnen
- glRotatef(rota,0,0,1);
- glTranslatef(3, 0,0);
- glRotatef(-rota,0,0,1);
- glRotatef(rota,1,1,0);
- glBegin(GL_QUADS);
- glColor3f(0, 0.5, 1);glVertex3f(-0.3, 0.3, 0);
- glColor3f(0, 0, 1);glVertex3f(-0.3, -0.3, 0);
- glColor3f(0, 0.5, 1);glVertex3f(0.3, -0.3, 0);
- glColor3f(0, 1, 1);glVertex3f(0.3, 0.3, 0);
- glColor3f(0, 0.5, 1);glVertex3f(-0.3,0.3,0);
- glColor3f(0, 1, 1);glVertex3f(-0.3,0.3,-0.6);
- glColor3f(0, 0.5, 1);glVertex3f(-0.3,-0.3,-0.6);
- glColor3f(0, 0, 1);glVertex3f(-0.3,-0.3,0);
- glColor3f(0,0.5,1);glVertex3f(0.3, -0.3, 0);
- glColor3f(0,0,1);glVertex3f(0.3, -0.3, -0.6);
- glColor3f(0,0.5,1);glVertex3f(0.3, 0.3, -0.6);
- glColor3f(0,1,1);glVertex3f(0.3, 0.3, 0);
- glColor3f(0,0,1);glVertex3f(0.3, 0.3,-0.6 );
- glColor3f(0,0.5,1);glVertex3f(0.3, -0.3,-0.6);
- glColor3f(0,1,1);glVertex3f(-0.3, -0.3,-0.6);
- glColor3f(0,0.,1);glVertex3f(-0.3, 0.3, -0.6);
- glColor3f(0,1,1);glVertex3f(0.3, 0.3,0 );
- glColor3f(0,0.5,1);glVertex3f(0.3, 0.3,-0.6);
- glColor3f(0,0,1);glVertex3f(-0.3, 0.3,-0.6);
- glColor3f(0,0.5,1);glVertex3f(-0.3, 0.3,00);
- glColor3f(0,0,1);glVertex3f(-0.3, -0.3,0 );
- glColor3f(0,0.5,1);glVertex3f(-0.3, -0.3,-0.6);
- glColor3f(0,0,1);glVertex3f(0.3, -0.3,-0.6);
- glColor3f(0,0.5,1);glVertex3f(0.3,- 0.3,0);
- glend;
- glRotatef(-rota,1,1,0);
- //Mond zeichnen
- glColor3f(1,1,1);
- glRotatef(rota*12,1,0,0);
- glTranslatef(0, 0,1);
- glRotatef(-rota*12,1,0,0);
- glBegin(GL_QUADS);
- glVertex3f(-0.1, 0.1, 0);
- glVertex3f(-0.1, -0.1, 0);
- glVertex3f(0.1, -0.1, 0);
- glVertex3f(0.1, 0.1, 0);
- glend;
- SwapBuffers(DC);
- END;
- // hier noch ein paar TrackBar's wo ich ein wenig umeinanderstellen kann
- // Winkel ändern
- procedure TOpenGLF.TrackBar1Change(Sender: TObject);
- begin
- winkel:=TrackBar1.position;
- OpenGLF.Render
- end;
- // Tiefe ändern (Z)
- procedure TOpenGLF.TrackBar2Change(Sender: TObject);
- begin
- tiefe:=TrackBar2.position;
- OpenGLF.Render
- end;
- // Rotation ändern (Erde um die Sonne und Mond um die Erde)
- procedure TOpenGLF.TrackBar3Change(Sender: TObject);
- begin
- rota:=TrackBar3.position;
- OpenGLF.Render
- end;
- // Scalieren
- procedure TOpenGLF.TrackBar4Change(Sender: TObject);
- begin
- scale:=TrackBar4.position/10;
- if scale=0 then scale:=0.01;
- OpenGLF.Render
- end;
- End.