fix: .gitignore + add 44 language JSON files
This commit is contained in:
1 parent
e8fd68e27b
commit
8de545dd2c
227 files changed
+22603
No files matched your search
@@ -0,0 +1,65 @@
|
||||
#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);
|
||||
}
|
||||
Reference in new issue
Block a user