// This file is part of the 64k demo project. // It tests the 3D system components (Camera, Object, Scene). #include "3d/camera.h" #include "3d/object.h" #include "3d/scene.h" #include #include #include bool near(float a, float b, float e = 0.001f) { return std::abs(a - b) < e; } void test_camera() { std::cout << "Testing Camera..." << std::endl; Camera cam; cam.position = vec3(0, 0, 10); cam.target = vec3(0, 0, 0); mat4 view = cam.get_view_matrix(); // Camera at (0,0,10) looking at (0,0,0). World (0,0,0) -> View (0,0,-10) assert(near(view.m[14], -10.0f)); mat4 proj = cam.get_projection_matrix(); // Check aspect ratio influence (m[0] = 1/(tan(fov/2)*asp)) // fov ~0.785 (45deg), tan(22.5) ~0.414. asp=1.777. // m[0] should be around 1.35 assert(proj.m[0] > 1.0f); } void test_object_transform() { std::cout << "Testing Object Transform..." << std::endl; Object3D obj; obj.position = vec3(10, 0, 0); // Model matrix should translate by (10,0,0) mat4 m = obj.get_model_matrix(); assert(near(m.m[12], 10.0f)); // Col 3, Row 0 is x translation in Col-Major? // Wait, my mat4 struct: // r.m[12] = t.x; // Index 12 is translation X assert(near(m.m[12], 10.0f)); // Rotate 90 deg Y obj.rotation = quat::from_axis(vec3(0, 1, 0), 1.570796f); m = obj.get_model_matrix(); // Transform point (1,0,0) -> Rot(0,0,-1) -> Trans(10,0,-1) vec4 p(1, 0, 0, 1); vec4 res = m * p; assert(near(res.x, 10.0f)); // Rotated vector is (0,0,-1). + (10,0,0) translation -> (10,0,-1) assert(near(res.z, -1.0f)); } void test_scene() { std::cout << "Testing Scene..." << std::endl; Scene scene; scene.add_object(Object3D()); assert(scene.objects.size() == 1); scene.clear(); assert(scene.objects.empty()); } int main() { test_camera(); test_object_transform(); test_scene(); std::cout << "--- 3D SYSTEM TESTS PASSED ---" << std::endl; return 0; }