12GX_CORE_NAMESPACE_BEGIN()
14#if defined(GX_USE_SSE2)
15#define SPLATX(v) _mm_shuffle_ps(v, v, _MM_SHUFFLE(0,0,0,0))
16#define SPLATY(v) _mm_shuffle_ps(v, v, _MM_SHUFFLE(1,1,1,1))
17#define SPLATZ(v) _mm_shuffle_ps(v, v, _MM_SHUFFLE(2,2,2,2))
18#define SPLATW(v) _mm_shuffle_ps(v, v, _MM_SHUFFLE(3,3,3,3))
21inline __m128 _mm_rcp_ps_22bit( __m128 a )
24 __m128 xm1 = _mm_rcp_ps(xm0);
25 xm0 = _mm_mul_ps( _mm_mul_ps( xm0, xm1 ), xm1 );
26 xm1 = _mm_add_ps( xm1, xm1 );
27 return _mm_sub_ps( xm1, xm0 );
52 _m[0][0] = matrix.
_m[0][0];
53 _m[0][1] = matrix.
_m[0][1];
55 _m[1][0] = matrix.
_m[1][0];
56 _m[1][1] = matrix.
_m[1][1];
164 return ((
_m[0][0] == matrix.
_m[0][0]) && (
_m[0][1] == matrix.
_m[0][1]))
165 && ((
_m[1][0] == matrix.
_m[1][0]) && (
_m[1][1] == matrix.
_m[1][1]));
175 return !(*
this == matrix);
197 GX_ASSERT(row < 2,
"指定された行数が大きすぎます(%d)", row);
198 return *
reinterpret_cast<const GxVector2*
>(&
_m[row][0]);
209 GX_ASSERT(row < 2,
"指定された行数が大きすぎます(%d)", row);
210 _m[row][0] = vector.
_x;
211 _m[row][1] = vector.
_y;
221 GX_ASSERT(column < 2,
"指定された列数が大きすぎます(%d)", column);
233 GX_ASSERT(column < 2,
"指定された列数が大きすぎます(%d)", column);
234 _m[0][column] = vector.
_x;
235 _m[1][column] = vector.
_y;
246 GX_ASSERT(row < 2,
"指定された行数が大きすぎます(%d)", row);
247 GX_ASSERT(column < 2,
"指定された列数が大きすぎます(%d)", column);
248 return _m[row][column];
260 GX_ASSERT(row < 2,
"指定された行数が大きすぎます(%d)", row);
261 GX_ASSERT(column < 2,
"指定された列数が大きすぎます(%d)", column);
262 _m[row][column] = value;
273 GX_ASSERT(row < 2,
"指定された行数が大きすぎます(%d)", row);
274 GX_ASSERT(column < 2,
"指定された列数が大きすぎます(%d)", column);
275 return _m[row][column];
286 GX_ASSERT(row < 2,
"指定された行数が大きすぎます(%d)", row);
287 GX_ASSERT(column < 2,
"指定された列数が大きすぎます(%d)", column);
288 return _m[row][column];
297 return _m[0][0] *
_m[1][1] -
_m[1][0] *
_m[0][1];
329 dst.
_m[0][0] = matrix.
_m[0][0] * scalar;
330 dst.
_m[0][1] = matrix.
_m[0][1] * scalar;
332 dst.
_m[1][0] = matrix.
_m[1][0] * scalar;
333 dst.
_m[1][1] = matrix.
_m[1][1] * scalar;
347 auto invScalar = 1.0f / scalar;
349 dst.
_m[0][0] = matrix.
_m[0][0] * invScalar;
350 dst.
_m[0][1] = matrix.
_m[0][1] * invScalar;
352 dst.
_m[1][0] = matrix.
_m[1][0] * invScalar;
353 dst.
_m[1][1] = matrix.
_m[1][1] * invScalar;
367 dst.
_m[0][0] = matrix0.
_m[0][0] + matrix1.
_m[0][0];
368 dst.
_m[0][1] = matrix0.
_m[0][1] + matrix1.
_m[0][1];
370 dst.
_m[1][0] = matrix0.
_m[1][0] + matrix1.
_m[1][0];
371 dst.
_m[1][1] = matrix0.
_m[1][1] + matrix1.
_m[1][1];
386 const auto m00 = matrix0.
_m[0][0] * matrix1.
_m[0][0] + matrix0.
_m[0][1] * matrix1.
_m[1][0];
387 const auto m01 = matrix0.
_m[0][0] * matrix1.
_m[0][1] + matrix0.
_m[0][1] * matrix1.
_m[1][1];
389 const auto m10 = matrix0.
_m[1][0] * matrix1.
_m[0][0] + matrix0.
_m[1][1] * matrix1.
_m[1][0];
390 const auto m11 = matrix0.
_m[1][0] * matrix1.
_m[0][1] + matrix0.
_m[1][1] * matrix1.
_m[1][1];
409 const auto m00 = matrix.
_m[1][1];
410 const auto m01 =-matrix.
_m[0][1];
412 const auto m10 =-matrix.
_m[1][0];
413 const auto m11 = matrix.
_m[0][0];
417 dst.
_m[0][0] = m00 * d;
418 dst.
_m[0][1] = m01 * d;
420 dst.
_m[1][0] = m10 * d;
421 dst.
_m[1][1] = m11 * d;
434 const auto m00 = matrix.
_m[0][0];
435 const auto m01 = matrix.
_m[1][0];
437 const auto m10 = matrix.
_m[0][1];
438 const auto m11 = matrix.
_m[1][1];
472 auto invScalar = 1.0f / scalar;
474 _m[0][0] *= invScalar;
475 _m[0][1] *= invScalar;
477 _m[1][0] *= invScalar;
478 _m[1][1] *= invScalar;
490 _m[0][0] += matrix.
_m[0][0];
491 _m[0][1] += matrix.
_m[0][1];
493 _m[1][0] += matrix.
_m[1][0];
494 _m[1][1] += matrix.
_m[1][1];
506 const auto m00 =
_m[0][0] * matrix.
_m[0][0] +
_m[0][1] * matrix.
_m[1][0];
507 const auto m01 =
_m[0][0] * matrix.
_m[0][1] +
_m[0][1] * matrix.
_m[1][1];
509 const auto m10 =
_m[1][0] * matrix.
_m[0][0] +
_m[1][1] * matrix.
_m[1][0];
510 const auto m11 =
_m[1][0] * matrix.
_m[0][1] +
_m[1][1] * matrix.
_m[1][1];
527 const auto m00 =
_m[1][1];
528 const auto m01 =-
_m[0][1];
530 const auto m10 =-
_m[1][0];
531 const auto m11 =
_m[0][0];
550 const auto m00 =
_m[0][0];
551 const auto m01 =
_m[1][0];
553 const auto m10 =
_m[0][1];
554 const auto m11 =
_m[1][1];
572 f32 m10, f32 m11, f32 m12,
573 f32 m20, f32 m21, f32 m22)
594 _m[0][0] = matrix.
_m[0][0];
595 _m[0][1] = matrix.
_m[0][1];
596 _m[0][2] = matrix.
_m[0][2];
598 _m[1][0] = matrix.
_m[1][0];
599 _m[1][1] = matrix.
_m[1][1];
600 _m[1][2] = matrix.
_m[1][2];
602 _m[2][0] = matrix.
_m[2][0];
603 _m[2][1] = matrix.
_m[2][1];
604 _m[2][2] = matrix.
_m[2][2];
720 return ((
_m[0][0] == matrix.
_m[0][0]) && (
_m[0][1] == matrix.
_m[0][1]) && (
_m[0][2] == matrix.
_m[0][2]))
721 && ((
_m[1][0] == matrix.
_m[1][0]) && (
_m[1][1] == matrix.
_m[1][1]) && (
_m[1][2] == matrix.
_m[1][2]))
722 && ((
_m[2][0] == matrix.
_m[2][0]) && (
_m[2][1] == matrix.
_m[2][1]) && (
_m[2][2] == matrix.
_m[2][2]));
732 return !(*
this == matrix);
789 _m[2][0] = vector.
_x;
790 _m[2][1] = vector.
_y;
822 _m[2][0] = position.
_x;
823 _m[2][1] = position.
_y;
845 _m[0][0] = vector.
_x;
850 _m[1][1] = vector.
_y;
886 GX_ASSERT(row < 3,
"指定された行数が大きすぎます(%d)", row);
887 return *
reinterpret_cast<const GxVector3*
>(&
_m[row][0]);
897 GX_ASSERT(row < 3,
"指定された行数が大きすぎます(%d)", row);
898 _m[row][0] = vector.
_x;
899 _m[row][1] = vector.
_y;
900 _m[row][2] = vector.
_z;
910 GX_ASSERT(column < 3,
"指定された列数が大きすぎます(%d)", column);
921 GX_ASSERT(column < 3,
"指定された列数が大きすぎます(%d)", column);
922 _m[0][column] = vector.
_x;
923 _m[1][column] = vector.
_y;
924 _m[2][column] = vector.
_z;
935 GX_ASSERT(row < 3,
"指定された行数が大きすぎます(%d)", row);
936 GX_ASSERT(column < 3,
"指定された列数が大きすぎます(%d)", column);
937 return _m[row][column];
949 GX_ASSERT(row < 3,
"指定された行数が大きすぎます(%d)", row);
950 GX_ASSERT(column < 3,
"指定された列数が大きすぎます(%d)", column);
951 _m[row][column] = value;
962 GX_ASSERT(row < 3,
"指定された行数が大きすぎます(%d)", row);
963 GX_ASSERT(column < 3,
"指定された列数が大きすぎます(%d)", column);
964 return _m[row][column];
975 GX_ASSERT(row < 3,
"指定された行数が大きすぎます(%d)", row);
976 GX_ASSERT(column < 3,
"指定された列数が大きすぎます(%d)", column);
977 return _m[row][column];
986 return _m[0][0] * (
_m[1][1] *
_m[2][2] -
_m[2][1] *
_m[1][2])
987 -
_m[0][1] * (
_m[1][0] *
_m[2][2] -
_m[2][0] *
_m[1][2])
988 +
_m[0][2] * (
_m[1][0] *
_m[2][1] -
_m[2][0] *
_m[1][1]);
1008 _m[0][1],
_m[1][1],
_m[2][1],
1009 _m[0][2],
_m[1][2],
_m[2][2]);
1021 dst.
_m[0][0] = matrix.
_m[0][0] * scalar;
1022 dst.
_m[0][1] = matrix.
_m[0][1] * scalar;
1023 dst.
_m[0][2] = matrix.
_m[0][2] * scalar;
1025 dst.
_m[1][0] = matrix.
_m[1][0] * scalar;
1026 dst.
_m[1][1] = matrix.
_m[1][1] * scalar;
1027 dst.
_m[1][2] = matrix.
_m[1][2] * scalar;
1029 dst.
_m[2][0] = matrix.
_m[2][0] * scalar;
1030 dst.
_m[2][1] = matrix.
_m[2][1] * scalar;
1031 dst.
_m[2][2] = matrix.
_m[2][2] * scalar;
1045 auto invScalar = 1.0f / scalar;
1047 dst.
_m[0][0] = matrix.
_m[0][0] * invScalar;
1048 dst.
_m[0][1] = matrix.
_m[0][1] * invScalar;
1049 dst.
_m[0][2] = matrix.
_m[0][2] * invScalar;
1051 dst.
_m[1][0] = matrix.
_m[1][0] * invScalar;
1052 dst.
_m[1][1] = matrix.
_m[1][1] * invScalar;
1053 dst.
_m[1][2] = matrix.
_m[1][2] * invScalar;
1055 dst.
_m[2][0] = matrix.
_m[2][0] * invScalar;
1056 dst.
_m[2][1] = matrix.
_m[2][1] * invScalar;
1057 dst.
_m[2][2] = matrix.
_m[2][2] * invScalar;
1071 dst.
_m[0][0] = matrix0.
_m[0][0] + matrix1.
_m[0][0];
1072 dst.
_m[0][1] = matrix0.
_m[0][1] + matrix1.
_m[0][1];
1073 dst.
_m[0][2] = matrix0.
_m[0][2] + matrix1.
_m[0][2];
1075 dst.
_m[1][0] = matrix0.
_m[1][0] + matrix1.
_m[1][0];
1076 dst.
_m[1][1] = matrix0.
_m[1][1] + matrix1.
_m[1][1];
1077 dst.
_m[1][2] = matrix0.
_m[1][2] + matrix1.
_m[1][2];
1079 dst.
_m[2][0] = matrix0.
_m[2][0] + matrix1.
_m[2][0];
1080 dst.
_m[2][1] = matrix0.
_m[2][1] + matrix1.
_m[2][1];
1081 dst.
_m[2][2] = matrix0.
_m[2][2] + matrix1.
_m[2][2];
1096 const auto m00 = matrix0.
_m[0][0] * matrix1.
_m[0][0] + matrix0.
_m[0][1] * matrix1.
_m[1][0] + matrix0.
_m[0][2] * matrix1.
_m[2][0];
1097 const auto m01 = matrix0.
_m[0][0] * matrix1.
_m[0][1] + matrix0.
_m[0][1] * matrix1.
_m[1][1] + matrix0.
_m[0][2] * matrix1.
_m[2][1];
1098 const auto m02 = matrix0.
_m[0][0] * matrix1.
_m[0][2] + matrix0.
_m[0][1] * matrix1.
_m[1][2] + matrix0.
_m[0][2] * matrix1.
_m[2][2];
1100 const auto m10 = matrix0.
_m[1][0] * matrix1.
_m[0][0] + matrix0.
_m[1][1] * matrix1.
_m[1][0] + matrix0.
_m[1][2] * matrix1.
_m[2][0];
1101 const auto m11 = matrix0.
_m[1][0] * matrix1.
_m[0][1] + matrix0.
_m[1][1] * matrix1.
_m[1][1] + matrix0.
_m[1][2] * matrix1.
_m[2][1];
1102 const auto m12 = matrix0.
_m[1][0] * matrix1.
_m[0][2] + matrix0.
_m[1][1] * matrix1.
_m[1][2] + matrix0.
_m[1][2] * matrix1.
_m[2][2];
1104 const auto m20 = matrix0.
_m[2][0] * matrix1.
_m[0][0] + matrix0.
_m[2][1] * matrix1.
_m[1][0] + matrix0.
_m[2][2] * matrix1.
_m[2][0];
1105 const auto m21 = matrix0.
_m[2][0] * matrix1.
_m[0][1] + matrix0.
_m[2][1] * matrix1.
_m[1][1] + matrix0.
_m[2][2] * matrix1.
_m[2][1];
1106 const auto m22 = matrix0.
_m[2][0] * matrix1.
_m[0][2] + matrix0.
_m[2][1] * matrix1.
_m[1][2] + matrix0.
_m[2][2] * matrix1.
_m[2][2];
1132 const auto m00 = matrix.
_m[1][1] * matrix.
_m[2][2] - matrix.
_m[1][2] * matrix.
_m[2][1];
1133 const auto m01 = matrix.
_m[1][2] * matrix.
_m[2][0] - matrix.
_m[1][0] * matrix.
_m[2][2];
1134 const auto m02 = matrix.
_m[1][0] * matrix.
_m[2][1] - matrix.
_m[1][1] * matrix.
_m[2][0];
1136 const auto m10 = matrix.
_m[0][2] * matrix.
_m[2][1] - matrix.
_m[0][1] * matrix.
_m[2][2];
1137 const auto m11 = matrix.
_m[0][0] * matrix.
_m[2][2] - matrix.
_m[0][2] * matrix.
_m[2][0];
1138 const auto m12 = matrix.
_m[0][1] * matrix.
_m[2][0] - matrix.
_m[0][0] * matrix.
_m[2][1];
1140 const auto m20 = matrix.
_m[0][1] * matrix.
_m[1][2] - matrix.
_m[0][2] * matrix.
_m[1][1];
1141 const auto m21 = matrix.
_m[0][2] * matrix.
_m[1][0] - matrix.
_m[0][0] * matrix.
_m[1][2];
1142 const auto m22 = matrix.
_m[0][0] * matrix.
_m[1][1] - matrix.
_m[0][1] * matrix.
_m[1][0];
1146 dst.
_m[0][0] = m00 * d;
1147 dst.
_m[0][1] = m01 * d;
1148 dst.
_m[0][2] = m02 * d;
1150 dst.
_m[1][0] = m10 * d;
1151 dst.
_m[1][1] = m11 * d;
1152 dst.
_m[1][2] = m12 * d;
1154 dst.
_m[2][0] = m20 * d;
1155 dst.
_m[2][1] = m21 * d;
1156 dst.
_m[2][2] = m22 * d;
1169 const auto m00 = matrix.
_m[0][0];
1170 const auto m01 = matrix.
_m[1][0];
1171 const auto m02 = matrix.
_m[2][0];
1173 const auto m10 = matrix.
_m[0][1];
1174 const auto m11 = matrix.
_m[1][1];
1175 const auto m12 = matrix.
_m[2][1];
1177 const auto m20 = matrix.
_m[0][2];
1178 const auto m21 = matrix.
_m[1][2];
1179 const auto m22 = matrix.
_m[2][2];
1225 auto invScalar = 1.0f / scalar;
1227 _m[0][0] *= invScalar;
1228 _m[0][1] *= invScalar;
1229 _m[0][2] *= invScalar;
1231 _m[1][0] *= invScalar;
1232 _m[1][1] *= invScalar;
1233 _m[1][2] *= invScalar;
1235 _m[2][0] *= invScalar;
1236 _m[2][1] *= invScalar;
1237 _m[2][2] *= invScalar;
1249 _m[0][0] += matrix.
_m[0][0];
1250 _m[0][1] += matrix.
_m[0][1];
1251 _m[0][2] += matrix.
_m[0][2];
1253 _m[1][0] += matrix.
_m[1][0];
1254 _m[1][1] += matrix.
_m[1][1];
1255 _m[1][2] += matrix.
_m[1][2];
1257 _m[2][0] += matrix.
_m[2][0];
1258 _m[2][1] += matrix.
_m[2][1];
1259 _m[2][2] += matrix.
_m[2][2];
1271 const auto m00 =
_m[0][0] * matrix.
_m[0][0] +
_m[0][1] * matrix.
_m[1][0] +
_m[0][2] * matrix.
_m[2][0];
1272 const auto m01 =
_m[0][0] * matrix.
_m[0][1] +
_m[0][1] * matrix.
_m[1][1] +
_m[0][2] * matrix.
_m[2][1];
1273 const auto m02 =
_m[0][0] * matrix.
_m[0][2] +
_m[0][1] * matrix.
_m[1][2] +
_m[0][2] * matrix.
_m[2][2];
1275 const auto m10 =
_m[1][0] * matrix.
_m[0][0] +
_m[1][1] * matrix.
_m[1][0] +
_m[1][2] * matrix.
_m[2][0];
1276 const auto m11 =
_m[1][0] * matrix.
_m[0][1] +
_m[1][1] * matrix.
_m[1][1] +
_m[1][2] * matrix.
_m[2][1];
1277 const auto m12 =
_m[1][0] * matrix.
_m[0][2] +
_m[1][1] * matrix.
_m[1][2] +
_m[1][2] * matrix.
_m[2][2];
1279 const auto m20 =
_m[2][0] * matrix.
_m[0][0] +
_m[2][1] * matrix.
_m[1][0] +
_m[2][2] * matrix.
_m[2][0];
1280 const auto m21 =
_m[2][0] * matrix.
_m[0][1] +
_m[2][1] * matrix.
_m[1][1] +
_m[2][2] * matrix.
_m[2][1];
1281 const auto m22 =
_m[2][0] * matrix.
_m[0][2] +
_m[2][1] * matrix.
_m[1][2] +
_m[2][2] * matrix.
_m[2][2];
1319#if GX_MATRIX_SAFE_MODE
1324 _m[2][0] += vector.
_x;
1325 _m[2][1] += vector.
_y;
1339#if GX_MATRIX_SAFE_MODE
1358#if GX_MATRIX_SAFE_MODE
1363 _m[0][0] =
_m[0][0] * vector.
_x;
1364 _m[0][1] =
_m[0][1] * vector.
_y;
1366 _m[1][0] =
_m[1][0] * vector.
_x;
1367 _m[1][1] =
_m[1][1] * vector.
_y;
1369 _m[2][0] =
_m[2][0] * vector.
_x;
1370 _m[2][1] =
_m[2][1] * vector.
_y;
1384#if GX_MATRIX_SAFE_MODE
1389 _m[0][0] =
_m[0][0] * x;
1390 _m[0][1] =
_m[0][1] * y;
1392 _m[1][0] =
_m[1][0] * x;
1393 _m[1][1] =
_m[1][1] * y;
1395 _m[2][0] =
_m[2][0] * x;
1396 _m[2][1] =
_m[2][1] * y;
1408 const auto m00 =
_m[1][1] *
_m[2][2] -
_m[1][2] *
_m[2][1];
1409 const auto m01 =
_m[1][2] *
_m[2][0] -
_m[1][0] *
_m[2][2];
1410 const auto m02 =
_m[1][0] *
_m[2][1] -
_m[1][1] *
_m[2][0];
1412 const auto m10 =
_m[0][2] *
_m[2][1] -
_m[0][1] *
_m[2][2];
1413 const auto m11 =
_m[0][0] *
_m[2][2] -
_m[0][2] *
_m[2][0];
1414 const auto m12 =
_m[0][1] *
_m[2][0] -
_m[0][0] *
_m[2][1];
1416 const auto m20 =
_m[0][1] *
_m[1][2] -
_m[0][2] *
_m[1][1];
1417 const auto m21 =
_m[0][2] *
_m[1][0] -
_m[0][0] *
_m[1][2];
1418 const auto m22 =
_m[0][0] *
_m[1][1] -
_m[0][1] *
_m[1][0];
1443 const auto m00 =
_m[0][0];
1444 const auto m01 =
_m[1][0];
1445 const auto m02 =
_m[2][0];
1447 const auto m10 =
_m[0][1];
1448 const auto m11 =
_m[1][1];
1449 const auto m12 =
_m[2][1];
1451 const auto m20 =
_m[0][2];
1452 const auto m21 =
_m[1][2];
1453 const auto m22 =
_m[2][2];
1526 f32 m10, f32 m11, f32 m12,
1527 f32 m20, f32 m21, f32 m22,
1528 f32 m30, f32 m31, f32 m32)
1553 _m[0][0] = matrix.
_m[0][0];
1554 _m[0][1] = matrix.
_m[0][1];
1555 _m[0][2] = matrix.
_m[0][2];
1557 _m[1][0] = matrix.
_m[1][0];
1558 _m[1][1] = matrix.
_m[1][1];
1559 _m[1][2] = matrix.
_m[1][2];
1561 _m[2][0] = matrix.
_m[2][0];
1562 _m[2][1] = matrix.
_m[2][1];
1563 _m[2][2] = matrix.
_m[2][2];
1565 _m[3][0] = matrix.
_m[3][0];
1566 _m[3][1] = matrix.
_m[3][1];
1567 _m[3][2] = matrix.
_m[3][2];
1577 _m[0][0] = orientation.
_m[0][0];
1578 _m[0][1] = orientation.
_m[0][1];
1579 _m[0][2] = orientation.
_m[0][2];
1581 _m[1][0] = orientation.
_m[1][0];
1582 _m[1][1] = orientation.
_m[1][1];
1583 _m[1][2] = orientation.
_m[1][2];
1585 _m[2][0] = orientation.
_m[2][0];
1586 _m[2][1] = orientation.
_m[2][1];
1587 _m[2][2] = orientation.
_m[2][2];
1589 _m[3][0] = position.
_x;
1590 _m[3][1] = position.
_y;
1591 _m[3][2] = position.
_z;
1599 _m[0][0] = matrix.
_m[0][0];
1600 _m[0][1] = matrix.
_m[0][1];
1601 _m[0][2] = matrix.
_m[0][2];
1603 _m[1][0] = matrix.
_m[1][0];
1604 _m[1][1] = matrix.
_m[1][1];
1605 _m[1][2] = matrix.
_m[1][2];
1607 _m[2][0] = matrix.
_m[2][0];
1608 _m[2][1] = matrix.
_m[2][1];
1609 _m[2][2] = matrix.
_m[2][2];
1611 _m[3][0] = matrix.
_m[3][0];
1612 _m[3][1] = matrix.
_m[3][1];
1613 _m[3][2] = matrix.
_m[3][2];
1621#if defined(GX_USE_SSE2)
1622 _r[0] = _mm_setzero_ps();
1623 _r[1] = _mm_setzero_ps();
1624 _r[2] = _mm_setzero_ps();
1625 _r[3] = _mm_setzero_ps();
1627 for( u32 c = 0; c < 4; c++ )
1656 _m[0][0] = matrix.
_m[0][0];
1657 _m[0][1] = matrix.
_m[0][1];
1658 _m[0][2] = matrix.
_m[0][2];
1660 _m[1][0] = matrix.
_m[1][0];
1661 _m[1][1] = matrix.
_m[1][1];
1662 _m[1][2] = matrix.
_m[1][2];
1664 _m[2][0] = matrix.
_m[2][0];
1665 _m[2][1] = matrix.
_m[2][1];
1666 _m[2][2] = matrix.
_m[2][2];
1668 _m[3][0] = matrix.
_m[3][0];
1669 _m[3][1] = matrix.
_m[3][1];
1670 _m[3][2] = matrix.
_m[3][2];
1778 return ((
_m[0][0] == matrix.
_m[0][0]) && (
_m[0][1] == matrix.
_m[0][1]) && (
_m[0][2] == matrix.
_m[0][2]))
1779 && ((
_m[1][0] == matrix.
_m[1][0]) && (
_m[1][1] == matrix.
_m[1][1]) && (
_m[1][2] == matrix.
_m[1][2]))
1780 && ((
_m[2][0] == matrix.
_m[2][0]) && (
_m[2][1] == matrix.
_m[2][1]) && (
_m[2][2] == matrix.
_m[2][2]))
1781 && ((
_m[3][0] == matrix.
_m[3][0]) && (
_m[3][1] == matrix.
_m[3][1]) && (
_m[3][2] == matrix.
_m[3][2]));
1791 return !(*
this == matrix);
1829 _m[1][1] = cosValue;
1830 _m[1][2] = sinValue;
1833 _m[2][1] =-sinValue;
1834 _m[2][2] = cosValue;
1849 _m[0][0] = cosValue;
1851 _m[0][2] =-sinValue;
1857 _m[2][0] = sinValue;
1859 _m[2][2] = cosValue;
1874 _m[0][0] = cosValue;
1875 _m[0][1] = sinValue;
1878 _m[1][0] =-sinValue;
1879 _m[1][1] = cosValue;
1900 if(
_m[0][2] < 1.0f )
1902 if(
_m[0][2] > -1.0f )
1911 vector.
_y = PI * 0.5f;
1918 vector.
_y = -PI * 0.5f;
1932 if(
_m[0][1] < 1.0f )
1934 if(
_m[0][1] > -1.0f )
1943 vector.
_z = -PI * 0.5f;
1950 vector.
_z = PI * 0.5f;
1964 if(
_m[1][2] < 1.0f )
1966 if(
_m[1][2] > -1.0f )
1975 vector.
_x = -PI * 0.5f;
1982 vector.
_x = PI * 0.5f;
1996 if(
_m[1][0] < 1.0f )
1998 if(
_m[1][0] > -1.0f )
2007 vector.
_z = PI * 0.5f;
2014 vector.
_z = -PI * 0.5f;
2028 if(
_m[2][1] < 1.0f )
2030 if(
_m[2][1] > -1.0f )
2039 vector.
_x = PI * 0.5f;
2046 vector.
_x = -PI * 0.5f;
2061 if(
_m[2][0] < 1.0f )
2063 if(
_m[2][0] > -1.0f )
2072 vector.
_y = -PI * 0.5f;
2079 vector.
_y = PI * 0.5f;
2105 _m[3][0] = vector.
_x;
2106 _m[3][1] = vector.
_y;
2107 _m[3][2] = vector.
_z;
2143 _m[3][0] = position.
_x;
2144 _m[3][1] = position.
_y;
2145 _m[3][2] = position.
_z;
2168 reinterpret_cast<const GxVector3*
>(&
_m[0][0])->getLength(),
2169 reinterpret_cast<const GxVector3*
>(&
_m[1][0])->getLength(),
2170 reinterpret_cast<const GxVector3*
>(&
_m[2][0])->getLength()
2181 _m[0][0] = vector.
_x;
2186 _m[1][1] = vector.
_y;
2191 _m[2][2] = vector.
_z;
2235 _m[0][0] = cosValue + vector.
_x * vector.
_x * (1.0f - cosValue);
2236 _m[0][1] = vector.
_x * vector.
_y * (1.0f - cosValue) + vector.
_z * sinValue;
2237 _m[0][2] = vector.
_x * vector.
_z * (1.0f - cosValue) - vector.
_y * sinValue;
2239 _m[1][0] = vector.
_x * vector.
_y * (1.0f - cosValue) - vector.
_z * sinValue;
2240 _m[1][1] = cosValue + vector.
_y * vector.
_y * (1.0f - cosValue);
2241 _m[1][2] = vector.
_y * vector.
_z * (1.0f - cosValue) + vector.
_x * sinValue;
2243 _m[2][0] = vector.
_x * vector.
_z * (1.0f - cosValue) + vector.
_y * sinValue;
2244 _m[2][1] = vector.
_y * vector.
_z * (1.0f - cosValue) - vector.
_x * sinValue;
2245 _m[2][2] = cosValue + vector.
_z * vector.
_z * (1.0f - cosValue);
2259 _m[0][0] = 1.0f - 2.0f * (quaternion.
_y * quaternion.
_y + quaternion.
_z * quaternion.
_z);
2260 _m[0][1] = 2.0f * (quaternion.
_x * quaternion.
_y + quaternion.
_w * quaternion.
_z);
2261 _m[0][2] = 2.0f * (quaternion.
_x * quaternion.
_z - quaternion.
_w * quaternion.
_y);
2263 _m[1][0] = 2.0f * (quaternion.
_x * quaternion.
_y - quaternion.
_w * quaternion.
_z);
2264 _m[1][1] = 1.0f - 2.0f * (quaternion.
_x * quaternion.
_x + quaternion.
_z * quaternion.
_z);
2265 _m[1][2] = 2.0f * (quaternion.
_y * quaternion.
_z + quaternion.
_w * quaternion.
_x);
2267 _m[2][0] = 2.0f * (quaternion.
_x * quaternion.
_z + quaternion.
_w * quaternion.
_y);
2268 _m[2][1] = 2.0f * (quaternion.
_y * quaternion.
_z - quaternion.
_w * quaternion.
_x);
2269 _m[2][2] = 1.0f - 2.0f * (quaternion.
_x * quaternion.
_x + quaternion.
_y * quaternion.
_y);
2283 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
2284 const_cast<f32*
>(
_m[row])[3] = (row==3) ? 1.0f : 0.0f;
2285 return *
reinterpret_cast<const GxVector4*
>(&
_m[row][0]);
2306 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
2307 _m[row][0] = vector.
_x;
2308 _m[row][1] = vector.
_y;
2309 _m[row][2] = vector.
_z;
2320 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
2321 _m[row][0] = vector.
_x;
2322 _m[row][1] = vector.
_y;
2323 _m[row][2] = vector.
_z;
2333 GX_ASSERT(column < 4,
"指定された列数が大きすぎます(%d)", column);
2345 GX_ASSERT(column < 4,
"指定された列数が大きすぎます(%d)", column);
2348 _m[0][column] = vector.
_x;
2349 _m[1][column] = vector.
_y;
2350 _m[2][column] = vector.
_z;
2351 _m[3][column] = vector.
_w;
2363 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
2364 GX_ASSERT(column < 4,
"指定された列数が大きすぎます(%d)", column);
2369 return _m[row][column];
2381 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
2382 GX_ASSERT(column < 4,
"指定された列数が大きすぎます(%d)", column);
2385 _m[row][column] = value;
2397 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
2398 GX_ASSERT(column < 3,
"指定された列数が大きすぎます(%d)", column);
2399 return _m[row][column];
2410 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
2411 GX_ASSERT(column < 3,
"指定された列数が大きすぎます(%d)", column);
2412 return _m[row][column];
2421 return _m[0][0] * (
_m[1][1] *
_m[2][2] -
_m[2][1] *
_m[1][2])
2422 -
_m[0][1] * (
_m[1][0] *
_m[2][2] -
_m[2][0] *
_m[1][2])
2423 +
_m[0][2] * (
_m[1][0] *
_m[2][1] -
_m[2][0] *
_m[1][1]);
2443 _m[0][1],
_m[1][1],
_m[2][1],
2444 _m[0][2],
_m[1][2],
_m[2][2],
2476 dst.
_m[0][0] = matrix.
_m[0][0] * scalar;
2477 dst.
_m[0][1] = matrix.
_m[0][1] * scalar;
2478 dst.
_m[0][2] = matrix.
_m[0][2] * scalar;
2480 dst.
_m[1][0] = matrix.
_m[1][0] * scalar;
2481 dst.
_m[1][1] = matrix.
_m[1][1] * scalar;
2482 dst.
_m[1][2] = matrix.
_m[1][2] * scalar;
2484 dst.
_m[2][0] = matrix.
_m[2][0] * scalar;
2485 dst.
_m[2][1] = matrix.
_m[2][1] * scalar;
2486 dst.
_m[2][2] = matrix.
_m[2][2] * scalar;
2488 dst.
_m[3][0] = matrix.
_m[3][0] * scalar;
2489 dst.
_m[3][1] = matrix.
_m[3][1] * scalar;
2490 dst.
_m[3][2] = matrix.
_m[3][2] * scalar;
2504 auto inverseScalar = 1.0f / scalar;
2506 dst.
_m[0][0] = matrix.
_m[0][0] * inverseScalar;
2507 dst.
_m[0][1] = matrix.
_m[0][1] * inverseScalar;
2508 dst.
_m[0][2] = matrix.
_m[0][2] * inverseScalar;
2510 dst.
_m[1][0] = matrix.
_m[1][0] * inverseScalar;
2511 dst.
_m[1][1] = matrix.
_m[1][1] * inverseScalar;
2512 dst.
_m[1][2] = matrix.
_m[1][2] * inverseScalar;
2514 dst.
_m[2][0] = matrix.
_m[2][0] * inverseScalar;
2515 dst.
_m[2][1] = matrix.
_m[2][1] * inverseScalar;
2516 dst.
_m[2][2] = matrix.
_m[2][2] * inverseScalar;
2518 dst.
_m[3][0] = matrix.
_m[3][0] * inverseScalar;
2519 dst.
_m[3][1] = matrix.
_m[3][1] * inverseScalar;
2520 dst.
_m[3][2] = matrix.
_m[3][2] * inverseScalar;
2534 dst.
_m[0][0] = matrix0.
_m[0][0] + matrix1.
_m[0][0];
2535 dst.
_m[0][1] = matrix0.
_m[0][1] + matrix1.
_m[0][1];
2536 dst.
_m[0][2] = matrix0.
_m[0][2] + matrix1.
_m[0][2];
2538 dst.
_m[1][0] = matrix0.
_m[1][0] + matrix1.
_m[1][0];
2539 dst.
_m[1][1] = matrix0.
_m[1][1] + matrix1.
_m[1][1];
2540 dst.
_m[1][2] = matrix0.
_m[1][2] + matrix1.
_m[1][2];
2542 dst.
_m[2][0] = matrix0.
_m[2][0] + matrix1.
_m[2][0];
2543 dst.
_m[2][1] = matrix0.
_m[2][1] + matrix1.
_m[2][1];
2544 dst.
_m[2][2] = matrix0.
_m[2][2] + matrix1.
_m[2][2];
2546 dst.
_m[3][0] = matrix0.
_m[3][0] + matrix1.
_m[3][0];
2547 dst.
_m[3][1] = matrix0.
_m[3][1] + matrix1.
_m[3][1];
2548 dst.
_m[3][2] = matrix0.
_m[3][2] + matrix1.
_m[3][2];
2562#if defined(GX_USE_SSE2)
2563 __declspec(align(16))
static const u32 masktable[4] = {0xffffffff,0xffffffff,0xffffffff,0x00000000};
2565 __m128 mask = _mm_load_ps( (
const f32*)masktable );
2566 __m128 r0 = _mm_and_ps( matrix1._r[0], mask );
2567 __m128 r1 = _mm_and_ps( matrix1._r[1], mask );
2568 __m128 r2 = _mm_and_ps( matrix1._r[2], mask );
2569 __m128 r3 = _mm_and_ps( matrix1._r[3], mask );
2576 row = matrix0._r[0];
2577 mx = _mm_mul_ps(r0, SPLATX(row) );
2578 my = _mm_mul_ps(r1, SPLATY(row) );
2579 mz = _mm_mul_ps(r2, SPLATZ(row) );
2580 dst._r[0] = _mm_add_ps(_mm_add_ps(mx,my), mz);
2582 row = matrix0._r[1];
2583 mx = _mm_mul_ps(r0, SPLATX(row) );
2584 my = _mm_mul_ps(r1, SPLATY(row) );
2585 mz = _mm_mul_ps(r2, SPLATZ(row) );
2586 dst._r[1] = _mm_add_ps(_mm_add_ps(mx,my), mz);
2588 row = matrix0._r[2];
2589 mx = _mm_mul_ps(r0, SPLATX(row) );
2590 my = _mm_mul_ps(r1, SPLATY(row) );
2591 mz = _mm_mul_ps(r2, SPLATZ(row) );
2592 dst._r[2] = _mm_add_ps(_mm_add_ps(mx,my), mz);
2594 row = matrix0._r[3];
2595 mx = _mm_mul_ps(r0, SPLATX(row) );
2596 my = _mm_mul_ps(r1, SPLATY(row) );
2597 mz = _mm_mul_ps(r2, SPLATZ(row) );
2598 dst._r[3] = _mm_add_ps(_mm_add_ps(mx,my), _mm_add_ps(mz,r3));
2602 const auto m00 = matrix0.
_m[0][0] * matrix1.
_m[0][0] + matrix0.
_m[0][1] * matrix1.
_m[1][0] + matrix0.
_m[0][2] * matrix1.
_m[2][0];
2603 const auto m01 = matrix0.
_m[0][0] * matrix1.
_m[0][1] + matrix0.
_m[0][1] * matrix1.
_m[1][1] + matrix0.
_m[0][2] * matrix1.
_m[2][1];
2604 const auto m02 = matrix0.
_m[0][0] * matrix1.
_m[0][2] + matrix0.
_m[0][1] * matrix1.
_m[1][2] + matrix0.
_m[0][2] * matrix1.
_m[2][2];
2606 const auto m10 = matrix0.
_m[1][0] * matrix1.
_m[0][0] + matrix0.
_m[1][1] * matrix1.
_m[1][0] + matrix0.
_m[1][2] * matrix1.
_m[2][0];
2607 const auto m11 = matrix0.
_m[1][0] * matrix1.
_m[0][1] + matrix0.
_m[1][1] * matrix1.
_m[1][1] + matrix0.
_m[1][2] * matrix1.
_m[2][1];
2608 const auto m12 = matrix0.
_m[1][0] * matrix1.
_m[0][2] + matrix0.
_m[1][1] * matrix1.
_m[1][2] + matrix0.
_m[1][2] * matrix1.
_m[2][2];
2610 const auto m20 = matrix0.
_m[2][0] * matrix1.
_m[0][0] + matrix0.
_m[2][1] * matrix1.
_m[1][0] + matrix0.
_m[2][2] * matrix1.
_m[2][0];
2611 const auto m21 = matrix0.
_m[2][0] * matrix1.
_m[0][1] + matrix0.
_m[2][1] * matrix1.
_m[1][1] + matrix0.
_m[2][2] * matrix1.
_m[2][1];
2612 const auto m22 = matrix0.
_m[2][0] * matrix1.
_m[0][2] + matrix0.
_m[2][1] * matrix1.
_m[1][2] + matrix0.
_m[2][2] * matrix1.
_m[2][2];
2614 const auto m30 = matrix0.
_m[3][0] * matrix1.
_m[0][0] + matrix0.
_m[3][1] * matrix1.
_m[1][0] + matrix0.
_m[3][2] * matrix1.
_m[2][0] + matrix1.
_m[3][0];
2615 const auto m31 = matrix0.
_m[3][0] * matrix1.
_m[0][1] + matrix0.
_m[3][1] * matrix1.
_m[1][1] + matrix0.
_m[3][2] * matrix1.
_m[2][1] + matrix1.
_m[3][1];
2616 const auto m32 = matrix0.
_m[3][0] * matrix1.
_m[0][2] + matrix0.
_m[3][1] * matrix1.
_m[1][2] + matrix0.
_m[3][2] * matrix1.
_m[2][2] + matrix1.
_m[3][2];
2646#if defined(GX_USE_SSE2)
2652 __m128 m1x = _mm_load_ps(&matrix1.
_m[0][0]);
2653 __m128 m1y = _mm_load_ps(&matrix1.
_m[1][0]);
2654 __m128 m1z = _mm_load_ps(&matrix1.
_m[2][0]);
2655 __m128 m1w = _mm_load_ps(&matrix1.
_m[3][0]);
2657 m0r = _mm_load_ps(&matrix0.
_m[0][0]);
2658 mx = _mm_mul_ps( _mm_permute_ps(m0r, _MM_SHUFFLE(0,0,0,0)), m1x );
2659 my = _mm_mul_ps( _mm_permute_ps(m0r, _MM_SHUFFLE(1,1,1,1)), m1y );
2660 mz = _mm_mul_ps( _mm_permute_ps(m0r, _MM_SHUFFLE(2,2,2,2)), m1z );
2661 _mm_store_ps(&dst.
_m[0][0], _mm_add_ps( _mm_add_ps(mx, my), mz ));
2663 m0r = _mm_load_ps(&matrix0.
_m[1][0]);
2664 mx = _mm_mul_ps( _mm_permute_ps(m0r, _MM_SHUFFLE(0,0,0,0)), m1x );
2665 my = _mm_mul_ps( _mm_permute_ps(m0r, _MM_SHUFFLE(1,1,1,1)), m1y );
2666 mz = _mm_mul_ps( _mm_permute_ps(m0r, _MM_SHUFFLE(2,2,2,2)), m1z );
2667 _mm_store_ps(&dst.
_m[1][0], _mm_add_ps( _mm_add_ps(mx, my), mz ));
2669 m0r = _mm_load_ps(&matrix0.
_m[2][0]);
2670 mx = _mm_mul_ps( _mm_permute_ps(m0r, _MM_SHUFFLE(0,0,0,0)), m1x );
2671 my = _mm_mul_ps( _mm_permute_ps(m0r, _MM_SHUFFLE(1,1,1,1)), m1y );
2672 mz = _mm_mul_ps( _mm_permute_ps(m0r, _MM_SHUFFLE(2,2,2,2)), m1z );
2673 _mm_store_ps(&dst.
_m[2][0], _mm_add_ps( _mm_add_ps(mx, my), mz ));
2675 m0r = _mm_load_ps(&matrix0.
_m[3][0]);
2676 mx = _mm_mul_ps( _mm_permute_ps(m0r, _MM_SHUFFLE(0,0,0,0)), m1x );
2677 my = _mm_mul_ps( _mm_permute_ps(m0r, _MM_SHUFFLE(1,1,1,1)), m1y );
2678 mz = _mm_mul_ps( _mm_permute_ps(m0r, _MM_SHUFFLE(2,2,2,2)), m1z );
2679 _mm_store_ps(&dst.
_m[3][0], _mm_add_ps(_mm_add_ps(mx, my), _mm_add_ps(mz, m1w)));
2681 dst.
_m[0][0] = matrix0.
_m[0][0] * matrix1.
_m[0][0] + matrix0.
_m[0][1] * matrix1.
_m[1][0] + matrix0.
_m[0][2] * matrix1.
_m[2][0];
2682 dst.
_m[0][1] = matrix0.
_m[0][0] * matrix1.
_m[0][1] + matrix0.
_m[0][1] * matrix1.
_m[1][1] + matrix0.
_m[0][2] * matrix1.
_m[2][1];
2683 dst.
_m[0][2] = matrix0.
_m[0][0] * matrix1.
_m[0][2] + matrix0.
_m[0][1] * matrix1.
_m[1][2] + matrix0.
_m[0][2] * matrix1.
_m[2][2];
2685 dst.
_m[1][0] = matrix0.
_m[1][0] * matrix1.
_m[0][0] + matrix0.
_m[1][1] * matrix1.
_m[1][0] + matrix0.
_m[1][2] * matrix1.
_m[2][0];
2686 dst.
_m[1][1] = matrix0.
_m[1][0] * matrix1.
_m[0][1] + matrix0.
_m[1][1] * matrix1.
_m[1][1] + matrix0.
_m[1][2] * matrix1.
_m[2][1];
2687 dst.
_m[1][2] = matrix0.
_m[1][0] * matrix1.
_m[0][2] + matrix0.
_m[1][1] * matrix1.
_m[1][2] + matrix0.
_m[1][2] * matrix1.
_m[2][2];
2689 dst.
_m[2][0] = matrix0.
_m[2][0] * matrix1.
_m[0][0] + matrix0.
_m[2][1] * matrix1.
_m[1][0] + matrix0.
_m[2][2] * matrix1.
_m[2][0];
2690 dst.
_m[2][1] = matrix0.
_m[2][0] * matrix1.
_m[0][1] + matrix0.
_m[2][1] * matrix1.
_m[1][1] + matrix0.
_m[2][2] * matrix1.
_m[2][1];
2691 dst.
_m[2][2] = matrix0.
_m[2][0] * matrix1.
_m[0][2] + matrix0.
_m[2][1] * matrix1.
_m[1][2] + matrix0.
_m[2][2] * matrix1.
_m[2][2];
2693 dst.
_m[3][0] = matrix0.
_m[3][0] * matrix1.
_m[0][0] + matrix0.
_m[3][1] * matrix1.
_m[1][0] + matrix0.
_m[3][2] * matrix1.
_m[2][0] + matrix1.
_m[3][0];
2694 dst.
_m[3][1] = matrix0.
_m[3][0] * matrix1.
_m[0][1] + matrix0.
_m[3][1] * matrix1.
_m[1][1] + matrix0.
_m[3][2] * matrix1.
_m[2][1] + matrix1.
_m[3][1];
2695 dst.
_m[3][2] = matrix0.
_m[3][0] * matrix1.
_m[0][2] + matrix0.
_m[3][1] * matrix1.
_m[1][2] + matrix0.
_m[3][2] * matrix1.
_m[2][2] + matrix1.
_m[3][2];
2706 return !(
reinterpret_cast<size_t>(matrix.
_m) & (16 - 1));
2718#if defined(GX_USE_SSE2)
2719 __declspec(align(16))
static const u32 masktable[4] = {0xffffffff,0xffffffff,0xffffffff,0x00000000};
2721 __m128 mask = _mm_load_ps( (
const f32*)masktable );
2722 __m128 r0 = _mm_and_ps( matrix1._r[0], mask );
2723 __m128 r1 = _mm_and_ps( matrix1._r[1], mask );
2724 __m128 r2 = _mm_and_ps( matrix1._r[2], mask );
2725 __m128 r3 = _mm_and_ps( matrix1._r[3], mask );
2727 __m128 lr0 = matrix0._r[0];
2728 __m128 lr1 = matrix0._r[1];
2729 __m128 lr2 = matrix0._r[2];
2730 __m128 lr3 = matrix0._r[3];
2736 mx = _mm_mul_ps(r0, _mm_shuffle_ps(lr0, lr0, _MM_SHUFFLE(0,0,0,0)) );
2737 my = _mm_mul_ps(r1, _mm_shuffle_ps(lr0, lr0, _MM_SHUFFLE(1,1,1,1)) );
2738 mz = _mm_mul_ps(r2, _mm_shuffle_ps(lr0, lr0, _MM_SHUFFLE(2,2,2,2)) );
2739 v = _mm_add_ps(_mm_add_ps(mx,my), mz);
2740 _mm_store_ss( &dst.
_m[0][0], v );
2741 _mm_store_ss( &dst.
_m[1][0], _mm_shuffle_ps(v, v, _MM_SHUFFLE(1,1,1,1)) );
2742 _mm_store_ss( &dst.
_m[2][0], _mm_shuffle_ps(v, v, _MM_SHUFFLE(2,2,2,2)) );
2744 mx = _mm_mul_ps(r0, _mm_shuffle_ps(lr1, lr1, _MM_SHUFFLE(0,0,0,0)) );
2745 my = _mm_mul_ps(r1, _mm_shuffle_ps(lr1, lr1, _MM_SHUFFLE(1,1,1,1)) );
2746 mz = _mm_mul_ps(r2, _mm_shuffle_ps(lr1, lr1, _MM_SHUFFLE(2,2,2,2)) );
2747 v = _mm_add_ps(_mm_add_ps(mx,my), mz);
2748 _mm_store_ss( &dst.
_m[0][1], v );
2749 _mm_store_ss( &dst.
_m[1][1], _mm_shuffle_ps(v, v, _MM_SHUFFLE(1,1,1,1)) );
2750 _mm_store_ss( &dst.
_m[2][1], _mm_shuffle_ps(v, v, _MM_SHUFFLE(2,2,2,2)) );
2752 mx = _mm_mul_ps(r0, _mm_shuffle_ps(lr2, lr2, _MM_SHUFFLE(0,0,0,0)) );
2753 my = _mm_mul_ps(r1, _mm_shuffle_ps(lr2, lr2, _MM_SHUFFLE(1,1,1,1)) );
2754 mz = _mm_mul_ps(r2, _mm_shuffle_ps(lr2, lr2, _MM_SHUFFLE(2,2,2,2)) );
2755 v = _mm_add_ps(_mm_add_ps(mx,my), mz);
2756 _mm_store_ss( &dst.
_m[0][2], v );
2757 _mm_store_ss( &dst.
_m[1][2], _mm_shuffle_ps(v, v, _MM_SHUFFLE(1,1,1,1)) );
2758 _mm_store_ss( &dst.
_m[2][2], _mm_shuffle_ps(v, v, _MM_SHUFFLE(2,2,2,2)) );
2760 mx = _mm_mul_ps(r0, _mm_shuffle_ps(lr3, lr3, _MM_SHUFFLE(0,0,0,0)) );
2761 my = _mm_mul_ps(r1, _mm_shuffle_ps(lr3, lr3, _MM_SHUFFLE(1,1,1,1)) );
2762 mz = _mm_mul_ps(r2, _mm_shuffle_ps(lr3, lr3, _MM_SHUFFLE(2,2,2,2)) );
2763 v = _mm_add_ps(_mm_add_ps(mx,my), _mm_add_ps(mz,r3));
2764 _mm_store_ss( &dst.
_m[0][3], v );
2765 _mm_store_ss( &dst.
_m[1][3], _mm_shuffle_ps(v, v, _MM_SHUFFLE(1,1,1,1)) );
2766 _mm_store_ss( &dst.
_m[2][3], _mm_shuffle_ps(v, v, _MM_SHUFFLE(2,2,2,2)) );
2770 const auto m00 = matrix0.
_m[0][0] * matrix1.
_m[0][0] + matrix0.
_m[0][1] * matrix1.
_m[1][0] + matrix0.
_m[0][2] * matrix1.
_m[2][0];
2771 const auto m01 = matrix0.
_m[0][0] * matrix1.
_m[0][1] + matrix0.
_m[0][1] * matrix1.
_m[1][1] + matrix0.
_m[0][2] * matrix1.
_m[2][1];
2772 const auto m02 = matrix0.
_m[0][0] * matrix1.
_m[0][2] + matrix0.
_m[0][1] * matrix1.
_m[1][2] + matrix0.
_m[0][2] * matrix1.
_m[2][2];
2774 const auto m10 = matrix0.
_m[1][0] * matrix1.
_m[0][0] + matrix0.
_m[1][1] * matrix1.
_m[1][0] + matrix0.
_m[1][2] * matrix1.
_m[2][0];
2775 const auto m11 = matrix0.
_m[1][0] * matrix1.
_m[0][1] + matrix0.
_m[1][1] * matrix1.
_m[1][1] + matrix0.
_m[1][2] * matrix1.
_m[2][1];
2776 const auto m12 = matrix0.
_m[1][0] * matrix1.
_m[0][2] + matrix0.
_m[1][1] * matrix1.
_m[1][2] + matrix0.
_m[1][2] * matrix1.
_m[2][2];
2778 const auto m20 = matrix0.
_m[2][0] * matrix1.
_m[0][0] + matrix0.
_m[2][1] * matrix1.
_m[1][0] + matrix0.
_m[2][2] * matrix1.
_m[2][0];
2779 const auto m21 = matrix0.
_m[2][0] * matrix1.
_m[0][1] + matrix0.
_m[2][1] * matrix1.
_m[1][1] + matrix0.
_m[2][2] * matrix1.
_m[2][1];
2780 const auto m22 = matrix0.
_m[2][0] * matrix1.
_m[0][2] + matrix0.
_m[2][1] * matrix1.
_m[1][2] + matrix0.
_m[2][2] * matrix1.
_m[2][2];
2782 const auto m30 = matrix0.
_m[3][0] * matrix1.
_m[0][0] + matrix0.
_m[3][1] * matrix1.
_m[1][0] + matrix0.
_m[3][2] * matrix1.
_m[2][0] + matrix1.
_m[3][0];
2783 const auto m31 = matrix0.
_m[3][0] * matrix1.
_m[0][1] + matrix0.
_m[3][1] * matrix1.
_m[1][1] + matrix0.
_m[3][2] * matrix1.
_m[2][1] + matrix1.
_m[3][1];
2784 const auto m32 = matrix0.
_m[3][0] * matrix1.
_m[0][2] + matrix0.
_m[3][1] * matrix1.
_m[1][2] + matrix0.
_m[3][2] * matrix1.
_m[2][2] + matrix1.
_m[3][2];
2805#if defined(GX_USE_SSE2)
2806GX_FORCE_INLINE __m128 getDeterminantFrom33_SSE( __m128 r0, __m128 r1, __m128 r2 )
2808 __m128 m0 = _mm_shuffle_ps(r1, r1, _MM_SHUFFLE(0,0,0,1) );
2809 __m128 m1 = _mm_shuffle_ps(r2, r2, _MM_SHUFFLE(0,1,2,2) );
2810 __m128 m2 = _mm_shuffle_ps(r2, r2, _MM_SHUFFLE(0,0,0,1) );
2811 __m128 m3 = _mm_shuffle_ps(r1, r1, _MM_SHUFFLE(0,1,2,2) );
2812 m0 = _mm_mul_ps( r0, _mm_sub_ps( _mm_mul_ps( m0, m1 ), _mm_mul_ps( m2, m3 ) ) );
2813 return _mm_sub_ps( _mm_add_ps( SPLATX(m0), SPLATZ(m0) ), SPLATY(m0) );
2816GX_FORCE_INLINE __m128 getRcpDeterminant_SSE(
const GxMatrixAffine& matrix )
2818 __m128 m0 = _mm_shuffle_ps(matrix._r[1], matrix._r[1], _MM_SHUFFLE(0,0,0,1) );
2819 __m128 m1 = _mm_shuffle_ps(matrix._r[2], matrix._r[2], _MM_SHUFFLE(0,1,2,2) );
2820 __m128 m2 = _mm_shuffle_ps(matrix._r[2], matrix._r[2], _MM_SHUFFLE(0,0,0,1) );
2821 __m128 m3 = _mm_shuffle_ps(matrix._r[1], matrix._r[1], _MM_SHUFFLE(0,1,2,2) );
2822 m0 = _mm_mul_ps( matrix._r[0], _mm_sub_ps( _mm_mul_ps( m0, m1 ), _mm_mul_ps( m2, m3 ) ) );
2823 m0 = _mm_sub_ps( _mm_add_ps( SPLATX(m0), SPLATZ(m0) ), SPLATY(m0) );
2824 m0 = _mm_rcp_ps_22bit(m0);
2837#if defined(GX_USE_SSE2)
2838 __m128 d = getRcpDeterminant_SSE( matrix );
2840 const f32 m00 = matrix.
_m[1][1] * matrix.
_m[2][2] - matrix.
_m[1][2] * matrix.
_m[2][1];
2841 const f32 m01 =-matrix.
_m[0][1] * matrix.
_m[2][2] + matrix.
_m[0][2] * matrix.
_m[2][1];
2842 const f32 m02 = matrix.
_m[0][1] * matrix.
_m[1][2] - matrix.
_m[0][2] * matrix.
_m[1][1];
2844 const f32 m10 =-matrix.
_m[1][0] * matrix.
_m[2][2] + matrix.
_m[1][2] * matrix.
_m[2][0];
2845 const f32 m11 = matrix.
_m[0][0] * matrix.
_m[2][2] - matrix.
_m[0][2] * matrix.
_m[2][0];
2846 const f32 m12 =-matrix.
_m[0][0] * matrix.
_m[1][2] + matrix.
_m[0][2] * matrix.
_m[1][0];
2848 const f32 m20 = matrix.
_m[1][0] * matrix.
_m[2][1] - matrix.
_m[1][1] * matrix.
_m[2][0];
2849 const f32 m21 =-matrix.
_m[0][0] * matrix.
_m[2][1] + matrix.
_m[0][1] * matrix.
_m[2][0];
2850 const f32 m22 = matrix.
_m[0][0] * matrix.
_m[1][1] - matrix.
_m[0][1] * matrix.
_m[1][0];
2852 __m128 m30 = getDeterminantFrom33_SSE(matrix._r[1], matrix._r[2], matrix._r[3]);
2853 __m128 m31 = getDeterminantFrom33_SSE(matrix._r[0], matrix._r[2], matrix._r[3]);
2854 __m128 m32 = getDeterminantFrom33_SSE(matrix._r[0], matrix._r[1], matrix._r[3]);
2855 dst._r[0] = _mm_mul_ps( _mm_set_ps(0.0f, m02, m01, m00), d );
2856 dst._r[1] = _mm_mul_ps( _mm_set_ps(0.0f, m12, m11, m10), d );
2857 dst._r[2] = _mm_mul_ps( _mm_set_ps(0.0f, m22, m21, m20), d );
2858 dst._r[3] = _mm_mul_ps( _mm_mul_ps( _mm_unpacklo_ps( _mm_unpacklo_ps( m30, m32 ), m31 ), _mm_set_ps( 0.0f, -1.0f, 1.0f, -1.0f ) ), d );
2860 const auto m00 = matrix.
_m[1][1] * matrix.
_m[2][2] - matrix.
_m[1][2] * matrix.
_m[2][1];
2861 const auto m01 =-matrix.
_m[0][1] * matrix.
_m[2][2] + matrix.
_m[0][2] * matrix.
_m[2][1];
2862 const auto m02 = matrix.
_m[0][1] * matrix.
_m[1][2] - matrix.
_m[0][2] * matrix.
_m[1][1];
2864 const auto m10 =-matrix.
_m[1][0] * matrix.
_m[2][2] + matrix.
_m[1][2] * matrix.
_m[2][0];
2865 const auto m11 = matrix.
_m[0][0] * matrix.
_m[2][2] - matrix.
_m[0][2] * matrix.
_m[2][0];
2866 const auto m12 =-matrix.
_m[0][0] * matrix.
_m[1][2] + matrix.
_m[0][2] * matrix.
_m[1][0];
2868 const auto m20 = matrix.
_m[1][0] * matrix.
_m[2][1] - matrix.
_m[1][1] * matrix.
_m[2][0];
2869 const auto m21 =-matrix.
_m[0][0] * matrix.
_m[2][1] + matrix.
_m[0][1] * matrix.
_m[2][0];
2870 const auto m22 = matrix.
_m[0][0] * matrix.
_m[1][1] - matrix.
_m[0][1] * matrix.
_m[1][0];
2878 dst.
_m[0][0] = m00 * d;
2879 dst.
_m[0][1] = m01 * d;
2880 dst.
_m[0][2] = m02 * d;
2882 dst.
_m[1][0] = m10 * d;
2883 dst.
_m[1][1] = m11 * d;
2884 dst.
_m[1][2] = m12 * d;
2886 dst.
_m[2][0] = m20 * d;
2887 dst.
_m[2][1] = m21 * d;
2888 dst.
_m[2][2] = m22 * d;
2890 dst.
_m[3][0] = m30 * d;
2891 dst.
_m[3][1] = m31 * d;
2892 dst.
_m[3][2] = m32 * d;
2904 const auto m00 = matrix.
_m[0][0];
2905 const auto m01 = matrix.
_m[1][0];
2906 const auto m02 = matrix.
_m[2][0];
2908 const auto m10 = matrix.
_m[0][1];
2909 const auto m11 = matrix.
_m[1][1];
2910 const auto m12 = matrix.
_m[2][1];
2912 const auto m20 = matrix.
_m[0][2];
2913 const auto m21 = matrix.
_m[1][2];
2914 const auto m22 = matrix.
_m[2][2];
2928 dst.
_m[3][0] = 0.0f;
2929 dst.
_m[3][1] = 0.0f;
2930 dst.
_m[3][2] = 0.0f;
2968 auto invScalar = 1.0f / scalar;
2970 _m[0][0] *= invScalar;
2971 _m[0][1] *= invScalar;
2972 _m[0][2] *= invScalar;
2974 _m[1][0] *= invScalar;
2975 _m[1][1] *= invScalar;
2976 _m[1][2] *= invScalar;
2978 _m[2][0] *= invScalar;
2979 _m[2][1] *= invScalar;
2980 _m[2][2] *= invScalar;
2982 _m[3][0] *= invScalar;
2983 _m[3][1] *= invScalar;
2984 _m[3][2] *= invScalar;
2996 _m[0][0] += matrix.
_m[0][0];
2997 _m[0][1] += matrix.
_m[0][1];
2998 _m[0][2] += matrix.
_m[0][2];
3000 _m[1][0] += matrix.
_m[1][0];
3001 _m[1][1] += matrix.
_m[1][1];
3002 _m[1][2] += matrix.
_m[1][2];
3004 _m[2][0] += matrix.
_m[2][0];
3005 _m[2][1] += matrix.
_m[2][1];
3006 _m[2][2] += matrix.
_m[2][2];
3008 _m[3][0] += matrix.
_m[3][0];
3009 _m[3][1] += matrix.
_m[3][1];
3010 _m[3][2] += matrix.
_m[3][2];
3088#if GX_MATRIX_SAFE_MODE
3093#if defined(GX_USE_SSE2)
3094 __m128 q = _mm_loadu_ps( &quaternion.
_x );
3095#define _SHF_YXX _MM_SHUFFLE(3,0,0,1)
3096#define _SHF_ZZY _MM_SHUFFLE(3,1,2,2)
3098#define _SHF_XYX _MM_SHUFFLE(3,0,1,0)
3099#define _SHF_YZZ _MM_SHUFFLE(3,2,2,1)
3100#define _SHF_WWW _MM_SHUFFLE(3,3,3,3)
3101#define _SHF_ZXY _MM_SHUFFLE(3,1,0,2)
3103#define _SHF_XXY _MM_SHUFFLE(3,1,0,0)
3104#define _SHF_ZYZ _MM_SHUFFLE(3,2,1,2)
3105#define _SHF_YZX _MM_SHUFFLE(3,0,2,1)
3112 __m128 c0 = _mm_set_ps(+0.0f,+1.0f,+1.0f,+1.0f);
3113 __m128 c1 = _mm_set_ps(+0.0f,-2.0f,-2.0f,-2.0f);
3114 __m128 c2 = _mm_set_ps(+0.0f,+2.0f,+2.0f,+2.0f);
3116 v0 = _mm_shuffle_ps(q, q, _SHF_YXX);
3117 v1 = _mm_shuffle_ps(q, q, _SHF_ZZY);
3119 t0 = _mm_add_ps( _mm_mul_ps( v0, v0 ), _mm_mul_ps( v1, v1 ) );
3120 t0 = _mm_add_ps( c0, _mm_mul_ps( c1, t0 ) );
3122 v0 = _mm_shuffle_ps(q, q, _SHF_XYX);
3123 v1 = _mm_shuffle_ps(q, q, _SHF_YZZ);
3124 v2 = _mm_shuffle_ps(q, q, _SHF_WWW);
3125 v3 = _mm_shuffle_ps(q, q, _SHF_ZXY);
3127 v0 = _mm_mul_ps( v0, v1 );
3128 v1 = _mm_mul_ps( v2, v3 );
3129 t1 = _mm_mul_ps( c2, _mm_add_ps( v0, v1 ) );
3131 v0 = _mm_shuffle_ps(v0, v0, _MM_SHUFFLE(3,1,0,2) );
3132 v1 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3,1,0,2) );
3134 t2 = _mm_mul_ps( c2, _mm_sub_ps( v0, v1 ) );
3136 r0 = _mm_unpacklo_ps( _mm_unpacklo_ps( t0, t2 ), _mm_unpacklo_ps( t1, _mm_setzero_ps() ) );
3137 r1 = _mm_unpackhi_ps( _mm_unpacklo_ps( t2, t1 ), _mm_unpacklo_ps( t0, _mm_setzero_ps() ) );
3138 r2 = _mm_unpacklo_ps( _mm_unpackhi_ps( t1, t0 ), _mm_unpackhi_ps( t2, _mm_setzero_ps() ) );
3145 _r[0] = _mm_add_ps( _mm_add_ps( _mm_mul_ps( SPLATX(m00), r0 ), _mm_mul_ps( SPLATY(m00), r1 ) ), _mm_mul_ps( SPLATZ(m00), r2 ) );
3146 _r[1] = _mm_add_ps( _mm_add_ps( _mm_mul_ps( SPLATX(m10), r0 ), _mm_mul_ps( SPLATY(m10), r1 ) ), _mm_mul_ps( SPLATZ(m10), r2 ) );
3147 _r[2] = _mm_add_ps( _mm_add_ps( _mm_mul_ps( SPLATX(m20), r0 ), _mm_mul_ps( SPLATY(m20), r1 ) ), _mm_mul_ps( SPLATZ(m20), r2 ) );
3148 _r[3] = _mm_add_ps( _mm_add_ps( _mm_mul_ps( SPLATX(m30), r0 ), _mm_mul_ps( SPLATY(m30), r1 ) ), _mm_mul_ps( SPLATZ(m30), r2 ) );
3150 const auto r00 = 1.0f - 2.0f * (quaternion.
_y * quaternion.
_y + quaternion.
_z * quaternion.
_z);
3151 const auto r01 = 2.0f * (quaternion.
_x * quaternion.
_y + quaternion.
_w * quaternion.
_z);
3152 const auto r02 = 2.0f * (quaternion.
_x * quaternion.
_z - quaternion.
_w * quaternion.
_y);
3154 const auto r10 = 2.0f * (quaternion.
_x * quaternion.
_y - quaternion.
_w * quaternion.
_z);
3155 const auto r11 = 1.0f - 2.0f * (quaternion.
_x * quaternion.
_x + quaternion.
_z * quaternion.
_z);
3156 const auto r12 = 2.0f * (quaternion.
_y * quaternion.
_z + quaternion.
_w * quaternion.
_x);
3158 const auto r20 = 2.0f * (quaternion.
_x * quaternion.
_z + quaternion.
_w * quaternion.
_y);
3159 const auto r21 = 2.0f * (quaternion.
_y * quaternion.
_z - quaternion.
_w * quaternion.
_x);
3160 const auto r22 = 1.0f - 2.0f * (quaternion.
_x * quaternion.
_x + quaternion.
_y * quaternion.
_y);
3162 const auto m00 =
_m[0][0] * r00 +
_m[0][1] * r10 +
_m[0][2] * r20;
3163 const auto m01 =
_m[0][0] * r01 +
_m[0][1] * r11 +
_m[0][2] * r21;
3164 const auto m02 =
_m[0][0] * r02 +
_m[0][1] * r12 +
_m[0][2] * r22;
3166 const auto m10 =
_m[1][0] * r00 +
_m[1][1] * r10 +
_m[1][2] * r20;
3167 const auto m11 =
_m[1][0] * r01 +
_m[1][1] * r11 +
_m[1][2] * r21;
3168 const auto m12 =
_m[1][0] * r02 +
_m[1][1] * r12 +
_m[1][2] * r22;
3170 const auto m20 =
_m[2][0] * r00 +
_m[2][1] * r10 +
_m[2][2] * r20;
3171 const auto m21 =
_m[2][0] * r01 +
_m[2][1] * r11 +
_m[2][2] * r21;
3172 const auto m22 =
_m[2][0] * r02 +
_m[2][1] * r12 +
_m[2][2] * r22;
3174 const auto m30 =
_m[3][0] * r00 +
_m[3][1] * r10 +
_m[3][2] * r20;
3175 const auto m31 =
_m[3][0] * r01 +
_m[3][1] * r11 +
_m[3][2] * r21;
3176 const auto m32 =
_m[3][0] * r02 +
_m[3][1] * r12 +
_m[3][2] * r22;
3207#if defined(GX_USE_SSE2)
3208 __m128 q = _mm_loadu_ps( &quaternion.
_x );
3209 #define _SHF_YXX _MM_SHUFFLE(3,0,0,1)
3210 #define _SHF_ZZY _MM_SHUFFLE(3,1,2,2)
3212 #define _SHF_XYX _MM_SHUFFLE(3,0,1,0)
3213 #define _SHF_YZZ _MM_SHUFFLE(3,2,2,1)
3214 #define _SHF_WWW _MM_SHUFFLE(3,3,3,3)
3215 #define _SHF_ZXY _MM_SHUFFLE(3,1,0,2)
3217 #define _SHF_XXY _MM_SHUFFLE(3,1,0,0)
3218 #define _SHF_ZYZ _MM_SHUFFLE(3,2,1,2)
3219 #define _SHF_YZX _MM_SHUFFLE(3,0,2,1)
3225 __m128 c0 = _mm_set_ps(+0.0f,+1.0f,+1.0f,+1.0f);
3226 __m128 c1 = _mm_set_ps(+0.0f,-2.0f,-2.0f,-2.0f);
3227 __m128 c2 = _mm_set_ps(+0.0f,+2.0f,+2.0f,+2.0f);
3229 v0 = _mm_shuffle_ps(q, q, _SHF_YXX);
3230 v1 = _mm_shuffle_ps(q, q, _SHF_ZZY);
3232 t0 = _mm_add_ps( _mm_mul_ps( v0, v0 ), _mm_mul_ps( v1, v1 ) );
3233 t0 = _mm_add_ps( c0, _mm_mul_ps( c1, t0 ) );
3235 v0 = _mm_shuffle_ps(q, q, _SHF_XYX);
3236 v1 = _mm_shuffle_ps(q, q, _SHF_YZZ);
3237 v2 = _mm_shuffle_ps(q, q, _SHF_WWW);
3238 v3 = _mm_shuffle_ps(q, q, _SHF_ZXY);
3240 v0 = _mm_mul_ps( v0, v1 );
3241 v1 = _mm_mul_ps( v2, v3 );
3242 t1 = _mm_mul_ps( c2, _mm_add_ps( v0, v1 ) );
3244 v0 = _mm_shuffle_ps(v0, v0, _MM_SHUFFLE(3,1,0,2) );
3245 v1 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3,1,0,2) );
3247 t2 = _mm_mul_ps( c2, _mm_sub_ps( v0, v1 ) );
3249 r0 = _mm_unpacklo_ps( _mm_unpacklo_ps( t0, t2 ), _mm_unpacklo_ps( t1, _mm_setzero_ps() ) );
3250 r1 = _mm_unpackhi_ps( _mm_unpacklo_ps( t2, t1 ), _mm_unpacklo_ps( t0, _mm_setzero_ps() ) );
3251 r2 = _mm_unpacklo_ps( _mm_unpackhi_ps( t1, t0 ), _mm_unpackhi_ps( t2, _mm_setzero_ps() ) );
3253 __m128 s = _mm_loadu_ps( &scale.
_x );
3255 _r[0] = _mm_mul_ps( SPLATX(s), r0 );
3256 _r[1] = _mm_mul_ps( SPLATY(s), r1 );
3257 _r[2] = _mm_mul_ps( SPLATZ(s), r2 );
3258 _r[3] = _mm_setzero_ps();
3272#if GX_MATRIX_SAFE_MODE
3277 _m[3][0] += vector.
_x;
3278 _m[3][1] += vector.
_y;
3279 _m[3][2] += vector.
_z;
3294#if GX_MATRIX_SAFE_MODE
3314#if GX_MATRIX_SAFE_MODE
3319 _m[0][0] =
_m[0][0] * vector.
_x;
3320 _m[0][1] =
_m[0][1] * vector.
_y;
3321 _m[0][2] =
_m[0][2] * vector.
_z;
3323 _m[1][0] =
_m[1][0] * vector.
_x;
3324 _m[1][1] =
_m[1][1] * vector.
_y;
3325 _m[1][2] =
_m[1][2] * vector.
_z;
3327 _m[2][0] =
_m[2][0] * vector.
_x;
3328 _m[2][1] =
_m[2][1] * vector.
_y;
3329 _m[2][2] =
_m[2][2] * vector.
_z;
3331 _m[3][0] =
_m[3][0] * vector.
_x;
3332 _m[3][1] =
_m[3][1] * vector.
_y;
3333 _m[3][2] =
_m[3][2] * vector.
_z;
3348#if GX_MATRIX_SAFE_MODE
3353 _m[0][0] =
_m[0][0] * x;
3354 _m[0][1] =
_m[0][1] * y;
3355 _m[0][2] =
_m[0][2] * z;
3357 _m[1][0] =
_m[1][0] * x;
3358 _m[1][1] =
_m[1][1] * y;
3359 _m[1][2] =
_m[1][2] * z;
3361 _m[2][0] =
_m[2][0] * x;
3362 _m[2][1] =
_m[2][1] * y;
3363 _m[2][2] =
_m[2][2] * z;
3365 _m[3][0] =
_m[3][0] * x;
3366 _m[3][1] =
_m[3][1] * y;
3367 _m[3][2] =
_m[3][2] * z;
3388 const auto m00 =
_m[0][0];
3389 const auto m01 =
_m[1][0];
3390 const auto m02 =
_m[2][0];
3392 const auto m10 =
_m[0][1];
3393 const auto m11 =
_m[1][1];
3394 const auto m12 =
_m[2][1];
3396 const auto m20 =
_m[0][2];
3397 const auto m21 =
_m[1][2];
3398 const auto m22 =
_m[2][2];
3475 f32 m10, f32 m11, f32 m12, f32 m13,
3476 f32 m20, f32 m21, f32 m22, f32 m23,
3477 f32 m30, f32 m31, f32 m32, f32 m33)
3506 _m[0][0] = matrix.
_m[0][0];
3507 _m[0][1] = matrix.
_m[0][1];
3508 _m[0][2] = matrix.
_m[0][2];
3511 _m[1][0] = matrix.
_m[1][0];
3512 _m[1][1] = matrix.
_m[1][1];
3513 _m[1][2] = matrix.
_m[1][2];
3516 _m[2][0] = matrix.
_m[2][0];
3517 _m[2][1] = matrix.
_m[2][1];
3518 _m[2][2] = matrix.
_m[2][2];
3521 _m[3][0] = matrix.
_m[3][0];
3522 _m[3][1] = matrix.
_m[3][1];
3523 _m[3][2] = matrix.
_m[3][2];
3533 _m[0][0] = matrix.
_m[0][0];
3534 _m[0][1] = matrix.
_m[0][1];
3535 _m[0][2] = matrix.
_m[0][2];
3536 _m[0][3] = matrix.
_m[0][3];
3538 _m[1][0] = matrix.
_m[1][0];
3539 _m[1][1] = matrix.
_m[1][1];
3540 _m[1][2] = matrix.
_m[1][2];
3541 _m[1][3] = matrix.
_m[1][3];
3543 _m[2][0] = matrix.
_m[2][0];
3544 _m[2][1] = matrix.
_m[2][1];
3545 _m[2][2] = matrix.
_m[2][2];
3546 _m[2][3] = matrix.
_m[2][3];
3548 _m[3][0] = matrix.
_m[3][0];
3549 _m[3][1] = matrix.
_m[3][1];
3550 _m[3][2] = matrix.
_m[3][2];
3551 _m[3][3] = matrix.
_m[3][3];
3573 _m[0][0] = matrix.
_m[0][0];
3574 _m[0][1] = matrix.
_m[0][1];
3575 _m[0][2] = matrix.
_m[0][2];
3576 _m[0][3] = matrix.
_m[0][3];
3578 _m[1][0] = matrix.
_m[1][0];
3579 _m[1][1] = matrix.
_m[1][1];
3580 _m[1][2] = matrix.
_m[1][2];
3581 _m[1][3] = matrix.
_m[1][3];
3583 _m[2][0] = matrix.
_m[2][0];
3584 _m[2][1] = matrix.
_m[2][1];
3585 _m[2][2] = matrix.
_m[2][2];
3586 _m[2][3] = matrix.
_m[2][3];
3588 _m[3][0] = matrix.
_m[3][0];
3589 _m[3][1] = matrix.
_m[3][1];
3590 _m[3][2] = matrix.
_m[3][2];
3591 _m[3][3] = matrix.
_m[3][3];
3699 return ((
_m[0][0] == matrix.
_m[0][0]) && (
_m[0][1] == matrix.
_m[0][1]) && (
_m[0][2] == matrix.
_m[0][2]) && (
_m[0][3] == matrix.
_m[0][3]))
3700 && ((
_m[1][0] == matrix.
_m[1][0]) && (
_m[1][1] == matrix.
_m[1][1]) && (
_m[1][2] == matrix.
_m[1][2]) && (
_m[1][3] == matrix.
_m[1][3]))
3701 && ((
_m[2][0] == matrix.
_m[2][0]) && (
_m[2][1] == matrix.
_m[2][1]) && (
_m[2][2] == matrix.
_m[2][2]) && (
_m[2][3] == matrix.
_m[2][3]))
3702 && ((
_m[3][0] == matrix.
_m[3][0]) && (
_m[3][1] == matrix.
_m[3][1]) && (
_m[3][2] == matrix.
_m[3][2]) && (
_m[3][3] == matrix.
_m[3][3]));
3712 return !(*
this == matrix);
3755 _m[1][1] = cosValue;
3756 _m[1][2] = sinValue;
3760 _m[2][1] =-sinValue;
3761 _m[2][2] = cosValue;
3778 _m[0][0] = cosValue;
3780 _m[0][2] =-sinValue;
3788 _m[2][0] = sinValue;
3790 _m[2][2] = cosValue;
3807 _m[0][0] = cosValue;
3808 _m[0][1] = sinValue;
3812 _m[1][0] =-sinValue;
3813 _m[1][1] = cosValue;
3837 if(
_m[0][2] < 1.0f )
3839 if(
_m[0][2] > -1.0f )
3848 vector.
_y = PI * 0.5f;
3855 vector.
_y = -PI * 0.5f;
3869 if(
_m[0][1] < 1.0f )
3871 if(
_m[0][1] > -1.0f )
3880 vector.
_z = -PI * 0.5f;
3887 vector.
_z = PI * 0.5f;
3901 if(
_m[1][2] < 1.0f )
3903 if(
_m[1][2] > -1.0f )
3912 vector.
_x = -PI * 0.5f;
3919 vector.
_x = PI * 0.5f;
3933 if(
_m[1][0] < 1.0f )
3935 if(
_m[1][0] > -1.0f )
3944 vector.
_z = PI * 0.5f;
3951 vector.
_z = -PI * 0.5f;
3965 if(
_m[2][1] < 1.0f )
3967 if(
_m[2][1] > -1.0f )
3976 vector.
_x = PI * 0.5f;
3983 vector.
_x = -PI * 0.5f;
3998 if(
_m[2][0] < 1.0f )
4000 if(
_m[2][0] > -1.0f )
4009 vector.
_y = -PI * 0.5f;
4016 vector.
_y = PI * 0.5f;
4045 _m[3][0] = vector.
_x;
4046 _m[3][1] = vector.
_y;
4047 _m[3][2] = vector.
_z;
4088 _m[3][0] = position.
_x;
4089 _m[3][1] = position.
_y;
4090 _m[3][2] = position.
_z;
4116 _m[0][0] = vector.
_x;
4122 _m[1][1] = vector.
_y;
4128 _m[2][2] = vector.
_z;
4178 _m[0][0] = cosValue + vector.
_x * vector.
_x * (1.0f - cosValue);
4179 _m[0][1] = vector.
_x * vector.
_y * (1.0f - cosValue) + vector.
_z * sinValue;
4180 _m[0][2] = vector.
_x * vector.
_z * (1.0f - cosValue) - vector.
_y * sinValue;
4183 _m[1][0] = vector.
_x * vector.
_y * (1.0f - cosValue) - vector.
_z * sinValue;
4184 _m[1][1] = cosValue + vector.
_y * vector.
_y * (1.0f - cosValue);
4185 _m[1][2] = vector.
_y * vector.
_z * (1.0f - cosValue) + vector.
_x * sinValue;
4188 _m[2][0] = vector.
_x * vector.
_z * (1.0f - cosValue) + vector.
_y * sinValue;
4189 _m[2][1] = vector.
_y * vector.
_z * (1.0f - cosValue) - vector.
_x * sinValue;
4190 _m[2][2] = cosValue + vector.
_z * vector.
_z * (1.0f - cosValue);
4206 _m[0][0] = 1.0f - 2.0f * (quaternion.
_y * quaternion.
_y + quaternion.
_z * quaternion.
_z);
4207 _m[0][1] = 2.0f * (quaternion.
_x * quaternion.
_y + quaternion.
_w * quaternion.
_z);
4208 _m[0][2] = 2.0f * (quaternion.
_x * quaternion.
_z - quaternion.
_w * quaternion.
_y);
4211 _m[1][0] = 2.0f * (quaternion.
_x * quaternion.
_y - quaternion.
_w * quaternion.
_z);
4212 _m[1][1] = 1.0f - 2.0f * (quaternion.
_x * quaternion.
_x + quaternion.
_z * quaternion.
_z);
4213 _m[1][2] = 2.0f * (quaternion.
_y * quaternion.
_z + quaternion.
_w * quaternion.
_x);
4216 _m[2][0] = 2.0f * (quaternion.
_x * quaternion.
_z + quaternion.
_w * quaternion.
_y);
4217 _m[2][1] = 2.0f * (quaternion.
_y * quaternion.
_z - quaternion.
_w * quaternion.
_x);
4218 _m[2][2] = 1.0f - 2.0f * (quaternion.
_x * quaternion.
_x + quaternion.
_y * quaternion.
_y);
4234 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
4235 return *
reinterpret_cast<const GxVector4*
>(&
_m[row][0]);
4245 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
4246 _m[row][0] = vector.
_x;
4247 _m[row][1] = vector.
_y;
4248 _m[row][2] = vector.
_z;
4249 _m[row][3] = vector.
_w;
4259 GX_ASSERT(column < 4,
"指定された列数が大きすぎます(%d)", column);
4271 GX_ASSERT(column < 4,
"指定された列数が大きすぎます(%d)", column);
4272 _m[0][column] = vector.
_x;
4273 _m[1][column] = vector.
_y;
4274 _m[2][column] = vector.
_z;
4275 _m[3][column] = vector.
_w;
4286 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
4287 GX_ASSERT(column < 4,
"指定された列数が大きすぎます(%d)", column);
4288 return _m[row][column];
4300 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
4301 GX_ASSERT(column < 4,
"指定された列数が大きすぎます(%d)", column);
4302 _m[row][column] = value;
4313 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
4314 GX_ASSERT(column < 4,
"指定された列数が大きすぎます(%d)", column);
4315 return _m[row][column];
4326 GX_ASSERT(row < 4,
"指定された行数が大きすぎます(%d)", row);
4327 GX_ASSERT(column < 4,
"指定された列数が大きすぎます(%d)", column);
4328 return _m[row][column];
4360 _m[0][1],
_m[1][1],
_m[2][1],
_m[3][1],
4361 _m[0][2],
_m[1][2],
_m[2][2],
_m[3][2],
4362 _m[0][3],
_m[1][3],
_m[2][3],
_m[3][3]);
4377 matrix.
_m[0][0] = x.
_x;
4378 matrix.
_m[0][1] = x.
_y;
4379 matrix.
_m[0][2] = x.
_z;
4380 matrix.
_m[0][3] = 0.0f;
4382 matrix.
_m[1][0] = y.
_x;
4383 matrix.
_m[1][1] = y.
_y;
4384 matrix.
_m[1][2] = y.
_z;
4385 matrix.
_m[1][3] = 0.0f;
4387 matrix.
_m[2][0] = z.
_x;
4388 matrix.
_m[2][1] = z.
_y;
4389 matrix.
_m[2][2] = z.
_z;
4390 matrix.
_m[2][3] = 0.0f;
4404 dst.
_m[0][0] = matrix.
_m[0][0] * scalar;
4405 dst.
_m[0][1] = matrix.
_m[0][1] * scalar;
4406 dst.
_m[0][2] = matrix.
_m[0][2] * scalar;
4407 dst.
_m[0][3] = matrix.
_m[0][3] * scalar;
4409 dst.
_m[1][0] = matrix.
_m[1][0] * scalar;
4410 dst.
_m[1][1] = matrix.
_m[1][1] * scalar;
4411 dst.
_m[1][2] = matrix.
_m[1][2] * scalar;
4412 dst.
_m[1][3] = matrix.
_m[1][3] * scalar;
4414 dst.
_m[2][0] = matrix.
_m[2][0] * scalar;
4415 dst.
_m[2][1] = matrix.
_m[2][1] * scalar;
4416 dst.
_m[2][2] = matrix.
_m[2][2] * scalar;
4417 dst.
_m[2][3] = matrix.
_m[2][3] * scalar;
4419 dst.
_m[3][0] = matrix.
_m[3][0] * scalar;
4420 dst.
_m[3][1] = matrix.
_m[3][1] * scalar;
4421 dst.
_m[3][2] = matrix.
_m[3][2] * scalar;
4422 dst.
_m[3][3] = matrix.
_m[3][3] * scalar;
4436 auto inverseScalar = 1.0f / scalar;
4438 dst.
_m[0][0] = matrix.
_m[0][0] * inverseScalar;
4439 dst.
_m[0][1] = matrix.
_m[0][1] * inverseScalar;
4440 dst.
_m[0][2] = matrix.
_m[0][2] * inverseScalar;
4441 dst.
_m[0][3] = matrix.
_m[0][3] * inverseScalar;
4443 dst.
_m[1][0] = matrix.
_m[1][0] * inverseScalar;
4444 dst.
_m[1][1] = matrix.
_m[1][1] * inverseScalar;
4445 dst.
_m[1][2] = matrix.
_m[1][2] * inverseScalar;
4446 dst.
_m[1][3] = matrix.
_m[1][3] * inverseScalar;
4448 dst.
_m[2][0] = matrix.
_m[2][0] * inverseScalar;
4449 dst.
_m[2][1] = matrix.
_m[2][1] * inverseScalar;
4450 dst.
_m[2][2] = matrix.
_m[2][2] * inverseScalar;
4451 dst.
_m[2][3] = matrix.
_m[2][3] * inverseScalar;
4453 dst.
_m[3][0] = matrix.
_m[3][0] * inverseScalar;
4454 dst.
_m[3][1] = matrix.
_m[3][1] * inverseScalar;
4455 dst.
_m[3][2] = matrix.
_m[3][2] * inverseScalar;
4456 dst.
_m[3][3] = matrix.
_m[3][3] * inverseScalar;
4470 dst.
_m[0][0] = matrix0.
_m[0][0] + matrix1.
_m[0][0];
4471 dst.
_m[0][1] = matrix0.
_m[0][1] + matrix1.
_m[0][1];
4472 dst.
_m[0][2] = matrix0.
_m[0][2] + matrix1.
_m[0][2];
4473 dst.
_m[0][3] = matrix0.
_m[0][3] + matrix1.
_m[0][3];
4475 dst.
_m[1][0] = matrix0.
_m[1][0] + matrix1.
_m[1][0];
4476 dst.
_m[1][1] = matrix0.
_m[1][1] + matrix1.
_m[1][1];
4477 dst.
_m[1][2] = matrix0.
_m[1][2] + matrix1.
_m[1][2];
4478 dst.
_m[1][3] = matrix0.
_m[1][3] + matrix1.
_m[1][3];
4480 dst.
_m[2][0] = matrix0.
_m[2][0] + matrix1.
_m[2][0];
4481 dst.
_m[2][1] = matrix0.
_m[2][1] + matrix1.
_m[2][1];
4482 dst.
_m[2][2] = matrix0.
_m[2][2] + matrix1.
_m[2][2];
4483 dst.
_m[2][3] = matrix0.
_m[2][3] + matrix1.
_m[2][3];
4485 dst.
_m[3][0] = matrix0.
_m[3][0] + matrix1.
_m[3][0];
4486 dst.
_m[3][1] = matrix0.
_m[3][1] + matrix1.
_m[3][1];
4487 dst.
_m[3][2] = matrix0.
_m[3][2] + matrix1.
_m[3][2];
4488 dst.
_m[3][3] = matrix0.
_m[3][3] + matrix1.
_m[3][3];
4502#if defined(GX_USE_SSE2)
4503 for(s32 i=0; i < 4; ++i)
4505 __m128 curRow = matrix0._r[i];
4507 __m128 mx = _mm_shuffle_ps(curRow, curRow, _MM_SHUFFLE(0,0,0,0));
4508 __m128 my = _mm_shuffle_ps(curRow, curRow, _MM_SHUFFLE(1,1,1,1));
4509 __m128 mz = _mm_shuffle_ps(curRow, curRow, _MM_SHUFFLE(2,2,2,2));
4510 __m128 mw = _mm_shuffle_ps(curRow, curRow, _MM_SHUFFLE(3,3,3,3));
4512 mx = _mm_mul_ps(mx, matrix1._r[0]);
4513 my = _mm_mul_ps(my, matrix1._r[1]);
4514 mz = _mm_mul_ps(mz, matrix1._r[2]);
4515 mw = _mm_mul_ps(mw, matrix1._r[3]);
4517 dst._r[i] = _mm_add_ps(_mm_add_ps(mx,my), _mm_add_ps(mz,mw));
4521 const auto m00 = matrix0.
_m[0][0] * matrix1.
_m[0][0] + matrix0.
_m[0][1] * matrix1.
_m[1][0] + matrix0.
_m[0][2] * matrix1.
_m[2][0] + matrix0.
_m[0][3] * matrix1.
_m[3][0];
4522 const auto m01 = matrix0.
_m[0][0] * matrix1.
_m[0][1] + matrix0.
_m[0][1] * matrix1.
_m[1][1] + matrix0.
_m[0][2] * matrix1.
_m[2][1] + matrix0.
_m[0][3] * matrix1.
_m[3][1];
4523 const auto m02 = matrix0.
_m[0][0] * matrix1.
_m[0][2] + matrix0.
_m[0][1] * matrix1.
_m[1][2] + matrix0.
_m[0][2] * matrix1.
_m[2][2] + matrix0.
_m[0][3] * matrix1.
_m[3][2];
4524 const auto m03 = matrix0.
_m[0][0] * matrix1.
_m[0][3] + matrix0.
_m[0][1] * matrix1.
_m[1][3] + matrix0.
_m[0][2] * matrix1.
_m[2][3] + matrix0.
_m[0][3] * matrix1.
_m[3][3];
4526 const auto m10 = matrix0.
_m[1][0] * matrix1.
_m[0][0] + matrix0.
_m[1][1] * matrix1.
_m[1][0] + matrix0.
_m[1][2] * matrix1.
_m[2][0] + matrix0.
_m[1][3] * matrix1.
_m[3][0];
4527 const auto m11 = matrix0.
_m[1][0] * matrix1.
_m[0][1] + matrix0.
_m[1][1] * matrix1.
_m[1][1] + matrix0.
_m[1][2] * matrix1.
_m[2][1] + matrix0.
_m[1][3] * matrix1.
_m[3][1];
4528 const auto m12 = matrix0.
_m[1][0] * matrix1.
_m[0][2] + matrix0.
_m[1][1] * matrix1.
_m[1][2] + matrix0.
_m[1][2] * matrix1.
_m[2][2] + matrix0.
_m[1][3] * matrix1.
_m[3][2];
4529 const auto m13 = matrix0.
_m[1][0] * matrix1.
_m[0][3] + matrix0.
_m[1][1] * matrix1.
_m[1][3] + matrix0.
_m[1][2] * matrix1.
_m[2][3] + matrix0.
_m[1][3] * matrix1.
_m[3][3];
4531 const auto m20 = matrix0.
_m[2][0] * matrix1.
_m[0][0] + matrix0.
_m[2][1] * matrix1.
_m[1][0] + matrix0.
_m[2][2] * matrix1.
_m[2][0] + matrix0.
_m[2][3] * matrix1.
_m[3][0];
4532 const auto m21 = matrix0.
_m[2][0] * matrix1.
_m[0][1] + matrix0.
_m[2][1] * matrix1.
_m[1][1] + matrix0.
_m[2][2] * matrix1.
_m[2][1] + matrix0.
_m[2][3] * matrix1.
_m[3][1];
4533 const auto m22 = matrix0.
_m[2][0] * matrix1.
_m[0][2] + matrix0.
_m[2][1] * matrix1.
_m[1][2] + matrix0.
_m[2][2] * matrix1.
_m[2][2] + matrix0.
_m[2][3] * matrix1.
_m[3][2];
4534 const auto m23 = matrix0.
_m[2][0] * matrix1.
_m[0][3] + matrix0.
_m[2][1] * matrix1.
_m[1][3] + matrix0.
_m[2][2] * matrix1.
_m[2][3] + matrix0.
_m[2][3] * matrix1.
_m[3][3];
4536 const auto m30 = matrix0.
_m[3][0] * matrix1.
_m[0][0] + matrix0.
_m[3][1] * matrix1.
_m[1][0] + matrix0.
_m[3][2] * matrix1.
_m[2][0] + matrix0.
_m[3][3] * matrix1.
_m[3][0];
4537 const auto m31 = matrix0.
_m[3][0] * matrix1.
_m[0][1] + matrix0.
_m[3][1] * matrix1.
_m[1][1] + matrix0.
_m[3][2] * matrix1.
_m[2][1] + matrix0.
_m[3][3] * matrix1.
_m[3][1];
4538 const auto m32 = matrix0.
_m[3][0] * matrix1.
_m[0][2] + matrix0.
_m[3][1] * matrix1.
_m[1][2] + matrix0.
_m[3][2] * matrix1.
_m[2][2] + matrix0.
_m[3][3] * matrix1.
_m[3][2];
4539 const auto m33 = matrix0.
_m[3][0] * matrix1.
_m[0][3] + matrix0.
_m[3][1] * matrix1.
_m[1][3] + matrix0.
_m[3][2] * matrix1.
_m[2][3] + matrix0.
_m[3][3] * matrix1.
_m[3][3];
4594 dst.
_m[0][0] = m00 * d;
4595 dst.
_m[0][1] = m01 * d;
4596 dst.
_m[0][2] = m02 * d;
4597 dst.
_m[0][3] = m03 * d;
4599 dst.
_m[1][0] = m10 * d;
4600 dst.
_m[1][1] = m11 * d;
4601 dst.
_m[1][2] = m12 * d;
4602 dst.
_m[1][3] = m13 * d;
4604 dst.
_m[2][0] = m20 * d;
4605 dst.
_m[2][1] = m21 * d;
4606 dst.
_m[2][2] = m22 * d;
4607 dst.
_m[2][3] = m23 * d;
4609 dst.
_m[3][0] = m30 * d;
4610 dst.
_m[3][1] = m31 * d;
4611 dst.
_m[3][2] = m32 * d;
4612 dst.
_m[3][3] = m33 * d;
4625 const auto m00 = matrix.
_m[0][0];
4626 const auto m01 = matrix.
_m[1][0];
4627 const auto m02 = matrix.
_m[2][0];
4628 const auto m03 = matrix.
_m[3][0];
4630 const auto m10 = matrix.
_m[0][1];
4631 const auto m11 = matrix.
_m[1][1];
4632 const auto m12 = matrix.
_m[2][1];
4633 const auto m13 = matrix.
_m[3][1];
4635 const auto m20 = matrix.
_m[0][2];
4636 const auto m21 = matrix.
_m[1][2];
4637 const auto m22 = matrix.
_m[2][2];
4638 const auto m23 = matrix.
_m[3][2];
4640 const auto m30 = matrix.
_m[0][3];
4641 const auto m31 = matrix.
_m[1][3];
4642 const auto m32 = matrix.
_m[2][3];
4643 const auto m33 = matrix.
_m[3][3];
4705 auto inverseScalar = 1.0f / scalar;
4707 _m[0][0] *= inverseScalar;
4708 _m[0][1] *= inverseScalar;
4709 _m[0][2] *= inverseScalar;
4710 _m[0][3] *= inverseScalar;
4712 _m[1][0] *= inverseScalar;
4713 _m[1][1] *= inverseScalar;
4714 _m[1][2] *= inverseScalar;
4715 _m[1][3] *= inverseScalar;
4717 _m[2][0] *= inverseScalar;
4718 _m[2][1] *= inverseScalar;
4719 _m[2][2] *= inverseScalar;
4720 _m[2][3] *= inverseScalar;
4722 _m[3][0] *= inverseScalar;
4723 _m[3][1] *= inverseScalar;
4724 _m[3][2] *= inverseScalar;
4725 _m[3][3] *= inverseScalar;
4737 _m[0][0] += matrix.
_m[0][0];
4738 _m[0][1] += matrix.
_m[0][1];
4739 _m[0][2] += matrix.
_m[0][2];
4740 _m[0][3] += matrix.
_m[0][3];
4742 _m[1][0] += matrix.
_m[1][0];
4743 _m[1][1] += matrix.
_m[1][1];
4744 _m[1][2] += matrix.
_m[1][2];
4745 _m[1][3] += matrix.
_m[1][3];
4747 _m[2][0] += matrix.
_m[2][0];
4748 _m[2][1] += matrix.
_m[2][1];
4749 _m[2][2] += matrix.
_m[2][2];
4750 _m[2][3] += matrix.
_m[2][3];
4752 _m[3][0] += matrix.
_m[3][0];
4753 _m[3][1] += matrix.
_m[3][1];
4754 _m[3][2] += matrix.
_m[3][2];
4755 _m[3][3] += matrix.
_m[3][3];
4833#if GX_MATRIX_SAFE_MODE
4837 const auto r00 = 1.0f - 2.0f * (quaternion.
_y * quaternion.
_y + quaternion.
_z * quaternion.
_z);
4838 const auto r01 = 2.0f * (quaternion.
_x * quaternion.
_y + quaternion.
_w * quaternion.
_z);
4839 const auto r02 = 2.0f * (quaternion.
_x * quaternion.
_z - quaternion.
_w * quaternion.
_y);
4841 const auto r10 = 2.0f * (quaternion.
_x * quaternion.
_y - quaternion.
_w * quaternion.
_z);
4842 const auto r11 = 1.0f - 2.0f * (quaternion.
_x * quaternion.
_x + quaternion.
_z * quaternion.
_z);
4843 const auto r12 = 2.0f * (quaternion.
_y * quaternion.
_z + quaternion.
_w * quaternion.
_x);
4845 const auto r20 = 2.0f * (quaternion.
_x * quaternion.
_z + quaternion.
_w * quaternion.
_y);
4846 const auto r21 = 2.0f * (quaternion.
_y * quaternion.
_z - quaternion.
_w * quaternion.
_x);
4847 const auto r22 = 1.0f - 2.0f * (quaternion.
_x * quaternion.
_x + quaternion.
_y * quaternion.
_y);
4849 const auto m00 =
_m[0][0] * r00 +
_m[0][1] * r10 +
_m[0][2] * r20;
4850 const auto m01 =
_m[0][0] * r01 +
_m[0][1] * r11 +
_m[0][2] * r21;
4851 const auto m02 =
_m[0][0] * r02 +
_m[0][1] * r12 +
_m[0][2] * r22;
4853 const auto m10 =
_m[1][0] * r00 +
_m[1][1] * r10 +
_m[1][2] * r20;
4854 const auto m11 =
_m[1][0] * r01 +
_m[1][1] * r11 +
_m[1][2] * r21;
4855 const auto m12 =
_m[1][0] * r02 +
_m[1][1] * r12 +
_m[1][2] * r22;
4857 const auto m20 =
_m[2][0] * r00 +
_m[2][1] * r10 +
_m[2][2] * r20;
4858 const auto m21 =
_m[2][0] * r01 +
_m[2][1] * r11 +
_m[2][2] * r21;
4859 const auto m22 =
_m[2][0] * r02 +
_m[2][1] * r12 +
_m[2][2] * r22;
4861 const auto m30 =
_m[3][0] * r00 +
_m[3][1] * r10 +
_m[3][2] * r20;
4862 const auto m31 =
_m[3][0] * r01 +
_m[3][1] * r11 +
_m[3][2] * r21;
4863 const auto m32 =
_m[3][0] * r02 +
_m[3][1] * r12 +
_m[3][2] * r22;
4892#if GX_MATRIX_SAFE_MODE
4897 _m[0][0] +=
_m[0][3] * vector.
_x;
4898 _m[0][1] +=
_m[0][3] * vector.
_y;
4899 _m[0][2] +=
_m[0][3] * vector.
_z;
4901 _m[1][0] +=
_m[1][3] * vector.
_x;
4902 _m[1][1] +=
_m[1][3] * vector.
_y;
4903 _m[1][2] +=
_m[1][3] * vector.
_z;
4905 _m[2][0] +=
_m[2][3] * vector.
_x;
4906 _m[2][1] +=
_m[2][3] * vector.
_y;
4907 _m[2][2] +=
_m[2][3] * vector.
_z;
4909 _m[3][0] +=
_m[3][3] * vector.
_x;
4910 _m[3][1] +=
_m[3][3] * vector.
_y;
4911 _m[3][2] +=
_m[3][3] * vector.
_z;
4926#if GX_MATRIX_SAFE_MODE
4931 _m[0][0] +=
_m[0][3] * x;
4932 _m[0][1] +=
_m[0][3] * y;
4933 _m[0][2] +=
_m[0][3] * z;
4935 _m[1][0] +=
_m[1][3] * x;
4936 _m[1][1] +=
_m[1][3] * y;
4937 _m[1][2] +=
_m[1][3] * z;
4939 _m[2][0] +=
_m[2][3] * x;
4940 _m[2][1] +=
_m[2][3] * y;
4941 _m[2][2] +=
_m[2][3] * z;
4943 _m[3][0] +=
_m[3][3] * x;
4944 _m[3][1] +=
_m[3][3] * y;
4945 _m[3][2] +=
_m[3][3] * z;
4958#if GX_MATRIX_SAFE_MODE
4963 _m[0][0] =
_m[0][0] * vector.
_x;
4964 _m[0][1] =
_m[0][1] * vector.
_y;
4965 _m[0][2] =
_m[0][2] * vector.
_z;
4967 _m[1][0] =
_m[1][0] * vector.
_x;
4968 _m[1][1] =
_m[1][1] * vector.
_y;
4969 _m[1][2] =
_m[1][2] * vector.
_z;
4971 _m[2][0] =
_m[2][0] * vector.
_x;
4972 _m[2][1] =
_m[2][1] * vector.
_y;
4973 _m[2][2] =
_m[2][2] * vector.
_z;
4975 _m[3][0] =
_m[3][0] * vector.
_x;
4976 _m[3][1] =
_m[3][1] * vector.
_y;
4977 _m[3][2] =
_m[3][2] * vector.
_z;
4992#if GX_MATRIX_SAFE_MODE
4997 _m[0][0] =
_m[0][0] * x;
4998 _m[0][1] =
_m[0][1] * y;
4999 _m[0][2] =
_m[0][2] * z;
5001 _m[1][0] =
_m[1][0] * x;
5002 _m[1][1] =
_m[1][1] * y;
5003 _m[1][2] =
_m[1][2] * z;
5005 _m[2][0] =
_m[2][0] * x;
5006 _m[2][1] =
_m[2][1] * y;
5007 _m[2][2] =
_m[2][2] * z;
5009 _m[3][0] =
_m[3][0] * x;
5010 _m[3][1] =
_m[3][1] * y;
5011 _m[3][2] =
_m[3][2] * z;
5074 const auto m00 =
_m[0][0];
5075 const auto m01 =
_m[1][0];
5076 const auto m02 =
_m[2][0];
5077 const auto m03 =
_m[3][0];
5079 const auto m10 =
_m[0][1];
5080 const auto m11 =
_m[1][1];
5081 const auto m12 =
_m[2][1];
5082 const auto m13 =
_m[3][1];
5084 const auto m20 =
_m[0][2];
5085 const auto m21 =
_m[1][2];
5086 const auto m22 =
_m[2][2];
5087 const auto m23 =
_m[3][2];
5089 const auto m30 =
_m[0][3];
5090 const auto m31 =
_m[1][3];
5091 const auto m32 =
_m[2][3];
5092 const auto m33 =
_m[3][3];
5122#if defined(GX_USE_SSE2)
5123 _r[0] = _mm_setzero_ps();
5124 _r[1] = _mm_setzero_ps();
5125 _r[2] = _mm_setzero_ps();
5126 _r[3] = _mm_setzero_ps();
5128 for( u32 c = 0; c < 4; c++ )
5147 _m[0][0] = matrix.
_m[0][0];
5148 _m[0][1] = matrix.
_m[1][0];
5149 _m[0][2] = matrix.
_m[2][0];
5150 _m[0][3] = matrix.
_m[3][0];
5152 _m[1][0] = matrix.
_m[0][1];
5153 _m[1][1] = matrix.
_m[1][1];
5154 _m[1][2] = matrix.
_m[2][1];
5155 _m[1][3] = matrix.
_m[3][1];
5157 _m[2][0] = matrix.
_m[0][2];
5158 _m[2][1] = matrix.
_m[1][2];
5159 _m[2][2] = matrix.
_m[2][2];
5160 _m[2][3] = matrix.
_m[3][2];
5167 f32 m10, f32 m11, f32 m12, f32 m13,
5168 f32 m20, f32 m21, f32 m22, f32 m23)
5192 _m[0][0] = matrix.
_m[0][0];
5193 _m[0][1] = matrix.
_m[0][1];
5194 _m[0][2] = matrix.
_m[0][2];
5195 _m[0][3] = matrix.
_m[0][3];
5197 _m[1][0] = matrix.
_m[1][0];
5198 _m[1][1] = matrix.
_m[1][1];
5199 _m[1][2] = matrix.
_m[1][2];
5200 _m[1][3] = matrix.
_m[1][3];
5202 _m[2][0] = matrix.
_m[2][0];
5203 _m[2][1] = matrix.
_m[2][1];
5204 _m[2][2] = matrix.
_m[2][2];
5205 _m[2][3] = matrix.
_m[2][3];
5217 _m[0][0] = matrix.
_m[0][0];
5218 _m[0][1] = matrix.
_m[1][0];
5219 _m[0][2] = matrix.
_m[2][0];
5220 _m[0][3] = matrix.
_m[3][0];
5222 _m[1][0] = matrix.
_m[0][1];
5223 _m[1][1] = matrix.
_m[1][1];
5224 _m[1][2] = matrix.
_m[2][1];
5225 _m[1][3] = matrix.
_m[3][1];
5227 _m[2][0] = matrix.
_m[0][2];
5228 _m[2][1] = matrix.
_m[1][2];
5229 _m[2][2] = matrix.
_m[2][2];
5230 _m[2][3] = matrix.
_m[3][2];
5232 _m[3][0] = matrix.
_m[0][3];
5233 _m[3][1] = matrix.
_m[1][3];
5234 _m[3][2] = matrix.
_m[2][3];
5235 _m[3][3] = matrix.
_m[3][3];
5242 f32 m10, f32 m11, f32 m12, f32 m13,
5243 f32 m20, f32 m21, f32 m22, f32 m23,
5244 f32 m30, f32 m31, f32 m32, f32 m33)
5273 _m[0][0] = matrix._m[0][0];
5274 _m[0][1] = matrix._m[0][1];
5275 _m[0][2] = matrix._m[0][2];
5276 _m[0][3] = matrix._m[0][3];
5278 _m[1][0] = matrix._m[1][0];
5279 _m[1][1] = matrix._m[1][1];
5280 _m[1][2] = matrix._m[1][2];
5281 _m[1][3] = matrix._m[1][3];
5283 _m[2][0] = matrix._m[2][0];
5284 _m[2][1] = matrix._m[2][1];
5285 _m[2][2] = matrix._m[2][2];
5286 _m[2][3] = matrix._m[2][3];
5288 _m[3][0] = matrix._m[3][0];
5289 _m[3][1] = matrix._m[3][1];
5290 _m[3][2] = matrix._m[3][2];
5291 _m[3][3] = matrix._m[3][3];
5294GX_CORE_NAMESPACE_END()
INIT
初期化タイプ
Definition GxMath.h:53
GX_FORCE_INLINE const GxMatrix22 operator+(const GxMatrix22 &matrix0, const GxMatrix22 &matrix1)
Definition GxMatrix.inl:139
GX_FORCE_INLINE const GxMatrix22 operator/(const GxMatrix22 &matrix, f32 scalar)
Definition GxMatrix.inl:127
GX_FORCE_INLINE const GxMatrix22 operator*(const GxMatrix22 &matrix, f32 scalar)
Definition GxMatrix.inl:115
static GX_FORCE_INLINE f32 getCos(const f32 radian)
余弦を取得(f32)
Definition GxMath.h:212
static GX_FORCE_INLINE f32 getASin(const f32 value)
逆正弦を取得(f32)
Definition GxMath.h:226
static GX_FORCE_INLINE f32 getATan2(const f32 valueY, const f32 valueX)
逆正接を取得(f32)
Definition GxMath.h:247
static GX_FORCE_INLINE f32 getSin(const f32 radian)
正弦を取得(f32)
Definition GxMath.h:205
2×2行列(行優先)
Definition GxMatrix.h:37
GX_FORCE_INLINE b32 operator!=(const GxMatrix22 &matrix)
不一致
Definition GxMatrix.inl:173
static GX_FORCE_INLINE const GxMatrix22 & getMulScalar(GxMatrix22 &dst, const GxMatrix22 &matrix, f32 scalar)
スカラ乗算を取得
Definition GxMatrix.inl:327
static GX_FORCE_INLINE const GxMatrix22 & getDivScalar(GxMatrix22 &dst, const GxMatrix22 &matrix, f32 scalar)
スカラ除算を取得
Definition GxMatrix.inl:345
GX_FORCE_INLINE const GxMatrix22 & addMatrix(const GxMatrix22 &matrix)
行列加算
Definition GxMatrix.inl:488
GX_FORCE_INLINE const GxMatrix22 & mulScalar(f32 scalar)
スカラ乗算
Definition GxMatrix.inl:454
GxMatrix22(void)
コンストラクタ
Definition GxMatrix.h:57
GX_FORCE_INLINE f32 getDeterminant(void) const
行列式の値を取得
Definition GxMatrix.inl:295
GX_FORCE_INLINE GxMatrix22 getTranspose(void) const
転置行列を取得
Definition GxMatrix.inl:314
GX_FORCE_INLINE GxVector2 getColumn(u32 column) const
列を取得
Definition GxMatrix.inl:219
GX_FORCE_INLINE b32 operator==(const GxMatrix22 &matrix)
一致
Definition GxMatrix.inl:162
GX_FORCE_INLINE const GxMatrix22 & divScalar(f32 scalar)
スカラ除算
Definition GxMatrix.inl:470
GX_FORCE_INLINE GxMatrix22 & operator*=(f32 scalar)
スカラ乗算代入
Definition GxMatrix.inl:66
static GX_FORCE_INLINE const GxMatrix22 & getMulMatrix(GxMatrix22 &dst, const GxMatrix22 &matrix0, const GxMatrix22 &matrix1)
行列乗算を取得
Definition GxMatrix.inl:383
f32 _m[2][4]
値
Definition GxMatrix.h:160
GX_FORCE_INLINE GxMatrix22 & operator+=(const GxMatrix22 &matrix)
行列加算代入
Definition GxMatrix.inl:90
GX_FORCE_INLINE const GxMatrix22 & mulMatrix(const GxMatrix22 &matrix)
行列乗算
Definition GxMatrix.inl:504
GX_FORCE_INLINE GxMatrix22 & operator/=(f32 scalar)
スカラ除算代入
Definition GxMatrix.inl:78
GX_FORCE_INLINE void setValue(u32 row, u32 column, f32 value)
値を設定
Definition GxMatrix.inl:258
GX_FORCE_INLINE const GxMatrix22 & transpose(void)
転置する
Definition GxMatrix.inl:548
GX_FORCE_INLINE void setColumn(u32 column, const GxVector2 &vector)
列を設定
Definition GxMatrix.inl:231
GX_FORCE_INLINE GxMatrix22 & operator=(const GxMatrix22 &matrix)
代入
Definition GxMatrix.inl:50
GX_FORCE_INLINE const GxVector2 & getRow(u32 row) const
行を取得
Definition GxMatrix.inl:195
GX_FORCE_INLINE f32 getValue(u32 row, u32 column) const
値を取得
Definition GxMatrix.inl:244
GX_FORCE_INLINE GxMatrix22 getInverse(void) const
逆行列を取得
Definition GxMatrix.inl:304
static GX_FORCE_INLINE const GxMatrix22 & getAddMatrix(GxMatrix22 &dst, const GxMatrix22 &matrix0, const GxMatrix22 &matrix1)
行列加算を取得
Definition GxMatrix.inl:365
GX_FORCE_INLINE const GxMatrix22 & inverse(void)
逆行列にする
Definition GxMatrix.inl:525
GX_FORCE_INLINE f32 & getReference(u32 row, u32 column)
参照を取得
Definition GxMatrix.inl:271
GX_FORCE_INLINE void setRow(u32 row, const GxVector2 &vector)
行を設定
Definition GxMatrix.inl:207
GX_FORCE_INLINE void setIdentity(void)
単位行列に設定
Definition GxMatrix.inl:181
3×3行列(行優先)
Definition GxMatrix.h:169
GX_FORCE_INLINE const GxMatrix33 & mulScalar(f32 scalar)
スカラ乗算
Definition GxMatrix.inl:1201
GX_FORCE_INLINE void setRow(u32 row, const GxVector3 &vector)
行を設定
Definition GxMatrix.inl:895
GX_FORCE_INLINE f32 & getReference(u32 row, u32 column)
参照を取得
Definition GxMatrix.inl:960
static GX_FORCE_INLINE const GxMatrix33 & getMulMatrix(GxMatrix33 &dst, const GxMatrix33 &matrix0, const GxMatrix33 &matrix1)
行列乗算を取得
Definition GxMatrix.inl:1093
GX_FORCE_INLINE GxMatrix33 & operator=(const GxMatrix33 &matrix)
代入
Definition GxMatrix.inl:592
GX_FORCE_INLINE const GxMatrix33 & mulRotate(f32 radian)
回転乗算
Definition GxMatrix.inl:1303
GX_FORCE_INLINE GxMatrix33 & operator+=(const GxMatrix33 &matrix)
行列加算代入
Definition GxMatrix.inl:638
GX_FORCE_INLINE void setTranslate(const GxVector2 &vector)
平行移動行列を設定
Definition GxMatrix.inl:779
GX_FORCE_INLINE GxVector3 getColumn(u32 column) const
列を取得
Definition GxMatrix.inl:908
static GX_FORCE_INLINE const GxMatrix33 & getMulScalar(GxMatrix33 &dst, const GxMatrix33 &matrix, f32 scalar)
スカラ乗算を取得
Definition GxMatrix.inl:1019
GX_FORCE_INLINE const GxVector3 & getRow(u32 row) const
行を取得
Definition GxMatrix.inl:884
GX_FORCE_INLINE const GxMatrix33 & mulTranslate(const GxVector2 &vector)
平行移動乗算
Definition GxMatrix.inl:1317
GX_FORCE_INLINE GxMatrix33 & operator*=(f32 scalar)
スカラ乗算代入
Definition GxMatrix.inl:614
GX_FORCE_INLINE const GxMatrix33 & inverse(void)
逆行列にする
Definition GxMatrix.inl:1406
GX_FORCE_INLINE GxMatrix33 & operator/=(f32 scalar)
スカラ除算代入
Definition GxMatrix.inl:626
GX_FORCE_INLINE void setPosition(const GxVector2 &position)
平行移動量のみを設定
Definition GxMatrix.inl:820
f32 _m[3][4]
値
Definition GxMatrix.h:321
GX_FORCE_INLINE void setColumn(u32 column, const GxVector3 &vector)
列を設定
Definition GxMatrix.inl:919
GX_FORCE_INLINE GxMatrix33 getInverse(void) const
逆行列を取得
Definition GxMatrix.inl:995
GX_FORCE_INLINE void setRotate(f32 sinValue, f32 cosValue)
回転行列を設定
Definition GxMatrix.inl:759
GX_FORCE_INLINE const GxMatrix33 & divScalar(f32 scalar)
スカラ除算
Definition GxMatrix.inl:1223
GX_FORCE_INLINE b32 operator!=(const GxMatrix33 &matrix)
不一致
Definition GxMatrix.inl:730
GxMatrix33(void)
コンストラクタ
Definition GxMatrix.h:189
GX_FORCE_INLINE f32 getValue(u32 row, u32 column) const
値を取得
Definition GxMatrix.inl:933
GX_FORCE_INLINE f32 getDeterminant(void) const
行列式の値を取得
Definition GxMatrix.inl:984
GX_FORCE_INLINE void setIdentity(void)
単位行列に設定
Definition GxMatrix.inl:738
GX_FORCE_INLINE const GxMatrix33 & addMatrix(const GxMatrix33 &matrix)
行列加算
Definition GxMatrix.inl:1247
GX_FORCE_INLINE void setValue(u32 row, u32 column, f32 value)
値を設定
Definition GxMatrix.inl:947
static GX_FORCE_INLINE const GxMatrix33 & getAddMatrix(GxMatrix33 &dst, const GxMatrix33 &matrix0, const GxMatrix33 &matrix1)
行列加算を取得
Definition GxMatrix.inl:1069
GX_FORCE_INLINE b32 operator==(const GxMatrix33 &matrix)
一致
Definition GxMatrix.inl:718
GX_FORCE_INLINE GxMatrix33 getTranspose(void) const
転置行列を取得
Definition GxMatrix.inl:1005
GX_FORCE_INLINE const GxMatrix33 & transpose(void)
転置する
Definition GxMatrix.inl:1441
static GX_FORCE_INLINE const GxMatrix33 & getDivScalar(GxMatrix33 &dst, const GxMatrix33 &matrix, f32 scalar)
スカラ除算を取得
Definition GxMatrix.inl:1043
GX_FORCE_INLINE void setScale(const GxVector2 &vector)
スケール行列を設定
Definition GxMatrix.inl:843
GX_FORCE_INLINE const GxMatrix33 & mulMatrix(const GxMatrix33 &matrix)
行列乗算
Definition GxMatrix.inl:1269
GX_FORCE_INLINE const GxMatrix33 & mulScale(const GxVector2 &vector)
スケール乗算
Definition GxMatrix.inl:1356
4×4行列(GPU用)
Definition GxMatrix.h:915
GxMatrix44Gpu(void)
デフォルトコンストラクタ
Definition GxMatrix.h:922
4×4行列(行優先)
Definition GxMatrix.h:607
GX_FORCE_INLINE b32 operator==(const GxMatrix44 &matrix)
一致
Definition GxMatrix.inl:3697
GX_FORCE_INLINE GxVector3 getRotateZXY(void) const
ZXY軸回転角を取得
Definition GxMatrix.inl:3961
GX_FORCE_INLINE GxMatrix44 getInverse(void) const
逆行列を取得
Definition GxMatrix.inl:4347
GX_FORCE_INLINE const GxMatrix44 & mulTranslate(const GxVector3 &vector)
平行移動乗算
Definition GxMatrix.inl:4890
GX_FORCE_INLINE const GxVector4 & getRow(u32 row) const
行を取得
Definition GxMatrix.inl:4232
GX_FORCE_INLINE void setRotate(const GxQuaternion &quaternion)
回転行列を設定
Definition GxMatrix.inl:4204
GX_FORCE_INLINE void setRotateAxis(const GxVector3 &vector, f32 radian)
回転行列を設定
Definition GxMatrix.inl:4173
GX_FORCE_INLINE const GxMatrix44 & mulRotateY(f32 radian)
Y軸回転乗算
Definition GxMatrix.inl:4790
GX_FORCE_INLINE void initialize(const GxQuaternion &quaternion, const GxVector3 &position)
初期化
Definition GxMatrix.inl:3560
GxMatrix44(void)
デフォルトコンストラクタ(要素は初期化されない)
Definition GxMatrix.h:630
static GX_FORCE_INLINE const GxMatrix44 & getMulScalar(GxMatrix44 &dst, const GxMatrix44 &matrix, f32 scalar)
スカラ乗算を取得
Definition GxMatrix.inl:4402
GX_FORCE_INLINE const GxMatrix44 & mulQuaternionFront(const GxQuaternion &quaternion)
クォータニオンによる回転乗算(前から乗算)
Definition GxMatrix.inl:4818
GX_FORCE_INLINE const GxMatrix44 & mulMatrix(const GxMatrix44 &matrix)
行列乗算
Definition GxMatrix.inl:4765
GX_FORCE_INLINE void setRotateZ(f32 sinValue, f32 cosValue)
回転行列を設定(Z軸回転)
Definition GxMatrix.inl:3805
GX_FORCE_INLINE GxVector3 getRotateXZY(void) const
XZY軸回転角を取得
Definition GxMatrix.inl:3865
static GX_FORCE_INLINE const GxMatrix44 & getDivScalar(GxMatrix44 &dst, const GxMatrix44 &matrix, f32 scalar)
スカラ除算を取得
Definition GxMatrix.inl:4434
GX_FORCE_INLINE GxMatrix44 & operator/=(f32 scalar)
スカラ除算代入
Definition GxMatrix.inl:3613
GX_FORCE_INLINE b32 operator!=(const GxMatrix44 &matrix)
不一致
Definition GxMatrix.inl:3710
GX_FORCE_INLINE GxMatrix44 & operator*=(f32 scalar)
スカラ乗算代入
Definition GxMatrix.inl:3601
GX_FORCE_INLINE void setTranslate(const GxVector3 &vector)
平行移動行列を設定
Definition GxMatrix.inl:4028
GX_FORCE_INLINE const GxMatrix44 & mulRotateZ(f32 radian)
Z軸回転乗算
Definition GxMatrix.inl:4804
GX_FORCE_INLINE GxVector4 getColumn(u32 column) const
列を取得
Definition GxMatrix.inl:4257
GX_FORCE_INLINE const GxMatrix44 & divScalar(f32 scalar)
スカラ除算
Definition GxMatrix.inl:4703
GX_FORCE_INLINE GxVector3 getRotateYXZ(void) const
YXZ軸回転角を取得
Definition GxMatrix.inl:3897
GX_FORCE_INLINE void setZero(void)
0を設定
Definition GxMatrix.inl:5120
GX_FORCE_INLINE f32 & getReference(u32 row, u32 column)
参照を取得
Definition GxMatrix.inl:4311
GX_FORCE_INLINE GxMatrix44 getNormalizeAxes(void) const
位置以外の各軸を正規化したものを取得
Definition GxMatrix.inl:4369
GX_FORCE_INLINE GxMatrix44 getTranspose(void) const
転置行列を取得
Definition GxMatrix.inl:4357
GX_FORCE_INLINE const GxMatrix44 & inverse(void)
逆行列を計算する
Definition GxMatrix.inl:5021
GX_FORCE_INLINE GxVector3 getRotateYZX(void) const
YZX軸回転角を取得
Definition GxMatrix.inl:3929
GX_FORCE_INLINE const GxMatrix44 & mulScale(const GxVector3 &vector)
スケール乗算
Definition GxMatrix.inl:4956
GX_FORCE_INLINE void setRow(u32 row, const GxVector4 &vector)
行を設定
Definition GxMatrix.inl:4243
GX_FORCE_INLINE f32 getDeterminant(void) const
行列式の値を取得
Definition GxMatrix.inl:4335
GX_FORCE_INLINE const GxVector3 & getPosition(void) const
平行移動量を取得
Definition GxMatrix.h:729
GX_FORCE_INLINE f32 getValue(u32 row, u32 column) const
値を取得
Definition GxMatrix.inl:4284
GX_FORCE_INLINE const GxMatrix44 & transpose(void)
転置する
Definition GxMatrix.inl:5072
GX_FORCE_INLINE void setColumn(u32 column, const GxVector4 &vector)
列を設定
Definition GxMatrix.inl:4269
GX_FORCE_INLINE void setIdentity(void)
単位行列に設定
Definition GxMatrix.inl:3718
f32 _m[4][4]
値
Definition GxMatrix.h:864
GX_FORCE_INLINE void setValue(u32 row, u32 column, f32 value)
値を設定
Definition GxMatrix.inl:4298
GX_FORCE_INLINE const GxMatrix44 & mulQuaternionBack(const GxQuaternion &quaternion)
クォータニオンによる回転乗算(後ろから乗算)
Definition GxMatrix.inl:4831
static GX_FORCE_INLINE const GxMatrix44 & getAddMatrix(GxMatrix44 &dst, const GxMatrix44 &matrix0, const GxMatrix44 &matrix1)
行列加算を取得
Definition GxMatrix.inl:4468
GX_FORCE_INLINE void setRotateY(f32 sinValue, f32 cosValue)
回転行列を設定(Y軸回転)
Definition GxMatrix.inl:3776
GX_FORCE_INLINE GxVector3 getRotateXYZ(void) const
XYZ軸回転角を取得
Definition GxMatrix.inl:3832
GX_FORCE_INLINE GxMatrix44 & operator+=(const GxMatrix44 &matrix)
行列加算代入
Definition GxMatrix.inl:3625
GX_FORCE_INLINE const GxMatrix44 & mulScalar(f32 scalar)
スカラ乗算
Definition GxMatrix.inl:4673
GX_FORCE_INLINE void setRotateX(f32 sinValue, f32 cosValue)
回転行列を設定(X軸回転)
Definition GxMatrix.inl:3747
GX_FORCE_INLINE GxMatrix44 & operator=(const GxMatrix44 &matrix)
代入
Definition GxMatrix.inl:3571
GX_FORCE_INLINE void setScale(const GxVector3 &vector)
スケール行列を設定
Definition GxMatrix.inl:4114
GX_FORCE_INLINE const GxMatrix44 & mulRotateX(f32 radian)
X軸回転乗算
Definition GxMatrix.inl:4776
GX_FORCE_INLINE const GxMatrix44 & addMatrix(const GxMatrix44 &matrix)
行列加算
Definition GxMatrix.inl:4735
static GX_FORCE_INLINE const GxMatrix44 & getMulMatrix(GxMatrix44 &dst, const GxMatrix44 &matrix0, const GxMatrix44 &matrix1)
行列乗算を取得
Definition GxMatrix.inl:4500
GX_FORCE_INLINE void setPosition(const GxVector3 &position)
平行移動量のみを設定
Definition GxMatrix.inl:4086
GX_FORCE_INLINE GxVector3 getRotateZYX(void) const
ZYX軸回転角を取得
Definition GxMatrix.inl:3994
アフィン変換行列(GPU用)
Definition GxMatrix.h:874
f32 _m[3][4]
値
Definition GxMatrix.h:906
GxMatrixAffineGpu(void)
デフォルトコンストラクタ
Definition GxMatrix.h:889
アフィン変換行列(行優先)
Definition GxMatrix.h:330
GX_FORCE_INLINE void setZero(void)
0を設定
Definition GxMatrix.inl:1619
GX_FORCE_INLINE GxMatrixAffine getInverse(void) const
逆行列を取得
Definition GxMatrix.inl:2430
f32 _m[4][4]
値
Definition GxMatrix.h:597
GX_FORCE_INLINE const GxMatrixAffine & mulRotateY(f32 radian)
Y軸回転乗算
Definition GxMatrix.inl:3045
GX_FORCE_INLINE b32 operator!=(const GxMatrixAffine &matrix)
不一致
Definition GxMatrix.inl:1789
GX_FORCE_INLINE const GxVector4 & getRow(u32 row) const
行を取得
Definition GxMatrix.inl:2281
GX_FORCE_INLINE f32 getDeterminant(void) const
行列式の値を取得
Definition GxMatrix.inl:2419
GX_FORCE_INLINE const GxMatrixAffine & mulTranslate(const GxVector3 &vector)
平行移動乗算
Definition GxMatrix.inl:3270
GX_FORCE_INLINE const GxMatrixAffine & inverse(void)
逆行列にする
Definition GxMatrix.inl:3377
GX_FORCE_INLINE f32 & getReference(u32 row, u32 column)
参照を取得
Definition GxMatrix.inl:2395
GX_FORCE_INLINE GxMatrixAffine & operator/=(f32 scalar)
スカラ除算代入
Definition GxMatrix.inl:1692
GX_FORCE_INLINE const GxMatrixAffine & mulQuaternionFront(const GxQuaternion &quaternion)
クォータニオンによる回転乗算(前から乗算)
Definition GxMatrix.inl:3073
GX_FORCE_INLINE GxMatrixAffine & operator*=(f32 scalar)
スカラ乗算代入
Definition GxMatrix.inl:1680
GX_FORCE_INLINE GxVector3 getRotateZXY(void) const
ZXY軸回転角を取得
Definition GxMatrix.inl:2024
GX_FORCE_INLINE void setScale(const GxVector3 &vector)
スケール行列を設定
Definition GxMatrix.inl:2179
static GX_FORCE_INLINE const GxMatrixAffine & getAddMatrix(GxMatrixAffine &dst, const GxMatrixAffine &matrix0, const GxMatrixAffine &matrix1)
行列加算を取得
Definition GxMatrix.inl:2532
GX_FORCE_INLINE const GxMatrixAffine & mulScale(const GxVector3 &vector)
スケール乗算
Definition GxMatrix.inl:3312
GX_FORCE_INLINE void setTranslate(const GxVector3 &vector)
平行移動行列を設定
Definition GxMatrix.inl:2091
GX_FORCE_INLINE void setIdentity(void)
単位行列に設定
Definition GxMatrix.inl:1797
GX_FORCE_INLINE const GxMatrixAffine & transpose(void)
転置する
Definition GxMatrix.inl:3386
static GX_FORCE_INLINE const GxMatrixAffine & getMulMatrix(GxMatrixAffine &dst, const GxMatrixAffine &matrix0, const GxMatrixAffine &matrix1)
行列乗算を取得
Definition GxMatrix.inl:2560
GX_FORCE_INLINE void setRow(u32 row, const GxVector4 &vector)
行を設定
Definition GxMatrix.inl:2304
GX_FORCE_INLINE void setRotate(const GxQuaternion &quaternion)
回転行列を設定
Definition GxMatrix.inl:2257
GX_FORCE_INLINE void initialize(const GxQuaternion &quaternion, const GxVector3 &position)
初期化
Definition GxMatrix.inl:1643
GX_FORCE_INLINE GxVector3 getRotateYXZ(void) const
YXZ軸回転角を取得
Definition GxMatrix.inl:1960
GX_FORCE_INLINE void setColumn(u32 column, const GxVector4 &vector)
列を設定
Definition GxMatrix.inl:2343
GX_FORCE_INLINE void setRotateY(f32 sinValue, f32 cosValue)
回転行列を設定(Y軸回転)
Definition GxMatrix.inl:1847
GX_FORCE_INLINE const GxMatrixAffine & mulQuaternionBack(const GxQuaternion &quaternion)
クォータニオンによる回転乗算(後ろから乗算)
Definition GxMatrix.inl:3086
GX_FORCE_INLINE GxMatrixAffine & operator=(const GxMatrixAffine &matrix)
代入
Definition GxMatrix.inl:1654
GX_FORCE_INLINE b32 operator==(const GxMatrixAffine &matrix)
一致
Definition GxMatrix.inl:1776
GX_FORCE_INLINE GxVector3 getScale(void) const
スケールを取得
Definition GxMatrix.inl:2165
GX_FORCE_INLINE const GxMatrixAffine & mulRotateX(f32 radian)
X軸回転乗算
Definition GxMatrix.inl:3031
GX_FORCE_INLINE GxMatrixAffine getNormalizeAxes(void) const
位置以外の各軸を正規化したものを取得
Definition GxMatrix.inl:2452
GX_FORCE_INLINE GxVector3 getRotateXZY(void) const
XZY軸回転角を取得
Definition GxMatrix.inl:1928
GX_FORCE_INLINE GxVector3 getRotateZYX(void) const
ZYX軸回転角を取得
Definition GxMatrix.inl:2057
static GX_FORCE_INLINE void getFastMulMatrix(GxMatrixAffine &dst, const GxMatrixAffine &matrix0, const GxMatrixAffine &matrix1)
高速版。dst と matrix0, matrix1 は重なってなならない。アドレスは simd 用にアライメントされななければならない。
Definition GxMatrix.inl:2644
static GX_FORCE_INLINE b32 isSimdAlignment(const GxMatrixAffine &matrix)
simd 用にアライメントされているか調べる
Definition GxMatrix.inl:2704
GX_FORCE_INLINE f32 getValue(u32 row, u32 column) const
値を取得
Definition GxMatrix.inl:2361
GX_FORCE_INLINE void setRotateZ(f32 sinValue, f32 cosValue)
回転行列を設定(Z軸回転)
Definition GxMatrix.inl:1872
GX_FORCE_INLINE GxVector3 getRotateXYZ(void) const
XYZ軸回転角を取得
Definition GxMatrix.inl:1895
GX_FORCE_INLINE void setRotateAxis(const GxVector3 &vector, f32 radian)
回転行列を設定
Definition GxMatrix.inl:2230
GX_FORCE_INLINE GxVector3 getRotateYZX(void) const
YZX軸回転角を取得
Definition GxMatrix.inl:1992
GX_FORCE_INLINE const GxMatrixAffine & addMatrix(const GxMatrixAffine &matrix)
行列加算
Definition GxMatrix.inl:2994
GX_FORCE_INLINE const GxMatrixAffine & mulMatrix(const GxMatrixAffine &matrix)
行列乗算
Definition GxMatrix.inl:3020
GX_FORCE_INLINE const GxMatrixAffine & mulScalar(f32 scalar)
スカラ乗算
Definition GxMatrix.inl:2940
GX_FORCE_INLINE GxVector4 getColumn(u32 column) const
列を取得
Definition GxMatrix.inl:2331
GX_FORCE_INLINE void setRotateX(f32 sinValue, f32 cosValue)
回転行列を設定(X軸回転)
Definition GxMatrix.inl:1822
static GX_FORCE_INLINE const GxMatrixAffine & getMulScalar(GxMatrixAffine &dst, const GxMatrixAffine &matrix, f32 scalar)
スカラ乗算を取得
Definition GxMatrix.inl:2474
GX_FORCE_INLINE GxMatrixAffine & operator+=(const GxMatrixAffine &matrix)
行列加算代入
Definition GxMatrix.inl:1704
GX_FORCE_INLINE GxMatrixAffine getTranspose(void) const
転置行列を取得
Definition GxMatrix.inl:2440
GX_FORCE_INLINE const GxMatrixAffine & divScalar(f32 scalar)
スカラ除算
Definition GxMatrix.inl:2966
static GX_FORCE_INLINE const GxMatrixAffine & getDivScalar(GxMatrixAffine &dst, const GxMatrixAffine &matrix, f32 scalar)
スカラ除算を取得
Definition GxMatrix.inl:2502
GX_FORCE_INLINE const GxMatrixAffine & mulRotateZ(f32 radian)
Z軸回転乗算
Definition GxMatrix.inl:3059
GX_FORCE_INLINE const f32 * getRowPtr(u32 row) const
行を取得
Definition GxMatrix.inl:2293
GX_FORCE_INLINE const GxVector3 & getPosition(void) const
平行移動量を取得
Definition GxMatrix.h:454
GX_FORCE_INLINE void setValue(u32 row, u32 column, f32 value)
値を設定
Definition GxMatrix.inl:2379
GX_FORCE_INLINE void setScaleQuaternion(const GxVector3 &scale, const GxQuaternion &quaternion)
スケール行列を設定し、クォータニオンによる回転乗算(後ろから乗算)を行う
Definition GxMatrix.inl:3205
GxMatrixAffine(void)
デフォルトコンストラクタ(要素は全て0で初期化される)
Definition GxMatrix.h:353
GX_FORCE_INLINE void setPosition(const GxVector3 &position)
平行移動量のみを設定
Definition GxMatrix.inl:2141
クォータニオン
Definition GxQuaternion.h:19
f32 _x
X値
Definition GxQuaternion.h:272
f32 _w
W値
Definition GxQuaternion.h:275
f32 _y
Y値
Definition GxQuaternion.h:273
f32 _z
Z値
Definition GxQuaternion.h:274
2次元ベクトル
Definition GxVector.h:34
f32 _y
Y値
Definition GxVector.h:235
f32 _x
X値
Definition GxVector.h:234
3次元ベクトル
Definition GxVector.h:245
f32 _z
Z値
Definition GxVector.h:572
f32 _y
Y値
Definition GxVector.h:571
GX_FORCE_INLINE GxVector3 getNormalizeEx(void) const
正規化ベクトルを取得(長さ0に対応)
Definition GxVector.inl:1494
f32 _x
X値
Definition GxVector.h:570
4次元ベクトル
Definition GxVector.h:582
f32 _x
X値
Definition GxVector.h:793
f32 _w
W値
Definition GxVector.h:796
static const GxVector4 AXIS_W
(0, 0, 0, 1)
Definition GxVector.h:603
f32 _y
Y値
Definition GxVector.h:794
f32 _z
Z値
Definition GxVector.h:795
32bitブーリアン
Definition GxDefine.h:173