Simulant  21.12-574
A portable game engine for Windows, OSX, Linux, Dreamcast, and PSP
vec4.h
1 #pragma once
2 
3 #include <cmath>
4 #include <ostream>
5 #include "utils.h"
6 
7 namespace smlt {
8 
9 struct Vec2;
10 struct Vec3;
11 
12 struct Vec4 {
13  friend struct Vec3;
14  friend struct Mat4;
15 
16  float x;
17  float y;
18  float z;
19  float w;
20 
21  Vec4():
22  x(0), y(0), z(0), w(0) {
23  }
24 
25  Vec4(float x, float y, float z, float w):
26  x(x), y(y), z(z), w(w) {
27 
28  }
29 
30  Vec4(const Vec3& v, float w);
31 
32  bool equals(const Vec4& rhs) const {
33  return x == rhs.x && y == rhs.y && z == rhs.z && w == rhs.w;
34  }
35 
36  bool operator==(const Vec4& rhs) const {
37  return x == rhs.x && y == rhs.y && z == rhs.z && w == rhs.w;
38  }
39 
40  bool operator!=(const Vec4& rhs) const {
41  return (x != rhs.x) || (y != rhs.y) || (z != rhs.z) || (w != rhs.w);
42  }
43 
44  Vec4 operator+(const Vec4& rhs) const {
45  return Vec4(x + rhs.x, y + rhs.y, z + rhs.z, w + rhs.w);
46  }
47 
48  Vec4 operator-(const Vec4& rhs) const {
49  return Vec4(x - rhs.x, y - rhs.y, z - rhs.z, w - rhs.w);
50  }
51 
52  Vec4 operator*(const float& rhs) const {
53  return Vec4(
54  x * rhs,
55  y * rhs,
56  z * rhs,
57  w * rhs
58  );
59  }
60 
61  float length() const {
62  return fast_sqrt(length_squared());
63  }
64 
65  float length_squared() const {
66 #ifdef __DREAMCAST__
67  return MATH_Sum_of_Squares(x, y, z, w);
68 #else
69  return dot(*this);
70 #endif
71  }
72 
73  void normalize() {
74  float l = fast_inverse_sqrt(length_squared());
75  x *= l;
76  y *= l;
77  z *= l;
78  w *= l;
79  }
80 
81  float dot(const Vec4& rhs) const {
82 #ifdef __DREAMCAST__
83  return MATH_fipr(x, y, z, w, rhs.x, rhs.y, rhs.z, rhs.w);
84 #else
85  return x * rhs.x + y * rhs.y + z * rhs.z + w * rhs.w;
86 #endif
87  }
88 
89  const smlt::Vec4 normalized() const {
90  smlt::Vec4 result = *this;
91  result.normalize();
92  return result;
93  }
94 
95  Vec3 xyz() const;
96  Vec2 xy() const;
97 };
98 
99 std::ostream& operator<<(std::ostream& stream, const Vec4& vec);
100 
101 
102 }
smlt::Mat4
Definition: mat4.h:29
smlt::Vec3
Definition: vec3.h:23
smlt
Definition: animation.cpp:25
smlt::Vec4
Definition: vec4.h:12
smlt::Vec2
Definition: vec2.h:14