OROCHI
 
Loading...
Searching...
No Matches
GxVector.inl
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11
12GX_CORE_NAMESPACE_BEGIN()
13
14#define GX_VECTOR_ZERO_VECTOR_CHECK_VALUE F32_ABS_MIN // ゼロベクトルをチェックする定数
15
16//===========================================================================
17// GxVector2
18//===========================================================================
19//---------------------------------------------------------------------------
20// コンストラクタ
23//---------------------------------------------------------------------------
24GX_FORCE_INLINE GxVector2::GxVector2(f32 x, f32 y)
25: _x(x)
26, _y(y)
27{
28}
29
30//---------------------------------------------------------------------------
31// コンストラクタ
33//---------------------------------------------------------------------------
34GX_FORCE_INLINE GxVector2::GxVector2(const GxFloat2& float2)
35: _x(float2._x)
36, _y(float2._y)
37{
38}
39
40//---------------------------------------------------------------------------
41// コンストラクタ
43//---------------------------------------------------------------------------
44GX_FORCE_INLINE GxVector2::GxVector2(const f32* pFloatArray)
45: _x(pFloatArray[0])
46, _y(pFloatArray[1])
47{
48}
49
50//---------------------------------------------------------------------------
51// コンストラクタ
53//---------------------------------------------------------------------------
54GX_FORCE_INLINE GxVector2::GxVector2(const GxPoint2& point)
55: _x(static_cast<f32>(point._x))
56, _y(static_cast<f32>(point._y))
57{
58}
59
60//---------------------------------------------------------------------------
61// コピーコンストラクタ
63//---------------------------------------------------------------------------
64GX_FORCE_INLINE GxVector2::GxVector2(const GxVector2& vector)
65: _x(vector._x)
66, _y(vector._y)
67{
68}
69
70//---------------------------------------------------------------------------
71// 代入
74//---------------------------------------------------------------------------
75GX_FORCE_INLINE GxVector2& GxVector2::operator = (const GxVector2& vector)
76{
77 _x = vector._x;
78 _y = vector._y;
79 return *this;
80}
81
82//---------------------------------------------------------------------------
83// スカラ加算代入
86//---------------------------------------------------------------------------
87GX_FORCE_INLINE GxVector2& GxVector2::operator += (f32 scalar)
88{
89 addScalar(scalar);
90 return *this;
91}
92
93//---------------------------------------------------------------------------
94// スカラ減算代入
97//---------------------------------------------------------------------------
98GX_FORCE_INLINE GxVector2& GxVector2::operator -= (f32 scalar)
99{
100 subScalar(scalar);
101 return *this;
102}
103
104//---------------------------------------------------------------------------
105// スカラ乗算代入
108//---------------------------------------------------------------------------
109GX_FORCE_INLINE GxVector2& GxVector2::operator *= (f32 scalar)
110{
111 mulScalar(scalar);
112 return *this;
113}
114
115//---------------------------------------------------------------------------
116// スカラ除算代入
119//---------------------------------------------------------------------------
120GX_FORCE_INLINE GxVector2& GxVector2::operator /= (f32 scalar)
121{
122 divScalar(scalar);
123 return *this;
124}
125
126//---------------------------------------------------------------------------
127// ベクトル加算代入
130//---------------------------------------------------------------------------
131GX_FORCE_INLINE GxVector2& GxVector2::operator += (const GxVector2& vector)
132{
133 addVector(vector);
134 return *this;
135}
136
137//---------------------------------------------------------------------------
138// ベクトル減算代入
141//---------------------------------------------------------------------------
142GX_FORCE_INLINE GxVector2& GxVector2::operator -= (const GxVector2& vector)
143{
144 subVector(vector);
145 return *this;
146}
147
148//---------------------------------------------------------------------------
149// ベクトル乗算代入
152//---------------------------------------------------------------------------
153GX_FORCE_INLINE GxVector2& GxVector2::operator *= (const GxVector2& vector)
154{
155 mulVector(vector);
156 return *this;
157}
158
159//---------------------------------------------------------------------------
160// ベクトル除算代入
163//---------------------------------------------------------------------------
164GX_FORCE_INLINE GxVector2& GxVector2::operator /= (const GxVector2& vector)
165{
166 divVector(vector);
167 return *this;
168}
169
170//---------------------------------------------------------------------------
171// スカラ加算
175//---------------------------------------------------------------------------
176GX_FORCE_INLINE const GxVector2 operator + (const GxVector2& vector, f32 scalar)
177{
178 GxVector2 result;
179 return GxVector2::getAddScalar(result, vector, scalar);
180}
181
182//---------------------------------------------------------------------------
183// スカラ減算
187//---------------------------------------------------------------------------
188GX_FORCE_INLINE const GxVector2 operator - (const GxVector2& vector, f32 scalar)
189{
190 GxVector2 result;
191 return GxVector2::getSubScalar(result, vector, scalar);
192}
193
194//---------------------------------------------------------------------------
195// スカラ乗算
199//---------------------------------------------------------------------------
200GX_FORCE_INLINE const GxVector2 operator * (const GxVector2& vector, f32 scalar)
201{
202 GxVector2 result;
203 return GxVector2::getMulScalar(result, vector, scalar);
204}
205
206//---------------------------------------------------------------------------
207// スカラ乗算
211//---------------------------------------------------------------------------
212GX_FORCE_INLINE const GxVector2 operator * (f32 scalar, const GxVector2& vector)
213{
214 GxVector2 result;
215 return GxVector2::getMulScalar(result, vector, scalar);
216}
217
218//---------------------------------------------------------------------------
219// スカラ除算
223//---------------------------------------------------------------------------
224GX_FORCE_INLINE const GxVector2 operator / (const GxVector2& vector, f32 scalar)
225{
226 GxVector2 result;
227 return GxVector2::getDivScalar(result, vector, scalar);
228}
229
230//---------------------------------------------------------------------------
231// ベクトル加算
235//---------------------------------------------------------------------------
236GX_FORCE_INLINE const GxVector2 operator + (const GxVector2& vector0, const GxVector2& vector1)
237{
238 GxVector2 result;
239 return GxVector2::getAddVector(result, vector0, vector1);
240}
241
242//---------------------------------------------------------------------------
243// ベクトル減算
247//---------------------------------------------------------------------------
248GX_FORCE_INLINE const GxVector2 operator - (const GxVector2& vector0, const GxVector2& vector1)
249{
250 GxVector2 result;
251 return GxVector2::getSubVector(result, vector0, vector1);
252}
253
254//---------------------------------------------------------------------------
255// ベクトル乗算
259//---------------------------------------------------------------------------
260GX_FORCE_INLINE const GxVector2 operator * (const GxVector2& vector0, const GxVector2& vector1)
261{
262 GxVector2 result;
263 return GxVector2::getMulVector(result, vector0, vector1);
264}
265
266//---------------------------------------------------------------------------
267// ベクトル除算
271//---------------------------------------------------------------------------
272GX_FORCE_INLINE const GxVector2 operator / (const GxVector2& vector0, const GxVector2& vector1)
273{
274 GxVector2 result;
275 return GxVector2::getDivVector(result, vector0, vector1);
276}
277
278//---------------------------------------------------------------------------
279// 一致
283//---------------------------------------------------------------------------
284GX_FORCE_INLINE b32 operator == (const GxVector2& vector0, const GxVector2& vector1)
285{
286 return (vector0._x == vector1._x) && (vector0._y == vector1._y);
287}
288
289//---------------------------------------------------------------------------
290// 不一致
294//---------------------------------------------------------------------------
295GX_FORCE_INLINE b32 operator != (const GxVector2& vector0, const GxVector2& vector1)
296{
297 return (vector0._x != vector1._x) || (vector0._y != vector1._y);
298}
299
300//---------------------------------------------------------------------------
301// const配列
304//---------------------------------------------------------------------------
305GX_FORCE_INLINE const f32& GxVector2::operator[](u32 i) const
306{
307 return (&_x)[i];
308}
309
310//---------------------------------------------------------------------------
311// 配列
314//---------------------------------------------------------------------------
315GX_FORCE_INLINE f32& GxVector2::operator[](u32 i)
316{
317 return (&_x)[i];
318}
319
320//---------------------------------------------------------------------------
321// ゼロベクトル判定
323//---------------------------------------------------------------------------
324GX_FORCE_INLINE b32 GxVector2::isZeroVector(void) const
325{
326 return (getLengthSquare() <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE);
327}
328
329//---------------------------------------------------------------------------
330// 長さを取得
332//---------------------------------------------------------------------------
333GX_FORCE_INLINE f32 GxVector2::getLength(void) const
334{
336}
337
338//---------------------------------------------------------------------------
339// 長さの2乗を取得
341//---------------------------------------------------------------------------
342GX_FORCE_INLINE f32 GxVector2::getLengthSquare(void) const
343{
344 return _x * _x + _y * _y;
345}
346
347//---------------------------------------------------------------------------
348// 長さを設定
350//---------------------------------------------------------------------------
351GX_FORCE_INLINE void GxVector2::setLength(f32 length)
352{
353 auto oldLength = getLength();
354
355#if GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
356 GX_ERROR(GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < oldLength * oldLength, "ゼロベクトルに長さを設定しようとしました");
357
358 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
359 if (oldLength * oldLength <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE)
360 {
361 oldLength = 1.0f;
362 }
363#else //GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
364 if( oldLength * oldLength <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
365 {
366 GX_TRACE(GX_TRACE_CATEGORY_CORE, "%s(%d)", __FILE__, __LINE__);
367 GX_TRACE(GX_TRACE_CATEGORY_CORE, "[%s]", __FUNCTION__);
368 GX_TRACE(GX_TRACE_CATEGORY_CORE, "ゼロベクトルに長さを設定しようとしました");
369
370 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
371 oldLength = 1.0f;
372 }
373#endif // !GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
374
375 const auto scale = length / oldLength;
376
377 _x *= scale;
378 _y *= scale;
379}
380
381//---------------------------------------------------------------------------
382// 長さを設定(長さ0に対応)
383//
385//---------------------------------------------------------------------------
386GX_FORCE_INLINE void GxVector2::setLengthEx(f32 length)
387{
388 const auto lengthSquare = getLengthSquare();
389
390 if( GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < lengthSquare )
391 {
392 const auto scale = length / GxMath::getSqrt(lengthSquare);
393
394 _x *= scale;
395 _y *= scale;
396 }
397 else
398 {
399 _x = 0.0f;
400 _y = 0.0f;
401 }
402}
403
404//---------------------------------------------------------------------------
405// 正規化ベクトルを取得
407//---------------------------------------------------------------------------
408GX_FORCE_INLINE GxVector2 GxVector2::getNormalize(void) const
409{
410 auto length = getLength();
411
412#if GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
413 GX_ERROR(GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < length * length, "ゼロベクトルを正規化しようとしました");
414
415 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
416 if (length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE)
417 {
418 length = 1.0f;
419 }
420#else //GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
421 if( length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
422 {
423 GX_TRACE(GX_TRACE_CATEGORY_CORE, "%s(%d)", __FILE__, __LINE__);
424 GX_TRACE(GX_TRACE_CATEGORY_CORE, "[%s]", __FUNCTION__);
425 GX_TRACE(GX_TRACE_CATEGORY_CORE, "ゼロベクトルを正規化しようとしました");
426
427 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
428 length = 1.0f;
429 }
430#endif // !GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
431
432 const auto inverseLength = 1.0f / length;
433
434 return GxVector2(_x * inverseLength, _y * inverseLength);
435}
436
437//---------------------------------------------------------------------------
438// 正規化ベクトルを取得(長さ0に対応)
440//---------------------------------------------------------------------------
441GX_FORCE_INLINE GxVector2 GxVector2::getNormalizeEx(void) const
442{
443 const auto lengthSquare = getLengthSquare();
444
445 if( GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < lengthSquare )
446 {
447 const auto inverseLength = 1.0f / GxMath::getSqrt(lengthSquare);
448
449 return GxVector2(_x * inverseLength, _y * inverseLength);
450 }
451 else
452 {
453 return GxVector2::ZERO;
454 }
455}
456
457//---------------------------------------------------------------------------
458// スカラ加算を取得
463//---------------------------------------------------------------------------
464GX_FORCE_INLINE const GxVector2& GxVector2::getAddScalar(GxVector2& dst, const GxVector2& vector, f32 scalar)
465{
466 dst._x = vector._x + scalar;
467 dst._y = vector._y + scalar;
468
469 return dst;
470}
471
472//---------------------------------------------------------------------------
473// スカラ減算を取得
478//---------------------------------------------------------------------------
479GX_FORCE_INLINE const GxVector2& GxVector2::getSubScalar(GxVector2& dst, const GxVector2& vector, f32 scalar)
480{
481 dst._x = vector._x - scalar;
482 dst._y = vector._y - scalar;
483
484 return dst;
485}
486
487//---------------------------------------------------------------------------
488// スカラ乗算を取得
493//---------------------------------------------------------------------------
494GX_FORCE_INLINE const GxVector2& GxVector2::getMulScalar(GxVector2& dst, const GxVector2& vector, f32 scalar)
495{
496 dst._x = vector._x * scalar;
497 dst._y = vector._y * scalar;
498
499 return dst;
500}
501
502//---------------------------------------------------------------------------
503// スカラ除算を取得
508//---------------------------------------------------------------------------
509GX_FORCE_INLINE const GxVector2& GxVector2::getDivScalar(GxVector2& dst, const GxVector2& vector, f32 scalar)
510{
511 auto inverseLength = 1.0f / scalar;
512
513 dst._x = vector._x * inverseLength;
514 dst._y = vector._y * inverseLength;
515
516 return dst;
517}
518
519//---------------------------------------------------------------------------
520// ベクトル加算を取得
525//---------------------------------------------------------------------------
526GX_FORCE_INLINE const GxVector2& GxVector2::getAddVector(GxVector2& dst, const GxVector2& vector0, const GxVector2& vector1)
527{
528 dst._x = vector0._x + vector1._x;
529 dst._y = vector0._y + vector1._y;
530
531 return dst;
532}
533
534//---------------------------------------------------------------------------
535// ベクトル減算を取得
540//---------------------------------------------------------------------------
541GX_FORCE_INLINE const GxVector2& GxVector2::getSubVector(GxVector2& dst, const GxVector2& vector0, const GxVector2& vector1)
542{
543 dst._x = vector0._x - vector1._x;
544 dst._y = vector0._y - vector1._y;
545
546 return dst;
547}
548
549//---------------------------------------------------------------------------
550// ベクトル乗算を取得
555//---------------------------------------------------------------------------
556GX_FORCE_INLINE const GxVector2& GxVector2::getMulVector(GxVector2& dst, const GxVector2& vector0, const GxVector2& vector1)
557{
558 dst._x = vector0._x * vector1._x;
559 dst._y = vector0._y * vector1._y;
560
561 return dst;
562}
563
564//---------------------------------------------------------------------------
565// ベクトル除算を取得
570//---------------------------------------------------------------------------
571GX_FORCE_INLINE const GxVector2& GxVector2::getDivVector(GxVector2& dst, const GxVector2& vector0, const GxVector2& vector1)
572{
573 dst._x = vector0._x / vector1._x;
574 dst._y = vector0._y / vector1._y;
575
576 return dst;
577}
578
579//---------------------------------------------------------------------------
580// 正規化ベクトルを取得
584//---------------------------------------------------------------------------
585GX_FORCE_INLINE const GxVector2& GxVector2::getNormalize(GxVector2& dst, const GxVector2& vector)
586{
587 auto length = vector.getLength();
588
589#if GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
590 GX_ERROR(GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < length* length, "ゼロベクトルを正規化しようとしました");
591
592 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
593 if (length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE)
594 {
595 length = 1.0f;
596 }
597#else //GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
598 if( length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
599 {
600 GX_TRACE(GX_TRACE_CATEGORY_CORE, "%s(%d)", __FILE__, __LINE__);
601 GX_TRACE(GX_TRACE_CATEGORY_CORE, "[%s]", __FUNCTION__);
602 GX_TRACE(GX_TRACE_CATEGORY_CORE, "ゼロベクトルを正規化しようとしました");
603
604 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
605 length = 1.0f;
606 }
607#endif // !GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
608
609 const auto inverseLength = 1.0f / length;
610
611 dst._x = vector._x * inverseLength;
612 dst._y = vector._y * inverseLength;
613
614 return dst;
615}
616
617//---------------------------------------------------------------------------
618// 正規化ベクトルを取得(長さ0に対応)
622//---------------------------------------------------------------------------
623GX_FORCE_INLINE const GxVector2& GxVector2::getNormalizeEx(GxVector2& dst, const GxVector2& vector)
624{
625 const auto lengthSquare = vector.getLengthSquare();
626
627 if( GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < lengthSquare )
628 {
629 const auto inverseLength = 1.0f / GxMath::getSqrt(lengthSquare);
630
631 dst._x = vector._x * inverseLength;
632 dst._y = vector._y * inverseLength;
633 }
634 else
635 {
636 dst._x = 0.0f;
637 dst._y = 0.0f;
638 }
639
640 return dst;
641}
642
643//---------------------------------------------------------------------------
644// 内積を取得
648//---------------------------------------------------------------------------
649GX_FORCE_INLINE f32 GxVector2::getDot(const GxVector2& vector0, const GxVector2& vector1)
650{
651 return vector0._x * vector1._x + vector0._y * vector1._y;
652}
653
654//---------------------------------------------------------------------------
655// 外積を取得
659//---------------------------------------------------------------------------
660GX_FORCE_INLINE f32 GxVector2::getCross(const GxVector2& vector0, const GxVector2& vector1)
661{
662 return vector0._x * vector1._y - vector0._y * vector1._x;
663}
664
665//---------------------------------------------------------------------------
666// 角度差を取得(符号つき radian)
671//---------------------------------------------------------------------------
672GX_FORCE_INLINE f32 GxVector2::getAngle(const GxVector2& vector0, const GxVector2& vector1)
673{
674 if( vector0.isZeroVector() || vector0.isZeroVector() )
675 {
676 return 0.0f;
677 }
678
679 const auto cosTheta = GxVector2::getDot(vector0, vector1);
680 const auto sinTheta = GxVector2::getCross(vector0, vector1);
681
682 return GxMath::getATan2(sinTheta, cosTheta);
683}
684
685//---------------------------------------------------------------------------
686// 要素毎に最小値を選択
690//---------------------------------------------------------------------------
691GX_FORCE_INLINE GxVector2 GxVector2::getMinimum(const GxVector2& vector0, const GxVector2& vector1)
692{
693 return GxVector2(vector0._x < vector1._x ? vector0._x : vector1._x,
694 vector0._y < vector1._y ? vector0._y : vector1._y);
695}
696
697//---------------------------------------------------------------------------
698// 要素毎に最小値を選択
703//---------------------------------------------------------------------------
704GX_FORCE_INLINE const GxVector2& GxVector2::getMinimum(GxVector2& dst, const GxVector2& vector0, const GxVector2& vector1)
705{
706 dst._x = vector0._x < vector1._x ? vector0._x : vector1._x;
707 dst._y = vector0._y < vector1._y ? vector0._y : vector1._y;
708
709 return dst;
710}
711
712//---------------------------------------------------------------------------
713// 要素毎に最大値を選択
717//---------------------------------------------------------------------------
718GX_FORCE_INLINE GxVector2 GxVector2::getMaximum(const GxVector2& vector0, const GxVector2& vector1)
719{
720 return GxVector2(vector0._x > vector1._x ? vector0._x : vector1._x,
721 vector0._y > vector1._y ? vector0._y : vector1._y);
722}
723
724//---------------------------------------------------------------------------
725// 要素毎に最大値を選択
730//---------------------------------------------------------------------------
731GX_FORCE_INLINE const GxVector2& GxVector2::getMaximum(GxVector2& dst, const GxVector2& vector0, const GxVector2& vector1)
732{
733 dst._x = vector0._x > vector1._x ? vector0._x : vector1._x;
734 dst._y = vector0._y > vector1._y ? vector0._y : vector1._y;
735
736 return dst;
737}
738
739//---------------------------------------------------------------------------
740// 線形補間
745//---------------------------------------------------------------------------
746GX_FORCE_INLINE GxVector2 GxVector2::getLerp(const GxVector2& vector0, const GxVector2& vector1, f32 t)
747{
748 return GxVector2(vector0._x + (vector1._x - vector0._x) * t,
749 vector0._y + (vector1._y - vector0._y) * t);
750}
751
752//---------------------------------------------------------------------------
753// 線形補間
759//---------------------------------------------------------------------------
760GX_FORCE_INLINE const GxVector2& GxVector2::getLerp(GxVector2& dst, const GxVector2& vector0, const GxVector2& vector1, f32 t)
761{
762 dst._x = vector0._x + (vector1._x - vector0._x) * t;
763 dst._y = vector0._y + (vector1._y - vector0._y) * t;
764
765 return dst;
766}
767
768//---------------------------------------------------------------------------
769// スカラ加算
772//---------------------------------------------------------------------------
773GX_FORCE_INLINE const GxVector2& GxVector2::addScalar(f32 scalar)
774{
775 _x += scalar;
776 _y += scalar;
777
778 return *this;
779}
780
781//---------------------------------------------------------------------------
782// スカラ減算
785//---------------------------------------------------------------------------
786GX_FORCE_INLINE const GxVector2& GxVector2::subScalar(f32 scalar)
787{
788 _x -= scalar;
789 _y -= scalar;
790
791 return *this;
792}
793
794//---------------------------------------------------------------------------
795// スカラ乗算
798//---------------------------------------------------------------------------
799GX_FORCE_INLINE const GxVector2& GxVector2::mulScalar(f32 scalar)
800{
801 _x *= scalar;
802 _y *= scalar;
803
804 return *this;
805}
806
807//---------------------------------------------------------------------------
808// スカラ除算
811//---------------------------------------------------------------------------
812GX_FORCE_INLINE const GxVector2& GxVector2::divScalar(f32 scalar)
813{
814 auto inverseScalar = 1.0f / scalar;
815
816 _x *= inverseScalar;
817 _y *= inverseScalar;
818
819 return *this;
820}
821
822//---------------------------------------------------------------------------
823// ベクトル加算
826//---------------------------------------------------------------------------
827GX_FORCE_INLINE const GxVector2& GxVector2::addVector(const GxVector2& vector)
828{
829 _x += vector._x;
830 _y += vector._y;
831
832 return *this;
833}
834
835//---------------------------------------------------------------------------
836// ベクトル減算
839//---------------------------------------------------------------------------
840GX_FORCE_INLINE const GxVector2& GxVector2::subVector(const GxVector2& vector)
841{
842 _x -= vector._x;
843 _y -= vector._y;
844
845 return *this;
846}
847
848//---------------------------------------------------------------------------
849// ベクトル乗算
852//---------------------------------------------------------------------------
853GX_FORCE_INLINE const GxVector2& GxVector2::mulVector(const GxVector2& vector)
854{
855 _x *= vector._x;
856 _y *= vector._y;
857
858 return *this;
859}
860
861//---------------------------------------------------------------------------
862// ベクトル除算
865//---------------------------------------------------------------------------
866GX_FORCE_INLINE const GxVector2& GxVector2::divVector(const GxVector2& vector)
867{
868 _x /= vector._x;
869 _y /= vector._y;
870
871 return *this;
872}
873
874//---------------------------------------------------------------------------
875// 正規化する
877//---------------------------------------------------------------------------
878GX_FORCE_INLINE const GxVector2& GxVector2::normalize(void)
879{
880 auto length = getLength();
881
882#if GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
883 GX_ERROR(GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < length * length, "ゼロベクトルを正規化しようとしました");
884
885 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
886 if (length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE)
887 {
888 length = 1.0f;
889 }
890#else //GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
891 if( length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
892 {
893 GX_TRACE(GX_TRACE_CATEGORY_CORE, "%s(%d)", __FILE__, __LINE__);
894 GX_TRACE(GX_TRACE_CATEGORY_CORE, "[%s]", __FUNCTION__);
895 GX_TRACE(GX_TRACE_CATEGORY_CORE, "ゼロベクトルを正規化しようとしました");
896
897 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
898 length = 1.0f;
899 }
900#endif // !GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
901
902 const auto inverseLength = 1.0f / length;
903
904 _x *= inverseLength;
905 _y *= inverseLength;
906
907 return *this;
908}
909
910//---------------------------------------------------------------------------
911// 正規化する(長さ0に対応)
913//---------------------------------------------------------------------------
914GX_FORCE_INLINE const GxVector2& GxVector2::normalizeEx(void)
915{
916 const auto lengthSquare = getLengthSquare();
917
918 if( GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < lengthSquare )
919 {
920 const auto inverseLength = 1.0f / GxMath::getSqrt(lengthSquare);
921
922 _x *= inverseLength;
923 _y *= inverseLength;
924 }
925 else
926 {
927 _x = 0.0f;
928 _y = 0.0f;
929 }
930
931 return *this;
932}
933
934//===========================================================================
935// GxVector3
936//===========================================================================
937//---------------------------------------------------------------------------
938// コンストラクタ
942//---------------------------------------------------------------------------
943GX_FORCE_INLINE GxVector3::GxVector3(f32 x, f32 y, f32 z)
944: _x(x)
945, _y(y)
946, _z(z)
947{
948}
949
950//---------------------------------------------------------------------------
951// コンストラクタ
953//---------------------------------------------------------------------------
954GX_FORCE_INLINE GxVector3::GxVector3(const GxFloat3& float3)
955: _x(float3._x)
956, _y(float3._y)
957, _z(float3._z)
958{
959}
960
961//---------------------------------------------------------------------------
962// コンストラクタ
964//---------------------------------------------------------------------------
965GX_FORCE_INLINE GxVector3::GxVector3(const f32* pFloatArray)
966: _x(pFloatArray[0])
967, _y(pFloatArray[1])
968, _z(pFloatArray[2])
969{
970}
971
972//---------------------------------------------------------------------------
973// コンストラクタ
976//---------------------------------------------------------------------------
977GX_FORCE_INLINE GxVector3::GxVector3(const GxPoint2& point, f32 z)
978: _x(static_cast<f32>(point._x))
979, _y(static_cast<f32>(point._y))
980, _z(z)
981{
982}
983
984//---------------------------------------------------------------------------
985// コンストラクタ
988//---------------------------------------------------------------------------
989GX_FORCE_INLINE GxVector3::GxVector3(const GxVector2& vector, f32 z)
990: _x(vector._x)
991, _y(vector._y)
992, _z(z)
993{
994}
995
996//---------------------------------------------------------------------------
997// コンストラクタ
999//---------------------------------------------------------------------------
1000GX_FORCE_INLINE GxVector3::GxVector3(const GxVector4& vector)
1001: _x(vector._x)
1002, _y(vector._y)
1003, _z(vector._z)
1004{
1005}
1006
1007//---------------------------------------------------------------------------
1008// コピーコンストラクタ
1010//---------------------------------------------------------------------------
1011GX_FORCE_INLINE GxVector3::GxVector3(const GxVector3& vector)
1012: _x(vector._x)
1013, _y(vector._y)
1014, _z(vector._z)
1015{
1016}
1017
1018//---------------------------------------------------------------------------
1019// 代入
1022//---------------------------------------------------------------------------
1023GX_FORCE_INLINE GxVector3& GxVector3::operator = (const GxVector3& vector)
1024{
1025 _x = vector._x;
1026 _y = vector._y;
1027 _z = vector._z;
1028 return *this;
1029}
1030
1031//---------------------------------------------------------------------------
1032// スカラ加算代入
1035//---------------------------------------------------------------------------
1036GX_FORCE_INLINE GxVector3& GxVector3::operator += (f32 scalar)
1037{
1038 addScalar(scalar);
1039 return *this;
1040}
1041
1042//---------------------------------------------------------------------------
1043// スカラ減算代入
1046//---------------------------------------------------------------------------
1047GX_FORCE_INLINE GxVector3& GxVector3::operator -= (f32 scalar)
1048{
1049 subScalar(scalar);
1050 return *this;
1051}
1052
1053//---------------------------------------------------------------------------
1054// スカラ乗算代入
1057//---------------------------------------------------------------------------
1058GX_FORCE_INLINE GxVector3& GxVector3::operator *= (f32 scalar)
1059{
1060 mulScalar(scalar);
1061 return *this;
1062}
1063
1064//---------------------------------------------------------------------------
1065// スカラ除算代入
1068//---------------------------------------------------------------------------
1069GX_FORCE_INLINE GxVector3& GxVector3::operator /= (f32 scalar)
1070{
1071 divScalar(scalar);
1072 return *this;
1073}
1074
1075//---------------------------------------------------------------------------
1076// ベクトル加算代入
1079//---------------------------------------------------------------------------
1080GX_FORCE_INLINE GxVector3& GxVector3::operator += (const GxVector3& vector)
1081{
1082 addVector(vector);
1083 return *this;
1084}
1085
1086//---------------------------------------------------------------------------
1087// ベクトル減算代入
1090//---------------------------------------------------------------------------
1091GX_FORCE_INLINE GxVector3& GxVector3::operator -= (const GxVector3& vector)
1092{
1093 subVector(vector);
1094 return *this;
1095}
1096
1097//---------------------------------------------------------------------------
1098// ベクトル乗算代入
1101//---------------------------------------------------------------------------
1102GX_FORCE_INLINE GxVector3& GxVector3::operator *= (const GxVector3& vector)
1103{
1104 mulVector(vector);
1105 return *this;
1106}
1107
1108//---------------------------------------------------------------------------
1109// ベクトル除算代入
1112//---------------------------------------------------------------------------
1113GX_FORCE_INLINE GxVector3& GxVector3::operator /= (const GxVector3& vector)
1114{
1115 divVector(vector);
1116 return *this;
1117}
1118
1119//---------------------------------------------------------------------------
1120// スカラ加算
1124//---------------------------------------------------------------------------
1125GX_FORCE_INLINE const GxVector3 operator + (const GxVector3& vector, f32 scalar)
1126{
1127 GxVector3 result;
1128 return GxVector3::getAddScalar(result, vector, scalar);
1129}
1130
1131//---------------------------------------------------------------------------
1132// スカラ減算
1136//---------------------------------------------------------------------------
1137GX_FORCE_INLINE const GxVector3 operator - (const GxVector3& vector, f32 scalar)
1138{
1139 GxVector3 result;
1140 return GxVector3::getSubScalar(result, vector, scalar);
1141}
1142
1143//---------------------------------------------------------------------------
1144// スカラ乗算
1148//---------------------------------------------------------------------------
1149GX_INLINE const GxVector3 operator * (const GxVector3& vector, f32 scalar)
1150{
1151 GxVector3 result;
1152 return GxVector3::getMulScalar(result, vector, scalar);
1153}
1154
1155//---------------------------------------------------------------------------
1156// スカラ乗算
1160//---------------------------------------------------------------------------
1161GX_FORCE_INLINE const GxVector3 operator * (f32 scalar, const GxVector3& vector)
1162{
1163 GxVector3 result;
1164 return GxVector3::getMulScalar(result, vector, scalar);
1165}
1166
1167//---------------------------------------------------------------------------
1168// スカラ除算
1172//---------------------------------------------------------------------------
1173GX_FORCE_INLINE const GxVector3 operator / (const GxVector3& vector, f32 scalar)
1174{
1175 GxVector3 result;
1176 return GxVector3::getDivScalar(result, vector, scalar);
1177}
1178
1179//---------------------------------------------------------------------------
1180// ベクトル加算
1184//---------------------------------------------------------------------------
1185GX_FORCE_INLINE const GxVector3 operator + (const GxVector3& vector0, const GxVector3& vector1)
1186{
1187 GxVector3 result;
1188 return GxVector3::getAddVector(result, vector0, vector1);
1189}
1190
1191//---------------------------------------------------------------------------
1192// ベクトル減算
1196//---------------------------------------------------------------------------
1197GX_FORCE_INLINE const GxVector3 operator - (const GxVector3& vector0, const GxVector3& vector1)
1198{
1199 GxVector3 result;
1200 return GxVector3::getSubVector(result, vector0, vector1);
1201}
1202
1203//---------------------------------------------------------------------------
1204// ベクトル乗算
1208//---------------------------------------------------------------------------
1209GX_FORCE_INLINE const GxVector3 operator * (const GxVector3& vector0, const GxVector3& vector1)
1210{
1211 GxVector3 result;
1212 return GxVector3::getMulVector(result, vector0, vector1);
1213}
1214
1215//---------------------------------------------------------------------------
1216// ベクトル除算
1220//---------------------------------------------------------------------------
1221GX_FORCE_INLINE const GxVector3 operator / (const GxVector3& vector0, const GxVector3& vector1)
1222{
1223 GxVector3 result;
1224 return GxVector3::getDivVector(result, vector0, vector1);
1225}
1226
1227//---------------------------------------------------------------------------
1228// 一致
1232//---------------------------------------------------------------------------
1233GX_FORCE_INLINE b32 operator == (const GxVector3& vector0, const GxVector3& vector1)
1234{
1235 return (vector0._x == vector1._x) && (vector0._y == vector1._y) && (vector0._z == vector1._z);
1236}
1237
1238//---------------------------------------------------------------------------
1239// 不一致
1243//---------------------------------------------------------------------------
1244GX_FORCE_INLINE b32 operator != (const GxVector3& vector0, const GxVector3& vector1)
1245{
1246 return (vector0._x != vector1._x) || (vector0._y != vector1._y) || (vector0._z != vector1._z);
1247}
1248
1249//---------------------------------------------------------------------------
1250// const配列
1253//---------------------------------------------------------------------------
1254GX_FORCE_INLINE const f32& GxVector3::operator[](u32 i) const
1255{
1256 return (&_x)[i];
1257}
1258
1259//---------------------------------------------------------------------------
1260// 配列
1263//---------------------------------------------------------------------------
1264GX_FORCE_INLINE f32& GxVector3::operator[](u32 i)
1265{
1266 return (&_x)[i];
1267}
1268
1269//---------------------------------------------------------------------------
1270// XY要素のベクトルを取得
1272//---------------------------------------------------------------------------
1273GX_FORCE_INLINE GxVector3 GxVector3::getXY(void) const
1274{
1275 return GxVector3(_x, _y, 0.0f);
1276}
1277
1278//---------------------------------------------------------------------------
1279// XY要素のベクトルを取得
1282//---------------------------------------------------------------------------
1283GX_FORCE_INLINE const GxVector3& GxVector3::getXY(GxVector3& dst) const
1284{
1285 dst._x = _x;
1286 dst._y = _y;
1287 dst._z = 0.0f;
1288
1289 return dst;
1290}
1291
1292//---------------------------------------------------------------------------
1293// XY要素のベクトルを設定
1294//
1296//---------------------------------------------------------------------------
1297GX_FORCE_INLINE void GxVector3::setXY(const GxVector3& vector)
1298{
1299 _x = vector._x;
1300 _y = vector._y;
1301}
1302
1303//---------------------------------------------------------------------------
1304// XZ要素のベクトルを取得
1306//---------------------------------------------------------------------------
1307GX_FORCE_INLINE GxVector3 GxVector3::getXZ(void) const
1308{
1309 return GxVector3(_x, 0.0f, _z);
1310}
1311
1312//---------------------------------------------------------------------------
1313// XZ要素のベクトルを取得
1316//---------------------------------------------------------------------------
1317GX_FORCE_INLINE const GxVector3& GxVector3::getXZ(GxVector3& dst) const
1318{
1319 dst._x = _x;
1320 dst._y = 0.0f;
1321 dst._z = _z;
1322
1323 return dst;
1324}
1325
1326//---------------------------------------------------------------------------
1327// XZ要素のベクトルを設定
1328//
1330//---------------------------------------------------------------------------
1331GX_FORCE_INLINE void GxVector3::setXZ(const GxVector3& vector)
1332{
1333 _x = vector._x;
1334 _z = vector._z;
1335}
1336
1337//---------------------------------------------------------------------------
1338// YZ要素のベクトルを取得
1340//---------------------------------------------------------------------------
1341GX_FORCE_INLINE GxVector3 GxVector3::getYZ(void) const
1342{
1343 return GxVector3(0.0f, _y, _z);
1344}
1345
1346//---------------------------------------------------------------------------
1347// YZ要素のベクトルを取得
1350//---------------------------------------------------------------------------
1351GX_FORCE_INLINE const GxVector3& GxVector3::getYZ(GxVector3& dst) const
1352{
1353 dst._x = 0.0f;
1354 dst._y = _y;
1355 dst._z = _z;
1356
1357 return dst;
1358}
1359
1360//---------------------------------------------------------------------------
1361// YZ要素のベクトルを設定
1363//---------------------------------------------------------------------------
1364GX_FORCE_INLINE void GxVector3::setYZ(const GxVector3& vector)
1365{
1366 _y = vector._y;
1367 _z = vector._z;
1368}
1369
1370//---------------------------------------------------------------------------
1371// ゼロベクトルか判定
1373//---------------------------------------------------------------------------
1374GX_FORCE_INLINE b32 GxVector3::isZeroVector(void) const
1375{
1376 return (getLengthSquare() <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE);
1377}
1378
1379//---------------------------------------------------------------------------
1380// 長さを取得
1382//---------------------------------------------------------------------------
1383GX_FORCE_INLINE f32 GxVector3::getLength(void) const
1384{
1386}
1387
1388//---------------------------------------------------------------------------
1389// 長さの2乗を取得
1391//---------------------------------------------------------------------------
1392GX_FORCE_INLINE f32 GxVector3::getLengthSquare(void) const
1393{
1394 return _x * _x + _y * _y + _z * _z;
1395}
1396
1397//---------------------------------------------------------------------------
1398// 長さを設定
1400//---------------------------------------------------------------------------
1401GX_FORCE_INLINE void GxVector3::setLength(f32 length)
1402{
1403 auto oldLength = getLength();
1404
1405#if GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
1406 GX_ERROR(GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < oldLength * oldLength, "ゼロベクトルに長さを設定しようとしました");
1407
1408 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
1409 if (oldLength * oldLength <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE)
1410 {
1411 oldLength = 1.0f;
1412 }
1413#else //GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
1414 if( oldLength * oldLength <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
1415 {
1416 GX_TRACE(GX_TRACE_CATEGORY_CORE, "%s(%d)", __FILE__, __LINE__);
1417 GX_TRACE(GX_TRACE_CATEGORY_CORE, "[%s]", __FUNCTION__);
1418 GX_TRACE(GX_TRACE_CATEGORY_CORE, "ゼロベクトルに長さを設定しようとしました");
1419
1420 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
1421 oldLength = 1.0f;
1422 }
1423#endif // !GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
1424
1425 const auto scale = length / oldLength;
1426
1427 _x *= scale;
1428 _y *= scale;
1429 _z *= scale;
1430}
1431
1432//---------------------------------------------------------------------------
1433// 長さを設定(長さ0に対応)
1434//
1436//---------------------------------------------------------------------------
1437GX_FORCE_INLINE void GxVector3::setLengthEx(f32 length)
1438{
1439 const auto lengthSquare = getLengthSquare();
1440
1441 if( GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < lengthSquare )
1442 {
1443 const auto scale = length / GxMath::getSqrt(lengthSquare);
1444
1445 _x *= scale;
1446 _y *= scale;
1447 _z *= scale;
1448 }
1449 else
1450 {
1451 _x = 0.0f;
1452 _y = 0.0f;
1453 _z = 0.0f;
1454 }
1455}
1456
1457//---------------------------------------------------------------------------
1458// 正規化ベクトルを取得
1460//---------------------------------------------------------------------------
1461GX_FORCE_INLINE GxVector3 GxVector3::getNormalize(void) const
1462{
1463 auto length = getLength();
1464
1465#if GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
1466 GX_ERROR(GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < length * length, "ゼロベクトルを正規化しようとしました");
1467
1468 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
1469 if( length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE ) length = 1.0f;
1470#else // GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
1471 if( length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
1472 {
1473 GX_TRACE(GX_TRACE_CATEGORY_CORE, "%s(%d)", __FILE__, __LINE__);
1474 GX_TRACE(GX_TRACE_CATEGORY_CORE, "[%s]", __FUNCTION__);
1475 GX_TRACE(GX_TRACE_CATEGORY_CORE, "ゼロベクトルを正規化しようとしました");
1476
1477 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
1478 length = 1.0f;
1479 }
1480#endif // !GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
1481
1482 const auto inverseLength = 1.0f / length;
1483
1484 return GxVector3(
1485 _x * inverseLength,
1486 _y * inverseLength,
1487 _z * inverseLength);
1488}
1489
1490//---------------------------------------------------------------------------
1491// 正規化ベクトルを取得(長さ0に対応)
1493//---------------------------------------------------------------------------
1494GX_FORCE_INLINE GxVector3 GxVector3::getNormalizeEx(void) const
1495{
1496 const auto lengthSquare = getLengthSquare();
1497
1498 if( GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < lengthSquare )
1499 {
1500 const auto inverseLength = 1.0f / GxMath::getSqrt(lengthSquare);
1501
1502 return GxVector3(
1503 _x * inverseLength,
1504 _y * inverseLength,
1505 _z * inverseLength);
1506 }
1507 else
1508 {
1509 return GxVector3(
1510 0.0f,
1511 0.0f,
1512 0.0f);
1513 }
1514}
1515
1516//---------------------------------------------------------------------------
1517// w=1.0として座標変換したベクトルを取得
1520//---------------------------------------------------------------------------
1521GX_FORCE_INLINE GxVector3 GxVector3::getTransform(const GxMatrix44& matrix) const
1522{
1523 return GxVector3(
1524 _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0] + matrix._m[3][0],
1525 _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1] + matrix._m[3][1],
1526 _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2] + matrix._m[3][2]);
1527}
1528
1529//---------------------------------------------------------------------------
1530// w=1.0として座標変換したベクトルを取得
1533//---------------------------------------------------------------------------
1534GX_FORCE_INLINE GxVector3 GxVector3::getTransform(const GxMatrixAffine& matrix) const
1535{
1536 return GxVector3(
1537 _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0] + matrix._m[3][0],
1538 _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1] + matrix._m[3][1],
1539 _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2] + matrix._m[3][2]);
1540}
1541
1542//---------------------------------------------------------------------------
1543// w=0.0として座標変換したベクトルを取得
1546//---------------------------------------------------------------------------
1547GX_FORCE_INLINE GxVector3 GxVector3::getTransformNormal(const GxMatrix44& matrix) const
1548{
1549 return GxVector3(
1550 _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0],
1551 _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1],
1552 _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2]);
1553}
1554
1555//---------------------------------------------------------------------------
1556// w=0.0として座標変換したベクトルを取得
1559//---------------------------------------------------------------------------
1560GX_FORCE_INLINE GxVector3 GxVector3::getTransformNormal(const GxMatrixAffine& matrix) const
1561{
1562 return GxVector3(
1563 _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0],
1564 _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1],
1565 _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2]);
1566}
1567
1568//---------------------------------------------------------------------------
1569// w=1.0として座標変換後、wで除算したベクトルを取得
1572//---------------------------------------------------------------------------
1573GX_FORCE_INLINE GxVector3 GxVector3::getTransformCoord(const GxMatrix44& matrix) const
1574{
1575 auto iw = 1.0f / (_x * matrix._m[0][3] + _y * matrix._m[1][3] + _z * matrix._m[2][3] + matrix._m[3][3]);
1576
1577 return GxVector3(
1578 (_x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0] + matrix._m[3][0]) * iw,
1579 (_x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1] + matrix._m[3][1]) * iw,
1580 (_x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2] + matrix._m[3][2]) * iw);
1581}
1582
1583//---------------------------------------------------------------------------
1584// w=1.0として座標変換したx成分を取得
1587//---------------------------------------------------------------------------
1588GX_FORCE_INLINE f32 GxVector3::getTransformX(const GxMatrix44& matrix) const
1589{
1590 return _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0] + matrix._m[3][0];
1591}
1592
1593//---------------------------------------------------------------------------
1594// w=1.0として座標変換したx成分を取得
1597//---------------------------------------------------------------------------
1598GX_FORCE_INLINE f32 GxVector3::getTransformX(const GxMatrixAffine& matrix) const
1599{
1600 return _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0] + matrix._m[3][0];
1601}
1602
1603//---------------------------------------------------------------------------
1604// w=0.0として座標変換したx成分を取得
1607//---------------------------------------------------------------------------
1608GX_FORCE_INLINE f32 GxVector3::getTransformNormalX(const GxMatrix44& matrix) const
1609{
1610 return _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0];
1611}
1612
1613//---------------------------------------------------------------------------
1614// w=0.0として座標変換したx成分を取得
1617//---------------------------------------------------------------------------
1618GX_FORCE_INLINE f32 GxVector3::getTransformNormalX(const GxMatrixAffine& matrix) const
1619{
1620 return _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0];
1621}
1622
1623//---------------------------------------------------------------------------
1624// w=1.0として座標変換後、wで除算したx成分を取得
1627//---------------------------------------------------------------------------
1628GX_FORCE_INLINE f32 GxVector3::getTransformCoordX(const GxMatrix44& matrix) const
1629{
1630 return (_x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0] + matrix._m[3][0])
1631 / (_x * matrix._m[0][3] + _y * matrix._m[1][3] + _z * matrix._m[2][3] + matrix._m[3][3]);
1632}
1633
1634//---------------------------------------------------------------------------
1635// w=1.0として座標変換したy成分を取得
1638//---------------------------------------------------------------------------
1639GX_FORCE_INLINE f32 GxVector3::getTransformY(const GxMatrix44& matrix) const
1640{
1641 return _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1] + matrix._m[3][1];
1642}
1643
1644//---------------------------------------------------------------------------
1645// w=1.0として座標変換したy成分を取得
1648//---------------------------------------------------------------------------
1649GX_FORCE_INLINE f32 GxVector3::getTransformY(const GxMatrixAffine& matrix) const
1650{
1651 return _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1] + matrix._m[3][1];
1652}
1653
1654//---------------------------------------------------------------------------
1655// w=0.0として座標変換したy成分を取得
1658//---------------------------------------------------------------------------
1659GX_FORCE_INLINE f32 GxVector3::getTransformNormalY(const GxMatrix44& matrix) const
1660{
1661 return _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1];
1662}
1663
1664//---------------------------------------------------------------------------
1665// w=0.0として座標変換したy成分を取得
1668//---------------------------------------------------------------------------
1669GX_FORCE_INLINE f32 GxVector3::getTransformNormalY(const GxMatrixAffine& matrix) const
1670{
1671 return _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1];
1672}
1673
1674//---------------------------------------------------------------------------
1675// w=1.0として座標変換後、wで除算したy成分を取得
1678//---------------------------------------------------------------------------
1679GX_FORCE_INLINE f32 GxVector3::getTransformCoordY(const GxMatrix44& matrix) const
1680{
1681 return (_x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1] + matrix._m[3][1])
1682 / (_x * matrix._m[0][3] + _y * matrix._m[1][3] + _z * matrix._m[2][3] + matrix._m[3][3]);
1683}
1684
1685//---------------------------------------------------------------------------
1686// w=1.0として座標変換したz成分を取得
1689//---------------------------------------------------------------------------
1690GX_FORCE_INLINE f32 GxVector3::getTransformZ(const GxMatrix44& matrix) const
1691{
1692 return _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2] + matrix._m[3][2];
1693}
1694
1695//---------------------------------------------------------------------------
1696// w=1.0として座標変換したz成分を取得
1699//---------------------------------------------------------------------------
1700GX_FORCE_INLINE f32 GxVector3::getTransformZ(const GxMatrixAffine& matrix) const
1701{
1702 return _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2] + matrix._m[3][2];
1703}
1704
1705//---------------------------------------------------------------------------
1706// w=0.0として座標変換したz成分を取得
1709//---------------------------------------------------------------------------
1710GX_FORCE_INLINE f32 GxVector3::getTransformNormalZ(const GxMatrix44& matrix) const
1711{
1712 return _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2];
1713}
1714
1715//---------------------------------------------------------------------------
1716// w=0.0として座標変換したz成分を取得
1719//---------------------------------------------------------------------------
1720GX_FORCE_INLINE f32 GxVector3::getTransformNormalZ(const GxMatrixAffine& matrix) const
1721{
1722 return _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2];
1723}
1724
1725//---------------------------------------------------------------------------
1726// w=1.0として座標変換後、wで除算したz成分を取得
1729//---------------------------------------------------------------------------
1730GX_FORCE_INLINE f32 GxVector3::getTransformCoordZ(const GxMatrix44& matrix) const
1731{
1732 return (_x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2] + matrix._m[3][2])
1733 / (_x * matrix._m[0][3] + _y * matrix._m[1][3] + _z * matrix._m[2][3] + matrix._m[3][3]);
1734}
1735
1736//---------------------------------------------------------------------------
1737// 回転後のベクトルを取得
1740//---------------------------------------------------------------------------
1741GX_FORCE_INLINE GxVector3 GxVector3::getRotate(const GxQuaternion& quaternion) const
1742{
1743 GxQuaternion q(*this, 0.0f);
1744 q = quaternion * q * quaternion.getConjugate();
1745 return GxVector3(q._x, q._y, q._z);
1746}
1747
1748//---------------------------------------------------------------------------
1749// スカラ加算を取得
1754//---------------------------------------------------------------------------
1755GX_FORCE_INLINE const GxVector3& GxVector3::getAddScalar(GxVector3& dst, const GxVector3& vector, f32 scalar)
1756{
1757 dst._x = vector._x + scalar;
1758 dst._y = vector._y + scalar;
1759 dst._z = vector._z + scalar;
1760
1761 return dst;
1762}
1763
1764//---------------------------------------------------------------------------
1765// スカラ減算を取得
1770//---------------------------------------------------------------------------
1771GX_FORCE_INLINE const GxVector3& GxVector3::getSubScalar(GxVector3& dst, const GxVector3& vector, f32 scalar)
1772{
1773 dst._x = vector._x - scalar;
1774 dst._y = vector._y - scalar;
1775 dst._z = vector._z - scalar;
1776
1777 return dst;
1778}
1779
1780//---------------------------------------------------------------------------
1781// スカラ乗算を取得
1786//---------------------------------------------------------------------------
1787GX_FORCE_INLINE const GxVector3& GxVector3::getMulScalar(GxVector3& dst, const GxVector3& vector, f32 scalar)
1788{
1789 dst._x = vector._x * scalar;
1790 dst._y = vector._y * scalar;
1791 dst._z = vector._z * scalar;
1792
1793 return dst;
1794}
1795
1796//---------------------------------------------------------------------------
1797// スカラ除算を取得
1802//---------------------------------------------------------------------------
1803GX_FORCE_INLINE const GxVector3& GxVector3::getDivScalar(GxVector3& dst, const GxVector3& vector, f32 scalar)
1804{
1805 auto inverseScalar = 1.0f / scalar;
1806
1807 dst._x = vector._x * inverseScalar;
1808 dst._y = vector._y * inverseScalar;
1809 dst._z = vector._z * inverseScalar;
1810
1811 return dst;
1812}
1813
1814//---------------------------------------------------------------------------
1815// ベクトル加算を取得
1820//---------------------------------------------------------------------------
1821GX_FORCE_INLINE const GxVector3& GxVector3::getAddVector(GxVector3& dst, const GxVector3& vector0, const GxVector3& vector1)
1822{
1823 dst._x = vector0._x + vector1._x;
1824 dst._y = vector0._y + vector1._y;
1825 dst._z = vector0._z + vector1._z;
1826
1827 return dst;
1828}
1829
1830//---------------------------------------------------------------------------
1831// ベクトル減算を取得
1836//---------------------------------------------------------------------------
1837GX_FORCE_INLINE const GxVector3& GxVector3::getSubVector(GxVector3& dst, const GxVector3& vector0, const GxVector3& vector1)
1838{
1839 dst._x = vector0._x - vector1._x;
1840 dst._y = vector0._y - vector1._y;
1841 dst._z = vector0._z - vector1._z;
1842
1843 return dst;
1844}
1845
1846//---------------------------------------------------------------------------
1847// ベクトル乗算を取得
1852//---------------------------------------------------------------------------
1853GX_FORCE_INLINE const GxVector3& GxVector3::getMulVector(GxVector3& dst, const GxVector3& vector0, const GxVector3& vector1)
1854{
1855 dst._x = vector0._x * vector1._x;
1856 dst._y = vector0._y * vector1._y;
1857 dst._z = vector0._z * vector1._z;
1858
1859 return dst;
1860}
1861
1862//---------------------------------------------------------------------------
1863// ベクトル除算を取得
1868//---------------------------------------------------------------------------
1869GX_FORCE_INLINE const GxVector3& GxVector3::getDivVector(GxVector3& dst, const GxVector3& vector0, const GxVector3& vector1)
1870{
1871 dst._x = vector0._x / vector1._x;
1872 dst._y = vector0._y / vector1._y;
1873 dst._z = vector0._z / vector1._z;
1874
1875 return dst;
1876}
1877
1878//---------------------------------------------------------------------------
1879// 正規化ベクトルを取得
1883//---------------------------------------------------------------------------
1884GX_FORCE_INLINE const GxVector3& GxVector3::getNormalize(GxVector3& dst, const GxVector3& vector)
1885{
1886 auto length = vector.getLength();
1887
1888#if GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
1889 GX_ERROR(GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < length * length, "ゼロベクトルを正規化しようとしました");
1890
1891 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
1892 if (length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE)
1893 {
1894 length = 1.0f;
1895 }
1896#else //GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
1897 if( length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
1898 {
1899 GX_TRACE(GX_TRACE_CATEGORY_CORE, "%s(%d)", __FILE__, __LINE__);
1900 GX_TRACE(GX_TRACE_CATEGORY_CORE, "[%s]", __FUNCTION__);
1901 GX_TRACE(GX_TRACE_CATEGORY_CORE, "ゼロベクトルを正規化しようとしました");
1902
1903 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
1904 length = 1.0f;
1905 }
1906#endif // !GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
1907
1908 const auto inverseLength = 1.0f / length;
1909
1910 dst._x = vector._x * inverseLength;
1911 dst._y = vector._y * inverseLength;
1912 dst._z = vector._z * inverseLength;
1913
1914 return dst;
1915}
1916
1917//---------------------------------------------------------------------------
1918// 正規化ベクトルを取得(長さ0に対応)
1922//---------------------------------------------------------------------------
1923GX_FORCE_INLINE const GxVector3& GxVector3::getNormalizeEx(GxVector3& dst, const GxVector3& vector)
1924{
1925 const auto lengthSquare = vector.getLengthSquare();
1926
1927 if( GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < lengthSquare )
1928 {
1929 const auto inverseLength = 1.0f / GxMath::getSqrt(lengthSquare);
1930
1931 dst._x = vector._x * inverseLength;
1932 dst._y = vector._y * inverseLength;
1933 dst._z = vector._z * inverseLength;
1934 }
1935 else
1936 {
1937 dst._x = 0.0f;
1938 dst._y = 0.0f;
1939 dst._z = 0.0f;
1940 }
1941
1942 return dst;
1943}
1944
1945//---------------------------------------------------------------------------
1946// w=1.0として座標変換したベクトルを取得
1951//---------------------------------------------------------------------------
1952GX_FORCE_INLINE const GxVector3& GxVector3::getTransform(GxVector3& dst, const GxVector3& vector, const GxMatrix44& matrix)
1953{
1954 dst._x = vector._x * matrix._m[0][0] + vector._y * matrix._m[1][0] + vector._z * matrix._m[2][0] + matrix._m[3][0];
1955 dst._y = vector._x * matrix._m[0][1] + vector._y * matrix._m[1][1] + vector._z * matrix._m[2][1] + matrix._m[3][1];
1956 dst._z = vector._x * matrix._m[0][2] + vector._y * matrix._m[1][2] + vector._z * matrix._m[2][2] + matrix._m[3][2];
1957
1958 return dst;
1959}
1960
1961//---------------------------------------------------------------------------
1962// w=1.0として座標変換したベクトルを取得
1967//---------------------------------------------------------------------------
1968GX_FORCE_INLINE const GxVector3& GxVector3::getTransform(GxVector3& dst, const GxVector3& vector, const GxMatrixAffine& matrix)
1969{
1970 dst._x = vector._x * matrix._m[0][0] + vector._y * matrix._m[1][0] + vector._z * matrix._m[2][0] + matrix._m[3][0];
1971 dst._y = vector._x * matrix._m[0][1] + vector._y * matrix._m[1][1] + vector._z * matrix._m[2][1] + matrix._m[3][1];
1972 dst._z = vector._x * matrix._m[0][2] + vector._y * matrix._m[1][2] + vector._z * matrix._m[2][2] + matrix._m[3][2];
1973
1974 return dst;
1975}
1976
1977//---------------------------------------------------------------------------
1978// w=1.0として座標変換したベクトルを取得
1983//---------------------------------------------------------------------------
1984GX_FORCE_INLINE const GxFloat3& GxVector3::getTransform(GxFloat3& dst, const GxVector3& vector, const GxMatrix44& matrix)
1985{
1986 dst._x = vector._x * matrix._m[0][0] + vector._y * matrix._m[1][0] + vector._z * matrix._m[2][0] + matrix._m[3][0];
1987 dst._y = vector._x * matrix._m[0][1] + vector._y * matrix._m[1][1] + vector._z * matrix._m[2][1] + matrix._m[3][1];
1988 dst._z = vector._x * matrix._m[0][2] + vector._y * matrix._m[1][2] + vector._z * matrix._m[2][2] + matrix._m[3][2];
1989
1990 return dst;
1991}
1992
1993//---------------------------------------------------------------------------
1994// w=1.0として座標変換したベクトルを取得
1999//---------------------------------------------------------------------------
2000GX_FORCE_INLINE const GxFloat3& GxVector3::getTransform(GxFloat3& dst, const GxVector3& vector, const GxMatrixAffine& matrix)
2001{
2002 dst._x = vector._x * matrix._m[0][0] + vector._y * matrix._m[1][0] + vector._z * matrix._m[2][0] + matrix._m[3][0];
2003 dst._y = vector._x * matrix._m[0][1] + vector._y * matrix._m[1][1] + vector._z * matrix._m[2][1] + matrix._m[3][1];
2004 dst._z = vector._x * matrix._m[0][2] + vector._y * matrix._m[1][2] + vector._z * matrix._m[2][2] + matrix._m[3][2];
2005
2006 return dst;
2007}
2008
2009//---------------------------------------------------------------------------
2010// w=0.0として座標変換したベクトルを取得
2015//---------------------------------------------------------------------------
2016GX_FORCE_INLINE const GxVector3& GxVector3::getTransformNormal(GxVector3& dst, const GxVector3& vector, const GxMatrix44& matrix)
2017{
2018 dst._x = vector._x * matrix._m[0][0] + vector._y * matrix._m[1][0] + vector._z * matrix._m[2][0];
2019 dst._y = vector._x * matrix._m[0][1] + vector._y * matrix._m[1][1] + vector._z * matrix._m[2][1];
2020 dst._z = vector._x * matrix._m[0][2] + vector._y * matrix._m[1][2] + vector._z * matrix._m[2][2];
2021
2022 return dst;
2023}
2024
2025//---------------------------------------------------------------------------
2026// w=0.0として座標変換したベクトルを取得
2031//---------------------------------------------------------------------------
2032GX_FORCE_INLINE const GxVector3& GxVector3::getTransformNormal(GxVector3& dst, const GxVector3& vector, const GxMatrixAffine& matrix)
2033{
2034 dst._x = vector._x * matrix._m[0][0] + vector._y * matrix._m[1][0] + vector._z * matrix._m[2][0];
2035 dst._y = vector._x * matrix._m[0][1] + vector._y * matrix._m[1][1] + vector._z * matrix._m[2][1];
2036 dst._z = vector._x * matrix._m[0][2] + vector._y * matrix._m[1][2] + vector._z * matrix._m[2][2];
2037
2038 return dst;
2039}
2040
2041//---------------------------------------------------------------------------
2042// w=1.0として座標変換後、wで除算したベクトルを取得
2047//---------------------------------------------------------------------------
2048GX_FORCE_INLINE const GxVector3& GxVector3::getTransformCoord(GxVector3& dst, const GxVector3& vector, const GxMatrix44& matrix)
2049{
2050 f32 inverseW = 1.0f / (vector._x * matrix._m[0][3] + vector._y * matrix._m[1][3] + vector._z * matrix._m[2][3] + matrix._m[3][3]);
2051
2052 dst._x = (vector._x * matrix._m[0][0] + vector._y * matrix._m[1][0] + vector._z * matrix._m[2][0] + matrix._m[3][0]) * inverseW;
2053 dst._y = (vector._x * matrix._m[0][1] + vector._y * matrix._m[1][1] + vector._z * matrix._m[2][1] + matrix._m[3][1]) * inverseW;
2054 dst._z = (vector._x * matrix._m[0][2] + vector._y * matrix._m[1][2] + vector._z * matrix._m[2][2] + matrix._m[3][2]) * inverseW;
2055
2056 return dst;
2057}
2058
2059//---------------------------------------------------------------------------
2060// 回転後のベクトルを取得
2064//---------------------------------------------------------------------------
2065GX_FORCE_INLINE const GxVector3& GxVector3::getRotate(GxVector3& dst, const GxVector3& vector, const GxQuaternion& quaternion)
2066{
2067 GxQuaternion q(vector, 0.0f);
2068 q = quaternion * q * quaternion.getConjugate();
2069
2070 dst._x = q._x;
2071 dst._y = q._y;
2072 dst._z = q._z;
2073
2074 return dst;
2075}
2076
2077//---------------------------------------------------------------------------
2078// 内積を取得
2082//---------------------------------------------------------------------------
2083GX_FORCE_INLINE f32 GxVector3::getDot(const GxVector3& vector0, const GxVector3& vector1)
2084{
2085 return vector0._x * vector1._x + vector0._y * vector1._y + vector0._z * vector1._z;
2086}
2087
2088//---------------------------------------------------------------------------
2089// 外積を取得
2093//---------------------------------------------------------------------------
2094GX_FORCE_INLINE GxVector3 GxVector3::getCross(const GxVector3& vector0, const GxVector3& vector1)
2095{
2096 return GxVector3( vector0._y * vector1._z - vector0._z * vector1._y,
2097 vector0._z * vector1._x - vector0._x * vector1._z,
2098 vector0._x * vector1._y - vector0._y * vector1._x);
2099}
2100
2101//---------------------------------------------------------------------------
2102// 外積を取得
2107//---------------------------------------------------------------------------
2108GX_FORCE_INLINE const GxVector3& GxVector3::getCross(GxVector3& dst, const GxVector3& vector0, const GxVector3& vector1)
2109{
2110 dst._x = vector0._y * vector1._z - vector0._z * vector1._y;
2111 dst._y = vector0._z * vector1._x - vector0._x * vector1._z;
2112 dst._z = vector0._x * vector1._y - vector0._y * vector1._x;
2113
2114 return dst;
2115}
2116
2117//---------------------------------------------------------------------------
2118// 直交する単位ベクトルを取得
2121//---------------------------------------------------------------------------
2122GX_FORCE_INLINE GxVector3 GxVector3::getCrossVector(const GxVector3& vector)
2123{
2124 GxVector3 temporary(vector._z, -vector._x, vector._y);
2125 if(GxVector3::getDot(vector, temporary) <= -1.0f + FLT_EPSILON)
2126 {
2127 // 真逆
2128 temporary._x = -temporary._x;
2129 }
2130
2131 GxVector3 result;
2132 GxVector3::getCross(result, vector, temporary);
2133
2134 return result.normalizeEx();
2135}
2136
2137//---------------------------------------------------------------------------
2138// 直交する単位ベクトルを取得
2142//---------------------------------------------------------------------------
2143GX_FORCE_INLINE const GxVector3& GxVector3::getCrossVector(GxVector3& dst, const GxVector3& vector)
2144{
2145 GxVector3 temporary(vector._z, -vector._x, vector._y);
2146 if(GxVector3::getDot(vector, temporary) <= -1.0f + FLT_EPSILON)
2147 {
2148 // 真逆
2149 temporary._x = -temporary._x;
2150 }
2151
2152 GxVector3::getCross(dst, vector, temporary);
2153
2154 return dst.normalizeEx();
2155}
2156
2157//---------------------------------------------------------------------------
2158// 距離を取得
2162//---------------------------------------------------------------------------
2163GX_FORCE_INLINE f32 GxVector3::getDistance(const GxVector3& vector0, const GxVector3& vector1)
2164{
2165 return GxMath::getSqrt(getDistanceSquare(vector0, vector1));
2166}
2167
2168//---------------------------------------------------------------------------
2169// 距離の2乗を取得
2173//---------------------------------------------------------------------------
2174GX_FORCE_INLINE f32 GxVector3::getDistanceSquare(const GxVector3& vector0, const GxVector3& vector1)
2175{
2176 const auto x = vector0._x - vector1._x;
2177 const auto y = vector0._y - vector1._y;
2178 const auto z = vector0._z - vector1._z;
2179
2180 return x * x + y * y + z * z;
2181}
2182
2183//---------------------------------------------------------------------------
2184// 角度差を取得(符号なし radian)
2189//---------------------------------------------------------------------------
2190GX_FORCE_INLINE f32 GxVector3::getAngle(const GxVector3& vector0, const GxVector3& vector1)
2191{
2192 const auto denominator = vector0.getLengthSquare() * vector1.getLengthSquare();
2193
2194 if( denominator <= FLT_EPSILON )
2195 {
2196 return 0.0f;
2197 }
2198
2199 const auto value = GxMath::getClamp(getDot(vector0, vector1) / GxMath::getSqrt(denominator), -1.0f, 1.0f);
2200 return GxMath::getACos(value);
2201}
2202
2203//---------------------------------------------------------------------------
2204// 角度差を取得(符号つき radian)
2210//---------------------------------------------------------------------------
2211GX_FORCE_INLINE f32 GxVector3::getAngle(const GxVector3& vector0, const GxVector3& vector1, const GxVector3& up)
2212{
2213 const auto denominator = vector0.getLengthSquare() * vector1.getLengthSquare();
2214
2215 if( denominator <= FLT_EPSILON )
2216 {
2217 return 0.0f;
2218 }
2219
2220 const auto value = GxMath::getClamp(getDot(vector0, vector1) / GxMath::getSqrt(denominator), -1.0f, 1.0f);
2221
2222 GxVector3 vector2;
2223 const auto signe = getDot(up, getCross(vector2, vector0, vector1));
2224
2225 return (0.0f <= signe) ? GxMath::getACos(value) : -GxMath::getACos(value);
2226}
2227
2228//---------------------------------------------------------------------------
2229// 要素毎に最小値を選択
2233//---------------------------------------------------------------------------
2234GX_FORCE_INLINE GxVector3 GxVector3::getMinimum(const GxVector3& vector0, const GxVector3& vector1)
2235{
2236 return GxVector3(vector0._x < vector1._x ? vector0._x : vector1._x,
2237 vector0._y < vector1._y ? vector0._y : vector1._y,
2238 vector0._z < vector1._z ? vector0._z : vector1._z);
2239}
2240
2241//---------------------------------------------------------------------------
2242// 要素毎に最小値を選択
2247//---------------------------------------------------------------------------
2248GX_FORCE_INLINE const GxVector3& GxVector3::getMinimum(GxVector3& dst, const GxVector3& vector0, const GxVector3& vector1)
2249{
2250 dst._x = vector0._x < vector1._x ? vector0._x : vector1._x;
2251 dst._y = vector0._y < vector1._y ? vector0._y : vector1._y;
2252 dst._z = vector0._z < vector1._z ? vector0._z : vector1._z;
2253
2254 return dst;
2255}
2256
2257//---------------------------------------------------------------------------
2258// 要素毎に最大値を選択
2262//---------------------------------------------------------------------------
2263GX_FORCE_INLINE GxVector3 GxVector3::getMaximum(const GxVector3& vector0, const GxVector3& vector1)
2264{
2265 return GxVector3(vector0._x > vector1._x ? vector0._x : vector1._x,
2266 vector0._y > vector1._y ? vector0._y : vector1._y,
2267 vector0._z > vector1._z ? vector0._z : vector1._z);
2268}
2269
2270//---------------------------------------------------------------------------
2271// 要素毎に最大値を選択
2276//---------------------------------------------------------------------------
2277GX_FORCE_INLINE const GxVector3& GxVector3::getMaximum(GxVector3& dst, const GxVector3& vector0, const GxVector3& vector1)
2278{
2279 dst._x = vector0._x > vector1._x ? vector0._x : vector1._x;
2280 dst._y = vector0._y > vector1._y ? vector0._y : vector1._y;
2281 dst._z = vector0._z > vector1._z ? vector0._z : vector1._z;
2282
2283 return dst;
2284}
2285
2286//---------------------------------------------------------------------------
2287// 線形補間
2292//---------------------------------------------------------------------------
2293GX_FORCE_INLINE GxVector3 GxVector3::getLerp(const GxVector3& vector0, const GxVector3& vector1, f32 t)
2294{
2295 return GxVector3(vector0._x + (vector1._x - vector0._x) * t,
2296 vector0._y + (vector1._y - vector0._y) * t,
2297 vector0._z + (vector1._z - vector0._z) * t);
2298}
2299
2300//---------------------------------------------------------------------------
2301// 線形補間
2307//---------------------------------------------------------------------------
2308GX_FORCE_INLINE const GxVector3& GxVector3::getLerp(GxVector3& dst, const GxVector3& vector0, const GxVector3& vector1, f32 t)
2309{
2310 dst._x = vector0._x + (vector1._x - vector0._x) * t;
2311 dst._y = vector0._y + (vector1._y - vector0._y) * t;
2312 dst._z = vector0._z + (vector1._z - vector0._z) * t;
2313
2314 return dst;
2315}
2316
2317//---------------------------------------------------------------------------
2318// 指定した点が線分上のどこに位置するかのパラメータを返す
2326//---------------------------------------------------------------------------
2327GX_FORCE_INLINE f32 GxVector3::getLineParam(const GxVector3& checkPosition, const GxVector3& startPosition, const GxVector3& endPosition)
2328{
2329 GxVector3 v0(endPosition - startPosition);
2330 GxVector3 v1(checkPosition - startPosition);
2331 auto numerator = GxVector3::getDot(v0, v1);
2332 auto denominator = GxVector3::getDot(v0, v0);
2333
2334 // 線分の長さが無いときは 0
2335 if( denominator <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
2336 {
2337 return 0.0f;
2338 }
2339
2340 return numerator / denominator;
2341}
2342
2343//---------------------------------------------------------------------------
2344// 指定した点を直線上に下ろした点を取得
2350//---------------------------------------------------------------------------
2351GX_FORCE_INLINE const GxVector3& GxVector3::getLinePosition(GxVector3& dst, const GxVector3& position, const GxVector3& linePosition0, const GxVector3& linePosition1)
2352{
2353 auto t = getLineParam(position, linePosition0, linePosition1);
2354
2355 return GxVector3::getLerp(dst, linePosition0, linePosition1, t);
2356}
2357
2358//---------------------------------------------------------------------------
2359// 指定した点を直線上に下ろした点を取得
2364//---------------------------------------------------------------------------
2365GX_FORCE_INLINE GxVector3 GxVector3::getLinePosition(const GxVector3& position, const GxVector3& linePosition0, const GxVector3& linePosition1)
2366{
2367 auto t = getLineParam(position, linePosition0, linePosition1);
2368
2369 return GxVector3::getLerp(linePosition0, linePosition1, t);
2370}
2371
2372//---------------------------------------------------------------------------
2373// 指定した点を線分上に下ろした点を取得
2379//---------------------------------------------------------------------------
2380GX_FORCE_INLINE const GxVector3& GxVector3::getSegmentPosition(GxVector3& dst, const GxVector3& position, const GxVector3& startPosition, const GxVector3& endPosition)
2381{
2382 auto t = getLineParam(position, startPosition, endPosition);
2383 t = GxMath::getClamp(t, 0.0f, 1.0f);
2384
2385 return GxVector3::getLerp(dst, startPosition, endPosition, t);
2386}
2387
2388//---------------------------------------------------------------------------
2389// 指定した点を線分上に下ろした点を取得
2394//---------------------------------------------------------------------------
2395GX_FORCE_INLINE GxVector3 GxVector3::getSegmentPosition(const GxVector3& position, const GxVector3& startPosition, const GxVector3& endPosition)
2396{
2397 auto t = getLineParam(position, startPosition, endPosition);
2398 t = GxMath::getClamp(t, 0.0f, 1.0f);
2399
2400 return GxVector3::getLerp(startPosition, endPosition, t);
2401}
2402
2403//---------------------------------------------------------------------------
2404// ベクトルが同じ方向を向いているか(ラジアン指定/指定値以内なら(==も含む)同じ方向)
2409//---------------------------------------------------------------------------
2410GX_FORCE_INLINE b32 GxVector3::isSameDirectionLessEqual( const GxVector3& vector0, const GxVector3& vector1, f32 limitRadian )
2411{
2412 const auto dot = GxVector3::getDot(vector0, vector1);
2413 const auto cosRadian = GxMath::getCos(limitRadian);
2414
2415 if( dot > 0.f )
2416 {
2417 if( cosRadian <= 0.f )
2418 {
2419 return true;
2420 }
2421 else if( dot * dot >= vector0.getLengthSquare() * vector1.getLengthSquare() * cosRadian * cosRadian )
2422 {
2423 return true;
2424 }
2425 }
2426 else
2427 {
2428 if( cosRadian <= 0.f &&
2429 dot * dot <= vector0.getLengthSquare() * vector1.getLengthSquare() * cosRadian * cosRadian )
2430 {
2431 return true;
2432 }
2433 }
2434
2435 return false;
2436}
2437
2438//---------------------------------------------------------------------------
2439// ベクトルが同じ方向を向いているか(ラジアン指定/指定値より小さければ(==は含まない)同じ方向)
2444//---------------------------------------------------------------------------
2445GX_FORCE_INLINE b32 GxVector3::isSameDirectionLessThan( const GxVector3& vector0, const GxVector3& vector1, f32 limitRadian )
2446{
2447 const auto dot = GxVector3::getDot(vector0, vector1);
2448 const auto cosRadian = GxMath::getCos(limitRadian);
2449
2450 if( dot > 0.f )
2451 {
2452 if( cosRadian < 0.f )
2453 {
2454 return true;
2455 }
2456 else if( dot * dot > vector0.getLengthSquare() * vector1.getLengthSquare() * cosRadian * cosRadian )
2457 {
2458 return true;
2459 }
2460 }
2461 else
2462 {
2463 if( cosRadian < 0.f &&
2464 dot * dot < vector0.getLengthSquare() * vector1.getLengthSquare() * cosRadian * cosRadian )
2465 {
2466 return true;
2467 }
2468 }
2469
2470 return false;
2471}
2472
2473//---------------------------------------------------------------------------
2474// スカラ加算
2477//---------------------------------------------------------------------------
2478GX_FORCE_INLINE const GxVector3& GxVector3::addScalar(f32 scalar)
2479{
2480 _x += scalar;
2481 _y += scalar;
2482 _z += scalar;
2483
2484 return *this;
2485}
2486
2487//---------------------------------------------------------------------------
2488// スカラ減算
2491//---------------------------------------------------------------------------
2492GX_FORCE_INLINE const GxVector3& GxVector3::subScalar(f32 scalar)
2493{
2494 _x -= scalar;
2495 _y -= scalar;
2496 _z -= scalar;
2497
2498 return *this;
2499}
2500
2501//---------------------------------------------------------------------------
2502// スカラ乗算
2505//---------------------------------------------------------------------------
2506GX_FORCE_INLINE const GxVector3& GxVector3::mulScalar(f32 scalar)
2507{
2508 _x *= scalar;
2509 _y *= scalar;
2510 _z *= scalar;
2511
2512 return *this;
2513}
2514
2515//---------------------------------------------------------------------------
2516// スカラ除算
2519//---------------------------------------------------------------------------
2520GX_FORCE_INLINE const GxVector3& GxVector3::divScalar(f32 scalar)
2521{
2522 auto inverseScalar = 1.0f / scalar;
2523
2524 _x *= inverseScalar;
2525 _y *= inverseScalar;
2526 _z *= inverseScalar;
2527
2528 return *this;
2529}
2530
2531//---------------------------------------------------------------------------
2532// ベクトル加算
2535//---------------------------------------------------------------------------
2536GX_FORCE_INLINE const GxVector3& GxVector3::addVector(const GxVector3& vector)
2537{
2538 _x += vector._x;
2539 _y += vector._y;
2540 _z += vector._z;
2541
2542 return *this;
2543}
2544
2545//---------------------------------------------------------------------------
2546// ベクトル減算
2549//---------------------------------------------------------------------------
2550GX_FORCE_INLINE const GxVector3& GxVector3::subVector(const GxVector3& vector)
2551{
2552 _x -= vector._x;
2553 _y -= vector._y;
2554 _z -= vector._z;
2555
2556 return *this;
2557}
2558
2559//---------------------------------------------------------------------------
2560// ベクトル乗算
2563//---------------------------------------------------------------------------
2564GX_FORCE_INLINE const GxVector3& GxVector3::mulVector(const GxVector3& vector)
2565{
2566 _x *= vector._x;
2567 _y *= vector._y;
2568 _z *= vector._z;
2569
2570 return *this;
2571}
2572
2573//---------------------------------------------------------------------------
2574// ベクトル除算
2577//---------------------------------------------------------------------------
2578GX_FORCE_INLINE const GxVector3& GxVector3::divVector(const GxVector3& vector)
2579{
2580 _x /= vector._x;
2581 _y /= vector._y;
2582 _z /= vector._z;
2583
2584 return *this;
2585}
2586
2587//---------------------------------------------------------------------------
2588// 正規化する
2590//---------------------------------------------------------------------------
2591GX_FORCE_INLINE const GxVector3& GxVector3::normalize(void)
2592{
2593 auto length = getLength();
2594
2595#if GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
2596 GX_ERROR(GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < length * length, "ゼロベクトルを正規化しようとしました");
2597
2598 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
2599 if (length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE)
2600 {
2601 length = 1.0f;
2602 }
2603#else //GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
2604 if( length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
2605 {
2606 GX_TRACE(GX_TRACE_CATEGORY_CORE, "%s(%d)", __FILE__, __LINE__);
2607 GX_TRACE(GX_TRACE_CATEGORY_CORE, "[%s]", __FUNCTION__);
2608 GX_TRACE(GX_TRACE_CATEGORY_CORE, "ゼロベクトルを正規化しようとしました");
2609
2610 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
2611 length = 1.0f;
2612 }
2613#endif // !GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
2614
2615 const auto inverseLength = 1.0f / length;
2616
2617 _x *= inverseLength;
2618 _y *= inverseLength;
2619 _z *= inverseLength;
2620
2621 return *this;
2622}
2623
2624//---------------------------------------------------------------------------
2625// 正規化する(長さ0に対応)
2627//---------------------------------------------------------------------------
2628GX_FORCE_INLINE const GxVector3& GxVector3::normalizeEx(void)
2629{
2630 const auto lengthSquare = getLengthSquare();
2631
2632 if( GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < lengthSquare )
2633 {
2634 const f32 inverseLength = 1.0f / GxMath::getSqrt(lengthSquare);
2635
2636 _x *= inverseLength;
2637 _y *= inverseLength;
2638 _z *= inverseLength;
2639 }
2640 else
2641 {
2642 _x = 0.0f;
2643 _y = 0.0f;
2644 _z = 0.0f;
2645 }
2646
2647 return *this;
2648}
2649
2650//---------------------------------------------------------------------------
2651// 座標変換する(w=1.0)
2654//---------------------------------------------------------------------------
2655GX_FORCE_INLINE const GxVector3& GxVector3::transform(const GxMatrix44& matrix)
2656{
2657 const auto x = _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0] + matrix._m[3][0];
2658 const auto y = _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1] + matrix._m[3][1];
2659 const auto z = _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2] + matrix._m[3][2];
2660
2661 _x = x;
2662 _y = y;
2663 _z = z;
2664
2665 return *this;
2666}
2667
2668//---------------------------------------------------------------------------
2669// 座標変換する(w=1.0)
2672//---------------------------------------------------------------------------
2673GX_FORCE_INLINE const GxVector3& GxVector3::transform(const GxMatrixAffine& matrix)
2674{
2675 const auto x = _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0] + matrix._m[3][0];
2676 const auto y = _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1] + matrix._m[3][1];
2677 const auto z = _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2] + matrix._m[3][2];
2678
2679 _x = x;
2680 _y = y;
2681 _z = z;
2682
2683 return *this;
2684}
2685
2686//---------------------------------------------------------------------------
2687// 座標変換する(w=0.0)
2690//---------------------------------------------------------------------------
2691GX_FORCE_INLINE const GxVector3& GxVector3::transformNormal(const GxMatrix44& matrix)
2692{
2693 const auto x = _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0];
2694 const auto y = _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1];
2695 const auto z = _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2];
2696
2697 _x = x;
2698 _y = y;
2699 _z = z;
2700
2701 return *this;
2702}
2703
2704//---------------------------------------------------------------------------
2705// 座標変換する(w=0.0)
2708//---------------------------------------------------------------------------
2709GX_FORCE_INLINE const GxVector3& GxVector3::transformNormal(const GxMatrixAffine& matrix)
2710{
2711 const auto x = _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0];
2712 const auto y = _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1];
2713 const auto z = _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2];
2714
2715 _x = x;
2716 _y = y;
2717 _z = z;
2718
2719 return *this;
2720}
2721
2722//---------------------------------------------------------------------------
2723// 座標変換後wで除算する(w=1.0)
2726//---------------------------------------------------------------------------
2727GX_FORCE_INLINE const GxVector3& GxVector3::transformCoord(const GxMatrix44& matrix)
2728{
2729 const auto x = _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0] + matrix._m[3][0];
2730 const auto y = _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1] + matrix._m[3][1];
2731 const auto z = _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2] + matrix._m[3][2];
2732 const auto inverseW = 1.0f / (_x * matrix._m[0][3] + _y * matrix._m[1][3] + _z * matrix._m[2][3] + matrix._m[3][3]);
2733
2734 _x = x * inverseW;
2735 _y = y * inverseW;
2736 _z = z * inverseW;
2737
2738 return *this;
2739}
2740
2741//---------------------------------------------------------------------------
2742// 回転する
2745//---------------------------------------------------------------------------
2746GX_FORCE_INLINE const GxVector3& GxVector3::rotate(const GxQuaternion& quaternion)
2747{
2748 GxQuaternion q(*this, 0.0f);
2749 q = quaternion * q * quaternion.getConjugate();
2750
2751 _x = q._x;
2752 _y = q._y;
2753 _z = q._z;
2754
2755 return *this;
2756}
2757
2758//===========================================================================
2759// GxVector4
2760//===========================================================================
2761//---------------------------------------------------------------------------
2762// コンストラクタ
2767//---------------------------------------------------------------------------
2768GX_FORCE_INLINE GxVector4::GxVector4(f32 x, f32 y, f32 z, f32 w)
2769: _x(x)
2770, _y(y)
2771, _z(z)
2772, _w(w)
2773{
2774}
2775
2776//---------------------------------------------------------------------------
2777// コンストラクタ
2779//---------------------------------------------------------------------------
2780GX_FORCE_INLINE GxVector4::GxVector4(const GxFloat4& float4)
2781: _x(float4._x)
2782, _y(float4._y)
2783, _z(float4._z)
2784, _w(float4._w)
2785{
2786}
2787
2788//---------------------------------------------------------------------------
2789// コンストラクタ
2791//---------------------------------------------------------------------------
2792GX_FORCE_INLINE GxVector4::GxVector4(const f32* pFloatArray)
2793: _x(pFloatArray[0])
2794, _y(pFloatArray[1])
2795, _z(pFloatArray[2])
2796, _w(pFloatArray[3])
2797{
2798}
2799
2800//---------------------------------------------------------------------------
2801// コンストラクタ
2802//
2805//---------------------------------------------------------------------------
2806GX_FORCE_INLINE GxVector4::GxVector4(const GxVector3& vector, f32 w)
2807: _x(vector._x)
2808, _y(vector._y)
2809, _z(vector._z)
2810, _w(w)
2811{
2812}
2813
2814//---------------------------------------------------------------------------
2815// コンストラクタ
2816//
2818//---------------------------------------------------------------------------
2819GX_FORCE_INLINE GxVector4::GxVector4(const GxColorHDR& color)
2820: _x(color._red)
2821, _y(color._green)
2822, _z(color._blue)
2823, _w(color._alpha)
2824{
2825}
2826
2827//---------------------------------------------------------------------------
2828// コピーコンストラクタ
2830//---------------------------------------------------------------------------
2831GX_FORCE_INLINE GxVector4::GxVector4(const GxVector4& vector)
2832: _x(vector._x)
2833, _y(vector._y)
2834, _z(vector._z)
2835, _w(vector._w)
2836{
2837}
2838
2839//---------------------------------------------------------------------------
2840// 代入
2843//---------------------------------------------------------------------------
2844GX_FORCE_INLINE GxVector4& GxVector4::operator = (const GxVector3& vector)
2845{
2846 _x = vector._x;
2847 _y = vector._y;
2848 _z = vector._z;
2849
2850 return *this;
2851}
2852
2853//---------------------------------------------------------------------------
2854// 代入
2857//---------------------------------------------------------------------------
2858GX_FORCE_INLINE GxVector4& GxVector4::operator = (const GxVector4& vector)
2859{
2860 _x = vector._x;
2861 _y = vector._y;
2862 _z = vector._z;
2863 _w = vector._w;
2864 return *this;
2865}
2866
2867//---------------------------------------------------------------------------
2868// スカラ加算代入
2871//---------------------------------------------------------------------------
2872GX_FORCE_INLINE GxVector4& GxVector4::operator += (f32 scalar)
2873{
2874 addScalar(scalar);
2875 return *this;
2876}
2877
2878//---------------------------------------------------------------------------
2879// スカラ減算代入
2882//---------------------------------------------------------------------------
2883GX_FORCE_INLINE GxVector4& GxVector4::operator -= (f32 scalar)
2884{
2885 subScalar(scalar);
2886 return *this;
2887}
2888
2889//---------------------------------------------------------------------------
2890// スカラ乗算代入
2893//---------------------------------------------------------------------------
2894GX_FORCE_INLINE GxVector4& GxVector4::operator *= (f32 scalar)
2895{
2896 mulScalar(scalar);
2897 return *this;
2898}
2899
2900//---------------------------------------------------------------------------
2901// スカラ除算代入
2904//---------------------------------------------------------------------------
2905GX_FORCE_INLINE GxVector4& GxVector4::operator /= (f32 scalar)
2906{
2907 divScalar(scalar);
2908 return *this;
2909}
2910
2911//---------------------------------------------------------------------------
2912// ベクトル加算代入
2915//---------------------------------------------------------------------------
2916GX_FORCE_INLINE GxVector4& GxVector4::operator += (const GxVector4& vector)
2917{
2918 addVector(vector);
2919 return *this;
2920}
2921
2922//---------------------------------------------------------------------------
2923// ベクトル減算代入
2926//---------------------------------------------------------------------------
2927GX_FORCE_INLINE GxVector4& GxVector4::operator -= (const GxVector4& vector)
2928{
2929 subVector(vector);
2930 return *this;
2931}
2932
2933//---------------------------------------------------------------------------
2934// ベクトル乗算代入
2937//---------------------------------------------------------------------------
2938GX_FORCE_INLINE GxVector4& GxVector4::operator *= (const GxVector4& vector)
2939{
2940 mulVector(vector);
2941 return *this;
2942}
2943
2944//---------------------------------------------------------------------------
2945// ベクトル除算代入
2948//---------------------------------------------------------------------------
2949GX_FORCE_INLINE GxVector4& GxVector4::operator /= (const GxVector4& vector)
2950{
2951 divVector(vector);
2952 return *this;
2953}
2954
2955//---------------------------------------------------------------------------
2956// スカラ加算
2960//---------------------------------------------------------------------------
2961GX_FORCE_INLINE const GxVector4 operator + (const GxVector4& vector, f32 scalar)
2962{
2963 GxVector4 result;
2964 return GxVector4::getAddScalar(result, vector, scalar);
2965}
2966
2967//---------------------------------------------------------------------------
2968// スカラ減算
2972//---------------------------------------------------------------------------
2973GX_FORCE_INLINE const GxVector4 operator - (const GxVector4& vector, f32 scalar)
2974{
2975 GxVector4 result;
2976 return GxVector4::getSubScalar(result, vector, scalar);
2977}
2978
2979//---------------------------------------------------------------------------
2980// スカラ乗算
2984//---------------------------------------------------------------------------
2985GX_FORCE_INLINE const GxVector4 operator * (const GxVector4& vector, f32 scalar)
2986{
2987 GxVector4 result;
2988 return GxVector4::getMulScalar(result, vector, scalar);
2989}
2990
2991//---------------------------------------------------------------------------
2992// スカラ乗算
2996//---------------------------------------------------------------------------
2997GX_FORCE_INLINE const GxVector4 operator * (f32 scalar, const GxVector4& vector)
2998{
2999 GxVector4 result;
3000 return GxVector4::getMulScalar(result, vector, scalar);
3001}
3002
3003//---------------------------------------------------------------------------
3004// スカラ除算
3008//---------------------------------------------------------------------------
3009GX_FORCE_INLINE const GxVector4 operator / (const GxVector4& vector, f32 scalar)
3010{
3011 GxVector4 result;
3012 return GxVector4::getDivScalar(result, vector, scalar);
3013}
3014
3015//---------------------------------------------------------------------------
3016// ベクトル加算
3020//---------------------------------------------------------------------------
3021GX_FORCE_INLINE const GxVector4 operator + (const GxVector4& vector0, const GxVector4& vector1)
3022{
3023 GxVector4 result;
3024 return GxVector4::getAddVector(result, vector0, vector1);
3025}
3026
3027//---------------------------------------------------------------------------
3028// ベクトル減算
3032//---------------------------------------------------------------------------
3033GX_FORCE_INLINE const GxVector4 operator - (const GxVector4& vector0, const GxVector4& vector1)
3034{
3035 GxVector4 result;
3036 return GxVector4::getSubVector(result, vector0, vector1);
3037}
3038
3039//---------------------------------------------------------------------------
3040// ベクトル乗算
3044//---------------------------------------------------------------------------
3045GX_FORCE_INLINE const GxVector4 operator * (const GxVector4& vector0, const GxVector4& vector1)
3046{
3047 GxVector4 result;
3048 return GxVector4::getMulVector(result, vector0, vector1);
3049}
3050
3051//---------------------------------------------------------------------------
3052// ベクトル除算
3056//---------------------------------------------------------------------------
3057GX_FORCE_INLINE const GxVector4 operator / (const GxVector4& vector0, const GxVector4& vector1)
3058{
3059 GxVector4 result;
3060 return GxVector4::getDivVector(result, vector0, vector1);
3061}
3062
3063//---------------------------------------------------------------------------
3064// 一致
3068//---------------------------------------------------------------------------
3069GX_FORCE_INLINE b32 operator == (const GxVector4& vector0, const GxVector4& vector1)
3070{
3071 return (vector0._x == vector1._x) && (vector0._y == vector1._y) && (vector0._z == vector1._z) && (vector0._w == vector1._w);
3072}
3073
3074//---------------------------------------------------------------------------
3075// 不一致
3079//---------------------------------------------------------------------------
3080GX_FORCE_INLINE b32 operator != (const GxVector4& vector0, const GxVector4& vector1)
3081{
3082 return (vector0._x != vector1._x) || (vector0._y != vector1._y) || (vector0._z != vector1._z) || (vector0._w != vector1._w);
3083}
3084
3085//---------------------------------------------------------------------------
3086// const配列
3089//---------------------------------------------------------------------------
3090GX_FORCE_INLINE const f32& GxVector4::operator[](u32 i) const
3091{
3092 return (&_x)[i];
3093}
3094
3095//---------------------------------------------------------------------------
3096// 配列
3099//---------------------------------------------------------------------------
3100GX_FORCE_INLINE f32& GxVector4::operator[](u32 i)
3101{
3102 return (&_x)[i];
3103}
3104
3105//---------------------------------------------------------------------------
3106// ゼロベクトル判定
3108//---------------------------------------------------------------------------
3109GX_FORCE_INLINE b32 GxVector4::isZeroVector(void) const
3110{
3111 return (getLengthSquare() <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE);
3112}
3113
3114//---------------------------------------------------------------------------
3115// 長さを取得
3117//---------------------------------------------------------------------------
3118GX_FORCE_INLINE f32 GxVector4::getLength(void) const
3119{
3121}
3122
3123//---------------------------------------------------------------------------
3124// 長さの2乗を取得
3126//---------------------------------------------------------------------------
3127GX_FORCE_INLINE f32 GxVector4::getLengthSquare(void) const
3128{
3129 return _x * _x + _y * _y + _z * _z + _w * _w;
3130}
3131
3132//---------------------------------------------------------------------------
3133// 長さを設定
3134//
3136//---------------------------------------------------------------------------
3137GX_FORCE_INLINE void GxVector4::setLength(f32 length)
3138{
3139 auto oldLength = getLength();
3140
3141#if GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
3142 GX_ERROR(GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < oldLength * oldLength, "ゼロベクトルに長さを設定しようとしました");
3143
3144 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
3145 if (oldLength * oldLength <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE)
3146 {
3147 oldLength = 1.0f;
3148 }
3149#else //GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
3150 if( oldLength * oldLength <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
3151 {
3152 GX_TRACE(GX_TRACE_CATEGORY_CORE, "%s(%d)", __FILE__, __LINE__);
3153 GX_TRACE(GX_TRACE_CATEGORY_CORE, "[%s]", __FUNCTION__);
3154 GX_TRACE(GX_TRACE_CATEGORY_CORE, "ゼロベクトルに長さを設定しようとしました");
3155
3156 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
3157 oldLength = 1.0f;
3158 }
3159#endif // !GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
3160
3161 const auto scale = length / oldLength;
3162
3163 _x *= scale;
3164 _y *= scale;
3165 _z *= scale;
3166 _w *= scale;
3167}
3168
3169//---------------------------------------------------------------------------
3170// 長さを設定(長さ0に対応)
3171//
3173//---------------------------------------------------------------------------
3174GX_FORCE_INLINE void GxVector4::setLengthEx(f32 length)
3175{
3176 const auto lengthSquare = getLengthSquare();
3177
3178 if( GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < lengthSquare )
3179 {
3180 const auto scale = length / GxMath::getSqrt(lengthSquare);
3181
3182 _x *= scale;
3183 _y *= scale;
3184 _z *= scale;
3185 _w *= scale;
3186 }
3187 else
3188 {
3189 _x = 0.0f;
3190 _y = 0.0f;
3191 _z = 0.0f;
3192 _w = 0.0f;
3193 }
3194}
3195
3196//---------------------------------------------------------------------------
3197// 正規化ベクトルを取得
3199//---------------------------------------------------------------------------
3200GX_FORCE_INLINE GxVector4 GxVector4::getNormalize(void) const
3201{
3202 auto length = getLength();
3203
3204#if GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
3205 GX_ERROR(GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < length * length, "ゼロベクトルを正規化しようとしました");
3206
3207 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
3208 if (length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE)
3209 {
3210 length = 1.0f;
3211 }
3212#else // GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
3213 if( length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
3214 {
3215 GX_TRACE(GX_TRACE_CATEGORY_CORE, "%s(%d)", __FILE__, __LINE__);
3216 GX_TRACE(GX_TRACE_CATEGORY_CORE, "[%s]", __FUNCTION__);
3217 GX_TRACE(GX_TRACE_CATEGORY_CORE, "ゼロベクトルを正規化しようとしました");
3218
3219 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
3220 length = 1.0f;
3221 }
3222#endif // !GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
3223
3224 const auto inverseLength = 1.0f / length;
3225
3226 return GxVector4(_x * inverseLength, _y * inverseLength, _z * inverseLength, _w * inverseLength);
3227}
3228
3229//---------------------------------------------------------------------------
3230// 正規化ベクトルを取得(長さ0に対応)
3232//---------------------------------------------------------------------------
3233GX_FORCE_INLINE GxVector4 GxVector4::getNormalizeEx(void) const
3234{
3235 const auto lengthSquare = getLengthSquare();
3236
3237 if( GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < lengthSquare )
3238 {
3239 const auto inverseLength = 1.0f / GxMath::getSqrt(lengthSquare);
3240 return GxVector4(_x * inverseLength, _y * inverseLength, _z * inverseLength, _w * inverseLength);
3241 }
3242 return GxVector4::ZERO;
3243}
3244
3245//---------------------------------------------------------------------------
3246// 座標変換後のベクトルを取得
3249//---------------------------------------------------------------------------
3250GX_FORCE_INLINE const GxVector4 GxVector4::getTransform(const GxMatrix44& matrix) const
3251{
3252 return GxVector4(
3253 _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0] + _w * matrix._m[3][0],
3254 _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1] + _w * matrix._m[3][1],
3255 _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2] + _w * matrix._m[3][2],
3256 _x * matrix._m[0][3] + _y * matrix._m[1][3] + _z * matrix._m[2][3] + _w * matrix._m[3][3]);
3257}
3258
3259//---------------------------------------------------------------------------
3260// スカラ加算を取得
3265//---------------------------------------------------------------------------
3266GX_FORCE_INLINE const GxVector4& GxVector4::getAddScalar(GxVector4& dst, const GxVector4& vector, f32 scalar)
3267{
3268 dst._x = vector._x + scalar;
3269 dst._y = vector._y + scalar;
3270 dst._z = vector._z + scalar;
3271 dst._w = vector._w + scalar;
3272
3273 return dst;
3274}
3275
3276//---------------------------------------------------------------------------
3277// スカラ減算を取得
3282//---------------------------------------------------------------------------
3283GX_FORCE_INLINE const GxVector4& GxVector4::getSubScalar(GxVector4& dst, const GxVector4& vector, f32 scalar)
3284{
3285 dst._x = vector._x - scalar;
3286 dst._y = vector._y - scalar;
3287 dst._z = vector._z - scalar;
3288 dst._w = vector._w - scalar;
3289
3290 return dst;
3291}
3292
3293//---------------------------------------------------------------------------
3294// スカラ乗算を取得
3299//---------------------------------------------------------------------------
3300GX_FORCE_INLINE const GxVector4& GxVector4::getMulScalar(GxVector4& dst, const GxVector4& vector, f32 scalar)
3301{
3302 dst._x = vector._x * scalar;
3303 dst._y = vector._y * scalar;
3304 dst._z = vector._z * scalar;
3305 dst._w = vector._w * scalar;
3306
3307 return dst;
3308}
3309
3310//---------------------------------------------------------------------------
3311// スカラ除算を取得
3316//---------------------------------------------------------------------------
3317GX_FORCE_INLINE const GxVector4& GxVector4::getDivScalar(GxVector4& dst, const GxVector4& vector, f32 scalar)
3318{
3319 auto inverseScalar = 1.0f / scalar;
3320
3321 dst._x = vector._x * inverseScalar;
3322 dst._y = vector._y * inverseScalar;
3323 dst._z = vector._z * inverseScalar;
3324 dst._w = vector._w * inverseScalar;
3325
3326 return dst;
3327}
3328
3329//---------------------------------------------------------------------------
3330// ベクトル加算を取得
3335//---------------------------------------------------------------------------
3336GX_FORCE_INLINE const GxVector4& GxVector4::getAddVector(GxVector4& dst, const GxVector4& vector0, const GxVector4& vector1)
3337{
3338 dst._x = vector0._x + vector1._x;
3339 dst._y = vector0._y + vector1._y;
3340 dst._z = vector0._z + vector1._z;
3341 dst._w = vector0._w + vector1._w;
3342
3343 return dst;
3344}
3345
3346//---------------------------------------------------------------------------
3347// ベクトル減算を取得
3352//---------------------------------------------------------------------------
3353GX_FORCE_INLINE const GxVector4& GxVector4::getSubVector(GxVector4& dst, const GxVector4& vector0, const GxVector4& vector1)
3354{
3355 dst._x = vector0._x - vector1._x;
3356 dst._y = vector0._y - vector1._y;
3357 dst._z = vector0._z - vector1._z;
3358 dst._w = vector0._w - vector1._w;
3359
3360 return dst;
3361}
3362
3363//---------------------------------------------------------------------------
3364// ベクトル乗算を取得
3369//---------------------------------------------------------------------------
3370GX_FORCE_INLINE const GxVector4& GxVector4::getMulVector(GxVector4& dst, const GxVector4& vector0, const GxVector4& vector1)
3371{
3372 dst._x = vector0._x * vector1._x;
3373 dst._y = vector0._y * vector1._y;
3374 dst._z = vector0._z * vector1._z;
3375 dst._w = vector0._w * vector1._w;
3376
3377 return dst;
3378}
3379
3380//---------------------------------------------------------------------------
3381// ベクトル除算を取得
3386//---------------------------------------------------------------------------
3387GX_FORCE_INLINE const GxVector4& GxVector4::getDivVector(GxVector4& dst, const GxVector4& vector0, const GxVector4& vector1)
3388{
3389 dst._x = vector0._x / vector1._x;
3390 dst._y = vector0._y / vector1._y;
3391 dst._z = vector0._z / vector1._z;
3392 dst._w = vector0._w / vector1._w;
3393
3394 return dst;
3395}
3396
3397//---------------------------------------------------------------------------
3398// 正規化ベクトルを取得
3402//---------------------------------------------------------------------------
3403GX_FORCE_INLINE const GxVector4& GxVector4::getNormalize(GxVector4& dst, const GxVector4& vector)
3404{
3405 auto length = vector.getLength();
3406
3407#if GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
3408 GX_ERROR(GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < length* length, "ゼロベクトルを正規化しようとしました");
3409
3410 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
3411 if (length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE)
3412 {
3413 length = 1.0f;
3414 }
3415#else //GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
3416 if( length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
3417 {
3418 GX_TRACE(GX_TRACE_CATEGORY_CORE, "%s(%d)", __FILE__, __LINE__);
3419 GX_TRACE(GX_TRACE_CATEGORY_CORE, "[%s]", __FUNCTION__);
3420 GX_TRACE(GX_TRACE_CATEGORY_CORE, "ゼロベクトルを正規化しようとしました");
3421
3422 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
3423 length = 1.0f;
3424 }
3425#endif // !GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
3426
3427 const auto inverseLength = 1.0f / length;
3428
3429 dst._x = vector._x * inverseLength;
3430 dst._y = vector._y * inverseLength;
3431 dst._z = vector._z * inverseLength;
3432 dst._w = vector._w * inverseLength;
3433
3434 return dst;
3435}
3436
3437//---------------------------------------------------------------------------
3438// 正規化ベクトルを取得(長さ0に対応)
3442//---------------------------------------------------------------------------
3443GX_FORCE_INLINE const GxVector4& GxVector4::getNormalizeEx(GxVector4& dst, const GxVector4& vector)
3444{
3445 const auto lengthSquare = vector.getLengthSquare();
3446
3447 if( GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < lengthSquare )
3448 {
3449 const auto inverseLength = 1.0f / GxMath::getSqrt(lengthSquare);
3450
3451 dst._x = vector._x * inverseLength;
3452 dst._y = vector._y * inverseLength;
3453 dst._z = vector._z * inverseLength;
3454 dst._w = vector._w * inverseLength;
3455 }
3456 else
3457 {
3458 dst._x = 0.0f;
3459 dst._y = 0.0f;
3460 dst._z = 0.0f;
3461 dst._w = 0.0f;
3462 }
3463
3464 return dst;
3465}
3466
3467//---------------------------------------------------------------------------
3468// 座標変換後のベクトルを取得
3473//---------------------------------------------------------------------------
3474GX_FORCE_INLINE const GxVector4& GxVector4::getTransform(GxVector4& dst, const GxVector4& vector, const GxMatrix44& matrix)
3475{
3476 dst._x = vector._x * matrix._m[0][0] + vector._y * matrix._m[1][0] + vector._z * matrix._m[2][0] + vector._w * matrix._m[3][0];
3477 dst._y = vector._x * matrix._m[0][1] + vector._y * matrix._m[1][1] + vector._z * matrix._m[2][1] + vector._w * matrix._m[3][1];
3478 dst._z = vector._x * matrix._m[0][2] + vector._y * matrix._m[1][2] + vector._z * matrix._m[2][2] + vector._w * matrix._m[3][2];
3479 dst._w = vector._x * matrix._m[0][3] + vector._y * matrix._m[1][3] + vector._z * matrix._m[2][3] + vector._w * matrix._m[3][3];
3480
3481 return dst;
3482}
3483
3484//---------------------------------------------------------------------------
3485// 内積を取得
3489//---------------------------------------------------------------------------
3490GX_FORCE_INLINE f32 GxVector4::getDot(const GxVector4& vector0, const GxVector4& vector1)
3491{
3492 return vector0._x * vector1._x + vector0._y * vector1._y + vector0._z * vector1._z + vector0._w * vector1._w;
3493}
3494
3495//---------------------------------------------------------------------------
3496// 要素毎に最小値を選択
3500//---------------------------------------------------------------------------
3501GX_FORCE_INLINE GxVector4 GxVector4::getMinimum(const GxVector4& vector0, const GxVector4& vector1)
3502{
3503 return GxVector4(vector0._x < vector1._x ? vector0._x : vector1._x,
3504 vector0._y < vector1._y ? vector0._y : vector1._y,
3505 vector0._z < vector1._z ? vector0._z : vector1._z,
3506 vector0._w < vector1._w ? vector0._w : vector1._w);
3507}
3508
3509//---------------------------------------------------------------------------
3510// 要素毎に最小値を選択
3515//---------------------------------------------------------------------------
3516GX_FORCE_INLINE const GxVector4& GxVector4::getMinimum(GxVector4& dst, const GxVector4& vector0, const GxVector4& vector1)
3517{
3518 dst._x = vector0._x < vector1._x ? vector0._x : vector1._x;
3519 dst._y = vector0._y < vector1._y ? vector0._y : vector1._y;
3520 dst._z = vector0._z < vector1._z ? vector0._z : vector1._z;
3521 dst._w = vector0._w < vector1._w ? vector0._w : vector1._w;
3522
3523 return dst;
3524}
3525
3526//---------------------------------------------------------------------------
3527// 要素毎に最大値を選択
3531//---------------------------------------------------------------------------
3532GX_FORCE_INLINE GxVector4 GxVector4::getMaximum(const GxVector4& vector0, const GxVector4& vector1)
3533{
3534 return GxVector4(vector0._x > vector1._x ? vector0._x : vector1._x,
3535 vector0._y > vector1._y ? vector0._y : vector1._y,
3536 vector0._z > vector1._z ? vector0._z : vector1._z,
3537 vector0._w > vector1._w ? vector0._w : vector1._w);
3538}
3539
3540//---------------------------------------------------------------------------
3541// 要素毎に最大値を選択
3546//---------------------------------------------------------------------------
3547GX_FORCE_INLINE const GxVector4& GxVector4::getMaximum(GxVector4& dst, const GxVector4& vector0, const GxVector4& vector1)
3548{
3549 dst._x = vector0._x > vector1._x ? vector0._x : vector1._x;
3550 dst._y = vector0._y > vector1._y ? vector0._y : vector1._y;
3551 dst._z = vector0._z > vector1._z ? vector0._z : vector1._z;
3552 dst._w = vector0._w > vector1._w ? vector0._w : vector1._w;
3553
3554 return dst;
3555}
3556
3557//---------------------------------------------------------------------------
3558// 線形補間
3563//---------------------------------------------------------------------------
3564GX_FORCE_INLINE GxVector4 GxVector4::getLerp(const GxVector4& vector0, const GxVector4& vector1, f32 t)
3565{
3566 return GxVector4(vector0._x + (vector1._x - vector0._x) * t,
3567 vector0._y + (vector1._y - vector0._y) * t,
3568 vector0._z + (vector1._z - vector0._z) * t,
3569 vector0._w + (vector1._w - vector0._w) * t);
3570}
3571
3572//---------------------------------------------------------------------------
3573// 線形補間
3579//---------------------------------------------------------------------------
3580GX_FORCE_INLINE const GxVector4& GxVector4::getLerp(GxVector4& dst, const GxVector4& vector0, const GxVector4& vector1, f32 t)
3581{
3582 dst._x = vector0._x + (vector1._x - vector0._x) * t;
3583 dst._y = vector0._y + (vector1._y - vector0._y) * t;
3584 dst._z = vector0._z + (vector1._z - vector0._z) * t;
3585 dst._w = vector0._w + (vector1._w - vector0._w) * t;
3586
3587 return dst;
3588}
3589
3590//---------------------------------------------------------------------------
3591// スカラ加算
3594//---------------------------------------------------------------------------
3595GX_FORCE_INLINE const GxVector4& GxVector4::addScalar(f32 scalar)
3596{
3597 _x += scalar;
3598 _y += scalar;
3599 _z += scalar;
3600 _w += scalar;
3601
3602 return *this;
3603}
3604
3605//---------------------------------------------------------------------------
3606// スカラ減算
3609//---------------------------------------------------------------------------
3610GX_FORCE_INLINE const GxVector4& GxVector4::subScalar(f32 scalar)
3611{
3612 _x -= scalar;
3613 _y -= scalar;
3614 _z -= scalar;
3615 _w -= scalar;
3616
3617 return *this;
3618}
3619
3620//---------------------------------------------------------------------------
3621// スカラ乗算
3624//---------------------------------------------------------------------------
3625GX_FORCE_INLINE const GxVector4& GxVector4::mulScalar(f32 scalar)
3626{
3627 _x *= scalar;
3628 _y *= scalar;
3629 _z *= scalar;
3630 _w *= scalar;
3631
3632 return *this;
3633}
3634
3635//---------------------------------------------------------------------------
3636// スカラ除算
3639//---------------------------------------------------------------------------
3640GX_FORCE_INLINE const GxVector4& GxVector4::divScalar(f32 scalar)
3641{
3642 auto inverseScalar = 1.0f / scalar;
3643
3644 _x *= inverseScalar;
3645 _y *= inverseScalar;
3646 _z *= inverseScalar;
3647 _w *= inverseScalar;
3648
3649 return *this;
3650}
3651
3652//---------------------------------------------------------------------------
3653// ベクトル加算
3656//---------------------------------------------------------------------------
3657GX_FORCE_INLINE const GxVector4& GxVector4::addVector(const GxVector4& vector)
3658{
3659 _x += vector._x;
3660 _y += vector._y;
3661 _z += vector._z;
3662 _w += vector._w;
3663
3664 return *this;
3665}
3666
3667//---------------------------------------------------------------------------
3668// ベクトル減算
3671//---------------------------------------------------------------------------
3672GX_FORCE_INLINE const GxVector4& GxVector4::subVector(const GxVector4& vector)
3673{
3674 _x -= vector._x;
3675 _y -= vector._y;
3676 _z -= vector._z;
3677 _w -= vector._w;
3678
3679 return *this;
3680}
3681
3682//---------------------------------------------------------------------------
3683// ベクトル乗算
3686//---------------------------------------------------------------------------
3687GX_FORCE_INLINE const GxVector4& GxVector4::mulVector(const GxVector4& vector)
3688{
3689 _x *= vector._x;
3690 _y *= vector._y;
3691 _z *= vector._z;
3692 _w *= vector._w;
3693
3694 return *this;
3695}
3696
3697//---------------------------------------------------------------------------
3698// ベクトル除算
3701//---------------------------------------------------------------------------
3702GX_FORCE_INLINE const GxVector4& GxVector4::divVector(const GxVector4& vector)
3703{
3704 _x /= vector._x;
3705 _y /= vector._y;
3706 _z /= vector._z;
3707 _w /= vector._w;
3708
3709 return *this;
3710}
3711
3712//---------------------------------------------------------------------------
3713// 正規化する
3715//---------------------------------------------------------------------------
3716GX_FORCE_INLINE const GxVector4& GxVector4::normalize(void)
3717{
3718 auto length = getLength();
3719
3720#if GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
3721 GX_ERROR(GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < length * length, "ゼロベクトルを正規化しようとしました");
3722
3723 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
3724 if (length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE)
3725 {
3726 length = 1.0f;
3727 }
3728#else //GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
3729 if( length * length <= GX_VECTOR_ZERO_VECTOR_CHECK_VALUE )
3730 {
3731 GX_TRACE(GX_TRACE_CATEGORY_CORE, "%s(%d)", __FILE__, __LINE__);
3732 GX_TRACE(GX_TRACE_CATEGORY_CORE, "[%s]", __FUNCTION__);
3733 GX_TRACE(GX_TRACE_CATEGORY_CORE, "ゼロベクトルを正規化しようとしました");
3734
3735 //このまま進んでしまうと0除算が発生したまま処理が進みINF等になるため1.0に補正
3736 length = 1.0f;
3737 }
3738#endif // !GX_VECTOR_ZERO_DIVIDE_WARNING_ENABLE
3739
3740 const auto inverseLength = 1.0f / length;
3741 _x *= inverseLength;
3742 _y *= inverseLength;
3743 _z *= inverseLength;
3744 _w *= inverseLength;
3745
3746 return *this;
3747}
3748
3749//---------------------------------------------------------------------------
3750// 正規化する(長さ0に対応)
3752//---------------------------------------------------------------------------
3753GX_FORCE_INLINE const GxVector4& GxVector4::normalizeEx(void)
3754{
3755 const auto lengthSquare = getLengthSquare();
3756
3757 if( GX_VECTOR_ZERO_VECTOR_CHECK_VALUE < lengthSquare )
3758 {
3759 const auto inverseLength = 1.0f / GxMath::getSqrt(lengthSquare);
3760 _x *= inverseLength;
3761 _y *= inverseLength;
3762 _z *= inverseLength;
3763 _w *= inverseLength;
3764 }
3765 else
3766 {
3767 _x = 0.0f;
3768 _y = 0.0f;
3769 _z = 0.0f;
3770 _w = 0.0f;
3771 }
3772
3773 return *this;
3774}
3775
3776//---------------------------------------------------------------------------
3777// 座標変換する
3780//---------------------------------------------------------------------------
3781GX_FORCE_INLINE const GxVector4& GxVector4::transform(const GxMatrix44& matrix)
3782{
3783 const auto x = _x * matrix._m[0][0] + _y * matrix._m[1][0] + _z * matrix._m[2][0] + _w * matrix._m[3][0];
3784 const auto y = _x * matrix._m[0][1] + _y * matrix._m[1][1] + _z * matrix._m[2][1] + _w * matrix._m[3][1];
3785 const auto z = _x * matrix._m[0][2] + _y * matrix._m[1][2] + _z * matrix._m[2][2] + _w * matrix._m[3][2];
3786 const auto w = _x * matrix._m[0][3] + _y * matrix._m[1][3] + _z * matrix._m[2][3] + _w * matrix._m[3][3];
3787
3788 _x = x;
3789 _y = y;
3790 _z = z;
3791 _w = w;
3792
3793 return *this;
3794}
3795
3796#undef GX_VECTOR_ZERO_VECTOR_CHECK_VALUE
3797
3798GX_CORE_NAMESPACE_END()
GX_FORCE_INLINE b32 operator!=(const GxVector2 &vector0, const GxVector2 &vector1)
Definition GxVector.inl:295
GX_FORCE_INLINE const GxVector2 operator/(const GxVector2 &vector, f32 scalar)
Definition GxVector.inl:224
GX_FORCE_INLINE b32 operator==(const GxVector2 &vector0, const GxVector2 &vector1)
Definition GxVector.inl:284
GX_FORCE_INLINE const GxVector2 operator*(const GxVector2 &vector, f32 scalar)
Definition GxVector.inl:200
GX_FORCE_INLINE const GxVector2 operator+(const GxVector2 &vector, f32 scalar)
Definition GxVector.inl:176
GX_FORCE_INLINE const GxVector2 operator-(const GxVector2 &vector, f32 scalar)
Definition GxVector.inl:188
static GX_FORCE_INLINE T getClamp(const T value, const T min, const T max)
最小値・最大値で切り落とす
Definition GxMath.h:170
static GX_FORCE_INLINE f32 getCos(const f32 radian)
余弦を取得(f32)
Definition GxMath.h:212
static GX_FORCE_INLINE f32 getACos(const f32 value)
逆余弦を取得(f32)
Definition GxMath.h:233
static GX_FORCE_INLINE f32 getATan2(const f32 valueY, const f32 valueX)
逆正接を取得(f32)
Definition GxMath.h:247
static GX_FORCE_INLINE f32 getSqrt(const f32 value)
平方根を取得(f32)
Definition GxMath.h:259
色(HDR)
Definition GxColor.h:241
2次元浮動小数点数クラス
Definition GxStruct.h:22
3次元浮動小数点数クラス
Definition GxStruct.h:91
f32 _y
Y値
Definition GxStruct.h:143
f32 _x
X値
Definition GxStruct.h:142
f32 _z
Z値
Definition GxStruct.h:144
4次元浮動小数点数クラス
Definition GxStruct.h:153
4×4行列(行優先)
Definition GxMatrix.h:607
f32 _m[4][4]
Definition GxMatrix.h:864
アフィン変換行列(行優先)
Definition GxMatrix.h:330
f32 _m[4][4]
Definition GxMatrix.h:597
座標
Definition GxStruct.h:867
クォータニオン
Definition GxQuaternion.h:19
GX_FORCE_INLINE GxQuaternion getConjugate(void) const
共役クォータニオンを取得
Definition GxQuaternion.inl:385
f32 _x
X値
Definition GxQuaternion.h:272
f32 _y
Y値
Definition GxQuaternion.h:273
f32 _z
Z値
Definition GxQuaternion.h:274
2次元ベクトル
Definition GxVector.h:34
GX_FORCE_INLINE const GxVector2 & normalize(void)
正規化する
Definition GxVector.inl:878
GX_FORCE_INLINE GxVector2 getNormalize(void) const
正規化ベクトルを取得
Definition GxVector.inl:408
static GX_FORCE_INLINE const GxVector2 & getAddScalar(GxVector2 &dst, const GxVector2 &vector, f32 scalar)
スカラ加算を取得
Definition GxVector.inl:464
GX_FORCE_INLINE const GxVector2 & addVector(const GxVector2 &vector)
ベクトル加算
Definition GxVector.inl:827
static GX_FORCE_INLINE GxVector2 getLerp(const GxVector2 &vector0, const GxVector2 &vector1, f32 t)
線形補間
Definition GxVector.inl:746
static GX_FORCE_INLINE f32 getCross(const GxVector2 &vector0, const GxVector2 &vector1)
外積を取得
Definition GxVector.inl:660
static GX_FORCE_INLINE const GxVector2 & getSubScalar(GxVector2 &dst, const GxVector2 &vector, f32 scalar)
スカラ減算を取得
Definition GxVector.inl:479
GX_FORCE_INLINE GxVector2 & operator-=(f32 scalar)
スカラ減算代入
Definition GxVector.inl:98
GX_FORCE_INLINE const GxVector2 & divVector(const GxVector2 &vector)
ベクトル除算
Definition GxVector.inl:866
static GX_FORCE_INLINE GxVector2 getMaximum(const GxVector2 &vector0, const GxVector2 &vector1)
要素毎に最大値を選択
Definition GxVector.inl:718
f32 _y
Y値
Definition GxVector.h:235
GX_FORCE_INLINE const f32 & operator[](u32 i) const
const配列
Definition GxVector.inl:305
GX_FORCE_INLINE f32 getLengthSquare(void) const
長さの2乗を取得
Definition GxVector.inl:342
GX_FORCE_INLINE GxVector2 getNormalizeEx(void) const
正規化ベクトルを取得(長さ0に対応)
Definition GxVector.inl:441
GxVector2(void)
デフォルトコンストラクタ
Definition GxVector.h:64
GX_FORCE_INLINE const GxVector2 & subScalar(f32 scalar)
スカラ減算
Definition GxVector.inl:786
GX_FORCE_INLINE GxVector2 & operator*=(f32 scalar)
スカラ乗算代入
Definition GxVector.inl:109
static const GxVector2 ZERO
(0, 0)
Definition GxVector.h:45
static GX_FORCE_INLINE const GxVector2 & getMulScalar(GxVector2 &dst, const GxVector2 &vector, f32 scalar)
スカラ乗算を取得
Definition GxVector.inl:494
GX_FORCE_INLINE void setLength(f32 length)
長さを設定
Definition GxVector.inl:351
GX_FORCE_INLINE const GxVector2 & addScalar(f32 scalar)
スカラ加算
Definition GxVector.inl:773
static GX_FORCE_INLINE f32 getAngle(const GxVector2 &vector0, const GxVector2 &vector1)
角度差を取得(符号つき radian)
Definition GxVector.inl:672
GX_FORCE_INLINE GxVector2 & operator+=(f32 scalar)
スカラ加算代入
Definition GxVector.inl:87
GX_FORCE_INLINE const GxVector2 & mulVector(const GxVector2 &vector)
ベクトル乗算
Definition GxVector.inl:853
f32 _x
X値
Definition GxVector.h:234
static GX_FORCE_INLINE const GxVector2 & getDivScalar(GxVector2 &dst, const GxVector2 &vector, f32 scalar)
スカラ除算を取得
Definition GxVector.inl:509
GX_FORCE_INLINE f32 getLength(void) const
長さを取得
Definition GxVector.inl:333
GX_FORCE_INLINE b32 isZeroVector(void) const
ゼロベクトルかを取得
Definition GxVector.inl:324
static GX_FORCE_INLINE f32 getDot(const GxVector2 &vector0, const GxVector2 &vector1)
内積を取得
Definition GxVector.inl:649
GX_FORCE_INLINE const GxVector2 & normalizeEx(void)
正規化する(長さ0に対応)
Definition GxVector.inl:914
GX_FORCE_INLINE const GxVector2 & subVector(const GxVector2 &vector)
ベクトル減算
Definition GxVector.inl:840
GX_FORCE_INLINE const GxVector2 & mulScalar(f32 scalar)
スカラ乗算
Definition GxVector.inl:799
GX_FORCE_INLINE GxVector2 & operator=(const GxVector2 &vector)
代入
Definition GxVector.inl:75
static GX_FORCE_INLINE const GxVector2 & getAddVector(GxVector2 &dst, const GxVector2 &vector0, const GxVector2 &vector1)
ベクトル加算を取得
Definition GxVector.inl:526
static GX_FORCE_INLINE const GxVector2 & getMulVector(GxVector2 &dst, const GxVector2 &vector0, const GxVector2 &vector1)
ベクトル乗算を取得
Definition GxVector.inl:556
GX_FORCE_INLINE void setLengthEx(f32 length)
長さを設定(長さ0に対応)
Definition GxVector.inl:386
GX_FORCE_INLINE GxVector2 & operator/=(f32 scalar)
スカラ除算代入
Definition GxVector.inl:120
GX_FORCE_INLINE const GxVector2 & divScalar(f32 scalar)
スカラ除算
Definition GxVector.inl:812
static GX_FORCE_INLINE const GxVector2 & getSubVector(GxVector2 &dst, const GxVector2 &vector0, const GxVector2 &vector1)
ベクトル減算を取得
Definition GxVector.inl:541
static GX_FORCE_INLINE const GxVector2 & getDivVector(GxVector2 &dst, const GxVector2 &vector0, const GxVector2 &vector1)
ベクトル除算を取得
Definition GxVector.inl:571
static GX_FORCE_INLINE GxVector2 getMinimum(const GxVector2 &vector0, const GxVector2 &vector1)
要素毎に最小値を選択
Definition GxVector.inl:691
3次元ベクトル
Definition GxVector.h:245
GX_FORCE_INLINE GxVector3 & operator=(const GxVector3 &vector)
代入
Definition GxVector.inl:1023
static GX_FORCE_INLINE b32 isSameDirectionLessEqual(const GxVector3 &vector0, const GxVector3 &vector1, f32 limitRadian=PI/2.0f)
ベクトルが同じ方向を向いているか(ラジアン指定/指定値以内なら(==も含む)同じ方向)
Definition GxVector.inl:2410
static GX_FORCE_INLINE const GxVector3 & getAddVector(GxVector3 &dst, const GxVector3 &vector0, const GxVector3 &vector1)
ベクトル加算を取得
Definition GxVector.inl:1821
GX_FORCE_INLINE f32 getTransformCoordX(const GxMatrix44 &matrix) const
w=1.0として座標変換後、wで除算したx成分を取得
Definition GxVector.inl:1628
static GX_FORCE_INLINE GxVector3 getMaximum(const GxVector3 &vector0, const GxVector3 &vector1)
要素毎に最大値を選択
Definition GxVector.inl:2263
GX_FORCE_INLINE f32 getTransformX(const GxMatrix44 &matrix) const
w=1.0として座標変換したx成分を取得
Definition GxVector.inl:1588
static GX_FORCE_INLINE GxVector3 getLinePosition(const GxVector3 &position, const GxVector3 &linePosition0, const GxVector3 &linePosition1)
指定した点を直線上に下ろした点を取得
Definition GxVector.inl:2365
static GX_FORCE_INLINE const GxVector3 & getDivScalar(GxVector3 &dst, const GxVector3 &vector, f32 scalar)
スカラ除算を取得
Definition GxVector.inl:1803
GX_FORCE_INLINE GxVector3 getRotate(const GxQuaternion &quaternion) const
回転後のベクトルを取得
Definition GxVector.inl:1741
GX_FORCE_INLINE const GxVector3 & divVector(const GxVector3 &vector)
ベクトル除算
Definition GxVector.inl:2578
GX_FORCE_INLINE const f32 & operator[](u32 i) const
const配列
Definition GxVector.inl:1254
GX_FORCE_INLINE const GxVector3 & rotate(const GxQuaternion &quaternion)
回転する
Definition GxVector.inl:2746
static GX_FORCE_INLINE GxVector3 getLerp(const GxVector3 &vector0, const GxVector3 &vector1, f32 t)
線形補間
Definition GxVector.inl:2293
static GX_FORCE_INLINE GxVector3 getSegmentPosition(const GxVector3 &position, const GxVector3 &startPosition, const GxVector3 &endPosition)
指定した点を線分上に下ろした点を取得
Definition GxVector.inl:2395
f32 _z
Z値
Definition GxVector.h:572
GX_FORCE_INLINE GxVector3 getTransform(const GxMatrix44 &matrix) const
w=1.0として座標変換したベクトルを取得
Definition GxVector.inl:1521
static GX_FORCE_INLINE f32 getAngle(const GxVector3 &vector0, const GxVector3 &vector1)
角度差を取得(符号なし radian)
Definition GxVector.inl:2190
GX_FORCE_INLINE const GxVector3 & divScalar(f32 scalar)
スカラ除算
Definition GxVector.inl:2520
GX_FORCE_INLINE const GxVector3 & transform(const GxMatrix44 &matrix)
w=1.0として座標変換
Definition GxVector.inl:2655
GX_FORCE_INLINE b32 isZeroVector(void) const
ゼロベクトルかを取得
Definition GxVector.inl:1374
GX_FORCE_INLINE void setLengthEx(f32 length)
長さを設定(長さ0に対応)
Definition GxVector.inl:1437
f32 _y
Y値
Definition GxVector.h:571
GX_FORCE_INLINE const GxVector3 & mulVector(const GxVector3 &vector)
ベクトル乗算
Definition GxVector.inl:2564
GX_FORCE_INLINE const GxVector3 & transformNormal(const GxMatrix44 &matrix)
w=0.0として座標変換
Definition GxVector.inl:2691
GxVector3(void)
デフォルトコンストラクタ
Definition GxVector.h:277
static GX_FORCE_INLINE const GxVector3 & getSubScalar(GxVector3 &dst, const GxVector3 &vector, f32 scalar)
スカラ減算を取得
Definition GxVector.inl:1771
GX_FORCE_INLINE GxVector3 getNormalizeEx(void) const
正規化ベクトルを取得(長さ0に対応)
Definition GxVector.inl:1494
GX_FORCE_INLINE f32 getTransformCoordZ(const GxMatrix44 &matrix) const
w=1.0として座標変換後、wで除算したz成分を取得
Definition GxVector.inl:1730
GX_FORCE_INLINE f32 getTransformZ(const GxMatrix44 &matrix) const
w=1.0として座標変換したz成分を取得
Definition GxVector.inl:1690
GX_FORCE_INLINE const GxVector3 & subVector(const GxVector3 &vector)
ベクトル減算
Definition GxVector.inl:2550
GX_FORCE_INLINE void setXZ(const GxVector3 &vector)
XZ要素のベクトルを設定
Definition GxVector.inl:1331
GX_FORCE_INLINE void setYZ(const GxVector3 &vector)
YZ要素のベクトルを設定
Definition GxVector.inl:1364
GX_FORCE_INLINE f32 getLengthSquare(void) const
長さの2乗を取得
Definition GxVector.inl:1392
GX_FORCE_INLINE GxVector3 getNormalize(void) const
正規化ベクトルを取得
Definition GxVector.inl:1461
GX_FORCE_INLINE f32 getTransformY(const GxMatrix44 &matrix) const
w=1.0として座標変換したy成分を取得
Definition GxVector.inl:1639
GX_FORCE_INLINE GxVector3 getYZ(void) const
YZ要素のベクトルを取得
Definition GxVector.inl:1341
static GX_FORCE_INLINE const GxVector3 & getMulScalar(GxVector3 &dst, const GxVector3 &vector, f32 scalar)
スカラ乗算を取得
Definition GxVector.inl:1787
GX_FORCE_INLINE GxVector3 & operator/=(f32 scalar)
スカラ除算代入
Definition GxVector.inl:1069
GX_FORCE_INLINE f32 getTransformNormalZ(const GxMatrix44 &matrix) const
w=0.0として座標変換したz成分を取得
Definition GxVector.inl:1710
GX_FORCE_INLINE GxVector3 getTransformNormal(const GxMatrix44 &matrix) const
w=0.0として座標変換したベクトルを取得
Definition GxVector.inl:1547
GX_FORCE_INLINE const GxVector3 & addVector(const GxVector3 &vector)
ベクトル加算
Definition GxVector.inl:2536
static GX_FORCE_INLINE const GxVector3 & getAddScalar(GxVector3 &dst, const GxVector3 &vector, f32 scalar)
スカラ加算を取得
Definition GxVector.inl:1755
GX_FORCE_INLINE const GxVector3 & normalizeEx(void)
正規化する(長さ0に対応)
Definition GxVector.inl:2628
static GX_FORCE_INLINE const GxVector3 & getSubVector(GxVector3 &dst, const GxVector3 &vector0, const GxVector3 &vector1)
ベクトル減算を取得
Definition GxVector.inl:1837
GX_FORCE_INLINE GxVector3 getXY(void) const
XY要素のベクトルを取得
Definition GxVector.inl:1273
static GX_FORCE_INLINE GxVector3 getCrossVector(const GxVector3 &vector)
直交する単位ベクトルを取得
Definition GxVector.inl:2122
GX_FORCE_INLINE const GxVector3 & addScalar(f32 scalar)
スカラ加算
Definition GxVector.inl:2478
GX_FORCE_INLINE f32 getLength(void) const
長さを取得
Definition GxVector.inl:1383
static GX_FORCE_INLINE f32 getLineParam(const GxVector3 &checkPosition, const GxVector3 &startPosition, const GxVector3 &endPosition)
指定した点が線分上のどこに位置するかのパラメータを返す
Definition GxVector.inl:2327
GX_FORCE_INLINE GxVector3 & operator-=(f32 scalar)
スカラ減算代入
Definition GxVector.inl:1047
GX_FORCE_INLINE f32 getTransformNormalY(const GxMatrix44 &matrix) const
w=0.0として座標変換したy成分を取得
Definition GxVector.inl:1659
static GX_FORCE_INLINE const GxVector3 & getMulVector(GxVector3 &dst, const GxVector3 &vector0, const GxVector3 &vector1)
ベクトル乗算を取得
Definition GxVector.inl:1853
GX_FORCE_INLINE GxVector3 getXZ(void) const
XZ要素のベクトルを取得
Definition GxVector.inl:1307
GX_FORCE_INLINE const GxVector3 & normalize(void)
正規化する
Definition GxVector.inl:2591
static GX_FORCE_INLINE f32 getDistanceSquare(const GxVector3 &vector0, const GxVector3 &vector1)
距離の2乗を取得
Definition GxVector.inl:2174
GX_FORCE_INLINE GxVector3 & operator+=(f32 scalar)
スカラ加算代入
Definition GxVector.inl:1036
static GX_FORCE_INLINE const GxVector3 & getDivVector(GxVector3 &dst, const GxVector3 &vector0, const GxVector3 &vector1)
ベクトル除算を取得
Definition GxVector.inl:1869
GX_FORCE_INLINE void setXY(const GxVector3 &vector)
XY要素のベクトルを設定
Definition GxVector.inl:1297
static GX_FORCE_INLINE f32 getDistance(const GxVector3 &vector0, const GxVector3 &vector1)
距離を取得
Definition GxVector.inl:2163
GX_FORCE_INLINE const GxVector3 & transformCoord(const GxMatrix44 &matrix)
w=1.0として座標変換後、wで割る
Definition GxVector.inl:2727
GX_FORCE_INLINE GxVector3 & operator*=(f32 scalar)
スカラ乗算代入
Definition GxVector.inl:1058
GX_FORCE_INLINE GxVector3 getTransformCoord(const GxMatrix44 &matrix) const
w=1.0として座標変換後、wで除算したベクトルを取得
Definition GxVector.inl:1573
static GX_FORCE_INLINE f32 getDot(const GxVector3 &vector0, const GxVector3 &vector1)
内積を取得
Definition GxVector.inl:2083
static GX_FORCE_INLINE GxVector3 getCross(const GxVector3 &vector0, const GxVector3 &vector1)
外積を取得
Definition GxVector.inl:2094
static GX_FORCE_INLINE GxVector3 getMinimum(const GxVector3 &vector0, const GxVector3 &vector1)
要素毎に最小値を選択
Definition GxVector.inl:2234
GX_FORCE_INLINE const GxVector3 & mulScalar(f32 scalar)
スカラ乗算
Definition GxVector.inl:2506
f32 _x
X値
Definition GxVector.h:570
GX_FORCE_INLINE f32 getTransformNormalX(const GxMatrix44 &matrix) const
w=0.0として座標変換したx成分を取得
Definition GxVector.inl:1608
static GX_FORCE_INLINE b32 isSameDirectionLessThan(const GxVector3 &vector0, const GxVector3 &vector1, f32 limitRadian=PI/2.0f)
ベクトルが同じ方向を向いているか(ラジアン指定/指定値より小さければ(==は含まない)同じ方向)
Definition GxVector.inl:2445
GX_FORCE_INLINE f32 getTransformCoordY(const GxMatrix44 &matrix) const
w=1.0として座標変換後、wで除算したy成分を取得
Definition GxVector.inl:1679
GX_FORCE_INLINE void setLength(f32 length)
長さを設定
Definition GxVector.inl:1401
GX_FORCE_INLINE const GxVector3 & subScalar(f32 scalar)
スカラ減算
Definition GxVector.inl:2492
4次元ベクトル
Definition GxVector.h:582
f32 _x
X値
Definition GxVector.h:793
static GX_FORCE_INLINE const GxVector4 & getDivScalar(GxVector4 &dst, const GxVector4 &vector, f32 scalar)
スカラ除算を取得
Definition GxVector.inl:3317
GX_FORCE_INLINE GxVector4 & operator+=(f32 scalar)
スカラ加算代入
Definition GxVector.inl:2872
GX_FORCE_INLINE GxVector4 getNormalizeEx(void) const
正規化ベクトルを取得(長さ0に対応)
Definition GxVector.inl:3233
f32 _w
W値
Definition GxVector.h:796
GX_FORCE_INLINE GxVector4 getNormalize(void) const
正規化ベクトルを取得
Definition GxVector.inl:3200
static GX_FORCE_INLINE const GxVector4 & getAddVector(GxVector4 &dst, const GxVector4 &vector0, const GxVector4 &vector1)
ベクトル加算を取得
Definition GxVector.inl:3336
static GX_FORCE_INLINE const GxVector4 & getAddScalar(GxVector4 &dst, const GxVector4 &vector, f32 scalar)
スカラ加算を取得
Definition GxVector.inl:3266
GxVector4(void)
デフォルトコンストラクタ
Definition GxVector.h:616
static const GxVector4 ZERO
(0, 0, 0, 0)
Definition GxVector.h:593
static GX_FORCE_INLINE GxVector4 getLerp(const GxVector4 &vector0, const GxVector4 &vector1, f32 t)
線形補間
Definition GxVector.inl:3564
GX_FORCE_INLINE const GxVector4 & mulScalar(f32 scalar)
スカラ乗算
Definition GxVector.inl:3625
GX_FORCE_INLINE const GxVector4 & subVector(const GxVector4 &vector)
ベクトル減算
Definition GxVector.inl:3672
GX_FORCE_INLINE const f32 & operator[](u32 i) const
const配列
Definition GxVector.inl:3090
static GX_FORCE_INLINE const GxVector4 & getMulVector(GxVector4 &dst, const GxVector4 &vector0, const GxVector4 &vector1)
ベクトル乗算を取得
Definition GxVector.inl:3370
GX_FORCE_INLINE f32 getLength(void) const
長さを取得
Definition GxVector.inl:3118
GX_FORCE_INLINE const GxVector4 getTransform(const GxMatrix44 &matrix) const
座標変換後のベクトルを取得
Definition GxVector.inl:3250
GX_FORCE_INLINE f32 getLengthSquare(void) const
長さの2乗を取得
Definition GxVector.inl:3127
GX_FORCE_INLINE GxVector4 & operator-=(f32 scalar)
スカラ減算代入
Definition GxVector.inl:2883
static GX_FORCE_INLINE const GxVector4 & getSubVector(GxVector4 &dst, const GxVector4 &vector0, const GxVector4 &vector1)
ベクトル減算を取得
Definition GxVector.inl:3353
static GX_FORCE_INLINE GxVector4 getMinimum(const GxVector4 &vector0, const GxVector4 &vector1)
要素毎に最小値を選択
Definition GxVector.inl:3501
GX_FORCE_INLINE const GxVector4 & normalize(void)
正規化する
Definition GxVector.inl:3716
GX_FORCE_INLINE const GxVector4 & subScalar(f32 scalar)
スカラ減算
Definition GxVector.inl:3610
static GX_FORCE_INLINE const GxVector4 & getDivVector(GxVector4 &dst, const GxVector4 &vector0, const GxVector4 &vector1)
ベクトル除算を取得
Definition GxVector.inl:3387
GX_FORCE_INLINE const GxVector4 & mulVector(const GxVector4 &vector)
ベクトル乗算
Definition GxVector.inl:3687
GX_FORCE_INLINE void setLength(f32 length)
長さを設定
Definition GxVector.inl:3137
GX_FORCE_INLINE GxVector4 & operator=(const GxVector3 &vector)
代入
Definition GxVector.inl:2844
f32 _y
Y値
Definition GxVector.h:794
static GX_FORCE_INLINE const GxVector4 & getSubScalar(GxVector4 &dst, const GxVector4 &vector, f32 scalar)
スカラ減算を取得
Definition GxVector.inl:3283
GX_FORCE_INLINE void setLengthEx(f32 length)
長さを設定(長さ0に対応)
Definition GxVector.inl:3174
GX_FORCE_INLINE const GxVector4 & divScalar(f32 scalar)
スカラ除算
Definition GxVector.inl:3640
GX_FORCE_INLINE const GxVector4 & addVector(const GxVector4 &vector)
ベクトル加算
Definition GxVector.inl:3657
static GX_FORCE_INLINE f32 getDot(const GxVector4 &vector0, const GxVector4 &vector1)
内積を取得
Definition GxVector.inl:3490
static GX_FORCE_INLINE const GxVector4 & getMulScalar(GxVector4 &dst, const GxVector4 &vector, f32 scalar)
スカラ乗算を取得
Definition GxVector.inl:3300
GX_FORCE_INLINE b32 isZeroVector(void) const
ゼロベクトルかを取得
Definition GxVector.inl:3109
GX_FORCE_INLINE GxVector4 & operator*=(f32 scalar)
スカラ乗算代入
Definition GxVector.inl:2894
static GX_FORCE_INLINE GxVector4 getMaximum(const GxVector4 &vector0, const GxVector4 &vector1)
要素毎に最大値を選択
Definition GxVector.inl:3532
GX_FORCE_INLINE const GxVector4 & divVector(const GxVector4 &vector)
ベクトル除算
Definition GxVector.inl:3702
GX_FORCE_INLINE const GxVector4 & addScalar(f32 scalar)
スカラ加算
Definition GxVector.inl:3595
GX_FORCE_INLINE GxVector4 & operator/=(f32 scalar)
スカラ除算代入
Definition GxVector.inl:2905
f32 _z
Z値
Definition GxVector.h:795
GX_FORCE_INLINE const GxVector4 & normalizeEx(void)
正規化する(長さ0に対応)
Definition GxVector.inl:3753
GX_FORCE_INLINE const GxVector4 & transform(const GxMatrix44 &matrix)
座標変換する
Definition GxVector.inl:3781
32bitブーリアン
Definition GxDefine.h:173