diff --git a/src/DrawCamera.cpp b/src/DrawCamera.cpp index e2bec7d..2ab9b60 100755 --- a/src/DrawCamera.cpp +++ b/src/DrawCamera.cpp @@ -7,9 +7,10 @@ #include DrawCamera::DrawCamera(): + c({0, 0}, WorldScalar(1000000), 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) { diff --git a/src/GridManager.cpp b/src/GridManager.cpp index 4db30c4..664089c 100644 --- a/src/GridManager.cpp +++ b/src/GridManager.cpp @@ -76,6 +76,25 @@ ClientPortionID GridManager::get_max_id(ServerPortionID serverID) const { } void GridManager::draw(SkCanvas* canvas, const DrawData& drawData) { - for(auto& [str, g] : grids) - g.draw(*this, canvas, drawData); + auto& sortedGridIDS = sorted_grid_ids(); + for(ServerClientID id : sortedGridIDS) + grids[id].draw(*this, canvas, drawData); +} + +void GridManager::draw_coordinates(SkCanvas* canvas, const DrawData& drawData) { + auto& sortedGridIDS = sorted_grid_ids(); + Vector2f axisOffset{0.0f, 0.0f}; + for(ServerClientID id : sortedGridIDS) { + auto& g = grids[id]; + if(g.coordinatesWillBeDrawn && g.coordinatesAxisOnBounds) { + grids[id].draw_coordinates(canvas, drawData, axisOffset); + g.coordinatesWillBeDrawn = false; + } + } + for(ServerClientID id : sortedGridIDS) { + auto& g = grids[id]; + if(g.coordinatesWillBeDrawn && !g.coordinatesAxisOnBounds) + grids[id].draw_coordinates(canvas, drawData, axisOffset); + g.coordinatesWillBeDrawn = false; + } } diff --git a/src/GridManager.hpp b/src/GridManager.hpp index e54a35a..271d4b0 100644 --- a/src/GridManager.hpp +++ b/src/GridManager.hpp @@ -22,6 +22,7 @@ class GridManager { void send_grid_info(ServerClientID gridID); void remove_grid(ServerClientID idToRemove); void draw(SkCanvas* canvas, const DrawData& drawData); + void draw_coordinates(SkCanvas* canvas, const DrawData& drawData); ClientPortionID get_max_id(ServerPortionID serverID) const; const std::vector& sorted_grid_ids(); diff --git a/src/World.cpp b/src/World.cpp index 5055874..ae24bf3 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -412,5 +412,7 @@ void World::draw(SkCanvas* canvas) { if(drawData.drawGrids) gridMan.draw(canvas, drawData); drawProg.draw(canvas, drawData); + if(drawData.drawGrids) + gridMan.draw_coordinates(canvas, drawData); draw_other_player_cursors(canvas, drawData); } diff --git a/src/WorldGrid.cpp b/src/WorldGrid.cpp index e770ee0..ac02db1 100644 --- a/src/WorldGrid.cpp +++ b/src/WorldGrid.cpp @@ -9,7 +9,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 = 75; +unsigned WorldGrid::GRID_UNIT_PIXEL_SIZE = 50; // NOTE: Skia shaders return premultiplied alpha colors @@ -206,6 +206,9 @@ std::string WorldGrid::get_display_name() { } void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawData) { + coordinatesAxisOnBounds = false; + coordinatesWillBeDrawn = false; + if(!visible || (bounds.has_value() && !SCollision::collide(drawData.cam.viewingAreaGenerousCollider, bounds.value()))) return; @@ -246,7 +249,9 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa SkColor4f pointColor = convert_vec4(color_mul_alpha(color, removeDivisionsOutwards ? 1.0f : std::clamp(floatDivWorldSize / 100.0f, 0.0f, 1.0f))); float gridPointSize = 5.0f; - float finalDivMultiplier = (1.0 - divLogFraction) * ((divLog == 0) ? 0.5 : 1.0); + float finalDivMultiplierValue = (1.0 - divLogFraction) * ((divLog == 0) ? 0.5 : 1.0); + float finalDivMultiplierSqrt = std::sqrt(finalDivMultiplierValue); + float finalDivMultiplierSqrd = std::pow(finalDivMultiplierValue, 2); if(removeDivisionsOutwards || divLog == 0) { linePaint.setShader(get_shader(gridType, { @@ -258,21 +263,21 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa .divGridAlphaFrac = 0.3f, .divGridScale = floatSubDivWorldSize, .divGridClosestPoint = subClosestGridPointScreenPos, - .divGridPointSize = gridPointSize * finalDivMultiplier + .divGridPointSize = gridPointSize * finalDivMultiplierSqrd })); } else { - pointColor.fA *= finalDivMultiplier; + pointColor.fA *= finalDivMultiplierSqrt; linePaint.setShader(get_shader(gridType, { .gridColor = pointColor, .mainGridScale = floatSubDivWorldSize, .mainGridClosestPoint = subClosestGridPointScreenPos, - .mainGridPointSize = gridPointSize * finalDivMultiplier, + .mainGridPointSize = gridPointSize * finalDivMultiplierSqrt, .divGridAlphaFrac = 0.0f, .divGridScale = floatSubDivWorldSize, .divGridClosestPoint = subClosestGridPointScreenPos, - .divGridPointSize = gridPointSize * finalDivMultiplier + .divGridPointSize = gridPointSize * finalDivMultiplierSqrd })); } @@ -302,7 +307,7 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa .divGridAlphaFrac = 0.3f, .divGridScale = floatSubDivWorldSize, .divGridClosestPoint = subClosestGridPointScreenPos, - .divGridPointSize = gridPointSize * 0.5f + .divGridPointSize = gridPointSize * 0.25f })); gridCoordDivSize = WorldScalar(subdivisions); @@ -326,30 +331,35 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa canvas->rotate(-drawData.cam.c.rotation * 180.0 / std::numbers::pi); canvas->drawPaint(linePaint); canvas->restore(); - if(drawData.cam.c.rotation == 0.0 && !drawData.main->takingScreenshot) - draw_coordinates(canvas, drawData, divSize, gridCoordDivSize); + if(drawData.cam.c.rotation == 0.0 && !drawData.main->takingScreenshot) { + coordinatesWillBeDrawn = true; + WorldVec worldWindowEndPos = drawData.cam.c.pos + drawData.cam.c.dir_from_space(drawData.cam.viewingArea); + coordinatesAxisOnBounds = bounds.has_value() && !bounds.value().fully_contains_aabb(SCollision::AABB(drawData.cam.c.pos, worldWindowEndPos)); + coordinatesDivWorldSize = divSize; + coordinatesGridCoordDivSize = gridCoordDivSize; + } } -void WorldGrid::draw_coordinates(SkCanvas* canvas, const DrawData& drawData, WorldScalar divWorldSize, WorldScalar gridCoordDivSize) { - if(bounds.has_value() && !SCollision::collide(drawData.cam.viewingAreaGenerousCollider, bounds.value())) - return; +void WorldGrid::draw_coordinates(SkCanvas* canvas, const DrawData& drawData, Vector2f& axisOffset) { + auto& divWorldSize = coordinatesDivWorldSize; + auto& gridCoordDivSize = coordinatesGridCoordDivSize; WorldVec worldWindowEndPos = drawData.cam.c.pos + drawData.cam.c.dir_from_space(drawData.cam.viewingArea); - bool axisOnBounds = bounds.has_value() && !bounds.value().fully_contains_aabb(SCollision::AABB(drawData.cam.c.pos, worldWindowEndPos)); - - const WorldVec& worldWindowTopLeftClipPos = axisOnBounds ? bounds.value().min : drawData.cam.c.pos; + const WorldVec& worldWindowTopLeftClipPos = coordinatesAxisOnBounds ? bounds.value().min : drawData.cam.c.pos; SCollision::AABB boundsCamSpace; float coordFontSize = drawData.main->toolbar.final_gui_scale() * drawData.main->toolbar.io->fontSize; - if(axisOnBounds) + if(coordinatesAxisOnBounds) boundsCamSpace = SCollision::AABB(drawData.cam.c.to_space(bounds.value().min), drawData.cam.c.to_space(bounds.value().max)); else { float toolbarXLength = drawData.main->toolbar.final_gui_scale() * 80.0f; - boundsCamSpace = SCollision::AABB({toolbarXLength, 0.0f}, drawData.cam.viewingArea); + boundsCamSpace = SCollision::AABB({toolbarXLength + axisOffset.x(), 0.0f}, {drawData.cam.viewingArea.x(), drawData.cam.viewingArea.y() - axisOffset.y()}); + if(boundsCamSpace.width() < 100.0f || boundsCamSpace.height() < 100.0f) + return; } - if(axisOnBounds) { + if(coordinatesAxisOnBounds) { float fontSizeBoundsMultiplier = std::min(std::min(boundsCamSpace.width() / drawData.cam.viewingArea.x(), boundsCamSpace.height() / drawData.cam.viewingArea.y()) * 4.0f, 1.0f); coordFontSize *= fontSizeBoundsMultiplier; if(coordFontSize <= 3.0f) @@ -431,6 +441,9 @@ void WorldGrid::draw_coordinates(SkCanvas* canvas, const DrawData& drawData, Wor break; } + if(!coordinatesAxisOnBounds) + axisOffset.y() += (exponentExistsInXAxis ? fontHeight * 1.25f : fontHeight); + float xAxisYPosRect = boundsCamSpace.max.y() - (exponentExistsInXAxis ? fontHeight * 1.25f : fontHeight); { @@ -459,11 +472,14 @@ void WorldGrid::draw_coordinates(SkCanvas* canvas, const DrawData& drawData, Wor } } + if(!coordinatesAxisOnBounds) + axisOffset.x() += yAxisMaxXLength; + SkPaint labelColor(SkColor4f{color.x(), color.y(), color.z(), 1.0f}); float xAxisYPosLabels = boundsCamSpace.max.y() - metrics.fDescent; - if(axisOnBounds) { + if(coordinatesAxisOnBounds) { canvas->save(); canvas->clipRect(SkRect::MakeLTRB(boundsCamSpace.min.x(), boundsCamSpace.min.y(), boundsCamSpace.max.x(), boundsCamSpace.max.y())); } @@ -471,7 +487,6 @@ void WorldGrid::draw_coordinates(SkCanvas* canvas, const DrawData& drawData, Wor canvas->drawRect(SkRect::MakeXYWH(boundsCamSpace.min.x(), boundsCamSpace.min.y(), yAxisMaxXLength, boundsCamSpace.max.y() - boundsCamSpace.min.y()), SkPaint{color_mul_alpha(drawData.main->toolbar.io->theme->backColor1, 0.9f)}); canvas->drawRect(SkRect::MakeLTRB(boundsCamSpace.min.x() + yAxisMaxXLength, xAxisYPosRect, boundsCamSpace.max.x(), boundsCamSpace.max.y()), SkPaint{color_mul_alpha(drawData.main->toolbar.io->theme->backColor1, 0.9f)}); - for(auto& l : xAxisLabels) { if(l.mainPos > boundsCamSpace.min.x() + yAxisMaxXLength && l.mainPos + l.totalLength < boundsCamSpace.max.x()) { canvas->drawSimpleText(l.mainText.c_str(), l.mainText.length(), SkTextEncoding::kUTF8, l.mainPos, xAxisYPosLabels, f, labelColor); @@ -485,6 +500,6 @@ void WorldGrid::draw_coordinates(SkCanvas* canvas, const DrawData& drawData, Wor canvas->drawSimpleText(l.exponentText.c_str(), l.exponentText.length(), SkTextEncoding::kUTF8, mainTextXPos + l.mainLength, l.exponentPos, f, labelColor); } - if(axisOnBounds) + if(coordinatesAxisOnBounds) canvas->restore(); } diff --git a/src/WorldGrid.hpp b/src/WorldGrid.hpp index 08673ad..1b5bb18 100644 --- a/src/WorldGrid.hpp +++ b/src/WorldGrid.hpp @@ -13,6 +13,7 @@ class WorldGrid { } void draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawData); + void draw_coordinates(SkCanvas* canvas, const DrawData& drawData, Vector2f& axisOffset); std::string name; enum class GridType : unsigned { @@ -35,6 +36,11 @@ class WorldGrid { void set_subdivisions(uint32_t v); static unsigned GRID_UNIT_PIXEL_SIZE; + + WorldScalar coordinatesDivWorldSize; + WorldScalar coordinatesGridCoordDivSize; + bool coordinatesWillBeDrawn = false; + bool coordinatesAxisOnBounds = false; private: struct ShaderData { @@ -49,7 +55,7 @@ class WorldGrid { float divGridPointSize; }; - void draw_coordinates(SkCanvas* canvas, const DrawData& drawData, WorldScalar divWorldSize, WorldScalar gridCoordDivSize); + void draw_coordinates(SkCanvas* canvas, const DrawData& drawData, WorldScalar divWorldSize, WorldScalar gridCoordDivSize, Vector2f offsetOtherCoordinates); static Vector2f get_closest_grid_point(const WorldVec& gridOffset, const WorldScalar& gridSize, 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);