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 }