Wed, 10 Apr 2024 19:24:39 +0200
fix illegally skipping geometry update of text node
the reason is that the scene will not try again to update the node when it is just unhidden
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 | |
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | #include "ascension/scene.h" |
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
30 | #include "ascension/context.h" |
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
31 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
32 | #include <cx/linked_list.h> |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
33 | #include <cx/array_list.h> |
29
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
34 | #include <cx/tree.h> |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
35 | #include <cx/utils.h> |
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 "ascension/shader.h" |
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
38 | #include <GL/glew.h> |
29
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
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 | |
38
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
42 | static CxTreeIterator asc_scene_node_iterator( |
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
43 | AscSceneNode *node, |
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
44 | bool visit_on_exit |
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
45 | ) { |
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
46 | return cx_tree_iterator( |
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
47 | node, visit_on_exit, |
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
48 | offsetof(AscSceneNode, children), |
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
49 | offsetof(AscSceneNode, next) |
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
50 | ); |
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
51 | } |
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
52 | |
43
5a8c31904e44
fix iteration order when drawing nodes
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
53 | static CxTreeVisitor asc_scene_node_visitor(AscSceneNode *node) { |
5a8c31904e44
fix iteration order when drawing nodes
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
54 | return cx_tree_visitor(node, |
5a8c31904e44
fix iteration order when drawing nodes
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
55 | offsetof(AscSceneNode, children), |
5a8c31904e44
fix iteration order when drawing nodes
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
56 | offsetof(AscSceneNode, next) |
5a8c31904e44
fix iteration order when drawing nodes
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
57 | ); |
5a8c31904e44
fix iteration order when drawing nodes
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
58 | } |
5a8c31904e44
fix iteration order when drawing nodes
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
59 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
60 | struct asc_render_group_entry { |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
61 | asc_scene_draw_func draw; |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
62 | AscSceneNode const *node; |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
63 | }; |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
64 | |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
65 | #define asc_draw_render_group(iter) \ |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
66 | cx_foreach(struct asc_render_group_entry*, entry, iter) { \ |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
67 | entry->draw(entry->node); \ |
21
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
68 | } |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
69 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
70 | void asc_scene_draw(AscSceneNode *root, asc_recti viewport, AscCamera *camera) { |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
71 | // create render groups |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
72 | CxList *render_group[ASC_RENDER_GROUP_COUNT]; |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
73 | cx_for_n(i, ASC_RENDER_GROUP_COUNT) { |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
74 | render_group[i] = cxArrayListCreateSimple( |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
75 | sizeof(struct asc_render_group_entry), 32); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
76 | } |
32
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
31
diff
changeset
|
77 | |
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
31
diff
changeset
|
78 | // skip the root node deliberately, we know it's just the container |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
79 | CxTreeVisitor iter = asc_scene_node_visitor(root); |
32
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
31
diff
changeset
|
80 | cxIteratorNext(iter); |
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
31
diff
changeset
|
81 | |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
82 | // update the children and add them to the render groups |
30
fceda550ebcb
apply new CxTreeIterator from ucx 3.1 preview
Mike Becker <universe@uap-core.de>
parents:
29
diff
changeset
|
83 | cx_foreach(AscSceneNode*, node, iter) { |
41
df81d493716e
add correct interleaving of opaque and transparent sprites
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
84 | node->depth = iter.depth; |
df81d493716e
add correct interleaving of opaque and transparent sprites
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
85 | |
33
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
86 | // execute behaviors, first |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
87 | if (node->behaviors != NULL) { |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
88 | CxIterator behavior_iter = cxListIterator(node->behaviors); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
89 | cx_foreach(asc_scene_update_func, behavior, behavior_iter) { |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
90 | behavior(node); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
91 | } |
33
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
92 | } |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
93 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
94 | // TODO: implement culling |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
95 | // TODO: implement a hidden flag (requires UCX tree-continue function) |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
96 | |
33
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
97 | // check if geometry needs update |
39 | 98 | if (node->need_graphics_update) { |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
99 | assert(node->update_func != NULL); |
39 | 100 | node->need_graphics_update = false; |
32
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
31
diff
changeset
|
101 | node->update_func(node); |
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
31
diff
changeset
|
102 | } |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
103 | if (node->need_transform_update) { |
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
104 | node->need_transform_update = false; |
45
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
105 | asc_transform_from_parts( |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
106 | node->transform, |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
107 | node->position, |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
108 | node->scale, |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
109 | node->rotation |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
110 | ); |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
111 | asc_mat4f_mulst( |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
112 | node->world_transform, |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
113 | node->transform, |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
114 | node->parent->world_transform |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
115 | ); |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
116 | } |
33
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
117 | |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
118 | // add to render group |
30
fceda550ebcb
apply new CxTreeIterator from ucx 3.1 preview
Mike Becker <universe@uap-core.de>
parents:
29
diff
changeset
|
119 | if (node->draw_func != NULL) { |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
120 | struct asc_render_group_entry entry = { |
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
121 | node->draw_func, node |
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
122 | }; |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
123 | cxListAdd(render_group[node->render_group], &entry); |
30
fceda550ebcb
apply new CxTreeIterator from ucx 3.1 preview
Mike Becker <universe@uap-core.de>
parents:
29
diff
changeset
|
124 | } |
29
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
125 | } |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
126 | |
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
127 | // set the viewport (in OpenGL we need to invert the Y axis) |
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
128 | glViewport( |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
129 | viewport.pos.x, |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
130 | -viewport.pos.y, |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
131 | viewport.size.width, |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
132 | viewport.size.height |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
133 | ); |
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
134 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
135 | // ------------------------- |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
136 | // process the render groups |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
137 | // ------------------------- |
44
b3da4096c607
create own compilation unit for GL context - fixes shader not being created per context
Mike Becker <universe@uap-core.de>
parents:
43
diff
changeset
|
138 | AscShaderProgram *shader; |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
139 | CxIterator render_iter; |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
140 | |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
141 | // 2D Elements |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
142 | // =========== |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
143 | glEnable(GL_DEPTH_TEST); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
144 | glClear(GL_DEPTH_BUFFER_BIT); |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
145 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
146 | // Sprites |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
147 | // ------- |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
148 | // TODO: implement view matrix for 2D worlds |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
149 | shader = &asc_context.active_window->glctx.shader.sprite.base; |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
150 | glUseProgram(shader->id); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
151 | glUniformMatrix4fv(shader->projection, 1, |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
152 | GL_FALSE, camera->projection); |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
153 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
154 | // render opaque sprites from front to back |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
155 | glDisable(GL_BLEND); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
156 | render_iter = cxListBackwardsIterator(render_group[ASC_RENDER_GROUP_SPRITE_OPAQUE]); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
157 | asc_draw_render_group(render_iter); |
41
df81d493716e
add correct interleaving of opaque and transparent sprites
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
158 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
159 | // render sprites with alpha value from back to front |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
160 | glEnable(GL_BLEND); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
161 | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
162 | render_iter = cxListIterator(render_group[ASC_RENDER_GROUP_SPRITE_BLEND]); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
163 | asc_draw_render_group(render_iter); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
164 | |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
165 | // destroy render groups |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
166 | cx_for_n(i, ASC_RENDER_GROUP_COUNT) { |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
167 | cxListDestroy(render_group[i]); |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
168 | } |
29
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
169 | } |
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
170 | |
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
171 | AscSceneNode *asc_scene_node_empty(void) { |
27
4ccf4703999e
improve implementation of scene graph tree
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
172 | AscSceneNode *node = calloc(1, sizeof(AscSceneNode)); |
29
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
173 | node->free_func = (asc_scene_free_func) free; |
51
a656496594f9
fix scale not initialized to 1
Mike Becker <universe@uap-core.de>
parents:
49
diff
changeset
|
174 | node->scale.x = node->scale.y = node->scale.z = 1; |
45
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
175 | asc_transform_identity(node->transform); |
38
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
176 | asc_transform_identity(node->world_transform); |
21
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
177 | return node; |
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
178 | } |
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
179 | |
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
180 | void asc_scene_node_free(AscSceneNode *node) { |
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
181 | if (node == NULL) return; |
27
4ccf4703999e
improve implementation of scene graph tree
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
182 | |
4ccf4703999e
improve implementation of scene graph tree
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
183 | // remove this node from its parent |
4ccf4703999e
improve implementation of scene graph tree
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
184 | asc_scene_node_unlink(node); |
4ccf4703999e
improve implementation of scene graph tree
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
185 | |
31
8324037e0148
use tree iterator to free scene nodes
Mike Becker <universe@uap-core.de>
parents:
30
diff
changeset
|
186 | // free the entire subtree |
38
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
187 | CxTreeIterator iter = asc_scene_node_iterator(node, true); |
31
8324037e0148
use tree iterator to free scene nodes
Mike Becker <universe@uap-core.de>
parents:
30
diff
changeset
|
188 | cx_foreach(AscSceneNode*, child, iter) { |
8324037e0148
use tree iterator to free scene nodes
Mike Becker <universe@uap-core.de>
parents:
30
diff
changeset
|
189 | if (!iter.exiting) continue; |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
190 | if (child->behaviors != NULL) { |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
191 | cxListDestroy(child->behaviors); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
192 | } |
31
8324037e0148
use tree iterator to free scene nodes
Mike Becker <universe@uap-core.de>
parents:
30
diff
changeset
|
193 | if (child->free_func != NULL) { |
8324037e0148
use tree iterator to free scene nodes
Mike Becker <universe@uap-core.de>
parents:
30
diff
changeset
|
194 | child->free_func(child); |
8324037e0148
use tree iterator to free scene nodes
Mike Becker <universe@uap-core.de>
parents:
30
diff
changeset
|
195 | } else { |
8324037e0148
use tree iterator to free scene nodes
Mike Becker <universe@uap-core.de>
parents:
30
diff
changeset
|
196 | free(child); |
8324037e0148
use tree iterator to free scene nodes
Mike Becker <universe@uap-core.de>
parents:
30
diff
changeset
|
197 | } |
21
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
198 | } |
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
199 | } |
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
200 | |
29
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
201 | void asc_scene_node_link(AscSceneNode * restrict parent, AscSceneNode * restrict node) { |
33
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
202 | cx_tree_link( |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
203 | parent, node, |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
204 | offsetof(AscSceneNode, parent), |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
205 | offsetof(AscSceneNode, children), |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
206 | offsetof(AscSceneNode, prev), |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
207 | offsetof(AscSceneNode, next) |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
208 | ); |
29
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
209 | } |
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
210 | |
21
1a47c57666f5
add first draft of a scene graph structure
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
211 | void asc_scene_node_unlink(AscSceneNode *node) { |
33
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
212 | cx_tree_unlink( |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
213 | node, |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
214 | offsetof(AscSceneNode, parent), |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
215 | offsetof(AscSceneNode, children), |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
216 | offsetof(AscSceneNode, prev), |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
217 | offsetof(AscSceneNode, next) |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
218 | ); |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
219 | } |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
220 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
221 | void asc_scene_add_behavior( |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
222 | AscSceneNode *node, |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
223 | asc_scene_update_func behavior |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
224 | ) { |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
225 | if (node->behaviors == NULL) { |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
226 | node->behaviors = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
227 | } |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
228 | cxListAdd(node->behaviors, behavior); |
33
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
229 | } |
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
230 | |
47
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
231 | void asc_scene_remove_behavior( |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
232 | AscSceneNode *node, |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
233 | asc_scene_update_func behavior |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
234 | ) { |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
235 | if (node->behaviors != NULL) { |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
236 | cxListFindRemove(node->behaviors, behavior); |
44457f6cb0a2
remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
237 | } |
33
e7ddb52facd3
add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents:
32
diff
changeset
|
238 | } |
38
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
239 | |
45
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
240 | void asc_update_transform(AscSceneNode *node) { |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
241 | if (node->need_transform_update) return; |
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
242 | |
38
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
243 | CxTreeIterator iter = asc_scene_node_iterator(node, false); |
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
244 | cx_foreach(AscSceneNode*, n, iter) { |
45
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
245 | // TODO: break/continue when subtree is already marked for update |
38
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
246 | n->need_transform_update = true; |
6e5629ea4c5c
implement that nodes inherit the world transform of their parent
Mike Becker <universe@uap-core.de>
parents:
37
diff
changeset
|
247 | } |
45
18de2af03531
simplify how transforms work
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
248 | } |