From 35ba5a331d689506318c947913f7b99564f74fbf Mon Sep 17 00:00:00 2001 From: chatlanin Date: Thu, 2 Mar 2023 14:54:39 +0300 Subject: [PATCH] initial commit --- .gitignore | 12 + README.md | 1 + bin/main.cpp | 7 + bin/meson.build | 6 + meson.build | 59 ++ props.json | 2 + run | 13 + src/meson.build | 4 + src/sandbox/layers/test_panel/test_panel.cpp | 39 + src/sandbox/layers/test_panel/test_panel.hpp | 33 + src/sandbox/meson.build | 23 + src/sandbox/sandbox.hpp | 42 + src/try_engine/application/application.cpp | 54 ++ src/try_engine/application/application.hpp | 40 + src/try_engine/event/app_event/event.hpp | 33 + src/try_engine/event/event_classificator.hpp | 13 + .../event/system_event/category/key_event.hpp | 38 + .../system_event/category/window_event.hpp | 49 ++ src/try_engine/event/system_event/event.hpp | 14 + src/try_engine/gui/gui.cpp | 60 ++ src/try_engine/gui/gui.hpp | 17 + src/try_engine/gui/style/fonts.hpp | 46 ++ src/try_engine/gui/style/icons.hpp | 719 ++++++++++++++++++ src/try_engine/gui/style/style.hpp | 82 ++ src/try_engine/layer/layer.hpp | 32 + src/try_engine/meson.build | 32 + src/try_engine/renderer/renderer.cpp | 14 + src/try_engine/renderer/renderer.hpp | 22 + src/try_engine/renderer/texture/texture.cpp | 27 + src/try_engine/renderer/texture/texture.hpp | 26 + src/try_engine/try_engine.hpp | 15 + src/try_engine/utils/define.hpp | 65 ++ src/try_engine/utils/include.hpp | 39 + src/try_engine/utils/timestap.hpp | 22 + .../graphic_context/graphic_context.cpp | 27 + .../graphic_context/graphic_context.hpp | 18 + src/try_engine/window/window.cpp | 158 ++++ src/try_engine/window/window.hpp | 46 ++ subprojects/glad.wrap | 6 + subprojects/glfw.wrap | 13 + subprojects/glm.wrap | 12 + subprojects/gtest.wrap | 15 + subprojects/hack.wrap | 6 + subprojects/imgui.wrap | 12 + subprojects/nlohmann_json.wrap | 10 + subprojects/taglib.wrap | 12 + tests/meson.build | 11 + tests/test_wave_file.wav | Bin 0 -> 132344 bytes 48 files changed, 2046 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 bin/main.cpp create mode 100644 bin/meson.build create mode 100644 meson.build create mode 100644 props.json create mode 100755 run create mode 100644 src/meson.build create mode 100644 src/sandbox/layers/test_panel/test_panel.cpp create mode 100644 src/sandbox/layers/test_panel/test_panel.hpp create mode 100644 src/sandbox/meson.build create mode 100644 src/sandbox/sandbox.hpp create mode 100644 src/try_engine/application/application.cpp create mode 100644 src/try_engine/application/application.hpp create mode 100644 src/try_engine/event/app_event/event.hpp create mode 100644 src/try_engine/event/event_classificator.hpp create mode 100644 src/try_engine/event/system_event/category/key_event.hpp create mode 100644 src/try_engine/event/system_event/category/window_event.hpp create mode 100644 src/try_engine/event/system_event/event.hpp create mode 100644 src/try_engine/gui/gui.cpp create mode 100644 src/try_engine/gui/gui.hpp create mode 100644 src/try_engine/gui/style/fonts.hpp create mode 100644 src/try_engine/gui/style/icons.hpp create mode 100644 src/try_engine/gui/style/style.hpp create mode 100644 src/try_engine/layer/layer.hpp create mode 100644 src/try_engine/meson.build create mode 100644 src/try_engine/renderer/renderer.cpp create mode 100644 src/try_engine/renderer/renderer.hpp create mode 100644 src/try_engine/renderer/texture/texture.cpp create mode 100644 src/try_engine/renderer/texture/texture.hpp create mode 100644 src/try_engine/try_engine.hpp create mode 100644 src/try_engine/utils/define.hpp create mode 100644 src/try_engine/utils/include.hpp create mode 100644 src/try_engine/utils/timestap.hpp create mode 100644 src/try_engine/window/graphic_context/graphic_context.cpp create mode 100644 src/try_engine/window/graphic_context/graphic_context.hpp create mode 100644 src/try_engine/window/window.cpp create mode 100644 src/try_engine/window/window.hpp create mode 100644 subprojects/glad.wrap create mode 100644 subprojects/glfw.wrap create mode 100644 subprojects/glm.wrap create mode 100644 subprojects/gtest.wrap create mode 100644 subprojects/hack.wrap create mode 100644 subprojects/imgui.wrap create mode 100644 subprojects/nlohmann_json.wrap create mode 100644 subprojects/taglib.wrap create mode 100644 tests/meson.build create mode 100644 tests/test_wave_file.wav diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..782dcf1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +build +.cache +subprojects/* +!subprojects/glad.wrap +!subprojects/glfw.wrap +!subprojects/glm.wrap +!subprojects/gtest.wrap +!subprojects/hack.wrap +!subprojects/imgui.wrap +!subprojects/nlohmann_json.wrap +!subprojects/taglib.wrap + diff --git a/README.md b/README.md new file mode 100644 index 0000000..f74cb69 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Движок diff --git a/bin/main.cpp b/bin/main.cpp new file mode 100644 index 0000000..8f87641 --- /dev/null +++ b/bin/main.cpp @@ -0,0 +1,7 @@ +#include "sandbox/sandbox.hpp" + +auto main(int argc, char* args[]) -> int +{ + decltype(auto) app = try_engine::create(); + app.run(); +} diff --git a/bin/meson.build b/bin/meson.build new file mode 100644 index 0000000..835449d --- /dev/null +++ b/bin/meson.build @@ -0,0 +1,6 @@ +executable( + 'try_engine', + 'main.cpp', + dependencies : deps, + cpp_args: args +) diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..b4ddb0c --- /dev/null +++ b/meson.build @@ -0,0 +1,59 @@ +project( + 'try_engine', + 'cpp', + version : run_command('jq', '-r', '.version', join_paths(meson.source_root(), 'props.json'), check: true).stdout().strip(), + default_options : [ + 'warning_level=1', + 'optimization=3', + 'default_library=static', + 'cpp_std=c++20', +]) + +add_project_arguments ( + '-Wpedantic', + '-Wno-shadow', + '-Wno-unused-but-set-variable', + '-Wno-comment', + '-Wno-unused-parameter', + '-Wno-unused-value', + '-Wno-missing-field-initializers', + '-Wno-narrowing', + '-Wno-deprecated-enum-enum-conversion', + '-Wno-volatile', + language: 'cpp' +) + +############################################################# + +#args = ['-lglfw', '-ldl', '-lGL', '-lpthread', '-lX11', '-lXxf86vm', '-lXrandr', '-lXi'] +args = [ + '-lopenal', + '-lsndfile', + '-lmpg123', +] + +deps = [ + dependency('TBB'), + dependency('OpenCV'), + dependency('uuid'), + dependency('threads'), + dependency('opengl'), + subproject('glfw').get_variable('glfw_dep'), + subproject('glad').get_variable('glad_dep'), + subproject('hack').get_variable('logger_dep'), + subproject('imgui').get_variable('imgui_dep'), + subproject('glm').get_variable('glm_dep'), + subproject('nlohmann_json').get_variable('nlohmann_json_dep'), + subproject('taglib').get_variable('taglib_dep'), + dependency('openal'), + dependency('libmpg123'), + dependency('sndfile'), +] + +inc = [] + +############################################################# + +subdir('src') +subdir('bin') +#subdir('tests') diff --git a/props.json b/props.json new file mode 100644 index 0000000..a02e9e6 --- /dev/null +++ b/props.json @@ -0,0 +1,2 @@ +{"version": "1.0.0"} + diff --git a/run b/run new file mode 100755 index 0000000..6f38658 --- /dev/null +++ b/run @@ -0,0 +1,13 @@ +#!/bin/zsh + +PROJECT_NAME="try_engine" + +command meson compile -C build + +if [[ -z "$1" ]]; then + cd build + ./bin/$PROJECT_NAME + cd .. +else + meson test $1 -C build +fi diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..5801531 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,4 @@ +inc += include_directories('.') + +subdir('try_engine') +subdir('sandbox') diff --git a/src/sandbox/layers/test_panel/test_panel.cpp b/src/sandbox/layers/test_panel/test_panel.cpp new file mode 100644 index 0000000..e74dc73 --- /dev/null +++ b/src/sandbox/layers/test_panel/test_panel.cpp @@ -0,0 +1,39 @@ +#include "test_panel.hpp" + +namespace tr::layers +{ + void test_panel::on_attach() + { + BASE_WINDOW_FLAGS(); + } + + void test_panel::on_detach() + { + + } + + void test_panel::gui_render() + { + ImGui::SetNextWindowPos(ImVec2(pos_x, pos_y)); + ImGui::SetNextWindowSize(ImVec2(width, height)); + + BEGIN_IMGUI_WIN(); + + END_IMGUI_WIN(); + } + + void test_panel::on_event(system_event& e) + { + + } + + void test_panel::on_event(std::any e, std::any value) + { + } + + void test_panel::on_update(time t) + { + + } +} + diff --git a/src/sandbox/layers/test_panel/test_panel.hpp b/src/sandbox/layers/test_panel/test_panel.hpp new file mode 100644 index 0000000..33081b7 --- /dev/null +++ b/src/sandbox/layers/test_panel/test_panel.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include "try_engine/try_engine.hpp" + +namespace tr::layers +{ + class test_panel : public try_engine::layer + { + BASE_TYPE_DEFINE(); + + public: + CONSTRUCT_IMPL(test_panel); + + public: + BASE_OVERIDE_IMPL(); + + public: + SET_EVENT_MANAGER_IMPL(); + + private: + FLAGS_STRUCT_DEFINED(); + + bool show = true; + event_manager* em; + + float width = 720.f; + float height = 480.f; + + float pos_x = 212.f; + float pos_y = 35.f; + }; +} + diff --git a/src/sandbox/meson.build b/src/sandbox/meson.build new file mode 100644 index 0000000..00ef7f4 --- /dev/null +++ b/src/sandbox/meson.build @@ -0,0 +1,23 @@ +headers = [ + 'sandbox.hpp', + + 'layers/test_panel/test_panel.hpp' +] +sources = [ + 'layers/test_panel/test_panel.cpp' +] + +lib = library( + 'sandbox', + include_directories : inc, + sources: [headers, sources], + dependencies : deps, + cpp_args: args +) + +sandbox_dep = declare_dependency( + include_directories: inc, + link_with: lib, +) + +deps += sandbox_dep diff --git a/src/sandbox/sandbox.hpp b/src/sandbox/sandbox.hpp new file mode 100644 index 0000000..dd0eabc --- /dev/null +++ b/src/sandbox/sandbox.hpp @@ -0,0 +1,42 @@ +#include "try_engine/try_engine.hpp" + +#include "layers/test_panel/test_panel.hpp" + +namespace try_engine_sandbox +{ + using event_manager = try_engine::app_event::event; + + class sandbox : public try_engine::application + { + public: + sandbox(std::string app_name) : try_engine::application{ app_name } {}; + ~sandbox() = default; + + public: + template + void push_layer(Args... args) + { + (args->set_event_manager(&em), ...); + try_engine::application::push_layer(args...); + } + + private: + event_manager em; + }; +} + +namespace try_engine +{ + inline application& create() + { + static try_engine_sandbox::sandbox e{ "sandbox" }; + + e.push_layer( + new tr::layers::test_panel{} + ); + + e.attach_layers(); + + return e; + } +} diff --git a/src/try_engine/application/application.cpp b/src/try_engine/application/application.cpp new file mode 100644 index 0000000..a07c5a8 --- /dev/null +++ b/src/try_engine/application/application.cpp @@ -0,0 +1,54 @@ +#include "application.hpp" + +#include "try_engine/utils/define.hpp" + +namespace try_engine +{ + application::application(std::string app_name) + { + instance = std::unique_ptr(this); + + win = std::make_unique(app_name); + win->set_event_callback(BIND_EVENT_FN(application, on_event)); + + ui = std::make_unique(); + } + + void application::run() + { + while(!glfwWindowShouldClose(win->glfw_window())) + { + win->clear(); + + for (auto l : l_stack) + l->on_update(time::get_time()); + + ui->begin_frame(); + for (auto l : l_stack) + l->gui_render(); + ui->end_frame(); + + win->update(); + } + } + + std::unique_ptr& application::get_window() + { + return win; + } + + std::unique_ptr& application::get() + { + return instance; + } + + void application::attach_layers() + { + for (auto l : l_stack) l->on_attach(); + } + + void application::on_event(system_event::event& e) + { + for(const auto l : l_stack) l->on_event(e); + } +} diff --git a/src/try_engine/application/application.hpp b/src/try_engine/application/application.hpp new file mode 100644 index 0000000..2cb04af --- /dev/null +++ b/src/try_engine/application/application.hpp @@ -0,0 +1,40 @@ +#pragma once + +#include "try_engine/window/window.hpp" +#include "try_engine/gui/gui.hpp" +#include "try_engine/layer/layer.hpp" + +namespace try_engine +{ + class application + { + using layers_stack = std::vector; + + public: + application(std::string); + virtual ~application() = default; + + public: + void run(); + void attach_layers(); + std::unique_ptr& get_window(); + static std::unique_ptr& get(); + + public: + template + void push_layer(Args*... args) { (l_stack.push_back(args), ...); } + + private: + inline static std::unique_ptr instance = nullptr; + std::unique_ptr win; + layers_stack l_stack; + + private: + void clear(); + std::unique_ptr ui; + void on_event(system_event::event& e); + }; + + // реализация см. в проекте + application& create(); +} diff --git a/src/try_engine/event/app_event/event.hpp b/src/try_engine/event/app_event/event.hpp new file mode 100644 index 0000000..25159ee --- /dev/null +++ b/src/try_engine/event/app_event/event.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include + +#include "try_engine/layer/layer.hpp" + +namespace try_engine::app_event +{ + using layers_stack = std::vector; + + class event + { + public: + void set_event_callback(layer* l) + { + l_stack.push_back(l); + }; + + void execute(std::any type, std::any value) + { + tbb::parallel_for(tbb::blocked_range(0, l_stack.size()), [&](tbb::blocked_range r) + { + for (int i = r.begin(); i < r.end(); ++i) + l_stack[i]->on_event(type, value); + }); + } + + void print_size(); + + private: + layers_stack l_stack; + }; +} diff --git a/src/try_engine/event/event_classificator.hpp b/src/try_engine/event/event_classificator.hpp new file mode 100644 index 0000000..45c549b --- /dev/null +++ b/src/try_engine/event/event_classificator.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "try_engine/utils/include.hpp" + +namespace try_engine::system_event::classificator +{ + inline std::string WINDOW_RESIZE() { return "WINDOW_RESIZE"; } + inline std::string WINDOW_CLOSE() { return "WINDOW_CLOSE"; } + inline std::string WINDOW_FOCUS() { return "WINDOW_FOCUS"; } + + inline std::string KEY_PRESSED() { return "KEY_PRESSED"; } + inline std::string KEY_RELEASED() { return "KEY_RELEASED"; } +} diff --git a/src/try_engine/event/system_event/category/key_event.hpp b/src/try_engine/event/system_event/category/key_event.hpp new file mode 100644 index 0000000..99c0faf --- /dev/null +++ b/src/try_engine/event/system_event/category/key_event.hpp @@ -0,0 +1,38 @@ +#pragma once + +#include "try_engine/utils/define.hpp" +#include "try_engine/event/system_event/event.hpp" +#include "try_engine/event/event_classificator.hpp" + +namespace try_engine::system_event +{ + class key_event : public event + { + protected: + key_event(int kc) : keycode { kc } {} + + public: + inline int get_keycode() const { return keycode; } + + protected: + int keycode; + }; + + class key_pressed_event : public key_event + { + public: + key_pressed_event(int keycode) : key_event(keycode) {} + + public: + EVENT_CLASS_TYPE_FN(classificator::KEY_PRESSED()) + }; + + class key_released_event : public key_event + { + public: + key_released_event(int keycode) : key_event(keycode) {} + + public: + EVENT_CLASS_TYPE_FN(classificator::KEY_RELEASED()) + }; +} diff --git a/src/try_engine/event/system_event/category/window_event.hpp b/src/try_engine/event/system_event/category/window_event.hpp new file mode 100644 index 0000000..8ae1524 --- /dev/null +++ b/src/try_engine/event/system_event/category/window_event.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include "try_engine/utils/define.hpp" +#include "try_engine/event/system_event/event.hpp" +#include "try_engine/event/event_classificator.hpp" + +namespace try_engine::system_event +{ + class window_resize_event : public event + { + public: + window_resize_event(int w, int h) : width { w }, height { h } {} + + public: + EVENT_CLASS_TYPE_FN(classificator::WINDOW_RESIZE()) + + public: + inline unsigned int get_width() const { return width; } + inline unsigned int get_height() const { return height; } + + private: + int width, height; + }; + + class window_close_event : public event + { + public: + window_close_event() = default; + + public: + EVENT_CLASS_TYPE_FN(classificator::WINDOW_CLOSE()) + }; + + class window_focus_event : public event + { + public: + window_focus_event(int f) : focused { f } {} + + public: + EVENT_CLASS_TYPE_FN(classificator::WINDOW_FOCUS()) + + public: + inline int get_focused() { return focused; } + + private: + int focused; + }; +} + diff --git a/src/try_engine/event/system_event/event.hpp b/src/try_engine/event/system_event/event.hpp new file mode 100644 index 0000000..6d0e27c --- /dev/null +++ b/src/try_engine/event/system_event/event.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "utils/utils.hpp" + +namespace try_engine::system_event +{ + struct event + { + event() = default; + virtual ~event() = default; + + virtual std::string get_name() const = 0; + }; +} diff --git a/src/try_engine/gui/gui.cpp b/src/try_engine/gui/gui.cpp new file mode 100644 index 0000000..805a667 --- /dev/null +++ b/src/try_engine/gui/gui.cpp @@ -0,0 +1,60 @@ +#include "gui.hpp" + +#include "style/style.hpp" +#include "try_engine/application/application.hpp" + +namespace try_engine +{ + gui::gui() + { + IMGUI_CHECKVERSION(); + + ImGui::CreateContext(); + ImGui::StyleColorsDark(); + + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; + io.IniFilename = nullptr; + + ImGuiStyle& style = ImGui::GetStyle(); + if (io.ConfigFlags) + { + style.WindowRounding = 0.0f; + style.Colors[ImGuiCol_WindowBg].w = 1.0f; + } + + auto& app = application::get(); + GLFWwindow* window = app->get_window()->glfw_window(); + + ImGui_ImplGlfw_InitForOpenGL(window, true); + ImGui_ImplOpenGL3_Init("#version 410"); + + style::init(); + } + + gui::~gui() + { + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + } + + void gui::begin_frame() + { + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + } + + void gui::end_frame() + { + ImGuiIO& io = ImGui::GetIO(); + auto& app = application::get(); + io.DisplaySize = ImVec2((float)app->get_window()->width(), (float)app->get_window()->height()); + + ImGui::Render(); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + } +} + + diff --git a/src/try_engine/gui/gui.hpp b/src/try_engine/gui/gui.hpp new file mode 100644 index 0000000..7344ddc --- /dev/null +++ b/src/try_engine/gui/gui.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "try_engine/utils/include.hpp" + +namespace try_engine +{ + class gui + { + public: + gui(); + ~gui(); + + public: + void begin_frame(); + void end_frame(); + }; +} diff --git a/src/try_engine/gui/style/fonts.hpp b/src/try_engine/gui/style/fonts.hpp new file mode 100644 index 0000000..93b1d76 --- /dev/null +++ b/src/try_engine/gui/style/fonts.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include + +#include "imgui.h" + +#include "icons.hpp" + +namespace try_engine::style::fonts +{ + enum font { TEXT_R_0, TEXT_REG_15, TEXT_REG_175, TEXT_REG_2, TEXT_BOLD_0, TEXT_BOLD_2, ICON_0, ICON_05, ICON_075, ICON_2 }; + + // HERE + // эту порнографию с путями нужно решить + inline const std::string PATH = "/mnt/develop/projects/cpp/fonmix/emuse.v.2.0.0/src/core/internal/"; + + inline void init() + { + ImGuiIO& io = ImGui::GetIO(); + float size_pixels = 16.0f; + static const ImWchar icon_ranges[] = { ICON_MIN_FK, ICON_MAX_FK, 0 }; + + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/Ruda/Ruda-Regular.ttf")).c_str(), size_pixels, NULL, io.Fonts->GetGlyphRangesCyrillic()); + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/Ruda/Ruda-Regular.ttf")).c_str(), size_pixels * 1.5f, NULL, io.Fonts->GetGlyphRangesCyrillic()); + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/Ruda/Ruda-Regular.ttf")).c_str(), size_pixels * 1.75f, NULL, io.Fonts->GetGlyphRangesCyrillic()); + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/Ruda/Ruda-Regular.ttf")).c_str(), size_pixels * 2.0f, NULL, io.Fonts->GetGlyphRangesCyrillic()); + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/Ruda/Ruda-Bold.ttf")).c_str(), size_pixels, NULL, io.Fonts->GetGlyphRangesCyrillic()); + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/Ruda/Ruda-Bold.ttf")).c_str(), size_pixels * 2.0f, NULL, io.Fonts->GetGlyphRangesCyrillic()); + + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/forkawesome-webfont.ttf")).c_str(), size_pixels, NULL, icon_ranges); + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/forkawesome-webfont.ttf")).c_str(), size_pixels * 0.50f, NULL, icon_ranges); + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/forkawesome-webfont.ttf")).c_str(), size_pixels * 0.75f, NULL, icon_ranges); + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/forkawesome-webfont.ttf")).c_str(), size_pixels * 1.1f, NULL, icon_ranges); + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/forkawesome-webfont.ttf")).c_str(), size_pixels * 1.25f, NULL, icon_ranges); + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/forkawesome-webfont.ttf")).c_str(), size_pixels * 1.5f, NULL, icon_ranges); + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/forkawesome-webfont.ttf")).c_str(), size_pixels * 1.65f, NULL, icon_ranges); + io.Fonts->AddFontFromFileTTF((PATH + std::string("/fonts/forkawesome-webfont.ttf")).c_str(), size_pixels * 2.0f, NULL, icon_ranges); + }; + + inline ImFont* GetFont(font f = font::TEXT_R_0) + { + ImGuiIO& io = ImGui::GetIO(); + ImFontAtlas* atlas = io.Fonts; + return atlas->Fonts[f]; + }; +} diff --git a/src/try_engine/gui/style/icons.hpp b/src/try_engine/gui/style/icons.hpp new file mode 100644 index 0000000..5da1f82 --- /dev/null +++ b/src/try_engine/gui/style/icons.hpp @@ -0,0 +1,719 @@ +#pragma once + +// for use with https://github.com/ForkAwesome/Fork-Awesome/blob/master/fonts/forkawesome-webfont.ttf +#define ICON_MIN_FK 0xf000 +#define ICON_MAX_FK 0xf307 + +namespace try_engine::style::icon +{ + inline const char* ICON_GLASS = "\uf000"; + inline const char* ICON_MUSIC = "\uf001"; + inline const char* ICON_SEARCH = "\uf002"; + inline const char* ICON_ENVELOPE_O = "\uf003"; + inline const char* ICON_HEART = "\uf004"; + inline const char* ICON_STAR = "\uf005"; + inline const char* ICON_STAR_O = "\uf006"; + inline const char* ICON_USER = "\uf007"; + inline const char* ICON_FILM = "\uf008"; + inline const char* ICON_TH_LARGE = "\uf009"; + inline const char* ICON_TH = "\uf00a"; + inline const char* ICON_TH_LIST = "\uf00b"; + inline const char* ICON_CHECK = "\uf00c"; + inline const char* ICON_TIMES = "\uf00d"; + inline const char* ICON_SEARCH_PLUS = "\uf00e"; + inline const char* ICON_SEARCH_MINUS = "\uf010"; + inline const char* ICON_POWER_OFF = "\uf011"; + inline const char* ICON_SIGNAL = "\uf012"; + inline const char* ICON_COG = "\uf013"; + inline const char* ICON_TRASH_O = "\uf014"; + inline const char* ICON_HOME = "\uf015"; + inline const char* ICON_FILE_O = "\uf016"; + inline const char* ICON_CLOCK_O = "\uf017"; + inline const char* ICON_ROAD = "\uf018"; + inline const char* ICON_DOWNLOAD = "\uf019"; + inline const char* ICON_ARROW_CIRCLE_O_DOWN = "\uf01a"; + inline const char* ICON_ARROW_CIRCLE_O_UP = "\uf01b"; + inline const char* ICON_INBOX = "\uf01c"; + inline const char* ICON_PLAY_CIRCLE_O = "\uf01d"; + inline const char* ICON_REPEAT = "\uf01e"; + inline const char* ICON_REFRESH = "\uf021"; + inline const char* ICON_LIST_ALT = "\uf022"; + inline const char* ICON_LOCK = "\uf023"; + inline const char* ICON_FLAG = "\uf024"; + inline const char* ICON_HEADPHONES = "\uf025"; + inline const char* ICON_VOLUME_OFF = "\uf026"; + inline const char* ICON_VOLUME_DOWN = "\uf027"; + inline const char* ICON_VOLUME_UP = "\uf028"; + inline const char* ICON_QRCODE = "\uf029"; + inline const char* ICON_BARCODE = "\uf02a"; + inline const char* ICON_TAG = "\uf02b"; + inline const char* ICON_TAGS = "\uf02c"; + inline const char* ICON_BOOK = "\uf02d"; + inline const char* ICON_BOOKMARK = "\uf02e"; + inline const char* ICON_PRINT = "\uf02f"; + inline const char* ICON_CAMERA = "\uf030"; + inline const char* ICON_FONT = "\uf031"; + inline const char* ICON_BOLD = "\uf032"; + inline const char* ICON_ITALIC = "\uf033"; + inline const char* ICON_TEXT_HEIGHT = "\uf034"; + inline const char* ICON_TEXT_WIDTH = "\uf035"; + inline const char* ICON_ALIGN_LEFT = "\uf036"; + inline const char* ICON_ALIGN_CENTER = "\uf037"; + inline const char* ICON_ALIGN_RIGHT = "\uf038"; + inline const char* ICON_ALIGN_JUSTIFY = "\uf039"; + inline const char* ICON_LIST = "\uf03a"; + inline const char* ICON_OUTDENT = "\uf03b"; + inline const char* ICON_INDENT = "\uf03c"; + inline const char* ICON_VIDEO_CAMERA = "\uf03d"; + inline const char* ICON_PICTURE_O = "\uf03e"; + inline const char* ICON_PENCIL = "\uf040"; + inline const char* ICON_MAP_MARKER = "\uf041"; + inline const char* ICON_ADJUST = "\uf042"; + inline const char* ICON_TINT = "\uf043"; + inline const char* ICON_PENCIL_SQUARE_O = "\uf044"; + inline const char* ICON_SHARE_SQUARE_O = "\uf045"; + inline const char* ICON_CHECK_SQUARE_O = "\uf046"; + inline const char* ICON_ARROWS = "\uf047"; + inline const char* ICON_STEP_BACKWARD = "\uf048"; + inline const char* ICON_FAST_BACKWARD = "\uf049"; + inline const char* ICON_BACKWARD = "\uf04a"; + inline const char* ICON_PLAY = "\uf04b"; + inline const char* ICON_PAUSE = "\uf04c"; + inline const char* ICON_STOP = "\uf04d"; + inline const char* ICON_FORWARD = "\uf04e"; + inline const char* ICON_FAST_FORWARD = "\uf050"; + inline const char* ICON_STEP_FORWARD = "\uf051"; + inline const char* ICON_EJECT = "\uf052"; + inline const char* ICON_CHEVRON_LEFT = "\uf053"; + inline const char* ICON_CHEVRON_RIGHT = "\uf054"; + inline const char* ICON_PLUS_CIRCLE = "\uf055"; + inline const char* ICON_MINUS_CIRCLE = "\uf056"; + inline const char* ICON_TIMES_CIRCLE = "\uf057"; + inline const char* ICON_CHECK_CIRCLE = "\uf058"; + inline const char* ICON_QUESTION_CIRCLE = "\uf059"; + inline const char* ICON_INFO_CIRCLE = "\uf05a"; + inline const char* ICON_CROSSHAIRS = "\uf05b"; + inline const char* ICON_TIMES_CIRCLE_O = "\uf05c"; + inline const char* ICON_CHECK_CIRCLE_O = "\uf05d"; + inline const char* ICON_BAN = "\uf05e"; + inline const char* ICON_ARROW_LEFT = "\uf060"; + inline const char* ICON_ARROW_RIGHT = "\uf061"; + inline const char* ICON_ARROW_UP = "\uf062"; + inline const char* ICON_ARROW_DOWN = "\uf063"; + inline const char* ICON_SHARE = "\uf064"; + inline const char* ICON_EXPAND = "\uf065"; + inline const char* ICON_COMPRESS = "\uf066"; + inline const char* ICON_PLUS = "\uf067"; + inline const char* ICON_MINUS = "\uf068"; + inline const char* ICON_ASTERISK = "\uf069"; + inline const char* ICON_EXCLAMATION_CIRCLE = "\uf06a"; + inline const char* ICON_GIFT = "\uf06b"; + inline const char* ICON_LEAF = "\uf06c"; + inline const char* ICON_FIRE = "\uf06d"; + inline const char* ICON_EYE = "\uf06e"; + inline const char* ICON_EYE_SLASH = "\uf070"; + inline const char* ICON_EXCLAMATION_TRIANGLE = "\uf071"; + inline const char* ICON_PLANE = "\uf072"; + inline const char* ICON_CALENDAR = "\uf073"; + inline const char* ICON_RANDOM = "\uf074"; + inline const char* ICON_COMMENT = "\uf075"; + inline const char* ICON_MAGNET = "\uf076"; + inline const char* ICON_CHEVRON_UP = "\uf077"; + inline const char* ICON_CHEVRON_DOWN = "\uf078"; + inline const char* ICON_RETWEET = "\uf079"; + inline const char* ICON_SHOPPING_CART = "\uf07a"; + inline const char* ICON_FOLDER = "\uf07b"; + inline const char* ICON_FOLDER_OPEN = "\uf07c"; + inline const char* ICON_ARROWS_V = "\uf07d"; + inline const char* ICON_ARROWS_H = "\uf07e"; + inline const char* ICON_BAR_CHART = "\uf080"; + inline const char* ICON_TWITTER_SQUARE = "\uf081"; + inline const char* ICON_FACEBOOK_SQUARE = "\uf082"; + inline const char* ICON_CAMERA_RETRO = "\uf083"; + inline const char* ICON_KEY = "\uf084"; + inline const char* ICON_COGS = "\uf085"; + inline const char* ICON_COMMENTS = "\uf086"; + inline const char* ICON_THUMBS_O_UP = "\uf087"; + inline const char* ICON_THUMBS_O_DOWN = "\uf088"; + inline const char* ICON_STAR_HALF = "\uf089"; + inline const char* ICON_HEART_O = "\uf08a"; + inline const char* ICON_SIGN_OUT = "\uf08b"; + inline const char* ICON_LINKEDIN_SQUARE = "\uf08c"; + inline const char* ICON_THUMB_TACK = "\uf08d"; + inline const char* ICON_inlineAL_LINK = "\uf08e"; + inline const char* ICON_SIGN_IN = "\uf090"; + inline const char* ICON_TROPHY = "\uf091"; + inline const char* ICON_GITHUB_SQUARE = "\uf092"; + inline const char* ICON_UPLOAD = "\uf093"; + inline const char* ICON_LEMON_O = "\uf094"; + inline const char* ICON_PHONE = "\uf095"; + inline const char* ICON_SQUARE_O = "\uf096"; + inline const char* ICON_BOOKMARK_O = "\uf097"; + inline const char* ICON_PHONE_SQUARE = "\uf098"; + inline const char* ICON_TWITTER = "\uf099"; + inline const char* ICON_FACEBOOK = "\uf09a"; + inline const char* ICON_GITHUB = "\uf09b"; + inline const char* ICON_UNLOCK = "\uf09c"; + inline const char* ICON_CREDIT_CARD = "\uf09d"; + inline const char* ICON_RSS = "\uf09e"; + inline const char* ICON_HDD_O = "\uf0a0"; + inline const char* ICON_BULLHORN = "\uf0a1"; + inline const char* ICON_BELL = "\uf0f3"; + inline const char* ICON_CERTIFICATE = "\uf0a3"; + inline const char* ICON_HAND_O_RIGHT = "\uf0a4"; + inline const char* ICON_HAND_O_LEFT = "\uf0a5"; + inline const char* ICON_HAND_O_UP = "\uf0a6"; + inline const char* ICON_HAND_O_DOWN = "\uf0a7"; + inline const char* ICON_ARROW_CIRCLE_LEFT = "\uf0a8"; + inline const char* ICON_ARROW_CIRCLE_RIGHT = "\uf0a9"; + inline const char* ICON_ARROW_CIRCLE_UP = "\uf0aa"; + inline const char* ICON_ARROW_CIRCLE_DOWN = "\uf0ab"; + inline const char* ICON_GLOBE = "\uf0ac"; + inline const char* ICON_GLOBE_E = "\uf304"; + inline const char* ICON_GLOBE_W = "\uf305"; + inline const char* ICON_WRENCH = "\uf0ad"; + inline const char* ICON_TASKS = "\uf0ae"; + inline const char* ICON_FILTER = "\uf0b0"; + inline const char* ICON_BRIEFCASE = "\uf0b1"; + inline const char* ICON_ARROWS_ALT = "\uf0b2"; + inline const char* ICON_USERS = "\uf0c0"; + inline const char* ICON_LINK = "\uf0c1"; + inline const char* ICON_CLOUD = "\uf0c2"; + inline const char* ICON_FLASK = "\uf0c3"; + inline const char* ICON_SCISSORS = "\uf0c4"; + inline const char* ICON_FILES_O = "\uf0c5"; + inline const char* ICON_PAPERCLIP = "\uf0c6"; + inline const char* ICON_FLOPPY_O = "\uf0c7"; + inline const char* ICON_SQUARE = "\uf0c8"; + inline const char* ICON_BARS = "\uf0c9"; + inline const char* ICON_LIST_UL = "\uf0ca"; + inline const char* ICON_LIST_OL = "\uf0cb"; + inline const char* ICON_STRIKETHROUGH = "\uf0cc"; + inline const char* ICON_UNDERLINE = "\uf0cd"; + inline const char* ICON_TABLE = "\uf0ce"; + inline const char* ICON_MAGIC = "\uf0d0"; + inline const char* ICON_TRUCK = "\uf0d1"; + inline const char* ICON_PINTEREST = "\uf0d2"; + inline const char* ICON_PINTEREST_SQUARE = "\uf0d3"; + inline const char* ICON_GOOGLE_PLUS_SQUARE = "\uf0d4"; + inline const char* ICON_GOOGLE_PLUS = "\uf0d5"; + inline const char* ICON_MONEY = "\uf0d6"; + inline const char* ICON_CARET_DOWN = "\uf0d7"; + inline const char* ICON_CARET_UP = "\uf0d8"; + inline const char* ICON_CARET_LEFT = "\uf0d9"; + inline const char* ICON_CARET_RIGHT = "\uf0da"; + inline const char* ICON_COLUMNS = "\uf0db"; + inline const char* ICON_SORT = "\uf0dc"; + inline const char* ICON_SORT_DESC = "\uf0dd"; + inline const char* ICON_SORT_ASC = "\uf0de"; + inline const char* ICON_ENVELOPE = "\uf0e0"; + inline const char* ICON_LINKEDIN = "\uf0e1"; + inline const char* ICON_UNDO = "\uf0e2"; + inline const char* ICON_GAVEL = "\uf0e3"; + inline const char* ICON_TACHOMETER = "\uf0e4"; + inline const char* ICON_COMMENT_O = "\uf0e5"; + inline const char* ICON_COMMENTS_O = "\uf0e6"; + inline const char* ICON_BOLT = "\uf0e7"; + inline const char* ICON_SITEMAP = "\uf0e8"; + inline const char* ICON_UMBRELLA = "\uf0e9"; + inline const char* ICON_CLIPBOARD = "\uf0ea"; + inline const char* ICON_LIGHTBULB_O = "\uf0eb"; + inline const char* ICON_EXCHANGE = "\uf0ec"; + inline const char* ICON_CLOUD_DOWNLOAD = "\uf0ed"; + inline const char* ICON_CLOUD_UPLOAD = "\uf0ee"; + inline const char* ICON_USER_MD = "\uf0f0"; + inline const char* ICON_STETHOSCOPE = "\uf0f1"; + inline const char* ICON_SUITCASE = "\uf0f2"; + inline const char* ICON_BELL_O = "\uf0a2"; + inline const char* ICON_COFFEE = "\uf0f4"; + inline const char* ICON_CUTLERY = "\uf0f5"; + inline const char* ICON_FILE_TEXT_O = "\uf0f6"; + inline const char* ICON_BUILDING_O = "\uf0f7"; + inline const char* ICON_HOSPITAL_O = "\uf0f8"; + inline const char* ICON_AMBULANCE = "\uf0f9"; + inline const char* ICON_MEDKIT = "\uf0fa"; + inline const char* ICON_FIGHTER_JET = "\uf0fb"; + inline const char* ICON_BEER = "\uf0fc"; + inline const char* ICON_H_SQUARE = "\uf0fd"; + inline const char* ICON_PLUS_SQUARE = "\uf0fe"; + inline const char* ICON_ANGLE_DOUBLE_LEFT = "\uf100"; + inline const char* ICON_ANGLE_DOUBLE_RIGHT = "\uf101"; + inline const char* ICON_ANGLE_DOUBLE_UP = "\uf102"; + inline const char* ICON_ANGLE_DOUBLE_DOWN = "\uf103"; + inline const char* ICON_ANGLE_LEFT = "\uf104"; + inline const char* ICON_ANGLE_RIGHT = "\uf105"; + inline const char* ICON_ANGLE_UP = "\uf106"; + inline const char* ICON_ANGLE_DOWN = "\uf107"; + inline const char* ICON_DESKTOP = "\uf108"; + inline const char* ICON_LAPTOP = "\uf109"; + inline const char* ICON_TABLET = "\uf10a"; + inline const char* ICON_MOBILE = "\uf10b"; + inline const char* ICON_CIRCLE_O = "\uf10c"; + inline const char* ICON_QUOTE_LEFT = "\uf10d"; + inline const char* ICON_QUOTE_RIGHT = "\uf10e"; + inline const char* ICON_SPINNER = "\uf110"; + inline const char* ICON_CIRCLE = "\uf111"; + inline const char* ICON_REPLY = "\uf112"; + inline const char* ICON_GITHUB_ALT = "\uf113"; + inline const char* ICON_FOLDER_O = "\uf114"; + inline const char* ICON_FOLDER_OPEN_O = "\uf115"; + inline const char* ICON_SMILE_O = "\uf118"; + inline const char* ICON_FROWN_O = "\uf119"; + inline const char* ICON_MEH_O = "\uf11a"; + inline const char* ICON_GAMEPAD = "\uf11b"; + inline const char* ICON_KEYBOARD_O = "\uf11c"; + inline const char* ICON_FLAG_O = "\uf11d"; + inline const char* ICON_FLAG_CHECKERED = "\uf11e"; + inline const char* ICON_TERMINAL = "\uf120"; + inline const char* ICON_CODE = "\uf121"; + inline const char* ICON_REPLY_ALL = "\uf122"; + inline const char* ICON_STAR_HALF_O = "\uf123"; + inline const char* ICON_LOCATION_ARROW = "\uf124"; + inline const char* ICON_CROP = "\uf125"; + inline const char* ICON_CODE_FORK = "\uf126"; + inline const char* ICON_CHAIN_BROKEN = "\uf127"; + inline const char* ICON_QUESTION = "\uf128"; + inline const char* ICON_INFO = "\uf129"; + inline const char* ICON_EXCLAMATION = "\uf12a"; + inline const char* ICON_SUPERSCRIPT = "\uf12b"; + inline const char* ICON_SUBSCRIPT = "\uf12c"; + inline const char* ICON_ERASER = "\uf12d"; + inline const char* ICON_PUZZLE_PIECE = "\uf12e"; + inline const char* ICON_MICROPHONE = "\uf130"; + inline const char* ICON_MICROPHONE_SLASH = "\uf131"; + inline const char* ICON_SHIELD = "\uf132"; + inline const char* ICON_CALENDAR_O = "\uf133"; + inline const char* ICON_FIRE_EXTINGUISHER = "\uf134"; + inline const char* ICON_ROCKET = "\uf135"; + inline const char* ICON_MAXCDN = "\uf136"; + inline const char* ICON_CHEVRON_CIRCLE_LEFT = "\uf137"; + inline const char* ICON_CHEVRON_CIRCLE_RIGHT = "\uf138"; + inline const char* ICON_CHEVRON_CIRCLE_UP = "\uf139"; + inline const char* ICON_CHEVRON_CIRCLE_DOWN = "\uf13a"; + inline const char* ICON_HTML5 = "\uf13b"; + inline const char* ICON_CSS3 = "\uf13c"; + inline const char* ICON_ANCHOR = "\uf13d"; + inline const char* ICON_UNLOCK_ALT = "\uf13e"; + inline const char* ICON_BULLSEYE = "\uf140"; + inline const char* ICON_ELLIPSIS_H = "\uf141"; + inline const char* ICON_ELLIPSIS_V = "\uf142"; + inline const char* ICON_RSS_SQUARE = "\uf143"; + inline const char* ICON_PLAY_CIRCLE = "\uf144"; + inline const char* ICON_TICKET = "\uf145"; + inline const char* ICON_MINUS_SQUARE = "\uf146"; + inline const char* ICON_MINUS_SQUARE_O = "\uf147"; + inline const char* ICON_LEVEL_UP = "\uf148"; + inline const char* ICON_LEVEL_DOWN = "\uf149"; + inline const char* ICON_CHECK_SQUARE = "\uf14a"; + inline const char* ICON_PENCIL_SQUARE = "\uf14b"; + inline const char* ICON_inlineAL_LINK_SQUARE = "\uf14c"; + inline const char* ICON_SHARE_SQUARE = "\uf14d"; + inline const char* ICON_COMPASS = "\uf14e"; + inline const char* ICON_CARET_SQUARE_O_DOWN = "\uf150"; + inline const char* ICON_CARET_SQUARE_O_UP = "\uf151"; + inline const char* ICON_CARET_SQUARE_O_RIGHT = "\uf152"; + inline const char* ICON_EUR = "\uf153"; + inline const char* ICON_GBP = "\uf154"; + inline const char* ICON_USD = "\uf155"; + inline const char* ICON_INR = "\uf156"; + inline const char* ICON_JPY = "\uf157"; + inline const char* ICON_RUB = "\uf158"; + inline const char* ICON_KRW = "\uf159"; + inline const char* ICON_BTC = "\uf15a"; + inline const char* ICON_FILE = "\uf15b"; + inline const char* ICON_FILE_TEXT = "\uf15c"; + inline const char* ICON_SORT_ALPHA_ASC = "\uf15d"; + inline const char* ICON_SORT_ALPHA_DESC = "\uf15e"; + inline const char* ICON_SORT_AMOUNT_ASC = "\uf160"; + inline const char* ICON_SORT_AMOUNT_DESC = "\uf161"; + inline const char* ICON_SORT_NUMERIC_ASC = "\uf162"; + inline const char* ICON_SORT_NUMERIC_DESC = "\uf163"; + inline const char* ICON_THUMBS_UP = "\uf164"; + inline const char* ICON_THUMBS_DOWN = "\uf165"; + inline const char* ICON_YOUTUBE_SQUARE = "\uf166"; + inline const char* ICON_YOUTUBE = "\uf167"; + inline const char* ICON_XING = "\uf168"; + inline const char* ICON_XING_SQUARE = "\uf169"; + inline const char* ICON_YOUTUBE_PLAY = "\uf16a"; + inline const char* ICON_DROPBOX = "\uf16b"; + inline const char* ICON_STACK_OVERFLOW = "\uf16c"; + inline const char* ICON_INSTAGRAM = "\uf16d"; + inline const char* ICON_FLICKR = "\uf16e"; + inline const char* ICON_ADN = "\uf170"; + inline const char* ICON_BITBUCKET = "\uf171"; + inline const char* ICON_BITBUCKET_SQUARE = "\uf172"; + inline const char* ICON_TUMBLR = "\uf173"; + inline const char* ICON_TUMBLR_SQUARE = "\uf174"; + inline const char* ICON_LONG_ARROW_DOWN = "\uf175"; + inline const char* ICON_LONG_ARROW_UP = "\uf176"; + inline const char* ICON_LONG_ARROW_LEFT = "\uf177"; + inline const char* ICON_LONG_ARROW_RIGHT = "\uf178"; + inline const char* ICON_APPLE = "\uf179"; + inline const char* ICON_PROJECTS = "\uf17a"; + inline const char* ICON_ANDROID = "\uf17b"; + inline const char* ICON_LINUX = "\uf17c"; + inline const char* ICON_DRIBBBLE = "\uf17d"; + inline const char* ICON_SKYPE = "\uf17e"; + inline const char* ICON_FOURSQUARE = "\uf180"; + inline const char* ICON_TRELLO = "\uf181"; + inline const char* ICON_FEMALE = "\uf182"; + inline const char* ICON_MALE = "\uf183"; + inline const char* ICON_GRATIPAY = "\uf184"; + inline const char* ICON_SUN_O = "\uf185"; + inline const char* ICON_MOON_O = "\uf186"; + inline const char* ICON_ARCHIVE = "\uf187"; + inline const char* ICON_BUG = "\uf188"; + inline const char* ICON_VK = "\uf189"; + inline const char* ICON_WEIBO = "\uf18a"; + inline const char* ICON_RENREN = "\uf18b"; + inline const char* ICON_PAGELINES = "\uf18c"; + inline const char* ICON_STACK_EXCHANGE = "\uf18d"; + inline const char* ICON_ARROW_CIRCLE_O_RIGHT = "\uf18e"; + inline const char* ICON_ARROW_CIRCLE_O_LEFT = "\uf190"; + inline const char* ICON_CARET_SQUARE_O_LEFT = "\uf191"; + inline const char* ICON_DOT_CIRCLE_O = "\uf192"; + inline const char* ICON_WHEELCHAIR = "\uf193"; + inline const char* ICON_VIMEO_SQUARE = "\uf194"; + inline const char* ICON_TRY = "\uf195"; + inline const char* ICON_PLUS_SQUARE_O = "\uf196"; + inline const char* ICON_SPACE_SHUTTLE = "\uf197"; + inline const char* ICON_SLACK = "\uf198"; + inline const char* ICON_ENVELOPE_SQUARE = "\uf199"; + inline const char* ICON_WORDPRESS = "\uf19a"; + inline const char* ICON_OPENID = "\uf19b"; + inline const char* ICON_UNIVERSITY = "\uf19c"; + inline const char* ICON_GRADUATION_CAP = "\uf19d"; + inline const char* ICON_YAHOO = "\uf19e"; + inline const char* ICON_GOOGLE = "\uf1a0"; + inline const char* ICON_REDDIT = "\uf1a1"; + inline const char* ICON_REDDIT_SQUARE = "\uf1a2"; + inline const char* ICON_STUMBLEUPON_CIRCLE = "\uf1a3"; + inline const char* ICON_STUMBLEUPON = "\uf1a4"; + inline const char* ICON_DELICIOUS = "\uf1a5"; + inline const char* ICON_DIGG = "\uf1a6"; + inline const char* ICON_DRUPAL = "\uf1a9"; + inline const char* ICON_JOOMLA = "\uf1aa"; + inline const char* ICON_LANGUAGE = "\uf1ab"; + inline const char* ICON_FAX = "\uf1ac"; + inline const char* ICON_BUILDING = "\uf1ad"; + inline const char* ICON_CHILD = "\uf1ae"; + inline const char* ICON_PAW = "\uf1b0"; + inline const char* ICON_SPOON = "\uf1b1"; + inline const char* ICON_CUBE = "\uf1b2"; + inline const char* ICON_CUBES = "\uf1b3"; + inline const char* ICON_BEHANCE = "\uf1b4"; + inline const char* ICON_BEHANCE_SQUARE = "\uf1b5"; + inline const char* ICON_STEAM = "\uf1b6"; + inline const char* ICON_STEAM_SQUARE = "\uf1b7"; + inline const char* ICON_RECYCLE = "\uf1b8"; + inline const char* ICON_CAR = "\uf1b9"; + inline const char* ICON_TAXI = "\uf1ba"; + inline const char* ICON_TREE = "\uf1bb"; + inline const char* ICON_SPOTIFY = "\uf1bc"; + inline const char* ICON_DEVIANTART = "\uf1bd"; + inline const char* ICON_SOUNDCLOUD = "\uf1be"; + inline const char* ICON_DATABASE = "\uf1c0"; + inline const char* ICON_FILE_PDF_O = "\uf1c1"; + inline const char* ICON_FILE_WORD_O = "\uf1c2"; + inline const char* ICON_FILE_EXCEL_O = "\uf1c3"; + inline const char* ICON_FILE_POWERPOINT_O = "\uf1c4"; + inline const char* ICON_SAVE = "\uf0c7"; + inline const char* ICON_FILE_IMAGE_O = "\uf1c5"; + inline const char* ICON_FILE_ARCHIVE_O = "\uf1c6"; + inline const char* ICON_FILE_AUDIO_O = "\uf1c7"; + inline const char* ICON_FILE_VIDEO_O = "\uf1c8"; + inline const char* ICON_FILE_CODE_O = "\uf1c9"; + inline const char* ICON_VINE = "\uf1ca"; + inline const char* ICON_CODEPEN = "\uf1cb"; + inline const char* ICON_JSFIDDLE = "\uf1cc"; + inline const char* ICON_LIFE_RING = "\uf1cd"; + inline const char* ICON_CIRCLE_O_NOTCH = "\uf1ce"; + inline const char* ICON_REBEL = "\uf1d0"; + inline const char* ICON_EMPIRE = "\uf1d1"; + inline const char* ICON_GIT_SQUARE = "\uf1d2"; + inline const char* ICON_GIT = "\uf1d3"; + inline const char* ICON_HACKER_NEWS = "\uf1d4"; + inline const char* ICON_TENCENT_WEIBO = "\uf1d5"; + inline const char* ICON_QQ = "\uf1d6"; + inline const char* ICON_WEIXIN = "\uf1d7"; + inline const char* ICON_PAPER_PLANE = "\uf1d8"; + inline const char* ICON_PAPER_PLANE_O = "\uf1d9"; + inline const char* ICON_HISTORY = "\uf1da"; + inline const char* ICON_CIRCLE_THIN = "\uf1db"; + inline const char* ICON_HEADER = "\uf1dc"; + inline const char* ICON_PARAGRAPH = "\uf1dd"; + inline const char* ICON_SLIDERS = "\uf1de"; + inline const char* ICON_SHARE_ALT = "\uf1e0"; + inline const char* ICON_SHARE_ALT_SQUARE = "\uf1e1"; + inline const char* ICON_BOMB = "\uf1e2"; + inline const char* ICON_FUTBOL_O = "\uf1e3"; + inline const char* ICON_TTY = "\uf1e4"; + inline const char* ICON_BINOCULARS = "\uf1e5"; + inline const char* ICON_PLUG = "\uf1e6"; + inline const char* ICON_SLIDESHARE = "\uf1e7"; + inline const char* ICON_TWITCH = "\uf1e8"; + inline const char* ICON_YELP = "\uf1e9"; + inline const char* ICON_NEWSPAPER_O = "\uf1ea"; + inline const char* ICON_WIFI = "\uf1eb"; + inline const char* ICON_CALCULATOR = "\uf1ec"; + inline const char* ICON_PAYPAL = "\uf1ed"; + inline const char* ICON_GOOGLE_WALLET = "\uf1ee"; + inline const char* ICON_CC_VISA = "\uf1f0"; + inline const char* ICON_CC_MASTERCARD = "\uf1f1"; + inline const char* ICON_CC_DISCOVER = "\uf1f2"; + inline const char* ICON_CC_AMEX = "\uf1f3"; + inline const char* ICON_CC_PAYPAL = "\uf1f4"; + inline const char* ICON_CC_STRIPE = "\uf1f5"; + inline const char* ICON_BELL_SLASH = "\uf1f6"; + inline const char* ICON_BELL_SLASH_O = "\uf1f7"; + inline const char* ICON_TRASH = "\uf1f8"; + inline const char* ICON_COPYRIGHT = "\uf1f9"; + inline const char* ICON_AT = "\uf1fa"; + inline const char* ICON_EYEDROPPER = "\uf1fb"; + inline const char* ICON_PAINT_BRUSH = "\uf1fc"; + inline const char* ICON_BIRTHDAY_CAKE = "\uf1fd"; + inline const char* ICON_AREA_CHART = "\uf1fe"; + inline const char* ICON_PIE_CHART = "\uf200"; + inline const char* ICON_LINE_CHART = "\uf201"; + inline const char* ICON_LASTFM = "\uf202"; + inline const char* ICON_LASTFM_SQUARE = "\uf203"; + inline const char* ICON_TOGGLE_OFF = "\uf204"; + inline const char* ICON_TOGGLE_ON = "\uf205"; + inline const char* ICON_BICYCLE = "\uf206"; + inline const char* ICON_BUS = "\uf207"; + inline const char* ICON_IOXHOST = "\uf208"; + inline const char* ICON_ANGELLIST = "\uf209"; + inline const char* ICON_CC = "\uf20a"; + inline const char* ICON_ILS = "\uf20b"; + inline const char* ICON_MEANPATH = "\uf20c"; + inline const char* ICON_BUYSELLADS = "\uf20d"; + inline const char* ICON_CONNECTDEVELOP = "\uf20e"; + inline const char* ICON_DASHCUBE = "\uf210"; + inline const char* ICON_FORUMBEE = "\uf211"; + inline const char* ICON_LEANPUB = "\uf212"; + inline const char* ICON_SELLSY = "\uf213"; + inline const char* ICON_SHIRTSINBULK = "\uf214"; + inline const char* ICON_SIMPLYBUILT = "\uf215"; + inline const char* ICON_SKYATLAS = "\uf216"; + inline const char* ICON_CART_PLUS = "\uf217"; + inline const char* ICON_CART_ARROW_DOWN = "\uf218"; + inline const char* ICON_DIAMOND = "\uf219"; + inline const char* ICON_SHIP = "\uf21a"; + inline const char* ICON_USER_SECRET = "\uf21b"; + inline const char* ICON_MOTORCYCLE = "\uf21c"; + inline const char* ICON_STREET_VIEW = "\uf21d"; + inline const char* ICON_HEARTBEAT = "\uf21e"; + inline const char* ICON_VENUS = "\uf221"; + inline const char* ICON_MARS = "\uf222"; + inline const char* ICON_MERCURY = "\uf223"; + inline const char* ICON_TRANSGENDER = "\uf224"; + inline const char* ICON_TRANSGENDER_ALT = "\uf225"; + inline const char* ICON_VENUS_DOUBLE = "\uf226"; + inline const char* ICON_MARS_DOUBLE = "\uf227"; + inline const char* ICON_VENUS_MARS = "\uf228"; + inline const char* ICON_MARS_STROKE = "\uf229"; + inline const char* ICON_MARS_STROKE_V = "\uf22a"; + inline const char* ICON_MARS_STROKE_H = "\uf22b"; + inline const char* ICON_NEUTER = "\uf22c"; + inline const char* ICON_GENDERLESS = "\uf22d"; + inline const char* ICON_FACEBOOK_OFFICIAL = "\uf230"; + inline const char* ICON_PINTEREST_P = "\uf231"; + inline const char* ICON_WHATSAPP = "\uf232"; + inline const char* ICON_SERVER = "\uf233"; + inline const char* ICON_USER_PLUS = "\uf234"; + inline const char* ICON_USER_TIMES = "\uf235"; + inline const char* ICON_BED = "\uf236"; + inline const char* ICON_VIACOIN = "\uf237"; + inline const char* ICON_TRAIN = "\uf238"; + inline const char* ICON_SUBWAY = "\uf239"; + inline const char* ICON_MEDIUM = "\uf23a"; + inline const char* ICON_MEDIUM_SQUARE = "\uf2f8"; + inline const char* ICON_Y_COMBINATOR = "\uf23b"; + inline const char* ICON_OPTIN_MONSTER = "\uf23c"; + inline const char* ICON_OPENCART = "\uf23d"; + inline const char* ICON_EXPEDITEDSSL = "\uf23e"; + inline const char* ICON_BATTERY_FULL = "\uf240"; + inline const char* ICON_BATTERY_THREE_QUARTERS = "\uf241"; + inline const char* ICON_BATTERY_HALF = "\uf242"; + inline const char* ICON_BATTERY_QUARTER = "\uf243"; + inline const char* ICON_BATTERY_EMPTY = "\uf244"; + inline const char* ICON_MOUSE_POINTER = "\uf245"; + inline const char* ICON_I_CURSOR = "\uf246"; + inline const char* ICON_OBJECT_GROUP = "\uf247"; + inline const char* ICON_OBJECT_UNGROUP = "\uf248"; + inline const char* ICON_STICKY_NOTE = "\uf249"; + inline const char* ICON_STICKY_NOTE_O = "\uf24a"; + inline const char* ICON_CC_JCB = "\uf24b"; + inline const char* ICON_CC_DINERS_CLUB = "\uf24c"; + inline const char* ICON_CLONE = "\uf24d"; + inline const char* ICON_BALANCE_SCALE = "\uf24e"; + inline const char* ICON_HOURGLASS_O = "\uf250"; + inline const char* ICON_HOURGLASS_START = "\uf251"; + inline const char* ICON_HOURGLASS_HALF = "\uf252"; + inline const char* ICON_HOURGLASS_END = "\uf253"; + inline const char* ICON_HOURGLASS = "\uf254"; + inline const char* ICON_HAND_ROCK_O = "\uf255"; + inline const char* ICON_HAND_PAPER_O = "\uf256"; + inline const char* ICON_HAND_SCISSORS_O = "\uf257"; + inline const char* ICON_HAND_LIZARD_O = "\uf258"; + inline const char* ICON_HAND_SPOCK_O = "\uf259"; + inline const char* ICON_HAND_POINTER_O = "\uf25a"; + inline const char* ICON_HAND_PEACE_O = "\uf25b"; + inline const char* ICON_TRADEMARK = "\uf25c"; + inline const char* ICON_REGISTERED = "\uf25d"; + inline const char* ICON_CREATIVE_COMMONS = "\uf25e"; + inline const char* ICON_GG = "\uf260"; + inline const char* ICON_GG_CIRCLE = "\uf261"; + inline const char* ICON_TRIPADVISOR = "\uf262"; + inline const char* ICON_ODNOKLASSNIKI = "\uf263"; + inline const char* ICON_ODNOKLASSNIKI_SQUARE = "\uf264"; + inline const char* ICON_GET_POCKET = "\uf265"; + inline const char* ICON_WIKIPEDIA_W = "\uf266"; + inline const char* ICON_SAFARI = "\uf267"; + inline const char* ICON_CHROME = "\uf268"; + inline const char* ICON_FIREFOX = "\uf269"; + inline const char* ICON_OPERA = "\uf26a"; + inline const char* ICON_INTERNET_EXPLORER = "\uf26b"; + inline const char* ICON_TELEVISION = "\uf26c"; + inline const char* ICON_CONTAO = "\uf26d"; + inline const char* ICON_500PX = "\uf26e"; + inline const char* ICON_AMAZON = "\uf270"; + inline const char* ICON_CALENDAR_PLUS_O = "\uf271"; + inline const char* ICON_CALENDAR_MINUS_O = "\uf272"; + inline const char* ICON_CALENDAR_TIMES_O = "\uf273"; + inline const char* ICON_CALENDAR_CHECK_O = "\uf274"; + inline const char* ICON_INDUSTRY = "\uf275"; + inline const char* ICON_MAP_PIN = "\uf276"; + inline const char* ICON_MAP_SIGNS = "\uf277"; + inline const char* ICON_MAP_O = "\uf278"; + inline const char* ICON_MAP = "\uf279"; + inline const char* ICON_COMMENTING = "\uf27a"; + inline const char* ICON_COMMENTING_O = "\uf27b"; + inline const char* ICON_HOUZZ = "\uf27c"; + inline const char* ICON_VIMEO = "\uf27d"; + inline const char* ICON_BLACK_TIE = "\uf27e"; + inline const char* ICON_FONTICONS = "\uf280"; + inline const char* ICON_REDDIT_ALIEN = "\uf281"; + inline const char* ICON_EDGE = "\uf282"; + inline const char* ICON_CREDIT_CARD_ALT = "\uf283"; + inline const char* ICON_CODIEPIE = "\uf284"; + inline const char* ICON_MODX = "\uf285"; + inline const char* ICON_FORT_AWESOME = "\uf286"; + inline const char* ICON_USB = "\uf287"; + inline const char* ICON_PRODUCT_HUNT = "\uf288"; + inline const char* ICON_MIXCLOUD = "\uf289"; + inline const char* ICON_SCRIBD = "\uf28a"; + inline const char* ICON_PAUSE_CIRCLE = "\uf28b"; + inline const char* ICON_PAUSE_CIRCLE_O = "\uf28c"; + inline const char* ICON_STOP_CIRCLE = "\uf28d"; + inline const char* ICON_STOP_CIRCLE_O = "\uf28e"; + inline const char* ICON_SHOPPING_BAG = "\uf290"; + inline const char* ICON_SHOPPING_BASKET = "\uf291"; + inline const char* ICON_HASHTAG = "\uf292"; + inline const char* ICON_BLUETOOTH = "\uf293"; + inline const char* ICON_BLUETOOTH_B = "\uf294"; + inline const char* ICON_PERCENT = "\uf295"; + inline const char* ICON_GITLAB = "\uf296"; + inline const char* ICON_WPBEGINNER = "\uf297"; + inline const char* ICON_WPFORMS = "\uf298"; + inline const char* ICON_ENVIRA = "\uf299"; + inline const char* ICON_UNIVERSAL_ACCESS = "\uf29a"; + inline const char* ICON_WHEELCHAIR_ALT = "\uf29b"; + inline const char* ICON_QUESTION_CIRCLE_O = "\uf29c"; + inline const char* ICON_BLIND = "\uf29d"; + inline const char* ICON_AUDIO_DESCRIPTION = "\uf29e"; + inline const char* ICON_VOLUME_CONTROL_PHONE = "\uf2a0"; + inline const char* ICON_BRAILLE = "\uf2a1"; + inline const char* ICON_ASSISTIVE_LISTENING_SYSTEMS = "\uf2a2"; + inline const char* ICON_AMERICAN_SIGN_LANGUAGE_INTERPRETING = "\uf2a3"; + inline const char* ICON_DEAF = "\uf2a4"; + inline const char* ICON_GLIDE = "\uf2a5"; + inline const char* ICON_GLIDE_G = "\uf2a6"; + inline const char* ICON_SIGN_LANGUAGE = "\uf2a7"; + inline const char* ICON_LOW_VISION = "\uf2a8"; + inline const char* ICON_VIADEO = "\uf2a9"; + inline const char* ICON_VIADEO_SQUARE = "\uf2aa"; + inline const char* ICON_SNAPCHAT = "\uf2ab"; + inline const char* ICON_SNAPCHAT_GHOST = "\uf2ac"; + inline const char* ICON_SNAPCHAT_SQUARE = "\uf2ad"; + inline const char* ICON_FIRST_ORDER = "\uf2b0"; + inline const char* ICON_YOAST = "\uf2b1"; + inline const char* ICON_THEMEISLE = "\uf2b2"; + inline const char* ICON_GOOGLE_PLUS_OFFICIAL = "\uf2b3"; + inline const char* ICON_FONT_AWESOME = "\uf2b4"; + inline const char* ICON_HANDSHAKE_O = "\uf2b5"; + inline const char* ICON_ENVELOPE_OPEN = "\uf2b6"; + inline const char* ICON_ENVELOPE_OPEN_O = "\uf2b7"; + inline const char* ICON_LINODE = "\uf2b8"; + inline const char* ICON_ADDRESS_BOOK = "\uf2b9"; + inline const char* ICON_ADDRESS_BOOK_O = "\uf2ba"; + inline const char* ICON_ADDRESS_CARD = "\uf2bb"; + inline const char* ICON_ADDRESS_CARD_O = "\uf2bc"; + inline const char* ICON_USER_CIRCLE = "\uf2bd"; + inline const char* ICON_USER_CIRCLE_O = "\uf2be"; + inline const char* ICON_USER_O = "\uf2c0"; + inline const char* ICON_ID_BADGE = "\uf2c1"; + inline const char* ICON_ID_CARD = "\uf2c2"; + inline const char* ICON_ID_CARD_O = "\uf2c3"; + inline const char* ICON_QUORA = "\uf2c4"; + inline const char* ICON_FREE_CODE_CAMP = "\uf2c5"; + inline const char* ICON_TELEGRAM = "\uf2c6"; + inline const char* ICON_THERMOMETER_FULL = "\uf2c7"; + inline const char* ICON_THERMOMETER_THREE_QUARTERS = "\uf2c8"; + inline const char* ICON_THERMOMETER_HALF = "\uf2c9"; + inline const char* ICON_THERMOMETER_QUARTER = "\uf2ca"; + inline const char* ICON_THERMOMETER_EMPTY = "\uf2cb"; + inline const char* ICON_SHOWER = "\uf2cc"; + inline const char* ICON_BATH = "\uf2cd"; + inline const char* ICON_PODCAST = "\uf2ce"; + inline const char* ICON_WINDOW_MAXIMIZE = "\uf2d0"; + inline const char* ICON_WINDOW_MINIMIZE = "\uf2d1"; + inline const char* ICON_WINDOW_RESTORE = "\uf2d2"; + inline const char* ICON_WINDOW_CLOSE = "\uf2d3"; + inline const char* ICON_WINDOW_CLOSE_O = "\uf2d4"; + inline const char* ICON_BANDCAMP = "\uf2d5"; + inline const char* ICON_GRAV = "\uf2d6"; + inline const char* ICON_ETSY = "\uf2d7"; + inline const char* ICON_IMDB = "\uf2d8"; + inline const char* ICON_RAVELRY = "\uf2d9"; + inline const char* ICON_EERCAST = "\uf2da"; + inline const char* ICON_MICROCHIP = "\uf2db"; + inline const char* ICON_SNOWFLAKE_O = "\uf2dc"; + inline const char* ICON_SUPERPOWERS = "\uf2dd"; + inline const char* ICON_WPEXPLORER = "\uf2de"; + inline const char* ICON_MEETUP = "\uf2e0"; + inline const char* ICON_MASTODON = "\uf2e1"; + inline const char* ICON_MASTODON_ALT = "\uf2e2"; + inline const char* ICON_FORK_AWESOME = "\uf2e3"; + inline const char* ICON_PEERTUBE = "\uf2e4"; + inline const char* ICON_DIASPORA = "\uf2e5"; + inline const char* ICON_FRIENDICA = "\uf2e6"; + inline const char* ICON_GNU_SOCIAL = "\uf2e7"; + inline const char* ICON_LIBERAPAY_SQUARE = "\uf2e8"; + inline const char* ICON_LIBERAPAY = "\uf2e9"; + inline const char* ICON_SCUTTLEBUTT = "\uf2ea"; + inline const char* ICON_HUBZILLA = "\uf2eb"; + inline const char* ICON_SOCIAL_HOME = "\uf2ec"; + inline const char* ICON_ARTSTATION = "\uf2ed"; + inline const char* ICON_DISCORD = "\uf2ee"; + inline const char* ICON_DISCORD_ALT = "\uf2ef"; + inline const char* ICON_PATREON = "\uf2f0"; + inline const char* ICON_SNOWDRIFT = "\uf2f1"; + inline const char* ICON_ACTIVITYPUB = "\uf2f2"; + inline const char* ICON_ETHEREUM = "\uf2f3"; + inline const char* ICON_KEYBASE = "\uf2f4"; + inline const char* ICON_SHAARLI = "\uf2f5"; + inline const char* ICON_SHAARLI_O = "\uf2f6"; + inline const char* ICON_KEY_MODERN = "\uf2f7"; + inline const char* ICON_XMPP = "\uf2f9"; + inline const char* ICON_ARCHIVE_ORG = "\uf2fc"; + inline const char* ICON_FREEDOMBOX = "\uf2fd"; + inline const char* ICON_FACEBOOK_MESSENGER = "\uf2fe"; + inline const char* ICON_DEBIAN = "\uf2ff"; + inline const char* ICON_MASTODON_SQUARE = "\uf300"; + inline const char* ICON_TIPEEE = "\uf301"; + inline const char* ICON_REACT = "\uf302"; + inline const char* ICON_DOGMAZIC = "\uf303"; + inline const char* ICON_NEXTCLOUD = "\uf306"; + inline const char* ICON_NEXTCLOUD_SQUARE = "\uf307"; +} // namespace Icon diff --git a/src/try_engine/gui/style/style.hpp b/src/try_engine/gui/style/style.hpp new file mode 100644 index 0000000..49d3090 --- /dev/null +++ b/src/try_engine/gui/style/style.hpp @@ -0,0 +1,82 @@ +#pragma once + +#include "imgui.h" + +#include "icons.hpp" +#include "fonts.hpp" + +namespace try_engine::style +{ + inline void init() + { + /* use this - https://www.unknowncheats.me/forum/c-and-c-/189635-imgui-style-settings.html */ + ImGuiStyle& st = ImGui::GetStyle(); + + st.WindowPadding = ImVec2(5.0f, 5.0f); + st.WindowRounding = 0.0f; + st.FramePadding = ImVec2(5.0f, 5.0f); + st.FrameRounding = 0.0f; + st.ItemSpacing = ImVec2(8.0f, 8.0f); + st.ItemInnerSpacing = ImVec2(8.0f, 6.0f); + st.IndentSpacing = 25.0f; + st.ScrollbarSize = 12.0f; + st.ScrollbarRounding = 0.0f; + st.GrabMinSize = 5.0f; + st.GrabRounding = 0.0f; + st.TabRounding = 0.0f; + st.WindowBorderSize = 0.0f; + st.ChildRounding = 0.0f; + st.PopupRounding = 0.0f; + st.PopupBorderSize = 0.0f; + st.WindowMenuButtonPosition = ImGuiDir_None; + + /* tab */ + st.Colors[ImGuiCol_Tab] = ImVec4(0.10f, 0.09f, 0.12f, 1.00f); + st.Colors[ImGuiCol_TabHovered] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + st.Colors[ImGuiCol_TabActive] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + + /* title */ + st.Colors[ImGuiCol_TitleBg] = ImVec4(0.10f, 0.09f, 0.12f, 1.00f); + st.Colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.10f, 0.09f, 0.12f, 1.00f); + st.Colors[ImGuiCol_TitleBgActive] = ImVec4(0.07f, 0.07f, 0.09f, 1.00f); + + st.Colors[ImGuiCol_Text] = ImVec4(0.80f, 0.80f, 0.83f, 1.00f); + st.Colors[ImGuiCol_TextDisabled] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + st.Colors[ImGuiCol_WindowBg] = ImVec4(0.06f, 0.05f, 0.07f, 1.00f); + st.Colors[ImGuiCol_ChildBg] = ImVec4(0.06f, 0.05f, 0.07f, 1.00f); + st.Colors[ImGuiCol_PopupBg] = ImVec4(0.07f, 0.07f, 0.09f, 1.00f); + st.Colors[ImGuiCol_Border] = ImVec4(0.80f, 0.80f, 0.83f, 0.88f); + st.Colors[ImGuiCol_BorderShadow] = ImVec4(0.92f, 0.91f, 0.88f, 0.00f); + st.Colors[ImGuiCol_FrameBg] = ImVec4(0.10f, 0.09f, 0.12f, 1.00f); + st.Colors[ImGuiCol_FrameBgHovered] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + st.Colors[ImGuiCol_FrameBgActive] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + st.Colors[ImGuiCol_MenuBarBg] = ImVec4(0.10f, 0.09f, 0.12f, 1.00f); + st.Colors[ImGuiCol_ScrollbarBg] = ImVec4(0.10f, 0.09f, 0.12f, 1.00f); + st.Colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.80f, 0.80f, 0.83f, 0.31f); + st.Colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + st.Colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.06f, 0.05f, 0.07f, 1.00f); + st.Colors[ImGuiCol_CheckMark] = ImVec4(0.80f, 0.80f, 0.83f, 0.31f); + st.Colors[ImGuiCol_SliderGrab] = ImVec4(0.80f, 0.80f, 0.83f, 0.31f); + st.Colors[ImGuiCol_SliderGrabActive] = ImVec4(0.06f, 0.05f, 0.07f, 1.00f); + st.Colors[ImGuiCol_Button] = ImVec4(0.10f, 0.09f, 0.12f, 1.00f); + st.Colors[ImGuiCol_ButtonHovered] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + st.Colors[ImGuiCol_ButtonActive] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + st.Colors[ImGuiCol_Header] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + st.Colors[ImGuiCol_HeaderActive] = ImVec4(0.06f, 0.05f, 0.07f, 1.00f); + st.Colors[ImGuiCol_Separator] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + st.Colors[ImGuiCol_SeparatorHovered] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + st.Colors[ImGuiCol_SeparatorActive] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + st.Colors[ImGuiCol_ResizeGrip] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + st.Colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + st.Colors[ImGuiCol_ResizeGripActive] = ImVec4(0.06f, 0.05f, 0.07f, 1.00f); + st.Colors[ImGuiCol_PlotLines] = ImVec4(0.40f, 0.39f, 0.38f, 0.63f); + st.Colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.25f, 1.00f, 0.00f, 1.00f); + st.Colors[ImGuiCol_PlotHistogram] = ImVec4(0.40f, 0.39f, 0.38f, 0.63f); + st.Colors[ImGuiCol_PlotHistogramHovered] = ImVec4(0.25f, 1.00f, 0.00f, 1.00f); + st.Colors[ImGuiCol_TextSelectedBg] = ImVec4(0.25f, 1.00f, 0.00f, 0.43f); + st.Colors[ImGuiCol_ModalWindowDimBg] = ImVec4(1.00f, 0.98f, 0.95f, 0.73f); + st.Colors[ImGuiCol_HeaderHovered] = ImVec4(0.13f, 0.12f, 0.15f, 1.00f); + + fonts::init(); + }; +}; diff --git a/src/try_engine/layer/layer.hpp b/src/try_engine/layer/layer.hpp new file mode 100644 index 0000000..8c8ebfc --- /dev/null +++ b/src/try_engine/layer/layer.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include "try_engine/utils/include.hpp" +#include "try_engine/event/system_event/event.hpp" + +namespace try_engine +{ + class layer + { + using time = time::timestep; + + public: + layer(const std::string& name_) : name { name_ } {}; + virtual ~layer() = default; + + layer(const layer&) = delete; + layer(layer&) = delete; + + public: + virtual void on_attach() {}; + virtual void on_detach() {}; + virtual void gui_render() {}; + virtual void on_event(system_event::event&) {}; + virtual void on_event(std::any, std::any) {}; + virtual void on_update(time) = 0; + const std::string& get_name() const { return name; }; + + protected: + std::string name; + }; +} + diff --git a/src/try_engine/meson.build b/src/try_engine/meson.build new file mode 100644 index 0000000..3f1cc93 --- /dev/null +++ b/src/try_engine/meson.build @@ -0,0 +1,32 @@ +headers = [ + 'application/application.hpp', + 'window/window.hpp', + 'window/graphic_context/graphic_context.hpp', + 'renderer/renderer.hpp', + 'renderer/texture/texture.hpp', + 'gui/gui.hpp', +] + +sources = [ + 'application/application.cpp', + 'window/window.cpp', + 'window/graphic_context/graphic_context.cpp', + 'renderer/renderer.cpp', + 'renderer/texture/texture.cpp', + 'gui/gui.cpp', +] + +lib = library( + 'try_engine', + include_directories : inc, + sources: [headers, sources], + dependencies : deps, + cpp_args: args +) + +try_engine_dep = declare_dependency( + include_directories: inc, + link_with: lib, +) + +deps += try_engine_dep diff --git a/src/try_engine/renderer/renderer.cpp b/src/try_engine/renderer/renderer.cpp new file mode 100644 index 0000000..1ea7107 --- /dev/null +++ b/src/try_engine/renderer/renderer.cpp @@ -0,0 +1,14 @@ +#include "renderer.hpp" + +namespace try_engine +{ + void renderer::set_color(const glm::vec4& color) + { + glClearColor(color.r, color.g, color.b, color.a); + } + + void renderer::clear() + { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + } +} diff --git a/src/try_engine/renderer/renderer.hpp b/src/try_engine/renderer/renderer.hpp new file mode 100644 index 0000000..d2dc5d5 --- /dev/null +++ b/src/try_engine/renderer/renderer.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "try_engine/utils/include.hpp" + +/* +renderer - некий объект отрисовки и разукраски всей сцены. +Т.е. в нем все компоненты, которые нужны для создания на сцене чего-либо: +шейдера, шейдерные программы, буфера вершин, вспомогательные функции установки цвета и его очистки и т.п. + +Может использоваться в разных частях программы, где нужно что-то создать и отрисовать или перекрасить и удалить. +Относимся к этому, как к набору кисточек и ластиков при помощи которых что-то делаем на экране, рисуем или стираем. +*/ + +namespace try_engine +{ + class renderer + { + public: + static void set_color(const glm::vec4&); + static void clear(); + }; +} diff --git a/src/try_engine/renderer/texture/texture.cpp b/src/try_engine/renderer/texture/texture.cpp new file mode 100644 index 0000000..427b7ae --- /dev/null +++ b/src/try_engine/renderer/texture/texture.cpp @@ -0,0 +1,27 @@ +#include "texture.hpp" + +namespace try_engine +{ + texture::~texture() + { + glDeleteTextures(1, &texture_id); + } + + void texture::make() + { + if (!texture_id) + { + glGenTextures(1, &texture_id); + glBindTexture(GL_TEXTURE_2D, texture_id); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + } + } + + void texture::draw(ImVec2 pos, ImVec2 size) + { + // ImGui::Image(reinterpret_cast(static_cast(texture)), ImVec2(pos.x + 100, pos.y + 100)); + ImGui::GetWindowDrawList()->AddImage(reinterpret_cast(static_cast(texture_id)), pos, size); + } +} diff --git a/src/try_engine/renderer/texture/texture.hpp b/src/try_engine/renderer/texture/texture.hpp new file mode 100644 index 0000000..b83fdb1 --- /dev/null +++ b/src/try_engine/renderer/texture/texture.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "try_engine/utils/include.hpp" + +namespace try_engine +{ + class texture + { + public: + texture() = default; + ~texture(); + + public: + template + void bind(Image& image) + { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.cols, image.rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, image.data); + } + + void draw(ImVec2 pos, ImVec2 size); + void make(); + + private: + GLuint texture_id = 0; + }; +} diff --git a/src/try_engine/try_engine.hpp b/src/try_engine/try_engine.hpp new file mode 100644 index 0000000..38579db --- /dev/null +++ b/src/try_engine/try_engine.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "try_engine/gui/style/style.hpp" + +#include "try_engine/application/application.hpp" + +#include "try_engine/event/event_classificator.hpp" +#include "try_engine/event/system_event/event.hpp" +#include "try_engine/event/app_event/event.hpp" + +#include "try_engine/renderer/renderer.hpp" +#include "try_engine/renderer/texture/texture.hpp" + +#include "try_engine/utils/timestap.hpp" +#include "try_engine/utils/define.hpp" diff --git a/src/try_engine/utils/define.hpp b/src/try_engine/utils/define.hpp new file mode 100644 index 0000000..7dc9a12 --- /dev/null +++ b/src/try_engine/utils/define.hpp @@ -0,0 +1,65 @@ +#pragma once + +#define BIT(x)\ + (1 << x) + +#define EVENT_CLASS_TYPE_FN(type)\ + virtual std::string get_name() const override { return type; } + +#define BIND_EVENT_FN(app, x)\ + std::bind(&app::x, this, std::placeholders::_1) + +#define BASE_TYPE_DEFINE()\ + using time = try_engine::time::timestep;\ + using event_manager = try_engine::app_event::event;\ + using system_event = try_engine::system_event::event + +#define BASE_WINDOW_FLAGS()\ + if (f.no_titlebar) window_flags |= ImGuiWindowFlags_NoTitleBar;\ + if (f.no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar;\ + if (!f.no_menu) window_flags |= ImGuiWindowFlags_MenuBar;\ + if (f.no_move) window_flags |= ImGuiWindowFlags_NoMove;\ + if (f.no_resize) window_flags |= ImGuiWindowFlags_NoResize;\ + if (f.no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse;\ + if (f.no_nav) window_flags |= ImGuiWindowFlags_NoNav;\ + if (f.no_background) window_flags |= ImGuiWindowFlags_NoBackground;\ + if (f.no_bring_to_front) window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus + +#define SET_EVENT_MANAGER_IMPL()\ + void set_event_manager(event_manager* em_)\ + {\ + em = em_;\ + em->set_event_callback(this);\ + } + +#define BASE_OVERIDE_IMPL()\ + void on_attach() override;\ + void on_detach() override;\ + void gui_render() override;\ + void on_event(system_event& e) override;\ + void on_event(std::any type, std::any value) override;\ + void on_update(time t) override + +#define CONSTRUCT_IMPL(name)\ + name() : try_engine::layer { ""#name"" } { BASE_WINDOW_FLAGS(); };\ + ~name() = default + +#define FLAGS_STRUCT_DEFINED()\ + struct flags\ + {\ + bool p_open = false;\ + bool no_titlebar = true;\ + bool no_scrollbar = true;\ + bool no_menu = true;\ + bool no_move = true;\ + bool no_resize = true;\ + bool no_collapse = true;\ + bool no_nav = false;\ + bool no_background = false;\ + bool no_bring_to_front = false;\ + bool no_docking = true;\ + } f;\ + ImGuiWindowFlags window_flags = 0 + +#define BEGIN_IMGUI_WIN() if (!ImGui::Begin(name.c_str(), &f.p_open, window_flags)) ImGui::End() +#define END_IMGUI_WIN() ImGui::End() diff --git a/src/try_engine/utils/include.hpp b/src/try_engine/utils/include.hpp new file mode 100644 index 0000000..33115ad --- /dev/null +++ b/src/try_engine/utils/include.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#define GLFW_INCLUDE_NONE +#include "GLFW/glfw3.h" +#include "glad.h" +#include "glm/glm.hpp" +#include "logger/logger.hpp" +#include "imgui.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_opengl3.h" + +#include "timestap.hpp" + +template +using event_callback = std::function; + +#include "nlohmann/json.hpp" +using JSON = nlohmann::json; + +namespace try_engine::time +{ + inline timestep get_time() + { + static float frame_time = 0.0f; + float t = (float)glfwGetTime(); + timestep ts = t - frame_time; + frame_time = t; + + return ts; + } +} diff --git a/src/try_engine/utils/timestap.hpp b/src/try_engine/utils/timestap.hpp new file mode 100644 index 0000000..12e5ccb --- /dev/null +++ b/src/try_engine/utils/timestap.hpp @@ -0,0 +1,22 @@ +#pragma once + +namespace try_engine::time +{ + template + class timestep + { + public: + timestep(Time data_ = 0.0f) : data { data_ } {} + + operator Time() const { return data; } + + Time get_seconds() const { return data; } + Time get_milliseconds() const { return data * 1000.0f; } + + private: + Time data; + }; +} + + + diff --git a/src/try_engine/window/graphic_context/graphic_context.cpp b/src/try_engine/window/graphic_context/graphic_context.cpp new file mode 100644 index 0000000..9b0e04e --- /dev/null +++ b/src/try_engine/window/graphic_context/graphic_context.cpp @@ -0,0 +1,27 @@ +#include "graphic_context.hpp" + +namespace try_engine +{ + graphic_context::graphic_context(GLFWwindow* w) : win { w } {} + + void graphic_context::init() + { + glfwMakeContextCurrent(win); + int status = gladLoadGLLoader((GLADloadproc)glfwGetProcAddress); + + hack::log(": ")("Glad loader status", status == 1 ? "true" : "false"); + hack::log(": ")("OpenGL Info"); + hack::log(": ")(" Vendor", glGetString(GL_VENDOR)); + hack::log(": ")(" Renderer", glGetString(GL_RENDERER)); + hack::log(": ")(" Version", glGetString(GL_VERSION)); + hack::log(": ")(" GLSL Version", glGetString(GL_SHADING_LANGUAGE_VERSION)); + + glfwSwapInterval(1); + } + + void graphic_context::swap_buffers() + { + glfwSwapBuffers(win); + } +} + diff --git a/src/try_engine/window/graphic_context/graphic_context.hpp b/src/try_engine/window/graphic_context/graphic_context.hpp new file mode 100644 index 0000000..69e7366 --- /dev/null +++ b/src/try_engine/window/graphic_context/graphic_context.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "try_engine/utils/include.hpp" + +namespace try_engine +{ + class graphic_context + { + public: + graphic_context(GLFWwindow*); + + void init(); + void swap_buffers(); + + private: + GLFWwindow* win; + }; +} diff --git a/src/try_engine/window/window.cpp b/src/try_engine/window/window.cpp new file mode 100644 index 0000000..a7b4c18 --- /dev/null +++ b/src/try_engine/window/window.cpp @@ -0,0 +1,158 @@ +#include "window.hpp" + +#include "renderer/renderer.hpp" +#include "event/system_event/category/key_event.hpp" +#include "event/system_event/category/window_event.hpp" + +namespace try_engine +{ + window::window(std::string app_name) + { + if (!glfwInit()) + exit(EXIT_FAILURE); + + win_data.title = app_name; + + set_hint(); + set_window(); + set_context(); + set_pointer(); + set_key_callback(); + set_window_callback(); + + hack::log(": ")("Creating window", win_data.title); + hack::log(" = ")("w", win_data.width); + hack::log(" = ")("h", win_data.height); + } + + window::~window() + { + glfwDestroyWindow(win); + glfwTerminate(); + hack::warn(": ")("destroy", "window", win_data.title); + } + + void window::set_hint() + { + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); + glfwWindowHint(GLFW_SAMPLES, 4); + } + + void window::set_window() + { + win = glfwCreateWindow( + glfwGetVideoMode(glfwGetPrimaryMonitor())->width, + glfwGetVideoMode(glfwGetPrimaryMonitor())->height, + win_data.title.c_str(), + nullptr, nullptr + ); + + if(win == NULL) + { + hack::error()("Failed to create GLFW window"); + glfwTerminate(); + exit(EXIT_FAILURE); + } + + glfwGetWindowSize(win, &win_data.width, &win_data.height); + } + + void window::set_context() + { + context = std::make_unique(win); + context->init(); + } + + void window::set_pointer() + { + glfwSetWindowUserPointer(win, &win_data); + } + + void window::set_event_callback(const event_callback& cb) + { + win_data.callback = cb; + } + + GLFWwindow* window::glfw_window() const + { + return win; + } + + int window::width() const + { + return win_data.width; + } + + int window::height() const + { + return win_data.height; + } + + void window::update() + { + glfwPollEvents(); + context->swap_buffers(); + } + + void window::clear() const + { + renderer::set_color({ 0.1f, 0.1f, 0.1f, 1 }); + renderer::clear(); + } + + void window::set_key_callback() + { + glfwSetKeyCallback(win, [](GLFWwindow* w, int key, int scancode, int action, int mods) + { + auto data = static_cast(glfwGetWindowUserPointer(w)); + + switch (action) + { + case GLFW_PRESS: + { + system_event::key_pressed_event e { key }; + data->callback(e); + break; + } + case GLFW_RELEASE: + { + system_event::key_released_event e { key }; + data->callback(e); + break; + } + } + }); + } + + void window::set_window_callback() + { + glfwSetWindowSizeLimits(win, win_data.width, win_data.height, GLFW_DONT_CARE, GLFW_DONT_CARE); + + glfwSetWindowSizeCallback(win, [](GLFWwindow* w, int width, int height) + { + auto data = static_cast(glfwGetWindowUserPointer(w)); + data->width = width; + data->height = height; + + system_event::window_resize_event e { width, height }; + data->callback(e); + }); + + glfwSetWindowCloseCallback(win, [](GLFWwindow* w) + { + auto data = static_cast(glfwGetWindowUserPointer(w)); + system_event::window_close_event e; + data->callback(e); + }); + + glfwSetWindowFocusCallback(win, [](GLFWwindow* w, int focused) + { + auto data = static_cast(glfwGetWindowUserPointer(w)); + system_event::window_focus_event e { focused }; + data->callback(e); + }); + } +} diff --git a/src/try_engine/window/window.hpp b/src/try_engine/window/window.hpp new file mode 100644 index 0000000..098971a --- /dev/null +++ b/src/try_engine/window/window.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include "try_engine/utils/include.hpp" +#include "graphic_context/graphic_context.hpp" +#include "try_engine/event/system_event/event.hpp" + +namespace try_engine +{ + class window + { + public: + window(std::string); + ~window(); + + public: + void update(); + GLFWwindow* glfw_window() const; + void clear() const ; + int width() const; + int height() const; + void set_event_callback(const event_callback&); + void set_window_callback(); + + private: + // ни каких unique_ptr тут неполучится + // т.к. glfwCreateWindow maloc-ом выделяет память + // что не есть хорошо для умных указателей + GLFWwindow* win; + std::unique_ptr context; + + struct window_data + { + std::string title; + int width, height; + event_callback callback; + } win_data; + + private: + void set_hint(); + void set_window(); + void set_context(); + void set_pointer(); + void set_key_callback(); + }; +} + diff --git a/subprojects/glad.wrap b/subprojects/glad.wrap new file mode 100644 index 0000000..0d5b7b5 --- /dev/null +++ b/subprojects/glad.wrap @@ -0,0 +1,6 @@ +[wrap-git] +url = https://gitcast.ru/chatlanin/glad.git +revision = master + +[provide] +glad = glad_dep diff --git a/subprojects/glfw.wrap b/subprojects/glfw.wrap new file mode 100644 index 0000000..6c3fa9d --- /dev/null +++ b/subprojects/glfw.wrap @@ -0,0 +1,13 @@ +[wrap-file] +directory = glfw-3.3.7 +source_url = https://github.com/glfw/glfw/archive/refs/tags/3.3.7.tar.gz +source_filename = glfw-3.3.7.tar.gz +source_hash = fd21a5f65bcc0fc3c76e0f8865776e852de09ef6fbc3620e09ce96d2b2807e04 +patch_filename = glfw_3.3.7-1_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/glfw_3.3.7-1/get_patch +patch_hash = cfc19fedadd1492f1bcf4a7e7604c81398571a696f94f3d18992060caf6b7057 +wrapdb_version = 3.3.7-1 + +[provide] +glfw3 = glfw_dep + diff --git a/subprojects/glm.wrap b/subprojects/glm.wrap new file mode 100644 index 0000000..3076857 --- /dev/null +++ b/subprojects/glm.wrap @@ -0,0 +1,12 @@ +[wrap-file] +directory = glm-0.9.9.8 +source_url = https://github.com/g-truc/glm/archive/0.9.9.8.tar.gz +source_filename = 0.9.9.8.tar.gz +source_hash = 7d508ab72cb5d43227a3711420f06ff99b0a0cb63ee2f93631b162bfe1fe9592 +patch_url = https://wrapdb.mesonbuild.com/v2/glm_0.9.9.8-2/get_patch +patch_filename = glm-0.9.9.8-2-wrap.zip +patch_hash = d930a1fcd3a28d84be4e92cc4c71ff59e170a1ebbd3dbfce631eba19e478d83d + +[provide] +glm = glm_dep + diff --git a/subprojects/gtest.wrap b/subprojects/gtest.wrap new file mode 100644 index 0000000..730de1a --- /dev/null +++ b/subprojects/gtest.wrap @@ -0,0 +1,15 @@ +[wrap-file] +directory = googletest-release-1.11.0 +source_url = https://github.com/google/googletest/archive/release-1.11.0.tar.gz +source_filename = gtest-1.11.0.tar.gz +source_hash = b4870bf121ff7795ba20d20bcdd8627b8e088f2d1dab299a031c1034eddc93d5 +patch_filename = gtest_1.11.0-2_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/gtest_1.11.0-2/get_patch +patch_hash = 764530d812ac161c9eab02a8cfaec67c871fcfc5548e29fd3d488070913d4e94 + +[provide] +gtest = gtest_dep +gtest_main = gtest_main_dep +gmock = gmock_dep +gmock_main = gmock_main_dep + diff --git a/subprojects/hack.wrap b/subprojects/hack.wrap new file mode 100644 index 0000000..8b65299 --- /dev/null +++ b/subprojects/hack.wrap @@ -0,0 +1,6 @@ +[wrap-git] +url = https://gitcast.ru/chatlanin/hack.git +revision = master + +[provide] +hack = hack_dep diff --git a/subprojects/imgui.wrap b/subprojects/imgui.wrap new file mode 100644 index 0000000..c60d1a4 --- /dev/null +++ b/subprojects/imgui.wrap @@ -0,0 +1,12 @@ +[wrap-file] +directory = imgui-1.87 +source_url = https://github.com/ocornut/imgui/archive/refs/tags/v1.87.tar.gz +source_filename = imgui-1.87.tar.gz +source_hash = b54ceb35bda38766e36b87c25edf7a1cd8fd2cb8c485b245aedca6fb85645a20 +patch_filename = imgui_1.87-4_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/imgui_1.87-4/get_patch +patch_hash = a008fc446e8c09c5a6c985ba94d4ffe04534f8c805f2805afdd0ba17ea6c73f5 +wrapdb_version = 1.87-4 + +[provide] +imgui = imgui_dep diff --git a/subprojects/nlohmann_json.wrap b/subprojects/nlohmann_json.wrap new file mode 100644 index 0000000..857277a --- /dev/null +++ b/subprojects/nlohmann_json.wrap @@ -0,0 +1,10 @@ +[wrap-file] +directory = nlohmann_json-3.10.5 +lead_directory_missing = true +source_url = https://github.com/nlohmann/json/releases/download/v3.10.5/include.zip +source_filename = nlohmann_json-3.10.5.zip +source_hash = b94997df68856753b72f0d7a3703b7d484d4745c567f3584ef97c96c25a5798e + +[provide] +nlohmann_json = nlohmann_json_dep + diff --git a/subprojects/taglib.wrap b/subprojects/taglib.wrap new file mode 100644 index 0000000..1ad6db2 --- /dev/null +++ b/subprojects/taglib.wrap @@ -0,0 +1,12 @@ +[wrap-file] +directory = taglib-1.12 +source_url = https://github.com/taglib/taglib/releases/download/v1.12/taglib-1.12.tar.gz +source_filename = taglig-1.12.tar.gz +source_hash = 7fccd07669a523b07a15bd24c8da1bbb92206cb19e9366c3692af3d79253b703 +patch_filename = taglib_1.12-3_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/taglib_1.12-3/get_patch +patch_hash = 95cb0267afa12308aa5f559ea55dc3dd0e1190946ecb9255ecfffec9432b1069 +wrapdb_version = 1.12-3 + +[provide] +taglib = taglib_dep diff --git a/tests/meson.build b/tests/meson.build new file mode 100644 index 0000000..286efd7 --- /dev/null +++ b/tests/meson.build @@ -0,0 +1,11 @@ +# gtest_proj = subproject('gtest') +# gtest_dep = gtest_proj.get_variable('gtest_main_dep') +# +# test( +# 'hello', +# executable( +# 'hello', +# 'hello.cpp', +# dependencies: [ hello_dep, gtest_dep ] +# ) +# ) diff --git a/tests/test_wave_file.wav b/tests/test_wave_file.wav new file mode 100644 index 0000000000000000000000000000000000000000..41f020438468229763ec4a2321325e5916e09106 GIT binary patch literal 132344 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 literal 0 HcmV?d00001