1 // Copyright Contributors to the Open Shading Language project.
2 // SPDX-License-Identifier: BSD-3-Clause
3 // https://github.com/AcademySoftwareFoundation/OpenShadingLanguage
4 //
5 // MaterialX specification (c) 2017 Lucasfilm Ltd.
6 // http://www.materialx.org/
7
8 #pragma once
9 #define MATRIX33_H
10
11
12 struct matrix33
13 {
14 matrix m;
15 };
16
isValidAs33(matrix m44)17 int isValidAs33(matrix m44)
18 {
19 return m44[0][3] == 0 &&
20 m44[1][3] == 0 &&
21 m44[2][3] == 0 &&
22 m44[3][0] == 0 &&
23 m44[3][1] == 0 &&
24 m44[3][2] == 0 &&
25 m44[3][3] == 1;
26 }
27
matrix33To44(matrix33 m33)28 matrix matrix33To44 (matrix33 m33)
29 {
30 return m33.m;
31 }
32
33 // Convert an arbitrary m44 to m33 by removing the translation
34 //QUESTION: should we check if it's valid to represent the 4x4 as a 3x3?
matrix44To33(matrix m44)35 matrix33 matrix44To33 (matrix m44)
36 {
37 matrix33 m33;
38 m33.m = m44;
39 m33.m[0][3] = 0;
40 m33.m[1][3] = 0;
41 m33.m[2][3] = 0;
42 m33.m[3][0] = 0;
43 m33.m[3][1] = 0;
44 m33.m[3][2] = 0;
45 m33.m[3][3] = 1;
46
47 return m33;
48 }
49
__operator__neg__(matrix33 a)50 matrix33 __operator__neg__(matrix33 a)
51 {
52 matrix33 m33;
53 m33.m = -a.m;
54 return m33;
55 }
56
57
__operator__mul__(int a,matrix33 b)58 matrix33 __operator__mul__(int a, matrix33 b)
59 {
60 matrix33 m33;
61 m33.m = a * b.m;
62 return m33;
63 }
64
__operator__mul__(float a,matrix33 b)65 matrix33 __operator__mul__(float a, matrix33 b)
66 {
67 matrix33 m33;
68 m33.m = a * b.m;
69 return m33;
70 }
71
__operator__mul__(matrix33 a,int b)72 matrix33 __operator__mul__(matrix33 a, int b)
73 {
74 matrix33 m33;
75 m33.m = a.m * b;
76 return m33;
77 }
78
__operator__mul__(matrix33 a,float b)79 matrix33 __operator__mul__(matrix33 a, float b)
80 {
81 matrix33 m33;
82 m33.m = a.m * b;
83 return m33;
84 }
85
__operator__mul__(matrix33 a,matrix33 b)86 matrix33 __operator__mul__(matrix33 a, matrix33 b)
87 {
88 matrix33 m33;
89 m33.m = a.m * b.m;
90 return m33;
91 }
92
__operator__div__(int a,matrix33 b)93 matrix33 __operator__div__(int a, matrix33 b)
94 {
95 matrix33 m33;
96 m33.m = a / b.m;
97 return m33;
98 }
99
__operator__div__(float a,matrix33 b)100 matrix33 __operator__div__(float a, matrix33 b)
101 {
102 matrix33 m33;
103 m33.m = a / b.m;
104 return m33;
105 }
106
__operator__div__(matrix33 a,int b)107 matrix33 __operator__div__(matrix33 a, int b)
108 {
109 matrix33 m33;
110 m33.m = a.m / b;
111 return m33;
112 }
113
__operator__div__(matrix33 a,float b)114 matrix33 __operator__div__(matrix33 a, float b)
115 {
116 matrix33 m33;
117 m33.m = a.m / b;
118 return m33;
119 }
120
__operator__div__(matrix33 a,matrix33 b)121 matrix33 __operator__div__(matrix33 a, matrix33 b)
122 {
123 matrix33 m33;
124 m33.m = a.m / b.m;
125 return m33;
126 }
127
__operator__eq__(matrix33 a,matrix33 b)128 int __operator__eq__(matrix33 a, matrix33 b)
129 {
130 return a.m == b.m;
131 }
132
__operator__ne__(matrix33 a,matrix33 b)133 int __operator__ne__(matrix33 a, matrix33 b)
134 {
135 return a.m != b.m;
136 }
137
determinant(matrix33 a)138 float determinant (matrix33 a)
139 {
140 return determinant(a.m);
141 }
142
transpose(matrix33 a)143 matrix33 transpose(matrix33 a)
144 {
145 matrix33 m33;
146 m33.m = transpose(a.m);
147 return m33;
148 }
149
transform(matrix33 a,point b)150 point transform(matrix33 a, point b)
151 {
152 return transform(a.m, b);
153 }
154
transform(matrix33 a,vector b)155 vector transform(matrix33 a, vector b)
156 {
157 return transform(a.m, b);
158 }
159
transform(matrix33 a,normal b)160 normal transform(matrix33 a, normal b)
161 {
162 return transform(a.m, b);
163 }
164
165
166
167