src/window.c

changeset 95
622887f7e954
parent 92
78ce93fb46e5
equal deleted inserted replaced
94:24bd333be668 95:622887f7e954
25 * POSSIBILITY OF SUCH DAMAGE. 25 * POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28 #include "ascension/window.h" 28 #include "ascension/window.h"
29 #include "ascension/context.h" 29 #include "ascension/context.h"
30 #include "ascension/error.h"
31 #include "ascension/utils.h"
32 30
33 #include <GL/glew.h> 31 #include <GL/glew.h>
34 32
35 void asc_window_settings_init_defaults(AscWindowSettings* settings) { 33 void asc_window_settings_init_defaults(AscWindowSettings* settings) {
36 settings->dimensions.width = 800; 34 settings->dimensions.width = 800;
50 } 48 }
51 AscWindow *window = &asc_context.windows[index]; 49 AscWindow *window = &asc_context.windows[index];
52 if (window->id > 0) { 50 if (window->id > 0) {
53 asc_error("Cannot create window - slot %u already occupied.", index); 51 asc_error("Cannot create window - slot %u already occupied.", index);
54 return; 52 return;
55 }
56 if (window->ui != NULL) {
57 asc_wprintf("Window with index %u has a dangling UI pointer", index);
58 asc_scene_node_free(window->ui);
59 } 53 }
60 54
61 Uint32 flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN; 55 Uint32 flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN;
62 flags |= settings->fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : SDL_WINDOW_RESIZABLE; 56 flags |= settings->fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : SDL_WINDOW_RESIZABLE;
63 57
80 &window->dimensions.height 74 &window->dimensions.height
81 ); 75 );
82 window->resized = true; // count initial sizing as resize 76 window->resized = true; // count initial sizing as resize
83 77
84 if (asc_gl_context_initialize(&window->glctx, window->window, &settings->glsettings)) { 78 if (asc_gl_context_initialize(&window->glctx, window->window, &settings->glsettings)) {
85 window->ui = asc_scene_node_empty(); 79 asc_scene_init(&window->ui);
86 asc_dprintf("Window %u initialized", window->id); 80 asc_dprintf("Window %u initialized", window->id);
87 asc_context.active_window = index; 81 asc_context.active_window = index;
88 } else { 82 } else {
89 asc_error("Creating GL context failed for window %u", window->id); 83 asc_error("Creating GL context failed for window %u", window->id);
90 // cleanup on error 84 // cleanup on error
108 102
109 // for releasing OpenGL resources, we need to make the context current 103 // for releasing OpenGL resources, we need to make the context current
110 asc_gl_context_activate(&window->glctx); 104 asc_gl_context_activate(&window->glctx);
111 105
112 // destroy all scenes 106 // destroy all scenes
113 asc_scene_node_free(window->ui); 107 asc_scene_destroy(&window->ui);
114 window->ui = NULL;
115 108
116 // release context related data 109 // release context related data
117 asc_gl_context_destroy(&window->glctx); 110 asc_gl_context_destroy(&window->glctx);
118 111
119 // destroy window 112 // destroy window
144 // Clear the color buffer for the window frame 137 // Clear the color buffer for the window frame
145 int window_width = asc_active_window->dimensions.width; 138 int window_width = asc_active_window->dimensions.width;
146 int window_height = asc_active_window->dimensions.height; 139 int window_height = asc_active_window->dimensions.height;
147 glViewport(0, 0, window_width, window_height); 140 glViewport(0, 0, window_width, window_height);
148 glClear(GL_COLOR_BUFFER_BIT); 141 glClear(GL_COLOR_BUFFER_BIT);
149 asc_recti viewport = {0, 0, window_width, window_height};
150 142
151 // Draw the UI 143 // Draw the UI
152 AscCamera ui_camera; 144 AscScene *ui = &asc_active_window->ui;
153 asc_camera_ortho(&ui_camera, viewport); 145 asc_recti viewport = {0, 0, window_width, window_height};
154 asc_scene_draw(asc_active_window->ui, viewport, &ui_camera); 146 asc_camera_ortho(&ui->camera, viewport);
147 asc_scene_draw(ui, viewport);
155 148
156 // Swap Buffers 149 // Swap Buffers
157 SDL_GL_SwapWindow(asc_active_window->window); 150 SDL_GL_SwapWindow(asc_active_window->window);
158 151
159 // Clear Flags 152 // Clear Flags
174 for (; i < ASC_MAX_WINDOWS ; i++) { 167 for (; i < ASC_MAX_WINDOWS ; i++) {
175 if (asc_context.windows[i].id == id) break; 168 if (asc_context.windows[i].id == id) break;
176 } 169 }
177 return i; 170 return i;
178 } 171 }
172
173 void asc_add_ui_node(AscSceneNode *node) {
174 asc_scene_add_node(&asc_active_window->ui, node);
175 }

mercurial