2025-09-21 15:50:03 +10:00
|
|
|
#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);
|
2025-09-21 16:03:19 +10:00
|
|
|
return GROUND_INT_VAL(0);
|
2025-09-21 15:50:03 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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()
|