summaryrefslogtreecommitdiff
path: root/src/matrix.h
blob: a3e480bdb507ca3ee230768d6d7b0bef9a1d27f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; backg
#ifndef __MATRIX_H__
#define __MATRIX_H__

struct Matrix
{
	float a00, a01, a02, a10, a11, a12, a20, a21, a22;
};

__device__ __host__ Matrix make_matrix(float a00, float a01, float a02,
				       float a10, float a11, float a12,
				       float a20, float a21, float a22)
{
	Matrix m = {a00, a01, a02, a10, a11, a12, a20, a21, a22};
	return m;
}

__device__ __host__ Matrix make_matrix(const float3 &u1, const float3 &u2, const float3 &u3)
{
	Matrix m = {u1.x, u2.x, u3.x, u1.y, u2.y, u3.y, u1.z, u2.z, u3.z};
	return m;
}

__device__ __host__ Matrix operator- (const Matrix &m)
{
	return make_matrix(-m.a00, -m.a01, -m.a02,
			   -m.a10, -m.a11, -m.a12,
			   -m.a20, -m.a21, -m.a22);
}

__device__ __host__ float3 operator* (const Matrix &m, const float3 &a)
{
	return make_float3(m.a00*a.x + m.a01*a.y + m.a02*a.z,
			   m.a10*a.x + m.a11*a.y + m.a12*a.z,
			   m.a20*a.x + m.a21*a.y + m.a22*a.z);
}

__device__ __host__ Matrix operator+ (const Matrix &m, const Matrix &n)
{
	return make_matrix(m.a00+n.a00, m.a01+n.a01, m.a02+n.a02,
			   m.a10+n.a10, m.a11+n.a11, m.a12+n.a12,
			   m.a20+n.a20, m.a21+n.a21, m.a22+n.a22);
}

__device__ __host__ void operator+= (Matrix &m, const Matrix &n)
{
	m.a00 += n.a00;
	m.a01 += n.a01;
	m.a02 += n.a02;
	m.a10 += n.a10;
	m.a11 += n.a11;
	m.a12 += n.a12;
	m.a20 += n.a20;
	m.a21 += n.a21;
	m.a22 += n.a22;
}

__device__ __host__ Matrix operator- (const Matrix &m, const Matrix &n)
{
	return make_matrix(m.a00-n.a00, m.a01-n.a01, m.a02-n.a02,
			   m.a10-n.a10, m.a11-n.a11, m.a12-n.a12,
			   m.a20-n.a20, m.a21-n.a21, m.a22-n.a22);
}

__device__ __host__ void operator-= (Matrix &m, const Matrix& n)
{
	m.a00 -= n.a00;
	m.a01 -= n.a01;
	m.a02 -= n.a02;
	m.a10 -= n.a10;
	m.a11 -= n.a11;
	m.a12 -= n.a12;
	m.a20 -= n.a20;
	m.a21 -= n.a21;
	m.a22 -= n.a22;
}

__device__ __host__ Matrix operator* (const Matrix &m, const Matrix &n)
{
	return make_matrix(m.a00*n.a00 + m.a01*n.a10 + m.a02*n.a20,
			   m.a00*n.a01 + m.a01*n.a11 + m.a02*n.a21,
			   m.a00*n.a02 + m.a01*n.a12 + m.a02*n.a22,
			   m.a10*n.a00 + m.a11*n.a10 + m.a12*n.a20,
			   m.a10*n.a01 + m.a11*n.a11 + m.a12*n.a21,
			   m.a10*n.a02 + m.a11*n.a12 + m.a12*n.a22,
			   m.a20*n.a00 + m.a21*n.a10 + m.a22*n.a20,
			   m.a20*n.a01 + m.a21*n.a11 + m.a22*n.a21,
			   m.a20*n.a02 + m.a21*n.a12 + m.a22*n.a22);
}

__device__ __host__ Matrix operator+ (const Matrix &m, const float &c)
{
	return make_matrix(m.a00+c, m.a01+c, m.a02+c,
			   m.a10+c, m.a11+c, m.a12+c,
			   m.a20+c, m.a21+c, m.a22+c);
}

__device__ __host__ void operator+= (Matrix &m, const float &c)
{
	m.a00 += c;
	m.a01 += c;
	m.a02 += c;
	m.a10 += c;
	m.a11 += c;
	m.a12 += c;
	m.a20 += c;
	m.a21 += c;
	m.a22 += c;
}

__device__ __host__ Matrix operator+ (const float &c, const Matrix &m)
{
	return make_matrix(c+m.a00, c+m.a01, c+m.a02,
			   c+m.a10, c+m.a11, c+m.a12,
			   c+m.a20, c+m.a21, c+m.a22);
}

__device__ __host__ Matrix operator- (const Matrix &m, const float &c)
{
	return make_matrix(m.a00-c, m.a01-c, m.a02-c,
			   m.a10-c, m.a11-c, m.a12-c,
			   m.a20-c, m.a21-c, m.a22-c);
}

__device__ __host__ void operator-= (Matrix &m, const float &c)
{
	m.a00 -= c;
	m.a01 -= c;
	m.a02 -= c;
	m.a10 -= c;
	m.a11 -= c;
	m.a12 -= c;
	m.a20 -= c;
	m.a21 -= c;
	m.a22 -= c;
}

__device__ __host__ Matrix operator- (const float &c, const Matrix &m)
{
	return make_matrix(c-m.a00, c-m.a01, c-m.a02,
			   c-m.a10, c-m.a11, c-m.a12,
			   c-m.a20, c-m.a21, c-m.a22);
}

__device__ __host__ Matrix operator* (const Matrix &m, const float &c)
{
	return make_matrix(m.a00*c, m.a01*c, m.a02*c,
			   m.a10*c, m.a11*c, m.a12*c,
			   m.a20*c, m.a21*c, m.a22*c);
}

__device__ __host__ void operator*= (Matrix &m, const float &c)
{
	m.a00 *= c;
	m.a01 *= c;
	m.a02 *= c;
	m.a10 *= c;
	m.a11 *= c;
	m.a12 *= c;
	m.a20 *= c;
	m.a21 *= c;
	m.a22 *= c;
}

__device__ __host__ Matrix operator* (const float &c, const Matrix &m)
{
	return make_matrix(c*m.a00, c*m.a01, c*m.a02,
			   c*m.a10, c*m.a11, c*m.a12,
			   c*m.a20, c*m.a21, c*m.a22);
}

__device__ __host__ Matrix operator/ (const Matrix &m, const float &c)
{
	return make_matrix(m.a00/c, m.a01/c, m.a02/c,
			   m.a10/c, m.a11/c, m.a12/c,
			   m.a20/c, m.a21/c, m.a22/c);
}

__device__ __host__ void operator/= (Matrix &m, const float &c)
{
	m.a00 /= c;
	m.a01 /= c;
	m.a02 /= c;
	m.a10 /= c;
	m.a11 /= c;
	m.a12 /= c;
	m.a20 /= c;
	m.a21 /= c;
	m.a22 /= c;
}

__device__ __host__ Matrix operator/ (const float &c, const Matrix &m)
{
	return make_matrix(c/m.a00, c/m.a01, c/m.a02,
			   c/m.a10, c/m.a11, c/m.a12,
			   c/m.a20, c/m.a21, c/m.a22);
}

__device__ __host__ float det(const Matrix &m)
{
	return m.a00*(m.a11*m.a22 - m.a12*m.a21) - m.a10*(m.a01*m.a22 - m.a02*m.a21) + m.a20*(m.a01*m.a12 - m.a02*m.a11);
}

__device__ __host__ Matrix inv(const Matrix &m)
{
	return make_matrix(m.a11*m.a22 - m.a12*m.a21,
			   m.a02*m.a21 - m.a01*m.a22,
			   m.a01*m.a12 - m.a02*m.a11,
			   m.a12*m.a20 - m.a10*m.a22,
			   m.a00*m.a22 - m.a02*m.a20,
			   m.a02*m.a10 - m.a00*m.a12,
			   m.a10*m.a21 - m.a11*m.a20,
			   m.a01*m.a20 - m.a00*m.a21,
			   m.a00*m.a11 - m.a01*m.a10)/det(m);
}

__device__ __host__ Matrix outer(const float3 &a, const float3 &b)
{
	return make_matrix(a.x*b.x, a.x*b.y, a.x*b.z,
			   a.y*b.x, a.y*b.y, a.y*b.z,
			   a.z*b.x, a.z*b.y, a.z*b.z);
}

#endif