Just trying to put together a simple lib for opengl for matrices.
I found a few equations off of the opengl website and stack overflow to put together a Perspective matrix and lookAt matrix.
But i'm having trouble getting my equation to work or maybe i'm not using operator overloading right to multiply the matrices.
so maybe someone can help? anyway here is code its a lot of code.. i know
edit: and oh i forgot to mention i know i have 3d working because i put an identity matrix in the glProgramUniformMatrix4fv and i see the triangle i used to start with..
import opengl-1.0/opengl
import program
import glfw/glfw3
import math as math
type
Mat4* = object
data: array[4,array[4,GLfloat]]
Vec3* = object of RootObj
x:GLfloat
y:GLfloat
z:GLfloat
proc `-`*(a,b:Vec3): Vec3 =
var c: Vec3
c.x = (a.x - b.x)
c.y = (a.y - b.y)
c.z = (a.z - a.z)
proc `*`*(a,b:Vec3): Vec3 =
var c: Vec3
c.x = (a.x * b.x)
c.y = (a.y * b.y)
c.z = (a.z * a.z)
proc `*`*(a,b: var Mat4): var Mat4 =
a.data[0][0] = a.data[0][0] * b.data[0][0]
a.data[0][1] = a.data[0][1] * b.data[0][1]
a.data[0][2] = a.data[0][2] * b.data[0][2]
a.data[0][3] = a.data[0][3] * b.data[0][3]
a.data[1][0] = a.data[1][0] * b.data[1][0]
a.data[1][1] = a.data[1][1] * b.data[1][1]
a.data[1][2] = a.data[1][2] * b.data[1][2]
a.data[1][3] = a.data[1][3] * b.data[1][3]
a.data[2][0] = a.data[2][0] * b.data[2][0]
a.data[2][1] = a.data[2][1] * b.data[2][1]
a.data[2][2] = a.data[2][2] * b.data[2][2]
a.data[2][3] = a.data[2][3] * b.data[2][3]
a.data[3][0] = a.data[3][0] * b.data[3][0]
a.data[3][1] = a.data[3][1] * b.data[3][1]
a.data[3][2] = a.data[3][2] * b.data[3][2]
a.data[3][3] = a.data[3][3] * b.data[3][3]
return a
discard """
proc `*`*(m,n: Mat4): Mat4 =
var z : Mat4
z.data[0][0] = m.data[0][0] * n.data[0][0]
z.data[0][1] = m.data[0][1] * n.data[0][1]
z.data[0][2] = m.data[0][2] * n.data[0][2]
z.data[0][3] = m.data[0][3] * n.data[0][3]
z.data[1][0] = m.data[1][0] * n.data[1][0]
z.data[1][1] = m.data[1][1] * n.data[1][1]
z.data[1][2] = m.data[1][2] * n.data[1][2]
z.data[1][3] = m.data[1][3] * n.data[1][3]
z.data[2][0] = m.data[2][0] * n.data[2][0]
z.data[2][1] = m.data[2][1] * n.data[2][1]
z.data[2][2] = m.data[2][2] * n.data[2][2]
z.data[2][3] = m.data[2][3] * n.data[2][3]
z.data[2][0] = m.data[3][0] * n.data[3][0]
z.data[3][1] = m.data[3][1] * n.data[3][1]
z.data[3][2] = m.data[3][2] * n.data[3][2]
z.data[3][3] = m.data[3][3] * n.data[3][3]
return z """
proc `[]`*(m:var Mat4;x,y:int): GLfloat =
return m.data[x][y]
proc `[]=`*(m:var Mat4;x,y:int;z:var GLfloat) =
m.data[x][y] = z
var iden : Mat4 # not finished #
iden.data[0][0] = 1.0
iden.data[0][1] = 0.0
iden.data[0][2] = 0.0
iden.data[0][3] = 0.0
iden.data[1][0] = 0.0
iden.data[1][1] = 1.0
iden.data[1][2] = 0.0
iden.data[1][3] = 0.0
iden.data[2][0] = 0.0
iden.data[2][1] = 0.0
iden.data[2][2] = 1.0
iden.data[2][3] = 0.0
iden.data[2][0] = 0.0
iden.data[3][1] = 0.0
iden.data[3][2] = 0.0
iden.data[3][3] = 1.0
var vec3: Vec3
vec3.x = 1.0
vec3.y = 1.0
vec3.z = 1.0
# convience proc for printing values #
proc printMat4(m:var Mat4) =
echo m.data[0][0]
echo m.data[0][1]
echo m.data[0][2]
echo m.data[0][3]
echo m.data[1][0]
echo m.data[1][1]
echo m.data[1][2]
echo m.data[1][3]
echo m.data[2][0]
echo m.data[2][1]
echo m.data[2][2]
echo m.data[2][3]
echo m.data[3][0]
echo m.data[3][1]
echo m.data[3][2]
echo m.data[3][3]
proc printVec3(v:Vec3) =
echo v.x
echo v.y
echo v.z
proc normalizefloat(b:GLfloat): GLfloat =
var a : GLfloat
if b > 1.0 or b < -1.0:
a = -1.0
if b < 0.0 or b > 1.0:
a = 1.0
echo a
proc normalize(b:Vec3): Vec3 =
var a: Vec3
a.x = normalizefloat(b.x)
a.y = normalizefloat(b.y)
a.z = normalizefloat(b.z)
proc dot(a,b:Vec3): GLfloat =
return ((a.x * b.x) - (a.y * b.y) - (a.z * b.z))
#echo ("dot: ",x)
proc cross(a1,b1:Vec3): Vec3 =
var a = a1
var b = b1
var c: Vec3
c.x = ((a.x*b.z) - (b.y*a.z))
c.y = ((a.z*b.x) - (b.z*a.x))
c.z = ((a.x*b.y) - (b.x*a.y))
# printVec3("cross: ",c)
proc Perspective(fov,aratio,near,far:GLfloat): Mat4 =
var d2r : GLfloat = math.PI / 180.0
var yscale : GLfloat = 1.0 / math.tan(d2r * fov / 2)
var xscale = yscale / aratio
var nearMfar = near - far
var m = iden
m.data[0][0] = xscale
m.data[0][1] = 0.0
m.data[0][2] = 0.0
m.data[0][3] = 0.0
m.data[1][0] = 0.0
m.data[1][1] = yscale
m.data[1][2] = 0.0
m.data[1][3] = 0.0
m.data[2][0] = 0.0
m.data[2][1] = 0.0
m.data[2][2] = ((far + near) / nearMfar)
m.data[2][3] = -1.0
m.data[3][0] = 0.0
m.data[3][1] = 0.0
m.data[3][2] = ((2 * far) * (near / nearMfar))
m.data[3][3] = 0.0
return m
proc LookAt(a:Vec3;b:Vec3;c:Vec3): Mat4 =
var f = normalize((b - c))
var up = normalize(c)
var s = f * up
var s2 = normalize(s)
var u = (s2 * f)
var m = iden
m.data[0][0] = s2.x
m.data[1][0] = s2.y
m.data[2][0] = s2.z
m.data[3][0] = 0.0
m.data[0][1] = u.x
m.data[1][1] = u.y
m.data[2][1] = u.z
m.data[3][1] = 0.0
m.data[0][2] = -f.x
m.data[1][2] = -f.y
m.data[2][2] = -f.z
m.data[3][2] = 0.0
m.data[0][3] = 0.0
m.data[1][3] = 0.0
m.data[2][3] = 0.0
m.data[3][3] = 1.0
printmat4(m)
return m
var
x,y : GLdouble
proc matrixLoop*(Win:Window) =
GetCursorPos(Win,x.addr,y.addr)
#var P = Perspective(60.0.GLfloat,800/600 * 1.0.GLfloat,0.1.GLfloat,1000.0.GLfloat)
var V = LookAt(Vec3(x:x*1.0,y:y*1.0,z:0.0),Vec3(x:0.0,y:0.0,z:(-10.0)),Vec3(x:0.0,y:1.0,z:0.0))
#var PV : ptr = addr(V)
var o : array[0..2,GLfloat] = [0.5.GLfloat,0.5.GLfloat,0.5.GLfloat]
glUniform3fv(p_id.GLint,1.GLsizei,o[0].addr)
glUniformMatrix4fv(mvp_id.GLint,GLsizei(1),GL_FALSE.GLBoolean,iden.data[0][0].addr)