summaryrefslogtreecommitdiff
path: root/src/common/math_util.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2014-04-08 19:25:03 -0400
committerGravatar bunnei2014-04-08 19:25:03 -0400
commit63e46abdb8764bc97e91bae862c8d461e61b1965 (patch)
treee73f4aa25d7b4015a265e7bbfb6004dab7561027 /src/common/math_util.cpp
parentfixed some license headers that I missed (diff)
downloadyuzu-63e46abdb8764bc97e91bae862c8d461e61b1965.tar.gz
yuzu-63e46abdb8764bc97e91bae862c8d461e61b1965.tar.xz
yuzu-63e46abdb8764bc97e91bae862c8d461e61b1965.zip
got rid of 'src' folders in each sub-project
Diffstat (limited to 'src/common/math_util.cpp')
-rw-r--r--src/common/math_util.cpp212
1 files changed, 212 insertions, 0 deletions
diff --git a/src/common/math_util.cpp b/src/common/math_util.cpp
new file mode 100644
index 000000000..da90f8d74
--- /dev/null
+++ b/src/common/math_util.cpp
@@ -0,0 +1,212 @@
1// Copyright 2013 Dolphin Emulator Project
2// Licensed under GPLv2
3// Refer to the license.txt file included.
4
5
6#include "common.h"
7#include "math_util.h"
8
9#include <cmath>
10#include <numeric>
11
12namespace MathUtil
13{
14
15u32 ClassifyDouble(double dvalue)
16{
17 // TODO: Optimize the below to be as fast as possible.
18 IntDouble value;
19 value.d = dvalue;
20 u64 sign = value.i & DOUBLE_SIGN;
21 u64 exp = value.i & DOUBLE_EXP;
22 if (exp > DOUBLE_ZERO && exp < DOUBLE_EXP)
23 {
24 // Nice normalized number.
25 return sign ? PPC_FPCLASS_NN : PPC_FPCLASS_PN;
26 }
27 else
28 {
29 u64 mantissa = value.i & DOUBLE_FRAC;
30 if (mantissa)
31 {
32 if (exp)
33 {
34 return PPC_FPCLASS_QNAN;
35 }
36 else
37 {
38 // Denormalized number.
39 return sign ? PPC_FPCLASS_ND : PPC_FPCLASS_PD;
40 }
41 }
42 else if (exp)
43 {
44 //Infinite
45 return sign ? PPC_FPCLASS_NINF : PPC_FPCLASS_PINF;
46 }
47 else
48 {
49 //Zero
50 return sign ? PPC_FPCLASS_NZ : PPC_FPCLASS_PZ;
51 }
52 }
53}
54
55u32 ClassifyFloat(float fvalue)
56{
57 // TODO: Optimize the below to be as fast as possible.
58 IntFloat value;
59 value.f = fvalue;
60 u32 sign = value.i & FLOAT_SIGN;
61 u32 exp = value.i & FLOAT_EXP;
62 if (exp > FLOAT_ZERO && exp < FLOAT_EXP)
63 {
64 // Nice normalized number.
65 return sign ? PPC_FPCLASS_NN : PPC_FPCLASS_PN;
66 }
67 else
68 {
69 u32 mantissa = value.i & FLOAT_FRAC;
70 if (mantissa)
71 {
72 if (exp)
73 {
74 return PPC_FPCLASS_QNAN; // Quiet NAN
75 }
76 else
77 {
78 // Denormalized number.
79 return sign ? PPC_FPCLASS_ND : PPC_FPCLASS_PD;
80 }
81 }
82 else if (exp)
83 {
84 // Infinite
85 return sign ? PPC_FPCLASS_NINF : PPC_FPCLASS_PINF;
86 }
87 else
88 {
89 //Zero
90 return sign ? PPC_FPCLASS_NZ : PPC_FPCLASS_PZ;
91 }
92 }
93}
94
95
96} // namespace
97
98inline void MatrixMul(int n, const float *a, const float *b, float *result)
99{
100 for (int i = 0; i < n; ++i)
101 {
102 for (int j = 0; j < n; ++j)
103 {
104 float temp = 0;
105 for (int k = 0; k < n; ++k)
106 {
107 temp += a[i * n + k] * b[k * n + j];
108 }
109 result[i * n + j] = temp;
110 }
111 }
112}
113
114// Calculate sum of a float list
115float MathFloatVectorSum(const std::vector<float>& Vec)
116{
117 return std::accumulate(Vec.begin(), Vec.end(), 0.0f);
118}
119
120void Matrix33::LoadIdentity(Matrix33 &mtx)
121{
122 memset(mtx.data, 0, sizeof(mtx.data));
123 mtx.data[0] = 1.0f;
124 mtx.data[4] = 1.0f;
125 mtx.data[8] = 1.0f;
126}
127
128void Matrix33::RotateX(Matrix33 &mtx, float rad)
129{
130 float s = sin(rad);
131 float c = cos(rad);
132 memset(mtx.data, 0, sizeof(mtx.data));
133 mtx.data[0] = 1;
134 mtx.data[4] = c;
135 mtx.data[5] = -s;
136 mtx.data[7] = s;
137 mtx.data[8] = c;
138}
139void Matrix33::RotateY(Matrix33 &mtx, float rad)
140{
141 float s = sin(rad);
142 float c = cos(rad);
143 memset(mtx.data, 0, sizeof(mtx.data));
144 mtx.data[0] = c;
145 mtx.data[2] = s;
146 mtx.data[4] = 1;
147 mtx.data[6] = -s;
148 mtx.data[8] = c;
149}
150
151void Matrix33::Multiply(const Matrix33 &a, const Matrix33 &b, Matrix33 &result)
152{
153 MatrixMul(3, a.data, b.data, result.data);
154}
155
156void Matrix33::Multiply(const Matrix33 &a, const float vec[3], float result[3])
157{
158 for (int i = 0; i < 3; ++i) {
159 result[i] = 0;
160 for (int k = 0; k < 3; ++k) {
161 result[i] += a.data[i * 3 + k] * vec[k];
162 }
163 }
164}
165
166void Matrix44::LoadIdentity(Matrix44 &mtx)
167{
168 memset(mtx.data, 0, sizeof(mtx.data));
169 mtx.data[0] = 1.0f;
170 mtx.data[5] = 1.0f;
171 mtx.data[10] = 1.0f;
172 mtx.data[15] = 1.0f;
173}
174
175void Matrix44::LoadMatrix33(Matrix44 &mtx, const Matrix33 &m33)
176{
177 for (int i = 0; i < 3; ++i)
178 {
179 for (int j = 0; j < 3; ++j)
180 {
181 mtx.data[i * 4 + j] = m33.data[i * 3 + j];
182 }
183 }
184
185 for (int i = 0; i < 3; ++i)
186 {
187 mtx.data[i * 4 + 3] = 0;
188 mtx.data[i + 12] = 0;
189 }
190 mtx.data[15] = 1.0f;
191}
192
193void Matrix44::Set(Matrix44 &mtx, const float mtxArray[16])
194{
195 for(int i = 0; i < 16; ++i) {
196 mtx.data[i] = mtxArray[i];
197 }
198}
199
200void Matrix44::Translate(Matrix44 &mtx, const float vec[3])
201{
202 LoadIdentity(mtx);
203 mtx.data[3] = vec[0];
204 mtx.data[7] = vec[1];
205 mtx.data[11] = vec[2];
206}
207
208void Matrix44::Multiply(const Matrix44 &a, const Matrix44 &b, Matrix44 &result)
209{
210 MatrixMul(4, a.data, b.data, result.data);
211}
212