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