summaryrefslogtreecommitdiffhomepage
path: root/main/main.cpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2022-10-23 17:31:31 +0200
committerStanislaw Halik <sthalik@misaki.pl>2022-10-23 17:31:31 +0200
commitcce1f768e7399b838a2b865511915bdd576dbbf4 (patch)
tree4c6a8f2dc9112394fd329d56c0f628ce66b16467 /main/main.cpp
parent6b875a0919b9932eca9ed877552c34ecb220b7d8 (diff)
a
Diffstat (limited to 'main/main.cpp')
-rw-r--r--main/main.cpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/main/main.cpp b/main/main.cpp
new file mode 100644
index 00000000..37e7164b
--- /dev/null
+++ b/main/main.cpp
@@ -0,0 +1,109 @@
+#include <cstddef>
+#include "compat/sysexits.hpp"
+#include "main.hpp"
+#include "compat/fpu.hpp"
+#include <Corrade/Utility/Arguments.h>
+#include <Corrade/Utility/DebugStl.h>
+#include <Magnum/GL/DefaultFramebuffer.h>
+
+#ifdef FM_MSAA
+#include <Magnum/GL/RenderbufferFormat.h>
+#endif
+
+namespace floormat {
+
+int floormat::run_from_argv(int argc, char** argv)
+{
+ Corrade::Utility::Arguments args{};
+ app_settings opts;
+ args.addSkippedPrefix("magnum")
+ .addOption("vsync", opts.vsync ? "1" : "0")
+ .parse(argc, argv);
+ opts.vsync = args.value<bool>("vsync");
+ floormat x{{argc, argv}, std::move(opts)}; // NOLINT(performance-move-const-arg)
+ return x.exec();
+}
+
+void floormat::usage(const Utility::Arguments& args)
+{
+ Error{Error::Flag::NoNewlineAtTheEnd} << args.usage();
+ std::exit(EX_USAGE); // NOLINT(concurrency-mt-unsafe)
+}
+
+floormat::floormat(const Arguments& arguments, app_settings opts):
+ Platform::Sdl2Application{
+ arguments,
+ Configuration{}
+ .setTitle("Test")
+ .setSize({1024, 768}, dpi_policy::Physical)
+ .setWindowFlags(Configuration::WindowFlag::Resizable),
+ GLConfiguration{}
+ },
+ _settings{opts}
+{
+ SDL_MaximizeWindow(window());
+
+ if (opts.vsync)
+ {
+ (void)setSwapInterval(1);
+ if (const auto list = GL::Context::current().extensionStrings();
+ std::find(list.cbegin(), list.cend(), "EXT_swap_control_tear") != list.cbegin())
+ (void)setSwapInterval(-1);
+ }
+ else
+ setSwapInterval(0);
+
+ set_fp_mask();
+ reset_camera_offset();
+
+ fm_assert(framebufferSize() == windowSize());
+ recalc_viewport(windowSize());
+
+ setMinimalLoopPeriod(5);
+ {
+ auto c = _world[chunk_coords{0, 0}];
+ make_test_chunk(*c);
+ }
+ timeline.start();
+}
+
+void floormat::recalc_viewport(Vector2i size)
+{
+ _shader.set_scale(Vector2(size));
+ init_imgui(size);
+ _cursor_pixel = std::nullopt;
+ recalc_cursor_tile();
+
+ GL::defaultFramebuffer.setViewport({{}, size });
+#ifdef FM_MSAA
+ _msaa_framebuffer.detach(GL::Framebuffer::ColorAttachment{0});
+ _msaa_renderbuffer = Magnum::GL::Renderbuffer{};
+ _msaa_renderbuffer.setStorageMultisample(msaa_samples, GL::RenderbufferFormat::RGBA8, size);
+ _msaa_framebuffer.setViewport({{}, size });
+ _msaa_framebuffer.attachRenderbuffer(GL::Framebuffer::ColorAttachment{0}, _msaa_renderbuffer);
+#endif
+}
+
+} // namespace floormat
+
+int main(int argc, char** argv)
+{
+ return floormat::floormat::run_from_argv(argc, argv);
+}
+
+#ifdef _MSC_VER
+#include <cstdlib> // for __arg{c,v}
+#ifdef __clang__
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wmain"
+#endif
+extern "C" int __stdcall WinMain(void*, void*, void*, int);
+
+extern "C" int __stdcall WinMain(void*, void*, void*, int)
+{
+ return main(__argc, __argv);
+}
+#ifdef __clang__
+# pragma clang diagnostic pop
+#endif
+#endif