 	return m
 }
 
+func transpose(_ m: Matrix4) -> Matrix4{
+	let lm = [m.matrix[0], m.matrix[4], m.matrix[8], m.matrix[12],
+	          m.matrix[1], m.matrix[5], m.matrix[9], m.matrix[13],
+	          m.matrix[2], m.matrix[6], m.matrix[10], m.matrix[14],
+	          m.matrix[3], m.matrix[7], m.matrix[11], m.matrix[15]]
+	return Matrix4(matrix: lm)
+}
+
+func inverse(_ mat: Matrix4) -> Matrix4 {
+	var inv = [Scalar](repeating: 0.0, count: 16)
+	let m = mat.matrix
+	
+	inv[0] = m[5]  * m[10] * m[15] -
+	m[5]  * m[11] * m[14] -
+	m[9]  * m[6]  * m[15] +
+	m[9]  * m[7]  * m[14] +
+	m[13] * m[6]  * m[11] -
+	m[13] * m[7]  * m[10]
+	
+	inv[4] = -m[4]  * m[10] * m[15] +
+	m[4]  * m[11] * m[14] +
+	m[8]  * m[6]  * m[15] -
+	m[8]  * m[7]  * m[14] -
+	m[12] * m[6]  * m[11] +
+	m[12] * m[7]  * m[10]
+	
+	inv[8] = m[4]  * m[9] * m[15] -
+	m[4]  * m[11] * m[13] -
+	m[8]  * m[5] * m[15] +
+	m[8]  * m[7] * m[13] +
+	m[12] * m[5] * m[11] -
+	m[12] * m[7] * m[9]
+	
+	inv[12] = -m[4]  * m[9] * m[14] +
+	m[4]  * m[10] * m[13] +
+	m[8]  * m[5] * m[14] -
+	m[8]  * m[6] * m[13] -
+	m[12] * m[5] * m[10] +
+	m[12] * m[6] * m[9]
+	
+	inv[1] = -m[1]  * m[10] * m[15] +
+	m[1]  * m[11] * m[14] +
+	m[9]  * m[2] * m[15] -
+	m[9]  * m[3] * m[14] -
+	m[13] * m[2] * m[11] +
+	m[13] * m[3] * m[10]
+	
+	inv[5] = m[0]  * m[10] * m[15] -
+	m[0]  * m[11] * m[14] -
+	m[8]  * m[2] * m[15] +
+	m[8]  * m[3] * m[14] +
+	m[12] * m[2] * m[11] -
+	m[12] * m[3] * m[10]
+	
+	inv[9] = -m[0]  * m[9] * m[15] +
+	m[0]  * m[11] * m[13] +
+	m[8]  * m[1] * m[15] -
+	m[8]  * m[3] * m[13] -
+	m[12] * m[1] * m[11] +
+	m[12] * m[3] * m[9]
+	
+	inv[13] = m[0]  * m[9] * m[14] -
+	m[0]  * m[10] * m[13] -
+	m[8]  * m[1] * m[14] +
+	m[8]  * m[2] * m[13] +
+	m[12] * m[1] * m[10] -
+	m[12] * m[2] * m[9]
+	
+	inv[2] = m[1]  * m[6] * m[15] -
+	m[1]  * m[7] * m[14] -
+	m[5]  * m[2] * m[15] +
+	m[5]  * m[3] * m[14] +
+	m[13] * m[2] * m[7] -
+	m[13] * m[3] * m[6]
+	
+	inv[6] = -m[0]  * m[6] * m[15] +
+	m[0]  * m[7] * m[14] +
+	m[4]  * m[2] * m[15] -
+	m[4]  * m[3] * m[14] -
+	m[12] * m[2] * m[7] +
+	m[12] * m[3] * m[6]
+	
+	inv[10] = m[0]  * m[5] * m[15] -
+	m[0]  * m[7] * m[13] -
+	m[4]  * m[1] * m[15] +
+	m[4]  * m[3] * m[13] +
+	m[12] * m[1] * m[7] -
+	m[12] * m[3] * m[5]
+	
+	inv[14] = -m[0]  * m[5] * m[14] +
+	m[0]  * m[6] * m[13] +
+	m[4]  * m[1] * m[14] -
+	m[4]  * m[2] * m[13] -
+	m[12] * m[1] * m[6] +
+	m[12] * m[2] * m[5]
+	
+	inv[3] = -m[1] * m[6] * m[11] +
+	m[1] * m[7] * m[10] +
+	m[5] * m[2] * m[11] -
+	m[5] * m[3] * m[10] -
+	m[9] * m[2] * m[7] +
+	m[9] * m[3] * m[6]
+	
+	inv[7] = m[0] * m[6] * m[11] -
+	m[0] * m[7] * m[10] -
+	m[4] * m[2] * m[11] +
+	m[4] * m[3] * m[10] +
+	m[8] * m[2] * m[7] -
+	m[8] * m[3] * m[6]
+	
+	inv[11] = -m[0] * m[5] * m[11] +
+	m[0] * m[7] * m[9] +
+	m[4] * m[1] * m[11] -
+	m[4] * m[3] * m[9] -
+	m[8] * m[1] * m[7] +
+	m[8] * m[3] * m[5]
+	
+	inv[15] = m[0] * m[5] * m[10] -
+	m[0] * m[6] * m[9] -
+	m[4] * m[1] * m[10] +
+	m[4] * m[2] * m[9] +
+	m[8] * m[1] * m[6] -
+	m[8] * m[2] * m[5]
+	
+	var det = m[0] * inv[0] + m[1] * inv[4] + m[2] * inv[8] + m[3] * inv[12];
+	
+	if det == 0.0 {
+		fatalError("Non invertible matrix")
+	}
+	
+	det = 1.0 / det
+	
+	for i in 0..<16 {
+		inv[i] *= det
+	}
+	
+	return Matrix4(matrix: inv)
+}
+
+func inverse1(_ m: Matrix4) -> Matrix4 {
+	var inv = Matrix4()
+	inv.matrix[0] = m.matrix[0]
+	inv.matrix[1] = m.matrix[4]
+	inv.matrix[2] = m.matrix[8]
+	inv.matrix[3] = -(m.matrix[0] * m.matrix[3] + m.matrix[4] * m.matrix[7] + m.matrix[8] * m.matrix[11])
+	inv.matrix[4] = m.matrix[1]
+	inv.matrix[5] = m.matrix[5]
+	inv.matrix[6] = m.matrix[9]
+	inv.matrix[7] = -(m.matrix[1] * m.matrix[3] + m.matrix[5] * m.matrix[7] + m.matrix[9] * m.matrix[11])
+	inv.matrix[8] = m.matrix[2]
+	inv.matrix[9] = m.matrix[6]
+	inv.matrix[10] = m.matrix[10]
+	inv.matrix[11] = -(m.matrix[2] * m.matrix[3] + m.matrix[6] * m.matrix[7] + m.matrix[10] * m.matrix[11])
+
+	return inv
+}
+
 /*
 struct Matrix4 {
 	/*var matrix: [Scalar] = [
 		//0	  1	   2	3
-		1.0, 0.0, 0.0, 0.0, 		
+		1.0, 0.0, 0.0, 0.0,
 		//4	  5	   6	7
-		0.0, 1.0, 0.0, 0.0, 		
+		0.0, 1.0, 0.0, 0.0,
 		//8	  9	   10	11
-		0.0, 0.0, 1.0, 0.0, 		
+		0.0, 0.0, 1.0, 0.0,
 		//12  13   14	15
 		0.0, 0.0, 0.0, 1.0
 	]*/
 	var matrix : float4x4 = float4x4(diagonal: float4(1.0,1.0,1.0,1.0))
-	
-	
+
+
 	static func translationMatrix(_ t: Point3) -> Matrix4 {
 		var matrix = Matrix4()
 		matrix.matrix[0][3] = t.0

struct Matrix4 {
	var matrix: [Scalar] = [
		//0	  1	   2	3
		1.0, 0.0, 0.0, 0.0, 		//4	  5	   6	7
		0.0, 1.0, 0.0, 0.0, 		//8	  9	   10	11
		0.0, 0.0, 1.0, 0.0, 		//12  13   14	15
		0.0, 0.0, 0.0, 1.0
	]
	

		matrix.matrix[2][2] = s.2
		return matrix
	}

	static func rotationMatrix(angle: Scalar, axis: Point3) -> Matrix4 {
		var matrix = Matrix4()
		let u = normalized(axis)
		let c = cos(angle)
		let mc = 1.0 - c
		let s = sin(angle)

		let xy = u.0 * u.1 * mc
		let xz = u.0 * u.2 * mc
		let yz = u.1 * u.2 * mc
