12 struct {
float x, y, z; };
17 explicit float3(
float x) : x(x), y(x), z(x) {}
19 float3(
float x,
float y,
float z) : x(x), y(y), z(z) {}
20 float3(
const float2& xy,
float z) : x(xy.x), y(xy.y), z(z) {}
21 float3(
float x,
const float2& yz) : x(x), y(yz.x), z(yz.y) {}
23 bool operator == (
const float3& other)
const {
24 return x == other.x && y == other.y && z == other.z;
27 bool operator != (
const float3& other)
const {
28 return x != other.x || y != other.y || z != other.z;
31 float operator [] (
size_t i)
const {
return values[i]; }
32 float& operator [] (
size_t i) {
return values[i]; }
35 x += a.x; y += a.y; z += a.z;
40 x -= a.x; y -= a.y; z -= a.z;
44 float3& operator *= (
float a) {
45 x *= a; y *= a; z *= a;
50 x *= a.x; y *= a.y; z *= a.z;
55 inline float2::float2(
const float3& xy)
60 return float3(a * b.x, a * b.y, a * b.z);
64 return float3(a.x * b, a.y * b, a.z * b);
68 return a * (1.0f / b);
72 return float3(a.x - b.x, a.y - b.y, a.z - b.z);
76 return float3(-a.x, -a.y, -a.z);
80 return float3(a.x + b.x, a.y + b.y, a.z + b.z);
84 return float3(a.x * b.x, a.y * b.y, a.z * b.z);
88 return float3(a.x / b.x, a.y / b.y, a.z / b.z);
92 return float3(a.y * b.z - a.z * b.y,
93 a.z * b.x - a.x * b.z,
94 a.x * b.y - a.y * b.x);
99 q[0] = axis.x * sinf(angle / 2);
100 q[1] = axis.y * sinf(angle / 2);
101 q[2] = axis.z * sinf(angle / 2);
102 q[3] = std::cos(angle / 2);
105 p[0] = q[3] * v.x + q[1] * v.z - q[2] * v.y;
106 p[1] = q[3] * v.y - q[0] * v.z + q[2] * v.x;
107 p[2] = q[3] * v.z + q[0] * v.y - q[1] * v.x;
108 p[3] = -(q[0] * v.x + q[1] * v.y + q[2] * v.z);
110 return float3(p[3] * -q[0] + p[0] * q[3] + p[1] * -q[2] - p[2] * -q[1],
111 p[3] * -q[1] - p[0] * -q[2] + p[1] * q[3] + p[2] * -q[0],
112 p[3] * -q[2] + p[0] * -q[1] - p[1] * -q[0] + p[2] * q[3]);
116 return float3(a.x < b.x ? a.x : b.x,
117 a.y < b.y ? a.y : b.y,
118 a.z < b.z ? a.z : b.z);
122 return float3(a.x > b.x ? a.x : b.x,
123 a.y > b.y ? a.y : b.y,
124 a.z > b.z ? a.z : b.z);
128 return a.x * b.x + a.y * b.y + a.z * b.z;
131 inline float lensqr(
const float3& a) {
135 inline float length(
const float3& a) {
136 return std::sqrt(dot(a, a));
140 return a * (1.0f / length(a));