/************************************************************************************************************************ *System module. */ module ecs.system; import ecs.entity; import ecs.manager; /************************************************************************************************************************ *System contain data required to proper glue EntityManager with Systems. *System callbacks: *
-void onUpdate(EntitesData); *
-void onEnable() *
-void onDisable(); *
-bool onBegin(); *
-void onEnd(); *
-void onCreate() *
-void onDestroy(); *
-void onAddEntity(EntitesData); *
-void onRemoveEntity(EntitiesData); */ struct System { /************************************************************************************************************************ *Check if system is enabled. */ export bool enabled() nothrow @nogc { return m_enabled; } /************************************************************************************************************************ *Enable system. If actually it is enabled function do nothing. */ export void enable() nothrow @nogc { if (!m_enabled && m_enable) (cast(void function(void*) nothrow @nogc) m_enable)(m_system_pointer); m_enabled = true; } /************************************************************************************************************************ *Disable system. If actually it is disabled function do nothing. */ export void disable() nothrow @nogc { if (m_enabled && m_disable) (cast(void function(void*) nothrow @nogc) m_disable)(m_system_pointer); m_enabled = false; } /************************************************************************************************************************ *Get system priority. */ export int priority() nothrow @nogc { return m_priority; } /************************************************************************************************************************ *Get system priority. */ export bool execute() nothrow @nogc { return m_execute; } /************************************************************************************************************************ *Get system priority. */ export ushort id() nothrow @nogc { return m_id; } /************************************************************************************************************************ *Get system name. */ export const(char)[] name() nothrow @nogc { return cast(const(char)[]) m_name; } struct EventCaller { ushort id; void* callback; } package: ///should system be executed in current update? bool m_execute = true; ///system id ushort m_id; ///should system update and catch events? bool m_enabled = false; ///system priority int m_priority; ///pointer to system implementation void* m_system_pointer; ///system pass index int m_pass; ///system name char[] m_name; ///required components ushort[] m_components; ///excluded components ushort[] m_excluded_components; ///optional components ushort[] m_optional_components; EntityManager.Job[] jobs; //System*[] m_dependencies; ushort[] m_read_only_components; ushort[] m_modified_components; EntityManager.SystemCaller* m_any_system_caller; EventCaller[] m_event_callers; //void function(ref EntityManager.CallData data) m_update; void* m_update; ///workaroud for DMD bug with upper line void delegate() m_update_delegate; //void function(void* system_pointer) m_enable; //void function(void* system_pointer) m_disable; //void function(void* system_pointer) m_create; //void function(void* system_pointer) m_destroy; //void function(void* system_pointer) m_begin; //void function(void* system_pointer) m_end; void* m_enable; void* m_disable; void* m_create; void* m_destroy; void* m_begin; void* m_end; void* m_add_entity; void* m_remove_entity; void* m_change_entity; //void function(ref EntityManager.CallData data) m_initialize; //void function(ref EntityManager.CallData data) m_deinitilize; void* m_initialize; void* m_deinitilize; }