src/window.c

changeset 96
9e25f080a33e
parent 95
622887f7e954
equal deleted inserted replaced
95:622887f7e954 96:9e25f080a33e
75 ); 75 );
76 window->resized = true; // count initial sizing as resize 76 window->resized = true; // count initial sizing as resize
77 77
78 if (asc_gl_context_initialize(&window->glctx, window->window, &settings->glsettings)) { 78 if (asc_gl_context_initialize(&window->glctx, window->window, &settings->glsettings)) {
79 asc_scene_init(&window->ui); 79 asc_scene_init(&window->ui);
80 asc_dprintf("Window %u initialized", window->id); 80 asc_dprintf("Window %u initialized at index %u", window->id, index);
81 asc_context.active_window = index; 81 asc_context.active_window = index;
82 } else { 82 } else {
83 asc_error("Creating GL context failed for window %u", window->id); 83 asc_error("Creating GL context failed for window %u at index %u", window->id, index);
84 // cleanup on error 84 // cleanup on error
85 SDL_DestroyWindow(window->window); 85 SDL_DestroyWindow(window->window);
86 window->window = NULL; 86 window->window = NULL;
87 window->id = 0; 87 window->id = 0;
88 } 88 }
102 102
103 // for releasing OpenGL resources, we need to make the context current 103 // for releasing OpenGL resources, we need to make the context current
104 asc_gl_context_activate(&window->glctx); 104 asc_gl_context_activate(&window->glctx);
105 105
106 // destroy all scenes 106 // destroy all scenes
107 for (unsigned int i = 0; i < ASC_MAX_SCENES; i++) {
108 asc_scene_destroy(&window->scenes[i]);
109 }
107 asc_scene_destroy(&window->ui); 110 asc_scene_destroy(&window->ui);
108 111
109 // release context related data 112 // release context related data
110 asc_gl_context_destroy(&window->glctx); 113 asc_gl_context_destroy(&window->glctx);
111 114
123 asc_dprintf("Window %u and its OpenGL context destroyed.", window->id); 126 asc_dprintf("Window %u and its OpenGL context destroyed.", window->id);
124 memset(window, 0, sizeof(AscWindow)); 127 memset(window, 0, sizeof(AscWindow));
125 } 128 }
126 129
127 void asc_window_sync(unsigned int index) { 130 void asc_window_sync(unsigned int index) {
131 if (index > ASC_MAX_WINDOWS) {
132 asc_error("Index for syncing window out of bounds (%u/%u).", index, ASC_MAX_WINDOWS);
133 return;
134 }
135 AscWindow *window = &asc_context.windows[index];
128 // necessary safeguard 136 // necessary safeguard
129 if (asc_context.windows[index].id == 0) return; 137 if (window->id == 0) return;
130 138
131 // active the window that shall be synced temporarily 139 // active the window that shall be synced temporarily
132 unsigned int active_index = asc_context.active_window; 140 unsigned int active_index = asc_context.active_window;
133 if (index != active_index) { 141 if (index != active_index) {
134 asc_window_activate(index); 142 asc_window_activate(index);
135 } 143 }
136 144
137 // Clear the color buffer for the window frame 145 // Clear the color buffer for the window frame
138 int window_width = asc_active_window->dimensions.width; 146 int window_width = window->dimensions.width;
139 int window_height = asc_active_window->dimensions.height; 147 int window_height = window->dimensions.height;
140 glViewport(0, 0, window_width, window_height); 148 glViewport(0, 0, window_width, window_height);
141 glClear(GL_COLOR_BUFFER_BIT); 149 glClear(GL_COLOR_BUFFER_BIT);
142 150
143 // Draw the UI 151 // Draw all scenes
144 AscScene *ui = &asc_active_window->ui;
145 asc_recti viewport = {0, 0, window_width, window_height}; 152 asc_recti viewport = {0, 0, window_width, window_height};
146 asc_camera_ortho(&ui->camera, viewport); 153 for (unsigned int i = 0; i < ASC_MAX_SCENES; i++) {
147 asc_scene_draw(ui, viewport); 154 asc_scene_draw(&window->scenes[i], viewport);
155 }
156 asc_camera_ortho(&window->ui.camera, viewport);
157 asc_scene_draw(&window->ui, viewport);
148 158
149 // Swap Buffers 159 // Swap Buffers
150 SDL_GL_SwapWindow(asc_active_window->window); 160 SDL_GL_SwapWindow(window->window);
151 161
152 // Clear Flags 162 // Clear Flags
153 asc_active_window->resized = false; 163 window->resized = false;
154 164
155 if (index != active_index) { 165 if (index != active_index) {
156 asc_window_activate(active_index); 166 asc_window_activate(active_index);
157 } 167 }
158 } 168 }
171 } 181 }
172 182
173 void asc_add_ui_node(AscSceneNode *node) { 183 void asc_add_ui_node(AscSceneNode *node) {
174 asc_scene_add_node(&asc_active_window->ui, node); 184 asc_scene_add_node(&asc_active_window->ui, node);
175 } 185 }
186
187 AscScene *asc_window_scene(unsigned int index) {
188 return &asc_active_window->scenes[index];
189 }

mercurial