1 /** 2 Copyright: Copyright (c) 2013-2018 Andrey Penechko. 3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). 4 Authors: Andrey Penechko. 5 */ 6 7 module voxelman.graphics.oglrenderer; 8 9 import voxelman.graphics.gl; 10 import voxelman.graphics.irenderer; 11 import voxelman.graphics.shaderprogram; 12 import voxelman.graphics.texture; 13 import voxelman.math; 14 import voxelman.platform.iwindow; 15 16 17 class OglRenderer : IRenderer 18 { 19 private: 20 ShaderProgram[] shaders; 21 22 IWindow window; 23 24 public: 25 this(IWindow window) 26 { 27 this.window = window; 28 } 29 30 override void alphaBlending(bool value) 31 { 32 if (value) { 33 checkgl!glEnable(GL_BLEND); 34 checkgl!glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 35 } 36 else 37 checkgl!glDisable(GL_BLEND); 38 } 39 40 override void rectClipping(bool value) 41 { 42 if (value) checkgl!glEnable(GL_SCISSOR_TEST); 43 else checkgl!glDisable(GL_SCISSOR_TEST); 44 } 45 46 override void depthWrite(bool value) { 47 checkgl!glDepthMask(value); 48 } 49 50 override void depthTest(bool value) { 51 if (value) 52 checkgl!glEnable(GL_DEPTH_TEST); 53 else 54 checkgl!glDisable(GL_DEPTH_TEST); 55 } 56 57 override void faceCulling(bool value) { 58 if (value) 59 checkgl!glEnable(GL_CULL_FACE); 60 else 61 checkgl!glDisable(GL_CULL_FACE); 62 } 63 64 override void faceCullMode(FaceCullMode mode) { 65 checkgl!glCullFace(mode); 66 } 67 68 override void wireFrameMode(bool value) { 69 if (value) 70 checkgl!glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 71 else 72 checkgl!glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 73 } 74 75 override void setViewport(ivec2 pos, ivec2 size) { 76 checkgl!glViewport(pos.x, pos.y, size.x, size.y); 77 } 78 79 override void setClipRect(irect rect) { 80 checkgl!glScissor(rect.x, window.framebufferSize.y - rect.y - rect.height, rect.width, rect.height); 81 } 82 83 override void setClearColor(ubyte r, ubyte g, ubyte b, ubyte a = 255) 84 { 85 checkgl!glClearColor(cast(float)r/255, cast(float)g/255, cast(float)b/255, cast(float)a/255); 86 } 87 88 override SuperImage loadImage(string filename) 89 { 90 import dlib.image.io.io : dlib_loadImage = loadImage; 91 import dlib.image.image : ImageRGBA8, convert, PixelFormat; 92 SuperImage image = dlib_loadImage(filename); 93 if (image.pixelFormat != PixelFormat.RGBA8) 94 image = convert!ImageRGBA8(image); 95 return image; 96 } 97 98 override Texture createTexture(SuperImage image) 99 { 100 return new Texture(image, TextureTarget.target2d, TextureFormat.rgba); 101 } 102 103 override ShaderProgram createShaderProgram(string vertexSource, string fragmentSource) 104 { 105 ShaderProgram newProgram = new ShaderProgram(vertexSource, fragmentSource); 106 if (!newProgram.compile) throw new Exception(newProgram.errorLog); 107 shaders ~= newProgram; 108 return newProgram; 109 } 110 111 override ivec2 framebufferSize() @property 112 { 113 return window.framebufferSize(); 114 } 115 116 override void flush() 117 { 118 window.swapBuffers; 119 } 120 121 override void close() 122 { 123 foreach(shader; shaders) 124 { 125 shader.close; 126 } 127 shaders = null; 128 } 129 }