Merge branch 'herbglitch/graphics_config' into 'master'
Herbglitch/graphics config See merge request Archeus_00/arc!2
This commit is contained in:
commit
31b8730a61
12 changed files with 367 additions and 22 deletions
|
|
@ -13,6 +13,8 @@ typedef struct ARC_EngineData {
|
||||||
ARC_Window *window;
|
ARC_Window *window;
|
||||||
ARC_Renderer *renderer;
|
ARC_Renderer *renderer;
|
||||||
ARC_Handler *state;
|
ARC_Handler *state;
|
||||||
|
|
||||||
|
double dt;
|
||||||
} ARC_EngineData;
|
} ARC_EngineData;
|
||||||
|
|
||||||
//NOTE: most work below is temp, and will change once I figure out a better way to write this header
|
//NOTE: most work below is temp, and will change once I figure out a better way to write this header
|
||||||
|
|
|
||||||
17
include/arc/graphics/config.h
Normal file
17
include/arc/graphics/config.h
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef ARC_GRAPHICS_CONFIG_H_
|
||||||
|
#define ARC_GRAPHICS_CONFIG_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "arc/std/config.h"
|
||||||
|
#include "arc/graphics/renderer.h"
|
||||||
|
|
||||||
|
void ARC_GraphicsConfig_Init(ARC_Config *config, ARC_Renderer *renderer);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // !ARC_GRAPHICS_CONFIG_H_
|
||||||
|
|
@ -3,10 +3,6 @@
|
||||||
|
|
||||||
#ifdef ARC_SDL
|
#ifdef ARC_SDL
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include "arc/graphics/renderer.h"
|
#include "arc/graphics/renderer.h"
|
||||||
#include "arc/graphics/window.h"
|
#include "arc/graphics/window.h"
|
||||||
|
|
@ -28,10 +24,6 @@ struct ARC_RenderInfo {
|
||||||
Uint32 flags;
|
Uint32 flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // ARC_SDL
|
#endif // ARC_SDL
|
||||||
|
|
||||||
#endif // ARC_SDL_RENDERER_H_
|
#endif // ARC_SDL_RENDERER_H_
|
||||||
|
|
|
||||||
16
include/arc/graphics/sdl/sprite.h
Normal file
16
include/arc/graphics/sdl/sprite.h
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
#ifndef ARC_SDL_SPRITE_H_
|
||||||
|
#define ARC_SDL_SPRITE_H_
|
||||||
|
|
||||||
|
#ifdef ARC_SDL
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
#include "arc/graphics/spritesheet.h"
|
||||||
|
|
||||||
|
struct ARC_Sprite {
|
||||||
|
ARC_Spritesheet *spritesheet;
|
||||||
|
SDL_Rect *bounds;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // ARC_SDL
|
||||||
|
|
||||||
|
#endif // ARC_SDL_SPRITE_H_
|
||||||
16
include/arc/graphics/sdl/spritesheet.h
Normal file
16
include/arc/graphics/sdl/spritesheet.h
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
#ifndef ARC_SDL_SPRITESHEET_H_
|
||||||
|
#define ARC_SDL_SPRITESHEET_H_
|
||||||
|
|
||||||
|
#ifdef ARC_SDL
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
#include "arc/graphics/spritesheet.h"
|
||||||
|
|
||||||
|
struct ARC_Spritesheet {
|
||||||
|
SDL_Texture *texture;
|
||||||
|
uint32_t *size;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // ARC_SDL
|
||||||
|
|
||||||
|
#endif // ARC_SDL_SPRITESHEET_H_
|
||||||
|
|
@ -3,10 +3,6 @@
|
||||||
|
|
||||||
#ifdef ARC_SDL
|
#ifdef ARC_SDL
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include "arc/graphics/window.h"
|
#include "arc/graphics/window.h"
|
||||||
|
|
||||||
|
|
@ -29,10 +25,6 @@ struct ARC_WindowInfo {
|
||||||
Uint32 flags;
|
Uint32 flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // ARC_SDL
|
#endif // ARC_SDL
|
||||||
|
|
||||||
#endif // ARC_SDL_WINDOW_H_
|
#endif // ARC_SDL_WINDOW_H_
|
||||||
|
|
|
||||||
14
include/arc/graphics/sprite.h
Normal file
14
include/arc/graphics/sprite.h
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef ARC_GRAPHICS_SPRITE_H_
|
||||||
|
#define ARC_GRAPHICS_SPRITE_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct ARC_Sprite ARC_Sprite;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // !ARC_GRAPHICS_SPRITE_H_
|
||||||
14
include/arc/graphics/spritesheet.h
Normal file
14
include/arc/graphics/spritesheet.h
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef ARC_GRAPHICS_SPRITESHEET_H_
|
||||||
|
#define ARC_GRAPHICS_SPRITESHEET_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct ARC_Spritesheet ARC_Spritesheet;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // !ARC_GRAPHICS_SPRITESHEET_H_
|
||||||
|
|
@ -1,6 +1,10 @@
|
||||||
#ifndef ARC_GRAPHICS_WINDOW_H_
|
#ifndef ARC_GRAPHICS_WINDOW_H_
|
||||||
#define ARC_GRAPHICS_WINDOW_H_
|
#define ARC_GRAPHICS_WINDOW_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct ARC_Window ARC_Window;
|
typedef struct ARC_Window ARC_Window;
|
||||||
|
|
||||||
typedef struct ARC_WindowInfo ARC_WindowInfo;
|
typedef struct ARC_WindowInfo ARC_WindowInfo;
|
||||||
|
|
@ -21,4 +25,8 @@ void ARC_Window_Create(ARC_Window **window, ARC_WindowInfo *info);
|
||||||
*/
|
*/
|
||||||
void ARC_Window_Destroy(ARC_Window *window);
|
void ARC_Window_Destroy(ARC_Window *window);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // !ARC_GRAPHICS_WINDOW_H_
|
#endif // !ARC_GRAPHICS_WINDOW_H_
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ void ARC_EngineData_Create(ARC_EngineData **data){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
windowInfo = (ARC_WindowInfo){ "title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1280, 720, 0 };
|
windowInfo = (ARC_WindowInfo){ "title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 720, 480, 0 };
|
||||||
#endif // ARC_SDL
|
#endif // ARC_SDL
|
||||||
|
|
||||||
ARC_Window_Create(&((*data)->window), &windowInfo);
|
ARC_Window_Create(&((*data)->window), &windowInfo);
|
||||||
|
|
@ -59,11 +59,11 @@ void ARC_Engine_Run(ARC_EngineData *data){
|
||||||
#endif // ARC_SDL
|
#endif // ARC_SDL
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
// currentTime = SDL_GetTicks();
|
|
||||||
// data->dt = currentTime - lastTime;
|
|
||||||
// lastTime = currentTime;
|
|
||||||
|
|
||||||
#ifdef ARC_SDL
|
#ifdef ARC_SDL
|
||||||
|
currentTime = SDL_GetTicks();
|
||||||
|
data->dt = currentTime - lastTime;
|
||||||
|
lastTime = currentTime;
|
||||||
|
|
||||||
while(SDL_PollEvent(&event)){
|
while(SDL_PollEvent(&event)){
|
||||||
if(event.type == SDL_QUIT){ return; }
|
if(event.type == SDL_QUIT){ return; }
|
||||||
if(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE){ return; }
|
if(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE){ return; }
|
||||||
|
|
|
||||||
274
src/graphics/sdl/config.c
Normal file
274
src/graphics/sdl/config.c
Normal file
|
|
@ -0,0 +1,274 @@
|
||||||
|
#ifdef ARC_SDL
|
||||||
|
#include "arc/graphics/config.h"
|
||||||
|
|
||||||
|
#include <SDL_image.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "arc/std/string.h"
|
||||||
|
#include "arc/std/errno.h"
|
||||||
|
#include "arc/graphics/sdl/renderer.h"
|
||||||
|
#include "arc/graphics/sprite.h"
|
||||||
|
#include "arc/graphics/sdl/sprite.h"
|
||||||
|
#include "arc/graphics/spritesheet.h"
|
||||||
|
#include "arc/graphics/sdl/spritesheet.h"
|
||||||
|
|
||||||
|
// #define ARC_DEFAULT_CONFIG
|
||||||
|
#include "arc/std/defaults/config.h"
|
||||||
|
|
||||||
|
SDL_Renderer *global_renderer;
|
||||||
|
|
||||||
|
int32_t ARC_SDL_Rect_Read (ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value);
|
||||||
|
int32_t ARC_SDL_Texture_Read(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value);
|
||||||
|
int32_t ARC_Spritesheet_Read(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value);
|
||||||
|
int32_t ARC_Sprite_Read (ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value);
|
||||||
|
|
||||||
|
int32_t ARC_SDL_Rect_Delete (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value);
|
||||||
|
int32_t ARC_SDL_Texture_Delete(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value);
|
||||||
|
int32_t ARC_Spritesheet_Delete(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value);
|
||||||
|
int32_t ARC_Sprite_Delete (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value);
|
||||||
|
|
||||||
|
void ARC_GraphicsConfig_Init(ARC_Config *config, ARC_Renderer *renderer){
|
||||||
|
global_renderer = renderer->renderer;
|
||||||
|
ARC_ConfigKey_Add(config, (char *)"SDL_Rect" , (ARC_ConfigKeyRead) ARC_SDL_Rect_Read , (ARC_ConfigKeyDelete) ARC_SDL_Rect_Delete );
|
||||||
|
ARC_ConfigKey_Add(config, (char *)"SDL_Texture" , (ARC_ConfigKeyRead) ARC_SDL_Texture_Read, (ARC_ConfigKeyDelete) ARC_SDL_Texture_Delete);
|
||||||
|
ARC_ConfigKey_Add(config, (char *)"ARC_Spritesheet", (ARC_ConfigKeyRead) ARC_Spritesheet_Read, (ARC_ConfigKeyDelete) ARC_Spritesheet_Delete);
|
||||||
|
ARC_ConfigKey_Add(config, (char *)"ARC_Sprite" , (ARC_ConfigKeyRead) ARC_Sprite_Read , (ARC_ConfigKeyDelete) ARC_Sprite_Delete );
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ARC_SDL_Texture_Load(const char *path, SDL_Texture **texture){
|
||||||
|
IMG_Init(IMG_INIT_PNG);
|
||||||
|
SDL_Surface *surface = IMG_Load(path);
|
||||||
|
if(!surface){
|
||||||
|
printf("Error: reading png '%s'\nSDL_Image Error: %s", path, IMG_GetError());
|
||||||
|
return 1; // GE_SDL_ERRNO_
|
||||||
|
}
|
||||||
|
|
||||||
|
*texture = SDL_CreateTextureFromSurface(global_renderer, surface);
|
||||||
|
|
||||||
|
SDL_FreeSurface(surface);
|
||||||
|
IMG_Quit();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ARC_SDL_Rect_Read(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, subdata);
|
||||||
|
if(data[subdata->index] != '{' || data[subdata->index + subdata->length - 1] != '}'){ return ARC_ERRNO_DATA; }
|
||||||
|
subdata->index++;
|
||||||
|
subdata->length -= 2;
|
||||||
|
|
||||||
|
uint64_t split;
|
||||||
|
*value = malloc(sizeof(SDL_Rect));
|
||||||
|
|
||||||
|
//x
|
||||||
|
int32_t err = ARC_String_Find(((char *)data) + subdata->index, (char *)",", &split);
|
||||||
|
if(err){ return err; }
|
||||||
|
if(split == ~((uint64_t)0) || split > subdata->length){ return ARC_ERRNO_DATA; }
|
||||||
|
ARC_StringSubstr temp = { subdata->index, split };
|
||||||
|
((SDL_Rect *) *value)->x = (int)ARC_String_ToUint64_t(data, &temp);
|
||||||
|
|
||||||
|
//y
|
||||||
|
temp.index = subdata->index + split + 1;
|
||||||
|
err = ARC_String_Find(((char *)data) + temp.index, (char *)",", &split);
|
||||||
|
if(err){ return err; }
|
||||||
|
if(split == ~((uint64_t)0) || split > subdata->length){ return ARC_ERRNO_DATA; }
|
||||||
|
temp.length = split;
|
||||||
|
((SDL_Rect *) *value)->y = (int)ARC_String_ToUint64_t(data, &temp);
|
||||||
|
|
||||||
|
//w
|
||||||
|
temp.index = temp.index + split + 1;
|
||||||
|
err = ARC_String_Find(((char *)data) + temp.index, (char *)",", &split);
|
||||||
|
if(err){ return err; }
|
||||||
|
if(split == ~((uint64_t)0) || split > subdata->length){ return ARC_ERRNO_DATA; }
|
||||||
|
temp.length = split;
|
||||||
|
((SDL_Rect *) *value)->w = (int)ARC_String_ToUint64_t(data, &temp);
|
||||||
|
|
||||||
|
//hhttps://w2g.tv/8r0knvefgpciytccsw
|
||||||
|
temp = (ARC_StringSubstr){ temp.index + split + 1, subdata->length - split - 1 };
|
||||||
|
((SDL_Rect *) *value)->h = (int)ARC_String_ToUint64_t(data, &temp);
|
||||||
|
|
||||||
|
SDL_Rect *ntemp = ((SDL_Rect *) *value);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ARC_SDL_Texture_Read(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, subdata);
|
||||||
|
ARC_StringSubstr_StripEnds((char *)data, (char *)"\"", subdata);
|
||||||
|
|
||||||
|
char path[subdata->length + 1];
|
||||||
|
strncpy(path, data + subdata->index, subdata->length);
|
||||||
|
path[subdata->length] = 0;
|
||||||
|
|
||||||
|
return ARC_SDL_Texture_Load(path, (SDL_Texture **)value);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ARC_Spritesheet_Read(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, subdata);
|
||||||
|
if(data[subdata->index] != '{'){
|
||||||
|
SDL_Texture *texture = (SDL_Texture *)ARC_Config_GetReference(config, (char *)data, subdata);
|
||||||
|
if(!texture && data[subdata->index] != '"'){ return ARC_ERRNO_DATA; }
|
||||||
|
|
||||||
|
if(!texture){
|
||||||
|
int32_t err = ARC_SDL_Texture_Read(config, data, subdata, (void **)&texture);
|
||||||
|
if(err){ return ARC_ERRNO_DATA; }
|
||||||
|
}
|
||||||
|
|
||||||
|
*value = malloc(sizeof(ARC_Spritesheet));
|
||||||
|
((ARC_Spritesheet *) *value)->texture = texture;
|
||||||
|
((ARC_Spritesheet *) *value)->size = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(data[subdata->index + subdata->length - 1] != '}'){ return ARC_ERRNO_DATA; }
|
||||||
|
subdata->index++;
|
||||||
|
subdata->length -= 2; //remove the starting { and ending }
|
||||||
|
|
||||||
|
//Texture
|
||||||
|
uint64_t split;
|
||||||
|
int32_t err = ARC_String_Find(((char *)data) + subdata->index, (char *)",", &split);
|
||||||
|
if(err){ return err; }
|
||||||
|
if(split == ~((uint64_t)0) || split > subdata->length){ return ARC_ERRNO_DATA; }
|
||||||
|
|
||||||
|
ARC_StringSubstr temp = { subdata->index, split };
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, &temp);
|
||||||
|
SDL_Texture *texture = (SDL_Texture *)ARC_Config_GetReference(config, (char *)data, &temp);
|
||||||
|
if(!texture && data[temp.index] != '"'){ return ARC_ERRNO_DATA; }
|
||||||
|
|
||||||
|
if(!texture){
|
||||||
|
err = ARC_SDL_Texture_Read(config, data, &temp, (void **)&texture);
|
||||||
|
if(err){ return ARC_ERRNO_DATA; }
|
||||||
|
}
|
||||||
|
|
||||||
|
//uint32_t size
|
||||||
|
temp = (ARC_StringSubstr){ subdata->index + split + 1, subdata->length - split - 1 };
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, &temp);
|
||||||
|
uint32_t *size = (uint32_t *)ARC_Config_GetReference(config, (char *)data, &temp);
|
||||||
|
if(!size){
|
||||||
|
ARC_ConfigKey_Read_Uint64_t(config, data, &temp, (void **)&size);
|
||||||
|
if(err){ return ARC_ERRNO_DATA; }
|
||||||
|
}
|
||||||
|
|
||||||
|
*value = malloc(sizeof(ARC_Spritesheet));
|
||||||
|
((ARC_Spritesheet *) *value)->texture = texture;
|
||||||
|
((ARC_Spritesheet *) *value)->size = size;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ARC_Sprite_Read(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, subdata);
|
||||||
|
if(data[subdata->index] != '{' || data[subdata->index + subdata->length - 1] != '}'){ return ARC_ERRNO_DATA; }
|
||||||
|
subdata->index++;
|
||||||
|
subdata->length -= 2; //remove the starting { and ending }
|
||||||
|
|
||||||
|
uint64_t split;
|
||||||
|
int32_t err = ARC_String_Find(((char *)data) + subdata->index, (char *)",", &split);
|
||||||
|
if(err){ return err; }
|
||||||
|
if(split == ~((uint64_t)0) || split > subdata->length){ return ARC_ERRNO_DATA; }
|
||||||
|
|
||||||
|
//spritesheet
|
||||||
|
ARC_StringSubstr temp = { subdata->index, split };
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, &temp);
|
||||||
|
ARC_Spritesheet *spritesheet = (ARC_Spritesheet *)ARC_Config_GetReference(config, (char *)data, &temp);
|
||||||
|
|
||||||
|
if(!spritesheet){
|
||||||
|
err = ARC_Spritesheet_Read(config, data, &temp, (void **)&spritesheet);
|
||||||
|
if(err){ return ARC_ERRNO_DATA; }
|
||||||
|
}
|
||||||
|
|
||||||
|
//bounds
|
||||||
|
temp = (ARC_StringSubstr){ subdata->index + split + 1, subdata->length - split - 1 };
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, &temp);
|
||||||
|
SDL_Rect *bounds = (SDL_Rect *)ARC_Config_GetReference(config, (char *)data, &temp);
|
||||||
|
|
||||||
|
if(!bounds){
|
||||||
|
ARC_ConfigKey_Read_Uint64_t(config, data, &temp, (void **)&bounds);
|
||||||
|
if(err){ return ARC_ERRNO_DATA; }
|
||||||
|
}
|
||||||
|
|
||||||
|
*value = malloc(sizeof(ARC_Sprite));
|
||||||
|
((ARC_Sprite *) *value)->spritesheet = spritesheet;
|
||||||
|
((ARC_Sprite *) *value)->bounds = bounds;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ARC_SDL_Rect_Delete(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){
|
||||||
|
if((SDL_Rect *)value){ free((SDL_Rect *)value); }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ARC_SDL_Texture_Delete(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){
|
||||||
|
//if((SDL_Texture *) value){ SDL_DestroyTexture((SDL_Texture *) value); }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ARC_Spritesheet_Delete(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){
|
||||||
|
ARC_Spritesheet *spritesheet = (ARC_Spritesheet *) value;
|
||||||
|
if(!data){ //there is no data, kill everything, most likely was called by a data type being destroyed
|
||||||
|
free(spritesheet);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, subdata);
|
||||||
|
if(data[subdata->index] != '{'){
|
||||||
|
SDL_Texture *texture = (SDL_Texture *)ARC_Config_GetReference(config, (char *)data, subdata);
|
||||||
|
if(!texture){ ARC_SDL_Texture_Delete(config, data, subdata, (void *)spritesheet->texture); }
|
||||||
|
|
||||||
|
free(spritesheet);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t split;
|
||||||
|
int32_t err = ARC_String_Find(((char *)data) + subdata->index, (char *)",", &split);
|
||||||
|
if(err){ return err; }
|
||||||
|
if(split == ~((uint64_t)0) || split > subdata->length){ return ARC_ERRNO_DATA; }
|
||||||
|
|
||||||
|
ARC_StringSubstr temp = { subdata->index, split };
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, &temp);
|
||||||
|
SDL_Texture *texture = (SDL_Texture *)ARC_Config_GetReference(config, (char *)data, &temp);
|
||||||
|
if(!texture){ ARC_SDL_Texture_Delete(config, data, &temp, (void *)spritesheet->texture); }
|
||||||
|
|
||||||
|
temp = (ARC_StringSubstr){ subdata->index + split + 1, subdata->length - split - 1 };
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, &temp);
|
||||||
|
uint32_t *size = (uint32_t *)ARC_Config_GetReference(config, (char *)data, &temp);
|
||||||
|
if(!size){ ARC_ConfigKey_Delete_Uint64_t(config, data, &temp, (void *)spritesheet->size); }
|
||||||
|
|
||||||
|
free(spritesheet);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ARC_Sprite_Delete(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){
|
||||||
|
ARC_Sprite *sprite = (ARC_Sprite *) value;
|
||||||
|
if(!data){
|
||||||
|
free(sprite);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, subdata);
|
||||||
|
if(data[subdata->index] != '{' || data[subdata->index + subdata->length - 1] != '}'){ return ARC_ERRNO_DATA; }
|
||||||
|
subdata->index++;
|
||||||
|
subdata->length -= 2; //remove the starting { and ending }
|
||||||
|
|
||||||
|
uint64_t split;
|
||||||
|
int32_t err = ARC_String_Find(((char *)data) + subdata->index, (char *)",", &split);
|
||||||
|
if(err){ return err; }
|
||||||
|
if(split == ~((uint64_t)0) || split > subdata->length){ return ARC_ERRNO_DATA; }
|
||||||
|
|
||||||
|
//spritesheet
|
||||||
|
ARC_StringSubstr temp = { subdata->index, split };
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, &temp);
|
||||||
|
ARC_Spritesheet *spritesheet = (ARC_Spritesheet *)ARC_Config_GetReference(config, (char *)data, &temp);
|
||||||
|
if(!spritesheet){ ARC_Spritesheet_Delete(config, data, &temp, (void *)sprite->spritesheet); }
|
||||||
|
|
||||||
|
//bounds
|
||||||
|
temp = (ARC_StringSubstr){ subdata->index + split + 1, subdata->length - split - 1 };
|
||||||
|
ARC_StringSubstr_StripWhitespaceEnds((char *)data, &temp);
|
||||||
|
SDL_Rect *bounds = (SDL_Rect *)ARC_Config_GetReference(config, (char *)data, &temp);
|
||||||
|
|
||||||
|
if(!bounds){ ARC_SDL_Rect_Delete(config, data, &temp, (void *)sprite->bounds); }
|
||||||
|
|
||||||
|
free(sprite);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //ARC_SDL
|
||||||
|
|
@ -32,7 +32,7 @@ void ARC_Handler_Add(ARC_Handler *handler, void *data){
|
||||||
int8_t ARC_Handler_RemoveCompareFn(void *a, void *b){ return a == b; }
|
int8_t ARC_Handler_RemoveCompareFn(void *a, void *b){ return a == b; }
|
||||||
|
|
||||||
void ARC_Handler_Remove(ARC_Handler *handler, void *data){
|
void ARC_Handler_Remove(ARC_Handler *handler, void *data){
|
||||||
ARC_Vector_Add(handler->trash, data);
|
// ARC_Vector_Add(handler->trash, data);
|
||||||
ARC_Vector_Remove(handler->data, data, ARC_Handler_RemoveCompareFn);
|
ARC_Vector_Remove(handler->data, data, ARC_Handler_RemoveCompareFn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue