152 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <asset_manager/asset_manager.hpp>
 | |
| #include <ecs/registry.hpp>
 | |
| #include <ecs/serializer.hpp>
 | |
| #include <imgui.h>
 | |
| #include <memory/reference.hpp>
 | |
| #include <mirror/panels/asset_browser.hpp>
 | |
| #include <renderer/texture.hpp>
 | |
| 
 | |
| namespace lt {
 | |
| 
 | |
| AssetBrowserPanel::AssetBrowserPanel(memory::Ref<Scene> active_scene)
 | |
|     : m_current_directory("./data/assets")
 | |
|     , m_assets_path("./data/assets")
 | |
|     , m_active_scene(std::move(active_scene))
 | |
| {
 | |
| 	AssetManager::load_texture("_Assets_Directory", "data/engine/icons/asset/dir.asset");
 | |
| 	AssetManager::load_texture("_Assets_Scene", "data/engine/icons/asset/scene.asset");
 | |
| 	AssetManager::load_texture("_Assets_Image", "data/engine/icons/asset/img.asset");
 | |
| 	AssetManager::load_texture("_Assets_Text", "data/engine/icons/asset/txt.asset");
 | |
| 
 | |
| 	m_directory_texture = AssetManager::get_texture("_Assets_Directory");
 | |
| 	m_scene_texture = AssetManager::get_texture("_Assets_Scene");
 | |
| 	m_image_texture = AssetManager::get_texture("_Assets_Image");
 | |
| 	m_text_texture = AssetManager::get_texture("_Assets_Text");
 | |
| }
 | |
| 
 | |
| void AssetBrowserPanel::on_user_interface_update()
 | |
| {
 | |
| 	ImGui::Begin("Content Browser");
 | |
| 
 | |
| 	// Parent directory button
 | |
| 	if (m_current_directory != std::filesystem::path("data/assets"))
 | |
| 	{
 | |
| 		if (ImGui::Button(" <--  "))
 | |
| 		{
 | |
| 			m_current_directory = m_current_directory.parent_path();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	const auto available_region = ImGui::GetContentRegionAvail();
 | |
| 	const auto cell_size = m_file_size + m_file_padding;
 | |
| 	const auto column_count = std::clamp(
 | |
| 	    static_cast<uint32_t>(std::floor(available_region.x / cell_size)),
 | |
| 	    1u,
 | |
| 	    64u
 | |
| 	);
 | |
| 
 | |
| 	if (ImGui::BeginTable("ContentBrowser", static_cast<int>(column_count)))
 | |
| 	{
 | |
| 		m_directory_texture->bind(0u);
 | |
| 		for (const auto &directory_entry : std::filesystem::directory_iterator(m_current_directory))
 | |
| 		{
 | |
| 			const auto &path = directory_entry.path();
 | |
| 			auto extension = directory_entry.path().extension().string();
 | |
| 
 | |
| 			auto asset_type = AssetType {};
 | |
| 
 | |
| 			if (extension.empty())
 | |
| 			{
 | |
| 				asset_type = AssetType::directory;
 | |
| 			}
 | |
| 			else if (extension == ".txt" || extension == ".glsl")
 | |
| 			{
 | |
| 				asset_type = AssetType::text;
 | |
| 			}
 | |
| 			else if (extension == ".png")
 | |
| 			{
 | |
| 				asset_type = AssetType::image;
 | |
| 			}
 | |
| 			else if (extension == ".scene")
 | |
| 			{
 | |
| 				asset_type = AssetType::scene;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				asset_type = AssetType::none;
 | |
| 			}
 | |
| 
 | |
| 			// Extension not supported
 | |
| 			if (asset_type == AssetType::none)
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			// Button
 | |
| 			const auto path_str = path.string();
 | |
| 			ImGui::TableNextColumn();
 | |
| 			ImGui::PushID(path_str.c_str());
 | |
| 			switch (asset_type)
 | |
| 			{
 | |
| 			// Directory
 | |
| 			case AssetType::directory:
 | |
| 				if (ImGui::ImageButton(
 | |
| 				        path_str.c_str(),
 | |
| 				        m_directory_texture->get_texture(),
 | |
| 				        ImVec2(m_file_size, m_file_size)
 | |
| 				    ))
 | |
| 				{
 | |
| 					m_current_directory /= path.filename();
 | |
| 				}
 | |
| 				break;
 | |
| 
 | |
| 			// Scene
 | |
| 			case AssetType::scene:
 | |
| 				if (ImGui::ImageButton(
 | |
| 				        path_str.c_str(),
 | |
| 				        m_scene_texture->get_texture(),
 | |
| 				        ImVec2(m_file_size, m_file_size)
 | |
| 				    ))
 | |
| 				{
 | |
| 					auto serializer = SceneSerializer { m_active_scene };
 | |
| 					log_inf("Attempting to deserialize: {}", path.string());
 | |
| 					serializer.deserialize(path.string());
 | |
| 				}
 | |
| 				break;
 | |
| 
 | |
| 			// Image
 | |
| 			case AssetType::image:
 | |
| 				if (ImGui::ImageButton(
 | |
| 				        path_str.c_str(),
 | |
| 				        m_image_texture->get_texture(),
 | |
| 				        ImVec2(m_file_size, m_file_size)
 | |
| 				    ))
 | |
| 				{
 | |
| 				}
 | |
| 				break;
 | |
| 
 | |
| 			// Text
 | |
| 			case AssetType::text:
 | |
| 				if (ImGui::ImageButton(
 | |
| 				        path_str.c_str(),
 | |
| 				        m_text_texture->get_texture(),
 | |
| 				        ImVec2(m_file_size, m_file_size)
 | |
| 				    ))
 | |
| 				{
 | |
| 				}
 | |
| 				break;
 | |
| 
 | |
| 
 | |
| 			default: break;
 | |
| 			}
 | |
| 			// Label
 | |
| 			ImGui::TextUnformatted(std::format("{}", path.filename().string()).c_str());
 | |
| 			ImGui::PopID();
 | |
| 		}
 | |
| 
 | |
| 		ImGui::EndTable();
 | |
| 	}
 | |
| 	ImGui::End();
 | |
| }
 | |
| 
 | |
| } // namespace lt
 |