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.mango; 33 34 import mango_engine.game; 35 import mango_engine.util; 36 import mango_engine.logging; 37 38 import std.file; 39 40 /// The Global logger for Mango-Engine. This is statically initalized. 41 __gshared Logger GLOBAL_LOGGER; 42 /// The Version of the library. 43 immutable string VERSION = "v2.0.0-SNAPSHOT"; 44 45 shared BackendType currentBackendType; 46 47 static this() { 48 GLOBAL_LOGGER = new ConsoleLogger("Mango-Global"); 49 } 50 51 /// The type of backend that the engine can/will use. 52 enum BackendType { 53 BACKEND_OPENGL, 54 BACKEND_VULKAN 55 } 56 57 /// Class used to initalize the engine depending on the backend. 58 abstract class EngineInitalizer { 59 protected Logger logger; 60 61 package this(Logger logger) @safe nothrow { 62 this.logger = logger; 63 } 64 65 abstract protected GameManagerFactory doInit() @trusted; 66 67 abstract protected void doDestroy() @trusted; 68 } 69 70 /++ 71 Initalizes the engine. This will return a GameManagerFactory 72 instance, which can be used to construct a GameManager 73 instance. 74 +/ 75 GameManagerFactory mango_init(BackendType type) @trusted { 76 GLOBAL_LOGGER.logInfo("Mango-Engine version " ~ VERSION ~ ", built with " ~ __VENDOR__ ~ " on " ~ __TIMESTAMP__); 77 78 checkTempDirs(); 79 80 version(mango_GLBackend) { 81 import mango_engine.graphics.opengl.gl_backend : GLInitalizer; 82 83 currentBackendType = type; 84 85 if(type == BackendType.BACKEND_OPENGL) { 86 EngineInitalizer initalizer = new GLInitalizer(new ConsoleLogger("GLBackendInitalizer")); 87 return initalizer.doInit(); 88 } 89 } 90 91 throw new Exception("No backend has been compiled in!"); 92 } 93 94 private void checkTempDirs() @trusted { 95 auto tempDir = getTempDirectoryPath() ~ PATH_SEPERATOR ~ "mango-engine"; 96 GLOBAL_LOGGER.logDebug("Temporary directory is " ~ tempDir); 97 98 if(!exists(tempDir) || !isDir(tempDir)) { 99 mkdir(tempDir); // Create a new temp directory for mango-engine. 100 101 GLOBAL_LOGGER.logDebug("Created new temporary directory."); 102 } else { 103 rmdirRecurse(tempDir); // Clear the temp directory 104 mkdir(tempDir); // Create a new temp directory for mango-engine. 105 106 GLOBAL_LOGGER.logDebug("Cleaned temporary directory."); 107 } 108 }