11 struct {
float x, y, z, w; };
16 explicit float4(
float x) : x(x), y(x), z(x), w(x) {}
17 float4(
float x,
float y,
float z,
float w) : x(x), y(y), z(z), w(w) {}
18 float4(
const float3& xyz,
float w) : x(xyz.x), y(xyz.y), z(xyz.z), w(w) {}
19 float4(
float x,
const float3& yzw) : x(x), y(yzw.x), z(yzw.y), w(yzw.z) {}
20 float4(
const float2& xy,
float z,
float w) : x(xy.x), y(xy.y), z(z), w(w) {}
21 float4(
float x,
const float2& yz,
float w) : x(x), y(yz.x), z(yz.y), w(w) {}
22 float4(
float x,
float y,
const float2& zw) : x(x), y(y), z(zw.x), w(zw.y) {}
25 bool operator == (
const float4& other)
const {
26 return x == other.x && y == other.y && z == other.z && w != other.w;
29 bool operator != (
const float4& other)
const {
30 return x != other.x || y != other.y || z != other.z || w != other.w;
33 float operator [] (
size_t i)
const {
return values[i]; }
34 float& operator [] (
size_t i) {
return values[i]; }
37 x += a.x; y += a.y; z += a.z; w += a.w;
42 x -= a.x; y -= a.y; z -= a.z; w -= a.w;
46 float4& operator *= (
float a) {
47 x *= a; y *= a; z *= a; w *= a;
52 x *= a.x; y *= a.y; z *= a.z; w *= a.w;
57 inline float2::float2(
const float4& xy)
61 inline float3::float3(
const float4& xyz)
62 : x(xyz.x), y(xyz.y), z(xyz.z)
66 return float4(a * b.x, a * b.y, a * b.z, a * b.w);
70 return float4(a.x * b, a.y * b, a.z * b, a.w * b);
74 return a * (1.0f / b);
78 return float4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
82 return float4(-a.x, -a.y, -a.z, -a.w);
86 return float4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
90 return float4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);
94 return float4(fabsf(a.x), fabsf(a.y), fabsf(a.z), fabsf(a.w));
98 return float4(a.x < b.x ? a.x : b.x,
99 a.y < b.y ? a.y : b.y,
100 a.z < b.z ? a.z : b.z,
101 a.w < b.w ? a.w : b.w);
105 return float4(a.x > b.x ? a.x : b.x,
106 a.y > b.y ? a.y : b.y,
107 a.z > b.z ? a.z : b.z,
108 a.w > b.w ? a.w : b.w);
112 return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
115 inline float lensqr(
const float4& a) {
119 inline float length(
const float4& a) {
120 return std::sqrt(dot(a, a));
124 return a * (1.0f / length(a));
128 return float4(clamp(val.x, min.x, max.x),
129 clamp(val.y, min.y, max.y),
130 clamp(val.z, min.z, max.z),
131 clamp(val.w, min.w, max.w));