[fpc-pascal] GLM library alternative?
Marco van de Voort
marcov at stack.nl
Tue May 30 10:05:27 CEST 2017
In our previous episode, Ryan Joseph said:
> > On May 28, 2017, at 10:33 PM, Ryan Joseph <ryan at thealchemistguild.com> wrote:
> >
> > projTransform := TMatrix4x4.CreatePerspective(60.0, 500 / 500, 0.1, 10.0);
> > modelTransform := TMatrix4x4.CreateTranslation(0, 0, -3.0) * TMat4.CreateRotateX(54);
>
> I found out the problem. I was expecting the multiply to work like with GLM where you could do:
>
> translation * rotation
>
> but with the operator overloads I need to do protation * translation.
> Anthony?s multiply matrix 4 operators did this in the order I expected and
> how I figured it out. Not sure why and it?s probably not safe to swap the
> parameters because it would likely break other parts of the unit.
For the 2Ders, in old GL I used glortho2d a lot. In newer ones I missed that, but I found
an equivalent on stackoverflow:
// http://stackoverflow.com/questions/21323743/modern-equivalent-of-gluortho2d
procedure MyOrtho2D(var mat : TGLMatrixf4;left,right,bottom,top:single);
var inv_y,inv_x : single;
begin
inv_y := 1.0 / (top - bottom);
inv_x := 1.0 / (right - left);
// this is basically from
// http://en.wikipedia.org/wiki/Orthographic_projection_(geometry)
//first column
mat[0][0] := (2.0*inv_x);
mat[0][1] := (0.0);
mat[0][2] := (0.0);
mat[0][3] := (0.0);
//second
mat[1][0] := (0.0);
mat[1][1] := (2.0*inv_y);
mat[1][2] := (0.0);
mat[1][3] := (0.0);
//third
mat[2][0] := (0.0);
mat[2][1] := (0.0);
mat[2][2] := (-2.0*inv_z);
mat[2][3] := (0.0);
//fourth
mat[3][0] := (-(right + left)*inv_x);
mat[3][1] := (-(top + bottom)*inv_y);
mat[3][2] := (-(zFar + zNear)*inv_z);
mat[3][3] := (1.0);
end;
I have a TGLvector for zoom (X/Y) and one for pan (offset, also in X and Y
direction).
// calcs a matrix for the shader. pass the matrix as an uniform and multiply in vertex or geometry shader
procedure myorthohelp(var mat : TGLMatrixf4;const
aoffs,azoom:TGLVectorf2;topdown:boolean=false);
begin
myOrtho2D(mat,aoffs[0], 1.0 / (aZoom[0]) + (aoffs[0]), 1.0 / (aZoom[1]) + (aoffs[1]), aoffs[1])
end;
More information about the fpc-pascal
mailing list