140 lines
3.9 KiB
C
140 lines
3.9 KiB
C
/**
|
|
* @file world.h
|
|
* @brief World-level API.
|
|
*/
|
|
|
|
#ifndef FLECS_WORLD_H
|
|
#define FLECS_WORLD_H
|
|
|
|
/* Get current stage */
|
|
ecs_stage_t* flecs_stage_from_world(
|
|
ecs_world_t **world_ptr);
|
|
|
|
/* Get current thread-specific stage from readonly world */
|
|
const ecs_stage_t* flecs_stage_from_readonly_world(
|
|
const ecs_world_t *world);
|
|
|
|
/* Get component callbacks */
|
|
const ecs_type_info_t *flecs_type_info_get(
|
|
const ecs_world_t *world,
|
|
ecs_entity_t component);
|
|
|
|
/* Get or create component callbacks */
|
|
ecs_type_info_t* flecs_type_info_ensure(
|
|
ecs_world_t *world,
|
|
ecs_entity_t component);
|
|
|
|
bool flecs_type_info_init_id(
|
|
ecs_world_t *world,
|
|
ecs_entity_t component,
|
|
ecs_size_t size,
|
|
ecs_size_t alignment,
|
|
const ecs_type_hooks_t *li);
|
|
|
|
#define flecs_type_info_init(world, T, ...)\
|
|
flecs_type_info_init_id(world, ecs_id(T), ECS_SIZEOF(T), ECS_ALIGNOF(T),\
|
|
&(ecs_type_hooks_t)__VA_ARGS__)
|
|
|
|
void flecs_type_info_fini(
|
|
ecs_type_info_t *ti);
|
|
|
|
void flecs_type_info_free(
|
|
ecs_world_t *world,
|
|
ecs_entity_t component);
|
|
|
|
void flecs_eval_component_monitors(
|
|
ecs_world_t *world);
|
|
|
|
void flecs_monitor_mark_dirty(
|
|
ecs_world_t *world,
|
|
ecs_entity_t id);
|
|
|
|
void flecs_monitor_register(
|
|
ecs_world_t *world,
|
|
ecs_entity_t id,
|
|
ecs_query_t *query);
|
|
|
|
void flecs_monitor_unregister(
|
|
ecs_world_t *world,
|
|
ecs_entity_t id,
|
|
ecs_query_t *query);
|
|
|
|
void flecs_notify_tables(
|
|
ecs_world_t *world,
|
|
ecs_id_t id,
|
|
ecs_table_event_t *event);
|
|
|
|
void flecs_register_table(
|
|
ecs_world_t *world,
|
|
ecs_table_t *table);
|
|
|
|
void flecs_unregister_table(
|
|
ecs_world_t *world,
|
|
ecs_table_t *table);
|
|
|
|
void flecs_table_set_empty(
|
|
ecs_world_t *world,
|
|
ecs_table_t *table);
|
|
|
|
void flecs_delete_table(
|
|
ecs_world_t *world,
|
|
ecs_table_t *table);
|
|
|
|
void flecs_process_pending_tables(
|
|
const ecs_world_t *world);
|
|
|
|
/* Suspend/resume readonly state. To fully support implicit registration of
|
|
* components, it should be possible to register components while the world is
|
|
* in readonly mode. It is not uncommon that a component is used first from
|
|
* within a system, which are often ran while in readonly mode.
|
|
*
|
|
* Suspending readonly mode is only allowed when the world is not multithreaded.
|
|
* When a world is multithreaded, it is not safe to (even temporarily) leave
|
|
* readonly mode, so a multithreaded application should always explicitly
|
|
* register components in advance.
|
|
*
|
|
* These operations also suspend deferred mode.
|
|
*/
|
|
typedef struct ecs_suspend_readonly_state_t {
|
|
bool is_readonly;
|
|
bool is_deferred;
|
|
int32_t defer_count;
|
|
ecs_entity_t scope;
|
|
ecs_entity_t with;
|
|
ecs_vec_t commands;
|
|
ecs_stack_t defer_stack;
|
|
ecs_stage_t *stage;
|
|
} ecs_suspend_readonly_state_t;
|
|
|
|
ecs_world_t* flecs_suspend_readonly(
|
|
const ecs_world_t *world,
|
|
ecs_suspend_readonly_state_t *state);
|
|
|
|
void flecs_resume_readonly(
|
|
ecs_world_t *world,
|
|
ecs_suspend_readonly_state_t *state);
|
|
|
|
/* Convenience macro's for world allocator */
|
|
#define flecs_walloc(world, size)\
|
|
flecs_alloc(&world->allocator, size)
|
|
#define flecs_walloc_n(world, T, count)\
|
|
flecs_alloc_n(&world->allocator, T, count)
|
|
#define flecs_wcalloc(world, size)\
|
|
flecs_calloc(&world->allocator, size)
|
|
#define flecs_wcalloc_n(world, T, count)\
|
|
flecs_calloc_n(&world->allocator, T, count)
|
|
#define flecs_wfree(world, size, ptr)\
|
|
flecs_free(&world->allocator, size, ptr)
|
|
#define flecs_wfree_n(world, T, count, ptr)\
|
|
flecs_free_n(&world->allocator, T, count, ptr)
|
|
#define flecs_wrealloc(world, size_dst, size_src, ptr)\
|
|
flecs_realloc(&world->allocator, size_dst, size_src, ptr)
|
|
#define flecs_wrealloc_n(world, T, count_dst, count_src, ptr)\
|
|
flecs_realloc_n(&world->allocator, T, count_dst, count_src, ptr)
|
|
#define flecs_wdup(world, size, ptr)\
|
|
flecs_dup(&world->allocator, size, ptr)
|
|
#define flecs_wdup_n(world, T, count, ptr)\
|
|
flecs_dup_n(&world->allocator, T, count, ptr)
|
|
|
|
#endif
|