#include "ground_lib.h" #include #include #include 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()