FINISHED!

master
Joey Pollack 3 years ago
parent 43ac2d1d06
commit 9c37b81765

@ -1,5 +1,6 @@
Editor:
☐ Add button to flip image assets vertically
☐ Design a custom editor style @low
☐ Save and unload world data when a new world is selected
✔ Load the selected world when double clicked on in the asset browser @done(22-07-05 14:29)
@ -70,6 +71,7 @@ Editor:
☐ Stamp system
Tile Map Canvas:
☐ Clicking in a tile is inaccurate in the bottom-right corner of the tile
☐ Implement a proper camera system and do not use panel scrolling @high
Implement drawing tiles:

@ -5,14 +5,14 @@
☐ Binary serializeable
Renderer rewrite:
☐ Re-integrate the new renderer into the editor
✔ Re-integrate the new renderer into the editor @done(22-08-31 16:22)
✔ Clean up class name differences @done(22-08-30 15:58)
Hook up update and render calls between the core and the editor
☐ Re-write render code in map tools and assets
☐ Tilemap
☐ TileSet
☐ MapCanvas
☐ TileSetView
Hook up update and render calls between the core and the editor @done(22-08-31 16:22)
✔ Re-write render code in map tools and assets @done(22-08-31 16:22)
✔ Tilemap @done(22-08-31 16:22)
✔ TileSet @done(22-08-31 16:22)
✔ MapCanvas @done(22-08-31 16:22)
✔ TileSetView @done(22-08-31 16:22)
✔ Add double buffer to the VertexBuffer class with a Flush method to send the verts to the gpu @high @done(22-08-29 15:14)
✔ Add Draw method to the VertexBuffer class @high @done(22-08-29 15:06)
✔ Batch rendering minimally working @done(22-08-12 19:19)

@ -116,6 +116,11 @@ namespace lunarium
DrawQuad(quad, color, texture, angle, sub_texture_area);
}
// void Renderer2D::DrawSprite(Texture* texture, Rectangle destination, Rectangle sub_texture_area, Color color = Color::White(), float angle = 0.0f)
// {
// DrawQuad(destination, color, texture, angle, sub_texture_area);
// }
void Renderer2D::DrawQuad(Rectangle quad, Color color, Texture* texture, float angle, Rectangle sub_texture_area)
{
if (!mQuadData.VertexBuffer->WillFit(4))

@ -48,6 +48,7 @@ namespace lunarium
/// sub_texture_area is the area of the texture to draw
/// position is the top-left corner of the quad
void DrawSprite(Texture* texture, glm::vec2 position, Rectangle sub_texture_area, Color color = Color::White(), float angle = 0.0f);
//void DrawSprite(Texture* texture, Rectangle destination, Rectangle sub_texture_area, Color color = Color::White(), float angle = 0.0f);
/// sub_texture_area is the area of the texture to draw
void DrawQuad(Rectangle quad, Color color, Texture* texture = nullptr, float angle = 0.0f, Rectangle sub_texture_area = Rectangle(-1, -1, -1, -1));

@ -177,7 +177,7 @@ namespace lunarium { namespace editor
Rectangle dest = Rectangle::MakeFromTopLeft(i * mTileSize.Width, j * mTileSize.Height, mTileSize.Width, mTileSize.Height);
Rectangle src = set->GetTileRect(mpMap[i][j].TileIndex);
//g->DrawImage(*set->GetImage(), src, dest, Color::White());
g->DrawSprite(set->GetImage(), glm::vec2(i * mTileSize.Width, j * mTileSize.Height), src);
// DEBUG
//g->DrawImage(*set->GetImage(), glm::vec2(dest.left(), dest.top()), Color::White());
@ -187,16 +187,22 @@ namespace lunarium { namespace editor
}
// Draw grid
// for (int i = 0; i < mSizeInTiles.Width; i++)
// {
// g->DrawLine(glm::vec2(i * mTileSize.Width, 0), glm::vec2(i * mTileSize.Width, map_size_pixels.Height), Color::Black(), 1.0f);
// }
// g->DrawLine(glm::vec2(map_size_pixels.Width, 0), glm::vec2(map_size_pixels.Width, map_size_pixels.Height), Color::Black(), 1.0f);
// for (int j = 0; j < mSizeInTiles.Height; j++)
// {
// g->DrawLine(glm::vec2(0, j * mTileSize.Height), glm::vec2(map_size_pixels.Width, j * mTileSize.Height), Color::Black(), 1.0f);
// }
// g->DrawLine(glm::vec2(0, map_size_pixels.Height), glm::vec2(map_size_pixels.Width, map_size_pixels.Height), Color::Black(), 1.0f);
for (int i = 0; i < mSizeInTiles.Width; i++)
{
g->DrawLine(glm::vec2(i * mTileSize.Width, 0), glm::vec2(i * mTileSize.Width, map_size_pixels.Height), Color::Black(), 1.5f);
}
g->DrawLine(glm::vec2(map_size_pixels.Width, 0), glm::vec2(map_size_pixels.Width, map_size_pixels.Height), Color::Black(), 1.5f);
for (int j = 0; j < mSizeInTiles.Height; j++)
{
g->DrawLine(glm::vec2(0, j * mTileSize.Height), glm::vec2(map_size_pixels.Width, j * mTileSize.Height), Color::Black(), 1.5f);
}
g->DrawLine(glm::vec2(0, map_size_pixels.Height), glm::vec2(map_size_pixels.Width, map_size_pixels.Height), Color::Black(), 1.5f);
}
void TileMap::DrawDebugGUI()
{
}
}}

@ -42,6 +42,10 @@ namespace lunarium { namespace editor
// Call during render to texture phase
void Render(lunarium::Renderer2D* g);
void DrawDebugGUI();
TileRef** GetMap() { return mpMap; };
private:
TileRef** mpMap;
Sizei mSizeInTiles;

@ -26,6 +26,7 @@ namespace lunarium { namespace editor
OpRes TileSet::LoadRawFile()
{
mSetImage = FileLoaders::LoadImage(mAssetDir / GetFileLocation());
mSetImage->FlipVertically();
if (!mSetImage)
{
return OpRes::Fail("Could not load image file: %s", GetFileLocation().string().c_str());
@ -44,6 +45,7 @@ namespace lunarium { namespace editor
// Load Image
mSetImage = FileLoaders::LoadImage(mAssetDir / GetFileLocation());
mSetImage->FlipVertically();
if (!mSetImage)
{
return OpRes::Fail("Could not load image file: %s", GetFileLocation().string().c_str());
@ -153,19 +155,19 @@ namespace lunarium { namespace editor
void TileSet::Render(lunarium::Renderer2D* 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);
g->DrawSprite(mSetImage, glm::vec2(0, 0), Rectangle::MakeFromTopLeft(0, 0, mSetImage->GetWidth(), mSetImage->GetHeight()));
// 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.5f);
}
g->DrawLine(glm::vec2(mSetImage->GetWidth(), 0), glm::vec2(mSetImage->GetWidth(), mSetImage->GetHeight()), Color::Black(), 1.5f);
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.5f);
}
g->DrawLine(glm::vec2(0, mSetImage->GetHeight()), glm::vec2(mSetImage->GetWidth(), mSetImage->GetHeight()), Color::Black(), 1.5f);
}
}}

@ -11,6 +11,7 @@
#include <utils/helpers.h>
#include <gui/panel_manager.h>
#include <core/core.h>
#include <renderer/renderer2D.h>
#include <core/version.h>
#include <utils/logger.h>
#include <internal_data/data_manager.h>
@ -97,6 +98,21 @@ namespace editor
}
HandleMenuEvents();
// Render
int w, h;
Core::MainWindow().GetFramebufferSize(&w, &h);
OrthographicCamera main_cam(Vec2f { 0.0f, 0.0f }, Sizef { (float)w, (float)h });
Core::GUI().NewFrame();
Core::Graphics().ResetFrameStats();
Core::Graphics().BeginDraw(&main_cam);
// No non-gui graphics are drawn
Core::Graphics().EndDraw(); // Graphics end draw must happen before GUI end frame
OnRender(&Core::Graphics());
Core::GUI().EndFrame();
Core::MainWindow().SwapBuffers();
}
void Editor::OnRender(lunarium::Renderer2D* g)

@ -14,6 +14,7 @@
#include <core/core.h>
#include <renderer/renderer2D.h>
#include <renderer/texture.h>
#include <renderer/orthographic_camera.h>
#include <string>
#include <sstream>
@ -22,7 +23,7 @@ namespace lunarium { namespace editor
{
MapCanvas::MapCanvas(MapEditor* editor)
: Panel("Map Canvas", PanelDockZone::DDZ_CENTER, true, ImGuiWindowFlags_NoScrollbar),
mpMapEditor(editor), mpCanvasImage(nullptr), mMap(nullptr), mSelectedTile({-1, -1}), mFrameBuffer(-1), mMapSizeChanged(false),
mpMapEditor(editor), mpCanvasImage(nullptr), mMap(nullptr), mSelectedTile({-1, -1}), mFrameBuffer(nullptr), mMapSizeChanged(false),
mZoomFactor(1.0f), mScrollDragged(false), mCurrentRegion({0, 0}), mRegionString("")
{
mRegionString = std::to_string(mCurrentRegion.X);
@ -109,22 +110,27 @@ namespace lunarium { namespace editor
{
if (mMapSizeChanged)
{
//Core::Graphics().DestroyRenderTexture(mFrameBuffer);
mFrameBuffer = -1;
FrameBuffer::Destroy(&mFrameBuffer);
mFrameBuffer = nullptr;
mMapSizeChanged = false;
}
if (mFrameBuffer == -1)
if (!mFrameBuffer)
{
//mFrameBuffer = Core::Graphics().CreateRenderTexture(mMap->GetSizeInPixels().Width, mMap->GetSizeInPixels().Height, 4);
mFrameBuffer = FrameBuffer::Create(mMap->GetSizeInPixels().Width, mMap->GetSizeInPixels().Height);
}
// Color prev = Core::Graphics().GetClearColor();
// Core::Graphics().SetClearColor(Color::Transparent());
// Core::GetInstance().BeginRenderToTexture(mFrameBuffer).LogIfFailed(Editor::LogCat);
// mMap->Render(&Core::Graphics());
// mpCanvasImage = Core::GetInstance().EndRenderToTexture();
// Core::Graphics().SetClearColor(prev);
Color prev = Core::Graphics().GetClearColor();
Core::Graphics().SetClearColor(Color::Transparent());
mFrameBuffer->Bind();
OrthographicCamera cam(Vec2f{0.0f, 0.0f}, Sizef{(float)mFrameBuffer->GetTexture()->GetWidth(), (float)mFrameBuffer->GetTexture()->GetHeight()});
Renderer2D& g = Core::Graphics();
g.BeginDraw(&cam);
mMap->Render(&g);
g.EndDraw();
Core::Graphics().SetClearColor(prev);
mFrameBuffer->Unbind();
mpCanvasImage = mFrameBuffer->GetTexture();
}
}
}

@ -13,7 +13,7 @@
#include <editor/contents/definitions.h>
#include <string>
namespace lunarium { class Texture; class Renderer2D; }
namespace lunarium { class Texture; class Renderer2D; class FrameBuffer; }
namespace lunarium { namespace editor
{
@ -45,7 +45,7 @@ namespace lunarium { namespace editor
bool mScrollDragged;
float mZoomFactor;
std::string mMouseStatusInfo;
int mFrameBuffer;
lunarium::FrameBuffer* mFrameBuffer;
lunarium::Texture* mpCanvasImage;
TileMap* mMap; // TODO: Replace with a World
TileRef mSelectedTile;

@ -14,6 +14,7 @@
#include <core/core.h>
#include <renderer/renderer2D.h>
#include <renderer/frame_buffer.h>
#include <renderer/orthographic_camera.h>
#include <sstream>
#include <utils/stb/std_image_write.h>
@ -74,23 +75,27 @@ namespace lunarium { namespace editor
mFrameBuffer = FrameBuffer::Create(mpSelectedTileSet->GetImage()->GetWidth(), mpSelectedTileSet->GetImage()->GetHeight());
}
// Color prev = Core::Graphics().GetClearColor();
// Core::Graphics().SetClearColor(Color::Transparent());
// Core::GetInstance().BeginRenderToTexture(mFrameBuffer).LogIfFailed(Editor::LogCat);
Color prev = Core::Graphics().GetClearColor();
Core::Graphics().SetClearColor(Color::Transparent());
mFrameBuffer->Bind();
OrthographicCamera cam(Vec2f{0.0f, 0.0f}, Sizef{(float)mFrameBuffer->GetTexture()->GetWidth(), (float)mFrameBuffer->GetTexture()->GetHeight()});
Renderer2D& g = Core::Graphics();
g.BeginDraw(&cam);
// mpSelectedTileSet->Render(&Core::Graphics());
// // Draw selected tile highlight
// if (mSelectedTile.X >= 0 && mSelectedTile.Y >= 0)
// {
// Rectangle selection = mpSelectedTileSet->GetTileRect(mSelectedTile);
// Core::Graphics().DrawBox(selection, Color::Red(), 1.5f);
// }
// mpViewImage = Core::GetInstance().EndRenderToTexture();
// Core::Graphics().SetClearColor(prev);
mpSelectedTileSet->Render(&g);
// Draw selected tile highlight
if (mSelectedTile.X >= 0 && mSelectedTile.Y >= 0)
{
Rectangle selection = mpSelectedTileSet->GetTileRect(mSelectedTile);
Core::Graphics().DrawBox(selection, Color::Red(), 1.5f);
}
g.EndDraw();
Core::Graphics().SetClearColor(prev);
mFrameBuffer->Unbind();
mpViewImage = mFrameBuffer->GetTexture();
//mpViewImage->FlipVertically();
// //stbi_flip_vertically_on_write(1);
// stbi_write_png("tileset_test_image.png", mpViewImage->GetWidth(), mpViewImage->GetHeight(), 4,

@ -28,7 +28,7 @@ namespace lunarium
{
SimpleRenderScene::SimpleRenderScene(uint32_t logCat)
: BaseScene(logCat), mTestMode(TestMode::Basic), mShapeMode(ShapeMode::Lines), mFrameTime(0.0), mNumFrames(0), mpTestImageLoad3(nullptr),
mEllipseResolution(50), mEllipseRadii{ 100.0f, 100.0f }
mEllipseResolution(50), mEllipseRadii{ 100.0f, 100.0f }, mTestMap({ 16, 16 })
{
srand((u32)time(0));
}
@ -182,6 +182,7 @@ namespace lunarium
case TestMode::Stress: RenderBatchStressTest(Core::Graphics()); break;
case TestMode::String: RenderStringTest(Core::Graphics()); break;
case TestMode::Shapes: RenderShapesTest(Core::Graphics()); break;
case TestMode::TileMap: RenderTileMapTest(Core::Graphics()); break;
}
@ -278,19 +279,24 @@ namespace lunarium
}
void SimpleRenderScene::RenderTileMapTest(Renderer2D& g)
{
mTestMap.Render(&g);
}
/////////////////////////////////////////////////////////////////////
// GUI DRAWING GUI DRAWING
/////////////////////////////////////////////////////////////////////
void SimpleRenderScene::DrawStatsGUI()
{
const char* mode_names[4] = { "Basic", "Stress", "String", "Shapes" };
const char* mode_names[5] = { "Basic", "Stress", "String", "Shapes", "TileMap"};
ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_FirstUseEver);
ImGui::SetNextWindowSize(ImVec2(400, 800));
ImGui::Begin("RENDER INFO");
ImGui::BeginChild("Scene Info", ImVec2(ImGui::GetWindowSize().x - 15, ImGui::GetFrameHeightWithSpacing() * 3.5f), true);
ImGui::Text("Scene Info");
ImGui::Separator();
ImGui::Combo("Scene Mode", (int*)&mTestMode, mode_names, 4);
ImGui::Combo("Scene Mode", (int*)&mTestMode, mode_names, 5);
ImGui::EndChild();
ImGui::BeginChild("Per Frame", ImVec2(ImGui::GetWindowSize().x - 15, ImGui::GetFrameHeightWithSpacing() * 3.5f), true);
ImGui::Text("Per Frame");
@ -347,6 +353,37 @@ namespace lunarium
GenerateEllipses();
}
}
else if (mTestMode == TestMode::TileMap)
{
ImGui::Begin("TileSet View");
ImGui::Image((ImTextureID)mpTestImageLoad->GetGLID64(), ImVec2(mpTestImageLoad->GetWidth(), mpTestImageLoad->GetHeight()));
ImGui::End();
ImGui::BeginChild("TileMap Editor", ImVec2(ImGui::GetWindowSize().x - 15, ImGui::GetFrameHeightWithSpacing() * 6.5f), true, ImGuiWindowFlags_HorizontalScrollbar);
for (int i = 0; i < mTestMap.GetSizeInTiles().Width; i++)
{
for (int j = 0; j < mTestMap.GetSizeInTiles().Height; j++)
{
std::string id = "##idx";
id += std::to_string(i);
id += ", ";
id += std::to_string(j);
int v[2] = { mTestMap.GetMap()[i][j].TileIndex.X, mTestMap.GetMap()[i][j].TileIndex.Y };
ImGui::SetNextItemWidth(65);
if (ImGui::InputInt2(id.c_str(), v))
{
mTestMap.SetTile(editor::TileRef {0, v[0], v[1] }, Vec2i { i, j });
}
if (j + 1 < mTestMap.GetSizeInTiles().Height)
{
ImGui::SameLine();
}
}
}
ImGui::EndChild();
}
ImGui::EndChild();
@ -411,6 +448,12 @@ namespace lunarium
mpTestImageLoad3 = Texture::Create(buffer, w, h, format);
delete[] buffer;
mTestSet.SetImage(mpTestImageLoad);
mTestSet.SetTileSize({16, 16});
mTestMap.AddTileSet(0, &mTestSet).LogIfFailed(mLogCat);
mTestMap.ResizeMap({4, 4});
mTestMap.ClearMap();
}
void SimpleRenderScene::GenerateLines()
@ -436,7 +479,6 @@ namespace lunarium
}
}
void SimpleRenderScene::GenerateEllipses()
{
@ -468,8 +510,6 @@ namespace lunarium
}
}
void SimpleRenderScene::DoFrameBufferSaveTest()
{
// Test writing out a rendered image with transparency

@ -15,6 +15,9 @@
#include <utils/high_resolution_timer.h>
#include <string>
#include <run_modes/editor/contents/tile_map.h>
#include <run_modes/editor/contents/tile_set.h>
namespace lunarium
{
class Texture;
@ -27,6 +30,7 @@ namespace lunarium
Stress,
String,
Shapes,
TileMap,
};
enum ShapeMode
@ -45,6 +49,7 @@ namespace lunarium
void RenderBatchStressTest(Renderer2D& g);
void RenderStringTest(Renderer2D& g);
void RenderShapesTest(Renderer2D& g);
void RenderTileMapTest(Renderer2D& g);
private:
@ -109,6 +114,9 @@ namespace lunarium
std::vector<EllipseData> mEllipses;
//
editor::TileMap mTestMap;
editor::TileSet mTestSet;
struct GridTestObj
{
int X;

Loading…
Cancel
Save