diff --git a/Makefile b/Makefile index c2fa0b1d39295e8a14abd93702c231b9c3c755aa..bfd00058d09714792598ef4806a6668d12a2ceea 100644 --- a/Makefile +++ b/Makefile @@ -1,45 +1,24 @@ -CC := gcc -CFLAGS := -std=c11 -Wall -Wextra -fsanitize=address -fsanitize=leak -pedantic -Ofast -g -LDFLAGS := ${CFLAGS} -lm -lSDL2 +#The compiler +CC:=gcc +#The flags passed to the compiler +CFLAGS:=-g -O3 -Wall -Wextra -fsanitize=address -fsanitize=leak -std=gnu11 +#The flags passed to the linker +LDFLAGS:=-lm +VPATH:=utils utils/vec2 utils/gfx src -SRCDIR := src -OUTDIR := build +main: main.o vec2.o utils.o field.o gfx.o + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -lSDL2 -TARGET := ${OUTDIR}/main +tests: vec_tests.o vec2.o + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -SRC := $(wildcard ${SRCDIR}/*.c) -HDR := $(wildcard ${SRCDIR}/*.h) -OBJ := $(patsubst %.c,${OUTDIR}/%.o,${SRC}) +field.o: field.h +vec2.o: vec2.h -all: ${TARGET} ${DOC} +utils.o: utils.h - -${TARGET}: ${OBJ} utils ${OUTDIR} - ${CC} ${LDFLAGS} -o $@ ${OBJ} - - -${OBJ}: ${OUTDIR}/%.o: %.c ${HDR} ${OUTDIR} - ${CC} ${CFLAGS} -c -o $@ $< - - -${OUTDIR}: - mkdir -p ${OUTDIR} - - - -.PHONY: all clean doc exec utils - -doc: - make -C doc - -utils: - make -C utils +gfx.o: gfx.h clean: - rm -rf ${OUTDIR} - make -C doc clean - make -C utils clean - -exec: ${TARGET} - ./${TARGET} + rm -f *.o main tests diff --git a/src/draw.c b/src/draw.c new file mode 100644 index 0000000000000000000000000000000000000000..0f1d9c2620cc81d433d65e6b67acf1bc4931e724 --- /dev/null +++ b/src/draw.c @@ -0,0 +1,49 @@ +#include <utils/gfx/gfx.h> +#include <field.h> +/* +(50, 50) → (75, 50)1 , (50, 50) → (72, 62), (50, 50) → (62, 72) +(50, 50) → (50, 75), (50, 50) → (38, 72), (50, 50) → (28, 62) +(50, 50) → (25, 50), (50, 50) → (28, 38), (50, 50) → (37, 28) +(50, 50) → (50, 25), (50, 50) → (62, 28), (50, 50) → (72, 37) +*/ + +void gfx_draw_line(struct gfx_context_t *ctxt, coordinates p0, coordinates p1, uint32_t color) { + // x =col, y = row + // x0 p0.column + // x1 p1.column + // y0 p0.row + // y1 p1.row + int dx = abs(p1.column - p0.column); + int sx = p0.column < p1.column ? 1 : -1; + int dy = -abs(p1.row - p0.row); + int sy = p0.row < p1.row ? 1 : -1; + int error = dx + dy; + + while (true) { + //plot(p0.column, p0.row); + gfx_putpixel(ctxt, p0.column, p0.row, color); + + if (p0.column == p1.column && p0.row == p1.row) + break; + + int e2 = 2 * error; + + if (e2 >= dy) { + if (p0.column == p1.column) + break; + error = error + dy; + p0.column = p0.column + sx; + } + + if (e2 <= dx) { + if (p0.row == p1.row) + break; + error = error + dx; + p0.row = p0.row + sy; + } + } + +} + +void gfx_draw_circle(struct gfx_context_t *ctxt, coordinates c, uint32_t r, uint32_t color) { +} diff --git a/src/draw.h b/src/draw.h new file mode 100644 index 0000000000000000000000000000000000000000..dd02f595537680009a5803edd91adaef965f02a4 --- /dev/null +++ b/src/draw.h @@ -0,0 +1,9 @@ +#ifndef DRAW_H +#define DRAW_H + +#include <field.h> + +void gfx_draw_line(struct gfx_context_t *ctxt, coordinates p0, coordinates p1, uint32_t color); +void gfx_draw_circle(struct gfx_context_t *ctxt, coordinates c, uint32_t r, uint32_t color); + +#endif \ No newline at end of file diff --git a/src/field.c b/src/field.c index 8bff07808808b201785e108cd9001895c5c6342a..18a18c2b7d7adccc68129336ea17e4879798085c 100644 --- a/src/field.c +++ b/src/field.c @@ -1,4 +1,4 @@ -#include "physics.h" +#include "field.h" #include <math.h> #include <stdlib.h> diff --git a/src/main.c b/src/main.c index d77a0e89a55256c4f47c97817c00f6d7c5eb4b9b..2fbb85c3549e39fe3ba21077181311cc1b7cd565 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,13 @@ #include <stdlib.h> +//#include <utils/gfx/gfx.h> int main() { + /* + (50, 50) → (75, 50)1 , (50, 50) → (72, 62), (50, 50) → (62, 72) + (50, 50) → (50, 75), (50, 50) → (38, 72), (50, 50) → (28, 62) + (50, 50) → (25, 50), (50, 50) → (28, 38), (50, 50) → (37, 28) + (50, 50) → (50, 25), (50, 50) → (62, 28), (50, 50) → (72, 37) + */ + //struct gfx_content_t* gfx = gfx_create("main", 100, 100); return EXIT_SUCCESS; } diff --git a/utils/gfx/gfx.c b/utils/gfx/gfx.c index a77eb851a2467c462171140c7fd3a6531b5bea80..27aeb3085eb6c9165ed6fcbb5f6df69bbe6c40ae 100644 --- a/utils/gfx/gfx.c +++ b/utils/gfx/gfx.c @@ -5,6 +5,7 @@ /// Uses the SDL2 library. #include "gfx.h" + #include <assert.h> /// Create a fullscreen graphic window. @@ -12,8 +13,7 @@ /// @param width Width of the window in pixels. /// @param height Height of the window in pixels. /// @return a pointer to the graphic context or NULL if it failed. -struct gfx_context_t *gfx_create(char *title, uint32_t width, uint32_t height) -{ +struct gfx_context_t *gfx_create(char *title, uint32_t width, uint32_t height) { if (SDL_Init(SDL_INIT_VIDEO) != 0) goto error; SDL_Window *window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED, @@ -47,8 +47,7 @@ error: /// @param column X coordinate of the pixel. /// @param row Y coordinate of the pixel. /// @param color Color of the pixel. -void gfx_putpixel(struct gfx_context_t *ctxt, uint32_t column, uint32_t row, uint32_t color) -{ +void gfx_putpixel(struct gfx_context_t *ctxt, uint32_t column, uint32_t row, uint32_t color) { if (column < ctxt->width && row < ctxt->height) ctxt->pixels[ctxt->width * row + column] = color; } @@ -56,8 +55,7 @@ void gfx_putpixel(struct gfx_context_t *ctxt, uint32_t column, uint32_t row, uin /// Clear the specified graphic context. /// @param ctxt Graphic context to clear. /// @param color Color to use. -void gfx_clear(struct gfx_context_t *ctxt, uint32_t color) -{ +void gfx_clear(struct gfx_context_t *ctxt, uint32_t color) { int n = ctxt->width * ctxt->height; while (n) ctxt->pixels[--n] = color; @@ -65,8 +63,7 @@ void gfx_clear(struct gfx_context_t *ctxt, uint32_t color) /// Display the graphic context. /// @param ctxt Graphic context to clear. -void gfx_present(struct gfx_context_t *ctxt) -{ +void gfx_present(struct gfx_context_t *ctxt) { SDL_UpdateTexture( ctxt->texture, NULL, ctxt->pixels, ctxt->width * sizeof(uint32_t)); SDL_RenderCopy(ctxt->renderer, ctxt->texture, NULL, NULL); @@ -75,8 +72,7 @@ void gfx_present(struct gfx_context_t *ctxt) /// Destroy a graphic window. /// @param ctxt Graphic context of the window to close. -void gfx_destroy(struct gfx_context_t *ctxt) -{ +void gfx_destroy(struct gfx_context_t *ctxt) { SDL_ShowCursor(SDL_ENABLE); SDL_DestroyTexture(ctxt->texture); SDL_DestroyRenderer(ctxt->renderer); @@ -93,22 +89,11 @@ void gfx_destroy(struct gfx_context_t *ctxt) /// If a key was pressed, returns its key code (non blocking call). /// List of key codes: https://wiki.libsdl.org/SDL_Keycode /// @return the key that was pressed or 0 if none was pressed. -SDL_Keycode gfx_keypressed() -{ +SDL_Keycode gfx_keypressed() { SDL_Event event; - if (SDL_PollEvent(&event)) - { + if (SDL_PollEvent(&event)) { if (event.type == SDL_KEYDOWN) return event.key.keysym.sym; } return 0; -} - - -void gfx_draw_line(struct gfx_context_t *ctxt, coordinates_t p0, coordinates_t p1, uint32_t color){ - -} - -void gfx_draw_circle(struct gfx_context_t *ctxt, coordinates_t c, uint32_t r, uint32_t color){ - } \ No newline at end of file diff --git a/utils/gfx/gfx.h b/utils/gfx/gfx.h index 37423ccb47e21af195da23cc977500e6510d602d..6e256562a7a2cee62a0c16358d36364d50ee4a03 100644 --- a/utils/gfx/gfx.h +++ b/utils/gfx/gfx.h @@ -29,11 +29,6 @@ struct gfx_context_t uint32_t height; }; -typedef struct -{ - uint32_t row; - uint32_t column; -} coordinates_t; extern void gfx_putpixel( struct gfx_context_t *ctxt, uint32_t column, uint32_t row, uint32_t color); @@ -42,7 +37,5 @@ extern struct gfx_context_t *gfx_create(char *text, uint32_t width, uint32_t hei extern void gfx_destroy(struct gfx_context_t *ctxt); extern void gfx_present(struct gfx_context_t *ctxt); extern SDL_Keycode gfx_keypressed(); -void gfx_draw_line(struct gfx_context_t *ctxt, coordinates_t p0, coordinates_t p1, uint32_t color); -void gfx_draw_circle(struct gfx_context_t *ctxt, coordinates_t c, uint32_t r, uint32_t color); #endif