Honeycomb  0.1
Component-Model Framework
Vec2.h
Go to the documentation of this file.
1 // Honeycomb, Copyright (C) 2015 NewGamePlus Inc. Distributed under the Boost Software License v1.0.
2 #pragma once
3 
6 
7 namespace honey
8 {
9 
10 template<class Real, int Options>
11 struct matrix::priv::Traits<Vec<2,Real,Options>> : vec::priv::Traits<2,Real,Options,std::allocator<int8>>
12 {
14 };
15 
16 namespace vec { namespace priv
17 {
18  template<class Real, szt Align>
19  struct StorageFieldsMixin<Real, 2, Align>
20  {
23  };
24 } }
25 
26 namespace matrix { namespace priv
27 {
28  template<class R, int O>
29  void storageCopy(const R* a, Vec<2,R,O>& v) { v.x = a[0]; v.y = a[1]; }
30  template<class R, int O>
31  void storageCopy(const Vec<2,R,O>& v, R* a) { a[0] = v.x; a[1] = v.y; }
32 
33  template<class R, int O>
34  void storageFill(Vec<2,R,O>& v, R f) { v.x = f; v.y = f; }
35  template<class R, int O>
36  void storageFillZero(Vec<2,R,O>& v) { v.x = 0; v.y = 0; }
37 
38  template<class R, int O>
39  bool storageEqual(const Vec<2,R,O>& lhs, const Vec<2,R,O>& rhs) { return lhs.x == rhs.x && lhs.y == rhs.y; }
40 } }
41 
43 template<class Real, int Options>
44 class Vec<2,Real,Options> : public VecBase<Vec<2,Real,Options>>
45 {
47 protected:
48  typedef Vec Vec2;
49  typedef Vec<3,Real> Vec3;
50  typedef Vec<4,Real> Vec4;
55 public:
56  using Super::dot;
57  using Super::x;
58  using Super::y;
59 
61  Vec() {}
62  Vec(Real x, Real y) { this->x = x; this->y = y; }
64  explicit Vec(Real scalar) { this->fromScalar(scalar); }
66  explicit Vec(const Vec3& v) { x = v.x; y = v.y; }
67  explicit Vec(const Vec4& v) { x = v.x; y = v.y; }
69  template<class T>
70  Vec(const MatrixBase<T>& rhs) { operator=(rhs); }
71 
72  template<class T>
73  Vec& operator=(const MatrixBase<T>& rhs) { Super::operator=(rhs); return *this; }
74 
77  Real lengthSqr() const { return x*x + y*y; }
78  Real dot(const Vec& v) const { return x*v.x + y*v.y; }
80 
82  Real cross(const Vec& v) const { return x*v.y - y*v.x; }
83 
85  Vec normal() const { return Vec(-y, x); }
86 
87 public:
88  static const Vec zero;
89  static const Vec one;
90  static const Vec axisX;
91  static const Vec axisY;
92  static const Vec axis[2];
93 
94 public:
97  VecSwizCon2 xx() const { return VecSwizCon2(x,x); }
98  VecSwizCon3 xxx() const { return VecSwizCon3(x,x,x); }
99  VecSwizCon4 xxxx() const { return VecSwizCon4(x,x,x,x); }
100  VecSwizCon4 xxxy() const { return VecSwizCon4(x,x,x,y); }
101  VecSwizCon3 xxy() const { return VecSwizCon3(x,x,y); }
102  VecSwizCon4 xxyx() const { return VecSwizCon4(x,x,y,x); }
103  VecSwizCon4 xxyy() const { return VecSwizCon4(x,x,y,y); }
104  VecSwizCon2 xy() const { return VecSwizCon2(x,y); }
105  VecSwizCon3 xyx() const { return VecSwizCon3(x,y,x); }
106  VecSwizCon4 xyxx() const { return VecSwizCon4(x,y,x,x); }
107  VecSwizCon4 xyxy() const { return VecSwizCon4(x,y,x,y); }
108  VecSwizCon3 xyy() const { return VecSwizCon3(x,y,y); }
109  VecSwizCon4 xyyx() const { return VecSwizCon4(x,y,y,x); }
110  VecSwizCon4 xyyy() const { return VecSwizCon4(x,y,y,y); }
111  VecSwizCon2 yx() const { return VecSwizCon2(y,x); }
112  VecSwizCon3 yxx() const { return VecSwizCon3(y,x,x); }
113  VecSwizCon4 yxxx() const { return VecSwizCon4(y,x,x,x); }
114  VecSwizCon4 yxxy() const { return VecSwizCon4(y,x,x,y); }
115  VecSwizCon3 yxy() const { return VecSwizCon3(y,x,y); }
116  VecSwizCon4 yxyx() const { return VecSwizCon4(y,x,y,x); }
117  VecSwizCon4 yxyy() const { return VecSwizCon4(y,x,y,y); }
118  VecSwizCon2 yy() const { return VecSwizCon2(y,y); }
119  VecSwizCon3 yyx() const { return VecSwizCon3(y,y,x); }
120  VecSwizCon4 yyxx() const { return VecSwizCon4(y,y,x,x); }
121  VecSwizCon4 yyxy() const { return VecSwizCon4(y,y,x,y); }
122  VecSwizCon3 yyy() const { return VecSwizCon3(y,y,y); }
123  VecSwizCon4 yyyx() const { return VecSwizCon4(y,y,y,x); }
124  VecSwizCon4 yyyy() const { return VecSwizCon4(y,y,y,y); }
126 
129  VecSwizRef2 xy() { return VecSwizRef2(x,y); }
130  VecSwizRef2 yx() { return VecSwizRef2(y,x); }
132 };
133 
134 template<class R, int O> const Vec<2,R,O> Vec<2,R,O>::zero (0);
135 template<class R, int O> const Vec<2,R,O> Vec<2,R,O>::one (1);
136 template<class R, int O> const Vec<2,R,O> Vec<2,R,O>::axisX (1, 0);
137 template<class R, int O> const Vec<2,R,O> Vec<2,R,O>::axisY (0, 1);
138 template<class R, int O> const Vec<2,R,O> Vec<2,R,O>::axis[2] = { axisX, axisY };
139 
141 template<class R, int Opt>
144 struct priv::map_impl<Vec<2,R,Opt>, Vec<2,R,Opt>>
145 {
146  template<class T, class O, class Func>
147  static O&& func(T&& v, O&& o, Func&& f) { o.x = f(v.x); o.y = f(v.y); return forward<O>(o); }
148 };
149 
150 template<class R, int Opt>
151 struct priv::map_impl<Vec<2,R,Opt>, Vec<2,R,Opt>, Vec<2,R,Opt>>
152 {
153  template<class T, class T2, class O, class Func>
154  static O&& func(T&& v, T2&& rhs, O&& o, Func&& f) { o.x = f(v.x,rhs.x); o.y = f(v.y,rhs.y); return forward<O>(o); }
155 };
156 
157 template<class R, int O, class Accum_>
158 struct priv::reduce_impl<Vec<2,R,O>, Accum_>
159 {
160  template<class T, class Accum, class Func>
161  static Accum_ func(T&& v, Accum&& initVal, Func&& f) { return f(f(forward<Accum>(initVal), v.x), v.y); }
162 };
163 
164 template<class R, int O, class Accum_>
165 struct priv::reduce_impl<Vec<2,R,O>, Accum_, Vec<2,R,O>>
166 {
167  template<class T, class T2, class Accum, class Func>
168  static Accum_ func(T&& v, T2&& rhs, Accum&& initVal, Func&& f) { return f(f(forward<Accum>(initVal), v.x, rhs.x), v.y, rhs.y); }
169 };
171 
173 template<class Real, int Options>
175 class VecSwizCon<2,Real,Options> : public VecSwizConBase<VecSwizCon<2,Real,Options>>
176 {
177 public:
178  VecSwizCon(Real x, Real y) { this->x = x; this->y = y; }
179 };
180 
182 template<class Real, int Options>
183 class VecSwizRef<2,Real,Options> : public VecSwizRefBase<VecSwizRef<2,Real,Options>>
184 {
185  template<class> friend class VecSwizRefBase;
186 public:
188  using Super::operator=;
189  using Super::x;
190  using Super::y;
191 
192  VecSwizRef(Real& x, Real& y) : rx(x), ry(y) { this->x = x; this->y = y; }
193 
194  VecSwizRef& commit() { rx = x; ry = y; return *this; }
195 
196 private:
197  Real& rx;
198  Real& ry;
199 };
200 
202 typedef Vec<2> Vec2;
205 
210 
211 }
212 
213 #include "Honey/Math/Alge/Vec/platform/Vec2.h"
MatrixS & fromScalar(Real f)
Initialize with scalar in every element.
Definition: Base.h:72
Vec()
No init.
Definition: Vec.h:39
Automatic (stack-compatible) vector storage that allows direct access to dimension fields...
Definition: Storage.h:13
VecBase & operator=(const MatrixBase< T > &rhs)
Assign to row or column vector of any dimension. Asserts that if this vector has a fixed dimension th...
Definition: Base.h:35
Vec(const Vec3 &v)
Construct from vector ignoring the extra components.
Definition: Vec2.h:66
void storageFillZero(StorageBlock< T > &store)
Fill block storage with zeros.
Definition: Block.h:136
VecSwizCon4 xxyy() const
Definition: Vec2.h:103
N-dimensional vector traits.
Definition: Vec.h:14
Real dot(const Vec &v) const
Definition: Vec2.h:78
Vec(Real scalar)
Construct uniform vector.
Definition: Vec2.h:64
Vec Vec2
Definition: Vec2.h:48
VecSwizCon3 xyx() const
Definition: Vec2.h:105
Real dot(const VecBase< T > &v) const
Vector dot product.
Definition: Base.h:91
VecSwizCon4 xxyx() const
Definition: Vec2.h:102
VecSwizCon< 4, Real, Options > VecSwizCon4
Definition: Vec2.h:53
Vec< 2, Float > Vec2_f
Definition: Vec2.h:203
VecSwizCon3 xyy() const
Definition: Vec2.h:108
VecSwizCon4 xxxy() const
Definition: Vec2.h:100
VecSwizRef2 xy()
Definition: Vec2.h:129
bool storageEqual(const StorageBlock< T > &lhs, const StorageBlock< T2 > &rhs)
Test between block storages.
Definition: Block.h:157
3D const swizzle vector
Definition: Vec3.h:326
VecSwizCon3 yxx() const
Definition: Vec2.h:112
Definition: Swiz.h:16
VecSwizCon4 yxxy() const
Definition: Vec2.h:114
Vector for const swizzle operators.
Definition: Swiz.h:10
VecSwizCon2 yy() const
Definition: Vec2.h:118
VecSwizRef2 yx()
Definition: Vec2.h:130
Vec< 2 > Vec2
2D column vector types
Definition: Vec2.h:202
VecSwizCon4 yyyy() const
Definition: Vec2.h:124
2D const swizzle vector
Definition: Vec2.h:175
VecSwizRef(Real &x, Real &y)
Definition: Vec2.h:192
VecSwizRef & commit()
Definition: Vec2.h:194
VecSwizCon3 yxy() const
Definition: Vec2.h:115
VecSwizCon2 xy() const
Definition: Vec2.h:104
VecSwizCon4 xyxx() const
Definition: Vec2.h:106
Vec normal() const
Get the left-perpendicular vector.
Definition: Vec2.h:85
VecSwizCon4 yxyy() const
Definition: Vec2.h:117
VecSwizRefBase< VecSwizRef< 2, Real, Options > > Super
Definition: Vec2.h:187
VecSwizCon3 yyx() const
Definition: Vec2.h:119
VecSwizCon< 2, Real, Options > VecSwizCon2
Definition: Vec2.h:51
Vec & operator=(const MatrixBase< T > &rhs)
Definition: Vec2.h:73
N-dimensional vector.
Definition: Traits.h:12
VecSwizCon4 xxxx() const
Definition: Vec2.h:99
Vec< 2, Double, matrix::Option::vecRow > VecRow2_d
Definition: Vec2.h:209
VecSwizCon(Real x, Real y)
Definition: Vec2.h:178
VecSwizCon4 yyxy() const
Definition: Vec2.h:121
Definition: Traits.h:20
VecSwizCon4 yyxx() const
Definition: Vec2.h:120
vec::priv::StorageFields< Vec< 2, Real, Options > > Storage
Definition: Vec2.h:13
4D const swizzle vector
Definition: Vec4.h:641
float Real
Real number type. See Real_ for real number operations and constants.
Definition: Real.h:21
Real cross(const Vec &v) const
Vector cross product.
Definition: Vec2.h:82
Real lengthSqr() const
Definition: Vec2.h:77
Vec< 3, Real > Vec3
Definition: Vec2.h:49
Vec()
No init.
Definition: Vec2.h:61
Vec(Real x, Real y)
Definition: Vec2.h:62
static const Vec axisY
Definition: Vec2.h:91
Vector base class.
Definition: Base.h:11
Vec & operator=(const MatrixBase< T > &rhs)
Assign to row or column vector of any dimension. Asserts that if this vector has a fixed dimension th...
Definition: Vec.h:56
void storageFill(StorageBlock< T > &store, typename StorageBlock< T >::Real f)
Fill block storage with scalar.
Definition: Block.h:128
Vec< 2, Real, matrix::Option::vecRow > VecRow2
2D row vector types
Definition: Vec2.h:207
VecSwizCon< 3, Real, Options > VecSwizCon3
Definition: Vec2.h:52
VecSwizCon3 xxy() const
Definition: Vec2.h:101
Vec(const MatrixBase< T > &rhs)
Construct from vector of same dimension.
Definition: Vec2.h:70
VecSwizCon4 xyyy() const
Definition: Vec2.h:110
VecSwizCon4 xyyx() const
Definition: Vec2.h:109
VecSwizCon4 yxxx() const
Definition: Vec2.h:113
Definition: Swiz.h:60
Vec< 4, Real > Vec4
Definition: Vec2.h:50
VecSwizCon3 yyy() const
Definition: Vec2.h:122
Vec< 2, Float, matrix::Option::vecRow > VecRow2_f
Definition: Vec2.h:208
VecSwizCon2 xx() const
Definition: Vec2.h:97
VecSwizCon4 yyyx() const
Definition: Vec2.h:123
void storageCopy(const StorageBlock< Src > &src, StorageBlock< Dst > &dst)
Copy between block and dense storages.
Definition: Block.h:84
VecSwizCon2 yx() const
Definition: Vec2.h:111
Matrix base class.
Definition: Base.h:17
Vec(const Vec4 &v)
Definition: Vec2.h:67
Vec< 2, Double > Vec2_d
Definition: Vec2.h:204
VecSwizRef< 2, Real, Options > VecSwizRef2
Definition: Vec2.h:54
VecSwizCon4 yxyx() const
Definition: Vec2.h:116
Vector reference holder for mutable swizzle operators.
Definition: Swiz.h:54
Global Honeycomb namespace.
VecSwizCon4 xyxy() const
Definition: Vec2.h:107
VecSwizCon3 xxx() const
Definition: Vec2.h:98
static const Vec zero
Definition: Vec2.h:88
2D mutable swizzle vector
Definition: Vec2.h:183
static const Vec one
Definition: Vec2.h:89
static const Vec axisX
Definition: Vec2.h:90