From b1e60d08b776c3997d1ab2dcc45b9c89ccc9eac7 Mon Sep 17 00:00:00 2001 From: Light Date: Mon, 7 Mar 2022 20:01:44 +0330 Subject: [PATCH] Edit(Mirror): AssetBrowserPanel - Renamed ContentBrowserPanel -> AssetBrowserPanel - AssetBrowserPanel now shows directory/txt/image files with image buttons --- Engine/src/Engine/Graphics/Texture.h | 36 +++---- Engine/src/Engine/LightEngine.h | 7 +- .../Platform/GraphicsAPI/OpenGL/glShader.cpp | 7 +- .../Platform/GraphicsAPI/OpenGL/glTexture.cpp | 84 ++++++++-------- .../Platform/GraphicsAPI/OpenGL/glTexture.h | 25 ++--- EngineResources/Icons/Asset_Directory.png | Bin 0 -> 17552 bytes EngineResources/Icons/Asset_Image.png | Bin 0 -> 3861 bytes EngineResources/Icons/Asset_Text.png | Bin 0 -> 5319 bytes Mirror/src/EditorLayer.cpp | 2 +- Mirror/src/EditorLayer.h | 2 +- Mirror/src/Panels/ContentBrowser.cpp | 90 ++++++++++-------- Mirror/src/Panels/ContentBrowser.h | 12 ++- default_gui_layout.ini | 45 +++++---- 13 files changed, 165 insertions(+), 145 deletions(-) create mode 100644 EngineResources/Icons/Asset_Directory.png create mode 100644 EngineResources/Icons/Asset_Image.png create mode 100644 EngineResources/Icons/Asset_Text.png diff --git a/Engine/src/Engine/Graphics/Texture.h b/Engine/src/Engine/Graphics/Texture.h index 9c1fab2..7d84b6d 100644 --- a/Engine/src/Engine/Graphics/Texture.h +++ b/Engine/src/Engine/Graphics/Texture.h @@ -4,28 +4,30 @@ namespace Light { - class SharedContext; +class SharedContext; - // #todo: improve textures - class Texture - { - public: - static Ref Create(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, Ref sharedContext, const std::string& filePath); +// #todo: improve textures +class Texture +{ +public: + static Ref Create(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, Ref sharedContext, const std::string& filePath); - Texture(const Texture&) = delete; - Texture& operator=(const Texture&) = delete; + Texture(const Texture&) = delete; + Texture& operator=(const Texture&) = delete; - virtual ~Texture() = default; + virtual ~Texture() = default; - virtual void Bind(unsigned int slot = 0) = 0; + virtual void Bind(unsigned int slot = 0) = 0; - inline const std::string& GetFilePath() const { return m_FilePath; } + virtual void* GetTexture() = 0; - protected: - Texture(const std::string& filePath); + inline const std::string& GetFilePath() const { return m_FilePath; } - protected: - std::string m_FilePath; - }; +protected: + Texture(const std::string& filePath); -} \ No newline at end of file +protected: + std::string m_FilePath; +}; + +} // namespace Light diff --git a/Engine/src/Engine/LightEngine.h b/Engine/src/Engine/LightEngine.h index 98478ef..48e1096 100644 --- a/Engine/src/Engine/LightEngine.h +++ b/Engine/src/Engine/LightEngine.h @@ -17,9 +17,10 @@ #include "Events/WindowEvents.h" // graphics +#include "Graphics/Framebuffer.h" #include "Graphics/GraphicsContext.h" #include "Graphics/Renderer.h" -#include "Graphics/Framebuffer.h" +#include "Graphics/Texture.h" // input #include "Input/Input.h" @@ -49,9 +50,9 @@ #include "Math/Random.h" // scene -#include "Scene/Scene.h" -#include "Scene/Entity.h" #include "Scene/Components.h" +#include "Scene/Entity.h" +#include "Scene/Scene.h" // entry point #ifdef LIGHT_ENTRY_POINT diff --git a/Engine/src/Platform/GraphicsAPI/OpenGL/glShader.cpp b/Engine/src/Platform/GraphicsAPI/OpenGL/glShader.cpp index 55ceb7d..edb8f21 100644 --- a/Engine/src/Platform/GraphicsAPI/OpenGL/glShader.cpp +++ b/Engine/src/Platform/GraphicsAPI/OpenGL/glShader.cpp @@ -1,10 +1,9 @@ #include "glShader.h" #include - #include -#include #include +#include namespace Light { @@ -17,7 +16,6 @@ glShader::glShader(BasicFileHandle vertexFile, BasicFileHandle pixelFile) std::string vertexSource(vertexFile.GetData(), vertexFile.GetData() + vertexFile.GetSize()); std::string pixelSource(pixelFile.GetData(), pixelFile.GetData() + pixelFile.GetSize()); - LT_ENGINE_WARN(pixelSource); unsigned int vertexShader = CompileShader(vertexSource, Shader::Stage::VERTEX); unsigned int pixelShader = CompileShader(pixelSource, Shader::Stage::PIXEL); @@ -74,7 +72,6 @@ unsigned int glShader::CompileShader(std::string source, Shader::Stage stage) { // &(address of) needs an lvalue const char* lvalue_source = source.c_str(); - LT_ENGINE_WARN("Source______________________________________\n{}", lvalue_source); unsigned int shader = glCreateShader(stage == Shader::Stage::VERTEX ? GL_VERTEX_SHADER : stage == Shader::Stage::PIXEL ? GL_FRAGMENT_SHADER : stage == Shader::Stage::GEOMETRY ? GL_GEOMETRY_SHADER : @@ -110,7 +107,7 @@ unsigned int glShader::CompileShader(std::string source, Shader::Stage stage) char* infoLog = (char*)alloca(logLength); glGetShaderInfoLog(shader, logLength, &logLength, &infoLog[0]); - LT_ENGINE_TRACE(infoLog); + LT_ENGINE_WARN(infoLog); } } #endif diff --git a/Engine/src/Platform/GraphicsAPI/OpenGL/glTexture.cpp b/Engine/src/Platform/GraphicsAPI/OpenGL/glTexture.cpp index 4e31e75..0804a6a 100644 --- a/Engine/src/Platform/GraphicsAPI/OpenGL/glTexture.cpp +++ b/Engine/src/Platform/GraphicsAPI/OpenGL/glTexture.cpp @@ -4,52 +4,56 @@ namespace Light { - glTexture::glTexture(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, const std::string& filePath): - Texture(filePath), - m_TextureID(NULL) - { +glTexture::glTexture(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, const std::string& filePath) + : Texture(filePath), m_TextureID(NULL) +{ + // create texture + glCreateTextures(GL_TEXTURE_2D, 1, &m_TextureID); - // create texture - glCreateTextures(GL_TEXTURE_2D, 1, &m_TextureID); - - // set texture parameters - glTextureParameteri(m_TextureID, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTextureParameteri(m_TextureID, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTextureParameteri(m_TextureID, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTextureParameteri(m_TextureID, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + // set texture parameters + glTextureParameteri(m_TextureID, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTextureParameteri(m_TextureID, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTextureParameteri(m_TextureID, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTextureParameteri(m_TextureID, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - // determine formats - unsigned int format = components == 4u ? GL_RGBA : - components == 3u ? GL_RGB : - components == 2u ? GL_RG : - components == 1u ? GL_RED : NULL; + // determine formats + unsigned int format = components == 4u ? GL_RGBA : + components == 3u ? GL_RGB : + components == 2u ? GL_RG : + components == 1u ? GL_RED : + NULL; - unsigned int internalFormat = format == GL_RGBA ? GL_RGBA8 : - format == GL_RGB ? GL_RGB8 : - format == GL_RG ? GL_RG8 : - format == GL_RED ? GL_R8 : NULL; + unsigned int internalFormat = format == GL_RGBA ? GL_RGBA8 : + format == GL_RGB ? GL_RGB8 : + format == GL_RG ? GL_RG8 : + format == GL_RED ? GL_R8 : + NULL; - // check - LT_ENGINE_ASSERT(format, "glTexture::glTexture: invalid number of components: {}", components); - + // check + LT_ENGINE_ASSERT(format, "glTexture::glTexture: invalid number of components: {}", components); - // #todo: isn't there something like glTextureImage2D ??? - // create texture and mipsmaps - Bind(); - glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, GL_UNSIGNED_BYTE, pixels); - glGenerateMipmap(GL_TEXTURE_2D); - } + // #todo: isn't there something like glTextureImage2D ??? + // create texture and mipsmaps + Bind(); + glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, GL_UNSIGNED_BYTE, pixels); + glGenerateMipmap(GL_TEXTURE_2D); +} - glTexture::~glTexture() - { - glDeleteTextures(1, &m_TextureID); - } +glTexture::~glTexture() +{ + glDeleteTextures(1, &m_TextureID); +} - void glTexture::Bind(unsigned int slot /* = 0u */) - { - glActiveTexture(GL_TEXTURE0 + slot); - glBindTexture(GL_TEXTURE_2D, m_TextureID); - } +void glTexture::Bind(unsigned int slot /* = 0u */) +{ + glActiveTexture(GL_TEXTURE0 + slot); + glBindTexture(GL_TEXTURE_2D, m_TextureID); +} -} \ No newline at end of file +void* glTexture::GetTexture() +{ + return (void*)(intptr_t)m_TextureID; +} + +} // namespace Light diff --git a/Engine/src/Platform/GraphicsAPI/OpenGL/glTexture.h b/Engine/src/Platform/GraphicsAPI/OpenGL/glTexture.h index f527f3c..84f59e6 100644 --- a/Engine/src/Platform/GraphicsAPI/OpenGL/glTexture.h +++ b/Engine/src/Platform/GraphicsAPI/OpenGL/glTexture.h @@ -1,21 +1,22 @@ #pragma once -#include "Graphics/Texture.h" - #include "Base/Base.h" +#include "Graphics/Texture.h" namespace Light { - class glTexture : public Texture - { - private: - unsigned int m_TextureID; +class glTexture: public Texture +{ +private: + unsigned int m_TextureID; - public: - glTexture(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, const std::string& filePath); - ~glTexture(); +public: + glTexture(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, const std::string& filePath); + ~glTexture(); - void Bind(unsigned int slot = 0u) override; - }; + void Bind(unsigned int slot = 0u) override; -} \ No newline at end of file + void* GetTexture() override; +}; + +} // namespace Light diff --git a/EngineResources/Icons/Asset_Directory.png b/EngineResources/Icons/Asset_Directory.png new file mode 100644 index 0000000000000000000000000000000000000000..74c7668cfbb90ca5c6078705cc4623d5f4c69833 GIT binary patch literal 17552 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 literal 0 HcmV?d00001 diff --git a/EngineResources/Icons/Asset_Image.png b/EngineResources/Icons/Asset_Image.png new file mode 100644 index 0000000000000000000000000000000000000000..1da46df833dabe213400c7a49879c05b979fd523 GIT binary patch literal 3861 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 mPQ`rl`r>z9=e?)7>*jS1 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 k=0W6JGiT}gD?-0 m_PropertiesPanel = CreateRef(); m_SceneHierarchyPanel = CreateRef(m_Scene, m_PropertiesPanel); - m_ContentBrowserPanel = CreateRef(); + m_ContentBrowserPanel = CreateRef(); m_Framebuffer = Framebuffer::Create({ 1, 1, 1 }, GraphicsContext::GetSharedContext()); diff --git a/Mirror/src/EditorLayer.h b/Mirror/src/EditorLayer.h index 0134f45..e00672b 100644 --- a/Mirror/src/EditorLayer.h +++ b/Mirror/src/EditorLayer.h @@ -22,7 +22,7 @@ private: Ref m_SceneHierarchyPanel; Ref m_PropertiesPanel; - Ref m_ContentBrowserPanel; + Ref m_ContentBrowserPanel; Ref m_Framebuffer; diff --git a/Mirror/src/Panels/ContentBrowser.cpp b/Mirror/src/Panels/ContentBrowser.cpp index ebecf35..9ae3789 100644 --- a/Mirror/src/Panels/ContentBrowser.cpp +++ b/Mirror/src/Panels/ContentBrowser.cpp @@ -5,14 +5,18 @@ namespace Light { -ContentBrowserPanel::ContentBrowserPanel() +AssetBrowserPanel::AssetBrowserPanel() : m_CurrentDirectory("Assets"), m_AssetsPath("Assets") { - // ResourceManager::LoadTexture("_Assets_Directory", "EngineResources/Icons/Asset_Directory"); - // m_DirectoryTexture = ResourceManager::GetTexture("_Assets_Directory"); + ResourceManager::LoadTexture("_Assets_Directory", "EngineResources/Icons/Asset_Directory.png"); + ResourceManager::LoadTexture("_Assets_Image", "EngineResources/Icons/Asset_Image.png"); + ResourceManager::LoadTexture("_Assets_Text", "EngineResources/Icons/Asset_Text.png"); + m_DirectoryTexture = ResourceManager::GetTexture("_Assets_Directory"); + m_ImageTexture = ResourceManager::GetTexture("_Assets_Image"); + m_TextTexture = ResourceManager::GetTexture("_Assets_Text"); } -void ContentBrowserPanel::OnUserInterfaceUpdate() +void AssetBrowserPanel::OnUserInterfaceUpdate() { ImGui::Begin("Content Browser"); @@ -31,58 +35,68 @@ void ContentBrowserPanel::OnUserInterfaceUpdate() if (ImGui::BeginTable("ContentBrowser", columnCount)) { + m_DirectoryTexture->Bind(0u); for (auto& dirEntry : std::filesystem::directory_iterator(m_CurrentDirectory)) { - ImGui::TableNextColumn(); LT_ENGINE_TRACE("File: ", dirEntry.path().string()); - FileType assetType; + AssetType assetType; std::string extension = dirEntry.path().extension().string(); // TODO: Tidy up - assetType = extension.empty() ? FileType::Directory : - extension == ".txt" ? FileType::Text : - extension == ".png" ? FileType::Image : - FileType::None; + assetType = extension.empty() ? AssetType::Directory : - if (assetType == FileType::None) + extension == ".txt" ? AssetType::Text : + extension == ".glsl" ? AssetType::Text : + + extension == ".png" ? AssetType::Image : + + AssetType::None; + + // Unsupported asset type + if (assetType == AssetType::None) { - LT_ENGINE_ERROR("Unsupported file exetnsion: {}", extension); - return; + continue; } - const auto& path = dirEntry.path(); - { - auto relativePath = std::filesystem::relative(path, m_AssetsPath); - std::string relativePathString = relativePath.string(); + const auto& path = dirEntry.path(); + auto relativePath = std::filesystem::relative(path, m_AssetsPath); + std::string relativePathString = relativePath.string(); - switch (assetType) + // Button + ImGui::TableNextColumn(); + ImGui::PushID(path.c_str()); + switch (assetType) + { + case AssetType::Directory: + if (ImGui::ImageButton(m_DirectoryTexture->GetTexture(), ImVec2(m_FileSize, m_FileSize), 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 })) { - case FileType::Directory: - if (ImGui::Button(relativePathString.c_str(), ImVec2(m_FileSize, m_FileSize))) - { - m_CurrentDirectory /= path.filename(); - } - ImGui::Text("Test"); - break; - case FileType::Image: - if (ImGui::Button(relativePathString.c_str(), ImVec2(m_FileSize, m_FileSize))) - { - } - break; - case FileType::Text: - if (ImGui::Button(relativePathString.c_str(), ImVec2(m_FileSize, m_FileSize))) - { - } - default: - break; + m_CurrentDirectory /= path.filename(); + LT_ENGINE_INFO(path.filename().string()); } + break; + + case AssetType::Image: + if (ImGui::ImageButton(m_ImageTexture->GetTexture(), ImVec2(m_FileSize, m_FileSize), 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; + + case AssetType::Text: + if (ImGui::ImageButton(m_TextTexture->GetTexture(), ImVec2(m_FileSize, m_FileSize), 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; + + default: + break; } + // Label + ImGui::Text("%s", path.filename().c_str()); + ImGui::PopID(); } ImGui::EndTable(); } - ImGui::DragInt("Size", (int*)&m_FileSize, 32u, 512u); - ImGui::DragInt("Padding", (int*)&m_FilePadding, 32u, 512u); ImGui::End(); } diff --git a/Mirror/src/Panels/ContentBrowser.h b/Mirror/src/Panels/ContentBrowser.h index 3181871..dd469a4 100644 --- a/Mirror/src/Panels/ContentBrowser.h +++ b/Mirror/src/Panels/ContentBrowser.h @@ -7,10 +7,10 @@ namespace Light { -class ContentBrowserPanel: public Panel +class AssetBrowserPanel: public Panel { private: - enum FileType + enum AssetType { None = 0, Directory, @@ -19,7 +19,7 @@ private: }; public: - ContentBrowserPanel(); + AssetBrowserPanel(); void OnUserInterfaceUpdate(); @@ -28,10 +28,12 @@ private: const std::filesystem::path m_AssetsPath; // TODO: Save configuration - uint32_t m_FileSize = 256u; - uint32_t m_FilePadding = 16u; + uint32_t m_FileSize = 128u; + uint32_t m_FilePadding = 8u; Ref m_DirectoryTexture; + Ref m_ImageTexture; + Ref m_TextTexture; }; } // namespace Light diff --git a/default_gui_layout.ini b/default_gui_layout.ini index 6c691d9..cbe479f 100644 --- a/default_gui_layout.ini +++ b/default_gui_layout.ini @@ -1,53 +1,52 @@ [Window][Dockspace] Pos=0,0 -Size=1270,1404 +Size=843,1404 Collapsed=0 [Window][Debug##Default] -ViewportPos=2170,695 -ViewportId=0x4DBAC3CB -Size=400,400 +ViewportPos=2078,721 +ViewportId=0x9F5F46A1 +Size=848,1408 Collapsed=0 DockId=0x00000007,0 [Window][Dear ImGui Demo] -Pos=737,24 -Size=335,1380 +Pos=372,24 +Size=295,1380 Collapsed=0 DockId=0x00000004,0 [Window][Hierarchy] Pos=0,24 -Size=363,1380 +Size=184,1380 Collapsed=0 DockId=0x00000001,0 [Window][Properties] -Pos=1074,24 -Size=182,1380 +Pos=669,24 +Size=160,1380 Collapsed=0 DockId=0x00000005,0 [Window][Game] -Pos=365,24 -Size=370,1380 +Pos=186,24 +Size=184,1380 Collapsed=0 DockId=0x00000002,0 [Window][Content Browser] -ViewportPos=2170,695 -ViewportId=0x4DBAC3CB -Size=400,400 +ViewportPos=1359,621 +ViewportId=0x371352B7 +Size=1274,1296 Collapsed=0 -DockId=0x00000007,1 [Docking][Data] -DockNode ID=0x00000007 Pos=2170,695 Size=400,400 Selected=0x371352B7 -DockSpace ID=0x1ED03EE2 Window=0x5B816B74 Pos=6,30 Size=1256,1380 Split=X - DockNode ID=0x00000006 Parent=0x1ED03EE2 SizeRef=735,696 Split=X - DockNode ID=0x00000001 Parent=0x00000006 SizeRef=363,696 Selected=0x788BAA0D - DockNode ID=0x00000002 Parent=0x00000006 SizeRef=370,696 CentralNode=1 Selected=0x83199EB2 - DockNode ID=0x00000003 Parent=0x1ED03EE2 SizeRef=519,696 Split=X - DockNode ID=0x00000004 Parent=0x00000003 SizeRef=335,680 Selected=0xE927CF2F - DockNode ID=0x00000005 Parent=0x00000003 SizeRef=182,680 Selected=0xC89E3217 +DockNode ID=0x00000007 Pos=2078,721 Size=848,1408 Selected=0xBF096F38 +DockSpace ID=0x1ED03EE2 Window=0x5B816B74 Pos=1711,30 Size=829,1380 Split=X + DockNode ID=0x00000006 Parent=0x1ED03EE2 SizeRef=370,696 Split=X + DockNode ID=0x00000001 Parent=0x00000006 SizeRef=184,696 Selected=0x29EABFBD + DockNode ID=0x00000002 Parent=0x00000006 SizeRef=184,696 CentralNode=1 Selected=0x26816F31 + DockNode ID=0x00000003 Parent=0x1ED03EE2 SizeRef=457,696 Split=X + DockNode ID=0x00000004 Parent=0x00000003 SizeRef=295,680 Selected=0xE87781F4 + DockNode ID=0x00000005 Parent=0x00000003 SizeRef=160,680 Selected=0x199AB496