1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-04-21 19:41:53 +02:00
openlara/src/sprite.h
2020-07-04 12:05:44 +03:00

60 lines
1.6 KiB
C

#ifndef H_SPRITE
#define H_SPRITE
#include "controller.h"
struct Sprite : Controller {
enum {
FRAME_ANIMATED = -1,
FRAME_RANDOM = -2,
};
bool instant;
int frame, flag;
float time;
vec3 velocity;
Sprite(IGame *game, int entity, bool instant = true, int frame = FRAME_ANIMATED) : Controller(game, entity), instant(instant), flag(frame), time(0), velocity(0) {
if (frame >= 0) { // specific frame
this->frame = frame;
} else if (frame == FRAME_RANDOM) { // random frame
this->frame = rand() % getSequence().sCount;
} else if (frame == FRAME_ANIMATED) { // animated
this->frame = 0;
}
}
TR::SpriteSequence& getSequence() {
return level->spriteSequences[-(getEntity().modelIndex + 1)];
}
virtual void update() {
if (flag >= 0) return;
bool remove = false;
time += Core::deltaTime;
if (flag == FRAME_ANIMATED) {
frame = int(time * SPRITE_FPS);
TR::SpriteSequence &seq = getSequence();
if (instant && frame >= seq.sCount)
remove = true;
else
frame %= max(seq.sCount, int16(1));
} else
if (instant && time >= (1.0f / SPRITE_FPS))
remove = true;
pos += velocity * (30.0f * Core::deltaTime);
if (remove)
game->removeEntity(this);
}
virtual void render(Frustum *frustum, MeshBuilder *mesh, ShaderType type, bool caustics) {
renderSprite(frame);
}
};
#endif