Copy void print_vec2(const string &in label, const vector2 &in v)
{
log(label + " = (" + v.x + ", " + v.y + ")");
}
void print_vec3(const string &in label, const vector3 &in v)
{
log(label + " = (" + v.x + ", " + v.y + ", " + v.z + ")");
}
void print_quat(const string &in label, const quaternion &in q)
{
log(label + " = (" + q.x + ", " + q.y + ", " + q.z + ", " + q.w + ")");
}
int main()
{
log("=== AS Extended Math FULL TEST ===");
// ----------------------------------------------------------------
// Scalars & constants
// ----------------------------------------------------------------
log("M_PI = " + M_PI);
log("M_TAU = " + M_TAU);
log("RAD2DEG(PI) = " + (M_PI * RAD2DEG));
log("DEG2RAD(180)= " + (180.0 * DEG2RAD));
log("clamp(5,0,3) = " + clamp(5.0, 0.0, 3.0));
log("saturate(-0.5) = " + saturate(-0.5));
log("saturate(0.5) = " + saturate(0.5));
log("saturate(2.0) = " + saturate(2.0));
log("sign(-2.0) = " + sign(-2.0));
log("sign(0.0) = " + sign(0.0));
log("sign(3.0) = " + sign(3.0));
log("round(1.4) = " + round(1.4));
log("round(1.5) = " + round(1.5));
log("fract(-1.25) = " + fract(-1.25));
log("wrap(370,0,360) = " + wrap(370.0, 0.0, 360.0));
log("lerp(0,10,0.25) = " + lerp(0.0, 10.0, 0.25));
log("inverse_lerp(0,10,2.5) = " + inverse_lerp(0.0, 10.0, 2.5));
log("remap(0..100 -> -1..1, 25) = " + remap(0.0, 100.0, -1.0, 1.0, 25.0));
log("smoothstep(0,1,0.5)= " + smoothstep(0.0, 1.0, 0.5));
log("step(0.5, 0.25) = " + step(0.5, 0.25));
log("step(0.5, 0.75) = " + step(0.5, 0.75));
// Basic sanity; your C++ doesn’t expose make_nan/make_inf so just use 0
log("is_nan(0.0) = " + (is_nan(0.0) ? "true" : "false"));
log("is_inf(1.0) = " + (is_inf(1.0) ? "true" : "false"));
// ----------------------------------------------------------------
// vector2
// ----------------------------------------------------------------
vector2 v2a; // default (0,0)
v2a.x = 1.0;
v2a.y = 2.0;
vector2 v2b(4.0, -1.0); // ctor
print_vec2("v2a", v2a);
print_vec2("v2b", v2b);
vector2 v2_add = v2a + v2b;
vector2 v2_sub = v2a - v2b;
vector2 v2_neg = -v2a;
vector2 v2_mul = v2a * 2.0;
vector2 v2_div = v2b / 2.0;
print_vec2("v2a + v2b", v2_add);
print_vec2("v2a - v2b", v2_sub);
print_vec2("-v2a", v2_neg);
print_vec2("v2a * 2", v2_mul);
print_vec2("v2b / 2", v2_div);
log("v2a == v2a ? " + (v2a == v2a ? "true" : "false"));
log("v2a == v2b ? " + (v2a == v2b ? "true" : "false"));
log("v2a.length() = " + v2a.length());
log("v2a.distance(v2b) = " + v2a.distance(v2b));
log("v2a.distance_to(v2b)= " + v2a.distance_to(v2b));
vector2 v2_lerp = v2a.lerp(v2b, 0.5);
print_vec2("v2a.lerp(v2b,0.5)", v2_lerp);
print_vec2("v2a.min(v2b)", v2a.min(v2b));
print_vec2("v2a.max(v2b)", v2a.max(v2b));
// ----------------------------------------------------------------
// vector3
// ----------------------------------------------------------------
vector3 v3a; // default (0,0,0)
v3a.x = 1.0; v3a.y = 2.0; v3a.z = 3.0;
vector3 v3b(4.0, -1.0, 0.5);
print_vec3("v3a", v3a);
print_vec3("v3b", v3b);
print_vec3("v3a + v3b", v3a + v3b);
print_vec3("v3a - v3b", v3a - v3b);
print_vec3("-v3a", -v3a);
print_vec3("v3a * 2", v3a * 2.0);
print_vec3("v3b / 2", v3b / 2.0);
log("v3a.length() = " + v3a.length());
log("v3a.length2d() = " + v3a.length2d());
log("v3a.distance(v3b) = " + v3a.distance(v3b));
log("v3a.distance2d(v3b) = " + v3a.distance2d(v3b));
vector3 v3_lerp = v3a.lerp(v3b, 0.5);
print_vec3("v3a.lerp(v3b,0.5)", v3_lerp);
print_vec3("v3a.min(v3b)", v3a.min(v3b));
print_vec3("v3a.max(v3b)", v3a.max(v3b));
log("v3a.dot_product(v3b) = " + v3a.dot_product(v3b));
print_vec3("v3a.cross_product(v3b)", v3a.cross_product(v3b));
// ----------------------------------------------------------------
// quaternion
// ----------------------------------------------------------------
quaternion q; // default (0,0,0,1)
print_quat("q (default)", q);
quaternion qEuler = quat_from_euler(30.0, 45.0, 10.0);
print_quat("qEuler (30,45,10)", qEuler);
log("qEuler.length() = " + qEuler.length());
print_quat("qEuler.normalized()", qEuler.normalized());
quaternion q2(0.1, 0.2, 0.3, 0.9);
print_quat("q2", q2);
log("qEuler.dot(q2) = " + qEuler.dot(q2));
print_quat("qEuler.conjugate()", qEuler.conjugate());
print_quat("qEuler.inverse()", qEuler.inverse());
print_quat("qEuler * q2", qEuler * q2);
print_quat("qEuler * 0.5", qEuler * 0.5);
print_quat("qEuler / 2.0", qEuler / 2.0);
print_quat("qEuler + q2", qEuler + q2);
print_quat("qEuler - q2", qEuler - q2);
print_quat("-qEuler", -qEuler);
log("qEuler == qEuler ? " + (qEuler == qEuler ? "true" : "false"));
log("qEuler == q2 ? " + (qEuler == q2 ? "true" : "false"));
double pitch, yaw, roll;
qEuler.to_euler(pitch, yaw, roll);
log("qEuler.to_euler() -> pitch=" + pitch + ", yaw=" + yaw + ", roll=" + roll);
vector3 v3Test(1.0, 0.0, 0.0);
vector3 v3Rot = qEuler.rotate(v3Test);
print_vec3("qEuler.rotate(1,0,0)", v3Rot);
// ----------------------------------------------------------------
// matrix4x4
// ----------------------------------------------------------------
matrix4x4 I = mat4_identity();
matrix4x4 T = mat4_translate(1.0, 2.0, 3.0);
matrix4x4 S = mat4_scale(2.0, 3.0, 4.0);
matrix4x4 R = mat4_rotate_euler(30.0, 45.0, 10.0);
matrix4x4 Qm = mat4_from_quaternion(qEuler);
vector3 v3_id = I.transform(v3a);
vector3 v3_t = T.transform(v3a);
vector3 v3_s = S.transform(v3a);
vector3 v3_r = R.transform(v3a);
vector3 v3_qm = Qm.transform(v3a);
print_vec3("I.transform(v3a)", v3_id);
print_vec3("T.transform(v3a)", v3_t);
print_vec3("S.transform(v3a)", v3_s);
print_vec3("R.transform(v3a)", v3_r);
print_vec3("Qm.transform(v3a)", v3_qm);
matrix4x4 M = T * S * R;
vector3 v3_m = M.transform(v3a);
print_vec3("M.transform(v3a)", v3_m);
log("=== Extended Math test DONE ===");
return 1;
}