66 lines
1.8 KiB
C
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);
|
|
}
|