Files
lity3d/Engine/Scene/scene_render.c
T

66 lines
1.8 KiB
C

#include "scene_render.h"
#include <stdlib.h>
#include <string.h>
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);
}