From e16b0f1081306b8fea7bf97e79ebd99145f306c2 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Wed, 17 Sep 2025 17:17:43 +0300 Subject: [PATCH] New grids offset to window center --- src/DrawCamera.cpp | 4 ++-- src/DrawingProgram/GridModifyTool.cpp | 16 ++++++++++++++++ src/GridManager.cpp | 4 ++++ src/World.cpp | 8 ++++---- src/WorldGrid.cpp | 7 ++++--- src/WorldGrid.hpp | 2 ++ 6 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/DrawCamera.cpp b/src/DrawCamera.cpp index 16aca9d..6a93a6a 100755 --- a/src/DrawCamera.cpp +++ b/src/DrawCamera.cpp @@ -7,8 +7,8 @@ #include DrawCamera::DrawCamera(): - //c({0, 0}, WorldScalar(12), 0.0) - c({"1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, WorldScalar(100), 0.0) + //c({0, 0}, WorldScalar(1000), 0.0) + c({"1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, WorldScalar(100e100), 0.0) {} void DrawCamera::set_based_on_properties(World& w, const WorldVec& newPos, const WorldScalar& newZoom, double newRotate) { diff --git a/src/DrawingProgram/GridModifyTool.cpp b/src/DrawingProgram/GridModifyTool.cpp index 01714bf..8ad4c0d 100644 --- a/src/DrawingProgram/GridModifyTool.cpp +++ b/src/DrawingProgram/GridModifyTool.cpp @@ -10,6 +10,15 @@ GridModifyTool::GridModifyTool(DrawingProgram& initDrawP): void GridModifyTool::set_grid_name(const std::string& gridToModifyName) { gridName = gridToModifyName; + auto gridFoundIt = drawP.world.gridMan.grids.find(gridName); + if(gridFoundIt != drawP.world.gridMan.grids.end()) { + WorldGrid& g = gridFoundIt->second; + CoordSpaceHelper newCam; + newCam.inverseScale = g.size / WorldScalar(WorldGrid::GRID_UNIT_PIXEL_SIZE); + newCam.pos = g.offset - drawP.world.main.window.size.cast() * newCam.inverseScale * WorldScalar(0.5); + newCam.rotation = 0.0; + drawP.world.drawData.cam.smooth_move_to(drawP.world, newCam, drawP.world.main.window.size.cast()); + } } DrawingProgramToolType GridModifyTool::get_type() { @@ -24,6 +33,7 @@ void GridModifyTool::gui_toolbox() { if(gridFoundIt != drawP.world.gridMan.grids.end()) { WorldGrid& g = gridFoundIt->second; t.gui.text_label("Name: " + gridName); + t.gui.checkbox_field("Visible", "Visible", &g.visible); size_t typeSelected = static_cast(g.gridType); std::vector listOfGridTypes = { "Circle Points", @@ -61,6 +71,12 @@ bool GridModifyTool::prevent_undo_or_redo() { } void GridModifyTool::draw(SkCanvas* canvas, const DrawData& drawData) { + auto gridFoundIt = drawP.world.gridMan.grids.find(gridName); + if(gridFoundIt != drawP.world.gridMan.grids.end()) { + WorldGrid& g = gridFoundIt->second; + Vector2f gOffset = drawData.cam.c.to_space(g.offset); + canvas->drawCircle(gOffset.x(), gOffset.y(), 5.0f, SkPaint{SkColor4f{1.0f, 0.0f, 0.0f, 1.0f}}); + } } void GridModifyTool::switch_tool(DrawingProgramToolType newTool) { diff --git a/src/GridManager.cpp b/src/GridManager.cpp index 0069b2d..b8537df 100644 --- a/src/GridManager.cpp +++ b/src/GridManager.cpp @@ -1,5 +1,6 @@ #include "GridManager.hpp" #include "World.hpp" +#include "MainProgram.hpp" GridManager::GridManager(World& w): world(w) {} @@ -10,6 +11,9 @@ void GridManager::init_client_callbacks() { void GridManager::add_grid(const std::string& name) { WorldGrid g; g.color = color_mul_alpha(convert_vec4(world.canvasTheme.toolFrontColor), 0.6f); + g.set_subdivisions(7); + g.size = world.drawData.cam.c.inverseScale * WorldScalar(WorldGrid::GRID_UNIT_PIXEL_SIZE); + g.offset = world.drawData.cam.c.pos + world.drawData.cam.c.dir_from_space(world.main.window.size.cast() * 0.5f); grids[name] = g; changed = true; } diff --git a/src/World.cpp b/src/World.cpp index 869a0e5..6f0b158 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -64,10 +64,10 @@ World::World(MainProgram& initMain, OpenWorldInfo& worldInfo): init_client_callbacks(); con.client_send_items_to_server(RELIABLE_COMMAND_CHANNEL, SERVER_INITIAL_DATA, displayName, false); - gridMan.add_grid("b"); - gridMan.grids["b"].size = WorldScalar(1000); - gridMan.grids["b"].set_remove_divisions_outwards(false); - gridMan.grids["b"].gridType = WorldGrid::GridType::CIRCLE_POINTS; + //gridMan.add_grid("b"); + //gridMan.grids["b"].size = WorldScalar(1000); + //gridMan.grids["b"].set_remove_divisions_outwards(false); + //gridMan.grids["b"].gridType = WorldGrid::GridType::CIRCLE_POINTS; } void World::init_client_callbacks() { diff --git a/src/WorldGrid.cpp b/src/WorldGrid.cpp index d943dc7..d0513f5 100644 --- a/src/WorldGrid.cpp +++ b/src/WorldGrid.cpp @@ -8,6 +8,7 @@ sk_sp WorldGrid::squarePointEffect; sk_sp WorldGrid::squareLinesEffect; sk_sp WorldGrid::ruledEffect; Vector2f WorldGrid::oldWindowSize = Vector2f{0.0f, 0.0f}; +unsigned WorldGrid::GRID_UNIT_PIXEL_SIZE = 125; // NOTE: Skia shaders return premultiplied alpha colors @@ -173,8 +174,8 @@ sk_sp WorldGrid::get_shader(GridType gType, const ShaderData& shaderDa Vector2f WorldGrid::get_closest_grid_point(const WorldVec& gridOffset, const WorldScalar& gridSize, const DrawData& drawData) { WorldVec fracCamPosOnGrid; - fracCamPosOnGrid.x() = (drawData.cam.c.pos.x() + gridOffset.x()) % gridSize; - fracCamPosOnGrid.y() = (drawData.cam.c.pos.y() + gridOffset.y()) % gridSize; + fracCamPosOnGrid.x() = (drawData.cam.c.pos.x() - gridOffset.x()) % gridSize; + fracCamPosOnGrid.y() = (drawData.cam.c.pos.y() - gridOffset.y()) % gridSize; WorldVec closestGridPoint; closestGridPoint.x() = (fracCamPosOnGrid.x() < gridSize / WorldScalar(2)) ? WorldScalar(0) : gridSize; @@ -220,7 +221,7 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa unsigned subdivisionsTrue = get_subdivisions() + 1; - WorldScalar sizeDetermineSubdivisionsToRemove = (drawData.cam.c.inverseScale / size) * WorldScalar(125); + WorldScalar sizeDetermineSubdivisionsToRemove = (drawData.cam.c.inverseScale / size) * WorldScalar(GRID_UNIT_PIXEL_SIZE); SkPaint linePaint; diff --git a/src/WorldGrid.hpp b/src/WorldGrid.hpp index 316f149..6ab48b9 100644 --- a/src/WorldGrid.hpp +++ b/src/WorldGrid.hpp @@ -25,6 +25,8 @@ class WorldGrid { uint32_t get_subdivisions(); Vector4f color{1.0f, 1.0f, 1.0f, 1.0f}; + + static unsigned GRID_UNIT_PIXEL_SIZE; private: bool removeDivisionsOutwards = false; uint32_t subdivisions = 1;