summaryrefslogtreecommitdiff
path: root/main.c
blob: 1c57ee818772960026bdb0ae1c989181477d2852 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/* main.c
 * Created: 2023-08-25
 * Author: Aryadev Chavali
 * Description: Entry point of program
 */
#include <malloc.h>
#include <stdio.h>

#include <raylib.h>

struct State
{
  // Sandpiles
  unsigned char *data;
  size_t dwidth;

  size_t window_len;
  int multiplier;
};

typedef struct State state_t;

void step(state_t *state)
{
  state->data[((state->dwidth / 2) * state->dwidth) + (state->dwidth / 2)]++;
  for (size_t i = 0; i < state->dwidth; ++i)
    for (size_t j = 0; j < state->dwidth; ++j)
      if (state->data[(i * state->dwidth) + j] >= 4)
      {
        unsigned char *references[] = {
            (j == 0) ? NULL : &state->data[((i)*state->dwidth) + j - 1],
            (i == state->dwidth - 1)
                ? NULL
                : &state->data[((i + 1) * state->dwidth) + j],
            (j == state->dwidth - 1)
                ? NULL
                : &state->data[(i * state->dwidth) + j + 1],
            (i == 0) ? NULL : &state->data[((i - 1) * state->dwidth) + j]};
        for (size_t k = 0; k < 4; ++k)
          if (references[k])
            *references[k] += 1;
        state->data[(i * state->dwidth) + j] = 0;
      }
}

int main(void)
{
  state_t state    = {NULL, 256, 512, 0};
  state.data       = calloc(state.dwidth * state.dwidth, sizeof(*state.data));
  state.multiplier = state.window_len / state.dwidth;

  InitWindow(state.window_len, state.window_len, "Abelian sand pile");
  SetTargetFPS(60);
  while (!WindowShouldClose())
  {
    step(&state);
    BeginDrawing();
    ClearBackground(BLACK);
    DrawText("Hello, world!", 100, 100, 25, RAYWHITE);

    for (size_t i = 0; i < state.dwidth; ++i)
      for (size_t j = 0; j < state.dwidth; ++j)
      {
        DrawRectangle(i * state.multiplier, j * state.multiplier,
                      state.multiplier, state.multiplier, BLACK);
      }
    EndDrawing();
  }
  CloseWindow();
  return 0;
}