OROCHI
 
Loading...
Searching...
No Matches
GxMatrix.inl
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11
12GX_CORE_NAMESPACE_BEGIN()
13
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))
19
21inline __m128 _mm_rcp_ps_22bit( __m128 a )
22{
23 __m128 xm0 = 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 );
28}
29#endif //GX_USE_SSE2
30//===========================================================================
31// GxMatrix22
32//===========================================================================
33//---------------------------------------------------------------------------
34// コンストラクタ
35//---------------------------------------------------------------------------
36GX_INLINE GxMatrix22::GxMatrix22( f32 m00, f32 m01,
37 f32 m10, f32 m11)
38{
39 _m[0][0] = m00;
40 _m[0][1] = m01;
41
42 _m[1][0] = m10;
43 _m[1][1] = m11;
44}
45
46//---------------------------------------------------------------------------
47// 代入
49//---------------------------------------------------------------------------
50GX_FORCE_INLINE GxMatrix22& GxMatrix22::operator = (const GxMatrix22& matrix)
51{
52 _m[0][0] = matrix._m[0][0];
53 _m[0][1] = matrix._m[0][1];
54
55 _m[1][0] = matrix._m[1][0];
56 _m[1][1] = matrix._m[1][1];
57
58 return *this;
59}
60
61//---------------------------------------------------------------------------
62// スカラ乗算代入
65//---------------------------------------------------------------------------
66GX_FORCE_INLINE GxMatrix22& GxMatrix22::operator *= (f32 scalar)
67{
68 mulScalar(scalar);
69
70 return *this;
71}
72
73//---------------------------------------------------------------------------
74// スカラ除算代入
77//---------------------------------------------------------------------------
78GX_FORCE_INLINE GxMatrix22& GxMatrix22::operator /= (f32 scalar)
79{
80 divScalar(scalar);
81
82 return *this;
83}
84
85//---------------------------------------------------------------------------
86// 行列加算代入
89//---------------------------------------------------------------------------
90GX_FORCE_INLINE GxMatrix22& GxMatrix22::operator += (const GxMatrix22& matrix)
91{
92 addMatrix(matrix);
93
94 return *this;
95}
96
97//---------------------------------------------------------------------------
98// 行列乗算代入
101//---------------------------------------------------------------------------
102GX_FORCE_INLINE GxMatrix22& GxMatrix22::operator *= (const GxMatrix22& matrix)
103{
104 mulMatrix(matrix);
105
106 return *this;
107}
108
109//---------------------------------------------------------------------------
110// スカラ乗算
114//---------------------------------------------------------------------------
115GX_FORCE_INLINE const GxMatrix22 operator * (const GxMatrix22& matrix, f32 scalar)
116{
117 GxMatrix22 result; // empty constructor
118 return GxMatrix22::getMulScalar(result, matrix, scalar);
119}
120
121//---------------------------------------------------------------------------
122// スカラ除算
126//---------------------------------------------------------------------------
127GX_FORCE_INLINE const GxMatrix22 operator / (const GxMatrix22& matrix, f32 scalar)
128{
129 GxMatrix22 result; // empty constructor
130 return GxMatrix22::getDivScalar(result, matrix, scalar);
131}
132
133//---------------------------------------------------------------------------
134// 行列加算
138//---------------------------------------------------------------------------
139GX_FORCE_INLINE const GxMatrix22 operator + (const GxMatrix22& matrix0, const GxMatrix22& matrix1)
140{
141 GxMatrix22 result; // empty constructor
142 return GxMatrix22::getAddMatrix(result, matrix0, matrix1);
143}
144
145//---------------------------------------------------------------------------
146// 行列乗算
150//---------------------------------------------------------------------------
151GX_FORCE_INLINE const GxMatrix22 operator * (const GxMatrix22& matrix0, const GxMatrix22& matrix1)
152{
153 GxMatrix22 result; // empty constructor
154 return GxMatrix22::getMulMatrix(result, matrix0, matrix1);
155}
156
157//---------------------------------------------------------------------------
158// 一致
161//---------------------------------------------------------------------------
162GX_FORCE_INLINE b32 GxMatrix22::operator == (const GxMatrix22& matrix)
163{
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]));
166}
167
168//---------------------------------------------------------------------------
169// 不一致
172//---------------------------------------------------------------------------
173GX_FORCE_INLINE b32 GxMatrix22::operator != (const GxMatrix22& matrix)
174{
175 return !(*this == matrix);
176}
177
178//---------------------------------------------------------------------------
179// 単位行列に設定
180//---------------------------------------------------------------------------
181GX_FORCE_INLINE void GxMatrix22::setIdentity(void)
182{
183 _m[0][0] = 1.0f;
184 _m[0][1] = 0.0f;
185
186 _m[1][0] = 0.0f;
187 _m[1][1] = 1.0f;
188}
189
190//---------------------------------------------------------------------------
191// 行を取得
194//---------------------------------------------------------------------------
195const GxVector2& GxMatrix22::getRow(u32 row) const
196{
197 GX_ASSERT(row < 2, "指定された行数が大きすぎます(%d)", row);
198 return *reinterpret_cast<const GxVector2*>(&_m[row][0]);
199}
200
201//---------------------------------------------------------------------------
202// 行を設定
203//
206//---------------------------------------------------------------------------
207void GxMatrix22::setRow(u32 row, const GxVector2& vector)
208{
209 GX_ASSERT(row < 2, "指定された行数が大きすぎます(%d)", row);
210 _m[row][0] = vector._x;
211 _m[row][1] = vector._y;
212}
213
214//---------------------------------------------------------------------------
215// 列を取得
218//---------------------------------------------------------------------------
220{
221 GX_ASSERT(column < 2, "指定された列数が大きすぎます(%d)", column);
222 return GxVector2(_m[0][column], _m[1][column]);
223}
224
225//---------------------------------------------------------------------------
226// 列を設定
227//
230//---------------------------------------------------------------------------
231void GxMatrix22::setColumn(u32 column, const GxVector2& vector)
232{
233 GX_ASSERT(column < 2, "指定された列数が大きすぎます(%d)", column);
234 _m[0][column] = vector._x;
235 _m[1][column] = vector._y;
236}
237
238//---------------------------------------------------------------------------
239// 値を取得
243//---------------------------------------------------------------------------
244f32 GxMatrix22::getValue(u32 row, u32 column) const
245{
246 GX_ASSERT(row < 2, "指定された行数が大きすぎます(%d)", row);
247 GX_ASSERT(column < 2, "指定された列数が大きすぎます(%d)", column);
248 return _m[row][column];
249}
250
251//---------------------------------------------------------------------------
252// 値を設定
253//
257//---------------------------------------------------------------------------
258void GxMatrix22::setValue(u32 row, u32 column, f32 value)
259{
260 GX_ASSERT(row < 2, "指定された行数が大きすぎます(%d)", row);
261 GX_ASSERT(column < 2, "指定された列数が大きすぎます(%d)", column);
262 _m[row][column] = value;
263}
264
265//---------------------------------------------------------------------------
266// 参照を取得
270//---------------------------------------------------------------------------
271f32& GxMatrix22::getReference(u32 row, u32 column)
272{
273 GX_ASSERT(row < 2, "指定された行数が大きすぎます(%d)", row);
274 GX_ASSERT(column < 2, "指定された列数が大きすぎます(%d)", column);
275 return _m[row][column];
276}
277
278//---------------------------------------------------------------------------
279// 参照を取得
283//---------------------------------------------------------------------------
284const f32& GxMatrix22::getReference(u32 row, u32 column) const
285{
286 GX_ASSERT(row < 2, "指定された行数が大きすぎます(%d)", row);
287 GX_ASSERT(column < 2, "指定された列数が大きすぎます(%d)", column);
288 return _m[row][column];
289}
290
291//---------------------------------------------------------------------------
292// 行列式の値を取得
294//---------------------------------------------------------------------------
295GX_FORCE_INLINE f32 GxMatrix22::getDeterminant(void) const
296{
297 return _m[0][0] * _m[1][1] - _m[1][0] * _m[0][1];
298}
299
300//---------------------------------------------------------------------------
301// 逆行列を取得
303//---------------------------------------------------------------------------
304GX_FORCE_INLINE GxMatrix22 GxMatrix22::getInverse(void) const
305{
306 GxMatrix22 result; // empty constructor
307 return GxMatrix22::getInverse(result, *this);
308}
309
310//---------------------------------------------------------------------------
311// 転置行列を取得
313//---------------------------------------------------------------------------
314GX_FORCE_INLINE GxMatrix22 GxMatrix22::getTranspose(void) const
315{
316 return GxMatrix22( _m[0][0], _m[1][0],
317 _m[0][1], _m[1][1]);
318}
319
320//---------------------------------------------------------------------------
321// スカラ乗算を取得
326//---------------------------------------------------------------------------
327GX_FORCE_INLINE const GxMatrix22& GxMatrix22::getMulScalar(GxMatrix22& dst, const GxMatrix22& matrix, f32 scalar)
328{
329 dst._m[0][0] = matrix._m[0][0] * scalar;
330 dst._m[0][1] = matrix._m[0][1] * scalar;
331
332 dst._m[1][0] = matrix._m[1][0] * scalar;
333 dst._m[1][1] = matrix._m[1][1] * scalar;
334
335 return dst;
336}
337
338//---------------------------------------------------------------------------
339// スカラ除算を取得
344//---------------------------------------------------------------------------
345GX_FORCE_INLINE const GxMatrix22& GxMatrix22::getDivScalar(GxMatrix22& dst, const GxMatrix22& matrix, f32 scalar)
346{
347 auto invScalar = 1.0f / scalar;
348
349 dst._m[0][0] = matrix._m[0][0] * invScalar;
350 dst._m[0][1] = matrix._m[0][1] * invScalar;
351
352 dst._m[1][0] = matrix._m[1][0] * invScalar;
353 dst._m[1][1] = matrix._m[1][1] * invScalar;
354
355 return dst;
356}
357
358//---------------------------------------------------------------------------
359// 行列加算を取得
364//---------------------------------------------------------------------------
365GX_FORCE_INLINE const GxMatrix22& GxMatrix22::getAddMatrix(GxMatrix22& dst, const GxMatrix22& matrix0, const GxMatrix22& matrix1)
366{
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];
369
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];
372
373 return dst;
374}
375
376//---------------------------------------------------------------------------
377// 行列乗算を取得
382//---------------------------------------------------------------------------
383GX_FORCE_INLINE const GxMatrix22& GxMatrix22::getMulMatrix(GxMatrix22& dst, const GxMatrix22& matrix0, const GxMatrix22& matrix1)
384{
385 // 入力と出力が同じ行列だった場合を考慮して、一時変数で計算する
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];
388
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];
391
392 dst._m[0][0] = m00;
393 dst._m[0][1] = m01;
394
395 dst._m[1][0] = m10;
396 dst._m[1][1] = m11;
397
398 return dst;
399}
400
401//---------------------------------------------------------------------------
402// 逆行列を取得
406//---------------------------------------------------------------------------
407GX_FORCE_INLINE const GxMatrix22& GxMatrix22::getInverse(GxMatrix22& dst, const GxMatrix22& matrix)
408{
409 const auto m00 = matrix._m[1][1];
410 const auto m01 =-matrix._m[0][1];
411
412 const auto m10 =-matrix._m[1][0];
413 const auto m11 = matrix._m[0][0];
414
415 const auto d = 1.0f / matrix.getDeterminant();
416
417 dst._m[0][0] = m00 * d;
418 dst._m[0][1] = m01 * d;
419
420 dst._m[1][0] = m10 * d;
421 dst._m[1][1] = m11 * d;
422
423 return dst;
424}
425
426//---------------------------------------------------------------------------
427// 転置行列を取得
431//---------------------------------------------------------------------------
432GX_FORCE_INLINE const GxMatrix22& GxMatrix22::getTranspose(GxMatrix22& dst, const GxMatrix22& matrix)
433{
434 const auto m00 = matrix._m[0][0];
435 const auto m01 = matrix._m[1][0];
436
437 const auto m10 = matrix._m[0][1];
438 const auto m11 = matrix._m[1][1];
439
440 dst._m[0][0] = m00;
441 dst._m[0][1] = m01;
442
443 dst._m[1][0] = m10;
444 dst._m[1][1] = m11;
445
446 return dst;
447}
448
449//---------------------------------------------------------------------------
450// スカラ乗算
453//---------------------------------------------------------------------------
454GX_FORCE_INLINE const GxMatrix22& GxMatrix22::mulScalar(f32 scalar)
455{
456 _m[0][0] *= scalar;
457 _m[0][1] *= scalar;
458
459 _m[1][0] *= scalar;
460 _m[1][1] *= scalar;
461
462 return *this;
463}
464
465//---------------------------------------------------------------------------
466// スカラ除算
469//---------------------------------------------------------------------------
470GX_FORCE_INLINE const GxMatrix22& GxMatrix22::divScalar(f32 scalar)
471{
472 auto invScalar = 1.0f / scalar;
473
474 _m[0][0] *= invScalar;
475 _m[0][1] *= invScalar;
476
477 _m[1][0] *= invScalar;
478 _m[1][1] *= invScalar;
479
480 return *this;
481}
482
483//---------------------------------------------------------------------------
484// 行列加算
487//---------------------------------------------------------------------------
488GX_FORCE_INLINE const GxMatrix22& GxMatrix22::addMatrix(const GxMatrix22& matrix)
489{
490 _m[0][0] += matrix._m[0][0];
491 _m[0][1] += matrix._m[0][1];
492
493 _m[1][0] += matrix._m[1][0];
494 _m[1][1] += matrix._m[1][1];
495
496 return *this;
497}
498
499//---------------------------------------------------------------------------
500// 行列乗算
503//---------------------------------------------------------------------------
504GX_FORCE_INLINE const GxMatrix22& GxMatrix22::mulMatrix(const GxMatrix22& matrix)
505{
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];
508
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];
511
512 _m[0][0] = m00;
513 _m[0][1] = m01;
514
515 _m[1][0] = m10;
516 _m[1][1] = m11;
517
518 return *this;
519}
520
521//---------------------------------------------------------------------------
522// 逆行列を計算
524//---------------------------------------------------------------------------
525GX_FORCE_INLINE const GxMatrix22& GxMatrix22::inverse(void)
526{
527 const auto m00 = _m[1][1];
528 const auto m01 =-_m[0][1];
529
530 const auto m10 =-_m[1][0];
531 const auto m11 = _m[0][0];
532
533 const auto d = 1.0f / getDeterminant();
534
535 _m[0][0] = m00 * d;
536 _m[0][1] = m01 * d;
537
538 _m[1][0] = m10 * d;
539 _m[1][1] = m11 * d;
540
541 return *this;
542}
543
544//---------------------------------------------------------------------------
545// 転置する
547//---------------------------------------------------------------------------
548GX_FORCE_INLINE const GxMatrix22& GxMatrix22::transpose(void)
549{
550 const auto m00 = _m[0][0];
551 const auto m01 = _m[1][0];
552
553 const auto m10 = _m[0][1];
554 const auto m11 = _m[1][1];
555
556 _m[0][0] = m00;
557 _m[0][1] = m01;
558
559 _m[1][0] = m10;
560 _m[1][1] = m11;
561
562 return *this;
563}
564
565//===========================================================================
566// GxMatrix33
567//===========================================================================
568//---------------------------------------------------------------------------
569// コンストラクタ
570//---------------------------------------------------------------------------
571GX_INLINE GxMatrix33::GxMatrix33( f32 m00, f32 m01, f32 m02,
572 f32 m10, f32 m11, f32 m12,
573 f32 m20, f32 m21, f32 m22)
574{
575 _m[0][0] = m00;
576 _m[0][1] = m01;
577 _m[0][2] = m02;
578
579 _m[1][0] = m10;
580 _m[1][1] = m11;
581 _m[1][2] = m12;
582
583 _m[2][0] = m20;
584 _m[2][1] = m21;
585 _m[2][2] = m22;
586}
587
588//---------------------------------------------------------------------------
589// 代入
591//---------------------------------------------------------------------------
592GX_FORCE_INLINE GxMatrix33& GxMatrix33::operator = (const GxMatrix33& matrix)
593{
594 _m[0][0] = matrix._m[0][0];
595 _m[0][1] = matrix._m[0][1];
596 _m[0][2] = matrix._m[0][2];
597
598 _m[1][0] = matrix._m[1][0];
599 _m[1][1] = matrix._m[1][1];
600 _m[1][2] = matrix._m[1][2];
601
602 _m[2][0] = matrix._m[2][0];
603 _m[2][1] = matrix._m[2][1];
604 _m[2][2] = matrix._m[2][2];
605
606 return *this;
607}
608
609//---------------------------------------------------------------------------
610// スカラ乗算代入
613//---------------------------------------------------------------------------
614GX_FORCE_INLINE GxMatrix33& GxMatrix33::operator *= (f32 scalar)
615{
616 mulScalar(scalar);
617
618 return *this;
619}
620
621//---------------------------------------------------------------------------
622// スカラ除算代入
625//---------------------------------------------------------------------------
626GX_FORCE_INLINE GxMatrix33& GxMatrix33::operator /= (f32 scalar)
627{
628 divScalar(scalar);
629
630 return *this;
631}
632
633//---------------------------------------------------------------------------
634// 行列加算代入
637//---------------------------------------------------------------------------
638GX_FORCE_INLINE GxMatrix33& GxMatrix33::operator += (const GxMatrix33& matrix)
639{
640 addMatrix(matrix);
641
642 return *this;
643}
644
645//---------------------------------------------------------------------------
646// 行列乗算代入
649//---------------------------------------------------------------------------
650GX_FORCE_INLINE GxMatrix33& GxMatrix33::operator *= (const GxMatrix33& matrix)
651{
652 mulMatrix(matrix);
653
654 return *this;
655}
656
657//---------------------------------------------------------------------------
658// スカラ乗算
662//---------------------------------------------------------------------------
663GX_FORCE_INLINE const GxMatrix33 operator * (const GxMatrix33& matrix, f32 scalar)
664{
665 GxMatrix33 result; // empty constructor
666 GxMatrix33::getMulScalar(result, matrix, scalar);
667
668 return result;
669}
670
671//---------------------------------------------------------------------------
672// スカラ除算
676//---------------------------------------------------------------------------
677GX_FORCE_INLINE const GxMatrix33 operator / (const GxMatrix33& matrix, f32 scalar)
678{
679 GxMatrix33 result; // empty constructor
680 GxMatrix33::getDivScalar(result, matrix, scalar);
681
682 return result;
683}
684
685//---------------------------------------------------------------------------
686// 行列加算
690//---------------------------------------------------------------------------
691GX_FORCE_INLINE const GxMatrix33 operator + (const GxMatrix33& matrix0, const GxMatrix33& matrix1)
692{
693 GxMatrix33 result; // empty constructor
694 GxMatrix33::getAddMatrix(result, matrix0, matrix1);
695
696 return result;
697}
698
699//---------------------------------------------------------------------------
700// 行列乗算
704//---------------------------------------------------------------------------
705GX_FORCE_INLINE const GxMatrix33 operator * (const GxMatrix33& matrix0, const GxMatrix33& matrix1)
706{
707 GxMatrix33 result; // empty constructor
708 GxMatrix33::getMulMatrix(result, matrix0, matrix1);
709
710 return result;
711}
712
713//---------------------------------------------------------------------------
714// 一致
717//---------------------------------------------------------------------------
718GX_FORCE_INLINE b32 GxMatrix33::operator == (const GxMatrix33& matrix)
719{
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]));
723}
724
725//---------------------------------------------------------------------------
726// 不一致
729//---------------------------------------------------------------------------
730GX_FORCE_INLINE b32 GxMatrix33::operator != (const GxMatrix33& matrix)
731{
732 return !(*this == matrix);
733}
734
735//---------------------------------------------------------------------------
736// 単位行列に設定
737//---------------------------------------------------------------------------
738GX_FORCE_INLINE void GxMatrix33::setIdentity(void)
739{
740 _m[0][0] = 1.0f;
741 _m[0][1] = 0.0f;
742 _m[0][2] = 0.0f;
743
744 _m[1][0] = 0.0f;
745 _m[1][1] = 1.0f;
746 _m[1][2] = 0.0f;
747
748 _m[2][0] = 0.0f;
749 _m[2][1] = 0.0f;
750 _m[2][2] = 1.0f;
751}
752
753//---------------------------------------------------------------------------
754// 回転行列を設定
755//
758//---------------------------------------------------------------------------
759GX_FORCE_INLINE void GxMatrix33::setRotate(f32 sinValue, f32 cosValue)
760{
761 _m[0][0] = cosValue;
762 _m[0][1] = sinValue;
763 _m[0][2] = 0.0f;
764
765 _m[1][0] =-sinValue;
766 _m[1][1] = cosValue;
767 _m[1][2] = 0.0f;
768
769 _m[2][0] = 0.0f;
770 _m[2][1] = 0.0f;
771 _m[2][2] = 1.0f;
772}
773
774//---------------------------------------------------------------------------
775// 平行移動行列を設定
776//
778//---------------------------------------------------------------------------
779GX_FORCE_INLINE void GxMatrix33::setTranslate(const GxVector2& vector)
780{
781 _m[0][0] = 1.0f;
782 _m[0][1] = 0.0f;
783 _m[0][2] = 0.0f;
784
785 _m[1][0] = 0.0f;
786 _m[1][1] = 1.0f;
787 _m[1][2] = 0.0f;
788
789 _m[2][0] = vector._x;
790 _m[2][1] = vector._y;
791 _m[2][2] = 1.0f;
792}
793
794//---------------------------------------------------------------------------
795// 平行移動行列を設定
796//
799//---------------------------------------------------------------------------
800GX_FORCE_INLINE void GxMatrix33::setTranslate(f32 x, f32 y)
801{
802 _m[0][0] = 1.0f;
803 _m[0][1] = 0.0f;
804 _m[0][2] = 0.0f;
805
806 _m[1][0] = 0.0f;
807 _m[1][1] = 1.0f;
808 _m[1][2] = 0.0f;
809
810 _m[2][0] = x;
811 _m[2][1] = y;
812 _m[2][2] = 1.0f;
813}
814
815//---------------------------------------------------------------------------
816// 平行移動量のみを設定
817//
819//---------------------------------------------------------------------------
820GX_FORCE_INLINE void GxMatrix33::setPosition(const GxVector2& position)
821{
822 _m[2][0] = position._x;
823 _m[2][1] = position._y;
824}
825
826//---------------------------------------------------------------------------
827// 平行移動量のみを設定
828//
831//---------------------------------------------------------------------------
832GX_FORCE_INLINE void GxMatrix33::setPosition(f32 x, f32 y)
833{
834 _m[2][0] = x;
835 _m[2][1] = y;
836}
837
838//---------------------------------------------------------------------------
839// スケール行列を設定
840//
842//---------------------------------------------------------------------------
843GX_FORCE_INLINE void GxMatrix33::setScale(const GxVector2& vector)
844{
845 _m[0][0] = vector._x;
846 _m[0][1] = 0.0f;
847 _m[0][2] = 0.0f;
848
849 _m[1][0] = 0.0f;
850 _m[1][1] = vector._y;
851 _m[1][2] = 0.0f;
852
853 _m[2][0] = 0.0f;
854 _m[2][1] = 0.0f;
855 _m[2][2] = 1.0f;
856}
857
858//---------------------------------------------------------------------------
859// スケール行列を設定
860//
863//---------------------------------------------------------------------------
864GX_FORCE_INLINE void GxMatrix33::setScale(f32 x, f32 y)
865{
866 _m[0][0] = x;
867 _m[0][1] = 0.0f;
868 _m[0][2] = 0.0f;
869
870 _m[1][0] = 0.0f;
871 _m[1][1] = y;
872 _m[1][2] = 0.0f;
873
874 _m[2][0] = 0.0f;
875 _m[2][1] = 0.0f;
876 _m[2][2] = 1.0f;
877}
878
879//---------------------------------------------------------------------------
880// 行を取得
883//---------------------------------------------------------------------------
884const GxVector3& GxMatrix33::getRow(u32 row) const
885{
886 GX_ASSERT(row < 3, "指定された行数が大きすぎます(%d)", row);
887 return *reinterpret_cast<const GxVector3*>(&_m[row][0]);
888}
889
890//---------------------------------------------------------------------------
891// 行を設定
894//---------------------------------------------------------------------------
895void GxMatrix33::setRow(u32 row, const GxVector3& vector)
896{
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;
901}
902
903//---------------------------------------------------------------------------
904// 列を取得
907//---------------------------------------------------------------------------
909{
910 GX_ASSERT(column < 3, "指定された列数が大きすぎます(%d)", column);
911 return GxVector3(_m[0][column], _m[1][column], _m[2][column]);
912}
913
914//---------------------------------------------------------------------------
915// 列を設定
918//---------------------------------------------------------------------------
919void GxMatrix33::setColumn(u32 column, const GxVector3& vector)
920{
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;
925}
926
927//---------------------------------------------------------------------------
928// 値を取得
932//---------------------------------------------------------------------------
933f32 GxMatrix33::getValue(u32 row, u32 column) const
934{
935 GX_ASSERT(row < 3, "指定された行数が大きすぎます(%d)", row);
936 GX_ASSERT(column < 3, "指定された列数が大きすぎます(%d)", column);
937 return _m[row][column];
938}
939
940//---------------------------------------------------------------------------
941// 値を設定
942//
946//---------------------------------------------------------------------------
947void GxMatrix33::setValue(u32 row, u32 column, f32 value)
948{
949 GX_ASSERT(row < 3, "指定された行数が大きすぎます(%d)", row);
950 GX_ASSERT(column < 3, "指定された列数が大きすぎます(%d)", column);
951 _m[row][column] = value;
952}
953
954//---------------------------------------------------------------------------
955// 参照を取得
959//---------------------------------------------------------------------------
960f32& GxMatrix33::getReference(u32 row, u32 column)
961{
962 GX_ASSERT(row < 3, "指定された行数が大きすぎます(%d)", row);
963 GX_ASSERT(column < 3, "指定された列数が大きすぎます(%d)", column);
964 return _m[row][column];
965}
966
967//---------------------------------------------------------------------------
968// 参照を取得
972//---------------------------------------------------------------------------
973const f32& GxMatrix33::getReference(u32 row, u32 column) const
974{
975 GX_ASSERT(row < 3, "指定された行数が大きすぎます(%d)", row);
976 GX_ASSERT(column < 3, "指定された列数が大きすぎます(%d)", column);
977 return _m[row][column];
978}
979
980//---------------------------------------------------------------------------
981// 行列式の値を取得
983//---------------------------------------------------------------------------
984GX_FORCE_INLINE f32 GxMatrix33::getDeterminant(void) const
985{
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]);
989}
990
991//---------------------------------------------------------------------------
992// 逆行列を取得
994//---------------------------------------------------------------------------
995GX_FORCE_INLINE GxMatrix33 GxMatrix33::getInverse(void) const
996{
997 GxMatrix33 result; // empty constructor
998 return GxMatrix33::getInverse(result, *this);
999}
1000
1001//---------------------------------------------------------------------------
1002// 転置行列を取得
1004//---------------------------------------------------------------------------
1005GX_FORCE_INLINE GxMatrix33 GxMatrix33::getTranspose(void) const
1006{
1007 return GxMatrix33( _m[0][0], _m[1][0], _m[2][0],
1008 _m[0][1], _m[1][1], _m[2][1],
1009 _m[0][2], _m[1][2], _m[2][2]);
1010}
1011
1012//---------------------------------------------------------------------------
1013// スカラ乗算を取得
1018//---------------------------------------------------------------------------
1019GX_FORCE_INLINE const GxMatrix33& GxMatrix33::getMulScalar(GxMatrix33& dst, const GxMatrix33& matrix, f32 scalar)
1020{
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;
1024
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;
1028
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;
1032
1033 return dst;
1034}
1035
1036//---------------------------------------------------------------------------
1037// スカラ除算を取得
1042//---------------------------------------------------------------------------
1043GX_FORCE_INLINE const GxMatrix33& GxMatrix33::getDivScalar(GxMatrix33& dst, const GxMatrix33& matrix, f32 scalar)
1044{
1045 auto invScalar = 1.0f / scalar;
1046
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;
1050
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;
1054
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;
1058
1059 return dst;
1060}
1061
1062//---------------------------------------------------------------------------
1063// 行列加算を取得
1068//---------------------------------------------------------------------------
1069GX_FORCE_INLINE const GxMatrix33& GxMatrix33::getAddMatrix(GxMatrix33& dst, const GxMatrix33& matrix0, const GxMatrix33& matrix1)
1070{
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];
1074
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];
1078
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];
1082
1083 return dst;
1084}
1085
1086//---------------------------------------------------------------------------
1087// 行列乗算を取得
1092//---------------------------------------------------------------------------
1093GX_FORCE_INLINE const GxMatrix33& GxMatrix33::getMulMatrix(GxMatrix33& dst, const GxMatrix33& matrix0, const GxMatrix33& matrix1)
1094{
1095 // 入力と出力が同じ行列だった場合を考慮して、一時変数で計算する
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];
1099
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];
1103
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];
1107
1108 dst._m[0][0] = m00;
1109 dst._m[0][1] = m01;
1110 dst._m[0][2] = m02;
1111
1112 dst._m[1][0] = m10;
1113 dst._m[1][1] = m11;
1114 dst._m[1][2] = m12;
1115
1116 dst._m[2][0] = m20;
1117 dst._m[2][1] = m21;
1118 dst._m[2][2] = m22;
1119
1120 return dst;
1121}
1122
1123
1124//---------------------------------------------------------------------------
1125// 逆行列を取得
1129//---------------------------------------------------------------------------
1130GX_FORCE_INLINE const GxMatrix33& GxMatrix33::getInverse(GxMatrix33& dst, const GxMatrix33& matrix)
1131{
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];
1135
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];
1139
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];
1143
1144 const auto d = 1.0f / matrix.getDeterminant();
1145
1146 dst._m[0][0] = m00 * d;
1147 dst._m[0][1] = m01 * d;
1148 dst._m[0][2] = m02 * d;
1149
1150 dst._m[1][0] = m10 * d;
1151 dst._m[1][1] = m11 * d;
1152 dst._m[1][2] = m12 * d;
1153
1154 dst._m[2][0] = m20 * d;
1155 dst._m[2][1] = m21 * d;
1156 dst._m[2][2] = m22 * d;
1157
1158 return dst;
1159}
1160
1161//---------------------------------------------------------------------------
1162// 転置行列を取得
1166//---------------------------------------------------------------------------
1167GX_FORCE_INLINE const GxMatrix33& GxMatrix33::getTranspose(GxMatrix33& dst, const GxMatrix33& matrix)
1168{
1169 const auto m00 = matrix._m[0][0];
1170 const auto m01 = matrix._m[1][0];
1171 const auto m02 = matrix._m[2][0];
1172
1173 const auto m10 = matrix._m[0][1];
1174 const auto m11 = matrix._m[1][1];
1175 const auto m12 = matrix._m[2][1];
1176
1177 const auto m20 = matrix._m[0][2];
1178 const auto m21 = matrix._m[1][2];
1179 const auto m22 = matrix._m[2][2];
1180
1181 dst._m[0][0] = m00;
1182 dst._m[0][1] = m01;
1183 dst._m[0][2] = m02;
1184
1185 dst._m[1][0] = m10;
1186 dst._m[1][1] = m11;
1187 dst._m[1][2] = m12;
1188
1189 dst._m[2][0] = m20;
1190 dst._m[2][1] = m21;
1191 dst._m[2][2] = m22;
1192
1193 return dst;
1194}
1195
1196//---------------------------------------------------------------------------
1197// スカラ乗算
1200//---------------------------------------------------------------------------
1201GX_FORCE_INLINE const GxMatrix33& GxMatrix33::mulScalar(f32 scalar)
1202{
1203 _m[0][0] *= scalar;
1204 _m[0][1] *= scalar;
1205 _m[0][2] *= scalar;
1206
1207 _m[1][0] *= scalar;
1208 _m[1][1] *= scalar;
1209 _m[1][2] *= scalar;
1210
1211 _m[2][0] *= scalar;
1212 _m[2][1] *= scalar;
1213 _m[2][2] *= scalar;
1214
1215 return *this;
1216}
1217
1218//---------------------------------------------------------------------------
1219// スカラ除算
1222//---------------------------------------------------------------------------
1223GX_FORCE_INLINE const GxMatrix33& GxMatrix33::divScalar(f32 scalar)
1224{
1225 auto invScalar = 1.0f / scalar;
1226
1227 _m[0][0] *= invScalar;
1228 _m[0][1] *= invScalar;
1229 _m[0][2] *= invScalar;
1230
1231 _m[1][0] *= invScalar;
1232 _m[1][1] *= invScalar;
1233 _m[1][2] *= invScalar;
1234
1235 _m[2][0] *= invScalar;
1236 _m[2][1] *= invScalar;
1237 _m[2][2] *= invScalar;
1238
1239 return *this;
1240}
1241
1242//---------------------------------------------------------------------------
1243// 行列加算
1246//---------------------------------------------------------------------------
1247GX_FORCE_INLINE const GxMatrix33& GxMatrix33::addMatrix(const GxMatrix33& matrix)
1248{
1249 _m[0][0] += matrix._m[0][0];
1250 _m[0][1] += matrix._m[0][1];
1251 _m[0][2] += matrix._m[0][2];
1252
1253 _m[1][0] += matrix._m[1][0];
1254 _m[1][1] += matrix._m[1][1];
1255 _m[1][2] += matrix._m[1][2];
1256
1257 _m[2][0] += matrix._m[2][0];
1258 _m[2][1] += matrix._m[2][1];
1259 _m[2][2] += matrix._m[2][2];
1260
1261 return *this;
1262}
1263
1264//---------------------------------------------------------------------------
1265// 行列乗算
1268//---------------------------------------------------------------------------
1269GX_FORCE_INLINE const GxMatrix33& GxMatrix33::mulMatrix(const GxMatrix33& matrix)
1270{
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];
1274
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];
1278
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];
1282
1283 _m[0][0] = m00;
1284 _m[0][1] = m01;
1285 _m[0][2] = m02;
1286
1287 _m[1][0] = m10;
1288 _m[1][1] = m11;
1289 _m[1][2] = m12;
1290
1291 _m[2][0] = m20;
1292 _m[2][1] = m21;
1293 _m[2][2] = m22;
1294
1295 return *this;
1296}
1297
1298//---------------------------------------------------------------------------
1299// 回転乗算
1302//---------------------------------------------------------------------------
1303GX_FORCE_INLINE const GxMatrix33& GxMatrix33::mulRotate(f32 radian)
1304{
1305 GxMatrix33 matrix;
1306 matrix.setRotate(radian);
1307 mulMatrix(matrix);
1308
1309 return *this;
1310}
1311
1312//---------------------------------------------------------------------------
1313// 平行移動乗算
1316//---------------------------------------------------------------------------
1317GX_FORCE_INLINE const GxMatrix33& GxMatrix33::mulTranslate(const GxVector2& vector)
1318{
1319#if GX_MATRIX_SAFE_MODE
1320 GxMatrix33 matrix;
1321 matrix.setTranslate(vector);
1322 mulMatrix(matrix);
1323#else //GX_MATRIX_SAFE_MODE
1324 _m[2][0] += vector._x;
1325 _m[2][1] += vector._y;
1326#endif // !GX_MATRIX_SAFE_MODE
1327
1328 return *this;
1329}
1330
1331//---------------------------------------------------------------------------
1332// 平行移動乗算
1336//---------------------------------------------------------------------------
1337GX_FORCE_INLINE const GxMatrix33& GxMatrix33::mulTranslate(f32 x, f32 y)
1338{
1339#if GX_MATRIX_SAFE_MODE
1340 GxMatrix33 matrix;
1341 matrix.setTranslate(x, y);
1342 mulMatrix(matrix);
1343#else //GX_MATRIX_SAFE_MODE
1344 _m[2][0] += x;
1345 _m[2][1] += y;
1346#endif // !GX_MATRIX_SAFE_MODE
1347
1348 return *this;
1349}
1350
1351//---------------------------------------------------------------------------
1352// スケール乗算
1355//---------------------------------------------------------------------------
1356GX_FORCE_INLINE const GxMatrix33& GxMatrix33::mulScale(const GxVector2& vector)
1357{
1358#if GX_MATRIX_SAFE_MODE
1359 GxMatrix33 matrix;
1360 matrix.setScale(vector);
1361 mulMatrix(matrix);
1362#else //GX_MATRIX_SAFE_MODE
1363 _m[0][0] = _m[0][0] * vector._x;
1364 _m[0][1] = _m[0][1] * vector._y;
1365
1366 _m[1][0] = _m[1][0] * vector._x;
1367 _m[1][1] = _m[1][1] * vector._y;
1368
1369 _m[2][0] = _m[2][0] * vector._x;
1370 _m[2][1] = _m[2][1] * vector._y;
1371#endif // !GX_MATRIX_SAFE_MODE
1372
1373 return *this;
1374}
1375
1376//---------------------------------------------------------------------------
1377// スケール乗算
1381//---------------------------------------------------------------------------
1382GX_FORCE_INLINE const GxMatrix33& GxMatrix33::mulScale(f32 x, f32 y)
1383{
1384#if GX_MATRIX_SAFE_MODE
1385 GxMatrix33 matrix;
1386 matrix.setScale(x, y);
1387 mulMatrix(matrix);
1388#else //GX_MATRIX_SAFE_MODE
1389 _m[0][0] = _m[0][0] * x;
1390 _m[0][1] = _m[0][1] * y;
1391
1392 _m[1][0] = _m[1][0] * x;
1393 _m[1][1] = _m[1][1] * y;
1394
1395 _m[2][0] = _m[2][0] * x;
1396 _m[2][1] = _m[2][1] * y;
1397#endif // !GX_MATRIX_SAFE_MODE
1398
1399 return *this;
1400}
1401
1402//---------------------------------------------------------------------------
1403// 逆行列にする
1405//---------------------------------------------------------------------------
1406GX_FORCE_INLINE const GxMatrix33& GxMatrix33::inverse(void)
1407{
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];
1411
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];
1415
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];
1419
1420 const auto d = 1.0f / getDeterminant();
1421
1422 _m[0][0] = m00 * d;
1423 _m[0][1] = m01 * d;
1424 _m[0][2] = m02 * d;
1425
1426 _m[1][0] = m10 * d;
1427 _m[1][1] = m11 * d;
1428 _m[1][2] = m12 * d;
1429
1430 _m[2][0] = m20 * d;
1431 _m[2][1] = m21 * d;
1432 _m[2][2] = m22 * d;
1433
1434 return *this;
1435}
1436
1437//---------------------------------------------------------------------------
1438// 転置する
1440//---------------------------------------------------------------------------
1441GX_FORCE_INLINE const GxMatrix33& GxMatrix33::transpose(void)
1442{
1443 const auto m00 = _m[0][0];
1444 const auto m01 = _m[1][0];
1445 const auto m02 = _m[2][0];
1446
1447 const auto m10 = _m[0][1];
1448 const auto m11 = _m[1][1];
1449 const auto m12 = _m[2][1];
1450
1451 const auto m20 = _m[0][2];
1452 const auto m21 = _m[1][2];
1453 const auto m22 = _m[2][2];
1454
1455 _m[0][0] = m00;
1456 _m[0][1] = m01;
1457 _m[0][2] = m02;
1458
1459 _m[1][0] = m10;
1460 _m[1][1] = m11;
1461 _m[1][2] = m12;
1462
1463 _m[2][0] = m20;
1464 _m[2][1] = m21;
1465 _m[2][2] = m22;
1466
1467 return *this;
1468}
1469
1470//===========================================================================
1471// GxMatrixAffine
1472//===========================================================================
1473//---------------------------------------------------------------------------
1474// コンストラクタ(引数のタイプで要素を初期化する)
1476//---------------------------------------------------------------------------
1478{
1479 switch(initType)
1480 {
1481 case INIT::ZERO:
1482 setZero();
1483 break;
1484 case INIT::IDENTITY:
1485 setIdentity();
1486 break;
1487 case INIT::NONE:
1488 default:
1489 break;
1490 }
1491}
1492
1493//---------------------------------------------------------------------------
1494// コンストラクタ
1497//---------------------------------------------------------------------------
1498GX_INLINE GxMatrixAffine::GxMatrixAffine(const GxQuaternion& quaternion, const GxVector3& position)
1499{
1500 setRotate(quaternion);
1501 setPosition(position);
1502}
1503
1504//---------------------------------------------------------------------------
1505// コンストラクタ
1507//---------------------------------------------------------------------------
1509{
1510 setRotate(quaternion);
1511}
1512
1513//---------------------------------------------------------------------------
1514// コンストラクタ
1516//---------------------------------------------------------------------------
1518{
1519 setTranslate(position);
1520}
1521
1522//---------------------------------------------------------------------------
1523// コンストラクタ
1524//---------------------------------------------------------------------------
1525GX_INLINE GxMatrixAffine::GxMatrixAffine( f32 m00, f32 m01, f32 m02,
1526 f32 m10, f32 m11, f32 m12,
1527 f32 m20, f32 m21, f32 m22,
1528 f32 m30, f32 m31, f32 m32)
1529{
1530 _m[0][0] = m00;
1531 _m[0][1] = m01;
1532 _m[0][2] = m02;
1533
1534 _m[1][0] = m10;
1535 _m[1][1] = m11;
1536 _m[1][2] = m12;
1537
1538 _m[2][0] = m20;
1539 _m[2][1] = m21;
1540 _m[2][2] = m22;
1541
1542 _m[3][0] = m30;
1543 _m[3][1] = m31;
1544 _m[3][2] = m32;
1545}
1546
1547//---------------------------------------------------------------------------
1548// コンストラクタ
1550//---------------------------------------------------------------------------
1552{
1553 _m[0][0] = matrix._m[0][0];
1554 _m[0][1] = matrix._m[0][1];
1555 _m[0][2] = matrix._m[0][2];
1556
1557 _m[1][0] = matrix._m[1][0];
1558 _m[1][1] = matrix._m[1][1];
1559 _m[1][2] = matrix._m[1][2];
1560
1561 _m[2][0] = matrix._m[2][0];
1562 _m[2][1] = matrix._m[2][1];
1563 _m[2][2] = matrix._m[2][2];
1564
1565 _m[3][0] = matrix._m[3][0];
1566 _m[3][1] = matrix._m[3][1];
1567 _m[3][2] = matrix._m[3][2];
1568}
1569
1570//---------------------------------------------------------------------------
1571// コンストラクタ
1574//---------------------------------------------------------------------------
1575GX_INLINE GxMatrixAffine::GxMatrixAffine(const GxVector3& position, const GxMatrix33& orientation)
1576{
1577 _m[0][0] = orientation._m[0][0];
1578 _m[0][1] = orientation._m[0][1];
1579 _m[0][2] = orientation._m[0][2];
1580
1581 _m[1][0] = orientation._m[1][0];
1582 _m[1][1] = orientation._m[1][1];
1583 _m[1][2] = orientation._m[1][2];
1584
1585 _m[2][0] = orientation._m[2][0];
1586 _m[2][1] = orientation._m[2][1];
1587 _m[2][2] = orientation._m[2][2];
1588
1589 _m[3][0] = position._x;
1590 _m[3][1] = position._y;
1591 _m[3][2] = position._z;
1592}
1593//---------------------------------------------------------------------------
1594// コピーコンストラクタ
1596//---------------------------------------------------------------------------
1598{
1599 _m[0][0] = matrix._m[0][0];
1600 _m[0][1] = matrix._m[0][1];
1601 _m[0][2] = matrix._m[0][2];
1602
1603 _m[1][0] = matrix._m[1][0];
1604 _m[1][1] = matrix._m[1][1];
1605 _m[1][2] = matrix._m[1][2];
1606
1607 _m[2][0] = matrix._m[2][0];
1608 _m[2][1] = matrix._m[2][1];
1609 _m[2][2] = matrix._m[2][2];
1610
1611 _m[3][0] = matrix._m[3][0];
1612 _m[3][1] = matrix._m[3][1];
1613 _m[3][2] = matrix._m[3][2];
1614}
1615
1616//---------------------------------------------------------------------------
1617// 0を設定
1618//---------------------------------------------------------------------------
1619GX_FORCE_INLINE void GxMatrixAffine::setZero(void)
1620{
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();
1626#else //GX_USE_SSE2
1627 for( u32 c = 0; c < 4; c++ )
1628 {
1629 _m[c][0] = 0.0f;
1630 _m[c][1] = 0.0f;
1631 _m[c][2] = 0.0f;
1632 _m[c][3] = 0.0f;
1633 }
1634#endif // !GX_USE_SSE2
1635}
1636
1637//---------------------------------------------------------------------------
1638// 初期化
1639//
1642//---------------------------------------------------------------------------
1643GX_FORCE_INLINE void GxMatrixAffine::initialize(const GxQuaternion& quaternion, const GxVector3& position)
1644{
1645 setRotate(quaternion);
1646 setPosition(position);
1647}
1648
1649//---------------------------------------------------------------------------
1650// 代入
1653//---------------------------------------------------------------------------
1655{
1656 _m[0][0] = matrix._m[0][0];
1657 _m[0][1] = matrix._m[0][1];
1658 _m[0][2] = matrix._m[0][2];
1659
1660 _m[1][0] = matrix._m[1][0];
1661 _m[1][1] = matrix._m[1][1];
1662 _m[1][2] = matrix._m[1][2];
1663
1664 _m[2][0] = matrix._m[2][0];
1665 _m[2][1] = matrix._m[2][1];
1666 _m[2][2] = matrix._m[2][2];
1667
1668 _m[3][0] = matrix._m[3][0];
1669 _m[3][1] = matrix._m[3][1];
1670 _m[3][2] = matrix._m[3][2];
1671
1672 return *this;
1673}
1674
1675//---------------------------------------------------------------------------
1676// スカラ乗算代入
1679//---------------------------------------------------------------------------
1681{
1682 mulScalar(scalar);
1683
1684 return *this;
1685}
1686
1687//---------------------------------------------------------------------------
1688// スカラ除算代入
1691//---------------------------------------------------------------------------
1693{
1694 divScalar(scalar);
1695
1696 return *this;
1697}
1698
1699//---------------------------------------------------------------------------
1700// 行列加算代入
1703//---------------------------------------------------------------------------
1705{
1706 addMatrix(matrix);
1707
1708 return *this;
1709}
1710
1711//---------------------------------------------------------------------------
1712// 行列乗算代入
1715//---------------------------------------------------------------------------
1717{
1718 mulMatrix(matrix);
1719
1720 return *this;
1721}
1722
1723//---------------------------------------------------------------------------
1724// スカラ乗算
1728//---------------------------------------------------------------------------
1729GX_FORCE_INLINE const GxMatrixAffine operator * (const GxMatrixAffine& matrix, f32 scalar)
1730{
1731 GxMatrixAffine result(INIT::NONE);
1732 return GxMatrixAffine::getMulScalar(result, matrix, scalar);
1733}
1734
1735//---------------------------------------------------------------------------
1736// スカラ除算
1740//---------------------------------------------------------------------------
1741GX_FORCE_INLINE const GxMatrixAffine operator / (const GxMatrixAffine& matrix, f32 scalar)
1742{
1743 GxMatrixAffine result(INIT::NONE);
1744 return GxMatrixAffine::getDivScalar(result, matrix, scalar);
1745}
1746
1747//---------------------------------------------------------------------------
1748// 行列加算
1752//---------------------------------------------------------------------------
1753GX_FORCE_INLINE const GxMatrixAffine operator + (const GxMatrixAffine& matrix0, const GxMatrixAffine& matrix1)
1754{
1755 GxMatrixAffine result(INIT::NONE);
1756 return GxMatrixAffine::getAddMatrix(result, matrix0, matrix1);
1757}
1758
1759//---------------------------------------------------------------------------
1760// 行列乗算
1764//---------------------------------------------------------------------------
1765GX_FORCE_INLINE const GxMatrixAffine operator * (const GxMatrixAffine& matrix0, const GxMatrixAffine& matrix1)
1766{
1767 GxMatrixAffine result(INIT::NONE);
1768 return GxMatrixAffine::getMulMatrix(result, matrix0, matrix1);
1769}
1770
1771//---------------------------------------------------------------------------
1772// 一致
1775//---------------------------------------------------------------------------
1777{
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]));
1782}
1783
1784//---------------------------------------------------------------------------
1785// 不一致
1788//---------------------------------------------------------------------------
1790{
1791 return !(*this == matrix);
1792}
1793
1794//---------------------------------------------------------------------------
1795// 単位行列に設定
1796//---------------------------------------------------------------------------
1797GX_FORCE_INLINE void GxMatrixAffine::setIdentity(void)
1798{
1799 _m[0][0] = 1.0f;
1800 _m[0][1] = 0.0f;
1801 _m[0][2] = 0.0f;
1802
1803 _m[1][0] = 0.0f;
1804 _m[1][1] = 1.0f;
1805 _m[1][2] = 0.0f;
1806
1807 _m[2][0] = 0.0f;
1808 _m[2][1] = 0.0f;
1809 _m[2][2] = 1.0f;
1810
1811 _m[3][0] = 0.0f;
1812 _m[3][1] = 0.0f;
1813 _m[3][2] = 0.0f;
1814}
1815
1816//---------------------------------------------------------------------------
1817// 回転行列を設定(X軸回転)
1818//
1821//---------------------------------------------------------------------------
1822GX_FORCE_INLINE void GxMatrixAffine::setRotateX(f32 sinValue, f32 cosValue)
1823{
1824 _m[0][0] = 1.0f;
1825 _m[0][1] = 0.0f;
1826 _m[0][2] = 0.0f;
1827
1828 _m[1][0] = 0.0f;
1829 _m[1][1] = cosValue;
1830 _m[1][2] = sinValue;
1831
1832 _m[2][0] = 0.0f;
1833 _m[2][1] =-sinValue;
1834 _m[2][2] = cosValue;
1835
1836 _m[3][0] = 0.0f;
1837 _m[3][1] = 0.0f;
1838 _m[3][2] = 0.0f;
1839}
1840
1841//---------------------------------------------------------------------------
1842// 回転行列を設定(Y軸回転)
1843//
1846//---------------------------------------------------------------------------
1847GX_FORCE_INLINE void GxMatrixAffine::setRotateY(f32 sinValue, f32 cosValue)
1848{
1849 _m[0][0] = cosValue;
1850 _m[0][1] = 0.0f;
1851 _m[0][2] =-sinValue;
1852
1853 _m[1][0] = 0.0f;
1854 _m[1][1] = 1.0f;
1855 _m[1][2] = 0.0f;
1856
1857 _m[2][0] = sinValue;
1858 _m[2][1] = 0.0f;
1859 _m[2][2] = cosValue;
1860
1861 _m[3][0] = 0.0f;
1862 _m[3][1] = 0.0f;
1863 _m[3][2] = 0.0f;
1864}
1865
1866//---------------------------------------------------------------------------
1867// 回転行列を設定(Z軸回転)
1868//
1871//---------------------------------------------------------------------------
1872GX_FORCE_INLINE void GxMatrixAffine::setRotateZ(f32 sinValue, f32 cosValue)
1873{
1874 _m[0][0] = cosValue;
1875 _m[0][1] = sinValue;
1876 _m[0][2] = 0.0f;
1877
1878 _m[1][0] =-sinValue;
1879 _m[1][1] = cosValue;
1880 _m[1][2] = 0.0f;
1881
1882 _m[2][0] = 0.0f;
1883 _m[2][1] = 0.0f;
1884 _m[2][2] = 1.0f;
1885
1886 _m[3][0] = 0.0f;
1887 _m[3][1] = 0.0f;
1888 _m[3][2] = 0.0f;
1889}
1890
1891//---------------------------------------------------------------------------
1892// XYZ軸回転角を取得
1894//---------------------------------------------------------------------------
1895GX_FORCE_INLINE GxVector3 GxMatrixAffine::getRotateXYZ(void) const
1896{
1897 // TODO:
1898 GxVector3 vector;
1899
1900 if( _m[0][2] < 1.0f )
1901 {
1902 if( _m[0][2] > -1.0f )
1903 {
1904 vector._x = -GxMath::getATan2(-_m[1][2], _m[2][2]);
1905 vector._y = -GxMath::getASin(_m[0][2]);
1906 vector._z = -GxMath::getATan2(-_m[0][1], _m[0][0]);
1907 }
1908 else
1909 {
1910 vector._x = GxMath::getATan2(_m[1][0], _m[1][1]);
1911 vector._y = PI * 0.5f;
1912 vector._z = 0.0f;
1913 }
1914 }
1915 else
1916 {
1917 vector._x = -GxMath::getATan2(_m[1][0], _m[1][1]);
1918 vector._y = -PI * 0.5f;
1919 vector._z = 0.0f;
1920 }
1921 return vector;
1922}
1923
1924//---------------------------------------------------------------------------
1925// XZY軸回転角を取得
1927//---------------------------------------------------------------------------
1928GX_FORCE_INLINE GxVector3 GxMatrixAffine::getRotateXZY(void) const
1929{
1930 // TODO:
1931 GxVector3 vector;
1932 if( _m[0][1] < 1.0f )
1933 {
1934 if( _m[0][1] > -1.0f )
1935 {
1936 vector._x = -GxMath::getATan2(_m[2][1], _m[1][1]);
1937 vector._z = -GxMath::getASin(-_m[0][1]);
1938 vector._y = -GxMath::getATan2(_m[0][2], _m[0][0]);
1939 }
1940 else
1941 {
1942 vector._x = -GxMath::getATan2(_m[2][0], _m[2][2]);
1943 vector._z = -PI * 0.5f;
1944 vector._y = 0.0f;
1945 }
1946 }
1947 else
1948 {
1949 vector._x = -GxMath::getATan2(-_m[2][0], _m[2][2]);
1950 vector._z = PI * 0.5f;
1951 vector._y = 0.0f;
1952 }
1953 return vector;
1954}
1955
1956//---------------------------------------------------------------------------
1957// YXZ軸回転角を取得
1959//---------------------------------------------------------------------------
1960GX_FORCE_INLINE GxVector3 GxMatrixAffine::getRotateYXZ(void) const
1961{
1962 // TODO:
1963 GxVector3 vector;
1964 if( _m[1][2] < 1.0f )
1965 {
1966 if( _m[1][2] > -1.0f )
1967 {
1968 vector._y = -GxMath::getATan2(_m[0][2], _m[2][2]);
1969 vector._x = -GxMath::getASin(-_m[1][2]);
1970 vector._z = -GxMath::getATan2(_m[1][0], _m[1][1]);
1971 }
1972 else
1973 {
1974 vector._y = -GxMath::getATan2(_m[0][1], _m[0][0]);
1975 vector._x = -PI * 0.5f;
1976 vector._z = 0.0f;
1977 }
1978 }
1979 else
1980 {
1981 vector._y = -GxMath::getATan2(-_m[0][1], _m[0][0]);
1982 vector._x = PI * 0.5f;
1983 vector._z = 0.0f;
1984 }
1985 return vector;
1986}
1987
1988//---------------------------------------------------------------------------
1989// YZX軸回転角を取得
1991//---------------------------------------------------------------------------
1992GX_FORCE_INLINE GxVector3 GxMatrixAffine::getRotateYZX(void) const
1993{
1994 // TODO:
1995 GxVector3 vector;
1996 if( _m[1][0] < 1.0f )
1997 {
1998 if( _m[1][0] > -1.0f )
1999 {
2000 vector._y = -GxMath::getATan2(-_m[2][0], _m[0][0]);
2001 vector._z = -GxMath::getASin(_m[1][0]);
2002 vector._x = -GxMath::getATan2(-_m[1][2], _m[1][1]);
2003 }
2004 else
2005 {
2006 vector._y = GxMath::getATan2(_m[2][1], _m[2][2]);
2007 vector._z = PI * 0.5f;
2008 vector._x = 0.0f;
2009 }
2010 }
2011 else
2012 {
2013 vector._y = -GxMath::getATan2(_m[2][1], _m[2][2]);
2014 vector._z = -PI * 0.5f;
2015 vector._x = 0.0f;
2016 }
2017 return vector;
2018}
2019
2020//---------------------------------------------------------------------------
2021// ZXY軸回転角を取得
2023//---------------------------------------------------------------------------
2024GX_FORCE_INLINE GxVector3 GxMatrixAffine::getRotateZXY(void) const
2025{
2026 // TODO:
2027 GxVector3 vector;
2028 if( _m[2][1] < 1.0f )
2029 {
2030 if( _m[2][1] > -1.0f )
2031 {
2032 vector._z = -GxMath::getATan2(-_m[0][1], _m[1][1]);
2033 vector._x = -GxMath::getASin(_m[2][1]);
2034 vector._y = -GxMath::getATan2(-_m[2][0], _m[2][2]);
2035 }
2036 else
2037 {
2038 vector._z = GxMath::getATan2(_m[2][0], _m[0][0]);
2039 vector._x = PI * 0.5f;
2040 vector._y = 0.0f;
2041 }
2042 }
2043 else
2044 {
2045 vector._z = -GxMath::getATan2(_m[0][2], _m[0][0]);
2046 vector._x = -PI * 0.5f;
2047 vector._y = 0.0f;
2048 }
2049
2050 return vector;
2051}
2052
2053//---------------------------------------------------------------------------
2054// ZYX軸回転角を取得
2056//---------------------------------------------------------------------------
2057GX_FORCE_INLINE GxVector3 GxMatrixAffine::getRotateZYX(void) const
2058{
2059 // TODO:
2060 GxVector3 vector;
2061 if( _m[2][0] < 1.0f )
2062 {
2063 if( _m[2][0] > -1.0f )
2064 {
2065 vector._z = -GxMath::getATan2(_m[1][0], _m[0][0]);
2066 vector._y = -GxMath::getASin(-_m[2][0]);
2067 vector._x = -GxMath::getATan2(_m[2][1], _m[2][2]);
2068 }
2069 else
2070 {
2071 vector._z = GxMath::getATan2(_m[0][1], _m[0][2]);
2072 vector._y = -PI * 0.5f;
2073 vector._x = 0.0f;
2074 }
2075 }
2076 else
2077 {
2078 vector._z = -GxMath::getATan2(-_m[0][1], -_m[0][2]);
2079 vector._y = PI * 0.5f;
2080 vector._x = 0.0f;
2081 }
2082
2083 return vector;
2084}
2085
2086//---------------------------------------------------------------------------
2087// 平行移動行列を設定
2088//
2090//---------------------------------------------------------------------------
2091GX_FORCE_INLINE void GxMatrixAffine::setTranslate(const GxVector3& vector)
2092{
2093 _m[0][0] = 1.0f;
2094 _m[0][1] = 0.0f;
2095 _m[0][2] = 0.0f;
2096
2097 _m[1][0] = 0.0f;
2098 _m[1][1] = 1.0f;
2099 _m[1][2] = 0.0f;
2100
2101 _m[2][0] = 0.0f;
2102 _m[2][1] = 0.0f;
2103 _m[2][2] = 1.0f;
2104
2105 _m[3][0] = vector._x;
2106 _m[3][1] = vector._y;
2107 _m[3][2] = vector._z;
2108}
2109
2110//---------------------------------------------------------------------------
2111// 平行移動行列を設定
2112//
2116//---------------------------------------------------------------------------
2117GX_FORCE_INLINE void GxMatrixAffine::setTranslate(f32 x, f32 y, f32 z)
2118{
2119 _m[0][0] = 1.0f;
2120 _m[0][1] = 0.0f;
2121 _m[0][2] = 0.0f;
2122
2123 _m[1][0] = 0.0f;
2124 _m[1][1] = 1.0f;
2125 _m[1][2] = 0.0f;
2126
2127 _m[2][0] = 0.0f;
2128 _m[2][1] = 0.0f;
2129 _m[2][2] = 1.0f;
2130
2131 _m[3][0] = x;
2132 _m[3][1] = y;
2133 _m[3][2] = z;
2134}
2135
2136//---------------------------------------------------------------------------
2137// 平行移動量のみを設定
2138//
2140//---------------------------------------------------------------------------
2141GX_FORCE_INLINE void GxMatrixAffine::setPosition(const GxVector3& position)
2142{
2143 _m[3][0] = position._x;
2144 _m[3][1] = position._y;
2145 _m[3][2] = position._z;
2146}
2147
2148//---------------------------------------------------------------------------
2149// 平行移動量のみを設定
2150//
2154//---------------------------------------------------------------------------
2155GX_FORCE_INLINE void GxMatrixAffine::setPosition(f32 x, f32 y, f32 z)
2156{
2157 _m[3][0] = x;
2158 _m[3][1] = y;
2159 _m[3][2] = z;
2160}
2161
2162//---------------------------------------------------------------------------
2163// スケールを取得
2164//---------------------------------------------------------------------------
2165GX_FORCE_INLINE GxVector3 GxMatrixAffine::getScale(void) const
2166{
2167 return GxVector3(
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()
2171 );
2172}
2173
2174//---------------------------------------------------------------------------
2175// スケール行列を設定
2176//
2178//---------------------------------------------------------------------------
2179GX_FORCE_INLINE void GxMatrixAffine::setScale(const GxVector3& vector)
2180{
2181 _m[0][0] = vector._x;
2182 _m[0][1] = 0.0f;
2183 _m[0][2] = 0.0f;
2184
2185 _m[1][0] = 0.0f;
2186 _m[1][1] = vector._y;
2187 _m[1][2] = 0.0f;
2188
2189 _m[2][0] = 0.0f;
2190 _m[2][1] = 0.0f;
2191 _m[2][2] = vector._z;
2192
2193 _m[3][0] = 0.0f;
2194 _m[3][1] = 0.0f;
2195 _m[3][2] = 0.0f;
2196}
2197
2198//---------------------------------------------------------------------------
2199// スケール行列を設定
2200//
2204//---------------------------------------------------------------------------
2205GX_FORCE_INLINE void GxMatrixAffine::setScale(f32 x, f32 y, f32 z)
2206{
2207 _m[0][0] = x;
2208 _m[0][1] = 0.0f;
2209 _m[0][2] = 0.0f;
2210
2211 _m[1][0] = 0.0f;
2212 _m[1][1] = y;
2213 _m[1][2] = 0.0f;
2214
2215 _m[2][0] = 0.0f;
2216 _m[2][1] = 0.0f;
2217 _m[2][2] = z;
2218
2219 _m[3][0] = 0.0f;
2220 _m[3][1] = 0.0f;
2221 _m[3][2] = 0.0f;
2222}
2223
2224//---------------------------------------------------------------------------
2225// 回転行列を設定
2226//
2229//---------------------------------------------------------------------------
2230GX_FORCE_INLINE void GxMatrixAffine::setRotateAxis(const GxVector3& vector, f32 radian)
2231{
2232 auto sinValue = GxMath::getSin(radian);
2233 auto cosValue = GxMath::getCos(radian);
2234
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;
2238
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;
2242
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);
2246
2247 _m[3][0] = 0.0f;
2248 _m[3][1] = 0.0f;
2249 _m[3][2] = 0.0f;
2250}
2251
2252//---------------------------------------------------------------------------
2253// 回転行列を設定
2254//
2256//---------------------------------------------------------------------------
2257GX_INLINE void GxMatrixAffine::setRotate(const GxQuaternion& quaternion)
2258{
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);
2262
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);
2266
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);
2270
2271 _m[3][0] = 0.0f;
2272 _m[3][1] = 0.0f;
2273 _m[3][2] = 0.0f;
2274}
2275
2276//---------------------------------------------------------------------------
2277// 行を取得
2280//---------------------------------------------------------------------------
2282{
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]);
2286}
2287
2288//---------------------------------------------------------------------------
2289// 行のアドレスを取得
2292//---------------------------------------------------------------------------
2293GX_FORCE_INLINE const f32* GxMatrixAffine::getRowPtr(u32 row) const
2294{
2295 return &_m[row][0];
2296}
2297
2298//---------------------------------------------------------------------------
2299// 行を設定
2300//
2303//---------------------------------------------------------------------------
2304void GxMatrixAffine::setRow(u32 row, const GxVector4& vector)
2305{
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;
2310}
2311
2312//---------------------------------------------------------------------------
2313// 行を設定
2314//
2317//---------------------------------------------------------------------------
2318void GxMatrixAffine::setRow(u32 row, const GxVector3& vector)
2319{
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;
2324}
2325
2326//---------------------------------------------------------------------------
2327// 列を取得
2330//---------------------------------------------------------------------------
2332{
2333 GX_ASSERT(column < 4, "指定された列数が大きすぎます(%d)", column);
2334 return column == 3 ? GxVector4::AXIS_W : GxVector4(_m[0][column], _m[1][column], _m[2][column], _m[3][column]);
2335}
2336
2337//---------------------------------------------------------------------------
2338// 列を設定
2339//
2342//---------------------------------------------------------------------------
2343void GxMatrixAffine::setColumn(u32 column, const GxVector4& vector)
2344{
2345 GX_ASSERT(column < 4, "指定された列数が大きすぎます(%d)", column);
2346 if(column < 3)
2347 {
2348 _m[0][column] = vector._x;
2349 _m[1][column] = vector._y;
2350 _m[2][column] = vector._z;
2351 _m[3][column] = vector._w;
2352 }
2353}
2354
2355//---------------------------------------------------------------------------
2356// 値を取得
2360//---------------------------------------------------------------------------
2361f32 GxMatrixAffine::getValue(u32 row, u32 column) const
2362{
2363 GX_ASSERT(row < 4, "指定された行数が大きすぎます(%d)", row);
2364 GX_ASSERT(column < 4, "指定された列数が大きすぎます(%d)", column);
2365 if( column == 3 )
2366 {
2367 return GxVector4::AXIS_W[row];
2368 }
2369 return _m[row][column];
2370}
2371
2372//---------------------------------------------------------------------------
2373// 値を設定
2374//
2378//---------------------------------------------------------------------------
2379void GxMatrixAffine::setValue(u32 row, u32 column, f32 value)
2380{
2381 GX_ASSERT(row < 4, "指定された行数が大きすぎます(%d)", row);
2382 GX_ASSERT(column < 4, "指定された列数が大きすぎます(%d)", column);
2383 if(column < 3)
2384 {
2385 _m[row][column] = value;
2386 }
2387}
2388
2389//---------------------------------------------------------------------------
2390// 参照を取得
2394//---------------------------------------------------------------------------
2395f32& GxMatrixAffine::getReference(u32 row, u32 column)
2396{
2397 GX_ASSERT(row < 4, "指定された行数が大きすぎます(%d)", row);
2398 GX_ASSERT(column < 3, "指定された列数が大きすぎます(%d)", column);
2399 return _m[row][column];
2400}
2401
2402//---------------------------------------------------------------------------
2403// 参照を取得
2407//---------------------------------------------------------------------------
2408const f32& GxMatrixAffine::getReference(u32 row, u32 column) const
2409{
2410 GX_ASSERT(row < 4, "指定された行数が大きすぎます(%d)", row);
2411 GX_ASSERT(column < 3, "指定された列数が大きすぎます(%d)", column);
2412 return _m[row][column];
2413}
2414
2415//---------------------------------------------------------------------------
2416// 行列式の値を取得
2418//---------------------------------------------------------------------------
2419GX_FORCE_INLINE f32 GxMatrixAffine::getDeterminant(void) const
2420{
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]);
2424}
2425
2426//---------------------------------------------------------------------------
2427// 逆行列を取得
2429//---------------------------------------------------------------------------
2431{
2432 GxMatrixAffine result(INIT::NONE);
2433 return GxMatrixAffine::getInverse(result, *this);
2434}
2435
2436//---------------------------------------------------------------------------
2437// 転置行列を取得
2439//---------------------------------------------------------------------------
2441{
2442 return GxMatrixAffine( _m[0][0], _m[1][0], _m[2][0],
2443 _m[0][1], _m[1][1], _m[2][1],
2444 _m[0][2], _m[1][2], _m[2][2],
2445 0.0f, 0.0f, 0.0f);
2446}
2447
2448//---------------------------------------------------------------------------
2449// 位置以外の各軸を正規化したものを取得
2451//---------------------------------------------------------------------------
2453{
2454 GxMatrixAffine matrix(getPosition());
2455
2456 auto x = GxVector3(getRow(0)).getNormalizeEx();
2457 auto y = GxVector3(getRow(1)).getNormalizeEx();
2458 auto z = GxVector3(getRow(2)).getNormalizeEx();
2459
2460 matrix.setRow(0, x);
2461 matrix.setRow(1, y);
2462 matrix.setRow(2, z);
2463
2464 return matrix;
2465}
2466
2467//---------------------------------------------------------------------------
2468// スカラ乗算を取得
2473//---------------------------------------------------------------------------
2474GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::getMulScalar(GxMatrixAffine& dst, const GxMatrixAffine& matrix, f32 scalar)
2475{
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;
2479
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;
2483
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;
2487
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;
2491
2492 return dst;
2493}
2494
2495//---------------------------------------------------------------------------
2496// スカラ除算を取得
2501//---------------------------------------------------------------------------
2502GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::getDivScalar(GxMatrixAffine& dst, const GxMatrixAffine& matrix, f32 scalar)
2503{
2504 auto inverseScalar = 1.0f / scalar;
2505
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;
2509
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;
2513
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;
2517
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;
2521
2522 return dst;
2523}
2524
2525//---------------------------------------------------------------------------
2526// 行列加算を取得
2531//---------------------------------------------------------------------------
2532GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::getAddMatrix(GxMatrixAffine& dst, const GxMatrixAffine& matrix0, const GxMatrixAffine& matrix1)
2533{
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];
2537
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];
2541
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];
2545
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];
2549
2550 return dst;
2551}
2552
2553//---------------------------------------------------------------------------
2554// 行列乗算を取得
2559//---------------------------------------------------------------------------
2560GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::getMulMatrix(GxMatrixAffine& dst, const GxMatrixAffine& matrix0, const GxMatrixAffine& matrix1)
2561{
2562#if defined(GX_USE_SSE2)
2563 __declspec(align(16)) static const u32 masktable[4] = {0xffffffff,0xffffffff,0xffffffff,0x00000000};
2564
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 );
2570
2571 __m128 mx;
2572 __m128 my;
2573 __m128 mz;
2574 __m128 row;
2575
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);
2581
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);
2587
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);
2593
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));
2599
2600#else //GX_USE_SSE2
2601 // 入力と出力が同じ行列だった場合を考慮して、一時変数で計算する
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];
2605
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];
2609
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];
2613
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];
2617
2618 dst._m[0][0] = m00;
2619 dst._m[0][1] = m01;
2620 dst._m[0][2] = m02;
2621
2622 dst._m[1][0] = m10;
2623 dst._m[1][1] = m11;
2624 dst._m[1][2] = m12;
2625
2626 dst._m[2][0] = m20;
2627 dst._m[2][1] = m21;
2628 dst._m[2][2] = m22;
2629
2630 dst._m[3][0] = m30;
2631 dst._m[3][1] = m31;
2632 dst._m[3][2] = m32;
2633#endif // !GX_USE_SSE2
2634
2635 return dst;
2636}
2637
2638//---------------------------------------------------------------------------
2639// 行列乗算を取得
2643//---------------------------------------------------------------------------
2644GX_FORCE_INLINE void GxMatrixAffine::getFastMulMatrix(GxMatrixAffine& dst, const GxMatrixAffine& matrix0, const GxMatrixAffine& matrix1)
2645{
2646#if defined(GX_USE_SSE2)
2647 __m128 mx;
2648 __m128 my;
2649 __m128 mz;
2650 __m128 m0r;
2651
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]);
2656
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 ));
2662
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 ));
2668
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 ));
2674
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)));
2680#else //GX_USE_SSE2
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];
2684
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];
2688
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];
2692
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];
2696#endif // !GX_USE_SSE2
2697}
2698
2699//---------------------------------------------------------------------------
2700// simd 用にアライメントされているか調べる
2703//---------------------------------------------------------------------------
2705{
2706 return !(reinterpret_cast<size_t>(matrix._m) & (16 - 1)); // 16byte
2707}
2708
2709//---------------------------------------------------------------------------
2710// 行列乗算を取得
2715//---------------------------------------------------------------------------
2716GX_FORCE_INLINE const GxMatrixAffineGpu& GxMatrixAffine::getMulMatrix(GxMatrixAffineGpu& dst, const GxMatrixAffine& matrix0, const GxMatrixAffine& matrix1)
2717{
2718#if defined(GX_USE_SSE2)
2719 __declspec(align(16)) static const u32 masktable[4] = {0xffffffff,0xffffffff,0xffffffff,0x00000000};
2720
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 );
2726
2727 __m128 lr0 = matrix0._r[0];
2728 __m128 lr1 = matrix0._r[1];
2729 __m128 lr2 = matrix0._r[2];
2730 __m128 lr3 = matrix0._r[3];
2731 __m128 v;
2732 __m128 mx;
2733 __m128 my;
2734 __m128 mz;
2735
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)) );
2743
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)) );
2751
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)) );
2759
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)) );
2767
2768#else //GX_USE_SSE2
2769 // 入力と出力が同じ行列だった場合を考慮して、一時変数で計算する
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];
2773
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];
2777
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];
2781
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];
2785
2786 dst._m[0][0] = m00;
2787 dst._m[1][0] = m01;
2788 dst._m[2][0] = m02;
2789
2790 dst._m[0][1] = m10;
2791 dst._m[1][1] = m11;
2792 dst._m[2][1] = m12;
2793
2794 dst._m[0][2] = m20;
2795 dst._m[1][2] = m21;
2796 dst._m[2][2] = m22;
2797
2798 dst._m[0][3] = m30;
2799 dst._m[1][3] = m31;
2800 dst._m[2][3] = m32;
2801#endif // !GX_USE_SSE2
2802 return dst;
2803}
2804
2805#if defined(GX_USE_SSE2)
2806GX_FORCE_INLINE __m128 getDeterminantFrom33_SSE( __m128 r0, __m128 r1, __m128 r2 )
2807{
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) );
2814}
2815
2816GX_FORCE_INLINE __m128 getRcpDeterminant_SSE( const GxMatrixAffine& matrix )
2817{
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);
2825 return m0;
2826}
2827#endif //GX_USE_SSE2
2828
2829//---------------------------------------------------------------------------
2830// 逆行列を取得
2834//---------------------------------------------------------------------------
2836{
2837#if defined(GX_USE_SSE2)
2838 __m128 d = getRcpDeterminant_SSE( matrix );
2839
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];
2843
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];
2847
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];
2851
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 );
2859#else //GX_USE_SSE2
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];
2863
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];
2867
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];
2871
2872 const auto m30 = -GxMatrix33(matrix._m[1][0], matrix._m[1][1], matrix._m[1][2], matrix._m[2][0], matrix._m[2][1], matrix._m[2][2], matrix._m[3][0], matrix._m[3][1], matrix._m[3][2]).getDeterminant();
2873 const auto m31 = GxMatrix33(matrix._m[0][0], matrix._m[0][1], matrix._m[0][2], matrix._m[2][0], matrix._m[2][1], matrix._m[2][2], matrix._m[3][0], matrix._m[3][1], matrix._m[3][2]).getDeterminant();
2874 const auto m32 = -GxMatrix33(matrix._m[0][0], matrix._m[0][1], matrix._m[0][2], matrix._m[1][0], matrix._m[1][1], matrix._m[1][2], matrix._m[3][0], matrix._m[3][1], matrix._m[3][2]).getDeterminant();
2875
2876 const auto d = 1.0f / matrix.getDeterminant();
2877
2878 dst._m[0][0] = m00 * d;
2879 dst._m[0][1] = m01 * d;
2880 dst._m[0][2] = m02 * d;
2881
2882 dst._m[1][0] = m10 * d;
2883 dst._m[1][1] = m11 * d;
2884 dst._m[1][2] = m12 * d;
2885
2886 dst._m[2][0] = m20 * d;
2887 dst._m[2][1] = m21 * d;
2888 dst._m[2][2] = m22 * d;
2889
2890 dst._m[3][0] = m30 * d;
2891 dst._m[3][1] = m31 * d;
2892 dst._m[3][2] = m32 * d;
2893#endif // !GX_USE_SSE2
2894 return dst;
2895}
2896//---------------------------------------------------------------------------
2897// 転置行列を取得
2901//---------------------------------------------------------------------------
2903{
2904 const auto m00 = matrix._m[0][0];
2905 const auto m01 = matrix._m[1][0];
2906 const auto m02 = matrix._m[2][0];
2907
2908 const auto m10 = matrix._m[0][1];
2909 const auto m11 = matrix._m[1][1];
2910 const auto m12 = matrix._m[2][1];
2911
2912 const auto m20 = matrix._m[0][2];
2913 const auto m21 = matrix._m[1][2];
2914 const auto m22 = matrix._m[2][2];
2915
2916 dst._m[0][0] = m00;
2917 dst._m[0][1] = m01;
2918 dst._m[0][2] = m02;
2919
2920 dst._m[1][0] = m10;
2921 dst._m[1][1] = m11;
2922 dst._m[1][2] = m12;
2923
2924 dst._m[2][0] = m20;
2925 dst._m[2][1] = m21;
2926 dst._m[2][2] = m22;
2927
2928 dst._m[3][0] = 0.0f;
2929 dst._m[3][1] = 0.0f;
2930 dst._m[3][2] = 0.0f;
2931
2932 return dst;
2933}
2934
2935//---------------------------------------------------------------------------
2936// スカラ乗算
2939//---------------------------------------------------------------------------
2940GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::mulScalar(f32 scalar)
2941{
2942 _m[0][0] *= scalar;
2943 _m[0][1] *= scalar;
2944 _m[0][2] *= scalar;
2945
2946 _m[1][0] *= scalar;
2947 _m[1][1] *= scalar;
2948 _m[1][2] *= scalar;
2949
2950 _m[2][0] *= scalar;
2951 _m[2][1] *= scalar;
2952 _m[2][2] *= scalar;
2953
2954 _m[3][0] *= scalar;
2955 _m[3][1] *= scalar;
2956 _m[3][2] *= scalar;
2957
2958 return *this;
2959}
2960
2961//---------------------------------------------------------------------------
2962// スカラ除算
2965//---------------------------------------------------------------------------
2966GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::divScalar(f32 scalar)
2967{
2968 auto invScalar = 1.0f / scalar;
2969
2970 _m[0][0] *= invScalar;
2971 _m[0][1] *= invScalar;
2972 _m[0][2] *= invScalar;
2973
2974 _m[1][0] *= invScalar;
2975 _m[1][1] *= invScalar;
2976 _m[1][2] *= invScalar;
2977
2978 _m[2][0] *= invScalar;
2979 _m[2][1] *= invScalar;
2980 _m[2][2] *= invScalar;
2981
2982 _m[3][0] *= invScalar;
2983 _m[3][1] *= invScalar;
2984 _m[3][2] *= invScalar;
2985
2986 return *this;
2987}
2988
2989//---------------------------------------------------------------------------
2990// 行列加算
2993//---------------------------------------------------------------------------
2994GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::addMatrix(const GxMatrixAffine& matrix)
2995{
2996 _m[0][0] += matrix._m[0][0];
2997 _m[0][1] += matrix._m[0][1];
2998 _m[0][2] += matrix._m[0][2];
2999
3000 _m[1][0] += matrix._m[1][0];
3001 _m[1][1] += matrix._m[1][1];
3002 _m[1][2] += matrix._m[1][2];
3003
3004 _m[2][0] += matrix._m[2][0];
3005 _m[2][1] += matrix._m[2][1];
3006 _m[2][2] += matrix._m[2][2];
3007
3008 _m[3][0] += matrix._m[3][0];
3009 _m[3][1] += matrix._m[3][1];
3010 _m[3][2] += matrix._m[3][2];
3011
3012 return *this;
3013}
3014
3015//---------------------------------------------------------------------------
3016// 行列乗算
3019//---------------------------------------------------------------------------
3020GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::mulMatrix(const GxMatrixAffine& matrix)
3021{
3022 getMulMatrix( *this, *this, matrix);
3023 return *this;
3024}
3025
3026//---------------------------------------------------------------------------
3027// X軸回転乗算
3030//---------------------------------------------------------------------------
3031GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::mulRotateX(f32 radian)
3032{
3033 GxMatrixAffine matrix(INIT::NONE);
3034 matrix.setRotateX(radian);
3035 mulMatrix(matrix);
3036
3037 return *this;
3038}
3039
3040//---------------------------------------------------------------------------
3041// Y軸回転乗算
3044//---------------------------------------------------------------------------
3045GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::mulRotateY(f32 radian)
3046{
3047 GxMatrixAffine matrix(INIT::NONE);
3048 matrix.setRotateY(radian);
3049 mulMatrix(matrix);
3050
3051 return *this;
3052}
3053
3054//---------------------------------------------------------------------------
3055// Z軸回転乗算
3058//---------------------------------------------------------------------------
3059GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::mulRotateZ(f32 radian)
3060{
3061 GxMatrixAffine matrix(INIT::NONE);
3062 matrix.setRotateZ(radian);
3063 mulMatrix(matrix);
3064
3065 return *this;
3066}
3067
3068//---------------------------------------------------------------------------
3069// クォータニオンによる回転乗算(前から乗算)
3072//---------------------------------------------------------------------------
3073GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::mulQuaternionFront(const GxQuaternion& quaternion)
3074{
3075 GxMatrixAffine matrix(quaternion);
3076 GxMatrixAffine::getMulMatrix(*this, matrix, *this);
3077
3078 return *this;
3079}
3080
3081//---------------------------------------------------------------------------
3082// クォータニオンによる回転乗算(後ろから乗算)
3085//---------------------------------------------------------------------------
3086GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::mulQuaternionBack(const GxQuaternion& quaternion)
3087{
3088#if GX_MATRIX_SAFE_MODE
3089 GxMatrixAffine matrix(quaternion);
3090 mulMatrix(matrix);
3091#else //GX_MATRIX_SAFE_MODE
3092
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)
3097
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)
3102
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)
3106
3107
3108 __m128 v0,v1,v2,v3;
3109 __m128 r0,r1,r2;
3110 __m128 t0,t1,t2;
3111
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);
3115
3116 v0 = _mm_shuffle_ps(q, q, _SHF_YXX);
3117 v1 = _mm_shuffle_ps(q, q, _SHF_ZZY);
3118
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 ) );
3121
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);
3126
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 ) );
3130
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) );
3133
3134 t2 = _mm_mul_ps( c2, _mm_sub_ps( v0, v1 ) );
3135
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() ) );
3139
3140 __m128 m00 = _r[0];
3141 __m128 m10 = _r[1];
3142 __m128 m20 = _r[2];
3143 __m128 m30 = _r[3];
3144
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 ) );
3149#else //GX_USE_SSE2
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);
3153
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);
3157
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);
3161
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;
3165
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;
3169
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;
3173
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;
3177
3178 _m[0][0] = m00;
3179 _m[0][1] = m01;
3180 _m[0][2] = m02;
3181
3182 _m[1][0] = m10;
3183 _m[1][1] = m11;
3184 _m[1][2] = m12;
3185
3186 _m[2][0] = m20;
3187 _m[2][1] = m21;
3188 _m[2][2] = m22;
3189
3190 _m[3][0] = m30;
3191 _m[3][1] = m31;
3192 _m[3][2] = m32;
3193#endif // !GX_USE_SSE2
3194#endif // !GX_MATRIX_SAFE_MODE
3195
3196 return *this;
3197}
3198
3199//---------------------------------------------------------------------------
3200// スケール行列を設定し、クォータニオンによる回転乗算(後ろから乗算)を行う
3201//
3204//---------------------------------------------------------------------------
3205GX_FORCE_INLINE void GxMatrixAffine::setScaleQuaternion(const GxVector3& scale, const GxQuaternion& quaternion)
3206{
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)
3211
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)
3216
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)
3220
3221 __m128 v0,v1,v2,v3;
3222 __m128 r0,r1,r2;
3223 __m128 t0,t1,t2;
3224
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);
3228
3229 v0 = _mm_shuffle_ps(q, q, _SHF_YXX);
3230 v1 = _mm_shuffle_ps(q, q, _SHF_ZZY);
3231
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 ) );
3234
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);
3239
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 ) );
3243
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) );
3246
3247 t2 = _mm_mul_ps( c2, _mm_sub_ps( v0, v1 ) );
3248
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() ) );
3252
3253 __m128 s = _mm_loadu_ps( &scale._x );
3254
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();
3259#else //GX_USE_SSE2
3260 setScale(scale);
3261 mulQuaternionBack(quaternion);
3262#endif // !GX_USE_SSE2
3263}
3264
3265//---------------------------------------------------------------------------
3266// 平行移動乗算
3269//---------------------------------------------------------------------------
3270GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::mulTranslate(const GxVector3& vector)
3271{
3272#if GX_MATRIX_SAFE_MODE
3273 GxMatrixAffine matrix;
3274 matrix.setTranslate(vector);
3275 mulMatrix(matrix);
3276#else //GX_MATRIX_SAFE_MODE
3277 _m[3][0] += vector._x;
3278 _m[3][1] += vector._y;
3279 _m[3][2] += vector._z;
3280#endif // !GX_MATRIX_SAFE_MODE
3281
3282 return *this;
3283}
3284
3285//---------------------------------------------------------------------------
3286// 平行移動乗算
3291//---------------------------------------------------------------------------
3292GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::mulTranslate(f32 x, f32 y, f32 z)
3293{
3294#if GX_MATRIX_SAFE_MODE
3295 GxMatrixAffine matrix;
3296 matrix.setTranslate(x, y, z);
3297 mulMatrix(matrix);
3298#else //GX_MATRIX_SAFE_MODE
3299 _m[3][0] += x;
3300 _m[3][1] += y;
3301 _m[3][2] += z;
3302#endif // !GX_MATRIX_SAFE_MODE
3303
3304 return *this;
3305}
3306
3307//---------------------------------------------------------------------------
3308// スケール乗算
3311//---------------------------------------------------------------------------
3312GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::mulScale(const GxVector3& vector)
3313{
3314#if GX_MATRIX_SAFE_MODE
3315 GxMatrixAffine matrix;
3316 matrix.setScale(vector);
3317 mulMatrix(matrix);
3318#else //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;
3322
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;
3326
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;
3330
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;
3334#endif // !GX_MATRIX_SAFE_MODE
3335
3336 return *this;
3337}
3338
3339//---------------------------------------------------------------------------
3340// スケール乗算
3345//---------------------------------------------------------------------------
3346GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::mulScale(f32 x, f32 y, f32 z)
3347{
3348#if GX_MATRIX_SAFE_MODE
3349 GxMatrixAffine matrix;
3350 matrix.setScale(x, y, z);
3351 mulMatrix(matrix);
3352#else //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;
3356
3357 _m[1][0] = _m[1][0] * x;
3358 _m[1][1] = _m[1][1] * y;
3359 _m[1][2] = _m[1][2] * z;
3360
3361 _m[2][0] = _m[2][0] * x;
3362 _m[2][1] = _m[2][1] * y;
3363 _m[2][2] = _m[2][2] * z;
3364
3365 _m[3][0] = _m[3][0] * x;
3366 _m[3][1] = _m[3][1] * y;
3367 _m[3][2] = _m[3][2] * z;
3368#endif // !GX_MATRIX_SAFE_MODE
3369
3370 return *this;
3371}
3372
3373//---------------------------------------------------------------------------
3374// 逆行列にする
3376//---------------------------------------------------------------------------
3377GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::inverse(void)
3378{
3379 return getInverse(*this, *this);
3380}
3381
3382//---------------------------------------------------------------------------
3383// 転置する
3385//---------------------------------------------------------------------------
3386GX_FORCE_INLINE const GxMatrixAffine& GxMatrixAffine::transpose(void)
3387{
3388 const auto m00 = _m[0][0];
3389 const auto m01 = _m[1][0];
3390 const auto m02 = _m[2][0];
3391
3392 const auto m10 = _m[0][1];
3393 const auto m11 = _m[1][1];
3394 const auto m12 = _m[2][1];
3395
3396 const auto m20 = _m[0][2];
3397 const auto m21 = _m[1][2];
3398 const auto m22 = _m[2][2];
3399
3400 _m[0][0] = m00;
3401 _m[0][1] = m01;
3402 _m[0][2] = m02;
3403
3404 _m[1][0] = m10;
3405 _m[1][1] = m11;
3406 _m[1][2] = m12;
3407
3408 _m[2][0] = m20;
3409 _m[2][1] = m21;
3410 _m[2][2] = m22;
3411
3412 _m[3][0] = 0.0f;
3413 _m[3][1] = 0.0f;
3414 _m[3][2] = 0.0f;
3415
3416 return *this;
3417}
3418
3419//===========================================================================
3420// GxMatrix44
3421//===========================================================================
3422//---------------------------------------------------------------------------
3423// コンストラクタ
3425//---------------------------------------------------------------------------
3426GX_INLINE GxMatrix44::GxMatrix44(INIT initType)
3427{
3428 switch(initType)
3429 {
3430 case INIT::ZERO:
3431 setZero();
3432 break;
3433 case INIT::IDENTITY:
3434 setIdentity();
3435 break;
3436 case INIT::NONE:
3437 default:
3438 break;
3439 }
3440}
3441
3442//---------------------------------------------------------------------------
3443// コンストラクタ
3446//---------------------------------------------------------------------------
3447GX_INLINE GxMatrix44::GxMatrix44(const GxQuaternion& quaternion, const GxVector3& position)
3448{
3449 setRotate(quaternion);
3450 setPosition(position);
3451}
3452
3453//---------------------------------------------------------------------------
3454// コンストラクタ
3456//---------------------------------------------------------------------------
3457GX_INLINE GxMatrix44::GxMatrix44(const GxQuaternion& quaternion)
3458{
3459 setRotate(quaternion);
3460}
3461
3462//---------------------------------------------------------------------------
3463// コンストラクタ
3465//---------------------------------------------------------------------------
3466GX_INLINE GxMatrix44::GxMatrix44(const GxVector3& position)
3467{
3468 setTranslate(position);
3469}
3470
3471//---------------------------------------------------------------------------
3472// コンストラクタ
3473//---------------------------------------------------------------------------
3474GX_INLINE GxMatrix44::GxMatrix44( f32 m00, f32 m01, f32 m02, f32 m03,
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)
3478{
3479 _m[0][0] = m00;
3480 _m[0][1] = m01;
3481 _m[0][2] = m02;
3482 _m[0][3] = m03;
3483
3484 _m[1][0] = m10;
3485 _m[1][1] = m11;
3486 _m[1][2] = m12;
3487 _m[1][3] = m13;
3488
3489 _m[2][0] = m20;
3490 _m[2][1] = m21;
3491 _m[2][2] = m22;
3492 _m[2][3] = m23;
3493
3494 _m[3][0] = m30;
3495 _m[3][1] = m31;
3496 _m[3][2] = m32;
3497 _m[3][3] = m33;
3498}
3499
3500//---------------------------------------------------------------------------
3501// コンストラクタ
3503//---------------------------------------------------------------------------
3505{
3506 _m[0][0] = matrix._m[0][0];
3507 _m[0][1] = matrix._m[0][1];
3508 _m[0][2] = matrix._m[0][2];
3509 _m[0][3] = 0.0f;
3510
3511 _m[1][0] = matrix._m[1][0];
3512 _m[1][1] = matrix._m[1][1];
3513 _m[1][2] = matrix._m[1][2];
3514 _m[1][3] = 0.0f;
3515
3516 _m[2][0] = matrix._m[2][0];
3517 _m[2][1] = matrix._m[2][1];
3518 _m[2][2] = matrix._m[2][2];
3519 _m[2][3] = 0.0f;
3520
3521 _m[3][0] = matrix._m[3][0];
3522 _m[3][1] = matrix._m[3][1];
3523 _m[3][2] = matrix._m[3][2];
3524 _m[3][3] = 1.0f;
3525}
3526
3527//---------------------------------------------------------------------------
3528// コピーコンストラクタ
3530//---------------------------------------------------------------------------
3531GX_INLINE GxMatrix44::GxMatrix44(const GxMatrix44& matrix)
3532{
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];
3537
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];
3542
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];
3547
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];
3552}
3553
3554//---------------------------------------------------------------------------
3555// 初期化
3556//
3559//---------------------------------------------------------------------------
3560GX_FORCE_INLINE void GxMatrix44::initialize(const GxQuaternion& quaternion, const GxVector3& position)
3561{
3562 setRotate(quaternion);
3563 setPosition(position);
3564}
3565
3566//---------------------------------------------------------------------------
3567// 代入
3570//---------------------------------------------------------------------------
3571GX_FORCE_INLINE GxMatrix44& GxMatrix44::operator = (const GxMatrix44& matrix)
3572{
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];
3577
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];
3582
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];
3587
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];
3592
3593 return *this;
3594}
3595
3596//---------------------------------------------------------------------------
3597// スカラ乗算代入
3600//---------------------------------------------------------------------------
3601GX_FORCE_INLINE GxMatrix44& GxMatrix44::operator *= (f32 scalar)
3602{
3603 mulScalar(scalar);
3604
3605 return *this;
3606}
3607
3608//---------------------------------------------------------------------------
3609// スカラ除算代入
3612//---------------------------------------------------------------------------
3613GX_FORCE_INLINE GxMatrix44& GxMatrix44::operator /= (f32 scalar)
3614{
3615 divScalar(scalar);
3616
3617 return *this;
3618}
3619
3620//---------------------------------------------------------------------------
3621// 行列加算代入
3624//---------------------------------------------------------------------------
3625GX_FORCE_INLINE GxMatrix44& GxMatrix44::operator += (const GxMatrix44& matrix)
3626{
3627 addMatrix(matrix);
3628
3629 return *this;
3630}
3631
3632//---------------------------------------------------------------------------
3633// 行列乗算代入
3636//---------------------------------------------------------------------------
3637GX_FORCE_INLINE GxMatrix44& GxMatrix44::operator *= (const GxMatrix44& matrix)
3638{
3639 mulMatrix(matrix);
3640
3641 return *this;
3642}
3643
3644//---------------------------------------------------------------------------
3645// スカラ乗算
3649//---------------------------------------------------------------------------
3650GX_FORCE_INLINE const GxMatrix44 operator * (const GxMatrix44& matrix, f32 scalar)
3651{
3652 GxMatrix44 result; // empty constructor
3653 return GxMatrix44::getMulScalar(result, matrix, scalar);
3654}
3655
3656//---------------------------------------------------------------------------
3657// スカラ除算
3661//---------------------------------------------------------------------------
3662GX_FORCE_INLINE const GxMatrix44 operator / (const GxMatrix44& matrix, f32 scalar)
3663{
3664 GxMatrix44 result; // empty constructor
3665 return GxMatrix44::getDivScalar(result, matrix, scalar);
3666}
3667
3668//---------------------------------------------------------------------------
3669// 行列加算
3673//---------------------------------------------------------------------------
3674GX_FORCE_INLINE const GxMatrix44 operator + (const GxMatrix44& matrix0, const GxMatrix44& matrix1)
3675{
3676 GxMatrix44 result; // empty constructor
3677 return GxMatrix44::getAddMatrix(result, matrix0, matrix1);
3678}
3679
3680//---------------------------------------------------------------------------
3681// 行列乗算
3685//---------------------------------------------------------------------------
3686GX_FORCE_INLINE const GxMatrix44 operator * (const GxMatrix44& matrix0, const GxMatrix44& matrix1)
3687{
3688 GxMatrix44 result; // empty constructor
3689 return GxMatrix44::getMulMatrix(result, matrix0, matrix1);
3690}
3691
3692//---------------------------------------------------------------------------
3693// 一致
3696//---------------------------------------------------------------------------
3697GX_FORCE_INLINE b32 GxMatrix44::operator == (const GxMatrix44& matrix)
3698{
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]));
3703}
3704
3705//---------------------------------------------------------------------------
3706// 不一致
3709//---------------------------------------------------------------------------
3710GX_FORCE_INLINE b32 GxMatrix44::operator != (const GxMatrix44& matrix)
3711{
3712 return !(*this == matrix);
3713}
3714
3715//---------------------------------------------------------------------------
3716// 単位行列に設定
3717//---------------------------------------------------------------------------
3718GX_FORCE_INLINE void GxMatrix44::setIdentity(void)
3719{
3720 _m[0][0] = 1.0f;
3721 _m[0][1] = 0.0f;
3722 _m[0][2] = 0.0f;
3723 _m[0][3] = 0.0f;
3724
3725 _m[1][0] = 0.0f;
3726 _m[1][1] = 1.0f;
3727 _m[1][2] = 0.0f;
3728 _m[1][3] = 0.0f;
3729
3730 _m[2][0] = 0.0f;
3731 _m[2][1] = 0.0f;
3732 _m[2][2] = 1.0f;
3733 _m[2][3] = 0.0f;
3734
3735 _m[3][0] = 0.0f;
3736 _m[3][1] = 0.0f;
3737 _m[3][2] = 0.0f;
3738 _m[3][3] = 1.0f;
3739}
3740
3741//---------------------------------------------------------------------------
3742// 回転行列を設定(X軸回転)
3743//
3746//---------------------------------------------------------------------------
3747GX_FORCE_INLINE void GxMatrix44::setRotateX(f32 sinValue, f32 cosValue)
3748{
3749 _m[0][0] = 1.0f;
3750 _m[0][1] = 0.0f;
3751 _m[0][2] = 0.0f;
3752 _m[0][3] = 0.0f;
3753
3754 _m[1][0] = 0.0f;
3755 _m[1][1] = cosValue;
3756 _m[1][2] = sinValue;
3757 _m[1][3] = 0.0f;
3758
3759 _m[2][0] = 0.0f;
3760 _m[2][1] =-sinValue;
3761 _m[2][2] = cosValue;
3762 _m[2][3] = 0.0f;
3763
3764 _m[3][0] = 0.0f;
3765 _m[3][1] = 0.0f;
3766 _m[3][2] = 0.0f;
3767 _m[3][3] = 1.0f;
3768}
3769
3770//---------------------------------------------------------------------------
3771// 回転行列を設定(Y軸回転)
3772//
3775//---------------------------------------------------------------------------
3776GX_FORCE_INLINE void GxMatrix44::setRotateY(f32 sinValue, f32 cosValue)
3777{
3778 _m[0][0] = cosValue;
3779 _m[0][1] = 0.0f;
3780 _m[0][2] =-sinValue;
3781 _m[0][3] = 0.0f;
3782
3783 _m[1][0] = 0.0f;
3784 _m[1][1] = 1.0f;
3785 _m[1][2] = 0.0f;
3786 _m[1][3] = 0.0f;
3787
3788 _m[2][0] = sinValue;
3789 _m[2][1] = 0.0f;
3790 _m[2][2] = cosValue;
3791 _m[2][3] = 0.0f;
3792
3793 _m[3][0] = 0.0f;
3794 _m[3][1] = 0.0f;
3795 _m[3][2] = 0.0f;
3796 _m[3][3] = 1.0f;
3797}
3798
3799//---------------------------------------------------------------------------
3800// 回転行列を設定(Z軸回転)
3801//
3804//---------------------------------------------------------------------------
3805GX_FORCE_INLINE void GxMatrix44::setRotateZ(f32 sinValue, f32 cosValue)
3806{
3807 _m[0][0] = cosValue;
3808 _m[0][1] = sinValue;
3809 _m[0][2] = 0.0f;
3810 _m[0][3] = 0.0f;
3811
3812 _m[1][0] =-sinValue;
3813 _m[1][1] = cosValue;
3814 _m[1][2] = 0.0f;
3815 _m[1][3] = 0.0f;
3816
3817 _m[2][0] = 0.0f;
3818 _m[2][1] = 0.0f;
3819 _m[2][2] = 1.0f;
3820 _m[2][3] = 0.0f;
3821
3822 _m[3][0] = 0.0f;
3823 _m[3][1] = 0.0f;
3824 _m[3][2] = 0.0f;
3825 _m[3][3] = 1.0f;
3826}
3827
3828//---------------------------------------------------------------------------
3829// XYZ軸回転角を取得
3831//---------------------------------------------------------------------------
3832GX_FORCE_INLINE GxVector3 GxMatrix44::getRotateXYZ(void) const
3833{
3834 // TODO:
3835 GxVector3 vector;
3836
3837 if( _m[0][2] < 1.0f )
3838 {
3839 if( _m[0][2] > -1.0f )
3840 {
3841 vector._x = -GxMath::getATan2(-_m[1][2], _m[2][2]);
3842 vector._y = -GxMath::getASin(_m[0][2]);
3843 vector._z = -GxMath::getATan2(-_m[0][1], _m[0][0]);
3844 }
3845 else
3846 {
3847 vector._x = GxMath::getATan2(_m[1][0], _m[1][1]);
3848 vector._y = PI * 0.5f;
3849 vector._z = 0.0f;
3850 }
3851 }
3852 else
3853 {
3854 vector._x = -GxMath::getATan2(_m[1][0], _m[1][1]);
3855 vector._y = -PI * 0.5f;
3856 vector._z = 0.0f;
3857 }
3858 return vector;
3859}
3860
3861//---------------------------------------------------------------------------
3862// XZY軸回転角を取得
3864//---------------------------------------------------------------------------
3865GX_FORCE_INLINE GxVector3 GxMatrix44::getRotateXZY(void) const
3866{
3867 // TODO:
3868 GxVector3 vector;
3869 if( _m[0][1] < 1.0f )
3870 {
3871 if( _m[0][1] > -1.0f )
3872 {
3873 vector._x = -GxMath::getATan2(_m[2][1], _m[1][1]);
3874 vector._z = -GxMath::getASin(-_m[0][1]);
3875 vector._y = -GxMath::getATan2(_m[0][2], _m[0][0]);
3876 }
3877 else
3878 {
3879 vector._x = -GxMath::getATan2(_m[2][0], _m[2][2]);
3880 vector._z = -PI * 0.5f;
3881 vector._y = 0.0f;
3882 }
3883 }
3884 else
3885 {
3886 vector._x = -GxMath::getATan2(-_m[2][0], _m[2][2]);
3887 vector._z = PI * 0.5f;
3888 vector._y = 0.0f;
3889 }
3890 return vector;
3891}
3892
3893//---------------------------------------------------------------------------
3894// YXZ軸回転角を取得
3896//---------------------------------------------------------------------------
3897GX_FORCE_INLINE GxVector3 GxMatrix44::getRotateYXZ(void) const
3898{
3899 // TODO:
3900 GxVector3 vector;
3901 if( _m[1][2] < 1.0f )
3902 {
3903 if( _m[1][2] > -1.0f )
3904 {
3905 vector._y = -GxMath::getATan2(_m[0][2], _m[2][2]);
3906 vector._x = -GxMath::getASin(-_m[1][2]);
3907 vector._z = -GxMath::getATan2(_m[1][0], _m[1][1]);
3908 }
3909 else
3910 {
3911 vector._y = -GxMath::getATan2(_m[0][1], _m[0][0]);
3912 vector._x = -PI * 0.5f;
3913 vector._z = 0.0f;
3914 }
3915 }
3916 else
3917 {
3918 vector._y = -GxMath::getATan2(-_m[0][1], _m[0][0]);
3919 vector._x = PI * 0.5f;
3920 vector._z = 0.0f;
3921 }
3922 return vector;
3923}
3924
3925//---------------------------------------------------------------------------
3926// YZX軸回転角を取得
3928//---------------------------------------------------------------------------
3929GX_FORCE_INLINE GxVector3 GxMatrix44::getRotateYZX(void) const
3930{
3931 // TODO:
3932 GxVector3 vector;
3933 if( _m[1][0] < 1.0f )
3934 {
3935 if( _m[1][0] > -1.0f )
3936 {
3937 vector._y = -GxMath::getATan2(-_m[2][0], _m[0][0]);
3938 vector._z = -GxMath::getASin(_m[1][0]);
3939 vector._x = -GxMath::getATan2(-_m[1][2], _m[1][1]);
3940 }
3941 else
3942 {
3943 vector._y = GxMath::getATan2(_m[2][1], _m[2][2]);
3944 vector._z = PI * 0.5f;
3945 vector._x = 0.0f;
3946 }
3947 }
3948 else
3949 {
3950 vector._y = -GxMath::getATan2(_m[2][1], _m[2][2]);
3951 vector._z = -PI * 0.5f;
3952 vector._x = 0.0f;
3953 }
3954 return vector;
3955}
3956
3957//---------------------------------------------------------------------------
3958// ZXY軸回転角を取得
3960//---------------------------------------------------------------------------
3961GX_FORCE_INLINE GxVector3 GxMatrix44::getRotateZXY(void) const
3962{
3963 // TODO:
3964 GxVector3 vector;
3965 if( _m[2][1] < 1.0f )
3966 {
3967 if( _m[2][1] > -1.0f )
3968 {
3969 vector._z = -GxMath::getATan2(-_m[0][1], _m[1][1]);
3970 vector._x = -GxMath::getASin(_m[2][1]);
3971 vector._y = -GxMath::getATan2(-_m[2][0], _m[2][2]);
3972 }
3973 else
3974 {
3975 vector._z = GxMath::getATan2(_m[2][0], _m[0][0]);
3976 vector._x = PI * 0.5f;
3977 vector._y = 0.0f;
3978 }
3979 }
3980 else
3981 {
3982 vector._z = -GxMath::getATan2(_m[0][2], _m[0][0]);
3983 vector._x = -PI * 0.5f;
3984 vector._y = 0.0f;
3985 }
3986
3987 return vector;
3988}
3989
3990//---------------------------------------------------------------------------
3991// ZYX軸回転角を取得
3993//---------------------------------------------------------------------------
3994GX_FORCE_INLINE GxVector3 GxMatrix44::getRotateZYX(void) const
3995{
3996 // TODO:
3997 GxVector3 vector;
3998 if( _m[2][0] < 1.0f )
3999 {
4000 if( _m[2][0] > -1.0f )
4001 {
4002 vector._z = -GxMath::getATan2(_m[1][0], _m[0][0]);
4003 vector._y = -GxMath::getASin(-_m[2][0]);
4004 vector._x = -GxMath::getATan2(_m[2][1], _m[2][2]);
4005 }
4006 else
4007 {
4008 vector._z = GxMath::getATan2(_m[0][1], _m[0][2]);
4009 vector._y = -PI * 0.5f;
4010 vector._x = 0.0f;
4011 }
4012 }
4013 else
4014 {
4015 vector._z = -GxMath::getATan2(-_m[0][1], -_m[0][2]);
4016 vector._y = PI * 0.5f;
4017 vector._x = 0.0f;
4018 }
4019
4020 return vector;
4021}
4022
4023//---------------------------------------------------------------------------
4024// 平行移動行列を設定
4025//
4027//---------------------------------------------------------------------------
4028GX_FORCE_INLINE void GxMatrix44::setTranslate(const GxVector3& vector)
4029{
4030 _m[0][0] = 1.0f;
4031 _m[0][1] = 0.0f;
4032 _m[0][2] = 0.0f;
4033 _m[0][3] = 0.0f;
4034
4035 _m[1][0] = 0.0f;
4036 _m[1][1] = 1.0f;
4037 _m[1][2] = 0.0f;
4038 _m[1][3] = 0.0f;
4039
4040 _m[2][0] = 0.0f;
4041 _m[2][1] = 0.0f;
4042 _m[2][2] = 1.0f;
4043 _m[2][3] = 0.0f;
4044
4045 _m[3][0] = vector._x;
4046 _m[3][1] = vector._y;
4047 _m[3][2] = vector._z;
4048 _m[3][3] = 1.0f;
4049}
4050
4051//---------------------------------------------------------------------------
4052// 平行移動行列を設定
4053//
4057//---------------------------------------------------------------------------
4058GX_FORCE_INLINE void GxMatrix44::setTranslate(f32 x, f32 y, f32 z)
4059{
4060 _m[0][0] = 1.0f;
4061 _m[0][1] = 0.0f;
4062 _m[0][2] = 0.0f;
4063 _m[0][3] = 0.0f;
4064
4065 _m[1][0] = 0.0f;
4066 _m[1][1] = 1.0f;
4067 _m[1][2] = 0.0f;
4068 _m[1][3] = 0.0f;
4069
4070 _m[2][0] = 0.0f;
4071 _m[2][1] = 0.0f;
4072 _m[2][2] = 1.0f;
4073 _m[2][3] = 0.0f;
4074
4075 _m[3][0] = x;
4076 _m[3][1] = y;
4077 _m[3][2] = z;
4078 _m[3][3] = 1.0f;
4079}
4080
4081//---------------------------------------------------------------------------
4082// 平行移動量のみを設定
4083//
4085//---------------------------------------------------------------------------
4086GX_FORCE_INLINE void GxMatrix44::setPosition(const GxVector3& position)
4087{
4088 _m[3][0] = position._x;
4089 _m[3][1] = position._y;
4090 _m[3][2] = position._z;
4091 _m[3][3] = 1.0f;
4092}
4093
4094//---------------------------------------------------------------------------
4095// 平行移動量のみを設定
4096//
4101GX_FORCE_INLINE void GxMatrix44::setPosition(f32 x, f32 y, f32 z)
4102{
4103 _m[3][0] = x;
4104 _m[3][1] = y;
4105 _m[3][2] = z;
4106 _m[3][3] = 1.0f;
4107}
4108
4109//---------------------------------------------------------------------------
4110// スケール行列を設定
4111//
4113//---------------------------------------------------------------------------
4114GX_FORCE_INLINE void GxMatrix44::setScale(const GxVector3& vector)
4115{
4116 _m[0][0] = vector._x;
4117 _m[0][1] = 0.0f;
4118 _m[0][2] = 0.0f;
4119 _m[0][3] = 0.0f;
4120
4121 _m[1][0] = 0.0f;
4122 _m[1][1] = vector._y;
4123 _m[1][2] = 0.0f;
4124 _m[1][3] = 0.0f;
4125
4126 _m[2][0] = 0.0f;
4127 _m[2][1] = 0.0f;
4128 _m[2][2] = vector._z;
4129 _m[2][3] = 0.0f;
4130
4131 _m[3][0] = 0.0f;
4132 _m[3][1] = 0.0f;
4133 _m[3][2] = 0.0f;
4134 _m[3][3] = 1.0f;
4135}
4136
4137//---------------------------------------------------------------------------
4138// スケール行列を設定
4139//
4143//---------------------------------------------------------------------------
4144GX_FORCE_INLINE void GxMatrix44::setScale(f32 x, f32 y, f32 z)
4145{
4146 _m[0][0] = x;
4147 _m[0][1] = 0.0f;
4148 _m[0][2] = 0.0f;
4149 _m[0][3] = 0.0f;
4150
4151 _m[1][0] = 0.0f;
4152 _m[1][1] = y;
4153 _m[1][2] = 0.0f;
4154 _m[1][3] = 0.0f;
4155
4156 _m[2][0] = 0.0f;
4157 _m[2][1] = 0.0f;
4158 _m[2][2] = z;
4159 _m[2][3] = 0.0f;
4160
4161 _m[3][0] = 0.0f;
4162 _m[3][1] = 0.0f;
4163 _m[3][2] = 0.0f;
4164 _m[3][3] = 1.0f;
4165}
4166
4167//---------------------------------------------------------------------------
4168// 回転行列を設定
4169//
4172//---------------------------------------------------------------------------
4173GX_FORCE_INLINE void GxMatrix44::setRotateAxis(const GxVector3& vector, f32 radian)
4174{
4175 auto sinValue = GxMath::getSin(radian);
4176 auto cosValue = GxMath::getCos(radian);
4177
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;
4181 _m[0][3] = 0.0f;
4182
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;
4186 _m[1][3] = 0.0f;
4187
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);
4191 _m[2][3] = 0.0f;
4192
4193 _m[3][0] = 0.0f;
4194 _m[3][1] = 0.0f;
4195 _m[3][2] = 0.0f;
4196 _m[3][3] = 1.0f;
4197}
4198
4199//---------------------------------------------------------------------------
4200// 回転行列を設定
4201//
4203//---------------------------------------------------------------------------
4204GX_INLINE void GxMatrix44::setRotate(const GxQuaternion& quaternion)
4205{
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);
4209 _m[0][3] = 0.0f;
4210
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);
4214 _m[1][3] = 0.0f;
4215
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);
4219 _m[2][3] = 0.0f;
4220
4221 _m[3][0] = 0.0f;
4222 _m[3][1] = 0.0f;
4223 _m[3][2] = 0.0f;
4224 _m[3][3] = 1.0f;
4225}
4226
4227//---------------------------------------------------------------------------
4228// 行を取得
4231//---------------------------------------------------------------------------
4232const GxVector4& GxMatrix44::getRow(u32 row) const
4233{
4234 GX_ASSERT(row < 4, "指定された行数が大きすぎます(%d)", row);
4235 return *reinterpret_cast<const GxVector4*>(&_m[row][0]);
4236}
4237
4238//---------------------------------------------------------------------------
4239// 行を設定
4242//---------------------------------------------------------------------------
4243void GxMatrix44::setRow(u32 row, const GxVector4& vector)
4244{
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;
4250}
4251
4252//---------------------------------------------------------------------------
4253// 列を取得
4256//---------------------------------------------------------------------------
4258{
4259 GX_ASSERT(column < 4, "指定された列数が大きすぎます(%d)", column);
4260 return GxVector4(_m[0][column], _m[1][column], _m[2][column], _m[3][column]);
4261}
4262
4263//---------------------------------------------------------------------------
4264// 列を設定
4265//
4268//---------------------------------------------------------------------------
4269void GxMatrix44::setColumn(u32 column, const GxVector4& vector)
4270{
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;
4276}
4277
4278//---------------------------------------------------------------------------
4279// 値を取得
4283//---------------------------------------------------------------------------
4284f32 GxMatrix44::getValue(u32 row, u32 column) const
4285{
4286 GX_ASSERT(row < 4, "指定された行数が大きすぎます(%d)", row);
4287 GX_ASSERT(column < 4, "指定された列数が大きすぎます(%d)", column);
4288 return _m[row][column];
4289}
4290
4291//---------------------------------------------------------------------------
4292// 値を設定
4293//
4297//---------------------------------------------------------------------------
4298void GxMatrix44::setValue(u32 row, u32 column, f32 value)
4299{
4300 GX_ASSERT(row < 4, "指定された行数が大きすぎます(%d)", row);
4301 GX_ASSERT(column < 4, "指定された列数が大きすぎます(%d)", column);
4302 _m[row][column] = value;
4303}
4304
4305//---------------------------------------------------------------------------
4306// 参照を取得
4310//---------------------------------------------------------------------------
4311f32& GxMatrix44::getReference(u32 row, u32 column)
4312{
4313 GX_ASSERT(row < 4, "指定された行数が大きすぎます(%d)", row);
4314 GX_ASSERT(column < 4, "指定された列数が大きすぎます(%d)", column);
4315 return _m[row][column];
4316}
4317
4318//---------------------------------------------------------------------------
4319// 参照を取得
4323//---------------------------------------------------------------------------
4324const f32& GxMatrix44::getReference(u32 row, u32 column) const
4325{
4326 GX_ASSERT(row < 4, "指定された行数が大きすぎます(%d)", row);
4327 GX_ASSERT(column < 4, "指定された列数が大きすぎます(%d)", column);
4328 return _m[row][column];
4329}
4330
4331//---------------------------------------------------------------------------
4332// 行列式の値を取得
4334//---------------------------------------------------------------------------
4335GX_FORCE_INLINE f32 GxMatrix44::getDeterminant(void) const
4336{
4337 return _m[0][0] * GxMatrix33(_m[1][1], _m[1][2], _m[1][3], _m[2][1], _m[2][2], _m[2][3], _m[3][1], _m[3][2], _m[3][3]).getDeterminant()
4338 - _m[0][1] * GxMatrix33(_m[1][0], _m[1][2], _m[1][3], _m[2][0], _m[2][2], _m[2][3], _m[3][0], _m[3][2], _m[3][3]).getDeterminant()
4339 + _m[0][2] * GxMatrix33(_m[1][0], _m[1][1], _m[1][3], _m[2][0], _m[2][1], _m[2][3], _m[3][0], _m[3][1], _m[3][3]).getDeterminant()
4340 - _m[0][3] * GxMatrix33(_m[1][0], _m[1][1], _m[1][2], _m[2][0], _m[2][1], _m[2][2], _m[3][0], _m[3][1], _m[3][2]).getDeterminant();
4341}
4342
4343//---------------------------------------------------------------------------
4344// 逆行列を取得
4346//---------------------------------------------------------------------------
4347GX_FORCE_INLINE GxMatrix44 GxMatrix44::getInverse(void) const
4348{
4349 GxMatrix44 result; // empty constructor
4350 return GxMatrix44::getInverse(result, *this);
4351}
4352
4353//---------------------------------------------------------------------------
4354// 転置行列を取得
4356//---------------------------------------------------------------------------
4357GX_FORCE_INLINE GxMatrix44 GxMatrix44::getTranspose(void) const
4358{
4359 return GxMatrix44( _m[0][0], _m[1][0], _m[2][0], _m[3][0],
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]);
4363}
4364
4365//---------------------------------------------------------------------------
4366// 位置以外の各軸を正規化したものを取得
4368//---------------------------------------------------------------------------
4369GX_FORCE_INLINE GxMatrix44 GxMatrix44::getNormalizeAxes(void) const
4370{
4371 GxMatrix44 matrix(getPosition());
4372
4373 GxVector3 x(GxVector3(_m[0][0], _m[0][1], _m[0][2]).getNormalizeEx());
4374 GxVector3 y(GxVector3(_m[1][0], _m[1][1], _m[1][2]).getNormalizeEx());
4375 GxVector3 z(GxVector3(_m[2][0], _m[2][1], _m[2][2]).getNormalizeEx());
4376
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;
4381
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;
4386
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;
4391
4392 return matrix;
4393}
4394
4395//---------------------------------------------------------------------------
4396// スカラ乗算を取得
4401//---------------------------------------------------------------------------
4402GX_FORCE_INLINE const GxMatrix44& GxMatrix44::getMulScalar(GxMatrix44& dst, const GxMatrix44& matrix, f32 scalar)
4403{
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;
4408
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;
4413
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;
4418
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;
4423
4424 return dst;
4425}
4426
4427//---------------------------------------------------------------------------
4428// スカラ除算を取得
4433//---------------------------------------------------------------------------
4434GX_FORCE_INLINE const GxMatrix44& GxMatrix44::getDivScalar(GxMatrix44& dst, const GxMatrix44& matrix, f32 scalar)
4435{
4436 auto inverseScalar = 1.0f / scalar;
4437
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;
4442
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;
4447
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;
4452
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;
4457
4458 return dst;
4459}
4460
4461//---------------------------------------------------------------------------
4462// 行列加算を取得
4467//---------------------------------------------------------------------------
4468GX_FORCE_INLINE const GxMatrix44& GxMatrix44::getAddMatrix(GxMatrix44& dst, const GxMatrix44& matrix0, const GxMatrix44& matrix1)
4469{
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];
4474
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];
4479
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];
4484
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];
4489
4490 return dst;
4491}
4492
4493//---------------------------------------------------------------------------
4494// 行列乗算を取得
4499//---------------------------------------------------------------------------
4500GX_FORCE_INLINE const GxMatrix44& GxMatrix44::getMulMatrix(GxMatrix44& dst, const GxMatrix44& matrix0, const GxMatrix44& matrix1)
4501{
4502#if defined(GX_USE_SSE2)
4503 for(s32 i=0; i < 4; ++i)
4504 {
4505 __m128 curRow = matrix0._r[i];
4506
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));
4511
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]);
4516
4517 dst._r[i] = _mm_add_ps(_mm_add_ps(mx,my), _mm_add_ps(mz,mw));
4518 }
4519#else //GX_USE_SSE2
4520 // 入力と出力が同じ行列だった場合を考慮して、一時変数で計算する
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];
4525
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];
4530
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];
4535
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];
4540
4541 dst._m[0][0] = m00;
4542 dst._m[0][1] = m01;
4543 dst._m[0][2] = m02;
4544 dst._m[0][3] = m03;
4545
4546 dst._m[1][0] = m10;
4547 dst._m[1][1] = m11;
4548 dst._m[1][2] = m12;
4549 dst._m[1][3] = m13;
4550
4551 dst._m[2][0] = m20;
4552 dst._m[2][1] = m21;
4553 dst._m[2][2] = m22;
4554 dst._m[2][3] = m23;
4555
4556 dst._m[3][0] = m30;
4557 dst._m[3][1] = m31;
4558 dst._m[3][2] = m32;
4559 dst._m[3][3] = m33;
4560#endif // !GX_USE_SSE2
4561 return dst;
4562}
4563
4564//---------------------------------------------------------------------------
4565// 逆行列を取得
4569//---------------------------------------------------------------------------
4570GX_FORCE_INLINE const GxMatrix44& GxMatrix44::getInverse(GxMatrix44& dst, const GxMatrix44& matrix)
4571{
4572 const auto m00 = GxMatrix33(matrix._m[1][1], matrix._m[1][2], matrix._m[1][3], matrix._m[2][1], matrix._m[2][2], matrix._m[2][3], matrix._m[3][1], matrix._m[3][2], matrix._m[3][3]).getDeterminant();
4573 const auto m01 = -GxMatrix33(matrix._m[0][1], matrix._m[0][2], matrix._m[0][3], matrix._m[2][1], matrix._m[2][2], matrix._m[2][3], matrix._m[3][1], matrix._m[3][2], matrix._m[3][3]).getDeterminant();
4574 const auto m02 = GxMatrix33(matrix._m[0][1], matrix._m[0][2], matrix._m[0][3], matrix._m[1][1], matrix._m[1][2], matrix._m[1][3], matrix._m[3][1], matrix._m[3][2], matrix._m[3][3]).getDeterminant();
4575 const auto m03 = -GxMatrix33(matrix._m[0][1], matrix._m[0][2], matrix._m[0][3], matrix._m[1][1], matrix._m[1][2], matrix._m[1][3], matrix._m[2][1], matrix._m[2][2], matrix._m[2][3]).getDeterminant();
4576
4577 const auto m10 = -GxMatrix33(matrix._m[1][0], matrix._m[1][2], matrix._m[1][3], matrix._m[2][0], matrix._m[2][2], matrix._m[2][3], matrix._m[3][0], matrix._m[3][2], matrix._m[3][3]).getDeterminant();
4578 const auto m11 = GxMatrix33(matrix._m[0][0], matrix._m[0][2], matrix._m[0][3], matrix._m[2][0], matrix._m[2][2], matrix._m[2][3], matrix._m[3][0], matrix._m[3][2], matrix._m[3][3]).getDeterminant();
4579 const auto m12 = -GxMatrix33(matrix._m[0][0], matrix._m[0][2], matrix._m[0][3], matrix._m[1][0], matrix._m[1][2], matrix._m[1][3], matrix._m[3][0], matrix._m[3][2], matrix._m[3][3]).getDeterminant();
4580 const auto m13 = GxMatrix33(matrix._m[0][0], matrix._m[0][2], matrix._m[0][3], matrix._m[1][0], matrix._m[1][2], matrix._m[1][3], matrix._m[2][0], matrix._m[2][2], matrix._m[2][3]).getDeterminant();
4581
4582 const auto m20 = GxMatrix33(matrix._m[1][0], matrix._m[1][1], matrix._m[1][3], matrix._m[2][0], matrix._m[2][1], matrix._m[2][3], matrix._m[3][0], matrix._m[3][1], matrix._m[3][3]).getDeterminant();
4583 const auto m21 = -GxMatrix33(matrix._m[0][0], matrix._m[0][1], matrix._m[0][3], matrix._m[2][0], matrix._m[2][1], matrix._m[2][3], matrix._m[3][0], matrix._m[3][1], matrix._m[3][3]).getDeterminant();
4584 const auto m22 = GxMatrix33(matrix._m[0][0], matrix._m[0][1], matrix._m[0][3], matrix._m[1][0], matrix._m[1][1], matrix._m[1][3], matrix._m[3][0], matrix._m[3][1], matrix._m[3][3]).getDeterminant();
4585 const auto m23 = -GxMatrix33(matrix._m[0][0], matrix._m[0][1], matrix._m[0][3], matrix._m[1][0], matrix._m[1][1], matrix._m[1][3], matrix._m[2][0], matrix._m[2][1], matrix._m[2][3]).getDeterminant();
4586
4587 const auto m30 = -GxMatrix33(matrix._m[1][0], matrix._m[1][1], matrix._m[1][2], matrix._m[2][0], matrix._m[2][1], matrix._m[2][2], matrix._m[3][0], matrix._m[3][1], matrix._m[3][2]).getDeterminant();
4588 const auto m31 = GxMatrix33(matrix._m[0][0], matrix._m[0][1], matrix._m[0][2], matrix._m[2][0], matrix._m[2][1], matrix._m[2][2], matrix._m[3][0], matrix._m[3][1], matrix._m[3][2]).getDeterminant();
4589 const auto m32 = -GxMatrix33(matrix._m[0][0], matrix._m[0][1], matrix._m[0][2], matrix._m[1][0], matrix._m[1][1], matrix._m[1][2], matrix._m[3][0], matrix._m[3][1], matrix._m[3][2]).getDeterminant();
4590 const auto m33 = GxMatrix33(matrix._m[0][0], matrix._m[0][1], matrix._m[0][2], matrix._m[1][0], matrix._m[1][1], matrix._m[1][2], matrix._m[2][0], matrix._m[2][1], matrix._m[2][2]).getDeterminant();
4591
4592 const auto d = 1.0f / matrix.getDeterminant();
4593
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;
4598
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;
4603
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;
4608
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;
4613
4614 return dst;
4615}
4616
4617//---------------------------------------------------------------------------
4618// 転置行列を取得
4622//---------------------------------------------------------------------------
4623GX_FORCE_INLINE const GxMatrix44& GxMatrix44::getTranspose(GxMatrix44& dst, const GxMatrix44& matrix)
4624{
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];
4629
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];
4634
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];
4639
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];
4644
4645 dst._m[0][0] = m00;
4646 dst._m[0][1] = m01;
4647 dst._m[0][2] = m02;
4648 dst._m[0][3] = m03;
4649
4650 dst._m[1][0] = m10;
4651 dst._m[1][1] = m11;
4652 dst._m[1][2] = m12;
4653 dst._m[1][3] = m13;
4654
4655 dst._m[2][0] = m20;
4656 dst._m[2][1] = m21;
4657 dst._m[2][2] = m22;
4658 dst._m[2][3] = m23;
4659
4660 dst._m[3][0] = m30;
4661 dst._m[3][1] = m31;
4662 dst._m[3][2] = m32;
4663 dst._m[3][3] = m33;
4664
4665 return dst;
4666}
4667
4668//---------------------------------------------------------------------------
4669// スカラ乗算
4672//---------------------------------------------------------------------------
4673GX_FORCE_INLINE const GxMatrix44& GxMatrix44::mulScalar(f32 scalar)
4674{
4675 _m[0][0] *= scalar;
4676 _m[0][1] *= scalar;
4677 _m[0][2] *= scalar;
4678 _m[0][3] *= scalar;
4679
4680 _m[1][0] *= scalar;
4681 _m[1][1] *= scalar;
4682 _m[1][2] *= scalar;
4683 _m[1][3] *= scalar;
4684
4685 _m[2][0] *= scalar;
4686 _m[2][1] *= scalar;
4687 _m[2][2] *= scalar;
4688 _m[2][3] *= scalar;
4689
4690 _m[3][0] *= scalar;
4691 _m[3][1] *= scalar;
4692 _m[3][2] *= scalar;
4693 _m[3][3] *= scalar;
4694
4695 return *this;
4696}
4697
4698//---------------------------------------------------------------------------
4699// スカラ除算
4702//---------------------------------------------------------------------------
4703GX_FORCE_INLINE const GxMatrix44& GxMatrix44::divScalar(f32 scalar)
4704{
4705 auto inverseScalar = 1.0f / scalar;
4706
4707 _m[0][0] *= inverseScalar;
4708 _m[0][1] *= inverseScalar;
4709 _m[0][2] *= inverseScalar;
4710 _m[0][3] *= inverseScalar;
4711
4712 _m[1][0] *= inverseScalar;
4713 _m[1][1] *= inverseScalar;
4714 _m[1][2] *= inverseScalar;
4715 _m[1][3] *= inverseScalar;
4716
4717 _m[2][0] *= inverseScalar;
4718 _m[2][1] *= inverseScalar;
4719 _m[2][2] *= inverseScalar;
4720 _m[2][3] *= inverseScalar;
4721
4722 _m[3][0] *= inverseScalar;
4723 _m[3][1] *= inverseScalar;
4724 _m[3][2] *= inverseScalar;
4725 _m[3][3] *= inverseScalar;
4726
4727 return *this;
4728}
4729
4730//---------------------------------------------------------------------------
4731// 行列加算
4734//---------------------------------------------------------------------------
4735GX_FORCE_INLINE const GxMatrix44& GxMatrix44::addMatrix(const GxMatrix44& matrix)
4736{
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];
4741
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];
4746
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];
4751
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];
4756
4757 return *this;
4758}
4759
4760//---------------------------------------------------------------------------
4761// 行列乗算
4764//---------------------------------------------------------------------------
4765GX_FORCE_INLINE const GxMatrix44& GxMatrix44::mulMatrix(const GxMatrix44& matrix)
4766{
4767 getMulMatrix( *this, *this, matrix );
4768 return *this;
4769}
4770
4771//---------------------------------------------------------------------------
4772// X軸回転乗算
4775//---------------------------------------------------------------------------
4776GX_FORCE_INLINE const GxMatrix44& GxMatrix44::mulRotateX(f32 radian)
4777{
4778 GxMatrix44 matrix;
4779 matrix.setRotateX(radian);
4780 mulMatrix(matrix);
4781
4782 return *this;
4783}
4784
4785//---------------------------------------------------------------------------
4786// Y軸回転乗算
4789//---------------------------------------------------------------------------
4790GX_FORCE_INLINE const GxMatrix44& GxMatrix44::mulRotateY(f32 radian)
4791{
4792 GxMatrix44 matrix;
4793 matrix.setRotateY(radian);
4794 mulMatrix(matrix);
4795
4796 return *this;
4797}
4798
4799//---------------------------------------------------------------------------
4800// Z軸回転乗算
4803//---------------------------------------------------------------------------
4804GX_FORCE_INLINE const GxMatrix44& GxMatrix44::mulRotateZ(f32 radian)
4805{
4806 GxMatrix44 matrix;
4807 matrix.setRotateZ(radian);
4808 mulMatrix(matrix);
4809
4810 return *this;
4811}
4812
4813//---------------------------------------------------------------------------
4814// クォータニオンによる回転乗算(前から乗算)
4817//---------------------------------------------------------------------------
4818GX_FORCE_INLINE const GxMatrix44& GxMatrix44::mulQuaternionFront(const GxQuaternion& quaternion)
4819{
4820 GxMatrix44 matrix(quaternion);
4821 getMulMatrix(*this, matrix, *this);
4822
4823 return *this;
4824}
4825
4826//---------------------------------------------------------------------------
4827// クォータニオンによる回転乗算(後ろから乗算)
4830//---------------------------------------------------------------------------
4831GX_FORCE_INLINE const GxMatrix44& GxMatrix44::mulQuaternionBack(const GxQuaternion& quaternion)
4832{
4833#if GX_MATRIX_SAFE_MODE
4834 GxMatrix44 matrix(quaternion);
4835 mulMatrix(matrix);
4836#else //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);
4840
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);
4844
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);
4848
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;
4852
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;
4856
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;
4860
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;
4864
4865 _m[0][0] = m00;
4866 _m[0][1] = m01;
4867 _m[0][2] = m02;
4868
4869 _m[1][0] = m10;
4870 _m[1][1] = m11;
4871 _m[1][2] = m12;
4872
4873 _m[2][0] = m20;
4874 _m[2][1] = m21;
4875 _m[2][2] = m22;
4876
4877 _m[3][0] = m30;
4878 _m[3][1] = m31;
4879 _m[3][2] = m32;
4880#endif // !GX_MATRIX_SAFE_MODE
4881
4882 return *this;
4883}
4884
4885//---------------------------------------------------------------------------
4886// 平行移動乗算
4889//---------------------------------------------------------------------------
4890GX_FORCE_INLINE const GxMatrix44& GxMatrix44::mulTranslate(const GxVector3& vector)
4891{
4892#if GX_MATRIX_SAFE_MODE
4893 GxMatrix44 matrix;
4894 matrix.setTranslate(vector);
4895 mulMatrix(matrix);
4896#else //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;
4900
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;
4904
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;
4908
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;
4912#endif // !GX_MATRIX_SAFE_MODE
4913
4914 return *this;
4915}
4916
4917//---------------------------------------------------------------------------
4918// 平行移動乗算
4923//---------------------------------------------------------------------------
4924GX_FORCE_INLINE const GxMatrix44& GxMatrix44::mulTranslate(f32 x, f32 y, f32 z)
4925{
4926#if GX_MATRIX_SAFE_MODE
4927 GxMatrix44 matrix;
4928 matrix.setTranslate(x, y, z);
4929 mulMatrix(matrix);
4930#else //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;
4934
4935 _m[1][0] += _m[1][3] * x;
4936 _m[1][1] += _m[1][3] * y;
4937 _m[1][2] += _m[1][3] * z;
4938
4939 _m[2][0] += _m[2][3] * x;
4940 _m[2][1] += _m[2][3] * y;
4941 _m[2][2] += _m[2][3] * z;
4942
4943 _m[3][0] += _m[3][3] * x;
4944 _m[3][1] += _m[3][3] * y;
4945 _m[3][2] += _m[3][3] * z;
4946#endif // !GX_MATRIX_SAFE_MODE
4947
4948 return *this;
4949}
4950
4951//---------------------------------------------------------------------------
4952// スケール乗算
4955//---------------------------------------------------------------------------
4956GX_FORCE_INLINE const GxMatrix44& GxMatrix44::mulScale(const GxVector3& vector)
4957{
4958#if GX_MATRIX_SAFE_MODE
4959 GxMatrix44 matrix;
4960 matrix.setScale(vector);
4961 mulMatrix(matrix);
4962#else //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;
4966
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;
4970
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;
4974
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;
4978#endif // !GX_MATRIX_SAFE_MODE
4979
4980 return *this;
4981}
4982
4983//---------------------------------------------------------------------------
4984// スケール乗算
4989//---------------------------------------------------------------------------
4990GX_FORCE_INLINE const GxMatrix44& GxMatrix44::mulScale(f32 x, f32 y, f32 z)
4991{
4992#if GX_MATRIX_SAFE_MODE
4993 GxMatrix44 matrix;
4994 matrix.setScale(x, y, z);
4995 mulMatrix(matrix);
4996#else //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;
5000
5001 _m[1][0] = _m[1][0] * x;
5002 _m[1][1] = _m[1][1] * y;
5003 _m[1][2] = _m[1][2] * z;
5004
5005 _m[2][0] = _m[2][0] * x;
5006 _m[2][1] = _m[2][1] * y;
5007 _m[2][2] = _m[2][2] * z;
5008
5009 _m[3][0] = _m[3][0] * x;
5010 _m[3][1] = _m[3][1] * y;
5011 _m[3][2] = _m[3][2] * z;
5012#endif // !GX_MATRIX_SAFE_MODE
5013
5014 return *this;
5015}
5016
5017//---------------------------------------------------------------------------
5018// 逆行列にする
5020//---------------------------------------------------------------------------
5021GX_FORCE_INLINE const GxMatrix44& GxMatrix44::inverse(void)
5022{
5023 const auto m00 = GxMatrix33(_m[1][1], _m[1][2], _m[1][3], _m[2][1], _m[2][2], _m[2][3], _m[3][1], _m[3][2], _m[3][3]).getDeterminant();
5024 const auto m01 = -GxMatrix33(_m[0][1], _m[0][2], _m[0][3], _m[2][1], _m[2][2], _m[2][3], _m[3][1], _m[3][2], _m[3][3]).getDeterminant();
5025 const auto m02 = GxMatrix33(_m[0][1], _m[0][2], _m[0][3], _m[1][1], _m[1][2], _m[1][3], _m[3][1], _m[3][2], _m[3][3]).getDeterminant();
5026 const auto m03 = -GxMatrix33(_m[0][1], _m[0][2], _m[0][3], _m[1][1], _m[1][2], _m[1][3], _m[2][1], _m[2][2], _m[2][3]).getDeterminant();
5027
5028 const auto m10 = -GxMatrix33(_m[1][0], _m[1][2], _m[1][3], _m[2][0], _m[2][2], _m[2][3], _m[3][0], _m[3][2], _m[3][3]).getDeterminant();
5029 const auto m11 = GxMatrix33(_m[0][0], _m[0][2], _m[0][3], _m[2][0], _m[2][2], _m[2][3], _m[3][0], _m[3][2], _m[3][3]).getDeterminant();
5030 const auto m12 = -GxMatrix33(_m[0][0], _m[0][2], _m[0][3], _m[1][0], _m[1][2], _m[1][3], _m[3][0], _m[3][2], _m[3][3]).getDeterminant();
5031 const auto m13 = GxMatrix33(_m[0][0], _m[0][2], _m[0][3], _m[1][0], _m[1][2], _m[1][3], _m[2][0], _m[2][2], _m[2][3]).getDeterminant();
5032
5033 const auto m20 = GxMatrix33(_m[1][0], _m[1][1], _m[1][3], _m[2][0], _m[2][1], _m[2][3], _m[3][0], _m[3][1], _m[3][3]).getDeterminant();
5034 const auto m21 = -GxMatrix33(_m[0][0], _m[0][1], _m[0][3], _m[2][0], _m[2][1], _m[2][3], _m[3][0], _m[3][1], _m[3][3]).getDeterminant();
5035 const auto m22 = GxMatrix33(_m[0][0], _m[0][1], _m[0][3], _m[1][0], _m[1][1], _m[1][3], _m[3][0], _m[3][1], _m[3][3]).getDeterminant();
5036 const auto m23 = -GxMatrix33(_m[0][0], _m[0][1], _m[0][3], _m[1][0], _m[1][1], _m[1][3], _m[2][0], _m[2][1], _m[2][3]).getDeterminant();
5037
5038 const auto m30 = -GxMatrix33(_m[1][0], _m[1][1], _m[1][2], _m[2][0], _m[2][1], _m[2][2], _m[3][0], _m[3][1], _m[3][2]).getDeterminant();
5039 const auto m31 = GxMatrix33(_m[0][0], _m[0][1], _m[0][2], _m[2][0], _m[2][1], _m[2][2], _m[3][0], _m[3][1], _m[3][2]).getDeterminant();
5040 const auto m32 = -GxMatrix33(_m[0][0], _m[0][1], _m[0][2], _m[1][0], _m[1][1], _m[1][2], _m[3][0], _m[3][1], _m[3][2]).getDeterminant();
5041 const auto m33 = GxMatrix33(_m[0][0], _m[0][1], _m[0][2], _m[1][0], _m[1][1], _m[1][2], _m[2][0], _m[2][1], _m[2][2]).getDeterminant();
5042
5043 const auto d = 1.0f / getDeterminant();
5044
5045 _m[0][0] = m00 * d;
5046 _m[0][1] = m01 * d;
5047 _m[0][2] = m02 * d;
5048 _m[0][3] = m03 * d;
5049
5050 _m[1][0] = m10 * d;
5051 _m[1][1] = m11 * d;
5052 _m[1][2] = m12 * d;
5053 _m[1][3] = m13 * d;
5054
5055 _m[2][0] = m20 * d;
5056 _m[2][1] = m21 * d;
5057 _m[2][2] = m22 * d;
5058 _m[2][3] = m23 * d;
5059
5060 _m[3][0] = m30 * d;
5061 _m[3][1] = m31 * d;
5062 _m[3][2] = m32 * d;
5063 _m[3][3] = m33 * d;
5064
5065 return *this;
5066}
5067
5068//---------------------------------------------------------------------------
5069// 転置する
5071//---------------------------------------------------------------------------
5072GX_FORCE_INLINE const GxMatrix44& GxMatrix44::transpose(void)
5073{
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];
5078
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];
5083
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];
5088
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];
5093
5094 _m[0][0] = m00;
5095 _m[0][1] = m01;
5096 _m[0][2] = m02;
5097 _m[0][3] = m03;
5098
5099 _m[1][0] = m10;
5100 _m[1][1] = m11;
5101 _m[1][2] = m12;
5102 _m[1][3] = m13;
5103
5104 _m[2][0] = m20;
5105 _m[2][1] = m21;
5106 _m[2][2] = m22;
5107 _m[2][3] = m23;
5108
5109 _m[3][0] = m30;
5110 _m[3][1] = m31;
5111 _m[3][2] = m32;
5112 _m[3][3] = m33;
5113
5114 return *this;
5115}
5116
5117//---------------------------------------------------------------------------
5118// 0を設定
5119//---------------------------------------------------------------------------
5120GX_FORCE_INLINE void GxMatrix44::setZero(void)
5121{
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();
5127#else //GX_USE_SSE2
5128 for( u32 c = 0; c < 4; c++ )
5129 {
5130 _m[c][0] = 0.0f;
5131 _m[c][1] = 0.0f;
5132 _m[c][2] = 0.0f;
5133 _m[c][3] = 0.0f;
5134 }
5135#endif // !GX_USE_SSE2
5136}
5137
5138//===========================================================================
5139// GxMatrixAffineGpu
5140//===========================================================================
5141//---------------------------------------------------------------------------
5142// コンストラクタ
5144//---------------------------------------------------------------------------
5146{
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];
5151
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];
5156
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];
5161}
5162
5163//---------------------------------------------------------------------------
5164// コンストラクタ
5165//---------------------------------------------------------------------------
5166GX_INLINE GxMatrixAffineGpu::GxMatrixAffineGpu( f32 m00, f32 m01, f32 m02, f32 m03,
5167 f32 m10, f32 m11, f32 m12, f32 m13,
5168 f32 m20, f32 m21, f32 m22, f32 m23)
5169{
5170 _m[0][0] = m00;
5171 _m[0][1] = m01;
5172 _m[0][2] = m02;
5173 _m[0][3] = m03;
5174
5175 _m[1][0] = m10;
5176 _m[1][1] = m11;
5177 _m[1][2] = m12;
5178 _m[1][3] = m13;
5179
5180 _m[2][0] = m20;
5181 _m[2][1] = m21;
5182 _m[2][2] = m22;
5183 _m[2][3] = m23;
5184}
5185
5186//---------------------------------------------------------------------------
5187// コピーコンストラクタ
5189//---------------------------------------------------------------------------
5191{
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];
5196
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];
5201
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];
5206}
5207
5208//===========================================================================
5209// GxMatrix44Gpu
5210//===========================================================================
5211//---------------------------------------------------------------------------
5212// コンストラクタ
5214//---------------------------------------------------------------------------
5216{
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];
5221
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];
5226
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];
5231
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];
5236}
5237
5238//---------------------------------------------------------------------------
5239// コンストラクタ
5240//---------------------------------------------------------------------------
5241GX_INLINE GxMatrix44Gpu::GxMatrix44Gpu( f32 m00, f32 m01, f32 m02, f32 m03,
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)
5245{
5246 _m[0][0] = m00;
5247 _m[0][1] = m01;
5248 _m[0][2] = m02;
5249 _m[0][3] = m03;
5250
5251 _m[1][0] = m10;
5252 _m[1][1] = m11;
5253 _m[1][2] = m12;
5254 _m[1][3] = m13;
5255
5256 _m[2][0] = m20;
5257 _m[2][1] = m21;
5258 _m[2][2] = m22;
5259 _m[2][3] = m23;
5260
5261 _m[3][0] = m30;
5262 _m[3][1] = m31;
5263 _m[3][2] = m32;
5264 _m[3][3] = m33;
5265}
5266
5267//---------------------------------------------------------------------------
5268// コピーコンストラクタ
5270//---------------------------------------------------------------------------
5272{
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];
5277
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];
5282
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];
5287
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];
5292}
5293
5294GX_CORE_NAMESPACE_END()
INIT
初期化タイプ
Definition GxMath.h:53
@ ZERO
全て 0 で初期化
@ NONE
何もしない
@ IDENTITY
基礎値で初期化
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