bubel-ecs/source/ecs/system.d
Mergul 6bbc8b5152 -git now should ignore .dub/dub.json
-added onAdd/onRemove to test
-added onAdd/onRemove callbacks for system
-generating onAdd/onRemove listeners
2019-03-23 19:48:24 +00:00

145 lines
4 KiB
D

/************************************************************************************************************************
*System module.
*/
module ecs.system;
import ecs.entity;
import ecs.manager;
/************************************************************************************************************************
*System contain data required to proper glue EntityManager with Systems.
*System callbacks:
*<br/>-void update(EntitesData);
*<br/>-void onEnable()
*<br/>-void onDisable();
*<br/>-bool onBegin();
*<br/>-void onEnd();
*<br/>-void onCreate()
*<br/>-void onDestroy();
*<br/>-void onAdd(EntitesData);
*<br/>-void onRemove(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;
}
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
const (char)[] 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;
EventCaller[] m_event_callers;
//void function(ref EntityManager.CallData data) m_update;
void* m_update; ///workaroud for DMD bug with upper line
/*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_entity_added;
void* m_entity_removed;
//void function(ref EntityManager.CallData data) m_initialize;
//void function(ref EntityManager.CallData data) m_deinitilize;
void* m_initialize;
void* m_deinitilize;
}