main sync #3

Merged
Patrick Busch merged 318 commits from blender/blender:main into main 2023-03-17 15:52:21 +01:00
2 changed files with 46 additions and 2 deletions
Showing only changes of commit a736f1d638 - Show all commits

View File

@ -79,6 +79,9 @@ template<typename T> uint64_t vector_hash(const T &vec)
template<typename T, int Size> struct VecBase : public vec_struct_base<T, Size> { template<typename T, int Size> struct VecBase : public vec_struct_base<T, Size> {
BLI_STATIC_ASSERT(alignof(T) <= sizeof(T),
"VecBase is not compatible with aligned type for now.");
static constexpr int type_length = Size; static constexpr int type_length = Size;
using base_type = T; using base_type = T;
@ -176,16 +179,36 @@ template<typename T, int Size> struct VecBase : public vec_struct_base<T, Size>
/** Swizzling. */ /** Swizzling. */
template<BLI_ENABLE_IF_VEC(Size, >= 3)> VecBase<T, 2> xy() const template<BLI_ENABLE_IF_VEC(Size, >= 2)> VecBase<T, 2> xy() const
{ {
return *reinterpret_cast<const VecBase<T, 2> *>(this); return *reinterpret_cast<const VecBase<T, 2> *>(this);
} }
template<BLI_ENABLE_IF_VEC(Size, >= 4)> VecBase<T, 3> xyz() const template<BLI_ENABLE_IF_VEC(Size, >= 3)> VecBase<T, 2> yz() const
{
return *reinterpret_cast<const VecBase<T, 2> *>(&((*this)[1]));
}
template<BLI_ENABLE_IF_VEC(Size, >= 4)> VecBase<T, 2> zw() const
{
return *reinterpret_cast<const VecBase<T, 2> *>(&((*this)[2]));
}
template<BLI_ENABLE_IF_VEC(Size, >= 3)> VecBase<T, 3> xyz() const
{ {
return *reinterpret_cast<const VecBase<T, 3> *>(this); return *reinterpret_cast<const VecBase<T, 3> *>(this);
} }
template<BLI_ENABLE_IF_VEC(Size, >= 4)> VecBase<T, 3> yzw() const
{
return *reinterpret_cast<const VecBase<T, 3> *>(&((*this)[1]));
}
template<BLI_ENABLE_IF_VEC(Size, >= 4)> VecBase<T, 4> xyzw() const
{
return *reinterpret_cast<const VecBase<T, 4> *>(this);
}
#undef BLI_ENABLE_IF_VEC #undef BLI_ENABLE_IF_VEC
/** Conversion from pointers (from C-style vectors). */ /** Conversion from pointers (from C-style vectors). */

View File

@ -259,4 +259,25 @@ TEST(math_vec_types, DivideFloatByVectorSmall)
EXPECT_FLOAT_EQ(result.y, 1.0f); EXPECT_FLOAT_EQ(result.y, 1.0f);
} }
TEST(math_vec_types, SwizzleReinterpret)
{
const float2 v01(0, 1);
const float2 v12(1, 2);
const float2 v23(2, 3);
const float3 v012(0, 1, 2);
const float3 v123(1, 2, 3);
const float4 v0123(0, 1, 2, 3);
/* Identity. */
EXPECT_EQ(v01.xy(), v01);
EXPECT_EQ(v012.xyz(), v012);
EXPECT_EQ(v0123.xyzw(), v0123);
/* Masking. */
EXPECT_EQ(v012.xy(), v01);
EXPECT_EQ(v0123.xyz(), v012);
/* Offset. */
EXPECT_EQ(v0123.yz(), v12);
EXPECT_EQ(v0123.zw(), v23);
EXPECT_EQ(v0123.yzw(), v123);
}
} // namespace blender::tests } // namespace blender::tests