1 /* 2 * BSD 3-Clause License 3 * 4 * Copyright (c) 2016, Mango-Engine Team 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are met: 9 * 10 * * Redistributions of source code must retain the above copyright notice, this 11 * list of conditions and the following disclaimer. 12 * 13 * * Redistributions in binary form must reproduce the above copyright notice, 14 * this list of conditions and the following disclaimer in the documentation 15 * and/or other materials provided with the distribution. 16 * 17 * * Neither the name of the copyright holder nor the names of its 18 * contributors may be used to endorse or promote products derived from 19 * this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 module mango_engine.graphics.opengl.gl_backend; 33 34 immutable MANGO_GL_VERSION_MAJOR = 3; 35 immutable MANGO_GL_VERSION_MINOR = 3; 36 immutable MANGO_GL_VERSION = "3.3"; 37 38 version(mango_GLBackend) { 39 import mango_engine.game; 40 import mango_engine.mango; 41 import mango_engine.logging; 42 import mango_engine.util; 43 import mango_engine.graphics.renderer; 44 45 import derelict.opengl3.gl3; 46 import derelict.glfw3.glfw3; 47 import derelict.freeimage.freeimage; 48 import derelict.util.exception; 49 50 package void glbackend_loadCoreMethods() @system { 51 DerelictGL3.reload(); 52 } 53 54 class GLInitalizer : EngineInitalizer { 55 this(Logger logger) @safe nothrow { 56 super(logger); 57 } 58 59 private void loadLibraries() @system { 60 try { 61 DerelictGL3.load(); 62 this.logger.logDebug("Loaded OpenGL"); 63 } catch(Exception e) { 64 throw new Exception("Failed to load library OpenGL!"); 65 } 66 67 mixin(LoadLibraryTemplate!("GLFW", "GLFW3", "glfw3")); 68 DerelictFI.missingSymbolCallback = &this.fi_missingSymbolCB; 69 mixin(LoadLibraryTemplate!("FreeImage", "FI", "FreeImage")); 70 71 if(!glfwInit()) { 72 throw new Exception("Failed to init GLFW (glfwInit)!"); 73 } 74 } 75 76 private ShouldThrow fi_missingSymbolCB(string symbolName) @safe { 77 version(mango_noWarnOnMissingSymbol) { 78 } else { 79 logger.logWarn("(Minor) Missing FreeImage Symbol! " ~ symbolName); 80 } 81 return ShouldThrow.No; 82 } 83 84 override { 85 protected GameManagerFactory doInit() @trusted { 86 loadLibraries(); 87 88 GameManagerFactory factory = new GameManagerFactory(BackendType.BACKEND_OPENGL); 89 factory.setRenderer(Renderer.build()); 90 return factory; 91 } 92 93 protected void doDestroy() @trusted { 94 95 } 96 } 97 } 98 }