diff --git a/CMakeLists.txt b/CMakeLists.txt index 65e5b85..625591d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.5) set (CMAKE_EXPORT_COMPILE_COMMANDS ON) # C++ -set (CMAKE_CXX_STANDARD 23) +set (CMAKE_CXX_STANDARD 20) set (CMAKE_CXX_STANDARD_REQUIRED ON) # Project declaration diff --git a/README.md b/README.md index 5209eba..03c625d 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Come back later, sorry! Jenjin is not ready for real usage. - [x] Texture loading - [x] Scripting (Lua) - [x] Transparency on sprites -- [ ] Icons everywhere +- [x] Icons everywhere - [ ] Code editor in the editor - [ ] Dynamic data attached to game objects at runtime - [ ] Hierarchy and `.Parent` in Lua along with `workspace` (e.g. `Workspace.MyGameObject.Parent` == `Workspace`) diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 809b491..c0dc12a 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -15,6 +15,7 @@ target_include_directories(JenjinEngine ${CMAKE_SOURCE_DIR}/megasource/libs/stb/ ${CMAKE_SOURCE_DIR}/megasource/libs/lua/include/ ${CMAKE_SOURCE_DIR}/megasource/libs/sol2/include/ + ${CMAKE_SOURCE_DIR}/megasource/libs/IconFontCppHeaders/ ${CMAKE_SOURCE_DIR}/megasource/libs/ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src diff --git a/engine/src/editor/editor.cpp b/engine/src/editor/editor.cpp index 2710681..489d0f8 100644 --- a/engine/src/editor/editor.cpp +++ b/engine/src/editor/editor.cpp @@ -15,12 +15,28 @@ #include #include +#include + #include #include #include #include #include +#define EDITOR_WELCOME_TITLE ICON_FA_DOOR_OPEN " Welcome"; +#define EDITOR_VIEWPORT_TITLE ICON_FA_VIDEO " Viewport"; +#define EDITOR_HIERARCHY_TITLE ICON_FA_SITEMAP " Hierarchy"; +#define EDITOR_INSPECTOR_TITLE ICON_FA_EYE " Inspector"; +#define EDITOR_EXPLORER_TITLE ICON_FA_FOLDER " Explorer"; +#define EDITOR_CODE_TITLE ICON_FA_CODE " Code"; +#define EDITOR_CONSOLE_TITLE ICON_FA_TERMINAL " Console"; + +#define TRANSFORM_WIDGET_TITLE ICON_FA_ARROWS_UP_DOWN_LEFT_RIGHT " Transform"; +#define APPEARANCE_WIDGET_TITLE ICON_FA_PALETTE " Appearance"; +#define TEXTURES_WIDGET_TITLE ICON_FA_IMAGES " Textures"; + +#define MANAGE_WIDGET_TITLE ICON_FA_JAR " Manage"; + using namespace Jenjin::Editor; Manager::Manager() {} @@ -138,7 +154,8 @@ void Manager::dockspace() { ImGui::DockBuilderSetNodeSize(dockspace_id, viewport->Size); // Dock the welcome window in the center - ImGui::DockBuilderDockWindow("Welcome", dockspace_id); + static auto title = EDITOR_WELCOME_TITLE; + ImGui::DockBuilderDockWindow(title, dockspace_id); auto dock_left = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Left, 0.25f, nullptr, &dockspace_id); @@ -148,10 +165,17 @@ void Manager::dockspace() { 0.6f, nullptr, &dockspace_id); auto middle = dockspace_id; - ImGui::DockBuilderDockWindow("Hierarchy", dock_left_up); - ImGui::DockBuilderDockWindow("Explorer", dock_left); - ImGui::DockBuilderDockWindow("Inspector", dock_right); - ImGui::DockBuilderDockWindow("Viewport", middle); + static auto hierarchy_title = EDITOR_HIERARCHY_TITLE; + ImGui::DockBuilderDockWindow(hierarchy_title, dock_left_up); + + static auto explorer_title = EDITOR_EXPLORER_TITLE; + ImGui::DockBuilderDockWindow(explorer_title, dock_left); + + static auto inspector_title = EDITOR_INSPECTOR_TITLE; + ImGui::DockBuilderDockWindow(inspector_title, dock_right); + + static auto viewport_title = EDITOR_VIEWPORT_TITLE; + ImGui::DockBuilderDockWindow(viewport_title, middle); ImGui::DockBuilderFinish(dockspace_id); } @@ -168,7 +192,8 @@ void Manager::hierarchy(Jenjin::Scene *scene) { std::vector> *gameObjects = Jenjin::EngineRef->GetCurrentScene()->GetGameObjects(); - ImGui::Begin("Hierarchy"); + static auto title = EDITOR_HIERARCHY_TITLE; + ImGui::Begin(title); static char name[128] = {0}; // Press or Ctrl + Shift + A @@ -246,7 +271,8 @@ void Manager::inspector(Jenjin::Scene *scene) { return; } - ImGui::Begin("Inspector"); + static auto title = EDITOR_INSPECTOR_TITLE; + ImGui::Begin(title); if (selectedCamera) { ImGui::Text("Camera"); @@ -274,7 +300,8 @@ void Manager::inspector(Jenjin::Scene *scene) { ImGui::Unindent(); - ImGui::Text("Appearance"); + static auto appearance_title = APPEARANCE_WIDGET_TITLE; + ImGui::Text("%s", appearance_title); ImGui::Separator(); ImGui::Indent(); @@ -294,7 +321,8 @@ void Manager::inspector(Jenjin::Scene *scene) { return; } - if (ImGui::CollapsingHeader("Transform", ImGuiTreeNodeFlags_DefaultOpen)) { + static auto transform_title = TRANSFORM_WIDGET_TITLE; + if (ImGui::CollapsingHeader(transform_title, ImGuiTreeNodeFlags_DefaultOpen)) { ImGui::Indent(); Jenjin::Editor::Widgets::transformWidget(&selectedObject->transform); ImGui::Unindent(); @@ -302,7 +330,8 @@ void Manager::inspector(Jenjin::Scene *scene) { ImGui::ItemSize(ImVec2(0, 10)); - if (ImGui::CollapsingHeader("Appearance", ImGuiTreeNodeFlags_DefaultOpen)) { + static auto appearance_title = APPEARANCE_WIDGET_TITLE; + if (ImGui::CollapsingHeader(appearance_title)) { ImGui::Indent(); ImGui::ColorPicker3("Color", glm::value_ptr(selectedObject->color)); ImGui::Unindent(); @@ -310,7 +339,8 @@ void Manager::inspector(Jenjin::Scene *scene) { ImGui::ItemSize(ImVec2(0, 10)); - if (ImGui::CollapsingHeader("Textures", ImGuiTreeNodeFlags_DefaultOpen)) { + static auto textures_title = TEXTURES_WIDGET_TITLE; + if (ImGui::CollapsingHeader(textures_title)) { ImGui::Indent(); auto diriter = std::filesystem::directory_iterator(this->paths.projectPath + "/textures/"); @@ -346,7 +376,8 @@ void Manager::inspector(Jenjin::Scene *scene) { ImGui::ItemSize(ImVec2(0, 10)); - if (ImGui::CollapsingHeader("Manage", ImGuiTreeNodeFlags_DefaultOpen)) { + static auto manage_title = MANAGE_WIDGET_TITLE; + if (ImGui::CollapsingHeader(manage_title, ImGuiTreeNodeFlags_DefaultOpen)) { ImGui::Indent(); ImGui::InputText("##RenameInput", renameGameObjectBuffer, sizeof(renameGameObjectBuffer)); @@ -367,7 +398,8 @@ void Manager::inspector(Jenjin::Scene *scene) { } void Manager::explorer(Jenjin::Scene *scene) { - ImGui::Begin("Explorer"); + static auto title = EDITOR_EXPLORER_TITLE; + ImGui::Begin(title); for (auto file : std::filesystem::directory_iterator(this->paths.projectPath)) { @@ -464,7 +496,8 @@ void Manager::show_all(Jenjin::Scene *scene) { } void Manager::welcome() { - ImGui::Begin("Welcome", nullptr, + static auto title = EDITOR_WELCOME_TITLE; + ImGui::Begin(title, nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar); diff --git a/engine/src/editor/widgets.cpp b/engine/src/editor/widgets.cpp index a3e62fd..86dcc81 100644 --- a/engine/src/editor/widgets.cpp +++ b/engine/src/editor/widgets.cpp @@ -8,6 +8,13 @@ #include #include +#include + +#define LEFT_RIGHT ICON_FA_ARROWS_LEFT_RIGHT +#define UP_DOWN ICON_FA_ARROWS_UP_DOWN + +#define ROTATE ICON_FA_ARROWS_SPIN + using namespace Jenjin::Editor; static void drawButtonWithDrag(const std::string &buttonLabel, @@ -59,6 +66,9 @@ bool Widgets::transformWidget(Jenjin::GameObject::Transform *transform) { GImGui->Font->FontSize + GImGui->Style.FramePadding.y * 2.0f; ImVec2 buttonSize = {lineHeight + 3.0f, lineHeight}; + static auto left_right_title = LEFT_RIGHT; + static auto up_down_title = UP_DOWN; + start_widget("Position"); drawButtonWithDrag("X", "##X", transform->position.x, ImVec4{0.6f, 0.2f, 0.2f, 1.0f}, @@ -72,19 +82,20 @@ bool Widgets::transformWidget(Jenjin::GameObject::Transform *transform) { end_widget(); start_widget("Scale"); - drawButtonWithDrag("W", "##ScaleW", transform->scale.x, + drawButtonWithDrag(left_right_title, "##ScaleW", transform->scale.x, ImVec4{0.6f, 0.2f, 0.2f, 1.0f}, ImVec4{0.7f, 0.3f, 0.3f, 1.0f}, ImVec4{0.6f, 0.2f, 0.2f, 1.0f}, buttonSize, 1); - drawButtonWithDrag("H", "##ScaleH", transform->scale.y, + drawButtonWithDrag(up_down_title, "##ScaleH", transform->scale.y, ImVec4{0.3f, 0.6f, 0.3f, 1.0f}, ImVec4{0.4f, 0.7f, 0.4f, 1.0f}, ImVec4{0.3f, 0.6f, 0.3f, 1.0f}, buttonSize, 1); end_widget(); + static auto rotation_title = ROTATE; start_widget("Rotation", 1); - drawButtonWithDrag("Z", "##Rotation", transform->rotation, + drawButtonWithDrag(rotation_title, "##Rotation", transform->rotation, ImVec4{0.3f, 0.4f, 0.7f, 1.0f}, ImVec4{0.4f, 0.5f, 0.8f, 1.0f}, ImVec4{0.3f, 0.4f, 0.7f, 1.0f}, buttonSize); diff --git a/engine/src/helpers.cpp b/engine/src/helpers.cpp index 50034fc..856f940 100644 --- a/engine/src/helpers.cpp +++ b/engine/src/helpers.cpp @@ -6,6 +6,8 @@ #include #include +#include + #include namespace Jenjin::Helpers { @@ -37,12 +39,24 @@ void CheckWindow(GLFWwindow *window) { void InitiateImGui(GLFWwindow *window) { IMGUI_CHECKVERSION(); ImGui::CreateContext(); + ImGuiIO &io = ImGui::GetIO(); io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; io.Fonts->AddFontFromFileTTF("resources/fonts/Roboto-Medium.ttf", 16.0f); + + float base = 16.0f; + float icon = base * 2.0f / 3.0f; + + static const ImWchar icon_ranges[] = { ICON_MIN_FA, ICON_MAX_16_FA, 0 }; + ImFontConfig config; + config.MergeMode = true; + config.PixelSnapH = true; + config.GlyphMinAdvanceX = icon; + io.Fonts->AddFontFromFileTTF("./resources/fonts/fa-solid-900.ttf", base, &config, icon_ranges); + ImGui::StyleColorsDark(); // Photoshop style by Derydoca from ImThemes diff --git a/engine/src/targets/editor.cpp b/engine/src/targets/editor.cpp index 3d887d4..c89ac28 100644 --- a/engine/src/targets/editor.cpp +++ b/engine/src/targets/editor.cpp @@ -9,9 +9,12 @@ #include #include +#include #include +#define VIEWPORT_TITLE ICON_FA_VIDEO " Viewport"; + using namespace Jenjin::Targets; EditorTarget::EditorTarget() {} @@ -51,7 +54,9 @@ void EditorTarget::Render() { return; } - ImGui::Begin("Viewport"); + static auto title = VIEWPORT_TITLE; + ImGui::Begin(title, nullptr, + ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse); ImVec2 size = ImGui::GetContentRegionAvail(); this->width = size.x; diff --git a/jenjin/game b/jenjin/game deleted file mode 100755 index 0d333db..0000000 Binary files a/jenjin/game and /dev/null differ diff --git a/megasource b/megasource index 603b8cd..a9f6cc7 160000 --- a/megasource +++ b/megasource @@ -1 +1 @@ -Subproject commit 603b8cda1e1ed00d492da2ee2db10f407ea89f31 +Subproject commit a9f6cc787d03e03ba66aa8ccc678478a43bc1924 diff --git a/resources/fonts/fa-solid-900-LICENSE.txt b/resources/fonts/fa-solid-900-LICENSE.txt new file mode 100644 index 0000000..49cdf4f --- /dev/null +++ b/resources/fonts/fa-solid-900-LICENSE.txt @@ -0,0 +1 @@ +https://fontawesome.com/license/free diff --git a/resources/fonts/fa-solid-900.ttf b/resources/fonts/fa-solid-900.ttf new file mode 100644 index 0000000..cee3c5b Binary files /dev/null and b/resources/fonts/fa-solid-900.ttf differ