diff --git a/src/graphics/opengl/glGraphics.cpp b/src/graphics/opengl/glGraphics.cpp index 642fa65..c97ad05 100644 --- a/src/graphics/opengl/glGraphics.cpp +++ b/src/graphics/opengl/glGraphics.cpp @@ -105,9 +105,15 @@ namespace lunarium void OglGraphics::Shutdown() { // Clean up frame buffers + std::vector ids; for (auto iter = mFrameBuffers.begin(); iter != mFrameBuffers.end(); iter++) { - DestroyRenderTexture(iter->first); + ids.push_back(iter->first); + } + + for (int i = 0; i < ids.size(); i++) + { + DestroyRenderTexture(ids[i]); } mFrameBuffers.clear(); @@ -461,8 +467,8 @@ namespace lunarium { float half_width = image.GetWidth() / 2; float half_height = image.GetHeight() / 2; - DrawImage(image, Rectangle(half_width, half_height, half_width, half_height), - Rectangle(position.x, position.y, half_width, half_height), color, angle); + DrawImage(image, Rectangle::MakeFromTopLeft(0, 0, image.GetWidth(), image.GetHeight()), + Rectangle(position.x + half_width, position.y + half_height, half_width, half_height), color, angle); } void OglGraphics::DrawImage(Image& image, Rectangle source, Rectangle destination, Color color, float angle) diff --git a/src/internal_libs/gui/file_browser.cpp b/src/internal_libs/gui/file_browser.cpp index bd5d4fe..6ae759e 100644 --- a/src/internal_libs/gui/file_browser.cpp +++ b/src/internal_libs/gui/file_browser.cpp @@ -21,16 +21,12 @@ namespace lunarium { FileBrowser::FileBrowser() - : mIsOpen(false), mSelectionMode(SelectionMode::FILES_ONLY), mWarnOnExisting(false), mpFolderIcon(nullptr), mResult(Result::CANCEL), - mpNewFolderIcon(nullptr), mpUpFolderIcon(nullptr) + : mIsOpen(false), mSelectionMode(SelectionMode::FILES_ONLY), mWarnOnExisting(false), mResult(Result::CANCEL) + { mPrompt = "Select an item"; memset(mDirNameBuffer, 0, mBufferSize); memset(mInputBuffer, 0, mBufferSize); - - mpFolderIcon = DataManager::mFolderIcon; - mpNewFolderIcon = DataManager::mNewFolderIcon; - mpUpFolderIcon = DataManager::mUpArrowIcon; } /// If the given path does not exist this will default to the @@ -71,8 +67,8 @@ namespace lunarium ImGui::TextUnformatted(mPrompt.c_str()); ImGui::Separator(); - ImVec2 iconSize(mpNewFolderIcon->GetWidth(), mpNewFolderIcon->GetHeight()); - if (ImGui::ImageButton((ImTextureID) mpNewFolderIcon->GetGLTextureID64(), iconSize)) + ImVec2 iconSize(DataManager::mNewFolderIcon->GetWidth(), DataManager::mNewFolderIcon->GetHeight()); + if (ImGui::ImageButton((ImTextureID) DataManager::mNewFolderIcon->GetGLTextureID64(), iconSize)) { ImGui::OpenPopup("New Folder Name"); memset(mDirNameBuffer, 0, mBufferSize); @@ -90,8 +86,8 @@ namespace lunarium } ImGui::SameLine(); - iconSize = ImVec2(mpUpFolderIcon->GetWidth(), mpUpFolderIcon->GetHeight()); - if (ImGui::ImageButton((ImTextureID) mpUpFolderIcon->GetGLTextureID64(), iconSize)) + iconSize = ImVec2(DataManager::mUpArrowIcon->GetWidth(), DataManager::mUpArrowIcon->GetHeight()); + if (ImGui::ImageButton((ImTextureID) DataManager::mUpArrowIcon->GetGLTextureID64(), iconSize)) { mCurrentDirectory = mCurrentDirectory.parent_path(); ReloadItems(); @@ -197,8 +193,8 @@ namespace lunarium { if (std::filesystem::is_directory(mItemsInDir[i])) { - ImVec2 size(mpFolderIcon->GetWidth(), mpFolderIcon->GetHeight()); - ImTextureID id = (ImTextureID) mpFolderIcon->GetGLTextureID64(); + ImVec2 size(DataManager::mFolderIcon->GetWidth(), DataManager::mFolderIcon->GetHeight()); + ImTextureID id = (ImTextureID) DataManager::mFolderIcon->GetGLTextureID64(); ImGui::Image(id, size); ImGui::SameLine(); } @@ -219,6 +215,8 @@ namespace lunarium if (mSelectionMode == SelectionMode::FILES_ONLY || mSelectionMode == SelectionMode::ANY) { mpSelectedItem = &mItemsInDir[i]; + memset(mInputBuffer, 0, mBufferSize); + memcpy(mInputBuffer, mpSelectedItem->string().c_str(), mpSelectedItem->string().size()); } } } @@ -231,7 +229,7 @@ namespace lunarium bool FileBrowser::DoButtons() { ImGui::SetCursorPosX(ImGui::GetWindowSize().x - 100.0f); - if (ImGui::Button("OK")) + if (mpSelectedItem && ImGui::Button("OK")) { if (std::filesystem::exists(*mpSelectedItem) && mWarnOnExisting) { diff --git a/src/internal_libs/gui/file_browser.h b/src/internal_libs/gui/file_browser.h index 7321571..29809d5 100644 --- a/src/internal_libs/gui/file_browser.h +++ b/src/internal_libs/gui/file_browser.h @@ -69,9 +69,6 @@ namespace lunarium std::filesystem::path* mpSelectedItem; std::filesystem::path mInputSelection; - Image* mpFolderIcon; - Image* mpNewFolderIcon; - Image* mpUpFolderIcon; static const int mBufferSize = 256; char mDirNameBuffer[mBufferSize]; char mInputBuffer[mBufferSize]; diff --git a/src/run_modes/editor/editor.cpp b/src/run_modes/editor/editor.cpp index be6d2a6..9a8da58 100644 --- a/src/run_modes/editor/editor.cpp +++ b/src/run_modes/editor/editor.cpp @@ -181,75 +181,50 @@ namespace editor // FILE if (mDoNewProject) { - if (!mFileBrowser.IsOpen()) + if (mFileBrowser.GetResult() == FileBrowser::Result::OK) { - mFileBrowser.SetSelectionMode(FileBrowser::SelectionMode::FILES_ONLY); - mFileBrowser.SetPrompt("Pick a location and name for the project"); - if (!mFileBrowser.OpenInDirectory("")) + mpPath = mFileBrowser.GetSelectedItem(); + Logger::Log(LogCat, LogLevel::INFO, "Generating new project at %s", mpPath->string().c_str()); + + // Generate new project at mpPath + OpRes result = mProject.GenerateProject(mpPath->filename().string(), mpPath->parent_path()); + if (Failed(result)) { - mDoNewProject = false; - Logger::Log(LogCat, LogLevel::ERROR, "Could not open the File Browser"); + Logger::Log(LogCat, LogLevel::ERROR, "Could not create a new project: %s", result.Description); } + ((AssetBrowser*)mPanelManager.GetPanel(PanelType::PT_ASSET_BROWSER))->SetAssetDirectory(*mpPath / std::filesystem::path("contents/assets")); + mDoNewProject = false; } - else + else if (mFileBrowser.GetResult() == FileBrowser::Result::CANCEL) { - if (mFileBrowser.GetResult() == FileBrowser::Result::OK) - { - mpPath = mFileBrowser.GetSelectedItem(); - Logger::Log(LogCat, LogLevel::INFO, "Generating new project at %s", mpPath->string().c_str()); - - // Generate new project at mpPath - OpRes result = mProject.GenerateProject(mpPath->filename().string(), mpPath->parent_path()); - if (Failed(result)) - { - Logger::Log(LogCat, LogLevel::ERROR, "Could not create a new project: %s", result.Description); - } - ((AssetBrowser*)mPanelManager.GetPanel(PanelType::PT_ASSET_BROWSER))->SetAssetDirectory(*mpPath / std::filesystem::path("contents/assets")); - mDoNewProject = false; - } - else if (mFileBrowser.GetResult() == FileBrowser::Result::CANCEL) - { - Logger::Log(LogCat, LogLevel::INFO, "New Project operation cancelled"); - mDoNewProject = false; - } - - } + Logger::Log(LogCat, LogLevel::INFO, "New Project operation cancelled"); + mDoNewProject = false; + } + } if (mDoOpenProject) { - if (!mFileBrowser.IsOpen()) + if (mFileBrowser.GetResult() == FileBrowser::Result::OK) { - mFileBrowser.SetSelectionMode(FileBrowser::SelectionMode::FILES_ONLY); - mFileBrowser.SetPrompt("Pick a location and name for the project"); - if (!mFileBrowser.OpenInDirectory("")) + mpPath = mFileBrowser.GetSelectedItem(); + Logger::Log(LogCat, LogLevel::INFO, "Generating new project at %s", mpPath->string().c_str()); + + // Open project at mpPath + OpRes result = mProject.LoadProject(*mpPath); + if (Failed(result)) { - mDoNewProject = false; - Logger::Log(LogCat, LogLevel::ERROR, "Could not open the File Browser"); + Logger::Log(LogCat, LogLevel::ERROR, "Could not open project: %s -- reason: %s", mpPath->string().c_str(), result.Description); } + ((AssetBrowser*)mPanelManager.GetPanel(PanelType::PT_ASSET_BROWSER))->SetAssetDirectory(*mpPath / std::filesystem::path("contents/assets")); + mDoOpenProject = false; } - else + else if (mFileBrowser.GetResult() == FileBrowser::Result::CANCEL) { - if (mFileBrowser.GetResult() == FileBrowser::Result::OK) - { - mpPath = mFileBrowser.GetSelectedItem(); - Logger::Log(LogCat, LogLevel::INFO, "Generating new project at %s", mpPath->string().c_str()); - - // Open project at mpPath - OpRes result = mProject.LoadProject(*mpPath); - if (Failed(result)) - { - Logger::Log(LogCat, LogLevel::ERROR, "Could not open project: %s -- reason: %s", mpPath->string().c_str(), result.Description); - } - ((AssetBrowser*)mPanelManager.GetPanel(PanelType::PT_ASSET_BROWSER))->SetAssetDirectory(*mpPath / std::filesystem::path("contents/assets")); - mDoOpenProject = false; - } - else if (mFileBrowser.GetResult() == FileBrowser::Result::CANCEL) - { - Logger::Log(LogCat, LogLevel::INFO, "Open Project operation cancelled"); - mDoOpenProject = false; - } - } + Logger::Log(LogCat, LogLevel::INFO, "Open Project operation cancelled"); + mDoOpenProject = false; + } + } if (mDoSaveProject) @@ -288,11 +263,26 @@ namespace editor if (ImGui::MenuItem("New Project")) { mDoNewProject = true; + mFileBrowser.SetSelectionMode(FileBrowser::SelectionMode::FILES_ONLY); + mFileBrowser.SetPrompt("Pick a location and name for the project"); + if (!mFileBrowser.OpenInDirectory("")) + { + mDoNewProject = false; + Logger::Log(LogCat, LogLevel::ERROR, "Could not open the File Browser"); + } + } if (ImGui::MenuItem("Open Project")) { mDoOpenProject = true; + mFileBrowser.SetSelectionMode(FileBrowser::SelectionMode::FILES_ONLY); + mFileBrowser.SetPrompt("Pick a location and name for the project"); + if (!mFileBrowser.OpenInDirectory("")) + { + mDoOpenProject = false; + Logger::Log(LogCat, LogLevel::ERROR, "Could not open the File Browser"); + } } if (ImGui::MenuItem("Save Project")) diff --git a/src/run_modes/editor/tools/map_editor/map_editor.cpp b/src/run_modes/editor/tools/map_editor/map_editor.cpp index bb070ce..60c7ab1 100644 --- a/src/run_modes/editor/tools/map_editor/map_editor.cpp +++ b/src/run_modes/editor/tools/map_editor/map_editor.cpp @@ -10,18 +10,24 @@ #include #include +#include #include #include #include +#include "tile_set.h" +#include "tile_map.h" // Panels #include "panels/map_canvas.h" #include "panels/tile_set_view.h" +// TEMP +#include + namespace lunarium { namespace editor { MapEditor::MapEditor() - : mpEditor(nullptr), mIsOpen(false), mMapLoaded(false) + : mpEditor(nullptr), mIsOpen(false), mMapLoaded(false), mImportTileSet(false), mTileSetNextID(0) { } @@ -51,10 +57,22 @@ namespace lunarium { namespace editor void MapEditor::Shutdown() { mpEditor = nullptr; + + // Free Tilesets + mPanelManager.Shutdown(); + for (auto i = mTileSets.begin(); i != mTileSets.end(); i++) + { + delete i->second->GetImage(); + delete i->second; + } + + mTileSets.clear(); } void MapEditor::OnTick(double delta) { + HandleMenuEvents(); + mPanelManager.OnTick(delta); } @@ -77,11 +95,16 @@ namespace lunarium { namespace editor } DoMenu(); - mPanelManager.MakeDockSpaces(); + mPanelManager.MakeDockSpaces(); ImGui::End(); mPanelManager.RenderPanels(); + + if (mFileBrowser.IsOpen()) + { + mFileBrowser.DoFrame(); + } return true; } @@ -136,6 +159,19 @@ namespace lunarium { namespace editor if (ImGui::BeginMenu("File")) { + if (ImGui::MenuItem("Import Tile Set")) + { + mImportTileSet = true; + mFileBrowser.SetSelectionMode(FileBrowser::SelectionMode::FILES_ONLY); + mFileBrowser.SetPrompt("Find the tile set image"); + if (!mFileBrowser.OpenInDirectory("")) + { + mImportTileSet = false; + Logger::Log(Editor::LogCat, LogLevel::ERROR, "Could not open the File Browser"); + } + } + + ImGui::Separator(); if (ImGui::MenuItem("Exit")) { Close(); @@ -166,6 +202,52 @@ namespace lunarium { namespace editor void MapEditor::HandleMenuEvents() { + if (mImportTileSet) + { + if (mFileBrowser.GetResult() == FileBrowser::Result::OK) + { + auto path = mFileBrowser.GetSelectedItem(); + Logger::Log(Editor::LogCat, LogLevel::INFO, "Importing tile set: %s", path->string().c_str()); + + // For now just directly load the file and make a tileset out of it + int w, h, n; + //stbi_set_flip_vertically_on_load(1); + unsigned char* buffer = stbi_load(path->string().c_str(), &w, &h, &n, 0); + + Image* i = new Image(); + i->SetData(buffer); + i->SetFormat(ImageFormat::RGBA); + + if (n == 3) + { + i->SetFormat(ImageFormat::RGB); + } + + i->SetWidth(w); + i->SetHeight(h); + + Core::Graphics().RegisterImage(*i); + + TileSet* ts = new TileSet(); + ts->SetFileLocation(*path); + ts->SetImage(i); + ts->SetTileSize({16, 16}); // NOTE: Hardcoding the tile size for testing + + mTileSets[mTileSetNextID] = ts; + mTileSetNextID++; + + // FOR TESTING + ((TileSetView*)mPanelManager.GetPanel(gui::PanelType::PT_TILE_SET_VIEW))->SetTileSet(ts); + + mImportTileSet = false; + } + else if (mFileBrowser.GetResult() == FileBrowser::Result::CANCEL) + { + Logger::Log(Editor::LogCat, LogLevel::INFO, "New Project operation cancelled"); + mImportTileSet = false; + } + + } } }} diff --git a/src/run_modes/editor/tools/map_editor/map_editor.h b/src/run_modes/editor/tools/map_editor/map_editor.h index e17cf1e..fc3b2fa 100644 --- a/src/run_modes/editor/tools/map_editor/map_editor.h +++ b/src/run_modes/editor/tools/map_editor/map_editor.h @@ -10,9 +10,11 @@ #define MAP_EDITOR_H_ #include +#include #include #include #include "../../panel_manager.h" +#include namespace lunarium { class IGraphics; @@ -23,6 +25,7 @@ namespace lunarium { namespace editor { + class TileSet; class Editor; class MapEditor { @@ -52,6 +55,14 @@ namespace editor PanelManager mPanelManager; + FileBrowser mFileBrowser; + + int mTileSetNextID; + std::map mTileSets; + + // Menu Events + bool mImportTileSet; + private: void DoMenu(); void HandleMenuEvents(); diff --git a/src/run_modes/editor/tools/map_editor/panels/tile_set_view.cpp b/src/run_modes/editor/tools/map_editor/panels/tile_set_view.cpp index 6ada280..3d00f8b 100644 --- a/src/run_modes/editor/tools/map_editor/panels/tile_set_view.cpp +++ b/src/run_modes/editor/tools/map_editor/panels/tile_set_view.cpp @@ -14,6 +14,7 @@ #include #include +#include namespace lunarium { namespace editor { @@ -42,6 +43,10 @@ namespace lunarium { namespace editor mpTileSet->Render(&Core::Graphics()); mpViewImage = Core::GetInstance().EndRenderToTexture(); Core::Graphics().SetClearColor(prev); + + //stbi_flip_vertically_on_write(1); + stbi_write_png("tileset_test_image.png", mpViewImage->GetWidth(), mpViewImage->GetHeight(), 4, + mpViewImage->GetData(), mpViewImage->GetWidth() * 4); } } } diff --git a/src/run_modes/editor/tools/map_editor/tile_set.cpp b/src/run_modes/editor/tools/map_editor/tile_set.cpp index 89bc469..7d48105 100644 --- a/src/run_modes/editor/tools/map_editor/tile_set.cpp +++ b/src/run_modes/editor/tools/map_editor/tile_set.cpp @@ -20,6 +20,11 @@ namespace lunarium { namespace editor } + void TileSet::SetFileLocation(std::filesystem::path path) + { + mFileLocation = path; + } + void TileSet::SetImage(Image* image) { mSetImage = image; @@ -32,6 +37,11 @@ namespace lunarium { namespace editor mNumTiles.Height = mSetImage->GetHeight() / mTileSize.Height; } + std::filesystem::path TileSet::GetFileLocation() + { + return mFileLocation; + } + Image* TileSet::GetImage() { return mSetImage; diff --git a/src/run_modes/editor/tools/map_editor/tile_set.h b/src/run_modes/editor/tools/map_editor/tile_set.h index c790081..d2835bd 100644 --- a/src/run_modes/editor/tools/map_editor/tile_set.h +++ b/src/run_modes/editor/tools/map_editor/tile_set.h @@ -10,6 +10,7 @@ #define TILE_SET_H_ #include +#include namespace lunarium { class Image; class IGraphics; } @@ -20,9 +21,11 @@ namespace lunarium { namespace editor public: TileSet(); + void SetFileLocation(std::filesystem::path path); void SetImage(Image* image); void SetTileSize(Sizei size); + std::filesystem::path GetFileLocation(); Image* GetImage(); Sizei GetTileSize(); Rectangle GetTileRect(Vec2i index); @@ -30,6 +33,7 @@ namespace lunarium { namespace editor void Render(lunarium::IGraphics* g); private: + std::filesystem::path mFileLocation; Image* mSetImage; Sizei mTileSize; // in pixels, must be a square power of 2 Sizei mNumTiles; diff --git a/src/run_modes/tester/scenes/simpleRenderScene.cpp b/src/run_modes/tester/scenes/simpleRenderScene.cpp index b0ee66a..6c8f002 100644 --- a/src/run_modes/tester/scenes/simpleRenderScene.cpp +++ b/src/run_modes/tester/scenes/simpleRenderScene.cpp @@ -14,6 +14,7 @@ #include #include #include +#include namespace lunarium { @@ -26,6 +27,7 @@ namespace lunarium SimpleRenderScene::~SimpleRenderScene() { delete *mGrid[{5, 5}]; + delete mpTestImageLoad; } void SimpleRenderScene::OnLoad() @@ -42,6 +44,25 @@ namespace lunarium mFrameBufferOne = Core::Graphics().CreateRenderTexture(mImageSize.Width, mImageSize.Height, 4); mFrameBufferTwo = Core::Graphics().CreateRenderTexture(1024, 1024, 4); + // Load test image + int w, h, n; + stbi_set_flip_vertically_on_load(1); + unsigned char* buffer = stbi_load("LinkToThePast1_sized.png", &w, &h, &n, 0); + + mpTestImageLoad = new Image(); + mpTestImageLoad->SetData(buffer); + mpTestImageLoad->SetFormat(ImageFormat::RGBA); + + if (n == 3) + { + mpTestImageLoad->SetFormat(ImageFormat::RGB); + } + + mpTestImageLoad->SetWidth(w); + mpTestImageLoad->SetHeight(h); + + Core::Graphics().RegisterImage(*mpTestImageLoad); + angle = 0.0f; box_angle = 0.0f; @@ -153,5 +174,9 @@ namespace lunarium g->DrawBox(Rectangle(400, 400, 128.0f, 128.0f), Color(0.0f, 1.0f, 0.0f, 1.0f), 2.0f, box_angle); g->DrawString((*mGrid[{-2, 0,}])->msg.c_str(), Rectangle::MakeFromTopLeft(200.0f, 500.0f, 500.0f, 200.0f), Color(0.5f, 0.0f, 0.75f, 1.0f)); + + //g->DrawImage(*mpTestImageLoad, glm::vec2(0.0f, 0.0f), Color::White()); + // g->DrawImage(*mpTestImageLoad, Rectangle::MakeFromTopLeft(0.0f, 0.0f, (float)mpTestImageLoad->GetWidth(), (float)mpTestImageLoad->GetHeight()), + // Rectangle::MakeFromTopLeft(0.0f, 0.0f, (float)mpTestImageLoad->GetWidth(), (float)mpTestImageLoad->GetHeight()), Color::White()); } } \ No newline at end of file diff --git a/src/run_modes/tester/scenes/simpleRenderScene.h b/src/run_modes/tester/scenes/simpleRenderScene.h index bc2854c..3faed9a 100644 --- a/src/run_modes/tester/scenes/simpleRenderScene.h +++ b/src/run_modes/tester/scenes/simpleRenderScene.h @@ -31,6 +31,7 @@ namespace lunarium int mTextBoxWidth; Sizei mImageSize; Image* mpRenderedImage; + Image* mpTestImageLoad; int mFrameBufferOne; int mFrameBufferTwo; float angle;