-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvec3.h
95 lines (77 loc) · 1.32 KB
/
vec3.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
83
84
85
86
87
88
89
90
91
92
93
94
95
#pragma once
#include <iostream>
#include <amp_math.h>
using namespace concurrency::fast_math;
class Vec3
{
public:
union
{
struct
{
float x, y, z;
};
float Data[3];
};
Vec3() restrict(amp, cpu)
{
}
Vec3(float x, float y, float z) restrict(amp, cpu)
{
this->x = x;
this->y = y;
this->z = z;
}
Vec3 operator-(Vec3 V) restrict(amp, cpu)
{
Vec3 N(x - V.x, y - V.y, z - V.z);
return N;
}
Vec3 operator+(Vec3 V) restrict(amp, cpu)
{
Vec3 N(x + V.x, y + V.y, z + V.z);
return N;
}
void operator+=(Vec3 V) restrict(amp, cpu)
{
x += V.x;
y += V.y;
z += V.z;
}
Vec3 operator*(int M) restrict(amp, cpu)
{
Vec3 N(x * M, y * M, z * M);
return N;
}
Vec3 operator*(float M) restrict(amp, cpu)
{
Vec3 N(x * M, y * M, z * M);
return N;
}
Vec3 operator*(Vec3 V) restrict(amp, cpu)
{
Vec3 N(V.x * x, V.y * y, V.z * z);
return N;
}
float dot(Vec3 V) restrict(amp, cpu)
{
return V.x * x + V.y * y + V.z * z;
}
Vec3 cross(Vec3 V) restrict(amp, cpu)
{
Vec3 N(
y * V.z - z * V.y,
z * V.x - x * V.z,
x * V.y - y * V.x);
return N;
}
void normalise() restrict(amp, cpu)
{
float n = sqrt(x * x + y * y + z * z);
x /= n;
y /= n;
z /= n;
}
float norm2() restrict(amp, cpu) { return dot(*this); }
float norm() restrict(amp, cpu) { return sqrt(norm2()); }
};