@@ -9,6 +9,12 @@ namespace nbl
99namespace hlsl
1010{
1111
12+ namespace concepts
13+ {
14+ template<typename To, typename From>
15+ NBL_BOOL_CONCEPT can_truncate_vector = concepts::Vectorial<To> && concepts::Vectorial<From> && concepts::same_as<typename vector_traits<To>::scalar_type, typename vector_traits<From>::scalar_type > && vector_traits<To>::Dimension <= vector_traits<From>::Dimension;
16+ }
17+
1218namespace impl
1319{
1420
@@ -21,44 +27,20 @@ struct Truncate
2127 }
2228};
2329
24- template<typename Scalar, int32_t N > NBL_PARTIAL_REQ_TOP (concepts::Scalar<Scalar>)
25- struct Truncate<vector <Scalar, 1 >, vector <Scalar, N> NBL_PARTIAL_REQ_BOT (concepts::Scalar<Scalar >) >
30+ template<typename To, typename From > NBL_PARTIAL_REQ_TOP (concepts::can_truncate_vector<To, From>)
31+ struct Truncate<To, From NBL_PARTIAL_REQ_BOT (concepts::can_truncate_vector<To, From >) >
2632{
27- NBL_CONSTEXPR_FUNC vector <Scalar, 1 > operator ()(const vector <Scalar, N> v)
33+ NBL_CONSTEXPR_FUNC To operator ()(const From v)
2834 {
29- vector <Scalar, 1 > truncated = { v[0 ] };
30- return truncated;
35+ array_get<From, typename vector_traits<From>::scalar_type> getter;
36+ array_set<To, typename vector_traits<To>::scalar_type> setter;
37+ To output;
38+ [[unroll]]
39+ for (int i = 0 ; i < vector_traits<To>::Dimension; ++i)
40+ setter (output, i, getter (v, i));
41+ return output;
3142 }
32- };
33-
34- template<typename Scalar, int32_t N> NBL_PARTIAL_REQ_TOP (concepts::Scalar<Scalar> && N >= 2 )
35- struct Truncate<vector <Scalar, 2 >, vector <Scalar, N> NBL_PARTIAL_REQ_BOT (concepts::Scalar<Scalar> && N >= 2 ) >
36- {
37- NBL_CONSTEXPR_FUNC vector <Scalar, 2 > operator ()(const vector <Scalar, N> v)
38- {
39- vector <Scalar, 2 > truncated = { v[0 ], v[1 ]};
40- return truncated;
41- }
42- };
4343
44- template<typename Scalar, int32_t N> NBL_PARTIAL_REQ_TOP (concepts::Scalar<Scalar>&& N >= 3 )
45- struct Truncate<vector <Scalar, 3 >, vector <Scalar, N> NBL_PARTIAL_REQ_BOT (concepts::Scalar<Scalar>&& N >= 3 ) >
46- {
47- NBL_CONSTEXPR_FUNC vector <Scalar, 3 > operator ()(const vector <Scalar, N> v)
48- {
49- vector <Scalar, 3 > truncated = { v[0 ], v[1 ], v[2 ] };
50- return truncated;
51- }
52- };
53-
54- template<typename Scalar, int32_t N> NBL_PARTIAL_REQ_TOP (concepts::Scalar<Scalar>&& N >= 4 )
55- struct Truncate<vector <Scalar, 4 >, vector <Scalar, N> NBL_PARTIAL_REQ_BOT (concepts::Scalar<Scalar>&& N >= 4 ) >
56- {
57- NBL_CONSTEXPR_FUNC vector <Scalar, 4 > operator ()(const vector <Scalar, N> v)
58- {
59- vector <Scalar, 4 > truncated = { v[0 ], v[1 ], v[2 ], v[3 ] };
60- return truncated;
61- }
6244};
6345
6446} //namespace impl
0 commit comments