Hе работает
Fido Themes (ru.opengl)
От: Alexander Voronkin <Alexander.Voronkin@p59.f371.n5020.z2.fidonet.org>
Тема: Hе работает.
Дата: 11 апреля 2001 г. 16:10
Добpый вечеp, All.
Господа! Бьюсь достаточно долго - но не работает. Есл есть время - пожалуйста,посмотрите:
Вроде бы простейшая задача выбора, но....
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,OpenGL;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
public
end;
Const
MaxSelect=4;
var
Form1: TForm1;
hrc:HGLRC;
mouseX, mouseY : Integer;
windW, windH : GLint;
ps : TPaintStruct;
vp : Array [0..3] of GLint;
SelectBuf : Array [0..MaxSelect - 1] of GLint;
hit : GLint;
Mode:GLint;
implementation
{$R *.DFM}
procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
procedure Render (mode : GLenum);
begin
If mode = GL_SELECT then glLoadName (1);
glColor3f (1.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex2f(-1, -1);
glVertex2f(-1, 1);
glVertex2f(-0.1, 0);
glEnd;
If mode = GL_SELECT then glLoadName (2);
glColor3f (0.0, 0.0, 1.0);
glBegin(GL_POLYGON);
glVertex2f(0.1, 0);
glVertex2f(1, 1);
glVertex2f(1, -1);
glEnd;
end;
function DoSelect(x : GLint; y : GLint) : GLint;
var
hits : GLint;
begin
glRenderMode(GL_SELECT);
glInitNames;
glPushName(0);
glLoadIdentity;
gluPickMatrix(x, windH - y, 2, 2, @vp);
Render(GL_SELECT);
hits := glRenderMode(GL_SELECT);
if hits <= 0
then Result := -1
else Result := SelectBuf [(hits - 1) * 4 + 3];
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SetDCPixelFormat(Form1.Canvas.Handle);
hrc := wglCreateContext(Form1.Canvas.Handle);
wglMakeCurrent(Form1.Canvas.Handle, hrc);
glSelectBuffer(MaxSelect, @SelectBuf);
glClearColor (0.5, 0.5, 0.75, 1.0);
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
glViewPort (0, 0, ClientWidth, ClientHeight);;
glLoadIdentity;
glClear(GL_COLOR_BUFFER_BIT);
Render(GL_RENDER);
SwapBuffers(Form1.Canvas.Handle);
wglMakeCurrent(0, 0);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
glViewPort (0, 0, ClientWidth, ClientHeight);;
glGetIntegerv(GL_VIEWPORT, @vp);
end;
procedure TForm1.FormClick(Sender: TObject);
begin
hit := DoSelect(mouseX, mouseY);
case hit of
-1 : MessageBox (Form1.Handle, ' ', ' ', 0);
1 : MessageBox (Form1.Handle, ' ', ' ', 0);
2 : MessageBox (Form1.Handle, ' ', ' ', 0);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
wglMakeCurrent (0, 0);
wglDeleteContext (hrc);
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState;
X,
Y: Integer);
begin
MouseX:=X;
MouseY:=Y;
end;
end.
__
(_oo_) Alexander Voronkin [Cyberpunk] [ГКЖЯHС?!] [SciFi] [Karma] [Porter]
\/ AKA Воpона

От: Alexey Skoufyin <skuf@cps.tver.ru>
Тема: Естественно, не работает ;)
Дата: 11 апреля 2001 г. 18:42
Привет, Alexander Voronkin!
Я, конечно в Дельфях уже годика эдак 3-4 не работал, но навскидку нашёл вот
такие ошибки:
> procedure SetDCPixelFormat (hdc : HDC);
> var
> pfd : TPixelFormatDescriptor;
> nPixelFormat : Integer;
> begin
> FillChar (pfd, SizeOf (pfd), 0);
pfd.nSize := SizeOf(pfd);
pfd.nVersion := 1;
pfd.cColorBits, pfd.cDepthBits { по желанию ;) }
> pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL
or PFD_DOUBLEBUFFER;
> nPixelFormat := ChoosePixelFormat (hdc, @pfd);
> SetPixelFormat (hdc, nPixelFormat, @pfd);
> end;
> procedure TForm1.FormPaint(Sender: TObject);
> begin
> glViewPort (0, 0, ClientWidth, ClientHeight);;
> glLoadIdentity;
> glClear(GL_COLOR_BUFFER_BIT);
> Render(GL_RENDER);
> SwapBuffers(Form1.Canvas.Handle);
> wglMakeCurrent(0, 0);
^___ а это нахрена??? тогда уж перед glViewport поставь wglMakeCurrent(TForm1.hDC,
hGLRC);
> end;

От: Alex Mizrahi <mizrahi@mizrahi.dn.ua>
Тема: Re: Hе работает.
Дата: 11 апреля 2001 г. 21:20
Alexander Voronkin пишет в сообщении
AV>Господа! Бьюсь достаточно долго - но не работает. Есл есть
время -
AV>пожалуйста,посмотрите:
AV>Вроде бы простейшая задача выбора, но....
AV>function DoSelect(x : GLint; y : GLint) : GLint;
AV>var
AV>hits : GLint;
AV>begin
AV>glRenderMode(GL_SELECT);
AV>glInitNames;
AV>glPushName(0);
AV>glLoadIdentity;
AV>gluPickMatrix(x, windH - y, 2, 2, @vp);
AV>Render(GL_SELECT);
AV>hits := glRenderMode(GL_SELECT);
А вот как написано у меня:
glGetdoublev(gl_projection_matrix,@proj);
glMatrixMode(gl_projection);
glLoadIdentity;
glRenderMode(GL_SELECT);
glInitNames;
glPushName(cardinal(-1));
glGetintegerv(gl_viewport,@viewport);
gluPickMatrix(x,viewport[3]-y,2,2,@viewport);
glMultMatrix(PGLDouble(@proj[0,0]));
glMatrixMode(gl_modelview);
Здесь я немного перемутил, но работает точно.
Матрица gluPickMatrix должна умножаться на матрицу проекции. Из WinAPiHelp:
glMatrixMode(GL_PROJECTION);
glLoadIdentity( );
gluPickMatrix(x, y, width, height, viewport);
gluPerspective(. . .);
glMatrixMode(GL_MODELVIEW);

От: Alexander Voronkin <Alexander.Voronkin@p59.f371.n5020.z2.fidonet.org>
Тема: Hе работает.
Дата: 12 апреля 2001 г. 1:07
Добpый вечеp, Alex.
11 Апр 01 Alex Mizrahi написал к All:
AM> А вот как написано у меня:
[skip]
AM> Здесь я немного перемутил, но работает точно.
AM> Матрица gluPickMatrix должна умножаться на матрицу проекции. Из
AM> WinAPiHelp: glMatrixMode(GL_PROJECTION); glLoadIdentity(
AM> ); gluPickMatrix(x, y, width, height, viewport); gluPerspective(. .
AM> .); glMatrixMode(GL_MODELVIEW); /* Draw the scene */
Хм...Hе помогло. :o( Пришли свой минимальный исходник , пожалуйста.
2ALL: По-прежнему ищется иерархическая декларация классов 2D-примитивов с методами.
Hа DELPHI.
__
(_oo_) Alexander Voronkin [Cyberpunk] [ГКЖЯHС?!] [SciFi] [Karma] [Porter]
\/ AKA Воpона
|