1 module prova.graphics.graphicscontext;
2 
3 import derelict.opengl;
4 import derelict.sdl2.sdl;
5 import prova.assets.shaders;
6 import prova.graphics;
7 import std.conv;
8 
9 ///
10 final class GraphicsContext
11 {
12   private ShaderProgram _flatShader;
13   private ShaderProgram _spriteShader;
14   private SDL_GLContext handle;
15 
16   package(prova) this()
17   {
18     initOpenGL();
19   }
20 
21   private void initOpenGL()
22   {
23     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
24     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
25     SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
26 
27     DerelictGL3.load();
28   }
29 
30   package(prova) void setWindow(SDL_Window* window)
31   {
32     handle = SDL_GL_CreateContext(window);
33 
34     if(!handle)
35       throw new Exception("Error initializing GL Context: " ~ to!string(SDL_GetError()));
36 
37     DerelictGL3.reload();
38 
39     initShaders();
40   }
41 
42   private void initShaders()
43   {
44     _flatShader = new FlatShaderProgram();
45     _spriteShader = new SpriteShaderProgram();
46   }
47 
48   ///
49   @property ShaderProgram flatShader()
50   {
51     return _flatShader;
52   }
53 
54   ///
55   @property ShaderProgram spriteShader()
56   {
57     return _spriteShader;
58   }
59 
60   ~this()
61   {
62     _flatShader.destroy();
63     _spriteShader.destroy();
64 
65     SDL_GL_DeleteContext(handle);
66   }
67 }