feat: shapes

This commit is contained in:
anjingyu 2025-07-21 22:41:46 +08:00
parent 36e341d0b4
commit 2803a05571
1 changed files with 67 additions and 2 deletions

View File

@ -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);