Grid coordinate display work in progress

This commit is contained in:
Yousef Khadadeh 2025-09-20 18:44:09 +03:00
parent 2836309cf5
commit 4840e0f55c
5 changed files with 75 additions and 9 deletions

View file

@ -33,6 +33,13 @@ namespace FixedPoint {
return (a >> a.bit_fraction_count()) << a.bit_fraction_count();
}
template <typename T> 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 <typename T> int to_highest_bit(const T& a) {
typename T::UnderlyingType underNum = a.get_underlying_val();

View file

@ -7,8 +7,9 @@
#include <iostream>
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) {

View file

@ -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() {

View file

@ -2,6 +2,7 @@
#include "GridManager.hpp"
#include "Helpers/MathExtras.hpp"
#include "MainProgram.hpp"
#include <include/core/SkFontMetrics.h>
sk_sp<SkRuntimeEffect> WorldGrid::circlePointEffect;
sk_sp<SkRuntimeEffect> 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<double>(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<float>(divWorldSize);
floatDivWorldSize = static_cast<float>(divWorldSize);
float floatSubDivWorldSize = static_cast<float>(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<SkColor4f>(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<float>(divWorldSize);
floatDivWorldSize = static_cast<float>(divWorldSize);
float floatSubDivWorldSize = static_cast<float>(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<SkColor4f>(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
}
}

View file

@ -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<SkShader> get_shader(GridType gType, const ShaderData& shaderData);
static sk_sp<SkRuntimeEffect> compile_effect_shader_init(const char* shaderName, const char* shaderCode);
static Vector2f oldWindowSize;