2
Copyright (C) 2006, 2007 Sony Computer Entertainment Inc.
5
Redistribution and use in source and binary forms,
6
with or without modification, are permitted provided that the
7
following conditions are met:
8
* Redistributions of source code must retain the above copyright
9
notice, this list of conditions and the following disclaimer.
10
* Redistributions in binary form must reproduce the above copyright
11
notice, this list of conditions and the following disclaimer in the
12
documentation and/or other materials provided with the distribution.
13
* Neither the name of the Sony Computer Entertainment Inc nor the names
14
of its contributors may be used to endorse or promote products derived
15
from this software without specific prior written permission.
17
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
POSSIBILITY OF SUCH DAMAGE.
35
namespace Vectormath {
39
//--------------------------------------------------------------------------------------------------
48
inline boolInVec(__m128 vec);
52
// matches standard type conversions
54
inline boolInVec(const floatInVec &vec);
56
// explicit cast from bool
58
explicit inline boolInVec(bool scalar);
60
#ifdef _VECTORMATH_NO_SCALAR_CAST
61
// explicit cast to bool
63
inline bool getAsBool() const;
65
// implicit cast to bool
67
inline operator bool() const;
71
// bool value is splatted across all word slots of vector as 0 (false) or -1 (true)
73
inline __m128 get128() const;
77
inline const boolInVec operator ! () const;
78
inline boolInVec& operator = (const boolInVec &vec);
79
inline boolInVec& operator &= (const boolInVec &vec);
80
inline boolInVec& operator ^= (const boolInVec &vec);
81
inline boolInVec& operator |= (const boolInVec &vec);
85
friend inline const boolInVec operator == (const boolInVec &vec0, const boolInVec &vec1);
86
friend inline const boolInVec operator != (const boolInVec &vec0, const boolInVec &vec1);
87
friend inline const boolInVec operator < (const floatInVec &vec0, const floatInVec &vec1);
88
friend inline const boolInVec operator <= (const floatInVec &vec0, const floatInVec &vec1);
89
friend inline const boolInVec operator > (const floatInVec &vec0, const floatInVec &vec1);
90
friend inline const boolInVec operator >= (const floatInVec &vec0, const floatInVec &vec1);
91
friend inline const boolInVec operator == (const floatInVec &vec0, const floatInVec &vec1);
92
friend inline const boolInVec operator != (const floatInVec &vec0, const floatInVec &vec1);
93
friend inline const boolInVec operator & (const boolInVec &vec0, const boolInVec &vec1);
94
friend inline const boolInVec operator ^ (const boolInVec &vec0, const boolInVec &vec1);
95
friend inline const boolInVec operator | (const boolInVec &vec0, const boolInVec &vec1);
96
friend inline const boolInVec select(const boolInVec &vec0, const boolInVec &vec1, const boolInVec &select_vec1);
99
//--------------------------------------------------------------------------------------------------
100
// boolInVec functions
105
inline const boolInVec operator == (const boolInVec &vec0, const boolInVec &vec1);
106
inline const boolInVec operator != (const boolInVec &vec0, const boolInVec &vec1);
107
inline const boolInVec operator & (const boolInVec &vec0, const boolInVec &vec1);
108
inline const boolInVec operator ^ (const boolInVec &vec0, const boolInVec &vec1);
109
inline const boolInVec operator | (const boolInVec &vec0, const boolInVec &vec1);
111
// select between vec0 and vec1 using boolInVec.
112
// false selects vec0, true selects vec1
114
inline const boolInVec select(const boolInVec &vec0, const boolInVec &vec1, const boolInVec &select_vec1);
116
} // namespace Vectormath
118
//--------------------------------------------------------------------------------------------------
119
// boolInVec implementation
122
#include "floatInVec.h"
124
namespace Vectormath {
127
boolInVec::boolInVec(__m128 vec)
133
boolInVec::boolInVec(const floatInVec &vec)
135
*this = (vec != floatInVec(0.0f));
139
boolInVec::boolInVec(bool scalar)
141
unsigned int mask = -(int)scalar;
142
mData = _mm_set1_ps(*(float *)&mask); // TODO: Union
145
#ifdef _VECTORMATH_NO_SCALAR_CAST
148
boolInVec::getAsBool() const
151
boolInVec::operator bool() const
154
return *(bool *)&mData;
159
boolInVec::get128() const
166
boolInVec::operator ! () const
168
return boolInVec(_mm_andnot_ps(mData, _mm_cmpneq_ps(_mm_setzero_ps(),_mm_setzero_ps())));
173
boolInVec::operator = (const boolInVec &vec)
181
boolInVec::operator &= (const boolInVec &vec)
189
boolInVec::operator ^= (const boolInVec &vec)
197
boolInVec::operator |= (const boolInVec &vec)
205
operator == (const boolInVec &vec0, const boolInVec &vec1)
207
return boolInVec(_mm_cmpeq_ps(vec0.get128(), vec1.get128()));
212
operator != (const boolInVec &vec0, const boolInVec &vec1)
214
return boolInVec(_mm_cmpneq_ps(vec0.get128(), vec1.get128()));
219
operator & (const boolInVec &vec0, const boolInVec &vec1)
221
return boolInVec(_mm_and_ps(vec0.get128(), vec1.get128()));
226
operator | (const boolInVec &vec0, const boolInVec &vec1)
228
return boolInVec(_mm_or_ps(vec0.get128(), vec1.get128()));
233
operator ^ (const boolInVec &vec0, const boolInVec &vec1)
235
return boolInVec(_mm_xor_ps(vec0.get128(), vec1.get128()));
240
select(const boolInVec &vec0, const boolInVec &vec1, const boolInVec &select_vec1)
242
return boolInVec(vec_sel(vec0.get128(), vec1.get128(), select_vec1.get128()));
245
} // namespace Vectormath
247
#endif // boolInVec_h