93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "ground_lib.h"
 | |
| #include <SDL3/SDL.h>
 | |
| #include <SDL3/SDL_main.h>
 | |
| #include <SDL3/SDL_render.h>
 | |
| 
 | |
| SDL_Window* window;
 | |
| SDL_Renderer* renderer;
 | |
| SDL_Event event;
 | |
| 
 | |
| int width;
 | |
| int height;
 | |
| 
 | |
| bool hasRunInit;
 | |
| 
 | |
| GroundValue initSDL(GroundValue* args, int arg_count) {
 | |
|     if (hasRunInit) return GROUND_INT_VAL(2);
 | |
| 
 | |
|     // args are window title, width, height
 | |
|     VALIDATE_ARGS_3(GROUND_STRING, GROUND_INT, GROUND_INT);
 | |
|     SDL_Init(SDL_INIT_VIDEO);
 | |
|     width = GET_INT(args[1]);
 | |
|     height = GET_INT(args[2]);
 | |
|     SDL_CreateWindowAndRenderer(GET_STRING(args[0]), width, height, SDL_WINDOW_OPENGL, &window, &renderer);
 | |
|     if (window == NULL) {
 | |
|         std::cout << "Couldn't create SDL window" << std::endl;
 | |
|         return GROUND_INT_VAL(1);
 | |
|     }
 | |
|     hasRunInit = true;
 | |
|     return GROUND_INT_VAL(0);
 | |
| }
 | |
| 
 | |
| GroundValue pollEvent(GroundValue* args, int arg_count) {
 | |
|     if (!hasRunInit) {
 | |
|         std::cout << "Cannot poll event, please run !grogs:initSDL first" << std::endl;
 | |
|         return GROUND_INT_VAL(-1);
 | |
|     }
 | |
| 
 | |
|     SDL_PollEvent(&event);
 | |
|     if (event.type == SDL_EVENT_QUIT) {
 | |
|         return GROUND_INT_VAL(0);
 | |
|     }
 | |
|     return GROUND_INT_VAL(-1);
 | |
| }
 | |
| 
 | |
| GroundValue clearRenderer(GroundValue* args, int arg_count) {
 | |
|     if (!hasRunInit) {
 | |
|         std::cout << "Cannot clear renderer, please run !grogs:initSDL first" << std::endl;
 | |
|         return GROUND_INT_VAL(-1);
 | |
|     }
 | |
|     SDL_RenderClear(renderer);
 | |
|     return GROUND_INT_VAL(0);
 | |
| }
 | |
| 
 | |
| GroundValue renderFrame(GroundValue* args, int arg_count) {
 | |
|     if (!hasRunInit) {
 | |
|         std::cout << "Cannot render frame, please run !grogs:initSDL first" << std::endl;
 | |
|         return GROUND_INT_VAL(-1);
 | |
|     }
 | |
|     SDL_RenderPresent(renderer);
 | |
|     return GROUND_INT_VAL(0);
 | |
| }
 | |
| 
 | |
| GroundValue setPixel(GroundValue* args, int arg_count) {
 | |
|     if (!hasRunInit) {
 | |
|         std::cout << "Cannot set pixel, please run !grogs:initSDL first" << std::endl;
 | |
|         return GROUND_INT_VAL(-1);
 | |
|     }
 | |
|     VALIDATE_ARGS_5(GROUND_INT, GROUND_INT, GROUND_INT, GROUND_INT, GROUND_INT);
 | |
|     // xpos, ypos, red, green, blue
 | |
|     int pixelX = GET_INT(args[0]);
 | |
|     int pixelY = GET_INT(args[1]);
 | |
|     int red = GET_INT(args[2]);
 | |
|     int green = GET_INT(args[3]);
 | |
|     int blue = GET_INT(args[4]);
 | |
|     SDL_SetRenderDrawColor(renderer, red, green, blue, 255);
 | |
|     SDL_RenderPoint(renderer, pixelX, pixelY);
 | |
| 
 | |
|     return GROUND_INT_VAL(0);
 | |
| }
 | |
| 
 | |
| GROUND_LIBRARY_INTERFACE()
 | |
| 
 | |
| GROUND_LIBRARY_INIT()
 | |
|     REGISTER_GROUND_FUNCTION(initSDL);
 | |
|     REGISTER_GROUND_FUNCTION(renderFrame);
 | |
|     REGISTER_GROUND_FUNCTION(pollEvent);
 | |
|     REGISTER_GROUND_FUNCTION(clearRenderer);
 | |
|     REGISTER_GROUND_FUNCTION(setPixel);
 | |
| GROUND_LIBRARY_INIT_END()
 | |
| 
 | |
| GROUND_LIBRARY_CLEANUP()
 | |
| GROUND_LIBRARY_CLEANUP_END()
 |