1 module polyplex.core.render.gl; 2 import polyplex.core.render.gl.batch; 3 import polyplex.core.render.gl.debug2d; 4 import polyplex.core.render; 5 import polyplex.core.window; 6 import polyplex.core.color; 7 import polyplex.utils; 8 import polyplex.math; 9 10 import derelict.sdl2.sdl; 11 import derelict.opengl; 12 import derelict.opengl.gl; 13 import std.conv; 14 import std.stdio; 15 16 public import polyplex.core.render.gl.shader; 17 18 public class GlRenderer : Renderer { 19 private SDL_Window* win; 20 private SDL_GLContext context; 21 22 this(GameWindow parent) { super(parent); } 23 24 ~this() { 25 SDL_GL_DeleteContext(context); 26 Logger.Log("Deleted OpenGL context."); 27 } 28 29 public override void Init(SDL_Window* w) { 30 win = w; 31 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 32 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); 33 context = SDL_GL_CreateContext(w); 34 auto glver = DerelictGL3.reload(); 35 if (context == null) throw new Error(to!string(SDL_GetError())); 36 int wd, hd; 37 SDL_GetWindowSize(w, &wd, &hd); 38 GlSpriteBatch.InitializeSpritebatch(); 39 Renderer r = cast(Renderer)this; 40 this.Batch = new GlSpriteBatch(r); 41 GlDebugging2D.PrepDebugging(r); 42 43 //Default settings for sprite clamping and wrapping 44 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 45 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 46 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 47 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 48 49 Logger.Log("OpenGL version: {0}", to!string(glGetString(GL_VERSION)), LogType.Info); 50 glEnable (GL_BLEND); 51 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 52 //Crash if system has unsupported opengl version. 53 if (glver < GLVersion.gl30) throw new Error("Sorry, your graphics card does not support Open GL 3 or above."); 54 Logger.Log("OpenGL initialized..."); 55 } 56 57 public override @property VSyncState VSync() { 58 return cast(VSyncState)SDL_GL_GetSwapInterval(); 59 } 60 61 public override @property void VSync(VSyncState state) { 62 SDL_GL_SetSwapInterval(state); 63 } 64 65 public override void AdjustViewport() { 66 glViewport(0, 0, Window.Width, Window.Height); 67 } 68 69 public override void ClearColor(Color color) { 70 glClearColor(color.Rf, color.Gf, color.Bf, color.Af); 71 glClear(GL_COLOR_BUFFER_BIT); 72 ClearDepth(); 73 } 74 75 public override void ClearDepth() { 76 glClear(GL_DEPTH_BUFFER_BIT); 77 } 78 79 public override void SwapBuffers() { 80 SDL_GL_SwapWindow(win); 81 } 82 83 public override Shader CreateShader(ShaderCode code) { 84 return new GLShader(code); 85 } 86 }