- unit OpenGLTemplateForm;
- interface
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls, ExtCtrls, ComCtrls, DglOpenGL;
- type
- TDGLForm = class(TForm)
- procedure FormKeyPress(Sender: TObject; var Key: Char);
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- TOpenGLRender = class(TThread)
- public
- destructor Destroy; override;
- procedure Init(aHandle: cardinal);
- procedure Draw;
- procedure Stop;
- procedure Execute; override;
- end;
- var
- DGLForm: TDGLForm;
- OpenGLRender: TOpenGLRender;
- DC:HDC;
- RC:HGLRC;
- angle: integer;
- implementation
- {$R *.DFM}
- function getNormal(p1,p2,p3:TGLArrayf3):TGLArrayf3;
- var a,b:TGLArrayf3;
- begin
- a[0]:=p2[0]-p1[0]; a[1]:=p2[1]-p1[1]; a[2]:=p2[2]-p1[2];
- b[0]:=p3[0]-p1[0]; b[1]:=p3[1]-p1[1]; b[2]:=p3[2]-p1[2];
- result[0]:=a[1]*b[2]-a[2]*b[1];
- result[1]:=a[2]*b[0]-a[0]*b[2];
- result[2]:=a[0]*b[1]-a[1]*b[0];
- end;
- //TOpenGLRender
- destructor TOpenGLRender.Destroy;
- begin
- inherited;
- end;
- procedure TOpenGLRender.Execute;
- begin
- while not terminated do
- begin
- Draw;
- sleep(1);
- end;
- end;
- procedure TOpenGLRender.Init(aHandle: cardinal);
- const
- light0_position:TGLArrayf4=( -8.0, 8.0, -16.0, 0.0);
- ambient: TGLArrayf4=( 0.3, 0.3, 0.3, 0.3);
- begin
- InitOpenGL; // Initialize DglOpenGL
- DC := GetDC(aHandle);
- // Create RenderContext (32 Bit Pixel, 24 Bit DepthBuffer, Doublebuffering)
- RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
- // Activate RenderContext
- ActivateRenderingContext(DC, RC);
- // set viewing projection
- glMatrixMode(GL_PROJECTION);
- glFrustum(-0.1, 0.1, -0.1, 0.1, 0.3, 25.0);
- // position viewer
- glMatrixMode(GL_MODELVIEW);
- // Active DepthBuffer
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- // Set lighting
- glEnable(GL_LIGHTING);
- glLightfv(GL_LIGHT0, GL_POSITION, @light0_position);
- glLightfv(GL_LIGHT0, GL_AMBIENT, @ambient);
- glEnable(GL_LIGHT0);
- // Set clear background color
- glClearColor(0,0,0,0);
- end;
- procedure TOpenGLRender.Draw;
- const
- D=1.5;
- H1=D/1.732;
- H2=D*1.732-H1; // D/H = tg(30) = 1/sqrt(3)
- HY=3.0;
- //vertexes
- a1:TGLArrayf3=(-D, 0, -H1);
- a2:TGLArrayf3=(D, 0, -H1);
- a3:TGLArrayf3=(0, 0, H2);
- a4:TGLArrayf3=(0, HY, 0);
- var
- n1, n2, n3, n4: TGLArrayf3; //normals
- begin
- angle:=angle+1;
- n1 := getNormal(a1,a3,a2);
- n2 := getNormal(a1,a2,a4);
- n3 := getNormal(a2,a3,a4);
- n4 := getNormal(a3,a1,a4);
- glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
- glEnable(GL_NORMALIZE);
- glShadeModel(GL_FLAT);
- glCullFace(GL_BACK);
- glLoadIdentity;
- glTranslatef(0.0, 0.0, -12.0);
- glRotatef(angle, 0.0, 1.0, 0.0);
- glBegin(GL_TRIANGLES);
- glNormal3fv(@n1);
- glVertex3fv(@a1); glVertex3fv(@a2); glVertex3fv(@a3);
- glNormal3fv(@n2);
- glVertex3fv(@a1); glVertex3fv(@a2); glVertex3fv(@a4);
- glNormal3fv(@n3);
- glVertex3fv(@a2); glVertex3fv(@a3); glVertex3fv(@a4);
- glNormal3fv(@n4);
- glVertex3fv(@a3); glVertex3fv(@a1); glVertex3fv(@a4);
- glEnd;
- SwapBuffers(DC);
- end;
- procedure TOpenGLRender.Stop;
- begin
- end;
- //TDGLForm
- procedure TDGLForm.FormCreate(Sender: TObject);
- begin
- DecimalSeparator:='.'; //always use . as decimal seperator
- OpenGLRender := TOpenGLRender.Create(true);
- OpenGLRender.Init(Handle);
- OpenGLRender.Resume;
- end;
- procedure TDGLForm.FormDestroy(Sender: TObject);
- begin
- OpenGLRender.Suspend;
- OpenGLRender.Free;
- DeactivateRenderingContext; // Deactivate RenderContext
- wglDeleteContext(RC); //Delete RenderContext
- ReleaseDC(Handle, DC);
- end;
- procedure TDGLForm.FormKeyPress(Sender: TObject; var Key: Char);
- begin
- case Key of
- #27 : Close;
- end;
- end;
- end.