diff --git a/sww/test/shapes.c b/sww/test/shapes.c index 1a0669c..7b1caa8 100644 --- a/sww/test/shapes.c +++ b/sww/test/shapes.c @@ -9,7 +9,7 @@ #include "sww/util.h" #include "sww/window.h" -#define MAX_SCENE 10 +#define MAX_SCENE 11 #define TITLE "SWW Shapes" @@ -128,6 +128,68 @@ void HideSphere(swwRenderer* o, int cx, int cy, float r, int alpha, int beta, in } } +const uint32_t kDim = 512; +const uint32_t kFrames = 48; + +static void Animation(swwRenderer* o) +{ + static uint32_t i = 0; + const uint32_t size = kDim * kDim * 4; + + // A fading sphere + uint8_t alpha = 255; + if (i < kFrames / 2) { + alpha = (uint8_t)(255 * (i / ((float)kFrames / 2))); + } else { + alpha = (uint8_t)(255 * (((kFrames / 2) - (i - kFrames / 2)) / ((float)kFrames / 2))); + } + + const int spherew = 60; + const int spherex = (kDim - spherew) / 2; + const int maxdist = (spherew / 2) * (spherew / 2); + for (int x = spherex; x < spherex + spherew; x++) { + for (int y = 20; y < 20 + spherew; y++) { + float distx = x - (spherex + (float)spherew / 2); + float disty = y - (20 + (float)spherew / 2); + float dist = distx * distx + disty * disty; + + if (dist > maxdist) + continue; + + const float fill = dist / maxdist; + const uint8_t grey = (uint8_t)(fill * 255); + + uint8_t myalpha = alpha; + if (fill > 0.9) + myalpha *= (uint8_t)((1.0f - fill) * 10); + + swwRenderer_DrawPixel(o, (Point2i){x, y}, Color_RGBA(grey, grey, grey, myalpha)); + } + } + + // A moving blob + const float pos = (i / (float)kFrames) * 2 - 0.5f; + + const int xoffset = (int)(pos * kDim); + const int yoffset = 2 * kDim / 3; + const int w = kDim / 4; + + for (int x = -w; x < w; x++) { + if (x + xoffset < 0 || x + xoffset >= (int)dim) + continue; + for (int y = yoffset - w; y < yoffset + w; y++) { + const uint8_t grey = abs(y - yoffset); + swwRenderer_DrawPixel(o, (Point2i){x + xoffset, y}, Color_RGBA(grey, grey, grey, 127)); + } + } + + if (i < kFrames) { + ++i; + } else { + i = 0; + } +} + int main() { int w = 512, h = 512; @@ -220,7 +282,10 @@ int main() } } } break; - case 9: + case 9: { + Animation(ud.renderer); + } break; + case 10: default: { swwRenderer_DrawArc(ud.renderer, (Point2i){cw, ch}, 150, 30.f, 90.f, Color_RGB(0x00, 0x00, 0xff), 0);