#pragma once // ============================================================================ // scene_graph.h - 场景图: 节点树 + 变换继承 // ============================================================================ #include "../ASM/math_c_fallback.h" #include #define MAX_CHILDREN 64 #define MAX_NODES 1024 // 场景节点 typedef struct SceneNode { int id; char name[64]; // 本地变换 Vec3 position; Quat rotation; Vec3 scale; // 世界矩阵 (每帧由 scene_update 计算) Mat4 world_matrix; Mat4 local_matrix; // 层级 struct SceneNode* parent; struct SceneNode* children[MAX_CHILDREN]; int child_count; // 标志 int visible; int dirty; // 需要重新计算矩阵 // 用户数据 void* user_data; int user_type; } SceneNode; // 场景 typedef struct Scene { SceneNode nodes[MAX_NODES]; int node_count; SceneNode* root; int next_id; } Scene; // 初始化/销毁 void scene_init(Scene* scene); void scene_destroy(Scene* scene); // 节点管理 SceneNode* scene_create_node(Scene* scene, const char* name); void scene_destroy_node(Scene* scene, SceneNode* node); SceneNode* scene_find_node(Scene* scene, int id); SceneNode* scene_find_by_name(Scene* scene, const char* name); // 层级 void scene_set_parent(SceneNode* child, SceneNode* parent); void scene_add_child(SceneNode* parent, SceneNode* child); void scene_remove_child(SceneNode* parent, SceneNode* child); // 变换 void scene_set_position(SceneNode* node, float x, float y, float z); void scene_set_rotation_euler(SceneNode* node, float rx, float ry, float rz); void scene_set_scale(SceneNode* node, float sx, float sy, float sz); void scene_set_rotation_quat(SceneNode* node, const Quat* q); void scene_mark_dirty(SceneNode* node); // 每帧更新 void scene_update(Scene* scene); // 获取世界变换 void scene_get_world_position(SceneNode* node, Vec3* out); void scene_get_world_rotation(SceneNode* node, Quat* out); void scene_get_world_scale(SceneNode* node, Vec3* out);