From 15ee2819b1605b0fac6ef915e7f72035e7071d70 Mon Sep 17 00:00:00 2001 From: herbglitch Date: Tue, 25 Mar 2025 19:19:47 -0600 Subject: [PATCH] added FPoint and FRect to config, needs testing --- include/arc/math/config.h | 21 ++++ packages/graphics/sdl3/config.c | 7 ++ src/math/config.c | 190 +++++++++++++++++++++++++++++++- 3 files changed, 212 insertions(+), 6 deletions(-) diff --git a/include/arc/math/config.h b/include/arc/math/config.h index b19742e..9e33b41 100644 --- a/include/arc/math/config.h +++ b/include/arc/math/config.h @@ -26,6 +26,16 @@ void ARC_ConfigType_PointCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC */ void ARC_ConfigType_PointDestroyFn(ARC_Config *config, void *type); +/** + * @brief +*/ +void ARC_ConfigType_FPointCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata); + +/** + * @brief +*/ +void ARC_ConfigType_FPointDestroyFn(ARC_Config *config, void *type); + /** * @brief */ @@ -36,6 +46,17 @@ void ARC_ConfigType_RectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_ */ void ARC_ConfigType_RectDestroyFn(ARC_Config *config, void *type); +/** + * @brief +*/ +void ARC_ConfigType_FRectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata); + +/** + * @brief +*/ +void ARC_ConfigType_FRectDestroyFn(ARC_Config *config, void *type); + + #ifdef __cplusplus } #endif diff --git a/packages/graphics/sdl3/config.c b/packages/graphics/sdl3/config.c index ee906bc..a251427 100644 --- a/packages/graphics/sdl3/config.c +++ b/packages/graphics/sdl3/config.c @@ -85,6 +85,8 @@ void ARC_ConfigType_SpriteCopyFn(void **type, ARC_ParserTagToken *parsedData, AR } ARC_ParserTagToken *valueTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(valueArgsTagToken->tagTokens, 0); + /* ~ spritesheet ~ */ + //check if spritesheet exist ARC_String *valueString; ARC_String_Create(&valueString, NULL, 0); @@ -108,9 +110,12 @@ void ARC_ConfigType_SpriteCopyFn(void **type, ARC_ParserTagToken *parsedData, AR ARC_String_Destroy(spritesheetName); } + //cleanup ARC_String_Destroy(valueString); valueString = NULL; + /* ~ bounds aka frames ~ */ + //check if bounds exist ARC_String_Create(&valueString, NULL, 0); ARC_ParserData_HelperRecurseStringAdd(&valueString, valueTagToken); @@ -121,6 +126,8 @@ void ARC_ConfigType_SpriteCopyFn(void **type, ARC_ParserTagToken *parsedData, AR } ARC_String_Destroy(valueString); + + *type = sprite; } void ARC_ConfigType_SpriteDestroyFn(ARC_Config *config, void *type){ diff --git a/src/math/config.c b/src/math/config.c index 4a22071..b259062 100644 --- a/src/math/config.c +++ b/src/math/config.c @@ -1,16 +1,16 @@ #include "arc/math/config.h" #include #include -#include "arc/std/array.h" -#include "arc/std/string.h" #include "arc/std/errno.h" #include "arc/std/config.h" #include "arc/math/point.h" #include "arc/math/rectangle.h" void ARC_Config_InitMath(ARC_Config *config){ - ARC_Config_RegisterTypeWithCStr(config, "ARC_Point", (ARC_ConfigType){ ARC_ConfigType_PointCopyFn, ARC_ConfigType_PointDestroyFn, NULL }); - ARC_Config_RegisterTypeWithCStr(config, "ARC_Rect" , (ARC_ConfigType){ ARC_ConfigType_RectCopyFn , ARC_ConfigType_RectDestroyFn , NULL }); + ARC_Config_RegisterTypeWithCStr(config, "ARC_Point" , (ARC_ConfigType){ ARC_ConfigType_PointCopyFn , ARC_ConfigType_PointDestroyFn , NULL }); + ARC_Config_RegisterTypeWithCStr(config, "ARC_FPoint", (ARC_ConfigType){ ARC_ConfigType_FPointCopyFn, ARC_ConfigType_FPointDestroyFn, NULL }); + ARC_Config_RegisterTypeWithCStr(config, "ARC_Rect" , (ARC_ConfigType){ ARC_ConfigType_RectCopyFn , ARC_ConfigType_RectDestroyFn , NULL }); + ARC_Config_RegisterTypeWithCStr(config, "ARC_FRect" , (ARC_ConfigType){ ARC_ConfigType_FRectCopyFn , ARC_ConfigType_FRectDestroyFn , NULL }); } void ARC_ConfigType_PointCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){ @@ -79,11 +79,77 @@ void ARC_ConfigType_PointDestroyFn(ARC_Config *config, void *type){ free((ARC_Point *)type); } +void ARC_ConfigType_FPointCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){ + ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(parsedData->tagTokens, 0); + if(childTagToken->id != ARC_CONFIG_NESTED_VALUE){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FPointCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), nestedValue was not passed in for ARC_FPoint"); + type = NULL; + return; + } + + //get the valueArgs + ARC_ParserTagToken *valueArgsTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(childTagToken->tagTokens, 2); + + //if there is only a value with no comma break + if(ARC_Vector_GetSize(valueArgsTagToken->tagTokens) == 1){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FPointCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), nested value { x } only had one value, fpoint needs two { x, y }"); + return; + } + + //get the first value + ARC_ParserTagToken *valueTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(valueArgsTagToken->tagTokens, 0); + float *pointTemp = NULL; + ARC_ConfigType_FloatCopyFn((void **)&pointTemp, valueTagToken, config, userdata); + if(pointTemp == NULL){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FPointCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), first parameter was not a float"); + return; + } + + //copy the xpoint value to stack and free the pointer + float pointX = *pointTemp; + free(pointTemp); + pointTemp = NULL; + + //get the second value + valueArgsTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(valueArgsTagToken->tagTokens, 4); + + //if there is an empty comma break + if(ARC_Vector_GetSize(valueArgsTagToken->tagTokens) > 1){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FPointCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), nested value { x, y, ... } had too many values, fpoint needs two { x, y }"); + return; + } + + //get the second value + valueTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(valueArgsTagToken->tagTokens, 0); + ARC_ConfigType_FloatCopyFn((void **)&pointTemp, valueTagToken, config, userdata); + if(pointTemp == NULL){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FPointCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), second parameter was not a float"); + return; + } + + //copy the last value and free the temp value + ARC_FPoint *point = (ARC_FPoint *)malloc(sizeof(ARC_FPoint)); + *point = (ARC_FPoint){ pointX, *pointTemp }; + free(pointTemp); + + //set the type value + *type = (void *)point; +} + +void ARC_ConfigType_FPointDestroyFn(ARC_Config *config, void *type){ + free((ARC_FPoint *)type); +} + void ARC_ConfigType_RectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){ ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(parsedData->tagTokens, 0); if(childTagToken->id != ARC_CONFIG_NESTED_VALUE){ arc_errno = ARC_ERRNO_DATA; - ARC_DEBUG_LOG_ERROR("ARC_ConfigType_RectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), nestedValue was not passed in for ARC_Point"); + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_RectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), nestedValue was not passed in for ARC_Rect"); type = NULL; return; } @@ -104,7 +170,7 @@ void ARC_ConfigType_RectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_ ARC_ConfigType_Int32CopyFn((void **)&pointTemp, valueTagToken, config, userdata); if(pointTemp == NULL){ arc_errno = ARC_ERRNO_DATA; - ARC_DEBUG_LOG_ERROR("ARC_ConfigType_PointCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), first parameter was not a int32"); + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_RectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), first parameter was not a int32"); return; } @@ -190,3 +256,115 @@ void ARC_ConfigType_RectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_ void ARC_ConfigType_RectDestroyFn(ARC_Config *config, void *type){ free((ARC_Rect *)type); } + +void ARC_ConfigType_FRectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){ + ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(parsedData->tagTokens, 0); + if(childTagToken->id != ARC_CONFIG_NESTED_VALUE){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FRectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), nestedValue was not passed in for ARC_FRect"); + type = NULL; + return; + } + + //get the valueArgs + ARC_ParserTagToken *valueArgsTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(childTagToken->tagTokens, 2); + + //if there is only a value with no comma break + if(ARC_Vector_GetSize(valueArgsTagToken->tagTokens) == 1){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FRectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), nested value { x } only had one value, frect needs four { x, y, w, h }"); + return; + } + + //get the first value + ARC_ParserTagToken *valueTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(valueArgsTagToken->tagTokens, 0); + float *pointTemp = NULL; + ARC_ConfigType_FloatCopyFn((void **)&pointTemp, valueTagToken, config, userdata); + if(pointTemp == NULL){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FRectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), first parameter was not a float"); + return; + } + + //copy the xpoint value to stack and free the pointer + float pointX = *pointTemp; + free(pointTemp); + pointTemp = NULL; + + //get the second value + valueArgsTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(valueArgsTagToken->tagTokens, 4); + + //if there is only a value with no comma break + if(ARC_Vector_GetSize(valueArgsTagToken->tagTokens) == 1){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FRectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), nested value { x, y } only had two values, frect needs four { x, y, w, h }"); + return; + } + + //get the second value + valueTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(valueArgsTagToken->tagTokens, 0); + ARC_ConfigType_FloatCopyFn((void **)&pointTemp, valueTagToken, config, userdata); + if(pointTemp == NULL){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FRectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), second parameter was not a float"); + return; + } + + float pointY = *pointTemp; + free(pointTemp); + pointTemp = NULL; + + //get the third value + valueArgsTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(valueArgsTagToken->tagTokens, 4); + + //if there is an empty comma break + if(ARC_Vector_GetSize(valueArgsTagToken->tagTokens) == 1){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FRectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), nested value { x, y, w } only had three values, frect needs four { x, y, w, h }"); + return; + } + + //get the third value + valueTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(valueArgsTagToken->tagTokens, 0); + ARC_ConfigType_FloatCopyFn((void **)&pointTemp, valueTagToken, config, userdata); + if(pointTemp == NULL){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FRectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), third parameter was not a float"); + return; + } + + float pointW = *pointTemp; + free(pointTemp); + pointTemp = NULL; + + //get the fourth value + valueArgsTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(valueArgsTagToken->tagTokens, 4); + + //if there is an empty comma break + if(ARC_Vector_GetSize(valueArgsTagToken->tagTokens) > 1){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FRectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), nested value { x, y, w, h, ... } had too many values, frect needs four { x, y, w, h }"); + return; + } + + //get the fourth value + valueTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(valueArgsTagToken->tagTokens, 0); + ARC_ConfigType_FloatCopyFn((void **)&pointTemp, valueTagToken, config, userdata); + if(pointTemp == NULL){ + arc_errno = ARC_ERRNO_DATA; + ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FRectCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), fourth parameter was not a float"); + return; + } + + //copy the last value and free the temp value + ARC_FRect *point = (ARC_FRect *)malloc(sizeof(ARC_FPoint)); + *point = (ARC_FRect){ pointX, pointY, pointW, *pointTemp }; + free(pointTemp); + + //set the type value + *type = (void *)point; +} + +void ARC_ConfigType_FRectDestroyFn(ARC_Config *config, void *type){ + free((ARC_FRect *)type); +}