eco2d/code/vendors/flecs/flecs_player.c

127 lines
3.4 KiB
C

#ifndef FLECS_PLAYER_IMPL
#include "flecs_player.h"
#endif
static
void player_start(
ecs_world_t *world,
void *ctx)
{
ecs_ref_t *ref = ctx;
EcsPlayer *player = (EcsPlayer*)ecs_get_ref_w_entity(world, ref, 0, 0);
ecs_assert(player != NULL, ECS_INTERNAL_ERROR, NULL);
player->snapshot = ecs_snapshot_take(world);
player->time_scale = 1.0;
ecs_set_time_scale(world, 1.0);
ecs_set_pipeline(world, player->play_pipeline);
ecs_os_free(ref);
}
static
void player_stop(
ecs_world_t *world,
void *ctx)
{
ecs_ref_t *ref = ctx;
EcsPlayer *player = (EcsPlayer*)ecs_get_ref_w_entity(world, ref, 0, 0);
ecs_assert(player != NULL, ECS_INTERNAL_ERROR, NULL);
if (player->snapshot) {
ecs_snapshot_restore(world, player->snapshot);
player = (EcsPlayer*)ecs_get_ref_w_entity(world, ref, 0, 0);
ecs_set_time_scale(world, 0);
ecs_reset_clock(world);
player->time_scale = 0;
player->state = EcsPlayerStop;
player->prev_state = EcsPlayerStop;
}
player->snapshot = NULL;
ecs_set_pipeline(world, player->stop_pipeline);
ecs_os_free(ref);
}
static
void EcsSetPlayer(ecs_iter_t *it) {
ecs_world_t *world = it->world;
EcsPlayer *player = ecs_column(it, EcsPlayer, 1);
ecs_entity_t ecs_typeid(EcsPlayer) = ecs_column_entity(it, 1);
int32_t i;
for (i = 0; i < it->count; i ++) {
EcsPlayerState prev_state = player[i].prev_state;
EcsPlayerState state = player[i].state;
if (prev_state != state) {
switch(player[i].state) {
case EcsPlayerPause:
player[i].time_scale = 0;
break;
case EcsPlayerPlay:
if (prev_state == EcsPlayerStop) {
ecs_ref_t *ref = ecs_os_calloc(sizeof(ecs_ref_t));
ecs_get_ref(world, ref, it->entities[i], EcsPlayer);
ecs_run_post_frame(it->world, player_start, ref);
} else {
player[i].time_scale = 1.0;
}
break;
case EcsPlayerStop:
if (prev_state != EcsPlayerStop) {
ecs_ref_t *ref = ecs_os_calloc(sizeof(ecs_ref_t));
ecs_get_ref(world, ref, it->entities[i], EcsPlayer);
ecs_run_post_frame(world, player_stop, ref);
}
player[i].time_scale = 0;
break;
default:
break;
}
}
player[i].prev_state = state;
ecs_set_time_scale(it->world, player[i].time_scale);
}
}
void FlecsPlayerImport(
ecs_world_t *world)
{
ECS_MODULE(world, FlecsPlayer);
ECS_IMPORT(world, FlecsMeta);
ecs_set_name_prefix(world, "Ecs");
ECS_META(world, EcsPlayerState);
ECS_META(world, EcsPlayer);
ECS_META(world, EcsTargetFps);
ECS_PIPELINE(world, StopPipeline,
flecs.pipeline.PreFrame,
flecs.pipeline.OnLoad,
flecs.pipeline.PostLoad,
flecs.pipeline.PreStore,
flecs.pipeline.OnStore,
flecs.pipeline.PostFrame);
ECS_SYSTEM(world, EcsSetPlayer, EcsOnSet, EcsPlayer);
ecs_set(world, EcsWorld, EcsPlayer, {
.state = EcsPlayerPlay,
.prev_state = EcsPlayerStop,
.time_scale = 1,
.play_pipeline = ecs_get_pipeline(world),
.stop_pipeline = StopPipeline
});
ECS_EXPORT_COMPONENT(EcsPlayer);
}