MapEditor design fleshed out but render code not yet tested
parent
f4e5de912d
commit
22fee91f15
@ -0,0 +1,102 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* File - tile_set_view.cpp
|
||||||
|
* Author - Joey Pollack
|
||||||
|
* Date - 2022/02/16 (y/m/d)
|
||||||
|
* Mod Date - 2022/02/16 (y/m/d)
|
||||||
|
* Description - panel for viewing the current tile set
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include "tile_set_view.h"
|
||||||
|
#include "../map_editor.h"
|
||||||
|
#include "../tile_set.h"
|
||||||
|
#include <assets/types/image.h>
|
||||||
|
#include <editor/editor.h>
|
||||||
|
#include <core/core.h>
|
||||||
|
#include <graphics/graphics.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace lunarium { namespace editor
|
||||||
|
{
|
||||||
|
TileSetView::TileSetView(MapEditor* editor)
|
||||||
|
: Panel(gui::PanelType::PT_TILE_SET_VIEW, "Tile Set View", gui::PanelDockZone::DDZ_RIGHT, true),
|
||||||
|
mpEditor(editor), mpTileSet(nullptr), mpViewImage(nullptr), mFrameBuffer(-1),
|
||||||
|
mViewOffset({0, 0}), mViewZoom(1.0f)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileSetView::Update(float delta)
|
||||||
|
{
|
||||||
|
if (!mpViewImage)
|
||||||
|
{
|
||||||
|
if (mpTileSet)
|
||||||
|
{
|
||||||
|
if (mFrameBuffer == -1)
|
||||||
|
{
|
||||||
|
mFrameBuffer = Core::Graphics().CreateRenderTexture(mpTileSet->GetImage()->GetWidth(), mpTileSet->GetImage()->GetHeight(), 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
Color prev = Core::Graphics().GetClearColor();
|
||||||
|
Core::Graphics().SetClearColor(Color::Transparent());
|
||||||
|
Core::GetInstance().BeginRenderToTexture(mFrameBuffer).LogIfFailed(Editor::LogCat);
|
||||||
|
mpTileSet->Render(&Core::Graphics());
|
||||||
|
mpViewImage = Core::GetInstance().EndRenderToTexture();
|
||||||
|
Core::Graphics().SetClearColor(prev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TileSetView::DoFrame()
|
||||||
|
{
|
||||||
|
if (!mIsOpen)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!ImGui::Begin(GetName(), &mIsOpen))
|
||||||
|
{
|
||||||
|
ImGui::End();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImVec2 pos = ImGui::GetWindowPos();
|
||||||
|
ImVec2 size = ImGui::GetWindowSize();
|
||||||
|
|
||||||
|
// Adjust for the tab bar
|
||||||
|
pos.y += ImGui::GetFrameHeight();
|
||||||
|
size.y -= ImGui::GetFrameHeight();
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
float x = io.MousePos.x - pos.x;
|
||||||
|
float y = io.MousePos.y - pos.y;
|
||||||
|
|
||||||
|
|
||||||
|
if (mpViewImage)
|
||||||
|
{
|
||||||
|
ImGui::Image((ImTextureID)mpViewImage->GetGLTextureID64(), ImVec2(mpViewImage->GetWidth(), mpViewImage->GetHeight()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: If a tile on the map was changed this frame null out the canvas image so it will be redrawn
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::End();
|
||||||
|
return mIsOpen;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileSetView::SetTileSet(TileSet* set)
|
||||||
|
{
|
||||||
|
mpTileSet = set;
|
||||||
|
}
|
||||||
|
|
||||||
|
TileSet* TileSetView::GetTileSet()
|
||||||
|
{
|
||||||
|
return mpTileSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileSetView::Invalidate(bool remake_frame_buffer)
|
||||||
|
{
|
||||||
|
mpViewImage = nullptr;
|
||||||
|
if (remake_frame_buffer)
|
||||||
|
{
|
||||||
|
Core::Graphics().DestroyRenderTexture(mFrameBuffer);
|
||||||
|
mFrameBuffer = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}}
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* File - tile_set_view.h
|
||||||
|
* Author - Joey Pollack
|
||||||
|
* Date - 2022/02/16 (y/m/d)
|
||||||
|
* Mod Date - 2022/02/16 (y/m/d)
|
||||||
|
* Description - panel for viewing the current tile set
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TILE_SET_VIEW_H_
|
||||||
|
#define TILE_SET_VIEW_H_
|
||||||
|
|
||||||
|
#include <gui/panel.h>
|
||||||
|
#include <core/types.h>
|
||||||
|
|
||||||
|
namespace lunarium { class Image; }
|
||||||
|
|
||||||
|
namespace lunarium { namespace editor
|
||||||
|
{
|
||||||
|
class MapEditor;
|
||||||
|
class TileSet;
|
||||||
|
class TileSetView : public gui::Panel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TileSetView(MapEditor* editor);
|
||||||
|
|
||||||
|
void Update(float delta);
|
||||||
|
bool DoFrame();
|
||||||
|
|
||||||
|
void SetTileSet(TileSet* set);
|
||||||
|
TileSet* GetTileSet();
|
||||||
|
|
||||||
|
void Invalidate(bool remake_frame_buffer = false);
|
||||||
|
|
||||||
|
private:
|
||||||
|
MapEditor* mpEditor;
|
||||||
|
TileSet* mpTileSet;
|
||||||
|
int mFrameBuffer;
|
||||||
|
Image* mpViewImage;
|
||||||
|
Vec2i mViewOffset;
|
||||||
|
float mViewZoom;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
|
||||||
|
#endif // TILE_SET_VIEW_H_
|
||||||
@ -0,0 +1,67 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* File - tile_set.h
|
||||||
|
* Author - Joey Pollack
|
||||||
|
* Date - 2022/02/16 (y/m/d)
|
||||||
|
* Mod Date - 2022/02/16 (y/m/d)
|
||||||
|
* Description - Manage a tile set for map making
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include "tile_set.h"
|
||||||
|
#include <editor/editor.h>
|
||||||
|
#include <graphics/graphics.h>
|
||||||
|
#include <assets/types/image.h>
|
||||||
|
#include <utils/logger.h>
|
||||||
|
|
||||||
|
namespace lunarium { namespace editor
|
||||||
|
{
|
||||||
|
TileSet::TileSet()
|
||||||
|
: mSetImage(nullptr), mTileSize({ 0, 0})
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileSet::SetImage(Image* image)
|
||||||
|
{
|
||||||
|
mSetImage = image;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileSet::SetTileSize(Sizei size)
|
||||||
|
{
|
||||||
|
mTileSize = size;
|
||||||
|
mNumTiles.Width = mSetImage->GetWidth() / mTileSize.Width;
|
||||||
|
mNumTiles.Height = mSetImage->GetHeight() / mTileSize.Height;
|
||||||
|
}
|
||||||
|
|
||||||
|
Image* TileSet::GetImage()
|
||||||
|
{
|
||||||
|
return mSetImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sizei TileSet::GetTileSize()
|
||||||
|
{
|
||||||
|
return mTileSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle TileSet::GetTileRect(Vec2i index)
|
||||||
|
{
|
||||||
|
return Rectangle::MakeFromTopLeft(index.X * mTileSize.Width, index.Y * mTileSize.Height, mTileSize.Width, mTileSize.Height);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileSet::Render(lunarium::IGraphics* g)
|
||||||
|
{
|
||||||
|
g->DrawImage(*mSetImage, glm::vec2(0, 0), Color::White());
|
||||||
|
|
||||||
|
// Draw grid
|
||||||
|
for (int i = 0; i < mNumTiles.Width; i++)
|
||||||
|
{
|
||||||
|
g->DrawLine(glm::vec2(i * mTileSize.Width, 0), glm::vec2(i * mTileSize.Width, mSetImage->GetHeight()), Color::Black(), 1.0f);
|
||||||
|
}
|
||||||
|
g->DrawLine(glm::vec2(mSetImage->GetWidth(), 0), glm::vec2(mSetImage->GetWidth(), mSetImage->GetHeight()), Color::Black(), 1.0f);
|
||||||
|
|
||||||
|
for (int j = 0; j < mNumTiles.Height; j++)
|
||||||
|
{
|
||||||
|
g->DrawLine(glm::vec2(0, j * mTileSize.Height), glm::vec2(mSetImage->GetWidth(), j * mTileSize.Height), Color::Black(), 1.0f);
|
||||||
|
}
|
||||||
|
g->DrawLine(glm::vec2(0, mSetImage->GetHeight()), glm::vec2(mSetImage->GetWidth(), mSetImage->GetHeight()), Color::Black(), 1.0f);
|
||||||
|
}
|
||||||
|
}}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* File - tile_set.h
|
||||||
|
* Author - Joey Pollack
|
||||||
|
* Date - 2022/02/16 (y/m/d)
|
||||||
|
* Mod Date - 2022/02/16 (y/m/d)
|
||||||
|
* Description - Manage a tile set for map making
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TILE_SET_H_
|
||||||
|
#define TILE_SET_H_
|
||||||
|
|
||||||
|
#include <core/types.h>
|
||||||
|
|
||||||
|
namespace lunarium { class Image; class IGraphics; }
|
||||||
|
|
||||||
|
namespace lunarium { namespace editor
|
||||||
|
{
|
||||||
|
class TileSet
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TileSet();
|
||||||
|
|
||||||
|
void SetImage(Image* image);
|
||||||
|
void SetTileSize(Sizei size);
|
||||||
|
|
||||||
|
Image* GetImage();
|
||||||
|
Sizei GetTileSize();
|
||||||
|
Rectangle GetTileRect(Vec2i index);
|
||||||
|
|
||||||
|
void Render(lunarium::IGraphics* g);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Image* mSetImage;
|
||||||
|
Sizei mTileSize; // in pixels, must be a square power of 2
|
||||||
|
Sizei mNumTiles;
|
||||||
|
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
|
||||||
|
#endif // TILE_SET_H_
|
||||||
Loading…
Reference in New Issue