From 4840e0f55c7236f43d0ac3b6cc58976ca3d67ee3 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Sat, 20 Sep 2025 18:44:09 +0300 Subject: [PATCH] Grid coordinate display work in progress --- include/Helpers/FixedPoint.hpp | 7 ++++ src/DrawCamera.cpp | 3 +- src/World.cpp | 8 ++--- src/WorldGrid.cpp | 64 +++++++++++++++++++++++++++++++--- src/WorldGrid.hpp | 2 ++ 5 files changed, 75 insertions(+), 9 deletions(-) diff --git a/include/Helpers/FixedPoint.hpp b/include/Helpers/FixedPoint.hpp index 153fcea..5bfd4fc 100644 --- a/include/Helpers/FixedPoint.hpp +++ b/include/Helpers/FixedPoint.hpp @@ -33,6 +33,13 @@ namespace FixedPoint { return (a >> a.bit_fraction_count()) << a.bit_fraction_count(); } + template T negative_round(const T& a) { + T truncatedVal = FixedPoint::trunc(a); + if(truncatedVal != a && a < T(0)) + return truncatedVal + T(1); + return truncatedVal; + } + // Gets highest bit in UNDERLYING VALUE, not the integer portion of the number template int to_highest_bit(const T& a) { typename T::UnderlyingType underNum = a.get_underlying_val(); diff --git a/src/DrawCamera.cpp b/src/DrawCamera.cpp index e861461..33a8dbd 100755 --- a/src/DrawCamera.cpp +++ b/src/DrawCamera.cpp @@ -7,8 +7,9 @@ #include DrawCamera::DrawCamera(): + c({-843000, -72500}, WorldScalar(1000), 0.0) //c({0, 0}, WorldScalar(1000), 0.0) - c({"1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, WorldScalar("1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 0.0) + //c({"1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, WorldScalar("1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 0.0) {} void DrawCamera::set_based_on_properties(World& w, const WorldVec& newPos, const WorldScalar& newZoom, double newRotate) { diff --git a/src/World.cpp b/src/World.cpp index 6f0b158..f0a3eab 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(100000); + 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 9b6cbd0..f82a573 100644 --- a/src/WorldGrid.cpp +++ b/src/WorldGrid.cpp @@ -2,6 +2,7 @@ #include "GridManager.hpp" #include "Helpers/MathExtras.hpp" #include "MainProgram.hpp" +#include sk_sp WorldGrid::circlePointEffect; sk_sp WorldGrid::squarePointEffect; @@ -188,6 +189,23 @@ Vector2f WorldGrid::get_closest_grid_point(const WorldVec& gridOffset, const Wor return closestGridPointScreenPos; } +WorldVec WorldGrid::get_closest_grid_point_coordinate(const WorldVec& gridOffset, const WorldScalar& gridSize, const WorldScalar& gridSizeUnit, const DrawData& drawData) { + WorldVec toRet; + toRet.x() = FixedPoint::negative_round((drawData.cam.c.pos.x() - gridOffset.x()) / gridSize) * gridSizeUnit; + toRet.y() = FixedPoint::negative_round((gridOffset.y() - drawData.cam.c.pos.y()) / gridSize) * gridSizeUnit; + + WorldVec fracCamPosOnGrid; + fracCamPosOnGrid.x() = (drawData.cam.c.pos.x() - gridOffset.x()) % gridSize; + fracCamPosOnGrid.y() = (drawData.cam.c.pos.y() - gridOffset.y()) % gridSize; + + if(fracCamPosOnGrid.x() > gridSize / WorldScalar(2)) + toRet.x() += gridSizeUnit; + if(fracCamPosOnGrid.y() > gridSize / WorldScalar(2)) + toRet.y() -= gridSizeUnit; + + return toRet; +} + void WorldGrid::set_remove_divisions_outwards(bool v) { removeDivisionsOutwards = v; if(removeDivisionsOutwards) @@ -225,6 +243,11 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa SkPaint linePaint; + float floatDivWorldSize; + Vector2f closestGridPointScreenPos; + WorldVec closestGridPointCoord; + WorldScalar gridCoordDivSize; + if(sizeDetermineSubdivisionsToRemove > WorldScalar(1)) { double divLogDouble, divLogFraction; divLogFraction = std::modf(static_cast(FixedPoint::log(sizeDetermineSubdivisionsToRemove, WorldScalar(subdivisionsTrue == 1 ? 2 : subdivisionsTrue))), &divLogDouble); @@ -239,10 +262,10 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa WorldScalar subDivWorldSize = subDivSize / drawData.cam.c.inverseScale; WorldScalar divWorldSize = divSize / drawData.cam.c.inverseScale; - float floatDivWorldSize = static_cast(divWorldSize); + floatDivWorldSize = static_cast(divWorldSize); float floatSubDivWorldSize = static_cast(subDivWorldSize); - Vector2f closestGridPointScreenPos = get_closest_grid_point(offset, divSize, drawData); + closestGridPointScreenPos = get_closest_grid_point(offset, divSize, drawData); Vector2f subClosestGridPointScreenPos = get_closest_grid_point(offset, subDivSize, drawData); SkColor4f pointColor = convert_vec4(color_mul_alpha(color, std::clamp(floatDivWorldSize / 100.0f, 0.0f, 1.0f))); @@ -277,6 +300,9 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa .divGridPointSize = gridPointSize * finalDivMultiplier })); } + + gridCoordDivSize = logMultiplier * WorldScalar(subdivisionsTrue); + closestGridPointCoord = get_closest_grid_point_coordinate(offset, divSize, gridCoordDivSize, drawData); } else { WorldScalar subDivSize = size; @@ -284,10 +310,10 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa WorldScalar subDivWorldSize = subDivSize / drawData.cam.c.inverseScale; WorldScalar divWorldSize = divSize / drawData.cam.c.inverseScale; - float floatDivWorldSize = static_cast(divWorldSize); + floatDivWorldSize = static_cast(divWorldSize); float floatSubDivWorldSize = static_cast(subDivWorldSize); - Vector2f closestGridPointScreenPos = get_closest_grid_point(offset, divSize, drawData); + closestGridPointScreenPos = get_closest_grid_point(offset, divSize, drawData); Vector2f subClosestGridPointScreenPos = get_closest_grid_point(offset, subDivSize, drawData); SkColor4f pointColor = convert_vec4(color_mul_alpha(color, std::clamp(floatDivWorldSize / 100.0f, 0.0f, 1.0f))); @@ -304,6 +330,9 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa .divGridClosestPoint = subClosestGridPointScreenPos, .divGridPointSize = gridPointSize * 0.5f })); + + gridCoordDivSize = WorldScalar(subdivisionsTrue); + closestGridPointCoord = get_closest_grid_point_coordinate(offset, divSize, gridCoordDivSize, drawData); } canvas->save(); @@ -315,5 +344,32 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa } canvas->rotate(-drawData.cam.c.rotation * 180.0 / std::numbers::pi); canvas->drawPaint(linePaint); + draw_coordinates(canvas, drawData, closestGridPointScreenPos, floatDivWorldSize, closestGridPointCoord, gridCoordDivSize); canvas->restore(); } + +void WorldGrid::draw_coordinates(SkCanvas* canvas, const DrawData& drawData, const Vector2f& closestGridPointScreenPos, float floatDivWorldSize, const WorldVec& closestGridPointCoord, const WorldScalar& gridCoordDivSize) { + SkFont f = drawData.main->toolbar.io->get_font(18.0f); + SkFontMetrics metrics; + f.getMetrics(&metrics); + + float toolbarXLength = drawData.main->toolbar.final_gui_scale() * 80.0f; + + WorldScalar xGridCoord = closestGridPointCoord.x(); + for(float x = closestGridPointScreenPos.x(); x < drawData.main->window.size.x(); x += floatDivWorldSize) { + std::string xGridCoordStr = xGridCoord.display_int_str(4); + float textXLength = f.measureText(xGridCoordStr.c_str(), xGridCoordStr.length(), SkTextEncoding::kUTF8, nullptr); + SkPaint p2(SkColor4f{1.0f, 0.0f, 0.0f, 1.0f}); + canvas->drawSimpleText(xGridCoordStr.c_str(), xGridCoordStr.length(), SkTextEncoding::kUTF8, x - textXLength * 0.5f, drawData.main->window.size.y() - metrics.fDescent, f, p2); + + xGridCoord += gridCoordDivSize; + } + WorldScalar yGridCoord = closestGridPointCoord.y(); + for(float y = closestGridPointScreenPos.y(); y < drawData.main->window.size.y(); y += floatDivWorldSize) { + std::string yGridCoordStr = yGridCoord.display_int_str(5); + SkPaint p2(SkColor4f{1.0f, 0.0f, 0.0f, 1.0f}); + canvas->drawSimpleText(yGridCoordStr.c_str(), yGridCoordStr.length(), SkTextEncoding::kUTF8, toolbarXLength, y + metrics.fDescent, f, p2); + + yGridCoord -= gridCoordDivSize; // Subtract instead of add due to flipped y axis + } +} diff --git a/src/WorldGrid.hpp b/src/WorldGrid.hpp index 7c19921..30966a0 100644 --- a/src/WorldGrid.hpp +++ b/src/WorldGrid.hpp @@ -42,7 +42,9 @@ class WorldGrid { Vector2f divGridClosestPoint; float divGridPointSize; }; + void draw_coordinates(SkCanvas* canvas, const DrawData& drawData, const Vector2f& closestGridPointScreenPos, float floatDivWorldSize, const WorldVec& closestGridPointCoord, const WorldScalar& gridCoordDivSize); static Vector2f get_closest_grid_point(const WorldVec& gridOffset, const WorldScalar& gridSize, const DrawData& drawData); + static WorldVec get_closest_grid_point_coordinate(const WorldVec& gridOffset, const WorldScalar& gridSize, const WorldScalar& gridSizeUnit, const DrawData& drawData); static sk_sp get_shader(GridType gType, const ShaderData& shaderData); static sk_sp compile_effect_shader_init(const char* shaderName, const char* shaderCode); static Vector2f oldWindowSize;