Mirai's Miscellaneous Misadventures

M41 / core / cameras.c

1// copyright 2023 zamfofex
2// license: AGPLv3 or later
3
4#include <mimimi/cameras.h>
5#include <mimimi/behaviors.h>
6#include <mimimi/allocators.h>
7#include <mimimi/geometry.h>
8
9struct mimimi_camera_data
10{
11	struct mimimi_allocator *allocator;
12	struct mimimi_behavior *behavior;
13	struct mimimi_position *camera;
14	struct mimimi_position *position;
15	int x, y;
16};
17
18static void mimimi_camera_behave(void *data)
19{
20	struct mimimi_camera_data *camera_data = data;
21	
22	camera_data->camera->x *= 3;
23	camera_data->camera->y *= 3;
24	camera_data->camera->x += camera_data->position->x + camera_data->x;
25	camera_data->camera->y += camera_data->position->y + camera_data->y;
26	camera_data->camera->x /= 4;
27	camera_data->camera->y /= 4;
28}
29
30static void mimimi_camera_finish(void *data)
31{
32	struct mimimi_camera_data *camera_data = data;
33	mimimi_deallocate(camera_data->allocator, camera_data->behavior);
34	mimimi_deallocate(camera_data->allocator, camera_data);
35}
36
37struct mimimi_behavior *mimimi_camera(struct mimimi_position *camera, struct mimimi_position *position, int x, int y, struct mimimi_allocator *allocator)
38{
39	struct mimimi_camera_data *data = mimimi_allocate(allocator, sizeof *data);
40	data->allocator = allocator;
41	data->camera = camera;
42	data->position = position;
43	
44	data->x = x;
45	data->y = y;
46	
47	camera->x = position->x + x;
48	camera->y = position->y + y;
49	
50	data->behavior = mimimi_allocate(allocator, sizeof *data->behavior);
51	data->behavior->behave = &mimimi_camera_behave;
52	data->behavior->finish = &mimimi_camera_finish;
53	data->behavior->data = data;
54	
55	return data->behavior;
56}