Tile set rendering working

Gui_Panel_Refactor
Joeyrp 4 years ago
parent 22fee91f15
commit 3377dda894

@ -105,9 +105,15 @@ namespace lunarium
void OglGraphics::Shutdown()
{
// Clean up frame buffers
std::vector<int> 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)

@ -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)
{

@ -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];

@ -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"))

@ -10,18 +10,24 @@
#include <core/core.h>
#include <graphics/graphics.h>
#include <assets/types/image.h>
#include <editor/editor.h>
#include <gui/panel.h>
#include <gui/dearimgui/imgui.h>
#include "tile_set.h"
#include "tile_map.h"
// Panels
#include "panels/map_canvas.h"
#include "panels/tile_set_view.h"
// TEMP
#include <utils/stb/stb_image.h>
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;
}
}
}
}}

@ -10,9 +10,11 @@
#define MAP_EDITOR_H_
#include <vector>
#include <map>
#include <string>
#include <utils/opRes.h>
#include "../../panel_manager.h"
#include <gui/file_browser.h>
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<int, TileSet*> mTileSets;
// Menu Events
bool mImportTileSet;
private:
void DoMenu();
void HandleMenuEvents();

@ -14,6 +14,7 @@
#include <core/core.h>
#include <graphics/graphics.h>
#include <utils/stb/std_image_write.h>
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);
}
}
}

@ -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;

@ -10,6 +10,7 @@
#define TILE_SET_H_
#include <core/types.h>
#include <filesystem>
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;

@ -14,6 +14,7 @@
#include <input/inputManager.h>
#include <assets/types/image.h>
#include <utils/stb/std_image_write.h>
#include <utils/stb/stb_image.h>
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());
}
}

@ -31,6 +31,7 @@ namespace lunarium
int mTextBoxWidth;
Sizei mImageSize;
Image* mpRenderedImage;
Image* mpTestImageLoad;
int mFrameBufferOne;
int mFrameBufferTwo;
float angle;

Loading…
Cancel
Save