light/modules/mirror/src/panel/asset_browser.cpp

155 lines
4.1 KiB
C++
Raw Normal View History

2025-07-05 13:28:41 +03:30
#include <engine/engine.hpp>
#include <engine/utils/serializer.hpp>
#include <imgui.h>
2025-07-05 13:28:41 +03:30
#include <mirror/panel/asset_browser.hpp>
namespace Light {
2025-07-06 14:09:58 +03:30
AssetBrowserPanel::AssetBrowserPanel(Ref<Scene> active_scene)
: m_current_directory("./data/assets")
, m_assets_path("./data/assets")
, m_active_scene(std::move(active_scene))
2022-03-06 22:25:23 +03:30
{
2025-07-06 14:03:04 +03:30
ResourceManager::load_texture("_Assets_Directory", "data/engine/icons/asset/dir.png");
ResourceManager::load_texture("_Assets_Scene", "data/engine/icons/asset/scene.png");
ResourceManager::load_texture("_Assets_Image", "data/engine/icons/asset/img.png");
ResourceManager::load_texture("_Assets_Text", "data/engine/icons/asset/txt.png");
m_directory_texture = ResourceManager::get_texture("_Assets_Directory");
m_scene_texture = ResourceManager::get_texture("_Assets_Scene");
m_image_texture = ResourceManager::get_texture("_Assets_Image");
m_text_texture = ResourceManager::get_texture("_Assets_Text");
2022-03-06 22:25:23 +03:30
}
void AssetBrowserPanel::on_user_interface_update()
2022-03-04 22:40:20 +03:30
{
ImGui::Begin("Content Browser");
2022-03-12 21:10:23 +03:30
// Parent directory button
2025-07-06 14:09:58 +03:30
if (m_current_directory != std::filesystem::path("data/assets"))
2022-03-04 22:40:20 +03:30
{
if (ImGui::Button(" <-- "))
{
m_current_directory = m_current_directory.parent_path();
}
2022-03-04 22:40:20 +03:30
}
2025-07-06 14:02:50 +03:30
auto regionAvail = ImGui::GetContentRegionAvail();
auto cellSize = m_file_size + m_file_padding;
auto columnCount = std::clamp(
2025-07-05 13:28:41 +03:30
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
{
m_directory_texture->bind(0u);
2025-07-06 14:02:50 +03:30
for (const auto &dirEntry : std::filesystem::directory_iterator(m_current_directory))
{
2025-07-05 13:28:41 +03:30
const auto &path = dirEntry.path();
2025-07-06 14:02:50 +03:30
auto extension = dirEntry.path().extension().string();
2022-03-06 22:25:23 +03:30
// TODO: Tidy up
2025-07-06 14:02:50 +03:30
auto assetType = AssetType {};
2025-07-06 14:09:58 +03:30
assetType = extension.empty() ? AssetType::directory :
2025-07-06 14:09:58 +03:30
extension == ".txt" ? AssetType::text :
extension == ".glsl" ? AssetType::text :
2025-07-06 14:09:58 +03:30
extension == ".png" ? AssetType::image :
2025-07-06 14:09:58 +03:30
extension == ".scene" ? AssetType::scene :
2022-03-12 21:10:23 +03:30
2025-07-06 14:09:58 +03:30
AssetType::none;
2022-03-12 21:10:23 +03:30
// Extension not supported
2025-07-06 14:09:58 +03:30
if (assetType == AssetType::none)
{
continue;
}
2022-03-06 22:25:23 +03:30
// Button
ImGui::TableNextColumn();
ImGui::PushID(path.c_str());
switch (assetType)
{
2022-03-12 21:10:23 +03:30
// Directory
2025-07-06 14:09:58 +03:30
case AssetType::directory:
2025-07-05 13:28:41 +03:30
if (ImGui::ImageButton(
m_directory_texture->get_texture(),
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 }
))
{
m_current_directory /= path.filename();
}
break;
2022-03-12 21:10:23 +03:30
// Scene
2025-07-06 14:09:58 +03:30
case AssetType::scene:
2025-07-05 13:28:41 +03:30
if (ImGui::ImageButton(
m_scene_texture->get_texture(),
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-06 14:02:50 +03:30
auto serializer = SceneSerializer { m_active_scene };
lt_log(info, "Attempting to deserialize: {}", path.string());
serializer.deserialize(path.string());
2022-03-12 21:10:23 +03:30
}
break;
// Image
2025-07-06 14:09:58 +03:30
case AssetType::image:
2025-07-05 13:28:41 +03:30
if (ImGui::ImageButton(
m_image_texture->get_texture(),
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 }
))
{
}
break;
2022-03-06 22:25:23 +03:30
2022-03-12 21:10:23 +03:30
// Text
2025-07-06 14:09:58 +03:30
case AssetType::text:
2025-07-05 13:28:41 +03:30
if (ImGui::ImageButton(
m_text_texture->get_texture(),
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 }
))
{
}
break;
2022-03-12 21:10:23 +03:30
2025-07-05 13:28:41 +03:30
default: break;
}
// Label
ImGui::Text("%s", path.filename().c_str());
ImGui::PopID();
}
2022-03-06 22:25:23 +03:30
ImGui::EndTable();
}
2022-03-06 22:25:23 +03:30
ImGui::End();
2022-03-04 22:40:20 +03:30
}
2022-03-04 22:40:20 +03:30
} // namespace Light