dots3d.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "vc.c"
  2. float sqrtf(float x);
  3. float atan2f(float y, float x);
  4. float sinf(float x);
  5. float cosf(float x);
  6. #define PI 3.14159265359
  7. #define WIDTH 960
  8. #define HEIGHT 720
  9. #define BACKGROUND_COLOR 0xFF181818
  10. #define GRID_COUNT 10
  11. #define GRID_PAD 0.5/GRID_COUNT
  12. #define GRID_SIZE ((GRID_COUNT - 1)*GRID_PAD)
  13. #define CIRCLE_RADIUS 5
  14. #define Z_START 0.25
  15. #define ABOBA_PADDING 50
  16. static uint32_t pixels[WIDTH*HEIGHT];
  17. static float angle = 0;
  18. Olivec_Canvas vc_render(float dt)
  19. {
  20. angle += 0.25*PI*dt;
  21. Olivec_Canvas oc = olivec_canvas(pixels, WIDTH, HEIGHT, WIDTH);
  22. olivec_fill(oc, BACKGROUND_COLOR);
  23. for (int ix = 0; ix < GRID_COUNT; ++ix) {
  24. for (int iy = 0; iy < GRID_COUNT; ++iy) {
  25. for (int iz = 0; iz < GRID_COUNT; ++iz) {
  26. float x = ix*GRID_PAD - GRID_SIZE/2;
  27. float y = iy*GRID_PAD - GRID_SIZE/2;
  28. float z = Z_START + iz*GRID_PAD;
  29. float cx = 0.0;
  30. float cz = Z_START + GRID_SIZE/2;
  31. float dx = x - cx;
  32. float dz = z - cz;
  33. float a = atan2f(dz, dx);
  34. float m = sqrtf(dx*dx + dz*dz);
  35. dx = cosf(a + angle)*m;
  36. dz = sinf(a + angle)*m;
  37. x = dx + cx;
  38. z = dz + cz;
  39. x /= z;
  40. y /= z;
  41. uint32_t r = ix*255/GRID_COUNT;
  42. uint32_t g = iy*255/GRID_COUNT;
  43. uint32_t b = iz*255/GRID_COUNT;
  44. uint32_t color = 0xFF000000 | (r<<(0*8)) | (g<<(1*8)) | (b<<(2*8));
  45. olivec_circle(oc, (x + 1)/2*WIDTH, (y + 1)/2*HEIGHT, CIRCLE_RADIUS, color);
  46. }
  47. }
  48. }
  49. size_t size = 8;
  50. olivec_text(oc, "aboba", ABOBA_PADDING, HEIGHT - ABOBA_PADDING - olivec_default_font.height*size, olivec_default_font, size, 0xFFFFFFFF);
  51. return oc;
  52. }