summaryrefslogtreecommitdiff
path: root/libphysics/test/aabbcheck.c
blob: 788035bd71669b23c7b9bf321c676fd47c5e609f (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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <stdio.h>
#include <stdbool.h>
#include <SDL3/SDL.h>

#include <vecmath.h>
#include <physics.h>
#include "../dat.h"

static void process_events();

static SDL_Window *window;
static SDL_Renderer *renderer;
static bool running;
static Uint64 old_ticks, new_ticks;

static void renderbody(Body *);

static Body mousebody = {
	.size = { 25, 25 },
};

static Body body = {
	.pos      = { 400, 300 }, 
	.size     = { 200, 200 }
};

int
main()
{
	if(!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)) {
		fprintf(stderr, "SDL_Init(): %s\n", SDL_GetError());
		return 1;
	}

	if(!SDL_CreateWindowAndRenderer("window", 800, 600, SDL_WINDOW_OPENGL, &window, &renderer)) {
		fprintf(stderr, "SDL_CreateWindowAndRenderer: %s\n", SDL_GetError());
		return -1;
	}

	running = true;
	old_ticks = SDL_GetTicksNS();
	while(running) {
		double delta;
		process_events();

		new_ticks = SDL_GetTicksNS();
		delta = (new_ticks - old_ticks) / 1000000000.0;
		old_ticks = new_ticks;

		SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
		SDL_RenderClear(renderer);
		if(phxaabbcheck(&body, &mousebody)) {
			SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0x00);
		} else {
			SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0x00);
		}

		renderbody(&body);
		renderbody(&mousebody);

		if(phxaabbcheck(&body, &mousebody)) {
			float n[2], p[2];
			
			phxaabbresolv(&body, &mousebody, p, n);
			SDL_RenderLine(renderer,
				body.pos[0],
				body.pos[1],
				body.pos[0] + n[0] * body.size[0],
				body.pos[1] + n[1] * body.size[1]
			);
			
			SDL_RenderLine(renderer,
				mousebody.pos[0] - n[0] * mousebody.size[0],
				mousebody.pos[1] - n[1] * mousebody.size[1],
				mousebody.pos[0] - n[0] * mousebody.size[0] + p[0],
				mousebody.pos[1] - n[1] * mousebody.size[1] + p[1]
			);
		}

		SDL_RenderPresent(renderer);
	}
	
	SDL_DestroyWindow(window);
	SDL_Quit();
	return 0;
}

void
process_events()
{
	SDL_Event event;

	while(SDL_PollEvent(&event)) {
		switch(event.type) {
			case SDL_EVENT_QUIT:
				running = false;
				break;
			case SDL_EVENT_MOUSE_MOTION:
				mousebody.pos[0] = event.motion.x;
				mousebody.pos[1] = event.motion.y;
		}
	}
}

void
renderbody(Body *b)
{
	SDL_RenderRect(renderer, &(SDL_FRect){
		.x = b->pos[0] - b->size[0],
		.y = b->pos[1] - b->size[1], 
		.w = b->size[0] * 2.0,
		.h = b->size[1] * 2.0
	});
}