Tue, 28 Oct 2025 22:03:06 +0100
fix that dependencies for tools are always checked
| 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: 
206diff
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: 
206diff
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: 
116diff
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: 
210diff
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: 
108diff
changeset | 55 | static void asc_scene_node_destroy(AscSceneNode *node) { | 
| 266 
a73674e99e62
convert behavior list to a behavior map
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 56 | cxMapFree(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: 
108diff
changeset | 60 | if (node->destroy_func != NULL) { | 
| 
71ba88258ea0
change node's free function to a destroy function
 Mike Becker <universe@uap-core.de> parents: 
108diff
changeset | 61 | node->destroy_func(node); | 
| 
71ba88258ea0
change node's free function to a destroy function
 Mike Becker <universe@uap-core.de> parents: 
108diff
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: 
108diff
changeset | 67 | } | 
| 
71ba88258ea0
change node's free function to a destroy function
 Mike Becker <universe@uap-core.de> parents: 
108diff
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: 
108diff
changeset | 79 | asc_scene_node_destroy(child); | 
| 122 
1b118cd3e369
replace all stdlib malloc/free with UCX allocator
 Mike Becker <universe@uap-core.de> parents: 
116diff
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: 
206diff
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: 
206diff
changeset | 85 | if (args.name != NULL) { | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 86 | asc_scene_node_name(node, args.name); | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 87 | } | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
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: 
210diff
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: 
210diff
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: 
210diff
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: 
210diff
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: 
210diff
changeset | 93 | } | 
| 207 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 94 | node->update_func = args.update_func; | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 95 | node->destroy_func = args.destroy_func; | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 96 | node->draw_func = args.draw_func; | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 97 | |
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
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: 
206diff
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: 
206diff
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: 
206diff
changeset | 101 | node->position = args.pos3d; | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 102 | } | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 103 | |
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
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: 
206diff
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: 
206diff
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: 
206diff
changeset | 107 | node->origin = args.origin3d; | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 108 | } | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 109 | |
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
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: 
206diff
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: 
206diff
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: 
206diff
changeset | 113 | node->scale = args.scale3d; | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 114 | } else { | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 115 | node->scale = ASC_VEC3F_1; | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 116 | } | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 117 | |
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
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: 
206diff
changeset | 119 | asc_mat4f_unit(node->rotation); | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 120 | } else { | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 121 | asc_transform_copy(node->rotation, args.rotation); | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 122 | } | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 123 | |
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 124 | asc_scene_node_update(node); | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 125 | } | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 126 | |
| 204 
be5cf64b5c29
rework how transformations work to allow rotations around a point of origin
 Mike Becker <universe@uap-core.de> parents: 
189diff
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: 
189diff
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: 
189diff
changeset | 129 | |
| 
be5cf64b5c29
rework how transformations work to allow rotations around a point of origin
 Mike Becker <universe@uap-core.de> parents: 
189diff
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: 
189diff
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: 
189diff
changeset | 132 | |
| 
be5cf64b5c29
rework how transformations work to allow rotations around a point of origin
 Mike Becker <universe@uap-core.de> parents: 
189diff
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: 
189diff
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: 
189diff
changeset | 135 | |
| 
be5cf64b5c29
rework how transformations work to allow rotations around a point of origin
 Mike Becker <universe@uap-core.de> parents: 
189diff
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: 
189diff
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: 
189diff
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: 
189diff
changeset | 139 | |
| 
be5cf64b5c29
rework how transformations work to allow rotations around a point of origin
 Mike Becker <universe@uap-core.de> parents: 
189diff
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: 
189diff
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: 
189diff
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: 
189diff
changeset | 143 | } | 
| 
be5cf64b5c29
rework how transformations work to allow rotations around a point of origin
 Mike Becker <universe@uap-core.de> parents: 
189diff
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: 
116diff
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: 
175diff
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: 
175diff
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: 
207diff
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: 
207diff
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: 
207diff
changeset | 227 | return node->user_data; | 
| 206 | 228 | } |