www.pudn.com > 172020781.rar > frmMain.pas
unit frmMain;
interface
uses
Windows, Messages, Classes, Graphics, Forms, ExtCtrls, Menus,
Controls, Dialogs, SysUtils, OpenGL, Mesh, TextureGL;
type
TfrmGL = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
OpenDialog: TOpenDialog;
NSmooth: TMenuItem;
pe: TMenuItem;
Wireframe1: TMenuItem;
N21: TMenuItem;
Dshebnmntrcnehs1: TMenuItem;
N2: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure N1Click(Sender: TObject);
procedure NSmoothClick(Sender: TObject);
procedure peClick(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure Wireframe1Click(Sender: TObject);
procedure Dshebnmntrcnehs1Click(Sender: TObject);
procedure N21Click(Sender: TObject);
procedure N2Click(Sender: TObject);
private
DC: HDC;
hrc: HGLRC;
lastx, down : Integer;
procedure Init;
procedure SetDCPixelFormat;
protected
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
end;
var
frmGL: TfrmGL;
Anglex,Angley,angle : GLfloat;
wrkX, wrkY,xm,ym : Integer;
MyMesh : TGLMesh1;
lf,nf:integer;
s:string;
lfps,prm,fps,zad:real;
sfps,s2:string[100];
t1,t2:TTextureGl;
en:boolean;
implementation
{$R *.DFM}
procedure TfrmGL.Init;
begin
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
gldisable (GL_COLOR_MATERIAL);
gldisable (GL_NORMALIZE);
glEnable(GL_CULL_FACE);
glcullface(gl_back);
end;
procedure TfrmGL.WMPaint(var Msg: TWMPaint);
var
ps : TPaintStruct;
begin
BeginPaint (Handle, ps);
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glPushMatrix;
glRotatef (-90, 1.0,0.0 , 0.0);
glRotatef (-90, 0.0,0.0 , 1.0);
glRotatef (Angley, 0.0,1.0 , 0.0);
glRotatef (Anglex, 0.0,0.0 , 1.0);
MyMesh.Draw; // Рисуем объект
glRotatef (angle*100, 1.0,0.0 , 0.0);
glTranslatef(0.0, 2.0, 0);
glPopMatrix;
SwapBuffers (DC);
EndPaint (Handle, ps);
prm:=gettickcount; //Смотрю на часы
if prm-zad>100 then
begin
fps:=1000/(prm-lfps);
str(fps:7:4,s);
sfps:='Fps: '+s;
str(mymesh.cFcs,s2);
frmGL.Caption:='3D Prog by BoogeMan (BoogeSoft@yandex.ru) Triangles: '+s2+' '+sfps;
zad:=prm;
end;
lfps:=prm;
InvalidateRect(Handle, nil, False);
end;
{=======================================================================
Создание окна}
procedure TfrmGL.FormCreate(Sender: TObject);
begin
DC := GetDC(Handle);
SetDCPixelFormat;
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
glClearColor (0.0, 0.0, 0.0, 1.0);
down := 0;
Init;
MyMesh := TGLMesh1.Create;
MyMesh.LoadFromFile_lst( 'man' );
MyMesh.mCfg.mde:=gl_triangles;
t2:=TTextureGl.Create;
t2.LoadFrom_bmp_File1('textyr1.bmp');
t1:=TTextureGl.Create;
t1.LoadFrom_bmp_File1('textyr2.bmp');
end;
{=======================================================================
Изменение размеров окна}
procedure TfrmGL.FormResize(Sender: TObject);
begin
glViewPort (0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(40.0, ClientWidth / ClientHeight, 3.0, 30.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0.0, 0.0, -15.0);
InvalidateRect(Handle, nil, False);
end;
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
mymesh.clear;
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC(Handle, DC);
DeleteDC (DC);
end;
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If Key = VK_ESCAPE then Close;
end;
procedure TfrmGL.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
If down <> 0 then begin
anglex:=anglex+(x-xm);
angley:=angley+(y-ym);
end;
xm:=x;ym:=y;
end;
procedure TfrmGL.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
down := 0;
end;
procedure TfrmGL.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If button = mbLeft then begin
lastx := X;
wrkX := X;
wrkY := Y;
down := 1;
end;
end;
procedure TfrmGL.SetDCPixelFormat;
var
nPixelFormat: Integer;
pfd: TPixelFormatDescriptor;
begin
FillChar(pfd, SizeOf(pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat(DC, @pfd);
SetPixelFormat(DC, nPixelFormat, @pfd);
end;
procedure TfrmGL.N1Click(Sender: TObject);
begin
if OpenDialog.Execute then
begin
Mymesh.clear;
//Mymesh := TGLMesh1.Create;
MyMesh.LoadFromFile_lst(OpenDialog.FileName);
//myMesh.Save_To_file_lst(OpenDialog.FileName+'lst');
end;
end;
procedure TfrmGL.NSmoothClick(Sender: TObject);
begin
mymesh.MCfg.smt:=not mymesh.MCfg.smt;
end;
procedure TfrmGL.peClick(Sender: TObject);
begin
glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
t1.Enable;
end;
procedure TfrmGL.N3Click(Sender: TObject);
begin
mymesh.MCfg.mde:=gl_line_loop
end;
procedure TfrmGL.Wireframe1Click(Sender: TObject);
begin
if mymesh.MCfg.mde=gl_line_loop then mymesh.MCfg.mde:=gl_triangles else
if mymesh.MCfg.mde=gl_triangles then mymesh.MCfg.mde:=gl_line_loop;
end;
procedure TfrmGL.Dshebnmntrcnehs1Click(Sender: TObject);
begin
gldisable(GL_TEXTURE_GEN_S);
gldisable(GL_TEXTURE_GEN_T);
t1.disable;
t2.disable;
end;
procedure TfrmGL.N21Click(Sender: TObject);
begin
glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
t2.Enable;
end;
procedure TfrmGL.N2Click(Sender: TObject);
begin
close;
end;
end.