Code:
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.
Bookmarks