Common update:

-added multiple new function to allocate template and add entity
-updated README.md (complete initial version)
-empty components now don't take memory
-fixedd small bug with TestRunner
-added many new tests (HashMap, Vector, EntityMeta, ...)
-added default hashing function to HashMap
-fixed critical bug with adding entities
-fixed small bug with adding entity with remplacement components
-added asserts into code to better bug detection
-small performance improvement for events
-added ComponentRef structure which contain data pointer and componentID
-remove EntityID from Event structure
-now events are handled before removing entiteis
-fixed GDC compilation
-fixed rendering of rotated sprites
-added weapons as separate entities to space ship and others
-added Tower enemy to SpaceInvaders demo
-added Boss to SpaceInvaders demo (boss has four tower attached to it)
-Boss towers shoot multiple bullets upon death
-fixed critical bug with demos switching
-fixed critical bug related to adding/removing entities form inside onAdd/onRemove entity callback
-added animation support
-added particles sypport and particles for firing and explostions, and more
-multithreaded rendering now has same rendering order as singlethreaded
-application automaticallu detect host CPU threads count
-added upgrades to SPaceInvaders demo
-fixed texture memory freeing
-improved documentation
-improved multithreaded performance
-improve shader code
-fixed registration issue
-some additional performance improvements
-added depth and colors to rendering parameters
-jobs now has names corresponding to their systems
-change execute() -> willExecute()
-added EntityMeta structure to speedup getting fetching components form entity
-improved multithreading rendering
-added possibility tio change number of threads runtime
-added bullets collision detection in SpaceInvaders demo
-some CI changes
-added VBO batch rendering (current default, no render mode switch yet)
-fixed camera positioning calculation
-fixed buffer issue with WebGL
-added viewport scalling (at least 300 pixels height). Pixels are scalled if screen is bigger.
-center demos gameplay area
-added fullpage html template for Emscripten build
-added many new sprites to atlas
-fixed critical bug with CPU usage in multithreaded mode
-snake render tile coresponding to body part
-snake is destroyed after collision and emit some particles
-added some functionality to vectors
-fixed documentation issue in Manager.d
-more minor code changes and cleanup
This commit is contained in:
Dawid Masiukiewicz 2020-05-28 16:48:42 +00:00
parent 2ddb97e9ce
commit 024356df9b
62 changed files with 5918 additions and 1673 deletions

169
source/bubel/ecs/system.d Normal file
View file

@ -0,0 +1,169 @@
/************************************************************************************************************************
System module.
Copyright: Copyright © 2018-2019, Dawid Masiukiewicz, Michał Masiukiewicz
License: BSD 3-clause, see LICENSE file in project root folder.
*/
module bubel.ecs.system;
import bubel.ecs.entity;
import bubel.ecs.manager;
/************************************************************************************************************************
System contain data required to proper glue EntityManager with Systems.
System callbacks:
$(LIST
* void onUpdate(EntitesData);
* void onEnable() - called inside system.enable() function
* void onDisable() - called inside system.disable() function
* bool onBegin() - called inside manager.begin()
* void onEnd() - called inside manager.end()
* void onCreate() - called after registration inside registerSystem function
* void onDestroy() - called during re-registration and inside manager destructor
* void onAddEntity(EntitesData) - called for every entity which are assigned to system (by adding new entity or changing its components)
* void onRemoveEntity(EntitiesData) - called for every entity removed from system update process
* void onChangeEntity(EntitiesData) - called for every entity which components are changed but it was previously assigned to system
* void handleEvent(Entity*, Event) - called for every event supported by system
)
*/
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 if system will be executed during current frame. Should be checked after manager.begin(). Its value is setted as result of manager.onBegin() callback.
*/
export bool willExecute() nothrow @nogc
{
return m_execute;
}
/************************************************************************************************************************
Get system id.
*/
export ushort id() nothrow @nogc
{
return m_id;
}
/************************************************************************************************************************
Get system name.
*/
export const(char)[] name() nothrow @nogc
{
return cast(const(char)[]) m_name;
}
package:
struct EventCaller
{
ushort id;
void* callback;
}
///should system be executed in current update?
bool m_execute = true;
///system id
ushort m_id;
///is system empty? Empty systems don't update entities, and is called once per update
bool m_empty = false;
///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_writable_components;
ushort[] m_readonly_dependencies;
ushort[] m_writable_dependencies;
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;
}