Files
orbit-plus/src/game/ecs/c_scale.c
2023-02-11 23:18:45 -05:00

104 lines
1.6 KiB
C

/*
* DESCRIPTION:
* Scale component.
*/
#include "c_scale.h"
static void add(struct CScale* self);
static void update_f(struct CScale* self);
static void
add(struct CScale* self)
{
self->isFinished = true;
}
/* Updates an scale component. */
static void
update_f(struct CScale* self)
{
struct CSprite* sprite;
struct CText* text;
f32 progress;
f32* scale;
sprite = ecs_get(self->id, ECS_C_SPRITE);
text = ecs_get(self->id, ECS_C_TEXT);
if (self->isFinished)
return;
if (sprite)
scale = &sprite->scale;
else if (text)
scale = &text->scale;
else
return;
progress = (f32)self->timer / self->timerMax;
switch (self->type)
{
case C_SCALE_TO:
case C_SCALE_TO_STICK:
*scale = self->baseValue + (self->value * (1.0f - progress));
break;
case C_SCALE_FROM:
case C_SCALE_FROM_STICK:
*scale = self->baseValue + (self->value * progress);
break;
default:
break;
}
self->timer--;
if (self->timer <= 0)
{
switch (self->type)
{
case C_SCALE_TO:
case C_SCALE_FROM:
*scale = self->baseValue;
break;
case C_SCALE_TO_STICK:
case C_SCALE_FROM_STICK:
default:
break;
}
self->isFinished = true;
}
}
/* Sets scale component. */
void
c_scale_set(struct CScale* self, f32 baseValue, f32 value, s32 timerMax, enum CScaleType type)
{
self->value = value;
self->baseValue = baseValue;
self->timerMax = timerMax;
self->type = type;
self->timer = self->timerMax;
self->isFinished = false;
}
/* Registers scale component. */
void
c_scale_register(void)
{
ecs_register
(
ECS_C_SCALE,
sizeof(struct CScale),
C_SCALE_LIMIT,
(ECSFunction)add,
NULL,
(ECSFunction)update_f,
NULL,
NULL
);
}