import vec4,mat3
def identity():
return ((1.0, 0.0, 0.0, 0.0),
(0.0, 1.0, 0.0, 0.0),
(0.0, 0.0, 1.0, 0.0),
(0.0, 0.0, 0.0, 1.0))
def fromtrans(trans):
return ((1.0, 0.0, 0.0, 0.0),
(0.0, 1.0, 0.0, 0.0),
(0.0, 0.0, 1.0, 0.0),
(trans[0], trans[1], trans[2], 1.0))
def fromscale(scale):
x,y,z= scale
x,y,z= float(x),float(y),float(z)
return (( x, 0.0, 0.0, 0.0),
(0.0, y, 0.0, 0.0),
(0.0, 0.0, z, 0.0),
(0.0, 0.0, 0.0, 1.0))
def fromscaleN(n):
return fromscale((n,n,n))
def fromortho(left,right,bottom,top,znear,zfar):
m0= ( 2.0/(right-left), 0.0, 0.0, 0.0)
m1= (0.0, 2.0/(top-bottom), 0.0, 0.0)
m2= (0.0, 0.0, -2.0/(zfar-znear), 0.0)
m3= ( -((right+left)/(right-left)),
-((top+bottom)/(top-bottom)),
-((zfar+znear)/(zfar-znear)),
1.0)
return (m0,m1,m2,m3)
def mulN(m,N):
return tuple([vec4.mulN(v,N) for v in m])
def mul(a,b):
b_trans= zip(* b)
return tuple([transmulvec4(b_trans, a_r) for a_r in a])
# multiple vector v by a transposed matrix
def transmulvec4(m_trans,v):
return tuple([vec4.dot(v, m_c) for m_c in m_trans])
def mulvec4(m,v):
return transmulvec4(zip(* m), v)
def trans(m):
((m00,m01,m02,m03),
(m10,m11,m12,m13),
(m20,m21,m22,m23),
(m30,m31,m32,m33))= m
return ( (m00,m10,m20,m30),
(m01,m11,m21,m31),
(m02,m12,m22,m32),
(m03,m13,m23,m33))
def det(m):
((m00,m01,m02,m03),
(m10,m11,m12,m13),
(m20,m21,m22,m23),
(m30,m31,m32,m33))= m
a= m00 * mat3.det( ((m11, m12, m13),
(m21, m22, m23),
(m31, m32, m33)) );
b= m10 * mat3.det( ((m01, m02, m03),
(m21, m22, m23),
(m31, m32, m33)) );
c= m20 * mat3.det( ((m01, m02, m03),
(m11, m12, m13),
(m31, m32, m33)) );
d= m30 * mat3.det( ((m01, m02, m03),
(m11, m12, m13),
(m21, m22, m23)) );
return a-b+c-d;
def adj(m):
((m00,m01,m02,m03),
(m10,m11,m12,m13),
(m20,m21,m22,m23),
(m30,m31,m32,m33))= m
t00= mat3.det( ((m11, m12, m13),
(m21, m22, m23),
(m31, m32, m33)) )
t01= -mat3.det( ((m10, m12, m13),
(m20, m22, m23),
(m30, m32, m33)) )
t02= mat3.det( ((m10, m11, m13),
(m20, m21, m23),
(m30, m31, m33)) )
t03= -mat3.det( ((m10, m11, m12),
(m20, m21, m22),
(m30, m31, m32)) )
t10= -mat3.det( ((m01, m02, m03),
(m21, m22, m23),
(m31, m32, m33)) )
t11= mat3.det( ((m00, m02, m03),
(m20, m22, m23),
(m30, m32, m33)) )
t12= -mat3.det( ((m00, m01, m03),
(m20, m21, m23),
(m30, m31, m33)) )
t13= mat3.det( ((m00, m01, m02),
(m20, m21, m22),
(m30, m31, m32)) )
t20= mat3.det( ((m01, m02, m03),
(m11, m12, m13),
(m31, m32, m33)) )
t21= -mat3.det( ((m00, m02, m03),
(m10, m12, m13),
(m30, m32, m33)) )
t22= mat3.det( ((m00, m01, m03),
(m10, m11, m13),
(m30, m31, m33)) )
t23= -mat3.det( ((m00, m01, m02),
(m10, m11, m12),
(m30, m31, m32)) )
t30= -mat3.det( ((m01, m02, m03),
(m11, m12, m13),
(m21, m22, m23)) )
t31= mat3.det( ((m00, m02, m03),
(m10, m12, m13),
(m20, m22, m23)) )
t32= -mat3.det( ((m00, m01, m03),
(m10, m11, m13),
(m20, m21, m23)) )
t33= mat3.det( ((m00, m01, m02),
(m10, m11, m12),
(m20, m21, m22)) )
return ((t00,t01,t02,t03),
(t10,t11,t12,t13),
(t20,t21,t22,t23),
(t30,t31,t32,t33))
def inv(m):
d= det(m)
t= trans(adj(m))
v= 1.0/d
return tuple([(a*v,b*v,c*v,d*v) for a,b,c,d in t])
def toGL(m):
m0,m1,m2,m3= m
return m0+m1+m2+m3