/* * 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 ); }