2025-07-05 13:28:41 +03:30
|
|
|
#include <engine/engine.hpp>
|
|
|
|
#include <engine/utils/serializer.hpp>
|
2021-10-23 19:04:29 +03:30
|
|
|
#include <imgui.h>
|
2025-07-05 13:28:41 +03:30
|
|
|
#include <mirror/panel/asset_browser.hpp>
|
2021-10-23 19:04:29 +03:30
|
|
|
|
|
|
|
namespace Light {
|
|
|
|
|
2022-03-12 21:10:23 +03:30
|
|
|
AssetBrowserPanel::AssetBrowserPanel(Ref<Scene> activeScene)
|
2025-07-05 14:23:01 +03:30
|
|
|
: m_current_directory("Assets")
|
|
|
|
, m_assets_path("Assets")
|
|
|
|
, m_active_scene(activeScene)
|
2022-03-06 22:25:23 +03:30
|
|
|
{
|
2022-03-07 20:01:44 +03:30
|
|
|
ResourceManager::LoadTexture("_Assets_Directory", "EngineResources/Icons/Asset_Directory.png");
|
2022-03-12 21:10:23 +03:30
|
|
|
ResourceManager::LoadTexture("_Assets_Scene", "EngineResources/Icons/Asset_Scene.png");
|
2022-03-07 20:01:44 +03:30
|
|
|
ResourceManager::LoadTexture("_Assets_Image", "EngineResources/Icons/Asset_Image.png");
|
|
|
|
ResourceManager::LoadTexture("_Assets_Text", "EngineResources/Icons/Asset_Text.png");
|
2022-03-12 21:10:23 +03:30
|
|
|
|
2025-07-05 14:23:01 +03:30
|
|
|
m_directory_texture = ResourceManager::GetTexture("_Assets_Directory");
|
|
|
|
m_scene_texture = ResourceManager::GetTexture("_Assets_Scene");
|
|
|
|
m_image_texture = ResourceManager::GetTexture("_Assets_Image");
|
|
|
|
m_text_texture = ResourceManager::GetTexture("_Assets_Text");
|
2022-03-06 22:25:23 +03:30
|
|
|
}
|
2021-10-23 19:04:29 +03:30
|
|
|
|
2022-03-07 20:01:44 +03:30
|
|
|
void AssetBrowserPanel::OnUserInterfaceUpdate()
|
2022-03-04 22:40:20 +03:30
|
|
|
{
|
|
|
|
ImGui::Begin("Content Browser");
|
2021-10-23 19:04:29 +03:30
|
|
|
|
2022-03-12 21:10:23 +03:30
|
|
|
// Parent directory button
|
2025-07-05 14:23:01 +03:30
|
|
|
if (m_current_directory != std::filesystem::path("Assets"))
|
2022-03-04 22:40:20 +03:30
|
|
|
{
|
|
|
|
if (ImGui::Button(" <-- "))
|
2021-10-23 19:04:29 +03:30
|
|
|
{
|
2025-07-05 14:23:01 +03:30
|
|
|
m_current_directory = m_current_directory.parent_path();
|
2021-10-23 19:04:29 +03:30
|
|
|
}
|
2022-03-04 22:40:20 +03:30
|
|
|
}
|
2021-10-23 19:04:29 +03:30
|
|
|
|
2025-07-05 13:28:41 +03:30
|
|
|
ImVec2 regionAvail = ImGui::GetContentRegionAvail();
|
2025-07-05 14:23:01 +03:30
|
|
|
uint32_t cellSize = m_file_size + m_file_padding;
|
2025-07-05 13:28:41 +03:30
|
|
|
uint32_t columnCount = std::clamp(
|
|
|
|
static_cast<uint32_t>(std::floor(regionAvail.x / cellSize)),
|
|
|
|
1u,
|
|
|
|
64u
|
|
|
|
);
|
2022-03-06 22:25:23 +03:30
|
|
|
|
|
|
|
if (ImGui::BeginTable("ContentBrowser", columnCount))
|
2022-03-04 22:40:20 +03:30
|
|
|
{
|
2025-07-05 14:23:01 +03:30
|
|
|
m_directory_texture->Bind(0u);
|
|
|
|
for (auto &dirEntry : std::filesystem::directory_iterator(m_current_directory))
|
2021-10-23 19:04:29 +03:30
|
|
|
{
|
2025-07-05 13:28:41 +03:30
|
|
|
const auto &path = dirEntry.path();
|
2022-03-06 22:25:23 +03:30
|
|
|
std::string extension = dirEntry.path().extension().string();
|
|
|
|
|
|
|
|
// TODO: Tidy up
|
2022-03-12 21:10:23 +03:30
|
|
|
AssetType assetType;
|
2022-03-07 20:01:44 +03:30
|
|
|
assetType = extension.empty() ? AssetType::Directory :
|
|
|
|
|
|
|
|
extension == ".txt" ? AssetType::Text :
|
|
|
|
extension == ".glsl" ? AssetType::Text :
|
|
|
|
|
|
|
|
extension == ".png" ? AssetType::Image :
|
2021-10-23 19:04:29 +03:30
|
|
|
|
2022-03-12 21:10:23 +03:30
|
|
|
extension == ".scene" ? AssetType::Scene :
|
|
|
|
|
2025-07-05 13:28:41 +03:30
|
|
|
AssetType::None;
|
2022-03-07 20:01:44 +03:30
|
|
|
|
2022-03-12 21:10:23 +03:30
|
|
|
// Extension not supported
|
2022-03-07 20:01:44 +03:30
|
|
|
if (assetType == AssetType::None)
|
2021-10-23 19:04:29 +03:30
|
|
|
{
|
2022-03-07 20:01:44 +03:30
|
|
|
continue;
|
2021-10-23 19:04:29 +03:30
|
|
|
}
|
2022-03-06 22:25:23 +03:30
|
|
|
|
2022-03-07 20:01:44 +03:30
|
|
|
// Button
|
|
|
|
ImGui::TableNextColumn();
|
|
|
|
ImGui::PushID(path.c_str());
|
|
|
|
switch (assetType)
|
2021-10-23 19:04:29 +03:30
|
|
|
{
|
2022-03-12 21:10:23 +03:30
|
|
|
// Directory
|
2022-03-07 20:01:44 +03:30
|
|
|
case AssetType::Directory:
|
2025-07-05 13:28:41 +03:30
|
|
|
if (ImGui::ImageButton(
|
2025-07-05 14:23:01 +03:30
|
|
|
m_directory_texture->GetTexture(),
|
|
|
|
ImVec2(m_file_size, m_file_size),
|
2025-07-05 13:28:41 +03:30
|
|
|
ImVec2 { 0.0f, 0.0f },
|
|
|
|
ImVec2 { 1.0f, 1.0f },
|
|
|
|
0,
|
|
|
|
ImVec4 { 0.0f, 0.0f, 0.0f, 0.0f },
|
|
|
|
ImVec4 { 1.0f, 1.0f, 1.0f, 1.0f }
|
|
|
|
))
|
2022-03-07 20:01:44 +03:30
|
|
|
{
|
2025-07-05 14:23:01 +03:30
|
|
|
m_current_directory /= path.filename();
|
2022-03-07 20:01:44 +03:30
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2022-03-12 21:10:23 +03:30
|
|
|
// Scene
|
|
|
|
case AssetType::Scene:
|
2025-07-05 13:28:41 +03:30
|
|
|
if (ImGui::ImageButton(
|
2025-07-05 14:23:01 +03:30
|
|
|
m_scene_texture->GetTexture(),
|
|
|
|
ImVec2(m_file_size, m_file_size),
|
2025-07-05 13:28:41 +03:30
|
|
|
ImVec2 { 0.0f, 0.0f },
|
|
|
|
ImVec2 { 1.0f, 1.0f },
|
|
|
|
0,
|
|
|
|
ImVec4 { 0.0f, 0.0f, 0.0f, 0.0f },
|
|
|
|
ImVec4 { 1.0f, 1.0f, 1.0f, 1.0f }
|
|
|
|
))
|
2022-03-12 21:10:23 +03:30
|
|
|
{
|
2025-07-05 14:23:01 +03:30
|
|
|
SceneSerializer serializer(m_active_scene);
|
2022-03-12 21:10:23 +03:30
|
|
|
LOG(info, "Attempting to deserialize: {}", path.string());
|
|
|
|
serializer.Deserialize(path.string());
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
// Image
|
2022-03-07 20:01:44 +03:30
|
|
|
case AssetType::Image:
|
2025-07-05 13:28:41 +03:30
|
|
|
if (ImGui::ImageButton(
|
2025-07-05 14:23:01 +03:30
|
|
|
m_image_texture->GetTexture(),
|
|
|
|
ImVec2(m_file_size, m_file_size),
|
2025-07-05 13:28:41 +03:30
|
|
|
ImVec2 { 0.0f, 0.0f },
|
|
|
|
ImVec2 { 1.0f, 1.0f },
|
|
|
|
0,
|
|
|
|
ImVec4 { 0.0f, 0.0f, 0.0f, 0.0f },
|
|
|
|
ImVec4 { 1.0f, 1.0f, 1.0f, 1.0f }
|
|
|
|
))
|
2022-03-07 20:01:44 +03:30
|
|
|
{
|
|
|
|
}
|
|
|
|
break;
|
2022-03-06 22:25:23 +03:30
|
|
|
|
2022-03-12 21:10:23 +03:30
|
|
|
// Text
|
2022-03-07 20:01:44 +03:30
|
|
|
case AssetType::Text:
|
2025-07-05 13:28:41 +03:30
|
|
|
if (ImGui::ImageButton(
|
2025-07-05 14:23:01 +03:30
|
|
|
m_text_texture->GetTexture(),
|
|
|
|
ImVec2(m_file_size, m_file_size),
|
2025-07-05 13:28:41 +03:30
|
|
|
ImVec2 { 0.0f, 0.0f },
|
|
|
|
ImVec2 { 1.0f, 1.0f },
|
|
|
|
0,
|
|
|
|
ImVec4 { 0.0f, 0.0f, 0.0f, 0.0f },
|
|
|
|
ImVec4 { 1.0f, 1.0f, 1.0f, 1.0f }
|
|
|
|
))
|
2021-10-23 19:04:29 +03:30
|
|
|
{
|
|
|
|
}
|
2022-03-07 20:01:44 +03:30
|
|
|
break;
|
|
|
|
|
2022-03-12 21:10:23 +03:30
|
|
|
|
2025-07-05 13:28:41 +03:30
|
|
|
default: break;
|
2021-10-23 19:04:29 +03:30
|
|
|
}
|
2022-03-07 20:01:44 +03:30
|
|
|
// Label
|
|
|
|
ImGui::Text("%s", path.filename().c_str());
|
|
|
|
ImGui::PopID();
|
2021-10-23 19:04:29 +03:30
|
|
|
}
|
|
|
|
|
2022-03-06 22:25:23 +03:30
|
|
|
ImGui::EndTable();
|
2021-10-23 19:04:29 +03:30
|
|
|
}
|
2022-03-06 22:25:23 +03:30
|
|
|
ImGui::End();
|
2022-03-04 22:40:20 +03:30
|
|
|
}
|
2021-10-23 19:04:29 +03:30
|
|
|
|
2022-03-04 22:40:20 +03:30
|
|
|
} // namespace Light
|