| 46 asc_dprintf("GL debug: %.*s", (int)buf.length, buf.ptr); |
46 asc_dprintf("GL debug: %.*s", (int)buf.length, buf.ptr); |
| 47 } |
47 } |
| 48 cx_strfree(&buf); |
48 cx_strfree(&buf); |
| 49 } |
49 } |
| 50 |
50 |
| |
51 static int asc_primitives_init(AscGLContext *context) { |
| |
52 asc_dprintf("Create primitives for the GL context of active window."); |
| |
53 asc_mesh_allocate_buffers((AscMesh*)&context->primitives, sizeof(context->primitives) / sizeof(AscMesh)); |
| |
54 |
| |
55 asc_primitives_init_plane(&context->primitives.plane); |
| |
56 // TODO: more primitives |
| |
57 |
| |
58 return asc_error_catch_all_gl(); |
| |
59 } |
| |
60 |
| |
61 static void asc_primitives_destroy(AscGLContext *context) { |
| |
62 asc_dprintf("Destroy primitives in GL context of active window."); |
| |
63 asc_mesh_free_buffers((AscMesh*)&context->primitives, sizeof(context->primitives) / sizeof(AscMesh)); |
| |
64 } |
| |
65 |
| 51 static int asc_shader_initialize_predefined(AscGLContext *ctx) { |
66 static int asc_shader_initialize_predefined(AscGLContext *ctx) { |
| 52 int ret = 0; |
67 int ret = 0; |
| 53 ret |= asc_shader_sprite_init(&ctx->shader.sprite); |
68 ret |= asc_shader_sprite_init(&ctx->shader.sprite); |
| |
69 ret |= asc_error_catch_all_gl(); |
| 54 return ret; |
70 return ret; |
| 55 } |
71 } |
| 56 |
72 |
| 57 static void asc_shader_destroy_predefined(AscGLContext *ctx) { |
73 static void asc_shader_destroy_predefined(AscGLContext *ctx) { |
| 58 asc_shader_program_destroy(&ctx->shader.sprite.program); |
74 asc_shader_program_destroy(&ctx->shader.sprite.program); |
| 79 |
95 |
| 80 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); |
96 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); |
| 81 glEnable(GL_DEBUG_OUTPUT); |
97 glEnable(GL_DEBUG_OUTPUT); |
| 82 glDebugMessageCallback(asc_gl_debug_callback, NULL); |
98 glDebugMessageCallback(asc_gl_debug_callback, NULL); |
| 83 |
99 |
| 84 if (!asc_primitives_init(&ctx->primitives)) { |
100 if (asc_primitives_init(ctx)) { |
| 85 asc_error("Creating primitive meshes failed"); |
101 asc_error("Creating primitive meshes failed"); |
| 86 SDL_GL_DeleteContext(ctx->glctx); |
102 SDL_GL_DeleteContext(ctx->glctx); |
| 87 return false; |
103 return false; |
| 88 } |
104 } |
| 89 |
105 |
| 90 if (asc_shader_initialize_predefined(ctx)) { |
106 if (asc_shader_initialize_predefined(ctx)) { |
| |
107 asc_error("Initializing predefined shaders failed"); |
| 91 SDL_GL_DeleteContext(ctx->glctx); |
108 SDL_GL_DeleteContext(ctx->glctx); |
| 92 return false; |
109 return false; |
| 93 } |
110 } |
| 94 |
111 |
| 95 return true; |
112 return true; |
| 103 void asc_gl_context_destroy(AscGLContext *ctx) { |
120 void asc_gl_context_destroy(AscGLContext *ctx) { |
| 104 if (ctx->glctx == NULL) return; |
121 if (ctx->glctx == NULL) return; |
| 105 SDL_GL_MakeCurrent(ctx->window, ctx->glctx); |
122 SDL_GL_MakeCurrent(ctx->window, ctx->glctx); |
| 106 |
123 |
| 107 asc_shader_destroy_predefined(ctx); |
124 asc_shader_destroy_predefined(ctx); |
| 108 asc_primitives_destroy(&ctx->primitives); |
125 asc_primitives_destroy(ctx); |
| 109 |
126 |
| 110 // destroy the GL context and the window |
127 // destroy the GL context and the window |
| 111 SDL_GL_DeleteContext(ctx->glctx); |
128 SDL_GL_DeleteContext(ctx->glctx); |
| 112 ctx->glctx = NULL; |
129 ctx->glctx = NULL; |
| 113 } |
130 } |