#include "widgets.h" #include "EditorConsole.h" #include #include "../../YoggieEngine/src/Scene/Components.h" #include "../../YoggieEngine/src/Scene/Entity.h" #include "../AssetManagement/AssetManager.h" class Editor; void ComponentView(const std::string& componentName, voidFunction func) { ImGuiWindowFlags_ window_flags = ImGuiWindowFlags_None; ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f); ImGui::BeginChild(componentName.c_str()); func(); ImGui::EndChild(); ImGui::PopStyleVar(); } void Inspector(entt::entity ent , Scene& scene) { ImGui::Begin("Inspector"); static char* names[] = { "Script Component", "Camera Component" }; static float Zoom = 90; static glm::vec3 Position = glm::vec3(0.0f, 0.0f, 0.0f); static glm::vec3 Rotation = glm::vec3(0.0f, 0.0f, 0.0f); if (scene.getReg().valid(ent)) { Entity entity = Entity(ent, &scene); if (ImGui::Button("Add Component")) ImGui::OpenPopup("Component picker"); ImGui::SameLine(); if (ImGui::BeginPopup("Component picker")) { for (int i = 0; i < IM_ARRAYSIZE(names); i++) if (ImGui::MenuItem(names[i])) { std::cout << "Add a " << names[i] << " to " << entity.GetComponent().name << std::endl; } ImGui::EndPopup(); } ImGui::NewLine(); auto component = entity.GetComponent(); char* buf = new char(component.name.size()); strcpy(buf, component.name.c_str()); ImGui::InputText("Name:",buf , sizeof(buf), ImGuiInputTextFlags_ReadOnly); if (entity.HasComponent()) { auto& transform = entity.GetComponent(); if (ImGui::CollapsingHeader("Transform", ImGuiTreeNodeFlags_DefaultOpen)) { ImGui::DragFloat3("Position", glm::value_ptr(transform.Position), 0.01f); ImGui::DragFloat3("Rotation", glm::value_ptr(transform.Rotation), 0.01f); ImGui::DragFloat3("Scale", glm::value_ptr(transform.Scale), 0.01f, 0.0f); } } if (entity.HasComponent()) { auto& render3d = entity.GetComponent(); if (ImGui::CollapsingHeader("Render3D", ImGuiTreeNodeFlags_DefaultOpen)) { ImGui::ColorEdit3("Colour", glm::value_ptr(render3d.color)); } } if (entity.HasComponent()) { auto& light = entity.GetComponent(); if (ImGui::CollapsingHeader("Light", ImGuiTreeNodeFlags_DefaultOpen)) { ImGui::DragFloat("Strength", &light.Strength, 0.001f); ImGui::ColorEdit3("Colour", glm::value_ptr(light.Color)); } } if (entity.HasComponent ()) { auto& camera = entity.GetComponent(); ComponentView("Camera", [] { ImGui::SliderFloat("Zoom", &Zoom, 10, 190); ImGui::InputFloat3("Position:", &Position[0]); ImGui::InputFloat3("Rotation:", &Rotation[0]); }); } if (entity.HasComponent()) { ComponentView("Scripting", [] { ImGui::LabelText("##--", "Hello scripting"); }); } } ImGui::End(); } void SceneExplorer(entt::entity& selected, Scene& scene ) { ImGui::Begin("Scene Explorer"); scene.getReg().each([&](entt::entity enttNumber) { Entity entity = Entity(enttNumber, &scene); auto id = entity.GetComponent(); if (ImGui::Selectable(id.name.c_str(), enttNumber == selected )) { selected = enttNumber; } }); ImGui::End(); } void Viewport(Framebuffer& framebuffer) { unsigned int viewportWindowFlags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar ; ImGui::Begin("Viewport", false, viewportWindowFlags); ImGui::Image((void*)(intptr_t)framebuffer.GetColourAttachment(), ImVec2{ (float)800,(float)600 }); ImGuizmo::SetDrawlist(); ImGuizmo::SetRect(ImGui::GetWindowPos().x, ImGui::GetWindowPos().y, ImGui::GetWindowWidth(), ImGui::GetWindowHeight()); ImGuizmo::Enable(true); auto cam = glm::mat4(1.0f); auto eye = glm::vec3(0.0f); auto center = glm::vec3(0.0f); auto up = glm::vec3(0.0f, 1.0f, 0.0f); auto view = glm::lookAt(eye, center, up); glm::mat4 projection = glm::perspective(glm::radians(90.0f), (800.0f / 600.0f), 0.001f, 100.0f); auto transformMatrix = glm::mat4(1.0f); ImGuizmo::Manipulate(glm::value_ptr(view), glm::value_ptr(projection), ImGuizmo::TRANSLATE, ImGuizmo::WORLD, glm::value_ptr(transformMatrix)); //ImGuizmo::Manipulate(glm::value_ptr(static_cam), glm::value_ptr(static_projection), ImGuizmo::TRANSLATE, ImGuizmo::WORLD, glm::value_ptr(trans)); ImGuizmo::ViewManipulate(glm::value_ptr(cam), 8.0f, ImVec2{ 0.0f,0.0f }, ImVec2{ 128.0f,128.0f }, 0x10101010); ImGui::End(); } void GamePort(Framebuffer& framebuffer) { unsigned int viewportWindowFlags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar; ImGui::Begin("Game", false, viewportWindowFlags); ImGui::Image((void*)(intptr_t)framebuffer.GetColourAttachment(), ImVec2{ (float)800, (float)600 }); ImGui::End(); } void Settings() { ImGui::Begin("Settings"); ImGui::LabelText("##title-settings", "Fine grain control over your engine... "); ImGui::End(); } auto console = EditorConsole(); void Console() { ImGui::Begin("Console", false); console.Draw(); ImGui::End(); } void AssetsFinder() { static YoggieEngine::Texture folderIcon ("rsc/folderIcon.png"); static YoggieEngine::Texture AssetIcon("rsc/assetIcon.png"); static int iconSize = 60; ImGui::Begin("Asset-Finder", false); ImGui::DragInt("IconSize", &iconSize, 1, 30, 90); if (ImGui::BeginTable("##resources", 3)) { ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.f, 0.f, 0.f, 0.f)); ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0.f, 0.f, 0.f, 0.f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(1.f, 1.f, 1.f, 0.2f)); int row = 0; int column = 0 ; for (auto& asset : AssetManager::assets) { if (column % 3 == 0) { ImGui::TableNextRow(); column = 0; row++; } ImGui::TableSetColumnIndex(column); if (asset.isFolder) { ImGui::ImageButton( (ImTextureID)folderIcon.GetID(), ImVec2{ (float)iconSize,(float)iconSize }); ImGui::Text(asset.GetName(), row); } else { ImGui::ImageButton( (ImTextureID)AssetIcon.GetID(), ImVec2{ (float)iconSize, (float)iconSize }); ImGui::Text(asset.GetName(), row); } column++; } ImGui::PopStyleColor(3); ImGui::EndTable(); } ImGui::End(); }