src/scene_node.c

Sat, 26 Jul 2025 21:13:05 +0200

author
Mike Becker <universe@uap-core.de>
date
Sat, 26 Jul 2025 21:13:05 +0200
changeset 227
a5775e8dbc13
parent 211
f181205da2c9
permissions
-rw-r--r--

simplify build and copy assets to build dir

demo programs can then be run directly from the build dir

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>
114
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
34 #include <cx/printf.h>
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
35
207
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
36 #include <assert.h>
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38 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
39 AscSceneNode *node,
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40 bool visit_on_exit
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
41 ) {
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
42 return cx_tree_iterator(
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43 node, visit_on_exit,
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 offsetof(AscSceneNode, children),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45 offsetof(AscSceneNode, next)
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 );
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
47 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 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
50 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
51 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
52 return node;
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54
113
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
55 static void asc_scene_node_destroy(AscSceneNode *node) {
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
56 cxListFree(node->behaviors);
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
57 if (node->user_data_free_func != NULL) {
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
58 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
59 }
113
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
60 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
61 node->destroy_func(node);
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
62 }
114
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
63 if (node->name.ptr != NULL) {
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
64 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
65 cx_strfree(&node->name);
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
66 }
113
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
67 }
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
68
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69 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
70 if (node == NULL) return;
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72 // remove this node from its parent
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73 asc_scene_node_unlink(node);
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75 // free the entire subtree
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
76 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
77 cx_foreach(AscSceneNode*, child, iter) {
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
78 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
79 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
80 cxFreeDefault(child);
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
82 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
83
207
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
84 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
85 if (args.name != NULL) {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
86 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
87 }
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
88 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
89 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
90 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
91 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
92 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
93 }
207
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
94 node->update_func = args.update_func;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
95 node->destroy_func = args.destroy_func;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
96 node->draw_func = args.draw_func;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
97
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
98 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
99 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
100 } 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
101 node->position = args.pos3d;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
102 }
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
103
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
104 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
105 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
106 } 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
107 node->origin = args.origin3d;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
108 }
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
109
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
110 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
111 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
112 } 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
113 node->scale = args.scale3d;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
114 } else {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
115 node->scale = ASC_VEC3F_1;
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
116 }
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
117
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
118 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
119 asc_mat4f_unit(node->rotation);
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
120 } else {
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
121 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
122 }
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
123
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
124 asc_scene_node_update(node);
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
125 }
4d184a8706b1 add asc_scene_node_init() - fixes #695
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
126
204
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
127 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
128 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
129
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
130 // 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
131 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
132
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
133 // 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
134 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
135
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
136 // 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
137 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
138 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
139
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
140 // 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
141 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
142 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
143 }
be5cf64b5c29 rework how transformations work to allow rotations around a point of origin
Mike Becker <universe@uap-core.de>
parents: 189
diff changeset
144
114
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
145 void asc_scene_node_name(AscSceneNode *node, const char *name) {
122
1b118cd3e369 replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents: 116
diff changeset
146 cx_strfree(&node->name);
114
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
147 if (name == NULL) {
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
148 node->name.ptr = NULL;
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
149 node->name.length = 0;
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
150 } else {
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
151 node->name.ptr = strdup(name);
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
152 node->name.length = strlen(name);
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
153 }
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
154 }
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
155
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
156 cxstring asc_scene_node_get_name(AscSceneNode *node) {
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
157 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
158
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
159 AscSceneNode *parent = node->parent;
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
160 while (parent != NULL && parent->name.ptr == NULL) {
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
161 parent = parent->parent;
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
162 }
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
163 if (parent == NULL) {
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
164 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
165 "%"PRIxPTR " - w/o named parent", (uintptr_t)node);
114
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
166 } else {
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
167 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
168 "%"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
169 }
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
170
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
171 return cx_strcast(node->name);
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
172 }
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
173
95
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
174 void asc_scene_node_link(AscSceneNode * restrict parent, AscSceneNode * restrict node) {
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
175 cx_tree_link(
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
176 parent, node,
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
177 offsetof(AscSceneNode, parent),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
178 offsetof(AscSceneNode, children),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
179 offsetof(AscSceneNode, last_child),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
180 offsetof(AscSceneNode, prev),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
181 offsetof(AscSceneNode, next)
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
182 );
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
183 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
184 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
185
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
186 void asc_scene_node_unlink(AscSceneNode *node) {
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
187 cx_tree_unlink(
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
188 node,
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
189 offsetof(AscSceneNode, parent),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
190 offsetof(AscSceneNode, children),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
191 offsetof(AscSceneNode, last_child),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
192 offsetof(AscSceneNode, prev),
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
193 offsetof(AscSceneNode, next)
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
194 );
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
195 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
196 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
197
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
198 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
199 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
200 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
201
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
202 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
203 // 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
204 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
205 return;
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
206 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
207
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
208 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
209 cx_foreach(AscSceneNode*, n, iter) {
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
210 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
211 cxTreeIteratorContinue(iter);
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
212 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
213 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
214 }
622887f7e954 in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
diff changeset
215 }
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
216
210
3021616e5772 improve asc_scene_node_allocate_data()
Mike Becker <universe@uap-core.de>
parents: 207
diff changeset
217 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
218 if (node->user_data != NULL) {
210
3021616e5772 improve asc_scene_node_allocate_data()
Mike Becker <universe@uap-core.de>
parents: 207
diff changeset
219 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
220 if (node->user_data_free_func != NULL) {
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
221 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
222 }
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
223 }
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
224 node->user_data = cxZallocDefault(n);
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
225 node->user_data_allocator = cxDefaultAllocator;
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
226 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
227 return node->user_data;
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
228 }

mercurial