127 lines
3.4 KiB
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);
|
||
|
}
|