1
1
/* *
2
2
Copyright 2013 BlackBerry Inc.
3
+ Copyright (c) 2019-present Axmol Engine contributors (see AUTHORS.md).
3
4
4
5
Licensed under the Apache License, Version 2.0 (the "License");
5
6
you may not use this file except in compliance with the License.
@@ -24,24 +25,20 @@ class MathUtilC
24
25
{
25
26
public:
26
27
inline static void addMatrix (const float * m, float scalar, float * dst);
27
-
28
28
inline static void addMatrix (const float * m1, const float * m2, float * dst);
29
-
30
29
inline static void subtractMatrix (const float * m1, const float * m2, float * dst);
31
-
32
30
inline static void multiplyMatrix (const float * m, float scalar, float * dst);
33
-
34
31
inline static void multiplyMatrix (const float * m1, const float * m2, float * dst);
35
-
32
+
36
33
inline static void negateMatrix (const float * m, float * dst);
37
-
38
34
inline static void transposeMatrix (const float * m, float * dst);
39
-
35
+
40
36
inline static void transformVec4 (const float * m, float x, float y, float z, float w, float * dst);
41
-
42
37
inline static void transformVec4 (const float * m, const float * v, float * dst);
43
-
44
38
inline static void crossVec3 (const float * v1, const float * v2, float * dst);
39
+
40
+ inline static void transformVertices (V3F_C4B_T2F* dst, const V3F_C4B_T2F* src, size_t count, const Mat4& transform);
41
+ inline static void transformIndices (uint16_t * dst, const uint16_t * src, size_t count, uint16_t offset);
45
42
};
46
43
47
44
inline void MathUtilC::addMatrix (const float * m, float scalar, float * dst)
@@ -128,27 +125,27 @@ inline void MathUtilC::multiplyMatrix(const float* m1, const float* m2, float* d
128
125
{
129
126
// Support the case where m1 or m2 is the same array as dst.
130
127
float product[16 ];
131
-
128
+
132
129
product[0 ] = m1[0 ] * m2[0 ] + m1[4 ] * m2[1 ] + m1[8 ] * m2[2 ] + m1[12 ] * m2[3 ];
133
130
product[1 ] = m1[1 ] * m2[0 ] + m1[5 ] * m2[1 ] + m1[9 ] * m2[2 ] + m1[13 ] * m2[3 ];
134
131
product[2 ] = m1[2 ] * m2[0 ] + m1[6 ] * m2[1 ] + m1[10 ] * m2[2 ] + m1[14 ] * m2[3 ];
135
132
product[3 ] = m1[3 ] * m2[0 ] + m1[7 ] * m2[1 ] + m1[11 ] * m2[2 ] + m1[15 ] * m2[3 ];
136
-
133
+
137
134
product[4 ] = m1[0 ] * m2[4 ] + m1[4 ] * m2[5 ] + m1[8 ] * m2[6 ] + m1[12 ] * m2[7 ];
138
135
product[5 ] = m1[1 ] * m2[4 ] + m1[5 ] * m2[5 ] + m1[9 ] * m2[6 ] + m1[13 ] * m2[7 ];
139
136
product[6 ] = m1[2 ] * m2[4 ] + m1[6 ] * m2[5 ] + m1[10 ] * m2[6 ] + m1[14 ] * m2[7 ];
140
137
product[7 ] = m1[3 ] * m2[4 ] + m1[7 ] * m2[5 ] + m1[11 ] * m2[6 ] + m1[15 ] * m2[7 ];
141
-
138
+
142
139
product[8 ] = m1[0 ] * m2[8 ] + m1[4 ] * m2[9 ] + m1[8 ] * m2[10 ] + m1[12 ] * m2[11 ];
143
140
product[9 ] = m1[1 ] * m2[8 ] + m1[5 ] * m2[9 ] + m1[9 ] * m2[10 ] + m1[13 ] * m2[11 ];
144
141
product[10 ] = m1[2 ] * m2[8 ] + m1[6 ] * m2[9 ] + m1[10 ] * m2[10 ] + m1[14 ] * m2[11 ];
145
142
product[11 ] = m1[3 ] * m2[8 ] + m1[7 ] * m2[9 ] + m1[11 ] * m2[10 ] + m1[15 ] * m2[11 ];
146
-
143
+
147
144
product[12 ] = m1[0 ] * m2[12 ] + m1[4 ] * m2[13 ] + m1[8 ] * m2[14 ] + m1[12 ] * m2[15 ];
148
145
product[13 ] = m1[1 ] * m2[12 ] + m1[5 ] * m2[13 ] + m1[9 ] * m2[14 ] + m1[13 ] * m2[15 ];
149
146
product[14 ] = m1[2 ] * m2[12 ] + m1[6 ] * m2[13 ] + m1[10 ] * m2[14 ] + m1[14 ] * m2[15 ];
150
147
product[15 ] = m1[3 ] * m2[12 ] + m1[7 ] * m2[13 ] + m1[11 ] * m2[14 ] + m1[15 ] * m2[15 ];
151
-
148
+
152
149
memcpy (dst, product, MATRIX_SIZE);
153
150
}
154
151
@@ -197,7 +194,7 @@ inline void MathUtilC::transformVec4(const float* m, const float* v, float* dst)
197
194
float y = v[0 ] * m[1 ] + v[1 ] * m[5 ] + v[2 ] * m[9 ] + v[3 ] * m[13 ];
198
195
float z = v[0 ] * m[2 ] + v[1 ] * m[6 ] + v[2 ] * m[10 ] + v[3 ] * m[14 ];
199
196
float w = v[0 ] * m[3 ] + v[1 ] * m[7 ] + v[2 ] * m[11 ] + v[3 ] * m[15 ];
200
-
197
+
201
198
dst[0 ] = x;
202
199
dst[1 ] = y;
203
200
dst[2 ] = z;
@@ -209,10 +206,39 @@ inline void MathUtilC::crossVec3(const float* v1, const float* v2, float* dst)
209
206
float x = (v1[1 ] * v2[2 ]) - (v1[2 ] * v2[1 ]);
210
207
float y = (v1[2 ] * v2[0 ]) - (v1[0 ] * v2[2 ]);
211
208
float z = (v1[0 ] * v2[1 ]) - (v1[1 ] * v2[0 ]);
212
-
209
+
213
210
dst[0 ] = x;
214
211
dst[1 ] = y;
215
212
dst[2 ] = z;
216
213
}
217
214
215
+ inline void MathUtilC::transformVertices (V3F_C4B_T2F* dst, const V3F_C4B_T2F* src, size_t count, const Mat4& transform)
216
+ {
217
+ auto end = dst + count;
218
+ auto t = transform; // Make copy for better aliasing inference
219
+ auto m = t.m ;
220
+
221
+ while (dst < end)
222
+ {
223
+ auto pos = src->vertices ;
224
+ dst->vertices .x = pos.x * m[0 ] + pos.y * m[4 ] + pos.z * m[8 ] + m[12 ];
225
+ dst->vertices .y = pos.x * m[1 ] + pos.y * m[5 ] + pos.z * m[9 ] + m[13 ];
226
+ dst->vertices .z = pos.x * m[2 ] + pos.y * m[6 ] + pos.z * m[10 ] + m[14 ];
227
+ memcpy (&dst->colors , &src->colors , sizeof (dst->colors ) + sizeof (dst->texCoords ));
228
+ ++dst;
229
+ ++src;
230
+ }
231
+ }
232
+
233
+ inline void MathUtilC::transformIndices (uint16_t * dst, const uint16_t * src, size_t count, uint16_t offset)
234
+ {
235
+ auto end = dst + count;
236
+ while (dst < end)
237
+ {
238
+ *dst = *src + offset;
239
+ ++dst;
240
+ ++src;
241
+ }
242
+ }
243
+
218
244
NS_AX_MATH_END
0 commit comments