Loading...
Searching...
No Matches
vec.h
Go to the documentation of this file.
1#ifndef _BBM_VEC_H_
2#define _BBM_VEC_H_
3
4#include "util/reference.h"
5
6/************************************************************************/
7/*! \file vec.h
8
9 \brief Defines additional helper methods for vectors.
10
11*************************************************************************/
12
13
14namespace bbm {
15 namespace vec {
16
17 /********************************************************************/
18 /*! @{ \name Shortcuts to vector coordinates
19 ********************************************************************/
20 template<typename T> inline constexpr decltype(auto) x(bbm::vec3d<T>& v) { return v[0]; }
21 template<typename T> inline constexpr decltype(auto) x(const bbm::vec3d<T>& v) { return v[0]; }
22
23 template<typename T> inline constexpr decltype(auto) y(bbm::vec3d<T>& v) { return v[1]; }
24 template<typename T> inline constexpr decltype(auto) y(const bbm::vec3d<T>& v) { return v[1]; }
25
26 template<typename T> inline constexpr decltype(auto) z(bbm::vec3d<T>& v) { return v[2]; }
27 template<typename T> inline constexpr decltype(auto) z(const bbm::vec3d<T>& v) { return v[2]; }
28
29 /***/
30
31 template<typename T> inline constexpr decltype(auto) x(bbm::vec2d<T>& v) { return v[0]; }
32 template<typename T> inline constexpr decltype(auto) x(const bbm::vec2d<T>& v) { return v[0]; }
33
34 template<typename T> inline constexpr decltype(auto) y(bbm::vec2d<T>& v) { return v[1]; }
35 template<typename T> inline constexpr decltype(auto) y(const bbm::vec2d<T>& v) { return v[1]; }
36
37 template<typename T> inline constexpr decltype(auto) u(bbm::vec2d<T>& v) { return v[0]; }
38 template<typename T> inline constexpr decltype(auto) u(const bbm::vec2d<T>& v) { return v[0]; }
39
40 template<typename T> inline constexpr decltype(auto) v(bbm::vec2d<T>& v) { return v[1]; }
41 template<typename T> inline constexpr decltype(auto) v(const bbm::vec2d<T>& v) { return v[1]; }
42 //! @}
43
44 /********************************************************************/
45 /*! @{ \name Reduce vec3d to vec2d
46 ********************************************************************/
47 template<typename T> inline constexpr const vec2d<T> xy(const vec3d<T>& v) { return {v[0], v[1]}; }
48 template<typename T> inline constexpr const vec2d<T> xz(const vec3d<T>& v) { return {v[0], v[2]}; }
49 template<typename T> inline constexpr const vec2d<T> yz(const vec3d<T>& v) { return {v[1], v[2]}; }
50 //! @}
51
52 /********************************************************************/
53 /*! @{ \name Increase the dimension of a vec
54 ********************************************************************/
55 template<typename T, typename V> inline constexpr const vec3d<T> expand(const vec2d<T>& v, V&& a) { return vec3d<T>(v[0], v[1], a); }
56 template<typename T> inline constexpr const vec3d<T> expand(const vec2d<T>& v) { return vec3d<T>(v[0], v[1], T(bbm::safe_sqrt(1 - bbm::squared_norm(v)))); }
57 template<typename T> inline constexpr const vec2d<T> expand(T&& c) { return vec2d<T>(c, bbm::safe_sqrt(1 - c*c)); }
58 //! @}
59
60 } // end vec namespace
61
62} // end bbm namespace
63
64#endif /* _BBM_VEC_H_ */
constexpr const vec2d< T > yz(const vec3d< T > &v)
Definition: vec.h:49
constexpr decltype(auto) u(bbm::vec2d< T > &v)
Definition: vec.h:37
constexpr const vec3d< T > expand(const vec2d< T > &v, V &&a)
Definition: vec.h:55
constexpr decltype(auto) y(bbm::vec3d< T > &v)
Definition: vec.h:23
constexpr decltype(auto) z(bbm::vec3d< T > &v)
Definition: vec.h:26
constexpr decltype(auto) v(bbm::vec2d< T > &v)
Definition: vec.h:40
constexpr decltype(auto) x(bbm::vec3d< T > &v)
Definition: vec.h:20
constexpr const vec2d< T > xy(const vec3d< T > &v)
Definition: vec.h:47
constexpr const vec2d< T > xz(const vec3d< T > &v)
Definition: vec.h:48
Definition: aggregatebsdf.h:29
Assignable reference with wrapper support for rvalues.