// This file is part of the 64k demo project. // It defines the base 3D Object structure. // Handles transforms and bounding volumes for hybrid rendering. #pragma once #include "util/mini_math.h" #include "util/asset_manager.h" enum class ObjectType { CUBE, SPHERE, PLANE, TORUS, BOX, SKYBOX, MESH // Add more SDF types here }; struct BoundingVolume { vec3 min; vec3 max; }; class Object3D { public: vec3 position; quat rotation; vec3 scale; ObjectType type; // Material parameters could go here (color, roughness, etc.) vec4 color; // Physics fields vec3 velocity; float mass; float restitution; bool is_static; AssetId mesh_asset_id; Object3D(ObjectType t = ObjectType::CUBE) : position(0, 0, 0), rotation(0, 0, 0, 1), scale(1, 1, 1), type(t), color(1, 1, 1, 1), velocity(0, 0, 0), mass(1.0f), restitution(0.5f), is_static(false), mesh_asset_id((AssetId)0) { } mat4 get_model_matrix() const { mat4 T = mat4::translate(position); mat4 R = rotation.to_mat(); mat4 S = mat4::scale(scale); // M = T * R * S return T * (R * S); } // Returns the local-space AABB of the primitive (before transform) // Used to generate the proxy geometry for rasterization. BoundingVolume get_local_bounds() const { if (type == ObjectType::TORUS) return {{-1.5f, -0.5f, -1.5f}, {1.5f, 0.5f, 1.5f}}; // Simple defaults for unit primitives return {{-1, -1, -1}, {1, 1, 1}}; } };