The spica renderer
vector3d.h
1 #ifdef _MSC_VER
2 #pragma once
3 #endif
4 
5 #ifndef SPICA_VECTOR3D_H_
6 #define SPICA_VECTOR3D_H_
7 
8 #include <iostream>
9 #include <array>
10 #include <type_traits>
11 #include <xmmintrin.h>
12 #include <immintrin.h>
13 
14 #include "../core/common.h"
15 
16 namespace spica {
17 
21 template <class T>
22 class Vector3_ {
23 public:
26  Vector3_();
27 
33  Vector3_(T x, T y, T z);
34 
38  Vector3_(const std::string &str);
39 
42  Vector3_(const Vector3_& v);
43 
46  virtual ~Vector3_();
47 
48  Vector3_& operator=(const Vector3_& v);
49  Vector3_& operator+=(const Vector3_& v);
50  Vector3_& operator+=(double x);
51  Vector3_& operator-=(const Vector3_& v);
52  Vector3_& operator-=(double x);
53  Vector3_ operator-() const;
54 
57  Vector3_& operator*=(const Vector3_& v);
58  Vector3_& operator*=(double s);
59 
63  Vector3_& operator/=(const Vector3_& v);
64 
68  Vector3_& operator/=(double s);
69 
70  T operator[](int i) const;
71 
72  bool operator==(const Vector3_& v) const;
73  bool operator!=(const Vector3_& v) const;
74 
75  T dot(const Vector3_& v) const;
76  static T dot(const Vector3_& v1, const Vector3_& v2);
77 
78  Vector3_ cross(const Vector3_& v) const;
79  static Vector3_ cross(const Vector3_& v1, const Vector3_& v2);
80 
81  double norm() const;
82  double squaredNorm() const;
83 
84  Vector3_ normalized() const;
85  static Vector3_ normalize(const Vector3_& v);
86 
87  Vector3_ multiply(const Vector3_& v) const;
88 
89  static Vector3_ minimum(const Vector3_& v1, const Vector3_& v2);
90  static Vector3_ maximum(const Vector3_& v1, const Vector3_& v2);
91 
92  T get(int d) const;
93 
94  std::string toString() const;
95 
98  inline T x() const { return x_; }
99 
102  inline T y() const { return y_; }
103 
106  inline T z() const { return z_; }
107 
110  inline T& xRef() { return x_; }
111 
114  inline T& yRef() { return y_; }
115 
118  inline T& zRef() { return z_; }
119 
120  using type = T;
121 
122 protected:
123  T x_, y_, z_;
124 
125  static_assert(std::is_arithmetic<T>::value,
126  "Template type must be arithmetic!!");
127 
128 }; // class Vector3d
129 
130 using Vector3i = Vector3_<int>;
131 using Vector3f = Vector3_<float>;
132 using Vector3d = Vector3_<double>;
133 
134 } // namespace spica
135 
136 template <class T>
138 operator+(const spica::Vector3_<T>& v1, const spica::Vector3_<T>& v2);
139 
140 template <class T>
142 operator-(const spica::Vector3_<T>& v1, const spica::Vector3_<T>& v2);
143 
144 template <class T>
146 operator+(const spica::Vector3_<T>& v, T x);
147 
148 template <class T>
150 operator+(T x, const spica::Vector3_<T>& v);
151 
152 template <class T>
154 operator-(const spica::Vector3_<T>& v, T x);
155 
156 template <class T>
158 operator-(T x, const spica::Vector3_<T>& v);
159 
162 template <class T>
164 operator*(const spica::Vector3_<T>& u, const spica::Vector3_<T>& v);
165 
166 template <class T>
168 operator*(const spica::Vector3_<T>& v, double s);
169 
170 template <class T>
172 operator*(double s, const spica::Vector3_<T>& v);
173 
176 template <class T>
178 operator/(const spica::Vector3_<T>& u, const spica::Vector3_<T>& v);
179 
180 template <class T>
182 operator/(const spica::Vector3_<T>& v, double s);
183 
184 template <class T>
185 std::ostream& operator<<(std::ostream& os, const spica::Vector3_<T>& v);
186 
187 // Include implementation header
188 #include "vector3d_detail.h"
189 
190 #endif // SPICA_VECTOR3D_H_
Vector3_()
The Vector3d constructor.
Definition: vector3d_detail.h:16
T & yRef()
Get reference to y.
Definition: vector3d.h:114
T z() const
Get z.
Definition: vector3d.h:106
T x() const
Get x.
Definition: vector3d.h:98
T & xRef()
Get reference to x.
Definition: vector3d.h:110
Three-dimensional vector.
Definition: core.hpp:56
Vector3_ & operator/=(const Vector3_ &v)
Element-wise division.
Definition: vector3d_detail.h:124
virtual ~Vector3_()
The Vector3d destructor.
Definition: vector3d_detail.h:54
T y() const
Get y.
Definition: vector3d.h:102
Vector3_ & operator*=(const Vector3_ &v)
Element-wise multiplication.
Definition: vector3d_detail.h:106
T & zRef()
Get reference to z.
Definition: vector3d.h:118