src/scene.c

Wed, 10 Apr 2024 19:24:39 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 10 Apr 2024 19:24:39 +0200
changeset 53
19faf91d43d7
parent 51
a656496594f9
child 55
6b61b4899587
permissions
-rw-r--r--

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
7cf310cc47cb minor improvements
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
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
7cf310cc47cb minor improvements
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
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 }

mercurial