diff --git a/include/arc/graphics/sdl/sprite.h b/include/arc/graphics/sdl/sprite.h index eb0adb9..6e7cb59 100644 --- a/include/arc/graphics/sdl/sprite.h +++ b/include/arc/graphics/sdl/sprite.h @@ -9,6 +9,8 @@ struct ARC_Sprite { ARC_Spritesheet *spritesheet; ARC_Array *frames; uint32_t *frameIndex; + //TODO: temp + uint8_t opacity; }; #endif // !ARC_SDL diff --git a/include/arc/graphics/sprite.h b/include/arc/graphics/sprite.h index e339886..ddccceb 100644 --- a/include/arc/graphics/sprite.h +++ b/include/arc/graphics/sprite.h @@ -42,6 +42,18 @@ void ARC_Sprite_Destroy(ARC_Sprite *sprite); */ void ARC_Sprite_Copy(ARC_Sprite **newSprite, ARC_Sprite *oldSprite); +//TODO: temp +/** + * @brief sets ARC_Sprite's opacity + * + * @param sprite ARC_Sprite that is changing opacity + * @param opacity new opacity for ARC_Sprite + * + * @note this is temp because opacity probably should be a value + * bigger than 255 +*/ +void ARC_Sprite_SetOpacity(ARC_Sprite *sprite, uint8_t opacity); + /** * @brief renders ARC_Sprite type * diff --git a/src/engine/engine.c b/src/engine/engine.c index 5f3ddf3..cfb7b90 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -104,7 +104,6 @@ void ARC_Engine_Run(ARC_EngineData *data){ } #ifdef ARC_SDL - SDL_SetRenderDrawBlendMode((SDL_Renderer *)data->renderer, SDL_BLENDMODE_BLEND); SDL_Event *event = data->mouse->event; double lastTime = 0, currentTime; diff --git a/src/graphics/sdl/config.c b/src/graphics/sdl/config.c index 22c8f0f..b92c5e7 100644 --- a/src/graphics/sdl/config.c +++ b/src/graphics/sdl/config.c @@ -53,7 +53,10 @@ int32_t ARC_SDL_Texture_Load(const char *path, SDL_Texture **texture){ return 1; // GE_SDL_ERRNO_ } + SDL_BlendMode tempMode; + SDL_GetSurfaceBlendMode(surface, &tempMode); *texture = SDL_CreateTextureFromSurface(global_renderer, surface); + SDL_GetTextureBlendMode(*texture, &tempMode); SDL_FreeSurface(surface); IMG_Quit(); @@ -213,12 +216,7 @@ uint8_t ARC_Sprite_Read(ARC_Config* config, ARC_String *string, void **value){ } } //sprite - *value = malloc(sizeof(ARC_Sprite)); - ((ARC_Sprite *) *value)->frameIndex = malloc(sizeof(uint32_t)); - - ((ARC_Sprite *) *value)->spritesheet = spritesheet; - ((ARC_Sprite *) *value)->frames = frames; - *((ARC_Sprite *) *value)->frameIndex = 0; + ARC_Sprite_Create((ARC_Sprite **)value, spritesheet, frames); return 0; } diff --git a/src/graphics/sdl/renderer.c b/src/graphics/sdl/renderer.c index cfb8de6..9c065c6 100644 --- a/src/graphics/sdl/renderer.c +++ b/src/graphics/sdl/renderer.c @@ -21,6 +21,8 @@ void ARC_Renderer_Create(ARC_Renderer **renderer, ARC_RenderInfo *info){ ARC_DEBUG_LOG(arc_errno, "SDL_CreateRenderer(%p, %d, %u);", info->window, info->index, info->flags); free(renderer); } + + SDL_SetRenderDrawBlendMode((SDL_Renderer *)*renderer, SDL_BLENDMODE_BLEND); } void ARC_Renderer_Destroy(ARC_Renderer *renderer){ diff --git a/src/graphics/sdl/sprite.c b/src/graphics/sdl/sprite.c index 8fa6d4f..d6efabd 100644 --- a/src/graphics/sdl/sprite.c +++ b/src/graphics/sdl/sprite.c @@ -14,6 +14,7 @@ void ARC_Sprite_Create(ARC_Sprite **sprite, ARC_Spritesheet *spritesheet, ARC_Ar (*sprite)->frames = frames; (*sprite)->frameIndex = (uint32_t *)malloc(sizeof(uint32_t)); *(*sprite)->frameIndex = 0; + (*sprite)->opacity = 255; } void ARC_Sprite_Destroy(ARC_Sprite *sprite){ @@ -28,7 +29,13 @@ void ARC_Sprite_Copy(ARC_Sprite **newSprite, ARC_Sprite *oldSprite){ *(*newSprite)->frameIndex = *oldSprite->frameIndex; } +void ARC_Sprite_SetOpacity(ARC_Sprite *sprite, uint8_t opacity){ + sprite->opacity = opacity; +} + void ARC_Sprite_Render(ARC_Sprite *sprite, ARC_Renderer *renderer, ARC_Rect *renderBounds){ + //TODO: note, this is set here so not all entities in the sheet get opacity set + SDL_SetTextureAlphaMod((SDL_Texture *)sprite->spritesheet->texture, sprite->opacity); SDL_RenderCopy((SDL_Renderer *)renderer, sprite->spritesheet->texture, (SDL_Rect *)sprite->frames->data + *sprite->frameIndex, (SDL_Rect *)renderBounds); } @@ -42,10 +49,14 @@ void ARC_Sprite_RenderFlip(ARC_Sprite *sprite, ARC_Renderer *renderer, ARC_Rect flip |= SDL_FLIP_VERTICAL; } + //TODO: note, this is set here so not all entities in the sheet get opacity set + SDL_SetTextureAlphaMod((SDL_Texture *)sprite->spritesheet->texture, sprite->opacity); SDL_RenderCopyEx((SDL_Renderer *)renderer, sprite->spritesheet->texture, (SDL_Rect *)sprite->frames->data + *sprite->frameIndex, (SDL_Rect *)renderBounds, 0.0, NULL, flip); } void ARC_Sprite_RenderRotated(ARC_Sprite *sprite, ARC_Renderer *renderer, ARC_Rect *renderBounds, ARC_Point *center, double angle){ + //TODO: note, this is set here so not all entities in the sheet get opacity set + SDL_SetTextureAlphaMod((SDL_Texture *)sprite->spritesheet->texture, sprite->opacity); SDL_RenderCopyEx((SDL_Renderer *)renderer, sprite->spritesheet->texture, (SDL_Rect *)sprite->frames->data + *sprite->frameIndex, (SDL_Rect *)renderBounds, angle, (SDL_Point *)center, SDL_FLIP_NONE); }