Mirai's Miscellaneous Misadventures

M32 / engines / sdl2.c

1// copyright 2022 zamfofex
2// license: AGPLv3 or later
3
4// todo: this is currently not working, fix it
5
6#include <stdlib.h>
7#include <SDL2/SDL.h>
8
9#include "../mimimi.h"
10
11struct mimimi_sdl2
12{
13	SDL_Renderer *renderer;
14	struct mimimi_image *images;
15	SDL_Texture **textures;
16};
17
18static void mimimi_sdl2_stamp(void *opaque, int x, int y, struct mimimi_image *image)
19{
20	struct mimimi_sdl2 *data = opaque;
21	SDL_Renderer *renderer = data->renderer;
22	
23	SDL_Rect rect;
24	rect.x = x;
25	rect.y = y;
26	rect.w = image->width;
27	rect.h = image->height;
28	
29	int i = image - data->images;
30	
31	SDL_RenderCopy(renderer, data->textures[i], NULL, &rect);
32}
33
34int main(int argc, char **argv)
35{
36	atexit(&SDL_Quit);
37	
38	SDL_Init(SDL_INIT_VIDEO);
39	
40	SDL_Window *window;
41	SDL_Renderer *renderer;
42	
43	SDL_CreateWindowAndRenderer(mimimi_width, mimimi_height, 0, &window, &renderer);
44	SDL_RenderSetLogicalSize(renderer, mimimi_width, mimimi_height);
45	SDL_SetWindowTitle(window, "Mirai's Miscellaneous Misadventures");
46	
47	struct mimimi_image *images = mimimi_assets();
48	struct mimimi_image *image = images;
49	int image_count = 0;
50	
51	while (image->width != 0)
52	{
53		image_count++;
54		image++;
55	}
56	image = images;
57	
58	SDL_Texture **textures = malloc(image_count * sizeof *textures);
59	
60	for (int i = 0 ; image->width != 0 ; i++)
61	{
62		SDL_Surface *surface = SDL_CreateRGBSurface(0, image->width, image->height, 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF);
63		for (int x = 0 ; x < image->width ; x++)
64		for (int y = 0 ; y < image->height ; y++)
65		{
66			static unsigned char xterm[] = {0x00, 0x5F, 0x87, 0xAF, 0xD7, 0xFF};
67			
68			Uint32 o = x * 4 + y * surface->pitch;
69			Uint32 *pixel = (Uint32 *) ((char *) surface->pixels + o);
70			
71			Uint32 r, g, b, a;
72			unsigned char color = image->colors[x + y * image->width];
73			if (color == 0)
74			{
75				r = 0x00;
76				g = 0x00;
77				b = 0x00;
78				a = 0x00;
79			}
80			else
81			{
82				color -= 16;
83				r = xterm[(color / 36) % 6];
84				g = xterm[(color / 6) % 6];
85				b = xterm[color % 6];
86				a = 0xFF;
87			}
88			
89			*pixel = (r << 24) | (g << 16) | (b << 8) | (a << 0);
90		}
91		
92		textures[i] = SDL_CreateTextureFromSurface(renderer, surface);
93		
94		SDL_FreeSurface(surface);
95		image++;
96	}
97	
98	struct mimimi_sdl2 data = {renderer, images, textures};
99	
100	struct mimimi_engine engine = {&data, &mimimi_sdl2_stamp};
101	struct mimimi_game *game = malloc(mimimi_game_size);
102	mimimi_start(game, &engine, mimimi_test);
103	
104	Uint32 past = SDL_GetTicks();
105	
106	for (;;)
107	{
108		Uint32 current = SDL_GetTicks();
109		Uint32 delay = current - past;
110		past = current;
111		if (delay < 33) SDL_Delay(33 - delay);
112		
113		SDL_Event event;
114		while (SDL_PollEvent(&event))
115		{
116			if (event.type == SDL_QUIT) return 0;
117			
118			if (event.type == SDL_KEYDOWN)
119			{
120				switch (event.key.keysym.sym)
121				{
122					default: continue;
123					case SDLK_q: return 0;
124				}
125			}
126		}
127		
128		struct mimimi_keys keys = {0, 0};
129		
130		unsigned char *keyboard = SDL_GetKeyboardState(NULL);
131		if (keyboard[SDL_SCANCODE_LEFT]) keys.left = 1;
132		if (keyboard[SDL_SCANCODE_RIGHT]) keys.right = 1;
133		
134		SDL_Rect rect = {0, 0, mimimi_width, mimimi_height};
135		SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF);
136		SDL_RenderClear(renderer);
137		SDL_SetRenderDrawColor(renderer, 0xEE, 0xEE, 0xEE, 0xFF);
138		SDL_RenderFillRect(renderer, &rect);
139		mimimi_step(game, keys);
140		SDL_RenderPresent(renderer);
141	}
142}