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