| @@ -0,0 +1 @@ | |||
| evosim | |||
| @@ -0,0 +1,5 @@ | |||
| CFILES=$(shell find src -name '*.c') | |||
| CFLAGS=-std=c99 $(shell sdl2-config --cflags --libs) | |||
| build: | |||
| gcc $(CFLAGS) -o evosim $(CFILES) | |||
| @@ -0,0 +1,20 @@ | |||
| #include <stdlib.h> | |||
| #define ARR_REALLOC(v, c, a) \ | |||
| do { \ | |||
| if (v == NULL) { \ | |||
| a = 8; \ | |||
| v = malloc(8 * sizeof(*(v))); \ | |||
| } \ | |||
| else if (c >= a) { \ | |||
| do { a *= 2; } while (c >= a); \ | |||
| v = realloc(v, a * sizeof(*(v))); \ | |||
| } \ | |||
| } while (0) | |||
| #define ARR_APPEND(v, c, a, nw) \ | |||
| do { \ | |||
| c += 1; \ | |||
| ARR_REALLOC(v, c, a); \ | |||
| v[c - 1] = nw; \ | |||
| } while (0) | |||
| @@ -0,0 +1,50 @@ | |||
| #include "creature.h" | |||
| #include <stdio.h> | |||
| void creature_print(creature *creat) | |||
| { | |||
| printf("Creature: %i muscles\n", creat->musclec); | |||
| for (int i = 0; i < creat->musclec; ++i) | |||
| { | |||
| printf("\tMuscle %i: \n", i); | |||
| printf("\t\tmultiplier: %f\n", creat->muscles[i].multiplier); | |||
| printf("\t\tstrength: %i\n", creat->muscles[i].strength); | |||
| printf("\t\tnode 1: "); | |||
| node n = creat->muscles[i].n1; | |||
| printf("friction: %i, x: %f, y: %f\n", n.friction, n.x, n.y); | |||
| printf("\t\tnode 2: "); | |||
| n = creat->muscles[i].n2; | |||
| printf("friction: %i, x: %f, y: %f\n", n.friction, n.x, n.y); | |||
| } | |||
| } | |||
| static void drawnode(node n, SDL_Renderer *renderer) | |||
| { | |||
| int w = 30; | |||
| int h = 30; | |||
| SDL_Rect rect = { n.x - (w / 2), n.y - (h / 2), w, h }; | |||
| int col = (n.friction / 1000.0) * 0xff; | |||
| SDL_SetRenderDrawColor(renderer, 0xaa, col, col, 0xff); | |||
| SDL_RenderFillRect(renderer, &rect); | |||
| } | |||
| void creature_draw(creature *creat, SDL_Renderer *renderer) | |||
| { | |||
| for (int i = 0; i < creat->musclec; ++i) | |||
| { | |||
| muscle mus = creat->muscles[i]; | |||
| // Draw muscle line | |||
| int col = (mus.strength / 1000.0) * 0xff; | |||
| SDL_SetRenderDrawColor(renderer, 0xaa, 0xff, 0xaa, col); | |||
| SDL_RenderDrawLine(renderer, | |||
| mus.n1.x, mus.n1.y, | |||
| mus.n2.x, mus.n2.y); | |||
| // Draw nodes | |||
| drawnode(mus.n1, renderer); | |||
| drawnode(mus.n2, renderer); | |||
| } | |||
| } | |||
| @@ -0,0 +1,24 @@ | |||
| #include <SDL2/SDL.h> | |||
| typedef struct node | |||
| { | |||
| int friction; // 0 to 1000 | |||
| double x; | |||
| double y; | |||
| } node; | |||
| typedef struct muscle | |||
| { | |||
| node n1; | |||
| node n2; | |||
| double multiplier; | |||
| int strength; // 0 to 1000 | |||
| } muscle; | |||
| typedef struct creature | |||
| { | |||
| muscle muscles[32]; | |||
| int musclec; | |||
| } creature; | |||
| void creature_draw(creature *creat, SDL_Renderer *renderer); | |||
| @@ -0,0 +1,65 @@ | |||
| #include <SDL2/SDL.h> | |||
| #include "creature.h" | |||
| int main() | |||
| { | |||
| // Initialize SDL | |||
| if (SDL_Init(SDL_INIT_VIDEO) != 0) | |||
| { | |||
| fprintf(stderr, "SDL_Init error: %s\n", SDL_GetError()); | |||
| return 1; | |||
| } | |||
| // Create a window | |||
| SDL_Window *win = SDL_CreateWindow( | |||
| "BestGame", | |||
| 100, 100, | |||
| 640, 480, | |||
| SDL_WINDOW_SHOWN); | |||
| if (win == NULL) | |||
| { | |||
| fprintf(stderr, "SDL_CreateWindow error: %s\n", SDL_GetError()); | |||
| SDL_Quit(); | |||
| return 1; | |||
| } | |||
| // Get surface and renderer | |||
| SDL_Surface *surface = SDL_GetWindowSurface(win); | |||
| SDL_Renderer *renderer = SDL_CreateRenderer( | |||
| win, -1, SDL_RENDERER_ACCELERATED); | |||
| // Create a creature | |||
| creature creat = { | |||
| .muscles = { | |||
| { | |||
| .n1 = { 10, 200, 200 }, | |||
| .n2 = { 10, 190, 300 }, | |||
| .multiplier = 1, | |||
| .strength = 1 | |||
| } | |||
| }, | |||
| .musclec = 1 | |||
| }; | |||
| int fps = 30; | |||
| int delay = 1000 / fps; | |||
| for (int i = 0; i < 100; ++i) | |||
| { | |||
| // Clear screen | |||
| SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0xff); | |||
| SDL_RenderClear(renderer); | |||
| // Draw creature | |||
| creat.muscles[0].n1.x += 1; | |||
| creature_draw(&creat, renderer); | |||
| // Presnent and delay | |||
| SDL_RenderPresent(renderer); | |||
| SDL_Delay(delay); | |||
| } | |||
| SDL_DestroyWindow(win); | |||
| SDL_Quit(); | |||
| return 0; | |||
| } | |||