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 }