#include "scene_render.h" #include #include void scene_node_set_mesh_renderer(SceneNode* node, MeshRenderer* renderer) { if (!node) return; node->user_type = 1; node->user_data = renderer; } MeshRenderer* scene_node_get_mesh_renderer(SceneNode* node) { if (!node || node->user_type != 1) return NULL; return (MeshRenderer*)node->user_data; } static void scene_render_node_recursive(SceneNode* node, Renderer* r) { if (!node || !node->visible) return; MeshRenderer* mr = scene_node_get_mesh_renderer(node); if (mr && mr->mesh && mr->material) { renderer_draw_mesh_with_material(r, mr->mesh, mr->material, &node->world_matrix); } for (int i = 0; i < node->child_count; i++) { scene_render_node_recursive(node->children[i], r); } } void scene_render(Scene* scene, Renderer* r) { if (!scene || !r) return; scene_render_node_recursive(scene->root, r); } MeshRenderer* mesh_renderer_create(MeshType type, Mesh* mesh, Material* material) { MeshRenderer* mr = (MeshRenderer*)calloc(1, sizeof(MeshRenderer)); mr->type = type; mr->mesh = mesh; mr->material = material; mr->path[0] = '\0'; return mr; } void mesh_renderer_destroy(MeshRenderer* mr) { if (!mr) return; if (mr->material) material_destroy(mr->material); free(mr); } static void destroy_renderers_recursive(SceneNode* node) { if (!node) return; MeshRenderer* mr = scene_node_get_mesh_renderer(node); if (mr) { mesh_renderer_destroy(mr); node->user_data = NULL; node->user_type = 0; } for (int i = 0; i < node->child_count; i++) { destroy_renderers_recursive(node->children[i]); } } void scene_destroy_renderers(Scene* scene) { if (!scene) return; destroy_renderers_recursive(scene->root); }