]> git.localhorst.tv Git - space.git/blobdiff - src/graphics/primitive.cpp
dynamic zoom
[space.git] / src / graphics / primitive.cpp
index 1a68d45a9a8a16acfcd5843af60fce1242f35119..f8b5863c68db7ffe12941cdfb9ea254ee2dd8f8a 100644 (file)
@@ -164,4 +164,86 @@ void Grid(
        }
 }
 
+void Grid2(
+               SDL_Surface *dst,
+               Vector<int> first,
+               Vector<int> second,
+               Vector<int> size,
+               Vector<int> n,
+               Color color1,
+               Color color2) {
+       Uint32 c1 = color1.MapRGBA(dst);
+       Uint32 c2 = color2.MapRGBA(dst);
+
+       Vector<int> from = min(first, second);
+       Vector<int> to = max(first, second);
+
+       if (size.x <= 1 || size.y <= 1) {
+               FillRect(dst, from, to - from, c1);
+               Grid(dst, from, to, size * n, color2);
+               return;
+       }
+
+       if (from.x > dst->w || from.y > dst->h || to.x < 0 || to.y < 0) {
+               return;
+       }
+
+       Vector<int> i(0, 0);
+       while (from.x < -size.x) { from.x += size.x; ++i.x; }
+       while (from.y < -size.y) { from.y += size.y; ++i.y; }
+       while (to.x > dst->w + size.x) to.x -= size.x;
+       while (to.y > dst->h + size.y) to.y -= size.y;
+
+       int width = to.x - from.x;
+       int height = to.y - from.y;
+
+       for (Vector<int> pos(from); pos.x <= to.x; pos.x += size.x) {
+               VLine(dst, pos, height, (i.x++ % n.x) ? c1 : c2);
+       }
+       for (Vector<int> pos(from); pos.y <= to.y; pos.y += size.y) {
+               HLine(dst, pos, width, (i.y++ % n.y) ? c1 : c2);
+       }
+}
+
+void Grid2(
+               SDL_Surface *dst,
+               Vector<int> first,
+               Vector<int> second,
+               Vector<float> size,
+               Vector<int> n,
+               Color color1,
+               Color color2) {
+       Uint32 c1 = color1.MapRGBA(dst);
+       Uint32 c2 = color2.MapRGBA(dst);
+
+       Vector<int> from = min(first, second);
+       Vector<int> to = max(first, second);
+
+       if (size.x <= 1 || size.y <= 1) {
+               FillRect(dst, from, to - from, c1);
+               Grid(dst, from, to, size * Vector<float>(n), color2);
+               return;
+       }
+
+       if (from.x > dst->w || from.y > dst->h || to.x < 0 || to.y < 0) {
+               return;
+       }
+
+       Vector<int> i(0, 0);
+       while (from.x < -size.x) { from.x += size.x; ++i.x; }
+       while (from.y < -size.y) { from.y += size.y; ++i.y; }
+       while (to.x > dst->w + size.x) to.x -= size.x;
+       while (to.y > dst->h + size.y) to.y -= size.y;
+
+       float width = to.x - from.x;
+       float height = to.y - from.y;
+
+       for (Vector<float> pos(from); pos.x <= to.x; pos.x += size.x) {
+               VLine(dst, pos, height, (i.x++ % n.x) ? c1 : c2);
+       }
+       for (Vector<float> pos(from); pos.y <= to.y; pos.y += size.y) {
+               HLine(dst, pos, width, (i.y++ % n.y) ? c1 : c2);
+       }
+}
+
 }