From 9c37b8176562524189f614940f8ceff657fd53c4 Mon Sep 17 00:00:00 2001 From: Joey Pollack Date: Wed, 31 Aug 2022 16:23:20 -0400 Subject: [PATCH] FINISHED! --- docs/tasks/editor.todo | 2 + docs/tasks/refactoring.todo | 14 ++--- src/renderer/renderer2D.cpp | 5 ++ src/renderer/renderer2D.h | 1 + src/run_modes/editor/contents/tile_map.cpp | 30 ++++++----- src/run_modes/editor/contents/tile_map.h | 4 ++ src/run_modes/editor/contents/tile_set.cpp | 30 ++++++----- src/run_modes/editor/editor.cpp | 16 ++++++ .../tools/map_editor/panels/map_canvas.cpp | 28 ++++++---- .../tools/map_editor/panels/map_canvas.h | 4 +- .../tools/map_editor/panels/tile_set_view.cpp | 33 +++++++----- .../testbed/scenes/simple_render_scene.cpp | 52 ++++++++++++++++--- .../testbed/scenes/simple_render_scene.h | 8 +++ 13 files changed, 161 insertions(+), 66 deletions(-) diff --git a/docs/tasks/editor.todo b/docs/tasks/editor.todo index 30f3d24..3b94bb3 100644 --- a/docs/tasks/editor.todo +++ b/docs/tasks/editor.todo @@ -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: diff --git a/docs/tasks/refactoring.todo b/docs/tasks/refactoring.todo index 2e9a9d3..74b7e0c 100644 --- a/docs/tasks/refactoring.todo +++ b/docs/tasks/refactoring.todo @@ -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) diff --git a/src/renderer/renderer2D.cpp b/src/renderer/renderer2D.cpp index 61a5ab7..4d6a0fb 100644 --- a/src/renderer/renderer2D.cpp +++ b/src/renderer/renderer2D.cpp @@ -115,6 +115,11 @@ namespace lunarium Rectangle quad = Rectangle::MakeFromTopLeft(position.x, position.y, sub_texture_area.width(), sub_texture_area.height()); 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) { diff --git a/src/renderer/renderer2D.h b/src/renderer/renderer2D.h index fb61aae..03ad1fe 100644 --- a/src/renderer/renderer2D.h +++ b/src/renderer/renderer2D.h @@ -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)); diff --git a/src/run_modes/editor/contents/tile_map.cpp b/src/run_modes/editor/contents/tile_map.cpp index 4765f0a..0594b58 100644 --- a/src/run_modes/editor/contents/tile_map.cpp +++ b/src/run_modes/editor/contents/tile_map.cpp @@ -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() + { + } }} diff --git a/src/run_modes/editor/contents/tile_map.h b/src/run_modes/editor/contents/tile_map.h index 1b95504..e316ebb 100644 --- a/src/run_modes/editor/contents/tile_map.h +++ b/src/run_modes/editor/contents/tile_map.h @@ -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; diff --git a/src/run_modes/editor/contents/tile_set.cpp b/src/run_modes/editor/contents/tile_set.cpp index 89a6df6..3402c22 100644 --- a/src/run_modes/editor/contents/tile_set.cpp +++ b/src/run_modes/editor/contents/tile_set.cpp @@ -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); } }} \ No newline at end of file diff --git a/src/run_modes/editor/editor.cpp b/src/run_modes/editor/editor.cpp index d76f2b6..68043d4 100644 --- a/src/run_modes/editor/editor.cpp +++ b/src/run_modes/editor/editor.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -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) diff --git a/src/run_modes/editor/tools/map_editor/panels/map_canvas.cpp b/src/run_modes/editor/tools/map_editor/panels/map_canvas.cpp index adbb621..62191ea 100644 --- a/src/run_modes/editor/tools/map_editor/panels/map_canvas.cpp +++ b/src/run_modes/editor/tools/map_editor/panels/map_canvas.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -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(); } } } diff --git a/src/run_modes/editor/tools/map_editor/panels/map_canvas.h b/src/run_modes/editor/tools/map_editor/panels/map_canvas.h index 8606c09..512436f 100644 --- a/src/run_modes/editor/tools/map_editor/panels/map_canvas.h +++ b/src/run_modes/editor/tools/map_editor/panels/map_canvas.h @@ -13,7 +13,7 @@ #include #include -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; 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 ccebbca..2faef22 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 +#include #include #include @@ -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()); + 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); - // } - - // mpViewImage = Core::GetInstance().EndRenderToTexture(); - // Core::Graphics().SetClearColor(prev); - + // 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, diff --git a/src/run_modes/testbed/scenes/simple_render_scene.cpp b/src/run_modes/testbed/scenes/simple_render_scene.cpp index 83cb69d..7b552fc 100644 --- a/src/run_modes/testbed/scenes/simple_render_scene.cpp +++ b/src/run_modes/testbed/scenes/simple_render_scene.cpp @@ -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,8 +353,39 @@ 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(); ImGui::End(); @@ -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() { @@ -467,8 +509,6 @@ namespace lunarium mQuadColors[i].A = 1.0f; } } - - void SimpleRenderScene::DoFrameBufferSaveTest() { diff --git a/src/run_modes/testbed/scenes/simple_render_scene.h b/src/run_modes/testbed/scenes/simple_render_scene.h index 888a86f..f3a2c2e 100644 --- a/src/run_modes/testbed/scenes/simple_render_scene.h +++ b/src/run_modes/testbed/scenes/simple_render_scene.h @@ -15,6 +15,9 @@ #include #include +#include +#include + 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 mEllipses; // + editor::TileMap mTestMap; + editor::TileSet mTestSet; + struct GridTestObj { int X;