JernejL
11-08-2005, 11:56 AM
don't want to link to glu.dll but still need some functions from there? no problem, here is a "no-glu" solution:
// these functions are from http://oss.sgi.com/projects/ogl-sample/
procedure PickMatrix(x, y, deltax, deltay: GLfloat; viewport: array of integer);
procedure Perspective(fovy, aspect, zNear, zFar: GLfloat);
procedure LookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz: single);
// this is gluPickMatrix equivalent translated from ogl-sample.
procedure PickMatrix(x, y, deltax, deltay: GLfloat; viewport: array of integer);
begin
if (deltax <= 0) and (deltay <= 0) then exit;
(* Translate and scale the picked region to the entire window *)
glTranslatef(
(viewport[2] - 2 * (x - viewport[0])) / deltax,
(viewport[3] - 2 * (y - viewport[1])) / deltay,
0);
glScalef(viewport[2] / deltax, viewport[3] / deltay, 1.0);
end;
// this is gluPerspective equivalent translated from ogl-sample.
// matrix should be double but i use single precision
procedure Perspective(fovy, aspect, zNear, zFar: single);
var
m: TMatrix4f;
sine, cotangent, deltaZ, radians: single;
begin
radians:= fovy / 2 * Pi / 180;
deltaZ:= zFar - zNear;
sine:= sin(radians);
if ((deltaZ = 0) and (sine = 0) and (aspect = 0)) then exit;
cotangent:= COS(radians) / sine;
m:= IdentityHmgMatrix;
m[0][0]:= cotangent / aspect;
m[1][1]:= cotangent;
m[2][2]:= -(zFar + zNear) / deltaZ;
m[2][3]:= -1;
m[3][2]:= -2 * zNear * zFar / deltaZ;
m[3][3]:= 0;
glMultMatrixf(@m[0][0]);
end;
// this is gluPerspective equivalent translated from ogl-sample.
// matrix should be double but i use single precision
procedure normalize(var v: array of single);
var
r: single;
begin
r:= sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
if (r = 0) then exit;
v[0]:= v[0] / r;
v[1]:= v[1] / r;
v[2]:= v[2] / r;
end;
procedure crossp(var v1, v2, result: array of single);
begin
result[0]:= v1[1]*v2[2] - v1[2]*v2[1];
result[1]:= v1[2]*v2[0] - v1[0]*v2[2];
result[2]:= v1[0]*v2[1] - v1[1]*v2[0];
end;
procedure LookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz: single);
var
i: integer;
forw, side, up: array[0..2] of single;
m: TMatrix4f;
begin
forw[0]:= centerx - eyex;
forw[1]:= centery - eyey;
forw[2]:= centerz - eyez;
up[0]:= upx;
up[1]:= upy;
up[2]:= upz;
normalize(forw);
(* Side:= forw x up *)
crossp(forw, up, side);
normalize(side);
(* Recompute up as: up:= side x forw *)
crossp(side, forw, up);
m:= IdentityHmgMatrix;
m[0][0]:= side[0];
m[0][1]:= side[1];
m[0][2]:= side[2];
m[1][0]:= up[0];
m[1][1]:= up[1];
m[1][2]:= up[2];
m[2][0]:= -forw[0];
m[2][1]:= -forw[1];
m[2][2]:= -forw[2];
glMultMatrixf(@m);
glTranslated(-eyex, -eyey, -eyez);
end;
and maybe you will need to have this defined:
type
TVector4f= array [0..3] of Single;
TMatrix4f= array [0..3] of TVector4f;
// these functions are from http://oss.sgi.com/projects/ogl-sample/
procedure PickMatrix(x, y, deltax, deltay: GLfloat; viewport: array of integer);
procedure Perspective(fovy, aspect, zNear, zFar: GLfloat);
procedure LookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz: single);
// this is gluPickMatrix equivalent translated from ogl-sample.
procedure PickMatrix(x, y, deltax, deltay: GLfloat; viewport: array of integer);
begin
if (deltax <= 0) and (deltay <= 0) then exit;
(* Translate and scale the picked region to the entire window *)
glTranslatef(
(viewport[2] - 2 * (x - viewport[0])) / deltax,
(viewport[3] - 2 * (y - viewport[1])) / deltay,
0);
glScalef(viewport[2] / deltax, viewport[3] / deltay, 1.0);
end;
// this is gluPerspective equivalent translated from ogl-sample.
// matrix should be double but i use single precision
procedure Perspective(fovy, aspect, zNear, zFar: single);
var
m: TMatrix4f;
sine, cotangent, deltaZ, radians: single;
begin
radians:= fovy / 2 * Pi / 180;
deltaZ:= zFar - zNear;
sine:= sin(radians);
if ((deltaZ = 0) and (sine = 0) and (aspect = 0)) then exit;
cotangent:= COS(radians) / sine;
m:= IdentityHmgMatrix;
m[0][0]:= cotangent / aspect;
m[1][1]:= cotangent;
m[2][2]:= -(zFar + zNear) / deltaZ;
m[2][3]:= -1;
m[3][2]:= -2 * zNear * zFar / deltaZ;
m[3][3]:= 0;
glMultMatrixf(@m[0][0]);
end;
// this is gluPerspective equivalent translated from ogl-sample.
// matrix should be double but i use single precision
procedure normalize(var v: array of single);
var
r: single;
begin
r:= sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
if (r = 0) then exit;
v[0]:= v[0] / r;
v[1]:= v[1] / r;
v[2]:= v[2] / r;
end;
procedure crossp(var v1, v2, result: array of single);
begin
result[0]:= v1[1]*v2[2] - v1[2]*v2[1];
result[1]:= v1[2]*v2[0] - v1[0]*v2[2];
result[2]:= v1[0]*v2[1] - v1[1]*v2[0];
end;
procedure LookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz: single);
var
i: integer;
forw, side, up: array[0..2] of single;
m: TMatrix4f;
begin
forw[0]:= centerx - eyex;
forw[1]:= centery - eyey;
forw[2]:= centerz - eyez;
up[0]:= upx;
up[1]:= upy;
up[2]:= upz;
normalize(forw);
(* Side:= forw x up *)
crossp(forw, up, side);
normalize(side);
(* Recompute up as: up:= side x forw *)
crossp(side, forw, up);
m:= IdentityHmgMatrix;
m[0][0]:= side[0];
m[0][1]:= side[1];
m[0][2]:= side[2];
m[1][0]:= up[0];
m[1][1]:= up[1];
m[1][2]:= up[2];
m[2][0]:= -forw[0];
m[2][1]:= -forw[1];
m[2][2]:= -forw[2];
glMultMatrixf(@m);
glTranslated(-eyex, -eyey, -eyez);
end;
and maybe you will need to have this defined:
type
TVector4f= array [0..3] of Single;
TMatrix4f= array [0..3] of TVector4f;