Hello,
Here it is, it’s Delphi source. Deleted some parts that didn’t had to do with the sphere code (fullscreen mode and lighting). Shouldn’t be hard to anyone to understand.
unit Unit1;
{
Teste básico de OpenGl demo01
2 de julho de 2001
Matheus Degiovani
matheus@subdimension.com
Este demo ccria uma janela opengl e possibilita mudar entre
modo janela e fullscreen
}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
opengl12, Menus;
type
TForm1 = class(TForm)
Popup1: TPopupMenu;
Fullscreen1: TMenuItem;
Janela1: TMenuItem;
luzes1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Fullscreen1Click(Sender: TObject);
procedure Janela1Click(Sender: TObject);
procedure luzes1Click(Sender: TObject);
private
procedure WMPaint(var message: TWMPaint); message WM_Paint;
public
procedure InitGl;
end;
var
Form1: TForm1;
mdc: HBitmap;
mrc: hglRc;
bfs: boolean; //fullscreen
ang: single;
sp: PGLUQuadricObj;
txi: integer;
lst: integer;
implementation
{$R *.DFM}
procedure TForm1.InitGl;
var
pfd: PixelFormatDescriptor;
pfi: integer;
begin
mdc:= GetDc(form1.Handle);
InitOpengl;
pfd.nVersion:= 1;
pfd.dwFlags:= PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
pfd.iPixelType:= PFD_TYPE_RGBA;
pfd.cColorBits:= 32;
pfd.cDepthBits:= 24;
pfd.iLayerType:= PFD_MAIN_PLANE;
pfd.nSize:= SizeOf(pfd);
pfi:= choosePixelFormat(mdc, @pfd);
SetPixelFormat(mdc, pfi, @pfd);
mrc:= wglCreateContext(mdc);
wglMakeCurrent(mdc, mrc);
glClearColor(0, 0, 0, 0);
bfs:= false;
form1.FormResize(self);
end;
procedure TForm1.WMPaint(var message: TWMPaint);
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
glTranslatef (0.0, 0.0, -8);
glRotatef(ang, 0, 1, 0);
//gluSphere(sp, 1, 20, 20);
glCallList(lst);
ang:= ang + 2;
swapBuffers(mdc);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
tx: TMemoryStream;
i: integer;
front, back: Longint;
begin
InitGl;
sp:= gluNewQuadric;
gluQuadricOrientation(sp, GLU_OUTSIDE);
gluQuadricTexture(sp, GL_TRUE);
//gluQuadricDrawStyle(sp, GLU_LINE);
tx:= TMemoryStream.Create;
tx.LoadFromFile('est1.bmp');
//bitmaps são guardadas como BGR
//Inverter para RGB
i:= 1;
while i < tx.Size -3 do begin
tx.Position:= i -1;
tx.ReadBuffer(front, 1);
tx.Position:= i + 1;
tx.ReadBuffer(back, 1);
tx.Position:= i -1;
tx.WriteBuffer(back, 1);
tx.Position:= i +1;
tx.WriteBuffer(front, 1);
i:= i + 3;
end;
glGenTextures(1, @txi);
glBindTexture(GL_TEXTURE_2D, txi);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2d(GL_TEXTURE_2D, 0, 3, 256, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, tx.Memory);
glEnable(GL_TEXTURE_2d);
lst:= glGenLists(1);
glNewList(lst, GL_COMPILE);
glBindTexture(GL_TEXTURE_2D, txi);
glRotatef(90, 1, 0, 0);
gluSphere(sp, 2, 20, 20);
glLoadIdentity;
glEndList;
tx.Free;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
dm: DevMode;
begin
wglMakeCurrent(0, 0);
wglDeleteContext(mrc);
if bfs = true then begin
dm.dmPelsWidth:= 1024;
dm.dmPelsHeight:= 768;
dm.dmFields:= DM_PELSWIDTH or DM_PELSHEIGHT;
ChangeDisplaySettings(dm, 0);
end;
CloseOpengl;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
glViewport(0, 0, form1.Width, form1.Height);
//acertear perspectiva
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45, form1.Width / form1.Height, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;