OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1#include <Tempest/Window>
2#include <Tempest/Application>
3#include <Tempest/Log>
4
5#include <zenkit/Logger.hh>
6
7#include <Tempest/VulkanApi>
8
9#if defined(_MSC_VER)
10#include <Tempest/DirectX12Api>
11#endif
12
13#if defined(__APPLE__)
14#include <Tempest/MetalApi>
15#endif
16
17#if defined(__IOS__)
18#include "utils/installdetect.h"
19#endif
20
21#include "utils/crashlog.h"
22#include "mainwindow.h"
23#include "gothic.h"
24#include "build.h"
25#include "commandline.h"
26
27#include <dmusic.h>
28
29std::string_view selectDevice(const Tempest::AbstractGraphicsApi& api) {
30 auto d = api.devices();
31
32 static Tempest::Device::Props p;
33 for(auto& i:d)
34 // if(i.type==Tempest::DeviceType::Integrated) {
35 if(i.type==Tempest::DeviceType::Discrete) {
36 p = i;
37 return p.name;
38 }
39 if(d.size()>0) {
40 p = d[0];
41 return p.name;
42 }
43 return "";
44 }
45
46std::unique_ptr<Tempest::AbstractGraphicsApi> mkApi(const CommandLine& g) {
47 Tempest::ApiFlags flg = g.isValidationMode() ? Tempest::ApiFlags::Validation : Tempest::ApiFlags::NoFlags;
48 switch(g.graphicsApi()) {
50#if defined(_MSC_VER)
51 return std::make_unique<Tempest::DirectX12Api>(flg);
52#else
53 break;
54#endif
56#if !defined(__APPLE__)
57 return std::make_unique<Tempest::VulkanApi>(flg);
58#else
59 break;
60#endif
61 }
62
63#if defined(__APPLE__)
64 return std::make_unique<Tempest::MetalApi>(flg);
65#else
66 return std::make_unique<Tempest::VulkanApi>(flg);
67#endif
68 }
69
70int main(int argc,const char** argv) {
71#if defined(__IOS__)
72 {
73 auto appdir = InstallDetect::applicationSupportDirectory();
74 std::filesystem::current_path(appdir);
75 }
76#endif
77
78 try {
79 static Tempest::WFile logFile("log.txt");
80 Tempest::Log::setOutputCallback([](Tempest::Log::Mode mode, const char* text) {
81 logFile.write(text,std::strlen(text));
82 logFile.write("\n",1);
83 if(mode==Tempest::Log::Error)
84 logFile.flush();
85 });
86 }
87 catch(...) {
88 Tempest::Log::e("unable to setup logfile - fallback to console log");
89 }
91
92 zenkit::Logger::set(zenkit::LogLevel::INFO, [] (zenkit::LogLevel lvl, const char* cat, const char* message) {
93 (void)cat;
94 switch (lvl) {
95 case zenkit::LogLevel::ERROR:
96 Tempest::Log::e("[zenkit] ", message);
97 break;
98 case zenkit::LogLevel::WARNING:
99 Tempest::Log::e("[zenkit] ", message);
100 break;
101 case zenkit::LogLevel::INFO:
102 Tempest::Log::i("[zenkit] ", message);
103 break;
104 case zenkit::LogLevel::DEBUG:
105 case zenkit::LogLevel::TRACE:
106 Tempest::Log::d("[zenkit] ", message); // unused
107 break;
108 }
109 });
110 Dm_setLogger(DmLogLevel_INFO, [](void* ctx, DmLogLevel lvl, char const* msg) {
111 switch (lvl) {
112 case DmLogLevel_FATAL:
113 case DmLogLevel_ERROR:
114 case DmLogLevel_WARN:
115 Tempest::Log::e("[dmusic] ", msg);
116 break;
117 case DmLogLevel_INFO:
118 Tempest::Log::i("[dmusic] ", msg);
119 break;
120 case DmLogLevel_DEBUG:
121 case DmLogLevel_TRACE:
122 Tempest::Log::d("[dmusic] ", msg);
123 break;
124 }
125 }, nullptr);
126
127 Tempest::Log::i(appBuild);
128 Workers::setThreadName("Main thread");
129
130 CommandLine cmd{argc,argv};
131 auto api = mkApi(cmd);
132 const auto gpuName = selectDevice(*api);
134
135 Tempest::Device device{*api,gpuName};
136 CrashLog::setGpu(device.properties().name);
137
138 Resources resources{device};
139 Gothic gothic;
140 GameMusic music;
141 gothic.setupGlobalScripts();
142
143 MainWindow wx(device);
144 Tempest::Application app;
145 return app.exec();
146 }
static const char * appBuild
Definition build.h:3
auto graphicsApi() const -> GraphicBackend
bool isValidationMode() const
Definition commandline.h:36
static void setGpu(std::string_view name)
Definition crashlog.cpp:114
static void setup()
Definition crashlog.cpp:102
void setupGlobalScripts()
Definition gothic.cpp:254
Main application window handling game rendering and input.
Definition mainwindow.h:58
static void setThreadName(const char *threadName)
Definition workers.cpp:66
static char gpuName[64]
Definition crashlog.cpp:26
int main(int argc, const char **argv)
Definition main.cpp:70
std::unique_ptr< Tempest::AbstractGraphicsApi > mkApi(const CommandLine &g)
Definition main.cpp:46
std::string_view selectDevice(const Tempest::AbstractGraphicsApi &api)
Definition main.cpp:29
Main application window for OpenGothic.