Tue, 28 Oct 2025 22:03:06 +0100
fix that dependencies for tools are always checked
| 21 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 1 | /* | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 3 | * Copyright 2023 Mike Becker. All rights reserved. | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 4 | * | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 5 | * Redistribution and use in source and binary forms, with or without | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 6 | * modification, are permitted provided that the following conditions are met: | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 7 | * | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 8 | * 1. Redistributions of source code must retain the above copyright | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 9 | * notice, this list of conditions and the following disclaimer. | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 10 | * | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 11 | * 2. Redistributions in binary form must reproduce the above copyright | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 12 | * notice, this list of conditions and the following disclaimer in the | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 13 | * documentation and/or other materials provided with the distribution. | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 14 | * | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 15 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 16 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 17 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 18 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 19 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 20 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 21 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 22 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 23 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
| 
1a47c57666f5
add first draft of a scene graph structure
 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 | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 25 | * POSSIBILITY OF SUCH DAMAGE. | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 26 | */ | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 27 | |
| 106 
895f92cff6b8
bring back error.h to reduce compile dependencies
 Mike Becker <universe@uap-core.de> parents: 
105diff
changeset | 28 | #include "ascension/error.h" | 
| 
895f92cff6b8
bring back error.h to reduce compile dependencies
 Mike Becker <universe@uap-core.de> parents: 
105diff
changeset | 29 | #include "ascension/context.h" | 
| 21 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 30 | #include "ascension/scene.h" | 
| 108 
d619bf7dd87b
add AscBehavior - prepares resolution of issue #646
 Mike Becker <universe@uap-core.de> parents: 
106diff
changeset | 31 | #include "ascension/behavior.h" | 
| 106 
895f92cff6b8
bring back error.h to reduce compile dependencies
 Mike Becker <universe@uap-core.de> parents: 
105diff
changeset | 32 | #include "ascension/shader.h" | 
| 220 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 33 | #include "ascension/util.h" | 
| 82 
4e1e698f4b0d
add generic mesh draw function and move sprite draw function to separate unit
 Mike Becker <universe@uap-core.de> parents: 
76diff
changeset | 34 | |
| 95 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
90diff
changeset | 35 | #include <cx/tree.h> | 
| 47 
44457f6cb0a2
remove unnecessary scene container
 Mike Becker <universe@uap-core.de> parents: 
45diff
changeset | 36 | #include <cx/array_list.h> | 
| 37 
8a8cc6725b48
add camera and render groups
 Mike Becker <universe@uap-core.de> parents: 
33diff
changeset | 37 | |
| 
8a8cc6725b48
add camera and render groups
 Mike Becker <universe@uap-core.de> parents: 
33diff
changeset | 38 | #include <GL/glew.h> | 
| 29 
1d001eb694dc
bring first scene graph to live
 Mike Becker <universe@uap-core.de> parents: 
27diff
changeset | 39 | |
| 21 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 40 | #include <assert.h> | 
| 
1a47c57666f5
add first draft of a scene graph structure
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 41 | |
| 220 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 42 | void asc_scene_init_(AscScene *scene, const char *name, struct asc_camera_init_args args) { | 
| 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 43 | assert(scene->root == NULL); | 
| 121 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
112diff
changeset | 44 | asc_camera_init_(&scene->camera, args); | 
| 100 
5231da78831e
change asc_scene_init() to also request parameters for camera initialization
 Mike Becker <universe@uap-core.de> parents: 
99diff
changeset | 45 | scene->root = asc_scene_node_empty(); | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 46 | for (unsigned i = 0 ; i < ASC_RENDER_GROUP_COUNT ; i++) { | 
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 47 | scene->internal.render_groups[i] = cxArrayListCreateSimple(CX_STORE_POINTERS, 32); | 
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 48 | } | 
| 220 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 49 | if (name == NULL) { | 
| 266 
a73674e99e62
convert behavior list to a behavior map
 Mike Becker <universe@uap-core.de> parents: 
262diff
changeset | 50 | scene->name = asc_util_gen_name("scene"); | 
| 220 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 51 | } else { | 
| 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 52 | scene->name.ptr = strdup(name); | 
| 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 53 | scene->name.length = strlen(name); | 
| 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 54 | } | 
| 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 55 | asc_dprintf("Initialized scene %"CX_PRIstr, CX_SFMT(scene->name)); | 
| 75 
0ce353485509
revert introduction of high level ucx trees and stick to the low level API
 Mike Becker <universe@uap-core.de> parents: 
73diff
changeset | 56 | } | 
| 
0ce353485509
revert introduction of high level ucx trees and stick to the low level API
 Mike Becker <universe@uap-core.de> parents: 
73diff
changeset | 57 | |
| 95 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
90diff
changeset | 58 | void asc_scene_destroy(AscScene *scene) { | 
| 220 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 59 | if (scene == NULL || scene->root == NULL) return; | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 60 | for (unsigned i = 0 ; i < ASC_RENDER_GROUP_COUNT ; i++) { | 
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 61 | cxListFree(scene->internal.render_groups[i]); | 
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 62 | scene->internal.render_groups[i] = NULL; | 
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 63 | } | 
| 95 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
90diff
changeset | 64 | asc_scene_node_free(scene->root); | 
| 220 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 65 | scene->root = NULL; | 
| 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 66 | asc_dprintf("Destroyed scene %"CX_PRIstr, CX_SFMT(scene->name)); | 
| 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
211diff
changeset | 67 | cx_strfree(&scene->name); | 
| 75 
0ce353485509
revert introduction of high level ucx trees and stick to the low level API
 Mike Becker <universe@uap-core.de> parents: 
73diff
changeset | 68 | } | 
| 
0ce353485509
revert introduction of high level ucx trees and stick to the low level API
 Mike Becker <universe@uap-core.de> parents: 
73diff
changeset | 69 | |
| 112 
3e956c96dd6c
extract execution of behaviors from draw function
 Mike Becker <universe@uap-core.de> parents: 
108diff
changeset | 70 | void asc_scene_execute_behaviors(AscScene *scene) { | 
| 
3e956c96dd6c
extract execution of behaviors from draw function
 Mike Becker <universe@uap-core.de> parents: 
108diff
changeset | 71 | CxTreeVisitor iter = cx_tree_visitor(scene->root, | 
| 
3e956c96dd6c
extract execution of behaviors from draw function
 Mike Becker <universe@uap-core.de> parents: 
108diff
changeset | 72 | offsetof(AscSceneNode, children), | 
| 
3e956c96dd6c
extract execution of behaviors from draw function
 Mike Becker <universe@uap-core.de> parents: 
108diff
changeset | 73 | offsetof(AscSceneNode, next) | 
| 
3e956c96dd6c
extract execution of behaviors from draw function
 Mike Becker <universe@uap-core.de> parents: 
108diff
changeset | 74 | ); | 
| 
3e956c96dd6c
extract execution of behaviors from draw function
 Mike Becker <universe@uap-core.de> parents: 
108diff
changeset | 75 | cx_foreach(AscSceneNode*, node, iter) { | 
| 266 
a73674e99e62
convert behavior list to a behavior map
 Mike Becker <universe@uap-core.de> parents: 
262diff
changeset | 76 | CxMapIterator behavior_iter = cxMapMutIteratorValues(node->behaviors); | 
| 112 
3e956c96dd6c
extract execution of behaviors from draw function
 Mike Becker <universe@uap-core.de> parents: 
108diff
changeset | 77 | cx_foreach(AscBehavior*, behavior, behavior_iter) { | 
| 268 
d8c05102b017
behaviors can now be paused while the node is hidden
 Mike Becker <universe@uap-core.de> parents: 
266diff
changeset | 78 | asc_behavior_trigger(behavior); | 
| 176 
cb2f60f48337
add asc_behavior_remove()
 Mike Becker <universe@uap-core.de> parents: 
150diff
changeset | 79 | if (behavior->killed) { | 
| 
cb2f60f48337
add asc_behavior_remove()
 Mike Becker <universe@uap-core.de> parents: 
150diff
changeset | 80 | cxIteratorFlagRemoval(behavior_iter); | 
| 
cb2f60f48337
add asc_behavior_remove()
 Mike Becker <universe@uap-core.de> parents: 
150diff
changeset | 81 | } | 
| 112 
3e956c96dd6c
extract execution of behaviors from draw function
 Mike Becker <universe@uap-core.de> parents: 
108diff
changeset | 82 | } | 
| 
3e956c96dd6c
extract execution of behaviors from draw function
 Mike Becker <universe@uap-core.de> parents: 
108diff
changeset | 83 | } | 
| 
3e956c96dd6c
extract execution of behaviors from draw function
 Mike Becker <universe@uap-core.de> parents: 
108diff
changeset | 84 | } | 
| 
3e956c96dd6c
extract execution of behaviors from draw function
 Mike Becker <universe@uap-core.de> parents: 
108diff
changeset | 85 | |
| 150 
3045f61bc4eb
make draw function dynamic
 Mike Becker <universe@uap-core.de> parents: 
148diff
changeset | 86 | static void asc_scene_draw2d( | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 87 | const AscScene *scene, | 
| 144 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 88 | const CxList *opaque, | 
| 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 89 | const CxList *blend | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 90 | ) { | 
| 144 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 91 | glEnable(GL_DEPTH_TEST); | 
| 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 92 | glClear(GL_DEPTH_BUFFER_BIT); | 
| 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 93 | const AscCamera *camera = asc_scene_camera(scene); | 
| 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 94 | |
| 150 
3045f61bc4eb
make draw function dynamic
 Mike Becker <universe@uap-core.de> parents: 
148diff
changeset | 95 | // render opaque nodes from front to back | 
| 144 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 96 | CxIterator iter_opaque = cxListBackwardsIterator(opaque); | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 97 | |
| 150 
3045f61bc4eb
make draw function dynamic
 Mike Becker <universe@uap-core.de> parents: 
148diff
changeset | 98 | // render nodes with alpha blending from back to front | 
| 144 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 99 | CxIterator iter_blend = cxListIterator(blend); | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 100 | |
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 101 | // TODO: implement interleaving by depth | 
| 144 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 102 | // TODO: implement sorting by shader ID to reduce shader switches | 
| 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 103 | if (cxIteratorValid(iter_opaque)) { | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 104 | glDisable(GL_BLEND); | 
| 150 
3045f61bc4eb
make draw function dynamic
 Mike Becker <universe@uap-core.de> parents: 
148diff
changeset | 105 | cx_foreach(const AscSceneNode*, node, iter_opaque) { | 
| 
3045f61bc4eb
make draw function dynamic
 Mike Becker <universe@uap-core.de> parents: 
148diff
changeset | 106 | node->draw_func(camera, node); | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 107 | } | 
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 108 | } | 
| 144 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 109 | if (cxIteratorValid(iter_blend)) { | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 110 | glEnable(GL_BLEND); | 
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 111 | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | 
| 150 
3045f61bc4eb
make draw function dynamic
 Mike Becker <universe@uap-core.de> parents: 
148diff
changeset | 112 | cx_foreach(const AscSceneNode*, node, iter_blend) { | 
| 
3045f61bc4eb
make draw function dynamic
 Mike Becker <universe@uap-core.de> parents: 
148diff
changeset | 113 | node->draw_func(camera, node); | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 114 | } | 
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 115 | } | 
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 116 | } | 
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 117 | |
| 99 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
96diff
changeset | 118 | void asc_scene_draw(AscScene *scene) { | 
| 96 
9e25f080a33e
add scenes, but they don't draw yet
 Mike Becker <universe@uap-core.de> parents: 
95diff
changeset | 119 | if (scene->root == NULL) return; | 
| 
9e25f080a33e
add scenes, but they don't draw yet
 Mike Becker <universe@uap-core.de> parents: 
95diff
changeset | 120 | |
| 233 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
220diff
changeset | 121 | // when the viewport is zero, exit immediately | 
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
220diff
changeset | 122 | if (scene->camera.viewport.size.width == 0 || scene->camera.viewport.size.height == 0) { | 
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
220diff
changeset | 123 | return; | 
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
220diff
changeset | 124 | } | 
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
220diff
changeset | 125 | |
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 126 | // reset render groups | 
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 127 | CxList **render_group = scene->internal.render_groups; | 
| 126 
77c13e14a65f
update to most recent ucx 3.2 preview
 Mike Becker <universe@uap-core.de> parents: 
121diff
changeset | 128 | for (unsigned i = 0 ; i < ASC_RENDER_GROUP_COUNT ; i++) { | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 129 | cxListClear(render_group[i]); | 
| 47 
44457f6cb0a2
remove unnecessary scene container
 Mike Becker <universe@uap-core.de> parents: 
45diff
changeset | 130 | } | 
| 32 
86468a71dd73
add transformation matrix
 Mike Becker <universe@uap-core.de> parents: 
31diff
changeset | 131 | |
| 99 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
96diff
changeset | 132 | // update the scene graph and add nodes to their render groups | 
| 95 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
90diff
changeset | 133 | CxTreeVisitor iter = cx_tree_visitor(scene->root, | 
| 99 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
96diff
changeset | 134 | offsetof(AscSceneNode, children), | 
| 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
96diff
changeset | 135 | offsetof(AscSceneNode, next) | 
| 95 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
90diff
changeset | 136 | ); | 
| 30 
fceda550ebcb
apply new CxTreeIterator from ucx 3.1 preview
 Mike Becker <universe@uap-core.de> parents: 
29diff
changeset | 137 | cx_foreach(AscSceneNode*, node, iter) { | 
| 55 
6b61b4899587
make hidden flag a general attribute of nodes
 Mike Becker <universe@uap-core.de> parents: 
51diff
changeset | 138 | // skip hidden nodes (and all their children) | 
| 259 
1315ac4d1368
add show/hide functions for scene nodes
 Mike Becker <universe@uap-core.de> parents: 
256diff
changeset | 139 | if (asc_scene_node_is_hidden(node)) { | 
| 55 
6b61b4899587
make hidden flag a general attribute of nodes
 Mike Becker <universe@uap-core.de> parents: 
51diff
changeset | 140 | cxTreeVisitorContinue(iter); | 
| 
6b61b4899587
make hidden flag a general attribute of nodes
 Mike Becker <universe@uap-core.de> parents: 
51diff
changeset | 141 | } | 
| 
6b61b4899587
make hidden flag a general attribute of nodes
 Mike Becker <universe@uap-core.de> parents: 
51diff
changeset | 142 | |
| 47 
44457f6cb0a2
remove unnecessary scene container
 Mike Becker <universe@uap-core.de> parents: 
45diff
changeset | 143 | // TODO: implement culling | 
| 
44457f6cb0a2
remove unnecessary scene container
 Mike Becker <universe@uap-core.de> parents: 
45diff
changeset | 144 | |
| 189 
2c063b225183
remove separate vectors for position, rotation, scale from scene node
 Mike Becker <universe@uap-core.de> parents: 
176diff
changeset | 145 | // clear information flags from the previous frame | 
| 69 
86d545f490e4
fix that update_transform flag was never cleared
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 146 | asc_clear_flag(node->flags, | 
| 
86d545f490e4
fix that update_transform flag was never cleared
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 147 | ASC_SCENE_NODE_GRAPHICS_UPDATED | 
| 
86d545f490e4
fix that update_transform flag was never cleared
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 148 | | ASC_SCENE_NODE_TRANSFORM_UPDATED); | 
| 189 
2c063b225183
remove separate vectors for position, rotation, scale from scene node
 Mike Becker <universe@uap-core.de> parents: 
176diff
changeset | 149 | // check if geometry needs an update | 
| 61 
b7954818a6b7
merge different bools of AscSceneNode into flags
 Mike Becker <universe@uap-core.de> parents: 
55diff
changeset | 150 | if (asc_test_flag(node->flags, ASC_SCENE_NODE_UPDATE_GRAPHICS)) { | 
| 69 
86d545f490e4
fix that update_transform flag was never cleared
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 151 | asc_set_flag(node->flags, ASC_SCENE_NODE_GRAPHICS_UPDATED); | 
| 
86d545f490e4
fix that update_transform flag was never cleared
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 152 | asc_clear_flag(node->flags, ASC_SCENE_NODE_UPDATE_GRAPHICS); | 
| 211 
f181205da2c9
fix that empty nodes fail to recalculate world transforms in the scene graph
 Mike Becker <universe@uap-core.de> parents: 
204diff
changeset | 153 | if (node->update_func != NULL) { | 
| 
f181205da2c9
fix that empty nodes fail to recalculate world transforms in the scene graph
 Mike Becker <universe@uap-core.de> parents: 
204diff
changeset | 154 | node->update_func(node); | 
| 
f181205da2c9
fix that empty nodes fail to recalculate world transforms in the scene graph
 Mike Becker <universe@uap-core.de> parents: 
204diff
changeset | 155 | } | 
| 32 
86468a71dd73
add transformation matrix
 Mike Becker <universe@uap-core.de> parents: 
31diff
changeset | 156 | } | 
| 189 
2c063b225183
remove separate vectors for position, rotation, scale from scene node
 Mike Becker <universe@uap-core.de> parents: 
176diff
changeset | 157 | // check if transform needs an update | 
| 61 
b7954818a6b7
merge different bools of AscSceneNode into flags
 Mike Becker <universe@uap-core.de> parents: 
55diff
changeset | 158 | if (asc_test_flag(node->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM)) { | 
| 69 
86d545f490e4
fix that update_transform flag was never cleared
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 159 | asc_set_flag(node->flags, ASC_SCENE_NODE_TRANSFORM_UPDATED); | 
| 
86d545f490e4
fix that update_transform flag was never cleared
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 160 | asc_clear_flag(node->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM); | 
| 204 
be5cf64b5c29
rework how transformations work to allow rotations around a point of origin
 Mike Becker <universe@uap-core.de> parents: 
200diff
changeset | 161 | |
| 
be5cf64b5c29
rework how transformations work to allow rotations around a point of origin
 Mike Becker <universe@uap-core.de> parents: 
200diff
changeset | 162 | asc_scene_node_calculate_transform(node); | 
| 
be5cf64b5c29
rework how transformations work to allow rotations around a point of origin
 Mike Becker <universe@uap-core.de> parents: 
200diff
changeset | 163 | |
| 189 
2c063b225183
remove separate vectors for position, rotation, scale from scene node
 Mike Becker <universe@uap-core.de> parents: 
176diff
changeset | 164 | if (node->parent == scene->root) { | 
| 
2c063b225183
remove separate vectors for position, rotation, scale from scene node
 Mike Becker <universe@uap-core.de> parents: 
176diff
changeset | 165 | // skip unnecessary multiplication with unity matrix | 
| 
2c063b225183
remove separate vectors for position, rotation, scale from scene node
 Mike Becker <universe@uap-core.de> parents: 
176diff
changeset | 166 | asc_transform_copy(node->world_transform, node->transform); | 
| 
2c063b225183
remove separate vectors for position, rotation, scale from scene node
 Mike Becker <universe@uap-core.de> parents: 
176diff
changeset | 167 | } else { | 
| 200 
cf0579d3bbc4
add rotation functions, but rotation with special point of origin is still broken
 Mike Becker <universe@uap-core.de> parents: 
189diff
changeset | 168 | asc_mat4f_mul( | 
| 189 
2c063b225183
remove separate vectors for position, rotation, scale from scene node
 Mike Becker <universe@uap-core.de> parents: 
176diff
changeset | 169 | node->world_transform, | 
| 133 
823626940dc9
add possibility to modify the node's transformation matrix
 Mike Becker <universe@uap-core.de> parents: 
130diff
changeset | 170 | node->transform, | 
| 189 
2c063b225183
remove separate vectors for position, rotation, scale from scene node
 Mike Becker <universe@uap-core.de> parents: 
176diff
changeset | 171 | node->parent->world_transform | 
| 133 
823626940dc9
add possibility to modify the node's transformation matrix
 Mike Becker <universe@uap-core.de> parents: 
130diff
changeset | 172 | ); | 
| 
823626940dc9
add possibility to modify the node's transformation matrix
 Mike Becker <universe@uap-core.de> parents: 
130diff
changeset | 173 | } | 
| 37 
8a8cc6725b48
add camera and render groups
 Mike Becker <universe@uap-core.de> parents: 
33diff
changeset | 174 | } | 
| 33 
e7ddb52facd3
add behavior nodes + restructure test program
 Mike Becker <universe@uap-core.de> parents: 
32diff
changeset | 175 | |
| 37 
8a8cc6725b48
add camera and render groups
 Mike Becker <universe@uap-core.de> parents: 
33diff
changeset | 176 | // add to render group | 
| 95 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
90diff
changeset | 177 | if (node->render_group >= 0) { | 
| 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
90diff
changeset | 178 | cxListAdd(render_group[node->render_group], node); | 
| 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
90diff
changeset | 179 | } | 
| 29 
1d001eb694dc
bring first scene graph to live
 Mike Becker <universe@uap-core.de> parents: 
27diff
changeset | 180 | } | 
| 37 
8a8cc6725b48
add camera and render groups
 Mike Becker <universe@uap-core.de> parents: 
33diff
changeset | 181 | |
| 136 
768e6eac1ab0
fix incorrect flip of viewport y-axis
 Mike Becker <universe@uap-core.de> parents: 
133diff
changeset | 182 | // set the viewport | 
| 37 
8a8cc6725b48
add camera and render groups
 Mike Becker <universe@uap-core.de> parents: 
33diff
changeset | 183 | glViewport( | 
| 99 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
96diff
changeset | 184 | scene->camera.viewport.pos.x, | 
| 136 
768e6eac1ab0
fix incorrect flip of viewport y-axis
 Mike Becker <universe@uap-core.de> parents: 
133diff
changeset | 185 | scene->camera.viewport.pos.y, | 
| 99 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
96diff
changeset | 186 | scene->camera.viewport.size.width, | 
| 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
96diff
changeset | 187 | scene->camera.viewport.size.height | 
| 37 
8a8cc6725b48
add camera and render groups
 Mike Becker <universe@uap-core.de> parents: 
33diff
changeset | 188 | ); | 
| 121 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
112diff
changeset | 189 | if (scene->camera.viewport_clear) { | 
| 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
112diff
changeset | 190 | glScissor( | 
| 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
112diff
changeset | 191 | scene->camera.viewport.pos.x, | 
| 136 
768e6eac1ab0
fix incorrect flip of viewport y-axis
 Mike Becker <universe@uap-core.de> parents: 
133diff
changeset | 192 | scene->camera.viewport.pos.y, | 
| 121 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
112diff
changeset | 193 | scene->camera.viewport.size.width, | 
| 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
112diff
changeset | 194 | scene->camera.viewport.size.height | 
| 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
112diff
changeset | 195 | ); | 
| 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
112diff
changeset | 196 | glEnable(GL_SCISSOR_TEST); | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 197 | const asc_color col = scene->camera.clear_color; | 
| 121 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
112diff
changeset | 198 | glClearColor(col.red, col.green, col.blue, col.alpha); | 
| 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
112diff
changeset | 199 | glClear(GL_COLOR_BUFFER_BIT); | 
| 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
112diff
changeset | 200 | glDisable(GL_SCISSOR_TEST); | 
| 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
112diff
changeset | 201 | } | 
| 37 
8a8cc6725b48
add camera and render groups
 Mike Becker <universe@uap-core.de> parents: 
33diff
changeset | 202 | |
| 47 
44457f6cb0a2
remove unnecessary scene container
 Mike Becker <universe@uap-core.de> parents: 
45diff
changeset | 203 | // ------------------------- | 
| 
44457f6cb0a2
remove unnecessary scene container
 Mike Becker <universe@uap-core.de> parents: 
45diff
changeset | 204 | // process the render groups | 
| 
44457f6cb0a2
remove unnecessary scene container
 Mike Becker <universe@uap-core.de> parents: 
45diff
changeset | 205 | // ------------------------- | 
| 
44457f6cb0a2
remove unnecessary scene container
 Mike Becker <universe@uap-core.de> parents: 
45diff
changeset | 206 | |
| 144 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 207 | // clear any previously active shader / camera combination | 
| 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 208 | asc_shader_use(NULL, NULL); | 
| 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 209 | |
| 47 
44457f6cb0a2
remove unnecessary scene container
 Mike Becker <universe@uap-core.de> parents: 
45diff
changeset | 210 | // 2D Elements | 
| 150 
3045f61bc4eb
make draw function dynamic
 Mike Becker <universe@uap-core.de> parents: 
148diff
changeset | 211 | asc_scene_draw2d(scene, | 
| 
3045f61bc4eb
make draw function dynamic
 Mike Becker <universe@uap-core.de> parents: 
148diff
changeset | 212 | render_group[ASC_RENDER_GROUP_2D_OPAQUE], | 
| 
3045f61bc4eb
make draw function dynamic
 Mike Becker <universe@uap-core.de> parents: 
148diff
changeset | 213 | render_group[ASC_RENDER_GROUP_2D_BLEND] | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
136diff
changeset | 214 | ); | 
| 29 
1d001eb694dc
bring first scene graph to live
 Mike Becker <universe@uap-core.de> parents: 
27diff
changeset | 215 | } | 
| 
1d001eb694dc
bring first scene graph to live
 Mike Becker <universe@uap-core.de> parents: 
27diff
changeset | 216 | |
| 95 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
90diff
changeset | 217 | void asc_scene_add_node(AscScene *scene, AscSceneNode *node) { | 
| 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
90diff
changeset | 218 | asc_scene_node_link(scene->root, node); | 
| 29 
1d001eb694dc
bring first scene graph to live
 Mike Becker <universe@uap-core.de> parents: 
27diff
changeset | 219 | } | 
| 
1d001eb694dc
bring first scene graph to live
 Mike Becker <universe@uap-core.de> parents: 
27diff
changeset | 220 | |
| 95 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
90diff
changeset | 221 | void asc_scene_remove_node(AscSceneNode *node) { | 
| 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
90diff
changeset | 222 | asc_scene_node_unlink(node); | 
| 33 
e7ddb52facd3
add behavior nodes + restructure test program
 Mike Becker <universe@uap-core.de> parents: 
32diff
changeset | 223 | } |