#include "arc/graphics/spritesheet.h" #include "spritesheet.h" #include "renderer.h" #include "arc/math/point.h" #include "arc/std/errno.h" #include #include #include void ARC_Spritesheet_CreateFromFile(ARC_Spritesheet **spritesheet, ARC_Renderer *renderer, ARC_String *path){ //TODO: allow other types of images //get and check the SDL surface SDL_Surface *surface = IMG_Load(path->data); if(!surface){ arc_errno = ARC_ERRNO_DATA; ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_Spritesheet_CreateFromFile(spritesheet, renderer, path), could not read path \"%s\"", path->data); //set the spritesheet to null and throw an error *spritesheet = NULL; return; } //create the place to store the spritesheet *spritesheet = (ARC_Spritesheet *)malloc(sizeof(ARC_Spritesheet)); //set the texture SDL_BlendMode tempMode; SDL_GetSurfaceBlendMode(surface, &tempMode); (*spritesheet)->texture = SDL_CreateTextureFromSurface(renderer->renderer, surface); SDL_SetTextureBlendMode((*spritesheet)->texture, tempMode); SDL_SetTextureScaleMode((*spritesheet)->texture, SDL_SCALEMODE_NEAREST); //set the tile size to empty (*spritesheet)->size = 0; //cleanup SDL_DestroySurface(surface); } void ARC_Spritesheet_Destroy(ARC_Spritesheet *spritesheet){ SDL_DestroyTexture(spritesheet->texture); free(spritesheet); } void ARC_Spritesheet_Render(ARC_Spritesheet *spritesheet, ARC_Renderer *renderer, ARC_FRect renderBounds){ SDL_RenderTexture(renderer->renderer, spritesheet->texture, NULL, (SDL_FRect *)&renderBounds); } void ARC_Spritesheet_RenderArea(ARC_Spritesheet *spritesheet, ARC_Rect sheetBounds, ARC_Renderer *renderer, ARC_FRect renderBounds){ ARC_FRect bounds = ARC_Rect_CastToFRect(sheetBounds); SDL_RenderTexture(renderer->renderer, spritesheet->texture, (SDL_FRect *)&bounds, (SDL_FRect *)&renderBounds); } void ARC_Spritesheet_RenderTile(ARC_Spritesheet *spritesheet, ARC_Point tilePosition, ARC_Renderer *renderer, ARC_FRect renderBounds){ //error when size is 0 if(spritesheet->size == 0){ arc_errno = ARC_ERRNO_NULL; ARC_DEBUG_LOG_ERROR("ARC_Spritesheet_RenderTile(spritesheet, tilePosition, renderer, renderBounds), could not render a tile of size 0"); return; } //get bounds based on the sheet size ARC_FRect sheetBounds = { spritesheet->size * tilePosition.x, spritesheet->size * tilePosition.y, spritesheet->size, spritesheet->size }; //render the bounds SDL_RenderTexture(renderer->renderer, spritesheet->texture, (SDL_FRect *)&sheetBounds, (SDL_FRect *)&renderBounds); } ARC_Point ARC_Spritesheet_GetSize(ARC_Spritesheet *spritesheet){ float x = 0.0; float y = 0.0; SDL_GetTextureSize(spritesheet->texture, &x, &y); return (ARC_Point){ x, y }; } uint32_t ARC_Spritesheet_GetTileSize(ARC_Spritesheet *spritesheet){ return spritesheet->size; }