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 }