-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathswVec3.h
82 lines (77 loc) · 2.32 KB
/
swVec3.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#pragma once
#define _USE_MATH_DEFINES
#include <cfloat>
#include <cmath>
#include <cstdio>
class swVec3 {
public:
swVec3() = default;
swVec3(float m0, float m1, float m2) : m{m0, m1, m2} {}
float x() const { return m[0]; }
float y() const { return m[1]; }
float z() const { return m[2]; }
float operator[](int i) const { return m[i]; }
swVec3 operator*(int a) const {
return swVec3(a * m[0], a * m[1], a * m[2]);
}
swVec3 operator*(float a) const {
return swVec3(a * m[0], a * m[1], a * m[2]);
}
friend swVec3 operator*(float a, const swVec3 &v) {
return swVec3(a * v[0], a * v[1], a * v[2]);
}
swVec3 operator/(float a) const {
return swVec3(m[0]/a, m[1]/a, m[2]/a);
}
swVec3 operator+(const swVec3 &v) const {
return swVec3(m[0] + v[0], m[1] + v[1], m[2] + v[2]);
}
swVec3 operator-() const { return swVec3(-m[0], -m[1], -m[2]); }
swVec3 operator-(const swVec3 &v) const {
return swVec3(m[0] - v[0], m[1] - v[1], m[2] - v[2]);
}
float operator*(const swVec3 &v) const {
return m[0] * v[0] + m[1] * v[1] + m[2] * v[2];
}
swVec3 operator%(const swVec3 &v) const {
return swVec3(m[1] * v[2] - m[2] * v[1], m[2] * v[0] - m[0] * v[2],
m[0] * v[1] - m[1] * v[0]);
}
swVec3 &operator+=(const swVec3 &v) {
m[0] += v[0];
m[1] += v[1];
m[2] += v[2];
return *this;
}
swVec3 &operator*=(float a) {
m[0] *= a;
m[1] *= a;
m[2] *= a;
return *this;
}
swVec3 &normalize() {
float l = 1.0f / std::sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]);
m[0] *= l;
m[1] *= l;
m[2] *= l;
return *this;
}
swVec3 elemMul(const swVec3 &v) const {
return {m[0]*v.m[0], m[1]*v.m[1], m[2]*v.m[2]};
}
float length() const {
return std::sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]);
}
float max() const {
return m[0] > m[1] && m[0] > m[2] ? m[0] : m[1] > m[2] ? m[1] : m[2];
}
float min() const {
return m[0] < m[1] && m[0] < m[2] ? m[0] : m[1] < m[2] ? m[1] : m[2];
}
void print() const{
printf("%f, %f, %f\n", m[0], m[1], m[2]);
}
public:
float m[3]{0.0f, 0.0f, 0.0f};
};
using Color = swVec3; // RGB color