Wed, 02 Jul 2025 23:21:17 +0200
resolve TODOs regarding input.h
a) mouse position must be integer, because it can be negative (though rarely)
b) we should not trade "access complexity" for space in the scancodes array
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:
105
diff
changeset
|
28 | #include "ascension/error.h" |
895f92cff6b8
bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents:
105
diff
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:
106
diff
changeset
|
31 | #include "ascension/behavior.h" |
106
895f92cff6b8
bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents:
105
diff
changeset
|
32 | #include "ascension/shader.h" |
82
4e1e698f4b0d
add generic mesh draw function and move sprite draw function to separate unit
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
33 | |
95
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
90
diff
changeset
|
34 | #include <cx/tree.h> |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
35 | #include <cx/array_list.h> |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
36 | |
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
37 | #include <GL/glew.h> |
29
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
38 | |
21
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
39 | #include <assert.h> |
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
40 | |
121
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
41 | void asc_scene_init_(AscScene *scene, struct asc_camera_init_args args) { |
96
9e25f080a33e
add scenes, but they don't draw yet
Mike Becker <universe@uap-core.de>
parents:
95
diff
changeset
|
42 | if (scene->root != NULL) { |
9e25f080a33e
add scenes, but they don't draw yet
Mike Becker <universe@uap-core.de>
parents:
95
diff
changeset
|
43 | asc_wprintf("Scene %"PRIxPTR" is already initialized - initialization skipped.", (uintptr_t) scene); |
9e25f080a33e
add scenes, but they don't draw yet
Mike Becker <universe@uap-core.de>
parents:
95
diff
changeset
|
44 | return; |
9e25f080a33e
add scenes, but they don't draw yet
Mike Becker <universe@uap-core.de>
parents:
95
diff
changeset
|
45 | } |
121
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
46 | 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:
99
diff
changeset
|
47 | 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:
136
diff
changeset
|
48 | 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:
136
diff
changeset
|
49 | 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:
136
diff
changeset
|
50 | } |
100
5231da78831e
change asc_scene_init() to also request parameters for camera initialization
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
51 | |
95
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
90
diff
changeset
|
52 | asc_dprintf("Initialized scene %"PRIxPTR, (uintptr_t) scene); |
75
0ce353485509
revert introduction of high level ucx trees and stick to the low level API
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
53 | } |
0ce353485509
revert introduction of high level ucx trees and stick to the low level API
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
54 | |
95
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
90
diff
changeset
|
55 | void asc_scene_destroy(AscScene *scene) { |
96
9e25f080a33e
add scenes, but they don't draw yet
Mike Becker <universe@uap-core.de>
parents:
95
diff
changeset
|
56 | if (scene->root == NULL) return; |
137
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
57 | 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:
136
diff
changeset
|
58 | 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:
136
diff
changeset
|
59 | 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:
136
diff
changeset
|
60 | } |
95
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
90
diff
changeset
|
61 | asc_dprintf("Destroyed scene %"PRIxPTR, (uintptr_t) scene); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
90
diff
changeset
|
62 | asc_scene_node_free(scene->root); |
75
0ce353485509
revert introduction of high level ucx trees and stick to the low level API
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
63 | } |
0ce353485509
revert introduction of high level ucx trees and stick to the low level API
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
64 | |
112
3e956c96dd6c
extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents:
108
diff
changeset
|
65 | void asc_scene_execute_behaviors(AscScene *scene) { |
3e956c96dd6c
extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents:
108
diff
changeset
|
66 | CxTreeVisitor iter = cx_tree_visitor(scene->root, |
3e956c96dd6c
extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents:
108
diff
changeset
|
67 | offsetof(AscSceneNode, children), |
3e956c96dd6c
extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents:
108
diff
changeset
|
68 | offsetof(AscSceneNode, next) |
3e956c96dd6c
extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents:
108
diff
changeset
|
69 | ); |
3e956c96dd6c
extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents:
108
diff
changeset
|
70 | cx_foreach(AscSceneNode*, node, iter) { |
3e956c96dd6c
extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents:
108
diff
changeset
|
71 | CxIterator behavior_iter = cxListIterator(node->behaviors); |
3e956c96dd6c
extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents:
108
diff
changeset
|
72 | cx_foreach(AscBehavior*, behavior, behavior_iter) { |
148
9f030f402699
implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents:
144
diff
changeset
|
73 | asc_behavior_trigger(behavior); |
112
3e956c96dd6c
extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents:
108
diff
changeset
|
74 | } |
3e956c96dd6c
extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents:
108
diff
changeset
|
75 | } |
3e956c96dd6c
extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents:
108
diff
changeset
|
76 | } |
3e956c96dd6c
extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents:
108
diff
changeset
|
77 | |
150
3045f61bc4eb
make draw function dynamic
Mike Becker <universe@uap-core.de>
parents:
148
diff
changeset
|
78 | 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:
136
diff
changeset
|
79 | 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:
143
diff
changeset
|
80 | const CxList *opaque, |
43636d6a6e25
do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
81 | const CxList *blend |
137
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
82 | ) { |
144
43636d6a6e25
do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
83 | 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:
143
diff
changeset
|
84 | 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:
143
diff
changeset
|
85 | 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:
143
diff
changeset
|
86 | |
150
3045f61bc4eb
make draw function dynamic
Mike Becker <universe@uap-core.de>
parents:
148
diff
changeset
|
87 | // 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:
143
diff
changeset
|
88 | 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:
136
diff
changeset
|
89 | |
150
3045f61bc4eb
make draw function dynamic
Mike Becker <universe@uap-core.de>
parents:
148
diff
changeset
|
90 | // 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:
143
diff
changeset
|
91 | 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:
136
diff
changeset
|
92 | |
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
93 | // 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:
143
diff
changeset
|
94 | // 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:
143
diff
changeset
|
95 | if (cxIteratorValid(iter_opaque)) { |
137
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
96 | glDisable(GL_BLEND); |
150
3045f61bc4eb
make draw function dynamic
Mike Becker <universe@uap-core.de>
parents:
148
diff
changeset
|
97 | cx_foreach(const AscSceneNode*, node, iter_opaque) { |
3045f61bc4eb
make draw function dynamic
Mike Becker <universe@uap-core.de>
parents:
148
diff
changeset
|
98 | 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:
136
diff
changeset
|
99 | } |
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
100 | } |
144
43636d6a6e25
do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
101 | if (cxIteratorValid(iter_blend)) { |
137
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
102 | glEnable(GL_BLEND); |
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
103 | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
150
3045f61bc4eb
make draw function dynamic
Mike Becker <universe@uap-core.de>
parents:
148
diff
changeset
|
104 | cx_foreach(const AscSceneNode*, node, iter_blend) { |
3045f61bc4eb
make draw function dynamic
Mike Becker <universe@uap-core.de>
parents:
148
diff
changeset
|
105 | 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:
136
diff
changeset
|
106 | } |
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
107 | } |
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
108 | } |
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
109 | |
99
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
110 | void asc_scene_draw(AscScene *scene) { |
96
9e25f080a33e
add scenes, but they don't draw yet
Mike Becker <universe@uap-core.de>
parents:
95
diff
changeset
|
111 | if (scene->root == NULL) return; |
9e25f080a33e
add scenes, but they don't draw yet
Mike Becker <universe@uap-core.de>
parents:
95
diff
changeset
|
112 | |
99
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
113 | // if the window resized, we must update the viewport |
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
114 | if (asc_active_window->resized) { |
105 | 115 | asc_vec2u window_size = asc_active_window->dimensions; |
99
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
116 | if (scene->camera.viewport_update_func == NULL) { |
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
117 | // this assumes the viewport was initialized with zeros! |
101 | 118 | scene->camera.viewport.size = window_size; |
99
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
119 | } else { |
101 | 120 | scene->camera.viewport = scene->camera.viewport_update_func(window_size); |
121 | } | |
122 | if (scene->camera.projection_update_func != NULL) { | |
123 | scene->camera.projection_update_func(&scene->camera, window_size); | |
99
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
124 | } |
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
125 | } |
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
126 | |
137
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
127 | // reset render groups |
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
128 | CxList **render_group = scene->internal.render_groups; |
126
77c13e14a65f
update to most recent ucx 3.2 preview
Mike Becker <universe@uap-core.de>
parents:
121
diff
changeset
|
129 | 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:
136
diff
changeset
|
130 | cxListClear(render_group[i]); |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
131 | } |
32
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
31
diff
changeset
|
132 | |
99
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
133 | // 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:
90
diff
changeset
|
134 | CxTreeVisitor iter = cx_tree_visitor(scene->root, |
99
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
135 | offsetof(AscSceneNode, children), |
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
136 | offsetof(AscSceneNode, next) |
95
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
90
diff
changeset
|
137 | ); |
30
fceda550ebcb
apply new CxTreeIterator from ucx 3.1 preview
Mike Becker <universe@uap-core.de>
parents:
29
diff
changeset
|
138 | cx_foreach(AscSceneNode*, node, iter) { |
55
6b61b4899587
make hidden flag a general attribute of nodes
Mike Becker <universe@uap-core.de>
parents:
51
diff
changeset
|
139 | // skip hidden nodes (and all their children) |
61
b7954818a6b7
merge different bools of AscSceneNode into flags
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
140 | if (asc_test_flag(node->flags, ASC_SCENE_NODE_HIDDEN)) { |
55
6b61b4899587
make hidden flag a general attribute of nodes
Mike Becker <universe@uap-core.de>
parents:
51
diff
changeset
|
141 | cxTreeVisitorContinue(iter); |
6b61b4899587
make hidden flag a general attribute of nodes
Mike Becker <universe@uap-core.de>
parents:
51
diff
changeset
|
142 | } |
6b61b4899587
make hidden flag a general attribute of nodes
Mike Becker <universe@uap-core.de>
parents:
51
diff
changeset
|
143 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
144 | // TODO: implement culling |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
145 | |
33
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
146 | // check if geometry needs update |
69
86d545f490e4
fix that update_transform flag was never cleared
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
147 | asc_clear_flag(node->flags, |
86d545f490e4
fix that update_transform flag was never cleared
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
148 | ASC_SCENE_NODE_GRAPHICS_UPDATED |
86d545f490e4
fix that update_transform flag was never cleared
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
149 | | ASC_SCENE_NODE_TRANSFORM_UPDATED); |
61
b7954818a6b7
merge different bools of AscSceneNode into flags
Mike Becker <universe@uap-core.de>
parents:
55
diff
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:
65
diff
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:
65
diff
changeset
|
152 | asc_clear_flag(node->flags, ASC_SCENE_NODE_UPDATE_GRAPHICS); |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
153 | assert(node->update_func != NULL); |
32
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
31
diff
changeset
|
154 | node->update_func(node); |
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
31
diff
changeset
|
155 | } |
61
b7954818a6b7
merge different bools of AscSceneNode into flags
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
156 | 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:
65
diff
changeset
|
157 | 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:
65
diff
changeset
|
158 | asc_clear_flag(node->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM); |
133
823626940dc9
add possibility to modify the node's transformation matrix
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
159 | |
823626940dc9
add possibility to modify the node's transformation matrix
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
160 | // Only recalculate from components if not using custom transform |
823626940dc9
add possibility to modify the node's transformation matrix
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
161 | if (!asc_test_flag(node->flags, ASC_SCENE_NODE_CUSTOM_TRANSFORM)) { |
823626940dc9
add possibility to modify the node's transformation matrix
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
162 | asc_transform_from_vec3f( |
823626940dc9
add possibility to modify the node's transformation matrix
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
163 | node->transform, |
823626940dc9
add possibility to modify the node's transformation matrix
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
164 | node->position, |
823626940dc9
add possibility to modify the node's transformation matrix
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
165 | node->scale, |
823626940dc9
add possibility to modify the node's transformation matrix
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
166 | node->rotation |
823626940dc9
add possibility to modify the node's transformation matrix
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
167 | ); |
823626940dc9
add possibility to modify the node's transformation matrix
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
168 | } |
823626940dc9
add possibility to modify the node's transformation matrix
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
169 | |
45
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
170 | asc_mat4f_mulst( |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
171 | node->world_transform, |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
172 | node->transform, |
75
0ce353485509
revert introduction of high level ucx trees and stick to the low level API
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
173 | node->parent->world_transform |
45
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
174 | ); |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
175 | } |
33
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
176 | |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
177 | // add to render group |
95
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
90
diff
changeset
|
178 | if (node->render_group >= 0) { |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
90
diff
changeset
|
179 | cxListAdd(render_group[node->render_group], node); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
90
diff
changeset
|
180 | } |
29
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
181 | } |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
182 | |
136
768e6eac1ab0
fix incorrect flip of viewport y-axis
Mike Becker <universe@uap-core.de>
parents:
133
diff
changeset
|
183 | // set the viewport |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
184 | glViewport( |
99
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
185 | scene->camera.viewport.pos.x, |
136
768e6eac1ab0
fix incorrect flip of viewport y-axis
Mike Becker <universe@uap-core.de>
parents:
133
diff
changeset
|
186 | scene->camera.viewport.pos.y, |
99
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
187 | scene->camera.viewport.size.width, |
ac143db979dc
add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents:
96
diff
changeset
|
188 | scene->camera.viewport.size.height |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
189 | ); |
121
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
190 | if (scene->camera.viewport_clear) { |
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
191 | glScissor( |
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
192 | scene->camera.viewport.pos.x, |
136
768e6eac1ab0
fix incorrect flip of viewport y-axis
Mike Becker <universe@uap-core.de>
parents:
133
diff
changeset
|
193 | scene->camera.viewport.pos.y, |
121
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
194 | scene->camera.viewport.size.width, |
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
195 | scene->camera.viewport.size.height |
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
196 | ); |
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
197 | glEnable(GL_SCISSOR_TEST); |
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
198 | const asc_col4f col = scene->camera.clear_color; |
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
199 | glClearColor(col.red, col.green, col.blue, col.alpha); |
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
200 | glClear(GL_COLOR_BUFFER_BIT); |
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
201 | glDisable(GL_SCISSOR_TEST); |
ede9a9e92ff9
add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents:
112
diff
changeset
|
202 | } |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
203 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
204 | // ------------------------- |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
205 | // process the render groups |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
206 | // ------------------------- |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
207 | |
144
43636d6a6e25
do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
208 | // 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:
143
diff
changeset
|
209 | 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:
143
diff
changeset
|
210 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
211 | // 2D Elements |
150
3045f61bc4eb
make draw function dynamic
Mike Becker <universe@uap-core.de>
parents:
148
diff
changeset
|
212 | asc_scene_draw2d(scene, |
3045f61bc4eb
make draw function dynamic
Mike Becker <universe@uap-core.de>
parents:
148
diff
changeset
|
213 | render_group[ASC_RENDER_GROUP_2D_OPAQUE], |
3045f61bc4eb
make draw function dynamic
Mike Becker <universe@uap-core.de>
parents:
148
diff
changeset
|
214 | 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:
136
diff
changeset
|
215 | ); |
29
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
216 | } |
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
217 | |
95
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
90
diff
changeset
|
218 | 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:
90
diff
changeset
|
219 | asc_scene_node_link(scene->root, node); |
29
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
220 | } |
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
221 | |
95
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
90
diff
changeset
|
222 | void asc_scene_remove_node(AscSceneNode *node) { |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
90
diff
changeset
|
223 | asc_scene_node_unlink(node); |
33
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
224 | } |