]> git.lizzy.rs Git - shadowclad.git/blob - src/engine/scene.c
Housekeeping
[shadowclad.git] / src / engine / scene.c
1 #include "scene.h"
2
3 #include <stdlib.h>
4
5 #include "engine/logger.h"
6
7 Scene* currentScene = NULL;
8
9
10
11 Scene* newScene() {
12         Scene* scene = malloc(sizeof(Scene));
13         *scene = (Scene) { .parent = NULL,
14                            .numChildren = 0u,
15                            .children = NULL,
16                            .transform = identity(),
17                            .solid = NULL };
18         return scene;
19 }
20
21 void insertChildScene(Scene* scene, Scene* newChild) {
22         if (!scene || !newChild) {
23                 return;
24         }
25         if (newChild->parent) {
26                 logError(
27                         "Cannot insert scene 0x%p as child of 0x%p, because it is already child of 0x%p",
28                         newChild,
29                         scene,
30                         newChild->parent);
31                 return;
32         }
33
34         scene->children = realloc(scene->children, ++(scene->numChildren) * sizeof(Scene*));
35         scene->children[scene->numChildren - 1] = newChild;
36
37         newChild->parent = scene;
38 }
39
40 void reparentScene(Scene* scene, Scene* newParent) {
41         if (!scene) {
42                 return;
43         }
44
45         if (scene->parent) {
46                 Scene* parent = scene->parent;
47                 size_t indexInParent = parent->numChildren;
48                 for (size_t i = 0; i < parent->numChildren; ++i) {
49                         if (parent->children[i] == scene) {
50                                 indexInParent = i;
51                                 break;
52                         }
53                 }
54                 // This includes the hopefully impossible case where parent->numChildren == 0
55                 if (indexInParent == parent->numChildren) {
56                         logError("Scene %p not found in children of parent %p", scene, parent);
57                 }
58                 else {
59                         for (size_t i = indexInParent; i < parent->numChildren - 1; ++i) {
60                                 parent->children[i] = parent->children[i + 1];
61                         }
62                         parent->children = realloc(parent->children, --(parent->numChildren) * sizeof(Scene*));
63                 }
64         }
65
66         scene->parent = NULL;
67
68         insertChildScene(newParent, scene);
69 }