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