Cleaner way of drawing grid coordinates
This commit is contained in:
parent
4840e0f55c
commit
588425aa8b
4 changed files with 46 additions and 48 deletions
|
|
@ -7,9 +7,9 @@
|
|||
#include <iostream>
|
||||
|
||||
DrawCamera::DrawCamera():
|
||||
c({-843000, -72500}, WorldScalar(1000), 0.0)
|
||||
//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) {
|
||||
|
|
|
|||
|
|
@ -66,8 +66,9 @@ World::World(MainProgram& initMain, OpenWorldInfo& worldInfo):
|
|||
|
||||
gridMan.add_grid("b");
|
||||
gridMan.grids["b"].size = WorldScalar(100000);
|
||||
gridMan.grids["b"].set_remove_divisions_outwards(false);
|
||||
gridMan.grids["b"].set_remove_divisions_outwards(true);
|
||||
gridMan.grids["b"].gridType = WorldGrid::GridType::CIRCLE_POINTS;
|
||||
gridMan.grids["b"].set_subdivisions(9);
|
||||
}
|
||||
|
||||
void World::init_client_callbacks() {
|
||||
|
|
|
|||
|
|
@ -189,23 +189,6 @@ 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)
|
||||
|
|
@ -243,9 +226,7 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa
|
|||
|
||||
SkPaint linePaint;
|
||||
|
||||
float floatDivWorldSize;
|
||||
Vector2f closestGridPointScreenPos;
|
||||
WorldVec closestGridPointCoord;
|
||||
WorldScalar divSize;
|
||||
WorldScalar gridCoordDivSize;
|
||||
|
||||
if(sizeDetermineSubdivisionsToRemove > WorldScalar(1)) {
|
||||
|
|
@ -258,14 +239,14 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa
|
|||
WorldScalar logMultiplier = FixedPoint::exp_int_accurate<WorldScalar>(divLog, subdivisionsTrue);
|
||||
|
||||
WorldScalar subDivSize = size * logMultiplier;
|
||||
WorldScalar divSize = subDivSize * WorldScalar(subdivisionsTrue);
|
||||
divSize = subDivSize * WorldScalar(subdivisionsTrue);
|
||||
WorldScalar subDivWorldSize = subDivSize / drawData.cam.c.inverseScale;
|
||||
WorldScalar divWorldSize = divSize / drawData.cam.c.inverseScale;
|
||||
|
||||
floatDivWorldSize = static_cast<float>(divWorldSize);
|
||||
float floatDivWorldSize = static_cast<float>(divWorldSize);
|
||||
float floatSubDivWorldSize = static_cast<float>(subDivWorldSize);
|
||||
|
||||
closestGridPointScreenPos = get_closest_grid_point(offset, divSize, drawData);
|
||||
Vector2f 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)));
|
||||
|
|
@ -302,18 +283,17 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa
|
|||
}
|
||||
|
||||
gridCoordDivSize = logMultiplier * WorldScalar(subdivisionsTrue);
|
||||
closestGridPointCoord = get_closest_grid_point_coordinate(offset, divSize, gridCoordDivSize, drawData);
|
||||
}
|
||||
else {
|
||||
WorldScalar subDivSize = size;
|
||||
WorldScalar divSize = subDivSize * WorldScalar(subdivisionsTrue);
|
||||
divSize = subDivSize * WorldScalar(subdivisionsTrue);
|
||||
WorldScalar subDivWorldSize = subDivSize / drawData.cam.c.inverseScale;
|
||||
WorldScalar divWorldSize = divSize / drawData.cam.c.inverseScale;
|
||||
|
||||
floatDivWorldSize = static_cast<float>(divWorldSize);
|
||||
float floatDivWorldSize = static_cast<float>(divWorldSize);
|
||||
float floatSubDivWorldSize = static_cast<float>(subDivWorldSize);
|
||||
|
||||
closestGridPointScreenPos = get_closest_grid_point(offset, divSize, drawData);
|
||||
Vector2f 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)));
|
||||
|
|
@ -332,7 +312,6 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa
|
|||
}));
|
||||
|
||||
gridCoordDivSize = WorldScalar(subdivisionsTrue);
|
||||
closestGridPointCoord = get_closest_grid_point_coordinate(offset, divSize, gridCoordDivSize, drawData);
|
||||
}
|
||||
|
||||
canvas->save();
|
||||
|
|
@ -344,32 +323,51 @@ 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();
|
||||
if(drawData.cam.c.rotation == 0.0 && !drawData.main->takingScreenshot)
|
||||
draw_coordinates(canvas, drawData, divSize, gridCoordDivSize);
|
||||
}
|
||||
|
||||
void WorldGrid::draw_coordinates(SkCanvas* canvas, const DrawData& drawData, const Vector2f& closestGridPointScreenPos, float floatDivWorldSize, const WorldVec& closestGridPointCoord, const WorldScalar& gridCoordDivSize) {
|
||||
void WorldGrid::draw_coordinates(SkCanvas* canvas, const DrawData& drawData, const WorldScalar& divWorldSize, 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;
|
||||
const WorldVec& worldWindowEndPos = drawData.cam.c.pos + drawData.cam.c.dir_from_space(drawData.cam.viewingArea);
|
||||
WorldVec worldWindowBeginPos;
|
||||
WorldScalar xCoordMultiplier = FixedPoint::trunc((drawData.cam.c.pos.x() - offset.x()) / divWorldSize);
|
||||
worldWindowBeginPos.x() = xCoordMultiplier * divWorldSize + offset.x();
|
||||
WorldScalar yCoordMultiplier = FixedPoint::trunc((drawData.cam.c.pos.y() - offset.y()) / divWorldSize);
|
||||
worldWindowBeginPos.y() = yCoordMultiplier * divWorldSize + offset.y();
|
||||
|
||||
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);
|
||||
{
|
||||
WorldScalar xGridCoord = xCoordMultiplier * gridCoordDivSize;
|
||||
|
||||
xGridCoord += gridCoordDivSize;
|
||||
for(WorldScalar xWorldCoord = worldWindowBeginPos.x(); xWorldCoord < worldWindowEndPos.x(); xWorldCoord += divWorldSize) {
|
||||
Vector2f gridPointScreenPos = drawData.cam.c.to_space(WorldVec{xWorldCoord, worldWindowBeginPos.y()});
|
||||
|
||||
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, gridPointScreenPos.x() - textXLength * 0.5f, drawData.cam.viewingArea.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
|
||||
{
|
||||
WorldScalar yGridCoord = FixedPoint::trunc((offset.y() - drawData.cam.c.pos.y()) / divWorldSize) * gridCoordDivSize + gridCoordDivSize;
|
||||
|
||||
for(WorldScalar yWorldCoord = worldWindowBeginPos.y(); yWorldCoord < worldWindowEndPos.y(); yWorldCoord += divWorldSize) {
|
||||
Vector2f gridPointScreenPos = drawData.cam.c.to_space(WorldVec{worldWindowBeginPos.x(), yWorldCoord});
|
||||
|
||||
std::string yGridCoordStr = yGridCoord.display_int_str(4);
|
||||
|
||||
SkPaint p2(SkColor4f{1.0f, 0.0f, 0.0f, 1.0f});
|
||||
canvas->drawSimpleText(yGridCoordStr.c_str(), yGridCoordStr.length(), SkTextEncoding::kUTF8, toolbarXLength, gridPointScreenPos.y() + metrics.fDescent, f, p2);
|
||||
|
||||
yGridCoord -= gridCoordDivSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,9 +42,8 @@ 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);
|
||||
void draw_coordinates(SkCanvas* canvas, const DrawData& drawData, const WorldScalar& divWorldSize, 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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue