Files
libraries/grogs/grogs.cpp
2025-09-21 16:03:19 +10:00

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()