Sat, 26 Jul 2025 21:13:05 +0200
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 | 34 | #include <cx/printf.h> |
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 | 57 | if (node->user_data_free_func != NULL) { |
58 | node->user_data_free_func((void*)node->user_data_allocator, node->user_data); | |
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 | 63 | if (node->name.ptr != NULL) { |
64 | asc_dprintf("Destroy node: %"CX_PRIstr, CX_SFMT(node->name)); | |
65 | cx_strfree(&node->name); | |
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 | 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 | 147 | if (name == NULL) { |
148 | node->name.ptr = NULL; | |
149 | node->name.length = 0; | |
150 | } else { | |
151 | node->name.ptr = strdup(name); | |
152 | node->name.length = strlen(name); | |
153 | } | |
154 | } | |
155 | ||
156 | cxstring asc_scene_node_get_name(AscSceneNode *node) { | |
157 | if (node->name.ptr != NULL) return cx_strcast(node->name); | |
158 | ||
159 | AscSceneNode *parent = node->parent; | |
160 | while (parent != NULL && parent->name.ptr == NULL) { | |
161 | parent = parent->parent; | |
162 | } | |
163 | if (parent == NULL) { | |
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 | 166 | } else { |
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 | 169 | } |
170 | ||
171 | return cx_strcast(node->name); | |
172 | } | |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 220 | if (node->user_data_free_func != NULL) { |
221 | node->user_data_free_func((void*)node->user_data_allocator, node->user_data); | |
222 | } | |
223 | } | |
224 | node->user_data = cxZallocDefault(n); | |
225 | node->user_data_allocator = cxDefaultAllocator; | |
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 | 228 | } |