![]() |
|
#1
|
|||
|
|||
![]() Доброе время суток, спецы!!!! Понимаю, что тема убитая, я вот тока начал покорять OpenGL. И сразу куча вопросов. Ну кое как к примеру создал форму с прорисовкой прямоугольника внутри. Но вот второй день бьюсь над проблемой, как мне на ентот прямоугольник "растянуть" картинку из файла????????
![]() Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OpenGL, StdCtrls, ExtCtrls, Jpeg, DIB; type TForm1 = class(TForm) Timer1: TTimer; OD1: TOpenDialog; DXDIB1: TDXDIB; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormResize(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormDblClick(Sender: TObject); private { Private declarations } nX, nY, oX, oY, oxx, oyy: GLDouble; dr: boolean; Pic: TPicture; public { Public declarations } function SetPixFormat(DC: HDC): boolean; procedure doQuard(ListInd: integer); procedure doDraw; end; var Form1: TForm1; DC: HDC; HRC: HGLRC; implementation {$R *.dfm} { TForm1 } function TForm1.SetPixFormat(DC: HDC): boolean; var pfd: PIXELFORMATDESCRIPTOR; ppfd: PPIXELFORMATDESCRIPTOR; pixFormat: integer; begin ppfd:= @pfd; ppfd.nSize:= SizeOf(PIXELFORMATDESCRIPTOR); ppfd.nVersion:= 1; ppfd.dwFlags:= PFD_DRAW_TO_WINDOW xor PFD_SUPPORT_OPENGL xor PFD_DOUBLEBUFFER; ppfd.dwLayerMask:= PFD_MAIN_PLANE; ppfd.iPixelType:= PFD_TYPE_RGBA; ppfd.cColorBits:= 32; ppfd.cDepthBits:= 32; ppfd.cAccumBits:= 0; ppfd.cStencilBits:= 0; pixFormat:= ChoosePixelFormat(DC, ppfd); if (pixFormat = 0) or not SetPixelFormat(DC, pixFormat, ppfd) then begin ShowMessage('NONONO'); Result:= false; exit; end; Result:= true; end; procedure TForm1.FormCreate(Sender: TObject); var p: TGLArrayf4; d: TGLArrayf3; begin DC:= GetDC(Handle); if not SetPixFormat(DC) then exit; HRC:= wglCreateContext(DC); wglMakeCurrent(DC, HRC); //ShowCursor(false); glClearColor(0.2, 0.2, 0.2, 1.0); glEnable(GL_COLOR_MATERIAL or GL_DEPTH_TEST); // GL_DEPTH_TEST GL_POINT_SMOOTH { p[0]:= 3; p[1]:= 3; p[2]:= 3; p[3]:= 1; d[0]:= -1; d[1]:= -1; d[2]:= -3; glLightfv(GL_LIGHT0, GL_POSITION, @p); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, @d);} // glClear(GL_COLOR_BUFFER_BIT); // doQuard(1); dr:= false; nX:= -400.0; nY:= -400.0; Pic:= TPicture.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin wglMakeCurrent(0, 0); wglDeleteContext(HRC); ReleaseDC(Handle, DC); DeleteDC(DC); Pic.Free; end; procedure TForm1.FormResize(Sender: TObject); begin glViewPort(0, 0, ClientWidth, ClientHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity; glOrtho(-500, 500, -500, 500, 2, 1200); // gluPerspective(30.0, ClientWidth / ClientHeight, 0.1, 1000.0); gluLookAt(0, 0, 500, 0, 0, 0, 0, 1, 0); glMatrixMode(GL_MODELVIEW); // glLoadIdentity; // glClear(GL_COLOR_BUFFER_BIT or // GL_DEPTH_BUFFER_BIT); doDraw; end; procedure TForm1.doQuard(ListInd: integer); begin glClear(GL_DEPTH_BUFFER_BIT xor GL_COLOR_BUFFER_BIT); // glNewList(ListInd, GL_COMPILE); glBegin(GL_QUADS); glColor3f(0, 0, 1); glVertex3f(nX, nY, 0); glColor3f(0, 1, 0); glVertex3f(nX + 800, nY, 0); glColor3f(1, 0, 0); glVertex3f(nX + 800, nY + 800, 0); glColor3f(0, 1, 1); glVertex3f(nX, nY + 800, 0); glEnd; // glEndList; SwapBuffers(DC); end; procedure TForm1.Timer1Timer(Sender: TObject); begin doDraw; end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var xx, yy: GLDouble; begin oX:= nX; oY:= nY; xx:= 500 - (X / ClientWidth) * 1000; yy:= 500 - (1 - Y / ClientHeight) * 1000; { if (Round(xx - nX) * 1e5 > 0) and (Round(xx - (nX + 8)) * 1e5 < 0) and (Round(yy - nY) * 1e5 > 0) and (Round(yy - (nY + 8)) * 1e5 < 0) then} begin dr:= true; oxx:= xx; oyy:= yy; end; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var xx, yy: GLDouble; begin if dr then begin xx:= 500 - (X / ClientWidth) * 1000; yy:= 500 - (1 - Y / ClientHeight) * 1000; nX:= oX - xx + oxx; nY:= oY - yy + oyy; doDraw; end; end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin dr:= false; end; procedure TForm1.FormDblClick(Sender: TObject); begin if OD1.Execute then begin Pic.LoadFromFile(OD1.FileName); end; end; procedure TForm1.doDraw; begin doQuard(1); // Как-то тут хотел прописать прорисовку картинки......но даже не знаю // счего начать..... end; end. APPLICATION.TERMINATOR |