소스 검색

math: fix a nasty bug involving swizzling vectors, add two safeguards so

that it never happens again, and unit tests in case it happens again.
undefined
Sam Hocevar 10 년 전
부모
커밋
7babf9dfde
3개의 변경된 파일38개의 추가작업 그리고 1개의 파일을 삭제
  1. +1
    -1
      src/lol/math/ops.h
  2. +7
    -0
      src/lol/math/vector.h
  3. +30
    -0
      test/unit/vector.cpp

+ 1
- 1
src/lol/math/ops.h 파일 보기

@@ -78,7 +78,7 @@ static inline typename std::enable_if<SWIZZLE1 != FULL_SWIZZLE || SWIZZLE2 != FU
\
template<typename T, int N, int SWIZZLE> \
inline typename std::enable_if<SWIZZLE != FULL_SWIZZLE,vec_t<T,N>>::type \
operator op(vec_t<T,N,SWIZZLE> a, T const &b) \
operator op(vec_t<T,N,SWIZZLE> const &a, T const &b) \
{ \
return vec_t<T,N>(a) op b; \
}


+ 7
- 0
src/lol/math/vector.h 파일 보기

@@ -81,6 +81,13 @@ struct vec_t
int i = (SWIZZLE >> (4 * (N - 1 - n))) & 3;
return static_cast<T const*>(static_cast<void const *>(this))[i];
}

private:
/* Disable all default constructors and destructors; this object
* is only intended to exist as part of a union. */
vec_t();
vec_t(vec_t<T, N, SWIZZLE> const &);
~vec_t();
};

/* The generic “vec_t” type, which is a fixed-size vector with no


+ 30
- 0
test/unit/vector.cpp 파일 보기

@@ -141,6 +141,36 @@ LOLUNIT_FIXTURE(VectorTest)
#endif
}

LOLUNIT_TEST(VectorSwizzleMul)
{
ivec3 a(1, 2, 3);

ivec3 b = a * 2;
LOLUNIT_ASSERT_EQUAL(b.x, 2);
LOLUNIT_ASSERT_EQUAL(b.y, 4);
LOLUNIT_ASSERT_EQUAL(b.z, 6);

ivec3 c = (ivec3)a.zyx * 2;
LOLUNIT_ASSERT_EQUAL(c.x, 6);
LOLUNIT_ASSERT_EQUAL(c.y, 4);
LOLUNIT_ASSERT_EQUAL(c.z, 2);

ivec3 d = 2 * (ivec3)a.zyx;
LOLUNIT_ASSERT_EQUAL(d.x, 6);
LOLUNIT_ASSERT_EQUAL(d.y, 4);
LOLUNIT_ASSERT_EQUAL(d.z, 2);

ivec3 e = a.zyx * 2;
LOLUNIT_ASSERT_EQUAL(e.x, 6);
LOLUNIT_ASSERT_EQUAL(e.y, 4);
LOLUNIT_ASSERT_EQUAL(e.z, 2);

ivec3 f = 2 * a.zyx;
LOLUNIT_ASSERT_EQUAL(f.x, 6);
LOLUNIT_ASSERT_EQUAL(f.y, 4);
LOLUNIT_ASSERT_EQUAL(f.z, 2);
}

LOLUNIT_TEST(VectorUnaryMinus)
{
vec2 a(1.0f, 3.0f);


불러오는 중...
취소
저장