Plasma Engine  2.0
Loading...
Searching...
No Matches
FPUVec4b_inl.h
1#pragma once
2
3PL_ALWAYS_INLINE plSimdVec4b::plSimdVec4b() {}
4
5PL_ALWAYS_INLINE plSimdVec4b::plSimdVec4b(bool b)
6{
7 m_v.x = b ? 0xFFFFFFFF : 0;
8 m_v.y = b ? 0xFFFFFFFF : 0;
9 m_v.z = b ? 0xFFFFFFFF : 0;
10 m_v.w = b ? 0xFFFFFFFF : 0;
11}
12
13PL_ALWAYS_INLINE plSimdVec4b::plSimdVec4b(bool x, bool y, bool z, bool w)
14{
15 m_v.x = x ? 0xFFFFFFFF : 0;
16 m_v.y = y ? 0xFFFFFFFF : 0;
17 m_v.z = z ? 0xFFFFFFFF : 0;
18 m_v.w = w ? 0xFFFFFFFF : 0;
19}
20
21PL_ALWAYS_INLINE plSimdVec4b::plSimdVec4b(plInternal::QuadBool v)
22{
23 m_v = v;
24}
25
26template <int N>
27PL_ALWAYS_INLINE bool plSimdVec4b::GetComponent() const
28{
29 return (&m_v.x)[N] != 0;
30}
31
32PL_ALWAYS_INLINE bool plSimdVec4b::x() const
33{
34 return m_v.x != 0;
35}
36
37PL_ALWAYS_INLINE bool plSimdVec4b::y() const
38{
39 return m_v.y != 0;
40}
41
42PL_ALWAYS_INLINE bool plSimdVec4b::z() const
43{
44 return m_v.z != 0;
45}
46
47PL_ALWAYS_INLINE bool plSimdVec4b::w() const
48{
49 return m_v.w != 0;
50}
51
52template <plSwizzle::Enum s>
53PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::Get() const
54{
55 plSimdVec4b result;
56
57 const plUInt32* v = &m_v.x;
58 result.m_v.x = v[(s & 0x3000) >> 12];
59 result.m_v.y = v[(s & 0x0300) >> 8];
60 result.m_v.z = v[(s & 0x0030) >> 4];
61 result.m_v.w = v[(s & 0x0003)];
62
63 return result;
64}
65
66PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator&&(const plSimdVec4b& rhs) const
67{
68 plSimdVec4b result;
69 result.m_v.x = m_v.x & rhs.m_v.x;
70 result.m_v.y = m_v.y & rhs.m_v.y;
71 result.m_v.z = m_v.z & rhs.m_v.z;
72 result.m_v.w = m_v.w & rhs.m_v.w;
73
74 return result;
75}
76
77PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator||(const plSimdVec4b& rhs) const
78{
79 plSimdVec4b result;
80 result.m_v.x = m_v.x | rhs.m_v.x;
81 result.m_v.y = m_v.y | rhs.m_v.y;
82 result.m_v.z = m_v.z | rhs.m_v.z;
83 result.m_v.w = m_v.w | rhs.m_v.w;
84
85 return result;
86}
87
88PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator!() const
89{
90 plSimdVec4b result;
91 result.m_v.x = m_v.x ^ 0xFFFFFFFF;
92 result.m_v.y = m_v.y ^ 0xFFFFFFFF;
93 result.m_v.z = m_v.z ^ 0xFFFFFFFF;
94 result.m_v.w = m_v.w ^ 0xFFFFFFFF;
95
96 return result;
97}
98
99PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator==(const plSimdVec4b& rhs) const
100{
101 return !(*this != rhs);
102}
103
104PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator!=(const plSimdVec4b& rhs) const
105{
106 plSimdVec4b result;
107 result.m_v.x = m_v.x ^ rhs.m_v.x;
108 result.m_v.y = m_v.y ^ rhs.m_v.y;
109 result.m_v.z = m_v.z ^ rhs.m_v.z;
110 result.m_v.w = m_v.w ^ rhs.m_v.w;
111
112 return result;
113}
114
115template <int N>
116PL_ALWAYS_INLINE bool plSimdVec4b::AllSet() const
117{
118 for (int i = 0; i < N; ++i)
119 {
120 if (!(&m_v.x)[i])
121 return false;
122 }
123
124 return true;
125}
126
127template <int N>
128PL_ALWAYS_INLINE bool plSimdVec4b::AnySet() const
129{
130 for (int i = 0; i < N; ++i)
131 {
132 if ((&m_v.x)[i])
133 return true;
134 }
135
136 return false;
137}
138
139template <int N>
140PL_ALWAYS_INLINE bool plSimdVec4b::NoneSet() const
141{
142 return !AnySet<N>();
143}
144
145// static
146PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::Select(const plSimdVec4b& cmp, const plSimdVec4b& ifTrue, const plSimdVec4b& ifFalse)
147{
148 plSimdVec4b result;
149 result.m_v.x = (cmp.m_v.x != 0) ? ifTrue.m_v.x : ifFalse.m_v.x;
150 result.m_v.y = (cmp.m_v.y != 0) ? ifTrue.m_v.y : ifFalse.m_v.y;
151 result.m_v.z = (cmp.m_v.z != 0) ? ifTrue.m_v.z : ifFalse.m_v.z;
152 result.m_v.w = (cmp.m_v.w != 0) ? ifTrue.m_v.w : ifFalse.m_v.w;
153
154 return result;
155}
Definition SimdVec4b.h:7
A 4-component vector class.
Definition Vec4.h:9