src/scene_node.c

Tue, 07 Apr 2026 20:33:29 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 07 Apr 2026 20:33:29 +0200
changeset 305
67a590cf2d15
parent 303
21ff357e773c
permissions
-rw-r--r--

implement add/remove to node dictionary

95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 * Copyright 2023 Mike Becker. All rights reserved.
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 *
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * modification, are permitted provided that the following conditions are met:
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 *
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 * 1. Redistributions of source code must retain the above copyright
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * notice, this list of conditions and the following disclaimer.
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 *
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 * 2. Redistributions in binary form must reproduce the above copyright
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * notice, this list of conditions and the following disclaimer in the
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * documentation and/or other materials provided with the distribution.
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 *
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * POSSIBILITY OF SUCH DAMAGE.
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 */
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 #include "ascension/scene_node.h"
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 #include "ascension/context.h"
207
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
30 #include "ascension/error.h"
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32 #include <cx/tree.h>
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33 #include <cx/linked_list.h>
303
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
34 #include <cx/hash_map.h>
114
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
35 #include <cx/printf.h>
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
36
207
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
37 #include <assert.h>
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38
303
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
39 AscSceneNodeDict *asc_scene_node_dict_create(void) {
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
40 return cxHashMapCreate(cxDefaultAllocator, sizeof(AscSceneNodeDictEntry), 0);
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
41 }
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
42
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
43 void asc_scene_node_dict_free(AscSceneNodeDict *dict) {
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
44 cxMapFree(dict);
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
45 }
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
46
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
47 static void asc_scene_node_dict_add(AscSceneNodeDict *dict, AscSceneNode *node) {
305
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
48 if (dict == NULL) return;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
49
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
50 // set a reference to the dict in the node
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
51 node->dict = dict;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
52
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
53 // also add child nodes which have a dedicated name
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
54 AscSceneNode *child = node->children;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
55 while (child != NULL) {
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
56 asc_scene_node_dict_add(dict, child);
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
57 child = child->next;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
58 }
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
59
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
60 if (!asc_test_flag(node->flags, ASC_SCENE_NODE_HAS_NAME)) return;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
61
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
62 AscSceneNodeDictEntry *entry = cxMapGet(dict, node->name);
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
63 if (entry == NULL) {
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
64 entry = cxMapEmplace(dict, node->name);
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
65 entry->count = 1;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
66 entry->node = cxMallocDefault(sizeof(AscSceneNode*));
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
67 entry->node[0] = node;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
68 asc_dprintf("Dict add: %" CX_PRIstr,
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
69 CX_SFMT(node->name));
303
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
70 return;
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
71 }
305
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
72 if (cxReallocateArrayDefault(&entry->node, entry->count + 1, sizeof(AscSceneNode*))) {
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
73 asc_error("Reallocating dict entry for node %" CX_PRIstr " failed.",
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
74 CX_SFMT(node->name));
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
75 }
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
76 entry->node[entry->count++] = node;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
77 asc_dprintf("Dict add: %" CX_PRIstr " (now %z entries).",
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
78 CX_SFMT(node->name), entry->count);
303
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
79 }
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
80
305
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
81 static void asc_scene_node_dict_remove(AscSceneNode *node) {
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
82 // fast exit, node (and its children) do not belong to a dict
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
83 if (node->dict == NULL) return;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
84
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
85 // remove the children, first (use standard recursion, depth will be manageable)
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
86 // TODO: think about adding a flag for indicating if ANY child has a name, so that we can skip subtrees here
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
87 AscSceneNode *child = node->children;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
88 while (child != NULL) {
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
89 asc_scene_node_dict_remove(child);
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
90 child = child->next;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
91 }
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
92
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
93 if (!asc_test_flag(node->flags, ASC_SCENE_NODE_HAS_NAME)) return;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
94
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
95 AscSceneNodeDictEntry *entry = cxMapGet(node->dict, node->name);
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
96 if (entry == NULL) return;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
97
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
98 // last node with that name, remove node
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
99 if (entry->count == 1) {
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
100 if (*entry->node == node) {
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
101 cxMapRemove(node->dict, node->name);
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
102 asc_dprintf("Dict remove: %" CX_PRIstr,
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
103 CX_SFMT(node->name));
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
104 } else {
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
105 asc_error("BUG: Node %" CX_PRIstr " not found in its own dict.",
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
106 CX_SFMT(node->name));
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
107 }
303
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
108 return;
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
109 }
305
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
110
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
111 // find index of the particular node
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
112 unsigned idx;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
113 for (idx = 0 ; idx < entry->count ; idx++) {
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
114 if (entry->node[idx] == node) break;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
115 }
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
116 if (idx == entry->count) {
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
117 asc_error("BUG: Node %" CX_PRIstr " not found in its own dict.",
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
118 CX_SFMT(node->name));
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
119 return;
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
120 }
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
121 entry->node[idx] = entry->node[--entry->count];
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
122 if (cxReallocateArrayDefault(&entry->node, entry->count, sizeof(AscSceneNode*))) {
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
123 asc_error("Shrinking dict for node %" CX_PRIstr " failed.",
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
124 CX_SFMT(node->name));
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
125 }
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
126 asc_dprintf("Dict remove: %" CX_PRIstr " (%z others left).",
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
127 CX_SFMT(node->name), entry->count);
303
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
128 }
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
129
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
130 static CxTreeIterator asc_scene_node_iterator(
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
131 AscSceneNode *node,
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
132 bool visit_on_exit
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
133 ) {
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
134 return cx_tree_iterator(
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
135 node, visit_on_exit,
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
136 offsetof(AscSceneNode, children),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
137 offsetof(AscSceneNode, next)
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
138 );
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
139 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
140
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
141 AscSceneNode *asc_scene_node_empty(void) {
122
1b118cd3e369 replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents: 116
diff changeset
142 AscSceneNode *node = cxZallocDefault(sizeof(AscSceneNode));
211
f181205da2c9 fix that empty nodes fail to recalculate world transforms in the scene graph
Mike Becker <universe@uap-core.de>
parents: 210
diff changeset
143 asc_scene_node_init(node, .render_group = ASC_RENDER_GROUP_NONE);
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
144 return node;
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
145 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
146
113
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
147 static void asc_scene_node_destroy(AscSceneNode *node) {
286
26a41832c81d behaviors do not need names
Mike Becker <universe@uap-core.de>
parents: 266
diff changeset
148 cxListFree(node->behaviors);
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
149 if (node->user_data_free_func != NULL) {
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
150 node->user_data_free_func((void*)node->user_data_allocator, node->user_data);
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
151 }
113
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
152 if (node->destroy_func != NULL) {
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
153 node->destroy_func(node);
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
154 }
114
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
155 if (node->name.ptr != NULL) {
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
156 asc_dprintf("Destroy node: %"CX_PRIstr, CX_SFMT(node->name));
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
157 cx_strfree(&node->name);
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
158 }
113
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
159 }
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
160
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
161 void asc_scene_node_free(AscSceneNode *node) {
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
162 if (node == NULL) return;
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
163
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
164 // remove this node from its parent
290
2eb3813562e7 update uwproj and ucx
Mike Becker <universe@uap-core.de>
parents: 286
diff changeset
165 asc_scene_node_remove(node);
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
166
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
167 // free the entire subtree
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
168 CxTreeIterator iter = asc_scene_node_iterator(node, true);
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
169 cx_foreach(AscSceneNode*, child, iter) {
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
170 if (!iter.exiting) continue;
113
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
171 asc_scene_node_destroy(child);
122
1b118cd3e369 replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents: 116
diff changeset
172 cxFreeDefault(child);
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
173 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
174 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
175
207
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
176 void asc_scene_node_init_(AscSceneNode *node, struct asc_scene_node_init_args args) {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
177 if (args.name != NULL) {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
178 asc_scene_node_name(node, args.name);
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
179 }
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
180 node->render_group = args.render_group;
211
f181205da2c9 fix that empty nodes fail to recalculate world transforms in the scene graph
Mike Becker <universe@uap-core.de>
parents: 210
diff changeset
181 if (args.render_group != ASC_RENDER_GROUP_NONE) {
f181205da2c9 fix that empty nodes fail to recalculate world transforms in the scene graph
Mike Becker <universe@uap-core.de>
parents: 210
diff changeset
182 assert(args.update_func != NULL);
f181205da2c9 fix that empty nodes fail to recalculate world transforms in the scene graph
Mike Becker <universe@uap-core.de>
parents: 210
diff changeset
183 assert(args.draw_func != NULL);
f181205da2c9 fix that empty nodes fail to recalculate world transforms in the scene graph
Mike Becker <universe@uap-core.de>
parents: 210
diff changeset
184 assert(args.destroy_func != NULL);
f181205da2c9 fix that empty nodes fail to recalculate world transforms in the scene graph
Mike Becker <universe@uap-core.de>
parents: 210
diff changeset
185 }
207
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
186 node->update_func = args.update_func;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
187 node->destroy_func = args.destroy_func;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
188 node->draw_func = args.draw_func;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
189
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
190 if (args.pos2d.x != 0 || args.pos2d.y != 0) {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
191 node->position = ASC_VEC3F(args.pos2d.x, args.pos2d.y, ASC_SCENE_2D_DEPTH_OFFSET);
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
192 } else if (args.pos3d.x != 0 || args.pos3d.y != 0 || args.pos3d.z != 0) {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
193 node->position = args.pos3d;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
194 }
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
195
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
196 if (args.origin2d.x != 0 || args.origin2d.y != 0) {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
197 node->origin = ASC_VEC3F(args.origin2d.x, args.origin2d.y, 0.f);
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
198 } else if (args.origin3d.x != 0 || args.origin3d.y != 0 || args.origin3d.z != 0) {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
199 node->origin = args.origin3d;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
200 }
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
201
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
202 if (args.scale2d.width != 0 && args.scale2d.height != 0) {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
203 node->scale = ASC_VEC3F(args.scale2d.width, args.scale2d.height, 1.f);
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
204 } else if (args.scale3d.x != 0 && args.scale3d.height != 0 && args.scale3d.depth != 0) {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
205 node->scale = args.scale3d;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
206 } else {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
207 node->scale = ASC_VEC3F_1;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
208 }
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
209
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
210 if (asc_memcmpz(args.rotation, ASC_TRANSFORM_SIZE)) {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
211 asc_mat4f_unit(node->rotation);
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
212 } else {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
213 asc_transform_copy(node->rotation, args.rotation);
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
214 }
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
215
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
216 asc_scene_node_update(node);
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
217 }
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
218
204
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
219 void asc_scene_node_calculate_transform(AscSceneNode *node) {
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
220 asc_transform temp, temp2;
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
221
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
222 // move the point of origin
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
223 asc_transform_translate3f(temp, asc_vec3f_neg(node->origin));
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
224
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
225 // apply the rotation
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
226 asc_transform_apply(node->transform, node->rotation, temp);
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
227
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
228 // apply the scale
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
229 asc_transform_scale3f(temp, node->scale);
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
230 asc_transform_apply(temp2, temp, node->transform);
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
231
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
232 // apply the translation
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
233 asc_transform_translate3f(temp, node->position);
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
234 asc_transform_apply(node->transform, temp, temp2);
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
235 }
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
236
114
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
237 void asc_scene_node_name(AscSceneNode *node, const char *name) {
305
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
238 asc_scene_node_dict_remove(node);
122
1b118cd3e369 replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents: 116
diff changeset
239 cx_strfree(&node->name);
303
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
240 if (name == NULL) {
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
241 asc_clear_flag(node->flags, ASC_SCENE_NODE_HAS_NAME);
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
242 } else {
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
243 asc_set_flag(node->flags, ASC_SCENE_NODE_HAS_NAME);
292
25931abee09f fix compilation errors introduced by recent UCX update
Mike Becker <universe@uap-core.de>
parents: 290
diff changeset
244 node->name = cx_strdup(name);
303
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
245 asc_scene_node_dict_add(node->dict, node);
114
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
246 }
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
247 }
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
248
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
249 cxstring asc_scene_node_get_name(AscSceneNode *node) {
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
250 if (node->name.ptr != NULL) return cx_strcast(node->name);
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
251
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
252 AscSceneNode *parent = node->parent;
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
253 while (parent != NULL && parent->name.ptr == NULL) {
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
254 parent = parent->parent;
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
255 }
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
256 if (parent == NULL) {
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
257 cx_sprintf(&node->name.ptr, &node->name.length,
179
9d0946907cd9 fix formatting of generated names of scene nodes
Mike Becker <universe@uap-core.de>
parents: 175
diff changeset
258 "%"PRIxPTR " - w/o named parent", (uintptr_t)node);
114
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
259 } else {
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
260 cx_sprintf(&node->name.ptr, &node->name.length,
179
9d0946907cd9 fix formatting of generated names of scene nodes
Mike Becker <universe@uap-core.de>
parents: 175
diff changeset
261 "%"PRIxPTR " - child of %"CX_PRIstr, (uintptr_t)node, CX_SFMT(parent->name));
114
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
262 }
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
263
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
264 return cx_strcast(node->name);
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
265 }
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
266
290
2eb3813562e7 update uwproj and ucx
Mike Becker <universe@uap-core.de>
parents: 286
diff changeset
267 void asc_scene_node_add(AscSceneNode * restrict parent, AscSceneNode * restrict node) {
303
21ff357e773c prepare node (/ entity) dictionary per scene
Mike Becker <universe@uap-core.de>
parents: 292
diff changeset
268 asc_scene_node_dict_add(parent->dict, node);
290
2eb3813562e7 update uwproj and ucx
Mike Becker <universe@uap-core.de>
parents: 286
diff changeset
269 cx_tree_add(
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
270 parent, node,
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
271 offsetof(AscSceneNode, parent),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
272 offsetof(AscSceneNode, children),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
273 offsetof(AscSceneNode, last_child),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
274 offsetof(AscSceneNode, prev),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
275 offsetof(AscSceneNode, next)
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
276 );
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
277 asc_scene_node_update_transform(node);
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
278 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
279
290
2eb3813562e7 update uwproj and ucx
Mike Becker <universe@uap-core.de>
parents: 286
diff changeset
280 void asc_scene_node_remove(AscSceneNode *node) {
305
67a590cf2d15 implement add/remove to node dictionary
Mike Becker <universe@uap-core.de>
parents: 303
diff changeset
281 asc_scene_node_dict_remove(node);
290
2eb3813562e7 update uwproj and ucx
Mike Becker <universe@uap-core.de>
parents: 286
diff changeset
282 cx_tree_remove(
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
283 node,
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
284 offsetof(AscSceneNode, parent),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
285 offsetof(AscSceneNode, children),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
286 offsetof(AscSceneNode, last_child),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
287 offsetof(AscSceneNode, prev),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
288 offsetof(AscSceneNode, next)
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
289 );
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
290 asc_scene_node_update_transform(node);
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
291 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
292
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
293 void asc_scene_node_update(AscSceneNode *node) {
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
294 asc_set_flag(node->flags, ASC_SCENE_NODE_UPDATE_GRAPHICS);
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
295 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
296
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
297 void asc_scene_node_update_transform(AscSceneNode *node) {
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
298 // fast skip if node is already marked
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
299 if (asc_test_flag(node->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM)) {
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
300 return;
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
301 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
302
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
303 CxTreeIterator iter = asc_scene_node_iterator(node, false);
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
304 cx_foreach(AscSceneNode*, n, iter) {
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
305 if (asc_test_flag(n->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM)) {
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
306 cxTreeIteratorContinue(iter);
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
307 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
308 asc_set_flag(n->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM);
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
309 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
310 }
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
311
210
3021616e5772 improve asc_scene_node_allocate_data()
Mike Becker <universe@uap-core.de>
parents: 207
diff changeset
312 void *asc_scene_node_allocate_data(AscSceneNode *node, size_t n) {
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
313 if (node->user_data != NULL) {
210
3021616e5772 improve asc_scene_node_allocate_data()
Mike Becker <universe@uap-core.de>
parents: 207
diff changeset
314 asc_wprintf("Node %"CX_PRIstr" already has user data which is now destroyed!", CX_SFMT(node->name));
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
315 if (node->user_data_free_func != NULL) {
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
316 node->user_data_free_func((void*)node->user_data_allocator, node->user_data);
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
317 }
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
318 }
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
319 node->user_data = cxZallocDefault(n);
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
320 node->user_data_allocator = cxDefaultAllocator;
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
321 node->user_data_free_func = (cx_destructor_func2) cxFree;
210
3021616e5772 improve asc_scene_node_allocate_data()
Mike Becker <universe@uap-core.de>
parents: 207
diff changeset
322 return node->user_data;
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
323 }

mercurial