/* File: cwasm_vectors.c Author: Taylor Robbins Date: 09\01\2025 Description: ** Holds vector structs (v2, v3, v4, v2i, etc.) which hold N [2,3,4] components of some type [r32,i32,u32] */ typedef union Vec2R32 Vec2R32; union Vec2R32 { r32 Values[2]; struct { r32 X, Y; }; struct { r32 U, V; }; struct { r32 Min, Max; }; struct { r32 Width, Height; }; }; typedef union Vec3R32 Vec3R32; union Vec3R32 { r32 Values[3]; struct { r32 X, Y, Z; }; struct { r32 U, V, W; }; struct { r32 Width, Height, Depth; }; }; typedef union Vec4R32 Vec4R32; union Vec4R32 { r32 Values[4]; struct { r32 X, Y, Z, W; }; struct { r32 Width, Height, Depth, Unused1; }; }; typedef union Vec2I32 Vec2I32; union Vec2I32 { i32 Values[2]; struct { i32 X, Y; }; struct { i32 U, V; }; struct { i32 Min, Max; }; struct { i32 Width, Height; }; }; typedef union Vec3I32 Vec3I32; union Vec3I32 { i32 Values[3]; struct { i32 X, Y, Z; }; struct { i32 U, V, W; }; struct { i32 Width, Height, Depth; }; }; typedef union Vec4I32 Vec4I32; union Vec4I32 { i32 Values[4]; struct { i32 X, Y, Z, W; }; struct { i32 Width, Height, Depth, Unused1; }; }; typedef union Vec2U32 Vec2U32; union Vec2U32 { u32 Values[2]; struct { u32 X, Y; }; struct { u32 U, V; }; struct { u32 Min, Max; }; struct { u32 Width, Height; }; }; typedef union Vec3U32 Vec3U32; union Vec3U32 { u32 Values[3]; struct { u32 X, Y, Z; }; struct { u32 U, V, W; }; struct { u32 Width, Height, Depth; }; }; typedef union Vec4U32 Vec4U32; union Vec4U32 { u32 Values[4]; struct { u32 X, Y, Z, W; }; struct { u32 Width, Height, Depth, Unused1; }; }; typedef Vec2R32 v2; typedef Vec3R32 v3; typedef Vec4R32 v4; typedef Vec2I32 v2i; typedef Vec3I32 v3i; typedef Vec4I32 v4i; typedef Vec2U32 v2u; typedef Vec3U32 v3u; typedef Vec4U32 v4u; static inline v2 NewV2( r32 x, r32 y) { v2 result; result.X = x; result.Y = y; return result; } static inline v2i NewV2i(i32 x, i32 y) { v2i result; result.X = x; result.Y = y; return result; } static inline v2u NewV2u(u32 x, u32 y) { v2u result; result.X = x; result.Y = y; return result; } static inline v3 NewV3( r32 x, r32 y, r32 z) { v3 result; result.X = x; result.Y = y; result.Z = z; return result; } static inline v3i NewV3i(i32 x, i32 y, i32 z) { v3i result; result.X = x; result.Y = y; result.Z = z; return result; } static inline v3u NewV3u(u32 x, u32 y, u32 z) { v3u result; result.X = x; result.Y = y; result.Z = z; return result; } static inline v4 NewV4( r32 x, r32 y, r32 z, r32 w) { v4 result; result.X = x; result.Y = y; result.Z = z; result.W = w; return result; } static inline v4i NewV4i(i32 x, i32 y, i32 z, i32 w) { v4i result; result.X = x; result.Y = y; result.Z = z; result.W = w; return result; } static inline v4u NewV4u(u32 x, u32 y, u32 z, u32 w) { v4u result; result.X = x; result.Y = y; result.Z = z; result.W = w; return result; } static inline v2 FillV2(r32 value) { v2 result; result.X = value; result.Y = value; return result; } static inline v2i FillV2i(i32 value) { v2i result; result.X = value; result.Y = value; return result; } static inline v2u FillV2u(u32 value) { v2u result; result.X = value; result.Y = value; return result; } static inline v3 FillV3(r32 value) { v3 result; result.X = value; result.Y = value; result.Z = value; return result; } static inline v3i FillV3i(i32 value) { v3i result; result.X = value; result.Y = value; result.Z = value; return result; } static inline v3u FillV3u(u32 value) { v3u result; result.X = value; result.Y = value; result.Z = value; return result; } static inline v4 FillV4(r32 value) { v4 result; result.X = value; result.Y = value; result.Z = value; result.W = value; return result; } static inline v4i FillV4i(i32 value) { v4i result; result.X = value; result.Y = value; result.Z = value; result.W = value; return result; } static inline v4u FillV4u(u32 value) { v4u result; result.X = value; result.Y = value; result.Z = value; result.W = value; return result; } #define NewV2_Const(x, y) { .X=(x), .Y=(y) } #define NewV2i_Const(x, y) { .X=(x), .Y=(y) } #define NewV2u_Const(x, y) { .X=(x), .Y=(y) } #define NewV3_Const(x, y, z) { .X=(x), .Y=(y), .Z=(z) } #define NewV3i_Const(x, y, z) { .X=(x), .Y=(y), .Z=(z) } #define NewV3u_Const(x, y, z) { .X=(x), .Y=(y), .Z=(z) } #define NewV4_Const(x, y, z, w) { .X=(x), .Y=(y), .Z=(z), .W=(w) } #define NewV4i_Const(x, y, z, w) { .X=(x), .Y=(y), .Z=(z), .W=(w) } #define NewV4u_Const(x, y, z, w) { .X=(x), .Y=(y), .Z=(z), .W=(w) } #define V2_Zero NewV2(0.0f, 0.0f) #define V2_Zero_Const NewV2_Const(0.0f, 0.0f) #define V2_One NewV2(1.0f, 1.0f) #define V2_Half NewV2(0.5f, 0.5f) #define V2_Left NewV2(-1.0f, 0.0f) #define V2_Right NewV2( 1.0f, 0.0f) #define V2_Up NewV2( 0.0f,-1.0f) #define V2_Down NewV2( 0.0f, 1.0f) #define V2i_Zero NewV2i(0, 0) #define V2i_Zero_Const NewV2i_Const(0, 0) #define V2i_One NewV2i(1, 1) #define V2i_Left NewV2i(-1, 0) #define V2i_Right NewV2i( 1, 0) #define V2i_Up NewV2i( 0,-1) #define V2i_Down NewV2i( 0, 1) #define V2u_Zero NewV2u(0, 0) #define V2u_Zero_Const NewV2u_Const(0, 0) #define V2u_One NewV2u(1, 1) #define V2u_Unit NewV2u(0, 1) #define V3_Zero NewV3(0.0f, 0.0f, 0.0f) #define V3_Zero_Const NewV3_Const(0.0f, 0.0f, 0.0f) #define V3_One NewV3(1.0f, 1.0f, 1.0f) #define V3_Half NewV3(0.5f, 0.5f, 0.5f) #define V3_Left NewV3(-1.0f, 0.0f, 0.0f) #define V3_Right NewV3( 1.0f, 0.0f, 0.0f) #define V3_Down NewV3( 0.0f,-1.0f, 0.0f) #define V3_Up NewV3( 0.0f, 1.0f, 0.0f) #define V3_Backward NewV3( 0.0f, 0.0f,-1.0f) #define V3_Forward NewV3( 0.0f, 0.0f, 1.0f) #define V3i_Zero NewV3i(0, 0, 0) #define V3i_Zero_Const NewV3i_Const(0, 0, 0) #define V3i_One NewV3i(1, 1, 1) #define V3i_Left NewV3i(-1, 0, 0) #define V3i_Right NewV3i( 1, 0, 0) #define V3i_Down NewV3i( 0,-1, 0) #define V3i_Up NewV3i( 0, 1, 0) #define V3i_Backward NewV3i( 0, 0,-1) #define V3i_Forward NewV3i( 0, 0, 1) #define V3u_Zero NewV3u(0, 0, 0) #define V3u_Zero_Const NewV3u_Const(0, 0, 0) #define V3u_One NewV3u(1, 1, 1) #define V4_Zero NewV4(0.0f, 0.0f, 0.0f, 0.0f) #define V4_Zero_Const NewV4_Const(0.0f, 0.0f, 0.0f, 0.0f) #define V4_One NewV4(1.0f, 1.0f, 1.0f, 1.0f) #define V4_Half NewV4(0.5f, 0.5f, 0.5f, 0.5f) #define V4i_Zero NewV4i(0, 0, 0, 0) #define V4i_Zero_Const NewV4i_Const(0, 0, 0, 0) #define V4i_One NewV4i(1, 1, 1, 1) #define V4u_Zero NewV4u(0, 0, 0, 0) #define V4u_Zero_Const NewV4u_Const(0, 0, 0, 0) #define V4u_One NewV4u(1, 1, 1, 1) static inline v2 ToV2Fromi(v2i vector) { v2 result; result.X = (r32)vector.X; result.Y = (r32)vector.Y; return result; } static inline v2 ToV2Fromu(v2u vector) { v2 result; result.X = (r32)vector.X; result.Y = (r32)vector.Y; return result; } static inline v2 ToV2From3(v3 vector) { v2 result; result.X = vector.X; result.Y = vector.Y; return result; } static inline v2 ToV2From3XZ(v3 vector) { v2 result; result.X = vector.X; result.Y = vector.Z; return result; } static inline v2 ToV2From3YZ(v3 vector) { v2 result; result.X = vector.Y; result.Y = vector.Z; return result; } static inline v2i ToV2iFromf(v2 vector) { v2i result; result.X = (i32)vector.X; result.Y = (i32)vector.Y; return result; } static inline v2i ToV2iFromu(v2u vector) { v2i result; result.X = (i32)vector.X; result.Y = (i32)vector.Y; return result; } static inline v2i ToV2iFrom3(v3i vector) { v2i result; result.X = vector.X; result.Y = vector.Y; return result; } static inline v2i ToV2iFrom3XZ(v3i vector) { v2i result; result.X = vector.X; result.Y = vector.Z; return result; } static inline v2i ToV2iFrom3YZ(v3i vector) { v2i result; result.X = vector.Y; result.Y = vector.Z; return result; } static inline v2u ToV2uFromf(v2 vector) { v2u result; result.X = (u32)vector.X; result.Y = (u32)vector.Y; return result; } static inline v2u ToV2uFromi(v2i vector) { v2u result; result.X = (u32)vector.X; result.Y = (u32)vector.Y; return result; } static inline v2u ToV2uFrom3(v3u vector) { v2u result; result.X = vector.X; result.Y = vector.Y; return result; } static inline v2u ToV2uFrom3XZ(v3u vector) { v2u result; result.X = vector.X; result.Y = vector.Z; return result; } static inline v2u ToV2uFrom3YZ(v3u vector) { v2u result; result.X = vector.Y; result.Y = vector.Z; return result; } static inline v3 ToV3Fromi(v3i vector) { v3 result; result.X = (r32)vector.X; result.Y = (r32)vector.Y; result.Z = (r32)vector.Z; return result; } static inline v3 ToV3Fromu(v3u vector) { v3 result; result.X = (r32)vector.X; result.Y = (r32)vector.Y; result.Z = (r32)vector.Z; return result; } static inline v3 ToV3From2(v2 vector, r32 z) { v3 result; result.X = vector.X; result.Y = vector.Y; result.Z = z; return result; } static inline v3 ToV3From4(v4 vector) { v3 result; result.X = vector.X; result.Y = vector.Y; result.Z = vector.Z; return result; } static inline v3i ToV3iFromf(v3 vector) { v3i result; result.X = (i32)vector.X; result.Y = (i32)vector.Y; result.Z = (i32)vector.Z; return result; } static inline v3i ToV3iFromu(v3u vector) { v3i result; result.X = (i32)vector.X; result.Y = (i32)vector.Y; result.Z = (i32)vector.Z; return result; } static inline v3i ToV3iFrom2(v2i vector, i32 z) { v3i result; result.X = vector.X; result.Y = vector.Y; result.Z = z; return result; } static inline v3i ToV3iFrom4(v4i vector) { v3i result; result.X = vector.X; result.Y = vector.Y; result.Z = vector.Z; return result; } static inline v3u ToV3uFromf(v3 vector) { v3u result; result.X = (u32)vector.X; result.Y = (u32)vector.Y; result.Z = (u32)vector.Z; return result; } static inline v3u ToV3uFromi(v3i vector) { v3u result; result.X = (u32)vector.X; result.Y = (u32)vector.Y; result.Z = (u32)vector.Z; return result; } static inline v3u ToV3uFrom2(v2u vector, u32 z) { v3u result; result.X = vector.X; result.Y = vector.Y; result.Z = z; return result; } static inline v3u ToV3uFrom4(v4u vector) { v3u result; result.X = vector.X; result.Y = vector.Y; result.Z = vector.Z; return result; } static inline v4 ToV4Fromi(v4i vector) { v4 result; result.X = (r32)vector.X; result.Y = (r32)vector.Y; result.Z = (r32)vector.Z; result.W = (r32)vector.W; return result; } static inline v4 ToV4Fromu(v4u vector) { v4 result; result.X = (r32)vector.X; result.Y = (r32)vector.Y; result.Z = (r32)vector.Z; result.W = (r32)vector.W; return result; } static inline v4 ToV4From2(v2 vector, r32 z, r32 w) { v4 result; result.X = vector.X; result.Y = vector.Y; result.Z = z; result.W = w; return result; } static inline v4 ToV4From3(v3 vector, r32 w) { v4 result; result.X = vector.X; result.Y = vector.Y; result.Z = vector.Z; result.W = w; return result; } static inline v4i ToV4iFromf(v4 vector) { v4i result; result.X = (i32)vector.X; result.Y = (i32)vector.Y; result.Z = (i32)vector.Z; result.W = (i32)vector.W; return result; } static inline v4i ToV4iFromu(v4u vector) { v4i result; result.X = (i32)vector.X; result.Y = (i32)vector.Y; result.Z = (i32)vector.Z; result.W = (i32)vector.W; return result; } static inline v4i ToV4iFrom2(v2i vector, i32 z, i32 w) { v4i result; result.X = vector.X; result.Y = vector.Y; result.Z = z; result.W = w; return result; } static inline v4i ToV4iFrom3(v3i vector, i32 w) { v4i result; result.X = vector.X; result.Y = vector.Y; result.Z = vector.Z; result.W = w; return result; } static inline v4u ToV4uFromf(v4 vector) { v4u result; result.X = (u32)vector.X; result.Y = (u32)vector.Y; result.Z = (u32)vector.Z; result.W = (u32)vector.W; return result; } static inline v4u ToV4uFromi(v4i vector) { v4u result; result.X = (u32)vector.X; result.Y = (u32)vector.Y; result.Z = (u32)vector.Z; result.W = (u32)vector.W; return result; } static inline v4u ToV4uFrom2(v2u vector, u32 z, u32 w) { v4u result; result.X = vector.X; result.Y = vector.Y; result.Z = z; result.W = w; return result; } static inline v4u ToV4uFrom3(v3u vector, u32 w) { v4u result; result.X = vector.X; result.Y = vector.Y; result.Z = vector.Z; result.W = w; return result; } static inline v2 AddV2(v2 left, v2 right) { v2 result; result.X = left.X + right.X; result.Y = left.Y + right.Y; return result; } static inline v2i AddV2i(v2i left, v2i right) { v2i result; result.X = left.X + right.X; result.Y = left.Y + right.Y; return result; } static inline v2u AddV2u(v2u left, v2u right) { v2u result; result.X = left.X + right.X; result.Y = left.Y + right.Y; return result; } static inline v3 AddV3(v3 left, v3 right) { v3 result; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; return result; } static inline v3i AddV3i(v3i left, v3i right) { v3i result; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; return result; } static inline v3u AddV3u(v3u left, v3u right) { v3u result; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; return result; } static inline v4 AddV4(v4 left, v4 right) { v4 result; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; result.W = left.W + right.W; return result; } static inline v4i AddV4i(v4i left, v4i right) { v4i result; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; result.W = left.W + right.W; return result; } static inline v4u AddV4u(v4u left, v4u right) { v4u result; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; result.W = left.W + right.W; return result; } static inline v2 SubV2(v2 left, v2 right) { v2 result; result.X = left.X - right.X; result.Y = left.Y - right.Y; return result; } static inline v2i SubV2i(v2i left, v2i right) { v2i result; result.X = left.X - right.X; result.Y = left.Y - right.Y; return result; } static inline v2u SubV2u(v2u left, v2u right) { v2u result; result.X = left.X - right.X; result.Y = left.Y - right.Y; return result; } static inline v3 SubV3(v3 left, v3 right) { v3 result; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; return result; } static inline v3i SubV3i(v3i left, v3i right) { v3i result; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; return result; } static inline v3u SubV3u(v3u left, v3u right) { v3u result; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; return result; } static inline v4 SubV4(v4 left, v4 right) { v4 result; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; result.W = left.W - right.W; return result; } static inline v4i SubV4i(v4i left, v4i right) { v4i result; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; result.W = left.W - right.W; return result; } static inline v4u SubV4u(v4u left, v4u right) { v4u result; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; result.W = left.W - right.W; return result; } static inline v2 MulV2(v2 left, v2 right) { v2 result; result.X = left.X * right.X; result.Y = left.Y * right.Y; return result; } static inline v2i MulV2i(v2i left, v2i right) { v2i result; result.X = left.X * right.X; result.Y = left.Y * right.Y; return result; } static inline v2u MulV2u(v2u left, v2u right) { v2u result; result.X = left.X * right.X; result.Y = left.Y * right.Y; return result; } static inline v3 MulV3(v3 left, v3 right) { v3 result; result.X = left.X * right.X; result.Y = left.Y * right.Y; result.Z = left.Z * right.Z; return result; } static inline v3i MulV3i(v3i left, v3i right) { v3i result; result.X = left.X * right.X; result.Y = left.Y * right.Y; result.Z = left.Z * right.Z; return result; } static inline v3u MulV3u(v3u left, v3u right) { v3u result; result.X = left.X * right.X; result.Y = left.Y * right.Y; result.Z = left.Z * right.Z; return result; } static inline v4 MulV4(v4 left, v4 right) { v4 result; result.X = left.X * right.X; result.Y = left.Y * right.Y; result.Z = left.Z * right.Z; result.W = left.W * right.W; return result; } static inline v4i MulV4i(v4i left, v4i right) { v4i result; result.X = left.X * right.X; result.Y = left.Y * right.Y; result.Z = left.Z * right.Z; result.W = left.W * right.W; return result; } static inline v4u MulV4u(v4u left, v4u right) { v4u result; result.X = left.X * right.X; result.Y = left.Y * right.Y; result.Z = left.Z * right.Z; result.W = left.W * right.W; return result; } static inline v2 DivV2(v2 left, v2 right) { v2 result; result.X = left.X / right.X; result.Y = left.Y / right.Y; return result; } static inline v2i DivV2i(v2i left, v2i right) { v2i result; result.X = left.X / right.X; result.Y = left.Y / right.Y; return result; } static inline v2u DivV2u(v2u left, v2u right) { v2u result; result.X = left.X / right.X; result.Y = left.Y / right.Y; return result; } static inline v3 DivV3(v3 left, v3 right) { v3 result; result.X = left.X / right.X; result.Y = left.Y / right.Y; result.Z = left.Z / right.Z; return result; } static inline v3i DivV3i(v3i left, v3i right) { v3i result; result.X = left.X / right.X; result.Y = left.Y / right.Y; result.Z = left.Z / right.Z; return result; } static inline v3u DivV3u(v3u left, v3u right) { v3u result; result.X = left.X / right.X; result.Y = left.Y / right.Y; result.Z = left.Z / right.Z; return result; } static inline v4 DivV4(v4 left, v4 right) { v4 result; result.X = left.X / right.X; result.Y = left.Y / right.Y; result.Z = left.Z / right.Z; result.W = left.W / right.W; return result; } static inline v4i DivV4i(v4i left, v4i right) { v4i result; result.X = left.X / right.X; result.Y = left.Y / right.Y; result.Z = left.Z / right.Z; result.W = left.W / right.W; return result; } static inline v4u DivV4u(v4u left, v4u right) { v4u result; result.X = left.X / right.X; result.Y = left.Y / right.Y; result.Z = left.Z / right.Z; result.W = left.W / right.W; return result; } static inline v2 ScaleV2(v2 left, r32 right) { v2 result; result.X = left.X * right; result.Y = left.Y * right; return result; } static inline v2i ScaleV2i(v2i left, i32 right) { v2i result; result.X = left.X * right; result.Y = left.Y * right; return result; } static inline v2u ScaleV2u(v2u left, u32 right) { v2u result; result.X = left.X * right; result.Y = left.Y * right; return result; } static inline v3 ScaleV3(v3 left, r32 right) { v3 result; result.X = left.X * right; result.Y = left.Y * right; result.Z = left.Z * right; return result; } static inline v3i ScaleV3i(v3i left, i32 right) { v3i result; result.X = left.X * right; result.Y = left.Y * right; result.Z = left.Z * right; return result; } static inline v3u ScaleV3u(v3u left, u32 right) { v3u result; result.X = left.X * right; result.Y = left.Y * right; result.Z = left.Z * right; return result; } static inline v4 ScaleV4(v4 left, r32 right) { v4 result; result.X = left.X * right; result.Y = left.Y * right; result.Z = left.Z * right; result.W = left.W * right; return result; } static inline v4i ScaleV4i(v4i left, i32 right) { v4i result; result.X = left.X * right; result.Y = left.Y * right; result.Z = left.Z * right; result.W = left.W * right; return result; } static inline v4u ScaleV4u(v4u left, u32 right) { v4u result; result.X = left.X * right; result.Y = left.Y * right; result.Z = left.Z * right; result.W = left.W * right; return result; } static inline v2 ShrinkV2(v2 left, r32 right) { v2 result; result.X = left.X / right; result.Y = left.Y / right; return result; } static inline v2i ShrinkV2i(v2i left, i32 right) { v2i result; result.X = left.X / right; result.Y = left.Y / right; return result; } static inline v2u ShrinkV2u(v2u left, u32 right) { v2u result; result.X = left.X / right; result.Y = left.Y / right; return result; } static inline v3 ShrinkV3(v3 left, r32 right) { v3 result; result.X = left.X / right; result.Y = left.Y / right; result.Z = left.Z / right; return result; } static inline v3i ShrinkV3i(v3i left, i32 right) { v3i result; result.X = left.X / right; result.Y = left.Y / right; result.Z = left.Z / right; return result; } static inline v3u ShrinkV3u(v3u left, u32 right) { v3u result; result.X = left.X / right; result.Y = left.Y / right; result.Z = left.Z / right; return result; } static inline v4 ShrinkV4(v4 left, r32 right) { v4 result; result.X = left.X / right; result.Y = left.Y / right; result.Z = left.Z / right; result.W = left.W / right; return result; } static inline v4i ShrinkV4i(v4i left, i32 right) { v4i result; result.X = left.X / right; result.Y = left.Y / right; result.Z = left.Z / right; result.W = left.W / right; return result; } static inline v4u ShrinkV4u(v4u left, u32 right) { v4u result; result.X = left.X / right; result.Y = left.Y / right; result.Z = left.Z / right; result.W = left.W / right; return result; } static inline bool AreEqualV2(v2 left, v2 right) { return (left.X == right.X && left.Y == right.Y); } static inline bool AreEqualV2i(v2i left, v2i right) { return (left.X == right.X && left.Y == right.Y); } static inline bool AreEqualV2u(v2u left, v2u right) { return (left.X == right.X && left.Y == right.Y); } static inline bool AreEqualV3(v3 left, v3 right) { return (left.X == right.X && left.Y == right.Y && left.Z == right.Z); } static inline bool AreEqualV3i(v3i left, v3i right) { return (left.X == right.X && left.Y == right.Y && left.Z == right.Z); } static inline bool AreEqualV3u(v3u left, v3u right) { return (left.X == right.X && left.Y == right.Y && left.Z == right.Z); } static inline bool AreEqualV4(v4 left, v4 right) { return (left.X == right.X && left.Y == right.Y && left.Z == right.Z && left.W == right.W); } static inline bool AreEqualV4i(v4i left, v4i right) { return (left.X == right.X && left.Y == right.Y && left.Z == right.Z && left.W == right.W); } static inline bool AreEqualV4u(v4u left, v4u right) { return (left.X == right.X && left.Y == right.Y && left.Z == right.Z && left.W == right.W); } static inline r32 DotV2(v2 left, v2 right) { return (left.X * right.X) + (left.Y * right.Y); } static inline i32 DotV2i(v2i left, v2i right) { return (left.X * right.X) + (left.Y * right.Y); } static inline u32 DotV2u(v2u left, v2u right) { return (left.X * right.X) + (left.Y * right.Y); } static inline r32 DotV3(v3 left, v3 right) { return (left.X * right.X) + (left.Y * right.Y) + (left.Z * right.Z); } static inline i32 DotV3i(v3i left, v3i right) { return (left.X * right.X) + (left.Y * right.Y) + (left.Z * right.Z); } static inline u32 DotV3u(v3u left, v3u right) { return (left.X * right.X) + (left.Y * right.Y) + (left.Z * right.Z); } static inline r32 DotV4(v4 left, v4 right) { return (left.X * right.X) + (left.Y * right.Y) + (left.Z * right.Z) + (left.W * right.W); } static inline i32 DotV4i(v4i left, v4i right) { return (left.X * right.X) + (left.Y * right.Y) + (left.Z * right.Z) + (left.W * right.W); } static inline u32 DotV4u(v4u left, v4u right) { return (left.X * right.X) + (left.Y * right.Y) + (left.Z * right.Z) + (left.W * right.W); } static inline v3 CrossV3(v3 left, v3 right) { v3 result; result.X = (left.Y*right.Z - left.Z*right.Y); result.Y = (left.Z*right.X - left.X*right.Z); result.Z = (left.X*right.Y - left.Y*right.X); return result; } static inline v3i CrossV3i(v3i left, v3i right) { v3i result; result.X = (left.Y*right.Z - left.Z*right.Y); result.Y = (left.Z*right.X - left.X*right.Z); result.Z = (left.X*right.Y - left.Y*right.X); return result; } static inline v3u CrossV3u(v3u left, v3u right) { v3u result; result.X = (left.Y*right.Z - left.Z*right.Y); result.Y = (left.Z*right.X - left.X*right.Z); result.Z = (left.X*right.Y - left.Y*right.X); return result; } static inline r32 LengthSquaredV2(v2 vector) { return DotV2(vector, vector); } static inline i32 LengthSquaredV2i(v2i vector) { return DotV2i(vector, vector); } static inline u32 LengthSquaredV2u(v2u vector) { return DotV2u(vector, vector); } static inline r32 LengthSquaredV3(v3 vector) { return DotV3(vector, vector); } static inline i32 LengthSquaredV3i(v3i vector) { return DotV3i(vector, vector); } static inline u32 LengthSquaredV3u(v3u vector) { return DotV3u(vector, vector); } static inline r32 LengthSquaredV4(v4 vector) { return DotV4(vector, vector); } static inline i32 LengthSquaredV4i(v4i vector) { return DotV4i(vector, vector); } static inline u32 LengthSquaredV4u(v4u vector) { return DotV4u(vector, vector); } static inline r32 LengthV2(v2 vector) { return sqrtf(LengthSquaredV2(vector)); } static inline r32 LengthV3(v3 vector) { return sqrtf(LengthSquaredV3(vector)); } static inline r32 LengthV4(v4 vector) { return sqrtf(LengthSquaredV4(vector)); } static inline v2 NormalizeV2(v2 vector) { return ShrinkV2(vector, LengthV2(vector)); } static inline v3 NormalizeV3(v3 vector) { return ShrinkV3(vector, LengthV3(vector)); } static inline v4 NormalizeV4(v4 vector) { return ShrinkV4(vector, LengthV4(vector)); } static inline v2 LerpV2(v2 start, v2 end, r32 amount) { v2 result; result.X = start.X + (end.X - start.X)*amount; result.Y = start.Y + (end.Y - start.Y)*amount; return result; } static inline v3 LerpV3(v3 start, v3 end, r32 amount) { v3 result; result.X = start.X + (end.X - start.X)*amount; result.Y = start.Y + (end.Y - start.Y)*amount; result.Z = start.Z + (end.Z - start.Z)*amount; return result; } static inline v4 LerpV4(v4 start, v4 end, r32 amount) { v4 result; result.X = start.X + (end.X - start.X)*amount; result.Y = start.Y + (end.Y - start.Y)*amount; result.Z = start.Z + (end.Z - start.Z)*amount; result.W = start.W + (end.W - start.W)*amount; return result; } static inline v2 ClampV2(v2 vector, v2 min, v2 max) { v2 result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); return result; } static inline v2i ClampV2i(v2i vector, v2i min, v2i max) { v2i result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); return result; } static inline v2u ClampV2u(v2u vector, v2u min, v2u max) { v2u result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); return result; } static inline v3 ClampV3(v3 vector, v3 min, v3 max) { v3 result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); result.Z = Clamp(vector.Z, min.Z, max.Z); return result; } static inline v3i ClampV3i(v3i vector, v3i min, v3i max) { v3i result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); result.Z = Clamp(vector.Z, min.Z, max.Z); return result; } static inline v3u ClampV3u(v3u vector, v3u min, v3u max) { v3u result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); result.Z = Clamp(vector.Z, min.Z, max.Z); return result; } static inline v4 ClampV4(v4 vector, v4 min, v4 max) { v4 result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); result.Z = Clamp(vector.Z, min.Z, max.Z); result.W = Clamp(vector.W, min.W, max.W); return result; } static inline v4i ClampV4i(v4i vector, v4i min, v4i max) { v4i result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); result.Z = Clamp(vector.Z, min.Z, max.Z); result.W = Clamp(vector.W, min.W, max.W); return result; } static inline v4u ClampV4u(v4u vector, v4u min, v4u max) { v4u result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); result.Z = Clamp(vector.Z, min.Z, max.Z); result.W = Clamp(vector.W, min.W, max.W); return result; } static inline v2 MaxV2(v2 left, v2 right) { v2 result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); return result; } static inline v2i MaxV2i(v2i left, v2i right) { v2i result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); return result; } static inline v2u MaxV2u(v2u left, v2u right) { v2u result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); return result; } static inline v3 MaxV3(v3 left, v3 right) { v3 result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); result.Z = MAX(left.Z, right.Z); return result; } static inline v3i MaxV3i(v3i left, v3i right) { v3i result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); result.Z = MAX(left.Z, right.Z); return result; } static inline v3u MaxV3u(v3u left, v3u right) { v3u result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); result.Z = MAX(left.Z, right.Z); return result; } static inline v4 MaxV4(v4 left, v4 right) { v4 result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); result.Z = MAX(left.Z, right.Z); result.W = MAX(left.W, right.W); return result; } static inline v4i MaxV4i(v4i left, v4i right) { v4i result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); result.Z = MAX(left.Z, right.Z); result.W = MAX(left.W, right.W); return result; } static inline v4u MaxV4u(v4u left, v4u right) { v4u result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); result.Z = MAX(left.Z, right.Z); result.W = MAX(left.W, right.W); return result; } static inline v2 MinV2(v2 left, v2 right) { v2 result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); return result; } static inline v2i MinV2i(v2i left, v2i right) { v2i result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); return result; } static inline v2u MinV2u(v2u left, v2u right) { v2u result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); return result; } static inline v3 MinV3(v3 left, v3 right) { v3 result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); result.Z = MIN(left.Z, right.Z); return result; } static inline v3i MinV3i(v3i left, v3i right) { v3i result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); result.Z = MIN(left.Z, right.Z); return result; } static inline v3u MinV3u(v3u left, v3u right) { v3u result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); result.Z = MIN(left.Z, right.Z); return result; } static inline v4 MinV4(v4 left, v4 right) { v4 result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); result.Z = MIN(left.Z, right.Z); result.W = MIN(left.W, right.W); return result; } static inline v4i MinV4i(v4i left, v4i right) { v4i result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); result.Z = MIN(left.Z, right.Z); result.W = MIN(left.W, right.W); return result; } static inline v4u MinV4u(v4u left, v4u right) { v4u result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); result.Z = MIN(left.Z, right.Z); result.W = MIN(left.W, right.W); return result; } static inline v2 FloorV2(v2 vector) { v2 result; result.X = floorf(vector.X); result.Y = floorf(vector.Y); return result; } static inline v2i FloorV2i(v2 vector) { v2i result; result.X = (i32)floorf(vector.X); result.Y = (i32)floorf(vector.Y); return result; } static inline v2u FloorV2u(v2 vector) { v2u result; result.X = (u32)floorf(vector.X); result.Y = (u32)floorf(vector.Y); return result; } static inline v3 FloorV3(v3 vector) { v3 result; result.X = floorf(vector.X); result.Y = floorf(vector.Y); result.Z = floorf(vector.Z); return result; } static inline v3i FloorV3i(v3 vector) { v3i result; result.X = (i32)floorf(vector.X); result.Y = (i32)floorf(vector.Y); result.Z = (i32)floorf(vector.Z); return result; } static inline v3u FloorV3u(v3 vector) { v3u result; result.X = (u32)floorf(vector.X); result.Y = (u32)floorf(vector.Y); result.Z = (u32)floorf(vector.Z); return result; } static inline v4 FloorV4(v4 vector) { v4 result; result.X = floorf(vector.X); result.Y = floorf(vector.Y); result.Z = floorf(vector.Z); result.W = floorf(vector.W); return result; } static inline v4i FloorV4i(v4 vector) { v4i result; result.X = (i32)floorf(vector.X); result.Y = (i32)floorf(vector.Y); result.Z = (i32)floorf(vector.Z); result.W = (i32)floorf(vector.W); return result; } static inline v4u FloorV4u(v4 vector) { v4u result; result.X = (u32)floorf(vector.X); result.Y = (u32)floorf(vector.Y); result.Z = (u32)floorf(vector.Z); result.W = (u32)floorf(vector.W); return result; } static inline v2 CeilV2(v2 vector) { v2 result; result.X = ceilf(vector.X); result.Y = ceilf(vector.Y); return result; } static inline v2i CeilV2i(v2 vector) { v2i result; result.X = (i32)ceilf(vector.X); result.Y = (i32)ceilf(vector.Y); return result; } static inline v2u CeilV2u(v2 vector) { v2u result; result.X = (u32)ceilf(vector.X); result.Y = (u32)ceilf(vector.Y); return result; } static inline v3 CeilV3(v3 vector) { v3 result; result.X = ceilf(vector.X); result.Y = ceilf(vector.Y); result.Z = ceilf(vector.Z); return result; } static inline v3i CeilV3i(v3 vector) { v3i result; result.X = (i32)ceilf(vector.X); result.Y = (i32)ceilf(vector.Y); result.Z = (i32)ceilf(vector.Z); return result; } static inline v3u CeilV3u(v3 vector) { v3u result; result.X = (u32)ceilf(vector.X); result.Y = (u32)ceilf(vector.Y); result.Z = (u32)ceilf(vector.Z); return result; } static inline v4 CeilV4(v4 vector) { v4 result; result.X = ceilf(vector.X); result.Y = ceilf(vector.Y); result.Z = ceilf(vector.Z); result.W = ceilf(vector.W); return result; } static inline v4i CeilV4i(v4 vector) { v4i result; result.X = (i32)ceilf(vector.X); result.Y = (i32)ceilf(vector.Y); result.Z = (i32)ceilf(vector.Z); result.W = (i32)ceilf(vector.W); return result; } static inline v4u CeilV4u(v4 vector) { v4u result; result.X = (u32)ceilf(vector.X); result.Y = (u32)ceilf(vector.Y); result.Z = (u32)ceilf(vector.Z); result.W = (u32)ceilf(vector.W); return result; } static inline v2 RoundV2(v2 vector) { v2 result; result.X = roundf(vector.X); result.Y = roundf(vector.Y); return result; } static inline v2i RoundV2i(v2 vector) { v2i result; result.X = (i32)roundf(vector.X); result.Y = (i32)roundf(vector.Y); return result; } static inline v2u RoundV2u(v2 vector) { v2u result; result.X = (u32)roundf(vector.X); result.Y = (u32)roundf(vector.Y); return result; } static inline v3 RoundV3(v3 vector) { v3 result; result.X = roundf(vector.X); result.Y = roundf(vector.Y); result.Z = roundf(vector.Z); return result; } static inline v3i RoundV3i(v3 vector) { v3i result; result.X = (i32)roundf(vector.X); result.Y = (i32)roundf(vector.Y); result.Z = (i32)roundf(vector.Z); return result; } static inline v3u RoundV3u(v3 vector) { v3u result; result.X = (u32)roundf(vector.X); result.Y = (u32)roundf(vector.Y); result.Z = (u32)roundf(vector.Z); return result; } static inline v4 RoundV4(v4 vector) { v4 result; result.X = roundf(vector.X); result.Y = roundf(vector.Y); result.Z = roundf(vector.Z); result.W = roundf(vector.W); return result; } static inline v4i RoundV4i(v4 vector) { v4i result; result.X = (i32)roundf(vector.X); result.Y = (i32)roundf(vector.Y); result.Z = (i32)roundf(vector.Z); result.W = (i32)roundf(vector.W); return result; } static inline v4u RoundV4u(v4 vector) { v4u result; result.X = (u32)roundf(vector.X); result.Y = (u32)roundf(vector.Y); result.Z = (u32)roundf(vector.Z); result.W = (u32)roundf(vector.W); return result; } static inline v2 AbsV2(v2 vector) { v2 result; result.X = fabsf(vector.X); result.Y = fabsf(vector.Y); return result; } static inline v2i AbsV2i(v2 vector) { v2i result; result.X = (i32)fabsf(vector.X); result.Y = (i32)fabsf(vector.Y); return result; } static inline v2u AbsV2u(v2 vector) { v2u result; result.X = (u32)fabsf(vector.X); result.Y = (u32)fabsf(vector.Y); return result; } static inline v3 AbsV3(v3 vector) { v3 result; result.X = fabsf(vector.X); result.Y = fabsf(vector.Y); result.Z = fabsf(vector.Z); return result; } static inline v3i AbsV3i(v3 vector) { v3i result; result.X = (i32)fabsf(vector.X); result.Y = (i32)fabsf(vector.Y); result.Z = (i32)fabsf(vector.Z); return result; } static inline v3u AbsV3u(v3 vector) { v3u result; result.X = (u32)fabsf(vector.X); result.Y = (u32)fabsf(vector.Y); result.Z = (u32)fabsf(vector.Z); return result; } static inline v4 AbsV4(v4 vector) { v4 result; result.X = fabsf(vector.X); result.Y = fabsf(vector.Y); result.Z = fabsf(vector.Z); result.W = fabsf(vector.W); return result; } static inline v4i AbsV4i(v4 vector) { v4i result; result.X = (i32)fabsf(vector.X); result.Y = (i32)fabsf(vector.Y); result.Z = (i32)fabsf(vector.Z); result.W = (i32)fabsf(vector.W); return result; } static inline v4u AbsV4u(v4 vector) { v4u result; result.X = (u32)fabsf(vector.X); result.Y = (u32)fabsf(vector.Y); result.Z = (u32)fabsf(vector.Z); result.W = (u32)fabsf(vector.W); return result; } static inline v2 PerpLeftV2(v2 vector) { v2 result; result.X = -vector.Y; result.Y = vector.X; return result; } static inline v2 PerpRightV2(v2 vector) { v2 result; result.X = vector.Y; result.Y = -vector.X; return result; } static inline v2i PerpLeftV2i(v2i vector) { v2i result; result.X = -vector.Y; result.Y = vector.X; return result; } static inline v2i PerpRightV2i(v2i vector) { v2i result; result.X = vector.Y; result.Y = -vector.X; return result; } static inline v2u PerpLeftV2u(v2u vector) { v2u result; result.X = -vector.Y; result.Y = vector.X; return result; } static inline v2u PerpRightV2u(v2u vector) { v2u result; result.X = vector.Y; result.Y = -vector.X; return result; } static inline v2 RotateV2(v2 vector, r32 angle) { v2 result; result.X = cosf(angle) * vector.X - sinf(angle) * vector.Y; result.Y = sinf(angle) * vector.X + cosf(angle) * vector.Y; return result; } static inline r32 AngleBetweenV3(v3 left, v3 right) { return acosf(DotV3(left, right) / (LengthV3(left) * LengthV3(right))); } static inline v3 ToV3FromAngles(r32 facingDirection, r32 rotationUpDown, r32 radius) { v3 result; r32 circleRadius = cosf(rotationUpDown) * radius; result.X = cosf(facingDirection) * circleRadius; result.Y = sinf(facingDirection) * circleRadius; result.Z = sinf(rotationUpDown) * radius; return result; } static inline void AlignV2ToV2(v2* vectorPntr, v2 alignScale) { vectorPntr->X = (alignScale.X != 0) ? (roundf(vectorPntr->X * alignScale.X) / alignScale.X) : vectorPntr->X; vectorPntr->Y = (alignScale.Y != 0) ? (roundf(vectorPntr->Y * alignScale.Y) / alignScale.Y) : vectorPntr->Y; } static inline void AlignV3ToV3(v3* vectorPntr, v3 alignScale) { vectorPntr->X = (alignScale.X != 0) ? (roundf(vectorPntr->X * alignScale.X) / alignScale.X) : vectorPntr->X; vectorPntr->Y = (alignScale.Y != 0) ? (roundf(vectorPntr->Y * alignScale.Y) / alignScale.Y) : vectorPntr->Y; vectorPntr->Z = (alignScale.Z != 0) ? (roundf(vectorPntr->Z * alignScale.Z) / alignScale.Z) : vectorPntr->Z; } static inline void AlignV4ToV4(v4* vectorPntr, v4 alignScale) { vectorPntr->X = (alignScale.X != 0) ? (roundf(vectorPntr->X * alignScale.X) / alignScale.X) : vectorPntr->X; vectorPntr->Y = (alignScale.Y != 0) ? (roundf(vectorPntr->Y * alignScale.Y) / alignScale.Y) : vectorPntr->Y; vectorPntr->Z = (alignScale.Z != 0) ? (roundf(vectorPntr->Z * alignScale.Z) / alignScale.Z) : vectorPntr->Z; vectorPntr->W = (alignScale.W != 0) ? (roundf(vectorPntr->W * alignScale.W) / alignScale.W) : vectorPntr->W; } static inline void AlignV2(v2* vectorPntr, r32 alignScale) { vectorPntr->X = (alignScale != 0) ? (roundf(vectorPntr->X * alignScale) / alignScale) : vectorPntr->X; vectorPntr->Y = (alignScale != 0) ? (roundf(vectorPntr->Y * alignScale) / alignScale) : vectorPntr->Y; } static inline void AlignV3(v3* vectorPntr, r32 alignScale) { vectorPntr->X = (alignScale != 0) ? (roundf(vectorPntr->X * alignScale) / alignScale) : vectorPntr->X; vectorPntr->Y = (alignScale != 0) ? (roundf(vectorPntr->Y * alignScale) / alignScale) : vectorPntr->Y; vectorPntr->Z = (alignScale != 0) ? (roundf(vectorPntr->Z * alignScale) / alignScale) : vectorPntr->Z; } static inline void AlignV4(v4* vectorPntr, r32 alignScale) { vectorPntr->X = (alignScale != 0) ? (roundf(vectorPntr->X * alignScale) / alignScale) : vectorPntr->X; vectorPntr->Y = (alignScale != 0) ? (roundf(vectorPntr->Y * alignScale) / alignScale) : vectorPntr->Y; vectorPntr->Z = (alignScale != 0) ? (roundf(vectorPntr->Z * alignScale) / alignScale) : vectorPntr->Z; vectorPntr->W = (alignScale != 0) ? (roundf(vectorPntr->W * alignScale) / alignScale) : vectorPntr->W; }