struct float3 { float x, y, z; }; float3 operator +(float3 a, float3 b) { return { a.x + b.x, a.y + b.y, a.z + b.z, }; } float3 operator -(float3 a, float3 b) { return { a.x - b.x, a.y - b.y, a.z - b.z, }; } float3 operator *(float3 a, float scalar) { return { a.x * scalar, a.y * scalar, a.z * scalar, }; } static float LenSqr(float3 v) { float sum = v.x * v.x + v.y * v.y + v.z * v.z; return sum; } static float Len(float3 v) { return sqrtf(LenSqr(v)); } static float3 Norm(float3 v) { float len = Len(v); v.x = v.x / len; v.y = v.y / len; v.z = v.z / len; return v; } static float Dot(float3 a, float3 b) { return a.x * b.x + a.y * b.y + a.z * b.z; } float3 Cross(float3 a, float3 b) { return { a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x, }; }